lkml.org 
[lkml]   [2020]   [Jul]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 67/78] drm/vc4: hdmi: Add audio-related callbacks
    Date
    From: Dave Stevenson <dave.stevenson@raspberrypi.com>

    The audio configuration has changed for the BCM2711, with notably a
    different parent clock and a different channel configuration.

    Make that modular to be able to support the BCM2711.

    Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
    Signed-off-by: Maxime Ripard <maxime@cerno.tech>
    ---
    drivers/gpu/drm/vc4/vc4_hdmi.c | 25 +++++++++++++++++--------
    drivers/gpu/drm/vc4/vc4_hdmi.h | 4 ++++
    2 files changed, 21 insertions(+), 8 deletions(-)

    diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c
    index e1ef0907a827..1b6f51849d6c 100644
    --- a/drivers/gpu/drm/vc4/vc4_hdmi.c
    +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
    @@ -611,10 +611,22 @@ static const struct drm_encoder_helper_funcs vc4_hdmi_encoder_helper_funcs = {
    .enable = vc4_hdmi_encoder_enable,
    };

    +static u32 vc4_hdmi_channel_map(struct vc4_hdmi *vc4_hdmi, u32 channel_mask)
    +{
    + int i;
    + u32 channel_map = 0;
    +
    + for (i = 0; i < 8; i++) {
    + if (channel_mask & BIT(i))
    + channel_map |= i << (3 * i);
    + }
    + return channel_map;
    +}
    +
    /* HDMI audio codec callbacks */
    static void vc4_hdmi_audio_set_mai_clock(struct vc4_hdmi *vc4_hdmi)
    {
    - u32 hsm_clock = clk_get_rate(vc4_hdmi->hsm_clock);
    + u32 hsm_clock = clk_get_rate(vc4_hdmi->audio_clock);
    unsigned long n, m;

    rational_best_approximation(hsm_clock, vc4_hdmi->audio.samplerate,
    @@ -733,7 +745,7 @@ static int vc4_hdmi_audio_hw_params(struct snd_pcm_substream *substream,
    struct vc4_hdmi *vc4_hdmi = dai_to_hdmi(dai);
    struct device *dev = &vc4_hdmi->pdev->dev;
    u32 audio_packet_config, channel_mask;
    - u32 channel_map, i;
    + u32 channel_map;

    if (substream != vc4_hdmi->audio.substream)
    return -EINVAL;
    @@ -785,12 +797,7 @@ static int vc4_hdmi_audio_hw_params(struct snd_pcm_substream *substream,
    VC4_HDMI_MAI_CONFIG_BIT_REVERSE |
    VC4_SET_FIELD(channel_mask, VC4_HDMI_MAI_CHANNEL_MASK));

    - channel_map = 0;
    - for (i = 0; i < 8; i++) {
    - if (channel_mask & BIT(i))
    - channel_map |= i << (3 * i);
    - }
    -
    + channel_map = vc4_hdmi->variant->channel_map(vc4_hdmi, channel_mask);
    HDMI_WRITE(HDMI_MAI_CHANNEL_MAP, channel_map);
    HDMI_WRITE(HDMI_AUDIO_PACKET_CONFIG, audio_packet_config);
    vc4_hdmi_set_n_cts(vc4_hdmi);
    @@ -1343,6 +1350,7 @@ static int vc4_hdmi_init_resources(struct vc4_hdmi *vc4_hdmi)
    DRM_ERROR("Failed to get HDMI state machine clock\n");
    return PTR_ERR(vc4_hdmi->hsm_clock);
    }
    + vc4_hdmi->audio_clock = vc4_hdmi->hsm_clock;

    return 0;
    }
    @@ -1508,6 +1516,7 @@ static const struct vc4_hdmi_variant bcm2835_variant = {
    .phy_disable = vc4_hdmi_phy_disable,
    .phy_rng_enable = vc4_hdmi_phy_rng_enable,
    .phy_rng_disable = vc4_hdmi_phy_rng_disable,
    + .channel_map = vc4_hdmi_channel_map,
    };

    static const struct of_device_id vc4_hdmi_dt_match[] = {
    diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.h b/drivers/gpu/drm/vc4/vc4_hdmi.h
    index 77d47d1707ce..4aea5ee8a91d 100644
    --- a/drivers/gpu/drm/vc4/vc4_hdmi.h
    +++ b/drivers/gpu/drm/vc4/vc4_hdmi.h
    @@ -72,6 +72,9 @@ struct vc4_hdmi_variant {

    /* Callback to disable the RNG in the PHY */
    void (*phy_rng_disable)(struct vc4_hdmi *vc4_hdmi);
    +
    + /* Callback to get channel map */
    + u32 (*channel_map)(struct vc4_hdmi *vc4_hdmi, u32 channel_mask);
    };

    /* HDMI audio information */
    @@ -112,6 +115,7 @@ struct vc4_hdmi {

    struct clk *pixel_clock;
    struct clk *hsm_clock;
    + struct clk *audio_clock;

    struct debugfs_regset32 hdmi_regset;
    struct debugfs_regset32 hd_regset;
    --
    git-series 0.9.1
    \
     
     \ /
      Last update: 2020-07-08 19:45    [W:4.892 / U:0.196 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site