Skip to content

Commit

Permalink
platform/x86: serial-multi-instantiate: Don't require both I2C and SPI
Browse files Browse the repository at this point in the history
Change the Kconfig dependency so that it doesn't require both I2C and SPI
subsystems to be built. Make a few small changes to the code so that the
code for a bus is only called if the bus is being built.

When SPI support was added to serial-multi-instantiate it created a
dependency that both CONFIG_I2C and CONFIG_SPI must be enabled.
Typically they are, but there's no reason why this should be a
requirement. A specific kernel build could have only I2C devices
or only SPI devices. It should be possible to use serial-multi-instantiate
if only I2C or only SPI is enabled.

The dependency formula used is:

  depends on (I2C && !SPI) || (!I2C && SPI) || (I2C && SPI)

The advantage of this approach is that if I2C=m or SPI=m then
SERIAL_MULTI_INSTANTIATE is limited to n/m.

Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
Link: https://lore.kernel.org/r/20240814132939.308696-1-rf@opensource.cirrus.com
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
  • Loading branch information
Richard Fitzgerald authored and Hans de Goede committed Aug 19, 2024
1 parent b27622f commit 3900c6a
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 9 deletions.
3 changes: 2 additions & 1 deletion drivers/platform/x86/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -1000,7 +1000,8 @@ config TOPSTAR_LAPTOP

config SERIAL_MULTI_INSTANTIATE
tristate "Serial bus multi instantiate pseudo device driver"
depends on I2C && SPI && ACPI
depends on ACPI
depends on (I2C && !SPI) || (!I2C && SPI) || (I2C && SPI)
help
Some ACPI-based systems list multiple devices in a single ACPI
firmware-node. This driver will instantiate separate clients
Expand Down
32 changes: 24 additions & 8 deletions drivers/platform/x86/serial-multi-instantiate.c
Original file line number Diff line number Diff line change
Expand Up @@ -83,11 +83,15 @@ static int smi_get_irq(struct platform_device *pdev, struct acpi_device *adev,

static void smi_devs_unregister(struct smi *smi)
{
#if IS_REACHABLE(CONFIG_I2C)
while (smi->i2c_num--)
i2c_unregister_device(smi->i2c_devs[smi->i2c_num]);
#endif

while (smi->spi_num--)
spi_unregister_device(smi->spi_devs[smi->spi_num]);
if (IS_REACHABLE(CONFIG_SPI)) {
while (smi->spi_num--)
spi_unregister_device(smi->spi_devs[smi->spi_num]);
}
}

/**
Expand Down Expand Up @@ -258,9 +262,15 @@ static int smi_probe(struct platform_device *pdev)

switch (node->bus_type) {
case SMI_I2C:
return smi_i2c_probe(pdev, smi, node->instances);
if (IS_REACHABLE(CONFIG_I2C))
return smi_i2c_probe(pdev, smi, node->instances);

return -ENODEV;
case SMI_SPI:
return smi_spi_probe(pdev, smi, node->instances);
if (IS_REACHABLE(CONFIG_SPI))
return smi_spi_probe(pdev, smi, node->instances);

return -ENODEV;
case SMI_AUTO_DETECT:
/*
* For backwards-compatibility with the existing nodes I2C
Expand All @@ -270,10 +280,16 @@ static int smi_probe(struct platform_device *pdev)
* SpiSerialBus nodes that were previously ignored, and this
* preserves that behavior.
*/
ret = smi_i2c_probe(pdev, smi, node->instances);
if (ret != -ENOENT)
return ret;
return smi_spi_probe(pdev, smi, node->instances);
if (IS_REACHABLE(CONFIG_I2C)) {
ret = smi_i2c_probe(pdev, smi, node->instances);
if (ret != -ENOENT)
return ret;
}

if (IS_REACHABLE(CONFIG_SPI))
return smi_spi_probe(pdev, smi, node->instances);

return -ENODEV;
default:
return -EINVAL;
}
Expand Down

0 comments on commit 3900c6a

Please sign in to comment.