switch (value) { default: case 0:
ucontrol->value.enumerated.item[0] = 0; break; /* same value : (L+R)/2 and (R+L)/2 */ case 1: case 2:
ucontrol->value.enumerated.item[0] = 1; break; case 3:
ucontrol->value.enumerated.item[0] = 2; break;
}
switch (ucontrol->value.enumerated.item[0]) { default: case 0:
val = CHAN_MIX_NORMAL; break; case 1:
val = CHAN_MIX_BOTH; break; case 2:
val = CHAN_MIX_SWAP; break;
}
/* * to power down, one must: * 1.) Enable the PDN bit * 2.) enable power-down for the select channels * 3.) disable the PDN bit.
*/ staticint cs42l51_pdn_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event)
{ struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
switch (event) { case SND_SOC_DAPM_PRE_PMD:
snd_soc_component_update_bits(component, CS42L51_POWER_CTL1,
CS42L51_POWER_CTL1_PDN,
CS42L51_POWER_CTL1_PDN); break; default: case SND_SOC_DAPM_POST_PMD:
snd_soc_component_update_bits(component, CS42L51_POWER_CTL1,
CS42L51_POWER_CTL1_PDN, 0); break;
}
switch (format & SND_SOC_DAIFMT_FORMAT_MASK) { case SND_SOC_DAIFMT_I2S: case SND_SOC_DAIFMT_LEFT_J: case SND_SOC_DAIFMT_RIGHT_J:
cs42l51->audio_mode = format & SND_SOC_DAIFMT_FORMAT_MASK; break; default:
dev_err(component->dev, "invalid DAI format\n"); return -EINVAL;
}
/* * Master mode mclk/fs ratios. * Recommended configurations are SSM for 4-50khz and DSM for 50-100kHz ranges * The table below provides support of following ratios: * 128: SSM (%128) with div2 disabled * 256: SSM (%128) with div2 enabled * In both cases, if sampling rate is above 50kHz, SSM is overridden * with DSM (%128) configuration
*/ staticstruct cs42l51_ratios master_ratios[] = {
{ 128, CS42L51_SSM_MODE, 0 }, { 256, CS42L51_SSM_MODE, 1 },
};
/* Figure out which MCLK/LRCK ratio to use */
rate = params_rate(params); /* Sampling rate, in Hz */
ratio = cs42l51->mclk / rate; /* MCLK/LRCK ratio */ for (i = 0; i < nr_ratios; i++) { if (ratios[i].ratio == ratio) break;
}
if (i == nr_ratios) { /* We did not find a matching ratio */
dev_err(component->dev, "could not find matching ratio\n"); return -EINVAL;
}
switch (cs42l51->func) { case MODE_MASTER:
intf_ctl |= CS42L51_INTF_CTL_MASTER;
mode = ratios[i].speed_mode; /* Force DSM mode if sampling rate is above 50kHz */ if (rate > 50000)
mode = CS42L51_DSM_MODE;
power_ctl |= CS42L51_MIC_POWER_CTL_SPEED(mode); /* * Auto detect mode is not applicable for master mode and has to * be disabled. Otherwise SPEED[1:0] bits will be ignored.
*/
power_ctl &= ~CS42L51_MIC_POWER_CTL_AUTO; break; case MODE_SLAVE:
power_ctl |= CS42L51_MIC_POWER_CTL_SPEED(ratios[i].speed_mode); break; case MODE_SLAVE_AUTO:
power_ctl |= CS42L51_MIC_POWER_CTL_AUTO; break;
}
switch (cs42l51->audio_mode) { case SND_SOC_DAIFMT_I2S:
intf_ctl |= CS42L51_INTF_CTL_ADC_I2S;
intf_ctl |= CS42L51_INTF_CTL_DAC_FORMAT(CS42L51_DAC_DIF_I2S); break; case SND_SOC_DAIFMT_LEFT_J:
intf_ctl |= CS42L51_INTF_CTL_DAC_FORMAT(CS42L51_DAC_DIF_LJ24); break; case SND_SOC_DAIFMT_RIGHT_J: switch (params_width(params)) { case 16:
fmt = CS42L51_DAC_DIF_RJ16; break; case 18:
fmt = CS42L51_DAC_DIF_RJ18; break; case 20:
fmt = CS42L51_DAC_DIF_RJ20; break; case 24:
fmt = CS42L51_DAC_DIF_RJ24; break; default:
dev_err(component->dev, "unknown format\n"); return -EINVAL;
}
intf_ctl |= CS42L51_INTF_CTL_DAC_FORMAT(fmt); break; default:
dev_err(component->dev, "unknown format\n"); return -EINVAL;
}
if (ratios[i].mclk)
power_ctl |= CS42L51_MIC_POWER_CTL_MCLK_DIV2;
ret = snd_soc_component_write(component, CS42L51_INTF_CTL, intf_ctl); if (ret < 0) return ret;
ret = snd_soc_component_write(component, CS42L51_MIC_POWER_CTL, power_ctl); if (ret < 0) return ret;
return 0;
}
staticint cs42l51_dai_mute(struct snd_soc_dai *dai, int mute, int direction)
{ struct snd_soc_component *component = dai->component; int reg; int mask = CS42L51_DAC_OUT_CTL_DACA_MUTE|CS42L51_DAC_OUT_CTL_DACB_MUTE;
staticbool cs42l51_writeable_reg(struct device *dev, unsignedint reg)
{ switch (reg) { case CS42L51_POWER_CTL1: case CS42L51_MIC_POWER_CTL: case CS42L51_INTF_CTL: case CS42L51_MIC_CTL: case CS42L51_ADC_CTL: case CS42L51_ADC_INPUT: case CS42L51_DAC_OUT_CTL: case CS42L51_DAC_CTL: case CS42L51_ALC_PGA_CTL: case CS42L51_ALC_PGB_CTL: case CS42L51_ADCA_ATT: case CS42L51_ADCB_ATT: case CS42L51_ADCA_VOL: case CS42L51_ADCB_VOL: case CS42L51_PCMA_VOL: case CS42L51_PCMB_VOL: case CS42L51_BEEP_FREQ: case CS42L51_BEEP_VOL: case CS42L51_BEEP_CONF: case CS42L51_TONE_CTL: case CS42L51_AOUTA_VOL: case CS42L51_AOUTB_VOL: case CS42L51_PCM_MIXER: case CS42L51_LIMIT_THRES_DIS: case CS42L51_LIMIT_REL: case CS42L51_LIMIT_ATT: case CS42L51_ALC_EN: case CS42L51_ALC_REL: case CS42L51_ALC_THRES: case CS42L51_NOISE_CONF: case CS42L51_CHARGE_FREQ: returntrue; default: returnfalse;
}
}
staticbool cs42l51_readable_reg(struct device *dev, unsignedint reg)
{ switch (reg) { case CS42L51_CHIP_REV_ID: case CS42L51_POWER_CTL1: case CS42L51_MIC_POWER_CTL: case CS42L51_INTF_CTL: case CS42L51_MIC_CTL: case CS42L51_ADC_CTL: case CS42L51_ADC_INPUT: case CS42L51_DAC_OUT_CTL: case CS42L51_DAC_CTL: case CS42L51_ALC_PGA_CTL: case CS42L51_ALC_PGB_CTL: case CS42L51_ADCA_ATT: case CS42L51_ADCB_ATT: case CS42L51_ADCA_VOL: case CS42L51_ADCB_VOL: case CS42L51_PCMA_VOL: case CS42L51_PCMB_VOL: case CS42L51_BEEP_FREQ: case CS42L51_BEEP_VOL: case CS42L51_BEEP_CONF: case CS42L51_TONE_CTL: case CS42L51_AOUTA_VOL: case CS42L51_AOUTB_VOL: case CS42L51_PCM_MIXER: case CS42L51_LIMIT_THRES_DIS: case CS42L51_LIMIT_REL: case CS42L51_LIMIT_ATT: case CS42L51_ALC_EN: case CS42L51_ALC_REL: case CS42L51_ALC_THRES: case CS42L51_NOISE_CONF: case CS42L51_STATUS: case CS42L51_CHARGE_FREQ: returntrue; default: returnfalse;
}
}
/* Verify that we have a CS42L51 */
ret = regmap_read(regmap, CS42L51_CHIP_REV_ID, &val); if (ret < 0) {
dev_err(dev, "failed to read I2C\n"); goto error;
}
ret = regulator_bulk_disable(ARRAY_SIZE(cs42l51->supplies),
cs42l51->supplies); if (ret)
dev_warn(dev, "Failed to disable all regulators (%pe)\n",
ERR_PTR(ret));
}
EXPORT_SYMBOL_GPL(cs42l51_remove);
int cs42l51_suspend(struct device *dev)
{ struct cs42l51_private *cs42l51 = dev_get_drvdata(dev);
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.