diff --git a/arch/arm/boot/dts/amlogic/sm1_s905d3_ac200.dts b/arch/arm/boot/dts/amlogic/sm1_s905d3_ac200.dts index 73efed76ad4b..5f63e5d02618 100644 --- a/arch/arm/boot/dts/amlogic/sm1_s905d3_ac200.dts +++ b/arch/arm/boot/dts/amlogic/sm1_s905d3_ac200.dts @@ -1124,6 +1124,12 @@ */ samesource_sel = <3>; + /*enable default mclk(12.288M), before extern codec start*/ + start_clk_enable = <1>; + + /*tdm clk tuning enable*/ + clk_tuning_enable = <1>; + status = "okay"; }; @@ -1164,6 +1170,9 @@ pinctrl-names = "spdif_pins"; pinctrl-0 = <&spdifout &spdifin>; + /*spdif clk tuning enable*/ + clk_tuning_enable = <1>; + status = "okay"; }; spdifb: spdif@1 { diff --git a/arch/arm/boot/dts/amlogic/sm1_s905d3_ac202.dts b/arch/arm/boot/dts/amlogic/sm1_s905d3_ac202.dts index e7ed890b9df3..4b5a93b1b83a 100644 --- a/arch/arm/boot/dts/amlogic/sm1_s905d3_ac202.dts +++ b/arch/arm/boot/dts/amlogic/sm1_s905d3_ac202.dts @@ -1269,6 +1269,9 @@ /*spdif clk tuning enable*/ clk_tuning_enable = <1>; + /*spdif clk tuning enable*/ + clk_tuning_enable = <1>; + status = "okay"; }; spdifb: spdif@1 { diff --git a/arch/arm/boot/dts/amlogic/sm1_s905d3_skt.dts b/arch/arm/boot/dts/amlogic/sm1_s905d3_skt.dts index 1d8e3e1e834f..8527d10a2a9b 100644 --- a/arch/arm/boot/dts/amlogic/sm1_s905d3_skt.dts +++ b/arch/arm/boot/dts/amlogic/sm1_s905d3_skt.dts @@ -1122,6 +1122,12 @@ */ samesource_sel = <3>; + /*enable default mclk(12.288M), before extern codec start*/ + start_clk_enable = <0>; + + /*tdm clk tuning enable*/ + clk_tuning_enable = <1>; + status = "okay"; }; @@ -1162,6 +1168,9 @@ pinctrl-names = "spdif_pins"; pinctrl-0 = <&spdifout &spdifin>; + /*spdif clk tuning enable*/ + clk_tuning_enable = <1>; + status = "okay"; }; spdifb: spdif@1 { diff --git a/arch/arm/boot/dts/amlogic/sm1_s905x3_ac213.dts b/arch/arm/boot/dts/amlogic/sm1_s905x3_ac213.dts index be8d1ef0597d..85dcbf28c0f6 100644 --- a/arch/arm/boot/dts/amlogic/sm1_s905x3_ac213.dts +++ b/arch/arm/boot/dts/amlogic/sm1_s905x3_ac213.dts @@ -1117,6 +1117,12 @@ */ samesource_sel = <3>; + /*enable default mclk(12.288M), before extern codec start*/ + start_clk_enable = <1>; + + /*tdm clk tuning enable*/ + clk_tuning_enable = <1>; + status = "okay"; }; @@ -1156,6 +1162,9 @@ pinctrl-names = "spdif_pins"; pinctrl-0 = <&spdifout &spdifin>; + /*spdif clk tuning enable*/ + clk_tuning_enable = <1>; + status = "okay"; }; spdifb: spdif@1 { diff --git a/arch/arm/boot/dts/amlogic/tl1_t962x2_t309.dts b/arch/arm/boot/dts/amlogic/tl1_t962x2_t309.dts index 453986fe1625..dbc34b5be5d4 100644 --- a/arch/arm/boot/dts/amlogic/tl1_t962x2_t309.dts +++ b/arch/arm/boot/dts/amlogic/tl1_t962x2_t309.dts @@ -1298,6 +1298,11 @@ acodec_adc = <1>; mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ + /*enable default mclk(12.288M), before extern codec start*/ + start_clk_enable = <1>; + + /*tdm clk tuning enable*/ + clk_tuning_enable = <1>; status = "okay"; /* !!!For --TV platform-- ONLY */ @@ -1430,6 +1435,8 @@ asrc_id = <0>; auto_asrc = <0>; + /*spdif clk tuning enable*/ + clk_tuning_enable = <1>; status = "okay"; }; diff --git a/arch/arm/boot/dts/amlogic/tl1_t962x2_x301.dts b/arch/arm/boot/dts/amlogic/tl1_t962x2_x301.dts index 9030088ca411..496cb09541eb 100644 --- a/arch/arm/boot/dts/amlogic/tl1_t962x2_x301.dts +++ b/arch/arm/boot/dts/amlogic/tl1_t962x2_x301.dts @@ -991,6 +991,12 @@ acodec_adc = <1>; mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ + /*enable default mclk(12.288M), before extern codec start*/ + start_clk_enable = <1>; + + /*tdm clk tuning enable*/ + clk_tuning_enable = <1>; + status = "okay"; /* !!!For --TV platform-- ONLY */ @@ -1123,6 +1129,9 @@ asrc_id = <0>; auto_asrc = <0>; + /*spdif clk tuning enable*/ + clk_tuning_enable = <1>; + status = "okay"; }; diff --git a/arch/arm/boot/dts/amlogic/tl1_t962x2_x301_1g.dts b/arch/arm/boot/dts/amlogic/tl1_t962x2_x301_1g.dts index 39e7bc0e78e4..53b80e84f926 100644 --- a/arch/arm/boot/dts/amlogic/tl1_t962x2_x301_1g.dts +++ b/arch/arm/boot/dts/amlogic/tl1_t962x2_x301_1g.dts @@ -1556,6 +1556,11 @@ acodec_adc = <1>; mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ + /*enable default mclk(12.288M), before extern codec start*/ + start_clk_enable = <1>; + + /*tdm clk tuning enable*/ + clk_tuning_enable = <1>; status = "okay"; /* !!!For --TV platform-- ONLY */ @@ -1688,6 +1693,8 @@ asrc_id = <0>; auto_asrc = <0>; + /*spdif clk tuning enable*/ + clk_tuning_enable = <1>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/amlogic/sm1_s905d3_ac200.dts b/arch/arm64/boot/dts/amlogic/sm1_s905d3_ac200.dts index 48722e396b01..ca90d0054f63 100644 --- a/arch/arm64/boot/dts/amlogic/sm1_s905d3_ac200.dts +++ b/arch/arm64/boot/dts/amlogic/sm1_s905d3_ac200.dts @@ -1124,6 +1124,12 @@ */ samesource_sel = <3>; + /*enable default mclk(12.288M), before extern codec start*/ + start_clk_enable = <1>; + + /*tdm clk tuning enable*/ + clk_tuning_enable = <1>; + status = "okay"; }; @@ -1164,6 +1170,9 @@ pinctrl-names = "spdif_pins"; pinctrl-0 = <&spdifout /* &spdifin */>; + /*spdif clk tuning enable*/ + clk_tuning_enable = <1>; + status = "okay"; }; spdifb: spdif@1 { diff --git a/arch/arm64/boot/dts/amlogic/sm1_s905d3_ac202.dts b/arch/arm64/boot/dts/amlogic/sm1_s905d3_ac202.dts index 5e19c9d38e78..1b05cc910985 100644 --- a/arch/arm64/boot/dts/amlogic/sm1_s905d3_ac202.dts +++ b/arch/arm64/boot/dts/amlogic/sm1_s905d3_ac202.dts @@ -1173,6 +1173,12 @@ /*tdm clk tuning enable*/ clk_tuning_enable = <1>; + /*enable default mclk(12.288M), before extern codec start*/ + start_clk_enable = <1>; + + /*tdm clk tuning enable*/ + clk_tuning_enable = <1>; + status = "okay"; }; @@ -1265,6 +1271,9 @@ /*spdif clk tuning enable*/ clk_tuning_enable = <1>; + /*spdif clk tuning enable*/ + clk_tuning_enable = <1>; + status = "okay"; }; spdifb: spdif@1 { diff --git a/arch/arm64/boot/dts/amlogic/sm1_s905d3_ac202_1g.dts b/arch/arm64/boot/dts/amlogic/sm1_s905d3_ac202_1g.dts index 492598d5957a..801b0194ee71 100644 --- a/arch/arm64/boot/dts/amlogic/sm1_s905d3_ac202_1g.dts +++ b/arch/arm64/boot/dts/amlogic/sm1_s905d3_ac202_1g.dts @@ -1266,6 +1266,9 @@ /*spdif clk tuning enable*/ clk_tuning_enable = <1>; + /*spdif clk tuning enable*/ + clk_tuning_enable = <1>; + status = "okay"; }; spdifb: spdif@1 { diff --git a/arch/arm64/boot/dts/amlogic/sm1_s905d3_skt.dts b/arch/arm64/boot/dts/amlogic/sm1_s905d3_skt.dts index f0d28bc88edd..4fcc6684c368 100644 --- a/arch/arm64/boot/dts/amlogic/sm1_s905d3_skt.dts +++ b/arch/arm64/boot/dts/amlogic/sm1_s905d3_skt.dts @@ -1120,6 +1120,12 @@ */ samesource_sel = <3>; + /*enable default mclk(12.288M), before extern codec start*/ + start_clk_enable = <0>; + + /*tdm clk tuning enable*/ + clk_tuning_enable = <1>; + status = "okay"; }; @@ -1160,6 +1166,9 @@ pinctrl-names = "spdif_pins"; pinctrl-0 = <&spdifout &spdifin>; + /*spdif clk tuning enable*/ + clk_tuning_enable = <1>; + status = "okay"; }; spdifb: spdif@1 { diff --git a/arch/arm64/boot/dts/amlogic/sm1_s905x3_ac213.dts b/arch/arm64/boot/dts/amlogic/sm1_s905x3_ac213.dts index d59a1593ffca..ea12cf95bb62 100644 --- a/arch/arm64/boot/dts/amlogic/sm1_s905x3_ac213.dts +++ b/arch/arm64/boot/dts/amlogic/sm1_s905x3_ac213.dts @@ -1194,6 +1194,12 @@ */ samesource_sel = <3>; + /*enable default mclk(12.288M), before extern codec start*/ + start_clk_enable = <1>; + + /*tdm clk tuning enable*/ + clk_tuning_enable = <1>; + status = "okay"; }; @@ -1232,6 +1238,9 @@ pinctrl-names = "spdif_pins"; pinctrl-0 = <&spdifout &spdifin>; + /*spdif clk tuning enable*/ + clk_tuning_enable = <1>; + status = "okay"; }; spdifb: spdif@1 { diff --git a/arch/arm64/boot/dts/amlogic/tl1_t962x2_t309.dts b/arch/arm64/boot/dts/amlogic/tl1_t962x2_t309.dts index 91c55d2ca16a..de12fc0851f5 100644 --- a/arch/arm64/boot/dts/amlogic/tl1_t962x2_t309.dts +++ b/arch/arm64/boot/dts/amlogic/tl1_t962x2_t309.dts @@ -1489,6 +1489,11 @@ acodec_adc = <1>; mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ + /*enable default mclk(12.288M), before extern codec start*/ + start_clk_enable = <1>; + + /*tdm clk tuning enable*/ + clk_tuning_enable = <1>; status = "okay"; /* !!!For --TV platform-- ONLY */ @@ -1621,6 +1626,8 @@ asrc_id = <0>; auto_asrc = <0>; + /*spdif clk tuning enable*/ + clk_tuning_enable = <1>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_1g.dts b/arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_1g.dts index d60b0c062c46..7d0142d2f956 100644 --- a/arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_1g.dts +++ b/arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_1g.dts @@ -1364,6 +1364,11 @@ acodec_adc = <1>; mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ + /*enable default mclk(12.288M), before extern codec start*/ + start_clk_enable = <1>; + + /*tdm clk tuning enable*/ + clk_tuning_enable = <1>; status = "okay"; /* !!!For --TV platform-- ONLY */ @@ -1496,6 +1501,8 @@ asrc_id = <0>; auto_asrc = <0>; + /*spdif clk tuning enable*/ + clk_tuning_enable = <1>; status = "okay"; }; diff --git a/arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_2g.dts b/arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_2g.dts index aaa2caffcafc..eb77bb75bd49 100644 --- a/arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_2g.dts +++ b/arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_2g.dts @@ -1358,6 +1358,11 @@ acodec_adc = <1>; mclk_pad = <0>; /* 0: mclk_0; 1: mclk_1 */ + /*enable default mclk(12.288M), before extern codec start*/ + start_clk_enable = <1>; + + /*tdm clk tuning enable*/ + clk_tuning_enable = <1>; status = "okay"; /* !!!For --TV platform-- ONLY */ @@ -1490,6 +1495,8 @@ asrc_id = <0>; auto_asrc = <0>; + /*spdif clk tuning enable*/ + clk_tuning_enable = <1>; status = "okay"; }; diff --git a/sound/soc/amlogic/auge/spdif.c b/sound/soc/amlogic/auge/spdif.c index f25eeb180079..7bbf04f8a7c3 100644 --- a/sound/soc/amlogic/auge/spdif.c +++ b/sound/soc/amlogic/auge/spdif.c @@ -483,7 +483,9 @@ static const struct snd_kcontrol_new snd_spdif_controls[] = { 0, aml_get_hdmi_out_audio, aml_set_hdmi_out_audio), #endif +}; +static const struct snd_kcontrol_new snd_spdif_clk_controls[] = { SOC_SINGLE_EXT("SPDIF CLK Fine Setting", 0, 0, 2000000, 0, spdif_clk_get, @@ -1071,6 +1073,15 @@ static int aml_dai_spdif_probe(struct snd_soc_dai *cpu_dai) pr_err("%s, failed add snd spdif controls\n", __func__); } + if (p_spdif->clk_tuning_enable == 1) { + ret = snd_soc_add_dai_controls(cpu_dai, + snd_spdif_clk_controls, + ARRAY_SIZE(snd_spdif_clk_controls)); + if (ret < 0) + pr_err("%s, failed add snd spdif clk controls\n", + __func__); + } + return 0; } @@ -1608,6 +1619,15 @@ static int aml_spdif_parse_of(struct platform_device *pdev) return PTR_ERR(p_spdif->clk_spdifout); } + ret = of_property_read_u32(pdev->dev.of_node, + "clk_tuning_enable", + &p_spdif->clk_tuning_enable); + if (ret < 0) + p_spdif->clk_tuning_enable = 0; + else + pr_info("Spdif id %d tuning clk enable:%d\n", + p_spdif->id, p_spdif->clk_tuning_enable); + return 0; } diff --git a/sound/soc/amlogic/auge/tdm.c b/sound/soc/amlogic/auge/tdm.c index 8eda69748f02..92e892ed3377 100644 --- a/sound/soc/amlogic/auge/tdm.c +++ b/sound/soc/amlogic/auge/tdm.c @@ -209,21 +209,19 @@ static const struct soc_enum i2sin_clk_enum[] = { i2sin_clk), }; - - static const struct snd_kcontrol_new snd_tdm_controls[] = { SOC_ENUM_EXT("I2SIn CLK", i2sin_clk_enum, tdmin_clk_get, NULL), +}; +static const struct snd_kcontrol_new snd_tdm_clk_controls[] = { SOC_SINGLE_EXT("TDM MCLK Fine Setting", 0, 0, 2000000, 0, tdm_clk_get, tdm_clk_set), }; - - static irqreturn_t aml_tdm_ddr_isr(int irq, void *devid) { struct snd_pcm_substream *substream = (struct snd_pcm_substream *)devid; @@ -1322,7 +1320,16 @@ static int aml_dai_tdm_probe(struct snd_soc_dai *cpu_dai) ret = snd_soc_add_dai_controls(cpu_dai, snd_tdm_controls, ARRAY_SIZE(snd_tdm_controls)); if (ret < 0) - pr_err("%s, failed add snd spdif controls\n", __func__); + pr_err("%s, failed add snd tdm controls\n", __func__); + + if (p_tdm->clk_tuning_enable == 1) { + ret = snd_soc_add_dai_controls(cpu_dai, + snd_tdm_clk_controls, + ARRAY_SIZE(snd_tdm_clk_controls)); + if (ret < 0) + pr_err("%s, failed add snd tdm clk controls\n", + __func__); + } /* config ddr arb */ aml_tdm_arb_config(p_tdm->actrl); @@ -1730,14 +1737,17 @@ static int aml_tdm_platform_probe(struct platform_device *pdev) /*return PTR_ERR(p_tdm->pin_ctl);*/ } - /* mclk pad ctrl */ - ret = of_property_read_u32(node, "mclk_pad", - &p_tdm->mclk_pad); + ret = of_property_read_u32(node, "start_clk_enable", + &p_tdm->start_clk_enable); if (ret < 0) - p_tdm->mclk_pad = -1; /* not use mclk in defalut. */ + p_tdm->start_clk_enable = 0; + else + pr_info("TDM id %d output clk enable:%d\n", + p_tdm->id, p_tdm->start_clk_enable); /*set default clk for output*/ - aml_set_default_tdm_clk(p_tdm); + if (p_tdm->start_clk_enable == 1) + aml_set_default_tdm_clk(p_tdm); p_tdm->dev = dev; /* For debug to disable share buffer */ @@ -1755,6 +1765,14 @@ static int aml_tdm_platform_probe(struct platform_device *pdev) return ret; } + ret = of_property_read_u32(node, "clk_tuning_enable", + &p_tdm->clk_tuning_enable); + if (ret < 0) + p_tdm->clk_tuning_enable = 0; + else + pr_info("TDM id %d tuning clk enable:%d\n", + p_tdm->id, p_tdm->clk_tuning_enable); + return devm_snd_soc_register_platform(dev, &aml_tdm_platform); }