[v1,1/2] iio: adc: ti-adc128s052: Switch to use spi_get_device_match_data()

Message ID 20221214114944.83790-1-andriy.shevchenko@linux.intel.com
State New
Headers
Series [v1,1/2] iio: adc: ti-adc128s052: Switch to use spi_get_device_match_data() |

Commit Message

Andy Shevchenko Dec. 14, 2022, 11:49 a.m. UTC
  The spi_get_device_match_data() helps to get driver data from the
firmware node or SPI ID table. Use it instead of open coding.

While at it, switch ID tables to provide an acrual pointers to
the configuration data.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---

Requires aea672d054a2 ("spi: Introduce spi_get_device_match_data()
helper") which is part of upstream as of today.

 drivers/iio/adc/ti-adc128s052.c | 39 +++++++++++++++------------------
 1 file changed, 18 insertions(+), 21 deletions(-)
  

Comments

kernel test robot Dec. 14, 2022, 1:10 p.m. UTC | #1
Hi Andy,

I love your patch! Perhaps something to improve:

[auto build test WARNING on jic23-iio/togreg]
[also build test WARNING on next-20221214]
[cannot apply to linus/master v6.1]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Andy-Shevchenko/iio-adc-ti-adc128s052-Switch-to-use-spi_get_device_match_data/20221214-195107
base:   https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git togreg
patch link:    https://lore.kernel.org/r/20221214114944.83790-1-andriy.shevchenko%40linux.intel.com
patch subject: [PATCH v1 1/2] iio: adc: ti-adc128s052: Switch to use spi_get_device_match_data()
config: ia64-allyesconfig
compiler: ia64-linux-gcc (GCC) 12.1.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/intel-lab-lkp/linux/commit/bcf5eb0a92b2364ddde0d61a772ae31f2fbc4dae
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review Andy-Shevchenko/iio-adc-ti-adc128s052-Switch-to-use-spi_get_device_match_data/20221214-195107
        git checkout bcf5eb0a92b2364ddde0d61a772ae31f2fbc4dae
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=ia64 SHELL=/bin/bash drivers/iio/adc/

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

   drivers/iio/adc/ti-adc128s052.c: In function 'adc128_probe':
   drivers/iio/adc/ti-adc128s052.c:158:18: error: implicit declaration of function 'spi_get_device_match_data'; did you mean 'spi_get_device_id'? [-Werror=implicit-function-declaration]
     158 |         config = spi_get_device_match_data(&spi->dev);
         |                  ^~~~~~~~~~~~~~~~~~~~~~~~~
         |                  spi_get_device_id
>> drivers/iio/adc/ti-adc128s052.c:158:16: warning: assignment to 'const struct adc128_configuration *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
     158 |         config = spi_get_device_match_data(&spi->dev);
         |                ^
   drivers/iio/adc/ti-adc128s052.c:160:44: error: array subscript is not an integer
     160 |         indio_dev->channels = adc128_config[config].channels;
         |                                            ^
   drivers/iio/adc/ti-adc128s052.c:161:48: error: array subscript is not an integer
     161 |         indio_dev->num_channels = adc128_config[config].num_channels;
         |                                                ^
>> drivers/iio/adc/ti-adc128s052.c:142:44: warning: variable 'config' set but not used [-Wunused-but-set-variable]
     142 |         const struct adc128_configuration *config;
         |                                            ^~~~~~
   cc1: some warnings being treated as errors


vim +158 drivers/iio/adc/ti-adc128s052.c

   139	
   140	static int adc128_probe(struct spi_device *spi)
   141	{
 > 142		const struct adc128_configuration *config;
   143		struct iio_dev *indio_dev;
   144		struct adc128 *adc;
   145		int ret;
   146	
   147		indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*adc));
   148		if (!indio_dev)
   149			return -ENOMEM;
   150	
   151		adc = iio_priv(indio_dev);
   152		adc->spi = spi;
   153	
   154		indio_dev->name = spi_get_device_id(spi)->name;
   155		indio_dev->modes = INDIO_DIRECT_MODE;
   156		indio_dev->info = &adc128_info;
   157	
 > 158		config = spi_get_device_match_data(&spi->dev);
   159	
   160		indio_dev->channels = adc128_config[config].channels;
   161		indio_dev->num_channels = adc128_config[config].num_channels;
   162	
   163		adc->reg = devm_regulator_get(&spi->dev, "vref");
   164		if (IS_ERR(adc->reg))
   165			return PTR_ERR(adc->reg);
   166	
   167		ret = regulator_enable(adc->reg);
   168		if (ret < 0)
   169			return ret;
   170		ret = devm_add_action_or_reset(&spi->dev, adc128_disable_regulator,
   171					       adc->reg);
   172		if (ret)
   173			return ret;
   174	
   175		mutex_init(&adc->lock);
   176	
   177		return devm_iio_device_register(&spi->dev, indio_dev);
   178	}
   179
  
