summaryrefslogtreecommitdiffstats
path: root/drivers/mfd
diff options
context:
space:
mode:
authorMiquel Raynal <miquel.raynal@bootlin.com>2021-10-15 10:14:39 +0200
committerLee Jones <lee.jones@linaro.org>2021-10-20 18:28:34 +0200
commit3dafbe93be5d33113af1137c0e54a754cb72551b (patch)
tree280e44f50640a45a781767050331b75a5a856548 /drivers/mfd
parentmfd: ti_am335x_tscadc: Always provide an idle configuration (diff)
downloadlinux-3dafbe93be5d33113af1137c0e54a754cb72551b.tar.xz
linux-3dafbe93be5d33113af1137c0e54a754cb72551b.zip
mfd: ti_am335x_tscadc: Reorder the initialization steps
TI AM335X TRM [1] states that most of the configuration should be set in the control register in the first place, before actually enabling the hardware with the subsystem enable bit. So far only half of the configuration was made in the first step (before enabling the "subsystem"), which does not make really sense. Also, the probe and the resume patch were acting differently. Let's harmonize all this by following these steps: 1/ Configure the CLKDIV register 2/ Configure the CTRL register 3/ Configure the idle configuration 4/ Really enable the device by rewriting the CTRL register with the subsystem enable bit set. [1] https://www.ti.com/lit/pdf/spruh73 Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Signed-off-by: Lee Jones <lee.jones@linaro.org> Link: https://lore.kernel.org/r/20211015081506.933180-22-miquel.raynal@bootlin.com
Diffstat (limited to 'drivers/mfd')
-rw-r--r--drivers/mfd/ti_am335x_tscadc.c11
1 files changed, 5 insertions, 6 deletions
diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
index d1f70224e457..01c2b7d1c18c 100644
--- a/drivers/mfd/ti_am335x_tscadc.c
+++ b/drivers/mfd/ti_am335x_tscadc.c
@@ -219,8 +219,6 @@ static int ti_tscadc_probe(struct platform_device *pdev)
/* Set the control register bits */
ctrl = CNTRLREG_STEPCONFIGWRT | CNTRLREG_STEPID;
- regmap_write(tscadc->regmap, REG_CTRL, ctrl);
-
if (tsc_wires > 0) {
tscadc->tsc_wires = tsc_wires;
if (tsc_wires == 5)
@@ -228,6 +226,7 @@ static int ti_tscadc_probe(struct platform_device *pdev)
else
ctrl |= CNTRLREG_4WIRE | CNTRLREG_TSCENB;
}
+ regmap_write(tscadc->regmap, REG_CTRL, ctrl);
tscadc_idle_config(tscadc);
@@ -313,9 +312,9 @@ static int __maybe_unused tscadc_resume(struct device *dev)
pm_runtime_get_sync(dev);
/* context restore */
- ctrl = CNTRLREG_STEPCONFIGWRT | CNTRLREG_STEPID;
- regmap_write(tscadc->regmap, REG_CTRL, ctrl);
+ regmap_write(tscadc->regmap, REG_CLKDIV, tscadc->clk_div);
+ ctrl = CNTRLREG_STEPCONFIGWRT | CNTRLREG_STEPID;
if (tscadc->tsc_wires > 0) {
if (tscadc->tsc_wires == 5)
ctrl |= CNTRLREG_5WIRE | CNTRLREG_TSCENB;
@@ -323,13 +322,13 @@ static int __maybe_unused tscadc_resume(struct device *dev)
ctrl |= CNTRLREG_4WIRE | CNTRLREG_TSCENB;
}
+ regmap_write(tscadc->regmap, REG_CTRL, ctrl);
+
tscadc_idle_config(tscadc);
ctrl |= CNTRLREG_TSCSSENB;
regmap_write(tscadc->regmap, REG_CTRL, ctrl);
- regmap_write(tscadc->regmap, REG_CLKDIV, tscadc->clk_div);
-
return 0;
}