diff options
Diffstat (limited to 'drivers/rtc/rtc-coh901331.c')
-rw-r--r-- | drivers/rtc/rtc-coh901331.c | 61 |
1 files changed, 23 insertions, 38 deletions
diff --git a/drivers/rtc/rtc-coh901331.c b/drivers/rtc/rtc-coh901331.c index a5b8a0c4ea84..76b2156d3c62 100644 --- a/drivers/rtc/rtc-coh901331.c +++ b/drivers/rtc/rtc-coh901331.c | |||
@@ -155,13 +155,10 @@ static int __exit coh901331_remove(struct platform_device *pdev) | |||
155 | struct coh901331_port *rtap = dev_get_drvdata(&pdev->dev); | 155 | struct coh901331_port *rtap = dev_get_drvdata(&pdev->dev); |
156 | 156 | ||
157 | if (rtap) { | 157 | if (rtap) { |
158 | free_irq(rtap->irq, rtap); | ||
159 | rtc_device_unregister(rtap->rtc); | 158 | rtc_device_unregister(rtap->rtc); |
159 | clk_unprepare(rtap->clk); | ||
160 | clk_put(rtap->clk); | 160 | clk_put(rtap->clk); |
161 | iounmap(rtap->virtbase); | ||
162 | release_mem_region(rtap->phybase, rtap->physize); | ||
163 | platform_set_drvdata(pdev, NULL); | 161 | platform_set_drvdata(pdev, NULL); |
164 | kfree(rtap); | ||
165 | } | 162 | } |
166 | 163 | ||
167 | return 0; | 164 | return 0; |
@@ -174,49 +171,43 @@ static int __init coh901331_probe(struct platform_device *pdev) | |||
174 | struct coh901331_port *rtap; | 171 | struct coh901331_port *rtap; |
175 | struct resource *res; | 172 | struct resource *res; |
176 | 173 | ||
177 | rtap = kzalloc(sizeof(struct coh901331_port), GFP_KERNEL); | 174 | rtap = devm_kzalloc(&pdev->dev, |
175 | sizeof(struct coh901331_port), GFP_KERNEL); | ||
178 | if (!rtap) | 176 | if (!rtap) |
179 | return -ENOMEM; | 177 | return -ENOMEM; |
180 | 178 | ||
181 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 179 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
182 | if (!res) { | 180 | if (!res) |
183 | ret = -ENOENT; | 181 | return -ENOENT; |
184 | goto out_no_resource; | 182 | |
185 | } | ||
186 | rtap->phybase = res->start; | 183 | rtap->phybase = res->start; |
187 | rtap->physize = resource_size(res); | 184 | rtap->physize = resource_size(res); |
188 | 185 | ||
189 | if (request_mem_region(rtap->phybase, rtap->physize, | 186 | if (devm_request_mem_region(&pdev->dev, rtap->phybase, rtap->physize, |
190 | "rtc-coh901331") == NULL) { | 187 | "rtc-coh901331") == NULL) |
191 | ret = -EBUSY; | 188 | return -EBUSY; |
192 | goto out_no_memregion; | ||
193 | } | ||
194 | 189 | ||
195 | rtap->virtbase = ioremap(rtap->phybase, rtap->physize); | 190 | rtap->virtbase = devm_ioremap(&pdev->dev, rtap->phybase, rtap->physize); |
196 | if (!rtap->virtbase) { | 191 | if (!rtap->virtbase) |
197 | ret = -ENOMEM; | 192 | return -ENOMEM; |
198 | goto out_no_remap; | ||
199 | } | ||
200 | 193 | ||
201 | rtap->irq = platform_get_irq(pdev, 0); | 194 | rtap->irq = platform_get_irq(pdev, 0); |
202 | if (request_irq(rtap->irq, coh901331_interrupt, 0, | 195 | if (devm_request_irq(&pdev->dev, rtap->irq, coh901331_interrupt, 0, |
203 | "RTC COH 901 331 Alarm", rtap)) { | 196 | "RTC COH 901 331 Alarm", rtap)) |
204 | ret = -EIO; | 197 | return -EIO; |
205 | goto out_no_irq; | ||
206 | } | ||
207 | 198 | ||
208 | rtap->clk = clk_get(&pdev->dev, NULL); | 199 | rtap->clk = clk_get(&pdev->dev, NULL); |
209 | if (IS_ERR(rtap->clk)) { | 200 | if (IS_ERR(rtap->clk)) { |
210 | ret = PTR_ERR(rtap->clk); | 201 | ret = PTR_ERR(rtap->clk); |
211 | dev_err(&pdev->dev, "could not get clock\n"); | 202 | dev_err(&pdev->dev, "could not get clock\n"); |
212 | goto out_no_clk; | 203 | return ret; |
213 | } | 204 | } |
214 | 205 | ||
215 | /* We enable/disable the clock only to assure it works */ | 206 | /* We enable/disable the clock only to assure it works */ |
216 | ret = clk_enable(rtap->clk); | 207 | ret = clk_prepare_enable(rtap->clk); |
217 | if (ret) { | 208 | if (ret) { |
218 | dev_err(&pdev->dev, "could not enable clock\n"); | 209 | dev_err(&pdev->dev, "could not enable clock\n"); |
219 | goto out_no_clk_enable; | 210 | goto out_no_clk_prepenable; |
220 | } | 211 | } |
221 | clk_disable(rtap->clk); | 212 | clk_disable(rtap->clk); |
222 | 213 | ||
@@ -232,18 +223,9 @@ static int __init coh901331_probe(struct platform_device *pdev) | |||
232 | 223 | ||
233 | out_no_rtc: | 224 | out_no_rtc: |
234 | platform_set_drvdata(pdev, NULL); | 225 | platform_set_drvdata(pdev, NULL); |
235 | out_no_clk_enable: | 226 | clk_unprepare(rtap->clk); |
227 | out_no_clk_prepenable: | ||
236 | clk_put(rtap->clk); | 228 | clk_put(rtap->clk); |
237 | out_no_clk: | ||
238 | free_irq(rtap->irq, rtap); | ||
239 | out_no_irq: | ||
240 | iounmap(rtap->virtbase); | ||
241 | out_no_remap: | ||
242 | platform_set_drvdata(pdev, NULL); | ||
243 | out_no_memregion: | ||
244 | release_mem_region(rtap->phybase, SZ_4K); | ||
245 | out_no_resource: | ||
246 | kfree(rtap); | ||
247 | return ret; | 229 | return ret; |
248 | } | 230 | } |
249 | 231 | ||
@@ -265,6 +247,7 @@ static int coh901331_suspend(struct platform_device *pdev, pm_message_t state) | |||
265 | writel(0, rtap->virtbase + COH901331_IRQ_MASK); | 247 | writel(0, rtap->virtbase + COH901331_IRQ_MASK); |
266 | clk_disable(rtap->clk); | 248 | clk_disable(rtap->clk); |
267 | } | 249 | } |
250 | clk_unprepare(rtap->clk); | ||
268 | return 0; | 251 | return 0; |
269 | } | 252 | } |
270 | 253 | ||
@@ -272,6 +255,7 @@ static int coh901331_resume(struct platform_device *pdev) | |||
272 | { | 255 | { |
273 | struct coh901331_port *rtap = dev_get_drvdata(&pdev->dev); | 256 | struct coh901331_port *rtap = dev_get_drvdata(&pdev->dev); |
274 | 257 | ||
258 | clk_prepare(rtap->clk); | ||
275 | if (device_may_wakeup(&pdev->dev)) { | 259 | if (device_may_wakeup(&pdev->dev)) { |
276 | disable_irq_wake(rtap->irq); | 260 | disable_irq_wake(rtap->irq); |
277 | } else { | 261 | } else { |
@@ -293,6 +277,7 @@ static void coh901331_shutdown(struct platform_device *pdev) | |||
293 | clk_enable(rtap->clk); | 277 | clk_enable(rtap->clk); |
294 | writel(0, rtap->virtbase + COH901331_IRQ_MASK); | 278 | writel(0, rtap->virtbase + COH901331_IRQ_MASK); |
295 | clk_disable(rtap->clk); | 279 | clk_disable(rtap->clk); |
280 | clk_unprepare(rtap->clk); | ||
296 | } | 281 | } |
297 | 282 | ||
298 | static struct platform_driver coh901331_driver = { | 283 | static struct platform_driver coh901331_driver = { |