linux-acpi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/3] ACPI / pdx86: Add support for x86 Android tablets with broken DSDTs
@ 2021-12-30 14:17 Hans de Goede
  2021-12-30 14:17 ` [PATCH v2 1/3] ACPI / x86: Add acpi_quirk_skip_[i2c_client|serdev]_enumeration() helpers Hans de Goede
                   ` (2 more replies)
  0 siblings, 3 replies; 11+ messages in thread
From: Hans de Goede @ 2021-12-30 14:17 UTC (permalink / raw)
  To: Rafael J . Wysocki, Mark Gross, Andy Shevchenko, Wolfram Sang,
	Mika Westerberg, Rob Herring, Greg Kroah-Hartman, Jiri Slaby
  Cc: Hans de Goede, Len Brown, linux-acpi, platform-driver-x86,
	linux-i2c, Stephan Gerhold, linux-serial

Hi All,

Here is v2 of my patch-series to deal with x86 Android tablets with broken
DSDTs. The only change in v2 is moving the i2c_acpi_known_good_ids[] list
and check to drivers/acpi/x86/utils.c.

Since the pdx86 patches are unchanged I'm only sending out the ACPI core
changes this time. Since the i2c and serdev ACPI enumeration changes are
very small and depend on patch 1, I believe it would be best for all 3
ACPI patches to be merged through Rafael's ACPI tree.
Rafael, acks have already been given for merging all patches through
the ACPI tree by Mika, Wolfram and Greg.

For some more background info here is the v1 cover-letter again:

As a small(ish) hoppy project over the holidays I've been looking into
getting some (somewhat older) x86 tablets which ship with Android as the
only OS on their factory image working with the mainline kernel.

These typically have pretty broken DSDTs since the Android image kernel
just has everything hardcoded.

This patch-series makes most things on 3 of these tablets work with the
mainline kernel and lays the groundwork for adding support for similar
tablets.

Since the ACPI tables on these devices clearly are buggy this series is
written so as to add minimal changes to the ACPI core code, leaving all
of the heavy lifting to the recently introduced (in linux-next)
drivers/platform/x86/x86-android-tablets.c module, which when built as
a module only autoloads on affected devices based on DMI matching.

And when this module is disabled the added acpi_quirk_skip_*_enumeration()
helpers are replaced by inline stubs and even the minimally added core
code will be optimized away.

Regards,

Hans


Hans de Goede (3):
  ACPI / x86: Add acpi_quirk_skip_[i2c_client|serdev]_enumeration()
    helpers
  i2c: acpi: Do not instantiate I2C-clients on boards with known bogus
    DSDT entries
  serdev: Do not instantiate serdevs on boards with known bogus DSDT
    entries

 drivers/acpi/x86/utils.c    | 111 ++++++++++++++++++++++++++++++++++++
 drivers/i2c/i2c-core-acpi.c |   7 +++
 drivers/tty/serdev/core.c   |  14 +++++
 include/acpi/acpi_bus.h     |  16 ++++++
 4 files changed, 148 insertions(+)

-- 
2.33.1


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH v2 1/3] ACPI / x86: Add acpi_quirk_skip_[i2c_client|serdev]_enumeration() helpers
  2021-12-30 14:17 [PATCH v2 0/3] ACPI / pdx86: Add support for x86 Android tablets with broken DSDTs Hans de Goede
@ 2021-12-30 14:17 ` Hans de Goede
  2021-12-30 16:39   ` Rafael J. Wysocki
  2021-12-30 14:17 ` [PATCH v2 2/3] i2c: acpi: Do not instantiate I2C-clients on boards with known bogus DSDT entries Hans de Goede
  2021-12-30 14:17 ` [PATCH v2 3/3] serdev: Do not instantiate serdevs " Hans de Goede
  2 siblings, 1 reply; 11+ messages in thread
From: Hans de Goede @ 2021-12-30 14:17 UTC (permalink / raw)
  To: Rafael J . Wysocki, Mark Gross, Andy Shevchenko, Wolfram Sang,
	Mika Westerberg, Rob Herring, Greg Kroah-Hartman, Jiri Slaby
  Cc: Hans de Goede, Len Brown, linux-acpi, platform-driver-x86,
	linux-i2c, Stephan Gerhold, linux-serial

x86 ACPI boards which ship with only Android as their factory image usually
declare a whole bunch of bogus I2C devs in their ACPI tables and sometimes
there are issues with serdev devices on these boards too, e.g. the resource
points to the wrong serdev_controller.

Instantiating I2C / serdev devs for these bogus devs causes various issues,
e.g. GPIO/IRQ resource conflicts because sometimes drivers do bind to them.
The Android x86 kernel fork shipped on these devices has some special code
to remove the bogus I2C clients (and serdevs are ignored completely).

