diff options
| author | Wolfram Sang <w.sang@pengutronix.de> | 2011-05-05 05:46:14 -0400 |
|---|---|---|
| committer | John Stultz <john.stultz@linaro.org> | 2011-05-06 20:41:06 -0400 |
| commit | f4e708ae8e5f3eb98f4c53036c0a470717bbc709 (patch) | |
| tree | 656687d744a5b89e85a44d4d9a71f29d71163015 | |
| parent | 5f54c8a00af20e5cf38c3e5ef2f59b6848a17cd9 (diff) | |
rtc: davinci: Initialize drvdata before registering device
Commit f44f7f96a20 ("RTC: Initialize kernel state from RTC") uncovered
an issue in a number of RTC drivers, where the drivers call
rtc_device_register before initializing the device or platform drvdata.
This frequently results in null pointer dereferences when the
rtc_device_register immediately makes use of the rtc device, calling
rtc_read_alarm.
The solution is to ensure the drvdata is initialized prior to registering
the rtc device.
CC: Alessandro Zummo <a.zummo@towertech.it>
CC: Thomas Gleixner <tglx@linutronix.de>
CC: rtc-linux@googlegroups.com
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
[fixed up commit log -jstultz]
Signed-off-by: John Stultz <john.stultz@linaro.org>
| -rw-r--r-- | drivers/rtc/rtc-davinci.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/rtc/rtc-davinci.c b/drivers/rtc/rtc-davinci.c index 8d46838dff8a..755e1fe914af 100644 --- a/drivers/rtc/rtc-davinci.c +++ b/drivers/rtc/rtc-davinci.c | |||
| @@ -524,6 +524,8 @@ static int __init davinci_rtc_probe(struct platform_device *pdev) | |||
| 524 | goto fail2; | 524 | goto fail2; |
| 525 | } | 525 | } |
| 526 | 526 | ||
| 527 | platform_set_drvdata(pdev, davinci_rtc); | ||
| 528 | |||
| 527 | davinci_rtc->rtc = rtc_device_register(pdev->name, &pdev->dev, | 529 | davinci_rtc->rtc = rtc_device_register(pdev->name, &pdev->dev, |
| 528 | &davinci_rtc_ops, THIS_MODULE); | 530 | &davinci_rtc_ops, THIS_MODULE); |
| 529 | if (IS_ERR(davinci_rtc->rtc)) { | 531 | if (IS_ERR(davinci_rtc->rtc)) { |
| @@ -553,8 +555,6 @@ static int __init davinci_rtc_probe(struct platform_device *pdev) | |||
| 553 | 555 | ||
| 554 | rtcss_write(davinci_rtc, PRTCSS_RTC_CCTRL_CAEN, PRTCSS_RTC_CCTRL); | 556 | rtcss_write(davinci_rtc, PRTCSS_RTC_CCTRL_CAEN, PRTCSS_RTC_CCTRL); |
| 555 | 557 | ||
| 556 | platform_set_drvdata(pdev, davinci_rtc); | ||
| 557 | |||
| 558 | device_init_wakeup(&pdev->dev, 0); | 558 | device_init_wakeup(&pdev->dev, 0); |
| 559 | 559 | ||
| 560 | return 0; | 560 | return 0; |
| @@ -562,6 +562,7 @@ static int __init davinci_rtc_probe(struct platform_device *pdev) | |||
| 562 | fail4: | 562 | fail4: |
| 563 | rtc_device_unregister(davinci_rtc->rtc); | 563 | rtc_device_unregister(davinci_rtc->rtc); |
| 564 | fail3: | 564 | fail3: |
| 565 | platform_set_drvdata(pdev, NULL); | ||
| 565 | iounmap(davinci_rtc->base); | 566 | iounmap(davinci_rtc->base); |
| 566 | fail2: | 567 | fail2: |
| 567 | release_mem_region(davinci_rtc->pbase, davinci_rtc->base_size); | 568 | release_mem_region(davinci_rtc->pbase, davinci_rtc->base_size); |
