0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/init.h>
0009 #include <linux/platform_device.h>
0010 #include <linux/module.h>
0011 #include <linux/rtc.h>
0012 #include <linux/seq_file.h>
0013 #include <linux/interrupt.h>
0014 #include <linux/io.h>
0015 #include <linux/slab.h>
0016 #include <linux/of.h>
0017 #include <linux/of_device.h>
0018
0019 #include "rtc-sa1100.h"
0020
0021 #define RTC_DEF_DIVIDER (32768 - 1)
0022 #define RTC_DEF_TRIM 0
0023 #define MAXFREQ_PERIODIC 1000
0024
0025
0026
0027
0028 #define RTSR_PICE (1 << 15)
0029 #define RTSR_PIALE (1 << 14)
0030 #define RTSR_PIAL (1 << 13)
0031 #define RTSR_SWALE2 (1 << 11)
0032 #define RTSR_SWAL2 (1 << 10)
0033 #define RTSR_SWALE1 (1 << 9)
0034 #define RTSR_SWAL1 (1 << 8)
0035 #define RTSR_RDALE2 (1 << 7)
0036 #define RTSR_RDAL2 (1 << 6)
0037 #define RTSR_RDALE1 (1 << 5)
0038 #define RTSR_RDAL1 (1 << 4)
0039 #define RTSR_HZE (1 << 3)
0040 #define RTSR_ALE (1 << 2)
0041 #define RTSR_HZ (1 << 1)
0042 #define RTSR_AL (1 << 0)
0043 #define RTSR_TRIG_MASK (RTSR_AL | RTSR_HZ | RTSR_RDAL1 | RTSR_RDAL2\
0044 | RTSR_SWAL1 | RTSR_SWAL2)
0045 #define RYxR_YEAR_S 9
0046 #define RYxR_YEAR_MASK (0xfff << RYxR_YEAR_S)
0047 #define RYxR_MONTH_S 5
0048 #define RYxR_MONTH_MASK (0xf << RYxR_MONTH_S)
0049 #define RYxR_DAY_MASK 0x1f
0050 #define RDxR_WOM_S 20
0051 #define RDxR_WOM_MASK (0x7 << RDxR_WOM_S)
0052 #define RDxR_DOW_S 17
0053 #define RDxR_DOW_MASK (0x7 << RDxR_DOW_S)
0054 #define RDxR_HOUR_S 12
0055 #define RDxR_HOUR_MASK (0x1f << RDxR_HOUR_S)
0056 #define RDxR_MIN_S 6
0057 #define RDxR_MIN_MASK (0x3f << RDxR_MIN_S)
0058 #define RDxR_SEC_MASK 0x3f
0059
0060 #define RTSR 0x08
0061 #define RTTR 0x0c
0062 #define RDCR 0x10
0063 #define RYCR 0x14
0064 #define RDAR1 0x18
0065 #define RYAR1 0x1c
0066 #define RTCPICR 0x34
0067 #define PIAR 0x38
0068
0069 #define rtc_readl(pxa_rtc, reg) \
0070 __raw_readl((pxa_rtc)->base + (reg))
0071 #define rtc_writel(pxa_rtc, reg, value) \
0072 __raw_writel((value), (pxa_rtc)->base + (reg))
0073
0074 struct pxa_rtc {
0075 struct sa1100_rtc sa1100_rtc;
0076 struct resource *ress;
0077 void __iomem *base;
0078 struct rtc_device *rtc;
0079 spinlock_t lock;
0080 };
0081
0082
0083 static u32 ryxr_calc(struct rtc_time *tm)
0084 {
0085 return ((tm->tm_year + 1900) << RYxR_YEAR_S)
0086 | ((tm->tm_mon + 1) << RYxR_MONTH_S)
0087 | tm->tm_mday;
0088 }
0089
0090 static u32 rdxr_calc(struct rtc_time *tm)
0091 {
0092 return ((((tm->tm_mday + 6) / 7) << RDxR_WOM_S) & RDxR_WOM_MASK)
0093 | (((tm->tm_wday + 1) << RDxR_DOW_S) & RDxR_DOW_MASK)
0094 | (tm->tm_hour << RDxR_HOUR_S)
0095 | (tm->tm_min << RDxR_MIN_S)
0096 | tm->tm_sec;
0097 }
0098
0099 static void tm_calc(u32 rycr, u32 rdcr, struct rtc_time *tm)
0100 {
0101 tm->tm_year = ((rycr & RYxR_YEAR_MASK) >> RYxR_YEAR_S) - 1900;
0102 tm->tm_mon = (((rycr & RYxR_MONTH_MASK) >> RYxR_MONTH_S)) - 1;
0103 tm->tm_mday = (rycr & RYxR_DAY_MASK);
0104 tm->tm_wday = ((rycr & RDxR_DOW_MASK) >> RDxR_DOW_S) - 1;
0105 tm->tm_hour = (rdcr & RDxR_HOUR_MASK) >> RDxR_HOUR_S;
0106 tm->tm_min = (rdcr & RDxR_MIN_MASK) >> RDxR_MIN_S;
0107 tm->tm_sec = rdcr & RDxR_SEC_MASK;
0108 }
0109
0110 static void rtsr_clear_bits(struct pxa_rtc *pxa_rtc, u32 mask)
0111 {
0112 u32 rtsr;
0113
0114 rtsr = rtc_readl(pxa_rtc, RTSR);
0115 rtsr &= ~RTSR_TRIG_MASK;
0116 rtsr &= ~mask;
0117 rtc_writel(pxa_rtc, RTSR, rtsr);
0118 }
0119
0120 static void rtsr_set_bits(struct pxa_rtc *pxa_rtc, u32 mask)
0121 {
0122 u32 rtsr;
0123
0124 rtsr = rtc_readl(pxa_rtc, RTSR);
0125 rtsr &= ~RTSR_TRIG_MASK;
0126 rtsr |= mask;
0127 rtc_writel(pxa_rtc, RTSR, rtsr);
0128 }
0129
0130 static irqreturn_t pxa_rtc_irq(int irq, void *dev_id)
0131 {
0132 struct pxa_rtc *pxa_rtc = dev_get_drvdata(dev_id);
0133 u32 rtsr;
0134 unsigned long events = 0;
0135
0136 spin_lock(&pxa_rtc->lock);
0137
0138
0139 rtsr = rtc_readl(pxa_rtc, RTSR);
0140 rtc_writel(pxa_rtc, RTSR, rtsr);
0141
0142
0143 rtsr_clear_bits(pxa_rtc, RTSR_RDALE1 | RTSR_PIALE | RTSR_HZE);
0144
0145
0146 if (rtsr & RTSR_RDAL1)
0147 rtsr &= ~RTSR_RDALE1;
0148
0149
0150 if (rtsr & RTSR_RDAL1)
0151 events |= RTC_AF | RTC_IRQF;
0152 if (rtsr & RTSR_HZ)
0153 events |= RTC_UF | RTC_IRQF;
0154 if (rtsr & RTSR_PIAL)
0155 events |= RTC_PF | RTC_IRQF;
0156
0157 rtc_update_irq(pxa_rtc->rtc, 1, events);
0158
0159
0160 rtc_writel(pxa_rtc, RTSR, rtsr & ~RTSR_TRIG_MASK);
0161
0162 spin_unlock(&pxa_rtc->lock);
0163 return IRQ_HANDLED;
0164 }
0165
0166 static int pxa_rtc_open(struct device *dev)
0167 {
0168 struct pxa_rtc *pxa_rtc = dev_get_drvdata(dev);
0169 int ret;
0170
0171 ret = request_irq(pxa_rtc->sa1100_rtc.irq_1hz, pxa_rtc_irq, 0,
0172 "rtc 1Hz", dev);
0173 if (ret < 0) {
0174 dev_err(dev, "can't get irq %i, err %d\n",
0175 pxa_rtc->sa1100_rtc.irq_1hz, ret);
0176 goto err_irq_1Hz;
0177 }
0178 ret = request_irq(pxa_rtc->sa1100_rtc.irq_alarm, pxa_rtc_irq, 0,
0179 "rtc Alrm", dev);
0180 if (ret < 0) {
0181 dev_err(dev, "can't get irq %i, err %d\n",
0182 pxa_rtc->sa1100_rtc.irq_alarm, ret);
0183 goto err_irq_Alrm;
0184 }
0185
0186 return 0;
0187
0188 err_irq_Alrm:
0189 free_irq(pxa_rtc->sa1100_rtc.irq_1hz, dev);
0190 err_irq_1Hz:
0191 return ret;
0192 }
0193
0194 static void pxa_rtc_release(struct device *dev)
0195 {
0196 struct pxa_rtc *pxa_rtc = dev_get_drvdata(dev);
0197
0198 spin_lock_irq(&pxa_rtc->lock);
0199 rtsr_clear_bits(pxa_rtc, RTSR_PIALE | RTSR_RDALE1 | RTSR_HZE);
0200 spin_unlock_irq(&pxa_rtc->lock);
0201
0202 free_irq(pxa_rtc->sa1100_rtc.irq_1hz, dev);
0203 free_irq(pxa_rtc->sa1100_rtc.irq_alarm, dev);
0204 }
0205
0206 static int pxa_alarm_irq_enable(struct device *dev, unsigned int enabled)
0207 {
0208 struct pxa_rtc *pxa_rtc = dev_get_drvdata(dev);
0209
0210 spin_lock_irq(&pxa_rtc->lock);
0211
0212 if (enabled)
0213 rtsr_set_bits(pxa_rtc, RTSR_RDALE1);
0214 else
0215 rtsr_clear_bits(pxa_rtc, RTSR_RDALE1);
0216
0217 spin_unlock_irq(&pxa_rtc->lock);
0218 return 0;
0219 }
0220
0221 static int pxa_rtc_read_time(struct device *dev, struct rtc_time *tm)
0222 {
0223 struct pxa_rtc *pxa_rtc = dev_get_drvdata(dev);
0224 u32 rycr, rdcr;
0225
0226 rycr = rtc_readl(pxa_rtc, RYCR);
0227 rdcr = rtc_readl(pxa_rtc, RDCR);
0228
0229 tm_calc(rycr, rdcr, tm);
0230 return 0;
0231 }
0232
0233 static int pxa_rtc_set_time(struct device *dev, struct rtc_time *tm)
0234 {
0235 struct pxa_rtc *pxa_rtc = dev_get_drvdata(dev);
0236
0237 rtc_writel(pxa_rtc, RYCR, ryxr_calc(tm));
0238 rtc_writel(pxa_rtc, RDCR, rdxr_calc(tm));
0239
0240 return 0;
0241 }
0242
0243 static int pxa_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
0244 {
0245 struct pxa_rtc *pxa_rtc = dev_get_drvdata(dev);
0246 u32 rtsr, ryar, rdar;
0247
0248 ryar = rtc_readl(pxa_rtc, RYAR1);
0249 rdar = rtc_readl(pxa_rtc, RDAR1);
0250 tm_calc(ryar, rdar, &alrm->time);
0251
0252 rtsr = rtc_readl(pxa_rtc, RTSR);
0253 alrm->enabled = (rtsr & RTSR_RDALE1) ? 1 : 0;
0254 alrm->pending = (rtsr & RTSR_RDAL1) ? 1 : 0;
0255 return 0;
0256 }
0257
0258 static int pxa_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
0259 {
0260 struct pxa_rtc *pxa_rtc = dev_get_drvdata(dev);
0261 u32 rtsr;
0262
0263 spin_lock_irq(&pxa_rtc->lock);
0264
0265 rtc_writel(pxa_rtc, RYAR1, ryxr_calc(&alrm->time));
0266 rtc_writel(pxa_rtc, RDAR1, rdxr_calc(&alrm->time));
0267
0268 rtsr = rtc_readl(pxa_rtc, RTSR);
0269 if (alrm->enabled)
0270 rtsr |= RTSR_RDALE1;
0271 else
0272 rtsr &= ~RTSR_RDALE1;
0273 rtc_writel(pxa_rtc, RTSR, rtsr);
0274
0275 spin_unlock_irq(&pxa_rtc->lock);
0276
0277 return 0;
0278 }
0279
0280 static int pxa_rtc_proc(struct device *dev, struct seq_file *seq)
0281 {
0282 struct pxa_rtc *pxa_rtc = dev_get_drvdata(dev);
0283
0284 seq_printf(seq, "trim/divider\t: 0x%08x\n", rtc_readl(pxa_rtc, RTTR));
0285 seq_printf(seq, "update_IRQ\t: %s\n",
0286 (rtc_readl(pxa_rtc, RTSR) & RTSR_HZE) ? "yes" : "no");
0287 seq_printf(seq, "periodic_IRQ\t: %s\n",
0288 (rtc_readl(pxa_rtc, RTSR) & RTSR_PIALE) ? "yes" : "no");
0289 seq_printf(seq, "periodic_freq\t: %u\n", rtc_readl(pxa_rtc, PIAR));
0290
0291 return 0;
0292 }
0293
0294 static const struct rtc_class_ops pxa_rtc_ops = {
0295 .read_time = pxa_rtc_read_time,
0296 .set_time = pxa_rtc_set_time,
0297 .read_alarm = pxa_rtc_read_alarm,
0298 .set_alarm = pxa_rtc_set_alarm,
0299 .alarm_irq_enable = pxa_alarm_irq_enable,
0300 .proc = pxa_rtc_proc,
0301 };
0302
0303 static int __init pxa_rtc_probe(struct platform_device *pdev)
0304 {
0305 struct device *dev = &pdev->dev;
0306 struct pxa_rtc *pxa_rtc;
0307 struct sa1100_rtc *sa1100_rtc;
0308 int ret;
0309
0310 pxa_rtc = devm_kzalloc(dev, sizeof(*pxa_rtc), GFP_KERNEL);
0311 if (!pxa_rtc)
0312 return -ENOMEM;
0313 sa1100_rtc = &pxa_rtc->sa1100_rtc;
0314
0315 spin_lock_init(&pxa_rtc->lock);
0316 platform_set_drvdata(pdev, pxa_rtc);
0317
0318 pxa_rtc->ress = platform_get_resource(pdev, IORESOURCE_MEM, 0);
0319 if (!pxa_rtc->ress) {
0320 dev_err(dev, "No I/O memory resource defined\n");
0321 return -ENXIO;
0322 }
0323
0324 sa1100_rtc->irq_1hz = platform_get_irq(pdev, 0);
0325 if (sa1100_rtc->irq_1hz < 0)
0326 return -ENXIO;
0327 sa1100_rtc->irq_alarm = platform_get_irq(pdev, 1);
0328 if (sa1100_rtc->irq_alarm < 0)
0329 return -ENXIO;
0330
0331 sa1100_rtc->rtc = devm_rtc_allocate_device(&pdev->dev);
0332 if (IS_ERR(sa1100_rtc->rtc))
0333 return PTR_ERR(sa1100_rtc->rtc);
0334
0335 pxa_rtc->base = devm_ioremap(dev, pxa_rtc->ress->start,
0336 resource_size(pxa_rtc->ress));
0337 if (!pxa_rtc->base) {
0338 dev_err(dev, "Unable to map pxa RTC I/O memory\n");
0339 return -ENOMEM;
0340 }
0341
0342 pxa_rtc_open(dev);
0343
0344 sa1100_rtc->rcnr = pxa_rtc->base + 0x0;
0345 sa1100_rtc->rtsr = pxa_rtc->base + 0x8;
0346 sa1100_rtc->rtar = pxa_rtc->base + 0x4;
0347 sa1100_rtc->rttr = pxa_rtc->base + 0xc;
0348 ret = sa1100_rtc_init(pdev, sa1100_rtc);
0349 if (ret) {
0350 dev_err(dev, "Unable to init SA1100 RTC sub-device\n");
0351 return ret;
0352 }
0353
0354 rtsr_clear_bits(pxa_rtc, RTSR_PIALE | RTSR_RDALE1 | RTSR_HZE);
0355
0356 pxa_rtc->rtc = devm_rtc_device_register(&pdev->dev, "pxa-rtc",
0357 &pxa_rtc_ops, THIS_MODULE);
0358 if (IS_ERR(pxa_rtc->rtc)) {
0359 ret = PTR_ERR(pxa_rtc->rtc);
0360 dev_err(dev, "Failed to register RTC device -> %d\n", ret);
0361 return ret;
0362 }
0363
0364 device_init_wakeup(dev, 1);
0365
0366 return 0;
0367 }
0368
0369 static int __exit pxa_rtc_remove(struct platform_device *pdev)
0370 {
0371 struct device *dev = &pdev->dev;
0372
0373 pxa_rtc_release(dev);
0374 return 0;
0375 }
0376
0377 #ifdef CONFIG_OF
0378 static const struct of_device_id pxa_rtc_dt_ids[] = {
0379 { .compatible = "marvell,pxa-rtc" },
0380 {}
0381 };
0382 MODULE_DEVICE_TABLE(of, pxa_rtc_dt_ids);
0383 #endif
0384
0385 #ifdef CONFIG_PM_SLEEP
0386 static int pxa_rtc_suspend(struct device *dev)
0387 {
0388 struct pxa_rtc *pxa_rtc = dev_get_drvdata(dev);
0389
0390 if (device_may_wakeup(dev))
0391 enable_irq_wake(pxa_rtc->sa1100_rtc.irq_alarm);
0392 return 0;
0393 }
0394
0395 static int pxa_rtc_resume(struct device *dev)
0396 {
0397 struct pxa_rtc *pxa_rtc = dev_get_drvdata(dev);
0398
0399 if (device_may_wakeup(dev))
0400 disable_irq_wake(pxa_rtc->sa1100_rtc.irq_alarm);
0401 return 0;
0402 }
0403 #endif
0404
0405 static SIMPLE_DEV_PM_OPS(pxa_rtc_pm_ops, pxa_rtc_suspend, pxa_rtc_resume);
0406
0407 static struct platform_driver pxa_rtc_driver = {
0408 .remove = __exit_p(pxa_rtc_remove),
0409 .driver = {
0410 .name = "pxa-rtc",
0411 .of_match_table = of_match_ptr(pxa_rtc_dt_ids),
0412 .pm = &pxa_rtc_pm_ops,
0413 },
0414 };
0415
0416 module_platform_driver_probe(pxa_rtc_driver, pxa_rtc_probe);
0417
0418 MODULE_AUTHOR("Robert Jarzmik <robert.jarzmik@free.fr>");
0419 MODULE_DESCRIPTION("PXA27x/PXA3xx Realtime Clock Driver (RTC)");
0420 MODULE_LICENSE("GPL");
0421 MODULE_ALIAS("platform:pxa-rtc");