Eric Lai has submitted this change. ( https://review.coreboot.org/c/coreboot/+/69192 )
Change subject: drivers/i2c/sx9324: Add support for Linux's SX9324 driver ......................................................................
drivers/i2c/sx9324: Add support for Linux's SX9324 driver
SX9324 driver is updated per Linux's documentation found at https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Docu...
Supporting logic for the deprecated SX932x driver is hence guarded by DRIVERS_I2C_SX9324_SUPPORT_LEGACY_LINUX_DRIVER
This patch by itself does not introduce functional changes to any board. The legacy SX932x Linux driver never reached upstream Linux and is only available in ChromeOS kernel fork of 4.4 and 5.4. Linux later accepted a different implementation named SX9324 and has been available since 5.4. Ideally all variants should adopt the new driver; however, during the transition phase, coreboot must support both drivers. It is better to have a single firmware build that can work with both Linux kernel drivers by specifying both sets of properties. Legacy driver support should be deleted once all variants finish migration.
BUG=b:242662878 TEST=Dump ACPI SSDT then verify _DSD entries related to the legacy SX932x driver are identical w/ and w/o this patch (Tested on Craask and Nivviks)
Change-Id: I42cd6841c3a270c242ed2e739db245e858eadb3b Signed-off-by: Victor Ding victording@google.com Reviewed-on: https://review.coreboot.org/c/coreboot/+/69192 Reviewed-by: Reka Norman rekanorman@chromium.org Reviewed-by: Tarun Tuli taruntuli@google.com Tested-by: build bot (Jenkins) no-reply@coreboot.org Reviewed-by: Eric Lai eric_lai@quanta.corp-partner.google.com --- M src/drivers/i2c/sx9324/Kconfig M src/drivers/i2c/sx9324/chip.h M src/drivers/i2c/sx9324/registers.h M src/drivers/i2c/sx9324/sx9324.c M src/mainboard/google/brya/Kconfig.name M src/mainboard/google/dedede/Kconfig.name M src/mainboard/google/zork/Kconfig.name 7 files changed, 224 insertions(+), 0 deletions(-)
Approvals: build bot (Jenkins): Verified Reka Norman: Looks good to me, approved Eric Lai: Looks good to me, approved Tarun Tuli: Looks good to me, approved
diff --git a/src/drivers/i2c/sx9324/Kconfig b/src/drivers/i2c/sx9324/Kconfig index 77f6967..222ff8d 100644 --- a/src/drivers/i2c/sx9324/Kconfig +++ b/src/drivers/i2c/sx9324/Kconfig @@ -4,3 +4,19 @@ depends on HAVE_ACPI_TABLES help Board has a Semtech SX9324 proximity sensor. + +config DRIVERS_I2C_SX9324_SUPPORT_LEGACY_LINUX_DRIVER + bool + default n + depends on DRIVERS_I2C_SX9324 + help + Board may use the legacy sx932x linux driver. + This option is mainly to ease migrating from the legacy driver to the + Linux one and should be deleted once all variants finish migration. + This driver never reached upstream Linux and is only available in + ChromeOS kernel fork of 4.4 and 5.4. Linux later accepted a different + implementation named SX9324 and has been available since 5.4. + Ideally all variants should adopt the new driver; however, during the + transition phase, coreboot must support both drivers. By selecting this + option, coreboot's SX9324 driver will specify all properties to work with + both Linux kernel drivers. diff --git a/src/drivers/i2c/sx9324/chip.h b/src/drivers/i2c/sx9324/chip.h index 9c9dd3c..47910fb 100644 --- a/src/drivers/i2c/sx9324/chip.h +++ b/src/drivers/i2c/sx9324/chip.h @@ -23,7 +23,148 @@
/* IO-APIC interrupt */ struct acpi_irq irq; + + /* + semtech,ph0-pin: + description: | + Array of 3 entries. Index represent the id of the CS pin. + Value indicates how each CS pin is used during phase 0. + Each of the 3 pins have the following value - + 0 : unused (high impedance) + 1 : measured input + 2 : dynamic shield + 3 : grounded. + For instance, CS0 measured, CS1 shield and CS2 ground is [1, 2, 3] + items: + enum: [ 0, 1, 2, 3 ] + minItems: 3 + maxItems: 3 + */ + uint64_t ph0_pin[3]; + + /* + semtech,ph1-pin: + Same as ph0-pin for phase 1. + */ + uint64_t ph1_pin[3]; + + /* + semtech,ph2-pin: + Same as ph0-pin for phase 2. + */ + uint64_t ph2_pin[3]; + + /* + semtech,ph3-pin: + Same as ph0-pin for phase 3. + */ + uint64_t ph3_pin[3]; + + /* + semtech,ph01-resolution: + enum: [8, 16, 32, 64, 128, 256, 512, 1024] + description: + Capacitance measurement resolution. For phase 0 and 1. + Higher the number, higher the resolution. + default: 128 + */ + uint64_t ph01_resolution; + + /* + semtech,ph23-resolution: + Same as ph01-resolution for phase 2 and 3. + */ + uint64_t ph23_resolution; + + /* + semtech,startup-sensor: + enum: [0, 1, 2, 3] + default: 0 + description: | + Phase used for start-up proximity detection. + It is used when we enable a phase to remove static offset and measure + only capacitance changes introduced by the user. + */ + uint64_t startup_sensor; + + /* + semtech,ph01-proxraw-strength: + minimum: 0 + maximum: 7 + default: 1 + description: + PROXRAW filter strength for phase 0 and 1. A value of 0 represents off, + and other values represent 1-1/2^N. + */ + uint64_t ph01_proxraw_strength; + + /* + semtech,ph23-proxraw-strength: + Same as proxraw-strength01, for phase 2 and 3. + */ + uint64_t ph23_proxraw_strength; + + /* + semtech,avg-pos-strength: + enum: [0, 16, 64, 128, 256, 512, 1024, 4294967295] + default: 16 + description: | + Average positive filter strength. A value of 0 represents off and + UINT_MAX (4294967295) represents infinite. Other values + represent 1-1/N. + */ + uint64_t avg_pos_strength; + + /* + semtech,cs-idle-sleep: + description: + State of CS pins during sleep mode and idle time. + enum: + - hi-z + - gnd + - vdd + */ + const char *cs_idle_sleep; + + /* + semtech,int-comp-resistor: + description: + Internal resistor setting for compensation. + enum: + - lowest + - low + - high + - highest + */ + const char *int_comp_resistor; + + /* + semtech,input-precharge-resistor-ohms: + default: 4000 + multipleOf: 2000 + minimum: 0 + maximum: 30000 + description: + Pre-charge input resistance in Ohm. + */ + uint64_t input_precharge_resistor_ohms; + + /* + semtech,input-analog-gain: + minimum: 0 + maximum: 3 + description: | + Defines the input antenna analog gain + 0: x1.247 + 1: x1 (default) + 2: x0.768 + 3: x0.552 + */ + uint64_t input_analog_gain; + +#if CONFIG(DRIVERS_I2C_SX9324_SUPPORT_LEGACY_LINUX_DRIVER) #include "registers.h" +#endif };
#undef REGISTER diff --git a/src/drivers/i2c/sx9324/registers.h b/src/drivers/i2c/sx9324/registers.h index 2e22572..2035463 100644 --- a/src/drivers/i2c/sx9324/registers.h +++ b/src/drivers/i2c/sx9324/registers.h @@ -4,6 +4,10 @@ #error "define REGISTER(NAME) before including this file" #endif
+#if !CONFIG(DRIVERS_I2C_SX9324_SUPPORT_LEGACY_LINUX_DRIVER) +#error "This file is only to support the legacy sx932x linux driver" +#endif + REGISTER(reg_adv_ctrl0); REGISTER(reg_adv_ctrl1); REGISTER(reg_adv_ctrl2); diff --git a/src/drivers/i2c/sx9324/sx9324.c b/src/drivers/i2c/sx9324/sx9324.c index 2ca9f36..3678491 100644 --- a/src/drivers/i2c/sx9324/sx9324.c +++ b/src/drivers/i2c/sx9324/sx9324.c @@ -56,7 +56,23 @@
/* DSD */ dsd = acpi_dp_new_table("_DSD"); + acpi_dp_add_integer_array(dsd, "semtech,ph0-pin", config->ph0_pin, ARRAY_SIZE(config->ph0_pin)); + acpi_dp_add_integer_array(dsd, "semtech,ph1-pin", config->ph1_pin, ARRAY_SIZE(config->ph1_pin)); + acpi_dp_add_integer_array(dsd, "semtech,ph2-pin", config->ph2_pin, ARRAY_SIZE(config->ph2_pin)); + acpi_dp_add_integer_array(dsd, "semtech,ph3-pin", config->ph3_pin, ARRAY_SIZE(config->ph3_pin)); + acpi_dp_add_integer(dsd, "semtech,ph01-resolution", config->ph01_resolution); + acpi_dp_add_integer(dsd, "semtech,ph23-resolution", config->ph23_resolution); + acpi_dp_add_integer(dsd, "semtech,startup-sensor", config->startup_sensor); + acpi_dp_add_integer(dsd, "semtech,ph01-proxraw-strength", config->ph01_proxraw_strength); + acpi_dp_add_integer(dsd, "semtech,ph23-proxraw-strength", config->ph23_proxraw_strength); + acpi_dp_add_integer(dsd, "semtech,avg-pos-strength", config->avg_pos_strength); + acpi_dp_add_integer(dsd, "semtech,input-precharge-resistor-ohms", config->input_precharge_resistor_ohms); + acpi_dp_add_integer(dsd, "semtech,input-analog-gain", config->input_analog_gain); + acpi_dp_add_string(dsd, "semtech,cs-idle-sleep", config->cs_idle_sleep); + acpi_dp_add_string(dsd, "semtech,int-comp-resistor", config->int_comp_resistor); +#if CONFIG(DRIVERS_I2C_SX9324_SUPPORT_LEGACY_LINUX_DRIVER) #include "registers.h" +#endif acpi_dp_write(dsd);
acpigen_pop_len(); /* Device */ diff --git a/src/mainboard/google/brya/Kconfig.name b/src/mainboard/google/brya/Kconfig.name index 4ead1f9..3c755c6 100644 --- a/src/mainboard/google/brya/Kconfig.name +++ b/src/mainboard/google/brya/Kconfig.name @@ -40,6 +40,7 @@ select SOC_INTEL_RAPTORLAKE select DRIVERS_GENESYSLOGIC_GL9755 select DRIVERS_I2C_SX9324 + select DRIVERS_I2C_SX9324_SUPPORT_LEGACY_LINUX_DRIVER select DRIVERS_INTEL_MIPI_CAMERA select SOC_INTEL_COMMON_BLOCK_IPU select SOC_INTEL_CRASHLOG @@ -85,6 +86,7 @@ select DRIVERS_GENERIC_GPIO_KEYS select DRIVERS_GENESYSLOGIC_GL9750 select DRIVERS_I2C_SX9324 + select DRIVERS_I2C_SX9324_SUPPORT_LEGACY_LINUX_DRIVER select DRIVERS_INTEL_MIPI_CAMERA select HAVE_WWAN_POWER_SEQUENCE
@@ -139,6 +141,7 @@ select DRIVERS_GENESYSLOGIC_GL9755 select DRIVERS_INTEL_MIPI_CAMERA select DRIVERS_I2C_SX9324 + select DRIVERS_I2C_SX9324_SUPPORT_LEGACY_LINUX_DRIVER select SOC_INTEL_COMMON_BLOCK_IPU
config BOARD_GOOGLE_SKOLAS4ES @@ -147,6 +150,7 @@ select DRIVERS_GENESYSLOGIC_GL9755 select DRIVERS_INTEL_MIPI_CAMERA select DRIVERS_I2C_SX9324 + select DRIVERS_I2C_SX9324_SUPPORT_LEGACY_LINUX_DRIVER select SOC_INTEL_COMMON_BLOCK_IPU
config BOARD_GOOGLE_TAEKO @@ -257,6 +261,7 @@ select DRIVERS_GENERIC_GPIO_KEYS select DRIVERS_GENESYSLOGIC_GL9750 select DRIVERS_I2C_SX9324 + select DRIVERS_I2C_SX9324_SUPPORT_LEGACY_LINUX_DRIVER select HAVE_WWAN_POWER_SEQUENCE
config BOARD_GOOGLE_XIVU diff --git a/src/mainboard/google/dedede/Kconfig.name b/src/mainboard/google/dedede/Kconfig.name index 45cc117..4f2fa04 100644 --- a/src/mainboard/google/dedede/Kconfig.name +++ b/src/mainboard/google/dedede/Kconfig.name @@ -5,6 +5,7 @@ select BOARD_GOOGLE_BASEBOARD_DEDEDE_CR50 select BASEBOARD_DEDEDE_LAPTOP select DRIVERS_I2C_SX9324 + select DRIVERS_I2C_SX9324_SUPPORT_LEGACY_LINUX_DRIVER select GEO_SAR_ENABLE if CHROMEOS_WIFI_SAR
config BOARD_GOOGLE_DEDEDE @@ -108,6 +109,7 @@ select BOARD_GOOGLE_BASEBOARD_DEDEDE_CR50 select BASEBOARD_DEDEDE_LAPTOP select DRIVERS_I2C_SX9324 + select DRIVERS_I2C_SX9324_SUPPORT_LEGACY_LINUX_DRIVER select DRIVERS_INTEL_MIPI_CAMERA select SOC_INTEL_COMMON_BLOCK_IPU select GEO_SAR_ENABLE if CHROMEOS_WIFI_SAR @@ -124,6 +126,7 @@ select BASEBOARD_DEDEDE_LAPTOP select DRIVERS_GENERIC_MAX98357A select DRIVERS_I2C_SX9324 + select DRIVERS_I2C_SX9324_SUPPORT_LEGACY_LINUX_DRIVER select GEO_SAR_ENABLE if CHROMEOS_WIFI_SAR
config BOARD_GOOGLE_BLIPPER @@ -177,6 +180,7 @@ select BOARD_GOOGLE_BASEBOARD_DEDEDE_TPM2 select BASEBOARD_DEDEDE_LAPTOP select DRIVERS_I2C_SX9324 + select DRIVERS_I2C_SX9324_SUPPORT_LEGACY_LINUX_DRIVER select GEO_SAR_ENABLE if CHROMEOS_WIFI_SAR
config BOARD_GOOGLE_BEADRIX @@ -185,6 +189,7 @@ select BASEBOARD_DEDEDE_LAPTOP select DRIVERS_GENERIC_MAX98357A select DRIVERS_I2C_SX9324 + select DRIVERS_I2C_SX9324_SUPPORT_LEGACY_LINUX_DRIVER
config BOARD_GOOGLE_SHOTZO bool "-> Shotzo" diff --git a/src/mainboard/google/zork/Kconfig.name b/src/mainboard/google/zork/Kconfig.name index 7ba518a..4e6cfc5 100644 --- a/src/mainboard/google/zork/Kconfig.name +++ b/src/mainboard/google/zork/Kconfig.name @@ -8,6 +8,7 @@ bool "-> Vilboz (Lenovo 100e/300e Gen3 AMD)" select BOARD_GOOGLE_BASEBOARD_DALBOZ select DRIVERS_I2C_SX9324 + select DRIVERS_I2C_SX9324_SUPPORT_LEGACY_LINUX_DRIVER
config BOARD_GOOGLE_EZKINIL bool "-> Ezkinil (Acer Chromebook Spin 514)"