kernel test robot Dec. 14, 2022, 5:02 p.m. UTC | #2
Hi Andy,

I love your patch! Yet something to improve:

[auto build test ERROR on jic23-iio/togreg]
[also build test ERROR on next-20221214]
[cannot apply to linus/master v6.1]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Andy-Shevchenko/iio-adc-ti-adc128s052-Switch-to-use-spi_get_device_match_data/20221214-195107
base:   https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git togreg
patch link:    https://lore.kernel.org/r/20221214114944.83790-1-andriy.shevchenko%40linux.intel.com
patch subject: [PATCH v1 1/2] iio: adc: ti-adc128s052: Switch to use spi_get_device_match_data()
config: i386-randconfig-a002
compiler: clang version 14.0.6 (https://github.com/llvm/llvm-project f28c006a5895fc0e329fe15fead81e37457cb1d1)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/intel-lab-lkp/linux/commit/bcf5eb0a92b2364ddde0d61a772ae31f2fbc4dae
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review Andy-Shevchenko/iio-adc-ti-adc128s052-Switch-to-use-spi_get_device_match_data/20221214-195107
        git checkout bcf5eb0a92b2364ddde0d61a772ae31f2fbc4dae
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=i386 SHELL=/bin/bash

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

>> drivers/iio/adc/ti-adc128s052.c:158:11: error: implicit declaration of function 'spi_get_device_match_data' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
           config = spi_get_device_match_data(&spi->dev);
                    ^
   drivers/iio/adc/ti-adc128s052.c:158:9: warning: incompatible integer to pointer conversion assigning to 'const struct adc128_configuration *' from 'int' [-Wint-conversion]
           config = spi_get_device_match_data(&spi->dev);
                  ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> drivers/iio/adc/ti-adc128s052.c:160:37: error: array subscript is not an integer
           indio_dev->channels = adc128_config[config].channels;
                                              ^~~~~~~
   drivers/iio/adc/ti-adc128s052.c:161:41: error: array subscript is not an integer
           indio_dev->num_channels = adc128_config[config].num_channels;
                                                  ^~~~~~~
   1 warning and 3 errors generated.


vim +/spi_get_device_match_data +158 drivers/iio/adc/ti-adc128s052.c

   139	
   140	static int adc128_probe(struct spi_device *spi)
   141	{
   142		const struct adc128_configuration *config;
   143		struct iio_dev *indio_dev;
   144		struct adc128 *adc;
   145		int ret;
   146	
   147		indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*adc));
   148		if (!indio_dev)
   149			return -ENOMEM;
   150	
   151		adc = iio_priv(indio_dev);
   152		adc->spi = spi;
   153	
   154		indio_dev->name = spi_get_device_id(spi)->name;
   155		indio_dev->modes = INDIO_DIRECT_MODE;
   156		indio_dev->info = &adc128_info;
   157	
 > 158		config = spi_get_device_match_data(&spi->dev);
   159	
 > 160		indio_dev->channels = adc128_config[config].channels;
   161		indio_dev->num_channels = adc128_config[config].num_channels;
   162	
   163		adc->reg = devm_regulator_get(&spi->dev, "vref");
   164		if (IS_ERR(adc->reg))
   165			return PTR_ERR(adc->reg);
   166	
   167		ret = regulator_enable(adc->reg);
   168		if (ret < 0)
   169			return ret;
   170		ret = devm_add_action_or_reset(&spi->dev, adc128_disable_regulator,
   171					       adc->reg);
   172		if (ret)
   173			return ret;
   174	
   175		mutex_init(&adc->lock);
   176	
   177		return devm_iio_device_register(&spi->dev, indio_dev);
   178	}
   179
  
