iio:pressure: Add support for LPS25H pressure sensor
authorDenis CIOCCA <denis.ciocca@st.com>
Thu, 20 Feb 2014 17:49:00 +0000 (17:49 +0000)
committerJonathan Cameron <jic23@kernel.org>
Sat, 22 Feb 2014 13:09:53 +0000 (13:09 +0000)
This patch adds support for the new barometer sensor: LPS25H.

Signed-off-by: Denis Ciocca <denis.ciocca@st.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
drivers/iio/pressure/Kconfig
drivers/iio/pressure/st_pressure.h
drivers/iio/pressure/st_pressure_core.c
drivers/iio/pressure/st_pressure_i2c.c
drivers/iio/pressure/st_pressure_spi.c

index 6215761b3c5387cd8f890813928ec74abeec653a..d88ff17fedb29066faa2e34f644b97d4850623f5 100644 (file)
@@ -40,7 +40,7 @@ config IIO_ST_PRESS
        select IIO_TRIGGERED_BUFFER if (IIO_BUFFER)
        help
          Say yes here to build support for STMicroelectronics pressure
-         sensors: LPS001WP, LPS331AP.
+         sensors: LPS001WP, LPS25H, LPS331AP.
 
          This driver can also be built as a module. If so, these modules
          will be created:
index 049c21acf1f051bfea9067c45ad7eb543b6361b2..242943c0c4e496c4b054bb5426cc06c5380accdb 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/iio/common/st_sensors.h>
 
 #define LPS001WP_PRESS_DEV_NAME                "lps001wp"
+#define LPS25H_PRESS_DEV_NAME          "lps25h"
 #define LPS331AP_PRESS_DEV_NAME                "lps331ap"
 
 /**
index 58083f9d51c56691281891e4afbbe368d92697ab..7418768ed49c62ef830d071f84f7506729129369 100644 (file)
@@ -40,6 +40,9 @@
 /* FULLSCALE */
 #define ST_PRESS_FS_AVL_1260MB                 1260
 
+#define ST_PRESS_1_OUT_XL_ADDR                 0x28
+#define ST_TEMP_1_OUT_L_ADDR                   0x2b
+
 /* CUSTOM VALUES FOR LPS331AP SENSOR */
 #define ST_PRESS_LPS331AP_WAI_EXP              0xbb
 #define ST_PRESS_LPS331AP_ODR_ADDR             0x20
@@ -62,8 +65,6 @@
 #define ST_PRESS_LPS331AP_DRDY_IRQ_INT2_MASK   0x20
 #define ST_PRESS_LPS331AP_MULTIREAD_BIT                true
 #define ST_PRESS_LPS331AP_TEMP_OFFSET          42500
-#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_OUT_L_ADDR           0x28
 #define ST_TEMP_LPS001WP_OUT_L_ADDR            0x2a
 
