Commit f4e708ae8e5f3eb98f4c53036c0a470717bbc709
Committed by
John Stultz
1 parent
5f54c8a00a
Exists in
master
and in
4 other branches
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>
Showing 1 changed file with 3 additions and 2 deletions Side-by-side Diff
drivers/rtc/rtc-davinci.c
... | ... | @@ -524,6 +524,8 @@ |
524 | 524 | goto fail2; |
525 | 525 | } |
526 | 526 | |
527 | + platform_set_drvdata(pdev, davinci_rtc); | |
528 | + | |
527 | 529 | davinci_rtc->rtc = rtc_device_register(pdev->name, &pdev->dev, |
528 | 530 | &davinci_rtc_ops, THIS_MODULE); |
529 | 531 | if (IS_ERR(davinci_rtc->rtc)) { |
... | ... | @@ -553,8 +555,6 @@ |
553 | 555 | |
554 | 556 | rtcss_write(davinci_rtc, PRTCSS_RTC_CCTRL_CAEN, PRTCSS_RTC_CCTRL); |
555 | 557 | |
556 | - platform_set_drvdata(pdev, davinci_rtc); | |
557 | - | |
558 | 558 | device_init_wakeup(&pdev->dev, 0); |
559 | 559 | |
560 | 560 | return 0; |
... | ... | @@ -562,6 +562,7 @@ |
562 | 562 | fail4: |
563 | 563 | rtc_device_unregister(davinci_rtc->rtc); |
564 | 564 | fail3: |
565 | + platform_set_drvdata(pdev, NULL); | |
565 | 566 | iounmap(davinci_rtc->base); |
566 | 567 | fail2: |
567 | 568 | release_mem_region(davinci_rtc->pbase, davinci_rtc->base_size); |