Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c8ead415 authored by Takashi Iwai's avatar Takashi Iwai
Browse files

Merge tag 'asoc-v3.12-3' of...

Merge tag 'asoc-v3.12-3' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-next

ASoC: Final updates for v3.12

A few final updates for v3.12 - some cleanups, a bug fix for ssm2602,
pop removal for rt5640 and fixes for the reporting of unidirectional
links in the MXS SGTL5000 driver.
parents 18e39186 5df498a2
Loading
Loading
Loading
Loading
+4 −4
Original line number Original line Diff line number Diff line
@@ -697,7 +697,6 @@ struct snd_soc_codec {
	unsigned int probed:1; /* Codec has been probed */
	unsigned int probed:1; /* Codec has been probed */
	unsigned int ac97_registered:1; /* Codec has been AC97 registered */
	unsigned int ac97_registered:1; /* Codec has been AC97 registered */
	unsigned int ac97_created:1; /* Codec has been created by SoC */
	unsigned int ac97_created:1; /* Codec has been created by SoC */
	unsigned int sysfs_registered:1; /* codec has been sysfs registered */
	unsigned int cache_init:1; /* codec cache has been initialized */
	unsigned int cache_init:1; /* codec cache has been initialized */
	unsigned int using_regmap:1; /* using regmap access */
	unsigned int using_regmap:1; /* using regmap access */
	u32 cache_only;  /* Suppress writes to hardware */
	u32 cache_only;  /* Suppress writes to hardware */
@@ -705,7 +704,6 @@ struct snd_soc_codec {


	/* codec IO */
	/* codec IO */
	void *control_data; /* codec control (i2c/3wire) data */
	void *control_data; /* codec control (i2c/3wire) data */
	enum snd_soc_control_type control_type;
	hw_write_t hw_write;
	hw_write_t hw_write;
	unsigned int (*hw_read)(struct snd_soc_codec *, unsigned int);
	unsigned int (*hw_read)(struct snd_soc_codec *, unsigned int);
	unsigned int (*read)(struct snd_soc_codec *, unsigned int);
	unsigned int (*read)(struct snd_soc_codec *, unsigned int);
@@ -724,7 +722,6 @@ struct snd_soc_codec {
#ifdef CONFIG_DEBUG_FS
#ifdef CONFIG_DEBUG_FS
	struct dentry *debugfs_codec_root;
	struct dentry *debugfs_codec_root;
	struct dentry *debugfs_reg;
	struct dentry *debugfs_reg;
	struct dentry *debugfs_dapm;
#endif
#endif
};
};


@@ -849,7 +846,6 @@ struct snd_soc_platform {


#ifdef CONFIG_DEBUG_FS
#ifdef CONFIG_DEBUG_FS
	struct dentry *debugfs_platform_root;
	struct dentry *debugfs_platform_root;
	struct dentry *debugfs_dapm;
#endif
#endif
};
};


@@ -934,6 +930,10 @@ struct snd_soc_dai_link {
	/* machine stream operations */
	/* machine stream operations */
	const struct snd_soc_ops *ops;
	const struct snd_soc_ops *ops;
	const struct snd_soc_compr_ops *compr_ops;
	const struct snd_soc_compr_ops *compr_ops;

	/* For unidirectional dai links */
	bool playback_only;
	bool capture_only;
};
};


