* [PATCH v5 1/3] dt-bindings:iio:proximity:new vendor prefix: tyhx
[not found] <20240616-add-tyhx-hx9023s-sensor-driver-v5-0-ebaf280bbf0e@outlook.com>
@ 2024-06-16 7:36 ` Yasin Lee
2024-06-16 7:43 ` Krzysztof Kozlowski
2024-06-16 7:36 ` [PATCH v5 2/3] dt-bindings:iio:proximity: Add hx9023s binding Yasin Lee
2024-06-16 7:36 ` [PATCH v5 3/3] iio:proximity:hx9023s: Add TYHX HX9023S sensor driver Yasin Lee
2 siblings, 1 reply; 12+ messages in thread
From: Yasin Lee @ 2024-06-16 7:36 UTC (permalink / raw)
To: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Jonathan Cameron,
Lars-Peter Clausen
Cc: devicetree, linux-kernel, linux-iio, Yasin Lee
From: Yasin Lee <yasin.lee.x@gmail.com>
Add NanjingTianyihexin Electronics Ltd.
Signed-off-by: Yasin Lee <yasin.lee.x@gmail.com>
---
Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++
1 file changed, 2 insertions(+)
diff --git a/Documentation/devicetree/bindings/vendor-prefixes.yaml b/Documentation/devicetree/bindings/vendor-prefixes.yaml
index fbf47f0bacf1..989242da4f44 100644
--- a/Documentation/devicetree/bindings/vendor-prefixes.yaml
+++ b/Documentation/devicetree/bindings/vendor-prefixes.yaml
@@ -1515,6 +1515,8 @@ patternProperties:
description: Turing Machines, Inc.
"^tyan,.*":
description: Tyan Computer Corporation
+ "^tyhx,.*":
+ description: NanjingTianyihexin Electronics Ltd.
"^u-blox,.*":
description: u-blox
"^u-boot,.*":
--
2.25.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v5 2/3] dt-bindings:iio:proximity: Add hx9023s binding
[not found] <20240616-add-tyhx-hx9023s-sensor-driver-v5-0-ebaf280bbf0e@outlook.com>
2024-06-16 7:36 ` [PATCH v5 1/3] dt-bindings:iio:proximity:new vendor prefix: tyhx Yasin Lee
@ 2024-06-16 7:36 ` Yasin Lee
2024-06-16 7:42 ` Krzysztof Kozlowski
2024-06-16 8:40 ` Rob Herring (Arm)
2024-06-16 7:36 ` [PATCH v5 3/3] iio:proximity:hx9023s: Add TYHX HX9023S sensor driver Yasin Lee
2 siblings, 2 replies; 12+ messages in thread
From: Yasin Lee @ 2024-06-16 7:36 UTC (permalink / raw)
To: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Jonathan Cameron,
Lars-Peter Clausen
Cc: devicetree, linux-kernel, linux-iio, Yasin Lee
From: Yasin Lee <yasin.lee.x@gmail.com>
A capacitive proximity sensor
Signed-off-by: Yasin Lee <yasin.lee.x@gmail.com>
---
.../bindings/iio/proximity/tyhx,hx9023s.yaml | 98 ++++++++++++++++++++++
1 file changed, 98 insertions(+)
diff --git a/Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.yaml b/Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.yaml
new file mode 100644
index 000000000000..e012290f055b
--- /dev/null
+++ b/Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.yaml
@@ -0,0 +1,98 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/iio/proximity/tyhx,hx9023s.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: TYHX HX9023S capacitive proximity sensor
+
+maintainers:
+ - Yasin Lee <yasin.lee.x@gmail.com>
+
+description: |
+ TYHX HX9023S proximity sensor. Datasheet can be found here:
+ http://www.tianyihexin.com/ueditor/php/upload/file/20240614/1718336303992081.pdf
+
+allOf:
+ - $ref: /schemas/iio/iio.yaml#
+
+properties:
+ compatible:
+ const: tyhx,hx9023s
+
+ reg:
+ maxItems: 1
+
+ interrupts:
+ description: |
+ Generated by device to announce preceding read request has finished
+ and data is available or that a close/far proximity event has happened.
+ maxItems: 1
+
+ vdd-supply: true
+
+patternProperties:
+ "^channel@[0-4]$":
+ $ref: adc.yaml
+ type: object
+
+ properties:
+ reg:
+ minimum: 0
+ maximum: 4
+ description: The channel number.
+
+ input-channel:
+ $ref: /schemas/types.yaml#/definitions/uint32
+ minimum: 0
+ maximum: 4
+ description: |
+ Specify the input pin used in single-ended configuration.
+
+ diff-channels: true
+
+ required:
+ - reg
+
+ additionalProperties: false
+
+required:
+ - compatible
+ - reg
+
+unevaluatedProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/interrupt-controller/irq.h>
+ i2c {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ proximity@2a {
+ compatible = "tyhx,hx9023s";
+ reg = <0x2a>;
+ interrupt-parent = <&pio>;
+ interrupts = <16 IRQ_TYPE_EDGE_FALLING>;
+ vdd-supply = <&pp1800_prox>;
+ channel@0 {
+ reg = <0>;
+ input-channel = <0>;
+ };
+ channel@1 {
+ reg = <1>;
+ input-channel = <1>;
+ };
+ channel@2 {
+ reg = <2>;
+ input-channel = <2>;
+ };
+ channel@3 {
+ reg = <3>;
+ diff-channels = <1 0>;
+ };
+ channel@4 {
+ reg = <4>;
+ diff-channels = <2 0>;
+ };
+ };
+ };
--
2.25.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v5 3/3] iio:proximity:hx9023s: Add TYHX HX9023S sensor driver
[not found] <20240616-add-tyhx-hx9023s-sensor-driver-v5-0-ebaf280bbf0e@outlook.com>
2024-06-16 7:36 ` [PATCH v5 1/3] dt-bindings:iio:proximity:new vendor prefix: tyhx Yasin Lee
2024-06-16 7:36 ` [PATCH v5 2/3] dt-bindings:iio:proximity: Add hx9023s binding Yasin Lee
@ 2024-06-16 7:36 ` Yasin Lee
2024-06-17 11:34 ` kernel test robot
2 siblings, 1 reply; 12+ messages in thread
From: Yasin Lee @ 2024-06-16 7:36 UTC (permalink / raw)
To: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Jonathan Cameron,
Lars-Peter Clausen
Cc: devicetree, linux-kernel, linux-iio, Yasin Lee
From: Yasin Lee <yasin.lee.x@gmail.com>
A SAR sensor from NanjingTianyihexin Electronics Ltd.
The device has the following entry points:
Usual frequency:
- sampling_frequency
Instant reading of current values for different sensors:
- in_proximity0_raw
- in_proximity1_raw
- in_proximity2_raw
- in_proximity3_raw
- in_proximity4_raw
and associated events in events/
Signed-off-by: Yasin Lee <yasin.lee.x@gmail.com>
---
drivers/iio/proximity/Kconfig | 14 +
drivers/iio/proximity/Makefile | 1 +
drivers/iio/proximity/hx9023s.c | 1149 +++++++++++++++++++++++++++++++++++++++
3 files changed, 1164 insertions(+)
diff --git a/drivers/iio/proximity/Kconfig b/drivers/iio/proximity/Kconfig
index 2ca3b0bc5eba..0694f625b432 100644
--- a/drivers/iio/proximity/Kconfig
+++ b/drivers/iio/proximity/Kconfig
@@ -32,6 +32,20 @@ config CROS_EC_MKBP_PROXIMITY
To compile this driver as a module, choose M here: the
module will be called cros_ec_mkbp_proximity.
+config HX9023S
+ tristate "TYHX HX9023S SAR sensor"
+ select IIO_BUFFER
+ select IIO_TRIGGERED_BUFFER
+ select REGMAP_I2C
+ depends on I2C
+ help
+ Say Y here to build a driver for TYHX HX9023S capacitive SAR sensor.
+ This driver supports the TYHX HX9023S capacitive
+ SAR sensors. This sensors is used for proximity detection applications.
+
+ To compile this driver as a module, choose M here: the
+ module will be called hx9023s.
+
config IRSD200
tristate "Murata IRS-D200 PIR sensor"
select IIO_BUFFER
diff --git a/drivers/iio/proximity/Makefile b/drivers/iio/proximity/Makefile
index f36598380446..ab381cd27dbb 100644
--- a/drivers/iio/proximity/Makefile
+++ b/drivers/iio/proximity/Makefile
@@ -6,6 +6,7 @@
# When adding new entries keep the list in alphabetical order
obj-$(CONFIG_AS3935) += as3935.o
obj-$(CONFIG_CROS_EC_MKBP_PROXIMITY) += cros_ec_mkbp_proximity.o
+obj-$(CONFIG_HX9023S) += hx9023s.o
obj-$(CONFIG_IRSD200) += irsd200.o
obj-$(CONFIG_ISL29501) += isl29501.o
obj-$(CONFIG_LIDAR_LITE_V2) += pulsedlight-lidar-lite-v2.o
diff --git a/drivers/iio/proximity/hx9023s.c b/drivers/iio/proximity/hx9023s.c
new file mode 100644
index 000000000000..2d2d6a734de6
--- /dev/null
+++ b/drivers/iio/proximity/hx9023s.c
@@ -0,0 +1,1149 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2024 NanjingTianyihexin Electronics Ltd.
+ * http://www.tianyihexin.com
+ *
+ * Driver for NanjingTianyihexin HX9023S Cap Sensor.
+ * Datasheet available at:
+ * http://www.tianyihexin.com/ueditor/php/upload/file/20240614/1718336303992081.pdf
+ */
+
+#include <linux/array_size.h>
+#include <linux/bitfield.h>
+#include <linux/bitops.h>
+#include <linux/delay.h>
+#include <linux/device.h>
+#include <linux/errno.h>
+#include <linux/i2c.h>
+#include <linux/interrupt.h>
+#include <linux/irqreturn.h>
+#include <linux/math.h>
+#include <linux/mod_devicetable.h>
+#include <linux/module.h>
+#include <linux/mutex.h>
+#include <linux/pm.h>
+#include <linux/property.h>
+#include <linux/regmap.h>
+#include <linux/regulator/consumer.h>
+#include <linux/types.h>
+#include <linux/units.h>
+
+#include <asm/byteorder.h>
+#include <asm/unaligned.h>
+
+#include <linux/iio/buffer.h>
+#include <linux/iio/events.h>
+#include <linux/iio/iio.h>
+#include <linux/iio/trigger.h>
+#include <linux/iio/triggered_buffer.h>
+#include <linux/iio/trigger_consumer.h>
+#include <linux/iio/types.h>
+
+#define HX9023S_CHIP_ID 0x1D
+#define HX9023S_CH_NUM 5
+#define HX9023S_2BYTES 2
+#define HX9023S_3BYTES 3
+#define HX9023S_BYTES_MAX HX9023S_3BYTES
+#define HX9023S_POS 0x03
+#define HX9023S_NEG 0x02
+#define HX9023S_NOT_CONNECTED 16
+
+#define HX9023S_GLOBAL_CTRL0 0x00
+#define HX9023S_PRF_CFG 0x02
+#define HX9023S_CH0_CFG_7_0 0x03
+#define HX9023S_CH4_CFG_9_8 0x0C
+#define HX9023S_RANGE_7_0 0x0D
+#define HX9023S_RANGE_9_8 0x0E
+#define HX9023S_RANGE_18_16 0x0F
+#define HX9023S_AVG0_NOSR0_CFG 0x10
+#define HX9023S_NOSR12_CFG 0x11
+#define HX9023S_NOSR34_CFG 0x12
+#define HX9023S_AVG12_CFG 0x13
+#define HX9023S_AVG34_CFG 0x14
+#define HX9023S_OFFSET_DAC0_7_0 0x15
+#define HX9023S_OFFSET_DAC4_9_8 0x1E
+#define HX9023S_SAMPLE_NUM_7_0 0x1F
+#define HX9023S_INTEGRATION_NUM_7_0 0x21
+#define HX9023S_CH_NUM_CFG 0x24
+#define HX9023S_LP_ALP_4_CFG 0x29
+#define HX9023S_LP_ALP_1_0_CFG 0x2A
+#define HX9023S_LP_ALP_3_2_CFG 0x2B
+#define HX9023S_UP_ALP_1_0_CFG 0x2C
+#define HX9023S_UP_ALP_3_2_CFG 0x2D
+#define HX9023S_DN_UP_ALP_0_4_CFG 0x2E
+#define HX9023S_DN_ALP_2_1_CFG 0x2F
+#define HX9023S_DN_ALP_4_3_CFG 0x30
+#define HX9023S_RAW_BL_RD_CFG 0x38
+#define HX9023S_INTERRUPT_CFG 0x39
+#define HX9023S_INTERRUPT_CFG1 0x3A
+#define HX9023S_CALI_DIFF_CFG 0x3B
+#define HX9023S_DITHER_CFG 0x3C
+#define HX9023S_DEVICE_ID 0x60
+#define HX9023S_PROX_STATUS 0x6B
+#define HX9023S_PROX_INT_HIGH_CFG 0x6C
+#define HX9023S_PROX_INT_LOW_CFG 0x6D
+#define HX9023S_PROX_HIGH_DIFF_CFG_CH0_0 0x80
+#define HX9023S_PROX_LOW_DIFF_CFG_CH0_0 0x88
+#define HX9023S_PROX_LOW_DIFF_CFG_CH3_1 0x8F
+#define HX9023S_PROX_HIGH_DIFF_CFG_CH4_0 0x9E
+#define HX9023S_PROX_HIGH_DIFF_CFG_CH4_1 0x9F
+#define HX9023S_PROX_LOW_DIFF_CFG_CH4_0 0xA2
+#define HX9023S_PROX_LOW_DIFF_CFG_CH4_1 0xA3
+#define HX9023S_CAP_INI_CH4_0 0xB3
+#define HX9023S_LP_DIFF_CH4_2 0xBA
+#define HX9023S_RAW_BL_CH4_0 0xB5
+#define HX9023S_LP_DIFF_CH4_0 0xB8
+#define HX9023S_DSP_CONFIG_CTRL1 0xC8
+#define HX9023S_CAP_INI_CH0_0 0xE0
+#define HX9023S_RAW_BL_CH0_0 0xE8
+#define HX9023S_LP_DIFF_CH0_0 0xF4
+#define HX9023S_LP_DIFF_CH3_2 0xFF
+
+#define HX9023S_DATA_LOCK_MASK BIT(4)
+#define HX9023S_INTERRUPT_MASK GENMASK(9, 0)
+#define HX9023S_PROX_DEBOUNCE_MASK GENMASK(3, 0)
+
+struct hx9023s_addr_val_pair {
+ u8 addr;
+ u8 val;
+};
+
+struct hx9023s_ch_data {
+ int raw; /* Raw Data*/
+ int lp; /* Low Pass Filter Data*/
+ int bl; /* Base Line Data */
+ int diff; /* difference of Low Pass Data and Base Line Data */
+
+ struct {
+ unsigned int near;
+ unsigned int far;
+ } thres;
+
+ u16 dac;
+ u8 channel_positive;
+ u8 channel_negative;
+ bool sel_bl;
+ bool sel_raw;
+ bool sel_diff;
+ bool sel_lp;
+ bool enable;
+};
+
+struct hx9023s_data {
+ struct iio_trigger *trig;
+ struct regmap *regmap;
+ unsigned long chan_prox_stat;
+ unsigned long chan_read;
+ unsigned long chan_event;
+ unsigned long ch_en_stat;
+ unsigned long chan_in_use;
+ unsigned int prox_state_reg;
+ bool trigger_enabled;
+
+ struct {
+ __be16 channels[HX9023S_CH_NUM];
+ s64 ts __aligned(8);
+ } buffer;
+
+ struct mutex mutex;
+ struct hx9023s_ch_data ch_data[HX9023S_CH_NUM];
+};
+
+static struct hx9023s_addr_val_pair hx9023s_reg_init_list[] = {
+ /* scan period */
+ { HX9023S_PRF_CFG, 0x17 },
+
+ /* full scale of conversion phase of each channel */
+ { HX9023S_RANGE_7_0, 0x11 },
+ { HX9023S_RANGE_9_8, 0x02 },
+ { HX9023S_RANGE_18_16, 0x00 },
+
+ /* ADC average number and OSR number of each channel */
+ { HX9023S_AVG0_NOSR0_CFG, 0x71 },
+ { HX9023S_NOSR12_CFG, 0x44 },
+ { HX9023S_NOSR34_CFG, 0x00 },
+ { HX9023S_AVG12_CFG, 0x33 },
+ { HX9023S_AVG34_CFG, 0x00 },
+
+ /* sample & integration frequency of the ADC */
+ { HX9023S_SAMPLE_NUM_7_0, 0x65 },
+ { HX9023S_INTEGRATION_NUM_7_0, 0x65 },
+
+ /* coefficient of the first order low pass filter during each channel */
+ { HX9023S_LP_ALP_1_0_CFG, 0x22 },
+ { HX9023S_LP_ALP_3_2_CFG, 0x22 },
+ { HX9023S_LP_ALP_4_CFG, 0x02 },
+
+ /* up coefficient of the first order low pass filter during each channel */
+ { HX9023S_UP_ALP_1_0_CFG, 0x88 },
+ { HX9023S_UP_ALP_3_2_CFG, 0x88 },
+ { HX9023S_DN_UP_ALP_0_4_CFG, 0x18 },
+
+ /* down coefficient of the first order low pass filter during each channel */
+ { HX9023S_DN_ALP_2_1_CFG, 0x11 },
+ { HX9023S_DN_ALP_4_3_CFG, 0x11 },
+
+ /* data select for the Data Mux Register for output data */
+ { HX9023S_RAW_BL_RD_CFG, 0xF0 },
+
+ /* enable the interrupt function */
+ { HX9023S_INTERRUPT_CFG, 0xFF },
+ { HX9023S_INTERRUPT_CFG1, 0x3B },
+ { HX9023S_DITHER_CFG, 0x21 },
+
+ /* threshold of the offset compensation */
+ { HX9023S_CALI_DIFF_CFG, 0x07 },
+
+ /* proximity persistency number(near & far) */
+ { HX9023S_PROX_INT_HIGH_CFG, 0x01 },
+ { HX9023S_PROX_INT_LOW_CFG, 0x01 },
+
+ /* disable the data lock */
+ { HX9023S_DSP_CONFIG_CTRL1, 0x00 },
+};
+
+static const struct iio_event_spec hx9023s_events[] = {
+ {
+ .type = IIO_EV_TYPE_THRESH,
+ .dir = IIO_EV_DIR_RISING,
+ .mask_shared_by_all = BIT(IIO_EV_INFO_PERIOD),
+ .mask_separate = BIT(IIO_EV_INFO_VALUE),
+ },
+ {
+ .type = IIO_EV_TYPE_THRESH,
+ .dir = IIO_EV_DIR_FALLING,
+ .mask_shared_by_all = BIT(IIO_EV_INFO_PERIOD),
+ .mask_separate = BIT(IIO_EV_INFO_VALUE),
+
+ },
+ {
+ .type = IIO_EV_TYPE_THRESH,
+ .dir = IIO_EV_DIR_EITHER,
+ .mask_separate = BIT(IIO_EV_INFO_ENABLE),
+ },
+};
+
+#define HX9023S_CHANNEL(idx) \
+{ \
+ .type = IIO_PROXIMITY, \
+ .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
+ .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),\
+ .indexed = 1, \
+ .channel = idx, \
+ .address = 0, \
+ .event_spec = hx9023s_events, \
+ .num_event_specs = ARRAY_SIZE(hx9023s_events), \
+ .scan_index = idx, \
+ .scan_type = { \
+ .sign = 's', \
+ .realbits = 16, \
+ .storagebits = 16, \
+ .endianness = IIO_BE, \
+ }, \
+}
+
+static const struct iio_chan_spec hx9023s_channels[] = {
+ HX9023S_CHANNEL(0),
+ HX9023S_CHANNEL(1),
+ HX9023S_CHANNEL(2),
+ HX9023S_CHANNEL(3),
+ HX9023S_CHANNEL(4),
+ IIO_CHAN_SOFT_TIMESTAMP(5),
+};
+
+static const unsigned int hx9023s_samp_freq_table[] = {
+ 2, 2, 4, 6, 8, 10, 14, 18, 22, 26,
+ 30, 34, 38, 42, 46, 50, 56, 62, 68, 74,
+ 80, 90, 100, 200, 300, 400, 600, 800, 1000, 2000,
+ 3000, 4000,
+};
+
+static const struct regmap_range hx9023s_rd_reg_ranges[] = {
+ regmap_reg_range(HX9023S_GLOBAL_CTRL0, HX9023S_LP_DIFF_CH3_2),
+};
+
+static const struct regmap_range hx9023s_wr_reg_ranges[] = {
+ regmap_reg_range(HX9023S_GLOBAL_CTRL0, HX9023S_LP_DIFF_CH3_2),
+};
+
+static const struct regmap_range hx9023s_volatile_reg_ranges[] = {
+ regmap_reg_range(HX9023S_CAP_INI_CH4_0, HX9023S_LP_DIFF_CH4_2),
+ regmap_reg_range(HX9023S_CAP_INI_CH0_0, HX9023S_LP_DIFF_CH3_2),
+ regmap_reg_range(HX9023S_PROX_STATUS, HX9023S_PROX_STATUS),
+};
+
+static const struct regmap_access_table hx9023s_rd_regs = {
+ .yes_ranges = hx9023s_rd_reg_ranges,
+ .n_yes_ranges = ARRAY_SIZE(hx9023s_rd_reg_ranges),
+};
+
+static const struct regmap_access_table hx9023s_wr_regs = {
+ .yes_ranges = hx9023s_wr_reg_ranges,
+ .n_yes_ranges = ARRAY_SIZE(hx9023s_wr_reg_ranges),
+};
+
+static const struct regmap_access_table hx9023s_volatile_regs = {
+ .yes_ranges = hx9023s_volatile_reg_ranges,
+ .n_yes_ranges = ARRAY_SIZE(hx9023s_volatile_reg_ranges),
+};
+
+static const struct regmap_config hx9023s_regmap_config = {
+ .reg_bits = 8,
+ .val_bits = 8,
+ .cache_type = REGCACHE_MAPLE,
+ .rd_table = &hx9023s_rd_regs,
+ .wr_table = &hx9023s_wr_regs,
+ .volatile_table = &hx9023s_volatile_regs,
+};
+
+static int hx9023s_interrupt_enable(struct hx9023s_data *data)
+{
+ return regmap_update_bits(data->regmap, HX9023S_INTERRUPT_CFG,
+ HX9023S_INTERRUPT_MASK, HX9023S_INTERRUPT_MASK);
+}
+
+static int hx9023s_interrupt_disable(struct hx9023s_data *data)
+{
+ return regmap_update_bits(data->regmap, HX9023S_INTERRUPT_CFG,
+ HX9023S_INTERRUPT_MASK, 0x00);
+}
+
+static int hx9023s_data_lock(struct hx9023s_data *data, bool locked)
+{
+ if (locked)
+ return regmap_update_bits(data->regmap, HX9023S_DSP_CONFIG_CTRL1,
+ HX9023S_DATA_LOCK_MASK, HX9023S_DATA_LOCK_MASK);
+ else
+ return regmap_update_bits(data->regmap, HX9023S_DSP_CONFIG_CTRL1,
+ HX9023S_DATA_LOCK_MASK, 0);
+}
+
+static int hx9023s_ch_cfg(struct hx9023s_data *data)
+{
+ unsigned int i;
+ u16 reg;
+ u8 reg_list[HX9023S_CH_NUM * 2];
+ u8 ch_pos[HX9023S_CH_NUM];
+ u8 ch_neg[HX9023S_CH_NUM];
+ /* Bit positions corresponding to input pin connections */
+ u8 conn_cs[HX9023S_CH_NUM] = {0, 2, 4, 6, 8};
+
+ for (i = 0; i < HX9023S_CH_NUM; i++) {
+ ch_pos[i] = data->ch_data[i].channel_positive == HX9023S_NOT_CONNECTED ?
+ HX9023S_NOT_CONNECTED : conn_cs[data->ch_data[i].channel_positive];
+ ch_neg[i] = data->ch_data[i].channel_negative == HX9023S_NOT_CONNECTED ?
+ HX9023S_NOT_CONNECTED : conn_cs[data->ch_data[i].channel_negative];
+
+ reg = (HX9023S_POS << ch_pos[i]) | (HX9023S_NEG << ch_neg[i]);
+ put_unaligned_le16(reg, ®_list[i * 2]);
+ }
+
+ return regmap_bulk_write(data->regmap, HX9023S_CH0_CFG_7_0, reg_list, HX9023S_CH_NUM * 2);
+}
+
+static int hx9023s_reg_init(struct hx9023s_data *data)
+{
+ unsigned int i = 0;
+ int ret;
+
+ for (i = 0; i < (int)ARRAY_SIZE(hx9023s_reg_init_list); i++) {
+ ret = regmap_write(data->regmap, hx9023s_reg_init_list[i].addr,
+ hx9023s_reg_init_list[i].val);
+ if (ret)
+ return ret;
+ }
+
+ return 0;
+}
+
+static int hx9023s_write_far_debounce(struct hx9023s_data *data, int val)
+{
+ guard(mutex)(&data->mutex);
+ return regmap_update_bits(data->regmap, HX9023S_PROX_INT_LOW_CFG,
+ HX9023S_PROX_DEBOUNCE_MASK,
+ FIELD_GET(HX9023S_PROX_DEBOUNCE_MASK, val));
+}
+
+static int hx9023s_write_near_debounce(struct hx9023s_data *data, int val)
+{
+ guard(mutex)(&data->mutex);
+ return regmap_update_bits(data->regmap, HX9023S_PROX_INT_HIGH_CFG,
+ HX9023S_PROX_DEBOUNCE_MASK,
+ FIELD_GET(HX9023S_PROX_DEBOUNCE_MASK, val));
+}
+
+static int hx9023s_read_far_debounce(struct hx9023s_data *data, int *val)
+{
+ int ret;
+
+ ret = regmap_read(data->regmap, HX9023S_PROX_INT_LOW_CFG, val);
+ if (ret)
+ return ret;
+
+ *val = FIELD_GET(HX9023S_PROX_DEBOUNCE_MASK, *val);
+
+ return IIO_VAL_INT;
+}
+
+static int hx9023s_read_near_debounce(struct hx9023s_data *data, int *val)
+{
+ int ret;
+
+ ret = regmap_read(data->regmap, HX9023S_PROX_INT_HIGH_CFG, val);
+ if (ret)
+ return ret;
+
+ *val = FIELD_GET(HX9023S_PROX_DEBOUNCE_MASK, *val);
+
+ return IIO_VAL_INT;
+}
+
+static int hx9023s_get_thres_near(struct hx9023s_data *data, u8 ch, int *val)
+{
+ int ret;
+ u8 buf[2];
+ unsigned int reg, tmp;
+
+ reg = (ch == 4) ? HX9023S_PROX_HIGH_DIFF_CFG_CH4_0 :
+ HX9023S_PROX_HIGH_DIFF_CFG_CH0_0 + (ch * HX9023S_2BYTES);
+
+ ret = regmap_bulk_read(data->regmap, reg, buf, sizeof(buf));
+ if (ret)
+ return ret;
+
+ tmp = (get_unaligned_le16(buf) & GENMASK(9, 0)) * 32;
+ data->ch_data[ch].thres.near = tmp;
+ *val = tmp;
+
+ return IIO_VAL_INT;
+}
+
+static int hx9023s_get_thres_far(struct hx9023s_data *data, u8 ch, int *val)
+{
+ int ret;
+ u8 buf[2];
+ unsigned int reg, tmp;
+
+ reg = (ch == 4) ? HX9023S_PROX_LOW_DIFF_CFG_CH4_0 :
+ HX9023S_PROX_LOW_DIFF_CFG_CH0_0 + (ch * HX9023S_2BYTES);
+
+ ret = regmap_bulk_read(data->regmap, reg, buf, sizeof(buf));
+ if (ret)
+ return ret;
+
+ tmp = (get_unaligned_le16(buf) & GENMASK(9, 0)) * 32;
+ data->ch_data[ch].thres.far = tmp;
+ *val = tmp;
+
+ return IIO_VAL_INT;
+}
+
+static int hx9023s_set_thres_near(struct hx9023s_data *data, u8 ch, int val)
+{
+ __le16 val_le16 = cpu_to_le16((val / 32) & GENMASK(9, 0));
+ unsigned int reg;
+
+ data->ch_data[ch].thres.near = ((val / 32) & GENMASK(9, 0)) * 32;
+ reg = (ch == 4) ? HX9023S_PROX_HIGH_DIFF_CFG_CH4_0 :
+ HX9023S_PROX_HIGH_DIFF_CFG_CH0_0 + (ch * HX9023S_2BYTES);
+
+ return regmap_bulk_write(data->regmap, reg, &val_le16, sizeof(val_le16));
+}
+
+static int hx9023s_set_thres_far(struct hx9023s_data *data, u8 ch, int val)
+{
+ __le16 val_le16 = cpu_to_le16((val / 32) & GENMASK(9, 0));
+ unsigned int reg;
+
+ data->ch_data[ch].thres.far = ((val / 32) & GENMASK(9, 0)) * 32;
+ reg = (ch == 4) ? HX9023S_PROX_LOW_DIFF_CFG_CH4_0 :
+ HX9023S_PROX_LOW_DIFF_CFG_CH0_0 + (ch * HX9023S_2BYTES);
+
+ return regmap_bulk_write(data->regmap, reg, &val_le16, sizeof(val_le16));
+}
+
+static int hx9023s_get_prox_state(struct hx9023s_data *data)
+{
+ return regmap_read(data->regmap, HX9023S_PROX_STATUS, &data->prox_state_reg);
+}
+
+static int hx9023s_data_select(struct hx9023s_data *data)
+{
+ int ret;
+ unsigned int i, buf;
+ unsigned long tmp;
+
+ ret = regmap_read(data->regmap, HX9023S_RAW_BL_RD_CFG, &buf);
+ if (ret)
+ return ret;
+
+ tmp = buf;
+ for (i = 0; i < 4; i++) {
+ data->ch_data[i].sel_diff = test_bit(i, &tmp);
+ data->ch_data[i].sel_lp = !data->ch_data[i].sel_diff;
+ data->ch_data[i].sel_bl = test_bit(i + 4, &tmp);
+ data->ch_data[i].sel_raw = !data->ch_data[i].sel_bl;
+ }
+
+ ret = regmap_read(data->regmap, HX9023S_INTERRUPT_CFG1, &buf);
+ if (ret)
+ return ret;
+
+ tmp = buf;
+ data->ch_data[4].sel_diff = test_bit(2, &tmp);
+ data->ch_data[4].sel_lp = !data->ch_data[4].sel_diff;
+ data->ch_data[4].sel_bl = test_bit(3, &tmp);
+ data->ch_data[4].sel_raw = !data->ch_data[4].sel_bl;
+
+ return 0;
+}
+
+static int hx9023s_sample(struct hx9023s_data *data)
+{
+ int ret, value;
+ unsigned int i;
+ u8 data_size, offset_data_size, *p, size, rx_buf[HX9023S_CH_NUM * HX9023S_BYTES_MAX];
+
+ ret = hx9023s_data_lock(data, true);
+ if (ret)
+ return ret;
+
+ ret = hx9023s_data_select(data);
+ if (ret)
+ return ret;
+
+ data_size = HX9023S_3BYTES;
+
+ /* ch0~ch3 */
+ p = rx_buf;
+ size = (HX9023S_CH_NUM - 1) * data_size;
+ ret = regmap_bulk_read(data->regmap, HX9023S_RAW_BL_CH0_0, p, size);
+ if (ret)
+ return ret;
+
+ /* ch4 */
+ p = rx_buf + size;
+ size = data_size;
+ ret = regmap_bulk_read(data->regmap, HX9023S_RAW_BL_CH4_0, p, size);
+ if (ret)
+ return ret;
+
+ for (i = 0; i < HX9023S_CH_NUM; i++) {
+ value = get_unaligned_le16(&rx_buf[i * data_size + 1]);
+ value = sign_extend32(value, 15);
+ data->ch_data[i].raw = 0;
+ data->ch_data[i].bl = 0;
+ if (data->ch_data[i].sel_raw == true)
+ data->ch_data[i].raw = value;
+ if (data->ch_data[i].sel_bl == true)
+ data->ch_data[i].bl = value;
+ }
+
+ /* ch0~ch3 */
+ p = rx_buf;
+ size = (HX9023S_CH_NUM - 1) * data_size;
+ ret = regmap_bulk_read(data->regmap, HX9023S_LP_DIFF_CH0_0, p, size);
+ if (ret)
+ return ret;
+
+ /* ch4 */
+ p = rx_buf + size;
+ size = data_size;
+ ret = regmap_bulk_read(data->regmap, HX9023S_LP_DIFF_CH4_0, p, size);
+ if (ret)
+ return ret;
+
+ for (i = 0; i < HX9023S_CH_NUM; i++) {
+ value = get_unaligned_le16(&rx_buf[i * data_size + 1]);
+ value = sign_extend32(value, 15);
+ data->ch_data[i].lp = 0;
+ data->ch_data[i].diff = 0;
+ if (data->ch_data[i].sel_lp == true)
+ data->ch_data[i].lp = value;
+ if (data->ch_data[i].sel_diff == true)
+ data->ch_data[i].diff = value;
+ }
+
+ for (i = 0; i < HX9023S_CH_NUM; i++) {
+ if (data->ch_data[i].sel_lp == true && data->ch_data[i].sel_bl == true)
+ data->ch_data[i].diff = data->ch_data[i].lp - data->ch_data[i].bl;
+ }
+
+ /* offset DAC */
+ offset_data_size = HX9023S_2BYTES;
+ p = rx_buf;
+ size = HX9023S_CH_NUM * offset_data_size;
+ ret = regmap_bulk_read(data->regmap, HX9023S_OFFSET_DAC0_7_0, p, size);
+ if (ret)
+ return ret;
+
+ for (i = 0; i < HX9023S_CH_NUM; i++) {
+ value = get_unaligned_le16(&rx_buf[i * offset_data_size]);
+ value = FIELD_GET(GENMASK(11, 0), value);
+ data->ch_data[i].dac = value;
+ }
+
+ ret = hx9023s_data_lock(data, false);
+ if (ret)
+ return ret;
+
+ return 0;
+}
+
+static int hx9023s_ch_en(struct hx9023s_data *data, u8 ch_id, bool en)
+{
+ int ret;
+ unsigned int buf;
+
+ ret = regmap_read(data->regmap, HX9023S_CH_NUM_CFG, &buf);
+ if (ret)
+ return ret;
+
+ data->ch_en_stat = buf;
+ if (en && data->ch_en_stat == 0)
+ data->prox_state_reg = 0;
+
+ data->ch_data[ch_id].enable = en;
+ __assign_bit(ch_id, &data->ch_en_stat, en);
+
+ return regmap_write(data->regmap, HX9023S_CH_NUM_CFG, data->ch_en_stat);
+}
+
+static int hx9023s_property_get(struct hx9023s_data *data)
+{
+ struct fwnode_handle *child;
+ struct device *dev = regmap_get_device(data->regmap);
+ int ret;
+ u32 i, reg, temp, array[2];
+
+ data->chan_in_use = 0;
+ for (i = 0; i < HX9023S_CH_NUM; i++) {
+ data->ch_data[i].channel_positive = HX9023S_NOT_CONNECTED;
+ data->ch_data[i].channel_negative = HX9023S_NOT_CONNECTED;
+ }
+
+ device_for_each_child_node(dev, child) {
+ ret = fwnode_property_read_u32(child, "reg", ®);
+ if (ret) {
+ fwnode_handle_put(child);
+ return dev_err_probe(dev, ret, "Failed to read reg\n");
+ }
+ __set_bit(reg, &data->chan_in_use);
+
+ if (fwnode_property_read_u32(child, "input-channel", &temp) == 0) {
+ data->ch_data[reg].channel_positive = temp;
+ data->ch_data[reg].channel_negative = HX9023S_NOT_CONNECTED;
+ } else if (fwnode_property_read_u32_array(child, "diff-channels",
+ array, sizeof(array)) == 0) {
+ data->ch_data[reg].channel_positive = array[0];
+ data->ch_data[reg].channel_negative = array[1];
+ } else {
+ fwnode_handle_put(child);
+ return dev_err_probe(dev, ret,
+ "Failed to read channel input for channel %d\n", reg);
+ }
+ }
+
+ return 0;
+}
+
+static int hx9023s_update_chan_en(struct hx9023s_data *data,
+ unsigned long chan_read,
+ unsigned long chan_event)
+{
+ unsigned int i;
+ unsigned long channels = chan_read | chan_event;
+
+ if ((data->chan_read | data->chan_event) != channels) {
+ for_each_set_bit(i, &channels, HX9023S_CH_NUM)
+ hx9023s_ch_en(data, i, test_bit(i, &data->chan_in_use));
+ for_each_clear_bit(i, &channels, HX9023S_CH_NUM)
+ hx9023s_ch_en(data, i, false);
+ }
+
+ data->chan_read = chan_read;
+ data->chan_event = chan_event;
+
+ return 0;
+}
+
+static int hx9023s_get_proximity(struct hx9023s_data *data,
+ const struct iio_chan_spec *chan,
+ int *val)
+{
+ int ret;
+
+ ret = hx9023s_sample(data);
+ if (ret)
+ return ret;
+
+ ret = hx9023s_get_prox_state(data);
+ if (ret)
+ return ret;
+
+ *val = data->ch_data[chan->channel].diff;
+ return IIO_VAL_INT;
+}
+
+static int hx9023s_get_samp_freq(struct hx9023s_data *data, int *val, int *val2)
+{
+ int ret;
+ unsigned int odr, buf;
+
+ ret = regmap_read(data->regmap, HX9023S_PRF_CFG, &buf);
+ if (ret)
+ return ret;
+
+ odr = hx9023s_samp_freq_table[buf];
+
+ *val = 1000 / odr; /* odr in Hz */
+ *val2 = div_u64((1000 % odr) * 1000000ULL, odr); /* odr in micro Hz */
+
+ return IIO_VAL_INT_PLUS_MICRO;
+}
+
+static int hx9023s_read_raw(struct iio_dev *indio_dev, const struct iio_chan_spec *chan,
+ int *val, int *val2, long mask)
+{
+ struct hx9023s_data *data = iio_priv(indio_dev);
+ int ret;
+
+ if (chan->type != IIO_PROXIMITY)
+ return -EINVAL;
+
+ switch (mask) {
+ case IIO_CHAN_INFO_RAW:
+ ret = iio_device_claim_direct_mode(indio_dev);
+ if (ret)
+ return ret;
+
+ ret = hx9023s_get_proximity(data, chan, val);
+ iio_device_release_direct_mode(indio_dev);
+ return ret;
+ case IIO_CHAN_INFO_SAMP_FREQ:
+ return hx9023s_get_samp_freq(data, val, val2);
+ default:
+ return -EINVAL;
+ }
+}
+
+static int hx9023s_set_samp_freq(struct hx9023s_data *data, int val, int val2)
+{
+ struct device *dev = regmap_get_device(data->regmap);
+ unsigned int i, period_ms;
+
+ period_ms = div_u64(1000000000ULL, (val * 1000000ULL + val2));
+
+ for (i = 0; i < ARRAY_SIZE(hx9023s_samp_freq_table); i++) {
+ if (period_ms == hx9023s_samp_freq_table[i])
+ break;
+ }
+ if (i == ARRAY_SIZE(hx9023s_samp_freq_table)) {
+ dev_err(dev, "Period:%dms NOT found!\n", period_ms);
+ return -EINVAL;
+ }
+
+ return regmap_write(data->regmap, HX9023S_PRF_CFG, i);
+}
+
+static int hx9023s_write_raw(struct iio_dev *indio_dev, const struct iio_chan_spec *chan,
+ int val, int val2, long mask)
+{
+ struct hx9023s_data *data = iio_priv(indio_dev);
+
+ if (chan->type != IIO_PROXIMITY)
+ return -EINVAL;
+
+ if (mask != IIO_CHAN_INFO_SAMP_FREQ)
+ return -EINVAL;
+
+ return hx9023s_set_samp_freq(data, val, val2);
+}
+
+static irqreturn_t hx9023s_irq_handler(int irq, void *private)
+{
+ struct iio_dev *indio_dev = private;
+ struct hx9023s_data *data = iio_priv(indio_dev);
+
+ if (data->trigger_enabled)
+ iio_trigger_poll(data->trig);
+
+ return IRQ_WAKE_THREAD;
+}
+
+static void hx9023s_push_events(struct iio_dev *indio_dev)
+{
+ struct hx9023s_data *data = iio_priv(indio_dev);
+ s64 timestamp = iio_get_time_ns(indio_dev);
+ unsigned long prox_changed;
+ unsigned int chan;
+
+ hx9023s_sample(data);
+ hx9023s_get_prox_state(data);
+
+ prox_changed = (data->chan_prox_stat ^ data->prox_state_reg) & data->chan_event;
+ for_each_set_bit(chan, &prox_changed, HX9023S_CH_NUM) {
+ unsigned int dir;
+
+ dir = (data->prox_state_reg & BIT(chan)) ? IIO_EV_DIR_FALLING : IIO_EV_DIR_RISING;
+
+ iio_push_event(indio_dev,
+ IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY, chan, IIO_EV_TYPE_THRESH, dir),
+ timestamp);
+ }
+ data->chan_prox_stat = data->prox_state_reg;
+}
+
+static irqreturn_t hx9023s_irq_thread_handler(int irq, void *private)
+{
+ struct iio_dev *indio_dev = private;
+ struct hx9023s_data *data = iio_priv(indio_dev);
+
+ guard(mutex)(&data->mutex);
+ hx9023s_push_events(indio_dev);
+
+ return IRQ_HANDLED;
+}
+
+static int hx9023s_read_event_val(struct iio_dev *indio_dev,
+ const struct iio_chan_spec *chan,
+ enum iio_event_type type,
+ enum iio_event_direction dir,
+ enum iio_event_info info, int *val, int *val2)
+{
+ struct hx9023s_data *data = iio_priv(indio_dev);
+
+ if (chan->type != IIO_PROXIMITY)
+ return -EINVAL;
+
+ switch (info) {
+ case IIO_EV_INFO_VALUE:
+ switch (dir) {
+ case IIO_EV_DIR_RISING:
+ return hx9023s_get_thres_far(data, chan->channel, val);
+ case IIO_EV_DIR_FALLING:
+ return hx9023s_get_thres_near(data, chan->channel, val);
+ default:
+ return -EINVAL;
+ }
+ case IIO_EV_INFO_PERIOD:
+ switch (dir) {
+ case IIO_EV_DIR_RISING:
+ return hx9023s_read_far_debounce(data, val);
+ case IIO_EV_DIR_FALLING:
+ return hx9023s_read_near_debounce(data, val);
+ default:
+ return -EINVAL;
+ }
+ default:
+ return -EINVAL;
+ }
+}
+
+static int hx9023s_write_event_val(struct iio_dev *indio_dev,
+ const struct iio_chan_spec *chan,
+ enum iio_event_type type,
+ enum iio_event_direction dir,
+ enum iio_event_info info, int val, int val2)
+{
+ struct hx9023s_data *data = iio_priv(indio_dev);
+
+ if (chan->type != IIO_PROXIMITY)
+ return -EINVAL;
+
+ switch (info) {
+ case IIO_EV_INFO_VALUE:
+ switch (dir) {
+ case IIO_EV_DIR_RISING:
+ return hx9023s_set_thres_far(data, chan->channel, val);
+ case IIO_EV_DIR_FALLING:
+ return hx9023s_set_thres_near(data, chan->channel, val);
+ default:
+ return -EINVAL;
+ }
+ case IIO_EV_INFO_PERIOD:
+ switch (dir) {
+ case IIO_EV_DIR_RISING:
+ return hx9023s_write_far_debounce(data, val);
+ case IIO_EV_DIR_FALLING:
+ return hx9023s_write_near_debounce(data, val);
+ default:
+ return -EINVAL;
+ }
+ default:
+ return -EINVAL;
+ }
+}
+
+static int hx9023s_read_event_config(struct iio_dev *indio_dev,
+ const struct iio_chan_spec *chan,
+ enum iio_event_type type,
+ enum iio_event_direction dir)
+{
+ struct hx9023s_data *data = iio_priv(indio_dev);
+
+ return test_bit(chan->channel, &data->chan_event);
+}
+
+static int hx9023s_write_event_config(struct iio_dev *indio_dev,
+ const struct iio_chan_spec *chan,
+ enum iio_event_type type,
+ enum iio_event_direction dir,
+ int state)
+{
+ struct hx9023s_data *data = iio_priv(indio_dev);
+
+ if (test_bit(chan->channel, &data->chan_in_use)) {
+ hx9023s_ch_en(data, chan->channel, !!state);
+ __assign_bit(chan->channel, &data->chan_event, data->ch_data[chan->channel].enable);
+ }
+
+ return 0;
+}
+
+static const struct iio_info hx9023s_info = {
+ .read_raw = hx9023s_read_raw,
+ .write_raw = hx9023s_write_raw,
+ .read_event_value = hx9023s_read_event_val,
+ .write_event_value = hx9023s_write_event_val,
+ .read_event_config = hx9023s_read_event_config,
+ .write_event_config = hx9023s_write_event_config,
+};
+
+static int hx9023s_set_trigger_state(struct iio_trigger *trig, bool state)
+{
+ struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
+ struct hx9023s_data *data = iio_priv(indio_dev);
+
+ guard(mutex)(&data->mutex);
+ if (state)
+ hx9023s_interrupt_enable(data);
+ else if (!data->chan_read)
+ hx9023s_interrupt_disable(data);
+ data->trigger_enabled = state;
+
+ return 0;
+}
+
+static const struct iio_trigger_ops hx9023s_trigger_ops = {
+ .set_trigger_state = hx9023s_set_trigger_state,
+};
+
+static irqreturn_t hx9023s_trigger_handler(int irq, void *private)
+{
+ struct iio_poll_func *pf = private;
+ struct iio_dev *indio_dev = pf->indio_dev;
+ struct hx9023s_data *data = iio_priv(indio_dev);
+ struct device *dev = regmap_get_device(data->regmap);
+ int ret;
+ unsigned int bit, i = 0;
+
+ guard(mutex)(&data->mutex);
+ ret = hx9023s_sample(data);
+ if (ret) {
+ dev_warn(dev, "sampling failed\n");
+ goto out;
+ }
+
+ ret = hx9023s_get_prox_state(data);
+ if (ret) {
+ dev_warn(dev, "get prox failed\n");
+ goto out;
+ }
+
+ for_each_set_bit(bit, indio_dev->active_scan_mask, indio_dev->masklength)
+ data->buffer.channels[i++] = data->ch_data[indio_dev->channels[bit].channel].diff;
+
+ iio_push_to_buffers_with_timestamp(indio_dev, &data->buffer, pf->timestamp);
+
+out:
+ iio_trigger_notify_done(indio_dev->trig);
+
+ return IRQ_HANDLED;
+}
+
+static int hx9023s_buffer_preenable(struct iio_dev *indio_dev)
+{
+ struct hx9023s_data *data = iio_priv(indio_dev);
+ unsigned long channels = 0;
+ unsigned int bit;
+
+ guard(mutex)(&data->mutex);
+ for_each_set_bit(bit, indio_dev->active_scan_mask, indio_dev->masklength)
+ __set_bit(indio_dev->channels[bit].channel, &channels);
+
+ hx9023s_update_chan_en(data, channels, data->chan_event);
+
+ return 0;
+}
+
+static int hx9023s_buffer_postdisable(struct iio_dev *indio_dev)
+{
+ struct hx9023s_data *data = iio_priv(indio_dev);
+
+ guard(mutex)(&data->mutex);
+ hx9023s_update_chan_en(data, 0, data->chan_event);
+
+ return 0;
+}
+
+static const struct iio_buffer_setup_ops hx9023s_buffer_setup_ops = {
+ .preenable = hx9023s_buffer_preenable,
+ .postdisable = hx9023s_buffer_postdisable,
+};
+
+static int hx9023s_id_check(struct iio_dev *indio_dev)
+{
+ struct hx9023s_data *data = iio_priv(indio_dev);
+ int ret;
+ unsigned int id;
+
+ ret = regmap_read(data->regmap, HX9023S_DEVICE_ID, &id);
+ if (ret)
+ return ret;
+
+ if (id == HX9023S_CHIP_ID) {
+ indio_dev->name = "hx9023s";
+ return 0;
+ }
+
+ return -ENODEV;
+}
+
+static int hx9023s_probe(struct i2c_client *client)
+{
+ struct device *dev = &client->dev;
+ struct iio_dev *indio_dev;
+ struct hx9023s_data *data;
+ int ret;
+
+ indio_dev = devm_iio_device_alloc(dev, sizeof(struct hx9023s_data));
+ if (!indio_dev)
+ return -ENOMEM;
+
+ data = iio_priv(indio_dev);
+ mutex_init(&data->mutex);
+
+ data->regmap = devm_regmap_init_i2c(client, &hx9023s_regmap_config);
+ if (IS_ERR(data->regmap))
+ return dev_err_probe(dev, PTR_ERR(data->regmap), "regmap init failed\n");
+
+ ret = hx9023s_property_get(data);
+ if (ret)
+ return dev_err_probe(dev, ret, "dts phase failed\n");
+
+ ret = devm_regulator_get_enable(dev, "vdd");
+ if (ret)
+ return dev_err_probe(dev, ret, "regulator get failed\n");
+
+ ret = hx9023s_id_check(indio_dev);
+ if (ret)
+ return dev_err_probe(dev, ret, "id check failed\n");
+
+ indio_dev->channels = hx9023s_channels;
+ indio_dev->num_channels = ARRAY_SIZE(hx9023s_channels);
+ indio_dev->info = &hx9023s_info;
+ indio_dev->modes = INDIO_DIRECT_MODE;
+ i2c_set_clientdata(client, indio_dev);
+
+ ret = hx9023s_reg_init(data);
+ if (ret)
+ return dev_err_probe(dev, ret, "device init failed\n");
+
+ ret = hx9023s_ch_cfg(data);
+ if (ret)
+ return dev_err_probe(dev, ret, "channel config failed\n");
+
+ ret = regcache_sync(data->regmap);
+ if (ret)
+ return dev_err_probe(dev, ret, "regcache sync failed\n");
+
+ if (client->irq) {
+ ret = devm_request_threaded_irq(dev, client->irq, hx9023s_irq_handler,
+ hx9023s_irq_thread_handler, IRQF_ONESHOT,
+ "hx9023s_event", indio_dev);
+ if (ret)
+ return dev_err_probe(dev, ret, "irq request failed\n");
+
+ data->trig = devm_iio_trigger_alloc(dev, "%s-dev%d", indio_dev->name,
+ iio_device_id(indio_dev));
+ if (!data->trig)
+ return dev_err_probe(dev, -ENOMEM,
+ "iio trigger alloc failed\n");
+
+ data->trig->ops = &hx9023s_trigger_ops;
+ iio_trigger_set_drvdata(data->trig, indio_dev);
+
+ ret = devm_iio_trigger_register(dev, data->trig);
+ if (ret)
+ return dev_err_probe(dev, ret,
+ "iio trigger register failed\n");
+ }
+
+ ret = devm_iio_triggered_buffer_setup(dev, indio_dev, iio_pollfunc_store_time,
+ hx9023s_trigger_handler, &hx9023s_buffer_setup_ops);
+ if (ret)
+ return dev_err_probe(dev, ret,
+ "iio triggered buffer setup failed\n");
+
+ ret = devm_iio_device_register(dev, indio_dev);
+ if (ret)
+ return dev_err_probe(dev, ret, "iio device register failed\n");
+
+ return 0;
+}
+
+static int hx9023s_suspend(struct device *dev)
+{
+ struct hx9023s_data *data = iio_priv(dev_get_drvdata(dev));
+
+ hx9023s_interrupt_disable(data);
+
+ return 0;
+}
+
+static int hx9023s_resume(struct device *dev)
+{
+ struct hx9023s_data *data = iio_priv(dev_get_drvdata(dev));
+
+ if (data->trigger_enabled)
+ hx9023s_interrupt_enable(data);
+
+ return 0;
+}
+
+static DEFINE_SIMPLE_DEV_PM_OPS(hx9023s_pm_ops, hx9023s_suspend, hx9023s_resume);
+
+static const struct of_device_id hx9023s_of_match[] = {
+ { .compatible = "tyhx,hx9023s" },
+ {}
+};
+MODULE_DEVICE_TABLE(of, hx9023s_of_match);
+
+static const struct i2c_device_id hx9023s_id[] = {
+ { "hx9023s" },
+ {}
+};
+MODULE_DEVICE_TABLE(i2c, hx9023s_id);
+
+static struct i2c_driver hx9023s_driver = {
+ .driver = {
+ .name = "hx9023s",
+ .of_match_table = hx9023s_of_match,
+ .pm = &hx9023s_pm_ops,
+
+ /*
+ * The I2C operations in hx9023s_reg_init() and hx9023s_ch_cfg()
+ * are time-consuming. Prefer async so we don't delay boot
+ * if we're builtin to the kernel.
+ */
+ .probe_type = PROBE_PREFER_ASYNCHRONOUS,
+ },
+ .probe = hx9023s_probe,
+ .id_table = hx9023s_id,
+};
+module_i2c_driver(hx9023s_driver);
+
+MODULE_AUTHOR("Yasin Lee <yasin.lee.x@gmail.com>");
+MODULE_DESCRIPTION("Driver for TYHX HX9023S SAR sensor");
+MODULE_LICENSE("GPL");
--
2.25.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v5 2/3] dt-bindings:iio:proximity: Add hx9023s binding
2024-06-16 7:36 ` [PATCH v5 2/3] dt-bindings:iio:proximity: Add hx9023s binding Yasin Lee
@ 2024-06-16 7:42 ` Krzysztof Kozlowski
2024-06-18 15:36 ` Yasin Lee
2024-06-16 8:40 ` Rob Herring (Arm)
1 sibling, 1 reply; 12+ messages in thread
From: Krzysztof Kozlowski @ 2024-06-16 7:42 UTC (permalink / raw)
To: Yasin Lee, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Jonathan Cameron, Lars-Peter Clausen
Cc: devicetree, linux-kernel, linux-iio, Yasin Lee
On 16/06/2024 09:36, Yasin Lee wrote:
> From: Yasin Lee <yasin.lee.x@gmail.com>
>
> A capacitive proximity sensor
Not much improved. No changelog, no responses to previous comments.
I already asked TWICE. So this is third time. Respond to each comment
and acknowledge that you are going to implement it.
Then write full changelog in patch changelog (so under ---) or in cover
letter (not present here) saying what changed.
NAK, because you keep ignoring same comments given over and over.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v5 1/3] dt-bindings:iio:proximity:new vendor prefix: tyhx
2024-06-16 7:36 ` [PATCH v5 1/3] dt-bindings:iio:proximity:new vendor prefix: tyhx Yasin Lee
@ 2024-06-16 7:43 ` Krzysztof Kozlowski
2024-06-18 15:50 ` Yasin Lee
0 siblings, 1 reply; 12+ messages in thread
From: Krzysztof Kozlowski @ 2024-06-16 7:43 UTC (permalink / raw)
To: Yasin Lee, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Jonathan Cameron, Lars-Peter Clausen
Cc: devicetree, linux-kernel, linux-iio, Yasin Lee
On 16/06/2024 09:36, Yasin Lee wrote:
> From: Yasin Lee <yasin.lee.x@gmail.com>
>
> Add NanjingTianyihexin Electronics Ltd.
Please use subject prefixes matching the subsystem. You can get them for
example with `git log --oneline -- DIRECTORY_OR_FILE` on the directory
your patch is touching. For bindings, the preferred subjects are
explained here:
https://www.kernel.org/doc/html/latest/devicetree/bindings/submitting-patches.html#i-for-patch-submitters
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v5 2/3] dt-bindings:iio:proximity: Add hx9023s binding
2024-06-16 7:36 ` [PATCH v5 2/3] dt-bindings:iio:proximity: Add hx9023s binding Yasin Lee
2024-06-16 7:42 ` Krzysztof Kozlowski
@ 2024-06-16 8:40 ` Rob Herring (Arm)
2024-06-17 14:51 ` Yasin Lee
1 sibling, 1 reply; 12+ messages in thread
From: Rob Herring (Arm) @ 2024-06-16 8:40 UTC (permalink / raw)
To: Yasin Lee
Cc: linux-iio, Jonathan Cameron, Conor Dooley, devicetree,
linux-kernel, Yasin Lee, Krzysztof Kozlowski, Lars-Peter Clausen
On Sun, 16 Jun 2024 15:36:48 +0800, Yasin Lee wrote:
> From: Yasin Lee <yasin.lee.x@gmail.com>
>
> A capacitive proximity sensor
>
> Signed-off-by: Yasin Lee <yasin.lee.x@gmail.com>
> ---
> .../bindings/iio/proximity/tyhx,hx9023s.yaml | 98 ++++++++++++++++++++++
> 1 file changed, 98 insertions(+)
>
My bot found errors running 'make dt_binding_check' on your patch:
yamllint warnings/errors:
dtschema/dtc warnings/errors:
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.yaml:
Error in referenced schema matching $id: http://devicetree.org/schemas/iio/proximity/adc.yaml
Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dts:35.15-25: Warning (reg_format): /example-0/i2c/proximity@2a/channel@0:reg: property has invalid length (4 bytes) (#address-cells == 2, #size-cells == 1)
Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dts:39.15-25: Warning (reg_format): /example-0/i2c/proximity@2a/channel@1:reg: property has invalid length (4 bytes) (#address-cells == 2, #size-cells == 1)
Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dts:43.15-25: Warning (reg_format): /example-0/i2c/proximity@2a/channel@2:reg: property has invalid length (4 bytes) (#address-cells == 2, #size-cells == 1)
Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dts:47.15-25: Warning (reg_format): /example-0/i2c/proximity@2a/channel@3:reg: property has invalid length (4 bytes) (#address-cells == 2, #size-cells == 1)
Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dts:51.15-25: Warning (reg_format): /example-0/i2c/proximity@2a/channel@4:reg: property has invalid length (4 bytes) (#address-cells == 2, #size-cells == 1)
Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dtb: Warning (pci_device_reg): Failed prerequisite 'reg_format'
Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dtb: Warning (pci_device_bus_num): Failed prerequisite 'reg_format'
Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dtb: Warning (simple_bus_reg): Failed prerequisite 'reg_format'
Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dtb: Warning (i2c_bus_reg): Failed prerequisite 'reg_format'
Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dtb: Warning (spi_bus_reg): Failed prerequisite 'reg_format'
Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dts:34.23-37.15: Warning (avoid_default_addr_size): /example-0/i2c/proximity@2a/channel@0: Relying on default #address-cells value
Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dts:34.23-37.15: Warning (avoid_default_addr_size): /example-0/i2c/proximity@2a/channel@0: Relying on default #size-cells value
Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dts:38.23-41.15: Warning (avoid_default_addr_size): /example-0/i2c/proximity@2a/channel@1: Relying on default #address-cells value
Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dts:38.23-41.15: Warning (avoid_default_addr_size): /example-0/i2c/proximity@2a/channel@1: Relying on default #size-cells value
Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dts:42.23-45.15: Warning (avoid_default_addr_size): /example-0/i2c/proximity@2a/channel@2: Relying on default #address-cells value
Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dts:42.23-45.15: Warning (avoid_default_addr_size): /example-0/i2c/proximity@2a/channel@2: Relying on default #size-cells value
Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dts:46.23-49.15: Warning (avoid_default_addr_size): /example-0/i2c/proximity@2a/channel@3: Relying on default #address-cells value
Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dts:46.23-49.15: Warning (avoid_default_addr_size): /example-0/i2c/proximity@2a/channel@3: Relying on default #size-cells value
Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dts:50.23-53.15: Warning (avoid_default_addr_size): /example-0/i2c/proximity@2a/channel@4: Relying on default #address-cells value
Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dts:50.23-53.15: Warning (avoid_default_addr_size): /example-0/i2c/proximity@2a/channel@4: Relying on default #size-cells value
Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dtb: Warning (unique_unit_address_if_enabled): Failed prerequisite 'avoid_default_addr_size'
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dtb: proximity@2a: channel@0: False schema does not allow {'reg': [[0]], 'input-channel': [[0]]}
from schema $id: http://devicetree.org/schemas/iio/proximity/tyhx,hx9023s.yaml#
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dtb: proximity@2a: channel@1: False schema does not allow {'reg': [[1]], 'input-channel': [[1]]}
from schema $id: http://devicetree.org/schemas/iio/proximity/tyhx,hx9023s.yaml#
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dtb: proximity@2a: channel@2: False schema does not allow {'reg': [[2]], 'input-channel': [[2]]}
from schema $id: http://devicetree.org/schemas/iio/proximity/tyhx,hx9023s.yaml#
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dtb: proximity@2a: channel@3: False schema does not allow {'reg': [[3]], 'diff-channels': [[1, 0]]}
from schema $id: http://devicetree.org/schemas/iio/proximity/tyhx,hx9023s.yaml#
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dtb: proximity@2a: channel@4: False schema does not allow {'reg': [[4]], 'diff-channels': [[2, 0]]}
from schema $id: http://devicetree.org/schemas/iio/proximity/tyhx,hx9023s.yaml#
doc reference errors (make refcheckdocs):
See https://patchwork.ozlabs.org/project/devicetree-bindings/patch/SN7PR12MB810142C58543160AB45D07B3A4CC2@SN7PR12MB8101.namprd12.prod.outlook.com
The base for the series is generally the latest rc1. A different dependency
should be noted in *this* patch.
If you already ran 'make dt_binding_check' and didn't see the above
error(s), then make sure 'yamllint' is installed and dt-schema is up to
date:
pip3 install dtschema --upgrade
Please check and re-submit after running the above command yourself. Note
that DT_SCHEMA_FILES can be set to your schema file to speed up checking
your schema. However, it must be unset to test all examples with your schema.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v5 3/3] iio:proximity:hx9023s: Add TYHX HX9023S sensor driver
2024-06-16 7:36 ` [PATCH v5 3/3] iio:proximity:hx9023s: Add TYHX HX9023S sensor driver Yasin Lee
@ 2024-06-17 11:34 ` kernel test robot
2024-06-17 19:22 ` Jonathan Cameron
0 siblings, 1 reply; 12+ messages in thread
From: kernel test robot @ 2024-06-17 11:34 UTC (permalink / raw)
To: Yasin Lee, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Jonathan Cameron, Lars-Peter Clausen
Cc: oe-kbuild-all, devicetree, linux-kernel, linux-iio, Yasin Lee
Hi Yasin,
kernel test robot noticed the following build warnings:
[auto build test WARNING on jic23-iio/togreg]
[also build test WARNING on robh/for-next linus/master v6.10-rc4 next-20240613]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Yasin-Lee/dt-bindings-iio-proximity-Add-hx9023s-binding/20240616-154122
base: https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git togreg
patch link: https://lore.kernel.org/r/SN7PR12MB8101D4BC788B5954608D677DA4CC2%40SN7PR12MB8101.namprd12.prod.outlook.com
patch subject: [PATCH v5 3/3] iio:proximity:hx9023s: Add TYHX HX9023S sensor driver
config: arm64-randconfig-r132-20240617 (https://download.01.org/0day-ci/archive/20240617/202406171946.qe83Tde0-lkp@intel.com/config)
compiler: aarch64-linux-gcc (GCC) 13.2.0
reproduce: (https://download.01.org/0day-ci/archive/20240617/202406171946.qe83Tde0-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202406171946.qe83Tde0-lkp@intel.com/
sparse warnings: (new ones prefixed by >>)
>> drivers/iio/proximity/hx9023s.c:955:44: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __be16 @@ got int diff @@
drivers/iio/proximity/hx9023s.c:955:44: sparse: expected restricted __be16
drivers/iio/proximity/hx9023s.c:955:44: sparse: got int diff
vim +955 drivers/iio/proximity/hx9023s.c
931
932 static irqreturn_t hx9023s_trigger_handler(int irq, void *private)
933 {
934 struct iio_poll_func *pf = private;
935 struct iio_dev *indio_dev = pf->indio_dev;
936 struct hx9023s_data *data = iio_priv(indio_dev);
937 struct device *dev = regmap_get_device(data->regmap);
938 int ret;
939 unsigned int bit, i = 0;
940
941 guard(mutex)(&data->mutex);
942 ret = hx9023s_sample(data);
943 if (ret) {
944 dev_warn(dev, "sampling failed\n");
945 goto out;
946 }
947
948 ret = hx9023s_get_prox_state(data);
949 if (ret) {
950 dev_warn(dev, "get prox failed\n");
951 goto out;
952 }
953
954 for_each_set_bit(bit, indio_dev->active_scan_mask, indio_dev->masklength)
> 955 data->buffer.channels[i++] = data->ch_data[indio_dev->channels[bit].channel].diff;
956
957 iio_push_to_buffers_with_timestamp(indio_dev, &data->buffer, pf->timestamp);
958
959 out:
960 iio_trigger_notify_done(indio_dev->trig);
961
962 return IRQ_HANDLED;
963 }
964
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v5 2/3] dt-bindings:iio:proximity: Add hx9023s binding
2024-06-16 8:40 ` Rob Herring (Arm)
@ 2024-06-17 14:51 ` Yasin Lee
0 siblings, 0 replies; 12+ messages in thread
From: Yasin Lee @ 2024-06-17 14:51 UTC (permalink / raw)
To: Rob Herring (Arm)
Cc: linux-iio, Jonathan Cameron, Conor Dooley, devicetree,
linux-kernel, Yasin Lee, Krzysztof Kozlowski, Lars-Peter Clausen
On 2024/6/16 16:40, Rob Herring (Arm) wrote:
> On Sun, 16 Jun 2024 15:36:48 +0800, Yasin Lee wrote:
>> From: Yasin Lee <yasin.lee.x@gmail.com>
>>
>> A capacitive proximity sensor
>>
>> Signed-off-by: Yasin Lee <yasin.lee.x@gmail.com>
>> ---
>> .../bindings/iio/proximity/tyhx,hx9023s.yaml | 98 ++++++++++++++++++++++
>> 1 file changed, 98 insertions(+)
>>
> My bot found errors running 'make dt_binding_check' on your patch:
>
> yamllint warnings/errors:
>
> dtschema/dtc warnings/errors:
> /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.yaml:
> Error in referenced schema matching $id: http://devicetree.org/schemas/iio/proximity/adc.yaml
> Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dts:35.15-25: Warning (reg_format): /example-0/i2c/proximity@2a/channel@0:reg: property has invalid length (4 bytes) (#address-cells == 2, #size-cells == 1)
> Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dts:39.15-25: Warning (reg_format): /example-0/i2c/proximity@2a/channel@1:reg: property has invalid length (4 bytes) (#address-cells == 2, #size-cells == 1)
> Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dts:43.15-25: Warning (reg_format): /example-0/i2c/proximity@2a/channel@2:reg: property has invalid length (4 bytes) (#address-cells == 2, #size-cells == 1)
> Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dts:47.15-25: Warning (reg_format): /example-0/i2c/proximity@2a/channel@3:reg: property has invalid length (4 bytes) (#address-cells == 2, #size-cells == 1)
> Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dts:51.15-25: Warning (reg_format): /example-0/i2c/proximity@2a/channel@4:reg: property has invalid length (4 bytes) (#address-cells == 2, #size-cells == 1)
> Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dtb: Warning (pci_device_reg): Failed prerequisite 'reg_format'
> Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dtb: Warning (pci_device_bus_num): Failed prerequisite 'reg_format'
> Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dtb: Warning (simple_bus_reg): Failed prerequisite 'reg_format'
> Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dtb: Warning (i2c_bus_reg): Failed prerequisite 'reg_format'
> Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dtb: Warning (spi_bus_reg): Failed prerequisite 'reg_format'
> Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dts:34.23-37.15: Warning (avoid_default_addr_size): /example-0/i2c/proximity@2a/channel@0: Relying on default #address-cells value
> Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dts:34.23-37.15: Warning (avoid_default_addr_size): /example-0/i2c/proximity@2a/channel@0: Relying on default #size-cells value
> Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dts:38.23-41.15: Warning (avoid_default_addr_size): /example-0/i2c/proximity@2a/channel@1: Relying on default #address-cells value
> Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dts:38.23-41.15: Warning (avoid_default_addr_size): /example-0/i2c/proximity@2a/channel@1: Relying on default #size-cells value
> Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dts:42.23-45.15: Warning (avoid_default_addr_size): /example-0/i2c/proximity@2a/channel@2: Relying on default #address-cells value
> Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dts:42.23-45.15: Warning (avoid_default_addr_size): /example-0/i2c/proximity@2a/channel@2: Relying on default #size-cells value
> Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dts:46.23-49.15: Warning (avoid_default_addr_size): /example-0/i2c/proximity@2a/channel@3: Relying on default #address-cells value
> Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dts:46.23-49.15: Warning (avoid_default_addr_size): /example-0/i2c/proximity@2a/channel@3: Relying on default #size-cells value
> Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dts:50.23-53.15: Warning (avoid_default_addr_size): /example-0/i2c/proximity@2a/channel@4: Relying on default #address-cells value
> Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dts:50.23-53.15: Warning (avoid_default_addr_size): /example-0/i2c/proximity@2a/channel@4: Relying on default #size-cells value
> Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dtb: Warning (unique_unit_address_if_enabled): Failed prerequisite 'avoid_default_addr_size'
> /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dtb: proximity@2a: channel@0: False schema does not allow {'reg': [[0]], 'input-channel': [[0]]}
> from schema $id: http://devicetree.org/schemas/iio/proximity/tyhx,hx9023s.yaml#
> /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dtb: proximity@2a: channel@1: False schema does not allow {'reg': [[1]], 'input-channel': [[1]]}
> from schema $id: http://devicetree.org/schemas/iio/proximity/tyhx,hx9023s.yaml#
> /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dtb: proximity@2a: channel@2: False schema does not allow {'reg': [[2]], 'input-channel': [[2]]}
> from schema $id: http://devicetree.org/schemas/iio/proximity/tyhx,hx9023s.yaml#
> /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dtb: proximity@2a: channel@3: False schema does not allow {'reg': [[3]], 'diff-channels': [[1, 0]]}
> from schema $id: http://devicetree.org/schemas/iio/proximity/tyhx,hx9023s.yaml#
> /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/iio/proximity/tyhx,hx9023s.example.dtb: proximity@2a: channel@4: False schema does not allow {'reg': [[4]], 'diff-channels': [[2, 0]]}
> from schema $id: http://devicetree.org/schemas/iio/proximity/tyhx,hx9023s.yaml#
>
> doc reference errors (make refcheckdocs):
>
> See https://patchwork.ozlabs.org/project/devicetree-bindings/patch/SN7PR12MB810142C58543160AB45D07B3A4CC2@SN7PR12MB8101.namprd12.prod.outlook.com
>
> The base for the series is generally the latest rc1. A different dependency
> should be noted in *this* patch.
>
> If you already ran 'make dt_binding_check' and didn't see the above
> error(s), then make sure 'yamllint' is installed and dt-schema is up to
> date:
>
> pip3 install dtschema --upgrade
>
> Please check and re-submit after running the above command yourself. Note
> that DT_SCHEMA_FILES can be set to your schema file to speed up checking
> your schema. However, it must be unset to test all examples with your schema.
>
Thank you for your reply. I have corrected the errors according to your
suggestions and will include the updates in version 6.
Yasin
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v5 3/3] iio:proximity:hx9023s: Add TYHX HX9023S sensor driver
2024-06-17 11:34 ` kernel test robot
@ 2024-06-17 19:22 ` Jonathan Cameron
2024-06-18 12:05 ` Yasin Lee
0 siblings, 1 reply; 12+ messages in thread
From: Jonathan Cameron @ 2024-06-17 19:22 UTC (permalink / raw)
To: kernel test robot
Cc: Yasin Lee, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Lars-Peter Clausen, oe-kbuild-all, devicetree, linux-kernel,
linux-iio, Yasin Lee
On Mon, 17 Jun 2024 19:34:30 +0800
kernel test robot <lkp@intel.com> wrote:
> Hi Yasin,
>
> kernel test robot noticed the following build warnings:
>
> [auto build test WARNING on jic23-iio/togreg]
> [also build test WARNING on robh/for-next linus/master v6.10-rc4 next-20240613]
> [If your patch is applied to the wrong git tree, kindly drop us a note.
> And when submitting patch, we suggest to use '--base' as documented in
> https://git-scm.com/docs/git-format-patch#_base_tree_information]
>
> url: https://github.com/intel-lab-lkp/linux/commits/Yasin-Lee/dt-bindings-iio-proximity-Add-hx9023s-binding/20240616-154122
> base: https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git togreg
> patch link: https://lore.kernel.org/r/SN7PR12MB8101D4BC788B5954608D677DA4CC2%40SN7PR12MB8101.namprd12.prod.outlook.com
> patch subject: [PATCH v5 3/3] iio:proximity:hx9023s: Add TYHX HX9023S sensor driver
> config: arm64-randconfig-r132-20240617 (https://download.01.org/0day-ci/archive/20240617/202406171946.qe83Tde0-lkp@intel.com/config)
> compiler: aarch64-linux-gcc (GCC) 13.2.0
> reproduce: (https://download.01.org/0day-ci/archive/20240617/202406171946.qe83Tde0-lkp@intel.com/reproduce)
>
> If you fix the issue in a separate patch/commit (i.e. not just a new version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <lkp@intel.com>
> | Closes: https://lore.kernel.org/oe-kbuild-all/202406171946.qe83Tde0-lkp@intel.com/
>
> sparse warnings: (new ones prefixed by >>)
> >> drivers/iio/proximity/hx9023s.c:955:44: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __be16 @@ got int diff @@
> drivers/iio/proximity/hx9023s.c:955:44: sparse: expected restricted __be16
> drivers/iio/proximity/hx9023s.c:955:44: sparse: got int diff
>
> vim +955 drivers/iio/proximity/hx9023s.c
>
> 931
> 932 static irqreturn_t hx9023s_trigger_handler(int irq, void *private)
> 933 {
> 934 struct iio_poll_func *pf = private;
> 935 struct iio_dev *indio_dev = pf->indio_dev;
> 936 struct hx9023s_data *data = iio_priv(indio_dev);
> 937 struct device *dev = regmap_get_device(data->regmap);
> 938 int ret;
> 939 unsigned int bit, i = 0;
> 940
> 941 guard(mutex)(&data->mutex);
> 942 ret = hx9023s_sample(data);
> 943 if (ret) {
> 944 dev_warn(dev, "sampling failed\n");
> 945 goto out;
> 946 }
> 947
> 948 ret = hx9023s_get_prox_state(data);
> 949 if (ret) {
> 950 dev_warn(dev, "get prox failed\n");
> 951 goto out;
> 952 }
> 953
> 954 for_each_set_bit(bit, indio_dev->active_scan_mask, indio_dev->masklength)
> > 955 data->buffer.channels[i++] = data->ch_data[indio_dev->channels[bit].channel].diff;
> 956
This looks very odd. Diff is an int filled with get_unaligned_le16()
which you then write to a __be16 here.
It should remain little endian, if that is appropriate, throughout.
Also, very long line. Use a local variable for
indio_dev->channels[bit].channel.
> 957 iio_push_to_buffers_with_timestamp(indio_dev, &data->buffer, pf->timestamp);
> 958
> 959 out:
> 960 iio_trigger_notify_done(indio_dev->trig);
> 961
> 962 return IRQ_HANDLED;
> 963 }
> 964
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v5 3/3] iio:proximity:hx9023s: Add TYHX HX9023S sensor driver
2024-06-17 19:22 ` Jonathan Cameron
@ 2024-06-18 12:05 ` Yasin Lee
0 siblings, 0 replies; 12+ messages in thread
From: Yasin Lee @ 2024-06-18 12:05 UTC (permalink / raw)
To: Jonathan Cameron, kernel test robot
Cc: Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Lars-Peter Clausen, oe-kbuild-all, devicetree, linux-kernel,
linux-iio, Yasin Lee
On 2024/6/18 03:22, Jonathan Cameron wrote:
> On Mon, 17 Jun 2024 19:34:30 +0800
> kernel test robot <lkp@intel.com> wrote:
>
>> Hi Yasin,
>>
>> kernel test robot noticed the following build warnings:
>>
>> [auto build test WARNING on jic23-iio/togreg]
>> [also build test WARNING on robh/for-next linus/master v6.10-rc4 next-20240613]
>> [If your patch is applied to the wrong git tree, kindly drop us a note.
>> And when submitting patch, we suggest to use '--base' as documented in
>> https://git-scm.com/docs/git-format-patch#_base_tree_information]
>>
>> url: https://github.com/intel-lab-lkp/linux/commits/Yasin-Lee/dt-bindings-iio-proximity-Add-hx9023s-binding/20240616-154122
>> base: https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git togreg
>> patch link: https://lore.kernel.org/r/SN7PR12MB8101D4BC788B5954608D677DA4CC2%40SN7PR12MB8101.namprd12.prod.outlook.com
>> patch subject: [PATCH v5 3/3] iio:proximity:hx9023s: Add TYHX HX9023S sensor driver
>> config: arm64-randconfig-r132-20240617 (https://download.01.org/0day-ci/archive/20240617/202406171946.qe83Tde0-lkp@intel.com/config)
>> compiler: aarch64-linux-gcc (GCC) 13.2.0
>> reproduce: (https://download.01.org/0day-ci/archive/20240617/202406171946.qe83Tde0-lkp@intel.com/reproduce)
>>
>> If you fix the issue in a separate patch/commit (i.e. not just a new version of
>> the same patch/commit), kindly add following tags
>> | Reported-by: kernel test robot <lkp@intel.com>
>> | Closes: https://lore.kernel.org/oe-kbuild-all/202406171946.qe83Tde0-lkp@intel.com/
>>
>> sparse warnings: (new ones prefixed by >>)
>>>> drivers/iio/proximity/hx9023s.c:955:44: sparse: sparse: incorrect type in assignment (different base types) @@ expected restricted __be16 @@ got int diff @@
>> drivers/iio/proximity/hx9023s.c:955:44: sparse: expected restricted __be16
>> drivers/iio/proximity/hx9023s.c:955:44: sparse: got int diff
>>
>> vim +955 drivers/iio/proximity/hx9023s.c
>>
>> 931
>> 932 static irqreturn_t hx9023s_trigger_handler(int irq, void *private)
>> 933 {
>> 934 struct iio_poll_func *pf = private;
>> 935 struct iio_dev *indio_dev = pf->indio_dev;
>> 936 struct hx9023s_data *data = iio_priv(indio_dev);
>> 937 struct device *dev = regmap_get_device(data->regmap);
>> 938 int ret;
>> 939 unsigned int bit, i = 0;
>> 940
>> 941 guard(mutex)(&data->mutex);
>> 942 ret = hx9023s_sample(data);
>> 943 if (ret) {
>> 944 dev_warn(dev, "sampling failed\n");
>> 945 goto out;
>> 946 }
>> 947
>> 948 ret = hx9023s_get_prox_state(data);
>> 949 if (ret) {
>> 950 dev_warn(dev, "get prox failed\n");
>> 951 goto out;
>> 952 }
>> 953
>> 954 for_each_set_bit(bit, indio_dev->active_scan_mask, indio_dev->masklength)
>> > 955 data->buffer.channels[i++] = data->ch_data[indio_dev->channels[bit].channel].diff;
>> 956
> This looks very odd. Diff is an int filled with get_unaligned_le16()
> which you then write to a __be16 here.
>
> It should remain little endian, if that is appropriate, throughout.
>
> Also, very long line. Use a local variable for
> indio_dev->channels[bit].channel.
Hi Jonathan,
I reviewed the code and saw that data->buffer.channels[i] needs to be
filled with the MSB and LSB of the diff data register. I can read the
two bytes of diff data using regmap_bulk_read and fill
data->buffer.channels[i]. However, the diff data register in this chip
is multiplexed with the low pass data register. Thus, in some cases,
diff data can't be directly read and must be calculated as the
difference between low pass data and baseline data. Therefore, I can't
directly store the register value in data->buffer.channels[i]. I plan to
make the following changes to the code. Do you think this is feasible?
@@ -141,7 +141,7 @@ struct hx9023s_data {
bool trigger_enabled;
struct {
- __be16 channels[HX9023S_CH_NUM];
+ __le16 channels[HX9023S_CH_NUM];
s64 ts __aligned(8);
} buffer;
@@ -936,7 +936,7 @@ static irqreturn_t hx9023s_trigger_handler(int irq,
void *private)
struct hx9023s_data *data = iio_priv(indio_dev);
struct device *dev = regmap_get_device(data->regmap);
int ret;
- unsigned int bit, i = 0;
+ unsigned int bit, index, i = 0;
guard(mutex)(&data->mutex);
ret = hx9023s_sample(data);
@@ -951,8 +951,10 @@ static irqreturn_t hx9023s_trigger_handler(int irq,
void *private)
goto out;
}
- for_each_set_bit(bit, indio_dev->active_scan_mask,
indio_dev->masklength)
- data->buffer.channels[i++] =
data->ch_data[indio_dev->channels[bit].channel].diff;
+ for_each_set_bit(bit, indio_dev->active_scan_mask,
indio_dev->masklength) {
+ index = indio_dev->channels[bit].channel;
+ data->buffer.channels[i++] =
cpu_to_le16(data->ch_data[index].diff);
+ }
iio_push_to_buffers_with_timestamp(indio_dev, &data->buffer,
pf->timestamp);
Best regards,
Yasin Lee
>> 957 iio_push_to_buffers_with_timestamp(indio_dev, &data->buffer, pf->timestamp);
>> 958
>> 959 out:
>> 960 iio_trigger_notify_done(indio_dev->trig);
>> 961
>> 962 return IRQ_HANDLED;
>> 963 }
>> 964
>>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v5 2/3] dt-bindings:iio:proximity: Add hx9023s binding
2024-06-16 7:42 ` Krzysztof Kozlowski
@ 2024-06-18 15:36 ` Yasin Lee
0 siblings, 0 replies; 12+ messages in thread
From: Yasin Lee @ 2024-06-18 15:36 UTC (permalink / raw)
To: Krzysztof Kozlowski, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Jonathan Cameron, Lars-Peter Clausen
Cc: devicetree, linux-kernel, linux-iio, Yasin Lee
在 2024/6/16 15:42, Krzysztof Kozlowski 写道:
> On 16/06/2024 09:36, Yasin Lee wrote:
>> From: Yasin Lee <yasin.lee.x@gmail.com>
>>
>> A capacitive proximity sensor
> Not much improved. No changelog, no responses to previous comments.
>
> I already asked TWICE. So this is third time. Respond to each comment
> and acknowledge that you are going to implement it.
>
> Then write full changelog in patch changelog (so under ---) or in cover
> letter (not present here) saying what changed.
>
> NAK, because you keep ignoring same comments given over and over.
>
> Best regards,
> Krzysztof
>
Hi Krzysztof,
I apologize for the oversight. I am currently working on addressing each
of the previous comments individually.
I will ensure that all the comments are addressed in detail and will
include a comprehensive changelog in the cover letter for the next
version (v6).
Thank you for your patience and guidance.
Best regards,
Yasin Lee
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v5 1/3] dt-bindings:iio:proximity:new vendor prefix: tyhx
2024-06-16 7:43 ` Krzysztof Kozlowski
@ 2024-06-18 15:50 ` Yasin Lee
0 siblings, 0 replies; 12+ messages in thread
From: Yasin Lee @ 2024-06-18 15:50 UTC (permalink / raw)
To: Krzysztof Kozlowski, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Jonathan Cameron, Lars-Peter Clausen
Cc: devicetree, linux-kernel, linux-iio, Yasin Lee
在 2024/6/16 15:43, Krzysztof Kozlowski 写道:
> On 16/06/2024 09:36, Yasin Lee wrote:
>> From: Yasin Lee <yasin.lee.x@gmail.com>
>>
>> Add NanjingTianyihexin Electronics Ltd.
> Please use subject prefixes matching the subsystem. You can get them for
> example with `git log --oneline -- DIRECTORY_OR_FILE` on the directory
> your patch is touching. For bindings, the preferred subjects are
> explained here:
> https://www.kernel.org/doc/html/latest/devicetree/bindings/submitting-patches.html#i-for-patch-submitters
>
> Best regards,
> Krzysztof
>
Hi Krzysztof,
Thank you for your guidance. I have modified the subject lines according
to your instructions. Please review and confirm if they are correct:
commit 18f572f2b3c2c7827c168d9d44a471d4610ecc6d
Author: Yasin Lee <yasin.lee.x@gmail.com>
Date: Sun Jun 16 10:35:32 2024 +0800
iio: proximity: Add driver support for TYHX's HX9023S capacitive
proximity sensor
A SAR sensor from NanjingTianyihexin Electronics Ltd.
The device has the following entry points:
Usual frequency:
- sampling_frequency
Instant reading of current values for different sensors:
- in_proximity0_raw
- in_proximity1_raw
- in_proximity2_raw
- in_proximity3_raw
- in_proximity4_raw
and associated events in events/
Signed-off-by: Yasin Lee <yasin.lee.x@gmail.com>
commit 4aeda539237a0eeb02458aff617e6ac2db539e3f
Author: Yasin Lee <yasin.lee.x@gmail.com>
Date: Sun Jun 16 10:34:43 2024 +0800
dt-bindings: iio: proximity: Add TYHX HX9023S
A capacitive proximity sensor
Signed-off-by: Yasin Lee <yasin.lee.x@gmail.com>
commit 98da4516aa8169465ddcda67ed9d7c526fdebeb7
Author: Yasin Lee <yasin.lee.x@gmail.com>
Date: Sun Jun 16 10:31:06 2024 +0800
dt-bindings: vendor-prefixes: add tyhx
Add vendor prefix for NanjingTianyihexin Electronics Ltd.
(http://www.tianyihexin.com)
Signed-off-by: Yasin Lee <yasin.lee.x@gmail.com>
Best regards,
Yasin Lee
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2024-06-18 15:50 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20240616-add-tyhx-hx9023s-sensor-driver-v5-0-ebaf280bbf0e@outlook.com>
2024-06-16 7:36 ` [PATCH v5 1/3] dt-bindings:iio:proximity:new vendor prefix: tyhx Yasin Lee
2024-06-16 7:43 ` Krzysztof Kozlowski
2024-06-18 15:50 ` Yasin Lee
2024-06-16 7:36 ` [PATCH v5 2/3] dt-bindings:iio:proximity: Add hx9023s binding Yasin Lee
2024-06-16 7:42 ` Krzysztof Kozlowski
2024-06-18 15:36 ` Yasin Lee
2024-06-16 8:40 ` Rob Herring (Arm)
2024-06-17 14:51 ` Yasin Lee
2024-06-16 7:36 ` [PATCH v5 3/3] iio:proximity:hx9023s: Add TYHX HX9023S sensor driver Yasin Lee
2024-06-17 11:34 ` kernel test robot
2024-06-17 19:22 ` Jonathan Cameron
2024-06-18 12:05 ` Yasin Lee
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).