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(-)
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);
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).
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-rc4 next-20220630] [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-adc... base: https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git togreg config: i386-randconfig-a002 compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project a9119143a2d1f4d0d0bc1fe0d819e5351b4e0deb) 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/d5184722ec9ae186da9bed1497e480... 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=clang make.cross W=1 O=build_dir ARCH=i386 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:43: warning: incompatible integer to pointer conversion initializing 'const void *' with an expression of type 'int' [-Wint-conversion]
{ .compatible = "ti,adc122s021", .data = 1}, ^ drivers/iio/adc/ti-adc128s052.c:186:43: warning: incompatible integer to pointer conversion initializing 'const void *' with an expression of type 'int' [-Wint-conversion] { .compatible = "ti,adc122s051", .data = 1}, ^ drivers/iio/adc/ti-adc128s052.c:187:43: warning: incompatible integer to pointer conversion initializing 'const void *' with an expression of type 'int' [-Wint-conversion] { .compatible = "ti,adc122s101", .data = 1}, ^ drivers/iio/adc/ti-adc128s052.c:188:43: warning: incompatible integer to pointer conversion initializing 'const void *' with an expression of type 'int' [-Wint-conversion] { .compatible = "ti,adc124s021", .data = 2}, ^ drivers/iio/adc/ti-adc128s052.c:189:43: warning: incompatible integer to pointer conversion initializing 'const void *' with an expression of type 'int' [-Wint-conversion] { .compatible = "ti,adc124s051", .data = 2}, ^ drivers/iio/adc/ti-adc128s052.c:190:43: warning: incompatible integer to pointer conversion initializing 'const void *' with an expression of type 'int' [-Wint-conversion] { .compatible = "ti,adc124s101", .data = 2}, ^ 6 warnings generated.
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
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-rc4 next-20220630] [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-adc... base: https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git togreg config: microblaze-randconfig-s032-20220629 compiler: microblaze-linux-gcc (GCC) 11.3.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # apt-get install sparse # sparse version: v0.6.4-39-gce1a6720-dirty # https://github.com/intel-lab-lkp/linux/commit/d5184722ec9ae186da9bed1497e480... 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 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=microblaze 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
sparse warnings: (new ones prefixed by >>)
drivers/iio/adc/ti-adc128s052.c:184:50: sparse: sparse: Using plain integer as NULL pointer drivers/iio/adc/ti-adc128s052.c:185:50: sparse: sparse: incorrect type in initializer (different base types) @@ expected void const *data @@ got int @@
drivers/iio/adc/ti-adc128s052.c:185:50: sparse: expected void const *data drivers/iio/adc/ti-adc128s052.c:185:50: sparse: got int drivers/iio/adc/ti-adc128s052.c:186:50: sparse: sparse: incorrect type in initializer (different base types) @@ expected void const *data @@ got int @@ drivers/iio/adc/ti-adc128s052.c:186:50: sparse: expected void const *data drivers/iio/adc/ti-adc128s052.c:186:50: sparse: got int drivers/iio/adc/ti-adc128s052.c:187:50: sparse: sparse: incorrect type in initializer (different base types) @@ expected void const *data @@ got int @@ drivers/iio/adc/ti-adc128s052.c:187:50: sparse: expected void const *data drivers/iio/adc/ti-adc128s052.c:187:50: sparse: got int drivers/iio/adc/ti-adc128s052.c:188:50: sparse: sparse: incorrect type in initializer (different base types) @@ expected void const *data @@ got int @@ drivers/iio/adc/ti-adc128s052.c:188:50: sparse: expected void const *data drivers/iio/adc/ti-adc128s052.c:188:50: sparse: got int drivers/iio/adc/ti-adc128s052.c:189:50: sparse: sparse: incorrect type in initializer (different base types) @@ expected void const *data @@ got int @@ drivers/iio/adc/ti-adc128s052.c:189:50: sparse: expected void const *data drivers/iio/adc/ti-adc128s052.c:189:50: sparse: got int drivers/iio/adc/ti-adc128s052.c:190:50: sparse: sparse: incorrect type in initializer (different base types) @@ expected void const *data @@ got int @@ drivers/iio/adc/ti-adc128s052.c:190:50: sparse: expected void const *data drivers/iio/adc/ti-adc128s052.c:190:50: sparse: got int
vim +184 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
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-adc... 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@i...) 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/d5184722ec9ae186da9bed1497e480... 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
linux-stable-mirror@lists.linaro.org