Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6: ALSA: emu10k1 - delay the PCM interrupts (add pcm_irq_delay parameter) ALSA: hda - Fix ALC680 base model capture ASoC: Remove DSP mode support for WM8776 ALSA: hda - Add quirk for Dell Vostro 1220 ALSA: riptide - Fix detection / load of firmware files
This commit is contained in:
commit
7dfb2d4069
@ -1707,6 +1707,7 @@ struct snd_emu10k1 {
|
|||||||
unsigned int card_type; /* EMU10K1_CARD_* */
|
unsigned int card_type; /* EMU10K1_CARD_* */
|
||||||
unsigned int ecard_ctrl; /* ecard control bits */
|
unsigned int ecard_ctrl; /* ecard control bits */
|
||||||
unsigned long dma_mask; /* PCI DMA mask */
|
unsigned long dma_mask; /* PCI DMA mask */
|
||||||
|
unsigned int delay_pcm_irq; /* in samples */
|
||||||
int max_cache_pages; /* max memory size / PAGE_SIZE */
|
int max_cache_pages; /* max memory size / PAGE_SIZE */
|
||||||
struct snd_dma_buffer silent_page; /* silent page */
|
struct snd_dma_buffer silent_page; /* silent page */
|
||||||
struct snd_dma_buffer ptb_pages; /* page table pages */
|
struct snd_dma_buffer ptb_pages; /* page table pages */
|
||||||
|
@ -978,6 +978,10 @@ static int snd_pcm_do_pause(struct snd_pcm_substream *substream, int push)
|
|||||||
{
|
{
|
||||||
if (substream->runtime->trigger_master != substream)
|
if (substream->runtime->trigger_master != substream)
|
||||||
return 0;
|
return 0;
|
||||||
|
/* some drivers might use hw_ptr to recover from the pause -
|
||||||
|
update the hw_ptr now */
|
||||||
|
if (push)
|
||||||
|
snd_pcm_update_hw_ptr(substream);
|
||||||
/* The jiffies check in snd_pcm_update_hw_ptr*() is done by
|
/* The jiffies check in snd_pcm_update_hw_ptr*() is done by
|
||||||
* a delta betwen the current jiffies, this gives a large enough
|
* a delta betwen the current jiffies, this gives a large enough
|
||||||
* delta, effectively to skip the check once.
|
* delta, effectively to skip the check once.
|
||||||
|
@ -52,6 +52,7 @@ static int max_synth_voices[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 64};
|
|||||||
static int max_buffer_size[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 128};
|
static int max_buffer_size[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 128};
|
||||||
static int enable_ir[SNDRV_CARDS];
|
static int enable_ir[SNDRV_CARDS];
|
||||||
static uint subsystem[SNDRV_CARDS]; /* Force card subsystem model */
|
static uint subsystem[SNDRV_CARDS]; /* Force card subsystem model */
|
||||||
|
static uint delay_pcm_irq[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 2};
|
||||||
|
|
||||||
module_param_array(index, int, NULL, 0444);
|
module_param_array(index, int, NULL, 0444);
|
||||||
MODULE_PARM_DESC(index, "Index value for the EMU10K1 soundcard.");
|
MODULE_PARM_DESC(index, "Index value for the EMU10K1 soundcard.");
|
||||||
@ -73,6 +74,8 @@ module_param_array(enable_ir, bool, NULL, 0444);
|
|||||||
MODULE_PARM_DESC(enable_ir, "Enable IR.");
|
MODULE_PARM_DESC(enable_ir, "Enable IR.");
|
||||||
module_param_array(subsystem, uint, NULL, 0444);
|
module_param_array(subsystem, uint, NULL, 0444);
|
||||||
MODULE_PARM_DESC(subsystem, "Force card subsystem model.");
|
MODULE_PARM_DESC(subsystem, "Force card subsystem model.");
|
||||||
|
module_param_array(delay_pcm_irq, uint, NULL, 0444);
|
||||||
|
MODULE_PARM_DESC(delay_pcm_irq, "Delay PCM interrupt by specified number of samples (default 0).");
|
||||||
/*
|
/*
|
||||||
* Class 0401: 1102:0008 (rev 00) Subsystem: 1102:1001 -> Audigy2 Value Model:SB0400
|
* Class 0401: 1102:0008 (rev 00) Subsystem: 1102:1001 -> Audigy2 Value Model:SB0400
|
||||||
*/
|
*/
|
||||||
@ -127,6 +130,7 @@ static int __devinit snd_card_emu10k1_probe(struct pci_dev *pci,
|
|||||||
&emu)) < 0)
|
&emu)) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
card->private_data = emu;
|
card->private_data = emu;
|
||||||
|
emu->delay_pcm_irq = delay_pcm_irq[dev] & 0x1f;
|
||||||
if ((err = snd_emu10k1_pcm(emu, 0, NULL)) < 0)
|
if ((err = snd_emu10k1_pcm(emu, 0, NULL)) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
if ((err = snd_emu10k1_pcm_mic(emu, 1, NULL)) < 0)
|
if ((err = snd_emu10k1_pcm_mic(emu, 1, NULL)) < 0)
|
||||||
|
@ -332,7 +332,7 @@ static void snd_emu10k1_pcm_init_voice(struct snd_emu10k1 *emu,
|
|||||||
evoice->epcm->ccca_start_addr = start_addr + ccis;
|
evoice->epcm->ccca_start_addr = start_addr + ccis;
|
||||||
if (extra) {
|
if (extra) {
|
||||||
start_addr += ccis;
|
start_addr += ccis;
|
||||||
end_addr += ccis;
|
end_addr += ccis + emu->delay_pcm_irq;
|
||||||
}
|
}
|
||||||
if (stereo && !extra) {
|
if (stereo && !extra) {
|
||||||
snd_emu10k1_ptr_write(emu, CPF, voice, CPF_STEREO_MASK);
|
snd_emu10k1_ptr_write(emu, CPF, voice, CPF_STEREO_MASK);
|
||||||
@ -360,7 +360,9 @@ static void snd_emu10k1_pcm_init_voice(struct snd_emu10k1 *emu,
|
|||||||
/* Assumption that PT is already 0 so no harm overwriting */
|
/* Assumption that PT is already 0 so no harm overwriting */
|
||||||
snd_emu10k1_ptr_write(emu, PTRX, voice, (send_amount[0] << 8) | send_amount[1]);
|
snd_emu10k1_ptr_write(emu, PTRX, voice, (send_amount[0] << 8) | send_amount[1]);
|
||||||
snd_emu10k1_ptr_write(emu, DSL, voice, end_addr | (send_amount[3] << 24));
|
snd_emu10k1_ptr_write(emu, DSL, voice, end_addr | (send_amount[3] << 24));
|
||||||
snd_emu10k1_ptr_write(emu, PSST, voice, start_addr | (send_amount[2] << 24));
|
snd_emu10k1_ptr_write(emu, PSST, voice,
|
||||||
|
(start_addr + (extra ? emu->delay_pcm_irq : 0)) |
|
||||||
|
(send_amount[2] << 24));
|
||||||
if (emu->card_capabilities->emu_model)
|
if (emu->card_capabilities->emu_model)
|
||||||
pitch_target = PITCH_48000; /* Disable interpolators on emu1010 card */
|
pitch_target = PITCH_48000; /* Disable interpolators on emu1010 card */
|
||||||
else
|
else
|
||||||
@ -732,6 +734,23 @@ static void snd_emu10k1_playback_stop_voice(struct snd_emu10k1 *emu, struct snd_
|
|||||||
snd_emu10k1_ptr_write(emu, IP, voice, 0);
|
snd_emu10k1_ptr_write(emu, IP, voice, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void snd_emu10k1_playback_mangle_extra(struct snd_emu10k1 *emu,
|
||||||
|
struct snd_emu10k1_pcm *epcm,
|
||||||
|
struct snd_pcm_substream *substream,
|
||||||
|
struct snd_pcm_runtime *runtime)
|
||||||
|
{
|
||||||
|
unsigned int ptr, period_pos;
|
||||||
|
|
||||||
|
/* try to sychronize the current position for the interrupt
|
||||||
|
source voice */
|
||||||
|
period_pos = runtime->status->hw_ptr - runtime->hw_ptr_interrupt;
|
||||||
|
period_pos %= runtime->period_size;
|
||||||
|
ptr = snd_emu10k1_ptr_read(emu, CCCA, epcm->extra->number);
|
||||||
|
ptr &= ~0x00ffffff;
|
||||||
|
ptr |= epcm->ccca_start_addr + period_pos;
|
||||||
|
snd_emu10k1_ptr_write(emu, CCCA, epcm->extra->number, ptr);
|
||||||
|
}
|
||||||
|
|
||||||
static int snd_emu10k1_playback_trigger(struct snd_pcm_substream *substream,
|
static int snd_emu10k1_playback_trigger(struct snd_pcm_substream *substream,
|
||||||
int cmd)
|
int cmd)
|
||||||
{
|
{
|
||||||
@ -753,6 +772,8 @@ static int snd_emu10k1_playback_trigger(struct snd_pcm_substream *substream,
|
|||||||
/* follow thru */
|
/* follow thru */
|
||||||
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
|
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
|
||||||
case SNDRV_PCM_TRIGGER_RESUME:
|
case SNDRV_PCM_TRIGGER_RESUME:
|
||||||
|
if (cmd == SNDRV_PCM_TRIGGER_PAUSE_RELEASE)
|
||||||
|
snd_emu10k1_playback_mangle_extra(emu, epcm, substream, runtime);
|
||||||
mix = &emu->pcm_mixer[substream->number];
|
mix = &emu->pcm_mixer[substream->number];
|
||||||
snd_emu10k1_playback_prepare_voice(emu, epcm->voices[0], 1, 0, mix);
|
snd_emu10k1_playback_prepare_voice(emu, epcm->voices[0], 1, 0, mix);
|
||||||
snd_emu10k1_playback_prepare_voice(emu, epcm->voices[1], 0, 0, mix);
|
snd_emu10k1_playback_prepare_voice(emu, epcm->voices[1], 0, 0, mix);
|
||||||
@ -869,8 +890,9 @@ static snd_pcm_uframes_t snd_emu10k1_playback_pointer(struct snd_pcm_substream *
|
|||||||
#endif
|
#endif
|
||||||
/*
|
/*
|
||||||
printk(KERN_DEBUG
|
printk(KERN_DEBUG
|
||||||
"ptr = 0x%x, buffer_size = 0x%x, period_size = 0x%x\n",
|
"ptr = 0x%lx, buffer_size = 0x%lx, period_size = 0x%lx\n",
|
||||||
ptr, runtime->buffer_size, runtime->period_size);
|
(long)ptr, (long)runtime->buffer_size,
|
||||||
|
(long)runtime->period_size);
|
||||||
*/
|
*/
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
@ -310,8 +310,10 @@ snd_emu10k1_alloc_pages(struct snd_emu10k1 *emu, struct snd_pcm_substream *subst
|
|||||||
if (snd_BUG_ON(!hdr))
|
if (snd_BUG_ON(!hdr))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
idx = runtime->period_size >= runtime->buffer_size ?
|
||||||
|
(emu->delay_pcm_irq * 2) : 0;
|
||||||
mutex_lock(&hdr->block_mutex);
|
mutex_lock(&hdr->block_mutex);
|
||||||
blk = search_empty(emu, runtime->dma_bytes);
|
blk = search_empty(emu, runtime->dma_bytes + idx);
|
||||||
if (blk == NULL) {
|
if (blk == NULL) {
|
||||||
mutex_unlock(&hdr->block_mutex);
|
mutex_unlock(&hdr->block_mutex);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -3049,6 +3049,7 @@ static struct snd_pci_quirk cxt5066_cfg_tbl[] = {
|
|||||||
SND_PCI_QUIRK(0x1028, 0x02f5, "Dell",
|
SND_PCI_QUIRK(0x1028, 0x02f5, "Dell",
|
||||||
CXT5066_DELL_LAPTOP),
|
CXT5066_DELL_LAPTOP),
|
||||||
SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT5066_OLPC_XO_1_5),
|
SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT5066_OLPC_XO_1_5),
|
||||||
|
SND_PCI_QUIRK(0x1028, 0x02d8, "Dell Vostro", CXT5066_DELL_VOSTO),
|
||||||
SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTO),
|
SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTO),
|
||||||
SND_PCI_QUIRK(0x1028, 0x0408, "Dell Inspiron One 19T", CXT5066_IDEAPAD),
|
SND_PCI_QUIRK(0x1028, 0x0408, "Dell Inspiron One 19T", CXT5066_IDEAPAD),
|
||||||
SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba Satellite P500-PSPGSC-01800T", CXT5066_OLPC_XO_1_5),
|
SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba Satellite P500-PSPGSC-01800T", CXT5066_OLPC_XO_1_5),
|
||||||
|
@ -19030,6 +19030,7 @@ static int patch_alc888(struct hda_codec *codec)
|
|||||||
/*
|
/*
|
||||||
* ALC680 support
|
* ALC680 support
|
||||||
*/
|
*/
|
||||||
|
#define ALC680_DIGIN_NID ALC880_DIGIN_NID
|
||||||
#define ALC680_DIGOUT_NID ALC880_DIGOUT_NID
|
#define ALC680_DIGOUT_NID ALC880_DIGOUT_NID
|
||||||
#define alc680_modes alc260_modes
|
#define alc680_modes alc260_modes
|
||||||
|
|
||||||
@ -19044,23 +19045,93 @@ static hda_nid_t alc680_adc_nids[3] = {
|
|||||||
0x07, 0x08, 0x09
|
0x07, 0x08, 0x09
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Analog capture ADC cgange
|
||||||
|
*/
|
||||||
|
static int alc680_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
|
||||||
|
struct hda_codec *codec,
|
||||||
|
unsigned int stream_tag,
|
||||||
|
unsigned int format,
|
||||||
|
struct snd_pcm_substream *substream)
|
||||||
|
{
|
||||||
|
struct alc_spec *spec = codec->spec;
|
||||||
|
struct auto_pin_cfg *cfg = &spec->autocfg;
|
||||||
|
unsigned int pre_mic, pre_line;
|
||||||
|
|
||||||
|
pre_mic = snd_hda_jack_detect(codec, cfg->input_pins[AUTO_PIN_MIC]);
|
||||||
|
pre_line = snd_hda_jack_detect(codec, cfg->input_pins[AUTO_PIN_LINE]);
|
||||||
|
|
||||||
|
spec->cur_adc_stream_tag = stream_tag;
|
||||||
|
spec->cur_adc_format = format;
|
||||||
|
|
||||||
|
if (pre_mic || pre_line) {
|
||||||
|
if (pre_mic)
|
||||||
|
snd_hda_codec_setup_stream(codec, 0x08, stream_tag, 0,
|
||||||
|
format);
|
||||||
|
else
|
||||||
|
snd_hda_codec_setup_stream(codec, 0x09, stream_tag, 0,
|
||||||
|
format);
|
||||||
|
} else
|
||||||
|
snd_hda_codec_setup_stream(codec, 0x07, stream_tag, 0, format);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int alc680_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
|
||||||
|
struct hda_codec *codec,
|
||||||
|
struct snd_pcm_substream *substream)
|
||||||
|
{
|
||||||
|
snd_hda_codec_cleanup_stream(codec, 0x07);
|
||||||
|
snd_hda_codec_cleanup_stream(codec, 0x08);
|
||||||
|
snd_hda_codec_cleanup_stream(codec, 0x09);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct hda_pcm_stream alc680_pcm_analog_auto_capture = {
|
||||||
|
.substreams = 1, /* can be overridden */
|
||||||
|
.channels_min = 2,
|
||||||
|
.channels_max = 2,
|
||||||
|
/* NID is set in alc_build_pcms */
|
||||||
|
.ops = {
|
||||||
|
.prepare = alc680_capture_pcm_prepare,
|
||||||
|
.cleanup = alc680_capture_pcm_cleanup
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static struct snd_kcontrol_new alc680_base_mixer[] = {
|
static struct snd_kcontrol_new alc680_base_mixer[] = {
|
||||||
/* output mixer control */
|
/* output mixer control */
|
||||||
HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
|
HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
|
||||||
HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
|
HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
|
||||||
HDA_CODEC_VOLUME("Headphone Playback Volume", 0x4, 0x0, HDA_OUTPUT),
|
HDA_CODEC_VOLUME("Headphone Playback Volume", 0x4, 0x0, HDA_OUTPUT),
|
||||||
HDA_CODEC_MUTE("Headphone Playback Switch", 0x16, 0x0, HDA_OUTPUT),
|
HDA_CODEC_MUTE("Headphone Playback Switch", 0x16, 0x0, HDA_OUTPUT),
|
||||||
|
HDA_CODEC_VOLUME("Int Mic Boost", 0x12, 0, HDA_INPUT),
|
||||||
HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
|
HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
|
||||||
|
HDA_CODEC_VOLUME("Line In Boost", 0x19, 0, HDA_INPUT),
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct snd_kcontrol_new alc680_capture_mixer[] = {
|
static struct hda_bind_ctls alc680_bind_cap_vol = {
|
||||||
HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT),
|
.ops = &snd_hda_bind_vol,
|
||||||
HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT),
|
.values = {
|
||||||
HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x08, 0x0, HDA_INPUT),
|
HDA_COMPOSE_AMP_VAL(0x07, 3, 0, HDA_INPUT),
|
||||||
HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x08, 0x0, HDA_INPUT),
|
HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
|
||||||
HDA_CODEC_VOLUME_IDX("Capture Volume", 2, 0x09, 0x0, HDA_INPUT),
|
HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
|
||||||
HDA_CODEC_MUTE_IDX("Capture Switch", 2, 0x09, 0x0, HDA_INPUT),
|
0
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct hda_bind_ctls alc680_bind_cap_switch = {
|
||||||
|
.ops = &snd_hda_bind_sw,
|
||||||
|
.values = {
|
||||||
|
HDA_COMPOSE_AMP_VAL(0x07, 3, 0, HDA_INPUT),
|
||||||
|
HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
|
||||||
|
HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
|
||||||
|
0
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct snd_kcontrol_new alc680_master_capture_mixer[] = {
|
||||||
|
HDA_BIND_VOL("Capture Volume", &alc680_bind_cap_vol),
|
||||||
|
HDA_BIND_SW("Capture Switch", &alc680_bind_cap_switch),
|
||||||
{ } /* end */
|
{ } /* end */
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -19068,25 +19139,73 @@ static struct snd_kcontrol_new alc680_capture_mixer[] = {
|
|||||||
* generic initialization of ADC, input mixers and output mixers
|
* generic initialization of ADC, input mixers and output mixers
|
||||||
*/
|
*/
|
||||||
static struct hda_verb alc680_init_verbs[] = {
|
static struct hda_verb alc680_init_verbs[] = {
|
||||||
/* Unmute DAC0-1 and set vol = 0 */
|
{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
|
||||||
{0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
|
{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
|
||||||
{0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
|
{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
|
||||||
{0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
|
|
||||||
|
|
||||||
{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
|
{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
|
||||||
{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
|
{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
|
||||||
{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
|
{0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
|
||||||
{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
|
{0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
|
||||||
{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
|
{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
|
||||||
|
{0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
|
||||||
|
|
||||||
{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
|
{0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
|
||||||
{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
|
{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
|
||||||
{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
|
{0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
|
||||||
{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
|
{0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
|
||||||
{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
|
{0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
|
||||||
|
|
||||||
|
{0x16, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
|
||||||
|
{0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
|
||||||
|
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* toggle speaker-output according to the hp-jack state */
|
||||||
|
static void alc680_base_setup(struct hda_codec *codec)
|
||||||
|
{
|
||||||
|
struct alc_spec *spec = codec->spec;
|
||||||
|
|
||||||
|
spec->autocfg.hp_pins[0] = 0x16;
|
||||||
|
spec->autocfg.speaker_pins[0] = 0x14;
|
||||||
|
spec->autocfg.speaker_pins[1] = 0x15;
|
||||||
|
spec->autocfg.input_pins[AUTO_PIN_MIC] = 0x18;
|
||||||
|
spec->autocfg.input_pins[AUTO_PIN_LINE] = 0x19;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void alc680_rec_autoswitch(struct hda_codec *codec)
|
||||||
|
{
|
||||||
|
struct alc_spec *spec = codec->spec;
|
||||||
|
struct auto_pin_cfg *cfg = &spec->autocfg;
|
||||||
|
unsigned int present;
|
||||||
|
hda_nid_t new_adc;
|
||||||
|
|
||||||
|
present = snd_hda_jack_detect(codec, cfg->input_pins[AUTO_PIN_MIC]);
|
||||||
|
|
||||||
|
new_adc = present ? 0x8 : 0x7;
|
||||||
|
__snd_hda_codec_cleanup_stream(codec, !present ? 0x8 : 0x7, 1);
|
||||||
|
snd_hda_codec_setup_stream(codec, new_adc,
|
||||||
|
spec->cur_adc_stream_tag, 0,
|
||||||
|
spec->cur_adc_format);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void alc680_unsol_event(struct hda_codec *codec,
|
||||||
|
unsigned int res)
|
||||||
|
{
|
||||||
|
if ((res >> 26) == ALC880_HP_EVENT)
|
||||||
|
alc_automute_amp(codec);
|
||||||
|
if ((res >> 26) == ALC880_MIC_EVENT)
|
||||||
|
alc680_rec_autoswitch(codec);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void alc680_inithook(struct hda_codec *codec)
|
||||||
|
{
|
||||||
|
alc_automute_amp(codec);
|
||||||
|
alc680_rec_autoswitch(codec);
|
||||||
|
}
|
||||||
|
|
||||||
/* create input playback/capture controls for the given pin */
|
/* create input playback/capture controls for the given pin */
|
||||||
static int alc680_new_analog_output(struct alc_spec *spec, hda_nid_t nid,
|
static int alc680_new_analog_output(struct alc_spec *spec, hda_nid_t nid,
|
||||||
const char *ctlname, int idx)
|
const char *ctlname, int idx)
|
||||||
@ -19197,13 +19316,7 @@ static void alc680_auto_init_hp_out(struct hda_codec *codec)
|
|||||||
#define alc680_pcm_analog_capture alc880_pcm_analog_capture
|
#define alc680_pcm_analog_capture alc880_pcm_analog_capture
|
||||||
#define alc680_pcm_analog_alt_capture alc880_pcm_analog_alt_capture
|
#define alc680_pcm_analog_alt_capture alc880_pcm_analog_alt_capture
|
||||||
#define alc680_pcm_digital_playback alc880_pcm_digital_playback
|
#define alc680_pcm_digital_playback alc880_pcm_digital_playback
|
||||||
|
#define alc680_pcm_digital_capture alc880_pcm_digital_capture
|
||||||
static struct hda_input_mux alc680_capture_source = {
|
|
||||||
.num_items = 1,
|
|
||||||
.items = {
|
|
||||||
{ "Mic", 0x0 },
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* BIOS auto configuration
|
* BIOS auto configuration
|
||||||
@ -19218,6 +19331,7 @@ static int alc680_parse_auto_config(struct hda_codec *codec)
|
|||||||
alc680_ignore);
|
alc680_ignore);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
if (!spec->autocfg.line_outs) {
|
if (!spec->autocfg.line_outs) {
|
||||||
if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
|
if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
|
||||||
spec->multiout.max_channels = 2;
|
spec->multiout.max_channels = 2;
|
||||||
@ -19239,8 +19353,6 @@ static int alc680_parse_auto_config(struct hda_codec *codec)
|
|||||||
add_mixer(spec, spec->kctls.list);
|
add_mixer(spec, spec->kctls.list);
|
||||||
|
|
||||||
add_verb(spec, alc680_init_verbs);
|
add_verb(spec, alc680_init_verbs);
|
||||||
spec->num_mux_defs = 1;
|
|
||||||
spec->input_mux = &alc680_capture_source;
|
|
||||||
|
|
||||||
err = alc_auto_add_mic_boost(codec);
|
err = alc_auto_add_mic_boost(codec);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
@ -19279,17 +19391,17 @@ static struct snd_pci_quirk alc680_cfg_tbl[] = {
|
|||||||
static struct alc_config_preset alc680_presets[] = {
|
static struct alc_config_preset alc680_presets[] = {
|
||||||
[ALC680_BASE] = {
|
[ALC680_BASE] = {
|
||||||
.mixers = { alc680_base_mixer },
|
.mixers = { alc680_base_mixer },
|
||||||
.cap_mixer = alc680_capture_mixer,
|
.cap_mixer = alc680_master_capture_mixer,
|
||||||
.init_verbs = { alc680_init_verbs },
|
.init_verbs = { alc680_init_verbs },
|
||||||
.num_dacs = ARRAY_SIZE(alc680_dac_nids),
|
.num_dacs = ARRAY_SIZE(alc680_dac_nids),
|
||||||
.dac_nids = alc680_dac_nids,
|
.dac_nids = alc680_dac_nids,
|
||||||
.num_adc_nids = ARRAY_SIZE(alc680_adc_nids),
|
|
||||||
.adc_nids = alc680_adc_nids,
|
|
||||||
.hp_nid = 0x04,
|
|
||||||
.dig_out_nid = ALC680_DIGOUT_NID,
|
.dig_out_nid = ALC680_DIGOUT_NID,
|
||||||
.num_channel_mode = ARRAY_SIZE(alc680_modes),
|
.num_channel_mode = ARRAY_SIZE(alc680_modes),
|
||||||
.channel_mode = alc680_modes,
|
.channel_mode = alc680_modes,
|
||||||
.input_mux = &alc680_capture_source,
|
.unsol_event = alc680_unsol_event,
|
||||||
|
.setup = alc680_base_setup,
|
||||||
|
.init_hook = alc680_inithook,
|
||||||
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -19333,9 +19445,9 @@ static int patch_alc680(struct hda_codec *codec)
|
|||||||
setup_preset(codec, &alc680_presets[board_config]);
|
setup_preset(codec, &alc680_presets[board_config]);
|
||||||
|
|
||||||
spec->stream_analog_playback = &alc680_pcm_analog_playback;
|
spec->stream_analog_playback = &alc680_pcm_analog_playback;
|
||||||
spec->stream_analog_capture = &alc680_pcm_analog_capture;
|
spec->stream_analog_capture = &alc680_pcm_analog_auto_capture;
|
||||||
spec->stream_analog_alt_capture = &alc680_pcm_analog_alt_capture;
|
|
||||||
spec->stream_digital_playback = &alc680_pcm_digital_playback;
|
spec->stream_digital_playback = &alc680_pcm_digital_playback;
|
||||||
|
spec->stream_digital_capture = &alc680_pcm_digital_capture;
|
||||||
|
|
||||||
if (!spec->adc_nids) {
|
if (!spec->adc_nids) {
|
||||||
spec->adc_nids = alc680_adc_nids;
|
spec->adc_nids = alc680_adc_nids;
|
||||||
|
@ -1224,15 +1224,14 @@ static int try_to_load_firmware(struct cmdif *cif, struct snd_riptide *chip)
|
|||||||
firmware.firmware.ASIC, firmware.firmware.CODEC,
|
firmware.firmware.ASIC, firmware.firmware.CODEC,
|
||||||
firmware.firmware.AUXDSP, firmware.firmware.PROG);
|
firmware.firmware.AUXDSP, firmware.firmware.PROG);
|
||||||
|
|
||||||
|
if (!chip)
|
||||||
|
return 1;
|
||||||
|
|
||||||
for (i = 0; i < FIRMWARE_VERSIONS; i++) {
|
for (i = 0; i < FIRMWARE_VERSIONS; i++) {
|
||||||
if (!memcmp(&firmware_versions[i], &firmware, sizeof(firmware)))
|
if (!memcmp(&firmware_versions[i], &firmware, sizeof(firmware)))
|
||||||
break;
|
return 1; /* OK */
|
||||||
}
|
|
||||||
if (i >= FIRMWARE_VERSIONS)
|
|
||||||
return 0; /* no match */
|
|
||||||
|
|
||||||
if (!chip)
|
}
|
||||||
return 1; /* OK */
|
|
||||||
|
|
||||||
snd_printdd("Writing Firmware\n");
|
snd_printdd("Writing Firmware\n");
|
||||||
if (!chip->fw_entry) {
|
if (!chip->fw_entry) {
|
||||||
|
@ -178,13 +178,6 @@ static int wm8776_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
|
|||||||
case SND_SOC_DAIFMT_LEFT_J:
|
case SND_SOC_DAIFMT_LEFT_J:
|
||||||
iface |= 0x0001;
|
iface |= 0x0001;
|
||||||
break;
|
break;
|
||||||
/* FIXME: CHECK A/B */
|
|
||||||
case SND_SOC_DAIFMT_DSP_A:
|
|
||||||
iface |= 0x0003;
|
|
||||||
break;
|
|
||||||
case SND_SOC_DAIFMT_DSP_B:
|
|
||||||
iface |= 0x0007;
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user