rtc: mxc: Initialize drvdata before registering device
Commit f44f7f96a2 ("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>
			
			
This commit is contained in:
		
							parent
							
								
									5895198c56
								
							
						
					
					
						commit
						5f54c8a00a
					
				| @ -418,14 +418,6 @@ static int __init mxc_rtc_probe(struct platform_device *pdev) | ||||
| 		goto exit_put_clk; | ||||
| 	} | ||||
| 
 | ||||
| 	rtc = rtc_device_register(pdev->name, &pdev->dev, &mxc_rtc_ops, | ||||
| 				  THIS_MODULE); | ||||
| 	if (IS_ERR(rtc)) { | ||||
| 		ret = PTR_ERR(rtc); | ||||
| 		goto exit_put_clk; | ||||
| 	} | ||||
| 
 | ||||
| 	pdata->rtc = rtc; | ||||
| 	platform_set_drvdata(pdev, pdata); | ||||
| 
 | ||||
| 	/* Configure and enable the RTC */ | ||||
| @ -438,8 +430,19 @@ static int __init mxc_rtc_probe(struct platform_device *pdev) | ||||
| 		pdata->irq = -1; | ||||
| 	} | ||||
| 
 | ||||
| 	rtc = rtc_device_register(pdev->name, &pdev->dev, &mxc_rtc_ops, | ||||
| 				  THIS_MODULE); | ||||
| 	if (IS_ERR(rtc)) { | ||||
| 		ret = PTR_ERR(rtc); | ||||
| 		goto exit_clr_drvdata; | ||||
| 	} | ||||
| 
 | ||||
| 	pdata->rtc = rtc; | ||||
| 
 | ||||
| 	return 0; | ||||
| 
 | ||||
| exit_clr_drvdata: | ||||
| 	platform_set_drvdata(pdev, NULL); | ||||
| exit_put_clk: | ||||
| 	clk_disable(pdata->clk); | ||||
| 	clk_put(pdata->clk); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user