Introduce acpi_quirk_skip_i2c_client_enumeration() and
acpi_quirk_skip_serdev_enumeration() helpers. Which can be used by the I2C/
serdev code to skip instantiating any I2C or serdev devs on broken boards.

These 2 helpers are added to drivers/acpi/x86/utils.c so that the DMI table
can be shared between the I2C and serdev code.

Note these boards typically do actually have I2C and serdev devices, just
different ones then the ones described in their DSDT. The devices which
are actually present are manually instantiated by the
drivers/platform/x86/x86-android-tablets.c kernel module.

The new helpers are only build if CONFIG_X86_ANDROID_TABLETS is enabled,
otherwise they are empty stubs to not unnecessarily grow the kernel size.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
Changes in v2:
- Move the i2c_acpi_known_good_ids[] list and checking into this patch /
  into the new acpi_quirk_skip_i2c_client_enumeration() function
---
 drivers/acpi/x86/utils.c | 111 +++++++++++++++++++++++++++++++++++++++
 include/acpi/acpi_bus.h  |  16 ++++++
 2 files changed, 127 insertions(+)

diff --git a/drivers/acpi/x86/utils.c b/drivers/acpi/x86/utils.c
index a2ae1ac41319..375a0911f06d 100644
--- a/drivers/acpi/x86/utils.c
+++ b/drivers/acpi/x86/utils.c
@@ -10,6 +10,7 @@
 
 #include <linux/acpi.h>
 #include <linux/dmi.h>
+#include <linux/platform_device.h>
 #include <asm/cpu_device_id.h>
 #include <asm/intel-family.h>
 #include "../internal.h"
@@ -208,3 +209,113 @@ bool force_storage_d3(void)
 {
 	return x86_match_cpu(storage_d3_cpu_ids);
 }
