PageRenderTime 63ms CodeModel.GetById 22ms RepoModel.GetById 1ms app.codeStats 0ms

/drivers/rtc/rtc-mxc.c

https://github.com/tklauser/linux-nios2
C | 517 lines | 370 code | 92 blank | 55 comment | 34 complexity | ec9e00db43031f61f365b81ccca6109c MD5 | raw file
  1. /*
  2. * Copyright 2004-2008 Freescale Semiconductor, Inc. All Rights Reserved.
  3. *
  4. * The code contained herein is licensed under the GNU General Public
  5. * License. You may obtain a copy of the GNU General Public License
  6. * Version 2 or later at the following locations:
  7. *
  8. * http://www.opensource.org/licenses/gpl-license.html
  9. * http://www.gnu.org/copyleft/gpl.html
  10. */
  11. #include <linux/io.h>
  12. #include <linux/rtc.h>
  13. #include <linux/module.h>
  14. #include <linux/slab.h>
  15. #include <linux/interrupt.h>
  16. #include <linux/platform_device.h>
  17. #include <linux/clk.h>
  18. #include <linux/of.h>
  19. #include <linux/of_device.h>
  20. #define RTC_INPUT_CLK_32768HZ (0x00 << 5)
  21. #define RTC_INPUT_CLK_32000HZ (0x01 << 5)
  22. #define RTC_INPUT_CLK_38400HZ (0x02 << 5)
  23. #define RTC_SW_BIT (1 << 0)
  24. #define RTC_ALM_BIT (1 << 2)
  25. #define RTC_1HZ_BIT (1 << 4)
  26. #define RTC_2HZ_BIT (1 << 7)
  27. #define RTC_SAM0_BIT (1 << 8)
  28. #define RTC_SAM1_BIT (1 << 9)
  29. #define RTC_SAM2_BIT (1 << 10)
  30. #define RTC_SAM3_BIT (1 << 11)
  31. #define RTC_SAM4_BIT (1 << 12)
  32. #define RTC_SAM5_BIT (1 << 13)
  33. #define RTC_SAM6_BIT (1 << 14)
  34. #define RTC_SAM7_BIT (1 << 15)
  35. #define PIT_ALL_ON (RTC_2HZ_BIT | RTC_SAM0_BIT | RTC_SAM1_BIT | \
  36. RTC_SAM2_BIT | RTC_SAM3_BIT | RTC_SAM4_BIT | \
  37. RTC_SAM5_BIT | RTC_SAM6_BIT | RTC_SAM7_BIT)
  38. #define RTC_ENABLE_BIT (1 << 7)
  39. #define MAX_PIE_NUM 9
  40. #define MAX_PIE_FREQ 512
  41. static const u32 PIE_BIT_DEF[MAX_PIE_NUM][2] = {
  42. { 2, RTC_2HZ_BIT },
  43. { 4, RTC_SAM0_BIT },
  44. { 8, RTC_SAM1_BIT },
  45. { 16, RTC_SAM2_BIT },
  46. { 32, RTC_SAM3_BIT },
  47. { 64, RTC_SAM4_BIT },
  48. { 128, RTC_SAM5_BIT },
  49. { 256, RTC_SAM6_BIT },
  50. { MAX_PIE_FREQ, RTC_SAM7_BIT },
  51. };
  52. #define MXC_RTC_TIME 0
  53. #define MXC_RTC_ALARM 1
  54. #define RTC_HOURMIN 0x00 /* 32bit rtc hour/min counter reg */
  55. #define RTC_SECOND 0x04 /* 32bit rtc seconds counter reg */
  56. #define RTC_ALRM_HM 0x08 /* 32bit rtc alarm hour/min reg */
  57. #define RTC_ALRM_SEC 0x0C /* 32bit rtc alarm seconds reg */
  58. #define RTC_RTCCTL 0x10 /* 32bit rtc control reg */
  59. #define RTC_RTCISR 0x14 /* 32bit rtc interrupt status reg */
  60. #define RTC_RTCIENR 0x18 /* 32bit rtc interrupt enable reg */
  61. #define RTC_STPWCH 0x1C /* 32bit rtc stopwatch min reg */
  62. #define RTC_DAYR 0x20 /* 32bit rtc days counter reg */
  63. #define RTC_DAYALARM 0x24 /* 32bit rtc day alarm reg */
  64. #define RTC_TEST1 0x28 /* 32bit rtc test reg 1 */
  65. #define RTC_TEST2 0x2C /* 32bit rtc test reg 2 */
  66. #define RTC_TEST3 0x30 /* 32bit rtc test reg 3 */
  67. enum imx_rtc_type {
  68. IMX1_RTC,
  69. IMX21_RTC,
  70. };
  71. struct rtc_plat_data {
  72. struct rtc_device *rtc;
  73. void __iomem *ioaddr;
  74. int irq;
  75. struct clk *clk_ref;
  76. struct clk *clk_ipg;
  77. struct rtc_time g_rtc_alarm;
  78. enum imx_rtc_type devtype;
  79. };
  80. static const struct platform_device_id imx_rtc_devtype[] = {
  81. {
  82. .name = "imx1-rtc",
  83. .driver_data = IMX1_RTC,
  84. }, {
  85. .name = "imx21-rtc",
  86. .driver_data = IMX21_RTC,
  87. }, {
  88. /* sentinel */
  89. }
  90. };
  91. MODULE_DEVICE_TABLE(platform, imx_rtc_devtype);
  92. #ifdef CONFIG_OF
  93. static const struct of_device_id imx_rtc_dt_ids[] = {
  94. { .compatible = "fsl,imx1-rtc", .data = (const void *)IMX1_RTC },
  95. { .compatible = "fsl,imx21-rtc", .data = (const void *)IMX21_RTC },
  96. {}
  97. };
  98. MODULE_DEVICE_TABLE(of, imx_rtc_dt_ids);
  99. #endif
  100. static inline int is_imx1_rtc(struct rtc_plat_data *data)
  101. {
  102. return data->devtype == IMX1_RTC;
  103. }
  104. /*
  105. * This function is used to obtain the RTC time or the alarm value in
  106. * second.
  107. */
  108. static time64_t get_alarm_or_time(struct device *dev, int time_alarm)
  109. {
  110. struct platform_device *pdev = to_platform_device(dev);
  111. struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
  112. void __iomem *ioaddr = pdata->ioaddr;
  113. u32 day = 0, hr = 0, min = 0, sec = 0, hr_min = 0;
  114. switch (time_alarm) {
  115. case MXC_RTC_TIME:
  116. day = readw(ioaddr + RTC_DAYR);
  117. hr_min = readw(ioaddr + RTC_HOURMIN);
  118. sec = readw(ioaddr + RTC_SECOND);
  119. break;
  120. case MXC_RTC_ALARM:
  121. day = readw(ioaddr + RTC_DAYALARM);
  122. hr_min = readw(ioaddr + RTC_ALRM_HM) & 0xffff;
  123. sec = readw(ioaddr + RTC_ALRM_SEC);
  124. break;
  125. }
  126. hr = hr_min >> 8;
  127. min = hr_min & 0xff;
  128. return ((((time64_t)day * 24 + hr) * 60) + min) * 60 + sec;
  129. }
  130. /*
  131. * This function sets the RTC alarm value or the time value.
  132. */
  133. static void set_alarm_or_time(struct device *dev, int time_alarm, time64_t time)
  134. {
  135. u32 tod, day, hr, min, sec, temp;
  136. struct platform_device *pdev = to_platform_device(dev);
  137. struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
  138. void __iomem *ioaddr = pdata->ioaddr;
  139. day = div_s64_rem(time, 86400, &tod);
  140. /* time is within a day now */
  141. hr = tod / 3600;
  142. tod -= hr * 3600;
  143. /* time is within an hour now */
  144. min = tod / 60;
  145. sec = tod - min * 60;
  146. temp = (hr << 8) + min;
  147. switch (time_alarm) {
  148. case MXC_RTC_TIME:
  149. writew(day, ioaddr + RTC_DAYR);
  150. writew(sec, ioaddr + RTC_SECOND);
  151. writew(temp, ioaddr + RTC_HOURMIN);
  152. break;
  153. case MXC_RTC_ALARM:
  154. writew(day, ioaddr + RTC_DAYALARM);
  155. writew(sec, ioaddr + RTC_ALRM_SEC);
  156. writew(temp, ioaddr + RTC_ALRM_HM);
  157. break;
  158. }
  159. }
  160. /*
  161. * This function updates the RTC alarm registers and then clears all the
  162. * interrupt status bits.
  163. */
  164. static void rtc_update_alarm(struct device *dev, struct rtc_time *alrm)
  165. {
  166. time64_t time;
  167. struct platform_device *pdev = to_platform_device(dev);
  168. struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
  169. void __iomem *ioaddr = pdata->ioaddr;
  170. time = rtc_tm_to_time64(alrm);
  171. /* clear all the interrupt status bits */
  172. writew(readw(ioaddr + RTC_RTCISR), ioaddr + RTC_RTCISR);
  173. set_alarm_or_time(dev, MXC_RTC_ALARM, time);
  174. }
  175. static void mxc_rtc_irq_enable(struct device *dev, unsigned int bit,
  176. unsigned int enabled)
  177. {
  178. struct platform_device *pdev = to_platform_device(dev);
  179. struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
  180. void __iomem *ioaddr = pdata->ioaddr;
  181. u32 reg;
  182. spin_lock_irq(&pdata->rtc->irq_lock);
  183. reg = readw(ioaddr + RTC_RTCIENR);
  184. if (enabled)
  185. reg |= bit;
  186. else
  187. reg &= ~bit;
  188. writew(reg, ioaddr + RTC_RTCIENR);
  189. spin_unlock_irq(&pdata->rtc->irq_lock);
  190. }
  191. /* This function is the RTC interrupt service routine. */
  192. static irqreturn_t mxc_rtc_interrupt(int irq, void *dev_id)
  193. {
  194. struct platform_device *pdev = dev_id;
  195. struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
  196. void __iomem *ioaddr = pdata->ioaddr;
  197. unsigned long flags;
  198. u32 status;
  199. u32 events = 0;
  200. spin_lock_irqsave(&pdata->rtc->irq_lock, flags);
  201. status = readw(ioaddr + RTC_RTCISR) & readw(ioaddr + RTC_RTCIENR);
  202. /* clear interrupt sources */
  203. writew(status, ioaddr + RTC_RTCISR);
  204. /* update irq data & counter */
  205. if (status & RTC_ALM_BIT) {
  206. events |= (RTC_AF | RTC_IRQF);
  207. /* RTC alarm should be one-shot */
  208. mxc_rtc_irq_enable(&pdev->dev, RTC_ALM_BIT, 0);
  209. }
  210. if (status & PIT_ALL_ON)
  211. events |= (RTC_PF | RTC_IRQF);
  212. rtc_update_irq(pdata->rtc, 1, events);
  213. spin_unlock_irqrestore(&pdata->rtc->irq_lock, flags);
  214. return IRQ_HANDLED;
  215. }
  216. /*
  217. * Clear all interrupts and release the IRQ
  218. */
  219. static void mxc_rtc_release(struct device *dev)
  220. {
  221. struct platform_device *pdev = to_platform_device(dev);
  222. struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
  223. void __iomem *ioaddr = pdata->ioaddr;
  224. spin_lock_irq(&pdata->rtc->irq_lock);
  225. /* Disable all rtc interrupts */
  226. writew(0, ioaddr + RTC_RTCIENR);
  227. /* Clear all interrupt status */
  228. writew(0xffffffff, ioaddr + RTC_RTCISR);
  229. spin_unlock_irq(&pdata->rtc->irq_lock);
  230. }
  231. static int mxc_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled)
  232. {
  233. mxc_rtc_irq_enable(dev, RTC_ALM_BIT, enabled);
  234. return 0;
  235. }
  236. /*
  237. * This function reads the current RTC time into tm in Gregorian date.
  238. */
  239. static int mxc_rtc_read_time(struct device *dev, struct rtc_time *tm)
  240. {
  241. time64_t val;
  242. /* Avoid roll-over from reading the different registers */
  243. do {
  244. val = get_alarm_or_time(dev, MXC_RTC_TIME);
  245. } while (val != get_alarm_or_time(dev, MXC_RTC_TIME));
  246. rtc_time64_to_tm(val, tm);
  247. return 0;
  248. }
  249. /*
  250. * This function sets the internal RTC time based on tm in Gregorian date.
  251. */
  252. static int mxc_rtc_set_mmss(struct device *dev, time64_t time)
  253. {
  254. struct platform_device *pdev = to_platform_device(dev);
  255. struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
  256. /*
  257. * TTC_DAYR register is 9-bit in MX1 SoC, save time and day of year only
  258. */
  259. if (is_imx1_rtc(pdata)) {
  260. struct rtc_time tm;
  261. rtc_time64_to_tm(time, &tm);
  262. tm.tm_year = 70;
  263. time = rtc_tm_to_time64(&tm);
  264. }
  265. /* Avoid roll-over from reading the different registers */
  266. do {
  267. set_alarm_or_time(dev, MXC_RTC_TIME, time);
  268. } while (time != get_alarm_or_time(dev, MXC_RTC_TIME));
  269. return 0;
  270. }
  271. /*
  272. * This function reads the current alarm value into the passed in 'alrm'
  273. * argument. It updates the alrm's pending field value based on the whether
  274. * an alarm interrupt occurs or not.
  275. */
  276. static int mxc_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
  277. {
  278. struct platform_device *pdev = to_platform_device(dev);
  279. struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
  280. void __iomem *ioaddr = pdata->ioaddr;
  281. rtc_time64_to_tm(get_alarm_or_time(dev, MXC_RTC_ALARM), &alrm->time);
  282. alrm->pending = ((readw(ioaddr + RTC_RTCISR) & RTC_ALM_BIT)) ? 1 : 0;
  283. return 0;
  284. }
  285. /*
  286. * This function sets the RTC alarm based on passed in alrm.
  287. */
  288. static int mxc_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
  289. {
  290. struct platform_device *pdev = to_platform_device(dev);
  291. struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
  292. rtc_update_alarm(dev, &alrm->time);
  293. memcpy(&pdata->g_rtc_alarm, &alrm->time, sizeof(struct rtc_time));
  294. mxc_rtc_irq_enable(dev, RTC_ALM_BIT, alrm->enabled);
  295. return 0;
  296. }
  297. /* RTC layer */
  298. static const struct rtc_class_ops mxc_rtc_ops = {
  299. .release = mxc_rtc_release,
  300. .read_time = mxc_rtc_read_time,
  301. .set_mmss64 = mxc_rtc_set_mmss,
  302. .read_alarm = mxc_rtc_read_alarm,
  303. .set_alarm = mxc_rtc_set_alarm,
  304. .alarm_irq_enable = mxc_rtc_alarm_irq_enable,
  305. };
  306. static int mxc_rtc_probe(struct platform_device *pdev)
  307. {
  308. struct resource *res;
  309. struct rtc_device *rtc;
  310. struct rtc_plat_data *pdata = NULL;
  311. u32 reg;
  312. unsigned long rate;
  313. int ret;
  314. const struct of_device_id *of_id;
  315. pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
  316. if (!pdata)
  317. return -ENOMEM;
  318. of_id = of_match_device(imx_rtc_dt_ids, &pdev->dev);
  319. if (of_id)
  320. pdata->devtype = (enum imx_rtc_type)of_id->data;
  321. else
  322. pdata->devtype = pdev->id_entry->driver_data;
  323. res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  324. pdata->ioaddr = devm_ioremap_resource(&pdev->dev, res);
  325. if (IS_ERR(pdata->ioaddr))
  326. return PTR_ERR(pdata->ioaddr);
  327. pdata->clk_ipg = devm_clk_get(&pdev->dev, "ipg");
  328. if (IS_ERR(pdata->clk_ipg)) {
  329. dev_err(&pdev->dev, "unable to get ipg clock!\n");
  330. return PTR_ERR(pdata->clk_ipg);
  331. }
  332. ret = clk_prepare_enable(pdata->clk_ipg);
  333. if (ret)
  334. return ret;
  335. pdata->clk_ref = devm_clk_get(&pdev->dev, "ref");
  336. if (IS_ERR(pdata->clk_ref)) {
  337. dev_err(&pdev->dev, "unable to get ref clock!\n");
  338. ret = PTR_ERR(pdata->clk_ref);
  339. goto exit_put_clk_ipg;
  340. }
  341. ret = clk_prepare_enable(pdata->clk_ref);
  342. if (ret)
  343. goto exit_put_clk_ipg;
  344. rate = clk_get_rate(pdata->clk_ref);
  345. if (rate == 32768)
  346. reg = RTC_INPUT_CLK_32768HZ;
  347. else if (rate == 32000)
  348. reg = RTC_INPUT_CLK_32000HZ;
  349. else if (rate == 38400)
  350. reg = RTC_INPUT_CLK_38400HZ;
  351. else {
  352. dev_err(&pdev->dev, "rtc clock is not valid (%lu)\n", rate);
  353. ret = -EINVAL;
  354. goto exit_put_clk_ref;
  355. }
  356. reg |= RTC_ENABLE_BIT;
  357. writew(reg, (pdata->ioaddr + RTC_RTCCTL));
  358. if (((readw(pdata->ioaddr + RTC_RTCCTL)) & RTC_ENABLE_BIT) == 0) {
  359. dev_err(&pdev->dev, "hardware module can't be enabled!\n");
  360. ret = -EIO;
  361. goto exit_put_clk_ref;
  362. }
  363. platform_set_drvdata(pdev, pdata);
  364. /* Configure and enable the RTC */
  365. pdata->irq = platform_get_irq(pdev, 0);
  366. if (pdata->irq >= 0 &&
  367. devm_request_irq(&pdev->dev, pdata->irq, mxc_rtc_interrupt,
  368. IRQF_SHARED, pdev->name, pdev) < 0) {
  369. dev_warn(&pdev->dev, "interrupt not available.\n");
  370. pdata->irq = -1;
  371. }
  372. if (pdata->irq >= 0)
  373. device_init_wakeup(&pdev->dev, 1);
  374. rtc = devm_rtc_device_register(&pdev->dev, pdev->name, &mxc_rtc_ops,
  375. THIS_MODULE);
  376. if (IS_ERR(rtc)) {
  377. ret = PTR_ERR(rtc);
  378. goto exit_put_clk_ref;
  379. }
  380. pdata->rtc = rtc;
  381. return 0;
  382. exit_put_clk_ref:
  383. clk_disable_unprepare(pdata->clk_ref);
  384. exit_put_clk_ipg:
  385. clk_disable_unprepare(pdata->clk_ipg);
  386. return ret;
  387. }
  388. static int mxc_rtc_remove(struct platform_device *pdev)
  389. {
  390. struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
  391. clk_disable_unprepare(pdata->clk_ref);
  392. clk_disable_unprepare(pdata->clk_ipg);
  393. return 0;
  394. }
  395. #ifdef CONFIG_PM_SLEEP
  396. static int mxc_rtc_suspend(struct device *dev)
  397. {
  398. struct rtc_plat_data *pdata = dev_get_drvdata(dev);
  399. if (device_may_wakeup(dev))
  400. enable_irq_wake(pdata->irq);
  401. return 0;
  402. }
  403. static int mxc_rtc_resume(struct device *dev)
  404. {
  405. struct rtc_plat_data *pdata = dev_get_drvdata(dev);
  406. if (device_may_wakeup(dev))
  407. disable_irq_wake(pdata->irq);
  408. return 0;
  409. }
  410. #endif
  411. static SIMPLE_DEV_PM_OPS(mxc_rtc_pm_ops, mxc_rtc_suspend, mxc_rtc_resume);
  412. static struct platform_driver mxc_rtc_driver = {
  413. .driver = {
  414. .name = "mxc_rtc",
  415. .of_match_table = of_match_ptr(imx_rtc_dt_ids),
  416. .pm = &mxc_rtc_pm_ops,
  417. },
  418. .id_table = imx_rtc_devtype,
  419. .probe = mxc_rtc_probe,
  420. .remove = mxc_rtc_remove,
  421. };
  422. module_platform_driver(mxc_rtc_driver)
  423. MODULE_AUTHOR("Daniel Mack <daniel@caiaq.de>");
  424. MODULE_DESCRIPTION("RTC driver for Freescale MXC");
  425. MODULE_LICENSE("GPL");