Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 23cde4d6 authored by Denis CIOCCA's avatar Denis CIOCCA Committed by Jonathan Cameron
Browse files

iio: Added ST-sensors platform data to select the DRDY interrupt pin



This patch add support to redirect the DRDY interrupt on INT1 or INT2
on accelerometer and pressure sensors.

Signed-off-by: default avatarDenis Ciocca <denis.ciocca@st.com>
Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
parent 36e607a1
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -25,7 +25,16 @@
#define LSM303DLM_ACCEL_DEV_NAME	"lsm303dlm_accel"
#define LSM330_ACCEL_DEV_NAME		"lsm330_accel"

int st_accel_common_probe(struct iio_dev *indio_dev);
/**
* struct st_sensors_platform_data - default accel platform data
* @drdy_int_pin: default accel DRDY is available on INT1 pin.
*/
static const struct st_sensors_platform_data default_accel_pdata = {
	.drdy_int_pin = 1,
};

int st_accel_common_probe(struct iio_dev *indio_dev,
					struct st_sensors_platform_data *pdata);
void st_accel_common_remove(struct iio_dev *indio_dev);

#ifdef CONFIG_IIO_BUFFER
+19 −8
Original line number Diff line number Diff line
@@ -65,7 +65,8 @@
#define ST_ACCEL_1_BDU_ADDR			0x23
#define ST_ACCEL_1_BDU_MASK			0x80
#define ST_ACCEL_1_DRDY_IRQ_ADDR		0x22
#define ST_ACCEL_1_DRDY_IRQ_MASK		0x10
#define ST_ACCEL_1_DRDY_IRQ_INT1_MASK		0x10
#define ST_ACCEL_1_DRDY_IRQ_INT2_MASK		0x08
#define ST_ACCEL_1_MULTIREAD_BIT		true

/* CUSTOM VALUES FOR SENSOR 2 */
@@ -89,7 +90,8 @@
#define ST_ACCEL_2_BDU_ADDR			0x23
#define ST_ACCEL_2_BDU_MASK			0x80
#define ST_ACCEL_2_DRDY_IRQ_ADDR		0x22
#define ST_ACCEL_2_DRDY_IRQ_MASK		0x02
#define ST_ACCEL_2_DRDY_IRQ_INT1_MASK		0x02
#define ST_ACCEL_2_DRDY_IRQ_INT2_MASK		0x10
#define ST_ACCEL_2_MULTIREAD_BIT		true

/* CUSTOM VALUES FOR SENSOR 3 */
@@ -121,7 +123,8 @@
#define ST_ACCEL_3_BDU_ADDR			0x20
#define ST_ACCEL_3_BDU_MASK			0x08
#define ST_ACCEL_3_DRDY_IRQ_ADDR		0x23
#define ST_ACCEL_3_DRDY_IRQ_MASK		0x80
#define ST_ACCEL_3_DRDY_IRQ_INT1_MASK		0x80
#define ST_ACCEL_3_DRDY_IRQ_INT2_MASK		0x00
#define ST_ACCEL_3_IG1_EN_ADDR			0x23
#define ST_ACCEL_3_IG1_EN_MASK			0x08
#define ST_ACCEL_3_MULTIREAD_BIT		false
@@ -224,7 +227,8 @@ static const struct st_sensors st_accel_sensors[] = {
		},
		.drdy_irq = {
			.addr = ST_ACCEL_1_DRDY_IRQ_ADDR,
			.mask = ST_ACCEL_1_DRDY_IRQ_MASK,
			.mask_int1 = ST_ACCEL_1_DRDY_IRQ_INT1_MASK,
			.mask_int2 = ST_ACCEL_1_DRDY_IRQ_INT2_MASK,
		},
		.multi_read_bit = ST_ACCEL_1_MULTIREAD_BIT,
		.bootime = 2,
@@ -285,7 +289,8 @@ static const struct st_sensors st_accel_sensors[] = {
		},
		.drdy_irq = {
			.addr = ST_ACCEL_2_DRDY_IRQ_ADDR,
			.mask = ST_ACCEL_2_DRDY_IRQ_MASK,
			.mask_int1 = ST_ACCEL_2_DRDY_IRQ_INT1_MASK,
			.mask_int2 = ST_ACCEL_2_DRDY_IRQ_INT2_MASK,
		},
		.multi_read_bit = ST_ACCEL_2_MULTIREAD_BIT,
		.bootime = 2,
