diff --git a/drivers/gpu/drm/rockchip/rk618/rk618_hdmi.c b/drivers/gpu/drm/rockchip/rk618/rk618_hdmi.c index 678b527a831a..4158bcce1b91 100644 --- a/drivers/gpu/drm/rockchip/rk618/rk618_hdmi.c +++ b/drivers/gpu/drm/rockchip/rk618/rk618_hdmi.c @@ -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,