diff options
author | Alessandro Zummo <a.zummo@towertech.it> | 2009-01-06 17:42:23 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-01-06 18:59:25 -0500 |
commit | 97a1f9532ed41fd9cf5249fc1afae23fd47d1120 (patch) | |
tree | fe263c09d931eafe9bc37c8df2ff52df6b9f7473 /drivers/rtc | |
parent | 0e1492330cd2c95df2553335d7a77351021a938f (diff) |
rtc: rtc-ds1216 fixes
Fixes a few issues with the rtc-ds1216 driver
- use rtc_valid_tm
- use platform_driver_probe
- fix init sequence - it was using rtc_unregister_driver where not
needed. I also added resource_size and removed an useless pointer
assignment.
Signed-off-by: Alessandro Zummo <a.zummo@towertech.it>
Tested-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
Cc: David Brownell <david-b@pacbell.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/rtc')
-rw-r--r-- | drivers/rtc/rtc-ds1216.c | 30 |
1 files changed, 14 insertions, 16 deletions
diff --git a/drivers/rtc/rtc-ds1216.c b/drivers/rtc/rtc-ds1216.c index 9a234a4ec06d..4aedc705518c 100644 --- a/drivers/rtc/rtc-ds1216.c +++ b/drivers/rtc/rtc-ds1216.c | |||
@@ -10,7 +10,7 @@ | |||
10 | #include <linux/platform_device.h> | 10 | #include <linux/platform_device.h> |
11 | #include <linux/bcd.h> | 11 | #include <linux/bcd.h> |
12 | 12 | ||
13 | #define DRV_VERSION "0.1" | 13 | #define DRV_VERSION "0.2" |
14 | 14 | ||
15 | struct ds1216_regs { | 15 | struct ds1216_regs { |
16 | u8 tsec; | 16 | u8 tsec; |
@@ -101,7 +101,8 @@ static int ds1216_rtc_read_time(struct device *dev, struct rtc_time *tm) | |||
101 | tm->tm_year = bcd2bin(regs.year); | 101 | tm->tm_year = bcd2bin(regs.year); |
102 | if (tm->tm_year < 70) | 102 | if (tm->tm_year < 70) |
103 | tm->tm_year += 100; | 103 | tm->tm_year += 100; |
104 | return 0; | 104 | |
105 | return rtc_valid_tm(tm); | ||
105 | } | 106 | } |
106 | 107 | ||
107 | static int ds1216_rtc_set_time(struct device *dev, struct rtc_time *tm) | 108 | static int ds1216_rtc_set_time(struct device *dev, struct rtc_time *tm) |
@@ -138,9 +139,8 @@ static const struct rtc_class_ops ds1216_rtc_ops = { | |||
138 | .set_time = ds1216_rtc_set_time, | 139 | .set_time = ds1216_rtc_set_time, |
139 | }; | 140 | }; |
140 | 141 | ||
141 | static int __devinit ds1216_rtc_probe(struct platform_device *pdev) | 142 | static int __init ds1216_rtc_probe(struct platform_device *pdev) |
142 | { | 143 | { |
143 | struct rtc_device *rtc; | ||
144 | struct resource *res; | 144 | struct resource *res; |
145 | struct ds1216_priv *priv; | 145 | struct ds1216_priv *priv; |
146 | int ret = 0; | 146 | int ret = 0; |
@@ -152,7 +152,10 @@ static int __devinit ds1216_rtc_probe(struct platform_device *pdev) | |||
152 | priv = kzalloc(sizeof *priv, GFP_KERNEL); | 152 | priv = kzalloc(sizeof *priv, GFP_KERNEL); |
153 | if (!priv) | 153 | if (!priv) |
154 | return -ENOMEM; | 154 | return -ENOMEM; |
155 | priv->size = res->end - res->start + 1; | 155 | |
156 | platform_set_drvdata(pdev, priv); | ||
157 | |||
158 | priv->size = resource_size(res); | ||
156 | if (!request_mem_region(res->start, priv->size, pdev->name)) { | 159 | if (!request_mem_region(res->start, priv->size, pdev->name)) { |
157 | ret = -EBUSY; | 160 | ret = -EBUSY; |
158 | goto out; | 161 | goto out; |
@@ -163,22 +166,18 @@ static int __devinit ds1216_rtc_probe(struct platform_device *pdev) | |||
163 | ret = -ENOMEM; | 166 | ret = -ENOMEM; |
164 | goto out; | 167 | goto out; |
165 | } | 168 | } |
166 | rtc = rtc_device_register("ds1216", &pdev->dev, | 169 | priv->rtc = rtc_device_register("ds1216", &pdev->dev, |
167 | &ds1216_rtc_ops, THIS_MODULE); | 170 | &ds1216_rtc_ops, THIS_MODULE); |
168 | if (IS_ERR(rtc)) { | 171 | if (IS_ERR(priv->rtc)) { |
169 | ret = PTR_ERR(rtc); | 172 | ret = PTR_ERR(priv->rtc); |
170 | goto out; | 173 | goto out; |
171 | } | 174 | } |
172 | priv->rtc = rtc; | ||
173 | platform_set_drvdata(pdev, priv); | ||
174 | 175 | ||
175 | /* dummy read to get clock into a known state */ | 176 | /* dummy read to get clock into a known state */ |
176 | ds1216_read(priv->ioaddr, dummy); | 177 | ds1216_read(priv->ioaddr, dummy); |
177 | return 0; | 178 | return 0; |
178 | 179 | ||
179 | out: | 180 | out: |
180 | if (priv->rtc) | ||
181 | rtc_device_unregister(priv->rtc); | ||
182 | if (priv->ioaddr) | 181 | if (priv->ioaddr) |
183 | iounmap(priv->ioaddr); | 182 | iounmap(priv->ioaddr); |
184 | if (priv->baseaddr) | 183 | if (priv->baseaddr) |
@@ -187,7 +186,7 @@ out: | |||
187 | return ret; | 186 | return ret; |
188 | } | 187 | } |
189 | 188 | ||
190 | static int __devexit ds1216_rtc_remove(struct platform_device *pdev) | 189 | static int __exit ds1216_rtc_remove(struct platform_device *pdev) |
191 | { | 190 | { |
192 | struct ds1216_priv *priv = platform_get_drvdata(pdev); | 191 | struct ds1216_priv *priv = platform_get_drvdata(pdev); |
193 | 192 | ||
@@ -203,13 +202,12 @@ static struct platform_driver ds1216_rtc_platform_driver = { | |||
203 | .name = "rtc-ds1216", | 202 | .name = "rtc-ds1216", |
204 | .owner = THIS_MODULE, | 203 | .owner = THIS_MODULE, |
205 | }, | 204 | }, |
206 | .probe = ds1216_rtc_probe, | 205 | .remove = __exit_p(ds1216_rtc_remove), |
207 | .remove = __devexit_p(ds1216_rtc_remove), | ||
208 | }; | 206 | }; |
209 | 207 | ||
210 | static int __init ds1216_rtc_init(void) | 208 | static int __init ds1216_rtc_init(void) |
211 | { | 209 | { |
212 | return platform_driver_register(&ds1216_rtc_platform_driver); | 210 | return platform_driver_probe(&ds1216_rtc_platform_driver, ds1216_rtc_probe); |
213 | } | 211 | } |
214 | 212 | ||
215 | static void __exit ds1216_rtc_exit(void) | 213 | static void __exit ds1216_rtc_exit(void) |