diff --git a/drivers/mfd/ti_tscadc.c b/drivers/mfd/ti_tscadc.c index f8398c3..8307b92 100644 --- a/drivers/mfd/ti_tscadc.c +++ b/drivers/mfd/ti_tscadc.c @@ -222,6 +222,8 @@ static int tscadc_suspend(struct platform_device *pdev, pm_message_t state) struct ti_tscadc_dev *tscadc_dev = platform_get_drvdata(pdev); tscadc_writel(tscadc_dev, TSCADC_REG_SE, 0x00); + tscadc_dev->irqstat = tscadc_readl(tscadc_dev, TSCADC_REG_IRQENABLE); + tscadc_dev->ctrl = tscadc_readl(tscadc_dev, TSCADC_REG_CTRL); pm_runtime_put_sync(&pdev->dev); return 0; } @@ -230,26 +232,15 @@ static int tscadc_resume(struct platform_device *pdev) { struct ti_tscadc_dev *tscadc_dev = platform_get_drvdata(pdev); struct mfd_tscadc_board *pdata = pdev->dev.platform_data; - unsigned int restore, ctrl; pm_runtime_get_sync(&pdev->dev); /* context restore */ - ctrl = TSCADC_CNTRLREG_STEPCONFIGWRT | - TSCADC_CNTRLREG_STEPID; - - if (pdata->tsc_init) - ctrl |= TSCADC_CNTRLREG_4WIRE | - TSCADC_CNTRLREG_TSCENB; - tscadc_writel(tscadc_dev, TSCADC_REG_CTRL, ctrl); - + tscadc_writel(tscadc_dev, TSCADC_REG_IRQENABLE, tscadc_dev->irqstat); if (pdata->tsc_init) tscadc_idle_config(tscadc_dev); - tscadc_writel(tscadc_dev, TSCADC_REG_SE, TSCADC_STPENB_STEPENB); - restore = tscadc_readl(tscadc_dev, TSCADC_REG_CTRL); - tscadc_writel(tscadc_dev, TSCADC_REG_CTRL, - (restore | TSCADC_CNTRLREG_TSCSSENB)); - + tscadc_writel(tscadc_dev, TSCADC_REG_SE, TSCADC_STPENB_STEPENB_TC); + tscadc_writel(tscadc_dev, TSCADC_REG_CTRL, tscadc_dev->ctrl); return 0; } diff --git a/drivers/staging/iio/adc/ti_adc.c b/drivers/staging/iio/adc/ti_adc.c index 4c41440..7a96250 100644 --- a/drivers/staging/iio/adc/ti_adc.c +++ b/drivers/staging/iio/adc/ti_adc.c @@ -54,7 +54,7 @@ static void adc_writel(struct adc_device *adc, unsigned int reg, writel(val, adc->mfd_tscadc->tscadc_base + reg); } -static void adc_step_config(struct adc_device *adc_dev) +static void adc_step_config(struct adc_device *adc_dev, bool mode) { unsigned int stepconfig; int i, channels = 0, steps; @@ -72,7 +72,11 @@ static void adc_step_config(struct adc_device *adc_dev) steps = TOTAL_STEPS - adc_dev->channels; channels = TOTAL_CHANNELS - adc_dev->channels; - stepconfig = TSCADC_STEPCONFIG_AVG_16 | TSCADC_STEPCONFIG_FIFO1; + if (mode == 0) + stepconfig = TSCADC_STEPCONFIG_AVG_16 | TSCADC_STEPCONFIG_FIFO1; + else + stepconfig = TSCADC_STEPCONFIG_AVG_16 | TSCADC_STEPCONFIG_FIFO1 + | TSCADC_STEPCONFIG_MODE_SWCNT; for (i = (steps + 1); i <= TOTAL_STEPS; i++) { adc_writel(adc_dev, TSCADC_REG_STEPCONFIG(i), @@ -425,7 +429,8 @@ static int __devinit tiadc_probe(struct platform_device *pdev) idev->modes = INDIO_DIRECT_MODE; idev->info = &tiadc_info; - adc_step_config(adc_dev); + /* by default driver comes up with oneshot mode */ + adc_step_config(adc_dev, adc_dev->is_continuous_mode); /* program FIFO threshold to value minus 1 */ adc_writel(adc_dev, TSCADC_REG_FIFO1THR, FIFO1_THRESHOLD); @@ -505,12 +510,13 @@ static int adc_resume(struct platform_device *pdev) struct adc_device *adc_dev = tscadc_dev->adc; unsigned int restore; + adc_writel(adc_dev, TSCADC_REG_FIFO1THR, FIFO1_THRESHOLD); + adc_step_config(adc_dev, adc_dev->is_continuous_mode); + /* Make sure ADC is powered up */ restore = adc_readl(adc_dev, TSCADC_REG_CTRL); restore &= ~(TSCADC_CNTRLREG_POWERDOWN); adc_writel(adc_dev, TSCADC_REG_CTRL, restore); - - adc_step_config(adc_dev); return 0; } diff --git a/include/linux/mfd/ti_tscadc.h b/include/linux/mfd/ti_tscadc.h index d5135ed..b165e40 100644 --- a/include/linux/mfd/ti_tscadc.h +++ b/include/linux/mfd/ti_tscadc.h @@ -159,4 +159,8 @@ struct ti_tscadc_dev { /* adc device */ struct adc_device *adc; + + /* Context save */ + unsigned int irqstat; + unsigned int ctrl; };