2022-07-09 00:11:22

by Andy Shevchenko

[permalink] [raw]
Subject: [PATCH v1 2/7] platform/x86: serial-multi-instantiate: Improve autodetection

Instead of calling specific resource counter, let just probe each
of the type and see what it says. Also add a debug message when
none is found.

Signed-off-by: Andy Shevchenko <[email protected]>
---
drivers/platform/x86/serial-multi-instantiate.c | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/drivers/platform/x86/serial-multi-instantiate.c b/drivers/platform/x86/serial-multi-instantiate.c
index 97db23243018..e599058196bb 100644
--- a/drivers/platform/x86/serial-multi-instantiate.c
+++ b/drivers/platform/x86/serial-multi-instantiate.c
@@ -232,6 +232,7 @@ static int smi_probe(struct platform_device *pdev)
const struct smi_node *node;
struct acpi_device *adev;
struct smi *smi;
+ int ret;

adev = ACPI_COMPANION(dev);
if (!adev)
@@ -255,15 +256,20 @@ static int smi_probe(struct platform_device *pdev)
case SMI_SPI:
return smi_spi_probe(pdev, adev, smi, node->instances);
case SMI_AUTO_DETECT:
- if (i2c_acpi_client_count(adev) > 0)
- return smi_i2c_probe(pdev, adev, smi, node->instances);
- else
- return smi_spi_probe(pdev, adev, smi, node->instances);
+ ret = smi_i2c_probe(pdev, adev, smi, node->instances);
+ if (ret && ret != -ENOENT)
+ return ret;
+ ret = smi_spi_probe(pdev, adev, smi, node->instances);
+ if (ret && ret != -ENOENT)
+ return ret;
+ if (ret)
+ return dev_err_probe(dev, ret, "Error No resources found\n");
+ break;
default:
return -EINVAL;
}

- return 0; /* never reached */
+ return 0;
}

static int smi_remove(struct platform_device *pdev)
--
2.35.1


2022-07-09 09:57:16

by Hans de Goede

[permalink] [raw]
Subject: Re: [PATCH v1 2/7] platform/x86: serial-multi-instantiate: Improve autodetection

<resend with Stefan added to the To list>

Hi,

On 7/9/22 02:06, Andy Shevchenko wrote:
> Instead of calling specific resource counter, let just probe each
> of the type and see what it says. Also add a debug message when
> none is found.
>
> Signed-off-by: Andy Shevchenko <[email protected]>

Only probing for I2C resources if some are present is deliberate:

commit 68f201f9061c000d7a4a9f359f021b1cd535d62b
Author: Stefan Binding <[email protected]>
Date: Fri Jan 21 17:24:29 2022 +0000

platform/x86: serial-multi-instantiate: Add SPI support

Add support for spi bus in serial-multi-instantiate driver

Some peripherals can have either a I2C or a SPI connection
to the host (but not both) but use the same HID for both
types. So it is not possible to use the HID to determine
whether it is I2C or SPI. The driver must check the node
to see if it contains I2cSerialBus or SpiSerialBus entries.

For backwards-compatibility with the existing nodes I2C is
checked first and if such entries are found ONLY I2C devices
are created. Since some existing nodes that were already
handled by this driver could also contain unrelated
SpiSerialBus nodes that were previously ignored, and this
preserves that behavior. If there is ever a need to handle
a node where both I2C and SPI devices must be instantiated
this can be added in future.

Signed-off-by: Stefan Binding <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Reviewed-by: Hans de Goede <[email protected]>
Signed-off-by: Hans de Goede <[email protected]>

So nack for this change.

Regards,

Hans



> ---
> drivers/platform/x86/serial-multi-instantiate.c | 16 +++++++++++-----
> 1 file changed, 11 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/platform/x86/serial-multi-instantiate.c b/drivers/platform/x86/serial-multi-instantiate.c
> index 97db23243018..e599058196bb 100644
> --- a/drivers/platform/x86/serial-multi-instantiate.c
> +++ b/drivers/platform/x86/serial-multi-instantiate.c
> @@ -232,6 +232,7 @@ static int smi_probe(struct platform_device *pdev)
> const struct smi_node *node;
> struct acpi_device *adev;
> struct smi *smi;
> + int ret;
>
> adev = ACPI_COMPANION(dev);
> if (!adev)
> @@ -255,15 +256,20 @@ static int smi_probe(struct platform_device *pdev)
> case SMI_SPI:
> return smi_spi_probe(pdev, adev, smi, node->instances);
> case SMI_AUTO_DETECT:
> - if (i2c_acpi_client_count(adev) > 0)
> - return smi_i2c_probe(pdev, adev, smi, node->instances);
> - else
> - return smi_spi_probe(pdev, adev, smi, node->instances);
> + ret = smi_i2c_probe(pdev, adev, smi, node->instances);
> + if (ret && ret != -ENOENT)
> + return ret;
> + ret = smi_spi_probe(pdev, adev, smi, node->instances);
> + if (ret && ret != -ENOENT)
> + return ret;
> + if (ret)
> + return dev_err_probe(dev, ret, "Error No resources found\n");
> + break;
> default:
> return -EINVAL;
> }
>
> - return 0; /* never reached */
> + return 0;
> }
>
> static int smi_remove(struct platform_device *pdev)

