iio: st-magn: add support for lsm303agr magnetometer
authorGiuseppe Barba <giuseppe.barba@st.com>
Tue, 21 Jul 2015 08:35:45 +0000 (10:35 +0200)
committerJonathan Cameron <jic23@kernel.org>
Thu, 23 Jul 2015 19:43:27 +0000 (20:43 +0100)
This adds support for the lsm303agr magnetometer.

Signed-off-by: Giuseppe Barba <giuseppe.barba@st.com>
Acked-by: Denis Ciocca <denis.ciocca@st.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Documentation/devicetree/bindings/iio/st-sensors.txt
drivers/iio/magnetometer/st_magn.h
drivers/iio/magnetometer/st_magn_core.c
drivers/iio/magnetometer/st_magn_i2c.c
drivers/iio/magnetometer/st_magn_spi.c

index d80bdaa75754c239f200f1b22c87b3cddf74e2d2..d3ccdb190c53b581f347ef2eb8444fcb3ac84592 100644 (file)
@@ -47,6 +47,7 @@ Gyroscopes:
 - st,lsm330-gyro
 
 Magnetometers:
+- st,lsm303agr-magn
 - st,lsm303dlh-magn
 - st,lsm303dlhc-magn
 - st,lsm303dlm-magn
index 604410236d99550af770c5c239fdd60d1d7d09a9..06a4d9c3558196ec54d1d04200e62b14753c4c62 100644 (file)
@@ -18,6 +18,7 @@
 #define LSM303DLHC_MAGN_DEV_NAME       "lsm303dlhc_magn"
 #define LSM303DLM_MAGN_DEV_NAME                "lsm303dlm_magn"
 #define LIS3MDL_MAGN_DEV_NAME          "lis3mdl"
+#define LSM303AGR_MAGN_DEV_NAME                "lsm303agr_magn"
 
 int st_magn_common_probe(struct iio_dev *indio_dev);
 void st_magn_common_remove(struct iio_dev *indio_dev);
index 4c0cef865517b16344221055ce2e9ee8e9f06e8e..f8dc4b85d70c60858f26b18aba3e3be8ffe43c92 100644 (file)
@@ -43,6 +43,7 @@
 #define ST_MAGN_FS_AVL_8000MG                  8000
 #define ST_MAGN_FS_AVL_8100MG                  8100
 #define ST_MAGN_FS_AVL_12000MG                 12000
+#define ST_MAGN_FS_AVL_15000MG                 15000
 #define ST_MAGN_FS_AVL_16000MG                 16000
 
 /* CUSTOM VALUES FOR SENSOR 0 */
 #define ST_MAGN_2_OUT_Y_L_ADDR                 0x2a
 #define ST_MAGN_2_OUT_Z_L_ADDR                 0x2c
 
