mirror of
https://github.com/torvalds/linux.git
synced 2024-11-02 18:21:49 +00:00
iio: magnetometer: support for lsm303dlh
The LSM303DLH accelerometer/magnetometer has a different device identification method than using register 0x0f, instead three registers contain a magic value. We rely on WhoAmI to be zero for this variant. Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
This commit is contained in:
parent
5e02bac317
commit
1038a68728
@ -45,6 +45,7 @@ Gyroscopes:
|
||||
- st,lsm330-gyro
|
||||
|
||||
Magnetometers:
|
||||
- st,lsm303dlh-magn
|
||||
- st,lsm303dlhc-magn
|
||||
- st,lsm303dlm-magn
|
||||
- st,lis3mdl-magn
|
||||
|
@ -14,6 +14,7 @@
|
||||
#include <linux/types.h>
|
||||
#include <linux/iio/common/st_sensors.h>
|
||||
|
||||
#define LSM303DLH_MAGN_DEV_NAME "lsm303dlh_magn"
|
||||
#define LSM303DLHC_MAGN_DEV_NAME "lsm303dlhc_magn"
|
||||
#define LSM303DLM_MAGN_DEV_NAME "lsm303dlm_magn"
|
||||
#define LIS3MDL_MAGN_DEV_NAME "lis3mdl"
|
||||
|
@ -45,6 +45,46 @@
|
||||
#define ST_MAGN_FS_AVL_12000MG 12000
|
||||
#define ST_MAGN_FS_AVL_16000MG 16000
|
||||
|
||||
/* CUSTOM VALUES FOR SENSOR 0 */
|
||||
#define ST_MAGN_0_ODR_ADDR 0x00
|
||||
#define ST_MAGN_0_ODR_MASK 0x1c
|
||||
#define ST_MAGN_0_ODR_AVL_1HZ_VAL 0x00
|
||||
#define ST_MAGN_0_ODR_AVL_2HZ_VAL 0x01
|
||||
#define ST_MAGN_0_ODR_AVL_3HZ_VAL 0x02
|
||||
#define ST_MAGN_0_ODR_AVL_8HZ_VAL 0x03
|
||||
#define ST_MAGN_0_ODR_AVL_15HZ_VAL 0x04
|
||||
#define ST_MAGN_0_ODR_AVL_30HZ_VAL 0x05
|
||||
#define ST_MAGN_0_ODR_AVL_75HZ_VAL 0x06
|
||||
#define ST_MAGN_0_ODR_AVL_220HZ_VAL 0x07
|
||||
#define ST_MAGN_0_PW_ADDR 0x02
|
||||
#define ST_MAGN_0_PW_MASK 0x03
|
||||
#define ST_MAGN_0_PW_ON 0x00
|
||||
#define ST_MAGN_0_PW_OFF 0x03
|
||||
#define ST_MAGN_0_FS_ADDR 0x01
|
||||
#define ST_MAGN_0_FS_MASK 0xe0
|
||||
#define ST_MAGN_0_FS_AVL_1300_VAL 0x01
|
||||
#define ST_MAGN_0_FS_AVL_1900_VAL 0x02
|
||||
#define ST_MAGN_0_FS_AVL_2500_VAL 0x03
|
||||
#define ST_MAGN_0_FS_AVL_4000_VAL 0x04
|
||||
#define ST_MAGN_0_FS_AVL_4700_VAL 0x05
|
||||
#define ST_MAGN_0_FS_AVL_5600_VAL 0x06
|
||||
#define ST_MAGN_0_FS_AVL_8100_VAL 0x07
|
||||
#define ST_MAGN_0_FS_AVL_1300_GAIN_XY 1100
|
||||
#define ST_MAGN_0_FS_AVL_1900_GAIN_XY 855
|
||||
#define ST_MAGN_0_FS_AVL_2500_GAIN_XY 670
|
||||
#define ST_MAGN_0_FS_AVL_4000_GAIN_XY 450
|
||||
#define ST_MAGN_0_FS_AVL_4700_GAIN_XY 400
|
||||
#define ST_MAGN_0_FS_AVL_5600_GAIN_XY 330
|
||||
#define ST_MAGN_0_FS_AVL_8100_GAIN_XY 230
|
||||
#define ST_MAGN_0_FS_AVL_1300_GAIN_Z 980
|
||||
#define ST_MAGN_0_FS_AVL_1900_GAIN_Z 760
|
||||
#define ST_MAGN_0_FS_AVL_2500_GAIN_Z 600
|
||||
#define ST_MAGN_0_FS_AVL_4000_GAIN_Z 400
|
||||
#define ST_MAGN_0_FS_AVL_4700_GAIN_Z 355
|
||||
#define ST_MAGN_0_FS_AVL_5600_GAIN_Z 295
|
||||
#define ST_MAGN_0_FS_AVL_8100_GAIN_Z 205
|
||||
#define ST_MAGN_0_MULTIREAD_BIT false
|
||||
|
||||
/* CUSTOM VALUES FOR SENSOR 1 */
|
||||
#define ST_MAGN_1_WAI_EXP 0x3c
|
||||
#define ST_MAGN_1_ODR_ADDR 0x00
|
||||
@ -150,6 +190,82 @@ static const struct iio_chan_spec st_magn_2_16bit_channels[] = {
|
||||
};
|
||||
|
||||
static const struct st_sensor_settings st_magn_sensors_settings[] = {
|
||||
{
|
||||
.wai = 0, /* This sensor has no valid WhoAmI report 0 */
|
||||
.sensors_supported = {
|
||||
[0] = LSM303DLH_MAGN_DEV_NAME,
|
||||
},
|
||||
.ch = (struct iio_chan_spec *)st_magn_16bit_channels,
|
||||
.odr = {
|
||||
.addr = ST_MAGN_0_ODR_ADDR,
|
||||
.mask = ST_MAGN_0_ODR_MASK,
|
||||
.odr_avl = {
|
||||
{ 1, ST_MAGN_0_ODR_AVL_1HZ_VAL, },
|
||||
{ 2, ST_MAGN_0_ODR_AVL_2HZ_VAL, },
|
||||
{ 3, ST_MAGN_0_ODR_AVL_3HZ_VAL, },
|
||||
{ 8, ST_MAGN_0_ODR_AVL_8HZ_VAL, },
|
||||
{ 15, ST_MAGN_0_ODR_AVL_15HZ_VAL, },
|
||||
{ 30, ST_MAGN_0_ODR_AVL_30HZ_VAL, },
|
||||
{ 75, ST_MAGN_0_ODR_AVL_75HZ_VAL, },
|
||||
},
|
||||
},
|
||||
.pw = {
|
||||
.addr = ST_MAGN_0_PW_ADDR,
|
||||
.mask = ST_MAGN_0_PW_MASK,
|
||||
.value_on = ST_MAGN_0_PW_ON,
|
||||
.value_off = ST_MAGN_0_PW_OFF,
|
||||
},
|
||||
.fs = {
|
||||
.addr = ST_MAGN_0_FS_ADDR,
|
||||
.mask = ST_MAGN_0_FS_MASK,
|
||||
.fs_avl = {
|
||||
[0] = {
|
||||
.num = ST_MAGN_FS_AVL_1300MG,
|
||||
.value = ST_MAGN_0_FS_AVL_1300_VAL,
|
||||
.gain = ST_MAGN_0_FS_AVL_1300_GAIN_XY,
|
||||
.gain2 = ST_MAGN_0_FS_AVL_1300_GAIN_Z,
|
||||
},
|
||||
[1] = {
|
||||
.num = ST_MAGN_FS_AVL_1900MG,
|
||||
.value = ST_MAGN_0_FS_AVL_1900_VAL,
|
||||
.gain = ST_MAGN_0_FS_AVL_1900_GAIN_XY,
|
||||
.gain2 = ST_MAGN_0_FS_AVL_1900_GAIN_Z,
|
||||
},
|
||||
[2] = {
|
||||
.num = ST_MAGN_FS_AVL_2500MG,
|
||||
.value = ST_MAGN_0_FS_AVL_2500_VAL,
|
||||
.gain = ST_MAGN_0_FS_AVL_2500_GAIN_XY,
|
||||
.gain2 = ST_MAGN_0_FS_AVL_2500_GAIN_Z,
|
||||
},
|
||||
[3] = {
|
||||
.num = ST_MAGN_FS_AVL_4000MG,
|
||||
.value = ST_MAGN_0_FS_AVL_4000_VAL,
|
||||
.gain = ST_MAGN_0_FS_AVL_4000_GAIN_XY,
|
||||
.gain2 = ST_MAGN_0_FS_AVL_4000_GAIN_Z,
|
||||
},
|
||||
[4] = {
|
||||
.num = ST_MAGN_FS_AVL_4700MG,
|
||||
.value = ST_MAGN_0_FS_AVL_4700_VAL,
|
||||
.gain = ST_MAGN_0_FS_AVL_4700_GAIN_XY,
|
||||
.gain2 = ST_MAGN_0_FS_AVL_4700_GAIN_Z,
|
||||
},
|
||||
[5] = {
|
||||
.num = ST_MAGN_FS_AVL_5600MG,
|
||||
.value = ST_MAGN_0_FS_AVL_5600_VAL,
|
||||
.gain = ST_MAGN_0_FS_AVL_5600_GAIN_XY,
|
||||
.gain2 = ST_MAGN_0_FS_AVL_5600_GAIN_Z,
|
||||
},
|
||||
[6] = {
|
||||
.num = ST_MAGN_FS_AVL_8100MG,
|
||||
.value = ST_MAGN_0_FS_AVL_8100_VAL,
|
||||
.gain = ST_MAGN_0_FS_AVL_8100_GAIN_XY,
|
||||
.gain2 = ST_MAGN_0_FS_AVL_8100_GAIN_Z,
|
||||
},
|
||||
},
|
||||
},
|
||||
.multi_read_bit = ST_MAGN_0_MULTIREAD_BIT,
|
||||
.bootime = 2,
|
||||
},
|
||||
{
|
||||
.wai = ST_MAGN_1_WAI_EXP,
|
||||
.sensors_supported = {
|
||||
|
@ -20,6 +20,10 @@
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static const struct of_device_id st_magn_of_match[] = {
|
||||
{
|
||||
.compatible = "st,lsm303dlh-magn",
|
||||
.data = LSM303DLH_MAGN_DEV_NAME,
|
||||
},
|
||||
{
|
||||
.compatible = "st,lsm303dlhc-magn",
|
||||
.data = LSM303DLHC_MAGN_DEV_NAME,
|
||||
@ -71,6 +75,7 @@ static int st_magn_i2c_remove(struct i2c_client *client)
|
||||
}
|
||||
|
||||
static const struct i2c_device_id st_magn_id_table[] = {
|
||||
{ LSM303DLH_MAGN_DEV_NAME },
|
||||
{ LSM303DLHC_MAGN_DEV_NAME },
|
||||
{ LSM303DLM_MAGN_DEV_NAME },
|
||||
{ LIS3MDL_MAGN_DEV_NAME },
|
||||
|
Loading…
Reference in New Issue
Block a user