drm/bridge: dw-hdmi: move audio channel setup out of ahb
Part of the channel count setup done in dw-hdmi ahb should actually be done whatever the interface providing the data. Let's move it to dw-hdmi driver instead. Reviewed-by: Jonas Karlman <jonas@kwiboo.se> Signed-off-by: Jerome Brunet <jbrunet@baylibre.com> Reviewed-by: Neil Armstrong <narmstrong@baylibre.com> Signed-off-by: Neil Armstrong <narmstrong@baylibre.com> Link: https://patchwork.freedesktop.org/patch/msgid/20190812120726.1528-3-jbrunet@baylibre.com
This commit is contained in:
parent
8067f62bcc
commit
2a2a3d2ff7
|
@ -63,10 +63,6 @@ enum {
|
||||||
HDMI_REVISION_ID = 0x0001,
|
HDMI_REVISION_ID = 0x0001,
|
||||||
HDMI_IH_AHBDMAAUD_STAT0 = 0x0109,
|
HDMI_IH_AHBDMAAUD_STAT0 = 0x0109,
|
||||||
HDMI_IH_MUTE_AHBDMAAUD_STAT0 = 0x0189,
|
HDMI_IH_MUTE_AHBDMAAUD_STAT0 = 0x0189,
|
||||||
HDMI_FC_AUDICONF2 = 0x1027,
|
|
||||||
HDMI_FC_AUDSCONF = 0x1063,
|
|
||||||
HDMI_FC_AUDSCONF_LAYOUT1 = 1 << 0,
|
|
||||||
HDMI_FC_AUDSCONF_LAYOUT0 = 0 << 0,
|
|
||||||
HDMI_AHB_DMA_CONF0 = 0x3600,
|
HDMI_AHB_DMA_CONF0 = 0x3600,
|
||||||
HDMI_AHB_DMA_START = 0x3601,
|
HDMI_AHB_DMA_START = 0x3601,
|
||||||
HDMI_AHB_DMA_STOP = 0x3602,
|
HDMI_AHB_DMA_STOP = 0x3602,
|
||||||
|
@ -403,7 +399,7 @@ static int dw_hdmi_prepare(struct snd_pcm_substream *substream)
|
||||||
{
|
{
|
||||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||||
struct snd_dw_hdmi *dw = substream->private_data;
|
struct snd_dw_hdmi *dw = substream->private_data;
|
||||||
u8 threshold, conf0, conf1, layout, ca;
|
u8 threshold, conf0, conf1, ca;
|
||||||
|
|
||||||
/* Setup as per 3.0.5 FSL 4.1.0 BSP */
|
/* Setup as per 3.0.5 FSL 4.1.0 BSP */
|
||||||
switch (dw->revision) {
|
switch (dw->revision) {
|
||||||
|
@ -434,20 +430,12 @@ static int dw_hdmi_prepare(struct snd_pcm_substream *substream)
|
||||||
conf1 = default_hdmi_channel_config[runtime->channels - 2].conf1;
|
conf1 = default_hdmi_channel_config[runtime->channels - 2].conf1;
|
||||||
ca = default_hdmi_channel_config[runtime->channels - 2].ca;
|
ca = default_hdmi_channel_config[runtime->channels - 2].ca;
|
||||||
|
|
||||||
/*
|
|
||||||
* For >2 channel PCM audio, we need to select layout 1
|
|
||||||
* and set an appropriate channel map.
|
|
||||||
*/
|
|
||||||
if (runtime->channels > 2)
|
|
||||||
layout = HDMI_FC_AUDSCONF_LAYOUT1;
|
|
||||||
else
|
|
||||||
layout = HDMI_FC_AUDSCONF_LAYOUT0;
|
|
||||||
|
|
||||||
writeb_relaxed(threshold, dw->data.base + HDMI_AHB_DMA_THRSLD);
|
writeb_relaxed(threshold, dw->data.base + HDMI_AHB_DMA_THRSLD);
|
||||||
writeb_relaxed(conf0, dw->data.base + HDMI_AHB_DMA_CONF0);
|
writeb_relaxed(conf0, dw->data.base + HDMI_AHB_DMA_CONF0);
|
||||||
writeb_relaxed(conf1, dw->data.base + HDMI_AHB_DMA_CONF1);
|
writeb_relaxed(conf1, dw->data.base + HDMI_AHB_DMA_CONF1);
|
||||||
writeb_relaxed(layout, dw->data.base + HDMI_FC_AUDSCONF);
|
|
||||||
writeb_relaxed(ca, dw->data.base + HDMI_FC_AUDICONF2);
|
dw_hdmi_set_channel_count(dw->data.hdmi, runtime->channels);
|
||||||
|
dw_hdmi_set_channel_allocation(dw->data.hdmi, ca);
|
||||||
|
|
||||||
switch (runtime->format) {
|
switch (runtime->format) {
|
||||||
case SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE:
|
case SNDRV_PCM_FORMAT_IEC958_SUBFRAME_LE:
|
||||||
|
|
|
@ -645,6 +645,38 @@ void dw_hdmi_set_sample_rate(struct dw_hdmi *hdmi, unsigned int rate)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(dw_hdmi_set_sample_rate);
|
EXPORT_SYMBOL_GPL(dw_hdmi_set_sample_rate);
|
||||||
|
|
||||||
|
void dw_hdmi_set_channel_count(struct dw_hdmi *hdmi, unsigned int cnt)
|
||||||
|
{
|
||||||
|
u8 layout;
|
||||||
|
|
||||||
|
mutex_lock(&hdmi->audio_mutex);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For >2 channel PCM audio, we need to select layout 1
|
||||||
|
* and set an appropriate channel map.
|
||||||
|
*/
|
||||||
|
if (cnt > 2)
|
||||||
|
layout = HDMI_FC_AUDSCONF_AUD_PACKET_LAYOUT_LAYOUT1;
|
||||||
|
else
|
||||||
|
layout = HDMI_FC_AUDSCONF_AUD_PACKET_LAYOUT_LAYOUT0;
|
||||||
|
|
||||||
|
hdmi_modb(hdmi, layout, HDMI_FC_AUDSCONF_AUD_PACKET_LAYOUT_MASK,
|
||||||
|
HDMI_FC_AUDSCONF);
|
||||||
|
|
||||||
|
mutex_unlock(&hdmi->audio_mutex);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(dw_hdmi_set_channel_count);
|
||||||
|
|
||||||
|
void dw_hdmi_set_channel_allocation(struct dw_hdmi *hdmi, unsigned int ca)
|
||||||
|
{
|
||||||
|
mutex_lock(&hdmi->audio_mutex);
|
||||||
|
|
||||||
|
hdmi_writeb(hdmi, ca, HDMI_FC_AUDICONF2);
|
||||||
|
|
||||||
|
mutex_unlock(&hdmi->audio_mutex);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(dw_hdmi_set_channel_allocation);
|
||||||
|
|
||||||
static void hdmi_enable_audio_clk(struct dw_hdmi *hdmi, bool enable)
|
static void hdmi_enable_audio_clk(struct dw_hdmi *hdmi, bool enable)
|
||||||
{
|
{
|
||||||
if (enable)
|
if (enable)
|
||||||
|
|
|
@ -155,6 +155,8 @@ void dw_hdmi_resume(struct dw_hdmi *hdmi);
|
||||||
void dw_hdmi_setup_rx_sense(struct dw_hdmi *hdmi, bool hpd, bool rx_sense);
|
void dw_hdmi_setup_rx_sense(struct dw_hdmi *hdmi, bool hpd, bool rx_sense);
|
||||||
|
|
||||||
void dw_hdmi_set_sample_rate(struct dw_hdmi *hdmi, unsigned int rate);
|
void dw_hdmi_set_sample_rate(struct dw_hdmi *hdmi, unsigned int rate);
|
||||||
|
void dw_hdmi_set_channel_count(struct dw_hdmi *hdmi, unsigned int cnt);
|
||||||
|
void dw_hdmi_set_channel_allocation(struct dw_hdmi *hdmi, unsigned int ca);
|
||||||
void dw_hdmi_audio_enable(struct dw_hdmi *hdmi);
|
void dw_hdmi_audio_enable(struct dw_hdmi *hdmi);
|
||||||
void dw_hdmi_audio_disable(struct dw_hdmi *hdmi);
|
void dw_hdmi_audio_disable(struct dw_hdmi *hdmi);
|
||||||
void dw_hdmi_set_high_tmds_clock_ratio(struct dw_hdmi *hdmi);
|
void dw_hdmi_set_high_tmds_clock_ratio(struct dw_hdmi *hdmi);
|
||||||
|
|
Loading…
Reference in New Issue