platform/x86: x86-android-tablets: Add Lenovo Yoga Tablet 2 Pro 1380F/L data
authorHans de Goede <hdegoede@redhat.com>
Sat, 6 Apr 2024 12:50:57 +0000 (14:50 +0200)
committerHans de Goede <hdegoede@redhat.com>
Mon, 15 Apr 2024 13:43:06 +0000 (15:43 +0200)
The Lenovo Yoga Tablet 2 Pro 1380F/L is a x86 ACPI tablet which ships with
Android x86 as factory OS. Its DSDT contains a bunch of I2C devices which
are not actually there, causing various resource conflicts. Enumeration of
these is skipped through the acpi_quirk_skip_i2c_client_enumeration().

Add support for manually instantiating the I2C + other devices which are
actually present on this tablet by adding the necessary device info to
the x86-android-tablets module.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Link: https://lore.kernel.org/r/20240406125058.13624-2-hdegoede@redhat.com
drivers/platform/x86/x86-android-tablets/dmi.c
drivers/platform/x86/x86-android-tablets/lenovo.c
drivers/platform/x86/x86-android-tablets/x86-android-tablets.h

index 5d6c12494f082a90337640fe1f018fcea2d5c151..141a2d25e83be60460c0bed88832a1adb092d44f 100644 (file)
@@ -104,6 +104,24 @@ const struct dmi_system_id x86_android_tablet_ids[] __initconst = {
                },
                .driver_data = (void *)&lenovo_yogabook_x91_info,
        },
