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

Configure Feed

Select the types of activity you want to include in your feed.

at v5.6-rc7 844 lines 22 kB view raw
1// SPDX-License-Identifier: GPL-2.0+ 2// 3// RTC driver for Maxim MAX77686 and MAX77802 4// 5// Copyright (C) 2012 Samsung Electronics Co.Ltd 6// 7// based on rtc-max8997.c 8 9#include <linux/i2c.h> 10#include <linux/slab.h> 11#include <linux/rtc.h> 12#include <linux/delay.h> 13#include <linux/mutex.h> 14#include <linux/module.h> 15#include <linux/platform_device.h> 16#include <linux/mfd/max77686-private.h> 17#include <linux/irqdomain.h> 18#include <linux/regmap.h> 19 20#define MAX77686_I2C_ADDR_RTC (0x0C >> 1) 21#define MAX77620_I2C_ADDR_RTC 0x68 22#define MAX77686_INVALID_I2C_ADDR (-1) 23 24/* Define non existing register */ 25#define MAX77686_INVALID_REG (-1) 26 27/* RTC Control Register */ 28#define BCD_EN_SHIFT 0 29#define BCD_EN_MASK BIT(BCD_EN_SHIFT) 30#define MODEL24_SHIFT 1 31#define MODEL24_MASK BIT(MODEL24_SHIFT) 32/* RTC Update Register1 */ 33#define RTC_UDR_SHIFT 0 34#define RTC_UDR_MASK BIT(RTC_UDR_SHIFT) 35#define RTC_RBUDR_SHIFT 4 36#define RTC_RBUDR_MASK BIT(RTC_RBUDR_SHIFT) 37/* RTC Hour register */ 38#define HOUR_PM_SHIFT 6 39#define HOUR_PM_MASK BIT(HOUR_PM_SHIFT) 40/* RTC Alarm Enable */ 41#define ALARM_ENABLE_SHIFT 7 42#define ALARM_ENABLE_MASK BIT(ALARM_ENABLE_SHIFT) 43 44#define REG_RTC_NONE 0xdeadbeef 45 46/* 47 * MAX77802 has separate register (RTCAE1) for alarm enable instead 48 * using 1 bit from registers RTC{SEC,MIN,HOUR,DAY,MONTH,YEAR,DATE} 49 * as in done in MAX77686. 50 */ 51#define MAX77802_ALARM_ENABLE_VALUE 0x77 52 53enum { 54 RTC_SEC = 0, 55 RTC_MIN, 56 RTC_HOUR, 57 RTC_WEEKDAY, 58 RTC_MONTH, 59 RTC_YEAR, 60 RTC_DATE, 61 RTC_NR_TIME 62}; 63 64struct max77686_rtc_driver_data { 65 /* Minimum usecs needed for a RTC update */ 66 unsigned long delay; 67 /* Mask used to read RTC registers value */ 68 u8 mask; 69 /* Registers offset to I2C addresses map */ 70 const unsigned int *map; 71 /* Has a separate alarm enable register? */ 72 bool alarm_enable_reg; 73 /* I2C address for RTC block */ 74 int rtc_i2c_addr; 75 /* RTC interrupt via platform resource */ 76 bool rtc_irq_from_platform; 77 /* Pending alarm status register */ 78 int alarm_pending_status_reg; 79 /* RTC IRQ CHIP for regmap */ 80 const struct regmap_irq_chip *rtc_irq_chip; 81}; 82 83struct max77686_rtc_info { 84 struct device *dev; 85 struct i2c_client *rtc; 86 struct rtc_device *rtc_dev; 87 struct mutex lock; 88 89 struct regmap *regmap; 90 struct regmap *rtc_regmap; 91 92 const struct max77686_rtc_driver_data *drv_data; 93 struct regmap_irq_chip_data *rtc_irq_data; 94 95 int rtc_irq; 96 int virq; 97 int rtc_24hr_mode; 98}; 99 100enum MAX77686_RTC_OP { 101 MAX77686_RTC_WRITE, 102 MAX77686_RTC_READ, 103}; 104 105/* These are not registers but just offsets that are mapped to addresses */ 106enum max77686_rtc_reg_offset { 107 REG_RTC_CONTROLM = 0, 108 REG_RTC_CONTROL, 109 REG_RTC_UPDATE0, 110 REG_WTSR_SMPL_CNTL, 111 REG_RTC_SEC, 112 REG_RTC_MIN, 113 REG_RTC_HOUR, 114 REG_RTC_WEEKDAY, 115 REG_RTC_MONTH, 116 REG_RTC_YEAR, 117 REG_RTC_DATE, 118 REG_ALARM1_SEC, 119 REG_ALARM1_MIN, 120 REG_ALARM1_HOUR, 121 REG_ALARM1_WEEKDAY, 122 REG_ALARM1_MONTH, 123 REG_ALARM1_YEAR, 124 REG_ALARM1_DATE, 125 REG_ALARM2_SEC, 126 REG_ALARM2_MIN, 127 REG_ALARM2_HOUR, 128 REG_ALARM2_WEEKDAY, 129 REG_ALARM2_MONTH, 130 REG_ALARM2_YEAR, 131 REG_ALARM2_DATE, 132 REG_RTC_AE1, 133 REG_RTC_END, 134}; 135 136/* Maps RTC registers offset to the MAX77686 register addresses */ 137static const unsigned int max77686_map[REG_RTC_END] = { 138 [REG_RTC_CONTROLM] = MAX77686_RTC_CONTROLM, 139 [REG_RTC_CONTROL] = MAX77686_RTC_CONTROL, 140 [REG_RTC_UPDATE0] = MAX77686_RTC_UPDATE0, 141 [REG_WTSR_SMPL_CNTL] = MAX77686_WTSR_SMPL_CNTL, 142 [REG_RTC_SEC] = MAX77686_RTC_SEC, 143 [REG_RTC_MIN] = MAX77686_RTC_MIN, 144 [REG_RTC_HOUR] = MAX77686_RTC_HOUR, 145 [REG_RTC_WEEKDAY] = MAX77686_RTC_WEEKDAY, 146 [REG_RTC_MONTH] = MAX77686_RTC_MONTH, 147 [REG_RTC_YEAR] = MAX77686_RTC_YEAR, 148 [REG_RTC_DATE] = MAX77686_RTC_DATE, 149 [REG_ALARM1_SEC] = MAX77686_ALARM1_SEC, 150 [REG_ALARM1_MIN] = MAX77686_ALARM1_MIN, 151 [REG_ALARM1_HOUR] = MAX77686_ALARM1_HOUR, 152 [REG_ALARM1_WEEKDAY] = MAX77686_ALARM1_WEEKDAY, 153 [REG_ALARM1_MONTH] = MAX77686_ALARM1_MONTH, 154 [REG_ALARM1_YEAR] = MAX77686_ALARM1_YEAR, 155 [REG_ALARM1_DATE] = MAX77686_ALARM1_DATE, 156 [REG_ALARM2_SEC] = MAX77686_ALARM2_SEC, 157 [REG_ALARM2_MIN] = MAX77686_ALARM2_MIN, 158 [REG_ALARM2_HOUR] = MAX77686_ALARM2_HOUR, 159 [REG_ALARM2_WEEKDAY] = MAX77686_ALARM2_WEEKDAY, 160 [REG_ALARM2_MONTH] = MAX77686_ALARM2_MONTH, 161 [REG_ALARM2_YEAR] = MAX77686_ALARM2_YEAR, 162 [REG_ALARM2_DATE] = MAX77686_ALARM2_DATE, 163 [REG_RTC_AE1] = REG_RTC_NONE, 164}; 165 166static const struct regmap_irq max77686_rtc_irqs[] = { 167 /* RTC interrupts */ 168 REGMAP_IRQ_REG(0, 0, MAX77686_RTCINT_RTC60S_MSK), 169 REGMAP_IRQ_REG(1, 0, MAX77686_RTCINT_RTCA1_MSK), 170 REGMAP_IRQ_REG(2, 0, MAX77686_RTCINT_RTCA2_MSK), 171 REGMAP_IRQ_REG(3, 0, MAX77686_RTCINT_SMPL_MSK), 172 REGMAP_IRQ_REG(4, 0, MAX77686_RTCINT_RTC1S_MSK), 173 REGMAP_IRQ_REG(5, 0, MAX77686_RTCINT_WTSR_MSK), 174}; 175 176static const struct regmap_irq_chip max77686_rtc_irq_chip = { 177 .name = "max77686-rtc", 178 .status_base = MAX77686_RTC_INT, 179 .mask_base = MAX77686_RTC_INTM, 180 .num_regs = 1, 181 .irqs = max77686_rtc_irqs, 182 .num_irqs = ARRAY_SIZE(max77686_rtc_irqs), 183}; 184 185static const struct max77686_rtc_driver_data max77686_drv_data = { 186 .delay = 16000, 187 .mask = 0x7f, 188 .map = max77686_map, 189 .alarm_enable_reg = false, 190 .rtc_irq_from_platform = false, 191 .alarm_pending_status_reg = MAX77686_REG_STATUS2, 192 .rtc_i2c_addr = MAX77686_I2C_ADDR_RTC, 193 .rtc_irq_chip = &max77686_rtc_irq_chip, 194}; 195 196static const struct max77686_rtc_driver_data max77620_drv_data = { 197 .delay = 16000, 198 .mask = 0x7f, 199 .map = max77686_map, 200 .alarm_enable_reg = false, 201 .rtc_irq_from_platform = true, 202 .alarm_pending_status_reg = MAX77686_INVALID_REG, 203 .rtc_i2c_addr = MAX77620_I2C_ADDR_RTC, 204 .rtc_irq_chip = &max77686_rtc_irq_chip, 205}; 206 207static const unsigned int max77802_map[REG_RTC_END] = { 208 [REG_RTC_CONTROLM] = MAX77802_RTC_CONTROLM, 209 [REG_RTC_CONTROL] = MAX77802_RTC_CONTROL, 210 [REG_RTC_UPDATE0] = MAX77802_RTC_UPDATE0, 211 [REG_WTSR_SMPL_CNTL] = MAX77802_WTSR_SMPL_CNTL, 212 [REG_RTC_SEC] = MAX77802_RTC_SEC, 213 [REG_RTC_MIN] = MAX77802_RTC_MIN, 214 [REG_RTC_HOUR] = MAX77802_RTC_HOUR, 215 [REG_RTC_WEEKDAY] = MAX77802_RTC_WEEKDAY, 216 [REG_RTC_MONTH] = MAX77802_RTC_MONTH, 217 [REG_RTC_YEAR] = MAX77802_RTC_YEAR, 218 [REG_RTC_DATE] = MAX77802_RTC_DATE, 219 [REG_ALARM1_SEC] = MAX77802_ALARM1_SEC, 220 [REG_ALARM1_MIN] = MAX77802_ALARM1_MIN, 221 [REG_ALARM1_HOUR] = MAX77802_ALARM1_HOUR, 222 [REG_ALARM1_WEEKDAY] = MAX77802_ALARM1_WEEKDAY, 223 [REG_ALARM1_MONTH] = MAX77802_ALARM1_MONTH, 224 [REG_ALARM1_YEAR] = MAX77802_ALARM1_YEAR, 225 [REG_ALARM1_DATE] = MAX77802_ALARM1_DATE, 226 [REG_ALARM2_SEC] = MAX77802_ALARM2_SEC, 227 [REG_ALARM2_MIN] = MAX77802_ALARM2_MIN, 228 [REG_ALARM2_HOUR] = MAX77802_ALARM2_HOUR, 229 [REG_ALARM2_WEEKDAY] = MAX77802_ALARM2_WEEKDAY, 230 [REG_ALARM2_MONTH] = MAX77802_ALARM2_MONTH, 231 [REG_ALARM2_YEAR] = MAX77802_ALARM2_YEAR, 232 [REG_ALARM2_DATE] = MAX77802_ALARM2_DATE, 233 [REG_RTC_AE1] = MAX77802_RTC_AE1, 234}; 235 236static const struct regmap_irq_chip max77802_rtc_irq_chip = { 237 .name = "max77802-rtc", 238 .status_base = MAX77802_RTC_INT, 239 .mask_base = MAX77802_RTC_INTM, 240 .num_regs = 1, 241 .irqs = max77686_rtc_irqs, /* same masks as 77686 */ 242 .num_irqs = ARRAY_SIZE(max77686_rtc_irqs), 243}; 244 245static const struct max77686_rtc_driver_data max77802_drv_data = { 246 .delay = 200, 247 .mask = 0xff, 248 .map = max77802_map, 249 .alarm_enable_reg = true, 250 .rtc_irq_from_platform = false, 251 .alarm_pending_status_reg = MAX77686_REG_STATUS2, 252 .rtc_i2c_addr = MAX77686_INVALID_I2C_ADDR, 253 .rtc_irq_chip = &max77802_rtc_irq_chip, 254}; 255 256static void max77686_rtc_data_to_tm(u8 *data, struct rtc_time *tm, 257 struct max77686_rtc_info *info) 258{ 259 u8 mask = info->drv_data->mask; 260 261 tm->tm_sec = data[RTC_SEC] & mask; 262 tm->tm_min = data[RTC_MIN] & mask; 263 if (info->rtc_24hr_mode) { 264 tm->tm_hour = data[RTC_HOUR] & 0x1f; 265 } else { 266 tm->tm_hour = data[RTC_HOUR] & 0x0f; 267 if (data[RTC_HOUR] & HOUR_PM_MASK) 268 tm->tm_hour += 12; 269 } 270 271 /* Only a single bit is set in data[], so fls() would be equivalent */ 272 tm->tm_wday = ffs(data[RTC_WEEKDAY] & mask) - 1; 273 tm->tm_mday = data[RTC_DATE] & 0x1f; 274 tm->tm_mon = (data[RTC_MONTH] & 0x0f) - 1; 275 tm->tm_year = data[RTC_YEAR] & mask; 276 tm->tm_yday = 0; 277 tm->tm_isdst = 0; 278 279 /* 280 * MAX77686 uses 1 bit from sec/min/hour/etc RTC registers and the 281 * year values are just 0..99 so add 100 to support up to 2099. 282 */ 283 if (!info->drv_data->alarm_enable_reg) 284 tm->tm_year += 100; 285} 286 287static int max77686_rtc_tm_to_data(struct rtc_time *tm, u8 *data, 288 struct max77686_rtc_info *info) 289{ 290 data[RTC_SEC] = tm->tm_sec; 291 data[RTC_MIN] = tm->tm_min; 292 data[RTC_HOUR] = tm->tm_hour; 293 data[RTC_WEEKDAY] = 1 << tm->tm_wday; 294 data[RTC_DATE] = tm->tm_mday; 295 data[RTC_MONTH] = tm->tm_mon + 1; 296 297 if (info->drv_data->alarm_enable_reg) { 298 data[RTC_YEAR] = tm->tm_year; 299 return 0; 300 } 301 302 data[RTC_YEAR] = tm->tm_year > 100 ? (tm->tm_year - 100) : 0; 303 304 if (tm->tm_year < 100) { 305 dev_err(info->dev, "RTC cannot handle the year %d.\n", 306 1900 + tm->tm_year); 307 return -EINVAL; 308 } 309 310 return 0; 311} 312 313static int max77686_rtc_update(struct max77686_rtc_info *info, 314 enum MAX77686_RTC_OP op) 315{ 316 int ret; 317 unsigned int data; 318 unsigned long delay = info->drv_data->delay; 319 320 if (op == MAX77686_RTC_WRITE) 321 data = 1 << RTC_UDR_SHIFT; 322 else 323 data = 1 << RTC_RBUDR_SHIFT; 324 325 ret = regmap_update_bits(info->rtc_regmap, 326 info->drv_data->map[REG_RTC_UPDATE0], 327 data, data); 328 if (ret < 0) 329 dev_err(info->dev, "Fail to write update reg(ret=%d, data=0x%x)\n", 330 ret, data); 331 else { 332 /* Minimum delay required before RTC update. */ 333 usleep_range(delay, delay * 2); 334 } 335 336 return ret; 337} 338 339static int max77686_rtc_read_time(struct device *dev, struct rtc_time *tm) 340{ 341 struct max77686_rtc_info *info = dev_get_drvdata(dev); 342 u8 data[RTC_NR_TIME]; 343 int ret; 344 345 mutex_lock(&info->lock); 346 347 ret = max77686_rtc_update(info, MAX77686_RTC_READ); 348 if (ret < 0) 349 goto out; 350 351 ret = regmap_bulk_read(info->rtc_regmap, 352 info->drv_data->map[REG_RTC_SEC], 353 data, ARRAY_SIZE(data)); 354 if (ret < 0) { 355 dev_err(info->dev, "Fail to read time reg(%d)\n", ret); 356 goto out; 357 } 358 359 max77686_rtc_data_to_tm(data, tm, info); 360 361out: 362 mutex_unlock(&info->lock); 363 return ret; 364} 365 366static int max77686_rtc_set_time(struct device *dev, struct rtc_time *tm) 367{ 368 struct max77686_rtc_info *info = dev_get_drvdata(dev); 369 u8 data[RTC_NR_TIME]; 370 int ret; 371 372 ret = max77686_rtc_tm_to_data(tm, data, info); 373 if (ret < 0) 374 return ret; 375 376 mutex_lock(&info->lock); 377 378 ret = regmap_bulk_write(info->rtc_regmap, 379 info->drv_data->map[REG_RTC_SEC], 380 data, ARRAY_SIZE(data)); 381 if (ret < 0) { 382 dev_err(info->dev, "Fail to write time reg(%d)\n", ret); 383 goto out; 384 } 385 386 ret = max77686_rtc_update(info, MAX77686_RTC_WRITE); 387 388out: 389 mutex_unlock(&info->lock); 390 return ret; 391} 392 393static int max77686_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) 394{ 395 struct max77686_rtc_info *info = dev_get_drvdata(dev); 396 u8 data[RTC_NR_TIME]; 397 unsigned int val; 398 const unsigned int *map = info->drv_data->map; 399 int i, ret; 400 401 mutex_lock(&info->lock); 402 403 ret = max77686_rtc_update(info, MAX77686_RTC_READ); 404 if (ret < 0) 405 goto out; 406 407 ret = regmap_bulk_read(info->rtc_regmap, map[REG_ALARM1_SEC], 408 data, ARRAY_SIZE(data)); 409 if (ret < 0) { 410 dev_err(info->dev, "Fail to read alarm reg(%d)\n", ret); 411 goto out; 412 } 413 414 max77686_rtc_data_to_tm(data, &alrm->time, info); 415 416 alrm->enabled = 0; 417 418 if (info->drv_data->alarm_enable_reg) { 419 if (map[REG_RTC_AE1] == REG_RTC_NONE) { 420 ret = -EINVAL; 421 dev_err(info->dev, 422 "alarm enable register not set(%d)\n", ret); 423 goto out; 424 } 425 426 ret = regmap_read(info->rtc_regmap, map[REG_RTC_AE1], &val); 427 if (ret < 0) { 428 dev_err(info->dev, 429 "fail to read alarm enable(%d)\n", ret); 430 goto out; 431 } 432 433 if (val) 434 alrm->enabled = 1; 435 } else { 436 for (i = 0; i < ARRAY_SIZE(data); i++) { 437 if (data[i] & ALARM_ENABLE_MASK) { 438 alrm->enabled = 1; 439 break; 440 } 441 } 442 } 443 444 alrm->pending = 0; 445 446 if (info->drv_data->alarm_pending_status_reg == MAX77686_INVALID_REG) 447 goto out; 448 449 ret = regmap_read(info->regmap, 450 info->drv_data->alarm_pending_status_reg, &val); 451 if (ret < 0) { 452 dev_err(info->dev, 453 "Fail to read alarm pending status reg(%d)\n", ret); 454 goto out; 455 } 456 457 if (val & (1 << 4)) /* RTCA1 */ 458 alrm->pending = 1; 459 460out: 461 mutex_unlock(&info->lock); 462 return ret; 463} 464 465static int max77686_rtc_stop_alarm(struct max77686_rtc_info *info) 466{ 467 u8 data[RTC_NR_TIME]; 468 int ret, i; 469 struct rtc_time tm; 470 const unsigned int *map = info->drv_data->map; 471 472 if (!mutex_is_locked(&info->lock)) 473 dev_warn(info->dev, "%s: should have mutex locked\n", __func__); 474 475 ret = max77686_rtc_update(info, MAX77686_RTC_READ); 476 if (ret < 0) 477 goto out; 478 479 if (info->drv_data->alarm_enable_reg) { 480 if (map[REG_RTC_AE1] == REG_RTC_NONE) { 481 ret = -EINVAL; 482 dev_err(info->dev, 483 "alarm enable register not set(%d)\n", ret); 484 goto out; 485 } 486 487 ret = regmap_write(info->rtc_regmap, map[REG_RTC_AE1], 0); 488 } else { 489 ret = regmap_bulk_read(info->rtc_regmap, map[REG_ALARM1_SEC], 490 data, ARRAY_SIZE(data)); 491 if (ret < 0) { 492 dev_err(info->dev, "Fail to read alarm reg(%d)\n", ret); 493 goto out; 494 } 495 496 max77686_rtc_data_to_tm(data, &tm, info); 497 498 for (i = 0; i < ARRAY_SIZE(data); i++) 499 data[i] &= ~ALARM_ENABLE_MASK; 500 501 ret = regmap_bulk_write(info->rtc_regmap, map[REG_ALARM1_SEC], 502 data, ARRAY_SIZE(data)); 503 } 504 505 if (ret < 0) { 506 dev_err(info->dev, "Fail to write alarm reg(%d)\n", ret); 507 goto out; 508 } 509 510 ret = max77686_rtc_update(info, MAX77686_RTC_WRITE); 511out: 512 return ret; 513} 514 515static int max77686_rtc_start_alarm(struct max77686_rtc_info *info) 516{ 517 u8 data[RTC_NR_TIME]; 518 int ret; 519 struct rtc_time tm; 520 const unsigned int *map = info->drv_data->map; 521 522 if (!mutex_is_locked(&info->lock)) 523 dev_warn(info->dev, "%s: should have mutex locked\n", __func__); 524 525 ret = max77686_rtc_update(info, MAX77686_RTC_READ); 526 if (ret < 0) 527 goto out; 528 529 if (info->drv_data->alarm_enable_reg) { 530 ret = regmap_write(info->rtc_regmap, map[REG_RTC_AE1], 531 MAX77802_ALARM_ENABLE_VALUE); 532 } else { 533 ret = regmap_bulk_read(info->rtc_regmap, map[REG_ALARM1_SEC], 534 data, ARRAY_SIZE(data)); 535 if (ret < 0) { 536 dev_err(info->dev, "Fail to read alarm reg(%d)\n", ret); 537 goto out; 538 } 539 540 max77686_rtc_data_to_tm(data, &tm, info); 541 542 data[RTC_SEC] |= (1 << ALARM_ENABLE_SHIFT); 543 data[RTC_MIN] |= (1 << ALARM_ENABLE_SHIFT); 544 data[RTC_HOUR] |= (1 << ALARM_ENABLE_SHIFT); 545 data[RTC_WEEKDAY] &= ~ALARM_ENABLE_MASK; 546 if (data[RTC_MONTH] & 0xf) 547 data[RTC_MONTH] |= (1 << ALARM_ENABLE_SHIFT); 548 if (data[RTC_YEAR] & info->drv_data->mask) 549 data[RTC_YEAR] |= (1 << ALARM_ENABLE_SHIFT); 550 if (data[RTC_DATE] & 0x1f) 551 data[RTC_DATE] |= (1 << ALARM_ENABLE_SHIFT); 552 553 ret = regmap_bulk_write(info->rtc_regmap, map[REG_ALARM1_SEC], 554 data, ARRAY_SIZE(data)); 555 } 556 557 if (ret < 0) { 558 dev_err(info->dev, "Fail to write alarm reg(%d)\n", ret); 559 goto out; 560 } 561 562 ret = max77686_rtc_update(info, MAX77686_RTC_WRITE); 563out: 564 return ret; 565} 566 567static int max77686_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) 568{ 569 struct max77686_rtc_info *info = dev_get_drvdata(dev); 570 u8 data[RTC_NR_TIME]; 571 int ret; 572 573 ret = max77686_rtc_tm_to_data(&alrm->time, data, info); 574 if (ret < 0) 575 return ret; 576 577 mutex_lock(&info->lock); 578 579 ret = max77686_rtc_stop_alarm(info); 580 if (ret < 0) 581 goto out; 582 583 ret = regmap_bulk_write(info->rtc_regmap, 584 info->drv_data->map[REG_ALARM1_SEC], 585 data, ARRAY_SIZE(data)); 586 587 if (ret < 0) { 588 dev_err(info->dev, "Fail to write alarm reg(%d)\n", ret); 589 goto out; 590 } 591 592 ret = max77686_rtc_update(info, MAX77686_RTC_WRITE); 593 if (ret < 0) 594 goto out; 595 596 if (alrm->enabled) 597 ret = max77686_rtc_start_alarm(info); 598out: 599 mutex_unlock(&info->lock); 600 return ret; 601} 602 603static int max77686_rtc_alarm_irq_enable(struct device *dev, 604 unsigned int enabled) 605{ 606 struct max77686_rtc_info *info = dev_get_drvdata(dev); 607 int ret; 608 609 mutex_lock(&info->lock); 610 if (enabled) 611 ret = max77686_rtc_start_alarm(info); 612 else 613 ret = max77686_rtc_stop_alarm(info); 614 mutex_unlock(&info->lock); 615 616 return ret; 617} 618 619static irqreturn_t max77686_rtc_alarm_irq(int irq, void *data) 620{ 621 struct max77686_rtc_info *info = data; 622 623 dev_dbg(info->dev, "RTC alarm IRQ: %d\n", irq); 624 625 rtc_update_irq(info->rtc_dev, 1, RTC_IRQF | RTC_AF); 626 627 return IRQ_HANDLED; 628} 629 630static const struct rtc_class_ops max77686_rtc_ops = { 631 .read_time = max77686_rtc_read_time, 632 .set_time = max77686_rtc_set_time, 633 .read_alarm = max77686_rtc_read_alarm, 634 .set_alarm = max77686_rtc_set_alarm, 635 .alarm_irq_enable = max77686_rtc_alarm_irq_enable, 636}; 637 638static int max77686_rtc_init_reg(struct max77686_rtc_info *info) 639{ 640 u8 data[2]; 641 int ret; 642 643 /* Set RTC control register : Binary mode, 24hour mdoe */ 644 data[0] = (1 << BCD_EN_SHIFT) | (1 << MODEL24_SHIFT); 645 data[1] = (0 << BCD_EN_SHIFT) | (1 << MODEL24_SHIFT); 646 647 info->rtc_24hr_mode = 1; 648 649 ret = regmap_bulk_write(info->rtc_regmap, 650 info->drv_data->map[REG_RTC_CONTROLM], 651 data, ARRAY_SIZE(data)); 652 if (ret < 0) { 653 dev_err(info->dev, "Fail to write controlm reg(%d)\n", ret); 654 return ret; 655 } 656 657 ret = max77686_rtc_update(info, MAX77686_RTC_WRITE); 658 return ret; 659} 660 661static const struct regmap_config max77686_rtc_regmap_config = { 662 .reg_bits = 8, 663 .val_bits = 8, 664}; 665 666static int max77686_init_rtc_regmap(struct max77686_rtc_info *info) 667{ 668 struct device *parent = info->dev->parent; 669 struct i2c_client *parent_i2c = to_i2c_client(parent); 670 int ret; 671 672 if (info->drv_data->rtc_irq_from_platform) { 673 struct platform_device *pdev = to_platform_device(info->dev); 674 675 info->rtc_irq = platform_get_irq(pdev, 0); 676 if (info->rtc_irq < 0) 677 return info->rtc_irq; 678 } else { 679 info->rtc_irq = parent_i2c->irq; 680 } 681 682 info->regmap = dev_get_regmap(parent, NULL); 683 if (!info->regmap) { 684 dev_err(info->dev, "Failed to get rtc regmap\n"); 685 return -ENODEV; 686 } 687 688 if (info->drv_data->rtc_i2c_addr == MAX77686_INVALID_I2C_ADDR) { 689 info->rtc_regmap = info->regmap; 690 goto add_rtc_irq; 691 } 692 693 info->rtc = devm_i2c_new_dummy_device(info->dev, parent_i2c->adapter, 694 info->drv_data->rtc_i2c_addr); 695 if (IS_ERR(info->rtc)) { 696 dev_err(info->dev, "Failed to allocate I2C device for RTC\n"); 697 return PTR_ERR(info->rtc); 698 } 699 700 info->rtc_regmap = devm_regmap_init_i2c(info->rtc, 701 &max77686_rtc_regmap_config); 702 if (IS_ERR(info->rtc_regmap)) { 703 ret = PTR_ERR(info->rtc_regmap); 704 dev_err(info->dev, "Failed to allocate RTC regmap: %d\n", ret); 705 return ret; 706 } 707 708add_rtc_irq: 709 ret = regmap_add_irq_chip(info->rtc_regmap, info->rtc_irq, 710 IRQF_TRIGGER_FALLING | IRQF_ONESHOT | 711 IRQF_SHARED, 0, info->drv_data->rtc_irq_chip, 712 &info->rtc_irq_data); 713 if (ret < 0) { 714 dev_err(info->dev, "Failed to add RTC irq chip: %d\n", ret); 715 return ret; 716 } 717 718 return 0; 719} 720 721static int max77686_rtc_probe(struct platform_device *pdev) 722{ 723 struct max77686_rtc_info *info; 724 const struct platform_device_id *id = platform_get_device_id(pdev); 725 int ret; 726 727 info = devm_kzalloc(&pdev->dev, sizeof(struct max77686_rtc_info), 728 GFP_KERNEL); 729 if (!info) 730 return -ENOMEM; 731 732 mutex_init(&info->lock); 733 info->dev = &pdev->dev; 734 info->drv_data = (const struct max77686_rtc_driver_data *) 735 id->driver_data; 736 737 ret = max77686_init_rtc_regmap(info); 738 if (ret < 0) 739 return ret; 740 741 platform_set_drvdata(pdev, info); 742 743 ret = max77686_rtc_init_reg(info); 744 if (ret < 0) { 745 dev_err(&pdev->dev, "Failed to initialize RTC reg:%d\n", ret); 746 goto err_rtc; 747 } 748 749 device_init_wakeup(&pdev->dev, 1); 750 751 info->rtc_dev = devm_rtc_device_register(&pdev->dev, id->name, 752 &max77686_rtc_ops, THIS_MODULE); 753 754 if (IS_ERR(info->rtc_dev)) { 755 ret = PTR_ERR(info->rtc_dev); 756 dev_err(&pdev->dev, "Failed to register RTC device: %d\n", ret); 757 if (ret == 0) 758 ret = -EINVAL; 759 goto err_rtc; 760 } 761 762 info->virq = regmap_irq_get_virq(info->rtc_irq_data, 763 MAX77686_RTCIRQ_RTCA1); 764 if (info->virq <= 0) { 765 ret = -ENXIO; 766 goto err_rtc; 767 } 768 769 ret = request_threaded_irq(info->virq, NULL, max77686_rtc_alarm_irq, 0, 770 "rtc-alarm1", info); 771 if (ret < 0) { 772 dev_err(&pdev->dev, "Failed to request alarm IRQ: %d: %d\n", 773 info->virq, ret); 774 goto err_rtc; 775 } 776 777 return 0; 778 779err_rtc: 780 regmap_del_irq_chip(info->rtc_irq, info->rtc_irq_data); 781 782 return ret; 783} 784 785static int max77686_rtc_remove(struct platform_device *pdev) 786{ 787 struct max77686_rtc_info *info = platform_get_drvdata(pdev); 788 789 free_irq(info->virq, info); 790 regmap_del_irq_chip(info->rtc_irq, info->rtc_irq_data); 791 792 return 0; 793} 794 795#ifdef CONFIG_PM_SLEEP 796static int max77686_rtc_suspend(struct device *dev) 797{ 798 if (device_may_wakeup(dev)) { 799 struct max77686_rtc_info *info = dev_get_drvdata(dev); 800 801 return enable_irq_wake(info->virq); 802 } 803 804 return 0; 805} 806 807static int max77686_rtc_resume(struct device *dev) 808{ 809 if (device_may_wakeup(dev)) { 810 struct max77686_rtc_info *info = dev_get_drvdata(dev); 811 812 return disable_irq_wake(info->virq); 813 } 814 815 return 0; 816} 817#endif 818 819static SIMPLE_DEV_PM_OPS(max77686_rtc_pm_ops, 820 max77686_rtc_suspend, max77686_rtc_resume); 821 822static const struct platform_device_id rtc_id[] = { 823 { "max77686-rtc", .driver_data = (kernel_ulong_t)&max77686_drv_data, }, 824 { "max77802-rtc", .driver_data = (kernel_ulong_t)&max77802_drv_data, }, 825 { "max77620-rtc", .driver_data = (kernel_ulong_t)&max77620_drv_data, }, 826 {}, 827}; 828MODULE_DEVICE_TABLE(platform, rtc_id); 829 830static struct platform_driver max77686_rtc_driver = { 831 .driver = { 832 .name = "max77686-rtc", 833 .pm = &max77686_rtc_pm_ops, 834 }, 835 .probe = max77686_rtc_probe, 836 .remove = max77686_rtc_remove, 837 .id_table = rtc_id, 838}; 839 840module_platform_driver(max77686_rtc_driver); 841 842MODULE_DESCRIPTION("Maxim MAX77686 RTC driver"); 843MODULE_AUTHOR("Chiwoong Byun <woong.byun@samsung.com>"); 844MODULE_LICENSE("GPL");