Merge remote-tracking branch 'asoc/topic/rt5645' into asoc-next
This commit is contained in:
Коммит
cb42e0f709
|
@ -791,7 +791,6 @@ struct snd_soc_component {
|
|||
|
||||
/* Don't use these, use snd_soc_component_get_dapm() */
|
||||
struct snd_soc_dapm_context dapm;
|
||||
struct snd_soc_dapm_context *dapm_ptr;
|
||||
|
||||
const struct snd_kcontrol_new *controls;
|
||||
unsigned int num_controls;
|
||||
|
@ -831,9 +830,6 @@ struct snd_soc_codec {
|
|||
/* component */
|
||||
struct snd_soc_component component;
|
||||
|
||||
/* Don't access this directly, use snd_soc_codec_get_dapm() */
|
||||
struct snd_soc_dapm_context dapm;
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
struct dentry *debugfs_reg;
|
||||
#endif
|
||||
|
@ -1276,7 +1272,7 @@ static inline struct snd_soc_component *snd_soc_dapm_to_component(
|
|||
static inline struct snd_soc_codec *snd_soc_dapm_to_codec(
|
||||
struct snd_soc_dapm_context *dapm)
|
||||
{
|
||||
return container_of(dapm, struct snd_soc_codec, dapm);
|
||||
return snd_soc_component_to_codec(snd_soc_dapm_to_component(dapm));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1301,7 +1297,7 @@ static inline struct snd_soc_platform *snd_soc_dapm_to_platform(
|
|||
static inline struct snd_soc_dapm_context *snd_soc_component_get_dapm(
|
||||
struct snd_soc_component *component)
|
||||
{
|
||||
return component->dapm_ptr;
|
||||
return &component->dapm;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1313,7 +1309,7 @@ static inline struct snd_soc_dapm_context *snd_soc_component_get_dapm(
|
|||
static inline struct snd_soc_dapm_context *snd_soc_codec_get_dapm(
|
||||
struct snd_soc_codec *codec)
|
||||
{
|
||||
return &codec->dapm;
|
||||
return snd_soc_component_get_dapm(&codec->component);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include <linux/gpio/consumer.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <sound/core.h>
|
||||
#include <sound/pcm.h>
|
||||
#include <sound/pcm_params.h>
|
||||
|
@ -223,6 +224,39 @@ static const struct reg_default rt5645_reg[] = {
|
|||
{ 0xff, 0x6308 },
|
||||
};
|
||||
|
||||
static const char *const rt5645_supply_names[] = {
|
||||
"avdd",
|
||||
"cpvdd",
|
||||
};
|
||||
|
||||
struct rt5645_priv {
|
||||
struct snd_soc_codec *codec;
|
||||
struct rt5645_platform_data pdata;
|
||||
struct regmap *regmap;
|
||||
struct i2c_client *i2c;
|
||||
struct gpio_desc *gpiod_hp_det;
|
||||
struct snd_soc_jack *hp_jack;
|
||||
struct snd_soc_jack *mic_jack;
|
||||
struct snd_soc_jack *btn_jack;
|
||||
struct delayed_work jack_detect_work;
|
||||
struct regulator_bulk_data supplies[ARRAY_SIZE(rt5645_supply_names)];
|
||||
|
||||
int codec_type;
|
||||
int sysclk;
|
||||
int sysclk_src;
|
||||
int lrck[RT5645_AIFS];
|
||||
int bclk[RT5645_AIFS];
|
||||
int master[RT5645_AIFS];
|
||||
|
||||
int pll_src;
|
||||
int pll_in;
|
||||
int pll_out;
|
||||
|
||||
int jack_type;
|
||||
bool en_button_func;
|
||||
bool hp_on;
|
||||
};
|
||||
|
||||
static int rt5645_reset(struct snd_soc_codec *codec)
|
||||
{
|
||||
return snd_soc_write(codec, RT5645_RESET, 0);
|
||||
|
@ -360,6 +394,7 @@ static bool rt5645_readable_register(struct device *dev, unsigned int reg)
|
|||
case RT5645_DEPOP_M1:
|
||||
case RT5645_DEPOP_M2:
|
||||
case RT5645_DEPOP_M3:
|
||||
case RT5645_CHARGE_PUMP:
|
||||
case RT5645_MICBIAS:
|
||||
case RT5645_A_JD_CTRL1:
|
||||
case RT5645_VAD_CTRL4:
|
||||
|
@ -1331,15 +1366,23 @@ static void hp_amp_power(struct snd_soc_codec *codec, int on)
|
|||
if (on) {
|
||||
if (hp_amp_power_count <= 0) {
|
||||
if (rt5645->codec_type == CODEC_TYPE_RT5650) {
|
||||
snd_soc_write(codec, RT5645_DEPOP_M2, 0x3100);
|
||||
snd_soc_write(codec, RT5645_CHARGE_PUMP,
|
||||
0x0e06);
|
||||
snd_soc_write(codec, RT5645_DEPOP_M1, 0x001d);
|
||||
snd_soc_write(codec, RT5645_DEPOP_M1, 0x000d);
|
||||
regmap_write(rt5645->regmap, RT5645_PR_BASE +
|
||||
RT5645_HP_DCC_INT1, 0x9f01);
|
||||
msleep(20);
|
||||
snd_soc_update_bits(codec, RT5645_DEPOP_M1,
|
||||
RT5645_HP_CO_MASK, RT5645_HP_CO_EN);
|
||||
regmap_write(rt5645->regmap, RT5645_PR_BASE +
|
||||
0x3e, 0x7400);
|
||||
snd_soc_write(codec, RT5645_DEPOP_M3, 0x0737);
|
||||
regmap_write(rt5645->regmap, RT5645_PR_BASE +
|
||||
RT5645_MAMP_INT_REG2, 0xfc00);
|
||||
snd_soc_write(codec, RT5645_DEPOP_M2, 0x1140);
|
||||
mdelay(5);
|
||||
rt5645->hp_on = true;
|
||||
} else {
|
||||
/* depop parameters */
|
||||
snd_soc_update_bits(codec, RT5645_DEPOP_M2,
|
||||
|
@ -1553,6 +1596,27 @@ static int rt5645_bst2_event(struct snd_soc_dapm_widget *w,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int rt5650_hp_event(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *k, int event)
|
||||
{
|
||||
struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
|
||||
struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec);
|
||||
|
||||
switch (event) {
|
||||
case SND_SOC_DAPM_POST_PMU:
|
||||
if (rt5645->hp_on) {
|
||||
msleep(100);
|
||||
rt5645->hp_on = false;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct snd_soc_dapm_widget rt5645_dapm_widgets[] = {
|
||||
SND_SOC_DAPM_SUPPLY("LDO2", RT5645_PWR_MIXER,
|
||||
RT5645_PWR_LDO2_BIT, 0, NULL, 0),
|
||||
|
@ -1697,15 +1761,6 @@ static const struct snd_soc_dapm_widget rt5645_dapm_widgets[] = {
|
|||
SND_SOC_DAPM_PGA("IF1_ADC4", SND_SOC_NOPM, 0, 0, NULL, 0),
|
||||
|
||||
/* IF1 2 Mux */
|
||||
SND_SOC_DAPM_MUX("RT5645 IF1 ADC1 Swap Mux", SND_SOC_NOPM,
|
||||
0, 0, &rt5645_if1_adc1_in_mux),
|
||||
SND_SOC_DAPM_MUX("RT5645 IF1 ADC2 Swap Mux", SND_SOC_NOPM,
|
||||
0, 0, &rt5645_if1_adc2_in_mux),
|
||||
SND_SOC_DAPM_MUX("RT5645 IF1 ADC3 Swap Mux", SND_SOC_NOPM,
|
||||
0, 0, &rt5645_if1_adc3_in_mux),
|
||||
SND_SOC_DAPM_MUX("RT5645 IF1 ADC Mux", SND_SOC_NOPM,
|
||||
0, 0, &rt5645_if1_adc_in_mux),
|
||||
|
||||
SND_SOC_DAPM_MUX("IF2 ADC Mux", SND_SOC_NOPM,
|
||||
0, 0, &rt5645_if2_adc_in_mux),
|
||||
|
||||
|
@ -1716,14 +1771,6 @@ static const struct snd_soc_dapm_widget rt5645_dapm_widgets[] = {
|
|||
SND_SOC_DAPM_PGA("IF1 DAC1", SND_SOC_NOPM, 0, 0, NULL, 0),
|
||||
SND_SOC_DAPM_PGA("IF1 DAC2", SND_SOC_NOPM, 0, 0, NULL, 0),
|
||||
SND_SOC_DAPM_PGA("IF1 DAC3", SND_SOC_NOPM, 0, 0, NULL, 0),
|
||||
SND_SOC_DAPM_MUX("RT5645 IF1 DAC1 L Mux", SND_SOC_NOPM, 0, 0,
|
||||
&rt5645_if1_dac0_tdm_sel_mux),
|
||||
SND_SOC_DAPM_MUX("RT5645 IF1 DAC1 R Mux", SND_SOC_NOPM, 0, 0,
|
||||
&rt5645_if1_dac1_tdm_sel_mux),
|
||||
SND_SOC_DAPM_MUX("RT5645 IF1 DAC2 L Mux", SND_SOC_NOPM, 0, 0,
|
||||
&rt5645_if1_dac2_tdm_sel_mux),
|
||||
SND_SOC_DAPM_MUX("RT5645 IF1 DAC2 R Mux", SND_SOC_NOPM, 0, 0,
|
||||
&rt5645_if1_dac3_tdm_sel_mux),
|
||||
SND_SOC_DAPM_PGA("IF1 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
|
||||
SND_SOC_DAPM_PGA("IF1 ADC L", SND_SOC_NOPM, 0, 0, NULL, 0),
|
||||
SND_SOC_DAPM_PGA("IF1 ADC R", SND_SOC_NOPM, 0, 0, NULL, 0),
|
||||
|
@ -1854,6 +1901,26 @@ static const struct snd_soc_dapm_widget rt5645_dapm_widgets[] = {
|
|||
SND_SOC_DAPM_OUTPUT("PDM1R"),
|
||||
SND_SOC_DAPM_OUTPUT("SPOL"),
|
||||
SND_SOC_DAPM_OUTPUT("SPOR"),
|
||||
SND_SOC_DAPM_POST("DAPM_POST", rt5650_hp_event),
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_widget rt5645_specific_dapm_widgets[] = {
|
||||
SND_SOC_DAPM_MUX("RT5645 IF1 DAC1 L Mux", SND_SOC_NOPM, 0, 0,
|
||||
&rt5645_if1_dac0_tdm_sel_mux),
|
||||
SND_SOC_DAPM_MUX("RT5645 IF1 DAC1 R Mux", SND_SOC_NOPM, 0, 0,
|
||||
&rt5645_if1_dac1_tdm_sel_mux),
|
||||
SND_SOC_DAPM_MUX("RT5645 IF1 DAC2 L Mux", SND_SOC_NOPM, 0, 0,
|
||||
&rt5645_if1_dac2_tdm_sel_mux),
|
||||
SND_SOC_DAPM_MUX("RT5645 IF1 DAC2 R Mux", SND_SOC_NOPM, 0, 0,
|
||||
&rt5645_if1_dac3_tdm_sel_mux),
|
||||
SND_SOC_DAPM_MUX("RT5645 IF1 ADC Mux", SND_SOC_NOPM,
|
||||
0, 0, &rt5645_if1_adc_in_mux),
|
||||
SND_SOC_DAPM_MUX("RT5645 IF1 ADC1 Swap Mux", SND_SOC_NOPM,
|
||||
0, 0, &rt5645_if1_adc1_in_mux),
|
||||
SND_SOC_DAPM_MUX("RT5645 IF1 ADC2 Swap Mux", SND_SOC_NOPM,
|
||||
0, 0, &rt5645_if1_adc2_in_mux),
|
||||
SND_SOC_DAPM_MUX("RT5645 IF1 ADC3 Swap Mux", SND_SOC_NOPM,
|
||||
0, 0, &rt5645_if1_adc3_in_mux),
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_widget rt5650_specific_dapm_widgets[] = {
|
||||
|
@ -2642,7 +2709,7 @@ static int rt5645_set_bias_level(struct snd_soc_codec *codec,
|
|||
|
||||
switch (level) {
|
||||
case SND_SOC_BIAS_PREPARE:
|
||||
if (SND_SOC_BIAS_STANDBY == codec->dapm.bias_level) {
|
||||
if (SND_SOC_BIAS_STANDBY == snd_soc_codec_get_bias_level(codec)) {
|
||||
snd_soc_update_bits(codec, RT5645_PWR_ANLG1,
|
||||
RT5645_PWR_VREF1 | RT5645_PWR_MB |
|
||||
RT5645_PWR_BG | RT5645_PWR_VREF2,
|
||||
|
@ -2686,94 +2753,15 @@ static int rt5645_set_bias_level(struct snd_soc_codec *codec,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int rt5650_calibration(struct rt5645_priv *rt5645)
|
||||
{
|
||||
int val, i;
|
||||
int ret = -1;
|
||||
|
||||
regcache_cache_bypass(rt5645->regmap, true);
|
||||
regmap_write(rt5645->regmap, RT5645_RESET, 0);
|
||||
regmap_write(rt5645->regmap, RT5645_GEN_CTRL3, 0x0800);
|
||||
regmap_write(rt5645->regmap, RT5645_PR_BASE + RT5645_CHOP_DAC_ADC,
|
||||
0x3600);
|
||||
regmap_write(rt5645->regmap, RT5645_PR_BASE + 0x25, 0x7000);
|
||||
regmap_write(rt5645->regmap, RT5645_I2S1_SDP, 0x8008);
|
||||
/* headset type */
|
||||
regmap_write(rt5645->regmap, RT5645_GEN_CTRL1, 0x2061);
|
||||
regmap_write(rt5645->regmap, RT5645_CHARGE_PUMP, 0x0006);
|
||||
regmap_write(rt5645->regmap, RT5645_PWR_ANLG1, 0x2012);
|
||||
regmap_write(rt5645->regmap, RT5645_PWR_MIXER, 0x0002);
|
||||
regmap_write(rt5645->regmap, RT5645_PWR_VOL, 0x0020);
|
||||
regmap_write(rt5645->regmap, RT5645_JD_CTRL3, 0x00f0);
|
||||
regmap_write(rt5645->regmap, RT5645_IN1_CTRL1, 0x0006);
|
||||
regmap_write(rt5645->regmap, RT5645_IN1_CTRL2, 0x1827);
|
||||
regmap_write(rt5645->regmap, RT5645_IN1_CTRL2, 0x0827);
|
||||
msleep(400);
|
||||
/* Inline command */
|
||||
regmap_write(rt5645->regmap, RT5645_DEPOP_M1, 0x0001);
|
||||
regmap_write(rt5645->regmap, RT5650_4BTN_IL_CMD2, 0xc000);
|
||||
regmap_write(rt5645->regmap, RT5650_4BTN_IL_CMD1, 0x0008);
|
||||
/* Calbration */
|
||||
regmap_write(rt5645->regmap, RT5645_GLB_CLK, 0x8000);
|
||||
regmap_write(rt5645->regmap, RT5645_DEPOP_M1, 0x0000);
|
||||
regmap_write(rt5645->regmap, RT5650_4BTN_IL_CMD2, 0xc000);
|
||||
regmap_write(rt5645->regmap, RT5650_4BTN_IL_CMD1, 0x0008);
|
||||
regmap_write(rt5645->regmap, RT5645_PWR_DIG2, 0x8800);
|
||||
regmap_write(rt5645->regmap, RT5645_PWR_ANLG1, 0xe8fa);
|
||||
regmap_write(rt5645->regmap, RT5645_PWR_ANLG2, 0x8c04);
|
||||
regmap_write(rt5645->regmap, RT5645_DEPOP_M2, 0x3100);
|
||||
regmap_write(rt5645->regmap, RT5645_CHARGE_PUMP, 0x0e06);
|
||||
regmap_write(rt5645->regmap, RT5645_BASS_BACK, 0x8a13);
|
||||
regmap_write(rt5645->regmap, RT5645_GEN_CTRL3, 0x0820);
|
||||
regmap_write(rt5645->regmap, RT5645_DEPOP_M1, 0x000d);
|
||||
/* Power on and Calbration */
|
||||
regmap_write(rt5645->regmap, RT5645_PR_BASE + RT5645_HP_DCC_INT1,
|
||||
0x9f01);
|
||||
msleep(200);
|
||||
for (i = 0; i < 5; i++) {
|
||||
regmap_read(rt5645->regmap, RT5645_PR_BASE + 0x7a, &val);
|
||||
if (val != 0 && val != 0x3f3f) {
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
msleep(50);
|
||||
}
|
||||
pr_debug("%s: PR-7A = 0x%x\n", __func__, val);
|
||||
|
||||
/* mute */
|
||||
regmap_write(rt5645->regmap, RT5645_PR_BASE + 0x3e, 0x7400);
|
||||
regmap_write(rt5645->regmap, RT5645_DEPOP_M3, 0x0737);
|
||||
regmap_write(rt5645->regmap, RT5645_PR_BASE + RT5645_MAMP_INT_REG2,
|
||||
0xfc00);
|
||||
regmap_write(rt5645->regmap, RT5645_DEPOP_M2, 0x1140);
|
||||
regmap_write(rt5645->regmap, RT5645_DEPOP_M1, 0x0000);
|
||||
regmap_write(rt5645->regmap, RT5645_GEN_CTRL2, 0x4020);
|
||||
regmap_write(rt5645->regmap, RT5645_PWR_ANLG2, 0x0006);
|
||||
regmap_write(rt5645->regmap, RT5645_PWR_DIG2, 0x0000);
|
||||
msleep(350);
|
||||
|
||||
regcache_cache_bypass(rt5645->regmap, false);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void rt5645_enable_push_button_irq(struct snd_soc_codec *codec,
|
||||
bool enable)
|
||||
{
|
||||
struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec);
|
||||
struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
|
||||
|
||||
if (enable) {
|
||||
snd_soc_dapm_mutex_lock(&codec->dapm);
|
||||
snd_soc_dapm_force_enable_pin_unlocked(&codec->dapm,
|
||||
"ADC L power");
|
||||
snd_soc_dapm_force_enable_pin_unlocked(&codec->dapm,
|
||||
"ADC R power");
|
||||
snd_soc_dapm_force_enable_pin_unlocked(&codec->dapm,
|
||||
"LDO2");
|
||||
snd_soc_dapm_force_enable_pin_unlocked(&codec->dapm,
|
||||
"Mic Det Power");
|
||||
snd_soc_dapm_sync_unlocked(&codec->dapm);
|
||||
snd_soc_dapm_mutex_unlock(&codec->dapm);
|
||||
snd_soc_dapm_force_enable_pin(dapm, "ADC L power");
|
||||
snd_soc_dapm_force_enable_pin(dapm, "ADC R power");
|
||||
snd_soc_dapm_sync(dapm);
|
||||
|
||||
snd_soc_update_bits(codec,
|
||||
RT5645_INT_IRQ_ST, 0x8, 0x8);
|
||||
|
@ -2786,36 +2774,26 @@ static void rt5645_enable_push_button_irq(struct snd_soc_codec *codec,
|
|||
snd_soc_update_bits(codec, RT5650_4BTN_IL_CMD2, 0x8000, 0x0);
|
||||
snd_soc_update_bits(codec, RT5645_INT_IRQ_ST, 0x8, 0x0);
|
||||
|
||||
snd_soc_dapm_mutex_lock(&codec->dapm);
|
||||
snd_soc_dapm_disable_pin_unlocked(&codec->dapm,
|
||||
"ADC L power");
|
||||
snd_soc_dapm_disable_pin_unlocked(&codec->dapm,
|
||||
"ADC R power");
|
||||
if (rt5645->pdata.jd_mode == 0)
|
||||
snd_soc_dapm_disable_pin_unlocked(&codec->dapm,
|
||||
"LDO2");
|
||||
snd_soc_dapm_disable_pin_unlocked(&codec->dapm,
|
||||
"Mic Det Power");
|
||||
snd_soc_dapm_sync_unlocked(&codec->dapm);
|
||||
snd_soc_dapm_mutex_unlock(&codec->dapm);
|
||||
snd_soc_dapm_disable_pin(dapm, "ADC L power");
|
||||
snd_soc_dapm_disable_pin(dapm, "ADC R power");
|
||||
snd_soc_dapm_sync(dapm);
|
||||
}
|
||||
}
|
||||
|
||||
static int rt5645_jack_detect(struct snd_soc_codec *codec, int jack_insert)
|
||||
{
|
||||
struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
|
||||
struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec);
|
||||
unsigned int val;
|
||||
|
||||
if (jack_insert) {
|
||||
regmap_write(rt5645->regmap, RT5645_CHARGE_PUMP, 0x0006);
|
||||
|
||||
if (codec->component.card->instantiated) {
|
||||
/* for jack type detect */
|
||||
snd_soc_dapm_force_enable_pin(&codec->dapm, "LDO2");
|
||||
snd_soc_dapm_force_enable_pin(&codec->dapm,
|
||||
"Mic Det Power");
|
||||
snd_soc_dapm_sync(&codec->dapm);
|
||||
} else {
|
||||
/* for jack type detect */
|
||||
snd_soc_dapm_force_enable_pin(dapm, "LDO2");
|
||||
snd_soc_dapm_force_enable_pin(dapm, "Mic Det Power");
|
||||
snd_soc_dapm_sync(dapm);
|
||||
if (!dapm->card->instantiated) {
|
||||
/* Power up necessary bits for JD if dapm is
|
||||
not ready yet */
|
||||
regmap_update_bits(rt5645->regmap, RT5645_PWR_ANLG1,
|
||||
|
@ -2828,14 +2806,15 @@ static int rt5645_jack_detect(struct snd_soc_codec *codec, int jack_insert)
|
|||
}
|
||||
|
||||
regmap_write(rt5645->regmap, RT5645_JD_CTRL3, 0x00f0);
|
||||
regmap_write(rt5645->regmap, RT5645_IN1_CTRL1, 0x0006);
|
||||
regmap_update_bits(rt5645->regmap,
|
||||
RT5645_IN1_CTRL2, 0x1000, 0x1000);
|
||||
regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL2,
|
||||
RT5645_CBJ_MN_JD, RT5645_CBJ_MN_JD);
|
||||
regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL1,
|
||||
RT5645_CBJ_BST1_EN, RT5645_CBJ_BST1_EN);
|
||||
msleep(100);
|
||||
regmap_update_bits(rt5645->regmap,
|
||||
RT5645_IN1_CTRL2, 0x1000, 0x0000);
|
||||
regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL2,
|
||||
RT5645_CBJ_MN_JD, 0);
|
||||
|
||||
msleep(450);
|
||||
msleep(600);
|
||||
regmap_read(rt5645->regmap, RT5645_IN1_CTRL3, &val);
|
||||
val &= 0x7;
|
||||
dev_dbg(codec->dev, "val = %d\n", val);
|
||||
|
@ -2846,43 +2825,46 @@ static int rt5645_jack_detect(struct snd_soc_codec *codec, int jack_insert)
|
|||
rt5645_enable_push_button_irq(codec, true);
|
||||
}
|
||||
} else {
|
||||
if (codec->component.card->instantiated) {
|
||||
snd_soc_dapm_disable_pin(&codec->dapm,
|
||||
"Mic Det Power");
|
||||
snd_soc_dapm_sync(&codec->dapm);
|
||||
} else
|
||||
regmap_update_bits(rt5645->regmap,
|
||||
RT5645_PWR_VOL, RT5645_PWR_MIC_DET, 0);
|
||||
snd_soc_dapm_disable_pin(dapm, "Mic Det Power");
|
||||
snd_soc_dapm_sync(dapm);
|
||||
rt5645->jack_type = SND_JACK_HEADPHONE;
|
||||
}
|
||||
|
||||
snd_soc_update_bits(codec, RT5645_CHARGE_PUMP, 0x0300, 0x0200);
|
||||
snd_soc_write(codec, RT5645_DEPOP_M1, 0x001d);
|
||||
snd_soc_write(codec, RT5645_DEPOP_M1, 0x0001);
|
||||
} else { /* jack out */
|
||||
rt5645->jack_type = 0;
|
||||
|
||||
regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL2,
|
||||
RT5645_CBJ_MN_JD, RT5645_CBJ_MN_JD);
|
||||
regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL1,
|
||||
RT5645_CBJ_BST1_EN, 0);
|
||||
|
||||
if (rt5645->en_button_func)
|
||||
rt5645_enable_push_button_irq(codec, false);
|
||||
else {
|
||||
if (codec->component.card->instantiated) {
|
||||
if (rt5645->pdata.jd_mode == 0)
|
||||
snd_soc_dapm_disable_pin(&codec->dapm,
|
||||
"LDO2");
|
||||
snd_soc_dapm_disable_pin(&codec->dapm,
|
||||
"Mic Det Power");
|
||||
snd_soc_dapm_sync(&codec->dapm);
|
||||
} else {
|
||||
if (rt5645->pdata.jd_mode == 0)
|
||||
regmap_update_bits(rt5645->regmap,
|
||||
RT5645_PWR_MIXER,
|
||||
RT5645_PWR_LDO2, 0);
|
||||
regmap_update_bits(rt5645->regmap,
|
||||
RT5645_PWR_VOL, RT5645_PWR_MIC_DET, 0);
|
||||
}
|
||||
}
|
||||
|
||||
if (rt5645->pdata.jd_mode == 0)
|
||||
snd_soc_dapm_disable_pin(dapm, "LDO2");
|
||||
snd_soc_dapm_disable_pin(dapm, "Mic Det Power");
|
||||
snd_soc_dapm_sync(dapm);
|
||||
}
|
||||
|
||||
return rt5645->jack_type;
|
||||
}
|
||||
|
||||
static int rt5645_irq_detection(struct rt5645_priv *rt5645);
|
||||
static int rt5645_button_detect(struct snd_soc_codec *codec)
|
||||
{
|
||||
int btn_type, val;
|
||||
|
||||
val = snd_soc_read(codec, RT5650_4BTN_IL_CMD1);
|
||||
pr_debug("val=0x%x\n", val);
|
||||
btn_type = val & 0xfff0;
|
||||
snd_soc_write(codec, RT5650_4BTN_IL_CMD1, val);
|
||||
|
||||
return btn_type;
|
||||
}
|
||||
|
||||
static irqreturn_t rt5645_irq(int irq, void *data);
|
||||
|
||||
int rt5645_set_jack_detect(struct snd_soc_codec *codec,
|
||||
|
@ -2913,38 +2895,10 @@ static void rt5645_jack_detect_work(struct work_struct *work)
|
|||
{
|
||||
struct rt5645_priv *rt5645 =
|
||||
container_of(work, struct rt5645_priv, jack_detect_work.work);
|
||||
|
||||
rt5645_irq_detection(rt5645);
|
||||
}
|
||||
|
||||
static irqreturn_t rt5645_irq(int irq, void *data)
|
||||
{
|
||||
struct rt5645_priv *rt5645 = data;
|
||||
|
||||
queue_delayed_work(system_power_efficient_wq,
|
||||
&rt5645->jack_detect_work, msecs_to_jiffies(250));
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int rt5645_button_detect(struct snd_soc_codec *codec)
|
||||
{
|
||||
int btn_type, val;
|
||||
|
||||
val = snd_soc_read(codec, RT5650_4BTN_IL_CMD1);
|
||||
pr_debug("val=0x%x\n", val);
|
||||
btn_type = val & 0xfff0;
|
||||
snd_soc_write(codec, RT5650_4BTN_IL_CMD1, val);
|
||||
|
||||
return btn_type;
|
||||
}
|
||||
|
||||
static int rt5645_irq_detection(struct rt5645_priv *rt5645)
|
||||
{
|
||||
int val, btn_type, gpio_state = 0, report = 0;
|
||||
|
||||
if (!rt5645->codec)
|
||||
return -EINVAL;
|
||||
return;
|
||||
|
||||
switch (rt5645->pdata.jd_mode) {
|
||||
case 0: /* Not using rt5645 JD */
|
||||
|
@ -2958,7 +2912,7 @@ static int rt5645_irq_detection(struct rt5645_priv *rt5645)
|
|||
report, SND_JACK_HEADPHONE);
|
||||
snd_soc_jack_report(rt5645->mic_jack,
|
||||
report, SND_JACK_MICROPHONE);
|
||||
return report;
|
||||
return;
|
||||
case 1: /* 2 port */
|
||||
val = snd_soc_read(rt5645->codec, RT5645_A_JD_CTRL1) & 0x0070;
|
||||
break;
|
||||
|
@ -3040,27 +2994,39 @@ static int rt5645_irq_detection(struct rt5645_priv *rt5645)
|
|||
snd_soc_jack_report(rt5645->btn_jack,
|
||||
report, SND_JACK_BTN_0 | SND_JACK_BTN_1 |
|
||||
SND_JACK_BTN_2 | SND_JACK_BTN_3);
|
||||
}
|
||||
|
||||
return report;
|
||||
static irqreturn_t rt5645_irq(int irq, void *data)
|
||||
{
|
||||
struct rt5645_priv *rt5645 = data;
|
||||
|
||||
queue_delayed_work(system_power_efficient_wq,
|
||||
&rt5645->jack_detect_work, msecs_to_jiffies(250));
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int rt5645_probe(struct snd_soc_codec *codec)
|
||||
{
|
||||
struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
|
||||
struct rt5645_priv *rt5645 = snd_soc_codec_get_drvdata(codec);
|
||||
|
||||
rt5645->codec = codec;
|
||||
|
||||
switch (rt5645->codec_type) {
|
||||
case CODEC_TYPE_RT5645:
|
||||
snd_soc_dapm_add_routes(&codec->dapm,
|
||||
snd_soc_dapm_new_controls(dapm,
|
||||
rt5645_specific_dapm_widgets,
|
||||
ARRAY_SIZE(rt5645_specific_dapm_widgets));
|
||||
snd_soc_dapm_add_routes(dapm,
|
||||
rt5645_specific_dapm_routes,
|
||||
ARRAY_SIZE(rt5645_specific_dapm_routes));
|
||||
break;
|
||||
case CODEC_TYPE_RT5650:
|
||||
snd_soc_dapm_new_controls(&codec->dapm,
|
||||
snd_soc_dapm_new_controls(dapm,
|
||||
rt5650_specific_dapm_widgets,
|
||||
ARRAY_SIZE(rt5650_specific_dapm_widgets));
|
||||
snd_soc_dapm_add_routes(&codec->dapm,
|
||||
snd_soc_dapm_add_routes(dapm,
|
||||
rt5650_specific_dapm_routes,
|
||||
ARRAY_SIZE(rt5650_specific_dapm_routes));
|
||||
break;
|
||||
|
@ -3070,9 +3036,9 @@ static int rt5645_probe(struct snd_soc_codec *codec)
|
|||
|
||||
/* for JD function */
|
||||
if (rt5645->pdata.jd_mode) {
|
||||
snd_soc_dapm_force_enable_pin(&codec->dapm, "JD Power");
|
||||
snd_soc_dapm_force_enable_pin(&codec->dapm, "LDO2");
|
||||
snd_soc_dapm_sync(&codec->dapm);
|
||||
snd_soc_dapm_force_enable_pin(dapm, "JD Power");
|
||||
snd_soc_dapm_force_enable_pin(dapm, "LDO2");
|
||||
snd_soc_dapm_sync(dapm);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -3224,7 +3190,7 @@ static int strago_quirk_cb(const struct dmi_system_id *id)
|
|||
return 1;
|
||||
}
|
||||
|
||||
static struct dmi_system_id dmi_platform_intel_braswell[] = {
|
||||
static const struct dmi_system_id dmi_platform_intel_braswell[] = {
|
||||
{
|
||||
.ident = "Intel Strago",
|
||||
.callback = strago_quirk_cb,
|
||||
|
@ -3261,7 +3227,7 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
|
|||
{
|
||||
struct rt5645_platform_data *pdata = dev_get_platdata(&i2c->dev);
|
||||
struct rt5645_priv *rt5645;
|
||||
int ret;
|
||||
int ret, i;
|
||||
unsigned int val;
|
||||
|
||||
rt5645 = devm_kzalloc(&i2c->dev, sizeof(struct rt5645_priv),
|
||||
|
@ -3295,6 +3261,24 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
|
|||
return ret;
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(rt5645->supplies); i++)
|
||||
rt5645->supplies[i].supply = rt5645_supply_names[i];
|
||||
|
||||
ret = devm_regulator_bulk_get(&i2c->dev,
|
||||
ARRAY_SIZE(rt5645->supplies),
|
||||
rt5645->supplies);
|
||||
if (ret) {
|
||||
dev_err(&i2c->dev, "Failed to request supplies: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = regulator_bulk_enable(ARRAY_SIZE(rt5645->supplies),
|
||||
rt5645->supplies);
|
||||
if (ret) {
|
||||
dev_err(&i2c->dev, "Failed to enable supplies: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
regmap_read(rt5645->regmap, RT5645_VENDOR_ID2, &val);
|
||||
|
||||
switch (val) {
|
||||
|
@ -3306,16 +3290,10 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
|
|||
break;
|
||||
default:
|
||||
dev_err(&i2c->dev,
|
||||
"Device with ID register %x is not rt5645 or rt5650\n",
|
||||
"Device with ID register %#x is not rt5645 or rt5650\n",
|
||||
val);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (rt5645->codec_type == CODEC_TYPE_RT5650) {
|
||||
ret = rt5650_calibration(rt5645);
|
||||
|
||||
if (ret < 0)
|
||||
pr_err("calibration failed!\n");
|
||||
ret = -ENODEV;
|
||||
goto err_enable;
|
||||
}
|
||||
|
||||
regmap_write(rt5645->regmap, RT5645_RESET, 0);
|
||||
|
@ -3405,8 +3383,6 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
|
|||
regmap_update_bits(rt5645->regmap, RT5645_GEN_CTRL3,
|
||||
RT5645_IRQ_CLK_GATE_CTRL,
|
||||
RT5645_IRQ_CLK_GATE_CTRL);
|
||||
regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL1,
|
||||
RT5645_CBJ_BST1_EN, RT5645_CBJ_BST1_EN);
|
||||
regmap_update_bits(rt5645->regmap, RT5645_MICBIAS,
|
||||
RT5645_IRQ_CLK_INT, RT5645_IRQ_CLK_INT);
|
||||
regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2,
|
||||
|
@ -3446,12 +3422,25 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
|
|||
ret = request_threaded_irq(rt5645->i2c->irq, NULL, rt5645_irq,
|
||||
IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING
|
||||
| IRQF_ONESHOT, "rt5645", rt5645);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
dev_err(&i2c->dev, "Failed to reguest IRQ: %d\n", ret);
|
||||
goto err_enable;
|
||||
}
|
||||
}
|
||||
|
||||
return snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5645,
|
||||
rt5645_dai, ARRAY_SIZE(rt5645_dai));
|
||||
ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5645,
|
||||
rt5645_dai, ARRAY_SIZE(rt5645_dai));
|
||||
if (ret)
|
||||
goto err_irq;
|
||||
|
||||
return 0;
|
||||
|
||||
err_irq:
|
||||
if (rt5645->i2c->irq)
|
||||
free_irq(rt5645->i2c->irq, rt5645);
|
||||
err_enable:
|
||||
regulator_bulk_disable(ARRAY_SIZE(rt5645->supplies), rt5645->supplies);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int rt5645_i2c_remove(struct i2c_client *i2c)
|
||||
|
@ -3464,10 +3453,23 @@ static int rt5645_i2c_remove(struct i2c_client *i2c)
|
|||
cancel_delayed_work_sync(&rt5645->jack_detect_work);
|
||||
|
||||
snd_soc_unregister_codec(&i2c->dev);
|
||||
regulator_bulk_disable(ARRAY_SIZE(rt5645->supplies), rt5645->supplies);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void rt5645_i2c_shutdown(struct i2c_client *i2c)
|
||||
{
|
||||
struct rt5645_priv *rt5645 = i2c_get_clientdata(i2c);
|
||||
|
||||
regmap_update_bits(rt5645->regmap, RT5645_GEN_CTRL3,
|
||||
RT5645_RING2_SLEEVE_GND, RT5645_RING2_SLEEVE_GND);
|
||||
regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL2, RT5645_CBJ_MN_JD,
|
||||
RT5645_CBJ_MN_JD);
|
||||
regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL1, RT5645_CBJ_BST1_EN,
|
||||
0);
|
||||
}
|
||||
|
||||
static struct i2c_driver rt5645_i2c_driver = {
|
||||
.driver = {
|
||||
.name = "rt5645",
|
||||
|
@ -3475,7 +3477,8 @@ static struct i2c_driver rt5645_i2c_driver = {
|
|||
.acpi_match_table = ACPI_PTR(rt5645_acpi_match),
|
||||
},
|
||||
.probe = rt5645_i2c_probe,
|
||||
.remove = rt5645_i2c_remove,
|
||||
.remove = rt5645_i2c_remove,
|
||||
.shutdown = rt5645_i2c_shutdown,
|
||||
.id_table = rt5645_i2c_id,
|
||||
};
|
||||
module_i2c_driver(rt5645_i2c_driver);
|
||||
|
|
|
@ -2115,6 +2115,7 @@ enum {
|
|||
#define RT5645_JD_PSV_MODE (0x1 << 12)
|
||||
#define RT5645_IRQ_CLK_GATE_CTRL (0x1 << 11)
|
||||
#define RT5645_MICINDET_MANU (0x1 << 7)
|
||||
#define RT5645_RING2_SLEEVE_GND (0x1 << 5)
|
||||
|
||||
/* Vendor ID (0xfd) */
|
||||
#define RT5645_VER_C 0x2
|
||||
|
@ -2181,32 +2182,6 @@ enum {
|
|||
int rt5645_sel_asrc_clk_src(struct snd_soc_codec *codec,
|
||||
unsigned int filter_mask, unsigned int clk_src);
|
||||
|
||||
struct rt5645_priv {
|
||||
struct snd_soc_codec *codec;
|
||||
struct rt5645_platform_data pdata;
|
||||
struct regmap *regmap;
|
||||
struct i2c_client *i2c;
|
||||
struct gpio_desc *gpiod_hp_det;
|
||||
struct snd_soc_jack *hp_jack;
|
||||
struct snd_soc_jack *mic_jack;
|
||||
struct snd_soc_jack *btn_jack;
|
||||
struct delayed_work jack_detect_work;
|
||||
|
||||
int codec_type;
|
||||
int sysclk;
|
||||
int sysclk_src;
|
||||
int lrck[RT5645_AIFS];
|
||||
int bclk[RT5645_AIFS];
|
||||
int master[RT5645_AIFS];
|
||||
|
||||
int pll_src;
|
||||
int pll_in;
|
||||
int pll_out;
|
||||
|
||||
int jack_type;
|
||||
bool en_button_func;
|
||||
};
|
||||
|
||||
int rt5645_set_jack_detect(struct snd_soc_codec *codec,
|
||||
struct snd_soc_jack *hp_jack, struct snd_soc_jack *mic_jack,
|
||||
struct snd_soc_jack *btn_jack);
|
||||
|
|
|
@ -179,7 +179,7 @@ static int tas571x_set_bias_level(struct snd_soc_codec *codec,
|
|||
case SND_SOC_BIAS_PREPARE:
|
||||
break;
|
||||
case SND_SOC_BIAS_STANDBY:
|
||||
if (codec->dapm.bias_level == SND_SOC_BIAS_OFF) {
|
||||
if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) {
|
||||
if (!IS_ERR(priv->mclk)) {
|
||||
ret = clk_prepare_enable(priv->mclk);
|
||||
if (ret) {
|
||||
|
|
|
@ -104,21 +104,17 @@ static int cht_aif1_hw_params(struct snd_pcm_substream *substream,
|
|||
static int cht_ti_jack_event(struct notifier_block *nb,
|
||||
unsigned long event, void *data)
|
||||
{
|
||||
|
||||
struct snd_soc_jack *jack = (struct snd_soc_jack *)data;
|
||||
struct snd_soc_dai *codec_dai = jack->card->rtd->codec_dai;
|
||||
struct snd_soc_codec *codec = codec_dai->codec;
|
||||
struct snd_soc_dapm_context *dapm = &jack->card->dapm;
|
||||
|
||||
if (event & SND_JACK_MICROPHONE) {
|
||||
|
||||
snd_soc_dapm_force_enable_pin(&codec->dapm, "SHDN");
|
||||
snd_soc_dapm_force_enable_pin(&codec->dapm, "MICBIAS");
|
||||
snd_soc_dapm_sync(&codec->dapm);
|
||||
snd_soc_dapm_force_enable_pin(dapm, "SHDN");
|
||||
snd_soc_dapm_force_enable_pin(dapm, "MICBIAS");
|
||||
snd_soc_dapm_sync(dapm);
|
||||
} else {
|
||||
|
||||
snd_soc_dapm_disable_pin(&codec->dapm, "MICBIAS");
|
||||
snd_soc_dapm_disable_pin(&codec->dapm, "SHDN");
|
||||
snd_soc_dapm_sync(&codec->dapm);
|
||||
snd_soc_dapm_disable_pin(dapm, "MICBIAS");
|
||||
snd_soc_dapm_disable_pin(dapm, "SHDN");
|
||||
snd_soc_dapm_sync(dapm);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -154,8 +154,7 @@ static const struct snd_soc_dapm_route omap3pandora_map[] = {
|
|||
|
||||
static int omap3pandora_out_init(struct snd_soc_pcm_runtime *rtd)
|
||||
{
|
||||
struct snd_soc_codec *codec = rtd->codec;
|
||||
struct snd_soc_dapm_context *dapm = &codec->dapm;
|
||||
struct snd_soc_dapm_context *dapm = &rtd->card->dapm;
|
||||
|
||||
/* All TWL4030 output pins are floating */
|
||||
snd_soc_dapm_nc_pin(dapm, "EARPIECE");
|
||||
|
@ -174,8 +173,7 @@ static int omap3pandora_out_init(struct snd_soc_pcm_runtime *rtd)
|
|||
|
||||
static int omap3pandora_in_init(struct snd_soc_pcm_runtime *rtd)
|
||||
{
|
||||
struct snd_soc_codec *codec = rtd->codec;
|
||||
struct snd_soc_dapm_context *dapm = &codec->dapm;
|
||||
struct snd_soc_dapm_context *dapm = &rtd->card->dapm;
|
||||
|
||||
/* Not comnnected */
|
||||
snd_soc_dapm_nc_pin(dapm, "HSMIC");
|
||||
|
|
|
@ -654,10 +654,12 @@ int snd_soc_suspend(struct device *dev)
|
|||
|
||||
/* suspend all CODECs */
|
||||
list_for_each_entry(codec, &card->codec_dev_list, card_list) {
|
||||
struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
|
||||
|
||||
/* If there are paths active then the CODEC will be held with
|
||||
* bias _ON and should not be suspended. */
|
||||
if (!codec->suspended) {
|
||||
switch (codec->dapm.bias_level) {
|
||||
switch (snd_soc_dapm_get_bias_level(dapm)) {
|
||||
case SND_SOC_BIAS_STANDBY:
|
||||
/*
|
||||
* If the CODEC is capable of idle
|
||||
|
@ -665,7 +667,7 @@ int snd_soc_suspend(struct device *dev)
|
|||
* means it's doing something,
|
||||
* otherwise fall through.
|
||||
*/
|
||||
if (codec->dapm.idle_bias_off) {
|
||||
if (dapm->idle_bias_off) {
|
||||
dev_dbg(codec->dev,
|
||||
"ASoC: idle_bias_off CODEC on over suspend\n");
|
||||
break;
|
||||
|
@ -2662,10 +2664,7 @@ static int snd_soc_component_initialize(struct snd_soc_component *component,
|
|||
component->probe = component->driver->probe;
|
||||
component->remove = component->driver->remove;
|
||||
|
||||
if (!component->dapm_ptr)
|
||||
component->dapm_ptr = &component->dapm;
|
||||
|
||||
dapm = component->dapm_ptr;
|
||||
dapm = &component->dapm;
|
||||
dapm->dev = dev;
|
||||
dapm->component = component;
|
||||
dapm->bias_level = SND_SOC_BIAS_OFF;
|
||||
|
@ -3047,6 +3046,7 @@ int snd_soc_register_codec(struct device *dev,
|
|||
struct snd_soc_dai_driver *dai_drv,
|
||||
int num_dai)
|
||||
{
|
||||
struct snd_soc_dapm_context *dapm;
|
||||
struct snd_soc_codec *codec;
|
||||
struct snd_soc_dai *dai;
|
||||
int ret, i;
|
||||
|
@ -3057,7 +3057,6 @@ int snd_soc_register_codec(struct device *dev,
|
|||
if (codec == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
codec->component.dapm_ptr = &codec->dapm;
|
||||
codec->component.codec = codec;
|
||||
|
||||
ret = snd_soc_component_initialize(&codec->component,
|
||||
|
@ -3087,12 +3086,14 @@ int snd_soc_register_codec(struct device *dev,
|
|||
if (codec_drv->read)
|
||||
codec->component.read = snd_soc_codec_drv_read;
|
||||
codec->component.ignore_pmdown_time = codec_drv->ignore_pmdown_time;
|
||||
codec->dapm.idle_bias_off = codec_drv->idle_bias_off;
|
||||
codec->dapm.suspend_bias_off = codec_drv->suspend_bias_off;
|
||||
|
||||
dapm = snd_soc_codec_get_dapm(codec);
|
||||
dapm->idle_bias_off = codec_drv->idle_bias_off;
|
||||
dapm->suspend_bias_off = codec_drv->suspend_bias_off;
|
||||
if (codec_drv->seq_notifier)
|
||||
codec->dapm.seq_notifier = codec_drv->seq_notifier;
|
||||
dapm->seq_notifier = codec_drv->seq_notifier;
|
||||
if (codec_drv->set_bias_level)
|
||||
codec->dapm.set_bias_level = snd_soc_codec_set_bias_level;
|
||||
dapm->set_bias_level = snd_soc_codec_set_bias_level;
|
||||
codec->dev = dev;
|
||||
codec->driver = codec_drv;
|
||||
codec->component.val_bytes = codec_drv->reg_word_size;
|
||||
|
|
|
@ -2163,14 +2163,16 @@ int snd_soc_dapm_mixer_update_power(struct snd_soc_dapm_context *dapm,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_dapm_mixer_update_power);
|
||||
|
||||
static ssize_t dapm_widget_show_codec(struct snd_soc_codec *codec, char *buf)
|
||||
static ssize_t dapm_widget_show_component(struct snd_soc_component *cmpnt,
|
||||
char *buf)
|
||||
{
|
||||
struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(cmpnt);
|
||||
struct snd_soc_dapm_widget *w;
|
||||
int count = 0;
|
||||
char *state = "not set";
|
||||
|
||||
list_for_each_entry(w, &codec->component.card->widgets, list) {
|
||||
if (w->dapm != &codec->dapm)
|
||||
list_for_each_entry(w, &cmpnt->card->widgets, list) {
|
||||
if (w->dapm != dapm)
|
||||
continue;
|
||||
|
||||
/* only display widgets that burnm power */
|
||||
|
@ -2198,7 +2200,7 @@ static ssize_t dapm_widget_show_codec(struct snd_soc_codec *codec, char *buf)
|
|||
}
|
||||
}
|
||||
|
||||
switch (codec->dapm.bias_level) {
|
||||
switch (snd_soc_dapm_get_bias_level(dapm)) {
|
||||
case SND_SOC_BIAS_ON:
|
||||
state = "On";
|
||||
break;
|
||||
|
@ -2227,8 +2229,9 @@ static ssize_t dapm_widget_show(struct device *dev,
|
|||
mutex_lock(&rtd->card->dapm_mutex);
|
||||
|
||||
for (i = 0; i < rtd->num_codecs; i++) {
|
||||
struct snd_soc_codec *codec = rtd->codec_dais[i]->codec;
|
||||
count += dapm_widget_show_codec(codec, buf + count);
|
||||
struct snd_soc_component *cmpnt = rtd->codec_dais[i]->component;
|
||||
|
||||
count += dapm_widget_show_component(cmpnt, buf + count);
|
||||
}
|
||||
|
||||
mutex_unlock(&rtd->card->dapm_mutex);
|
||||
|
|
Загрузка…
Ссылка в новой задаче