Jonathan Cameron Dec. 23, 2022, 3:22 p.m. UTC | #3
On Wed, 14 Dec 2022 13:49:43 +0200
Andy Shevchenko <andriy.shevchenko@linux.intel.com> wrote:

> The spi_get_device_match_data() helps to get driver data from the
> firmware node or SPI ID table. Use it instead of open coding.
> 
> While at it, switch ID tables to provide an acrual pointers to
> the configuration data.
> 
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> ---
> 
> Requires aea672d054a2 ("spi: Introduce spi_get_device_match_data()
> helper") which is part of upstream as of today.

I rebased to get that (will rebase again on rc1).

Applied to the togreg branch of iio.git and pushed out as testing
to keep 0-day busy over my holidays.

Jonathan

> 
>  drivers/iio/adc/ti-adc128s052.c | 39 +++++++++++++++------------------
>  1 file changed, 18 insertions(+), 21 deletions(-)
> 
> diff --git a/drivers/iio/adc/ti-adc128s052.c b/drivers/iio/adc/ti-adc128s052.c
> index b3d5b9b7255b..9dfc625100b6 100644
> --- a/drivers/iio/adc/ti-adc128s052.c
> +++ b/drivers/iio/adc/ti-adc128s052.c
> @@ -139,16 +139,11 @@ static void adc128_disable_regulator(void *reg)
>  
>  static int adc128_probe(struct spi_device *spi)
>  {
> +	const struct adc128_configuration *config;
>  	struct iio_dev *indio_dev;
> -	unsigned int config;
>  	struct adc128 *adc;
>  	int ret;
>  
> -	if (dev_fwnode(&spi->dev))
> -		config = (unsigned long) device_get_match_data(&spi->dev);
> -	else
> -		config = spi_get_device_id(spi)->driver_data;
> -
>  	indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*adc));
>  	if (!indio_dev)
>  		return -ENOMEM;
> @@ -160,6 +155,8 @@ static int adc128_probe(struct spi_device *spi)
>  	indio_dev->modes = INDIO_DIRECT_MODE;
>  	indio_dev->info = &adc128_info;
>  
> +	config = spi_get_device_match_data(&spi->dev);
> +
>  	indio_dev->channels = adc128_config[config].channels;
>  	indio_dev->num_channels = adc128_config[config].num_channels;
>  
> @@ -181,32 +178,32 @@ static int adc128_probe(struct spi_device *spi)
>  }
>  
>  static const struct of_device_id adc128_of_match[] = {
> -	{ .compatible = "ti,adc128s052", .data = (void*)0L, },
> -	{ .compatible = "ti,adc122s021", .data = (void*)1L, },
> -	{ .compatible = "ti,adc122s051", .data = (void*)1L, },
> -	{ .compatible = "ti,adc122s101", .data = (void*)1L, },
> -	{ .compatible = "ti,adc124s021", .data = (void*)2L, },
> -	{ .compatible = "ti,adc124s051", .data = (void*)2L, },
> -	{ .compatible = "ti,adc124s101", .data = (void*)2L, },
> +	{ .compatible = "ti,adc128s052", .data = &adc128_config[0] },
> +	{ .compatible = "ti,adc122s021", .data = &adc128_config[1] },
> +	{ .compatible = "ti,adc122s051", .data = &adc128_config[1] },
> +	{ .compatible = "ti,adc122s101", .data = &adc128_config[1] },
> +	{ .compatible = "ti,adc124s021", .data = &adc128_config[2] },
> +	{ .compatible = "ti,adc124s051", .data = &adc128_config[2] },
> +	{ .compatible = "ti,adc124s101", .data = &adc128_config[2] },
>  	{ /* sentinel */ },
>  };
>  MODULE_DEVICE_TABLE(of, adc128_of_match);
>  
>  static const struct spi_device_id adc128_id[] = {
> -	{ "adc128s052", 0 },	/* index into adc128_config */
> -	{ "adc122s021",	1 },
> -	{ "adc122s051",	1 },
> -	{ "adc122s101",	1 },
> -	{ "adc124s021", 2 },
> -	{ "adc124s051", 2 },
> -	{ "adc124s101", 2 },
> +	{ "adc128s052", (kernel_ulong_t)&adc128_config[0] },
> +	{ "adc122s021",	(kernel_ulong_t)&adc128_config[1] },
> +	{ "adc122s051",	(kernel_ulong_t)&adc128_config[1] },
> +	{ "adc122s101",	(kernel_ulong_t)&adc128_config[1] },
> +	{ "adc124s021", (kernel_ulong_t)&adc128_config[2] },
> +	{ "adc124s051", (kernel_ulong_t)&adc128_config[2] },
> +	{ "adc124s101", (kernel_ulong_t)&adc128_config[2] },
>  	{ }
>  };
>  MODULE_DEVICE_TABLE(spi, adc128_id);
>  
>  #ifdef CONFIG_ACPI
>  static const struct acpi_device_id adc128_acpi_match[] = {
> -	{ "AANT1280", 2 }, /* ADC124S021 compatible ACPI ID */
> +	{ "AANT1280", (kernel_ulong_t)&adc128_config[2] },
>  	{ }
>  };
>  MODULE_DEVICE_TABLE(acpi, adc128_acpi_match);
  
