From: Hugh Cole-Baker <sigmaris@gmail.com>
To: Geraldo Nascimento <geraldogabriel@gmail.com>,
Mark Brown <broonie@kernel.org>
Cc: Neil Armstrong <neil.armstrong@linaro.org>,
ALSA-devel <alsa-devel@alsa-project.org>,
dri-devel <dri-devel@lists.freedesktop.org>
Subject: Re: [RESEND PATCH v2] drm/bridge: dw-hdmi-i2s: set insert_pcuv bit if hardware supports it
Date: Fri, 13 Sep 2024 22:12:39 +0100 [thread overview]
Message-ID: <9b0a0cd8-0994-4235-9823-37f0da1a751d@gmail.com> (raw)
In-Reply-To: <Y01E5MvrnmVhnekO@geday>
Hi Geraldo, and apologies for resurrecting a 2 year old thread...
On 17/10/2022 13:04, Geraldo Nascimento wrote:
> Hi Mark, resending this as it failed to apply in my last submission. Added
> Neil Armstrong to Cc: as hopefully he will be able to better review this.
>
> Thanks,
> Geraldo Nascimento
>
> ---
>
> Starting with version 2.10a of Synopsys DesignWare HDMI controller the
> insert_pcuv bit was introduced. On RK3399pro SoM (Radxa Rock Pi N10),
> for example, if we neglect to set this bit and proceed to enable hdmi_sound
> and i2s2 on the device tree there will be extreme clipping of sound
> output, to the point that music sounds like white noise. Problem
> could also manifest as just mild cracking depending of HDMI audio
> implementation of sink. Setting insert_pcuv bit (bit 2 of
> aud_conf2 Audio Sample register) fixes this.
>
> Signed-off-by: Geraldo Nascimento <geraldogabriel@gmail.com>
I also had the HDMI audio clipping issue described here, on a RK3399. This was
on a 6.1.23 kernel based on the one used by LibreELEC.tv with their out-of-tree
patches for video decoding, 4k HDMI support, etc. When testing this patch I
also updated my kernel tree to 6.10.3, and found that even without this patch,
on 6.10.3 the problem no longer happens.
I added printk to show the value of AUD_CONF2, and found that on 6.1.23, the
value is 0 before the code in this patch sets the insert_pcuv bit. On 6.10.3
the value is 4, i.e. insert_pcuv is already set.
According to the RK3399 TRM, the value-after-reset of the insert_pcuv bit is 1,
so apparently on the 6.1.23 kernel something is clearing the bit after HW reset
but before this driver sets the hw_params, and this patch sets it back to the
correct value. On 6.10.3 the bit is not cleared, i.e. this patch is seemingly
no longer necessary (but is a harmless no-op).
>
> ---
>
> v1->v2: SoC->SoM on description, better commenting, minor style changes,
> conditional application of fix for L-PCM only
>
> --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio-20221017.c
> +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-i2s-audio-20221017.c
> @@ -42,6 +42,7 @@ static int dw_hdmi_i2s_hw_params(struct device *dev, void *data,
> struct dw_hdmi *hdmi = audio->hdmi;
> u8 conf0 = 0;
> u8 conf1 = 0;
> + u8 conf2 = 0;
> u8 inputclkfs = 0;
>
> /* it cares I2S only */
> @@ -101,6 +102,28 @@ static int dw_hdmi_i2s_hw_params(struct device *dev, void *data,
> return -EINVAL;
> }
>
> + /*
> + * dw-hdmi introduced insert_pcuv bit in
> + * version 2.10a.
> + *
> + * This single bit (bit 2 of HDMI_AUD_CONF2)
> + * when set to 1 will enable the insertion of the PCUV
> + * (Parity, Channel Status, User bit and Validity)
> + * bits on the incoming audio stream.
> + *
> + * Support is limited to Linear PCM audio. If
> + * neglected, the lack of valid PCUV bits
> + * on L-PCM streams will cause anything from
> + * mild cracking to full blown extreme
> + * clipping depending on the HDMI audio
> + * implementation of the sink.
> + *
> + */
> +
> + if (hdmi_read(audio, HDMI_DESIGN_ID) >= 0x21 &&
> + !(hparms->iec.status[0] & IEC958_AES0_NONAUDIO))
> + conf2 = HDMI_AUD_CONF2_INSERT_PCUV;
> +
> dw_hdmi_set_sample_rate(hdmi, hparms->sample_rate);
> dw_hdmi_set_channel_status(hdmi, hparms->iec.status);
> dw_hdmi_set_channel_count(hdmi, hparms->channels);
> @@ -109,6 +120,7 @@ static int dw_hdmi_i2s_hw_params(struct device *dev, void *data,
> hdmi_write(audio, inputclkfs, HDMI_AUD_INPUTCLKFS);
> hdmi_write(audio, conf0, HDMI_AUD_CONF0);
> hdmi_write(audio, conf1, HDMI_AUD_CONF1);
> + hdmi_write(audio, conf2, HDMI_AUD_CONF2);
>
> return 0;
> }
> --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-20221017.h
> +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-20221017.h
btw, this patch doesn't apply without edits as these filenames are incorrect.
> @@ -931,6 +931,11 @@ enum {
> HDMI_AUD_CONF1_WIDTH_16 = 0x10,
> HDMI_AUD_CONF1_WIDTH_24 = 0x18,
>
> +/* AUD_CONF2 field values */
> + HDMI_AUD_CONF2_HBR = 0x01,
> + HDMI_AUD_CONF2_NLPCM = 0x02,
> + HDMI_AUD_CONF2_INSERT_PCUV = 0x04,
> +
> /* AUD_CTS3 field values */
> HDMI_AUD_CTS3_N_SHIFT_OFFSET = 5,
> HDMI_AUD_CTS3_N_SHIFT_MASK = 0xe0,
Best regards,
Hugh
next prev parent reply other threads:[~2024-09-19 13:13 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-17 12:04 [RESEND PATCH v2] drm/bridge: dw-hdmi-i2s: set insert_pcuv bit if hardware supports it Geraldo Nascimento
2022-10-31 8:20 ` Neil Armstrong
2022-10-31 21:06 ` Geraldo Nascimento
2024-09-13 21:12 ` Hugh Cole-Baker [this message]
2024-09-13 21:28 ` Geraldo Nascimento
2024-09-14 1:17 ` Geraldo Nascimento
2024-12-30 2:54 ` Geraldo Nascimento
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=9b0a0cd8-0994-4235-9823-37f0da1a751d@gmail.com \
--to=sigmaris@gmail.com \
--cc=alsa-devel@alsa-project.org \
--cc=broonie@kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=geraldogabriel@gmail.com \
--cc=neil.armstrong@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox