All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dan Robertson <dan@dlrobertson.com>
To: Jonathan Cameron <jic23@kernel.org>,
	linux-iio@vger.kernel.org,
	Peter Meerwald-Stadler <pmeerw@pmeerw.net>
Cc: Andy Shevchenko <andy.shevchenko@gmail.com>,
	devicetree@vger.kernel.org, Hartmut Knaack <knaack.h@gmx.de>,
	Rob Herring <robh+dt@kernel.org>,
	Mark Rutland <mark.rutland@arm.com>,
	linux-kernel@vger.kernel.org,
	Randy Dunlap <rdunlap@infradead.org>,
	Joe Perches <joe@perches.com>,
	Linus Walleij <linus.walleij@linaro.org>,
	Dan Robertson <dan@dlrobertson.com>
Subject: [PATCH v7 3/3] iio: (bma400) basic regulator support
Date: Thu, 19 Dec 2019 04:10:39 +0000	[thread overview]
Message-ID: <20191219041039.23396-4-dan@dlrobertson.com> (raw)
In-Reply-To: <20191219041039.23396-1-dan@dlrobertson.com>

Add support for the VDD and VDDIO regulators using the regulator
framework.

Signed-off-by: Dan Robertson <dan@dlrobertson.com>
---
 drivers/iio/accel/Kconfig       |  1 +
 drivers/iio/accel/bma400_core.c | 49 +++++++++++++++++++++++++++++----
 2 files changed, 45 insertions(+), 5 deletions(-)

diff --git a/drivers/iio/accel/Kconfig b/drivers/iio/accel/Kconfig
index 670e60568033..9cfe9c790190 100644
--- a/drivers/iio/accel/Kconfig
+++ b/drivers/iio/accel/Kconfig
@@ -116,6 +116,7 @@ config BMA400
 	tristate "Bosch BMA400 3-Axis Accelerometer Driver"
 	select REGMAP
 	select BMA400_I2C if I2C
+	select REGULATOR
 	help
 	  Say Y here if you want to build a driver for the Bosch BMA400
 	  triaxial acceleration sensor.
diff --git a/drivers/iio/accel/bma400_core.c b/drivers/iio/accel/bma400_core.c
index b97b8ea7fbb7..dd1edecc46f6 100644
--- a/drivers/iio/accel/bma400_core.c
+++ b/drivers/iio/accel/bma400_core.c
@@ -19,6 +19,7 @@
 #include <linux/module.h>
 #include <linux/mutex.h>
 #include <linux/regmap.h>
+#include <linux/regulator/consumer.h>
 
 #include "bma400.h"
 
