diff mbox series

ASoC: AK4458: add regulator for ak4458

Message ID 1558011640-7864-1-git-send-email-viorel.suman@nxp.com (mailing list archive)
State New, archived
Headers show
Series ASoC: AK4458: add regulator for ak4458 | expand

Commit Message

Viorel Suman May 16, 2019, 1 p.m. UTC
From: Shengjiu Wang <shengjiu.wang@nxp.com>

Add regulator for ak4458.

Signed-off-by: Shengjiu Wang <shengjiu.wang@nxp.com>
Signed-off-by: Viorel Suman <viorel.suman@nxp.com>
---
 sound/soc/codecs/ak4458.c | 27 ++++++++++++++++++++++++++-
 1 file changed, 26 insertions(+), 1 deletion(-)

Comments

Fabio Estevam May 16, 2019, 1:14 p.m. UTC | #1
On Thu, May 16, 2019 at 10:02 AM Viorel Suman <viorel.suman@nxp.com> wrote:

> +       for (i = 0; i < ARRAY_SIZE(ak4458->supplies); i++)
> +               ak4458->supplies[i].supply = ak4458_supply_names[i];
> +
> +       ret = devm_regulator_bulk_get(ak4458->dev, ARRAY_SIZE(ak4458->supplies),
> +                                     ak4458->supplies);
> +       if (ret != 0) {
> +               dev_err(ak4458->dev, "Failed to request supplies: %d\n", ret);
> +               return ret;

This would break existing users that do not pass the regulators in device tree.

Ok, in this case there is no ak4458 user in any dts, so that would not
be an issue.

Please update the dt-bindings with the regulator entries.
Viorel Suman May 16, 2019, 2:11 p.m. UTC | #2
On Jo, 2019-05-16 at 10:14 -0300, Fabio Estevam wrote:
> On Thu, May 16, 2019 at 10:02 AM Viorel Suman <viorel.suman@nxp.com> wrote:
> 
> > 
> > +       for (i = 0; i < ARRAY_SIZE(ak4458->supplies); i++)
> > +               ak4458->supplies[i].supply = ak4458_supply_names[i];
> > +
> > +       ret = devm_regulator_bulk_get(ak4458->dev, ARRAY_SIZE(ak4458->supplies),
> > +                                     ak4458->supplies);
> > +       if (ret != 0) {
> > +               dev_err(ak4458->dev, "Failed to request supplies: %d\n", ret);
> > +               return ret;
> This would break existing users that do not pass the regulators in device tree.
> 
> Ok, in this case there is no ak4458 user in any dts, so that would not
> be an issue.
> 
> Please update the dt-bindings with the regulator entries.

Thanks, will send in V2.

/Viorel
Daniel Baluta May 16, 2019, 2:16 p.m. UTC | #3
On Thu, 2019-05-16 at 13:00 +0000, Viorel Suman wrote:
> From: Shengjiu Wang <shengjiu.wang@nxp.com>
> 
> Add regulator for ak4458.
> 
Hi Viorel,

While at it please disable/enable the regulator in suspend/resume.

thanks,
Daniel.
Mark Brown May 16, 2019, 4:54 p.m. UTC | #4
On Thu, May 16, 2019 at 10:14:42AM -0300, Fabio Estevam wrote:

> > +       ret = devm_regulator_bulk_get(ak4458->dev, ARRAY_SIZE(ak4458->supplies),
> > +                                     ak4458->supplies);
> > +       if (ret != 0) {
> > +               dev_err(ak4458->dev, "Failed to request supplies: %d\n", ret);
> > +               return ret;

> This would break existing users that do not pass the regulators in device tree.

It won't, if you're using regulator_get() and there's just no regulator
in the DT the regulator framework just assumes that there is actually a
regulator there which isn't described in the DT and substitutes in a
dummy regulator for you.
diff mbox series

Patch

diff --git a/sound/soc/codecs/ak4458.c b/sound/soc/codecs/ak4458.c
index 7156215..06dcf13 100644
--- a/sound/soc/codecs/ak4458.c
+++ b/sound/soc/codecs/ak4458.c
@@ -12,6 +12,7 @@ 
 #include <linux/of_device.h>
 #include <linux/of_gpio.h>
 #include <linux/pm_runtime.h>
+#include <linux/regulator/consumer.h>
 #include <linux/slab.h>
 #include <sound/initval.h>
 #include <sound/pcm_params.h>
@@ -21,6 +22,12 @@ 
 
 #include "ak4458.h"
 
+#define AK4458_NUM_SUPPLIES 2
+static const char *ak4458_supply_names[AK4458_NUM_SUPPLIES] = {
+	"DVDD",
+	"AVDD",
+};
+
 struct ak4458_drvdata {
 	struct snd_soc_dai_driver *dai_drv;
 	const struct snd_soc_component_driver *comp_drv;
@@ -37,6 +44,7 @@  struct ak4458_priv {
 	int fmt;
 	int slots;
 	int slot_width;
+	struct regulator_bulk_data supplies[AK4458_NUM_SUPPLIES];
 };
 
 static const struct reg_default ak4458_reg_defaults[] = {
@@ -666,7 +674,7 @@  static int ak4458_i2c_probe(struct i2c_client *i2c)
 {
 	struct ak4458_priv *ak4458;
 	const struct ak4458_drvdata *drvdata;
-	int ret;
+	int ret, i;
 
 	ak4458 = devm_kzalloc(&i2c->dev, sizeof(*ak4458), GFP_KERNEL);
 	if (!ak4458)
@@ -691,6 +699,23 @@  static int ak4458_i2c_probe(struct i2c_client *i2c)
 	if (IS_ERR(ak4458->mute_gpiod))
 		return PTR_ERR(ak4458->mute_gpiod);
 
+	for (i = 0; i < ARRAY_SIZE(ak4458->supplies); i++)
+		ak4458->supplies[i].supply = ak4458_supply_names[i];
+
+	ret = devm_regulator_bulk_get(ak4458->dev, ARRAY_SIZE(ak4458->supplies),
+				      ak4458->supplies);
+	if (ret != 0) {
+		dev_err(ak4458->dev, "Failed to request supplies: %d\n", ret);
+		return ret;
+	}
+
+	ret = regulator_bulk_enable(ARRAY_SIZE(ak4458->supplies),
+				    ak4458->supplies);
+	if (ret != 0) {
+		dev_err(ak4458->dev, "Failed to enable supplies: %d\n", ret);
+		return ret;
+	}
+
 	ret = devm_snd_soc_register_component(ak4458->dev, drvdata->comp_drv,
 					      drvdata->dai_drv, 1);
 	if (ret < 0) {