From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: "Jayanti, Satya Charitardha" Date: Wed, 4 Jan 2017 20:32:35 +0530 Subject: [PATCH] ASoC: rt700: codec changes for SDW Aggregation Add stream aggregation changes to codec driver. Playback and capture can be performed using two SoundWire master controllers and 2 RT700 codecs each connected to one master controller. Change-Id: I07d22afaa0e7dd4fbabe59adfe9a72b3f1e91852 Signed-off-by: Jayanti, Satya Charitardha Reviewed-on: Reviewed-by: Babu, Ramesh Reviewed-by: D M, Karthik Reviewed-by: Diwakar, Praveen Tested-by: Avati, Santosh Kumar --- sound/soc/codecs/rt700-sdw.c | 14 ++- sound/soc/codecs/rt700.c | 187 ++++++++++++++++++++++++++++++++++- sound/soc/codecs/rt700.h | 3 +- 3 files changed, 197 insertions(+), 7 deletions(-) diff --git a/sound/soc/codecs/rt700-sdw.c b/sound/soc/codecs/rt700-sdw.c index a2533edfa48a..1c935e3a05e2 100644 --- a/sound/soc/codecs/rt700-sdw.c +++ b/sound/soc/codecs/rt700-sdw.c @@ -252,7 +252,11 @@ static int rt700_register_sdw_capabilties(struct sdw_slv *sdw, dpn_cap->dpn_grouping = SDW_BLOCKGROUPCOUNT_1; dpn_cap->prepare_ch = SDW_SIMPLIFIED_CP_SM; dpn_cap->imp_def_intr_mask = 0; /* bit 0: Test Fail */ +#ifdef CONFIG_SND_SOC_SDW_AGGM1M2 + dpn_cap->min_ch_num = 1; +#else dpn_cap->min_ch_num = 2; +#endif dpn_cap->max_ch_num = 2; dpn_cap->num_ch_supported = 0; dpn_cap->ch_supported = NULL; @@ -319,7 +323,7 @@ static int rt700_sdw_probe(struct sdw_slv *sdw, ret = sdw_slave_get_bus_params(sdw, alc700_priv->params); if (ret) return -EFAULT; - return rt700_probe(&sdw->dev, regmap, sdw); + return rt700_probe(&sdw->dev, regmap, sdw, sdw_id->driver_data); } static int rt700_sdw_remove(struct sdw_slv *sdw) @@ -344,7 +348,15 @@ static const struct sdw_slv_id rt700_id[] = { {"15:02:5d:07:01:00", 0}, {"16:02:5d:07:01:00", 0}, {"17:02:5d:07:01:00", 0}, +#ifndef CONFIG_SND_SOC_INTEL_CNL_FPGA +#ifndef CONFIG_SND_SOC_SDW_AGGM1M2 {"10:02:5d:07:00:01", 0}, +#else + {"10:02:5d:07:00:01", 1}, + {"10:02:5d:07:01:02", 2}, + {"10:02:5d:07:01:03", 3}, +#endif +#endif {} }; diff --git a/sound/soc/codecs/rt700.c b/sound/soc/codecs/rt700.c index 400f7bbc6245..8fc9c00e15b8 100644 --- a/sound/soc/codecs/rt700.c +++ b/sound/soc/codecs/rt700.c @@ -849,6 +849,39 @@ static const struct snd_kcontrol_new rt700_snd_controls[] = { rt700_set_amp_gain_get, rt700_set_amp_gain_put), }; +#ifdef CONFIG_SND_SOC_SDW_AGGM1M2 +static const struct snd_kcontrol_new rt700_2_snd_controls[] = { + SOC_DOUBLE_R_EXT_TLV("DAC Front_2 Playback Volume", RT700_SET_GAIN_DAC1_H, + RT700_SET_GAIN_DAC1_L, RT700_DIR_OUT_SFT, 0x7f, 0, + rt700_set_amp_gain_get, rt700_set_amp_gain_put, + out_vol_tlv), + SOC_DOUBLE_R_EXT("ADC 08_2 Capture Switch", RT700_SET_GAIN_ADC2_H, + RT700_SET_GAIN_ADC2_L, RT700_DIR_IN_SFT, 1, 1, + rt700_set_amp_gain_get, rt700_set_amp_gain_put), + SOC_DOUBLE_R_EXT("ADC 09_2 Capture Switch", RT700_SET_GAIN_ADC1_H, + RT700_SET_GAIN_ADC1_L, RT700_DIR_IN_SFT, 1, 1, + rt700_set_amp_gain_get, rt700_set_amp_gain_put), + SOC_DOUBLE_R_EXT_TLV("ADC 08_2 Capture Volume", RT700_SET_GAIN_ADC2_H, + RT700_SET_GAIN_ADC2_L, RT700_DIR_IN_SFT, 0x7f, 0, + rt700_set_amp_gain_get, rt700_set_amp_gain_put, + out_vol_tlv), + SOC_DOUBLE_R_EXT_TLV("ADC 09_2 Capture Volume", RT700_SET_GAIN_ADC1_H, + RT700_SET_GAIN_ADC1_L, RT700_DIR_IN_SFT, 0x7f, 0, + rt700_set_amp_gain_get, rt700_set_amp_gain_put, + out_vol_tlv), + SOC_DOUBLE_R_EXT_TLV("AMIC_2 Volume", RT700_SET_GAIN_AMIC_H, + RT700_SET_GAIN_AMIC_L, RT700_DIR_IN_SFT, 3, 0, + rt700_set_amp_gain_get, rt700_set_amp_gain_put, + mic_vol_tlv), + SOC_DOUBLE_R_EXT("Speaker Playback_2 Switch", RT700_SET_GAIN_SPK_H, + RT700_SET_GAIN_SPK_L, RT700_DIR_OUT_SFT, 1, 1, + rt700_set_amp_gain_get, rt700_set_amp_gain_put), + SOC_DOUBLE_R_EXT("Headphone Playback_2 Switch", RT700_SET_GAIN_HP_H, + RT700_SET_GAIN_HP_L, RT700_DIR_OUT_SFT, 1, 1, + rt700_set_amp_gain_get, rt700_set_amp_gain_put), +}; +#endif + static int rt700_mux_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { @@ -922,12 +955,29 @@ static const char * const adc_mux_text[] = { "DMIC", }; +#ifdef CONFIG_SND_SOC_SDW_AGGM1M2 +static const char * const adc_mux_2_text[] = { + "MIC2_2", + "LINE1_2", + "LINE2_2", + "DMIC", +}; +#endif + static const SOC_ENUM_SINGLE_DECL( rt700_adc22_enum, RT700_MIXER_IN1, 0, adc_mux_text); static const SOC_ENUM_SINGLE_DECL( rt700_adc23_enum, RT700_MIXER_IN2, 0, adc_mux_text); +#ifdef CONFIG_SND_SOC_SDW_AGGM1M2 +static const SOC_ENUM_SINGLE_DECL( + rt700_adc22_2_enum, RT700_MIXER_IN1, 0, adc_mux_2_text); + +static const SOC_ENUM_SINGLE_DECL( + rt700_adc23_2_enum, RT700_MIXER_IN2, 0, adc_mux_2_text); +#endif + static const struct snd_kcontrol_new rt700_adc22_mux = SOC_DAPM_ENUM_EXT("ADC 22 Mux", rt700_adc22_enum, rt700_mux_get, rt700_mux_put); @@ -935,6 +985,15 @@ static const struct snd_kcontrol_new rt700_adc22_mux = static const struct snd_kcontrol_new rt700_adc23_mux = SOC_DAPM_ENUM_EXT("ADC 23 Mux", rt700_adc23_enum, rt700_mux_get, rt700_mux_put); +#ifdef CONFIG_SND_SOC_SDW_AGGM1M2 +static const struct snd_kcontrol_new rt700_adc22_mux_2 = + SOC_DAPM_ENUM_EXT("ADC 22 Mux_2", rt700_adc22_2_enum, + rt700_mux_get, rt700_mux_put); + +static const struct snd_kcontrol_new rt700_adc23_mux_2 = + SOC_DAPM_ENUM_EXT("ADC 23 Mux_2", rt700_adc23_2_enum, + rt700_mux_get, rt700_mux_put); +#endif static const char * const out_mux_text[] = { "Front", @@ -972,6 +1031,32 @@ static const struct snd_soc_dapm_widget rt700_dapm_widgets[] = { SND_SOC_DAPM_AIF_OUT("DP4TX", "DP4 Capture", 0, SND_SOC_NOPM, 0, 0), }; +#ifdef CONFIG_SND_SOC_SDW_AGGM1M2 +static const struct snd_soc_dapm_widget rt700_2_dapm_widgets[] = { + SND_SOC_DAPM_OUTPUT("HP_2"), + SND_SOC_DAPM_OUTPUT("SPK_2"), + SND_SOC_DAPM_INPUT("DMIC1_2"), + SND_SOC_DAPM_INPUT("DMIC2_2"), + SND_SOC_DAPM_INPUT("MIC2_2"), + SND_SOC_DAPM_INPUT("LINE1_2"), + SND_SOC_DAPM_INPUT("LINE2_2"), + SND_SOC_DAPM_DAC("DAC Front_2", NULL, RT700_SET_STREAMID_DAC1, 4, 0), + SND_SOC_DAPM_DAC("DAC Surround_2", NULL, RT700_SET_STREAMID_DAC2, 4, 0), + SND_SOC_DAPM_MUX("HPO Mux_2", SND_SOC_NOPM, 0, 0, &rt700_hp_mux), + SND_SOC_DAPM_PGA("SPK PGA_2", SND_SOC_NOPM, 0, 0, NULL, 0), + SND_SOC_DAPM_ADC("ADC 09_2", NULL, RT700_SET_STREAMID_ADC1, 4, 0), + SND_SOC_DAPM_ADC("ADC 08_2", NULL, RT700_SET_STREAMID_ADC2, 4, 0), + SND_SOC_DAPM_MUX("ADC 22 Mux_2", SND_SOC_NOPM, 0, 0, + &rt700_adc22_mux_2), + SND_SOC_DAPM_MUX("ADC 23 Mux_2", SND_SOC_NOPM, 0, 0, + &rt700_adc23_mux_2), + SND_SOC_DAPM_AIF_IN("DP1RX_2", "DP1 Playback2", 0, SND_SOC_NOPM, 0, 0), + SND_SOC_DAPM_AIF_IN("DP3RX_2", "DP3 Playback2", 0, SND_SOC_NOPM, 0, 0), + SND_SOC_DAPM_AIF_OUT("DP2TX_2", "DP2 Capture2", 0, SND_SOC_NOPM, 0, 0), + SND_SOC_DAPM_AIF_OUT("DP4TX_2", "DP4 Capture2", 0, SND_SOC_NOPM, 0, 0), +}; +#endif + static const struct snd_soc_dapm_route rt700_audio_map[] = { {"DAC Front", NULL, "DP1RX"}, {"DAC Surround", NULL, "DP3RX"}, @@ -994,6 +1079,30 @@ static const struct snd_soc_dapm_route rt700_audio_map[] = { {"SPK", NULL, "SPK PGA"}, }; +#ifdef CONFIG_SND_SOC_SDW_AGGM1M2 +static const struct snd_soc_dapm_route rt700_2_audio_map[] = { + {"DAC Front_2", NULL, "DP1RX_2"}, + {"DAC Surround_2", NULL, "DP3RX_2"}, + {"DP2TX_2", NULL, "ADC 09_2"}, + {"DP4TX_2", NULL, "ADC 08_2"}, + {"ADC 09_2", NULL, "ADC 22 Mux_2"}, + {"ADC 08_2", NULL, "ADC 23 Mux_2"}, + {"ADC 22 Mux_2", "DMIC", "DMIC1_2"}, + {"ADC 22 Mux_2", "LINE1_2", "LINE1_2"}, + {"ADC 22 Mux_2", "LINE2_2", "LINE2_2"}, + {"ADC 22 Mux_2", "MIC2_2", "MIC2_2"}, + {"ADC 23 Mux_2", "DMIC", "DMIC2_2"}, + {"ADC 23 Mux_2", "LINE1_2", "LINE1_2"}, + {"ADC 23 Mux_2", "LINE2_2", "LINE2_2"}, + {"ADC 23 Mux_2", "MIC2_2", "MIC2_2"}, + {"HPO Mux_2", "Front", "DAC Front_2"}, + {"HPO Mux_2", "Surround", "DAC Surround_2"}, + {"HP_2", NULL, "HPO Mux_2"}, + {"SPK PGA_2", NULL, "DAC Front_2"}, + {"SPK_2", NULL, "SPK PGA_2"}, +}; +#endif + static int rt700_set_bias_level(struct snd_soc_component *component, enum snd_soc_bias_level level) { @@ -1035,6 +1144,18 @@ static const struct snd_soc_component_driver soc_component_dev_rt700 = { .num_dapm_routes = ARRAY_SIZE(rt700_audio_map), }; +#ifdef CONFIG_SND_SOC_SDW_AGGM1M2 +static const struct snd_soc_component_driver soc_component_dev_rt700_2 = { + .set_bias_level = rt700_set_bias_level, + .controls = rt700_2_snd_controls, + .num_controls = ARRAY_SIZE(rt700_2_snd_controls), + .dapm_widgets = rt700_2_dapm_widgets, + .num_dapm_widgets = ARRAY_SIZE(rt700_2_dapm_widgets), + .dapm_routes = rt700_2_audio_map, + .num_dapm_routes = ARRAY_SIZE(rt700_2_audio_map), +}; +#endif + static int rt700_program_stream_tag(struct snd_pcm_substream *substream, struct snd_soc_dai *dai, int stream_tag) { @@ -1210,14 +1331,14 @@ static struct snd_soc_dai_driver rt700_dai[] = { .id = RT700_AIF1, .playback = { .stream_name = "DP1 Playback", - .channels_min = 2, + .channels_min = 1, .channels_max = 2, .rates = RT700_STEREO_RATES, .formats = RT700_FORMATS, }, .capture = { .stream_name = "DP2 Capture", - .channels_min = 2, + .channels_min = 1, .channels_max = 2, .rates = RT700_STEREO_RATES, .formats = RT700_FORMATS, @@ -1229,14 +1350,56 @@ static struct snd_soc_dai_driver rt700_dai[] = { .id = RT700_AIF2, .playback = { .stream_name = "DP3 Playback", - .channels_min = 2, + .channels_min = 1, .channels_max = 2, .rates = RT700_STEREO_RATES, .formats = RT700_FORMATS, }, .capture = { .stream_name = "DP4 Capture", - .channels_min = 2, + .channels_min = 1, + .channels_max = 2, + .rates = RT700_STEREO_RATES, + .formats = RT700_FORMATS, + }, + .ops = &rt700_ops, + }, +}; + +#ifdef CONFIG_SND_SOC_SDW_AGGM1M2 +static struct snd_soc_dai_driver rt700_2_dai[] = { + { + .name = "rt700-aif1_2", + .id = RT700_AIF1, + .playback = { + .stream_name = "DP1 Playback2", + .channels_min = 1, + .channels_max = 2, + .rates = RT700_STEREO_RATES, + .formats = RT700_FORMATS, + }, + .capture = { + .stream_name = "DP2 Capture2", + .channels_min = 1, + .channels_max = 2, + .rates = RT700_STEREO_RATES, + .formats = RT700_FORMATS, + }, + .ops = &rt700_ops, + }, + { + .name = "rt700-aif2_2", + .id = RT700_AIF2, + .playback = { + .stream_name = "DP3 Playback2", + .channels_min = 1, + .channels_max = 2, + .rates = RT700_STEREO_RATES, + .formats = RT700_FORMATS, + }, + .capture = { + .stream_name = "DP4 Capture2", + .channels_min = 1, .channels_max = 2, .rates = RT700_STEREO_RATES, .formats = RT700_FORMATS, @@ -1244,6 +1407,7 @@ static struct snd_soc_dai_driver rt700_dai[] = { .ops = &rt700_ops, }, }; +#endif static ssize_t rt700_index_cmd_show(struct device *dev, struct device_attribute *attr, char *buf) @@ -1538,7 +1702,8 @@ static ssize_t rt700_bra_trigger(struct device *dev, static DEVICE_ATTR(bra_trigger, 0444, rt700_bra_trigger, NULL); int rt700_probe(struct device *dev, struct regmap *regmap, - struct sdw_slave *slave) + struct sdw_slv *slave, + kernel_ulong_t driver_data) { struct rt700_priv *rt700; struct alc700 *alc700 = dev_get_drvdata(dev); @@ -1555,8 +1720,20 @@ int rt700_probe(struct device *dev, struct regmap *regmap, rt700->regmap = regmap; rt700->sdw = slave; +#ifndef CONFIG_SND_SOC_SDW_AGGM1M2 ret = devm_snd_soc_register_component(dev, &soc_component_dev_rt700, rt700_dai, ARRAY_SIZE(rt700_dai)); +#else + if (driver_data == 1) { + ret = devm_snd_soc_register_component(dev, + &soc_component_dev_rt700, + rt700_dai, ARRAY_SIZE(rt700_dai)); + } else if (driver_data == 2) { + ret = devm_snd_soc_register_component(dev, + &soc_component_dev_rt700_2, + rt700_2_dai, ARRAY_SIZE(rt700_2_dai)); + } +#endif dev_info(&slave->dev, "%s\n", __func__); /* Enable clock before setting */ diff --git a/sound/soc/codecs/rt700.h b/sound/soc/codecs/rt700.h index 3ad8b84f60f7..bcfb86340112 100644 --- a/sound/soc/codecs/rt700.h +++ b/sound/soc/codecs/rt700.h @@ -152,7 +152,8 @@ enum { }; int rt700_probe(struct device *dev, struct regmap *regmap, - struct sdw_slave *slave); + struct sdw_slv *slave, + kernel_ulong_t driver_data); int rt700_remove(struct device *dev); int hda_to_sdw(unsigned int nid, unsigned int verb, unsigned int payload, unsigned int *sdw_addr_h, unsigned int *sdw_data_h, -- https://clearlinux.org