2022-06-30 23:02:45

by Nishanth Menon

[permalink] [raw]
Subject: [PATCH] iio: adc: ti-adc128s052: Fix number of channels when device tree is used

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: <[email protected]> # 5.0+
Signed-off-by: Nishanth Menon <[email protected]>
---

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);
--
2.31.1


2022-07-01 03:42:32

by Nishanth Menon

[permalink] [raw]
Subject: Re: [PATCH] iio: adc: ti-adc128s052: Fix number of channels when device tree is used

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?

[...]

--
Regards,
Nishanth Menon
Key (0xDDB5849D1736249D) / Fingerprint: F8A2 8693 54EB 8232 17A3 1A34 DDB5 849D 1736 249D

2022-07-01 08:32:18

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH] iio: adc: ti-adc128s052: Fix number of channels when device tree is used

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-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: 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/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=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 <[email protected]>

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

--
0-DAY CI Kernel Test Service
https://01.org/lkp


Attachments:
(No filename) (3.99 kB)
config (166.36 kB)
Download all attachments

2022-07-01 10:32:19

by Andy Shevchenko

[permalink] [raw]
Subject: Re: [PATCH] iio: adc: ti-adc128s052: Fix number of channels when device tree is used

On Fri, Jul 1, 2022 at 5:41 AM Nishanth Menon <[email protected]> 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).

--
With Best Regards,
Andy Shevchenko

2022-07-01 10:46:36

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH] iio: adc: ti-adc128s052: Fix number of channels when device tree is used

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-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: 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/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 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 <[email protected]>


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

--
0-DAY CI Kernel Test Service
https://01.org/lkp


Attachments:
(No filename) (4.26 kB)
config (158.57 kB)
Download all attachments

2022-07-01 10:50:22

by Andy Shevchenko

[permalink] [raw]
Subject: Re: [PATCH] iio: adc: ti-adc128s052: Fix number of channels when device tree is used

On Fri, Jul 1, 2022 at 1:02 AM Nishanth Menon <[email protected]> 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: <[email protected]> # 5.0+
> Signed-off-by: Nishanth Menon <[email protected]>

...

> + { .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.

--
With Best Regards,
Andy Shevchenko

2022-07-01 17:11:32

by Jonathan Cameron

[permalink] [raw]
Subject: Re: [PATCH] iio: adc: ti-adc128s052: Fix number of channels when device tree is used

On Fri, 1 Jul 2022 12:13:24 +0200
Andy Shevchenko <[email protected]> wrote:

> On Fri, Jul 1, 2022 at 1:02 AM Nishanth Menon <[email protected]> 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: <[email protected]> # 5.0+
> > Signed-off-by: Nishanth Menon <[email protected]>
>
> ...
>
> > + { .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.
>

2022-07-05 18:09:35

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH] iio: adc: ti-adc128s052: Fix number of channels when device tree is used

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/[email protected]/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 <[email protected]>

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

--
0-DAY CI Kernel Test Service
https://01.org/lkp