aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rtc/rtc-at32ap700x.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/rtc/rtc-at32ap700x.c')
-rw-r--r--drivers/rtc/rtc-at32ap700x.c39
1 files changed, 10 insertions, 29 deletions
diff --git a/drivers/rtc/rtc-at32ap700x.c b/drivers/rtc/rtc-at32ap700x.c
index 8dd08305aae1..f47fbb5eee8b 100644
--- a/drivers/rtc/rtc-at32ap700x.c
+++ b/drivers/rtc/rtc-at32ap700x.c
@@ -202,7 +202,8 @@ static int __init at32_rtc_probe(struct platform_device *pdev)
202 int irq; 202 int irq;
203 int ret; 203 int ret;
204 204
205 rtc = kzalloc(sizeof(struct rtc_at32ap700x), GFP_KERNEL); 205 rtc = devm_kzalloc(&pdev->dev, sizeof(struct rtc_at32ap700x),
206 GFP_KERNEL);
206 if (!rtc) { 207 if (!rtc) {
207 dev_dbg(&pdev->dev, "out of memory\n"); 208 dev_dbg(&pdev->dev, "out of memory\n");
208 return -ENOMEM; 209 return -ENOMEM;
@@ -223,7 +224,7 @@ static int __init at32_rtc_probe(struct platform_device *pdev)
223 } 224 }
224 225
225 rtc->irq = irq; 226 rtc->irq = irq;
226 rtc->regs = ioremap(regs->start, resource_size(regs)); 227 rtc->regs = devm_ioremap(&pdev->dev, regs->start, resource_size(regs));
227 if (!rtc->regs) { 228 if (!rtc->regs) {
228 ret = -ENOMEM; 229 ret = -ENOMEM;
229 dev_dbg(&pdev->dev, "could not map I/O memory\n"); 230 dev_dbg(&pdev->dev, "could not map I/O memory\n");
@@ -244,20 +245,21 @@ static int __init at32_rtc_probe(struct platform_device *pdev)
244 | RTC_BIT(CTRL_EN)); 245 | RTC_BIT(CTRL_EN));
245 } 246 }
246 247
247 ret = request_irq(irq, at32_rtc_interrupt, IRQF_SHARED, "rtc", rtc); 248 ret = devm_request_irq(&pdev->dev, irq, at32_rtc_interrupt, IRQF_SHARED,
249 "rtc", rtc);
248 if (ret) { 250 if (ret) {
249 dev_dbg(&pdev->dev, "could not request irq %d\n", irq); 251 dev_dbg(&pdev->dev, "could not request irq %d\n", irq);
250 goto out_iounmap; 252 goto out;
251 } 253 }
252 254
253 platform_set_drvdata(pdev, rtc); 255 platform_set_drvdata(pdev, rtc);
254 256
255 rtc->rtc = rtc_device_register(pdev->name, &pdev->dev, 257 rtc->rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
256 &at32_rtc_ops, THIS_MODULE); 258 &at32_rtc_ops, THIS_MODULE);
257 if (IS_ERR(rtc->rtc)) { 259 if (IS_ERR(rtc->rtc)) {
258 dev_dbg(&pdev->dev, "could not register rtc device\n"); 260 dev_dbg(&pdev->dev, "could not register rtc device\n");
259 ret = PTR_ERR(rtc->rtc); 261 ret = PTR_ERR(rtc->rtc);
260 goto out_free_irq; 262 goto out;
261 } 263 }
262 264
263 device_init_wakeup(&pdev->dev, 1); 265 device_init_wakeup(&pdev->dev, 1);
@@ -267,26 +269,15 @@ static int __init at32_rtc_probe(struct platform_device *pdev)
267 269
268 return 0; 270 return 0;
269 271
270out_free_irq:
271 platform_set_drvdata(pdev, NULL);
272 free_irq(irq, rtc);
273out_iounmap:
274 iounmap(rtc->regs);
275out: 272out:
276 kfree(rtc); 273 platform_set_drvdata(pdev, NULL);
277 return ret; 274 return ret;
278} 275}
279 276
280static int __exit at32_rtc_remove(struct platform_device *pdev) 277static int __exit at32_rtc_remove(struct platform_device *pdev)
281{ 278{
282 struct rtc_at32ap700x *rtc = platform_get_drvdata(pdev);
283
284 device_init_wakeup(&pdev->dev, 0); 279 device_init_wakeup(&pdev->dev, 0);
285 280
286 free_irq(rtc->irq, rtc);
287 iounmap(rtc->regs);
288 rtc_device_unregister(rtc->rtc);
289 kfree(rtc);
290 platform_set_drvdata(pdev, NULL); 281 platform_set_drvdata(pdev, NULL);
291 282
292 return 0; 283 return 0;
@@ -302,17 +293,7 @@ static struct platform_driver at32_rtc_driver = {
302 }, 293 },
303}; 294};
304 295
305static int __init at32_rtc_init(void) 296module_platform_driver_probe(at32_rtc_driver, at32_rtc_probe);
306{
307 return platform_driver_probe(&at32_rtc_driver, at32_rtc_probe);
308}
309module_init(at32_rtc_init);
310
311static void __exit at32_rtc_exit(void)
312{
313 platform_driver_unregister(&at32_rtc_driver);
314}
315module_exit(at32_rtc_exit);
316 297
317MODULE_AUTHOR("Hans-Christian Egtvedt <hcegtvedt@atmel.com>"); 298MODULE_AUTHOR("Hans-Christian Egtvedt <hcegtvedt@atmel.com>");
318MODULE_DESCRIPTION("Real time clock for AVR32 AT32AP700x"); 299MODULE_DESCRIPTION("Real time clock for AVR32 AT32AP700x");