[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