+       {
+               /*
+                * Lenovo Yoga Tablet 2 Pro 1380F/L (13") This has more or less
+                * the same BIOS as the 830F/L or 1050F/L (8" and 10") below,
+                * but unlike the 8" / 10" models which share the same mainboard
+                * this model has a different mainboard.
+                * This match for the 13" model MUST come before the 8" + 10"
+                * match since that one will also match the 13" model!
+                */
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "Intel Corp."),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "VALLEYVIEW C0 PLATFORM"),
+                       DMI_MATCH(DMI_BOARD_NAME, "BYT-T FFD8"),
+                       /* Full match so as to NOT match the 830/1050 BIOS */
+                       DMI_MATCH(DMI_BIOS_VERSION, "BLADE_21.X64.0005.R00.1504101516"),
+               },
+               .driver_data = (void *)&lenovo_yoga_tab2_1380_info,
+       },
        {
                /*
                 * Lenovo Yoga Tablet 2 830F/L or 1050F/L (The 8" and 10"
index c297391955adbcb9a6b076dfb8f009ae4bce2bcb..16fa04d604a09388e210ef1b3aadb51e279c6fe1 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/pinctrl/machine.h>
 #include <linux/platform_data/lp855x.h>
 #include <linux/platform_device.h>
+#include <linux/power/bq24190_charger.h>
 #include <linux/reboot.h>
 #include <linux/rmi.h>
 #include <linux/spi/spi.h>
@@ -565,6 +566,221 @@ static void lenovo_yoga_tab2_830_1050_exit(void)
        }
 }
 
+/*
+ * Lenovo Yoga Tablet 2 Pro 1380F/L
+ *
+ * The Lenovo Yoga Tablet 2 Pro 1380F/L mostly has the same design as the 830F/L
+ * and the 1050F/L so this re-uses some of the handling for that from above.
+ */
+static const char * const lc824206xa_chg_det_psy[] = { "lc824206xa-charger-detect" };
+
+static const struct property_entry lenovo_yoga_tab2_1380_bq24190_props[] = {
+       PROPERTY_ENTRY_STRING_ARRAY("supplied-from", lc824206xa_chg_det_psy),
+       PROPERTY_ENTRY_REF("monitored-battery", &generic_lipo_hv_4v35_battery_node),
+       PROPERTY_ENTRY_BOOL("omit-battery-class"),
+       PROPERTY_ENTRY_BOOL("disable-reset"),
+       { }
+};
+
+static const struct software_node lenovo_yoga_tab2_1380_bq24190_node = {
+       .properties = lenovo_yoga_tab2_1380_bq24190_props,
+};
+
+/* For enabling the bq24190 5V boost based on id-pin */
+static struct regulator_consumer_supply lc824206xa_consumer = {
+       .supply = "vbus",
+       .dev_name = "i2c-lc824206xa",
+};
+
+static const struct regulator_init_data lenovo_yoga_tab2_1380_bq24190_vbus_init_data = {
+       .constraints = {
+               .name = "bq24190_vbus",
+               .valid_ops_mask = REGULATOR_CHANGE_STATUS,
+       },
+       .consumer_supplies = &lc824206xa_consumer,
+       .num_consumer_supplies = 1,
+};
+
+struct bq24190_platform_data lenovo_yoga_tab2_1380_bq24190_pdata = {
+       .regulator_init_data = &lenovo_yoga_tab2_1380_bq24190_vbus_init_data,
+};
+
+static const struct property_entry lenovo_yoga_tab2_1380_lc824206xa_props[] = {
+       PROPERTY_ENTRY_BOOL("onnn,enable-miclr-for-dcp"),
+       { }
+};
+
+static const struct software_node lenovo_yoga_tab2_1380_lc824206xa_node = {
+       .properties = lenovo_yoga_tab2_1380_lc824206xa_props,
+};
+
+static const char * const lenovo_yoga_tab2_1380_lms303d_mount_matrix[] = {
+       "0", "-1", "0",
+       "-1", "0", "0",
+       "0", "0", "1"
+};
+
+static const struct property_entry lenovo_yoga_tab2_1380_lms303d_props[] = {
+       PROPERTY_ENTRY_STRING_ARRAY("mount-matrix", lenovo_yoga_tab2_1380_lms303d_mount_matrix),
+       { }
+};
+
+static const struct software_node lenovo_yoga_tab2_1380_lms303d_node = {
+       .properties = lenovo_yoga_tab2_1380_lms303d_props,
+};
+
+static const struct x86_i2c_client_info lenovo_yoga_tab2_1380_i2c_clients[] __initconst = {
+       {
+               /* BQ27541 fuel-gauge */
+               .board_info = {
+                       .type = "bq27541",
+                       .addr = 0x55,
+                       .dev_name = "bq27541",
+                       .swnode = &fg_bq24190_supply_node,
+               },
+               .adapter_path = "\\_SB_.I2C1",
+       }, {
+               /* bq24292i battery charger */
+               .board_info = {
+                       .type = "bq24190",
+                       .addr = 0x6b,
+                       .dev_name = "bq24292i",
+                       .swnode = &lenovo_yoga_tab2_1380_bq24190_node,
+                       .platform_data = &lenovo_yoga_tab2_1380_bq24190_pdata,
+               },
+               .adapter_path = "\\_SB_.I2C1",
+               .irq_data = {
+                       .type = X86_ACPI_IRQ_TYPE_GPIOINT,
+                       .chip = "INT33FC:02",
+                       .index = 2,
+                       .trigger = ACPI_EDGE_SENSITIVE,
+                       .polarity = ACPI_ACTIVE_HIGH,
+                       .con_id = "bq24292i_irq",
+               },
+       }, {
+               /* LP8557 Backlight controller */
+               .board_info = {
+                       .type = "lp8557",
+                       .addr = 0x2c,
+                       .dev_name = "lp8557",
+                       .platform_data = &lenovo_lp8557_pwm_and_reg_pdata,
+               },
+               .adapter_path = "\\_SB_.I2C3",
+       }, {
+               /* LC824206XA Micro USB Switch */
+               .board_info = {
+                       .type = "lc824206xa",
+                       .addr = 0x48,
+                       .dev_name = "lc824206xa",
+                       .swnode = &lenovo_yoga_tab2_1380_lc824206xa_node,
+               },
+               .adapter_path = "\\_SB_.I2C3",
+               .irq_data = {
+                       .type = X86_ACPI_IRQ_TYPE_GPIOINT,
+                       .chip = "INT33FC:02",
+                       .index = 1,
+                       .trigger = ACPI_LEVEL_SENSITIVE,
+                       .polarity = ACPI_ACTIVE_LOW,
+                       .con_id = "lc824206xa_irq",
+               },
+       }, {
+               /* AL3320A ambient light sensor */
+               .board_info = {
+                       .type = "al3320a",
+                       .addr = 0x1c,
+                       .dev_name = "al3320a",
+               },
+               .adapter_path = "\\_SB_.I2C5",
+       }, {
+               /* LSM303DA accelerometer + magnetometer */
+               .board_info = {
+                       .type = "lsm303d",
+                       .addr = 0x1d,
+                       .dev_name = "lsm303d",
+                       .swnode = &lenovo_yoga_tab2_1380_lms303d_node,
+               },
+               .adapter_path = "\\_SB_.I2C5",
+       }, {
+               /* Synaptics RMI touchscreen */
+               .board_info = {
+                       .type = "rmi4_i2c",
+                       .addr = 0x38,
+                       .dev_name = "rmi4_i2c",
+                       .platform_data = &lenovo_yoga_tab2_830_1050_rmi_pdata,
+               },
+               .adapter_path = "\\_SB_.I2C6",
+               .irq_data = {
+                       .type = X86_ACPI_IRQ_TYPE_APIC,
+                       .index = 0x45,
+                       .trigger = ACPI_EDGE_SENSITIVE,
+                       .polarity = ACPI_ACTIVE_HIGH,
+               },
+       }
+};
+
+static const struct platform_device_info lenovo_yoga_tab2_1380_pdevs[] __initconst = {
+       {
+               /* For the Tablet 2 Pro 1380's custom fast charging driver */
+               .name = "lenovo-yoga-tab2-pro-1380-fastcharger",
+               .id = PLATFORM_DEVID_NONE,
+       },
+};
+
+const char * const lenovo_yoga_tab2_1380_modules[] __initconst = {
+       "bq24190_charger",            /* For the Vbus regulator for lc824206xa */
+       NULL
+};
+
+static int __init lenovo_yoga_tab2_1380_init(void)
+{
+       int ret;
+
+       /* To verify that the DMI matching works vs the 830 / 1050 models */
+       pr_info("detected Lenovo Yoga Tablet 2 Pro 1380F/L\n");
+
+       ret = lenovo_yoga_tab2_830_1050_init_codec();
+       if (ret)
+               return ret;
+
+       /* SYS_OFF_PRIO_FIRMWARE + 1 so that it runs before acpi_power_off */
+       lenovo_yoga_tab2_830_1050_sys_off_handler =
+               register_sys_off_handler(SYS_OFF_MODE_POWER_OFF, SYS_OFF_PRIO_FIRMWARE + 1,
+                                        lenovo_yoga_tab2_830_1050_power_off, NULL);
+       if (IS_ERR(lenovo_yoga_tab2_830_1050_sys_off_handler))
+               return PTR_ERR(lenovo_yoga_tab2_830_1050_sys_off_handler);
+
+       return 0;
+}
+
+static struct gpiod_lookup_table lenovo_yoga_tab2_1380_fc_gpios = {
+       .dev_id = "serial0-0",
+       .table = {
+               GPIO_LOOKUP("INT33FC:00", 57, "uart3_txd", GPIO_ACTIVE_HIGH),
+               GPIO_LOOKUP("INT33FC:00", 61, "uart3_rxd", GPIO_ACTIVE_HIGH),
+               { }
+       },
+};
+
+static struct gpiod_lookup_table * const lenovo_yoga_tab2_1380_gpios[] = {
+       &lenovo_yoga_tab2_830_1050_codec_gpios,
+       &lenovo_yoga_tab2_1380_fc_gpios,
+       NULL
+};
+
+const struct x86_dev_info lenovo_yoga_tab2_1380_info __initconst = {
+       .i2c_client_info = lenovo_yoga_tab2_1380_i2c_clients,
+       .i2c_client_count = ARRAY_SIZE(lenovo_yoga_tab2_1380_i2c_clients),
+       .pdev_info = lenovo_yoga_tab2_1380_pdevs,
+       .pdev_count = ARRAY_SIZE(lenovo_yoga_tab2_1380_pdevs),
+       .gpio_button = &lenovo_yoga_tab2_830_1050_lid,
+       .gpio_button_count = 1,
+       .gpiod_lookup_tables = lenovo_yoga_tab2_1380_gpios,
+       .bat_swnode = &generic_lipo_hv_4v35_battery_node,
+       .modules = lenovo_yoga_tab2_1380_modules,
+       .init = lenovo_yoga_tab2_1380_init,
+       .exit = lenovo_yoga_tab2_830_1050_exit,
+};
+
 /* Lenovo Yoga Tab 3 Pro YT3-X90F */
 
 /*
index 468993edfeee25bcb541daedbe6006ccc7fc44bb..821dc094b025439cdb7bd995e29c90167125981e 100644 (file)
@@ -112,6 +112,7 @@ extern const struct x86_dev_info czc_p10t;
 extern const struct x86_dev_info lenovo_yogabook_x90_info;
 extern const struct x86_dev_info lenovo_yogabook_x91_info;
 extern const struct x86_dev_info lenovo_yoga_tab2_830_1050_info;
+extern const struct x86_dev_info lenovo_yoga_tab2_1380_info;
 extern const struct x86_dev_info lenovo_yt3_info;
 extern const struct x86_dev_info medion_lifetab_s10346_info;
 extern const struct x86_dev_info nextbook_ares8_info;