2 * Copyright (C) 2013 Freescale Semiconductor, Inc.
4 * The code contained herein is licensed under the GNU General Public
5 * License. You may obtain a copy of the GNU General Public License
6 * Version 2 or later at the following locations:
8 * http://www.opensource.org/licenses/gpl-license.html
9 * http://www.gnu.org/copyleft/gpl.html
12 #include <linux/module.h>
13 #include <linux/of_platform.h>
14 #include <sound/soc.h>
16 struct imx_spdif_data
{
17 struct snd_soc_dai_link dai
;
18 struct snd_soc_card card
;
21 static int imx_spdif_audio_probe(struct platform_device
*pdev
)
23 struct device_node
*spdif_np
, *np
= pdev
->dev
.of_node
;
24 struct imx_spdif_data
*data
;
27 spdif_np
= of_parse_phandle(np
, "spdif-controller", 0);
29 dev_err(&pdev
->dev
, "failed to find spdif-controller\n");
34 data
= devm_kzalloc(&pdev
->dev
, sizeof(*data
), GFP_KERNEL
);
40 data
->dai
.name
= "S/PDIF PCM";
41 data
->dai
.stream_name
= "S/PDIF PCM";
42 data
->dai
.codec_dai_name
= "snd-soc-dummy-dai";
43 data
->dai
.codec_name
= "snd-soc-dummy";
44 data
->dai
.cpu_of_node
= spdif_np
;
45 data
->dai
.platform_of_node
= spdif_np
;
46 data
->dai
.playback_only
= true;
47 data
->dai
.capture_only
= true;
49 if (of_property_read_bool(np
, "spdif-out"))
50 data
->dai
.capture_only
= false;
52 if (of_property_read_bool(np
, "spdif-in"))
53 data
->dai
.playback_only
= false;
55 if (data
->dai
.playback_only
&& data
->dai
.capture_only
) {
56 dev_err(&pdev
->dev
, "no enabled S/PDIF DAI link\n");
60 data
->card
.dev
= &pdev
->dev
;
61 data
->card
.dai_link
= &data
->dai
;
62 data
->card
.num_links
= 1;
63 data
->card
.owner
= THIS_MODULE
;
65 ret
= snd_soc_of_parse_card_name(&data
->card
, "model");
69 ret
= devm_snd_soc_register_card(&pdev
->dev
, &data
->card
);
71 dev_err(&pdev
->dev
, "snd_soc_register_card failed: %d\n", ret
);
75 platform_set_drvdata(pdev
, data
);
78 of_node_put(spdif_np
);
83 static const struct of_device_id imx_spdif_dt_ids
[] = {
84 { .compatible
= "fsl,imx-audio-spdif", },
87 MODULE_DEVICE_TABLE(of
, imx_spdif_dt_ids
);
89 static struct platform_driver imx_spdif_driver
= {
92 .pm
= &snd_soc_pm_ops
,
93 .of_match_table
= imx_spdif_dt_ids
,
95 .probe
= imx_spdif_audio_probe
,
98 module_platform_driver(imx_spdif_driver
);
100 MODULE_AUTHOR("Freescale Semiconductor, Inc.");
101 MODULE_DESCRIPTION("Freescale i.MX S/PDIF machine driver");
102 MODULE_LICENSE("GPL v2");
103 MODULE_ALIAS("platform:imx-spdif");