struct snd_soc_codec_conf {
struct snd_soc_codec_conf {
+163 −54
Original line number Original line Diff line number Diff line
@@ -50,8 +50,6 @@ static const struct regmap_range_cfg rt5640_ranges[] = {


static struct reg_default init_list[] = {
static struct reg_default init_list[] = {
	{RT5640_PR_BASE + 0x3d,	0x3600},
	{RT5640_PR_BASE + 0x3d,	0x3600},
	{RT5640_PR_BASE + 0x1c,	0x0D21},
	{RT5640_PR_BASE + 0x1b,	0x0000},
	{RT5640_PR_BASE + 0x12,	0x0aa8},
	{RT5640_PR_BASE + 0x12,	0x0aa8},
	{RT5640_PR_BASE + 0x14,	0x0aaa},
	{RT5640_PR_BASE + 0x14,	0x0aaa},
	{RT5640_PR_BASE + 0x20,	0x6110},
	{RT5640_PR_BASE + 0x20,	0x6110},
@@ -384,15 +382,11 @@ static const SOC_ENUM_SINGLE_DECL(


static const struct snd_kcontrol_new rt5640_snd_controls[] = {
static const struct snd_kcontrol_new rt5640_snd_controls[] = {
	/* Speaker Output Volume */
	/* Speaker Output Volume */
	SOC_DOUBLE("Speaker Playback Switch", RT5640_SPK_VOL,
		RT5640_L_MUTE_SFT, RT5640_R_MUTE_SFT, 1, 1),
	SOC_DOUBLE("Speaker Channel Switch", RT5640_SPK_VOL,
	SOC_DOUBLE("Speaker Channel Switch", RT5640_SPK_VOL,
		RT5640_VOL_L_SFT, RT5640_VOL_R_SFT, 1, 1),
		RT5640_VOL_L_SFT, RT5640_VOL_R_SFT, 1, 1),
	SOC_DOUBLE_TLV("Speaker Playback Volume", RT5640_SPK_VOL,
	SOC_DOUBLE_TLV("Speaker Playback Volume", RT5640_SPK_VOL,
		RT5640_L_VOL_SFT, RT5640_R_VOL_SFT, 39, 1, out_vol_tlv),
		RT5640_L_VOL_SFT, RT5640_R_VOL_SFT, 39, 1, out_vol_tlv),
	/* Headphone Output Volume */
	/* Headphone Output Volume */
	SOC_DOUBLE("HP Playback Switch", RT5640_HP_VOL,
		RT5640_L_MUTE_SFT, RT5640_R_MUTE_SFT, 1, 1),
	SOC_DOUBLE("HP Channel Switch", RT5640_HP_VOL,
	SOC_DOUBLE("HP Channel Switch", RT5640_HP_VOL,
		RT5640_VOL_L_SFT, RT5640_VOL_R_SFT, 1, 1),
		RT5640_VOL_L_SFT, RT5640_VOL_R_SFT, 1, 1),
	SOC_DOUBLE_TLV("HP Playback Volume", RT5640_HP_VOL,
	SOC_DOUBLE_TLV("HP Playback Volume", RT5640_HP_VOL,
@@ -737,6 +731,22 @@ static const struct snd_kcontrol_new rt5640_mono_mix[] = {
			RT5640_M_BST1_MM_SFT, 1, 1),
			RT5640_M_BST1_MM_SFT, 1, 1),
};
};


static const struct snd_kcontrol_new spk_l_enable_control =
	SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5640_SPK_VOL,
		RT5640_L_MUTE_SFT, 1, 1);

static const struct snd_kcontrol_new spk_r_enable_control =
	SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5640_SPK_VOL,
		RT5640_R_MUTE_SFT, 1, 1);

static const struct snd_kcontrol_new hp_l_enable_control =
	SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5640_HP_VOL,
		RT5640_L_MUTE_SFT, 1, 1);

static const struct snd_kcontrol_new hp_r_enable_control =
	SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5640_HP_VOL,
		RT5640_R_MUTE_SFT, 1, 1);

/* Stereo ADC source */
/* Stereo ADC source */
static const char * const rt5640_stereo_adc1_src[] = {
static const char * const rt5640_stereo_adc1_src[] = {
	"DIG MIX", "ADC"
	"DIG MIX", "ADC"
@@ -868,33 +878,6 @@ static const SOC_ENUM_SINGLE_DECL(
static const struct snd_kcontrol_new rt5640_sdi_mux =
static const struct snd_kcontrol_new rt5640_sdi_mux =
	SOC_DAPM_ENUM("SDI select", rt5640_sdi_sel_enum);
	SOC_DAPM_ENUM("SDI select", rt5640_sdi_sel_enum);


static int spk_event(struct snd_soc_dapm_widget *w,
	struct snd_kcontrol *kcontrol, int event)
{
	struct snd_soc_codec *codec = w->codec;
	struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec);

	switch (event) {
	case SND_SOC_DAPM_POST_PMU:
		regmap_update_bits(rt5640->regmap, RT5640_PWR_DIG1,
					0x0001, 0x0001);
		regmap_update_bits(rt5640->regmap, RT5640_PR_BASE + 0x1c,
					0xf000, 0xf000);
		break;

	case SND_SOC_DAPM_PRE_PMD:
		regmap_update_bits(rt5640->regmap, RT5640_PR_BASE + 0x1c,
					0xf000, 0x0000);
		regmap_update_bits(rt5640->regmap, RT5640_PWR_DIG1,
					0x0001, 0x0000);
		break;

	default:
		return 0;
	}
	return 0;
}

static int rt5640_set_dmic1_event(struct snd_soc_dapm_widget *w,
static int rt5640_set_dmic1_event(struct snd_soc_dapm_widget *w,
	struct snd_kcontrol *kcontrol, int event)
	struct snd_kcontrol *kcontrol, int event)
{
{
@@ -943,6 +926,117 @@ static int rt5640_set_dmic2_event(struct snd_soc_dapm_widget *w,
	return 0;
	return 0;
}
}


void hp_amp_power_on(struct snd_soc_codec *codec)
{
	struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec);

	/* depop parameters */
	regmap_update_bits(rt5640->regmap, RT5640_PR_BASE +
		RT5640_CHPUMP_INT_REG1, 0x0700, 0x0200);
	regmap_update_bits(rt5640->regmap, RT5640_DEPOP_M2,
		RT5640_DEPOP_MASK, RT5640_DEPOP_MAN);
	regmap_update_bits(rt5640->regmap, RT5640_DEPOP_M1,
		RT5640_HP_CP_MASK | RT5640_HP_SG_MASK | RT5640_HP_CB_MASK,
		RT5640_HP_CP_PU | RT5640_HP_SG_DIS | RT5640_HP_CB_PU);
	regmap_write(rt5640->regmap, RT5640_PR_BASE + RT5640_HP_DCC_INT1,
			   0x9f00);
	/* headphone amp power on */
	regmap_update_bits(rt5640->regmap, RT5640_PWR_ANLG1,
		RT5640_PWR_FV1 | RT5640_PWR_FV2, 0);
	regmap_update_bits(rt5640->regmap, RT5640_PWR_ANLG1,
		RT5640_PWR_HA,
		RT5640_PWR_HA);
	usleep_range(10000, 15000);
	regmap_update_bits(rt5640->regmap, RT5640_PWR_ANLG1,
		RT5640_PWR_FV1 | RT5640_PWR_FV2 ,
		RT5640_PWR_FV1 | RT5640_PWR_FV2);
}

static void rt5640_pmu_depop(struct snd_soc_codec *codec)
{
	struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec);

	regmap_update_bits(rt5640->regmap, RT5640_DEPOP_M2,
		RT5640_DEPOP_MASK | RT5640_DIG_DP_MASK,
		RT5640_DEPOP_AUTO | RT5640_DIG_DP_EN);
	regmap_update_bits(rt5640->regmap, RT5640_CHARGE_PUMP,
		RT5640_PM_HP_MASK, RT5640_PM_HP_HV);

	regmap_update_bits(rt5640->regmap, RT5640_DEPOP_M3,
		RT5640_CP_FQ1_MASK | RT5640_CP_FQ2_MASK | RT5640_CP_FQ3_MASK,
		(RT5640_CP_FQ_192_KHZ << RT5640_CP_FQ1_SFT) |
		(RT5640_CP_FQ_12_KHZ << RT5640_CP_FQ2_SFT) |
		(RT5640_CP_FQ_192_KHZ << RT5640_CP_FQ3_SFT));

	regmap_write(rt5640->regmap, RT5640_PR_BASE +
		RT5640_MAMP_INT_REG2, 0x1c00);
	regmap_update_bits(rt5640->regmap, RT5640_DEPOP_M1,
		RT5640_HP_CP_MASK | RT5640_HP_SG_MASK,
		RT5640_HP_CP_PD | RT5640_HP_SG_EN);
	regmap_update_bits(rt5640->regmap, RT5640_PR_BASE +
		RT5640_CHPUMP_INT_REG1, 0x0700, 0x0400);
}

static int rt5640_hp_event(struct snd_soc_dapm_widget *w,
			   struct snd_kcontrol *kcontrol, int event)
{
	struct snd_soc_codec *codec = w->codec;
	struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec);

	switch (event) {
	case SND_SOC_DAPM_POST_PMU:
		rt5640_pmu_depop(codec);
		rt5640->hp_mute = 0;
		break;

	case SND_SOC_DAPM_PRE_PMD:
		rt5640->hp_mute = 1;
		usleep_range(70000, 75000);
		break;

	default:
		return 0;
	}

	return 0;
}

static int rt5640_hp_power_event(struct snd_soc_dapm_widget *w,
			   struct snd_kcontrol *kcontrol, int event)
{
	struct snd_soc_codec *codec = w->codec;

	switch (event) {
	case SND_SOC_DAPM_POST_PMU:
		hp_amp_power_on(codec);
		break;
	default:
		return 0;
	}

	return 0;
}

static int rt5640_hp_post_event(struct snd_soc_dapm_widget *w,
			   struct snd_kcontrol *kcontrol, int event)
{
	struct snd_soc_codec *codec = w->codec;
	struct rt5640_priv *rt5640 = snd_soc_codec_get_drvdata(codec);

	switch (event) {
	case SND_SOC_DAPM_POST_PMU:
		if (!rt5640->hp_mute)
			usleep_range(80000, 85000);

		break;

	default:
		return 0;
	}

	return 0;
}

static const struct snd_soc_dapm_widget rt5640_dapm_widgets[] = {
static const struct snd_soc_dapm_widget rt5640_dapm_widgets[] = {
	SND_SOC_DAPM_SUPPLY("PLL1", RT5640_PWR_ANLG2,
	SND_SOC_DAPM_SUPPLY("PLL1", RT5640_PWR_ANLG2,
			RT5640_PWR_PLL_BIT, 0, NULL, 0),
			RT5640_PWR_PLL_BIT, 0, NULL, 0),
@@ -1132,15 +1226,28 @@ static const struct snd_soc_dapm_widget rt5640_dapm_widgets[] = {
		rt5640_mono_mix, ARRAY_SIZE(rt5640_mono_mix)),
		rt5640_mono_mix, ARRAY_SIZE(rt5640_mono_mix)),
	SND_SOC_DAPM_SUPPLY("Improve MONO Amp Drv", RT5640_PWR_ANLG1,
	SND_SOC_DAPM_SUPPLY("Improve MONO Amp Drv", RT5640_PWR_ANLG1,
		RT5640_PWR_MA_BIT, 0, NULL, 0),
		RT5640_PWR_MA_BIT, 0, NULL, 0),
	SND_SOC_DAPM_SUPPLY("Improve HP Amp Drv", RT5640_PWR_ANLG1,
	SND_SOC_DAPM_SUPPLY_S("Improve HP Amp Drv", 1, SND_SOC_NOPM,
		SND_SOC_NOPM, 0, NULL, 0),
		0, 0, rt5640_hp_power_event, SND_SOC_DAPM_POST_PMU),
	SND_SOC_DAPM_PGA("HP L Amp", RT5640_PWR_ANLG1,
	SND_SOC_DAPM_PGA_S("HP Amp", 1, SND_SOC_NOPM, 0, 0,
		rt5640_hp_event,
		SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),
	SND_SOC_DAPM_SUPPLY("HP L Amp", RT5640_PWR_ANLG1,
		RT5640_PWR_HP_L_BIT, 0, NULL, 0),
		RT5640_PWR_HP_L_BIT, 0, NULL, 0),
	SND_SOC_DAPM_PGA("HP R Amp", RT5640_PWR_ANLG1,
	SND_SOC_DAPM_SUPPLY("HP R Amp", RT5640_PWR_ANLG1,
		RT5640_PWR_HP_R_BIT, 0, NULL, 0),
		RT5640_PWR_HP_R_BIT, 0, NULL, 0),
	SND_SOC_DAPM_SUPPLY("Improve SPK Amp Drv", RT5640_PWR_DIG1,
	SND_SOC_DAPM_SUPPLY("Improve SPK Amp Drv", RT5640_PWR_DIG1,
		SND_SOC_NOPM, 0, spk_event,
		RT5640_PWR_CLS_D_BIT, 0, NULL, 0),
		SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),

	/* Output Switch */
	SND_SOC_DAPM_SWITCH("Speaker L Playback", SND_SOC_NOPM, 0, 0,
			&spk_l_enable_control),
	SND_SOC_DAPM_SWITCH("Speaker R Playback", SND_SOC_NOPM, 0, 0,
			&spk_r_enable_control),
	SND_SOC_DAPM_SWITCH("HP L Playback", SND_SOC_NOPM, 0, 0,
			&hp_l_enable_control),
	SND_SOC_DAPM_SWITCH("HP R Playback", SND_SOC_NOPM, 0, 0,
			&hp_r_enable_control),
	SND_SOC_DAPM_POST("HP Post", rt5640_hp_post_event),
	/* Output Lines */
	/* Output Lines */
	SND_SOC_DAPM_OUTPUT("SPOLP"),
	SND_SOC_DAPM_OUTPUT("SPOLP"),
	SND_SOC_DAPM_OUTPUT("SPOLN"),
	SND_SOC_DAPM_OUTPUT("SPOLN"),
@@ -1381,9 +1488,11 @@ static const struct snd_soc_dapm_route rt5640_dapm_routes[] = {
	{"HPO MIX L", "HPO MIX DAC2 Switch", "DAC L2"},
	{"HPO MIX L", "HPO MIX DAC2 Switch", "DAC L2"},
	{"HPO MIX L", "HPO MIX DAC1 Switch", "DAC L1"},
	{"HPO MIX L", "HPO MIX DAC1 Switch", "DAC L1"},
	{"HPO MIX L", "HPO MIX HPVOL Switch", "HPOVOL L"},
	{"HPO MIX L", "HPO MIX HPVOL Switch", "HPOVOL L"},
	{"HPO MIX L", NULL, "HP L Amp"},
	{"HPO MIX R", "HPO MIX DAC2 Switch", "DAC R2"},
	{"HPO MIX R", "HPO MIX DAC2 Switch", "DAC R2"},
	{"HPO MIX R", "HPO MIX DAC1 Switch", "DAC R1"},
	{"HPO MIX R", "HPO MIX DAC1 Switch", "DAC R1"},
	{"HPO MIX R", "HPO MIX HPVOL Switch", "HPOVOL R"},
	{"HPO MIX R", "HPO MIX HPVOL Switch", "HPOVOL R"},
	{"HPO MIX R", NULL, "HP R Amp"},


	{"LOUT MIX", "DAC L1 Switch", "DAC L1"},
	{"LOUT MIX", "DAC L1 Switch", "DAC L1"},
	{"LOUT MIX", "DAC R1 Switch", "DAC R1"},
	{"LOUT MIX", "DAC R1 Switch", "DAC R1"},
@@ -1396,13 +1505,15 @@ static const struct snd_soc_dapm_route rt5640_dapm_routes[] = {
	{"Mono MIX", "OUTVOL L Switch", "OUTVOL L"},
	{"Mono MIX", "OUTVOL L Switch", "OUTVOL L"},
	{"Mono MIX", "BST1 Switch", "BST1"},
	{"Mono MIX", "BST1 Switch", "BST1"},


	{"HP L Amp", NULL, "HPO MIX L"},
	{"HP Amp", NULL, "HPO MIX L"},
	{"HP R Amp", NULL, "HPO MIX R"},
	{"HP Amp", NULL, "HPO MIX R"},


	{"SPOLP", NULL, "SPOL MIX"},
	{"Speaker L Playback", "Switch", "SPOL MIX"},
	{"SPOLN", NULL, "SPOL MIX"},
	{"Speaker R Playback", "Switch", "SPOR MIX"},
	{"SPORP", NULL, "SPOR MIX"},
	{"SPOLP", NULL, "Speaker L Playback"},
	{"SPORN", NULL, "SPOR MIX"},
	{"SPOLN", NULL, "Speaker L Playback"},
	{"SPORP", NULL, "Speaker R Playback"},
	{"SPORN", NULL, "Speaker R Playback"},


	{"SPOLP", NULL, "Improve SPK Amp Drv"},
	{"SPOLP", NULL, "Improve SPK Amp Drv"},
	{"SPOLN", NULL, "Improve SPK Amp Drv"},
	{"SPOLN", NULL, "Improve SPK Amp Drv"},
@@ -1412,8 +1523,10 @@ static const struct snd_soc_dapm_route rt5640_dapm_routes[] = {
	{"HPOL", NULL, "Improve HP Amp Drv"},
	{"HPOL", NULL, "Improve HP Amp Drv"},
	{"HPOR", NULL, "Improve HP Amp Drv"},
	{"HPOR", NULL, "Improve HP Amp Drv"},


	{"HPOL", NULL, "HP L Amp"},
	{"HP L Playback", "Switch", "HP Amp"},
	{"HPOR", NULL, "HP R Amp"},
	{"HP R Playback", "Switch", "HP Amp"},
	{"HPOL", NULL, "HP L Playback"},
	{"HPOR", NULL, "HP R Playback"},
	{"LOUTL", NULL, "LOUT MIX"},
	{"LOUTL", NULL, "LOUT MIX"},
	{"LOUTR", NULL, "LOUT MIX"},
	{"LOUTR", NULL, "LOUT MIX"},
	{"MONOP", NULL, "Mono MIX"},
	{"MONOP", NULL, "Mono MIX"},
@@ -1792,17 +1905,13 @@ static int rt5640_set_bias_level(struct snd_soc_codec *codec,
				RT5640_PWR_BG | RT5640_PWR_VREF2,
				RT5640_PWR_BG | RT5640_PWR_VREF2,
				RT5640_PWR_VREF1 | RT5640_PWR_MB |
				RT5640_PWR_VREF1 | RT5640_PWR_MB |
				RT5640_PWR_BG | RT5640_PWR_VREF2);
				RT5640_PWR_BG | RT5640_PWR_VREF2);
			mdelay(10);
			usleep_range(10000, 15000);
			snd_soc_update_bits(codec, RT5640_PWR_ANLG1,
			snd_soc_update_bits(codec, RT5640_PWR_ANLG1,
				RT5640_PWR_FV1 | RT5640_PWR_FV2,
				RT5640_PWR_FV1 | RT5640_PWR_FV2,
				RT5640_PWR_FV1 | RT5640_PWR_FV2);
				RT5640_PWR_FV1 | RT5640_PWR_FV2);
			regcache_sync(rt5640->regmap);
			regcache_sync(rt5640->regmap);
			snd_soc_update_bits(codec, RT5640_DUMMY1,
			snd_soc_update_bits(codec, RT5640_DUMMY1,
						0x0301, 0x0301);
						0x0301, 0x0301);
			snd_soc_update_bits(codec, RT5640_DEPOP_M1,
						0x001d, 0x0019);
			snd_soc_update_bits(codec, RT5640_DEPOP_M2,
						0x2000, 0x2000);
			snd_soc_update_bits(codec, RT5640_MICBIAS,
			snd_soc_update_bits(codec, RT5640_MICBIAS,
						0x0030, 0x0030);
						0x0030, 0x0030);
		}
		}
@@ -1846,8 +1955,6 @@ static int rt5640_probe(struct snd_soc_codec *codec)
	rt5640_set_bias_level(codec, SND_SOC_BIAS_OFF);
	rt5640_set_bias_level(codec, SND_SOC_BIAS_OFF);


	snd_soc_update_bits(codec, RT5640_DUMMY1, 0x0301, 0x0301);
	snd_soc_update_bits(codec, RT5640_DUMMY1, 0x0301, 0x0301);
	snd_soc_update_bits(codec, RT5640_DEPOP_M1, 0x001d, 0x0019);
	snd_soc_update_bits(codec, RT5640_DEPOP_M2, 0x2000, 0x2000);
	snd_soc_update_bits(codec, RT5640_MICBIAS, 0x0030, 0x0030);
	snd_soc_update_bits(codec, RT5640_MICBIAS, 0x0030, 0x0030);
	snd_soc_update_bits(codec, RT5640_DSP_PATH2, 0xfc00, 0x0c00);
	snd_soc_update_bits(codec, RT5640_DSP_PATH2, 0xfc00, 0x0c00);


@@ -2069,6 +2176,8 @@ static int rt5640_i2c_probe(struct i2c_client *i2c,
		regmap_update_bits(rt5640->regmap, RT5640_IN3_IN4,
		regmap_update_bits(rt5640->regmap, RT5640_IN3_IN4,
					RT5640_IN_DF2, RT5640_IN_DF2);
					RT5640_IN_DF2, RT5640_IN_DF2);


	rt5640->hp_mute = 1;

	ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5640,
	ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5640,
			rt5640_dai, ARRAY_SIZE(rt5640_dai));
			rt5640_dai, ARRAY_SIZE(rt5640_dai));
	if (ret < 0)
	if (ret < 0)
+12 −0
Original line number Original line Diff line number Diff line
@@ -145,6 +145,8 @@




/* Index of Codec Private Register definition */
/* Index of Codec Private Register definition */
#define RT5640_CHPUMP_INT_REG1			0x24
#define RT5640_MAMP_INT_REG2			0x37
#define RT5640_3D_SPK				0x63
#define RT5640_3D_SPK				0x63
#define RT5640_WND_1				0x6c
#define RT5640_WND_1				0x6c
#define RT5640_WND_2				0x6d
#define RT5640_WND_2				0x6d
@@ -153,6 +155,7 @@
#define RT5640_WND_5				0x70
#define RT5640_WND_5				0x70
#define RT5640_WND_8				0x73
#define RT5640_WND_8				0x73
#define RT5640_DIP_SPK_INF			0x75
#define RT5640_DIP_SPK_INF			0x75
#define RT5640_HP_DCC_INT1			0x77
#define RT5640_EQ_BW_LOP			0xa0
#define RT5640_EQ_BW_LOP			0xa0
#define RT5640_EQ_GN_LOP			0xa1
#define RT5640_EQ_GN_LOP			0xa1
#define RT5640_EQ_FC_BP1			0xa2
#define RT5640_EQ_FC_BP1			0xa2
@@ -1201,6 +1204,14 @@
#define RT5640_CP_FQ2_SFT			4
#define RT5640_CP_FQ2_SFT			4
#define RT5640_CP_FQ3_MASK			(0x7)
#define RT5640_CP_FQ3_MASK			(0x7)
#define RT5640_CP_FQ3_SFT			0
#define RT5640_CP_FQ3_SFT			0
#define RT5640_CP_FQ_1_5_KHZ			0
#define RT5640_CP_FQ_3_KHZ			1
#define RT5640_CP_FQ_6_KHZ			2
#define RT5640_CP_FQ_12_KHZ			3
#define RT5640_CP_FQ_24_KHZ			4
#define RT5640_CP_FQ_48_KHZ			5
#define RT5640_CP_FQ_96_KHZ			6
#define RT5640_CP_FQ_192_KHZ			7


/* HPOUT charge pump (0x91) */
/* HPOUT charge pump (0x91) */
#define RT5640_OSW_L_MASK			(0x1 << 11)
#define RT5640_OSW_L_MASK			(0x1 << 11)
@@ -2087,6 +2098,7 @@ struct rt5640_priv {
	int pll_out;
	int pll_out;


	int dmic_en;
	int dmic_en;
	bool hp_mute;
};
};


#endif
#endif
+2 −1
Original line number Original line Diff line number Diff line
@@ -561,8 +561,9 @@ static int ssm2602_suspend(struct snd_soc_codec *codec)


static int ssm2602_resume(struct snd_soc_codec *codec)
static int ssm2602_resume(struct snd_soc_codec *codec)
{
{
	snd_soc_cache_sync(codec);
	struct ssm2602_priv *ssm2602 = snd_soc_codec_get_drvdata(codec);


	regcache_sync(ssm2602->regmap);
	ssm2602_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
	ssm2602_set_bias_level(codec, SND_SOC_BIAS_STANDBY);


	return 0;
	return 0;
+6 −6
Original line number Original line Diff line number Diff line
@@ -411,7 +411,7 @@ static int spdif_set_sample_rate(struct snd_pcm_substream *substream,
	return 0;
	return 0;
}
}


int fsl_spdif_startup(struct snd_pcm_substream *substream,
static int fsl_spdif_startup(struct snd_pcm_substream *substream,
			     struct snd_soc_dai *cpu_dai)
			     struct snd_soc_dai *cpu_dai)
{
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
@@ -546,7 +546,7 @@ static int fsl_spdif_trigger(struct snd_pcm_substream *substream,
	return 0;
	return 0;
}
}


struct snd_soc_dai_ops fsl_spdif_dai_ops = {
static struct snd_soc_dai_ops fsl_spdif_dai_ops = {
	.startup = fsl_spdif_startup,
	.startup = fsl_spdif_startup,
	.hw_params = fsl_spdif_hw_params,
	.hw_params = fsl_spdif_hw_params,
	.trigger = fsl_spdif_trigger,
	.trigger = fsl_spdif_trigger,
@@ -919,7 +919,7 @@ static int fsl_spdif_dai_probe(struct snd_soc_dai *dai)
	return 0;
	return 0;
}
}


struct snd_soc_dai_driver fsl_spdif_dai = {
static struct snd_soc_dai_driver fsl_spdif_dai = {
	.probe = &fsl_spdif_dai_probe,
	.probe = &fsl_spdif_dai_probe,
	.playback = {
	.playback = {
		.channels_min = 2,
		.channels_min = 2,
@@ -1071,9 +1071,9 @@ static int fsl_spdif_probe_txclk(struct fsl_spdif_priv *spdif_priv,
			break;
			break;
	}
	}


	dev_dbg(&pdev->dev, "use rxtx%d as tx clock source for %dHz sample rate",
	dev_dbg(&pdev->dev, "use rxtx%d as tx clock source for %dHz sample rate\n",
			spdif_priv->txclk_src[index], rate[index]);
			spdif_priv->txclk_src[index], rate[index]);
	dev_dbg(&pdev->dev, "use divisor %d for %dHz sample rate",
	dev_dbg(&pdev->dev, "use divisor %d for %dHz sample rate\n",
			spdif_priv->txclk_div[index], rate[index]);
			spdif_priv->txclk_div[index], rate[index]);


	return 0;
	return 0;
Loading