mirror of
https://github.com/torvalds/linux.git
synced 2024-09-20 06:53:04 +00:00
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: 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>
This commit is contained in:
parent
b27622f131
commit
3900c6ab41
|
@ -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
|
||||
|
|
|
@ -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]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user