2021-11-25 10:12:04

by Nicolas Frattaroli

[permalink] [raw]
Subject: [PATCH 0/2] HDMI Audio on RK356x/Quartz64 Model A

This enables HDMI audio on Quartz64 Model A, and the RK356x SoC in
general. The patches require the VOP2 patchset[1] and my I2S/TDM
controller fix[2] to work.

i2s0 on the RK356x is connected to HDMI, and only has one DMA. I've
confirmed this with the TRM. With [2] the driver now handles this
properly, and does not try to register a capture PCM in this case.

To test this, one needs a video clock, i.e. there is no audio if your
screen is off. I've found that running kmscube momentarily is enough
to make the VOP2 keep the screen turned on indefinitely, which is
a pleasant quirk in this case.

[1]: https://patchwork.kernel.org/project/linux-rockchip/list/?series=581709
[2]: https://patchwork.kernel.org/project/linux-rockchip/patch/[email protected]/

Nicolas Frattaroli (2):
arm64: dts: rockchip: rk356x: Add HDMI audio nodes
arm64: dts: rockchip: Enable HDMI audio on Quartz64 A

.../boot/dts/rockchip/rk3566-quartz64-a.dts | 8 +++++
arch/arm64/boot/dts/rockchip/rk356x.dtsi | 32 +++++++++++++++++++
2 files changed, 40 insertions(+)

--
2.34.0



2021-11-25 10:12:06

by Nicolas Frattaroli

[permalink] [raw]
Subject: [PATCH 1/2] arm64: dts: rockchip: rk356x: Add HDMI audio nodes

This adds the i2s0 node and an hdmi-sound sound device to the
rk356x device tree. On the rk356[68], the i2s0 controller is
connected to HDMI audio.

Signed-off-by: Nicolas Frattaroli <[email protected]>
---
arch/arm64/boot/dts/rockchip/rk356x.dtsi | 32 ++++++++++++++++++++++++
1 file changed, 32 insertions(+)

diff --git a/arch/arm64/boot/dts/rockchip/rk356x.dtsi b/arch/arm64/boot/dts/rockchip/rk356x.dtsi
index 3c09cf6d4c37..ad4053402eef 100644
--- a/arch/arm64/boot/dts/rockchip/rk356x.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk356x.dtsi
@@ -614,6 +614,21 @@ hdmi_in_vp2: endpoint@2 {
};
};

