#define PREFIX "ASoC omap3pandora: "
static struct regulator *omap3pandora_dac_reg;
+static struct regulator *omap3pandora_amp_reg;
static int omap3pandora_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
gpio_set_value(OMAP3_PANDORA_DAC_POWER_GPIO, 1);
} else {
gpio_set_value(OMAP3_PANDORA_DAC_POWER_GPIO, 0);
- mdelay(1);
- regulator_disable(omap3pandora_dac_reg);
+ regulator_disable_deferred(omap3pandora_dac_reg, 1);
}
return 0;
static int omap3pandora_hp_event(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *k, int event)
{
- if (SND_SOC_DAPM_EVENT_ON(event))
+ if (SND_SOC_DAPM_EVENT_ON(event)) {
+ regulator_enable(omap3pandora_amp_reg);
gpio_set_value(OMAP3_PANDORA_AMP_POWER_GPIO, 1);
- else
+ }
+ else {
gpio_set_value(OMAP3_PANDORA_AMP_POWER_GPIO, 0);
+ /* wait for the large caps to discharge, otherwise the
+ * "turn off noise" heard through the speakers takes longer */
+ regulator_disable_deferred(omap3pandora_amp_reg, 1000);
+ }
return 0;
}
goto fail3;
}
+ omap3pandora_amp_reg = regulator_get(&omap3pandora_snd_device->dev, "vdd_amp");
+ if (IS_ERR(omap3pandora_amp_reg)) {
+ pr_err(PREFIX "Failed to get amp regulator from %s: %ld\n",
+ dev_name(&omap3pandora_snd_device->dev),
+ PTR_ERR(omap3pandora_amp_reg));
+ ret = PTR_ERR(omap3pandora_amp_reg);
+ goto fail4;
+ }
+
return 0;
+fail4:
+ regulator_put(omap3pandora_dac_reg);
fail3:
platform_device_del(omap3pandora_snd_device);
fail2:
static void __exit omap3pandora_soc_exit(void)
{
regulator_put(omap3pandora_dac_reg);
+ regulator_put(omap3pandora_amp_reg);
platform_device_unregister(omap3pandora_snd_device);
gpio_free(OMAP3_PANDORA_AMP_POWER_GPIO);
gpio_free(OMAP3_PANDORA_DAC_POWER_GPIO);