[alsa-devel] [PATCH] ASoC: rt5677: Add a configuration option for LDO2_POW pin

Anatol Pomozov anatol.pomozov at gmail.com
Thu Sep 11 17:27:37 CEST 2014


Hi

On Thu, Sep 11, 2014 at 8:08 AM, Anatol Pomozov
<anatol.pomozov at gmail.com> wrote:
> From: Anatol Pomozov <anatol at google.com>
>
> Some boards have this pin tied to board and do not require any configuration,
> some other boards allow to enable chip using GPIO.
>
> Add an option that tells which GPIO is used to power up the codec.
>
> Signed-off-by: Anatol Pomozov <anatol at google.com>
> ---
>  Documentation/devicetree/bindings/sound/rt5677.txt | 41 +++++++++++++++++++++
>  sound/soc/codecs/rt5677.c                          | 42 ++++++++++++++++++++++
>  sound/soc/codecs/rt5677.h                          |  2 ++
>  3 files changed, 85 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/sound/rt5677.txt
>
> diff --git a/Documentation/devicetree/bindings/sound/rt5677.txt b/Documentation/devicetree/bindings/sound/rt5677.txt
> new file mode 100644
> index 0000000..572a42c
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/sound/rt5677.txt
> @@ -0,0 +1,41 @@
> +RT5677 audio CODEC
> +
> +This device supports I2C only.
> +
> +Required properties:
> +
> +- compatible : "realtek,rt5677".
> +
> +- reg : The I2C address of the device.
> +
> +- interrupts : The CODEC's interrupt output.
> +
> +Optional properties:
> +
> +- realtek,pow-ldo2-gpio : The GPIO that controls the CODEC's POW_LDO2 pin.
> +
> +Pins on the device (for linking into audio routes):
> +
> +  * IN1P
> +  * IN1N
> +  * IN2P
> +  * IN2N
> +  * MICBIAS1
> +  * DMIC1
> +  * DMIC2
> +  * DMIC3
> +  * DMIC4
> +  * LOUT1
> +  * LOUT2
> +  * LOUT3
> +
> +Example:
> +
> +rt5677 {
> +       compatible = "realtek,rt5677";
> +       reg = <0x1c>;
> +       interrupt-parent = <&gpio>;
> +       interrupts = <TEGRA_GPIO(W, 3) GPIO_ACTIVE_HIGH>;
> +       realtek,pow-ldo2-gpio =
> +               <&gpio TEGRA_GPIO(V, 3) GPIO_ACTIVE_HIGH>;
> +};
> diff --git a/sound/soc/codecs/rt5677.c b/sound/soc/codecs/rt5677.c
> index 40a49ef..cf41e89 100644
> --- a/sound/soc/codecs/rt5677.c
> +++ b/sound/soc/codecs/rt5677.c
> @@ -15,6 +15,7 @@
>  #include <linux/init.h>
>  #include <linux/delay.h>
>  #include <linux/pm.h>
> +#include <linux/of_gpio.h>
>  #include <linux/regmap.h>
>  #include <linux/i2c.h>
>  #include <linux/platform_device.h>
> @@ -3365,6 +3366,24 @@ static const struct i2c_device_id rt5677_i2c_id[] = {
>  };
>  MODULE_DEVICE_TABLE(i2c, rt5677_i2c_id);
>
> +static int rt5677_parse_dt(struct rt5677_priv *rt5677, struct device_node *np)
> +{
> +       rt5677->pow_ldo2 = of_get_named_gpio(np,
> +                                       "realtek,pow-ldo2-gpio", 0);
> +

I would like to clarify what is the right way to configure codec. I
see that different drivers use different ways to do it.

It looks like using DTS files is preferred way. RT5640 does it. But
for some reason RT5677 uses rt5677_platform_data structure (is it
populated in the platform driver?).

What I suppose to do here? Use DTS to set pow-ldo2-gpio or add a new
field to rt5677_platform_data?

> +       /*
> +        * POW_LDO2 is optional (it may be statically tied on the board).
> +        * -ENOENT means that the property doesn't exist, i.e. there is no
> +        * GPIO, so is not an error. Any other error code means the property
> +        * exists, but could not be parsed.
> +        */
> +       if (!gpio_is_valid(rt5677->pow_ldo2) &&
> +                       (rt5677->pow_ldo2 != -ENOENT))
> +               return rt5677->pow_ldo2;
> +
> +       return 0;
> +}
> +
>  static int rt5677_i2c_probe(struct i2c_client *i2c,
>                     const struct i2c_device_id *id)
>  {
> @@ -3383,6 +3402,29 @@ static int rt5677_i2c_probe(struct i2c_client *i2c,
>         if (pdata)
>                 rt5677->pdata = *pdata;
>
> +       if (i2c->dev.of_node) {
> +               ret = rt5677_parse_dt(rt5677, i2c->dev.of_node);
> +               if (ret) {
> +                       dev_err(&i2c->dev, "Failed to parse device tree: %d\n",
> +                               ret);
> +                       return ret;
> +               }
> +       } else {
> +               rt5677->pow_ldo2 = -EINVAL;
> +       }
> +
> +       if (gpio_is_valid(rt5677->pow_ldo2)) {
> +               ret = devm_gpio_request_one(&i2c->dev, rt5677->pow_ldo2,
> +                                           GPIOF_OUT_INIT_HIGH,
> +                                           "RT5677 POW_LDO2");
> +               if (ret < 0) {
> +                       dev_err(&i2c->dev, "Failed to request POW_LDO2 %d: %d\n",
> +                               rt5677->pow_ldo2, ret);
> +                       return ret;
> +               }
> +               msleep(10);

A question to Realtek people. What delay should be here? The datasheet
is not clear about how much time it is required to get I2C working. I
use 10ms and my board is happy.

> +       }
> +
>         rt5677->regmap = devm_regmap_init_i2c(i2c, &rt5677_regmap);
>         if (IS_ERR(rt5677->regmap)) {
>                 ret = PTR_ERR(rt5677->regmap);
> diff --git a/sound/soc/codecs/rt5677.h b/sound/soc/codecs/rt5677.h
> index 8791ab9..3c1b4dc 100644
> --- a/sound/soc/codecs/rt5677.h
> +++ b/sound/soc/codecs/rt5677.h
> @@ -1441,6 +1441,8 @@ struct rt5677_priv {
>         int pll_src;
>         int pll_in;
>         int pll_out;
> +
> +       int pow_ldo2; /* POW_LDO2 pin */
>  };
>
>  #endif /* __RT5677_H__ */
> --
> 2.1.0.rc2.206.gedb03e5
>
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel at alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel


More information about the Alsa-devel mailing list