All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/5] Add support to LIS2DW12 accel sensor
@ 2017-08-17 17:37 ` Lorenzo Bianconi
  0 siblings, 0 replies; 20+ messages in thread
From: Lorenzo Bianconi @ 2017-08-17 17:37 UTC (permalink / raw)
  To: jic23-DgEjT+Ai2ygdnm+yROfE0A
  Cc: linux-iio-u79uwXL29TY76Z2rM5mHXA,
	linus.walleij-QSEj5FYQhm4dnm+yROfE0A,
	lorenzo.bianconi-qxv4g6HH51o, devicetree-u79uwXL29TY76Z2rM5mHXA

Modify management of drdy line and status register in order to support
LIS2DW12 device

Changes since v1:
- remove drdy_irq parameter from LPS001WP settings since the sensor
does not support data-ready interrupts

Lorenzo Bianconi (5):
  iio: st_sensors: decouple irq1 configuration parameters from the irq2
    ones
  iio: st_sensors: do not always write enable_axis register
  iio: st_sensors: add register mask for status register
  iio: accel: add support to LIS2DW12
  dt-bindings: iio: accel: add LIS2DW12 sensor device binding

 .../devicetree/bindings/iio/st-sensors.txt         |   1 +
 drivers/iio/accel/st_accel.h                       |   2 +
 drivers/iio/accel/st_accel_core.c                  | 180 +++++++++++++++++----
 drivers/iio/accel/st_accel_i2c.c                   |   5 +
 drivers/iio/accel/st_accel_spi.c                   |   5 +
 drivers/iio/common/st_sensors/st_sensors_core.c    |  33 ++--
 drivers/iio/common/st_sensors/st_sensors_trigger.c |  16 +-
 drivers/iio/gyro/st_gyro_core.c                    |  33 ++--
 drivers/iio/magnetometer/st_magn_core.c            |  11 +-
 drivers/iio/pressure/st_pressure_core.c            |  46 ++++--
 include/linux/iio/common/st_sensors.h              |  23 ++-
 11 files changed, 265 insertions(+), 90 deletions(-)

-- 
2.14.0

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* [PATCH v2 0/5] Add support to LIS2DW12 accel sensor
@ 2017-08-17 17:37 ` Lorenzo Bianconi
  0 siblings, 0 replies; 20+ messages in thread
From: Lorenzo Bianconi @ 2017-08-17 17:37 UTC (permalink / raw)
  To: jic23; +Cc: linux-iio, linus.walleij, lorenzo.bianconi, devicetree

Modify management of drdy line and status register in order to support
LIS2DW12 device

Changes since v1:
- remove drdy_irq parameter from LPS001WP settings since the sensor
does not support data-ready interrupts

Lorenzo Bianconi (5):
  iio: st_sensors: decouple irq1 configuration parameters from the irq2
    ones
  iio: st_sensors: do not always write enable_axis register
  iio: st_sensors: add register mask for status register
  iio: accel: add support to LIS2DW12
  dt-bindings: iio: accel: add LIS2DW12 sensor device binding

 .../devicetree/bindings/iio/st-sensors.txt         |   1 +
 drivers/iio/accel/st_accel.h                       |   2 +
 drivers/iio/accel/st_accel_core.c                  | 180 +++++++++++++++++----
 drivers/iio/accel/st_accel_i2c.c                   |   5 +
 drivers/iio/accel/st_accel_spi.c                   |   5 +
 drivers/iio/common/st_sensors/st_sensors_core.c    |  33 ++--
 drivers/iio/common/st_sensors/st_sensors_trigger.c |  16 +-
 drivers/iio/gyro/st_gyro_core.c                    |  33 ++--
 drivers/iio/magnetometer/st_magn_core.c            |  11 +-
 drivers/iio/pressure/st_pressure_core.c            |  46 ++++--
 include/linux/iio/common/st_sensors.h              |  23 ++-
 11 files changed, 265 insertions(+), 90 deletions(-)

-- 
2.14.0

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

* [PATCH v2 1/5] iio: st_sensors: decouple irq1 configuration parameters from the irq2 ones
  2017-08-17 17:37 ` Lorenzo Bianconi
@ 2017-08-17 17:37     ` Lorenzo Bianconi
  -1 siblings, 0 replies; 20+ messages in thread
From: Lorenzo Bianconi @ 2017-08-17 17:37 UTC (permalink / raw)
  To: jic23-DgEjT+Ai2ygdnm+yROfE0A
  Cc: linux-iio-u79uwXL29TY76Z2rM5mHXA,
	linus.walleij-QSEj5FYQhm4dnm+yROfE0A,
	lorenzo.bianconi-qxv4g6HH51o, devicetree-u79uwXL29TY76Z2rM5mHXA

Separate data-ready configuration parameters for INT1 and INT2 pins in
st_sensor_data_ready_irq data structure. That change will be use to
properly support LIS2DW12 accel sensor.

Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi-qxv4g6HH51o@public.gmane.org>
---
 drivers/iio/accel/st_accel_core.c               | 66 ++++++++++++++++---------
 drivers/iio/common/st_sensors/st_sensors_core.c | 28 ++++++-----
 drivers/iio/gyro/st_gyro_core.c                 | 18 ++++---
 drivers/iio/magnetometer/st_magn_core.c         |  6 ++-
 drivers/iio/pressure/st_pressure_core.c         | 31 +++++++-----
 include/linux/iio/common/st_sensors.h           | 16 +++---
 6 files changed, 104 insertions(+), 61 deletions(-)

diff --git a/drivers/iio/accel/st_accel_core.c b/drivers/iio/accel/st_accel_core.c
index 752856b3a849..9fac5a41bacd 100644
--- a/drivers/iio/accel/st_accel_core.c
+++ b/drivers/iio/accel/st_accel_core.c
@@ -159,9 +159,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
 			.mask = 0x80,
 		},
 		.drdy_irq = {
-			.addr = 0x22,
-			.mask_int1 = 0x10,
-			.mask_int2 = 0x00,
+			.int1 = {
+				.addr = 0x22,
+				.mask = 0x10,
+			},
 			.addr_ihl = 0x25,
 			.mask_ihl = 0x02,
 			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
@@ -229,9 +230,14 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
 			.mask = 0x80,
 		},
 		.drdy_irq = {
-			.addr = 0x22,
-			.mask_int1 = 0x02,
-			.mask_int2 = 0x10,
+			.int1 = {
+				.addr = 0x22,
+				.mask = 0x02,
+			},
+			.int2 = {
+				.addr = 0x22,
+				.mask = 0x10,
+			},
 			.addr_ihl = 0x22,
 			.mask_ihl = 0x80,
 			.addr_od = 0x22,
@@ -313,9 +319,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
 			.mask = 0x08,
 		},
 		.drdy_irq = {
-			.addr = 0x23,
-			.mask_int1 = 0x80,
-			.mask_int2 = 0x00,
+			.int1 = {
+				.addr = 0x23,
+				.mask = 0x80,
+			},
 			.addr_ihl = 0x23,
 			.mask_ihl = 0x40,
 			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
@@ -387,8 +394,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
 			.mask = 0x01,
 		},
 		.drdy_irq = {
-			.addr = 0x21,
-			.mask_int1 = 0x04,
+			.int1 = {
+				.addr = 0x21,
+				.mask = 0x04,
+			},
 			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
 		},
 		.sim = {
@@ -444,9 +453,14 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
 			},
 		},
 		.drdy_irq = {
-			.addr = 0x22,
-			.mask_int1 = 0x04,
-			.mask_int2 = 0x20,
+			.int1 = {
+				.addr = 0x22,
+				.mask = 0x04,
+			},
+			.int2 = {
+				.addr = 0x22,
+				.mask = 0x20,
+			},
 			.addr_ihl = 0x22,
 			.mask_ihl = 0x80,
 			.addr_od = 0x22,
@@ -513,9 +527,14 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
 			.mask = 0x80,
 		},
 		.drdy_irq = {
-			.addr = 0x22,
-			.mask_int1 = 0x02,
-			.mask_int2 = 0x10,
+			.int1 = {
+				.addr = 0x22,
+				.mask = 0x02,
+			},
+			.int2 = {
+				.addr = 0x22,
+				.mask = 0x10,
+			},
 			.addr_ihl = 0x22,
 			.mask_ihl = 0x80,
 		},
