* [PATCH v3 0/6] Add support for S4 audio
@ 2025-02-28 8:04 jiebing chen via B4 Relay
2025-02-28 8:04 ` [PATCH v3 1/6] dt-bindings: clock: meson: Add audio power domain for s4 soc jiebing chen via B4 Relay
` (6 more replies)
0 siblings, 7 replies; 15+ messages in thread
From: jiebing chen via B4 Relay @ 2025-02-28 8:04 UTC (permalink / raw)
To: Jerome Brunet, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jaroslav Kysela, Takashi Iwai,
Neil Armstrong, Kevin Hilman, Martin Blumenstingl,
Michael Turquette, Stephen Boyd
Cc: linux-sound, devicetree, linux-kernel, linux-arm-kernel,
linux-amlogic, linux-clk, jian.xu, shuai.li, zhe.wang,
jiebing chen
Add s4 audio base driver.
Signed-off-by: jiebing chen <jiebing.chen@amlogic.com>
---
Changes in v3:
- remove g12a tocodec switch event
- Modify the incorrect title for dt-bindings
- Link to v2: https://lore.kernel.org/r/20250214-audio_drvier-v2-0-37881fa37c9e@amlogic.com
Changes in v2:
- remove tdm pad control and change tocodec base on g12a
- change hifipll rate to support 24bit
- add s4 audio clock
- Link to v1: https://lore.kernel.org/r/20250113-audio_drvier-v1-0-8c14770f38a0@amlogic.com
---
jiebing chen (6):
dt-bindings: clock: meson: Add audio power domain for s4 soc
dt-bindings: clock: axg-audio: Add mclk and sclk pad clock ids
dt-bindings: Asoc: axg-audio: Add s4 audio tocodec
clk: meson: axg-audio: Add the mclk pad div for s4
ASoC: meson: s4: Add s4 tocodec driver
arm64: dts: amlogic: Add Amlogic S4 Audio
.../bindings/clock/amlogic,axg-audio-clkc.yaml | 18 +
.../bindings/sound/amlogic,g12a-toacodec.yaml | 1 +
.../boot/dts/amlogic/meson-s4-s805x2-aq222.dts | 219 +++++++++++
arch/arm64/boot/dts/amlogic/meson-s4.dtsi | 371 ++++++++++++++++++-
drivers/clk/meson/axg-audio.c | 410 ++++++++++++++++++++-
drivers/clk/meson/axg-audio.h | 4 +
include/dt-bindings/clock/axg-audio-clkc.h | 11 +
sound/soc/meson/g12a-toacodec.c | 51 +++
8 files changed, 1081 insertions(+), 4 deletions(-)
---
base-commit: 6ecd20965bdc21b265a0671ccf36d9ad8043f5ab
change-id: 20250110-audio_drvier-07a5381c494b
Best regards,
--
jiebing chen <jiebing.chen@amlogic.com>
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v3 1/6] dt-bindings: clock: meson: Add audio power domain for s4 soc
2025-02-28 8:04 [PATCH v3 0/6] Add support for S4 audio jiebing chen via B4 Relay
@ 2025-02-28 8:04 ` jiebing chen via B4 Relay
2025-02-28 21:51 ` Rob Herring
2025-02-28 8:04 ` [PATCH v3 2/6] dt-bindings: clock: axg-audio: Add mclk and sclk pad clock ids jiebing chen via B4 Relay
` (5 subsequent siblings)
6 siblings, 1 reply; 15+ messages in thread
From: jiebing chen via B4 Relay @ 2025-02-28 8:04 UTC (permalink / raw)
To: Jerome Brunet, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jaroslav Kysela, Takashi Iwai,
Neil Armstrong, Kevin Hilman, Martin Blumenstingl,
Michael Turquette, Stephen Boyd
Cc: linux-sound, devicetree, linux-kernel, linux-arm-kernel,
linux-amlogic, linux-clk, jian.xu, shuai.li, zhe.wang,
jiebing chen
From: jiebing chen <jiebing.chen@amlogic.com>
Audio power domain found on S4 device. It need to enable before audio work.
Signed-off-by: jiebing chen <jiebing.chen@amlogic.com>
---
.../bindings/clock/amlogic,axg-audio-clkc.yaml | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/Documentation/devicetree/bindings/clock/amlogic,axg-audio-clkc.yaml b/Documentation/devicetree/bindings/clock/amlogic,axg-audio-clkc.yaml
index fd7982dd4ceab82389167079c2258a9acff51a76..364783c6f7572b09d57de2b35d33adb7bcf7db18 100644
--- a/Documentation/devicetree/bindings/clock/amlogic,axg-audio-clkc.yaml
+++ b/Documentation/devicetree/bindings/clock/amlogic,axg-audio-clkc.yaml
@@ -21,6 +21,7 @@ properties:
- amlogic,axg-audio-clkc
- amlogic,g12a-audio-clkc
- amlogic,sm1-audio-clkc
+ - amlogic,s4-audio-clkc
'#clock-cells':
const: 1
@@ -100,6 +101,9 @@ properties:
resets:
description: internal reset line
+ power-domains:
+ description: audio controller power
+
required:
- compatible
- '#clock-cells'
@@ -116,12 +120,26 @@ allOf:
enum:
- amlogic,g12a-audio-clkc
- amlogic,sm1-audio-clkc
+ - amlogic,s4-audio-clkc
then:
required:
- '#reset-cells'
else:
properties:
'#reset-cells': false
+ - if:
+ properties:
+ compatible:
+ contains:
+ enum:
+ - amlogic,s4-audio-clkc
+ then:
+ required:
+ - power-domains
+
+ else:
+ properties:
+ power-domains: false
additionalProperties: false
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v3 2/6] dt-bindings: clock: axg-audio: Add mclk and sclk pad clock ids
2025-02-28 8:04 [PATCH v3 0/6] Add support for S4 audio jiebing chen via B4 Relay
2025-02-28 8:04 ` [PATCH v3 1/6] dt-bindings: clock: meson: Add audio power domain for s4 soc jiebing chen via B4 Relay
@ 2025-02-28 8:04 ` jiebing chen via B4 Relay
2025-02-28 21:53 ` Rob Herring (Arm)
2025-02-28 8:04 ` [PATCH v3 3/6] dt-bindings: Asoc: axg-audio: Add s4 audio tocodec jiebing chen via B4 Relay
` (4 subsequent siblings)
6 siblings, 1 reply; 15+ messages in thread
From: jiebing chen via B4 Relay @ 2025-02-28 8:04 UTC (permalink / raw)
To: Jerome Brunet, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jaroslav Kysela, Takashi Iwai,
Neil Armstrong, Kevin Hilman, Martin Blumenstingl,
Michael Turquette, Stephen Boyd
Cc: linux-sound, devicetree, linux-kernel, linux-arm-kernel,
linux-amlogic, linux-clk, jian.xu, shuai.li, zhe.wang,
jiebing chen
From: jiebing chen <jiebing.chen@amlogic.com>
Add clock IDs for the mclk pads found on s4 SoCs
Signed-off-by: jiebing chen <jiebing.chen@amlogic.com>
---
include/dt-bindings/clock/axg-audio-clkc.h | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/include/dt-bindings/clock/axg-audio-clkc.h b/include/dt-bindings/clock/axg-audio-clkc.h
index 607f23b83fa7287fe0403682ebf827e2df26a1ce..75dde05343d1fa74304ee21c9ec0541a8f51b15e 100644
--- a/include/dt-bindings/clock/axg-audio-clkc.h
+++ b/include/dt-bindings/clock/axg-audio-clkc.h
@@ -162,5 +162,16 @@
#define AUD_CLKID_EARCRX_DMAC_SEL 182
#define AUD_CLKID_EARCRX_DMAC_DIV 183
#define AUD_CLKID_EARCRX_DMAC 184
+#define AUD_CLKID_TDM_MCLK_PAD0_SEL 185
+#define AUD_CLKID_TDM_MCLK_PAD1_SEL 186
+#define AUD_CLKID_TDM_MCLK_PAD0_DIV 187
+#define AUD_CLKID_TDM_MCLK_PAD1_DIV 188
+#define AUD_CLKID_TDM_MCLK_PAD2 189
+#define AUD_CLKID_TDM_MCLK_PAD2_SEL 190
+#define AUD_CLKID_TDM_MCLK_PAD2_DIV 191
+#define AUD_CLKID_TDM_SCLK_PAD3 192
+#define AUD_CLKID_TDM_SCLK_PAD4 193
+#define AUD_CLKID_TDM_LRCLK_PAD3 194
+#define AUD_CLKID_TDM_LRCLK_PAD4 195
#endif /* __AXG_AUDIO_CLKC_BINDINGS_H */
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v3 3/6] dt-bindings: Asoc: axg-audio: Add s4 audio tocodec
2025-02-28 8:04 [PATCH v3 0/6] Add support for S4 audio jiebing chen via B4 Relay
2025-02-28 8:04 ` [PATCH v3 1/6] dt-bindings: clock: meson: Add audio power domain for s4 soc jiebing chen via B4 Relay
2025-02-28 8:04 ` [PATCH v3 2/6] dt-bindings: clock: axg-audio: Add mclk and sclk pad clock ids jiebing chen via B4 Relay
@ 2025-02-28 8:04 ` jiebing chen via B4 Relay
2025-02-28 21:54 ` Rob Herring (Arm)
2025-02-28 8:04 ` [PATCH v3 4/6] clk: meson: axg-audio: Add the mclk pad div for s4 jiebing chen via B4 Relay
` (3 subsequent siblings)
6 siblings, 1 reply; 15+ messages in thread
From: jiebing chen via B4 Relay @ 2025-02-28 8:04 UTC (permalink / raw)
To: Jerome Brunet, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jaroslav Kysela, Takashi Iwai,
Neil Armstrong, Kevin Hilman, Martin Blumenstingl,
Michael Turquette, Stephen Boyd
Cc: linux-sound, devicetree, linux-kernel, linux-arm-kernel,
linux-amlogic, linux-clk, jian.xu, shuai.li, zhe.wang,
jiebing chen
From: jiebing chen <jiebing.chen@amlogic.com>
Add the s4 tocodec compatible
Signed-off-by: jiebing chen <jiebing.chen@amlogic.com>
---
Documentation/devicetree/bindings/sound/amlogic,g12a-toacodec.yaml | 1 +
1 file changed, 1 insertion(+)
diff --git a/Documentation/devicetree/bindings/sound/amlogic,g12a-toacodec.yaml b/Documentation/devicetree/bindings/sound/amlogic,g12a-toacodec.yaml
index 23f82bb89750898d20c866015bc2e1a4b0554846..ea669f4359bc81b0f45bc2105c832fc2b11d8441 100644
--- a/Documentation/devicetree/bindings/sound/amlogic,g12a-toacodec.yaml
+++ b/Documentation/devicetree/bindings/sound/amlogic,g12a-toacodec.yaml
@@ -26,6 +26,7 @@ properties:
- items:
- enum:
- amlogic,sm1-toacodec
+ - amlogic,s4-toacodec
- const: amlogic,g12a-toacodec
reg:
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v3 4/6] clk: meson: axg-audio: Add the mclk pad div for s4
2025-02-28 8:04 [PATCH v3 0/6] Add support for S4 audio jiebing chen via B4 Relay
` (2 preceding siblings ...)
2025-02-28 8:04 ` [PATCH v3 3/6] dt-bindings: Asoc: axg-audio: Add s4 audio tocodec jiebing chen via B4 Relay
@ 2025-02-28 8:04 ` jiebing chen via B4 Relay
2025-03-06 16:41 ` Jerome Brunet
2025-02-28 8:04 ` [PATCH v3 5/6] ASoC: meson: s4: Add s4 tocodec driver jiebing chen via B4 Relay
` (2 subsequent siblings)
6 siblings, 1 reply; 15+ messages in thread
From: jiebing chen via B4 Relay @ 2025-02-28 8:04 UTC (permalink / raw)
To: Jerome Brunet, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jaroslav Kysela, Takashi Iwai,
Neil Armstrong, Kevin Hilman, Martin Blumenstingl,
Michael Turquette, Stephen Boyd
Cc: linux-sound, devicetree, linux-kernel, linux-arm-kernel,
linux-amlogic, linux-clk, jian.xu, shuai.li, zhe.wang,
jiebing chen
From: jiebing chen <jiebing.chen@amlogic.com>
Add mclk pad div support, Increased the number of lrclk
and sclk pads to five
Signed-off-by: jiebing chen <jiebing.chen@amlogic.com>
---
drivers/clk/meson/axg-audio.c | 410 +++++++++++++++++++++++++++++++++++++++++-
drivers/clk/meson/axg-audio.h | 4 +
2 files changed, 412 insertions(+), 2 deletions(-)
diff --git a/drivers/clk/meson/axg-audio.c b/drivers/clk/meson/axg-audio.c
index 9df627b142f89788966ede0262aaaf39e13f0b49..e70559ee0fd8deaf9858b0592e839fdf49d05886 100644
--- a/drivers/clk/meson/axg-audio.c
+++ b/drivers/clk/meson/axg-audio.c
@@ -323,6 +323,16 @@ static const struct clk_parent_data lrclk_pad_ctrl_parent_data[] = {
AUD_MUX(_name, _reg, 0x7, _shift, 0, _parents, \
CLK_SET_RATE_NO_REPARENT)
+#define AUD_MCLK_PAD_MUX(_name, _reg, _shift) \
+ AUD_MUX(_name##_sel, _reg, 0x7, _shift, CLK_MUX_ROUND_CLOSEST, \
+ mclk_pad_ctrl_parent_data, 0)
+#define AUD_MCLK_PAD_DIV(_name, _reg, _shift) \
+ AUD_DIV(_name##_div, _reg, _shift, 8, CLK_DIVIDER_ROUND_CLOSEST, \
+ aud_##_name##_sel, CLK_SET_RATE_PARENT)
+#define AUD_MCLK_PAD_GATE(_name, _reg, _shift) \
+ AUD_GATE(_name, _reg, _shift, aud_##_name##_div, \
+ CLK_SET_RATE_PARENT)
+
/* Common Clocks */
static struct clk_regmap ddr_arb =
AUD_PCLK_GATE(ddr_arb, AUDIO_CLK_GATE_EN, 0);
@@ -826,6 +836,49 @@ static struct clk_regmap sm1_tdm_sclk_pad_1 = AUD_TDM_PAD_CTRL(
static struct clk_regmap sm1_tdm_sclk_pad_2 = AUD_TDM_PAD_CTRL(
tdm_sclk_pad_2, AUDIO_SM1_MST_PAD_CTRL1, 8, sclk_pad_ctrl_parent_data);
+static struct clk_regmap s4_tdm_mclk_pad0_sel =
+ AUD_MCLK_PAD_MUX(mclk_pad0, AUDIO_S4_MCLK_PAD_CTRL0, 8);
+static struct clk_regmap s4_tdm_mclk_pad1_sel =
+ AUD_MCLK_PAD_MUX(mclk_pad1, AUDIO_S4_MCLK_PAD_CTRL0, 24);
+static struct clk_regmap s4_tdm_mclk_pad2_sel =
+ AUD_MCLK_PAD_MUX(mclk_pad2, AUDIO_S4_MCLK_PAD_CTRL1, 8);
+
+static struct clk_regmap s4_tdm_mclk_pad0_div =
+ AUD_MCLK_PAD_DIV(mclk_pad0, AUDIO_S4_MCLK_PAD_CTRL0, 0);
+static struct clk_regmap s4_tdm_mclk_pad1_div =
+ AUD_MCLK_PAD_DIV(mclk_pad1, AUDIO_S4_MCLK_PAD_CTRL0, 16);
+static struct clk_regmap s4_tdm_mclk_pad2_div =
+ AUD_MCLK_PAD_DIV(mclk_pad2, AUDIO_S4_MCLK_PAD_CTRL1, 0);
+
+static struct clk_regmap s4_tdm_mclk_pad_0 =
+ AUD_MCLK_PAD_GATE(mclk_pad0, AUDIO_S4_MCLK_PAD_CTRL0, 15);
+static struct clk_regmap s4_tdm_mclk_pad_1 =
+ AUD_MCLK_PAD_GATE(mclk_pad1, AUDIO_S4_MCLK_PAD_CTRL0, 31);
+static struct clk_regmap s4_tdm_mclk_pad_2 =
+ AUD_MCLK_PAD_GATE(mclk_pad2, AUDIO_S4_MCLK_PAD_CTRL1, 15);
+
+static struct clk_regmap s4_tdm_sclk_pad_0 =
+ AUD_TDM_PAD_CTRL(tdm_sclk_pad_0, AUDIO_S4_SCLK_PAD_CTRL0, 0, lrclk_pad_ctrl_parent_data);
+static struct clk_regmap s4_tdm_sclk_pad_1 =
+ AUD_TDM_PAD_CTRL(tdm_sclk_pad_1, AUDIO_S4_SCLK_PAD_CTRL0, 4, lrclk_pad_ctrl_parent_data);
+static struct clk_regmap s4_tdm_sclk_pad_2 =
+ AUD_TDM_PAD_CTRL(tdm_sclk_pad_2, AUDIO_S4_SCLK_PAD_CTRL0, 8, lrclk_pad_ctrl_parent_data);
+static struct clk_regmap s4_tdm_sclk_pad_3 =
+ AUD_TDM_PAD_CTRL(tdm_sclk_pad_3, AUDIO_S4_SCLK_PAD_CTRL0, 16, lrclk_pad_ctrl_parent_data);
+static struct clk_regmap s4_tdm_sclk_pad_4 =
+ AUD_TDM_PAD_CTRL(tdm_sclk_pad_4, AUDIO_S4_SCLK_PAD_CTRL0, 20, lrclk_pad_ctrl_parent_data);
+
+static struct clk_regmap s4_tdm_lrclk_pad_0 =
+ AUD_TDM_PAD_CTRL(tdm_lrclk_pad_0, AUDIO_S4_SCLK_PAD_CTRL1, 0, lrclk_pad_ctrl_parent_data);
+static struct clk_regmap s4_tdm_lrclk_pad_1 =
+ AUD_TDM_PAD_CTRL(tdm_lrclk_pad_1, AUDIO_S4_SCLK_PAD_CTRL1, 4, lrclk_pad_ctrl_parent_data);
+static struct clk_regmap s4_tdm_lrclk_pad_2 =
+ AUD_TDM_PAD_CTRL(tdm_lrclk_pad_2, AUDIO_S4_SCLK_PAD_CTRL1, 8, lrclk_pad_ctrl_parent_data);
+static struct clk_regmap s4_tdm_lrclk_pad_3 =
+ AUD_TDM_PAD_CTRL(tdm_lrclk_pad_3, AUDIO_S4_SCLK_PAD_CTRL1, 16, lrclk_pad_ctrl_parent_data);
+static struct clk_regmap s4_tdm_lrclk_pad_4 =
+ AUD_TDM_PAD_CTRL(tdm_lrclk_pad_4, AUDIO_S4_SCLK_PAD_CTRL1, 20, lrclk_pad_ctrl_parent_data);
+
/*
* Array of all clocks provided by this provider
* The input clocks of the controller will be populated at runtime
@@ -1257,6 +1310,177 @@ static struct clk_hw *sm1_audio_hw_clks[] = {
[AUD_CLKID_EARCRX_DMAC] = &sm1_earcrx_dmac_clk.hw,
};
+/*
+ * Array of all S4 clocks provided by this provider
+ * The input clocks of the controller will be populated at runtime
+ */
+static struct clk_hw *s4_audio_hw_clks[] = {
+ [AUD_CLKID_DDR_ARB] = &ddr_arb.hw,
+ [AUD_CLKID_PDM] = &pdm.hw,
+ [AUD_CLKID_TDMIN_A] = &tdmin_a.hw,
+ [AUD_CLKID_TDMIN_B] = &tdmin_b.hw,
+ [AUD_CLKID_TDMIN_C] = &tdmin_c.hw,
+ [AUD_CLKID_TDMIN_LB] = &tdmin_lb.hw,
+ [AUD_CLKID_TDMOUT_A] = &tdmout_a.hw,
+ [AUD_CLKID_TDMOUT_B] = &tdmout_b.hw,
+ [AUD_CLKID_TDMOUT_C] = &tdmout_c.hw,
+ [AUD_CLKID_FRDDR_A] = &frddr_a.hw,
+ [AUD_CLKID_FRDDR_B] = &frddr_b.hw,
+ [AUD_CLKID_FRDDR_C] = &frddr_c.hw,
+ [AUD_CLKID_TODDR_A] = &toddr_a.hw,
+ [AUD_CLKID_TODDR_B] = &toddr_b.hw,
+ [AUD_CLKID_TODDR_C] = &toddr_c.hw,
+ [AUD_CLKID_LOOPBACK] = &loopback.hw,
+ [AUD_CLKID_SPDIFIN] = &spdifin.hw,
+ [AUD_CLKID_SPDIFOUT] = &spdifout.hw,
+ [AUD_CLKID_RESAMPLE] = &resample.hw,
+ [AUD_CLKID_SPDIFOUT_B] = &spdifout_b.hw,
+ [AUD_CLKID_MST_A_MCLK_SEL] = &sm1_mst_a_mclk_sel.hw,
+ [AUD_CLKID_MST_B_MCLK_SEL] = &sm1_mst_b_mclk_sel.hw,
+ [AUD_CLKID_MST_C_MCLK_SEL] = &sm1_mst_c_mclk_sel.hw,
+ [AUD_CLKID_MST_D_MCLK_SEL] = &sm1_mst_d_mclk_sel.hw,
+ [AUD_CLKID_MST_E_MCLK_SEL] = &sm1_mst_e_mclk_sel.hw,
+ [AUD_CLKID_MST_F_MCLK_SEL] = &sm1_mst_f_mclk_sel.hw,
+ [AUD_CLKID_MST_A_MCLK_DIV] = &sm1_mst_a_mclk_div.hw,
+ [AUD_CLKID_MST_B_MCLK_DIV] = &sm1_mst_b_mclk_div.hw,
+ [AUD_CLKID_MST_C_MCLK_DIV] = &sm1_mst_c_mclk_div.hw,
+ [AUD_CLKID_MST_D_MCLK_DIV] = &sm1_mst_d_mclk_div.hw,
+ [AUD_CLKID_MST_E_MCLK_DIV] = &sm1_mst_e_mclk_div.hw,
+ [AUD_CLKID_MST_F_MCLK_DIV] = &sm1_mst_f_mclk_div.hw,
+ [AUD_CLKID_MST_A_MCLK] = &sm1_mst_a_mclk.hw,
+ [AUD_CLKID_MST_B_MCLK] = &sm1_mst_b_mclk.hw,
+ [AUD_CLKID_MST_C_MCLK] = &sm1_mst_c_mclk.hw,
+ [AUD_CLKID_MST_D_MCLK] = &sm1_mst_d_mclk.hw,
+ [AUD_CLKID_MST_E_MCLK] = &sm1_mst_e_mclk.hw,
+ [AUD_CLKID_MST_F_MCLK] = &sm1_mst_f_mclk.hw,
+ [AUD_CLKID_SPDIFOUT_CLK_SEL] = &spdifout_clk_sel.hw,
+ [AUD_CLKID_SPDIFOUT_CLK_DIV] = &spdifout_clk_div.hw,
+ [AUD_CLKID_SPDIFOUT_CLK] = &spdifout_clk.hw,
+ [AUD_CLKID_SPDIFOUT_B_CLK_SEL] = &spdifout_b_clk_sel.hw,
+ [AUD_CLKID_SPDIFOUT_B_CLK_DIV] = &spdifout_b_clk_div.hw,
+ [AUD_CLKID_SPDIFOUT_B_CLK] = &spdifout_b_clk.hw,
+ [AUD_CLKID_SPDIFIN_CLK_SEL] = &spdifin_clk_sel.hw,
+ [AUD_CLKID_SPDIFIN_CLK_DIV] = &spdifin_clk_div.hw,
+ [AUD_CLKID_SPDIFIN_CLK] = &spdifin_clk.hw,
+ [AUD_CLKID_PDM_DCLK_SEL] = &pdm_dclk_sel.hw,
+ [AUD_CLKID_PDM_DCLK_DIV] = &pdm_dclk_div.hw,
+ [AUD_CLKID_PDM_DCLK] = &pdm_dclk.hw,
+ [AUD_CLKID_PDM_SYSCLK_SEL] = &pdm_sysclk_sel.hw,
+ [AUD_CLKID_PDM_SYSCLK_DIV] = &pdm_sysclk_div.hw,
+ [AUD_CLKID_PDM_SYSCLK] = &pdm_sysclk.hw,
+ [AUD_CLKID_MST_A_SCLK_PRE_EN] = &mst_a_sclk_pre_en.hw,
+ [AUD_CLKID_MST_B_SCLK_PRE_EN] = &mst_b_sclk_pre_en.hw,
+ [AUD_CLKID_MST_C_SCLK_PRE_EN] = &mst_c_sclk_pre_en.hw,
+ [AUD_CLKID_MST_D_SCLK_PRE_EN] = &mst_d_sclk_pre_en.hw,
+ [AUD_CLKID_MST_E_SCLK_PRE_EN] = &mst_e_sclk_pre_en.hw,
+ [AUD_CLKID_MST_F_SCLK_PRE_EN] = &mst_f_sclk_pre_en.hw,
+ [AUD_CLKID_MST_A_SCLK_DIV] = &mst_a_sclk_div.hw,
+ [AUD_CLKID_MST_B_SCLK_DIV] = &mst_b_sclk_div.hw,
+ [AUD_CLKID_MST_C_SCLK_DIV] = &mst_c_sclk_div.hw,
+ [AUD_CLKID_MST_D_SCLK_DIV] = &mst_d_sclk_div.hw,
+ [AUD_CLKID_MST_E_SCLK_DIV] = &mst_e_sclk_div.hw,
+ [AUD_CLKID_MST_F_SCLK_DIV] = &mst_f_sclk_div.hw,
+ [AUD_CLKID_MST_A_SCLK_POST_EN] = &mst_a_sclk_post_en.hw,
+ [AUD_CLKID_MST_B_SCLK_POST_EN] = &mst_b_sclk_post_en.hw,
+ [AUD_CLKID_MST_C_SCLK_POST_EN] = &mst_c_sclk_post_en.hw,
+ [AUD_CLKID_MST_D_SCLK_POST_EN] = &mst_d_sclk_post_en.hw,
+ [AUD_CLKID_MST_E_SCLK_POST_EN] = &mst_e_sclk_post_en.hw,
+ [AUD_CLKID_MST_F_SCLK_POST_EN] = &mst_f_sclk_post_en.hw,
+ [AUD_CLKID_MST_A_SCLK] = &mst_a_sclk.hw,
+ [AUD_CLKID_MST_B_SCLK] = &mst_b_sclk.hw,
+ [AUD_CLKID_MST_C_SCLK] = &mst_c_sclk.hw,
+ [AUD_CLKID_MST_D_SCLK] = &mst_d_sclk.hw,
+ [AUD_CLKID_MST_E_SCLK] = &mst_e_sclk.hw,
+ [AUD_CLKID_MST_F_SCLK] = &mst_f_sclk.hw,
+ [AUD_CLKID_MST_A_LRCLK_DIV] = &mst_a_lrclk_div.hw,
+ [AUD_CLKID_MST_B_LRCLK_DIV] = &mst_b_lrclk_div.hw,
+ [AUD_CLKID_MST_C_LRCLK_DIV] = &mst_c_lrclk_div.hw,
+ [AUD_CLKID_MST_D_LRCLK_DIV] = &mst_d_lrclk_div.hw,
+ [AUD_CLKID_MST_E_LRCLK_DIV] = &mst_e_lrclk_div.hw,
+ [AUD_CLKID_MST_F_LRCLK_DIV] = &mst_f_lrclk_div.hw,
+ [AUD_CLKID_MST_A_LRCLK] = &mst_a_lrclk.hw,
+ [AUD_CLKID_MST_B_LRCLK] = &mst_b_lrclk.hw,
+ [AUD_CLKID_MST_C_LRCLK] = &mst_c_lrclk.hw,
+ [AUD_CLKID_MST_D_LRCLK] = &mst_d_lrclk.hw,
+ [AUD_CLKID_MST_E_LRCLK] = &mst_e_lrclk.hw,
+ [AUD_CLKID_MST_F_LRCLK] = &mst_f_lrclk.hw,
+ [AUD_CLKID_TDMIN_A_SCLK_SEL] = &tdmin_a_sclk_sel.hw,
+ [AUD_CLKID_TDMIN_B_SCLK_SEL] = &tdmin_b_sclk_sel.hw,
+ [AUD_CLKID_TDMIN_C_SCLK_SEL] = &tdmin_c_sclk_sel.hw,
+ [AUD_CLKID_TDMIN_LB_SCLK_SEL] = &tdmin_lb_sclk_sel.hw,
+ [AUD_CLKID_TDMOUT_A_SCLK_SEL] = &tdmout_a_sclk_sel.hw,
+ [AUD_CLKID_TDMOUT_B_SCLK_SEL] = &tdmout_b_sclk_sel.hw,
+ [AUD_CLKID_TDMOUT_C_SCLK_SEL] = &tdmout_c_sclk_sel.hw,
+ [AUD_CLKID_TDMIN_A_SCLK_PRE_EN] = &tdmin_a_sclk_pre_en.hw,
+ [AUD_CLKID_TDMIN_B_SCLK_PRE_EN] = &tdmin_b_sclk_pre_en.hw,
+ [AUD_CLKID_TDMIN_C_SCLK_PRE_EN] = &tdmin_c_sclk_pre_en.hw,
+ [AUD_CLKID_TDMIN_LB_SCLK_PRE_EN] = &tdmin_lb_sclk_pre_en.hw,
+ [AUD_CLKID_TDMOUT_A_SCLK_PRE_EN] = &tdmout_a_sclk_pre_en.hw,
+ [AUD_CLKID_TDMOUT_B_SCLK_PRE_EN] = &tdmout_b_sclk_pre_en.hw,
+ [AUD_CLKID_TDMOUT_C_SCLK_PRE_EN] = &tdmout_c_sclk_pre_en.hw,
+ [AUD_CLKID_TDMIN_A_SCLK_POST_EN] = &tdmin_a_sclk_post_en.hw,
+ [AUD_CLKID_TDMIN_B_SCLK_POST_EN] = &tdmin_b_sclk_post_en.hw,
+ [AUD_CLKID_TDMIN_C_SCLK_POST_EN] = &tdmin_c_sclk_post_en.hw,
+ [AUD_CLKID_TDMIN_LB_SCLK_POST_EN] = &tdmin_lb_sclk_post_en.hw,
+ [AUD_CLKID_TDMOUT_A_SCLK_POST_EN] = &tdmout_a_sclk_post_en.hw,
+ [AUD_CLKID_TDMOUT_B_SCLK_POST_EN] = &tdmout_b_sclk_post_en.hw,
+ [AUD_CLKID_TDMOUT_C_SCLK_POST_EN] = &tdmout_c_sclk_post_en.hw,
+ [AUD_CLKID_TDMIN_A_SCLK] = &tdmin_a_sclk.hw,
+ [AUD_CLKID_TDMIN_B_SCLK] = &tdmin_b_sclk.hw,
+ [AUD_CLKID_TDMIN_C_SCLK] = &tdmin_c_sclk.hw,
+ [AUD_CLKID_TDMIN_LB_SCLK] = &tdmin_lb_sclk.hw,
+ [AUD_CLKID_TDMOUT_A_SCLK] = &g12a_tdmout_a_sclk.hw,
+ [AUD_CLKID_TDMOUT_B_SCLK] = &g12a_tdmout_b_sclk.hw,
+ [AUD_CLKID_TDMOUT_C_SCLK] = &g12a_tdmout_c_sclk.hw,
+ [AUD_CLKID_TDMIN_A_LRCLK] = &tdmin_a_lrclk.hw,
+ [AUD_CLKID_TDMIN_B_LRCLK] = &tdmin_b_lrclk.hw,
+ [AUD_CLKID_TDMIN_C_LRCLK] = &tdmin_c_lrclk.hw,
+ [AUD_CLKID_TDMIN_LB_LRCLK] = &tdmin_lb_lrclk.hw,
+ [AUD_CLKID_TDMOUT_A_LRCLK] = &tdmout_a_lrclk.hw,
+ [AUD_CLKID_TDMOUT_B_LRCLK] = &tdmout_b_lrclk.hw,
+ [AUD_CLKID_TDMOUT_C_LRCLK] = &tdmout_c_lrclk.hw,
+ [AUD_CLKID_TDM_MCLK_PAD0] = &s4_tdm_mclk_pad_0.hw,
+ [AUD_CLKID_TDM_MCLK_PAD1] = &s4_tdm_mclk_pad_1.hw,
+ [AUD_CLKID_TDM_LRCLK_PAD0] = &s4_tdm_lrclk_pad_0.hw,
+ [AUD_CLKID_TDM_LRCLK_PAD1] = &s4_tdm_lrclk_pad_1.hw,
+ [AUD_CLKID_TDM_LRCLK_PAD2] = &s4_tdm_lrclk_pad_2.hw,
+ [AUD_CLKID_TDM_SCLK_PAD0] = &s4_tdm_sclk_pad_0.hw,
+ [AUD_CLKID_TDM_SCLK_PAD1] = &s4_tdm_sclk_pad_1.hw,
+ [AUD_CLKID_TDM_SCLK_PAD2] = &s4_tdm_sclk_pad_2.hw,
+ [AUD_CLKID_TOP] = &sm1_aud_top.hw,
+ [AUD_CLKID_TORAM] = &toram.hw,
+ [AUD_CLKID_EQDRC] = &eqdrc.hw,
+ [AUD_CLKID_RESAMPLE_B] = &resample_b.hw,
+ [AUD_CLKID_TOVAD] = &tovad.hw,
+ [AUD_CLKID_LOCKER] = &locker.hw,
+ [AUD_CLKID_SPDIFIN_LB] = &spdifin_lb.hw,
+ [AUD_CLKID_FRDDR_D] = &frddr_d.hw,
+ [AUD_CLKID_TODDR_D] = &toddr_d.hw,
+ [AUD_CLKID_LOOPBACK_B] = &loopback_b.hw,
+ [AUD_CLKID_CLK81_EN] = &sm1_clk81_en.hw,
+ [AUD_CLKID_SYSCLK_A_DIV] = &sm1_sysclk_a_div.hw,
+ [AUD_CLKID_SYSCLK_A_EN] = &sm1_sysclk_a_en.hw,
+ [AUD_CLKID_SYSCLK_B_DIV] = &sm1_sysclk_b_div.hw,
+ [AUD_CLKID_SYSCLK_B_EN] = &sm1_sysclk_b_en.hw,
+ [AUD_CLKID_EARCRX] = &earcrx.hw,
+ [AUD_CLKID_EARCRX_CMDC_SEL] = &sm1_earcrx_cmdc_clk_sel.hw,
+ [AUD_CLKID_EARCRX_CMDC_DIV] = &sm1_earcrx_cmdc_clk_div.hw,
+ [AUD_CLKID_EARCRX_CMDC] = &sm1_earcrx_cmdc_clk.hw,
+ [AUD_CLKID_EARCRX_DMAC_SEL] = &sm1_earcrx_dmac_clk_sel.hw,
+ [AUD_CLKID_EARCRX_DMAC_DIV] = &sm1_earcrx_dmac_clk_div.hw,
+ [AUD_CLKID_EARCRX_DMAC] = &sm1_earcrx_dmac_clk.hw,
+ [AUD_CLKID_TDM_MCLK_PAD0_SEL] = &s4_tdm_mclk_pad0_sel.hw,
+ [AUD_CLKID_TDM_MCLK_PAD1_SEL] = &s4_tdm_mclk_pad1_sel.hw,
+ [AUD_CLKID_TDM_MCLK_PAD0_DIV] = &s4_tdm_mclk_pad0_div.hw,
+ [AUD_CLKID_TDM_MCLK_PAD1_DIV] = &s4_tdm_mclk_pad1_div.hw,
+ [AUD_CLKID_TDM_MCLK_PAD2] = &s4_tdm_mclk_pad_2.hw,
+ [AUD_CLKID_TDM_MCLK_PAD2_SEL] = &s4_tdm_mclk_pad2_sel.hw,
+ [AUD_CLKID_TDM_MCLK_PAD2_DIV] = &s4_tdm_mclk_pad2_div.hw,
+ [AUD_CLKID_TDM_SCLK_PAD3] = &s4_tdm_sclk_pad_3.hw,
+ [AUD_CLKID_TDM_SCLK_PAD4] = &s4_tdm_sclk_pad_4.hw,
+ [AUD_CLKID_TDM_LRCLK_PAD3] = &s4_tdm_lrclk_pad_3.hw,
+ [AUD_CLKID_TDM_LRCLK_PAD4] = &s4_tdm_lrclk_pad_4.hw,
+};
/* Convenience table to populate regmap in .probe(). */
static struct clk_regmap *const axg_clk_regmaps[] = {
@@ -1678,6 +1902,174 @@ static struct clk_regmap *const sm1_clk_regmaps[] = {
&sm1_earcrx_dmac_clk,
};
+static struct clk_regmap *const s4_clk_regmaps[] = {
+ &ddr_arb,
+ &pdm,
+ &tdmin_a,
+ &tdmin_b,
+ &tdmin_c,
+ &tdmin_lb,
+ &tdmout_a,
+ &tdmout_b,
+ &tdmout_c,
+ &frddr_a,
+ &frddr_b,
+ &frddr_c,
+ &toddr_a,
+ &toddr_b,
+ &toddr_c,
+ &loopback,
+ &spdifin,
+ &spdifout,
+ &resample,
+ &spdifout_b,
+ &sm1_mst_a_mclk_sel,
+ &sm1_mst_b_mclk_sel,
+ &sm1_mst_c_mclk_sel,
+ &sm1_mst_d_mclk_sel,
+ &sm1_mst_e_mclk_sel,
+ &sm1_mst_f_mclk_sel,
+ &sm1_mst_a_mclk_div,
+ &sm1_mst_b_mclk_div,
+ &sm1_mst_c_mclk_div,
+ &sm1_mst_d_mclk_div,
+ &sm1_mst_e_mclk_div,
+ &sm1_mst_f_mclk_div,
+ &sm1_mst_a_mclk,
+ &sm1_mst_b_mclk,
+ &sm1_mst_c_mclk,
+ &sm1_mst_d_mclk,
+ &sm1_mst_e_mclk,
+ &sm1_mst_f_mclk,
+ &spdifout_clk_sel,
+ &spdifout_clk_div,
+ &spdifout_clk,
+ &spdifin_clk_sel,
+ &spdifin_clk_div,
+ &spdifin_clk,
+ &pdm_dclk_sel,
+ &pdm_dclk_div,
+ &pdm_dclk,
+ &pdm_sysclk_sel,
+ &pdm_sysclk_div,
+ &pdm_sysclk,
+ &mst_a_sclk_pre_en,
+ &mst_b_sclk_pre_en,
+ &mst_c_sclk_pre_en,
+ &mst_d_sclk_pre_en,
+ &mst_e_sclk_pre_en,
+ &mst_f_sclk_pre_en,
+ &mst_a_sclk_div,
+ &mst_b_sclk_div,
+ &mst_c_sclk_div,
+ &mst_d_sclk_div,
+ &mst_e_sclk_div,
+ &mst_f_sclk_div,
+ &mst_a_sclk_post_en,
+ &mst_b_sclk_post_en,
+ &mst_c_sclk_post_en,
+ &mst_d_sclk_post_en,
+ &mst_e_sclk_post_en,
+ &mst_f_sclk_post_en,
+ &mst_a_sclk,
+ &mst_b_sclk,
+ &mst_c_sclk,
+ &mst_d_sclk,
+ &mst_e_sclk,
+ &mst_f_sclk,
+ &mst_a_lrclk_div,
+ &mst_b_lrclk_div,
+ &mst_c_lrclk_div,
+ &mst_d_lrclk_div,
+ &mst_e_lrclk_div,
+ &mst_f_lrclk_div,
+ &mst_a_lrclk,
+ &mst_b_lrclk,
+ &mst_c_lrclk,
+ &mst_d_lrclk,
+ &mst_e_lrclk,
+ &mst_f_lrclk,
+ &tdmin_a_sclk_sel,
+ &tdmin_b_sclk_sel,
+ &tdmin_c_sclk_sel,
+ &tdmin_lb_sclk_sel,
+ &tdmout_a_sclk_sel,
+ &tdmout_b_sclk_sel,
+ &tdmout_c_sclk_sel,
+ &tdmin_a_sclk_pre_en,
+ &tdmin_b_sclk_pre_en,
+ &tdmin_c_sclk_pre_en,
+ &tdmin_lb_sclk_pre_en,
+ &tdmout_a_sclk_pre_en,
+ &tdmout_b_sclk_pre_en,
+ &tdmout_c_sclk_pre_en,
+ &tdmin_a_sclk_post_en,
+ &tdmin_b_sclk_post_en,
+ &tdmin_c_sclk_post_en,
+ &tdmin_lb_sclk_post_en,
+ &tdmout_a_sclk_post_en,
+ &tdmout_b_sclk_post_en,
+ &tdmout_c_sclk_post_en,
+ &tdmin_a_sclk,
+ &tdmin_b_sclk,
+ &tdmin_c_sclk,
+ &tdmin_lb_sclk,
+ &g12a_tdmout_a_sclk,
+ &g12a_tdmout_b_sclk,
+ &g12a_tdmout_c_sclk,
+ &tdmin_a_lrclk,
+ &tdmin_b_lrclk,
+ &tdmin_c_lrclk,
+ &tdmin_lb_lrclk,
+ &tdmout_a_lrclk,
+ &tdmout_b_lrclk,
+ &tdmout_c_lrclk,
+ &spdifout_b_clk_sel,
+ &spdifout_b_clk_div,
+ &spdifout_b_clk,
+ &s4_tdm_mclk_pad_0,
+ &s4_tdm_mclk_pad_1,
+ &s4_tdm_lrclk_pad_0,
+ &s4_tdm_lrclk_pad_1,
+ &s4_tdm_lrclk_pad_2,
+ &s4_tdm_sclk_pad_0,
+ &s4_tdm_sclk_pad_1,
+ &s4_tdm_sclk_pad_2,
+ &sm1_aud_top,
+ &toram,
+ &eqdrc,
+ &resample_b,
+ &tovad,
+ &locker,
+ &spdifin_lb,
+ &frddr_d,
+ &toddr_d,
+ &loopback_b,
+ &sm1_clk81_en,
+ &sm1_sysclk_a_div,
+ &sm1_sysclk_a_en,
+ &sm1_sysclk_b_div,
+ &sm1_sysclk_b_en,
+ &earcrx,
+ &sm1_earcrx_cmdc_clk_sel,
+ &sm1_earcrx_cmdc_clk_div,
+ &sm1_earcrx_cmdc_clk,
+ &sm1_earcrx_dmac_clk_sel,
+ &sm1_earcrx_dmac_clk_div,
+ &sm1_earcrx_dmac_clk,
+ &s4_tdm_mclk_pad0_sel,
+ &s4_tdm_mclk_pad1_sel,
+ &s4_tdm_mclk_pad0_div,
+ &s4_tdm_mclk_pad1_div,
+ &s4_tdm_mclk_pad_2,
+ &s4_tdm_mclk_pad2_sel,
+ &s4_tdm_mclk_pad2_div,
+ &s4_tdm_sclk_pad_3,
+ &s4_tdm_sclk_pad_4,
+ &s4_tdm_lrclk_pad_3,
+ &s4_tdm_lrclk_pad_4,
+};
+
struct axg_audio_reset_data {
struct reset_controller_dev rstc;
struct regmap *map;
@@ -1822,7 +2214,6 @@ static int axg_audio_clkc_probe(struct platform_device *pdev)
continue;
name = hw->init->name;
-
ret = devm_clk_hw_register(dev, hw);
if (ret) {
dev_err(dev, "failed to register clock %s\n", name);
@@ -1886,6 +2277,18 @@ static const struct audioclk_data sm1_audioclk_data = {
.max_register = AUDIO_EARCRX_DMAC_CLK_CTRL,
};
+static const struct audioclk_data s4_audioclk_data = {
+ .regmap_clks = s4_clk_regmaps,
+ .regmap_clk_num = ARRAY_SIZE(s4_clk_regmaps),
+ .hw_clks = {
+ .hws = s4_audio_hw_clks,
+ .num = ARRAY_SIZE(s4_audio_hw_clks),
+ },
+ .reset_offset = AUDIO_SM1_SW_RESET0,
+ .reset_num = 39,
+ .max_register = AUDIO_S4_SCLK_PAD_CTRL1,
+};
+
static const struct of_device_id clkc_match_table[] = {
{
.compatible = "amlogic,axg-audio-clkc",
@@ -1896,7 +2299,10 @@ static const struct of_device_id clkc_match_table[] = {
}, {
.compatible = "amlogic,sm1-audio-clkc",
.data = &sm1_audioclk_data
- }, {}
+ }, {
+ .compatible = "amlogic,s4-audio-clkc",
+ .data = &s4_audioclk_data
+ }, { }
};
MODULE_DEVICE_TABLE(of, clkc_match_table);
diff --git a/drivers/clk/meson/axg-audio.h b/drivers/clk/meson/axg-audio.h
index 9e7765b630c96a8029140539ffda789b7db5277a..2dd1c41d775da8f91ed281470d06e9c970cfc92c 100644
--- a/drivers/clk/meson/axg-audio.h
+++ b/drivers/clk/meson/axg-audio.h
@@ -66,5 +66,9 @@
#define AUDIO_CLK81_EN 0x034
#define AUDIO_EARCRX_CMDC_CLK_CTRL 0x0D0
#define AUDIO_EARCRX_DMAC_CLK_CTRL 0x0D4
+#define AUDIO_S4_MCLK_PAD_CTRL0 0xE80
+#define AUDIO_S4_MCLK_PAD_CTRL1 0xE84
+#define AUDIO_S4_SCLK_PAD_CTRL0 0xE88
+#define AUDIO_S4_SCLK_PAD_CTRL1 0xE8C
#endif /*__AXG_AUDIO_CLKC_H */
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v3 5/6] ASoC: meson: s4: Add s4 tocodec driver
2025-02-28 8:04 [PATCH v3 0/6] Add support for S4 audio jiebing chen via B4 Relay
` (3 preceding siblings ...)
2025-02-28 8:04 ` [PATCH v3 4/6] clk: meson: axg-audio: Add the mclk pad div for s4 jiebing chen via B4 Relay
@ 2025-02-28 8:04 ` jiebing chen via B4 Relay
2025-03-06 15:58 ` Jerome Brunet
2025-02-28 8:04 ` [PATCH v3 6/6] arm64: dts: amlogic: Add Amlogic S4 Audio jiebing chen via B4 Relay
2025-02-28 14:23 ` [PATCH v3 0/6] Add support for S4 audio Rob Herring (Arm)
6 siblings, 1 reply; 15+ messages in thread
From: jiebing chen via B4 Relay @ 2025-02-28 8:04 UTC (permalink / raw)
To: Jerome Brunet, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jaroslav Kysela, Takashi Iwai,
Neil Armstrong, Kevin Hilman, Martin Blumenstingl,
Michael Turquette, Stephen Boyd
Cc: linux-sound, devicetree, linux-kernel, linux-arm-kernel,
linux-amlogic, linux-clk, jian.xu, shuai.li, zhe.wang,
jiebing chen
From: jiebing chen <jiebing.chen@amlogic.com>
S4 tocodec support 8 lane to input, It need to enable
bclk and mclk control bit when work
Signed-off-by: jiebing chen <jiebing.chen@amlogic.com>
---
sound/soc/meson/g12a-toacodec.c | 51 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 51 insertions(+)
diff --git a/sound/soc/meson/g12a-toacodec.c b/sound/soc/meson/g12a-toacodec.c
index 531bb8707a3ec4c47814d6a0676d5c62c705da75..41eef9980059285275f0189a06469fc694775955 100644
--- a/sound/soc/meson/g12a-toacodec.c
+++ b/sound/soc/meson/g12a-toacodec.c
@@ -41,6 +41,9 @@
#define CTRL0_BCLK_SEL_LSB 4
#define CTRL0_MCLK_SEL GENMASK(2, 0)
+#define CTRL0_BCLK_ENABLE_SHIFT 30
+#define CTRL0_MCLK_ENABLE_SHIFT 29
+
#define TOACODEC_OUT_CHMAX 2
struct g12a_toacodec {
@@ -129,6 +132,10 @@ static const struct snd_kcontrol_new g12a_toacodec_out_enable =
SOC_DAPM_SINGLE_AUTODISABLE("Switch", TOACODEC_CTRL0,
CTRL0_ENABLE_SHIFT, 1, 0);
+static const struct snd_kcontrol_new s4_toacodec_clk_enable =
+ SOC_DAPM_DOUBLE("Switch", TOACODEC_CTRL0,
+ CTRL0_BCLK_ENABLE_SHIFT, CTRL0_MCLK_ENABLE_SHIFT, 1, 0);
+
static const struct snd_soc_dapm_widget g12a_toacodec_widgets[] = {
SND_SOC_DAPM_MUX("SRC", SND_SOC_NOPM, 0, 0,
&g12a_toacodec_mux),
@@ -143,6 +150,15 @@ static const struct snd_soc_dapm_widget sm1_toacodec_widgets[] = {
&g12a_toacodec_out_enable),
};
+static const struct snd_soc_dapm_widget s4_toacodec_widgets[] = {
+ SND_SOC_DAPM_MUX("SRC", SND_SOC_NOPM, 0, 0,
+ &sm1_toacodec_mux),
+ SND_SOC_DAPM_SWITCH("OUT EN", SND_SOC_NOPM, 0, 0,
+ &g12a_toacodec_out_enable),
+ SND_SOC_DAPM_SWITCH("CLK EN", SND_SOC_NOPM, 0, 0,
+ &s4_toacodec_clk_enable),
+};
+
static int g12a_toacodec_input_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
struct snd_soc_dai *dai)
@@ -228,6 +244,15 @@ static const struct snd_soc_dapm_route g12a_toacodec_routes[] = {
{ "OUT Capture", NULL, "OUT EN" },
};
+static const struct snd_soc_dapm_route s4_toacodec_routes[] = {
+ { "SRC", "I2S A", "IN A Playback" },
+ { "SRC", "I2S B", "IN B Playback" },
+ { "SRC", "I2S C", "IN C Playback" },
+ { "OUT EN", "Switch", "SRC" },
+ { "CLK EN", "Switch", "OUT EN" },
+ { "OUT Capture", NULL, "CLK EN" },
+};
+
static const struct snd_kcontrol_new g12a_toacodec_controls[] = {
SOC_SINGLE("Lane Select", TOACODEC_CTRL0, CTRL0_LANE_SEL, 3, 0),
};
@@ -236,6 +261,10 @@ static const struct snd_kcontrol_new sm1_toacodec_controls[] = {
SOC_SINGLE("Lane Select", TOACODEC_CTRL0, CTRL0_LANE_SEL_SM1, 3, 0),
};
+static const struct snd_kcontrol_new s4_toacodec_controls[] = {
+ SOC_SINGLE("Lane Select", TOACODEC_CTRL0, CTRL0_LANE_SEL_SM1, 7, 0),
+};
+
static const struct snd_soc_component_driver g12a_toacodec_component_drv = {
.probe = g12a_toacodec_component_probe,
.controls = g12a_toacodec_controls,
@@ -258,6 +287,17 @@ static const struct snd_soc_component_driver sm1_toacodec_component_drv = {
.endianness = 1,
};
+static const struct snd_soc_component_driver s4_toacodec_component_drv = {
+ .probe = sm1_toacodec_component_probe,
+ .controls = s4_toacodec_controls,
+ .num_controls = ARRAY_SIZE(s4_toacodec_controls),
+ .dapm_widgets = s4_toacodec_widgets,
+ .num_dapm_widgets = ARRAY_SIZE(s4_toacodec_widgets),
+ .dapm_routes = s4_toacodec_routes,
+ .num_dapm_routes = ARRAY_SIZE(s4_toacodec_routes),
+ .endianness = 1,
+};
+
static const struct regmap_config g12a_toacodec_regmap_cfg = {
.reg_bits = 32,
.val_bits = 32,
@@ -278,6 +318,13 @@ static const struct g12a_toacodec_match_data sm1_toacodec_match_data = {
.field_bclk_sel = REG_FIELD(TOACODEC_CTRL0, 4, 6),
};
+static const struct g12a_toacodec_match_data s4_toacodec_match_data = {
+ .component_drv = &s4_toacodec_component_drv,
+ .field_dat_sel = REG_FIELD(TOACODEC_CTRL0, 19, 20),
+ .field_lrclk_sel = REG_FIELD(TOACODEC_CTRL0, 12, 14),
+ .field_bclk_sel = REG_FIELD(TOACODEC_CTRL0, 4, 6),
+};
+
static const struct of_device_id g12a_toacodec_of_match[] = {
{
.compatible = "amlogic,g12a-toacodec",
@@ -287,6 +334,10 @@ static const struct of_device_id g12a_toacodec_of_match[] = {
.compatible = "amlogic,sm1-toacodec",
.data = &sm1_toacodec_match_data,
},
+ {
+ .compatible = "amlogic,s4-toacodec",
+ .data = &s4_toacodec_match_data,
+ },
{}
};
MODULE_DEVICE_TABLE(of, g12a_toacodec_of_match);
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v3 6/6] arm64: dts: amlogic: Add Amlogic S4 Audio
2025-02-28 8:04 [PATCH v3 0/6] Add support for S4 audio jiebing chen via B4 Relay
` (4 preceding siblings ...)
2025-02-28 8:04 ` [PATCH v3 5/6] ASoC: meson: s4: Add s4 tocodec driver jiebing chen via B4 Relay
@ 2025-02-28 8:04 ` jiebing chen via B4 Relay
2025-02-28 14:23 ` [PATCH v3 0/6] Add support for S4 audio Rob Herring (Arm)
6 siblings, 0 replies; 15+ messages in thread
From: jiebing chen via B4 Relay @ 2025-02-28 8:04 UTC (permalink / raw)
To: Jerome Brunet, Liam Girdwood, Mark Brown, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jaroslav Kysela, Takashi Iwai,
Neil Armstrong, Kevin Hilman, Martin Blumenstingl,
Michael Turquette, Stephen Boyd
Cc: linux-sound, devicetree, linux-kernel, linux-arm-kernel,
linux-amlogic, linux-clk, jian.xu, shuai.li, zhe.wang,
jiebing chen
From: jiebing chen <jiebing.chen@amlogic.com>
Add basic audio driver support for the Amlogic S4 based
Amlogic AQ222 board. Use hifipll pll (1179648000) to
support 768k sample rate and 24 bit (s24_le), 24bit sclk
is 48fs. Use mpll0 (270950400) to support 705.6k sample
rate and 32bit. Use mpll1 (338688000) to support 705.6k
and 24bit.
Signed-off-by: jiebing chen <jiebing.chen@amlogic.com>
---
.../boot/dts/amlogic/meson-s4-s805x2-aq222.dts | 219 ++++++++++++
arch/arm64/boot/dts/amlogic/meson-s4.dtsi | 371 ++++++++++++++++++++-
2 files changed, 588 insertions(+), 2 deletions(-)
diff --git a/arch/arm64/boot/dts/amlogic/meson-s4-s805x2-aq222.dts b/arch/arm64/boot/dts/amlogic/meson-s4-s805x2-aq222.dts
index 6730c44642d2910d42ec0c4adf49fefc3514dbec..6fccaeb0e151e959af1cbe04d9dca50d70f0b7fc 100644
--- a/arch/arm64/boot/dts/amlogic/meson-s4-s805x2-aq222.dts
+++ b/arch/arm64/boot/dts/amlogic/meson-s4-s805x2-aq222.dts
@@ -75,6 +75,19 @@ vddio_ao1v8: regulator-vddio-ao1v8 {
regulator-always-on;
};
+ vcc5v_reg: regulator-vcc-5v {
+ compatible = "regulator-fixed";
+ vin-supply = <&main_12v>;
+ regulator-name = "VCC5V";
+ regulator-min-microvolt = <5000000>;
+ regulator-max-microvolt = <5000000>;
+ gpio = <&gpio GPIOH_7 GPIO_ACTIVE_HIGH>;
+ startup-delay-us = <7000>;
+ enable-active-high;
+ regulator-boot-on;
+ regulator-always-on;
+ };
+
/* SY8120B1ABC DC/DC Regulator. */
vddcpu: regulator-vddcpu {
compatible = "pwm-regulator";
@@ -129,6 +142,212 @@ vddcpu: regulator-vddcpu {
<699000 98>,
<689000 100>;
};
+ dmics: audio-codec-1 {
+ compatible = "dmic-codec";
+ #sound-dai-cells = <0>;
+ num-channels = <2>;
+ wakeup-delay-ms = <50>;
+ sound-name-prefix = "MIC";
+ };
+
+ dioo2133: audio-amplifier-0 {
+ compatible = "simple-audio-amplifier";
+ enable-gpios = <&gpio GPIOH_8 GPIO_ACTIVE_HIGH>;
+ VCC-supply = <&vcc5v_reg>;
+ sound-name-prefix = "10U2";
+ };
+
+ spdif_dir: audio-spdif-in {
+ compatible = "linux,spdif-dir";
+ #sound-dai-cells = <0>;
+ sound-name-prefix = "DIR";
+ };
+
+ spdif_dit: audio-spdif-out {
+ compatible = "linux,spdif-dit";
+ #sound-dai-cells = <0>;
+ sound-name-prefix = "DIT";
+ };
+
+ sound {
+ compatible = "amlogic,axg-sound-card";
+ model = "aq222";
+ audio-widgets = "Line", "Lineout";
+ audio-aux-devs = <&tdmout_a>, <&tdmout_b>, <&tdmout_c>,
+ <&tdmin_a>, <&tdmin_b>, <&tdmin_c>,
+ <&tdmin_lb>, <&dioo2133>;
+ audio-routing = "TDMOUT_A IN 0", "FRDDR_A OUT 0",
+ "TDMOUT_A IN 1", "FRDDR_B OUT 0",
+ "TDMOUT_A IN 2", "FRDDR_C OUT 0",
+ "TDM_A Playback", "TDMOUT_A OUT",
+ "TDMOUT_B IN 0", "FRDDR_A OUT 1",
+ "TDMOUT_B IN 1", "FRDDR_B OUT 1",
+ "TDMOUT_B IN 2", "FRDDR_C OUT 1",
+ "TDM_B Playback", "TDMOUT_B OUT",
+ "TDMOUT_C IN 0", "FRDDR_A OUT 2",
+ "TDMOUT_C IN 1", "FRDDR_B OUT 2",
+ "TDMOUT_C IN 2", "FRDDR_C OUT 2",
+ "TDM_C Playback", "TDMOUT_C OUT",
+ "SPDIFOUT_A IN 0", "FRDDR_A OUT 3",
+ "SPDIFOUT_A IN 1", "FRDDR_B OUT 3",
+ "SPDIFOUT_A IN 2", "FRDDR_C OUT 3",
+ "SPDIFOUT_B IN 0", "FRDDR_A OUT 4",
+ "SPDIFOUT_B IN 1", "FRDDR_B OUT 4",
+ "SPDIFOUT_B IN 2", "FRDDR_C OUT 4",
+ "TDMIN_A IN 0", "TDM_A Capture",
+ "TDMIN_A IN 1", "TDM_B Capture",
+ "TDMIN_A IN 2", "TDM_C Capture",
+ "TDMIN_A IN 3", "TDM_A Loopback",
+ "TDMIN_A IN 4", "TDM_B Loopback",
+ "TDMIN_A IN 5", "TDM_C Loopback",
+ "TDMIN_B IN 0", "TDM_A Capture",
+ "TDMIN_B IN 1", "TDM_B Capture",
+ "TDMIN_B IN 2", "TDM_C Capture",
+ "TDMIN_B IN 3", "TDM_A Loopback",
+ "TDMIN_B IN 4", "TDM_B Loopback",
+ "TDMIN_B IN 5", "TDM_C Loopback",
+ "TDMIN_C IN 0", "TDM_A Capture",
+ "TDMIN_C IN 1", "TDM_B Capture",
+ "TDMIN_C IN 2", "TDM_C Capture",
+ "TDMIN_C IN 3", "TDM_A Loopback",
+ "TDMIN_C IN 4", "TDM_B Loopback",
+ "TDMIN_C IN 5", "TDM_C Loopback",
+ "TDMIN_LB IN 3", "TDM_A Capture",
+ "TDMIN_LB IN 4", "TDM_B Capture",
+ "TDMIN_LB IN 5", "TDM_C Capture",
+ "TDMIN_LB IN 0", "TDM_A Loopback",
+ "TDMIN_LB IN 1", "TDM_B Loopback",
+ "TDMIN_LB IN 2", "TDM_C Loopback",
+ "TODDR_A IN 0", "TDMIN_A OUT",
+ "TODDR_B IN 0", "TDMIN_A OUT",
+ "TODDR_C IN 0", "TDMIN_A OUT",
+ "TODDR_A IN 1", "TDMIN_B OUT",
+ "TODDR_B IN 1", "TDMIN_B OUT",
+ "TODDR_C IN 1", "TDMIN_B OUT",
+ "TODDR_A IN 2", "TDMIN_C OUT",
+ "TODDR_B IN 2", "TDMIN_C OUT",
+ "TODDR_C IN 2", "TDMIN_C OUT",
+ "TODDR_A IN 3", "SPDIFIN Capture",
+ "TODDR_B IN 3", "SPDIFIN Capture",
+ "TODDR_C IN 3", "SPDIFIN Capture",
+ "TODDR_A IN 6", "TDMIN_LB OUT",
+ "TODDR_B IN 6", "TDMIN_LB OUT",
+ "TODDR_C IN 6", "TDMIN_LB OUT",
+ "10U2 INL", "ACODEC LOLP",
+ "10U2 INR", "ACODEC LORP",
+ "Lineout", "10U2 OUTL",
+ "Lineout", "10U2 OUTR";
+ assigned-clocks = <&clkc_pll CLKID_HIFI_PLL>,
+ <&clkc_pll CLKID_MPLL0>,
+ <&clkc_pll CLKID_MPLL1>;
+ assigned-clock-rates = <1179648000>,
+ <270950400>,
+ <338688000>;
+
+ dai-link-0 {
+ sound-dai = <&frddr_a>;
+ };
+
+ dai-link-1 {
+ sound-dai = <&frddr_b>;
+ };
+
+ dai-link-2 {
+ sound-dai = <&frddr_c>;
+ };
+
+ dai-link-3 {
+ sound-dai = <&toddr_a>;
+ };
+
+ dai-link-4 {
+ sound-dai = <&toddr_b>;
+ };
+
+ dai-link-5 {
+ sound-dai = <&toddr_c>;
+ };
+
+ dai-link-6 {
+ sound-dai = <&tdmif_a>;
+ dai-format = "i2s";
+ dai-tdm-slot-tx-mask-0 = <1 1>;
+ mclk-fs = <256>;
+ codec-0 {
+ sound-dai = <&tohdmitx TOHDMITX_I2S_IN_A>;
+ };
+ codec-1 {
+ sound-dai = <&toacodec TOACODEC_IN_A>;
+ };
+ };
+
+ dai-link-7 {
+ sound-dai = <&tdmif_b>;
+ dai-format = "i2s";
+ dai-tdm-slot-tx-mask-0 = <1 1>;
+ mclk-fs = <256>;
+ codec-0 {
+ sound-dai = <&toacodec TOACODEC_IN_B>;
+ };
+ codec-1 {
+ sound-dai = <&tohdmitx TOHDMITX_I2S_IN_B>;
+ };
+ };
+
+ /* 8ch HDMI interface */
+ dai-link-8 {
+ sound-dai = <&tdmif_c>;
+ dai-format = "i2s";
+ dai-tdm-slot-tx-mask-0 = <1 1>;
+ dai-tdm-slot-tx-mask-1 = <1 1>;
+ dai-tdm-slot-tx-mask-2 = <1 1>;
+ dai-tdm-slot-tx-mask-3 = <1 1>;
+ mclk-fs = <256>;
+ codec-0 {
+ sound-dai = <&tohdmitx TOHDMITX_I2S_IN_C>;
+ };
+ };
+
+ /* spdif hdmi and coax output */
+ dai-link-9 {
+ sound-dai = <&spdifout_a>;
+
+ codec-0 {
+ sound-dai = <&spdif_dit>;
+ };
+
+ codec-1 {
+ sound-dai = <&tohdmitx TOHDMITX_SPDIF_IN_A>;
+ };
+ };
+
+ /* spdif hdmi interface */
+ dai-link-10 {
+ sound-dai = <&spdifout_b>;
+
+ codec {
+ sound-dai = <&tohdmitx TOHDMITX_SPDIF_IN_B>;
+ };
+ };
+
+ /* spdif coax input */
+ dai-link-11 {
+ sound-dai = <&spdifin>;
+
+ codec {
+ sound-dai = <&spdif_dir>;
+ };
+ };
+
+ dai-link-12 {
+ sound-dai = <&toacodec TOACODEC_OUT>;
+
+ codec {
+ sound-dai = <&acodec>;
+ };
+ };
+ };
+
};
&pwm_ef {
diff --git a/arch/arm64/boot/dts/amlogic/meson-s4.dtsi b/arch/arm64/boot/dts/amlogic/meson-s4.dtsi
index 957577d986c0675a503115e1ccbc4387c2051620..f695bbb2512c927b2df24d7bf05fac205c05b14e 100644
--- a/arch/arm64/boot/dts/amlogic/meson-s4.dtsi
+++ b/arch/arm64/boot/dts/amlogic/meson-s4.dtsi
@@ -11,7 +11,11 @@
#include <dt-bindings/clock/amlogic,s4-peripherals-clkc.h>
#include <dt-bindings/power/meson-s4-power.h>
#include <dt-bindings/reset/amlogic,meson-s4-reset.h>
-
+#include <dt-bindings/clock/axg-audio-clkc.h>
+#include <dt-bindings/reset/amlogic,meson-axg-audio-arb.h>
+#include <dt-bindings/reset/amlogic,meson-g12a-audio-reset.h>
+#include <dt-bindings/sound/meson-g12a-toacodec.h>
+#include <dt-bindings/sound/meson-g12a-tohdmitx.h>
/ {
cpus {
#address-cells = <2>;
@@ -46,6 +50,36 @@ cpu3: cpu@3 {
};
};
+ tdmif_a: audio-controller-0 {
+ compatible = "amlogic,axg-tdm-iface";
+ #sound-dai-cells = <0>;
+ sound-name-prefix = "TDM_A";
+ clocks = <&clkc_audio AUD_CLKID_MST_A_MCLK>,
+ <&clkc_audio AUD_CLKID_MST_A_SCLK>,
+ <&clkc_audio AUD_CLKID_MST_A_LRCLK>;
+ clock-names = "mclk", "sclk", "lrclk";
+ };
+
+ tdmif_b: audio-controller-1 {
+ compatible = "amlogic,axg-tdm-iface";
+ #sound-dai-cells = <0>;
+ sound-name-prefix = "TDM_B";
+ clocks = <&clkc_audio AUD_CLKID_MST_B_MCLK>,
+ <&clkc_audio AUD_CLKID_MST_B_SCLK>,
+ <&clkc_audio AUD_CLKID_MST_B_LRCLK>;
+ clock-names = "mclk", "sclk", "lrclk";
+ };
+
+ tdmif_c: audio-controller-2 {
+ compatible = "amlogic,axg-tdm-iface";
+ #sound-dai-cells = <0>;
+ sound-name-prefix = "TDM_C";
+ clocks = <&clkc_audio AUD_CLKID_MST_C_MCLK>,
+ <&clkc_audio AUD_CLKID_MST_C_SCLK>,
+ <&clkc_audio AUD_CLKID_MST_C_LRCLK>;
+ clock-names = "mclk", "sclk", "lrclk";
+ };
+
timer {
compatible = "arm,armv8-timer";
interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
@@ -101,7 +135,6 @@ apb4: bus@fe000000 {
#address-cells = <2>;
#size-cells = <2>;
ranges = <0x0 0x0 0x0 0xfe000000 0x0 0x480000>;
-
clkc_periphs: clock-controller@0 {
compatible = "amlogic,s4-peripherals-clkc";
reg = <0x0 0x0 0x0 0x49c>;
@@ -134,6 +167,17 @@ clkc_pll: clock-controller@8000 {
#clock-cells = <1>;
};
+ acodec: audio-controller@1a000 {
+ compatible = "amlogic,t9015";
+ reg = <0x0 0x1A000 0x0 0x14>;
+ #sound-dai-cells = <0>;
+ sound-name-prefix = "ACODEC";
+ clocks = <&clkc_periphs CLKID_ACODEC>;
+ clock-names = "pclk";
+ resets = <&reset RESET_ACODEC>;
+ AVDD-supply = <&vddio_ao1v8>;
+ };
+
watchdog@2100 {
compatible = "amlogic,s4-wdt", "amlogic,t7-wdt";
reg = <0x0 0x2100 0x0 0x10>;
@@ -850,3 +894,326 @@ emmc: mmc@fe08c000 {
};
};
};
+
+&apb4 {
+ audio: bus@330000 {
+ compatible = "simple-bus";
+ reg = <0x0 0x330000 0x0 0x1000>;
+ #address-cells = <2>;
+ #size-cells = <2>;
+ ranges = <0x0 0x0 0x0 0x330000 0x0 0x1000>;
+
+ clkc_audio: clock-controller@0 {
+ compatible = "amlogic,s4-audio-clkc";
+ reg = <0x0 0x0 0x0 0xb4>;
+ #clock-cells = <1>;
+ #reset-cells = <1>;
+ power-domains = <&pwrc PWRC_S4_AUDIO_ID>;
+ clocks = <&clkc_periphs CLKID_AUDIO>,
+ <&clkc_pll CLKID_MPLL0>,
+ <&clkc_pll CLKID_MPLL1>,
+ <&clkc_pll CLKID_MPLL2>,
+ <&clkc_pll CLKID_MPLL3>,
+ <&clkc_pll CLKID_HIFI_PLL>,
+ <&clkc_pll CLKID_FCLK_DIV3>,
+ <&clkc_pll CLKID_FCLK_DIV4>,
+ <&clkc_pll CLKID_FCLK_DIV5>;
+ clock-names = "pclk",
+ "mst_in0",
+ "mst_in1",
+ "mst_in2",
+ "mst_in3",
+ "mst_in4",
+ "mst_in5",
+ "mst_in6",
+ "mst_in7";
+
+ resets = <&reset RESET_AUDIO>;
+ };
+
+ toddr_a: audio-controller@100 {
+ compatible = "amlogic,sm1-toddr",
+ "amlogic,axg-toddr";
+ reg = <0x0 0x100 0x0 0x2c>;
+ #sound-dai-cells = <0>;
+ sound-name-prefix = "TODDR_A";
+ interrupts = <GIC_SPI 32 IRQ_TYPE_EDGE_RISING>;
+ clocks = <&clkc_audio AUD_CLKID_TODDR_A>;
+ resets = <&arb AXG_ARB_TODDR_A>,
+ <&clkc_audio AUD_RESET_TODDR_A>;
+ reset-names = "arb", "rst";
+ amlogic,fifo-depth = <8192>;
+ };
+
+ toddr_b: audio-controller@140 {
+ compatible = "amlogic,sm1-toddr",
+ "amlogic,axg-toddr";
+ reg = <0x0 0x140 0x0 0x2c>;
+ #sound-dai-cells = <0>;
+ sound-name-prefix = "TODDR_B";
+ interrupts = <GIC_SPI 33 IRQ_TYPE_EDGE_RISING>;
+ clocks = <&clkc_audio AUD_CLKID_TODDR_B>;
+ resets = <&arb AXG_ARB_TODDR_B>,
+ <&clkc_audio AUD_RESET_TODDR_B>;
+ reset-names = "arb", "rst";
+ amlogic,fifo-depth = <256>;
+ };
+
+ toddr_c: audio-controller@180 {
+ compatible = "amlogic,sm1-toddr",
+ "amlogic,axg-toddr";
+ reg = <0x0 0x180 0x0 0x2c>;
+ #sound-dai-cells = <0>;
+ sound-name-prefix = "TODDR_C";
+ interrupts = <GIC_SPI 34 IRQ_TYPE_EDGE_RISING>;
+ clocks = <&clkc_audio AUD_CLKID_TODDR_C>;
+ resets = <&arb AXG_ARB_TODDR_C>,
+ <&clkc_audio AUD_RESET_TODDR_C>;
+ reset-names = "arb", "rst";
+ amlogic,fifo-depth = <256>;
+ };
+
+ frddr_a: audio-controller@1c0 {
+ compatible = "amlogic,sm1-frddr",
+ "amlogic,axg-frddr";
+ reg = <0x0 0x1c0 0x0 0x2c>;
+ #sound-dai-cells = <0>;
+ sound-name-prefix = "FRDDR_A";
+ interrupts = <GIC_SPI 36 IRQ_TYPE_EDGE_RISING>;
+ clocks = <&clkc_audio AUD_CLKID_FRDDR_A>;
+ resets = <&arb AXG_ARB_FRDDR_A>,
+ <&clkc_audio AUD_RESET_FRDDR_A>;
+ reset-names = "arb", "rst";
+ amlogic,fifo-depth = <512>;
+ };
+
+ frddr_b: audio-controller@200 {
+ compatible = "amlogic,sm1-frddr",
+ "amlogic,axg-frddr";
+ reg = <0x0 0x200 0x0 0x2c>;
+ #sound-dai-cells = <0>;
+ sound-name-prefix = "FRDDR_B";
+ interrupts = <GIC_SPI 37 IRQ_TYPE_EDGE_RISING>;
+ clocks = <&clkc_audio AUD_CLKID_FRDDR_B>;
+ resets = <&arb AXG_ARB_FRDDR_B>,
+ <&clkc_audio AUD_RESET_FRDDR_B>;
+ reset-names = "arb", "rst";
+ amlogic,fifo-depth = <256>;
+ };
+
+ frddr_c: audio-controller@240 {
+ compatible = "amlogic,sm1-frddr",
+ "amlogic,axg-frddr";
+ reg = <0x0 0x240 0x0 0x2c>;
+ #sound-dai-cells = <0>;
+ sound-name-prefix = "FRDDR_C";
+ interrupts = <GIC_SPI 38 IRQ_TYPE_EDGE_RISING>;
+ clocks = <&clkc_audio AUD_CLKID_FRDDR_C>;
+ resets = <&arb AXG_ARB_FRDDR_C>,
+ <&clkc_audio AUD_RESET_FRDDR_C>;
+ reset-names = "arb", "rst";
+ amlogic,fifo-depth = <256>;
+ };
+
+ arb: reset-controller@280 {
+ compatible = "amlogic,meson-sm1-audio-arb";
+ reg = <0x0 0x280 0x0 0x4>;
+ #reset-cells = <1>;
+ clocks = <&clkc_audio AUD_CLKID_DDR_ARB>;
+ };
+
+ tdmin_a: audio-controller@300 {
+ compatible = "amlogic,sm1-tdmin";
+ reg = <0x0 0x300 0x0 0x40>;
+ sound-name-prefix = "TDMIN_A";
+ resets = <&clkc_audio AUD_RESET_TDMIN_A>;
+ clocks = <&clkc_audio AUD_CLKID_TDMIN_A>,
+ <&clkc_audio AUD_CLKID_TDMIN_A_SCLK>,
+ <&clkc_audio AUD_CLKID_TDMIN_A_SCLK_SEL>,
+ <&clkc_audio AUD_CLKID_TDMIN_A_LRCLK>,
+ <&clkc_audio AUD_CLKID_TDMIN_A_LRCLK>;
+ clock-names = "pclk", "sclk", "sclk_sel",
+ "lrclk", "lrclk_sel";
+ };
+
+ tdmin_b: audio-controller@340 {
+ compatible = "amlogic,sm1-tdmin";
+ reg = <0x0 0x340 0x0 0x40>;
+ sound-name-prefix = "TDMIN_B";
+ resets = <&clkc_audio AUD_RESET_TDMIN_B>;
+ clocks = <&clkc_audio AUD_CLKID_TDMIN_B>,
+ <&clkc_audio AUD_CLKID_TDMIN_B_SCLK>,
+ <&clkc_audio AUD_CLKID_TDMIN_B_SCLK_SEL>,
+ <&clkc_audio AUD_CLKID_TDMIN_B_LRCLK>,
+ <&clkc_audio AUD_CLKID_TDMIN_B_LRCLK>;
+ clock-names = "pclk", "sclk", "sclk_sel",
+ "lrclk", "lrclk_sel";
+ };
+
+ tdmin_c: audio-controller@380 {
+ compatible = "amlogic,sm1-tdmin";
+ reg = <0x0 0x380 0x0 0x40>;
+ sound-name-prefix = "TDMIN_C";
+ resets = <&clkc_audio AUD_RESET_TDMIN_C>;
+ clocks = <&clkc_audio AUD_CLKID_TDMIN_C>,
+ <&clkc_audio AUD_CLKID_TDMIN_C_SCLK>,
+ <&clkc_audio AUD_CLKID_TDMIN_C_SCLK_SEL>,
+ <&clkc_audio AUD_CLKID_TDMIN_C_LRCLK>,
+ <&clkc_audio AUD_CLKID_TDMIN_C_LRCLK>;
+ clock-names = "pclk", "sclk", "sclk_sel",
+ "lrclk", "lrclk_sel";
+ };
+
+ tdmin_lb: audio-controller@3c0 {
+ compatible = "amlogic,sm1-tdmin";
+ reg = <0x0 0x3c0 0x0 0x40>;
+ sound-name-prefix = "TDMIN_LB";
+ resets = <&clkc_audio AUD_RESET_TDMIN_LB>;
+ clocks = <&clkc_audio AUD_CLKID_TDMIN_LB>,
+ <&clkc_audio AUD_CLKID_TDMIN_LB_SCLK>,
+ <&clkc_audio AUD_CLKID_TDMIN_LB_SCLK_SEL>,
+ <&clkc_audio AUD_CLKID_TDMIN_LB_LRCLK>,
+ <&clkc_audio AUD_CLKID_TDMIN_LB_LRCLK>;
+ clock-names = "pclk", "sclk", "sclk_sel",
+ "lrclk", "lrclk_sel";
+ };
+
+ spdifin: audio-controller@400 {
+ compatible = "amlogic,g12a-spdifin",
+ "amlogic,axg-spdifin";
+ reg = <0x0 0x400 0x0 0x30>;
+ #sound-dai-cells = <0>;
+ sound-name-prefix = "SPDIFIN";
+ interrupts = <GIC_SPI 151 IRQ_TYPE_EDGE_RISING>;
+ clocks = <&clkc_audio AUD_CLKID_SPDIFIN>,
+ <&clkc_audio AUD_CLKID_SPDIFIN_CLK>;
+ clock-names = "pclk", "refclk";
+ resets = <&clkc_audio AUD_RESET_SPDIFIN>;
+ };
+
+ spdifout_a: audio-controller@480 {
+ compatible = "amlogic,g12a-spdifout",
+ "amlogic,axg-spdifout";
+ reg = <0x0 0x480 0x0 0x50>;
+ #sound-dai-cells = <0>;
+ sound-name-prefix = "SPDIFOUT_A";
+ clocks = <&clkc_audio AUD_CLKID_SPDIFOUT>,
+ <&clkc_audio AUD_CLKID_SPDIFOUT_CLK>;
+ clock-names = "pclk", "mclk";
+ resets = <&clkc_audio AUD_RESET_SPDIFOUT>;
+ };
+
+ tdmout_a: audio-controller@500 {
+ compatible = "amlogic,sm1-tdmout";
+ reg = <0x0 0x500 0x0 0x40>;
+ sound-name-prefix = "TDMOUT_A";
+ resets = <&clkc_audio AUD_RESET_TDMOUT_A>;
+ clocks = <&clkc_audio AUD_CLKID_TDMOUT_A>,
+ <&clkc_audio AUD_CLKID_TDMOUT_A_SCLK>,
+ <&clkc_audio AUD_CLKID_TDMOUT_A_SCLK_SEL>,
+ <&clkc_audio AUD_CLKID_TDMOUT_A_LRCLK>,
+ <&clkc_audio AUD_CLKID_TDMOUT_A_LRCLK>;
+ clock-names = "pclk", "sclk", "sclk_sel",
+ "lrclk", "lrclk_sel";
+ };
+
+ tdmout_b: audio-controller@540 {
+ compatible = "amlogic,sm1-tdmout";
+ reg = <0x0 0x540 0x0 0x40>;
+ sound-name-prefix = "TDMOUT_B";
+ resets = <&clkc_audio AUD_RESET_TDMOUT_B>;
+ clocks = <&clkc_audio AUD_CLKID_TDMOUT_B>,
+ <&clkc_audio AUD_CLKID_TDMOUT_B_SCLK>,
+ <&clkc_audio AUD_CLKID_TDMOUT_B_SCLK_SEL>,
+ <&clkc_audio AUD_CLKID_TDMOUT_B_LRCLK>,
+ <&clkc_audio AUD_CLKID_TDMOUT_B_LRCLK>;
+ clock-names = "pclk", "sclk", "sclk_sel",
+ "lrclk", "lrclk_sel";
+ };
+
+ tdmout_c: audio-controller@580 {
+ compatible = "amlogic,sm1-tdmout";
+ reg = <0x0 0x580 0x0 0x40>;
+ sound-name-prefix = "TDMOUT_C";
+ resets = <&clkc_audio AUD_RESET_TDMOUT_C>;
+ clocks = <&clkc_audio AUD_CLKID_TDMOUT_C>,
+ <&clkc_audio AUD_CLKID_TDMOUT_C_SCLK>,
+ <&clkc_audio AUD_CLKID_TDMOUT_C_SCLK_SEL>,
+ <&clkc_audio AUD_CLKID_TDMOUT_C_LRCLK>,
+ <&clkc_audio AUD_CLKID_TDMOUT_C_LRCLK>;
+ clock-names = "pclk", "sclk", "sclk_sel",
+ "lrclk", "lrclk_sel";
+ };
+
+ spdifout_b: audio-controller@680 {
+ compatible = "amlogic,g12a-spdifout",
+ "amlogic,axg-spdifout";
+ reg = <0x0 0x680 0x0 0x50>;
+ #sound-dai-cells = <0>;
+ sound-name-prefix = "SPDIFOUT_B";
+ clocks = <&clkc_audio AUD_CLKID_SPDIFOUT_B>,
+ <&clkc_audio AUD_CLKID_SPDIFOUT_B_CLK>;
+ clock-names = "pclk", "mclk";
+ resets = <&clkc_audio AUD_RESET_SPDIFOUT_B>;
+ };
+
+ toacodec: audio-controller@740 {
+ compatible = "amlogic,s4-toacodec",
+ "amlogic,g12a-toacodec";
+ reg = <0x0 0x740 0x0 0x4>;
+ sound-name-prefix = "TOACODEC";
+ #sound-dai-cells = <1>;
+ resets = <&clkc_audio AUD_RESET_TOACODEC>;
+ };
+
+ tohdmitx: audio-controller@744 {
+ compatible = "amlogic,sm1-tohdmitx",
+ "amlogic,g12a-tohdmitx";
+ reg = <0x0 0x744 0x0 0x4>;
+ #sound-dai-cells = <1>;
+ sound-name-prefix = "TOHDMITX";
+ resets = <&clkc_audio AUD_RESET_TOHDMITX>;
+ };
+
+ toddr_d: audio-controller@840 {
+ compatible = "amlogic,sm1-toddr",
+ "amlogic,axg-toddr";
+ reg = <0x0 0x840 0x0 0x2c>;
+ #sound-dai-cells = <0>;
+ sound-name-prefix = "TODDR_D";
+ interrupts = <GIC_SPI 45 IRQ_TYPE_EDGE_RISING>;
+ clocks = <&clkc_audio AUD_CLKID_TODDR_D>;
+ resets = <&arb AXG_ARB_TODDR_D>,
+ <&clkc_audio AUD_RESET_TODDR_D>;
+ reset-names = "arb", "rst";
+ amlogic,fifo-depth = <256>;
+ };
+
+ frddr_d: audio-controller@880 {
+ compatible = "amlogic,sm1-frddr",
+ "amlogic,axg-frddr";
+ reg = <0x0 0x880 0x0 0x2c>;
+ #sound-dai-cells = <0>;
+ sound-name-prefix = "FRDDR_D";
+ interrupts = <GIC_SPI 46 IRQ_TYPE_EDGE_RISING>;
+ clocks = <&clkc_audio AUD_CLKID_FRDDR_D>;
+ resets = <&arb AXG_ARB_FRDDR_D>,
+ <&clkc_audio AUD_RESET_FRDDR_D>;
+ reset-names = "arb", "rst";
+ amlogic,fifo-depth = <256>;
+ };
+ };
+
+ pdm: audio-controller@331000 {
+ compatible = "amlogic,sm1-pdm",
+ "amlogic,axg-pdm";
+ reg = <0x0 0x331000 0x0 0x34>;
+ #sound-dai-cells = <0>;
+ sound-name-prefix = "PDM";
+ clocks = <&clkc_audio AUD_CLKID_PDM>,
+ <&clkc_audio AUD_CLKID_PDM_DCLK>,
+ <&clkc_audio AUD_CLKID_PDM_SYSCLK>;
+ clock-names = "pclk", "dclk", "sysclk";
+ resets = <&clkc_audio AUD_RESET_PDM>;
+ };
+};
--
2.43.0
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH v3 0/6] Add support for S4 audio
2025-02-28 8:04 [PATCH v3 0/6] Add support for S4 audio jiebing chen via B4 Relay
` (5 preceding siblings ...)
2025-02-28 8:04 ` [PATCH v3 6/6] arm64: dts: amlogic: Add Amlogic S4 Audio jiebing chen via B4 Relay
@ 2025-02-28 14:23 ` Rob Herring (Arm)
6 siblings, 0 replies; 15+ messages in thread
From: Rob Herring (Arm) @ 2025-02-28 14:23 UTC (permalink / raw)
To: jiebing chen
Cc: Michael Turquette, linux-amlogic, Jaroslav Kysela,
linux-arm-kernel, Krzysztof Kozlowski, devicetree, linux-sound,
zhe.wang, Martin Blumenstingl, jian.xu, Liam Girdwood,
Stephen Boyd, Jerome Brunet, linux-clk, Mark Brown, Conor Dooley,
Kevin Hilman, shuai.li, linux-kernel, Takashi Iwai,
Neil Armstrong
On Fri, 28 Feb 2025 16:04:08 +0800, jiebing chen wrote:
> Add s4 audio base driver.
>
> Signed-off-by: jiebing chen <jiebing.chen@amlogic.com>
> ---
> Changes in v3:
> - remove g12a tocodec switch event
> - Modify the incorrect title for dt-bindings
> - Link to v2: https://lore.kernel.org/r/20250214-audio_drvier-v2-0-37881fa37c9e@amlogic.com
>
> Changes in v2:
> - remove tdm pad control and change tocodec base on g12a
> - change hifipll rate to support 24bit
> - add s4 audio clock
> - Link to v1: https://lore.kernel.org/r/20250113-audio_drvier-v1-0-8c14770f38a0@amlogic.com
>
> ---
> jiebing chen (6):
> dt-bindings: clock: meson: Add audio power domain for s4 soc
> dt-bindings: clock: axg-audio: Add mclk and sclk pad clock ids
> dt-bindings: Asoc: axg-audio: Add s4 audio tocodec
> clk: meson: axg-audio: Add the mclk pad div for s4
> ASoC: meson: s4: Add s4 tocodec driver
> arm64: dts: amlogic: Add Amlogic S4 Audio
>
> .../bindings/clock/amlogic,axg-audio-clkc.yaml | 18 +
> .../bindings/sound/amlogic,g12a-toacodec.yaml | 1 +
> .../boot/dts/amlogic/meson-s4-s805x2-aq222.dts | 219 +++++++++++
> arch/arm64/boot/dts/amlogic/meson-s4.dtsi | 371 ++++++++++++++++++-
> drivers/clk/meson/axg-audio.c | 410 ++++++++++++++++++++-
> drivers/clk/meson/axg-audio.h | 4 +
> include/dt-bindings/clock/axg-audio-clkc.h | 11 +
> sound/soc/meson/g12a-toacodec.c | 51 +++
> 8 files changed, 1081 insertions(+), 4 deletions(-)
> ---
> base-commit: 6ecd20965bdc21b265a0671ccf36d9ad8043f5ab
> change-id: 20250110-audio_drvier-07a5381c494b
>
> Best regards,
> --
> jiebing chen <jiebing.chen@amlogic.com>
>
>
>
My bot found new DTB warnings on the .dts files added or changed in this
series.
Some warnings may be from an existing SoC .dtsi. Or perhaps the warnings
are fixed by another series. Ultimately, it is up to the platform
maintainer whether these warnings are acceptable or not. No need to reply
unless the platform maintainer has comments.
If you already ran DT checks and didn't see these error(s), then
make sure dt-schema is up to date:
pip3 install dtschema --upgrade
New warnings running 'make CHECK_DTBS=y for arch/arm64/boot/dts/amlogic/' for 20250228-audio_drvier-v3-0-dbfd30507e4c@amlogic.com:
arch/arm64/boot/dts/amlogic/meson-s4-s805x2-aq222.dtb: audio-controller-0: clock-names:0: 'sclk' was expected
from schema $id: http://devicetree.org/schemas/sound/amlogic,axg-tdm-iface.yaml#
arch/arm64/boot/dts/amlogic/meson-s4-s805x2-aq222.dtb: audio-controller-0: clock-names:1: 'lrclk' was expected
from schema $id: http://devicetree.org/schemas/sound/amlogic,axg-tdm-iface.yaml#
arch/arm64/boot/dts/amlogic/meson-s4-s805x2-aq222.dtb: audio-controller-0: clock-names:2: 'mclk' was expected
from schema $id: http://devicetree.org/schemas/sound/amlogic,axg-tdm-iface.yaml#
arch/arm64/boot/dts/amlogic/meson-s4-s805x2-aq222.dtb: audio-controller-0: Unevaluated properties are not allowed ('clock-names' was unexpected)
from schema $id: http://devicetree.org/schemas/sound/amlogic,axg-tdm-iface.yaml#
arch/arm64/boot/dts/amlogic/meson-s4-s805x2-aq222.dtb: audio-controller-1: clock-names:0: 'sclk' was expected
from schema $id: http://devicetree.org/schemas/sound/amlogic,axg-tdm-iface.yaml#
arch/arm64/boot/dts/amlogic/meson-s4-s805x2-aq222.dtb: audio-controller-1: clock-names:1: 'lrclk' was expected
from schema $id: http://devicetree.org/schemas/sound/amlogic,axg-tdm-iface.yaml#
arch/arm64/boot/dts/amlogic/meson-s4-s805x2-aq222.dtb: audio-controller-1: clock-names:2: 'mclk' was expected
from schema $id: http://devicetree.org/schemas/sound/amlogic,axg-tdm-iface.yaml#
arch/arm64/boot/dts/amlogic/meson-s4-s805x2-aq222.dtb: audio-controller-1: Unevaluated properties are not allowed ('clock-names' was unexpected)
from schema $id: http://devicetree.org/schemas/sound/amlogic,axg-tdm-iface.yaml#
arch/arm64/boot/dts/amlogic/meson-s4-s805x2-aq222.dtb: audio-controller-2: clock-names:0: 'sclk' was expected
from schema $id: http://devicetree.org/schemas/sound/amlogic,axg-tdm-iface.yaml#
arch/arm64/boot/dts/amlogic/meson-s4-s805x2-aq222.dtb: audio-controller-2: clock-names:1: 'lrclk' was expected
from schema $id: http://devicetree.org/schemas/sound/amlogic,axg-tdm-iface.yaml#
arch/arm64/boot/dts/amlogic/meson-s4-s805x2-aq222.dtb: audio-controller-2: clock-names:2: 'mclk' was expected
from schema $id: http://devicetree.org/schemas/sound/amlogic,axg-tdm-iface.yaml#
arch/arm64/boot/dts/amlogic/meson-s4-s805x2-aq222.dtb: audio-controller-2: Unevaluated properties are not allowed ('clock-names' was unexpected)
from schema $id: http://devicetree.org/schemas/sound/amlogic,axg-tdm-iface.yaml#
arch/arm64/boot/dts/amlogic/meson-s4-s805x2-aq222.dtb: sound: 'anyOf' conditional failed, one must be fixed:
'clocks' is a required property
'#clock-cells' is a required property
from schema $id: http://devicetree.org/schemas/clock/clock.yaml#
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v3 1/6] dt-bindings: clock: meson: Add audio power domain for s4 soc
2025-02-28 8:04 ` [PATCH v3 1/6] dt-bindings: clock: meson: Add audio power domain for s4 soc jiebing chen via B4 Relay
@ 2025-02-28 21:51 ` Rob Herring
0 siblings, 0 replies; 15+ messages in thread
From: Rob Herring @ 2025-02-28 21:51 UTC (permalink / raw)
To: jiebing chen
Cc: Jerome Brunet, Liam Girdwood, Mark Brown, Krzysztof Kozlowski,
Conor Dooley, Jaroslav Kysela, Takashi Iwai, Neil Armstrong,
Kevin Hilman, Martin Blumenstingl, Michael Turquette,
Stephen Boyd, linux-sound, devicetree, linux-kernel,
linux-arm-kernel, linux-amlogic, linux-clk, jian.xu, shuai.li,
zhe.wang
On Fri, Feb 28, 2025 at 04:04:09PM +0800, jiebing chen wrote:
> Audio power domain found on S4 device. It need to enable before audio work.
>
> Signed-off-by: jiebing chen <jiebing.chen@amlogic.com>
> ---
> .../bindings/clock/amlogic,axg-audio-clkc.yaml | 18 ++++++++++++++++++
> 1 file changed, 18 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/clock/amlogic,axg-audio-clkc.yaml b/Documentation/devicetree/bindings/clock/amlogic,axg-audio-clkc.yaml
> index fd7982dd4ceab82389167079c2258a9acff51a76..364783c6f7572b09d57de2b35d33adb7bcf7db18 100644
> --- a/Documentation/devicetree/bindings/clock/amlogic,axg-audio-clkc.yaml
> +++ b/Documentation/devicetree/bindings/clock/amlogic,axg-audio-clkc.yaml
> @@ -21,6 +21,7 @@ properties:
> - amlogic,axg-audio-clkc
> - amlogic,g12a-audio-clkc
> - amlogic,sm1-audio-clkc
> + - amlogic,s4-audio-clkc
>
> '#clock-cells':
> const: 1
> @@ -100,6 +101,9 @@ properties:
> resets:
> description: internal reset line
>
> + power-domains:
> + description: audio controller power
You have to define how many (maxItems).
> +
> required:
> - compatible
> - '#clock-cells'
> @@ -116,12 +120,26 @@ allOf:
> enum:
> - amlogic,g12a-audio-clkc
> - amlogic,sm1-audio-clkc
> + - amlogic,s4-audio-clkc
> then:
> required:
> - '#reset-cells'
> else:
> properties:
> '#reset-cells': false
> + - if:
> + properties:
> + compatible:
> + contains:
> + enum:
> + - amlogic,s4-audio-clkc
> + then:
> + required:
> + - power-domains
> +
> + else:
> + properties:
> + power-domains: false
>
> additionalProperties: false
>
>
> --
> 2.43.0
>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v3 2/6] dt-bindings: clock: axg-audio: Add mclk and sclk pad clock ids
2025-02-28 8:04 ` [PATCH v3 2/6] dt-bindings: clock: axg-audio: Add mclk and sclk pad clock ids jiebing chen via B4 Relay
@ 2025-02-28 21:53 ` Rob Herring (Arm)
0 siblings, 0 replies; 15+ messages in thread
From: Rob Herring (Arm) @ 2025-02-28 21:53 UTC (permalink / raw)
To: jiebing chen
Cc: jian.xu, Jerome Brunet, Kevin Hilman, Takashi Iwai, linux-clk,
Krzysztof Kozlowski, linux-kernel, Liam Girdwood, linux-amlogic,
linux-arm-kernel, devicetree, linux-sound, Neil Armstrong,
Michael Turquette, Jaroslav Kysela, Mark Brown, Conor Dooley,
Stephen Boyd, shuai.li, Martin Blumenstingl, zhe.wang
On Fri, 28 Feb 2025 16:04:10 +0800, jiebing chen wrote:
> Add clock IDs for the mclk pads found on s4 SoCs
>
> Signed-off-by: jiebing chen <jiebing.chen@amlogic.com>
> ---
> include/dt-bindings/clock/axg-audio-clkc.h | 11 +++++++++++
> 1 file changed, 11 insertions(+)
>
Acked-by: Rob Herring (Arm) <robh@kernel.org>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v3 3/6] dt-bindings: Asoc: axg-audio: Add s4 audio tocodec
2025-02-28 8:04 ` [PATCH v3 3/6] dt-bindings: Asoc: axg-audio: Add s4 audio tocodec jiebing chen via B4 Relay
@ 2025-02-28 21:54 ` Rob Herring (Arm)
0 siblings, 0 replies; 15+ messages in thread
From: Rob Herring (Arm) @ 2025-02-28 21:54 UTC (permalink / raw)
To: jiebing chen
Cc: shuai.li, Jaroslav Kysela, linux-kernel, Stephen Boyd,
Kevin Hilman, Krzysztof Kozlowski, devicetree, Takashi Iwai,
Liam Girdwood, linux-clk, linux-sound, zhe.wang, Mark Brown,
Martin Blumenstingl, linux-amlogic, Jerome Brunet, Conor Dooley,
jian.xu, Michael Turquette, linux-arm-kernel, Neil Armstrong
On Fri, 28 Feb 2025 16:04:11 +0800, jiebing chen wrote:
> Add the s4 tocodec compatible
>
> Signed-off-by: jiebing chen <jiebing.chen@amlogic.com>
> ---
> Documentation/devicetree/bindings/sound/amlogic,g12a-toacodec.yaml | 1 +
> 1 file changed, 1 insertion(+)
>
Acked-by: Rob Herring (Arm) <robh@kernel.org>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v3 5/6] ASoC: meson: s4: Add s4 tocodec driver
2025-02-28 8:04 ` [PATCH v3 5/6] ASoC: meson: s4: Add s4 tocodec driver jiebing chen via B4 Relay
@ 2025-03-06 15:58 ` Jerome Brunet
2025-03-07 2:48 ` Jiebing Chen
0 siblings, 1 reply; 15+ messages in thread
From: Jerome Brunet @ 2025-03-06 15:58 UTC (permalink / raw)
To: jiebing chen via B4 Relay
Cc: Liam Girdwood, Mark Brown, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Jaroslav Kysela, Takashi Iwai, Neil Armstrong,
Kevin Hilman, Martin Blumenstingl, Michael Turquette,
Stephen Boyd, jiebing.chen, linux-sound, devicetree, linux-kernel,
linux-arm-kernel, linux-amlogic, linux-clk, jian.xu, shuai.li,
zhe.wang
On Fri 28 Feb 2025 at 16:04, jiebing chen via B4 Relay <devnull+jiebing.chen.amlogic.com@kernel.org> wrote:
> From: jiebing chen <jiebing.chen@amlogic.com>
>
> S4 tocodec support 8 lane to input, It need to enable
> bclk and mclk control bit when work
>
> Signed-off-by: jiebing chen <jiebing.chen@amlogic.com>
> ---
> sound/soc/meson/g12a-toacodec.c | 51 +++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 51 insertions(+)
>
> diff --git a/sound/soc/meson/g12a-toacodec.c b/sound/soc/meson/g12a-toacodec.c
> index 531bb8707a3ec4c47814d6a0676d5c62c705da75..41eef9980059285275f0189a06469fc694775955 100644
> --- a/sound/soc/meson/g12a-toacodec.c
> +++ b/sound/soc/meson/g12a-toacodec.c
> @@ -41,6 +41,9 @@
> #define CTRL0_BCLK_SEL_LSB 4
> #define CTRL0_MCLK_SEL GENMASK(2, 0)
>
> +#define CTRL0_BCLK_ENABLE_SHIFT 30
> +#define CTRL0_MCLK_ENABLE_SHIFT 29
> +
> #define TOACODEC_OUT_CHMAX 2
>
> struct g12a_toacodec {
> @@ -129,6 +132,10 @@ static const struct snd_kcontrol_new g12a_toacodec_out_enable =
> SOC_DAPM_SINGLE_AUTODISABLE("Switch", TOACODEC_CTRL0,
> CTRL0_ENABLE_SHIFT, 1, 0);
>
> +static const struct snd_kcontrol_new s4_toacodec_clk_enable =
> + SOC_DAPM_DOUBLE("Switch", TOACODEC_CTRL0,
> + CTRL0_BCLK_ENABLE_SHIFT, CTRL0_MCLK_ENABLE_SHIFT, 1, 0);
> +
> static const struct snd_soc_dapm_widget g12a_toacodec_widgets[] = {
> SND_SOC_DAPM_MUX("SRC", SND_SOC_NOPM, 0, 0,
> &g12a_toacodec_mux),
> @@ -143,6 +150,15 @@ static const struct snd_soc_dapm_widget sm1_toacodec_widgets[] = {
> &g12a_toacodec_out_enable),
> };
>
> +static const struct snd_soc_dapm_widget s4_toacodec_widgets[] = {
> + SND_SOC_DAPM_MUX("SRC", SND_SOC_NOPM, 0, 0,
> + &sm1_toacodec_mux),
> + SND_SOC_DAPM_SWITCH("OUT EN", SND_SOC_NOPM, 0, 0,
> + &g12a_toacodec_out_enable),
> + SND_SOC_DAPM_SWITCH("CLK EN", SND_SOC_NOPM, 0, 0,
> + &s4_toacodec_clk_enable),
I don't see a reason for the user to control that.
A user controls if the component is enable or not, and possibly select
the lane ... but that's it
You could have to flipped automatically which dapm when the component is
powered, that would make a lot more sense.
> +};
> +
> static int g12a_toacodec_input_hw_params(struct snd_pcm_substream *substream,
> struct snd_pcm_hw_params *params,
> struct snd_soc_dai *dai)
> @@ -228,6 +244,15 @@ static const struct snd_soc_dapm_route g12a_toacodec_routes[] = {
> { "OUT Capture", NULL, "OUT EN" },
> };
>
> +static const struct snd_soc_dapm_route s4_toacodec_routes[] = {
> + { "SRC", "I2S A", "IN A Playback" },
> + { "SRC", "I2S B", "IN B Playback" },
> + { "SRC", "I2S C", "IN C Playback" },
> + { "OUT EN", "Switch", "SRC" },
> + { "CLK EN", "Switch", "OUT EN" },
> + { "OUT Capture", NULL, "CLK EN" },
> +};
> +
> static const struct snd_kcontrol_new g12a_toacodec_controls[] = {
> SOC_SINGLE("Lane Select", TOACODEC_CTRL0, CTRL0_LANE_SEL, 3, 0),
> };
> @@ -236,6 +261,10 @@ static const struct snd_kcontrol_new sm1_toacodec_controls[] = {
> SOC_SINGLE("Lane Select", TOACODEC_CTRL0, CTRL0_LANE_SEL_SM1, 3, 0),
> };
>
> +static const struct snd_kcontrol_new s4_toacodec_controls[] = {
> + SOC_SINGLE("Lane Select", TOACODEC_CTRL0, CTRL0_LANE_SEL_SM1, 7, 0),
> +};
> +
> static const struct snd_soc_component_driver g12a_toacodec_component_drv = {
> .probe = g12a_toacodec_component_probe,
> .controls = g12a_toacodec_controls,
> @@ -258,6 +287,17 @@ static const struct snd_soc_component_driver sm1_toacodec_component_drv = {
> .endianness = 1,
> };
>
> +static const struct snd_soc_component_driver s4_toacodec_component_drv = {
> + .probe = sm1_toacodec_component_probe,
> + .controls = s4_toacodec_controls,
> + .num_controls = ARRAY_SIZE(s4_toacodec_controls),
> + .dapm_widgets = s4_toacodec_widgets,
> + .num_dapm_widgets = ARRAY_SIZE(s4_toacodec_widgets),
> + .dapm_routes = s4_toacodec_routes,
> + .num_dapm_routes = ARRAY_SIZE(s4_toacodec_routes),
> + .endianness = 1,
> +};
> +
> static const struct regmap_config g12a_toacodec_regmap_cfg = {
> .reg_bits = 32,
> .val_bits = 32,
> @@ -278,6 +318,13 @@ static const struct g12a_toacodec_match_data sm1_toacodec_match_data = {
> .field_bclk_sel = REG_FIELD(TOACODEC_CTRL0, 4, 6),
> };
>
> +static const struct g12a_toacodec_match_data s4_toacodec_match_data = {
> + .component_drv = &s4_toacodec_component_drv,
> + .field_dat_sel = REG_FIELD(TOACODEC_CTRL0, 19, 20),
> + .field_lrclk_sel = REG_FIELD(TOACODEC_CTRL0, 12, 14),
> + .field_bclk_sel = REG_FIELD(TOACODEC_CTRL0, 4, 6),
> +};
> +
> static const struct of_device_id g12a_toacodec_of_match[] = {
> {
> .compatible = "amlogic,g12a-toacodec",
> @@ -287,6 +334,10 @@ static const struct of_device_id g12a_toacodec_of_match[] = {
> .compatible = "amlogic,sm1-toacodec",
> .data = &sm1_toacodec_match_data,
> },
> + {
> + .compatible = "amlogic,s4-toacodec",
> + .data = &s4_toacodec_match_data,
> + },
> {}
> };
> MODULE_DEVICE_TABLE(of, g12a_toacodec_of_match);
--
Jerome
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v3 4/6] clk: meson: axg-audio: Add the mclk pad div for s4
2025-02-28 8:04 ` [PATCH v3 4/6] clk: meson: axg-audio: Add the mclk pad div for s4 jiebing chen via B4 Relay
@ 2025-03-06 16:41 ` Jerome Brunet
2025-03-07 2:58 ` Jiebing Chen
0 siblings, 1 reply; 15+ messages in thread
From: Jerome Brunet @ 2025-03-06 16:41 UTC (permalink / raw)
To: jiebing chen via B4 Relay
Cc: Liam Girdwood, Mark Brown, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Jaroslav Kysela, Takashi Iwai, Neil Armstrong,
Kevin Hilman, Martin Blumenstingl, Michael Turquette,
Stephen Boyd, jiebing.chen, linux-sound, devicetree, linux-kernel,
linux-arm-kernel, linux-amlogic, linux-clk, jian.xu, shuai.li,
zhe.wang
On Fri 28 Feb 2025 at 16:04, jiebing chen via B4 Relay <devnull+jiebing.chen.amlogic.com@kernel.org> wrote:
> From: jiebing chen <jiebing.chen@amlogic.com>
>
> Add mclk pad div support, Increased the number of lrclk
> and sclk pads to five
>
> Signed-off-by: jiebing chen <jiebing.chen@amlogic.com>
> ---
> drivers/clk/meson/axg-audio.c | 410 +++++++++++++++++++++++++++++++++++++++++-
> drivers/clk/meson/axg-audio.h | 4 +
> 2 files changed, 412 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/clk/meson/axg-audio.c b/drivers/clk/meson/axg-audio.c
> index 9df627b142f89788966ede0262aaaf39e13f0b49..e70559ee0fd8deaf9858b0592e839fdf49d05886 100644
> --- a/drivers/clk/meson/axg-audio.c
> +++ b/drivers/clk/meson/axg-audio.c
> @@ -323,6 +323,16 @@ static const struct clk_parent_data lrclk_pad_ctrl_parent_data[] = {
> AUD_MUX(_name, _reg, 0x7, _shift, 0, _parents, \
> CLK_SET_RATE_NO_REPARENT)
>
> +#define AUD_MCLK_PAD_MUX(_name, _reg, _shift) \
> + AUD_MUX(_name##_sel, _reg, 0x7, _shift, CLK_MUX_ROUND_CLOSEST, \
> + mclk_pad_ctrl_parent_data, 0)
> +#define AUD_MCLK_PAD_DIV(_name, _reg, _shift) \
> + AUD_DIV(_name##_div, _reg, _shift, 8, CLK_DIVIDER_ROUND_CLOSEST, \
> + aud_##_name##_sel, CLK_SET_RATE_PARENT)
> +#define AUD_MCLK_PAD_GATE(_name, _reg, _shift) \
> + AUD_GATE(_name, _reg, _shift, aud_##_name##_div, \
> + CLK_SET_RATE_PARENT)
> +
> /* Common Clocks */
> static struct clk_regmap ddr_arb =
> AUD_PCLK_GATE(ddr_arb, AUDIO_CLK_GATE_EN, 0);
> @@ -826,6 +836,49 @@ static struct clk_regmap sm1_tdm_sclk_pad_1 = AUD_TDM_PAD_CTRL(
> static struct clk_regmap sm1_tdm_sclk_pad_2 = AUD_TDM_PAD_CTRL(
> tdm_sclk_pad_2, AUDIO_SM1_MST_PAD_CTRL1, 8, sclk_pad_ctrl_parent_data);
>
> +static struct clk_regmap s4_tdm_mclk_pad0_sel =
> + AUD_MCLK_PAD_MUX(mclk_pad0, AUDIO_S4_MCLK_PAD_CTRL0, 8);
> +static struct clk_regmap s4_tdm_mclk_pad1_sel =
> + AUD_MCLK_PAD_MUX(mclk_pad1, AUDIO_S4_MCLK_PAD_CTRL0, 24);
> +static struct clk_regmap s4_tdm_mclk_pad2_sel =
> + AUD_MCLK_PAD_MUX(mclk_pad2, AUDIO_S4_MCLK_PAD_CTRL1, 8);
> +
> +static struct clk_regmap s4_tdm_mclk_pad0_div =
> + AUD_MCLK_PAD_DIV(mclk_pad0, AUDIO_S4_MCLK_PAD_CTRL0, 0);
> +static struct clk_regmap s4_tdm_mclk_pad1_div =
> + AUD_MCLK_PAD_DIV(mclk_pad1, AUDIO_S4_MCLK_PAD_CTRL0, 16);
> +static struct clk_regmap s4_tdm_mclk_pad2_div =
> + AUD_MCLK_PAD_DIV(mclk_pad2, AUDIO_S4_MCLK_PAD_CTRL1, 0);
> +
> +static struct clk_regmap s4_tdm_mclk_pad_0 =
> + AUD_MCLK_PAD_GATE(mclk_pad0, AUDIO_S4_MCLK_PAD_CTRL0, 15);
> +static struct clk_regmap s4_tdm_mclk_pad_1 =
> + AUD_MCLK_PAD_GATE(mclk_pad1, AUDIO_S4_MCLK_PAD_CTRL0, 31);
> +static struct clk_regmap s4_tdm_mclk_pad_2 =
> + AUD_MCLK_PAD_GATE(mclk_pad2, AUDIO_S4_MCLK_PAD_CTRL1, 15);
> +
> +static struct clk_regmap s4_tdm_sclk_pad_0 =
> + AUD_TDM_PAD_CTRL(tdm_sclk_pad_0, AUDIO_S4_SCLK_PAD_CTRL0, 0, lrclk_pad_ctrl_parent_data);
> +static struct clk_regmap s4_tdm_sclk_pad_1 =
> + AUD_TDM_PAD_CTRL(tdm_sclk_pad_1, AUDIO_S4_SCLK_PAD_CTRL0, 4, lrclk_pad_ctrl_parent_data);
> +static struct clk_regmap s4_tdm_sclk_pad_2 =
> + AUD_TDM_PAD_CTRL(tdm_sclk_pad_2, AUDIO_S4_SCLK_PAD_CTRL0, 8, lrclk_pad_ctrl_parent_data);
> +static struct clk_regmap s4_tdm_sclk_pad_3 =
> + AUD_TDM_PAD_CTRL(tdm_sclk_pad_3, AUDIO_S4_SCLK_PAD_CTRL0, 16, lrclk_pad_ctrl_parent_data);
> +static struct clk_regmap s4_tdm_sclk_pad_4 =
> + AUD_TDM_PAD_CTRL(tdm_sclk_pad_4, AUDIO_S4_SCLK_PAD_CTRL0, 20, lrclk_pad_ctrl_parent_data);
> +
> +static struct clk_regmap s4_tdm_lrclk_pad_0 =
> + AUD_TDM_PAD_CTRL(tdm_lrclk_pad_0, AUDIO_S4_SCLK_PAD_CTRL1, 0, lrclk_pad_ctrl_parent_data);
> +static struct clk_regmap s4_tdm_lrclk_pad_1 =
> + AUD_TDM_PAD_CTRL(tdm_lrclk_pad_1, AUDIO_S4_SCLK_PAD_CTRL1, 4, lrclk_pad_ctrl_parent_data);
> +static struct clk_regmap s4_tdm_lrclk_pad_2 =
> + AUD_TDM_PAD_CTRL(tdm_lrclk_pad_2, AUDIO_S4_SCLK_PAD_CTRL1, 8, lrclk_pad_ctrl_parent_data);
> +static struct clk_regmap s4_tdm_lrclk_pad_3 =
> + AUD_TDM_PAD_CTRL(tdm_lrclk_pad_3, AUDIO_S4_SCLK_PAD_CTRL1, 16, lrclk_pad_ctrl_parent_data);
> +static struct clk_regmap s4_tdm_lrclk_pad_4 =
> + AUD_TDM_PAD_CTRL(tdm_lrclk_pad_4, AUDIO_S4_SCLK_PAD_CTRL1, 20, lrclk_pad_ctrl_parent_data);
> +
> /*
> * Array of all clocks provided by this provider
> * The input clocks of the controller will be populated at runtime
> @@ -1257,6 +1310,177 @@ static struct clk_hw *sm1_audio_hw_clks[] = {
> [AUD_CLKID_EARCRX_DMAC] = &sm1_earcrx_dmac_clk.hw,
> };
>
> +/*
> + * Array of all S4 clocks provided by this provider
> + * The input clocks of the controller will be populated at runtime
> + */
> +static struct clk_hw *s4_audio_hw_clks[] = {
> + [AUD_CLKID_DDR_ARB] = &ddr_arb.hw,
> + [AUD_CLKID_PDM] = &pdm.hw,
> + [AUD_CLKID_TDMIN_A] = &tdmin_a.hw,
> + [AUD_CLKID_TDMIN_B] = &tdmin_b.hw,
> + [AUD_CLKID_TDMIN_C] = &tdmin_c.hw,
> + [AUD_CLKID_TDMIN_LB] = &tdmin_lb.hw,
> + [AUD_CLKID_TDMOUT_A] = &tdmout_a.hw,
> + [AUD_CLKID_TDMOUT_B] = &tdmout_b.hw,
> + [AUD_CLKID_TDMOUT_C] = &tdmout_c.hw,
> + [AUD_CLKID_FRDDR_A] = &frddr_a.hw,
> + [AUD_CLKID_FRDDR_B] = &frddr_b.hw,
> + [AUD_CLKID_FRDDR_C] = &frddr_c.hw,
> + [AUD_CLKID_TODDR_A] = &toddr_a.hw,
> + [AUD_CLKID_TODDR_B] = &toddr_b.hw,
> + [AUD_CLKID_TODDR_C] = &toddr_c.hw,
> + [AUD_CLKID_LOOPBACK] = &loopback.hw,
> + [AUD_CLKID_SPDIFIN] = &spdifin.hw,
> + [AUD_CLKID_SPDIFOUT] = &spdifout.hw,
> + [AUD_CLKID_RESAMPLE] = &resample.hw,
> + [AUD_CLKID_SPDIFOUT_B] = &spdifout_b.hw,
> + [AUD_CLKID_MST_A_MCLK_SEL] = &sm1_mst_a_mclk_sel.hw,
> + [AUD_CLKID_MST_B_MCLK_SEL] = &sm1_mst_b_mclk_sel.hw,
> + [AUD_CLKID_MST_C_MCLK_SEL] = &sm1_mst_c_mclk_sel.hw,
> + [AUD_CLKID_MST_D_MCLK_SEL] = &sm1_mst_d_mclk_sel.hw,
> + [AUD_CLKID_MST_E_MCLK_SEL] = &sm1_mst_e_mclk_sel.hw,
> + [AUD_CLKID_MST_F_MCLK_SEL] = &sm1_mst_f_mclk_sel.hw,
> + [AUD_CLKID_MST_A_MCLK_DIV] = &sm1_mst_a_mclk_div.hw,
> + [AUD_CLKID_MST_B_MCLK_DIV] = &sm1_mst_b_mclk_div.hw,
> + [AUD_CLKID_MST_C_MCLK_DIV] = &sm1_mst_c_mclk_div.hw,
> + [AUD_CLKID_MST_D_MCLK_DIV] = &sm1_mst_d_mclk_div.hw,
> + [AUD_CLKID_MST_E_MCLK_DIV] = &sm1_mst_e_mclk_div.hw,
> + [AUD_CLKID_MST_F_MCLK_DIV] = &sm1_mst_f_mclk_div.hw,
> + [AUD_CLKID_MST_A_MCLK] = &sm1_mst_a_mclk.hw,
> + [AUD_CLKID_MST_B_MCLK] = &sm1_mst_b_mclk.hw,
> + [AUD_CLKID_MST_C_MCLK] = &sm1_mst_c_mclk.hw,
> + [AUD_CLKID_MST_D_MCLK] = &sm1_mst_d_mclk.hw,
> + [AUD_CLKID_MST_E_MCLK] = &sm1_mst_e_mclk.hw,
> + [AUD_CLKID_MST_F_MCLK] = &sm1_mst_f_mclk.hw,
> + [AUD_CLKID_SPDIFOUT_CLK_SEL] = &spdifout_clk_sel.hw,
> + [AUD_CLKID_SPDIFOUT_CLK_DIV] = &spdifout_clk_div.hw,
> + [AUD_CLKID_SPDIFOUT_CLK] = &spdifout_clk.hw,
> + [AUD_CLKID_SPDIFOUT_B_CLK_SEL] = &spdifout_b_clk_sel.hw,
> + [AUD_CLKID_SPDIFOUT_B_CLK_DIV] = &spdifout_b_clk_div.hw,
> + [AUD_CLKID_SPDIFOUT_B_CLK] = &spdifout_b_clk.hw,
> + [AUD_CLKID_SPDIFIN_CLK_SEL] = &spdifin_clk_sel.hw,
> + [AUD_CLKID_SPDIFIN_CLK_DIV] = &spdifin_clk_div.hw,
> + [AUD_CLKID_SPDIFIN_CLK] = &spdifin_clk.hw,
> + [AUD_CLKID_PDM_DCLK_SEL] = &pdm_dclk_sel.hw,
> + [AUD_CLKID_PDM_DCLK_DIV] = &pdm_dclk_div.hw,
> + [AUD_CLKID_PDM_DCLK] = &pdm_dclk.hw,
> + [AUD_CLKID_PDM_SYSCLK_SEL] = &pdm_sysclk_sel.hw,
> + [AUD_CLKID_PDM_SYSCLK_DIV] = &pdm_sysclk_div.hw,
> + [AUD_CLKID_PDM_SYSCLK] = &pdm_sysclk.hw,
> + [AUD_CLKID_MST_A_SCLK_PRE_EN] = &mst_a_sclk_pre_en.hw,
> + [AUD_CLKID_MST_B_SCLK_PRE_EN] = &mst_b_sclk_pre_en.hw,
> + [AUD_CLKID_MST_C_SCLK_PRE_EN] = &mst_c_sclk_pre_en.hw,
> + [AUD_CLKID_MST_D_SCLK_PRE_EN] = &mst_d_sclk_pre_en.hw,
> + [AUD_CLKID_MST_E_SCLK_PRE_EN] = &mst_e_sclk_pre_en.hw,
> + [AUD_CLKID_MST_F_SCLK_PRE_EN] = &mst_f_sclk_pre_en.hw,
> + [AUD_CLKID_MST_A_SCLK_DIV] = &mst_a_sclk_div.hw,
> + [AUD_CLKID_MST_B_SCLK_DIV] = &mst_b_sclk_div.hw,
> + [AUD_CLKID_MST_C_SCLK_DIV] = &mst_c_sclk_div.hw,
> + [AUD_CLKID_MST_D_SCLK_DIV] = &mst_d_sclk_div.hw,
> + [AUD_CLKID_MST_E_SCLK_DIV] = &mst_e_sclk_div.hw,
> + [AUD_CLKID_MST_F_SCLK_DIV] = &mst_f_sclk_div.hw,
> + [AUD_CLKID_MST_A_SCLK_POST_EN] = &mst_a_sclk_post_en.hw,
> + [AUD_CLKID_MST_B_SCLK_POST_EN] = &mst_b_sclk_post_en.hw,
> + [AUD_CLKID_MST_C_SCLK_POST_EN] = &mst_c_sclk_post_en.hw,
> + [AUD_CLKID_MST_D_SCLK_POST_EN] = &mst_d_sclk_post_en.hw,
> + [AUD_CLKID_MST_E_SCLK_POST_EN] = &mst_e_sclk_post_en.hw,
> + [AUD_CLKID_MST_F_SCLK_POST_EN] = &mst_f_sclk_post_en.hw,
> + [AUD_CLKID_MST_A_SCLK] = &mst_a_sclk.hw,
> + [AUD_CLKID_MST_B_SCLK] = &mst_b_sclk.hw,
> + [AUD_CLKID_MST_C_SCLK] = &mst_c_sclk.hw,
> + [AUD_CLKID_MST_D_SCLK] = &mst_d_sclk.hw,
> + [AUD_CLKID_MST_E_SCLK] = &mst_e_sclk.hw,
> + [AUD_CLKID_MST_F_SCLK] = &mst_f_sclk.hw,
> + [AUD_CLKID_MST_A_LRCLK_DIV] = &mst_a_lrclk_div.hw,
> + [AUD_CLKID_MST_B_LRCLK_DIV] = &mst_b_lrclk_div.hw,
> + [AUD_CLKID_MST_C_LRCLK_DIV] = &mst_c_lrclk_div.hw,
> + [AUD_CLKID_MST_D_LRCLK_DIV] = &mst_d_lrclk_div.hw,
> + [AUD_CLKID_MST_E_LRCLK_DIV] = &mst_e_lrclk_div.hw,
> + [AUD_CLKID_MST_F_LRCLK_DIV] = &mst_f_lrclk_div.hw,
> + [AUD_CLKID_MST_A_LRCLK] = &mst_a_lrclk.hw,
> + [AUD_CLKID_MST_B_LRCLK] = &mst_b_lrclk.hw,
> + [AUD_CLKID_MST_C_LRCLK] = &mst_c_lrclk.hw,
> + [AUD_CLKID_MST_D_LRCLK] = &mst_d_lrclk.hw,
> + [AUD_CLKID_MST_E_LRCLK] = &mst_e_lrclk.hw,
> + [AUD_CLKID_MST_F_LRCLK] = &mst_f_lrclk.hw,
> + [AUD_CLKID_TDMIN_A_SCLK_SEL] = &tdmin_a_sclk_sel.hw,
> + [AUD_CLKID_TDMIN_B_SCLK_SEL] = &tdmin_b_sclk_sel.hw,
> + [AUD_CLKID_TDMIN_C_SCLK_SEL] = &tdmin_c_sclk_sel.hw,
> + [AUD_CLKID_TDMIN_LB_SCLK_SEL] = &tdmin_lb_sclk_sel.hw,
> + [AUD_CLKID_TDMOUT_A_SCLK_SEL] = &tdmout_a_sclk_sel.hw,
> + [AUD_CLKID_TDMOUT_B_SCLK_SEL] = &tdmout_b_sclk_sel.hw,
> + [AUD_CLKID_TDMOUT_C_SCLK_SEL] = &tdmout_c_sclk_sel.hw,
> + [AUD_CLKID_TDMIN_A_SCLK_PRE_EN] = &tdmin_a_sclk_pre_en.hw,
> + [AUD_CLKID_TDMIN_B_SCLK_PRE_EN] = &tdmin_b_sclk_pre_en.hw,
> + [AUD_CLKID_TDMIN_C_SCLK_PRE_EN] = &tdmin_c_sclk_pre_en.hw,
> + [AUD_CLKID_TDMIN_LB_SCLK_PRE_EN] = &tdmin_lb_sclk_pre_en.hw,
> + [AUD_CLKID_TDMOUT_A_SCLK_PRE_EN] = &tdmout_a_sclk_pre_en.hw,
> + [AUD_CLKID_TDMOUT_B_SCLK_PRE_EN] = &tdmout_b_sclk_pre_en.hw,
> + [AUD_CLKID_TDMOUT_C_SCLK_PRE_EN] = &tdmout_c_sclk_pre_en.hw,
> + [AUD_CLKID_TDMIN_A_SCLK_POST_EN] = &tdmin_a_sclk_post_en.hw,
> + [AUD_CLKID_TDMIN_B_SCLK_POST_EN] = &tdmin_b_sclk_post_en.hw,
> + [AUD_CLKID_TDMIN_C_SCLK_POST_EN] = &tdmin_c_sclk_post_en.hw,
> + [AUD_CLKID_TDMIN_LB_SCLK_POST_EN] = &tdmin_lb_sclk_post_en.hw,
> + [AUD_CLKID_TDMOUT_A_SCLK_POST_EN] = &tdmout_a_sclk_post_en.hw,
> + [AUD_CLKID_TDMOUT_B_SCLK_POST_EN] = &tdmout_b_sclk_post_en.hw,
> + [AUD_CLKID_TDMOUT_C_SCLK_POST_EN] = &tdmout_c_sclk_post_en.hw,
> + [AUD_CLKID_TDMIN_A_SCLK] = &tdmin_a_sclk.hw,
> + [AUD_CLKID_TDMIN_B_SCLK] = &tdmin_b_sclk.hw,
> + [AUD_CLKID_TDMIN_C_SCLK] = &tdmin_c_sclk.hw,
> + [AUD_CLKID_TDMIN_LB_SCLK] = &tdmin_lb_sclk.hw,
> + [AUD_CLKID_TDMOUT_A_SCLK] = &g12a_tdmout_a_sclk.hw,
> + [AUD_CLKID_TDMOUT_B_SCLK] = &g12a_tdmout_b_sclk.hw,
> + [AUD_CLKID_TDMOUT_C_SCLK] = &g12a_tdmout_c_sclk.hw,
> + [AUD_CLKID_TDMIN_A_LRCLK] = &tdmin_a_lrclk.hw,
> + [AUD_CLKID_TDMIN_B_LRCLK] = &tdmin_b_lrclk.hw,
> + [AUD_CLKID_TDMIN_C_LRCLK] = &tdmin_c_lrclk.hw,
> + [AUD_CLKID_TDMIN_LB_LRCLK] = &tdmin_lb_lrclk.hw,
> + [AUD_CLKID_TDMOUT_A_LRCLK] = &tdmout_a_lrclk.hw,
> + [AUD_CLKID_TDMOUT_B_LRCLK] = &tdmout_b_lrclk.hw,
> + [AUD_CLKID_TDMOUT_C_LRCLK] = &tdmout_c_lrclk.hw,
> + [AUD_CLKID_TDM_MCLK_PAD0] = &s4_tdm_mclk_pad_0.hw,
> + [AUD_CLKID_TDM_MCLK_PAD1] = &s4_tdm_mclk_pad_1.hw,
> + [AUD_CLKID_TDM_LRCLK_PAD0] = &s4_tdm_lrclk_pad_0.hw,
> + [AUD_CLKID_TDM_LRCLK_PAD1] = &s4_tdm_lrclk_pad_1.hw,
> + [AUD_CLKID_TDM_LRCLK_PAD2] = &s4_tdm_lrclk_pad_2.hw,
> + [AUD_CLKID_TDM_SCLK_PAD0] = &s4_tdm_sclk_pad_0.hw,
> + [AUD_CLKID_TDM_SCLK_PAD1] = &s4_tdm_sclk_pad_1.hw,
> + [AUD_CLKID_TDM_SCLK_PAD2] = &s4_tdm_sclk_pad_2.hw,
> + [AUD_CLKID_TOP] = &sm1_aud_top.hw,
> + [AUD_CLKID_TORAM] = &toram.hw,
> + [AUD_CLKID_EQDRC] = &eqdrc.hw,
> + [AUD_CLKID_RESAMPLE_B] = &resample_b.hw,
> + [AUD_CLKID_TOVAD] = &tovad.hw,
> + [AUD_CLKID_LOCKER] = &locker.hw,
> + [AUD_CLKID_SPDIFIN_LB] = &spdifin_lb.hw,
> + [AUD_CLKID_FRDDR_D] = &frddr_d.hw,
> + [AUD_CLKID_TODDR_D] = &toddr_d.hw,
> + [AUD_CLKID_LOOPBACK_B] = &loopback_b.hw,
> + [AUD_CLKID_CLK81_EN] = &sm1_clk81_en.hw,
> + [AUD_CLKID_SYSCLK_A_DIV] = &sm1_sysclk_a_div.hw,
> + [AUD_CLKID_SYSCLK_A_EN] = &sm1_sysclk_a_en.hw,
> + [AUD_CLKID_SYSCLK_B_DIV] = &sm1_sysclk_b_div.hw,
> + [AUD_CLKID_SYSCLK_B_EN] = &sm1_sysclk_b_en.hw,
> + [AUD_CLKID_EARCRX] = &earcrx.hw,
> + [AUD_CLKID_EARCRX_CMDC_SEL] = &sm1_earcrx_cmdc_clk_sel.hw,
> + [AUD_CLKID_EARCRX_CMDC_DIV] = &sm1_earcrx_cmdc_clk_div.hw,
> + [AUD_CLKID_EARCRX_CMDC] = &sm1_earcrx_cmdc_clk.hw,
> + [AUD_CLKID_EARCRX_DMAC_SEL] = &sm1_earcrx_dmac_clk_sel.hw,
> + [AUD_CLKID_EARCRX_DMAC_DIV] = &sm1_earcrx_dmac_clk_div.hw,
> + [AUD_CLKID_EARCRX_DMAC] = &sm1_earcrx_dmac_clk.hw,
> + [AUD_CLKID_TDM_MCLK_PAD0_SEL] = &s4_tdm_mclk_pad0_sel.hw,
> + [AUD_CLKID_TDM_MCLK_PAD1_SEL] = &s4_tdm_mclk_pad1_sel.hw,
> + [AUD_CLKID_TDM_MCLK_PAD0_DIV] = &s4_tdm_mclk_pad0_div.hw,
> + [AUD_CLKID_TDM_MCLK_PAD1_DIV] = &s4_tdm_mclk_pad1_div.hw,
> + [AUD_CLKID_TDM_MCLK_PAD2] = &s4_tdm_mclk_pad_2.hw,
> + [AUD_CLKID_TDM_MCLK_PAD2_SEL] = &s4_tdm_mclk_pad2_sel.hw,
> + [AUD_CLKID_TDM_MCLK_PAD2_DIV] = &s4_tdm_mclk_pad2_div.hw,
> + [AUD_CLKID_TDM_SCLK_PAD3] = &s4_tdm_sclk_pad_3.hw,
> + [AUD_CLKID_TDM_SCLK_PAD4] = &s4_tdm_sclk_pad_4.hw,
> + [AUD_CLKID_TDM_LRCLK_PAD3] = &s4_tdm_lrclk_pad_3.hw,
> + [AUD_CLKID_TDM_LRCLK_PAD4] = &s4_tdm_lrclk_pad_4.hw,
> +};
>
> /* Convenience table to populate regmap in .probe(). */
> static struct clk_regmap *const axg_clk_regmaps[] = {
> @@ -1678,6 +1902,174 @@ static struct clk_regmap *const sm1_clk_regmaps[] = {
> &sm1_earcrx_dmac_clk,
> };
>
> +static struct clk_regmap *const s4_clk_regmaps[] = {
> + &ddr_arb,
> + &pdm,
> + &tdmin_a,
> + &tdmin_b,
> + &tdmin_c,
> + &tdmin_lb,
> + &tdmout_a,
> + &tdmout_b,
> + &tdmout_c,
> + &frddr_a,
> + &frddr_b,
> + &frddr_c,
> + &toddr_a,
> + &toddr_b,
> + &toddr_c,
> + &loopback,
> + &spdifin,
> + &spdifout,
> + &resample,
> + &spdifout_b,
> + &sm1_mst_a_mclk_sel,
> + &sm1_mst_b_mclk_sel,
> + &sm1_mst_c_mclk_sel,
> + &sm1_mst_d_mclk_sel,
> + &sm1_mst_e_mclk_sel,
> + &sm1_mst_f_mclk_sel,
> + &sm1_mst_a_mclk_div,
> + &sm1_mst_b_mclk_div,
> + &sm1_mst_c_mclk_div,
> + &sm1_mst_d_mclk_div,
> + &sm1_mst_e_mclk_div,
> + &sm1_mst_f_mclk_div,
> + &sm1_mst_a_mclk,
> + &sm1_mst_b_mclk,
> + &sm1_mst_c_mclk,
> + &sm1_mst_d_mclk,
> + &sm1_mst_e_mclk,
> + &sm1_mst_f_mclk,
> + &spdifout_clk_sel,
> + &spdifout_clk_div,
> + &spdifout_clk,
> + &spdifin_clk_sel,
> + &spdifin_clk_div,
> + &spdifin_clk,
> + &pdm_dclk_sel,
> + &pdm_dclk_div,
> + &pdm_dclk,
> + &pdm_sysclk_sel,
> + &pdm_sysclk_div,
> + &pdm_sysclk,
> + &mst_a_sclk_pre_en,
> + &mst_b_sclk_pre_en,
> + &mst_c_sclk_pre_en,
> + &mst_d_sclk_pre_en,
> + &mst_e_sclk_pre_en,
> + &mst_f_sclk_pre_en,
> + &mst_a_sclk_div,
> + &mst_b_sclk_div,
> + &mst_c_sclk_div,
> + &mst_d_sclk_div,
> + &mst_e_sclk_div,
> + &mst_f_sclk_div,
> + &mst_a_sclk_post_en,
> + &mst_b_sclk_post_en,
> + &mst_c_sclk_post_en,
> + &mst_d_sclk_post_en,
> + &mst_e_sclk_post_en,
> + &mst_f_sclk_post_en,
> + &mst_a_sclk,
> + &mst_b_sclk,
> + &mst_c_sclk,
> + &mst_d_sclk,
> + &mst_e_sclk,
> + &mst_f_sclk,
> + &mst_a_lrclk_div,
> + &mst_b_lrclk_div,
> + &mst_c_lrclk_div,
> + &mst_d_lrclk_div,
> + &mst_e_lrclk_div,
> + &mst_f_lrclk_div,
> + &mst_a_lrclk,
> + &mst_b_lrclk,
> + &mst_c_lrclk,
> + &mst_d_lrclk,
> + &mst_e_lrclk,
> + &mst_f_lrclk,
> + &tdmin_a_sclk_sel,
> + &tdmin_b_sclk_sel,
> + &tdmin_c_sclk_sel,
> + &tdmin_lb_sclk_sel,
> + &tdmout_a_sclk_sel,
> + &tdmout_b_sclk_sel,
> + &tdmout_c_sclk_sel,
> + &tdmin_a_sclk_pre_en,
> + &tdmin_b_sclk_pre_en,
> + &tdmin_c_sclk_pre_en,
> + &tdmin_lb_sclk_pre_en,
> + &tdmout_a_sclk_pre_en,
> + &tdmout_b_sclk_pre_en,
> + &tdmout_c_sclk_pre_en,
> + &tdmin_a_sclk_post_en,
> + &tdmin_b_sclk_post_en,
> + &tdmin_c_sclk_post_en,
> + &tdmin_lb_sclk_post_en,
> + &tdmout_a_sclk_post_en,
> + &tdmout_b_sclk_post_en,
> + &tdmout_c_sclk_post_en,
> + &tdmin_a_sclk,
> + &tdmin_b_sclk,
> + &tdmin_c_sclk,
> + &tdmin_lb_sclk,
> + &g12a_tdmout_a_sclk,
> + &g12a_tdmout_b_sclk,
> + &g12a_tdmout_c_sclk,
> + &tdmin_a_lrclk,
> + &tdmin_b_lrclk,
> + &tdmin_c_lrclk,
> + &tdmin_lb_lrclk,
> + &tdmout_a_lrclk,
> + &tdmout_b_lrclk,
> + &tdmout_c_lrclk,
> + &spdifout_b_clk_sel,
> + &spdifout_b_clk_div,
> + &spdifout_b_clk,
> + &s4_tdm_mclk_pad_0,
> + &s4_tdm_mclk_pad_1,
> + &s4_tdm_lrclk_pad_0,
> + &s4_tdm_lrclk_pad_1,
> + &s4_tdm_lrclk_pad_2,
> + &s4_tdm_sclk_pad_0,
> + &s4_tdm_sclk_pad_1,
> + &s4_tdm_sclk_pad_2,
> + &sm1_aud_top,
> + &toram,
> + &eqdrc,
> + &resample_b,
> + &tovad,
> + &locker,
> + &spdifin_lb,
> + &frddr_d,
> + &toddr_d,
> + &loopback_b,
> + &sm1_clk81_en,
> + &sm1_sysclk_a_div,
> + &sm1_sysclk_a_en,
> + &sm1_sysclk_b_div,
> + &sm1_sysclk_b_en,
> + &earcrx,
> + &sm1_earcrx_cmdc_clk_sel,
> + &sm1_earcrx_cmdc_clk_div,
> + &sm1_earcrx_cmdc_clk,
> + &sm1_earcrx_dmac_clk_sel,
> + &sm1_earcrx_dmac_clk_div,
> + &sm1_earcrx_dmac_clk,
> + &s4_tdm_mclk_pad0_sel,
> + &s4_tdm_mclk_pad1_sel,
> + &s4_tdm_mclk_pad0_div,
> + &s4_tdm_mclk_pad1_div,
> + &s4_tdm_mclk_pad_2,
> + &s4_tdm_mclk_pad2_sel,
> + &s4_tdm_mclk_pad2_div,
> + &s4_tdm_sclk_pad_3,
> + &s4_tdm_sclk_pad_4,
> + &s4_tdm_lrclk_pad_3,
> + &s4_tdm_lrclk_pad_4,
> +};
> +
> struct axg_audio_reset_data {
> struct reset_controller_dev rstc;
> struct regmap *map;
> @@ -1822,7 +2214,6 @@ static int axg_audio_clkc_probe(struct platform_device *pdev)
> continue;
>
> name = hw->init->name;
> -
> ret = devm_clk_hw_register(dev, hw);
> if (ret) {
> dev_err(dev, "failed to register clock %s\n", name);
> @@ -1886,6 +2277,18 @@ static const struct audioclk_data sm1_audioclk_data = {
> .max_register = AUDIO_EARCRX_DMAC_CLK_CTRL,
> };
>
> +static const struct audioclk_data s4_audioclk_data = {
> + .regmap_clks = s4_clk_regmaps,
> + .regmap_clk_num = ARRAY_SIZE(s4_clk_regmaps),
> + .hw_clks = {
> + .hws = s4_audio_hw_clks,
> + .num = ARRAY_SIZE(s4_audio_hw_clks),
> + },
> + .reset_offset = AUDIO_SM1_SW_RESET0,
> + .reset_num = 39,
> + .max_register = AUDIO_S4_SCLK_PAD_CTRL1,
> +};
> +
> static const struct of_device_id clkc_match_table[] = {
> {
> .compatible = "amlogic,axg-audio-clkc",
> @@ -1896,7 +2299,10 @@ static const struct of_device_id clkc_match_table[] = {
> }, {
> .compatible = "amlogic,sm1-audio-clkc",
> .data = &sm1_audioclk_data
> - }, {}
> + }, {
> + .compatible = "amlogic,s4-audio-clkc",
> + .data = &s4_audioclk_data
> + }, { }
> };
> MODULE_DEVICE_TABLE(of, clkc_match_table);
>
> diff --git a/drivers/clk/meson/axg-audio.h b/drivers/clk/meson/axg-audio.h
> index 9e7765b630c96a8029140539ffda789b7db5277a..2dd1c41d775da8f91ed281470d06e9c970cfc92c 100644
> --- a/drivers/clk/meson/axg-audio.h
> +++ b/drivers/clk/meson/axg-audio.h
> @@ -66,5 +66,9 @@
> #define AUDIO_CLK81_EN 0x034
> #define AUDIO_EARCRX_CMDC_CLK_CTRL 0x0D0
> #define AUDIO_EARCRX_DMAC_CLK_CTRL 0x0D4
Judging by the DT posted, there is plenty in between of non-clock
component in between these 2 offsets/regions
> +#define AUDIO_S4_MCLK_PAD_CTRL0 0xE80
> +#define AUDIO_S4_MCLK_PAD_CTRL1 0xE84
> +#define AUDIO_S4_SCLK_PAD_CTRL0 0xE88
> +#define AUDIO_S4_SCLK_PAD_CTRL1 0xE8C
>
... and this is not even mapped by the clock controller, so this won't
work with the DT you have posted.
> #endif /*__AXG_AUDIO_CLKC_H */
--
Jerome
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v3 5/6] ASoC: meson: s4: Add s4 tocodec driver
2025-03-06 15:58 ` Jerome Brunet
@ 2025-03-07 2:48 ` Jiebing Chen
0 siblings, 0 replies; 15+ messages in thread
From: Jiebing Chen @ 2025-03-07 2:48 UTC (permalink / raw)
To: Jerome Brunet, jiebing chen via B4 Relay
Cc: Liam Girdwood, Mark Brown, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Jaroslav Kysela, Takashi Iwai, Neil Armstrong,
Kevin Hilman, Martin Blumenstingl, Michael Turquette,
Stephen Boyd, linux-sound, devicetree, linux-kernel,
linux-arm-kernel, linux-amlogic, linux-clk, jian.xu, shuai.li,
zhe.wang
在 2025/3/6 23:58, Jerome Brunet 写道:
> [ EXTERNAL EMAIL ]
>
> On Fri 28 Feb 2025 at 16:04, jiebing chen via B4 Relay <devnull+jiebing.chen.amlogic.com@kernel.org> wrote:
>
>> From: jiebing chen <jiebing.chen@amlogic.com>
>>
>> S4 tocodec support 8 lane to input, It need to enable
>> bclk and mclk control bit when work
>>
>> Signed-off-by: jiebing chen <jiebing.chen@amlogic.com>
>> ---
>> sound/soc/meson/g12a-toacodec.c | 51 +++++++++++++++++++++++++++++++++++++++++
>> 1 file changed, 51 insertions(+)
>>
>> diff --git a/sound/soc/meson/g12a-toacodec.c b/sound/soc/meson/g12a-toacodec.c
>> index 531bb8707a3ec4c47814d6a0676d5c62c705da75..41eef9980059285275f0189a06469fc694775955 100644
>> --- a/sound/soc/meson/g12a-toacodec.c
>> +++ b/sound/soc/meson/g12a-toacodec.c
>> @@ -41,6 +41,9 @@
>> #define CTRL0_BCLK_SEL_LSB 4
>> #define CTRL0_MCLK_SEL GENMASK(2, 0)
>>
>> +#define CTRL0_BCLK_ENABLE_SHIFT 30
>> +#define CTRL0_MCLK_ENABLE_SHIFT 29
>> +
>> #define TOACODEC_OUT_CHMAX 2
>>
>> struct g12a_toacodec {
>> @@ -129,6 +132,10 @@ static const struct snd_kcontrol_new g12a_toacodec_out_enable =
>> SOC_DAPM_SINGLE_AUTODISABLE("Switch", TOACODEC_CTRL0,
>> CTRL0_ENABLE_SHIFT, 1, 0);
>>
>> +static const struct snd_kcontrol_new s4_toacodec_clk_enable =
>> + SOC_DAPM_DOUBLE("Switch", TOACODEC_CTRL0,
>> + CTRL0_BCLK_ENABLE_SHIFT, CTRL0_MCLK_ENABLE_SHIFT, 1, 0);
>> +
>> static const struct snd_soc_dapm_widget g12a_toacodec_widgets[] = {
>> SND_SOC_DAPM_MUX("SRC", SND_SOC_NOPM, 0, 0,
>> &g12a_toacodec_mux),
>> @@ -143,6 +150,15 @@ static const struct snd_soc_dapm_widget sm1_toacodec_widgets[] = {
>> &g12a_toacodec_out_enable),
>> };
>>
>> +static const struct snd_soc_dapm_widget s4_toacodec_widgets[] = {
>> + SND_SOC_DAPM_MUX("SRC", SND_SOC_NOPM, 0, 0,
>> + &sm1_toacodec_mux),
>> + SND_SOC_DAPM_SWITCH("OUT EN", SND_SOC_NOPM, 0, 0,
>> + &g12a_toacodec_out_enable),
>> + SND_SOC_DAPM_SWITCH("CLK EN", SND_SOC_NOPM, 0, 0,
>> + &s4_toacodec_clk_enable),
> I don't see a reason for the user to control that.
>
> A user controls if the component is enable or not, and possibly select
> the lane ... but that's it
>
> You could have to flipped automatically which dapm when the component is
> powered, that would make a lot more sense.
Hi,Jerome
Thank you for your suggestion. Can we design it as a supply widget for
tocodec bclk and mclk control?
when dapm poweron, and supply widget power on, Users do not have to
operate additional Kcontrols
>
>> +};
>> +
>> static int g12a_toacodec_input_hw_params(struct snd_pcm_substream *substream,
>> struct snd_pcm_hw_params *params,
>> struct snd_soc_dai *dai)
>> @@ -228,6 +244,15 @@ static const struct snd_soc_dapm_route g12a_toacodec_routes[] = {
>> { "OUT Capture", NULL, "OUT EN" },
>> };
>>
>> +static const struct snd_soc_dapm_route s4_toacodec_routes[] = {
>> + { "SRC", "I2S A", "IN A Playback" },
>> + { "SRC", "I2S B", "IN B Playback" },
>> + { "SRC", "I2S C", "IN C Playback" },
>> + { "OUT EN", "Switch", "SRC" },
>> + { "CLK EN", "Switch", "OUT EN" },
>> + { "OUT Capture", NULL, "CLK EN" },
>> +};
>> +
>> static const struct snd_kcontrol_new g12a_toacodec_controls[] = {
>> SOC_SINGLE("Lane Select", TOACODEC_CTRL0, CTRL0_LANE_SEL, 3, 0),
>> };
>> @@ -236,6 +261,10 @@ static const struct snd_kcontrol_new sm1_toacodec_controls[] = {
>> SOC_SINGLE("Lane Select", TOACODEC_CTRL0, CTRL0_LANE_SEL_SM1, 3, 0),
>> };
>>
>> +static const struct snd_kcontrol_new s4_toacodec_controls[] = {
>> + SOC_SINGLE("Lane Select", TOACODEC_CTRL0, CTRL0_LANE_SEL_SM1, 7, 0),
>> +};
>> +
>> static const struct snd_soc_component_driver g12a_toacodec_component_drv = {
>> .probe = g12a_toacodec_component_probe,
>> .controls = g12a_toacodec_controls,
>> @@ -258,6 +287,17 @@ static const struct snd_soc_component_driver sm1_toacodec_component_drv = {
>> .endianness = 1,
>> };
>>
>> +static const struct snd_soc_component_driver s4_toacodec_component_drv = {
>> + .probe = sm1_toacodec_component_probe,
>> + .controls = s4_toacodec_controls,
>> + .num_controls = ARRAY_SIZE(s4_toacodec_controls),
>> + .dapm_widgets = s4_toacodec_widgets,
>> + .num_dapm_widgets = ARRAY_SIZE(s4_toacodec_widgets),
>> + .dapm_routes = s4_toacodec_routes,
>> + .num_dapm_routes = ARRAY_SIZE(s4_toacodec_routes),
>> + .endianness = 1,
>> +};
>> +
>> static const struct regmap_config g12a_toacodec_regmap_cfg = {
>> .reg_bits = 32,
>> .val_bits = 32,
>> @@ -278,6 +318,13 @@ static const struct g12a_toacodec_match_data sm1_toacodec_match_data = {
>> .field_bclk_sel = REG_FIELD(TOACODEC_CTRL0, 4, 6),
>> };
>>
>> +static const struct g12a_toacodec_match_data s4_toacodec_match_data = {
>> + .component_drv = &s4_toacodec_component_drv,
>> + .field_dat_sel = REG_FIELD(TOACODEC_CTRL0, 19, 20),
>> + .field_lrclk_sel = REG_FIELD(TOACODEC_CTRL0, 12, 14),
>> + .field_bclk_sel = REG_FIELD(TOACODEC_CTRL0, 4, 6),
>> +};
>> +
>> static const struct of_device_id g12a_toacodec_of_match[] = {
>> {
>> .compatible = "amlogic,g12a-toacodec",
>> @@ -287,6 +334,10 @@ static const struct of_device_id g12a_toacodec_of_match[] = {
>> .compatible = "amlogic,sm1-toacodec",
>> .data = &sm1_toacodec_match_data,
>> },
>> + {
>> + .compatible = "amlogic,s4-toacodec",
>> + .data = &s4_toacodec_match_data,
>> + },
>> {}
>> };
>> MODULE_DEVICE_TABLE(of, g12a_toacodec_of_match);
> --
> Jerome
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v3 4/6] clk: meson: axg-audio: Add the mclk pad div for s4
2025-03-06 16:41 ` Jerome Brunet
@ 2025-03-07 2:58 ` Jiebing Chen
0 siblings, 0 replies; 15+ messages in thread
From: Jiebing Chen @ 2025-03-07 2:58 UTC (permalink / raw)
To: Jerome Brunet, jiebing chen via B4 Relay
Cc: Liam Girdwood, Mark Brown, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Jaroslav Kysela, Takashi Iwai, Neil Armstrong,
Kevin Hilman, Martin Blumenstingl, Michael Turquette,
Stephen Boyd, linux-sound, devicetree, linux-kernel,
linux-arm-kernel, linux-amlogic, linux-clk, jian.xu, shuai.li,
zhe.wang
在 2025/3/7 0:41, Jerome Brunet 写道:
> [ EXTERNAL EMAIL ]
>
> On Fri 28 Feb 2025 at 16:04, jiebing chen via B4 Relay <devnull+jiebing.chen.amlogic.com@kernel.org> wrote:
>
>> From: jiebing chen <jiebing.chen@amlogic.com>
>>
>> Add mclk pad div support, Increased the number of lrclk
>> and sclk pads to five
>>
>> Signed-off-by: jiebing chen <jiebing.chen@amlogic.com>
>> ---
>> drivers/clk/meson/axg-audio.c | 410 +++++++++++++++++++++++++++++++++++++++++-
>> drivers/clk/meson/axg-audio.h | 4 +
>> 2 files changed, 412 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/clk/meson/axg-audio.c b/drivers/clk/meson/axg-audio.c
>> index 9df627b142f89788966ede0262aaaf39e13f0b49..e70559ee0fd8deaf9858b0592e839fdf49d05886 100644
>> --- a/drivers/clk/meson/axg-audio.c
>> +++ b/drivers/clk/meson/axg-audio.c
>> @@ -323,6 +323,16 @@ static const struct clk_parent_data lrclk_pad_ctrl_parent_data[] = {
>> AUD_MUX(_name, _reg, 0x7, _shift, 0, _parents, \
>> CLK_SET_RATE_NO_REPARENT)
>>
>> +#define AUD_MCLK_PAD_MUX(_name, _reg, _shift) \
>> + AUD_MUX(_name##_sel, _reg, 0x7, _shift, CLK_MUX_ROUND_CLOSEST, \
>> + mclk_pad_ctrl_parent_data, 0)
>> +#define AUD_MCLK_PAD_DIV(_name, _reg, _shift) \
>> + AUD_DIV(_name##_div, _reg, _shift, 8, CLK_DIVIDER_ROUND_CLOSEST, \
>> + aud_##_name##_sel, CLK_SET_RATE_PARENT)
>> +#define AUD_MCLK_PAD_GATE(_name, _reg, _shift) \
>> + AUD_GATE(_name, _reg, _shift, aud_##_name##_div, \
>> + CLK_SET_RATE_PARENT)
>> +
>> /* Common Clocks */
>> static struct clk_regmap ddr_arb =
>> AUD_PCLK_GATE(ddr_arb, AUDIO_CLK_GATE_EN, 0);
>> @@ -826,6 +836,49 @@ static struct clk_regmap sm1_tdm_sclk_pad_1 = AUD_TDM_PAD_CTRL(
>> static struct clk_regmap sm1_tdm_sclk_pad_2 = AUD_TDM_PAD_CTRL(
>> tdm_sclk_pad_2, AUDIO_SM1_MST_PAD_CTRL1, 8, sclk_pad_ctrl_parent_data);
>>
>> +static struct clk_regmap s4_tdm_mclk_pad0_sel =
>> + AUD_MCLK_PAD_MUX(mclk_pad0, AUDIO_S4_MCLK_PAD_CTRL0, 8);
>> +static struct clk_regmap s4_tdm_mclk_pad1_sel =
>> + AUD_MCLK_PAD_MUX(mclk_pad1, AUDIO_S4_MCLK_PAD_CTRL0, 24);
>> +static struct clk_regmap s4_tdm_mclk_pad2_sel =
>> + AUD_MCLK_PAD_MUX(mclk_pad2, AUDIO_S4_MCLK_PAD_CTRL1, 8);
>> +
>> +static struct clk_regmap s4_tdm_mclk_pad0_div =
>> + AUD_MCLK_PAD_DIV(mclk_pad0, AUDIO_S4_MCLK_PAD_CTRL0, 0);
>> +static struct clk_regmap s4_tdm_mclk_pad1_div =
>> + AUD_MCLK_PAD_DIV(mclk_pad1, AUDIO_S4_MCLK_PAD_CTRL0, 16);
>> +static struct clk_regmap s4_tdm_mclk_pad2_div =
>> + AUD_MCLK_PAD_DIV(mclk_pad2, AUDIO_S4_MCLK_PAD_CTRL1, 0);
>> +
>> +static struct clk_regmap s4_tdm_mclk_pad_0 =
>> + AUD_MCLK_PAD_GATE(mclk_pad0, AUDIO_S4_MCLK_PAD_CTRL0, 15);
>> +static struct clk_regmap s4_tdm_mclk_pad_1 =
>> + AUD_MCLK_PAD_GATE(mclk_pad1, AUDIO_S4_MCLK_PAD_CTRL0, 31);
>> +static struct clk_regmap s4_tdm_mclk_pad_2 =
>> + AUD_MCLK_PAD_GATE(mclk_pad2, AUDIO_S4_MCLK_PAD_CTRL1, 15);
>> +
>> +static struct clk_regmap s4_tdm_sclk_pad_0 =
>> + AUD_TDM_PAD_CTRL(tdm_sclk_pad_0, AUDIO_S4_SCLK_PAD_CTRL0, 0, lrclk_pad_ctrl_parent_data);
>> +static struct clk_regmap s4_tdm_sclk_pad_1 =
>> + AUD_TDM_PAD_CTRL(tdm_sclk_pad_1, AUDIO_S4_SCLK_PAD_CTRL0, 4, lrclk_pad_ctrl_parent_data);
>> +static struct clk_regmap s4_tdm_sclk_pad_2 =
>> + AUD_TDM_PAD_CTRL(tdm_sclk_pad_2, AUDIO_S4_SCLK_PAD_CTRL0, 8, lrclk_pad_ctrl_parent_data);
>> +static struct clk_regmap s4_tdm_sclk_pad_3 =
>> + AUD_TDM_PAD_CTRL(tdm_sclk_pad_3, AUDIO_S4_SCLK_PAD_CTRL0, 16, lrclk_pad_ctrl_parent_data);
>> +static struct clk_regmap s4_tdm_sclk_pad_4 =
>> + AUD_TDM_PAD_CTRL(tdm_sclk_pad_4, AUDIO_S4_SCLK_PAD_CTRL0, 20, lrclk_pad_ctrl_parent_data);
>> +
>> +static struct clk_regmap s4_tdm_lrclk_pad_0 =
>> + AUD_TDM_PAD_CTRL(tdm_lrclk_pad_0, AUDIO_S4_SCLK_PAD_CTRL1, 0, lrclk_pad_ctrl_parent_data);
>> +static struct clk_regmap s4_tdm_lrclk_pad_1 =
>> + AUD_TDM_PAD_CTRL(tdm_lrclk_pad_1, AUDIO_S4_SCLK_PAD_CTRL1, 4, lrclk_pad_ctrl_parent_data);
>> +static struct clk_regmap s4_tdm_lrclk_pad_2 =
>> + AUD_TDM_PAD_CTRL(tdm_lrclk_pad_2, AUDIO_S4_SCLK_PAD_CTRL1, 8, lrclk_pad_ctrl_parent_data);
>> +static struct clk_regmap s4_tdm_lrclk_pad_3 =
>> + AUD_TDM_PAD_CTRL(tdm_lrclk_pad_3, AUDIO_S4_SCLK_PAD_CTRL1, 16, lrclk_pad_ctrl_parent_data);
>> +static struct clk_regmap s4_tdm_lrclk_pad_4 =
>> + AUD_TDM_PAD_CTRL(tdm_lrclk_pad_4, AUDIO_S4_SCLK_PAD_CTRL1, 20, lrclk_pad_ctrl_parent_data);
>> +
>> /*
>> * Array of all clocks provided by this provider
>> * The input clocks of the controller will be populated at runtime
>> @@ -1257,6 +1310,177 @@ static struct clk_hw *sm1_audio_hw_clks[] = {
>> [AUD_CLKID_EARCRX_DMAC] = &sm1_earcrx_dmac_clk.hw,
>> };
>>
>> +/*
>> + * Array of all S4 clocks provided by this provider
>> + * The input clocks of the controller will be populated at runtime
>> + */
>> +static struct clk_hw *s4_audio_hw_clks[] = {
>> + [AUD_CLKID_DDR_ARB] = &ddr_arb.hw,
>> + [AUD_CLKID_PDM] = &pdm.hw,
>> + [AUD_CLKID_TDMIN_A] = &tdmin_a.hw,
>> + [AUD_CLKID_TDMIN_B] = &tdmin_b.hw,
>> + [AUD_CLKID_TDMIN_C] = &tdmin_c.hw,
>> + [AUD_CLKID_TDMIN_LB] = &tdmin_lb.hw,
>> + [AUD_CLKID_TDMOUT_A] = &tdmout_a.hw,
>> + [AUD_CLKID_TDMOUT_B] = &tdmout_b.hw,
>> + [AUD_CLKID_TDMOUT_C] = &tdmout_c.hw,
>> + [AUD_CLKID_FRDDR_A] = &frddr_a.hw,
>> + [AUD_CLKID_FRDDR_B] = &frddr_b.hw,
>> + [AUD_CLKID_FRDDR_C] = &frddr_c.hw,
>> + [AUD_CLKID_TODDR_A] = &toddr_a.hw,
>> + [AUD_CLKID_TODDR_B] = &toddr_b.hw,
>> + [AUD_CLKID_TODDR_C] = &toddr_c.hw,
>> + [AUD_CLKID_LOOPBACK] = &loopback.hw,
>> + [AUD_CLKID_SPDIFIN] = &spdifin.hw,
>> + [AUD_CLKID_SPDIFOUT] = &spdifout.hw,
>> + [AUD_CLKID_RESAMPLE] = &resample.hw,
>> + [AUD_CLKID_SPDIFOUT_B] = &spdifout_b.hw,
>> + [AUD_CLKID_MST_A_MCLK_SEL] = &sm1_mst_a_mclk_sel.hw,
>> + [AUD_CLKID_MST_B_MCLK_SEL] = &sm1_mst_b_mclk_sel.hw,
>> + [AUD_CLKID_MST_C_MCLK_SEL] = &sm1_mst_c_mclk_sel.hw,
>> + [AUD_CLKID_MST_D_MCLK_SEL] = &sm1_mst_d_mclk_sel.hw,
>> + [AUD_CLKID_MST_E_MCLK_SEL] = &sm1_mst_e_mclk_sel.hw,
>> + [AUD_CLKID_MST_F_MCLK_SEL] = &sm1_mst_f_mclk_sel.hw,
>> + [AUD_CLKID_MST_A_MCLK_DIV] = &sm1_mst_a_mclk_div.hw,
>> + [AUD_CLKID_MST_B_MCLK_DIV] = &sm1_mst_b_mclk_div.hw,
>> + [AUD_CLKID_MST_C_MCLK_DIV] = &sm1_mst_c_mclk_div.hw,
>> + [AUD_CLKID_MST_D_MCLK_DIV] = &sm1_mst_d_mclk_div.hw,
>> + [AUD_CLKID_MST_E_MCLK_DIV] = &sm1_mst_e_mclk_div.hw,
>> + [AUD_CLKID_MST_F_MCLK_DIV] = &sm1_mst_f_mclk_div.hw,
>> + [AUD_CLKID_MST_A_MCLK] = &sm1_mst_a_mclk.hw,
>> + [AUD_CLKID_MST_B_MCLK] = &sm1_mst_b_mclk.hw,
>> + [AUD_CLKID_MST_C_MCLK] = &sm1_mst_c_mclk.hw,
>> + [AUD_CLKID_MST_D_MCLK] = &sm1_mst_d_mclk.hw,
>> + [AUD_CLKID_MST_E_MCLK] = &sm1_mst_e_mclk.hw,
>> + [AUD_CLKID_MST_F_MCLK] = &sm1_mst_f_mclk.hw,
>> + [AUD_CLKID_SPDIFOUT_CLK_SEL] = &spdifout_clk_sel.hw,
>> + [AUD_CLKID_SPDIFOUT_CLK_DIV] = &spdifout_clk_div.hw,
>> + [AUD_CLKID_SPDIFOUT_CLK] = &spdifout_clk.hw,
>> + [AUD_CLKID_SPDIFOUT_B_CLK_SEL] = &spdifout_b_clk_sel.hw,
>> + [AUD_CLKID_SPDIFOUT_B_CLK_DIV] = &spdifout_b_clk_div.hw,
>> + [AUD_CLKID_SPDIFOUT_B_CLK] = &spdifout_b_clk.hw,
>> + [AUD_CLKID_SPDIFIN_CLK_SEL] = &spdifin_clk_sel.hw,
>> + [AUD_CLKID_SPDIFIN_CLK_DIV] = &spdifin_clk_div.hw,
>> + [AUD_CLKID_SPDIFIN_CLK] = &spdifin_clk.hw,
>> + [AUD_CLKID_PDM_DCLK_SEL] = &pdm_dclk_sel.hw,
>> + [AUD_CLKID_PDM_DCLK_DIV] = &pdm_dclk_div.hw,
>> + [AUD_CLKID_PDM_DCLK] = &pdm_dclk.hw,
>> + [AUD_CLKID_PDM_SYSCLK_SEL] = &pdm_sysclk_sel.hw,
>> + [AUD_CLKID_PDM_SYSCLK_DIV] = &pdm_sysclk_div.hw,
>> + [AUD_CLKID_PDM_SYSCLK] = &pdm_sysclk.hw,
>> + [AUD_CLKID_MST_A_SCLK_PRE_EN] = &mst_a_sclk_pre_en.hw,
>> + [AUD_CLKID_MST_B_SCLK_PRE_EN] = &mst_b_sclk_pre_en.hw,
>> + [AUD_CLKID_MST_C_SCLK_PRE_EN] = &mst_c_sclk_pre_en.hw,
>> + [AUD_CLKID_MST_D_SCLK_PRE_EN] = &mst_d_sclk_pre_en.hw,
>> + [AUD_CLKID_MST_E_SCLK_PRE_EN] = &mst_e_sclk_pre_en.hw,
>> + [AUD_CLKID_MST_F_SCLK_PRE_EN] = &mst_f_sclk_pre_en.hw,
>> + [AUD_CLKID_MST_A_SCLK_DIV] = &mst_a_sclk_div.hw,
>> + [AUD_CLKID_MST_B_SCLK_DIV] = &mst_b_sclk_div.hw,
>> + [AUD_CLKID_MST_C_SCLK_DIV] = &mst_c_sclk_div.hw,
>> + [AUD_CLKID_MST_D_SCLK_DIV] = &mst_d_sclk_div.hw,
>> + [AUD_CLKID_MST_E_SCLK_DIV] = &mst_e_sclk_div.hw,
>> + [AUD_CLKID_MST_F_SCLK_DIV] = &mst_f_sclk_div.hw,
>> + [AUD_CLKID_MST_A_SCLK_POST_EN] = &mst_a_sclk_post_en.hw,
>> + [AUD_CLKID_MST_B_SCLK_POST_EN] = &mst_b_sclk_post_en.hw,
>> + [AUD_CLKID_MST_C_SCLK_POST_EN] = &mst_c_sclk_post_en.hw,
>> + [AUD_CLKID_MST_D_SCLK_POST_EN] = &mst_d_sclk_post_en.hw,
>> + [AUD_CLKID_MST_E_SCLK_POST_EN] = &mst_e_sclk_post_en.hw,
>> + [AUD_CLKID_MST_F_SCLK_POST_EN] = &mst_f_sclk_post_en.hw,
>> + [AUD_CLKID_MST_A_SCLK] = &mst_a_sclk.hw,
>> + [AUD_CLKID_MST_B_SCLK] = &mst_b_sclk.hw,
>> + [AUD_CLKID_MST_C_SCLK] = &mst_c_sclk.hw,
>> + [AUD_CLKID_MST_D_SCLK] = &mst_d_sclk.hw,
>> + [AUD_CLKID_MST_E_SCLK] = &mst_e_sclk.hw,
>> + [AUD_CLKID_MST_F_SCLK] = &mst_f_sclk.hw,
>> + [AUD_CLKID_MST_A_LRCLK_DIV] = &mst_a_lrclk_div.hw,
>> + [AUD_CLKID_MST_B_LRCLK_DIV] = &mst_b_lrclk_div.hw,
>> + [AUD_CLKID_MST_C_LRCLK_DIV] = &mst_c_lrclk_div.hw,
>> + [AUD_CLKID_MST_D_LRCLK_DIV] = &mst_d_lrclk_div.hw,
>> + [AUD_CLKID_MST_E_LRCLK_DIV] = &mst_e_lrclk_div.hw,
>> + [AUD_CLKID_MST_F_LRCLK_DIV] = &mst_f_lrclk_div.hw,
>> + [AUD_CLKID_MST_A_LRCLK] = &mst_a_lrclk.hw,
>> + [AUD_CLKID_MST_B_LRCLK] = &mst_b_lrclk.hw,
>> + [AUD_CLKID_MST_C_LRCLK] = &mst_c_lrclk.hw,
>> + [AUD_CLKID_MST_D_LRCLK] = &mst_d_lrclk.hw,
>> + [AUD_CLKID_MST_E_LRCLK] = &mst_e_lrclk.hw,
>> + [AUD_CLKID_MST_F_LRCLK] = &mst_f_lrclk.hw,
>> + [AUD_CLKID_TDMIN_A_SCLK_SEL] = &tdmin_a_sclk_sel.hw,
>> + [AUD_CLKID_TDMIN_B_SCLK_SEL] = &tdmin_b_sclk_sel.hw,
>> + [AUD_CLKID_TDMIN_C_SCLK_SEL] = &tdmin_c_sclk_sel.hw,
>> + [AUD_CLKID_TDMIN_LB_SCLK_SEL] = &tdmin_lb_sclk_sel.hw,
>> + [AUD_CLKID_TDMOUT_A_SCLK_SEL] = &tdmout_a_sclk_sel.hw,
>> + [AUD_CLKID_TDMOUT_B_SCLK_SEL] = &tdmout_b_sclk_sel.hw,
>> + [AUD_CLKID_TDMOUT_C_SCLK_SEL] = &tdmout_c_sclk_sel.hw,
>> + [AUD_CLKID_TDMIN_A_SCLK_PRE_EN] = &tdmin_a_sclk_pre_en.hw,
>> + [AUD_CLKID_TDMIN_B_SCLK_PRE_EN] = &tdmin_b_sclk_pre_en.hw,
>> + [AUD_CLKID_TDMIN_C_SCLK_PRE_EN] = &tdmin_c_sclk_pre_en.hw,
>> + [AUD_CLKID_TDMIN_LB_SCLK_PRE_EN] = &tdmin_lb_sclk_pre_en.hw,
>> + [AUD_CLKID_TDMOUT_A_SCLK_PRE_EN] = &tdmout_a_sclk_pre_en.hw,
>> + [AUD_CLKID_TDMOUT_B_SCLK_PRE_EN] = &tdmout_b_sclk_pre_en.hw,
>> + [AUD_CLKID_TDMOUT_C_SCLK_PRE_EN] = &tdmout_c_sclk_pre_en.hw,
>> + [AUD_CLKID_TDMIN_A_SCLK_POST_EN] = &tdmin_a_sclk_post_en.hw,
>> + [AUD_CLKID_TDMIN_B_SCLK_POST_EN] = &tdmin_b_sclk_post_en.hw,
>> + [AUD_CLKID_TDMIN_C_SCLK_POST_EN] = &tdmin_c_sclk_post_en.hw,
>> + [AUD_CLKID_TDMIN_LB_SCLK_POST_EN] = &tdmin_lb_sclk_post_en.hw,
>> + [AUD_CLKID_TDMOUT_A_SCLK_POST_EN] = &tdmout_a_sclk_post_en.hw,
>> + [AUD_CLKID_TDMOUT_B_SCLK_POST_EN] = &tdmout_b_sclk_post_en.hw,
>> + [AUD_CLKID_TDMOUT_C_SCLK_POST_EN] = &tdmout_c_sclk_post_en.hw,
>> + [AUD_CLKID_TDMIN_A_SCLK] = &tdmin_a_sclk.hw,
>> + [AUD_CLKID_TDMIN_B_SCLK] = &tdmin_b_sclk.hw,
>> + [AUD_CLKID_TDMIN_C_SCLK] = &tdmin_c_sclk.hw,
>> + [AUD_CLKID_TDMIN_LB_SCLK] = &tdmin_lb_sclk.hw,
>> + [AUD_CLKID_TDMOUT_A_SCLK] = &g12a_tdmout_a_sclk.hw,
>> + [AUD_CLKID_TDMOUT_B_SCLK] = &g12a_tdmout_b_sclk.hw,
>> + [AUD_CLKID_TDMOUT_C_SCLK] = &g12a_tdmout_c_sclk.hw,
>> + [AUD_CLKID_TDMIN_A_LRCLK] = &tdmin_a_lrclk.hw,
>> + [AUD_CLKID_TDMIN_B_LRCLK] = &tdmin_b_lrclk.hw,
>> + [AUD_CLKID_TDMIN_C_LRCLK] = &tdmin_c_lrclk.hw,
>> + [AUD_CLKID_TDMIN_LB_LRCLK] = &tdmin_lb_lrclk.hw,
>> + [AUD_CLKID_TDMOUT_A_LRCLK] = &tdmout_a_lrclk.hw,
>> + [AUD_CLKID_TDMOUT_B_LRCLK] = &tdmout_b_lrclk.hw,
>> + [AUD_CLKID_TDMOUT_C_LRCLK] = &tdmout_c_lrclk.hw,
>> + [AUD_CLKID_TDM_MCLK_PAD0] = &s4_tdm_mclk_pad_0.hw,
>> + [AUD_CLKID_TDM_MCLK_PAD1] = &s4_tdm_mclk_pad_1.hw,
>> + [AUD_CLKID_TDM_LRCLK_PAD0] = &s4_tdm_lrclk_pad_0.hw,
>> + [AUD_CLKID_TDM_LRCLK_PAD1] = &s4_tdm_lrclk_pad_1.hw,
>> + [AUD_CLKID_TDM_LRCLK_PAD2] = &s4_tdm_lrclk_pad_2.hw,
>> + [AUD_CLKID_TDM_SCLK_PAD0] = &s4_tdm_sclk_pad_0.hw,
>> + [AUD_CLKID_TDM_SCLK_PAD1] = &s4_tdm_sclk_pad_1.hw,
>> + [AUD_CLKID_TDM_SCLK_PAD2] = &s4_tdm_sclk_pad_2.hw,
>> + [AUD_CLKID_TOP] = &sm1_aud_top.hw,
>> + [AUD_CLKID_TORAM] = &toram.hw,
>> + [AUD_CLKID_EQDRC] = &eqdrc.hw,
>> + [AUD_CLKID_RESAMPLE_B] = &resample_b.hw,
>> + [AUD_CLKID_TOVAD] = &tovad.hw,
>> + [AUD_CLKID_LOCKER] = &locker.hw,
>> + [AUD_CLKID_SPDIFIN_LB] = &spdifin_lb.hw,
>> + [AUD_CLKID_FRDDR_D] = &frddr_d.hw,
>> + [AUD_CLKID_TODDR_D] = &toddr_d.hw,
>> + [AUD_CLKID_LOOPBACK_B] = &loopback_b.hw,
>> + [AUD_CLKID_CLK81_EN] = &sm1_clk81_en.hw,
>> + [AUD_CLKID_SYSCLK_A_DIV] = &sm1_sysclk_a_div.hw,
>> + [AUD_CLKID_SYSCLK_A_EN] = &sm1_sysclk_a_en.hw,
>> + [AUD_CLKID_SYSCLK_B_DIV] = &sm1_sysclk_b_div.hw,
>> + [AUD_CLKID_SYSCLK_B_EN] = &sm1_sysclk_b_en.hw,
>> + [AUD_CLKID_EARCRX] = &earcrx.hw,
>> + [AUD_CLKID_EARCRX_CMDC_SEL] = &sm1_earcrx_cmdc_clk_sel.hw,
>> + [AUD_CLKID_EARCRX_CMDC_DIV] = &sm1_earcrx_cmdc_clk_div.hw,
>> + [AUD_CLKID_EARCRX_CMDC] = &sm1_earcrx_cmdc_clk.hw,
>> + [AUD_CLKID_EARCRX_DMAC_SEL] = &sm1_earcrx_dmac_clk_sel.hw,
>> + [AUD_CLKID_EARCRX_DMAC_DIV] = &sm1_earcrx_dmac_clk_div.hw,
>> + [AUD_CLKID_EARCRX_DMAC] = &sm1_earcrx_dmac_clk.hw,
>> + [AUD_CLKID_TDM_MCLK_PAD0_SEL] = &s4_tdm_mclk_pad0_sel.hw,
>> + [AUD_CLKID_TDM_MCLK_PAD1_SEL] = &s4_tdm_mclk_pad1_sel.hw,
>> + [AUD_CLKID_TDM_MCLK_PAD0_DIV] = &s4_tdm_mclk_pad0_div.hw,
>> + [AUD_CLKID_TDM_MCLK_PAD1_DIV] = &s4_tdm_mclk_pad1_div.hw,
>> + [AUD_CLKID_TDM_MCLK_PAD2] = &s4_tdm_mclk_pad_2.hw,
>> + [AUD_CLKID_TDM_MCLK_PAD2_SEL] = &s4_tdm_mclk_pad2_sel.hw,
>> + [AUD_CLKID_TDM_MCLK_PAD2_DIV] = &s4_tdm_mclk_pad2_div.hw,
>> + [AUD_CLKID_TDM_SCLK_PAD3] = &s4_tdm_sclk_pad_3.hw,
>> + [AUD_CLKID_TDM_SCLK_PAD4] = &s4_tdm_sclk_pad_4.hw,
>> + [AUD_CLKID_TDM_LRCLK_PAD3] = &s4_tdm_lrclk_pad_3.hw,
>> + [AUD_CLKID_TDM_LRCLK_PAD4] = &s4_tdm_lrclk_pad_4.hw,
>> +};
>>
>> /* Convenience table to populate regmap in .probe(). */
>> static struct clk_regmap *const axg_clk_regmaps[] = {
>> @@ -1678,6 +1902,174 @@ static struct clk_regmap *const sm1_clk_regmaps[] = {
>> &sm1_earcrx_dmac_clk,
>> };
>>
>> +static struct clk_regmap *const s4_clk_regmaps[] = {
>> + &ddr_arb,
>> + &pdm,
>> + &tdmin_a,
>> + &tdmin_b,
>> + &tdmin_c,
>> + &tdmin_lb,
>> + &tdmout_a,
>> + &tdmout_b,
>> + &tdmout_c,
>> + &frddr_a,
>> + &frddr_b,
>> + &frddr_c,
>> + &toddr_a,
>> + &toddr_b,
>> + &toddr_c,
>> + &loopback,
>> + &spdifin,
>> + &spdifout,
>> + &resample,
>> + &spdifout_b,
>> + &sm1_mst_a_mclk_sel,
>> + &sm1_mst_b_mclk_sel,
>> + &sm1_mst_c_mclk_sel,
>> + &sm1_mst_d_mclk_sel,
>> + &sm1_mst_e_mclk_sel,
>> + &sm1_mst_f_mclk_sel,
>> + &sm1_mst_a_mclk_div,
>> + &sm1_mst_b_mclk_div,
>> + &sm1_mst_c_mclk_div,
>> + &sm1_mst_d_mclk_div,
>> + &sm1_mst_e_mclk_div,
>> + &sm1_mst_f_mclk_div,
>> + &sm1_mst_a_mclk,
>> + &sm1_mst_b_mclk,
>> + &sm1_mst_c_mclk,
>> + &sm1_mst_d_mclk,
>> + &sm1_mst_e_mclk,
>> + &sm1_mst_f_mclk,
>> + &spdifout_clk_sel,
>> + &spdifout_clk_div,
>> + &spdifout_clk,
>> + &spdifin_clk_sel,
>> + &spdifin_clk_div,
>> + &spdifin_clk,
>> + &pdm_dclk_sel,
>> + &pdm_dclk_div,
>> + &pdm_dclk,
>> + &pdm_sysclk_sel,
>> + &pdm_sysclk_div,
>> + &pdm_sysclk,
>> + &mst_a_sclk_pre_en,
>> + &mst_b_sclk_pre_en,
>> + &mst_c_sclk_pre_en,
>> + &mst_d_sclk_pre_en,
>> + &mst_e_sclk_pre_en,
>> + &mst_f_sclk_pre_en,
>> + &mst_a_sclk_div,
>> + &mst_b_sclk_div,
>> + &mst_c_sclk_div,
>> + &mst_d_sclk_div,
>> + &mst_e_sclk_div,
>> + &mst_f_sclk_div,
>> + &mst_a_sclk_post_en,
>> + &mst_b_sclk_post_en,
>> + &mst_c_sclk_post_en,
>> + &mst_d_sclk_post_en,
>> + &mst_e_sclk_post_en,
>> + &mst_f_sclk_post_en,
>> + &mst_a_sclk,
>> + &mst_b_sclk,
>> + &mst_c_sclk,
>> + &mst_d_sclk,
>> + &mst_e_sclk,
>> + &mst_f_sclk,
>> + &mst_a_lrclk_div,
>> + &mst_b_lrclk_div,
>> + &mst_c_lrclk_div,
>> + &mst_d_lrclk_div,
>> + &mst_e_lrclk_div,
>> + &mst_f_lrclk_div,
>> + &mst_a_lrclk,
>> + &mst_b_lrclk,
>> + &mst_c_lrclk,
>> + &mst_d_lrclk,
>> + &mst_e_lrclk,
>> + &mst_f_lrclk,
>> + &tdmin_a_sclk_sel,
>> + &tdmin_b_sclk_sel,
>> + &tdmin_c_sclk_sel,
>> + &tdmin_lb_sclk_sel,
>> + &tdmout_a_sclk_sel,
>> + &tdmout_b_sclk_sel,
>> + &tdmout_c_sclk_sel,
>> + &tdmin_a_sclk_pre_en,
>> + &tdmin_b_sclk_pre_en,
>> + &tdmin_c_sclk_pre_en,
>> + &tdmin_lb_sclk_pre_en,
>> + &tdmout_a_sclk_pre_en,
>> + &tdmout_b_sclk_pre_en,
>> + &tdmout_c_sclk_pre_en,
>> + &tdmin_a_sclk_post_en,
>> + &tdmin_b_sclk_post_en,
>> + &tdmin_c_sclk_post_en,
>> + &tdmin_lb_sclk_post_en,
>> + &tdmout_a_sclk_post_en,
>> + &tdmout_b_sclk_post_en,
>> + &tdmout_c_sclk_post_en,
>> + &tdmin_a_sclk,
>> + &tdmin_b_sclk,
>> + &tdmin_c_sclk,
>> + &tdmin_lb_sclk,
>> + &g12a_tdmout_a_sclk,
>> + &g12a_tdmout_b_sclk,
>> + &g12a_tdmout_c_sclk,
>> + &tdmin_a_lrclk,
>> + &tdmin_b_lrclk,
>> + &tdmin_c_lrclk,
>> + &tdmin_lb_lrclk,
>> + &tdmout_a_lrclk,
>> + &tdmout_b_lrclk,
>> + &tdmout_c_lrclk,
>> + &spdifout_b_clk_sel,
>> + &spdifout_b_clk_div,
>> + &spdifout_b_clk,
>> + &s4_tdm_mclk_pad_0,
>> + &s4_tdm_mclk_pad_1,
>> + &s4_tdm_lrclk_pad_0,
>> + &s4_tdm_lrclk_pad_1,
>> + &s4_tdm_lrclk_pad_2,
>> + &s4_tdm_sclk_pad_0,
>> + &s4_tdm_sclk_pad_1,
>> + &s4_tdm_sclk_pad_2,
>> + &sm1_aud_top,
>> + &toram,
>> + &eqdrc,
>> + &resample_b,
>> + &tovad,
>> + &locker,
>> + &spdifin_lb,
>> + &frddr_d,
>> + &toddr_d,
>> + &loopback_b,
>> + &sm1_clk81_en,
>> + &sm1_sysclk_a_div,
>> + &sm1_sysclk_a_en,
>> + &sm1_sysclk_b_div,
>> + &sm1_sysclk_b_en,
>> + &earcrx,
>> + &sm1_earcrx_cmdc_clk_sel,
>> + &sm1_earcrx_cmdc_clk_div,
>> + &sm1_earcrx_cmdc_clk,
>> + &sm1_earcrx_dmac_clk_sel,
>> + &sm1_earcrx_dmac_clk_div,
>> + &sm1_earcrx_dmac_clk,
>> + &s4_tdm_mclk_pad0_sel,
>> + &s4_tdm_mclk_pad1_sel,
>> + &s4_tdm_mclk_pad0_div,
>> + &s4_tdm_mclk_pad1_div,
>> + &s4_tdm_mclk_pad_2,
>> + &s4_tdm_mclk_pad2_sel,
>> + &s4_tdm_mclk_pad2_div,
>> + &s4_tdm_sclk_pad_3,
>> + &s4_tdm_sclk_pad_4,
>> + &s4_tdm_lrclk_pad_3,
>> + &s4_tdm_lrclk_pad_4,
>> +};
>> +
>> struct axg_audio_reset_data {
>> struct reset_controller_dev rstc;
>> struct regmap *map;
>> @@ -1822,7 +2214,6 @@ static int axg_audio_clkc_probe(struct platform_device *pdev)
>> continue;
>>
>> name = hw->init->name;
>> -
>> ret = devm_clk_hw_register(dev, hw);
>> if (ret) {
>> dev_err(dev, "failed to register clock %s\n", name);
>> @@ -1886,6 +2277,18 @@ static const struct audioclk_data sm1_audioclk_data = {
>> .max_register = AUDIO_EARCRX_DMAC_CLK_CTRL,
>> };
>>
>> +static const struct audioclk_data s4_audioclk_data = {
>> + .regmap_clks = s4_clk_regmaps,
>> + .regmap_clk_num = ARRAY_SIZE(s4_clk_regmaps),
>> + .hw_clks = {
>> + .hws = s4_audio_hw_clks,
>> + .num = ARRAY_SIZE(s4_audio_hw_clks),
>> + },
>> + .reset_offset = AUDIO_SM1_SW_RESET0,
>> + .reset_num = 39,
>> + .max_register = AUDIO_S4_SCLK_PAD_CTRL1,
>> +};
>> +
>> static const struct of_device_id clkc_match_table[] = {
>> {
>> .compatible = "amlogic,axg-audio-clkc",
>> @@ -1896,7 +2299,10 @@ static const struct of_device_id clkc_match_table[] = {
>> }, {
>> .compatible = "amlogic,sm1-audio-clkc",
>> .data = &sm1_audioclk_data
>> - }, {}
>> + }, {
>> + .compatible = "amlogic,s4-audio-clkc",
>> + .data = &s4_audioclk_data
>> + }, { }
>> };
>> MODULE_DEVICE_TABLE(of, clkc_match_table);
>>
>> diff --git a/drivers/clk/meson/axg-audio.h b/drivers/clk/meson/axg-audio.h
>> index 9e7765b630c96a8029140539ffda789b7db5277a..2dd1c41d775da8f91ed281470d06e9c970cfc92c 100644
>> --- a/drivers/clk/meson/axg-audio.h
>> +++ b/drivers/clk/meson/axg-audio.h
>> @@ -66,5 +66,9 @@
>> #define AUDIO_CLK81_EN 0x034
>> #define AUDIO_EARCRX_CMDC_CLK_CTRL 0x0D0
>> #define AUDIO_EARCRX_DMAC_CLK_CTRL 0x0D4
> Judging by the DT posted, there is plenty in between of non-clock
> component in between these 2 offsets/regions
>
>> +#define AUDIO_S4_MCLK_PAD_CTRL0 0xE80
>> +#define AUDIO_S4_MCLK_PAD_CTRL1 0xE84
>> +#define AUDIO_S4_SCLK_PAD_CTRL0 0xE88
>> +#define AUDIO_S4_SCLK_PAD_CTRL1 0xE8C
>>
> ... and this is not even mapped by the clock controller, so this won't
> work with the DT you have posted.
Hi, Jerome
thanks, I will recheck the register offset regmap, some register is
really not friendly enough,
so the software may need to change a lot in order to be compatible
>
>> #endif /*__AXG_AUDIO_CLKC_H */
> --
> Jerome
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2025-03-07 2:58 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-28 8:04 [PATCH v3 0/6] Add support for S4 audio jiebing chen via B4 Relay
2025-02-28 8:04 ` [PATCH v3 1/6] dt-bindings: clock: meson: Add audio power domain for s4 soc jiebing chen via B4 Relay
2025-02-28 21:51 ` Rob Herring
2025-02-28 8:04 ` [PATCH v3 2/6] dt-bindings: clock: axg-audio: Add mclk and sclk pad clock ids jiebing chen via B4 Relay
2025-02-28 21:53 ` Rob Herring (Arm)
2025-02-28 8:04 ` [PATCH v3 3/6] dt-bindings: Asoc: axg-audio: Add s4 audio tocodec jiebing chen via B4 Relay
2025-02-28 21:54 ` Rob Herring (Arm)
2025-02-28 8:04 ` [PATCH v3 4/6] clk: meson: axg-audio: Add the mclk pad div for s4 jiebing chen via B4 Relay
2025-03-06 16:41 ` Jerome Brunet
2025-03-07 2:58 ` Jiebing Chen
2025-02-28 8:04 ` [PATCH v3 5/6] ASoC: meson: s4: Add s4 tocodec driver jiebing chen via B4 Relay
2025-03-06 15:58 ` Jerome Brunet
2025-03-07 2:48 ` Jiebing Chen
2025-02-28 8:04 ` [PATCH v3 6/6] arm64: dts: amlogic: Add Amlogic S4 Audio jiebing chen via B4 Relay
2025-02-28 14:23 ` [PATCH v3 0/6] Add support for S4 audio Rob Herring (Arm)
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).