All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/2] st_lsm6dsx: add vdd-vddio power regulator
@ 2020-11-17 16:47 Lorenzo Bianconi
  2020-11-17 16:47 ` [PATCH v2 1/2] iio: imu: st_lsm6dsx: add vdd-vddio voltage regulator Lorenzo Bianconi
  2020-11-17 16:47 ` [PATCH v2 2/2] dt-bindings: iio: imu: st_lsm6dsx: introduce vdd-vddio regulators bindings Lorenzo Bianconi
  0 siblings, 2 replies; 7+ messages in thread
From: Lorenzo Bianconi @ 2020-11-17 16:47 UTC (permalink / raw)
  To: jic23; +Cc: lorenzo.bianconi, devicetree, linux-iio

Introduce support to control VDD and VDDIO power lines available on
st_lsm6dsx devices

Changes since v1:
- rebase patch 2/2 ontop of st_lsm6dsx dt yaml conversion

Lorenzo Bianconi (2):
  iio: imu: st_lsm6dsx: add vdd-vddio voltage regulator
  dt-bindings: iio: imu: st_lsm6dsx: introduce vdd-vddio regulators
    bindings

 .../bindings/iio/imu/st,lsm6dsx.yaml          |  6 +++
 drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h       |  3 ++
 drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c  | 42 +++++++++++++++++++
 3 files changed, 51 insertions(+)

-- 
2.26.2


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v2 1/2] iio: imu: st_lsm6dsx: add vdd-vddio voltage regulator
  2020-11-17 16:47 [PATCH v2 0/2] st_lsm6dsx: add vdd-vddio power regulator Lorenzo Bianconi
@ 2020-11-17 16:47 ` Lorenzo Bianconi
  2020-11-21 15:49   ` Jonathan Cameron
  2020-11-17 16:47 ` [PATCH v2 2/2] dt-bindings: iio: imu: st_lsm6dsx: introduce vdd-vddio regulators bindings Lorenzo Bianconi
  1 sibling, 1 reply; 7+ messages in thread
From: Lorenzo Bianconi @ 2020-11-17 16:47 UTC (permalink / raw)
  To: jic23; +Cc: lorenzo.bianconi, devicetree, linux-iio

Like all other ST sensors, st_lsm6dsx devices have VDD and VDDIO power
lines. Introduce voltage regulators to control them.

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
 drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h      |  3 ++
 drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 42 ++++++++++++++++++++
 2 files changed, 45 insertions(+)

diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
index 1f31657a7a0e..4b4ec39d4400 100644
--- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
+++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
@@ -13,6 +13,7 @@
 
 #include <linux/device.h>
 #include <linux/iio/iio.h>
+#include <linux/regulator/consumer.h>
 
 #define ST_LSM6DS3_DEV_NAME	"lsm6ds3"
 #define ST_LSM6DS3H_DEV_NAME	"lsm6ds3h"
@@ -368,6 +369,7 @@ struct st_lsm6dsx_sensor {
  * struct st_lsm6dsx_hw - ST IMU MEMS hw instance
  * @dev: Pointer to instance of struct device (I2C or SPI).
  * @regmap: Register map of the device.
+ * @regulators: VDD/VDDIO voltage regulators.
  * @irq: Device interrupt line (I2C or SPI).
  * @fifo_lock: Mutex to prevent concurrent access to the hw FIFO.
  * @conf_lock: Mutex to prevent concurrent FIFO configuration update.
@@ -390,6 +392,7 @@ struct st_lsm6dsx_sensor {
 struct st_lsm6dsx_hw {
 	struct device *dev;
 	struct regmap *regmap;
+	struct regulator_bulk_data regulators[2];
 	int irq;
 
 	struct mutex fifo_lock;
diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
index 5e584c6026f1..fde46377826c 100644
--- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
+++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
@@ -2533,6 +2533,40 @@ static int st_lsm6dsx_irq_setup(struct st_lsm6dsx_hw *hw)
 	return 0;
 }
 
+static int st_lsm6dsx_init_regulators(struct device *dev)
+{
+	struct st_lsm6dsx_hw *hw = dev_get_drvdata(dev);
+	int err;
+
+	/* vdd-vddio power regulators */
+	hw->regulators[0].supply = "vdd";
+	hw->regulators[1].supply = "vddio";
+	err = devm_regulator_bulk_get(dev, ARRAY_SIZE(hw->regulators),
+				      hw->regulators);
+	if (err) {
+		dev_err(dev, "failed to get regulators: %d\n", err);
+		return err;
+	}
+
+	err = regulator_bulk_enable(ARRAY_SIZE(hw->regulators),
+				    hw->regulators);
+	if (err) {
+		dev_err(dev, "failed to enable regulators: %d\n", err);
+		return err;
+	}
+
+	msleep(50);
+
+	return 0;
+}
+
+static void st_lsm6dsx_chip_uninit(void *data)
+{
+	struct st_lsm6dsx_hw *hw = data;
+
+	regulator_bulk_disable(ARRAY_SIZE(hw->regulators), hw->regulators);
+}
+
 int st_lsm6dsx_probe(struct device *dev, int irq, int hw_id,
 		     struct regmap *regmap)
 {
@@ -2552,6 +2586,14 @@ int st_lsm6dsx_probe(struct device *dev, int irq, int hw_id,
 	mutex_init(&hw->conf_lock);
 	mutex_init(&hw->page_lock);
 
+	err = st_lsm6dsx_init_regulators(dev);
+	if (err)
+		return err;
+
+	err = devm_add_action_or_reset(dev, st_lsm6dsx_chip_uninit, hw);
+	if (err)
+		return err;
+
 	hw->buff = devm_kzalloc(dev, ST_LSM6DSX_BUFF_SIZE, GFP_KERNEL);
 	if (!hw->buff)
 		return -ENOMEM;
-- 
2.26.2


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v2 2/2] dt-bindings: iio: imu: st_lsm6dsx: introduce vdd-vddio regulators bindings
  2020-11-17 16:47 [PATCH v2 0/2] st_lsm6dsx: add vdd-vddio power regulator Lorenzo Bianconi
  2020-11-17 16:47 ` [PATCH v2 1/2] iio: imu: st_lsm6dsx: add vdd-vddio voltage regulator Lorenzo Bianconi