+
+#if IS_ENABLED(CONFIG_X86_ANDROID_TABLETS)
+/*
+ * x86 ACPI boards which ship with only Android as their factory image usually
+ * declare a whole bunch of bogus I2C devices in their ACPI tables and sometimes
+ * there are issues with serdev devices on these boards too, e.g. the resource
+ * points to the wrong serdev_controller.
+ *
+ * Instantiating I2C / serdev devs for these bogus devs causes various issues,
+ * e.g. GPIO/IRQ resource conflicts because sometimes drivers do bind to them.
+ * The Android x86 kernel fork shipped on these devices has some special code
+ * to remove the bogus I2C clients (and AFAICT serdevs are ignored completely).
+ *
+ * The acpi_quirk_skip_*_enumeration() functions below are used by the I2C or
+ * serdev code to skip instantiating any I2C or serdev devs on broken boards.
+ *
+ * In case of I2C an exception is made for HIDs on the i2c_acpi_known_good_ids
+ * list. These are known to always be correct (and in case of the audio-codecs
+ * the drivers heavily rely on the codec being enumerated through ACPI).
+ *
+ * Note these boards typically do actually have I2C and serdev devices,
+ * just different ones then the ones described in their DSDT. The devices
+ * which are actually present are manually instantiated by the
+ * drivers/platform/x86/x86-android-tablets.c kernel module.
+ */
+#define ACPI_QUIRK_SKIP_I2C_CLIENTS				BIT(0)
+#define ACPI_QUIRK_UART1_TTY_UART2_SKIP				BIT(1)
+
+static const struct dmi_system_id acpi_skip_serial_bus_enumeration_ids[] = {
+	{
+		.matches = {
+			DMI_EXACT_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
+			DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "ME176C"),
+		},
+		.driver_data = (void *)(ACPI_QUIRK_SKIP_I2C_CLIENTS |
+					ACPI_QUIRK_UART1_TTY_UART2_SKIP),
+	},
+	{
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
+			DMI_MATCH(DMI_PRODUCT_NAME, "TF103C"),
+		},
+		.driver_data = (void *)ACPI_QUIRK_SKIP_I2C_CLIENTS,
+	},
+	{
+		/* Whitelabel (sold as various brands) TM800A550L */
+		.matches = {
+			DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),
+			DMI_MATCH(DMI_BOARD_NAME, "Aptio CRB"),
+			/* Above strings are too generic, also match on BIOS version */
+			DMI_MATCH(DMI_BIOS_VERSION, "ZY-8-BI-PX4S70VTR400-X423B-005-D"),
+		},
+		.driver_data = (void *)ACPI_QUIRK_SKIP_I2C_CLIENTS,
+	},
+	{}
+};
+
+static const struct acpi_device_id i2c_acpi_known_good_ids[] = {
+	{ "10EC5640", 0 }, /* RealTek ALC5640 audio codec */
+	{ "INT33F4", 0 },  /* X-Powers AXP288 PMIC */
+	{ "INT33FD", 0 },  /* Intel Crystal Cove PMIC */
+	{ "NPCE69A", 0 },  /* Asus Transformer keyboard dock */
+	{}
+};
+
+bool acpi_quirk_skip_i2c_client_enumeration(struct acpi_device *adev)
+{
+	const struct dmi_system_id *dmi_id;
+	long quirks;
+
+	dmi_id = dmi_first_match(acpi_skip_serial_bus_enumeration_ids);
+	if (!dmi_id)
+		return false;
+
+	quirks = (unsigned long)dmi_id->driver_data;
+	if (!(quirks & ACPI_QUIRK_SKIP_I2C_CLIENTS))
+		return false;
+
+	return acpi_match_device_ids(adev, i2c_acpi_known_good_ids);
+}
+EXPORT_SYMBOL_GPL(acpi_quirk_skip_i2c_client_enumeration);
+
+int acpi_quirk_skip_serdev_enumeration(struct device *controller_parent, bool *skip)
+{
+	struct acpi_device *adev = ACPI_COMPANION(controller_parent);
+	const struct dmi_system_id *dmi_id;
+	long quirks = 0;
+
+	*skip = false;
+
+	/* !dev_is_platform() to not match on PNP enumerated debug UARTs */
+	if (!adev || !adev->pnp.unique_id || !dev_is_platform(controller_parent))
+		return 0;
+
+	dmi_id = dmi_first_match(acpi_skip_serial_bus_enumeration_ids);
+	if (dmi_id)
+		quirks = (unsigned long)dmi_id->driver_data;
+
+	if (quirks & ACPI_QUIRK_UART1_TTY_UART2_SKIP) {
+		if (!strcmp(adev->pnp.unique_id, "1"))
+			return -ENODEV; /* Create tty cdev instead of serdev */
+
+		if (!strcmp(adev->pnp.unique_id, "2"))
+			*skip = true;
+	}
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(acpi_quirk_skip_serdev_enumeration);
+#endif
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
index 5895f6c7f6db..102b1cf433c7 100644
--- a/include/acpi/acpi_bus.h
+++ b/include/acpi/acpi_bus.h
@@ -624,6 +624,22 @@ static inline bool acpi_device_override_status(struct acpi_device *adev,
 }
 #endif
 
+#if IS_ENABLED(CONFIG_X86_ANDROID_TABLETS)
+bool acpi_quirk_skip_i2c_client_enumeration(struct acpi_device *adev);
+int acpi_quirk_skip_serdev_enumeration(struct device *controller_parent, bool *skip);
+#else
+static inline bool acpi_quirk_skip_i2c_client_enumeration(struct acpi_device *adev)
+{
+	return false;
+}
+static inline int
+acpi_quirk_skip_serdev_enumeration(struct device *controller_parent, bool *skip)
+{
+	*skip = false;
+	return 0;
+}
+#endif
+
 #ifdef CONFIG_PM
 void acpi_pm_wakeup_event(struct device *dev);
 acpi_status acpi_add_pm_notifier(struct acpi_device *adev, struct device *dev,
-- 
2.33.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH v2 2/3] i2c: acpi: Do not instantiate I2C-clients on boards with known bogus DSDT entries
  2021-12-30 14:17 [PATCH v2 0/3] ACPI / pdx86: Add support for x86 Android tablets with broken DSDTs Hans de Goede
  2021-12-30 14:17 ` [PATCH v2 1/3] ACPI / x86: Add acpi_quirk_skip_[i2c_client|serdev]_enumeration() helpers Hans de Goede
@ 2021-12-30 14:17 ` Hans de Goede
  2021-12-30 17:55   ` Wolfram Sang
  2021-12-30 14:17 ` [PATCH v2 3/3] serdev: Do not instantiate serdevs " Hans de Goede
  2 siblings, 1 reply; 11+ messages in thread
From: Hans de Goede @ 2021-12-30 14:17 UTC (permalink / raw)
  To: Rafael J . Wysocki, Mark Gross, Andy Shevchenko, Wolfram Sang,
	Mika Westerberg, Rob Herring, Greg Kroah-Hartman, Jiri Slaby
  Cc: Hans de Goede, Len Brown, linux-acpi, platform-driver-x86,
	linux-i2c, Stephan Gerhold, linux-serial

x86 ACPI devices which ship with only Android as their factory image
usually declare a whole bunch of bogus I2C devices in their ACPI tables.

Instantiating I2C clients for these bogus devices causes various issues,
e.g. GPIO/IRQ resource conflicts because sometimes drivers do bind to them.
The Android x86 kernel fork shipped on these devices has some special code
to remove these bogus devices, instead of just fixing the DSDT <sigh>.

Use the new acpi_quirk_skip_i2c_client_enumeration() helper to identify
known boards / acpi devices with this issue, and skip enumerating these.

Note these boards typically do actually have I2C devices, just
different ones then the ones described in their DSDT. The devices
which are actually present are manually instantiated by the
drivers/platform/x86/x86-android-tablets.c kernel module.

Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
Changes in v2:
- Drop the i2c_acpi_known_good_ids[] list, this is now checked by
  acpi_quirk_skip_i2c_client_enumeration()
---
 drivers/i2c/i2c-core-acpi.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/i2c/i2c-core-acpi.c b/drivers/i2c/i2c-core-acpi.c
index c87ce2276007..85ed4c1d4924 100644
--- a/drivers/i2c/i2c-core-acpi.c
+++ b/drivers/i2c/i2c-core-acpi.c
@@ -257,6 +257,13 @@ static void i2c_acpi_register_device(struct i2c_adapter *adapter,
 				     struct acpi_device *adev,
 				     struct i2c_board_info *info)
 {
+	/*
+	 * Skip registration on boards where the ACPI tables are
+	 * known to contain bogus I2C devices.
+	 */
+	if (acpi_quirk_skip_i2c_client_enumeration(adev))
+		return;
+
 	adev->power.flags.ignore_parent = true;
 	acpi_device_set_enumerated(adev);
 
-- 
2.33.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH v2 3/3] serdev: Do not instantiate serdevs on boards with known bogus DSDT entries
  2021-12-30 14:17 [PATCH v2 0/3] ACPI / pdx86: Add support for x86 Android tablets with broken DSDTs Hans de Goede
  2021-12-30 14:17 ` [PATCH v2 1/3] ACPI / x86: Add acpi_quirk_skip_[i2c_client|serdev]_enumeration() helpers Hans de Goede
  2021-12-30 14:17 ` [PATCH v2 2/3] i2c: acpi: Do not instantiate I2C-clients on boards with known bogus DSDT entries Hans de Goede
@ 2021-12-30 14:17 ` Hans de Goede
  2 siblings, 0 replies; 11+ messages in thread
From: Hans de Goede @ 2021-12-30 14:17 UTC (permalink / raw)
  To: Rafael J . Wysocki, Mark Gross, Andy Shevchenko, Wolfram Sang,
	Mika Westerberg, Rob Herring, Greg Kroah-Hartman, Jiri Slaby
  Cc: Hans de Goede, Len Brown, linux-acpi, platform-driver-x86,
	linux-i2c, Stephan Gerhold, linux-serial

x86 ACPI devices which ship with only Android as their factory image use
older kernels which do not yet support ACPI serdev enumeration, as such
the serdev information in their ACPI tables is not reliable.

For example on the Asus ME176C tablet the serdev describing the Bluetooth
HCI points to the serdev_controller connected to the GPS and the other way
around.

Use the new acpi_quirk_skip_serdev_enumeration() helper to identify
known boards with this issue and then either abort adding the serdev
controller (creating a tty cdev instead) or only create the controller
leaving the instantation of the serdev itself up to platform code.

In the case where only the serdev controller is created the necessary
serdevs will instead be instantiated by the
drivers/platform/x86/x86-android-tablets.c kernel module.

Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 drivers/tty/serdev/core.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/drivers/tty/serdev/core.c b/drivers/tty/serdev/core.c
index f1324fe99378..92e3433276f8 100644
--- a/drivers/tty/serdev/core.c
+++ b/drivers/tty/serdev/core.c
@@ -727,10 +727,24 @@ static acpi_status acpi_serdev_add_device(acpi_handle handle, u32 level,
 static int acpi_serdev_register_devices(struct serdev_controller *ctrl)
 {
 	acpi_status status;
+	bool skip;
+	int ret;
 
 	if (!has_acpi_companion(ctrl->dev.parent))
 		return -ENODEV;
 
+	/*
+	 * Skip registration on boards where the ACPI tables are known to
+	 * contain buggy devices. Note serdev_controller_add() must still
+	 * succeed in this case, so that the proper serdev devices can be
+	 * added "manually" later.
+	 */
+	ret = acpi_quirk_skip_serdev_enumeration(ctrl->dev.parent, &skip);
+	if (ret)
+		return ret;
+	if (skip)
+		return 0;
+
 	status = acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
 				     SERDEV_ACPI_MAX_SCAN_DEPTH,
 				     acpi_serdev_add_device, NULL, ctrl, NULL);
-- 
2.33.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH v2 1/3] ACPI / x86: Add acpi_quirk_skip_[i2c_client|serdev]_enumeration() helpers
  2021-12-30 14:17 ` [PATCH v2 1/3] ACPI / x86: Add acpi_quirk_skip_[i2c_client|serdev]_enumeration() helpers Hans de Goede
@ 2021-12-30 16:39   ` Rafael J. Wysocki
  2021-12-30 17:56     ` Wolfram Sang
  0 siblings, 1 reply; 11+ messages in thread
From: Rafael J. Wysocki @ 2021-12-30 16:39 UTC (permalink / raw)
  To: Hans de Goede
  Cc: Rafael J . Wysocki, Mark Gross, Andy Shevchenko, Wolfram Sang,
	Mika Westerberg, Rob Herring, Greg Kroah-Hartman, Jiri Slaby,
	Len Brown, ACPI Devel Maling List, Platform Driver, linux-i2c,
	Stephan Gerhold, linux-serial

On Thu, Dec 30, 2021 at 3:17 PM Hans de Goede <hdegoede@redhat.com> wrote:
>
> x86 ACPI boards which ship with only Android as their factory image usually
> declare a whole bunch of bogus I2C devs in their ACPI tables and sometimes
> there are issues with serdev devices on these boards too, e.g. the resource
> points to the wrong serdev_controller.
>
> Instantiating I2C / serdev devs for these bogus devs causes various issues,
> e.g. GPIO/IRQ resource conflicts because sometimes drivers do bind to them.
> The Android x86 kernel fork shipped on these devices has some special code
> to remove the bogus I2C clients (and serdevs are ignored completely).
>
> Introduce acpi_quirk_skip_i2c_client_enumeration() and
> acpi_quirk_skip_serdev_enumeration() helpers. Which can be used by the I2C/
> serdev code to skip instantiating any I2C or serdev devs on broken boards.
>
> These 2 helpers are added to drivers/acpi/x86/utils.c so that the DMI table
> can be shared between the I2C and serdev code.
>
> Note these boards typically do actually have I2C and serdev devices, just
> different ones then the ones described in their DSDT. The devices which
> are actually present are manually instantiated by the
> drivers/platform/x86/x86-android-tablets.c kernel module.
>
> The new helpers are only build if CONFIG_X86_ANDROID_TABLETS is enabled,
> otherwise they are empty stubs to not unnecessarily grow the kernel size.
>
> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
> ---
> Changes in v2:
> - Move the i2c_acpi_known_good_ids[] list and checking into this patch /
>   into the new acpi_quirk_skip_i2c_client_enumeration() function

Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

or please let me know if you want me to take this series.

Thanks!

> ---
>  drivers/acpi/x86/utils.c | 111 +++++++++++++++++++++++++++++++++++++++
>  include/acpi/acpi_bus.h  |  16 ++++++
>  2 files changed, 127 insertions(+)
>
> diff --git a/drivers/acpi/x86/utils.c b/drivers/acpi/x86/utils.c
> index a2ae1ac41319..375a0911f06d 100644
> --- a/drivers/acpi/x86/utils.c
> +++ b/drivers/acpi/x86/utils.c
> @@ -10,6 +10,7 @@
>
>  #include <linux/acpi.h>
>  #include <linux/dmi.h>
> +#include <linux/platform_device.h>
>  #include <asm/cpu_device_id.h>
>  #include <asm/intel-family.h>
>  #include "../internal.h"
> @@ -208,3 +209,113 @@ bool force_storage_d3(void)
>  {
>         return x86_match_cpu(storage_d3_cpu_ids);
>  }
> +
> +#if IS_ENABLED(CONFIG_X86_ANDROID_TABLETS)
> +/*
> + * x86 ACPI boards which ship with only Android as their factory image usually
> + * declare a whole bunch of bogus I2C devices in their ACPI tables and sometimes
> + * there are issues with serdev devices on these boards too, e.g. the resource
> + * points to the wrong serdev_controller.
> + *
> + * Instantiating I2C / serdev devs for these bogus devs causes various issues,
> + * e.g. GPIO/IRQ resource conflicts because sometimes drivers do bind to them.
> + * The Android x86 kernel fork shipped on these devices has some special code
> + * to remove the bogus I2C clients (and AFAICT serdevs are ignored completely).
> + *
> + * The acpi_quirk_skip_*_enumeration() functions below are used by the I2C or
> + * serdev code to skip instantiating any I2C or serdev devs on broken boards.
> + *
> + * In case of I2C an exception is made for HIDs on the i2c_acpi_known_good_ids
> + * list. These are known to always be correct (and in case of the audio-codecs
> + * the drivers heavily rely on the codec being enumerated through ACPI).
> + *
> + * Note these boards typically do actually have I2C and serdev devices,
> + * just different ones then the ones described in their DSDT. The devices
> + * which are actually present are manually instantiated by the
> + * drivers/platform/x86/x86-android-tablets.c kernel module.
> + */
> +#define ACPI_QUIRK_SKIP_I2C_CLIENTS                            BIT(0)
> +#define ACPI_QUIRK_UART1_TTY_UART2_SKIP                                BIT(1)
> +
> +static const struct dmi_system_id acpi_skip_serial_bus_enumeration_ids[] = {
> +       {
> +               .matches = {
> +                       DMI_EXACT_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
> +                       DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "ME176C"),
> +               },
> +               .driver_data = (void *)(ACPI_QUIRK_SKIP_I2C_CLIENTS |
> +                                       ACPI_QUIRK_UART1_TTY_UART2_SKIP),
> +       },
> +       {
> +               .matches = {
> +                       DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
> +                       DMI_MATCH(DMI_PRODUCT_NAME, "TF103C"),
> +               },
> +               .driver_data = (void *)ACPI_QUIRK_SKIP_I2C_CLIENTS,
> +       },
> +       {
> +               /* Whitelabel (sold as various brands) TM800A550L */
> +               .matches = {
> +                       DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),
> +                       DMI_MATCH(DMI_BOARD_NAME, "Aptio CRB"),
> +                       /* Above strings are too generic, also match on BIOS version */
> +                       DMI_MATCH(DMI_BIOS_VERSION, "ZY-8-BI-PX4S70VTR400-X423B-005-D"),
> +               },
> +               .driver_data = (void *)ACPI_QUIRK_SKIP_I2C_CLIENTS,
> +       },
> +       {}
> +};
> +
> +static const struct acpi_device_id i2c_acpi_known_good_ids[] = {
> +       { "10EC5640", 0 }, /* RealTek ALC5640 audio codec */
> +       { "INT33F4", 0 },  /* X-Powers AXP288 PMIC */
> +       { "INT33FD", 0 },  /* Intel Crystal Cove PMIC */
> +       { "NPCE69A", 0 },  /* Asus Transformer keyboard dock */
> +       {}
> +};
> +
> +bool acpi_quirk_skip_i2c_client_enumeration(struct acpi_device *adev)
> +{
> +       const struct dmi_system_id *dmi_id;
> +       long quirks;
> +
> +       dmi_id = dmi_first_match(acpi_skip_serial_bus_enumeration_ids);
> +       if (!dmi_id)
> +               return false;
> +
> +       quirks = (unsigned long)dmi_id->driver_data;
> +       if (!(quirks & ACPI_QUIRK_SKIP_I2C_CLIENTS))
> +               return false;
> +
> +       return acpi_match_device_ids(adev, i2c_acpi_known_good_ids);
> +}
> +EXPORT_SYMBOL_GPL(acpi_quirk_skip_i2c_client_enumeration);
> +
> +int acpi_quirk_skip_serdev_enumeration(struct device *controller_parent, bool *skip)
> +{
> +       struct acpi_device *adev = ACPI_COMPANION(controller_parent);
> +       const struct dmi_system_id *dmi_id;
> +       long quirks = 0;
> +
> +       *skip = false;
> +
> +       /* !dev_is_platform() to not match on PNP enumerated debug UARTs */
> +       if (!adev || !adev->pnp.unique_id || !dev_is_platform(controller_parent))
> +               return 0;
> +
> +       dmi_id = dmi_first_match(acpi_skip_serial_bus_enumeration_ids);
> +       if (dmi_id)
> +               quirks = (unsigned long)dmi_id->driver_data;
> +
> +       if (quirks & ACPI_QUIRK_UART1_TTY_UART2_SKIP) {
> +               if (!strcmp(adev->pnp.unique_id, "1"))
> +                       return -ENODEV; /* Create tty cdev instead of serdev */
> +
> +               if (!strcmp(adev->pnp.unique_id, "2"))
> +                       *skip = true;
> +       }
> +
> +       return 0;
> +}
> +EXPORT_SYMBOL_GPL(acpi_quirk_skip_serdev_enumeration);
> +#endif
> diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
> index 5895f6c7f6db..102b1cf433c7 100644
> --- a/include/acpi/acpi_bus.h
> +++ b/include/acpi/acpi_bus.h
> @@ -624,6 +624,22 @@ static inline bool acpi_device_override_status(struct acpi_device *adev,
>  }
>  #endif
>
> +#if IS_ENABLED(CONFIG_X86_ANDROID_TABLETS)
> +bool acpi_quirk_skip_i2c_client_enumeration(struct acpi_device *adev);
> +int acpi_quirk_skip_serdev_enumeration(struct device *controller_parent, bool *skip);
> +#else
> +static inline bool acpi_quirk_skip_i2c_client_enumeration(struct acpi_device *adev)
> +{
> +       return false;
> +}
> +static inline int
> +acpi_quirk_skip_serdev_enumeration(struct device *controller_parent, bool *skip)
> +{
> +       *skip = false;
> +       return 0;
> +}
> +#endif
> +
>  #ifdef CONFIG_PM
>  void acpi_pm_wakeup_event(struct device *dev);
>  acpi_status acpi_add_pm_notifier(struct acpi_device *adev, struct device *dev,
> --
> 2.33.1
>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v2 2/3] i2c: acpi: Do not instantiate I2C-clients on boards with known bogus DSDT entries
  2021-12-30 14:17 ` [PATCH v2 2/3] i2c: acpi: Do not instantiate I2C-clients on boards with known bogus DSDT entries Hans de Goede
@ 2021-12-30 17:55   ` Wolfram Sang
  0 siblings, 0 replies; 11+ messages in thread
