diff mbox

[[Xenial,SRU] 1/4] iio:st_pressure:initial lps22hb sensor support

Message ID 20161125043110.7979-2-shrirang.bagul@canonical.com
State New
Headers show

Commit Message

Shrirang Bagul Nov. 25, 2016, 4:31 a.m. UTC
From: Gregor Boirie <gregor.boirie@parrot.com>

BugLink: https://launchpad.net/bugs/1642258

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

Features:
* pressure data and timestamping channels
* sampling frequency selection
* interrupt based trigger
* over I2C or SPI

Signed-off-by: Gregor Boirie <gregor.boirie@parrot.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
(backported from commit e039e2f5b4dab9a90bb5441a154c01a051b1abfa)
Signed-off-by: Shrirang Bagul <shrirang.bagul@canonical.com>
---
 .../devicetree/bindings/iio/st-sensors.txt         |  1 +
 drivers/iio/pressure/Kconfig                       |  2 +-
 drivers/iio/pressure/st_pressure.h                 |  1 +
 drivers/iio/pressure/st_pressure_core.c            | 91 +++++++++++++++++++++-
 drivers/iio/pressure/st_pressure_i2c.c             |  4 +
 drivers/iio/pressure/st_pressure_spi.c             |  1 +
 6 files changed, 95 insertions(+), 5 deletions(-)

Comments

