Message ID | 20220630230107.13438-1-nm@ti.com (mailing list archive) |
---|---|
State | Changes Requested |
Headers | show |
Series | iio: adc: ti-adc128s052: Fix number of channels when device tree is used | expand |
On 18:01-20220630, Nishanth Menon wrote: [...] > diff --git a/drivers/iio/adc/ti-adc128s052.c b/drivers/iio/adc/ti-adc128s052.c > index 622fd384983c..21a7764cbb93 100644 > --- a/drivers/iio/adc/ti-adc128s052.c > +++ b/drivers/iio/adc/ti-adc128s052.c > @@ -181,13 +181,13 @@ static int adc128_probe(struct spi_device *spi) > } > > static const struct of_device_id adc128_of_match[] = { > - { .compatible = "ti,adc128s052", }, > - { .compatible = "ti,adc122s021", }, > - { .compatible = "ti,adc122s051", }, > - { .compatible = "ti,adc122s101", }, > - { .compatible = "ti,adc124s021", }, > - { .compatible = "ti,adc124s051", }, > - { .compatible = "ti,adc124s101", }, > + { .compatible = "ti,adc128s052", .data = 0}, I should probably cast these as .data = (void *)0 thoughts? [...]
On Fri, Jul 1, 2022 at 5:41 AM Nishanth Menon <nm@ti.com> wrote: > On 18:01-20220630, Nishanth Menon wrote: ... > > static const struct of_device_id adc128_of_match[] = { > > - { .compatible = "ti,adc128s052", }, > > - { .compatible = "ti,adc122s021", }, > > - { .compatible = "ti,adc122s051", }, > > - { .compatible = "ti,adc122s101", }, > > - { .compatible = "ti,adc124s021", }, > > - { .compatible = "ti,adc124s051", }, > > - { .compatible = "ti,adc124s101", }, > > + { .compatible = "ti,adc128s052", .data = 0}, > > I should probably cast these as .data = (void *)0 thoughts? The 0 is default. You shouldn't use that in the first place for something meaningful rather than "no, we have no driver data for this chip).
On Fri, Jul 1, 2022 at 1:02 AM Nishanth Menon <nm@ti.com> wrote: > > When device_match_data is called - with device tree, of_match list is device_get_match_data() ? > looked up to find the data, which by default is 0. So, no matter which > kind of device compatible we use, we match with config 0 which implies > we enable 8 channels even on devices that do not have 8 channels. > > Solve it by providing the match data similar to what we do with the ACPI > lookup information. > > Fixes: 9e611c9e5a20 ("iio: adc128s052: Add OF match table") > Cc: <stable@vger.kernel.org> # 5.0+ > Signed-off-by: Nishanth Menon <nm@ti.com> ... > + { .compatible = "ti,adc128s052", .data = 0}, No assignment, 0 _is_ the default here. > + { .compatible = "ti,adc122s021", .data = 1}, > + { .compatible = "ti,adc122s051", .data = 1}, > + { .compatible = "ti,adc122s101", .data = 1}, > + { .compatible = "ti,adc124s021", .data = 2}, > + { .compatible = "ti,adc124s051", .data = 2}, > + { .compatible = "ti,adc124s101", .data = 2}, What you need _ideally_ is rather use pointers to data structure where each of that chip is defined, then it will be as simple as const struct my_custom_drvdata *data; data = device_get_match_data(dev); Where my_custom_drvdata::num_of_channels will be already assigned to whatever you want on a per chip basis. If the number of channels is the only data you have, then yes, cast it to void * in the OF ID table and num = (uintptr_t)device_get_match_data(dev); will suffice.
On Fri, 1 Jul 2022 12:13:24 +0200 Andy Shevchenko <andy.shevchenko@gmail.com> wrote: > On Fri, Jul 1, 2022 at 1:02 AM Nishanth Menon <nm@ti.com> wrote: > > > > When device_match_data is called - with device tree, of_match list is > > device_get_match_data() ? > > > looked up to find the data, which by default is 0. So, no matter which > > kind of device compatible we use, we match with config 0 which implies > > we enable 8 channels even on devices that do not have 8 channels. > > > > Solve it by providing the match data similar to what we do with the ACPI > > lookup information. > > > > Fixes: 9e611c9e5a20 ("iio: adc128s052: Add OF match table") > > Cc: <stable@vger.kernel.org> # 5.0+ > > Signed-off-by: Nishanth Menon <nm@ti.com> > > ... > > > + { .compatible = "ti,adc128s052", .data = 0}, > > No assignment, 0 _is_ the default here. > > > + { .compatible = "ti,adc122s021", .data = 1}, > > + { .compatible = "ti,adc122s051", .data = 1}, > > + { .compatible = "ti,adc122s101", .data = 1}, > > + { .compatible = "ti,adc124s021", .data = 2}, > > + { .compatible = "ti,adc124s051", .data = 2}, > > + { .compatible = "ti,adc124s101", .data = 2}, > > What you need _ideally_ is rather use pointers to data structure where > each of that chip is defined, then it will be as simple as > > > const struct my_custom_drvdata *data; > > data = device_get_match_data(dev); > > Where my_custom_drvdata::num_of_channels will be already assigned to > whatever you want on a per chip basis. Agreed. That's much nicer and a not a lot larger change so still suitable as a fix. > > If the number of channels is the only data you have, then yes, cast it > to void * in the OF ID table and It's not just the number of channels. This is an index into an array of chip type specific structures. Hence the driver is half way to what you suggested. Using a pointer for the ACPI and DT paths is the right way to do this. For the spi_device_id table, you could stick with an index, or move to casting a pointer to an integer, I don't really mind. Thanks, Jonathan > > num = (uintptr_t)device_get_match_data(dev); > > will suffice. >
Hi Nishanth, I love your patch! Perhaps something to improve: [auto build test WARNING on jic23-iio/togreg] [also build test WARNING on linus/master v5.19-rc5 next-20220705] [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] url: https://github.com/intel-lab-lkp/linux/commits/Nishanth-Menon/iio-adc-ti-adc128s052-Fix-number-of-channels-when-device-tree-is-used/20220701-070342 base: https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git togreg config: nios2-randconfig-r036-20220703 (https://download.01.org/0day-ci/archive/20220706/202207060155.zkacpxjc-lkp@intel.com/config) compiler: nios2-linux-gcc (GCC) 11.3.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/d5184722ec9ae186da9bed1497e4804297f2040b git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Nishanth-Menon/iio-adc-ti-adc128s052-Fix-number-of-channels-when-device-tree-is-used/20220701-070342 git checkout d5184722ec9ae186da9bed1497e4804297f2040b # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.3.0 make.cross W=1 O=build_dir ARCH=nios2 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:185:50: warning: initialization of 'const void *' from 'int' makes pointer from integer without a cast [-Wint-conversion] 185 | { .compatible = "ti,adc122s021", .data = 1}, | ^ drivers/iio/adc/ti-adc128s052.c:185:50: note: (near initialization for 'adc128_of_match[1].data') drivers/iio/adc/ti-adc128s052.c:186:50: warning: initialization of 'const void *' from 'int' makes pointer from integer without a cast [-Wint-conversion] 186 | { .compatible = "ti,adc122s051", .data = 1}, | ^ drivers/iio/adc/ti-adc128s052.c:186:50: note: (near initialization for 'adc128_of_match[2].data') drivers/iio/adc/ti-adc128s052.c:187:50: warning: initialization of 'const void *' from 'int' makes pointer from integer without a cast [-Wint-conversion] 187 | { .compatible = "ti,adc122s101", .data = 1}, | ^ drivers/iio/adc/ti-adc128s052.c:187:50: note: (near initialization for 'adc128_of_match[3].data') drivers/iio/adc/ti-adc128s052.c:188:50: warning: initialization of 'const void *' from 'int' makes pointer from integer without a cast [-Wint-conversion] 188 | { .compatible = "ti,adc124s021", .data = 2}, | ^ drivers/iio/adc/ti-adc128s052.c:188:50: note: (near initialization for 'adc128_of_match[4].data') drivers/iio/adc/ti-adc128s052.c:189:50: warning: initialization of 'const void *' from 'int' makes pointer from integer without a cast [-Wint-conversion] 189 | { .compatible = "ti,adc124s051", .data = 2}, | ^ drivers/iio/adc/ti-adc128s052.c:189:50: note: (near initialization for 'adc128_of_match[5].data') drivers/iio/adc/ti-adc128s052.c:190:50: warning: initialization of 'const void *' from 'int' makes pointer from integer without a cast [-Wint-conversion] 190 | { .compatible = "ti,adc124s101", .data = 2}, | ^ drivers/iio/adc/ti-adc128s052.c:190:50: note: (near initialization for 'adc128_of_match[6].data') vim +185 drivers/iio/adc/ti-adc128s052.c 182 183 static const struct of_device_id adc128_of_match[] = { 184 { .compatible = "ti,adc128s052", .data = 0}, > 185 { .compatible = "ti,adc122s021", .data = 1}, 186 { .compatible = "ti,adc122s051", .data = 1}, 187 { .compatible = "ti,adc122s101", .data = 1}, 188 { .compatible = "ti,adc124s021", .data = 2}, 189 { .compatible = "ti,adc124s051", .data = 2}, 190 { .compatible = "ti,adc124s101", .data = 2}, 191 { /* sentinel */ }, 192 }; 193 MODULE_DEVICE_TABLE(of, adc128_of_match); 194
diff --git a/drivers/iio/adc/ti-adc128s052.c b/drivers/iio/adc/ti-adc128s052.c index 622fd384983c..21a7764cbb93 100644 --- a/drivers/iio/adc/ti-adc128s052.c +++ b/drivers/iio/adc/ti-adc128s052.c @@ -181,13 +181,13 @@ static int adc128_probe(struct spi_device *spi) } static const struct of_device_id adc128_of_match[] = { - { .compatible = "ti,adc128s052", }, - { .compatible = "ti,adc122s021", }, - { .compatible = "ti,adc122s051", }, - { .compatible = "ti,adc122s101", }, - { .compatible = "ti,adc124s021", }, - { .compatible = "ti,adc124s051", }, - { .compatible = "ti,adc124s101", }, + { .compatible = "ti,adc128s052", .data = 0}, + { .compatible = "ti,adc122s021", .data = 1}, + { .compatible = "ti,adc122s051", .data = 1}, + { .compatible = "ti,adc122s101", .data = 1}, + { .compatible = "ti,adc124s021", .data = 2}, + { .compatible = "ti,adc124s051", .data = 2}, + { .compatible = "ti,adc124s101", .data = 2}, { /* sentinel */ }, }; MODULE_DEVICE_TABLE(of, adc128_of_match);
When device_match_data is called - with device tree, of_match list is looked up to find the data, which by default is 0. So, no matter which kind of device compatible we use, we match with config 0 which implies we enable 8 channels even on devices that do not have 8 channels. Solve it by providing the match data similar to what we do with the ACPI lookup information. Fixes: 9e611c9e5a20 ("iio: adc128s052: Add OF match table") Cc: <stable@vger.kernel.org> # 5.0+ Signed-off-by: Nishanth Menon <nm@ti.com> --- Side note: commits 9e611c9e5a20c ("iio: adc128s052: Add OF match table"), 37cd3c8768edc ("iio: adc128s052: Add pin-compatible IDs"), b41fa86b67bd3 ("iio:adc128s052: add support for adc124s021") introduce code that is fixed by this patch, but it makes no real sense to go and split this patch to apply to versions older than 5.0 - which seems to be the earliest the patch would apply. I picked the "Add OF match table" as the patch that set the precedence which follow on patches followed. drivers/iio/adc/ti-adc128s052.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)