mfd: ti_am335x_tscadc: Use driver data
authorMiquel Raynal <miquel.raynal@bootlin.com>
Fri, 15 Oct 2021 08:14:35 +0000 (10:14 +0200)
committerLee Jones <lee.jones@linaro.org>
Wed, 20 Oct 2021 16:28:15 +0000 (17:28 +0100)
So far every sub-cell parameter in this driver was hardcoded: cell name,
cell compatible, specific clock name and desired clock frequency.

As we are about to introduce support for ADC1/magnetic reader, we need a
bit of flexibility. Let's add a driver data structure which will contain
these information.

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-18-miquel.raynal@bootlin.com
drivers/mfd/ti_am335x_tscadc.c
include/linux/mfd/ti_am335x_tscadc.h

index ba82110..69b0eff 100644 (file)
@@ -137,6 +137,8 @@ static      int ti_tscadc_probe(struct platform_device *pdev)
                return -EINVAL;
        }
 
+       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", &tsc_wires);
        of_property_read_u32(node, "ti,coordiante-readouts", &readouts);
@@ -212,7 +214,7 @@ static      int ti_tscadc_probe(struct platform_device *pdev)
                goto err_disable_clk;
        }
 
-       tscadc->clk_div = (clk_get_rate(clk) / ADC_CLK) - 1;
+       tscadc->clk_div = (clk_get_rate(clk) / tscadc->data->target_clk_rate) - 1;
        regmap_write(tscadc->regmap, REG_CLKDIV, tscadc->clk_div);
 
        /* Set the control register bits */
@@ -241,8 +243,8 @@ static      int ti_tscadc_probe(struct platform_device *pdev)
        if (tsc_wires > 0) {
                tscadc->tsc_cell = tscadc->used_cells;
                cell = &tscadc->cells[tscadc->used_cells++];
-               cell->name = "TI-am335x-tsc";
-               cell->of_compatible = "ti,am3359-tsc";
+               cell->name = tscadc->data->secondary_feature_name;
+               cell->of_compatible = tscadc->data->secondary_feature_compatible;
                cell->platform_data = &tscadc;
                cell->pdata_size = sizeof(tscadc);
        }
@@ -251,8 +253,8 @@ static      int ti_tscadc_probe(struct platform_device *pdev)
        if (adc_channels > 0) {
                tscadc->adc_cell = tscadc->used_cells;
                cell = &tscadc->cells[tscadc->used_cells++];
-               cell->name = "TI-am335x-adc";
-               cell->of_compatible = "ti,am3359-adc";
+               cell->name = tscadc->data->adc_feature_name;
+               cell->of_compatible = tscadc->data->adc_feature_compatible;
                cell->platform_data = &tscadc;
                cell->pdata_size = sizeof(tscadc);
        }
@@ -338,8 +340,16 @@ 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 = {
+       .adc_feature_name = "TI-am335x-adc",
+       .adc_feature_compatible = "ti,am3359-adc",
+       .secondary_feature_name = "TI-am335x-tsc",
+       .secondary_feature_compatible = "ti,am3359-tsc",
+       .target_clk_rate = ADC_CLK,
+};
+
 static const struct of_device_id ti_tscadc_dt_ids[] = {
-       { .compatible = "ti,am3359-tscadc", },
+       { .compatible = "ti,am3359-tscadc", .data = &tscdata },
        { }
 };
 MODULE_DEVICE_TABLE(of, ti_tscadc_dt_ids);
index ffc091b..bb3b56a 100644 (file)
 
 #define TSCADC_CELLS           2
 
+struct ti_tscadc_data {
+       char *adc_feature_name;
+       char *adc_feature_compatible;
+       char *secondary_feature_name;
+       char *secondary_feature_compatible;
+       unsigned int target_clk_rate;
+};
+
 struct ti_tscadc_dev {
        struct device *dev;
        struct regmap *regmap;
        void __iomem *tscadc_base;
        phys_addr_t tscadc_phys_base;
+       const struct ti_tscadc_data *data;
        int irq;
        int used_cells; /* 1-2 */
        int tsc_wires;