.. | .. |
---|
30 | 30 | struct device *dev = rtd->card->dev; |
---|
31 | 31 | int ret; |
---|
32 | 32 | |
---|
33 | | - ret = snd_soc_dai_set_sysclk(rtd->codec_dai, SGTL5000_SYSCLK, |
---|
| 33 | + ret = snd_soc_dai_set_sysclk(asoc_rtd_to_codec(rtd, 0), SGTL5000_SYSCLK, |
---|
34 | 34 | data->clk_frequency, SND_SOC_CLOCK_IN); |
---|
35 | 35 | if (ret) { |
---|
36 | 36 | dev_err(dev, "could not set codec driver clock params\n"); |
---|
.. | .. |
---|
55 | 55 | struct platform_device *ssi_pdev; |
---|
56 | 56 | struct i2c_client *codec_dev; |
---|
57 | 57 | struct imx_sgtl5000_data *data = NULL; |
---|
| 58 | + struct snd_soc_dai_link_component *comp; |
---|
58 | 59 | int int_port, ext_port; |
---|
59 | 60 | int ret; |
---|
60 | 61 | |
---|
.. | .. |
---|
104 | 105 | |
---|
105 | 106 | ssi_pdev = of_find_device_by_node(ssi_np); |
---|
106 | 107 | if (!ssi_pdev) { |
---|
107 | | - dev_err(&pdev->dev, "failed to find SSI platform device\n"); |
---|
| 108 | + dev_dbg(&pdev->dev, "failed to find SSI platform device\n"); |
---|
108 | 109 | ret = -EPROBE_DEFER; |
---|
109 | 110 | goto fail; |
---|
110 | 111 | } |
---|
111 | 112 | put_device(&ssi_pdev->dev); |
---|
112 | 113 | codec_dev = of_find_i2c_device_by_node(codec_np); |
---|
113 | 114 | if (!codec_dev) { |
---|
114 | | - dev_err(&pdev->dev, "failed to find codec platform device\n"); |
---|
| 115 | + dev_dbg(&pdev->dev, "failed to find codec platform device\n"); |
---|
115 | 116 | ret = -EPROBE_DEFER; |
---|
116 | 117 | goto fail; |
---|
117 | 118 | } |
---|
.. | .. |
---|
119 | 120 | data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); |
---|
120 | 121 | if (!data) { |
---|
121 | 122 | ret = -ENOMEM; |
---|
122 | | - goto fail; |
---|
| 123 | + goto put_device; |
---|
| 124 | + } |
---|
| 125 | + |
---|
| 126 | + comp = devm_kzalloc(&pdev->dev, 3 * sizeof(*comp), GFP_KERNEL); |
---|
| 127 | + if (!comp) { |
---|
| 128 | + ret = -ENOMEM; |
---|
| 129 | + goto put_device; |
---|
123 | 130 | } |
---|
124 | 131 | |
---|
125 | 132 | data->codec_clk = clk_get(&codec_dev->dev, NULL); |
---|
126 | 133 | if (IS_ERR(data->codec_clk)) { |
---|
127 | 134 | ret = PTR_ERR(data->codec_clk); |
---|
128 | | - goto fail; |
---|
| 135 | + goto put_device; |
---|
129 | 136 | } |
---|
130 | 137 | |
---|
131 | 138 | data->clk_frequency = clk_get_rate(data->codec_clk); |
---|
132 | 139 | |
---|
| 140 | + data->dai.cpus = &comp[0]; |
---|
| 141 | + data->dai.codecs = &comp[1]; |
---|
| 142 | + data->dai.platforms = &comp[2]; |
---|
| 143 | + |
---|
| 144 | + data->dai.num_cpus = 1; |
---|
| 145 | + data->dai.num_codecs = 1; |
---|
| 146 | + data->dai.num_platforms = 1; |
---|
| 147 | + |
---|
133 | 148 | data->dai.name = "HiFi"; |
---|
134 | 149 | data->dai.stream_name = "HiFi"; |
---|
135 | | - data->dai.codec_dai_name = "sgtl5000"; |
---|
136 | | - data->dai.codec_of_node = codec_np; |
---|
137 | | - data->dai.cpu_of_node = ssi_np; |
---|
138 | | - data->dai.platform_of_node = ssi_np; |
---|
| 150 | + data->dai.codecs->dai_name = "sgtl5000"; |
---|
| 151 | + data->dai.codecs->of_node = codec_np; |
---|
| 152 | + data->dai.cpus->of_node = ssi_np; |
---|
| 153 | + data->dai.platforms->of_node = ssi_np; |
---|
139 | 154 | data->dai.init = &imx_sgtl5000_dai_init; |
---|
140 | 155 | data->dai.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | |
---|
141 | 156 | SND_SOC_DAIFMT_CBM_CFM; |
---|
.. | .. |
---|
143 | 158 | data->card.dev = &pdev->dev; |
---|
144 | 159 | ret = snd_soc_of_parse_card_name(&data->card, "model"); |
---|
145 | 160 | if (ret) |
---|
146 | | - goto fail; |
---|
| 161 | + goto put_device; |
---|
147 | 162 | ret = snd_soc_of_parse_audio_routing(&data->card, "audio-routing"); |
---|
148 | 163 | if (ret) |
---|
149 | | - goto fail; |
---|
| 164 | + goto put_device; |
---|
150 | 165 | data->card.num_links = 1; |
---|
151 | 166 | data->card.owner = THIS_MODULE; |
---|
152 | 167 | data->card.dai_link = &data->dai; |
---|
.. | .. |
---|
158 | 173 | |
---|
159 | 174 | ret = devm_snd_soc_register_card(&pdev->dev, &data->card); |
---|
160 | 175 | if (ret) { |
---|
161 | | - dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n", ret); |
---|
162 | | - goto fail; |
---|
| 176 | + if (ret != -EPROBE_DEFER) |
---|
| 177 | + dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n", |
---|
| 178 | + ret); |
---|
| 179 | + goto put_device; |
---|
163 | 180 | } |
---|
164 | 181 | |
---|
165 | 182 | of_node_put(ssi_np); |
---|
.. | .. |
---|
167 | 184 | |
---|
168 | 185 | return 0; |
---|
169 | 186 | |
---|
| 187 | +put_device: |
---|
| 188 | + put_device(&codec_dev->dev); |
---|
170 | 189 | fail: |
---|
171 | 190 | if (data && !IS_ERR(data->codec_clk)) |
---|
172 | 191 | clk_put(data->codec_clk); |
---|