rtc-max77686.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532
  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. /* RTC Hour register */
  34. #define HOUR_PM_SHIFT 6
  35. #define HOUR_PM_MASK (1 << HOUR_PM_SHIFT)
  36. /* RTC Alarm Enable */
  37. #define ALARM_ENABLE_SHIFT 7
  38. #define ALARM_ENABLE_MASK (1 << ALARM_ENABLE_SHIFT)
  39. #define MAX77686_RTC_UPDATE_DELAY 16
  40. enum {
  41. RTC_SEC = 0,
  42. RTC_MIN,
  43. RTC_HOUR,
  44. RTC_WEEKDAY,
  45. RTC_MONTH,
  46. RTC_YEAR,
  47. RTC_DATE,
  48. RTC_NR_TIME
  49. };
  50. struct max77686_rtc_info {
  51. struct device *dev;
  52. struct max77686_dev *max77686;
  53. struct i2c_client *rtc;
  54. struct rtc_device *rtc_dev;
  55. struct mutex lock;
  56. struct regmap *regmap;
  57. int virq;
  58. int rtc_24hr_mode;
  59. };
  60. enum MAX77686_RTC_OP {
  61. MAX77686_RTC_WRITE,
  62. MAX77686_RTC_READ,
  63. };
  64. static inline int max77686_rtc_calculate_wday(u8 shifted)
  65. {
  66. int counter = -1;
  67. while (shifted) {
  68. shifted >>= 1;
  69. counter++;
  70. }
  71. return counter;
  72. }
  73. static void max77686_rtc_data_to_tm(u8 *data, struct rtc_time *tm,
  74. int rtc_24hr_mode)
  75. {
  76. tm->tm_sec = data[RTC_SEC] & 0x7f;
  77. tm->tm_min = data[RTC_MIN] & 0x7f;
  78. if (rtc_24hr_mode)
  79. tm->tm_hour = data[RTC_HOUR] & 0x1f;
  80. else {
  81. tm->tm_hour = data[RTC_HOUR] & 0x0f;
  82. if (data[RTC_HOUR] & HOUR_PM_MASK)
  83. tm->tm_hour += 12;
  84. }
  85. tm->tm_wday = max77686_rtc_calculate_wday(data[RTC_WEEKDAY] & 0x7f);
  86. tm->tm_mday = data[RTC_DATE] & 0x1f;
  87. tm->tm_mon = (data[RTC_MONTH] & 0x0f) - 1;
  88. tm->tm_year = (data[RTC_YEAR] & 0x7f) + 100;
  89. tm->tm_yday = 0;
  90. tm->tm_isdst = 0;
  91. }
  92. static int max77686_rtc_tm_to_data(struct rtc_time *tm, u8 *data)
  93. {
  94. data[RTC_SEC] = tm->tm_sec;
  95. data[RTC_MIN] = tm->tm_min;
  96. data[RTC_HOUR] = tm->tm_hour;
  97. data[RTC_WEEKDAY] = 1 << tm->tm_wday;
  98. data[RTC_DATE] = tm->tm_mday;
  99. data[RTC_MONTH] = tm->tm_mon + 1;
  100. data[RTC_YEAR] = tm->tm_year > 100 ? (tm->tm_year - 100) : 0;
  101. if (tm->tm_year < 100) {
  102. pr_warn("%s: MAX77686 RTC cannot handle the year %d."
  103. "Assume it's 2000.\n", __func__, 1900 + tm->tm_year);
  104. return -EINVAL;
  105. }
  106. return 0;
  107. }
  108. static int max77686_rtc_update(struct max77686_rtc_info *info,
  109. enum MAX77686_RTC_OP op)
  110. {
  111. int ret;
  112. unsigned int data;
  113. if (op == MAX77686_RTC_WRITE)
  114. data = 1 << RTC_UDR_SHIFT;
  115. else
  116. data = 1 << RTC_RBUDR_SHIFT;
  117. ret = regmap_update_bits(info->max77686->rtc_regmap,
  118. MAX77686_RTC_UPDATE0, data, data);
  119. if (ret < 0)
  120. dev_err(info->dev, "%s: fail to write update reg(ret=%d, data=0x%x)\n",
  121. __func__, ret, data);
  122. else {
  123. /* Minimum 16ms delay required before RTC update. */
  124. msleep(MAX77686_RTC_UPDATE_DELAY);
  125. }
  126. return ret;
  127. }
  128. static int max77686_rtc_read_time(struct device *dev, struct rtc_time *tm)
  129. {
  130. struct max77686_rtc_info *info = dev_get_drvdata(dev);
  131. u8 data[RTC_NR_TIME];
  132. int ret;
  133. mutex_lock(&info->lock);
  134. ret = max77686_rtc_update(info, MAX77686_RTC_READ);
  135. if (ret < 0)
  136. goto out;
  137. ret = regmap_bulk_read(info->max77686->rtc_regmap,
  138. MAX77686_RTC_SEC, data, RTC_NR_TIME);
  139. if (ret < 0) {
  140. dev_err(info->dev, "%s: fail to read time reg(%d)\n", __func__, ret);
  141. goto out;
  142. }
  143. max77686_rtc_data_to_tm(data, tm, info->rtc_24hr_mode);
  144. ret = rtc_valid_tm(tm);
  145. out:
  146. mutex_unlock(&info->lock);
  147. return ret;
  148. }
  149. static int max77686_rtc_set_time(struct device *dev, struct rtc_time *tm)
  150. {
  151. struct max77686_rtc_info *info = dev_get_drvdata(dev);
  152. u8 data[RTC_NR_TIME];
  153. int ret;
  154. ret = max77686_rtc_tm_to_data(tm, data);
  155. if (ret < 0)
  156. return ret;
  157. mutex_lock(&info->lock);
  158. ret = regmap_bulk_write(info->max77686->rtc_regmap,
  159. MAX77686_RTC_SEC, data, RTC_NR_TIME);
  160. if (ret < 0) {
  161. dev_err(info->dev, "%s: fail to write time reg(%d)\n", __func__,
  162. ret);
  163. goto out;
  164. }
  165. ret = max77686_rtc_update(info, MAX77686_RTC_WRITE);
  166. out:
  167. mutex_unlock(&info->lock);
  168. return ret;
  169. }
  170. static int max77686_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
  171. {
  172. struct max77686_rtc_info *info = dev_get_drvdata(dev);
  173. u8 data[RTC_NR_TIME];
  174. unsigned int val;
  175. int i, ret;
  176. mutex_lock(&info->lock);
  177. ret = max77686_rtc_update(info, MAX77686_RTC_READ);
  178. if (ret < 0)
  179. goto out;
  180. ret = regmap_bulk_read(info->max77686->rtc_regmap,
  181. MAX77686_ALARM1_SEC, data, RTC_NR_TIME);
  182. if (ret < 0) {
  183. dev_err(info->dev, "%s:%d fail to read alarm reg(%d)\n",
  184. __func__, __LINE__, ret);
  185. goto out;
  186. }
  187. max77686_rtc_data_to_tm(data, &alrm->time, info->rtc_24hr_mode);
  188. alrm->enabled = 0;
  189. for (i = 0; i < RTC_NR_TIME; i++) {
  190. if (data[i] & ALARM_ENABLE_MASK) {
  191. alrm->enabled = 1;
  192. break;
  193. }
  194. }
  195. alrm->pending = 0;
  196. ret = regmap_read(info->max77686->regmap, MAX77686_REG_STATUS2, &val);
  197. if (ret < 0) {
  198. dev_err(info->dev, "%s:%d fail to read status2 reg(%d)\n",
  199. __func__, __LINE__, ret);
  200. goto out;
  201. }
  202. if (val & (1 << 4)) /* RTCA1 */
  203. alrm->pending = 1;
  204. out:
  205. mutex_unlock(&info->lock);
  206. return 0;
  207. }
  208. static int max77686_rtc_stop_alarm(struct max77686_rtc_info *info)
  209. {
  210. u8 data[RTC_NR_TIME];
  211. int ret, i;
  212. struct rtc_time tm;
  213. if (!mutex_is_locked(&info->lock))
  214. dev_warn(info->dev, "%s: should have mutex locked\n", __func__);
  215. ret = max77686_rtc_update(info, MAX77686_RTC_READ);
  216. if (ret < 0)
  217. goto out;
  218. ret = regmap_bulk_read(info->max77686->rtc_regmap,
  219. MAX77686_ALARM1_SEC, data, RTC_NR_TIME);
  220. if (ret < 0) {
  221. dev_err(info->dev, "%s: fail to read alarm reg(%d)\n",
  222. __func__, ret);
  223. goto out;
  224. }
  225. max77686_rtc_data_to_tm(data, &tm, info->rtc_24hr_mode);
  226. for (i = 0; i < RTC_NR_TIME; i++)
  227. data[i] &= ~ALARM_ENABLE_MASK;
  228. ret = regmap_bulk_write(info->max77686->rtc_regmap,
  229. MAX77686_ALARM1_SEC, data, RTC_NR_TIME);
  230. if (ret < 0) {
  231. dev_err(info->dev, "%s: fail to write alarm reg(%d)\n",
  232. __func__, ret);
  233. goto out;
  234. }
  235. ret = max77686_rtc_update(info, MAX77686_RTC_WRITE);
  236. out:
  237. return ret;
  238. }
  239. static int max77686_rtc_start_alarm(struct max77686_rtc_info *info)
  240. {
  241. u8 data[RTC_NR_TIME];
  242. int ret;
  243. struct rtc_time tm;
  244. if (!mutex_is_locked(&info->lock))
  245. dev_warn(info->dev, "%s: should have mutex locked\n", __func__);
  246. ret = max77686_rtc_update(info, MAX77686_RTC_READ);
  247. if (ret < 0)
  248. goto out;
  249. ret = regmap_bulk_read(info->max77686->rtc_regmap,
  250. MAX77686_ALARM1_SEC, data, RTC_NR_TIME);
  251. if (ret < 0) {
  252. dev_err(info->dev, "%s: fail to read alarm reg(%d)\n",
  253. __func__, ret);
  254. goto out;
  255. }
  256. max77686_rtc_data_to_tm(data, &tm, info->rtc_24hr_mode);
  257. data[RTC_SEC] |= (1 << ALARM_ENABLE_SHIFT);
  258. data[RTC_MIN] |= (1 << ALARM_ENABLE_SHIFT);
  259. data[RTC_HOUR] |= (1 << ALARM_ENABLE_SHIFT);
  260. data[RTC_WEEKDAY] &= ~ALARM_ENABLE_MASK;
  261. if (data[RTC_MONTH] & 0xf)
  262. data[RTC_MONTH] |= (1 << ALARM_ENABLE_SHIFT);
  263. if (data[RTC_YEAR] & 0x7f)
  264. data[RTC_YEAR] |= (1 << ALARM_ENABLE_SHIFT);
  265. if (data[RTC_DATE] & 0x1f)
  266. data[RTC_DATE] |= (1 << ALARM_ENABLE_SHIFT);
  267. ret = regmap_bulk_write(info->max77686->rtc_regmap,
  268. MAX77686_ALARM1_SEC, data, RTC_NR_TIME);
  269. if (ret < 0) {
  270. dev_err(info->dev, "%s: fail to write alarm reg(%d)\n",
  271. __func__, ret);
  272. goto out;
  273. }
  274. ret = max77686_rtc_update(info, MAX77686_RTC_WRITE);
  275. out:
  276. return ret;
  277. }
  278. static int max77686_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
  279. {
  280. struct max77686_rtc_info *info = dev_get_drvdata(dev);
  281. u8 data[RTC_NR_TIME];
  282. int ret;
  283. ret = max77686_rtc_tm_to_data(&alrm->time, data);
  284. if (ret < 0)
  285. return ret;
  286. mutex_lock(&info->lock);
  287. ret = max77686_rtc_stop_alarm(info);
  288. if (ret < 0)
  289. goto out;
  290. ret = regmap_bulk_write(info->max77686->rtc_regmap,
  291. MAX77686_ALARM1_SEC, data, RTC_NR_TIME);
  292. if (ret < 0) {
  293. dev_err(info->dev, "%s: fail to write alarm reg(%d)\n",
  294. __func__, ret);
  295. goto out;
  296. }
  297. ret = max77686_rtc_update(info, MAX77686_RTC_WRITE);
  298. if (ret < 0)
  299. goto out;
  300. if (alrm->enabled)
  301. ret = max77686_rtc_start_alarm(info);
  302. out:
  303. mutex_unlock(&info->lock);
  304. return ret;
  305. }
  306. static int max77686_rtc_alarm_irq_enable(struct device *dev,
  307. unsigned int enabled)
  308. {
  309. struct max77686_rtc_info *info = dev_get_drvdata(dev);
  310. int ret;
  311. mutex_lock(&info->lock);
  312. if (enabled)
  313. ret = max77686_rtc_start_alarm(info);
  314. else
  315. ret = max77686_rtc_stop_alarm(info);
  316. mutex_unlock(&info->lock);
  317. return ret;
  318. }
  319. static irqreturn_t max77686_rtc_alarm_irq(int irq, void *data)
  320. {
  321. struct max77686_rtc_info *info = data;
  322. dev_info(info->dev, "%s:irq(%d)\n", __func__, irq);
  323. rtc_update_irq(info->rtc_dev, 1, RTC_IRQF | RTC_AF);
  324. return IRQ_HANDLED;
  325. }
  326. static const struct rtc_class_ops max77686_rtc_ops = {
  327. .read_time = max77686_rtc_read_time,
  328. .set_time = max77686_rtc_set_time,
  329. .read_alarm = max77686_rtc_read_alarm,
  330. .set_alarm = max77686_rtc_set_alarm,
  331. .alarm_irq_enable = max77686_rtc_alarm_irq_enable,
  332. };
  333. static int max77686_rtc_init_reg(struct max77686_rtc_info *info)
  334. {
  335. u8 data[2];
  336. int ret;
  337. /* Set RTC control register : Binary mode, 24hour mdoe */
  338. data[0] = (1 << BCD_EN_SHIFT) | (1 << MODEL24_SHIFT);
  339. data[1] = (0 << BCD_EN_SHIFT) | (1 << MODEL24_SHIFT);
  340. info->rtc_24hr_mode = 1;
  341. ret = regmap_bulk_write(info->max77686->rtc_regmap, MAX77686_RTC_CONTROLM, data, 2);
  342. if (ret < 0) {
  343. dev_err(info->dev, "%s: fail to write controlm reg(%d)\n",
  344. __func__, ret);
  345. return ret;
  346. }
  347. ret = max77686_rtc_update(info, MAX77686_RTC_WRITE);
  348. return ret;
  349. }
  350. static int max77686_rtc_probe(struct platform_device *pdev)
  351. {
  352. struct max77686_dev *max77686 = dev_get_drvdata(pdev->dev.parent);
  353. struct max77686_rtc_info *info;
  354. int ret;
  355. dev_info(&pdev->dev, "%s\n", __func__);
  356. info = devm_kzalloc(&pdev->dev, sizeof(struct max77686_rtc_info),
  357. GFP_KERNEL);
  358. if (!info)
  359. return -ENOMEM;
  360. mutex_init(&info->lock);
  361. info->dev = &pdev->dev;
  362. info->max77686 = max77686;
  363. info->rtc = max77686->rtc;
  364. platform_set_drvdata(pdev, info);
  365. ret = max77686_rtc_init_reg(info);
  366. if (ret < 0) {
  367. dev_err(&pdev->dev, "Failed to initialize RTC reg:%d\n", ret);
  368. goto err_rtc;
  369. }
  370. device_init_wakeup(&pdev->dev, 1);
  371. info->rtc_dev = devm_rtc_device_register(&pdev->dev, "max77686-rtc",
  372. &max77686_rtc_ops, THIS_MODULE);
  373. if (IS_ERR(info->rtc_dev)) {
  374. dev_info(&pdev->dev, "%s: fail\n", __func__);
  375. ret = PTR_ERR(info->rtc_dev);
  376. dev_err(&pdev->dev, "Failed to register RTC device: %d\n", ret);
  377. if (ret == 0)
  378. ret = -EINVAL;
  379. goto err_rtc;
  380. }
  381. info->virq = regmap_irq_get_virq(max77686->rtc_irq_data,
  382. MAX77686_RTCIRQ_RTCA1);
  383. if (!info->virq) {
  384. ret = -ENXIO;
  385. goto err_rtc;
  386. }
  387. ret = devm_request_threaded_irq(&pdev->dev, info->virq, NULL,
  388. max77686_rtc_alarm_irq, 0, "rtc-alarm1", info);
  389. if (ret < 0)
  390. dev_err(&pdev->dev, "Failed to request alarm IRQ: %d: %d\n",
  391. info->virq, ret);
  392. err_rtc:
  393. return ret;
  394. }
  395. #ifdef CONFIG_PM_SLEEP
  396. static int max77686_rtc_suspend(struct device *dev)
  397. {
  398. if (device_may_wakeup(dev)) {
  399. struct max77686_rtc_info *info = dev_get_drvdata(dev);
  400. return enable_irq_wake(info->virq);
  401. }
  402. return 0;
  403. }
  404. static int max77686_rtc_resume(struct device *dev)
  405. {
  406. if (device_may_wakeup(dev)) {
  407. struct max77686_rtc_info *info = dev_get_drvdata(dev);
  408. return disable_irq_wake(info->virq);
  409. }
  410. return 0;
  411. }
  412. #endif
  413. static SIMPLE_DEV_PM_OPS(max77686_rtc_pm_ops,
  414. max77686_rtc_suspend, max77686_rtc_resume);
  415. static const struct platform_device_id rtc_id[] = {
  416. { "max77686-rtc", 0 },
  417. {},
  418. };
  419. static struct platform_driver max77686_rtc_driver = {
  420. .driver = {
  421. .name = "max77686-rtc",
  422. .owner = THIS_MODULE,
  423. .pm = &max77686_rtc_pm_ops,
  424. },
  425. .probe = max77686_rtc_probe,
  426. .id_table = rtc_id,
  427. };
  428. module_platform_driver(max77686_rtc_driver);
  429. MODULE_DESCRIPTION("Maxim MAX77686 RTC driver");
  430. MODULE_AUTHOR("Chiwoong Byun <woong.byun@samsung.com>");
  431. MODULE_LICENSE("GPL");