| .. | .. |
|---|
| 1 | | -/* |
|---|
| 2 | | - * Copyright 2012 Freescale Semiconductor, Inc. |
|---|
| 3 | | - * Copyright 2012 Linaro Ltd. |
|---|
| 4 | | - * |
|---|
| 5 | | - * The code contained herein is licensed under the GNU General Public |
|---|
| 6 | | - * License. You may obtain a copy of the GNU General Public License |
|---|
| 7 | | - * Version 2 or later at the following locations: |
|---|
| 8 | | - * |
|---|
| 9 | | - * http://www.opensource.org/licenses/gpl-license.html |
|---|
| 10 | | - * http://www.gnu.org/copyleft/gpl.html |
|---|
| 11 | | - */ |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0+ |
|---|
| 2 | +// |
|---|
| 3 | +// Copyright 2012 Freescale Semiconductor, Inc. |
|---|
| 4 | +// Copyright 2012 Linaro Ltd. |
|---|
| 12 | 5 | |
|---|
| 13 | 6 | #include <linux/gpio.h> |
|---|
| 14 | 7 | #include <linux/module.h> |
|---|
| .. | .. |
|---|
| 81 | 74 | struct device_node *ssi_np = NULL, *codec_np = NULL; |
|---|
| 82 | 75 | struct platform_device *ssi_pdev; |
|---|
| 83 | 76 | struct imx_es8328_data *data; |
|---|
| 77 | + struct snd_soc_dai_link_component *comp; |
|---|
| 84 | 78 | u32 int_port, ext_port; |
|---|
| 85 | 79 | int ret; |
|---|
| 86 | 80 | struct device *dev = &pdev->dev; |
|---|
| .. | .. |
|---|
| 93 | 87 | if (int_port > MUX_PORT_MAX || int_port == 0) { |
|---|
| 94 | 88 | dev_err(dev, "mux-int-port: hardware only has %d mux ports\n", |
|---|
| 95 | 89 | MUX_PORT_MAX); |
|---|
| 90 | + ret = -EINVAL; |
|---|
| 96 | 91 | goto fail; |
|---|
| 97 | 92 | } |
|---|
| 98 | 93 | |
|---|
| .. | .. |
|---|
| 151 | 146 | data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); |
|---|
| 152 | 147 | if (!data) { |
|---|
| 153 | 148 | ret = -ENOMEM; |
|---|
| 154 | | - goto fail; |
|---|
| 149 | + goto put_device; |
|---|
| 150 | + } |
|---|
| 151 | + |
|---|
| 152 | + comp = devm_kzalloc(dev, 3 * sizeof(*comp), GFP_KERNEL); |
|---|
| 153 | + if (!comp) { |
|---|
| 154 | + ret = -ENOMEM; |
|---|
| 155 | + goto put_device; |
|---|
| 155 | 156 | } |
|---|
| 156 | 157 | |
|---|
| 157 | 158 | data->dev = dev; |
|---|
| 158 | 159 | |
|---|
| 159 | 160 | data->jack_gpio = of_get_named_gpio(pdev->dev.of_node, "jack-gpio", 0); |
|---|
| 160 | 161 | |
|---|
| 162 | + data->dai.cpus = &comp[0]; |
|---|
| 163 | + data->dai.codecs = &comp[1]; |
|---|
| 164 | + data->dai.platforms = &comp[2]; |
|---|
| 165 | + |
|---|
| 166 | + data->dai.num_cpus = 1; |
|---|
| 167 | + data->dai.num_codecs = 1; |
|---|
| 168 | + data->dai.num_platforms = 1; |
|---|
| 169 | + |
|---|
| 161 | 170 | data->dai.name = "hifi"; |
|---|
| 162 | 171 | data->dai.stream_name = "hifi"; |
|---|
| 163 | | - data->dai.codec_dai_name = "es8328-hifi-analog"; |
|---|
| 164 | | - data->dai.codec_of_node = codec_np; |
|---|
| 165 | | - data->dai.cpu_of_node = ssi_np; |
|---|
| 166 | | - data->dai.platform_of_node = ssi_np; |
|---|
| 172 | + data->dai.codecs->dai_name = "es8328-hifi-analog"; |
|---|
| 173 | + data->dai.codecs->of_node = codec_np; |
|---|
| 174 | + data->dai.cpus->of_node = ssi_np; |
|---|
| 175 | + data->dai.platforms->of_node = ssi_np; |
|---|
| 167 | 176 | data->dai.init = &imx_es8328_dai_init; |
|---|
| 168 | 177 | data->dai.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | |
|---|
| 169 | 178 | SND_SOC_DAIFMT_CBM_CFM; |
|---|
| .. | .. |
|---|
| 174 | 183 | ret = snd_soc_of_parse_card_name(&data->card, "model"); |
|---|
| 175 | 184 | if (ret) { |
|---|
| 176 | 185 | dev_err(dev, "Unable to parse card name\n"); |
|---|
| 177 | | - goto fail; |
|---|
| 186 | + goto put_device; |
|---|
| 178 | 187 | } |
|---|
| 179 | 188 | ret = snd_soc_of_parse_audio_routing(&data->card, "audio-routing"); |
|---|
| 180 | 189 | if (ret) { |
|---|
| 181 | 190 | dev_err(dev, "Unable to parse routing: %d\n", ret); |
|---|
| 182 | | - goto fail; |
|---|
| 191 | + goto put_device; |
|---|
| 183 | 192 | } |
|---|
| 184 | 193 | data->card.num_links = 1; |
|---|
| 185 | 194 | data->card.owner = THIS_MODULE; |
|---|
| .. | .. |
|---|
| 188 | 197 | ret = snd_soc_register_card(&data->card); |
|---|
| 189 | 198 | if (ret) { |
|---|
| 190 | 199 | dev_err(dev, "Unable to register: %d\n", ret); |
|---|
| 191 | | - goto fail; |
|---|
| 200 | + goto put_device; |
|---|
| 192 | 201 | } |
|---|
| 193 | 202 | |
|---|
| 194 | 203 | platform_set_drvdata(pdev, data); |
|---|
| 204 | +put_device: |
|---|
| 205 | + put_device(&ssi_pdev->dev); |
|---|
| 195 | 206 | fail: |
|---|
| 196 | 207 | of_node_put(ssi_np); |
|---|
| 197 | 208 | of_node_put(codec_np); |
|---|