diff options
| author | Alexander Shiyan <shc_work@mail.ru> | 2014-04-03 17:49:57 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-04-03 19:21:20 -0400 |
| commit | 589e501439f9866b4bc415743b0ae0bb9a461c69 (patch) | |
| tree | aa56c1a2b0fbc1528497d4d08e1aedd52667a92a /drivers/rtc | |
| parent | 77bf2ea8de78ce7dd842409a847b888e720f62d8 (diff) | |
rtc: mc13xxx: request IRQs after RTC registration
Interrupts can appear after request_irq and interrupt handlers can use
the RTC device, but currently we register RTC after IRQs. This patch
changes this order and simplify error path a bit.
Signed-off-by: Alexander Shiyan <shc_work@mail.ru>
Cc: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Cc: Sascha Hauer <kernel@pengutronix.de>
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-mc13xxx.c | 32 |
1 files changed, 11 insertions, 21 deletions
diff --git a/drivers/rtc/rtc-mc13xxx.c b/drivers/rtc/rtc-mc13xxx.c index 480d51f71064..6b5d7d43af89 100644 --- a/drivers/rtc/rtc-mc13xxx.c +++ b/drivers/rtc/rtc-mc13xxx.c | |||
| @@ -325,6 +325,11 @@ static int __init mc13xxx_rtc_probe(struct platform_device *pdev) | |||
| 325 | 325 | ||
| 326 | platform_set_drvdata(pdev, priv); | 326 | platform_set_drvdata(pdev, priv); |
| 327 | 327 | ||
| 328 | priv->rtc = devm_rtc_device_register(&pdev->dev, pdev->name, | ||
| 329 | &mc13xxx_rtc_ops, THIS_MODULE); | ||
| 330 | if (IS_ERR(priv->rtc)) | ||
| 331 | return PTR_ERR(priv->rtc); | ||
| 332 | |||
| 328 | mc13xxx_lock(mc13xxx); | 333 | mc13xxx_lock(mc13xxx); |
| 329 | 334 | ||
| 330 | ret = mc13xxx_irq_request(mc13xxx, MC13XXX_IRQ_RTCRST, | 335 | ret = mc13xxx_irq_request(mc13xxx, MC13XXX_IRQ_RTCRST, |
| @@ -342,35 +347,20 @@ static int __init mc13xxx_rtc_probe(struct platform_device *pdev) | |||
| 342 | ret = mc13xxx_irq_request_nounmask(mc13xxx, MC13XXX_IRQ_1HZ, | 347 | ret = mc13xxx_irq_request_nounmask(mc13xxx, MC13XXX_IRQ_1HZ, |
| 343 | mc13xxx_rtc_update_handler, DRIVER_NAME, priv); | 348 | mc13xxx_rtc_update_handler, DRIVER_NAME, priv); |
| 344 | if (ret) | 349 | if (ret) |
| 345 | goto err_update_irq_request; | 350 | goto err_reset_irq_status; |
| 346 | 351 | ||
| 347 | ret = mc13xxx_irq_request_nounmask(mc13xxx, MC13XXX_IRQ_TODA, | 352 | ret = mc13xxx_irq_request_nounmask(mc13xxx, MC13XXX_IRQ_TODA, |
| 348 | mc13xxx_rtc_alarm_handler, DRIVER_NAME, priv); | 353 | mc13xxx_rtc_alarm_handler, DRIVER_NAME, priv); |
| 349 | if (ret) | 354 | if (!ret) |
| 350 | goto err_alarm_irq_request; | 355 | goto err_reset_irq_request; |
| 351 | |||
| 352 | mc13xxx_unlock(mc13xxx); | ||
| 353 | |||
| 354 | priv->rtc = devm_rtc_device_register(&pdev->dev, pdev->name, | ||
| 355 | &mc13xxx_rtc_ops, THIS_MODULE); | ||
| 356 | if (IS_ERR(priv->rtc)) { | ||
| 357 | ret = PTR_ERR(priv->rtc); | ||
| 358 | |||
| 359 | mc13xxx_lock(mc13xxx); | ||
| 360 | |||
| 361 | mc13xxx_irq_free(mc13xxx, MC13XXX_IRQ_TODA, priv); | ||
| 362 | err_alarm_irq_request: | ||
| 363 | 356 | ||
| 364 | mc13xxx_irq_free(mc13xxx, MC13XXX_IRQ_1HZ, priv); | 357 | mc13xxx_irq_free(mc13xxx, MC13XXX_IRQ_1HZ, priv); |
| 365 | err_update_irq_request: | ||
| 366 | 358 | ||
| 367 | err_reset_irq_status: | 359 | err_reset_irq_status: |
| 360 | mc13xxx_irq_free(mc13xxx, MC13XXX_IRQ_RTCRST, priv); | ||
| 368 | 361 | ||
| 369 | mc13xxx_irq_free(mc13xxx, MC13XXX_IRQ_RTCRST, priv); | ||
| 370 | err_reset_irq_request: | 362 | err_reset_irq_request: |
| 371 | 363 | mc13xxx_unlock(mc13xxx); | |
| 372 | mc13xxx_unlock(mc13xxx); | ||
| 373 | } | ||
| 374 | 364 | ||
| 375 | return ret; | 365 | return ret; |
| 376 | } | 366 | } |
