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/Documentation/devicetree/bindings/iio/proximity/semtech,sx9324.yaml

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>
This commit is contained in:
Victor Ding 2022-11-02 08:24:41 +00:00 committed by Eric Lai
parent b4d71e1ab2
commit 20265b09dc
7 changed files with 188 additions and 0 deletions

View File

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

View File

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

View File

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

View File

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

View File

@ -40,6 +40,7 @@ config BOARD_GOOGLE_BRYA0
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 @@ config BOARD_GOOGLE_NIVVIKS
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 @@ config BOARD_GOOGLE_SKOLAS
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 @@ config BOARD_GOOGLE_SKOLAS4ES
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 @@ config BOARD_GOOGLE_PUJJO
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

View File

@ -5,6 +5,7 @@ config BOARD_GOOGLE_BOTEN
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 @@ config BOARD_GOOGLE_STORO
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 @@ config BOARD_GOOGLE_KRACKO
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 @@ config BOARD_GOOGLE_GOOEY
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 @@ config BOARD_GOOGLE_BEADRIX
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"

View File

@ -8,6 +8,7 @@ config BOARD_GOOGLE_VILBOZ
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)"