/* Set the codec system clock for DAC and ADC */
ret = snd_soc_dai_set_sysclk(codec_dai, 0, 26000000,
SND_SOC_CLOCK_IN); if (ret < 0) {
pr_err(PREFIX "can't set codec system clock\n"); return ret;
}
/* Set McBSP clock to external */
ret = snd_soc_dai_set_sysclk(cpu_dai, OMAP_MCBSP_SYSCLK_CLKS_EXT,
256 * params_rate(params),
SND_SOC_CLOCK_IN); if (ret < 0) {
pr_err(PREFIX "can't set cpu system clock\n"); return ret;
}
ret = snd_soc_dai_set_clkdiv(cpu_dai, OMAP_MCBSP_CLKGDV, 8); if (ret < 0) {
pr_err(PREFIX "can't set SRG clock divider\n"); return ret;
}
return 0;
}
staticint omap3pandora_dac_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *k, int event)
{ int ret;
/* * The PCM1773 DAC datasheet requires 1ms delay between switching * VCC power on/off and /PD pin high/low
*/ if (SND_SOC_DAPM_EVENT_ON(event)) {
ret = regulator_enable(omap3pandora_dac_reg); if (ret) {
dev_err(w->dapm->dev, "Failed to power DAC: %d\n", ret); return ret;
}
mdelay(1);
gpiod_set_value(dac_power_gpio, 1);
} else {
gpiod_set_value(dac_power_gpio, 0);
mdelay(1);
regulator_disable(omap3pandora_dac_reg);
}
return 0;
}
staticint omap3pandora_hp_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *k, int event)
{ if (SND_SOC_DAPM_EVENT_ON(event))
gpiod_set_value(amp_power_gpio, 1); else
gpiod_set_value(amp_power_gpio, 0);
return 0;
}
/* * Audio paths on Pandora board: * * |O| ---> PCM DAC +-> AMP -> Headphone Jack * |M| A +--------> Line Out * |A| <~~clk~~+ * |P| <--- TWL4030 <--------- Line In and MICs
*/ staticconststruct snd_soc_dapm_widget omap3pandora_dapm_widgets[] = {
SND_SOC_DAPM_DAC_E("PCM DAC", "HiFi Playback", SND_SOC_NOPM,
0, 0, omap3pandora_dac_event,
SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
SND_SOC_DAPM_PGA_E("Headphone Amplifier", SND_SOC_NOPM,
0, 0, NULL, 0, omap3pandora_hp_event,
SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
SND_SOC_DAPM_HP("Headphone Jack", NULL),
SND_SOC_DAPM_LINE("Line Out", NULL),
ret = platform_device_add(omap3pandora_snd_device); if (ret) {
pr_err(PREFIX "Unable to add platform device\n"); goto fail2;
}
dac_power_gpio = devm_gpiod_get(&omap3pandora_snd_device->dev, "dac", GPIOD_OUT_LOW); if (IS_ERR(dac_power_gpio)) {
ret = PTR_ERR(dac_power_gpio); goto fail3;
}
amp_power_gpio = devm_gpiod_get(&omap3pandora_snd_device->dev, "amp", GPIOD_OUT_LOW); if (IS_ERR(amp_power_gpio)) {
ret = PTR_ERR(amp_power_gpio); goto fail3;
}
omap3pandora_dac_reg = regulator_get(&omap3pandora_snd_device->dev, "vcc"); if (IS_ERR(omap3pandora_dac_reg)) {
pr_err(PREFIX "Failed to get DAC regulator from %s: %ld\n",
dev_name(&omap3pandora_snd_device->dev),
PTR_ERR(omap3pandora_dac_reg));
ret = PTR_ERR(omap3pandora_dac_reg); goto fail3;
}
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.