ASoC: codec: hdmi-codec: add support for audio mode config

Change-Id: I4813e6204fee894ef4f40b3e3b768a1ad94d0a29
Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>
This commit is contained in:
Sugar Zhang
2019-08-27 21:16:41 +08:00
committed by Tao Huang
parent a34b88b1e1
commit 8ce747aebf
2 changed files with 58 additions and 0 deletions

View File

@@ -53,6 +53,13 @@ struct hdmi_codec_params {
int sample_rate;
int sample_width;
int channels;
int mode;
};
enum {
LPCM = 0,
NLPCM,
HBR,
};
struct hdmi_codec_pdata;

View File

@@ -285,6 +285,7 @@ struct hdmi_codec_priv {
uint8_t eld[MAX_ELD_BYTES];
struct snd_pcm_chmap *chmap_info;
unsigned int chmap_idx;
unsigned int mode;
};
static const struct snd_soc_dapm_widget hdmi_widgets[] = {
@@ -316,6 +317,36 @@ static int hdmi_eld_ctl_get(struct snd_kcontrol *kcontrol,
return 0;
}
static int hdmi_audio_mode_info(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_info *uinfo)
{
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
uinfo->count = 1;
uinfo->value.integer.min = 0;
uinfo->value.integer.max = HBR;
return 0;
}
static int hdmi_audio_mode_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
struct hdmi_codec_priv *hcp = snd_soc_component_get_drvdata(component);
ucontrol->value.integer.value[0] = hcp->mode;
return 0;
}
static int hdmi_audio_mode_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
struct hdmi_codec_priv *hcp = snd_soc_component_get_drvdata(component);
hcp->mode = ucontrol->value.integer.value[0];
return 0;
}
static unsigned long hdmi_codec_spk_mask_from_alloc(int spk_alloc)
{
int i;
@@ -523,6 +554,7 @@ static int hdmi_codec_hw_params(struct snd_pcm_substream *substream,
hp.sample_width = params_width(params);
hp.sample_rate = params_rate(params);
hp.channels = params_channels(params);
hp.mode = hcp->mode;
return hcp->hcd.ops->hw_params(dai->dev->parent, hcp->hcd.data,
&hcp->daifmt[dai->id], &hp);
@@ -661,6 +693,16 @@ static int hdmi_codec_pcm_new(struct snd_soc_pcm_runtime *rtd,
.get = hdmi_eld_ctl_get,
.device = rtd->pcm->device,
};
struct snd_kcontrol_new hdmi_mode_ctl = {
.access = SNDRV_CTL_ELEM_ACCESS_READ |
SNDRV_CTL_ELEM_ACCESS_WRITE |
SNDRV_CTL_ELEM_ACCESS_VOLATILE,
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
.name = "AUDIO MODE",
.info = hdmi_audio_mode_info,
.get = hdmi_audio_mode_get,
.put = hdmi_audio_mode_put,
};
int ret;
dev_dbg(dai->dev, "%s()\n", __func__);
@@ -684,6 +726,15 @@ static int hdmi_codec_pcm_new(struct snd_soc_pcm_runtime *rtd,
if (!kctl)
return -ENOMEM;
ret = snd_ctl_add(rtd->card->snd_card, kctl);
if (ret < 0)
return ret;
/* add MODE ctl with the device number corresponding to the PCM stream */
kctl = snd_ctl_new1(&hdmi_mode_ctl, dai->component);
if (!kctl)
return -ENOMEM;
return snd_ctl_add(rtd->card->snd_card, kctl);
}