[ALSA] snd-bt87x: Power down audio ADC when not in use
Sets a bit to power down the Bt87x's internal audio ADC when the ALSA device isn't open, or when it is in 'digital mode' using an external ADC. Signed-off-by: Trent Piepho <xyzzy@speakeasy.org> Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Jaroslav Kysela <perex@suse.cz>
This commit is contained in:
parent
57bd68b8b1
commit
950fb626dc
|
@ -377,7 +377,7 @@ static struct snd_pcm_hardware snd_bt87x_analog_hw = {
|
||||||
|
|
||||||
static int snd_bt87x_set_digital_hw(struct snd_bt87x *chip, struct snd_pcm_runtime *runtime)
|
static int snd_bt87x_set_digital_hw(struct snd_bt87x *chip, struct snd_pcm_runtime *runtime)
|
||||||
{
|
{
|
||||||
chip->reg_control |= CTL_DA_IOM_DA;
|
chip->reg_control |= CTL_DA_IOM_DA | CTL_A_PWRDN;
|
||||||
runtime->hw = snd_bt87x_digital_hw;
|
runtime->hw = snd_bt87x_digital_hw;
|
||||||
runtime->hw.rates = snd_pcm_rate_to_rate_bit(chip->board.dig_rate);
|
runtime->hw.rates = snd_pcm_rate_to_rate_bit(chip->board.dig_rate);
|
||||||
runtime->hw.rate_min = chip->board.dig_rate;
|
runtime->hw.rate_min = chip->board.dig_rate;
|
||||||
|
@ -398,7 +398,7 @@ static int snd_bt87x_set_analog_hw(struct snd_bt87x *chip, struct snd_pcm_runtim
|
||||||
.rats = &analog_clock
|
.rats = &analog_clock
|
||||||
};
|
};
|
||||||
|
|
||||||
chip->reg_control &= ~CTL_DA_IOM_DA;
|
chip->reg_control &= ~(CTL_DA_IOM_DA | CTL_A_PWRDN);
|
||||||
runtime->hw = snd_bt87x_analog_hw;
|
runtime->hw = snd_bt87x_analog_hw;
|
||||||
return snd_pcm_hw_constraint_ratnums(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
|
return snd_pcm_hw_constraint_ratnums(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
|
||||||
&constraint_rates);
|
&constraint_rates);
|
||||||
|
@ -437,6 +437,11 @@ static int snd_bt87x_close(struct snd_pcm_substream *substream)
|
||||||
{
|
{
|
||||||
struct snd_bt87x *chip = snd_pcm_substream_chip(substream);
|
struct snd_bt87x *chip = snd_pcm_substream_chip(substream);
|
||||||
|
|
||||||
|
spin_lock_irq(&chip->reg_lock);
|
||||||
|
chip->reg_control |= CTL_A_PWRDN;
|
||||||
|
snd_bt87x_writel(chip, REG_GPIO_DMA_CTL, chip->reg_control);
|
||||||
|
spin_unlock_irq(&chip->reg_lock);
|
||||||
|
|
||||||
chip->substream = NULL;
|
chip->substream = NULL;
|
||||||
clear_bit(0, &chip->opened);
|
clear_bit(0, &chip->opened);
|
||||||
smp_mb__after_clear_bit();
|
smp_mb__after_clear_bit();
|
||||||
|
@ -751,7 +756,8 @@ static int __devinit snd_bt87x_create(struct snd_card *card,
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
chip->reg_control = CTL_DA_ES2 | CTL_PKTP_16 | (15 << CTL_DA_SDR_SHIFT);
|
chip->reg_control = CTL_A_PWRDN | CTL_DA_ES2 |
|
||||||
|
CTL_PKTP_16 | (15 << CTL_DA_SDR_SHIFT);
|
||||||
chip->interrupt_mask = MY_INTERRUPTS;
|
chip->interrupt_mask = MY_INTERRUPTS;
|
||||||
snd_bt87x_writel(chip, REG_GPIO_DMA_CTL, chip->reg_control);
|
snd_bt87x_writel(chip, REG_GPIO_DMA_CTL, chip->reg_control);
|
||||||
snd_bt87x_writel(chip, REG_INT_MASK, 0);
|
snd_bt87x_writel(chip, REG_INT_MASK, 0);
|
||||||
|
|
Loading…
Reference in New Issue