@ 2020-11-17 16:47 ` Lorenzo Bianconi
  1 sibling, 0 replies; 7+ messages in thread
From: Lorenzo Bianconi @ 2020-11-17 16:47 UTC (permalink / raw)
  To: jic23; +Cc: lorenzo.bianconi, devicetree, linux-iio

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
---
 Documentation/devicetree/bindings/iio/imu/st,lsm6dsx.yaml | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/Documentation/devicetree/bindings/iio/imu/st,lsm6dsx.yaml b/Documentation/devicetree/bindings/iio/imu/st,lsm6dsx.yaml
index 49d0687e0c06..fc545a130b30 100644
--- a/Documentation/devicetree/bindings/iio/imu/st,lsm6dsx.yaml
+++ b/Documentation/devicetree/bindings/iio/imu/st,lsm6dsx.yaml
@@ -42,6 +42,12 @@ properties:
 
   spi-max-frequency: true
 
+  vdd-supply:
+    description: if defined provides VDD power to the sensor.
+
+  vddio-supply:
+    description: if defined provides VDD IO power to the sensor.
+
   st,drdy-int-pin:
     $ref: '/schemas/types.yaml#/definitions/uint32'
     description: |
-- 
2.26.2


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 1/2] iio: imu: st_lsm6dsx: add vdd-vddio voltage regulator
  2020-11-17 16:47 ` [PATCH v2 1/2] iio: imu: st_lsm6dsx: add vdd-vddio voltage regulator Lorenzo Bianconi
@ 2020-11-21 15:49   ` Jonathan Cameron
  2020-11-22 10:36     ` Lorenzo Bianconi
  0 siblings, 1 reply; 7+ messages in thread
From: Jonathan Cameron @ 2020-11-21 15:49 UTC (permalink / raw)
  To: Lorenzo Bianconi; +Cc: lorenzo.bianconi, devicetree, linux-iio

On Tue, 17 Nov 2020 17:47:25 +0100
Lorenzo Bianconi <lorenzo@kernel.org> wrote:

> Like all other ST sensors, st_lsm6dsx devices have VDD and VDDIO power
> lines. Introduce voltage regulators to control them.
> 
> Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Oops. I should have pointed out the dev_err_probe more appropriate
to avoid complaining when we just tried to probe to early in the
sequence and will try again later.  I'll hopefully fix this
up an apply once I've picked up my own patch to do the yaml conversion.

Jonathan

