]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
platform/x86: serial-multi-instantiate: Don't require both I2C and SPI
authorRichard Fitzgerald <rf@opensource.cirrus.com>
Wed, 14 Aug 2024 13:29:39 +0000 (14:29 +0100)
committerHans de Goede <hdegoede@redhat.com>
Mon, 19 Aug 2024 13:16:04 +0000 (15:16 +0200)
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>
drivers/platform/x86/Kconfig
drivers/platform/x86/serial-multi-instantiate.c

index ddfccc226751f4dcea9d9b3fee50a16d88c6cdd9..3875abba5a7903c2ee9420b9e969a8f30df9324d 100644 (file)
@@ -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
index 3be016cfe6015a0d2d59a302e1233f8d5627e793..7c04cc9e5891be201cf8d43b2e67cca86b9fb0a4 100644 (file)
@@ -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;
        }