2022-07-09 10:08:10

by Hans de Goede

[permalink] [raw]
Subject: Re: [PATCH v1 2/7] platform/x86: serial-multi-instantiate: Improve autodetection

Hi,

On 7/9/22 02:06, Andy Shevchenko wrote:
> Instead of calling specific resource counter, let just probe each
> of the type and see what it says. Also add a debug message when
> none is found.
>
> Signed-off-by: Andy Shevchenko <[email protected]>

Only probing for I2C resources if some are present is deliberate:

commit 68f201f9061c000d7a4a9f359f021b1cd535d62b
Author: Stefan Binding <[email protected]>
Date: Fri Jan 21 17:24:29 2022 +0000

platform/x86: serial-multi-instantiate: Add SPI support

Add support for spi bus in serial-multi-instantiate driver

Some peripherals can have either a I2C or a SPI connection
to the host (but not both) but use the same HID for both
types. So it is not possible to use the HID to determine
whether it is I2C or SPI. The driver must check the node
to see if it contains I2cSerialBus or SpiSerialBus entries.

For backwards-compatibility with the existing nodes I2C is
checked first and if such entries are found ONLY I2C devices
are created. Since some existing nodes that were already
handled by this driver could also contain unrelated
SpiSerialBus nodes that were previously ignored, and this
preserves that behavior. If there is ever a need to handle
a node where both I2C and SPI devices must be instantiated
this can be added in future.

Signed-off-by: Stefan Binding <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Reviewed-by: Hans de Goede <[email protected]>
Signed-off-by: Hans de Goede <[email protected]>

So nack for this change.

Regards,

Hans



> ---
> drivers/platform/x86/serial-multi-instantiate.c | 16 +++++++++++-----
> 1 file changed, 11 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/platform/x86/serial-multi-instantiate.c b/drivers/platform/x86/serial-multi-instantiate.c
> index 97db23243018..e599058196bb 100644
> --- a/drivers/platform/x86/serial-multi-instantiate.c
> +++ b/drivers/platform/x86/serial-multi-instantiate.c
> @@ -232,6 +232,7 @@ static int smi_probe(struct platform_device *pdev)
> const struct smi_node *node;
> struct acpi_device *adev;
> struct smi *smi;
> + int ret;
>
> adev = ACPI_COMPANION(dev);
> if (!adev)
> @@ -255,15 +256,20 @@ static int smi_probe(struct platform_device *pdev)
> case SMI_SPI:
> return smi_spi_probe(pdev, adev, smi, node->instances);
> case SMI_AUTO_DETECT:
> - if (i2c_acpi_client_count(adev) > 0)
> - return smi_i2c_probe(pdev, adev, smi, node->instances);
> - else
> - return smi_spi_probe(pdev, adev, smi, node->instances);
> + ret = smi_i2c_probe(pdev, adev, smi, node->instances);
> + if (ret && ret != -ENOENT)
> + return ret;
> + ret = smi_spi_probe(pdev, adev, smi, node->instances);
> + if (ret && ret != -ENOENT)
> + return ret;
> + if (ret)
> + return dev_err_probe(dev, ret, "Error No resources found\n");
> + break;
> default:
> return -EINVAL;
> }
>
> - return 0; /* never reached */
> + return 0;
> }
>
> static int smi_remove(struct platform_device *pdev)

2022-07-09 11:38:36

by Hans de Goede

[permalink] [raw]
Subject: Re: [PATCH v1 2/7] platform/x86: serial-multi-instantiate: Improve autodetection

Hi,

