drm: rockchip: rk618: add spdif for hdmi audio source

Signed-off-by: XiaoTan Luo <lxt@rock-chips.com>
Change-Id: I15cac9c3ab92140983511a5ea0e333ef991ba1e1
This commit is contained in:
XiaoTan Luo
2021-09-17 10:35:22 +08:00
committed by Tao Huang
parent 1b50b34dcf
commit 8633b4cf1d

View File

@@ -1130,8 +1130,9 @@ static const struct drm_bridge_funcs rk618_hdmi_bridge_funcs = {
.disable = rk618_hdmi_bridge_disable,
};
static int
rk618_hdmi_audio_config_set(struct rk618_hdmi *hdmi, struct audio_info *audio)
static int rk618_hdmi_audio_config_set(struct rk618_hdmi *hdmi,
struct hdmi_codec_daifmt *daifmt,
struct audio_info *audio)
{
int rate, N, channel;
@@ -1179,14 +1180,19 @@ rk618_hdmi_audio_config_set(struct rk618_hdmi *hdmi, struct audio_info *audio)
return -ENOENT;
}
/* set_audio source I2S */
hdmi_writeb(hdmi, HDMI_AUDIO_CTRL1, 0x01);
if (daifmt->fmt == HDMI_SPDIF) {
/* set_audio source SPDIF */
hdmi_writeb(hdmi, HDMI_AUDIO_CTRL1, 0x09);
} else {
/* set_audio source I2S */
hdmi_writeb(hdmi, HDMI_AUDIO_CTRL1, 0x01);
}
hdmi_writeb(hdmi, AUDIO_SAMPLE_RATE, rate);
hdmi_writeb(hdmi, AUDIO_I2S_MODE, v_I2S_MODE(I2S_STANDARD) |
v_I2S_CHANNEL(channel));
hdmi_writeb(hdmi, AUDIO_I2S_MAP, 0x00);
hdmi_writeb(hdmi, AUDIO_I2S_SWAPS_SPDIF, 0);
hdmi_writeb(hdmi, AUDIO_I2S_SWAPS_SPDIF, rate);
/* Set N value */
hdmi_writeb(hdmi, AUDIO_N_H, (N >> 16) & 0x0F);
@@ -1221,12 +1227,14 @@ static int rk618_hdmi_audio_hw_params(struct device *dev, void *d,
switch (daifmt->fmt) {
case HDMI_I2S:
break;
case HDMI_SPDIF:
break;
default:
dev_err(dev, "%s: Invalid format %d\n", __func__, daifmt->fmt);
return -EINVAL;
}
return rk618_hdmi_audio_config_set(hdmi, &audio);
return rk618_hdmi_audio_config_set(hdmi, daifmt, &audio);
}
static void rk618_hdmi_audio_shutdown(struct device *dev, void *d)
@@ -1286,12 +1294,23 @@ static const struct hdmi_codec_ops audio_codec_ops = {
static int rk618_hdmi_audio_codec_init(struct rk618_hdmi *hdmi,
struct device *dev)
{
const char *str = "i2s";
struct device_node *np = dev->of_node;
struct hdmi_codec_pdata codec_data = {
.i2s = 1,
.spdif = 0,
.ops = &audio_codec_ops,
.max_i2s_channels = 8,
};
if (of_property_read_string(np, "rockchip,format", &str))
dev_warn(dev, "can not get rockchip,format\n");
if (strstr(str, "spdif")) {
codec_data.i2s = 0;
codec_data.spdif = 1;
}
hdmi->audio_enable = false;
hdmi->audio_pdev = platform_device_register_data(dev,
HDMI_CODEC_DRV_NAME, PLATFORM_DEVID_NONE,