0001
0002
0003
0004
0005
0006 #include <linux/kernel.h>
0007 #include <linux/module.h>
0008 #include <linux/init.h>
0009 #include <linux/platform_device.h>
0010 #include <linux/spinlock.h>
0011 #include <linux/rtc.h>
0012 #include <linux/slab.h>
0013 #include <linux/io.h>
0014 #include <linux/of.h>
0015
0016
0017
0018
0019 #define LPC32XX_RTC_UCOUNT 0x00
0020 #define LPC32XX_RTC_DCOUNT 0x04
0021 #define LPC32XX_RTC_MATCH0 0x08
0022 #define LPC32XX_RTC_MATCH1 0x0C
0023 #define LPC32XX_RTC_CTRL 0x10
0024 #define LPC32XX_RTC_INTSTAT 0x14
0025 #define LPC32XX_RTC_KEY 0x18
0026 #define LPC32XX_RTC_SRAM 0x80
0027
0028 #define LPC32XX_RTC_CTRL_MATCH0 (1 << 0)
0029 #define LPC32XX_RTC_CTRL_MATCH1 (1 << 1)
0030 #define LPC32XX_RTC_CTRL_ONSW_MATCH0 (1 << 2)
0031 #define LPC32XX_RTC_CTRL_ONSW_MATCH1 (1 << 3)
0032 #define LPC32XX_RTC_CTRL_SW_RESET (1 << 4)
0033 #define LPC32XX_RTC_CTRL_CNTR_DIS (1 << 6)
0034 #define LPC32XX_RTC_CTRL_ONSW_FORCE_HI (1 << 7)
0035
0036 #define LPC32XX_RTC_INTSTAT_MATCH0 (1 << 0)
0037 #define LPC32XX_RTC_INTSTAT_MATCH1 (1 << 1)
0038 #define LPC32XX_RTC_INTSTAT_ONSW (1 << 2)
0039
0040 #define LPC32XX_RTC_KEY_ONSW_LOADVAL 0xB5C13F27
0041
0042 #define rtc_readl(dev, reg) \
0043 __raw_readl((dev)->rtc_base + (reg))
0044 #define rtc_writel(dev, reg, val) \
0045 __raw_writel((val), (dev)->rtc_base + (reg))
0046
0047 struct lpc32xx_rtc {
0048 void __iomem *rtc_base;
0049 int irq;
0050 unsigned char alarm_enabled;
0051 struct rtc_device *rtc;
0052 spinlock_t lock;
0053 };
0054
0055 static int lpc32xx_rtc_read_time(struct device *dev, struct rtc_time *time)
0056 {
0057 unsigned long elapsed_sec;
0058 struct lpc32xx_rtc *rtc = dev_get_drvdata(dev);
0059
0060 elapsed_sec = rtc_readl(rtc, LPC32XX_RTC_UCOUNT);
0061 rtc_time64_to_tm(elapsed_sec, time);
0062
0063 return 0;
0064 }
0065
0066 static int lpc32xx_rtc_set_time(struct device *dev, struct rtc_time *time)
0067 {
0068 struct lpc32xx_rtc *rtc = dev_get_drvdata(dev);
0069 u32 secs = rtc_tm_to_time64(time);
0070 u32 tmp;
0071
0072 spin_lock_irq(&rtc->lock);
0073
0074
0075 tmp = rtc_readl(rtc, LPC32XX_RTC_CTRL);
0076 rtc_writel(rtc, LPC32XX_RTC_CTRL, tmp | LPC32XX_RTC_CTRL_CNTR_DIS);
0077 rtc_writel(rtc, LPC32XX_RTC_UCOUNT, secs);
0078 rtc_writel(rtc, LPC32XX_RTC_DCOUNT, 0xFFFFFFFF - secs);
0079 rtc_writel(rtc, LPC32XX_RTC_CTRL, tmp &= ~LPC32XX_RTC_CTRL_CNTR_DIS);
0080
0081 spin_unlock_irq(&rtc->lock);
0082
0083 return 0;
0084 }
0085
0086 static int lpc32xx_rtc_read_alarm(struct device *dev,
0087 struct rtc_wkalrm *wkalrm)
0088 {
0089 struct lpc32xx_rtc *rtc = dev_get_drvdata(dev);
0090
0091 rtc_time64_to_tm(rtc_readl(rtc, LPC32XX_RTC_MATCH0), &wkalrm->time);
0092 wkalrm->enabled = rtc->alarm_enabled;
0093 wkalrm->pending = !!(rtc_readl(rtc, LPC32XX_RTC_INTSTAT) &
0094 LPC32XX_RTC_INTSTAT_MATCH0);
0095
0096 return rtc_valid_tm(&wkalrm->time);
0097 }
0098
0099 static int lpc32xx_rtc_set_alarm(struct device *dev,
0100 struct rtc_wkalrm *wkalrm)
0101 {
0102 struct lpc32xx_rtc *rtc = dev_get_drvdata(dev);
0103 unsigned long alarmsecs;
0104 u32 tmp;
0105
0106 alarmsecs = rtc_tm_to_time64(&wkalrm->time);
0107
0108 spin_lock_irq(&rtc->lock);
0109
0110
0111 tmp = rtc_readl(rtc, LPC32XX_RTC_CTRL);
0112 rtc_writel(rtc, LPC32XX_RTC_CTRL, tmp & ~LPC32XX_RTC_CTRL_MATCH0);
0113
0114 rtc_writel(rtc, LPC32XX_RTC_MATCH0, alarmsecs);
0115
0116 rtc->alarm_enabled = wkalrm->enabled;
0117 if (wkalrm->enabled) {
0118 rtc_writel(rtc, LPC32XX_RTC_INTSTAT,
0119 LPC32XX_RTC_INTSTAT_MATCH0);
0120 rtc_writel(rtc, LPC32XX_RTC_CTRL, tmp |
0121 LPC32XX_RTC_CTRL_MATCH0);
0122 }
0123
0124 spin_unlock_irq(&rtc->lock);
0125
0126 return 0;
0127 }
0128
0129 static int lpc32xx_rtc_alarm_irq_enable(struct device *dev,
0130 unsigned int enabled)
0131 {
0132 struct lpc32xx_rtc *rtc = dev_get_drvdata(dev);
0133 u32 tmp;
0134
0135 spin_lock_irq(&rtc->lock);
0136 tmp = rtc_readl(rtc, LPC32XX_RTC_CTRL);
0137
0138 if (enabled) {
0139 rtc->alarm_enabled = 1;
0140 tmp |= LPC32XX_RTC_CTRL_MATCH0;
0141 } else {
0142 rtc->alarm_enabled = 0;
0143 tmp &= ~LPC32XX_RTC_CTRL_MATCH0;
0144 }
0145
0146 rtc_writel(rtc, LPC32XX_RTC_CTRL, tmp);
0147 spin_unlock_irq(&rtc->lock);
0148
0149 return 0;
0150 }
0151
0152 static irqreturn_t lpc32xx_rtc_alarm_interrupt(int irq, void *dev)
0153 {
0154 struct lpc32xx_rtc *rtc = dev;
0155
0156 spin_lock(&rtc->lock);
0157
0158
0159 rtc_writel(rtc, LPC32XX_RTC_CTRL,
0160 rtc_readl(rtc, LPC32XX_RTC_CTRL) &
0161 ~LPC32XX_RTC_CTRL_MATCH0);
0162 rtc->alarm_enabled = 0;
0163
0164
0165
0166
0167
0168 rtc_writel(rtc, LPC32XX_RTC_MATCH0, 0xFFFFFFFF);
0169 rtc_writel(rtc, LPC32XX_RTC_INTSTAT, LPC32XX_RTC_INTSTAT_MATCH0);
0170
0171 spin_unlock(&rtc->lock);
0172
0173 rtc_update_irq(rtc->rtc, 1, RTC_IRQF | RTC_AF);
0174
0175 return IRQ_HANDLED;
0176 }
0177
0178 static const struct rtc_class_ops lpc32xx_rtc_ops = {
0179 .read_time = lpc32xx_rtc_read_time,
0180 .set_time = lpc32xx_rtc_set_time,
0181 .read_alarm = lpc32xx_rtc_read_alarm,
0182 .set_alarm = lpc32xx_rtc_set_alarm,
0183 .alarm_irq_enable = lpc32xx_rtc_alarm_irq_enable,
0184 };
0185
0186 static int lpc32xx_rtc_probe(struct platform_device *pdev)
0187 {
0188 struct lpc32xx_rtc *rtc;
0189 int err;
0190 u32 tmp;
0191
0192 rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL);
0193 if (unlikely(!rtc))
0194 return -ENOMEM;
0195
0196 rtc->rtc_base = devm_platform_ioremap_resource(pdev, 0);
0197 if (IS_ERR(rtc->rtc_base))
0198 return PTR_ERR(rtc->rtc_base);
0199
0200 spin_lock_init(&rtc->lock);
0201
0202
0203
0204
0205
0206
0207 tmp = rtc_readl(rtc, LPC32XX_RTC_CTRL);
0208 if (rtc_readl(rtc, LPC32XX_RTC_KEY) != LPC32XX_RTC_KEY_ONSW_LOADVAL) {
0209 tmp &= ~(LPC32XX_RTC_CTRL_SW_RESET |
0210 LPC32XX_RTC_CTRL_CNTR_DIS |
0211 LPC32XX_RTC_CTRL_MATCH0 |
0212 LPC32XX_RTC_CTRL_MATCH1 |
0213 LPC32XX_RTC_CTRL_ONSW_MATCH0 |
0214 LPC32XX_RTC_CTRL_ONSW_MATCH1 |
0215 LPC32XX_RTC_CTRL_ONSW_FORCE_HI);
0216 rtc_writel(rtc, LPC32XX_RTC_CTRL, tmp);
0217
0218
0219 rtc_writel(rtc, LPC32XX_RTC_MATCH0, 0xFFFFFFFF);
0220 rtc_writel(rtc, LPC32XX_RTC_INTSTAT,
0221 LPC32XX_RTC_INTSTAT_MATCH0 |
0222 LPC32XX_RTC_INTSTAT_MATCH1 |
0223 LPC32XX_RTC_INTSTAT_ONSW);
0224
0225
0226 rtc_writel(rtc, LPC32XX_RTC_KEY,
0227 LPC32XX_RTC_KEY_ONSW_LOADVAL);
0228 } else {
0229 rtc_writel(rtc, LPC32XX_RTC_CTRL,
0230 tmp & ~LPC32XX_RTC_CTRL_MATCH0);
0231 }
0232
0233 platform_set_drvdata(pdev, rtc);
0234
0235 rtc->rtc = devm_rtc_allocate_device(&pdev->dev);
0236 if (IS_ERR(rtc->rtc))
0237 return PTR_ERR(rtc->rtc);
0238
0239 rtc->rtc->ops = &lpc32xx_rtc_ops;
0240 rtc->rtc->range_max = U32_MAX;
0241
0242 err = devm_rtc_register_device(rtc->rtc);
0243 if (err)
0244 return err;
0245
0246
0247
0248
0249
0250 rtc->irq = platform_get_irq(pdev, 0);
0251 if (rtc->irq < 0) {
0252 dev_warn(&pdev->dev, "Can't get interrupt resource\n");
0253 } else {
0254 if (devm_request_irq(&pdev->dev, rtc->irq,
0255 lpc32xx_rtc_alarm_interrupt,
0256 0, pdev->name, rtc) < 0) {
0257 dev_warn(&pdev->dev, "Can't request interrupt.\n");
0258 rtc->irq = -1;
0259 } else {
0260 device_init_wakeup(&pdev->dev, 1);
0261 }
0262 }
0263
0264 return 0;
0265 }
0266
0267 #ifdef CONFIG_PM
0268 static int lpc32xx_rtc_suspend(struct device *dev)
0269 {
0270 struct lpc32xx_rtc *rtc = dev_get_drvdata(dev);
0271
0272 if (rtc->irq >= 0) {
0273 if (device_may_wakeup(dev))
0274 enable_irq_wake(rtc->irq);
0275 else
0276 disable_irq_wake(rtc->irq);
0277 }
0278
0279 return 0;
0280 }
0281
0282 static int lpc32xx_rtc_resume(struct device *dev)
0283 {
0284 struct lpc32xx_rtc *rtc = dev_get_drvdata(dev);
0285
0286 if (rtc->irq >= 0 && device_may_wakeup(dev))
0287 disable_irq_wake(rtc->irq);
0288
0289 return 0;
0290 }
0291
0292
0293 static int lpc32xx_rtc_freeze(struct device *dev)
0294 {
0295 struct lpc32xx_rtc *rtc = dev_get_drvdata(dev);
0296
0297 spin_lock_irq(&rtc->lock);
0298
0299 rtc_writel(rtc, LPC32XX_RTC_CTRL,
0300 rtc_readl(rtc, LPC32XX_RTC_CTRL) &
0301 ~LPC32XX_RTC_CTRL_MATCH0);
0302
0303 spin_unlock_irq(&rtc->lock);
0304
0305 return 0;
0306 }
0307
0308 static int lpc32xx_rtc_thaw(struct device *dev)
0309 {
0310 struct lpc32xx_rtc *rtc = dev_get_drvdata(dev);
0311
0312 if (rtc->alarm_enabled) {
0313 spin_lock_irq(&rtc->lock);
0314
0315 rtc_writel(rtc, LPC32XX_RTC_CTRL,
0316 rtc_readl(rtc, LPC32XX_RTC_CTRL) |
0317 LPC32XX_RTC_CTRL_MATCH0);
0318
0319 spin_unlock_irq(&rtc->lock);
0320 }
0321
0322 return 0;
0323 }
0324
0325 static const struct dev_pm_ops lpc32xx_rtc_pm_ops = {
0326 .suspend = lpc32xx_rtc_suspend,
0327 .resume = lpc32xx_rtc_resume,
0328 .freeze = lpc32xx_rtc_freeze,
0329 .thaw = lpc32xx_rtc_thaw,
0330 .restore = lpc32xx_rtc_resume
0331 };
0332
0333 #define LPC32XX_RTC_PM_OPS (&lpc32xx_rtc_pm_ops)
0334 #else
0335 #define LPC32XX_RTC_PM_OPS NULL
0336 #endif
0337
0338 #ifdef CONFIG_OF
0339 static const struct of_device_id lpc32xx_rtc_match[] = {
0340 { .compatible = "nxp,lpc3220-rtc" },
0341 { }
0342 };
0343 MODULE_DEVICE_TABLE(of, lpc32xx_rtc_match);
0344 #endif
0345
0346 static struct platform_driver lpc32xx_rtc_driver = {
0347 .probe = lpc32xx_rtc_probe,
0348 .driver = {
0349 .name = "rtc-lpc32xx",
0350 .pm = LPC32XX_RTC_PM_OPS,
0351 .of_match_table = of_match_ptr(lpc32xx_rtc_match),
0352 },
0353 };
0354
0355 module_platform_driver(lpc32xx_rtc_driver);
0356
0357 MODULE_AUTHOR("Kevin Wells <wellsk40@gmail.com");
0358 MODULE_DESCRIPTION("RTC driver for the LPC32xx SoC");
0359 MODULE_LICENSE("GPL");
0360 MODULE_ALIAS("platform:rtc-lpc32xx");