diff options
Diffstat (limited to 'drivers/rtc')
35 files changed, 1130 insertions, 157 deletions
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index 9654aa3c05cb..007730222116 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig | |||
@@ -153,6 +153,16 @@ config RTC_DRV_88PM80X | |||
153 | This driver can also be built as a module. If so, the module | 153 | This driver can also be built as a module. If so, the module |
154 | will be called rtc-88pm80x. | 154 | will be called rtc-88pm80x. |
155 | 155 | ||
156 | config RTC_DRV_AS3722 | ||
157 | tristate "ams AS3722 RTC driver" | ||
158 | depends on MFD_AS3722 | ||
159 | help | ||
160 | If you say yes here you get support for the RTC of ams AS3722 PMIC | ||
161 | chips. | ||
162 | |||
163 | This driver can also be built as a module. If so, the module | ||
164 | will be called rtc-as3722. | ||
165 | |||
156 | config RTC_DRV_DS1307 | 166 | config RTC_DRV_DS1307 |
157 | tristate "Dallas/Maxim DS1307/37/38/39/40, ST M41T00, EPSON RX-8025" | 167 | tristate "Dallas/Maxim DS1307/37/38/39/40, ST M41T00, EPSON RX-8025" |
158 | help | 168 | help |
@@ -497,6 +507,16 @@ config RTC_DRV_RV3029C2 | |||
497 | This driver can also be built as a module. If so, the module | 507 | This driver can also be built as a module. If so, the module |
498 | will be called rtc-rv3029c2. | 508 | will be called rtc-rv3029c2. |
499 | 509 | ||
510 | config RTC_DRV_S5M | ||
511 | tristate "Samsung S5M series" | ||
512 | depends on MFD_SEC_CORE | ||
513 | help | ||
514 | If you say yes here you will get support for the | ||
515 | RTC of Samsung S5M PMIC series. | ||
516 | |||
517 | This driver can also be built as a module. If so, the module | ||
518 | will be called rtc-s5m. | ||
519 | |||
500 | endif # I2C | 520 | endif # I2C |
501 | 521 | ||
502 | comment "SPI RTC drivers" | 522 | comment "SPI RTC drivers" |
@@ -606,7 +626,7 @@ comment "Platform RTC drivers" | |||
606 | 626 | ||
607 | config RTC_DRV_CMOS | 627 | config RTC_DRV_CMOS |
608 | tristate "PC-style 'CMOS'" | 628 | tristate "PC-style 'CMOS'" |
609 | depends on X86 || ALPHA || ARM || M32R || ATARI || PPC || MIPS || SPARC64 | 629 | depends on X86 || ARM || M32R || ATARI || PPC || MIPS || SPARC64 |
610 | default y if X86 | 630 | default y if X86 |
611 | help | 631 | help |
612 | Say "yes" here to get direct support for the real time clock | 632 | Say "yes" here to get direct support for the real time clock |
@@ -623,6 +643,14 @@ config RTC_DRV_CMOS | |||
623 | This driver can also be built as a module. If so, the module | 643 | This driver can also be built as a module. If so, the module |
624 | will be called rtc-cmos. | 644 | will be called rtc-cmos. |
625 | 645 | ||
646 | config RTC_DRV_ALPHA | ||
647 | bool "Alpha PC-style CMOS" | ||
648 | depends on ALPHA | ||
649 | default y | ||
650 | help | ||
651 | Direct support for the real-time clock found on every Alpha | ||
652 | system, specifically MC146818 compatibles. If in doubt, say Y. | ||
653 | |||
626 | config RTC_DRV_VRTC | 654 | config RTC_DRV_VRTC |
627 | tristate "Virtual RTC for Intel MID platforms" | 655 | tristate "Virtual RTC for Intel MID platforms" |
628 | depends on X86_INTEL_MID | 656 | depends on X86_INTEL_MID |
diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile index 2dff3d2009b5..27b4bd884066 100644 --- a/drivers/rtc/Makefile +++ b/drivers/rtc/Makefile | |||
@@ -20,6 +20,7 @@ obj-$(CONFIG_RTC_DRV_88PM860X) += rtc-88pm860x.o | |||
20 | obj-$(CONFIG_RTC_DRV_88PM80X) += rtc-88pm80x.o | 20 | obj-$(CONFIG_RTC_DRV_88PM80X) += rtc-88pm80x.o |
21 | obj-$(CONFIG_RTC_DRV_AB3100) += rtc-ab3100.o | 21 | obj-$(CONFIG_RTC_DRV_AB3100) += rtc-ab3100.o |
22 | obj-$(CONFIG_RTC_DRV_AB8500) += rtc-ab8500.o | 22 | obj-$(CONFIG_RTC_DRV_AB8500) += rtc-ab8500.o |
23 | obj-$(CONFIG_RTC_DRV_AS3722) += rtc-as3722.o | ||
23 | obj-$(CONFIG_RTC_DRV_AT32AP700X)+= rtc-at32ap700x.o | 24 | obj-$(CONFIG_RTC_DRV_AT32AP700X)+= rtc-at32ap700x.o |
24 | obj-$(CONFIG_RTC_DRV_AT91RM9200)+= rtc-at91rm9200.o | 25 | obj-$(CONFIG_RTC_DRV_AT91RM9200)+= rtc-at91rm9200.o |
25 | obj-$(CONFIG_RTC_DRV_AT91SAM9) += rtc-at91sam9.o | 26 | obj-$(CONFIG_RTC_DRV_AT91SAM9) += rtc-at91sam9.o |
@@ -107,6 +108,7 @@ obj-$(CONFIG_RTC_DRV_RX8025) += rtc-rx8025.o | |||
107 | obj-$(CONFIG_RTC_DRV_RX8581) += rtc-rx8581.o | 108 | obj-$(CONFIG_RTC_DRV_RX8581) += rtc-rx8581.o |
108 | obj-$(CONFIG_RTC_DRV_S35390A) += rtc-s35390a.o | 109 | obj-$(CONFIG_RTC_DRV_S35390A) += rtc-s35390a.o |
109 | obj-$(CONFIG_RTC_DRV_S3C) += rtc-s3c.o | 110 | obj-$(CONFIG_RTC_DRV_S3C) += rtc-s3c.o |
111 | obj-$(CONFIG_RTC_DRV_S5M) += rtc-s5m.o | ||
110 | obj-$(CONFIG_RTC_DRV_SA1100) += rtc-sa1100.o | 112 | obj-$(CONFIG_RTC_DRV_SA1100) += rtc-sa1100.o |
111 | obj-$(CONFIG_RTC_DRV_SH) += rtc-sh.o | 113 | obj-$(CONFIG_RTC_DRV_SH) += rtc-sh.o |
112 | obj-$(CONFIG_RTC_DRV_SNVS) += rtc-snvs.o | 114 | obj-$(CONFIG_RTC_DRV_SNVS) += rtc-snvs.o |
diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c index 72c5cdbe0791..544be722937c 100644 --- a/drivers/rtc/interface.c +++ b/drivers/rtc/interface.c | |||
@@ -72,6 +72,7 @@ int rtc_set_time(struct rtc_device *rtc, struct rtc_time *tm) | |||
72 | } else | 72 | } else |
73 | err = -EINVAL; | 73 | err = -EINVAL; |
74 | 74 | ||
75 | pm_stay_awake(rtc->dev.parent); | ||
75 | mutex_unlock(&rtc->ops_lock); | 76 | mutex_unlock(&rtc->ops_lock); |
76 | /* A timer might have just expired */ | 77 | /* A timer might have just expired */ |
77 | schedule_work(&rtc->irqwork); | 78 | schedule_work(&rtc->irqwork); |
@@ -113,6 +114,7 @@ int rtc_set_mmss(struct rtc_device *rtc, unsigned long secs) | |||
113 | err = -EINVAL; | 114 | err = -EINVAL; |
114 | } | 115 | } |
115 | 116 | ||
117 | pm_stay_awake(rtc->dev.parent); | ||
116 | mutex_unlock(&rtc->ops_lock); | 118 | mutex_unlock(&rtc->ops_lock); |
117 | /* A timer might have just expired */ | 119 | /* A timer might have just expired */ |
118 | schedule_work(&rtc->irqwork); | 120 | schedule_work(&rtc->irqwork); |
@@ -771,9 +773,10 @@ static int rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer) | |||
771 | alarm.time = rtc_ktime_to_tm(timer->node.expires); | 773 | alarm.time = rtc_ktime_to_tm(timer->node.expires); |
772 | alarm.enabled = 1; | 774 | alarm.enabled = 1; |
773 | err = __rtc_set_alarm(rtc, &alarm); | 775 | err = __rtc_set_alarm(rtc, &alarm); |
774 | if (err == -ETIME) | 776 | if (err == -ETIME) { |
777 | pm_stay_awake(rtc->dev.parent); | ||
775 | schedule_work(&rtc->irqwork); | 778 | schedule_work(&rtc->irqwork); |
776 | else if (err) { | 779 | } else if (err) { |
777 | timerqueue_del(&rtc->timerqueue, &timer->node); | 780 | timerqueue_del(&rtc->timerqueue, &timer->node); |
778 | timer->enabled = 0; | 781 | timer->enabled = 0; |
779 | return err; | 782 | return err; |
@@ -818,8 +821,10 @@ static void rtc_timer_remove(struct rtc_device *rtc, struct rtc_timer *timer) | |||
818 | alarm.time = rtc_ktime_to_tm(next->expires); | 821 | alarm.time = rtc_ktime_to_tm(next->expires); |
819 | alarm.enabled = 1; | 822 | alarm.enabled = 1; |
820 | err = __rtc_set_alarm(rtc, &alarm); | 823 | err = __rtc_set_alarm(rtc, &alarm); |
821 | if (err == -ETIME) | 824 | if (err == -ETIME) { |
825 | pm_stay_awake(rtc->dev.parent); | ||
822 | schedule_work(&rtc->irqwork); | 826 | schedule_work(&rtc->irqwork); |
827 | } | ||
823 | } | 828 | } |
824 | } | 829 | } |
825 | 830 | ||
@@ -845,7 +850,6 @@ void rtc_timer_do_work(struct work_struct *work) | |||
845 | 850 | ||
846 | mutex_lock(&rtc->ops_lock); | 851 | mutex_lock(&rtc->ops_lock); |
847 | again: | 852 | again: |
848 | pm_relax(rtc->dev.parent); | ||
849 | __rtc_read_time(rtc, &tm); | 853 | __rtc_read_time(rtc, &tm); |
850 | now = rtc_tm_to_ktime(tm); | 854 | now = rtc_tm_to_ktime(tm); |
851 | while ((next = timerqueue_getnext(&rtc->timerqueue))) { | 855 | while ((next = timerqueue_getnext(&rtc->timerqueue))) { |
@@ -880,6 +884,7 @@ again: | |||
880 | } else | 884 | } else |
881 | rtc_alarm_disable(rtc); | 885 | rtc_alarm_disable(rtc); |
882 | 886 | ||
887 | pm_relax(rtc->dev.parent); | ||
883 | mutex_unlock(&rtc->ops_lock); | 888 | mutex_unlock(&rtc->ops_lock); |
884 | } | 889 | } |
885 | 890 | ||
diff --git a/drivers/rtc/rtc-88pm80x.c b/drivers/rtc/rtc-88pm80x.c index 354c937a5866..0916089c7c3e 100644 --- a/drivers/rtc/rtc-88pm80x.c +++ b/drivers/rtc/rtc-88pm80x.c | |||
@@ -251,14 +251,15 @@ static SIMPLE_DEV_PM_OPS(pm80x_rtc_pm_ops, pm80x_rtc_suspend, pm80x_rtc_resume); | |||
251 | static int pm80x_rtc_probe(struct platform_device *pdev) | 251 | static int pm80x_rtc_probe(struct platform_device *pdev) |
252 | { | 252 | { |
253 | struct pm80x_chip *chip = dev_get_drvdata(pdev->dev.parent); | 253 | struct pm80x_chip *chip = dev_get_drvdata(pdev->dev.parent); |
254 | struct pm80x_platform_data *pm80x_pdata; | 254 | struct pm80x_platform_data *pm80x_pdata = |
255 | dev_get_platdata(pdev->dev.parent); | ||
255 | struct pm80x_rtc_pdata *pdata = NULL; | 256 | struct pm80x_rtc_pdata *pdata = NULL; |
256 | struct pm80x_rtc_info *info; | 257 | struct pm80x_rtc_info *info; |
257 | struct rtc_time tm; | 258 | struct rtc_time tm; |
258 | unsigned long ticks = 0; | 259 | unsigned long ticks = 0; |
259 | int ret; | 260 | int ret; |
260 | 261 | ||
261 | pdata = pdev->dev.platform_data; | 262 | pdata = dev_get_platdata(&pdev->dev); |
262 | if (pdata == NULL) | 263 | if (pdata == NULL) |
263 | dev_warn(&pdev->dev, "No platform data!\n"); | 264 | dev_warn(&pdev->dev, "No platform data!\n"); |
264 | 265 | ||
@@ -326,8 +327,7 @@ static int pm80x_rtc_probe(struct platform_device *pdev) | |||
326 | regmap_update_bits(info->map, PM800_RTC_CONTROL, PM800_RTC1_USE_XO, | 327 | regmap_update_bits(info->map, PM800_RTC_CONTROL, PM800_RTC1_USE_XO, |
327 | PM800_RTC1_USE_XO); | 328 | PM800_RTC1_USE_XO); |
328 | 329 | ||
329 | if (pdev->dev.parent->platform_data) { | 330 | if (pm80x_pdata) { |
330 | pm80x_pdata = pdev->dev.parent->platform_data; | ||
331 | pdata = pm80x_pdata->rtc; | 331 | pdata = pm80x_pdata->rtc; |
332 | if (pdata) | 332 | if (pdata) |
333 | info->rtc_dev->dev.platform_data = &pdata->rtc_wakeup; | 333 | info->rtc_dev->dev.platform_data = &pdata->rtc_wakeup; |
diff --git a/drivers/rtc/rtc-88pm860x.c b/drivers/rtc/rtc-88pm860x.c index 4e30c85728e5..816504846cdd 100644 --- a/drivers/rtc/rtc-88pm860x.c +++ b/drivers/rtc/rtc-88pm860x.c | |||
@@ -316,7 +316,7 @@ static int pm860x_rtc_probe(struct platform_device *pdev) | |||
316 | unsigned long ticks = 0; | 316 | unsigned long ticks = 0; |
317 | int ret; | 317 | int ret; |
318 | 318 | ||
319 | pdata = pdev->dev.platform_data; | 319 | pdata = dev_get_platdata(&pdev->dev); |
320 | 320 | ||
321 | info = devm_kzalloc(&pdev->dev, sizeof(struct pm860x_rtc_info), | 321 | info = devm_kzalloc(&pdev->dev, sizeof(struct pm860x_rtc_info), |
322 | GFP_KERNEL); | 322 | GFP_KERNEL); |
diff --git a/drivers/rtc/rtc-as3722.c b/drivers/rtc/rtc-as3722.c new file mode 100644 index 000000000000..9cfa8170a2d6 --- /dev/null +++ b/drivers/rtc/rtc-as3722.c | |||
@@ -0,0 +1,275 @@ | |||
1 | /* | ||
2 | * rtc-as3722.c - Real Time Clock driver for ams AS3722 PMICs | ||
3 | * | ||
4 | * Copyright (C) 2013 ams AG | ||
5 | * Copyright (c) 2013, NVIDIA Corporation. All rights reserved. | ||
6 | * | ||
7 | * Author: Florian Lobmaier <florian.lobmaier@ams.com> | ||
8 | * Author: Laxman Dewangan <ldewangan@nvidia.com> | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License as published by | ||
12 | * the Free Software Foundation; either version 2 of the License, or | ||
13 | * (at your option) any later version. | ||
14 | * | ||
15 | * This program is distributed in the hope that it will be useful, | ||
16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
18 | * GNU General Public License for more details. | ||
19 | */ | ||
20 | |||
21 | #include <linux/bcd.h> | ||
22 | #include <linux/completion.h> | ||
23 | #include <linux/delay.h> | ||
24 | #include <linux/interrupt.h> | ||
25 | #include <linux/ioctl.h> | ||
26 | #include <linux/kernel.h> | ||
27 | #include <linux/module.h> | ||
28 | #include <linux/mfd/as3722.h> | ||
29 | #include <linux/platform_device.h> | ||
30 | #include <linux/rtc.h> | ||
31 | #include <linux/time.h> | ||
32 | |||
33 | #define AS3722_RTC_START_YEAR 2000 | ||
34 | struct as3722_rtc { | ||
35 | struct rtc_device *rtc; | ||
36 | struct device *dev; | ||
37 | struct as3722 *as3722; | ||
38 | int alarm_irq; | ||
39 | bool irq_enable; | ||
40 | }; | ||
41 | |||
42 | static void as3722_time_to_reg(u8 *rbuff, struct rtc_time *tm) | ||
43 | { | ||
44 | rbuff[0] = bin2bcd(tm->tm_sec); | ||
45 | rbuff[1] = bin2bcd(tm->tm_min); | ||
46 | rbuff[2] = bin2bcd(tm->tm_hour); | ||
47 | rbuff[3] = bin2bcd(tm->tm_mday); | ||
48 | rbuff[4] = bin2bcd(tm->tm_mon); | ||
49 | rbuff[5] = bin2bcd(tm->tm_year - (AS3722_RTC_START_YEAR - 1900)); | ||
50 | } | ||
51 | |||
52 | static void as3722_reg_to_time(u8 *rbuff, struct rtc_time *tm) | ||
53 | { | ||
54 | tm->tm_sec = bcd2bin(rbuff[0] & 0x7F); | ||
55 | tm->tm_min = bcd2bin(rbuff[1] & 0x7F); | ||
56 | tm->tm_hour = bcd2bin(rbuff[2] & 0x3F); | ||
57 | tm->tm_mday = bcd2bin(rbuff[3] & 0x3F); | ||
58 | tm->tm_mon = bcd2bin(rbuff[4] & 0x1F); | ||
59 | tm->tm_year = (AS3722_RTC_START_YEAR - 1900) + bcd2bin(rbuff[5] & 0x7F); | ||
60 | return; | ||
61 | } | ||
62 | |||
63 | static int as3722_rtc_read_time(struct device *dev, struct rtc_time *tm) | ||
64 | { | ||
65 | struct as3722_rtc *as3722_rtc = dev_get_drvdata(dev); | ||
66 | struct as3722 *as3722 = as3722_rtc->as3722; | ||
67 | u8 as_time_array[6]; | ||
68 | int ret; | ||
69 | |||
70 | ret = as3722_block_read(as3722, AS3722_RTC_SECOND_REG, | ||
71 | 6, as_time_array); | ||
72 | if (ret < 0) { | ||
73 | dev_err(dev, "RTC_SECOND reg block read failed %d\n", ret); | ||
74 | return ret; | ||
75 | } | ||
76 | as3722_reg_to_time(as_time_array, tm); | ||
77 | return 0; | ||
78 | } | ||
79 | |||
80 | static int as3722_rtc_set_time(struct device *dev, struct rtc_time *tm) | ||
81 | { | ||
82 | struct as3722_rtc *as3722_rtc = dev_get_drvdata(dev); | ||
83 | struct as3722 *as3722 = as3722_rtc->as3722; | ||
84 | u8 as_time_array[6]; | ||
85 | int ret; | ||
86 | |||
87 | if (tm->tm_year < (AS3722_RTC_START_YEAR - 1900)) | ||
88 | return -EINVAL; | ||
89 | |||
90 | as3722_time_to_reg(as_time_array, tm); | ||
91 | ret = as3722_block_write(as3722, AS3722_RTC_SECOND_REG, 6, | ||
92 | as_time_array); | ||
93 | if (ret < 0) | ||
94 | dev_err(dev, "RTC_SECOND reg block write failed %d\n", ret); | ||
95 | return ret; | ||
96 | } | ||
97 | |||
98 | static int as3722_rtc_alarm_irq_enable(struct device *dev, | ||
99 | unsigned int enabled) | ||
100 | { | ||
101 | struct as3722_rtc *as3722_rtc = dev_get_drvdata(dev); | ||
102 | |||
103 | if (enabled && !as3722_rtc->irq_enable) { | ||
104 | enable_irq(as3722_rtc->alarm_irq); | ||
105 | as3722_rtc->irq_enable = true; | ||
106 | } else if (!enabled && as3722_rtc->irq_enable) { | ||
107 | disable_irq(as3722_rtc->alarm_irq); | ||
108 | as3722_rtc->irq_enable = false; | ||
109 | } | ||
110 | return 0; | ||
111 | } | ||
112 | |||
113 | static int as3722_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) | ||
114 | { | ||
115 | struct as3722_rtc *as3722_rtc = dev_get_drvdata(dev); | ||
116 | struct as3722 *as3722 = as3722_rtc->as3722; | ||
117 | u8 as_time_array[6]; | ||
118 | int ret; | ||
119 | |||
120 | ret = as3722_block_read(as3722, AS3722_RTC_ALARM_SECOND_REG, 6, | ||
121 | as_time_array); | ||
122 | if (ret < 0) { | ||
123 | dev_err(dev, "RTC_ALARM_SECOND block read failed %d\n", ret); | ||
124 | return ret; | ||
125 | } | ||
126 | |||
127 | as3722_reg_to_time(as_time_array, &alrm->time); | ||
128 | return 0; | ||
129 | } | ||
130 | |||
131 | static int as3722_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) | ||
132 | { | ||
133 | struct as3722_rtc *as3722_rtc = dev_get_drvdata(dev); | ||
134 | struct as3722 *as3722 = as3722_rtc->as3722; | ||
135 | u8 as_time_array[6]; | ||
136 | int ret; | ||
137 | |||
138 | if (alrm->time.tm_year < (AS3722_RTC_START_YEAR - 1900)) | ||
139 | return -EINVAL; | ||
140 | |||
141 | ret = as3722_rtc_alarm_irq_enable(dev, 0); | ||
142 | if (ret < 0) { | ||
143 | dev_err(dev, "Disable RTC alarm failed\n"); | ||
144 | return ret; | ||
145 | } | ||
146 | |||
147 | as3722_time_to_reg(as_time_array, &alrm->time); | ||
148 | ret = as3722_block_write(as3722, AS3722_RTC_ALARM_SECOND_REG, 6, | ||
149 | as_time_array); | ||
150 | if (ret < 0) { | ||
151 | dev_err(dev, "RTC_ALARM_SECOND block write failed %d\n", ret); | ||
152 | return ret; | ||
153 | } | ||
154 | |||
155 | if (alrm->enabled) | ||
156 | ret = as3722_rtc_alarm_irq_enable(dev, alrm->enabled); | ||
157 | return ret; | ||
158 | } | ||
159 | |||
160 | static irqreturn_t as3722_alarm_irq(int irq, void *data) | ||
161 | { | ||
162 | struct as3722_rtc *as3722_rtc = data; | ||
163 | |||
164 | rtc_update_irq(as3722_rtc->rtc, 1, RTC_IRQF | RTC_AF); | ||
165 | return IRQ_HANDLED; | ||
166 | } | ||
167 | |||
168 | static const struct rtc_class_ops as3722_rtc_ops = { | ||
169 | .read_time = as3722_rtc_read_time, | ||
170 | .set_time = as3722_rtc_set_time, | ||
171 | .read_alarm = as3722_rtc_read_alarm, | ||
172 | .set_alarm = as3722_rtc_set_alarm, | ||
173 | .alarm_irq_enable = as3722_rtc_alarm_irq_enable, | ||
174 | }; | ||
175 | |||
176 | static int as3722_rtc_probe(struct platform_device *pdev) | ||
177 | { | ||
178 | struct as3722 *as3722 = dev_get_drvdata(pdev->dev.parent); | ||
179 | struct as3722_rtc *as3722_rtc; | ||
180 | int ret; | ||
181 | |||
182 | as3722_rtc = devm_kzalloc(&pdev->dev, sizeof(*as3722_rtc), GFP_KERNEL); | ||
183 | if (!as3722_rtc) | ||
184 | return -ENOMEM; | ||
185 | |||
186 | as3722_rtc->as3722 = as3722; | ||
187 | as3722_rtc->dev = &pdev->dev; | ||
188 | platform_set_drvdata(pdev, as3722_rtc); | ||
189 | |||
190 | /* Enable the RTC to make sure it is running. */ | ||
191 | ret = as3722_update_bits(as3722, AS3722_RTC_CONTROL_REG, | ||
192 | AS3722_RTC_ON | AS3722_RTC_ALARM_WAKEUP_EN, | ||
193 | AS3722_RTC_ON | AS3722_RTC_ALARM_WAKEUP_EN); | ||
194 | if (ret < 0) { | ||
195 | dev_err(&pdev->dev, "RTC_CONTROL reg write failed: %d\n", ret); | ||
196 | return ret; | ||
197 | } | ||
198 | |||
199 | device_init_wakeup(&pdev->dev, 1); | ||
200 | |||
201 | as3722_rtc->rtc = rtc_device_register("as3722", &pdev->dev, | ||
202 | &as3722_rtc_ops, THIS_MODULE); | ||
203 | if (IS_ERR(as3722_rtc->rtc)) { | ||
204 | ret = PTR_ERR(as3722_rtc->rtc); | ||
205 | dev_err(&pdev->dev, "RTC register failed: %d\n", ret); | ||
206 | return ret; | ||
207 | } | ||
208 | |||
209 | as3722_rtc->alarm_irq = platform_get_irq(pdev, 0); | ||
210 | dev_info(&pdev->dev, "RTC interrupt %d\n", as3722_rtc->alarm_irq); | ||
211 | |||
212 | ret = request_threaded_irq(as3722_rtc->alarm_irq, NULL, | ||
213 | as3722_alarm_irq, IRQF_ONESHOT | IRQF_EARLY_RESUME, | ||
214 | "rtc-alarm", as3722_rtc); | ||
215 | if (ret < 0) { | ||
216 | dev_err(&pdev->dev, "Failed to request alarm IRQ %d: %d\n", | ||
217 | as3722_rtc->alarm_irq, ret); | ||
218 | goto scrub; | ||
219 | } | ||
220 | disable_irq(as3722_rtc->alarm_irq); | ||
221 | return 0; | ||
222 | scrub: | ||
223 | rtc_device_unregister(as3722_rtc->rtc); | ||
224 | return ret; | ||
225 | } | ||
226 | |||
227 | static int as3722_rtc_remove(struct platform_device *pdev) | ||
228 | { | ||
229 | struct as3722_rtc *as3722_rtc = platform_get_drvdata(pdev); | ||
230 | |||
231 | free_irq(as3722_rtc->alarm_irq, as3722_rtc); | ||
232 | rtc_device_unregister(as3722_rtc->rtc); | ||
233 | return 0; | ||
234 | } | ||
235 | |||
236 | #ifdef CONFIG_PM_SLEEP | ||
237 | static int as3722_rtc_suspend(struct device *dev) | ||
238 | { | ||
239 | struct as3722_rtc *as3722_rtc = dev_get_drvdata(dev); | ||
240 | |||
241 | if (device_may_wakeup(dev)) | ||
242 | enable_irq_wake(as3722_rtc->alarm_irq); | ||
243 | |||
244 | return 0; | ||
245 | } | ||
246 | |||
247 | static int as3722_rtc_resume(struct device *dev) | ||
248 | { | ||
249 | struct as3722_rtc *as3722_rtc = dev_get_drvdata(dev); | ||
250 | |||
251 | if (device_may_wakeup(dev)) | ||
252 | disable_irq_wake(as3722_rtc->alarm_irq); | ||
253 | return 0; | ||
254 | } | ||
255 | #endif | ||
256 | |||
257 | static const struct dev_pm_ops as3722_rtc_pm_ops = { | ||
258 | SET_SYSTEM_SLEEP_PM_OPS(as3722_rtc_suspend, as3722_rtc_resume) | ||
259 | }; | ||
260 | |||
261 | static struct platform_driver as3722_rtc_driver = { | ||
262 | .probe = as3722_rtc_probe, | ||
263 | .remove = as3722_rtc_remove, | ||
264 | .driver = { | ||
265 | .name = "as3722-rtc", | ||
266 | .pm = &as3722_rtc_pm_ops, | ||
267 | }, | ||
268 | }; | ||
269 | module_platform_driver(as3722_rtc_driver); | ||
270 | |||
271 | MODULE_DESCRIPTION("RTC driver for AS3722 PMICs"); | ||
272 | MODULE_ALIAS("platform:as3722-rtc"); | ||
273 | MODULE_AUTHOR("Florian Lobmaier <florian.lobmaier@ams.com>"); | ||
274 | MODULE_AUTHOR("Laxman Dewangan <ldewangan@nvidia.com>"); | ||
275 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/rtc/rtc-at91rm9200.c b/drivers/rtc/rtc-at91rm9200.c index 741892632ae0..3281c90691c3 100644 --- a/drivers/rtc/rtc-at91rm9200.c +++ b/drivers/rtc/rtc-at91rm9200.c | |||
@@ -220,6 +220,8 @@ static int at91_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
220 | 220 | ||
221 | at91_alarm_year = tm.tm_year; | 221 | at91_alarm_year = tm.tm_year; |
222 | 222 | ||
223 | tm.tm_mon = alrm->time.tm_mon; | ||
224 | tm.tm_mday = alrm->time.tm_mday; | ||
223 | tm.tm_hour = alrm->time.tm_hour; | 225 | tm.tm_hour = alrm->time.tm_hour; |
224 | tm.tm_min = alrm->time.tm_min; | 226 | tm.tm_min = alrm->time.tm_min; |
225 | tm.tm_sec = alrm->time.tm_sec; | 227 | tm.tm_sec = alrm->time.tm_sec; |
@@ -376,7 +378,8 @@ static int __init at91_rtc_probe(struct platform_device *pdev) | |||
376 | return -ENXIO; | 378 | return -ENXIO; |
377 | } | 379 | } |
378 | 380 | ||
379 | at91_rtc_regs = ioremap(regs->start, resource_size(regs)); | 381 | at91_rtc_regs = devm_ioremap(&pdev->dev, regs->start, |
382 | resource_size(regs)); | ||
380 | if (!at91_rtc_regs) { | 383 | if (!at91_rtc_regs) { |
381 | dev_err(&pdev->dev, "failed to map registers, aborting.\n"); | 384 | dev_err(&pdev->dev, "failed to map registers, aborting.\n"); |
382 | return -ENOMEM; | 385 | return -ENOMEM; |
@@ -390,12 +393,12 @@ static int __init at91_rtc_probe(struct platform_device *pdev) | |||
390 | AT91_RTC_SECEV | AT91_RTC_TIMEV | | 393 | AT91_RTC_SECEV | AT91_RTC_TIMEV | |
391 | AT91_RTC_CALEV); | 394 | AT91_RTC_CALEV); |
392 | 395 | ||
393 | ret = request_irq(irq, at91_rtc_interrupt, | 396 | ret = devm_request_irq(&pdev->dev, irq, at91_rtc_interrupt, |
394 | IRQF_SHARED, | 397 | IRQF_SHARED, |
395 | "at91_rtc", pdev); | 398 | "at91_rtc", pdev); |
396 | if (ret) { | 399 | if (ret) { |
397 | dev_err(&pdev->dev, "IRQ %d already in use.\n", irq); | 400 | dev_err(&pdev->dev, "IRQ %d already in use.\n", irq); |
398 | goto err_unmap; | 401 | return ret; |
399 | } | 402 | } |
400 | 403 | ||
401 | /* cpu init code should really have flagged this device as | 404 | /* cpu init code should really have flagged this device as |
@@ -404,23 +407,14 @@ static int __init at91_rtc_probe(struct platform_device *pdev) | |||
404 | if (!device_can_wakeup(&pdev->dev)) | 407 | if (!device_can_wakeup(&pdev->dev)) |
405 | device_init_wakeup(&pdev->dev, 1); | 408 | device_init_wakeup(&pdev->dev, 1); |
406 | 409 | ||
407 | rtc = rtc_device_register(pdev->name, &pdev->dev, | 410 | rtc = devm_rtc_device_register(&pdev->dev, pdev->name, |
408 | &at91_rtc_ops, THIS_MODULE); | 411 | &at91_rtc_ops, THIS_MODULE); |
409 | if (IS_ERR(rtc)) { | 412 | if (IS_ERR(rtc)) |
410 | ret = PTR_ERR(rtc); | 413 | return PTR_ERR(rtc); |
411 | goto err_free_irq; | ||
412 | } | ||
413 | platform_set_drvdata(pdev, rtc); | 414 | platform_set_drvdata(pdev, rtc); |
414 | 415 | ||
415 | dev_info(&pdev->dev, "AT91 Real Time Clock driver.\n"); | 416 | dev_info(&pdev->dev, "AT91 Real Time Clock driver.\n"); |
416 | return 0; | 417 | return 0; |
417 | |||
418 | err_free_irq: | ||
419 | free_irq(irq, pdev); | ||
420 | err_unmap: | ||
421 | iounmap(at91_rtc_regs); | ||
422 | |||
423 | return ret; | ||
424 | } | 418 | } |
425 | 419 | ||
426 | /* | 420 | /* |
@@ -428,20 +422,22 @@ err_unmap: | |||
428 | */ | 422 | */ |
429 | static int __exit at91_rtc_remove(struct platform_device *pdev) | 423 | static int __exit at91_rtc_remove(struct platform_device *pdev) |
430 | { | 424 | { |
431 | struct rtc_device *rtc = platform_get_drvdata(pdev); | ||
432 | |||
433 | /* Disable all interrupts */ | 425 | /* Disable all interrupts */ |
434 | at91_rtc_write_idr(AT91_RTC_ACKUPD | AT91_RTC_ALARM | | 426 | at91_rtc_write_idr(AT91_RTC_ACKUPD | AT91_RTC_ALARM | |
435 | AT91_RTC_SECEV | AT91_RTC_TIMEV | | 427 | AT91_RTC_SECEV | AT91_RTC_TIMEV | |
436 | AT91_RTC_CALEV); | 428 | AT91_RTC_CALEV); |
437 | free_irq(irq, pdev); | ||
438 | |||
439 | rtc_device_unregister(rtc); | ||
440 | iounmap(at91_rtc_regs); | ||
441 | 429 | ||
442 | return 0; | 430 | return 0; |
443 | } | 431 | } |
444 | 432 | ||
433 | static void at91_rtc_shutdown(struct platform_device *pdev) | ||
434 | { | ||
435 | /* Disable all interrupts */ | ||
436 | at91_rtc_write(AT91_RTC_IDR, AT91_RTC_ACKUPD | AT91_RTC_ALARM | | ||
437 | AT91_RTC_SECEV | AT91_RTC_TIMEV | | ||
438 | AT91_RTC_CALEV); | ||
439 | } | ||
440 | |||
445 | #ifdef CONFIG_PM_SLEEP | 441 | #ifdef CONFIG_PM_SLEEP |
446 | 442 | ||
447 | /* AT91RM9200 RTC Power management control */ | 443 | /* AT91RM9200 RTC Power management control */ |
@@ -480,6 +476,7 @@ static SIMPLE_DEV_PM_OPS(at91_rtc_pm_ops, at91_rtc_suspend, at91_rtc_resume); | |||
480 | 476 | ||
481 | static struct platform_driver at91_rtc_driver = { | 477 | static struct platform_driver at91_rtc_driver = { |
482 | .remove = __exit_p(at91_rtc_remove), | 478 | .remove = __exit_p(at91_rtc_remove), |
479 | .shutdown = at91_rtc_shutdown, | ||
483 | .driver = { | 480 | .driver = { |
484 | .name = "at91_rtc", | 481 | .name = "at91_rtc", |
485 | .owner = THIS_MODULE, | 482 | .owner = THIS_MODULE, |
diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c index 24e733c98f8b..f14876256a4a 100644 --- a/drivers/rtc/rtc-cmos.c +++ b/drivers/rtc/rtc-cmos.c | |||
@@ -595,7 +595,7 @@ static irqreturn_t cmos_interrupt(int irq, void *p) | |||
595 | static int INITSECTION | 595 | static int INITSECTION |
596 | cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq) | 596 | cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq) |
597 | { | 597 | { |
598 | struct cmos_rtc_board_info *info = dev->platform_data; | 598 | struct cmos_rtc_board_info *info = dev_get_platdata(dev); |
599 | int retval = 0; | 599 | int retval = 0; |
600 | unsigned char rtc_control; | 600 | unsigned char rtc_control; |
601 | unsigned address_space; | 601 | unsigned address_space; |
@@ -789,7 +789,6 @@ static void __exit cmos_do_remove(struct device *dev) | |||
789 | cmos->iomem = NULL; | 789 | cmos->iomem = NULL; |
790 | 790 | ||
791 | cmos->dev = NULL; | 791 | cmos->dev = NULL; |
792 | dev_set_drvdata(dev, NULL); | ||
793 | } | 792 | } |
794 | 793 | ||
795 | #ifdef CONFIG_PM | 794 | #ifdef CONFIG_PM |
diff --git a/drivers/rtc/rtc-da9055.c b/drivers/rtc/rtc-da9055.c index e00642b61076..48cb2ac3bd3e 100644 --- a/drivers/rtc/rtc-da9055.c +++ b/drivers/rtc/rtc-da9055.c | |||
@@ -278,7 +278,7 @@ static int da9055_rtc_probe(struct platform_device *pdev) | |||
278 | return -ENOMEM; | 278 | return -ENOMEM; |
279 | 279 | ||
280 | rtc->da9055 = dev_get_drvdata(pdev->dev.parent); | 280 | rtc->da9055 = dev_get_drvdata(pdev->dev.parent); |
281 | pdata = rtc->da9055->dev->platform_data; | 281 | pdata = dev_get_platdata(rtc->da9055->dev); |
282 | platform_set_drvdata(pdev, rtc); | 282 | platform_set_drvdata(pdev, rtc); |
283 | 283 | ||
284 | ret = da9055_rtc_device_init(rtc->da9055, pdata); | 284 | ret = da9055_rtc_device_init(rtc->da9055, pdata); |
diff --git a/drivers/rtc/rtc-ds1305.c b/drivers/rtc/rtc-ds1305.c index dd6170acde95..80f323731ee2 100644 --- a/drivers/rtc/rtc-ds1305.c +++ b/drivers/rtc/rtc-ds1305.c | |||
@@ -606,7 +606,7 @@ static int ds1305_probe(struct spi_device *spi) | |||
606 | struct ds1305 *ds1305; | 606 | struct ds1305 *ds1305; |
607 | int status; | 607 | int status; |
608 | u8 addr, value; | 608 | u8 addr, value; |
609 | struct ds1305_platform_data *pdata = spi->dev.platform_data; | 609 | struct ds1305_platform_data *pdata = dev_get_platdata(&spi->dev); |
610 | bool write_ctrl = false; | 610 | bool write_ctrl = false; |
611 | 611 | ||
612 | /* Sanity check board setup data. This may be hooked up | 612 | /* Sanity check board setup data. This may be hooked up |
diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c index ca18fd1433b3..4e75345a559a 100644 --- a/drivers/rtc/rtc-ds1307.c +++ b/drivers/rtc/rtc-ds1307.c | |||
@@ -670,9 +670,9 @@ static int ds1307_probe(struct i2c_client *client, | |||
670 | int tmp; | 670 | int tmp; |
671 | const struct chip_desc *chip = &chips[id->driver_data]; | 671 | const struct chip_desc *chip = &chips[id->driver_data]; |
672 | struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); | 672 | struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); |
673 | int want_irq = false; | 673 | bool want_irq = false; |
674 | unsigned char *buf; | 674 | unsigned char *buf; |
675 | struct ds1307_platform_data *pdata = client->dev.platform_data; | 675 | struct ds1307_platform_data *pdata = dev_get_platdata(&client->dev); |
676 | static const int bbsqi_bitpos[] = { | 676 | static const int bbsqi_bitpos[] = { |
677 | [ds_1337] = 0, | 677 | [ds_1337] = 0, |
678 | [ds_1339] = DS1339_BIT_BBSQI, | 678 | [ds_1339] = DS1339_BIT_BBSQI, |
@@ -956,7 +956,7 @@ read_rtc: | |||
956 | GFP_KERNEL); | 956 | GFP_KERNEL); |
957 | if (!ds1307->nvram) { | 957 | if (!ds1307->nvram) { |
958 | err = -ENOMEM; | 958 | err = -ENOMEM; |
959 | goto exit; | 959 | goto err_irq; |
960 | } | 960 | } |
961 | ds1307->nvram->attr.name = "nvram"; | 961 | ds1307->nvram->attr.name = "nvram"; |
962 | ds1307->nvram->attr.mode = S_IRUGO | S_IWUSR; | 962 | ds1307->nvram->attr.mode = S_IRUGO | S_IWUSR; |
@@ -967,13 +967,15 @@ read_rtc: | |||
967 | ds1307->nvram_offset = chip->nvram_offset; | 967 | ds1307->nvram_offset = chip->nvram_offset; |
968 | err = sysfs_create_bin_file(&client->dev.kobj, ds1307->nvram); | 968 | err = sysfs_create_bin_file(&client->dev.kobj, ds1307->nvram); |
969 | if (err) | 969 | if (err) |
970 | goto exit; | 970 | goto err_irq; |
971 | set_bit(HAS_NVRAM, &ds1307->flags); | 971 | set_bit(HAS_NVRAM, &ds1307->flags); |
972 | dev_info(&client->dev, "%zu bytes nvram\n", ds1307->nvram->size); | 972 | dev_info(&client->dev, "%zu bytes nvram\n", ds1307->nvram->size); |
973 | } | 973 | } |
974 | 974 | ||
975 | return 0; | 975 | return 0; |
976 | 976 | ||
977 | err_irq: | ||
978 | free_irq(client->irq, client); | ||
977 | exit: | 979 | exit: |
978 | return err; | 980 | return err; |
979 | } | 981 | } |
diff --git a/drivers/rtc/rtc-ds2404.c b/drivers/rtc/rtc-ds2404.c index 2ca5a23aba8a..fc209dc4e245 100644 --- a/drivers/rtc/rtc-ds2404.c +++ b/drivers/rtc/rtc-ds2404.c | |||
@@ -224,7 +224,7 @@ static const struct rtc_class_ops ds2404_rtc_ops = { | |||
224 | 224 | ||
225 | static int rtc_probe(struct platform_device *pdev) | 225 | static int rtc_probe(struct platform_device *pdev) |
226 | { | 226 | { |
227 | struct ds2404_platform_data *pdata = pdev->dev.platform_data; | 227 | struct ds2404_platform_data *pdata = dev_get_platdata(&pdev->dev); |
228 | struct ds2404 *chip; | 228 | struct ds2404 *chip; |
229 | int retval = -EBUSY; | 229 | int retval = -EBUSY; |
230 | 230 | ||
diff --git a/drivers/rtc/rtc-ep93xx.c b/drivers/rtc/rtc-ep93xx.c index 580e7b56bde8..5e4f5dc40ba5 100644 --- a/drivers/rtc/rtc-ep93xx.c +++ b/drivers/rtc/rtc-ep93xx.c | |||
@@ -42,7 +42,7 @@ struct ep93xx_rtc { | |||
42 | static int ep93xx_rtc_get_swcomp(struct device *dev, unsigned short *preload, | 42 | static int ep93xx_rtc_get_swcomp(struct device *dev, unsigned short *preload, |
43 | unsigned short *delete) | 43 | unsigned short *delete) |
44 | { | 44 | { |
45 | struct ep93xx_rtc *ep93xx_rtc = dev->platform_data; | 45 | struct ep93xx_rtc *ep93xx_rtc = dev_get_platdata(dev); |
46 | unsigned long comp; | 46 | unsigned long comp; |
47 | 47 | ||
48 | comp = __raw_readl(ep93xx_rtc->mmio_base + EP93XX_RTC_SWCOMP); | 48 | comp = __raw_readl(ep93xx_rtc->mmio_base + EP93XX_RTC_SWCOMP); |
@@ -60,7 +60,7 @@ static int ep93xx_rtc_get_swcomp(struct device *dev, unsigned short *preload, | |||
60 | 60 | ||
61 | static int ep93xx_rtc_read_time(struct device *dev, struct rtc_time *tm) | 61 | static int ep93xx_rtc_read_time(struct device *dev, struct rtc_time *tm) |
62 | { | 62 | { |
63 | struct ep93xx_rtc *ep93xx_rtc = dev->platform_data; | 63 | struct ep93xx_rtc *ep93xx_rtc = dev_get_platdata(dev); |
64 | unsigned long time; | 64 | unsigned long time; |
65 | 65 | ||
66 | time = __raw_readl(ep93xx_rtc->mmio_base + EP93XX_RTC_DATA); | 66 | time = __raw_readl(ep93xx_rtc->mmio_base + EP93XX_RTC_DATA); |
@@ -71,7 +71,7 @@ static int ep93xx_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
71 | 71 | ||
72 | static int ep93xx_rtc_set_mmss(struct device *dev, unsigned long secs) | 72 | static int ep93xx_rtc_set_mmss(struct device *dev, unsigned long secs) |
73 | { | 73 | { |
74 | struct ep93xx_rtc *ep93xx_rtc = dev->platform_data; | 74 | struct ep93xx_rtc *ep93xx_rtc = dev_get_platdata(dev); |
75 | 75 | ||
76 | __raw_writel(secs + 1, ep93xx_rtc->mmio_base + EP93XX_RTC_LOAD); | 76 | __raw_writel(secs + 1, ep93xx_rtc->mmio_base + EP93XX_RTC_LOAD); |
77 | return 0; | 77 | return 0; |
diff --git a/drivers/rtc/rtc-hid-sensor-time.c b/drivers/rtc/rtc-hid-sensor-time.c index 4e2a81854f51..965a9da70867 100644 --- a/drivers/rtc/rtc-hid-sensor-time.c +++ b/drivers/rtc/rtc-hid-sensor-time.c | |||
@@ -209,7 +209,7 @@ static int hid_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
209 | platform_get_drvdata(to_platform_device(dev)); | 209 | platform_get_drvdata(to_platform_device(dev)); |
210 | int ret; | 210 | int ret; |
211 | 211 | ||
212 | INIT_COMPLETION(time_state->comp_last_time); | 212 | reinit_completion(&time_state->comp_last_time); |
213 | /* get a report with all values through requesting one value */ | 213 | /* get a report with all values through requesting one value */ |
214 | sensor_hub_input_attr_get_raw_value(time_state->common_attributes.hsdev, | 214 | sensor_hub_input_attr_get_raw_value(time_state->common_attributes.hsdev, |
215 | HID_USAGE_SENSOR_TIME, hid_time_addresses[0], | 215 | HID_USAGE_SENSOR_TIME, hid_time_addresses[0], |
@@ -236,7 +236,7 @@ static const struct rtc_class_ops hid_time_rtc_ops = { | |||
236 | static int hid_time_probe(struct platform_device *pdev) | 236 | static int hid_time_probe(struct platform_device *pdev) |
237 | { | 237 | { |
238 | int ret = 0; | 238 | int ret = 0; |
239 | struct hid_sensor_hub_device *hsdev = pdev->dev.platform_data; | 239 | struct hid_sensor_hub_device *hsdev = dev_get_platdata(&pdev->dev); |
240 | struct hid_time_state *time_state = devm_kzalloc(&pdev->dev, | 240 | struct hid_time_state *time_state = devm_kzalloc(&pdev->dev, |
241 | sizeof(struct hid_time_state), GFP_KERNEL); | 241 | sizeof(struct hid_time_state), GFP_KERNEL); |
242 | 242 | ||
@@ -275,24 +275,44 @@ static int hid_time_probe(struct platform_device *pdev) | |||
275 | return ret; | 275 | return ret; |
276 | } | 276 | } |
277 | 277 | ||
278 | ret = sensor_hub_device_open(hsdev); | ||
279 | if (ret) { | ||
280 | dev_err(&pdev->dev, "failed to open sensor hub device!\n"); | ||
281 | goto err_open; | ||
282 | } | ||
283 | |||
284 | /* | ||
285 | * Enable HID input processing early in order to be able to read the | ||
286 | * clock already in devm_rtc_device_register(). | ||
287 | */ | ||
288 | hid_device_io_start(hsdev->hdev); | ||
289 | |||
278 | time_state->rtc = devm_rtc_device_register(&pdev->dev, | 290 | time_state->rtc = devm_rtc_device_register(&pdev->dev, |
279 | "hid-sensor-time", &hid_time_rtc_ops, | 291 | "hid-sensor-time", &hid_time_rtc_ops, |
280 | THIS_MODULE); | 292 | THIS_MODULE); |
281 | 293 | ||
282 | if (IS_ERR_OR_NULL(time_state->rtc)) { | 294 | if (IS_ERR_OR_NULL(time_state->rtc)) { |
295 | hid_device_io_stop(hsdev->hdev); | ||
283 | ret = time_state->rtc ? PTR_ERR(time_state->rtc) : -ENODEV; | 296 | ret = time_state->rtc ? PTR_ERR(time_state->rtc) : -ENODEV; |
284 | time_state->rtc = NULL; | 297 | time_state->rtc = NULL; |
285 | sensor_hub_remove_callback(hsdev, HID_USAGE_SENSOR_TIME); | ||
286 | dev_err(&pdev->dev, "rtc device register failed!\n"); | 298 | dev_err(&pdev->dev, "rtc device register failed!\n"); |
299 | goto err_rtc; | ||
287 | } | 300 | } |
288 | 301 | ||
289 | return ret; | 302 | return ret; |
303 | |||
304 | err_rtc: | ||
305 | sensor_hub_device_close(hsdev); | ||
306 | err_open: | ||
307 | sensor_hub_remove_callback(hsdev, HID_USAGE_SENSOR_TIME); | ||
308 | return ret; | ||
290 | } | 309 | } |
291 | 310 | ||
292 | static int hid_time_remove(struct platform_device *pdev) | 311 | static int hid_time_remove(struct platform_device *pdev) |
293 | { | 312 | { |
294 | struct hid_sensor_hub_device *hsdev = pdev->dev.platform_data; | 313 | struct hid_sensor_hub_device *hsdev = dev_get_platdata(&pdev->dev); |
295 | 314 | ||
315 | sensor_hub_device_close(hsdev); | ||
296 | sensor_hub_remove_callback(hsdev, HID_USAGE_SENSOR_TIME); | 316 | sensor_hub_remove_callback(hsdev, HID_USAGE_SENSOR_TIME); |
297 | 317 | ||
298 | return 0; | 318 | return 0; |
diff --git a/drivers/rtc/rtc-isl1208.c b/drivers/rtc/rtc-isl1208.c index c016ad81767a..c3c549d511b9 100644 --- a/drivers/rtc/rtc-isl1208.c +++ b/drivers/rtc/rtc-isl1208.c | |||
@@ -144,11 +144,7 @@ isl1208_i2c_validate_client(struct i2c_client *client) | |||
144 | static int | 144 | static int |
145 | isl1208_i2c_get_sr(struct i2c_client *client) | 145 | isl1208_i2c_get_sr(struct i2c_client *client) |
146 | { | 146 | { |
147 | int sr = i2c_smbus_read_byte_data(client, ISL1208_REG_SR); | 147 | return i2c_smbus_read_byte_data(client, ISL1208_REG_SR); |
148 | if (sr < 0) | ||
149 | return -EIO; | ||
150 | |||
151 | return sr; | ||
152 | } | 148 | } |
153 | 149 | ||
154 | static int | 150 | static int |
@@ -647,10 +643,11 @@ isl1208_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
647 | "chip found, driver version " DRV_VERSION "\n"); | 643 | "chip found, driver version " DRV_VERSION "\n"); |
648 | 644 | ||
649 | if (client->irq > 0) { | 645 | if (client->irq > 0) { |
650 | rc = request_threaded_irq(client->irq, NULL, | 646 | rc = devm_request_threaded_irq(&client->dev, client->irq, NULL, |
651 | isl1208_rtc_interrupt, | 647 | isl1208_rtc_interrupt, |
652 | IRQF_SHARED, | 648 | IRQF_SHARED, |
653 | isl1208_driver.driver.name, client); | 649 | isl1208_driver.driver.name, |
650 | client); | ||
654 | if (!rc) { | 651 | if (!rc) { |
655 | device_init_wakeup(&client->dev, 1); | 652 | device_init_wakeup(&client->dev, 1); |
656 | enable_irq_wake(client->irq); | 653 | enable_irq_wake(client->irq); |
@@ -662,20 +659,18 @@ isl1208_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
662 | } | 659 | } |
663 | } | 660 | } |
664 | 661 | ||
665 | rtc = rtc_device_register(isl1208_driver.driver.name, | 662 | rtc = devm_rtc_device_register(&client->dev, isl1208_driver.driver.name, |
666 | &client->dev, &isl1208_rtc_ops, | 663 | &isl1208_rtc_ops, |
667 | THIS_MODULE); | 664 | THIS_MODULE); |
668 | if (IS_ERR(rtc)) { | 665 | if (IS_ERR(rtc)) |
669 | rc = PTR_ERR(rtc); | 666 | return PTR_ERR(rtc); |
670 | goto exit_free_irq; | ||
671 | } | ||
672 | 667 | ||
673 | i2c_set_clientdata(client, rtc); | 668 | i2c_set_clientdata(client, rtc); |
674 | 669 | ||
675 | rc = isl1208_i2c_get_sr(client); | 670 | rc = isl1208_i2c_get_sr(client); |
676 | if (rc < 0) { | 671 | if (rc < 0) { |
677 | dev_err(&client->dev, "reading status failed\n"); | 672 | dev_err(&client->dev, "reading status failed\n"); |
678 | goto exit_unregister; | 673 | return rc; |
679 | } | 674 | } |
680 | 675 | ||
681 | if (rc & ISL1208_REG_SR_RTCF) | 676 | if (rc & ISL1208_REG_SR_RTCF) |
@@ -684,28 +679,15 @@ isl1208_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
684 | 679 | ||
685 | rc = sysfs_create_group(&client->dev.kobj, &isl1208_rtc_sysfs_files); | 680 | rc = sysfs_create_group(&client->dev.kobj, &isl1208_rtc_sysfs_files); |
686 | if (rc) | 681 | if (rc) |
687 | goto exit_unregister; | 682 | return rc; |
688 | 683 | ||
689 | return 0; | 684 | return 0; |
690 | |||
691 | exit_unregister: | ||
692 | rtc_device_unregister(rtc); | ||
693 | exit_free_irq: | ||
694 | if (client->irq) | ||
695 | free_irq(client->irq, client); | ||
696 | |||
697 | return rc; | ||
698 | } | 685 | } |
699 | 686 | ||
700 | static int | 687 | static int |
701 | isl1208_remove(struct i2c_client *client) | 688 | isl1208_remove(struct i2c_client *client) |
702 | { | 689 | { |
703 | struct rtc_device *rtc = i2c_get_clientdata(client); | ||
704 | |||
705 | sysfs_remove_group(&client->dev.kobj, &isl1208_rtc_sysfs_files); | 690 | sysfs_remove_group(&client->dev.kobj, &isl1208_rtc_sysfs_files); |
706 | rtc_device_unregister(rtc); | ||
707 | if (client->irq) | ||
708 | free_irq(client->irq, client); | ||
709 | 691 | ||
710 | return 0; | 692 | return 0; |
711 | } | 693 | } |
diff --git a/drivers/rtc/rtc-m48t59.c b/drivers/rtc/rtc-m48t59.c index fcb03291f145..11880c1e9dac 100644 --- a/drivers/rtc/rtc-m48t59.c +++ b/drivers/rtc/rtc-m48t59.c | |||
@@ -68,7 +68,7 @@ m48t59_mem_readb(struct device *dev, u32 ofs) | |||
68 | static int m48t59_rtc_read_time(struct device *dev, struct rtc_time *tm) | 68 | static int m48t59_rtc_read_time(struct device *dev, struct rtc_time *tm) |
69 | { | 69 | { |
70 | struct platform_device *pdev = to_platform_device(dev); | 70 | struct platform_device *pdev = to_platform_device(dev); |
71 | struct m48t59_plat_data *pdata = pdev->dev.platform_data; | 71 | struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); |
72 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); | 72 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); |
73 | unsigned long flags; | 73 | unsigned long flags; |
74 | u8 val; | 74 | u8 val; |
@@ -111,7 +111,7 @@ static int m48t59_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
111 | static int m48t59_rtc_set_time(struct device *dev, struct rtc_time *tm) | 111 | static int m48t59_rtc_set_time(struct device *dev, struct rtc_time *tm) |
112 | { | 112 | { |
113 | struct platform_device *pdev = to_platform_device(dev); | 113 | struct platform_device *pdev = to_platform_device(dev); |
114 | struct m48t59_plat_data *pdata = pdev->dev.platform_data; | 114 | struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); |
115 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); | 115 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); |
116 | unsigned long flags; | 116 | unsigned long flags; |
117 | u8 val = 0; | 117 | u8 val = 0; |
@@ -158,7 +158,7 @@ static int m48t59_rtc_set_time(struct device *dev, struct rtc_time *tm) | |||
158 | static int m48t59_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm) | 158 | static int m48t59_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm) |
159 | { | 159 | { |
160 | struct platform_device *pdev = to_platform_device(dev); | 160 | struct platform_device *pdev = to_platform_device(dev); |
161 | struct m48t59_plat_data *pdata = pdev->dev.platform_data; | 161 | struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); |
162 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); | 162 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); |
163 | struct rtc_time *tm = &alrm->time; | 163 | struct rtc_time *tm = &alrm->time; |
164 | unsigned long flags; | 164 | unsigned long flags; |
@@ -205,7 +205,7 @@ static int m48t59_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
205 | static int m48t59_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) | 205 | static int m48t59_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) |
206 | { | 206 | { |
207 | struct platform_device *pdev = to_platform_device(dev); | 207 | struct platform_device *pdev = to_platform_device(dev); |
208 | struct m48t59_plat_data *pdata = pdev->dev.platform_data; | 208 | struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); |
209 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); | 209 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); |
210 | struct rtc_time *tm = &alrm->time; | 210 | struct rtc_time *tm = &alrm->time; |
211 | u8 mday, hour, min, sec; | 211 | u8 mday, hour, min, sec; |
@@ -266,7 +266,7 @@ static int m48t59_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
266 | static int m48t59_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) | 266 | static int m48t59_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) |
267 | { | 267 | { |
268 | struct platform_device *pdev = to_platform_device(dev); | 268 | struct platform_device *pdev = to_platform_device(dev); |
269 | struct m48t59_plat_data *pdata = pdev->dev.platform_data; | 269 | struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); |
270 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); | 270 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); |
271 | unsigned long flags; | 271 | unsigned long flags; |
272 | 272 | ||
@@ -283,7 +283,7 @@ static int m48t59_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) | |||
283 | static int m48t59_rtc_proc(struct device *dev, struct seq_file *seq) | 283 | static int m48t59_rtc_proc(struct device *dev, struct seq_file *seq) |
284 | { | 284 | { |
285 | struct platform_device *pdev = to_platform_device(dev); | 285 | struct platform_device *pdev = to_platform_device(dev); |
286 | struct m48t59_plat_data *pdata = pdev->dev.platform_data; | 286 | struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); |
287 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); | 287 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); |
288 | unsigned long flags; | 288 | unsigned long flags; |
289 | u8 val; | 289 | u8 val; |
@@ -304,7 +304,7 @@ static irqreturn_t m48t59_rtc_interrupt(int irq, void *dev_id) | |||
304 | { | 304 | { |
305 | struct device *dev = (struct device *)dev_id; | 305 | struct device *dev = (struct device *)dev_id; |
306 | struct platform_device *pdev = to_platform_device(dev); | 306 | struct platform_device *pdev = to_platform_device(dev); |
307 | struct m48t59_plat_data *pdata = pdev->dev.platform_data; | 307 | struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); |
308 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); | 308 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); |
309 | u8 event; | 309 | u8 event; |
310 | 310 | ||
@@ -340,7 +340,7 @@ static ssize_t m48t59_nvram_read(struct file *filp, struct kobject *kobj, | |||
340 | { | 340 | { |
341 | struct device *dev = container_of(kobj, struct device, kobj); | 341 | struct device *dev = container_of(kobj, struct device, kobj); |
342 | struct platform_device *pdev = to_platform_device(dev); | 342 | struct platform_device *pdev = to_platform_device(dev); |
343 | struct m48t59_plat_data *pdata = pdev->dev.platform_data; | 343 | struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); |
344 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); | 344 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); |
345 | ssize_t cnt = 0; | 345 | ssize_t cnt = 0; |
346 | unsigned long flags; | 346 | unsigned long flags; |
@@ -360,7 +360,7 @@ static ssize_t m48t59_nvram_write(struct file *filp, struct kobject *kobj, | |||
360 | { | 360 | { |
361 | struct device *dev = container_of(kobj, struct device, kobj); | 361 | struct device *dev = container_of(kobj, struct device, kobj); |
362 | struct platform_device *pdev = to_platform_device(dev); | 362 | struct platform_device *pdev = to_platform_device(dev); |
363 | struct m48t59_plat_data *pdata = pdev->dev.platform_data; | 363 | struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); |
364 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); | 364 | struct m48t59_private *m48t59 = platform_get_drvdata(pdev); |
365 | ssize_t cnt = 0; | 365 | ssize_t cnt = 0; |
366 | unsigned long flags; | 366 | unsigned long flags; |
@@ -385,7 +385,7 @@ static struct bin_attribute m48t59_nvram_attr = { | |||
385 | 385 | ||
386 | static int m48t59_rtc_probe(struct platform_device *pdev) | 386 | static int m48t59_rtc_probe(struct platform_device *pdev) |
387 | { | 387 | { |
388 | struct m48t59_plat_data *pdata = pdev->dev.platform_data; | 388 | struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); |
389 | struct m48t59_private *m48t59 = NULL; | 389 | struct m48t59_private *m48t59 = NULL; |
390 | struct resource *res; | 390 | struct resource *res; |
391 | int ret = -ENOMEM; | 391 | int ret = -ENOMEM; |
diff --git a/drivers/rtc/rtc-m48t86.c b/drivers/rtc/rtc-m48t86.c index 2d30314fa07f..32f64c942621 100644 --- a/drivers/rtc/rtc-m48t86.c +++ b/drivers/rtc/rtc-m48t86.c | |||
@@ -46,7 +46,7 @@ static int m48t86_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
46 | { | 46 | { |
47 | unsigned char reg; | 47 | unsigned char reg; |
48 | struct platform_device *pdev = to_platform_device(dev); | 48 | struct platform_device *pdev = to_platform_device(dev); |
49 | struct m48t86_ops *ops = pdev->dev.platform_data; | 49 | struct m48t86_ops *ops = dev_get_platdata(&pdev->dev); |
50 | 50 | ||
51 | reg = ops->readbyte(M48T86_REG_B); | 51 | reg = ops->readbyte(M48T86_REG_B); |
52 | 52 | ||
@@ -84,7 +84,7 @@ static int m48t86_rtc_set_time(struct device *dev, struct rtc_time *tm) | |||
84 | { | 84 | { |
85 | unsigned char reg; | 85 | unsigned char reg; |
86 | struct platform_device *pdev = to_platform_device(dev); | 86 | struct platform_device *pdev = to_platform_device(dev); |
87 | struct m48t86_ops *ops = pdev->dev.platform_data; | 87 | struct m48t86_ops *ops = dev_get_platdata(&pdev->dev); |
88 | 88 | ||
89 | reg = ops->readbyte(M48T86_REG_B); | 89 | reg = ops->readbyte(M48T86_REG_B); |
90 | 90 | ||
@@ -123,7 +123,7 @@ static int m48t86_rtc_proc(struct device *dev, struct seq_file *seq) | |||
123 | { | 123 | { |
124 | unsigned char reg; | 124 | unsigned char reg; |
125 | struct platform_device *pdev = to_platform_device(dev); | 125 | struct platform_device *pdev = to_platform_device(dev); |
126 | struct m48t86_ops *ops = pdev->dev.platform_data; | 126 | struct m48t86_ops *ops = dev_get_platdata(&pdev->dev); |
127 | 127 | ||
128 | reg = ops->readbyte(M48T86_REG_B); | 128 | reg = ops->readbyte(M48T86_REG_B); |
129 | 129 | ||
@@ -147,7 +147,7 @@ static const struct rtc_class_ops m48t86_rtc_ops = { | |||
147 | static int m48t86_rtc_probe(struct platform_device *dev) | 147 | static int m48t86_rtc_probe(struct platform_device *dev) |
148 | { | 148 | { |
149 | unsigned char reg; | 149 | unsigned char reg; |
150 | struct m48t86_ops *ops = dev->dev.platform_data; | 150 | struct m48t86_ops *ops = dev_get_platdata(&dev->dev); |
151 | struct rtc_device *rtc; | 151 | struct rtc_device *rtc; |
152 | 152 | ||
153 | rtc = devm_rtc_device_register(&dev->dev, "m48t86", | 153 | rtc = devm_rtc_device_register(&dev->dev, "m48t86", |
diff --git a/drivers/rtc/rtc-max6900.c b/drivers/rtc/rtc-max6900.c index 55969b1b771a..4804985b876e 100644 --- a/drivers/rtc/rtc-max6900.c +++ b/drivers/rtc/rtc-max6900.c | |||
@@ -164,14 +164,7 @@ static int max6900_i2c_read_time(struct i2c_client *client, struct rtc_time *tm) | |||
164 | 164 | ||
165 | static int max6900_i2c_clear_write_protect(struct i2c_client *client) | 165 | static int max6900_i2c_clear_write_protect(struct i2c_client *client) |
166 | { | 166 | { |
167 | int rc; | 167 | return i2c_smbus_write_byte_data(client, MAX6900_REG_CONTROL_WRITE, 0); |
168 | rc = i2c_smbus_write_byte_data(client, MAX6900_REG_CONTROL_WRITE, 0); | ||
169 | if (rc < 0) { | ||
170 | dev_err(&client->dev, "%s: control register write failed\n", | ||
171 | __func__); | ||
172 | return -EIO; | ||
173 | } | ||
174 | return 0; | ||
175 | } | 168 | } |
176 | 169 | ||
177 | static int | 170 | static int |
diff --git a/drivers/rtc/rtc-mpc5121.c b/drivers/rtc/rtc-mpc5121.c index 9c8f60903799..dc4f14255cc3 100644 --- a/drivers/rtc/rtc-mpc5121.c +++ b/drivers/rtc/rtc-mpc5121.c | |||
@@ -14,7 +14,9 @@ | |||
14 | #include <linux/module.h> | 14 | #include <linux/module.h> |
15 | #include <linux/rtc.h> | 15 | #include <linux/rtc.h> |
16 | #include <linux/of.h> | 16 | #include <linux/of.h> |
17 | #include <linux/of_address.h> | ||
17 | #include <linux/of_device.h> | 18 | #include <linux/of_device.h> |
19 | #include <linux/of_irq.h> | ||
18 | #include <linux/of_platform.h> | 20 | #include <linux/of_platform.h> |
19 | #include <linux/io.h> | 21 | #include <linux/io.h> |
20 | #include <linux/slab.h> | 22 | #include <linux/slab.h> |
diff --git a/drivers/rtc/rtc-mrst.c b/drivers/rtc/rtc-mrst.c index 578baf9d9725..e2436d140175 100644 --- a/drivers/rtc/rtc-mrst.c +++ b/drivers/rtc/rtc-mrst.c | |||
@@ -38,8 +38,8 @@ | |||
38 | 38 | ||
39 | #include <asm-generic/rtc.h> | 39 | #include <asm-generic/rtc.h> |
40 | #include <asm/intel_scu_ipc.h> | 40 | #include <asm/intel_scu_ipc.h> |
41 | #include <asm/mrst.h> | 41 | #include <asm/intel-mid.h> |
42 | #include <asm/mrst-vrtc.h> | 42 | #include <asm/intel_mid_vrtc.h> |
43 | 43 | ||
44 | struct mrst_rtc { | 44 | struct mrst_rtc { |
45 | struct rtc_device *rtc; | 45 | struct rtc_device *rtc; |
@@ -380,7 +380,6 @@ static int vrtc_mrst_do_probe(struct device *dev, struct resource *iomem, | |||
380 | cleanup1: | 380 | cleanup1: |
381 | rtc_device_unregister(mrst_rtc.rtc); | 381 | rtc_device_unregister(mrst_rtc.rtc); |
382 | cleanup0: | 382 | cleanup0: |
383 | dev_set_drvdata(dev, NULL); | ||
384 | mrst_rtc.dev = NULL; | 383 | mrst_rtc.dev = NULL; |
385 | release_mem_region(iomem->start, resource_size(iomem)); | 384 | release_mem_region(iomem->start, resource_size(iomem)); |
386 | dev_err(dev, "rtc-mrst: unable to initialise\n"); | 385 | dev_err(dev, "rtc-mrst: unable to initialise\n"); |
@@ -412,7 +411,6 @@ static void rtc_mrst_do_remove(struct device *dev) | |||
412 | mrst->iomem = NULL; | 411 | mrst->iomem = NULL; |
413 | 412 | ||
414 | mrst->dev = NULL; | 413 | mrst->dev = NULL; |
415 | dev_set_drvdata(dev, NULL); | ||
416 | } | 414 | } |
417 | 415 | ||
418 | #ifdef CONFIG_PM | 416 | #ifdef CONFIG_PM |
diff --git a/drivers/rtc/rtc-omap.c b/drivers/rtc/rtc-omap.c index c7d97ee59327..26de5f8c2ae4 100644 --- a/drivers/rtc/rtc-omap.c +++ b/drivers/rtc/rtc-omap.c | |||
@@ -553,7 +553,7 @@ static struct platform_driver omap_rtc_driver = { | |||
553 | .name = DRIVER_NAME, | 553 | .name = DRIVER_NAME, |
554 | .owner = THIS_MODULE, | 554 | .owner = THIS_MODULE, |
555 | .pm = &omap_rtc_pm_ops, | 555 | .pm = &omap_rtc_pm_ops, |
556 | .of_match_table = of_match_ptr(omap_rtc_of_match), | 556 | .of_match_table = omap_rtc_of_match, |
557 | }, | 557 | }, |
558 | .id_table = omap_rtc_devtype, | 558 | .id_table = omap_rtc_devtype, |
559 | }; | 559 | }; |
diff --git a/drivers/rtc/rtc-pcf2123.c b/drivers/rtc/rtc-pcf2123.c index 1725b5090e33..d1953bb244c5 100644 --- a/drivers/rtc/rtc-pcf2123.c +++ b/drivers/rtc/rtc-pcf2123.c | |||
@@ -327,7 +327,7 @@ kfree_exit: | |||
327 | 327 | ||
328 | static int pcf2123_remove(struct spi_device *spi) | 328 | static int pcf2123_remove(struct spi_device *spi) |
329 | { | 329 | { |
330 | struct pcf2123_plat_data *pdata = spi->dev.platform_data; | 330 | struct pcf2123_plat_data *pdata = dev_get_platdata(&spi->dev); |
331 | int i; | 331 | int i; |
332 | 332 | ||
333 | if (pdata) { | 333 | if (pdata) { |
diff --git a/drivers/rtc/rtc-pl030.c b/drivers/rtc/rtc-pl030.c index 22bacdbf9139..f85a1a93e669 100644 --- a/drivers/rtc/rtc-pl030.c +++ b/drivers/rtc/rtc-pl030.c | |||
@@ -106,7 +106,7 @@ static int pl030_probe(struct amba_device *dev, const struct amba_id *id) | |||
106 | if (ret) | 106 | if (ret) |
107 | goto err_req; | 107 | goto err_req; |
108 | 108 | ||
109 | rtc = kmalloc(sizeof(*rtc), GFP_KERNEL); | 109 | rtc = devm_kzalloc(&dev->dev, sizeof(*rtc), GFP_KERNEL); |
110 | if (!rtc) { | 110 | if (!rtc) { |
111 | ret = -ENOMEM; | 111 | ret = -ENOMEM; |
112 | goto err_rtc; | 112 | goto err_rtc; |
@@ -115,7 +115,7 @@ static int pl030_probe(struct amba_device *dev, const struct amba_id *id) | |||
115 | rtc->base = ioremap(dev->res.start, resource_size(&dev->res)); | 115 | rtc->base = ioremap(dev->res.start, resource_size(&dev->res)); |
116 | if (!rtc->base) { | 116 | if (!rtc->base) { |
117 | ret = -ENOMEM; | 117 | ret = -ENOMEM; |
118 | goto err_map; | 118 | goto err_rtc; |
119 | } | 119 | } |
120 | 120 | ||
121 | __raw_writel(0, rtc->base + RTC_CR); | 121 | __raw_writel(0, rtc->base + RTC_CR); |
@@ -141,8 +141,6 @@ static int pl030_probe(struct amba_device *dev, const struct amba_id *id) | |||
141 | free_irq(dev->irq[0], rtc); | 141 | free_irq(dev->irq[0], rtc); |
142 | err_irq: | 142 | err_irq: |
143 | iounmap(rtc->base); | 143 | iounmap(rtc->base); |
144 | err_map: | ||
145 | kfree(rtc); | ||
146 | err_rtc: | 144 | err_rtc: |
147 | amba_release_regions(dev); | 145 | amba_release_regions(dev); |
148 | err_req: | 146 | err_req: |
@@ -153,14 +151,11 @@ static int pl030_remove(struct amba_device *dev) | |||
153 | { | 151 | { |
154 | struct pl030_rtc *rtc = amba_get_drvdata(dev); | 152 | struct pl030_rtc *rtc = amba_get_drvdata(dev); |
155 | 153 | ||
156 | amba_set_drvdata(dev, NULL); | ||
157 | |||
158 | writel(0, rtc->base + RTC_CR); | 154 | writel(0, rtc->base + RTC_CR); |
159 | 155 | ||
160 | free_irq(dev->irq[0], rtc); | 156 | free_irq(dev->irq[0], rtc); |
161 | rtc_device_unregister(rtc->rtc); | 157 | rtc_device_unregister(rtc->rtc); |
162 | iounmap(rtc->base); | 158 | iounmap(rtc->base); |
163 | kfree(rtc); | ||
164 | amba_release_regions(dev); | 159 | amba_release_regions(dev); |
165 | 160 | ||
166 | return 0; | 161 | return 0; |
diff --git a/drivers/rtc/rtc-pl031.c b/drivers/rtc/rtc-pl031.c index 0f0609b1aa2c..99181fff88fd 100644 --- a/drivers/rtc/rtc-pl031.c +++ b/drivers/rtc/rtc-pl031.c | |||
@@ -305,7 +305,6 @@ static int pl031_remove(struct amba_device *adev) | |||
305 | { | 305 | { |
306 | struct pl031_local *ldata = dev_get_drvdata(&adev->dev); | 306 | struct pl031_local *ldata = dev_get_drvdata(&adev->dev); |
307 | 307 | ||
308 | amba_set_drvdata(adev, NULL); | ||
309 | free_irq(adev->irq[0], ldata); | 308 | free_irq(adev->irq[0], ldata); |
310 | rtc_device_unregister(ldata->rtc); | 309 | rtc_device_unregister(ldata->rtc); |
311 | iounmap(ldata->base); | 310 | iounmap(ldata->base); |
@@ -371,6 +370,7 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id) | |||
371 | } | 370 | } |
372 | } | 371 | } |
373 | 372 | ||
373 | device_init_wakeup(&adev->dev, 1); | ||
374 | ldata->rtc = rtc_device_register("pl031", &adev->dev, ops, | 374 | ldata->rtc = rtc_device_register("pl031", &adev->dev, ops, |
375 | THIS_MODULE); | 375 | THIS_MODULE); |
376 | if (IS_ERR(ldata->rtc)) { | 376 | if (IS_ERR(ldata->rtc)) { |
@@ -384,15 +384,12 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id) | |||
384 | goto out_no_irq; | 384 | goto out_no_irq; |
385 | } | 385 | } |
386 | 386 | ||
387 | device_init_wakeup(&adev->dev, 1); | ||
388 | |||
389 | return 0; | 387 | return 0; |
390 | 388 | ||
391 | out_no_irq: | 389 | out_no_irq: |
392 | rtc_device_unregister(ldata->rtc); | 390 | rtc_device_unregister(ldata->rtc); |
393 | out_no_rtc: | 391 | out_no_rtc: |
394 | iounmap(ldata->base); | 392 | iounmap(ldata->base); |
395 | amba_set_drvdata(adev, NULL); | ||
396 | out_no_remap: | 393 | out_no_remap: |
397 | kfree(ldata); | 394 | kfree(ldata); |
398 | out: | 395 | out: |
diff --git a/drivers/rtc/rtc-puv3.c b/drivers/rtc/rtc-puv3.c index 402732cfb32a..1ecfe3bd92ac 100644 --- a/drivers/rtc/rtc-puv3.c +++ b/drivers/rtc/rtc-puv3.c | |||
@@ -53,11 +53,11 @@ static irqreturn_t puv3_rtc_tickirq(int irq, void *id) | |||
53 | } | 53 | } |
54 | 54 | ||
55 | /* Update control registers */ | 55 | /* Update control registers */ |
56 | static void puv3_rtc_setaie(int to) | 56 | static void puv3_rtc_setaie(struct device *dev, int to) |
57 | { | 57 | { |
58 | unsigned int tmp; | 58 | unsigned int tmp; |
59 | 59 | ||
60 | pr_debug("%s: aie=%d\n", __func__, to); | 60 | dev_dbg(dev, "%s: aie=%d\n", __func__, to); |
61 | 61 | ||
62 | tmp = readl(RTC_RTSR) & ~RTC_RTSR_ALE; | 62 | tmp = readl(RTC_RTSR) & ~RTC_RTSR_ALE; |
63 | 63 | ||
@@ -71,7 +71,7 @@ static int puv3_rtc_setpie(struct device *dev, int enabled) | |||
71 | { | 71 | { |
72 | unsigned int tmp; | 72 | unsigned int tmp; |
73 | 73 | ||
74 | pr_debug("%s: pie=%d\n", __func__, enabled); | 74 | dev_debug(dev, "%s: pie=%d\n", __func__, enabled); |
75 | 75 | ||
76 | spin_lock_irq(&puv3_rtc_pie_lock); | 76 | spin_lock_irq(&puv3_rtc_pie_lock); |
77 | tmp = readl(RTC_RTSR) & ~RTC_RTSR_HZE; | 77 | tmp = readl(RTC_RTSR) & ~RTC_RTSR_HZE; |
@@ -90,7 +90,7 @@ static int puv3_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm) | |||
90 | { | 90 | { |
91 | rtc_time_to_tm(readl(RTC_RCNR), rtc_tm); | 91 | rtc_time_to_tm(readl(RTC_RCNR), rtc_tm); |
92 | 92 | ||
93 | pr_debug("read time %02x.%02x.%02x %02x/%02x/%02x\n", | 93 | dev_dbg(dev, "read time %02x.%02x.%02x %02x/%02x/%02x\n", |
94 | rtc_tm->tm_year, rtc_tm->tm_mon, rtc_tm->tm_mday, | 94 | rtc_tm->tm_year, rtc_tm->tm_mon, rtc_tm->tm_mday, |
95 | rtc_tm->tm_hour, rtc_tm->tm_min, rtc_tm->tm_sec); | 95 | rtc_tm->tm_hour, rtc_tm->tm_min, rtc_tm->tm_sec); |
96 | 96 | ||
@@ -101,7 +101,7 @@ static int puv3_rtc_settime(struct device *dev, struct rtc_time *tm) | |||
101 | { | 101 | { |
102 | unsigned long rtc_count = 0; | 102 | unsigned long rtc_count = 0; |
103 | 103 | ||
104 | pr_debug("set time %02d.%02d.%02d %02d/%02d/%02d\n", | 104 | dev_dbg(dev, "set time %02d.%02d.%02d %02d/%02d/%02d\n", |
105 | tm->tm_year, tm->tm_mon, tm->tm_mday, | 105 | tm->tm_year, tm->tm_mon, tm->tm_mday, |
106 | tm->tm_hour, tm->tm_min, tm->tm_sec); | 106 | tm->tm_hour, tm->tm_min, tm->tm_sec); |
107 | 107 | ||
@@ -119,7 +119,7 @@ static int puv3_rtc_getalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
119 | 119 | ||
120 | alrm->enabled = readl(RTC_RTSR) & RTC_RTSR_ALE; | 120 | alrm->enabled = readl(RTC_RTSR) & RTC_RTSR_ALE; |
121 | 121 | ||
122 | pr_debug("read alarm %02x %02x.%02x.%02x %02x/%02x/%02x\n", | 122 | dev_dbg(dev, "read alarm %02x %02x.%02x.%02x %02x/%02x/%02x\n", |
123 | alrm->enabled, | 123 | alrm->enabled, |
124 | alm_tm->tm_year, alm_tm->tm_mon, alm_tm->tm_mday, | 124 | alm_tm->tm_year, alm_tm->tm_mon, alm_tm->tm_mday, |
125 | alm_tm->tm_hour, alm_tm->tm_min, alm_tm->tm_sec); | 125 | alm_tm->tm_hour, alm_tm->tm_min, alm_tm->tm_sec); |
@@ -132,7 +132,7 @@ static int puv3_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
132 | struct rtc_time *tm = &alrm->time; | 132 | struct rtc_time *tm = &alrm->time; |
133 | unsigned long rtcalarm_count = 0; | 133 | unsigned long rtcalarm_count = 0; |
134 | 134 | ||
135 | pr_debug("puv3_rtc_setalarm: %d, %02x/%02x/%02x %02x.%02x.%02x\n", | 135 | dev_dbg(dev, "puv3_rtc_setalarm: %d, %02x/%02x/%02x %02x.%02x.%02x\n", |
136 | alrm->enabled, | 136 | alrm->enabled, |
137 | tm->tm_mday & 0xff, tm->tm_mon & 0xff, tm->tm_year & 0xff, | 137 | tm->tm_mday & 0xff, tm->tm_mon & 0xff, tm->tm_year & 0xff, |
138 | tm->tm_hour & 0xff, tm->tm_min & 0xff, tm->tm_sec); | 138 | tm->tm_hour & 0xff, tm->tm_min & 0xff, tm->tm_sec); |
@@ -140,7 +140,7 @@ static int puv3_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
140 | rtc_tm_to_time(tm, &rtcalarm_count); | 140 | rtc_tm_to_time(tm, &rtcalarm_count); |
141 | writel(rtcalarm_count, RTC_RTAR); | 141 | writel(rtcalarm_count, RTC_RTAR); |
142 | 142 | ||
143 | puv3_rtc_setaie(alrm->enabled); | 143 | puv3_rtc_setaie(&dev->dev, alrm->enabled); |
144 | 144 | ||
145 | if (alrm->enabled) | 145 | if (alrm->enabled) |
146 | enable_irq_wake(puv3_rtc_alarmno); | 146 | enable_irq_wake(puv3_rtc_alarmno); |
@@ -227,7 +227,7 @@ static int puv3_rtc_remove(struct platform_device *dev) | |||
227 | rtc_device_unregister(rtc); | 227 | rtc_device_unregister(rtc); |
228 | 228 | ||
229 | puv3_rtc_setpie(&dev->dev, 0); | 229 | puv3_rtc_setpie(&dev->dev, 0); |
230 | puv3_rtc_setaie(0); | 230 | puv3_rtc_setaie(&dev->dev, 0); |
231 | 231 | ||
232 | release_resource(puv3_rtc_mem); | 232 | release_resource(puv3_rtc_mem); |
233 | kfree(puv3_rtc_mem); | 233 | kfree(puv3_rtc_mem); |
@@ -241,7 +241,7 @@ static int puv3_rtc_probe(struct platform_device *pdev) | |||
241 | struct resource *res; | 241 | struct resource *res; |
242 | int ret; | 242 | int ret; |
243 | 243 | ||
244 | pr_debug("%s: probe=%p\n", __func__, pdev); | 244 | dev_dbg(&pdev->dev, "%s: probe=%p\n", __func__, pdev); |
245 | 245 | ||
246 | /* find the IRQs */ | 246 | /* find the IRQs */ |
247 | puv3_rtc_tickno = platform_get_irq(pdev, 1); | 247 | puv3_rtc_tickno = platform_get_irq(pdev, 1); |
@@ -256,7 +256,7 @@ static int puv3_rtc_probe(struct platform_device *pdev) | |||
256 | return -ENOENT; | 256 | return -ENOENT; |
257 | } | 257 | } |
258 | 258 | ||
259 | pr_debug("PKUnity_rtc: tick irq %d, alarm irq %d\n", | 259 | dev_dbg(&pdev->dev, "PKUnity_rtc: tick irq %d, alarm irq %d\n", |
260 | puv3_rtc_tickno, puv3_rtc_alarmno); | 260 | puv3_rtc_tickno, puv3_rtc_alarmno); |
261 | 261 | ||
262 | /* get the memory region */ | 262 | /* get the memory region */ |
diff --git a/drivers/rtc/rtc-rs5c348.c b/drivers/rtc/rtc-rs5c348.c index f7a90a116a39..090a101c1c81 100644 --- a/drivers/rtc/rtc-rs5c348.c +++ b/drivers/rtc/rtc-rs5c348.c | |||
@@ -64,7 +64,7 @@ static int | |||
64 | rs5c348_rtc_set_time(struct device *dev, struct rtc_time *tm) | 64 | rs5c348_rtc_set_time(struct device *dev, struct rtc_time *tm) |
65 | { | 65 | { |
66 | struct spi_device *spi = to_spi_device(dev); | 66 | struct spi_device *spi = to_spi_device(dev); |
67 | struct rs5c348_plat_data *pdata = spi->dev.platform_data; | 67 | struct rs5c348_plat_data *pdata = dev_get_platdata(&spi->dev); |
68 | u8 txbuf[5+7], *txp; | 68 | u8 txbuf[5+7], *txp; |
69 | int ret; | 69 | int ret; |
70 | 70 | ||
@@ -100,7 +100,7 @@ static int | |||
100 | rs5c348_rtc_read_time(struct device *dev, struct rtc_time *tm) | 100 | rs5c348_rtc_read_time(struct device *dev, struct rtc_time *tm) |
101 | { | 101 | { |
102 | struct spi_device *spi = to_spi_device(dev); | 102 | struct spi_device *spi = to_spi_device(dev); |
103 | struct rs5c348_plat_data *pdata = spi->dev.platform_data; | 103 | struct rs5c348_plat_data *pdata = dev_get_platdata(&spi->dev); |
104 | u8 txbuf[5], rxbuf[7]; | 104 | u8 txbuf[5], rxbuf[7]; |
105 | int ret; | 105 | int ret; |
106 | 106 | ||
diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c new file mode 100644 index 000000000000..ae8119dc2846 --- /dev/null +++ b/drivers/rtc/rtc-s5m.c | |||
@@ -0,0 +1,687 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2013 Samsung Electronics Co., Ltd | ||
3 | * http://www.samsung.com | ||
4 | * | ||
5 | * Copyright (C) 2013 Google, Inc | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | */ | ||
17 | |||
18 | #include <linux/module.h> | ||
19 | #include <linux/i2c.h> | ||
20 | #include <linux/slab.h> | ||
21 | #include <linux/bcd.h> | ||
22 | #include <linux/bitops.h> | ||
23 | #include <linux/regmap.h> | ||
24 | #include <linux/rtc.h> | ||
25 | #include <linux/delay.h> | ||
26 | #include <linux/platform_device.h> | ||
27 | #include <linux/mfd/samsung/core.h> | ||
28 | #include <linux/mfd/samsung/irq.h> | ||
29 | #include <linux/mfd/samsung/rtc.h> | ||
30 | |||
31 | /* | ||
32 | * Maximum number of retries for checking changes in UDR field | ||
33 | * of SEC_RTC_UDR_CON register (to limit possible endless loop). | ||
34 | * | ||
35 | * After writing to RTC registers (setting time or alarm) read the UDR field | ||
36 | * in SEC_RTC_UDR_CON register. UDR is auto-cleared when data have | ||
37 | * been transferred. | ||
38 | */ | ||
39 | #define UDR_READ_RETRY_CNT 5 | ||
40 | |||
41 | struct s5m_rtc_info { | ||
42 | struct device *dev; | ||
43 | struct sec_pmic_dev *s5m87xx; | ||
44 | struct regmap *regmap; | ||
45 | struct rtc_device *rtc_dev; | ||
46 | int irq; | ||
47 | int device_type; | ||
48 | int rtc_24hr_mode; | ||
49 | bool wtsr_smpl; | ||
50 | }; | ||
51 | |||
52 | static void s5m8767_data_to_tm(u8 *data, struct rtc_time *tm, | ||
53 | int rtc_24hr_mode) | ||
54 | { | ||
55 | tm->tm_sec = data[RTC_SEC] & 0x7f; | ||
56 | tm->tm_min = data[RTC_MIN] & 0x7f; | ||
57 | if (rtc_24hr_mode) { | ||
58 | tm->tm_hour = data[RTC_HOUR] & 0x1f; | ||
59 | } else { | ||
60 | tm->tm_hour = data[RTC_HOUR] & 0x0f; | ||
61 | if (data[RTC_HOUR] & HOUR_PM_MASK) | ||
62 | tm->tm_hour += 12; | ||
63 | } | ||
64 | |||
65 | tm->tm_wday = ffs(data[RTC_WEEKDAY] & 0x7f); | ||
66 | tm->tm_mday = data[RTC_DATE] & 0x1f; | ||
67 | tm->tm_mon = (data[RTC_MONTH] & 0x0f) - 1; | ||
68 | tm->tm_year = (data[RTC_YEAR1] & 0x7f) + 100; | ||
69 | tm->tm_yday = 0; | ||
70 | tm->tm_isdst = 0; | ||
71 | } | ||
72 | |||
73 | static int s5m8767_tm_to_data(struct rtc_time *tm, u8 *data) | ||
74 | { | ||
75 | data[RTC_SEC] = tm->tm_sec; | ||
76 | data[RTC_MIN] = tm->tm_min; | ||
77 | |||
78 | if (tm->tm_hour >= 12) | ||
79 | data[RTC_HOUR] = tm->tm_hour | HOUR_PM_MASK; | ||
80 | else | ||
81 | data[RTC_HOUR] = tm->tm_hour & ~HOUR_PM_MASK; | ||
82 | |||
83 | data[RTC_WEEKDAY] = 1 << tm->tm_wday; | ||
84 | data[RTC_DATE] = tm->tm_mday; | ||
85 | data[RTC_MONTH] = tm->tm_mon + 1; | ||
86 | data[RTC_YEAR1] = tm->tm_year > 100 ? (tm->tm_year - 100) : 0; | ||
87 | |||
88 | if (tm->tm_year < 100) { | ||
89 | pr_err("s5m8767 RTC cannot handle the year %d.\n", | ||
90 | 1900 + tm->tm_year); | ||
91 | return -EINVAL; | ||
92 | } else { | ||
93 | return 0; | ||
94 | } | ||
95 | } | ||
96 | |||
97 | /* | ||
98 | * Read RTC_UDR_CON register and wait till UDR field is cleared. | ||
99 | * This indicates that time/alarm update ended. | ||
100 | */ | ||
101 | static inline int s5m8767_wait_for_udr_update(struct s5m_rtc_info *info) | ||
102 | { | ||
103 | int ret, retry = UDR_READ_RETRY_CNT; | ||
104 | unsigned int data; | ||
105 | |||
106 | do { | ||
107 | ret = regmap_read(info->regmap, SEC_RTC_UDR_CON, &data); | ||
108 | } while (--retry && (data & RTC_UDR_MASK) && !ret); | ||
109 | |||
110 | if (!retry) | ||
111 | dev_err(info->dev, "waiting for UDR update, reached max number of retries\n"); | ||
112 | |||
113 | return ret; | ||
114 | } | ||
115 | |||
116 | static inline int s5m8767_rtc_set_time_reg(struct s5m_rtc_info *info) | ||
117 | { | ||
118 | int ret; | ||
119 | unsigned int data; | ||
120 | |||
121 | ret = regmap_read(info->regmap, SEC_RTC_UDR_CON, &data); | ||
122 | if (ret < 0) { | ||
123 | dev_err(info->dev, "failed to read update reg(%d)\n", ret); | ||
124 | return ret; | ||
125 | } | ||
126 | |||
127 | data |= RTC_TIME_EN_MASK; | ||
128 | data |= RTC_UDR_MASK; | ||
129 | |||
130 | ret = regmap_write(info->regmap, SEC_RTC_UDR_CON, data); | ||
131 | if (ret < 0) { | ||
132 | dev_err(info->dev, "failed to write update reg(%d)\n", ret); | ||
133 | return ret; | ||
134 | } | ||
135 | |||
136 | ret = s5m8767_wait_for_udr_update(info); | ||
137 | |||
138 | return ret; | ||
139 | } | ||
140 | |||
141 | static inline int s5m8767_rtc_set_alarm_reg(struct s5m_rtc_info *info) | ||
142 | { | ||
143 | int ret; | ||
144 | unsigned int data; | ||
145 | |||
146 | ret = regmap_read(info->regmap, SEC_RTC_UDR_CON, &data); | ||
147 | if (ret < 0) { | ||
148 | dev_err(info->dev, "%s: fail to read update reg(%d)\n", | ||
149 | __func__, ret); | ||
150 | return ret; | ||
151 | } | ||
152 | |||
153 | data &= ~RTC_TIME_EN_MASK; | ||
154 | data |= RTC_UDR_MASK; | ||
155 | |||
156 | ret = regmap_write(info->regmap, SEC_RTC_UDR_CON, data); | ||
157 | if (ret < 0) { | ||
158 | dev_err(info->dev, "%s: fail to write update reg(%d)\n", | ||
159 | __func__, ret); | ||
160 | return ret; | ||
161 | } | ||
162 | |||
163 | ret = s5m8767_wait_for_udr_update(info); | ||
164 | |||
165 | return ret; | ||
166 | } | ||
167 | |||
168 | static void s5m8763_data_to_tm(u8 *data, struct rtc_time *tm) | ||
169 | { | ||
170 | tm->tm_sec = bcd2bin(data[RTC_SEC]); | ||
171 | tm->tm_min = bcd2bin(data[RTC_MIN]); | ||
172 | |||
173 | if (data[RTC_HOUR] & HOUR_12) { | ||
174 | tm->tm_hour = bcd2bin(data[RTC_HOUR] & 0x1f); | ||
175 | if (data[RTC_HOUR] & HOUR_PM) | ||
176 | tm->tm_hour += 12; | ||
177 | } else { | ||
178 | tm->tm_hour = bcd2bin(data[RTC_HOUR] & 0x3f); | ||
179 | } | ||
180 | |||
181 | tm->tm_wday = data[RTC_WEEKDAY] & 0x07; | ||
182 | tm->tm_mday = bcd2bin(data[RTC_DATE]); | ||
183 | tm->tm_mon = bcd2bin(data[RTC_MONTH]); | ||
184 | tm->tm_year = bcd2bin(data[RTC_YEAR1]) + bcd2bin(data[RTC_YEAR2]) * 100; | ||
185 | tm->tm_year -= 1900; | ||
186 | } | ||
187 | |||
188 | static void s5m8763_tm_to_data(struct rtc_time *tm, u8 *data) | ||
189 | { | ||
190 | data[RTC_SEC] = bin2bcd(tm->tm_sec); | ||
191 | data[RTC_MIN] = bin2bcd(tm->tm_min); | ||
192 | data[RTC_HOUR] = bin2bcd(tm->tm_hour); | ||
193 | data[RTC_WEEKDAY] = tm->tm_wday; | ||
194 | data[RTC_DATE] = bin2bcd(tm->tm_mday); | ||
195 | data[RTC_MONTH] = bin2bcd(tm->tm_mon); | ||
196 | data[RTC_YEAR1] = bin2bcd(tm->tm_year % 100); | ||
197 | data[RTC_YEAR2] = bin2bcd((tm->tm_year + 1900) / 100); | ||
198 | } | ||
199 | |||
200 | static int s5m_rtc_read_time(struct device *dev, struct rtc_time *tm) | ||
201 | { | ||
202 | struct s5m_rtc_info *info = dev_get_drvdata(dev); | ||
203 | u8 data[8]; | ||
204 | int ret; | ||
205 | |||
206 | ret = regmap_bulk_read(info->regmap, SEC_RTC_SEC, data, 8); | ||
207 | if (ret < 0) | ||
208 | return ret; | ||
209 | |||
210 | switch (info->device_type) { | ||
211 | case S5M8763X: | ||
212 | s5m8763_data_to_tm(data, tm); | ||
213 | break; | ||
214 | |||
215 | case S5M8767X: | ||
216 | s5m8767_data_to_tm(data, tm, info->rtc_24hr_mode); | ||
217 | break; | ||
218 | |||
219 | default: | ||
220 | return -EINVAL; | ||
221 | } | ||
222 | |||
223 | dev_dbg(dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__, | ||
224 | 1900 + tm->tm_year, 1 + tm->tm_mon, tm->tm_mday, | ||
225 | tm->tm_hour, tm->tm_min, tm->tm_sec, tm->tm_wday); | ||
226 | |||
227 | return rtc_valid_tm(tm); | ||
228 | } | ||
229 | |||
230 | static int s5m_rtc_set_time(struct device *dev, struct rtc_time *tm) | ||
231 | { | ||
232 | struct s5m_rtc_info *info = dev_get_drvdata(dev); | ||
233 | u8 data[8]; | ||
234 | int ret = 0; | ||
235 | |||
236 | switch (info->device_type) { | ||
237 | case S5M8763X: | ||
238 | s5m8763_tm_to_data(tm, data); | ||
239 | break; | ||
240 | case S5M8767X: | ||
241 | ret = s5m8767_tm_to_data(tm, data); | ||
242 | break; | ||
243 | default: | ||
244 | return -EINVAL; | ||
245 | } | ||
246 | |||
247 | if (ret < 0) | ||
248 | return ret; | ||
249 | |||
250 | dev_dbg(dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__, | ||
251 | 1900 + tm->tm_year, 1 + tm->tm_mon, tm->tm_mday, | ||
252 | tm->tm_hour, tm->tm_min, tm->tm_sec, tm->tm_wday); | ||
253 | |||
254 | ret = regmap_raw_write(info->regmap, SEC_RTC_SEC, data, 8); | ||
255 | if (ret < 0) | ||
256 | return ret; | ||
257 | |||
258 | ret = s5m8767_rtc_set_time_reg(info); | ||
259 | |||
260 | return ret; | ||
261 | } | ||
262 | |||
263 | static int s5m_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) | ||
264 | { | ||
265 | struct s5m_rtc_info *info = dev_get_drvdata(dev); | ||
266 | u8 data[8]; | ||
267 | unsigned int val; | ||
268 | int ret, i; | ||
269 | |||
270 | ret = regmap_bulk_read(info->regmap, SEC_ALARM0_SEC, data, 8); | ||
271 | if (ret < 0) | ||
272 | return ret; | ||
273 | |||
274 | switch (info->device_type) { | ||
275 | case S5M8763X: | ||
276 | s5m8763_data_to_tm(data, &alrm->time); | ||
277 | ret = regmap_read(info->regmap, SEC_ALARM0_CONF, &val); | ||
278 | if (ret < 0) | ||
279 | return ret; | ||
280 | |||
281 | alrm->enabled = !!val; | ||
282 | |||
283 | ret = regmap_read(info->regmap, SEC_RTC_STATUS, &val); | ||
284 | if (ret < 0) | ||
285 | return ret; | ||
286 | |||
287 | break; | ||
288 | |||
289 | case S5M8767X: | ||
290 | s5m8767_data_to_tm(data, &alrm->time, info->rtc_24hr_mode); | ||
291 | dev_dbg(dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__, | ||
292 | 1900 + alrm->time.tm_year, 1 + alrm->time.tm_mon, | ||
293 | alrm->time.tm_mday, alrm->time.tm_hour, | ||
294 | alrm->time.tm_min, alrm->time.tm_sec, | ||
295 | alrm->time.tm_wday); | ||
296 | |||
297 | alrm->enabled = 0; | ||
298 | for (i = 0; i < 7; i++) { | ||
299 | if (data[i] & ALARM_ENABLE_MASK) { | ||
300 | alrm->enabled = 1; | ||
301 | break; | ||
302 | } | ||
303 | } | ||
304 | |||
305 | alrm->pending = 0; | ||
306 | ret = regmap_read(info->regmap, SEC_RTC_STATUS, &val); | ||
307 | if (ret < 0) | ||
308 | return ret; | ||
309 | break; | ||
310 | |||
311 | default: | ||
312 | return -EINVAL; | ||
313 | } | ||
314 | |||
315 | if (val & ALARM0_STATUS) | ||
316 | alrm->pending = 1; | ||
317 | else | ||
318 | alrm->pending = 0; | ||
319 | |||
320 | return 0; | ||
321 | } | ||
322 | |||
323 | static int s5m_rtc_stop_alarm(struct s5m_rtc_info *info) | ||
324 | { | ||
325 | u8 data[8]; | ||
326 | int ret, i; | ||
327 | struct rtc_time tm; | ||
328 | |||
329 | ret = regmap_bulk_read(info->regmap, SEC_ALARM0_SEC, data, 8); | ||
330 | if (ret < 0) | ||
331 | return ret; | ||
332 | |||
333 | s5m8767_data_to_tm(data, &tm, info->rtc_24hr_mode); | ||
334 | dev_dbg(info->dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__, | ||
335 | 1900 + tm.tm_year, 1 + tm.tm_mon, tm.tm_mday, | ||
336 | tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_wday); | ||
337 | |||
338 | switch (info->device_type) { | ||
339 | case S5M8763X: | ||
340 | ret = regmap_write(info->regmap, SEC_ALARM0_CONF, 0); | ||
341 | break; | ||
342 | |||
343 | case S5M8767X: | ||
344 | for (i = 0; i < 7; i++) | ||
345 | data[i] &= ~ALARM_ENABLE_MASK; | ||
346 | |||
347 | ret = regmap_raw_write(info->regmap, SEC_ALARM0_SEC, data, 8); | ||
348 | if (ret < 0) | ||
349 | return ret; | ||
350 | |||
351 | ret = s5m8767_rtc_set_alarm_reg(info); | ||
352 | |||
353 | break; | ||
354 | |||
355 | default: | ||
356 | return -EINVAL; | ||
357 | } | ||
358 | |||
359 | return ret; | ||
360 | } | ||
361 | |||
362 | static int s5m_rtc_start_alarm(struct s5m_rtc_info *info) | ||
363 | { | ||
364 | int ret; | ||
365 | u8 data[8]; | ||
366 | u8 alarm0_conf; | ||
367 | struct rtc_time tm; | ||
368 | |||
369 | ret = regmap_bulk_read(info->regmap, SEC_ALARM0_SEC, data, 8); | ||
370 | if (ret < 0) | ||
371 | return ret; | ||
372 | |||
373 | s5m8767_data_to_tm(data, &tm, info->rtc_24hr_mode); | ||
374 | dev_dbg(info->dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__, | ||
375 | 1900 + tm.tm_year, 1 + tm.tm_mon, tm.tm_mday, | ||
376 | tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_wday); | ||
377 | |||
378 | switch (info->device_type) { | ||
379 | case S5M8763X: | ||
380 | alarm0_conf = 0x77; | ||
381 | ret = regmap_write(info->regmap, SEC_ALARM0_CONF, alarm0_conf); | ||
382 | break; | ||
383 | |||
384 | case S5M8767X: | ||
385 | data[RTC_SEC] |= ALARM_ENABLE_MASK; | ||
386 | data[RTC_MIN] |= ALARM_ENABLE_MASK; | ||
387 | data[RTC_HOUR] |= ALARM_ENABLE_MASK; | ||
388 | data[RTC_WEEKDAY] &= ~ALARM_ENABLE_MASK; | ||
389 | if (data[RTC_DATE] & 0x1f) | ||
390 | data[RTC_DATE] |= ALARM_ENABLE_MASK; | ||
391 | if (data[RTC_MONTH] & 0xf) | ||
392 | data[RTC_MONTH] |= ALARM_ENABLE_MASK; | ||
393 | if (data[RTC_YEAR1] & 0x7f) | ||
394 | data[RTC_YEAR1] |= ALARM_ENABLE_MASK; | ||
395 | |||
396 | ret = regmap_raw_write(info->regmap, SEC_ALARM0_SEC, data, 8); | ||
397 | if (ret < 0) | ||
398 | return ret; | ||
399 | ret = s5m8767_rtc_set_alarm_reg(info); | ||
400 | |||
401 | break; | ||
402 | |||
403 | default: | ||
404 | return -EINVAL; | ||
405 | } | ||
406 | |||
407 | return ret; | ||
408 | } | ||
409 | |||
410 | static int s5m_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) | ||
411 | { | ||
412 | struct s5m_rtc_info *info = dev_get_drvdata(dev); | ||
413 | u8 data[8]; | ||
414 | int ret; | ||
415 | |||
416 | switch (info->device_type) { | ||
417 | case S5M8763X: | ||
418 | s5m8763_tm_to_data(&alrm->time, data); | ||
419 | break; | ||
420 | |||
421 | case S5M8767X: | ||
422 | s5m8767_tm_to_data(&alrm->time, data); | ||
423 | break; | ||
424 | |||
425 | default: | ||
426 | return -EINVAL; | ||
427 | } | ||
428 | |||
429 | dev_dbg(dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__, | ||
430 | 1900 + alrm->time.tm_year, 1 + alrm->time.tm_mon, | ||
431 | alrm->time.tm_mday, alrm->time.tm_hour, alrm->time.tm_min, | ||
432 | alrm->time.tm_sec, alrm->time.tm_wday); | ||
433 | |||
434 | ret = s5m_rtc_stop_alarm(info); | ||
435 | if (ret < 0) | ||
436 | return ret; | ||
437 | |||
438 | ret = regmap_raw_write(info->regmap, SEC_ALARM0_SEC, data, 8); | ||
439 | if (ret < 0) | ||
440 | return ret; | ||
441 | |||
442 | ret = s5m8767_rtc_set_alarm_reg(info); | ||
443 | if (ret < 0) | ||
444 | return ret; | ||
445 | |||
446 | if (alrm->enabled) | ||
447 | ret = s5m_rtc_start_alarm(info); | ||
448 | |||
449 | return ret; | ||
450 | } | ||
451 | |||
452 | static int s5m_rtc_alarm_irq_enable(struct device *dev, | ||
453 | unsigned int enabled) | ||
454 | { | ||
455 | struct s5m_rtc_info *info = dev_get_drvdata(dev); | ||
456 | |||
457 | if (enabled) | ||
458 | return s5m_rtc_start_alarm(info); | ||
459 | else | ||
460 | return s5m_rtc_stop_alarm(info); | ||
461 | } | ||
462 | |||
463 | static irqreturn_t s5m_rtc_alarm_irq(int irq, void *data) | ||
464 | { | ||
465 | struct s5m_rtc_info *info = data; | ||
466 | |||
467 | rtc_update_irq(info->rtc_dev, 1, RTC_IRQF | RTC_AF); | ||
468 | |||
469 | return IRQ_HANDLED; | ||
470 | } | ||
471 | |||
472 | static const struct rtc_class_ops s5m_rtc_ops = { | ||
473 | .read_time = s5m_rtc_read_time, | ||
474 | .set_time = s5m_rtc_set_time, | ||
475 | .read_alarm = s5m_rtc_read_alarm, | ||
476 | .set_alarm = s5m_rtc_set_alarm, | ||
477 | .alarm_irq_enable = s5m_rtc_alarm_irq_enable, | ||
478 | }; | ||
479 | |||
480 | static void s5m_rtc_enable_wtsr(struct s5m_rtc_info *info, bool enable) | ||
481 | { | ||
482 | int ret; | ||
483 | ret = regmap_update_bits(info->regmap, SEC_WTSR_SMPL_CNTL, | ||
484 | WTSR_ENABLE_MASK, | ||
485 | enable ? WTSR_ENABLE_MASK : 0); | ||
486 | if (ret < 0) | ||
487 | dev_err(info->dev, "%s: fail to update WTSR reg(%d)\n", | ||
488 | __func__, ret); | ||
489 | } | ||
490 | |||
491 | static void s5m_rtc_enable_smpl(struct s5m_rtc_info *info, bool enable) | ||
492 | { | ||
493 | int ret; | ||
494 | ret = regmap_update_bits(info->regmap, SEC_WTSR_SMPL_CNTL, | ||
495 | SMPL_ENABLE_MASK, | ||
496 | enable ? SMPL_ENABLE_MASK : 0); | ||
497 | if (ret < 0) | ||
498 | dev_err(info->dev, "%s: fail to update SMPL reg(%d)\n", | ||
499 | __func__, ret); | ||
500 | } | ||
501 | |||
502 | static int s5m8767_rtc_init_reg(struct s5m_rtc_info *info) | ||
503 | { | ||
504 | u8 data[2]; | ||
505 | unsigned int tp_read; | ||
506 | int ret; | ||
507 | struct rtc_time tm; | ||
508 | |||
509 | ret = regmap_read(info->regmap, SEC_RTC_UDR_CON, &tp_read); | ||
510 | if (ret < 0) { | ||
511 | dev_err(info->dev, "%s: fail to read control reg(%d)\n", | ||
512 | __func__, ret); | ||
513 | return ret; | ||
514 | } | ||
515 | |||
516 | /* Set RTC control register : Binary mode, 24hour mode */ | ||
517 | data[0] = (1 << BCD_EN_SHIFT) | (1 << MODEL24_SHIFT); | ||
518 | data[1] = (0 << BCD_EN_SHIFT) | (1 << MODEL24_SHIFT); | ||
519 | |||
520 | info->rtc_24hr_mode = 1; | ||
521 | ret = regmap_raw_write(info->regmap, SEC_ALARM0_CONF, data, 2); | ||
522 | if (ret < 0) { | ||
523 | dev_err(info->dev, "%s: fail to write controlm reg(%d)\n", | ||
524 | __func__, ret); | ||
525 | return ret; | ||
526 | } | ||
527 | |||
528 | /* In first boot time, Set rtc time to 1/1/2012 00:00:00(SUN) */ | ||
529 | if ((tp_read & RTC_TCON_MASK) == 0) { | ||
530 | dev_dbg(info->dev, "rtc init\n"); | ||
531 | tm.tm_sec = 0; | ||
532 | tm.tm_min = 0; | ||
533 | tm.tm_hour = 0; | ||
534 | tm.tm_wday = 0; | ||
535 | tm.tm_mday = 1; | ||
536 | tm.tm_mon = 0; | ||
537 | tm.tm_year = 112; | ||
538 | tm.tm_yday = 0; | ||
539 | tm.tm_isdst = 0; | ||
540 | ret = s5m_rtc_set_time(info->dev, &tm); | ||
541 | } | ||
542 | |||
543 | ret = regmap_update_bits(info->regmap, SEC_RTC_UDR_CON, | ||
544 | RTC_TCON_MASK, tp_read | RTC_TCON_MASK); | ||
545 | if (ret < 0) | ||
546 | dev_err(info->dev, "%s: fail to update TCON reg(%d)\n", | ||
547 | __func__, ret); | ||
548 | |||
549 | return ret; | ||
550 | } | ||
551 | |||
552 | static int s5m_rtc_probe(struct platform_device *pdev) | ||
553 | { | ||
554 | struct sec_pmic_dev *s5m87xx = dev_get_drvdata(pdev->dev.parent); | ||
555 | struct sec_platform_data *pdata = s5m87xx->pdata; | ||
556 | struct s5m_rtc_info *info; | ||
557 | int ret; | ||
558 | |||
559 | if (!pdata) { | ||
560 | dev_err(pdev->dev.parent, "Platform data not supplied\n"); | ||
561 | return -ENODEV; | ||
562 | } | ||
563 | |||
564 | info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL); | ||
565 | if (!info) | ||
566 | return -ENOMEM; | ||
567 | |||
568 | info->dev = &pdev->dev; | ||
569 | info->s5m87xx = s5m87xx; | ||
570 | info->regmap = s5m87xx->regmap_rtc; | ||
571 | info->device_type = s5m87xx->device_type; | ||
572 | info->wtsr_smpl = s5m87xx->wtsr_smpl; | ||
573 | |||
574 | switch (pdata->device_type) { | ||
575 | case S5M8763X: | ||
576 | info->irq = regmap_irq_get_virq(s5m87xx->irq_data, | ||
577 | S5M8763_IRQ_ALARM0); | ||
578 | break; | ||
579 | |||
580 | case S5M8767X: | ||
581 | info->irq = regmap_irq_get_virq(s5m87xx->irq_data, | ||
582 | S5M8767_IRQ_RTCA1); | ||
583 | break; | ||
584 | |||
585 | default: | ||
586 | ret = -EINVAL; | ||
587 | dev_err(&pdev->dev, "Unsupported device type: %d\n", ret); | ||
588 | return ret; | ||
589 | } | ||
590 | |||
591 | platform_set_drvdata(pdev, info); | ||
592 | |||
593 | ret = s5m8767_rtc_init_reg(info); | ||
594 | |||
595 | if (info->wtsr_smpl) { | ||
596 | s5m_rtc_enable_wtsr(info, true); | ||
597 | s5m_rtc_enable_smpl(info, true); | ||
598 | } | ||
599 | |||
600 | device_init_wakeup(&pdev->dev, 1); | ||
601 | |||
602 | info->rtc_dev = devm_rtc_device_register(&pdev->dev, "s5m-rtc", | ||
603 | &s5m_rtc_ops, THIS_MODULE); | ||
604 | |||
605 | if (IS_ERR(info->rtc_dev)) | ||
606 | return PTR_ERR(info->rtc_dev); | ||
607 | |||
608 | ret = devm_request_threaded_irq(&pdev->dev, info->irq, NULL, | ||
609 | s5m_rtc_alarm_irq, 0, "rtc-alarm0", | ||
610 | info); | ||
611 | if (ret < 0) | ||
612 | dev_err(&pdev->dev, "Failed to request alarm IRQ: %d: %d\n", | ||
613 | info->irq, ret); | ||
614 | |||
615 | return ret; | ||
616 | } | ||
617 | |||
618 | static void s5m_rtc_shutdown(struct platform_device *pdev) | ||
619 | { | ||
620 | struct s5m_rtc_info *info = platform_get_drvdata(pdev); | ||
621 | int i; | ||
622 | unsigned int val = 0; | ||
623 | if (info->wtsr_smpl) { | ||
624 | for (i = 0; i < 3; i++) { | ||
625 | s5m_rtc_enable_wtsr(info, false); | ||
626 | regmap_read(info->regmap, SEC_WTSR_SMPL_CNTL, &val); | ||
627 | pr_debug("%s: WTSR_SMPL reg(0x%02x)\n", __func__, val); | ||
628 | if (val & WTSR_ENABLE_MASK) | ||
629 | pr_emerg("%s: fail to disable WTSR\n", | ||
630 | __func__); | ||
631 | else { | ||
632 | pr_info("%s: success to disable WTSR\n", | ||
633 | __func__); | ||
634 | break; | ||
635 | } | ||
636 | } | ||
637 | } | ||
638 | /* Disable SMPL when power off */ | ||
639 | s5m_rtc_enable_smpl(info, false); | ||
640 | } | ||
641 | |||
642 | static int s5m_rtc_resume(struct device *dev) | ||
643 | { | ||
644 | struct s5m_rtc_info *info = dev_get_drvdata(dev); | ||
645 | int ret = 0; | ||
646 | |||
647 | if (device_may_wakeup(dev)) | ||
648 | ret = disable_irq_wake(info->irq); | ||
649 | |||
650 | return ret; | ||
651 | } | ||
652 | |||
653 | static int s5m_rtc_suspend(struct device *dev) | ||
654 | { | ||
655 | struct s5m_rtc_info *info = dev_get_drvdata(dev); | ||
656 | int ret = 0; | ||
657 | |||
658 | if (device_may_wakeup(dev)) | ||
659 | ret = enable_irq_wake(info->irq); | ||
660 | |||
661 | return ret; | ||
662 | } | ||
663 | |||
664 | static SIMPLE_DEV_PM_OPS(s5m_rtc_pm_ops, s5m_rtc_suspend, s5m_rtc_resume); | ||
665 | |||
666 | static const struct platform_device_id s5m_rtc_id[] = { | ||
667 | { "s5m-rtc", 0 }, | ||
668 | }; | ||
669 | |||
670 | static struct platform_driver s5m_rtc_driver = { | ||
671 | .driver = { | ||
672 | .name = "s5m-rtc", | ||
673 | .owner = THIS_MODULE, | ||
674 | .pm = &s5m_rtc_pm_ops, | ||
675 | }, | ||
676 | .probe = s5m_rtc_probe, | ||
677 | .shutdown = s5m_rtc_shutdown, | ||
678 | .id_table = s5m_rtc_id, | ||
679 | }; | ||
680 | |||
681 | module_platform_driver(s5m_rtc_driver); | ||
682 | |||
683 | /* Module information */ | ||
684 | MODULE_AUTHOR("Sangbeom Kim <sbkim73@samsung.com>"); | ||
685 | MODULE_DESCRIPTION("Samsung S5M RTC driver"); | ||
686 | MODULE_LICENSE("GPL"); | ||
687 | MODULE_ALIAS("platform:s5m-rtc"); | ||
diff --git a/drivers/rtc/rtc-sh.c b/drivers/rtc/rtc-sh.c index 6d87e26355a3..d0d2b047658b 100644 --- a/drivers/rtc/rtc-sh.c +++ b/drivers/rtc/rtc-sh.c | |||
@@ -649,8 +649,9 @@ static int __init sh_rtc_probe(struct platform_device *pdev) | |||
649 | clk_enable(rtc->clk); | 649 | clk_enable(rtc->clk); |
650 | 650 | ||
651 | rtc->capabilities = RTC_DEF_CAPABILITIES; | 651 | rtc->capabilities = RTC_DEF_CAPABILITIES; |
652 | if (pdev->dev.platform_data) { | 652 | if (dev_get_platdata(&pdev->dev)) { |
653 | struct sh_rtc_platform_info *pinfo = pdev->dev.platform_data; | 653 | struct sh_rtc_platform_info *pinfo = |
654 | dev_get_platdata(&pdev->dev); | ||
654 | 655 | ||
655 | /* | 656 | /* |
656 | * Some CPUs have special capabilities in addition to the | 657 | * Some CPUs have special capabilities in addition to the |
diff --git a/drivers/rtc/rtc-sirfsoc.c b/drivers/rtc/rtc-sirfsoc.c index 63460cf80f1b..3eb3642ae299 100644 --- a/drivers/rtc/rtc-sirfsoc.c +++ b/drivers/rtc/rtc-sirfsoc.c | |||
@@ -59,7 +59,7 @@ static int sirfsoc_rtc_read_alarm(struct device *dev, | |||
59 | unsigned long rtc_alarm, rtc_count; | 59 | unsigned long rtc_alarm, rtc_count; |
60 | struct sirfsoc_rtc_drv *rtcdrv; | 60 | struct sirfsoc_rtc_drv *rtcdrv; |
61 | 61 | ||
62 | rtcdrv = (struct sirfsoc_rtc_drv *)dev_get_drvdata(dev); | 62 | rtcdrv = dev_get_drvdata(dev); |
63 | 63 | ||
64 | local_irq_disable(); | 64 | local_irq_disable(); |
65 | 65 | ||
@@ -94,7 +94,7 @@ static int sirfsoc_rtc_set_alarm(struct device *dev, | |||
94 | { | 94 | { |
95 | unsigned long rtc_status_reg, rtc_alarm; | 95 | unsigned long rtc_status_reg, rtc_alarm; |
96 | struct sirfsoc_rtc_drv *rtcdrv; | 96 | struct sirfsoc_rtc_drv *rtcdrv; |
97 | rtcdrv = (struct sirfsoc_rtc_drv *)dev_get_drvdata(dev); | 97 | rtcdrv = dev_get_drvdata(dev); |
98 | 98 | ||
99 | if (alrm->enabled) { | 99 | if (alrm->enabled) { |
100 | rtc_tm_to_time(&(alrm->time), &rtc_alarm); | 100 | rtc_tm_to_time(&(alrm->time), &rtc_alarm); |
@@ -157,7 +157,7 @@ static int sirfsoc_rtc_read_time(struct device *dev, | |||
157 | { | 157 | { |
158 | unsigned long tmp_rtc = 0; | 158 | unsigned long tmp_rtc = 0; |
159 | struct sirfsoc_rtc_drv *rtcdrv; | 159 | struct sirfsoc_rtc_drv *rtcdrv; |
160 | rtcdrv = (struct sirfsoc_rtc_drv *)dev_get_drvdata(dev); | 160 | rtcdrv = dev_get_drvdata(dev); |
161 | /* | 161 | /* |
162 | * This patch is taken from WinCE - Need to validate this for | 162 | * This patch is taken from WinCE - Need to validate this for |
163 | * correctness. To work around sirfsoc RTC counter double sync logic | 163 | * correctness. To work around sirfsoc RTC counter double sync logic |
@@ -178,7 +178,7 @@ static int sirfsoc_rtc_set_time(struct device *dev, | |||
178 | { | 178 | { |
179 | unsigned long rtc_time; | 179 | unsigned long rtc_time; |
180 | struct sirfsoc_rtc_drv *rtcdrv; | 180 | struct sirfsoc_rtc_drv *rtcdrv; |
181 | rtcdrv = (struct sirfsoc_rtc_drv *)dev_get_drvdata(dev); | 181 | rtcdrv = dev_get_drvdata(dev); |
182 | 182 | ||
183 | rtc_tm_to_time(tm, &rtc_time); | 183 | rtc_tm_to_time(tm, &rtc_time); |
184 | 184 | ||
@@ -274,7 +274,7 @@ static int sirfsoc_rtc_probe(struct platform_device *pdev) | |||
274 | err = of_property_read_u32(np, "reg", &rtcdrv->rtc_base); | 274 | err = of_property_read_u32(np, "reg", &rtcdrv->rtc_base); |
275 | if (err) { | 275 | if (err) { |
276 | dev_err(&pdev->dev, "unable to find base address of rtc node in dtb\n"); | 276 | dev_err(&pdev->dev, "unable to find base address of rtc node in dtb\n"); |
277 | goto error; | 277 | return err; |
278 | } | 278 | } |
279 | 279 | ||
280 | platform_set_drvdata(pdev, rtcdrv); | 280 | platform_set_drvdata(pdev, rtcdrv); |
@@ -290,7 +290,7 @@ static int sirfsoc_rtc_probe(struct platform_device *pdev) | |||
290 | rtc_div = ((32768 / RTC_HZ) / 2) - 1; | 290 | rtc_div = ((32768 / RTC_HZ) / 2) - 1; |
291 | sirfsoc_rtc_iobrg_writel(rtc_div, rtcdrv->rtc_base + RTC_DIV); | 291 | sirfsoc_rtc_iobrg_writel(rtc_div, rtcdrv->rtc_base + RTC_DIV); |
292 | 292 | ||
293 | rtcdrv->rtc = rtc_device_register(pdev->name, &(pdev->dev), | 293 | rtcdrv->rtc = devm_rtc_device_register(&pdev->dev, pdev->name, |
294 | &sirfsoc_rtc_ops, THIS_MODULE); | 294 | &sirfsoc_rtc_ops, THIS_MODULE); |
295 | if (IS_ERR(rtcdrv->rtc)) { | 295 | if (IS_ERR(rtcdrv->rtc)) { |
296 | err = PTR_ERR(rtcdrv->rtc); | 296 | err = PTR_ERR(rtcdrv->rtc); |
@@ -322,24 +322,15 @@ static int sirfsoc_rtc_probe(struct platform_device *pdev) | |||
322 | rtcdrv); | 322 | rtcdrv); |
323 | if (err) { | 323 | if (err) { |
324 | dev_err(&pdev->dev, "Unable to register for the SiRF SOC RTC IRQ\n"); | 324 | dev_err(&pdev->dev, "Unable to register for the SiRF SOC RTC IRQ\n"); |
325 | goto error; | 325 | return err; |
326 | } | 326 | } |
327 | 327 | ||
328 | return 0; | 328 | return 0; |
329 | |||
330 | error: | ||
331 | if (rtcdrv->rtc) | ||
332 | rtc_device_unregister(rtcdrv->rtc); | ||
333 | |||
334 | return err; | ||
335 | } | 329 | } |
336 | 330 | ||
337 | static int sirfsoc_rtc_remove(struct platform_device *pdev) | 331 | static int sirfsoc_rtc_remove(struct platform_device *pdev) |
338 | { | 332 | { |
339 | struct sirfsoc_rtc_drv *rtcdrv = platform_get_drvdata(pdev); | ||
340 | |||
341 | device_init_wakeup(&pdev->dev, 0); | 333 | device_init_wakeup(&pdev->dev, 0); |
342 | rtc_device_unregister(rtcdrv->rtc); | ||
343 | 334 | ||
344 | return 0; | 335 | return 0; |
345 | } | 336 | } |
@@ -373,7 +364,7 @@ static int sirfsoc_rtc_thaw(struct device *dev) | |||
373 | { | 364 | { |
374 | u32 tmp; | 365 | u32 tmp; |
375 | struct sirfsoc_rtc_drv *rtcdrv; | 366 | struct sirfsoc_rtc_drv *rtcdrv; |
376 | rtcdrv = (struct sirfsoc_rtc_drv *)dev_get_drvdata(dev); | 367 | rtcdrv = dev_get_drvdata(dev); |
377 | 368 | ||
378 | /* | 369 | /* |
379 | * if resume from snapshot and the rtc power is losed, | 370 | * if resume from snapshot and the rtc power is losed, |
@@ -467,7 +458,7 @@ static struct platform_driver sirfsoc_rtc_driver = { | |||
467 | #ifdef CONFIG_PM | 458 | #ifdef CONFIG_PM |
468 | .pm = &sirfsoc_rtc_pm_ops, | 459 | .pm = &sirfsoc_rtc_pm_ops, |
469 | #endif | 460 | #endif |
470 | .of_match_table = of_match_ptr(sirfsoc_rtc_of_match), | 461 | .of_match_table = sirfsoc_rtc_of_match, |
471 | }, | 462 | }, |
472 | .probe = sirfsoc_rtc_probe, | 463 | .probe = sirfsoc_rtc_probe, |
473 | .remove = sirfsoc_rtc_remove, | 464 | .remove = sirfsoc_rtc_remove, |
diff --git a/drivers/rtc/rtc-snvs.c b/drivers/rtc/rtc-snvs.c index 316a342115b2..fa384fe28988 100644 --- a/drivers/rtc/rtc-snvs.c +++ b/drivers/rtc/rtc-snvs.c | |||
@@ -329,7 +329,7 @@ static struct platform_driver snvs_rtc_driver = { | |||
329 | .name = "snvs_rtc", | 329 | .name = "snvs_rtc", |
330 | .owner = THIS_MODULE, | 330 | .owner = THIS_MODULE, |
331 | .pm = &snvs_rtc_pm_ops, | 331 | .pm = &snvs_rtc_pm_ops, |
332 | .of_match_table = of_match_ptr(snvs_dt_ids), | 332 | .of_match_table = snvs_dt_ids, |
333 | }, | 333 | }, |
334 | .probe = snvs_rtc_probe, | 334 | .probe = snvs_rtc_probe, |
335 | }; | 335 | }; |
diff --git a/drivers/rtc/rtc-stmp3xxx.c b/drivers/rtc/rtc-stmp3xxx.c index 26019531db15..ea96492357b0 100644 --- a/drivers/rtc/rtc-stmp3xxx.c +++ b/drivers/rtc/rtc-stmp3xxx.c | |||
@@ -343,7 +343,7 @@ static struct platform_driver stmp3xxx_rtcdrv = { | |||
343 | .name = "stmp3xxx-rtc", | 343 | .name = "stmp3xxx-rtc", |
344 | .owner = THIS_MODULE, | 344 | .owner = THIS_MODULE, |
345 | .pm = &stmp3xxx_rtc_pm_ops, | 345 | .pm = &stmp3xxx_rtc_pm_ops, |
346 | .of_match_table = of_match_ptr(rtc_dt_ids), | 346 | .of_match_table = rtc_dt_ids, |
347 | }, | 347 | }, |
348 | }; | 348 | }; |
349 | 349 | ||
diff --git a/drivers/rtc/rtc-tps65910.c b/drivers/rtc/rtc-tps65910.c index a9caf043b0ce..7af00208d637 100644 --- a/drivers/rtc/rtc-tps65910.c +++ b/drivers/rtc/rtc-tps65910.c | |||
@@ -22,7 +22,6 @@ | |||
22 | #include <linux/rtc.h> | 22 | #include <linux/rtc.h> |
23 | #include <linux/bcd.h> | 23 | #include <linux/bcd.h> |
24 | #include <linux/platform_device.h> | 24 | #include <linux/platform_device.h> |
25 | #include <linux/pm_runtime.h> | ||
26 | #include <linux/interrupt.h> | 25 | #include <linux/interrupt.h> |
27 | #include <linux/mfd/tps65910.h> | 26 | #include <linux/mfd/tps65910.h> |
28 | 27 | ||
diff --git a/drivers/rtc/rtc-v3020.c b/drivers/rtc/rtc-v3020.c index d07d89823020..25222cdccdc6 100644 --- a/drivers/rtc/rtc-v3020.c +++ b/drivers/rtc/rtc-v3020.c | |||
@@ -303,7 +303,7 @@ static const struct rtc_class_ops v3020_rtc_ops = { | |||
303 | 303 | ||
304 | static int rtc_probe(struct platform_device *pdev) | 304 | static int rtc_probe(struct platform_device *pdev) |
305 | { | 305 | { |
306 | struct v3020_platform_data *pdata = pdev->dev.platform_data; | 306 | struct v3020_platform_data *pdata = dev_get_platdata(&pdev->dev); |
307 | struct v3020 *chip; | 307 | struct v3020 *chip; |
308 | int retval = -EBUSY; | 308 | int retval = -EBUSY; |
309 | int i; | 309 | int i; |
diff --git a/drivers/rtc/rtc-vr41xx.c b/drivers/rtc/rtc-vr41xx.c index 54e104e197e3..aabc22c587fb 100644 --- a/drivers/rtc/rtc-vr41xx.c +++ b/drivers/rtc/rtc-vr41xx.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/err.h> | 20 | #include <linux/err.h> |
21 | #include <linux/fs.h> | 21 | #include <linux/fs.h> |
22 | #include <linux/init.h> | 22 | #include <linux/init.h> |
23 | #include <linux/io.h> | ||
23 | #include <linux/ioport.h> | 24 | #include <linux/ioport.h> |
24 | #include <linux/interrupt.h> | 25 | #include <linux/interrupt.h> |
25 | #include <linux/module.h> | 26 | #include <linux/module.h> |
@@ -27,11 +28,10 @@ | |||
27 | #include <linux/rtc.h> | 28 | #include <linux/rtc.h> |
28 | #include <linux/spinlock.h> | 29 | #include <linux/spinlock.h> |
29 | #include <linux/types.h> | 30 | #include <linux/types.h> |
31 | #include <linux/uaccess.h> | ||
30 | #include <linux/log2.h> | 32 | #include <linux/log2.h> |
31 | 33 | ||
32 | #include <asm/div64.h> | 34 | #include <asm/div64.h> |
33 | #include <asm/io.h> | ||
34 | #include <asm/uaccess.h> | ||
35 | 35 | ||
36 | MODULE_AUTHOR("Yoichi Yuasa <yuasa@linux-mips.org>"); | 36 | MODULE_AUTHOR("Yoichi Yuasa <yuasa@linux-mips.org>"); |
37 | MODULE_DESCRIPTION("NEC VR4100 series RTC driver"); | 37 | MODULE_DESCRIPTION("NEC VR4100 series RTC driver"); |
diff --git a/drivers/rtc/rtc-vt8500.c b/drivers/rtc/rtc-vt8500.c index c2d6331fc712..df2ef3eba7cd 100644 --- a/drivers/rtc/rtc-vt8500.c +++ b/drivers/rtc/rtc-vt8500.c | |||
@@ -228,7 +228,7 @@ static int vt8500_rtc_probe(struct platform_device *pdev) | |||
228 | vt8500_rtc->irq_alarm = platform_get_irq(pdev, 0); | 228 | vt8500_rtc->irq_alarm = platform_get_irq(pdev, 0); |
229 | if (vt8500_rtc->irq_alarm < 0) { | 229 | if (vt8500_rtc->irq_alarm < 0) { |
230 | dev_err(&pdev->dev, "No alarm IRQ resource defined\n"); | 230 | dev_err(&pdev->dev, "No alarm IRQ resource defined\n"); |
231 | return -ENXIO; | 231 | return vt8500_rtc->irq_alarm; |
232 | } | 232 | } |
233 | 233 | ||
234 | vt8500_rtc->res = devm_request_mem_region(&pdev->dev, | 234 | vt8500_rtc->res = devm_request_mem_region(&pdev->dev, |
@@ -296,7 +296,7 @@ static struct platform_driver vt8500_rtc_driver = { | |||
296 | .driver = { | 296 | .driver = { |
297 | .name = "vt8500-rtc", | 297 | .name = "vt8500-rtc", |
298 | .owner = THIS_MODULE, | 298 | .owner = THIS_MODULE, |
299 | .of_match_table = of_match_ptr(wmt_dt_ids), | 299 | .of_match_table = wmt_dt_ids, |
300 | }, | 300 | }, |
301 | }; | 301 | }; |
302 | 302 | ||