Jonathan Cameron Dec. 23, 2022, 3:44 p.m. UTC | #4
On Fri, 23 Dec 2022 15:22:42 +0000
Jonathan Cameron <jic23@kernel.org> wrote:

> On Wed, 14 Dec 2022 13:49:43 +0200
> Andy Shevchenko <andriy.shevchenko@linux.intel.com> wrote:
> 
> > The spi_get_device_match_data() helps to get driver data from the
> > firmware node or SPI ID table. Use it instead of open coding.
> > 
> > While at it, switch ID tables to provide an acrual pointers to
> > the configuration data.
> > 
> > Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> > ---
> > 
> > Requires aea672d054a2 ("spi: Introduce spi_get_device_match_data()
> > helper") which is part of upstream as of today.  
> 
> I rebased to get that (will rebase again on rc1).
> 
> Applied to the togreg branch of iio.git and pushed out as testing
> to keep 0-day busy over my holidays.

I take it back...  Build test failed...

> 
> Jonathan
> 
> > 
> >  drivers/iio/adc/ti-adc128s052.c | 39 +++++++++++++++------------------
> >  1 file changed, 18 insertions(+), 21 deletions(-)
> > 
> > diff --git a/drivers/iio/adc/ti-adc128s052.c b/drivers/iio/adc/ti-adc128s052.c
> > index b3d5b9b7255b..9dfc625100b6 100644
> > --- a/drivers/iio/adc/ti-adc128s052.c
> > +++ b/drivers/iio/adc/ti-adc128s052.c
> > @@ -139,16 +139,11 @@ static void adc128_disable_regulator(void *reg)
> >  
> >  static int adc128_probe(struct spi_device *spi)
> >  {
> > +	const struct adc128_configuration *config;
> >  	struct iio_dev *indio_dev;
> > -	unsigned int config;
> >  	struct adc128 *adc;
> >  	int ret;
> >  
> > -	if (dev_fwnode(&spi->dev))
> > -		config = (unsigned long) device_get_match_data(&spi->dev);
> > -	else
> > -		config = spi_get_device_id(spi)->driver_data;
> > -
> >  	indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*adc));
> >  	if (!indio_dev)
> >  		return -ENOMEM;
> > @@ -160,6 +155,8 @@ static int adc128_probe(struct spi_device *spi)
> >  	indio_dev->modes = INDIO_DIRECT_MODE;
> >  	indio_dev->info = &adc128_info;
> >  
> > +	config = spi_get_device_match_data(&spi->dev);
Takes a struct spi_device*