From: Wolfram Sang @ 2021-12-30 17:55 UTC (permalink / raw)
  To: Hans de Goede
  Cc: Rafael J . Wysocki, Mark Gross, Andy Shevchenko, Mika Westerberg,
	Rob Herring, Greg Kroah-Hartman, Jiri Slaby, Len Brown,
	linux-acpi, platform-driver-x86, linux-i2c, Stephan Gerhold,
	linux-serial

[-- Attachment #1: Type: text/plain, Size: 1113 bytes --]

On Thu, Dec 30, 2021 at 03:17:21PM +0100, Hans de Goede wrote:
> x86 ACPI devices which ship with only Android as their factory image
> usually declare a whole bunch of bogus I2C devices in their ACPI tables.
> 
> Instantiating I2C clients for these bogus devices causes various issues,
> e.g. GPIO/IRQ resource conflicts because sometimes drivers do bind to them.
> The Android x86 kernel fork shipped on these devices has some special code
> to remove these bogus devices, instead of just fixing the DSDT <sigh>.
> 
> Use the new acpi_quirk_skip_i2c_client_enumeration() helper to identify
> known boards / acpi devices with this issue, and skip enumerating these.
> 
> Note these boards typically do actually have I2C devices, just
> different ones then the ones described in their DSDT. The devices
> which are actually present are manually instantiated by the
> drivers/platform/x86/x86-android-tablets.c kernel module.
> 
> Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
> Signed-off-by: Hans de Goede <hdegoede@redhat.com>

Reviewed-by: Wolfram Sang <wsa@kernel.org>


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v2 1/3] ACPI / x86: Add acpi_quirk_skip_[i2c_client|serdev]_enumeration() helpers
  2021-12-30 16:39   ` Rafael J. Wysocki
@ 2021-12-30 17:56     ` Wolfram Sang
  2021-12-30 18:00       ` Rafael J. Wysocki
  0 siblings, 1 reply; 11+ messages in thread
From: Wolfram Sang @ 2021-12-30 17:56 UTC (permalink / raw)
  To: Rafael J. Wysocki
  Cc: Hans de Goede, Mark Gross, Andy Shevchenko, Mika Westerberg,
	Rob Herring, Greg Kroah-Hartman, Jiri Slaby, Len Brown,
	ACPI Devel Maling List, Platform Driver, linux-i2c,
	Stephan Gerhold, linux-serial

[-- Attachment #1: Type: text/plain, Size: 125 bytes --]

Hi Rafael,

> or please let me know if you want me to take this series.

Yes, see cover-letter :)

All the best,

   Wolfram

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v2 1/3] ACPI / x86: Add acpi_quirk_skip_[i2c_client|serdev]_enumeration() helpers
  2021-12-30 17:56     ` Wolfram Sang
