Hi Quentin,[...]
On Tuesday, 4 February 2025 04:59:12 EST Quentin Schulz wrote:
Hi Detlev,
Just some drive-by comment inline.
On 2/3/25 6:16 PM, Detlev Casanova wrote:
*fmt,+static void dw_hdmi_qp_set_audio_interface(struct dw_hdmi_qp *hdmi,
+ struct hdmi_codec_daifmt
*hparms)+ struct hdmi_codec_params
PKTSCHED_AUDI_TX_EN,+{
+ u32 conf0 = 0;
+
+ /* Reset the audio data path of the AVP */
+ dw_hdmi_qp_write(hdmi, AVP_DATAPATH_PACKET_AUDIO_SWINIT_P,
GLOBAL_SWRESET_REQUEST); +
+ /* Disable AUDS, ACR, AUDI */
+ dw_hdmi_qp_mod(hdmi, 0,
+ PKTSCHED_ACR_TX_EN | PKTSCHED_AUDS_TX_EN |
AUDIO_INTERFACE_CONFIG0);+ PKTSCHED_PKT_EN);
+
+ /* Clear the audio FIFO */
+ dw_hdmi_qp_write(hdmi, AUDIO_FIFO_CLR_P, AUDIO_INTERFACE_CONTROL0);
+
+ /* Select I2S interface as the audio source */
+ dw_hdmi_qp_mod(hdmi, AUD_IF_I2S, AUD_IF_SEL_MSK,
AUDIO_INTERFACE_CONFIG0); +
+ /* Enable the active i2s lanes */
+ switch (hparms->channels) {
+ case 7 ... 8:
+ conf0 |= I2S_LINES_EN(3);
+ fallthrough;
+ case 5 ... 6:
+ conf0 |= I2S_LINES_EN(2);
+ fallthrough;
+ case 3 ... 4:
+ conf0 |= I2S_LINES_EN(1);
+ fallthrough;
+ default:
+ conf0 |= I2S_LINES_EN(0);
+ break;
+ }
+
+ dw_hdmi_qp_mod(hdmi, conf0, I2S_LINES_EN_MSK,
AUD_FIFO_INIT_ON_OVF_MSK,+
+ /*
+ * Enable bpcuv generated internally for L-PCM, or received
+ * from stream for NLPCM/HBR.
+ */
+ switch (fmt->bit_fmt) {
+ case SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE:
+ conf0 = (hparms->channels == 8) ? AUD_HBR : AUD_ASP;
+ conf0 |= I2S_BPCUV_RCV_EN;
+ break;
+ default:
+ conf0 = AUD_ASP | I2S_BPCUV_RCV_DIS;
+ break;
+ }
+
+ dw_hdmi_qp_mod(hdmi, conf0, I2S_BPCUV_RCV_MSK | AUD_FORMAT_MSK,
+ AUDIO_INTERFACE_CONFIG0);
+
+ /* Enable audio FIFO auto clear when overflow */
+ dw_hdmi_qp_mod(hdmi, AUD_FIFO_INIT_ON_OVF_EN,
+ AUDIO_INTERFACE_CONFIG0);
This is all very I2S-centric while the HDMI controllers on RK3588 do
have the ability (according to the TRM) to use S/PDIF instead of I2S. I
assume the driver should be able to know which format to use based on
simple-audio-card,format property? Is that correct? Then current support
which doesn't even check for I2S would be fine and not conflict with a
later commit which would add support for S/PDIF? (Essentially asking if
we need another DT property for the HDMI controller node or elsewhere to
specify which mode to run in instead of expecting it to always be I2S).
The hdmi_codec_daifmt::fmt field already has this information, based on the
simple-audio-card,format = "i2s"; field in the device tree.
I could add a condition in dw_hdmi_qp_audio_prepare() to fail with -EINVAL if
the devicetree specifies anything else than "i2s" for now.
I'm not willing to implement support for the SPDIF path for now, mainly
because there's no need for that yet (I2S works well) and the downstream
kernel doesn't implemented it, meaning it hasn't been tested a lot anyway.