Also, having opened code up to fix this, we have a spi_get_device_id() left
just above that needs dealing with.

And a lot of uses of config below that need fixing.

I'm dropping this series until that's all fixed up.

Jonathan



> > +
> >  	indio_dev->channels = adc128_config[config].channels;
> >  	indio_dev->num_channels = adc128_config[config].num_channels;
> >  
> > @@ -181,32 +178,32 @@ static int adc128_probe(struct spi_device *spi)
> >  }
> >  
> >  static const struct of_device_id adc128_of_match[] = {
> > -	{ .compatible = "ti,adc128s052", .data = (void*)0L, },
> > -	{ .compatible = "ti,adc122s021", .data = (void*)1L, },
> > -	{ .compatible = "ti,adc122s051", .data = (void*)1L, },
> > -	{ .compatible = "ti,adc122s101", .data = (void*)1L, },
> > -	{ .compatible = "ti,adc124s021", .data = (void*)2L, },
> > -	{ .compatible = "ti,adc124s051", .data = (void*)2L, },
> > -	{ .compatible = "ti,adc124s101", .data = (void*)2L, },
> > +	{ .compatible = "ti,adc128s052", .data = &adc128_config[0] },
> > +	{ .compatible = "ti,adc122s021", .data = &adc128_config[1] },
> > +	{ .compatible = "ti,adc122s051", .data = &adc128_config[1] },
> > +	{ .compatible = "ti,adc122s101", .data = &adc128_config[1] },
> > +	{ .compatible = "ti,adc124s021", .data = &adc128_config[2] },
> > +	{ .compatible = "ti,adc124s051", .data = &adc128_config[2] },
> > +	{ .compatible = "ti,adc124s101", .data = &adc128_config[2] },
> >  	{ /* sentinel */ },
> >  };
> >  MODULE_DEVICE_TABLE(of, adc128_of_match);
> >  
> >  static const struct spi_device_id adc128_id[] = {
> > -	{ "adc128s052", 0 },	/* index into adc128_config */
> > -	{ "adc122s021",	1 },
> > -	{ "adc122s051",	1 },
> > -	{ "adc122s101",	1 },
> > -	{ "adc124s021", 2 },
> > -	{ "adc124s051", 2 },
> > -	{ "adc124s101", 2 },
> > +	{ "adc128s052", (kernel_ulong_t)&adc128_config[0] },
> > +	{ "adc122s021",	(kernel_ulong_t)&adc128_config[1] },
> > +	{ "adc122s051",	(kernel_ulong_t)&adc128_config[1] },
> > +	{ "adc122s101",	(kernel_ulong_t)&adc128_config[1] },
> > +	{ "adc124s021", (kernel_ulong_t)&adc128_config[2] },
> > +	{ "adc124s051", (kernel_ulong_t)&adc128_config[2] },
> > +	{ "adc124s101", (kernel_ulong_t)&adc128_config[2] },
> >  	{ }
> >  };
> >  MODULE_DEVICE_TABLE(spi, adc128_id);
> >  
> >  #ifdef CONFIG_ACPI
> >  static const struct acpi_device_id adc128_acpi_match[] = {
> > -	{ "AANT1280", 2 }, /* ADC124S021 compatible ACPI ID */
> > +	{ "AANT1280", (kernel_ulong_t)&adc128_config[2] },
> >  	{ }
> >  };
> >  MODULE_DEVICE_TABLE(acpi, adc128_acpi_match);  
>
  