@ 2021-12-30 18:00       ` Rafael J. Wysocki
  2021-12-30 18:18         ` Hans de Goede
  0 siblings, 1 reply; 11+ messages in thread
From: Rafael J. Wysocki @ 2021-12-30 18:00 UTC (permalink / raw)
  To: Wolfram Sang, Rafael J. Wysocki, Hans de Goede, Mark Gross,
	Andy Shevchenko, Mika Westerberg, Rob Herring,
	Greg Kroah-Hartman, Jiri Slaby, Len Brown,
	ACPI Devel Maling List, Platform Driver, linux-i2c,
	Stephan Gerhold, linux-serial

On Thu, Dec 30, 2021 at 6:56 PM Wolfram Sang <wsa@kernel.org> wrote:
>
> Hi Rafael,
>
> > or please let me know if you want me to take this series.
>
> Yes, see cover-letter :)

Oh well.

I'll take it now, thanks!

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v2 1/3] ACPI / x86: Add acpi_quirk_skip_[i2c_client|serdev]_enumeration() helpers
  2021-12-30 18:00       ` Rafael J. Wysocki
@ 2021-12-30 18:18         ` Hans de Goede
  2021-12-30 18:19           ` Rafael J. Wysocki
  0 siblings, 1 reply; 11+ messages in thread
From: Hans de Goede @ 2021-12-30 18:18 UTC (permalink / raw)
  To: Rafael J. Wysocki, Wolfram Sang, Mark Gross, Andy Shevchenko,
	Mika Westerberg, Rob Herring, Greg Kroah-Hartman, Jiri Slaby,
	Len Brown, ACPI Devel Maling List, Platform Driver, linux-i2c,
	Stephan Gerhold, linux-serial

Hi,

On 12/30/21 19:00, Rafael J. Wysocki wrote:
> On Thu, Dec 30, 2021 at 6:56 PM Wolfram Sang <wsa@kernel.org> wrote:
>>
>> Hi Rafael,
>>
>>> or please let me know if you want me to take this series.
>>
>> Yes, see cover-letter :)
> 
> Oh well.
> 
> I'll take it now, thanks!

Thank you.

I see this in your bleeding-edge branch now. I was wondering what this
means wrt this making it into 5.17, or if you consider this 5.18
material?

Note 5.18 is fine, just wondering (mostly for the timing of merging
the pdx86 side of this, which probably also is more 5.18 material).

Regards,

Hans



^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v2 1/3] ACPI / x86: Add acpi_quirk_skip_[i2c_client|serdev]_enumeration() helpers
  2021-12-30 18:18         ` Hans de Goede
