devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v5 00/15] sx9310 iio driver updates
@ 2020-08-03 23:58 Daniel Campello
  2020-08-03 23:58 ` [PATCH v5 01/15] dt-bindings: iio: Add bindings for sx9310 sensor Daniel Campello
                   ` (14 more replies)
  0 siblings, 15 replies; 28+ messages in thread
From: Daniel Campello @ 2020-08-03 23:58 UTC (permalink / raw)
  To: LKML, LKML
  Cc: Jonathan Cameron, Daniel Campello, Andy Shevchenko,
	Douglas Anderson, Enrico Granata, Gwendal Grignou,
	Hartmut Knaack, Lars-Peter Clausen, Peter Meerwald-Stadler,
	Rob Herring, Stephen Boyd, linux-iio

The first patch resends the DT binding for the driver that was merged in
v5.8-rc1 with a small change to update for proper regulators. The second
through the eleventh patch fixes several issues dropped from v8 to v9
when the initial patch was merged.  The twelveth patch drops
channel_users because it's unused. The thirteenth patch adds support to
enable the svdd and vdd supplies so that this driver can work on a board
where the svdd supply isn't enabled at boot and needs to be turned on
before this driver starts to communicate with the chip. The final patch
updates irq trigger flags.

Changes in v5:
 - Added #include <linux/bitfield.h>
 - Really use a pointer to buffer struct on
iio_push_to_buffers_with_timestamp().

Changes in v4:
 - Updated macro SX9310_REG_STAT1_COMPSTAT_MASK at call site.
 - Use FIELD_GET/FIELD_PREP instead of manual shift.
 - Reverted condition check logic on enable/disable_irq methods.
 - Use pointer to buffer struct on iio_push_to_buffers_with_timestamp().

Changes in v3:
 - Moved irq presence check down to lower methods
 - Changed buffer to struct type to align timestamp memory properly.
 - Added static assert for number of channels.
 - Added irq trigger flags commit to the series.

Changes in v2:
 - Added #io-channel-cells as a required property
 - Reordered error handling on sx9310_resume()
 - Added #include <linux/mod_devicetable.h>
 - Added '\n' to dev_err()
 - Fixed commit message from "iio: sx9310: Align memory"
 - Changed prox_stat to chan_prox_stat bitmap.
 - Fixed dev_err() message
 - Added '\n' to dev_err()

Daniel Campello (12):
  dt-bindings: iio: Add bindings for sx9310 sensor
  iio: sx9310: Update macros declarations
  iio: sx9310: Fix irq handling
  iio: sx9310: Remove acpi and of table macros
  iio: sx9310: Change from .probe to .probe_new
  iio: sx9310: Fixes various memory handling
  iio: sx9310: Use long instead of int for channel bitmaps
  iio: sx9310: Use regmap_read_poll_timeout() for compensation
  iio: sx9310: Update copyright
  iio: sx9310: Simplify error return handling
  iio: sx9310: Use variable to hold &client->dev
  iio: sx9310: Miscellaneous format fixes

Stephen Boyd (3):
  iio: sx9310: Drop channel_users[]
  iio: sx9310: Enable vdd and svdd regulators at probe
  iio: sx9310: Use irq trigger flags from firmware

 .../iio/proximity/semtech,sx9310.yaml         |  65 +++
 drivers/iio/proximity/sx9310.c                | 424 +++++++++---------
 2 files changed, 278 insertions(+), 211 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/iio/proximity/semtech,sx9310.yaml

--
2.28.0.163.g6104cc2f0b6-goog


^ permalink raw reply	[flat|nested] 28+ messages in thread

* [PATCH v5 01/15] dt-bindings: iio: Add bindings for sx9310 sensor
  2020-08-03 23:58 [PATCH v5 00/15] sx9310 iio driver updates Daniel Campello
@ 2020-08-03 23:58 ` Daniel Campello
  2020-08-06 18:14   ` Jonathan Cameron
  2020-08-03 23:58 ` [PATCH v5 02/15] iio: sx9310: Update macros declarations Daniel Campello
                   ` (13 subsequent siblings)
  14 siblings, 1 reply; 28+ messages in thread
From: Daniel Campello @ 2020-08-03 23:58 UTC (permalink / raw)
  To: LKML, LKML
  Cc: Jonathan Cameron, Daniel Campello, Hartmut Knaack,
	Lars-Peter Clausen, Peter Meerwald-Stadler, Rob Herring,
	Douglas Anderson, Stephen Boyd, Rob Herring, linux-iio

Adds device tree bindings for sx9310 sensor.

Signed-off-by: Daniel Campello <campello@chromium.org>
Cc: Hartmut Knaack <knaack.h@gmx.de>
Cc: Lars-Peter Clausen <lars@metafoo.de>
Cc: Peter Meerwald-Stadler <pmeerw@pmeerw.net>
Cc: Rob Herring <robh+dt@kernel.org>
Reviewed-by: Douglas Anderson <dianders@chromium.org>
[swboyd@chromium.org: Add both regulators and make them optional]
Signed-off-by: Stephen Boyd <swboyd@chromium.org>
Reviewed-by: Rob Herring <robh@kernel.org>
---

Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2:
 - Added #io-channel-cells as a required property

 .../iio/proximity/semtech,sx9310.yaml         | 65 +++++++++++++++++++
 1 file changed, 65 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/iio/proximity/semtech,sx9310.yaml

diff --git a/Documentation/devicetree/bindings/iio/proximity/semtech,sx9310.yaml b/Documentation/devicetree/bindings/iio/proximity/semtech,sx9310.yaml
new file mode 100644
index 00000000000000..5739074d3592fe
--- /dev/null
+++ b/Documentation/devicetree/bindings/iio/proximity/semtech,sx9310.yaml
@@ -0,0 +1,65 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/iio/proximity/semtech,sx9310.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Semtech's SX9310 capacitive proximity sensor
+
+maintainers:
+  - Daniel Campello <campello@chromium.org>
+
+description: |
+  Semtech's SX9310/SX9311 capacitive proximity/button solution.
+
+  Specifications about the devices can be found at:
+  https://www.semtech.com/products/smart-sensing/sar-sensors/sx9310
+
+properties:
+  compatible:
+    enum:
+      - semtech,sx9310
+      - semtech,sx9311
+
+  reg:
+    maxItems: 1
+
+  interrupts:
+    description:
+      The sole interrupt generated by the device used to announce the
+      preceding reading request has finished and that data is
+      available or that a close/far proximity event has happened.
+    maxItems: 1
+
+  vdd-supply:
+    description: Main power supply
+
+  svdd-supply:
+    description: Host interface power supply
+
+  "#io-channel-cells":
+    const: 1
+
+required:
+  - compatible
+  - reg
+  - "#io-channel-cells"
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/interrupt-controller/irq.h>
+    i2c {
+      #address-cells = <1>;
+      #size-cells = <0>;
+      proximity@28 {
+        compatible = "semtech,sx9310";
+        reg = <0x28>;
+        interrupt-parent = <&pio>;
+        interrupts = <5 IRQ_TYPE_LEVEL_LOW 5>;
+        vdd-supply = <&pp3300_a>;
+        svdd-supply = <&pp1800_prox>;
+        #io-channel-cells = <1>;
+      };
+    };
-- 
2.28.0.163.g6104cc2f0b6-goog