Stefan Bader Nov. 28, 2016, 10:48 a.m. UTC | #1
On 25.11.2016 05:31, Shrirang Bagul wrote:
> From: Gregor Boirie <gregor.boirie@parrot.com>
> 
> BugLink: https://launchpad.net/bugs/1642258
> 
> Initial support for ST LPS22HB pressure sensor. Datasheet:
> http://www2.st.com/resource/en/datasheet/lps22hb.pdf
> 
> Features:
> * pressure data and timestamping channels
> * sampling frequency selection
> * interrupt based trigger
> * over I2C or SPI
> 
> Signed-off-by: Gregor Boirie <gregor.boirie@parrot.com>
> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
> (backported from commit e039e2f5b4dab9a90bb5441a154c01a051b1abfa)
> Signed-off-by: Shrirang Bagul <shrirang.bagul@canonical.com>
> ---
>  .../devicetree/bindings/iio/st-sensors.txt         |  1 +
>  drivers/iio/pressure/Kconfig                       |  2 +-
>  drivers/iio/pressure/st_pressure.h                 |  1 +
>  drivers/iio/pressure/st_pressure_core.c            | 91 +++++++++++++++++++++-
>  drivers/iio/pressure/st_pressure_i2c.c             |  4 +
>  drivers/iio/pressure/st_pressure_spi.c             |  1 +
>  6 files changed, 95 insertions(+), 5 deletions(-)
> 
> diff --git a/Documentation/devicetree/bindings/iio/st-sensors.txt b/Documentation/devicetree/bindings/iio/st-sensors.txt
> index d3ccdb1..b25fe92 100644
> --- a/Documentation/devicetree/bindings/iio/st-sensors.txt
> +++ b/Documentation/devicetree/bindings/iio/st-sensors.txt
> @@ -57,3 +57,4 @@ Pressure sensors:
>  - st,lps001wp-press
>  - st,lps25h-press
>  - st,lps331ap-press
> +- st,lps22hb-press
> diff --git a/drivers/iio/pressure/Kconfig b/drivers/iio/pressure/Kconfig
> index 6f2e7c9..a5fc260 100644
> --- a/drivers/iio/pressure/Kconfig
> +++ b/drivers/iio/pressure/Kconfig
> @@ -101,7 +101,7 @@ config IIO_ST_PRESS
>  	select IIO_TRIGGERED_BUFFER if (IIO_BUFFER)
>  	help
>  	  Say yes here to build support for STMicroelectronics pressure
> -	  sensors: LPS001WP, LPS25H, LPS331AP.
> +	  sensors: LPS001WP, LPS25H, LPS331AP, LPS22HB.
>  
>  	  This driver can also be built as a module. If so, these modules
>  	  will be created:
> diff --git a/drivers/iio/pressure/st_pressure.h b/drivers/iio/pressure/st_pressure.h
> index f5f4149..903a21e 100644
> --- a/drivers/iio/pressure/st_pressure.h
> +++ b/drivers/iio/pressure/st_pressure.h
> @@ -17,6 +17,7 @@
>  #define LPS001WP_PRESS_DEV_NAME		"lps001wp"
>  #define LPS25H_PRESS_DEV_NAME		"lps25h"
>  #define LPS331AP_PRESS_DEV_NAME		"lps331ap"
> +#define LPS22HB_PRESS_DEV_NAME		"lps22hb"
>  
>  /**
>   * struct st_sensors_platform_data - default press platform data
> diff --git a/drivers/iio/pressure/st_pressure_core.c b/drivers/iio/pressure/st_pressure_core.c
> index 5056bd6..ecf3cd4 100644
> --- a/drivers/iio/pressure/st_pressure_core.c
> +++ b/drivers/iio/pressure/st_pressure_core.c
> @@ -109,6 +109,26 @@
>  #define ST_PRESS_LPS25H_OUT_XL_ADDR		0x28
>  #define ST_TEMP_LPS25H_OUT_L_ADDR		0x2b
>  
> +/* CUSTOM VALUES FOR LPS22HB SENSOR */
> +#define ST_PRESS_LPS22HB_WAI_EXP		0xb1
> +#define ST_PRESS_LPS22HB_ODR_ADDR		0x10
> +#define ST_PRESS_LPS22HB_ODR_MASK		0x70
> +#define ST_PRESS_LPS22HB_ODR_AVL_1HZ_VAL	0x01
> +#define ST_PRESS_LPS22HB_ODR_AVL_10HZ_VAL	0x02
> +#define ST_PRESS_LPS22HB_ODR_AVL_25HZ_VAL	0x03
> +#define ST_PRESS_LPS22HB_ODR_AVL_50HZ_VAL	0x04
> +#define ST_PRESS_LPS22HB_ODR_AVL_75HZ_VAL	0x05
> +#define ST_PRESS_LPS22HB_PW_ADDR		0x10
> +#define ST_PRESS_LPS22HB_PW_MASK		0x70
> +#define ST_PRESS_LPS22HB_BDU_ADDR		0x10
> +#define ST_PRESS_LPS22HB_BDU_MASK		0x02
> +#define ST_PRESS_LPS22HB_DRDY_IRQ_ADDR		0x12
> +#define ST_PRESS_LPS22HB_DRDY_IRQ_INT1_MASK	0x04
> +#define ST_PRESS_LPS22HB_DRDY_IRQ_INT2_MASK	0x08
> +#define ST_PRESS_LPS22HB_IHL_IRQ_ADDR		0x12
> +#define ST_PRESS_LPS22HB_IHL_IRQ_MASK		0x80
> +#define ST_PRESS_LPS22HB_MULTIREAD_BIT		true
> +
>  static const struct iio_chan_spec st_press_1_channels[] = {
>  	{
>  		.type = IIO_PRESSURE,
> @@ -181,6 +201,27 @@ static const struct iio_chan_spec st_press_lps001wp_channels[] = {
>  	IIO_CHAN_SOFT_TIMESTAMP(1)
>  };
>  
> +static const struct iio_chan_spec st_press_lps22hb_channels[] = {
> +	{
> +		.type = IIO_PRESSURE,
> +		.channel2 = IIO_NO_MOD,
> +		.address = ST_PRESS_1_OUT_XL_ADDR,
> +		.scan_index = 0,
> +		.scan_type = {
> +			.sign = 'u',
> +			.realbits = 24,
> +			.storagebits = 24,
> +			.endianness = IIO_LE,
> +		},
> +		.info_mask_separate =
> +			BIT(IIO_CHAN_INFO_RAW) |
> +			BIT(IIO_CHAN_INFO_SCALE),
> +		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
> +		.modified = 0,
> +	},
> +	IIO_CHAN_SOFT_TIMESTAMP(1)
> +};
> +
>  static const struct st_sensor_settings st_press_sensors_settings[] = {
>  	{
>  		.wai = ST_PRESS_LPS331AP_WAI_EXP,
> @@ -328,6 +369,49 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
>  		.multi_read_bit = ST_PRESS_LPS25H_MULTIREAD_BIT,
>  		.bootime = 2,
>  	},
> +	{
> +		.wai = ST_PRESS_LPS22HB_WAI_EXP,
> +		.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
> +		.sensors_supported = {
> +			[0] = LPS22HB_PRESS_DEV_NAME,
> +		},
> +		.ch = (struct iio_chan_spec *)st_press_lps22hb_channels,
> +		.num_ch = ARRAY_SIZE(st_press_lps22hb_channels),
> +		.odr = {
> +			.addr = ST_PRESS_LPS22HB_ODR_ADDR,
> +			.mask = ST_PRESS_LPS22HB_ODR_MASK,
> +			.odr_avl = {
> +				{ 1, ST_PRESS_LPS22HB_ODR_AVL_1HZ_VAL, },
> +				{ 10, ST_PRESS_LPS22HB_ODR_AVL_10HZ_VAL, },
> +				{ 25, ST_PRESS_LPS22HB_ODR_AVL_25HZ_VAL, },
> +				{ 50, ST_PRESS_LPS22HB_ODR_AVL_50HZ_VAL, },
> +				{ 75, ST_PRESS_LPS22HB_ODR_AVL_75HZ_VAL, },
> +			},
> +		},
> +		.pw = {
> +			.addr = ST_PRESS_LPS22HB_PW_ADDR,
> +			.mask = ST_PRESS_LPS22HB_PW_MASK,
> +			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
> +		},
> +		.fs = {
> +			.fs_avl = {
> +				[0] = {
> +					.num = ST_PRESS_FS_AVL_1260MB,
> +					.gain = ST_PRESS_KPASCAL_NANO_SCALE,
> +				},
> +			},
> +		},
> +		.bdu = {
> +			.addr = ST_PRESS_LPS22HB_BDU_ADDR,
> +			.mask = ST_PRESS_LPS22HB_BDU_MASK,
> +		},
> +		.drdy_irq = {
> +			.addr = ST_PRESS_LPS22HB_DRDY_IRQ_ADDR,
> +			.mask_int1 = ST_PRESS_LPS22HB_DRDY_IRQ_INT1_MASK,
> +			.mask_int2 = ST_PRESS_LPS22HB_DRDY_IRQ_INT2_MASK,
> +		},
> +		.multi_read_bit = ST_PRESS_LPS22HB_MULTIREAD_BIT,
> +	},
>  };
>  
>  static int st_press_write_raw(struct iio_dev *indio_dev,
> @@ -456,10 +540,9 @@ int st_press_common_probe(struct iio_dev *indio_dev)
>  	indio_dev->channels = press_data->sensor_settings->ch;
>  	indio_dev->num_channels = press_data->sensor_settings->num_ch;
>  
> -	if (press_data->sensor_settings->fs.addr != 0)
> -		press_data->current_fullscale =
> -			(struct st_sensor_fullscale_avl *)
> -				&press_data->sensor_settings->fs.fs_avl[0];
> +	press_data->current_fullscale =
> +		(struct st_sensor_fullscale_avl *)
> +			&press_data->sensor_settings->fs.fs_avl[0];

Most of the rest appears to add code in a way that limits it to a specific hw.
Except here ^ where I am not sure whether this could not have impact on existing
hw using this driver. Was there any testing to check for potential regressions?

-Stefan

>  
>  	press_data->odr = press_data->sensor_settings->odr.odr_avl[0].hz;
>  
> diff --git a/drivers/iio/pressure/st_pressure_i2c.c b/drivers/iio/pressure/st_pressure_i2c.c
> index 8fcf976..ed18701 100644
> --- a/drivers/iio/pressure/st_pressure_i2c.c
> +++ b/drivers/iio/pressure/st_pressure_i2c.c
> @@ -32,6 +32,10 @@ static const struct of_device_id st_press_of_match[] = {
>  		.compatible = "st,lps331ap-press",
>  		.data = LPS331AP_PRESS_DEV_NAME,
>  	},
> +	{
> +		.compatible = "st,lps22hb-press",
> +		.data = LPS22HB_PRESS_DEV_NAME,
> +	},
>  	{},
>  };
>  MODULE_DEVICE_TABLE(of, st_press_of_match);
> diff --git a/drivers/iio/pressure/st_pressure_spi.c b/drivers/iio/pressure/st_pressure_spi.c
> index 40c0692..5505080 100644
> --- a/drivers/iio/pressure/st_pressure_spi.c
> +++ b/drivers/iio/pressure/st_pressure_spi.c
> @@ -50,6 +50,7 @@ static const struct spi_device_id st_press_id_table[] = {
>  	{ LPS001WP_PRESS_DEV_NAME },
>  	{ LPS25H_PRESS_DEV_NAME },
>  	{ LPS331AP_PRESS_DEV_NAME },
> +	{ LPS22HB_PRESS_DEV_NAME },
>  	{},
>  };
>  MODULE_DEVICE_TABLE(spi, st_press_id_table);
>
Shrirang Bagul Nov. 29, 2016, 11:22 a.m. UTC | #2
On Mon, 2016-11-28 at 11:48 +0100, Stefan Bader wrote:
> On 25.11.2016 05:31, Shrirang Bagul wrote:
> > From: Gregor Boirie <gregor.boirie@parrot.com>
> > 
> > BugLink: https://launchpad.net/bugs/1642258
> > 
> > Initial support for ST LPS22HB pressure sensor. Datasheet:
> > http://www2.st.com/resource/en/datasheet/lps22hb.pdf
> > 
> > Features:
> > * pressure data and timestamping channels
> > * sampling frequency selection
> > * interrupt based trigger
> > * over I2C or SPI
> > 
> > Signed-off-by: Gregor Boirie <gregor.boirie@parrot.com>
> > Signed-off-by: Jonathan Cameron <jic23@kernel.org>
> > (backported from commit e039e2f5b4dab9a90bb5441a154c01a051b1abfa)
> > Signed-off-by: Shrirang Bagul <shrirang.bagul@canonical.com>
> > ---
> >  .../devicetree/bindings/iio/st-sensors.txt         |  1 +
> >  drivers/iio/pressure/Kconfig                       |  2 +-
> >  drivers/iio/pressure/st_pressure.h                 |  1 +
> >  drivers/iio/pressure/st_pressure_core.c            | 91
> > +++++++++++++++++++++-
> >  drivers/iio/pressure/st_pressure_i2c.c             |  4 +
> >  drivers/iio/pressure/st_pressure_spi.c             |  1 +
> >  6 files changed, 95 insertions(+), 5 deletions(-)
> > 
> > diff --git a/Documentation/devicetree/bindings/iio/st-sensors.txt
> > b/Documentation/devicetree/bindings/iio/st-sensors.txt
> > index d3ccdb1..b25fe92 100644
> > --- a/Documentation/devicetree/bindings/iio/st-sensors.txt
> > +++ b/Documentation/devicetree/bindings/iio/st-sensors.txt
> > @@ -57,3 +57,4 @@ Pressure sensors:
> >  - st,lps001wp-press
> >  - st,lps25h-press
> >  - st,lps331ap-press
> > +- st,lps22hb-press
> > diff --git a/drivers/iio/pressure/Kconfig b/drivers/iio/pressure/Kconfig
> > index 6f2e7c9..a5fc260 100644
> > --- a/drivers/iio/pressure/Kconfig
> > +++ b/drivers/iio/pressure/Kconfig
> > @@ -101,7 +101,7 @@ config IIO_ST_PRESS
> >  	select IIO_TRIGGERED_BUFFER if (IIO_BUFFER)
> >  	help
> >  	  Say yes here to build support for STMicroelectronics pressure
> > -	  sensors: LPS001WP, LPS25H, LPS331AP.
> > +	  sensors: LPS001WP, LPS25H, LPS331AP, LPS22HB.
> >  
> >  	  This driver can also be built as a module. If so, these modules
> >  	  will be created:
> > diff --git a/drivers/iio/pressure/st_pressure.h
> > b/drivers/iio/pressure/st_pressure.h
> > index f5f4149..903a21e 100644
> > --- a/drivers/iio/pressure/st_pressure.h
> > +++ b/drivers/iio/pressure/st_pressure.h
> > @@ -17,6 +17,7 @@
> >  #define LPS001WP_PRESS_DEV_NAME		"lps001wp"
> >  #define LPS25H_PRESS_DEV_NAME		"lps25h"
> >  #define LPS331AP_PRESS_DEV_NAME		"lps331ap"
> > +#define LPS22HB_PRESS_DEV_NAME		"lps22hb"
> >  
> >  /**
> >   * struct st_sensors_platform_data - default press platform data
> > diff --git a/drivers/iio/pressure/st_pressure_core.c
> > b/drivers/iio/pressure/st_pressure_core.c
> > index 5056bd6..ecf3cd4 100644
> > --- a/drivers/iio/pressure/st_pressure_core.c
> > +++ b/drivers/iio/pressure/st_pressure_core.c
> > @@ -109,6 +109,26 @@
> >  #define ST_PRESS_LPS25H_OUT_XL_ADDR		0x28
> >  #define ST_TEMP_LPS25H_OUT_L_ADDR		0x2b
> >  
> > +/* CUSTOM VALUES FOR LPS22HB SENSOR */
> > +#define ST_PRESS_LPS22HB_WAI_EXP		0xb1
> > +#define ST_PRESS_LPS22HB_ODR_ADDR		0x10
> > +#define ST_PRESS_LPS22HB_ODR_MASK		0x70
> > +#define ST_PRESS_LPS22HB_ODR_AVL_1HZ_VAL	0x01
> > +#define ST_PRESS_LPS22HB_ODR_AVL_10HZ_VAL	0x02
> > +#define ST_PRESS_LPS22HB_ODR_AVL_25HZ_VAL	0x03
> > +#define ST_PRESS_LPS22HB_ODR_AVL_50HZ_VAL	0x04
> > +#define ST_PRESS_LPS22HB_ODR_AVL_75HZ_VAL	0x05
> > +#define ST_PRESS_LPS22HB_PW_ADDR		0x10
> > +#define ST_PRESS_LPS22HB_PW_MASK		0x70
> > +#define ST_PRESS_LPS22HB_BDU_ADDR		0x10
> > +#define ST_PRESS_LPS22HB_BDU_MASK		0x02
> > +#define ST_PRESS_LPS22HB_DRDY_IRQ_ADDR		0x12
> > +#define ST_PRESS_LPS22HB_DRDY_IRQ_INT1_MASK	0x04
> > +#define ST_PRESS_LPS22HB_DRDY_IRQ_INT2_MASK	0x08
> > +#define ST_PRESS_LPS22HB_IHL_IRQ_ADDR		0x12
> > +#define ST_PRESS_LPS22HB_IHL_IRQ_MASK		0x80
> > +#define ST_PRESS_LPS22HB_MULTIREAD_BIT		true
> > +
> >  static const struct iio_chan_spec st_press_1_channels[] = {
> >  	{
> >  		.type = IIO_PRESSURE,
> > @@ -181,6 +201,27 @@ static const struct iio_chan_spec
> > st_press_lps001wp_channels[] = {
> >  	IIO_CHAN_SOFT_TIMESTAMP(1)
> >  };
> >  
> > +static const struct iio_chan_spec st_press_lps22hb_channels[] = {
> > +	{
> > +		.type = IIO_PRESSURE,
> > +		.channel2 = IIO_NO_MOD,
> > +		.address = ST_PRESS_1_OUT_XL_ADDR,
> > +		.scan_index = 0,
> > +		.scan_type = {
> > +			.sign = 'u',
> > +			.realbits = 24,
> > +			.storagebits = 24,
> > +			.endianness = IIO_LE,
> > +		},
> > +		.info_mask_separate =
> > +			BIT(IIO_CHAN_INFO_RAW) |
> > +			BIT(IIO_CHAN_INFO_SCALE),
> > +		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
> > +		.modified = 0,
> > +	},
> > +	IIO_CHAN_SOFT_TIMESTAMP(1)
> > +};
> > +
> >  static const struct st_sensor_settings st_press_sensors_settings[] = {
> >  	{
> >  		.wai = ST_PRESS_LPS331AP_WAI_EXP,
> > @@ -328,6 +369,49 @@ static const struct st_sensor_settings
> > st_press_sensors_settings[] = {
> >  		.multi_read_bit = ST_PRESS_LPS25H_MULTIREAD_BIT,
> >  		.bootime = 2,
> >  	},
> > +	{
> > +		.wai = ST_PRESS_LPS22HB_WAI_EXP,
> > +		.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
> > +		.sensors_supported = {
> > +			[0] = LPS22HB_PRESS_DEV_NAME,
> > +		},
> > +		.ch = (struct iio_chan_spec *)st_press_lps22hb_channels,
> > +		.num_ch = ARRAY_SIZE(st_press_lps22hb_channels),
> > +		.odr = {
> > +			.addr = ST_PRESS_LPS22HB_ODR_ADDR,
> > +			.mask = ST_PRESS_LPS22HB_ODR_MASK,
> > +			.odr_avl = {
> > +				{ 1, ST_PRESS_LPS22HB_ODR_AVL_1HZ_VAL, },
> > +				{ 10, ST_PRESS_LPS22HB_ODR_AVL_10HZ_VAL, },
> > +				{ 25, ST_PRESS_LPS22HB_ODR_AVL_25HZ_VAL, },
> > +				{ 50, ST_PRESS_LPS22HB_ODR_AVL_50HZ_VAL, },
> > +				{ 75, ST_PRESS_LPS22HB_ODR_AVL_75HZ_VAL, },
> > +			},
> > +		},
> > +		.pw = {
> > +			.addr = ST_PRESS_LPS22HB_PW_ADDR,
> > +			.mask = ST_PRESS_LPS22HB_PW_MASK,
> > +			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
> > +		},
> > +		.fs = {
> > +			.fs_avl = {
> > +				[0] = {
> > +					.num = ST_PRESS_FS_AVL_1260MB,
> > +					.gain =
> > ST_PRESS_KPASCAL_NANO_SCALE,
> > +				},
> > +			},
> > +		},
> > +		.bdu = {
> > +			.addr = ST_PRESS_LPS22HB_BDU_ADDR,
> > +			.mask = ST_PRESS_LPS22HB_BDU_MASK,
> > +		},
> > +		.drdy_irq = {
> > +			.addr = ST_PRESS_LPS22HB_DRDY_IRQ_ADDR,
> > +			.mask_int1 = ST_PRESS_LPS22HB_DRDY_IRQ_INT1_MASK,
> > +			.mask_int2 = ST_PRESS_LPS22HB_DRDY_IRQ_INT2_MASK,
> > +		},
> > +		.multi_read_bit = ST_PRESS_LPS22HB_MULTIREAD_BIT,
> > +	},
> >  };
> >  
> >  static int st_press_write_raw(struct iio_dev *indio_dev,
> > @@ -456,10 +540,9 @@ int st_press_common_probe(struct iio_dev *indio_dev)
> >  	indio_dev->channels = press_data->sensor_settings->ch;
> >  	indio_dev->num_channels = press_data->sensor_settings->num_ch;
> >  
> > -	if (press_data->sensor_settings->fs.addr != 0)
> > -		press_data->current_fullscale =
> > -			(struct st_sensor_fullscale_avl *)
> > -				&press_data->sensor_settings->fs.fs_avl[0];
> > +	press_data->current_fullscale =
> > +		(struct st_sensor_fullscale_avl *)
> > +			&press_data->sensor_settings->fs.fs_avl[0];
> 
> Most of the rest appears to add code in a way that limits it to a specific hw.
> Except here ^ where I am not sure whether this could not have impact on
> existing
> hw using this driver. Was there any testing to check for potential
> regressions?
> 
> -Stefan
> 
The change here is initializing the current scaling settings for the sensor hw
to default values. The data structure which holds these values is immutable.
I've checked the code again and don't believe it'll cause any regressions.

I would have preferred to test this for different sensors, however we don't have
the required hardware.

-Shrirang

> >  
> >  	press_data->odr = press_data->sensor_settings->odr.odr_avl[0].hz;
> >  
> > diff --git a/drivers/iio/pressure/st_pressure_i2c.c
> > b/drivers/iio/pressure/st_pressure_i2c.c
> > index 8fcf976..ed18701 100644
> > --- a/drivers/iio/pressure/st_pressure_i2c.c
> > +++ b/drivers/iio/pressure/st_pressure_i2c.c
> > @@ -32,6 +32,10 @@ static const struct of_device_id st_press_of_match[] = {
> >  		.compatible = "st,lps331ap-press",
> >  		.data = LPS331AP_PRESS_DEV_NAME,
> >  	},
> > +	{
> > +		.compatible = "st,lps22hb-press",
> > +		.data = LPS22HB_PRESS_DEV_NAME,
> > +	},
> >  	{},
> >  };
> >  MODULE_DEVICE_TABLE(of, st_press_of_match);
> > diff --git a/drivers/iio/pressure/st_pressure_spi.c
> > b/drivers/iio/pressure/st_pressure_spi.c
> > index 40c0692..5505080 100644
> > --- a/drivers/iio/pressure/st_pressure_spi.c
> > +++ b/drivers/iio/pressure/st_pressure_spi.c
> > @@ -50,6 +50,7 @@ static const struct spi_device_id st_press_id_table[] = {
> >  	{ LPS001WP_PRESS_DEV_NAME },
> >  	{ LPS25H_PRESS_DEV_NAME },
> >  	{ LPS331AP_PRESS_DEV_NAME },
> > +	{ LPS22HB_PRESS_DEV_NAME },
> >  	{},
> >  };
> >  MODULE_DEVICE_TABLE(spi, st_press_id_table);
> > 
> 
>
diff mbox

Patch

diff --git a/Documentation/devicetree/bindings/iio/st-sensors.txt b/Documentation/devicetree/bindings/iio/st-sensors.txt
index d3ccdb1..b25fe92 100644
--- a/Documentation/devicetree/bindings/iio/st-sensors.txt
+++ b/Documentation/devicetree/bindings/iio/st-sensors.txt
@@ -57,3 +57,4 @@  Pressure sensors:
 - st,lps001wp-press
 - st,lps25h-press
 - st,lps331ap-press
+- st,lps22hb-press
diff --git a/drivers/iio/pressure/Kconfig b/drivers/iio/pressure/Kconfig
index 6f2e7c9..a5fc260 100644
--- a/drivers/iio/pressure/Kconfig
+++ b/drivers/iio/pressure/Kconfig
@@ -101,7 +101,7 @@  config IIO_ST_PRESS
 	select IIO_TRIGGERED_BUFFER if (IIO_BUFFER)
 	help
 	  Say yes here to build support for STMicroelectronics pressure
-	  sensors: LPS001WP, LPS25H, LPS331AP.
+	  sensors: LPS001WP, LPS25H, LPS331AP, LPS22HB.
 
 	  This driver can also be built as a module. If so, these modules
 	  will be created:
diff --git a/drivers/iio/pressure/st_pressure.h b/drivers/iio/pressure/st_pressure.h
index f5f4149..903a21e 100644
--- a/drivers/iio/pressure/st_pressure.h
+++ b/drivers/iio/pressure/st_pressure.h
@@ -17,6 +17,7 @@ 
 #define LPS001WP_PRESS_DEV_NAME		"lps001wp"
 #define LPS25H_PRESS_DEV_NAME		"lps25h"
 #define LPS331AP_PRESS_DEV_NAME		"lps331ap"
+#define LPS22HB_PRESS_DEV_NAME		"lps22hb"
 
 /**
  * struct st_sensors_platform_data - default press platform data
diff --git a/drivers/iio/pressure/st_pressure_core.c b/drivers/iio/pressure/st_pressure_core.c
index 5056bd6..ecf3cd4 100644
--- a/drivers/iio/pressure/st_pressure_core.c
+++ b/drivers/iio/pressure/st_pressure_core.c
@@ -109,6 +109,26 @@ 
 #define ST_PRESS_LPS25H_OUT_XL_ADDR		0x28
 #define ST_TEMP_LPS25H_OUT_L_ADDR		0x2b
 
+/* CUSTOM VALUES FOR LPS22HB SENSOR */
+#define ST_PRESS_LPS22HB_WAI_EXP		0xb1
+#define ST_PRESS_LPS22HB_ODR_ADDR		0x10
+#define ST_PRESS_LPS22HB_ODR_MASK		0x70
+#define ST_PRESS_LPS22HB_ODR_AVL_1HZ_VAL	0x01
+#define ST_PRESS_LPS22HB_ODR_AVL_10HZ_VAL	0x02
+#define ST_PRESS_LPS22HB_ODR_AVL_25HZ_VAL	0x03
+#define ST_PRESS_LPS22HB_ODR_AVL_50HZ_VAL	0x04
+#define ST_PRESS_LPS22HB_ODR_AVL_75HZ_VAL	0x05
+#define ST_PRESS_LPS22HB_PW_ADDR		0x10
+#define ST_PRESS_LPS22HB_PW_MASK		0x70
+#define ST_PRESS_LPS22HB_BDU_ADDR		0x10
+#define ST_PRESS_LPS22HB_BDU_MASK		0x02
+#define ST_PRESS_LPS22HB_DRDY_IRQ_ADDR		0x12
+#define ST_PRESS_LPS22HB_DRDY_IRQ_INT1_MASK	0x04
+#define ST_PRESS_LPS22HB_DRDY_IRQ_INT2_MASK	0x08
+#define ST_PRESS_LPS22HB_IHL_IRQ_ADDR		0x12
+#define ST_PRESS_LPS22HB_IHL_IRQ_MASK		0x80
+#define ST_PRESS_LPS22HB_MULTIREAD_BIT		true
+
 static const struct iio_chan_spec st_press_1_channels[] = {
 	{
 		.type = IIO_PRESSURE,
@@ -181,6 +201,27 @@  static const struct iio_chan_spec st_press_lps001wp_channels[] = {
 	IIO_CHAN_SOFT_TIMESTAMP(1)
 };
 
+static const struct iio_chan_spec st_press_lps22hb_channels[] = {
+	{
+		.type = IIO_PRESSURE,
+		.channel2 = IIO_NO_MOD,
+		.address = ST_PRESS_1_OUT_XL_ADDR,
+		.scan_index = 0,
+		.scan_type = {
+			.sign = 'u',
+			.realbits = 24,
+			.storagebits = 24,
+			.endianness = IIO_LE,
+		},
+		.info_mask_separate =
+			BIT(IIO_CHAN_INFO_RAW) |
+			BIT(IIO_CHAN_INFO_SCALE),
+		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
+		.modified = 0,
+	},
+	IIO_CHAN_SOFT_TIMESTAMP(1)
+};
+
 static const struct st_sensor_settings st_press_sensors_settings[] = {
 	{
 		.wai = ST_PRESS_LPS331AP_WAI_EXP,
@@ -328,6 +369,49 @@  static const struct st_sensor_settings st_press_sensors_settings[] = {
 		.multi_read_bit = ST_PRESS_LPS25H_MULTIREAD_BIT,
 		.bootime = 2,
 	},
+	{
+		.wai = ST_PRESS_LPS22HB_WAI_EXP,
+		.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
+		.sensors_supported = {
+			[0] = LPS22HB_PRESS_DEV_NAME,
+		},
+		.ch = (struct iio_chan_spec *)st_press_lps22hb_channels,
+		.num_ch = ARRAY_SIZE(st_press_lps22hb_channels),
+		.odr = {
+			.addr = ST_PRESS_LPS22HB_ODR_ADDR,
+			.mask = ST_PRESS_LPS22HB_ODR_MASK,
+			.odr_avl = {
+				{ 1, ST_PRESS_LPS22HB_ODR_AVL_1HZ_VAL, },
+				{ 10, ST_PRESS_LPS22HB_ODR_AVL_10HZ_VAL, },
+				{ 25, ST_PRESS_LPS22HB_ODR_AVL_25HZ_VAL, },
+				{ 50, ST_PRESS_LPS22HB_ODR_AVL_50HZ_VAL, },
+				{ 75, ST_PRESS_LPS22HB_ODR_AVL_75HZ_VAL, },
+			},
+		},
+		.pw = {
+			.addr = ST_PRESS_LPS22HB_PW_ADDR,
+			.mask = ST_PRESS_LPS22HB_PW_MASK,
+			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
+		},
+		.fs = {
+			.fs_avl = {
+				[0] = {
+					.num = ST_PRESS_FS_AVL_1260MB,
+					.gain = ST_PRESS_KPASCAL_NANO_SCALE,
+				},
+			},
+		},
+		.bdu = {
+			.addr = ST_PRESS_LPS22HB_BDU_ADDR,
+			.mask = ST_PRESS_LPS22HB_BDU_MASK,
+		},
+		.drdy_irq = {
+			.addr = ST_PRESS_LPS22HB_DRDY_IRQ_ADDR,
+			.mask_int1 = ST_PRESS_LPS22HB_DRDY_IRQ_INT1_MASK,
+			.mask_int2 = ST_PRESS_LPS22HB_DRDY_IRQ_INT2_MASK,
+		},
+		.multi_read_bit = ST_PRESS_LPS22HB_MULTIREAD_BIT,
+	},
 };
 
 static int st_press_write_raw(struct iio_dev *indio_dev,
@@ -456,10 +540,9 @@  int st_press_common_probe(struct iio_dev *indio_dev)
 	indio_dev->channels = press_data->sensor_settings->ch;
 	indio_dev->num_channels = press_data->sensor_settings->num_ch;
 
-	if (press_data->sensor_settings->fs.addr != 0)
-		press_data->current_fullscale =
-			(struct st_sensor_fullscale_avl *)
-				&press_data->sensor_settings->fs.fs_avl[0];
+	press_data->current_fullscale =
+		(struct st_sensor_fullscale_avl *)
+			&press_data->sensor_settings->fs.fs_avl[0];
 
 	press_data->odr = press_data->sensor_settings->odr.odr_avl[0].hz;
 
diff --git a/drivers/iio/pressure/st_pressure_i2c.c b/drivers/iio/pressure/st_pressure_i2c.c
index 8fcf976..ed18701 100644
--- a/drivers/iio/pressure/st_pressure_i2c.c
+++ b/drivers/iio/pressure/st_pressure_i2c.c
@@ -32,6 +32,10 @@  static const struct of_device_id st_press_of_match[] = {
 		.compatible = "st,lps331ap-press",
 		.data = LPS331AP_PRESS_DEV_NAME,
 	},
+	{
+		.compatible = "st,lps22hb-press",
+		.data = LPS22HB_PRESS_DEV_NAME,
+	},
 	{},
 };
 MODULE_DEVICE_TABLE(of, st_press_of_match);
diff --git a/drivers/iio/pressure/st_pressure_spi.c b/drivers/iio/pressure/st_pressure_spi.c
index 40c0692..5505080 100644
--- a/drivers/iio/pressure/st_pressure_spi.c
+++ b/drivers/iio/pressure/st_pressure_spi.c
@@ -50,6 +50,7 @@  static const struct spi_device_id st_press_id_table[] = {
 	{ LPS001WP_PRESS_DEV_NAME },
 	{ LPS25H_PRESS_DEV_NAME },
 	{ LPS331AP_PRESS_DEV_NAME },
+	{ LPS22HB_PRESS_DEV_NAME },
 	{},
 };
 MODULE_DEVICE_TABLE(spi, st_press_id_table);