+ hdmi_sound: hdmi-sound {
+ compatible = "simple-audio-card";
+ simple-audio-card,format = "i2s";
+ simple-audio-card,mclk-fs = <256>;
+ simple-audio-card,name = "hdmi-sound";
+ status = "disabled";
+
+ simple-audio-card,cpu {
+ sound-dai = <&i2s0_8ch>;
+ };
+ simple-audio-card,codec {
+ sound-dai = <&hdmi>;
+ };
+ };
+
qos_gpu: qos@fe128000 {
compatible = "rockchip,rk3568-qos", "syscon";
reg = <0x0 0xfe128000 0x0 0x20>;
@@ -789,6 +804,23 @@ spdif: spdif@fe460000 {
status = "disabled";
};

+ i2s0_8ch: i2s@fe400000 {
+ compatible = "rockchip,rk3568-i2s-tdm";
+ reg = <0x0 0xfe400000 0x0 0x1000>;
+ interrupts = <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>;
+ assigned-clocks = <&cru CLK_I2S0_8CH_TX_SRC>, <&cru CLK_I2S0_8CH_RX_SRC>;
+ assigned-clock-rates = <1188000000>, <1188000000>;
+ clocks = <&cru MCLK_I2S0_8CH_TX>, <&cru MCLK_I2S0_8CH_RX>, <&cru HCLK_I2S0_8CH>;
+ clock-names = "mclk_tx", "mclk_rx", "hclk";
+ dmas = <&dmac1 0>;
+ dma-names = "tx";
+ resets = <&cru SRST_M_I2S0_8CH_TX>, <&cru SRST_M_I2S0_8CH_RX>;
+ reset-names = "tx-m", "rx-m";
+ rockchip,grf = <&grf>;
+ #sound-dai-cells = <0>;
+ status = "disabled";
+ };
+
i2s1_8ch: i2s@fe410000 {
compatible = "rockchip,rk3568-i2s-tdm";
reg = <0x0 0xfe410000 0x0 0x1000>;
--
2.34.0


2021-11-25 10:12:11

by Nicolas Frattaroli

[permalink] [raw]
Subject: [PATCH 2/2] arm64: dts: rockchip: Enable HDMI audio on Quartz64 A

This enables the i2s0 controller and the hdmi-sound node on
the PINE64 Quartz64 Model A single-board computer.

Signed-off-by: Nicolas Frattaroli <[email protected]>
---
arch/arm64/boot/dts/rockchip/rk3566-quartz64-a.dts | 8 ++++++++
1 file changed, 8 insertions(+)

diff --git a/arch/arm64/boot/dts/rockchip/rk3566-quartz64-a.dts b/arch/arm64/boot/dts/rockchip/rk3566-quartz64-a.dts
index a4453c82b03d..0598510dce58 100644
--- a/arch/arm64/boot/dts/rockchip/rk3566-quartz64-a.dts
+++ b/arch/arm64/boot/dts/rockchip/rk3566-quartz64-a.dts
@@ -215,6 +215,10 @@ &hdmi_in_vp0 {
status = "okay";
};

+&hdmi_sound {
+ status = "okay";
+};
+
&gpu {
mali-supply = <&vdd_gpu>;
status = "okay";
@@ -444,6 +448,10 @@ regulator-state-mem {
};
};

+&i2s0_8ch {
+ status = "okay";
+};
+
&i2s1_8ch {
pinctrl-names = "default";
pinctrl-0 = <&i2s1m0_sclktx
--
2.34.0


2021-11-25 18:49:17

by Michael Riesch

[permalink] [raw]
Subject: Re: [PATCH 1/2] arm64: dts: rockchip: rk356x: Add HDMI audio nodes

Hello Nicolas,

On 11/25/21 11:08 AM, Nicolas Frattaroli wrote:
> This adds the i2s0 node and an hdmi-sound sound device to the
> rk356x device tree. On the rk356[68], the i2s0 controller is
> connected to HDMI audio.
>
> Signed-off-by: Nicolas Frattaroli <[email protected]>
> ---
> arch/arm64/boot/dts/rockchip/rk356x.dtsi | 32 ++++++++++++++++++++++++
> 1 file changed, 32 insertions(+)
>
> diff --git a/arch/arm64/boot/dts/rockchip/rk356x.dtsi b/arch/arm64/boot/dts/rockchip/rk356x.dtsi
> index 3c09cf6d4c37..ad4053402eef 100644
> --- a/arch/arm64/boot/dts/rockchip/rk356x.dtsi
> +++ b/arch/arm64/boot/dts/rockchip/rk356x.dtsi
> @@ -614,6 +614,21 @@ hdmi_in_vp2: endpoint@2 {
> };
> };
>
> + hdmi_sound: hdmi-sound {
> + compatible = "simple-audio-card";
> + simple-audio-card,format = "i2s";
> + simple-audio-card,mclk-fs = <256>;
> + simple-audio-card,name = "hdmi-sound";
> + status = "disabled";
> +
> + simple-audio-card,cpu {
> + sound-dai = <&i2s0_8ch>;
> + };
> + simple-audio-card,codec {
> + sound-dai = <&hdmi>;
> + };
> + };
> +
> qos_gpu: qos@fe128000 {
> compatible = "rockchip,rk3568-qos", "syscon";
> reg = <0x0 0xfe128000 0x0 0x20>;
> @@ -789,6 +804,23 @@ spdif: spdif@fe460000 {
> status = "disabled";
> };
>
> + i2s0_8ch: i2s@fe400000 {
> + compatible = "rockchip,rk3568-i2s-tdm";
> + reg = <0x0 0xfe400000 0x0 0x1000>;
> + interrupts = <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>;
> + assigned-clocks = <&cru CLK_I2S0_8CH_TX_SRC>, <&cru CLK_I2S0_8CH_RX_SRC>;
> + assigned-clock-rates = <1188000000>, <1188000000>;
> + clocks = <&cru MCLK_I2S0_8CH_TX>, <&cru MCLK_I2S0_8CH_RX>, <&cru HCLK_I2S0_8CH>;
> + clock-names = "mclk_tx", "mclk_rx", "hclk";
> + dmas = <&dmac1 0>;
> + dma-names = "tx";
> + resets = <&cru SRST_M_I2S0_8CH_TX>, <&cru SRST_M_I2S0_8CH_RX>;
> + reset-names = "tx-m", "rx-m";
> + rockchip,grf = <&grf>;
> + #sound-dai-cells = <0>;
> + status = "disabled";
> + };
> +
> i2s1_8ch: i2s@fe410000 {
> compatible = "rockchip,rk3568-i2s-tdm";
> reg = <0x0 0xfe410000 0x0 0x1000>;
>

on a RK3568 EVB1 with corresponding dts changes:

Tested-by: Michael Riesch <[email protected]>

Thanks and best regards,
Michael


2021-11-25 19:09:26

by Johan Jonker

[permalink] [raw]
Subject: Re: [PATCH 1/2] arm64: dts: rockchip: rk356x: Add HDMI audio nodes

Hi Nicolas,

Some comments...

On 11/25/21 11:08 AM, Nicolas Frattaroli wrote:
> This adds the i2s0 node and an hdmi-sound sound device to the
> rk356x device tree. On the rk356[68], the i2s0 controller is
> connected to HDMI audio.
>
> Signed-off-by: Nicolas Frattaroli <[email protected]>
> ---
> arch/arm64/boot/dts/rockchip/rk356x.dtsi | 32 ++++++++++++++++++++++++
> 1 file changed, 32 insertions(+)
>
> diff --git a/arch/arm64/boot/dts/rockchip/rk356x.dtsi b/arch/arm64/boot/dts/rockchip/rk356x.dtsi
> index 3c09cf6d4c37..ad4053402eef 100644
> --- a/arch/arm64/boot/dts/rockchip/rk356x.dtsi
> +++ b/arch/arm64/boot/dts/rockchip/rk356x.dtsi
> @@ -614,6 +614,21 @@ hdmi_in_vp2: endpoint@2 {
> };
> };
>

> + hdmi_sound: hdmi-sound {

Some DT sort rules:

For nodes:
Sort things without reg alphabetical first,
then sort the rest by reg address.

> + compatible = "simple-audio-card";

simple-audio-card,name = "HDMI";

> + simple-audio-card,format = "i2s";
> + simple-audio-card,mclk-fs = <256>;

> + simple-audio-card,name = "hdmi-sound";

Exceptions:
Sort simple-audio-card,name above other simple-audio-card properties.

Shouldn't we standardize to SPDIF, HDMI and Analog similar to rk3318/rk3328?
Make a shorter label without spaces or special chars, so that chars
don't get removed?
See "aplay -l" screen print.

Maybe rename to "HDMI"?

> + status = "disabled";
> +
> + simple-audio-card,cpu {
> + sound-dai = <&i2s0_8ch>;
> + };

Add empty line between nodes.

Not sure if Heiko cares, but when alphabetical sort I get this:
simple-audio-card,codec
simple-audio-card,cpu

> + simple-audio-card,codec {
> + sound-dai = <&hdmi>;
> + };
> + };
> +
> qos_gpu: qos@fe128000 {
> compatible = "rockchip,rk3568-qos", "syscon";
> reg = <0x0 0xfe128000 0x0 0x20>;
> @@ -789,6 +804,23 @@ spdif: spdif@fe460000 {
> status = "disabled";
> };
>
> + i2s0_8ch: i2s@fe400000 {
> + compatible = "rockchip,rk3568-i2s-tdm";
> + reg = <0x0 0xfe400000 0x0 0x1000>;
> + interrupts = <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>;
> + assigned-clocks = <&cru CLK_I2S0_8CH_TX_SRC>, <&cru CLK_I2S0_8CH_RX_SRC>;
> + assigned-clock-rates = <1188000000>, <1188000000>;
> + clocks = <&cru MCLK_I2S0_8CH_TX>, <&cru MCLK_I2S0_8CH_RX>, <&cru HCLK_I2S0_8CH>;
> + clock-names = "mclk_tx", "mclk_rx", "hclk";
> + dmas = <&dmac1 0>;
> + dma-names = "tx";
> + resets = <&cru SRST_M_I2S0_8CH_TX>, <&cru SRST_M_I2S0_8CH_RX>;
> + reset-names = "tx-m", "rx-m";
> + rockchip,grf = <&grf>;
> + #sound-dai-cells = <0>;
> + status = "disabled";
> + };
> +
> i2s1_8ch: i2s@fe410000 {
> compatible = "rockchip,rk3568-i2s-tdm";
> reg = <0x0 0xfe410000 0x0 0x1000>;
>

2021-11-25 19:32:31

by Heiko Stuebner

[permalink] [raw]
Subject: Re: [PATCH 1/2] arm64: dts: rockchip: rk356x: Add HDMI audio nodes

Am Donnerstag, 25. November 2021, 20:07:21 CET schrieb Johan Jonker:
> Hi Nicolas,
>
> Some comments...
>
> On 11/25/21 11:08 AM, Nicolas Frattaroli wrote:
> > This adds the i2s0 node and an hdmi-sound sound device to the
> > rk356x device tree. On the rk356[68], the i2s0 controller is
> > connected to HDMI audio.
> >
> > Signed-off-by: Nicolas Frattaroli <[email protected]>
> > ---
> > arch/arm64/boot/dts/rockchip/rk356x.dtsi | 32 ++++++++++++++++++++++++
> > 1 file changed, 32 insertions(+)
> >
> > diff --git a/arch/arm64/boot/dts/rockchip/rk356x.dtsi b/arch/arm64/boot/dts/rockchip/rk356x.dtsi
> > index 3c09cf6d4c37..ad4053402eef 100644
> > --- a/arch/arm64/boot/dts/rockchip/rk356x.dtsi
> > +++ b/arch/arm64/boot/dts/rockchip/rk356x.dtsi
> > @@ -614,6 +614,21 @@ hdmi_in_vp2: endpoint@2 {
> > };
> > };
> >
>
> > + hdmi_sound: hdmi-sound {
>
> Some DT sort rules:
>
> For nodes:
> Sort things without reg alphabetical first,
> then sort the rest by reg address.
>
> > + compatible = "simple-audio-card";
>
> simple-audio-card,name = "HDMI";
>
> > + simple-audio-card,format = "i2s";
> > + simple-audio-card,mclk-fs = <256>;
>
> > + simple-audio-card,name = "hdmi-sound";
>
> Exceptions:
> Sort simple-audio-card,name above other simple-audio-card properties.
>
> Shouldn't we standardize to SPDIF, HDMI and Analog similar to rk3318/rk3328?
> Make a shorter label without spaces or special chars, so that chars
> don't get removed?
> See "aplay -l" screen print.
>
> Maybe rename to "HDMI"?
>
> > + status = "disabled";
> > +
> > + simple-audio-card,cpu {
> > + sound-dai = <&i2s0_8ch>;
> > + };
>
> Add empty line between nodes.
>
> Not sure if Heiko cares, but when alphabetical sort I get this:
> simple-audio-card,codec
> simple-audio-card,cpu

Hehe ... I do care, but would normally just (silently) re-sort these
things when applying ;-) .


Heiko


> > + simple-audio-card,codec {
> > + sound-dai = <&hdmi>;
> > + };
> > + };
> > +
> > qos_gpu: qos@fe128000 {
> > compatible = "rockchip,rk3568-qos", "syscon";
> > reg = <0x0 0xfe128000 0x0 0x20>;
> > @@ -789,6 +804,23 @@ spdif: spdif@fe460000 {
> > status = "disabled";
> > };
> >
> > + i2s0_8ch: i2s@fe400000 {
> > + compatible = "rockchip,rk3568-i2s-tdm";
> > + reg = <0x0 0xfe400000 0x0 0x1000>;
> > + interrupts = <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>;
> > + assigned-clocks = <&cru CLK_I2S0_8CH_TX_SRC>, <&cru CLK_I2S0_8CH_RX_SRC>;
> > + assigned-clock-rates = <1188000000>, <1188000000>;
> > + clocks = <&cru MCLK_I2S0_8CH_TX>, <&cru MCLK_I2S0_8CH_RX>, <&cru HCLK_I2S0_8CH>;
> > + clock-names = "mclk_tx", "mclk_rx", "hclk";
> > + dmas = <&dmac1 0>;
> > + dma-names = "tx";
> > + resets = <&cru SRST_M_I2S0_8CH_TX>, <&cru SRST_M_I2S0_8CH_RX>;
> > + reset-names = "tx-m", "rx-m";
> > + rockchip,grf = <&grf>;
> > + #sound-dai-cells = <0>;
> > + status = "disabled";
> > + };
> > +
> > i2s1_8ch: i2s@fe410000 {
> > compatible = "rockchip,rk3568-i2s-tdm";
> > reg = <0x0 0xfe410000 0x0 0x1000>;
> >
>