On Sat, Nov 21, 2015 at 12:30 AM, Maxime Ripard <maxime.ripard@xxxxxxxxxxxxxxxxxx> wrote: > On Fri, Nov 20, 2015 at 02:47:10PM +0100, Hans de Goede wrote: >> Add support for PA gpio pin for controlling an external amplifier as used >> on some Allwinner boards. >> >> Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx> >> --- >> .../devicetree/bindings/sound/sun4i-codec.txt | 3 +++ >> sound/soc/sunxi/sun4i-codec.c | 25 ++++++++++++++-------- >> 2 files changed, 19 insertions(+), 9 deletions(-) >> >> diff --git a/Documentation/devicetree/bindings/sound/sun4i-codec.txt b/Documentation/devicetree/bindings/sound/sun4i-codec.txt >> index c92966b..974babe 100644 >> --- a/Documentation/devicetree/bindings/sound/sun4i-codec.txt >> +++ b/Documentation/devicetree/bindings/sound/sun4i-codec.txt >> @@ -14,6 +14,9 @@ Required properties: >> - "apb": the parent APB clock for this controller >> - "codec": the parent module clock >> >> +Optional properties: >> +- pa-gpios: gpio to enable external amplifier > > This is a custom property, it should be prefixed by the vendor name. > >> + >> Example: >> codec: codec@01c22c00 { >> #sound-dai-cells = <0>; >> diff --git a/sound/soc/sunxi/sun4i-codec.c b/sound/soc/sunxi/sun4i-codec.c >> index bcbf4da..2aca9cd 100644 >> --- a/sound/soc/sunxi/sun4i-codec.c >> +++ b/sound/soc/sunxi/sun4i-codec.c >> @@ -27,6 +27,7 @@ >> #include <linux/of_address.h> >> #include <linux/clk.h> >> #include <linux/regmap.h> >> +#include <linux/gpio/consumer.h> >> >> #include <sound/core.h> >> #include <sound/pcm.h> >> @@ -101,16 +102,15 @@ struct sun4i_codec { >> struct regmap *regmap; >> struct clk *clk_apb; >> struct clk *clk_module; >> + struct gpio_desc *gpio_pa; >> >> struct snd_dmaengine_dai_dma_data playback_dma_data; >> }; >> >> static void sun4i_codec_start_playback(struct sun4i_codec *scodec) >> { >> - /* >> - * FIXME: according to the BSP, we might need to drive a PA >> - * GPIO high here on some boards >> - */ >> + if (scodec->gpio_pa) >> + gpiod_set_value_cansleep(scodec->gpio_pa, 1); >> >> /* Flush TX FIFO */ >> regmap_update_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC, >> @@ -125,15 +125,13 @@ static void sun4i_codec_start_playback(struct sun4i_codec *scodec) >> >> static void sun4i_codec_stop_playback(struct sun4i_codec *scodec) >> { >> - /* >> - * FIXME: according to the BSP, we might need to drive a PA >> - * GPIO low here on some boards >> - */ >> - >> /* Disable DAC DRQ */ >> regmap_update_bits(scodec->regmap, SUN4I_CODEC_DAC_FIFOC, >> BIT(SUN4I_CODEC_DAC_FIFOC_DAC_DRQ_EN), >> 0); >> + >> + if (scodec->gpio_pa) >> + gpiod_set_value_cansleep(scodec->gpio_pa, 0); > > You should rather plug that into DAPM, using a speaker widget, and a > custom event function that will enable or disable the amplifier only > when this audio path is going to be used. Isn't an "amplifier" widget better suited? ChenYu > You can see such an example here: > http://lxr.free-electrons.com/source/sound/soc/jz4740/qi_lb60.c#L29 > > That will require to modify a bit sun4i_codec_create_card as well in > order to add the new widgets (and routes) when the DT property is > found. > > Thanks! > Maxime > > -- > Maxime Ripard, Free Electrons > Embedded Linux, Kernel and Android engineering > http://free-electrons.com -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html