Lines Matching +full:codec +full:- +full:driver

1 // SPDX-License-Identifier: GPL-2.0
3 // Freescale MPC8610HPCD ALSA SoC Machine driver
7 // Copyright 2007-2010 Freescale Semiconductor, Inc.
25 * mpc8610_hpcd_data: machine-specific ASoC device data
47 * This function is used to initialize the board-specific hardware.
59 dev_err(card->dev, "could not map global utilities\n"); in mpc8610_hpcd_machine_probe()
60 return -ENOMEM; in mpc8610_hpcd_machine_probe()
64 guts_set_dmacr(guts, machine_data->dma_id[0], in mpc8610_hpcd_machine_probe()
65 machine_data->dma_channel_id[0], in mpc8610_hpcd_machine_probe()
67 guts_set_dmacr(guts, machine_data->dma_id[1], in mpc8610_hpcd_machine_probe()
68 machine_data->dma_channel_id[1], in mpc8610_hpcd_machine_probe()
71 guts_set_pmuxcr_dma(guts, machine_data->dma_id[0], in mpc8610_hpcd_machine_probe()
72 machine_data->dma_channel_id[0], 0); in mpc8610_hpcd_machine_probe()
73 guts_set_pmuxcr_dma(guts, machine_data->dma_id[1], in mpc8610_hpcd_machine_probe()
74 machine_data->dma_channel_id[1], 0); in mpc8610_hpcd_machine_probe()
76 switch (machine_data->ssi_id) { in mpc8610_hpcd_machine_probe()
78 clrsetbits_be32(&guts->pmuxcr, in mpc8610_hpcd_machine_probe()
82 clrsetbits_be32(&guts->pmuxcr, in mpc8610_hpcd_machine_probe()
95 * This function takes board-specific information, like clock frequencies
96 * and serial data formats, and passes that information to the codec and
103 container_of(rtd->card, struct mpc8610_hpcd_data, card); in mpc8610_hpcd_startup()
104 struct device *dev = rtd->card->dev; in mpc8610_hpcd_startup()
107 /* Tell the codec driver what the serial protocol is. */ in mpc8610_hpcd_startup()
108 ret = snd_soc_dai_set_fmt(asoc_rtd_to_codec(rtd, 0), machine_data->dai_format); in mpc8610_hpcd_startup()
110 dev_err(dev, "could not set codec driver audio format\n"); in mpc8610_hpcd_startup()
115 * Tell the codec driver what the MCLK frequency is, and whether it's in mpc8610_hpcd_startup()
119 machine_data->clk_frequency, in mpc8610_hpcd_startup()
120 machine_data->codec_clk_direction); in mpc8610_hpcd_startup()
122 dev_err(dev, "could not set codec driver clock params\n"); in mpc8610_hpcd_startup()
133 * de-program the DMACR and PMUXCR register.
143 dev_err(card->dev, "could not map global utilities\n"); in mpc8610_hpcd_machine_remove()
144 return -ENOMEM; in mpc8610_hpcd_machine_remove()
149 guts_set_dmacr(guts, machine_data->dma_id[0], in mpc8610_hpcd_machine_remove()
150 machine_data->dma_channel_id[0], 0); in mpc8610_hpcd_machine_remove()
151 guts_set_dmacr(guts, machine_data->dma_id[1], in mpc8610_hpcd_machine_remove()
152 machine_data->dma_channel_id[1], 0); in mpc8610_hpcd_machine_remove()
154 switch (machine_data->ssi_id) { in mpc8610_hpcd_machine_remove()
156 clrsetbits_be32(&guts->pmuxcr, in mpc8610_hpcd_machine_remove()
160 clrsetbits_be32(&guts->pmuxcr, in mpc8610_hpcd_machine_remove()
171 * mpc8610_hpcd_ops: ASoC machine driver operations
178 * mpc8610_hpcd_probe: platform probe function for the machine driver
180 * Although this is a machine driver, the SSI node is the "master" node with
182 * device for each new SSI node that has a codec attached.
186 struct device *dev = pdev->dev.parent; in mpc8610_hpcd_probe()
189 struct device_node *np = ssi_pdev->dev.of_node; in mpc8610_hpcd_probe()
197 /* Find the codec node for this SSI. */ in mpc8610_hpcd_probe()
198 codec_np = of_parse_phandle(np, "codec-handle", 0); in mpc8610_hpcd_probe()
200 dev_err(dev, "invalid codec node\n"); in mpc8610_hpcd_probe()
201 return -EINVAL; in mpc8610_hpcd_probe()
206 ret = -ENOMEM; in mpc8610_hpcd_probe()
210 comp = devm_kzalloc(&pdev->dev, 6 * sizeof(*comp), GFP_KERNEL); in mpc8610_hpcd_probe()
212 ret = -ENOMEM; in mpc8610_hpcd_probe()
216 machine_data->dai[0].cpus = &comp[0]; in mpc8610_hpcd_probe()
217 machine_data->dai[0].codecs = &comp[1]; in mpc8610_hpcd_probe()
218 machine_data->dai[0].platforms = &comp[2]; in mpc8610_hpcd_probe()
220 machine_data->dai[0].num_cpus = 1; in mpc8610_hpcd_probe()
221 machine_data->dai[0].num_codecs = 1; in mpc8610_hpcd_probe()
222 machine_data->dai[0].num_platforms = 1; in mpc8610_hpcd_probe()
224 machine_data->dai[1].cpus = &comp[3]; in mpc8610_hpcd_probe()
225 machine_data->dai[1].codecs = &comp[4]; in mpc8610_hpcd_probe()
226 machine_data->dai[1].platforms = &comp[5]; in mpc8610_hpcd_probe()
228 machine_data->dai[1].num_cpus = 1; in mpc8610_hpcd_probe()
229 machine_data->dai[1].num_codecs = 1; in mpc8610_hpcd_probe()
230 machine_data->dai[1].num_platforms = 1; in mpc8610_hpcd_probe()
232 machine_data->dai[0].cpus->dai_name = dev_name(&ssi_pdev->dev); in mpc8610_hpcd_probe()
233 machine_data->dai[0].ops = &mpc8610_hpcd_ops; in mpc8610_hpcd_probe()
235 /* ASoC core can match codec with device node */ in mpc8610_hpcd_probe()
236 machine_data->dai[0].codecs->of_node = codec_np; in mpc8610_hpcd_probe()
238 /* The DAI name from the codec (snd_soc_dai_driver.name) */ in mpc8610_hpcd_probe()
239 machine_data->dai[0].codecs->dai_name = "cs4270-hifi"; in mpc8610_hpcd_probe()
245 memcpy(&machine_data->dai[1], &machine_data->dai[0], in mpc8610_hpcd_probe()
249 iprop = of_get_property(np, "cell-index", NULL); in mpc8610_hpcd_probe()
251 dev_err(&pdev->dev, "cell-index property not found\n"); in mpc8610_hpcd_probe()
252 ret = -EINVAL; in mpc8610_hpcd_probe()
255 machine_data->ssi_id = be32_to_cpup(iprop); in mpc8610_hpcd_probe()
260 dev_err(&pdev->dev, "fsl,mode property not found\n"); in mpc8610_hpcd_probe()
261 ret = -EINVAL; in mpc8610_hpcd_probe()
265 if (strcasecmp(sprop, "i2s-slave") == 0) { in mpc8610_hpcd_probe()
266 machine_data->dai_format = in mpc8610_hpcd_probe()
268 machine_data->codec_clk_direction = SND_SOC_CLOCK_OUT; in mpc8610_hpcd_probe()
269 machine_data->cpu_clk_direction = SND_SOC_CLOCK_IN; in mpc8610_hpcd_probe()
271 /* In i2s-slave mode, the codec has its own clock source, so we in mpc8610_hpcd_probe()
273 * the codec driver. in mpc8610_hpcd_probe()
275 iprop = of_get_property(codec_np, "clock-frequency", NULL); in mpc8610_hpcd_probe()
277 dev_err(&pdev->dev, "codec bus-frequency " in mpc8610_hpcd_probe()
279 ret = -EINVAL; in mpc8610_hpcd_probe()
282 machine_data->clk_frequency = be32_to_cpup(iprop); in mpc8610_hpcd_probe()
283 } else if (strcasecmp(sprop, "i2s-master") == 0) { in mpc8610_hpcd_probe()
284 machine_data->dai_format = in mpc8610_hpcd_probe()
286 machine_data->codec_clk_direction = SND_SOC_CLOCK_IN; in mpc8610_hpcd_probe()
287 machine_data->cpu_clk_direction = SND_SOC_CLOCK_OUT; in mpc8610_hpcd_probe()
288 } else if (strcasecmp(sprop, "lj-slave") == 0) { in mpc8610_hpcd_probe()
289 machine_data->dai_format = in mpc8610_hpcd_probe()
291 machine_data->codec_clk_direction = SND_SOC_CLOCK_OUT; in mpc8610_hpcd_probe()
292 machine_data->cpu_clk_direction = SND_SOC_CLOCK_IN; in mpc8610_hpcd_probe()
293 } else if (strcasecmp(sprop, "lj-master") == 0) { in mpc8610_hpcd_probe()
294 machine_data->dai_format = in mpc8610_hpcd_probe()
296 machine_data->codec_clk_direction = SND_SOC_CLOCK_IN; in mpc8610_hpcd_probe()
297 machine_data->cpu_clk_direction = SND_SOC_CLOCK_OUT; in mpc8610_hpcd_probe()
298 } else if (strcasecmp(sprop, "rj-slave") == 0) { in mpc8610_hpcd_probe()
299 machine_data->dai_format = in mpc8610_hpcd_probe()
301 machine_data->codec_clk_direction = SND_SOC_CLOCK_OUT; in mpc8610_hpcd_probe()
302 machine_data->cpu_clk_direction = SND_SOC_CLOCK_IN; in mpc8610_hpcd_probe()
303 } else if (strcasecmp(sprop, "rj-master") == 0) { in mpc8610_hpcd_probe()
304 machine_data->dai_format = in mpc8610_hpcd_probe()
306 machine_data->codec_clk_direction = SND_SOC_CLOCK_IN; in mpc8610_hpcd_probe()
307 machine_data->cpu_clk_direction = SND_SOC_CLOCK_OUT; in mpc8610_hpcd_probe()
308 } else if (strcasecmp(sprop, "ac97-slave") == 0) { in mpc8610_hpcd_probe()
309 machine_data->dai_format = in mpc8610_hpcd_probe()
311 machine_data->codec_clk_direction = SND_SOC_CLOCK_OUT; in mpc8610_hpcd_probe()
312 machine_data->cpu_clk_direction = SND_SOC_CLOCK_IN; in mpc8610_hpcd_probe()
313 } else if (strcasecmp(sprop, "ac97-master") == 0) { in mpc8610_hpcd_probe()
314 machine_data->dai_format = in mpc8610_hpcd_probe()
316 machine_data->codec_clk_direction = SND_SOC_CLOCK_IN; in mpc8610_hpcd_probe()
317 machine_data->cpu_clk_direction = SND_SOC_CLOCK_OUT; in mpc8610_hpcd_probe()
319 dev_err(&pdev->dev, in mpc8610_hpcd_probe()
321 ret = -EINVAL; in mpc8610_hpcd_probe()
325 if (!machine_data->clk_frequency) { in mpc8610_hpcd_probe()
326 dev_err(&pdev->dev, "unknown clock frequency\n"); in mpc8610_hpcd_probe()
327 ret = -EINVAL; in mpc8610_hpcd_probe()
332 machine_data->dai[0].platforms->name = machine_data->platform_name[0]; in mpc8610_hpcd_probe()
333 ret = fsl_asoc_get_dma_channel(np, "fsl,playback-dma", in mpc8610_hpcd_probe()
334 &machine_data->dai[0], in mpc8610_hpcd_probe()
335 &machine_data->dma_channel_id[0], in mpc8610_hpcd_probe()
336 &machine_data->dma_id[0]); in mpc8610_hpcd_probe()
338 dev_err(&pdev->dev, "missing/invalid playback DMA phandle\n"); in mpc8610_hpcd_probe()
343 machine_data->dai[1].platforms->name = machine_data->platform_name[1]; in mpc8610_hpcd_probe()
344 ret = fsl_asoc_get_dma_channel(np, "fsl,capture-dma", in mpc8610_hpcd_probe()
345 &machine_data->dai[1], in mpc8610_hpcd_probe()
346 &machine_data->dma_channel_id[1], in mpc8610_hpcd_probe()
347 &machine_data->dma_id[1]); in mpc8610_hpcd_probe()
349 dev_err(&pdev->dev, "missing/invalid capture DMA phandle\n"); in mpc8610_hpcd_probe()
354 machine_data->dai[0].stream_name = "playback"; in mpc8610_hpcd_probe()
355 machine_data->dai[1].stream_name = "capture"; in mpc8610_hpcd_probe()
356 machine_data->dai[0].name = machine_data->dai[0].stream_name; in mpc8610_hpcd_probe()
357 machine_data->dai[1].name = machine_data->dai[1].stream_name; in mpc8610_hpcd_probe()
359 machine_data->card.probe = mpc8610_hpcd_machine_probe; in mpc8610_hpcd_probe()
360 machine_data->card.remove = mpc8610_hpcd_machine_remove; in mpc8610_hpcd_probe()
361 machine_data->card.name = pdev->name; /* The platform driver name */ in mpc8610_hpcd_probe()
362 machine_data->card.owner = THIS_MODULE; in mpc8610_hpcd_probe()
363 machine_data->card.dev = &pdev->dev; in mpc8610_hpcd_probe()
364 machine_data->card.num_links = 2; in mpc8610_hpcd_probe()
365 machine_data->card.dai_link = machine_data->dai; in mpc8610_hpcd_probe()
368 ret = snd_soc_register_card(&machine_data->card); in mpc8610_hpcd_probe()
370 dev_err(&pdev->dev, "could not register card\n"); in mpc8610_hpcd_probe()
403 .driver = {
407 .name = "snd-soc-mpc8610hpcd",
412 * mpc8610_hpcd_init: machine driver initialization.
421 pr_info("Freescale MPC8610 HPCD ALSA SoC machine driver\n"); in mpc8610_hpcd_init()
424 guts_np = of_find_compatible_node(NULL, NULL, "fsl,mpc8610-guts"); in mpc8610_hpcd_init()
426 pr_err("mpc8610-hpcd: missing/invalid global utilities node\n"); in mpc8610_hpcd_init()
428 return -EINVAL; in mpc8610_hpcd_init()
437 * mpc8610_hpcd_exit: machine driver exit
439 * This function is called when this driver is unloaded.
450 MODULE_DESCRIPTION("Freescale MPC8610 HPCD ALSA SoC machine driver");