aboutsummaryrefslogtreecommitdiff
path: root/src/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers')
-rw-r--r--src/drivers/i2c/sx9310/chip.h44
-rw-r--r--src/drivers/i2c/sx9310/registers.h29
-rw-r--r--src/drivers/i2c/sx9310/sx9310.c46
3 files changed, 79 insertions, 40 deletions
diff --git a/src/drivers/i2c/sx9310/chip.h b/src/drivers/i2c/sx9310/chip.h
index 96690e32b4..3dcbcc4c15 100644
--- a/src/drivers/i2c/sx9310/chip.h
+++ b/src/drivers/i2c/sx9310/chip.h
@@ -6,7 +6,18 @@
#include <acpi/acpi_device.h>
#include <device/i2c_simple.h>
-#define REGISTER(NAME) uint8_t NAME
+#define MAX_COMBINED_SENSORS_ENTRIES 4
+
+enum sx9310_resolution {
+ SX9310_COARSEST = 1,
+ SX9310_VERY_COARSE,
+ SX9310_COARSE,
+ SX9310_MEDIUM_COARSE,
+ SX9310_MEDIUM,
+ SX9310_FINE,
+ SX9310_VERY_FINE,
+ SX9310_FINEST,
+};
struct drivers_i2c_sx9310_config {
/* Device Description */
@@ -23,9 +34,34 @@ struct drivers_i2c_sx9310_config {
/* IO-APIC interrupt */
struct acpi_irq irq;
-#include "registers.h"
-};
-#undef REGISTER
+ /*
+ * Registers definition in the kernel source tree at:
+ * Documentation/devicetree/bindings/iio/proximity/semtech,sx9310.yaml
+ */
+
+ /* When true, cs0 is the ground. 0 [default] is false. */
+ uint32_t cs0_ground;
+
+ /* Sensor used for start-up proximity detection: Default 0. */
+ uint32_t startup_sensor;
+
+ /* Raw Proximity filter strength: When not set, disabled. */
+ uint32_t proxraw_strength;
+
+ /* Average Proximity filter strength: When not set, disabled. */
+ uint32_t avg_pos_strength;
+
+ /*
+ * List of which sensors are combined and represented by CS3.
+ * Could be standalone (3) or combination of 0, 1, 2, 3.
+ * Driver default: CS0 + CS1.
+ */
+ uint32_t combined_sensors_count;
+ uint32_t combined_sensors[MAX_COMBINED_SENSORS_ENTRIES];
+
+ /* Capacitance measure resolution. Driver default: "finest". */
+ enum sx9310_resolution resolution;
+};
#endif /* __DRIVERS_I2C_SX9310_CHIP_H__ */
diff --git a/src/drivers/i2c/sx9310/registers.h b/src/drivers/i2c/sx9310/registers.h
deleted file mode 100644
index 4744ae4c67..0000000000
--- a/src/drivers/i2c/sx9310/registers.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-
-#ifndef REGISTER
-#error "define REGISTER(NAME) before including this file"
-#endif
-
-REGISTER(reg_prox_ctrl0);
-REGISTER(reg_prox_ctrl1);
-REGISTER(reg_prox_ctrl2);
-REGISTER(reg_prox_ctrl3);
-REGISTER(reg_prox_ctrl4);
-REGISTER(reg_prox_ctrl5);
-REGISTER(reg_prox_ctrl6);
-REGISTER(reg_prox_ctrl7);
-REGISTER(reg_prox_ctrl8);
-REGISTER(reg_prox_ctrl9);
-REGISTER(reg_prox_ctrl10);
-REGISTER(reg_prox_ctrl11);
-REGISTER(reg_prox_ctrl12);
-REGISTER(reg_prox_ctrl13);
-REGISTER(reg_prox_ctrl14);
-REGISTER(reg_prox_ctrl15);
-REGISTER(reg_prox_ctrl16);
-REGISTER(reg_prox_ctrl17);
-REGISTER(reg_prox_ctrl18);
-REGISTER(reg_prox_ctrl19);
-REGISTER(reg_sar_ctrl0);
-REGISTER(reg_sar_ctrl1);
-REGISTER(reg_sar_ctrl2);
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];