@ 2021-12-30 18:19           ` Rafael J. Wysocki
  2021-12-30 18:31             ` Hans de Goede
  0 siblings, 1 reply; 11+ messages in thread
From: Rafael J. Wysocki @ 2021-12-30 18:19 UTC (permalink / raw)
  To: Hans de Goede
  Cc: Rafael J. Wysocki, Wolfram Sang, Mark Gross, Andy Shevchenko,
	Mika Westerberg, Rob Herring, Greg Kroah-Hartman, Jiri Slaby,
	Len Brown, ACPI Devel Maling List, Platform Driver, linux-i2c,
	Stephan Gerhold, linux-serial

On Thu, Dec 30, 2021 at 7:18 PM Hans de Goede <hdegoede@redhat.com> wrote:
>
> Hi,
>
> On 12/30/21 19:00, Rafael J. Wysocki wrote:
> > On Thu, Dec 30, 2021 at 6:56 PM Wolfram Sang <wsa@kernel.org> wrote:
> >>
> >> Hi Rafael,
> >>
> >>> or please let me know if you want me to take this series.
> >>
> >> Yes, see cover-letter :)
> >
> > Oh well.
> >
> > I'll take it now, thanks!
>
> Thank you.
>
> I see this in your bleeding-edge branch now. I was wondering what this
> means wrt this making it into 5.17, or if you consider this 5.18
> material?

