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 |
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.
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
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.
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 --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) {