diff mbox series

[v3,17/47] mfd: ti_am335x_tscadc: Use driver data

Message ID 20210915155908.476767-18-miquel.raynal@bootlin.com (mailing list archive)
State New, archived
Headers show
Series TI AM437X ADC1 | expand

Commit Message

Miquel Raynal Sept. 15, 2021, 3:58 p.m. UTC
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>
---
 drivers/mfd/ti_am335x_tscadc.c       | 25 +++++++++++++++++++------
 include/linux/mfd/ti_am335x_tscadc.h |  9 +++++++++
 2 files changed, 28 insertions(+), 6 deletions(-)

Comments

Lee Jones Sept. 22, 2021, 3:01 p.m. UTC | #1
On Wed, 15 Sep 2021, Miquel Raynal wrote:

> 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>
> ---
>  drivers/mfd/ti_am335x_tscadc.c       | 25 +++++++++++++++++++------
>  include/linux/mfd/ti_am335x_tscadc.h |  9 +++++++++
>  2 files changed, 28 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
> index ba821109e98b..fbc8e338188a 100644
> --- a/drivers/mfd/ti_am335x_tscadc.c
> +++ b/drivers/mfd/ti_am335x_tscadc.c
> @@ -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->name_tscmag;
> +		cell->of_compatible = tscadc->data->compat_tscmag;
>  		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->name_adc;
> +		cell->of_compatible = tscadc->data->compat_adc;
>  		cell->platform_data = &tscadc;
>  		cell->pdata_size = sizeof(tscadc);
>  	}
> @@ -338,8 +340,19 @@ 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 = {
> +	.name_tscmag = "TI-am335x-tsc",
> +	.compat_tscmag = "ti,am3359-tsc",
> +	.name_adc = "TI-am335x-adc",
> +	.compat_adc = "ti,am3359-adc",
> +	.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);
> diff --git a/include/linux/mfd/ti_am335x_tscadc.h b/include/linux/mfd/ti_am335x_tscadc.h
> index ffc091b77633..0f581c15d95a 100644
> --- a/include/linux/mfd/ti_am335x_tscadc.h
> +++ b/include/linux/mfd/ti_am335x_tscadc.h
> @@ -162,11 +162,20 @@
>  
>  #define TSCADC_CELLS		2
>  
> +struct ti_tscadc_data {
> +	char *name_tscmag;
> +	char *compat_tscmag;
> +	char *name_adc;
> +	char *compat_adc;

I think these names should be improved.

What is tscmag?

Does that represent both the Magnetic Reader and the Touchscreen?

If so, I'd prefer that you split them.  If not, I need more info.

For readability, I suggest;

  touchscreen_name
  touchscreen_compatible
  mag_reader_name
  mag_reader_compatible
  adc_name
  adc_compatible
  etc

What is a magnetic reader anyway?

Does it read the magnetic stripe on a payment card?

> +	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;
Miquel Raynal Sept. 22, 2021, 3:42 p.m. UTC | #2
Hi Lee,

lee.jones@linaro.org wrote on Wed, 22 Sep 2021 16:01:51 +0100:

> On Wed, 15 Sep 2021, Miquel Raynal wrote:
> 
> > 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>
> > ---
> >  drivers/mfd/ti_am335x_tscadc.c       | 25 +++++++++++++++++++------
> >  include/linux/mfd/ti_am335x_tscadc.h |  9 +++++++++
> >  2 files changed, 28 insertions(+), 6 deletions(-)
> > 
> > diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
> > index ba821109e98b..fbc8e338188a 100644
> > --- a/drivers/mfd/ti_am335x_tscadc.c
> > +++ b/drivers/mfd/ti_am335x_tscadc.c
> > @@ -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->name_tscmag;
> > +		cell->of_compatible = tscadc->data->compat_tscmag;
> >  		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->name_adc;
> > +		cell->of_compatible = tscadc->data->compat_adc;
> >  		cell->platform_data = &tscadc;
> >  		cell->pdata_size = sizeof(tscadc);
> >  	}
> > @@ -338,8 +340,19 @@ 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 = {
> > +	.name_tscmag = "TI-am335x-tsc",
> > +	.compat_tscmag = "ti,am3359-tsc",
> > +	.name_adc = "TI-am335x-adc",
> > +	.compat_adc = "ti,am3359-adc",
> > +	.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);
> > diff --git a/include/linux/mfd/ti_am335x_tscadc.h b/include/linux/mfd/ti_am335x_tscadc.h
> > index ffc091b77633..0f581c15d95a 100644
> > --- a/include/linux/mfd/ti_am335x_tscadc.h
> > +++ b/include/linux/mfd/ti_am335x_tscadc.h
> > @@ -162,11 +162,20 @@
> >  
> >  #define TSCADC_CELLS		2
> >  
> > +struct ti_tscadc_data {
> > +	char *name_tscmag;
> > +	char *compat_tscmag;
> > +	char *name_adc;
> > +	char *compat_adc;  
> 
> I think these names should be improved.
> 
> What is tscmag?
> 
> Does that represent both the Magnetic Reader and the Touchscreen?

Not exactly, it represents *either* the magnetic reader *or* the
touchscreen.

Basically you can have either one version of the hardware which
is a regular ADC that can be also used as a touchscreen controller, or
you can have another version of the hardware which is a regular ADC
that can be also used as a magnetic reader.

Both features can be used as the same time (ts + adc or mag + adc),
hence we need a name for the touchscreen child node and for the adc
child node *or* a name for the magnetic reader chil node and for the adc
child node.

> If so, I'd prefer that you split them.  If not, I need more info.
> 
> For readability, I suggest;
> 
>   touchscreen_name
>   touchscreen_compatible
>   mag_reader_name
>   mag_reader_compatible
>   adc_name
>   adc_compatible
>   etc
> 

I can certainly improve the names though.

> What is a magnetic reader anyway?
> 
> Does it read the magnetic stripe on a payment card?

Yes!

> 
> > +	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;  
> 


Thanks,
Miquèl
Lee Jones Sept. 22, 2021, 3:54 p.m. UTC | #3
On Wed, 22 Sep 2021, Miquel Raynal wrote:

> Hi Lee,
> 
> lee.jones@linaro.org wrote on Wed, 22 Sep 2021 16:01:51 +0100:
> 
> > On Wed, 15 Sep 2021, Miquel Raynal wrote:
> > 
> > > 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>
> > > ---
> > >  drivers/mfd/ti_am335x_tscadc.c       | 25 +++++++++++++++++++------
> > >  include/linux/mfd/ti_am335x_tscadc.h |  9 +++++++++
> > >  2 files changed, 28 insertions(+), 6 deletions(-)
> > > 
> > > diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
> > > index ba821109e98b..fbc8e338188a 100644
> > > --- a/drivers/mfd/ti_am335x_tscadc.c
> > > +++ b/drivers/mfd/ti_am335x_tscadc.c
> > > @@ -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->name_tscmag;
> > > +		cell->of_compatible = tscadc->data->compat_tscmag;
> > >  		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->name_adc;
> > > +		cell->of_compatible = tscadc->data->compat_adc;
> > >  		cell->platform_data = &tscadc;
> > >  		cell->pdata_size = sizeof(tscadc);
> > >  	}
> > > @@ -338,8 +340,19 @@ 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 = {
> > > +	.name_tscmag = "TI-am335x-tsc",
> > > +	.compat_tscmag = "ti,am3359-tsc",
> > > +	.name_adc = "TI-am335x-adc",
> > > +	.compat_adc = "ti,am3359-adc",
> > > +	.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);
> > > diff --git a/include/linux/mfd/ti_am335x_tscadc.h b/include/linux/mfd/ti_am335x_tscadc.h
> > > index ffc091b77633..0f581c15d95a 100644
> > > --- a/include/linux/mfd/ti_am335x_tscadc.h
> > > +++ b/include/linux/mfd/ti_am335x_tscadc.h
> > > @@ -162,11 +162,20 @@
> > >  
> > >  #define TSCADC_CELLS		2
> > >  
> > > +struct ti_tscadc_data {
> > > +	char *name_tscmag;
> > > +	char *compat_tscmag;
> > > +	char *name_adc;
> > > +	char *compat_adc;  
> > 
> > I think these names should be improved.
> > 
> > What is tscmag?
> > 
> > Does that represent both the Magnetic Reader and the Touchscreen?
> 
> Not exactly, it represents *either* the magnetic reader *or* the
> touchscreen.
> 
> Basically you can have either one version of the hardware which
> is a regular ADC that can be also used as a touchscreen controller, or
> you can have another version of the hardware which is a regular ADC
> that can be also used as a magnetic reader.
> 
> Both features can be used as the same time (ts + adc or mag + adc),
> hence we need a name for the touchscreen child node and for the adc
> child node *or* a name for the magnetic reader chil node and for the adc
> child node.
> 
> > If so, I'd prefer that you split them.  If not, I need more info.
> > 
> > For readability, I suggest;
> > 
> >   touchscreen_name
> >   touchscreen_compatible
> >   mag_reader_name
> >   mag_reader_compatible
> >   adc_name
> >   adc_compatible
> >   etc
> > 
> 
> I can certainly improve the names though.

Thanks.

> > What is a magnetic reader anyway?
> > 
> > Does it read the magnetic stripe on a payment card?
> 
> Yes!

The mag_stripe_reader might be nice.

> > > +	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;  
> > 
> 
> 
> Thanks,
> Miquèl
diff mbox series

Patch

diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
index ba821109e98b..fbc8e338188a 100644
--- a/drivers/mfd/ti_am335x_tscadc.c
+++ b/drivers/mfd/ti_am335x_tscadc.c
@@ -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->name_tscmag;
+		cell->of_compatible = tscadc->data->compat_tscmag;
 		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->name_adc;
+		cell->of_compatible = tscadc->data->compat_adc;
 		cell->platform_data = &tscadc;
 		cell->pdata_size = sizeof(tscadc);
 	}
@@ -338,8 +340,19 @@  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 = {
+	.name_tscmag = "TI-am335x-tsc",
+	.compat_tscmag = "ti,am3359-tsc",
+	.name_adc = "TI-am335x-adc",
+	.compat_adc = "ti,am3359-adc",
+	.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);
diff --git a/include/linux/mfd/ti_am335x_tscadc.h b/include/linux/mfd/ti_am335x_tscadc.h
index ffc091b77633..0f581c15d95a 100644
--- a/include/linux/mfd/ti_am335x_tscadc.h
+++ b/include/linux/mfd/ti_am335x_tscadc.h
@@ -162,11 +162,20 @@ 
 
 #define TSCADC_CELLS		2
 
+struct ti_tscadc_data {
+	char *name_tscmag;
+	char *compat_tscmag;
+	char *name_adc;
+	char *compat_adc;
+	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;