Commit 3900c6ab authored by Richard Fitzgerald's avatar Richard Fitzgerald Committed by Hans de Goede

platform/x86: serial-multi-instantiate: Don't require both I2C and SPI

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: default avatarRichard Fitzgerald <rf@opensource.cirrus.com>
Link: https://lore.kernel.org/r/20240814132939.308696-1-rf@opensource.cirrus.comReviewed-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
parent b27622f1
...@@ -1000,7 +1000,8 @@ config TOPSTAR_LAPTOP ...@@ -1000,7 +1000,8 @@ config TOPSTAR_LAPTOP
config SERIAL_MULTI_INSTANTIATE config SERIAL_MULTI_INSTANTIATE
tristate "Serial bus multi instantiate pseudo device driver" 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 help
Some ACPI-based systems list multiple devices in a single ACPI Some ACPI-based systems list multiple devices in a single ACPI
firmware-node. This driver will instantiate separate clients firmware-node. This driver will instantiate separate clients
......
...@@ -83,11 +83,15 @@ static int smi_get_irq(struct platform_device *pdev, struct acpi_device *adev, ...@@ -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) static void smi_devs_unregister(struct smi *smi)
{ {
#if IS_REACHABLE(CONFIG_I2C)
while (smi->i2c_num--) while (smi->i2c_num--)
i2c_unregister_device(smi->i2c_devs[smi->i2c_num]); i2c_unregister_device(smi->i2c_devs[smi->i2c_num]);
#endif
if (IS_REACHABLE(CONFIG_SPI)) {
while (smi->spi_num--) while (smi->spi_num--)
spi_unregister_device(smi->spi_devs[smi->spi_num]); spi_unregister_device(smi->spi_devs[smi->spi_num]);
}
} }
/** /**
...@@ -258,9 +262,15 @@ static int smi_probe(struct platform_device *pdev) ...@@ -258,9 +262,15 @@ static int smi_probe(struct platform_device *pdev)
switch (node->bus_type) { switch (node->bus_type) {
case SMI_I2C: case SMI_I2C:
if (IS_REACHABLE(CONFIG_I2C))
return smi_i2c_probe(pdev, smi, node->instances); return smi_i2c_probe(pdev, smi, node->instances);
return -ENODEV;
case SMI_SPI: case SMI_SPI:
if (IS_REACHABLE(CONFIG_SPI))
return smi_spi_probe(pdev, smi, node->instances); return smi_spi_probe(pdev, smi, node->instances);
return -ENODEV;
case SMI_AUTO_DETECT: case SMI_AUTO_DETECT:
/* /*
* For backwards-compatibility with the existing nodes I2C * For backwards-compatibility with the existing nodes I2C
...@@ -270,10 +280,16 @@ static int smi_probe(struct platform_device *pdev) ...@@ -270,10 +280,16 @@ static int smi_probe(struct platform_device *pdev)
* SpiSerialBus nodes that were previously ignored, and this * SpiSerialBus nodes that were previously ignored, and this
* preserves that behavior. * preserves that behavior.
*/ */
if (IS_REACHABLE(CONFIG_I2C)) {
ret = smi_i2c_probe(pdev, smi, node->instances); ret = smi_i2c_probe(pdev, smi, node->instances);
if (ret != -ENOENT) if (ret != -ENOENT)
return ret; return ret;
}
if (IS_REACHABLE(CONFIG_SPI))
return smi_spi_probe(pdev, smi, node->instances); return smi_spi_probe(pdev, smi, node->instances);
return -ENODEV;
default: default:
return -EINVAL; return -EINVAL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment