diff options
author | Mauro Carvalho Chehab <mchehab@redhat.com> | 2013-04-01 08:54:14 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2013-04-01 08:54:14 -0400 |
commit | f9f11dfe4831adb1531e1face9dcd9fc57665d2e (patch) | |
tree | 3fb605d9c6c7ed70d42237de21203fa131e6eee8 /sound | |
parent | 6bf7861fa2bb4be3cc70a6e9aed664ce65270027 (diff) | |
parent | 07961ac7c0ee8b546658717034fe692fd12eefa9 (diff) |
Merge tag 'v3.9-rc5' into patchwork
Linux 3.9-rc5
* tag 'v3.9-rc5': (1080 commits)
Linux 3.9-rc5
Revert "lockdep: check that no locks held at freeze time"
dw_dmac: adjust slave_id accordingly to request line base
dmaengine: dw_dma: fix endianess for DT xlate function
PNP: List Rafael Wysocki as a maintainer
rbd: don't zero-fill non-image object requests
ia64 idle: delete stale (*idle)() function pointer
Btrfs: don't drop path when printing out tree errors in scrub
target: Fix RESERVATION_CONFLICT status regression for iscsi-target special case
tcm_vhost: Avoid VIRTIO_RING_F_EVENT_IDX feature bit
Revert "mm: introduce VM_POPULATE flag to better deal with racy userspace programs"
usb: ftdi_sio: Add support for Mitsubishi FX-USB-AW/-BD
mg_disk: fix error return code in mg_probe()
Btrfs: fix wrong return value of btrfs_lookup_csum()
Btrfs: fix wrong reservation of csums
Btrfs: fix double free in the btrfs_qgroup_account_ref()
Btrfs: limit the global reserve to 512mb
Btrfs: hold the ordered operations mutex when waiting on ordered extents
Btrfs: fix space accounting for unlink and rename
Btrfs: fix space leak when we fail to reserve metadata space
...
Diffstat (limited to 'sound')
-rw-r--r-- | sound/core/seq/oss/seq_oss_event.c | 14 | ||||
-rw-r--r-- | sound/core/seq/seq_timer.c | 8 | ||||
-rw-r--r-- | sound/core/vmaster.c | 5 | ||||
-rw-r--r-- | sound/oss/sequencer.c | 6 | ||||
-rw-r--r-- | sound/pci/asihpi/asihpi.c | 3 | ||||
-rw-r--r-- | sound/pci/hda/hda_codec.c | 37 | ||||
-rw-r--r-- | sound/pci/hda/hda_generic.c | 46 | ||||
-rw-r--r-- | sound/pci/hda/hda_intel.c | 132 | ||||
-rw-r--r-- | sound/pci/hda/patch_ca0132.c | 36 | ||||
-rw-r--r-- | sound/pci/hda/patch_cirrus.c | 8 | ||||
-rw-r--r-- | sound/pci/hda/patch_conexant.c | 16 | ||||
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 2 | ||||
-rw-r--r-- | sound/pci/hda/patch_sigmatel.c | 29 | ||||
-rw-r--r-- | sound/pci/ice1712/ice1712.c | 2 | ||||
-rw-r--r-- | sound/soc/codecs/wm5102.c | 15 | ||||
-rw-r--r-- | sound/soc/codecs/wm5110.c | 16 | ||||
-rw-r--r-- | sound/soc/codecs/wm8350.c | 4 | ||||
-rw-r--r-- | sound/soc/codecs/wm8960.c | 8 | ||||
-rw-r--r-- | sound/soc/tegra/tegra20_i2s.h | 2 | ||||
-rw-r--r-- | sound/soc/tegra/tegra30_i2s.h | 2 | ||||
-rw-r--r-- | sound/usb/card.c | 15 | ||||
-rw-r--r-- | sound/usb/mixer.c | 21 |
22 files changed, 335 insertions, 92 deletions
diff --git a/sound/core/seq/oss/seq_oss_event.c b/sound/core/seq/oss/seq_oss_event.c index 066f5f3e3f4c..c3908862bc8b 100644 --- a/sound/core/seq/oss/seq_oss_event.c +++ b/sound/core/seq/oss/seq_oss_event.c | |||
@@ -285,7 +285,12 @@ local_event(struct seq_oss_devinfo *dp, union evrec *q, struct snd_seq_event *ev | |||
285 | static int | 285 | static int |
286 | note_on_event(struct seq_oss_devinfo *dp, int dev, int ch, int note, int vel, struct snd_seq_event *ev) | 286 | note_on_event(struct seq_oss_devinfo *dp, int dev, int ch, int note, int vel, struct snd_seq_event *ev) |
287 | { | 287 | { |
288 | struct seq_oss_synthinfo *info = &dp->synths[dev]; | 288 | struct seq_oss_synthinfo *info; |
289 | |||
290 | if (!snd_seq_oss_synth_is_valid(dp, dev)) | ||
291 | return -ENXIO; | ||
292 | |||
293 | info = &dp->synths[dev]; | ||
289 | switch (info->arg.event_passing) { | 294 | switch (info->arg.event_passing) { |
290 | case SNDRV_SEQ_OSS_PROCESS_EVENTS: | 295 | case SNDRV_SEQ_OSS_PROCESS_EVENTS: |
291 | if (! info->ch || ch < 0 || ch >= info->nr_voices) { | 296 | 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 | static int | 345 | static int |
341 | note_off_event(struct seq_oss_devinfo *dp, int dev, int ch, int note, int vel, struct snd_seq_event *ev) | 346 | note_off_event(struct seq_oss_devinfo *dp, int dev, int ch, int note, int vel, struct snd_seq_event *ev) |
342 | { | 347 | { |
343 | struct seq_oss_synthinfo *info = &dp->synths[dev]; | 348 | struct seq_oss_synthinfo *info; |
349 | |||
350 | if (!snd_seq_oss_synth_is_valid(dp, dev)) | ||
351 | return -ENXIO; | ||
352 | |||
353 | info = &dp->synths[dev]; | ||
344 | switch (info->arg.event_passing) { | 354 | switch (info->arg.event_passing) { |
345 | case SNDRV_SEQ_OSS_PROCESS_EVENTS: | 355 | case SNDRV_SEQ_OSS_PROCESS_EVENTS: |
346 | if (! info->ch || ch < 0 || ch >= info->nr_voices) { | 356 | if (! info->ch || ch < 0 || ch >= info->nr_voices) { |
diff --git a/sound/core/seq/seq_timer.c b/sound/core/seq/seq_timer.c index 160b1bd0cd62..24d44b2f61ac 100644 --- a/sound/core/seq/seq_timer.c +++ b/sound/core/seq/seq_timer.c | |||
@@ -290,10 +290,10 @@ int snd_seq_timer_open(struct snd_seq_queue *q) | |||
290 | tid.device = SNDRV_TIMER_GLOBAL_SYSTEM; | 290 | tid.device = SNDRV_TIMER_GLOBAL_SYSTEM; |
291 | err = snd_timer_open(&t, str, &tid, q->queue); | 291 | err = snd_timer_open(&t, str, &tid, q->queue); |
292 | } | 292 | } |
293 | if (err < 0) { | 293 | } |
294 | snd_printk(KERN_ERR "seq fatal error: cannot create timer (%i)\n", err); | 294 | if (err < 0) { |
295 | return err; | 295 | snd_printk(KERN_ERR "seq fatal error: cannot create timer (%i)\n", err); |
296 | } | 296 | return err; |
297 | } | 297 | } |
298 | t->callback = snd_seq_timer_interrupt; | 298 | t->callback = snd_seq_timer_interrupt; |
299 | t->callback_data = q; | 299 | t->callback_data = q; |
diff --git a/sound/core/vmaster.c b/sound/core/vmaster.c index 857586135d18..0097f3619faa 100644 --- a/sound/core/vmaster.c +++ b/sound/core/vmaster.c | |||
@@ -213,7 +213,10 @@ static int slave_put(struct snd_kcontrol *kcontrol, | |||
213 | } | 213 | } |
214 | if (!changed) | 214 | if (!changed) |
215 | return 0; | 215 | return 0; |
216 | return slave_put_val(slave, ucontrol); | 216 | err = slave_put_val(slave, ucontrol); |
217 | if (err < 0) | ||
218 | return err; | ||
219 | return 1; | ||
217 | } | 220 | } |
218 | 221 | ||
219 | static int slave_tlv_cmd(struct snd_kcontrol *kcontrol, | 222 | static int slave_tlv_cmd(struct snd_kcontrol *kcontrol, |
diff --git a/sound/oss/sequencer.c b/sound/oss/sequencer.c index 30bcfe470f83..4ff60a6427d9 100644 --- a/sound/oss/sequencer.c +++ b/sound/oss/sequencer.c | |||
@@ -545,6 +545,9 @@ static void seq_chn_common_event(unsigned char *event_rec) | |||
545 | case MIDI_PGM_CHANGE: | 545 | case MIDI_PGM_CHANGE: |
546 | if (seq_mode == SEQ_2) | 546 | if (seq_mode == SEQ_2) |
547 | { | 547 | { |
548 | if (chn > 15) | ||
549 | break; | ||
550 | |||
548 | synth_devs[dev]->chn_info[chn].pgm_num = p1; | 551 | synth_devs[dev]->chn_info[chn].pgm_num = p1; |
549 | if ((int) dev >= num_synths) | 552 | if ((int) dev >= num_synths) |
550 | synth_devs[dev]->set_instr(dev, chn, p1); | 553 | synth_devs[dev]->set_instr(dev, chn, p1); |
@@ -596,6 +599,9 @@ static void seq_chn_common_event(unsigned char *event_rec) | |||
596 | case MIDI_PITCH_BEND: | 599 | case MIDI_PITCH_BEND: |
597 | if (seq_mode == SEQ_2) | 600 | if (seq_mode == SEQ_2) |
598 | { | 601 | { |
602 | if (chn > 15) | ||
603 | break; | ||
604 | |||
599 | synth_devs[dev]->chn_info[chn].bender_value = w14; | 605 | synth_devs[dev]->chn_info[chn].bender_value = w14; |
600 | 606 | ||
601 | if ((int) dev < num_synths) | 607 | if ((int) dev < num_synths) |
diff --git a/sound/pci/asihpi/asihpi.c b/sound/pci/asihpi/asihpi.c index 3536b076b529..0aabfedeecba 100644 --- a/sound/pci/asihpi/asihpi.c +++ b/sound/pci/asihpi/asihpi.c | |||
@@ -2549,7 +2549,7 @@ static int snd_asihpi_sampleclock_add(struct snd_card_asihpi *asihpi, | |||
2549 | 2549 | ||
2550 | static int snd_card_asihpi_mixer_new(struct snd_card_asihpi *asihpi) | 2550 | static int snd_card_asihpi_mixer_new(struct snd_card_asihpi *asihpi) |
2551 | { | 2551 | { |
2552 | struct snd_card *card = asihpi->card; | 2552 | struct snd_card *card; |
2553 | unsigned int idx = 0; | 2553 | unsigned int idx = 0; |
2554 | unsigned int subindex = 0; | 2554 | unsigned int subindex = 0; |
2555 | int err; | 2555 | int err; |
@@ -2557,6 +2557,7 @@ static int snd_card_asihpi_mixer_new(struct snd_card_asihpi *asihpi) | |||
2557 | 2557 | ||
2558 | if (snd_BUG_ON(!asihpi)) | 2558 | if (snd_BUG_ON(!asihpi)) |
2559 | return -EINVAL; | 2559 | return -EINVAL; |
2560 | card = asihpi->card; | ||
2560 | strcpy(card->mixername, "Asihpi Mixer"); | 2561 | strcpy(card->mixername, "Asihpi Mixer"); |
2561 | 2562 | ||
2562 | err = | 2563 | err = |
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 04b57383e8cb..ecdf30eb5879 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
@@ -494,7 +494,7 @@ static unsigned int get_num_conns(struct hda_codec *codec, hda_nid_t nid) | |||
494 | 494 | ||
495 | int snd_hda_get_num_raw_conns(struct hda_codec *codec, hda_nid_t nid) | 495 | int snd_hda_get_num_raw_conns(struct hda_codec *codec, hda_nid_t nid) |
496 | { | 496 | { |
497 | return get_num_conns(codec, nid) & AC_CLIST_LENGTH; | 497 | return snd_hda_get_raw_connections(codec, nid, NULL, 0); |
498 | } | 498 | } |
499 | 499 | ||
500 | /** | 500 | /** |
@@ -517,9 +517,6 @@ int snd_hda_get_raw_connections(struct hda_codec *codec, hda_nid_t nid, | |||
517 | hda_nid_t prev_nid; | 517 | hda_nid_t prev_nid; |
518 | int null_count = 0; | 518 | int null_count = 0; |
519 | 519 | ||
520 | if (snd_BUG_ON(!conn_list || max_conns <= 0)) | ||
521 | return -EINVAL; | ||
522 | |||
523 | parm = get_num_conns(codec, nid); | 520 | parm = get_num_conns(codec, nid); |
524 | if (!parm) | 521 | if (!parm) |
525 | return 0; | 522 | return 0; |
@@ -545,7 +542,8 @@ int snd_hda_get_raw_connections(struct hda_codec *codec, hda_nid_t nid, | |||
545 | AC_VERB_GET_CONNECT_LIST, 0); | 542 | AC_VERB_GET_CONNECT_LIST, 0); |
546 | if (parm == -1 && codec->bus->rirb_error) | 543 | if (parm == -1 && codec->bus->rirb_error) |
547 | return -EIO; | 544 | return -EIO; |
548 | conn_list[0] = parm & mask; | 545 | if (conn_list) |
546 | conn_list[0] = parm & mask; | ||
549 | return 1; | 547 | return 1; |
550 | } | 548 | } |
551 | 549 | ||
@@ -580,14 +578,20 @@ int snd_hda_get_raw_connections(struct hda_codec *codec, hda_nid_t nid, | |||
580 | continue; | 578 | continue; |
581 | } | 579 | } |
582 | for (n = prev_nid + 1; n <= val; n++) { | 580 | for (n = prev_nid + 1; n <= val; n++) { |
581 | if (conn_list) { | ||
582 | if (conns >= max_conns) | ||
583 | return -ENOSPC; | ||
584 | conn_list[conns] = n; | ||
585 | } | ||
586 | conns++; | ||
587 | } | ||
588 | } else { | ||
589 | if (conn_list) { | ||
583 | if (conns >= max_conns) | 590 | if (conns >= max_conns) |
584 | return -ENOSPC; | 591 | return -ENOSPC; |
585 | conn_list[conns++] = n; | 592 | conn_list[conns] = val; |
586 | } | 593 | } |
587 | } else { | 594 | conns++; |
588 | if (conns >= max_conns) | ||
589 | return -ENOSPC; | ||
590 | conn_list[conns++] = val; | ||
591 | } | 595 | } |
592 | prev_nid = val; | 596 | prev_nid = val; |
593 | } | 597 | } |
@@ -3140,7 +3144,7 @@ static unsigned int convert_to_spdif_status(unsigned short val) | |||
3140 | if (val & AC_DIG1_PROFESSIONAL) | 3144 | if (val & AC_DIG1_PROFESSIONAL) |
3141 | sbits |= IEC958_AES0_PROFESSIONAL; | 3145 | sbits |= IEC958_AES0_PROFESSIONAL; |
3142 | if (sbits & IEC958_AES0_PROFESSIONAL) { | 3146 | if (sbits & IEC958_AES0_PROFESSIONAL) { |
3143 | if (sbits & AC_DIG1_EMPHASIS) | 3147 | if (val & AC_DIG1_EMPHASIS) |
3144 | sbits |= IEC958_AES0_PRO_EMPHASIS_5015; | 3148 | sbits |= IEC958_AES0_PRO_EMPHASIS_5015; |
3145 | } else { | 3149 | } else { |
3146 | if (val & AC_DIG1_EMPHASIS) | 3150 | if (val & AC_DIG1_EMPHASIS) |
@@ -3334,6 +3338,8 @@ int snd_hda_create_dig_out_ctls(struct hda_codec *codec, | |||
3334 | return -EBUSY; | 3338 | return -EBUSY; |
3335 | } | 3339 | } |
3336 | spdif = snd_array_new(&codec->spdif_out); | 3340 | spdif = snd_array_new(&codec->spdif_out); |
3341 | if (!spdif) | ||
3342 | return -ENOMEM; | ||
3337 | for (dig_mix = dig_mixes; dig_mix->name; dig_mix++) { | 3343 | for (dig_mix = dig_mixes; dig_mix->name; dig_mix++) { |
3338 | kctl = snd_ctl_new1(dig_mix, codec); | 3344 | kctl = snd_ctl_new1(dig_mix, codec); |
3339 | if (!kctl) | 3345 | if (!kctl) |
@@ -3431,11 +3437,16 @@ static struct snd_kcontrol_new spdif_share_sw = { | |||
3431 | int snd_hda_create_spdif_share_sw(struct hda_codec *codec, | 3437 | int snd_hda_create_spdif_share_sw(struct hda_codec *codec, |
3432 | struct hda_multi_out *mout) | 3438 | struct hda_multi_out *mout) |
3433 | { | 3439 | { |
3440 | struct snd_kcontrol *kctl; | ||
3441 | |||
3434 | if (!mout->dig_out_nid) | 3442 | if (!mout->dig_out_nid) |
3435 | return 0; | 3443 | return 0; |
3444 | |||
3445 | kctl = snd_ctl_new1(&spdif_share_sw, mout); | ||
3446 | if (!kctl) | ||
3447 | return -ENOMEM; | ||
3436 | /* ATTENTION: here mout is passed as private_data, instead of codec */ | 3448 | /* ATTENTION: here mout is passed as private_data, instead of codec */ |
3437 | return snd_hda_ctl_add(codec, mout->dig_out_nid, | 3449 | return snd_hda_ctl_add(codec, mout->dig_out_nid, kctl); |
3438 | snd_ctl_new1(&spdif_share_sw, mout)); | ||
3439 | } | 3450 | } |
3440 | EXPORT_SYMBOL_HDA(snd_hda_create_spdif_share_sw); | 3451 | EXPORT_SYMBOL_HDA(snd_hda_create_spdif_share_sw); |
3441 | 3452 | ||
diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c index 78897d05d80f..43c2ea539561 100644 --- a/sound/pci/hda/hda_generic.c +++ b/sound/pci/hda/hda_generic.c | |||
@@ -995,6 +995,8 @@ enum { | |||
995 | BAD_NO_EXTRA_SURR_DAC = 0x101, | 995 | BAD_NO_EXTRA_SURR_DAC = 0x101, |
996 | /* Primary DAC shared with main surrounds */ | 996 | /* Primary DAC shared with main surrounds */ |
997 | BAD_SHARED_SURROUND = 0x100, | 997 | BAD_SHARED_SURROUND = 0x100, |
998 | /* No independent HP possible */ | ||
999 | BAD_NO_INDEP_HP = 0x40, | ||
998 | /* Primary DAC shared with main CLFE */ | 1000 | /* Primary DAC shared with main CLFE */ |
999 | BAD_SHARED_CLFE = 0x10, | 1001 | BAD_SHARED_CLFE = 0x10, |
1000 | /* Primary DAC shared with extra surrounds */ | 1002 | /* Primary DAC shared with extra surrounds */ |
@@ -1392,6 +1394,43 @@ static int check_aamix_out_path(struct hda_codec *codec, int path_idx) | |||
1392 | return snd_hda_get_path_idx(codec, path); | 1394 | return snd_hda_get_path_idx(codec, path); |
1393 | } | 1395 | } |
1394 | 1396 | ||
1397 | /* check whether the independent HP is available with the current config */ | ||
1398 | static bool indep_hp_possible(struct hda_codec *codec) | ||
1399 | { | ||
1400 | struct hda_gen_spec *spec = codec->spec; | ||
1401 | struct auto_pin_cfg *cfg = &spec->autocfg; | ||
1402 | struct nid_path *path; | ||
1403 | int i, idx; | ||
1404 | |||
1405 | if (cfg->line_out_type == AUTO_PIN_HP_OUT) | ||
1406 | idx = spec->out_paths[0]; | ||
1407 | else | ||
1408 | idx = spec->hp_paths[0]; | ||
1409 | path = snd_hda_get_path_from_idx(codec, idx); | ||
1410 | if (!path) | ||
1411 | return false; | ||
1412 | |||
1413 | /* assume no path conflicts unless aamix is involved */ | ||
1414 | if (!spec->mixer_nid || !is_nid_contained(path, spec->mixer_nid)) | ||
1415 | return true; | ||
1416 | |||
1417 | /* check whether output paths contain aamix */ | ||
1418 | for (i = 0; i < cfg->line_outs; i++) { | ||
1419 | if (spec->out_paths[i] == idx) | ||
1420 | break; | ||
1421 | path = snd_hda_get_path_from_idx(codec, spec->out_paths[i]); | ||
1422 | if (path && is_nid_contained(path, spec->mixer_nid)) | ||
1423 | return false; | ||
1424 | } | ||
1425 | for (i = 0; i < cfg->speaker_outs; i++) { | ||
1426 | path = snd_hda_get_path_from_idx(codec, spec->speaker_paths[i]); | ||
1427 | if (path && is_nid_contained(path, spec->mixer_nid)) | ||
1428 | return false; | ||
1429 | } | ||
1430 | |||
1431 | return true; | ||
1432 | } | ||
1433 | |||
1395 | /* fill the empty entries in the dac array for speaker/hp with the | 1434 | /* fill the empty entries in the dac array for speaker/hp with the |
1396 | * shared dac pointed by the paths | 1435 | * shared dac pointed by the paths |
1397 | */ | 1436 | */ |
@@ -1545,6 +1584,9 @@ static int fill_and_eval_dacs(struct hda_codec *codec, | |||
1545 | badness += BAD_MULTI_IO; | 1584 | badness += BAD_MULTI_IO; |
1546 | } | 1585 | } |
1547 | 1586 | ||
1587 | if (spec->indep_hp && !indep_hp_possible(codec)) | ||
1588 | badness += BAD_NO_INDEP_HP; | ||
1589 | |||
1548 | /* re-fill the shared DAC for speaker / headphone */ | 1590 | /* re-fill the shared DAC for speaker / headphone */ |
1549 | if (cfg->line_out_type != AUTO_PIN_HP_OUT) | 1591 | if (cfg->line_out_type != AUTO_PIN_HP_OUT) |
1550 | refill_shared_dacs(codec, cfg->hp_outs, | 1592 | refill_shared_dacs(codec, cfg->hp_outs, |
@@ -1758,6 +1800,10 @@ static int parse_output_paths(struct hda_codec *codec) | |||
1758 | cfg->speaker_pins, val); | 1800 | cfg->speaker_pins, val); |
1759 | } | 1801 | } |
1760 | 1802 | ||
1803 | /* clear indep_hp flag if not available */ | ||
1804 | if (spec->indep_hp && !indep_hp_possible(codec)) | ||
1805 | spec->indep_hp = 0; | ||
1806 | |||
1761 | kfree(best_cfg); | 1807 | kfree(best_cfg); |
1762 | return 0; | 1808 | return 0; |
1763 | } | 1809 | } |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 4cea6bb6fade..418bfc0eb0a3 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
@@ -415,6 +415,8 @@ struct azx_dev { | |||
415 | unsigned int opened :1; | 415 | unsigned int opened :1; |
416 | unsigned int running :1; | 416 | unsigned int running :1; |
417 | unsigned int irq_pending :1; | 417 | unsigned int irq_pending :1; |
418 | unsigned int prepared:1; | ||
419 | unsigned int locked:1; | ||
418 | /* | 420 | /* |
419 | * For VIA: | 421 | * For VIA: |
420 | * A flag to ensure DMA position is 0 | 422 | * A flag to ensure DMA position is 0 |
@@ -426,8 +428,25 @@ struct azx_dev { | |||
426 | 428 | ||
427 | struct timecounter azx_tc; | 429 | struct timecounter azx_tc; |
428 | struct cyclecounter azx_cc; | 430 | struct cyclecounter azx_cc; |
431 | |||
432 | #ifdef CONFIG_SND_HDA_DSP_LOADER | ||
433 | struct mutex dsp_mutex; | ||
434 | #endif | ||
429 | }; | 435 | }; |
430 | 436 | ||
437 | /* DSP lock helpers */ | ||
438 | #ifdef CONFIG_SND_HDA_DSP_LOADER | ||
439 | #define dsp_lock_init(dev) mutex_init(&(dev)->dsp_mutex) | ||
440 | #define dsp_lock(dev) mutex_lock(&(dev)->dsp_mutex) | ||
441 | #define dsp_unlock(dev) mutex_unlock(&(dev)->dsp_mutex) | ||
442 | #define dsp_is_locked(dev) ((dev)->locked) | ||
443 | #else | ||
444 | #define dsp_lock_init(dev) do {} while (0) | ||
445 | #define dsp_lock(dev) do {} while (0) | ||
446 | #define dsp_unlock(dev) do {} while (0) | ||
447 | #define dsp_is_locked(dev) 0 | ||
448 | #endif | ||
449 | |||
431 | /* CORB/RIRB */ | 450 | /* CORB/RIRB */ |
432 | struct azx_rb { | 451 | struct azx_rb { |
433 | u32 *buf; /* CORB/RIRB buffer | 452 | u32 *buf; /* CORB/RIRB buffer |
@@ -527,6 +546,10 @@ struct azx { | |||
527 | 546 | ||
528 | /* card list (for power_save trigger) */ | 547 | /* card list (for power_save trigger) */ |
529 | struct list_head list; | 548 | struct list_head list; |
549 | |||
550 | #ifdef CONFIG_SND_HDA_DSP_LOADER | ||
551 | struct azx_dev saved_azx_dev; | ||
552 | #endif | ||
530 | }; | 553 | }; |
531 | 554 | ||
532 | #define CREATE_TRACE_POINTS | 555 | #define CREATE_TRACE_POINTS |
@@ -1793,15 +1816,25 @@ azx_assign_device(struct azx *chip, struct snd_pcm_substream *substream) | |||
1793 | dev = chip->capture_index_offset; | 1816 | dev = chip->capture_index_offset; |
1794 | nums = chip->capture_streams; | 1817 | nums = chip->capture_streams; |
1795 | } | 1818 | } |
1796 | for (i = 0; i < nums; i++, dev++) | 1819 | for (i = 0; i < nums; i++, dev++) { |
1797 | if (!chip->azx_dev[dev].opened) { | 1820 | struct azx_dev *azx_dev = &chip->azx_dev[dev]; |
1798 | res = &chip->azx_dev[dev]; | 1821 | dsp_lock(azx_dev); |
1799 | if (res->assigned_key == key) | 1822 | if (!azx_dev->opened && !dsp_is_locked(azx_dev)) { |
1800 | break; | 1823 | res = azx_dev; |
1824 | if (res->assigned_key == key) { | ||
1825 | res->opened = 1; | ||
1826 | res->assigned_key = key; | ||
1827 | dsp_unlock(azx_dev); | ||
1828 | return azx_dev; | ||
1829 | } | ||
1801 | } | 1830 | } |
1831 | dsp_unlock(azx_dev); | ||
1832 | } | ||
1802 | if (res) { | 1833 | if (res) { |
1834 | dsp_lock(res); | ||
1803 | res->opened = 1; | 1835 | res->opened = 1; |
1804 | res->assigned_key = key; | 1836 | res->assigned_key = key; |
1837 | dsp_unlock(res); | ||
1805 | } | 1838 | } |
1806 | return res; | 1839 | return res; |
1807 | } | 1840 | } |
@@ -2009,6 +2042,12 @@ static int azx_pcm_hw_params(struct snd_pcm_substream *substream, | |||
2009 | struct azx_dev *azx_dev = get_azx_dev(substream); | 2042 | struct azx_dev *azx_dev = get_azx_dev(substream); |
2010 | int ret; | 2043 | int ret; |
2011 | 2044 | ||
2045 | dsp_lock(azx_dev); | ||
2046 | if (dsp_is_locked(azx_dev)) { | ||
2047 | ret = -EBUSY; | ||
2048 | goto unlock; | ||
2049 | } | ||
2050 | |||
2012 | mark_runtime_wc(chip, azx_dev, substream, false); | 2051 | mark_runtime_wc(chip, azx_dev, substream, false); |
2013 | azx_dev->bufsize = 0; | 2052 | azx_dev->bufsize = 0; |
2014 | azx_dev->period_bytes = 0; | 2053 | azx_dev->period_bytes = 0; |
@@ -2016,8 +2055,10 @@ static int azx_pcm_hw_params(struct snd_pcm_substream *substream, | |||
2016 | ret = snd_pcm_lib_malloc_pages(substream, | 2055 | ret = snd_pcm_lib_malloc_pages(substream, |
2017 | params_buffer_bytes(hw_params)); | 2056 | params_buffer_bytes(hw_params)); |
2018 | if (ret < 0) | 2057 | if (ret < 0) |
2019 | return ret; | 2058 | goto unlock; |
2020 | mark_runtime_wc(chip, azx_dev, substream, true); | 2059 | mark_runtime_wc(chip, azx_dev, substream, true); |
2060 | unlock: | ||
2061 | dsp_unlock(azx_dev); | ||
2021 | return ret; | 2062 | return ret; |
2022 | } | 2063 | } |
2023 | 2064 | ||
@@ -2029,16 +2070,21 @@ static int azx_pcm_hw_free(struct snd_pcm_substream *substream) | |||
2029 | struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream]; | 2070 | struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream]; |
2030 | 2071 | ||
2031 | /* reset BDL address */ | 2072 | /* reset BDL address */ |
2032 | azx_sd_writel(azx_dev, SD_BDLPL, 0); | 2073 | dsp_lock(azx_dev); |
2033 | azx_sd_writel(azx_dev, SD_BDLPU, 0); | 2074 | if (!dsp_is_locked(azx_dev)) { |
2034 | azx_sd_writel(azx_dev, SD_CTL, 0); | 2075 | azx_sd_writel(azx_dev, SD_BDLPL, 0); |
2035 | azx_dev->bufsize = 0; | 2076 | azx_sd_writel(azx_dev, SD_BDLPU, 0); |
2036 | azx_dev->period_bytes = 0; | 2077 | azx_sd_writel(azx_dev, SD_CTL, 0); |
2037 | azx_dev->format_val = 0; | 2078 | azx_dev->bufsize = 0; |
2079 | azx_dev->period_bytes = 0; | ||
2080 | azx_dev->format_val = 0; | ||
2081 | } | ||
2038 | 2082 | ||
2039 | snd_hda_codec_cleanup(apcm->codec, hinfo, substream); | 2083 | snd_hda_codec_cleanup(apcm->codec, hinfo, substream); |
2040 | 2084 | ||
2041 | mark_runtime_wc(chip, azx_dev, substream, false); | 2085 | mark_runtime_wc(chip, azx_dev, substream, false); |
2086 | azx_dev->prepared = 0; | ||
2087 | dsp_unlock(azx_dev); | ||
2042 | return snd_pcm_lib_free_pages(substream); | 2088 | return snd_pcm_lib_free_pages(substream); |
2043 | } | 2089 | } |
2044 | 2090 | ||
@@ -2055,6 +2101,12 @@ static int azx_pcm_prepare(struct snd_pcm_substream *substream) | |||
2055 | snd_hda_spdif_out_of_nid(apcm->codec, hinfo->nid); | 2101 | snd_hda_spdif_out_of_nid(apcm->codec, hinfo->nid); |
2056 | unsigned short ctls = spdif ? spdif->ctls : 0; | 2102 | unsigned short ctls = spdif ? spdif->ctls : 0; |
2057 | 2103 | ||
2104 | dsp_lock(azx_dev); | ||
2105 | if (dsp_is_locked(azx_dev)) { | ||
2106 | err = -EBUSY; | ||
2107 | goto unlock; | ||
2108 | } | ||
2109 | |||
2058 | azx_stream_reset(chip, azx_dev); | 2110 | azx_stream_reset(chip, azx_dev); |
2059 | format_val = snd_hda_calc_stream_format(runtime->rate, | 2111 | format_val = snd_hda_calc_stream_format(runtime->rate, |
2060 | runtime->channels, | 2112 | runtime->channels, |
@@ -2065,7 +2117,8 @@ static int azx_pcm_prepare(struct snd_pcm_substream *substream) | |||
2065 | snd_printk(KERN_ERR SFX | 2117 | snd_printk(KERN_ERR SFX |
2066 | "%s: invalid format_val, rate=%d, ch=%d, format=%d\n", | 2118 | "%s: invalid format_val, rate=%d, ch=%d, format=%d\n", |
2067 | pci_name(chip->pci), runtime->rate, runtime->channels, runtime->format); | 2119 | pci_name(chip->pci), runtime->rate, runtime->channels, runtime->format); |
2068 | return -EINVAL; | 2120 | err = -EINVAL; |
2121 | goto unlock; | ||
2069 | } | 2122 | } |
2070 | 2123 | ||
2071 | bufsize = snd_pcm_lib_buffer_bytes(substream); | 2124 | bufsize = snd_pcm_lib_buffer_bytes(substream); |
@@ -2084,7 +2137,7 @@ static int azx_pcm_prepare(struct snd_pcm_substream *substream) | |||
2084 | azx_dev->no_period_wakeup = runtime->no_period_wakeup; | 2137 | azx_dev->no_period_wakeup = runtime->no_period_wakeup; |
2085 | err = azx_setup_periods(chip, substream, azx_dev); | 2138 | err = azx_setup_periods(chip, substream, azx_dev); |
2086 | if (err < 0) | 2139 | if (err < 0) |
2087 | return err; | 2140 | goto unlock; |
2088 | } | 2141 | } |
2089 | 2142 | ||
2090 | /* wallclk has 24Mhz clock source */ | 2143 | /* wallclk has 24Mhz clock source */ |
@@ -2101,8 +2154,14 @@ static int azx_pcm_prepare(struct snd_pcm_substream *substream) | |||
2101 | if ((chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND) && | 2154 | if ((chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND) && |
2102 | stream_tag > chip->capture_streams) | 2155 | stream_tag > chip->capture_streams) |
2103 | stream_tag -= chip->capture_streams; | 2156 | stream_tag -= chip->capture_streams; |
2104 | return snd_hda_codec_prepare(apcm->codec, hinfo, stream_tag, | 2157 | err = snd_hda_codec_prepare(apcm->codec, hinfo, stream_tag, |
2105 | azx_dev->format_val, substream); | 2158 | azx_dev->format_val, substream); |
2159 | |||
2160 | unlock: | ||
2161 | if (!err) | ||
2162 | azx_dev->prepared = 1; | ||
2163 | dsp_unlock(azx_dev); | ||
2164 | return err; | ||
2106 | } | 2165 | } |
2107 | 2166 | ||
2108 | static int azx_pcm_trigger(struct snd_pcm_substream *substream, int cmd) | 2167 | static int azx_pcm_trigger(struct snd_pcm_substream *substream, int cmd) |
@@ -2117,6 +2176,9 @@ static int azx_pcm_trigger(struct snd_pcm_substream *substream, int cmd) | |||
2117 | azx_dev = get_azx_dev(substream); | 2176 | azx_dev = get_azx_dev(substream); |
2118 | trace_azx_pcm_trigger(chip, azx_dev, cmd); | 2177 | trace_azx_pcm_trigger(chip, azx_dev, cmd); |
2119 | 2178 | ||
2179 | if (dsp_is_locked(azx_dev) || !azx_dev->prepared) | ||
2180 | return -EPIPE; | ||
2181 | |||
2120 | switch (cmd) { | 2182 | switch (cmd) { |
2121 | case SNDRV_PCM_TRIGGER_START: | 2183 | case SNDRV_PCM_TRIGGER_START: |
2122 | rstart = 1; | 2184 | rstart = 1; |
@@ -2621,17 +2683,27 @@ static int azx_load_dsp_prepare(struct hda_bus *bus, unsigned int format, | |||
2621 | struct azx_dev *azx_dev; | 2683 | struct azx_dev *azx_dev; |
2622 | int err; | 2684 | int err; |
2623 | 2685 | ||
2624 | if (snd_hda_lock_devices(bus)) | 2686 | azx_dev = azx_get_dsp_loader_dev(chip); |
2625 | return -EBUSY; | 2687 | |
2688 | dsp_lock(azx_dev); | ||
2689 | spin_lock_irq(&chip->reg_lock); | ||
2690 | if (azx_dev->running || azx_dev->locked) { | ||
2691 | spin_unlock_irq(&chip->reg_lock); | ||
2692 | err = -EBUSY; | ||
2693 | goto unlock; | ||
2694 | } | ||
2695 | azx_dev->prepared = 0; | ||
2696 | chip->saved_azx_dev = *azx_dev; | ||
2697 | azx_dev->locked = 1; | ||
2698 | spin_unlock_irq(&chip->reg_lock); | ||
2626 | 2699 | ||
2627 | err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV_SG, | 2700 | err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV_SG, |
2628 | snd_dma_pci_data(chip->pci), | 2701 | snd_dma_pci_data(chip->pci), |
2629 | byte_size, bufp); | 2702 | byte_size, bufp); |
2630 | if (err < 0) | 2703 | if (err < 0) |
2631 | goto unlock; | 2704 | goto err_alloc; |
2632 | 2705 | ||
2633 | mark_pages_wc(chip, bufp, true); | 2706 | mark_pages_wc(chip, bufp, true); |
2634 | azx_dev = azx_get_dsp_loader_dev(chip); | ||
2635 | azx_dev->bufsize = byte_size; | 2707 | azx_dev->bufsize = byte_size; |
2636 | azx_dev->period_bytes = byte_size; | 2708 | azx_dev->period_bytes = byte_size; |
2637 | azx_dev->format_val = format; | 2709 | azx_dev->format_val = format; |
@@ -2649,13 +2721,20 @@ static int azx_load_dsp_prepare(struct hda_bus *bus, unsigned int format, | |||
2649 | goto error; | 2721 | goto error; |
2650 | 2722 | ||
2651 | azx_setup_controller(chip, azx_dev); | 2723 | azx_setup_controller(chip, azx_dev); |
2724 | dsp_unlock(azx_dev); | ||
2652 | return azx_dev->stream_tag; | 2725 | return azx_dev->stream_tag; |
2653 | 2726 | ||
2654 | error: | 2727 | error: |
2655 | mark_pages_wc(chip, bufp, false); | 2728 | mark_pages_wc(chip, bufp, false); |
2656 | snd_dma_free_pages(bufp); | 2729 | snd_dma_free_pages(bufp); |
2657 | unlock: | 2730 | err_alloc: |
2658 | snd_hda_unlock_devices(bus); | 2731 | spin_lock_irq(&chip->reg_lock); |
2732 | if (azx_dev->opened) | ||
2733 | *azx_dev = chip->saved_azx_dev; | ||
2734 | azx_dev->locked = 0; | ||
2735 | spin_unlock_irq(&chip->reg_lock); | ||
2736 | unlock: | ||
2737 | dsp_unlock(azx_dev); | ||
2659 | return err; | 2738 | return err; |
2660 | } | 2739 | } |
2661 | 2740 | ||
@@ -2677,9 +2756,10 @@ static void azx_load_dsp_cleanup(struct hda_bus *bus, | |||
2677 | struct azx *chip = bus->private_data; | 2756 | struct azx *chip = bus->private_data; |
2678 | struct azx_dev *azx_dev = azx_get_dsp_loader_dev(chip); | 2757 | struct azx_dev *azx_dev = azx_get_dsp_loader_dev(chip); |
2679 | 2758 | ||
2680 | if (!dmab->area) | 2759 | if (!dmab->area || !azx_dev->locked) |
2681 | return; | 2760 | return; |
2682 | 2761 | ||
2762 | dsp_lock(azx_dev); | ||
2683 | /* reset BDL address */ | 2763 | /* reset BDL address */ |
2684 | azx_sd_writel(azx_dev, SD_BDLPL, 0); | 2764 | azx_sd_writel(azx_dev, SD_BDLPL, 0); |
2685 | azx_sd_writel(azx_dev, SD_BDLPU, 0); | 2765 | azx_sd_writel(azx_dev, SD_BDLPU, 0); |
@@ -2692,7 +2772,12 @@ static void azx_load_dsp_cleanup(struct hda_bus *bus, | |||
2692 | snd_dma_free_pages(dmab); | 2772 | snd_dma_free_pages(dmab); |
2693 | dmab->area = NULL; | 2773 | dmab->area = NULL; |
2694 | 2774 | ||
2695 | snd_hda_unlock_devices(bus); | 2775 | spin_lock_irq(&chip->reg_lock); |
2776 | if (azx_dev->opened) | ||
2777 | *azx_dev = chip->saved_azx_dev; | ||
2778 | azx_dev->locked = 0; | ||
2779 | spin_unlock_irq(&chip->reg_lock); | ||
2780 | dsp_unlock(azx_dev); | ||
2696 | } | 2781 | } |
2697 | #endif /* CONFIG_SND_HDA_DSP_LOADER */ | 2782 | #endif /* CONFIG_SND_HDA_DSP_LOADER */ |
2698 | 2783 | ||
@@ -3481,6 +3566,7 @@ static int azx_first_init(struct azx *chip) | |||
3481 | } | 3566 | } |
3482 | 3567 | ||
3483 | for (i = 0; i < chip->num_streams; i++) { | 3568 | for (i = 0; i < chip->num_streams; i++) { |
3569 | dsp_lock_init(&chip->azx_dev[i]); | ||
3484 | /* allocate memory for the BDL for each stream */ | 3570 | /* allocate memory for the BDL for each stream */ |
3485 | err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, | 3571 | err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, |
3486 | snd_dma_pci_data(chip->pci), | 3572 | snd_dma_pci_data(chip->pci), |
diff --git a/sound/pci/hda/patch_ca0132.c b/sound/pci/hda/patch_ca0132.c index db02c1e96b08..0792b5725f9c 100644 --- a/sound/pci/hda/patch_ca0132.c +++ b/sound/pci/hda/patch_ca0132.c | |||
@@ -2298,6 +2298,11 @@ static int dspxfr_one_seg(struct hda_codec *codec, | |||
2298 | hda_frame_size_words = ((sample_rate_div == 0) ? 0 : | 2298 | hda_frame_size_words = ((sample_rate_div == 0) ? 0 : |
2299 | (num_chans * sample_rate_mul / sample_rate_div)); | 2299 | (num_chans * sample_rate_mul / sample_rate_div)); |
2300 | 2300 | ||
2301 | if (hda_frame_size_words == 0) { | ||
2302 | snd_printdd(KERN_ERR "frmsz zero\n"); | ||
2303 | return -EINVAL; | ||
2304 | } | ||
2305 | |||
2301 | buffer_size_words = min(buffer_size_words, | 2306 | buffer_size_words = min(buffer_size_words, |
2302 | (unsigned int)(UC_RANGE(chip_addx, 1) ? | 2307 | (unsigned int)(UC_RANGE(chip_addx, 1) ? |
2303 | 65536 : 32768)); | 2308 | 65536 : 32768)); |
@@ -2308,8 +2313,7 @@ static int dspxfr_one_seg(struct hda_codec *codec, | |||
2308 | chip_addx, hda_frame_size_words, num_chans, | 2313 | chip_addx, hda_frame_size_words, num_chans, |
2309 | sample_rate_mul, sample_rate_div, buffer_size_words); | 2314 | sample_rate_mul, sample_rate_div, buffer_size_words); |
2310 | 2315 | ||
2311 | if ((buffer_addx == NULL) || (hda_frame_size_words == 0) || | 2316 | if (buffer_size_words < hda_frame_size_words) { |
2312 | (buffer_size_words < hda_frame_size_words)) { | ||
2313 | snd_printdd(KERN_ERR "dspxfr_one_seg:failed\n"); | 2317 | snd_printdd(KERN_ERR "dspxfr_one_seg:failed\n"); |
2314 | return -EINVAL; | 2318 | return -EINVAL; |
2315 | } | 2319 | } |
@@ -3235,7 +3239,7 @@ static int ca0132_set_vipsource(struct hda_codec *codec, int val) | |||
3235 | struct ca0132_spec *spec = codec->spec; | 3239 | struct ca0132_spec *spec = codec->spec; |
3236 | unsigned int tmp; | 3240 | unsigned int tmp; |
3237 | 3241 | ||
3238 | if (!dspload_is_loaded(codec)) | 3242 | if (spec->dsp_state != DSP_DOWNLOADED) |
3239 | return 0; | 3243 | return 0; |
3240 | 3244 | ||
3241 | /* if CrystalVoice if off, vipsource should be 0 */ | 3245 | /* if CrystalVoice if off, vipsource should be 0 */ |
@@ -4263,11 +4267,12 @@ static void ca0132_refresh_widget_caps(struct hda_codec *codec) | |||
4263 | */ | 4267 | */ |
4264 | static void ca0132_setup_defaults(struct hda_codec *codec) | 4268 | static void ca0132_setup_defaults(struct hda_codec *codec) |
4265 | { | 4269 | { |
4270 | struct ca0132_spec *spec = codec->spec; | ||
4266 | unsigned int tmp; | 4271 | unsigned int tmp; |
4267 | int num_fx; | 4272 | int num_fx; |
4268 | int idx, i; | 4273 | int idx, i; |
4269 | 4274 | ||
4270 | if (!dspload_is_loaded(codec)) | 4275 | if (spec->dsp_state != DSP_DOWNLOADED) |
4271 | return; | 4276 | return; |
4272 | 4277 | ||
4273 | /* out, in effects + voicefx */ | 4278 | /* out, in effects + voicefx */ |
@@ -4347,12 +4352,16 @@ static bool ca0132_download_dsp_images(struct hda_codec *codec) | |||
4347 | return false; | 4352 | return false; |
4348 | 4353 | ||
4349 | dsp_os_image = (struct dsp_image_seg *)(fw_entry->data); | 4354 | dsp_os_image = (struct dsp_image_seg *)(fw_entry->data); |
4350 | dspload_image(codec, dsp_os_image, 0, 0, true, 0); | 4355 | if (dspload_image(codec, dsp_os_image, 0, 0, true, 0)) { |
4356 | pr_err("ca0132 dspload_image failed.\n"); | ||
4357 | goto exit_download; | ||
4358 | } | ||
4359 | |||
4351 | dsp_loaded = dspload_wait_loaded(codec); | 4360 | dsp_loaded = dspload_wait_loaded(codec); |
4352 | 4361 | ||
4362 | exit_download: | ||
4353 | release_firmware(fw_entry); | 4363 | release_firmware(fw_entry); |
4354 | 4364 | ||
4355 | |||
4356 | return dsp_loaded; | 4365 | return dsp_loaded; |
4357 | } | 4366 | } |
4358 | 4367 | ||
@@ -4363,16 +4372,13 @@ static void ca0132_download_dsp(struct hda_codec *codec) | |||
4363 | #ifndef CONFIG_SND_HDA_CODEC_CA0132_DSP | 4372 | #ifndef CONFIG_SND_HDA_CODEC_CA0132_DSP |
4364 | return; /* NOP */ | 4373 | return; /* NOP */ |
4365 | #endif | 4374 | #endif |
4366 | spec->dsp_state = DSP_DOWNLOAD_INIT; | ||
4367 | 4375 | ||
4368 | if (spec->dsp_state == DSP_DOWNLOAD_INIT) { | 4376 | chipio_enable_clocks(codec); |
4369 | chipio_enable_clocks(codec); | 4377 | spec->dsp_state = DSP_DOWNLOADING; |
4370 | spec->dsp_state = DSP_DOWNLOADING; | 4378 | if (!ca0132_download_dsp_images(codec)) |
4371 | if (!ca0132_download_dsp_images(codec)) | 4379 | spec->dsp_state = DSP_DOWNLOAD_FAILED; |
4372 | spec->dsp_state = DSP_DOWNLOAD_FAILED; | 4380 | else |
4373 | else | 4381 | spec->dsp_state = DSP_DOWNLOADED; |
4374 | spec->dsp_state = DSP_DOWNLOADED; | ||
4375 | } | ||
4376 | 4382 | ||
4377 | if (spec->dsp_state == DSP_DOWNLOADED) | 4383 | if (spec->dsp_state == DSP_DOWNLOADED) |
4378 | ca0132_set_dsp_msr(codec, true); | 4384 | ca0132_set_dsp_msr(codec, true); |
diff --git a/sound/pci/hda/patch_cirrus.c b/sound/pci/hda/patch_cirrus.c index 72ebb8a36b13..0d9c58f13560 100644 --- a/sound/pci/hda/patch_cirrus.c +++ b/sound/pci/hda/patch_cirrus.c | |||
@@ -168,10 +168,10 @@ static void cs_automute(struct hda_codec *codec) | |||
168 | snd_hda_gen_update_outputs(codec); | 168 | snd_hda_gen_update_outputs(codec); |
169 | 169 | ||
170 | if (spec->gpio_eapd_hp) { | 170 | if (spec->gpio_eapd_hp) { |
171 | unsigned int gpio = spec->gen.hp_jack_present ? | 171 | spec->gpio_data = spec->gen.hp_jack_present ? |
172 | spec->gpio_eapd_hp : spec->gpio_eapd_speaker; | 172 | spec->gpio_eapd_hp : spec->gpio_eapd_speaker; |
173 | snd_hda_codec_write(codec, 0x01, 0, | 173 | snd_hda_codec_write(codec, 0x01, 0, |
174 | AC_VERB_SET_GPIO_DATA, gpio); | 174 | AC_VERB_SET_GPIO_DATA, spec->gpio_data); |
175 | } | 175 | } |
176 | } | 176 | } |
177 | 177 | ||
@@ -506,6 +506,8 @@ static int patch_cs420x(struct hda_codec *codec) | |||
506 | if (!spec) | 506 | if (!spec) |
507 | return -ENOMEM; | 507 | return -ENOMEM; |
508 | 508 | ||
509 | spec->gen.automute_hook = cs_automute; | ||
510 | |||
509 | snd_hda_pick_fixup(codec, cs420x_models, cs420x_fixup_tbl, | 511 | snd_hda_pick_fixup(codec, cs420x_models, cs420x_fixup_tbl, |
510 | cs420x_fixups); | 512 | cs420x_fixups); |
511 | snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); | 513 | snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); |
@@ -893,6 +895,8 @@ static int patch_cs4210(struct hda_codec *codec) | |||
893 | if (!spec) | 895 | if (!spec) |
894 | return -ENOMEM; | 896 | return -ENOMEM; |
895 | 897 | ||
898 | spec->gen.automute_hook = cs_automute; | ||
899 | |||
896 | snd_hda_pick_fixup(codec, cs421x_models, cs421x_fixup_tbl, | 900 | snd_hda_pick_fixup(codec, cs421x_models, cs421x_fixup_tbl, |
897 | cs421x_fixups); | 901 | cs421x_fixups); |
898 | snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); | 902 | snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); |
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index 941bf6c766ec..2a89d1eefeb6 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c | |||
@@ -1142,7 +1142,7 @@ static int patch_cxt5045(struct hda_codec *codec) | |||
1142 | } | 1142 | } |
1143 | 1143 | ||
1144 | if (spec->beep_amp) | 1144 | if (spec->beep_amp) |
1145 | snd_hda_attach_beep_device(codec, spec->beep_amp); | 1145 | snd_hda_attach_beep_device(codec, get_amp_nid_(spec->beep_amp)); |
1146 | 1146 | ||
1147 | return 0; | 1147 | return 0; |
1148 | } | 1148 | } |
@@ -1921,7 +1921,7 @@ static int patch_cxt5051(struct hda_codec *codec) | |||
1921 | } | 1921 | } |
1922 | 1922 | ||
1923 | if (spec->beep_amp) | 1923 | if (spec->beep_amp) |
1924 | snd_hda_attach_beep_device(codec, spec->beep_amp); | 1924 | snd_hda_attach_beep_device(codec, get_amp_nid_(spec->beep_amp)); |
1925 | 1925 | ||
1926 | return 0; | 1926 | return 0; |
1927 | } | 1927 | } |
@@ -3099,7 +3099,7 @@ static int patch_cxt5066(struct hda_codec *codec) | |||
3099 | } | 3099 | } |
3100 | 3100 | ||
3101 | if (spec->beep_amp) | 3101 | if (spec->beep_amp) |
3102 | snd_hda_attach_beep_device(codec, spec->beep_amp); | 3102 | snd_hda_attach_beep_device(codec, get_amp_nid_(spec->beep_amp)); |
3103 | 3103 | ||
3104 | return 0; | 3104 | return 0; |
3105 | } | 3105 | } |
@@ -3191,11 +3191,17 @@ static int cx_auto_build_controls(struct hda_codec *codec) | |||
3191 | return 0; | 3191 | return 0; |
3192 | } | 3192 | } |
3193 | 3193 | ||
3194 | static void cx_auto_free(struct hda_codec *codec) | ||
3195 | { | ||
3196 | snd_hda_detach_beep_device(codec); | ||
3197 | snd_hda_gen_free(codec); | ||
3198 | } | ||
3199 | |||
3194 | static const struct hda_codec_ops cx_auto_patch_ops = { | 3200 | static const struct hda_codec_ops cx_auto_patch_ops = { |
3195 | .build_controls = cx_auto_build_controls, | 3201 | .build_controls = cx_auto_build_controls, |
3196 | .build_pcms = snd_hda_gen_build_pcms, | 3202 | .build_pcms = snd_hda_gen_build_pcms, |
3197 | .init = snd_hda_gen_init, | 3203 | .init = snd_hda_gen_init, |
3198 | .free = snd_hda_gen_free, | 3204 | .free = cx_auto_free, |
3199 | .unsol_event = snd_hda_jack_unsol_event, | 3205 | .unsol_event = snd_hda_jack_unsol_event, |
3200 | #ifdef CONFIG_PM | 3206 | #ifdef CONFIG_PM |
3201 | .check_power_status = snd_hda_gen_check_power_status, | 3207 | .check_power_status = snd_hda_gen_check_power_status, |
@@ -3391,7 +3397,7 @@ static int patch_conexant_auto(struct hda_codec *codec) | |||
3391 | 3397 | ||
3392 | codec->patch_ops = cx_auto_patch_ops; | 3398 | codec->patch_ops = cx_auto_patch_ops; |
3393 | if (spec->beep_amp) | 3399 | if (spec->beep_amp) |
3394 | snd_hda_attach_beep_device(codec, spec->beep_amp); | 3400 | snd_hda_attach_beep_device(codec, get_amp_nid_(spec->beep_amp)); |
3395 | 3401 | ||
3396 | /* Some laptops with Conexant chips show stalls in S3 resume, | 3402 | /* Some laptops with Conexant chips show stalls in S3 resume, |
3397 | * which falls into the single-cmd mode. | 3403 | * which falls into the single-cmd mode. |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 2d4237bc0d8e..563c24df4d6f 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -3163,6 +3163,7 @@ static int patch_alc269(struct hda_codec *codec) | |||
3163 | case 0x10ec0290: | 3163 | case 0x10ec0290: |
3164 | spec->codec_variant = ALC269_TYPE_ALC280; | 3164 | spec->codec_variant = ALC269_TYPE_ALC280; |
3165 | break; | 3165 | break; |
3166 | case 0x10ec0233: | ||
3166 | case 0x10ec0282: | 3167 | case 0x10ec0282: |
3167 | case 0x10ec0283: | 3168 | case 0x10ec0283: |
3168 | spec->codec_variant = ALC269_TYPE_ALC282; | 3169 | spec->codec_variant = ALC269_TYPE_ALC282; |
@@ -3862,6 +3863,7 @@ static int patch_alc680(struct hda_codec *codec) | |||
3862 | */ | 3863 | */ |
3863 | static const struct hda_codec_preset snd_hda_preset_realtek[] = { | 3864 | static const struct hda_codec_preset snd_hda_preset_realtek[] = { |
3864 | { .id = 0x10ec0221, .name = "ALC221", .patch = patch_alc269 }, | 3865 | { .id = 0x10ec0221, .name = "ALC221", .patch = patch_alc269 }, |
3866 | { .id = 0x10ec0233, .name = "ALC233", .patch = patch_alc269 }, | ||
3865 | { .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 }, | 3867 | { .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 }, |
3866 | { .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 }, | 3868 | { .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 }, |
3867 | { .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 }, | 3869 | { .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 }, |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 83d5335ac348..dafe04ae8c72 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
@@ -815,6 +815,29 @@ static int find_mute_led_cfg(struct hda_codec *codec, int default_polarity) | |||
815 | return 0; | 815 | return 0; |
816 | } | 816 | } |
817 | 817 | ||
818 | /* check whether a built-in speaker is included in parsed pins */ | ||
819 | static bool has_builtin_speaker(struct hda_codec *codec) | ||
820 | { | ||
821 | struct sigmatel_spec *spec = codec->spec; | ||
822 | hda_nid_t *nid_pin; | ||
823 | int nids, i; | ||
824 | |||
825 | if (spec->gen.autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT) { | ||
826 | nid_pin = spec->gen.autocfg.line_out_pins; | ||
827 | nids = spec->gen.autocfg.line_outs; | ||
828 | } else { | ||
829 | nid_pin = spec->gen.autocfg.speaker_pins; | ||
830 | nids = spec->gen.autocfg.speaker_outs; | ||
831 | } | ||
832 | |||
833 | for (i = 0; i < nids; i++) { | ||
834 | unsigned int def_conf = snd_hda_codec_get_pincfg(codec, nid_pin[i]); | ||
835 | if (snd_hda_get_input_pin_attr(def_conf) == INPUT_PIN_ATTR_INT) | ||
836 | return true; | ||
837 | } | ||
838 | return false; | ||
839 | } | ||
840 | |||
818 | /* | 841 | /* |
819 | * PC beep controls | 842 | * PC beep controls |
820 | */ | 843 | */ |
@@ -3890,6 +3913,12 @@ static int patch_stac92hd73xx(struct hda_codec *codec) | |||
3890 | return err; | 3913 | return err; |
3891 | } | 3914 | } |
3892 | 3915 | ||
3916 | /* Don't GPIO-mute speakers if there are no internal speakers, because | ||
3917 | * the GPIO might be necessary for Headphone | ||
3918 | */ | ||
3919 | if (spec->eapd_switch && !has_builtin_speaker(codec)) | ||
3920 | spec->eapd_switch = 0; | ||
3921 | |||
3893 | codec->proc_widget_hook = stac92hd7x_proc_hook; | 3922 | codec->proc_widget_hook = stac92hd7x_proc_hook; |
3894 | 3923 | ||
3895 | snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); | 3924 | snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE); |
diff --git a/sound/pci/ice1712/ice1712.c b/sound/pci/ice1712/ice1712.c index 2ffdc35d5ffd..806407a3973e 100644 --- a/sound/pci/ice1712/ice1712.c +++ b/sound/pci/ice1712/ice1712.c | |||
@@ -2594,6 +2594,8 @@ static int snd_ice1712_create(struct snd_card *card, | |||
2594 | snd_ice1712_proc_init(ice); | 2594 | snd_ice1712_proc_init(ice); |
2595 | synchronize_irq(pci->irq); | 2595 | synchronize_irq(pci->irq); |
2596 | 2596 | ||
2597 | card->private_data = ice; | ||
2598 | |||
2597 | err = pci_request_regions(pci, "ICE1712"); | 2599 | err = pci_request_regions(pci, "ICE1712"); |
2598 | if (err < 0) { | 2600 | if (err < 0) { |
2599 | kfree(ice); | 2601 | kfree(ice); |
diff --git a/sound/soc/codecs/wm5102.c b/sound/soc/codecs/wm5102.c index b8d461db369f..b82bbf584146 100644 --- a/sound/soc/codecs/wm5102.c +++ b/sound/soc/codecs/wm5102.c | |||
@@ -573,6 +573,13 @@ static const struct reg_default wm5102_sysclk_reva_patch[] = { | |||
573 | { 0x025e, 0x0112 }, | 573 | { 0x025e, 0x0112 }, |
574 | }; | 574 | }; |
575 | 575 | ||
576 | static const struct reg_default wm5102_sysclk_revb_patch[] = { | ||
577 | { 0x3081, 0x08FE }, | ||
578 | { 0x3083, 0x00ED }, | ||
579 | { 0x30C1, 0x08FE }, | ||
580 | { 0x30C3, 0x00ED }, | ||
581 | }; | ||
582 | |||
576 | static int wm5102_sysclk_ev(struct snd_soc_dapm_widget *w, | 583 | static int wm5102_sysclk_ev(struct snd_soc_dapm_widget *w, |
577 | struct snd_kcontrol *kcontrol, int event) | 584 | struct snd_kcontrol *kcontrol, int event) |
578 | { | 585 | { |
@@ -587,6 +594,10 @@ static int wm5102_sysclk_ev(struct snd_soc_dapm_widget *w, | |||
587 | patch = wm5102_sysclk_reva_patch; | 594 | patch = wm5102_sysclk_reva_patch; |
588 | patch_size = ARRAY_SIZE(wm5102_sysclk_reva_patch); | 595 | patch_size = ARRAY_SIZE(wm5102_sysclk_reva_patch); |
589 | break; | 596 | break; |
597 | default: | ||
598 | patch = wm5102_sysclk_revb_patch; | ||
599 | patch_size = ARRAY_SIZE(wm5102_sysclk_revb_patch); | ||
600 | break; | ||
590 | } | 601 | } |
591 | 602 | ||
592 | switch (event) { | 603 | switch (event) { |
@@ -755,7 +766,7 @@ SOC_SINGLE("SPKDAT1 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_5L, | |||
755 | 766 | ||
756 | SOC_DOUBLE_R("HPOUT1 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_1L, | 767 | SOC_DOUBLE_R("HPOUT1 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_1L, |
757 | ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_MUTE_SHIFT, 1, 1), | 768 | ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_MUTE_SHIFT, 1, 1), |
758 | SOC_DOUBLE_R("OUT2 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_2L, | 769 | SOC_DOUBLE_R("HPOUT2 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_2L, |
759 | ARIZONA_DAC_DIGITAL_VOLUME_2R, ARIZONA_OUT2L_MUTE_SHIFT, 1, 1), | 770 | ARIZONA_DAC_DIGITAL_VOLUME_2R, ARIZONA_OUT2L_MUTE_SHIFT, 1, 1), |
760 | SOC_SINGLE("EPOUT Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_3L, | 771 | SOC_SINGLE("EPOUT Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_3L, |
761 | ARIZONA_OUT3L_MUTE_SHIFT, 1, 1), | 772 | ARIZONA_OUT3L_MUTE_SHIFT, 1, 1), |
@@ -767,7 +778,7 @@ SOC_DOUBLE_R("SPKDAT1 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_5L, | |||
767 | SOC_DOUBLE_R_TLV("HPOUT1 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_1L, | 778 | SOC_DOUBLE_R_TLV("HPOUT1 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_1L, |
768 | ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_VOL_SHIFT, | 779 | ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_VOL_SHIFT, |
769 | 0xbf, 0, digital_tlv), | 780 | 0xbf, 0, digital_tlv), |
770 | SOC_DOUBLE_R_TLV("OUT2 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_2L, | 781 | SOC_DOUBLE_R_TLV("HPOUT2 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_2L, |
771 | ARIZONA_DAC_DIGITAL_VOLUME_2R, ARIZONA_OUT2L_VOL_SHIFT, | 782 | ARIZONA_DAC_DIGITAL_VOLUME_2R, ARIZONA_OUT2L_VOL_SHIFT, |
772 | 0xbf, 0, digital_tlv), | 783 | 0xbf, 0, digital_tlv), |
773 | SOC_SINGLE_TLV("EPOUT Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_3L, | 784 | SOC_SINGLE_TLV("EPOUT Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_3L, |
diff --git a/sound/soc/codecs/wm5110.c b/sound/soc/codecs/wm5110.c index cd17b477781d..cdeb301da1f6 100644 --- a/sound/soc/codecs/wm5110.c +++ b/sound/soc/codecs/wm5110.c | |||
@@ -213,9 +213,9 @@ ARIZONA_MIXER_CONTROLS("SPKDAT2R", ARIZONA_OUT6RMIX_INPUT_1_SOURCE), | |||
213 | 213 | ||
214 | SOC_SINGLE("HPOUT1 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_1L, | 214 | SOC_SINGLE("HPOUT1 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_1L, |
215 | ARIZONA_OUT1_OSR_SHIFT, 1, 0), | 215 | ARIZONA_OUT1_OSR_SHIFT, 1, 0), |
216 | SOC_SINGLE("OUT2 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_2L, | 216 | SOC_SINGLE("HPOUT2 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_2L, |
217 | ARIZONA_OUT2_OSR_SHIFT, 1, 0), | 217 | ARIZONA_OUT2_OSR_SHIFT, 1, 0), |
218 | SOC_SINGLE("OUT3 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_3L, | 218 | SOC_SINGLE("HPOUT3 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_3L, |
219 | ARIZONA_OUT3_OSR_SHIFT, 1, 0), | 219 | ARIZONA_OUT3_OSR_SHIFT, 1, 0), |
220 | SOC_SINGLE("Speaker High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_4L, | 220 | SOC_SINGLE("Speaker High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_4L, |
221 | ARIZONA_OUT4_OSR_SHIFT, 1, 0), | 221 | ARIZONA_OUT4_OSR_SHIFT, 1, 0), |
@@ -226,9 +226,9 @@ SOC_SINGLE("SPKDAT2 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_6L, | |||
226 | 226 | ||
227 | SOC_DOUBLE_R("HPOUT1 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_1L, | 227 | SOC_DOUBLE_R("HPOUT1 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_1L, |
228 | ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_MUTE_SHIFT, 1, 1), | 228 | ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_MUTE_SHIFT, 1, 1), |
229 | SOC_DOUBLE_R("OUT2 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_2L, | 229 | SOC_DOUBLE_R("HPOUT2 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_2L, |
230 | ARIZONA_DAC_DIGITAL_VOLUME_2R, ARIZONA_OUT2L_MUTE_SHIFT, 1, 1), | 230 | ARIZONA_DAC_DIGITAL_VOLUME_2R, ARIZONA_OUT2L_MUTE_SHIFT, 1, 1), |
231 | SOC_DOUBLE_R("OUT3 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_3L, | 231 | SOC_DOUBLE_R("HPOUT3 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_3L, |
232 | ARIZONA_DAC_DIGITAL_VOLUME_3R, ARIZONA_OUT3L_MUTE_SHIFT, 1, 1), | 232 | ARIZONA_DAC_DIGITAL_VOLUME_3R, ARIZONA_OUT3L_MUTE_SHIFT, 1, 1), |
233 | SOC_DOUBLE_R("Speaker Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_4L, | 233 | SOC_DOUBLE_R("Speaker Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_4L, |
234 | ARIZONA_DAC_DIGITAL_VOLUME_4R, ARIZONA_OUT4L_MUTE_SHIFT, 1, 1), | 234 | 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 | SOC_DOUBLE_R_TLV("HPOUT1 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_1L, | 240 | SOC_DOUBLE_R_TLV("HPOUT1 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_1L, |
241 | ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_VOL_SHIFT, | 241 | ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_VOL_SHIFT, |
242 | 0xbf, 0, digital_tlv), | 242 | 0xbf, 0, digital_tlv), |
243 | SOC_DOUBLE_R_TLV("OUT2 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_2L, | 243 | SOC_DOUBLE_R_TLV("HPOUT2 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_2L, |
244 | ARIZONA_DAC_DIGITAL_VOLUME_2R, ARIZONA_OUT2L_VOL_SHIFT, | 244 | ARIZONA_DAC_DIGITAL_VOLUME_2R, ARIZONA_OUT2L_VOL_SHIFT, |
245 | 0xbf, 0, digital_tlv), | 245 | 0xbf, 0, digital_tlv), |
246 | SOC_DOUBLE_R_TLV("OUT3 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_3L, | 246 | SOC_DOUBLE_R_TLV("HPOUT3 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_3L, |
247 | ARIZONA_DAC_DIGITAL_VOLUME_3R, ARIZONA_OUT3L_VOL_SHIFT, | 247 | ARIZONA_DAC_DIGITAL_VOLUME_3R, ARIZONA_OUT3L_VOL_SHIFT, |
248 | 0xbf, 0, digital_tlv), | 248 | 0xbf, 0, digital_tlv), |
249 | SOC_DOUBLE_R_TLV("Speaker Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_4L, | 249 | 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 | ARIZONA_OUTPUT_PATH_CONFIG_1R, | 260 | ARIZONA_OUTPUT_PATH_CONFIG_1R, |
261 | ARIZONA_OUT1L_PGA_VOL_SHIFT, | 261 | ARIZONA_OUT1L_PGA_VOL_SHIFT, |
262 | 0x34, 0x40, 0, ana_tlv), | 262 | 0x34, 0x40, 0, ana_tlv), |
263 | SOC_DOUBLE_R_RANGE_TLV("OUT2 Volume", ARIZONA_OUTPUT_PATH_CONFIG_2L, | 263 | SOC_DOUBLE_R_RANGE_TLV("HPOUT2 Volume", ARIZONA_OUTPUT_PATH_CONFIG_2L, |
264 | ARIZONA_OUTPUT_PATH_CONFIG_2R, | 264 | ARIZONA_OUTPUT_PATH_CONFIG_2R, |
265 | ARIZONA_OUT2L_PGA_VOL_SHIFT, | 265 | ARIZONA_OUT2L_PGA_VOL_SHIFT, |
266 | 0x34, 0x40, 0, ana_tlv), | 266 | 0x34, 0x40, 0, ana_tlv), |
267 | SOC_DOUBLE_R_RANGE_TLV("OUT3 Volume", ARIZONA_OUTPUT_PATH_CONFIG_3L, | 267 | SOC_DOUBLE_R_RANGE_TLV("HPOUT3 Volume", ARIZONA_OUTPUT_PATH_CONFIG_3L, |
268 | ARIZONA_OUTPUT_PATH_CONFIG_3R, | 268 | ARIZONA_OUTPUT_PATH_CONFIG_3R, |
269 | ARIZONA_OUT3L_PGA_VOL_SHIFT, 0x34, 0x40, 0, ana_tlv), | 269 | ARIZONA_OUT3L_PGA_VOL_SHIFT, 0x34, 0x40, 0, ana_tlv), |
270 | 270 | ||
diff --git a/sound/soc/codecs/wm8350.c b/sound/soc/codecs/wm8350.c index ec0efc1443ba..0e8b3aaf6c8d 100644 --- a/sound/soc/codecs/wm8350.c +++ b/sound/soc/codecs/wm8350.c | |||
@@ -1301,7 +1301,7 @@ static irqreturn_t wm8350_hpl_jack_handler(int irq, void *data) | |||
1301 | if (device_may_wakeup(wm8350->dev)) | 1301 | if (device_may_wakeup(wm8350->dev)) |
1302 | pm_wakeup_event(wm8350->dev, 250); | 1302 | pm_wakeup_event(wm8350->dev, 250); |
1303 | 1303 | ||
1304 | schedule_delayed_work(&priv->hpl.work, 200); | 1304 | schedule_delayed_work(&priv->hpl.work, msecs_to_jiffies(200)); |
1305 | 1305 | ||
1306 | return IRQ_HANDLED; | 1306 | return IRQ_HANDLED; |
1307 | } | 1307 | } |
@@ -1318,7 +1318,7 @@ static irqreturn_t wm8350_hpr_jack_handler(int irq, void *data) | |||
1318 | if (device_may_wakeup(wm8350->dev)) | 1318 | if (device_may_wakeup(wm8350->dev)) |
1319 | pm_wakeup_event(wm8350->dev, 250); | 1319 | pm_wakeup_event(wm8350->dev, 250); |
1320 | 1320 | ||
1321 | schedule_delayed_work(&priv->hpr.work, 200); | 1321 | schedule_delayed_work(&priv->hpr.work, msecs_to_jiffies(200)); |
1322 | 1322 | ||
1323 | return IRQ_HANDLED; | 1323 | return IRQ_HANDLED; |
1324 | } | 1324 | } |
diff --git a/sound/soc/codecs/wm8960.c b/sound/soc/codecs/wm8960.c index 9bb927325993..a64b93425ae3 100644 --- a/sound/soc/codecs/wm8960.c +++ b/sound/soc/codecs/wm8960.c | |||
@@ -53,8 +53,8 @@ | |||
53 | * using 2 wire for device control, so we cache them instead. | 53 | * using 2 wire for device control, so we cache them instead. |
54 | */ | 54 | */ |
55 | static const struct reg_default wm8960_reg_defaults[] = { | 55 | static const struct reg_default wm8960_reg_defaults[] = { |
56 | { 0x0, 0x0097 }, | 56 | { 0x0, 0x00a7 }, |
57 | { 0x1, 0x0097 }, | 57 | { 0x1, 0x00a7 }, |
58 | { 0x2, 0x0000 }, | 58 | { 0x2, 0x0000 }, |
59 | { 0x3, 0x0000 }, | 59 | { 0x3, 0x0000 }, |
60 | { 0x4, 0x0000 }, | 60 | { 0x4, 0x0000 }, |
@@ -323,8 +323,8 @@ SND_SOC_DAPM_MIXER("Left Input Mixer", WM8960_POWER3, 5, 0, | |||
323 | SND_SOC_DAPM_MIXER("Right Input Mixer", WM8960_POWER3, 4, 0, | 323 | SND_SOC_DAPM_MIXER("Right Input Mixer", WM8960_POWER3, 4, 0, |
324 | wm8960_rin, ARRAY_SIZE(wm8960_rin)), | 324 | wm8960_rin, ARRAY_SIZE(wm8960_rin)), |
325 | 325 | ||
326 | SND_SOC_DAPM_ADC("Left ADC", "Capture", WM8960_POWER2, 3, 0), | 326 | SND_SOC_DAPM_ADC("Left ADC", "Capture", WM8960_POWER1, 3, 0), |
327 | SND_SOC_DAPM_ADC("Right ADC", "Capture", WM8960_POWER2, 2, 0), | 327 | SND_SOC_DAPM_ADC("Right ADC", "Capture", WM8960_POWER1, 2, 0), |
328 | 328 | ||
329 | SND_SOC_DAPM_DAC("Left DAC", "Playback", WM8960_POWER2, 8, 0), | 329 | SND_SOC_DAPM_DAC("Left DAC", "Playback", WM8960_POWER2, 8, 0), |
330 | SND_SOC_DAPM_DAC("Right DAC", "Playback", WM8960_POWER2, 7, 0), | 330 | SND_SOC_DAPM_DAC("Right DAC", "Playback", WM8960_POWER2, 7, 0), |
diff --git a/sound/soc/tegra/tegra20_i2s.h b/sound/soc/tegra/tegra20_i2s.h index c27069d24d77..729958713cd4 100644 --- a/sound/soc/tegra/tegra20_i2s.h +++ b/sound/soc/tegra/tegra20_i2s.h | |||
@@ -121,7 +121,7 @@ | |||
121 | 121 | ||
122 | #define TEGRA20_I2S_TIMING_NON_SYM_ENABLE (1 << 12) | 122 | #define TEGRA20_I2S_TIMING_NON_SYM_ENABLE (1 << 12) |
123 | #define TEGRA20_I2S_TIMING_CHANNEL_BIT_COUNT_SHIFT 0 | 123 | #define TEGRA20_I2S_TIMING_CHANNEL_BIT_COUNT_SHIFT 0 |
124 | #define TEGRA20_I2S_TIMING_CHANNEL_BIT_COUNT_MASK_US 0x7fff | 124 | #define TEGRA20_I2S_TIMING_CHANNEL_BIT_COUNT_MASK_US 0x7ff |
125 | #define TEGRA20_I2S_TIMING_CHANNEL_BIT_COUNT_MASK (TEGRA20_I2S_TIMING_CHANNEL_BIT_COUNT_MASK_US << TEGRA20_I2S_TIMING_CHANNEL_BIT_COUNT_SHIFT) | 125 | #define TEGRA20_I2S_TIMING_CHANNEL_BIT_COUNT_MASK (TEGRA20_I2S_TIMING_CHANNEL_BIT_COUNT_MASK_US << TEGRA20_I2S_TIMING_CHANNEL_BIT_COUNT_SHIFT) |
126 | 126 | ||
127 | /* Fields in TEGRA20_I2S_FIFO_SCR */ | 127 | /* Fields in TEGRA20_I2S_FIFO_SCR */ |
diff --git a/sound/soc/tegra/tegra30_i2s.h b/sound/soc/tegra/tegra30_i2s.h index 34dc47b9581c..a294d942b9f7 100644 --- a/sound/soc/tegra/tegra30_i2s.h +++ b/sound/soc/tegra/tegra30_i2s.h | |||
@@ -110,7 +110,7 @@ | |||
110 | 110 | ||
111 | #define TEGRA30_I2S_TIMING_NON_SYM_ENABLE (1 << 12) | 111 | #define TEGRA30_I2S_TIMING_NON_SYM_ENABLE (1 << 12) |
112 | #define TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_SHIFT 0 | 112 | #define TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_SHIFT 0 |
113 | #define TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_MASK_US 0x7fff | 113 | #define TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_MASK_US 0x7ff |
114 | #define TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_MASK (TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_MASK_US << TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_SHIFT) | 114 | #define TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_MASK (TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_MASK_US << TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_SHIFT) |
115 | 115 | ||
116 | /* Fields in TEGRA30_I2S_OFFSET */ | 116 | /* Fields in TEGRA30_I2S_OFFSET */ |
diff --git a/sound/usb/card.c b/sound/usb/card.c index 803953a9bff3..2da8ad75fd96 100644 --- a/sound/usb/card.c +++ b/sound/usb/card.c | |||
@@ -244,6 +244,21 @@ static int snd_usb_create_streams(struct snd_usb_audio *chip, int ctrlif) | |||
244 | usb_ifnum_to_if(dev, ctrlif)->intf_assoc; | 244 | usb_ifnum_to_if(dev, ctrlif)->intf_assoc; |
245 | 245 | ||
246 | if (!assoc) { | 246 | if (!assoc) { |
247 | /* | ||
248 | * Firmware writers cannot count to three. So to find | ||
249 | * the IAD on the NuForce UDH-100, also check the next | ||
250 | * interface. | ||
251 | */ | ||
252 | struct usb_interface *iface = | ||
253 | usb_ifnum_to_if(dev, ctrlif + 1); | ||
254 | if (iface && | ||
255 | iface->intf_assoc && | ||
256 | iface->intf_assoc->bFunctionClass == USB_CLASS_AUDIO && | ||
257 | iface->intf_assoc->bFunctionProtocol == UAC_VERSION_2) | ||
258 | assoc = iface->intf_assoc; | ||
259 | } | ||
260 | |||
261 | if (!assoc) { | ||
247 | snd_printk(KERN_ERR "Audio class v2 interfaces need an interface association\n"); | 262 | snd_printk(KERN_ERR "Audio class v2 interfaces need an interface association\n"); |
248 | return -EINVAL; | 263 | return -EINVAL; |
249 | } | 264 | } |
diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index 638e7f738018..ca4739c3f650 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c | |||
@@ -715,8 +715,9 @@ static int check_input_term(struct mixer_build *state, int id, struct usb_audio_ | |||
715 | case UAC2_CLOCK_SELECTOR: { | 715 | case UAC2_CLOCK_SELECTOR: { |
716 | struct uac_selector_unit_descriptor *d = p1; | 716 | struct uac_selector_unit_descriptor *d = p1; |
717 | /* call recursively to retrieve the channel info */ | 717 | /* call recursively to retrieve the channel info */ |
718 | if (check_input_term(state, d->baSourceID[0], term) < 0) | 718 | err = check_input_term(state, d->baSourceID[0], term); |
719 | return -ENODEV; | 719 | if (err < 0) |
720 | return err; | ||
720 | term->type = d->bDescriptorSubtype << 16; /* virtual type */ | 721 | term->type = d->bDescriptorSubtype << 16; /* virtual type */ |
721 | term->id = id; | 722 | term->id = id; |
722 | term->name = uac_selector_unit_iSelector(d); | 723 | term->name = uac_selector_unit_iSelector(d); |
@@ -725,7 +726,8 @@ static int check_input_term(struct mixer_build *state, int id, struct usb_audio_ | |||
725 | case UAC1_PROCESSING_UNIT: | 726 | case UAC1_PROCESSING_UNIT: |
726 | case UAC1_EXTENSION_UNIT: | 727 | case UAC1_EXTENSION_UNIT: |
727 | /* UAC2_PROCESSING_UNIT_V2 */ | 728 | /* UAC2_PROCESSING_UNIT_V2 */ |
728 | /* UAC2_EFFECT_UNIT */ { | 729 | /* UAC2_EFFECT_UNIT */ |
730 | case UAC2_EXTENSION_UNIT_V2: { | ||
729 | struct uac_processing_unit_descriptor *d = p1; | 731 | struct uac_processing_unit_descriptor *d = p1; |
730 | 732 | ||
731 | if (state->mixer->protocol == UAC_VERSION_2 && | 733 | if (state->mixer->protocol == UAC_VERSION_2 && |
@@ -1356,8 +1358,9 @@ static int parse_audio_feature_unit(struct mixer_build *state, int unitid, void | |||
1356 | return err; | 1358 | return err; |
1357 | 1359 | ||
1358 | /* determine the input source type and name */ | 1360 | /* determine the input source type and name */ |
1359 | if (check_input_term(state, hdr->bSourceID, &iterm) < 0) | 1361 | err = check_input_term(state, hdr->bSourceID, &iterm); |
1360 | return -EINVAL; | 1362 | if (err < 0) |
1363 | return err; | ||
1361 | 1364 | ||
1362 | master_bits = snd_usb_combine_bytes(bmaControls, csize); | 1365 | master_bits = snd_usb_combine_bytes(bmaControls, csize); |
1363 | /* master configuration quirks */ | 1366 | /* master configuration quirks */ |
@@ -2052,6 +2055,8 @@ static int parse_audio_unit(struct mixer_build *state, int unitid) | |||
2052 | return parse_audio_extension_unit(state, unitid, p1); | 2055 | return parse_audio_extension_unit(state, unitid, p1); |
2053 | else /* UAC_VERSION_2 */ | 2056 | else /* UAC_VERSION_2 */ |
2054 | return parse_audio_processing_unit(state, unitid, p1); | 2057 | return parse_audio_processing_unit(state, unitid, p1); |
2058 | case UAC2_EXTENSION_UNIT_V2: | ||
2059 | return parse_audio_extension_unit(state, unitid, p1); | ||
2055 | default: | 2060 | default: |
2056 | snd_printk(KERN_ERR "usbaudio: unit %u: unexpected type 0x%02x\n", unitid, p1[2]); | 2061 | snd_printk(KERN_ERR "usbaudio: unit %u: unexpected type 0x%02x\n", unitid, p1[2]); |
2057 | return -EINVAL; | 2062 | return -EINVAL; |
@@ -2118,7 +2123,7 @@ static int snd_usb_mixer_controls(struct usb_mixer_interface *mixer) | |||
2118 | state.oterm.type = le16_to_cpu(desc->wTerminalType); | 2123 | state.oterm.type = le16_to_cpu(desc->wTerminalType); |
2119 | state.oterm.name = desc->iTerminal; | 2124 | state.oterm.name = desc->iTerminal; |
2120 | err = parse_audio_unit(&state, desc->bSourceID); | 2125 | err = parse_audio_unit(&state, desc->bSourceID); |
2121 | if (err < 0) | 2126 | if (err < 0 && err != -EINVAL) |
2122 | return err; | 2127 | return err; |
2123 | } else { /* UAC_VERSION_2 */ | 2128 | } else { /* UAC_VERSION_2 */ |
2124 | struct uac2_output_terminal_descriptor *desc = p; | 2129 | struct uac2_output_terminal_descriptor *desc = p; |
@@ -2130,12 +2135,12 @@ static int snd_usb_mixer_controls(struct usb_mixer_interface *mixer) | |||
2130 | state.oterm.type = le16_to_cpu(desc->wTerminalType); | 2135 | state.oterm.type = le16_to_cpu(desc->wTerminalType); |
2131 | state.oterm.name = desc->iTerminal; | 2136 | state.oterm.name = desc->iTerminal; |
2132 | err = parse_audio_unit(&state, desc->bSourceID); | 2137 | err = parse_audio_unit(&state, desc->bSourceID); |
2133 | if (err < 0) | 2138 | if (err < 0 && err != -EINVAL) |
2134 | return err; | 2139 | return err; |
2135 | 2140 | ||
2136 | /* for UAC2, use the same approach to also add the clock selectors */ | 2141 | /* for UAC2, use the same approach to also add the clock selectors */ |
2137 | err = parse_audio_unit(&state, desc->bCSourceID); | 2142 | err = parse_audio_unit(&state, desc->bCSourceID); |
2138 | if (err < 0) | 2143 | if (err < 0 && err != -EINVAL) |
2139 | return err; | 2144 | return err; |
2140 | } | 2145 | } |
2141 | } | 2146 | } |