Commit 75d4c6d2 authored by Lorenzo Bianconi's avatar Lorenzo Bianconi Committed by Jonathan Cameron
Browse files

iio: st_sensors: decouple irq1 configuration parameters from the irq2 ones



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: default avatarLorenzo Bianconi <lorenzo.bianconi@st.com>
Reviewed-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent e72a0601
Loading
Loading
Loading
Loading
+44 −22
Original line number Diff line number Diff line
@@ -159,9 +159,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
			.mask = 0x80,
		},
		.drdy_irq = {
			.int1 = {
				.addr = 0x22,
			.mask_int1 = 0x10,
			.mask_int2 = 0x00,
				.mask = 0x10,
			},
			.addr_ihl = 0x25,
			.mask_ihl = 0x02,
			.stat_drdy = {
@@ -232,9 +233,14 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
			.mask = 0x80,
		},
		.drdy_irq = {
			.int1 = {
				.addr = 0x22,
				.mask = 0x02,
			},
			.int2 = {
				.addr = 0x22,
			.mask_int1 = 0x02,
			.mask_int2 = 0x10,
				.mask = 0x10,
			},
			.addr_ihl = 0x22,
			.mask_ihl = 0x80,
			.addr_od = 0x22,
@@ -319,9 +325,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
			.mask = 0x08,
		},
		.drdy_irq = {
			.int1 = {
				.addr = 0x23,
			.mask_int1 = 0x80,
			.mask_int2 = 0x00,
				.mask = 0x80,
			},
			.addr_ihl = 0x23,
			.mask_ihl = 0x40,
			.stat_drdy = {
@@ -396,8 +403,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
			.mask = 0x01,
		},
		.drdy_irq = {
			.int1 = {
				.addr = 0x21,
			.mask_int1 = 0x04,
				.mask = 0x04,
			},
			.stat_drdy = {
				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
				.mask = 0x07,
@@ -456,9 +465,14 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
			},
		},
		.drdy_irq = {
			.int1 = {
				.addr = 0x22,
				.mask = 0x04,
			},
			.int2 = {
				.addr = 0x22,
			.mask_int1 = 0x04,
			.mask_int2 = 0x20,
				.mask = 0x20,
			},
			.addr_ihl = 0x22,
			.mask_ihl = 0x80,
			.addr_od = 0x22,
@@ -528,9 +542,14 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
			.mask = 0x80,
		},
		.drdy_irq = {
			.int1 = {
				.addr = 0x22,
				.mask = 0x02,
			},
			.int2 = {
				.addr = 0x22,
			.mask_int1 = 0x02,
			.mask_int2 = 0x10,
				.mask = 0x10,
			},
			.addr_ihl = 0x22,
			.mask_ihl = 0x80,
		},
@@ -582,8 +601,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
		.bdu = {
		},
		.drdy_irq = {
			.int1 = {
				.addr = 0x21,
			.mask_int1 = 0x04,
				.mask = 0x04,
			},
			.stat_drdy = {
				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
				.mask = 0x07,
@@ -653,9 +674,10 @@ static const struct st_sensor_settings st_accel_sensors_settings[] = {
			},
		},
		.drdy_irq = {
			.int1 = {
				.addr = 0x22,
			.mask_int1 = 0x10,
			.mask_int2 = 0x00,
				.mask = 0x10,
			},
			.addr_ihl = 0x25,
			.mask_ihl = 0x02,
			.stat_drdy = {
+16 −12
Original line number Diff line number Diff line
@@ -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) {
		/*
		 * there are some devices (e.g. LIS3MDL) where drdy line is
		 * routed to a given pin and it is not possible to select a
@@ -485,17 +487,19 @@ 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,
	err = st_sensors_write_data_with_mask(indio_dev, drdy_addr,
					      drdy_mask, (int)enable);

st_accel_set_dataready_irq_error:
+12 −6
Original line number Diff line number Diff line
@@ -111,8 +111,10 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = {
			.mask = 0x80,
		},
		.drdy_irq = {
			.int2 = {
				.addr = 0x22,
			.mask_int2 = 0x08,
				.mask = 0x08,
			},
			/*
			 * The sensor has IHL (active low) and open
			 * drain settings, but only for INT1 and not
@@ -184,8 +186,10 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = {
			.mask = 0x80,
		},
		.drdy_irq = {
			.int2 = {
				.addr = 0x22,
			.mask_int2 = 0x08,
				.mask = 0x08,
			},
			/*
			 * The sensor has IHL (active low) and open
			 * drain settings, but only for INT1 and not
@@ -252,8 +256,10 @@ static const struct st_sensor_settings st_gyro_sensors_settings[] = {
			.mask = 0x80,
		},
		.drdy_irq = {
			.int2 = {
				.addr = 0x22,
			.mask_int2 = 0x08,
				.mask = 0x08,
			},
			/*
			 * The sensor has IHL (active low) and open
			 * drain settings, but only for INT1 and not
+4 −2
Original line number Diff line number Diff line
@@ -362,8 +362,10 @@ static const struct st_sensor_settings st_magn_sensors_settings[] = {
			.mask = 0x10,
		},
		.drdy_irq = {
			.int1 = {
				.addr = 0x62,
			.mask_int1 = 0x01,
				.mask = 0x01,
			},
			.stat_drdy = {
				.addr = 0x67,
				.mask = 0x07,
+18 −13
Original line number Diff line number Diff line
@@ -280,9 +280,14 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
			.mask = 0x04,
		},
		.drdy_irq = {
			.int1 = {
				.addr = 0x22,
			.mask_int1 = 0x04,
			.mask_int2 = 0x20,
				.mask = 0x04,
			},
			.int2 = {
				.addr = 0x22,
				.mask = 0x20,
			},
			.addr_ihl = 0x22,
			.mask_ihl = 0x80,
			.addr_od = 0x22,
@@ -338,9 +343,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,
	},
@@ -391,9 +393,10 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
			.mask = 0x04,
		},
		.drdy_irq = {
			.int1 = {
				.addr = 0x23,
			.mask_int1 = 0x01,
			.mask_int2 = 0x00,
				.mask = 0x01,
			},
			.addr_ihl = 0x22,
			.mask_ihl = 0x80,
			.addr_od = 0x22,
@@ -455,9 +458,10 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
			.mask = 0x02,
		},
		.drdy_irq = {
			.int1 = {
				.addr = 0x12,
			.mask_int1 = 0x04,
			.mask_int2 = 0x00,
				.mask = 0x04,
			},
			.addr_ihl = 0x12,
			.mask_ihl = 0x80,
			.addr_od = 0x12,
@@ -614,7 +618,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);
Loading