370 lines
12 KiB
Diff
370 lines
12 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: "Jayanti, Satya Charitardha" <satya.charitardha.jayanti@intel.com>
|
|
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 <satya.charitardha.jayanti@intel.com>
|
|
Reviewed-on:
|
|
Reviewed-by: Babu, Ramesh <ramesh.babu@intel.com>
|
|
Reviewed-by: D M, Karthik <karthik.d.m@intel.com>
|
|
Reviewed-by: Diwakar, Praveen <praveen.diwakar@intel.com>
|
|
Tested-by: Avati, Santosh Kumar <santosh.kumar.avati@intel.com>
|
|
---
|
|
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
|
|
|