clear-pkgs-linux-iot-lts2018/0295-ASoC-rt700-codec-chang...

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