rtc-goldfish.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. // SPDX-License-Identifier: GPL-2.0
  2. /* drivers/rtc/rtc-goldfish.c
  3. *
  4. * Copyright (C) 2007 Google, Inc.
  5. * Copyright (C) 2017 Imagination Technologies Ltd.
  6. */
  7. #include <linux/io.h>
  8. #include <linux/module.h>
  9. #include <linux/of.h>
  10. #include <linux/platform_device.h>
  11. #include <linux/rtc.h>
  12. #include <linux/goldfish.h>
  13. #include <clocksource/timer-goldfish.h>
  14. struct goldfish_rtc {
  15. void __iomem *base;
  16. int irq;
  17. struct rtc_device *rtc;
  18. };
  19. static int goldfish_rtc_read_alarm(struct device *dev,
  20. struct rtc_wkalrm *alrm)
  21. {
  22. u64 rtc_alarm;
  23. u64 rtc_alarm_low;
  24. u64 rtc_alarm_high;
  25. void __iomem *base;
  26. struct goldfish_rtc *rtcdrv;
  27. rtcdrv = dev_get_drvdata(dev);
  28. base = rtcdrv->base;
  29. rtc_alarm_low = gf_ioread32(base + TIMER_ALARM_LOW);
  30. rtc_alarm_high = gf_ioread32(base + TIMER_ALARM_HIGH);
  31. rtc_alarm = (rtc_alarm_high << 32) | rtc_alarm_low;
  32. do_div(rtc_alarm, NSEC_PER_SEC);
  33. memset(alrm, 0, sizeof(struct rtc_wkalrm));
  34. rtc_time64_to_tm(rtc_alarm, &alrm->time);
  35. if (gf_ioread32(base + TIMER_ALARM_STATUS))
  36. alrm->enabled = 1;
  37. else
  38. alrm->enabled = 0;
  39. return 0;
  40. }
  41. static int goldfish_rtc_set_alarm(struct device *dev,
  42. struct rtc_wkalrm *alrm)
  43. {
  44. struct goldfish_rtc *rtcdrv;
  45. u64 rtc_alarm64;
  46. u64 rtc_status_reg;
  47. void __iomem *base;
  48. rtcdrv = dev_get_drvdata(dev);
  49. base = rtcdrv->base;
  50. if (alrm->enabled) {
  51. rtc_alarm64 = rtc_tm_to_time64(&alrm->time) * NSEC_PER_SEC;
  52. gf_iowrite32((rtc_alarm64 >> 32), base + TIMER_ALARM_HIGH);
  53. gf_iowrite32(rtc_alarm64, base + TIMER_ALARM_LOW);
  54. gf_iowrite32(1, base + TIMER_IRQ_ENABLED);
  55. } else {
  56. /*
  57. * if this function was called with enabled=0
  58. * then it could mean that the application is
  59. * trying to cancel an ongoing alarm
  60. */
  61. rtc_status_reg = gf_ioread32(base + TIMER_ALARM_STATUS);
  62. if (rtc_status_reg)
  63. gf_iowrite32(1, base + TIMER_CLEAR_ALARM);
  64. }
  65. return 0;
  66. }
  67. static int goldfish_rtc_alarm_irq_enable(struct device *dev,
  68. unsigned int enabled)
  69. {
  70. void __iomem *base;
  71. struct goldfish_rtc *rtcdrv;
  72. rtcdrv = dev_get_drvdata(dev);
  73. base = rtcdrv->base;
  74. if (enabled)
  75. gf_iowrite32(1, base + TIMER_IRQ_ENABLED);
  76. else
  77. gf_iowrite32(0, base + TIMER_IRQ_ENABLED);
  78. return 0;
  79. }
  80. static irqreturn_t goldfish_rtc_interrupt(int irq, void *dev_id)
  81. {
  82. struct goldfish_rtc *rtcdrv = dev_id;
  83. void __iomem *base = rtcdrv->base;
  84. gf_iowrite32(1, base + TIMER_CLEAR_INTERRUPT);
  85. rtc_update_irq(rtcdrv->rtc, 1, RTC_IRQF | RTC_AF);
  86. return IRQ_HANDLED;
  87. }
  88. static int goldfish_rtc_read_time(struct device *dev, struct rtc_time *tm)
  89. {
  90. struct goldfish_rtc *rtcdrv;
  91. void __iomem *base;
  92. u64 time_high;
  93. u64 time_low;
  94. u64 time;
  95. rtcdrv = dev_get_drvdata(dev);
  96. base = rtcdrv->base;
  97. time_low = gf_ioread32(base + TIMER_TIME_LOW);
  98. time_high = gf_ioread32(base + TIMER_TIME_HIGH);
  99. time = (time_high << 32) | time_low;
  100. do_div(time, NSEC_PER_SEC);
  101. rtc_time64_to_tm(time, tm);
  102. return 0;
  103. }
  104. static int goldfish_rtc_set_time(struct device *dev, struct rtc_time *tm)
  105. {
  106. struct goldfish_rtc *rtcdrv;
  107. void __iomem *base;
  108. u64 now64;
  109. rtcdrv = dev_get_drvdata(dev);
  110. base = rtcdrv->base;
  111. now64 = rtc_tm_to_time64(tm) * NSEC_PER_SEC;
  112. gf_iowrite32((now64 >> 32), base + TIMER_TIME_HIGH);
  113. gf_iowrite32(now64, base + TIMER_TIME_LOW);
  114. return 0;
  115. }
  116. static const struct rtc_class_ops goldfish_rtc_ops = {
  117. .read_time = goldfish_rtc_read_time,
  118. .set_time = goldfish_rtc_set_time,
  119. .read_alarm = goldfish_rtc_read_alarm,
  120. .set_alarm = goldfish_rtc_set_alarm,
  121. .alarm_irq_enable = goldfish_rtc_alarm_irq_enable
  122. };
  123. static int goldfish_rtc_probe(struct platform_device *pdev)
  124. {
  125. struct goldfish_rtc *rtcdrv;
  126. int err;
  127. rtcdrv = devm_kzalloc(&pdev->dev, sizeof(*rtcdrv), GFP_KERNEL);
  128. if (!rtcdrv)
  129. return -ENOMEM;
  130. platform_set_drvdata(pdev, rtcdrv);
  131. rtcdrv->base = devm_platform_ioremap_resource(pdev, 0);
  132. if (IS_ERR(rtcdrv->base))
  133. return PTR_ERR(rtcdrv->base);
  134. rtcdrv->irq = platform_get_irq(pdev, 0);
  135. if (rtcdrv->irq < 0)
  136. return -ENODEV;
  137. rtcdrv->rtc = devm_rtc_allocate_device(&pdev->dev);
  138. if (IS_ERR(rtcdrv->rtc))
  139. return PTR_ERR(rtcdrv->rtc);
  140. rtcdrv->rtc->ops = &goldfish_rtc_ops;
  141. rtcdrv->rtc->range_max = U64_MAX / NSEC_PER_SEC;
  142. err = devm_request_irq(&pdev->dev, rtcdrv->irq,
  143. goldfish_rtc_interrupt,
  144. 0, pdev->name, rtcdrv);
  145. if (err)
  146. return err;
  147. return devm_rtc_register_device(rtcdrv->rtc);
  148. }
  149. static const struct of_device_id goldfish_rtc_of_match[] = {
  150. { .compatible = "google,goldfish-rtc", },
  151. {},
  152. };
  153. MODULE_DEVICE_TABLE(of, goldfish_rtc_of_match);
  154. static struct platform_driver goldfish_rtc = {
  155. .probe = goldfish_rtc_probe,
  156. .driver = {
  157. .name = "goldfish_rtc",
  158. .of_match_table = goldfish_rtc_of_match,
  159. }
  160. };
  161. module_platform_driver(goldfish_rtc);
  162. MODULE_LICENSE("GPL v2");