Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

ASoC: Intel: sof_sdw: add common sdw dai link init

Currently, we set sdw dai link .init callback in the codec_info_list's
dais.init function. This works fine if all codecs in the dai link are
the same. However, we need to do all the .init stuff for all different
codecs in the dai link if not all codecs in the dai link are the same.
Use a common dai link .init callback to call the new rtd_init callback
in sof_sdw_dai_info{} to do rtd_init for each dai.
Some codec init callback will become empty after this change. They will
be removed in the follow up patch.

Reviewed-by: Rander Wang <rander.wang@intel.com>
Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20240208165545.93811-18-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Bard Liao and committed by
Mark Brown
8266c731 7bc6ceba

+108 -40
+74 -1
sound/soc/intel/boards/sof_sdw.c
··· 651 651 .dai_type = SOF_SDW_DAI_TYPE_JACK, 652 652 .dailink = {SDW_JACK_OUT_DAI_ID, SDW_JACK_IN_DAI_ID}, 653 653 .init = sof_sdw_rt700_init, 654 + .rtd_init = rt700_rtd_init, 654 655 }, 655 656 }, 656 657 .dai_num = 1, ··· 667 666 .dailink = {SDW_JACK_OUT_DAI_ID, SDW_JACK_IN_DAI_ID}, 668 667 .init = sof_sdw_rt_sdca_jack_init, 669 668 .exit = sof_sdw_rt_sdca_jack_exit, 669 + .rtd_init = rt_sdca_jack_rtd_init, 670 670 }, 671 671 }, 672 672 .dai_num = 1, ··· 683 681 .dailink = {SDW_JACK_OUT_DAI_ID, SDW_JACK_IN_DAI_ID}, 684 682 .init = sof_sdw_rt711_init, 685 683 .exit = sof_sdw_rt711_exit, 684 + .rtd_init = rt711_rtd_init, 686 685 }, 687 686 }, 688 687 .dai_num = 1, ··· 699 696 .dailink = {SDW_JACK_OUT_DAI_ID, SDW_JACK_IN_DAI_ID}, 700 697 .init = sof_sdw_rt_sdca_jack_init, 701 698 .exit = sof_sdw_rt_sdca_jack_exit, 699 + .rtd_init = rt_sdca_jack_rtd_init, 702 700 }, 703 701 { 704 702 .direction = {true, false}, ··· 707 703 .dai_type = SOF_SDW_DAI_TYPE_AMP, 708 704 .dailink = {SDW_AMP_OUT_DAI_ID, SDW_UNUSED_DAI_ID}, 709 705 .init = sof_sdw_rt712_spk_init, 706 + .rtd_init = rt712_spk_rtd_init, 710 707 }, 711 708 }, 712 709 .dai_num = 2, ··· 722 717 .dai_type = SOF_SDW_DAI_TYPE_MIC, 723 718 .dailink = {SDW_UNUSED_DAI_ID, SDW_DMIC_DAI_ID}, 724 719 .init = sof_sdw_rt712_sdca_dmic_init, 720 + .rtd_init = rt712_sdca_dmic_rtd_init, 725 721 }, 726 722 }, 727 723 .dai_num = 1, ··· 738 732 .dailink = {SDW_JACK_OUT_DAI_ID, SDW_JACK_IN_DAI_ID}, 739 733 .init = sof_sdw_rt_sdca_jack_init, 740 734 .exit = sof_sdw_rt_sdca_jack_exit, 735 + .rtd_init = rt_sdca_jack_rtd_init, 741 736 }, 742 737 }, 743 738 .dai_num = 1, ··· 753 746 .dai_type = SOF_SDW_DAI_TYPE_MIC, 754 747 .dailink = {SDW_UNUSED_DAI_ID, SDW_DMIC_DAI_ID}, 755 748 .init = sof_sdw_rt712_sdca_dmic_init, 749 + .rtd_init = rt712_sdca_dmic_rtd_init, 756 750 }, 757 751 }, 758 752 .dai_num = 1, ··· 769 761 .dailink = {SDW_AMP_OUT_DAI_ID, SDW_UNUSED_DAI_ID}, 770 762 .init = sof_sdw_rt_amp_init, 771 763 .exit = sof_sdw_rt_amp_exit, 764 + .rtd_init = rt_amp_spk_rtd_init, 772 765 }, 773 766 }, 774 767 .dai_num = 1, ··· 785 776 .dailink = {SDW_AMP_OUT_DAI_ID, SDW_AMP_IN_DAI_ID}, 786 777 .init = sof_sdw_rt_amp_init, 787 778 .exit = sof_sdw_rt_amp_exit, 779 + .rtd_init = rt_amp_spk_rtd_init, 788 780 }, 789 781 }, 790 782 .dai_num = 1, ··· 800 790 .dailink = {SDW_AMP_OUT_DAI_ID, SDW_AMP_IN_DAI_ID}, 801 791 .init = sof_sdw_rt_amp_init, 802 792 .exit = sof_sdw_rt_amp_exit, 793 + .rtd_init = rt_amp_spk_rtd_init, 803 794 }, 804 795 }, 805 796 .dai_num = 1, ··· 816 805 .dai_type = SOF_SDW_DAI_TYPE_MIC, 817 806 .dailink = {SDW_UNUSED_DAI_ID, SDW_DMIC_DAI_ID}, 818 807 .init = sof_sdw_rt715_sdca_init, 808 + .rtd_init = rt715_sdca_rtd_init, 819 809 }, 820 810 }, 821 811 .dai_num = 1, ··· 832 820 .dai_type = SOF_SDW_DAI_TYPE_MIC, 833 821 .dailink = {SDW_UNUSED_DAI_ID, SDW_DMIC_DAI_ID}, 834 822 .init = sof_sdw_rt715_sdca_init, 823 + .rtd_init = rt715_sdca_rtd_init, 835 824 }, 836 825 }, 837 826 .dai_num = 1, ··· 848 835 .dai_type = SOF_SDW_DAI_TYPE_MIC, 849 836 .dailink = {SDW_UNUSED_DAI_ID, SDW_DMIC_DAI_ID}, 850 837 .init = sof_sdw_rt715_init, 838 + .rtd_init = rt715_rtd_init, 851 839 }, 852 840 }, 853 841 .dai_num = 1, ··· 864 850 .dai_type = SOF_SDW_DAI_TYPE_MIC, 865 851 .dailink = {SDW_UNUSED_DAI_ID, SDW_DMIC_DAI_ID}, 866 852 .init = sof_sdw_rt715_init, 853 + .rtd_init = rt715_rtd_init, 867 854 }, 868 855 }, 869 856 .dai_num = 1, ··· 908 893 .dai_type = SOF_SDW_DAI_TYPE_AMP, 909 894 .dailink = {SDW_AMP_OUT_DAI_ID, SDW_AMP_IN_DAI_ID}, 910 895 .init = sof_sdw_maxim_init, 896 + .rtd_init = maxim_spk_rtd_init, 911 897 }, 912 898 }, 913 899 .dai_num = 1, ··· 922 906 .dai_type = SOF_SDW_DAI_TYPE_AMP, 923 907 .dailink = {SDW_AMP_OUT_DAI_ID, SDW_UNUSED_DAI_ID}, 924 908 .init = sof_sdw_maxim_init, 909 + .rtd_init = maxim_spk_rtd_init, 925 910 }, 926 911 }, 927 912 .dai_num = 1, ··· 936 919 .dai_type = SOF_SDW_DAI_TYPE_JACK, 937 920 .dailink = {SDW_JACK_OUT_DAI_ID, SDW_JACK_IN_DAI_ID}, 938 921 .init = sof_sdw_rt5682_init, 922 + .rtd_init = rt5682_rtd_init, 939 923 }, 940 924 }, 941 925 .dai_num = 1, ··· 950 932 .dai_type = SOF_SDW_DAI_TYPE_AMP, 951 933 .dailink = {SDW_AMP_OUT_DAI_ID, SDW_AMP_IN_DAI_ID}, 952 934 .init = sof_sdw_cs_amp_init, 935 + .rtd_init = cs_spk_rtd_init, 953 936 }, 954 937 }, 955 938 .dai_num = 1, ··· 964 945 .dai_type = SOF_SDW_DAI_TYPE_JACK, 965 946 .dailink = {SDW_JACK_OUT_DAI_ID, SDW_JACK_IN_DAI_ID}, 966 947 .init = sof_sdw_cs42l42_init, 948 + .rtd_init = cs42l42_rtd_init, 967 949 }, 968 950 }, 969 951 .dai_num = 1, ··· 979 959 .dai_type = SOF_SDW_DAI_TYPE_JACK, 980 960 .dailink = {SDW_JACK_OUT_DAI_ID, SDW_UNUSED_DAI_ID}, 981 961 .init = sof_sdw_cs42l43_hs_init, 962 + .rtd_init = cs42l43_hs_rtd_init, 982 963 }, 983 964 { 984 965 .direction = {false, true}, ··· 987 966 .dai_type = SOF_SDW_DAI_TYPE_MIC, 988 967 .dailink = {SDW_UNUSED_DAI_ID, SDW_DMIC_DAI_ID}, 989 968 .init = sof_sdw_cs42l43_dmic_init, 969 + .rtd_init = cs42l43_dmic_rtd_init, 990 970 }, 991 971 { 992 972 .direction = {false, true}, ··· 1409 1387 } 1410 1388 } 1411 1389 1390 + static inline int find_codec_info_dai(const char *dai_name, int *dai_index) 1391 + { 1392 + int i, j; 1393 + 1394 + for (i = 0; i < ARRAY_SIZE(codec_info_list); i++) { 1395 + for (j = 0; j < codec_info_list[i].dai_num; j++) { 1396 + if (!strcmp(codec_info_list[i].dais[j].dai_name, dai_name)) { 1397 + *dai_index = j; 1398 + return i; 1399 + } 1400 + } 1401 + } 1402 + 1403 + return -EINVAL; 1404 + } 1405 + 1406 + static int sof_sdw_rtd_init(struct snd_soc_pcm_runtime *rtd) 1407 + { 1408 + struct sof_sdw_codec_info *codec_info; 1409 + struct snd_soc_dai *dai; 1410 + int codec_index; 1411 + int dai_index; 1412 + int ret; 1413 + int i; 1414 + 1415 + for_each_rtd_codec_dais(rtd, i, dai) { 1416 + codec_index = find_codec_info_dai(dai->name, &dai_index); 1417 + if (codec_index < 0) 1418 + return -EINVAL; 1419 + 1420 + codec_info = &codec_info_list[codec_index]; 1421 + /* 1422 + * A codec dai can be connected to different dai links for capture and playback, 1423 + * but we only need to call the rtd_init function once. 1424 + * The rtd_init for each codec dai is independent. So, the order of rtd_init 1425 + * doesn't matter. 1426 + */ 1427 + if (codec_info->dais[dai_index].rtd_init_done) 1428 + continue; 1429 + if (codec_info->dais[dai_index].rtd_init) { 1430 + ret = codec_info->dais[dai_index].rtd_init(rtd); 1431 + if (ret) 1432 + return ret; 1433 + } 1434 + codec_info->dais[dai_index].rtd_init_done = true; 1435 + } 1436 + 1437 + return 0; 1438 + } 1439 + 1412 1440 static const char * const type_strings[] = {"SimpleJack", "SmartAmp", "SmartMic"}; 1413 1441 1414 1442 static int create_sdw_dailink(struct snd_soc_card *card, int *link_index, ··· 1619 1547 1620 1548 init_dai_link(dev, dai_links + *link_index, be_id, name, 1621 1549 playback, capture, cpus, cpu_dai_num, codecs, codec_num, 1622 - NULL, &sdw_ops); 1550 + sof_sdw_rtd_init, &sdw_ops); 1623 1551 1624 1552 /* 1625 1553 * SoundWire DAILINKs use 'stream' functions and Bank Switch operations ··· 1952 1880 1953 1881 for (i = 0; i < ARRAY_SIZE(codec_info_list); i++) { 1954 1882 for (j = 0; j < codec_info_list[i].dai_num; j++) { 1883 + codec_info_list[i].dais[j].rtd_init_done = false; 1955 1884 /* Check each dai in codec_info_lis to see if it is used in the link */ 1956 1885 if (!codec_info_list[i].dais[j].exit) 1957 1886 continue;
+20
sound/soc/intel/boards/sof_sdw_common.h
··· 78 78 struct sof_sdw_codec_info *info, 79 79 bool playback); 80 80 int (*exit)(struct snd_soc_card *card, struct snd_soc_dai_link *dai_link); 81 + int (*rtd_init)(struct snd_soc_pcm_runtime *rtd); 82 + bool rtd_init_done; /* Indicate that the rtd_init callback is done */ 81 83 }; 82 84 83 85 struct sof_sdw_codec_info { ··· 237 235 struct snd_soc_dai_link *dai_links, 238 236 struct sof_sdw_codec_info *info, 239 237 bool playback); 238 + 239 + /* dai_link init callbacks */ 240 + 241 + int cs42l42_rtd_init(struct snd_soc_pcm_runtime *rtd); 242 + int cs42l43_hs_rtd_init(struct snd_soc_pcm_runtime *rtd); 243 + int cs42l43_dmic_rtd_init(struct snd_soc_pcm_runtime *rtd); 244 + int cs_spk_rtd_init(struct snd_soc_pcm_runtime *rtd); 245 + int maxim_spk_rtd_init(struct snd_soc_pcm_runtime *rtd); 246 + int rt5682_rtd_init(struct snd_soc_pcm_runtime *rtd); 247 + int rt700_rtd_init(struct snd_soc_pcm_runtime *rtd); 248 + int rt711_rtd_init(struct snd_soc_pcm_runtime *rtd); 249 + int rt712_sdca_dmic_rtd_init(struct snd_soc_pcm_runtime *rtd); 250 + int rt712_spk_rtd_init(struct snd_soc_pcm_runtime *rtd); 251 + int rt715_rtd_init(struct snd_soc_pcm_runtime *rtd); 252 + int rt715_sdca_rtd_init(struct snd_soc_pcm_runtime *rtd); 253 + int rt_amp_spk_rtd_init(struct snd_soc_pcm_runtime *rtd); 254 + int rt_sdca_jack_rtd_init(struct snd_soc_pcm_runtime *rtd); 255 + 240 256 #endif
+1 -3
sound/soc/intel/boards/sof_sdw_cs42l42.c
··· 51 51 "cs42l42" 52 52 }; 53 53 54 - static int cs42l42_rtd_init(struct snd_soc_pcm_runtime *rtd) 54 + int cs42l42_rtd_init(struct snd_soc_pcm_runtime *rtd) 55 55 { 56 56 struct snd_soc_card *card = rtd->card; 57 57 struct mc_private *ctx = snd_soc_card_get_drvdata(card); ··· 134 134 */ 135 135 if (!playback) 136 136 return 0; 137 - 138 - dai_links->init = cs42l42_rtd_init; 139 137 140 138 return 0; 141 139 }
+2 -5
sound/soc/intel/boards/sof_sdw_cs42l43.c
··· 50 50 }, 51 51 }; 52 52 53 - static int cs42l43_hs_rtd_init(struct snd_soc_pcm_runtime *rtd) 53 + int cs42l43_hs_rtd_init(struct snd_soc_pcm_runtime *rtd) 54 54 { 55 55 struct snd_soc_component *component = snd_soc_rtd_to_codec(rtd, 0)->component; 56 56 struct mc_private *ctx = snd_soc_card_get_drvdata(rtd->card); ··· 116 116 * No need to test if (!playback) like other codecs as cs42l43 uses separated dai for 117 117 * playback and capture, and sof_sdw_cs42l43_init is only linked to the playback dai. 118 118 */ 119 - dai_links->init = cs42l43_hs_rtd_init; 120 119 121 120 return 0; 122 121 } 123 122 124 - static int cs42l43_dmic_rtd_init(struct snd_soc_pcm_runtime *rtd) 123 + int cs42l43_dmic_rtd_init(struct snd_soc_pcm_runtime *rtd) 125 124 { 126 125 struct snd_soc_card *card = rtd->card; 127 126 int ret; ··· 149 150 struct snd_soc_dai_link *dai_links, struct sof_sdw_codec_info *info, 150 151 bool playback) 151 152 { 152 - dai_links->init = cs42l43_dmic_rtd_init; 153 - 154 153 return 0; 155 154 }
+1 -2
sound/soc/intel/boards/sof_sdw_cs_amp.c
··· 18 18 SND_SOC_DAPM_SPK("Speakers", NULL), 19 19 }; 20 20 21 - static int cs_spk_init(struct snd_soc_pcm_runtime *rtd) 21 + int cs_spk_rtd_init(struct snd_soc_pcm_runtime *rtd) 22 22 { 23 23 const char *dai_name = rtd->dai_link->codecs->dai_name; 24 24 struct snd_soc_card *card = rtd->card; ··· 67 67 return 0; 68 68 69 69 info->amp_num++; 70 - dai_links->init = cs_spk_init; 71 70 72 71 return 0; 73 72 }
+1 -3
sound/soc/intel/boards/sof_sdw_maxim.c
··· 27 27 SOC_DAPM_PIN_SWITCH("Right Spk"), 28 28 }; 29 29 30 - static int spk_init(struct snd_soc_pcm_runtime *rtd) 30 + int maxim_spk_rtd_init(struct snd_soc_pcm_runtime *rtd) 31 31 { 32 32 struct snd_soc_card *card = rtd->card; 33 33 int ret; ··· 145 145 bool playback) 146 146 { 147 147 info->amp_num++; 148 - if (info->amp_num == 2) 149 - dai_links->init = spk_init; 150 148 151 149 maxim_part_id = info->part_id; 152 150 switch (maxim_part_id) {
+1 -3
sound/soc/intel/boards/sof_sdw_rt5682.c
··· 50 50 "rt5682" 51 51 }; 52 52 53 - static int rt5682_rtd_init(struct snd_soc_pcm_runtime *rtd) 53 + int rt5682_rtd_init(struct snd_soc_pcm_runtime *rtd) 54 54 { 55 55 struct snd_soc_card *card = rtd->card; 56 56 struct mc_private *ctx = snd_soc_card_get_drvdata(card); ··· 133 133 */ 134 134 if (!playback) 135 135 return 0; 136 - 137 - dai_links->init = rt5682_rtd_init; 138 136 139 137 return 0; 140 138 }
+1 -3
sound/soc/intel/boards/sof_sdw_rt700.c
··· 50 50 "rt700" 51 51 }; 52 52 53 - static int rt700_rtd_init(struct snd_soc_pcm_runtime *rtd) 53 + int rt700_rtd_init(struct snd_soc_pcm_runtime *rtd) 54 54 { 55 55 struct snd_soc_card *card = rtd->card; 56 56 struct mc_private *ctx = snd_soc_card_get_drvdata(card); ··· 132 132 */ 133 133 if (!playback) 134 134 return 0; 135 - 136 - dai_links->init = rt700_rtd_init; 137 135 138 136 return 0; 139 137 }
+1 -3
sound/soc/intel/boards/sof_sdw_rt711.c
··· 74 74 "rt711" 75 75 }; 76 76 77 - static int rt711_rtd_init(struct snd_soc_pcm_runtime *rtd) 77 + int rt711_rtd_init(struct snd_soc_pcm_runtime *rtd) 78 78 { 79 79 struct snd_soc_card *card = rtd->card; 80 80 struct mc_private *ctx = snd_soc_card_get_drvdata(card); ··· 185 185 return ret; 186 186 } 187 187 ctx->headset_codec_dev = sdw_dev; 188 - 189 - dai_links->init = rt711_rtd_init; 190 188 191 189 return 0; 192 190 }
+2 -6
sound/soc/intel/boards/sof_sdw_rt712_sdca.c
··· 35 35 SOC_DAPM_PIN_SWITCH("Speaker"), 36 36 }; 37 37 38 - static int rt712_spk_init(struct snd_soc_pcm_runtime *rtd) 38 + int rt712_spk_rtd_init(struct snd_soc_pcm_runtime *rtd) 39 39 { 40 40 struct snd_soc_card *card = rtd->card; 41 41 int ret; ··· 73 73 struct sof_sdw_codec_info *info, 74 74 bool playback) 75 75 { 76 - dai_links->init = rt712_spk_init; 77 - 78 76 return 0; 79 77 } 80 78 ··· 80 82 "rt712-sdca-dmic" 81 83 }; 82 84 83 - static int rt712_sdca_dmic_rtd_init(struct snd_soc_pcm_runtime *rtd) 85 + int rt712_sdca_dmic_rtd_init(struct snd_soc_pcm_runtime *rtd) 84 86 { 85 87 struct snd_soc_card *card = rtd->card; 86 88 struct snd_soc_dai *codec_dai; ··· 106 108 struct sof_sdw_codec_info *info, 107 109 bool playback) 108 110 { 109 - dai_links->init = rt712_sdca_dmic_rtd_init; 110 - 111 111 return 0; 112 112 } 113 113 MODULE_IMPORT_NS(SND_SOC_INTEL_SOF_BOARD_HELPERS);
+1 -3
sound/soc/intel/boards/sof_sdw_rt715.c
··· 11 11 #include <sound/soc-acpi.h> 12 12 #include "sof_sdw_common.h" 13 13 14 - static int rt715_rtd_init(struct snd_soc_pcm_runtime *rtd) 14 + int rt715_rtd_init(struct snd_soc_pcm_runtime *rtd) 15 15 { 16 16 struct snd_soc_card *card = rtd->card; 17 17 ··· 30 30 struct sof_sdw_codec_info *info, 31 31 bool playback) 32 32 { 33 - dai_links->init = rt715_rtd_init; 34 - 35 33 return 0; 36 34 }
+1 -3
sound/soc/intel/boards/sof_sdw_rt715_sdca.c
··· 11 11 #include <sound/soc-acpi.h> 12 12 #include "sof_sdw_common.h" 13 13 14 - static int rt715_sdca_rtd_init(struct snd_soc_pcm_runtime *rtd) 14 + int rt715_sdca_rtd_init(struct snd_soc_pcm_runtime *rtd) 15 15 { 16 16 struct snd_soc_card *card = rtd->card; 17 17 ··· 30 30 struct sof_sdw_codec_info *info, 31 31 bool playback) 32 32 { 33 - dai_links->init = rt715_sdca_rtd_init; 34 - 35 33 return 0; 36 34 }
+1 -2
sound/soc/intel/boards/sof_sdw_rt_amp.c
··· 185 185 return rt1318_map; 186 186 } 187 187 188 - static int rt_amp_spk_rtd_init(struct snd_soc_pcm_runtime *rtd) 188 + int rt_amp_spk_rtd_init(struct snd_soc_pcm_runtime *rtd) 189 189 { 190 190 struct snd_soc_card *card = rtd->card; 191 191 const struct snd_soc_dapm_route *rt_amp_map; ··· 295 295 return 0; 296 296 297 297 info->amp_num++; 298 - dai_links->init = rt_amp_spk_rtd_init; 299 298 300 299 if (info->amp_num == 2) { 301 300 sdw_dev1 = bus_find_device_by_name(&sdw_bus_type, NULL, dai_links->codecs[0].name);
+1 -3
sound/soc/intel/boards/sof_sdw_rt_sdca_jack_common.c
··· 89 89 "rt711", "rt712", "rt713" 90 90 }; 91 91 92 - static int rt_sdca_jack_rtd_init(struct snd_soc_pcm_runtime *rtd) 92 + int rt_sdca_jack_rtd_init(struct snd_soc_pcm_runtime *rtd) 93 93 { 94 94 struct snd_soc_card *card = rtd->card; 95 95 struct mc_private *ctx = snd_soc_card_get_drvdata(card); ··· 218 218 return ret; 219 219 } 220 220 ctx->headset_codec_dev = sdw_dev; 221 - 222 - dai_links->init = rt_sdca_jack_rtd_init; 223 221 224 222 return 0; 225 223 }