Lines Matching +full:hdmi +full:- +full:tx
1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright 2017-2020 NXP
8 #include <sound/hdmi-codec.h>
12 * struct cpu_priv - CPU private data
16 * Note: [1] for tx and [0] for rx
35 struct snd_soc_pcm_runtime *rtd = substream->private_data; in imx_hdmi_hw_params()
36 struct imx_hdmi_data *data = snd_soc_card_get_drvdata(rtd->card); in imx_hdmi_hw_params()
37 bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; in imx_hdmi_hw_params() local
39 struct snd_soc_card *card = rtd->card; in imx_hdmi_hw_params()
40 struct device *dev = card->dev; in imx_hdmi_hw_params()
41 u32 slot_width = data->cpu_priv.slot_width; in imx_hdmi_hw_params()
45 ret = snd_soc_dai_set_sysclk(cpu_dai, data->cpu_priv.sysclk_id[tx], in imx_hdmi_hw_params()
47 tx ? SND_SOC_CLOCK_OUT : SND_SOC_CLOCK_IN); in imx_hdmi_hw_params()
48 if (ret && ret != -ENOTSUPP) { in imx_hdmi_hw_params()
54 if (ret && ret != -ENOTSUPP) { in imx_hdmi_hw_params()
67 SND_SOC_DAPM_LINE("HDMI Jack", NULL),
72 struct snd_soc_card *card = rtd->card; in imx_hdmi_init()
74 struct snd_soc_component *component = codec_dai->component; in imx_hdmi_init()
78 data->hdmi_jack_pin.pin = "HDMI Jack"; in imx_hdmi_init()
79 data->hdmi_jack_pin.mask = SND_JACK_LINEOUT; in imx_hdmi_init()
81 ret = snd_soc_card_jack_new(card, "HDMI Jack", SND_JACK_LINEOUT, in imx_hdmi_init()
82 &data->hdmi_jack, &data->hdmi_jack_pin, 1); in imx_hdmi_init()
84 dev_err(card->dev, "Can't new HDMI Jack %d\n", ret); in imx_hdmi_init()
88 ret = snd_soc_component_set_jack(component, &data->hdmi_jack, NULL); in imx_hdmi_init()
89 if (ret && ret != -ENOTSUPP) { in imx_hdmi_init()
90 dev_err(card->dev, "Can't set HDMI Jack %d\n", ret); in imx_hdmi_init()
99 struct device_node *np = pdev->dev.of_node; in imx_hdmi_probe()
100 bool hdmi_out = of_property_read_bool(np, "hdmi-out"); in imx_hdmi_probe()
101 bool hdmi_in = of_property_read_bool(np, "hdmi-in"); in imx_hdmi_probe()
108 dlc = devm_kzalloc(&pdev->dev, 3 * sizeof(*dlc), GFP_KERNEL); in imx_hdmi_probe()
110 return -ENOMEM; in imx_hdmi_probe()
112 cpu_np = of_parse_phandle(np, "audio-cpu", 0); in imx_hdmi_probe()
114 dev_err(&pdev->dev, "cpu dai phandle missing or invalid\n"); in imx_hdmi_probe()
115 ret = -EINVAL; in imx_hdmi_probe()
121 dev_err(&pdev->dev, "failed to find SAI platform device\n"); in imx_hdmi_probe()
122 ret = -EINVAL; in imx_hdmi_probe()
126 data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); in imx_hdmi_probe()
128 ret = -ENOMEM; in imx_hdmi_probe()
132 data->dai.cpus = &dlc[0]; in imx_hdmi_probe()
133 data->dai.num_cpus = 1; in imx_hdmi_probe()
134 data->dai.platforms = &dlc[1]; in imx_hdmi_probe()
135 data->dai.num_platforms = 1; in imx_hdmi_probe()
136 data->dai.codecs = &dlc[2]; in imx_hdmi_probe()
137 data->dai.num_codecs = 1; in imx_hdmi_probe()
139 data->dai.name = "i.MX HDMI"; in imx_hdmi_probe()
140 data->dai.stream_name = "i.MX HDMI"; in imx_hdmi_probe()
141 data->dai.cpus->dai_name = dev_name(&cpu_pdev->dev); in imx_hdmi_probe()
142 data->dai.platforms->of_node = cpu_np; in imx_hdmi_probe()
143 data->dai.ops = &imx_hdmi_ops; in imx_hdmi_probe()
144 data->dai.playback_only = true; in imx_hdmi_probe()
145 data->dai.capture_only = false; in imx_hdmi_probe()
146 data->dai.init = imx_hdmi_init; in imx_hdmi_probe()
149 data->cpu_priv.sysclk_id[1] = FSL_SAI_CLK_MAST1; in imx_hdmi_probe()
150 data->cpu_priv.sysclk_id[0] = FSL_SAI_CLK_MAST1; in imx_hdmi_probe()
153 if (of_device_is_compatible(np, "fsl,imx-audio-sii902x")) { in imx_hdmi_probe()
154 data->dai_fmt = SND_SOC_DAIFMT_LEFT_J; in imx_hdmi_probe()
155 data->cpu_priv.slot_width = 24; in imx_hdmi_probe()
157 data->dai_fmt = SND_SOC_DAIFMT_I2S; in imx_hdmi_probe()
158 data->cpu_priv.slot_width = 32; in imx_hdmi_probe()
162 dev_err(&pdev->dev, "Invalid HDMI DAI link\n"); in imx_hdmi_probe()
163 ret = -EINVAL; in imx_hdmi_probe()
168 data->dai.playback_only = true; in imx_hdmi_probe()
169 data->dai.capture_only = false; in imx_hdmi_probe()
170 data->dai.codecs->dai_name = "i2s-hifi"; in imx_hdmi_probe()
171 data->dai.codecs->name = "hdmi-audio-codec.1"; in imx_hdmi_probe()
172 data->dai.dai_fmt = data->dai_fmt | in imx_hdmi_probe()
178 data->dai.playback_only = false; in imx_hdmi_probe()
179 data->dai.capture_only = true; in imx_hdmi_probe()
180 data->dai.codecs->dai_name = "i2s-hifi"; in imx_hdmi_probe()
181 data->dai.codecs->name = "hdmi-audio-codec.2"; in imx_hdmi_probe()
182 data->dai.dai_fmt = data->dai_fmt | in imx_hdmi_probe()
187 data->card.dapm_widgets = imx_hdmi_widgets; in imx_hdmi_probe()
188 data->card.num_dapm_widgets = ARRAY_SIZE(imx_hdmi_widgets); in imx_hdmi_probe()
189 data->card.dev = &pdev->dev; in imx_hdmi_probe()
190 data->card.owner = THIS_MODULE; in imx_hdmi_probe()
191 ret = snd_soc_of_parse_card_name(&data->card, "model"); in imx_hdmi_probe()
195 data->card.num_links = 1; in imx_hdmi_probe()
196 data->card.dai_link = &data->dai; in imx_hdmi_probe()
198 snd_soc_card_set_drvdata(&data->card, data); in imx_hdmi_probe()
199 ret = devm_snd_soc_register_card(&pdev->dev, &data->card); in imx_hdmi_probe()
201 dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n", ret); in imx_hdmi_probe()
213 { .compatible = "fsl,imx-audio-hdmi", },
214 { .compatible = "fsl,imx-audio-sii902x", },
221 .name = "imx-hdmi",
230 MODULE_DESCRIPTION("Freescale i.MX hdmi audio ASoC machine driver");
232 MODULE_ALIAS("platform:imx-hdmi");