rtc-max8997.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553
  1. /*
  2. * RTC driver for Maxim MAX8997
  3. *
  4. * Copyright (C) 2013 Samsung Electronics Co.Ltd
  5. *
  6. * based on rtc-max8998.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/max8997-private.h>
  21. #include <linux/irqdomain.h>
  22. /* Module parameter for WTSR function control */
  23. static int wtsr_en = 1;
  24. module_param(wtsr_en, int, 0444);
  25. MODULE_PARM_DESC(wtsr_en, "Wachdog Timeout & Sofware Reset (default=on)");
  26. /* Module parameter for SMPL function control */
  27. static int smpl_en = 1;
  28. module_param(smpl_en, int, 0444);
  29. MODULE_PARM_DESC(smpl_en, "Sudden Momentary Power Loss (default=on)");
  30. /* RTC Control Register */
  31. #define BCD_EN_SHIFT 0
  32. #define BCD_EN_MASK (1 << BCD_EN_SHIFT)
  33. #define MODEL24_SHIFT 1
  34. #define MODEL24_MASK (1 << MODEL24_SHIFT)
  35. /* RTC Update Register1 */
  36. #define RTC_UDR_SHIFT 0
  37. #define RTC_UDR_MASK (1 << RTC_UDR_SHIFT)
  38. /* WTSR and SMPL Register */
  39. #define WTSRT_SHIFT 0
  40. #define SMPLT_SHIFT 2
  41. #define WTSR_EN_SHIFT 6
  42. #define SMPL_EN_SHIFT 7
  43. #define WTSRT_MASK (3 << WTSRT_SHIFT)
  44. #define SMPLT_MASK (3 << SMPLT_SHIFT)
  45. #define WTSR_EN_MASK (1 << WTSR_EN_SHIFT)
  46. #define SMPL_EN_MASK (1 << SMPL_EN_SHIFT)
  47. /* RTC Hour register */
  48. #define HOUR_PM_SHIFT 6
  49. #define HOUR_PM_MASK (1 << HOUR_PM_SHIFT)
  50. /* RTC Alarm Enable */
  51. #define ALARM_ENABLE_SHIFT 7
  52. #define ALARM_ENABLE_MASK (1 << ALARM_ENABLE_SHIFT)
  53. enum {
  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. struct max8997_rtc_info {
  64. struct device *dev;
  65. struct max8997_dev *max8997;
  66. struct i2c_client *rtc;
  67. struct rtc_device *rtc_dev;
  68. struct mutex lock;
  69. int virq;
  70. int rtc_24hr_mode;
  71. };
  72. static void max8997_rtc_data_to_tm(u8 *data, struct rtc_time *tm,
  73. int rtc_24hr_mode)
  74. {
  75. tm->tm_sec = data[RTC_SEC] & 0x7f;
  76. tm->tm_min = data[RTC_MIN] & 0x7f;
  77. if (rtc_24hr_mode)
  78. tm->tm_hour = data[RTC_HOUR] & 0x1f;
  79. else {
  80. tm->tm_hour = data[RTC_HOUR] & 0x0f;
  81. if (data[RTC_HOUR] & HOUR_PM_MASK)
  82. tm->tm_hour += 12;
  83. }
  84. tm->tm_wday = fls(data[RTC_WEEKDAY] & 0x7f) - 1;
  85. tm->tm_mday = data[RTC_DATE] & 0x1f;
  86. tm->tm_mon = (data[RTC_MONTH] & 0x0f) - 1;
  87. tm->tm_year = (data[RTC_YEAR] & 0x7f) + 100;
  88. tm->tm_yday = 0;
  89. tm->tm_isdst = 0;
  90. }
  91. static int max8997_rtc_tm_to_data(struct rtc_time *tm, u8 *data)
  92. {
  93. data[RTC_SEC] = tm->tm_sec;
  94. data[RTC_MIN] = tm->tm_min;
  95. data[RTC_HOUR] = tm->tm_hour;
  96. data[RTC_WEEKDAY] = 1 << tm->tm_wday;
  97. data[RTC_DATE] = tm->tm_mday;
  98. data[RTC_MONTH] = tm->tm_mon + 1;
  99. data[RTC_YEAR] = tm->tm_year > 100 ? (tm->tm_year - 100) : 0 ;
  100. if (tm->tm_year < 100) {
  101. pr_warn("%s: MAX8997 RTC cannot handle the year %d."
  102. "Assume it's 2000.\n", __func__, 1900 + tm->tm_year);
  103. return -EINVAL;
  104. }
  105. return 0;
  106. }
  107. static inline int max8997_rtc_set_update_reg(struct max8997_rtc_info *info)
  108. {
  109. int ret;
  110. ret = max8997_write_reg(info->rtc, MAX8997_RTC_UPDATE1,
  111. RTC_UDR_MASK);
  112. if (ret < 0)
  113. dev_err(info->dev, "%s: fail to write update reg(%d)\n",
  114. __func__, ret);
  115. else {
  116. /* Minimum 16ms delay required before RTC update.
  117. * Otherwise, we may read and update based on out-of-date
  118. * value */
  119. msleep(20);
  120. }
  121. return ret;
  122. }
  123. static int max8997_rtc_read_time(struct device *dev, struct rtc_time *tm)
  124. {
  125. struct max8997_rtc_info *info = dev_get_drvdata(dev);
  126. u8 data[RTC_NR_TIME];
  127. int ret;
  128. mutex_lock(&info->lock);
  129. ret = max8997_bulk_read(info->rtc, MAX8997_RTC_SEC, RTC_NR_TIME, data);
  130. mutex_unlock(&info->lock);
  131. if (ret < 0) {
  132. dev_err(info->dev, "%s: fail to read time reg(%d)\n", __func__,
  133. ret);
  134. return ret;
  135. }
  136. max8997_rtc_data_to_tm(data, tm, info->rtc_24hr_mode);
  137. return rtc_valid_tm(tm);
  138. }
  139. static int max8997_rtc_set_time(struct device *dev, struct rtc_time *tm)
  140. {
  141. struct max8997_rtc_info *info = dev_get_drvdata(dev);
  142. u8 data[RTC_NR_TIME];
  143. int ret;
  144. ret = max8997_rtc_tm_to_data(tm, data);
  145. if (ret < 0)
  146. return ret;
  147. mutex_lock(&info->lock);
  148. ret = max8997_bulk_write(info->rtc, MAX8997_RTC_SEC, RTC_NR_TIME, data);
  149. if (ret < 0) {
  150. dev_err(info->dev, "%s: fail to write time reg(%d)\n", __func__,
  151. ret);
  152. goto out;
  153. }
  154. ret = max8997_rtc_set_update_reg(info);
  155. out:
  156. mutex_unlock(&info->lock);
  157. return ret;
  158. }
  159. static int max8997_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
  160. {
  161. struct max8997_rtc_info *info = dev_get_drvdata(dev);
  162. u8 data[RTC_NR_TIME];
  163. u8 val;
  164. int i, ret;
  165. mutex_lock(&info->lock);
  166. ret = max8997_bulk_read(info->rtc, MAX8997_RTC_ALARM1_SEC, RTC_NR_TIME,
  167. data);
  168. if (ret < 0) {
  169. dev_err(info->dev, "%s:%d fail to read alarm reg(%d)\n",
  170. __func__, __LINE__, ret);
  171. goto out;
  172. }
  173. max8997_rtc_data_to_tm(data, &alrm->time, info->rtc_24hr_mode);
  174. alrm->enabled = 0;
  175. for (i = 0; i < RTC_NR_TIME; i++) {
  176. if (data[i] & ALARM_ENABLE_MASK) {
  177. alrm->enabled = 1;
  178. break;
  179. }
  180. }
  181. alrm->pending = 0;
  182. ret = max8997_read_reg(info->max8997->i2c, MAX8997_REG_STATUS1, &val);
  183. if (ret < 0) {
  184. dev_err(info->dev, "%s:%d fail to read status1 reg(%d)\n",
  185. __func__, __LINE__, ret);
  186. goto out;
  187. }
  188. if (val & (1 << 4)) /* RTCA1 */
  189. alrm->pending = 1;
  190. out:
  191. mutex_unlock(&info->lock);
  192. return 0;
  193. }
  194. static int max8997_rtc_stop_alarm(struct max8997_rtc_info *info)
  195. {
  196. u8 data[RTC_NR_TIME];
  197. int ret, i;
  198. if (!mutex_is_locked(&info->lock))
  199. dev_warn(info->dev, "%s: should have mutex locked\n", __func__);
  200. ret = max8997_bulk_read(info->rtc, MAX8997_RTC_ALARM1_SEC, RTC_NR_TIME,
  201. data);
  202. if (ret < 0) {
  203. dev_err(info->dev, "%s: fail to read alarm reg(%d)\n",
  204. __func__, ret);
  205. goto out;
  206. }
  207. for (i = 0; i < RTC_NR_TIME; i++)
  208. data[i] &= ~ALARM_ENABLE_MASK;
  209. ret = max8997_bulk_write(info->rtc, MAX8997_RTC_ALARM1_SEC, RTC_NR_TIME,
  210. data);
  211. if (ret < 0) {
  212. dev_err(info->dev, "%s: fail to write alarm reg(%d)\n",
  213. __func__, ret);
  214. goto out;
  215. }
  216. ret = max8997_rtc_set_update_reg(info);
  217. out:
  218. return ret;
  219. }
  220. static int max8997_rtc_start_alarm(struct max8997_rtc_info *info)
  221. {
  222. u8 data[RTC_NR_TIME];
  223. int ret;
  224. if (!mutex_is_locked(&info->lock))
  225. dev_warn(info->dev, "%s: should have mutex locked\n", __func__);
  226. ret = max8997_bulk_read(info->rtc, MAX8997_RTC_ALARM1_SEC, RTC_NR_TIME,
  227. data);
  228. if (ret < 0) {
  229. dev_err(info->dev, "%s: fail to read alarm reg(%d)\n",
  230. __func__, ret);
  231. goto out;
  232. }
  233. data[RTC_SEC] |= (1 << ALARM_ENABLE_SHIFT);
  234. data[RTC_MIN] |= (1 << ALARM_ENABLE_SHIFT);
  235. data[RTC_HOUR] |= (1 << ALARM_ENABLE_SHIFT);
  236. data[RTC_WEEKDAY] &= ~ALARM_ENABLE_MASK;
  237. if (data[RTC_MONTH] & 0xf)
  238. data[RTC_MONTH] |= (1 << ALARM_ENABLE_SHIFT);
  239. if (data[RTC_YEAR] & 0x7f)
  240. data[RTC_YEAR] |= (1 << ALARM_ENABLE_SHIFT);
  241. if (data[RTC_DATE] & 0x1f)
  242. data[RTC_DATE] |= (1 << ALARM_ENABLE_SHIFT);
  243. ret = max8997_bulk_write(info->rtc, MAX8997_RTC_ALARM1_SEC, RTC_NR_TIME,
  244. data);
  245. if (ret < 0) {
  246. dev_err(info->dev, "%s: fail to write alarm reg(%d)\n",
  247. __func__, ret);
  248. goto out;
  249. }
  250. ret = max8997_rtc_set_update_reg(info);
  251. out:
  252. return ret;
  253. }
  254. static int max8997_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
  255. {
  256. struct max8997_rtc_info *info = dev_get_drvdata(dev);
  257. u8 data[RTC_NR_TIME];
  258. int ret;
  259. ret = max8997_rtc_tm_to_data(&alrm->time, data);
  260. if (ret < 0)
  261. return ret;
  262. dev_info(info->dev, "%s: %d-%02d-%02d %02d:%02d:%02d\n", __func__,
  263. data[RTC_YEAR] + 2000, data[RTC_MONTH], data[RTC_DATE],
  264. data[RTC_HOUR], data[RTC_MIN], data[RTC_SEC]);
  265. mutex_lock(&info->lock);
  266. ret = max8997_rtc_stop_alarm(info);
  267. if (ret < 0)
  268. goto out;
  269. ret = max8997_bulk_write(info->rtc, MAX8997_RTC_ALARM1_SEC, RTC_NR_TIME,
  270. data);
  271. if (ret < 0) {
  272. dev_err(info->dev, "%s: fail to write alarm reg(%d)\n",
  273. __func__, ret);
  274. goto out;
  275. }
  276. ret = max8997_rtc_set_update_reg(info);
  277. if (ret < 0)
  278. goto out;
  279. if (alrm->enabled)
  280. ret = max8997_rtc_start_alarm(info);
  281. out:
  282. mutex_unlock(&info->lock);
  283. return ret;
  284. }
  285. static int max8997_rtc_alarm_irq_enable(struct device *dev,
  286. unsigned int enabled)
  287. {
  288. struct max8997_rtc_info *info = dev_get_drvdata(dev);
  289. int ret;
  290. mutex_lock(&info->lock);
  291. if (enabled)
  292. ret = max8997_rtc_start_alarm(info);
  293. else
  294. ret = max8997_rtc_stop_alarm(info);
  295. mutex_unlock(&info->lock);
  296. return ret;
  297. }
  298. static irqreturn_t max8997_rtc_alarm_irq(int irq, void *data)
  299. {
  300. struct max8997_rtc_info *info = data;
  301. dev_info(info->dev, "%s:irq(%d)\n", __func__, irq);
  302. rtc_update_irq(info->rtc_dev, 1, RTC_IRQF | RTC_AF);
  303. return IRQ_HANDLED;
  304. }
  305. static const struct rtc_class_ops max8997_rtc_ops = {
  306. .read_time = max8997_rtc_read_time,
  307. .set_time = max8997_rtc_set_time,
  308. .read_alarm = max8997_rtc_read_alarm,
  309. .set_alarm = max8997_rtc_set_alarm,
  310. .alarm_irq_enable = max8997_rtc_alarm_irq_enable,
  311. };
  312. static void max8997_rtc_enable_wtsr(struct max8997_rtc_info *info, bool enable)
  313. {
  314. int ret;
  315. u8 val, mask;
  316. if (!wtsr_en)
  317. return;
  318. if (enable)
  319. val = (1 << WTSR_EN_SHIFT) | (3 << WTSRT_SHIFT);
  320. else
  321. val = 0;
  322. mask = WTSR_EN_MASK | WTSRT_MASK;
  323. dev_info(info->dev, "%s: %s WTSR\n", __func__,
  324. enable ? "enable" : "disable");
  325. ret = max8997_update_reg(info->rtc, MAX8997_RTC_WTSR_SMPL, val, mask);
  326. if (ret < 0) {
  327. dev_err(info->dev, "%s: fail to update WTSR reg(%d)\n",
  328. __func__, ret);
  329. return;
  330. }
  331. max8997_rtc_set_update_reg(info);
  332. }
  333. static void max8997_rtc_enable_smpl(struct max8997_rtc_info *info, bool enable)
  334. {
  335. int ret;
  336. u8 val, mask;
  337. if (!smpl_en)
  338. return;
  339. if (enable)
  340. val = (1 << SMPL_EN_SHIFT) | (0 << SMPLT_SHIFT);
  341. else
  342. val = 0;
  343. mask = SMPL_EN_MASK | SMPLT_MASK;
  344. dev_info(info->dev, "%s: %s SMPL\n", __func__,
  345. enable ? "enable" : "disable");
  346. ret = max8997_update_reg(info->rtc, MAX8997_RTC_WTSR_SMPL, val, mask);
  347. if (ret < 0) {
  348. dev_err(info->dev, "%s: fail to update SMPL reg(%d)\n",
  349. __func__, ret);
  350. return;
  351. }
  352. max8997_rtc_set_update_reg(info);
  353. val = 0;
  354. max8997_read_reg(info->rtc, MAX8997_RTC_WTSR_SMPL, &val);
  355. pr_info("%s: WTSR_SMPL(0x%02x)\n", __func__, val);
  356. }
  357. static int max8997_rtc_init_reg(struct max8997_rtc_info *info)
  358. {
  359. u8 data[2];
  360. int ret;
  361. /* Set RTC control register : Binary mode, 24hour mdoe */
  362. data[0] = (1 << BCD_EN_SHIFT) | (1 << MODEL24_SHIFT);
  363. data[1] = (0 << BCD_EN_SHIFT) | (1 << MODEL24_SHIFT);
  364. info->rtc_24hr_mode = 1;
  365. ret = max8997_bulk_write(info->rtc, MAX8997_RTC_CTRLMASK, 2, data);
  366. if (ret < 0) {
  367. dev_err(info->dev, "%s: fail to write controlm reg(%d)\n",
  368. __func__, ret);
  369. return ret;
  370. }
  371. ret = max8997_rtc_set_update_reg(info);
  372. return ret;
  373. }
  374. static int max8997_rtc_probe(struct platform_device *pdev)
  375. {
  376. struct max8997_dev *max8997 = dev_get_drvdata(pdev->dev.parent);
  377. struct max8997_rtc_info *info;
  378. int ret, virq;
  379. info = devm_kzalloc(&pdev->dev, sizeof(struct max8997_rtc_info),
  380. GFP_KERNEL);
  381. if (!info)
  382. return -ENOMEM;
  383. mutex_init(&info->lock);
  384. info->dev = &pdev->dev;
  385. info->max8997 = max8997;
  386. info->rtc = max8997->rtc;
  387. platform_set_drvdata(pdev, info);
  388. ret = max8997_rtc_init_reg(info);
  389. if (ret < 0) {
  390. dev_err(&pdev->dev, "Failed to initialize RTC reg:%d\n", ret);
  391. return ret;
  392. }
  393. max8997_rtc_enable_wtsr(info, true);
  394. max8997_rtc_enable_smpl(info, true);
  395. device_init_wakeup(&pdev->dev, 1);
  396. info->rtc_dev = rtc_device_register("max8997-rtc", &pdev->dev,
  397. &max8997_rtc_ops, THIS_MODULE);
  398. if (IS_ERR(info->rtc_dev)) {
  399. ret = PTR_ERR(info->rtc_dev);
  400. dev_err(&pdev->dev, "Failed to register RTC device: %d\n", ret);
  401. return ret;
  402. }
  403. virq = irq_create_mapping(max8997->irq_domain, MAX8997_PMICIRQ_RTCA1);
  404. if (!virq) {
  405. dev_err(&pdev->dev, "Failed to create mapping alarm IRQ\n");
  406. goto err_out;
  407. }
  408. info->virq = virq;
  409. ret = request_threaded_irq(virq, NULL, max8997_rtc_alarm_irq, 0,
  410. "rtc-alarm0", info);
  411. if (ret < 0) {
  412. dev_err(&pdev->dev, "Failed to request alarm IRQ: %d: %d\n",
  413. info->virq, ret);
  414. goto err_out;
  415. }
  416. return ret;
  417. err_out:
  418. rtc_device_unregister(info->rtc_dev);
  419. return ret;
  420. }
  421. static int max8997_rtc_remove(struct platform_device *pdev)
  422. {
  423. struct max8997_rtc_info *info = platform_get_drvdata(pdev);
  424. if (info) {
  425. free_irq(info->virq, info);
  426. rtc_device_unregister(info->rtc_dev);
  427. }
  428. return 0;
  429. }
  430. static void max8997_rtc_shutdown(struct platform_device *pdev)
  431. {
  432. struct max8997_rtc_info *info = platform_get_drvdata(pdev);
  433. max8997_rtc_enable_wtsr(info, false);
  434. max8997_rtc_enable_smpl(info, false);
  435. }
  436. static const struct platform_device_id rtc_id[] = {
  437. { "max8997-rtc", 0 },
  438. {},
  439. };
  440. static struct platform_driver max8997_rtc_driver = {
  441. .driver = {
  442. .name = "max8997-rtc",
  443. .owner = THIS_MODULE,
  444. },
  445. .probe = max8997_rtc_probe,
  446. .remove = max8997_rtc_remove,
  447. .shutdown = max8997_rtc_shutdown,
  448. .id_table = rtc_id,
  449. };
  450. module_platform_driver(max8997_rtc_driver);
  451. MODULE_DESCRIPTION("Maxim MAX8997 RTC driver");
  452. MODULE_AUTHOR("<ms925.kim@samsung.com>");
  453. MODULE_LICENSE("GPL");