On 12/06/2020 11.59, Peter Ujfalusi wrote:
> The audio support on the board is using pcm3168a codec connected to McASP10
> serializers in parallel setup.
> The pcm3168a SCKI clock is coming via the j721e AUDIO_REFCLK2 pin.
> In order to support 48KHz and 44.1KHz family of sampling rates the parent 
> clock
> for AUDIO_REFCLK2 needs to be changed between PLL4 (for 48KHz) and PLL15 (for
> 44.1KHz). The same PLLs are used for McASP10's AUXCLK clock via different
> HSDIVIDER.
> 
> Generic card can not be used for the board as we need to switch between
> clock paths for different sampling rate families and also need to change
> the slot_width between 16 and 24 bit audio.
> 
> The audio support on the Infotainment Expansion Board consists of McASP0
> connected to two pcm3168a codecs with dedicated set of serializers to each.
> The SCKI for pcm3168a is sourced from j721e AUDIO_REFCLK0 pin.
> It is extending the audio support on the CPB.
> 
> Due to the fact that the same PLL4/15 is used by both domains (CPB/IVI)
> there are cross restriction on sampling rates.
> 
> The IVI side is represented as multicodec setup.
> 
> PCMs available on a plain CPB (no IVI addon):
> hw:0,0 - cpb playback (8 channels)
> hw:0,1 - cpb capture (6 channels)
> 
> When the IVI addon is present, additional two PCMs will be present:
> hw:0,2 - ivi multicodec playback (16 channels)
> hw:0,3 - ivi multicodec capture (12 channels)
> 
> Signed-off-by: Peter Ujfalusi <[email protected]>
> ---
>  sound/soc/ti/Kconfig     |   8 +
>  sound/soc/ti/Makefile    |   2 +
>  sound/soc/ti/j721e-evm.c | 887 +++++++++++++++++++++++++++++++++++++++
>  3 files changed, 897 insertions(+)
>  create mode 100644 sound/soc/ti/j721e-evm.c

> diff --git a/sound/soc/ti/j721e-evm.c b/sound/soc/ti/j721e-evm.c
> new file mode 100644
> index 000000000000..096f045a1120
> --- /dev/null
> +++ b/sound/soc/ti/j721e-evm.c

...

> +static int j721e_get_clocks(struct device *dev,
> +                         struct j721e_audio_clocks *clocks, char *prefix)
> +{
> +     struct clk *parent;
> +     char *clk_name;
> +     int ret;
> +
> +     clocks->target = devm_clk_get(dev, prefix);
> +     if (IS_ERR(clocks->target)) {
> +             ret = PTR_ERR(clocks->target);
> +             if (ret != -EPROBE_DEFER)
> +                     dev_err(dev, "failed to acquire %s': %d\n",

Looks like I have extra "'" in the prints...

> +                             prefix, ret);
> +             return ret;
> +     }
> +
> +     clk_name = kasprintf(GFP_KERNEL, "%s-48000", prefix);
> +     if (clk_name) {
> +             parent = devm_clk_get(dev, clk_name);
> +             kfree(clk_name);
> +             if (IS_ERR(parent)) {
> +                     ret = PTR_ERR(parent);
> +                     if (ret != -EPROBE_DEFER)
> +                             dev_err(dev, "failed to acquire %s': %d\n",
> +                                     prefix, ret);
> +                     return ret;

It should be like this to really not fail with single PLL (from DT), but
it is not documented and supported officially.

if (ret == -EPROBE_DEFER)
        return ret;

dev_dbg(dev, "no 48KHz parent for %s: %d\n", prefix, ret);
parent = NULL;

> +             }
> +             clocks->parent[J721E_CLK_PARENT_48000] = parent;
> +     } else {
> +             return -ENOMEM;
> +     }
> +
> +     clk_name = kasprintf(GFP_KERNEL, "%s-44100", prefix);
> +     if (clk_name) {
> +             parent = devm_clk_get(dev, clk_name);
> +             kfree(clk_name);
> +             if (IS_ERR(parent)) {
> +                     ret = PTR_ERR(parent);
> +                     if (ret != -EPROBE_DEFER)
> +                             dev_err(dev, "failed to acquire %s': %d\n",
> +                                     prefix, ret);
> +                     return ret;

and here

> +             }
> +             clocks->parent[J721E_CLK_PARENT_44100] = parent;
> +     } else {
> +             return -ENOMEM;
> +     }

then:

if (!clocks->parent[J721E_CLK_PARENT_44100] &&
    !clocks->parent[J721E_CLK_PARENT_48000]) {
        dev_err(dev, "At least on parent clock is needed for %s\n",
                prefix);
        return -EINVAL;
}

> +
> +     return 0;
> +}

- Péter

Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

Reply via email to