diff options
| author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2013-05-01 08:47:44 -0700 | 
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2013-05-01 08:47:44 -0700 | 
| commit | bf61c8840efe60fd8f91446860b63338fb424158 (patch) | |
| tree | 7a71832407a4f0d6346db773343f4c3ae2257b19 /drivers/rtc/rtc-tps65910.c | |
| parent | 5846115b30f3a881e542c8bfde59a699c1c13740 (diff) | |
| parent | 0c6a61657da78098472fd0eb71cc01f2387fa1bb (diff) | |
| download | olio-linux-3.10-bf61c8840efe60fd8f91446860b63338fb424158.tar.xz olio-linux-3.10-bf61c8840efe60fd8f91446860b63338fb424158.zip  | |
Merge branch 'next' into for-linus
Prepare first set of updates for 3.10 merge window.
Diffstat (limited to 'drivers/rtc/rtc-tps65910.c')
| -rw-r--r-- | drivers/rtc/rtc-tps65910.c | 65 | 
1 files changed, 30 insertions, 35 deletions
diff --git a/drivers/rtc/rtc-tps65910.c b/drivers/rtc/rtc-tps65910.c index 7a82337e4de..8bd8115329b 100644 --- a/drivers/rtc/rtc-tps65910.c +++ b/drivers/rtc/rtc-tps65910.c @@ -22,13 +22,13 @@  #include <linux/rtc.h>  #include <linux/bcd.h>  #include <linux/platform_device.h> +#include <linux/pm_runtime.h>  #include <linux/interrupt.h>  #include <linux/mfd/tps65910.h>  struct tps65910_rtc {  	struct rtc_device	*rtc; -	/* To store the list of enabled interrupts */ -	u32 irqstat; +	int irq;  };  /* Total number of RTC registers needed to set time*/ @@ -222,7 +222,7 @@ static const struct rtc_class_ops tps65910_rtc_ops = {  	.alarm_irq_enable = tps65910_rtc_alarm_irq_enable,  }; -static int __devinit tps65910_rtc_probe(struct platform_device *pdev) +static int tps65910_rtc_probe(struct platform_device *pdev)  {  	struct tps65910 *tps65910 = NULL;  	struct tps65910_rtc *tps_rtc = NULL; @@ -247,6 +247,13 @@ static int __devinit tps65910_rtc_probe(struct platform_device *pdev)  		return ret;  	dev_dbg(&pdev->dev, "Enabling rtc-tps65910.\n"); + +	/* Enable RTC digital power domain */ +	ret = regmap_update_bits(tps65910->regmap, TPS65910_DEVCTRL, +		DEVCTRL_RTC_PWDN_MASK, 0 << DEVCTRL_RTC_PWDN_SHIFT); +	if (ret < 0) +		return ret; +  	rtc_reg = TPS65910_RTC_CTRL_STOP_RTC;  	ret = regmap_write(tps65910->regmap, TPS65910_RTC_CTRL, rtc_reg);  	if (ret < 0) @@ -260,13 +267,14 @@ static int __devinit tps65910_rtc_probe(struct platform_device *pdev)  	}  	ret = devm_request_threaded_irq(&pdev->dev, irq, NULL, -		tps65910_rtc_interrupt, IRQF_TRIGGER_LOW, -		"rtc-tps65910", &pdev->dev); +		tps65910_rtc_interrupt, IRQF_TRIGGER_LOW | IRQF_EARLY_RESUME, +		dev_name(&pdev->dev), &pdev->dev);  	if (ret < 0) {  		dev_err(&pdev->dev, "IRQ is not free.\n");  		return ret;  	} -	device_init_wakeup(&pdev->dev, 1); +	tps_rtc->irq = irq; +	device_set_wakeup_capable(&pdev->dev, 1);  	tps_rtc->rtc = rtc_device_register(pdev->name, &pdev->dev,  		&tps65910_rtc_ops, THIS_MODULE); @@ -285,61 +293,48 @@ static int __devinit tps65910_rtc_probe(struct platform_device *pdev)   * Disable tps65910 RTC interrupts.   * Sets status flag to free.   */ -static int __devexit tps65910_rtc_remove(struct platform_device *pdev) +static int tps65910_rtc_remove(struct platform_device *pdev)  {  	/* leave rtc running, but disable irqs */ -	struct rtc_device *rtc = platform_get_drvdata(pdev); +	struct tps65910_rtc *tps_rtc = platform_get_drvdata(pdev); -	tps65910_rtc_alarm_irq_enable(&rtc->dev, 0); +	tps65910_rtc_alarm_irq_enable(&pdev->dev, 0); -	rtc_device_unregister(rtc); +	rtc_device_unregister(tps_rtc->rtc);  	return 0;  }  #ifdef CONFIG_PM_SLEEP -  static int tps65910_rtc_suspend(struct device *dev)  { -	struct tps65910 *tps = dev_get_drvdata(dev->parent); -	u8 alarm = TPS65910_RTC_INTERRUPTS_IT_ALARM; -	int ret; - -	/* Store current list of enabled interrupts*/ -	ret = regmap_read(tps->regmap, TPS65910_RTC_INTERRUPTS, -		&tps->rtc->irqstat); -	if (ret < 0) -		return ret; +	struct tps65910_rtc *tps_rtc = dev_get_drvdata(dev); -	/* Enable RTC ALARM interrupt only */ -	return regmap_write(tps->regmap, TPS65910_RTC_INTERRUPTS, alarm); +	if (device_may_wakeup(dev)) +		enable_irq_wake(tps_rtc->irq); +	return 0;  }  static int tps65910_rtc_resume(struct device *dev)  { -	struct tps65910 *tps = dev_get_drvdata(dev->parent); +	struct tps65910_rtc *tps_rtc = dev_get_drvdata(dev); -	/* Restore list of enabled interrupts before suspend */ -	return regmap_write(tps->regmap, TPS65910_RTC_INTERRUPTS, -		tps->rtc->irqstat); +	if (device_may_wakeup(dev)) +		disable_irq_wake(tps_rtc->irq); +	return 0;  } +#endif  static const struct dev_pm_ops tps65910_rtc_pm_ops = { -	.suspend	= tps65910_rtc_suspend, -	.resume		= tps65910_rtc_resume, +	SET_SYSTEM_SLEEP_PM_OPS(tps65910_rtc_suspend, tps65910_rtc_resume)  }; -#define DEV_PM_OPS     (&tps65910_rtc_pm_ops) -#else -#define DEV_PM_OPS     NULL -#endif -  static struct platform_driver tps65910_rtc_driver = {  	.probe		= tps65910_rtc_probe, -	.remove		= __devexit_p(tps65910_rtc_remove), +	.remove		= tps65910_rtc_remove,  	.driver		= {  		.owner	= THIS_MODULE,  		.name	= "tps65910-rtc", -		.pm	= DEV_PM_OPS, +		.pm	= &tps65910_rtc_pm_ops,  	},  };  |