aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rtc/rtc-mpc5121.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/rtc/rtc-mpc5121.c')
-rw-r--r--drivers/rtc/rtc-mpc5121.c20
1 files changed, 7 insertions, 13 deletions
diff --git a/drivers/rtc/rtc-mpc5121.c b/drivers/rtc/rtc-mpc5121.c
index bdcc60830aec..9c8f60903799 100644
--- a/drivers/rtc/rtc-mpc5121.c
+++ b/drivers/rtc/rtc-mpc5121.c
@@ -68,7 +68,7 @@ struct mpc5121_rtc_regs {
68 u32 target_time; /* RTC + 0x20 */ 68 u32 target_time; /* RTC + 0x20 */
69 /* 69 /*
70 * actual_time: 70 * actual_time:
71 * readonly time since VBAT_RTC was last connected 71 * readonly time since VBAT_RTC was last connected
72 */ 72 */
73 u32 actual_time; /* RTC + 0x24 */ 73 u32 actual_time; /* RTC + 0x24 */
74 u32 keep_alive; /* RTC + 0x28 */ 74 u32 keep_alive; /* RTC + 0x28 */
@@ -312,20 +312,19 @@ static int mpc5121_rtc_probe(struct platform_device *op)
312 struct mpc5121_rtc_data *rtc; 312 struct mpc5121_rtc_data *rtc;
313 int err = 0; 313 int err = 0;
314 314
315 rtc = kzalloc(sizeof(*rtc), GFP_KERNEL); 315 rtc = devm_kzalloc(&op->dev, sizeof(*rtc), GFP_KERNEL);
316 if (!rtc) 316 if (!rtc)
317 return -ENOMEM; 317 return -ENOMEM;
318 318
319 rtc->regs = of_iomap(op->dev.of_node, 0); 319 rtc->regs = of_iomap(op->dev.of_node, 0);
320 if (!rtc->regs) { 320 if (!rtc->regs) {
321 dev_err(&op->dev, "%s: couldn't map io space\n", __func__); 321 dev_err(&op->dev, "%s: couldn't map io space\n", __func__);
322 err = -ENOSYS; 322 return -ENOSYS;
323 goto out_free;
324 } 323 }
325 324
326 device_init_wakeup(&op->dev, 1); 325 device_init_wakeup(&op->dev, 1);
327 326
328 dev_set_drvdata(&op->dev, rtc); 327 platform_set_drvdata(op, rtc);
329 328
330 rtc->irq = irq_of_parse_and_map(op->dev.of_node, 1); 329 rtc->irq = irq_of_parse_and_map(op->dev.of_node, 1);
331 err = request_irq(rtc->irq, mpc5121_rtc_handler, 0, 330 err = request_irq(rtc->irq, mpc5121_rtc_handler, 0,
@@ -354,10 +353,10 @@ static int mpc5121_rtc_probe(struct platform_device *op)
354 out_be32(&rtc->regs->keep_alive, ka); 353 out_be32(&rtc->regs->keep_alive, ka);
355 } 354 }
356 355
357 rtc->rtc = rtc_device_register("mpc5121-rtc", &op->dev, 356 rtc->rtc = devm_rtc_device_register(&op->dev, "mpc5121-rtc",
358 &mpc5121_rtc_ops, THIS_MODULE); 357 &mpc5121_rtc_ops, THIS_MODULE);
359 } else { 358 } else {
360 rtc->rtc = rtc_device_register("mpc5200-rtc", &op->dev, 359 rtc->rtc = devm_rtc_device_register(&op->dev, "mpc5200-rtc",
361 &mpc5200_rtc_ops, THIS_MODULE); 360 &mpc5200_rtc_ops, THIS_MODULE);
362 } 361 }
363 362
@@ -377,29 +376,24 @@ out_dispose2:
377out_dispose: 376out_dispose:
378 irq_dispose_mapping(rtc->irq); 377 irq_dispose_mapping(rtc->irq);
379 iounmap(rtc->regs); 378 iounmap(rtc->regs);
380out_free:
381 kfree(rtc);
382 379
383 return err; 380 return err;
384} 381}
385 382
386static int mpc5121_rtc_remove(struct platform_device *op) 383static int mpc5121_rtc_remove(struct platform_device *op)
387{ 384{
388 struct mpc5121_rtc_data *rtc = dev_get_drvdata(&op->dev); 385 struct mpc5121_rtc_data *rtc = platform_get_drvdata(op);
389 struct mpc5121_rtc_regs __iomem *regs = rtc->regs; 386 struct mpc5121_rtc_regs __iomem *regs = rtc->regs;
390 387
391 /* disable interrupt, so there are no nasty surprises */ 388 /* disable interrupt, so there are no nasty surprises */
392 out_8(&regs->alm_enable, 0); 389 out_8(&regs->alm_enable, 0);
393 out_8(&regs->int_enable, in_8(&regs->int_enable) & ~0x1); 390 out_8(&regs->int_enable, in_8(&regs->int_enable) & ~0x1);
394 391
395 rtc_device_unregister(rtc->rtc);
396 iounmap(rtc->regs); 392 iounmap(rtc->regs);
397 free_irq(rtc->irq, &op->dev); 393 free_irq(rtc->irq, &op->dev);
398 free_irq(rtc->irq_periodic, &op->dev); 394 free_irq(rtc->irq_periodic, &op->dev);
399 irq_dispose_mapping(rtc->irq); 395 irq_dispose_mapping(rtc->irq);
400 irq_dispose_mapping(rtc->irq_periodic); 396 irq_dispose_mapping(rtc->irq_periodic);
401 dev_set_drvdata(&op->dev, NULL);
402 kfree(rtc);
403 397
404 return 0; 398 return 0;
405} 399}