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