diff options
Diffstat (limited to 'src/drivers/i2c')
-rw-r--r-- | src/drivers/i2c/sx9324/Kconfig | 16 | ||||
-rw-r--r-- | src/drivers/i2c/sx9324/chip.h | 141 | ||||
-rw-r--r-- | src/drivers/i2c/sx9324/registers.h | 4 | ||||
-rw-r--r-- | src/drivers/i2c/sx9324/sx9324.c | 16 |
4 files changed, 177 insertions, 0 deletions
diff --git a/src/drivers/i2c/sx9324/Kconfig b/src/drivers/i2c/sx9324/Kconfig index 77f6967b7e..222ff8d476 100644 --- a/src/drivers/i2c/sx9324/Kconfig +++ b/src/drivers/i2c/sx9324/Kconfig @@ -4,3 +4,19 @@ config DRIVERS_I2C_SX9324 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 9c9dd3cf35..47910fb7a0 100644 --- a/src/drivers/i2c/sx9324/chip.h +++ b/src/drivers/i2c/sx9324/chip.h @@ -23,7 +23,148 @@ struct drivers_i2c_sx9324_config { /* 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 2e22572949..2035463c40 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 2ca9f36345..367849144f 100644 --- a/src/drivers/i2c/sx9324/sx9324.c +++ b/src/drivers/i2c/sx9324/sx9324.c @@ -56,7 +56,23 @@ static void i2c_sx9324_fill_ssdt(const struct device *dev) /* 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 */ |