0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #include <linux/kernel.h>
0013 #include <linux/module.h>
0014 #include <linux/io.h>
0015 #include <linux/init.h>
0016 #include <linux/platform_device.h>
0017 #include <linux/interrupt.h>
0018 #include <linux/delay.h>
0019 #include <linux/rtc.h>
0020 #include <linux/slab.h>
0021 #include <linux/of_device.h>
0022 #include <linux/of.h>
0023 #include <linux/stmp_device.h>
0024 #include <linux/stmp3xxx_rtc_wdt.h>
0025
0026 #define STMP3XXX_RTC_CTRL 0x0
0027 #define STMP3XXX_RTC_CTRL_ALARM_IRQ_EN 0x00000001
0028 #define STMP3XXX_RTC_CTRL_ONEMSEC_IRQ_EN 0x00000002
0029 #define STMP3XXX_RTC_CTRL_ALARM_IRQ 0x00000004
0030 #define STMP3XXX_RTC_CTRL_WATCHDOGEN 0x00000010
0031
0032 #define STMP3XXX_RTC_STAT 0x10
0033 #define STMP3XXX_RTC_STAT_STALE_SHIFT 16
0034 #define STMP3XXX_RTC_STAT_RTC_PRESENT 0x80000000
0035 #define STMP3XXX_RTC_STAT_XTAL32000_PRESENT 0x10000000
0036 #define STMP3XXX_RTC_STAT_XTAL32768_PRESENT 0x08000000
0037
0038 #define STMP3XXX_RTC_SECONDS 0x30
0039
0040 #define STMP3XXX_RTC_ALARM 0x40
0041
0042 #define STMP3XXX_RTC_WATCHDOG 0x50
0043
0044 #define STMP3XXX_RTC_PERSISTENT0 0x60
0045 #define STMP3XXX_RTC_PERSISTENT0_CLOCKSOURCE (1 << 0)
0046 #define STMP3XXX_RTC_PERSISTENT0_ALARM_WAKE_EN (1 << 1)
0047 #define STMP3XXX_RTC_PERSISTENT0_ALARM_EN (1 << 2)
0048 #define STMP3XXX_RTC_PERSISTENT0_XTAL24MHZ_PWRUP (1 << 4)
0049 #define STMP3XXX_RTC_PERSISTENT0_XTAL32KHZ_PWRUP (1 << 5)
0050 #define STMP3XXX_RTC_PERSISTENT0_XTAL32_FREQ (1 << 6)
0051 #define STMP3XXX_RTC_PERSISTENT0_ALARM_WAKE (1 << 7)
0052
0053 #define STMP3XXX_RTC_PERSISTENT1 0x70
0054
0055 #define STMP3XXX_RTC_PERSISTENT1_FORCE_UPDATER 0x80000000
0056
0057 struct stmp3xxx_rtc_data {
0058 struct rtc_device *rtc;
0059 void __iomem *io;
0060 int irq_alarm;
0061 };
0062
0063 #if IS_ENABLED(CONFIG_STMP3XXX_RTC_WATCHDOG)
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078 static void stmp3xxx_wdt_set_timeout(struct device *dev, u32 timeout)
0079 {
0080 struct stmp3xxx_rtc_data *rtc_data = dev_get_drvdata(dev);
0081
0082 if (timeout) {
0083 writel(timeout, rtc_data->io + STMP3XXX_RTC_WATCHDOG);
0084 writel(STMP3XXX_RTC_CTRL_WATCHDOGEN,
0085 rtc_data->io + STMP3XXX_RTC_CTRL + STMP_OFFSET_REG_SET);
0086 writel(STMP3XXX_RTC_PERSISTENT1_FORCE_UPDATER,
0087 rtc_data->io + STMP3XXX_RTC_PERSISTENT1 + STMP_OFFSET_REG_SET);
0088 } else {
0089 writel(STMP3XXX_RTC_CTRL_WATCHDOGEN,
0090 rtc_data->io + STMP3XXX_RTC_CTRL + STMP_OFFSET_REG_CLR);
0091 writel(STMP3XXX_RTC_PERSISTENT1_FORCE_UPDATER,
0092 rtc_data->io + STMP3XXX_RTC_PERSISTENT1 + STMP_OFFSET_REG_CLR);
0093 }
0094 }
0095
0096 static struct stmp3xxx_wdt_pdata wdt_pdata = {
0097 .wdt_set_timeout = stmp3xxx_wdt_set_timeout,
0098 };
0099
0100 static void stmp3xxx_wdt_register(struct platform_device *rtc_pdev)
0101 {
0102 int rc = -1;
0103 struct platform_device *wdt_pdev =
0104 platform_device_alloc("stmp3xxx_rtc_wdt", rtc_pdev->id);
0105
0106 if (wdt_pdev) {
0107 wdt_pdev->dev.parent = &rtc_pdev->dev;
0108 wdt_pdev->dev.platform_data = &wdt_pdata;
0109 rc = platform_device_add(wdt_pdev);
0110 }
0111
0112 if (rc)
0113 dev_err(&rtc_pdev->dev,
0114 "failed to register stmp3xxx_rtc_wdt\n");
0115 }
0116 #else
0117 static void stmp3xxx_wdt_register(struct platform_device *rtc_pdev)
0118 {
0119 }
0120 #endif
0121
0122 static int stmp3xxx_wait_time(struct stmp3xxx_rtc_data *rtc_data)
0123 {
0124 int timeout = 5000;
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135 do {
0136 if (!(readl(rtc_data->io + STMP3XXX_RTC_STAT) &
0137 (0x80 << STMP3XXX_RTC_STAT_STALE_SHIFT)))
0138 return 0;
0139 udelay(1);
0140 } while (--timeout > 0);
0141 return (readl(rtc_data->io + STMP3XXX_RTC_STAT) &
0142 (0x80 << STMP3XXX_RTC_STAT_STALE_SHIFT)) ? -ETIME : 0;
0143 }
0144
0145
0146 static int stmp3xxx_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm)
0147 {
0148 int ret;
0149 struct stmp3xxx_rtc_data *rtc_data = dev_get_drvdata(dev);
0150
0151 ret = stmp3xxx_wait_time(rtc_data);
0152 if (ret)
0153 return ret;
0154
0155 rtc_time64_to_tm(readl(rtc_data->io + STMP3XXX_RTC_SECONDS), rtc_tm);
0156 return 0;
0157 }
0158
0159 static int stmp3xxx_rtc_settime(struct device *dev, struct rtc_time *rtc_tm)
0160 {
0161 struct stmp3xxx_rtc_data *rtc_data = dev_get_drvdata(dev);
0162
0163 writel(rtc_tm_to_time64(rtc_tm), rtc_data->io + STMP3XXX_RTC_SECONDS);
0164 return stmp3xxx_wait_time(rtc_data);
0165 }
0166
0167
0168 static irqreturn_t stmp3xxx_rtc_interrupt(int irq, void *dev_id)
0169 {
0170 struct stmp3xxx_rtc_data *rtc_data = dev_get_drvdata(dev_id);
0171 u32 status = readl(rtc_data->io + STMP3XXX_RTC_CTRL);
0172
0173 if (status & STMP3XXX_RTC_CTRL_ALARM_IRQ) {
0174 writel(STMP3XXX_RTC_CTRL_ALARM_IRQ,
0175 rtc_data->io + STMP3XXX_RTC_CTRL + STMP_OFFSET_REG_CLR);
0176 rtc_update_irq(rtc_data->rtc, 1, RTC_AF | RTC_IRQF);
0177 return IRQ_HANDLED;
0178 }
0179
0180 return IRQ_NONE;
0181 }
0182
0183 static int stmp3xxx_alarm_irq_enable(struct device *dev, unsigned int enabled)
0184 {
0185 struct stmp3xxx_rtc_data *rtc_data = dev_get_drvdata(dev);
0186
0187 if (enabled) {
0188 writel(STMP3XXX_RTC_PERSISTENT0_ALARM_EN |
0189 STMP3XXX_RTC_PERSISTENT0_ALARM_WAKE_EN,
0190 rtc_data->io + STMP3XXX_RTC_PERSISTENT0 +
0191 STMP_OFFSET_REG_SET);
0192 writel(STMP3XXX_RTC_CTRL_ALARM_IRQ_EN,
0193 rtc_data->io + STMP3XXX_RTC_CTRL + STMP_OFFSET_REG_SET);
0194 } else {
0195 writel(STMP3XXX_RTC_PERSISTENT0_ALARM_EN |
0196 STMP3XXX_RTC_PERSISTENT0_ALARM_WAKE_EN,
0197 rtc_data->io + STMP3XXX_RTC_PERSISTENT0 +
0198 STMP_OFFSET_REG_CLR);
0199 writel(STMP3XXX_RTC_CTRL_ALARM_IRQ_EN,
0200 rtc_data->io + STMP3XXX_RTC_CTRL + STMP_OFFSET_REG_CLR);
0201 }
0202 return 0;
0203 }
0204
0205 static int stmp3xxx_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alm)
0206 {
0207 struct stmp3xxx_rtc_data *rtc_data = dev_get_drvdata(dev);
0208
0209 rtc_time64_to_tm(readl(rtc_data->io + STMP3XXX_RTC_ALARM), &alm->time);
0210 return 0;
0211 }
0212
0213 static int stmp3xxx_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alm)
0214 {
0215 struct stmp3xxx_rtc_data *rtc_data = dev_get_drvdata(dev);
0216
0217 writel(rtc_tm_to_time64(&alm->time), rtc_data->io + STMP3XXX_RTC_ALARM);
0218
0219 stmp3xxx_alarm_irq_enable(dev, alm->enabled);
0220
0221 return 0;
0222 }
0223
0224 static const struct rtc_class_ops stmp3xxx_rtc_ops = {
0225 .alarm_irq_enable =
0226 stmp3xxx_alarm_irq_enable,
0227 .read_time = stmp3xxx_rtc_gettime,
0228 .set_time = stmp3xxx_rtc_settime,
0229 .read_alarm = stmp3xxx_rtc_read_alarm,
0230 .set_alarm = stmp3xxx_rtc_set_alarm,
0231 };
0232
0233 static int stmp3xxx_rtc_remove(struct platform_device *pdev)
0234 {
0235 struct stmp3xxx_rtc_data *rtc_data = platform_get_drvdata(pdev);
0236
0237 if (!rtc_data)
0238 return 0;
0239
0240 writel(STMP3XXX_RTC_CTRL_ALARM_IRQ_EN,
0241 rtc_data->io + STMP3XXX_RTC_CTRL + STMP_OFFSET_REG_CLR);
0242
0243 return 0;
0244 }
0245
0246 static int stmp3xxx_rtc_probe(struct platform_device *pdev)
0247 {
0248 struct stmp3xxx_rtc_data *rtc_data;
0249 struct resource *r;
0250 u32 rtc_stat;
0251 u32 pers0_set, pers0_clr;
0252 u32 crystalfreq = 0;
0253 int err;
0254
0255 rtc_data = devm_kzalloc(&pdev->dev, sizeof(*rtc_data), GFP_KERNEL);
0256 if (!rtc_data)
0257 return -ENOMEM;
0258
0259 r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
0260 if (!r) {
0261 dev_err(&pdev->dev, "failed to get resource\n");
0262 return -ENXIO;
0263 }
0264
0265 rtc_data->io = devm_ioremap(&pdev->dev, r->start, resource_size(r));
0266 if (!rtc_data->io) {
0267 dev_err(&pdev->dev, "ioremap failed\n");
0268 return -EIO;
0269 }
0270
0271 rtc_data->irq_alarm = platform_get_irq(pdev, 0);
0272
0273 rtc_stat = readl(rtc_data->io + STMP3XXX_RTC_STAT);
0274 if (!(rtc_stat & STMP3XXX_RTC_STAT_RTC_PRESENT)) {
0275 dev_err(&pdev->dev, "no device onboard\n");
0276 return -ENODEV;
0277 }
0278
0279 platform_set_drvdata(pdev, rtc_data);
0280
0281
0282
0283
0284
0285
0286 if (readl(rtc_data->io + STMP3XXX_RTC_CTRL) &
0287 STMP3XXX_RTC_CTRL_WATCHDOGEN) {
0288 dev_info(&pdev->dev,
0289 "Watchdog is running, skip resetting rtc\n");
0290 } else {
0291 err = stmp_reset_block(rtc_data->io);
0292 if (err) {
0293 dev_err(&pdev->dev, "stmp_reset_block failed: %d\n",
0294 err);
0295 return err;
0296 }
0297 }
0298
0299
0300
0301
0302
0303
0304
0305
0306
0307
0308 if (rtc_stat & STMP3XXX_RTC_STAT_XTAL32000_PRESENT)
0309 crystalfreq = 32000;
0310 else if (rtc_stat & STMP3XXX_RTC_STAT_XTAL32768_PRESENT)
0311 crystalfreq = 32768;
0312
0313 of_property_read_u32(pdev->dev.of_node, "stmp,crystal-freq",
0314 &crystalfreq);
0315
0316 switch (crystalfreq) {
0317 case 32000:
0318
0319 pers0_set = STMP3XXX_RTC_PERSISTENT0_XTAL32_FREQ |
0320 STMP3XXX_RTC_PERSISTENT0_XTAL32KHZ_PWRUP |
0321 STMP3XXX_RTC_PERSISTENT0_CLOCKSOURCE;
0322 pers0_clr = STMP3XXX_RTC_PERSISTENT0_XTAL24MHZ_PWRUP;
0323 break;
0324 case 32768:
0325
0326 pers0_set = STMP3XXX_RTC_PERSISTENT0_XTAL32KHZ_PWRUP |
0327 STMP3XXX_RTC_PERSISTENT0_CLOCKSOURCE;
0328 pers0_clr = STMP3XXX_RTC_PERSISTENT0_XTAL24MHZ_PWRUP |
0329 STMP3XXX_RTC_PERSISTENT0_XTAL32_FREQ;
0330 break;
0331 default:
0332 dev_warn(&pdev->dev,
0333 "invalid crystal-freq specified in device-tree. Assuming no crystal\n");
0334 fallthrough;
0335 case 0:
0336
0337 pers0_set = STMP3XXX_RTC_PERSISTENT0_XTAL24MHZ_PWRUP;
0338 pers0_clr = STMP3XXX_RTC_PERSISTENT0_XTAL32KHZ_PWRUP |
0339 STMP3XXX_RTC_PERSISTENT0_CLOCKSOURCE;
0340 }
0341
0342 writel(pers0_set, rtc_data->io + STMP3XXX_RTC_PERSISTENT0 +
0343 STMP_OFFSET_REG_SET);
0344
0345 writel(STMP3XXX_RTC_PERSISTENT0_ALARM_EN |
0346 STMP3XXX_RTC_PERSISTENT0_ALARM_WAKE_EN |
0347 STMP3XXX_RTC_PERSISTENT0_ALARM_WAKE | pers0_clr,
0348 rtc_data->io + STMP3XXX_RTC_PERSISTENT0 + STMP_OFFSET_REG_CLR);
0349
0350 writel(STMP3XXX_RTC_CTRL_ONEMSEC_IRQ_EN |
0351 STMP3XXX_RTC_CTRL_ALARM_IRQ_EN,
0352 rtc_data->io + STMP3XXX_RTC_CTRL + STMP_OFFSET_REG_CLR);
0353
0354 rtc_data->rtc = devm_rtc_allocate_device(&pdev->dev);
0355 if (IS_ERR(rtc_data->rtc))
0356 return PTR_ERR(rtc_data->rtc);
0357
0358 err = devm_request_irq(&pdev->dev, rtc_data->irq_alarm,
0359 stmp3xxx_rtc_interrupt, 0, "RTC alarm", &pdev->dev);
0360 if (err) {
0361 dev_err(&pdev->dev, "Cannot claim IRQ%d\n",
0362 rtc_data->irq_alarm);
0363 return err;
0364 }
0365
0366 rtc_data->rtc->ops = &stmp3xxx_rtc_ops;
0367 rtc_data->rtc->range_max = U32_MAX;
0368
0369 err = devm_rtc_register_device(rtc_data->rtc);
0370 if (err)
0371 return err;
0372
0373 stmp3xxx_wdt_register(pdev);
0374 return 0;
0375 }
0376
0377 #ifdef CONFIG_PM_SLEEP
0378 static int stmp3xxx_rtc_suspend(struct device *dev)
0379 {
0380 return 0;
0381 }
0382
0383 static int stmp3xxx_rtc_resume(struct device *dev)
0384 {
0385 struct stmp3xxx_rtc_data *rtc_data = dev_get_drvdata(dev);
0386
0387 stmp_reset_block(rtc_data->io);
0388 writel(STMP3XXX_RTC_PERSISTENT0_ALARM_EN |
0389 STMP3XXX_RTC_PERSISTENT0_ALARM_WAKE_EN |
0390 STMP3XXX_RTC_PERSISTENT0_ALARM_WAKE,
0391 rtc_data->io + STMP3XXX_RTC_PERSISTENT0 + STMP_OFFSET_REG_CLR);
0392 return 0;
0393 }
0394 #endif
0395
0396 static SIMPLE_DEV_PM_OPS(stmp3xxx_rtc_pm_ops, stmp3xxx_rtc_suspend,
0397 stmp3xxx_rtc_resume);
0398
0399 static const struct of_device_id rtc_dt_ids[] = {
0400 { .compatible = "fsl,stmp3xxx-rtc", },
0401 { }
0402 };
0403 MODULE_DEVICE_TABLE(of, rtc_dt_ids);
0404
0405 static struct platform_driver stmp3xxx_rtcdrv = {
0406 .probe = stmp3xxx_rtc_probe,
0407 .remove = stmp3xxx_rtc_remove,
0408 .driver = {
0409 .name = "stmp3xxx-rtc",
0410 .pm = &stmp3xxx_rtc_pm_ops,
0411 .of_match_table = rtc_dt_ids,
0412 },
0413 };
0414
0415 module_platform_driver(stmp3xxx_rtcdrv);
0416
0417 MODULE_DESCRIPTION("STMP3xxx RTC Driver");
0418 MODULE_AUTHOR("dmitry pervushin <dpervushin@embeddedalley.com> and "
0419 "Wolfram Sang <kernel@pengutronix.de>");
0420 MODULE_LICENSE("GPL");