Cliff Huang has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/81335?usp=email )
Change subject: mb/intel/mtlrvp: Add Intel Touch driver for controller 0 and 1 ......................................................................
mb/intel/mtlrvp: Add Intel Touch driver for controller 0 and 1
NOTE: Rework is required for both THC0 and THC1. NOTE: The resistor on the THC-SPI MISO pin should be 100 Ohm.
BUG=b:307775082
TEST=set CBI THC0_TOUCH or THC1_TOUCH fw_config to WACOM or ELAN. Boot RVP to OS and run lspci to check THC device and check that THC device driver initialization successfully. /sys/class/hidraw/hidraw0/device/input/ should have several inputs enumerated.
Signed-off-by: Cliff Huang cliff.huang@intel.com Change-Id: I5433693973a21e90886c9075a23aaac84b2f642d --- M src/mainboard/intel/mtlrvp/Kconfig M src/mainboard/intel/mtlrvp/Makefile.mk M src/mainboard/intel/mtlrvp/fw_config.c M src/mainboard/intel/mtlrvp/variants/baseboard/mtlrvp_p/gpio.c M src/mainboard/intel/mtlrvp/variants/mtlrvp_p_ext_ec/overridetree.cb 5 files changed, 258 insertions(+), 2 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/35/81335/1
diff --git a/src/mainboard/intel/mtlrvp/Kconfig b/src/mainboard/intel/mtlrvp/Kconfig index 36842b5..5b951ab 100644 --- a/src/mainboard/intel/mtlrvp/Kconfig +++ b/src/mainboard/intel/mtlrvp/Kconfig @@ -48,6 +48,7 @@ select EC_GOOGLE_CHROMEEC_BOARDID select FW_CONFIG select FW_CONFIG_SOURCE_CHROMEEC_CBI + select SOC_INTEL_TOUCH
if BOARD_INTEL_MTLRVP_COMMON
diff --git a/src/mainboard/intel/mtlrvp/Makefile.mk b/src/mainboard/intel/mtlrvp/Makefile.mk index d8144c8..103e336 100644 --- a/src/mainboard/intel/mtlrvp/Makefile.mk +++ b/src/mainboard/intel/mtlrvp/Makefile.mk @@ -8,6 +8,7 @@
ramstage-y += ec.c ramstage-y += mainboard.c +ramstage-y += fw_config.c
smm-$(CONFIG_HAVE_SMI_HANDLER) += smihandler.c
diff --git a/src/mainboard/intel/mtlrvp/fw_config.c b/src/mainboard/intel/mtlrvp/fw_config.c index d874228..a3ea58a 100644 --- a/src/mainboard/intel/mtlrvp/fw_config.c +++ b/src/mainboard/intel/mtlrvp/fw_config.c @@ -4,6 +4,18 @@ #include <gpio.h> #include <inttypes.h>
+#if CONFIG(SOC_INTEL_TOUCH) +#include <soc/pci_devs.h> +#include <drivers/intel/touch/chip.h> +const struct drivers_intel_touch_config *mainboard_get_intel_touch_config(int ctl_idx); +WEAK_DEV_PTR(touch_0_wacom); +WEAK_DEV_PTR(touch_0_elan); +WEAK_DEV_PTR(touch_0_generic); +WEAK_DEV_PTR(touch_1_wacom); +WEAK_DEV_PTR(touch_1_elan); +WEAK_DEV_PTR(touch_1_generic); +#endif + static const struct pad_config i2s_enable_pads[] = { /* Audio: I2S */ PAD_CFG_NF(GPP_D09, NONE, DEEP, NF2), /* I2S_MCLK1_OUT */ @@ -99,3 +111,49 @@
} BOOT_STATE_INIT_ENTRY(BS_DEV_ENABLE, BS_ON_ENTRY, fw_config_handle, NULL); + +#if CONFIG(SOC_INTEL_TOUCH) +const struct drivers_intel_touch_config *mainboard_get_intel_touch_config(int ctl_idx) +{ + const struct drivers_intel_touch_config *touch_config = NULL; + + if (ctl_idx == 0) { + if (is_devfn_enabled(PCI_DEVFN_THC0)) { + printk(BIOS_DEBUG, "THC%d device function is enabled\n", ctl_idx); + } + } else if (ctl_idx == 1) { + if (is_devfn_enabled(PCI_DEVFN_THC1)) { + printk(BIOS_DEBUG, "THC%d device function is enabled\n", ctl_idx); + } + } else { + printk(BIOS_ERR, "Invalid index for THC%d\n", ctl_idx); + return NULL; + } + if (ctl_idx == 0) { + if (fw_config_probe(FW_CONFIG(THC0_TOUCH, WACOM))) { + printk(BIOS_DEBUG, "THC%d uses WACOM sensor\n", ctl_idx); + touch_config = config_of(DEV_PTR(touch_0_wacom)); + } else if (fw_config_probe(FW_CONFIG(THC0_TOUCH, ELAN))) { + printk(BIOS_DEBUG, "THC%d uses ELAN sensor\n", ctl_idx); + touch_config = config_of(DEV_PTR(touch_0_elan)); + } else if (fw_config_probe(FW_CONFIG(THC0_TOUCH, GENERIC))) { + printk(BIOS_DEBUG, "THC%d uses generic sensor\n", ctl_idx); + touch_config = config_of(DEV_PTR(touch_0_generic)); + } + } else if (ctl_idx == 1) { + if (fw_config_probe(FW_CONFIG(THC1_TOUCH, WACOM))) { + printk(BIOS_DEBUG, "THC%d uses WACOM sensor\n", ctl_idx); + touch_config = config_of(DEV_PTR(touch_1_wacom)); + } else if (fw_config_probe(FW_CONFIG(THC1_TOUCH, ELAN))) { + printk(BIOS_DEBUG, "THC%d uses ELAN sensor\n", ctl_idx); + touch_config = config_of(DEV_PTR(touch_1_elan)); + } else if (fw_config_probe(FW_CONFIG(THC1_TOUCH, GENERIC))) { + printk(BIOS_DEBUG, "THC%d uses generic sensor\n", ctl_idx); + touch_config = config_of(DEV_PTR(touch_1_generic)); + } + } + return touch_config; +} +#endif + + diff --git a/src/mainboard/intel/mtlrvp/variants/baseboard/mtlrvp_p/gpio.c b/src/mainboard/intel/mtlrvp/variants/baseboard/mtlrvp_p/gpio.c index 2c48a0e..02414b6 100644 --- a/src/mainboard/intel/mtlrvp/variants/baseboard/mtlrvp_p/gpio.c +++ b/src/mainboard/intel/mtlrvp/variants/baseboard/mtlrvp_p/gpio.c @@ -180,6 +180,8 @@ PAD_CFG_NF(GPP_E05, NONE, DEEP, NF1), /* GPP_E6: THC0_SPI1_RST_N_TCH_PNL1 */ PAD_CFG_NF(GPP_E06, NONE, DEEP, NF2), + /* GPP_E6: THC0_SPI1_RST_N_TCH_PNL1 NOTE: use GPO instead for reset pin */ + PAD_CFG_GPO(GPP_E06, 1, DEEP), /* GPP_E8: CRD_PRIVACY_LED */ PAD_CFG_GPO(GPP_E08, 1, DEEP), /* GPP_E9: USB_CONN_TYPEA_12_TYPEC_01_FP_P7_P8_P9_P10_OC0_N */ @@ -225,12 +227,20 @@ /* GPP_F9: CODEC_INT_N */ PAD_CFG_GPI_APIC(GPP_F09, NONE, DEEP, LEVEL, INVERT), /* TPM: GPP_F11:GPP_F13, GPP_F17 */ + /* EH33 GPP_F11/THC1_SPI2_CLK/ISH_SPIATi_CLK/GSPI1_CLK/USB-C_GPP_F11 */ + PAD_CFG_NF(GPP_F11, NONE, DEEP, NF3), + /* EF36 GPP_F12/GSXDOUT/THC1_SPI2_IO0/ISH_SPIA_MISO/GSPI1_MOSI/I2C5_SCL/USB-C_GPP_F12 */ + PAD_CFG_NF(GPP_F12, NONE, DEEP, NF3), + /* ER33 GPP_F13/GSXSLOAD/THC1_SPI2_IO1/ISH_SPIA_MOSI/GSPI1_MISO/I2C5_SDA/USB-C_GPP_F13 */ + PAD_CFG_NF(GPP_F13, NONE, DEEP, NF3), /* GPP_F14: THC1_SPI2_IO_2_TCH_PNL2 */ PAD_CFG_NF(GPP_F14, NONE, DEEP, NF3), /* GPP_F15: THC1_SPI2_IO_3_TCH_PNL2 */ PAD_CFG_NF(GPP_F15, NONE, DEEP, NF3), - /* GPP_F16: THC1_SPI2_RST_N_TCH_PNL2 */ - PAD_CFG_NF(GPP_F16, NONE, DEEP, NF3), + /* GPP_F16: THC1_SPI2_RST_N_TCH_PNL2 NOTE: use GPO instead for reset pin */ + PAD_CFG_GPO(GPP_F16, 1, DEEP), + /* EC33 GPP_F17/THC1_SPI2_CS#/ISH_SPIA_CS#/GSPI1_CS0#/USB-C_GPP_F17 */ + PAD_CFG_NF(GPP_F17, NONE, DEEP, NF3), /* GPP_F18: THC1_SPI2_INT_N_TCH_PNL2 */ PAD_CFG_NF(GPP_F18, NONE, DEEP, NF3), /* GPP_F19: X4_PCIE_SLOT2_WAKE_N_R */ diff --git a/src/mainboard/intel/mtlrvp/variants/mtlrvp_p_ext_ec/overridetree.cb b/src/mainboard/intel/mtlrvp/variants/mtlrvp_p_ext_ec/overridetree.cb index 3f1579e..8adbb4f 100644 --- a/src/mainboard/intel/mtlrvp/variants/mtlrvp_p_ext_ec/overridetree.cb +++ b/src/mainboard/intel/mtlrvp/variants/mtlrvp_p_ext_ec/overridetree.cb @@ -1,5 +1,23 @@ +fw_config + field THC0_TOUCH 12 13 + option NONE 0 + option WACOM 1 + option ELAN 2 + option GENERIC 3 + end + field THC1_TOUCH 14 15 + option NONE 0 + option WACOM 1 + option ELAN 2 + option GENERIC 3 + end +end + chip soc/intel/meteorlake
+ # THC configuration + register "thc_configuration" = "THC_CONFIG_DOUBLE_CONTROLLER" + device domain 0 on device ref soc_espi on chip ec/google/chromeec @@ -36,5 +54,173 @@ end end end + # NOTE: thc0 & thc1 setting need to match with SOC "thc_configuration". + # device ref thc0 alias thc0_dev on + device ref thc0 on + probe THC0_TOUCH WACOM + probe THC0_TOUCH ELAN + probe THC0_TOUCH GENERIC + chip drivers/intel/touch + register "name" = "INTEL_THC0_NAME" + register "mode" = "THC_HID_SPI_MODE" + + # register "enable_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_HIGH(GPP_F23)" + # register "enable_delay_ms" = "10" + # register "enable_off_delay_ms" = "2" + # register "reset_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_LOW(GPP_E06)" + # register "reset_delay_ms" = "20" + # register "reset_off_delay_ms" = "2" + + register "wake_on_touch" = "1" + register "wake_irq" = "ACPI_IRQ_WAKE_EDGE_LOW(GPP_VGPIO3_THC0)" + + register "hidspi_flags" = "HIDSPI_WRITE_MODE_SINGLE" + register "hidspi_reset_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_LOW(GPP_E06)" + register "sensor_dev_name" = "WACOM_DEV_NAME" + register "connected_device" = "TH_SENSOR_WACOM" + device generic 0 alias touch_0_wacom on + probe THC0_TOUCH WACOM + end + end + chip drivers/intel/touch + register "name" = "INTEL_THC0_NAME" + register "mode" = "THC_HID_SPI_MODE" + + # register "enable_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_HIGH(GPP_F23)" + # register "enable_delay_ms" = "10" + # register "enable_off_delay_ms" = "2" + # register "reset_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_LOW(GPP_E06)" + # register "reset_delay_ms" = "20" + # register "reset_off_delay_ms" = "2" + + register "wake_on_touch" = "1" + register "wake_irq" = "ACPI_IRQ_WAKE_EDGE_LOW(GPP_VGPIO3_THC0)" + + register "hidspi_flags" = "HIDSPI_WRITE_MODE_SINGLE" + register "hidspi_reset_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_LOW(GPP_E06)" + register "sensor_dev_name" = "ELAN_DEV_NAME" + register "connected_device" = "TH_SENSOR_ELAN" + device generic 0 alias touch_0_elan on + probe THC0_TOUCH ELAN + end + end + chip drivers/intel/touch + register "name" = "INTEL_THC0_NAME" + register "mode" = "THC_HID_SPI_MODE" + + # register "enable_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_HIGH(GPP_F23)" + # register "enable_delay_ms" = "10" + # register "enable_off_delay_ms" = "2" + # register "reset_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_LOW(GPP_E06)" + # register "reset_delay_ms" = "20" + # register "reset_off_delay_ms" = "2" + + register "wake_on_touch" = "1" + register "wake_irq" = "ACPI_IRQ_WAKE_EDGE_LOW(GPP_VGPIO3_THC0)" + + register "hidspi_flags" = "HIDSPI_WRITE_MODE_SINGLE" + register "hidspi_reset_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_LOW(GPP_E06)" + register "sensor_dev_name" = ""Generic Sensor"" + register "connected_device" = "TH_SENSOR_GENERIC" + register "hidspi_connection_speed" = "17000000" + register "active_ltr" = "0xFFFFFFFF" + register "idle_ltr" = "0xFFFFFFFF" + register "hidspi_input_report_header_address" = "0" + register "hidspi_input_report_body_address" = "0x1000" + register "hidspi_output_report_address" = "0x1000" + register "hidspi_read_opcode" = "0xb" + register "hidspi_write_opcode" = "0xb" + register "hidspi_limit_packet_size" = "1" + register "perform_limit" = "0" + register "reset_sequencing_delay" = "12" + device generic 0 alias touch_0_generic on + probe THC0_TOUCH GENERIC + end + end + end + # secondary non-I2C THC sensor device + device ref thc1 on + probe THC1_TOUCH WACOM + probe THC1_TOUCH ELAN + probe THC1_TOUCH GENERIC + chip drivers/intel/touch + register "name" = "INTEL_THC1_NAME" + register "mode" = "THC_HID_SPI_MODE" + + # register "enable_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_HIGH(GPP_F22)" + # register "enable_delay_ms" = "10" + # register "enable_off_delay_ms" = "2" + # register "reset_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_LOW(GPP_F16)" + # register "reset_delay_ms" = "20" + # register "reset_off_delay_ms" = "2" + + register "wake_on_touch" = "1" + register "wake_irq" = "ACPI_IRQ_WAKE_EDGE_LOW(GPP_VGPIO3_THC1)" + + register "hidspi_flags" = "HIDSPI_WRITE_MODE_SINGLE" + register "hidspi_reset_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_LOW(GPP_F16)" + register "sensor_dev_name" = "WACOM_DEV_NAME" + register "connected_device" = "TH_SENSOR_WACOM" + device generic 0 alias touch_1_wacom on + probe THC1_TOUCH WACOM + end + end + chip drivers/intel/touch + register "name" = "INTEL_THC1_NAME" + register "mode" = "THC_HID_SPI_MODE" + + # register "enable_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_HIGH(GPP_F22)" + # register "enable_delay_ms" = "10" + # register "enable_off_delay_ms" = "2" + # register "reset_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_LOW(GPP_F16)" + # register "reset_delay_ms" = "20" + # register "reset_off_delay_ms" = "2" + + register "wake_on_touch" = "1" + register "wake_irq" = "ACPI_IRQ_WAKE_EDGE_LOW(GPP_VGPIO3_THC1)" + + register "hidspi_flags" = "HIDSPI_WRITE_MODE_SINGLE" + register "hidspi_reset_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_LOW(GPP_F16)" + register "sensor_dev_name" = "ELAN_DEV_NAME" + register "connected_device" = "TH_SENSOR_ELAN" + device generic 0 alias touch_1_elan on + probe THC1_TOUCH ELAN + end + end + chip drivers/intel/touch + register "name" = "INTEL_THC0_NAME" + register "mode" = "THC_HID_SPI_MODE" + + # register "enable_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_HIGH(GPP_F22)" + # register "enable_delay_ms" = "10" + # register "enable_off_delay_ms" = "2" + # register "reset_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_LOW(GPP_F16)" + # register "reset_delay_ms" = "20" + # register "reset_off_delay_ms" = "2" + + register "wake_on_touch" = "1" + register "wake_irq" = "ACPI_IRQ_WAKE_EDGE_LOW(GPP_VGPIO3_THC1)" + + register "hidspi_flags" = "HIDSPI_WRITE_MODE_SINGLE" + register "hidspi_reset_gpio" = "ACPI_GPIO_OUTPUT_ACTIVE_LOW(GPP_F16)" + register "sensor_dev_name" = ""Generic Sensor"" + register "connected_device" = "TH_SENSOR_GENERIC" + register "hidspi_connection_speed" = "17000000" + register "active_ltr" = "0xFFFFFFFF" + register "idle_ltr" = "0xFFFFFFFF" + register "hidspi_input_report_header_address" = "0" + register "hidspi_input_report_body_address" = "0x1000" + register "hidspi_output_report_address" = "0x1000" + register "hidspi_read_opcode" = "0xb" + register "hidspi_write_opcode" = "0x1" + register "hidspi_limit_packet_size" = "1" + register "perform_limit" = "0" + register "reset_sequencing_delay" = "12" + device generic 0 alias touch_1_generic on + probe THC1_TOUCH GENERIC + end + end + end end end +