ASoC: msm8996: Add slimbus_6_rx back-end dai-link and hostless

Add slimbus 6 playback hostless and slimbus_6_rx back-end
dai-link to enable independent backend for different devices
during audio playback.

Change-Id: Ibc12ca8ad2c99316c52092b74462ecd7bfbded5c
CRs-fixed: 940415
Signed-off-by: Kuirong Wang <kuirongw@codeaurora.org>
This commit is contained in:
Kuirong Wang 2016-01-21 16:18:50 -08:00 committed by David Keitel
parent 34c137e188
commit c9be1e4385

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. * Copyright (c) 2014-2016, The Linux Foundation. All rights reserved.
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and * it under the terms of the GNU General Public License version 2 and
@ -70,6 +70,8 @@ static int hdmi_rx_bit_format = SNDRV_PCM_FORMAT_S16_LE;
static int msm8996_auxpcm_rate = SAMPLING_RATE_8KHZ; static int msm8996_auxpcm_rate = SAMPLING_RATE_8KHZ;
static int slim5_rx_sample_rate = SAMPLING_RATE_48KHZ; static int slim5_rx_sample_rate = SAMPLING_RATE_48KHZ;
static int slim5_rx_bit_format = SNDRV_PCM_FORMAT_S16_LE; static int slim5_rx_bit_format = SNDRV_PCM_FORMAT_S16_LE;
static int slim6_rx_sample_rate = SAMPLING_RATE_48KHZ;
static int slim6_rx_bit_format = SNDRV_PCM_FORMAT_S16_LE;
static struct platform_device *spdev; static struct platform_device *spdev;
static int ext_us_amp_gpio = -1; static int ext_us_amp_gpio = -1;
@ -78,6 +80,7 @@ static int msm_slim_0_rx_ch = 1;
static int msm_slim_0_tx_ch = 1; static int msm_slim_0_tx_ch = 1;
static int msm_slim_1_tx_ch = 1; static int msm_slim_1_tx_ch = 1;
static int msm_slim_5_rx_ch = 1; static int msm_slim_5_rx_ch = 1;
static int msm_slim_6_rx_ch = 1;
static int msm_hifi_control; static int msm_hifi_control;
static int msm_vi_feed_tx_ch = 2; static int msm_vi_feed_tx_ch = 2;
@ -93,6 +96,7 @@ static const char *const pin_states[] = {"Disable", "active"};
static const char *const spk_function[] = {"Off", "On"}; static const char *const spk_function[] = {"Off", "On"};
static const char *const slim0_rx_ch_text[] = {"One", "Two"}; static const char *const slim0_rx_ch_text[] = {"One", "Two"};
static const char *const slim5_rx_ch_text[] = {"One", "Two"}; static const char *const slim5_rx_ch_text[] = {"One", "Two"};
static const char *const slim6_rx_ch_text[] = {"One", "Two"};
static const char *const slim0_tx_ch_text[] = {"One", "Two", "Three", "Four", static const char *const slim0_tx_ch_text[] = {"One", "Two", "Three", "Four",
"Five", "Six", "Seven", "Five", "Six", "Seven",
"Eight"}; "Eight"};
@ -101,11 +105,14 @@ static char const *hdmi_rx_ch_text[] = {"Two", "Three", "Four", "Five",
"Six", "Seven", "Eight"}; "Six", "Seven", "Eight"};
static char const *rx_bit_format_text[] = {"S16_LE", "S24_LE"}; static char const *rx_bit_format_text[] = {"S16_LE", "S24_LE"};
static char const *slim5_rx_bit_format_text[] = {"S16_LE", "S24_LE"}; static char const *slim5_rx_bit_format_text[] = {"S16_LE", "S24_LE"};
static char const *slim6_rx_bit_format_text[] = {"S16_LE", "S24_LE"};
static char const *slim0_rx_sample_rate_text[] = {"KHZ_48", "KHZ_96", static char const *slim0_rx_sample_rate_text[] = {"KHZ_48", "KHZ_96",
"KHZ_192", "KHZ_44P1", "KHZ_8", "KHZ_192", "KHZ_44P1", "KHZ_8",
"KHZ_16", "KHZ_32"}; "KHZ_16", "KHZ_32"};
static char const *slim5_rx_sample_rate_text[] = {"KHZ_48", "KHZ_96", static char const *slim5_rx_sample_rate_text[] = {"KHZ_48", "KHZ_96",
"KHZ_192", "KHZ_44P1"}; "KHZ_192", "KHZ_44P1"};
static char const *slim6_rx_sample_rate_text[] = {"KHZ_48", "KHZ_96",
"KHZ_192", "KHZ_44P1"};
static const char *const proxy_rx_ch_text[] = {"One", "Two", "Three", "Four", static const char *const proxy_rx_ch_text[] = {"One", "Two", "Three", "Four",
"Five", "Six", "Seven", "Eight"}; "Five", "Six", "Seven", "Eight"};
@ -614,6 +621,63 @@ static int slim5_rx_sample_rate_put(struct snd_kcontrol *kcontrol,
return 0; return 0;
} }
static int slim6_rx_sample_rate_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
int sample_rate_val = 0;
switch (slim6_rx_sample_rate) {
case SAMPLING_RATE_44P1KHZ:
sample_rate_val = 3;
break;
case SAMPLING_RATE_192KHZ:
sample_rate_val = 2;
break;
case SAMPLING_RATE_96KHZ:
sample_rate_val = 1;
break;
case SAMPLING_RATE_48KHZ:
default:
sample_rate_val = 0;
break;
}
ucontrol->value.integer.value[0] = sample_rate_val;
pr_debug("%s: slim6_rx_sample_rate = %d\n", __func__,
slim6_rx_sample_rate);
return 0;
}
static int slim6_rx_sample_rate_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
switch (ucontrol->value.integer.value[0]) {
case 3:
slim6_rx_sample_rate = SAMPLING_RATE_44P1KHZ;
break;
case 2:
slim6_rx_sample_rate = SAMPLING_RATE_192KHZ;
break;
case 1:
slim6_rx_sample_rate = SAMPLING_RATE_96KHZ;
break;
case 0:
default:
slim6_rx_sample_rate = SAMPLING_RATE_48KHZ;
break;
}
pr_debug("%s: ucontrol value = %ld, slim6_rx_sample_rate = %d\n",
__func__, ucontrol->value.integer.value[0],
slim6_rx_sample_rate);
return 0;
}
static int slim0_tx_bit_format_get(struct snd_kcontrol *kcontrol, static int slim0_tx_bit_format_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol)
{ {
@ -824,6 +888,43 @@ static int slim5_rx_bit_format_put(struct snd_kcontrol *kcontrol,
return 0; return 0;
} }
static int slim6_rx_bit_format_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
switch (slim6_rx_bit_format) {
case SNDRV_PCM_FORMAT_S24_LE:
ucontrol->value.integer.value[0] = 1;
break;
case SNDRV_PCM_FORMAT_S16_LE:
default:
ucontrol->value.integer.value[0] = 0;
break;
}
pr_debug("%s: slim6_rx_bit_format = %d, ucontrol value = %ld\n",
__func__, slim6_rx_bit_format,
ucontrol->value.integer.value[0]);
return 0;
}
static int slim6_rx_bit_format_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
switch (ucontrol->value.integer.value[0]) {
case 1:
slim6_rx_bit_format = SNDRV_PCM_FORMAT_S24_LE;
break;
case 0:
default:
slim6_rx_bit_format = SNDRV_PCM_FORMAT_S16_LE;
break;
}
return 0;
}
static int slim0_rx_bit_format_get(struct snd_kcontrol *kcontrol, static int slim0_rx_bit_format_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol)
{ {
@ -879,6 +980,24 @@ static int msm_slim_5_rx_ch_put(struct snd_kcontrol *kcontrol,
return 1; return 1;
} }
static int msm_slim_6_rx_ch_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
pr_debug("%s: msm_slim_6_rx_ch = %d\n", __func__,
msm_slim_6_rx_ch);
ucontrol->value.integer.value[0] = msm_slim_6_rx_ch - 1;
return 0;
}
static int msm_slim_6_rx_ch_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
msm_slim_6_rx_ch = ucontrol->value.integer.value[0] + 1;
pr_debug("%s: msm_slim_6_rx_ch = %d\n", __func__,
msm_slim_6_rx_ch);
return 1;
}
static int msm_slim_0_rx_ch_get(struct snd_kcontrol *kcontrol, static int msm_slim_0_rx_ch_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol)
{ {
@ -1244,6 +1363,26 @@ static int msm_slim_5_rx_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
return 0; return 0;
} }
static int msm_slim_6_rx_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
struct snd_pcm_hw_params *params)
{
struct snd_interval *rate = hw_param_interval(params,
SNDRV_PCM_HW_PARAM_RATE);
struct snd_interval *channels = hw_param_interval(params,
SNDRV_PCM_HW_PARAM_CHANNELS);
param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
slim6_rx_bit_format);
rate->min = rate->max = slim6_rx_sample_rate;
channels->min = channels->max = msm_slim_6_rx_ch;
pr_debug("%s: format = %d, rate = %d, channels = %d\n",
__func__, params_format(params), params_rate(params),
msm_slim_6_rx_ch);
return 0;
}
static int msm_slim_0_rx_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, static int msm_slim_0_rx_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
struct snd_pcm_hw_params *params) struct snd_pcm_hw_params *params)
{ {
@ -1370,6 +1509,9 @@ static const struct soc_enum msm_snd_enum[] = {
SOC_ENUM_SINGLE_EXT(2, slim5_rx_ch_text), SOC_ENUM_SINGLE_EXT(2, slim5_rx_ch_text),
SOC_ENUM_SINGLE_EXT(2, hifi_function), SOC_ENUM_SINGLE_EXT(2, hifi_function),
SOC_ENUM_SINGLE_EXT(2, vi_feed_ch_text), SOC_ENUM_SINGLE_EXT(2, vi_feed_ch_text),
SOC_ENUM_SINGLE_EXT(4, slim6_rx_sample_rate_text),
SOC_ENUM_SINGLE_EXT(2, slim6_rx_bit_format_text),
SOC_ENUM_SINGLE_EXT(2, slim6_rx_ch_text),
}; };
static const struct snd_kcontrol_new msm_snd_controls[] = { static const struct snd_kcontrol_new msm_snd_controls[] = {
@ -1379,6 +1521,8 @@ static const struct snd_kcontrol_new msm_snd_controls[] = {
msm_slim_0_rx_ch_get, msm_slim_0_rx_ch_put), msm_slim_0_rx_ch_get, msm_slim_0_rx_ch_put),
SOC_ENUM_EXT("SLIM_5_RX Channels", msm_snd_enum[10], SOC_ENUM_EXT("SLIM_5_RX Channels", msm_snd_enum[10],
msm_slim_5_rx_ch_get, msm_slim_5_rx_ch_put), msm_slim_5_rx_ch_get, msm_slim_5_rx_ch_put),
SOC_ENUM_EXT("SLIM_6_RX Channels", msm_snd_enum[15],
msm_slim_6_rx_ch_get, msm_slim_6_rx_ch_put),
SOC_ENUM_EXT("SLIM_0_TX Channels", msm_snd_enum[2], SOC_ENUM_EXT("SLIM_0_TX Channels", msm_snd_enum[2],
msm_slim_0_tx_ch_get, msm_slim_0_tx_ch_put), msm_slim_0_tx_ch_get, msm_slim_0_tx_ch_put),
SOC_ENUM_EXT("SLIM_1_TX Channels", msm_snd_enum[2], SOC_ENUM_EXT("SLIM_1_TX Channels", msm_snd_enum[2],
@ -1392,10 +1536,14 @@ static const struct snd_kcontrol_new msm_snd_controls[] = {
slim0_rx_bit_format_get, slim0_rx_bit_format_put), slim0_rx_bit_format_get, slim0_rx_bit_format_put),
SOC_ENUM_EXT("SLIM_5_RX Format", msm_snd_enum[9], SOC_ENUM_EXT("SLIM_5_RX Format", msm_snd_enum[9],
slim5_rx_bit_format_get, slim5_rx_bit_format_put), slim5_rx_bit_format_get, slim5_rx_bit_format_put),
SOC_ENUM_EXT("SLIM_6_RX Format", msm_snd_enum[14],
slim6_rx_bit_format_get, slim6_rx_bit_format_put),
SOC_ENUM_EXT("SLIM_0_RX SampleRate", msm_snd_enum[5], SOC_ENUM_EXT("SLIM_0_RX SampleRate", msm_snd_enum[5],
slim0_rx_sample_rate_get, slim0_rx_sample_rate_put), slim0_rx_sample_rate_get, slim0_rx_sample_rate_put),
SOC_ENUM_EXT("SLIM_5_RX SampleRate", msm_snd_enum[8], SOC_ENUM_EXT("SLIM_5_RX SampleRate", msm_snd_enum[8],
slim5_rx_sample_rate_get, slim5_rx_sample_rate_put), slim5_rx_sample_rate_get, slim5_rx_sample_rate_put),
SOC_ENUM_EXT("SLIM_6_RX SampleRate", msm_snd_enum[13],
slim6_rx_sample_rate_get, slim6_rx_sample_rate_put),
SOC_ENUM_EXT("HDMI_RX Bit Format", msm_snd_enum[4], SOC_ENUM_EXT("HDMI_RX Bit Format", msm_snd_enum[4],
hdmi_rx_bit_format_get, hdmi_rx_bit_format_put), hdmi_rx_bit_format_get, hdmi_rx_bit_format_put),
SOC_ENUM_EXT("PROXY_RX Channels", msm_snd_enum[6], SOC_ENUM_EXT("PROXY_RX Channels", msm_snd_enum[6],
@ -1840,6 +1988,10 @@ static int msm_snd_hw_params(struct snd_pcm_substream *substream,
pr_debug("%s: rx_5_ch=%d\n", __func__, pr_debug("%s: rx_5_ch=%d\n", __func__,
msm_slim_5_rx_ch); msm_slim_5_rx_ch);
rx_ch_count = msm_slim_5_rx_ch; rx_ch_count = msm_slim_5_rx_ch;
} else if (dai_link->be_id == MSM_BACKEND_DAI_SLIMBUS_6_RX) {
pr_debug("%s: rx_6_ch=%d\n", __func__,
msm_slim_6_rx_ch);
rx_ch_count = msm_slim_6_rx_ch;
} else { } else {
pr_debug("%s: rx_0_ch=%d\n", __func__, pr_debug("%s: rx_0_ch=%d\n", __func__,
msm_slim_0_rx_ch); msm_slim_0_rx_ch);
@ -2782,6 +2934,23 @@ static struct snd_soc_dai_link msm8996_tasha_fe_dai_links[] = {
.codec_name = "tasha_codec", .codec_name = "tasha_codec",
.ops = &msm8996_cpe_ops, .ops = &msm8996_cpe_ops,
}, },
/* slimbus rx 6 hostless */
{
.name = "SLIMBUS_6 Hostless Playback",
.stream_name = "SLIMBUS_6 Hostless",
.cpu_dai_name = "SLIMBUS6_HOSTLESS",
.platform_name = "msm-pcm-hostless",
.dynamic = 1,
.dpcm_playback = 1,
.trigger = {SND_SOC_DPCM_TRIGGER_POST,
SND_SOC_DPCM_TRIGGER_POST},
.no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
.ignore_suspend = 1,
/* this dailink has playback support */
.ignore_pmdown_time = 1,
.codec_dai_name = "snd-soc-dummy-dai",
.codec_name = "snd-soc-dummy",
},
}; };
static struct snd_soc_dai_link msm8996_common_be_dai_links[] = { static struct snd_soc_dai_link msm8996_common_be_dai_links[] = {
@ -3055,6 +3224,22 @@ static struct snd_soc_dai_link msm8996_tasha_be_dai_links[] = {
.ops = &msm8996_be_ops, .ops = &msm8996_be_ops,
.ignore_suspend = 1, .ignore_suspend = 1,
}, },
{
.name = LPASS_BE_SLIMBUS_6_RX,
.stream_name = "Slimbus6 Playback",
.cpu_dai_name = "msm-dai-q6-dev.16396",
.platform_name = "msm-pcm-routing",
.codec_name = "tasha_codec",
.codec_dai_name = "tasha_rx4",
.no_pcm = 1,
.dpcm_playback = 1,
.be_id = MSM_BACKEND_DAI_SLIMBUS_6_RX,
.be_hw_params_fixup = msm_slim_6_rx_be_hw_params_fixup,
.ops = &msm8996_be_ops,
/* dai link has playback support */
.ignore_pmdown_time = 1,
.ignore_suspend = 1,
},
}; };
static struct snd_soc_dai_link msm8996_hdmi_dai_link[] = { static struct snd_soc_dai_link msm8996_hdmi_dai_link[] = {