On 22 May 2016 20:39:29 BST, Jonathan Cameron <jic23@xxxxxxxxxx> wrote: >Time to finally kill off the venerable (it was one of my first drivers) >lis3l02dq driver in favour of adding support in the st sensors >framework. > >This does loose us the event support that driver always had, but I >think >that will reappear at some point and in the meantime the maintenance >advantages of dropping the 'special' driver for this one part outweigh >the issues. > >It's worth noting this part is ancient and I may well be the only >person >who still has any on hardware running recent kernels. > >It has a few 'quirks'. > - No WAI register so that just became optional. > - A BDU option that really does block updates. Completely. > Whatever you do, you don't get any more data with it set. > It is documented the same as more modern parts but I presume they > are actually clearing for updates after a read of both bytes! > - Fixed scale. > - It's too quick. Even at slowest rate (280Hz) I can't read out fast > enough on my board (stargate 2) to beat new data coming in. Linus' > repeat read patch doesn't help in this case. It just means I get 10 > readings before dying... So in reality this will get used with > software triggers only unless someone has this long out of production > device on a quick board. Forgot to say that I"ll obviously drop the separate driver at same time as taking this. J > >Signed-off-by: Jonathan Cameron <jic23@xxxxxxxxxx> >Cc: Denis CIOCCA <denis.ciocca@xxxxxx> >Cc: Linus Walleij <linus.walleij@xxxxxxxxxx> >Cc: Crestez Dan Leonard <leonard.crestez@xxxxxxxxx> >--- > drivers/iio/accel/st_accel.h | 1 + >drivers/iio/accel/st_accel_core.c | 64 >+++++++++++++++++++++++++ > drivers/iio/accel/st_accel_i2c.c | 4 ++ > drivers/iio/accel/st_accel_spi.c | 1 + > drivers/iio/common/st_sensors/st_sensors_core.c | 26 +++++----- > 5 files changed, 85 insertions(+), 11 deletions(-) > >diff --git a/drivers/iio/accel/st_accel.h >b/drivers/iio/accel/st_accel.h >index 57f83a67948c..f8dfdb690563 100644 >--- a/drivers/iio/accel/st_accel.h >+++ b/drivers/iio/accel/st_accel.h >@@ -29,6 +29,7 @@ > #define LSM330_ACCEL_DEV_NAME "lsm330_accel" > #define LSM303AGR_ACCEL_DEV_NAME "lsm303agr_accel" > #define LIS2DH12_ACCEL_DEV_NAME "lis2dh12_accel" >+#define LIS3L02DQ_ACCEL_DEV_NAME "lis3l02dq" > > /** > * 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 dc73f2d85e6d..17c643727aff 100644 >--- a/drivers/iio/accel/st_accel_core.c >+++ b/drivers/iio/accel/st_accel_core.c >@@ -215,6 +215,22 @@ > #define ST_ACCEL_6_IHL_IRQ_MASK 0x80 > #define ST_ACCEL_6_MULTIREAD_BIT true > >+/* CUSTOM VALUES FOR SENSOR 7 */ >+#define ST_ACCEL_7_ODR_ADDR 0x20 >+#define ST_ACCEL_7_ODR_MASK 0x30 >+#define ST_ACCEL_7_ODR_AVL_280HZ_VAL 0x00 >+#define ST_ACCEL_7_ODR_AVL_560HZ_VAL 0x01 >+#define ST_ACCEL_7_ODR_AVL_1120HZ_VAL 0x02 >+#define ST_ACCEL_7_ODR_AVL_4480HZ_VAL 0x03 >+#define ST_ACCEL_7_PW_ADDR 0x20 >+#define ST_ACCEL_7_PW_MASK 0xc0 >+#define ST_ACCEL_7_FS_AVL_2_GAIN IIO_G_TO_M_S_2(488) >+#define ST_ACCEL_7_BDU_ADDR 0x21 >+#define ST_ACCEL_7_BDU_MASK 0x40 >+#define ST_ACCEL_7_DRDY_IRQ_ADDR 0x21 >+#define ST_ACCEL_7_DRDY_IRQ_INT1_MASK 0x04 >+#define ST_ACCEL_7_MULTIREAD_BIT false >+ > static const struct iio_chan_spec st_accel_8bit_channels[] = { > ST_SENSORS_LSM_CHANNELS(IIO_ACCEL, > BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE), >@@ -662,6 +678,54 @@ static const struct st_sensor_settings >st_accel_sensors_settings[] = { > .multi_read_bit = ST_ACCEL_6_MULTIREAD_BIT, > .bootime = 2, > }, >+ { >+ /* No WAI register present */ >+ .sensors_supported = { >+ [0] = LIS3L02DQ_ACCEL_DEV_NAME, >+ }, >+ .ch = (struct iio_chan_spec *)st_accel_12bit_channels, >+ .odr = { >+ .addr = ST_ACCEL_7_ODR_ADDR, >+ .mask = ST_ACCEL_7_ODR_MASK, >+ .odr_avl = { >+ { 280, ST_ACCEL_7_ODR_AVL_280HZ_VAL, }, >+ { 560, ST_ACCEL_7_ODR_AVL_560HZ_VAL, }, >+ { 1120, ST_ACCEL_7_ODR_AVL_1120HZ_VAL, }, >+ { 4480, ST_ACCEL_7_ODR_AVL_4480HZ_VAL, }, >+ }, >+ }, >+ .pw = { >+ .addr = ST_ACCEL_7_PW_ADDR, >+ .mask = ST_ACCEL_7_PW_MASK, >+ .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE, >+ .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE, >+ }, >+ .enable_axis = { >+ .addr = ST_SENSORS_DEFAULT_AXIS_ADDR, >+ .mask = ST_SENSORS_DEFAULT_AXIS_MASK, >+ }, >+ .fs = { >+ .fs_avl = { >+ [0] = { >+ .num = ST_ACCEL_FS_AVL_2G, >+ .gain = ST_ACCEL_7_FS_AVL_2_GAIN, >+ }, >+ }, >+ }, >+ /* >+ * The part has a BDU bit but if set the data is never >+ * updated so don't set it. >+ */ >+ .bdu = { >+ }, >+ .drdy_irq = { >+ .addr = ST_ACCEL_7_DRDY_IRQ_ADDR, >+ .mask_int1 = ST_ACCEL_7_DRDY_IRQ_INT1_MASK, >+ .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR, >+ }, >+ .multi_read_bit = ST_ACCEL_7_MULTIREAD_BIT, >+ .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 7333ee9fb11b..1fb61d8382e0 100644 >--- a/drivers/iio/accel/st_accel_i2c.c >+++ b/drivers/iio/accel/st_accel_i2c.c >@@ -80,6 +80,9 @@ static const struct of_device_id st_accel_of_match[] >= { > .compatible = "st,h3lis331dl-accel", > .data = H3LIS331DL_DRIVER_NAME, > }, >+ { >+ .compatible = "st,lis3l02dq", >+ .data = LIS3L02DQ_DRIVER_NAME, > {}, > }; > MODULE_DEVICE_TABLE(of, st_accel_of_match); >@@ -130,6 +133,7 @@ static const struct i2c_device_id >st_accel_id_table[] = { > { LSM330_ACCEL_DEV_NAME }, > { LSM303AGR_ACCEL_DEV_NAME }, > { LIS2DH12_ACCEL_DEV_NAME }, >+ { LIS3L02DQ_ACCEL_DEV_NAME }, > {}, > }; > 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 fcd5847a3fd3..efd43941d45d 100644 >--- a/drivers/iio/accel/st_accel_spi.c >+++ b/drivers/iio/accel/st_accel_spi.c >@@ -59,6 +59,7 @@ static const struct spi_device_id st_accel_id_table[] >= { > { LSM330_ACCEL_DEV_NAME }, > { LSM303AGR_ACCEL_DEV_NAME }, > { LIS2DH12_ACCEL_DEV_NAME }, >+ { LIS3L02DQ_ACCEL_DEV_NAME }, > {}, > }; > MODULE_DEVICE_TABLE(spi, st_accel_id_table); >diff --git a/drivers/iio/common/st_sensors/st_sensors_core.c >b/drivers/iio/common/st_sensors/st_sensors_core.c >index dffe00692169..b672d2e1d568 100644 >--- a/drivers/iio/common/st_sensors/st_sensors_core.c >+++ b/drivers/iio/common/st_sensors/st_sensors_core.c >@@ -523,7 +523,7 @@ int st_sensors_check_device_support(struct iio_dev >*indio_dev, > int num_sensors_list, > const struct st_sensor_settings *sensor_settings) > { >- int i, n, err; >+ int i, n, err = 0; > u8 wai; > struct st_sensor_data *sdata = iio_priv(indio_dev); > >@@ -543,17 +543,21 @@ int st_sensors_check_device_support(struct >iio_dev *indio_dev, > return -ENODEV; > } > >- err = sdata->tf->read_byte(&sdata->tb, sdata->dev, >- sensor_settings[i].wai_addr, &wai); >- if (err < 0) { >- dev_err(&indio_dev->dev, "failed to read Who-Am-I register.\n"); >- return err; >- } >+ if (sensor_settings[i].wai_addr) { >+ err = sdata->tf->read_byte(&sdata->tb, sdata->dev, >+ sensor_settings[i].wai_addr, &wai); >+ if (err < 0) { >+ dev_err(&indio_dev->dev, >+ "failed to read Who-Am-I register.\n"); >+ return err; >+ } > >- if (sensor_settings[i].wai != wai) { >- dev_err(&indio_dev->dev, "%s: WhoAmI mismatch (0x%x).\n", >- indio_dev->name, wai); >- return -EINVAL; >+ if (sensor_settings[i].wai != wai) { >+ dev_err(&indio_dev->dev, >+ "%s: WhoAmI mismatch (0x%x).\n", >+ indio_dev->name, wai); >+ return -EINVAL; >+ } > } > > sdata->sensor_settings = -- Sent from my Android device with K-9 Mail. Please excuse my brevity. -- To unsubscribe from this list: send the line "unsubscribe linux-iio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html