summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i2c/tda998x_drv.c57
1 files changed, 29 insertions, 28 deletions
diff --git a/drivers/gpu/drm/i2c/tda998x_drv.c b/drivers/gpu/drm/i2c/tda998x_drv.c
index 9590c4f92969..91b8ad1da923 100644
--- a/drivers/gpu/drm/i2c/tda998x_drv.c
+++ b/drivers/gpu/drm/i2c/tda998x_drv.c
@@ -35,9 +35,10 @@
#define DBG(fmt, ...) DRM_DEBUG(fmt"\n", ##__VA_ARGS__)
-struct tda998x_audio_port {
- u8 format; /* AFMT_xxx */
- u8 config; /* AP value */
+enum {
+ AUDIO_ROUTE_I2S,
+ AUDIO_ROUTE_SPDIF,
+ AUDIO_ROUTE_NUM
};
struct tda998x_audio_settings {
@@ -79,7 +80,7 @@ struct tda998x_priv {
struct drm_bridge bridge;
struct drm_connector connector;
- struct tda998x_audio_port audio_port[2];
+ u8 audio_port_enable[AUDIO_ROUTE_NUM];
struct tda9950_glue cec_glue;
struct gpio_desc *calib;
struct cec_notifier *cec_notify;
@@ -1045,7 +1046,7 @@ static int tda998x_audio_hw_params(struct device *dev, void *data,
struct tda998x_priv *priv = dev_get_drvdata(dev);
unsigned int bclk_ratio;
bool spdif = daifmt->fmt == HDMI_SPDIF;
- int i, ret;
+ int ret;
struct tda998x_audio_settings audio = {
.params = {
.sample_width = params->sample_width,
@@ -1077,10 +1078,7 @@ static int tda998x_audio_hw_params(struct device *dev, void *data,
audio.params.format = spdif ? AFMT_SPDIF : AFMT_I2S;
- for (i = 0; i < ARRAY_SIZE(priv->audio_port); i++)
- if (priv->audio_port[i].format == audio.params.format)
- audio.ena_ap = priv->audio_port[i].config;
-
+ audio.ena_ap = priv->audio_port_enable[AUDIO_ROUTE_I2S + spdif];
if (audio.ena_ap == 0) {
dev_err(dev, "%s: No audio configuration found\n", __func__);
return -EINVAL;
@@ -1165,16 +1163,11 @@ static int tda998x_audio_codec_init(struct tda998x_priv *priv,
.ops = &audio_codec_ops,
.max_i2s_channels = 2,
};
- int i;
- for (i = 0; i < ARRAY_SIZE(priv->audio_port); i++) {
- if (priv->audio_port[i].format == AFMT_I2S &&
- priv->audio_port[i].config != 0)
- codec_data.i2s = 1;
- if (priv->audio_port[i].format == AFMT_SPDIF &&
- priv->audio_port[i].config != 0)
- codec_data.spdif = 1;
- }
+ if (priv->audio_port_enable[AUDIO_ROUTE_I2S])
+ codec_data.i2s = 1;
+ if (priv->audio_port_enable[AUDIO_ROUTE_SPDIF])
+ codec_data.spdif = 1;
priv->audio_pdev = platform_device_register_data(
dev, HDMI_CODEC_DRV_NAME, PLATFORM_DEVID_AUTO,
@@ -1657,7 +1650,7 @@ static int tda998x_get_audio_ports(struct tda998x_priv *priv,
return 0;
size /= sizeof(u32);
- if (size > 2 * ARRAY_SIZE(priv->audio_port) || size % 2 != 0) {
+ if (size > 2 * ARRAY_SIZE(priv->audio_port_enable) || size % 2 != 0) {
dev_err(&priv->hdmi->dev,
"Bad number of elements in audio-ports dt-property\n");
return -EINVAL;
@@ -1666,23 +1659,30 @@ static int tda998x_get_audio_ports(struct tda998x_priv *priv,
size /= 2;
for (i = 0; i < size; i++) {
+ unsigned int route;
u8 afmt = be32_to_cpup(&port_data[2*i]);
u8 ena_ap = be32_to_cpup(&port_data[2*i+1]);
- if (afmt != AFMT_SPDIF && afmt != AFMT_I2S) {
+ switch (afmt) {
+ case AFMT_I2S:
+ route = AUDIO_ROUTE_I2S;
+ break;
+ case AFMT_SPDIF:
+ route = AUDIO_ROUTE_SPDIF;
+ break;
+ default:
dev_err(&priv->hdmi->dev,
"Bad audio format %u\n", afmt);
return -EINVAL;
}
- priv->audio_port[i].format = afmt;
- priv->audio_port[i].config = ena_ap;
- }
+ if (priv->audio_port_enable[route]) {
+ dev_err(&priv->hdmi->dev,
+ "There can only be on I2S port and one SPDIF port\n");
+ return -EINVAL;
+ }
- if (priv->audio_port[0].format == priv->audio_port[1].format) {
- dev_err(&priv->hdmi->dev,
- "There can only be on I2S port and one SPDIF port\n");
- return -EINVAL;
+ priv->audio_port_enable[route] = ena_ap;
}
return 0;
}
@@ -1914,7 +1914,8 @@ static int tda998x_create(struct device *dev)
if (ret)
goto fail;
- if (priv->audio_port[0].format != AFMT_UNUSED)
+ if (priv->audio_port_enable[AUDIO_ROUTE_I2S] ||
+ priv->audio_port_enable[AUDIO_ROUTE_SPDIF])
tda998x_audio_codec_init(priv, &client->dev);
} else if (dev->platform_data) {
ret = tda998x_set_config(priv, dev->platform_data);