> ---
>  drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h      |  3 ++
>  drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 42 ++++++++++++++++++++
>  2 files changed, 45 insertions(+)
> 
> diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
> index 1f31657a7a0e..4b4ec39d4400 100644
> --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
> +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
> @@ -13,6 +13,7 @@
>  
>  #include <linux/device.h>
>  #include <linux/iio/iio.h>
> +#include <linux/regulator/consumer.h>
>  
>  #define ST_LSM6DS3_DEV_NAME	"lsm6ds3"
>  #define ST_LSM6DS3H_DEV_NAME	"lsm6ds3h"
> @@ -368,6 +369,7 @@ struct st_lsm6dsx_sensor {
>   * struct st_lsm6dsx_hw - ST IMU MEMS hw instance
>   * @dev: Pointer to instance of struct device (I2C or SPI).
>   * @regmap: Register map of the device.
> + * @regulators: VDD/VDDIO voltage regulators.
>   * @irq: Device interrupt line (I2C or SPI).
>   * @fifo_lock: Mutex to prevent concurrent access to the hw FIFO.
>   * @conf_lock: Mutex to prevent concurrent FIFO configuration update.
> @@ -390,6 +392,7 @@ struct st_lsm6dsx_sensor {
>  struct st_lsm6dsx_hw {
>  	struct device *dev;
>  	struct regmap *regmap;
> +	struct regulator_bulk_data regulators[2];
>  	int irq;
>  
>  	struct mutex fifo_lock;
> diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> index 5e584c6026f1..fde46377826c 100644
> --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> @@ -2533,6 +2533,40 @@ static int st_lsm6dsx_irq_setup(struct st_lsm6dsx_hw *hw)
>  	return 0;
>  }
>  
> +static int st_lsm6dsx_init_regulators(struct device *dev)
> +{
> +	struct st_lsm6dsx_hw *hw = dev_get_drvdata(dev);
> +	int err;
> +
> +	/* vdd-vddio power regulators */
> +	hw->regulators[0].supply = "vdd";
> +	hw->regulators[1].supply = "vddio";
> +	err = devm_regulator_bulk_get(dev, ARRAY_SIZE(hw->regulators),
> +				      hw->regulators);
> +	if (err) {
> +		dev_err(dev, "failed to get regulators: %d\n", err);
> +		return err;
> +	}
> +
> +	err = regulator_bulk_enable(ARRAY_SIZE(hw->regulators),
> +				    hw->regulators);
> +	if (err) {
> +		dev_err(dev, "failed to enable regulators: %d\n", err);
> +		return err;
> +	}
> +
> +	msleep(50);
> +
> +	return 0;
> +}
> +
> +static void st_lsm6dsx_chip_uninit(void *data)
> +{
> +	struct st_lsm6dsx_hw *hw = data;
> +
> +	regulator_bulk_disable(ARRAY_SIZE(hw->regulators), hw->regulators);
> +}
> +
>  int st_lsm6dsx_probe(struct device *dev, int irq, int hw_id,
>  		     struct regmap *regmap)
>  {
> @@ -2552,6 +2586,14 @@ int st_lsm6dsx_probe(struct device *dev, int irq, int hw_id,
>  	mutex_init(&hw->conf_lock);
>  	mutex_init(&hw->page_lock);
>  
> +	err = st_lsm6dsx_init_regulators(dev);
> +	if (err)
> +		return err;
> +
> +	err = devm_add_action_or_reset(dev, st_lsm6dsx_chip_uninit, hw);
> +	if (err)
> +		return err;
> +
>  	hw->buff = devm_kzalloc(dev, ST_LSM6DSX_BUFF_SIZE, GFP_KERNEL);
>  	if (!hw->buff)
>  		return -ENOMEM;


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 1/2] iio: imu: st_lsm6dsx: add vdd-vddio voltage regulator
  2020-11-21 15:49   ` Jonathan Cameron
@ 2020-11-22 10:36     ` Lorenzo Bianconi
  2020-11-22 19:08       ` Jonathan Cameron
  0 siblings, 1 reply; 7+ messages in thread
From: Lorenzo Bianconi @ 2020-11-22 10:36 UTC (permalink / raw)
  To: Jonathan Cameron; +Cc: lorenzo.bianconi, devicetree, linux-iio

[-- Attachment #1: Type: text/plain, Size: 4002 bytes --]

> On Tue, 17 Nov 2020 17:47:25 +0100
> Lorenzo Bianconi <lorenzo@kernel.org> wrote:
> 
> > Like all other ST sensors, st_lsm6dsx devices have VDD and VDDIO power
> > lines. Introduce voltage regulators to control them.
> > 
> > Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
> Oops. I should have pointed out the dev_err_probe more appropriate
> to avoid complaining when we just tried to probe to early in the
> sequence and will try again later.  I'll hopefully fix this
> up an apply once I've picked up my own patch to do the yaml conversion.
> 

ack, fine for me otherwise I can just send v3. Up to you.

Regards,
Lorenzo

> Jonathan
> 
> > ---
> >  drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h      |  3 ++
> >  drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 42 ++++++++++++++++++++
> >  2 files changed, 45 insertions(+)
> > 
> > diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
> > index 1f31657a7a0e..4b4ec39d4400 100644
> > --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
> > +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
> > @@ -13,6 +13,7 @@
> >  
> >  #include <linux/device.h>
> >  #include <linux/iio/iio.h>
> > +#include <linux/regulator/consumer.h>
> >  
> >  #define ST_LSM6DS3_DEV_NAME	"lsm6ds3"
> >  #define ST_LSM6DS3H_DEV_NAME	"lsm6ds3h"
> > @@ -368,6 +369,7 @@ struct st_lsm6dsx_sensor {
> >   * struct st_lsm6dsx_hw - ST IMU MEMS hw instance
> >   * @dev: Pointer to instance of struct device (I2C or SPI).
> >   * @regmap: Register map of the device.
> > + * @regulators: VDD/VDDIO voltage regulators.
> >   * @irq: Device interrupt line (I2C or SPI).
> >   * @fifo_lock: Mutex to prevent concurrent access to the hw FIFO.
> >   * @conf_lock: Mutex to prevent concurrent FIFO configuration update.
> > @@ -390,6 +392,7 @@ struct st_lsm6dsx_sensor {
> >  struct st_lsm6dsx_hw {
> >  	struct device *dev;
> >  	struct regmap *regmap;
> > +	struct regulator_bulk_data regulators[2];
> >  	int irq;
> >  
> >  	struct mutex fifo_lock;
> > diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> > index 5e584c6026f1..fde46377826c 100644
> > --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> > +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> > @@ -2533,6 +2533,40 @@ static int st_lsm6dsx_irq_setup(struct st_lsm6dsx_hw *hw)
> >  	return 0;
> >  }
> >  
> > +static int st_lsm6dsx_init_regulators(struct device *dev)
> > +{
> > +	struct st_lsm6dsx_hw *hw = dev_get_drvdata(dev);
> > +	int err;
> > +
> > +	/* vdd-vddio power regulators */
> > +	hw->regulators[0].supply = "vdd";
> > +	hw->regulators[1].supply = "vddio";
> > +	err = devm_regulator_bulk_get(dev, ARRAY_SIZE(hw->regulators),
> > +				      hw->regulators);
> > +	if (err) {
> > +		dev_err(dev, "failed to get regulators: %d\n", err);
> > +		return err;
> > +	}
> > +
> > +	err = regulator_bulk_enable(ARRAY_SIZE(hw->regulators),
> > +				    hw->regulators);
> > +	if (err) {
> > +		dev_err(dev, "failed to enable regulators: %d\n", err);
> > +		return err;
> > +	}
> > +
> > +	msleep(50);
> > +
> > +	return 0;
> > +}
> > +
> > +static void st_lsm6dsx_chip_uninit(void *data)
> > +{
> > +	struct st_lsm6dsx_hw *hw = data;
> > +
> > +	regulator_bulk_disable(ARRAY_SIZE(hw->regulators), hw->regulators);
> > +}
> > +
> >  int st_lsm6dsx_probe(struct device *dev, int irq, int hw_id,
> >  		     struct regmap *regmap)
> >  {
> > @@ -2552,6 +2586,14 @@ int st_lsm6dsx_probe(struct device *dev, int irq, int hw_id,
> >  	mutex_init(&hw->conf_lock);
> >  	mutex_init(&hw->page_lock);
> >  
> > +	err = st_lsm6dsx_init_regulators(dev);
> > +	if (err)
> > +		return err;
> > +
> > +	err = devm_add_action_or_reset(dev, st_lsm6dsx_chip_uninit, hw);
> > +	if (err)
> > +		return err;
> > +
> >  	hw->buff = devm_kzalloc(dev, ST_LSM6DSX_BUFF_SIZE, GFP_KERNEL);
> >  	if (!hw->buff)
> >  		return -ENOMEM;
> 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 1/2] iio: imu: st_lsm6dsx: add vdd-vddio voltage regulator
  2020-11-22 10:36     ` Lorenzo Bianconi
@ 2020-11-22 19:08       ` Jonathan Cameron
  2020-11-23  8:51         ` Lorenzo Bianconi
  0 siblings, 1 reply; 7+ messages in thread
From: Jonathan Cameron @ 2020-11-22 19:08 UTC (permalink / raw)
  To: Lorenzo Bianconi; +Cc: lorenzo.bianconi, devicetree, linux-iio

On Sun, 22 Nov 2020 11:36:44 +0100
Lorenzo Bianconi <lorenzo@kernel.org> wrote:

> > On Tue, 17 Nov 2020 17:47:25 +0100
> > Lorenzo Bianconi <lorenzo@kernel.org> wrote:
> >   
> > > Like all other ST sensors, st_lsm6dsx devices have VDD and VDDIO power
> > > lines. Introduce voltage regulators to control them.
> > > 
> > > Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>  
> > Oops. I should have pointed out the dev_err_probe more appropriate
> > to avoid complaining when we just tried to probe to early in the
> > sequence and will try again later.  I'll hopefully fix this
> > up an apply once I've picked up my own patch to do the yaml conversion.
> >   
> 
> ack, fine for me otherwise I can just send v3. Up to you.
I've done it and applied both this and patch 2 to the togreg branch of
iio.git (having earlier applied the binding conversion patch).

Please take a quick look and make sure it all looks right to you.

Thanks,

Jonathan

> 
> Regards,
> Lorenzo
> 
> > Jonathan
> >   
> > > ---
> > >  drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h      |  3 ++
> > >  drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 42 ++++++++++++++++++++
> > >  2 files changed, 45 insertions(+)
> > > 
> > > diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
> > > index 1f31657a7a0e..4b4ec39d4400 100644
> > > --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
> > > +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
> > > @@ -13,6 +13,7 @@
> > >  
> > >  #include <linux/device.h>
> > >  #include <linux/iio/iio.h>
> > > +#include <linux/regulator/consumer.h>
> > >  
> > >  #define ST_LSM6DS3_DEV_NAME	"lsm6ds3"
> > >  #define ST_LSM6DS3H_DEV_NAME	"lsm6ds3h"
> > > @@ -368,6 +369,7 @@ struct st_lsm6dsx_sensor {
> > >   * struct st_lsm6dsx_hw - ST IMU MEMS hw instance
> > >   * @dev: Pointer to instance of struct device (I2C or SPI).
> > >   * @regmap: Register map of the device.
> > > + * @regulators: VDD/VDDIO voltage regulators.
> > >   * @irq: Device interrupt line (I2C or SPI).
> > >   * @fifo_lock: Mutex to prevent concurrent access to the hw FIFO.
> > >   * @conf_lock: Mutex to prevent concurrent FIFO configuration update.
> > > @@ -390,6 +392,7 @@ struct st_lsm6dsx_sensor {
> > >  struct st_lsm6dsx_hw {
> > >  	struct device *dev;
> > >  	struct regmap *regmap;
> > > +	struct regulator_bulk_data regulators[2];
> > >  	int irq;
> > >  
> > >  	struct mutex fifo_lock;
> > > diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> > > index 5e584c6026f1..fde46377826c 100644
> > > --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> > > +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> > > @@ -2533,6 +2533,40 @@ static int st_lsm6dsx_irq_setup(struct st_lsm6dsx_hw *hw)
> > >  	return 0;
> > >  }
> > >  
> > > +static int st_lsm6dsx_init_regulators(struct device *dev)
> > > +{
> > > +	struct st_lsm6dsx_hw *hw = dev_get_drvdata(dev);
> > > +	int err;
> > > +
> > > +	/* vdd-vddio power regulators */
> > > +	hw->regulators[0].supply = "vdd";
> > > +	hw->regulators[1].supply = "vddio";
> > > +	err = devm_regulator_bulk_get(dev, ARRAY_SIZE(hw->regulators),
> > > +				      hw->regulators);
> > > +	if (err) {
> > > +		dev_err(dev, "failed to get regulators: %d\n", err);
> > > +		return err;
> > > +	}
> > > +
> > > +	err = regulator_bulk_enable(ARRAY_SIZE(hw->regulators),
> > > +				    hw->regulators);
> > > +	if (err) {
> > > +		dev_err(dev, "failed to enable regulators: %d\n", err);
> > > +		return err;
> > > +	}
> > > +
> > > +	msleep(50);
> > > +
> > > +	return 0;
> > > +}
> > > +
> > > +static void st_lsm6dsx_chip_uninit(void *data)
> > > +{
> > > +	struct st_lsm6dsx_hw *hw = data;
> > > +
> > > +	regulator_bulk_disable(ARRAY_SIZE(hw->regulators), hw->regulators);
> > > +}
> > > +
> > >  int st_lsm6dsx_probe(struct device *dev, int irq, int hw_id,
> > >  		     struct regmap *regmap)
> > >  {
> > > @@ -2552,6 +2586,14 @@ int st_lsm6dsx_probe(struct device *dev, int irq, int hw_id,
> > >  	mutex_init(&hw->conf_lock);
> > >  	mutex_init(&hw->page_lock);
> > >  
> > > +	err = st_lsm6dsx_init_regulators(dev);
> > > +	if (err)
> > > +		return err;
> > > +
> > > +	err = devm_add_action_or_reset(dev, st_lsm6dsx_chip_uninit, hw);
> > > +	if (err)
> > > +		return err;
> > > +
> > >  	hw->buff = devm_kzalloc(dev, ST_LSM6DSX_BUFF_SIZE, GFP_KERNEL);
> > >  	if (!hw->buff)
> > >  		return -ENOMEM;  
> >   


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 1/2] iio: imu: st_lsm6dsx: add vdd-vddio voltage regulator
  2020-11-22 19:08       ` Jonathan Cameron
@ 2020-11-23  8:51         ` Lorenzo Bianconi
  0 siblings, 0 replies; 7+ messages in thread
From: Lorenzo Bianconi @ 2020-11-23  8:51 UTC (permalink / raw)
  To: Jonathan Cameron; +Cc: lorenzo.bianconi, devicetree, linux-iio

[-- Attachment #1: Type: text/plain, Size: 4872 bytes --]

> On Sun, 22 Nov 2020 11:36:44 +0100
> Lorenzo Bianconi <lorenzo@kernel.org> wrote:
> 
> > > On Tue, 17 Nov 2020 17:47:25 +0100
> > > Lorenzo Bianconi <lorenzo@kernel.org> wrote:
> > >   
> > > > Like all other ST sensors, st_lsm6dsx devices have VDD and VDDIO power
> > > > lines. Introduce voltage regulators to control them.
> > > > 
> > > > Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>  
> > > Oops. I should have pointed out the dev_err_probe more appropriate
> > > to avoid complaining when we just tried to probe to early in the
> > > sequence and will try again later.  I'll hopefully fix this
> > > up an apply once I've picked up my own patch to do the yaml conversion.
> > >   
> > 
> > ack, fine for me otherwise I can just send v3. Up to you.
> I've done it and applied both this and patch 2 to the togreg branch of
> iio.git (having earlier applied the binding conversion patch).
> 
> Please take a quick look and make sure it all looks right to you.

ack, it is fine, thanks Jonathan.

Regards,
Lorenzo

> 
> Thanks,
> 
> Jonathan
> 
> > 
> > Regards,
> > Lorenzo
> > 
> > > Jonathan
> > >   
> > > > ---
> > > >  drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h      |  3 ++
> > > >  drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 42 ++++++++++++++++++++
> > > >  2 files changed, 45 insertions(+)
> > > > 
> > > > diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
> > > > index 1f31657a7a0e..4b4ec39d4400 100644
> > > > --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
> > > > +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h
> > > > @@ -13,6 +13,7 @@
> > > >  
> > > >  #include <linux/device.h>
> > > >  #include <linux/iio/iio.h>
> > > > +#include <linux/regulator/consumer.h>
> > > >  
> > > >  #define ST_LSM6DS3_DEV_NAME	"lsm6ds3"
> > > >  #define ST_LSM6DS3H_DEV_NAME	"lsm6ds3h"
> > > > @@ -368,6 +369,7 @@ struct st_lsm6dsx_sensor {
> > > >   * struct st_lsm6dsx_hw - ST IMU MEMS hw instance
> > > >   * @dev: Pointer to instance of struct device (I2C or SPI).
> > > >   * @regmap: Register map of the device.
> > > > + * @regulators: VDD/VDDIO voltage regulators.
> > > >   * @irq: Device interrupt line (I2C or SPI).
> > > >   * @fifo_lock: Mutex to prevent concurrent access to the hw FIFO.
> > > >   * @conf_lock: Mutex to prevent concurrent FIFO configuration update.
> > > > @@ -390,6 +392,7 @@ struct st_lsm6dsx_sensor {
> > > >  struct st_lsm6dsx_hw {
> > > >  	struct device *dev;
> > > >  	struct regmap *regmap;
> > > > +	struct regulator_bulk_data regulators[2];
> > > >  	int irq;
> > > >  
> > > >  	struct mutex fifo_lock;
> > > > diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> > > > index 5e584c6026f1..fde46377826c 100644
> > > > --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> > > > +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c
> > > > @@ -2533,6 +2533,40 @@ static int st_lsm6dsx_irq_setup(struct st_lsm6dsx_hw *hw)
> > > >  	return 0;
> > > >  }
> > > >  
> > > > +static int st_lsm6dsx_init_regulators(struct device *dev)
> > > > +{
> > > > +	struct st_lsm6dsx_hw *hw = dev_get_drvdata(dev);
> > > > +	int err;
> > > > +
> > > > +	/* vdd-vddio power regulators */
> > > > +	hw->regulators[0].supply = "vdd";
> > > > +	hw->regulators[1].supply = "vddio";
> > > > +	err = devm_regulator_bulk_get(dev, ARRAY_SIZE(hw->regulators),
> > > > +				      hw->regulators);
> > > > +	if (err) {
> > > > +		dev_err(dev, "failed to get regulators: %d\n", err);
> > > > +		return err;
> > > > +	}
> > > > +
> > > > +	err = regulator_bulk_enable(ARRAY_SIZE(hw->regulators),
> > > > +				    hw->regulators);
> > > > +	if (err) {
> > > > +		dev_err(dev, "failed to enable regulators: %d\n", err);
> > > > +		return err;
> > > > +	}
> > > > +
> > > > +	msleep(50);
> > > > +
> > > > +	return 0;
> > > > +}
> > > > +
> > > > +static void st_lsm6dsx_chip_uninit(void *data)
> > > > +{
> > > > +	struct st_lsm6dsx_hw *hw = data;
> > > > +
> > > > +	regulator_bulk_disable(ARRAY_SIZE(hw->regulators), hw->regulators);
> > > > +}
> > > > +
> > > >  int st_lsm6dsx_probe(struct device *dev, int irq, int hw_id,
> > > >  		     struct regmap *regmap)
> > > >  {
> > > > @@ -2552,6 +2586,14 @@ int st_lsm6dsx_probe(struct device *dev, int irq, int hw_id,
> > > >  	mutex_init(&hw->conf_lock);
> > > >  	mutex_init(&hw->page_lock);
> > > >  
> > > > +	err = st_lsm6dsx_init_regulators(dev);
> > > > +	if (err)
> > > > +		return err;
> > > > +
> > > > +	err = devm_add_action_or_reset(dev, st_lsm6dsx_chip_uninit, hw);
> > > > +	if (err)
> > > > +		return err;
> > > > +
> > > >  	hw->buff = devm_kzalloc(dev, ST_LSM6DSX_BUFF_SIZE, GFP_KERNEL);
> > > >  	if (!hw->buff)
> > > >  		return -ENOMEM;  
> > >   
> 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2020-11-23  8:51 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-11-17 16:47 [PATCH v2 0/2] st_lsm6dsx: add vdd-vddio power regulator Lorenzo Bianconi
2020-11-17 16:47 ` [PATCH v2 1/2] iio: imu: st_lsm6dsx: add vdd-vddio voltage regulator Lorenzo Bianconi
2020-11-21 15:49   ` Jonathan Cameron
2020-11-22 10:36     ` Lorenzo Bianconi
2020-11-22 19:08       ` Jonathan Cameron
2020-11-23  8:51         ` Lorenzo Bianconi
2020-11-17 16:47 ` [PATCH v2 2/2] dt-bindings: iio: imu: st_lsm6dsx: introduce vdd-vddio regulators bindings Lorenzo Bianconi

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.