summaryrefslogtreecommitdiff
path: root/src/drivers/i2c/sx9310/sx9310.c
diff options
context:
space:
mode:
authorGwendal Grignou <gwendal@chromium.org>2021-01-27 23:29:38 -0800
committerFurquan Shaikh <furquan@google.com>2021-03-10 19:33:01 +0000
commit689c25b9d6bbd62875f1fb31dca5cc694b8e262f (patch)
tree7eccefd9cd1540dcfd66a6c7f3aeb973a7dad018 /src/drivers/i2c/sx9310/sx9310.c
parente4a7e46a9c1219ebffb94ea3de5181aaaf86f27c (diff)
drivers/i2c: sx9310: Replace register map with descriptive names
The current driver is using chip registers map to configure the SAR sensor, which is opaque, especially when the datasheet is not published widely. Use more descriptive names, as defined in Linux kernel documentation at https://www.kernel.org/doc/Documentation/devicetree/bindings/iio/proximity/semtech%2Csx9310.yaml BUG=b:173341604 BRANCH=volteer TEST=Dump all tables, check semtech property: for i in $(find /sys/firmware/acpi/tables/ -type f) ; do f=$(basename $i); cat $i > /tmp/$f.dat ; iasl -d /tmp/$f.dat done In SSDT.dsl, we have: Package (0x06) { Package (0x02) { "semtech,cs0-ground", Zero }, Package (0x02) { "semtech,startup-sensor", Zero }, Package (0x02) { "semtech,proxraw-strength", Zero }, Package (0x02) { "semtech,avg-pos-strength", 0x0200 }, Package (0x02) { "semtech,combined-sensors", Package (0x03) { Zero, One, 0x02 } }, Package (0x02) { "semtech,resolution", "finest" } } Change-Id: I8d1c81b56eaeef1dbb0f73c1d74c3a20e8b2fd7b Signed-off-by: Gwendal Grignou <gwendal@chromium.org> Reviewed-on: https://review.coreboot.org/c/coreboot/+/50210 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Furquan Shaikh <furquan@google.com>
Diffstat (limited to 'src/drivers/i2c/sx9310/sx9310.c')
-rw-r--r--src/drivers/i2c/sx9310/sx9310.c46
1 files changed, 39 insertions, 7 deletions
diff --git a/src/drivers/i2c/sx9310/sx9310.c b/src/drivers/i2c/sx9310/sx9310.c
index 8dc57a2d98..d9e5a14c5b 100644
--- a/src/drivers/i2c/sx9310/sx9310.c
+++ b/src/drivers/i2c/sx9310/sx9310.c
@@ -12,9 +12,16 @@
#define I2C_SX9310_ACPI_ID "STH9310"
#define I2C_SX9310_ACPI_NAME "Semtech SX9310"
-#define REGISTER(NAME) acpi_dp_add_integer(dsd, \
- I2C_SX9310_ACPI_ID "," #NAME, \
- config->NAME)
+static const char * const i2c_sx9310_resolution[] = {
+ [SX9310_COARSEST] = "coarsest",
+ [SX9310_VERY_COARSE] = "very-coarse",
+ [SX9310_COARSE] = "coarse",
+ [SX9310_MEDIUM_COARSE] = "medium-coarse",
+ [SX9310_MEDIUM] = "medium",
+ [SX9310_FINE] = "fine",
+ [SX9310_VERY_FINE] = "very-fine",
+ [SX9310_FINEST] = "finest",
+};
static void i2c_sx9310_fill_ssdt(const struct device *dev)
{
@@ -27,6 +34,7 @@ static void i2c_sx9310_fill_ssdt(const struct device *dev)
.resource = scope,
};
struct acpi_dp *dsd;
+ struct acpi_dp *combined_sensors;
if (!scope || !config)
return;
@@ -56,9 +64,35 @@ static void i2c_sx9310_fill_ssdt(const struct device *dev)
/* DSD */
dsd = acpi_dp_new_table("_DSD");
-#include "registers.h"
- acpi_dp_write(dsd);
+ /*
+ * Format describe in linux kernel documentation. See
+ * https://www.kernel.org/doc/Documentation/devicetree/bindings/iio/proximity/semtech%2Csx9310.yaml
+ */
+ acpi_dp_add_integer(dsd, "semtech,cs0-ground", config->cs0_ground);
+ acpi_dp_add_integer(dsd, "semtech,startup-sensor",
+ config->startup_sensor);
+ acpi_dp_add_integer(dsd, "semtech,proxraw-strength",
+ config->proxraw_strength);
+ acpi_dp_add_integer(dsd, "semtech,avg-pos-strength",
+ config->avg_pos_strength);
+
+ /* Add combined_sensors package */
+ if (config->combined_sensors_count > 0) {
+ combined_sensors = acpi_dp_new_table("semtech,combined-sensors");
+ for (int i = 0;
+ i < config->combined_sensors_count &&
+ i < MAX_COMBINED_SENSORS_ENTRIES; ++i) {
+ acpi_dp_add_integer(combined_sensors, NULL,
+ config->combined_sensors[i]);
+ }
+ acpi_dp_add_array(dsd, combined_sensors);
+ }
+ if (config->resolution && config->resolution < ARRAY_SIZE(i2c_sx9310_resolution))
+ acpi_dp_add_string(dsd, "semtech,resolution",
+ i2c_sx9310_resolution[config->resolution]);
+
+ acpi_dp_write(dsd);
acpigen_pop_len(); /* Device */
acpigen_pop_len(); /* Scope */
@@ -66,8 +100,6 @@ static void i2c_sx9310_fill_ssdt(const struct device *dev)
config->desc ? : dev->chip_ops->name, dev_path(dev));
}
-#undef REGISTER
-
static const char *i2c_sx9310_acpi_name(const struct device *dev)
{
static char name[5];