On Mon, Mar 6, 2017 at 12:05 PM, Chen-Yu Tsai <wens@xxxxxxxx> wrote: > On Sun, Mar 5, 2017 at 9:37 PM, Icenowy Zheng <icenowy@xxxxxxxx> wrote: >> The codec in the V3s is similar to the one found on the A31. One key >> difference is the analog path controls are routed through the PRCM >> block. This is supported by the sun8i-codec-analog driver, and tied >> into this codec driver with the audio card's aux_dev. >> >> In addition, the V3s does not have LINEIN, LINEOUT, MBIAS and MIC2, >> MIC3, and the FIFO related registers are like H3. >> >> Signed-off-by: Icenowy Zheng <icenowy@xxxxxxxx> >> --- >> .../devicetree/bindings/sound/sun4i-codec.txt | 11 ++-- >> sound/soc/sunxi/sun4i-codec.c | 59 ++++++++++++++++++++++ >> 2 files changed, 66 insertions(+), 4 deletions(-) >> >> diff --git a/Documentation/devicetree/bindings/sound/sun4i-codec.txt b/Documentation/devicetree/bindings/sound/sun4i-codec.txt >> index 3863531d1e6d..2d4e10deb6f4 100644 >> --- a/Documentation/devicetree/bindings/sound/sun4i-codec.txt >> +++ b/Documentation/devicetree/bindings/sound/sun4i-codec.txt >> @@ -7,6 +7,7 @@ Required properties: >> - "allwinner,sun7i-a20-codec" >> - "allwinner,sun8i-a23-codec" >> - "allwinner,sun8i-h3-codec" >> + - "allwinner,sun8i-v3s-codec" >> - reg: must contain the registers location and length >> - interrupts: must contain the codec interrupt >> - dmas: DMA channels for tx and rx dma. See the DMA client binding, >> @@ -25,6 +26,7 @@ Required properties for the following compatibles: >> - "allwinner,sun6i-a31-codec" >> - "allwinner,sun8i-a23-codec" >> - "allwinner,sun8i-h3-codec" >> + - "allwinner,sun8i-v3s-codec" >> - resets: phandle to the reset control for this device >> - allwinner,audio-routing: A list of the connections between audio components. >> Each entry is a pair of strings, the first being the >> @@ -34,15 +36,15 @@ Required properties for the following compatibles: >> Audio pins on the SoC: >> "HP" >> "HPCOM" >> - "LINEIN" >> - "LINEOUT" (not on sun8i-a23) >> + "LINEIN" (not on sun8i-v3s) >> + "LINEOUT" (not on sun8i-a23 or sun8i-v3s) >> "MIC1" >> - "MIC2" >> + "MIC2" (not on sun8i-v3s) >> "MIC3" (sun6i-a31 only) >> >> Microphone biases from the SoC: >> "HBIAS" >> - "MBIAS" >> + "MBIAS" (not on sun8i-v3s) >> >> Board connectors: >> "Headphone" >> @@ -55,6 +57,7 @@ Required properties for the following compatibles: >> Required properties for the following compatibles: >> - "allwinner,sun8i-a23-codec" >> - "allwinner,sun8i-h3-codec" >> + - "allwinner,sun8i-v3s-codec" >> - allwinner,codec-analog-controls: A phandle to the codec analog controls >> block in the PRCM. >> >> diff --git a/sound/soc/sunxi/sun4i-codec.c b/sound/soc/sunxi/sun4i-codec.c >> index c3aab10fa085..7f1b1aa95e0b 100644 >> --- a/sound/soc/sunxi/sun4i-codec.c >> +++ b/sound/soc/sunxi/sun4i-codec.c >> @@ -1339,6 +1339,44 @@ static struct snd_soc_card *sun8i_h3_codec_create_card(struct device *dev) >> return card; >> }; >> >> +static struct snd_soc_card *sun8i_v3s_codec_create_card(struct device *dev) >> +{ >> + struct snd_soc_card *card; >> + int ret; >> + >> + card = devm_kzalloc(dev, sizeof(*card), GFP_KERNEL); >> + if (!card) >> + return ERR_PTR(-ENOMEM); >> + >> + aux_dev.codec_of_node = of_parse_phandle(dev->of_node, >> + "allwinner,codec-analog-controls", >> + 0); >> + if (!aux_dev.codec_of_node) { >> + dev_err(dev, "Can't find analog controls for codec.\n"); >> + return ERR_PTR(-EINVAL); >> + }; >> + >> + card->dai_link = sun4i_codec_create_link(dev, &card->num_links); >> + if (!card->dai_link) >> + return ERR_PTR(-ENOMEM); >> + >> + card->dev = dev; >> + card->name = "V3s Audio Codec"; >> + card->dapm_widgets = sun6i_codec_card_dapm_widgets; >> + card->num_dapm_widgets = ARRAY_SIZE(sun6i_codec_card_dapm_widgets); >> + card->dapm_routes = sun8i_codec_card_routes; >> + card->num_dapm_routes = ARRAY_SIZE(sun8i_codec_card_routes); >> + card->aux_dev = &aux_dev; >> + card->num_aux_devs = 1; >> + card->fully_routed = true; >> + >> + ret = snd_soc_of_parse_audio_routing(card, "allwinner,audio-routing"); >> + if (ret) >> + dev_warn(dev, "failed to parse audio-routing: %d\n", ret); >> + >> + return card; >> +}; >> + >> static const struct regmap_config sun4i_codec_regmap_config = { >> .reg_bits = 32, >> .reg_stride = 4, >> @@ -1374,6 +1412,13 @@ static const struct regmap_config sun8i_h3_codec_regmap_config = { >> .max_register = SUN8I_H3_CODEC_ADC_DBG, >> }; >> >> +static const struct regmap_config sun8i_v3s_codec_regmap_config = { >> + .reg_bits = 32, >> + .reg_stride = 4, >> + .val_bits = 32, >> + .max_register = SUN6I_CODEC_HMIC_DATA, > > The last defined register for the non digital audio processing parts is > SUN8I_H3_CODEC_ADC_DBG. > > Or if you want you could include everything, which goes up to 0x400. Correction, it goes up to 0x2bc. 0x400 is the register for controlling the analog bits. ChenYu >> +}; >> + >> struct sun4i_codec_quirks { >> const struct regmap_config *regmap_config; >> const struct snd_soc_codec_driver *codec; >> @@ -1422,6 +1467,16 @@ static const struct sun4i_codec_quirks sun8i_a23_codec_quirks = { >> .has_reset = true, >> }; >> >> +static const struct sun4i_codec_quirks sun8i_v3s_codec_quirks = { >> + .regmap_config = &sun8i_v3s_codec_regmap_config, >> + .codec = &sun8i_a23_codec_codec, > > Please leave a note, like the H3, that this should be changed if digital audio > processing is added. > > Regards > ChenYu > >> + .create_card = sun8i_v3s_codec_create_card, >> + .reg_adc_fifoc = REG_FIELD(SUN6I_CODEC_ADC_FIFOC, 0, 31), >> + .reg_dac_txdata = SUN8I_H3_CODEC_DAC_TXDATA, >> + .reg_adc_rxdata = SUN6I_CODEC_ADC_RXDATA, >> + .has_reset = true, >> +}; >> + >> static const struct sun4i_codec_quirks sun8i_h3_codec_quirks = { >> .regmap_config = &sun8i_h3_codec_regmap_config, >> /* >> @@ -1458,6 +1513,10 @@ static const struct of_device_id sun4i_codec_of_match[] = { >> .compatible = "allwinner,sun8i-h3-codec", >> .data = &sun8i_h3_codec_quirks, >> }, >> + { >> + .compatible = "allwinner,sun8i-v3s-codec", >> + .data = &sun8i_v3s_codec_quirks, >> + }, >> {} >> }; >> MODULE_DEVICE_TABLE(of, sun4i_codec_of_match); >> -- >> 2.11.1 >> >> -- >> You received this message because you are subscribed to the Google Groups "linux-sunxi" group. >> To unsubscribe from this group and stop receiving emails from it, send an email to linux-sunxi+unsubscribe@xxxxxxxxxxxxxxxx. >> For more options, visit https://groups.google.com/d/optout. -- 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