diff options
Diffstat (limited to 'drivers/rtc/rtc-mpc5121.c')
-rw-r--r-- | drivers/rtc/rtc-mpc5121.c | 20 |
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: | |||
377 | out_dispose: | 376 | out_dispose: |
378 | irq_dispose_mapping(rtc->irq); | 377 | irq_dispose_mapping(rtc->irq); |
379 | iounmap(rtc->regs); | 378 | iounmap(rtc->regs); |
380 | out_free: | ||
381 | kfree(rtc); | ||
382 | 379 | ||
383 | return err; | 380 | return err; |
384 | } | 381 | } |
385 | 382 | ||
386 | static int mpc5121_rtc_remove(struct platform_device *op) | 383 | static 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(®s->alm_enable, 0); | 389 | out_8(®s->alm_enable, 0); |
393 | out_8(®s->int_enable, in_8(®s->int_enable) & ~0x1); | 390 | out_8(®s->int_enable, in_8(®s->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 | } |