@@ -567,8 +586,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
 		.bdu = {
 		},
 		.drdy_irq = {
-			.addr = 0x21,
-			.mask_int1 = 0x04,
+			.int1 = {
+				.addr = 0x21,
+				.mask = 0x04,
+			},
 			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
 		},
 		.sim = {
@@ -635,9 +656,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
 			},
 		},
 		.drdy_irq = {
-			.addr = 0x22,
-			.mask_int1 = 0x10,
-			.mask_int2 = 0x00,
+			.int1 = {
+				.addr = 0x22,
+				.mask = 0x10,
+			},
 			.addr_ihl = 0x25,
 			.mask_ihl = 0x02,
 			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
diff --git a/drivers/iio/common/st_sensors/st_sensors_core.c b/drivers/iio/common/st_sensors/st_sensors_core.c
index d99bb1460fe2..a26217b0604f 100644
--- a/drivers/iio/common/st_sensors/st_sensors_core.c
+++ b/drivers/iio/common/st_sensors/st_sensors_core.c
@@ -283,7 +283,8 @@ static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev,
 	struct st_sensor_data *sdata = iio_priv(indio_dev);
 
 	/* Sensor does not support interrupts */
-	if (sdata->sensor_settings->drdy_irq.addr == 0) {
+	if (!sdata->sensor_settings->drdy_irq.int1.addr &&
+	    !sdata->sensor_settings->drdy_irq.int2.addr) {
 		if (pdata->drdy_int_pin)
 			dev_info(&indio_dev->dev,
 				 "DRDY on pin INT%d specified, but sensor "
@@ -294,7 +295,7 @@ static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev,
 
 	switch (pdata->drdy_int_pin) {
 	case 1:
-		if (sdata->sensor_settings->drdy_irq.mask_int1 == 0) {
+		if (!sdata->sensor_settings->drdy_irq.int1.mask) {
 			dev_err(&indio_dev->dev,
 					"DRDY on INT1 not available.\n");
 			return -EINVAL;
@@ -302,7 +303,7 @@ static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev,
 		sdata->drdy_int_pin = 1;
 		break;
 	case 2:
-		if (sdata->sensor_settings->drdy_irq.mask_int2 == 0) {
+		if (!sdata->sensor_settings->drdy_irq.int2.mask) {
 			dev_err(&indio_dev->dev,
 					"DRDY on INT2 not available.\n");
 			return -EINVAL;
@@ -460,10 +461,11 @@ EXPORT_SYMBOL(st_sensors_init_sensor);
 int st_sensors_set_dataready_irq(struct iio_dev *indio_dev, bool enable)
 {
 	int err;
-	u8 drdy_mask;
+	u8 drdy_addr, drdy_mask;
 	struct st_sensor_data *sdata = iio_priv(indio_dev);
 
-	if (!sdata->sensor_settings->drdy_irq.addr)
+	if (!sdata->sensor_settings->drdy_irq.int1.addr &&
+	    !sdata->sensor_settings->drdy_irq.int2.addr)
 		return 0;
 
 	/* Enable/Disable the interrupt generator 1. */
@@ -476,18 +478,20 @@ int st_sensors_set_dataready_irq(struct iio_dev *indio_dev, bool enable)
 			goto st_accel_set_dataready_irq_error;
 	}
 
-	if (sdata->drdy_int_pin == 1)
-		drdy_mask = sdata->sensor_settings->drdy_irq.mask_int1;
-	else
-		drdy_mask = sdata->sensor_settings->drdy_irq.mask_int2;
+	if (sdata->drdy_int_pin == 1) {
+		drdy_addr = sdata->sensor_settings->drdy_irq.int1.addr;
+		drdy_mask = sdata->sensor_settings->drdy_irq.int1.mask;
+	} else {
+		drdy_addr = sdata->sensor_settings->drdy_irq.int2.addr;
+		drdy_mask = sdata->sensor_settings->drdy_irq.int2.mask;
+	}
 
 	/* Flag to the poll function that the hardware trigger is in use */
 	sdata->hw_irq_trigger = enable;
 
 	/* Enable/Disable the interrupt generator for data ready. */
-	err = st_sensors_write_data_with_mask(indio_dev,
-					sdata->sensor_settings->drdy_irq.addr,
-					drdy_mask, (int)enable);
+	err = st_sensors_write_data_with_mask(indio_dev, drdy_addr,
+					      drdy_mask, (int)enable);
 
 st_accel_set_dataready_irq_error:
 	return err;
diff --git a/drivers/iio/gyro/st_gyro_core.c b/drivers/iio/gyro/st_gyro_core.c
index e366422e8512..764306378b20 100644
--- a/drivers/iio/gyro/st_gyro_core.c
+++ b/drivers/iio/gyro/st_gyro_core.c
@@ -111,8 +111,10 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = {
 			.mask = 0x80,
 		},
 		.drdy_irq = {
-			.addr = 0x22,
-			.mask_int2 = 0x08,
+			.int2 = {
+				.addr = 0x22,
+				.mask = 0x08,
+			},
 			/*
 			 * The sensor has IHL (active low) and open
 			 * drain settings, but only for INT1 and not
@@ -181,8 +183,10 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = {
 			.mask = 0x80,
 		},
 		.drdy_irq = {
-			.addr = 0x22,
-			.mask_int2 = 0x08,
+			.int2 = {
+				.addr = 0x22,
+				.mask = 0x08,
+			},
 			/*
 			 * The sensor has IHL (active low) and open
 			 * drain settings, but only for INT1 and not
@@ -246,8 +250,10 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = {
 			.mask = 0x80,
 		},
 		.drdy_irq = {
-			.addr = 0x22,
-			.mask_int2 = 0x08,
+			.int2 = {
+				.addr = 0x22,
+				.mask = 0x08,
+			},
 			/*
 			 * The sensor has IHL (active low) and open
 			 * drain settings, but only for INT1 and not
diff --git a/drivers/iio/magnetometer/st_magn_core.c b/drivers/iio/magnetometer/st_magn_core.c
index e68368b5b2a3..2c465cbe3b0a 100644
--- a/drivers/iio/magnetometer/st_magn_core.c
+++ b/drivers/iio/magnetometer/st_magn_core.c
@@ -355,8 +355,10 @@ static const struct st_sensor_settings st_magn_sensors_settings[] = {
 			.mask = 0x10,
 		},
 		.drdy_irq = {
-			.addr = 0x62,
-			.mask_int1 = 0x01,
+			.int1 = {
+				.addr = 0x62,
+				.mask = 0x01,
+			},
 			.addr_stat_drdy = 0x67,
 		},
 		.multi_read_bit = false,
diff --git a/drivers/iio/pressure/st_pressure_core.c b/drivers/iio/pressure/st_pressure_core.c
index c84eea73b3ae..240fa9f3ee3b 100644
--- a/drivers/iio/pressure/st_pressure_core.c
+++ b/drivers/iio/pressure/st_pressure_core.c
@@ -280,9 +280,14 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
 			.mask = 0x04,
 		},
 		.drdy_irq = {
-			.addr = 0x22,
-			.mask_int1 = 0x04,
-			.mask_int2 = 0x20,
+			.int1 = {
+				.addr = 0x22,
+				.mask = 0x04,
+			},
+			.int2 = {
+				.addr = 0x22,
+				.mask = 0x20,
+			},
 			.addr_ihl = 0x22,
 			.mask_ihl = 0x80,
 			.addr_od = 0x22,
@@ -335,9 +340,6 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
 			.addr = 0x20,
 			.mask = 0x04,
 		},
-		.drdy_irq = {
-			.addr = 0,
-		},
 		.multi_read_bit = true,
 		.bootime = 2,
 	},
@@ -388,9 +390,10 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
 			.mask = 0x04,
 		},
 		.drdy_irq = {
-			.addr = 0x23,
-			.mask_int1 = 0x01,
-			.mask_int2 = 0x00,
+			.int1 = {
+				.addr = 0x23,
+				.mask = 0x01,
+			},
 			.addr_ihl = 0x22,
 			.mask_ihl = 0x80,
 			.addr_od = 0x22,
@@ -447,9 +450,10 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
 			.mask = 0x02,
 		},
 		.drdy_irq = {
-			.addr = 0x12,
-			.mask_int1 = 0x04,
-			.mask_int2 = 0x00,
+			.int1 = {
+				.addr = 0x12,
+				.mask = 0x04,
+			},
 			.addr_ihl = 0x12,
 			.mask_ihl = 0x80,
 			.addr_od = 0x12,
@@ -605,7 +609,8 @@ int st_press_common_probe(struct iio_dev *indio_dev)
 	press_data->odr = press_data->sensor_settings->odr.odr_avl[0].hz;
 
 	/* Some devices don't support a data ready pin. */
-	if (!pdata && press_data->sensor_settings->drdy_irq.addr)
+	if (!pdata && (press_data->sensor_settings->drdy_irq.int1.addr ||
+		       press_data->sensor_settings->drdy_irq.int2.addr))
 		pdata =	(struct st_sensors_platform_data *)&default_press_pdata;
 
 	err = st_sensors_init_sensor(indio_dev, press_data->dev->platform_data);
diff --git a/include/linux/iio/common/st_sensors.h b/include/linux/iio/common/st_sensors.h
index 7b0fa8b5c120..ac3aa89518ca 100644
--- a/include/linux/iio/common/st_sensors.h
+++ b/include/linux/iio/common/st_sensors.h
@@ -132,9 +132,8 @@ struct st_sensor_das {
 
 /**
  * struct st_sensor_data_ready_irq - ST sensor device data-ready interrupt
- * @addr: address of the register.
- * @mask_int1: mask to enable/disable IRQ on INT1 pin.
- * @mask_int2: mask to enable/disable IRQ on INT2 pin.
+ * struct int1 - data-ready configuration register for INT1 pin.
+ * struct int2 - data-ready configuration register for INT2 pin.
  * @addr_ihl: address to enable/disable active low on the INT lines.
  * @mask_ihl: mask to enable/disable active low on the INT lines.
  * @addr_od: address to enable/disable Open Drain on the INT lines.
@@ -145,9 +144,14 @@ struct st_sensor_das {
  * @en_mask: mask to write the on/off value for enable.
  */
 struct st_sensor_data_ready_irq {
-	u8 addr;
-	u8 mask_int1;
-	u8 mask_int2;
+	struct {
+		u8 addr;
+		u8 mask;
+	} int1;
+	struct {
+		u8 addr;
+		u8 mask;
+	} int2;
 	u8 addr_ihl;
 	u8 mask_ihl;
 	u8 addr_od;
-- 
2.14.0

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

* [PATCH v2 1/5] iio: st_sensors: decouple irq1 configuration parameters from the irq2 ones
@ 2017-08-17 17:37     ` Lorenzo Bianconi
  0 siblings, 0 replies; 20+ messages in thread
From: Lorenzo Bianconi @ 2017-08-17 17:37 UTC (permalink / raw)
  To: jic23; +Cc: linux-iio, linus.walleij, lorenzo.bianconi, devicetree

Separate data-ready configuration parameters for INT1 and INT2 pins in
st_sensor_data_ready_irq data structure. That change will be use to
properly support LIS2DW12 accel sensor.

Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@st.com>
---
 drivers/iio/accel/st_accel_core.c               | 66 ++++++++++++++++---------
 drivers/iio/common/st_sensors/st_sensors_core.c | 28 ++++++-----
 drivers/iio/gyro/st_gyro_core.c                 | 18 ++++---
 drivers/iio/magnetometer/st_magn_core.c         |  6 ++-
 drivers/iio/pressure/st_pressure_core.c         | 31 +++++++-----
 include/linux/iio/common/st_sensors.h           | 16 +++---
 6 files changed, 104 insertions(+), 61 deletions(-)

diff --git a/drivers/iio/accel/st_accel_core.c b/drivers/iio/accel/st_accel_core.c
index 752856b3a849..9fac5a41bacd 100644
--- a/drivers/iio/accel/st_accel_core.c
+++ b/drivers/iio/accel/st_accel_core.c
@@ -159,9 +159,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
 			.mask = 0x80,
 		},
 		.drdy_irq = {
-			.addr = 0x22,
-			.mask_int1 = 0x10,
-			.mask_int2 = 0x00,
+			.int1 = {
+				.addr = 0x22,
+				.mask = 0x10,
+			},
 			.addr_ihl = 0x25,
 			.mask_ihl = 0x02,
 			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
@@ -229,9 +230,14 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
 			.mask = 0x80,
 		},
 		.drdy_irq = {
-			.addr = 0x22,
-			.mask_int1 = 0x02,
-			.mask_int2 = 0x10,
+			.int1 = {
+				.addr = 0x22,
+				.mask = 0x02,
+			},
+			.int2 = {
+				.addr = 0x22,
+				.mask = 0x10,
+			},
 			.addr_ihl = 0x22,
 			.mask_ihl = 0x80,
 			.addr_od = 0x22,
@@ -313,9 +319,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
 			.mask = 0x08,
 		},
 		.drdy_irq = {
-			.addr = 0x23,
-			.mask_int1 = 0x80,
-			.mask_int2 = 0x00,
+			.int1 = {
+				.addr = 0x23,
+				.mask = 0x80,
+			},
 			.addr_ihl = 0x23,
 			.mask_ihl = 0x40,
 			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
@@ -387,8 +394,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
 			.mask = 0x01,
 		},
 		.drdy_irq = {
-			.addr = 0x21,
-			.mask_int1 = 0x04,
+			.int1 = {
+				.addr = 0x21,
+				.mask = 0x04,
+			},
 			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
 		},
 		.sim = {
@@ -444,9 +453,14 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
 			},
 		},
 		.drdy_irq = {
-			.addr = 0x22,
-			.mask_int1 = 0x04,
-			.mask_int2 = 0x20,
+			.int1 = {
+				.addr = 0x22,
+				.mask = 0x04,
+			},
+			.int2 = {
+				.addr = 0x22,
+				.mask = 0x20,
+			},
 			.addr_ihl = 0x22,
 			.mask_ihl = 0x80,
 			.addr_od = 0x22,
@@ -513,9 +527,14 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
 			.mask = 0x80,
 		},
 		.drdy_irq = {
-			.addr = 0x22,
-			.mask_int1 = 0x02,
-			.mask_int2 = 0x10,
+			.int1 = {
+				.addr = 0x22,
+				.mask = 0x02,
+			},
+			.int2 = {
+				.addr = 0x22,
+				.mask = 0x10,
+			},
 			.addr_ihl = 0x22,
 			.mask_ihl = 0x80,
 		},
@@ -567,8 +586,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
 		.bdu = {
 		},
 		.drdy_irq = {
-			.addr = 0x21,
-			.mask_int1 = 0x04,
+			.int1 = {
+				.addr = 0x21,
+				.mask = 0x04,
+			},
 			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
 		},
 		.sim = {
@@ -635,9 +656,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
 			},
 		},
 		.drdy_irq = {
-			.addr = 0x22,
-			.mask_int1 = 0x10,
-			.mask_int2 = 0x00,
+			.int1 = {
+				.addr = 0x22,
+				.mask = 0x10,
+			},
 			.addr_ihl = 0x25,
 			.mask_ihl = 0x02,
 			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
diff --git a/drivers/iio/common/st_sensors/st_sensors_core.c b/drivers/iio/common/st_sensors/st_sensors_core.c
index d99bb1460fe2..a26217b0604f 100644
--- a/drivers/iio/common/st_sensors/st_sensors_core.c
+++ b/drivers/iio/common/st_sensors/st_sensors_core.c
@@ -283,7 +283,8 @@ static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev,
 	struct st_sensor_data *sdata = iio_priv(indio_dev);
 
 	/* Sensor does not support interrupts */
-	if (sdata->sensor_settings->drdy_irq.addr == 0) {
+	if (!sdata->sensor_settings->drdy_irq.int1.addr &&
+	    !sdata->sensor_settings->drdy_irq.int2.addr) {
 		if (pdata->drdy_int_pin)
 			dev_info(&indio_dev->dev,
 				 "DRDY on pin INT%d specified, but sensor "
@@ -294,7 +295,7 @@ static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev,
 
 	switch (pdata->drdy_int_pin) {
 	case 1:
-		if (sdata->sensor_settings->drdy_irq.mask_int1 == 0) {
+		if (!sdata->sensor_settings->drdy_irq.int1.mask) {
 			dev_err(&indio_dev->dev,
 					"DRDY on INT1 not available.\n");
 			return -EINVAL;
@@ -302,7 +303,7 @@ static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev,
 		sdata->drdy_int_pin = 1;
 		break;
 	case 2:
-		if (sdata->sensor_settings->drdy_irq.mask_int2 == 0) {
+		if (!sdata->sensor_settings->drdy_irq.int2.mask) {
 			dev_err(&indio_dev->dev,
 					"DRDY on INT2 not available.\n");
 			return -EINVAL;
@@ -460,10 +461,11 @@ EXPORT_SYMBOL(st_sensors_init_sensor);
 int st_sensors_set_dataready_irq(struct iio_dev *indio_dev, bool enable)
 {
 	int err;
-	u8 drdy_mask;
+	u8 drdy_addr, drdy_mask;
 	struct st_sensor_data *sdata = iio_priv(indio_dev);
 
-	if (!sdata->sensor_settings->drdy_irq.addr)
+	if (!sdata->sensor_settings->drdy_irq.int1.addr &&
+	    !sdata->sensor_settings->drdy_irq.int2.addr)
 		return 0;
 
 	/* Enable/Disable the interrupt generator 1. */
@@ -476,18 +478,20 @@ int st_sensors_set_dataready_irq(struct iio_dev *indio_dev, bool enable)
 			goto st_accel_set_dataready_irq_error;
 	}
 
-	if (sdata->drdy_int_pin == 1)
-		drdy_mask = sdata->sensor_settings->drdy_irq.mask_int1;
-	else
-		drdy_mask = sdata->sensor_settings->drdy_irq.mask_int2;
+	if (sdata->drdy_int_pin == 1) {
+		drdy_addr = sdata->sensor_settings->drdy_irq.int1.addr;
+		drdy_mask = sdata->sensor_settings->drdy_irq.int1.mask;
+	} else {
+		drdy_addr = sdata->sensor_settings->drdy_irq.int2.addr;
+		drdy_mask = sdata->sensor_settings->drdy_irq.int2.mask;
+	}
 
 	/* Flag to the poll function that the hardware trigger is in use */
 	sdata->hw_irq_trigger = enable;
 
 	/* Enable/Disable the interrupt generator for data ready. */
-	err = st_sensors_write_data_with_mask(indio_dev,
-					sdata->sensor_settings->drdy_irq.addr,
-					drdy_mask, (int)enable);
+	err = st_sensors_write_data_with_mask(indio_dev, drdy_addr,
+					      drdy_mask, (int)enable);
 
 st_accel_set_dataready_irq_error:
 	return err;
diff --git a/drivers/iio/gyro/st_gyro_core.c b/drivers/iio/gyro/st_gyro_core.c
index e366422e8512..764306378b20 100644
--- a/drivers/iio/gyro/st_gyro_core.c
+++ b/drivers/iio/gyro/st_gyro_core.c
@@ -111,8 +111,10 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = {
 			.mask = 0x80,
 		},
 		.drdy_irq = {
-			.addr = 0x22,
-			.mask_int2 = 0x08,
+			.int2 = {
+				.addr = 0x22,
+				.mask = 0x08,
+			},
 			/*
 			 * The sensor has IHL (active low) and open
 			 * drain settings, but only for INT1 and not
@@ -181,8 +183,10 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = {
 			.mask = 0x80,
 		},
 		.drdy_irq = {
-			.addr = 0x22,
-			.mask_int2 = 0x08,
+			.int2 = {
+				.addr = 0x22,
+				.mask = 0x08,
+			},
 			/*
 			 * The sensor has IHL (active low) and open
 			 * drain settings, but only for INT1 and not
@@ -246,8 +250,10 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = {
 			.mask = 0x80,
 		},
 		.drdy_irq = {
-			.addr = 0x22,
-			.mask_int2 = 0x08,
+			.int2 = {
+				.addr = 0x22,
+				.mask = 0x08,
+			},
 			/*
 			 * The sensor has IHL (active low) and open
 			 * drain settings, but only for INT1 and not
diff --git a/drivers/iio/magnetometer/st_magn_core.c b/drivers/iio/magnetometer/st_magn_core.c
index e68368b5b2a3..2c465cbe3b0a 100644
--- a/drivers/iio/magnetometer/st_magn_core.c
+++ b/drivers/iio/magnetometer/st_magn_core.c
@@ -355,8 +355,10 @@ static const struct st_sensor_settings st_magn_sensors_settings[] = {
 			.mask = 0x10,
 		},
 		.drdy_irq = {
-			.addr = 0x62,
-			.mask_int1 = 0x01,
+			.int1 = {
+				.addr = 0x62,
+				.mask = 0x01,
+			},
 			.addr_stat_drdy = 0x67,
 		},
 		.multi_read_bit = false,
diff --git a/drivers/iio/pressure/st_pressure_core.c b/drivers/iio/pressure/st_pressure_core.c
index c84eea73b3ae..240fa9f3ee3b 100644
--- a/drivers/iio/pressure/st_pressure_core.c
+++ b/drivers/iio/pressure/st_pressure_core.c
@@ -280,9 +280,14 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
 			.mask = 0x04,
 		},
 		.drdy_irq = {
-			.addr = 0x22,
-			.mask_int1 = 0x04,
-			.mask_int2 = 0x20,
+			.int1 = {
+				.addr = 0x22,
+				.mask = 0x04,
+			},
+			.int2 = {
+				.addr = 0x22,
+				.mask = 0x20,
+			},
 			.addr_ihl = 0x22,
 			.mask_ihl = 0x80,
 			.addr_od = 0x22,
@@ -335,9 +340,6 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
 			.addr = 0x20,
 			.mask = 0x04,
 		},
-		.drdy_irq = {
-			.addr = 0,
-		},
 		.multi_read_bit = true,
 		.bootime = 2,
 	},
@@ -388,9 +390,10 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
 			.mask = 0x04,
 		},
 		.drdy_irq = {
-			.addr = 0x23,
-			.mask_int1 = 0x01,
-			.mask_int2 = 0x00,
+			.int1 = {
+				.addr = 0x23,
+				.mask = 0x01,
+			},
 			.addr_ihl = 0x22,
 			.mask_ihl = 0x80,
 			.addr_od = 0x22,
@@ -447,9 +450,10 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
 			.mask = 0x02,
 		},
 		.drdy_irq = {
-			.addr = 0x12,
-			.mask_int1 = 0x04,
-			.mask_int2 = 0x00,
+			.int1 = {
+				.addr = 0x12,
+				.mask = 0x04,
+			},
 			.addr_ihl = 0x12,
 			.mask_ihl = 0x80,
 			.addr_od = 0x12,
@@ -605,7 +609,8 @@ int st_press_common_probe(struct iio_dev *indio_dev)
 	press_data->odr = press_data->sensor_settings->odr.odr_avl[0].hz;
 
 	/* Some devices don't support a data ready pin. */
-	if (!pdata && press_data->sensor_settings->drdy_irq.addr)
+	if (!pdata && (press_data->sensor_settings->drdy_irq.int1.addr ||
+		       press_data->sensor_settings->drdy_irq.int2.addr))
 		pdata =	(struct st_sensors_platform_data *)&default_press_pdata;
 
 	err = st_sensors_init_sensor(indio_dev, press_data->dev->platform_data);
diff --git a/include/linux/iio/common/st_sensors.h b/include/linux/iio/common/st_sensors.h
index 7b0fa8b5c120..ac3aa89518ca 100644
--- a/include/linux/iio/common/st_sensors.h
+++ b/include/linux/iio/common/st_sensors.h
@@ -132,9 +132,8 @@ struct st_sensor_das {
 
 /**
  * struct st_sensor_data_ready_irq - ST sensor device data-ready interrupt
- * @addr: address of the register.
- * @mask_int1: mask to enable/disable IRQ on INT1 pin.
- * @mask_int2: mask to enable/disable IRQ on INT2 pin.
+ * struct int1 - data-ready configuration register for INT1 pin.
+ * struct int2 - data-ready configuration register for INT2 pin.
  * @addr_ihl: address to enable/disable active low on the INT lines.
  * @mask_ihl: mask to enable/disable active low on the INT lines.
  * @addr_od: address to enable/disable Open Drain on the INT lines.
@@ -145,9 +144,14 @@ struct st_sensor_das {
  * @en_mask: mask to write the on/off value for enable.
  */
 struct st_sensor_data_ready_irq {
-	u8 addr;
-	u8 mask_int1;
-	u8 mask_int2;
+	struct {
+		u8 addr;
+		u8 mask;
+	} int1;
+	struct {
+		u8 addr;
+		u8 mask;
+	} int2;
 	u8 addr_ihl;
 	u8 mask_ihl;
 	u8 addr_od;
-- 
2.14.0


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

* [PATCH v2 2/5] iio: st_sensors: do not always write enable_axis register
  2017-08-17 17:37 ` Lorenzo Bianconi
@ 2017-08-17 17:37     ` Lorenzo Bianconi
  -1 siblings, 0 replies; 20+ messages in thread
From: Lorenzo Bianconi @ 2017-08-17 17:37 UTC (permalink / raw)
  To: jic23-DgEjT+Ai2ygdnm+yROfE0A
  Cc: linux-iio-u79uwXL29TY76Z2rM5mHXA,
	linus.walleij-QSEj5FYQhm4dnm+yROfE0A,
	lorenzo.bianconi-qxv4g6HH51o, devicetree-u79uwXL29TY76Z2rM5mHXA

New devices (e.g. LIS2DW12) enable all axis by default and do not export
that capability in register map. Check if the enable_axis register
address has been declared in st_sensor_settings map in order to verify if
the driver needs to enable all sensor axis

Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi-qxv4g6HH51o@public.gmane.org>
---
 drivers/iio/common/st_sensors/st_sensors_core.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/iio/common/st_sensors/st_sensors_core.c b/drivers/iio/common/st_sensors/st_sensors_core.c
index a26217b0604f..6331cc91e02d 100644
--- a/drivers/iio/common/st_sensors/st_sensors_core.c
+++ b/drivers/iio/common/st_sensors/st_sensors_core.c
@@ -221,11 +221,14 @@ EXPORT_SYMBOL(st_sensors_set_enable);
 int st_sensors_set_axis_enable(struct iio_dev *indio_dev, u8 axis_enable)
 {
 	struct st_sensor_data *sdata = iio_priv(indio_dev);
+	int err = 0;
 
-	return st_sensors_write_data_with_mask(indio_dev,
+	if (sdata->sensor_settings->enable_axis.addr)
+		err = st_sensors_write_data_with_mask(indio_dev,
 				sdata->sensor_settings->enable_axis.addr,
 				sdata->sensor_settings->enable_axis.mask,
 				axis_enable);
+	return err;
 }
 EXPORT_SYMBOL(st_sensors_set_axis_enable);
 
-- 
2.14.0

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

* [PATCH v2 2/5] iio: st_sensors: do not always write enable_axis register
@ 2017-08-17 17:37     ` Lorenzo Bianconi
  0 siblings, 0 replies; 20+ messages in thread
From: Lorenzo Bianconi @ 2017-08-17 17:37 UTC (permalink / raw)
  To: jic23; +Cc: linux-iio, linus.walleij, lorenzo.bianconi, devicetree

New devices (e.g. LIS2DW12) enable all axis by default and do not export
that capability in register map. Check if the enable_axis register
address has been declared in st_sensor_settings map in order to verify if
the driver needs to enable all sensor axis

Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@st.com>
---
 drivers/iio/common/st_sensors/st_sensors_core.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/iio/common/st_sensors/st_sensors_core.c b/drivers/iio/common/st_sensors/st_sensors_core.c
index a26217b0604f..6331cc91e02d 100644
--- a/drivers/iio/common/st_sensors/st_sensors_core.c
+++ b/drivers/iio/common/st_sensors/st_sensors_core.c
@@ -221,11 +221,14 @@ EXPORT_SYMBOL(st_sensors_set_enable);
 int st_sensors_set_axis_enable(struct iio_dev *indio_dev, u8 axis_enable)
 {
 	struct st_sensor_data *sdata = iio_priv(indio_dev);
+	int err = 0;
 
-	return st_sensors_write_data_with_mask(indio_dev,
+	if (sdata->sensor_settings->enable_axis.addr)
+		err = st_sensors_write_data_with_mask(indio_dev,
 				sdata->sensor_settings->enable_axis.addr,
 				sdata->sensor_settings->enable_axis.mask,
 				axis_enable);
+	return err;
 }
 EXPORT_SYMBOL(st_sensors_set_axis_enable);
 
-- 
2.14.0


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

* [PATCH v2 3/5] iio: st_sensors: add register mask for status register
  2017-08-17 17:37 ` Lorenzo Bianconi
@ 2017-08-17 17:37     ` Lorenzo Bianconi
  -1 siblings, 0 replies; 20+ messages in thread
From: Lorenzo Bianconi @ 2017-08-17 17:37 UTC (permalink / raw)
  To: jic23-DgEjT+Ai2ygdnm+yROfE0A
  Cc: linux-iio-u79uwXL29TY76Z2rM5mHXA,
	linus.walleij-QSEj5FYQhm4dnm+yROfE0A,
	lorenzo.bianconi-qxv4g6HH51o, devicetree-u79uwXL29TY76Z2rM5mHXA

Introduce register mask for data-ready status register since
pressure sensors (e.g. LPS22HB) export just two channels
(BIT(0) and BIT(1)) and BIT(2) is marked reserved while in
st_sensors_new_samples_available() value read from status register
is masked using 0x7.
Moreover do not mask status register using active_scan_mask since
now status value is properly masked and if the result is not zero the
interrupt has to be consumed by the driver. This fix an issue on LPS25H
and LPS331AP where channel definition is swapped respect to status
register.
Furthermore that change allows to properly support new devices
(e.g LIS2DW12) that report just ZYXDA (data-ready) field in status register
to figure out if the interrupt has been generated by the device.

Fixes: 97865fe41322 (iio: st_sensors: verify interrupt event to status)
Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi-qxv4g6HH51o@public.gmane.org>
---
 drivers/iio/accel/st_accel_core.c                  | 35 +++++++++++++++++-----
 drivers/iio/common/st_sensors/st_sensors_trigger.c | 16 +++-------
 drivers/iio/gyro/st_gyro_core.c                    | 15 ++++++++--
 drivers/iio/magnetometer/st_magn_core.c            |  5 +++-
 drivers/iio/pressure/st_pressure_core.c            | 15 ++++++++--
 include/linux/iio/common/st_sensors.h              |  7 +++--
 6 files changed, 65 insertions(+), 28 deletions(-)

diff --git a/drivers/iio/accel/st_accel_core.c b/drivers/iio/accel/st_accel_core.c
index 9fac5a41bacd..4d9190625630 100644
--- a/drivers/iio/accel/st_accel_core.c
+++ b/drivers/iio/accel/st_accel_core.c
@@ -165,7 +165,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
 			},
 			.addr_ihl = 0x25,
 			.mask_ihl = 0x02,
-			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
+			.stat_drdy = {
+				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
+				.mask = 0x07,
+			},
 		},
 		.sim = {
 			.addr = 0x23,
@@ -242,7 +245,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
 			.mask_ihl = 0x80,
 			.addr_od = 0x22,
 			.mask_od = 0x40,
-			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
+			.stat_drdy = {
+				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
+				.mask = 0x07,
+			},
 		},
 		.sim = {
 			.addr = 0x23,
@@ -325,7 +331,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
 			},
 			.addr_ihl = 0x23,
 			.mask_ihl = 0x40,
-			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
+			.stat_drdy = {
+				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
+				.mask = 0x07,
+			},
 			.ig1 = {
 				.en_addr = 0x23,
 				.en_mask = 0x08,
@@ -398,7 +407,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
 				.addr = 0x21,
 				.mask = 0x04,
 			},
-			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
+			.stat_drdy = {
+				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
+				.mask = 0x07,
+			},
 		},
 		.sim = {
 			.addr = 0x21,
@@ -465,7 +477,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
 			.mask_ihl = 0x80,
 			.addr_od = 0x22,
 			.mask_od = 0x40,
-			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
+			.stat_drdy = {
+				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
+				.mask = 0x07,
+			},
 		},
 		.sim = {
 			.addr = 0x21,
@@ -590,7 +605,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
 				.addr = 0x21,
 				.mask = 0x04,
 			},
-			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
+			.stat_drdy = {
+				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
+				.mask = 0x07,
+			},
 		},
 		.sim = {
 			.addr = 0x21,
@@ -662,7 +680,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
 			},
 			.addr_ihl = 0x25,
 			.mask_ihl = 0x02,
-			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
+			.stat_drdy = {
+				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
+				.mask = 0x07,
+			},
 		},
 		.sim = {
 			.addr = 0x23,
diff --git a/drivers/iio/common/st_sensors/st_sensors_trigger.c b/drivers/iio/common/st_sensors/st_sensors_trigger.c
index fa73e6795359..fdcc5a891958 100644
--- a/drivers/iio/common/st_sensors/st_sensors_trigger.c
+++ b/drivers/iio/common/st_sensors/st_sensors_trigger.c
@@ -31,7 +31,7 @@ static int st_sensors_new_samples_available(struct iio_dev *indio_dev,
 	int ret;
 
 	/* How would I know if I can't check it? */
-	if (!sdata->sensor_settings->drdy_irq.addr_stat_drdy)
+	if (!sdata->sensor_settings->drdy_irq.stat_drdy.addr)
 		return -EINVAL;
 
 	/* No scan mask, no interrupt */
@@ -39,23 +39,15 @@ static int st_sensors_new_samples_available(struct iio_dev *indio_dev,
 		return 0;
 
 	ret = sdata->tf->read_byte(&sdata->tb, sdata->dev,
-			sdata->sensor_settings->drdy_irq.addr_stat_drdy,
+			sdata->sensor_settings->drdy_irq.stat_drdy.addr,
 			&status);
 	if (ret < 0) {
 		dev_err(sdata->dev,
 			"error checking samples available\n");
 		return ret;
 	}
-	/*
-	 * the lower bits of .active_scan_mask[0] is directly mapped
-	 * to the channels on the sensor: either bit 0 for
-	 * one-dimensional sensors, or e.g. x,y,z for accelerometers,
-	 * gyroscopes or magnetometers. No sensor use more than 3
-	 * channels, so cut the other status bits here.
-	 */
-	status &= 0x07;
 
-	if (status & (u8)indio_dev->active_scan_mask[0])
+	if (status & sdata->sensor_settings->drdy_irq.stat_drdy.mask)
 		return 1;
 
 	return 0;
@@ -212,7 +204,7 @@ int st_sensors_allocate_trigger(struct iio_dev *indio_dev,
 	 * it was "our" interrupt.
 	 */
 	if (sdata->int_pin_open_drain &&
-	    sdata->sensor_settings->drdy_irq.addr_stat_drdy)
+	    sdata->sensor_settings->drdy_irq.stat_drdy.addr)
 		irq_trig |= IRQF_SHARED;
 
 	err = request_threaded_irq(sdata->get_irq_data_ready(indio_dev),
diff --git a/drivers/iio/gyro/st_gyro_core.c b/drivers/iio/gyro/st_gyro_core.c
index 764306378b20..4ebf1dafc13f 100644
--- a/drivers/iio/gyro/st_gyro_core.c
+++ b/drivers/iio/gyro/st_gyro_core.c
@@ -120,7 +120,10 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = {
 			 * drain settings, but only for INT1 and not
 			 * for the DRDY line on INT2.
 			 */
-			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
+			.stat_drdy = {
+				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
+				.mask = 0x07,
+			},
 		},
 		.multi_read_bit = true,
 		.bootime = 2,
@@ -192,7 +195,10 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = {
 			 * drain settings, but only for INT1 and not
 			 * for the DRDY line on INT2.
 			 */
-			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
+			.stat_drdy = {
+				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
+				.mask = 0x07,
+			},
 		},
 		.multi_read_bit = true,
 		.bootime = 2,
@@ -259,7 +265,10 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = {
 			 * drain settings, but only for INT1 and not
 			 * for the DRDY line on INT2.
 			 */
-			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
+			.stat_drdy = {
+				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
+				.mask = 0x07,
+			},
 		},
 		.multi_read_bit = true,
 		.bootime = 2,
diff --git a/drivers/iio/magnetometer/st_magn_core.c b/drivers/iio/magnetometer/st_magn_core.c
index 2c465cbe3b0a..6d404d2e71be 100644
--- a/drivers/iio/magnetometer/st_magn_core.c
+++ b/drivers/iio/magnetometer/st_magn_core.c
@@ -359,7 +359,10 @@ static const struct st_sensor_settings st_magn_sensors_settings[] = {
 				.addr = 0x62,
 				.mask = 0x01,
 			},
-			.addr_stat_drdy = 0x67,
+			.stat_drdy = {
+				.addr = 0x67,
+				.mask = 0x07,
+			},
 		},
 		.multi_read_bit = false,
 		.bootime = 2,
diff --git a/drivers/iio/pressure/st_pressure_core.c b/drivers/iio/pressure/st_pressure_core.c
index 240fa9f3ee3b..db2ac4d094fc 100644
--- a/drivers/iio/pressure/st_pressure_core.c
+++ b/drivers/iio/pressure/st_pressure_core.c
@@ -292,7 +292,10 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
 			.mask_ihl = 0x80,
 			.addr_od = 0x22,
 			.mask_od = 0x40,
-			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
+			.stat_drdy = {
+				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
+				.mask = 0x03,
+			},
 		},
 		.multi_read_bit = true,
 		.bootime = 2,
@@ -398,7 +401,10 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
 			.mask_ihl = 0x80,
 			.addr_od = 0x22,
 			.mask_od = 0x40,
-			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
+			.stat_drdy = {
+				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
+				.mask = 0x03,
+			},
 		},
 		.multi_read_bit = true,
 		.bootime = 2,
@@ -458,7 +464,10 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
 			.mask_ihl = 0x80,
 			.addr_od = 0x12,
 			.mask_od = 0x40,
-			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
+			.stat_drdy = {
+				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
+				.mask = 0x03,
+			},
 		},
 		.multi_read_bit = true,
 		.bootime = 2,
diff --git a/include/linux/iio/common/st_sensors.h b/include/linux/iio/common/st_sensors.h
index ac3aa89518ca..e6c646d5d6d4 100644
--- a/include/linux/iio/common/st_sensors.h
+++ b/include/linux/iio/common/st_sensors.h
@@ -138,7 +138,7 @@ struct st_sensor_das {
  * @mask_ihl: mask to enable/disable active low on the INT lines.
  * @addr_od: address to enable/disable Open Drain on the INT lines.
  * @mask_od: mask to enable/disable Open Drain on the INT lines.
- * @addr_stat_drdy: address to read status of DRDY (data ready) interrupt
+ * struct stat_drdy - status register of DRDY (data ready) interrupt.
  * struct ig1 - represents the Interrupt Generator 1 of sensors.
  * @en_addr: address of the enable ig1 register.
  * @en_mask: mask to write the on/off value for enable.
@@ -156,7 +156,10 @@ struct st_sensor_data_ready_irq {
 	u8 mask_ihl;
 	u8 addr_od;
 	u8 mask_od;
-	u8 addr_stat_drdy;
+	struct {
+		u8 addr;
+		u8 mask;
+	} stat_drdy;
 	struct {
 		u8 en_addr;
 		u8 en_mask;
-- 
2.14.0

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* [PATCH v2 3/5] iio: st_sensors: add register mask for status register
@ 2017-08-17 17:37     ` Lorenzo Bianconi
  0 siblings, 0 replies; 20+ messages in thread
From: Lorenzo Bianconi @ 2017-08-17 17:37 UTC (permalink / raw)
  To: jic23; +Cc: linux-iio, linus.walleij, lorenzo.bianconi, devicetree

Introduce register mask for data-ready status register since
pressure sensors (e.g. LPS22HB) export just two channels
(BIT(0) and BIT(1)) and BIT(2) is marked reserved while in
st_sensors_new_samples_available() value read from status register
is masked using 0x7.
Moreover do not mask status register using active_scan_mask since
now status value is properly masked and if the result is not zero the
interrupt has to be consumed by the driver. This fix an issue on LPS25H
and LPS331AP where channel definition is swapped respect to status
register.
Furthermore that change allows to properly support new devices
(e.g LIS2DW12) that report just ZYXDA (data-ready) field in status register
to figure out if the interrupt has been generated by the device.

Fixes: 97865fe41322 (iio: st_sensors: verify interrupt event to status)
Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@st.com>
---
 drivers/iio/accel/st_accel_core.c                  | 35 +++++++++++++++++-----
 drivers/iio/common/st_sensors/st_sensors_trigger.c | 16 +++-------
 drivers/iio/gyro/st_gyro_core.c                    | 15 ++++++++--
 drivers/iio/magnetometer/st_magn_core.c            |  5 +++-
 drivers/iio/pressure/st_pressure_core.c            | 15 ++++++++--
 include/linux/iio/common/st_sensors.h              |  7 +++--
 6 files changed, 65 insertions(+), 28 deletions(-)

diff --git a/drivers/iio/accel/st_accel_core.c b/drivers/iio/accel/st_accel_core.c
index 9fac5a41bacd..4d9190625630 100644
--- a/drivers/iio/accel/st_accel_core.c
+++ b/drivers/iio/accel/st_accel_core.c
@@ -165,7 +165,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
 			},
 			.addr_ihl = 0x25,
 			.mask_ihl = 0x02,
-			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
+			.stat_drdy = {
+				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
+				.mask = 0x07,
+			},
 		},
 		.sim = {
 			.addr = 0x23,
@@ -242,7 +245,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
 			.mask_ihl = 0x80,
 			.addr_od = 0x22,
 			.mask_od = 0x40,
-			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
+			.stat_drdy = {
+				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
+				.mask = 0x07,
+			},
 		},
 		.sim = {
 			.addr = 0x23,
@@ -325,7 +331,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
 			},
 			.addr_ihl = 0x23,
 			.mask_ihl = 0x40,
-			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
+			.stat_drdy = {
+				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
+				.mask = 0x07,
+			},
 			.ig1 = {
 				.en_addr = 0x23,
 				.en_mask = 0x08,
@@ -398,7 +407,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
 				.addr = 0x21,
 				.mask = 0x04,
 			},
-			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
+			.stat_drdy = {
+				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
+				.mask = 0x07,
+			},
 		},
 		.sim = {
 			.addr = 0x21,
@@ -465,7 +477,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
 			.mask_ihl = 0x80,
 			.addr_od = 0x22,
 			.mask_od = 0x40,
-			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
+			.stat_drdy = {
+				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
+				.mask = 0x07,
+			},
 		},
 		.sim = {
 			.addr = 0x21,
@@ -590,7 +605,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
 				.addr = 0x21,
 				.mask = 0x04,
 			},
-			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
+			.stat_drdy = {
+				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
+				.mask = 0x07,
+			},
 		},
 		.sim = {
 			.addr = 0x21,
@@ -662,7 +680,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
 			},
 			.addr_ihl = 0x25,
 			.mask_ihl = 0x02,
-			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
+			.stat_drdy = {
+				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
+				.mask = 0x07,
+			},
 		},
 		.sim = {
 			.addr = 0x23,
diff --git a/drivers/iio/common/st_sensors/st_sensors_trigger.c b/drivers/iio/common/st_sensors/st_sensors_trigger.c
index fa73e6795359..fdcc5a891958 100644
--- a/drivers/iio/common/st_sensors/st_sensors_trigger.c
+++ b/drivers/iio/common/st_sensors/st_sensors_trigger.c
@@ -31,7 +31,7 @@ static int st_sensors_new_samples_available(struct iio_dev *indio_dev,
 	int ret;
 
 	/* How would I know if I can't check it? */
-	if (!sdata->sensor_settings->drdy_irq.addr_stat_drdy)
+	if (!sdata->sensor_settings->drdy_irq.stat_drdy.addr)
 		return -EINVAL;
 
 	/* No scan mask, no interrupt */
@@ -39,23 +39,15 @@ static int st_sensors_new_samples_available(struct iio_dev *indio_dev,
 		return 0;
 
 	ret = sdata->tf->read_byte(&sdata->tb, sdata->dev,
-			sdata->sensor_settings->drdy_irq.addr_stat_drdy,
+			sdata->sensor_settings->drdy_irq.stat_drdy.addr,
 			&status);
 	if (ret < 0) {
 		dev_err(sdata->dev,
 			"error checking samples available\n");
 		return ret;
 	}
-	/*
-	 * the lower bits of .active_scan_mask[0] is directly mapped
-	 * to the channels on the sensor: either bit 0 for
-	 * one-dimensional sensors, or e.g. x,y,z for accelerometers,
-	 * gyroscopes or magnetometers. No sensor use more than 3
-	 * channels, so cut the other status bits here.
-	 */
-	status &= 0x07;
 
-	if (status & (u8)indio_dev->active_scan_mask[0])
+	if (status & sdata->sensor_settings->drdy_irq.stat_drdy.mask)
 		return 1;
 
 	return 0;
@@ -212,7 +204,7 @@ int st_sensors_allocate_trigger(struct iio_dev *indio_dev,
 	 * it was "our" interrupt.
 	 */
 	if (sdata->int_pin_open_drain &&
-	    sdata->sensor_settings->drdy_irq.addr_stat_drdy)
+	    sdata->sensor_settings->drdy_irq.stat_drdy.addr)
 		irq_trig |= IRQF_SHARED;
 
 	err = request_threaded_irq(sdata->get_irq_data_ready(indio_dev),
diff --git a/drivers/iio/gyro/st_gyro_core.c b/drivers/iio/gyro/st_gyro_core.c
index 764306378b20..4ebf1dafc13f 100644
--- a/drivers/iio/gyro/st_gyro_core.c
+++ b/drivers/iio/gyro/st_gyro_core.c
@@ -120,7 +120,10 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = {
 			 * drain settings, but only for INT1 and not
 			 * for the DRDY line on INT2.
 			 */
-			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
+			.stat_drdy = {
+				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
+				.mask = 0x07,
+			},
 		},
 		.multi_read_bit = true,
 		.bootime = 2,
@@ -192,7 +195,10 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = {
 			 * drain settings, but only for INT1 and not
 			 * for the DRDY line on INT2.
 			 */
-			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
+			.stat_drdy = {
+				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
+				.mask = 0x07,
+			},
 		},
 		.multi_read_bit = true,
 		.bootime = 2,
@@ -259,7 +265,10 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = {
 			 * drain settings, but only for INT1 and not
 			 * for the DRDY line on INT2.
 			 */
-			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
+			.stat_drdy = {
+				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
+				.mask = 0x07,
+			},
 		},
 		.multi_read_bit = true,
 		.bootime = 2,
diff --git a/drivers/iio/magnetometer/st_magn_core.c b/drivers/iio/magnetometer/st_magn_core.c
index 2c465cbe3b0a..6d404d2e71be 100644
--- a/drivers/iio/magnetometer/st_magn_core.c
+++ b/drivers/iio/magnetometer/st_magn_core.c
@@ -359,7 +359,10 @@ static const struct st_sensor_settings st_magn_sensors_settings[] = {
 				.addr = 0x62,
 				.mask = 0x01,
 			},
-			.addr_stat_drdy = 0x67,
+			.stat_drdy = {
+				.addr = 0x67,
+				.mask = 0x07,
+			},
 		},
 		.multi_read_bit = false,
 		.bootime = 2,
diff --git a/drivers/iio/pressure/st_pressure_core.c b/drivers/iio/pressure/st_pressure_core.c
index 240fa9f3ee3b..db2ac4d094fc 100644
--- a/drivers/iio/pressure/st_pressure_core.c
+++ b/drivers/iio/pressure/st_pressure_core.c
@@ -292,7 +292,10 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
 			.mask_ihl = 0x80,
 			.addr_od = 0x22,
 			.mask_od = 0x40,
-			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
+			.stat_drdy = {
+				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
+				.mask = 0x03,
+			},
 		},
 		.multi_read_bit = true,
 		.bootime = 2,
@@ -398,7 +401,10 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
 			.mask_ihl = 0x80,
 			.addr_od = 0x22,
 			.mask_od = 0x40,
-			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
+			.stat_drdy = {
+				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
+				.mask = 0x03,
+			},
 		},
 		.multi_read_bit = true,
 		.bootime = 2,
@@ -458,7 +464,10 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
 			.mask_ihl = 0x80,
 			.addr_od = 0x12,
 			.mask_od = 0x40,
-			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
+			.stat_drdy = {
+				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
+				.mask = 0x03,
+			},
 		},
 		.multi_read_bit = true,
 		.bootime = 2,
diff --git a/include/linux/iio/common/st_sensors.h b/include/linux/iio/common/st_sensors.h
index ac3aa89518ca..e6c646d5d6d4 100644
--- a/include/linux/iio/common/st_sensors.h
+++ b/include/linux/iio/common/st_sensors.h
@@ -138,7 +138,7 @@ struct st_sensor_das {
  * @mask_ihl: mask to enable/disable active low on the INT lines.
  * @addr_od: address to enable/disable Open Drain on the INT lines.
  * @mask_od: mask to enable/disable Open Drain on the INT lines.
- * @addr_stat_drdy: address to read status of DRDY (data ready) interrupt
+ * struct stat_drdy - status register of DRDY (data ready) interrupt.
  * struct ig1 - represents the Interrupt Generator 1 of sensors.
  * @en_addr: address of the enable ig1 register.
  * @en_mask: mask to write the on/off value for enable.
@@ -156,7 +156,10 @@ struct st_sensor_data_ready_irq {
 	u8 mask_ihl;
 	u8 addr_od;
 	u8 mask_od;
-	u8 addr_stat_drdy;
+	struct {
+		u8 addr;
+		u8 mask;
+	} stat_drdy;
 	struct {
 		u8 en_addr;
 		u8 en_mask;
-- 
2.14.0

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

* [PATCH v2 4/5] iio: accel: add support to LIS2DW12
  2017-08-17 17:37 ` Lorenzo Bianconi
@ 2017-08-17 17:37     ` Lorenzo Bianconi
  -1 siblings, 0 replies; 20+ messages in thread
From: Lorenzo Bianconi @ 2017-08-17 17:37 UTC (permalink / raw)
  To: jic23-DgEjT+Ai2ygdnm+yROfE0A
  Cc: linux-iio-u79uwXL29TY76Z2rM5mHXA,
	linus.walleij-QSEj5FYQhm4dnm+yROfE0A,
	lorenzo.bianconi-qxv4g6HH51o, devicetree-u79uwXL29TY76Z2rM5mHXA

add support to STMicroelectronics LIS2DW12 accelerometer in
st_accel framework

http://www.st.com/resource/en/datasheet/lis2dw12.pdf
Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi-qxv4g6HH51o@public.gmane.org>
---
 drivers/iio/accel/st_accel.h      |  2 +
 drivers/iio/accel/st_accel_core.c | 79 +++++++++++++++++++++++++++++++++++++++
 drivers/iio/accel/st_accel_i2c.c  |  5 +++
 drivers/iio/accel/st_accel_spi.c  |  5 +++
 4 files changed, 91 insertions(+)

diff --git a/drivers/iio/accel/st_accel.h b/drivers/iio/accel/st_accel.h
index 0fe521609a3a..2ed0f60418c0 100644
--- a/drivers/iio/accel/st_accel.h
+++ b/drivers/iio/accel/st_accel.h
@@ -32,6 +32,7 @@ enum st_accel_type {
 	H3LIS331DL,
 	LIS331DL,
 	LIS3LV02DL,
+	LIS2DW12,
 	ST_ACCEL_MAX,
 };
 
@@ -52,6 +53,7 @@ enum st_accel_type {
 #define LIS2DH12_ACCEL_DEV_NAME		"lis2dh12_accel"
 #define LIS3L02DQ_ACCEL_DEV_NAME	"lis3l02dq"
 #define LNG2DM_ACCEL_DEV_NAME		"lng2dm"
+#define LIS2DW12_ACCEL_DEV_NAME		"lis2dw12"
 
 /**
 * struct st_sensors_platform_data - default accel platform data
diff --git a/drivers/iio/accel/st_accel_core.c b/drivers/iio/accel/st_accel_core.c
index 4d9190625630..42ada20daca0 100644
--- a/drivers/iio/accel/st_accel_core.c
+++ b/drivers/iio/accel/st_accel_core.c
@@ -692,6 +692,85 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
 		.multi_read_bit = true,
 		.bootime = 2,
 	},
+	{
+		.wai = 0x44,
+		.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
+		.sensors_supported = {
+			[0] = LIS2DW12_ACCEL_DEV_NAME,
+		},
+		.ch = (struct iio_chan_spec *)st_accel_12bit_channels,
+		.odr = {
+			.addr = 0x20,
+			.mask = 0xf0,
+			.odr_avl = {
+				{ .hz = 1, .value = 0x01, },
+				{ .hz = 12, .value = 0x02, },
+				{ .hz = 25, .value = 0x03, },
+				{ .hz = 50, .value = 0x04, },
+				{ .hz = 100, .value = 0x05, },
+				{ .hz = 200, .value = 0x06, },
+			},
+		},
+		.pw = {
+			.addr = 0x20,
+			.mask = 0xf0,
+			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
+		},
+		.fs = {
+			.addr = 0x25,
+			.mask = 0x30,
+			.fs_avl = {
+				[0] = {
+					.num = ST_ACCEL_FS_AVL_2G,
+					.value = 0x00,
+					.gain = IIO_G_TO_M_S_2(976),
+				},
+				[1] = {
+					.num = ST_ACCEL_FS_AVL_4G,
+					.value = 0x01,
+					.gain = IIO_G_TO_M_S_2(1952),
+				},
+				[2] = {
+					.num = ST_ACCEL_FS_AVL_8G,
+					.value = 0x02,
+					.gain = IIO_G_TO_M_S_2(3904),
+				},
+				[3] = {
+					.num = ST_ACCEL_FS_AVL_16G,
+					.value = 0x03,
+					.gain = IIO_G_TO_M_S_2(7808),
+				},
+			},
+		},
+		.bdu = {
+			.addr = 0x21,
+			.mask = 0x08,
+		},
+		.drdy_irq = {
+			.int1 = {
+				.addr = 0x23,
+				.mask = 0x01,
+			},
+			.int2 = {
+				.addr = 0x24,
+				.mask = 0x01,
+			},
+			.addr_ihl = 0x22,
+			.mask_ihl = 0x08,
+			.addr_od = 0x22,
+			.mask_od = 0x20,
+			.stat_drdy = {
+				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
+				.mask = 0x01,
+			},
+		},
+		.sim = {
+			.addr = 0x21,
+			.value = BIT(0),
+		},
+		.multi_read_bit = false,
+		.bootime = 2,
+	},
 };
 
 static int st_accel_read_raw(struct iio_dev *indio_dev,
diff --git a/drivers/iio/accel/st_accel_i2c.c b/drivers/iio/accel/st_accel_i2c.c
index 18cafb9f2468..363429b5686c 100644
--- a/drivers/iio/accel/st_accel_i2c.c
+++ b/drivers/iio/accel/st_accel_i2c.c
@@ -94,6 +94,10 @@ static const struct of_device_id st_accel_of_match[] = {
 		.compatible = "st,lng2dm-accel",
 		.data = LNG2DM_ACCEL_DEV_NAME,
 	},
+	{
+		.compatible = "st,lis2dw12",
+		.data = LIS2DW12_ACCEL_DEV_NAME,
+	},
 	{},
 };
 MODULE_DEVICE_TABLE(of, st_accel_of_match);
@@ -129,6 +133,7 @@ static const struct i2c_device_id st_accel_id_table[] = {
 	{ H3LIS331DL_ACCEL_DEV_NAME, H3LIS331DL },
 	{ LIS331DL_ACCEL_DEV_NAME, LIS331DL },
 	{ LIS3LV02DL_ACCEL_DEV_NAME, LIS3LV02DL },
+	{ LIS2DW12_ACCEL_DEV_NAME, LIS2DW12 },
 	{},
 };
 MODULE_DEVICE_TABLE(i2c, st_accel_id_table);
diff --git a/drivers/iio/accel/st_accel_spi.c b/drivers/iio/accel/st_accel_spi.c
index 915fa49085f7..7692da49e59f 100644
--- a/drivers/iio/accel/st_accel_spi.c
+++ b/drivers/iio/accel/st_accel_spi.c
@@ -82,6 +82,10 @@ static const struct of_device_id st_accel_of_match[] = {
 		.compatible = "st,lis331dl-accel",
 		.data = LIS331DL_ACCEL_DEV_NAME,
 	},
+	{
+		.compatible = "st,lis2dw12",
+		.data = LIS2DW12_ACCEL_DEV_NAME,
+	},
 	{}
 };
 MODULE_DEVICE_TABLE(of, st_accel_of_match);
@@ -133,6 +137,7 @@ static const struct spi_device_id st_accel_id_table[] = {
 	{ H3LIS331DL_ACCEL_DEV_NAME },
 	{ LIS331DL_ACCEL_DEV_NAME },
 	{ LIS3LV02DL_ACCEL_DEV_NAME },
+	{ LIS2DW12_ACCEL_DEV_NAME },
 	{},
 };
 MODULE_DEVICE_TABLE(spi, st_accel_id_table);
-- 
2.14.0

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* [PATCH v2 4/5] iio: accel: add support to LIS2DW12
@ 2017-08-17 17:37     ` Lorenzo Bianconi
  0 siblings, 0 replies; 20+ messages in thread
From: Lorenzo Bianconi @ 2017-08-17 17:37 UTC (permalink / raw)
  To: jic23; +Cc: linux-iio, linus.walleij, lorenzo.bianconi, devicetree

add support to STMicroelectronics LIS2DW12 accelerometer in
st_accel framework

http://www.st.com/resource/en/datasheet/lis2dw12.pdf
Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@st.com>
---
 drivers/iio/accel/st_accel.h      |  2 +
 drivers/iio/accel/st_accel_core.c | 79 +++++++++++++++++++++++++++++++++++++++
 drivers/iio/accel/st_accel_i2c.c  |  5 +++
 drivers/iio/accel/st_accel_spi.c  |  5 +++
 4 files changed, 91 insertions(+)

diff --git a/drivers/iio/accel/st_accel.h b/drivers/iio/accel/st_accel.h
index 0fe521609a3a..2ed0f60418c0 100644
--- a/drivers/iio/accel/st_accel.h
+++ b/drivers/iio/accel/st_accel.h
@@ -32,6 +32,7 @@ enum st_accel_type {
 	H3LIS331DL,
 	LIS331DL,
 	LIS3LV02DL,
+	LIS2DW12,
 	ST_ACCEL_MAX,
 };
 
@@ -52,6 +53,7 @@ enum st_accel_type {
 #define LIS2DH12_ACCEL_DEV_NAME		"lis2dh12_accel"
 #define LIS3L02DQ_ACCEL_DEV_NAME	"lis3l02dq"
 #define LNG2DM_ACCEL_DEV_NAME		"lng2dm"
+#define LIS2DW12_ACCEL_DEV_NAME		"lis2dw12"
 
 /**
 * struct st_sensors_platform_data - default accel platform data
diff --git a/drivers/iio/accel/st_accel_core.c b/drivers/iio/accel/st_accel_core.c
index 4d9190625630..42ada20daca0 100644
--- a/drivers/iio/accel/st_accel_core.c
+++ b/drivers/iio/accel/st_accel_core.c
@@ -692,6 +692,85 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
 		.multi_read_bit = true,
 		.bootime = 2,
 	},
+	{
+		.wai = 0x44,
+		.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
+		.sensors_supported = {
+			[0] = LIS2DW12_ACCEL_DEV_NAME,
+		},
+		.ch = (struct iio_chan_spec *)st_accel_12bit_channels,
+		.odr = {
+			.addr = 0x20,
+			.mask = 0xf0,
+			.odr_avl = {
+				{ .hz = 1, .value = 0x01, },
+				{ .hz = 12, .value = 0x02, },
+				{ .hz = 25, .value = 0x03, },
+				{ .hz = 50, .value = 0x04, },
+				{ .hz = 100, .value = 0x05, },
+				{ .hz = 200, .value = 0x06, },
+			},
+		},
+		.pw = {
+			.addr = 0x20,
+			.mask = 0xf0,
+			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
+		},
+		.fs = {
+			.addr = 0x25,
+			.mask = 0x30,
+			.fs_avl = {
+				[0] = {
+					.num = ST_ACCEL_FS_AVL_2G,
+					.value = 0x00,
+					.gain = IIO_G_TO_M_S_2(976),
+				},
+				[1] = {
+					.num = ST_ACCEL_FS_AVL_4G,
+					.value = 0x01,
+					.gain = IIO_G_TO_M_S_2(1952),
+				},
+				[2] = {
+					.num = ST_ACCEL_FS_AVL_8G,
+					.value = 0x02,
+					.gain = IIO_G_TO_M_S_2(3904),
+				},
+				[3] = {
+					.num = ST_ACCEL_FS_AVL_16G,
+					.value = 0x03,
+					.gain = IIO_G_TO_M_S_2(7808),
+				},
+			},
+		},
+		.bdu = {
+			.addr = 0x21,
+			.mask = 0x08,
+		},
+		.drdy_irq = {
+			.int1 = {
+				.addr = 0x23,
+				.mask = 0x01,
+			},
+			.int2 = {
+				.addr = 0x24,
+				.mask = 0x01,
+			},
+			.addr_ihl = 0x22,
+			.mask_ihl = 0x08,
+			.addr_od = 0x22,
+			.mask_od = 0x20,
+			.stat_drdy = {
+				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
+				.mask = 0x01,
+			},
+		},
+		.sim = {
+			.addr = 0x21,
+			.value = BIT(0),
+		},
+		.multi_read_bit = false,
+		.bootime = 2,
+	},
 };
 
 static int st_accel_read_raw(struct iio_dev *indio_dev,
diff --git a/drivers/iio/accel/st_accel_i2c.c b/drivers/iio/accel/st_accel_i2c.c
index 18cafb9f2468..363429b5686c 100644
--- a/drivers/iio/accel/st_accel_i2c.c
+++ b/drivers/iio/accel/st_accel_i2c.c
@@ -94,6 +94,10 @@ static const struct of_device_id st_accel_of_match[] = {
 		.compatible = "st,lng2dm-accel",
 		.data = LNG2DM_ACCEL_DEV_NAME,
 	},
+	{
+		.compatible = "st,lis2dw12",
+		.data = LIS2DW12_ACCEL_DEV_NAME,
+	},
 	{},
 };
 MODULE_DEVICE_TABLE(of, st_accel_of_match);
@@ -129,6 +133,7 @@ static const struct i2c_device_id st_accel_id_table[] = {
 	{ H3LIS331DL_ACCEL_DEV_NAME, H3LIS331DL },
 	{ LIS331DL_ACCEL_DEV_NAME, LIS331DL },
 	{ LIS3LV02DL_ACCEL_DEV_NAME, LIS3LV02DL },
+	{ LIS2DW12_ACCEL_DEV_NAME, LIS2DW12 },
 	{},
 };
 MODULE_DEVICE_TABLE(i2c, st_accel_id_table);
diff --git a/drivers/iio/accel/st_accel_spi.c b/drivers/iio/accel/st_accel_spi.c
index 915fa49085f7..7692da49e59f 100644
--- a/drivers/iio/accel/st_accel_spi.c
+++ b/drivers/iio/accel/st_accel_spi.c
@@ -82,6 +82,10 @@ static const struct of_device_id st_accel_of_match[] = {
 		.compatible = "st,lis331dl-accel",
 		.data = LIS331DL_ACCEL_DEV_NAME,
 	},
+	{
+		.compatible = "st,lis2dw12",
+		.data = LIS2DW12_ACCEL_DEV_NAME,
+	},
 	{}
 };
 MODULE_DEVICE_TABLE(of, st_accel_of_match);
@@ -133,6 +137,7 @@ static const struct spi_device_id st_accel_id_table[] = {
 	{ H3LIS331DL_ACCEL_DEV_NAME },
 	{ LIS331DL_ACCEL_DEV_NAME },
 	{ LIS3LV02DL_ACCEL_DEV_NAME },
+	{ LIS2DW12_ACCEL_DEV_NAME },
 	{},
 };
 MODULE_DEVICE_TABLE(spi, st_accel_id_table);
-- 
2.14.0

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

* [PATCH v2 5/5] dt-bindings: iio: accel: add LIS2DW12 sensor device binding
  2017-08-17 17:37 ` Lorenzo Bianconi
@ 2017-08-17 17:37     ` Lorenzo Bianconi
  -1 siblings, 0 replies; 20+ messages in thread
From: Lorenzo Bianconi @ 2017-08-17 17:37 UTC (permalink / raw)
  To: jic23-DgEjT+Ai2ygdnm+yROfE0A
  Cc: linux-iio-u79uwXL29TY76Z2rM5mHXA,
	linus.walleij-QSEj5FYQhm4dnm+yROfE0A,
	lorenzo.bianconi-qxv4g6HH51o, devicetree-u79uwXL29TY76Z2rM5mHXA

Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi-qxv4g6HH51o@public.gmane.org>
---
 Documentation/devicetree/bindings/iio/st-sensors.txt | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Documentation/devicetree/bindings/iio/st-sensors.txt b/Documentation/devicetree/bindings/iio/st-sensors.txt
index 9ec6f5ce54fc..be64357808d0 100644
--- a/Documentation/devicetree/bindings/iio/st-sensors.txt
+++ b/Documentation/devicetree/bindings/iio/st-sensors.txt
@@ -46,6 +46,7 @@ Accelerometers:
 - st,h3lis331dl-accel
 - st,lng2dm-accel
 - st,lis3l02dq
+- st,lis2dw12
 
 Gyroscopes:
 - st,l3g4200d-gyro
-- 
2.14.0

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* [PATCH v2 5/5] dt-bindings: iio: accel: add LIS2DW12 sensor device binding
@ 2017-08-17 17:37     ` Lorenzo Bianconi
  0 siblings, 0 replies; 20+ messages in thread
From: Lorenzo Bianconi @ 2017-08-17 17:37 UTC (permalink / raw)
  To: jic23; +Cc: linux-iio, linus.walleij, lorenzo.bianconi, devicetree

Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@st.com>
---
 Documentation/devicetree/bindings/iio/st-sensors.txt | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Documentation/devicetree/bindings/iio/st-sensors.txt b/Documentation/devicetree/bindings/iio/st-sensors.txt
index 9ec6f5ce54fc..be64357808d0 100644
--- a/Documentation/devicetree/bindings/iio/st-sensors.txt
+++ b/Documentation/devicetree/bindings/iio/st-sensors.txt
@@ -46,6 +46,7 @@ Accelerometers:
 - st,h3lis331dl-accel
 - st,lng2dm-accel
 - st,lis3l02dq
+- st,lis2dw12
 
 Gyroscopes:
 - st,l3g4200d-gyro
-- 
2.14.0


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

* Re: [PATCH v2 1/5] iio: st_sensors: decouple irq1 configuration parameters from the irq2 ones
  2017-08-17 17:37     ` Lorenzo Bianconi
@ 2017-08-20  9:41         ` Jonathan Cameron
  -1 siblings, 0 replies; 20+ messages in thread
From: Jonathan Cameron @ 2017-08-20  9:41 UTC (permalink / raw)
  To: Lorenzo Bianconi
  Cc: linux-iio-u79uwXL29TY76Z2rM5mHXA,
	linus.walleij-QSEj5FYQhm4dnm+yROfE0A,
	lorenzo.bianconi-qxv4g6HH51o, devicetree-u79uwXL29TY76Z2rM5mHXA

On Thu, 17 Aug 2017 19:37:25 +0200
Lorenzo Bianconi <lorenzo.bianconi83-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:

> Separate data-ready configuration parameters for INT1 and INT2 pins in
> st_sensor_data_ready_irq data structure. That change will be use to
> properly support LIS2DW12 accel sensor.
> 
> Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi-qxv4g6HH51o@public.gmane.org>
Unfortunately I'll have to hold this series for now as the 3/4 wire
patch need for the latter part of the series hasn't yet made it
back to my tree from the fixes branch.

Let me know if I seem to have forgotten it. 

Thanks,

Jonathan
> ---
>  drivers/iio/accel/st_accel_core.c               | 66 ++++++++++++++++---------
>  drivers/iio/common/st_sensors/st_sensors_core.c | 28 ++++++-----
>  drivers/iio/gyro/st_gyro_core.c                 | 18 ++++---
>  drivers/iio/magnetometer/st_magn_core.c         |  6 ++-
>  drivers/iio/pressure/st_pressure_core.c         | 31 +++++++-----
>  include/linux/iio/common/st_sensors.h           | 16 +++---
>  6 files changed, 104 insertions(+), 61 deletions(-)
> 
> diff --git a/drivers/iio/accel/st_accel_core.c b/drivers/iio/accel/st_accel_core.c
> index 752856b3a849..9fac5a41bacd 100644
> --- a/drivers/iio/accel/st_accel_core.c
> +++ b/drivers/iio/accel/st_accel_core.c
> @@ -159,9 +159,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
>  			.mask = 0x80,
>  		},
>  		.drdy_irq = {
> -			.addr = 0x22,
> -			.mask_int1 = 0x10,
> -			.mask_int2 = 0x00,
> +			.int1 = {
> +				.addr = 0x22,
> +				.mask = 0x10,
> +			},
>  			.addr_ihl = 0x25,
>  			.mask_ihl = 0x02,
>  			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
> @@ -229,9 +230,14 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
>  			.mask = 0x80,
>  		},
>  		.drdy_irq = {
> -			.addr = 0x22,
> -			.mask_int1 = 0x02,
> -			.mask_int2 = 0x10,
> +			.int1 = {
> +				.addr = 0x22,
> +				.mask = 0x02,
> +			},
> +			.int2 = {
> +				.addr = 0x22,
> +				.mask = 0x10,
> +			},
>  			.addr_ihl = 0x22,
>  			.mask_ihl = 0x80,
>  			.addr_od = 0x22,
> @@ -313,9 +319,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
>  			.mask = 0x08,
>  		},
>  		.drdy_irq = {
> -			.addr = 0x23,
> -			.mask_int1 = 0x80,
> -			.mask_int2 = 0x00,
> +			.int1 = {
> +				.addr = 0x23,
> +				.mask = 0x80,
> +			},
>  			.addr_ihl = 0x23,
>  			.mask_ihl = 0x40,
>  			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
> @@ -387,8 +394,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
>  			.mask = 0x01,
>  		},
>  		.drdy_irq = {
> -			.addr = 0x21,
> -			.mask_int1 = 0x04,
> +			.int1 = {
> +				.addr = 0x21,
> +				.mask = 0x04,
> +			},
>  			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
>  		},
>  		.sim = {
> @@ -444,9 +453,14 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
>  			},
>  		},
>  		.drdy_irq = {
> -			.addr = 0x22,
> -			.mask_int1 = 0x04,
> -			.mask_int2 = 0x20,
> +			.int1 = {
> +				.addr = 0x22,
> +				.mask = 0x04,
> +			},
> +			.int2 = {
> +				.addr = 0x22,
> +				.mask = 0x20,
> +			},
>  			.addr_ihl = 0x22,
>  			.mask_ihl = 0x80,
>  			.addr_od = 0x22,
> @@ -513,9 +527,14 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
>  			.mask = 0x80,
>  		},
>  		.drdy_irq = {
> -			.addr = 0x22,
> -			.mask_int1 = 0x02,
> -			.mask_int2 = 0x10,
> +			.int1 = {
> +				.addr = 0x22,
> +				.mask = 0x02,
> +			},
> +			.int2 = {
> +				.addr = 0x22,
> +				.mask = 0x10,
> +			},
>  			.addr_ihl = 0x22,
>  			.mask_ihl = 0x80,
>  		},
> @@ -567,8 +586,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
>  		.bdu = {
>  		},
>  		.drdy_irq = {
> -			.addr = 0x21,
> -			.mask_int1 = 0x04,
> +			.int1 = {
> +				.addr = 0x21,
> +				.mask = 0x04,
> +			},
>  			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
>  		},
>  		.sim = {
> @@ -635,9 +656,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
>  			},
>  		},
>  		.drdy_irq = {
> -			.addr = 0x22,
> -			.mask_int1 = 0x10,
> -			.mask_int2 = 0x00,
> +			.int1 = {
> +				.addr = 0x22,
> +				.mask = 0x10,
> +			},
>  			.addr_ihl = 0x25,
>  			.mask_ihl = 0x02,
>  			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
> diff --git a/drivers/iio/common/st_sensors/st_sensors_core.c b/drivers/iio/common/st_sensors/st_sensors_core.c
> index d99bb1460fe2..a26217b0604f 100644
> --- a/drivers/iio/common/st_sensors/st_sensors_core.c
> +++ b/drivers/iio/common/st_sensors/st_sensors_core.c
> @@ -283,7 +283,8 @@ static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev,
>  	struct st_sensor_data *sdata = iio_priv(indio_dev);
>  
>  	/* Sensor does not support interrupts */
> -	if (sdata->sensor_settings->drdy_irq.addr == 0) {
> +	if (!sdata->sensor_settings->drdy_irq.int1.addr &&
> +	    !sdata->sensor_settings->drdy_irq.int2.addr) {
>  		if (pdata->drdy_int_pin)
>  			dev_info(&indio_dev->dev,
>  				 "DRDY on pin INT%d specified, but sensor "
> @@ -294,7 +295,7 @@ static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev,
>  
>  	switch (pdata->drdy_int_pin) {
>  	case 1:
> -		if (sdata->sensor_settings->drdy_irq.mask_int1 == 0) {
> +		if (!sdata->sensor_settings->drdy_irq.int1.mask) {
>  			dev_err(&indio_dev->dev,
>  					"DRDY on INT1 not available.\n");
>  			return -EINVAL;
> @@ -302,7 +303,7 @@ static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev,
>  		sdata->drdy_int_pin = 1;
>  		break;
>  	case 2:
> -		if (sdata->sensor_settings->drdy_irq.mask_int2 == 0) {
> +		if (!sdata->sensor_settings->drdy_irq.int2.mask) {
>  			dev_err(&indio_dev->dev,
>  					"DRDY on INT2 not available.\n");
>  			return -EINVAL;
> @@ -460,10 +461,11 @@ EXPORT_SYMBOL(st_sensors_init_sensor);
>  int st_sensors_set_dataready_irq(struct iio_dev *indio_dev, bool enable)
>  {
>  	int err;
> -	u8 drdy_mask;
> +	u8 drdy_addr, drdy_mask;
>  	struct st_sensor_data *sdata = iio_priv(indio_dev);
>  
> -	if (!sdata->sensor_settings->drdy_irq.addr)
> +	if (!sdata->sensor_settings->drdy_irq.int1.addr &&
> +	    !sdata->sensor_settings->drdy_irq.int2.addr)
>  		return 0;
>  
>  	/* Enable/Disable the interrupt generator 1. */
> @@ -476,18 +478,20 @@ int st_sensors_set_dataready_irq(struct iio_dev *indio_dev, bool enable)
>  			goto st_accel_set_dataready_irq_error;
>  	}
>  
> -	if (sdata->drdy_int_pin == 1)
> -		drdy_mask = sdata->sensor_settings->drdy_irq.mask_int1;
> -	else
> -		drdy_mask = sdata->sensor_settings->drdy_irq.mask_int2;
> +	if (sdata->drdy_int_pin == 1) {
> +		drdy_addr = sdata->sensor_settings->drdy_irq.int1.addr;
> +		drdy_mask = sdata->sensor_settings->drdy_irq.int1.mask;
> +	} else {
> +		drdy_addr = sdata->sensor_settings->drdy_irq.int2.addr;
> +		drdy_mask = sdata->sensor_settings->drdy_irq.int2.mask;
> +	}
>  
>  	/* Flag to the poll function that the hardware trigger is in use */
>  	sdata->hw_irq_trigger = enable;
>  
>  	/* Enable/Disable the interrupt generator for data ready. */
> -	err = st_sensors_write_data_with_mask(indio_dev,
> -					sdata->sensor_settings->drdy_irq.addr,
> -					drdy_mask, (int)enable);
> +	err = st_sensors_write_data_with_mask(indio_dev, drdy_addr,
> +					      drdy_mask, (int)enable);
>  
>  st_accel_set_dataready_irq_error:
>  	return err;
> diff --git a/drivers/iio/gyro/st_gyro_core.c b/drivers/iio/gyro/st_gyro_core.c
> index e366422e8512..764306378b20 100644
> --- a/drivers/iio/gyro/st_gyro_core.c
> +++ b/drivers/iio/gyro/st_gyro_core.c
> @@ -111,8 +111,10 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = {
>  			.mask = 0x80,
>  		},
>  		.drdy_irq = {
> -			.addr = 0x22,
> -			.mask_int2 = 0x08,
> +			.int2 = {
> +				.addr = 0x22,
> +				.mask = 0x08,
> +			},
>  			/*
>  			 * The sensor has IHL (active low) and open
>  			 * drain settings, but only for INT1 and not
> @@ -181,8 +183,10 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = {
>  			.mask = 0x80,
>  		},
>  		.drdy_irq = {
> -			.addr = 0x22,
> -			.mask_int2 = 0x08,
> +			.int2 = {
> +				.addr = 0x22,
> +				.mask = 0x08,
> +			},
>  			/*
>  			 * The sensor has IHL (active low) and open
>  			 * drain settings, but only for INT1 and not
> @@ -246,8 +250,10 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = {
>  			.mask = 0x80,
>  		},
>  		.drdy_irq = {
> -			.addr = 0x22,
> -			.mask_int2 = 0x08,
> +			.int2 = {
> +				.addr = 0x22,
> +				.mask = 0x08,
> +			},
>  			/*
>  			 * The sensor has IHL (active low) and open
>  			 * drain settings, but only for INT1 and not
> diff --git a/drivers/iio/magnetometer/st_magn_core.c b/drivers/iio/magnetometer/st_magn_core.c
> index e68368b5b2a3..2c465cbe3b0a 100644
> --- a/drivers/iio/magnetometer/st_magn_core.c
> +++ b/drivers/iio/magnetometer/st_magn_core.c
> @@ -355,8 +355,10 @@ static const struct st_sensor_settings st_magn_sensors_settings[] = {
>  			.mask = 0x10,
>  		},
>  		.drdy_irq = {
> -			.addr = 0x62,
> -			.mask_int1 = 0x01,
> +			.int1 = {
> +				.addr = 0x62,
> +				.mask = 0x01,
> +			},
>  			.addr_stat_drdy = 0x67,
>  		},
>  		.multi_read_bit = false,
> diff --git a/drivers/iio/pressure/st_pressure_core.c b/drivers/iio/pressure/st_pressure_core.c
> index c84eea73b3ae..240fa9f3ee3b 100644
> --- a/drivers/iio/pressure/st_pressure_core.c
> +++ b/drivers/iio/pressure/st_pressure_core.c
> @@ -280,9 +280,14 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
>  			.mask = 0x04,
>  		},
>  		.drdy_irq = {
> -			.addr = 0x22,
> -			.mask_int1 = 0x04,
> -			.mask_int2 = 0x20,
> +			.int1 = {
> +				.addr = 0x22,
> +				.mask = 0x04,
> +			},
> +			.int2 = {
> +				.addr = 0x22,
> +				.mask = 0x20,
> +			},
>  			.addr_ihl = 0x22,
>  			.mask_ihl = 0x80,
>  			.addr_od = 0x22,
> @@ -335,9 +340,6 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
>  			.addr = 0x20,
>  			.mask = 0x04,
>  		},
> -		.drdy_irq = {
> -			.addr = 0,
> -		},
>  		.multi_read_bit = true,
>  		.bootime = 2,
>  	},
> @@ -388,9 +390,10 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
>  			.mask = 0x04,
>  		},
>  		.drdy_irq = {
> -			.addr = 0x23,
> -			.mask_int1 = 0x01,
> -			.mask_int2 = 0x00,
> +			.int1 = {
> +				.addr = 0x23,
> +				.mask = 0x01,
> +			},
>  			.addr_ihl = 0x22,
>  			.mask_ihl = 0x80,
>  			.addr_od = 0x22,
> @@ -447,9 +450,10 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
>  			.mask = 0x02,
>  		},
>  		.drdy_irq = {
> -			.addr = 0x12,
> -			.mask_int1 = 0x04,
> -			.mask_int2 = 0x00,
> +			.int1 = {
> +				.addr = 0x12,
> +				.mask = 0x04,
> +			},
>  			.addr_ihl = 0x12,
>  			.mask_ihl = 0x80,
>  			.addr_od = 0x12,
> @@ -605,7 +609,8 @@ int st_press_common_probe(struct iio_dev *indio_dev)
>  	press_data->odr = press_data->sensor_settings->odr.odr_avl[0].hz;
>  
>  	/* Some devices don't support a data ready pin. */
> -	if (!pdata && press_data->sensor_settings->drdy_irq.addr)
> +	if (!pdata && (press_data->sensor_settings->drdy_irq.int1.addr ||
> +		       press_data->sensor_settings->drdy_irq.int2.addr))
>  		pdata =	(struct st_sensors_platform_data *)&default_press_pdata;
>  
>  	err = st_sensors_init_sensor(indio_dev, press_data->dev->platform_data);
> diff --git a/include/linux/iio/common/st_sensors.h b/include/linux/iio/common/st_sensors.h
> index 7b0fa8b5c120..ac3aa89518ca 100644
> --- a/include/linux/iio/common/st_sensors.h
> +++ b/include/linux/iio/common/st_sensors.h
> @@ -132,9 +132,8 @@ struct st_sensor_das {
>  
>  /**
>   * struct st_sensor_data_ready_irq - ST sensor device data-ready interrupt
> - * @addr: address of the register.
> - * @mask_int1: mask to enable/disable IRQ on INT1 pin.
> - * @mask_int2: mask to enable/disable IRQ on INT2 pin.
> + * struct int1 - data-ready configuration register for INT1 pin.
> + * struct int2 - data-ready configuration register for INT2 pin.
>   * @addr_ihl: address to enable/disable active low on the INT lines.
>   * @mask_ihl: mask to enable/disable active low on the INT lines.
>   * @addr_od: address to enable/disable Open Drain on the INT lines.
> @@ -145,9 +144,14 @@ struct st_sensor_das {
>   * @en_mask: mask to write the on/off value for enable.
>   */
>  struct st_sensor_data_ready_irq {
> -	u8 addr;
> -	u8 mask_int1;
> -	u8 mask_int2;
> +	struct {
> +		u8 addr;
> +		u8 mask;
> +	} int1;
> +	struct {
> +		u8 addr;
> +		u8 mask;
> +	} int2;
>  	u8 addr_ihl;
>  	u8 mask_ihl;
>  	u8 addr_od;

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

* Re: [PATCH v2 1/5] iio: st_sensors: decouple irq1 configuration parameters from the irq2 ones
@ 2017-08-20  9:41         ` Jonathan Cameron
  0 siblings, 0 replies; 20+ messages in thread
From: Jonathan Cameron @ 2017-08-20  9:41 UTC (permalink / raw)
  To: Lorenzo Bianconi; +Cc: linux-iio, linus.walleij, lorenzo.bianconi, devicetree

On Thu, 17 Aug 2017 19:37:25 +0200
Lorenzo Bianconi <lorenzo.bianconi83@gmail.com> wrote:

> Separate data-ready configuration parameters for INT1 and INT2 pins in
> st_sensor_data_ready_irq data structure. That change will be use to
> properly support LIS2DW12 accel sensor.
> 
> Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@st.com>
Unfortunately I'll have to hold this series for now as the 3/4 wire
patch need for the latter part of the series hasn't yet made it
back to my tree from the fixes branch.

Let me know if I seem to have forgotten it. 

Thanks,

Jonathan
> ---
>  drivers/iio/accel/st_accel_core.c               | 66 ++++++++++++++++---------
>  drivers/iio/common/st_sensors/st_sensors_core.c | 28 ++++++-----
>  drivers/iio/gyro/st_gyro_core.c                 | 18 ++++---
>  drivers/iio/magnetometer/st_magn_core.c         |  6 ++-
>  drivers/iio/pressure/st_pressure_core.c         | 31 +++++++-----
>  include/linux/iio/common/st_sensors.h           | 16 +++---
>  6 files changed, 104 insertions(+), 61 deletions(-)
> 
> diff --git a/drivers/iio/accel/st_accel_core.c b/drivers/iio/accel/st_accel_core.c
> index 752856b3a849..9fac5a41bacd 100644
> --- a/drivers/iio/accel/st_accel_core.c
> +++ b/drivers/iio/accel/st_accel_core.c
> @@ -159,9 +159,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
>  			.mask = 0x80,
>  		},
>  		.drdy_irq = {
> -			.addr = 0x22,
> -			.mask_int1 = 0x10,
> -			.mask_int2 = 0x00,
> +			.int1 = {
> +				.addr = 0x22,
> +				.mask = 0x10,
> +			},
>  			.addr_ihl = 0x25,
>  			.mask_ihl = 0x02,
>  			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
> @@ -229,9 +230,14 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
>  			.mask = 0x80,
>  		},
>  		.drdy_irq = {
> -			.addr = 0x22,
> -			.mask_int1 = 0x02,
> -			.mask_int2 = 0x10,
> +			.int1 = {
> +				.addr = 0x22,
> +				.mask = 0x02,
> +			},
> +			.int2 = {
> +				.addr = 0x22,
> +				.mask = 0x10,
> +			},
>  			.addr_ihl = 0x22,
>  			.mask_ihl = 0x80,
>  			.addr_od = 0x22,
> @@ -313,9 +319,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
>  			.mask = 0x08,
>  		},
>  		.drdy_irq = {
> -			.addr = 0x23,
> -			.mask_int1 = 0x80,
> -			.mask_int2 = 0x00,
> +			.int1 = {
> +				.addr = 0x23,
> +				.mask = 0x80,
> +			},
>  			.addr_ihl = 0x23,
>  			.mask_ihl = 0x40,
>  			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
> @@ -387,8 +394,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
>  			.mask = 0x01,
>  		},
>  		.drdy_irq = {
> -			.addr = 0x21,
> -			.mask_int1 = 0x04,
> +			.int1 = {
> +				.addr = 0x21,
> +				.mask = 0x04,
> +			},
>  			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
>  		},
>  		.sim = {
> @@ -444,9 +453,14 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
>  			},
>  		},
>  		.drdy_irq = {
> -			.addr = 0x22,
> -			.mask_int1 = 0x04,
> -			.mask_int2 = 0x20,
> +			.int1 = {
> +				.addr = 0x22,
> +				.mask = 0x04,
> +			},
> +			.int2 = {
> +				.addr = 0x22,
> +				.mask = 0x20,
> +			},
>  			.addr_ihl = 0x22,
>  			.mask_ihl = 0x80,
>  			.addr_od = 0x22,
> @@ -513,9 +527,14 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
>  			.mask = 0x80,
>  		},
>  		.drdy_irq = {
> -			.addr = 0x22,
> -			.mask_int1 = 0x02,
> -			.mask_int2 = 0x10,
> +			.int1 = {
> +				.addr = 0x22,
> +				.mask = 0x02,
> +			},
> +			.int2 = {
> +				.addr = 0x22,
> +				.mask = 0x10,
> +			},
>  			.addr_ihl = 0x22,
>  			.mask_ihl = 0x80,
>  		},
> @@ -567,8 +586,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
>  		.bdu = {
>  		},
>  		.drdy_irq = {
> -			.addr = 0x21,
> -			.mask_int1 = 0x04,
> +			.int1 = {
> +				.addr = 0x21,
> +				.mask = 0x04,
> +			},
>  			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
>  		},
>  		.sim = {
> @@ -635,9 +656,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
>  			},
>  		},
>  		.drdy_irq = {
> -			.addr = 0x22,
> -			.mask_int1 = 0x10,
> -			.mask_int2 = 0x00,
> +			.int1 = {
> +				.addr = 0x22,
> +				.mask = 0x10,
> +			},
>  			.addr_ihl = 0x25,
>  			.mask_ihl = 0x02,
>  			.addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
> diff --git a/drivers/iio/common/st_sensors/st_sensors_core.c b/drivers/iio/common/st_sensors/st_sensors_core.c
> index d99bb1460fe2..a26217b0604f 100644
> --- a/drivers/iio/common/st_sensors/st_sensors_core.c
> +++ b/drivers/iio/common/st_sensors/st_sensors_core.c
> @@ -283,7 +283,8 @@ static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev,
>  	struct st_sensor_data *sdata = iio_priv(indio_dev);
>  
>  	/* Sensor does not support interrupts */
> -	if (sdata->sensor_settings->drdy_irq.addr == 0) {
> +	if (!sdata->sensor_settings->drdy_irq.int1.addr &&
> +	    !sdata->sensor_settings->drdy_irq.int2.addr) {
>  		if (pdata->drdy_int_pin)
>  			dev_info(&indio_dev->dev,
>  				 "DRDY on pin INT%d specified, but sensor "
> @@ -294,7 +295,7 @@ static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev,
>  
>  	switch (pdata->drdy_int_pin) {
>  	case 1:
> -		if (sdata->sensor_settings->drdy_irq.mask_int1 == 0) {
> +		if (!sdata->sensor_settings->drdy_irq.int1.mask) {
>  			dev_err(&indio_dev->dev,
>  					"DRDY on INT1 not available.\n");
>  			return -EINVAL;
> @@ -302,7 +303,7 @@ static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev,
>  		sdata->drdy_int_pin = 1;
>  		break;
>  	case 2:
> -		if (sdata->sensor_settings->drdy_irq.mask_int2 == 0) {
> +		if (!sdata->sensor_settings->drdy_irq.int2.mask) {
>  			dev_err(&indio_dev->dev,
>  					"DRDY on INT2 not available.\n");
>  			return -EINVAL;
> @@ -460,10 +461,11 @@ EXPORT_SYMBOL(st_sensors_init_sensor);
>  int st_sensors_set_dataready_irq(struct iio_dev *indio_dev, bool enable)
>  {
>  	int err;
> -	u8 drdy_mask;
> +	u8 drdy_addr, drdy_mask;
>  	struct st_sensor_data *sdata = iio_priv(indio_dev);
>  
> -	if (!sdata->sensor_settings->drdy_irq.addr)
> +	if (!sdata->sensor_settings->drdy_irq.int1.addr &&
> +	    !sdata->sensor_settings->drdy_irq.int2.addr)
>  		return 0;
>  
>  	/* Enable/Disable the interrupt generator 1. */
> @@ -476,18 +478,20 @@ int st_sensors_set_dataready_irq(struct iio_dev *indio_dev, bool enable)
>  			goto st_accel_set_dataready_irq_error;
>  	}
>  
> -	if (sdata->drdy_int_pin == 1)
> -		drdy_mask = sdata->sensor_settings->drdy_irq.mask_int1;
> -	else
> -		drdy_mask = sdata->sensor_settings->drdy_irq.mask_int2;
> +	if (sdata->drdy_int_pin == 1) {
> +		drdy_addr = sdata->sensor_settings->drdy_irq.int1.addr;
> +		drdy_mask = sdata->sensor_settings->drdy_irq.int1.mask;
> +	} else {
> +		drdy_addr = sdata->sensor_settings->drdy_irq.int2.addr;
> +		drdy_mask = sdata->sensor_settings->drdy_irq.int2.mask;
> +	}
>  
>  	/* Flag to the poll function that the hardware trigger is in use */
>  	sdata->hw_irq_trigger = enable;
>  
>  	/* Enable/Disable the interrupt generator for data ready. */
> -	err = st_sensors_write_data_with_mask(indio_dev,
> -					sdata->sensor_settings->drdy_irq.addr,
> -					drdy_mask, (int)enable);
> +	err = st_sensors_write_data_with_mask(indio_dev, drdy_addr,
> +					      drdy_mask, (int)enable);
>  
>  st_accel_set_dataready_irq_error:
>  	return err;
> diff --git a/drivers/iio/gyro/st_gyro_core.c b/drivers/iio/gyro/st_gyro_core.c
> index e366422e8512..764306378b20 100644
> --- a/drivers/iio/gyro/st_gyro_core.c
> +++ b/drivers/iio/gyro/st_gyro_core.c
> @@ -111,8 +111,10 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = {
>  			.mask = 0x80,
>  		},
>  		.drdy_irq = {
> -			.addr = 0x22,
> -			.mask_int2 = 0x08,
> +			.int2 = {
> +				.addr = 0x22,
> +				.mask = 0x08,
> +			},
>  			/*
>  			 * The sensor has IHL (active low) and open
>  			 * drain settings, but only for INT1 and not
> @@ -181,8 +183,10 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = {
>  			.mask = 0x80,
>  		},
>  		.drdy_irq = {
> -			.addr = 0x22,
> -			.mask_int2 = 0x08,
> +			.int2 = {
> +				.addr = 0x22,
> +				.mask = 0x08,
> +			},
>  			/*
>  			 * The sensor has IHL (active low) and open
>  			 * drain settings, but only for INT1 and not
> @@ -246,8 +250,10 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = {
>  			.mask = 0x80,
>  		},
>  		.drdy_irq = {
> -			.addr = 0x22,
> -			.mask_int2 = 0x08,
> +			.int2 = {
> +				.addr = 0x22,
> +				.mask = 0x08,
> +			},
>  			/*
>  			 * The sensor has IHL (active low) and open
>  			 * drain settings, but only for INT1 and not
> diff --git a/drivers/iio/magnetometer/st_magn_core.c b/drivers/iio/magnetometer/st_magn_core.c
> index e68368b5b2a3..2c465cbe3b0a 100644
> --- a/drivers/iio/magnetometer/st_magn_core.c
> +++ b/drivers/iio/magnetometer/st_magn_core.c
> @@ -355,8 +355,10 @@ static const struct st_sensor_settings st_magn_sensors_settings[] = {
>  			.mask = 0x10,
>  		},
>  		.drdy_irq = {
> -			.addr = 0x62,
> -			.mask_int1 = 0x01,
> +			.int1 = {
> +				.addr = 0x62,
> +				.mask = 0x01,
> +			},
>  			.addr_stat_drdy = 0x67,
>  		},
>  		.multi_read_bit = false,
> diff --git a/drivers/iio/pressure/st_pressure_core.c b/drivers/iio/pressure/st_pressure_core.c
> index c84eea73b3ae..240fa9f3ee3b 100644
> --- a/drivers/iio/pressure/st_pressure_core.c
> +++ b/drivers/iio/pressure/st_pressure_core.c
> @@ -280,9 +280,14 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
>  			.mask = 0x04,
>  		},
>  		.drdy_irq = {
> -			.addr = 0x22,
> -			.mask_int1 = 0x04,
> -			.mask_int2 = 0x20,
> +			.int1 = {
> +				.addr = 0x22,
> +				.mask = 0x04,
> +			},
> +			.int2 = {
> +				.addr = 0x22,
> +				.mask = 0x20,
> +			},
>  			.addr_ihl = 0x22,
>  			.mask_ihl = 0x80,
>  			.addr_od = 0x22,
> @@ -335,9 +340,6 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
>  			.addr = 0x20,
>  			.mask = 0x04,
>  		},
> -		.drdy_irq = {
> -			.addr = 0,
> -		},
>  		.multi_read_bit = true,
>  		.bootime = 2,
>  	},
> @@ -388,9 +390,10 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
>  			.mask = 0x04,
>  		},
>  		.drdy_irq = {
> -			.addr = 0x23,
> -			.mask_int1 = 0x01,
> -			.mask_int2 = 0x00,
> +			.int1 = {
> +				.addr = 0x23,
> +				.mask = 0x01,
> +			},
>  			.addr_ihl = 0x22,
>  			.mask_ihl = 0x80,
>  			.addr_od = 0x22,
> @@ -447,9 +450,10 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
>  			.mask = 0x02,
>  		},
>  		.drdy_irq = {
> -			.addr = 0x12,
> -			.mask_int1 = 0x04,
> -			.mask_int2 = 0x00,
> +			.int1 = {
> +				.addr = 0x12,
> +				.mask = 0x04,
> +			},
>  			.addr_ihl = 0x12,
>  			.mask_ihl = 0x80,
>  			.addr_od = 0x12,
> @@ -605,7 +609,8 @@ int st_press_common_probe(struct iio_dev *indio_dev)
>  	press_data->odr = press_data->sensor_settings->odr.odr_avl[0].hz;
>  
>  	/* Some devices don't support a data ready pin. */
> -	if (!pdata && press_data->sensor_settings->drdy_irq.addr)
> +	if (!pdata && (press_data->sensor_settings->drdy_irq.int1.addr ||
> +		       press_data->sensor_settings->drdy_irq.int2.addr))
>  		pdata =	(struct st_sensors_platform_data *)&default_press_pdata;
>  
>  	err = st_sensors_init_sensor(indio_dev, press_data->dev->platform_data);
> diff --git a/include/linux/iio/common/st_sensors.h b/include/linux/iio/common/st_sensors.h
> index 7b0fa8b5c120..ac3aa89518ca 100644
> --- a/include/linux/iio/common/st_sensors.h
> +++ b/include/linux/iio/common/st_sensors.h
> @@ -132,9 +132,8 @@ struct st_sensor_das {
>  
>  /**
>   * struct st_sensor_data_ready_irq - ST sensor device data-ready interrupt
> - * @addr: address of the register.
> - * @mask_int1: mask to enable/disable IRQ on INT1 pin.
> - * @mask_int2: mask to enable/disable IRQ on INT2 pin.
> + * struct int1 - data-ready configuration register for INT1 pin.
> + * struct int2 - data-ready configuration register for INT2 pin.
>   * @addr_ihl: address to enable/disable active low on the INT lines.
>   * @mask_ihl: mask to enable/disable active low on the INT lines.
>   * @addr_od: address to enable/disable Open Drain on the INT lines.
> @@ -145,9 +144,14 @@ struct st_sensor_das {
>   * @en_mask: mask to write the on/off value for enable.
>   */
>  struct st_sensor_data_ready_irq {
> -	u8 addr;
> -	u8 mask_int1;
> -	u8 mask_int2;
> +	struct {
> +		u8 addr;
> +		u8 mask;
> +	} int1;
> +	struct {
> +		u8 addr;
> +		u8 mask;
> +	} int2;
>  	u8 addr_ihl;
>  	u8 mask_ihl;
>  	u8 addr_od;


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

* Re: [PATCH v2 1/5] iio: st_sensors: decouple irq1 configuration parameters from the irq2 ones
  2017-08-20  9:41         ` Jonathan Cameron
@ 2017-08-20 10:08           ` Lorenzo Bianconi
  -1 siblings, 0 replies; 20+ messages in thread
From: Lorenzo Bianconi @ 2017-08-20 10:08 UTC (permalink / raw)
  To: Jonathan Cameron
  Cc: linux-iio-u79uwXL29TY76Z2rM5mHXA, Linus Walleij,
	Lorenzo BIANCONI, devicetree-u79uwXL29TY76Z2rM5mHXA

> On Thu, 17 Aug 2017 19:37:25 +0200
> Lorenzo Bianconi <lorenzo.bianconi83-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
>
>> Separate data-ready configuration parameters for INT1 and INT2 pins in
>> st_sensor_data_ready_irq data structure. That change will be use to
>> properly support LIS2DW12 accel sensor.
>>
>> Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi-qxv4g6HH51o@public.gmane.org>
> Unfortunately I'll have to hold this series for now as the 3/4 wire
> patch need for the latter part of the series hasn't yet made it
> back to my tree from the fixes branch.
>
> Let me know if I seem to have forgotten it.

No rush I guess :)
Thanks,

Lorenzo

>
> Thanks,
>
> Jonathan
>> ---
>>  drivers/iio/accel/st_accel_core.c               | 66 ++++++++++++++++---------
>>  drivers/iio/common/st_sensors/st_sensors_core.c | 28 ++++++-----
>>  drivers/iio/gyro/st_gyro_core.c                 | 18 ++++---
>>  drivers/iio/magnetometer/st_magn_core.c         |  6 ++-
>>  drivers/iio/pressure/st_pressure_core.c         | 31 +++++++-----
>>  include/linux/iio/common/st_sensors.h           | 16 +++---
>>  6 files changed, 104 insertions(+), 61 deletions(-)
>>
>> diff --git a/drivers/iio/accel/st_accel_core.c b/drivers/iio/accel/st_accel_core.c
>> index 752856b3a849..9fac5a41bacd 100644
>> --- a/drivers/iio/accel/st_accel_core.c
>> +++ b/drivers/iio/accel/st_accel_core.c
>> @@ -159,9 +159,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
>>                       .mask = 0x80,
>>               },
>>               .drdy_irq = {
>> -                     .addr = 0x22,
>> -                     .mask_int1 = 0x10,
>> -                     .mask_int2 = 0x00,
>> +                     .int1 = {
>> +                             .addr = 0x22,
>> +                             .mask = 0x10,
>> +                     },
>>                       .addr_ihl = 0x25,
>>                       .mask_ihl = 0x02,
>>                       .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
>> @@ -229,9 +230,14 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
>>                       .mask = 0x80,
>>               },
>>               .drdy_irq = {
>> -                     .addr = 0x22,
>> -                     .mask_int1 = 0x02,
>> -                     .mask_int2 = 0x10,
>> +                     .int1 = {
>> +                             .addr = 0x22,
>> +                             .mask = 0x02,
>> +                     },
>> +                     .int2 = {
>> +                             .addr = 0x22,
>> +                             .mask = 0x10,
>> +                     },
>>                       .addr_ihl = 0x22,
>>                       .mask_ihl = 0x80,
>>                       .addr_od = 0x22,
>> @@ -313,9 +319,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
>>                       .mask = 0x08,
>>               },
>>               .drdy_irq = {
>> -                     .addr = 0x23,
>> -                     .mask_int1 = 0x80,
>> -                     .mask_int2 = 0x00,
>> +                     .int1 = {
>> +                             .addr = 0x23,
>> +                             .mask = 0x80,
>> +                     },
>>                       .addr_ihl = 0x23,
>>                       .mask_ihl = 0x40,
>>                       .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
>> @@ -387,8 +394,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
>>                       .mask = 0x01,
>>               },
>>               .drdy_irq = {
>> -                     .addr = 0x21,
>> -                     .mask_int1 = 0x04,
>> +                     .int1 = {
>> +                             .addr = 0x21,
>> +                             .mask = 0x04,
>> +                     },
>>                       .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
>>               },
>>               .sim = {
>> @@ -444,9 +453,14 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
>>                       },
>>               },
>>               .drdy_irq = {
>> -                     .addr = 0x22,
>> -                     .mask_int1 = 0x04,
>> -                     .mask_int2 = 0x20,
>> +                     .int1 = {
>> +                             .addr = 0x22,
>> +                             .mask = 0x04,
>> +                     },
>> +                     .int2 = {
>> +                             .addr = 0x22,
>> +                             .mask = 0x20,
>> +                     },
>>                       .addr_ihl = 0x22,
>>                       .mask_ihl = 0x80,
>>                       .addr_od = 0x22,
>> @@ -513,9 +527,14 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
>>                       .mask = 0x80,
>>               },
>>               .drdy_irq = {
>> -                     .addr = 0x22,
>> -                     .mask_int1 = 0x02,
>> -                     .mask_int2 = 0x10,
>> +                     .int1 = {
>> +                             .addr = 0x22,
>> +                             .mask = 0x02,
>> +                     },
>> +                     .int2 = {
>> +                             .addr = 0x22,
>> +                             .mask = 0x10,
>> +                     },
>>                       .addr_ihl = 0x22,
>>                       .mask_ihl = 0x80,
>>               },
>> @@ -567,8 +586,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
>>               .bdu = {
>>               },
>>               .drdy_irq = {
>> -                     .addr = 0x21,
>> -                     .mask_int1 = 0x04,
>> +                     .int1 = {
>> +                             .addr = 0x21,
>> +                             .mask = 0x04,
>> +                     },
>>                       .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
>>               },
>>               .sim = {
>> @@ -635,9 +656,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
>>                       },
>>               },
>>               .drdy_irq = {
>> -                     .addr = 0x22,
>> -                     .mask_int1 = 0x10,
>> -                     .mask_int2 = 0x00,
>> +                     .int1 = {
>> +                             .addr = 0x22,
>> +                             .mask = 0x10,
>> +                     },
>>                       .addr_ihl = 0x25,
>>                       .mask_ihl = 0x02,
>>                       .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
>> diff --git a/drivers/iio/common/st_sensors/st_sensors_core.c b/drivers/iio/common/st_sensors/st_sensors_core.c
>> index d99bb1460fe2..a26217b0604f 100644
>> --- a/drivers/iio/common/st_sensors/st_sensors_core.c
>> +++ b/drivers/iio/common/st_sensors/st_sensors_core.c
>> @@ -283,7 +283,8 @@ static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev,
>>       struct st_sensor_data *sdata = iio_priv(indio_dev);
>>
>>       /* Sensor does not support interrupts */
>> -     if (sdata->sensor_settings->drdy_irq.addr == 0) {
>> +     if (!sdata->sensor_settings->drdy_irq.int1.addr &&
>> +         !sdata->sensor_settings->drdy_irq.int2.addr) {
>>               if (pdata->drdy_int_pin)
>>                       dev_info(&indio_dev->dev,
>>                                "DRDY on pin INT%d specified, but sensor "
>> @@ -294,7 +295,7 @@ static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev,
>>
>>       switch (pdata->drdy_int_pin) {
>>       case 1:
>> -             if (sdata->sensor_settings->drdy_irq.mask_int1 == 0) {
>> +             if (!sdata->sensor_settings->drdy_irq.int1.mask) {
>>                       dev_err(&indio_dev->dev,
>>                                       "DRDY on INT1 not available.\n");
>>                       return -EINVAL;
>> @@ -302,7 +303,7 @@ static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev,
>>               sdata->drdy_int_pin = 1;
>>               break;
>>       case 2:
>> -             if (sdata->sensor_settings->drdy_irq.mask_int2 == 0) {
>> +             if (!sdata->sensor_settings->drdy_irq.int2.mask) {
>>                       dev_err(&indio_dev->dev,
>>                                       "DRDY on INT2 not available.\n");
>>                       return -EINVAL;
>> @@ -460,10 +461,11 @@ EXPORT_SYMBOL(st_sensors_init_sensor);
>>  int st_sensors_set_dataready_irq(struct iio_dev *indio_dev, bool enable)
>>  {
>>       int err;
>> -     u8 drdy_mask;
>> +     u8 drdy_addr, drdy_mask;
>>       struct st_sensor_data *sdata = iio_priv(indio_dev);
>>
>> -     if (!sdata->sensor_settings->drdy_irq.addr)
>> +     if (!sdata->sensor_settings->drdy_irq.int1.addr &&
>> +         !sdata->sensor_settings->drdy_irq.int2.addr)
>>               return 0;
>>
>>       /* Enable/Disable the interrupt generator 1. */
>> @@ -476,18 +478,20 @@ int st_sensors_set_dataready_irq(struct iio_dev *indio_dev, bool enable)
>>                       goto st_accel_set_dataready_irq_error;
>>       }
>>
>> -     if (sdata->drdy_int_pin == 1)
>> -             drdy_mask = sdata->sensor_settings->drdy_irq.mask_int1;
>> -     else
>> -             drdy_mask = sdata->sensor_settings->drdy_irq.mask_int2;
>> +     if (sdata->drdy_int_pin == 1) {
>> +             drdy_addr = sdata->sensor_settings->drdy_irq.int1.addr;
>> +             drdy_mask = sdata->sensor_settings->drdy_irq.int1.mask;
>> +     } else {
>> +             drdy_addr = sdata->sensor_settings->drdy_irq.int2.addr;
>> +             drdy_mask = sdata->sensor_settings->drdy_irq.int2.mask;
>> +     }
>>
>>       /* Flag to the poll function that the hardware trigger is in use */
>>       sdata->hw_irq_trigger = enable;
>>
>>       /* Enable/Disable the interrupt generator for data ready. */
>> -     err = st_sensors_write_data_with_mask(indio_dev,
>> -                                     sdata->sensor_settings->drdy_irq.addr,
>> -                                     drdy_mask, (int)enable);
>> +     err = st_sensors_write_data_with_mask(indio_dev, drdy_addr,
>> +                                           drdy_mask, (int)enable);
>>
>>  st_accel_set_dataready_irq_error:
>>       return err;
>> diff --git a/drivers/iio/gyro/st_gyro_core.c b/drivers/iio/gyro/st_gyro_core.c
>> index e366422e8512..764306378b20 100644
>> --- a/drivers/iio/gyro/st_gyro_core.c
>> +++ b/drivers/iio/gyro/st_gyro_core.c
>> @@ -111,8 +111,10 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = {
>>                       .mask = 0x80,
>>               },
>>               .drdy_irq = {
>> -                     .addr = 0x22,
>> -                     .mask_int2 = 0x08,
>> +                     .int2 = {
>> +                             .addr = 0x22,
>> +                             .mask = 0x08,
>> +                     },
>>                       /*
>>                        * The sensor has IHL (active low) and open
>>                        * drain settings, but only for INT1 and not
>> @@ -181,8 +183,10 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = {
>>                       .mask = 0x80,
>>               },
>>               .drdy_irq = {
>> -                     .addr = 0x22,
>> -                     .mask_int2 = 0x08,
>> +                     .int2 = {
>> +                             .addr = 0x22,
>> +                             .mask = 0x08,
>> +                     },
>>                       /*
>>                        * The sensor has IHL (active low) and open
>>                        * drain settings, but only for INT1 and not
>> @@ -246,8 +250,10 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = {
>>                       .mask = 0x80,
>>               },
>>               .drdy_irq = {
>> -                     .addr = 0x22,
>> -                     .mask_int2 = 0x08,
>> +                     .int2 = {
>> +                             .addr = 0x22,
>> +                             .mask = 0x08,
>> +                     },
>>                       /*
>>                        * The sensor has IHL (active low) and open
>>                        * drain settings, but only for INT1 and not
>> diff --git a/drivers/iio/magnetometer/st_magn_core.c b/drivers/iio/magnetometer/st_magn_core.c
>> index e68368b5b2a3..2c465cbe3b0a 100644
>> --- a/drivers/iio/magnetometer/st_magn_core.c
>> +++ b/drivers/iio/magnetometer/st_magn_core.c
>> @@ -355,8 +355,10 @@ static const struct st_sensor_settings st_magn_sensors_settings[] = {
>>                       .mask = 0x10,
>>               },
>>               .drdy_irq = {
>> -                     .addr = 0x62,
>> -                     .mask_int1 = 0x01,
>> +                     .int1 = {
>> +                             .addr = 0x62,
>> +                             .mask = 0x01,
>> +                     },
>>                       .addr_stat_drdy = 0x67,
>>               },
>>               .multi_read_bit = false,
>> diff --git a/drivers/iio/pressure/st_pressure_core.c b/drivers/iio/pressure/st_pressure_core.c
>> index c84eea73b3ae..240fa9f3ee3b 100644
>> --- a/drivers/iio/pressure/st_pressure_core.c
>> +++ b/drivers/iio/pressure/st_pressure_core.c
>> @@ -280,9 +280,14 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
>>                       .mask = 0x04,
>>               },
>>               .drdy_irq = {
>> -                     .addr = 0x22,
>> -                     .mask_int1 = 0x04,
>> -                     .mask_int2 = 0x20,
>> +                     .int1 = {
>> +                             .addr = 0x22,
>> +                             .mask = 0x04,
>> +                     },
>> +                     .int2 = {
>> +                             .addr = 0x22,
>> +                             .mask = 0x20,
>> +                     },
>>                       .addr_ihl = 0x22,
>>                       .mask_ihl = 0x80,
>>                       .addr_od = 0x22,
>> @@ -335,9 +340,6 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
>>                       .addr = 0x20,
>>                       .mask = 0x04,
>>               },
>> -             .drdy_irq = {
>> -                     .addr = 0,
>> -             },
>>               .multi_read_bit = true,
>>               .bootime = 2,
>>       },
>> @@ -388,9 +390,10 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
>>                       .mask = 0x04,
>>               },
>>               .drdy_irq = {
>> -                     .addr = 0x23,
>> -                     .mask_int1 = 0x01,
>> -                     .mask_int2 = 0x00,
>> +                     .int1 = {
>> +                             .addr = 0x23,
>> +                             .mask = 0x01,
>> +                     },
>>                       .addr_ihl = 0x22,
>>                       .mask_ihl = 0x80,
>>                       .addr_od = 0x22,
>> @@ -447,9 +450,10 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
>>                       .mask = 0x02,
>>               },
>>               .drdy_irq = {
>> -                     .addr = 0x12,
>> -                     .mask_int1 = 0x04,
>> -                     .mask_int2 = 0x00,
>> +                     .int1 = {
>> +                             .addr = 0x12,
>> +                             .mask = 0x04,
>> +                     },
>>                       .addr_ihl = 0x12,
>>                       .mask_ihl = 0x80,
>>                       .addr_od = 0x12,
>> @@ -605,7 +609,8 @@ int st_press_common_probe(struct iio_dev *indio_dev)
>>       press_data->odr = press_data->sensor_settings->odr.odr_avl[0].hz;
>>
>>       /* Some devices don't support a data ready pin. */
>> -     if (!pdata && press_data->sensor_settings->drdy_irq.addr)
>> +     if (!pdata && (press_data->sensor_settings->drdy_irq.int1.addr ||
>> +                    press_data->sensor_settings->drdy_irq.int2.addr))
>>               pdata = (struct st_sensors_platform_data *)&default_press_pdata;
>>
>>       err = st_sensors_init_sensor(indio_dev, press_data->dev->platform_data);
>> diff --git a/include/linux/iio/common/st_sensors.h b/include/linux/iio/common/st_sensors.h
>> index 7b0fa8b5c120..ac3aa89518ca 100644
>> --- a/include/linux/iio/common/st_sensors.h
>> +++ b/include/linux/iio/common/st_sensors.h
>> @@ -132,9 +132,8 @@ struct st_sensor_das {
>>
>>  /**
>>   * struct st_sensor_data_ready_irq - ST sensor device data-ready interrupt
>> - * @addr: address of the register.
>> - * @mask_int1: mask to enable/disable IRQ on INT1 pin.
>> - * @mask_int2: mask to enable/disable IRQ on INT2 pin.
>> + * struct int1 - data-ready configuration register for INT1 pin.
>> + * struct int2 - data-ready configuration register for INT2 pin.
>>   * @addr_ihl: address to enable/disable active low on the INT lines.
>>   * @mask_ihl: mask to enable/disable active low on the INT lines.
>>   * @addr_od: address to enable/disable Open Drain on the INT lines.
>> @@ -145,9 +144,14 @@ struct st_sensor_das {
>>   * @en_mask: mask to write the on/off value for enable.
>>   */
>>  struct st_sensor_data_ready_irq {
>> -     u8 addr;
>> -     u8 mask_int1;
>> -     u8 mask_int2;
>> +     struct {
>> +             u8 addr;
>> +             u8 mask;
>> +     } int1;
>> +     struct {
>> +             u8 addr;
>> +             u8 mask;
>> +     } int2;
>>       u8 addr_ihl;
>>       u8 mask_ihl;
>>       u8 addr_od;
>



-- 
UNIX is Sexy: who | grep -i blonde | talk; cd ~; wine; talk; touch;
unzip; touch; strip; gasp; finger; gasp; mount; fsck; more; yes; gasp;
umount; make clean; sleep

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

* Re: [PATCH v2 1/5] iio: st_sensors: decouple irq1 configuration parameters from the irq2 ones
@ 2017-08-20 10:08           ` Lorenzo Bianconi
  0 siblings, 0 replies; 20+ messages in thread
From: Lorenzo Bianconi @ 2017-08-20 10:08 UTC (permalink / raw)
  To: Jonathan Cameron; +Cc: linux-iio, Linus Walleij, Lorenzo BIANCONI, devicetree

> On Thu, 17 Aug 2017 19:37:25 +0200
> Lorenzo Bianconi <lorenzo.bianconi83@gmail.com> wrote:
>
>> Separate data-ready configuration parameters for INT1 and INT2 pins in
>> st_sensor_data_ready_irq data structure. That change will be use to
>> properly support LIS2DW12 accel sensor.
>>
>> Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@st.com>
> Unfortunately I'll have to hold this series for now as the 3/4 wire
> patch need for the latter part of the series hasn't yet made it
> back to my tree from the fixes branch.
>
> Let me know if I seem to have forgotten it.

No rush I guess :)
Thanks,

Lorenzo

>
> Thanks,
>
> Jonathan
>> ---
>>  drivers/iio/accel/st_accel_core.c               | 66 ++++++++++++++++---------
>>  drivers/iio/common/st_sensors/st_sensors_core.c | 28 ++++++-----
>>  drivers/iio/gyro/st_gyro_core.c                 | 18 ++++---
>>  drivers/iio/magnetometer/st_magn_core.c         |  6 ++-
>>  drivers/iio/pressure/st_pressure_core.c         | 31 +++++++-----
>>  include/linux/iio/common/st_sensors.h           | 16 +++---
>>  6 files changed, 104 insertions(+), 61 deletions(-)
>>
>> diff --git a/drivers/iio/accel/st_accel_core.c b/drivers/iio/accel/st_accel_core.c
>> index 752856b3a849..9fac5a41bacd 100644
>> --- a/drivers/iio/accel/st_accel_core.c
>> +++ b/drivers/iio/accel/st_accel_core.c
>> @@ -159,9 +159,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
>>                       .mask = 0x80,
>>               },
>>               .drdy_irq = {
>> -                     .addr = 0x22,
>> -                     .mask_int1 = 0x10,
>> -                     .mask_int2 = 0x00,
>> +                     .int1 = {
>> +                             .addr = 0x22,
>> +                             .mask = 0x10,
>> +                     },
>>                       .addr_ihl = 0x25,
>>                       .mask_ihl = 0x02,
>>                       .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
>> @@ -229,9 +230,14 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
>>                       .mask = 0x80,
>>               },
>>               .drdy_irq = {
>> -                     .addr = 0x22,
>> -                     .mask_int1 = 0x02,
>> -                     .mask_int2 = 0x10,
>> +                     .int1 = {
>> +                             .addr = 0x22,
>> +                             .mask = 0x02,
>> +                     },
>> +                     .int2 = {
>> +                             .addr = 0x22,
>> +                             .mask = 0x10,
>> +                     },
>>                       .addr_ihl = 0x22,
>>                       .mask_ihl = 0x80,
>>                       .addr_od = 0x22,
>> @@ -313,9 +319,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
>>                       .mask = 0x08,
>>               },
>>               .drdy_irq = {
>> -                     .addr = 0x23,
>> -                     .mask_int1 = 0x80,
>> -                     .mask_int2 = 0x00,
>> +                     .int1 = {
>> +                             .addr = 0x23,
>> +                             .mask = 0x80,
>> +                     },
>>                       .addr_ihl = 0x23,
>>                       .mask_ihl = 0x40,
>>                       .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
>> @@ -387,8 +394,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
>>                       .mask = 0x01,
>>               },
>>               .drdy_irq = {
>> -                     .addr = 0x21,
>> -                     .mask_int1 = 0x04,
>> +                     .int1 = {
>> +                             .addr = 0x21,
>> +                             .mask = 0x04,
>> +                     },
>>                       .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
>>               },
>>               .sim = {
>> @@ -444,9 +453,14 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
>>                       },
>>               },
>>               .drdy_irq = {
>> -                     .addr = 0x22,
>> -                     .mask_int1 = 0x04,
>> -                     .mask_int2 = 0x20,
>> +                     .int1 = {
>> +                             .addr = 0x22,
>> +                             .mask = 0x04,
>> +                     },
>> +                     .int2 = {
>> +                             .addr = 0x22,
>> +                             .mask = 0x20,
>> +                     },
>>                       .addr_ihl = 0x22,
>>                       .mask_ihl = 0x80,
>>                       .addr_od = 0x22,
>> @@ -513,9 +527,14 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
>>                       .mask = 0x80,
>>               },
>>               .drdy_irq = {
>> -                     .addr = 0x22,
>> -                     .mask_int1 = 0x02,
>> -                     .mask_int2 = 0x10,
>> +                     .int1 = {
>> +                             .addr = 0x22,
>> +                             .mask = 0x02,
>> +                     },
>> +                     .int2 = {
>> +                             .addr = 0x22,
>> +                             .mask = 0x10,
>> +                     },
>>                       .addr_ihl = 0x22,
>>                       .mask_ihl = 0x80,
>>               },
>> @@ -567,8 +586,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
>>               .bdu = {
>>               },
>>               .drdy_irq = {
>> -                     .addr = 0x21,
>> -                     .mask_int1 = 0x04,
>> +                     .int1 = {
>> +                             .addr = 0x21,
>> +                             .mask = 0x04,
>> +                     },
>>                       .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
>>               },
>>               .sim = {
>> @@ -635,9 +656,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
>>                       },
>>               },
>>               .drdy_irq = {
>> -                     .addr = 0x22,
>> -                     .mask_int1 = 0x10,
>> -                     .mask_int2 = 0x00,
>> +                     .int1 = {
>> +                             .addr = 0x22,
>> +                             .mask = 0x10,
>> +                     },
>>                       .addr_ihl = 0x25,
>>                       .mask_ihl = 0x02,
>>                       .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
>> diff --git a/drivers/iio/common/st_sensors/st_sensors_core.c b/drivers/iio/common/st_sensors/st_sensors_core.c
>> index d99bb1460fe2..a26217b0604f 100644
>> --- a/drivers/iio/common/st_sensors/st_sensors_core.c
>> +++ b/drivers/iio/common/st_sensors/st_sensors_core.c
>> @@ -283,7 +283,8 @@ static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev,
>>       struct st_sensor_data *sdata = iio_priv(indio_dev);
>>
>>       /* Sensor does not support interrupts */
>> -     if (sdata->sensor_settings->drdy_irq.addr == 0) {
>> +     if (!sdata->sensor_settings->drdy_irq.int1.addr &&
>> +         !sdata->sensor_settings->drdy_irq.int2.addr) {
>>               if (pdata->drdy_int_pin)
>>                       dev_info(&indio_dev->dev,
>>                                "DRDY on pin INT%d specified, but sensor "
>> @@ -294,7 +295,7 @@ static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev,
>>
>>       switch (pdata->drdy_int_pin) {
>>       case 1:
>> -             if (sdata->sensor_settings->drdy_irq.mask_int1 == 0) {
>> +             if (!sdata->sensor_settings->drdy_irq.int1.mask) {
>>                       dev_err(&indio_dev->dev,
>>                                       "DRDY on INT1 not available.\n");
>>                       return -EINVAL;
>> @@ -302,7 +303,7 @@ static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev,
>>               sdata->drdy_int_pin = 1;
>>               break;
>>       case 2:
>> -             if (sdata->sensor_settings->drdy_irq.mask_int2 == 0) {
>> +             if (!sdata->sensor_settings->drdy_irq.int2.mask) {
>>                       dev_err(&indio_dev->dev,
>>                                       "DRDY on INT2 not available.\n");
>>                       return -EINVAL;
>> @@ -460,10 +461,11 @@ EXPORT_SYMBOL(st_sensors_init_sensor);
>>  int st_sensors_set_dataready_irq(struct iio_dev *indio_dev, bool enable)
>>  {
>>       int err;
>> -     u8 drdy_mask;
>> +     u8 drdy_addr, drdy_mask;
>>       struct st_sensor_data *sdata = iio_priv(indio_dev);
>>
>> -     if (!sdata->sensor_settings->drdy_irq.addr)
>> +     if (!sdata->sensor_settings->drdy_irq.int1.addr &&
>> +         !sdata->sensor_settings->drdy_irq.int2.addr)
>>               return 0;
>>
>>       /* Enable/Disable the interrupt generator 1. */
>> @@ -476,18 +478,20 @@ int st_sensors_set_dataready_irq(struct iio_dev *indio_dev, bool enable)
>>                       goto st_accel_set_dataready_irq_error;
>>       }
>>
>> -     if (sdata->drdy_int_pin == 1)
>> -             drdy_mask = sdata->sensor_settings->drdy_irq.mask_int1;
>> -     else
>> -             drdy_mask = sdata->sensor_settings->drdy_irq.mask_int2;
>> +     if (sdata->drdy_int_pin == 1) {
>> +             drdy_addr = sdata->sensor_settings->drdy_irq.int1.addr;
>> +             drdy_mask = sdata->sensor_settings->drdy_irq.int1.mask;
>> +     } else {
>> +             drdy_addr = sdata->sensor_settings->drdy_irq.int2.addr;
>> +             drdy_mask = sdata->sensor_settings->drdy_irq.int2.mask;
>> +     }
>>
>>       /* Flag to the poll function that the hardware trigger is in use */
>>       sdata->hw_irq_trigger = enable;
>>
>>       /* Enable/Disable the interrupt generator for data ready. */
>> -     err = st_sensors_write_data_with_mask(indio_dev,
>> -                                     sdata->sensor_settings->drdy_irq.addr,
>> -                                     drdy_mask, (int)enable);
>> +     err = st_sensors_write_data_with_mask(indio_dev, drdy_addr,
>> +                                           drdy_mask, (int)enable);
>>
>>  st_accel_set_dataready_irq_error:
>>       return err;
>> diff --git a/drivers/iio/gyro/st_gyro_core.c b/drivers/iio/gyro/st_gyro_core.c
>> index e366422e8512..764306378b20 100644
>> --- a/drivers/iio/gyro/st_gyro_core.c
>> +++ b/drivers/iio/gyro/st_gyro_core.c
>> @@ -111,8 +111,10 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = {
>>                       .mask = 0x80,
>>               },
>>               .drdy_irq = {
>> -                     .addr = 0x22,
>> -                     .mask_int2 = 0x08,
>> +                     .int2 = {
>> +                             .addr = 0x22,
>> +                             .mask = 0x08,
>> +                     },
>>                       /*
>>                        * The sensor has IHL (active low) and open
>>                        * drain settings, but only for INT1 and not
>> @@ -181,8 +183,10 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = {
>>                       .mask = 0x80,
>>               },
>>               .drdy_irq = {
>> -                     .addr = 0x22,
>> -                     .mask_int2 = 0x08,
>> +                     .int2 = {
>> +                             .addr = 0x22,
>> +                             .mask = 0x08,
>> +                     },
>>                       /*
>>                        * The sensor has IHL (active low) and open
>>                        * drain settings, but only for INT1 and not
>> @@ -246,8 +250,10 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = {
>>                       .mask = 0x80,
>>               },
>>               .drdy_irq = {
>> -                     .addr = 0x22,
>> -                     .mask_int2 = 0x08,
>> +                     .int2 = {
>> +                             .addr = 0x22,
>> +                             .mask = 0x08,
>> +                     },
>>                       /*
>>                        * The sensor has IHL (active low) and open
>>                        * drain settings, but only for INT1 and not
>> diff --git a/drivers/iio/magnetometer/st_magn_core.c b/drivers/iio/magnetometer/st_magn_core.c
>> index e68368b5b2a3..2c465cbe3b0a 100644
>> --- a/drivers/iio/magnetometer/st_magn_core.c
>> +++ b/drivers/iio/magnetometer/st_magn_core.c
>> @@ -355,8 +355,10 @@ static const struct st_sensor_settings st_magn_sensors_settings[] = {
>>                       .mask = 0x10,
>>               },
>>               .drdy_irq = {
>> -                     .addr = 0x62,
>> -                     .mask_int1 = 0x01,
>> +                     .int1 = {
>> +                             .addr = 0x62,
>> +                             .mask = 0x01,
>> +                     },
>>                       .addr_stat_drdy = 0x67,
>>               },
>>               .multi_read_bit = false,
>> diff --git a/drivers/iio/pressure/st_pressure_core.c b/drivers/iio/pressure/st_pressure_core.c
>> index c84eea73b3ae..240fa9f3ee3b 100644
>> --- a/drivers/iio/pressure/st_pressure_core.c
>> +++ b/drivers/iio/pressure/st_pressure_core.c
>> @@ -280,9 +280,14 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
>>                       .mask = 0x04,
>>               },
>>               .drdy_irq = {
>> -                     .addr = 0x22,
>> -                     .mask_int1 = 0x04,
>> -                     .mask_int2 = 0x20,
>> +                     .int1 = {
>> +                             .addr = 0x22,
>> +                             .mask = 0x04,
>> +                     },
>> +                     .int2 = {
>> +                             .addr = 0x22,
>> +                             .mask = 0x20,
>> +                     },
>>                       .addr_ihl = 0x22,
>>                       .mask_ihl = 0x80,
>>                       .addr_od = 0x22,
>> @@ -335,9 +340,6 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
>>                       .addr = 0x20,
>>                       .mask = 0x04,
>>               },
>> -             .drdy_irq = {
>> -                     .addr = 0,
>> -             },
>>               .multi_read_bit = true,
>>               .bootime = 2,
>>       },
>> @@ -388,9 +390,10 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
>>                       .mask = 0x04,
>>               },
>>               .drdy_irq = {
>> -                     .addr = 0x23,
>> -                     .mask_int1 = 0x01,
>> -                     .mask_int2 = 0x00,
>> +                     .int1 = {
>> +                             .addr = 0x23,
>> +                             .mask = 0x01,
>> +                     },
>>                       .addr_ihl = 0x22,
>>                       .mask_ihl = 0x80,
>>                       .addr_od = 0x22,
>> @@ -447,9 +450,10 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
>>                       .mask = 0x02,
>>               },
>>               .drdy_irq = {
>> -                     .addr = 0x12,
>> -                     .mask_int1 = 0x04,
>> -                     .mask_int2 = 0x00,
>> +                     .int1 = {
>> +                             .addr = 0x12,
>> +                             .mask = 0x04,
>> +                     },
>>                       .addr_ihl = 0x12,
>>                       .mask_ihl = 0x80,
>>                       .addr_od = 0x12,
>> @@ -605,7 +609,8 @@ int st_press_common_probe(struct iio_dev *indio_dev)
>>       press_data->odr = press_data->sensor_settings->odr.odr_avl[0].hz;
>>
>>       /* Some devices don't support a data ready pin. */
>> -     if (!pdata && press_data->sensor_settings->drdy_irq.addr)
>> +     if (!pdata && (press_data->sensor_settings->drdy_irq.int1.addr ||
>> +                    press_data->sensor_settings->drdy_irq.int2.addr))
>>               pdata = (struct st_sensors_platform_data *)&default_press_pdata;
>>
>>       err = st_sensors_init_sensor(indio_dev, press_data->dev->platform_data);
>> diff --git a/include/linux/iio/common/st_sensors.h b/include/linux/iio/common/st_sensors.h
>> index 7b0fa8b5c120..ac3aa89518ca 100644
>> --- a/include/linux/iio/common/st_sensors.h
>> +++ b/include/linux/iio/common/st_sensors.h
>> @@ -132,9 +132,8 @@ struct st_sensor_das {
>>
>>  /**
>>   * struct st_sensor_data_ready_irq - ST sensor device data-ready interrupt
>> - * @addr: address of the register.
>> - * @mask_int1: mask to enable/disable IRQ on INT1 pin.
>> - * @mask_int2: mask to enable/disable IRQ on INT2 pin.
>> + * struct int1 - data-ready configuration register for INT1 pin.
>> + * struct int2 - data-ready configuration register for INT2 pin.
>>   * @addr_ihl: address to enable/disable active low on the INT lines.
>>   * @mask_ihl: mask to enable/disable active low on the INT lines.
>>   * @addr_od: address to enable/disable Open Drain on the INT lines.
>> @@ -145,9 +144,14 @@ struct st_sensor_das {
>>   * @en_mask: mask to write the on/off value for enable.
>>   */
>>  struct st_sensor_data_ready_irq {
>> -     u8 addr;
>> -     u8 mask_int1;
>> -     u8 mask_int2;
>> +     struct {
>> +             u8 addr;
>> +             u8 mask;
>> +     } int1;
>> +     struct {
>> +             u8 addr;
>> +             u8 mask;
>> +     } int2;
>>       u8 addr_ihl;
>>       u8 mask_ihl;
>>       u8 addr_od;
>



-- 
UNIX is Sexy: who | grep -i blonde | talk; cd ~; wine; talk; touch;
unzip; touch; strip; gasp; finger; gasp; mount; fsck; more; yes; gasp;
umount; make clean; sleep

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

* Re: [PATCH v2 5/5] dt-bindings: iio: accel: add LIS2DW12 sensor device binding
  2017-08-17 17:37     ` Lorenzo Bianconi
@ 2017-08-22  2:25         ` Rob Herring
  -1 siblings, 0 replies; 20+ messages in thread
From: Rob Herring @ 2017-08-22  2:25 UTC (permalink / raw)
  To: Lorenzo Bianconi
  Cc: jic23-DgEjT+Ai2ygdnm+yROfE0A, linux-iio-u79uwXL29TY76Z2rM5mHXA,
	linus.walleij-QSEj5FYQhm4dnm+yROfE0A,
	lorenzo.bianconi-qxv4g6HH51o, devicetree-u79uwXL29TY76Z2rM5mHXA

On Thu, Aug 17, 2017 at 07:37:29PM +0200, Lorenzo Bianconi wrote:
> Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi-qxv4g6HH51o@public.gmane.org>
> ---
>  Documentation/devicetree/bindings/iio/st-sensors.txt | 1 +
>  1 file changed, 1 insertion(+)

Acked-by: Rob Herring <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>

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

* Re: [PATCH v2 5/5] dt-bindings: iio: accel: add LIS2DW12 sensor device binding
@ 2017-08-22  2:25         ` Rob Herring
  0 siblings, 0 replies; 20+ messages in thread
From: Rob Herring @ 2017-08-22  2:25 UTC (permalink / raw)
  To: Lorenzo Bianconi
  Cc: jic23, linux-iio, linus.walleij, lorenzo.bianconi, devicetree

On Thu, Aug 17, 2017 at 07:37:29PM +0200, Lorenzo Bianconi wrote:
> Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@st.com>
> ---
>  Documentation/devicetree/bindings/iio/st-sensors.txt | 1 +
>  1 file changed, 1 insertion(+)

Acked-by: Rob Herring <robh@kernel.org>

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

* Re: [PATCH v2 0/5] Add support to LIS2DW12 accel sensor
  2017-08-17 17:37 ` Lorenzo Bianconi
@ 2017-08-28 13:41     ` Lorenzo Bianconi
  -1 siblings, 0 replies; 20+ messages in thread
From: Lorenzo Bianconi @ 2017-08-28 13:41 UTC (permalink / raw)
  To: Jonathan Cameron
  Cc: linux-iio-u79uwXL29TY76Z2rM5mHXA, Linus Walleij,
	Lorenzo BIANCONI, devicetree-u79uwXL29TY76Z2rM5mHXA

> Modify management of drdy line and status register in order to support
> LIS2DW12 device
>
> Changes since v1:
> - remove drdy_irq parameter from LPS001WP settings since the sensor
> does not support data-ready interrupts
>
> Lorenzo Bianconi (5):
>   iio: st_sensors: decouple irq1 configuration parameters from the irq2
>     ones
>   iio: st_sensors: do not always write enable_axis register
>   iio: st_sensors: add register mask for status register
>   iio: accel: add support to LIS2DW12
>   dt-bindings: iio: accel: add LIS2DW12 sensor device binding
>
>  .../devicetree/bindings/iio/st-sensors.txt         |   1 +
>  drivers/iio/accel/st_accel.h                       |   2 +
>  drivers/iio/accel/st_accel_core.c                  | 180 +++++++++++++++++----
>  drivers/iio/accel/st_accel_i2c.c                   |   5 +
>  drivers/iio/accel/st_accel_spi.c                   |   5 +
>  drivers/iio/common/st_sensors/st_sensors_core.c    |  33 ++--
>  drivers/iio/common/st_sensors/st_sensors_trigger.c |  16 +-
>  drivers/iio/gyro/st_gyro_core.c                    |  33 ++--
>  drivers/iio/magnetometer/st_magn_core.c            |  11 +-
>  drivers/iio/pressure/st_pressure_core.c            |  46 ++++--
>  include/linux/iio/common/st_sensors.h              |  23 ++-
>  11 files changed, 265 insertions(+), 90 deletions(-)
>
> --
> 2.14.0
>

Hi Jonathan,

please ignore v2 series, I will send a v3 based on an irq fix for
LIS3MDL magn sensor.
Have a nice vacation :)
Thanks,

Regards,
Lorenzo

-- 
UNIX is Sexy: who | grep -i blonde | talk; cd ~; wine; talk; touch;
unzip; touch; strip; gasp; finger; gasp; mount; fsck; more; yes; gasp;
umount; make clean; sleep
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: [PATCH v2 0/5] Add support to LIS2DW12 accel sensor
@ 2017-08-28 13:41     ` Lorenzo Bianconi
  0 siblings, 0 replies; 20+ messages in thread
From: Lorenzo Bianconi @ 2017-08-28 13:41 UTC (permalink / raw)
  To: Jonathan Cameron; +Cc: linux-iio, Linus Walleij, Lorenzo BIANCONI, devicetree

> Modify management of drdy line and status register in order to support
> LIS2DW12 device
>
> Changes since v1:
> - remove drdy_irq parameter from LPS001WP settings since the sensor
> does not support data-ready interrupts
>
> Lorenzo Bianconi (5):
>   iio: st_sensors: decouple irq1 configuration parameters from the irq2
>     ones
>   iio: st_sensors: do not always write enable_axis register
>   iio: st_sensors: add register mask for status register
>   iio: accel: add support to LIS2DW12
>   dt-bindings: iio: accel: add LIS2DW12 sensor device binding
>
>  .../devicetree/bindings/iio/st-sensors.txt         |   1 +
>  drivers/iio/accel/st_accel.h                       |   2 +
>  drivers/iio/accel/st_accel_core.c                  | 180 +++++++++++++++++----
>  drivers/iio/accel/st_accel_i2c.c                   |   5 +
>  drivers/iio/accel/st_accel_spi.c                   |   5 +
>  drivers/iio/common/st_sensors/st_sensors_core.c    |  33 ++--
>  drivers/iio/common/st_sensors/st_sensors_trigger.c |  16 +-
>  drivers/iio/gyro/st_gyro_core.c                    |  33 ++--
>  drivers/iio/magnetometer/st_magn_core.c            |  11 +-
>  drivers/iio/pressure/st_pressure_core.c            |  46 ++++--
>  include/linux/iio/common/st_sensors.h              |  23 ++-
>  11 files changed, 265 insertions(+), 90 deletions(-)
>
> --
> 2.14.0
>

Hi Jonathan,

please ignore v2 series, I will send a v3 based on an irq fix for
LIS3MDL magn sensor.
Have a nice vacation :)
Thanks,

Regards,
Lorenzo

-- 
UNIX is Sexy: who | grep -i blonde | talk; cd ~; wine; talk; touch;
unzip; touch; strip; gasp; finger; gasp; mount; fsck; more; yes; gasp;
umount; make clean; sleep

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

end of thread, other threads:[~2017-08-28 13:41 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-08-17 17:37 [PATCH v2 0/5] Add support to LIS2DW12 accel sensor Lorenzo Bianconi
2017-08-17 17:37 ` Lorenzo Bianconi
     [not found] ` <20170817173729.10899-1-lorenzo.bianconi-qxv4g6HH51o@public.gmane.org>
2017-08-17 17:37   ` [PATCH v2 1/5] iio: st_sensors: decouple irq1 configuration parameters from the irq2 ones Lorenzo Bianconi
2017-08-17 17:37     ` Lorenzo Bianconi
     [not found]     ` <20170817173729.10899-2-lorenzo.bianconi-qxv4g6HH51o@public.gmane.org>
2017-08-20  9:41       ` Jonathan Cameron
2017-08-20  9:41         ` Jonathan Cameron
2017-08-20 10:08         ` Lorenzo Bianconi
2017-08-20 10:08           ` Lorenzo Bianconi
2017-08-17 17:37   ` [PATCH v2 2/5] iio: st_sensors: do not always write enable_axis register Lorenzo Bianconi
2017-08-17 17:37     ` Lorenzo Bianconi
2017-08-17 17:37   ` [PATCH v2 3/5] iio: st_sensors: add register mask for status register Lorenzo Bianconi
2017-08-17 17:37     ` Lorenzo Bianconi
2017-08-17 17:37   ` [PATCH v2 4/5] iio: accel: add support to LIS2DW12 Lorenzo Bianconi
2017-08-17 17:37     ` Lorenzo Bianconi
2017-08-17 17:37   ` [PATCH v2 5/5] dt-bindings: iio: accel: add LIS2DW12 sensor device binding Lorenzo Bianconi
2017-08-17 17:37     ` Lorenzo Bianconi
     [not found]     ` <20170817173729.10899-6-lorenzo.bianconi-qxv4g6HH51o@public.gmane.org>
2017-08-22  2:25       ` Rob Herring
2017-08-22  2:25         ` Rob Herring
2017-08-28 13:41   ` [PATCH v2 0/5] Add support to LIS2DW12 accel sensor Lorenzo Bianconi
2017-08-28 13:41     ` Lorenzo Bianconi

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.