^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCH v5 02/15] iio: sx9310: Update macros declarations
  2020-08-03 23:58 [PATCH v5 00/15] sx9310 iio driver updates Daniel Campello
  2020-08-03 23:58 ` [PATCH v5 01/15] dt-bindings: iio: Add bindings for sx9310 sensor Daniel Campello
@ 2020-08-03 23:58 ` Daniel Campello
  2020-08-06 18:15   ` Jonathan Cameron
  2020-08-03 23:58 ` [PATCH v5 03/15] iio: sx9310: Fix irq handling Daniel Campello
                   ` (12 subsequent siblings)
  14 siblings, 1 reply; 28+ messages in thread
From: Daniel Campello @ 2020-08-03 23:58 UTC (permalink / raw)
  To: LKML, LKML
  Cc: Jonathan Cameron, Daniel Campello, Stephen Boyd, Andy Shevchenko,
	Douglas Anderson, Gwendal Grignou, Hartmut Knaack,
	Lars-Peter Clausen, Peter Meerwald-Stadler, linux-iio

Follows spec sheet for macro declarations.

Signed-off-by: Daniel Campello <campello@chromium.org>
Reviewed-by: Stephen Boyd <swboyd@chromium.org>
---

Changes in v5:
 - Added #include <linux/bitfield.h>

Changes in v4:
 - Updated macro SX9310_REG_STAT1_COMPSTAT_MASK at call site.
 - Use FIELD_GET/FIELD_PREP instead of manual shift.

Changes in v3: None
Changes in v2: None

 drivers/iio/proximity/sx9310.c | 146 +++++++++++++++------------------
 1 file changed, 68 insertions(+), 78 deletions(-)

diff --git a/drivers/iio/proximity/sx9310.c b/drivers/iio/proximity/sx9310.c
index d161f3061e353d..d7c77fc661ba86 100644
--- a/drivers/iio/proximity/sx9310.c
+++ b/drivers/iio/proximity/sx9310.c
@@ -11,6 +11,7 @@
  */
 
 #include <linux/acpi.h>
+#include <linux/bitfield.h>
 #include <linux/delay.h>
 #include <linux/i2c.h>
 #include <linux/irq.h>
@@ -33,45 +34,44 @@
 #define SX9310_REG_IRQ_SRC				0x00
 #define SX9310_REG_STAT0				0x01
 #define SX9310_REG_STAT1				0x02
+#define SX9310_REG_STAT1_COMPSTAT_MASK			GENMASK(3, 0)
 #define SX9310_REG_IRQ_MSK				0x03
 #define   SX9310_CONVDONE_IRQ				BIT(3)
 #define   SX9310_FAR_IRQ				BIT(5)
 #define   SX9310_CLOSE_IRQ				BIT(6)
-#define   SX9310_EVENT_IRQ				(SX9310_FAR_IRQ | \
-							 SX9310_CLOSE_IRQ)
 #define SX9310_REG_IRQ_FUNC				0x04
 
 #define SX9310_REG_PROX_CTRL0				0x10
-#define   SX9310_REG_PROX_CTRL0_PROXSTAT2		0x10
-#define   SX9310_REG_PROX_CTRL0_EN_MASK			0x0F
+#define   SX9310_REG_PROX_CTRL0_SENSOREN_MASK		GENMASK(3, 0)
+#define   SX9310_REG_PROX_CTRL0_SCANPERIOD_MASK		GENMASK(7, 4)
+#define   SX9310_REG_PROX_CTRL0_SCANPERIOD_15MS		0x01
 #define SX9310_REG_PROX_CTRL1				0x11
 #define SX9310_REG_PROX_CTRL2				0x12
-#define   SX9310_REG_PROX_CTRL2_COMBMODE_ALL		0x80
-#define   SX9310_REG_PROX_CTRL2_SHIELDEN_DYNAMIC	0x04
+#define   SX9310_REG_PROX_CTRL2_COMBMODE_CS1_CS2	(0x02 << 6)
+#define   SX9310_REG_PROX_CTRL2_SHIELDEN_DYNAMIC	(0x01 << 2)
 #define SX9310_REG_PROX_CTRL3				0x13
-#define   SX9310_REG_PROX_CTRL3_GAIN0_X8		0x0c
+#define   SX9310_REG_PROX_CTRL3_GAIN0_X8		(0x03 << 2)
 #define   SX9310_REG_PROX_CTRL3_GAIN12_X4		0x02
 #define SX9310_REG_PROX_CTRL4				0x14
 #define   SX9310_REG_PROX_CTRL4_RESOLUTION_FINEST	0x07
 #define SX9310_REG_PROX_CTRL5				0x15
-#define   SX9310_REG_PROX_CTRL5_RANGE_SMALL		0xc0
-#define   SX9310_REG_PROX_CTRL5_STARTUPSENS_CS1		0x04
+#define   SX9310_REG_PROX_CTRL5_RANGE_SMALL		(0x03 << 6)
+#define   SX9310_REG_PROX_CTRL5_STARTUPSENS_CS1		(0x01 << 2)
 #define   SX9310_REG_PROX_CTRL5_RAWFILT_1P25		0x02
 #define SX9310_REG_PROX_CTRL6				0x16
-#define   SX9310_REG_PROX_CTRL6_COMP_COMMON		0x20
+#define   SX9310_REG_PROX_CTRL6_AVGTHRESH_DEFAULT	0x20
 #define SX9310_REG_PROX_CTRL7				0x17
-#define   SX9310_REG_PROX_CTRL7_AVGNEGFILT_2		0x08
+#define   SX9310_REG_PROX_CTRL7_AVGNEGFILT_2		(0x01 << 3)
 #define   SX9310_REG_PROX_CTRL7_AVGPOSFILT_512		0x05
 #define SX9310_REG_PROX_CTRL8				0x18
 #define SX9310_REG_PROX_CTRL9				0x19
-#define   SX9310_REG_PROX_CTRL8_9_PTHRESH12_28		0x40
-#define   SX9310_REG_PROX_CTRL8_9_PTHRESH_96		0x88
+#define   SX9310_REG_PROX_CTRL8_9_PTHRESH_28		(0x08 << 3)
+#define   SX9310_REG_PROX_CTRL8_9_PTHRESH_96		(0x11 << 3)
 #define   SX9310_REG_PROX_CTRL8_9_BODYTHRESH_900	0x03
 #define   SX9310_REG_PROX_CTRL8_9_BODYTHRESH_1500	0x05
 #define SX9310_REG_PROX_CTRL10				0x1a
-#define   SX9310_REG_PROX_CTRL10_HYST_6PCT		0x10
-#define   SX9310_REG_PROX_CTRL10_CLOSE_DEBOUNCE_8	0x12
-#define   SX9310_REG_PROX_CTRL10_FAR_DEBOUNCE_8		0x03
+#define   SX9310_REG_PROX_CTRL10_HYST_6PCT		(0x01 << 4)
+#define   SX9310_REG_PROX_CTRL10_FAR_DEBOUNCE_2		0x01
 #define SX9310_REG_PROX_CTRL11				0x1b
 #define SX9310_REG_PROX_CTRL12				0x1c
 #define SX9310_REG_PROX_CTRL13				0x1d
@@ -82,8 +82,8 @@
 #define SX9310_REG_PROX_CTRL18				0x22
 #define SX9310_REG_PROX_CTRL19				0x23
 #define SX9310_REG_SAR_CTRL0				0x2a
-#define   SX9310_REG_SAR_CTRL0_SARDEB_4_SAMPLES		0x40
-#define   SX9310_REG_SAR_CTRL0_SARHYST_8		0x10
+#define   SX9310_REG_SAR_CTRL0_SARDEB_4_SAMPLES		(0x02 << 5)
+#define   SX9310_REG_SAR_CTRL0_SARHYST_8		(0x02 << 3)
 #define SX9310_REG_SAR_CTRL1				0x2b
 /* Each increment of the slope register is 0.0078125. */
 #define   SX9310_REG_SAR_CTRL1_SLOPE(_hnslope)		(_hnslope / 78125)
@@ -107,7 +107,7 @@
 #define SX9310_REG_SAR_MSB				0x39
 #define SX9310_REG_SAR_LSB				0x3a
 
-#define SX9310_REG_I2CADDR				0x40
+#define SX9310_REG_I2C_ADDR				0x40
 #define SX9310_REG_PAUSE				0x41
 #define SX9310_REG_WHOAMI				0x42
 #define   SX9310_WHOAMI_VALUE				0x01
@@ -116,14 +116,9 @@
 #define SX9310_REG_RESET				0x7f
 #define   SX9310_SOFT_RESET				0xde
 
-#define SX9310_SCAN_PERIOD_MASK				GENMASK(7, 4)
-#define SX9310_SCAN_PERIOD_SHIFT			4
-
-#define SX9310_COMPSTAT_MASK				GENMASK(3, 0)
 
 /* 4 hardware channels, as defined in STAT0: COMB, CS2, CS1 and CS0. */
 #define SX9310_NUM_CHANNELS				4
-#define SX9310_CHAN_ENABLED_MASK			GENMASK(3, 0)
 
 struct sx9310_data {
 	/* Serialize access to registers and channel configuration */
@@ -251,7 +246,7 @@ static const struct regmap_range sx9310_readable_reg_ranges[] = {
 	regmap_reg_range(SX9310_REG_PROX_CTRL0, SX9310_REG_PROX_CTRL19),
 	regmap_reg_range(SX9310_REG_SAR_CTRL0, SX9310_REG_SAR_CTRL2),
 	regmap_reg_range(SX9310_REG_SENSOR_SEL, SX9310_REG_SAR_LSB),
-	regmap_reg_range(SX9310_REG_I2CADDR, SX9310_REG_WHOAMI),
+	regmap_reg_range(SX9310_REG_I2C_ADDR, SX9310_REG_WHOAMI),
 	regmap_reg_range(SX9310_REG_RESET, SX9310_REG_RESET),
 };
 
@@ -292,7 +287,7 @@ static int sx9310_update_chan_en(struct sx9310_data *data,
 
 	if ((data->chan_read | data->chan_event) != (chan_read | chan_event)) {
 		ret = regmap_update_bits(data->regmap, SX9310_REG_PROX_CTRL0,
-					 SX9310_CHAN_ENABLED_MASK,
+					 SX9310_REG_PROX_CTRL0_SENSOREN_MASK,
 					 chan_read | chan_event);
 		if (ret)
 			return ret;
@@ -361,7 +356,7 @@ static int sx9310_wait_for_sample(struct sx9310_data *data)
 	if (ret < 0)
 		return ret;
 
-	val = (val & SX9310_SCAN_PERIOD_MASK) >> SX9310_SCAN_PERIOD_SHIFT;
+	val = FIELD_GET(SX9310_REG_PROX_CTRL0_SCANPERIOD_MASK, val);
 
 	msleep(sx9310_scan_period_table[val]);
 
@@ -435,7 +430,7 @@ static int sx9310_read_samp_freq(struct sx9310_data *data, int *val, int *val2)
 	if (ret < 0)
 		return ret;
 
-	regval = (regval & SX9310_SCAN_PERIOD_MASK) >> SX9310_SCAN_PERIOD_SHIFT;
+	regval = FIELD_GET(SX9310_REG_PROX_CTRL0_SCANPERIOD_MASK, regval);
 	*val = sx9310_samp_freq_table[regval].val;
 	*val2 = sx9310_samp_freq_table[regval].val2;
 
@@ -482,9 +477,10 @@ static int sx9310_set_samp_freq(struct sx9310_data *data, int val, int val2)
 
 	mutex_lock(&data->mutex);
 
-	ret = regmap_update_bits(data->regmap, SX9310_REG_PROX_CTRL0,
-				 SX9310_SCAN_PERIOD_MASK,
-				 i << SX9310_SCAN_PERIOD_SHIFT);
+	ret = regmap_update_bits(
+		data->regmap, SX9310_REG_PROX_CTRL0,
+		SX9310_REG_PROX_CTRL0_SCANPERIOD_MASK,
+		FIELD_PREP(SX9310_REG_PROX_CTRL0_SCANPERIOD_MASK, i));
 
 	mutex_unlock(&data->mutex);
 
@@ -572,7 +568,7 @@ static irqreturn_t sx9310_irq_thread_handler(int irq, void *private)
 		goto out;
 	}
 
-	if (val & SX9310_EVENT_IRQ)
+	if (val & (SX9310_FAR_IRQ | SX9310_CLOSE_IRQ))
 		sx9310_push_events(indio_dev);
 
 	if (val & SX9310_CONVDONE_IRQ)
@@ -600,6 +596,7 @@ static int sx9310_write_event_config(struct iio_dev *indio_dev,
 				     enum iio_event_direction dir, int state)
 {
 	struct sx9310_data *data = iio_priv(indio_dev);
+	unsigned int eventirq = SX9310_FAR_IRQ | SX9310_CLOSE_IRQ;
 	int ret;
 
 	/* If the state hasn't changed, there's nothing to do. */
@@ -612,7 +609,7 @@ static int sx9310_write_event_config(struct iio_dev *indio_dev,
 		if (ret < 0)
 			goto out_unlock;
 		if (!(data->chan_event & ~BIT(chan->channel))) {
-			ret = sx9310_enable_irq(data, SX9310_EVENT_IRQ);
+			ret = sx9310_enable_irq(data, eventirq);
 			if (ret < 0)
 				sx9310_put_event_channel(data, chan->channel);
 		}
@@ -621,7 +618,7 @@ static int sx9310_write_event_config(struct iio_dev *indio_dev,
 		if (ret < 0)
 			goto out_unlock;
 		if (!data->chan_event) {
-			ret = sx9310_disable_irq(data, SX9310_EVENT_IRQ);
+			ret = sx9310_disable_irq(data, eventirq);
 			if (ret < 0)
 				sx9310_get_event_channel(data, chan->channel);
 		}
@@ -746,53 +743,46 @@ struct sx9310_reg_default {
 	u8 def;
 };
 
-#define SX_INIT(_reg, _def)			\
-	{					\
-		.reg = SX9310_REG_##_reg,	\
-		.def = _def,			\
-	}
-
 static const struct sx9310_reg_default sx9310_default_regs[] = {
-	SX_INIT(IRQ_MSK, 0x00),
-	SX_INIT(IRQ_FUNC, 0x00),
+	{ SX9310_REG_IRQ_MSK, 0x00 },
+	{ SX9310_REG_IRQ_FUNC, 0x00 },
 	/*
 	 * The lower 4 bits should not be set as it enable sensors measurements.
 	 * Turning the detection on before the configuration values are set to
 	 * good values can cause the device to return erroneous readings.
 	 */
-	SX_INIT(PROX_CTRL0, SX9310_REG_PROX_CTRL0_PROXSTAT2),
-	SX_INIT(PROX_CTRL1, 0x00),
-	SX_INIT(PROX_CTRL2, SX9310_REG_PROX_CTRL2_COMBMODE_ALL |
-			    SX9310_REG_PROX_CTRL2_SHIELDEN_DYNAMIC),
-	SX_INIT(PROX_CTRL3, SX9310_REG_PROX_CTRL3_GAIN0_X8 |
-			    SX9310_REG_PROX_CTRL3_GAIN12_X4),
-	SX_INIT(PROX_CTRL4, SX9310_REG_PROX_CTRL4_RESOLUTION_FINEST),
-	SX_INIT(PROX_CTRL5, SX9310_REG_PROX_CTRL5_RANGE_SMALL |
-			    SX9310_REG_PROX_CTRL5_STARTUPSENS_CS1 |
-			    SX9310_REG_PROX_CTRL5_RAWFILT_1P25),
-	SX_INIT(PROX_CTRL6, SX9310_REG_PROX_CTRL6_COMP_COMMON),
-	SX_INIT(PROX_CTRL7, SX9310_REG_PROX_CTRL7_AVGNEGFILT_2 |
-			    SX9310_REG_PROX_CTRL7_AVGPOSFILT_512),
-	SX_INIT(PROX_CTRL8, SX9310_REG_PROX_CTRL8_9_PTHRESH_96 |
-			    SX9310_REG_PROX_CTRL8_9_BODYTHRESH_1500),
-	SX_INIT(PROX_CTRL9, SX9310_REG_PROX_CTRL8_9_PTHRESH12_28 |
-			    SX9310_REG_PROX_CTRL8_9_BODYTHRESH_900),
-	SX_INIT(PROX_CTRL10, SX9310_REG_PROX_CTRL10_HYST_6PCT |
-			     SX9310_REG_PROX_CTRL10_CLOSE_DEBOUNCE_8 |
-			     SX9310_REG_PROX_CTRL10_FAR_DEBOUNCE_8),
-	SX_INIT(PROX_CTRL11, 0x00),
-	SX_INIT(PROX_CTRL12, 0x00),
-	SX_INIT(PROX_CTRL13, 0x00),
-	SX_INIT(PROX_CTRL14, 0x00),
-	SX_INIT(PROX_CTRL15, 0x00),
-	SX_INIT(PROX_CTRL16, 0x00),
-	SX_INIT(PROX_CTRL17, 0x00),
-	SX_INIT(PROX_CTRL18, 0x00),
-	SX_INIT(PROX_CTRL19, 0x00),
-	SX_INIT(SAR_CTRL0, SX9310_REG_SAR_CTRL0_SARDEB_4_SAMPLES |
-			   SX9310_REG_SAR_CTRL0_SARHYST_8),
-	SX_INIT(SAR_CTRL1, SX9310_REG_SAR_CTRL1_SLOPE(10781250)),
-	SX_INIT(SAR_CTRL2, SX9310_REG_SAR_CTRL2_SAROFFSET_DEFAULT),
+	{ SX9310_REG_PROX_CTRL0, SX9310_REG_PROX_CTRL0_SCANPERIOD_15MS },
+	{ SX9310_REG_PROX_CTRL1, 0x00 },
+	{ SX9310_REG_PROX_CTRL2, SX9310_REG_PROX_CTRL2_COMBMODE_CS1_CS2 |
+				 SX9310_REG_PROX_CTRL2_SHIELDEN_DYNAMIC },
+	{ SX9310_REG_PROX_CTRL3, SX9310_REG_PROX_CTRL3_GAIN0_X8 |
+				 SX9310_REG_PROX_CTRL3_GAIN12_X4 },
+	{ SX9310_REG_PROX_CTRL4, SX9310_REG_PROX_CTRL4_RESOLUTION_FINEST },
+	{ SX9310_REG_PROX_CTRL5, SX9310_REG_PROX_CTRL5_RANGE_SMALL |
+				 SX9310_REG_PROX_CTRL5_STARTUPSENS_CS1 |
+				 SX9310_REG_PROX_CTRL5_RAWFILT_1P25 },
+	{ SX9310_REG_PROX_CTRL6, SX9310_REG_PROX_CTRL6_AVGTHRESH_DEFAULT },
+	{ SX9310_REG_PROX_CTRL7, SX9310_REG_PROX_CTRL7_AVGNEGFILT_2 |
+				 SX9310_REG_PROX_CTRL7_AVGPOSFILT_512 },
+	{ SX9310_REG_PROX_CTRL8, SX9310_REG_PROX_CTRL8_9_PTHRESH_96 |
+				 SX9310_REG_PROX_CTRL8_9_BODYTHRESH_1500 },
+	{ SX9310_REG_PROX_CTRL9, SX9310_REG_PROX_CTRL8_9_PTHRESH_28 |
+				 SX9310_REG_PROX_CTRL8_9_BODYTHRESH_900 },
+	{ SX9310_REG_PROX_CTRL10, SX9310_REG_PROX_CTRL10_HYST_6PCT |
+				  SX9310_REG_PROX_CTRL10_FAR_DEBOUNCE_2 },
+	{ SX9310_REG_PROX_CTRL11, 0x00 },
+	{ SX9310_REG_PROX_CTRL12, 0x00 },
+	{ SX9310_REG_PROX_CTRL13, 0x00 },
+	{ SX9310_REG_PROX_CTRL14, 0x00 },
+	{ SX9310_REG_PROX_CTRL15, 0x00 },
+	{ SX9310_REG_PROX_CTRL16, 0x00 },
+	{ SX9310_REG_PROX_CTRL17, 0x00 },
+	{ SX9310_REG_PROX_CTRL18, 0x00 },
+	{ SX9310_REG_PROX_CTRL19, 0x00 },
+	{ SX9310_REG_SAR_CTRL0, SX9310_REG_SAR_CTRL0_SARDEB_4_SAMPLES |
+				SX9310_REG_SAR_CTRL0_SARHYST_8 },
+	{ SX9310_REG_SAR_CTRL1, SX9310_REG_SAR_CTRL1_SLOPE(10781250) },
+	{ SX9310_REG_SAR_CTRL2, SX9310_REG_SAR_CTRL2_SAROFFSET_DEFAULT },
 };
 
 /* Activate all channels and perform an initial compensation. */
@@ -809,7 +799,7 @@ static int sx9310_init_compensation(struct iio_dev *indio_dev)
 
 	/* run the compensation phase on all channels */
 	ret = regmap_write(data->regmap, SX9310_REG_PROX_CTRL0,
-			   ctrl0 | SX9310_REG_PROX_CTRL0_EN_MASK);
+			   ctrl0 | SX9310_REG_PROX_CTRL0_SENSOREN_MASK);
 	if (ret < 0)
 		return ret;
 
@@ -818,7 +808,7 @@ static int sx9310_init_compensation(struct iio_dev *indio_dev)
 		ret = regmap_read(data->regmap, SX9310_REG_STAT1, &val);
 		if (ret < 0)
 			goto out;
-		if (!(val & SX9310_COMPSTAT_MASK))
+		if (!(val & SX9310_REG_STAT1_COMPSTAT_MASK))
 			break;
 	}
 
@@ -992,7 +982,7 @@ static int __maybe_unused sx9310_suspend(struct device *dev)
 	if (ret)
 		goto out;
 
-	ctrl0 = data->suspend_ctrl0 & ~SX9310_REG_PROX_CTRL0_EN_MASK;
+	ctrl0 = data->suspend_ctrl0 & ~SX9310_REG_PROX_CTRL0_SENSOREN_MASK;
 	ret = regmap_write(data->regmap, SX9310_REG_PROX_CTRL0, ctrl0);
 	if (ret)
 		goto out;
-- 
2.28.0.163.g6104cc2f0b6-goog


^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCH v5 03/15] iio: sx9310: Fix irq handling
  2020-08-03 23:58 [PATCH v5 00/15] sx9310 iio driver updates Daniel Campello
  2020-08-03 23:58 ` [PATCH v5 01/15] dt-bindings: iio: Add bindings for sx9310 sensor Daniel Campello
  2020-08-03 23:58 ` [PATCH v5 02/15] iio: sx9310: Update macros declarations Daniel Campello
@ 2020-08-03 23:58 ` Daniel Campello
  2020-08-04  7:26   ` Andy Shevchenko
  2020-08-03 23:58 ` [PATCH v5 04/15] iio: sx9310: Remove acpi and of table macros Daniel Campello
                   ` (11 subsequent siblings)
  14 siblings, 1 reply; 28+ messages in thread
From: Daniel Campello @ 2020-08-03 23:58 UTC (permalink / raw)
  To: LKML, LKML
  Cc: Jonathan Cameron, Daniel Campello, Stephen Boyd, Andy Shevchenko,
	Douglas Anderson, Hartmut Knaack, Lars-Peter Clausen,
	Peter Meerwald-Stadler, linux-iio

Fixes enable/disable irq handling at various points. The driver needs to
only enable/disable irqs if there is an actual irq handler installed.

Signed-off-by: Daniel Campello <campello@chromium.org>
Reviewed-by: Stephen Boyd <swboyd@chromium.org>
---

Changes in v5: None
Changes in v4:
 - Reverted condition check logic on enable/disable_irq methods.

Changes in v3:
 - Moved irq presence check down to lower methods

Changes in v2:
 - Reordered error handling on sx9310_resume()

 drivers/iio/proximity/sx9310.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/drivers/iio/proximity/sx9310.c b/drivers/iio/proximity/sx9310.c
index d7c77fc661ba86..dafee85018aa6d 100644
--- a/drivers/iio/proximity/sx9310.c
+++ b/drivers/iio/proximity/sx9310.c
@@ -323,11 +323,15 @@ static int sx9310_put_event_channel(struct sx9310_data *data, int channel)
 
 static int sx9310_enable_irq(struct sx9310_data *data, unsigned int irq)
 {
+	if (!data->client->irq)
+		return 0;
 	return regmap_update_bits(data->regmap, SX9310_REG_IRQ_MSK, irq, irq);
 }
 
 static int sx9310_disable_irq(struct sx9310_data *data, unsigned int irq)
 {
+	if (!data->client->irq)
+		return 0;
 	return regmap_update_bits(data->regmap, SX9310_REG_IRQ_MSK, irq, 0);
 }
 
@@ -381,7 +385,7 @@ static int sx9310_read_proximity(struct sx9310_data *data,
 
 	mutex_unlock(&data->mutex);
 
-	if (data->client->irq > 0) {
+	if (data->client->irq) {
 		ret = wait_for_completion_interruptible(&data->completion);
 		reinit_completion(&data->completion);
 	} else {
@@ -1010,10 +1014,11 @@ static int __maybe_unused sx9310_resume(struct device *dev)
 
 out:
 	mutex_unlock(&data->mutex);
+	if (ret)
+		return ret;
 
 	enable_irq(data->client->irq);
-
-	return ret;
+	return 0;
 }
 
 static const struct dev_pm_ops sx9310_pm_ops = {
-- 
2.28.0.163.g6104cc2f0b6-goog


^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCH v5 04/15] iio: sx9310: Remove acpi and of table macros
  2020-08-03 23:58 [PATCH v5 00/15] sx9310 iio driver updates Daniel Campello
                   ` (2 preceding siblings ...)
  2020-08-03 23:58 ` [PATCH v5 03/15] iio: sx9310: Fix irq handling Daniel Campello
@ 2020-08-03 23:58 ` Daniel Campello
  2020-08-06 18:28   ` Jonathan Cameron
  2020-08-03 23:58 ` [PATCH v5 05/15] iio: sx9310: Change from .probe to .probe_new Daniel Campello
                   ` (10 subsequent siblings)
  14 siblings, 1 reply; 28+ messages in thread
From: Daniel Campello @ 2020-08-03 23:58 UTC (permalink / raw)
  To: LKML, LKML
  Cc: Jonathan Cameron, Daniel Campello, kbuild test robot,
	Andy Shevchenko, Stephen Boyd, Douglas Anderson, Enrico Granata,
	Hartmut Knaack, Lars-Peter Clausen, Peter Meerwald-Stadler,
	linux-iio

Avoids unused warnings due to acpi/of table macros.

Reported-by: kbuild test robot <lkp@intel.com>
Signed-off-by: Daniel Campello <campello@chromium.org>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Reviewed-by: Stephen Boyd <swboyd@chromium.org>
---

Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2:
 - Added #include <linux/mod_devicetable.h>

 drivers/iio/proximity/sx9310.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/iio/proximity/sx9310.c b/drivers/iio/proximity/sx9310.c
index dafee85018aa6d..9daf2b8591a0a0 100644
--- a/drivers/iio/proximity/sx9310.c
+++ b/drivers/iio/proximity/sx9310.c
@@ -16,8 +16,8 @@
 #include <linux/i2c.h>
 #include <linux/irq.h>
 #include <linux/kernel.h>
+#include <linux/mod_devicetable.h>
 #include <linux/module.h>
-#include <linux/of.h>
 #include <linux/pm.h>
 #include <linux/regmap.h>
 #include <linux/slab.h>
@@ -1049,8 +1049,8 @@ MODULE_DEVICE_TABLE(i2c, sx9310_id);
 static struct i2c_driver sx9310_driver = {
 	.driver = {
 		.name	= "sx9310",
-		.acpi_match_table = ACPI_PTR(sx9310_acpi_match),
-		.of_match_table = of_match_ptr(sx9310_of_match),
+		.acpi_match_table = sx9310_acpi_match,
+		.of_match_table = sx9310_of_match,
 		.pm = &sx9310_pm_ops,
 	},
 	.probe		= sx9310_probe,
-- 
2.28.0.163.g6104cc2f0b6-goog


^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCH v5 05/15] iio: sx9310: Change from .probe to .probe_new
  2020-08-03 23:58 [PATCH v5 00/15] sx9310 iio driver updates Daniel Campello
                   ` (3 preceding siblings ...)
  2020-08-03 23:58 ` [PATCH v5 04/15] iio: sx9310: Remove acpi and of table macros Daniel Campello
@ 2020-08-03 23:58 ` Daniel Campello
  2020-08-06 18:29   ` Jonathan Cameron
  2020-08-03 23:58 ` [PATCH v5 06/15] iio: sx9310: Fixes various memory handling Daniel Campello
                   ` (9 subsequent siblings)
  14 siblings, 1 reply; 28+ messages in thread
From: Daniel Campello @ 2020-08-03 23:58 UTC (permalink / raw)
  To: LKML, LKML
  Cc: Jonathan Cameron, Daniel Campello, Andy Shevchenko, Stephen Boyd,
	Douglas Anderson, Hartmut Knaack, Lars-Peter Clausen,
	Peter Meerwald-Stadler, linux-iio

Uses .probe_new in place of .probe. Also uses device_get_match_data()
for whoami matching.

Signed-off-by: Daniel Campello <campello@chromium.org>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Reviewed-by: Stephen Boyd <swboyd@chromium.org>
---

Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2:
 - Added '\n' to dev_err()

 drivers/iio/proximity/sx9310.c | 39 ++++++++++++----------------------
 1 file changed, 14 insertions(+), 25 deletions(-)

diff --git a/drivers/iio/proximity/sx9310.c b/drivers/iio/proximity/sx9310.c
index 9daf2b8591a0a0..66ecdd309e0ddc 100644
--- a/drivers/iio/proximity/sx9310.c
+++ b/drivers/iio/proximity/sx9310.c
@@ -139,7 +139,7 @@ struct sx9310_data {
 	struct completion completion;
 	unsigned int chan_read, chan_event;
 	int channel_users[SX9310_NUM_CHANNELS];
-	int whoami;
+	unsigned int whoami;
 };
 
 static const struct iio_event_spec sx9310_events[] = {
@@ -858,24 +858,15 @@ static int sx9310_init_device(struct iio_dev *indio_dev)
 
 static int sx9310_set_indio_dev_name(struct device *dev,
 				     struct iio_dev *indio_dev,
-				     const struct i2c_device_id *id, int whoami)
+				     unsigned int whoami)
 {
-	const struct acpi_device_id *acpi_id;
-
-	/* id will be NULL when enumerated via ACPI */
-	if (id) {
-		if (id->driver_data != whoami)
-			dev_err(dev, "WHOAMI does not match i2c_device_id: %s",
-				id->name);
-	} else if (ACPI_HANDLE(dev)) {
-		acpi_id = acpi_match_device(dev->driver->acpi_match_table, dev);
-		if (!acpi_id)
-			return -ENODEV;
-		if (acpi_id->driver_data != whoami)
-			dev_err(dev, "WHOAMI does not match acpi_device_id: %s",
-				acpi_id->id);
-	} else
+	unsigned int long ddata;
+
+	ddata = (uintptr_t)device_get_match_data(dev);
+	if (ddata != whoami) {
+		dev_err(dev, "WHOAMI does not match device data: %u\n", whoami);
 		return -ENODEV;
+	}
 
 	switch (whoami) {
 	case SX9310_WHOAMI_VALUE:
@@ -885,15 +876,14 @@ static int sx9310_set_indio_dev_name(struct device *dev,
 		indio_dev->name = "sx9311";
 		break;
 	default:
-		dev_err(dev, "unexpected WHOAMI response: %u", whoami);
+		dev_err(dev, "unexpected WHOAMI response: %u\n", whoami);
 		return -ENODEV;
 	}
 
 	return 0;
 }
 
-static int sx9310_probe(struct i2c_client *client,
-			const struct i2c_device_id *id)
+static int sx9310_probe(struct i2c_client *client)
 {
 	int ret;
 	struct iio_dev *indio_dev;
@@ -919,8 +909,7 @@ static int sx9310_probe(struct i2c_client *client,
 		return ret;
 	}
 
-	ret = sx9310_set_indio_dev_name(&client->dev, indio_dev, id,
-					data->whoami);
+	ret = sx9310_set_indio_dev_name(&client->dev, indio_dev, data->whoami);
 	if (ret < 0)
 		return ret;
 
@@ -1033,8 +1022,8 @@ static const struct acpi_device_id sx9310_acpi_match[] = {
 MODULE_DEVICE_TABLE(acpi, sx9310_acpi_match);
 
 static const struct of_device_id sx9310_of_match[] = {
-	{ .compatible = "semtech,sx9310" },
-	{ .compatible = "semtech,sx9311" },
+	{ .compatible = "semtech,sx9310", (void *)SX9310_WHOAMI_VALUE },
+	{ .compatible = "semtech,sx9311", (void *)SX9311_WHOAMI_VALUE },
 	{},
 };
 MODULE_DEVICE_TABLE(of, sx9310_of_match);
@@ -1053,7 +1042,7 @@ static struct i2c_driver sx9310_driver = {
 		.of_match_table = sx9310_of_match,
 		.pm = &sx9310_pm_ops,
 	},
-	.probe		= sx9310_probe,
+	.probe_new	= sx9310_probe,
 	.id_table	= sx9310_id,
 };
 module_i2c_driver(sx9310_driver);
-- 
2.28.0.163.g6104cc2f0b6-goog


^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCH v5 06/15] iio: sx9310: Fixes various memory handling
  2020-08-03 23:58 [PATCH v5 00/15] sx9310 iio driver updates Daniel Campello
                   ` (4 preceding siblings ...)
  2020-08-03 23:58 ` [PATCH v5 05/15] iio: sx9310: Change from .probe to .probe_new Daniel Campello
@ 2020-08-03 23:58 ` Daniel Campello
  2020-08-06 18:29   ` Jonathan Cameron
  2020-08-03 23:58 ` [PATCH v5 07/15] iio: sx9310: Use long instead of int for channel bitmaps Daniel Campello
                   ` (8 subsequent siblings)
  14 siblings, 1 reply; 28+ messages in thread
From: Daniel Campello @ 2020-08-03 23:58 UTC (permalink / raw)
  To: LKML, LKML
  Cc: Jonathan Cameron, Daniel Campello, Andy Shevchenko,
	Douglas Anderson, Enrico Granata, Hartmut Knaack,
	Lars-Peter Clausen, Peter Meerwald-Stadler, Stephen Boyd,
	linux-iio

Makes use __aligned(8) to ensure that the timestamp is correctly aligned
when we call io_push_to_buffers_with_timestamp().
Also makes use of sizeof() for regmap_bulk_read instead of static value.

Signed-off-by: Daniel Campello <campello@chromium.org>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
---

Changes in v5:
 - Really use a pointer to buffer struct on
iio_push_to_buffers_with_timestamp().

Changes in v4:
 - Use pointer to buffer struct on iio_push_to_buffers_with_timestamp().

Changes in v3:
 - Changed buffer to struct type to align timestamp memory properly.

Changes in v2:
 - Fixed commit message from "iio: sx9310: Align memory"

 drivers/iio/proximity/sx9310.c | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/drivers/iio/proximity/sx9310.c b/drivers/iio/proximity/sx9310.c
index 66ecdd309e0ddc..127b1ba79e2dea 100644
--- a/drivers/iio/proximity/sx9310.c
+++ b/drivers/iio/proximity/sx9310.c
@@ -132,8 +132,11 @@ struct sx9310_data {
 	 */
 	bool prox_stat[SX9310_NUM_CHANNELS];
 	bool trigger_enabled;
-	__be16 buffer[SX9310_NUM_CHANNELS +
-		      4]; /* 64-bit data + 64-bit timestamp */
+	/* Ensure correct alignment of timestamp when present. */
+	struct {
+		__be16 channels[SX9310_NUM_CHANNELS];
+		s64 ts __aligned(8);
+	} buffer;
 	/* Remember enabled channels and sample rate during suspend. */
 	unsigned int suspend_ctrl0;
 	struct completion completion;
@@ -344,7 +347,7 @@ static int sx9310_read_prox_data(struct sx9310_data *data,
 	if (ret < 0)
 		return ret;
 
-	return regmap_bulk_read(data->regmap, chan->address, val, 2);
+	return regmap_bulk_read(data->regmap, chan->address, val, sizeof(*val));
 }
 
 /*
@@ -694,10 +697,10 @@ static irqreturn_t sx9310_trigger_handler(int irq, void *private)
 		if (ret < 0)
 			goto out;
 
-		data->buffer[i++] = val;
+		data->buffer.channels[i++] = val;
 	}
 
-	iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
+	iio_push_to_buffers_with_timestamp(indio_dev, &data->buffer,
 					   pf->timestamp);
 
 out:
-- 
2.28.0.163.g6104cc2f0b6-goog


^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCH v5 07/15] iio: sx9310: Use long instead of int for channel bitmaps
  2020-08-03 23:58 [PATCH v5 00/15] sx9310 iio driver updates Daniel Campello
                   ` (5 preceding siblings ...)
  2020-08-03 23:58 ` [PATCH v5 06/15] iio: sx9310: Fixes various memory handling Daniel Campello
@ 2020-08-03 23:58 ` Daniel Campello
  2020-08-06 18:30   ` Jonathan Cameron
  2020-08-03 23:58 ` [PATCH v5 08/15] iio: sx9310: Use regmap_read_poll_timeout() for compensation Daniel Campello
                   ` (7 subsequent siblings)
  14 siblings, 1 reply; 28+ messages in thread
From: Daniel Campello @ 2020-08-03 23:58 UTC (permalink / raw)
  To: LKML, LKML
  Cc: Jonathan Cameron, Daniel Campello, Andy Shevchenko, Stephen Boyd,
	Douglas Anderson, Hartmut Knaack, Lars-Peter Clausen,
	Peter Meerwald-Stadler, linux-iio

Uses for_each_set_bit() macro to loop over channel bitmaps.

Signed-off-by: Daniel Campello <campello@chromium.org>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Reviewed-by: Stephen Boyd <swboyd@chromium.org>
---

Changes in v5: None
Changes in v4: None
Changes in v3:
 - Added static assert for number of channels.

Changes in v2:
 - Changed prox_stat to chan_prox_stat bitmap.

 drivers/iio/proximity/sx9310.c | 39 ++++++++++++++++++----------------
 1 file changed, 21 insertions(+), 18 deletions(-)

diff --git a/drivers/iio/proximity/sx9310.c b/drivers/iio/proximity/sx9310.c
index 127b1ba79e2dea..f78500b8a5841e 100644
--- a/drivers/iio/proximity/sx9310.c
+++ b/drivers/iio/proximity/sx9310.c
@@ -119,6 +119,7 @@
 
 /* 4 hardware channels, as defined in STAT0: COMB, CS2, CS1 and CS0. */
 #define SX9310_NUM_CHANNELS				4
+static_assert(SX9310_NUM_CHANNELS < BITS_PER_LONG);
 
 struct sx9310_data {
 	/* Serialize access to registers and channel configuration */
@@ -130,7 +131,7 @@ struct sx9310_data {
 	 * Last reading of the proximity status for each channel.
 	 * We only send an event to user space when this changes.
 	 */
-	bool prox_stat[SX9310_NUM_CHANNELS];
+	unsigned long chan_prox_stat;
 	bool trigger_enabled;
 	/* Ensure correct alignment of timestamp when present. */
 	struct {
@@ -140,7 +141,8 @@ struct sx9310_data {
 	/* Remember enabled channels and sample rate during suspend. */
 	unsigned int suspend_ctrl0;
 	struct completion completion;
-	unsigned int chan_read, chan_event;
+	unsigned long chan_read;
+	unsigned long chan_event;
 	int channel_users[SX9310_NUM_CHANNELS];
 	unsigned int whoami;
 };
@@ -283,15 +285,16 @@ static const struct regmap_config sx9310_regmap_config = {
 };
 
 static int sx9310_update_chan_en(struct sx9310_data *data,
-				 unsigned int chan_read,
-				 unsigned int chan_event)
+				 unsigned long chan_read,
+				 unsigned long chan_event)
 {
 	int ret;
+	unsigned long channels = chan_read | chan_event;
 
-	if ((data->chan_read | data->chan_event) != (chan_read | chan_event)) {
+	if ((data->chan_read | data->chan_event) != channels) {
 		ret = regmap_update_bits(data->regmap, SX9310_REG_PROX_CTRL0,
 					 SX9310_REG_PROX_CTRL0_SENSOREN_MASK,
-					 chan_read | chan_event);
+					 channels);
 		if (ret)
 			return ret;
 	}
@@ -532,6 +535,7 @@ static void sx9310_push_events(struct iio_dev *indio_dev)
 	unsigned int val, chan;
 	struct sx9310_data *data = iio_priv(indio_dev);
 	s64 timestamp = iio_get_time_ns(indio_dev);
+	unsigned long prox_changed;
 
 	/* Read proximity state on all channels */
 	ret = regmap_read(data->regmap, SX9310_REG_STAT0, &val);
@@ -540,24 +544,23 @@ static void sx9310_push_events(struct iio_dev *indio_dev)
 		return;
 	}
 
-	for (chan = 0; chan < SX9310_NUM_CHANNELS; chan++) {
+	/*
+	 * Only iterate over channels with changes on proximity status that have
+	 * events enabled.
+	 */
+	prox_changed = (data->chan_prox_stat ^ val) & data->chan_event;
+
+	for_each_set_bit(chan, &prox_changed, SX9310_NUM_CHANNELS) {
 		int dir;
 		u64 ev;
-		bool new_prox = val & BIT(chan);
-
-		if (!(data->chan_event & BIT(chan)))
-			continue;
-		if (new_prox == data->prox_stat[chan])
-			/* No change on this channel. */
-			continue;
 
-		dir = new_prox ? IIO_EV_DIR_FALLING : IIO_EV_DIR_RISING;
+		dir = val & BIT(chan) ? IIO_EV_DIR_FALLING : IIO_EV_DIR_RISING;
 		ev = IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY, chan,
 					  IIO_EV_TYPE_THRESH, dir);
 
 		iio_push_event(indio_dev, ev, timestamp);
-		data->prox_stat[chan] = new_prox;
 	}
+	data->chan_prox_stat = val;
 }
 
 static irqreturn_t sx9310_irq_thread_handler(int irq, void *private)
@@ -714,13 +717,13 @@ static irqreturn_t sx9310_trigger_handler(int irq, void *private)
 static int sx9310_buffer_preenable(struct iio_dev *indio_dev)
 {
 	struct sx9310_data *data = iio_priv(indio_dev);
-	unsigned int channels = 0;
+	unsigned long channels = 0;
 	int bit, ret;
 
 	mutex_lock(&data->mutex);
 	for_each_set_bit(bit, indio_dev->active_scan_mask,
 			 indio_dev->masklength)
-		channels |= BIT(indio_dev->channels[bit].channel);
+		__set_bit(indio_dev->channels[bit].channel, &channels);
 
 	ret = sx9310_update_chan_en(data, channels, data->chan_event);
 	mutex_unlock(&data->mutex);
-- 
2.28.0.163.g6104cc2f0b6-goog


^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCH v5 08/15] iio: sx9310: Use regmap_read_poll_timeout() for compensation
  2020-08-03 23:58 [PATCH v5 00/15] sx9310 iio driver updates Daniel Campello
                   ` (6 preceding siblings ...)
  2020-08-03 23:58 ` [PATCH v5 07/15] iio: sx9310: Use long instead of int for channel bitmaps Daniel Campello
@ 2020-08-03 23:58 ` Daniel Campello
  2020-08-03 23:58 ` [PATCH v5 09/15] iio: sx9310: Update copyright Daniel Campello
                   ` (6 subsequent siblings)
  14 siblings, 0 replies; 28+ messages in thread
