| .. | .. |
|---|
| 43 | 43 | static int mt8173_rt5650_rt5514_hw_params(struct snd_pcm_substream *substream, |
|---|
| 44 | 44 | struct snd_pcm_hw_params *params) |
|---|
| 45 | 45 | { |
|---|
| 46 | | - struct snd_soc_pcm_runtime *rtd = substream->private_data; |
|---|
| 46 | + struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); |
|---|
| 47 | + struct snd_soc_dai *codec_dai; |
|---|
| 47 | 48 | int i, ret; |
|---|
| 48 | 49 | |
|---|
| 49 | | - for (i = 0; i < rtd->num_codecs; i++) { |
|---|
| 50 | | - struct snd_soc_dai *codec_dai = rtd->codec_dais[i]; |
|---|
| 51 | | - |
|---|
| 50 | + for_each_rtd_codec_dais(rtd, i, codec_dai) { |
|---|
| 52 | 51 | /* pll from mclk 12.288M */ |
|---|
| 53 | 52 | ret = snd_soc_dai_set_pll(codec_dai, 0, 0, MCLK_FOR_CODECS, |
|---|
| 54 | 53 | params_rate(params) * 512); |
|---|
| .. | .. |
|---|
| 74 | 73 | static int mt8173_rt5650_rt5514_init(struct snd_soc_pcm_runtime *runtime) |
|---|
| 75 | 74 | { |
|---|
| 76 | 75 | struct snd_soc_card *card = runtime->card; |
|---|
| 77 | | - struct snd_soc_component *component = runtime->codec_dais[0]->component; |
|---|
| 76 | + struct snd_soc_component *component = asoc_rtd_to_codec(runtime, 0)->component; |
|---|
| 78 | 77 | int ret; |
|---|
| 79 | 78 | |
|---|
| 80 | 79 | rt5645_sel_asrc_clk_src(component, |
|---|
| .. | .. |
|---|
| 99 | 98 | &mt8173_rt5650_rt5514_jack); |
|---|
| 100 | 99 | } |
|---|
| 101 | 100 | |
|---|
| 102 | | -static struct snd_soc_dai_link_component mt8173_rt5650_rt5514_codecs[] = { |
|---|
| 103 | | - { |
|---|
| 104 | | - .dai_name = "rt5645-aif1", |
|---|
| 105 | | - }, |
|---|
| 106 | | - { |
|---|
| 107 | | - .dai_name = "rt5514-aif1", |
|---|
| 108 | | - }, |
|---|
| 109 | | -}; |
|---|
| 110 | | - |
|---|
| 111 | 101 | enum { |
|---|
| 112 | 102 | DAI_LINK_PLAYBACK, |
|---|
| 113 | 103 | DAI_LINK_CAPTURE, |
|---|
| 114 | 104 | DAI_LINK_CODEC_I2S, |
|---|
| 115 | 105 | }; |
|---|
| 106 | + |
|---|
| 107 | +SND_SOC_DAILINK_DEFS(playback, |
|---|
| 108 | + DAILINK_COMP_ARRAY(COMP_CPU("DL1")), |
|---|
| 109 | + DAILINK_COMP_ARRAY(COMP_DUMMY()), |
|---|
| 110 | + DAILINK_COMP_ARRAY(COMP_EMPTY())); |
|---|
| 111 | + |
|---|
| 112 | +SND_SOC_DAILINK_DEFS(capture, |
|---|
| 113 | + DAILINK_COMP_ARRAY(COMP_CPU("VUL")), |
|---|
| 114 | + DAILINK_COMP_ARRAY(COMP_DUMMY()), |
|---|
| 115 | + DAILINK_COMP_ARRAY(COMP_EMPTY())); |
|---|
| 116 | + |
|---|
| 117 | +SND_SOC_DAILINK_DEFS(codec, |
|---|
| 118 | + DAILINK_COMP_ARRAY(COMP_CPU("I2S")), |
|---|
| 119 | + DAILINK_COMP_ARRAY(COMP_CODEC(NULL, "rt5645-aif1"), |
|---|
| 120 | + COMP_CODEC(NULL, "rt5514-aif1")), |
|---|
| 121 | + DAILINK_COMP_ARRAY(COMP_EMPTY())); |
|---|
| 116 | 122 | |
|---|
| 117 | 123 | /* Digital audio interface glue - connects codec <---> CPU */ |
|---|
| 118 | 124 | static struct snd_soc_dai_link mt8173_rt5650_rt5514_dais[] = { |
|---|
| .. | .. |
|---|
| 120 | 126 | [DAI_LINK_PLAYBACK] = { |
|---|
| 121 | 127 | .name = "rt5650_rt5514 Playback", |
|---|
| 122 | 128 | .stream_name = "rt5650_rt5514 Playback", |
|---|
| 123 | | - .cpu_dai_name = "DL1", |
|---|
| 124 | | - .codec_name = "snd-soc-dummy", |
|---|
| 125 | | - .codec_dai_name = "snd-soc-dummy-dai", |
|---|
| 126 | 129 | .trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, |
|---|
| 127 | 130 | .dynamic = 1, |
|---|
| 128 | 131 | .dpcm_playback = 1, |
|---|
| 132 | + SND_SOC_DAILINK_REG(playback), |
|---|
| 129 | 133 | }, |
|---|
| 130 | 134 | [DAI_LINK_CAPTURE] = { |
|---|
| 131 | 135 | .name = "rt5650_rt5514 Capture", |
|---|
| 132 | 136 | .stream_name = "rt5650_rt5514 Capture", |
|---|
| 133 | | - .cpu_dai_name = "VUL", |
|---|
| 134 | | - .codec_name = "snd-soc-dummy", |
|---|
| 135 | | - .codec_dai_name = "snd-soc-dummy-dai", |
|---|
| 136 | 137 | .trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, |
|---|
| 137 | 138 | .dynamic = 1, |
|---|
| 138 | 139 | .dpcm_capture = 1, |
|---|
| 140 | + SND_SOC_DAILINK_REG(capture), |
|---|
| 139 | 141 | }, |
|---|
| 140 | 142 | /* Back End DAI links */ |
|---|
| 141 | 143 | [DAI_LINK_CODEC_I2S] = { |
|---|
| 142 | 144 | .name = "Codec", |
|---|
| 143 | | - .cpu_dai_name = "I2S", |
|---|
| 144 | 145 | .no_pcm = 1, |
|---|
| 145 | | - .codecs = mt8173_rt5650_rt5514_codecs, |
|---|
| 146 | | - .num_codecs = 2, |
|---|
| 147 | 146 | .init = mt8173_rt5650_rt5514_init, |
|---|
| 148 | 147 | .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | |
|---|
| 149 | 148 | SND_SOC_DAIFMT_CBS_CFS, |
|---|
| .. | .. |
|---|
| 151 | 150 | .ignore_pmdown_time = 1, |
|---|
| 152 | 151 | .dpcm_playback = 1, |
|---|
| 153 | 152 | .dpcm_capture = 1, |
|---|
| 153 | + SND_SOC_DAILINK_REG(codec), |
|---|
| 154 | 154 | }, |
|---|
| 155 | 155 | }; |
|---|
| 156 | 156 | |
|---|
| .. | .. |
|---|
| 179 | 179 | { |
|---|
| 180 | 180 | struct snd_soc_card *card = &mt8173_rt5650_rt5514_card; |
|---|
| 181 | 181 | struct device_node *platform_node; |
|---|
| 182 | + struct snd_soc_dai_link *dai_link; |
|---|
| 182 | 183 | int i, ret; |
|---|
| 183 | 184 | |
|---|
| 184 | 185 | platform_node = of_parse_phandle(pdev->dev.of_node, |
|---|
| .. | .. |
|---|
| 188 | 189 | return -EINVAL; |
|---|
| 189 | 190 | } |
|---|
| 190 | 191 | |
|---|
| 191 | | - for (i = 0; i < card->num_links; i++) { |
|---|
| 192 | | - if (mt8173_rt5650_rt5514_dais[i].platform_name) |
|---|
| 192 | + for_each_card_prelinks(card, i, dai_link) { |
|---|
| 193 | + if (dai_link->platforms->name) |
|---|
| 193 | 194 | continue; |
|---|
| 194 | | - mt8173_rt5650_rt5514_dais[i].platform_of_node = platform_node; |
|---|
| 195 | + dai_link->platforms->of_node = platform_node; |
|---|
| 195 | 196 | } |
|---|
| 196 | 197 | |
|---|
| 197 | | - mt8173_rt5650_rt5514_codecs[0].of_node = |
|---|
| 198 | + mt8173_rt5650_rt5514_dais[DAI_LINK_CODEC_I2S].codecs[0].of_node = |
|---|
| 198 | 199 | of_parse_phandle(pdev->dev.of_node, "mediatek,audio-codec", 0); |
|---|
| 199 | | - if (!mt8173_rt5650_rt5514_codecs[0].of_node) { |
|---|
| 200 | + if (!mt8173_rt5650_rt5514_dais[DAI_LINK_CODEC_I2S].codecs[0].of_node) { |
|---|
| 200 | 201 | dev_err(&pdev->dev, |
|---|
| 201 | 202 | "Property 'audio-codec' missing or invalid\n"); |
|---|
| 202 | | - return -EINVAL; |
|---|
| 203 | + ret = -EINVAL; |
|---|
| 204 | + goto out; |
|---|
| 203 | 205 | } |
|---|
| 204 | | - mt8173_rt5650_rt5514_codecs[1].of_node = |
|---|
| 206 | + mt8173_rt5650_rt5514_dais[DAI_LINK_CODEC_I2S].codecs[1].of_node = |
|---|
| 205 | 207 | of_parse_phandle(pdev->dev.of_node, "mediatek,audio-codec", 1); |
|---|
| 206 | | - if (!mt8173_rt5650_rt5514_codecs[1].of_node) { |
|---|
| 208 | + if (!mt8173_rt5650_rt5514_dais[DAI_LINK_CODEC_I2S].codecs[1].of_node) { |
|---|
| 207 | 209 | dev_err(&pdev->dev, |
|---|
| 208 | 210 | "Property 'audio-codec' missing or invalid\n"); |
|---|
| 209 | | - return -EINVAL; |
|---|
| 211 | + ret = -EINVAL; |
|---|
| 212 | + goto out; |
|---|
| 210 | 213 | } |
|---|
| 211 | | - mt8173_rt5650_rt5514_codec_conf[0].of_node = |
|---|
| 212 | | - mt8173_rt5650_rt5514_codecs[1].of_node; |
|---|
| 214 | + mt8173_rt5650_rt5514_codec_conf[0].dlc.of_node = |
|---|
| 215 | + mt8173_rt5650_rt5514_dais[DAI_LINK_CODEC_I2S].codecs[1].of_node; |
|---|
| 213 | 216 | |
|---|
| 214 | 217 | card->dev = &pdev->dev; |
|---|
| 215 | 218 | |
|---|
| .. | .. |
|---|
| 218 | 221 | dev_err(&pdev->dev, "%s snd_soc_register_card fail %d\n", |
|---|
| 219 | 222 | __func__, ret); |
|---|
| 220 | 223 | |
|---|
| 224 | +out: |
|---|
| 221 | 225 | of_node_put(platform_node); |
|---|
| 222 | 226 | return ret; |
|---|
| 223 | 227 | } |
|---|