On 7/9/22 11:52, Andy Shevchenko wrote:
>
>
> On Saturday, July 9, 2022, Hans de Goede <[email protected] <mailto:[email protected]>> wrote:
>
> Hi,
>
> On 7/9/22 02:06, Andy Shevchenko wrote:
> > Instead of calling specific resource counter, let just probe each
> > of the type and see what it says. Also add a debug message when
> > none is found.
> >
> > Signed-off-by: Andy Shevchenko <[email protected] <mailto:[email protected]>>
>
> Only probing for I2C resources if some are present is deliberate:
>
> commit 68f201f9061c000d7a4a9f359f021b1cd535d62b
> Author: Stefan Binding <[email protected] <mailto:[email protected]>>
> Date:   Fri Jan 21 17:24:29 2022 +0000
>
>     platform/x86: serial-multi-instantiate: Add SPI support
>
>     Add support for spi bus in serial-multi-instantiate driver
>
>     Some peripherals can have either a I2C or a SPI connection
>     to the host (but not both) but use the same HID for both
>     types. So it is not possible to use the HID to determine
>     whether it is I2C or SPI. The driver must check the node
>     to see if it contains I2cSerialBus or SpiSerialBus entries.
>
>     For backwards-compatibility with the existing nodes I2C is
>     checked first and if such entries are found ONLY I2C devices
>     are created. Since some existing nodes that were already
>     handled by this driver could also contain unrelated
>     SpiSerialBus nodes that were previously ignored, and this
>     preserves that behavior. If there is ever a need to handle
>     a node where both I2C and SPI devices must be instantiated
>     this can be added in future.
>
>     Signed-off-by: Stefan Binding <[email protected] <mailto:[email protected]>>
>     Link: https://lore.kernel.org/r/[email protected] <https://lore.kernel.org/r/[email protected]>
>     Reviewed-by: Hans de Goede <[email protected] <mailto:[email protected]>>
>     Signed-off-by: Hans de Goede <[email protected] <mailto:[email protected]>>
>
> So nack for this 
>
>
>
> This effectively means nack to the series.
> But it’s easy to fix. I can add check for ret == 0.

I don't see how this is a nack for the series, just drop 1/7 + 2/7
and rebase the rest. Yes there will be conflicts to resolve in
the rebase, but the rest of the cleanups can still go upstream
after the rebase.

Regards,

Hans



> > ---
> >  drivers/platform/x86/serial-multi-instantiate.c | 16 +++++++++++-----
> >  1 file changed, 11 insertions(+), 5 deletions(-)
> >
> > diff --git a/drivers/platform/x86/serial-multi-instantiate.c b/drivers/platform/x86/serial-multi-instantiate.c
> > index 97db23243018..e599058196bb 100644
> > --- a/drivers/platform/x86/serial-multi-instantiate.c
> > +++ b/drivers/platform/x86/serial-multi-instantiate.c
> > @@ -232,6 +232,7 @@ static int smi_probe(struct platform_device *pdev)
> >       const struct smi_node *node;
> >       struct acpi_device *adev;
> >       struct smi *smi;
> > +     int ret;
> > 
> >       adev = ACPI_COMPANION(dev);
> >       if (!adev)
> > @@ -255,15 +256,20 @@ static int smi_probe(struct platform_device *pdev)
> >       case SMI_SPI:
> >               return smi_spi_probe(pdev, adev, smi, node->instances);
> >       case SMI_AUTO_DETECT:
> > -             if (i2c_acpi_client_count(adev) > 0)
> > -                     return smi_i2c_probe(pdev, adev, smi, node->instances);
> > -             else
> > -                     return smi_spi_probe(pdev, adev, smi, node->instances);
> > +             ret = smi_i2c_probe(pdev, adev, smi, node->instances);
> > +             if (ret && ret != -ENOENT)
> > +                     return ret;
> > +             ret = smi_spi_probe(pdev, adev, smi, node->instances);
> > +             if (ret && ret != -ENOENT)
> > +                     return ret;
> > +             if (ret)
> > +                     return dev_err_probe(dev, ret, "Error No resources found\n");
> > +             break;
> >       default:
> >               return -EINVAL;
> >       }
> > 
> > -     return 0; /* never reached */
> > +     return 0;
> >  }
> > 
> >  static int smi_remove(struct platform_device *pdev)
>
>
>
> --
> With Best Regards,
> Andy Shevchenko
>
>

2022-07-09 11:41:09

by Andy Shevchenko

[permalink] [raw]
Subject: Re: [PATCH v1 2/7] platform/x86: serial-multi-instantiate: Improve autodetection

On Sat, Jul 9, 2022 at 1:00 PM Hans de Goede <[email protected]> wrote:
> On 7/9/22 11:52, Andy Shevchenko wrote:
> > On Saturday, July 9, 2022, Hans de Goede <[email protected] <mailto:[email protected]>> wrote:
> > On 7/9/22 02:06, Andy Shevchenko wrote:

