rtc-s5m.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912
  1. /*
  2. * Copyright (c) 2013-2014 Samsung Electronics Co., Ltd
  3. * http://www.samsung.com
  4. *
  5. * Copyright (C) 2013 Google, Inc
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. */
  17. #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  18. #include <linux/module.h>
  19. #include <linux/i2c.h>
  20. #include <linux/bcd.h>
  21. #include <linux/regmap.h>
  22. #include <linux/rtc.h>
  23. #include <linux/platform_device.h>
  24. #include <linux/mfd/samsung/core.h>
  25. #include <linux/mfd/samsung/irq.h>
  26. #include <linux/mfd/samsung/rtc.h>
  27. #include <linux/mfd/samsung/s2mps14.h>
  28. /*
  29. * Maximum number of retries for checking changes in UDR field
  30. * of S5M_RTC_UDR_CON register (to limit possible endless loop).
  31. *
  32. * After writing to RTC registers (setting time or alarm) read the UDR field
  33. * in S5M_RTC_UDR_CON register. UDR is auto-cleared when data have
  34. * been transferred.
  35. */
  36. #define UDR_READ_RETRY_CNT 5
  37. enum {
  38. RTC_SEC = 0,
  39. RTC_MIN,
  40. RTC_HOUR,
  41. RTC_WEEKDAY,
  42. RTC_DATE,
  43. RTC_MONTH,
  44. RTC_YEAR1,
  45. RTC_YEAR2,
  46. /* Make sure this is always the last enum name. */
  47. RTC_MAX_NUM_TIME_REGS
  48. };
  49. /*
  50. * Registers used by the driver which are different between chipsets.
  51. *
  52. * Operations like read time and write alarm/time require updating
  53. * specific fields in UDR register. These fields usually are auto-cleared
  54. * (with some exceptions).
  55. *
  56. * Table of operations per device:
  57. *
  58. * Device | Write time | Read time | Write alarm
  59. * =================================================
  60. * S5M8767 | UDR + TIME | | UDR
  61. * S2MPS11/14 | WUDR | RUDR | WUDR + RUDR
  62. * S2MPS13 | WUDR | RUDR | WUDR + AUDR
  63. * S2MPS15 | WUDR | RUDR | AUDR
  64. */
  65. struct s5m_rtc_reg_config {
  66. /* Number of registers used for setting time/alarm0/alarm1 */
  67. unsigned int regs_count;
  68. /* First register for time, seconds */
  69. unsigned int time;
  70. /* RTC control register */
  71. unsigned int ctrl;
  72. /* First register for alarm 0, seconds */
  73. unsigned int alarm0;
  74. /* First register for alarm 1, seconds */
  75. unsigned int alarm1;
  76. /*
  77. * Register for update flag (UDR). Typically setting UDR field to 1
  78. * will enable update of time or alarm register. Then it will be
  79. * auto-cleared after successful update.
  80. */
  81. unsigned int udr_update;
  82. /* Auto-cleared mask in UDR field for writing time and alarm */
  83. unsigned int autoclear_udr_mask;
  84. /*
  85. * Masks in UDR field for time and alarm operations.
  86. * The read time mask can be 0. Rest should not.
  87. */
  88. unsigned int read_time_udr_mask;
  89. unsigned int write_time_udr_mask;
  90. unsigned int write_alarm_udr_mask;
  91. };
  92. /* Register map for S5M8763 and S5M8767 */
  93. static const struct s5m_rtc_reg_config s5m_rtc_regs = {
  94. .regs_count = 8,
  95. .time = S5M_RTC_SEC,
  96. .ctrl = S5M_ALARM1_CONF,
  97. .alarm0 = S5M_ALARM0_SEC,
  98. .alarm1 = S5M_ALARM1_SEC,
  99. .udr_update = S5M_RTC_UDR_CON,
  100. .autoclear_udr_mask = S5M_RTC_UDR_MASK,
  101. .read_time_udr_mask = 0, /* Not needed */
  102. .write_time_udr_mask = S5M_RTC_UDR_MASK | S5M_RTC_TIME_EN_MASK,
  103. .write_alarm_udr_mask = S5M_RTC_UDR_MASK,
  104. };
  105. /* Register map for S2MPS13 */
  106. static const struct s5m_rtc_reg_config s2mps13_rtc_regs = {
  107. .regs_count = 7,
  108. .time = S2MPS_RTC_SEC,
  109. .ctrl = S2MPS_RTC_CTRL,
  110. .alarm0 = S2MPS_ALARM0_SEC,
  111. .alarm1 = S2MPS_ALARM1_SEC,
  112. .udr_update = S2MPS_RTC_UDR_CON,
  113. .autoclear_udr_mask = S2MPS_RTC_WUDR_MASK,
  114. .read_time_udr_mask = S2MPS_RTC_RUDR_MASK,
  115. .write_time_udr_mask = S2MPS_RTC_WUDR_MASK,
  116. .write_alarm_udr_mask = S2MPS_RTC_WUDR_MASK | S2MPS13_RTC_AUDR_MASK,
  117. };
  118. /* Register map for S2MPS11/14 */
  119. static const struct s5m_rtc_reg_config s2mps14_rtc_regs = {
  120. .regs_count = 7,
  121. .time = S2MPS_RTC_SEC,
  122. .ctrl = S2MPS_RTC_CTRL,
  123. .alarm0 = S2MPS_ALARM0_SEC,
  124. .alarm1 = S2MPS_ALARM1_SEC,
  125. .udr_update = S2MPS_RTC_UDR_CON,
  126. .autoclear_udr_mask = S2MPS_RTC_WUDR_MASK,
  127. .read_time_udr_mask = S2MPS_RTC_RUDR_MASK,
  128. .write_time_udr_mask = S2MPS_RTC_WUDR_MASK,
  129. .write_alarm_udr_mask = S2MPS_RTC_WUDR_MASK | S2MPS_RTC_RUDR_MASK,
  130. };
  131. /*
  132. * Register map for S2MPS15 - in comparison to S2MPS14 the WUDR and AUDR bits
  133. * are swapped.
  134. */
  135. static const struct s5m_rtc_reg_config s2mps15_rtc_regs = {
  136. .regs_count = 7,
  137. .time = S2MPS_RTC_SEC,
  138. .ctrl = S2MPS_RTC_CTRL,
  139. .alarm0 = S2MPS_ALARM0_SEC,
  140. .alarm1 = S2MPS_ALARM1_SEC,
  141. .udr_update = S2MPS_RTC_UDR_CON,
  142. .autoclear_udr_mask = S2MPS_RTC_WUDR_MASK,
  143. .read_time_udr_mask = S2MPS_RTC_RUDR_MASK,
  144. .write_time_udr_mask = S2MPS15_RTC_WUDR_MASK,
  145. .write_alarm_udr_mask = S2MPS15_RTC_AUDR_MASK,
  146. };
  147. struct s5m_rtc_info {
  148. struct device *dev;
  149. struct i2c_client *i2c;
  150. struct sec_pmic_dev *s5m87xx;
  151. struct regmap *regmap;
  152. struct rtc_device *rtc_dev;
  153. int irq;
  154. enum sec_device_type device_type;
  155. int rtc_24hr_mode;
  156. const struct s5m_rtc_reg_config *regs;
  157. };
  158. static const struct regmap_config s5m_rtc_regmap_config = {
  159. .reg_bits = 8,
  160. .val_bits = 8,
  161. .max_register = S5M_RTC_REG_MAX,
  162. };
  163. static const struct regmap_config s2mps14_rtc_regmap_config = {
  164. .reg_bits = 8,
  165. .val_bits = 8,
  166. .max_register = S2MPS_RTC_REG_MAX,
  167. };
  168. static void s5m8767_data_to_tm(u8 *data, struct rtc_time *tm,
  169. int rtc_24hr_mode)
  170. {
  171. tm->tm_sec = data[RTC_SEC] & 0x7f;
  172. tm->tm_min = data[RTC_MIN] & 0x7f;
  173. if (rtc_24hr_mode) {
  174. tm->tm_hour = data[RTC_HOUR] & 0x1f;
  175. } else {
  176. tm->tm_hour = data[RTC_HOUR] & 0x0f;
  177. if (data[RTC_HOUR] & HOUR_PM_MASK)
  178. tm->tm_hour += 12;
  179. }
  180. tm->tm_wday = ffs(data[RTC_WEEKDAY] & 0x7f);
  181. tm->tm_mday = data[RTC_DATE] & 0x1f;
  182. tm->tm_mon = (data[RTC_MONTH] & 0x0f) - 1;
  183. tm->tm_year = (data[RTC_YEAR1] & 0x7f) + 100;
  184. tm->tm_yday = 0;
  185. tm->tm_isdst = 0;
  186. }
  187. static int s5m8767_tm_to_data(struct rtc_time *tm, u8 *data)
  188. {
  189. data[RTC_SEC] = tm->tm_sec;
  190. data[RTC_MIN] = tm->tm_min;
  191. if (tm->tm_hour >= 12)
  192. data[RTC_HOUR] = tm->tm_hour | HOUR_PM_MASK;
  193. else
  194. data[RTC_HOUR] = tm->tm_hour & ~HOUR_PM_MASK;
  195. data[RTC_WEEKDAY] = 1 << tm->tm_wday;
  196. data[RTC_DATE] = tm->tm_mday;
  197. data[RTC_MONTH] = tm->tm_mon + 1;
  198. data[RTC_YEAR1] = tm->tm_year > 100 ? (tm->tm_year - 100) : 0;
  199. if (tm->tm_year < 100) {
  200. pr_err("RTC cannot handle the year %d\n",
  201. 1900 + tm->tm_year);
  202. return -EINVAL;
  203. } else {
  204. return 0;
  205. }
  206. }
  207. /*
  208. * Read RTC_UDR_CON register and wait till UDR field is cleared.
  209. * This indicates that time/alarm update ended.
  210. */
  211. static int s5m8767_wait_for_udr_update(struct s5m_rtc_info *info)
  212. {
  213. int ret, retry = UDR_READ_RETRY_CNT;
  214. unsigned int data;
  215. do {
  216. ret = regmap_read(info->regmap, info->regs->udr_update, &data);
  217. } while (--retry && (data & info->regs->autoclear_udr_mask) && !ret);
  218. if (!retry)
  219. dev_err(info->dev, "waiting for UDR update, reached max number of retries\n");
  220. return ret;
  221. }
  222. static int s5m_check_peding_alarm_interrupt(struct s5m_rtc_info *info,
  223. struct rtc_wkalrm *alarm)
  224. {
  225. int ret;
  226. unsigned int val;
  227. switch (info->device_type) {
  228. case S5M8767X:
  229. case S5M8763X:
  230. ret = regmap_read(info->regmap, S5M_RTC_STATUS, &val);
  231. val &= S5M_ALARM0_STATUS;
  232. break;
  233. case S2MPS15X:
  234. case S2MPS14X:
  235. case S2MPS13X:
  236. ret = regmap_read(info->s5m87xx->regmap_pmic, S2MPS14_REG_ST2,
  237. &val);
  238. val &= S2MPS_ALARM0_STATUS;
  239. break;
  240. default:
  241. return -EINVAL;
  242. }
  243. if (ret < 0)
  244. return ret;
  245. if (val)
  246. alarm->pending = 1;
  247. else
  248. alarm->pending = 0;
  249. return 0;
  250. }
  251. static int s5m8767_rtc_set_time_reg(struct s5m_rtc_info *info)
  252. {
  253. int ret;
  254. unsigned int data;
  255. ret = regmap_read(info->regmap, info->regs->udr_update, &data);
  256. if (ret < 0) {
  257. dev_err(info->dev, "failed to read update reg(%d)\n", ret);
  258. return ret;
  259. }
  260. data |= info->regs->write_time_udr_mask;
  261. ret = regmap_write(info->regmap, info->regs->udr_update, data);
  262. if (ret < 0) {
  263. dev_err(info->dev, "failed to write update reg(%d)\n", ret);
  264. return ret;
  265. }
  266. ret = s5m8767_wait_for_udr_update(info);
  267. return ret;
  268. }
  269. static int s5m8767_rtc_set_alarm_reg(struct s5m_rtc_info *info)
  270. {
  271. int ret;
  272. unsigned int data;
  273. ret = regmap_read(info->regmap, info->regs->udr_update, &data);
  274. if (ret < 0) {
  275. dev_err(info->dev, "%s: fail to read update reg(%d)\n",
  276. __func__, ret);
  277. return ret;
  278. }
  279. data |= info->regs->write_alarm_udr_mask;
  280. switch (info->device_type) {
  281. case S5M8763X:
  282. case S5M8767X:
  283. data &= ~S5M_RTC_TIME_EN_MASK;
  284. break;
  285. case S2MPS15X:
  286. case S2MPS14X:
  287. case S2MPS13X:
  288. /* No exceptions needed */
  289. break;
  290. default:
  291. return -EINVAL;
  292. }
  293. ret = regmap_write(info->regmap, info->regs->udr_update, data);
  294. if (ret < 0) {
  295. dev_err(info->dev, "%s: fail to write update reg(%d)\n",
  296. __func__, ret);
  297. return ret;
  298. }
  299. ret = s5m8767_wait_for_udr_update(info);
  300. /* On S2MPS13 the AUDR is not auto-cleared */
  301. if (info->device_type == S2MPS13X)
  302. regmap_update_bits(info->regmap, info->regs->udr_update,
  303. S2MPS13_RTC_AUDR_MASK, 0);
  304. return ret;
  305. }
  306. static void s5m8763_data_to_tm(u8 *data, struct rtc_time *tm)
  307. {
  308. tm->tm_sec = bcd2bin(data[RTC_SEC]);
  309. tm->tm_min = bcd2bin(data[RTC_MIN]);
  310. if (data[RTC_HOUR] & HOUR_12) {
  311. tm->tm_hour = bcd2bin(data[RTC_HOUR] & 0x1f);
  312. if (data[RTC_HOUR] & HOUR_PM)
  313. tm->tm_hour += 12;
  314. } else {
  315. tm->tm_hour = bcd2bin(data[RTC_HOUR] & 0x3f);
  316. }
  317. tm->tm_wday = data[RTC_WEEKDAY] & 0x07;
  318. tm->tm_mday = bcd2bin(data[RTC_DATE]);
  319. tm->tm_mon = bcd2bin(data[RTC_MONTH]);
  320. tm->tm_year = bcd2bin(data[RTC_YEAR1]) + bcd2bin(data[RTC_YEAR2]) * 100;
  321. tm->tm_year -= 1900;
  322. }
  323. static void s5m8763_tm_to_data(struct rtc_time *tm, u8 *data)
  324. {
  325. data[RTC_SEC] = bin2bcd(tm->tm_sec);
  326. data[RTC_MIN] = bin2bcd(tm->tm_min);
  327. data[RTC_HOUR] = bin2bcd(tm->tm_hour);
  328. data[RTC_WEEKDAY] = tm->tm_wday;
  329. data[RTC_DATE] = bin2bcd(tm->tm_mday);
  330. data[RTC_MONTH] = bin2bcd(tm->tm_mon);
  331. data[RTC_YEAR1] = bin2bcd(tm->tm_year % 100);
  332. data[RTC_YEAR2] = bin2bcd((tm->tm_year + 1900) / 100);
  333. }
  334. static int s5m_rtc_read_time(struct device *dev, struct rtc_time *tm)
  335. {
  336. struct s5m_rtc_info *info = dev_get_drvdata(dev);
  337. u8 data[RTC_MAX_NUM_TIME_REGS];
  338. int ret;
  339. if (info->regs->read_time_udr_mask) {
  340. ret = regmap_update_bits(info->regmap,
  341. info->regs->udr_update,
  342. info->regs->read_time_udr_mask,
  343. info->regs->read_time_udr_mask);
  344. if (ret) {
  345. dev_err(dev,
  346. "Failed to prepare registers for time reading: %d\n",
  347. ret);
  348. return ret;
  349. }
  350. }
  351. ret = regmap_bulk_read(info->regmap, info->regs->time, data,
  352. info->regs->regs_count);
  353. if (ret < 0)
  354. return ret;
  355. switch (info->device_type) {
  356. case S5M8763X:
  357. s5m8763_data_to_tm(data, tm);
  358. break;
  359. case S5M8767X:
  360. case S2MPS15X:
  361. case S2MPS14X:
  362. case S2MPS13X:
  363. s5m8767_data_to_tm(data, tm, info->rtc_24hr_mode);
  364. break;
  365. default:
  366. return -EINVAL;
  367. }
  368. dev_dbg(dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__,
  369. 1900 + tm->tm_year, 1 + tm->tm_mon, tm->tm_mday,
  370. tm->tm_hour, tm->tm_min, tm->tm_sec, tm->tm_wday);
  371. return 0;
  372. }
  373. static int s5m_rtc_set_time(struct device *dev, struct rtc_time *tm)
  374. {
  375. struct s5m_rtc_info *info = dev_get_drvdata(dev);
  376. u8 data[RTC_MAX_NUM_TIME_REGS];
  377. int ret = 0;
  378. switch (info->device_type) {
  379. case S5M8763X:
  380. s5m8763_tm_to_data(tm, data);
  381. break;
  382. case S5M8767X:
  383. case S2MPS15X:
  384. case S2MPS14X:
  385. case S2MPS13X:
  386. ret = s5m8767_tm_to_data(tm, data);
  387. break;
  388. default:
  389. return -EINVAL;
  390. }
  391. if (ret < 0)
  392. return ret;
  393. dev_dbg(dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__,
  394. 1900 + tm->tm_year, 1 + tm->tm_mon, tm->tm_mday,
  395. tm->tm_hour, tm->tm_min, tm->tm_sec, tm->tm_wday);
  396. ret = regmap_raw_write(info->regmap, info->regs->time, data,
  397. info->regs->regs_count);
  398. if (ret < 0)
  399. return ret;
  400. ret = s5m8767_rtc_set_time_reg(info);
  401. return ret;
  402. }
  403. static int s5m_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
  404. {
  405. struct s5m_rtc_info *info = dev_get_drvdata(dev);
  406. u8 data[RTC_MAX_NUM_TIME_REGS];
  407. unsigned int val;
  408. int ret, i;
  409. ret = regmap_bulk_read(info->regmap, info->regs->alarm0, data,
  410. info->regs->regs_count);
  411. if (ret < 0)
  412. return ret;
  413. switch (info->device_type) {
  414. case S5M8763X:
  415. s5m8763_data_to_tm(data, &alrm->time);
  416. ret = regmap_read(info->regmap, S5M_ALARM0_CONF, &val);
  417. if (ret < 0)
  418. return ret;
  419. alrm->enabled = !!val;
  420. break;
  421. case S5M8767X:
  422. case S2MPS15X:
  423. case S2MPS14X:
  424. case S2MPS13X:
  425. s5m8767_data_to_tm(data, &alrm->time, info->rtc_24hr_mode);
  426. alrm->enabled = 0;
  427. for (i = 0; i < info->regs->regs_count; i++) {
  428. if (data[i] & ALARM_ENABLE_MASK) {
  429. alrm->enabled = 1;
  430. break;
  431. }
  432. }
  433. break;
  434. default:
  435. return -EINVAL;
  436. }
  437. dev_dbg(dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__,
  438. 1900 + alrm->time.tm_year, 1 + alrm->time.tm_mon,
  439. alrm->time.tm_mday, alrm->time.tm_hour,
  440. alrm->time.tm_min, alrm->time.tm_sec,
  441. alrm->time.tm_wday);
  442. ret = s5m_check_peding_alarm_interrupt(info, alrm);
  443. return 0;
  444. }
  445. static int s5m_rtc_stop_alarm(struct s5m_rtc_info *info)
  446. {
  447. u8 data[RTC_MAX_NUM_TIME_REGS];
  448. int ret, i;
  449. struct rtc_time tm;
  450. ret = regmap_bulk_read(info->regmap, info->regs->alarm0, data,
  451. info->regs->regs_count);
  452. if (ret < 0)
  453. return ret;
  454. s5m8767_data_to_tm(data, &tm, info->rtc_24hr_mode);
  455. dev_dbg(info->dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__,
  456. 1900 + tm.tm_year, 1 + tm.tm_mon, tm.tm_mday,
  457. tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_wday);
  458. switch (info->device_type) {
  459. case S5M8763X:
  460. ret = regmap_write(info->regmap, S5M_ALARM0_CONF, 0);
  461. break;
  462. case S5M8767X:
  463. case S2MPS15X:
  464. case S2MPS14X:
  465. case S2MPS13X:
  466. for (i = 0; i < info->regs->regs_count; i++)
  467. data[i] &= ~ALARM_ENABLE_MASK;
  468. ret = regmap_raw_write(info->regmap, info->regs->alarm0, data,
  469. info->regs->regs_count);
  470. if (ret < 0)
  471. return ret;
  472. ret = s5m8767_rtc_set_alarm_reg(info);
  473. break;
  474. default:
  475. return -EINVAL;
  476. }
  477. return ret;
  478. }
  479. static int s5m_rtc_start_alarm(struct s5m_rtc_info *info)
  480. {
  481. int ret;
  482. u8 data[RTC_MAX_NUM_TIME_REGS];
  483. u8 alarm0_conf;
  484. struct rtc_time tm;
  485. ret = regmap_bulk_read(info->regmap, info->regs->alarm0, data,
  486. info->regs->regs_count);
  487. if (ret < 0)
  488. return ret;
  489. s5m8767_data_to_tm(data, &tm, info->rtc_24hr_mode);
  490. dev_dbg(info->dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__,
  491. 1900 + tm.tm_year, 1 + tm.tm_mon, tm.tm_mday,
  492. tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_wday);
  493. switch (info->device_type) {
  494. case S5M8763X:
  495. alarm0_conf = 0x77;
  496. ret = regmap_write(info->regmap, S5M_ALARM0_CONF, alarm0_conf);
  497. break;
  498. case S5M8767X:
  499. case S2MPS15X:
  500. case S2MPS14X:
  501. case S2MPS13X:
  502. data[RTC_SEC] |= ALARM_ENABLE_MASK;
  503. data[RTC_MIN] |= ALARM_ENABLE_MASK;
  504. data[RTC_HOUR] |= ALARM_ENABLE_MASK;
  505. data[RTC_WEEKDAY] &= ~ALARM_ENABLE_MASK;
  506. if (data[RTC_DATE] & 0x1f)
  507. data[RTC_DATE] |= ALARM_ENABLE_MASK;
  508. if (data[RTC_MONTH] & 0xf)
  509. data[RTC_MONTH] |= ALARM_ENABLE_MASK;
  510. if (data[RTC_YEAR1] & 0x7f)
  511. data[RTC_YEAR1] |= ALARM_ENABLE_MASK;
  512. ret = regmap_raw_write(info->regmap, info->regs->alarm0, data,
  513. info->regs->regs_count);
  514. if (ret < 0)
  515. return ret;
  516. ret = s5m8767_rtc_set_alarm_reg(info);
  517. break;
  518. default:
  519. return -EINVAL;
  520. }
  521. return ret;
  522. }
  523. static int s5m_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
  524. {
  525. struct s5m_rtc_info *info = dev_get_drvdata(dev);
  526. u8 data[RTC_MAX_NUM_TIME_REGS];
  527. int ret;
  528. switch (info->device_type) {
  529. case S5M8763X:
  530. s5m8763_tm_to_data(&alrm->time, data);
  531. break;
  532. case S5M8767X:
  533. case S2MPS15X:
  534. case S2MPS14X:
  535. case S2MPS13X:
  536. s5m8767_tm_to_data(&alrm->time, data);
  537. break;
  538. default:
  539. return -EINVAL;
  540. }
  541. dev_dbg(dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__,
  542. 1900 + alrm->time.tm_year, 1 + alrm->time.tm_mon,
  543. alrm->time.tm_mday, alrm->time.tm_hour, alrm->time.tm_min,
  544. alrm->time.tm_sec, alrm->time.tm_wday);
  545. ret = s5m_rtc_stop_alarm(info);
  546. if (ret < 0)
  547. return ret;
  548. ret = regmap_raw_write(info->regmap, info->regs->alarm0, data,
  549. info->regs->regs_count);
  550. if (ret < 0)
  551. return ret;
  552. ret = s5m8767_rtc_set_alarm_reg(info);
  553. if (ret < 0)
  554. return ret;
  555. if (alrm->enabled)
  556. ret = s5m_rtc_start_alarm(info);
  557. return ret;
  558. }
  559. static int s5m_rtc_alarm_irq_enable(struct device *dev,
  560. unsigned int enabled)
  561. {
  562. struct s5m_rtc_info *info = dev_get_drvdata(dev);
  563. if (enabled)
  564. return s5m_rtc_start_alarm(info);
  565. else
  566. return s5m_rtc_stop_alarm(info);
  567. }
  568. static irqreturn_t s5m_rtc_alarm_irq(int irq, void *data)
  569. {
  570. struct s5m_rtc_info *info = data;
  571. rtc_update_irq(info->rtc_dev, 1, RTC_IRQF | RTC_AF);
  572. return IRQ_HANDLED;
  573. }
  574. static const struct rtc_class_ops s5m_rtc_ops = {
  575. .read_time = s5m_rtc_read_time,
  576. .set_time = s5m_rtc_set_time,
  577. .read_alarm = s5m_rtc_read_alarm,
  578. .set_alarm = s5m_rtc_set_alarm,
  579. .alarm_irq_enable = s5m_rtc_alarm_irq_enable,
  580. };
  581. static int s5m8767_rtc_init_reg(struct s5m_rtc_info *info)
  582. {
  583. u8 data[2];
  584. int ret;
  585. switch (info->device_type) {
  586. case S5M8763X:
  587. case S5M8767X:
  588. /* UDR update time. Default of 7.32 ms is too long. */
  589. ret = regmap_update_bits(info->regmap, S5M_RTC_UDR_CON,
  590. S5M_RTC_UDR_T_MASK, S5M_RTC_UDR_T_450_US);
  591. if (ret < 0)
  592. dev_err(info->dev, "%s: fail to change UDR time: %d\n",
  593. __func__, ret);
  594. /* Set RTC control register : Binary mode, 24hour mode */
  595. data[0] = (1 << BCD_EN_SHIFT) | (1 << MODEL24_SHIFT);
  596. data[1] = (0 << BCD_EN_SHIFT) | (1 << MODEL24_SHIFT);
  597. ret = regmap_raw_write(info->regmap, S5M_ALARM0_CONF, data, 2);
  598. break;
  599. case S2MPS15X:
  600. case S2MPS14X:
  601. case S2MPS13X:
  602. data[0] = (0 << BCD_EN_SHIFT) | (1 << MODEL24_SHIFT);
  603. ret = regmap_write(info->regmap, info->regs->ctrl, data[0]);
  604. if (ret < 0)
  605. break;
  606. /*
  607. * Should set WUDR & (RUDR or AUDR) bits to high after writing
  608. * RTC_CTRL register like writing Alarm registers. We can't find
  609. * the description from datasheet but vendor code does that
  610. * really.
  611. */
  612. ret = s5m8767_rtc_set_alarm_reg(info);
  613. break;
  614. default:
  615. return -EINVAL;
  616. }
  617. info->rtc_24hr_mode = 1;
  618. if (ret < 0) {
  619. dev_err(info->dev, "%s: fail to write controlm reg(%d)\n",
  620. __func__, ret);
  621. return ret;
  622. }
  623. return ret;
  624. }
  625. static int s5m_rtc_probe(struct platform_device *pdev)
  626. {
  627. struct sec_pmic_dev *s5m87xx = dev_get_drvdata(pdev->dev.parent);
  628. struct sec_platform_data *pdata = s5m87xx->pdata;
  629. struct s5m_rtc_info *info;
  630. const struct regmap_config *regmap_cfg;
  631. int ret, alarm_irq;
  632. if (!pdata) {
  633. dev_err(pdev->dev.parent, "Platform data not supplied\n");
  634. return -ENODEV;
  635. }
  636. info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);
  637. if (!info)
  638. return -ENOMEM;
  639. switch (platform_get_device_id(pdev)->driver_data) {
  640. case S2MPS15X:
  641. regmap_cfg = &s2mps14_rtc_regmap_config;
  642. info->regs = &s2mps15_rtc_regs;
  643. alarm_irq = S2MPS14_IRQ_RTCA0;
  644. break;
  645. case S2MPS14X:
  646. regmap_cfg = &s2mps14_rtc_regmap_config;
  647. info->regs = &s2mps14_rtc_regs;
  648. alarm_irq = S2MPS14_IRQ_RTCA0;
  649. break;
  650. case S2MPS13X:
  651. regmap_cfg = &s2mps14_rtc_regmap_config;
  652. info->regs = &s2mps13_rtc_regs;
  653. alarm_irq = S2MPS14_IRQ_RTCA0;
  654. break;
  655. case S5M8763X:
  656. regmap_cfg = &s5m_rtc_regmap_config;
  657. info->regs = &s5m_rtc_regs;
  658. alarm_irq = S5M8763_IRQ_ALARM0;
  659. break;
  660. case S5M8767X:
  661. regmap_cfg = &s5m_rtc_regmap_config;
  662. info->regs = &s5m_rtc_regs;
  663. alarm_irq = S5M8767_IRQ_RTCA1;
  664. break;
  665. default:
  666. dev_err(&pdev->dev,
  667. "Device type %lu is not supported by RTC driver\n",
  668. platform_get_device_id(pdev)->driver_data);
  669. return -ENODEV;
  670. }
  671. info->i2c = i2c_new_dummy(s5m87xx->i2c->adapter, RTC_I2C_ADDR);
  672. if (!info->i2c) {
  673. dev_err(&pdev->dev, "Failed to allocate I2C for RTC\n");
  674. return -ENODEV;
  675. }
  676. info->regmap = devm_regmap_init_i2c(info->i2c, regmap_cfg);
  677. if (IS_ERR(info->regmap)) {
  678. ret = PTR_ERR(info->regmap);
  679. dev_err(&pdev->dev, "Failed to allocate RTC register map: %d\n",
  680. ret);
  681. goto err;
  682. }
  683. info->dev = &pdev->dev;
  684. info->s5m87xx = s5m87xx;
  685. info->device_type = platform_get_device_id(pdev)->driver_data;
  686. if (s5m87xx->irq_data) {
  687. info->irq = regmap_irq_get_virq(s5m87xx->irq_data, alarm_irq);
  688. if (info->irq <= 0) {
  689. ret = -EINVAL;
  690. dev_err(&pdev->dev, "Failed to get virtual IRQ %d\n",
  691. alarm_irq);
  692. goto err;
  693. }
  694. }
  695. platform_set_drvdata(pdev, info);
  696. ret = s5m8767_rtc_init_reg(info);
  697. device_init_wakeup(&pdev->dev, 1);
  698. info->rtc_dev = devm_rtc_device_register(&pdev->dev, "s5m-rtc",
  699. &s5m_rtc_ops, THIS_MODULE);
  700. if (IS_ERR(info->rtc_dev)) {
  701. ret = PTR_ERR(info->rtc_dev);
  702. goto err;
  703. }
  704. if (!info->irq) {
  705. dev_info(&pdev->dev, "Alarm IRQ not available\n");
  706. return 0;
  707. }
  708. ret = devm_request_threaded_irq(&pdev->dev, info->irq, NULL,
  709. s5m_rtc_alarm_irq, 0, "rtc-alarm0",
  710. info);
  711. if (ret < 0) {
  712. dev_err(&pdev->dev, "Failed to request alarm IRQ: %d: %d\n",
  713. info->irq, ret);
  714. goto err;
  715. }
  716. return 0;
  717. err:
  718. i2c_unregister_device(info->i2c);
  719. return ret;
  720. }
  721. static int s5m_rtc_remove(struct platform_device *pdev)
  722. {
  723. struct s5m_rtc_info *info = platform_get_drvdata(pdev);
  724. i2c_unregister_device(info->i2c);
  725. return 0;
  726. }
  727. #ifdef CONFIG_PM_SLEEP
  728. static int s5m_rtc_resume(struct device *dev)
  729. {
  730. struct s5m_rtc_info *info = dev_get_drvdata(dev);
  731. int ret = 0;
  732. if (info->irq && device_may_wakeup(dev))
  733. ret = disable_irq_wake(info->irq);
  734. return ret;
  735. }
  736. static int s5m_rtc_suspend(struct device *dev)
  737. {
  738. struct s5m_rtc_info *info = dev_get_drvdata(dev);
  739. int ret = 0;
  740. if (info->irq && device_may_wakeup(dev))
  741. ret = enable_irq_wake(info->irq);
  742. return ret;
  743. }
  744. #endif /* CONFIG_PM_SLEEP */
  745. static SIMPLE_DEV_PM_OPS(s5m_rtc_pm_ops, s5m_rtc_suspend, s5m_rtc_resume);
  746. static const struct platform_device_id s5m_rtc_id[] = {
  747. { "s5m-rtc", S5M8767X },
  748. { "s2mps13-rtc", S2MPS13X },
  749. { "s2mps14-rtc", S2MPS14X },
  750. { "s2mps15-rtc", S2MPS15X },
  751. { },
  752. };
  753. MODULE_DEVICE_TABLE(platform, s5m_rtc_id);
  754. static struct platform_driver s5m_rtc_driver = {
  755. .driver = {
  756. .name = "s5m-rtc",
  757. .pm = &s5m_rtc_pm_ops,
  758. },
  759. .probe = s5m_rtc_probe,
  760. .remove = s5m_rtc_remove,
  761. .id_table = s5m_rtc_id,
  762. };
  763. module_platform_driver(s5m_rtc_driver);
  764. /* Module information */
  765. MODULE_AUTHOR("Sangbeom Kim <sbkim73@samsung.com>");
  766. MODULE_DESCRIPTION("Samsung S5M/S2MPS14 RTC driver");
  767. MODULE_LICENSE("GPL");
  768. MODULE_ALIAS("platform:s5m-rtc");