summaryrefslogtreecommitdiff
path: root/src/drivers/i2c
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers/i2c')
-rw-r--r--src/drivers/i2c/sx9324/Kconfig16
-rw-r--r--src/drivers/i2c/sx9324/chip.h141
-rw-r--r--src/drivers/i2c/sx9324/registers.h4
-rw-r--r--src/drivers/i2c/sx9324/sx9324.c16
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 */