diff mbox series

[02/12] i2c: acpi: Do not instantiate I2C-clients on boards with known bogus DSDT entries

Message ID 20211229231431.437982-3-hdegoede@redhat.com
State New
Headers show
Series ACPI / pdx86: Add support for x86 Android tablets with broken DSDTs | expand

Commit Message

Hans de Goede Dec. 29, 2021, 11:14 p.m. UTC
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 with this issue, and on these boards ignore I2C
devices described in ACPI, with a few exceptions which are known to
always be correct (and in case of the audio-codecs where the drivers
heavily rely on the codec being enumerated through ACPI).

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.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 drivers/i2c/i2c-core-acpi.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

Comments

Mika Westerberg Dec. 30, 2021, 12:03 p.m. UTC | #1
On Thu, Dec 30, 2021 at 12:14:21AM +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 with this issue, and on these boards ignore I2C
> devices described in ACPI, with a few exceptions which are known to
> always be correct (and in case of the audio-codecs where the drivers
> heavily rely on the codec being enumerated through ACPI).
> 
> 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.
> 
> Signed-off-by: Hans de Goede <hdegoede@redhat.com>

Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Wolfram Sang Dec. 30, 2021, 12:21 p.m. UTC | #2
Okay, I have a question, after all :)

> +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 */
> +	{}
> +};

Can't we add this table to patch 1 and check it within a
acpi_quirk_skip_i2c_client_enumeration(adev)?
Hans de Goede Dec. 30, 2021, 12:34 p.m. UTC | #3
Hi,

On 12/30/21 13:21, Wolfram Sang wrote:
> 
> Okay, I have a question, after all :)
> 
>> +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 */
>> +	{}
>> +};
> 
> Can't we add this table to patch 1 and check it within a
> acpi_quirk_skip_i2c_client_enumeration(adev)?

Yes that will keep all the quirk-handling / ugliness together in
a single place, so that is good idea.

I will change this for v2 of the series.

Regards,

Hans
diff mbox series

Patch

diff --git a/drivers/i2c/i2c-core-acpi.c b/drivers/i2c/i2c-core-acpi.c
index c87ce2276007..8b5b0161d3b2 100644
--- a/drivers/i2c/i2c-core-acpi.c
+++ b/drivers/i2c/i2c-core-acpi.c
@@ -253,10 +253,27 @@  static int i2c_acpi_get_info(struct acpi_device *adev,
 	return 0;
 }
 
+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 */
+	{}
+};
+
 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, with the exception of devices
+	 * on the known good list.
+	 */
+	if (acpi_quirk_skip_i2c_client_enumeration() &&
+	    acpi_match_device_ids(adev, i2c_acpi_known_good_ids) != 0)
+		return;
+
 	adev->power.flags.ignore_parent = true;
 	acpi_device_set_enumerated(adev);