Andy Shevchenko Dec. 28, 2022, 9:59 a.m. UTC | #5
On Fri, Dec 23, 2022 at 03:44:50PM +0000, Jonathan Cameron wrote:
> On Fri, 23 Dec 2022 15:22:42 +0000
> Jonathan Cameron <jic23@kernel.org> wrote:
> 
> > On Wed, 14 Dec 2022 13:49:43 +0200
> > Andy Shevchenko <andriy.shevchenko@linux.intel.com> wrote:
> > 
> > > The spi_get_device_match_data() helps to get driver data from the
> > > firmware node or SPI ID table. Use it instead of open coding.
> > > 
> > > While at it, switch ID tables to provide an acrual pointers to
> > > the configuration data.
> > > 
> > > Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> > > ---
> > > 
> > > Requires aea672d054a2 ("spi: Introduce spi_get_device_match_data()
> > > helper") which is part of upstream as of today.  
> > 
> > I rebased to get that (will rebase again on rc1).
> > 
> > Applied to the togreg branch of iio.git and pushed out as testing
> > to keep 0-day busy over my holidays.
> 
> I take it back...  Build test failed...

As comment on the first patch stays this requires an SPI core patch, which is
now the part of the v6.2-rc1.

Can you reapply it taking the above into consideration?
  
Jonathan Cameron Dec. 31, 2022, 2:45 p.m. UTC | #6
On Wed, 28 Dec 2022 11:59:53 +0200
Andy Shevchenko <andriy.shevchenko@linux.intel.com> wrote:

> On Fri, Dec 23, 2022 at 03:44:50PM +0000, Jonathan Cameron wrote:
> > On Fri, 23 Dec 2022 15:22:42 +0000
> > Jonathan Cameron <jic23@kernel.org> wrote:
> >   
> > > On Wed, 14 Dec 2022 13:49:43 +0200
> > > Andy Shevchenko <andriy.shevchenko@linux.intel.com> wrote:
> > >   
> > > > The spi_get_device_match_data() helps to get driver data from the
> > > > firmware node or SPI ID table. Use it instead of open coding.
> > > > 
> > > > While at it, switch ID tables to provide an acrual pointers to
> > > > the configuration data.
> > > > 
> > > > Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> > > > ---
> > > > 
> > > > Requires aea672d054a2 ("spi: Introduce spi_get_device_match_data()
> > > > helper") which is part of upstream as of today.    
> > > 
> > > I rebased to get that (will rebase again on rc1).
> > > 
> > > Applied to the togreg branch of iio.git and pushed out as testing
> > > to keep 0-day busy over my holidays.  
> > 
> > I take it back...  Build test failed...  
> 
> As comment on the first patch stays this requires an SPI core patch, which is
> now the part of the v6.2-rc1.
> 
> Can you reapply it taking the above into consideration?
>

I should have been more specific though I do mention rebasing to get the
patch above.. Doesn't build with it.

Signature of spi_get_device_match_data is:
extern const void *
spi_get_device_match_data(const struct spi_device *sdev);

and you are passing it a struct device * which rather implies you didn't
successfully build test this.

Jonathan
  
Andy Shevchenko Dec. 31, 2022, 6:24 p.m. UTC | #7
On Sat, Dec 31, 2022 at 02:45:58PM +0000, Jonathan Cameron wrote:
> On Wed, 28 Dec 2022 11:59:53 +0200
> Andy Shevchenko <andriy.shevchenko@linux.intel.com> wrote:

...

> I should have been more specific though I do mention rebasing to get the
> patch above.. Doesn't build with it.
> 
> Signature of spi_get_device_match_data is:
> extern const void *
> spi_get_device_match_data(const struct spi_device *sdev);
> 
> and you are passing it a struct device * which rather implies you didn't
> successfully build test this.

Definitely. Thanks for spotting this, I'll investigate what happened on my side
that it wasn't built.
  

Patch

diff --git a/drivers/iio/adc/ti-adc128s052.c b/drivers/iio/adc/ti-adc128s052.c
index b3d5b9b7255b..9dfc625100b6 100644
--- a/drivers/iio/adc/ti-adc128s052.c
+++ b/drivers/iio/adc/ti-adc128s052.c
@@ -139,16 +139,11 @@  static void adc128_disable_regulator(void *reg)
 
 static int adc128_probe(struct spi_device *spi)
 {
+	const struct adc128_configuration *config;
 	struct iio_dev *indio_dev;
-	unsigned int config;
 	struct adc128 *adc;
 	int ret;
 
-	if (dev_fwnode(&spi->dev))
-		config = (unsigned long) device_get_match_data(&spi->dev);
-	else
-		config = spi_get_device_id(spi)->driver_data;
-
 	indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*adc));
 	if (!indio_dev)
 		return -ENOMEM;
@@ -160,6 +155,8 @@  static int adc128_probe(struct spi_device *spi)
 	indio_dev->modes = INDIO_DIRECT_MODE;
 	indio_dev->info = &adc128_info;
 
+	config = spi_get_device_match_data(&spi->dev);
+
 	indio_dev->channels = adc128_config[config].channels;
 	indio_dev->num_channels = adc128_config[config].num_channels;
 
@@ -181,32 +178,32 @@  static int adc128_probe(struct spi_device *spi)
 }
 
 static const struct of_device_id adc128_of_match[] = {
-	{ .compatible = "ti,adc128s052", .data = (void*)0L, },
-	{ .compatible = "ti,adc122s021", .data = (void*)1L, },
-	{ .compatible = "ti,adc122s051", .data = (void*)1L, },
-	{ .compatible = "ti,adc122s101", .data = (void*)1L, },
-	{ .compatible = "ti,adc124s021", .data = (void*)2L, },
-	{ .compatible = "ti,adc124s051", .data = (void*)2L, },
-	{ .compatible = "ti,adc124s101", .data = (void*)2L, },
+	{ .compatible = "ti,adc128s052", .data = &adc128_config[0] },
+	{ .compatible = "ti,adc122s021", .data = &adc128_config[1] },
+	{ .compatible = "ti,adc122s051", .data = &adc128_config[1] },
+	{ .compatible = "ti,adc122s101", .data = &adc128_config[1] },
+	{ .compatible = "ti,adc124s021", .data = &adc128_config[2] },
+	{ .compatible = "ti,adc124s051", .data = &adc128_config[2] },
+	{ .compatible = "ti,adc124s101", .data = &adc128_config[2] },
 	{ /* sentinel */ },
 };
 MODULE_DEVICE_TABLE(of, adc128_of_match);
 
 static const struct spi_device_id adc128_id[] = {
-	{ "adc128s052", 0 },	/* index into adc128_config */
-	{ "adc122s021",	1 },
-	{ "adc122s051",	1 },
-	{ "adc122s101",	1 },
-	{ "adc124s021", 2 },
-	{ "adc124s051", 2 },
-	{ "adc124s101", 2 },
+	{ "adc128s052", (kernel_ulong_t)&adc128_config[0] },
+	{ "adc122s021",	(kernel_ulong_t)&adc128_config[1] },
+	{ "adc122s051",	(kernel_ulong_t)&adc128_config[1] },
+	{ "adc122s101",	(kernel_ulong_t)&adc128_config[1] },
+	{ "adc124s021", (kernel_ulong_t)&adc128_config[2] },
+	{ "adc124s051", (kernel_ulong_t)&adc128_config[2] },
+	{ "adc124s101", (kernel_ulong_t)&adc128_config[2] },
 	{ }
 };
 MODULE_DEVICE_TABLE(spi, adc128_id);
 
 #ifdef CONFIG_ACPI
 static const struct acpi_device_id adc128_acpi_match[] = {
-	{ "AANT1280", 2 }, /* ADC124S021 compatible ACPI ID */
+	{ "AANT1280", (kernel_ulong_t)&adc128_config[2] },
 	{ }
 };
 MODULE_DEVICE_TABLE(acpi, adc128_acpi_match);