Lines Matching +full:dai +full:- +full:format
1 // SPDX-License-Identifier: GPL-2.0
3 // MediaTek ALSA SoC Audio DAI I2S Control
11 #include "mt8183-afe-clk.h"
12 #include "mt8183-afe-common.h"
13 #include "mt8183-interconnection.h"
14 #include "mt8183-reg.h"
56 static unsigned int get_i2s_wlen(snd_pcm_format_t format) in get_i2s_wlen() argument
58 return snd_pcm_format_physical_width(format) <= 16 ? in get_i2s_wlen()
94 return -EINVAL; in get_i2s_id_by_name()
100 struct mt8183_afe_private *afe_priv = afe->platform_priv; in get_i2s_priv_by_name()
106 return afe_priv->dai_priv[dai_id]; in get_i2s_priv_by_name()
126 i2s_priv = get_i2s_priv_by_name(afe, kcontrol->id.name); in mt8183_i2s_hd_get()
129 dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__); in mt8183_i2s_hd_get()
130 return -EINVAL; in mt8183_i2s_hd_get()
133 ucontrol->value.integer.value[0] = i2s_priv->low_jitter_en; in mt8183_i2s_hd_get()
144 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; in mt8183_i2s_hd_set()
147 if (ucontrol->value.enumerated.item[0] >= e->items) in mt8183_i2s_hd_set()
148 return -EINVAL; in mt8183_i2s_hd_set()
150 hd_en = ucontrol->value.integer.value[0]; in mt8183_i2s_hd_set()
152 dev_info(afe->dev, "%s(), kcontrol name %s, hd_en %d\n", in mt8183_i2s_hd_set()
153 __func__, kcontrol->id.name, hd_en); in mt8183_i2s_hd_set()
155 i2s_priv = get_i2s_priv_by_name(afe, kcontrol->id.name); in mt8183_i2s_hd_set()
158 dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__); in mt8183_i2s_hd_set()
159 return -EINVAL; in mt8183_i2s_hd_set()
162 i2s_priv->low_jitter_en = hd_en; in mt8183_i2s_hd_set()
180 /* dai component */
277 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm); in mtk_apll_event()
280 dev_info(cmpnt->dev, "%s(), name %s, event 0x%x\n", in mtk_apll_event()
281 __func__, w->name, event); in mtk_apll_event()
285 if (strcmp(w->name, APLL1_W_NAME) == 0) in mtk_apll_event()
291 if (strcmp(w->name, APLL1_W_NAME) == 0) in mtk_apll_event()
307 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm); in mtk_mclk_en_event()
311 dev_info(cmpnt->dev, "%s(), name %s, event 0x%x\n", in mtk_mclk_en_event()
312 __func__, w->name, event); in mtk_mclk_en_event()
314 i2s_priv = get_i2s_priv_by_name(afe, w->name); in mtk_mclk_en_event()
317 dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__); in mtk_mclk_en_event()
318 return -EINVAL; in mtk_mclk_en_event()
323 mt8183_mck_enable(afe, i2s_priv->mclk_id, i2s_priv->mclk_rate); in mtk_mclk_en_event()
326 i2s_priv->mclk_rate = 0; in mtk_mclk_en_event()
327 mt8183_mck_disable(afe, i2s_priv->mclk_id); in mtk_mclk_en_event()
428 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm); in mtk_afe_i2s_share_connect()
432 i2s_priv = get_i2s_priv_by_name(afe, sink->name); in mtk_afe_i2s_share_connect()
435 dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__); in mtk_afe_i2s_share_connect()
439 if (i2s_priv->share_i2s_id < 0) in mtk_afe_i2s_share_connect()
442 return i2s_priv->share_i2s_id == get_i2s_id_by_name(afe, source->name); in mtk_afe_i2s_share_connect()
449 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm); in mtk_afe_i2s_hd_connect()
453 i2s_priv = get_i2s_priv_by_name(afe, sink->name); in mtk_afe_i2s_hd_connect()
456 dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__); in mtk_afe_i2s_hd_connect()
460 if (get_i2s_id_by_name(afe, sink->name) == in mtk_afe_i2s_hd_connect()
461 get_i2s_id_by_name(afe, source->name)) in mtk_afe_i2s_hd_connect()
462 return i2s_priv->low_jitter_en; in mtk_afe_i2s_hd_connect()
465 if (i2s_priv->share_i2s_id < 0) in mtk_afe_i2s_hd_connect()
468 if (i2s_priv->share_i2s_id == get_i2s_id_by_name(afe, source->name)) in mtk_afe_i2s_hd_connect()
469 return i2s_priv->low_jitter_en; in mtk_afe_i2s_hd_connect()
478 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm); in mtk_afe_i2s_apll_connect()
484 i2s_priv = get_i2s_priv_by_name(afe, w->name); in mtk_afe_i2s_apll_connect()
487 dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__); in mtk_afe_i2s_apll_connect()
492 cur_apll = mt8183_get_apll_by_name(afe, source->name); in mtk_afe_i2s_apll_connect()
495 i2s_need_apll = mt8183_get_apll_by_rate(afe, i2s_priv->rate); in mtk_afe_i2s_apll_connect()
504 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm); in mtk_afe_i2s_mclk_connect()
508 i2s_priv = get_i2s_priv_by_name(afe, sink->name); in mtk_afe_i2s_mclk_connect()
511 dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__); in mtk_afe_i2s_mclk_connect()
515 if (get_i2s_id_by_name(afe, sink->name) == in mtk_afe_i2s_mclk_connect()
516 get_i2s_id_by_name(afe, source->name)) in mtk_afe_i2s_mclk_connect()
517 return (i2s_priv->mclk_rate > 0) ? 1 : 0; in mtk_afe_i2s_mclk_connect()
520 if (i2s_priv->share_i2s_id < 0) in mtk_afe_i2s_mclk_connect()
523 if (i2s_priv->share_i2s_id == get_i2s_id_by_name(afe, source->name)) in mtk_afe_i2s_mclk_connect()
524 return (i2s_priv->mclk_rate > 0) ? 1 : 0; in mtk_afe_i2s_mclk_connect()
533 struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm); in mtk_afe_mclk_apll_connect()
538 i2s_priv = get_i2s_priv_by_name(afe, w->name); in mtk_afe_mclk_apll_connect()
541 dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__); in mtk_afe_mclk_apll_connect()
546 cur_apll = mt8183_get_apll_by_name(afe, source->name); in mtk_afe_mclk_apll_connect()
548 return (i2s_priv->mclk_apll == cur_apll) ? 1 : 0; in mtk_afe_mclk_apll_connect()
704 /* dai ops */
709 struct mt8183_afe_private *afe_priv = afe->platform_priv; in mtk_dai_i2s_config()
710 struct mtk_afe_i2s_priv *i2s_priv = afe_priv->dai_priv[i2s_id]; in mtk_dai_i2s_config()
713 unsigned int rate_reg = mt8183_rate_transform(afe->dev, in mtk_dai_i2s_config()
715 snd_pcm_format_t format = params_format(params); in mtk_dai_i2s_config() local
719 dev_info(afe->dev, "%s(), id %d, rate %d, format %d\n", in mtk_dai_i2s_config()
722 rate, format); in mtk_dai_i2s_config()
725 i2s_priv->rate = rate; in mtk_dai_i2s_config()
727 if (i2s_priv->use_eiaj) in mtk_dai_i2s_config()
730 dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__); in mtk_dai_i2s_config()
735 regmap_update_bits(afe->regmap, AFE_DAC_CON1, in mtk_dai_i2s_config()
739 i2s_con |= get_i2s_wlen(format) << I2S_WLEN_SFT; in mtk_dai_i2s_config()
740 regmap_update_bits(afe->regmap, AFE_I2S_CON, in mtk_dai_i2s_config()
747 i2s_con |= get_i2s_wlen(format) << I2S2_WLEN_SFT; in mtk_dai_i2s_config()
748 regmap_update_bits(afe->regmap, AFE_I2S_CON1, in mtk_dai_i2s_config()
755 i2s_con |= get_i2s_wlen(format) << I2S3_WLEN_SFT; in mtk_dai_i2s_config()
756 regmap_update_bits(afe->regmap, AFE_I2S_CON2, in mtk_dai_i2s_config()
762 i2s_con |= get_i2s_wlen(format) << I2S4_WLEN_SFT; in mtk_dai_i2s_config()
763 regmap_update_bits(afe->regmap, AFE_I2S_CON3, in mtk_dai_i2s_config()
769 i2s_con |= get_i2s_wlen(format) << I2S5_WLEN_SFT; in mtk_dai_i2s_config()
770 regmap_update_bits(afe->regmap, AFE_I2S_CON4, in mtk_dai_i2s_config()
774 dev_warn(afe->dev, "%s(), id %d not support\n", in mtk_dai_i2s_config()
776 return -EINVAL; in mtk_dai_i2s_config()
780 if (i2s_priv && i2s_priv->share_i2s_id >= 0) in mtk_dai_i2s_config()
781 ret = mtk_dai_i2s_config(afe, params, i2s_priv->share_i2s_id); in mtk_dai_i2s_config()
788 struct snd_soc_dai *dai) in mtk_dai_i2s_hw_params() argument
790 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); in mtk_dai_i2s_hw_params()
792 return mtk_dai_i2s_config(afe, params, dai->id); in mtk_dai_i2s_hw_params()
795 static int mtk_dai_i2s_set_sysclk(struct snd_soc_dai *dai, in mtk_dai_i2s_set_sysclk() argument
798 struct mtk_base_afe *afe = dev_get_drvdata(dai->dev); in mtk_dai_i2s_set_sysclk()
799 struct mt8183_afe_private *afe_priv = afe->platform_priv; in mtk_dai_i2s_set_sysclk()
800 struct mtk_afe_i2s_priv *i2s_priv = afe_priv->dai_priv[dai->id]; in mtk_dai_i2s_set_sysclk()
805 dev_warn(afe->dev, "%s(), i2s_priv == NULL", __func__); in mtk_dai_i2s_set_sysclk()
806 return -EINVAL; in mtk_dai_i2s_set_sysclk()
810 dev_warn(afe->dev, "%s(), dir != SND_SOC_CLOCK_OUT", __func__); in mtk_dai_i2s_set_sysclk()
811 return -EINVAL; in mtk_dai_i2s_set_sysclk()
814 dev_info(afe->dev, "%s(), freq %d\n", __func__, freq); in mtk_dai_i2s_set_sysclk()
820 dev_warn(afe->dev, "%s(), freq > apll rate", __func__); in mtk_dai_i2s_set_sysclk()
821 return -EINVAL; in mtk_dai_i2s_set_sysclk()
825 dev_warn(afe->dev, "%s(), APLL cannot generate freq Hz", in mtk_dai_i2s_set_sysclk()
827 return -EINVAL; in mtk_dai_i2s_set_sysclk()
830 i2s_priv->mclk_rate = freq; in mtk_dai_i2s_set_sysclk()
831 i2s_priv->mclk_apll = apll; in mtk_dai_i2s_set_sysclk()
833 if (i2s_priv->share_i2s_id > 0) { in mtk_dai_i2s_set_sysclk()
836 share_i2s_priv = afe_priv->dai_priv[i2s_priv->share_i2s_id]; in mtk_dai_i2s_set_sysclk()
838 dev_warn(afe->dev, "%s(), share_i2s_priv == NULL", in mtk_dai_i2s_set_sysclk()
840 return -EINVAL; in mtk_dai_i2s_set_sysclk()
843 share_i2s_priv->mclk_rate = i2s_priv->mclk_rate; in mtk_dai_i2s_set_sysclk()
844 share_i2s_priv->mclk_apll = i2s_priv->mclk_apll; in mtk_dai_i2s_set_sysclk()
850 static int mtk_dai_i2s_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) in mtk_dai_i2s_set_fmt() argument
852 struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai); in mtk_dai_i2s_set_fmt()
853 struct mt8183_afe_private *afe_priv = afe->platform_priv; in mtk_dai_i2s_set_fmt()
856 switch (dai->id) { in mtk_dai_i2s_set_fmt()
864 dev_warn(afe->dev, "%s(), id %d not support\n", in mtk_dai_i2s_set_fmt()
865 __func__, dai->id); in mtk_dai_i2s_set_fmt()
866 return -EINVAL; in mtk_dai_i2s_set_fmt()
868 i2s_priv = afe_priv->dai_priv[dai->id]; in mtk_dai_i2s_set_fmt()
872 i2s_priv->use_eiaj = 1; in mtk_dai_i2s_set_fmt()
875 i2s_priv->use_eiaj = 0; in mtk_dai_i2s_set_fmt()
878 dev_warn(afe->dev, "%s(), DAI format %d not support\n", in mtk_dai_i2s_set_fmt()
880 return -EINVAL; in mtk_dai_i2s_set_fmt()
892 /* dai driver */
980 .share_property_name = "i2s0-share",
981 .share_i2s_id = -1,
986 .share_property_name = "i2s1-share",
987 .share_i2s_id = -1,
992 .share_property_name = "i2s2-share",
993 .share_i2s_id = -1,
998 .share_property_name = "i2s3-share",
999 .share_i2s_id = -1,
1004 .share_property_name = "i2s5-share",
1005 .share_i2s_id = -1,
1011 struct mt8183_afe_private *afe_priv = afe->platform_priv; in mt8183_dai_i2s_get_share()
1012 const struct device_node *of_node = afe->dev->of_node; in mt8183_dai_i2s_get_share()
1019 i2s_priv = afe_priv->dai_priv[mt8183_i2s_priv[i].id]; in mt8183_dai_i2s_get_share()
1023 i2s_priv->share_i2s_id = get_i2s_id_by_name(afe, of_str); in mt8183_dai_i2s_get_share()
1031 struct mt8183_afe_private *afe_priv = afe->platform_priv; in mt8183_dai_i2s_set_priv()
1036 i2s_priv = devm_kzalloc(afe->dev, in mt8183_dai_i2s_set_priv()
1040 return -ENOMEM; in mt8183_dai_i2s_set_priv()
1045 afe_priv->dai_priv[mt8183_i2s_priv[i].id] = i2s_priv; in mt8183_dai_i2s_set_priv()
1053 struct mtk_base_afe_dai *dai; in mt8183_dai_i2s_register() local
1056 dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL); in mt8183_dai_i2s_register()
1057 if (!dai) in mt8183_dai_i2s_register()
1058 return -ENOMEM; in mt8183_dai_i2s_register()
1060 list_add(&dai->list, &afe->sub_dais); in mt8183_dai_i2s_register()
1062 dai->dai_drivers = mtk_dai_i2s_driver; in mt8183_dai_i2s_register()
1063 dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_i2s_driver); in mt8183_dai_i2s_register()
1065 dai->controls = mtk_dai_i2s_controls; in mt8183_dai_i2s_register()
1066 dai->num_controls = ARRAY_SIZE(mtk_dai_i2s_controls); in mt8183_dai_i2s_register()
1067 dai->dapm_widgets = mtk_dai_i2s_widgets; in mt8183_dai_i2s_register()
1068 dai->num_dapm_widgets = ARRAY_SIZE(mtk_dai_i2s_widgets); in mt8183_dai_i2s_register()
1069 dai->dapm_routes = mtk_dai_i2s_routes; in mt8183_dai_i2s_register()
1070 dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_i2s_routes); in mt8183_dai_i2s_register()
1072 /* set all dai i2s private data */ in mt8183_dai_i2s_register()