...

> > So nack for this
> >
> > This effectively means nack to the series.

> > But it’s easy to fix. I can add check for ret == 0.

So, are you okay with fixing it this way? See below how.

> I don't see how this is a nack for the series, just drop 1/7 + 2/7
> and rebase the rest. Yes there will be conflicts to resolve in
> the rebase, but the rest of the cleanups can still go upstream
> after the rebase.

Because patch 3 makes a little sense on its own if we drop the patch
2. The rest is the simple cleanups which I do not consider as a core
of this series.

> > > case SMI_AUTO_DETECT:
> > > - if (i2c_acpi_client_count(adev) > 0)
> > > - return smi_i2c_probe(pdev, adev, smi, node->instances);
> > > - else
> > > - return smi_spi_probe(pdev, adev, smi, node->instances);
> > > + ret = smi_i2c_probe(pdev, adev, smi, node->instances);
> > > + if (ret && ret != -ENOENT)
> > > + return ret;

/*
* ...comment about why we do the following check...
*/
if (ret == 0)
return ret;

> > > + ret = smi_spi_probe(pdev, adev, smi, node->instances);
> > > + if (ret && ret != -ENOENT)
> > > + return ret;
> > > + if (ret)
> > > + return dev_err_probe(dev, ret, "Error No resources found\n");
> > > + break;

if (ret == -ENOENT)
return dev_err_probe(...);
return ret;

--
With Best Regards,
Andy Shevchenko

2022-07-09 14:53:58

by Hans de Goede

[permalink] [raw]
Subject: Re: [PATCH v1 2/7] platform/x86: serial-multi-instantiate: Improve autodetection

Hi Andy,

On 7/9/22 13:34, Andy Shevchenko wrote:
> On Sat, Jul 9, 2022 at 1:00 PM Hans de Goede <[email protected]> wrote:
>> On 7/9/22 11:52, Andy Shevchenko wrote:
>>> On Saturday, July 9, 2022, Hans de Goede <[email protected] <mailto:[email protected]>> wrote:
>>> On 7/9/22 02:06, Andy Shevchenko wrote:
>
> ...
>
>>> So nack for this
>>>
>>> This effectively means nack to the series.
>
>>> But it’s easy to fix. I can add check for ret == 0.
>
> So, are you okay with fixing it this way? See below how.
>
>> I don't see how this is a nack for the series, just drop 1/7 + 2/7
>> and rebase the rest. Yes there will be conflicts to resolve in
>> the rebase, but the rest of the cleanups can still go upstream
>> after the rebase.
>
> Because patch 3 makes a little sense on its own if we drop the patch
> 2. The rest is the simple cleanups which I do not consider as a core
> of this series.

Patch 3 just removes the adev == NULL check and pushes
the ACPI_COMPANION(dev) calls into the function needing
the adev, I don't see how that relies on this patch ?

>>> > case SMI_AUTO_DETECT:
>>> > - if (i2c_acpi_client_count(adev) > 0)
>>> > - return smi_i2c_probe(pdev, adev, smi, node->instances);
>>> > - else
>>> > - return smi_spi_probe(pdev, adev, smi, node->instances);
>>> > + ret = smi_i2c_probe(pdev, adev, smi, node->instances);
>>> > + if (ret && ret != -ENOENT)
>>> > + return ret;
>
> /*
> * ...comment about why we do the following check...
> */
> if (ret == 0)
> return ret;

I'm ok with doing things this way. Note you then end up with:

if (ret && ret != -ENOENT)
return ret;

if (ret == 0)
return ret;

Which can be simplified to just:

if (ret != -ENOENT)
return ret;

>
>>> > + ret = smi_spi_probe(pdev, adev, smi, node->instances);
>>> > + if (ret && ret != -ENOENT)
>>> > + return ret;
>>> > + if (ret)
>>> > + return dev_err_probe(dev, ret, "Error No resources found\n");
>>> > + break;
>
> if (ret == -ENOENT)
> return dev_err_probe(...);
> return ret;

Hmm, we don't do this dev_err for the SMI_I2C / SMI_SPI cases,
I see 2 options to solve this:

1) Drop the return calls from switch (node->bus_type) {} instead
always set ret and then break. And do the:

if (ret == -ENOENT)
return dev_err_probe(...);

outside the switch-case

2) Drop the dev_err, the driver-core will already log an error for
the -ENOENT anyways.

Regards,

Hans