From 7a78543eca7f4351772b213ae9ed3e245ab85425 Mon Sep 17 00:00:00 2001 From: Matt DeVillier Date: Sun, 19 Oct 2025 15:05:33 -0500 Subject: [PATCH] mb/google/dedede/drawcia: Add CFR option for touchscreen selection The i2c auto-detection fails to find a touchscreen on Drawcia, so create a user-selectable CFR option instead, with the default being all enabled. This allows Linux to probe and detect the correct device, and Windows users to select the appropriate selection. Change-Id: I2e4a760b7d6c9b1546418630f75538adccdcf8e1 Signed-off-by: Matt DeVillier Reviewed-on: https://review.coreboot.org/c/coreboot/+/90349 Tested-by: build bot (Jenkins) Reviewed-by: Jason Glenesk --- src/mainboard/google/dedede/cfr.c | 27 +++++++++++ .../dedede/variants/drawcia/overridetree.cb | 15 ++---- .../google/dedede/variants/drawcia/ramstage.c | 47 +++++++++++++++++++ 3 files changed, 79 insertions(+), 10 deletions(-) diff --git a/src/mainboard/google/dedede/cfr.c b/src/mainboard/google/dedede/cfr.c index 852b9f165c..50f85c90cb 100644 --- a/src/mainboard/google/dedede/cfr.c +++ b/src/mainboard/google/dedede/cfr.c @@ -6,6 +6,24 @@ #include #include +static const struct sm_object touchscreen = SM_DECLARE_ENUM({ + .opt_name = "touchscreen", + .ui_name = "Touchscreen Type", + .ui_helptext = "Select the model of the integrated touchscreen device", + .default_value = 0, + .values = (const struct sm_enum_value[]) { + { "Auto-select", 0 }, + { "ELAN0001", 1 }, + { "GTCH7503", 2 }, + { "GDIX0000", 3 }, + { "ELAN2513", 4 }, + { "WDHT0002", 5 }, + SM_ENUM_VALUE_END }, +#if !CONFIG(BOARD_GOOGLE_DRAWCIA) + .flags = CFR_OPTFLAG_SUPPRESS, +#endif +}); + static struct sm_obj_form system = { .ui_name = "System", .obj_list = (const struct sm_object *[]) { @@ -32,8 +50,17 @@ static struct sm_obj_form ec = { }, }; +static struct sm_obj_form devices = { + .ui_name = "Devices", + .obj_list = (const struct sm_object *[]) { + &touchscreen, + NULL + }, +}; + static struct sm_obj_form *sm_root[] = { &system, + &devices, &ec, NULL }; diff --git a/src/mainboard/google/dedede/variants/drawcia/overridetree.cb b/src/mainboard/google/dedede/variants/drawcia/overridetree.cb index e8546a5cae..fdcfd0226b 100644 --- a/src/mainboard/google/dedede/variants/drawcia/overridetree.cb +++ b/src/mainboard/google/dedede/variants/drawcia/overridetree.cb @@ -231,32 +231,29 @@ chip soc/intel/jasperlake register "hid" = ""ELAN0001"" register "desc" = ""ELAN Touchscreen"" register "irq" = "ACPI_IRQ_LEVEL_LOW(GPP_D4_IRQ)" - register "detect" = "1" register "reset_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_HIGH(GPP_D5)" register "reset_delay_ms" = "20" register "enable_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_HIGH(GPP_D6)" register "enable_delay_ms" = "1" register "has_power_resource" = "true" - device i2c 10 on end + device i2c 10 alias elan0001 on end end chip drivers/i2c/hid register "generic.hid" = ""GTCH7503"" register "generic.desc" = ""G2TOUCH Touchscreen"" register "generic.irq" = "ACPI_IRQ_LEVEL_LOW(GPP_D4_IRQ)" - register "generic.detect" = "1" register "generic.reset_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_HIGH(GPP_D5)" register "generic.reset_delay_ms" = "50" register "generic.enable_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_HIGH(GPP_D6)" register "generic.enable_delay_ms" = "1" register "generic.has_power_resource" = "1" register "hid_desc_reg_offset" = "0x01" - device i2c 40 on end + device i2c 40 alias gtch7503 on end end chip drivers/i2c/hid register "generic.hid" = ""GDIX0000"" register "generic.desc" = ""Goodix Touchscreen"" register "generic.irq" = "ACPI_IRQ_LEVEL_LOW(GPP_D4_IRQ)" - register "generic.detect" = "1" register "generic.reset_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_HIGH(GPP_D5)" register "generic.reset_delay_ms" = "120" register "generic.reset_off_delay_ms" = "2" @@ -264,13 +261,12 @@ chip soc/intel/jasperlake register "generic.enable_delay_ms" = "12" register "generic.has_power_resource" = "1" register "hid_desc_reg_offset" = "0x01" - device i2c 0x5d on end + device i2c 0x5d alias gdix0000 on end end chip drivers/i2c/hid register "generic.hid" = ""ELAN2513"" register "generic.desc" = ""ELAN Touchscreen"" register "generic.irq" = "ACPI_IRQ_LEVEL_LOW(GPP_D4_IRQ)" - register "generic.detect" = "1" register "generic.reset_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_HIGH(GPP_D5)" register "generic.reset_delay_ms" = "20" register "generic.reset_off_delay_ms" = "2" @@ -280,20 +276,19 @@ chip soc/intel/jasperlake register "generic.stop_delay_ms" = "130" register "generic.has_power_resource" = "1" register "hid_desc_reg_offset" = "0x01" - device i2c 15 on end + device i2c 15 alias elan2513 on end end chip drivers/i2c/hid register "generic.hid" = ""WDHT0002"" register "generic.desc" = ""WDT Touchscreen"" register "generic.irq" = "ACPI_IRQ_LEVEL_LOW(GPP_D4_IRQ)" - register "generic.detect" = "1" register "generic.reset_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_HIGH(GPP_D5)" register "generic.reset_delay_ms" = "130" register "generic.enable_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_HIGH(GPP_D6)" register "generic.enable_delay_ms" = "10" register "generic.has_power_resource" = "1" register "hid_desc_reg_offset" = "0x20" - device i2c 2c on end + device i2c 2c alias wdht0002 on end end end # I2C 2 device pci 15.3 on diff --git a/src/mainboard/google/dedede/variants/drawcia/ramstage.c b/src/mainboard/google/dedede/variants/drawcia/ramstage.c index f44a170217..be1b253219 100644 --- a/src/mainboard/google/dedede/variants/drawcia/ramstage.c +++ b/src/mainboard/google/dedede/variants/drawcia/ramstage.c @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -28,9 +29,21 @@ static void update_lte_device_drawcia(void) config->reset_gpio = lte_reset_gpio; } +#define TS_TYPE_AUTO_SELECT 0 +#define TS_TYPE_ELAN0001 0 +#define TS_TYPE_GTCH7503 1 +#define TS_TYPE_GDIX0000 2 +#define TS_TYPE_ELAN2513 3 +#define TS_TYPE_WDHT0002 4 + void variant_devtree_update(void) { uint32_t board_version = board_id(); + struct device *ts_elan0001 = DEV_PTR(elan0001); + struct device *ts_gtch7503 = DEV_PTR(gtch7503); + struct device *ts_gdix0000 = DEV_PTR(gdix0000); + struct device *ts_elan2513 = DEV_PTR(elan2513); + struct device *ts_wdht0002 = DEV_PTR(wdht0002); /* Remove power IC after board version 0xb for Draw* and Oscino units */ if (board_version > 0xb) @@ -38,4 +51,38 @@ void variant_devtree_update(void) /* Board version 0xa, 0xb and 0xf are for Drawper units */ if (board_version != 0xa && board_version != 0xb && board_version != 0xf) update_lte_device_drawcia(); + + /* Update touchscreen device */ + switch (get_uint_option("touchscreen", TS_TYPE_AUTO_SELECT)) { + case TS_TYPE_ELAN0001: + ts_gtch7503->enabled = 0; + ts_gdix0000->enabled = 0; + ts_elan2513->enabled = 0; + ts_wdht0002->enabled = 0; + break; + case TS_TYPE_GTCH7503: + ts_elan0001->enabled = 0; + ts_gdix0000->enabled = 0; + ts_elan2513->enabled = 0; + ts_wdht0002->enabled = 0; + break; + case TS_TYPE_GDIX0000: + ts_elan0001->enabled = 0; + ts_gtch7503->enabled = 0; + ts_elan2513->enabled = 0; + ts_wdht0002->enabled = 0; + break; + case TS_TYPE_ELAN2513: + ts_elan0001->enabled = 0; + ts_gtch7503->enabled = 0; + ts_gdix0000->enabled = 0; + ts_wdht0002->enabled = 0; + break; + case TS_TYPE_WDHT0002: + ts_elan0001->enabled = 0; + ts_gtch7503->enabled = 0; + ts_gdix0000->enabled = 0; + ts_elan2513->enabled = 0; + break; + } }