From: Daniel Campello @ 2020-08-03 23:58 UTC (permalink / raw)
  To: LKML, LKML
  Cc: Jonathan Cameron, Daniel Campello, Andy Shevchenko, Stephen Boyd,
	Douglas Anderson, Gwendal Grignou, Hartmut Knaack,
	Lars-Peter Clausen, Peter Meerwald-Stadler, linux-iio

Simplify compensation stage by using regmap_read_poll_timeout().

Signed-off-by: Daniel Campello <campello@chromium.org>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Reviewed-by: Stephen Boyd <swboyd@chromium.org>
---

Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2:
 - Fixed dev_err() message

 drivers/iio/proximity/sx9310.c | 25 ++++++++++---------------
 1 file changed, 10 insertions(+), 15 deletions(-)

diff --git a/drivers/iio/proximity/sx9310.c b/drivers/iio/proximity/sx9310.c
index f78500b8a5841e..cd7de40a55c2f6 100644
--- a/drivers/iio/proximity/sx9310.c
+++ b/drivers/iio/proximity/sx9310.c
@@ -799,7 +799,7 @@ static const struct sx9310_reg_default sx9310_default_regs[] = {
 static int sx9310_init_compensation(struct iio_dev *indio_dev)
 {
 	struct sx9310_data *data = iio_priv(indio_dev);
-	int i, ret;
+	int ret;
 	unsigned int val;
 	unsigned int ctrl0;
 
@@ -813,22 +813,17 @@ static int sx9310_init_compensation(struct iio_dev *indio_dev)
 	if (ret < 0)
 		return ret;
 
-	for (i = 100; i >= 0; i--) {
-		msleep(20);
-		ret = regmap_read(data->regmap, SX9310_REG_STAT1, &val);
-		if (ret < 0)
-			goto out;
-		if (!(val & SX9310_REG_STAT1_COMPSTAT_MASK))
-			break;
-	}
-
-	if (i < 0) {
-		dev_err(&data->client->dev,
-			"initial compensation timed out: 0x%02x", val);
-		ret = -ETIMEDOUT;
+	ret = regmap_read_poll_timeout(data->regmap, SX9310_REG_STAT1, val,
+				       !(val & SX9310_REG_STAT1_COMPSTAT_MASK),
+				       20000, 2000000);
+	if (ret) {
+		if (ret == -ETIMEDOUT)
+			dev_err(&data->client->dev,
+				"initial compensation timed out: 0x%02x\n",
+				val);
+		return ret;
 	}
 
-out:
 	regmap_write(data->regmap, SX9310_REG_PROX_CTRL0, ctrl0);
 	return ret;
 }
-- 
2.28.0.163.g6104cc2f0b6-goog


^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCH v5 09/15] iio: sx9310: Update copyright
  2020-08-03 23:58 [PATCH v5 00/15] sx9310 iio driver updates Daniel Campello
                   ` (7 preceding siblings ...)
  2020-08-03 23:58 ` [PATCH v5 08/15] iio: sx9310: Use regmap_read_poll_timeout() for compensation Daniel Campello
@ 2020-08-03 23:58 ` Daniel Campello
  2020-08-18  1:45   ` Daniel Campello
  2020-08-03 23:58 ` [PATCH v5 10/15] iio: sx9310: Simplify error return handling Daniel Campello
                   ` (5 subsequent siblings)
  14 siblings, 1 reply; 28+ messages in thread
From: Daniel Campello @ 2020-08-03 23:58 UTC (permalink / raw)
  To: LKML, LKML
  Cc: Jonathan Cameron, Daniel Campello, Andy Shevchenko,
	Douglas Anderson, Gwendal Grignou, Hartmut Knaack,
	Lars-Peter Clausen, Peter Meerwald-Stadler, Stephen Boyd,
	linux-iio

Fixes wrong copyright year.

Signed-off-by: Daniel Campello <campello@chromium.org>
---

Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2: None

 drivers/iio/proximity/sx9310.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/iio/proximity/sx9310.c b/drivers/iio/proximity/sx9310.c
index cd7de40a55c2f6..87b2de0d7b55a3 100644
--- a/drivers/iio/proximity/sx9310.c
+++ b/drivers/iio/proximity/sx9310.c
@@ -1,13 +1,13 @@
 // SPDX-License-Identifier: GPL-2.0
 /*
- * Copyright 2018 Google LLC.
+ * Copyright 2020 Google LLC.
  *
  * Driver for Semtech's SX9310/SX9311 capacitive proximity/button solution.
  * Based on SX9500 driver and Semtech driver using the input framework
  * <https://my.syncplicity.com/share/teouwsim8niiaud/
  *          linux-driver-SX9310_NoSmartHSensing>.
- * Reworked April 2019 by Evan Green <evgreen@chromium.org>
- * and January 2020 by Daniel Campello <campello@chromium.org>
+ * Reworked in April 2019 by Evan Green <evgreen@chromium.org>
+ * and in January 2020 by Daniel Campello <campello@chromium.org>.
  */
 
 #include <linux/acpi.h>
-- 
2.28.0.163.g6104cc2f0b6-goog


^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCH v5 10/15] iio: sx9310: Simplify error return handling
  2020-08-03 23:58 [PATCH v5 00/15] sx9310 iio driver updates Daniel Campello
                   ` (8 preceding siblings ...)
  2020-08-03 23:58 ` [PATCH v5 09/15] iio: sx9310: Update copyright Daniel Campello
