rtc-max77686.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622
  1. /*
  2. * RTC driver for Maxim MAX77686
  3. *
  4. * Copyright (C) 2012 Samsung Electronics Co.Ltd
  5. *
  6. * based on rtc-max8997.c
  7. *
  8. * This program is free software; you can redistribute it and/or modify it
  9. * under the terms of the GNU General Public License as published by the
  10. * Free Software Foundation; either version 2 of the License, or (at your
  11. * option) any later version.
  12. *
  13. */
  14. #include <linux/slab.h>
  15. #include <linux/rtc.h>
  16. #include <linux/delay.h>
  17. #include <linux/mutex.h>
  18. #include <linux/module.h>
  19. #include <linux/platform_device.h>
  20. #include <linux/mfd/max77686-private.h>
  21. #include <linux/irqdomain.h>
  22. #include <linux/regmap.h>
  23. /* RTC Control Register */
  24. #define BCD_EN_SHIFT 0
  25. #define BCD_EN_MASK (1 << BCD_EN_SHIFT)
  26. #define MODEL24_SHIFT 1
  27. #define MODEL24_MASK (1 << MODEL24_SHIFT)
  28. /* RTC Update Register1 */
  29. #define RTC_UDR_SHIFT 0
  30. #define RTC_UDR_MASK (1 << RTC_UDR_SHIFT)
  31. #define RTC_RBUDR_SHIFT 4
  32. #define RTC_RBUDR_MASK (1 << RTC_RBUDR_SHIFT)
  33. /* WTSR and SMPL Register */
  34. #define WTSRT_SHIFT 0
  35. #define SMPLT_SHIFT 2
  36. #define WTSR_EN_SHIFT 6
  37. #define SMPL_EN_SHIFT 7
  38. #define WTSRT_MASK (3 << WTSRT_SHIFT)
  39. #define SMPLT_MASK (3 << SMPLT_SHIFT)
  40. #define WTSR_EN_MASK (1 << WTSR_EN_SHIFT)
  41. #define SMPL_EN_MASK (1 << SMPL_EN_SHIFT)
  42. /* RTC Hour register */
  43. #define HOUR_PM_SHIFT 6
  44. #define HOUR_PM_MASK (1 << HOUR_PM_SHIFT)
  45. /* RTC Alarm Enable */
  46. #define ALARM_ENABLE_SHIFT 7
  47. #define ALARM_ENABLE_MASK (1 << ALARM_ENABLE_SHIFT)
  48. #define MAX77686_RTC_UPDATE_DELAY 16
  49. #undef MAX77686_RTC_WTSR_SMPL
  50. enum {
  51. RTC_SEC = 0,
  52. RTC_MIN,
  53. RTC_HOUR,
  54. RTC_WEEKDAY,
  55. RTC_MONTH,
  56. RTC_YEAR,
  57. RTC_DATE,
  58. RTC_NR_TIME
  59. };
  60. struct max77686_rtc_info {
  61. struct device *dev;
  62. struct max77686_dev *max77686;
  63. struct i2c_client *rtc;
  64. struct rtc_device *rtc_dev;
  65. struct mutex lock;
  66. struct regmap *regmap;
  67. int virq;
  68. int rtc_24hr_mode;
  69. };
  70. enum MAX77686_RTC_OP {
  71. MAX77686_RTC_WRITE,
  72. MAX77686_RTC_READ,
  73. };
  74. static inline int max77686_rtc_calculate_wday(u8 shifted)
  75. {
  76. int counter = -1;
  77. while (shifted) {
  78. shifted >>= 1;
  79. counter++;
  80. }
  81. return counter;
  82. }
  83. static void max77686_rtc_data_to_tm(u8 *data, struct rtc_time *tm,
  84. int rtc_24hr_mode)
  85. {
  86. tm->tm_sec = data[RTC_SEC] & 0x7f;
  87. tm->tm_min = data[RTC_MIN] & 0x7f;
  88. if (rtc_24hr_mode)
  89. tm->tm_hour = data[RTC_HOUR] & 0x1f;
  90. else {
  91. tm->tm_hour = data[RTC_HOUR] & 0x0f;
  92. if (data[RTC_HOUR] & HOUR_PM_MASK)
  93. tm->tm_hour += 12;
  94. }
  95. tm->tm_wday = max77686_rtc_calculate_wday(data[RTC_WEEKDAY] & 0x7f);
  96. tm->tm_mday = data[RTC_DATE] & 0x1f;
  97. tm->tm_mon = (data[RTC_MONTH] & 0x0f) - 1;
  98. tm->tm_year = (data[RTC_YEAR] & 0x7f) + 100;
  99. tm->tm_yday = 0;
  100. tm->tm_isdst = 0;
  101. }
  102. static int max77686_rtc_tm_to_data(struct rtc_time *tm, u8 *data)
  103. {
  104. data[RTC_SEC] = tm->tm_sec;
  105. data[RTC_MIN] = tm->tm_min;
  106. data[RTC_HOUR] = tm->tm_hour;
  107. data[RTC_WEEKDAY] = 1 << tm->tm_wday;
  108. data[RTC_DATE] = tm->tm_mday;
  109. data[RTC_MONTH] = tm->tm_mon + 1;
  110. data[RTC_YEAR] = tm->tm_year > 100 ? (tm->tm_year - 100) : 0;
  111. if (tm->tm_year < 100) {
  112. pr_warn("%s: MAX77686 RTC cannot handle the year %d."
  113. "Assume it's 2000.\n", __func__, 1900 + tm->tm_year);
  114. return -EINVAL;
  115. }
  116. return 0;
  117. }
  118. static int max77686_rtc_update(struct max77686_rtc_info *info,
  119. enum MAX77686_RTC_OP op)
  120. {
  121. int ret;
  122. unsigned int data;
  123. if (op == MAX77686_RTC_WRITE)
  124. data = 1 << RTC_UDR_SHIFT;
  125. else
  126. data = 1 << RTC_RBUDR_SHIFT;
  127. ret = regmap_update_bits(info->max77686->rtc_regmap,
  128. MAX77686_RTC_UPDATE0, data, data);
  129. if (ret < 0)
  130. dev_err(info->dev, "%s: fail to write update reg(ret=%d, data=0x%x)\n",
  131. __func__, ret, data);
  132. else {
  133. /* Minimum 16ms delay required before RTC update. */
  134. msleep(MAX77686_RTC_UPDATE_DELAY);
  135. }
  136. return ret;
  137. }
  138. static int max77686_rtc_read_time(struct device *dev, struct rtc_time *tm)
  139. {
  140. struct max77686_rtc_info *info = dev_get_drvdata(dev);
  141. u8 data[RTC_NR_TIME];
  142. int ret;
  143. mutex_lock(&info->lock);
  144. ret = max77686_rtc_update(info, MAX77686_RTC_READ);
  145. if (ret < 0)
  146. goto out;
  147. ret = regmap_bulk_read(info->max77686->rtc_regmap,
  148. MAX77686_RTC_SEC, data, RTC_NR_TIME);
  149. if (ret < 0) {
  150. dev_err(info->dev, "%s: fail to read time reg(%d)\n", __func__, ret);
  151. goto out;
  152. }
  153. max77686_rtc_data_to_tm(data, tm, info->rtc_24hr_mode);
  154. ret = rtc_valid_tm(tm);
  155. out:
  156. mutex_unlock(&info->lock);
  157. return ret;
  158. }
  159. static int max77686_rtc_set_time(struct device *dev, struct rtc_time *tm)
  160. {
  161. struct max77686_rtc_info *info = dev_get_drvdata(dev);
  162. u8 data[RTC_NR_TIME];
  163. int ret;
  164. ret = max77686_rtc_tm_to_data(tm, data);
  165. if (ret < 0)
  166. return ret;
  167. mutex_lock(&info->lock);
  168. ret = regmap_bulk_write(info->max77686->rtc_regmap,
  169. MAX77686_RTC_SEC, data, RTC_NR_TIME);
  170. if (ret < 0) {
  171. dev_err(info->dev, "%s: fail to write time reg(%d)\n", __func__,
  172. ret);
  173. goto out;
  174. }
  175. ret = max77686_rtc_update(info, MAX77686_RTC_WRITE);
  176. out:
  177. mutex_unlock(&info->lock);
  178. return ret;
  179. }
  180. static int max77686_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
  181. {
  182. struct max77686_rtc_info *info = dev_get_drvdata(dev);
  183. u8 data[RTC_NR_TIME];
  184. unsigned int val;
  185. int i, ret;
  186. mutex_lock(&info->lock);
  187. ret = max77686_rtc_update(info, MAX77686_RTC_READ);
  188. if (ret < 0)
  189. goto out;
  190. ret = regmap_bulk_read(info->max77686->rtc_regmap,
  191. MAX77686_ALARM1_SEC, data, RTC_NR_TIME);
  192. if (ret < 0) {
  193. dev_err(info->dev, "%s:%d fail to read alarm reg(%d)\n",
  194. __func__, __LINE__, ret);
  195. goto out;
  196. }
  197. max77686_rtc_data_to_tm(data, &alrm->time, info->rtc_24hr_mode);
  198. alrm->enabled = 0;
  199. for (i = 0; i < RTC_NR_TIME; i++) {
  200. if (data[i] & ALARM_ENABLE_MASK) {
  201. alrm->enabled = 1;
  202. break;
  203. }
  204. }
  205. alrm->pending = 0;
  206. ret = regmap_read(info->max77686->regmap, MAX77686_REG_STATUS1, &val);
  207. if (ret < 0) {
  208. dev_err(info->dev, "%s:%d fail to read status1 reg(%d)\n",
  209. __func__, __LINE__, ret);
  210. goto out;
  211. }
  212. if (val & (1 << 4)) /* RTCA1 */
  213. alrm->pending = 1;
  214. out:
  215. mutex_unlock(&info->lock);
  216. return 0;
  217. }
  218. static int max77686_rtc_stop_alarm(struct max77686_rtc_info *info)
  219. {
  220. u8 data[RTC_NR_TIME];
  221. int ret, i;
  222. struct rtc_time tm;
  223. if (!mutex_is_locked(&info->lock))
  224. dev_warn(info->dev, "%s: should have mutex locked\n", __func__);
  225. ret = max77686_rtc_update(info, MAX77686_RTC_READ);
  226. if (ret < 0)
  227. goto out;
  228. ret = regmap_bulk_read(info->max77686->rtc_regmap,
  229. MAX77686_ALARM1_SEC, data, RTC_NR_TIME);
  230. if (ret < 0) {
  231. dev_err(info->dev, "%s: fail to read alarm reg(%d)\n",
  232. __func__, ret);
  233. goto out;
  234. }
  235. max77686_rtc_data_to_tm(data, &tm, info->rtc_24hr_mode);
  236. for (i = 0; i < RTC_NR_TIME; i++)
  237. data[i] &= ~ALARM_ENABLE_MASK;
  238. ret = regmap_bulk_write(info->max77686->rtc_regmap,
  239. MAX77686_ALARM1_SEC, data, RTC_NR_TIME);
  240. if (ret < 0) {
  241. dev_err(info->dev, "%s: fail to write alarm reg(%d)\n",
  242. __func__, ret);
  243. goto out;
  244. }
  245. ret = max77686_rtc_update(info, MAX77686_RTC_WRITE);
  246. out:
  247. return ret;
  248. }
  249. static int max77686_rtc_start_alarm(struct max77686_rtc_info *info)
  250. {
  251. u8 data[RTC_NR_TIME];
  252. int ret;
  253. struct rtc_time tm;
  254. if (!mutex_is_locked(&info->lock))
  255. dev_warn(info->dev, "%s: should have mutex locked\n", __func__);
  256. ret = max77686_rtc_update(info, MAX77686_RTC_READ);
  257. if (ret < 0)
  258. goto out;
  259. ret = regmap_bulk_read(info->max77686->rtc_regmap,
  260. MAX77686_ALARM1_SEC, data, RTC_NR_TIME);
  261. if (ret < 0) {
  262. dev_err(info->dev, "%s: fail to read alarm reg(%d)\n",
  263. __func__, ret);
  264. goto out;
  265. }
  266. max77686_rtc_data_to_tm(data, &tm, info->rtc_24hr_mode);
  267. data[RTC_SEC] |= (1 << ALARM_ENABLE_SHIFT);
  268. data[RTC_MIN] |= (1 << ALARM_ENABLE_SHIFT);
  269. data[RTC_HOUR] |= (1 << ALARM_ENABLE_SHIFT);
  270. data[RTC_WEEKDAY] &= ~ALARM_ENABLE_MASK;
  271. if (data[RTC_MONTH] & 0xf)
  272. data[RTC_MONTH] |= (1 << ALARM_ENABLE_SHIFT);
  273. if (data[RTC_YEAR] & 0x7f)
  274. data[RTC_YEAR] |= (1 << ALARM_ENABLE_SHIFT);
  275. if (data[RTC_DATE] & 0x1f)
  276. data[RTC_DATE] |= (1 << ALARM_ENABLE_SHIFT);
  277. ret = regmap_bulk_write(info->max77686->rtc_regmap,
  278. MAX77686_ALARM1_SEC, data, RTC_NR_TIME);
  279. if (ret < 0) {
  280. dev_err(info->dev, "%s: fail to write alarm reg(%d)\n",
  281. __func__, ret);
  282. goto out;
  283. }
  284. ret = max77686_rtc_update(info, MAX77686_RTC_WRITE);
  285. out:
  286. return ret;
  287. }
  288. static int max77686_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
  289. {
  290. struct max77686_rtc_info *info = dev_get_drvdata(dev);
  291. u8 data[RTC_NR_TIME];
  292. int ret;
  293. ret = max77686_rtc_tm_to_data(&alrm->time, data);
  294. if (ret < 0)
  295. return ret;
  296. mutex_lock(&info->lock);
  297. ret = max77686_rtc_stop_alarm(info);
  298. if (ret < 0)
  299. goto out;
  300. ret = regmap_bulk_write(info->max77686->rtc_regmap,
  301. MAX77686_ALARM1_SEC, data, RTC_NR_TIME);
  302. if (ret < 0) {
  303. dev_err(info->dev, "%s: fail to write alarm reg(%d)\n",
  304. __func__, ret);
  305. goto out;
  306. }
  307. ret = max77686_rtc_update(info, MAX77686_RTC_WRITE);
  308. if (ret < 0)
  309. goto out;
  310. if (alrm->enabled)
  311. ret = max77686_rtc_start_alarm(info);
  312. out:
  313. mutex_unlock(&info->lock);
  314. return ret;
  315. }
  316. static int max77686_rtc_alarm_irq_enable(struct device *dev,
  317. unsigned int enabled)
  318. {
  319. struct max77686_rtc_info *info = dev_get_drvdata(dev);
  320. int ret;
  321. mutex_lock(&info->lock);
  322. if (enabled)
  323. ret = max77686_rtc_start_alarm(info);
  324. else
  325. ret = max77686_rtc_stop_alarm(info);
  326. mutex_unlock(&info->lock);
  327. return ret;
  328. }
  329. static irqreturn_t max77686_rtc_alarm_irq(int irq, void *data)
  330. {
  331. struct max77686_rtc_info *info = data;
  332. dev_info(info->dev, "%s:irq(%d)\n", __func__, irq);
  333. rtc_update_irq(info->rtc_dev, 1, RTC_IRQF | RTC_AF);
  334. return IRQ_HANDLED;
  335. }
  336. static const struct rtc_class_ops max77686_rtc_ops = {
  337. .read_time = max77686_rtc_read_time,
  338. .set_time = max77686_rtc_set_time,
  339. .read_alarm = max77686_rtc_read_alarm,
  340. .set_alarm = max77686_rtc_set_alarm,
  341. .alarm_irq_enable = max77686_rtc_alarm_irq_enable,
  342. };
  343. #ifdef MAX77686_RTC_WTSR_SMPL
  344. static void max77686_rtc_enable_wtsr(struct max77686_rtc_info *info, bool enable)
  345. {
  346. int ret;
  347. unsigned int val, mask;
  348. if (enable)
  349. val = (1 << WTSR_EN_SHIFT) | (3 << WTSRT_SHIFT);
  350. else
  351. val = 0;
  352. mask = WTSR_EN_MASK | WTSRT_MASK;
  353. dev_info(info->dev, "%s: %s WTSR\n", __func__,
  354. enable ? "enable" : "disable");
  355. ret = regmap_update_bits(info->max77686->rtc_regmap,
  356. MAX77686_WTSR_SMPL_CNTL, mask, val);
  357. if (ret < 0) {
  358. dev_err(info->dev, "%s: fail to update WTSR reg(%d)\n",
  359. __func__, ret);
  360. return;
  361. }
  362. max77686_rtc_update(info, MAX77686_RTC_WRITE);
  363. }
  364. static void max77686_rtc_enable_smpl(struct max77686_rtc_info *info, bool enable)
  365. {
  366. int ret;
  367. unsigned int val, mask;
  368. if (enable)
  369. val = (1 << SMPL_EN_SHIFT) | (0 << SMPLT_SHIFT);
  370. else
  371. val = 0;
  372. mask = SMPL_EN_MASK | SMPLT_MASK;
  373. dev_info(info->dev, "%s: %s SMPL\n", __func__,
  374. enable ? "enable" : "disable");
  375. ret = regmap_update_bits(info->max77686->rtc_regmap,
  376. MAX77686_WTSR_SMPL_CNTL, mask, val);
  377. if (ret < 0) {
  378. dev_err(info->dev, "%s: fail to update SMPL reg(%d)\n",
  379. __func__, ret);
  380. return;
  381. }
  382. max77686_rtc_update(info, MAX77686_RTC_WRITE);
  383. val = 0;
  384. regmap_read(info->max77686->rtc_regmap, MAX77686_WTSR_SMPL_CNTL, &val);
  385. dev_info(info->dev, "%s: WTSR_SMPL(0x%02x)\n", __func__, val);
  386. }
  387. #endif /* MAX77686_RTC_WTSR_SMPL */
  388. static int max77686_rtc_init_reg(struct max77686_rtc_info *info)
  389. {
  390. u8 data[2];
  391. int ret;
  392. /* Set RTC control register : Binary mode, 24hour mdoe */
  393. data[0] = (1 << BCD_EN_SHIFT) | (1 << MODEL24_SHIFT);
  394. data[1] = (0 << BCD_EN_SHIFT) | (1 << MODEL24_SHIFT);
  395. info->rtc_24hr_mode = 1;
  396. ret = regmap_bulk_write(info->max77686->rtc_regmap, MAX77686_RTC_CONTROLM, data, 2);
  397. if (ret < 0) {
  398. dev_err(info->dev, "%s: fail to write controlm reg(%d)\n",
  399. __func__, ret);
  400. return ret;
  401. }
  402. ret = max77686_rtc_update(info, MAX77686_RTC_WRITE);
  403. return ret;
  404. }
  405. static struct regmap_config max77686_rtc_regmap_config = {
  406. .reg_bits = 8,
  407. .val_bits = 8,
  408. };
  409. static int max77686_rtc_probe(struct platform_device *pdev)
  410. {
  411. struct max77686_dev *max77686 = dev_get_drvdata(pdev->dev.parent);
  412. struct max77686_rtc_info *info;
  413. int ret, virq;
  414. dev_info(&pdev->dev, "%s\n", __func__);
  415. info = devm_kzalloc(&pdev->dev, sizeof(struct max77686_rtc_info),
  416. GFP_KERNEL);
  417. if (!info)
  418. return -ENOMEM;
  419. mutex_init(&info->lock);
  420. info->dev = &pdev->dev;
  421. info->max77686 = max77686;
  422. info->rtc = max77686->rtc;
  423. info->max77686->rtc_regmap = devm_regmap_init_i2c(info->max77686->rtc,
  424. &max77686_rtc_regmap_config);
  425. if (IS_ERR(info->max77686->rtc_regmap)) {
  426. ret = PTR_ERR(info->max77686->rtc_regmap);
  427. dev_err(info->max77686->dev, "Failed to allocate register map: %d\n",
  428. ret);
  429. return ret;
  430. }
  431. platform_set_drvdata(pdev, info);
  432. ret = max77686_rtc_init_reg(info);
  433. if (ret < 0) {
  434. dev_err(&pdev->dev, "Failed to initialize RTC reg:%d\n", ret);
  435. goto err_rtc;
  436. }
  437. #ifdef MAX77686_RTC_WTSR_SMPL
  438. max77686_rtc_enable_wtsr(info, true);
  439. max77686_rtc_enable_smpl(info, true);
  440. #endif
  441. device_init_wakeup(&pdev->dev, 1);
  442. info->rtc_dev = devm_rtc_device_register(&pdev->dev, "max77686-rtc",
  443. &max77686_rtc_ops, THIS_MODULE);
  444. if (IS_ERR(info->rtc_dev)) {
  445. dev_info(&pdev->dev, "%s: fail\n", __func__);
  446. ret = PTR_ERR(info->rtc_dev);
  447. dev_err(&pdev->dev, "Failed to register RTC device: %d\n", ret);
  448. if (ret == 0)
  449. ret = -EINVAL;
  450. goto err_rtc;
  451. }
  452. virq = irq_create_mapping(max77686->irq_domain, MAX77686_RTCIRQ_RTCA1);
  453. if (!virq) {
  454. ret = -ENXIO;
  455. goto err_rtc;
  456. }
  457. info->virq = virq;
  458. ret = devm_request_threaded_irq(&pdev->dev, virq, NULL,
  459. max77686_rtc_alarm_irq, 0, "rtc-alarm0", info);
  460. if (ret < 0)
  461. dev_err(&pdev->dev, "Failed to request alarm IRQ: %d: %d\n",
  462. info->virq, ret);
  463. err_rtc:
  464. return ret;
  465. }
  466. static int max77686_rtc_remove(struct platform_device *pdev)
  467. {
  468. return 0;
  469. }
  470. static void max77686_rtc_shutdown(struct platform_device *pdev)
  471. {
  472. #ifdef MAX77686_RTC_WTSR_SMPL
  473. struct max77686_rtc_info *info = platform_get_drvdata(pdev);
  474. int i;
  475. u8 val = 0;
  476. for (i = 0; i < 3; i++) {
  477. max77686_rtc_enable_wtsr(info, false);
  478. regmap_read(info->max77686->rtc_regmap, MAX77686_WTSR_SMPL_CNTL, &val);
  479. dev_info(info->dev, "%s: WTSR_SMPL reg(0x%02x)\n", __func__,
  480. val);
  481. if (val & WTSR_EN_MASK) {
  482. dev_emerg(info->dev, "%s: fail to disable WTSR\n",
  483. __func__);
  484. } else {
  485. dev_info(info->dev, "%s: success to disable WTSR\n",
  486. __func__);
  487. break;
  488. }
  489. }
  490. /* Disable SMPL when power off */
  491. max77686_rtc_enable_smpl(info, false);
  492. #endif /* MAX77686_RTC_WTSR_SMPL */
  493. }
  494. static const struct platform_device_id rtc_id[] = {
  495. { "max77686-rtc", 0 },
  496. {},
  497. };
  498. static struct platform_driver max77686_rtc_driver = {
  499. .driver = {
  500. .name = "max77686-rtc",
  501. .owner = THIS_MODULE,
  502. },
  503. .probe = max77686_rtc_probe,
  504. .remove = max77686_rtc_remove,
  505. .shutdown = max77686_rtc_shutdown,
  506. .id_table = rtc_id,
  507. };
  508. module_platform_driver(max77686_rtc_driver);
  509. MODULE_DESCRIPTION("Maxim MAX77686 RTC driver");
  510. MODULE_AUTHOR("Chiwoong Byun <woong.byun@samsung.com>");
  511. MODULE_LICENSE("GPL");