Hi Shubhrajyoti, On Wed, Sep 26, 2012 at 12:10:51, Datta, Shubhrajyoti wrote: > On Wednesday 26 September 2012 10:50 AM, Patil, Rachna wrote: > > This patch adds support for suspend/resume of > > TSC/ADC MFDevice. > this should be merged with the patch adding support else > we may end up in a case where patch a does the runtime calls > and the call back handlers added later. I am adding both the runtime calls and the handlers in this patch. I think maintaining this as a separate patch in better in terms of readability as well. Regards, Rachna > > > > Signed-off-by: Patil, Rachna <rachna@xxxxxx> > > --- > > Changes in v2: > > Added this patch newly in this patch series. > > > > Changes in v3: > > No changes. > > > > Changes in v4: > > Replaced suspend/resume callbacks with dev_pm_ops. > > > > drivers/iio/adc/ti_am335x_adc.c | 42 +++++++++++++++++++++++++++++ > > drivers/input/touchscreen/ti_am335x_tsc.c | 42 +++++++++++++++++++++++++++++ > > drivers/mfd/ti_am335x_tscadc.c | 41 +++++++++++++++++++++++++++- > > include/linux/mfd/ti_am335x_tscadc.h | 3 ++ > > 4 files changed, 127 insertions(+), 1 deletions(-) > > > > diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c > > index 9e1b3ac..b16f944 100644 > > --- a/drivers/iio/adc/ti_am335x_adc.c > > +++ b/drivers/iio/adc/ti_am335x_adc.c > > @@ -200,10 +200,52 @@ static int __devexit tiadc_remove(struct platform_device *pdev) > > return 0; > > } > > > > +#ifdef CONFIG_PM > > +static int tiadc_suspend(struct device *dev) > > +{ > > + struct iio_dev *indio_dev = dev_get_drvdata(dev); > > + struct tiadc_device *adc_dev = iio_priv(indio_dev); > > + struct ti_tscadc_dev *tscadc_dev = dev->platform_data; > > + unsigned int idle; > > + > > + if (!device_may_wakeup(tscadc_dev->dev)) { > > + idle = adc_readl(adc_dev, REG_CTRL); > > + idle &= ~(CNTRLREG_TSCSSENB); > > + adc_writel(adc_dev, REG_CTRL, (idle | > > + CNTRLREG_POWERDOWN)); > > + } > > + return 0; > > +} > > + > > +static int tiadc_resume(struct device *dev) > > +{ > > + struct iio_dev *indio_dev = dev_get_drvdata(dev); > > + struct tiadc_device *adc_dev = iio_priv(indio_dev); > > + unsigned int restore; > > + > > + /* Make sure ADC is powered up */ > > + restore = adc_readl(adc_dev, REG_CTRL); > > + restore &= ~(CNTRLREG_POWERDOWN); > > + adc_writel(adc_dev, REG_CTRL, restore); > > + > > + adc_step_config(adc_dev); > > + return 0; > > +} > > + > > +static const struct dev_pm_ops tiadc_pm_ops = { > > + .suspend = tiadc_suspend, > > + .resume = tiadc_resume, > > +}; > > +#define TIADC_PM_OPS (&tiadc_pm_ops) > > +#else > > +#define TIADC_PM_OPS NULL > > +#endif > > + > > static struct platform_driver tiadc_driver = { > > .driver = { > > .name = "tiadc", > > .owner = THIS_MODULE, > > + .pm = TIADC_PM_OPS, > > }, > > .probe = tiadc_probe, > > .remove = __devexit_p(tiadc_remove), > > diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c b/drivers/input/touchscreen/ti_am335x_tsc.c > > index 2d9dec1..b17dbe4 100644 > > --- a/drivers/input/touchscreen/ti_am335x_tsc.c > > +++ b/drivers/input/touchscreen/ti_am335x_tsc.c > > @@ -338,12 +338,54 @@ static int __devexit tscadc_remove(struct platform_device *pdev) > > return 0; > > } > > > > +#ifdef CONFIG_PM > > +static int titsc_suspend(struct device *dev) > > +{ > > + struct ti_tscadc_dev *tscadc_dev = dev->platform_data; > > + struct tscadc *ts_dev = tscadc_dev->tsc; > > + unsigned int idle; > > + > > + if (device_may_wakeup(tscadc_dev->dev)) { > > + idle = tscadc_readl(ts_dev, REG_IRQENABLE); > > + tscadc_writel(ts_dev, REG_IRQENABLE, > > + (idle | IRQENB_HW_PEN)); > > + tscadc_writel(ts_dev, REG_IRQWAKEUP, IRQWKUP_ENB); > > + } > > + return 0; > > +} > > + > > +static int titsc_resume(struct device *dev) > > +{ > > + struct ti_tscadc_dev *tscadc_dev = dev->platform_data; > > + struct tscadc *ts_dev = tscadc_dev->tsc; > > + > > + if (device_may_wakeup(tscadc_dev->dev)) { > > + tscadc_writel(ts_dev, REG_IRQWAKEUP, > > + 0x00); > > + tscadc_writel(ts_dev, REG_IRQCLR, IRQENB_HW_PEN); > > + } > > + tscadc_step_config(ts_dev); > > + tscadc_writel(ts_dev, REG_FIFO0THR, > > + ts_dev->steps_to_configure); > > + return 0; > > +} > > + > > +static const struct dev_pm_ops titsc_pm_ops = { > > + .suspend = titsc_suspend, > > + .resume = titsc_resume, > > +}; > > +#define TITSC_PM_OPS (&titsc_pm_ops) > > +#else > > +#define TITSC_PM_OPS NULL > > +#endif > > + > > static struct platform_driver ti_tsc_driver = { > > .probe = tscadc_probe, > > .remove = __devexit_p(tscadc_remove), > > .driver = { > > .name = "tsc", > > .owner = THIS_MODULE, > > + .pm = TITSC_PM_OPS, > > }, > > }; > > module_platform_driver(ti_tsc_driver); > > diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c > > index 45d66e5..7e949e8 100644 > > --- a/drivers/mfd/ti_am335x_tscadc.c > > +++ b/drivers/mfd/ti_am335x_tscadc.c > > @@ -170,6 +170,7 @@ static int __devinit ti_tscadc_probe(struct platform_device *pdev) > > if (err < 0) > > goto err_disable_clk; > > > > + device_init_wakeup(&pdev->dev, true); > > platform_set_drvdata(pdev, tscadc); > > return 0; > > > > @@ -203,14 +204,52 @@ static int __devexit ti_tscadc_remove(struct platform_device *pdev) > > return 0; > > } > > > > +#ifdef CONFIG_PM > > +static int tscadc_suspend(struct device *dev) > > +{ > > + struct ti_tscadc_dev *tscadc_dev = dev_get_drvdata(dev); > > + > > + tscadc_writel(tscadc_dev, REG_SE, 0x00); > > + pm_runtime_put_sync(dev); > > + return 0; > > +} > > + > > +static int tscadc_resume(struct device *dev) > > +{ > > + struct ti_tscadc_dev *tscadc_dev = dev_get_drvdata(dev); > > + unsigned int restore, ctrl; > > + > > + pm_runtime_get_sync(dev); > > + > > + /* context restore */ > > + ctrl = CNTRLREG_STEPCONFIGWRT | CNTRLREG_TSCENB | > > + CNTRLREG_STEPID | CNTRLREG_4WIRE; > > + tscadc_writel(tscadc_dev, REG_CTRL, ctrl); > > + tscadc_idle_config(tscadc_dev); > > + tscadc_writel(tscadc_dev, REG_SE, STPENB_STEPENB); > > + restore = tscadc_readl(tscadc_dev, REG_CTRL); > > + tscadc_writel(tscadc_dev, REG_CTRL, > > + (restore | CNTRLREG_TSCSSENB)); > > + return 0; > > +} > > + > > +static const struct dev_pm_ops tscadc_pm_ops = { > > + .suspend = tscadc_suspend, > > + .resume = tscadc_resume, > > +}; > > +#define TSCADC_PM_OPS (&tscadc_pm_ops) > > +#else > > +#define TSCADC_PM_OPS NULL > > +#endif > > + > > static struct platform_driver ti_tscadc_driver = { > > .driver = { > > .name = "ti_tscadc", > > .owner = THIS_MODULE, > > + .pm = TSCADC_PM_OPS, > > }, > > .probe = ti_tscadc_probe, > > .remove = __devexit_p(ti_tscadc_remove), > > - > > }; > > > > module_platform_driver(ti_tscadc_driver); > > diff --git a/include/linux/mfd/ti_am335x_tscadc.h b/include/linux/mfd/ti_am335x_tscadc.h > > index bd9fe1d..c7facdc 100644 > > --- a/include/linux/mfd/ti_am335x_tscadc.h > > +++ b/include/linux/mfd/ti_am335x_tscadc.h > > @@ -40,6 +40,9 @@ > > #define REG_FIFO1 0x200 > > > > /* Register Bitfields */ > > +/* IRQ wakeup enable */ > > +#define IRQWKUP_ENB BIT(0) > > + > > /* Step Enable */ > > #define STEPENB_MASK (0x1FFFF << 0) > > #define STEPENB(val) ((val) << 0) > > -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html