@@ -358,7 +363,8 @@ static const struct st_sensors st_accel_sensors[] = {
		},
		.drdy_irq = {
			.addr = ST_ACCEL_3_DRDY_IRQ_ADDR,
			.mask = ST_ACCEL_3_DRDY_IRQ_MASK,
			.mask_int1 = ST_ACCEL_3_DRDY_IRQ_INT1_MASK,
			.mask_int2 = ST_ACCEL_3_DRDY_IRQ_INT2_MASK,
			.ig1 = {
				.en_addr = ST_ACCEL_3_IG1_EN_ADDR,
				.en_mask = ST_ACCEL_3_IG1_EN_MASK,
@@ -443,7 +449,8 @@ static const struct iio_trigger_ops st_accel_trigger_ops = {
#define ST_ACCEL_TRIGGER_OPS NULL
#endif

int st_accel_common_probe(struct iio_dev *indio_dev)
int st_accel_common_probe(struct iio_dev *indio_dev,
				struct st_sensors_platform_data *plat_data)
{
	int err;
	struct st_sensor_data *adata = iio_priv(indio_dev);
@@ -465,7 +472,11 @@ int st_accel_common_probe(struct iio_dev *indio_dev)
						&adata->sensor->fs.fs_avl[0];
	adata->odr = adata->sensor->odr.odr_avl[0].hz;

	err = st_sensors_init_sensor(indio_dev);
	if (!plat_data)
		plat_data =
			(struct st_sensors_platform_data *)&default_accel_pdata;

	err = st_sensors_init_sensor(indio_dev, plat_data);
	if (err < 0)
		goto st_accel_common_probe_error;

+1 −1
Original line number Diff line number Diff line
@@ -36,7 +36,7 @@ static int st_accel_i2c_probe(struct i2c_client *client,

	st_sensors_i2c_configure(indio_dev, client, adata);

	err = st_accel_common_probe(indio_dev);
	err = st_accel_common_probe(indio_dev, client->dev.platform_data);
	if (err < 0)
		goto st_accel_common_probe_error;

+1 −1
Original line number Diff line number Diff line
@@ -35,7 +35,7 @@ static int st_accel_spi_probe(struct spi_device *spi)

	st_sensors_spi_configure(indio_dev, spi, adata);

	err = st_accel_common_probe(indio_dev);
	err = st_accel_common_probe(indio_dev, spi->dev.platform_data);
	if (err < 0)
		goto st_accel_common_probe_error;

+36 −5
Original line number Diff line number Diff line
@@ -22,7 +22,7 @@

static inline u32 st_sensors_get_unaligned_le24(const u8 *p)
{
	return ((s32)((p[0] | p[1] << 8 | p[2] << 16) << 8) >> 8);
	return (s32)((p[0] | p[1] << 8 | p[2] << 16) << 8) >> 8;
}

static int st_sensors_write_data_with_mask(struct iio_dev *indio_dev,
@@ -198,13 +198,39 @@ int st_sensors_set_axis_enable(struct iio_dev *indio_dev, u8 axis_enable)
}
EXPORT_SYMBOL(st_sensors_set_axis_enable);

int st_sensors_init_sensor(struct iio_dev *indio_dev)
int st_sensors_init_sensor(struct iio_dev *indio_dev,
					struct st_sensors_platform_data *pdata)
{
	int err;
	struct st_sensor_data *sdata = iio_priv(indio_dev);

	mutex_init(&sdata->tb.buf_lock);

	switch (pdata->drdy_int_pin) {
	case 1:
		if (sdata->sensor->drdy_irq.mask_int1 == 0) {
			dev_err(&indio_dev->dev,
					"DRDY on INT1 not available.\n");
			err = -EINVAL;
			goto init_error;
		}
		sdata->drdy_int_pin = 1;
		break;
	case 2:
		if (sdata->sensor->drdy_irq.mask_int2 == 0) {
			dev_err(&indio_dev->dev,
					"DRDY on INT2 not available.\n");
			err = -EINVAL;
			goto init_error;
		}
		sdata->drdy_int_pin = 2;
		break;
	default:
		dev_err(&indio_dev->dev, "DRDY on pdata not valid.\n");
		err = -EINVAL;
		goto init_error;
	}

	err = st_sensors_set_enable(indio_dev, false);
	if (err < 0)
		goto init_error;
@@ -234,6 +260,7 @@ EXPORT_SYMBOL(st_sensors_init_sensor);
int st_sensors_set_dataready_irq(struct iio_dev *indio_dev, bool enable)
{
	int err;
	u8 drdy_mask;
	struct st_sensor_data *sdata = iio_priv(indio_dev);

	/* Enable/Disable the interrupt generator 1. */
@@ -245,10 +272,14 @@ 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->drdy_irq.mask_int1;
	else
		drdy_mask = sdata->sensor->drdy_irq.mask_int2;

	/* Enable/Disable the interrupt generator for data ready. */
	err = st_sensors_write_data_with_mask(indio_dev,
			sdata->sensor->drdy_irq.addr,
			sdata->sensor->drdy_irq.mask, (int)enable);
			sdata->sensor->drdy_irq.addr, drdy_mask, (int)enable);

st_accel_set_dataready_irq_error:
	return err;
Loading