diff options
Diffstat (limited to 'drivers/rtc')
39 files changed, 764 insertions, 540 deletions
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index db933decc39c..2e565f8e5165 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig | |||
@@ -573,6 +573,18 @@ config RTC_DRV_DS1305 | |||
573 | This driver can also be built as a module. If so, the module | 573 | This driver can also be built as a module. If so, the module |
574 | will be called rtc-ds1305. | 574 | will be called rtc-ds1305. |
575 | 575 | ||
576 | config RTC_DRV_DS1347 | ||
577 | tristate "Dallas/Maxim DS1347" | ||
578 | help | ||
579 | If you say yes here you get support for the | ||
580 | Dallas/Maxim DS1347 chips. | ||
581 | |||
582 | This driver only supports the RTC feature, and not other chip | ||
583 | features such as alarms. | ||
584 | |||
585 | This driver can also be built as a module. If so, the module | ||
586 | will be called rtc-ds1347. | ||
587 | |||
576 | config RTC_DRV_DS1390 | 588 | config RTC_DRV_DS1390 |
577 | tristate "Dallas/Maxim DS1390/93/94" | 589 | tristate "Dallas/Maxim DS1390/93/94" |
578 | help | 590 | help |
diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile index b427bf7dd20d..40a09915c8f6 100644 --- a/drivers/rtc/Makefile +++ b/drivers/rtc/Makefile | |||
@@ -40,6 +40,7 @@ obj-$(CONFIG_RTC_DRV_DS1286) += rtc-ds1286.o | |||
40 | obj-$(CONFIG_RTC_DRV_DS1302) += rtc-ds1302.o | 40 | obj-$(CONFIG_RTC_DRV_DS1302) += rtc-ds1302.o |
41 | obj-$(CONFIG_RTC_DRV_DS1305) += rtc-ds1305.o | 41 | obj-$(CONFIG_RTC_DRV_DS1305) += rtc-ds1305.o |
42 | obj-$(CONFIG_RTC_DRV_DS1307) += rtc-ds1307.o | 42 | obj-$(CONFIG_RTC_DRV_DS1307) += rtc-ds1307.o |
43 | obj-$(CONFIG_RTC_DRV_DS1347) += rtc-ds1347.o | ||
43 | obj-$(CONFIG_RTC_DRV_DS1374) += rtc-ds1374.o | 44 | obj-$(CONFIG_RTC_DRV_DS1374) += rtc-ds1374.o |
44 | obj-$(CONFIG_RTC_DRV_DS1390) += rtc-ds1390.o | 45 | obj-$(CONFIG_RTC_DRV_DS1390) += rtc-ds1390.o |
45 | obj-$(CONFIG_RTC_DRV_DS1511) += rtc-ds1511.o | 46 | obj-$(CONFIG_RTC_DRV_DS1511) += rtc-ds1511.o |
diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c index 544be722937c..c2eff6082363 100644 --- a/drivers/rtc/interface.c +++ b/drivers/rtc/interface.c | |||
@@ -584,6 +584,9 @@ enum hrtimer_restart rtc_pie_update_irq(struct hrtimer *timer) | |||
584 | void rtc_update_irq(struct rtc_device *rtc, | 584 | void rtc_update_irq(struct rtc_device *rtc, |
585 | unsigned long num, unsigned long events) | 585 | unsigned long num, unsigned long events) |
586 | { | 586 | { |
587 | if (unlikely(IS_ERR_OR_NULL(rtc))) | ||
588 | return; | ||
589 | |||
587 | pm_stay_awake(rtc->dev.parent); | 590 | pm_stay_awake(rtc->dev.parent); |
588 | schedule_work(&rtc->irqwork); | 591 | schedule_work(&rtc->irqwork); |
589 | } | 592 | } |
diff --git a/drivers/rtc/rtc-as3722.c b/drivers/rtc/rtc-as3722.c index 4af016985890..9f38eda69154 100644 --- a/drivers/rtc/rtc-as3722.c +++ b/drivers/rtc/rtc-as3722.c | |||
@@ -242,9 +242,8 @@ static int as3722_rtc_resume(struct device *dev) | |||
242 | } | 242 | } |
243 | #endif | 243 | #endif |
244 | 244 | ||
245 | static const struct dev_pm_ops as3722_rtc_pm_ops = { | 245 | static SIMPLE_DEV_PM_OPS(as3722_rtc_pm_ops, as3722_rtc_suspend, |
246 | SET_SYSTEM_SLEEP_PM_OPS(as3722_rtc_suspend, as3722_rtc_resume) | 246 | as3722_rtc_resume); |
247 | }; | ||
248 | 247 | ||
249 | static struct platform_driver as3722_rtc_driver = { | 248 | static struct platform_driver as3722_rtc_driver = { |
250 | .probe = as3722_rtc_probe, | 249 | .probe = as3722_rtc_probe, |
diff --git a/drivers/rtc/rtc-at32ap700x.c b/drivers/rtc/rtc-at32ap700x.c index 3161ab5263ed..aee3387fb099 100644 --- a/drivers/rtc/rtc-at32ap700x.c +++ b/drivers/rtc/rtc-at32ap700x.c | |||
@@ -204,10 +204,8 @@ static int __init at32_rtc_probe(struct platform_device *pdev) | |||
204 | 204 | ||
205 | rtc = devm_kzalloc(&pdev->dev, sizeof(struct rtc_at32ap700x), | 205 | rtc = devm_kzalloc(&pdev->dev, sizeof(struct rtc_at32ap700x), |
206 | GFP_KERNEL); | 206 | GFP_KERNEL); |
207 | if (!rtc) { | 207 | if (!rtc) |
208 | dev_dbg(&pdev->dev, "out of memory\n"); | ||
209 | return -ENOMEM; | 208 | return -ENOMEM; |
210 | } | ||
211 | 209 | ||
212 | regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 210 | regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
213 | if (!regs) { | 211 | if (!regs) { |
diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c index cae212f30d65..0963c9309c74 100644 --- a/drivers/rtc/rtc-cmos.c +++ b/drivers/rtc/rtc-cmos.c | |||
@@ -837,7 +837,7 @@ static void __exit cmos_do_remove(struct device *dev) | |||
837 | cmos->dev = NULL; | 837 | cmos->dev = NULL; |
838 | } | 838 | } |
839 | 839 | ||
840 | #ifdef CONFIG_PM | 840 | #ifdef CONFIG_PM_SLEEP |
841 | 841 | ||
842 | static int cmos_suspend(struct device *dev) | 842 | static int cmos_suspend(struct device *dev) |
843 | { | 843 | { |
@@ -935,8 +935,6 @@ static int cmos_resume(struct device *dev) | |||
935 | return 0; | 935 | return 0; |
936 | } | 936 | } |
937 | 937 | ||
938 | static SIMPLE_DEV_PM_OPS(cmos_pm_ops, cmos_suspend, cmos_resume); | ||
939 | |||
940 | #else | 938 | #else |
941 | 939 | ||
942 | static inline int cmos_poweroff(struct device *dev) | 940 | static inline int cmos_poweroff(struct device *dev) |
@@ -946,6 +944,8 @@ static inline int cmos_poweroff(struct device *dev) | |||
946 | 944 | ||
947 | #endif | 945 | #endif |
948 | 946 | ||
947 | static SIMPLE_DEV_PM_OPS(cmos_pm_ops, cmos_suspend, cmos_resume); | ||
948 | |||
949 | /*----------------------------------------------------------------*/ | 949 | /*----------------------------------------------------------------*/ |
950 | 950 | ||
951 | /* On non-x86 systems, a "CMOS" RTC lives most naturally on platform_bus. | 951 | /* On non-x86 systems, a "CMOS" RTC lives most naturally on platform_bus. |
@@ -1088,11 +1088,9 @@ static struct pnp_driver cmos_pnp_driver = { | |||
1088 | 1088 | ||
1089 | /* flag ensures resume() gets called, and stops syslog spam */ | 1089 | /* flag ensures resume() gets called, and stops syslog spam */ |
1090 | .flags = PNP_DRIVER_RES_DO_NOT_CHANGE, | 1090 | .flags = PNP_DRIVER_RES_DO_NOT_CHANGE, |
1091 | #ifdef CONFIG_PM_SLEEP | ||
1092 | .driver = { | 1091 | .driver = { |
1093 | .pm = &cmos_pm_ops, | 1092 | .pm = &cmos_pm_ops, |
1094 | }, | 1093 | }, |
1095 | #endif | ||
1096 | }; | 1094 | }; |
1097 | 1095 | ||
1098 | #endif /* CONFIG_PNP */ | 1096 | #endif /* CONFIG_PNP */ |
diff --git a/drivers/rtc/rtc-coh901331.c b/drivers/rtc/rtc-coh901331.c index 73f157519dff..869cae273799 100644 --- a/drivers/rtc/rtc-coh901331.c +++ b/drivers/rtc/rtc-coh901331.c | |||
@@ -43,8 +43,6 @@ | |||
43 | struct coh901331_port { | 43 | struct coh901331_port { |
44 | struct rtc_device *rtc; | 44 | struct rtc_device *rtc; |
45 | struct clk *clk; | 45 | struct clk *clk; |
46 | u32 phybase; | ||
47 | u32 physize; | ||
48 | void __iomem *virtbase; | 46 | void __iomem *virtbase; |
49 | int irq; | 47 | int irq; |
50 | #ifdef CONFIG_PM_SLEEP | 48 | #ifdef CONFIG_PM_SLEEP |
@@ -173,19 +171,9 @@ static int __init coh901331_probe(struct platform_device *pdev) | |||
173 | return -ENOMEM; | 171 | return -ENOMEM; |
174 | 172 | ||
175 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 173 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
176 | if (!res) | 174 | rtap->virtbase = devm_ioremap_resource(&pdev->dev, res); |
177 | return -ENOENT; | 175 | if (IS_ERR(rtap->virtbase)) |
178 | 176 | return PTR_ERR(rtap->virtbase); | |
179 | rtap->phybase = res->start; | ||
180 | rtap->physize = resource_size(res); | ||
181 | |||
182 | if (devm_request_mem_region(&pdev->dev, rtap->phybase, rtap->physize, | ||
183 | "rtc-coh901331") == NULL) | ||
184 | return -EBUSY; | ||
185 | |||
186 | rtap->virtbase = devm_ioremap(&pdev->dev, rtap->phybase, rtap->physize); | ||
187 | if (!rtap->virtbase) | ||
188 | return -ENOMEM; | ||
189 | 177 | ||
190 | rtap->irq = platform_get_irq(pdev, 0); | 178 | rtap->irq = platform_get_irq(pdev, 0); |
191 | if (devm_request_irq(&pdev->dev, rtap->irq, coh901331_interrupt, 0, | 179 | if (devm_request_irq(&pdev->dev, rtap->irq, coh901331_interrupt, 0, |
diff --git a/drivers/rtc/rtc-da9052.c b/drivers/rtc/rtc-da9052.c index 4385ca4503da..a1cbf64242a5 100644 --- a/drivers/rtc/rtc-da9052.c +++ b/drivers/rtc/rtc-da9052.c | |||
@@ -26,7 +26,6 @@ | |||
26 | struct da9052_rtc { | 26 | struct da9052_rtc { |
27 | struct rtc_device *rtc; | 27 | struct rtc_device *rtc; |
28 | struct da9052 *da9052; | 28 | struct da9052 *da9052; |
29 | int irq; | ||
30 | }; | 29 | }; |
31 | 30 | ||
32 | static int da9052_rtc_enable_alarm(struct da9052 *da9052, bool enable) | 31 | static int da9052_rtc_enable_alarm(struct da9052 *da9052, bool enable) |
@@ -240,8 +239,7 @@ static int da9052_rtc_probe(struct platform_device *pdev) | |||
240 | 239 | ||
241 | rtc->da9052 = dev_get_drvdata(pdev->dev.parent); | 240 | rtc->da9052 = dev_get_drvdata(pdev->dev.parent); |
242 | platform_set_drvdata(pdev, rtc); | 241 | platform_set_drvdata(pdev, rtc); |
243 | rtc->irq = DA9052_IRQ_ALARM; | 242 | ret = da9052_request_irq(rtc->da9052, DA9052_IRQ_ALARM, "ALM", |
244 | ret = da9052_request_irq(rtc->da9052, rtc->irq, "ALM", | ||
245 | da9052_rtc_irq, rtc); | 243 | da9052_rtc_irq, rtc); |
246 | if (ret != 0) { | 244 | if (ret != 0) { |
247 | rtc_err(rtc->da9052, "irq registration failed: %d\n", ret); | 245 | rtc_err(rtc->da9052, "irq registration failed: %d\n", ret); |
diff --git a/drivers/rtc/rtc-da9055.c b/drivers/rtc/rtc-da9055.c index 48cb2ac3bd3e..a825491331c8 100644 --- a/drivers/rtc/rtc-da9055.c +++ b/drivers/rtc/rtc-da9055.c | |||
@@ -302,7 +302,9 @@ static int da9055_rtc_probe(struct platform_device *pdev) | |||
302 | } | 302 | } |
303 | 303 | ||
304 | alm_irq = platform_get_irq_byname(pdev, "ALM"); | 304 | alm_irq = platform_get_irq_byname(pdev, "ALM"); |
305 | alm_irq = regmap_irq_get_virq(rtc->da9055->irq_data, alm_irq); | 305 | if (alm_irq < 0) |
306 | return alm_irq; | ||
307 | |||
306 | ret = devm_request_threaded_irq(&pdev->dev, alm_irq, NULL, | 308 | ret = devm_request_threaded_irq(&pdev->dev, alm_irq, NULL, |
307 | da9055_rtc_alm_irq, | 309 | da9055_rtc_alm_irq, |
308 | IRQF_TRIGGER_HIGH | IRQF_ONESHOT, | 310 | IRQF_TRIGGER_HIGH | IRQF_ONESHOT, |
diff --git a/drivers/rtc/rtc-davinci.c b/drivers/rtc/rtc-davinci.c index 24677ef8c39a..c0a3b59f65a2 100644 --- a/drivers/rtc/rtc-davinci.c +++ b/drivers/rtc/rtc-davinci.c | |||
@@ -119,8 +119,6 @@ static DEFINE_SPINLOCK(davinci_rtc_lock); | |||
119 | struct davinci_rtc { | 119 | struct davinci_rtc { |
120 | struct rtc_device *rtc; | 120 | struct rtc_device *rtc; |
121 | void __iomem *base; | 121 | void __iomem *base; |
122 | resource_size_t pbase; | ||
123 | size_t base_size; | ||
124 | int irq; | 122 | int irq; |
125 | }; | 123 | }; |
126 | 124 | ||
@@ -482,14 +480,12 @@ static int __init davinci_rtc_probe(struct platform_device *pdev) | |||
482 | { | 480 | { |
483 | struct device *dev = &pdev->dev; | 481 | struct device *dev = &pdev->dev; |
484 | struct davinci_rtc *davinci_rtc; | 482 | struct davinci_rtc *davinci_rtc; |
485 | struct resource *res, *mem; | 483 | struct resource *res; |
486 | int ret = 0; | 484 | int ret = 0; |
487 | 485 | ||
488 | davinci_rtc = devm_kzalloc(&pdev->dev, sizeof(struct davinci_rtc), GFP_KERNEL); | 486 | davinci_rtc = devm_kzalloc(&pdev->dev, sizeof(struct davinci_rtc), GFP_KERNEL); |
489 | if (!davinci_rtc) { | 487 | if (!davinci_rtc) |
490 | dev_dbg(dev, "could not allocate memory for private data\n"); | ||
491 | return -ENOMEM; | 488 | return -ENOMEM; |
492 | } | ||
493 | 489 | ||
494 | davinci_rtc->irq = platform_get_irq(pdev, 0); | 490 | davinci_rtc->irq = platform_get_irq(pdev, 0); |
495 | if (davinci_rtc->irq < 0) { | 491 | if (davinci_rtc->irq < 0) { |
@@ -498,28 +494,9 @@ static int __init davinci_rtc_probe(struct platform_device *pdev) | |||
498 | } | 494 | } |
499 | 495 | ||
500 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 496 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
501 | if (!res) { | 497 | davinci_rtc->base = devm_ioremap_resource(dev, res); |
502 | dev_err(dev, "no mem resource\n"); | 498 | if (IS_ERR(davinci_rtc->base)) |
503 | return -EINVAL; | 499 | return PTR_ERR(davinci_rtc->base); |
504 | } | ||
505 | |||
506 | davinci_rtc->pbase = res->start; | ||
507 | davinci_rtc->base_size = resource_size(res); | ||
508 | |||
509 | mem = devm_request_mem_region(dev, davinci_rtc->pbase, | ||
510 | davinci_rtc->base_size, pdev->name); | ||
511 | if (!mem) { | ||
512 | dev_err(dev, "RTC registers at %08x are not free\n", | ||
513 | davinci_rtc->pbase); | ||
514 | return -EBUSY; | ||
515 | } | ||
516 | |||
517 | davinci_rtc->base = devm_ioremap(dev, davinci_rtc->pbase, | ||
518 | davinci_rtc->base_size); | ||
519 | if (!davinci_rtc->base) { | ||
520 | dev_err(dev, "unable to ioremap MEM resource\n"); | ||
521 | return -ENOMEM; | ||
522 | } | ||
523 | 500 | ||
524 | platform_set_drvdata(pdev, davinci_rtc); | 501 | platform_set_drvdata(pdev, davinci_rtc); |
525 | 502 | ||
diff --git a/drivers/rtc/rtc-ds1305.c b/drivers/rtc/rtc-ds1305.c index 2dd586a19b59..129add77065d 100644 --- a/drivers/rtc/rtc-ds1305.c +++ b/drivers/rtc/rtc-ds1305.c | |||
@@ -756,19 +756,17 @@ static int ds1305_probe(struct spi_device *spi) | |||
756 | status = devm_request_irq(&spi->dev, spi->irq, ds1305_irq, | 756 | status = devm_request_irq(&spi->dev, spi->irq, ds1305_irq, |
757 | 0, dev_name(&ds1305->rtc->dev), ds1305); | 757 | 0, dev_name(&ds1305->rtc->dev), ds1305); |
758 | if (status < 0) { | 758 | if (status < 0) { |
759 | dev_dbg(&spi->dev, "request_irq %d --> %d\n", | 759 | dev_err(&spi->dev, "request_irq %d --> %d\n", |
760 | spi->irq, status); | 760 | spi->irq, status); |
761 | return status; | 761 | } else { |
762 | device_set_wakeup_capable(&spi->dev, 1); | ||
762 | } | 763 | } |
763 | |||
764 | device_set_wakeup_capable(&spi->dev, 1); | ||
765 | } | 764 | } |
766 | 765 | ||
767 | /* export NVRAM */ | 766 | /* export NVRAM */ |
768 | status = sysfs_create_bin_file(&spi->dev.kobj, &nvram); | 767 | status = sysfs_create_bin_file(&spi->dev.kobj, &nvram); |
769 | if (status < 0) { | 768 | if (status < 0) { |
770 | dev_dbg(&spi->dev, "register nvram --> %d\n", status); | 769 | dev_err(&spi->dev, "register nvram --> %d\n", status); |
771 | return status; | ||
772 | } | 770 | } |
773 | 771 | ||
774 | return 0; | 772 | return 0; |
diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c index 4e75345a559a..f03d5ba96db1 100644 --- a/drivers/rtc/rtc-ds1307.c +++ b/drivers/rtc/rtc-ds1307.c | |||
@@ -154,6 +154,7 @@ static const struct chip_desc chips[last_ds_type] = { | |||
154 | .alarm = 1, | 154 | .alarm = 1, |
155 | }, | 155 | }, |
156 | [mcp7941x] = { | 156 | [mcp7941x] = { |
157 | .alarm = 1, | ||
157 | /* this is battery backed SRAM */ | 158 | /* this is battery backed SRAM */ |
158 | .nvram_offset = 0x20, | 159 | .nvram_offset = 0x20, |
159 | .nvram_size = 0x40, | 160 | .nvram_size = 0x40, |
@@ -606,6 +607,178 @@ static const struct rtc_class_ops ds13xx_rtc_ops = { | |||
606 | 607 | ||
607 | /*----------------------------------------------------------------------*/ | 608 | /*----------------------------------------------------------------------*/ |
608 | 609 | ||
610 | /* | ||
611 | * Alarm support for mcp7941x devices. | ||
612 | */ | ||
613 | |||
614 | #define MCP7941X_REG_CONTROL 0x07 | ||
615 | # define MCP7941X_BIT_ALM0_EN 0x10 | ||
616 | # define MCP7941X_BIT_ALM1_EN 0x20 | ||
617 | #define MCP7941X_REG_ALARM0_BASE 0x0a | ||
618 | #define MCP7941X_REG_ALARM0_CTRL 0x0d | ||
619 | #define MCP7941X_REG_ALARM1_BASE 0x11 | ||
620 | #define MCP7941X_REG_ALARM1_CTRL 0x14 | ||
621 | # define MCP7941X_BIT_ALMX_IF (1 << 3) | ||
622 | # define MCP7941X_BIT_ALMX_C0 (1 << 4) | ||
623 | # define MCP7941X_BIT_ALMX_C1 (1 << 5) | ||
624 | # define MCP7941X_BIT_ALMX_C2 (1 << 6) | ||
625 | # define MCP7941X_BIT_ALMX_POL (1 << 7) | ||
626 | # define MCP7941X_MSK_ALMX_MATCH (MCP7941X_BIT_ALMX_C0 | \ | ||
627 | MCP7941X_BIT_ALMX_C1 | \ | ||
628 | MCP7941X_BIT_ALMX_C2) | ||
629 | |||
630 | static void mcp7941x_work(struct work_struct *work) | ||
631 | { | ||
632 | struct ds1307 *ds1307 = container_of(work, struct ds1307, work); | ||
633 | struct i2c_client *client = ds1307->client; | ||
634 | int reg, ret; | ||
635 | |||
636 | mutex_lock(&ds1307->rtc->ops_lock); | ||
637 | |||
638 | /* Check and clear alarm 0 interrupt flag. */ | ||
639 | reg = i2c_smbus_read_byte_data(client, MCP7941X_REG_ALARM0_CTRL); | ||
640 | if (reg < 0) | ||
641 | goto out; | ||
642 | if (!(reg & MCP7941X_BIT_ALMX_IF)) | ||
643 | goto out; | ||
644 | reg &= ~MCP7941X_BIT_ALMX_IF; | ||
645 | ret = i2c_smbus_write_byte_data(client, MCP7941X_REG_ALARM0_CTRL, reg); | ||
646 | if (ret < 0) | ||
647 | goto out; | ||
648 | |||
649 | /* Disable alarm 0. */ | ||
650 | reg = i2c_smbus_read_byte_data(client, MCP7941X_REG_CONTROL); | ||
651 | if (reg < 0) | ||
652 | goto out; | ||
653 | reg &= ~MCP7941X_BIT_ALM0_EN; | ||
654 | ret = i2c_smbus_write_byte_data(client, MCP7941X_REG_CONTROL, reg); | ||
655 | if (ret < 0) | ||
656 | goto out; | ||
657 | |||
658 | rtc_update_irq(ds1307->rtc, 1, RTC_AF | RTC_IRQF); | ||
659 | |||
660 | out: | ||
661 | if (test_bit(HAS_ALARM, &ds1307->flags)) | ||
662 | enable_irq(client->irq); | ||
663 | mutex_unlock(&ds1307->rtc->ops_lock); | ||
664 | } | ||
665 | |||
666 | static int mcp7941x_read_alarm(struct device *dev, struct rtc_wkalrm *t) | ||
667 | { | ||
668 | struct i2c_client *client = to_i2c_client(dev); | ||
669 | struct ds1307 *ds1307 = i2c_get_clientdata(client); | ||
670 | u8 *regs = ds1307->regs; | ||
671 | int ret; | ||
672 | |||
673 | if (!test_bit(HAS_ALARM, &ds1307->flags)) | ||
674 | return -EINVAL; | ||
675 | |||
676 | /* Read control and alarm 0 registers. */ | ||
677 | ret = ds1307->read_block_data(client, MCP7941X_REG_CONTROL, 10, regs); | ||
678 | if (ret < 0) | ||
679 | return ret; | ||
680 | |||
681 | t->enabled = !!(regs[0] & MCP7941X_BIT_ALM0_EN); | ||
682 | |||
683 | /* Report alarm 0 time assuming 24-hour and day-of-month modes. */ | ||
684 | t->time.tm_sec = bcd2bin(ds1307->regs[3] & 0x7f); | ||
685 | t->time.tm_min = bcd2bin(ds1307->regs[4] & 0x7f); | ||
686 | t->time.tm_hour = bcd2bin(ds1307->regs[5] & 0x3f); | ||
687 | t->time.tm_wday = bcd2bin(ds1307->regs[6] & 0x7) - 1; | ||
688 | t->time.tm_mday = bcd2bin(ds1307->regs[7] & 0x3f); | ||
689 | t->time.tm_mon = bcd2bin(ds1307->regs[8] & 0x1f) - 1; | ||
690 | t->time.tm_year = -1; | ||
691 | t->time.tm_yday = -1; | ||
692 | t->time.tm_isdst = -1; | ||
693 | |||
694 | dev_dbg(dev, "%s, sec=%d min=%d hour=%d wday=%d mday=%d mon=%d " | ||
695 | "enabled=%d polarity=%d irq=%d match=%d\n", __func__, | ||
696 | t->time.tm_sec, t->time.tm_min, t->time.tm_hour, | ||
697 | t->time.tm_wday, t->time.tm_mday, t->time.tm_mon, t->enabled, | ||
698 | !!(ds1307->regs[6] & MCP7941X_BIT_ALMX_POL), | ||
699 | !!(ds1307->regs[6] & MCP7941X_BIT_ALMX_IF), | ||
700 | (ds1307->regs[6] & MCP7941X_MSK_ALMX_MATCH) >> 4); | ||
701 | |||
702 | return 0; | ||
703 | } | ||
704 | |||
705 | static int mcp7941x_set_alarm(struct device *dev, struct rtc_wkalrm *t) | ||
706 | { | ||
707 | struct i2c_client *client = to_i2c_client(dev); | ||
708 | struct ds1307 *ds1307 = i2c_get_clientdata(client); | ||
709 | unsigned char *regs = ds1307->regs; | ||
710 | int ret; | ||
711 | |||
712 | if (!test_bit(HAS_ALARM, &ds1307->flags)) | ||
713 | return -EINVAL; | ||
714 | |||
715 | dev_dbg(dev, "%s, sec=%d min=%d hour=%d wday=%d mday=%d mon=%d " | ||
716 | "enabled=%d pending=%d\n", __func__, | ||
717 | t->time.tm_sec, t->time.tm_min, t->time.tm_hour, | ||
718 | t->time.tm_wday, t->time.tm_mday, t->time.tm_mon, | ||
719 | t->enabled, t->pending); | ||
720 | |||
721 | /* Read control and alarm 0 registers. */ | ||
722 | ret = ds1307->read_block_data(client, MCP7941X_REG_CONTROL, 10, regs); | ||
723 | if (ret < 0) | ||
724 | return ret; | ||
725 | |||
726 | /* Set alarm 0, using 24-hour and day-of-month modes. */ | ||
727 | regs[3] = bin2bcd(t->time.tm_sec); | ||
728 | regs[4] = bin2bcd(t->time.tm_min); | ||
729 | regs[5] = bin2bcd(t->time.tm_hour); | ||
730 | regs[6] = bin2bcd(t->time.tm_wday) + 1; | ||
731 | regs[7] = bin2bcd(t->time.tm_mday); | ||
732 | regs[8] = bin2bcd(t->time.tm_mon) + 1; | ||
733 | |||
734 | /* Clear the alarm 0 interrupt flag. */ | ||
735 | regs[6] &= ~MCP7941X_BIT_ALMX_IF; | ||
736 | /* Set alarm match: second, minute, hour, day, date, month. */ | ||
737 | regs[6] |= MCP7941X_MSK_ALMX_MATCH; | ||
738 | |||
739 | if (t->enabled) | ||
740 | regs[0] |= MCP7941X_BIT_ALM0_EN; | ||
741 | else | ||
742 | regs[0] &= ~MCP7941X_BIT_ALM0_EN; | ||
743 | |||
744 | ret = ds1307->write_block_data(client, MCP7941X_REG_CONTROL, 10, regs); | ||
745 | if (ret < 0) | ||
746 | return ret; | ||
747 | |||
748 | return 0; | ||
749 | } | ||
750 | |||
751 | static int mcp7941x_alarm_irq_enable(struct device *dev, unsigned int enabled) | ||
752 | { | ||
753 | struct i2c_client *client = to_i2c_client(dev); | ||
754 | struct ds1307 *ds1307 = i2c_get_clientdata(client); | ||
755 | int reg; | ||
756 | |||
757 | if (!test_bit(HAS_ALARM, &ds1307->flags)) | ||
758 | return -EINVAL; | ||
759 | |||
760 | reg = i2c_smbus_read_byte_data(client, MCP7941X_REG_CONTROL); | ||
761 | if (reg < 0) | ||
762 | return reg; | ||
763 | |||
764 | if (enabled) | ||
765 | reg |= MCP7941X_BIT_ALM0_EN; | ||
766 | else | ||
767 | reg &= ~MCP7941X_BIT_ALM0_EN; | ||
768 | |||
769 | return i2c_smbus_write_byte_data(client, MCP7941X_REG_CONTROL, reg); | ||
770 | } | ||
771 | |||
772 | static const struct rtc_class_ops mcp7941x_rtc_ops = { | ||
773 | .read_time = ds1307_get_time, | ||
774 | .set_time = ds1307_set_time, | ||
775 | .read_alarm = mcp7941x_read_alarm, | ||
776 | .set_alarm = mcp7941x_set_alarm, | ||
777 | .alarm_irq_enable = mcp7941x_alarm_irq_enable, | ||
778 | }; | ||
779 | |||
780 | /*----------------------------------------------------------------------*/ | ||
781 | |||
609 | static ssize_t | 782 | static ssize_t |
610 | ds1307_nvram_read(struct file *filp, struct kobject *kobj, | 783 | ds1307_nvram_read(struct file *filp, struct kobject *kobj, |
611 | struct bin_attribute *attr, | 784 | struct bin_attribute *attr, |
@@ -678,6 +851,7 @@ static int ds1307_probe(struct i2c_client *client, | |||
678 | [ds_1339] = DS1339_BIT_BBSQI, | 851 | [ds_1339] = DS1339_BIT_BBSQI, |
679 | [ds_3231] = DS3231_BIT_BBSQW, | 852 | [ds_3231] = DS3231_BIT_BBSQW, |
680 | }; | 853 | }; |
854 | const struct rtc_class_ops *rtc_ops = &ds13xx_rtc_ops; | ||
681 | 855 | ||
682 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA) | 856 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA) |
683 | && !i2c_check_functionality(adapter, I2C_FUNC_SMBUS_I2C_BLOCK)) | 857 | && !i2c_check_functionality(adapter, I2C_FUNC_SMBUS_I2C_BLOCK)) |
@@ -816,6 +990,13 @@ static int ds1307_probe(struct i2c_client *client, | |||
816 | case ds_1388: | 990 | case ds_1388: |
817 | ds1307->offset = 1; /* Seconds starts at 1 */ | 991 | ds1307->offset = 1; /* Seconds starts at 1 */ |
818 | break; | 992 | break; |
993 | case mcp7941x: | ||
994 | rtc_ops = &mcp7941x_rtc_ops; | ||
995 | if (ds1307->client->irq > 0 && chip->alarm) { | ||
996 | INIT_WORK(&ds1307->work, mcp7941x_work); | ||
997 | want_irq = true; | ||
998 | } | ||
999 | break; | ||
819 | default: | 1000 | default: |
820 | break; | 1001 | break; |
821 | } | 1002 | } |
@@ -927,55 +1108,61 @@ read_rtc: | |||
927 | bin2bcd(tmp)); | 1108 | bin2bcd(tmp)); |
928 | } | 1109 | } |
929 | 1110 | ||
1111 | device_set_wakeup_capable(&client->dev, want_irq); | ||
930 | ds1307->rtc = devm_rtc_device_register(&client->dev, client->name, | 1112 | ds1307->rtc = devm_rtc_device_register(&client->dev, client->name, |
931 | &ds13xx_rtc_ops, THIS_MODULE); | 1113 | rtc_ops, THIS_MODULE); |
932 | if (IS_ERR(ds1307->rtc)) { | 1114 | if (IS_ERR(ds1307->rtc)) { |
933 | err = PTR_ERR(ds1307->rtc); | 1115 | return PTR_ERR(ds1307->rtc); |
934 | dev_err(&client->dev, | ||
935 | "unable to register the class device\n"); | ||
936 | goto exit; | ||
937 | } | 1116 | } |
938 | 1117 | ||
939 | if (want_irq) { | 1118 | if (want_irq) { |
940 | err = request_irq(client->irq, ds1307_irq, IRQF_SHARED, | 1119 | err = request_irq(client->irq, ds1307_irq, IRQF_SHARED, |
941 | ds1307->rtc->name, client); | 1120 | ds1307->rtc->name, client); |
942 | if (err) { | 1121 | if (err) { |
943 | dev_err(&client->dev, | 1122 | client->irq = 0; |
944 | "unable to request IRQ!\n"); | 1123 | dev_err(&client->dev, "unable to request IRQ!\n"); |
945 | goto exit; | 1124 | } else { |
946 | } | ||
947 | 1125 | ||
948 | device_set_wakeup_capable(&client->dev, 1); | 1126 | set_bit(HAS_ALARM, &ds1307->flags); |
949 | set_bit(HAS_ALARM, &ds1307->flags); | 1127 | dev_dbg(&client->dev, "got IRQ %d\n", client->irq); |
950 | dev_dbg(&client->dev, "got IRQ %d\n", client->irq); | 1128 | } |
951 | } | 1129 | } |
952 | 1130 | ||
953 | if (chip->nvram_size) { | 1131 | if (chip->nvram_size) { |
1132 | |||
954 | ds1307->nvram = devm_kzalloc(&client->dev, | 1133 | ds1307->nvram = devm_kzalloc(&client->dev, |
955 | sizeof(struct bin_attribute), | 1134 | sizeof(struct bin_attribute), |
956 | GFP_KERNEL); | 1135 | GFP_KERNEL); |
957 | if (!ds1307->nvram) { | 1136 | if (!ds1307->nvram) { |
958 | err = -ENOMEM; | 1137 | dev_err(&client->dev, "cannot allocate memory for nvram sysfs\n"); |
959 | goto err_irq; | 1138 | } else { |
1139 | |||
1140 | ds1307->nvram->attr.name = "nvram"; | ||
1141 | ds1307->nvram->attr.mode = S_IRUGO | S_IWUSR; | ||
1142 | |||
1143 | sysfs_bin_attr_init(ds1307->nvram); | ||
1144 | |||
1145 | ds1307->nvram->read = ds1307_nvram_read; | ||
1146 | ds1307->nvram->write = ds1307_nvram_write; | ||
1147 | ds1307->nvram->size = chip->nvram_size; | ||
1148 | ds1307->nvram_offset = chip->nvram_offset; | ||
1149 | |||
1150 | err = sysfs_create_bin_file(&client->dev.kobj, | ||
1151 | ds1307->nvram); | ||
1152 | if (err) { | ||
1153 | dev_err(&client->dev, | ||
1154 | "unable to create sysfs file: %s\n", | ||
1155 | ds1307->nvram->attr.name); | ||
1156 | } else { | ||
1157 | set_bit(HAS_NVRAM, &ds1307->flags); | ||
1158 | dev_info(&client->dev, "%zu bytes nvram\n", | ||
1159 | ds1307->nvram->size); | ||
1160 | } | ||
960 | } | 1161 | } |
961 | ds1307->nvram->attr.name = "nvram"; | ||
962 | ds1307->nvram->attr.mode = S_IRUGO | S_IWUSR; | ||
963 | sysfs_bin_attr_init(ds1307->nvram); | ||
964 | ds1307->nvram->read = ds1307_nvram_read; | ||
965 | ds1307->nvram->write = ds1307_nvram_write; | ||
966 | ds1307->nvram->size = chip->nvram_size; | ||
967 | ds1307->nvram_offset = chip->nvram_offset; | ||
968 | err = sysfs_create_bin_file(&client->dev.kobj, ds1307->nvram); | ||
969 | if (err) | ||
970 | goto err_irq; | ||
971 | set_bit(HAS_NVRAM, &ds1307->flags); | ||
972 | dev_info(&client->dev, "%zu bytes nvram\n", ds1307->nvram->size); | ||
973 | } | 1162 | } |
974 | 1163 | ||
975 | return 0; | 1164 | return 0; |
976 | 1165 | ||
977 | err_irq: | ||
978 | free_irq(client->irq, client); | ||
979 | exit: | 1166 | exit: |
980 | return err; | 1167 | return err; |
981 | } | 1168 | } |
diff --git a/drivers/rtc/rtc-ds1347.c b/drivers/rtc/rtc-ds1347.c new file mode 100644 index 000000000000..c82b4c050326 --- /dev/null +++ b/drivers/rtc/rtc-ds1347.c | |||
@@ -0,0 +1,166 @@ | |||
1 | /* rtc-ds1347.c | ||
2 | * | ||
3 | * Driver for Dallas Semiconductor DS1347 Low Current, SPI Compatible | ||
4 | * Real Time Clock | ||
5 | * | ||
6 | * Author : Raghavendra Chandra Ganiga <ravi23ganiga@gmail.com> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | * | ||
12 | */ | ||
13 | |||
14 | #include <linux/init.h> | ||
15 | #include <linux/module.h> | ||
16 | #include <linux/device.h> | ||
17 | #include <linux/platform_device.h> | ||
18 | #include <linux/rtc.h> | ||
19 | #include <linux/spi/spi.h> | ||
20 | #include <linux/bcd.h> | ||
21 | |||
22 | /* Registers in ds1347 rtc */ | ||
23 | |||
24 | #define DS1347_SECONDS_REG 0x01 | ||
25 | #define DS1347_MINUTES_REG 0x03 | ||
26 | #define DS1347_HOURS_REG 0x05 | ||
27 | #define DS1347_DATE_REG 0x07 | ||
28 | #define DS1347_MONTH_REG 0x09 | ||
29 | #define DS1347_DAY_REG 0x0B | ||
30 | #define DS1347_YEAR_REG 0x0D | ||
31 | #define DS1347_CONTROL_REG 0x0F | ||
32 | #define DS1347_STATUS_REG 0x17 | ||
33 | #define DS1347_CLOCK_BURST 0x3F | ||
34 | |||
35 | static int ds1347_read_reg(struct device *dev, unsigned char address, | ||
36 | unsigned char *data) | ||
37 | { | ||
38 | struct spi_device *spi = to_spi_device(dev); | ||
39 | |||
40 | *data = address | 0x80; | ||
41 | |||
42 | return spi_write_then_read(spi, data, 1, data, 1); | ||
43 | } | ||
44 | |||
45 | static int ds1347_write_reg(struct device *dev, unsigned char address, | ||
46 | unsigned char data) | ||
47 | { | ||
48 | struct spi_device *spi = to_spi_device(dev); | ||
49 | unsigned char buf[2]; | ||
50 | |||
51 | buf[0] = address & 0x7F; | ||
52 | buf[1] = data; | ||
53 | |||
54 | return spi_write_then_read(spi, buf, 2, NULL, 0); | ||
55 | } | ||
56 | |||
57 | static int ds1347_read_time(struct device *dev, struct rtc_time *dt) | ||
58 | { | ||
59 | struct spi_device *spi = to_spi_device(dev); | ||
60 | int err; | ||
61 | unsigned char buf[8]; | ||
62 | |||
63 | buf[0] = DS1347_CLOCK_BURST | 0x80; | ||
64 | |||
65 | err = spi_write_then_read(spi, buf, 1, buf, 8); | ||
66 | if (err) | ||
67 | return err; | ||
68 | |||
69 | dt->tm_sec = bcd2bin(buf[0]); | ||
70 | dt->tm_min = bcd2bin(buf[1]); | ||
71 | dt->tm_hour = bcd2bin(buf[2] & 0x3F); | ||
72 | dt->tm_mday = bcd2bin(buf[3]); | ||
73 | dt->tm_mon = bcd2bin(buf[4]) - 1; | ||
74 | dt->tm_wday = bcd2bin(buf[5]) - 1; | ||
75 | dt->tm_year = bcd2bin(buf[6]) + 100; | ||
76 | |||
77 | return rtc_valid_tm(dt); | ||
78 | } | ||
79 | |||
80 | static int ds1347_set_time(struct device *dev, struct rtc_time *dt) | ||
81 | { | ||
82 | struct spi_device *spi = to_spi_device(dev); | ||
83 | unsigned char buf[9]; | ||
84 | |||
85 | buf[0] = DS1347_CLOCK_BURST & 0x7F; | ||
86 | buf[1] = bin2bcd(dt->tm_sec); | ||
87 | buf[2] = bin2bcd(dt->tm_min); | ||
88 | buf[3] = (bin2bcd(dt->tm_hour) & 0x3F); | ||
89 | buf[4] = bin2bcd(dt->tm_mday); | ||
90 | buf[5] = bin2bcd(dt->tm_mon + 1); | ||
91 | buf[6] = bin2bcd(dt->tm_wday + 1); | ||
92 | |||
93 | /* year in linux is from 1900 i.e in range of 100 | ||
94 | in rtc it is from 00 to 99 */ | ||
95 | dt->tm_year = dt->tm_year % 100; | ||
96 | |||
97 | buf[7] = bin2bcd(dt->tm_year); | ||
98 | buf[8] = bin2bcd(0x00); | ||
99 | |||
100 | /* write the rtc settings */ | ||
101 | return spi_write_then_read(spi, buf, 9, NULL, 0); | ||
102 | } | ||
103 | |||
104 | static const struct rtc_class_ops ds1347_rtc_ops = { | ||
105 | .read_time = ds1347_read_time, | ||
106 | .set_time = ds1347_set_time, | ||
107 | }; | ||
108 | |||
109 | static int ds1347_probe(struct spi_device *spi) | ||
110 | { | ||
111 | struct rtc_device *rtc; | ||
112 | unsigned char data; | ||
113 | int res; | ||
114 | |||
115 | /* spi setup with ds1347 in mode 3 and bits per word as 8 */ | ||
116 | spi->mode = SPI_MODE_3; | ||
117 | spi->bits_per_word = 8; | ||
118 | spi_setup(spi); | ||
119 | |||
120 | /* RTC Settings */ | ||
121 | res = ds1347_read_reg(&spi->dev, DS1347_SECONDS_REG, &data); | ||
122 | if (res) | ||
123 | return res; | ||
124 | |||
125 | /* Disable the write protect of rtc */ | ||
126 | ds1347_read_reg(&spi->dev, DS1347_CONTROL_REG, &data); | ||
127 | data = data & ~(1<<7); | ||
128 | ds1347_write_reg(&spi->dev, DS1347_CONTROL_REG, data); | ||
129 | |||
130 | /* Enable the oscillator , disable the oscillator stop flag, | ||
131 | and glitch filter to reduce current consumption */ | ||
132 | ds1347_read_reg(&spi->dev, DS1347_STATUS_REG, &data); | ||
133 | data = data & 0x1B; | ||
134 | ds1347_write_reg(&spi->dev, DS1347_STATUS_REG, data); | ||
135 | |||
136 | /* display the settings */ | ||
137 | ds1347_read_reg(&spi->dev, DS1347_CONTROL_REG, &data); | ||
138 | dev_info(&spi->dev, "DS1347 RTC CTRL Reg = 0x%02x\n", data); | ||
139 | |||
140 | ds1347_read_reg(&spi->dev, DS1347_STATUS_REG, &data); | ||
141 | dev_info(&spi->dev, "DS1347 RTC Status Reg = 0x%02x\n", data); | ||
142 | |||
143 | rtc = devm_rtc_device_register(&spi->dev, "ds1347", | ||
144 | &ds1347_rtc_ops, THIS_MODULE); | ||
145 | |||
146 | if (IS_ERR(rtc)) | ||
147 | return PTR_ERR(rtc); | ||
148 | |||
149 | spi_set_drvdata(spi, rtc); | ||
150 | |||
151 | return 0; | ||
152 | } | ||
153 | |||
154 | static struct spi_driver ds1347_driver = { | ||
155 | .driver = { | ||
156 | .name = "ds1347", | ||
157 | .owner = THIS_MODULE, | ||
158 | }, | ||
159 | .probe = ds1347_probe, | ||
160 | }; | ||
161 | |||
162 | module_spi_driver(ds1347_driver); | ||
163 | |||
164 | MODULE_DESCRIPTION("DS1347 SPI RTC DRIVER"); | ||
165 | MODULE_AUTHOR("Raghavendra C Ganiga <ravi23ganiga@gmail.com>"); | ||
166 | MODULE_LICENSE("GPL v2"); | ||
diff --git a/drivers/rtc/rtc-ds1390.c b/drivers/rtc/rtc-ds1390.c index be9d8c0a7e3a..e67bfcb3a1aa 100644 --- a/drivers/rtc/rtc-ds1390.c +++ b/drivers/rtc/rtc-ds1390.c | |||
@@ -132,10 +132,9 @@ static int ds1390_probe(struct spi_device *spi) | |||
132 | spi_setup(spi); | 132 | spi_setup(spi); |
133 | 133 | ||
134 | chip = devm_kzalloc(&spi->dev, sizeof(*chip), GFP_KERNEL); | 134 | chip = devm_kzalloc(&spi->dev, sizeof(*chip), GFP_KERNEL); |
135 | if (!chip) { | 135 | if (!chip) |
136 | dev_err(&spi->dev, "unable to allocate device memory\n"); | ||
137 | return -ENOMEM; | 136 | return -ENOMEM; |
138 | } | 137 | |
139 | spi_set_drvdata(spi, chip); | 138 | spi_set_drvdata(spi, chip); |
140 | 139 | ||
141 | res = ds1390_get_reg(&spi->dev, DS1390_REG_SECONDS, &tmp); | 140 | res = ds1390_get_reg(&spi->dev, DS1390_REG_SECONDS, &tmp); |
diff --git a/drivers/rtc/rtc-ds1511.c b/drivers/rtc/rtc-ds1511.c index bc7b4fcf603c..b13d1399b81a 100644 --- a/drivers/rtc/rtc-ds1511.c +++ b/drivers/rtc/rtc-ds1511.c | |||
@@ -371,8 +371,7 @@ ds1511_interrupt(int irq, void *dev_id) | |||
371 | events |= RTC_UF; | 371 | events |= RTC_UF; |
372 | else | 372 | else |
373 | events |= RTC_AF; | 373 | events |= RTC_AF; |
374 | if (likely(pdata->rtc)) | 374 | rtc_update_irq(pdata->rtc, 1, events); |
375 | rtc_update_irq(pdata->rtc, 1, events); | ||
376 | } | 375 | } |
377 | spin_unlock(&pdata->lock); | 376 | spin_unlock(&pdata->lock); |
378 | return events ? IRQ_HANDLED : IRQ_NONE; | 377 | return events ? IRQ_HANDLED : IRQ_NONE; |
@@ -473,7 +472,6 @@ static struct bin_attribute ds1511_nvram_attr = { | |||
473 | 472 | ||
474 | static int ds1511_rtc_probe(struct platform_device *pdev) | 473 | static int ds1511_rtc_probe(struct platform_device *pdev) |
475 | { | 474 | { |
476 | struct rtc_device *rtc; | ||
477 | struct resource *res; | 475 | struct resource *res; |
478 | struct rtc_plat_data *pdata; | 476 | struct rtc_plat_data *pdata; |
479 | int ret = 0; | 477 | int ret = 0; |
@@ -512,6 +510,12 @@ static int ds1511_rtc_probe(struct platform_device *pdev) | |||
512 | 510 | ||
513 | spin_lock_init(&pdata->lock); | 511 | spin_lock_init(&pdata->lock); |
514 | platform_set_drvdata(pdev, pdata); | 512 | platform_set_drvdata(pdev, pdata); |
513 | |||
514 | pdata->rtc = devm_rtc_device_register(&pdev->dev, pdev->name, | ||
515 | &ds1511_rtc_ops, THIS_MODULE); | ||
516 | if (IS_ERR(pdata->rtc)) | ||
517 | return PTR_ERR(pdata->rtc); | ||
518 | |||
515 | /* | 519 | /* |
516 | * if the platform has an interrupt in mind for this device, | 520 | * if the platform has an interrupt in mind for this device, |
517 | * then by all means, set it | 521 | * then by all means, set it |
@@ -526,15 +530,12 @@ static int ds1511_rtc_probe(struct platform_device *pdev) | |||
526 | } | 530 | } |
527 | } | 531 | } |
528 | 532 | ||
529 | rtc = devm_rtc_device_register(&pdev->dev, pdev->name, &ds1511_rtc_ops, | ||
530 | THIS_MODULE); | ||
531 | if (IS_ERR(rtc)) | ||
532 | return PTR_ERR(rtc); | ||
533 | pdata->rtc = rtc; | ||
534 | |||
535 | ret = sysfs_create_bin_file(&pdev->dev.kobj, &ds1511_nvram_attr); | 533 | ret = sysfs_create_bin_file(&pdev->dev.kobj, &ds1511_nvram_attr); |
534 | if (ret) | ||
535 | dev_err(&pdev->dev, "Unable to create sysfs entry: %s\n", | ||
536 | ds1511_nvram_attr.attr.name); | ||
536 | 537 | ||
537 | return ret; | 538 | return 0; |
538 | } | 539 | } |
539 | 540 | ||
540 | static int ds1511_rtc_remove(struct platform_device *pdev) | 541 | static int ds1511_rtc_remove(struct platform_device *pdev) |
diff --git a/drivers/rtc/rtc-ds1553.c b/drivers/rtc/rtc-ds1553.c index fd31571941f5..ab56893aac73 100644 --- a/drivers/rtc/rtc-ds1553.c +++ b/drivers/rtc/rtc-ds1553.c | |||
@@ -206,8 +206,7 @@ static irqreturn_t ds1553_rtc_interrupt(int irq, void *dev_id) | |||
206 | events |= RTC_UF; | 206 | events |= RTC_UF; |
207 | else | 207 | else |
208 | events |= RTC_AF; | 208 | events |= RTC_AF; |
209 | if (likely(pdata->rtc)) | 209 | rtc_update_irq(pdata->rtc, 1, events); |
210 | rtc_update_irq(pdata->rtc, 1, events); | ||
211 | } | 210 | } |
212 | spin_unlock(&pdata->lock); | 211 | spin_unlock(&pdata->lock); |
213 | return events ? IRQ_HANDLED : IRQ_NONE; | 212 | return events ? IRQ_HANDLED : IRQ_NONE; |
@@ -278,7 +277,6 @@ static struct bin_attribute ds1553_nvram_attr = { | |||
278 | 277 | ||
279 | static int ds1553_rtc_probe(struct platform_device *pdev) | 278 | static int ds1553_rtc_probe(struct platform_device *pdev) |
280 | { | 279 | { |
281 | struct rtc_device *rtc; | ||
282 | struct resource *res; | 280 | struct resource *res; |
283 | unsigned int cen, sec; | 281 | unsigned int cen, sec; |
284 | struct rtc_plat_data *pdata; | 282 | struct rtc_plat_data *pdata; |
@@ -311,6 +309,12 @@ static int ds1553_rtc_probe(struct platform_device *pdev) | |||
311 | spin_lock_init(&pdata->lock); | 309 | spin_lock_init(&pdata->lock); |
312 | pdata->last_jiffies = jiffies; | 310 | pdata->last_jiffies = jiffies; |
313 | platform_set_drvdata(pdev, pdata); | 311 | platform_set_drvdata(pdev, pdata); |
312 | |||
313 | pdata->rtc = devm_rtc_device_register(&pdev->dev, pdev->name, | ||
314 | &ds1553_rtc_ops, THIS_MODULE); | ||
315 | if (IS_ERR(pdata->rtc)) | ||
316 | return PTR_ERR(pdata->rtc); | ||
317 | |||
314 | if (pdata->irq > 0) { | 318 | if (pdata->irq > 0) { |
315 | writeb(0, ioaddr + RTC_INTERRUPTS); | 319 | writeb(0, ioaddr + RTC_INTERRUPTS); |
316 | if (devm_request_irq(&pdev->dev, pdata->irq, | 320 | if (devm_request_irq(&pdev->dev, pdata->irq, |
@@ -321,15 +325,12 @@ static int ds1553_rtc_probe(struct platform_device *pdev) | |||
321 | } | 325 | } |
322 | } | 326 | } |
323 | 327 | ||
324 | rtc = devm_rtc_device_register(&pdev->dev, pdev->name, | ||
325 | &ds1553_rtc_ops, THIS_MODULE); | ||
326 | if (IS_ERR(rtc)) | ||
327 | return PTR_ERR(rtc); | ||
328 | pdata->rtc = rtc; | ||
329 | |||
330 | ret = sysfs_create_bin_file(&pdev->dev.kobj, &ds1553_nvram_attr); | 328 | ret = sysfs_create_bin_file(&pdev->dev.kobj, &ds1553_nvram_attr); |
329 | if (ret) | ||
330 | dev_err(&pdev->dev, "unable to create sysfs file: %s\n", | ||
331 | ds1553_nvram_attr.attr.name); | ||
331 | 332 | ||
332 | return ret; | 333 | return 0; |
333 | } | 334 | } |
334 | 335 | ||
335 | static int ds1553_rtc_remove(struct platform_device *pdev) | 336 | static int ds1553_rtc_remove(struct platform_device *pdev) |
diff --git a/drivers/rtc/rtc-ds1672.c b/drivers/rtc/rtc-ds1672.c index 18e2d8471472..a4888dbca2e1 100644 --- a/drivers/rtc/rtc-ds1672.c +++ b/drivers/rtc/rtc-ds1672.c | |||
@@ -177,8 +177,9 @@ static int ds1672_probe(struct i2c_client *client, | |||
177 | 177 | ||
178 | /* read control register */ | 178 | /* read control register */ |
179 | err = ds1672_get_control(client, &control); | 179 | err = ds1672_get_control(client, &control); |
180 | if (err) | 180 | if (err) { |
181 | goto exit_devreg; | 181 | dev_warn(&client->dev, "Unable to read the control register\n"); |
182 | } | ||
182 | 183 | ||
183 | if (control & DS1672_REG_CONTROL_EOSC) | 184 | if (control & DS1672_REG_CONTROL_EOSC) |
184 | dev_warn(&client->dev, "Oscillator not enabled. " | 185 | dev_warn(&client->dev, "Oscillator not enabled. " |
@@ -187,12 +188,10 @@ static int ds1672_probe(struct i2c_client *client, | |||
187 | /* Register sysfs hooks */ | 188 | /* Register sysfs hooks */ |
188 | err = device_create_file(&client->dev, &dev_attr_control); | 189 | err = device_create_file(&client->dev, &dev_attr_control); |
189 | if (err) | 190 | if (err) |
190 | goto exit_devreg; | 191 | dev_err(&client->dev, "Unable to create sysfs entry: %s\n", |
192 | dev_attr_control.attr.name); | ||
191 | 193 | ||
192 | return 0; | 194 | return 0; |
193 | |||
194 | exit_devreg: | ||
195 | return err; | ||
196 | } | 195 | } |
197 | 196 | ||
198 | static struct i2c_device_id ds1672_id[] = { | 197 | static struct i2c_device_id ds1672_id[] = { |
diff --git a/drivers/rtc/rtc-ds1742.c b/drivers/rtc/rtc-ds1742.c index 5a1f3b2a8f1e..942103dac30f 100644 --- a/drivers/rtc/rtc-ds1742.c +++ b/drivers/rtc/rtc-ds1742.c | |||
@@ -204,8 +204,11 @@ static int ds1742_rtc_probe(struct platform_device *pdev) | |||
204 | return PTR_ERR(rtc); | 204 | return PTR_ERR(rtc); |
205 | 205 | ||
206 | ret = sysfs_create_bin_file(&pdev->dev.kobj, &pdata->nvram_attr); | 206 | ret = sysfs_create_bin_file(&pdev->dev.kobj, &pdata->nvram_attr); |
207 | if (ret) | ||
208 | dev_err(&pdev->dev, "Unable to create sysfs entry: %s\n", | ||
209 | pdata->nvram_attr.attr.name); | ||
207 | 210 | ||
208 | return ret; | 211 | return 0; |
209 | } | 212 | } |
210 | 213 | ||
211 | static int ds1742_rtc_remove(struct platform_device *pdev) | 214 | static int ds1742_rtc_remove(struct platform_device *pdev) |
diff --git a/drivers/rtc/rtc-ds3232.c b/drivers/rtc/rtc-ds3232.c index b83bb5a527f8..adaf06c41479 100644 --- a/drivers/rtc/rtc-ds3232.c +++ b/drivers/rtc/rtc-ds3232.c | |||
@@ -57,6 +57,7 @@ struct ds3232 { | |||
57 | * in the remove function. | 57 | * in the remove function. |
58 | */ | 58 | */ |
59 | struct mutex mutex; | 59 | struct mutex mutex; |
60 | bool suspended; | ||
60 | int exiting; | 61 | int exiting; |
61 | }; | 62 | }; |
62 | 63 | ||
@@ -345,7 +346,15 @@ static irqreturn_t ds3232_irq(int irq, void *dev_id) | |||
345 | struct ds3232 *ds3232 = i2c_get_clientdata(client); | 346 | struct ds3232 *ds3232 = i2c_get_clientdata(client); |
346 | 347 | ||
347 | disable_irq_nosync(irq); | 348 | disable_irq_nosync(irq); |
348 | schedule_work(&ds3232->work); | 349 | |
350 | /* | ||
351 | * If rtc as a wakeup source, can't schedule the work | ||
352 | * at system resume flow, because at this time the i2c bus | ||
353 | * has not been resumed. | ||
354 | */ | ||
355 | if (!ds3232->suspended) | ||
356 | schedule_work(&ds3232->work); | ||
357 | |||
349 | return IRQ_HANDLED; | 358 | return IRQ_HANDLED; |
350 | } | 359 | } |
351 | 360 | ||
@@ -363,22 +372,26 @@ static void ds3232_work(struct work_struct *work) | |||
363 | 372 | ||
364 | if (stat & DS3232_REG_SR_A1F) { | 373 | if (stat & DS3232_REG_SR_A1F) { |
365 | control = i2c_smbus_read_byte_data(client, DS3232_REG_CR); | 374 | control = i2c_smbus_read_byte_data(client, DS3232_REG_CR); |
366 | if (control < 0) | 375 | if (control < 0) { |
367 | goto out; | 376 | pr_warn("Read DS3232 Control Register error." |
368 | /* disable alarm1 interrupt */ | 377 | "Disable IRQ%d.\n", client->irq); |
369 | control &= ~(DS3232_REG_CR_A1IE); | 378 | } else { |
370 | i2c_smbus_write_byte_data(client, DS3232_REG_CR, control); | 379 | /* disable alarm1 interrupt */ |
371 | 380 | control &= ~(DS3232_REG_CR_A1IE); | |
372 | /* clear the alarm pend flag */ | 381 | i2c_smbus_write_byte_data(client, DS3232_REG_CR, |
373 | stat &= ~DS3232_REG_SR_A1F; | 382 | control); |
374 | i2c_smbus_write_byte_data(client, DS3232_REG_SR, stat); | 383 | |
375 | 384 | /* clear the alarm pend flag */ | |
376 | rtc_update_irq(ds3232->rtc, 1, RTC_AF | RTC_IRQF); | 385 | stat &= ~DS3232_REG_SR_A1F; |
386 | i2c_smbus_write_byte_data(client, DS3232_REG_SR, stat); | ||
387 | |||
388 | rtc_update_irq(ds3232->rtc, 1, RTC_AF | RTC_IRQF); | ||
389 | |||
390 | if (!ds3232->exiting) | ||
391 | enable_irq(client->irq); | ||
392 | } | ||
377 | } | 393 | } |
378 | 394 | ||
379 | out: | ||
380 | if (!ds3232->exiting) | ||
381 | enable_irq(client->irq); | ||
382 | unlock: | 395 | unlock: |
383 | mutex_unlock(&ds3232->mutex); | 396 | mutex_unlock(&ds3232->mutex); |
384 | } | 397 | } |
@@ -411,23 +424,17 @@ static int ds3232_probe(struct i2c_client *client, | |||
411 | if (ret) | 424 | if (ret) |
412 | return ret; | 425 | return ret; |
413 | 426 | ||
414 | ds3232->rtc = devm_rtc_device_register(&client->dev, client->name, | 427 | if (client->irq > 0) { |
415 | &ds3232_rtc_ops, THIS_MODULE); | 428 | ret = devm_request_irq(&client->dev, client->irq, ds3232_irq, |
416 | if (IS_ERR(ds3232->rtc)) { | 429 | IRQF_SHARED, "ds3232", client); |
417 | dev_err(&client->dev, "unable to register the class device\n"); | ||
418 | return PTR_ERR(ds3232->rtc); | ||
419 | } | ||
420 | |||
421 | if (client->irq >= 0) { | ||
422 | ret = devm_request_irq(&client->dev, client->irq, ds3232_irq, 0, | ||
423 | "ds3232", client); | ||
424 | if (ret) { | 430 | if (ret) { |
425 | dev_err(&client->dev, "unable to request IRQ\n"); | 431 | dev_err(&client->dev, "unable to request IRQ\n"); |
426 | return ret; | ||
427 | } | 432 | } |
433 | device_init_wakeup(&client->dev, 1); | ||
428 | } | 434 | } |
429 | 435 | ds3232->rtc = devm_rtc_device_register(&client->dev, client->name, | |
430 | return 0; | 436 | &ds3232_rtc_ops, THIS_MODULE); |
437 | return PTR_ERR_OR_ZERO(ds3232->rtc); | ||
431 | } | 438 | } |
432 | 439 | ||
433 | static int ds3232_remove(struct i2c_client *client) | 440 | static int ds3232_remove(struct i2c_client *client) |
@@ -446,6 +453,42 @@ static int ds3232_remove(struct i2c_client *client) | |||
446 | return 0; | 453 | return 0; |
447 | } | 454 | } |
448 | 455 | ||
456 | #ifdef CONFIG_PM_SLEEP | ||
457 | static int ds3232_suspend(struct device *dev) | ||
458 | { | ||
459 | struct ds3232 *ds3232 = dev_get_drvdata(dev); | ||
460 | struct i2c_client *client = to_i2c_client(dev); | ||
461 | |||
462 | if (device_can_wakeup(dev)) { | ||
463 | ds3232->suspended = true; | ||
464 | irq_set_irq_wake(client->irq, 1); | ||
465 | } | ||
466 | |||
467 | return 0; | ||
468 | } | ||
469 | |||
470 | static int ds3232_resume(struct device *dev) | ||
471 | { | ||
472 | struct ds3232 *ds3232 = dev_get_drvdata(dev); | ||
473 | struct i2c_client *client = to_i2c_client(dev); | ||
474 | |||
475 | if (ds3232->suspended) { | ||
476 | ds3232->suspended = false; | ||
477 | |||
478 | /* Clear the hardware alarm pend flag */ | ||
479 | schedule_work(&ds3232->work); | ||
480 | |||
481 | irq_set_irq_wake(client->irq, 0); | ||
482 | } | ||
483 | |||
484 | return 0; | ||
485 | } | ||
486 | #endif | ||
487 | |||
488 | static const struct dev_pm_ops ds3232_pm_ops = { | ||
489 | SET_SYSTEM_SLEEP_PM_OPS(ds3232_suspend, ds3232_resume) | ||
490 | }; | ||
491 | |||
449 | static const struct i2c_device_id ds3232_id[] = { | 492 | static const struct i2c_device_id ds3232_id[] = { |
450 | { "ds3232", 0 }, | 493 | { "ds3232", 0 }, |
451 | { } | 494 | { } |
@@ -456,6 +499,7 @@ static struct i2c_driver ds3232_driver = { | |||
456 | .driver = { | 499 | .driver = { |
457 | .name = "rtc-ds3232", | 500 | .name = "rtc-ds3232", |
458 | .owner = THIS_MODULE, | 501 | .owner = THIS_MODULE, |
502 | .pm = &ds3232_pm_ops, | ||
459 | }, | 503 | }, |
460 | .probe = ds3232_probe, | 504 | .probe = ds3232_probe, |
461 | .remove = ds3232_remove, | 505 | .remove = ds3232_remove, |
diff --git a/drivers/rtc/rtc-imxdi.c b/drivers/rtc/rtc-imxdi.c index abd7f9091f34..cd741c77e085 100644 --- a/drivers/rtc/rtc-imxdi.c +++ b/drivers/rtc/rtc-imxdi.c | |||
@@ -401,7 +401,9 @@ static int __init dryice_rtc_probe(struct platform_device *pdev) | |||
401 | imxdi->clk = devm_clk_get(&pdev->dev, NULL); | 401 | imxdi->clk = devm_clk_get(&pdev->dev, NULL); |
402 | if (IS_ERR(imxdi->clk)) | 402 | if (IS_ERR(imxdi->clk)) |
403 | return PTR_ERR(imxdi->clk); | 403 | return PTR_ERR(imxdi->clk); |
404 | clk_prepare_enable(imxdi->clk); | 404 | rc = clk_prepare_enable(imxdi->clk); |
405 | if (rc) | ||
406 | return rc; | ||
405 | 407 | ||
406 | /* | 408 | /* |
407 | * Initialize dryice hardware | 409 | * Initialize dryice hardware |
diff --git a/drivers/rtc/rtc-isl12057.c b/drivers/rtc/rtc-isl12057.c index 7854a656628f..7e5ead936a04 100644 --- a/drivers/rtc/rtc-isl12057.c +++ b/drivers/rtc/rtc-isl12057.c | |||
@@ -26,7 +26,6 @@ | |||
26 | #include <linux/rtc.h> | 26 | #include <linux/rtc.h> |
27 | #include <linux/i2c.h> | 27 | #include <linux/i2c.h> |
28 | #include <linux/bcd.h> | 28 | #include <linux/bcd.h> |
29 | #include <linux/rtc.h> | ||
30 | #include <linux/of.h> | 29 | #include <linux/of.h> |
31 | #include <linux/of_device.h> | 30 | #include <linux/of_device.h> |
32 | #include <linux/regmap.h> | 31 | #include <linux/regmap.h> |
diff --git a/drivers/rtc/rtc-jz4740.c b/drivers/rtc/rtc-jz4740.c index 1b126d2513de..08f5160fb6d4 100644 --- a/drivers/rtc/rtc-jz4740.c +++ b/drivers/rtc/rtc-jz4740.c | |||
@@ -38,7 +38,6 @@ | |||
38 | #define JZ_RTC_CTRL_ENABLE BIT(0) | 38 | #define JZ_RTC_CTRL_ENABLE BIT(0) |
39 | 39 | ||
40 | struct jz4740_rtc { | 40 | struct jz4740_rtc { |
41 | struct resource *mem; | ||
42 | void __iomem *base; | 41 | void __iomem *base; |
43 | 42 | ||
44 | struct rtc_device *rtc; | 43 | struct rtc_device *rtc; |
@@ -216,6 +215,7 @@ static int jz4740_rtc_probe(struct platform_device *pdev) | |||
216 | int ret; | 215 | int ret; |
217 | struct jz4740_rtc *rtc; | 216 | struct jz4740_rtc *rtc; |
218 | uint32_t scratchpad; | 217 | uint32_t scratchpad; |
218 | struct resource *mem; | ||
219 | 219 | ||
220 | rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); | 220 | rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); |
221 | if (!rtc) | 221 | if (!rtc) |
@@ -227,25 +227,10 @@ static int jz4740_rtc_probe(struct platform_device *pdev) | |||
227 | return -ENOENT; | 227 | return -ENOENT; |
228 | } | 228 | } |
229 | 229 | ||
230 | rtc->mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 230 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
231 | if (!rtc->mem) { | 231 | rtc->base = devm_ioremap_resource(&pdev->dev, mem); |
232 | dev_err(&pdev->dev, "Failed to get platform mmio memory\n"); | 232 | if (IS_ERR(rtc->base)) |
233 | return -ENOENT; | 233 | return PTR_ERR(rtc->base); |
234 | } | ||
235 | |||
236 | rtc->mem = devm_request_mem_region(&pdev->dev, rtc->mem->start, | ||
237 | resource_size(rtc->mem), pdev->name); | ||
238 | if (!rtc->mem) { | ||
239 | dev_err(&pdev->dev, "Failed to request mmio memory region\n"); | ||
240 | return -EBUSY; | ||
241 | } | ||
242 | |||
243 | rtc->base = devm_ioremap_nocache(&pdev->dev, rtc->mem->start, | ||
244 | resource_size(rtc->mem)); | ||
245 | if (!rtc->base) { | ||
246 | dev_err(&pdev->dev, "Failed to ioremap mmio memory\n"); | ||
247 | return -EBUSY; | ||
248 | } | ||
249 | 234 | ||
250 | spin_lock_init(&rtc->lock); | 235 | spin_lock_init(&rtc->lock); |
251 | 236 | ||
diff --git a/drivers/rtc/rtc-lpc32xx.c b/drivers/rtc/rtc-lpc32xx.c index bfdbcb82d069..f130c08c98f8 100644 --- a/drivers/rtc/rtc-lpc32xx.c +++ b/drivers/rtc/rtc-lpc32xx.c | |||
@@ -211,10 +211,9 @@ static int lpc32xx_rtc_probe(struct platform_device *pdev) | |||
211 | } | 211 | } |
212 | 212 | ||
213 | rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); | 213 | rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); |
214 | if (unlikely(!rtc)) { | 214 | if (unlikely(!rtc)) |
215 | dev_err(&pdev->dev, "Can't allocate memory\n"); | ||
216 | return -ENOMEM; | 215 | return -ENOMEM; |
217 | } | 216 | |
218 | rtc->irq = rtcirq; | 217 | rtc->irq = rtcirq; |
219 | 218 | ||
220 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 219 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
diff --git a/drivers/rtc/rtc-mc13xxx.c b/drivers/rtc/rtc-mc13xxx.c index 77ea9896b5ba..0765606a2d14 100644 --- a/drivers/rtc/rtc-mc13xxx.c +++ b/drivers/rtc/rtc-mc13xxx.c | |||
@@ -23,6 +23,8 @@ | |||
23 | #define MC13XXX_RTCDAY 22 | 23 | #define MC13XXX_RTCDAY 22 |
24 | #define MC13XXX_RTCDAYA 23 | 24 | #define MC13XXX_RTCDAYA 23 |
25 | 25 | ||
26 | #define SEC_PER_DAY (24 * 60 * 60) | ||
27 | |||
26 | struct mc13xxx_rtc { | 28 | struct mc13xxx_rtc { |
27 | struct rtc_device *rtc; | 29 | struct rtc_device *rtc; |
28 | struct mc13xxx *mc13xxx; | 30 | struct mc13xxx *mc13xxx; |
@@ -42,15 +44,15 @@ static int mc13xxx_rtc_irq_enable_unlocked(struct device *dev, | |||
42 | return func(priv->mc13xxx, irq); | 44 | return func(priv->mc13xxx, irq); |
43 | } | 45 | } |
44 | 46 | ||
45 | static int mc13xxx_rtc_irq_enable(struct device *dev, | 47 | static int mc13xxx_rtc_alarm_irq_enable(struct device *dev, |
46 | unsigned int enabled, int irq) | 48 | unsigned int enabled) |
47 | { | 49 | { |
48 | struct mc13xxx_rtc *priv = dev_get_drvdata(dev); | 50 | struct mc13xxx_rtc *priv = dev_get_drvdata(dev); |
49 | int ret; | 51 | int ret; |
50 | 52 | ||
51 | mc13xxx_lock(priv->mc13xxx); | 53 | mc13xxx_lock(priv->mc13xxx); |
52 | 54 | ||
53 | ret = mc13xxx_rtc_irq_enable_unlocked(dev, enabled, irq); | 55 | ret = mc13xxx_rtc_irq_enable_unlocked(dev, enabled, MC13XXX_IRQ_TODA); |
54 | 56 | ||
55 | mc13xxx_unlock(priv->mc13xxx); | 57 | mc13xxx_unlock(priv->mc13xxx); |
56 | 58 | ||
@@ -61,44 +63,27 @@ static int mc13xxx_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
61 | { | 63 | { |
62 | struct mc13xxx_rtc *priv = dev_get_drvdata(dev); | 64 | struct mc13xxx_rtc *priv = dev_get_drvdata(dev); |
63 | unsigned int seconds, days1, days2; | 65 | unsigned int seconds, days1, days2; |
64 | unsigned long s1970; | ||
65 | int ret; | ||
66 | |||
67 | mc13xxx_lock(priv->mc13xxx); | ||
68 | |||
69 | if (!priv->valid) { | ||
70 | ret = -ENODATA; | ||
71 | goto out; | ||
72 | } | ||
73 | 66 | ||
74 | ret = mc13xxx_reg_read(priv->mc13xxx, MC13XXX_RTCDAY, &days1); | 67 | if (!priv->valid) |
75 | if (unlikely(ret)) | 68 | return -ENODATA; |
76 | goto out; | ||
77 | |||
78 | ret = mc13xxx_reg_read(priv->mc13xxx, MC13XXX_RTCTOD, &seconds); | ||
79 | if (unlikely(ret)) | ||
80 | goto out; | ||
81 | |||
82 | ret = mc13xxx_reg_read(priv->mc13xxx, MC13XXX_RTCDAY, &days2); | ||
83 | out: | ||
84 | mc13xxx_unlock(priv->mc13xxx); | ||
85 | 69 | ||
86 | if (ret) | 70 | do { |
87 | return ret; | 71 | int ret; |
88 | 72 | ||
89 | if (days2 == days1 + 1) { | 73 | ret = mc13xxx_reg_read(priv->mc13xxx, MC13XXX_RTCDAY, &days1); |
90 | if (seconds >= 86400 / 2) | 74 | if (ret) |
91 | days2 = days1; | 75 | return ret; |
92 | else | ||
93 | days1 = days2; | ||
94 | } | ||
95 | 76 | ||
96 | if (days1 != days2) | 77 | ret = mc13xxx_reg_read(priv->mc13xxx, MC13XXX_RTCTOD, &seconds); |
97 | return -EIO; | 78 | if (ret) |
79 | return ret; | ||
98 | 80 | ||
99 | s1970 = days1 * 86400 + seconds; | 81 | ret = mc13xxx_reg_read(priv->mc13xxx, MC13XXX_RTCDAY, &days2); |
82 | if (ret) | ||
83 | return ret; | ||
84 | } while (days1 != days2); | ||
100 | 85 | ||
101 | rtc_time_to_tm(s1970, tm); | 86 | rtc_time_to_tm(days1 * SEC_PER_DAY + seconds, tm); |
102 | 87 | ||
103 | return rtc_valid_tm(tm); | 88 | return rtc_valid_tm(tm); |
104 | } | 89 | } |
@@ -110,8 +95,8 @@ static int mc13xxx_rtc_set_mmss(struct device *dev, unsigned long secs) | |||
110 | unsigned int alarmseconds; | 95 | unsigned int alarmseconds; |
111 | int ret; | 96 | int ret; |
112 | 97 | ||
113 | seconds = secs % 86400; | 98 | seconds = secs % SEC_PER_DAY; |
114 | days = secs / 86400; | 99 | days = secs / SEC_PER_DAY; |
115 | 100 | ||
116 | mc13xxx_lock(priv->mc13xxx); | 101 | mc13xxx_lock(priv->mc13xxx); |
117 | 102 | ||
@@ -123,7 +108,7 @@ static int mc13xxx_rtc_set_mmss(struct device *dev, unsigned long secs) | |||
123 | if (unlikely(ret)) | 108 | if (unlikely(ret)) |
124 | goto out; | 109 | goto out; |
125 | 110 | ||
126 | if (alarmseconds < 86400) { | 111 | if (alarmseconds < SEC_PER_DAY) { |
127 | ret = mc13xxx_reg_write(priv->mc13xxx, | 112 | ret = mc13xxx_reg_write(priv->mc13xxx, |
128 | MC13XXX_RTCTODA, 0x1ffff); | 113 | MC13XXX_RTCTODA, 0x1ffff); |
129 | if (unlikely(ret)) | 114 | if (unlikely(ret)) |
@@ -147,18 +132,21 @@ static int mc13xxx_rtc_set_mmss(struct device *dev, unsigned long secs) | |||
147 | goto out; | 132 | goto out; |
148 | 133 | ||
149 | /* restore alarm */ | 134 | /* restore alarm */ |
150 | if (alarmseconds < 86400) { | 135 | if (alarmseconds < SEC_PER_DAY) { |
151 | ret = mc13xxx_reg_write(priv->mc13xxx, | 136 | ret = mc13xxx_reg_write(priv->mc13xxx, |
152 | MC13XXX_RTCTODA, alarmseconds); | 137 | MC13XXX_RTCTODA, alarmseconds); |
153 | if (unlikely(ret)) | 138 | if (unlikely(ret)) |
154 | goto out; | 139 | goto out; |
155 | } | 140 | } |
156 | 141 | ||
157 | ret = mc13xxx_irq_ack(priv->mc13xxx, MC13XXX_IRQ_RTCRST); | 142 | if (!priv->valid) { |
158 | if (unlikely(ret)) | 143 | ret = mc13xxx_irq_ack(priv->mc13xxx, MC13XXX_IRQ_RTCRST); |
159 | goto out; | 144 | if (unlikely(ret)) |
145 | goto out; | ||
146 | |||
147 | ret = mc13xxx_irq_unmask(priv->mc13xxx, MC13XXX_IRQ_RTCRST); | ||
148 | } | ||
160 | 149 | ||
161 | ret = mc13xxx_irq_unmask(priv->mc13xxx, MC13XXX_IRQ_RTCRST); | ||
162 | out: | 150 | out: |
163 | priv->valid = !ret; | 151 | priv->valid = !ret; |
164 | 152 | ||
@@ -180,7 +168,7 @@ static int mc13xxx_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm) | |||
180 | ret = mc13xxx_reg_read(priv->mc13xxx, MC13XXX_RTCTODA, &seconds); | 168 | ret = mc13xxx_reg_read(priv->mc13xxx, MC13XXX_RTCTODA, &seconds); |
181 | if (unlikely(ret)) | 169 | if (unlikely(ret)) |
182 | goto out; | 170 | goto out; |
183 | if (seconds >= 86400) { | 171 | if (seconds >= SEC_PER_DAY) { |
184 | ret = -ENODATA; | 172 | ret = -ENODATA; |
185 | goto out; | 173 | goto out; |
186 | } | 174 | } |
@@ -201,7 +189,7 @@ out: | |||
201 | alarm->enabled = enabled; | 189 | alarm->enabled = enabled; |
202 | alarm->pending = pending; | 190 | alarm->pending = pending; |
203 | 191 | ||
204 | s1970 = days * 86400 + seconds; | 192 | s1970 = days * SEC_PER_DAY + seconds; |
205 | 193 | ||
206 | rtc_time_to_tm(s1970, &alarm->time); | 194 | rtc_time_to_tm(s1970, &alarm->time); |
207 | dev_dbg(dev, "%s: %lu\n", __func__, s1970); | 195 | dev_dbg(dev, "%s: %lu\n", __func__, s1970); |
@@ -239,8 +227,8 @@ static int mc13xxx_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm) | |||
239 | if (unlikely(ret)) | 227 | if (unlikely(ret)) |
240 | goto out; | 228 | goto out; |
241 | 229 | ||
242 | seconds = s1970 % 86400; | 230 | seconds = s1970 % SEC_PER_DAY; |
243 | days = s1970 / 86400; | 231 | days = s1970 / SEC_PER_DAY; |
244 | 232 | ||
245 | ret = mc13xxx_reg_write(priv->mc13xxx, MC13XXX_RTCDAYA, days); | 233 | ret = mc13xxx_reg_write(priv->mc13xxx, MC13XXX_RTCDAYA, days); |
246 | if (unlikely(ret)) | 234 | if (unlikely(ret)) |
@@ -259,8 +247,6 @@ static irqreturn_t mc13xxx_rtc_alarm_handler(int irq, void *dev) | |||
259 | struct mc13xxx_rtc *priv = dev; | 247 | struct mc13xxx_rtc *priv = dev; |
260 | struct mc13xxx *mc13xxx = priv->mc13xxx; | 248 | struct mc13xxx *mc13xxx = priv->mc13xxx; |
261 | 249 | ||
262 | dev_dbg(&priv->rtc->dev, "Alarm\n"); | ||
263 | |||
264 | rtc_update_irq(priv->rtc, 1, RTC_IRQF | RTC_AF); | 250 | rtc_update_irq(priv->rtc, 1, RTC_IRQF | RTC_AF); |
265 | 251 | ||
266 | mc13xxx_irq_ack(mc13xxx, irq); | 252 | mc13xxx_irq_ack(mc13xxx, irq); |
@@ -273,8 +259,6 @@ static irqreturn_t mc13xxx_rtc_update_handler(int irq, void *dev) | |||
273 | struct mc13xxx_rtc *priv = dev; | 259 | struct mc13xxx_rtc *priv = dev; |
274 | struct mc13xxx *mc13xxx = priv->mc13xxx; | 260 | struct mc13xxx *mc13xxx = priv->mc13xxx; |
275 | 261 | ||
276 | dev_dbg(&priv->rtc->dev, "1HZ\n"); | ||
277 | |||
278 | rtc_update_irq(priv->rtc, 1, RTC_IRQF | RTC_UF); | 262 | rtc_update_irq(priv->rtc, 1, RTC_IRQF | RTC_UF); |
279 | 263 | ||
280 | mc13xxx_irq_ack(mc13xxx, irq); | 264 | mc13xxx_irq_ack(mc13xxx, irq); |
@@ -282,12 +266,6 @@ static irqreturn_t mc13xxx_rtc_update_handler(int irq, void *dev) | |||
282 | return IRQ_HANDLED; | 266 | return IRQ_HANDLED; |
283 | } | 267 | } |
284 | 268 | ||
285 | static int mc13xxx_rtc_alarm_irq_enable(struct device *dev, | ||
286 | unsigned int enabled) | ||
287 | { | ||
288 | return mc13xxx_rtc_irq_enable(dev, enabled, MC13XXX_IRQ_TODA); | ||
289 | } | ||
290 | |||
291 | static const struct rtc_class_ops mc13xxx_rtc_ops = { | 269 | static const struct rtc_class_ops mc13xxx_rtc_ops = { |
292 | .read_time = mc13xxx_rtc_read_time, | 270 | .read_time = mc13xxx_rtc_read_time, |
293 | .set_mmss = mc13xxx_rtc_set_mmss, | 271 | .set_mmss = mc13xxx_rtc_set_mmss, |
@@ -301,7 +279,6 @@ static irqreturn_t mc13xxx_rtc_reset_handler(int irq, void *dev) | |||
301 | struct mc13xxx_rtc *priv = dev; | 279 | struct mc13xxx_rtc *priv = dev; |
302 | struct mc13xxx *mc13xxx = priv->mc13xxx; | 280 | struct mc13xxx *mc13xxx = priv->mc13xxx; |
303 | 281 | ||
304 | dev_dbg(&priv->rtc->dev, "RTCRST\n"); | ||
305 | priv->valid = 0; | 282 | priv->valid = 0; |
306 | 283 | ||
307 | mc13xxx_irq_mask(mc13xxx, irq); | 284 | mc13xxx_irq_mask(mc13xxx, irq); |
@@ -314,7 +291,6 @@ static int __init mc13xxx_rtc_probe(struct platform_device *pdev) | |||
314 | int ret; | 291 | int ret; |
315 | struct mc13xxx_rtc *priv; | 292 | struct mc13xxx_rtc *priv; |
316 | struct mc13xxx *mc13xxx; | 293 | struct mc13xxx *mc13xxx; |
317 | int rtcrst_pending; | ||
318 | 294 | ||
319 | priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); | 295 | priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); |
320 | if (!priv) | 296 | if (!priv) |
@@ -322,60 +298,47 @@ static int __init mc13xxx_rtc_probe(struct platform_device *pdev) | |||
322 | 298 | ||
323 | mc13xxx = dev_get_drvdata(pdev->dev.parent); | 299 | mc13xxx = dev_get_drvdata(pdev->dev.parent); |
324 | priv->mc13xxx = mc13xxx; | 300 | priv->mc13xxx = mc13xxx; |
301 | priv->valid = 1; | ||
325 | 302 | ||
326 | platform_set_drvdata(pdev, priv); | 303 | platform_set_drvdata(pdev, priv); |
327 | 304 | ||
328 | mc13xxx_lock(mc13xxx); | 305 | mc13xxx_lock(mc13xxx); |
329 | 306 | ||
307 | mc13xxx_irq_ack(mc13xxx, MC13XXX_IRQ_RTCRST); | ||
308 | |||
330 | ret = mc13xxx_irq_request(mc13xxx, MC13XXX_IRQ_RTCRST, | 309 | ret = mc13xxx_irq_request(mc13xxx, MC13XXX_IRQ_RTCRST, |
331 | mc13xxx_rtc_reset_handler, DRIVER_NAME, priv); | 310 | mc13xxx_rtc_reset_handler, DRIVER_NAME, priv); |
332 | if (ret) | 311 | if (ret) |
333 | goto err_reset_irq_request; | 312 | goto err_irq_request; |
334 | |||
335 | ret = mc13xxx_irq_status(mc13xxx, MC13XXX_IRQ_RTCRST, | ||
336 | NULL, &rtcrst_pending); | ||
337 | if (ret) | ||
338 | goto err_reset_irq_status; | ||
339 | |||
340 | priv->valid = !rtcrst_pending; | ||
341 | 313 | ||
342 | ret = mc13xxx_irq_request_nounmask(mc13xxx, MC13XXX_IRQ_1HZ, | 314 | ret = mc13xxx_irq_request(mc13xxx, MC13XXX_IRQ_1HZ, |
343 | mc13xxx_rtc_update_handler, DRIVER_NAME, priv); | 315 | mc13xxx_rtc_update_handler, DRIVER_NAME, priv); |
344 | if (ret) | 316 | if (ret) |
345 | goto err_update_irq_request; | 317 | goto err_irq_request; |
346 | 318 | ||
347 | ret = mc13xxx_irq_request_nounmask(mc13xxx, MC13XXX_IRQ_TODA, | 319 | ret = mc13xxx_irq_request_nounmask(mc13xxx, MC13XXX_IRQ_TODA, |
348 | mc13xxx_rtc_alarm_handler, DRIVER_NAME, priv); | 320 | mc13xxx_rtc_alarm_handler, DRIVER_NAME, priv); |
349 | if (ret) | 321 | if (ret) |
350 | goto err_alarm_irq_request; | 322 | goto err_irq_request; |
351 | 323 | ||
352 | mc13xxx_unlock(mc13xxx); | 324 | mc13xxx_unlock(mc13xxx); |
353 | 325 | ||
354 | priv->rtc = devm_rtc_device_register(&pdev->dev, pdev->name, | 326 | priv->rtc = devm_rtc_device_register(&pdev->dev, pdev->name, |
355 | &mc13xxx_rtc_ops, THIS_MODULE); | 327 | &mc13xxx_rtc_ops, THIS_MODULE); |
356 | if (IS_ERR(priv->rtc)) { | ||
357 | ret = PTR_ERR(priv->rtc); | ||
358 | 328 | ||
359 | mc13xxx_lock(mc13xxx); | 329 | return 0; |
360 | |||
361 | mc13xxx_irq_free(mc13xxx, MC13XXX_IRQ_TODA, priv); | ||
362 | err_alarm_irq_request: | ||
363 | |||
364 | mc13xxx_irq_free(mc13xxx, MC13XXX_IRQ_1HZ, priv); | ||
365 | err_update_irq_request: | ||
366 | |||
367 | err_reset_irq_status: | ||
368 | 330 | ||
369 | mc13xxx_irq_free(mc13xxx, MC13XXX_IRQ_RTCRST, priv); | 331 | err_irq_request: |
370 | err_reset_irq_request: | 332 | mc13xxx_irq_free(mc13xxx, MC13XXX_IRQ_TODA, priv); |
333 | mc13xxx_irq_free(mc13xxx, MC13XXX_IRQ_1HZ, priv); | ||
334 | mc13xxx_irq_free(mc13xxx, MC13XXX_IRQ_RTCRST, priv); | ||
371 | 335 | ||
372 | mc13xxx_unlock(mc13xxx); | 336 | mc13xxx_unlock(mc13xxx); |
373 | } | ||
374 | 337 | ||
375 | return ret; | 338 | return ret; |
376 | } | 339 | } |
377 | 340 | ||
378 | static int __exit mc13xxx_rtc_remove(struct platform_device *pdev) | 341 | static int mc13xxx_rtc_remove(struct platform_device *pdev) |
379 | { | 342 | { |
380 | struct mc13xxx_rtc *priv = platform_get_drvdata(pdev); | 343 | struct mc13xxx_rtc *priv = platform_get_drvdata(pdev); |
381 | 344 | ||
@@ -404,7 +367,7 @@ MODULE_DEVICE_TABLE(platform, mc13xxx_rtc_idtable); | |||
404 | 367 | ||
405 | static struct platform_driver mc13xxx_rtc_driver = { | 368 | static struct platform_driver mc13xxx_rtc_driver = { |
406 | .id_table = mc13xxx_rtc_idtable, | 369 | .id_table = mc13xxx_rtc_idtable, |
407 | .remove = __exit_p(mc13xxx_rtc_remove), | 370 | .remove = mc13xxx_rtc_remove, |
408 | .driver = { | 371 | .driver = { |
409 | .name = DRIVER_NAME, | 372 | .name = DRIVER_NAME, |
410 | .owner = THIS_MODULE, | 373 | .owner = THIS_MODULE, |
diff --git a/drivers/rtc/rtc-moxart.c b/drivers/rtc/rtc-moxart.c index c29dee0946e6..c31846238871 100644 --- a/drivers/rtc/rtc-moxart.c +++ b/drivers/rtc/rtc-moxart.c | |||
@@ -247,10 +247,8 @@ static int moxart_rtc_probe(struct platform_device *pdev) | |||
247 | int ret = 0; | 247 | int ret = 0; |
248 | 248 | ||
249 | moxart_rtc = devm_kzalloc(&pdev->dev, sizeof(*moxart_rtc), GFP_KERNEL); | 249 | moxart_rtc = devm_kzalloc(&pdev->dev, sizeof(*moxart_rtc), GFP_KERNEL); |
250 | if (!moxart_rtc) { | 250 | if (!moxart_rtc) |
251 | dev_err(&pdev->dev, "devm_kzalloc failed\n"); | ||
252 | return -ENOMEM; | 251 | return -ENOMEM; |
253 | } | ||
254 | 252 | ||
255 | moxart_rtc->gpio_data = of_get_named_gpio(pdev->dev.of_node, | 253 | moxart_rtc->gpio_data = of_get_named_gpio(pdev->dev.of_node, |
256 | "gpio-rtc-data", 0); | 254 | "gpio-rtc-data", 0); |
diff --git a/drivers/rtc/rtc-nuc900.c b/drivers/rtc/rtc-nuc900.c index 248653c74b80..a53da0958e95 100644 --- a/drivers/rtc/rtc-nuc900.c +++ b/drivers/rtc/rtc-nuc900.c | |||
@@ -229,10 +229,9 @@ static int __init nuc900_rtc_probe(struct platform_device *pdev) | |||
229 | 229 | ||
230 | nuc900_rtc = devm_kzalloc(&pdev->dev, sizeof(struct nuc900_rtc), | 230 | nuc900_rtc = devm_kzalloc(&pdev->dev, sizeof(struct nuc900_rtc), |
231 | GFP_KERNEL); | 231 | GFP_KERNEL); |
232 | if (!nuc900_rtc) { | 232 | if (!nuc900_rtc) |
233 | dev_err(&pdev->dev, "kzalloc nuc900_rtc failed\n"); | ||
234 | return -ENOMEM; | 233 | return -ENOMEM; |
235 | } | 234 | |
236 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 235 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
237 | nuc900_rtc->rtc_reg = devm_ioremap_resource(&pdev->dev, res); | 236 | nuc900_rtc->rtc_reg = devm_ioremap_resource(&pdev->dev, res); |
238 | if (IS_ERR(nuc900_rtc->rtc_reg)) | 237 | if (IS_ERR(nuc900_rtc->rtc_reg)) |
diff --git a/drivers/rtc/rtc-palmas.c b/drivers/rtc/rtc-palmas.c index fffb7d3449d7..c360d62fb3f6 100644 --- a/drivers/rtc/rtc-palmas.c +++ b/drivers/rtc/rtc-palmas.c | |||
@@ -348,9 +348,8 @@ static int palmas_rtc_resume(struct device *dev) | |||
348 | } | 348 | } |
349 | #endif | 349 | #endif |
350 | 350 | ||
351 | static const struct dev_pm_ops palmas_rtc_pm_ops = { | 351 | static SIMPLE_DEV_PM_OPS(palmas_rtc_pm_ops, palmas_rtc_suspend, |
352 | SET_SYSTEM_SLEEP_PM_OPS(palmas_rtc_suspend, palmas_rtc_resume) | 352 | palmas_rtc_resume); |
353 | }; | ||
354 | 353 | ||
355 | #ifdef CONFIG_OF | 354 | #ifdef CONFIG_OF |
356 | static struct of_device_id of_palmas_rtc_match[] = { | 355 | static struct of_device_id of_palmas_rtc_match[] = { |
diff --git a/drivers/rtc/rtc-pm8xxx.c b/drivers/rtc/rtc-pm8xxx.c index 03f8f75d5af2..197699f358c7 100644 --- a/drivers/rtc/rtc-pm8xxx.c +++ b/drivers/rtc/rtc-pm8xxx.c | |||
@@ -9,18 +9,16 @@ | |||
9 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 9 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
10 | * GNU General Public License for more details. | 10 | * GNU General Public License for more details. |
11 | */ | 11 | */ |
12 | 12 | #include <linux/of.h> | |
13 | #include <linux/module.h> | 13 | #include <linux/module.h> |
14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
15 | #include <linux/rtc.h> | 15 | #include <linux/rtc.h> |
16 | #include <linux/platform_device.h> | ||
16 | #include <linux/pm.h> | 17 | #include <linux/pm.h> |
18 | #include <linux/regmap.h> | ||
17 | #include <linux/slab.h> | 19 | #include <linux/slab.h> |
18 | #include <linux/spinlock.h> | 20 | #include <linux/spinlock.h> |
19 | 21 | ||
20 | #include <linux/mfd/pm8xxx/core.h> | ||
21 | #include <linux/mfd/pm8xxx/rtc.h> | ||
22 | |||
23 | |||
24 | /* RTC Register offsets from RTC CTRL REG */ | 22 | /* RTC Register offsets from RTC CTRL REG */ |
25 | #define PM8XXX_ALARM_CTRL_OFFSET 0x01 | 23 | #define PM8XXX_ALARM_CTRL_OFFSET 0x01 |
26 | #define PM8XXX_RTC_WRITE_OFFSET 0x02 | 24 | #define PM8XXX_RTC_WRITE_OFFSET 0x02 |
@@ -37,6 +35,8 @@ | |||
37 | /** | 35 | /** |
38 | * struct pm8xxx_rtc - rtc driver internal structure | 36 | * struct pm8xxx_rtc - rtc driver internal structure |
39 | * @rtc: rtc device for this driver. | 37 | * @rtc: rtc device for this driver. |
38 | * @regmap: regmap used to access RTC registers | ||
39 | * @allow_set_time: indicates whether writing to the RTC is allowed | ||
40 | * @rtc_alarm_irq: rtc alarm irq number. | 40 | * @rtc_alarm_irq: rtc alarm irq number. |
41 | * @rtc_base: address of rtc control register. | 41 | * @rtc_base: address of rtc control register. |
42 | * @rtc_read_base: base address of read registers. | 42 | * @rtc_read_base: base address of read registers. |
@@ -48,55 +48,19 @@ | |||
48 | */ | 48 | */ |
49 | struct pm8xxx_rtc { | 49 | struct pm8xxx_rtc { |
50 | struct rtc_device *rtc; | 50 | struct rtc_device *rtc; |
51 | struct regmap *regmap; | ||
52 | bool allow_set_time; | ||
51 | int rtc_alarm_irq; | 53 | int rtc_alarm_irq; |
52 | int rtc_base; | 54 | int rtc_base; |
53 | int rtc_read_base; | 55 | int rtc_read_base; |
54 | int rtc_write_base; | 56 | int rtc_write_base; |
55 | int alarm_rw_base; | 57 | int alarm_rw_base; |
56 | u8 ctrl_reg; | 58 | u8 ctrl_reg; |
57 | struct device *rtc_dev; | 59 | struct device *rtc_dev; |
58 | spinlock_t ctrl_reg_lock; | 60 | spinlock_t ctrl_reg_lock; |
59 | }; | 61 | }; |
60 | 62 | ||
61 | /* | 63 | /* |
62 | * The RTC registers need to be read/written one byte at a time. This is a | ||
63 | * hardware limitation. | ||
64 | */ | ||
65 | static int pm8xxx_read_wrapper(struct pm8xxx_rtc *rtc_dd, u8 *rtc_val, | ||
66 | int base, int count) | ||
67 | { | ||
68 | int i, rc; | ||
69 | struct device *parent = rtc_dd->rtc_dev->parent; | ||
70 | |||
71 | for (i = 0; i < count; i++) { | ||
72 | rc = pm8xxx_readb(parent, base + i, &rtc_val[i]); | ||
73 | if (rc < 0) { | ||
74 | dev_err(rtc_dd->rtc_dev, "PMIC read failed\n"); | ||
75 | return rc; | ||
76 | } | ||
77 | } | ||
78 | |||
79 | return 0; | ||
80 | } | ||
81 | |||
82 | static int pm8xxx_write_wrapper(struct pm8xxx_rtc *rtc_dd, u8 *rtc_val, | ||
83 | int base, int count) | ||
84 | { | ||
85 | int i, rc; | ||
86 | struct device *parent = rtc_dd->rtc_dev->parent; | ||
87 | |||
88 | for (i = 0; i < count; i++) { | ||
89 | rc = pm8xxx_writeb(parent, base + i, rtc_val[i]); | ||
90 | if (rc < 0) { | ||
91 | dev_err(rtc_dd->rtc_dev, "PMIC write failed\n"); | ||
92 | return rc; | ||
93 | } | ||
94 | } | ||
95 | |||
96 | return 0; | ||
97 | } | ||
98 | |||
99 | /* | ||
100 | * Steps to write the RTC registers. | 64 | * Steps to write the RTC registers. |
101 | * 1. Disable alarm if enabled. | 65 | * 1. Disable alarm if enabled. |
102 | * 2. Write 0x00 to LSB. | 66 | * 2. Write 0x00 to LSB. |
@@ -107,9 +71,12 @@ static int pm8xxx_rtc_set_time(struct device *dev, struct rtc_time *tm) | |||
107 | { | 71 | { |
108 | int rc, i; | 72 | int rc, i; |
109 | unsigned long secs, irq_flags; | 73 | unsigned long secs, irq_flags; |
110 | u8 value[NUM_8_BIT_RTC_REGS], reg = 0, alarm_enabled = 0, ctrl_reg; | 74 | u8 value[NUM_8_BIT_RTC_REGS], alarm_enabled = 0, ctrl_reg; |
111 | struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev); | 75 | struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev); |
112 | 76 | ||
77 | if (!rtc_dd->allow_set_time) | ||
78 | return -EACCES; | ||
79 | |||
113 | rtc_tm_to_time(tm, &secs); | 80 | rtc_tm_to_time(tm, &secs); |
114 | 81 | ||
115 | for (i = 0; i < NUM_8_BIT_RTC_REGS; i++) { | 82 | for (i = 0; i < NUM_8_BIT_RTC_REGS; i++) { |
@@ -125,47 +92,43 @@ static int pm8xxx_rtc_set_time(struct device *dev, struct rtc_time *tm) | |||
125 | if (ctrl_reg & PM8xxx_RTC_ALARM_ENABLE) { | 92 | if (ctrl_reg & PM8xxx_RTC_ALARM_ENABLE) { |
126 | alarm_enabled = 1; | 93 | alarm_enabled = 1; |
127 | ctrl_reg &= ~PM8xxx_RTC_ALARM_ENABLE; | 94 | ctrl_reg &= ~PM8xxx_RTC_ALARM_ENABLE; |
128 | rc = pm8xxx_write_wrapper(rtc_dd, &ctrl_reg, rtc_dd->rtc_base, | 95 | rc = regmap_write(rtc_dd->regmap, rtc_dd->rtc_base, ctrl_reg); |
129 | 1); | 96 | if (rc) { |
130 | if (rc < 0) { | 97 | dev_err(dev, "Write to RTC control register failed\n"); |
131 | dev_err(dev, "Write to RTC control register " | ||
132 | "failed\n"); | ||
133 | goto rtc_rw_fail; | 98 | goto rtc_rw_fail; |
134 | } | 99 | } |
135 | rtc_dd->ctrl_reg = ctrl_reg; | 100 | rtc_dd->ctrl_reg = ctrl_reg; |
136 | } else | 101 | } else { |
137 | spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags); | 102 | spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags); |
103 | } | ||
138 | 104 | ||
139 | /* Write 0 to Byte[0] */ | 105 | /* Write 0 to Byte[0] */ |
140 | reg = 0; | 106 | rc = regmap_write(rtc_dd->regmap, rtc_dd->rtc_write_base, 0); |
141 | rc = pm8xxx_write_wrapper(rtc_dd, ®, rtc_dd->rtc_write_base, 1); | 107 | if (rc) { |
142 | if (rc < 0) { | ||
143 | dev_err(dev, "Write to RTC write data register failed\n"); | 108 | dev_err(dev, "Write to RTC write data register failed\n"); |
144 | goto rtc_rw_fail; | 109 | goto rtc_rw_fail; |
145 | } | 110 | } |
146 | 111 | ||
147 | /* Write Byte[1], Byte[2], Byte[3] */ | 112 | /* Write Byte[1], Byte[2], Byte[3] */ |
148 | rc = pm8xxx_write_wrapper(rtc_dd, value + 1, | 113 | rc = regmap_bulk_write(rtc_dd->regmap, rtc_dd->rtc_write_base + 1, |
149 | rtc_dd->rtc_write_base + 1, 3); | 114 | &value[1], sizeof(value) - 1); |
150 | if (rc < 0) { | 115 | if (rc) { |
151 | dev_err(dev, "Write to RTC write data register failed\n"); | 116 | dev_err(dev, "Write to RTC write data register failed\n"); |
152 | goto rtc_rw_fail; | 117 | goto rtc_rw_fail; |
153 | } | 118 | } |
154 | 119 | ||
155 | /* Write Byte[0] */ | 120 | /* Write Byte[0] */ |
156 | rc = pm8xxx_write_wrapper(rtc_dd, value, rtc_dd->rtc_write_base, 1); | 121 | rc = regmap_write(rtc_dd->regmap, rtc_dd->rtc_write_base, value[0]); |
157 | if (rc < 0) { | 122 | if (rc) { |
158 | dev_err(dev, "Write to RTC write data register failed\n"); | 123 | dev_err(dev, "Write to RTC write data register failed\n"); |
159 | goto rtc_rw_fail; | 124 | goto rtc_rw_fail; |
160 | } | 125 | } |
161 | 126 | ||
162 | if (alarm_enabled) { | 127 | if (alarm_enabled) { |
163 | ctrl_reg |= PM8xxx_RTC_ALARM_ENABLE; | 128 | ctrl_reg |= PM8xxx_RTC_ALARM_ENABLE; |
164 | rc = pm8xxx_write_wrapper(rtc_dd, &ctrl_reg, rtc_dd->rtc_base, | 129 | rc = regmap_write(rtc_dd->regmap, rtc_dd->rtc_base, ctrl_reg); |
165 | 1); | 130 | if (rc) { |
166 | if (rc < 0) { | 131 | dev_err(dev, "Write to RTC control register failed\n"); |
167 | dev_err(dev, "Write to RTC control register " | ||
168 | "failed\n"); | ||
169 | goto rtc_rw_fail; | 132 | goto rtc_rw_fail; |
170 | } | 133 | } |
171 | rtc_dd->ctrl_reg = ctrl_reg; | 134 | rtc_dd->ctrl_reg = ctrl_reg; |
@@ -181,13 +144,14 @@ rtc_rw_fail: | |||
181 | static int pm8xxx_rtc_read_time(struct device *dev, struct rtc_time *tm) | 144 | static int pm8xxx_rtc_read_time(struct device *dev, struct rtc_time *tm) |
182 | { | 145 | { |
183 | int rc; | 146 | int rc; |
184 | u8 value[NUM_8_BIT_RTC_REGS], reg; | 147 | u8 value[NUM_8_BIT_RTC_REGS]; |
185 | unsigned long secs; | 148 | unsigned long secs; |
149 | unsigned int reg; | ||
186 | struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev); | 150 | struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev); |
187 | 151 | ||
188 | rc = pm8xxx_read_wrapper(rtc_dd, value, rtc_dd->rtc_read_base, | 152 | rc = regmap_bulk_read(rtc_dd->regmap, rtc_dd->rtc_read_base, |
189 | NUM_8_BIT_RTC_REGS); | 153 | value, sizeof(value)); |
190 | if (rc < 0) { | 154 | if (rc) { |
191 | dev_err(dev, "RTC read data register failed\n"); | 155 | dev_err(dev, "RTC read data register failed\n"); |
192 | return rc; | 156 | return rc; |
193 | } | 157 | } |
@@ -196,16 +160,16 @@ static int pm8xxx_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
196 | * Read the LSB again and check if there has been a carry over. | 160 | * Read the LSB again and check if there has been a carry over. |
197 | * If there is, redo the read operation. | 161 | * If there is, redo the read operation. |
198 | */ | 162 | */ |
199 | rc = pm8xxx_read_wrapper(rtc_dd, ®, rtc_dd->rtc_read_base, 1); | 163 | rc = regmap_read(rtc_dd->regmap, rtc_dd->rtc_read_base, ®); |
200 | if (rc < 0) { | 164 | if (rc < 0) { |
201 | dev_err(dev, "RTC read data register failed\n"); | 165 | dev_err(dev, "RTC read data register failed\n"); |
202 | return rc; | 166 | return rc; |
203 | } | 167 | } |
204 | 168 | ||
205 | if (unlikely(reg < value[0])) { | 169 | if (unlikely(reg < value[0])) { |
206 | rc = pm8xxx_read_wrapper(rtc_dd, value, | 170 | rc = regmap_bulk_read(rtc_dd->regmap, rtc_dd->rtc_read_base, |
207 | rtc_dd->rtc_read_base, NUM_8_BIT_RTC_REGS); | 171 | value, sizeof(value)); |
208 | if (rc < 0) { | 172 | if (rc) { |
209 | dev_err(dev, "RTC read data register failed\n"); | 173 | dev_err(dev, "RTC read data register failed\n"); |
210 | return rc; | 174 | return rc; |
211 | } | 175 | } |
@@ -222,8 +186,8 @@ static int pm8xxx_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
222 | } | 186 | } |
223 | 187 | ||
224 | dev_dbg(dev, "secs = %lu, h:m:s == %d:%d:%d, d/m/y = %d/%d/%d\n", | 188 | dev_dbg(dev, "secs = %lu, h:m:s == %d:%d:%d, d/m/y = %d/%d/%d\n", |
225 | secs, tm->tm_hour, tm->tm_min, tm->tm_sec, | 189 | secs, tm->tm_hour, tm->tm_min, tm->tm_sec, |
226 | tm->tm_mday, tm->tm_mon, tm->tm_year); | 190 | tm->tm_mday, tm->tm_mon, tm->tm_year); |
227 | 191 | ||
228 | return 0; | 192 | return 0; |
229 | } | 193 | } |
@@ -244,19 +208,22 @@ static int pm8xxx_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm) | |||
244 | 208 | ||
245 | spin_lock_irqsave(&rtc_dd->ctrl_reg_lock, irq_flags); | 209 | spin_lock_irqsave(&rtc_dd->ctrl_reg_lock, irq_flags); |
246 | 210 | ||
247 | rc = pm8xxx_write_wrapper(rtc_dd, value, rtc_dd->alarm_rw_base, | 211 | rc = regmap_bulk_write(rtc_dd->regmap, rtc_dd->alarm_rw_base, value, |
248 | NUM_8_BIT_RTC_REGS); | 212 | sizeof(value)); |
249 | if (rc < 0) { | 213 | if (rc) { |
250 | dev_err(dev, "Write to RTC ALARM register failed\n"); | 214 | dev_err(dev, "Write to RTC ALARM register failed\n"); |
251 | goto rtc_rw_fail; | 215 | goto rtc_rw_fail; |
252 | } | 216 | } |
253 | 217 | ||
254 | ctrl_reg = rtc_dd->ctrl_reg; | 218 | ctrl_reg = rtc_dd->ctrl_reg; |
255 | ctrl_reg = alarm->enabled ? (ctrl_reg | PM8xxx_RTC_ALARM_ENABLE) : | ||
256 | (ctrl_reg & ~PM8xxx_RTC_ALARM_ENABLE); | ||
257 | 219 | ||
258 | rc = pm8xxx_write_wrapper(rtc_dd, &ctrl_reg, rtc_dd->rtc_base, 1); | 220 | if (alarm->enabled) |
259 | if (rc < 0) { | 221 | ctrl_reg |= PM8xxx_RTC_ALARM_ENABLE; |
222 | else | ||
223 | ctrl_reg &= ~PM8xxx_RTC_ALARM_ENABLE; | ||
224 | |||
225 | rc = regmap_write(rtc_dd->regmap, rtc_dd->rtc_base, ctrl_reg); | ||
226 | if (rc) { | ||
260 | dev_err(dev, "Write to RTC control register failed\n"); | 227 | dev_err(dev, "Write to RTC control register failed\n"); |
261 | goto rtc_rw_fail; | 228 | goto rtc_rw_fail; |
262 | } | 229 | } |
@@ -264,9 +231,9 @@ static int pm8xxx_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm) | |||
264 | rtc_dd->ctrl_reg = ctrl_reg; | 231 | rtc_dd->ctrl_reg = ctrl_reg; |
265 | 232 | ||
266 | dev_dbg(dev, "Alarm Set for h:r:s=%d:%d:%d, d/m/y=%d/%d/%d\n", | 233 | dev_dbg(dev, "Alarm Set for h:r:s=%d:%d:%d, d/m/y=%d/%d/%d\n", |
267 | alarm->time.tm_hour, alarm->time.tm_min, | 234 | alarm->time.tm_hour, alarm->time.tm_min, |
268 | alarm->time.tm_sec, alarm->time.tm_mday, | 235 | alarm->time.tm_sec, alarm->time.tm_mday, |
269 | alarm->time.tm_mon, alarm->time.tm_year); | 236 | alarm->time.tm_mon, alarm->time.tm_year); |
270 | rtc_rw_fail: | 237 | rtc_rw_fail: |
271 | spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags); | 238 | spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags); |
272 | return rc; | 239 | return rc; |
@@ -279,9 +246,9 @@ static int pm8xxx_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm) | |||
279 | unsigned long secs; | 246 | unsigned long secs; |
280 | struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev); | 247 | struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev); |
281 | 248 | ||
282 | rc = pm8xxx_read_wrapper(rtc_dd, value, rtc_dd->alarm_rw_base, | 249 | rc = regmap_bulk_read(rtc_dd->regmap, rtc_dd->alarm_rw_base, value, |
283 | NUM_8_BIT_RTC_REGS); | 250 | sizeof(value)); |
284 | if (rc < 0) { | 251 | if (rc) { |
285 | dev_err(dev, "RTC alarm time read failed\n"); | 252 | dev_err(dev, "RTC alarm time read failed\n"); |
286 | return rc; | 253 | return rc; |
287 | } | 254 | } |
@@ -297,9 +264,9 @@ static int pm8xxx_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm) | |||
297 | } | 264 | } |
298 | 265 | ||
299 | dev_dbg(dev, "Alarm set for - h:r:s=%d:%d:%d, d/m/y=%d/%d/%d\n", | 266 | dev_dbg(dev, "Alarm set for - h:r:s=%d:%d:%d, d/m/y=%d/%d/%d\n", |
300 | alarm->time.tm_hour, alarm->time.tm_min, | 267 | alarm->time.tm_hour, alarm->time.tm_min, |
301 | alarm->time.tm_sec, alarm->time.tm_mday, | 268 | alarm->time.tm_sec, alarm->time.tm_mday, |
302 | alarm->time.tm_mon, alarm->time.tm_year); | 269 | alarm->time.tm_mon, alarm->time.tm_year); |
303 | 270 | ||
304 | return 0; | 271 | return 0; |
305 | } | 272 | } |
@@ -312,12 +279,16 @@ static int pm8xxx_rtc_alarm_irq_enable(struct device *dev, unsigned int enable) | |||
312 | u8 ctrl_reg; | 279 | u8 ctrl_reg; |
313 | 280 | ||
314 | spin_lock_irqsave(&rtc_dd->ctrl_reg_lock, irq_flags); | 281 | spin_lock_irqsave(&rtc_dd->ctrl_reg_lock, irq_flags); |
282 | |||
315 | ctrl_reg = rtc_dd->ctrl_reg; | 283 | ctrl_reg = rtc_dd->ctrl_reg; |
316 | ctrl_reg = (enable) ? (ctrl_reg | PM8xxx_RTC_ALARM_ENABLE) : | ||
317 | (ctrl_reg & ~PM8xxx_RTC_ALARM_ENABLE); | ||
318 | 284 | ||
319 | rc = pm8xxx_write_wrapper(rtc_dd, &ctrl_reg, rtc_dd->rtc_base, 1); | 285 | if (enable) |
320 | if (rc < 0) { | 286 | ctrl_reg |= PM8xxx_RTC_ALARM_ENABLE; |
287 | else | ||
288 | ctrl_reg &= ~PM8xxx_RTC_ALARM_ENABLE; | ||
289 | |||
290 | rc = regmap_write(rtc_dd->regmap, rtc_dd->rtc_base, ctrl_reg); | ||
291 | if (rc) { | ||
321 | dev_err(dev, "Write to RTC control register failed\n"); | 292 | dev_err(dev, "Write to RTC control register failed\n"); |
322 | goto rtc_rw_fail; | 293 | goto rtc_rw_fail; |
323 | } | 294 | } |
@@ -329,8 +300,9 @@ rtc_rw_fail: | |||
329 | return rc; | 300 | return rc; |
330 | } | 301 | } |
331 | 302 | ||
332 | static struct rtc_class_ops pm8xxx_rtc_ops = { | 303 | static const struct rtc_class_ops pm8xxx_rtc_ops = { |
333 | .read_time = pm8xxx_rtc_read_time, | 304 | .read_time = pm8xxx_rtc_read_time, |
305 | .set_time = pm8xxx_rtc_set_time, | ||
334 | .set_alarm = pm8xxx_rtc_set_alarm, | 306 | .set_alarm = pm8xxx_rtc_set_alarm, |
335 | .read_alarm = pm8xxx_rtc_read_alarm, | 307 | .read_alarm = pm8xxx_rtc_read_alarm, |
336 | .alarm_irq_enable = pm8xxx_rtc_alarm_irq_enable, | 308 | .alarm_irq_enable = pm8xxx_rtc_alarm_irq_enable, |
@@ -339,7 +311,7 @@ static struct rtc_class_ops pm8xxx_rtc_ops = { | |||
339 | static irqreturn_t pm8xxx_alarm_trigger(int irq, void *dev_id) | 311 | static irqreturn_t pm8xxx_alarm_trigger(int irq, void *dev_id) |
340 | { | 312 | { |
341 | struct pm8xxx_rtc *rtc_dd = dev_id; | 313 | struct pm8xxx_rtc *rtc_dd = dev_id; |
342 | u8 ctrl_reg; | 314 | unsigned int ctrl_reg; |
343 | int rc; | 315 | int rc; |
344 | unsigned long irq_flags; | 316 | unsigned long irq_flags; |
345 | 317 | ||
@@ -351,11 +323,11 @@ static irqreturn_t pm8xxx_alarm_trigger(int irq, void *dev_id) | |||
351 | ctrl_reg = rtc_dd->ctrl_reg; | 323 | ctrl_reg = rtc_dd->ctrl_reg; |
352 | ctrl_reg &= ~PM8xxx_RTC_ALARM_ENABLE; | 324 | ctrl_reg &= ~PM8xxx_RTC_ALARM_ENABLE; |
353 | 325 | ||
354 | rc = pm8xxx_write_wrapper(rtc_dd, &ctrl_reg, rtc_dd->rtc_base, 1); | 326 | rc = regmap_write(rtc_dd->regmap, rtc_dd->rtc_base, ctrl_reg); |
355 | if (rc < 0) { | 327 | if (rc) { |
356 | spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags); | 328 | spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags); |
357 | dev_err(rtc_dd->rtc_dev, "Write to RTC control register " | 329 | dev_err(rtc_dd->rtc_dev, |
358 | "failed\n"); | 330 | "Write to RTC control register failed\n"); |
359 | goto rtc_alarm_handled; | 331 | goto rtc_alarm_handled; |
360 | } | 332 | } |
361 | 333 | ||
@@ -363,61 +335,71 @@ static irqreturn_t pm8xxx_alarm_trigger(int irq, void *dev_id) | |||
363 | spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags); | 335 | spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags); |
364 | 336 | ||
365 | /* Clear RTC alarm register */ | 337 | /* Clear RTC alarm register */ |
366 | rc = pm8xxx_read_wrapper(rtc_dd, &ctrl_reg, rtc_dd->rtc_base + | 338 | rc = regmap_read(rtc_dd->regmap, |
367 | PM8XXX_ALARM_CTRL_OFFSET, 1); | 339 | rtc_dd->rtc_base + PM8XXX_ALARM_CTRL_OFFSET, |
368 | if (rc < 0) { | 340 | &ctrl_reg); |
369 | dev_err(rtc_dd->rtc_dev, "RTC Alarm control register read " | 341 | if (rc) { |
370 | "failed\n"); | 342 | dev_err(rtc_dd->rtc_dev, |
343 | "RTC Alarm control register read failed\n"); | ||
371 | goto rtc_alarm_handled; | 344 | goto rtc_alarm_handled; |
372 | } | 345 | } |
373 | 346 | ||
374 | ctrl_reg &= ~PM8xxx_RTC_ALARM_CLEAR; | 347 | ctrl_reg &= ~PM8xxx_RTC_ALARM_CLEAR; |
375 | rc = pm8xxx_write_wrapper(rtc_dd, &ctrl_reg, rtc_dd->rtc_base + | 348 | rc = regmap_write(rtc_dd->regmap, |
376 | PM8XXX_ALARM_CTRL_OFFSET, 1); | 349 | rtc_dd->rtc_base + PM8XXX_ALARM_CTRL_OFFSET, |
377 | if (rc < 0) | 350 | ctrl_reg); |
378 | dev_err(rtc_dd->rtc_dev, "Write to RTC Alarm control register" | 351 | if (rc) |
379 | " failed\n"); | 352 | dev_err(rtc_dd->rtc_dev, |
353 | "Write to RTC Alarm control register failed\n"); | ||
380 | 354 | ||
381 | rtc_alarm_handled: | 355 | rtc_alarm_handled: |
382 | return IRQ_HANDLED; | 356 | return IRQ_HANDLED; |
383 | } | 357 | } |
384 | 358 | ||
359 | /* | ||
360 | * Hardcoded RTC bases until IORESOURCE_REG mapping is figured out | ||
361 | */ | ||
362 | static const struct of_device_id pm8xxx_id_table[] = { | ||
363 | { .compatible = "qcom,pm8921-rtc", .data = (void *) 0x11D }, | ||
364 | { .compatible = "qcom,pm8058-rtc", .data = (void *) 0x1E8 }, | ||
365 | { }, | ||
366 | }; | ||
367 | MODULE_DEVICE_TABLE(of, pm8xxx_id_table); | ||
368 | |||
385 | static int pm8xxx_rtc_probe(struct platform_device *pdev) | 369 | static int pm8xxx_rtc_probe(struct platform_device *pdev) |
386 | { | 370 | { |
387 | int rc; | 371 | int rc; |
388 | u8 ctrl_reg; | 372 | unsigned int ctrl_reg; |
389 | bool rtc_write_enable = false; | ||
390 | struct pm8xxx_rtc *rtc_dd; | 373 | struct pm8xxx_rtc *rtc_dd; |
391 | struct resource *rtc_resource; | 374 | const struct of_device_id *match; |
392 | const struct pm8xxx_rtc_platform_data *pdata = | ||
393 | dev_get_platdata(&pdev->dev); | ||
394 | 375 | ||
395 | if (pdata != NULL) | 376 | match = of_match_node(pm8xxx_id_table, pdev->dev.of_node); |
396 | rtc_write_enable = pdata->rtc_write_enable; | 377 | if (!match) |
378 | return -ENXIO; | ||
397 | 379 | ||
398 | rtc_dd = devm_kzalloc(&pdev->dev, sizeof(*rtc_dd), GFP_KERNEL); | 380 | rtc_dd = devm_kzalloc(&pdev->dev, sizeof(*rtc_dd), GFP_KERNEL); |
399 | if (rtc_dd == NULL) { | 381 | if (rtc_dd == NULL) |
400 | dev_err(&pdev->dev, "Unable to allocate memory!\n"); | ||
401 | return -ENOMEM; | 382 | return -ENOMEM; |
402 | } | ||
403 | 383 | ||
404 | /* Initialise spinlock to protect RTC control register */ | 384 | /* Initialise spinlock to protect RTC control register */ |
405 | spin_lock_init(&rtc_dd->ctrl_reg_lock); | 385 | spin_lock_init(&rtc_dd->ctrl_reg_lock); |
406 | 386 | ||
387 | rtc_dd->regmap = dev_get_regmap(pdev->dev.parent, NULL); | ||
388 | if (!rtc_dd->regmap) { | ||
389 | dev_err(&pdev->dev, "Parent regmap unavailable.\n"); | ||
390 | return -ENXIO; | ||
391 | } | ||
392 | |||
407 | rtc_dd->rtc_alarm_irq = platform_get_irq(pdev, 0); | 393 | rtc_dd->rtc_alarm_irq = platform_get_irq(pdev, 0); |
408 | if (rtc_dd->rtc_alarm_irq < 0) { | 394 | if (rtc_dd->rtc_alarm_irq < 0) { |
409 | dev_err(&pdev->dev, "Alarm IRQ resource absent!\n"); | 395 | dev_err(&pdev->dev, "Alarm IRQ resource absent!\n"); |
410 | return -ENXIO; | 396 | return -ENXIO; |
411 | } | 397 | } |
412 | 398 | ||
413 | rtc_resource = platform_get_resource_byname(pdev, IORESOURCE_IO, | 399 | rtc_dd->allow_set_time = of_property_read_bool(pdev->dev.of_node, |
414 | "pmic_rtc_base"); | 400 | "allow-set-time"); |
415 | if (!(rtc_resource && rtc_resource->start)) { | ||
416 | dev_err(&pdev->dev, "RTC IO resource absent!\n"); | ||
417 | return -ENXIO; | ||
418 | } | ||
419 | 401 | ||
420 | rtc_dd->rtc_base = rtc_resource->start; | 402 | rtc_dd->rtc_base = (long) match->data; |
421 | 403 | ||
422 | /* Setup RTC register addresses */ | 404 | /* Setup RTC register addresses */ |
423 | rtc_dd->rtc_write_base = rtc_dd->rtc_base + PM8XXX_RTC_WRITE_OFFSET; | 405 | rtc_dd->rtc_write_base = rtc_dd->rtc_base + PM8XXX_RTC_WRITE_OFFSET; |
@@ -427,64 +409,52 @@ static int pm8xxx_rtc_probe(struct platform_device *pdev) | |||
427 | rtc_dd->rtc_dev = &pdev->dev; | 409 | rtc_dd->rtc_dev = &pdev->dev; |
428 | 410 | ||
429 | /* Check if the RTC is on, else turn it on */ | 411 | /* Check if the RTC is on, else turn it on */ |
430 | rc = pm8xxx_read_wrapper(rtc_dd, &ctrl_reg, rtc_dd->rtc_base, 1); | 412 | rc = regmap_read(rtc_dd->regmap, rtc_dd->rtc_base, &ctrl_reg); |
431 | if (rc < 0) { | 413 | if (rc) { |
432 | dev_err(&pdev->dev, "RTC control register read failed!\n"); | 414 | dev_err(&pdev->dev, "RTC control register read failed!\n"); |
433 | return rc; | 415 | return rc; |
434 | } | 416 | } |
435 | 417 | ||
436 | if (!(ctrl_reg & PM8xxx_RTC_ENABLE)) { | 418 | if (!(ctrl_reg & PM8xxx_RTC_ENABLE)) { |
437 | ctrl_reg |= PM8xxx_RTC_ENABLE; | 419 | ctrl_reg |= PM8xxx_RTC_ENABLE; |
438 | rc = pm8xxx_write_wrapper(rtc_dd, &ctrl_reg, rtc_dd->rtc_base, | 420 | rc = regmap_write(rtc_dd->regmap, rtc_dd->rtc_base, ctrl_reg); |
439 | 1); | 421 | if (rc) { |
440 | if (rc < 0) { | 422 | dev_err(&pdev->dev, |
441 | dev_err(&pdev->dev, "Write to RTC control register " | 423 | "Write to RTC control register failed\n"); |
442 | "failed\n"); | ||
443 | return rc; | 424 | return rc; |
444 | } | 425 | } |
445 | } | 426 | } |
446 | 427 | ||
447 | rtc_dd->ctrl_reg = ctrl_reg; | 428 | rtc_dd->ctrl_reg = ctrl_reg; |
448 | if (rtc_write_enable == true) | ||
449 | pm8xxx_rtc_ops.set_time = pm8xxx_rtc_set_time; | ||
450 | 429 | ||
451 | platform_set_drvdata(pdev, rtc_dd); | 430 | platform_set_drvdata(pdev, rtc_dd); |
452 | 431 | ||
432 | device_init_wakeup(&pdev->dev, 1); | ||
433 | |||
453 | /* Register the RTC device */ | 434 | /* Register the RTC device */ |
454 | rtc_dd->rtc = devm_rtc_device_register(&pdev->dev, "pm8xxx_rtc", | 435 | rtc_dd->rtc = devm_rtc_device_register(&pdev->dev, "pm8xxx_rtc", |
455 | &pm8xxx_rtc_ops, THIS_MODULE); | 436 | &pm8xxx_rtc_ops, THIS_MODULE); |
456 | if (IS_ERR(rtc_dd->rtc)) { | 437 | if (IS_ERR(rtc_dd->rtc)) { |
457 | dev_err(&pdev->dev, "%s: RTC registration failed (%ld)\n", | 438 | dev_err(&pdev->dev, "%s: RTC registration failed (%ld)\n", |
458 | __func__, PTR_ERR(rtc_dd->rtc)); | 439 | __func__, PTR_ERR(rtc_dd->rtc)); |
459 | return PTR_ERR(rtc_dd->rtc); | 440 | return PTR_ERR(rtc_dd->rtc); |
460 | } | 441 | } |
461 | 442 | ||
462 | /* Request the alarm IRQ */ | 443 | /* Request the alarm IRQ */ |
463 | rc = request_any_context_irq(rtc_dd->rtc_alarm_irq, | 444 | rc = devm_request_any_context_irq(&pdev->dev, rtc_dd->rtc_alarm_irq, |
464 | pm8xxx_alarm_trigger, IRQF_TRIGGER_RISING, | 445 | pm8xxx_alarm_trigger, |
465 | "pm8xxx_rtc_alarm", rtc_dd); | 446 | IRQF_TRIGGER_RISING, |
447 | "pm8xxx_rtc_alarm", rtc_dd); | ||
466 | if (rc < 0) { | 448 | if (rc < 0) { |
467 | dev_err(&pdev->dev, "Request IRQ failed (%d)\n", rc); | 449 | dev_err(&pdev->dev, "Request IRQ failed (%d)\n", rc); |
468 | return rc; | 450 | return rc; |
469 | } | 451 | } |
470 | 452 | ||
471 | device_init_wakeup(&pdev->dev, 1); | ||
472 | |||
473 | dev_dbg(&pdev->dev, "Probe success !!\n"); | 453 | dev_dbg(&pdev->dev, "Probe success !!\n"); |
474 | 454 | ||
475 | return 0; | 455 | return 0; |
476 | } | 456 | } |
477 | 457 | ||
478 | static int pm8xxx_rtc_remove(struct platform_device *pdev) | ||
479 | { | ||
480 | struct pm8xxx_rtc *rtc_dd = platform_get_drvdata(pdev); | ||
481 | |||
482 | device_init_wakeup(&pdev->dev, 0); | ||
483 | free_irq(rtc_dd->rtc_alarm_irq, rtc_dd); | ||
484 | |||
485 | return 0; | ||
486 | } | ||
487 | |||
488 | #ifdef CONFIG_PM_SLEEP | 458 | #ifdef CONFIG_PM_SLEEP |
489 | static int pm8xxx_rtc_resume(struct device *dev) | 459 | static int pm8xxx_rtc_resume(struct device *dev) |
490 | { | 460 | { |
@@ -507,15 +477,17 @@ static int pm8xxx_rtc_suspend(struct device *dev) | |||
507 | } | 477 | } |
508 | #endif | 478 | #endif |
509 | 479 | ||
510 | static SIMPLE_DEV_PM_OPS(pm8xxx_rtc_pm_ops, pm8xxx_rtc_suspend, pm8xxx_rtc_resume); | 480 | static SIMPLE_DEV_PM_OPS(pm8xxx_rtc_pm_ops, |
481 | pm8xxx_rtc_suspend, | ||
482 | pm8xxx_rtc_resume); | ||
511 | 483 | ||
512 | static struct platform_driver pm8xxx_rtc_driver = { | 484 | static struct platform_driver pm8xxx_rtc_driver = { |
513 | .probe = pm8xxx_rtc_probe, | 485 | .probe = pm8xxx_rtc_probe, |
514 | .remove = pm8xxx_rtc_remove, | ||
515 | .driver = { | 486 | .driver = { |
516 | .name = PM8XXX_RTC_DEV_NAME, | 487 | .name = "rtc-pm8xxx", |
517 | .owner = THIS_MODULE, | 488 | .owner = THIS_MODULE, |
518 | .pm = &pm8xxx_rtc_pm_ops, | 489 | .pm = &pm8xxx_rtc_pm_ops, |
490 | .of_match_table = pm8xxx_id_table, | ||
519 | }, | 491 | }, |
520 | }; | 492 | }; |
521 | 493 | ||
diff --git a/drivers/rtc/rtc-rv3029c2.c b/drivers/rtc/rtc-rv3029c2.c index 1a779a67ff66..e9ac5a43be1a 100644 --- a/drivers/rtc/rtc-rv3029c2.c +++ b/drivers/rtc/rtc-rv3029c2.c | |||
@@ -395,6 +395,12 @@ static int rv3029c2_probe(struct i2c_client *client, | |||
395 | if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_EMUL)) | 395 | if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_EMUL)) |
396 | return -ENODEV; | 396 | return -ENODEV; |
397 | 397 | ||
398 | rc = rv3029c2_i2c_get_sr(client, buf); | ||
399 | if (rc < 0) { | ||
400 | dev_err(&client->dev, "reading status failed\n"); | ||
401 | return rc; | ||
402 | } | ||
403 | |||
398 | rtc = devm_rtc_device_register(&client->dev, client->name, | 404 | rtc = devm_rtc_device_register(&client->dev, client->name, |
399 | &rv3029c2_rtc_ops, THIS_MODULE); | 405 | &rv3029c2_rtc_ops, THIS_MODULE); |
400 | 406 | ||
@@ -403,12 +409,6 @@ static int rv3029c2_probe(struct i2c_client *client, | |||
403 | 409 | ||
404 | i2c_set_clientdata(client, rtc); | 410 | i2c_set_clientdata(client, rtc); |
405 | 411 | ||
406 | rc = rv3029c2_i2c_get_sr(client, buf); | ||
407 | if (rc < 0) { | ||
408 | dev_err(&client->dev, "reading status failed\n"); | ||
409 | return rc; | ||
410 | } | ||
411 | |||
412 | return 0; | 412 | return 0; |
413 | } | 413 | } |
414 | 414 | ||
diff --git a/drivers/rtc/rtc-rx8025.c b/drivers/rtc/rtc-rx8025.c index 8fa23eabcb68..e6298e02b400 100644 --- a/drivers/rtc/rtc-rx8025.c +++ b/drivers/rtc/rtc-rx8025.c | |||
@@ -551,7 +551,6 @@ static int rx8025_probe(struct i2c_client *client, | |||
551 | 551 | ||
552 | rx8025 = devm_kzalloc(&client->dev, sizeof(*rx8025), GFP_KERNEL); | 552 | rx8025 = devm_kzalloc(&client->dev, sizeof(*rx8025), GFP_KERNEL); |
553 | if (!rx8025) { | 553 | if (!rx8025) { |
554 | dev_err(&adapter->dev, "failed to alloc memory\n"); | ||
555 | err = -ENOMEM; | 554 | err = -ENOMEM; |
556 | goto errout; | 555 | goto errout; |
557 | } | 556 | } |
diff --git a/drivers/rtc/rtc-s3c.c b/drivers/rtc/rtc-s3c.c index 7afd373b9595..4958a363b2c7 100644 --- a/drivers/rtc/rtc-s3c.c +++ b/drivers/rtc/rtc-s3c.c | |||
@@ -48,8 +48,8 @@ struct s3c_rtc_drv_data { | |||
48 | 48 | ||
49 | static struct clk *rtc_clk; | 49 | static struct clk *rtc_clk; |
50 | static void __iomem *s3c_rtc_base; | 50 | static void __iomem *s3c_rtc_base; |
51 | static int s3c_rtc_alarmno = NO_IRQ; | 51 | static int s3c_rtc_alarmno; |
52 | static int s3c_rtc_tickno = NO_IRQ; | 52 | static int s3c_rtc_tickno; |
53 | static enum s3c_cpu_type s3c_rtc_cpu_type; | 53 | static enum s3c_cpu_type s3c_rtc_cpu_type; |
54 | 54 | ||
55 | static DEFINE_SPINLOCK(s3c_rtc_pie_lock); | 55 | static DEFINE_SPINLOCK(s3c_rtc_pie_lock); |
@@ -580,10 +580,12 @@ static int s3c_rtc_suspend(struct device *dev) | |||
580 | 580 | ||
581 | clk_enable(rtc_clk); | 581 | clk_enable(rtc_clk); |
582 | /* save TICNT for anyone using periodic interrupts */ | 582 | /* save TICNT for anyone using periodic interrupts */ |
583 | ticnt_save = readb(s3c_rtc_base + S3C2410_TICNT); | ||
584 | if (s3c_rtc_cpu_type == TYPE_S3C64XX) { | 583 | if (s3c_rtc_cpu_type == TYPE_S3C64XX) { |
585 | ticnt_en_save = readw(s3c_rtc_base + S3C2410_RTCCON); | 584 | ticnt_en_save = readw(s3c_rtc_base + S3C2410_RTCCON); |
586 | ticnt_en_save &= S3C64XX_RTCCON_TICEN; | 585 | ticnt_en_save &= S3C64XX_RTCCON_TICEN; |
586 | ticnt_save = readl(s3c_rtc_base + S3C2410_TICNT); | ||
587 | } else { | ||
588 | ticnt_save = readb(s3c_rtc_base + S3C2410_TICNT); | ||
587 | } | 589 | } |
588 | s3c_rtc_enable(pdev, 0); | 590 | s3c_rtc_enable(pdev, 0); |
589 | 591 | ||
@@ -605,10 +607,15 @@ static int s3c_rtc_resume(struct device *dev) | |||
605 | 607 | ||
606 | clk_enable(rtc_clk); | 608 | clk_enable(rtc_clk); |
607 | s3c_rtc_enable(pdev, 1); | 609 | s3c_rtc_enable(pdev, 1); |
608 | writeb(ticnt_save, s3c_rtc_base + S3C2410_TICNT); | 610 | if (s3c_rtc_cpu_type == TYPE_S3C64XX) { |
609 | if (s3c_rtc_cpu_type == TYPE_S3C64XX && ticnt_en_save) { | 611 | writel(ticnt_save, s3c_rtc_base + S3C2410_TICNT); |
610 | tmp = readw(s3c_rtc_base + S3C2410_RTCCON); | 612 | if (ticnt_en_save) { |
611 | writew(tmp | ticnt_en_save, s3c_rtc_base + S3C2410_RTCCON); | 613 | tmp = readw(s3c_rtc_base + S3C2410_RTCCON); |
614 | writew(tmp | ticnt_en_save, | ||
615 | s3c_rtc_base + S3C2410_RTCCON); | ||
616 | } | ||
617 | } else { | ||
618 | writeb(ticnt_save, s3c_rtc_base + S3C2410_TICNT); | ||
612 | } | 619 | } |
613 | 620 | ||
614 | if (device_may_wakeup(dev) && wake_en) { | 621 | if (device_may_wakeup(dev) && wake_en) { |
diff --git a/drivers/rtc/rtc-sirfsoc.c b/drivers/rtc/rtc-sirfsoc.c index 3eb3642ae299..76e38007ba90 100644 --- a/drivers/rtc/rtc-sirfsoc.c +++ b/drivers/rtc/rtc-sirfsoc.c | |||
@@ -264,12 +264,8 @@ static int sirfsoc_rtc_probe(struct platform_device *pdev) | |||
264 | 264 | ||
265 | rtcdrv = devm_kzalloc(&pdev->dev, | 265 | rtcdrv = devm_kzalloc(&pdev->dev, |
266 | sizeof(struct sirfsoc_rtc_drv), GFP_KERNEL); | 266 | sizeof(struct sirfsoc_rtc_drv), GFP_KERNEL); |
267 | if (rtcdrv == NULL) { | 267 | if (rtcdrv == NULL) |
268 | dev_err(&pdev->dev, | ||
269 | "%s: can't alloc mem for drv struct\n", | ||
270 | pdev->name); | ||
271 | return -ENOMEM; | 268 | return -ENOMEM; |
272 | } | ||
273 | 269 | ||
274 | err = of_property_read_u32(np, "reg", &rtcdrv->rtc_base); | 270 | err = of_property_read_u32(np, "reg", &rtcdrv->rtc_base); |
275 | if (err) { | 271 | if (err) { |
@@ -335,39 +331,29 @@ static int sirfsoc_rtc_remove(struct platform_device *pdev) | |||
335 | return 0; | 331 | return 0; |
336 | } | 332 | } |
337 | 333 | ||
338 | #ifdef CONFIG_PM | 334 | #ifdef CONFIG_PM_SLEEP |
339 | |||
340 | static int sirfsoc_rtc_suspend(struct device *dev) | 335 | static int sirfsoc_rtc_suspend(struct device *dev) |
341 | { | 336 | { |
342 | struct platform_device *pdev = to_platform_device(dev); | 337 | struct sirfsoc_rtc_drv *rtcdrv = dev_get_drvdata(dev); |
343 | struct sirfsoc_rtc_drv *rtcdrv = platform_get_drvdata(pdev); | ||
344 | rtcdrv->overflow_rtc = | 338 | rtcdrv->overflow_rtc = |
345 | sirfsoc_rtc_iobrg_readl(rtcdrv->rtc_base + RTC_SW_VALUE); | 339 | sirfsoc_rtc_iobrg_readl(rtcdrv->rtc_base + RTC_SW_VALUE); |
346 | 340 | ||
347 | rtcdrv->saved_counter = | 341 | rtcdrv->saved_counter = |
348 | sirfsoc_rtc_iobrg_readl(rtcdrv->rtc_base + RTC_CN); | 342 | sirfsoc_rtc_iobrg_readl(rtcdrv->rtc_base + RTC_CN); |
349 | rtcdrv->saved_overflow_rtc = rtcdrv->overflow_rtc; | 343 | rtcdrv->saved_overflow_rtc = rtcdrv->overflow_rtc; |
350 | if (device_may_wakeup(&pdev->dev) && !enable_irq_wake(rtcdrv->irq)) | 344 | if (device_may_wakeup(dev) && !enable_irq_wake(rtcdrv->irq)) |
351 | rtcdrv->irq_wake = 1; | 345 | rtcdrv->irq_wake = 1; |
352 | 346 | ||
353 | return 0; | 347 | return 0; |
354 | } | 348 | } |
355 | 349 | ||
356 | static int sirfsoc_rtc_freeze(struct device *dev) | 350 | static int sirfsoc_rtc_resume(struct device *dev) |
357 | { | ||
358 | sirfsoc_rtc_suspend(dev); | ||
359 | |||
360 | return 0; | ||
361 | } | ||
362 | |||
363 | static int sirfsoc_rtc_thaw(struct device *dev) | ||
364 | { | 351 | { |
365 | u32 tmp; | 352 | u32 tmp; |
366 | struct sirfsoc_rtc_drv *rtcdrv; | 353 | struct sirfsoc_rtc_drv *rtcdrv = dev_get_drvdata(dev); |
367 | rtcdrv = dev_get_drvdata(dev); | ||
368 | 354 | ||
369 | /* | 355 | /* |
370 | * if resume from snapshot and the rtc power is losed, | 356 | * if resume from snapshot and the rtc power is lost, |
371 | * restroe the rtc settings | 357 | * restroe the rtc settings |
372 | */ | 358 | */ |
373 | if (SIRFSOC_RTC_CLK != sirfsoc_rtc_iobrg_readl( | 359 | if (SIRFSOC_RTC_CLK != sirfsoc_rtc_iobrg_readl( |
@@ -407,57 +393,23 @@ static int sirfsoc_rtc_thaw(struct device *dev) | |||
407 | sirfsoc_rtc_iobrg_writel(rtcdrv->overflow_rtc, | 393 | sirfsoc_rtc_iobrg_writel(rtcdrv->overflow_rtc, |
408 | rtcdrv->rtc_base + RTC_SW_VALUE); | 394 | rtcdrv->rtc_base + RTC_SW_VALUE); |
409 | 395 | ||
410 | return 0; | 396 | if (device_may_wakeup(dev) && rtcdrv->irq_wake) { |
411 | } | ||
412 | |||
413 | static int sirfsoc_rtc_resume(struct device *dev) | ||
414 | { | ||
415 | struct platform_device *pdev = to_platform_device(dev); | ||
416 | struct sirfsoc_rtc_drv *rtcdrv = platform_get_drvdata(pdev); | ||
417 | sirfsoc_rtc_thaw(dev); | ||
418 | if (device_may_wakeup(&pdev->dev) && rtcdrv->irq_wake) { | ||
419 | disable_irq_wake(rtcdrv->irq); | 397 | disable_irq_wake(rtcdrv->irq); |
420 | rtcdrv->irq_wake = 0; | 398 | rtcdrv->irq_wake = 0; |
421 | } | 399 | } |
422 | 400 | ||
423 | return 0; | 401 | return 0; |
424 | } | 402 | } |
425 | |||
426 | static int sirfsoc_rtc_restore(struct device *dev) | ||
427 | { | ||
428 | struct platform_device *pdev = to_platform_device(dev); | ||
429 | struct sirfsoc_rtc_drv *rtcdrv = platform_get_drvdata(pdev); | ||
430 | |||
431 | if (device_may_wakeup(&pdev->dev) && rtcdrv->irq_wake) { | ||
432 | disable_irq_wake(rtcdrv->irq); | ||
433 | rtcdrv->irq_wake = 0; | ||
434 | } | ||
435 | return 0; | ||
436 | } | ||
437 | |||
438 | #else | ||
439 | #define sirfsoc_rtc_suspend NULL | ||
440 | #define sirfsoc_rtc_resume NULL | ||
441 | #define sirfsoc_rtc_freeze NULL | ||
442 | #define sirfsoc_rtc_thaw NULL | ||
443 | #define sirfsoc_rtc_restore NULL | ||
444 | #endif | 403 | #endif |
445 | 404 | ||
446 | static const struct dev_pm_ops sirfsoc_rtc_pm_ops = { | 405 | static SIMPLE_DEV_PM_OPS(sirfsoc_rtc_pm_ops, |
447 | .suspend = sirfsoc_rtc_suspend, | 406 | sirfsoc_rtc_suspend, sirfsoc_rtc_resume); |
448 | .resume = sirfsoc_rtc_resume, | ||
449 | .freeze = sirfsoc_rtc_freeze, | ||
450 | .thaw = sirfsoc_rtc_thaw, | ||
451 | .restore = sirfsoc_rtc_restore, | ||
452 | }; | ||
453 | 407 | ||
454 | static struct platform_driver sirfsoc_rtc_driver = { | 408 | static struct platform_driver sirfsoc_rtc_driver = { |
455 | .driver = { | 409 | .driver = { |
456 | .name = "sirfsoc-rtc", | 410 | .name = "sirfsoc-rtc", |
457 | .owner = THIS_MODULE, | 411 | .owner = THIS_MODULE, |
458 | #ifdef CONFIG_PM | ||
459 | .pm = &sirfsoc_rtc_pm_ops, | 412 | .pm = &sirfsoc_rtc_pm_ops, |
460 | #endif | ||
461 | .of_match_table = sirfsoc_rtc_of_match, | 413 | .of_match_table = sirfsoc_rtc_of_match, |
462 | }, | 414 | }, |
463 | .probe = sirfsoc_rtc_probe, | 415 | .probe = sirfsoc_rtc_probe, |
diff --git a/drivers/rtc/rtc-spear.c b/drivers/rtc/rtc-spear.c index c492cf0ab8cd..d2cdb9823a15 100644 --- a/drivers/rtc/rtc-spear.c +++ b/drivers/rtc/rtc-spear.c | |||
@@ -365,10 +365,8 @@ static int spear_rtc_probe(struct platform_device *pdev) | |||
365 | } | 365 | } |
366 | 366 | ||
367 | config = devm_kzalloc(&pdev->dev, sizeof(*config), GFP_KERNEL); | 367 | config = devm_kzalloc(&pdev->dev, sizeof(*config), GFP_KERNEL); |
368 | if (!config) { | 368 | if (!config) |
369 | dev_err(&pdev->dev, "out of memory\n"); | ||
370 | return -ENOMEM; | 369 | return -ENOMEM; |
371 | } | ||
372 | 370 | ||
373 | /* alarm irqs */ | 371 | /* alarm irqs */ |
374 | irq = platform_get_irq(pdev, 0); | 372 | irq = platform_get_irq(pdev, 0); |
diff --git a/drivers/rtc/rtc-stk17ta8.c b/drivers/rtc/rtc-stk17ta8.c index a176ba614683..35ed49ea1f81 100644 --- a/drivers/rtc/rtc-stk17ta8.c +++ b/drivers/rtc/rtc-stk17ta8.c | |||
@@ -214,8 +214,7 @@ static irqreturn_t stk17ta8_rtc_interrupt(int irq, void *dev_id) | |||
214 | events |= RTC_UF; | 214 | events |= RTC_UF; |
215 | else | 215 | else |
216 | events |= RTC_AF; | 216 | events |= RTC_AF; |
217 | if (likely(pdata->rtc)) | 217 | rtc_update_irq(pdata->rtc, 1, events); |
218 | rtc_update_irq(pdata->rtc, 1, events); | ||
219 | } | 218 | } |
220 | spin_unlock(&pdata->lock); | 219 | spin_unlock(&pdata->lock); |
221 | return events ? IRQ_HANDLED : IRQ_NONE; | 220 | return events ? IRQ_HANDLED : IRQ_NONE; |
diff --git a/drivers/rtc/rtc-sunxi.c b/drivers/rtc/rtc-sunxi.c index 68a35284e5ad..b6f21f73d508 100644 --- a/drivers/rtc/rtc-sunxi.c +++ b/drivers/rtc/rtc-sunxi.c | |||
@@ -428,7 +428,7 @@ static const struct rtc_class_ops sunxi_rtc_ops = { | |||
428 | }; | 428 | }; |
429 | 429 | ||
430 | static const struct of_device_id sunxi_rtc_dt_ids[] = { | 430 | static const struct of_device_id sunxi_rtc_dt_ids[] = { |
431 | { .compatible = "allwinner,sun4i-rtc", .data = &data_year_param[0] }, | 431 | { .compatible = "allwinner,sun4i-a10-rtc", .data = &data_year_param[0] }, |
432 | { .compatible = "allwinner,sun7i-a20-rtc", .data = &data_year_param[1] }, | 432 | { .compatible = "allwinner,sun7i-a20-rtc", .data = &data_year_param[1] }, |
433 | { /* sentinel */ }, | 433 | { /* sentinel */ }, |
434 | }; | 434 | }; |
diff --git a/drivers/rtc/rtc-test.c b/drivers/rtc/rtc-test.c index 7746e65b93f2..6599c20bc454 100644 --- a/drivers/rtc/rtc-test.c +++ b/drivers/rtc/rtc-test.c | |||
@@ -104,20 +104,17 @@ static int test_probe(struct platform_device *plat_dev) | |||
104 | rtc = devm_rtc_device_register(&plat_dev->dev, "test", | 104 | rtc = devm_rtc_device_register(&plat_dev->dev, "test", |
105 | &test_rtc_ops, THIS_MODULE); | 105 | &test_rtc_ops, THIS_MODULE); |
106 | if (IS_ERR(rtc)) { | 106 | if (IS_ERR(rtc)) { |
107 | err = PTR_ERR(rtc); | 107 | return PTR_ERR(rtc); |
108 | return err; | ||
109 | } | 108 | } |
110 | 109 | ||
111 | err = device_create_file(&plat_dev->dev, &dev_attr_irq); | 110 | err = device_create_file(&plat_dev->dev, &dev_attr_irq); |
112 | if (err) | 111 | if (err) |
113 | goto err; | 112 | dev_err(&plat_dev->dev, "Unable to create sysfs entry: %s\n", |
113 | dev_attr_irq.attr.name); | ||
114 | 114 | ||
115 | platform_set_drvdata(plat_dev, rtc); | 115 | platform_set_drvdata(plat_dev, rtc); |
116 | 116 | ||
117 | return 0; | 117 | return 0; |
118 | |||
119 | err: | ||
120 | return err; | ||
121 | } | 118 | } |
122 | 119 | ||
123 | static int test_remove(struct platform_device *plat_dev) | 120 | static int test_remove(struct platform_device *plat_dev) |
diff --git a/drivers/rtc/rtc-tx4939.c b/drivers/rtc/rtc-tx4939.c index 4f87234e0dee..2e678c681b13 100644 --- a/drivers/rtc/rtc-tx4939.c +++ b/drivers/rtc/rtc-tx4939.c | |||
@@ -176,8 +176,8 @@ static irqreturn_t tx4939_rtc_interrupt(int irq, void *dev_id) | |||
176 | tx4939_rtc_cmd(rtcreg, TX4939_RTCCTL_COMMAND_NOP); | 176 | tx4939_rtc_cmd(rtcreg, TX4939_RTCCTL_COMMAND_NOP); |
177 | } | 177 | } |
178 | spin_unlock(&pdata->lock); | 178 | spin_unlock(&pdata->lock); |
179 | if (likely(pdata->rtc)) | 179 | rtc_update_irq(pdata->rtc, 1, events); |
180 | rtc_update_irq(pdata->rtc, 1, events); | 180 | |
181 | return IRQ_HANDLED; | 181 | return IRQ_HANDLED; |
182 | } | 182 | } |
183 | 183 | ||
diff --git a/drivers/rtc/rtc-vt8500.c b/drivers/rtc/rtc-vt8500.c index df2ef3eba7cd..051da968da6d 100644 --- a/drivers/rtc/rtc-vt8500.c +++ b/drivers/rtc/rtc-vt8500.c | |||
@@ -79,7 +79,6 @@ | |||
79 | 79 | ||
80 | struct vt8500_rtc { | 80 | struct vt8500_rtc { |
81 | void __iomem *regbase; | 81 | void __iomem *regbase; |
82 | struct resource *res; | ||
83 | int irq_alarm; | 82 | int irq_alarm; |
84 | struct rtc_device *rtc; | 83 | struct rtc_device *rtc; |
85 | spinlock_t lock; /* Protects this structure */ | 84 | spinlock_t lock; /* Protects this structure */ |
@@ -209,6 +208,7 @@ static const struct rtc_class_ops vt8500_rtc_ops = { | |||
209 | static int vt8500_rtc_probe(struct platform_device *pdev) | 208 | static int vt8500_rtc_probe(struct platform_device *pdev) |
210 | { | 209 | { |
211 | struct vt8500_rtc *vt8500_rtc; | 210 | struct vt8500_rtc *vt8500_rtc; |
211 | struct resource *res; | ||
212 | int ret; | 212 | int ret; |
213 | 213 | ||
214 | vt8500_rtc = devm_kzalloc(&pdev->dev, | 214 | vt8500_rtc = devm_kzalloc(&pdev->dev, |
@@ -219,34 +219,16 @@ static int vt8500_rtc_probe(struct platform_device *pdev) | |||
219 | spin_lock_init(&vt8500_rtc->lock); | 219 | spin_lock_init(&vt8500_rtc->lock); |
220 | platform_set_drvdata(pdev, vt8500_rtc); | 220 | platform_set_drvdata(pdev, vt8500_rtc); |
221 | 221 | ||
222 | vt8500_rtc->res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
223 | if (!vt8500_rtc->res) { | ||
224 | dev_err(&pdev->dev, "No I/O memory resource defined\n"); | ||
225 | return -ENXIO; | ||
226 | } | ||
227 | |||
228 | vt8500_rtc->irq_alarm = platform_get_irq(pdev, 0); | 222 | vt8500_rtc->irq_alarm = platform_get_irq(pdev, 0); |
229 | if (vt8500_rtc->irq_alarm < 0) { | 223 | if (vt8500_rtc->irq_alarm < 0) { |
230 | dev_err(&pdev->dev, "No alarm IRQ resource defined\n"); | 224 | dev_err(&pdev->dev, "No alarm IRQ resource defined\n"); |
231 | return vt8500_rtc->irq_alarm; | 225 | return vt8500_rtc->irq_alarm; |
232 | } | 226 | } |
233 | 227 | ||
234 | vt8500_rtc->res = devm_request_mem_region(&pdev->dev, | 228 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
235 | vt8500_rtc->res->start, | 229 | vt8500_rtc->regbase = devm_ioremap_resource(&pdev->dev, res); |
236 | resource_size(vt8500_rtc->res), | 230 | if (IS_ERR(vt8500_rtc->regbase)) |
237 | "vt8500-rtc"); | 231 | return PTR_ERR(vt8500_rtc->regbase); |
238 | if (vt8500_rtc->res == NULL) { | ||
239 | dev_err(&pdev->dev, "failed to request I/O memory\n"); | ||
240 | return -EBUSY; | ||
241 | } | ||
242 | |||
243 | vt8500_rtc->regbase = devm_ioremap(&pdev->dev, vt8500_rtc->res->start, | ||
244 | resource_size(vt8500_rtc->res)); | ||
245 | if (!vt8500_rtc->regbase) { | ||
246 | dev_err(&pdev->dev, "Unable to map RTC I/O memory\n"); | ||
247 | ret = -EBUSY; | ||
248 | goto err_return; | ||
249 | } | ||
250 | 232 | ||
251 | /* Enable RTC and set it to 24-hour mode */ | 233 | /* Enable RTC and set it to 24-hour mode */ |
252 | writel(VT8500_RTC_CR_ENABLE, | 234 | writel(VT8500_RTC_CR_ENABLE, |
diff --git a/drivers/rtc/rtc-x1205.c b/drivers/rtc/rtc-x1205.c index 365dc6505148..b1de58e0b3d0 100644 --- a/drivers/rtc/rtc-x1205.c +++ b/drivers/rtc/rtc-x1205.c | |||
@@ -660,7 +660,7 @@ static int x1205_probe(struct i2c_client *client, | |||
660 | 660 | ||
661 | err = x1205_sysfs_register(&client->dev); | 661 | err = x1205_sysfs_register(&client->dev); |
662 | if (err) | 662 | if (err) |
663 | return err; | 663 | dev_err(&client->dev, "Unable to create sysfs entries\n"); |
664 | 664 | ||
665 | return 0; | 665 | return 0; |
666 | } | 666 | } |