diff options
Diffstat (limited to 'drivers/rtc')
| -rw-r--r-- | drivers/rtc/rtc-asm9260.c | 1 | ||||
| -rw-r--r-- | drivers/rtc/rtc-cmos.c | 15 | ||||
| -rw-r--r-- | drivers/rtc/rtc-omap.c | 38 | 
3 files changed, 39 insertions, 15 deletions
diff --git a/drivers/rtc/rtc-asm9260.c b/drivers/rtc/rtc-asm9260.c index 18a93d3e3f93..d36534965635 100644 --- a/drivers/rtc/rtc-asm9260.c +++ b/drivers/rtc/rtc-asm9260.c @@ -327,6 +327,7 @@ static const struct of_device_id asm9260_dt_ids[] = {  	{ .compatible = "alphascale,asm9260-rtc", },  	{}  }; +MODULE_DEVICE_TABLE(of, asm9260_dt_ids);  static struct platform_driver asm9260_rtc_driver = {  	.probe		= asm9260_rtc_probe, diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c index dd3d59806ffa..7030d7cd3861 100644 --- a/drivers/rtc/rtc-cmos.c +++ b/drivers/rtc/rtc-cmos.c @@ -776,7 +776,7 @@ static void cmos_do_shutdown(int rtc_irq)  	spin_unlock_irq(&rtc_lock);  } -static void __exit cmos_do_remove(struct device *dev) +static void cmos_do_remove(struct device *dev)  {  	struct cmos_rtc	*cmos = dev_get_drvdata(dev);  	struct resource *ports; @@ -996,8 +996,9 @@ static u32 rtc_handler(void *context)  	struct cmos_rtc *cmos = dev_get_drvdata(dev);  	unsigned char rtc_control = 0;  	unsigned char rtc_intr; +	unsigned long flags; -	spin_lock_irq(&rtc_lock); +	spin_lock_irqsave(&rtc_lock, flags);  	if (cmos_rtc.suspend_ctrl)  		rtc_control = CMOS_READ(RTC_CONTROL);  	if (rtc_control & RTC_AIE) { @@ -1006,7 +1007,7 @@ static u32 rtc_handler(void *context)  		rtc_intr = CMOS_READ(RTC_INTR_FLAGS);  		rtc_update_irq(cmos->rtc, 1, rtc_intr);  	} -	spin_unlock_irq(&rtc_lock); +	spin_unlock_irqrestore(&rtc_lock, flags);  	pm_wakeup_event(dev, 0);  	acpi_clear_event(ACPI_EVENT_RTC); @@ -1129,7 +1130,7 @@ static int cmos_pnp_probe(struct pnp_dev *pnp, const struct pnp_device_id *id)  				pnp_irq(pnp, 0));  } -static void __exit cmos_pnp_remove(struct pnp_dev *pnp) +static void cmos_pnp_remove(struct pnp_dev *pnp)  {  	cmos_do_remove(&pnp->dev);  } @@ -1161,7 +1162,7 @@ static struct pnp_driver cmos_pnp_driver = {  	.name		= (char *) driver_name,  	.id_table	= rtc_ids,  	.probe		= cmos_pnp_probe, -	.remove		= __exit_p(cmos_pnp_remove), +	.remove		= cmos_pnp_remove,  	.shutdown	= cmos_pnp_shutdown,  	/* flag ensures resume() gets called, and stops syslog spam */ @@ -1238,7 +1239,7 @@ static int __init cmos_platform_probe(struct platform_device *pdev)  	return cmos_do_probe(&pdev->dev, resource, irq);  } -static int __exit cmos_platform_remove(struct platform_device *pdev) +static int cmos_platform_remove(struct platform_device *pdev)  {  	cmos_do_remove(&pdev->dev);  	return 0; @@ -1263,7 +1264,7 @@ static void cmos_platform_shutdown(struct platform_device *pdev)  MODULE_ALIAS("platform:rtc_cmos");  static struct platform_driver cmos_platform_driver = { -	.remove		= __exit_p(cmos_platform_remove), +	.remove		= cmos_platform_remove,  	.shutdown	= cmos_platform_shutdown,  	.driver = {  		.name		= driver_name, diff --git a/drivers/rtc/rtc-omap.c b/drivers/rtc/rtc-omap.c index b04ea9b5ae67..51e52446eacb 100644 --- a/drivers/rtc/rtc-omap.c +++ b/drivers/rtc/rtc-omap.c @@ -113,6 +113,7 @@  /* OMAP_RTC_OSC_REG bit fields: */  #define OMAP_RTC_OSC_32KCLK_EN		BIT(6)  #define OMAP_RTC_OSC_SEL_32KCLK_SRC	BIT(3) +#define OMAP_RTC_OSC_OSC32K_GZ_DISABLE	BIT(4)  /* OMAP_RTC_IRQWAKEEN bit fields: */  #define OMAP_RTC_IRQWAKEEN_ALARM_WAKEEN	BIT(1) @@ -146,6 +147,7 @@ struct omap_rtc {  	u8 interrupts_reg;  	bool is_pmic_controller;  	bool has_ext_clk; +	bool is_suspending;  	const struct omap_rtc_device_type *type;  	struct pinctrl_dev *pctldev;  }; @@ -786,8 +788,9 @@ static int omap_rtc_probe(struct platform_device *pdev)  	 */  	if (rtc->has_ext_clk) {  		reg = rtc_read(rtc, OMAP_RTC_OSC_REG); -		rtc_write(rtc, OMAP_RTC_OSC_REG, -			  reg | OMAP_RTC_OSC_SEL_32KCLK_SRC); +		reg &= ~OMAP_RTC_OSC_OSC32K_GZ_DISABLE; +		reg |= OMAP_RTC_OSC_32KCLK_EN | OMAP_RTC_OSC_SEL_32KCLK_SRC; +		rtc_writel(rtc, OMAP_RTC_OSC_REG, reg);  	}  	rtc->type->lock(rtc); @@ -898,8 +901,7 @@ static int omap_rtc_suspend(struct device *dev)  		rtc_write(rtc, OMAP_RTC_INTERRUPTS_REG, 0);  	rtc->type->lock(rtc); -	/* Disable the clock/module */ -	pm_runtime_put_sync(dev); +	rtc->is_suspending = true;  	return 0;  } @@ -908,9 +910,6 @@ static int omap_rtc_resume(struct device *dev)  {  	struct omap_rtc *rtc = dev_get_drvdata(dev); -	/* Enable the clock/module so that we can access the registers */ -	pm_runtime_get_sync(dev); -  	rtc->type->unlock(rtc);  	if (device_may_wakeup(dev))  		disable_irq_wake(rtc->irq_alarm); @@ -918,11 +917,34 @@ static int omap_rtc_resume(struct device *dev)  		rtc_write(rtc, OMAP_RTC_INTERRUPTS_REG, rtc->interrupts_reg);  	rtc->type->lock(rtc); +	rtc->is_suspending = false; +  	return 0;  }  #endif -static SIMPLE_DEV_PM_OPS(omap_rtc_pm_ops, omap_rtc_suspend, omap_rtc_resume); +#ifdef CONFIG_PM +static int omap_rtc_runtime_suspend(struct device *dev) +{ +	struct omap_rtc *rtc = dev_get_drvdata(dev); + +	if (rtc->is_suspending && !rtc->has_ext_clk) +		return -EBUSY; + +	return 0; +} + +static int omap_rtc_runtime_resume(struct device *dev) +{ +	return 0; +} +#endif + +static const struct dev_pm_ops omap_rtc_pm_ops = { +	SET_SYSTEM_SLEEP_PM_OPS(omap_rtc_suspend, omap_rtc_resume) +	SET_RUNTIME_PM_OPS(omap_rtc_runtime_suspend, +			   omap_rtc_runtime_resume, NULL) +};  static void omap_rtc_shutdown(struct platform_device *pdev)  {  | 
