iio: pressure: st: Add support for new LPS001WP pressure sensor
authorLee Jones <lee.jones@linaro.org>
Mon, 16 Sep 2013 16:02:00 +0000 (17:02 +0100)
committerJonathan Cameron <jic23@kernel.org>
Sat, 21 Sep 2013 18:24:05 +0000 (19:24 +0100)
Here we use existing practices to introduce support for another
pressure/temperature sensor, the LPS001WP.

Signed-off-by: Lee Jones <lee.jones@linaro.org>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
drivers/iio/pressure/st_pressure.h
drivers/iio/pressure/st_pressure_core.c
drivers/iio/pressure/st_pressure_i2c.c

index b0b630688da665138a97e3afbf33c1f387dda323..049c21acf1f051bfea9067c45ad7eb543b6361b2 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/types.h>
 #include <linux/iio/common/st_sensors.h>
 
+#define LPS001WP_PRESS_DEV_NAME                "lps001wp"
 #define LPS331AP_PRESS_DEV_NAME                "lps331ap"
 
 /**
index 453995310d48a9d90ca840c4abd97ef97a385980..e8795420957cbaef0d8453d5f2a9b3ee7b52826d 100644 (file)
 #define ST_PRESS_LPS331AP_OUT_XL_ADDR          0x28
 #define ST_TEMP_LPS331AP_OUT_L_ADDR            0x2b
 
+/* CUSTOM VALUES FOR LPS001WP SENSOR */
+#define ST_PRESS_LPS001WP_WAI_EXP              0xba
+#define ST_PRESS_LPS001WP_ODR_ADDR             0x20
+#define ST_PRESS_LPS001WP_ODR_MASK             0x30
+#define ST_PRESS_LPS001WP_ODR_AVL_1HZ_VAL      0x01
+#define ST_PRESS_LPS001WP_ODR_AVL_7HZ_VAL      0x02
+#define ST_PRESS_LPS001WP_ODR_AVL_13HZ_VAL     0x03
+#define ST_PRESS_LPS001WP_PW_ADDR              0x20
+#define ST_PRESS_LPS001WP_PW_MASK              0x40
+#define ST_PRESS_LPS001WP_BDU_ADDR             0x20
+#define ST_PRESS_LPS001WP_BDU_MASK             0x04
+#define ST_PRESS_LPS001WP_MULTIREAD_BIT                true
+#define ST_PRESS_LPS001WP_OUT_L_ADDR           0x28
+#define ST_TEMP_LPS001WP_OUT_L_ADDR            0x2a
+
 static const struct iio_chan_spec st_press_lps331ap_channels[] = {
        {
                .type = IIO_PRESSURE,
@@ -100,6 +115,40 @@ static const struct iio_chan_spec st_press_lps331ap_channels[] = {
        IIO_CHAN_SOFT_TIMESTAMP(1)
 };
 
+static const struct iio_chan_spec st_press_lps001wp_channels[] = {
+       {
+               .type = IIO_PRESSURE,
+               .channel2 = IIO_NO_MOD,
+               .address = ST_PRESS_LPS001WP_OUT_L_ADDR,
+               .scan_index = ST_SENSORS_SCAN_X,
+               .scan_type = {
+                       .sign = 'u',
+                       .realbits = 16,
+                       .storagebits = 16,
+                       .endianness = IIO_LE,
+               },
+               .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
+               .modified = 0,
+       },
+       {
+               .type = IIO_TEMP,
+               .channel2 = IIO_NO_MOD,
+               .address = ST_TEMP_LPS001WP_OUT_L_ADDR,
+               .scan_index = -1,
+               .scan_type = {
+                       .sign = 'u',
+                       .realbits = 16,
+                       .storagebits = 16,
+                       .endianness = IIO_LE,
+               },
+               .info_mask_separate =
+                       BIT(IIO_CHAN_INFO_RAW) |
+                       BIT(IIO_CHAN_INFO_OFFSET),
+               .modified = 0,
+       },
+       IIO_CHAN_SOFT_TIMESTAMP(1)
+};
+
 static const struct st_sensors st_press_sensors[] = {
        {
                .wai = ST_PRESS_LPS331AP_WAI_EXP,
@@ -148,6 +197,41 @@ static const struct st_sensors st_press_sensors[] = {
                .multi_read_bit = ST_PRESS_LPS331AP_MULTIREAD_BIT,
                .bootime = 2,
        },
+       {
+               .wai = ST_PRESS_LPS001WP_WAI_EXP,
+               .sensors_supported = {
+                       [0] = LPS001WP_PRESS_DEV_NAME,
+               },
+               .ch = (struct iio_chan_spec *)st_press_lps001wp_channels,
+               .num_ch = ARRAY_SIZE(st_press_lps001wp_channels),
+               .odr = {
+                       .addr = ST_PRESS_LPS001WP_ODR_ADDR,
+                       .mask = ST_PRESS_LPS001WP_ODR_MASK,
+                       .odr_avl = {
+                               { 1, ST_PRESS_LPS001WP_ODR_AVL_1HZ_VAL, },
+                               { 7, ST_PRESS_LPS001WP_ODR_AVL_7HZ_VAL, },
+                               { 13, ST_PRESS_LPS001WP_ODR_AVL_13HZ_VAL, },
+                       },
+               },
+               .pw = {
+                       .addr = ST_PRESS_LPS001WP_PW_ADDR,
+                       .mask = ST_PRESS_LPS001WP_PW_MASK,
+                       .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
+                       .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
+               },
+               .fs = {
+                       .addr = 0,
+               },
+               .bdu = {
+                       .addr = ST_PRESS_LPS001WP_BDU_ADDR,
+                       .mask = ST_PRESS_LPS001WP_BDU_MASK,
+               },
+               .drdy_irq = {
+                       .addr = 0,
+               },
+               .multi_read_bit = ST_PRESS_LPS001WP_MULTIREAD_BIT,
+               .bootime = 2,
+       },
 };
 
 static int st_press_read_raw(struct iio_dev *indio_dev,
index 08aac5e6251dd11c770c240a81c38fd82773bc03..51eab7fcb1949894913048980895966792a5c4c9 100644 (file)
@@ -49,6 +49,7 @@ static int st_press_i2c_remove(struct i2c_client *client)
 }
 
 static const struct i2c_device_id st_press_id_table[] = {
+       { LPS001WP_PRESS_DEV_NAME },
        { LPS331AP_PRESS_DEV_NAME },
        {},
 };