mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 02:50:49 +09:00
drm/rockchip: inno_hdmi: add spdif for hdmi audio source
Signed-off-by: Xing Zheng <zhengxing@rock-chips.com> Change-Id: I209565a68f84708f9aefac738dbf9b3cd2769976
This commit is contained in:
@@ -656,7 +656,9 @@ static struct drm_connector_helper_funcs inno_hdmi_connector_helper_funcs = {
|
||||
};
|
||||
|
||||
static int
|
||||
inno_hdmi_audio_config_set(struct inno_hdmi *hdmi, struct audio_info *audio)
|
||||
inno_hdmi_audio_config_set(struct inno_hdmi *hdmi,
|
||||
struct hdmi_codec_daifmt *daifmt,
|
||||
struct audio_info *audio)
|
||||
{
|
||||
int rate, N, channel;
|
||||
|
||||
@@ -704,14 +706,19 @@ inno_hdmi_audio_config_set(struct inno_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);
|
||||
@@ -762,12 +769,14 @@ static int inno_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 inno_hdmi_audio_config_set(hdmi, &audio);
|
||||
return inno_hdmi_audio_config_set(hdmi, daifmt, &audio);
|
||||
}
|
||||
|
||||
static void inno_hdmi_audio_shutdown(struct device *dev, void *d)
|
||||
@@ -828,12 +837,22 @@ static const struct hdmi_codec_ops audio_codec_ops = {
|
||||
static int inno_hdmi_audio_codec_init(struct inno_hdmi *hdmi,
|
||||
struct device *dev)
|
||||
{
|
||||
const char *str = "i2s";
|
||||
struct hdmi_codec_pdata codec_data = {
|
||||
.i2s = 1,
|
||||
.spdif = 0,
|
||||
.ops = &audio_codec_ops,
|
||||
.max_i2s_channels = 8,
|
||||
};
|
||||
|
||||
if (device_property_read_string(dev, "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,
|
||||
|
||||
Reference in New Issue
Block a user