iio:st_pressure:initial lps22hh sensor support

Initial support for ST LPS22HH pressure sensor. Datasheet:
http://www2.st.com/resource/en/datasheet/lps22hh.pdf

Features:
 * pressure, temperature data and timestamping channels
 * sampling frequency selection [1..200] Hz
 * interrupt based trigger
 * over I2C or SPI interface

Signed-off-by: mario tesi <mario.tesi@st.com>
Acked-by: Denis Ciocca <denis.ciocca@st.com>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
mario tesi 2019-01-14 18:24:20 +01:00 committed by Jonathan Cameron
parent f6ff49b8a3
commit e5aab7b0d8
5 changed files with 82 additions and 1 deletions

View File

@ -165,7 +165,7 @@ config IIO_ST_PRESS
select IIO_TRIGGERED_BUFFER if (IIO_BUFFER) select IIO_TRIGGERED_BUFFER if (IIO_BUFFER)
help help
Say yes here to build support for STMicroelectronics pressure Say yes here to build support for STMicroelectronics pressure
sensors: LPS001WP, LPS25H, LPS331AP, LPS22HB. sensors: LPS001WP, LPS25H, LPS331AP, LPS22HB, LPS22HH.
This driver can also be built as a module. If so, these modules This driver can also be built as a module. If so, these modules
will be created: will be created:

View File

@ -21,6 +21,7 @@ enum st_press_type {
LPS22HB, LPS22HB,
LPS33HW, LPS33HW,
LPS35HW, LPS35HW,
LPS22HH,
ST_PRESS_MAX, ST_PRESS_MAX,
}; };
@ -30,6 +31,7 @@ enum st_press_type {
#define LPS22HB_PRESS_DEV_NAME "lps22hb" #define LPS22HB_PRESS_DEV_NAME "lps22hb"
#define LPS33HW_PRESS_DEV_NAME "lps33hw" #define LPS33HW_PRESS_DEV_NAME "lps33hw"
#define LPS35HW_PRESS_DEV_NAME "lps35hw" #define LPS35HW_PRESS_DEV_NAME "lps35hw"
#define LPS22HH_PRESS_DEV_NAME "lps22hh"
/** /**
* struct st_sensors_platform_data - default press platform data * struct st_sensors_platform_data - default press platform data

View File

@ -492,6 +492,75 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
.multi_read_bit = false, .multi_read_bit = false,
.bootime = 2, .bootime = 2,
}, },
{
/*
* CUSTOM VALUES FOR LPS22HH SENSOR
* See LPS22HH datasheet:
* http://www2.st.com/resource/en/datasheet/lps22hh.pdf
*/
.wai = 0xb3,
.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
.sensors_supported = {
[0] = LPS22HH_PRESS_DEV_NAME,
},
.ch = (struct iio_chan_spec *)st_press_lps22hb_channels,
.num_ch = ARRAY_SIZE(st_press_lps22hb_channels),
.odr = {
.addr = 0x10,
.mask = 0x70,
.odr_avl = {
{ .hz = 1, .value = 0x01 },
{ .hz = 10, .value = 0x02 },
{ .hz = 25, .value = 0x03 },
{ .hz = 50, .value = 0x04 },
{ .hz = 75, .value = 0x05 },
{ .hz = 100, .value = 0x06 },
{ .hz = 200, .value = 0x07 },
},
},
.pw = {
.addr = 0x10,
.mask = 0x70,
.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
},
.fs = {
.fs_avl = {
/*
* Pressure and temperature sensitivity values
* as defined in table 3 of LPS22HH datasheet.
*/
[0] = {
.num = ST_PRESS_FS_AVL_1260MB,
.gain = ST_PRESS_KPASCAL_NANO_SCALE,
.gain2 = ST_PRESS_LPS22HB_LSB_PER_CELSIUS,
},
},
},
.bdu = {
.addr = 0x10,
.mask = BIT(1),
},
.drdy_irq = {
.int1 = {
.addr = 0x12,
.mask = BIT(2),
.addr_od = 0x11,
.mask_od = BIT(5),
},
.addr_ihl = 0x11,
.mask_ihl = BIT(6),
.stat_drdy = {
.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
.mask = 0x03,
},
},
.sim = {
.addr = 0x10,
.value = BIT(0),
},
.multi_read_bit = false,
.bootime = 2,
},
}; };
static int st_press_write_raw(struct iio_dev *indio_dev, static int st_press_write_raw(struct iio_dev *indio_dev,

View File

@ -45,6 +45,10 @@ static const struct of_device_id st_press_of_match[] = {
.compatible = "st,lps35hw", .compatible = "st,lps35hw",
.data = LPS35HW_PRESS_DEV_NAME, .data = LPS35HW_PRESS_DEV_NAME,
}, },
{
.compatible = "st,lps22hh",
.data = LPS22HH_PRESS_DEV_NAME,
},
{}, {},
}; };
MODULE_DEVICE_TABLE(of, st_press_of_match); MODULE_DEVICE_TABLE(of, st_press_of_match);
@ -69,6 +73,7 @@ static const struct i2c_device_id st_press_id_table[] = {
{ LPS22HB_PRESS_DEV_NAME, LPS22HB }, { LPS22HB_PRESS_DEV_NAME, LPS22HB },
{ LPS33HW_PRESS_DEV_NAME, LPS33HW }, { LPS33HW_PRESS_DEV_NAME, LPS33HW },
{ LPS35HW_PRESS_DEV_NAME, LPS35HW }, { LPS35HW_PRESS_DEV_NAME, LPS35HW },
{ LPS22HH_PRESS_DEV_NAME, LPS22HH },
{}, {},
}; };
MODULE_DEVICE_TABLE(i2c, st_press_id_table); MODULE_DEVICE_TABLE(i2c, st_press_id_table);

View File

@ -49,6 +49,10 @@ static const struct of_device_id st_press_of_match[] = {
.compatible = "st,lps35hw", .compatible = "st,lps35hw",
.data = LPS35HW_PRESS_DEV_NAME, .data = LPS35HW_PRESS_DEV_NAME,
}, },
{
.compatible = "st,lps22hh",
.data = LPS22HH_PRESS_DEV_NAME,
},
{}, {},
}; };
MODULE_DEVICE_TABLE(of, st_press_of_match); MODULE_DEVICE_TABLE(of, st_press_of_match);
@ -93,6 +97,7 @@ static const struct spi_device_id st_press_id_table[] = {
{ LPS22HB_PRESS_DEV_NAME }, { LPS22HB_PRESS_DEV_NAME },
{ LPS33HW_PRESS_DEV_NAME }, { LPS33HW_PRESS_DEV_NAME },
{ LPS35HW_PRESS_DEV_NAME }, { LPS35HW_PRESS_DEV_NAME },
{ LPS22HH_PRESS_DEV_NAME },
{}, {},
}; };
MODULE_DEVICE_TABLE(spi, st_press_id_table); MODULE_DEVICE_TABLE(spi, st_press_id_table);