ACPI: scan: Create platform device for BCM4752 and LNV4752 ACPI nodes
authorHans de Goede <hdegoede@redhat.com>
Thu, 30 Dec 2021 11:57:47 +0000 (12:57 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 27 Jan 2022 10:03:48 +0000 (11:03 +0100)
[ Upstream commit f85196bdd5a50da74670250564740fc852b3c239 ]

BCM4752 and LNV4752 ACPI nodes describe a Broadcom 4752 GPS module
attached to an UART of the system.

The GPS modules talk a custom protocol which only works with a closed-
source Android gpsd daemon which knows this protocol.

The ACPI nodes also describe GPIOs to turn the GPS on/off these are
handled by the net/rfkill/rfkill-gpio.c code. This handling predates the
addition of enumeration of ACPI instantiated serdevs to the kernel and
was broken by that addition, because the ACPI scan code now no longer
instantiates platform_device-s for these nodes.

Rename the i2c_multi_instantiate_ids HID list to ignore_serial_bus_ids
and add the BCM4752 and LNV4752 HIDs, so that rfkill-gpio gets
a platform_device to bind to again; and so that a tty cdev for gpsd
gets created for these.

Fixes: e361d1f85855 ("ACPI / scan: Fix enumeration for special UART devices")
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/acpi/scan.c

index 5b54c80..6e9cd41 100644 (file)
@@ -1690,6 +1690,7 @@ static bool acpi_device_enumeration_by_parent(struct acpi_device *device)
 {
        struct list_head resource_list;
        bool is_serial_bus_slave = false;
+       static const struct acpi_device_id ignore_serial_bus_ids[] = {
        /*
         * These devices have multiple I2cSerialBus resources and an i2c-client
         * must be instantiated for each, each with its own i2c_device_id.
@@ -1698,11 +1699,18 @@ static bool acpi_device_enumeration_by_parent(struct acpi_device *device)
         * drivers/platform/x86/i2c-multi-instantiate.c driver, which knows
         * which i2c_device_id to use for each resource.
         */
-       static const struct acpi_device_id i2c_multi_instantiate_ids[] = {
                {"BSG1160", },
                {"BSG2150", },
                {"INT33FE", },
                {"INT3515", },
+       /*
+        * HIDs of device with an UartSerialBusV2 resource for which userspace
+        * expects a regular tty cdev to be created (instead of the in kernel
+        * serdev) and which have a kernel driver which expects a platform_dev
+        * such as the rfkill-gpio driver.
+        */
+               {"BCM4752", },
+               {"LNV4752", },
                {}
        };
 
@@ -1716,8 +1724,7 @@ static bool acpi_device_enumeration_by_parent(struct acpi_device *device)
             fwnode_property_present(&device->fwnode, "baud")))
                return true;
 
-       /* Instantiate a pdev for the i2c-multi-instantiate drv to bind to */
-       if (!acpi_match_device_ids(device, i2c_multi_instantiate_ids))
+       if (!acpi_match_device_ids(device, ignore_serial_bus_ids))
                return false;
 
        INIT_LIST_HEAD(&resource_list);