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 <matt.devillier@gmail.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/90349
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Jason Glenesk <jason.glenesk@gmail.com>
This commit is contained in:
Matt DeVillier 2025-10-19 15:05:33 -05:00
commit 7a78543eca
3 changed files with 79 additions and 10 deletions

View file

@ -6,6 +6,24 @@
#include <intelblocks/cfr.h>
#include <soc/cfr.h>
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
};

View file

@ -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

View file

@ -5,6 +5,7 @@
#include <device/device.h>
#include <drivers/usb/acpi/chip.h>
#include <fw_config.h>
#include <option.h>
#include <soc/soc_chip.h>
#include <static.h>
@ -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;
}
}