-static const struct iio_chan_spec st_press_lps331ap_channels[] = {
+/* CUSTOM VALUES FOR LPS25H SENSOR */
+#define ST_PRESS_LPS25H_WAI_EXP                        0xbd
+#define ST_PRESS_LPS25H_ODR_ADDR               0x20
+#define ST_PRESS_LPS25H_ODR_MASK               0x70
+#define ST_PRESS_LPS25H_ODR_AVL_1HZ_VAL                0x01
+#define ST_PRESS_LPS25H_ODR_AVL_7HZ_VAL                0x02
+#define ST_PRESS_LPS25H_ODR_AVL_13HZ_VAL       0x03
+#define ST_PRESS_LPS25H_ODR_AVL_25HZ_VAL       0x04
+#define ST_PRESS_LPS25H_PW_ADDR                        0x20
+#define ST_PRESS_LPS25H_PW_MASK                        0x80
+#define ST_PRESS_LPS25H_FS_ADDR                        0x00
+#define ST_PRESS_LPS25H_FS_MASK                        0x00
+#define ST_PRESS_LPS25H_FS_AVL_1260_VAL                0x00
+#define ST_PRESS_LPS25H_FS_AVL_1260_GAIN       ST_PRESS_KPASCAL_NANO_SCALE
+#define ST_PRESS_LPS25H_FS_AVL_TEMP_GAIN       ST_PRESS_CELSIUS_NANO_SCALE
+#define ST_PRESS_LPS25H_BDU_ADDR               0x20
+#define ST_PRESS_LPS25H_BDU_MASK               0x04
+#define ST_PRESS_LPS25H_DRDY_IRQ_ADDR          0x23
+#define ST_PRESS_LPS25H_DRDY_IRQ_INT1_MASK     0x01
+#define ST_PRESS_LPS25H_DRDY_IRQ_INT2_MASK     0x10
+#define ST_PRESS_LPS25H_MULTIREAD_BIT          true
+#define ST_PRESS_LPS25H_TEMP_OFFSET            42500
+#define ST_PRESS_LPS25H_OUT_XL_ADDR            0x28
+#define ST_TEMP_LPS25H_OUT_L_ADDR              0x2b
+
+static const struct iio_chan_spec st_press_1_channels[] = {
        {
                .type = IIO_PRESSURE,
                .channel2 = IIO_NO_MOD,
-               .address = ST_PRESS_LPS331AP_OUT_XL_ADDR,
+               .address = ST_PRESS_1_OUT_XL_ADDR,
                .scan_index = ST_SENSORS_SCAN_X,
                .scan_type = {
                        .sign = 'u',
@@ -99,7 +125,7 @@ static const struct iio_chan_spec st_press_lps331ap_channels[] = {
        {
                .type = IIO_TEMP,
                .channel2 = IIO_NO_MOD,
-               .address = ST_TEMP_LPS331AP_OUT_L_ADDR,
+               .address = ST_TEMP_1_OUT_L_ADDR,
                .scan_index = -1,
                .scan_type = {
                        .sign = 'u',
@@ -156,8 +182,8 @@ static const struct st_sensors st_press_sensors[] = {
                .sensors_supported = {
                        [0] = LPS331AP_PRESS_DEV_NAME,
                },
-               .ch = (struct iio_chan_spec *)st_press_lps331ap_channels,
-               .num_ch = ARRAY_SIZE(st_press_lps331ap_channels),
+               .ch = (struct iio_chan_spec *)st_press_1_channels,
+               .num_ch = ARRAY_SIZE(st_press_1_channels),
                .odr = {
                        .addr = ST_PRESS_LPS331AP_ODR_ADDR,
                        .mask = ST_PRESS_LPS331AP_ODR_MASK,
@@ -233,6 +259,53 @@ static const struct st_sensors st_press_sensors[] = {
                .multi_read_bit = ST_PRESS_LPS001WP_MULTIREAD_BIT,
                .bootime = 2,
        },
+       {
+               .wai = ST_PRESS_LPS25H_WAI_EXP,
+               .sensors_supported = {
+                       [0] = LPS25H_PRESS_DEV_NAME,
+               },
+               .ch = (struct iio_chan_spec *)st_press_1_channels,
+               .num_ch = ARRAY_SIZE(st_press_1_channels),
+               .odr = {
+                       .addr = ST_PRESS_LPS25H_ODR_ADDR,
+                       .mask = ST_PRESS_LPS25H_ODR_MASK,
+                       .odr_avl = {
+                               { 1, ST_PRESS_LPS25H_ODR_AVL_1HZ_VAL, },
+                               { 7, ST_PRESS_LPS25H_ODR_AVL_7HZ_VAL, },
+                               { 13, ST_PRESS_LPS25H_ODR_AVL_13HZ_VAL, },
+                               { 25, ST_PRESS_LPS25H_ODR_AVL_25HZ_VAL, },
+                       },
+               },
+               .pw = {
+                       .addr = ST_PRESS_LPS25H_PW_ADDR,
+                       .mask = ST_PRESS_LPS25H_PW_MASK,
+                       .value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
+                       .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
+               },
+               .fs = {
+                       .addr = ST_PRESS_LPS25H_FS_ADDR,
+                       .mask = ST_PRESS_LPS25H_FS_MASK,
+                       .fs_avl = {
+                               [0] = {
+                                       .num = ST_PRESS_FS_AVL_1260MB,
+                                       .value = ST_PRESS_LPS25H_FS_AVL_1260_VAL,
+                                       .gain = ST_PRESS_LPS25H_FS_AVL_1260_GAIN,
+                                       .gain2 = ST_PRESS_LPS25H_FS_AVL_TEMP_GAIN,
+                               },
+                       },
+               },
+               .bdu = {
+                       .addr = ST_PRESS_LPS25H_BDU_ADDR,
+                       .mask = ST_PRESS_LPS25H_BDU_MASK,
+               },
+               .drdy_irq = {
+                       .addr = ST_PRESS_LPS25H_DRDY_IRQ_ADDR,
+                       .mask_int1 = ST_PRESS_LPS25H_DRDY_IRQ_INT1_MASK,
+                       .mask_int2 = ST_PRESS_LPS25H_DRDY_IRQ_INT2_MASK,
+               },
+               .multi_read_bit = ST_PRESS_LPS25H_MULTIREAD_BIT,
+               .bootime = 2,
+       },
 };
 
 static int st_press_read_raw(struct iio_dev *indio_dev,
index 51eab7fcb1949894913048980895966792a5c4c9..3cd73e39b8404d5e79db9cb950aa33d669af1e49 100644 (file)
@@ -50,6 +50,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 },
+       { LPS25H_PRESS_DEV_NAME },
        { LPS331AP_PRESS_DEV_NAME },
        {},
 };
index 27322af6d665857a52435f139beca6a7689995f0..f45d430ec52968bf42cb7b634263709fb5db69f4 100644 (file)
@@ -49,6 +49,7 @@ static int st_press_spi_remove(struct spi_device *spi)
 
 static const struct spi_device_id st_press_id_table[] = {
        { LPS001WP_PRESS_DEV_NAME },
+       { LPS25H_PRESS_DEV_NAME },
        { LPS331AP_PRESS_DEV_NAME },
        {},
 };