@ 2020-08-03 23:58 ` Daniel Campello
  2020-08-03 23:58 ` [PATCH v5 11/15] iio: sx9310: Use variable to hold &client->dev Daniel Campello
                   ` (4 subsequent siblings)
  14 siblings, 0 replies; 28+ messages in thread
From: Daniel Campello @ 2020-08-03 23:58 UTC (permalink / raw)
  To: LKML, LKML
  Cc: Jonathan Cameron, Daniel Campello, Andy Shevchenko, Stephen Boyd,
	Douglas Anderson, Gwendal Grignou, Hartmut Knaack,
	Lars-Peter Clausen, Peter Meerwald-Stadler, linux-iio

Checks for non-zero return values to signal error conditions.

Signed-off-by: Daniel Campello <campello@chromium.org>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Reviewed-by: Stephen Boyd <swboyd@chromium.org>
---

Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2: None

 drivers/iio/proximity/sx9310.c | 56 +++++++++++++++++-----------------
 1 file changed, 28 insertions(+), 28 deletions(-)

diff --git a/drivers/iio/proximity/sx9310.c b/drivers/iio/proximity/sx9310.c
index 87b2de0d7b55a3..adb707e2d79612 100644
--- a/drivers/iio/proximity/sx9310.c
+++ b/drivers/iio/proximity/sx9310.c
@@ -347,7 +347,7 @@ static int sx9310_read_prox_data(struct sx9310_data *data,
 	int ret;
 
 	ret = regmap_write(data->regmap, SX9310_REG_SENSOR_SEL, chan->channel);
-	if (ret < 0)
+	if (ret)
 		return ret;
 
 	return regmap_bulk_read(data->regmap, chan->address, val, sizeof(*val));
@@ -363,7 +363,7 @@ static int sx9310_wait_for_sample(struct sx9310_data *data)
 	unsigned int val;
 
 	ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL0, &val);
-	if (ret < 0)
+	if (ret)
 		return ret;
 
 	val = FIELD_GET(SX9310_REG_PROX_CTRL0_SCANPERIOD_MASK, val);
@@ -376,17 +376,17 @@ static int sx9310_wait_for_sample(struct sx9310_data *data)
 static int sx9310_read_proximity(struct sx9310_data *data,
 				 const struct iio_chan_spec *chan, int *val)
 {
-	int ret = 0;
+	int ret;
 	__be16 rawval;
 
 	mutex_lock(&data->mutex);
 
 	ret = sx9310_get_read_channel(data, chan->channel);
-	if (ret < 0)
+	if (ret)
 		goto out;
 
 	ret = sx9310_enable_irq(data, SX9310_CONVDONE_IRQ);
-	if (ret < 0)
+	if (ret)
 		goto out_put_channel;
 
 	mutex_unlock(&data->mutex);
@@ -400,22 +400,22 @@ static int sx9310_read_proximity(struct sx9310_data *data,
 
 	mutex_lock(&data->mutex);
 
-	if (ret < 0)
+	if (ret)
 		goto out_disable_irq;
 
 	ret = sx9310_read_prox_data(data, chan, &rawval);
-	if (ret < 0)
+	if (ret)
 		goto out_disable_irq;
 
 	*val = sign_extend32(be16_to_cpu(rawval),
 			     (chan->address == SX9310_REG_DIFF_MSB ? 11 : 15));
 
 	ret = sx9310_disable_irq(data, SX9310_CONVDONE_IRQ);
-	if (ret < 0)
+	if (ret)
 		goto out_put_channel;
 
 	ret = sx9310_put_read_channel(data, chan->channel);
-	if (ret < 0)
+	if (ret)
 		goto out;
 
 	mutex_unlock(&data->mutex);
@@ -437,7 +437,7 @@ static int sx9310_read_samp_freq(struct sx9310_data *data, int *val, int *val2)
 	unsigned int regval;
 	int ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL0, &regval);
 
-	if (ret < 0)
+	if (ret)
 		return ret;
 
 	regval = FIELD_GET(SX9310_REG_PROX_CTRL0_SCANPERIOD_MASK, regval);
@@ -539,7 +539,7 @@ static void sx9310_push_events(struct iio_dev *indio_dev)
 
 	/* Read proximity state on all channels */
 	ret = regmap_read(data->regmap, SX9310_REG_STAT0, &val);
-	if (ret < 0) {
+	if (ret) {
 		dev_err(&data->client->dev, "i2c transfer error in irq\n");
 		return;
 	}
@@ -573,7 +573,7 @@ static irqreturn_t sx9310_irq_thread_handler(int irq, void *private)
 	mutex_lock(&data->mutex);
 
 	ret = regmap_read(data->regmap, SX9310_REG_IRQ_SRC, &val);
-	if (ret < 0) {
+	if (ret) {
 		dev_err(&data->client->dev, "i2c transfer error in irq\n");
 		goto out;
 	}
@@ -616,20 +616,20 @@ static int sx9310_write_event_config(struct iio_dev *indio_dev,
 	mutex_lock(&data->mutex);
 	if (state) {
 		ret = sx9310_get_event_channel(data, chan->channel);
-		if (ret < 0)
+		if (ret)
 			goto out_unlock;
 		if (!(data->chan_event & ~BIT(chan->channel))) {
 			ret = sx9310_enable_irq(data, eventirq);
-			if (ret < 0)
+			if (ret)
 				sx9310_put_event_channel(data, chan->channel);
 		}
 	} else {
 		ret = sx9310_put_event_channel(data, chan->channel);
-		if (ret < 0)
+		if (ret)
 			goto out_unlock;
 		if (!data->chan_event) {
 			ret = sx9310_disable_irq(data, eventirq);
-			if (ret < 0)
+			if (ret)
 				sx9310_get_event_channel(data, chan->channel);
 		}
 	}
@@ -668,7 +668,7 @@ static int sx9310_set_trigger_state(struct iio_trigger *trig, bool state)
 		ret = sx9310_enable_irq(data, SX9310_CONVDONE_IRQ);
 	else if (!data->chan_read)
 		ret = sx9310_disable_irq(data, SX9310_CONVDONE_IRQ);
-	if (ret < 0)
+	if (ret)
 		goto out;
 
 	data->trigger_enabled = state;
@@ -697,7 +697,7 @@ static irqreturn_t sx9310_trigger_handler(int irq, void *private)
 			 indio_dev->masklength) {
 		ret = sx9310_read_prox_data(data, &indio_dev->channels[bit],
 					    &val);
-		if (ret < 0)
+		if (ret)
 			goto out;
 
 		data->buffer.channels[i++] = val;
@@ -804,13 +804,13 @@ static int sx9310_init_compensation(struct iio_dev *indio_dev)
 	unsigned int ctrl0;
 
 	ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL0, &ctrl0);
-	if (ret < 0)
+	if (ret)
 		return ret;
 
 	/* run the compensation phase on all channels */
 	ret = regmap_write(data->regmap, SX9310_REG_PROX_CTRL0,
 			   ctrl0 | SX9310_REG_PROX_CTRL0_SENSOREN_MASK);
-	if (ret < 0)
+	if (ret)
 		return ret;
 
 	ret = regmap_read_poll_timeout(data->regmap, SX9310_REG_STAT1, val,
@@ -836,21 +836,21 @@ static int sx9310_init_device(struct iio_dev *indio_dev)
 	unsigned int i, val;
 
 	ret = regmap_write(data->regmap, SX9310_REG_RESET, SX9310_SOFT_RESET);
-	if (ret < 0)
+	if (ret)
 		return ret;
 
 	usleep_range(1000, 2000); /* power-up time is ~1ms. */
 
 	/* Clear reset interrupt state by reading SX9310_REG_IRQ_SRC. */
 	ret = regmap_read(data->regmap, SX9310_REG_IRQ_SRC, &val);
-	if (ret < 0)
+	if (ret)
 		return ret;
 
 	/* Program some sane defaults. */
 	for (i = 0; i < ARRAY_SIZE(sx9310_default_regs); i++) {
 		initval = &sx9310_default_regs[i];
 		ret = regmap_write(data->regmap, initval->reg, initval->def);
-		if (ret < 0)
+		if (ret)
 			return ret;
 	}
 
@@ -904,14 +904,14 @@ static int sx9310_probe(struct i2c_client *client)
 		return PTR_ERR(data->regmap);
 
 	ret = regmap_read(data->regmap, SX9310_REG_WHOAMI, &data->whoami);
-	if (ret < 0) {
+	if (ret) {
 		dev_err(&client->dev, "error in reading WHOAMI register: %d",
 			ret);
 		return ret;
 	}
 
 	ret = sx9310_set_indio_dev_name(&client->dev, indio_dev, data->whoami);
-	if (ret < 0)
+	if (ret)
 		return ret;
 
 	ACPI_COMPANION_SET(&indio_dev->dev, ACPI_COMPANION(&client->dev));
@@ -923,7 +923,7 @@ static int sx9310_probe(struct i2c_client *client)
 	i2c_set_clientdata(client, indio_dev);
 
 	ret = sx9310_init_device(indio_dev);
-	if (ret < 0)
+	if (ret)
 		return ret;
 
 	if (client->irq) {
@@ -932,7 +932,7 @@ static int sx9310_probe(struct i2c_client *client)
 						sx9310_irq_thread_handler,
 						IRQF_TRIGGER_LOW | IRQF_ONESHOT,
 						"sx9310_event", indio_dev);
-		if (ret < 0)
+		if (ret)
 			return ret;
 
 		data->trig =
@@ -954,7 +954,7 @@ static int sx9310_probe(struct i2c_client *client)
 					      iio_pollfunc_store_time,
 					      sx9310_trigger_handler,
 					      &sx9310_buffer_setup_ops);
-	if (ret < 0)
+	if (ret)
 		return ret;
 
 	return devm_iio_device_register(&client->dev, indio_dev);
-- 
2.28.0.163.g6104cc2f0b6-goog


^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCH v5 11/15] iio: sx9310: Use variable to hold &client->dev
  2020-08-03 23:58 [PATCH v5 00/15] sx9310 iio driver updates Daniel Campello
                   ` (9 preceding siblings ...)
  2020-08-03 23:58 ` [PATCH v5 10/15] iio: sx9310: Simplify error return handling Daniel Campello
@ 2020-08-03 23:58 ` Daniel Campello
  2020-08-06 18:38   ` Jonathan Cameron
  2020-08-03 23:58 ` [PATCH v5 12/15] iio: sx9310: Miscellaneous format fixes Daniel Campello
                   ` (3 subsequent siblings)
  14 siblings, 1 reply; 28+ messages in thread
From: Daniel Campello @ 2020-08-03 23:58 UTC (permalink / raw)
  To: LKML, LKML
  Cc: Jonathan Cameron, Daniel Campello, Andy Shevchenko, Stephen Boyd,
	Douglas Anderson, Hartmut Knaack, Lars-Peter Clausen,
	Peter Meerwald-Stadler, linux-iio

Improves readability by storing &client->dev in a local variable.

Signed-off-by: Daniel Campello <campello@chromium.org>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Reviewed-by: Stephen Boyd <swboyd@chromium.org>
---

Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2:
 - Added '\n' to dev_err()

 drivers/iio/proximity/sx9310.c | 30 +++++++++++++++---------------
 1 file changed, 15 insertions(+), 15 deletions(-)

diff --git a/drivers/iio/proximity/sx9310.c b/drivers/iio/proximity/sx9310.c
index adb707e2d79612..589052d2d1146e 100644
--- a/drivers/iio/proximity/sx9310.c
+++ b/drivers/iio/proximity/sx9310.c
@@ -887,11 +887,12 @@ static int sx9310_set_indio_dev_name(struct device *dev,
 static int sx9310_probe(struct i2c_client *client)
 {
 	int ret;
+	struct device *dev = &client->dev;
 	struct iio_dev *indio_dev;
 	struct sx9310_data *data;
 
-	indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
-	if (indio_dev == NULL)
+	indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
+	if (!indio_dev)
 		return -ENOMEM;
 
 	data = iio_priv(indio_dev);
@@ -905,17 +906,16 @@ static int sx9310_probe(struct i2c_client *client)
 
 	ret = regmap_read(data->regmap, SX9310_REG_WHOAMI, &data->whoami);
 	if (ret) {
-		dev_err(&client->dev, "error in reading WHOAMI register: %d",
-			ret);
+		dev_err(dev, "error in reading WHOAMI register: %d\n", ret);
 		return ret;
 	}
 
-	ret = sx9310_set_indio_dev_name(&client->dev, indio_dev, data->whoami);
+	ret = sx9310_set_indio_dev_name(dev, indio_dev, data->whoami);
 	if (ret)
 		return ret;
 
-	ACPI_COMPANION_SET(&indio_dev->dev, ACPI_COMPANION(&client->dev));
-	indio_dev->dev.parent = &client->dev;
+	ACPI_COMPANION_SET(&indio_dev->dev, ACPI_COMPANION(dev));
+	indio_dev->dev.parent = dev;
 	indio_dev->channels = sx9310_channels;
 	indio_dev->num_channels = ARRAY_SIZE(sx9310_channels);
 	indio_dev->info = &sx9310_info;
@@ -927,7 +927,7 @@ static int sx9310_probe(struct i2c_client *client)
 		return ret;
 
 	if (client->irq) {
-		ret = devm_request_threaded_irq(&client->dev, client->irq,
+		ret = devm_request_threaded_irq(dev, client->irq,
 						sx9310_irq_handler,
 						sx9310_irq_thread_handler,
 						IRQF_TRIGGER_LOW | IRQF_ONESHOT,
@@ -935,29 +935,29 @@ static int sx9310_probe(struct i2c_client *client)
 		if (ret)
 			return ret;
 
-		data->trig =
-			devm_iio_trigger_alloc(&client->dev, "%s-dev%d",
-					       indio_dev->name, indio_dev->id);
+		data->trig = devm_iio_trigger_alloc(dev, "%s-dev%d",
+						    indio_dev->name,
+						    indio_dev->id);
 		if (!data->trig)
 			return -ENOMEM;
 
-		data->trig->dev.parent = &client->dev;
+		data->trig->dev.parent = dev;
 		data->trig->ops = &sx9310_trigger_ops;
 		iio_trigger_set_drvdata(data->trig, indio_dev);
 
-		ret = devm_iio_trigger_register(&client->dev, data->trig);
+		ret = devm_iio_trigger_register(dev, data->trig);
 		if (ret)
 			return ret;
 	}
 
-	ret = devm_iio_triggered_buffer_setup(&client->dev, indio_dev,
+	ret = devm_iio_triggered_buffer_setup(dev, indio_dev,
 					      iio_pollfunc_store_time,
 					      sx9310_trigger_handler,
 					      &sx9310_buffer_setup_ops);
 	if (ret)
 		return ret;
 
-	return devm_iio_device_register(&client->dev, indio_dev);
+	return devm_iio_device_register(dev, indio_dev);
 }
 
 static int __maybe_unused sx9310_suspend(struct device *dev)
-- 
2.28.0.163.g6104cc2f0b6-goog


^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCH v5 12/15] iio: sx9310: Miscellaneous format fixes
  2020-08-03 23:58 [PATCH v5 00/15] sx9310 iio driver updates Daniel Campello
                   ` (10 preceding siblings ...)
  2020-08-03 23:58 ` [PATCH v5 11/15] iio: sx9310: Use variable to hold &client->dev Daniel Campello
@ 2020-08-03 23:58 ` Daniel Campello
  2020-08-03 23:58 ` [PATCH v5 13/15] iio: sx9310: Drop channel_users[] Daniel Campello
                   ` (2 subsequent siblings)
  14 siblings, 0 replies; 28+ messages in thread
From: Daniel Campello @ 2020-08-03 23:58 UTC (permalink / raw)
  To: LKML, LKML
  Cc: Jonathan Cameron, Daniel Campello, Andy Shevchenko, Stephen Boyd,
	Douglas Anderson, Enrico Granata, Hartmut Knaack,
	Lars-Peter Clausen, Peter Meerwald-Stadler, linux-iio

Miscellaneous format fixes throughout the whole file.

Signed-off-by: Daniel Campello <campello@chromium.org>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Reviewed-by: Stephen Boyd <swboyd@chromium.org>
---

Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2: None

 drivers/iio/proximity/sx9310.c | 28 ++++++++++------------------
 1 file changed, 10 insertions(+), 18 deletions(-)

diff --git a/drivers/iio/proximity/sx9310.c b/drivers/iio/proximity/sx9310.c
index 589052d2d1146e..e92017b51c6def 100644
--- a/drivers/iio/proximity/sx9310.c
+++ b/drivers/iio/proximity/sx9310.c
@@ -91,28 +91,21 @@
 #define   SX9310_REG_SAR_CTRL2_SAROFFSET_DEFAULT	0x3c
 
 #define SX9310_REG_SENSOR_SEL				0x30
-
 #define SX9310_REG_USE_MSB				0x31
 #define SX9310_REG_USE_LSB				0x32
-
 #define SX9310_REG_AVG_MSB				0x33
 #define SX9310_REG_AVG_LSB				0x34
-
 #define SX9310_REG_DIFF_MSB				0x35
 #define SX9310_REG_DIFF_LSB				0x36
-
 #define SX9310_REG_OFFSET_MSB				0x37
 #define SX9310_REG_OFFSET_LSB				0x38
-
 #define SX9310_REG_SAR_MSB				0x39
 #define SX9310_REG_SAR_LSB				0x3a
-
 #define SX9310_REG_I2C_ADDR				0x40
 #define SX9310_REG_PAUSE				0x41
 #define SX9310_REG_WHOAMI				0x42
 #define   SX9310_WHOAMI_VALUE				0x01
 #define   SX9311_WHOAMI_VALUE				0x02
-
 #define SX9310_REG_RESET				0x7f
 #define   SX9310_SOFT_RESET				0xde
 
@@ -408,7 +401,7 @@ static int sx9310_read_proximity(struct sx9310_data *data,
 		goto out_disable_irq;
 
 	*val = sign_extend32(be16_to_cpu(rawval),
-			     (chan->address == SX9310_REG_DIFF_MSB ? 11 : 15));
+			     chan->address == SX9310_REG_DIFF_MSB ? 11 : 15);
 
 	ret = sx9310_disable_irq(data, SX9310_CONVDONE_IRQ);
 	if (ret)
@@ -435,8 +428,9 @@ static int sx9310_read_proximity(struct sx9310_data *data,
 static int sx9310_read_samp_freq(struct sx9310_data *data, int *val, int *val2)
 {
 	unsigned int regval;
-	int ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL0, &regval);
+	int ret;
 
+	ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL0, &regval);
 	if (ret)
 		return ret;
 
@@ -521,10 +515,9 @@ static irqreturn_t sx9310_irq_handler(int irq, void *private)
 		iio_trigger_poll(data->trig);
 
 	/*
-	 * Even if no event is enabled, we need to wake the thread to
-	 * clear the interrupt state by reading SX9310_REG_IRQ_SRC.  It
-	 * is not possible to do that here because regmap_read takes a
-	 * mutex.
+	 * Even if no event is enabled, we need to wake the thread to clear the
+	 * interrupt state by reading SX9310_REG_IRQ_SRC.
+	 * It is not possible to do that here because regmap_read takes a mutex.
 	 */
 	return IRQ_WAKE_THREAD;
 }
