diff options
Diffstat (limited to 'drivers/rtc/rtc-sirfsoc.c')
| -rw-r--r-- | drivers/rtc/rtc-sirfsoc.c | 93 | 
1 files changed, 18 insertions, 75 deletions
diff --git a/drivers/rtc/rtc-sirfsoc.c b/drivers/rtc/rtc-sirfsoc.c index 63460cf80f1..76e38007ba9 100644 --- a/drivers/rtc/rtc-sirfsoc.c +++ b/drivers/rtc/rtc-sirfsoc.c @@ -59,7 +59,7 @@ static int sirfsoc_rtc_read_alarm(struct device *dev,  	unsigned long rtc_alarm, rtc_count;  	struct sirfsoc_rtc_drv *rtcdrv; -	rtcdrv = (struct sirfsoc_rtc_drv *)dev_get_drvdata(dev); +	rtcdrv = dev_get_drvdata(dev);  	local_irq_disable(); @@ -94,7 +94,7 @@ static int sirfsoc_rtc_set_alarm(struct device *dev,  {  	unsigned long rtc_status_reg, rtc_alarm;  	struct sirfsoc_rtc_drv *rtcdrv; -	rtcdrv = (struct sirfsoc_rtc_drv *)dev_get_drvdata(dev); +	rtcdrv = dev_get_drvdata(dev);  	if (alrm->enabled) {  		rtc_tm_to_time(&(alrm->time), &rtc_alarm); @@ -157,7 +157,7 @@ static int sirfsoc_rtc_read_time(struct device *dev,  {  	unsigned long tmp_rtc = 0;  	struct sirfsoc_rtc_drv *rtcdrv; -	rtcdrv = (struct sirfsoc_rtc_drv *)dev_get_drvdata(dev); +	rtcdrv = dev_get_drvdata(dev);  	/*  	 * This patch is taken from WinCE - Need to validate this for  	 * correctness. To work around sirfsoc RTC counter double sync logic @@ -178,7 +178,7 @@ static int sirfsoc_rtc_set_time(struct device *dev,  {  	unsigned long rtc_time;  	struct sirfsoc_rtc_drv *rtcdrv; -	rtcdrv = (struct sirfsoc_rtc_drv *)dev_get_drvdata(dev); +	rtcdrv = dev_get_drvdata(dev);  	rtc_tm_to_time(tm, &rtc_time); @@ -264,17 +264,13 @@ static int sirfsoc_rtc_probe(struct platform_device *pdev)  	rtcdrv = devm_kzalloc(&pdev->dev,  		sizeof(struct sirfsoc_rtc_drv), GFP_KERNEL); -	if (rtcdrv == NULL) { -		dev_err(&pdev->dev, -			"%s: can't alloc mem for drv struct\n", -			pdev->name); +	if (rtcdrv == NULL)  		return -ENOMEM; -	}  	err = of_property_read_u32(np, "reg", &rtcdrv->rtc_base);  	if (err) {  		dev_err(&pdev->dev, "unable to find base address of rtc node in dtb\n"); -		goto error; +		return err;  	}  	platform_set_drvdata(pdev, rtcdrv); @@ -290,7 +286,7 @@ static int sirfsoc_rtc_probe(struct platform_device *pdev)  	rtc_div = ((32768 / RTC_HZ) / 2) - 1;  	sirfsoc_rtc_iobrg_writel(rtc_div, rtcdrv->rtc_base + RTC_DIV); -	rtcdrv->rtc = rtc_device_register(pdev->name, &(pdev->dev), +	rtcdrv->rtc = devm_rtc_device_register(&pdev->dev, pdev->name,  			&sirfsoc_rtc_ops, THIS_MODULE);  	if (IS_ERR(rtcdrv->rtc)) {  		err = PTR_ERR(rtcdrv->rtc); @@ -322,61 +318,42 @@ static int sirfsoc_rtc_probe(struct platform_device *pdev)  			rtcdrv);  	if (err) {  		dev_err(&pdev->dev, "Unable to register for the SiRF SOC RTC IRQ\n"); -		goto error; +		return err;  	}  	return 0; - -error: -	if (rtcdrv->rtc) -		rtc_device_unregister(rtcdrv->rtc); - -	return err;  }  static int sirfsoc_rtc_remove(struct platform_device *pdev)  { -	struct sirfsoc_rtc_drv *rtcdrv = platform_get_drvdata(pdev); -  	device_init_wakeup(&pdev->dev, 0); -	rtc_device_unregister(rtcdrv->rtc);  	return 0;  } -#ifdef CONFIG_PM - +#ifdef CONFIG_PM_SLEEP  static int sirfsoc_rtc_suspend(struct device *dev)  { -	struct platform_device *pdev = to_platform_device(dev); -	struct sirfsoc_rtc_drv *rtcdrv = platform_get_drvdata(pdev); +	struct sirfsoc_rtc_drv *rtcdrv = dev_get_drvdata(dev);  	rtcdrv->overflow_rtc =  		sirfsoc_rtc_iobrg_readl(rtcdrv->rtc_base + RTC_SW_VALUE);  	rtcdrv->saved_counter =  		sirfsoc_rtc_iobrg_readl(rtcdrv->rtc_base + RTC_CN);  	rtcdrv->saved_overflow_rtc = rtcdrv->overflow_rtc; -	if (device_may_wakeup(&pdev->dev) && !enable_irq_wake(rtcdrv->irq)) +	if (device_may_wakeup(dev) && !enable_irq_wake(rtcdrv->irq))  		rtcdrv->irq_wake = 1;  	return 0;  } -static int sirfsoc_rtc_freeze(struct device *dev) -{ -	sirfsoc_rtc_suspend(dev); - -	return 0; -} - -static int sirfsoc_rtc_thaw(struct device *dev) +static int sirfsoc_rtc_resume(struct device *dev)  {  	u32 tmp; -	struct sirfsoc_rtc_drv *rtcdrv; -	rtcdrv = (struct sirfsoc_rtc_drv *)dev_get_drvdata(dev); +	struct sirfsoc_rtc_drv *rtcdrv = dev_get_drvdata(dev);  	/* -	 * if resume from snapshot and the rtc power is losed, +	 * if resume from snapshot and the rtc power is lost,  	 * restroe the rtc settings  	 */  	if (SIRFSOC_RTC_CLK != sirfsoc_rtc_iobrg_readl( @@ -416,58 +393,24 @@ static int sirfsoc_rtc_thaw(struct device *dev)  	sirfsoc_rtc_iobrg_writel(rtcdrv->overflow_rtc,  			rtcdrv->rtc_base + RTC_SW_VALUE); -	return 0; -} - -static int sirfsoc_rtc_resume(struct device *dev) -{ -	struct platform_device *pdev = to_platform_device(dev); -	struct sirfsoc_rtc_drv *rtcdrv = platform_get_drvdata(pdev); -	sirfsoc_rtc_thaw(dev); -	if (device_may_wakeup(&pdev->dev) && rtcdrv->irq_wake) { +	if (device_may_wakeup(dev) && rtcdrv->irq_wake) {  		disable_irq_wake(rtcdrv->irq);  		rtcdrv->irq_wake = 0;  	}  	return 0;  } - -static int sirfsoc_rtc_restore(struct device *dev) -{ -	struct platform_device *pdev = to_platform_device(dev); -	struct sirfsoc_rtc_drv *rtcdrv = platform_get_drvdata(pdev); - -	if (device_may_wakeup(&pdev->dev) && rtcdrv->irq_wake) { -		disable_irq_wake(rtcdrv->irq); -		rtcdrv->irq_wake = 0; -	} -	return 0; -} - -#else -#define sirfsoc_rtc_suspend	NULL -#define sirfsoc_rtc_resume	NULL -#define sirfsoc_rtc_freeze	NULL -#define sirfsoc_rtc_thaw	NULL -#define sirfsoc_rtc_restore	NULL  #endif -static const struct dev_pm_ops sirfsoc_rtc_pm_ops = { -	.suspend = sirfsoc_rtc_suspend, -	.resume = sirfsoc_rtc_resume, -	.freeze = sirfsoc_rtc_freeze, -	.thaw = sirfsoc_rtc_thaw, -	.restore = sirfsoc_rtc_restore, -}; +static SIMPLE_DEV_PM_OPS(sirfsoc_rtc_pm_ops, +		sirfsoc_rtc_suspend, sirfsoc_rtc_resume);  static struct platform_driver sirfsoc_rtc_driver = {  	.driver = {  		.name = "sirfsoc-rtc",  		.owner = THIS_MODULE, -#ifdef CONFIG_PM  		.pm = &sirfsoc_rtc_pm_ops, -#endif -		.of_match_table = of_match_ptr(sirfsoc_rtc_of_match), +		.of_match_table = sirfsoc_rtc_of_match,  	},  	.probe = sirfsoc_rtc_probe,  	.remove = sirfsoc_rtc_remove,  | 
