Commit cf30f46a authored by Takashi Iwai's avatar Takashi Iwai

Merge branch 'for-linus' into for-next

Back-merged for refactoring beep stuff.
parents 0959f22e a86b1a2c
...@@ -912,7 +912,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. ...@@ -912,7 +912,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
models depending on the codec chip. The list of available models models depending on the codec chip. The list of available models
is found in HD-Audio-Models.txt is found in HD-Audio-Models.txt
The model name "genric" is treated as a special case. When this The model name "generic" is treated as a special case. When this
model is given, the driver uses the generic codec parser without model is given, the driver uses the generic codec parser without
"codec-patch". It's sometimes good for testing and debugging. "codec-patch". It's sometimes good for testing and debugging.
......
...@@ -285,7 +285,7 @@ sample data. ...@@ -285,7 +285,7 @@ sample data.
<H4> <H4>
7.2.4 Close Callback</H4> 7.2.4 Close Callback</H4>
The <TT>close</TT> callback is called when this device is closed by the The <TT>close</TT> callback is called when this device is closed by the
applicaion. If any private data was allocated in open callback, it must application. If any private data was allocated in open callback, it must
be released in the close callback. The deletion of ALSA port should be be released in the close callback. The deletion of ALSA port should be
done here, too. This callback must not be NULL. done here, too. This callback must not be NULL.
<H4> <H4>
......
...@@ -285,7 +285,12 @@ local_event(struct seq_oss_devinfo *dp, union evrec *q, struct snd_seq_event *ev ...@@ -285,7 +285,12 @@ local_event(struct seq_oss_devinfo *dp, union evrec *q, struct snd_seq_event *ev
static int static int
note_on_event(struct seq_oss_devinfo *dp, int dev, int ch, int note, int vel, struct snd_seq_event *ev) note_on_event(struct seq_oss_devinfo *dp, int dev, int ch, int note, int vel, struct snd_seq_event *ev)
{ {
struct seq_oss_synthinfo *info = &dp->synths[dev]; struct seq_oss_synthinfo *info;
if (!snd_seq_oss_synth_is_valid(dp, dev))
return -ENXIO;
info = &dp->synths[dev];
switch (info->arg.event_passing) { switch (info->arg.event_passing) {
case SNDRV_SEQ_OSS_PROCESS_EVENTS: case SNDRV_SEQ_OSS_PROCESS_EVENTS:
if (! info->ch || ch < 0 || ch >= info->nr_voices) { if (! info->ch || ch < 0 || ch >= info->nr_voices) {
...@@ -340,7 +345,12 @@ note_on_event(struct seq_oss_devinfo *dp, int dev, int ch, int note, int vel, st ...@@ -340,7 +345,12 @@ note_on_event(struct seq_oss_devinfo *dp, int dev, int ch, int note, int vel, st
static int static int
note_off_event(struct seq_oss_devinfo *dp, int dev, int ch, int note, int vel, struct snd_seq_event *ev) note_off_event(struct seq_oss_devinfo *dp, int dev, int ch, int note, int vel, struct snd_seq_event *ev)
{ {
struct seq_oss_synthinfo *info = &dp->synths[dev]; struct seq_oss_synthinfo *info;
if (!snd_seq_oss_synth_is_valid(dp, dev))
return -ENXIO;
info = &dp->synths[dev];
switch (info->arg.event_passing) { switch (info->arg.event_passing) {
case SNDRV_SEQ_OSS_PROCESS_EVENTS: case SNDRV_SEQ_OSS_PROCESS_EVENTS:
if (! info->ch || ch < 0 || ch >= info->nr_voices) { if (! info->ch || ch < 0 || ch >= info->nr_voices) {
......
...@@ -290,11 +290,11 @@ int snd_seq_timer_open(struct snd_seq_queue *q) ...@@ -290,11 +290,11 @@ int snd_seq_timer_open(struct snd_seq_queue *q)
tid.device = SNDRV_TIMER_GLOBAL_SYSTEM; tid.device = SNDRV_TIMER_GLOBAL_SYSTEM;
err = snd_timer_open(&t, str, &tid, q->queue); err = snd_timer_open(&t, str, &tid, q->queue);
} }
}
if (err < 0) { if (err < 0) {
snd_printk(KERN_ERR "seq fatal error: cannot create timer (%i)\n", err); snd_printk(KERN_ERR "seq fatal error: cannot create timer (%i)\n", err);
return err; return err;
} }
}
t->callback = snd_seq_timer_interrupt; t->callback = snd_seq_timer_interrupt;
t->callback_data = q; t->callback_data = q;
t->flags |= SNDRV_TIMER_IFLG_AUTO; t->flags |= SNDRV_TIMER_IFLG_AUTO;
......
...@@ -213,7 +213,10 @@ static int slave_put(struct snd_kcontrol *kcontrol, ...@@ -213,7 +213,10 @@ static int slave_put(struct snd_kcontrol *kcontrol,
} }
if (!changed) if (!changed)
return 0; return 0;
return slave_put_val(slave, ucontrol); err = slave_put_val(slave, ucontrol);
if (err < 0)
return err;
return 1;
} }
static int slave_tlv_cmd(struct snd_kcontrol *kcontrol, static int slave_tlv_cmd(struct snd_kcontrol *kcontrol,
......
...@@ -545,6 +545,9 @@ static void seq_chn_common_event(unsigned char *event_rec) ...@@ -545,6 +545,9 @@ static void seq_chn_common_event(unsigned char *event_rec)
case MIDI_PGM_CHANGE: case MIDI_PGM_CHANGE:
if (seq_mode == SEQ_2) if (seq_mode == SEQ_2)
{ {
if (chn > 15)
break;
synth_devs[dev]->chn_info[chn].pgm_num = p1; synth_devs[dev]->chn_info[chn].pgm_num = p1;
if ((int) dev >= num_synths) if ((int) dev >= num_synths)
synth_devs[dev]->set_instr(dev, chn, p1); synth_devs[dev]->set_instr(dev, chn, p1);
...@@ -596,6 +599,9 @@ static void seq_chn_common_event(unsigned char *event_rec) ...@@ -596,6 +599,9 @@ static void seq_chn_common_event(unsigned char *event_rec)
case MIDI_PITCH_BEND: case MIDI_PITCH_BEND:
if (seq_mode == SEQ_2) if (seq_mode == SEQ_2)
{ {
if (chn > 15)
break;
synth_devs[dev]->chn_info[chn].bender_value = w14; synth_devs[dev]->chn_info[chn].bender_value = w14;
if ((int) dev < num_synths) if ((int) dev < num_synths)
......
...@@ -2549,7 +2549,7 @@ static int snd_asihpi_sampleclock_add(struct snd_card_asihpi *asihpi, ...@@ -2549,7 +2549,7 @@ static int snd_asihpi_sampleclock_add(struct snd_card_asihpi *asihpi,
static int snd_card_asihpi_mixer_new(struct snd_card_asihpi *asihpi) static int snd_card_asihpi_mixer_new(struct snd_card_asihpi *asihpi)
{ {
struct snd_card *card = asihpi->card; struct snd_card *card;
unsigned int idx = 0; unsigned int idx = 0;
unsigned int subindex = 0; unsigned int subindex = 0;
int err; int err;
...@@ -2557,6 +2557,7 @@ static int snd_card_asihpi_mixer_new(struct snd_card_asihpi *asihpi) ...@@ -2557,6 +2557,7 @@ static int snd_card_asihpi_mixer_new(struct snd_card_asihpi *asihpi)
if (snd_BUG_ON(!asihpi)) if (snd_BUG_ON(!asihpi))
return -EINVAL; return -EINVAL;
card = asihpi->card;
strcpy(card->mixername, "Asihpi Mixer"); strcpy(card->mixername, "Asihpi Mixer");
err = err =
......
...@@ -494,7 +494,7 @@ static unsigned int get_num_conns(struct hda_codec *codec, hda_nid_t nid) ...@@ -494,7 +494,7 @@ static unsigned int get_num_conns(struct hda_codec *codec, hda_nid_t nid)
int snd_hda_get_num_raw_conns(struct hda_codec *codec, hda_nid_t nid) int snd_hda_get_num_raw_conns(struct hda_codec *codec, hda_nid_t nid)
{ {
return get_num_conns(codec, nid) & AC_CLIST_LENGTH; return snd_hda_get_raw_connections(codec, nid, NULL, 0);
} }
/** /**
...@@ -517,9 +517,6 @@ int snd_hda_get_raw_connections(struct hda_codec *codec, hda_nid_t nid, ...@@ -517,9 +517,6 @@ int snd_hda_get_raw_connections(struct hda_codec *codec, hda_nid_t nid,
hda_nid_t prev_nid; hda_nid_t prev_nid;
int null_count = 0; int null_count = 0;
if (snd_BUG_ON(!conn_list || max_conns <= 0))
return -EINVAL;
parm = get_num_conns(codec, nid); parm = get_num_conns(codec, nid);
if (!parm) if (!parm)
return 0; return 0;
...@@ -545,6 +542,7 @@ int snd_hda_get_raw_connections(struct hda_codec *codec, hda_nid_t nid, ...@@ -545,6 +542,7 @@ int snd_hda_get_raw_connections(struct hda_codec *codec, hda_nid_t nid,
AC_VERB_GET_CONNECT_LIST, 0); AC_VERB_GET_CONNECT_LIST, 0);
if (parm == -1 && codec->bus->rirb_error) if (parm == -1 && codec->bus->rirb_error)
return -EIO; return -EIO;
if (conn_list)
conn_list[0] = parm & mask; conn_list[0] = parm & mask;
return 1; return 1;
} }
...@@ -580,14 +578,20 @@ int snd_hda_get_raw_connections(struct hda_codec *codec, hda_nid_t nid, ...@@ -580,14 +578,20 @@ int snd_hda_get_raw_connections(struct hda_codec *codec, hda_nid_t nid,
continue; continue;
} }
for (n = prev_nid + 1; n <= val; n++) { for (n = prev_nid + 1; n <= val; n++) {
if (conn_list) {
if (conns >= max_conns) if (conns >= max_conns)
return -ENOSPC; return -ENOSPC;
conn_list[conns++] = n; conn_list[conns] = n;
}
conns++;
} }
} else { } else {
if (conn_list) {
if (conns >= max_conns) if (conns >= max_conns)
return -ENOSPC; return -ENOSPC;
conn_list[conns++] = val; conn_list[conns] = val;
}
conns++;
} }
prev_nid = val; prev_nid = val;
} }
...@@ -3331,6 +3335,8 @@ int snd_hda_create_dig_out_ctls(struct hda_codec *codec, ...@@ -3331,6 +3335,8 @@ int snd_hda_create_dig_out_ctls(struct hda_codec *codec,
return -EBUSY; return -EBUSY;
} }
spdif = snd_array_new(&codec->spdif_out); spdif = snd_array_new(&codec->spdif_out);
if (!spdif)
return -ENOMEM;
for (dig_mix = dig_mixes; dig_mix->name; dig_mix++) { for (dig_mix = dig_mixes; dig_mix->name; dig_mix++) {
kctl = snd_ctl_new1(dig_mix, codec); kctl = snd_ctl_new1(dig_mix, codec);
if (!kctl) if (!kctl)
...@@ -3428,11 +3434,16 @@ static struct snd_kcontrol_new spdif_share_sw = { ...@@ -3428,11 +3434,16 @@ static struct snd_kcontrol_new spdif_share_sw = {
int snd_hda_create_spdif_share_sw(struct hda_codec *codec, int snd_hda_create_spdif_share_sw(struct hda_codec *codec,
struct hda_multi_out *mout) struct hda_multi_out *mout)
{ {
struct snd_kcontrol *kctl;
if (!mout->dig_out_nid) if (!mout->dig_out_nid)
return 0; return 0;
kctl = snd_ctl_new1(&spdif_share_sw, mout);
if (!kctl)
return -ENOMEM;
/* ATTENTION: here mout is passed as private_data, instead of codec */ /* ATTENTION: here mout is passed as private_data, instead of codec */
return snd_hda_ctl_add(codec, mout->dig_out_nid, return snd_hda_ctl_add(codec, mout->dig_out_nid, kctl);
snd_ctl_new1(&spdif_share_sw, mout));
} }
EXPORT_SYMBOL_HDA(snd_hda_create_spdif_share_sw); EXPORT_SYMBOL_HDA(snd_hda_create_spdif_share_sw);
......
...@@ -2298,6 +2298,11 @@ static int dspxfr_one_seg(struct hda_codec *codec, ...@@ -2298,6 +2298,11 @@ static int dspxfr_one_seg(struct hda_codec *codec,
hda_frame_size_words = ((sample_rate_div == 0) ? 0 : hda_frame_size_words = ((sample_rate_div == 0) ? 0 :
(num_chans * sample_rate_mul / sample_rate_div)); (num_chans * sample_rate_mul / sample_rate_div));
if (hda_frame_size_words == 0) {
snd_printdd(KERN_ERR "frmsz zero\n");
return -EINVAL;
}
buffer_size_words = min(buffer_size_words, buffer_size_words = min(buffer_size_words,
(unsigned int)(UC_RANGE(chip_addx, 1) ? (unsigned int)(UC_RANGE(chip_addx, 1) ?
65536 : 32768)); 65536 : 32768));
...@@ -2308,8 +2313,7 @@ static int dspxfr_one_seg(struct hda_codec *codec, ...@@ -2308,8 +2313,7 @@ static int dspxfr_one_seg(struct hda_codec *codec,
chip_addx, hda_frame_size_words, num_chans, chip_addx, hda_frame_size_words, num_chans,
sample_rate_mul, sample_rate_div, buffer_size_words); sample_rate_mul, sample_rate_div, buffer_size_words);
if ((buffer_addx == NULL) || (hda_frame_size_words == 0) || if (buffer_size_words < hda_frame_size_words) {
(buffer_size_words < hda_frame_size_words)) {
snd_printdd(KERN_ERR "dspxfr_one_seg:failed\n"); snd_printdd(KERN_ERR "dspxfr_one_seg:failed\n");
return -EINVAL; return -EINVAL;
} }
...@@ -3235,7 +3239,7 @@ static int ca0132_set_vipsource(struct hda_codec *codec, int val) ...@@ -3235,7 +3239,7 @@ static int ca0132_set_vipsource(struct hda_codec *codec, int val)
struct ca0132_spec *spec = codec->spec; struct ca0132_spec *spec = codec->spec;
unsigned int tmp; unsigned int tmp;
if (!dspload_is_loaded(codec)) if (spec->dsp_state != DSP_DOWNLOADED)
return 0; return 0;
/* if CrystalVoice if off, vipsource should be 0 */ /* if CrystalVoice if off, vipsource should be 0 */
...@@ -4263,11 +4267,12 @@ static void ca0132_refresh_widget_caps(struct hda_codec *codec) ...@@ -4263,11 +4267,12 @@ static void ca0132_refresh_widget_caps(struct hda_codec *codec)
*/ */
static void ca0132_setup_defaults(struct hda_codec *codec) static void ca0132_setup_defaults(struct hda_codec *codec)
{ {
struct ca0132_spec *spec = codec->spec;
unsigned int tmp; unsigned int tmp;
int num_fx; int num_fx;
int idx, i; int idx, i;
if (!dspload_is_loaded(codec)) if (spec->dsp_state != DSP_DOWNLOADED)
return; return;
/* out, in effects + voicefx */ /* out, in effects + voicefx */
...@@ -4347,12 +4352,16 @@ static bool ca0132_download_dsp_images(struct hda_codec *codec) ...@@ -4347,12 +4352,16 @@ static bool ca0132_download_dsp_images(struct hda_codec *codec)
return false; return false;
dsp_os_image = (struct dsp_image_seg *)(fw_entry->data); dsp_os_image = (struct dsp_image_seg *)(fw_entry->data);
dspload_image(codec, dsp_os_image, 0, 0, true, 0); if (dspload_image(codec, dsp_os_image, 0, 0, true, 0)) {
pr_err("ca0132 dspload_image failed.\n");
goto exit_download;
}
dsp_loaded = dspload_wait_loaded(codec); dsp_loaded = dspload_wait_loaded(codec);
exit_download:
release_firmware(fw_entry); release_firmware(fw_entry);
return dsp_loaded; return dsp_loaded;
} }
...@@ -4363,16 +4372,13 @@ static void ca0132_download_dsp(struct hda_codec *codec) ...@@ -4363,16 +4372,13 @@ static void ca0132_download_dsp(struct hda_codec *codec)
#ifndef CONFIG_SND_HDA_CODEC_CA0132_DSP #ifndef CONFIG_SND_HDA_CODEC_CA0132_DSP
return; /* NOP */ return; /* NOP */
#endif #endif
spec->dsp_state = DSP_DOWNLOAD_INIT;
if (spec->dsp_state == DSP_DOWNLOAD_INIT) {
chipio_enable_clocks(codec); chipio_enable_clocks(codec);
spec->dsp_state = DSP_DOWNLOADING; spec->dsp_state = DSP_DOWNLOADING;
if (!ca0132_download_dsp_images(codec)) if (!ca0132_download_dsp_images(codec))
spec->dsp_state = DSP_DOWNLOAD_FAILED; spec->dsp_state = DSP_DOWNLOAD_FAILED;
else else
spec->dsp_state = DSP_DOWNLOADED; spec->dsp_state = DSP_DOWNLOADED;
}
if (spec->dsp_state == DSP_DOWNLOADED) if (spec->dsp_state == DSP_DOWNLOADED)
ca0132_set_dsp_msr(codec, true); ca0132_set_dsp_msr(codec, true);
......
...@@ -506,6 +506,8 @@ static int patch_cs420x(struct hda_codec *codec) ...@@ -506,6 +506,8 @@ static int patch_cs420x(struct hda_codec *codec)
if (!spec) if (!spec)
return -ENOMEM; return -ENOMEM;
spec->gen.automute_hook = cs_automute;
snd_hda_pick_fixup(codec, cs420x_models, cs420x_fixup_tbl, snd_hda_pick_fixup(codec, cs420x_models, cs420x_fixup_tbl,
cs420x_fixups); cs420x_fixups);
snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
...@@ -893,6 +895,8 @@ static int patch_cs4210(struct hda_codec *codec) ...@@ -893,6 +895,8 @@ static int patch_cs4210(struct hda_codec *codec)
if (!spec) if (!spec)
return -ENOMEM; return -ENOMEM;
spec->gen.automute_hook = cs_automute;
snd_hda_pick_fixup(codec, cs421x_models, cs421x_fixup_tbl, snd_hda_pick_fixup(codec, cs421x_models, cs421x_fixup_tbl,
cs421x_fixups); cs421x_fixups);
snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
......
...@@ -1142,7 +1142,7 @@ static int patch_cxt5045(struct hda_codec *codec) ...@@ -1142,7 +1142,7 @@ static int patch_cxt5045(struct hda_codec *codec)
} }
if (spec->beep_amp) if (spec->beep_amp)
snd_hda_attach_beep_device(codec, spec->beep_amp); snd_hda_attach_beep_device(codec, get_amp_nid_(spec->beep_amp));
return 0; return 0;
} }
...@@ -1921,7 +1921,7 @@ static int patch_cxt5051(struct hda_codec *codec) ...@@ -1921,7 +1921,7 @@ static int patch_cxt5051(struct hda_codec *codec)
} }
if (spec->beep_amp) if (spec->beep_amp)
snd_hda_attach_beep_device(codec, spec->beep_amp); snd_hda_attach_beep_device(codec, get_amp_nid_(spec->beep_amp));
return 0; return 0;
} }
...@@ -3099,7 +3099,7 @@ static int patch_cxt5066(struct hda_codec *codec) ...@@ -3099,7 +3099,7 @@ static int patch_cxt5066(struct hda_codec *codec)
} }
if (spec->beep_amp) if (spec->beep_amp)
snd_hda_attach_beep_device(codec, spec->beep_amp); snd_hda_attach_beep_device(codec, get_amp_nid_(spec->beep_amp));
return 0; return 0;
} }
...@@ -3191,11 +3191,17 @@ static int cx_auto_build_controls(struct hda_codec *codec) ...@@ -3191,11 +3191,17 @@ static int cx_auto_build_controls(struct hda_codec *codec)
return 0; return 0;
} }
static void cx_auto_free(struct hda_codec *codec)
{
snd_hda_detach_beep_device(codec);
snd_hda_gen_free(codec);
}
static const struct hda_codec_ops cx_auto_patch_ops = { static const struct hda_codec_ops cx_auto_patch_ops = {
.build_controls = cx_auto_build_controls, .build_controls = cx_auto_build_controls,
.build_pcms = snd_hda_gen_build_pcms, .build_pcms = snd_hda_gen_build_pcms,
.init = snd_hda_gen_init, .init = snd_hda_gen_init,
.free = snd_hda_gen_free, .free = cx_auto_free,
.unsol_event = snd_hda_jack_unsol_event, .unsol_event = snd_hda_jack_unsol_event,
#ifdef CONFIG_PM #ifdef CONFIG_PM
.check_power_status = snd_hda_gen_check_power_status, .check_power_status = snd_hda_gen_check_power_status,
...@@ -3390,7 +3396,7 @@ static int patch_conexant_auto(struct hda_codec *codec) ...@@ -3390,7 +3396,7 @@ static int patch_conexant_auto(struct hda_codec *codec)
codec->patch_ops = cx_auto_patch_ops; codec->patch_ops = cx_auto_patch_ops;
if (spec->beep_amp) if (spec->beep_amp)
snd_hda_attach_beep_device(codec, spec->beep_amp); snd_hda_attach_beep_device(codec, get_amp_nid_(spec->beep_amp));
/* Some laptops with Conexant chips show stalls in S3 resume, /* Some laptops with Conexant chips show stalls in S3 resume,
* which falls into the single-cmd mode. * which falls into the single-cmd mode.
......
...@@ -3182,6 +3182,7 @@ static int patch_alc269(struct hda_codec *codec) ...@@ -3182,6 +3182,7 @@ static int patch_alc269(struct hda_codec *codec)
case 0x10ec0290: case 0x10ec0290:
spec->codec_variant = ALC269_TYPE_ALC280; spec->codec_variant = ALC269_TYPE_ALC280;
break; break;
case 0x10ec0233:
case 0x10ec0282: case 0x10ec0282:
case 0x10ec0283: case 0x10ec0283:
spec->codec_variant = ALC269_TYPE_ALC282; spec->codec_variant = ALC269_TYPE_ALC282;
...@@ -3881,6 +3882,7 @@ static int patch_alc680(struct hda_codec *codec) ...@@ -3881,6 +3882,7 @@ static int patch_alc680(struct hda_codec *codec)
*/ */
static const struct hda_codec_preset snd_hda_preset_realtek[] = { static const struct hda_codec_preset snd_hda_preset_realtek[] = {
{ .id = 0x10ec0221, .name = "ALC221", .patch = patch_alc269 }, { .id = 0x10ec0221, .name = "ALC221", .patch = patch_alc269 },
{ .id = 0x10ec0233, .name = "ALC233", .patch = patch_alc269 },
{ .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 }, { .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 },
{ .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 }, { .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 },
{ .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 }, { .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 },
......
...@@ -815,6 +815,29 @@ static int find_mute_led_cfg(struct hda_codec *codec, int default_polarity) ...@@ -815,6 +815,29 @@ static int find_mute_led_cfg(struct hda_codec *codec, int default_polarity)
return 0; return 0;
} }
/* check whether a built-in speaker is included in parsed pins */
static bool has_builtin_speaker(struct hda_codec *codec)
{
struct sigmatel_spec *spec = codec->spec;
hda_nid_t *nid_pin;
int nids, i;
if (spec->gen.autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT) {
nid_pin = spec->gen.autocfg.line_out_pins;
nids = spec->gen.autocfg.line_outs;
} else {
nid_pin = spec->gen.autocfg.speaker_pins;
nids = spec->gen.autocfg.speaker_outs;
}
for (i = 0; i < nids; i++) {
unsigned int def_conf = snd_hda_codec_get_pincfg(codec, nid_pin[i]);
if (snd_hda_get_input_pin_attr(def_conf) == INPUT_PIN_ATTR_INT)
return true;
}
return false;
}
/* /*
* PC beep controls * PC beep controls
*/ */
...@@ -3891,6 +3914,12 @@ static int patch_stac92hd73xx(struct hda_codec *codec) ...@@ -3891,6 +3914,12 @@ static int patch_stac92hd73xx(struct hda_codec *codec)
return err; return err;
} }
/* Don't GPIO-mute speakers if there are no internal speakers, because
* the GPIO might be necessary for Headphone
*/
if (spec->eapd_switch && !has_builtin_speaker(codec))
spec->eapd_switch = 0;
codec->proc_widget_hook = stac92hd7x_proc_hook; codec->proc_widget_hook = stac92hd7x_proc_hook;
snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
......
...@@ -2594,6 +2594,8 @@ static int snd_ice1712_create(struct snd_card *card, ...@@ -2594,6 +2594,8 @@ static int snd_ice1712_create(struct snd_card *card,
snd_ice1712_proc_init(ice); snd_ice1712_proc_init(ice);
synchronize_irq(pci->irq); synchronize_irq(pci->irq);
card->private_data = ice;
err = pci_request_regions(pci, "ICE1712"); err = pci_request_regions(pci, "ICE1712");
if (err < 0) { if (err < 0) {
kfree(ice); kfree(ice);
......
...@@ -573,6 +573,13 @@ static const struct reg_default wm5102_sysclk_reva_patch[] = { ...@@ -573,6 +573,13 @@ static const struct reg_default wm5102_sysclk_reva_patch[] = {
{ 0x025e, 0x0112 }, { 0x025e, 0x0112 },
}; };
static const struct reg_default wm5102_sysclk_revb_patch[] = {
{ 0x3081, 0x08FE },
{ 0x3083, 0x00ED },
{ 0x30C1, 0x08FE },
{ 0x30C3, 0x00ED },
};
static int wm5102_sysclk_ev(struct snd_soc_dapm_widget *w, static int wm5102_sysclk_ev(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *kcontrol, int event) struct snd_kcontrol *kcontrol, int event)
{ {
...@@ -587,6 +594,10 @@ static int wm5102_sysclk_ev(struct snd_soc_dapm_widget *w, ...@@ -587,6 +594,10 @@ static int wm5102_sysclk_ev(struct snd_soc_dapm_widget *w,
patch = wm5102_sysclk_reva_patch; patch = wm5102_sysclk_reva_patch;
patch_size = ARRAY_SIZE(wm5102_sysclk_reva_patch); patch_size = ARRAY_SIZE(wm5102_sysclk_reva_patch);
break; break;
default:
patch = wm5102_sysclk_revb_patch;
patch_size = ARRAY_SIZE(wm5102_sysclk_revb_patch);
break;
} }
switch (event) { switch (event) {
...@@ -755,7 +766,7 @@ SOC_SINGLE("SPKDAT1 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_5L, ...@@ -755,7 +766,7 @@ SOC_SINGLE("SPKDAT1 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_5L,
SOC_DOUBLE_R("HPOUT1 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_1L, SOC_DOUBLE_R("HPOUT1 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_1L,
ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_MUTE_SHIFT, 1, 1), ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_MUTE_SHIFT, 1, 1),
SOC_DOUBLE_R("OUT2 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_2L, SOC_DOUBLE_R("HPOUT2 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_2L,
ARIZONA_DAC_DIGITAL_VOLUME_2R, ARIZONA_OUT2L_MUTE_SHIFT, 1, 1), ARIZONA_DAC_DIGITAL_VOLUME_2R, ARIZONA_OUT2L_MUTE_SHIFT, 1, 1),
SOC_SINGLE("EPOUT Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_3L, SOC_SINGLE("EPOUT Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_3L,
ARIZONA_OUT3L_MUTE_SHIFT, 1, 1), ARIZONA_OUT3L_MUTE_SHIFT, 1, 1),
...@@ -767,7 +778,7 @@ SOC_DOUBLE_R("SPKDAT1 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_5L, ...@@ -767,7 +778,7 @@ SOC_DOUBLE_R("SPKDAT1 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_5L,
SOC_DOUBLE_R_TLV("HPOUT1 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_1L, SOC_DOUBLE_R_TLV("HPOUT1 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_1L,
ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_VOL_SHIFT, ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_VOL_SHIFT,
0xbf, 0, digital_tlv), 0xbf, 0, digital_tlv),
SOC_DOUBLE_R_TLV("OUT2 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_2L, SOC_DOUBLE_R_TLV("HPOUT2 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_2L,
ARIZONA_DAC_DIGITAL_VOLUME_2R, ARIZONA_OUT2L_VOL_SHIFT, ARIZONA_DAC_DIGITAL_VOLUME_2R, ARIZONA_OUT2L_VOL_SHIFT,
0xbf, 0, digital_tlv), 0xbf, 0, digital_tlv),
SOC_SINGLE_TLV("EPOUT Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_3L, SOC_SINGLE_TLV("EPOUT Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_3L,
......
...@@ -213,9 +213,9 @@ ARIZONA_MIXER_CONTROLS("SPKDAT2R", ARIZONA_OUT6RMIX_INPUT_1_SOURCE), ...@@ -213,9 +213,9 @@ ARIZONA_MIXER_CONTROLS("SPKDAT2R", ARIZONA_OUT6RMIX_INPUT_1_SOURCE),
SOC_SINGLE("HPOUT1 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_1L, SOC_SINGLE("HPOUT1 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_1L,
ARIZONA_OUT1_OSR_SHIFT, 1, 0), ARIZONA_OUT1_OSR_SHIFT, 1, 0),
SOC_SINGLE("OUT2 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_2L, SOC_SINGLE("HPOUT2 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_2L,
ARIZONA_OUT2_OSR_SHIFT, 1, 0), ARIZONA_OUT2_OSR_SHIFT, 1, 0),
SOC_SINGLE("OUT3 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_3L, SOC_SINGLE("HPOUT3 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_3L,
ARIZONA_OUT3_OSR_SHIFT, 1, 0), ARIZONA_OUT3_OSR_SHIFT, 1, 0),
SOC_SINGLE("Speaker High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_4L, SOC_SINGLE("Speaker High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_4L,
ARIZONA_OUT4_OSR_SHIFT, 1, 0), ARIZONA_OUT4_OSR_SHIFT, 1, 0),
...@@ -226,9 +226,9 @@ SOC_SINGLE("SPKDAT2 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_6L, ...@@ -226,9 +226,9 @@ SOC_SINGLE("SPKDAT2 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_6L,
SOC_DOUBLE_R("HPOUT1 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_1L, SOC_DOUBLE_R("HPOUT1 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_1L,
ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_MUTE_SHIFT, 1, 1), ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_MUTE_SHIFT, 1, 1),
SOC_DOUBLE_R("OUT2 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_2L, SOC_DOUBLE_R("HPOUT2 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_2L,
ARIZONA_DAC_DIGITAL_VOLUME_2R, ARIZONA_OUT2L_MUTE_SHIFT, 1, 1), ARIZONA_DAC_DIGITAL_VOLUME_2R, ARIZONA_OUT2L_MUTE_SHIFT, 1, 1),
SOC_DOUBLE_R("OUT3 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_3L, SOC_DOUBLE_R("HPOUT3 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_3L,
ARIZONA_DAC_DIGITAL_VOLUME_3R, ARIZONA_OUT3L_MUTE_SHIFT, 1, 1), ARIZONA_DAC_DIGITAL_VOLUME_3R, ARIZONA_OUT3L_MUTE_SHIFT, 1, 1),
SOC_DOUBLE_R("Speaker Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_4L, SOC_DOUBLE_R("Speaker Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_4L,
ARIZONA_DAC_DIGITAL_VOLUME_4R, ARIZONA_OUT4L_MUTE_SHIFT, 1, 1), ARIZONA_DAC_DIGITAL_VOLUME_4R, ARIZONA_OUT4L_MUTE_SHIFT, 1, 1),
...@@ -240,10 +240,10 @@ SOC_DOUBLE_R("SPKDAT2 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_6L, ...@@ -240,10 +240,10 @@ SOC_DOUBLE_R("SPKDAT2 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_6L,
SOC_DOUBLE_R_TLV("HPOUT1 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_1L, SOC_DOUBLE_R_TLV("HPOUT1 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_1L,
ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_VOL_SHIFT, ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_VOL_SHIFT,
0xbf, 0, digital_tlv), 0xbf, 0, digital_tlv),
SOC_DOUBLE_R_TLV("OUT2 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_2L, SOC_DOUBLE_R_TLV("HPOUT2 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_2L,
ARIZONA_DAC_DIGITAL_VOLUME_2R, ARIZONA_OUT2L_VOL_SHIFT, ARIZONA_DAC_DIGITAL_VOLUME_2R, ARIZONA_OUT2L_VOL_SHIFT,
0xbf, 0, digital_tlv), 0xbf, 0, digital_tlv),
SOC_DOUBLE_R_TLV("OUT3 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_3L, SOC_DOUBLE_R_TLV("HPOUT3 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_3L,
ARIZONA_DAC_DIGITAL_VOLUME_3R, ARIZONA_OUT3L_VOL_SHIFT, ARIZONA_DAC_DIGITAL_VOLUME_3R, ARIZONA_OUT3L_VOL_SHIFT,
0xbf, 0, digital_tlv), 0xbf, 0, digital_tlv),
SOC_DOUBLE_R_TLV("Speaker Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_4L, SOC_DOUBLE_R_TLV("Speaker Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_4L,
...@@ -260,11 +260,11 @@ SOC_DOUBLE_R_RANGE_TLV("HPOUT1 Volume", ARIZONA_OUTPUT_PATH_CONFIG_1L, ...@@ -260,11 +260,11 @@ SOC_DOUBLE_R_RANGE_TLV("HPOUT1 Volume", ARIZONA_OUTPUT_PATH_CONFIG_1L,
ARIZONA_OUTPUT_PATH_CONFIG_1R, ARIZONA_OUTPUT_PATH_CONFIG_1R,
ARIZONA_OUT1L_PGA_VOL_SHIFT, ARIZONA_OUT1L_PGA_VOL_SHIFT,
0x34, 0x40, 0, ana_tlv), 0x34, 0x40, 0, ana_tlv),
SOC_DOUBLE_R_RANGE_TLV("OUT2 Volume", ARIZONA_OUTPUT_PATH_CONFIG_2L, SOC_DOUBLE_R_RANGE_TLV("HPOUT2 Volume", ARIZONA_OUTPUT_PATH_CONFIG_2L,
ARIZONA_OUTPUT_PATH_CONFIG_2R, ARIZONA_OUTPUT_PATH_CONFIG_2R,
ARIZONA_OUT2L_PGA_VOL_SHIFT, ARIZONA_OUT2L_PGA_VOL_SHIFT,
0x34, 0x40, 0, ana_tlv), 0x34, 0x40, 0, ana_tlv),
SOC_DOUBLE_R_RANGE_TLV("OUT3 Volume", ARIZONA_OUTPUT_PATH_CONFIG_3L, SOC_DOUBLE_R_RANGE_TLV("HPOUT3 Volume", ARIZONA_OUTPUT_PATH_CONFIG_3L,
ARIZONA_OUTPUT_PATH_CONFIG_3R, ARIZONA_OUTPUT_PATH_CONFIG_3R,
ARIZONA_OUT3L_PGA_VOL_SHIFT, 0x34, 0x40, 0, ana_tlv), ARIZONA_OUT3L_PGA_VOL_SHIFT, 0x34, 0x40, 0, ana_tlv),
......
...@@ -1301,7 +1301,7 @@ static irqreturn_t wm8350_hpl_jack_handler(int irq, void *data) ...@@ -1301,7 +1301,7 @@ static irqreturn_t wm8350_hpl_jack_handler(int irq, void *data)
if (device_may_wakeup(wm8350->dev)) if (device_may_wakeup(wm8350->dev))
pm_wakeup_event(wm8350->dev, 250); pm_wakeup_event(wm8350->dev, 250);
schedule_delayed_work(&priv->hpl.work, 200); schedule_delayed_work(&priv->hpl.work, msecs_to_jiffies(200));
return IRQ_HANDLED; return IRQ_HANDLED;
} }
...@@ -1318,7 +1318,7 @@ static irqreturn_t wm8350_hpr_jack_handler(int irq, void *data) ...@@ -1318,7 +1318,7 @@ static irqreturn_t wm8350_hpr_jack_handler(int irq, void *data)
if (device_may_wakeup(wm8350->dev)) if (device_may_wakeup(wm8350->dev))
pm_wakeup_event(wm8350->dev, 250); pm_wakeup_event(wm8350->dev, 250);
schedule_delayed_work(&priv->hpr.work, 200); schedule_delayed_work(&priv->hpr.work, msecs_to_jiffies(200));
return IRQ_HANDLED; return IRQ_HANDLED;
} }
......
...@@ -53,8 +53,8 @@ ...@@ -53,8 +53,8 @@
* using 2 wire for device control, so we cache them instead. * using 2 wire for device control, so we cache them instead.
*/ */
static const struct reg_default wm8960_reg_defaults[] = { static const struct reg_default wm8960_reg_defaults[] = {
{ 0x0, 0x0097 }, { 0x0, 0x00a7 },
{ 0x1, 0x0097 }, { 0x1, 0x00a7 },
{ 0x2, 0x0000 }, { 0x2, 0x0000 },
{ 0x3, 0x0000 }, { 0x3, 0x0000 },
{ 0x4, 0x0000 }, { 0x4, 0x0000 },
...@@ -323,8 +323,8 @@ SND_SOC_DAPM_MIXER("Left Input Mixer", WM8960_POWER3, 5, 0, ...@@ -323,8 +323,8 @@ SND_SOC_DAPM_MIXER("Left Input Mixer", WM8960_POWER3, 5, 0,
SND_SOC_DAPM_MIXER("Right Input Mixer", WM8960_POWER3, 4, 0, SND_SOC_DAPM_MIXER("Right Input Mixer", WM8960_POWER3, 4, 0,
wm8960_rin, ARRAY_SIZE(wm8960_rin)), wm8960_rin, ARRAY_SIZE(wm8960_rin)),
SND_SOC_DAPM_ADC("Left ADC", "Capture", WM8960_POWER2, 3, 0), SND_SOC_DAPM_ADC("Left ADC", "Capture", WM8960_POWER1, 3, 0),
SND_SOC_DAPM_ADC("Right ADC", "Capture", WM8960_POWER2, 2, 0), SND_SOC_DAPM_ADC("Right ADC", "Capture", WM8960_POWER1, 2, 0),
SND_SOC_DAPM_DAC("Left DAC", "Playback", WM8960_POWER2, 8, 0), SND_SOC_DAPM_DAC("Left DAC", "Playback", WM8960_POWER2, 8, 0),
SND_SOC_DAPM_DAC("Right DAC", "Playback", WM8960_POWER2, 7, 0), SND_SOC_DAPM_DAC("Right DAC", "Playback", WM8960_POWER2, 7, 0),
......
...@@ -121,7 +121,7 @@ ...@@ -121,7 +121,7 @@
#define TEGRA20_I2S_TIMING_NON_SYM_ENABLE (1 << 12) #define TEGRA20_I2S_TIMING_NON_SYM_ENABLE (1 << 12)
#define TEGRA20_I2S_TIMING_CHANNEL_BIT_COUNT_SHIFT 0 #define TEGRA20_I2S_TIMING_CHANNEL_BIT_COUNT_SHIFT 0
#define TEGRA20_I2S_TIMING_CHANNEL_BIT_COUNT_MASK_US 0x7fff #define TEGRA20_I2S_TIMING_CHANNEL_BIT_COUNT_MASK_US 0x7ff
#define TEGRA20_I2S_TIMING_CHANNEL_BIT_COUNT_MASK (TEGRA20_I2S_TIMING_CHANNEL_BIT_COUNT_MASK_US << TEGRA20_I2S_TIMING_CHANNEL_BIT_COUNT_SHIFT) #define TEGRA20_I2S_TIMING_CHANNEL_BIT_COUNT_MASK (TEGRA20_I2S_TIMING_CHANNEL_BIT_COUNT_MASK_US << TEGRA20_I2S_TIMING_CHANNEL_BIT_COUNT_SHIFT)
/* Fields in TEGRA20_I2S_FIFO_SCR */ /* Fields in TEGRA20_I2S_FIFO_SCR */
......
...@@ -110,7 +110,7 @@ ...@@ -110,7 +110,7 @@
#define TEGRA30_I2S_TIMING_NON_SYM_ENABLE (1 << 12) #define TEGRA30_I2S_TIMING_NON_SYM_ENABLE (1 << 12)
#define TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_SHIFT 0 #define TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_SHIFT 0
#define TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_MASK_US 0x7fff #define TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_MASK_US 0x7ff
#define TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_MASK (TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_MASK_US << TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_SHIFT) #define TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_MASK (TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_MASK_US << TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_SHIFT)
/* Fields in TEGRA30_I2S_OFFSET */ /* Fields in TEGRA30_I2S_OFFSET */
......
...@@ -243,6 +243,21 @@ static int snd_usb_create_streams(struct snd_usb_audio *chip, int ctrlif) ...@@ -243,6 +243,21 @@ static int snd_usb_create_streams(struct snd_usb_audio *chip, int ctrlif)
struct usb_interface_assoc_descriptor *assoc = struct usb_interface_assoc_descriptor *assoc =
usb_ifnum_to_if(dev, ctrlif)->intf_assoc; usb_ifnum_to_if(dev, ctrlif)->intf_assoc;
if (!assoc) {
/*
* Firmware writers cannot count to three. So to find
* the IAD on the NuForce UDH-100, also check the next
* interface.
*/
struct usb_interface *iface =
usb_ifnum_to_if(dev, ctrlif + 1);
if (iface &&
iface->intf_assoc &&
iface->intf_assoc->bFunctionClass == USB_CLASS_AUDIO &&
iface->intf_assoc->bFunctionProtocol == UAC_VERSION_2)
assoc = iface->intf_assoc;
}
if (!assoc) { if (!assoc) {
snd_printk(KERN_ERR "Audio class v2 interfaces need an interface association\n"); snd_printk(KERN_ERR "Audio class v2 interfaces need an interface association\n");
return -EINVAL; return -EINVAL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment