diff options
Diffstat (limited to 'drivers/rtc/rtc-omap.c')
| -rw-r--r-- | drivers/rtc/rtc-omap.c | 81 | 
1 files changed, 20 insertions, 61 deletions
| diff --git a/drivers/rtc/rtc-omap.c b/drivers/rtc/rtc-omap.c index 600971407aa..4e1bdb832e3 100644 --- a/drivers/rtc/rtc-omap.c +++ b/drivers/rtc/rtc-omap.c @@ -324,7 +324,7 @@ MODULE_DEVICE_TABLE(of, omap_rtc_of_match);  static int __init omap_rtc_probe(struct platform_device *pdev)  { -	struct resource		*res, *mem; +	struct resource		*res;  	struct rtc_device	*rtc;  	u8			reg, new_ctrl;  	const struct platform_device_id *id_entry; @@ -352,18 +352,9 @@ static int __init omap_rtc_probe(struct platform_device *pdev)  		return -ENOENT;  	} -	mem = request_mem_region(res->start, resource_size(res), pdev->name); -	if (!mem) { -		pr_debug("%s: RTC registers at %08x are not free\n", -			pdev->name, res->start); -		return -EBUSY; -	} - -	rtc_base = ioremap(res->start, resource_size(res)); -	if (!rtc_base) { -		pr_debug("%s: RTC registers can't be mapped\n", pdev->name); -		goto fail; -	} +	rtc_base = devm_ioremap_resource(&pdev->dev, res); +	if (IS_ERR(rtc_base)) +		return PTR_ERR(rtc_base);  	/* Enable the clock/module so that we can access the registers */  	pm_runtime_enable(&pdev->dev); @@ -375,7 +366,7 @@ static int __init omap_rtc_probe(struct platform_device *pdev)  		rtc_writel(KICK1_VALUE, OMAP_RTC_KICK1_REG);  	} -	rtc = rtc_device_register(pdev->name, &pdev->dev, +	rtc = devm_rtc_device_register(&pdev->dev, pdev->name,  			&omap_rtc_ops, THIS_MODULE);  	if (IS_ERR(rtc)) {  		pr_debug("%s: can't register RTC device, err %ld\n", @@ -383,7 +374,6 @@ static int __init omap_rtc_probe(struct platform_device *pdev)  		goto fail0;  	}  	platform_set_drvdata(pdev, rtc); -	dev_set_drvdata(&rtc->dev, mem);  	/* clear pending irqs, and set 1/second periodic,  	 * which we'll use instead of update irqs @@ -401,18 +391,18 @@ static int __init omap_rtc_probe(struct platform_device *pdev)  		rtc_write(OMAP_RTC_STATUS_ALARM, OMAP_RTC_STATUS_REG);  	/* handle periodic and alarm irqs */ -	if (request_irq(omap_rtc_timer, rtc_irq, 0, +	if (devm_request_irq(&pdev->dev, omap_rtc_timer, rtc_irq, 0,  			dev_name(&rtc->dev), rtc)) {  		pr_debug("%s: RTC timer interrupt IRQ%d already claimed\n",  			pdev->name, omap_rtc_timer); -		goto fail1; +		goto fail0;  	}  	if ((omap_rtc_timer != omap_rtc_alarm) && -		(request_irq(omap_rtc_alarm, rtc_irq, 0, +		(devm_request_irq(&pdev->dev, omap_rtc_alarm, rtc_irq, 0,  			dev_name(&rtc->dev), rtc))) {  		pr_debug("%s: RTC alarm interrupt IRQ%d already claimed\n",  			pdev->name, omap_rtc_alarm); -		goto fail2; +		goto fail0;  	}  	/* On boards with split power, RTC_ON_NOFF won't reset the RTC */ @@ -446,25 +436,16 @@ static int __init omap_rtc_probe(struct platform_device *pdev)  	return 0; -fail2: -	free_irq(omap_rtc_timer, rtc); -fail1: -	rtc_device_unregister(rtc);  fail0:  	if (id_entry && (id_entry->driver_data & OMAP_RTC_HAS_KICKER))  		rtc_writel(0, OMAP_RTC_KICK0_REG);  	pm_runtime_put_sync(&pdev->dev);  	pm_runtime_disable(&pdev->dev); -	iounmap(rtc_base); -fail: -	release_mem_region(mem->start, resource_size(mem));  	return -EIO;  }  static int __exit omap_rtc_remove(struct platform_device *pdev)  { -	struct rtc_device	*rtc = platform_get_drvdata(pdev); -	struct resource		*mem = dev_get_drvdata(&rtc->dev);  	const struct platform_device_id *id_entry =  				platform_get_device_id(pdev); @@ -473,12 +454,6 @@ static int __exit omap_rtc_remove(struct platform_device *pdev)  	/* leave rtc running, but disable irqs */  	rtc_write(0, OMAP_RTC_INTERRUPTS_REG); -	free_irq(omap_rtc_timer, rtc); - -	if (omap_rtc_timer != omap_rtc_alarm) -		free_irq(omap_rtc_alarm, rtc); - -	rtc_device_unregister(rtc);  	if (id_entry && (id_entry->driver_data & OMAP_RTC_HAS_KICKER))  		rtc_writel(0, OMAP_RTC_KICK0_REG); @@ -486,16 +461,13 @@ static int __exit omap_rtc_remove(struct platform_device *pdev)  	pm_runtime_put_sync(&pdev->dev);  	pm_runtime_disable(&pdev->dev); -	iounmap(rtc_base); -	release_mem_region(mem->start, resource_size(mem));  	return 0;  } -#ifdef CONFIG_PM - +#ifdef CONFIG_PM_SLEEP  static u8 irqstat; -static int omap_rtc_suspend(struct platform_device *pdev, pm_message_t state) +static int omap_rtc_suspend(struct device *dev)  {  	irqstat = rtc_read(OMAP_RTC_INTERRUPTS_REG); @@ -503,34 +475,32 @@ static int omap_rtc_suspend(struct platform_device *pdev, pm_message_t state)  	 * source, and in fact this enable() call is just saving a flag  	 * that's never used...  	 */ -	if (device_may_wakeup(&pdev->dev)) +	if (device_may_wakeup(dev))  		enable_irq_wake(omap_rtc_alarm);  	else  		rtc_write(0, OMAP_RTC_INTERRUPTS_REG);  	/* Disable the clock/module */ -	pm_runtime_put_sync(&pdev->dev); +	pm_runtime_put_sync(dev);  	return 0;  } -static int omap_rtc_resume(struct platform_device *pdev) +static int omap_rtc_resume(struct device *dev)  {  	/* Enable the clock/module so that we can access the registers */ -	pm_runtime_get_sync(&pdev->dev); +	pm_runtime_get_sync(dev); -	if (device_may_wakeup(&pdev->dev)) +	if (device_may_wakeup(dev))  		disable_irq_wake(omap_rtc_alarm);  	else  		rtc_write(irqstat, OMAP_RTC_INTERRUPTS_REG);  	return 0;  } - -#else -#define omap_rtc_suspend NULL -#define omap_rtc_resume  NULL  #endif +static SIMPLE_DEV_PM_OPS(omap_rtc_pm_ops, omap_rtc_suspend, omap_rtc_resume); +  static void omap_rtc_shutdown(struct platform_device *pdev)  {  	rtc_write(0, OMAP_RTC_INTERRUPTS_REG); @@ -539,28 +509,17 @@ static void omap_rtc_shutdown(struct platform_device *pdev)  MODULE_ALIAS("platform:omap_rtc");  static struct platform_driver omap_rtc_driver = {  	.remove		= __exit_p(omap_rtc_remove), -	.suspend	= omap_rtc_suspend, -	.resume		= omap_rtc_resume,  	.shutdown	= omap_rtc_shutdown,  	.driver		= {  		.name	= DRIVER_NAME,  		.owner	= THIS_MODULE, +		.pm	= &omap_rtc_pm_ops,  		.of_match_table = of_match_ptr(omap_rtc_of_match),  	},  	.id_table	= omap_rtc_devtype,  }; -static int __init rtc_init(void) -{ -	return platform_driver_probe(&omap_rtc_driver, omap_rtc_probe); -} -module_init(rtc_init); - -static void __exit rtc_exit(void) -{ -	platform_driver_unregister(&omap_rtc_driver); -} -module_exit(rtc_exit); +module_platform_driver_probe(omap_rtc_driver, omap_rtc_probe);  MODULE_AUTHOR("George G. Davis (and others)");  MODULE_LICENSE("GPL"); | 
