ASoC: Updates for v3.20
Nothing too exciting here yet, a small optimization for DAPM from Lars-Peter and a few small bits and pieces for drivers but nothing that really stands out. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJUoX40AAoJECTWi3JdVIfQCHkH/20AXx65DLEvKjtKJTbhE25j XSmN3ZtXuEdzg70rG1E2YZsZofxRWShX7HHyCwmepWfe30o+V4UCR+4HyHIWVLF6 O3TpupfcQ9ACP+/jQQxxySnTld6LJqW7rNXpxTVGeaba82uDtKIVgv/gHoUtEBDi NfG0RoVcfpb0k52LWzijIDx4YxVCuIkPHLFqBP63S92XNgw7bc8zjMl65ayY43M+ obfD0ISIdEudmkyqNrQzuNtxl14wsYjzQ5VYqltW5kLaEQVtmD8Zp1bOVI3m0xhX KY8zQnUUwA4+Cxs8aAm/NvczAZ/GyEQSIjTdUQZDXm0k6H81eya108SfxGvaMYI= =DSaV -----END PGP SIGNATURE----- Merge tag 'asoc-v3.19-rc2' into asoc-linus ASoC: Updates for v3.20 Nothing too exciting here yet, a small optimization for DAPM from Lars-Peter and a few small bits and pieces for drivers but nothing that really stands out. # gpg: Signature made Tue 30 Dec 2014 00:15:48 HKT using RSA key ID 5D5487D0 # gpg: Oops: keyid_from_fingerprint: no pubkey # gpg: key AF88CD16: no public key for trusted key - skipped # gpg: key AF88CD16 marked as ultimately trusted # gpg: key 5621E907: no public key for trusted key - skipped # gpg: key 5621E907 marked as ultimately trusted # gpg: Good signature from "Mark Brown <broonie@sirena.org.uk>" # gpg: aka "Mark Brown <broonie@debian.org>" # gpg: aka "Mark Brown <broonie@kernel.org>" # gpg: aka "Mark Brown <broonie@tardis.ed.ac.uk>" # gpg: aka "Mark Brown <broonie@linaro.org>" # gpg: aka "Mark Brown <Mark.Brown@linaro.org>"
This commit is contained in:
commit
b34510b70d
20 changed files with 297 additions and 170 deletions
|
@ -5,7 +5,8 @@ on the board).
|
|||
|
||||
Required properties:
|
||||
|
||||
- compatible : One of "ti,pcm5121" or "ti,pcm5122"
|
||||
- compatible : One of "ti,pcm5121", "ti,pcm5122", "ti,pcm5141" or
|
||||
"ti,pcm5142"
|
||||
|
||||
- reg : the I2C address of the device for I2C, the chip select
|
||||
number for SPI.
|
||||
|
|
|
@ -431,7 +431,6 @@ int snd_soc_dapm_force_enable_pin_unlocked(struct snd_soc_dapm_context *dapm,
|
|||
const char *pin);
|
||||
int snd_soc_dapm_ignore_suspend(struct snd_soc_dapm_context *dapm,
|
||||
const char *pin);
|
||||
void snd_soc_dapm_auto_nc_pins(struct snd_soc_card *card);
|
||||
unsigned int dapm_kcontrol_get_value(const struct snd_kcontrol *kcontrol);
|
||||
|
||||
/* Mostly internal - should not normally be used */
|
||||
|
|
|
@ -46,6 +46,8 @@ static int pcm512x_i2c_remove(struct i2c_client *i2c)
|
|||
static const struct i2c_device_id pcm512x_i2c_id[] = {
|
||||
{ "pcm5121", },
|
||||
{ "pcm5122", },
|
||||
{ "pcm5141", },
|
||||
{ "pcm5142", },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, pcm512x_i2c_id);
|
||||
|
@ -53,6 +55,8 @@ MODULE_DEVICE_TABLE(i2c, pcm512x_i2c_id);
|
|||
static const struct of_device_id pcm512x_of_match[] = {
|
||||
{ .compatible = "ti,pcm5121", },
|
||||
{ .compatible = "ti,pcm5122", },
|
||||
{ .compatible = "ti,pcm5141", },
|
||||
{ .compatible = "ti,pcm5142", },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, pcm512x_of_match);
|
||||
|
|
|
@ -43,6 +43,8 @@ static int pcm512x_spi_remove(struct spi_device *spi)
|
|||
static const struct spi_device_id pcm512x_spi_id[] = {
|
||||
{ "pcm5121", },
|
||||
{ "pcm5122", },
|
||||
{ "pcm5141", },
|
||||
{ "pcm5142", },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(spi, pcm512x_spi_id);
|
||||
|
@ -50,6 +52,8 @@ MODULE_DEVICE_TABLE(spi, pcm512x_spi_id);
|
|||
static const struct of_device_id pcm512x_of_match[] = {
|
||||
{ .compatible = "ti,pcm5121", },
|
||||
{ .compatible = "ti,pcm5122", },
|
||||
{ .compatible = "ti,pcm5141", },
|
||||
{ .compatible = "ti,pcm5142", },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, pcm512x_of_match);
|
||||
|
|
|
@ -14,10 +14,12 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <sound/core.h>
|
||||
#include <sound/pcm.h>
|
||||
#include <sound/pcm_params.h>
|
||||
|
@ -2188,6 +2190,13 @@ static int rt5670_set_dai_sysclk(struct snd_soc_dai *dai,
|
|||
if (freq == rt5670->sysclk && clk_id == rt5670->sysclk_src)
|
||||
return 0;
|
||||
|
||||
if (rt5670->pdata.jd_mode) {
|
||||
if (clk_id == RT5670_SCLK_S_PLL1)
|
||||
snd_soc_dapm_force_enable_pin(&codec->dapm, "PLL1");
|
||||
else
|
||||
snd_soc_dapm_disable_pin(&codec->dapm, "PLL1");
|
||||
snd_soc_dapm_sync(&codec->dapm);
|
||||
}
|
||||
switch (clk_id) {
|
||||
case RT5670_SCLK_S_MCLK:
|
||||
reg_val |= RT5670_SCLK_SRC_MCLK;
|
||||
|
@ -2549,6 +2558,17 @@ static struct acpi_device_id rt5670_acpi_match[] = {
|
|||
MODULE_DEVICE_TABLE(acpi, rt5670_acpi_match);
|
||||
#endif
|
||||
|
||||
static const struct dmi_system_id dmi_platform_intel_braswell[] = {
|
||||
{
|
||||
.ident = "Intel Braswell",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Intel Corporation"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "Braswell CRB"),
|
||||
},
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
static int rt5670_i2c_probe(struct i2c_client *i2c,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
|
@ -2568,6 +2588,12 @@ static int rt5670_i2c_probe(struct i2c_client *i2c,
|
|||
if (pdata)
|
||||
rt5670->pdata = *pdata;
|
||||
|
||||
if (dmi_check_system(dmi_platform_intel_braswell)) {
|
||||
rt5670->pdata.dmic_en = true;
|
||||
rt5670->pdata.dmic1_data_pin = RT5670_DMIC_DATA_IN2P;
|
||||
rt5670->pdata.jd_mode = 1;
|
||||
}
|
||||
|
||||
rt5670->regmap = devm_regmap_init_i2c(i2c, &rt5670_regmap);
|
||||
if (IS_ERR(rt5670->regmap)) {
|
||||
ret = PTR_ERR(rt5670->regmap);
|
||||
|
@ -2609,6 +2635,10 @@ static int rt5670_i2c_probe(struct i2c_client *i2c,
|
|||
}
|
||||
|
||||
if (rt5670->pdata.jd_mode) {
|
||||
regmap_update_bits(rt5670->regmap, RT5670_GLB_CLK,
|
||||
RT5670_SCLK_SRC_MASK, RT5670_SCLK_SRC_RCCLK);
|
||||
rt5670->sysclk = 0;
|
||||
rt5670->sysclk_src = RT5670_SCLK_S_RCCLK;
|
||||
regmap_update_bits(rt5670->regmap, RT5670_PWR_ANLG1,
|
||||
RT5670_PWR_MB, RT5670_PWR_MB);
|
||||
regmap_update_bits(rt5670->regmap, RT5670_PWR_ANLG2,
|
||||
|
@ -2716,18 +2746,26 @@ static int rt5670_i2c_probe(struct i2c_client *i2c,
|
|||
|
||||
}
|
||||
|
||||
pm_runtime_enable(&i2c->dev);
|
||||
pm_request_idle(&i2c->dev);
|
||||
|
||||
ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5670,
|
||||
rt5670_dai, ARRAY_SIZE(rt5670_dai));
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
|
||||
pm_runtime_put(&i2c->dev);
|
||||
|
||||
return 0;
|
||||
err:
|
||||
pm_runtime_disable(&i2c->dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int rt5670_i2c_remove(struct i2c_client *i2c)
|
||||
{
|
||||
pm_runtime_disable(&i2c->dev);
|
||||
snd_soc_unregister_codec(&i2c->dev);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -922,6 +922,97 @@ static int is_sys_clk_from_pll(struct snd_soc_dapm_widget *source,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int is_using_asrc(struct snd_soc_dapm_widget *source,
|
||||
struct snd_soc_dapm_widget *sink)
|
||||
{
|
||||
unsigned int reg, shift, val;
|
||||
|
||||
if (source->reg == RT5677_ASRC_1) {
|
||||
switch (source->shift) {
|
||||
case 12:
|
||||
reg = RT5677_ASRC_4;
|
||||
shift = 0;
|
||||
break;
|
||||
case 13:
|
||||
reg = RT5677_ASRC_4;
|
||||
shift = 4;
|
||||
break;
|
||||
case 14:
|
||||
reg = RT5677_ASRC_4;
|
||||
shift = 8;
|
||||
break;
|
||||
case 15:
|
||||
reg = RT5677_ASRC_4;
|
||||
shift = 12;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
switch (source->shift) {
|
||||
case 0:
|
||||
reg = RT5677_ASRC_6;
|
||||
shift = 8;
|
||||
break;
|
||||
case 1:
|
||||
reg = RT5677_ASRC_6;
|
||||
shift = 12;
|
||||
break;
|
||||
case 2:
|
||||
reg = RT5677_ASRC_5;
|
||||
shift = 0;
|
||||
break;
|
||||
case 3:
|
||||
reg = RT5677_ASRC_5;
|
||||
shift = 4;
|
||||
break;
|
||||
case 4:
|
||||
reg = RT5677_ASRC_5;
|
||||
shift = 8;
|
||||
break;
|
||||
case 5:
|
||||
reg = RT5677_ASRC_5;
|
||||
shift = 12;
|
||||
break;
|
||||
case 12:
|
||||
reg = RT5677_ASRC_3;
|
||||
shift = 0;
|
||||
break;
|
||||
case 13:
|
||||
reg = RT5677_ASRC_3;
|
||||
shift = 4;
|
||||
break;
|
||||
case 14:
|
||||
reg = RT5677_ASRC_3;
|
||||
shift = 12;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
val = (snd_soc_read(source->codec, reg) >> shift) & 0xf;
|
||||
switch (val) {
|
||||
case 1 ... 6:
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static int can_use_asrc(struct snd_soc_dapm_widget *source,
|
||||
struct snd_soc_dapm_widget *sink)
|
||||
{
|
||||
struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm);
|
||||
struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec);
|
||||
|
||||
if (rt5677->sysclk > rt5677->lrck[RT5677_AIF1] * 384)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Digital Mixer */
|
||||
static const struct snd_kcontrol_new rt5677_sto1_adc_l_mix[] = {
|
||||
SOC_DAPM_SINGLE("ADC1 Switch", RT5677_STO1_ADC_MIXER,
|
||||
|
@ -2226,6 +2317,45 @@ static const struct snd_soc_dapm_widget rt5677_dapm_widgets[] = {
|
|||
0, rt5677_set_pll2_event, SND_SOC_DAPM_PRE_PMU |
|
||||
SND_SOC_DAPM_POST_PMU),
|
||||
|
||||
/* ASRC */
|
||||
SND_SOC_DAPM_SUPPLY_S("I2S1 ASRC", 1, RT5677_ASRC_1, 0, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY_S("I2S2 ASRC", 1, RT5677_ASRC_1, 1, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY_S("I2S3 ASRC", 1, RT5677_ASRC_1, 2, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY_S("I2S4 ASRC", 1, RT5677_ASRC_1, 3, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY_S("DAC STO ASRC", 1, RT5677_ASRC_2, 14, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY_S("DAC MONO2 L ASRC", 1, RT5677_ASRC_2, 13, 0, NULL,
|
||||
0),
|
||||
SND_SOC_DAPM_SUPPLY_S("DAC MONO2 R ASRC", 1, RT5677_ASRC_2, 12, 0, NULL,
|
||||
0),
|
||||
SND_SOC_DAPM_SUPPLY_S("DAC MONO3 L ASRC", 1, RT5677_ASRC_1, 15, 0, NULL,
|
||||
0),
|
||||
SND_SOC_DAPM_SUPPLY_S("DAC MONO3 R ASRC", 1, RT5677_ASRC_1, 14, 0, NULL,
|
||||
0),
|
||||
SND_SOC_DAPM_SUPPLY_S("DAC MONO4 L ASRC", 1, RT5677_ASRC_1, 13, 0, NULL,
|
||||
0),
|
||||
SND_SOC_DAPM_SUPPLY_S("DAC MONO4 R ASRC", 1, RT5677_ASRC_1, 12, 0, NULL,
|
||||
0),
|
||||
SND_SOC_DAPM_SUPPLY_S("DMIC STO1 ASRC", 1, RT5677_ASRC_2, 11, 0, NULL,
|
||||
0),
|
||||
SND_SOC_DAPM_SUPPLY_S("DMIC STO2 ASRC", 1, RT5677_ASRC_2, 10, 0, NULL,
|
||||
0),
|
||||
SND_SOC_DAPM_SUPPLY_S("DMIC STO3 ASRC", 1, RT5677_ASRC_2, 9, 0, NULL,
|
||||
0),
|
||||
SND_SOC_DAPM_SUPPLY_S("DMIC STO4 ASRC", 1, RT5677_ASRC_2, 8, 0, NULL,
|
||||
0),
|
||||
SND_SOC_DAPM_SUPPLY_S("DMIC MONO L ASRC", 1, RT5677_ASRC_2, 7, 0, NULL,
|
||||
0),
|
||||
SND_SOC_DAPM_SUPPLY_S("DMIC MONO R ASRC", 1, RT5677_ASRC_2, 6, 0, NULL,
|
||||
0),
|
||||
SND_SOC_DAPM_SUPPLY_S("ADC STO1 ASRC", 1, RT5677_ASRC_2, 5, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY_S("ADC STO2 ASRC", 1, RT5677_ASRC_2, 4, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY_S("ADC STO3 ASRC", 1, RT5677_ASRC_2, 3, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY_S("ADC STO4 ASRC", 1, RT5677_ASRC_2, 2, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY_S("ADC MONO L ASRC", 1, RT5677_ASRC_2, 1, 0, NULL,
|
||||
0),
|
||||
SND_SOC_DAPM_SUPPLY_S("ADC MONO R ASRC", 1, RT5677_ASRC_2, 0, 0, NULL,
|
||||
0),
|
||||
|
||||
/* Input Side */
|
||||
/* micbias */
|
||||
SND_SOC_DAPM_SUPPLY("MICBIAS1", RT5677_PWR_ANLG2, RT5677_PWR_MB1_BIT,
|
||||
|
@ -2656,10 +2786,18 @@ static const struct snd_soc_dapm_widget rt5677_dapm_widgets[] = {
|
|||
/* DAC Mixer */
|
||||
SND_SOC_DAPM_SUPPLY("dac stereo1 filter", RT5677_PWR_DIG2,
|
||||
RT5677_PWR_DAC_S1F_BIT, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY("dac mono left filter", RT5677_PWR_DIG2,
|
||||
SND_SOC_DAPM_SUPPLY("dac mono2 left filter", RT5677_PWR_DIG2,
|
||||
RT5677_PWR_DAC_M2F_L_BIT, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY("dac mono right filter", RT5677_PWR_DIG2,
|
||||
SND_SOC_DAPM_SUPPLY("dac mono2 right filter", RT5677_PWR_DIG2,
|
||||
RT5677_PWR_DAC_M2F_R_BIT, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY("dac mono3 left filter", RT5677_PWR_DIG2,
|
||||
RT5677_PWR_DAC_M3F_L_BIT, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY("dac mono3 right filter", RT5677_PWR_DIG2,
|
||||
RT5677_PWR_DAC_M3F_R_BIT, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY("dac mono4 left filter", RT5677_PWR_DIG2,
|
||||
RT5677_PWR_DAC_M4F_L_BIT, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY("dac mono4 right filter", RT5677_PWR_DIG2,
|
||||
RT5677_PWR_DAC_M4F_R_BIT, 0, NULL, 0),
|
||||
|
||||
SND_SOC_DAPM_MIXER("Stereo DAC MIXL", SND_SOC_NOPM, 0, 0,
|
||||
rt5677_sto1_dac_l_mix, ARRAY_SIZE(rt5677_sto1_dac_l_mix)),
|
||||
|
@ -2732,6 +2870,31 @@ static const struct snd_soc_dapm_widget rt5677_dapm_widgets[] = {
|
|||
};
|
||||
|
||||
static const struct snd_soc_dapm_route rt5677_dapm_routes[] = {
|
||||
{ "Stereo1 DMIC Mux", NULL, "DMIC STO1 ASRC", can_use_asrc },
|
||||
{ "Stereo2 DMIC Mux", NULL, "DMIC STO2 ASRC", can_use_asrc },
|
||||
{ "Stereo3 DMIC Mux", NULL, "DMIC STO3 ASRC", can_use_asrc },
|
||||
{ "Stereo4 DMIC Mux", NULL, "DMIC STO4 ASRC", can_use_asrc },
|
||||
{ "Mono DMIC L Mux", NULL, "DMIC MONO L ASRC", can_use_asrc },
|
||||
{ "Mono DMIC R Mux", NULL, "DMIC MONO R ASRC", can_use_asrc },
|
||||
{ "I2S1", NULL, "I2S1 ASRC", can_use_asrc},
|
||||
{ "I2S2", NULL, "I2S2 ASRC", can_use_asrc},
|
||||
{ "I2S3", NULL, "I2S3 ASRC", can_use_asrc},
|
||||
{ "I2S4", NULL, "I2S4 ASRC", can_use_asrc},
|
||||
|
||||
{ "dac stereo1 filter", NULL, "DAC STO ASRC", is_using_asrc },
|
||||
{ "dac mono2 left filter", NULL, "DAC MONO2 L ASRC", is_using_asrc },
|
||||
{ "dac mono2 right filter", NULL, "DAC MONO2 R ASRC", is_using_asrc },
|
||||
{ "dac mono3 left filter", NULL, "DAC MONO3 L ASRC", is_using_asrc },
|
||||
{ "dac mono3 right filter", NULL, "DAC MONO3 R ASRC", is_using_asrc },
|
||||
{ "dac mono4 left filter", NULL, "DAC MONO4 L ASRC", is_using_asrc },
|
||||
{ "dac mono4 right filter", NULL, "DAC MONO4 R ASRC", is_using_asrc },
|
||||
{ "adc stereo1 filter", NULL, "ADC STO1 ASRC", is_using_asrc },
|
||||
{ "adc stereo2 filter", NULL, "ADC STO2 ASRC", is_using_asrc },
|
||||
{ "adc stereo3 filter", NULL, "ADC STO3 ASRC", is_using_asrc },
|
||||
{ "adc stereo4 filter", NULL, "ADC STO4 ASRC", is_using_asrc },
|
||||
{ "adc mono left filter", NULL, "ADC MONO L ASRC", is_using_asrc },
|
||||
{ "adc mono right filter", NULL, "ADC MONO R ASRC", is_using_asrc },
|
||||
|
||||
{ "DMIC1", NULL, "DMIC L1" },
|
||||
{ "DMIC1", NULL, "DMIC R1" },
|
||||
{ "DMIC2", NULL, "DMIC L2" },
|
||||
|
@ -2862,8 +3025,6 @@ static const struct snd_soc_dapm_route rt5677_dapm_routes[] = {
|
|||
|
||||
{ "Stereo1 ADC MIXL", NULL, "Sto1 ADC MIXL" },
|
||||
{ "Stereo1 ADC MIXL", NULL, "adc stereo1 filter" },
|
||||
{ "adc stereo1 filter", NULL, "PLL1", is_sys_clk_from_pll },
|
||||
|
||||
{ "Stereo1 ADC MIXR", NULL, "Sto1 ADC MIXR" },
|
||||
{ "Stereo1 ADC MIXR", NULL, "adc stereo1 filter" },
|
||||
{ "adc stereo1 filter", NULL, "PLL1", is_sys_clk_from_pll },
|
||||
|
@ -2884,8 +3045,6 @@ static const struct snd_soc_dapm_route rt5677_dapm_routes[] = {
|
|||
|
||||
{ "Stereo2 ADC MIXL", NULL, "Stereo2 ADC LR Mux" },
|
||||
{ "Stereo2 ADC MIXL", NULL, "adc stereo2 filter" },
|
||||
{ "adc stereo2 filter", NULL, "PLL1", is_sys_clk_from_pll },
|
||||
|
||||
{ "Stereo2 ADC MIXR", NULL, "Sto2 ADC MIXR" },
|
||||
{ "Stereo2 ADC MIXR", NULL, "adc stereo2 filter" },
|
||||
{ "adc stereo2 filter", NULL, "PLL1", is_sys_clk_from_pll },
|
||||
|
@ -2900,8 +3059,6 @@ static const struct snd_soc_dapm_route rt5677_dapm_routes[] = {
|
|||
|
||||
{ "Stereo3 ADC MIXL", NULL, "Sto3 ADC MIXL" },
|
||||
{ "Stereo3 ADC MIXL", NULL, "adc stereo3 filter" },
|
||||
{ "adc stereo3 filter", NULL, "PLL1", is_sys_clk_from_pll },
|
||||
|
||||
{ "Stereo3 ADC MIXR", NULL, "Sto3 ADC MIXR" },
|
||||
{ "Stereo3 ADC MIXR", NULL, "adc stereo3 filter" },
|
||||
{ "adc stereo3 filter", NULL, "PLL1", is_sys_clk_from_pll },
|
||||
|
@ -2916,8 +3073,6 @@ static const struct snd_soc_dapm_route rt5677_dapm_routes[] = {
|
|||
|
||||
{ "Stereo4 ADC MIXL", NULL, "Sto4 ADC MIXL" },
|
||||
{ "Stereo4 ADC MIXL", NULL, "adc stereo4 filter" },
|
||||
{ "adc stereo4 filter", NULL, "PLL1", is_sys_clk_from_pll },
|
||||
|
||||
{ "Stereo4 ADC MIXR", NULL, "Sto4 ADC MIXR" },
|
||||
{ "Stereo4 ADC MIXR", NULL, "adc stereo4 filter" },
|
||||
{ "adc stereo4 filter", NULL, "PLL1", is_sys_clk_from_pll },
|
||||
|
@ -3466,10 +3621,8 @@ static const struct snd_soc_dapm_route rt5677_dapm_routes[] = {
|
|||
|
||||
{ "DAC1 MIXL", "Stereo ADC Switch", "ADDA1 Mux" },
|
||||
{ "DAC1 MIXL", "DAC1 Switch", "DAC1 Mux" },
|
||||
{ "DAC1 MIXL", NULL, "dac stereo1 filter" },
|
||||
{ "DAC1 MIXR", "Stereo ADC Switch", "ADDA1 Mux" },
|
||||
{ "DAC1 MIXR", "DAC1 Switch", "DAC1 Mux" },
|
||||
{ "DAC1 MIXR", NULL, "dac stereo1 filter" },
|
||||
|
||||
{ "DAC1 FS", NULL, "DAC1 MIXL" },
|
||||
{ "DAC1 FS", NULL, "DAC1 MIXR" },
|
||||
|
@ -3536,35 +3689,46 @@ static const struct snd_soc_dapm_route rt5677_dapm_routes[] = {
|
|||
{ "Stereo DAC MIXR", "DAC2 R Switch", "DAC2 R Mux" },
|
||||
{ "Stereo DAC MIXR", "DAC1 L Switch", "DAC1 MIXL" },
|
||||
{ "Stereo DAC MIXR", NULL, "dac stereo1 filter" },
|
||||
{ "dac stereo1 filter", NULL, "PLL1", is_sys_clk_from_pll },
|
||||
|
||||
{ "Mono DAC MIXL", "ST L Switch", "Sidetone Mux" },
|
||||
{ "Mono DAC MIXL", "DAC1 L Switch", "DAC1 MIXL" },
|
||||
{ "Mono DAC MIXL", "DAC2 L Switch", "DAC2 L Mux" },
|
||||
{ "Mono DAC MIXL", "DAC2 R Switch", "DAC2 R Mux" },
|
||||
{ "Mono DAC MIXL", NULL, "dac mono left filter" },
|
||||
{ "Mono DAC MIXL", NULL, "dac mono2 left filter" },
|
||||
{ "dac mono2 left filter", NULL, "PLL1", is_sys_clk_from_pll },
|
||||
{ "Mono DAC MIXR", "ST R Switch", "Sidetone Mux" },
|
||||
{ "Mono DAC MIXR", "DAC1 R Switch", "DAC1 MIXR" },
|
||||
{ "Mono DAC MIXR", "DAC2 R Switch", "DAC2 R Mux" },
|
||||
{ "Mono DAC MIXR", "DAC2 L Switch", "DAC2 L Mux" },
|
||||
{ "Mono DAC MIXR", NULL, "dac mono right filter" },
|
||||
{ "Mono DAC MIXR", NULL, "dac mono2 right filter" },
|
||||
{ "dac mono2 right filter", NULL, "PLL1", is_sys_clk_from_pll },
|
||||
|
||||
{ "DD1 MIXL", "Sto DAC Mix L Switch", "Stereo DAC MIXL" },
|
||||
{ "DD1 MIXL", "Mono DAC Mix L Switch", "Mono DAC MIXL" },
|
||||
{ "DD1 MIXL", "DAC3 L Switch", "DAC3 L Mux" },
|
||||
{ "DD1 MIXL", "DAC3 R Switch", "DAC3 R Mux" },
|
||||
{ "DD1 MIXL", NULL, "dac mono3 left filter" },
|
||||
{ "dac mono3 left filter", NULL, "PLL1", is_sys_clk_from_pll },
|
||||
{ "DD1 MIXR", "Sto DAC Mix R Switch", "Stereo DAC MIXR" },
|
||||
{ "DD1 MIXR", "Mono DAC Mix R Switch", "Mono DAC MIXR" },
|
||||
{ "DD1 MIXR", "DAC3 L Switch", "DAC3 L Mux" },
|
||||
{ "DD1 MIXR", "DAC3 R Switch", "DAC3 R Mux" },
|
||||
{ "DD1 MIXR", NULL, "dac mono3 right filter" },
|
||||
{ "dac mono3 right filter", NULL, "PLL1", is_sys_clk_from_pll },
|
||||
|
||||
{ "DD2 MIXL", "Sto DAC Mix L Switch", "Stereo DAC MIXL" },
|
||||
{ "DD2 MIXL", "Mono DAC Mix L Switch", "Mono DAC MIXL" },
|
||||
{ "DD2 MIXL", "DAC4 L Switch", "DAC4 L Mux" },
|
||||
{ "DD2 MIXL", "DAC4 R Switch", "DAC4 R Mux" },
|
||||
{ "DD2 MIXL", NULL, "dac mono4 left filter" },
|
||||
{ "dac mono4 left filter", NULL, "PLL1", is_sys_clk_from_pll },
|
||||
{ "DD2 MIXR", "Sto DAC Mix R Switch", "Stereo DAC MIXR" },
|
||||
{ "DD2 MIXR", "Mono DAC Mix R Switch", "Mono DAC MIXR" },
|
||||
{ "DD2 MIXR", "DAC4 L Switch", "DAC4 L Mux" },
|
||||
{ "DD2 MIXR", "DAC4 R Switch", "DAC4 R Mux" },
|
||||
{ "DD2 MIXR", NULL, "dac mono4 right filter" },
|
||||
{ "dac mono4 right filter", NULL, "PLL1", is_sys_clk_from_pll },
|
||||
|
||||
{ "Stereo DAC MIX", NULL, "Stereo DAC MIXL" },
|
||||
{ "Stereo DAC MIX", NULL, "Stereo DAC MIXR" },
|
||||
|
@ -3586,11 +3750,8 @@ static const struct snd_soc_dapm_route rt5677_dapm_routes[] = {
|
|||
{ "DAC3 SRC Mux", "DD MIX2L", "DD2 MIXL" },
|
||||
|
||||
{ "DAC 1", NULL, "DAC12 SRC Mux" },
|
||||
{ "DAC 1", NULL, "PLL1", is_sys_clk_from_pll },
|
||||
{ "DAC 2", NULL, "DAC12 SRC Mux" },
|
||||
{ "DAC 2", NULL, "PLL1", is_sys_clk_from_pll },
|
||||
{ "DAC 3", NULL, "DAC3 SRC Mux" },
|
||||
{ "DAC 3", NULL, "PLL1", is_sys_clk_from_pll },
|
||||
|
||||
{ "PDM1 L Mux", "STO1 DAC MIX", "Stereo DAC MIXL" },
|
||||
{ "PDM1 L Mux", "MONO DAC MIX", "Mono DAC MIXL" },
|
||||
|
|
|
@ -323,7 +323,7 @@ static const struct snd_soc_dapm_widget wm8750_dapm_widgets[] = {
|
|||
SND_SOC_DAPM_OUTPUT("ROUT2"),
|
||||
SND_SOC_DAPM_OUTPUT("MONO1"),
|
||||
SND_SOC_DAPM_OUTPUT("OUT3"),
|
||||
SND_SOC_DAPM_OUTPUT("VREF"),
|
||||
SND_SOC_DAPM_VMID("VREF"),
|
||||
|
||||
SND_SOC_DAPM_INPUT("LINPUT1"),
|
||||
SND_SOC_DAPM_INPUT("LINPUT2"),
|
||||
|
|
|
@ -335,13 +335,47 @@ static int dw_i2s_resume(struct snd_soc_dai *dai)
|
|||
#define dw_i2s_resume NULL
|
||||
#endif
|
||||
|
||||
static void dw_configure_dai_by_pd(struct dw_i2s_dev *dev,
|
||||
struct snd_soc_dai_driver *dw_i2s_dai,
|
||||
struct resource *res,
|
||||
const struct i2s_platform_data *pdata)
|
||||
{
|
||||
/* Set DMA slaves info */
|
||||
|
||||
dev->play_dma_data.data = pdata->play_dma_data;
|
||||
dev->capture_dma_data.data = pdata->capture_dma_data;
|
||||
dev->play_dma_data.addr = res->start + I2S_TXDMA;
|
||||
dev->capture_dma_data.addr = res->start + I2S_RXDMA;
|
||||
dev->play_dma_data.max_burst = 16;
|
||||
dev->capture_dma_data.max_burst = 16;
|
||||
dev->play_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;
|
||||
dev->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;
|
||||
dev->play_dma_data.filter = pdata->filter;
|
||||
dev->capture_dma_data.filter = pdata->filter;
|
||||
|
||||
if (pdata->cap & DWC_I2S_PLAY) {
|
||||
dev_dbg(dev->dev, " designware: play supported\n");
|
||||
dw_i2s_dai->playback.channels_min = MIN_CHANNEL_NUM;
|
||||
dw_i2s_dai->playback.channels_max = pdata->channel;
|
||||
dw_i2s_dai->playback.formats = pdata->snd_fmts;
|
||||
dw_i2s_dai->playback.rates = pdata->snd_rates;
|
||||
}
|
||||
|
||||
if (pdata->cap & DWC_I2S_RECORD) {
|
||||
dev_dbg(dev->dev, "designware: record supported\n");
|
||||
dw_i2s_dai->capture.channels_min = MIN_CHANNEL_NUM;
|
||||
dw_i2s_dai->capture.channels_max = pdata->channel;
|
||||
dw_i2s_dai->capture.formats = pdata->snd_fmts;
|
||||
dw_i2s_dai->capture.rates = pdata->snd_rates;
|
||||
}
|
||||
}
|
||||
|
||||
static int dw_i2s_probe(struct platform_device *pdev)
|
||||
{
|
||||
const struct i2s_platform_data *pdata = pdev->dev.platform_data;
|
||||
struct dw_i2s_dev *dev;
|
||||
struct resource *res;
|
||||
int ret;
|
||||
unsigned int cap;
|
||||
struct snd_soc_dai_driver *dw_i2s_dai;
|
||||
|
||||
if (!pdata) {
|
||||
|
@ -356,44 +390,23 @@ static int dw_i2s_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
dw_i2s_dai = devm_kzalloc(&pdev->dev, sizeof(*dw_i2s_dai), GFP_KERNEL);
|
||||
if (!dw_i2s_dai) {
|
||||
dev_err(&pdev->dev, "mem allocation failed for dai driver\n");
|
||||
if (!dw_i2s_dai)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
dw_i2s_dai->ops = &dw_i2s_dai_ops;
|
||||
dw_i2s_dai->suspend = dw_i2s_suspend;
|
||||
dw_i2s_dai->resume = dw_i2s_resume;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (!res) {
|
||||
dev_err(&pdev->dev, "no i2s resource defined\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
dev->i2s_base = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(dev->i2s_base)) {
|
||||
dev_err(&pdev->dev, "ioremap fail for i2s_region\n");
|
||||
if (IS_ERR(dev->i2s_base))
|
||||
return PTR_ERR(dev->i2s_base);
|
||||
}
|
||||
|
||||
cap = pdata->cap;
|
||||
dev->capability = cap;
|
||||
dev->dev = &pdev->dev;
|
||||
dw_configure_dai_by_pd(dev, dw_i2s_dai, res, pdata);
|
||||
|
||||
dev->capability = pdata->cap;
|
||||
dev->i2s_clk_cfg = pdata->i2s_clk_cfg;
|
||||
|
||||
/* Set DMA slaves info */
|
||||
|
||||
dev->play_dma_data.data = pdata->play_dma_data;
|
||||
dev->capture_dma_data.data = pdata->capture_dma_data;
|
||||
dev->play_dma_data.addr = res->start + I2S_TXDMA;
|
||||
dev->capture_dma_data.addr = res->start + I2S_RXDMA;
|
||||
dev->play_dma_data.max_burst = 16;
|
||||
dev->capture_dma_data.max_burst = 16;
|
||||
dev->play_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;
|
||||
dev->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;
|
||||
dev->play_dma_data.filter = pdata->filter;
|
||||
dev->capture_dma_data.filter = pdata->filter;
|
||||
|
||||
dev->clk = clk_get(&pdev->dev, NULL);
|
||||
if (IS_ERR(dev->clk))
|
||||
return PTR_ERR(dev->clk);
|
||||
|
@ -402,23 +415,6 @@ static int dw_i2s_probe(struct platform_device *pdev)
|
|||
if (ret < 0)
|
||||
goto err_clk_put;
|
||||
|
||||
if (cap & DWC_I2S_PLAY) {
|
||||
dev_dbg(&pdev->dev, " designware: play supported\n");
|
||||
dw_i2s_dai->playback.channels_min = MIN_CHANNEL_NUM;
|
||||
dw_i2s_dai->playback.channels_max = pdata->channel;
|
||||
dw_i2s_dai->playback.formats = pdata->snd_fmts;
|
||||
dw_i2s_dai->playback.rates = pdata->snd_rates;
|
||||
}
|
||||
|
||||
if (cap & DWC_I2S_RECORD) {
|
||||
dev_dbg(&pdev->dev, "designware: record supported\n");
|
||||
dw_i2s_dai->capture.channels_min = MIN_CHANNEL_NUM;
|
||||
dw_i2s_dai->capture.channels_max = pdata->channel;
|
||||
dw_i2s_dai->capture.formats = pdata->snd_fmts;
|
||||
dw_i2s_dai->capture.rates = pdata->snd_rates;
|
||||
}
|
||||
|
||||
dev->dev = &pdev->dev;
|
||||
dev_set_drvdata(&pdev->dev, dev);
|
||||
ret = snd_soc_register_component(&pdev->dev, &dw_i2s_component,
|
||||
dw_i2s_dai, 1);
|
||||
|
|
|
@ -46,7 +46,7 @@ config SND_SOC_INTEL_BAYTRAIL
|
|||
|
||||
config SND_SOC_INTEL_HASWELL_MACH
|
||||
tristate "ASoC Audio DSP support for Intel Haswell Lynxpoint"
|
||||
depends on SND_SOC_INTEL_SST && X86_INTEL_LPSS && I2C && \\
|
||||
depends on SND_SOC_INTEL_SST && X86_INTEL_LPSS && I2C && \
|
||||
I2C_DESIGNWARE_PLATFORM
|
||||
select SND_SOC_INTEL_HASWELL
|
||||
select SND_SOC_RT5640
|
||||
|
@ -76,7 +76,7 @@ config SND_SOC_INTEL_BYT_MAX98090_MACH
|
|||
|
||||
config SND_SOC_INTEL_BROADWELL_MACH
|
||||
tristate "ASoC Audio DSP support for Intel Broadwell Wildcatpoint"
|
||||
depends on SND_SOC_INTEL_SST && X86_INTEL_LPSS && DW_DMAC && \\
|
||||
depends on SND_SOC_INTEL_SST && X86_INTEL_LPSS && DW_DMAC && \
|
||||
I2C_DESIGNWARE_PLATFORM
|
||||
select SND_SOC_INTEL_HASWELL
|
||||
select SND_COMPRESS_OFFLOAD
|
||||
|
|
|
@ -215,7 +215,6 @@ static int snd_byt_mc_probe(struct platform_device *pdev)
|
|||
|
||||
static struct platform_driver snd_byt_mc_driver = {
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "bytt100_rt5640",
|
||||
.pm = &snd_soc_pm_ops,
|
||||
},
|
||||
|
|
|
@ -270,7 +270,6 @@ static int snd_cht_mc_probe(struct platform_device *pdev)
|
|||
|
||||
static struct platform_driver snd_cht_mc_driver = {
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "cht-bsw-rt5672",
|
||||
.pm = &snd_soc_pm_ops,
|
||||
},
|
||||
|
|
|
@ -497,6 +497,7 @@ struct sst_module *sst_module_new(struct sst_fw *sst_fw,
|
|||
sst_module->sst_fw = sst_fw;
|
||||
sst_module->scratch_size = template->scratch_size;
|
||||
sst_module->persistent_size = template->persistent_size;
|
||||
sst_module->entry = template->entry;
|
||||
|
||||
INIT_LIST_HEAD(&sst_module->block_list);
|
||||
INIT_LIST_HEAD(&sst_module->runtime_list);
|
||||
|
|
|
@ -245,7 +245,7 @@ static struct sst_machines *sst_acpi_find_machine(
|
|||
return NULL;
|
||||
}
|
||||
|
||||
int sst_acpi_probe(struct platform_device *pdev)
|
||||
static int sst_acpi_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
int ret = 0;
|
||||
|
@ -332,7 +332,7 @@ int sst_acpi_probe(struct platform_device *pdev)
|
|||
* This function is called by OS when a device is unloaded
|
||||
* This frees the interrupt etc
|
||||
*/
|
||||
int sst_acpi_remove(struct platform_device *pdev)
|
||||
static int sst_acpi_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct intel_sst_drv *ctx;
|
||||
|
||||
|
@ -366,7 +366,6 @@ MODULE_DEVICE_TABLE(acpi, sst_acpi_ids);
|
|||
static struct platform_driver sst_acpi_driver = {
|
||||
.driver = {
|
||||
.name = "intel_sst_acpi",
|
||||
.owner = THIS_MODULE,
|
||||
.acpi_match_table = ACPI_PTR(sst_acpi_ids),
|
||||
.pm = &intel_sst_pm,
|
||||
},
|
||||
|
|
|
@ -393,7 +393,6 @@ static int omap_hdmi_audio_remove(struct platform_device *pdev)
|
|||
static struct platform_driver hdmi_audio_driver = {
|
||||
.driver = {
|
||||
.name = DRV_NAME,
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
.probe = omap_hdmi_audio_probe,
|
||||
.remove = omap_hdmi_audio_remove,
|
||||
|
|
|
@ -352,7 +352,6 @@ static int spitz_remove(struct platform_device *pdev)
|
|||
static struct platform_driver spitz_driver = {
|
||||
.driver = {
|
||||
.name = "spitz-audio",
|
||||
.owner = THIS_MODULE,
|
||||
.pm = &snd_soc_pm_ops,
|
||||
},
|
||||
.probe = spitz_probe,
|
||||
|
|
|
@ -247,6 +247,10 @@ static int rockchip_i2s_hw_params(struct snd_pcm_substream *substream,
|
|||
|
||||
regmap_update_bits(i2s->regmap, I2S_TXCR, I2S_TXCR_VDW_MASK, val);
|
||||
regmap_update_bits(i2s->regmap, I2S_RXCR, I2S_RXCR_VDW_MASK, val);
|
||||
regmap_update_bits(i2s->regmap, I2S_DMACR, I2S_DMACR_TDL_MASK,
|
||||
I2S_DMACR_TDL(16));
|
||||
regmap_update_bits(i2s->regmap, I2S_DMACR, I2S_DMACR_RDL_MASK,
|
||||
I2S_DMACR_RDL(16));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -135,7 +135,6 @@ MODULE_DEVICE_TABLE(of, samsung_arndale_rt5631_of_match);
|
|||
static struct platform_driver arndale_audio_driver = {
|
||||
.driver = {
|
||||
.name = "arndale-audio",
|
||||
.owner = THIS_MODULE,
|
||||
.pm = &snd_soc_pm_ops,
|
||||
.of_match_table = of_match_ptr(samsung_arndale_rt5631_of_match),
|
||||
},
|
||||
|
|
|
@ -1626,9 +1626,6 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card)
|
|||
}
|
||||
}
|
||||
|
||||
if (card->fully_routed)
|
||||
snd_soc_dapm_auto_nc_pins(card);
|
||||
|
||||
snd_soc_dapm_new_widgets(card);
|
||||
|
||||
ret = snd_card_register(card->snd_card);
|
||||
|
|
|
@ -2279,6 +2279,9 @@ static void dapm_update_widget_flags(struct snd_soc_dapm_widget *w)
|
|||
|
||||
switch (w->id) {
|
||||
case snd_soc_dapm_input:
|
||||
/* On a fully routed card a input is never a source */
|
||||
if (w->dapm->card->fully_routed)
|
||||
break;
|
||||
w->is_source = 1;
|
||||
list_for_each_entry(p, &w->sources, list_sink) {
|
||||
if (p->source->id == snd_soc_dapm_micbias ||
|
||||
|
@ -2291,6 +2294,9 @@ static void dapm_update_widget_flags(struct snd_soc_dapm_widget *w)
|
|||
}
|
||||
break;
|
||||
case snd_soc_dapm_output:
|
||||
/* On a fully routed card a output is never a sink */
|
||||
if (w->dapm->card->fully_routed)
|
||||
break;
|
||||
w->is_sink = 1;
|
||||
list_for_each_entry(p, &w->sinks, list_source) {
|
||||
if (p->sink->id == snd_soc_dapm_spk ||
|
||||
|
@ -3085,16 +3091,24 @@ snd_soc_dapm_new_control(struct snd_soc_dapm_context *dapm,
|
|||
|
||||
switch (w->id) {
|
||||
case snd_soc_dapm_mic:
|
||||
case snd_soc_dapm_input:
|
||||
w->is_source = 1;
|
||||
w->power_check = dapm_generic_check_power;
|
||||
break;
|
||||
case snd_soc_dapm_input:
|
||||
if (!dapm->card->fully_routed)
|
||||
w->is_source = 1;
|
||||
w->power_check = dapm_generic_check_power;
|
||||
break;
|
||||
case snd_soc_dapm_spk:
|
||||
case snd_soc_dapm_hp:
|
||||
case snd_soc_dapm_output:
|
||||
w->is_sink = 1;
|
||||
w->power_check = dapm_generic_check_power;
|
||||
break;
|
||||
case snd_soc_dapm_output:
|
||||
if (!dapm->card->fully_routed)
|
||||
w->is_sink = 1;
|
||||
w->power_check = dapm_generic_check_power;
|
||||
break;
|
||||
case snd_soc_dapm_vmid:
|
||||
case snd_soc_dapm_siggen:
|
||||
w->is_source = 1;
|
||||
|
@ -3808,93 +3822,6 @@ int snd_soc_dapm_ignore_suspend(struct snd_soc_dapm_context *dapm,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_dapm_ignore_suspend);
|
||||
|
||||
/**
|
||||
* dapm_is_external_path() - Checks if a path is a external path
|
||||
* @card: The card the path belongs to
|
||||
* @path: The path to check
|
||||
*
|
||||
* Returns true if the path is either between two different DAPM contexts or
|
||||
* between two external pins of the same DAPM context. Otherwise returns
|
||||
* false.
|
||||
*/
|
||||
static bool dapm_is_external_path(struct snd_soc_card *card,
|
||||
struct snd_soc_dapm_path *path)
|
||||
{
|
||||
dev_dbg(card->dev,
|
||||
"... Path %s(id:%d dapm:%p) - %s(id:%d dapm:%p)\n",
|
||||
path->source->name, path->source->id, path->source->dapm,
|
||||
path->sink->name, path->sink->id, path->sink->dapm);
|
||||
|
||||
/* Connection between two different DAPM contexts */
|
||||
if (path->source->dapm != path->sink->dapm)
|
||||
return true;
|
||||
|
||||
/* Loopback connection from external pin to external pin */
|
||||
if (path->sink->id == snd_soc_dapm_input) {
|
||||
switch (path->source->id) {
|
||||
case snd_soc_dapm_output:
|
||||
case snd_soc_dapm_micbias:
|
||||
return true;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool snd_soc_dapm_widget_in_card_paths(struct snd_soc_card *card,
|
||||
struct snd_soc_dapm_widget *w)
|
||||
{
|
||||
struct snd_soc_dapm_path *p;
|
||||
|
||||
list_for_each_entry(p, &w->sources, list_sink) {
|
||||
if (dapm_is_external_path(card, p))
|
||||
return true;
|
||||
}
|
||||
|
||||
list_for_each_entry(p, &w->sinks, list_source) {
|
||||
if (dapm_is_external_path(card, p))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* snd_soc_dapm_auto_nc_pins - call snd_soc_dapm_nc_pin for unused pins
|
||||
* @card: The card whose pins should be processed
|
||||
*
|
||||
* Automatically call snd_soc_dapm_nc_pin() for any external pins in the card
|
||||
* which are unused. Pins are used if they are connected externally to a
|
||||
* component, whether that be to some other device, or a loop-back connection to
|
||||
* the component itself.
|
||||
*/
|
||||
void snd_soc_dapm_auto_nc_pins(struct snd_soc_card *card)
|
||||
{
|
||||
struct snd_soc_dapm_widget *w;
|
||||
|
||||
dev_dbg(card->dev, "ASoC: Auto NC: DAPMs: card:%p\n", &card->dapm);
|
||||
|
||||
list_for_each_entry(w, &card->widgets, list) {
|
||||
switch (w->id) {
|
||||
case snd_soc_dapm_input:
|
||||
case snd_soc_dapm_output:
|
||||
case snd_soc_dapm_micbias:
|
||||
dev_dbg(card->dev, "ASoC: Auto NC: Checking widget %s\n",
|
||||
w->name);
|
||||
if (!snd_soc_dapm_widget_in_card_paths(card, w)) {
|
||||
dev_dbg(card->dev,
|
||||
"... Not in map; disabling\n");
|
||||
snd_soc_dapm_nc_pin(w->dapm, w->name);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* snd_soc_dapm_free - free dapm resources
|
||||
* @dapm: DAPM context
|
||||
|
|
|
@ -746,7 +746,8 @@ static int soc_pcm_prepare(struct snd_pcm_substream *substream)
|
|||
codec_dai);
|
||||
if (ret < 0) {
|
||||
dev_err(codec_dai->dev,
|
||||
"ASoC: DAI prepare error: %d\n", ret);
|
||||
"ASoC: codec DAI prepare error: %d\n",
|
||||
ret);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
@ -755,8 +756,8 @@ static int soc_pcm_prepare(struct snd_pcm_substream *substream)
|
|||
if (cpu_dai->driver->ops && cpu_dai->driver->ops->prepare) {
|
||||
ret = cpu_dai->driver->ops->prepare(substream, cpu_dai);
|
||||
if (ret < 0) {
|
||||
dev_err(cpu_dai->dev, "ASoC: DAI prepare error: %d\n",
|
||||
ret);
|
||||
dev_err(cpu_dai->dev,
|
||||
"ASoC: cpu DAI prepare error: %d\n", ret);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue