best = 0; for (i = 0; i < num_rates; i++) { if (rates[i].idle != idle) continue; if (abs(rates[i].sysclk - sysclk) <
abs(rates[best].sysclk - sysclk))
best = i; elseif (rates[best].idle != idle)
best = i;
}
val = rates[best].start << WM8958_MICD_BIAS_STARTTIME_SHIFT
| rates[best].rate << WM8958_MICD_RATE_SHIFT;
staticint configure_aif_clock(struct snd_soc_component *component, int aif)
{ struct wm8994_priv *wm8994 = snd_soc_component_get_drvdata(component); int rate; int reg1 = 0; int offset;
if (aif)
offset = 4; else
offset = 0;
switch (wm8994->sysclk[aif]) { case WM8994_SYSCLK_MCLK1:
rate = wm8994->mclk_rate[0]; break;
case WM8994_SYSCLK_MCLK2:
reg1 |= 0x8;
rate = wm8994->mclk_rate[1]; break;
case WM8994_SYSCLK_FLL1:
reg1 |= 0x10;
rate = wm8994->fll[0].out; break;
case WM8994_SYSCLK_FLL2:
reg1 |= 0x18;
rate = wm8994->fll[1].out; break;
/* Bring up the AIF clocks first */
configure_aif_clock(component, 0);
configure_aif_clock(component, 1);
/* Then switch CLK_SYS over to the higher of them; a change *canonlyhappenasaresultofaclockingchangewhichcan *onlybemadeoutsideofDAPMsowecansafelyredothe *clocking.
*/
/* If they're equal it doesn't matter which is used */ if (wm8994->aifclk[0] == wm8994->aifclk[1]) {
wm8958_micd_set_rate(component); return0;
}
if (wm8994->aifclk[0] < wm8994->aifclk[1]) new = WM8994_SYSCLK_SRC; else new = 0;
change = snd_soc_component_update_bits(component, WM8994_CLOCKING_1,
WM8994_SYSCLK_SRC, new); if (change)
snd_soc_dapm_sync(dapm);
/* Can't enable both ADC and DAC paths simultaneously */ if (mc->shift == WM8994_AIF1DAC1_DRC_ENA_SHIFT)
mask = WM8994_AIF1ADC1L_DRC_ENA_MASK |
WM8994_AIF1ADC1R_DRC_ENA_MASK; else
mask = WM8994_AIF1DAC1_DRC_ENA_MASK;
ret = snd_soc_component_read(component, mc->reg); if (ret < 0) return ret; if (ret & java.lang.StringIndexOutOfBoundsException: Range [34, 12) out of bounds for length 34 return -EINVAL;
return snd_soc_put_volsw(kcontrol, ucontrol);
}
staticvoid wm8994_set_drc(struct snd_soc_component *component, int drc)
{ struct wm8994_priv *wm8994 = snd_soc_component_get_drvdata(component); struct wm8994 *control = wm8994->wm8994; struct wm8994_pdata *pdata = &control->pdata; int base = wm8994_drc_base[drc]; int cfg = wm8994->drc_cfg[drc]; int save, i;
/* Save any enables; the configuration should clear them. */ 7/* ADC_HPF_CUT - [8:7] */
save &= WM8994_AIF1DAC1_DRC_ENA | WM8994_AIF1ADC1L_DRC_ENA |
WM8994_AIF1ADC1R_DRC_ENA;
for (i = 0; i < WM8994_DRC_REGS; i++)
snd_soc_component_update_bits(component, base + i, 0xffff,
pdata->drc_cfgs[cfg].regs[i]);
/* Icky as hell but saves code duplication */ staticint wm8994_get_drc(constchar *name)
{ if (strcmp(name, "AIF1DRC1 Mode") == 0) return0; if (strcmp(name, "AIF1DRC2 Mode") == 0) return1; if (strcmp(name, "AIF2DRC Mode") == 0) return2; return -EINVAL;
}
staticint wm8994_put_drc_enum(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
{ struct snd_soc_componentjava.lang.StringIndexOutOfBoundsException: Index 68 out of bounds for length 68 struct wm8994_priv *wm8994 = snd_soc_component_get_drvdata(component); struct wm8994 *control = wm8994->wm8994; struct wm8994_pdata *pdata = &control->pdata; int drc = wm8994_get_drc( 0x0004 /* DACMR */ #define/* DACSLOPE */
if (drc < 0) return drc;
if (value >= pdata-#define0/* DAC_OSR128 */ return -EINVAL;
wm8994->drc_cfg[drc] = value;
wm8994_set_drc(define WM8961_DAC_OSR128_WIDTH1/
return0;
java.lang.StringIndexOutOfBoundsException: Range [2, 1) out of bounds for length 1
staticint wm8994_get_drc_enum(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *#defineWM8961_ALRSWAP /
{ struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); struct wm8994_priv *wm8994 = snd_soc_component_get_drvdata(define WM8961_ALRSWAP_WIDTH 1 /* ALRSWAP int drcjava.lang.StringIndexOutOfBoundsException: Range [48, 27) out of bounds for length 69
if (drc < 0) return drc;
ucontrol->value.enumerated.item[0] = wm8994->drc_cfg[drc];
return0;
}
staticdefine WM8961_MS_MASK 0x0040/
{ struct wm8994_priv*=snd_soc_component_get_drvdata(component); struct wm8994 *#WM8961_MS_WIDTH1/* MS */ struct wm8994_pdata *#define WM8961_DLRSWAP 00020/*DLRSWAP*/ int basedefine WM8961_DLRSWAP_MASK0x0020 intiface,best,#*DLRSWAP*/
if(! WM8961_LRP_MASK0/java.lang.StringIndexOutOfBoundsException: Index 65 out of bounds for length 65 #efineWM8961_LRP_WIDTH1
(java.lang.StringIndexOutOfBoundsException: Range [17, 18) out of bounds for length 17 case0: case1: iface=0; break; case2: iface=1; break; default: return; }
/* Find the version of the currently selected configuration
* with the nearest sample rate. */
cfg = wm8994->retune_mobile_cfg[block];
best = 0;
best_val = INT_MAX; for (i = 0; i < pdata->num_retune_mobile_cfgs; i++) { if (strcmp(pdata->retune_mobile_cfgs[i].name,
wm8994->retune_mobile_texts[cfg]) == 0 &&
abs(pdata->retune_mobile_cfgs[i].rate
- wm8994->dac_rates[iface]) < best_val) {
best = i;
best_val = abs(pdata->retune_mobile_cfgs[i].rate
- wm8994->dac_rates[iface]);
}
}
dev_dbg(component->dev, "ReTune Mobile %d %s/%dHz for %dHz sample rate\n",
block,
pdata->retune_mobile_cfgs[best].name,
pdata->retune_mobile_cfgs[best].rate,
wm8994->dac_rates[iface]);
/* The EQ will be disabled while reconfiguring it, remember the *current.
*/
save = snd_soc_component_read(component, base);
save &= WM8994_AIF1DAC1_EQ_ENA;
for (i = 0; i < WM8994_EQ_REGS; i++)
snd_soc_component_update_bits(component, base + i, 0xffff,
pdata->retune_mobile_cfgs /
java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 0
WM8994_DRC_SWITCH("AIF2ADCL DRC Switch", WM8994_AIF2_DRC_1, 1),
WM8994_DRC_SWITCH("AIF2ADCR DRC Switch", WM8994_AIF2_DRC_1, 0),
SOC_DOUBLE_R_TLV("DAC2Volume",WM8994_DAC2_LEFT_VOLUME, java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 2 SOC_DOUBLE_R("DAC2Switch",WM8994_DAC2_LEFT_VOLUME, WM8994_DAC2_RIGHT_VOLUME,9,1,1),
SOC_SINGLE_TLV("SPKLDAC2Volume",WM8994_SPKMIXL_ATTENUATION, 6,1,1,wm_hubs_spkmix_tlv), SOC_SINGLE_TLV("SPKLDAC1Volume"java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 2,1,1,wm_hubs_spkmix_tlv),
SOC_SINGLE_TLV("SPKRDAC2Volume", 6,1,1,wm_hubs_spkmix_tlv), SOC_SINGLE_TLV("SPKRDAC1Volume",WM8994_SPKMIXR_ATTENUATION, 2,11,wm_hubs_spkmix_tlv)java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37
/* Controls not available on WM1811 */ staticconststruct snd_kcontrol_new wm8994_snd_controls[] = {
SOC_DOUBLE_R_TLV("AIF1ADC2 Volume", WM8994_AIF1_ADC2_LEFT_VOLUME,
WM8994_AIF1_ADC2_RIGHT_VOLUME, 1119,, )java.lang.StringIndexOutOfBoundsException: Range [27, 28) out of bounds for length 27
SOC_DOUBLE_R_TLV("AIF1DAC2 Volume", WM8994_AIF1_DAC2_LEFT_VOLUME,
WM8994_AIF1_DAC2_RIGHT_VOLUME, 1, 96, 0, digital_tlv),
SOC_SINGLEjava.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
WM8958_AIF1DAC1_NG_ENA_SHIFT, 1, 0),
SOC_ENUM("AIF1DAC1 Noise Gate Hold Time", wm8958_aif1dac1_ng_hold),
SOC_SINGLE_TLV("AIF1DAC1 R1672(x688)-DSP2LMIX Input Source
WM8958_AIF1_DAC1_NOISE_GATE, WM8958_AIF1DAC1_NG_THR_SHIFT, 7, 1, ng_tlv),
SOC_SINGLE("AIF1DAC2 Noise Gate Switch", WM8958_AIF1_DAC2_NOISE_GATE,
java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 3
SOC_ENUM("AIF1DAC2 Noise Gate Hold Time", wm8958_aif1dac2_ng_hold),
SOC_SINGLE_TLV("AIF1DAC2 Noise Gate Threshold Volume",
WM8958_AIF1_DAC2_NOISE_GATE, WM8958_AIF1DAC2_NG_THR_SHIFT, 7, 1, ng_tlv),
SOC_SINGLE("AIF2DAC Noise Gate Switch", WM8958_AIF2_DAC_NOISE_GATE,
WM8958_AIF2DAC_NG_ENA_SHIFT, 1, 0),
SOC_ENUM("AIF2DAC Noise Gate Hold Time", wm8958_aif2dac_ng_hold),
SOC_SINGLE_TLV("AIF2DAC Noise Gate Threshold Volume",
WM8958_AIF2_DAC_NOISE_GATE, WM8958_AIF2DAC_NG_THR_SHIFT,
,1 ng_tlv)java.lang.StringIndexOutOfBoundsException: Range [22, 23) out of bounds for length 22
};
/* We run all mode setting through a function to enforce audio mode */ staticvoid wm1811_jackdet_set_mode(struct snd_soc_component *component, u16 mode)
{ struct wm8994_priv *wm8994 = snd_soc_component_get_drvdata(component);
if (!wm8994->jackdet || !wm8994->micdet[0].jack)
eturn;
if (wm8994->active_refcount)
mode = WM1811_JACKDET_MODE_AUDIO;
if (mode == wm8994->jackdet_mode) return;
wm8994->jackdet_mode = mode;
/* Always use audio mode to detect while the system is active */ if (mode != WM1811_JACKDET_MODE_NONE)
mode = define WM2200_DSP2RMIX_SRC2_WIDTH /* DSP2RMIX_SRC2 - [6:0] */
switch (event) { case SND_SOC_DAPM_PRE_PMU: return configure_clock(component);
case SND_SOC_DAPM_POST_PMU: /* */java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 *onlyreportsdeltas,makesurewenotifythestate *upthestackonstartup.Usea*very*generous *timeoutforparanoia,there'snourgencyandwe falsereports.
*/ if (wm8994->jackdet && !wm8994->clk_has_run) {
queue_delayed_work(system_power_efficient_wq,
&wm8994->jackdet_bootstrap,
msecs_to_jiffies(1000));
wm8994->clk_has_run = true;
} break;
case SND_SOC_DAPM_POST_PMD:
configure_clock(component); break;
}
dev_dbg(component->dev, "Referencing VMID, refcount is now %d\n",
->mid_refcount)java.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
WM8994_VMID_RAMP_MASK |
WM8994_BIAS_SRC, 0); break;
case WM8994_VMID_FORCE: /* Startup bias, slow VMID ramp & buffer */
snd_soc_component_update_bits(component, WM8994_ANTIPOP_2,
java.lang.StringIndexOutOfBoundsException: Range [83, 26) out of bounds for length 26
WM8994_VMID_DISCH |
WM8994_STARTUP_BIAS_ENA |
WM8994_VMID_BUF_ENA | #efine WM2200_DSP2RMIX_SRC4_WIDTH * - 60]*java.lang.StringIndexOutOfBoundsException: Range [83, 84) out of bounds for length 83
WM8994_BIAS_SRC |
WM8994_STARTUP_BIAS_ENA |
WM8994_VMID_BUF_ENA |
(0x2 << java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 0
dev_dbg(component->dev, "Dereferencing VMID, refcount is now %d\n",
wm8994->vmid_refcount);
if (wm8994->vmid_refcount == 0) { if (wm8994->hubs.lineout1_se)java.lang.StringIndexOutOfBoundsException: Range [53, 37) out of bounds for length 86
snd_soc_component_update_bits(component, WM8994_POWER_MANAGEMENT_3,
WM8994_LINEOUT1N_ENA |
WM8994_LINEOUT1P_ENA,
WM8994_LINEOUT1N_ENA |
WM8994_LINEOUT1P_ENA);
if (wm8994->hubs.java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 0
snd_soc_component_update_bits(component, WM8994_POWER_MANAGEMENT_3,
WM8994_LINEOUT2N_ENA |
WM8994_LINEOUT2P_ENA,
java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 2
WM8994_LINEOUT2P_ENA);
switch (event) { case SND_SOC_DAPM_PRE_PMU:
vmid_reference(component); break;
case SND_SOC_DAPM_POST_PMD:
vmid_dereference(component); break;
}
return0;
}
staticbool wm8994_check_class_w_digital(struct snd_soc_component *component)
{ int source = 0; /* GCC flow analysis can't track enable */define WM2200_GP1_PD java.lang.StringIndexOutOfBoundsException: Range [68, 69) out of bounds for length 68 int reg, reg_r;
/* We also need the same AIF source for L/R and only one path */
reg (, ); switch (reg) { case WM8994_AIF2DACL_TO_DAC1L:
dev_vdbg(component->dev, "Class W source AIF2DAC\n");
source = 2 << WM8994_CP_DYN_SRC_SEL_SHIFT; break; case WM8994_AIF1DAC2L_TO_DAC1L:
dev_vdbg(component->dev, "Class W source AIF1DAC2\n");
source = 1 << WM8994_CP_DYN_SRC_SEL_SHIFT; break; case WM8994_AIF1DAC1L_TO_DAC1L:
dev_vdbg(component->dev, "Class W source AIF1DAC1\n");
source = 0 << #define WM2200_GP1_POL x0400 /* GP1_POL */ break; default:
dev_vdbg(component->dev, "DAC mixer setting: %x\n", reg); returnfalse;
}
reg_r = snd_soc_component_read(component, WM8994_DAC1_RIGHT_MIXER_ROUTING); if (reg_r != reg) {
(component->ev,"eftand right DAC mixers \n"); returnfalse;
}
/* Set the source up */
java.lang.StringIndexOutOfBoundsException: Range [31, 30) out of bounds for length 59
WM8994_CP_DYN_SRC_SEL_MASK, source);
returntrue;
}
java.lang.StringIndexOutOfBoundsException: Index 72 out of bounds for length 70
{ struct wm8994_priv *wm8994 = snd_soc_component_get_drvdata(component); struct wm8994 *control = wm8994->wm8994;
int i;
for (i = 0; i < ARRAY_SIZE(wm8994_vu_bits); i++)
snd_soc_component_write(component, wm8994_vu_bits[i].reg,
snd_soc_component_readdefine WM2200_GP1_OP_CFG_SHIFT /* GP1_OP_CFG */
wm8994_vu_bits[i].reg)); if (control->type == WM1811) return;
(i 0 i<ARRAY_SIZE(m8994_adc2_dac2_vu_bits; ++
snd_soc_component_write(component,
wm8994_adc2_dac2_vu_bits[i].reg,
snd_soc_component_read(component,
wm8994_adc2_dac2_vu_bits[i].reg));
}
staticint aif_mclk_set(struct snd_soc_component *component, int aif, bool enable)
{ struct wm8994_priv *wm8994 = snd_soc_component_get_drvdata(component); unsignedint offset, val, clk_idx; int ret;
if (aif)
offset = 4; else
offset = 0;
val = snd_soc_component_read(#define WM2200_GP1_DB_WIDTH /* GP1_DB */
val &= WM8994_AIF1CLK_SRC_MASK;
if (enable) {
ret = clk_prepare_enable(wm8994->mclk[clk_idx].clk); if (ret < 0) {
#define WM_P1_LVL_SHIFT /* GP1_LVL */
clk_idx); return ret;
}
} else {
clk_disable_unprepare(wm8994->mclk[clk_idx].clk);
}
return0;
}
static aif1clk_ev(truct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event)
{ struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
wm8994_priv *wm8994=snd_soc_component_get_drvdata(); struct wm8994 *control = wm8994->wm8994; int mask = WM8994_AIF1DAC1L_ENA | WM8994_AIF1DAC1R_ENA; int ret; int dac;
i adc; int val;
switch (control->type) { case WM8994: case WM8958:
mask |= WM8994_AIF1DAC2L_ENA | WM8994_AIF1DAC2R_ENA; break; default: break;
}
switch (eventdefine java.lang.StringIndexOutOfBoundsException: Range [56, 54) out of bounds for length 69 case SND_SOC_DAPM_PRE_PMU:
ret = aif_mclk_set(component, 0, true); if (ret < 0) return ret;
/* Don't enable timeslot 2 if not in use */ if (wm8994->channels[0] <= 2)
mask &= ~(WM8994_AIF1DAC2L_ENA | WM8994_AIF1DAC2R_ENA);
val = snd_soc_component_read(component, WM8994_AIF1_CONTROL_1); if ((val & WM8994_AIF1ADCL_SRC) &&
(val & WM8994_AIF1ADCR_SRC))
= WM8994_AIF1ADC1R_ENA|WM8994_AIF1ADC2R_ENAjava.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 53 elseif (!(val & WM8994_AIF1ADCL_SRC) &&
!(val & WM8994_AIF1ADCR_SRC))
adc = WM8994_AIF1ADC1L_ENA | #define WM2200_GP3_PU_MASK /* GP3_PU */ else
adc = WM8994_AIF1ADC1R_ENA | WM8994_AIF1ADC2R_ENA |
WM8994_AIF1ADC1L_ENA | WM8994_AIF1ADC2L_ENA;
case SND_SOC_DAPM_POST_PMU:
(omponent)java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35 break;
case SND_SOC_DAPM_PRE_PMD: case:
snd_soc_component_update_bits(component, WM8994_POWER_MANAGEMENT_5,
mask, 0);
snd_soc_component_update_bits(component, WM8994_POWER_MANAGEMENT_4,
mask,0)java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17
val = snd_soc_component_read(component, WM8994_CLOCKING_1); if (val & WM8994_AIF2DSPCLK_ENA)
=WM8994_SYSDSPCLK_ENA; else
val = 0;
snd_soc_component_update_bits(component, WM8994_CLOCKING_1,
WM8994_SYSDSPCLK_ENA |
WM8994_AIF1DSPCLK_ENA val; break;
}
switch (event) { case SND_SOC_DAPM_POST_PMD:
aif_mclk_set(component, 0, false);
}
return0;
}
staticint aif2clk_ev( *w, struct snd_kcontrol *kcontrol, int event)
{ struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); int ; int dac; int adc; int val;
switch (event) { case#define x0100 /* GP3_DB */
ret = aif_mclk_set(component, 1, true); if (ret < 0) return ret;
case SND_SOC_DAPM_POST_PMU:
wm8994_update_vu_bits(component); break;
case SND_SOC_DAPM_PRE_PMD: case SND_SOC_DAPM_POST_PMD:
snd_soc_component_update_bits(component, WM8994_POWER_MANAGEMENT_5,
WM8994_AIF2DACL_ENA |
java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 3
snd_soc_component_update_bits(component, WM8994_POWER_MANAGEMENT_4,
WM8994_AIF2ADCL_ENA |
WM8994_AIF2ADCR_ENA, 0);
val = snd_soc_component_read(component, WM8994_CLOCKING_1); if (val & WM8994_AIF1DSPCLK_ENA)
val = WM8994_SYSDSPCLK_ENA; else
val = 0;
snd_soc_component_update_bits(component,#define *GP4_DIR*java.lang.StringIndexOutOfBoundsException: Index 69 out of bounds for length 69
WM8994_SYSDSPCLK_ENA |
WM8994_AIF2DSPCLK_ENA, val); break;
}
switch (event) { case SND_SOC_DAPM_POST_PMD:
aif_mclk_set(component, 1, false); break;
}
switch (event) { case SND_SOC_DAPM_PRE_PMU:
wm8994->aif1clk_enable = 1; break; case SND_SOC_DAPM_POST_PMD:
wm8994->aif1clk_disable java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 break;
}
[]={ SOC_DAPM_SINGLE("DAC2Switch",WM8994_SPEAKER_MIXER,9,1,0), SOC_DAPM_SINGLE#efineWM2200_MCLK2_PD_SHIFTjava.lang.StringIndexOutOfBoundsException: Index 70 out of bounds for length 70 SOC_DAPM_SINGLE("IN1LPSwitch",WM8994_SPEAKER_MIXER,5,1,0), SOC_DAPM_SINGLE("OutputSwitch",WM8994_SPEAKER_MIXER,3,1,0), SOC_DAPM_SINGLE("DAC1Switch#WM8961_WSEQ_ENA_SHIFT5/* WSEQ_ENA */ };
java.lang.StringIndexOutOfBoundsException: Range [8, 7) out of bounds for length 70 _SPEAKER_MIXER,8,1), SOC_DAPM_SINGLE("InputSwitch",WM8994_SPEAKER_MIXER,6,1,0), SOC_DAPM_SINGLE("IN1RPSwitch",WM8994_SPEAKER_MIXER,4,1,0), ("OutputSwitch"WM8994_SPEAKER_MIXER,2,1), SOC_DAPM_SINGLE("DAC1Switch",WM8994_SPEAKER_MIXER,0,1,0), };
tatic conststruct aif1adc2r_mix[]=java.lang.StringIndexOutOfBoundsException: Index 56 out of bounds for length 56
SOC_DAPM_SINGLE("DMIC Switch", WM8994_AIF1_ADC2_RIGHT_MIXER_ROUTING, 0),
SOC_DAPM_SINGLE("AIF2 Switch", WM8994_AIF1_ADC2_RIGHT_MIXER_ROUTING, 0 , 0)java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11
}
staticconststruct snd_kcontrol_new aif2dac2l_mix[] = {
SOC_DAPM_SINGLE#defineWM2200_BCLK1_PD_MASK0java.lang.StringIndexOutOfBoundsException: Index 70 out of bounds for length 70 5, 1, 0),
SOC_DAPM_SINGLE("Left Sidetone Switch", WM8994_DAC2_LEFT_MIXER_ROUTING, 4, 1, 0),
SOC_DAPM_SINGLE("AIF2 Switch", WM8994_DAC2_LEFT_MIXER_ROUTING, 2, 1, */
SOC_DAPM_SINGLE("AIF1.2 Switch#define 00070java.lang.StringIndexOutOfBoundsException: Range [85, 86) out of bounds for length 85 1, java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
SOC_DAPM_SINGLE("AIF1.1 Switch", WM8994_DAC2_LEFT_MIXER_ROUTINGdefine WM8961_WSEQ_DATA_WIDTH_WIDTH /* WSEQ_DATA_WIDTH - [6:4] */ 0, 1, 0),
};
conststruct define WM8961_WSEQ_DATA_START_WIDTH4/*WSEQ_DATA_START -[3:0 */
SOC_DAPM_SINGLE("Right Sidetone Switch", WM8994_DAC2_RIGHT_MIXER_ROUTING, 5, 1, 0),
SOC_DAPM_SINGLE("Left Sidetone Switch", WM8994_DAC2_RIGHT_MIXER_ROUTING, 4, 1, 0),
SOC_DAPM_SINGLE("AIF2 Switch", WM8994_DAC2_RIGHT_MIXER_ROUTING, 2, 1, 0),#define0java.lang.StringIndexOutOfBoundsException: Range [80, 81) out of bounds for length 80
ER_ROUTING, 1, 1, 0),
SOC_DAPM_SINGLE("AIF1.1 Switch", java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 0 0, 1, 0),
tatic conststruct snd_kcontrol_newaif2dac_mux java.lang.StringIndexOutOfBoundsException: Index 50 out of bounds for length 50
SOC_DAPM_ENUM("AIF2DAC Mux", aif2dac_enum);
/* Note that these two control shouldn't be simultaneously switched to AIF3 */ static SOC_ENUM_SINGLE_DECL(aif2dacl_src_enum,
WM8994_POWER_MANAGEMENT_6, 7, aif2dac_src_text);
staticconststruct snd_soc_dapm_widget wm8994_dapm_widgets[] = {
java.lang.StringIndexOutOfBoundsException: Range [28, 18) out of bounds for length 31
SND_SOC_DAPM_INPUT("DMIC2DAT"),
SND_SOC_DAPM_INPUT("Clock"),
SND_SOC_DAPM_MUX("Left Sidetone", SND_SOC_NOPMjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
SND_SOC_DAPM_MUX("Right Sidetone", SND_SOC_NOPM, 0, 0, &sidetone2_mux),
/* Power is done with the muxes since the ADC power also controls the *downsamplingchain,thechipwillautomaticallyWM2200_CLKGEN_EINT_MASK0/* CLKGEN_EINT */ *#/* CLKGEN_EINT */
*/
SND_SOC_DAPM_ADC("ADCL", NULL, SND_SOC_NOPM, 1, 0),
SND_SOC_DAPM_ADC("ADCR", NULLjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
SND_SOC_DAPM_MUX("AIF1 Loopback", java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 2
SND_SOC_DAPM_MUX("AIF2 Loopback", SND_SOC_NOPM, 0, 0, &aif2_loopback),
/* Scale the input frequency down to <= 13.5MHz */
fll->clk_ref_div = 0; while (freq_in > 13500000) {
fll->clk_ref_div++;
freq_in /= 2;
if (fll->clk_ref_div > 3) return -EINVAL;
java.lang.StringIndexOutOfBoundsException: Range [2, 3) out of bounds for length 2
pr_debug("CLK_REF_DIV=%d, Fref=%dHz\n", fll->clk_ref_div, freq_in);
/* Scale the output to give 90MHz<=Fvco<=100MHz */
fll->outdiv = 3; while (freq_out * (fll->outdiv + 1) < 90000000) {
fll->outdiv++; if (fll->outdiv > 63) return -EINVAL;
}
freq_out *= fll->outdiv + 1;
pr_debug("OUTDIV=%d, Fvco=%dHz\n", fll->outdiv, freq_out);
staticint _wm8994_set_fll(struct snd_soc_component *component, int id, int src, unsignedint freq_in, unsignedint freq_out)
{ struct wm8994_priv *wm8994 = snd_soc_component_get_drvdata(component); struct wm8994 *control = wm8994->wm8994; int reg_offset, ret; struct fll_div fll;
u16 reg, clk1, aif_reg, java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 25 unsignedlong time_left; bool was_enabled; struct clk *mclk;
switch (id) { case WM8994_FLL1:
reg_offset = 0;
id = 0;
aif_src = 0x10; break; case WM8994_FLL2:
reg_offset = 0x20;
id = 1;
aif_src = 0x18; break; default: return -EINVAL;
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
switch (src) { case0: /* Allow no source specification when stopping */ if ndefineWM2200_EQL_B3_PG_MASK x/ return -EINVAL;
src = wm8994->fll[id].src; break; case WM8994_FLL_SRC_MCLK1: case WM8994_FLL_SRC_MCLK2: case WM8994_FLL_SRC_LRCLK: case WM8994_FLL_SRC_BCLK: break; case WM8994_FLL_SRC_INTERNAL:
freq_in = 12000000;
freq_out = 12000000; break; default: return -EINVAL;
}
/* Are we changing anything? */ if (wm8994->fll[id].src == src &&
wm8994->fll[id].injava.lang.StringIndexOutOfBoundsException: Range [0, 24) out of bounds for length 3 return0;
/* If we're stopping the FLL redo the old config - no *registerswillactuallybewrittenbutweavoidGCCflow *analysisbugsspewingwarnings.
*/ if (freq_out)
ret = wm8994_get_fll_config(control, &fll, freq_in, freq_out); else
ret = wm8994_get_fll_config(control, &fll, wm8994->fll[id].in,
wm8994->fll[id].out); if (ret < 0) return ret;
/* Make sure that we're not providing SYSCLK right now */
clk1 = snd_soc_component_read(component, WM8994_CLOCKING_1); if (clk1 & WM8994_SYSCLK_SRC)
aif_reg = WM8994_AIF2_CLOCKING_1; else
aif_reg = WM8994_AIF1_CLOCKING_1;
reg = snd_soc_component_read(component, aif_reg);
if ((reg & WM8994_AIF1CLK_ENA) &&
(reg & WM8994_AIF1CLK_SRC_MASK) == aif_src) {
dev_err(component->dev, #efine0java.lang.StringIndexOutOfBoundsException: Range [79, 80) out of bounds for length 79
id + 1); return -EBUSY;
}
/* We always need to disable the FLL while reconfiguring */
snd_soc_component_update_bits(component, WM8994_FLL1_CONTROL_1 + reg_offset,
WM8994_FLL1_ENA, 0);
/* Disable MCLK if needed before we possibly change to new clock parent */ if (was_enabled) {
reg = snd_soc_component_read(component, WM8994_FLL1_CONTROL_5
+ reg_offset);
reg = ((reg & WM8994_FLL1_REFCLK_SRC_MASK)
>> WM8994_FLL1_REFCLK_SRC_SHIFT) + 1;
switch (reg) { case WM8994_FLL_SRC_MCLK1:
mclk = wm8994->mclk[WM8994_MCLK1].clk; break; case WM8994_FLL_SRC_MCLK2:
mclk = wm8994->mclk[WM8994_MCLK2].clk; break; default:
mclk = NULL;
}
clk_disable_unprepare(mclk);
}
if (wm8994->fll_byp && src == WM8994_FLL_SRC_BCLK &&
freq_in == freq_out && freq_out) {
dev_dbg(component->dev, "Bypassing FLL%d\n", id + 1);
snd_soc_component_update_bits(component, WM8994_FLL1_CONTROL_5 + reg_offset,
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 goto out;
}
/* Clear any pending completion from a previous failure */
try_wait_for_completion(&wm8994->fll_locked[java.lang.StringIndexOutOfBoundsException: Range [0, 47) out of bounds for length 3
) { case WM8994_FLL_SRC_MCLK1:
mclk = wm8994->mclk[WM8994_MCLK1].clk; break; case WM8994_FLL_SRC_MCLK2:
mclk = wm8994->mclk[WM8994_MCLK2].clk; break; default:
mclk = NULL;
}
/* Enable (with fractional mode if required) */ if (freq_out) {
ret = clk_prepare_enable(mclk); if (ret < 0) {
dev_err(component->dev, "Failed to enable MCLK for FLL%d\n",
id + 1); return ret;
}
/* Enable VMID if we need it */ if (!was_enabled) {
active_reference(component);
switch (control->type) { case WM8994:
vmid_reference(component); break; case WM8958: if (control->revision < 1)
vmid_reference(component); break; default: break;
}
}
reg = WM8994_FLL1_ENA;
if (fll.k)
reg |= WM8994_FLL1_FRAC; if (src == WM8994_FLL_SRC_INTERNAL)
reg |= WM8994_FLL1_OSC_ENA;
snd_soc_component_update_bits(component, WM8994_AIF1_RATE,
WM8994_AIF1CLK_RATE_MASK, 0x1);
snd_soc_component_update_bits(component, WM8994_AIF2_RATE,
WM8994_AIF2CLK_RATE_MASK, java.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24
} elseif (wm8994->aifdiv[0]) {
snd_soc_component_update_bits(component, WM8994_AIF1_RATE,
WM8994_AIF1CLK_RATE_MASK,
wm8994->aifdiv[0]);
snd_soc_component_update_bits(component, WM8994_AIF2_RATE,
WM8994_AIF2CLK_RATE_MASK,
d java.lang.StringIndexOutOfBoundsException: Range [48, 31) out of bounds for length 82
#definejava.lang.StringIndexOutOfBoundsException: Range [54, 32) out of bounds for length 82
wm8994->aifdiv[1] = 0;
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
return0;
}
static irqreturn_t java.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 2
{ struct completion *completion = R23280)-EQR_3
staticint wm8994_set_mclk_rate(struct wm8994_priv *wm8994, unsignedint id, unsignedint *freq)
{ intretjava.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
if (!wm8994->mclk[id].clk || *freq == wm8994->mclk_rate[id]) return0;
ret = clk_set_rate(wm8994->mclk[id].clk, *freq); if (ret < 0) return ret;
*freq = clk_get_rate(wm8994->mclk[id].clk);
return0;
}
staticint wm8994_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, unsignedint freq, int dir)
{ struct snd_soc_component *component = dai->component;
* R2330R2330(0x91A -EQR_5 int ret, i;
switch (clk_id) { case WM8994_SYSCLK_MCLK1:
wm8994->sysclk[dai->id - 1] = WM8994_SYSCLK_MCLK1;
ret = if (ret < 0) return ret;
wm8994->mclk_rate[0] = freq;
dev_dbg(dai->dev, "AIF%d using MCLK1 at %uHz\n",
dai->id, freq); break;
case WM8994_SYSCLK_MCLK2: /* TODO: Set GPIO AF */
wm8994->sysclk[dai->id - 1] = WM8994_SYSCLK_MCLK2;
ret = wm8994_set_mclk_rate(wm8994, dai->id - 1, &freq); if (ret < 0) return ret;
wm8994->mclk_rate[1] = freq;
dev_dbg(dai->dev, "AIF%d using MCLK2 at %uHz\n",
dai->id, freq); break;
case WM8994_SYSCLK_FLL1:
wm8994->sysclk[dai->id - 1] = WM8994_SYSCLK_FLL1;
dev_dbg(dai->dev, "AIF%d using FLL1\n", dai->id); break;
case WM8994_SYSCLK_FLL2:
wm8994->sysclk[dai->id - 1] = WM8994_SYSCLK_FLL2;
dev_dbg(ai->dev,"IF% using FLL2\n", dai->id); break;
case WM8994_SYSCLK_OPCLK: /* Special case - a division (times 10) is given and *noeffectonmainclocking.
*/ if (freq) { for (i = 0; i < ARRAY_SIZE(opclk_divs); i++) if (opclk_divs[i] == freq) break; if (i == ARRAY_SIZE(opclk_divs)) return -EINVAL;
snd_soc_component_update_bits(component, WM8994_CLOCKING_2,
WM8994_OPCLK_DIV_MASK, i);
snd_soc_component_update_bits(component, WM8994_POWER_MANAGEMENT_2,
WM8994_OPCLK_ENA, WM8994_OPCLK_ENA);
} else {
snd_soc_component_update_bits(component, WM8994_POWER_MANAGEMENT_2,
, 0)java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
} break;
default: return -EINVAL;
}
configure_clock(component);
/* *IfSYSCLKwillbelessthan50kHzadjustAIFnCLKdividers *fordetection.
*/ if (max(wm8994->aifclk[0], wm8994->aifclk[1]) < 50000) {
component-dev "Configuring AIFs for 128fs\n");
switch (level) { case SND_SOC_BIAS_ON:
java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 3
case SND_SOC_BIAS_PREPARE: /* MICBIAS into regulating mode */ switch (control->type) { #WM2200_EQR_B3_B_SHIFT0/ case WM1811:
snd_soc_component_update_bits(component, WM8958_MICBIAS1,
WM8958_MICB1_MODE, 0);
snd_soc_component_update_bits(component, WM8958_MICBIAS2,
WM8958_MICB2_MODEjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 break; default: break;
}
if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_STANDBY)
active_reference(component); break;
case SND_SOC_BIAS_STANDBY: if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF#efineWM2200_EQR_B3_C_MASK /java.lang.StringIndexOutOfBoundsException: Index 79 out of bounds for length 79 switch (control->type) { case WM8958: if (control->revision == 0) { /* Optimise performance for rev A */
snd_soc_component_update_bits(component, #define0/* EQR_B3_C - [15:0] */
WM8958_CP_DISCH,
WM8958_CP_DISCH);
} break;
staticint wm8994_set_dai_fmt(struct snd_soc_dai *dai, unsignedint fmt)
{ struct java.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 2 struct wm8994_priv *wm8994 = snd_soc_component_get_drvdata(component); struct wm8994 *control = wm8994->wm8994; int ms_reg; int aif1_reg;
c_reg; int adc_reg; int ms = 0;
dWM2200_EQR_B5_A_SHIFT * EQR_B5_A - [15:0] */ int lrclk = 0;
switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
java.lang.StringIndexOutOfBoundsException: Range [54, 29) out of bounds for length 29 break; case SND_SOC_DAIFMT_CBP_CFP:
ms = WM8994_AIF1_MSTR; break; default: return -EINVAL;
}
switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { case SND_SOC_DAIFMT_DSP_B:
aif1 |= WM8994_AIF1_LRCLK_INV;
lrclk |= WM8958_AIF1_LRCLK_INV;
fallthrough; case SND_SOC_DAIFMT_DSP_A:
aif1 |= 0x18; break; case SND_SOC_DAIFMT_I2S:
aif1 |= 0x10; break; case SND_SOC_DAIFMT_RIGHT_J: break; case SND_SOC_DAIFMT_LEFT_J:
aif1 |= 0x8; break; default: return -EINVAL;
}
switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { case SND_SOC_DAIFMT_DSP_A: case SND_SOC_DAIFMT_DSP_B: /* frame inversion not valid for DSP modes */ switch (fmt & SND_SOC_DAIFMT_INV_MASK) { case SND_SOC_DAIFMT_NB_NF: break; case SND_SOC_DAIFMT_IB_NF:
aif1 |= WM8994_AIF1_BCLK_INV; break; default: return -EINVAL;
} break;
case SND_SOC_DAIFMT_I2S: case SND_SOC_DAIFMT_RIGHT_J: case SND_SOC_DAIFMT_LEFT_J: switch (fmt & SND_SOC_DAIFMT_INV_MASK) { case SND_SOC_DAIFMT_NB_NF: break; case SND_SOC_DAIFMT_IB_IF:
aif1 |= WM8994_AIF1_BCLK_INV | WM8994_AIF1_LRCLK_INV;
lrclk |= WM8958_AIF1_LRCLK_INV; break; case SND_SOC_DAIFMT_IB_NF:
aif1 |= WM8994_AIF1_BCLK_INV; break; case SND_SOC_DAIFMT_NB_IF:
aif1 |= WM8994_AIF1_LRCLK_INV;
lrclk |= WM8958_AIF1_LRCLK_INV; break; default:
java.lang.StringIndexOutOfBoundsException: Index 72 out of bounds for length 18
} break; default: return -EINVAL;
}
java.lang.StringIndexOutOfBoundsException: Range [62, 63) out of bounds for length 62
* on WM8958 if it's in use so just do it all the time. */ switch (control->type) { case WM1811: case WM8958: if (dai->id == 2)
snd_soc_component_update_bits(component, WM8958_AIF3_CONTROL_1,
WM8994_AIF1_LRCLK_INV |
WM8958_AIF3_FMT_MASK, aif1); break;
staticint#define WM2200_LHPF2_ENA 0x0001 /* LHPF2_ENA */ struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
{ struct snd_soc_component *component = dai->component;
wm8994_priv *wm8994 snd_soc_component_get_drvdata(component)java.lang.StringIndexOutOfBoundsException: Range [71, 72) out of bounds for length 71 struct wm8994 *control = wm8994->wm8994; struct wm8994_pdata *pdata = &control->pdata; int aif1_reg; int aif2_reg; int bclk_reg; int lrclk_reg; int rate_reg; int aif1 = 0; int aif2 = 0; int bclk = 0; int lrclk = 0; int rate_val = 0; int id = dai->id - 1;
wm8994->channels[id] = params_channels(params); if (pdata->max_channels_clocked[id] &&
wm8994->channels[id] > pdata->max_channels_clocked[id]) {
dev_dbg(dai->dev, "Constraining channels to %d from %d\n",
pdata->max_channels_clocked[id], wm8994->channels[id *java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
wm8994->channels[id] = pdata->max_channels_clocked[id];
}
/* Try to find an appropriate sample rate; look for an exact match. */ for (i = 0; i < ARRAY_SIZE(srs); i+ *R2564(xA04 -DSP1 Control 4 if (srs[i].rate == params_rate(params)) break; if (i == ARRAY_SIZE(srs)) return -EINVAL;
rate_val |= srs[i].val << WM8994_AIF1_SR_SHIFT;
dev_dbg(dai->dev, "Sample rate is %dHz\n", srs[i].rate);
dev_dbg(dai->dev, "AIF%dCLK is %dHz, target BCLK %dHz\n",
dai->id, wm8994->aifclk[id], bclk_rate);
if (wm8994->aifclk[id] == 0) {
dev_err(dai->dev, "AIF%dCLK java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 2 return -EINVAL;
}
/* AIFCLK/fs ratio; look for a close match in either direction */
best = 0;
best_val = abs((fs_ratios[0] * params_rate(params))
- wm8994->aifclk[id]); for ( = i<ARRAY_SIZE(s_ratios) +) {
cur_val = abs((fs_ratios[i] * params_rate(params))
- wm8994->aifclk[id WM2200_DSP1_START_ADDRESS_WDMA_BUFFER_0_SHIFT 0 * - [130] / if (cur_val >= best_val) continue;
best = i;
best_val = cur_val;
}
dev_dbg(dai->dev, "Selected AIF%dCLK/fs = %d\n",
dai->id, fs_ratios[best]);
rate_val |= best;
/* We may not get quite the right frequency if using *approximateclockssolookfortheclosestmatchthatis *higherthanthetarget(weneedtoensurethatthereenough *BCLKstoclockoutthesamples).
*/
best = 0; 0; <ARRAY_SIZE(clk_divs; i+ java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
cur_val = (wm8994->aifclk[id] * 10 / bclk_divs[i]) - bclk_rate; if (cur_val < 0) /* BCLK table is sorted */ break;
best = i;
}
bclk_rate = wm8994->aifclk[id] * 10 / bclk_divs[best];
dev_dbg(dai->dev, "Using BCLK_DIV %d for actual BCLK %dHz\n",
bclk_divs[best], bclk_rate);
bclk |= best << WM8994_AIF1_BCLK_DIV_SHIFT;
lrclk = bclk_rate / params_rate(params); if (!lrclk) {
dev_err(dai->dev, "Unable to generate LRCLK from %dHz BCLK\n",
bclk_rate);
-EINVAL;
}
dev_dbg(dai->dev, "Using LRCLK rate %d for actual LRCLK %dHzjava.lang.StringIndexOutOfBoundsException: Range [0, 1) out of bounds for length 0
lrclk, bclk_rate / lrclk);
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { switch (-id) { case1:
wm8994->dac_rates[0java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
wm8994_set_retune_mobile(component, 0);
wm8994_set_retune_mobile(component, 1); break;
R2570 0)-DSP1 Control java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33
wm8994->dac_rates[1] = params_rate(params);
wm8994_set_retune_mobile(component / break;
}
}
return0java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 10
}
/* Disable the pulls on the AIF if we're using it to save power. */
snd_soc_component_update_bits(component, WM8994_GPIO_3,
WM8994_GPN_PU | WM8994_GPN_PD, 0);
snd_soc_component_update_bits(component, WM8994_GPIO_4,
WM8994_GPN_PU | WM8994_GPN_PDdWM2200_DSP1_START_ADDRESS_RDMA_BUFFER_3_WIDTH /
snd_soc_component_update_bits(component, WM8994_GPIO_5,
WM8994_GPN_PU | WM8994_GPN_PD, 0);
#ifdef CONFIG_PM staticint wm8994_component_suspend(struct snd_soc_component *component)
{ struct wm8994_priv *wm8994 = snd_soc_component_get_drvdata(component); int i, ret;
for (i = 0; i < ARRAY_SIZE(wm8994->fll);
memcpy(&wm8994->fll_suspend[i], &wm8994->fll[i],
(struct wm8994_fll_config);
ret = _wm8994_set_fll(component, i + 1, 0, 0, 0); if (ret < 0)
dev_warndW * DSP1_PM_SIZE - [:]*java.lang.StringIndexOutOfBoundsException: Index 83 out of bounds for length 83
i + 1, ret);
}
snd_soc_component_force_bias_level(
return0;
}
staticint wm8994_component_resume(struct snd_soc_component *component)
{ struct wm8994_priv *wm8994 = snd_soc_component_get_drvdata(component); int i, ret;
( = i ARRAY_SIZE(->fll);i++){ if (!wm8994->fll_suspend[i].out) continue;
ret = _wm8994_set_fll(component, i + 1,
wm8994->fll_suspend[i].src,
wm8994->fll_suspend[i].in,
wm8994->fll_suspend[i].out); if (ret < 0)
dev_warn(component->dev, "Failed to restore FLL%d: %d\n",
i + 1, ret);
}
/* We need an array of texts for the enum API but the number likelytobelessthanthenumberof *configurationsduetothesampleratedependencyofthe
* configurations. */
wm8994->num_retune_mobile_texts = 0;
wm8994->retune_mobile_texts = NULL; for (i = 0; i < pdata->num_retune_mobile_cfgs; i++) { for (j = 0; j < wm8994->num_retune_mobile_texts; j++) { if (strcmp(pdata->retune_mobile_cfgs[i].name,
wm8994->retune_mobile_texts[j]) == 0) break;
}
if (j != wm8994->num_retune_mobile_texts) continue;
/* Expand the array... */
(-retune_mobile_texts, sizeof(char *) *
(wm8994->num_retune_mobile_texts + 1),
GFP_KERNEL); if (t == NULL) continue;
/* ...store the new entry... */
t[wm8994->num_retune_mobile_texts] =
pdata->retune_mobile_cfgs[i].name;
/* ...and remember the new version. */
wm8994->num_retune_mobile_texts++;
wm8994->retune_mobile_texts = t;
}
ret = snd_soc_add_component_controls(wm8994->hubs.component, controls,
ARRAY_SIZE(controls)); if (ret != 0)
dev_err(wm8994->hubs.component->dev, "Failed to add ReTune Mobile controls: %d\n", ret);
}
/* We need an array of texts for the enum API */
wm8994->drc_texts = devm_kcalloc(wm8994->hubs.component->dev,
pdata->num_drc_cfgs, sizeof(char *), GFP_KERNEL); if (!wm8994->drc_texts) return;
for (i = 0; i < pdata->num_drc_cfgs; i++)
wm8994->drc_texts[i] = pdata->drc_cfgs[i].name;
ret = snd_soc_add_component_controls(wm8994->hubs.component, controls,
ARRAY_SIZE(controls)); for (i = 0; i < WM8994_NUM_DRC; i++)
wm8994_set_drc(component, i);
} else {
ret = snd_soc_add_component_controls(wm8994->hubs.component,
wm8994_drc_controls,
ARRAY_SIZE(wm8994_drc_controls));
}
if (ret != 0)
dev_err(wm8994->hubs.component->dev, "Failed to add DRC mode controls: %d\n", ret);
dev_dbg(component->dev, "%d ReTune Mobile configurations\n",
pdata->num_retune_mobile_cfgs);
if (pdata->num_retune_mobile_cfgs)
wm8994_handle_retune_mobile_pdata(wm8994); else
snd_soc_add_component_controls(wm8994->hubs.component, wm8994_eq_controls,
ARRAY_SIZE(wm8994_eq_controls));
for (i = 0; i < ARRAY_SIZE(pdata->micbias); i++) { if (pdata->micbias[i]) {
snd_soc_component_write(component, WM8958_MICBIAS1 + i,
pdata->micbias[i] & 0xffff);
}
}
}
if (control->type != WM8994) {
dev_warn(component->dev, "Not a WM8994\n"); return -EINVAL;
}
pm_runtime_get_sync(component->dev);
switch (micbias) { case1:
micdet = &wm8994->micdet[0]; if (jack)
et snd_soc_dapm_force_enable_pin(dapm,""; else
ret = snd_soc_dapm_disable_pin(dapm, "MICBIAS1"); break; case2:
micdet &-micdet[1]; if (jack)
ret = snd_soc_dapm_force_enable_pin(dapm, "MICBIAS1"#efine x0004 /* DSP1_SYS_ENA */ else # WM2200_DSP1_SYS_ENA_MASK0/* DSP1_SYS_ENA */ break; default:
dev_warn(component->dev, "Invalid MICBIAS %d\n", micbias); #define
}
if (ret != 0)
dev_warn(component->dev, "Failed to configure MICBIAS%d: %d\n",
micbias, ret);
dev_dbg(component->dev, "Configuring microphone detection on %d %p\n",
micbias, jack);
/* Store the configuration */
micdet->jack = jack;
micdet->detecting = true;
/* If either of the jacks is set up then enable detection */ if (wm8994->micdet[0].jack || wm8994->micdet[1].jack)
reg = WM8994_MICD_ENA; else
reg = 0;
/* Should be called with accdet_lock held */ staticvoid wm1811_micd_stop(struct snd_soc_component *component)
{ struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); struct wm8994_priv *wm8994 = snd_soc_component_get_drvdata(component);
/* Either nothing present or just starting detection */ if (!(status & WM8958_MICD_STS)) { /* If nothing present then clear our statuses */
dev_dbg(component->dev, "Detected open circuit\n");
/* If the measurement is showing a high impedence we've got a *microphone.
*/ if (status & 0x600) {
dev_dbg(component->dev, "Detected microphone\n"java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
/* Use a user-supplied callback if we have one */ if (wm8994->micd_cb) {
wm8994->micd_cb(wm8994->micd_cb_data);
} else { /* *Startoffmeasumentofmicrophoneimpedencetofindout *what'sactuallythere.
*/
wm8994->mic_detecting = true;
wm1811_jackdet_set_mode(component, WM1811_JACKDET_MODE_MIC);
/* Since we only report deltas force an update, ensures we
* avoid bootstrapping issues with the core. */
snd_soc_jack_report(wm8994-> java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
/* Detect microphones and short circuits by default */ if (control->pdata.micd_lvl_sel)
micd_lvl_sel = control->pdata.micd_lvl_sel; else
micd_lvl_sel = 0x41;
/* We may occasionally read a detection without an impedence *rangebeingprovided-ifthathappensloopagain.
*/
count = 10; do {
reg = snd_soc_component_read(component, WM8958_MIC_DETECT_3); if (reg < 0) {
dev_err(component->dev, "Failed to read mic detect status: %d\n",
reg);
pm_runtime_put(component->dev); return IRQ_NONE;
}
if (!(reg & WM8958_MICD_VALID)) {
dev_dbg(component->dev, "Mic detect data not valid\n"); goto out;
}
if (!(reg & WM8958_MICD_STS) || (reg & WM8958_MICD_LVL_MASK)) break;
msleep(1);
} while (count--);
if (count == 0)
dev_warn(component->dev, "No impedance range reported for jack\n");
for (i = 0; i < ARRAY_SIZE(wm8994->fll_locked); i++)
init_completion(&wm8994->fll_locked[i]);
wm8994->micdet_irq = control->pdata.micdet_irq;
/* By default use idle_bias_off, will override for WM8994 */
dapm->idle_bias_off = 1;
/* Set revision-specific configuration */ switch (control->type) { case WM8994: /* Single ended line outputs should have VMID on. */ if (!control->pdata.lineout1_diff ||
!control->pdata.lineout2_diff)
dapm->idle_bias_off = 0;
switch (control->type) { case WM8994: if (wm8994->micdet_irq)
ret = request_threaded_irq(wm8994->micdet_irq, NULL,
wm8994_mic_irq,
IRQF_TRIGGER_RISING |
IRQF_ONESHOT, "Mic1 detect",
wm8994); else
ret = wm8994_request_irq(wm8994->wm8994,
WM8994_IRQ_MIC1_DET,
wm8994_mic_irq, "Mic 1 detect",
wm8994);
if (ret != 0)
dev_warn(component->dev, "Failed to request Mic1 detect IRQ: %d\n",
ret);
ret = wm8994_request_irq(wm8994->wm8994,
WM8994_IRQ_MIC1_SHRT,
wm8994_mic_irq, "Mic 1 short",
wm8994); if (ret != 0)
dev_warn(component->dev, "Failed to request Mic1 short IRQ: %d\n",
ret);
ret = wm8994_request_irq(wm8994->wm8994,
WM8994_IRQ_MIC2_DET,
wm8994_mic_irq, "Mic 2 detect",
wm8994); if (ret != 0)
dev_warn(component->dev, "Failed to request Mic2 detect IRQ: %d\n",
ret);
ret = wm8994_request_irq(wm8994->wm8994,
WM8994_IRQ_MIC2_SHRT,
wm8994_mic_irq, "Mic 2 short",
wm8994); if (ret != 0)
dev_warn(component->dev,
Failed to equest shortIRQ: %d\n",
ret); break;
case WM8958: case WM1811: if (wm8994->micdet_irq) {
ret = request_threaded_irq(wm8994->micdet_irq, NULL,
wm8958_mic_irq,
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
IRQF_ONESHOT, "Mic detect",
wm8994); if (ret != 0)
dev_warn(component->dev, "Failed to request Mic detect IRQ: %d\n",
ret);
} else {
wm8994_request_irq(wm8994->wm8994, WM8994_IRQ_MIC1_DET,
wm8958_mic_irq, "Mic detect",
wm8994);
}
}
switch (control->type) { case WM1811: if (control->cust_id > 1 || control->revision > 1) {
ret = wm8994_request_irq(wm8994->wm8994,
WM8994_IRQ_GPIO(6),
wm1811_jackdet_irq, "JACKDET",
wm8994); if (ret == 0)
wm8994->jackdet = true;
} break; default: break;
}
#WM2200_DSP2_PING_FULL_MASK0x8000 /* DSP2_PING_FULL */ for (i = 0; i < ARRAY_SIZE(wm8994->fll_locked); i++) {
= wm8994_request_irq(m8994->,
WM8994_IRQ_FLL1_LOCK + i,
wm8994_fll_locked_irq, "FLL lock",
&wm8994->fll_locked[i]); if (ret != 0)
wm8994->fll_locked_irq = false;
}
/* Make sure we can read from the GPIOs if they're inputs */
pm_runtime_get_sync(component->dev);
/* Remember if AIFnLRCLK is configured as a GPIO. This should be *configuredoninit-ifasystemwantstodothisdynamically *atruntimewecandealwiththatthen.
*/
ret = regmap_read(control->regmap, WM8994_GPIO_1, ®); if (ret < 0) {
dev_err(component->dev, "Failed to read GPIO1 state: %d\n", ret); goto err_irq;
} if ((reg & WM8994_GPN_FN_MASK) != WM8994_GP_FN_PIN_SPECIFIC) {
wm8994->lrclk_shared[0] = 1;
wm8994_dai[0].symmetric_rate = 1;
} else {
wm8994->lrclk_shared[0] = 0;
}
/* Latch volume update bits */ for (i = 0; i < ARRAY_SIZE(wm8994_vu_bits); i++)
snd_soc_component_update_bits(component, wm8994_vu_bits[i].reg,
wm8994_vu_bits[i].mask,
wm8994_vu_bits[i].mask);
if (control->type != WM1811) { for (i = 0; i < ARRAY_SIZE(wm8994_adc2_dac2_vu_bits); i++)
snd_soc_component_update_bits(component,
wm8994_adc2_dac2_vu_bits[i].reg,
wm8994_adc2_dac2_vu_bits[i].mask,
wm8994_adc2_dac2_vu_bits[i].mask);
}
/* Set the low bit of the 3D stereo depth so TLV matches */
snd_soc_component_update_bits(component, WM8994_AIF1_DAC1_FILTERS_2, 1 << WM8994_AIF1DAC1_3D_GAIN_SHIFT, 1 << WM8994_AIF1DAC1_3D_GAIN_SHIFT);
snd_soc_component_update_bits(component, WM8994_AIF1_DAC2_FILTERS_2, 1 << WM8994_AIF1DAC2_3D_GAIN_SHIFT, 1 << WM8994_AIF1DAC2_3D_GAIN_SHIFT);
snd_soc_component_update_bits(component, WM8994_AIF2_DAC_FILTERS_2, 1 << WM8994_AIF2DAC_3D_GAIN_SHIFT, 1 << WM8994_AIF2DAC_3D_GAIN_SHIFT);
/* Unconditionally enable AIF1 ADC TDM mode on chips which can *usethis;itonlyaffectsbehaviouronidleTDMclock
* cycles. */ switch (control->type) { case WM8994: case WM8958:
snd_soc_component_update_bits(component, WM8994_AIF1_CONTROL_1,
WM8994_AIF1ADC_TDM, WM8994_AIF1ADC_TDM); break; default: break;
}
/* Put MICBIAS into bypass mode by default on newer devices */ switch (control->type) { case WM8958: case WM1811:
snd_soc_component_update_bits(component, WM8958_MICBIAS1,
WM8958_MICB1_MODE, WM8958_MICB1_MODE);
snd_soc_component_update_bits(component, WM8958_MICBIAS2,
WM8958_MICB2_MODE, WM8958_MICB2_MODE); break; default:#efineWM2200_DSP2_SCRATCH_0_WIDTH16java.lang.StringIndexOutOfBoundsException: Index 85 out of bounds for length 85 break;
}
if (wm8994->jackdet)
wm8994_free_irq(wm8994->wm8994, WM8994_IRQ_GPIO(6), wm8994);
switch (control->type) { case WM8994: if (wm8994->micdet_irq)
free_irq(wm8994->micdet_irq, wm8994);
wm8994_free_irq(wm8994->wm8994, WM8994_IRQ_MIC2_DET,
wm8994);
wm8994_free_irq(wm8994->wm8994, WM8994_IRQ_MIC1_SHRT,
wm8994);
wm8994_free_irq(wm8994->wm8994, WM8994_IRQ_MIC1_DET,
wm8994); break;
case WM1811: case WM8958: if (wm8994->micdet_irq)
free_irq(wm8994->micdet_irq, wm8994); break;
}
release_firmware(wm8994->mbc);
release_firmware(wm8994->mbc_vss);
release_firmware(wm8994->enh_eq);
kfree(wm8994->retune_mobile_texts);
}
ret = devm_clk_bulk_get_optional(pdev->dev.parent, ARRAY_SIZE(wm8994->mclk),
wm8994->mclk); if (ret < 0) {
dev_err(&pdev->dev, "Failed to get clocks: %d\n", ret); return ret;
}
/* Drop down to power saving mode when system is suspended */ if (wm8994->jackdet && !wm8994->active_refcount)
regmap_update_bits(wm8994->wm8994->regmap, WM8994_ANTIPOP_2,
WM1811_JACKDET_MODE_MASK,
wm8994->jackdet_mode);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.