@@ -53,6 +54,8 @@ struct bma400_sample_freq {
 struct bma400_data {
 	struct device *dev;
 	struct regmap *regmap;
+	struct regulator *vdd_supply;
+	struct regulator *vddio_supply;
 	struct mutex mutex; /* data register lock */
 	struct iio_mount_matrix orientation;
 	enum bma400_power_mode power_mode;
@@ -574,17 +577,46 @@ static int bma400_init(struct bma400_data *data)
 		goto out;
 	}
 
+	data->vdd_supply = devm_regulator_get(data->dev, "vdd");
+	if (IS_ERR(data->vdd_supply)) {
+		ret = PTR_ERR(data->vdd_supply);
+		if (ret != -EPROBE_DEFER)
+			dev_err(data->dev, "Failed to get VDD regulator %d\n",
+				ret);
+		goto out;
+	}
+	ret = regulator_enable(data->vdd_supply);
+	if (ret) {
+		dev_err(data->dev, "Failed to enable VDD regulator: %d\n", ret);
+		goto err_vdd;
+	}
+
+	data->vddio_supply = devm_regulator_get(data->dev, "vddio");
+	if (IS_ERR(data->vddio_supply)) {
+		ret = PTR_ERR(data->vddio_supply);
+		if (ret != -EPROBE_DEFER)
+			dev_err(data->dev, "Failed to get VDDIO regulator %d\n",
+				ret);
+		goto err_vdd;
+	}
+	ret = regulator_enable(data->vddio_supply);
+	if (ret) {
+		dev_err(data->dev, "Failed to enable VDDIO regulator: %d\n",
+			ret);
+		goto err_vdd;
+	}
+
 	ret = bma400_get_power_mode(data);
 	if (ret < 0) {
 		dev_err(data->dev, "Failed to get the initial power-mode\n");
-		goto out;
+		goto err_vddio;
 	}
 
 	if (data->power_mode != POWER_MODE_NORMAL) {
 		ret = bma400_set_power_mode(data, POWER_MODE_NORMAL);
 		if (ret < 0) {
 			dev_err(data->dev, "Failed to wake up the device\n");
-			goto out;
+			goto err_vddio;
 		}
 		/*
 		 * TODO: The datasheet waits 1500us here in the example, but
@@ -597,15 +629,15 @@ static int bma400_init(struct bma400_data *data)
 
 	ret = bma400_get_accel_output_data_rate(data);
 	if (ret < 0)
-		goto out;
+		goto err_vddio;
 
 	ret = bma400_get_accel_oversampling_ratio(data);
 	if (ret < 0)
-		goto out;
+		goto err_vddio;
 
 	ret = bma400_get_accel_scale(data);
 	if (ret < 0)
-		goto out;
+		goto err_vddio;
 
 	/*
 	 * Once the interrupt engine is supported we might use the
@@ -615,6 +647,10 @@ static int bma400_init(struct bma400_data *data)
 	 */
 	return regmap_write(data->regmap, BMA400_ACC_CONFIG2_REG, 0x00);
 
+err_vddio:
+	regulator_disable(data->vddio_supply);
+err_vdd:
+	regulator_disable(data->vdd_supply);
 out:
 	return ret;
 }
@@ -810,6 +846,9 @@ int bma400_remove(struct device *dev)
 	ret = bma400_set_power_mode(data, POWER_MODE_SLEEP);
 	mutex_unlock(&data->mutex);
 
+	regulator_disable(data->vddio_supply);
+	regulator_disable(data->vdd_supply);
+
 	iio_device_unregister(indio_dev);
 
 	return ret;



  parent reply	other threads:[~2019-12-19  4:28 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-12-19  4:10 [PATCH v7 0/3] iio: add driver for Bosch BMA400 accelerometer Dan Robertson
2019-12-19  4:10 ` [PATCH v7 1/3] dt-bindings: iio: accel: bma400: add bindings Dan Robertson
2019-12-19  8:32   ` Linus Walleij
2019-12-19  4:10 ` [PATCH v7 2/3] iio: (bma400) add driver for the BMA400 Dan Robertson
2019-12-19  4:15   ` Dan Robertson
2019-12-19  8:33   ` Linus Walleij
2019-12-19 11:02   ` Andy Shevchenko
2019-12-20  4:32     ` Dan Robertson
2019-12-20  9:27       ` Andy Shevchenko
2019-12-20  9:32         ` Andy Shevchenko
2019-12-20 15:28           ` Dan Robertson
2019-12-19  4:10 ` Dan Robertson [this message]
2019-12-19  8:35   ` [PATCH v7 3/3] iio: (bma400) basic regulator support Linus Walleij
2019-12-19 11:05   ` Andy Shevchenko
2019-12-19 21:41     ` Linus Walleij
2019-12-20 15:23       ` Dan Robertson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20191219041039.23396-4-dan@dlrobertson.com \
    --to=dan@dlrobertson.com \
    --cc=andy.shevchenko@gmail.com \
    --cc=devicetree@vger.kernel.org \
    --cc=jic23@kernel.org \
    --cc=joe@perches.com \
    --cc=knaack.h@gmx.de \
    --cc=linus.walleij@linaro.org \
    --cc=linux-iio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=pmeerw@pmeerw.net \
    --cc=rdunlap@infradead.org \
    --cc=robh+dt@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.