v2: fixed missing description

Add vdd-supply and vddio-supply support. Without this support vdd and vddio
should be set to always-on in device tree

Signed-off-by: Jonathan Albrieux <[email protected]>
---
 drivers/iio/imu/bmi160/bmi160.h      |  2 ++
 drivers/iio/imu/bmi160/bmi160_core.c | 27 ++++++++++++++++++++++++++-
 2 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/drivers/iio/imu/bmi160/bmi160.h b/drivers/iio/imu/bmi160/bmi160.h
index 621f5309d735..923c3b274fde 100644
--- a/drivers/iio/imu/bmi160/bmi160.h
+++ b/drivers/iio/imu/bmi160/bmi160.h
@@ -3,10 +3,12 @@
 #define BMI160_H_
 
 #include <linux/iio/iio.h>
+#include <linux/regulator/consumer.h>
 
 struct bmi160_data {
        struct regmap *regmap;
        struct iio_trigger *trig;
+       struct regulator_bulk_data supplies[2];
 };
 
 extern const struct regmap_config bmi160_regmap_config;
diff --git a/drivers/iio/imu/bmi160/bmi160_core.c 
b/drivers/iio/imu/bmi160/bmi160_core.c
index 6af65d6f1d28..9bbe0d8e6720 100644
--- a/drivers/iio/imu/bmi160/bmi160_core.c
+++ b/drivers/iio/imu/bmi160/bmi160_core.c
@@ -15,6 +15,7 @@
 #include <linux/delay.h>
 #include <linux/irq.h>
 #include <linux/of_irq.h>
+#include <linux/regulator/consumer.h>
 
 #include <linux/iio/iio.h>
 #include <linux/iio/triggered_buffer.h>
@@ -709,6 +710,12 @@ static int bmi160_chip_init(struct bmi160_data *data, bool 
use_spi)
        unsigned int val;
        struct device *dev = regmap_get_device(data->regmap);
 
+       ret = regulator_bulk_enable(ARRAY_SIZE(data->supplies), data->supplies);
+       if (ret) {
+               dev_err(dev, "Failed to enable regulators: %d\n", ret);
+               return ret;
+       }
+
        ret = regmap_write(data->regmap, BMI160_REG_CMD, BMI160_CMD_SOFTRESET);
        if (ret)
                return ret;
@@ -793,9 +800,17 @@ int bmi160_probe_trigger(struct iio_dev *indio_dev, int 
irq, u32 irq_type)
 static void bmi160_chip_uninit(void *data)
 {
        struct bmi160_data *bmi_data = data;
+       struct device *dev = regmap_get_device(bmi_data->regmap);
+       int ret;
 
        bmi160_set_mode(bmi_data, BMI160_GYRO, false);
        bmi160_set_mode(bmi_data, BMI160_ACCEL, false);
+
+       ret = regulator_bulk_disable(ARRAY_SIZE(bmi_data->supplies),
+                                    bmi_data->supplies);
+       if (ret) {
+               dev_err(dev, "Failed to disable regulators: %d\n", ret);
+       }
 }
 
 int bmi160_core_probe(struct device *dev, struct regmap *regmap,
@@ -815,6 +830,16 @@ int bmi160_core_probe(struct device *dev, struct regmap 
*regmap,
        dev_set_drvdata(dev, indio_dev);
        data->regmap = regmap;
 
+       data->supplies[0].supply = "vdd";
+       data->supplies[1].supply = "vddio";
+       ret = devm_regulator_bulk_get(dev,
+                                     ARRAY_SIZE(data->supplies),
+                                     data->supplies);
+       if (ret) {
+               dev_err(dev, "Failed to get regulators: %d\n", ret);
+               return ret;
+       }
+
        ret = bmi160_chip_init(data, use_spi);
        if (ret)
                return ret;
@@ -853,6 +878,6 @@ int bmi160_core_probe(struct device *dev, struct regmap 
*regmap,
 }
 EXPORT_SYMBOL_GPL(bmi160_core_probe);
 
-MODULE_AUTHOR("Daniel Baluta <[email protected]");
+MODULE_AUTHOR("Daniel Baluta <[email protected]>");
 MODULE_DESCRIPTION("Bosch BMI160 driver");
 MODULE_LICENSE("GPL v2");
-- 
2.17.1

Reply via email to