5.17

> Note 5.18 is fine, just wondering (mostly for the timing of merging
> the pdx86 side of this, which probably also is more 5.18 material).

OK

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v2 1/3] ACPI / x86: Add acpi_quirk_skip_[i2c_client|serdev]_enumeration() helpers
  2021-12-30 18:19           ` Rafael J. Wysocki
@ 2021-12-30 18:31             ` Hans de Goede
  0 siblings, 0 replies; 11+ messages in thread
From: Hans de Goede @ 2021-12-30 18:31 UTC (permalink / raw)
  To: Rafael J. Wysocki
  Cc: Wolfram Sang, Mark Gross, Andy Shevchenko, Mika Westerberg,
	Rob Herring, Greg Kroah-Hartman, Jiri Slaby, Len Brown,
	ACPI Devel Maling List, Platform Driver, linux-i2c,
	Stephan Gerhold, linux-serial

Hi,

On 12/30/21 19:19, Rafael J. Wysocki wrote:
> On Thu, Dec 30, 2021 at 7:18 PM Hans de Goede <hdegoede@redhat.com> wrote:
>>
>> Hi,
>>
>> On 12/30/21 19:00, Rafael J. Wysocki wrote:
>>> On Thu, Dec 30, 2021 at 6:56 PM Wolfram Sang <wsa@kernel.org> wrote:
>>>>
>>>> Hi Rafael,
>>>>
>>>>> or please let me know if you want me to take this series.
>>>>
>>>> Yes, see cover-letter :)
>>>
>>> Oh well.
>>>
>>> I'll take it now, thanks!
>>
>> Thank you.
>>
>> I see this in your bleeding-edge branch now. I was wondering what this
>> means wrt this making it into 5.17, or if you consider this 5.18
>> material?
> 
> 5.17

Nice, then it probably is best to also get the matching x86-android-tablets
changes merged for 5.17. I'll give it a couple of days for people to review
those and then merge those into pdx86/for-next.

Regards,

Hans


^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2021-12-30 18:31 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-12-30 14:17 [PATCH v2 0/3] ACPI / pdx86: Add support for x86 Android tablets with broken DSDTs Hans de Goede
2021-12-30 14:17 ` [PATCH v2 1/3] ACPI / x86: Add acpi_quirk_skip_[i2c_client|serdev]_enumeration() helpers Hans de Goede
2021-12-30 16:39   ` Rafael J. Wysocki
2021-12-30 17:56     ` Wolfram Sang
2021-12-30 18:00       ` Rafael J. Wysocki
2021-12-30 18:18         ` Hans de Goede
2021-12-30 18:19           ` Rafael J. Wysocki
2021-12-30 18:31             ` Hans de Goede
2021-12-30 14:17 ` [PATCH v2 2/3] i2c: acpi: Do not instantiate I2C-clients on boards with known bogus DSDT entries Hans de Goede
2021-12-30 17:55   ` Wolfram Sang
2021-12-30 14:17 ` [PATCH v2 3/3] serdev: Do not instantiate serdevs " Hans de Goede

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).