@@ -105,8 +105,9 @@ static void tscadc_idle_config(struct ti_tscadc_dev *tscadc)
{
unsigned int idleconfig;
- idleconfig = STEPCONFIG_YNN | STEPCONFIG_INM_ADCREFM |
- STEPCONFIG_INP_ADCREFM | STEPCONFIG_YPN;
+ idleconfig = STEPCONFIG_INM_ADCREFM | STEPCONFIG_INP_ADCREFM;
+ if (tscadc->data->has_tsc)
+ idleconfig |= STEPCONFIG_YNN | STEPCONFIG_YPN;
regmap_write(tscadc->regmap, REG_IDLECONFIG, idleconfig);
}
@@ -139,11 +140,13 @@ static int ti_tscadc_probe(struct platform_device *pdev)
tscadc->data = of_device_get_match_data(&pdev->dev);
- node = of_get_child_by_name(pdev->dev.of_node, "tsc");
- of_property_read_u32(node, "ti,wires", &tscmag_wires);
- of_property_read_u32(node, "ti,coordiante-readouts", &readouts);
- if (tscmag_wires)
- use_tsc = true;
+ if (tscadc->data->has_tsc) {
+ node = of_get_child_by_name(pdev->dev.of_node, "tsc");
+ of_property_read_u32(node, "ti,wires", &tscmag_wires);
+ of_property_read_u32(node, "ti,coordiante-readouts", &readouts);
+ if (tscmag_wires)
+ use_tsc = true;
+ }
node = of_get_child_by_name(pdev->dev.of_node, "adc");
of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
@@ -218,15 +221,18 @@ static int ti_tscadc_probe(struct platform_device *pdev)
regmap_write(tscadc->regmap, REG_CLKDIV, tscadc->clk_div);
/* Set the control register bits */
- tscadc->ctrl = CNTRLREG_TSC_STEPCONFIGWRT | CNTRLREG_STEPID;
- regmap_write(tscadc->regmap, REG_CTRL, tscadc->ctrl);
+ tscadc->ctrl = CNTRLREG_STEPID;
+ if (tscadc->data->has_tsc) {
+ tscadc->ctrl |= CNTRLREG_TSC_STEPCONFIGWRT;
+ regmap_write(tscadc->regmap, REG_CTRL, tscadc->ctrl);
+ if (use_tsc) {
+ tscadc->ctrl |= CNTRLREG_TSC_ENB;
+ if (tscmag_wires == 5)
+ tscadc->ctrl |= CNTRLREG_TSC_5WIRE;
+ else
+ tscadc->ctrl |= CNTRLREG_TSC_4WIRE;
+ }
- if (use_tsc) {
- tscadc->ctrl |= CNTRLREG_TSC_ENB;
- if (tscmag_wires == 5)
- tscadc->ctrl |= CNTRLREG_TSC_5WIRE;
- else
- tscadc->ctrl |= CNTRLREG_TSC_4WIRE;
}
tscadc_idle_config(tscadc);
@@ -321,6 +327,7 @@ static int __maybe_unused tscadc_resume(struct device *dev)
static SIMPLE_DEV_PM_OPS(tscadc_pm_ops, tscadc_suspend, tscadc_resume);
static const struct ti_tscadc_data tscdata = {
+ .has_tsc = true,
.name_tscmag = "TI-am335x-tsc",
.compat_tscmag = "ti,am3359-tsc",
.name_adc = "TI-am335x-adc",
@@ -163,6 +163,7 @@
#define TSCADC_CELLS 2
struct ti_tscadc_data {
+ bool has_tsc;
char *name_tscmag;
char *compat_tscmag;
char *name_adc;
One way of knowing which hardware we are dealing with is to check its compatible. When this must be done at several places, it's best to use a proper boolean for that. ->has_tsc indicates if there is a touchscreen controller available (meaning it's a am33xx-like ADC) or not but does not indicate if it is actually used (that is the purpose of the use_tsc boolean in the probe). Introducing this boolean helps making a difference in the code between what is generic to both types of ADCs and what is specific to the am33xx hardware before introducing support for the am437x hardware. Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> --- drivers/mfd/ti_am335x_tscadc.c | 37 +++++++++++++++++----------- include/linux/mfd/ti_am335x_tscadc.h | 1 + 2 files changed, 23 insertions(+), 15 deletions(-)