Commit f77a066f authored by Mark Brown's avatar Mark Brown

ASoC: hdmi-codec: Allow playback and capture to be disabled

Currently the hdmi-codec driver always registers both playback and capture
capabilities but for most systems there's no actual capture capability,
usually HDMI is transmit only. Provide platform data which allows the users
to indicate what is supported so that we don't end up advertising things
to userspace that we can't actually support.

In order to avoid breaking existing users the flags in platform data are
a bit awkward and specify what should be disabled rather than doing the
perhaps more expected thing and defaulting to not supporting capture.
Reviewed-by: default avatarRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Link: https://lore.kernel.org/r/20221130184644.464820-2-broonie@kernel.orgSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent eb708140
...@@ -124,7 +124,11 @@ struct hdmi_codec_ops { ...@@ -124,7 +124,11 @@ struct hdmi_codec_ops {
struct hdmi_codec_pdata { struct hdmi_codec_pdata {
const struct hdmi_codec_ops *ops; const struct hdmi_codec_ops *ops;
uint i2s:1; uint i2s:1;
uint no_i2s_playback:1;
uint no_i2s_capture:1;
uint spdif:1; uint spdif:1;
uint no_spdif_playback:1;
uint no_spdif_capture:1;
int max_i2s_channels; int max_i2s_channels;
void *data; void *data;
}; };
......
...@@ -816,12 +816,19 @@ static int hdmi_dai_probe(struct snd_soc_dai *dai) ...@@ -816,12 +816,19 @@ static int hdmi_dai_probe(struct snd_soc_dai *dai)
.source = "RX", .source = "RX",
}, },
}; };
int ret; int ret, i;
dapm = snd_soc_component_get_dapm(dai->component); dapm = snd_soc_component_get_dapm(dai->component);
ret = snd_soc_dapm_add_routes(dapm, route, 2);
/* One of the directions might be omitted for unidirectional DAIs */
for (i = 0; i < ARRAY_SIZE(route); i++) {
if (!route[i].source || !route[i].sink)
continue;
ret = snd_soc_dapm_add_routes(dapm, &route[i], 1);
if (ret) if (ret)
return ret; return ret;
}
daifmt = devm_kzalloc(dai->dev, sizeof(*daifmt), GFP_KERNEL); daifmt = devm_kzalloc(dai->dev, sizeof(*daifmt), GFP_KERNEL);
if (!daifmt) if (!daifmt)
...@@ -1009,11 +1016,24 @@ static int hdmi_codec_probe(struct platform_device *pdev) ...@@ -1009,11 +1016,24 @@ static int hdmi_codec_probe(struct platform_device *pdev)
if (hcd->i2s) { if (hcd->i2s) {
daidrv[i] = hdmi_i2s_dai; daidrv[i] = hdmi_i2s_dai;
daidrv[i].playback.channels_max = hcd->max_i2s_channels; daidrv[i].playback.channels_max = hcd->max_i2s_channels;
if (hcd->no_i2s_playback)
memset(&daidrv[i].playback, 0,
sizeof(daidrv[i].playback));
if (hcd->no_i2s_capture)
memset(&daidrv[i].capture, 0,
sizeof(daidrv[i].capture));
i++; i++;
} }
if (hcd->spdif) if (hcd->spdif) {
daidrv[i] = hdmi_spdif_dai; daidrv[i] = hdmi_spdif_dai;
if (hcd->no_spdif_playback)
memset(&daidrv[i].playback, 0,
sizeof(daidrv[i].playback));
if (hcd->no_spdif_capture)
memset(&daidrv[i].capture, 0,
sizeof(daidrv[i].capture));
}
dev_set_drvdata(dev, hcp); dev_set_drvdata(dev, hcp);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment