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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Lee,

lee.jones@xxxxxxxxxx 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@xxxxxxxxxxx>
> > Reviewed-by: Jonathan Cameron <Jonathan.Cameron@xxxxxxxxxx>
> > ---
> >  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



[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]


  Powered by Linux