@@ -641,7 +634,7 @@ static int sx9310_write_event_config(struct iio_dev *indio_dev,
 
 static struct attribute *sx9310_attributes[] = {
 	&iio_dev_attr_sampling_frequency_available.dev_attr.attr,
-	NULL,
+	NULL
 };
 
 static const struct attribute_group sx9310_attribute_group = {
@@ -972,7 +965,6 @@ static int __maybe_unused sx9310_suspend(struct device *dev)
 	mutex_lock(&data->mutex);
 	ret = regmap_read(data->regmap, SX9310_REG_PROX_CTRL0,
 			  &data->suspend_ctrl0);
-
 	if (ret)
 		goto out;
 
@@ -1018,21 +1010,21 @@ static const struct dev_pm_ops sx9310_pm_ops = {
 static const struct acpi_device_id sx9310_acpi_match[] = {
 	{ "STH9310", SX9310_WHOAMI_VALUE },
 	{ "STH9311", SX9311_WHOAMI_VALUE },
-	{},
+	{}
 };
 MODULE_DEVICE_TABLE(acpi, sx9310_acpi_match);
 
 static const struct of_device_id sx9310_of_match[] = {
 	{ .compatible = "semtech,sx9310", (void *)SX9310_WHOAMI_VALUE },
 	{ .compatible = "semtech,sx9311", (void *)SX9311_WHOAMI_VALUE },
-	{},
+	{}
 };
 MODULE_DEVICE_TABLE(of, sx9310_of_match);
 
 static const struct i2c_device_id sx9310_id[] = {
 	{ "sx9310", SX9310_WHOAMI_VALUE },
 	{ "sx9311", SX9311_WHOAMI_VALUE },
-	{},
+	{}
 };
 MODULE_DEVICE_TABLE(i2c, sx9310_id);
 
-- 
2.28.0.163.g6104cc2f0b6-goog


^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCH v5 13/15] iio: sx9310: Drop channel_users[]
  2020-08-03 23:58 [PATCH v5 00/15] sx9310 iio driver updates Daniel Campello
                   ` (11 preceding siblings ...)
  2020-08-03 23:58 ` [PATCH v5 12/15] iio: sx9310: Miscellaneous format fixes Daniel Campello
@ 2020-08-03 23:58 ` Daniel Campello
  2020-08-03 23:58 ` [PATCH v5 14/15] iio: sx9310: Enable vdd and svdd regulators at probe Daniel Campello
  2020-08-03 23:58 ` [PATCH v5 15/15] iio: sx9310: Use irq trigger flags from firmware Daniel Campello
  14 siblings, 0 replies; 28+ messages in thread
From: Daniel Campello @ 2020-08-03 23:58 UTC (permalink / raw)
  To: LKML, LKML
  Cc: Jonathan Cameron, Stephen Boyd, Douglas Anderson,
	Daniel Campello, Andy Shevchenko, Enrico Granata,
	Gwendal Grignou, Hartmut Knaack, Lars-Peter Clausen,
	Peter Meerwald-Stadler, linux-iio

From: Stephen Boyd <swboyd@chromium.org>

This struct member isn't used. Drop it.

Fixes: 72ad02b15d63 ("iio: Add SEMTECH SX9310/9311 sensor driver")
Signed-off-by: Stephen Boyd <swboyd@chromium.org>
Reviewed-by: Douglas Anderson <dianders@chromium.org>
Reviewed-by: Daniel Campello <campello@chromium.org>
Signed-off-by: Daniel Campello <campello@chromium.org>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
---

Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2: None

 drivers/iio/proximity/sx9310.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/iio/proximity/sx9310.c b/drivers/iio/proximity/sx9310.c
index e92017b51c6def..60ca32885b664b 100644
--- a/drivers/iio/proximity/sx9310.c
+++ b/drivers/iio/proximity/sx9310.c
@@ -136,7 +136,6 @@ struct sx9310_data {
 	struct completion completion;
 	unsigned long chan_read;
 	unsigned long chan_event;
-	int channel_users[SX9310_NUM_CHANNELS];
 	unsigned int whoami;
 };
 
-- 
2.28.0.163.g6104cc2f0b6-goog


^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCH v5 14/15] iio: sx9310: Enable vdd and svdd regulators at probe
  2020-08-03 23:58 [PATCH v5 00/15] sx9310 iio driver updates Daniel Campello
                   ` (12 preceding siblings ...)
  2020-08-03 23:58 ` [PATCH v5 13/15] iio: sx9310: Drop channel_users[] Daniel Campello
@ 2020-08-03 23:58 ` Daniel Campello
  2020-08-03 23:58 ` [PATCH v5 15/15] iio: sx9310: Use irq trigger flags from firmware Daniel Campello
  14 siblings, 0 replies; 28+ messages in thread
From: Daniel Campello @ 2020-08-03 23:58 UTC (permalink / raw)
  To: LKML, LKML
  Cc: Jonathan Cameron, Stephen Boyd, Douglas Anderson,
	Daniel Campello, Andy Shevchenko, Hartmut Knaack,
	Lars-Peter Clausen, Peter Meerwald-Stadler, linux-iio

From: Stephen Boyd <swboyd@chromium.org>

Enable the main power supply (vdd) and digital IO power supply (svdd)
during probe so that the i2c communication and device works properly on
boards that aggressively power gate these supplies.

Signed-off-by: Stephen Boyd <swboyd@chromium.org>
Reviewed-by: Douglas Anderson <dianders@chromium.org>
Signed-off-by: Daniel Campello <campello@chromium.org>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
---

Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2: None

 drivers/iio/proximity/sx9310.c | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/drivers/iio/proximity/sx9310.c b/drivers/iio/proximity/sx9310.c
index 60ca32885b664b..a68766708fb304 100644
--- a/drivers/iio/proximity/sx9310.c
+++ b/drivers/iio/proximity/sx9310.c
@@ -20,6 +20,7 @@
 #include <linux/module.h>
 #include <linux/pm.h>
 #include <linux/regmap.h>
+#include <linux/regulator/consumer.h>
 #include <linux/slab.h>
 
 #include <linux/iio/buffer.h>
@@ -120,6 +121,7 @@ struct sx9310_data {
 	struct i2c_client *client;
 	struct iio_trigger *trig;
 	struct regmap *regmap;
+	struct regulator_bulk_data supplies[2];
 	/*
 	 * Last reading of the proximity status for each channel.
 	 * We only send an event to user space when this changes.
@@ -876,6 +878,13 @@ static int sx9310_set_indio_dev_name(struct device *dev,
 	return 0;
 }
 
+static void sx9310_regulator_disable(void *_data)
+{
+	struct sx9310_data *data = _data;
+
+	regulator_bulk_disable(ARRAY_SIZE(data->supplies), data->supplies);
+}
+
 static int sx9310_probe(struct i2c_client *client)
 {
 	int ret;
@@ -889,6 +898,8 @@ static int sx9310_probe(struct i2c_client *client)
 
 	data = iio_priv(indio_dev);
 	data->client = client;
+	data->supplies[0].supply = "vdd";
+	data->supplies[1].supply = "svdd";
 	mutex_init(&data->mutex);
 	init_completion(&data->completion);
 
@@ -896,6 +907,21 @@ static int sx9310_probe(struct i2c_client *client)
 	if (IS_ERR(data->regmap))
 		return PTR_ERR(data->regmap);
 
+	ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(data->supplies),
+				      data->supplies);
+	if (ret)
+		return ret;
+
+	ret = regulator_bulk_enable(ARRAY_SIZE(data->supplies), data->supplies);
+	if (ret)
+		return ret;
+	/* Must wait for Tpor time after initial power up */
+	usleep_range(1000, 1100);
+
+	ret = devm_add_action_or_reset(dev, sx9310_regulator_disable, data);
+	if (ret)
+		return ret;
+
 	ret = regmap_read(data->regmap, SX9310_REG_WHOAMI, &data->whoami);
 	if (ret) {
 		dev_err(dev, "error in reading WHOAMI register: %d\n", ret);
-- 
2.28.0.163.g6104cc2f0b6-goog


^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCH v5 15/15] iio: sx9310: Use irq trigger flags from firmware
  2020-08-03 23:58 [PATCH v5 00/15] sx9310 iio driver updates Daniel Campello
                   ` (13 preceding siblings ...)
  2020-08-03 23:58 ` [PATCH v5 14/15] iio: sx9310: Enable vdd and svdd regulators at probe Daniel Campello
@ 2020-08-03 23:58 ` Daniel Campello
  2020-08-06 18:42   ` Jonathan Cameron
  14 siblings, 1 reply; 28+ messages in thread
From: Daniel Campello @ 2020-08-03 23:58 UTC (permalink / raw)
  To: LKML, LKML
  Cc: Jonathan Cameron, Stephen Boyd, Daniel Campello, Andy Shevchenko,
	Douglas Anderson, Gwendal Grignou, Hartmut Knaack,
	Lars-Peter Clausen, Peter Meerwald-Stadler, linux-iio

From: Stephen Boyd <swboyd@chromium.org>

We shouldn't need to set default irq trigger flags here as the firmware
should have properly indicated the trigger type, i.e. level low, in the
DT or ACPI tables.

Signed-off-by: Stephen Boyd <swboyd@chromium.org>
Signed-off-by: Daniel Campello <campello@chromium.org>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
---

Changes in v5: None
Changes in v4: None
Changes in v3:
 - Added irq trigger flags commit to the series.

Changes in v2: None

 drivers/iio/proximity/sx9310.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/iio/proximity/sx9310.c b/drivers/iio/proximity/sx9310.c
index a68766708fb304..db97b5339d0eff 100644
--- a/drivers/iio/proximity/sx9310.c
+++ b/drivers/iio/proximity/sx9310.c
@@ -948,7 +948,7 @@ static int sx9310_probe(struct i2c_client *client)
 		ret = devm_request_threaded_irq(dev, client->irq,
 						sx9310_irq_handler,
 						sx9310_irq_thread_handler,
-						IRQF_TRIGGER_LOW | IRQF_ONESHOT,
+						IRQF_ONESHOT,
 						"sx9310_event", indio_dev);
 		if (ret)
 			return ret;
-- 
2.28.0.163.g6104cc2f0b6-goog


^ permalink raw reply related	[flat|nested] 28+ messages in thread

* Re: [PATCH v5 03/15] iio: sx9310: Fix irq handling
  2020-08-03 23:58 ` [PATCH v5 03/15] iio: sx9310: Fix irq handling Daniel Campello
@ 2020-08-04  7:26   ` Andy Shevchenko
  0 siblings, 0 replies; 28+ messages in thread
From: Andy Shevchenko @ 2020-08-04  7:26 UTC (permalink / raw)
  To: Daniel Campello
  Cc: LKML, LKML, Jonathan Cameron, Stephen Boyd, Douglas Anderson,
	Hartmut Knaack, Lars-Peter Clausen, Peter Meerwald-Stadler,
	linux-iio

On Tue, Aug 4, 2020 at 2:58 AM Daniel Campello <campello@chromium.org> wrote:
>
> Fixes enable/disable irq handling at various points. The driver needs to
> only enable/disable irqs if there is an actual irq handler installed.

Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>

> Signed-off-by: Daniel Campello <campello@chromium.org>
> Reviewed-by: Stephen Boyd <swboyd@chromium.org>
> ---
>
> Changes in v5: None
> Changes in v4:
>  - Reverted condition check logic on enable/disable_irq methods.
>
> Changes in v3:
>  - Moved irq presence check down to lower methods
>
> Changes in v2:
>  - Reordered error handling on sx9310_resume()
>
>  drivers/iio/proximity/sx9310.c | 11 ++++++++---
>  1 file changed, 8 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/iio/proximity/sx9310.c b/drivers/iio/proximity/sx9310.c
> index d7c77fc661ba86..dafee85018aa6d 100644
> --- a/drivers/iio/proximity/sx9310.c
> +++ b/drivers/iio/proximity/sx9310.c
> @@ -323,11 +323,15 @@ static int sx9310_put_event_channel(struct sx9310_data *data, int channel)
>
>  static int sx9310_enable_irq(struct sx9310_data *data, unsigned int irq)
>  {
> +       if (!data->client->irq)
> +               return 0;
>         return regmap_update_bits(data->regmap, SX9310_REG_IRQ_MSK, irq, irq);
>  }
>
>  static int sx9310_disable_irq(struct sx9310_data *data, unsigned int irq)
>  {
> +       if (!data->client->irq)
> +               return 0;
>         return regmap_update_bits(data->regmap, SX9310_REG_IRQ_MSK, irq, 0);
>  }
>
> @@ -381,7 +385,7 @@ static int sx9310_read_proximity(struct sx9310_data *data,
>
>         mutex_unlock(&data->mutex);
>
> -       if (data->client->irq > 0) {
> +       if (data->client->irq) {
>                 ret = wait_for_completion_interruptible(&data->completion);
>                 reinit_completion(&data->completion);
>         } else {
> @@ -1010,10 +1014,11 @@ static int __maybe_unused sx9310_resume(struct device *dev)
>
>  out:
>         mutex_unlock(&data->mutex);
> +       if (ret)
> +               return ret;
>
>         enable_irq(data->client->irq);
> -
> -       return ret;
> +       return 0;
>  }
>
>  static const struct dev_pm_ops sx9310_pm_ops = {
> --
> 2.28.0.163.g6104cc2f0b6-goog
>


-- 
With Best Regards,
Andy Shevchenko

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v5 01/15] dt-bindings: iio: Add bindings for sx9310 sensor
  2020-08-03 23:58 ` [PATCH v5 01/15] dt-bindings: iio: Add bindings for sx9310 sensor Daniel Campello
@ 2020-08-06 18:14   ` Jonathan Cameron
  0 siblings, 0 replies; 28+ messages in thread
From: Jonathan Cameron @ 2020-08-06 18:14 UTC (permalink / raw)
  To: Daniel Campello
  Cc: LKML, LKML, Hartmut Knaack, Lars-Peter Clausen,
	Peter Meerwald-Stadler, Rob Herring, Douglas Anderson,
	Stephen Boyd, Rob Herring, linux-iio

On Mon,  3 Aug 2020 17:58:01 -0600
Daniel Campello <campello@chromium.org> wrote:

> Adds device tree bindings for sx9310 sensor.
> 
> Signed-off-by: Daniel Campello <campello@chromium.org>
> Cc: Hartmut Knaack <knaack.h@gmx.de>
> Cc: Lars-Peter Clausen <lars@metafoo.de>
> Cc: Peter Meerwald-Stadler <pmeerw@pmeerw.net>
> Cc: Rob Herring <robh+dt@kernel.org>
> Reviewed-by: Douglas Anderson <dianders@chromium.org>
> [swboyd@chromium.org: Add both regulators and make them optional]
> Signed-off-by: Stephen Boyd <swboyd@chromium.org>
> Reviewed-by: Rob Herring <robh@kernel.org>
> ---
I'm not totally sold on the io-channel-cells being required
but lets leave it there.

Applied to the togreg branch of iio.git and pushed out as testing
for the autobuilders to poke at it.

Thanks,

Jonathan

> 
> Changes in v5: None
> Changes in v4: None
> Changes in v3: None
> Changes in v2:
>  - Added #io-channel-cells as a required property
> 
>  .../iio/proximity/semtech,sx9310.yaml         | 65 +++++++++++++++++++
>  1 file changed, 65 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/iio/proximity/semtech,sx9310.yaml
> 
> diff --git a/Documentation/devicetree/bindings/iio/proximity/semtech,sx9310.yaml b/Documentation/devicetree/bindings/iio/proximity/semtech,sx9310.yaml
> new file mode 100644
> index 00000000000000..5739074d3592fe
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/iio/proximity/semtech,sx9310.yaml
> @@ -0,0 +1,65 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/iio/proximity/semtech,sx9310.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Semtech's SX9310 capacitive proximity sensor
> +
> +maintainers:
> +  - Daniel Campello <campello@chromium.org>
> +
> +description: |
> +  Semtech's SX9310/SX9311 capacitive proximity/button solution.
> +
> +  Specifications about the devices can be found at:
> +  https://www.semtech.com/products/smart-sensing/sar-sensors/sx9310
> +
> +properties:
> +  compatible:
> +    enum:
> +      - semtech,sx9310
> +      - semtech,sx9311
> +
> +  reg:
> +    maxItems: 1
> +
> +  interrupts:
> +    description:
> +      The sole interrupt generated by the device used to announce the
> +      preceding reading request has finished and that data is
> +      available or that a close/far proximity event has happened.
> +    maxItems: 1
> +
> +  vdd-supply:
> +    description: Main power supply
> +
> +  svdd-supply:
> +    description: Host interface power supply
> +
> +  "#io-channel-cells":
> +    const: 1
> +
> +required:
> +  - compatible
> +  - reg
> +  - "#io-channel-cells"
> +
> +additionalProperties: false
> +
> +examples:
> +  - |
> +    #include <dt-bindings/interrupt-controller/irq.h>
> +    i2c {
> +      #address-cells = <1>;
> +      #size-cells = <0>;
> +      proximity@28 {
> +        compatible = "semtech,sx9310";
> +        reg = <0x28>;
> +        interrupt-parent = <&pio>;
> +        interrupts = <5 IRQ_TYPE_LEVEL_LOW 5>;
> +        vdd-supply = <&pp3300_a>;
> +        svdd-supply = <&pp1800_prox>;
> +        #io-channel-cells = <1>;
> +      };
> +    };


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v5 02/15] iio: sx9310: Update macros declarations
  2020-08-03 23:58 ` [PATCH v5 02/15] iio: sx9310: Update macros declarations Daniel Campello
@ 2020-08-06 18:15   ` Jonathan Cameron
  0 siblings, 0 replies; 28+ messages in thread
From: Jonathan Cameron @ 2020-08-06 18:15 UTC (permalink / raw)
  To: Daniel Campello
  Cc: LKML, LKML, Stephen Boyd, Andy Shevchenko, Douglas Anderson,
	Gwendal Grignou, Hartmut Knaack, Lars-Peter Clausen,
	Peter Meerwald-Stadler, linux-iio

On Mon,  3 Aug 2020 17:58:02 -0600
Daniel Campello <campello@chromium.org> wrote:

> Follows spec sheet for macro declarations.
> 
> Signed-off-by: Daniel Campello <campello@chromium.org>
> Reviewed-by: Stephen Boyd <swboyd@chromium.org>
Applied,

Thanks,

Jonathan

> ---
> 
> Changes in v5:
>  - Added #include <linux/bitfield.h>
> 
> Changes in v4:
>  - Updated macro SX9310_REG_STAT1_COMPSTAT_MASK at call site.
>  - Use FIELD_GET/FIELD_PREP instead of manual shift.
> 
> Changes in v3: None
> Changes in v2: None
> 
>  drivers/iio/proximity/sx9310.c | 146 +++++++++++++++------------------
>  1 file changed, 68 insertions(+), 78 deletions(-)
> 
> diff --git a/drivers/iio/proximity/sx9310.c b/drivers/iio/proximity/sx9310.c
> index d161f3061e353d..d7c77fc661ba86 100644
> --- a/drivers/iio/proximity/sx9310.c
> +++ b/drivers/iio/proximity/sx9310.c
> @@ -11,6 +11,7 @@
>   */
>  
>  #include <linux/acpi.h>
> +#include <linux/bitfield.h>
>  #include <linux/delay.h>
>  #include <linux/i2c.h>
>  #include <linux/irq.h>
> @@ -33,45 +34,44 @@
>  #define SX9310_REG_IRQ_SRC				0x00
>  #define SX9310_REG_STAT0				0x01
>  #define SX9310_REG_STAT1				0x02
> +#define SX9310_REG_STAT1_COMPSTAT_MASK			GENMASK(3, 0)
>  #define SX9310_REG_IRQ_MSK				0x03
>  #define   SX9310_CONVDONE_IRQ				BIT(3)
>  #define   SX9310_FAR_IRQ				BIT(5)
>  #define   SX9310_CLOSE_IRQ				BIT(6)
> -#define   SX9310_EVENT_IRQ				(SX9310_FAR_IRQ | \
> -							 SX9310_CLOSE_IRQ)
>  #define SX9310_REG_IRQ_FUNC				0x04
>  
>  #define SX9310_REG_PROX_CTRL0				0x10
> -#define   SX9310_REG_PROX_CTRL0_PROXSTAT2		0x10
> -#define   SX9310_REG_PROX_CTRL0_EN_MASK			0x0F
> +#define   SX9310_REG_PROX_CTRL0_SENSOREN_MASK		GENMASK(3, 0)
> +#define   SX9310_REG_PROX_CTRL0_SCANPERIOD_MASK		GENMASK(7, 4)
> +#define   SX9310_REG_PROX_CTRL0_SCANPERIOD_15MS		0x01
>  #define SX9310_REG_PROX_CTRL1				0x11
>  #define SX9310_REG_PROX_CTRL2				0x12
> -#define   SX9310_REG_PROX_CTRL2_COMBMODE_ALL		0x80
> -#define   SX9310_REG_PROX_CTRL2_SHIELDEN_DYNAMIC	0x04
> +#define   SX9310_REG_PROX_CTRL2_COMBMODE_CS1_CS2	(0x02 << 6)
> +#define   SX9310_REG_PROX_CTRL2_SHIELDEN_DYNAMIC	(0x01 << 2)
>  #define SX9310_REG_PROX_CTRL3				0x13
> -#define   SX9310_REG_PROX_CTRL3_GAIN0_X8		0x0c
> +#define   SX9310_REG_PROX_CTRL3_GAIN0_X8		(0x03 << 2)
>  #define   SX9310_REG_PROX_CTRL3_GAIN12_X4		0x02
>  #define SX9310_REG_PROX_CTRL4				0x14
>  #define   SX9310_REG_PROX_CTRL4_RESOLUTION_FINEST	0x07
>  #define SX9310_REG_PROX_CTRL5				0x15
> -#define   SX9310_REG_PROX_CTRL5_RANGE_SMALL		0xc0
> -#define   SX9310_REG_PROX_CTRL5_STARTUPSENS_CS1		0x04
> +#define   SX9310_REG_PROX_CTRL5_RANGE_SMALL		(0x03 << 6)
> +#define   SX9310_REG_PROX_CTRL5_STARTUPSENS_CS1		(0x01 << 2)
>  #define   SX9310_REG_PROX_CTRL5_RAWFILT_1P25		0x02
>  #define SX9310_REG_PROX_CTRL6				0x16
> -#define   SX9310_REG_PROX_CTRL6_COMP_COMMON		0x20
> +#define   SX9310_REG_PROX_CTRL6_AVGTHRESH_DEFAULT	0x20
>  #define SX9310_REG_PROX_CTRL7				0x17
> -#define   SX9310_REG_PROX_CTRL7_AVGNEGFILT_2		0x08
> +#define   SX9310_REG_PROX_CTRL7_AVGNEGFILT_2		(0x01 << 3)
>  #define   SX9310_REG_PROX_CTRL7_AVGPOSFILT_512		0x05
>  #define SX9310_REG_PROX_CTRL8				0x18
>  #define SX9310_REG_PROX_CTRL9				0x19
> -#define   SX9310_REG_PROX_CTRL8_9_PTHRESH12_28		0x40
> -#define   SX9310_REG_PROX_CTRL8_9_PTHRESH_96		0x88
> +#define   SX9310_REG_PROX_CTRL8_9_PTHRESH_28		(0x08 << 3)
> +#define   SX9310_REG_PROX_CTRL8_9_PTHRESH_96		(0x11 << 3)
>  #define   SX9310_REG_PROX_CTRL8_9_BODYTHRESH_900	0x03
>  #define   SX9310_REG_PROX_CTRL8_9_BODYTHRESH_1500	0x05
>  #define SX9310_REG_PROX_CTRL10				0x1a
> -#define   SX9310_REG_PROX_CTRL10_HYST_6PCT		0x10
> -#define   SX9310_REG_PROX_CTRL10_CLOSE_DEBOUNCE_8	0x12
> -#define   SX9310_REG_PROX_CTRL10_FAR_DEBOUNCE_8		0x03
> +#define   SX9310_REG_PROX_CTRL10_HYST_6PCT		(0x01 << 4)
> +#define   SX9310_REG_PROX_CTRL10_FAR_DEBOUNCE_2		0x01
>  #define SX9310_REG_PROX_CTRL11				0x1b
>  #define SX9310_REG_PROX_CTRL12				0x1c
>  #define SX9310_REG_PROX_CTRL13				0x1d
> @@ -82,8 +82,8 @@
>  #define SX9310_REG_PROX_CTRL18				0x22
>  #define SX9310_REG_PROX_CTRL19				0x23
>  #define SX9310_REG_SAR_CTRL0				0x2a
> -#define   SX9310_REG_SAR_CTRL0_SARDEB_4_SAMPLES		0x40
> -#define   SX9310_REG_SAR_CTRL0_SARHYST_8		0x10
> +#define   SX9310_REG_SAR_CTRL0_SARDEB_4_SAMPLES		(0x02 << 5)
> +#define   SX9310_REG_SAR_CTRL0_SARHYST_8		(0x02 << 3)
>  #define SX9310_REG_SAR_CTRL1				0x2b
>  /* Each increment of the slope register is 0.0078125. */
>  #define   SX9310_REG_SAR_CTRL1_SLOPE(_hnslope)		(_hnslope / 78125)
> @@ -107,7 +107,7 @@
>  #define SX9310_REG_SAR_MSB				0x39
>  #define SX9310_REG_SAR_LSB				0x3a
>  
> -#define SX9310_REG_I2CADDR				0x40
> +#define SX9310_REG_I2C_ADDR				0x40
>  #define SX9310_REG_PAUSE				0x41
>  #define SX9310_REG_WHOAMI				0x42
>  #define   SX9310_WHOAMI_VALUE				0x01
> @@ -116,14 +116,9 @@
>  #define SX9310_REG_RESET				0x7f
>  #define   SX9310_SOFT_RESET				0xde
>  
> -#define SX9310_SCAN_PERIOD_MASK				GENMASK(7, 4)
> -#define SX9310_SCAN_PERIOD_SHIFT			4
> -
> -#define SX9310_COMPSTAT_MASK				GENMASK(3, 0)
>  
>  /* 4 hardware channels, as defined in STAT0: COMB, CS2, CS1 and CS0. */
>  #define SX9310_NUM_CHANNELS				4
> -#define SX9310_CHAN_ENABLED_MASK			GENMASK(3, 0)
>  
>  struct sx9310_data {
>  	/* Serialize access to registers and channel configuration */
> @@ -251,7 +246,7 @@ static const struct regmap_range sx9310_readable_reg_ranges[] = {
>  	regmap_reg_range(SX9310_REG_PROX_CTRL0, SX9310_REG_PROX_CTRL19),
>  	regmap_reg_range(SX9310_REG_SAR_CTRL0, SX9310_REG_SAR_CTRL2),
>  	regmap_reg_range(SX9310_REG_SENSOR_SEL, SX9310_REG_SAR_LSB),
> -	regmap_reg_range(SX9310_REG_I2CADDR, SX9310_REG_WHOAMI),
> +	regmap_reg_range(SX9310_REG_I2C_ADDR, SX9310_REG_WHOAMI),
>  	regmap_reg_range(SX9310_REG_RESET, SX9310_REG_RESET),
>  };
>  
> @@ -292,7 +287,7 @@ static int sx9310_update_chan_en(struct sx9310_data *data,
>  
>  	if ((data->chan_read | data->chan_event) != (chan_read | chan_event)) {
>  		ret = regmap_update_bits(data->regmap, SX9310_REG_PROX_CTRL0,
> -					 SX9310_CHAN_ENABLED_MASK,
> +					 SX9310_REG_PROX_CTRL0_SENSOREN_MASK,
>  					 chan_read | chan_event);
>  		if (ret)
>  			return ret;
> @@ -361,7 +356,7 @@ static int sx9310_wait_for_sample(struct sx9310_data *data)
>  	if (ret < 0)
>  		return ret;
>  
> -	val = (val & SX9310_SCAN_PERIOD_MASK) >> SX9310_SCAN_PERIOD_SHIFT;
> +	val = FIELD_GET(SX9310_REG_PROX_CTRL0_SCANPERIOD_MASK, val);
>  
>  	msleep(sx9310_scan_period_table[val]);
>  
> @@ -435,7 +430,7 @@ static int sx9310_read_samp_freq(struct sx9310_data *data, int *val, int *val2)
>  	if (ret < 0)
>  		return ret;
>  
> -	regval = (regval & SX9310_SCAN_PERIOD_MASK) >> SX9310_SCAN_PERIOD_SHIFT;
> +	regval = FIELD_GET(SX9310_REG_PROX_CTRL0_SCANPERIOD_MASK, regval);
>  	*val = sx9310_samp_freq_table[regval].val;
>  	*val2 = sx9310_samp_freq_table[regval].val2;
>  
> @@ -482,9 +477,10 @@ static int sx9310_set_samp_freq(struct sx9310_data *data, int val, int val2)
>  
>  	mutex_lock(&data->mutex);
>  
> -	ret = regmap_update_bits(data->regmap, SX9310_REG_PROX_CTRL0,
> -				 SX9310_SCAN_PERIOD_MASK,
> -				 i << SX9310_SCAN_PERIOD_SHIFT);
> +	ret = regmap_update_bits(
> +		data->regmap, SX9310_REG_PROX_CTRL0,
> +		SX9310_REG_PROX_CTRL0_SCANPERIOD_MASK,
> +		FIELD_PREP(SX9310_REG_PROX_CTRL0_SCANPERIOD_MASK, i));
>  
>  	mutex_unlock(&data->mutex);
>  
> @@ -572,7 +568,7 @@ static irqreturn_t sx9310_irq_thread_handler(int irq, void *private)
>  		goto out;
>  	}
>  
> -	if (val & SX9310_EVENT_IRQ)
> +	if (val & (SX9310_FAR_IRQ | SX9310_CLOSE_IRQ))
>  		sx9310_push_events(indio_dev);
>  
>  	if (val & SX9310_CONVDONE_IRQ)
> @@ -600,6 +596,7 @@ static int sx9310_write_event_config(struct iio_dev *indio_dev,
>  				     enum iio_event_direction dir, int state)
>  {
>  	struct sx9310_data *data = iio_priv(indio_dev);
> +	unsigned int eventirq = SX9310_FAR_IRQ | SX9310_CLOSE_IRQ;
>  	int ret;
>  
>  	/* If the state hasn't changed, there's nothing to do. */
> @@ -612,7 +609,7 @@ static int sx9310_write_event_config(struct iio_dev *indio_dev,
>  		if (ret < 0)
>  			goto out_unlock;
>  		if (!(data->chan_event & ~BIT(chan->channel))) {
> -			ret = sx9310_enable_irq(data, SX9310_EVENT_IRQ);
> +			ret = sx9310_enable_irq(data, eventirq);
>  			if (ret < 0)
>  				sx9310_put_event_channel(data, chan->channel);
>  		}
> @@ -621,7 +618,7 @@ static int sx9310_write_event_config(struct iio_dev *indio_dev,
>  		if (ret < 0)
>  			goto out_unlock;
>  		if (!data->chan_event) {
> -			ret = sx9310_disable_irq(data, SX9310_EVENT_IRQ);
> +			ret = sx9310_disable_irq(data, eventirq);
>  			if (ret < 0)
>  				sx9310_get_event_channel(data, chan->channel);
>  		}
> @@ -746,53 +743,46 @@ struct sx9310_reg_default {
>  	u8 def;
>  };
>  
> -#define SX_INIT(_reg, _def)			\
> -	{					\
> -		.reg = SX9310_REG_##_reg,	\
> -		.def = _def,			\
> -	}
> -
>  static const struct sx9310_reg_default sx9310_default_regs[] = {
> -	SX_INIT(IRQ_MSK, 0x00),
> -	SX_INIT(IRQ_FUNC, 0x00),
> +	{ SX9310_REG_IRQ_MSK, 0x00 },
> +	{ SX9310_REG_IRQ_FUNC, 0x00 },
>  	/*
>  	 * The lower 4 bits should not be set as it enable sensors measurements.
>  	 * Turning the detection on before the configuration values are set to
>  	 * good values can cause the device to return erroneous readings.
>  	 */
> -	SX_INIT(PROX_CTRL0, SX9310_REG_PROX_CTRL0_PROXSTAT2),
> -	SX_INIT(PROX_CTRL1, 0x00),
> -	SX_INIT(PROX_CTRL2, SX9310_REG_PROX_CTRL2_COMBMODE_ALL |
> -			    SX9310_REG_PROX_CTRL2_SHIELDEN_DYNAMIC),
> -	SX_INIT(PROX_CTRL3, SX9310_REG_PROX_CTRL3_GAIN0_X8 |
> -			    SX9310_REG_PROX_CTRL3_GAIN12_X4),
> -	SX_INIT(PROX_CTRL4, SX9310_REG_PROX_CTRL4_RESOLUTION_FINEST),
> -	SX_INIT(PROX_CTRL5, SX9310_REG_PROX_CTRL5_RANGE_SMALL |
> -			    SX9310_REG_PROX_CTRL5_STARTUPSENS_CS1 |
> -			    SX9310_REG_PROX_CTRL5_RAWFILT_1P25),
> -	SX_INIT(PROX_CTRL6, SX9310_REG_PROX_CTRL6_COMP_COMMON),
> -	SX_INIT(PROX_CTRL7, SX9310_REG_PROX_CTRL7_AVGNEGFILT_2 |
> -			    SX9310_REG_PROX_CTRL7_AVGPOSFILT_512),
> -	SX_INIT(PROX_CTRL8, SX9310_REG_PROX_CTRL8_9_PTHRESH_96 |
> -			    SX9310_REG_PROX_CTRL8_9_BODYTHRESH_1500),
> -	SX_INIT(PROX_CTRL9, SX9310_REG_PROX_CTRL8_9_PTHRESH12_28 |
> -			    SX9310_REG_PROX_CTRL8_9_BODYTHRESH_900),
> -	SX_INIT(PROX_CTRL10, SX9310_REG_PROX_CTRL10_HYST_6PCT |
> -			     SX9310_REG_PROX_CTRL10_CLOSE_DEBOUNCE_8 |
> -			     SX9310_REG_PROX_CTRL10_FAR_DEBOUNCE_8),
> -	SX_INIT(PROX_CTRL11, 0x00),
> -	SX_INIT(PROX_CTRL12, 0x00),
> -	SX_INIT(PROX_CTRL13, 0x00),
> -	SX_INIT(PROX_CTRL14, 0x00),
> -	SX_INIT(PROX_CTRL15, 0x00),
> -	SX_INIT(PROX_CTRL16, 0x00),
> -	SX_INIT(PROX_CTRL17, 0x00),
> -	SX_INIT(PROX_CTRL18, 0x00),
> -	SX_INIT(PROX_CTRL19, 0x00),
> -	SX_INIT(SAR_CTRL0, SX9310_REG_SAR_CTRL0_SARDEB_4_SAMPLES |
> -			   SX9310_REG_SAR_CTRL0_SARHYST_8),
> -	SX_INIT(SAR_CTRL1, SX9310_REG_SAR_CTRL1_SLOPE(10781250)),
> -	SX_INIT(SAR_CTRL2, SX9310_REG_SAR_CTRL2_SAROFFSET_DEFAULT),
> +	{ SX9310_REG_PROX_CTRL0, SX9310_REG_PROX_CTRL0_SCANPERIOD_15MS },
> +	{ SX9310_REG_PROX_CTRL1, 0x00 },
> +	{ SX9310_REG_PROX_CTRL2, SX9310_REG_PROX_CTRL2_COMBMODE_CS1_CS2 |
> +				 SX9310_REG_PROX_CTRL2_SHIELDEN_DYNAMIC },
> +	{ SX9310_REG_PROX_CTRL3, SX9310_REG_PROX_CTRL3_GAIN0_X8 |
> +				 SX9310_REG_PROX_CTRL3_GAIN12_X4 },
> +	{ SX9310_REG_PROX_CTRL4, SX9310_REG_PROX_CTRL4_RESOLUTION_FINEST },
> +	{ SX9310_REG_PROX_CTRL5, SX9310_REG_PROX_CTRL5_RANGE_SMALL |
> +				 SX9310_REG_PROX_CTRL5_STARTUPSENS_CS1 |
> +				 SX9310_REG_PROX_CTRL5_RAWFILT_1P25 },
> +	{ SX9310_REG_PROX_CTRL6, SX9310_REG_PROX_CTRL6_AVGTHRESH_DEFAULT },
> +	{ SX9310_REG_PROX_CTRL7, SX9310_REG_PROX_CTRL7_AVGNEGFILT_2 |
> +				 SX9310_REG_PROX_CTRL7_AVGPOSFILT_512 },
> +	{ SX9310_REG_PROX_CTRL8, SX9310_REG_PROX_CTRL8_9_PTHRESH_96 |
> +				 SX9310_REG_PROX_CTRL8_9_BODYTHRESH_1500 },
> +	{ SX9310_REG_PROX_CTRL9, SX9310_REG_PROX_CTRL8_9_PTHRESH_28 |
> +				 SX9310_REG_PROX_CTRL8_9_BODYTHRESH_900 },
> +	{ SX9310_REG_PROX_CTRL10, SX9310_REG_PROX_CTRL10_HYST_6PCT |
> +				  SX9310_REG_PROX_CTRL10_FAR_DEBOUNCE_2 },
> +	{ SX9310_REG_PROX_CTRL11, 0x00 },
> +	{ SX9310_REG_PROX_CTRL12, 0x00 },
> +	{ SX9310_REG_PROX_CTRL13, 0x00 },
> +	{ SX9310_REG_PROX_CTRL14, 0x00 },
> +	{ SX9310_REG_PROX_CTRL15, 0x00 },
> +	{ SX9310_REG_PROX_CTRL16, 0x00 },
> +	{ SX9310_REG_PROX_CTRL17, 0x00 },
> +	{ SX9310_REG_PROX_CTRL18, 0x00 },
> +	{ SX9310_REG_PROX_CTRL19, 0x00 },
> +	{ SX9310_REG_SAR_CTRL0, SX9310_REG_SAR_CTRL0_SARDEB_4_SAMPLES |
> +				SX9310_REG_SAR_CTRL0_SARHYST_8 },
> +	{ SX9310_REG_SAR_CTRL1, SX9310_REG_SAR_CTRL1_SLOPE(10781250) },
> +	{ SX9310_REG_SAR_CTRL2, SX9310_REG_SAR_CTRL2_SAROFFSET_DEFAULT },
>  };
>  
>  /* Activate all channels and perform an initial compensation. */
> @@ -809,7 +799,7 @@ static int sx9310_init_compensation(struct iio_dev *indio_dev)
>  
>  	/* run the compensation phase on all channels */
>  	ret = regmap_write(data->regmap, SX9310_REG_PROX_CTRL0,
> -			   ctrl0 | SX9310_REG_PROX_CTRL0_EN_MASK);
> +			   ctrl0 | SX9310_REG_PROX_CTRL0_SENSOREN_MASK);
>  	if (ret < 0)
>  		return ret;
>  
> @@ -818,7 +808,7 @@ static int sx9310_init_compensation(struct iio_dev *indio_dev)
>  		ret = regmap_read(data->regmap, SX9310_REG_STAT1, &val);
>  		if (ret < 0)
>  			goto out;
> -		if (!(val & SX9310_COMPSTAT_MASK))
> +		if (!(val & SX9310_REG_STAT1_COMPSTAT_MASK))
>  			break;
>  	}
>  
> @@ -992,7 +982,7 @@ static int __maybe_unused sx9310_suspend(struct device *dev)
>  	if (ret)
>  		goto out;
>  
> -	ctrl0 = data->suspend_ctrl0 & ~SX9310_REG_PROX_CTRL0_EN_MASK;
> +	ctrl0 = data->suspend_ctrl0 & ~SX9310_REG_PROX_CTRL0_SENSOREN_MASK;
>  	ret = regmap_write(data->regmap, SX9310_REG_PROX_CTRL0, ctrl0);
>  	if (ret)
>  		goto out;


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v5 04/15] iio: sx9310: Remove acpi and of table macros
  2020-08-03 23:58 ` [PATCH v5 04/15] iio: sx9310: Remove acpi and of table macros Daniel Campello
@ 2020-08-06 18:28   ` Jonathan Cameron
  0 siblings, 0 replies; 28+ messages in thread
From: Jonathan Cameron @ 2020-08-06 18:28 UTC (permalink / raw)
  To: Daniel Campello
  Cc: LKML, LKML, kbuild test robot, Andy Shevchenko, Stephen Boyd,
	Douglas Anderson, Enrico Granata, Hartmut Knaack,
	Lars-Peter Clausen, Peter Meerwald-Stadler, linux-iio

On Mon,  3 Aug 2020 17:58:04 -0600
Daniel Campello <campello@chromium.org> wrote:

> Avoids unused warnings due to acpi/of table macros.
> 
> Reported-by: kbuild test robot <lkp@intel.com>
> Signed-off-by: Daniel Campello <campello@chromium.org>
> Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
> Reviewed-by: Stephen Boyd <swboyd@chromium.org>
Applied,
> ---
> 
> Changes in v5: None
> Changes in v4: None
> Changes in v3: None
> Changes in v2:
>  - Added #include <linux/mod_devicetable.h>
> 
>  drivers/iio/proximity/sx9310.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/iio/proximity/sx9310.c b/drivers/iio/proximity/sx9310.c
> index dafee85018aa6d..9daf2b8591a0a0 100644
> --- a/drivers/iio/proximity/sx9310.c
> +++ b/drivers/iio/proximity/sx9310.c
> @@ -16,8 +16,8 @@
>  #include <linux/i2c.h>
>  #include <linux/irq.h>
>  #include <linux/kernel.h>
> +#include <linux/mod_devicetable.h>
>  #include <linux/module.h>
> -#include <linux/of.h>
>  #include <linux/pm.h>
>  #include <linux/regmap.h>
>  #include <linux/slab.h>
> @@ -1049,8 +1049,8 @@ MODULE_DEVICE_TABLE(i2c, sx9310_id);
>  static struct i2c_driver sx9310_driver = {
>  	.driver = {
>  		.name	= "sx9310",
> -		.acpi_match_table = ACPI_PTR(sx9310_acpi_match),
> -		.of_match_table = of_match_ptr(sx9310_of_match),
> +		.acpi_match_table = sx9310_acpi_match,
> +		.of_match_table = sx9310_of_match,
>  		.pm = &sx9310_pm_ops,
>  	},
>  	.probe		= sx9310_probe,


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v5 05/15] iio: sx9310: Change from .probe to .probe_new
  2020-08-03 23:58 ` [PATCH v5 05/15] iio: sx9310: Change from .probe to .probe_new Daniel Campello
@ 2020-08-06 18:29   ` Jonathan Cameron
  0 siblings, 0 replies; 28+ messages in thread
From: Jonathan Cameron @ 2020-08-06 18:29 UTC (permalink / raw)
  To: Daniel Campello
  Cc: LKML, LKML, Andy Shevchenko, Stephen Boyd, Douglas Anderson,
	Hartmut Knaack, Lars-Peter Clausen, Peter Meerwald-Stadler,
	linux-iio

On Mon,  3 Aug 2020 17:58:05 -0600
Daniel Campello <campello@chromium.org> wrote:

> Uses .probe_new in place of .probe. Also uses device_get_match_data()
> for whoami matching.
> 
> Signed-off-by: Daniel Campello <campello@chromium.org>
> Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
> Reviewed-by: Stephen Boyd <swboyd@chromium.org>
Applied,

Thanks,

Jonathan

> ---
> 
> Changes in v5: None
> Changes in v4: None
> Changes in v3: None
> Changes in v2:
>  - Added '\n' to dev_err()
> 
>  drivers/iio/proximity/sx9310.c | 39 ++++++++++++----------------------
>  1 file changed, 14 insertions(+), 25 deletions(-)
> 
> diff --git a/drivers/iio/proximity/sx9310.c b/drivers/iio/proximity/sx9310.c
> index 9daf2b8591a0a0..66ecdd309e0ddc 100644
> --- a/drivers/iio/proximity/sx9310.c
> +++ b/drivers/iio/proximity/sx9310.c
> @@ -139,7 +139,7 @@ struct sx9310_data {
>  	struct completion completion;
>  	unsigned int chan_read, chan_event;
>  	int channel_users[SX9310_NUM_CHANNELS];
> -	int whoami;
> +	unsigned int whoami;
>  };
>  
>  static const struct iio_event_spec sx9310_events[] = {
> @@ -858,24 +858,15 @@ static int sx9310_init_device(struct iio_dev *indio_dev)
>  
>  static int sx9310_set_indio_dev_name(struct device *dev,
>  				     struct iio_dev *indio_dev,
> -				     const struct i2c_device_id *id, int whoami)
> +				     unsigned int whoami)
>  {
> -	const struct acpi_device_id *acpi_id;
> -
> -	/* id will be NULL when enumerated via ACPI */
> -	if (id) {
> -		if (id->driver_data != whoami)
> -			dev_err(dev, "WHOAMI does not match i2c_device_id: %s",
> -				id->name);
> -	} else if (ACPI_HANDLE(dev)) {
> -		acpi_id = acpi_match_device(dev->driver->acpi_match_table, dev);
> -		if (!acpi_id)
> -			return -ENODEV;
> -		if (acpi_id->driver_data != whoami)
> -			dev_err(dev, "WHOAMI does not match acpi_device_id: %s",
> -				acpi_id->id);
> -	} else
> +	unsigned int long ddata;
> +
> +	ddata = (uintptr_t)device_get_match_data(dev);
> +	if (ddata != whoami) {
> +		dev_err(dev, "WHOAMI does not match device data: %u\n", whoami);
>  		return -ENODEV;
> +	}
>  
>  	switch (whoami) {
>  	case SX9310_WHOAMI_VALUE:
> @@ -885,15 +876,14 @@ static int sx9310_set_indio_dev_name(struct device *dev,
>  		indio_dev->name = "sx9311";
>  		break;
>  	default:
> -		dev_err(dev, "unexpected WHOAMI response: %u", whoami);
> +		dev_err(dev, "unexpected WHOAMI response: %u\n", whoami);
>  		return -ENODEV;
>  	}
>  
>  	return 0;
>  }
>  
> -static int sx9310_probe(struct i2c_client *client,
> -			const struct i2c_device_id *id)
> +static int sx9310_probe(struct i2c_client *client)
>  {
>  	int ret;
>  	struct iio_dev *indio_dev;
> @@ -919,8 +909,7 @@ static int sx9310_probe(struct i2c_client *client,
>  		return ret;
>  	}
>  
> -	ret = sx9310_set_indio_dev_name(&client->dev, indio_dev, id,
> -					data->whoami);
> +	ret = sx9310_set_indio_dev_name(&client->dev, indio_dev, data->whoami);
>  	if (ret < 0)
>  		return ret;
>  
> @@ -1033,8 +1022,8 @@ static const struct acpi_device_id sx9310_acpi_match[] = {
>  MODULE_DEVICE_TABLE(acpi, sx9310_acpi_match);
>  
>  static const struct of_device_id sx9310_of_match[] = {
> -	{ .compatible = "semtech,sx9310" },
> -	{ .compatible = "semtech,sx9311" },
> +	{ .compatible = "semtech,sx9310", (void *)SX9310_WHOAMI_VALUE },
> +	{ .compatible = "semtech,sx9311", (void *)SX9311_WHOAMI_VALUE },
>  	{},
>  };
>  MODULE_DEVICE_TABLE(of, sx9310_of_match);
> @@ -1053,7 +1042,7 @@ static struct i2c_driver sx9310_driver = {
>  		.of_match_table = sx9310_of_match,
>  		.pm = &sx9310_pm_ops,
>  	},
> -	.probe		= sx9310_probe,
> +	.probe_new	= sx9310_probe,
>  	.id_table	= sx9310_id,
>  };
>  module_i2c_driver(sx9310_driver);


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v5 06/15] iio: sx9310: Fixes various memory handling
  2020-08-03 23:58 ` [PATCH v5 06/15] iio: sx9310: Fixes various memory handling Daniel Campello
@ 2020-08-06 18:29   ` Jonathan Cameron
  0 siblings, 0 replies; 28+ messages in thread
From: Jonathan Cameron @ 2020-08-06 18:29 UTC (permalink / raw)
  To: Daniel Campello
  Cc: LKML, LKML, Andy Shevchenko, Douglas Anderson, Enrico Granata,
	Hartmut Knaack, Lars-Peter Clausen, Peter Meerwald-Stadler,
	Stephen Boyd, linux-iio

On Mon,  3 Aug 2020 17:58:06 -0600
Daniel Campello <campello@chromium.org> wrote:

> Makes use __aligned(8) to ensure that the timestamp is correctly aligned
> when we call io_push_to_buffers_with_timestamp().
> Also makes use of sizeof() for regmap_bulk_read instead of static value.
> 
> Signed-off-by: Daniel Campello <campello@chromium.org>
> Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Applied

> ---
> 
> Changes in v5:
>  - Really use a pointer to buffer struct on
> iio_push_to_buffers_with_timestamp().
> 
> Changes in v4:
>  - Use pointer to buffer struct on iio_push_to_buffers_with_timestamp().
> 
> Changes in v3:
>  - Changed buffer to struct type to align timestamp memory properly.
> 
> Changes in v2:
>  - Fixed commit message from "iio: sx9310: Align memory"
> 
>  drivers/iio/proximity/sx9310.c | 13 ++++++++-----
>  1 file changed, 8 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/iio/proximity/sx9310.c b/drivers/iio/proximity/sx9310.c
> index 66ecdd309e0ddc..127b1ba79e2dea 100644
> --- a/drivers/iio/proximity/sx9310.c
> +++ b/drivers/iio/proximity/sx9310.c
> @@ -132,8 +132,11 @@ struct sx9310_data {
>  	 */
>  	bool prox_stat[SX9310_NUM_CHANNELS];
>  	bool trigger_enabled;
> -	__be16 buffer[SX9310_NUM_CHANNELS +
> -		      4]; /* 64-bit data + 64-bit timestamp */
> +	/* Ensure correct alignment of timestamp when present. */
> +	struct {
> +		__be16 channels[SX9310_NUM_CHANNELS];
> +		s64 ts __aligned(8);
> +	} buffer;
>  	/* Remember enabled channels and sample rate during suspend. */
>  	unsigned int suspend_ctrl0;
>  	struct completion completion;
> @@ -344,7 +347,7 @@ static int sx9310_read_prox_data(struct sx9310_data *data,
>  	if (ret < 0)
>  		return ret;
>  
> -	return regmap_bulk_read(data->regmap, chan->address, val, 2);
> +	return regmap_bulk_read(data->regmap, chan->address, val, sizeof(*val));
>  }
>  
>  /*
> @@ -694,10 +697,10 @@ static irqreturn_t sx9310_trigger_handler(int irq, void *private)
>  		if (ret < 0)
>  			goto out;
>  
> -		data->buffer[i++] = val;
> +		data->buffer.channels[i++] = val;
>  	}
>  
> -	iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
> +	iio_push_to_buffers_with_timestamp(indio_dev, &data->buffer,
>  					   pf->timestamp);
>  
>  out:


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v5 07/15] iio: sx9310: Use long instead of int for channel bitmaps
  2020-08-03 23:58 ` [PATCH v5 07/15] iio: sx9310: Use long instead of int for channel bitmaps Daniel Campello
@ 2020-08-06 18:30   ` Jonathan Cameron
  2020-08-16  9:36     ` Jonathan Cameron
  0 siblings, 1 reply; 28+ messages in thread
From: Jonathan Cameron @ 2020-08-06 18:30 UTC (permalink / raw)
  To: Daniel Campello
  Cc: LKML, LKML, Andy Shevchenko, Stephen Boyd, Douglas Anderson,
	Hartmut Knaack, Lars-Peter Clausen, Peter Meerwald-Stadler,
	linux-iio

On Mon,  3 Aug 2020 17:58:07 -0600
Daniel Campello <campello@chromium.org> wrote:

> Uses for_each_set_bit() macro to loop over channel bitmaps.
> 
> Signed-off-by: Daniel Campello <campello@chromium.org>
> Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
> Reviewed-by: Stephen Boyd <swboyd@chromium.org>
Applied,

Thanks,

Jonathan

> ---
> 
> Changes in v5: None
> Changes in v4: None
> Changes in v3:
>  - Added static assert for number of channels.
> 
> Changes in v2:
>  - Changed prox_stat to chan_prox_stat bitmap.
> 
>  drivers/iio/proximity/sx9310.c | 39 ++++++++++++++++++----------------
>  1 file changed, 21 insertions(+), 18 deletions(-)
> 
> diff --git a/drivers/iio/proximity/sx9310.c b/drivers/iio/proximity/sx9310.c
> index 127b1ba79e2dea..f78500b8a5841e 100644
> --- a/drivers/iio/proximity/sx9310.c
> +++ b/drivers/iio/proximity/sx9310.c
> @@ -119,6 +119,7 @@
>  
>  /* 4 hardware channels, as defined in STAT0: COMB, CS2, CS1 and CS0. */
>  #define SX9310_NUM_CHANNELS				4
> +static_assert(SX9310_NUM_CHANNELS < BITS_PER_LONG);
>  
>  struct sx9310_data {
>  	/* Serialize access to registers and channel configuration */
> @@ -130,7 +131,7 @@ struct sx9310_data {
>  	 * Last reading of the proximity status for each channel.
>  	 * We only send an event to user space when this changes.
>  	 */
> -	bool prox_stat[SX9310_NUM_CHANNELS];
> +	unsigned long chan_prox_stat;
>  	bool trigger_enabled;
>  	/* Ensure correct alignment of timestamp when present. */
>  	struct {
> @@ -140,7 +141,8 @@ struct sx9310_data {
>  	/* Remember enabled channels and sample rate during suspend. */
>  	unsigned int suspend_ctrl0;
>  	struct completion completion;
> -	unsigned int chan_read, chan_event;
> +	unsigned long chan_read;
> +	unsigned long chan_event;
>  	int channel_users[SX9310_NUM_CHANNELS];
>  	unsigned int whoami;
>  };
> @@ -283,15 +285,16 @@ static const struct regmap_config sx9310_regmap_config = {
>  };
>  
>  static int sx9310_update_chan_en(struct sx9310_data *data,
> -				 unsigned int chan_read,
> -				 unsigned int chan_event)
> +				 unsigned long chan_read,
> +				 unsigned long chan_event)
>  {
>  	int ret;
> +	unsigned long channels = chan_read | chan_event;
>  
> -	if ((data->chan_read | data->chan_event) != (chan_read | chan_event)) {
> +	if ((data->chan_read | data->chan_event) != channels) {
>  		ret = regmap_update_bits(data->regmap, SX9310_REG_PROX_CTRL0,
>  					 SX9310_REG_PROX_CTRL0_SENSOREN_MASK,
> -					 chan_read | chan_event);
> +					 channels);
>  		if (ret)
>  			return ret;
>  	}
> @@ -532,6 +535,7 @@ static void sx9310_push_events(struct iio_dev *indio_dev)
>  	unsigned int val, chan;
>  	struct sx9310_data *data = iio_priv(indio_dev);
>  	s64 timestamp = iio_get_time_ns(indio_dev);
> +	unsigned long prox_changed;
>  
>  	/* Read proximity state on all channels */
>  	ret = regmap_read(data->regmap, SX9310_REG_STAT0, &val);
> @@ -540,24 +544,23 @@ static void sx9310_push_events(struct iio_dev *indio_dev)
>  		return;
>  	}
>  
> -	for (chan = 0; chan < SX9310_NUM_CHANNELS; chan++) {
> +	/*
> +	 * Only iterate over channels with changes on proximity status that have
> +	 * events enabled.
> +	 */
> +	prox_changed = (data->chan_prox_stat ^ val) & data->chan_event;
> +
> +	for_each_set_bit(chan, &prox_changed, SX9310_NUM_CHANNELS) {
>  		int dir;
>  		u64 ev;
> -		bool new_prox = val & BIT(chan);
> -
> -		if (!(data->chan_event & BIT(chan)))
> -			continue;
> -		if (new_prox == data->prox_stat[chan])
> -			/* No change on this channel. */
> -			continue;
>  
> -		dir = new_prox ? IIO_EV_DIR_FALLING : IIO_EV_DIR_RISING;
> +		dir = val & BIT(chan) ? IIO_EV_DIR_FALLING : IIO_EV_DIR_RISING;
>  		ev = IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY, chan,
>  					  IIO_EV_TYPE_THRESH, dir);
>  
>  		iio_push_event(indio_dev, ev, timestamp);
> -		data->prox_stat[chan] = new_prox;
>  	}
> +	data->chan_prox_stat = val;
>  }
>  
>  static irqreturn_t sx9310_irq_thread_handler(int irq, void *private)
> @@ -714,13 +717,13 @@ static irqreturn_t sx9310_trigger_handler(int irq, void *private)
>  static int sx9310_buffer_preenable(struct iio_dev *indio_dev)
>  {
>  	struct sx9310_data *data = iio_priv(indio_dev);
> -	unsigned int channels = 0;
> +	unsigned long channels = 0;
>  	int bit, ret;
>  
>  	mutex_lock(&data->mutex);
>  	for_each_set_bit(bit, indio_dev->active_scan_mask,
>  			 indio_dev->masklength)
> -		channels |= BIT(indio_dev->channels[bit].channel);
> +		__set_bit(indio_dev->channels[bit].channel, &channels);
>  
>  	ret = sx9310_update_chan_en(data, channels, data->chan_event);
>  	mutex_unlock(&data->mutex);


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v5 11/15] iio: sx9310: Use variable to hold &client->dev
  2020-08-03 23:58 ` [PATCH v5 11/15] iio: sx9310: Use variable to hold &client->dev Daniel Campello
@ 2020-08-06 18:38   ` Jonathan Cameron
  0 siblings, 0 replies; 28+ messages in thread
From: Jonathan Cameron @ 2020-08-06 18:38 UTC (permalink / raw)
  To: Daniel Campello
  Cc: LKML, LKML, Andy Shevchenko, Stephen Boyd, Douglas Anderson,
	Hartmut Knaack, Lars-Peter Clausen, Peter Meerwald-Stadler,
	linux-iio

On Mon,  3 Aug 2020 17:58:11 -0600
Daniel Campello <campello@chromium.org> wrote:

> Improves readability by storing &client->dev in a local variable.
> 
> Signed-off-by: Daniel Campello <campello@chromium.org>
> Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
> Reviewed-by: Stephen Boyd <swboyd@chromium.org>
This one needed some tweaking to apply as the parent is now
set by the core code.

Applied (and the ones before I didn't metion) to the togreg branch
of iio.git and pushed out as testing,

Thanks,

Jonathan

> ---
> 
> Changes in v5: None
> Changes in v4: None
> Changes in v3: None
> Changes in v2:
>  - Added '\n' to dev_err()
> 
>  drivers/iio/proximity/sx9310.c | 30 +++++++++++++++---------------
>  1 file changed, 15 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/iio/proximity/sx9310.c b/drivers/iio/proximity/sx9310.c
> index adb707e2d79612..589052d2d1146e 100644
> --- a/drivers/iio/proximity/sx9310.c
> +++ b/drivers/iio/proximity/sx9310.c
> @@ -887,11 +887,12 @@ static int sx9310_set_indio_dev_name(struct device *dev,
>  static int sx9310_probe(struct i2c_client *client)
>  {
>  	int ret;
> +	struct device *dev = &client->dev;
>  	struct iio_dev *indio_dev;
>  	struct sx9310_data *data;
>  
> -	indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
> -	if (indio_dev == NULL)
> +	indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
> +	if (!indio_dev)
>  		return -ENOMEM;
>  
>  	data = iio_priv(indio_dev);
> @@ -905,17 +906,16 @@ static int sx9310_probe(struct i2c_client *client)
>  
>  	ret = regmap_read(data->regmap, SX9310_REG_WHOAMI, &data->whoami);
>  	if (ret) {
> -		dev_err(&client->dev, "error in reading WHOAMI register: %d",
> -			ret);
> +		dev_err(dev, "error in reading WHOAMI register: %d\n", ret);
>  		return ret;
>  	}
>  
> -	ret = sx9310_set_indio_dev_name(&client->dev, indio_dev, data->whoami);
> +	ret = sx9310_set_indio_dev_name(dev, indio_dev, data->whoami);
>  	if (ret)
>  		return ret;
>  
> -	ACPI_COMPANION_SET(&indio_dev->dev, ACPI_COMPANION(&client->dev));
> -	indio_dev->dev.parent = &client->dev;
> +	ACPI_COMPANION_SET(&indio_dev->dev, ACPI_COMPANION(dev));
> +	indio_dev->dev.parent = dev;
>  	indio_dev->channels = sx9310_channels;
>  	indio_dev->num_channels = ARRAY_SIZE(sx9310_channels);
>  	indio_dev->info = &sx9310_info;
> @@ -927,7 +927,7 @@ static int sx9310_probe(struct i2c_client *client)
>  		return ret;
>  
>  	if (client->irq) {
> -		ret = devm_request_threaded_irq(&client->dev, client->irq,
> +		ret = devm_request_threaded_irq(dev, client->irq,
>  						sx9310_irq_handler,
>  						sx9310_irq_thread_handler,
>  						IRQF_TRIGGER_LOW | IRQF_ONESHOT,
> @@ -935,29 +935,29 @@ static int sx9310_probe(struct i2c_client *client)
>  		if (ret)
>  			return ret;
>  
> -		data->trig =
> -			devm_iio_trigger_alloc(&client->dev, "%s-dev%d",
> -					       indio_dev->name, indio_dev->id);
> +		data->trig = devm_iio_trigger_alloc(dev, "%s-dev%d",
> +						    indio_dev->name,
> +						    indio_dev->id);
>  		if (!data->trig)
>  			return -ENOMEM;
>  
> -		data->trig->dev.parent = &client->dev;
> +		data->trig->dev.parent = dev;
>  		data->trig->ops = &sx9310_trigger_ops;
>  		iio_trigger_set_drvdata(data->trig, indio_dev);
>  
> -		ret = devm_iio_trigger_register(&client->dev, data->trig);
> +		ret = devm_iio_trigger_register(dev, data->trig);
>  		if (ret)
>  			return ret;
>  	}
>  
> -	ret = devm_iio_triggered_buffer_setup(&client->dev, indio_dev,
> +	ret = devm_iio_triggered_buffer_setup(dev, indio_dev,
>  					      iio_pollfunc_store_time,
>  					      sx9310_trigger_handler,
>  					      &sx9310_buffer_setup_ops);
>  	if (ret)
>  		return ret;
>  
> -	return devm_iio_device_register(&client->dev, indio_dev);
> +	return devm_iio_device_register(dev, indio_dev);
>  }
>  
>  static int __maybe_unused sx9310_suspend(struct device *dev)


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v5 15/15] iio: sx9310: Use irq trigger flags from firmware
  2020-08-03 23:58 ` [PATCH v5 15/15] iio: sx9310: Use irq trigger flags from firmware Daniel Campello
@ 2020-08-06 18:42   ` Jonathan Cameron
  0 siblings, 0 replies; 28+ messages in thread
From: Jonathan Cameron @ 2020-08-06 18:42 UTC (permalink / raw)
  To: Daniel Campello
  Cc: LKML, LKML, Stephen Boyd, Andy Shevchenko, Douglas Anderson,
	Gwendal Grignou, Hartmut Knaack, Lars-Peter Clausen,
	Peter Meerwald-Stadler, linux-iio

On Mon,  3 Aug 2020 17:58:15 -0600
Daniel Campello <campello@chromium.org> wrote:

> From: Stephen Boyd <swboyd@chromium.org>
> 
> We shouldn't need to set default irq trigger flags here as the firmware
> should have properly indicated the trigger type, i.e. level low, in the
> DT or ACPI tables.
> 
> Signed-off-by: Stephen Boyd <swboyd@chromium.org>
> Signed-off-by: Daniel Campello <campello@chromium.org>
> Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Series all applied to the togreg branch of iio.git and pushed out as testing for
the autobuilders to play with it,

Thanks,

Jonathan

> ---
> 
> Changes in v5: None
> Changes in v4: None
> Changes in v3:
>  - Added irq trigger flags commit to the series.
> 
> Changes in v2: None
> 
>  drivers/iio/proximity/sx9310.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/iio/proximity/sx9310.c b/drivers/iio/proximity/sx9310.c
> index a68766708fb304..db97b5339d0eff 100644
> --- a/drivers/iio/proximity/sx9310.c
> +++ b/drivers/iio/proximity/sx9310.c
> @@ -948,7 +948,7 @@ static int sx9310_probe(struct i2c_client *client)
>  		ret = devm_request_threaded_irq(dev, client->irq,
>  						sx9310_irq_handler,
>  						sx9310_irq_thread_handler,
> -						IRQF_TRIGGER_LOW | IRQF_ONESHOT,
> +						IRQF_ONESHOT,
>  						"sx9310_event", indio_dev);
>  		if (ret)
>  			return ret;


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v5 07/15] iio: sx9310: Use long instead of int for channel bitmaps
  2020-08-06 18:30   ` Jonathan Cameron
@ 2020-08-16  9:36     ` Jonathan Cameron
  0 siblings, 0 replies; 28+ messages in thread
From: Jonathan Cameron @ 2020-08-16  9:36 UTC (permalink / raw)
  To: Daniel Campello
  Cc: LKML, LKML, Andy Shevchenko, Stephen Boyd, Douglas Anderson,
	Hartmut Knaack, Lars-Peter Clausen, Peter Meerwald-Stadler,
	linux-iio

On Thu, 6 Aug 2020 19:30:57 +0100
Jonathan Cameron <jic23@kernel.org> wrote:

> On Mon,  3 Aug 2020 17:58:07 -0600
> Daniel Campello <campello@chromium.org> wrote:
> 
> > Uses for_each_set_bit() macro to loop over channel bitmaps.
> > 
> > Signed-off-by: Daniel Campello <campello@chromium.org>
> > Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
> > Reviewed-by: Stephen Boyd <swboyd@chromium.org>  
> Applied,
> 
> Thanks,
> 
> Jonathan

0-day sent a rather silly warning on this, but in the interests of
suppressing noisy warnings I've fixed it...

> 
> > ---
> > 
> > Changes in v5: None
> > Changes in v4: None
> > Changes in v3:
> >  - Added static assert for number of channels.
> > 
> > Changes in v2:
> >  - Changed prox_stat to chan_prox_stat bitmap.
> > 
> >  drivers/iio/proximity/sx9310.c | 39 ++++++++++++++++++----------------
> >  1 file changed, 21 insertions(+), 18 deletions(-)
> > 
> > diff --git a/drivers/iio/proximity/sx9310.c b/drivers/iio/proximity/sx9310.c
> > index 127b1ba79e2dea..f78500b8a5841e 100644
> > --- a/drivers/iio/proximity/sx9310.c
> > +++ b/drivers/iio/proximity/sx9310.c
> > @@ -119,6 +119,7 @@
> >  
> >  /* 4 hardware channels, as defined in STAT0: COMB, CS2, CS1 and CS0. */
> >  #define SX9310_NUM_CHANNELS				4
> > +static_assert(SX9310_NUM_CHANNELS < BITS_PER_LONG);
> >  
> >  struct sx9310_data {
> >  	/* Serialize access to registers and channel configuration */
> > @@ -130,7 +131,7 @@ struct sx9310_data {
> >  	 * Last reading of the proximity status for each channel.
> >  	 * We only send an event to user space when this changes.
> >  	 */
> > -	bool prox_stat[SX9310_NUM_CHANNELS];
> > +	unsigned long chan_prox_stat;
> >  	bool trigger_enabled;
> >  	/* Ensure correct alignment of timestamp when present. */
> >  	struct {
> > @@ -140,7 +141,8 @@ struct sx9310_data {
> >  	/* Remember enabled channels and sample rate during suspend. */
> >  	unsigned int suspend_ctrl0;
> >  	struct completion completion;
> > -	unsigned int chan_read, chan_event;
> > +	unsigned long chan_read;
> > +	unsigned long chan_event;
> >  	int channel_users[SX9310_NUM_CHANNELS];
> >  	unsigned int whoami;
> >  };
> > @@ -283,15 +285,16 @@ static const struct regmap_config sx9310_regmap_config = {
> >  };
> >  
> >  static int sx9310_update_chan_en(struct sx9310_data *data,
> > -				 unsigned int chan_read,
> > -				 unsigned int chan_event)
> > +				 unsigned long chan_read,
> > +				 unsigned long chan_event)
> >  {
> >  	int ret;
> > +	unsigned long channels = chan_read | chan_event;
> >  
> > -	if ((data->chan_read | data->chan_event) != (chan_read | chan_event)) {
> > +	if ((data->chan_read | data->chan_event) != channels) {
> >  		ret = regmap_update_bits(data->regmap, SX9310_REG_PROX_CTRL0,
> >  					 SX9310_REG_PROX_CTRL0_SENSOREN_MASK,
> > -					 chan_read | chan_event);
> > +					 channels);
> >  		if (ret)
> >  			return ret;
> >  	}
> > @@ -532,6 +535,7 @@ static void sx9310_push_events(struct iio_dev *indio_dev)
> >  	unsigned int val, chan;
> >  	struct sx9310_data *data = iio_priv(indio_dev);
> >  	s64 timestamp = iio_get_time_ns(indio_dev);
> > +	unsigned long prox_changed;
> >  
> >  	/* Read proximity state on all channels */
> >  	ret = regmap_read(data->regmap, SX9310_REG_STAT0, &val);
> > @@ -540,24 +544,23 @@ static void sx9310_push_events(struct iio_dev *indio_dev)
> >  		return;
> >  	}
> >  
> > -	for (chan = 0; chan < SX9310_NUM_CHANNELS; chan++) {
> > +	/*
> > +	 * Only iterate over channels with changes on proximity status that have
> > +	 * events enabled.
> > +	 */
> > +	prox_changed = (data->chan_prox_stat ^ val) & data->chan_event;
> > +
> > +	for_each_set_bit(chan, &prox_changed, SX9310_NUM_CHANNELS) {
> >  		int dir;
> >  		u64 ev;
> > -		bool new_prox = val & BIT(chan);
> > -
> > -		if (!(data->chan_event & BIT(chan)))
> > -			continue;
> > -		if (new_prox == data->prox_stat[chan])
> > -			/* No change on this channel. */
> > -			continue;
> >  
> > -		dir = new_prox ? IIO_EV_DIR_FALLING : IIO_EV_DIR_RISING;
> > +		dir = val & BIT(chan) ? IIO_EV_DIR_FALLING : IIO_EV_DIR_RISING;

cpp check is moaning about no brackets around
val & BIT(CHAN) so I've added some.

> >  		ev = IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY, chan,
> >  					  IIO_EV_TYPE_THRESH, dir);
> >  
> >  		iio_push_event(indio_dev, ev, timestamp);
> > -		data->prox_stat[chan] = new_prox;
> >  	}
> > +	data->chan_prox_stat = val;
> >  }
> >  
> >  static irqreturn_t sx9310_irq_thread_handler(int irq, void *private)
> > @@ -714,13 +717,13 @@ static irqreturn_t sx9310_trigger_handler(int irq, void *private)
> >  static int sx9310_buffer_preenable(struct iio_dev *indio_dev)
> >  {
> >  	struct sx9310_data *data = iio_priv(indio_dev);
> > -	unsigned int channels = 0;
> > +	unsigned long channels = 0;
> >  	int bit, ret;
> >  
> >  	mutex_lock(&data->mutex);
> >  	for_each_set_bit(bit, indio_dev->active_scan_mask,
> >  			 indio_dev->masklength)
> > -		channels |= BIT(indio_dev->channels[bit].channel);
> > +		__set_bit(indio_dev->channels[bit].channel, &channels);
> >  
> >  	ret = sx9310_update_chan_en(data, channels, data->chan_event);
> >  	mutex_unlock(&data->mutex);  
> 


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v5 09/15] iio: sx9310: Update copyright
  2020-08-03 23:58 ` [PATCH v5 09/15] iio: sx9310: Update copyright Daniel Campello
@ 2020-08-18  1:45   ` Daniel Campello
  2020-08-22 10:34     ` Jonathan Cameron
  0 siblings, 1 reply; 28+ messages in thread
From: Daniel Campello @ 2020-08-18  1:45 UTC (permalink / raw)
  To: LKML, LKML
  Cc: Jonathan Cameron, Andy Shevchenko, Douglas Anderson,
	Gwendal Grignou, Hartmut Knaack, Lars-Peter Clausen,
	Peter Meerwald-Stadler, Stephen Boyd, linux-iio

On Mon, Aug 3, 2020 at 5:58 PM Daniel Campello <campello@chromium.org> wrote:
>
> Fixes wrong copyright year.
>
> Signed-off-by: Daniel Campello <campello@chromium.org>
> ---
>
> Changes in v5: None
> Changes in v4: None
> Changes in v3: None
> Changes in v2: None
>
>  drivers/iio/proximity/sx9310.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/iio/proximity/sx9310.c b/drivers/iio/proximity/sx9310.c
> index cd7de40a55c2f6..87b2de0d7b55a3 100644
> --- a/drivers/iio/proximity/sx9310.c
> +++ b/drivers/iio/proximity/sx9310.c
> @@ -1,13 +1,13 @@
>  // SPDX-License-Identifier: GPL-2.0
>  /*
> - * Copyright 2018 Google LLC.
> + * Copyright 2020 Google LLC.
>   *
>   * Driver for Semtech's SX9310/SX9311 capacitive proximity/button solution.
>   * Based on SX9500 driver and Semtech driver using the input framework
>   * <https://my.syncplicity.com/share/teouwsim8niiaud/
>   *          linux-driver-SX9310_NoSmartHSensing>.
> - * Reworked April 2019 by Evan Green <evgreen@chromium.org>
> - * and January 2020 by Daniel Campello <campello@chromium.org>
> + * Reworked in April 2019 by Evan Green <evgreen@chromium.org>
> + * and in January 2020 by Daniel Campello <campello@chromium.org>.
>   */
>
>  #include <linux/acpi.h>
> --
> 2.28.0.163.g6104cc2f0b6-goog
>

Hi Jonathan,

After discussing with Gwendal on crrev.com/c/2360467 it seems that the
right year for the copyright is 2018 as it was before this change.
Sorry about the inconvenience.

Regards,
Daniel Campello

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v5 09/15] iio: sx9310: Update copyright
  2020-08-18  1:45   ` Daniel Campello
@ 2020-08-22 10:34     ` Jonathan Cameron
  0 siblings, 0 replies; 28+ messages in thread
From: Jonathan Cameron @ 2020-08-22 10:34 UTC (permalink / raw)
  To: Daniel Campello
  Cc: LKML, LKML, Andy Shevchenko, Douglas Anderson, Gwendal Grignou,
	Hartmut Knaack, Lars-Peter Clausen, Peter Meerwald-Stadler,
	Stephen Boyd, linux-iio

On Mon, 17 Aug 2020 19:45:59 -0600
Daniel Campello <campello@chromium.org> wrote:

> On Mon, Aug 3, 2020 at 5:58 PM Daniel Campello <campello@chromium.org> wrote:
> >
> > Fixes wrong copyright year.
> >
> > Signed-off-by: Daniel Campello <campello@chromium.org>
> > ---
> >
> > Changes in v5: None
> > Changes in v4: None
> > Changes in v3: None
> > Changes in v2: None
> >
> >  drivers/iio/proximity/sx9310.c | 6 +++---
> >  1 file changed, 3 insertions(+), 3 deletions(-)
> >
> > diff --git a/drivers/iio/proximity/sx9310.c b/drivers/iio/proximity/sx9310.c
> > index cd7de40a55c2f6..87b2de0d7b55a3 100644
> > --- a/drivers/iio/proximity/sx9310.c
> > +++ b/drivers/iio/proximity/sx9310.c
> > @@ -1,13 +1,13 @@
> >  // SPDX-License-Identifier: GPL-2.0
> >  /*
> > - * Copyright 2018 Google LLC.
> > + * Copyright 2020 Google LLC.
> >   *
> >   * Driver for Semtech's SX9310/SX9311 capacitive proximity/button solution.
> >   * Based on SX9500 driver and Semtech driver using the input framework
> >   * <https://my.syncplicity.com/share/teouwsim8niiaud/
> >   *          linux-driver-SX9310_NoSmartHSensing>.
> > - * Reworked April 2019 by Evan Green <evgreen@chromium.org>
> > - * and January 2020 by Daniel Campello <campello@chromium.org>
> > + * Reworked in April 2019 by Evan Green <evgreen@chromium.org>
> > + * and in January 2020 by Daniel Campello <campello@chromium.org>.
> >   */
> >
> >  #include <linux/acpi.h>
> > --
> > 2.28.0.163.g6104cc2f0b6-goog
> >  
> 
> Hi Jonathan,
> 
> After discussing with Gwendal on crrev.com/c/2360467 it seems that the
> right year for the copyright is 2018 as it was before this change.
> Sorry about the inconvenience.
No problem.  I've put the 2018 date back as it was.

Thanks,

Jonathan

> 
> Regards,
> Daniel Campello


^ permalink raw reply	[flat|nested] 28+ messages in thread

end of thread, other threads:[~2020-08-22 10:34 UTC | newest]

Thread overview: 28+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-08-03 23:58 [PATCH v5 00/15] sx9310 iio driver updates Daniel Campello
2020-08-03 23:58 ` [PATCH v5 01/15] dt-bindings: iio: Add bindings for sx9310 sensor Daniel Campello
2020-08-06 18:14   ` Jonathan Cameron
2020-08-03 23:58 ` [PATCH v5 02/15] iio: sx9310: Update macros declarations Daniel Campello
2020-08-06 18:15   ` Jonathan Cameron
2020-08-03 23:58 ` [PATCH v5 03/15] iio: sx9310: Fix irq handling Daniel Campello
2020-08-04  7:26   ` Andy Shevchenko
2020-08-03 23:58 ` [PATCH v5 04/15] iio: sx9310: Remove acpi and of table macros Daniel Campello
2020-08-06 18:28   ` Jonathan Cameron
2020-08-03 23:58 ` [PATCH v5 05/15] iio: sx9310: Change from .probe to .probe_new Daniel Campello
2020-08-06 18:29   ` Jonathan Cameron
2020-08-03 23:58 ` [PATCH v5 06/15] iio: sx9310: Fixes various memory handling Daniel Campello
2020-08-06 18:29   ` Jonathan Cameron
2020-08-03 23:58 ` [PATCH v5 07/15] iio: sx9310: Use long instead of int for channel bitmaps Daniel Campello
2020-08-06 18:30   ` Jonathan Cameron
2020-08-16  9:36     ` Jonathan Cameron
2020-08-03 23:58 ` [PATCH v5 08/15] iio: sx9310: Use regmap_read_poll_timeout() for compensation Daniel Campello
2020-08-03 23:58 ` [PATCH v5 09/15] iio: sx9310: Update copyright Daniel Campello
2020-08-18  1:45   ` Daniel Campello
2020-08-22 10:34     ` Jonathan Cameron
2020-08-03 23:58 ` [PATCH v5 10/15] iio: sx9310: Simplify error return handling Daniel Campello
2020-08-03 23:58 ` [PATCH v5 11/15] iio: sx9310: Use variable to hold &client->dev Daniel Campello
2020-08-06 18:38   ` Jonathan Cameron
2020-08-03 23:58 ` [PATCH v5 12/15] iio: sx9310: Miscellaneous format fixes Daniel Campello
2020-08-03 23:58 ` [PATCH v5 13/15] iio: sx9310: Drop channel_users[] Daniel Campello
2020-08-03 23:58 ` [PATCH v5 14/15] iio: sx9310: Enable vdd and svdd regulators at probe Daniel Campello
2020-08-03 23:58 ` [PATCH v5 15/15] iio: sx9310: Use irq trigger flags from firmware Daniel Campello
2020-08-06 18:42   ` Jonathan Cameron

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