| .. | .. |
|---|
| 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); |
|---|