Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drivers/rtc/rtc-s5m.c: add support for S2MPS13 RTC

The S2MPS13 RTC is almost the same as S2MPS14. The differences when
updating alarm are:
1. Set WUDR+AUDR field instead of WUDR+RUDR.
2. Clear the AUDR field later (it is not auto-cleared).

Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
Cc: Alexandre Belloni <alexandre.belloni@free-electrons.com>
Cc: Alessandro Zummo <a.zummo@towertech.it>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Krzysztof Kozlowski and committed by
Linus Torvalds
5281f94a 7c6f84f8

+21 -1
+19 -1
drivers/rtc/rtc-s5m.c
··· 187 187 val &= S5M_ALARM0_STATUS; 188 188 break; 189 189 case S2MPS14X: 190 + case S2MPS13X: 190 191 ret = regmap_read(info->s5m87xx->regmap_pmic, S2MPS14_REG_ST2, 191 192 &val); 192 193 val &= S2MPS_ALARM0_STATUS; ··· 253 252 case S2MPS14X: 254 253 data |= S2MPS_RTC_RUDR_MASK; 255 254 break; 255 + case S2MPS13X: 256 + data |= S2MPS13_RTC_AUDR_MASK; 257 + break; 256 258 default: 257 259 return -EINVAL; 258 260 } ··· 268 264 } 269 265 270 266 ret = s5m8767_wait_for_udr_update(info); 267 + 268 + /* On S2MPS13 the AUDR is not auto-cleared */ 269 + if (info->device_type == S2MPS13X) 270 + regmap_update_bits(info->regmap, info->regs->rtc_udr_update, 271 + S2MPS13_RTC_AUDR_MASK, 0); 271 272 272 273 return ret; 273 274 } ··· 315 306 u8 data[info->regs->regs_count]; 316 307 int ret; 317 308 318 - if (info->device_type == S2MPS14X) { 309 + if (info->device_type == S2MPS14X || info->device_type == S2MPS13X) { 319 310 ret = regmap_update_bits(info->regmap, 320 311 info->regs->rtc_udr_update, 321 312 S2MPS_RTC_RUDR_MASK, S2MPS_RTC_RUDR_MASK); ··· 338 329 339 330 case S5M8767X: 340 331 case S2MPS14X: 332 + case S2MPS13X: 341 333 s5m8767_data_to_tm(data, tm, info->rtc_24hr_mode); 342 334 break; 343 335 ··· 365 355 break; 366 356 case S5M8767X: 367 357 case S2MPS14X: 358 + case S2MPS13X: 368 359 ret = s5m8767_tm_to_data(tm, data); 369 360 break; 370 361 default: ··· 413 402 414 403 case S5M8767X: 415 404 case S2MPS14X: 405 + case S2MPS13X: 416 406 s5m8767_data_to_tm(data, &alrm->time, info->rtc_24hr_mode); 417 407 alrm->enabled = 0; 418 408 for (i = 0; i < info->regs->regs_count; i++) { ··· 462 450 463 451 case S5M8767X: 464 452 case S2MPS14X: 453 + case S2MPS13X: 465 454 for (i = 0; i < info->regs->regs_count; i++) 466 455 data[i] &= ~ALARM_ENABLE_MASK; 467 456 ··· 507 494 508 495 case S5M8767X: 509 496 case S2MPS14X: 497 + case S2MPS13X: 510 498 data[RTC_SEC] |= ALARM_ENABLE_MASK; 511 499 data[RTC_MIN] |= ALARM_ENABLE_MASK; 512 500 data[RTC_HOUR] |= ALARM_ENABLE_MASK; ··· 547 533 548 534 case S5M8767X: 549 535 case S2MPS14X: 536 + case S2MPS13X: 550 537 s5m8767_tm_to_data(&alrm->time, data); 551 538 break; 552 539 ··· 630 615 break; 631 616 632 617 case S2MPS14X: 618 + case S2MPS13X: 633 619 data[0] = (0 << BCD_EN_SHIFT) | (1 << MODEL24_SHIFT); 634 620 ret = regmap_write(info->regmap, info->regs->ctrl, data[0]); 635 621 break; ··· 668 652 669 653 switch (pdata->device_type) { 670 654 case S2MPS14X: 655 + case S2MPS13X: 671 656 regmap_cfg = &s2mps14_rtc_regmap_config; 672 657 info->regs = &s2mps_rtc_regs; 673 658 alarm_irq = S2MPS14_IRQ_RTCA0; ··· 789 772 790 773 static const struct platform_device_id s5m_rtc_id[] = { 791 774 { "s5m-rtc", S5M8767X }, 775 + { "s2mps13-rtc", S2MPS13X }, 792 776 { "s2mps14-rtc", S2MPS14X }, 793 777 { }, 794 778 };
+2
include/linux/mfd/samsung/rtc.h
··· 105 105 #define S5M_RTC_UDR_MASK (1 << S5M_RTC_UDR_SHIFT) 106 106 #define S2MPS_RTC_WUDR_SHIFT 4 107 107 #define S2MPS_RTC_WUDR_MASK (1 << S2MPS_RTC_WUDR_SHIFT) 108 + #define S2MPS13_RTC_AUDR_SHIFT 1 109 + #define S2MPS13_RTC_AUDR_MASK (1 << S2MPS13_RTC_AUDR_SHIFT) 108 110 #define S2MPS_RTC_RUDR_SHIFT 0 109 111 #define S2MPS_RTC_RUDR_MASK (1 << S2MPS_RTC_RUDR_SHIFT) 110 112 #define RTC_TCON_SHIFT 1