+/* CUSTOM VALUES FOR SENSOR 3 */
+#define ST_MAGN_3_WAI_ADDR                     0x4f
+#define ST_MAGN_3_WAI_EXP                      0x40
+#define ST_MAGN_3_ODR_ADDR                     0x60
+#define ST_MAGN_3_ODR_MASK                     0x0c
+#define ST_MAGN_3_ODR_AVL_10HZ_VAL             0x00
+#define ST_MAGN_3_ODR_AVL_20HZ_VAL             0x01
+#define ST_MAGN_3_ODR_AVL_50HZ_VAL             0x02
+#define ST_MAGN_3_ODR_AVL_100HZ_VAL            0x03
+#define ST_MAGN_3_PW_ADDR                      0x60
+#define ST_MAGN_3_PW_MASK                      0x03
+#define ST_MAGN_3_PW_ON                                0x00
+#define ST_MAGN_3_PW_OFF                       0x03
+#define ST_MAGN_3_BDU_ADDR                     0x62
+#define ST_MAGN_3_BDU_MASK                     0x10
+#define ST_MAGN_3_DRDY_IRQ_ADDR                        0x62
+#define ST_MAGN_3_DRDY_INT_MASK                        0x01
+#define ST_MAGN_3_FS_AVL_15000_GAIN            1500
+#define ST_MAGN_3_MULTIREAD_BIT                        false
+#define ST_MAGN_3_OUT_X_L_ADDR                 0x68
+#define ST_MAGN_3_OUT_Y_L_ADDR                 0x6a
+#define ST_MAGN_3_OUT_Z_L_ADDR                 0x6c
+
 static const struct iio_chan_spec st_magn_16bit_channels[] = {
        ST_SENSORS_LSM_CHANNELS(IIO_MAGN,
                        BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
@@ -189,6 +213,22 @@ static const struct iio_chan_spec st_magn_2_16bit_channels[] = {
        IIO_CHAN_SOFT_TIMESTAMP(3)
 };
 
+static const struct iio_chan_spec st_magn_3_16bit_channels[] = {
+       ST_SENSORS_LSM_CHANNELS(IIO_MAGN,
+                       BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
+                       ST_SENSORS_SCAN_X, 1, IIO_MOD_X, 's', IIO_LE, 16, 16,
+                       ST_MAGN_3_OUT_X_L_ADDR),
+       ST_SENSORS_LSM_CHANNELS(IIO_MAGN,
+                       BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
+                       ST_SENSORS_SCAN_Y, 1, IIO_MOD_Y, 's', IIO_LE, 16, 16,
+                       ST_MAGN_3_OUT_Y_L_ADDR),
+       ST_SENSORS_LSM_CHANNELS(IIO_MAGN,
+                       BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
+                       ST_SENSORS_SCAN_Z, 1, IIO_MOD_Z, 's', IIO_LE, 16, 16,
+                       ST_MAGN_3_OUT_Z_L_ADDR),
+       IIO_CHAN_SOFT_TIMESTAMP(3)
+};
+
 static const struct st_sensor_settings st_magn_sensors_settings[] = {
        {
                .wai = 0, /* This sensor has no valid WhoAmI report 0 */
@@ -402,6 +442,48 @@ static const struct st_sensor_settings st_magn_sensors_settings[] = {
                .multi_read_bit = ST_MAGN_2_MULTIREAD_BIT,
                .bootime = 2,
        },
+       {
+               .wai = ST_MAGN_3_WAI_EXP,
+               .wai_addr = ST_MAGN_3_WAI_ADDR,
+               .sensors_supported = {
+                       [0] = LSM303AGR_MAGN_DEV_NAME,
+               },
+               .ch = (struct iio_chan_spec *)st_magn_3_16bit_channels,
+               .odr = {
+                       .addr = ST_MAGN_3_ODR_ADDR,
+                       .mask = ST_MAGN_3_ODR_MASK,
+                       .odr_avl = {
+                               { 10, ST_MAGN_3_ODR_AVL_10HZ_VAL, },
+                               { 20, ST_MAGN_3_ODR_AVL_20HZ_VAL, },
+                               { 50, ST_MAGN_3_ODR_AVL_50HZ_VAL, },
+                               { 100, ST_MAGN_3_ODR_AVL_100HZ_VAL, },
+                       },
+               },
+               .pw = {
+                       .addr = ST_MAGN_3_PW_ADDR,
+                       .mask = ST_MAGN_3_PW_MASK,
+                       .value_on = ST_MAGN_3_PW_ON,
+                       .value_off = ST_MAGN_3_PW_OFF,
+               },
+               .fs = {
+                       .fs_avl = {
+                               [0] = {
+                                       .num = ST_MAGN_FS_AVL_15000MG,
+                                       .gain = ST_MAGN_3_FS_AVL_15000_GAIN,
+                               },
+                       },
+               },
+               .bdu = {
+                       .addr = ST_MAGN_3_BDU_ADDR,
+                       .mask = ST_MAGN_3_BDU_MASK,
+               },
+               .drdy_irq = {
+                       .addr = ST_MAGN_3_DRDY_IRQ_ADDR,
+                       .mask_int1 = ST_MAGN_3_DRDY_INT_MASK,
+               },
+               .multi_read_bit = ST_MAGN_3_MULTIREAD_BIT,
+               .bootime = 2,
+       },
 };
 
 static int st_magn_read_raw(struct iio_dev *indio_dev,
index 28aa80731cea6729e6aed7ebb34204043bc8115c..8aa37af306edd61f83424f77314a922523a8c2f1 100644 (file)
@@ -36,6 +36,10 @@ static const struct of_device_id st_magn_of_match[] = {
                .compatible = "st,lis3mdl-magn",
                .data = LIS3MDL_MAGN_DEV_NAME,
        },
+       {
+               .compatible = "st,lsm303agr-magn",
+               .data = LSM303AGR_MAGN_DEV_NAME,
+       },
        {},
 };
 MODULE_DEVICE_TABLE(of, st_magn_of_match);
@@ -79,6 +83,7 @@ static const struct i2c_device_id st_magn_id_table[] = {
        { LSM303DLHC_MAGN_DEV_NAME },
        { LSM303DLM_MAGN_DEV_NAME },
        { LIS3MDL_MAGN_DEV_NAME },
+       { LSM303AGR_MAGN_DEV_NAME },
        {},
 };
 MODULE_DEVICE_TABLE(i2c, st_magn_id_table);
index 7adacf160146eba9af2e4f9034f064729a8e966d..0abca2c6afa6787c3eff0deb84cbd71864030f61 100644 (file)
@@ -51,6 +51,7 @@ static const struct spi_device_id st_magn_id_table[] = {
        { LSM303DLHC_MAGN_DEV_NAME },
        { LSM303DLM_MAGN_DEV_NAME },
        { LIS3MDL_MAGN_DEV_NAME },
+       { LSM303AGR_MAGN_DEV_NAME },
        {},
 };
 MODULE_DEVICE_TABLE(spi, st_magn_id_table);