Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6: (26 commits)
ASoC: Fix power down for widgetless per-card DAPM context case
ASoC: wm1250-ev1: Define "WM1250 Output" with SND_SOC_DAPM_OUTPUT
ASoC: Remove duplicate linux/delay.h inclusion.
ASoC: sam9g20_wm8731: use the proper SYSCKL value
ASoC: wm8731: fix wm8731_check_osc() connected condition
ALSA: hda - Reorganize controller quriks with bit flags
ALSA: hda - Use snd_printd() in snd_hda_parse_pin_def_config()
ALSA: core: remove unused variables.
ALSA: HDA: Increase MAX_HDMI_PINS
ALSA: PCM - Don't check DMA time-out too shortly
MAINTAINERS: add FireWire audio maintainer
ALSA: usb-audio: more control quirks for M-Audio FastTrack devices
ALSA: usb-audio: add new quirk type QUIRK_AUDIO_STANDARD_MIXER
ALSA: usb-audio: export snd_usb_feature_unit_ctl
ALSA: usb-audio: rework add_control_to_empty()
ALSA: usb-audio: move assignment of chip->ctrl_intf
ALSA: hda - Use model=auto for Lenovo G555
ALSA: HDA: Unify HDMI hotplug handling.
ALSA: hda - Force AD1988_6STACK_DIG for Asus M3N-HT Deluxe
ASoC: core - remove superfluous new line.
...

+434 -286
+7
MAINTAINERS
··· 2584 2584 F: drivers/hwmon/f75375s.c 2585 2585 F: include/linux/f75375s.h 2586 2586 2587 + FIREWIRE AUDIO DRIVERS 2588 + M: Clemens Ladisch <clemens@ladisch.de> 2589 + L: alsa-devel@alsa-project.org (moderated for non-subscribers) 2590 + T: git git://git.alsa-project.org/alsa-kernel.git 2591 + S: Maintained 2592 + F: sound/firewire/ 2593 + 2587 2594 FIREWIRE SUBSYSTEM 2588 2595 M: Stefan Richter <stefanr@s5r6.in-berlin.de> 2589 2596 L: linux1394-devel@lists.sourceforge.net
+1 -2
sound/core/control.c
··· 704 704 struct snd_ctl_elem_list list; 705 705 struct snd_kcontrol *kctl; 706 706 struct snd_ctl_elem_id *dst, *id; 707 - unsigned int offset, space, first, jidx; 707 + unsigned int offset, space, jidx; 708 708 709 709 if (copy_from_user(&list, _list, sizeof(list))) 710 710 return -EFAULT; 711 711 offset = list.offset; 712 712 space = list.space; 713 - first = 0; 714 713 /* try limit maximum space */ 715 714 if (space > 16384) 716 715 return -ENOMEM;
-3
sound/core/init.c
··· 342 342 int snd_card_disconnect(struct snd_card *card) 343 343 { 344 344 struct snd_monitor_file *mfile; 345 - struct file *file; 346 345 int err; 347 346 348 347 if (!card) ··· 365 366 366 367 spin_lock(&card->files_lock); 367 368 list_for_each_entry(mfile, &card->files_list, list) { 368 - file = mfile->file; 369 - 370 369 /* it's critical part, use endless loop */ 371 370 /* we have no room to fail */ 372 371 mfile->disconnected_f_op = mfile->file->f_op;
-3
sound/core/oss/linear.c
··· 90 90 struct snd_pcm_plugin_channel *dst_channels, 91 91 snd_pcm_uframes_t frames) 92 92 { 93 - struct linear_priv *data; 94 - 95 93 if (snd_BUG_ON(!plugin || !src_channels || !dst_channels)) 96 94 return -ENXIO; 97 - data = (struct linear_priv *)plugin->extra_data; 98 95 if (frames == 0) 99 96 return 0; 100 97 #ifdef CONFIG_SND_DEBUG
+12 -3
sound/core/pcm_lib.c
··· 1756 1756 wait_queue_t wait; 1757 1757 int err = 0; 1758 1758 snd_pcm_uframes_t avail = 0; 1759 - long tout; 1759 + long wait_time, tout; 1760 1760 1761 + if (runtime->no_period_wakeup) 1762 + wait_time = MAX_SCHEDULE_TIMEOUT; 1763 + else { 1764 + wait_time = 10; 1765 + if (runtime->rate) { 1766 + long t = runtime->period_size * 2 / runtime->rate; 1767 + wait_time = max(t, wait_time); 1768 + } 1769 + wait_time = msecs_to_jiffies(wait_time * 1000); 1770 + } 1761 1771 init_waitqueue_entry(&wait, current); 1762 1772 add_wait_queue(&runtime->tsleep, &wait); 1763 1773 for (;;) { ··· 1775 1765 err = -ERESTARTSYS; 1776 1766 break; 1777 1767 } 1778 - set_current_state(TASK_INTERRUPTIBLE); 1779 1768 snd_pcm_stream_unlock_irq(substream); 1780 - tout = schedule_timeout(msecs_to_jiffies(10000)); 1769 + tout = schedule_timeout_interruptible(wait_time); 1781 1770 snd_pcm_stream_lock_irq(substream); 1782 1771 switch (runtime->status->state) { 1783 1772 case SNDRV_PCM_STATE_SUSPENDED:
+11 -10
sound/core/pcm_native.c
··· 1481 1481 break; /* all drained */ 1482 1482 init_waitqueue_entry(&wait, current); 1483 1483 add_wait_queue(&to_check->sleep, &wait); 1484 - set_current_state(TASK_INTERRUPTIBLE); 1485 1484 snd_pcm_stream_unlock_irq(substream); 1486 1485 up_read(&snd_pcm_link_rwsem); 1487 1486 snd_power_unlock(card); 1488 - tout = schedule_timeout(10 * HZ); 1487 + if (runtime->no_period_wakeup) 1488 + tout = MAX_SCHEDULE_TIMEOUT; 1489 + else { 1490 + tout = 10; 1491 + if (runtime->rate) { 1492 + long t = runtime->period_size * 2 / runtime->rate; 1493 + tout = max(t, tout); 1494 + } 1495 + tout = msecs_to_jiffies(tout * 1000); 1496 + } 1497 + tout = schedule_timeout_interruptible(tout); 1489 1498 snd_power_lock(card); 1490 1499 down_read(&snd_pcm_link_rwsem); 1491 1500 snd_pcm_stream_lock_irq(substream); ··· 1527 1518 static int snd_pcm_drop(struct snd_pcm_substream *substream) 1528 1519 { 1529 1520 struct snd_pcm_runtime *runtime; 1530 - struct snd_card *card; 1531 1521 int result = 0; 1532 1522 1533 1523 if (PCM_RUNTIME_CHECK(substream)) 1534 1524 return -ENXIO; 1535 1525 runtime = substream->runtime; 1536 - card = substream->pcm->card; 1537 1526 1538 1527 if (runtime->status->state == SNDRV_PCM_STATE_OPEN || 1539 1528 runtime->status->state == SNDRV_PCM_STATE_DISCONNECTED || ··· 2063 2056 { 2064 2057 struct snd_pcm_file *pcm_file; 2065 2058 struct snd_pcm_substream *substream; 2066 - struct snd_pcm_str *str; 2067 2059 int err; 2068 2060 2069 2061 if (rpcm_file) ··· 2079 2073 } 2080 2074 pcm_file->substream = substream; 2081 2075 if (substream->ref_count == 1) { 2082 - str = substream->pstr; 2083 2076 substream->file = pcm_file; 2084 2077 substream->pcm_release = pcm_release_private; 2085 2078 } ··· 3020 3015 static int snd_pcm_mmap_status(struct snd_pcm_substream *substream, struct file *file, 3021 3016 struct vm_area_struct *area) 3022 3017 { 3023 - struct snd_pcm_runtime *runtime; 3024 3018 long size; 3025 3019 if (!(area->vm_flags & VM_READ)) 3026 3020 return -EINVAL; 3027 - runtime = substream->runtime; 3028 3021 size = area->vm_end - area->vm_start; 3029 3022 if (size != PAGE_ALIGN(sizeof(struct snd_pcm_mmap_status))) 3030 3023 return -EINVAL; ··· 3057 3054 static int snd_pcm_mmap_control(struct snd_pcm_substream *substream, struct file *file, 3058 3055 struct vm_area_struct *area) 3059 3056 { 3060 - struct snd_pcm_runtime *runtime; 3061 3057 long size; 3062 3058 if (!(area->vm_flags & VM_READ)) 3063 3059 return -EINVAL; 3064 - runtime = substream->runtime; 3065 3060 size = area->vm_end - area->vm_start; 3066 3061 if (size != PAGE_ALIGN(sizeof(struct snd_pcm_mmap_control))) 3067 3062 return -EINVAL;
-2
sound/core/seq/seq_queue.c
··· 467 467 int snd_seq_queue_timer_close(int queueid) 468 468 { 469 469 struct snd_seq_queue *queue; 470 - struct snd_seq_timer *tmr; 471 470 int result = 0; 472 471 473 472 queue = queueptr(queueid); 474 473 if (queue == NULL) 475 474 return -EINVAL; 476 - tmr = queue->timer; 477 475 snd_seq_timer_close(queue); 478 476 queuefree(queue); 479 477 return result;
+1 -1
sound/pci/hda/hda_codec.c
··· 4719 4719 cfg->dig_out_pins[0], cfg->dig_out_pins[1]); 4720 4720 snd_printd(" inputs:"); 4721 4721 for (i = 0; i < cfg->num_inputs; i++) { 4722 - snd_printdd(" %s=0x%x", 4722 + snd_printd(" %s=0x%x", 4723 4723 hda_get_autocfg_input_label(codec, cfg, i), 4724 4724 cfg->inputs[i].pin); 4725 4725 }
+3 -18
sound/pci/hda/hda_eld.c
··· 312 312 return -EINVAL; 313 313 } 314 314 315 - static int hdmi_eld_valid(struct hda_codec *codec, hda_nid_t nid) 316 - { 317 - int eldv; 318 - int present; 319 - 320 - present = snd_hda_pin_sense(codec, nid); 321 - eldv = (present & AC_PINSENSE_ELDV); 322 - present = (present & AC_PINSENSE_PRESENCE); 323 - 324 - #ifdef CONFIG_SND_DEBUG_VERBOSE 325 - printk(KERN_INFO "HDMI: sink_present = %d, eld_valid = %d\n", 326 - !!present, !!eldv); 327 - #endif 328 - 329 - return eldv && present; 330 - } 331 - 332 315 int snd_hdmi_get_eld_size(struct hda_codec *codec, hda_nid_t nid) 333 316 { 334 317 return snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_HDMI_DIP_SIZE, ··· 326 343 int size; 327 344 unsigned char *buf; 328 345 329 - if (!hdmi_eld_valid(codec, nid)) 346 + if (!eld->eld_valid) 330 347 return -ENOENT; 331 348 332 349 size = snd_hdmi_get_eld_size(codec, nid); ··· 460 477 461 478 snd_iprintf(buffer, "monitor_present\t\t%d\n", e->monitor_present); 462 479 snd_iprintf(buffer, "eld_valid\t\t%d\n", e->eld_valid); 480 + if (!e->eld_valid) 481 + return; 463 482 snd_iprintf(buffer, "monitor_name\t\t%s\n", e->monitor_name); 464 483 snd_iprintf(buffer, "connection_type\t\t%s\n", 465 484 eld_connection_type_names[e->conn_type]);
+126 -82
sound/pci/hda/hda_intel.c
··· 391 391 392 392 /* chip type specific */ 393 393 int driver_type; 394 + unsigned int driver_caps; 394 395 int playback_streams; 395 396 int playback_index_offset; 396 397 int capture_streams; ··· 464 463 AZX_DRIVER_GENERIC, 465 464 AZX_NUM_DRIVERS, /* keep this as last entry */ 466 465 }; 466 + 467 + /* driver quirks (capabilities) */ 468 + /* bits 0-7 are used for indicating driver type */ 469 + #define AZX_DCAPS_NO_TCSEL (1 << 8) /* No Intel TCSEL bit */ 470 + #define AZX_DCAPS_NO_MSI (1 << 9) /* No MSI support */ 471 + #define AZX_DCAPS_ATI_SNOOP (1 << 10) /* ATI snoop enable */ 472 + #define AZX_DCAPS_NVIDIA_SNOOP (1 << 11) /* Nvidia snoop enable */ 473 + #define AZX_DCAPS_SCH_SNOOP (1 << 12) /* SCH/PCH snoop enable */ 474 + #define AZX_DCAPS_RIRB_DELAY (1 << 13) /* Long delay in read loop */ 475 + #define AZX_DCAPS_RIRB_PRE_DELAY (1 << 14) /* Put a delay before read */ 476 + #define AZX_DCAPS_CTX_WORKAROUND (1 << 15) /* X-Fi workaround */ 477 + #define AZX_DCAPS_POSFIX_LPIB (1 << 16) /* Use LPIB as default */ 478 + #define AZX_DCAPS_POSFIX_VIA (1 << 17) /* Use VIACOMBO as default */ 479 + #define AZX_DCAPS_NO_64BIT (1 << 18) /* No 64bit address */ 480 + #define AZX_DCAPS_SYNC_WRITE (1 << 19) /* sync each cmd write */ 481 + 482 + /* quirks for ATI SB / AMD Hudson */ 483 + #define AZX_DCAPS_PRESET_ATI_SB \ 484 + (AZX_DCAPS_ATI_SNOOP | AZX_DCAPS_NO_TCSEL | \ 485 + AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB) 486 + 487 + /* quirks for ATI/AMD HDMI */ 488 + #define AZX_DCAPS_PRESET_ATI_HDMI \ 489 + (AZX_DCAPS_NO_TCSEL | AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB) 490 + 491 + /* quirks for Nvidia */ 492 + #define AZX_DCAPS_PRESET_NVIDIA \ 493 + (AZX_DCAPS_NVIDIA_SNOOP | AZX_DCAPS_RIRB_DELAY | AZX_DCAPS_NO_MSI) 467 494 468 495 static char *driver_short_names[] __devinitdata = { 469 496 [AZX_DRIVER_ICH] = "HDA Intel", ··· 595 566 /* reset the rirb hw write pointer */ 596 567 azx_writew(chip, RIRBWP, ICH6_RIRBWP_RST); 597 568 /* set N=1, get RIRB response interrupt for new entry */ 598 - if (chip->driver_type == AZX_DRIVER_CTX) 569 + if (chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND) 599 570 azx_writew(chip, RINTCNT, 0xc0); 600 571 else 601 572 azx_writew(chip, RINTCNT, 1); ··· 1085 1056 * codecs. 1086 1057 * The PCI register TCSEL is defined in the Intel manuals. 1087 1058 */ 1088 - if (chip->driver_type != AZX_DRIVER_ATI && 1089 - chip->driver_type != AZX_DRIVER_ATIHDMI) 1059 + if (chip->driver_caps & AZX_DCAPS_NO_TCSEL) { 1060 + snd_printdd(SFX "Clearing TCSEL\n"); 1090 1061 update_pci_byte(chip->pci, ICH6_PCIREG_TCSEL, 0x07, 0); 1062 + } 1091 1063 1092 - switch (chip->driver_type) { 1093 - case AZX_DRIVER_ATI: 1094 - /* For ATI SB450 azalia HD audio, we need to enable snoop */ 1064 + /* For ATI SB450/600/700/800/900 and AMD Hudson azalia HD audio, 1065 + * we need to enable snoop. 1066 + */ 1067 + if (chip->driver_caps & AZX_DCAPS_ATI_SNOOP) { 1068 + snd_printdd(SFX "Enabling ATI snoop\n"); 1095 1069 update_pci_byte(chip->pci, 1096 1070 ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR, 1097 1071 0x07, ATI_SB450_HDAUDIO_ENABLE_SNOOP); 1098 - break; 1099 - case AZX_DRIVER_NVIDIA: 1100 - /* For NVIDIA HDA, enable snoop */ 1072 + } 1073 + 1074 + /* For NVIDIA HDA, enable snoop */ 1075 + if (chip->driver_caps & AZX_DCAPS_NVIDIA_SNOOP) { 1076 + snd_printdd(SFX "Enabling Nvidia snoop\n"); 1101 1077 update_pci_byte(chip->pci, 1102 1078 NVIDIA_HDA_TRANSREG_ADDR, 1103 1079 0x0f, NVIDIA_HDA_ENABLE_COHBITS); ··· 1112 1078 update_pci_byte(chip->pci, 1113 1079 NVIDIA_HDA_OSTRM_COH, 1114 1080 0x01, NVIDIA_HDA_ENABLE_COHBIT); 1115 - break; 1116 - case AZX_DRIVER_SCH: 1117 - case AZX_DRIVER_PCH: 1081 + } 1082 + 1083 + /* Enable SCH/PCH snoop if needed */ 1084 + if (chip->driver_caps & AZX_DCAPS_SCH_SNOOP) { 1118 1085 pci_read_config_word(chip->pci, INTEL_SCH_HDA_DEVC, &snoop); 1119 1086 if (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP) { 1120 1087 pci_write_config_word(chip->pci, INTEL_SCH_HDA_DEVC, ··· 1126 1091 (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP) 1127 1092 ? "Failed" : "OK"); 1128 1093 } 1129 - break; 1130 - default: 1131 - /* AMD Hudson needs the similar snoop, as it seems... */ 1132 - if (chip->pci->vendor == PCI_VENDOR_ID_AMD) 1133 - update_pci_byte(chip->pci, 1134 - ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR, 1135 - 0x07, ATI_SB450_HDAUDIO_ENABLE_SNOOP); 1136 - break; 1137 1094 } 1138 1095 } 1139 1096 ··· 1179 1152 status = azx_readb(chip, RIRBSTS); 1180 1153 if (status & RIRB_INT_MASK) { 1181 1154 if (status & RIRB_INT_RESPONSE) { 1182 - if (chip->driver_type == AZX_DRIVER_CTX) 1155 + if (chip->driver_caps & AZX_DCAPS_RIRB_PRE_DELAY) 1183 1156 udelay(80); 1184 1157 azx_update_rirb(chip); 1185 1158 } ··· 1448 1421 if (err < 0) 1449 1422 return err; 1450 1423 1451 - if (chip->driver_type == AZX_DRIVER_NVIDIA) 1424 + if (chip->driver_caps & AZX_DCAPS_RIRB_DELAY) { 1425 + snd_printd(SFX "Enable delay in RIRB handling\n"); 1452 1426 chip->bus->needs_damn_long_delay = 1; 1427 + } 1453 1428 1454 1429 codecs = 0; 1455 1430 max_slots = azx_max_codecs[chip->driver_type]; ··· 1486 1457 * sequence like the pin-detection. It seems that forcing the synced 1487 1458 * access works around the stall. Grrr... 1488 1459 */ 1489 - if (chip->pci->vendor == PCI_VENDOR_ID_AMD || 1490 - chip->pci->vendor == PCI_VENDOR_ID_ATI) { 1491 - snd_printk(KERN_INFO SFX "Enable sync_write for AMD chipset\n"); 1460 + if (chip->driver_caps & AZX_DCAPS_SYNC_WRITE) { 1461 + snd_printd(SFX "Enable sync_write for stable communication\n"); 1492 1462 chip->bus->sync_write = 1; 1493 1463 chip->bus->allow_bus_reset = 1; 1494 1464 } ··· 1748 1720 1749 1721 stream_tag = azx_dev->stream_tag; 1750 1722 /* CA-IBG chips need the playback stream starting from 1 */ 1751 - if (chip->driver_type == AZX_DRIVER_CTX && 1723 + if ((chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND) && 1752 1724 stream_tag > chip->capture_streams) 1753 1725 stream_tag -= chip->capture_streams; 1754 1726 return snd_hda_codec_prepare(apcm->codec, hinfo, stream_tag, ··· 2393 2365 } 2394 2366 2395 2367 /* Check VIA/ATI HD Audio Controller exist */ 2396 - switch (chip->driver_type) { 2397 - case AZX_DRIVER_VIA: 2398 - /* Use link position directly, avoid any transfer problem. */ 2368 + if (chip->driver_caps & AZX_DCAPS_POSFIX_VIA) { 2369 + snd_printd(SFX "Using VIACOMBO position fix\n"); 2399 2370 return POS_FIX_VIACOMBO; 2400 - case AZX_DRIVER_ATI: 2401 - /* ATI chipsets don't work well with position-buffer */ 2402 - return POS_FIX_LPIB; 2403 - case AZX_DRIVER_GENERIC: 2404 - /* AMD chipsets also don't work with position-buffer */ 2405 - if (chip->pci->vendor == PCI_VENDOR_ID_AMD) 2406 - return POS_FIX_LPIB; 2407 - break; 2408 2371 } 2409 - 2372 + if (chip->driver_caps & AZX_DCAPS_POSFIX_LPIB) { 2373 + snd_printd(SFX "Using LPIB position fix\n"); 2374 + return POS_FIX_LPIB; 2375 + } 2410 2376 return POS_FIX_AUTO; 2411 2377 } 2412 2378 ··· 2482 2460 } 2483 2461 2484 2462 /* NVidia chipsets seem to cause troubles with MSI */ 2485 - if (chip->driver_type == AZX_DRIVER_NVIDIA) { 2486 - printk(KERN_INFO "hda_intel: Disable MSI for Nvidia chipset\n"); 2463 + if (chip->driver_caps & AZX_DCAPS_NO_MSI) { 2464 + printk(KERN_INFO "hda_intel: Disabling MSI\n"); 2487 2465 chip->msi = 0; 2488 2466 } 2489 2467 } ··· 2493 2471 * constructor 2494 2472 */ 2495 2473 static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci, 2496 - int dev, int driver_type, 2474 + int dev, unsigned int driver_caps, 2497 2475 struct azx **rchip) 2498 2476 { 2499 2477 struct azx *chip; ··· 2521 2499 chip->card = card; 2522 2500 chip->pci = pci; 2523 2501 chip->irq = -1; 2524 - chip->driver_type = driver_type; 2502 + chip->driver_caps = driver_caps; 2503 + chip->driver_type = driver_caps & 0xff; 2525 2504 check_msi(chip); 2526 2505 chip->dev_index = dev; 2527 2506 INIT_WORK(&chip->irq_pending_work, azx_irq_pending_work); ··· 2586 2563 snd_printdd(SFX "chipset global capabilities = 0x%x\n", gcap); 2587 2564 2588 2565 /* disable SB600 64bit support for safety */ 2589 - if ((chip->driver_type == AZX_DRIVER_ATI) || 2590 - (chip->driver_type == AZX_DRIVER_ATIHDMI)) { 2566 + if (chip->pci->vendor == PCI_VENDOR_ID_ATI) { 2591 2567 struct pci_dev *p_smbus; 2592 2568 p_smbus = pci_get_device(PCI_VENDOR_ID_ATI, 2593 2569 PCI_DEVICE_ID_ATI_SBX00_SMBUS, ··· 2596 2574 gcap &= ~ICH6_GCAP_64OK; 2597 2575 pci_dev_put(p_smbus); 2598 2576 } 2599 - } else { 2600 - /* FIXME: not sure whether this is really needed, but 2601 - * Hudson isn't stable enough for allowing everything... 2602 - * let's check later again. 2603 - */ 2604 - if (chip->pci->vendor == PCI_VENDOR_ID_AMD) 2605 - gcap &= ~ICH6_GCAP_64OK; 2606 2577 } 2607 2578 2608 - /* disable 64bit DMA address for Teradici */ 2609 - /* it does not work with device 6549:1200 subsys e4a2:040b */ 2610 - if (chip->driver_type == AZX_DRIVER_TERA) 2579 + /* disable 64bit DMA address on some devices */ 2580 + if (chip->driver_caps & AZX_DCAPS_NO_64BIT) { 2581 + snd_printd(SFX "Disabling 64bit DMA\n"); 2611 2582 gcap &= ~ICH6_GCAP_64OK; 2583 + } 2612 2584 2613 2585 /* allow 64bit DMA address if supported by H/W */ 2614 2586 if ((gcap & ICH6_GCAP_64OK) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64))) ··· 2804 2788 /* PCI IDs */ 2805 2789 static DEFINE_PCI_DEVICE_TABLE(azx_ids) = { 2806 2790 /* CPT */ 2807 - { PCI_DEVICE(0x8086, 0x1c20), .driver_data = AZX_DRIVER_PCH }, 2791 + { PCI_DEVICE(0x8086, 0x1c20), 2792 + .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP }, 2808 2793 /* PBG */ 2809 - { PCI_DEVICE(0x8086, 0x1d20), .driver_data = AZX_DRIVER_PCH }, 2794 + { PCI_DEVICE(0x8086, 0x1d20), 2795 + .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP }, 2810 2796 /* Panther Point */ 2811 - { PCI_DEVICE(0x8086, 0x1e20), .driver_data = AZX_DRIVER_PCH }, 2797 + { PCI_DEVICE(0x8086, 0x1e20), 2798 + .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP }, 2812 2799 /* SCH */ 2813 - { PCI_DEVICE(0x8086, 0x811b), .driver_data = AZX_DRIVER_SCH }, 2800 + { PCI_DEVICE(0x8086, 0x811b), 2801 + .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP }, 2814 2802 /* Generic Intel */ 2815 2803 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_ANY_ID), 2816 2804 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8, 2817 2805 .class_mask = 0xffffff, 2818 2806 .driver_data = AZX_DRIVER_ICH }, 2819 - /* ATI SB 450/600 */ 2820 - { PCI_DEVICE(0x1002, 0x437b), .driver_data = AZX_DRIVER_ATI }, 2821 - { PCI_DEVICE(0x1002, 0x4383), .driver_data = AZX_DRIVER_ATI }, 2807 + /* ATI SB 450/600/700/800/900 */ 2808 + { PCI_DEVICE(0x1002, 0x437b), 2809 + .driver_data = AZX_DRIVER_ATI | AZX_DCAPS_PRESET_ATI_SB }, 2810 + { PCI_DEVICE(0x1002, 0x4383), 2811 + .driver_data = AZX_DRIVER_ATI | AZX_DCAPS_PRESET_ATI_SB }, 2812 + /* AMD Hudson */ 2813 + { PCI_DEVICE(0x1022, 0x780d), 2814 + .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_SB }, 2822 2815 /* ATI HDMI */ 2823 - { PCI_DEVICE(0x1002, 0x793b), .driver_data = AZX_DRIVER_ATIHDMI }, 2824 - { PCI_DEVICE(0x1002, 0x7919), .driver_data = AZX_DRIVER_ATIHDMI }, 2825 - { PCI_DEVICE(0x1002, 0x960f), .driver_data = AZX_DRIVER_ATIHDMI }, 2826 - { PCI_DEVICE(0x1002, 0x970f), .driver_data = AZX_DRIVER_ATIHDMI }, 2827 - { PCI_DEVICE(0x1002, 0xaa00), .driver_data = AZX_DRIVER_ATIHDMI }, 2828 - { PCI_DEVICE(0x1002, 0xaa08), .driver_data = AZX_DRIVER_ATIHDMI }, 2829 - { PCI_DEVICE(0x1002, 0xaa10), .driver_data = AZX_DRIVER_ATIHDMI }, 2830 - { PCI_DEVICE(0x1002, 0xaa18), .driver_data = AZX_DRIVER_ATIHDMI }, 2831 - { PCI_DEVICE(0x1002, 0xaa20), .driver_data = AZX_DRIVER_ATIHDMI }, 2832 - { PCI_DEVICE(0x1002, 0xaa28), .driver_data = AZX_DRIVER_ATIHDMI }, 2833 - { PCI_DEVICE(0x1002, 0xaa30), .driver_data = AZX_DRIVER_ATIHDMI }, 2834 - { PCI_DEVICE(0x1002, 0xaa38), .driver_data = AZX_DRIVER_ATIHDMI }, 2835 - { PCI_DEVICE(0x1002, 0xaa40), .driver_data = AZX_DRIVER_ATIHDMI }, 2836 - { PCI_DEVICE(0x1002, 0xaa48), .driver_data = AZX_DRIVER_ATIHDMI }, 2816 + { PCI_DEVICE(0x1002, 0x793b), 2817 + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, 2818 + { PCI_DEVICE(0x1002, 0x7919), 2819 + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, 2820 + { PCI_DEVICE(0x1002, 0x960f), 2821 + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, 2822 + { PCI_DEVICE(0x1002, 0x970f), 2823 + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, 2824 + { PCI_DEVICE(0x1002, 0xaa00), 2825 + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, 2826 + { PCI_DEVICE(0x1002, 0xaa08), 2827 + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, 2828 + { PCI_DEVICE(0x1002, 0xaa10), 2829 + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, 2830 + { PCI_DEVICE(0x1002, 0xaa18), 2831 + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, 2832 + { PCI_DEVICE(0x1002, 0xaa20), 2833 + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, 2834 + { PCI_DEVICE(0x1002, 0xaa28), 2835 + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, 2836 + { PCI_DEVICE(0x1002, 0xaa30), 2837 + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, 2838 + { PCI_DEVICE(0x1002, 0xaa38), 2839 + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, 2840 + { PCI_DEVICE(0x1002, 0xaa40), 2841 + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, 2842 + { PCI_DEVICE(0x1002, 0xaa48), 2843 + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, 2837 2844 /* VIA VT8251/VT8237A */ 2838 - { PCI_DEVICE(0x1106, 0x3288), .driver_data = AZX_DRIVER_VIA }, 2845 + { PCI_DEVICE(0x1106, 0x3288), 2846 + .driver_data = AZX_DRIVER_VIA | AZX_DCAPS_POSFIX_VIA }, 2839 2847 /* SIS966 */ 2840 2848 { PCI_DEVICE(0x1039, 0x7502), .driver_data = AZX_DRIVER_SIS }, 2841 2849 /* ULI M5461 */ ··· 2868 2828 { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID), 2869 2829 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8, 2870 2830 .class_mask = 0xffffff, 2871 - .driver_data = AZX_DRIVER_NVIDIA }, 2831 + .driver_data = AZX_DRIVER_NVIDIA | AZX_DCAPS_PRESET_NVIDIA }, 2872 2832 /* Teradici */ 2873 - { PCI_DEVICE(0x6549, 0x1200), .driver_data = AZX_DRIVER_TERA }, 2833 + { PCI_DEVICE(0x6549, 0x1200), 2834 + .driver_data = AZX_DRIVER_TERA | AZX_DCAPS_NO_64BIT }, 2874 2835 /* Creative X-Fi (CA0110-IBG) */ 2875 2836 #if !defined(CONFIG_SND_CTXFI) && !defined(CONFIG_SND_CTXFI_MODULE) 2876 2837 /* the following entry conflicts with snd-ctxfi driver, ··· 2881 2840 { PCI_DEVICE(PCI_VENDOR_ID_CREATIVE, PCI_ANY_ID), 2882 2841 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8, 2883 2842 .class_mask = 0xffffff, 2884 - .driver_data = AZX_DRIVER_CTX }, 2843 + .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND | 2844 + AZX_DCAPS_RIRB_PRE_DELAY }, 2885 2845 #else 2886 2846 /* this entry seems still valid -- i.e. without emu20kx chip */ 2887 - { PCI_DEVICE(0x1102, 0x0009), .driver_data = AZX_DRIVER_CTX }, 2847 + { PCI_DEVICE(0x1102, 0x0009), 2848 + .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND | 2849 + AZX_DCAPS_RIRB_PRE_DELAY }, 2888 2850 #endif 2889 2851 /* Vortex86MX */ 2890 2852 { PCI_DEVICE(0x17f3, 0x3010), .driver_data = AZX_DRIVER_GENERIC }, ··· 2897 2853 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_ANY_ID), 2898 2854 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8, 2899 2855 .class_mask = 0xffffff, 2900 - .driver_data = AZX_DRIVER_GENERIC }, 2856 + .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_HDMI }, 2901 2857 { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_ANY_ID), 2902 2858 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8, 2903 2859 .class_mask = 0xffffff, 2904 - .driver_data = AZX_DRIVER_GENERIC }, 2860 + .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_HDMI }, 2905 2861 { 0, } 2906 2862 }; 2907 2863 MODULE_DEVICE_TABLE(pci, azx_ids);
+1
sound/pci/hda/patch_analog.c
··· 3159 3159 SND_PCI_QUIRK(0x1043, 0x81ec, "Asus P5B-DLX", AD1988_6STACK_DIG), 3160 3160 SND_PCI_QUIRK(0x1043, 0x81f6, "Asus M2N-SLI", AD1988_6STACK_DIG), 3161 3161 SND_PCI_QUIRK(0x1043, 0x8277, "Asus P5K-E/WIFI-AP", AD1988_6STACK_DIG), 3162 + SND_PCI_QUIRK(0x1043, 0x82c0, "Asus M3N-HT Deluxe", AD1988_6STACK_DIG), 3162 3163 SND_PCI_QUIRK(0x1043, 0x8311, "Asus P5Q-Premium/Pro", AD1988_6STACK_DIG), 3163 3164 {} 3164 3165 };
+27 -15
sound/pci/hda/patch_conexant.c
··· 3098 3098 SND_PCI_QUIRK(0x17aa, 0x215e, "Lenovo Thinkpad", CXT5066_THINKPAD), 3099 3099 SND_PCI_QUIRK(0x17aa, 0x21da, "Lenovo X220", CXT5066_THINKPAD), 3100 3100 SND_PCI_QUIRK(0x17aa, 0x21db, "Lenovo X220-tablet", CXT5066_THINKPAD), 3101 + SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo U350", CXT5066_ASUS), 3101 3102 SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo G560", CXT5066_ASUS), 3103 + SND_PCI_QUIRK(0x17aa, 0x3938, "Lenovo G565", CXT5066_AUTO), 3102 3104 SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo", CXT5066_IDEAPAD), /* Fallback for Lenovos without dock mic */ 3103 3105 {} 3104 3106 }; ··· 3435 3433 break; 3436 3434 } 3437 3435 } 3438 - if (spec->auto_mute && cfg->line_out_pins[0] && 3436 + if (spec->auto_mute && 3437 + cfg->line_out_pins[0] && 3438 + cfg->line_out_type != AUTO_PIN_SPEAKER_OUT && 3439 3439 cfg->line_out_pins[0] != cfg->hp_pins[0] && 3440 3440 cfg->line_out_pins[0] != cfg->speaker_pins[0]) { 3441 3441 for (i = 0; i < cfg->line_outs; i++) { ··· 3485 3481 { 3486 3482 struct conexant_spec *spec = codec->spec; 3487 3483 struct auto_pin_cfg *cfg = &spec->autocfg; 3488 - int on; 3484 + int on = 1; 3489 3485 3490 - if (!spec->auto_mute) 3491 - on = 0; 3492 - else 3493 - on = spec->hp_present | spec->line_present; 3486 + /* turn on HP EAPD when HP jacks are present */ 3487 + if (spec->auto_mute) 3488 + on = spec->hp_present; 3494 3489 cx_auto_turn_eapd(codec, cfg->hp_outs, cfg->hp_pins, on); 3495 - do_automute(codec, cfg->speaker_outs, cfg->speaker_pins, !on); 3490 + /* mute speakers in auto-mode if HP or LO jacks are plugged */ 3491 + if (spec->auto_mute) 3492 + on = !(spec->hp_present || 3493 + (spec->detect_line && spec->line_present)); 3494 + do_automute(codec, cfg->speaker_outs, cfg->speaker_pins, on); 3496 3495 3497 3496 /* toggle line-out mutes if needed, too */ 3498 3497 /* if LO is a copy of either HP or Speaker, don't need to handle it */ 3499 3498 if (cfg->line_out_pins[0] == cfg->hp_pins[0] || 3500 3499 cfg->line_out_pins[0] == cfg->speaker_pins[0]) 3501 3500 return; 3502 - if (!spec->automute_lines || !spec->auto_mute) 3503 - on = 0; 3504 - else 3505 - on = spec->hp_present; 3506 - do_automute(codec, cfg->line_outs, cfg->line_out_pins, !on); 3501 + if (spec->auto_mute) { 3502 + /* mute LO in auto-mode when HP jack is present */ 3503 + if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT || 3504 + spec->automute_lines) 3505 + on = !spec->hp_present; 3506 + else 3507 + on = 1; 3508 + } 3509 + do_automute(codec, cfg->line_outs, cfg->line_out_pins, on); 3507 3510 } 3508 3511 3509 3512 static void cx_auto_hp_automute(struct hda_codec *codec) ··· 3707 3696 { 3708 3697 struct conexant_spec *spec = codec->spec; 3709 3698 hda_nid_t adc; 3699 + int changed = 1; 3710 3700 3711 3701 if (!imux->num_items) 3712 3702 return 0; 3713 3703 if (idx >= imux->num_items) 3714 3704 idx = imux->num_items - 1; 3715 3705 if (spec->cur_mux[0] == idx) 3716 - return 0; 3706 + changed = 0; 3717 3707 adc = spec->imux_info[idx].adc; 3718 3708 select_input_connection(codec, spec->imux_info[idx].adc, 3719 3709 spec->imux_info[idx].pin); ··· 3727 3715 spec->cur_adc_format); 3728 3716 } 3729 3717 spec->cur_mux[0] = idx; 3730 - return 1; 3718 + return changed; 3731 3719 } 3732 3720 3733 3721 static int cx_auto_mux_enum_put(struct snd_kcontrol *kcontrol, ··· 3801 3789 int pset[INPUT_PIN_ATTR_NORMAL + 1]; 3802 3790 int i; 3803 3791 3804 - for (i = 0; i < INPUT_PIN_ATTR_NORMAL; i++) 3792 + for (i = 0; i < ARRAY_SIZE(pset); i++) 3805 3793 pset[i] = -1; 3806 3794 for (i = 0; i < spec->private_imux.num_items; i++) { 3807 3795 hda_nid_t pin = spec->imux_info[i].pin;
+53 -72
sound/pci/hda/patch_hdmi.c
··· 48 48 * 49 49 * The HDA correspondence of pipes/ports are converter/pin nodes. 50 50 */ 51 - #define MAX_HDMI_CVTS 3 52 - #define MAX_HDMI_PINS 3 51 + #define MAX_HDMI_CVTS 4 52 + #define MAX_HDMI_PINS 4 53 53 54 54 struct hdmi_spec { 55 55 int num_cvts; ··· 78 78 */ 79 79 struct hda_multi_out multiout; 80 80 const struct hda_pcm_stream *pcm_playback; 81 - 82 - /* misc flags */ 83 - /* PD bit indicates only the update, not the current state */ 84 - unsigned int old_pin_detect:1; 85 81 }; 86 82 87 83 ··· 294 298 295 299 snd_printk(KERN_WARNING "HDMI: nid %d not registered\n", nid); 296 300 return -EINVAL; 297 - } 298 - 299 - static void hdmi_get_show_eld(struct hda_codec *codec, hda_nid_t pin_nid, 300 - struct hdmi_eld *eld) 301 - { 302 - if (!snd_hdmi_get_eld(eld, codec, pin_nid)) 303 - snd_hdmi_show_eld(eld); 304 301 } 305 302 306 303 #ifdef BE_PARANOID ··· 683 694 static void hdmi_intrinsic_event(struct hda_codec *codec, unsigned int res) 684 695 { 685 696 struct hdmi_spec *spec = codec->spec; 686 - int tag = res >> AC_UNSOL_RES_TAG_SHIFT; 687 - int pind = !!(res & AC_UNSOL_RES_PD); 697 + int pin_nid = res >> AC_UNSOL_RES_TAG_SHIFT; 698 + int pd = !!(res & AC_UNSOL_RES_PD); 688 699 int eldv = !!(res & AC_UNSOL_RES_ELDV); 689 700 int index; 690 701 691 702 printk(KERN_INFO 692 703 "HDMI hot plug event: Pin=%d Presence_Detect=%d ELD_Valid=%d\n", 693 - tag, pind, eldv); 704 + pin_nid, pd, eldv); 694 705 695 - index = hda_node_index(spec->pin, tag); 706 + index = hda_node_index(spec->pin, pin_nid); 696 707 if (index < 0) 697 708 return; 698 709 699 - if (spec->old_pin_detect) { 700 - if (pind) 701 - hdmi_present_sense(codec, tag, &spec->sink_eld[index]); 702 - pind = spec->sink_eld[index].monitor_present; 703 - } 704 - 705 - spec->sink_eld[index].monitor_present = pind; 706 - spec->sink_eld[index].eld_valid = eldv; 707 - 708 - if (pind && eldv) { 709 - hdmi_get_show_eld(codec, spec->pin[index], 710 - &spec->sink_eld[index]); 711 - /* TODO: do real things about ELD */ 712 - } 713 - 714 - snd_hda_input_jack_report(codec, tag); 710 + hdmi_present_sense(codec, pin_nid, &spec->sink_eld[index]); 715 711 } 716 712 717 713 static void hdmi_non_intrinsic_event(struct hda_codec *codec, unsigned int res) ··· 877 903 static void hdmi_present_sense(struct hda_codec *codec, hda_nid_t pin_nid, 878 904 struct hdmi_eld *eld) 879 905 { 906 + /* 907 + * Always execute a GetPinSense verb here, even when called from 908 + * hdmi_intrinsic_event; for some NVIDIA HW, the unsolicited 909 + * response's PD bit is not the real PD value, but indicates that 910 + * the real PD value changed. An older version of the HD-audio 911 + * specification worked this way. Hence, we just ignore the data in 912 + * the unsolicited response to avoid custom WARs. 913 + */ 880 914 int present = snd_hda_pin_sense(codec, pin_nid); 881 915 882 - eld->monitor_present = !!(present & AC_PINSENSE_PRESENCE); 883 - eld->eld_valid = !!(present & AC_PINSENSE_ELDV); 916 + memset(eld, 0, sizeof(*eld)); 884 917 885 - if (present & AC_PINSENSE_ELDV) 886 - hdmi_get_show_eld(codec, pin_nid, eld); 918 + eld->monitor_present = !!(present & AC_PINSENSE_PRESENCE); 919 + if (eld->monitor_present) 920 + eld->eld_valid = !!(present & AC_PINSENSE_ELDV); 921 + else 922 + eld->eld_valid = 0; 923 + 924 + printk(KERN_INFO 925 + "HDMI status: Pin=%d Presence_Detect=%d ELD_Valid=%d\n", 926 + pin_nid, eld->monitor_present, eld->eld_valid); 927 + 928 + if (eld->eld_valid) 929 + if (!snd_hdmi_get_eld(eld, codec, pin_nid)) 930 + snd_hdmi_show_eld(eld); 931 + 932 + snd_hda_input_jack_report(codec, pin_nid); 887 933 } 888 934 889 935 static int hdmi_add_pin(struct hda_codec *codec, hda_nid_t pin_nid) ··· 921 927 SND_JACK_VIDEOOUT, NULL); 922 928 if (err < 0) 923 929 return err; 924 - snd_hda_input_jack_report(codec, pin_nid); 925 930 926 931 hdmi_present_sense(codec, pin_nid, &spec->sink_eld[spec->num_pins]); 927 932 ··· 1027 1034 "HDMI 0", 1028 1035 "HDMI 1", 1029 1036 "HDMI 2", 1037 + "HDMI 3", 1030 1038 }; 1031 1039 1032 1040 /* ··· 1484 1490 .free = generic_hdmi_free, 1485 1491 }; 1486 1492 1487 - static int patch_nvhdmi_8ch_89(struct hda_codec *codec) 1488 - { 1489 - struct hdmi_spec *spec; 1490 - int err = patch_generic_hdmi(codec); 1491 - 1492 - if (err < 0) 1493 - return err; 1494 - spec = codec->spec; 1495 - spec->old_pin_detect = 1; 1496 - return 0; 1497 - } 1498 - 1499 1493 static int patch_nvhdmi_2ch(struct hda_codec *codec) 1500 1494 { 1501 1495 struct hdmi_spec *spec; ··· 1497 1515 spec->multiout.num_dacs = 0; /* no analog */ 1498 1516 spec->multiout.max_channels = 2; 1499 1517 spec->multiout.dig_out_nid = nvhdmi_master_con_nid_7x; 1500 - spec->old_pin_detect = 1; 1501 1518 spec->num_cvts = 1; 1502 1519 spec->cvt[0] = nvhdmi_master_con_nid_7x; 1503 1520 spec->pcm_playback = &nvhdmi_pcm_playback_2ch; ··· 1639 1658 { .id = 0x10de0005, .name = "MCP77/78 HDMI", .patch = patch_nvhdmi_8ch_7x }, 1640 1659 { .id = 0x10de0006, .name = "MCP77/78 HDMI", .patch = patch_nvhdmi_8ch_7x }, 1641 1660 { .id = 0x10de0007, .name = "MCP79/7A HDMI", .patch = patch_nvhdmi_8ch_7x }, 1642 - { .id = 0x10de000a, .name = "GPU 0a HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, 1643 - { .id = 0x10de000b, .name = "GPU 0b HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, 1644 - { .id = 0x10de000c, .name = "MCP89 HDMI", .patch = patch_nvhdmi_8ch_89 }, 1645 - { .id = 0x10de000d, .name = "GPU 0d HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, 1646 - { .id = 0x10de0010, .name = "GPU 10 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, 1647 - { .id = 0x10de0011, .name = "GPU 11 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, 1648 - { .id = 0x10de0012, .name = "GPU 12 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, 1649 - { .id = 0x10de0013, .name = "GPU 13 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, 1650 - { .id = 0x10de0014, .name = "GPU 14 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, 1651 - { .id = 0x10de0015, .name = "GPU 15 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, 1652 - { .id = 0x10de0016, .name = "GPU 16 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, 1661 + { .id = 0x10de000a, .name = "GPU 0a HDMI/DP", .patch = patch_generic_hdmi }, 1662 + { .id = 0x10de000b, .name = "GPU 0b HDMI/DP", .patch = patch_generic_hdmi }, 1663 + { .id = 0x10de000c, .name = "MCP89 HDMI", .patch = patch_generic_hdmi }, 1664 + { .id = 0x10de000d, .name = "GPU 0d HDMI/DP", .patch = patch_generic_hdmi }, 1665 + { .id = 0x10de0010, .name = "GPU 10 HDMI/DP", .patch = patch_generic_hdmi }, 1666 + { .id = 0x10de0011, .name = "GPU 11 HDMI/DP", .patch = patch_generic_hdmi }, 1667 + { .id = 0x10de0012, .name = "GPU 12 HDMI/DP", .patch = patch_generic_hdmi }, 1668 + { .id = 0x10de0013, .name = "GPU 13 HDMI/DP", .patch = patch_generic_hdmi }, 1669 + { .id = 0x10de0014, .name = "GPU 14 HDMI/DP", .patch = patch_generic_hdmi }, 1670 + { .id = 0x10de0015, .name = "GPU 15 HDMI/DP", .patch = patch_generic_hdmi }, 1671 + { .id = 0x10de0016, .name = "GPU 16 HDMI/DP", .patch = patch_generic_hdmi }, 1653 1672 /* 17 is known to be absent */ 1654 - { .id = 0x10de0018, .name = "GPU 18 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, 1655 - { .id = 0x10de0019, .name = "GPU 19 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, 1656 - { .id = 0x10de001a, .name = "GPU 1a HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, 1657 - { .id = 0x10de001b, .name = "GPU 1b HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, 1658 - { .id = 0x10de001c, .name = "GPU 1c HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, 1659 - { .id = 0x10de0040, .name = "GPU 40 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, 1660 - { .id = 0x10de0041, .name = "GPU 41 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, 1661 - { .id = 0x10de0042, .name = "GPU 42 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, 1662 - { .id = 0x10de0043, .name = "GPU 43 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, 1663 - { .id = 0x10de0044, .name = "GPU 44 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, 1673 + { .id = 0x10de0018, .name = "GPU 18 HDMI/DP", .patch = patch_generic_hdmi }, 1674 + { .id = 0x10de0019, .name = "GPU 19 HDMI/DP", .patch = patch_generic_hdmi }, 1675 + { .id = 0x10de001a, .name = "GPU 1a HDMI/DP", .patch = patch_generic_hdmi }, 1676 + { .id = 0x10de001b, .name = "GPU 1b HDMI/DP", .patch = patch_generic_hdmi }, 1677 + { .id = 0x10de001c, .name = "GPU 1c HDMI/DP", .patch = patch_generic_hdmi }, 1678 + { .id = 0x10de0040, .name = "GPU 40 HDMI/DP", .patch = patch_generic_hdmi }, 1679 + { .id = 0x10de0041, .name = "GPU 41 HDMI/DP", .patch = patch_generic_hdmi }, 1680 + { .id = 0x10de0042, .name = "GPU 42 HDMI/DP", .patch = patch_generic_hdmi }, 1681 + { .id = 0x10de0043, .name = "GPU 43 HDMI/DP", .patch = patch_generic_hdmi }, 1682 + { .id = 0x10de0044, .name = "GPU 44 HDMI/DP", .patch = patch_generic_hdmi }, 1664 1683 { .id = 0x10de0067, .name = "MCP67 HDMI", .patch = patch_nvhdmi_2ch }, 1665 1684 { .id = 0x10de8001, .name = "MCP73 HDMI", .patch = patch_nvhdmi_2ch }, 1666 1685 { .id = 0x80860054, .name = "IbexPeak HDMI", .patch = patch_generic_hdmi },
+1 -1
sound/soc/atmel/sam9g20_wm8731.c
··· 146 146 "at91sam9g20ek_wm8731 " 147 147 ": at91sam9g20ek_wm8731_init() called\n"); 148 148 149 - ret = snd_soc_dai_set_sysclk(codec_dai, WM8731_SYSCLK_XTAL, 149 + ret = snd_soc_dai_set_sysclk(codec_dai, WM8731_SYSCLK_MCLK, 150 150 MCLK_RATE, SND_SOC_CLOCK_IN); 151 151 if (ret < 0) { 152 152 printk(KERN_ERR "Failed to set WM8731 SYSCLK: %d\n", ret);
+1 -1
sound/soc/codecs/wm1250-ev1.c
··· 22 22 SND_SOC_DAPM_DAC("DAC", "wm1250-ev1 Playback", SND_SOC_NOPM, 0, 0), 23 23 24 24 SND_SOC_DAPM_INPUT("WM1250 Input"), 25 - SND_SOC_DAPM_INPUT("WM1250 Output"), 25 + SND_SOC_DAPM_OUTPUT("WM1250 Output"), 26 26 }; 27 27 28 28 static const struct snd_soc_dapm_route wm1250_ev1_dapm_routes[] = {
+1 -1
sound/soc/codecs/wm8731.c
··· 198 198 { 199 199 struct wm8731_priv *wm8731 = snd_soc_codec_get_drvdata(source->codec); 200 200 201 - return wm8731->sysclk_type == WM8731_SYSCLK_MCLK; 201 + return wm8731->sysclk_type == WM8731_SYSCLK_XTAL; 202 202 } 203 203 204 204 static const struct snd_soc_dapm_route wm8731_intercon[] = {
-1
sound/soc/codecs/wm8915.c
··· 19 19 #include <linux/gcd.h> 20 20 #include <linux/gpio.h> 21 21 #include <linux/i2c.h> 22 - #include <linux/delay.h> 23 22 #include <linux/regulator/consumer.h> 24 23 #include <linux/slab.h> 25 24 #include <linux/workqueue.h>
+59 -35
sound/soc/pxa/raumfeld.c
··· 151 151 .hw_params = raumfeld_cs4270_hw_params, 152 152 }; 153 153 154 - static int raumfeld_line_suspend(struct snd_soc_card *card) 154 + static int raumfeld_analog_suspend(struct snd_soc_card *card) 155 155 { 156 156 raumfeld_enable_audio(false); 157 157 return 0; 158 158 } 159 159 160 - static int raumfeld_line_resume(struct snd_soc_card *card) 160 + static int raumfeld_analog_resume(struct snd_soc_card *card) 161 161 { 162 162 raumfeld_enable_audio(true); 163 163 return 0; ··· 225 225 .hw_params = raumfeld_ak4104_hw_params, 226 226 }; 227 227 228 - static struct snd_soc_dai_link raumfeld_dai[] = { 229 - { 230 - .name = "ak4104", 231 - .stream_name = "Playback", 232 - .cpu_dai_name = "pxa-ssp-dai.1", 233 - .codec_dai_name = "ak4104-hifi", 234 - .platform_name = "pxa-pcm-audio", 235 - .ops = &raumfeld_ak4104_ops, 236 - .codec_name = "ak4104-codec.0", 237 - }, 238 - { 239 - .name = "CS4270", 240 - .stream_name = "CS4270", 241 - .cpu_dai_name = "pxa-ssp-dai.0", 242 - .platform_name = "pxa-pcm-audio", 243 - .codec_dai_name = "cs4270-hifi", 244 - .codec_name = "cs4270-codec.0-0048", 245 - .ops = &raumfeld_cs4270_ops, 246 - },}; 228 + #define DAI_LINK_CS4270 \ 229 + { \ 230 + .name = "CS4270", \ 231 + .stream_name = "CS4270", \ 232 + .cpu_dai_name = "pxa-ssp-dai.0", \ 233 + .platform_name = "pxa-pcm-audio", \ 234 + .codec_dai_name = "cs4270-hifi", \ 235 + .codec_name = "cs4270-codec.0-0048", \ 236 + .ops = &raumfeld_cs4270_ops, \ 237 + } 247 238 248 - static struct snd_soc_card snd_soc_raumfeld = { 249 - .name = "Raumfeld", 250 - .dai_link = raumfeld_dai, 251 - .suspend_post = raumfeld_line_suspend, 252 - .resume_pre = raumfeld_line_resume, 253 - .num_links = ARRAY_SIZE(raumfeld_dai), 239 + #define DAI_LINK_AK4104 \ 240 + { \ 241 + .name = "ak4104", \ 242 + .stream_name = "Playback", \ 243 + .cpu_dai_name = "pxa-ssp-dai.1", \ 244 + .codec_dai_name = "ak4104-hifi", \ 245 + .platform_name = "pxa-pcm-audio", \ 246 + .ops = &raumfeld_ak4104_ops, \ 247 + .codec_name = "spi0.0", \ 248 + } 249 + 250 + static struct snd_soc_dai_link snd_soc_raumfeld_connector_dai[] = 251 + { 252 + DAI_LINK_CS4270, 253 + DAI_LINK_AK4104, 254 + }; 255 + 256 + static struct snd_soc_dai_link snd_soc_raumfeld_speaker_dai[] = 257 + { 258 + DAI_LINK_CS4270, 259 + }; 260 + 261 + static struct snd_soc_card snd_soc_raumfeld_connector = { 262 + .name = "Raumfeld Connector", 263 + .dai_link = snd_soc_raumfeld_connector_dai, 264 + .num_links = ARRAY_SIZE(snd_soc_raumfeld_connector_dai), 265 + .suspend_post = raumfeld_analog_suspend, 266 + .resume_pre = raumfeld_analog_resume, 267 + }; 268 + 269 + static struct snd_soc_card snd_soc_raumfeld_speaker = { 270 + .name = "Raumfeld Speaker", 271 + .dai_link = snd_soc_raumfeld_speaker_dai, 272 + .num_links = ARRAY_SIZE(snd_soc_raumfeld_speaker_dai), 273 + .suspend_post = raumfeld_analog_suspend, 274 + .resume_pre = raumfeld_analog_resume, 254 275 }; 255 276 256 277 static struct platform_device *raumfeld_audio_device; ··· 292 271 293 272 set_max9485_clk(MAX9485_MCLK_FREQ_122880); 294 273 295 - /* Register LINE and SPDIF */ 274 + /* Register analog device */ 296 275 raumfeld_audio_device = platform_device_alloc("soc-audio", 0); 297 276 if (!raumfeld_audio_device) 298 277 return -ENOMEM; 299 278 300 - platform_set_drvdata(raumfeld_audio_device, 301 - &snd_soc_raumfeld); 302 - ret = platform_device_add(raumfeld_audio_device); 303 - 304 - /* no S/PDIF on Speakers */ 305 279 if (machine_is_raumfeld_speaker()) 280 + platform_set_drvdata(raumfeld_audio_device, 281 + &snd_soc_raumfeld_speaker); 282 + 283 + if (machine_is_raumfeld_connector()) 284 + platform_set_drvdata(raumfeld_audio_device, 285 + &snd_soc_raumfeld_connector); 286 + 287 + ret = platform_device_add(raumfeld_audio_device); 288 + if (ret < 0) 306 289 return ret; 307 290 308 291 raumfeld_enable_audio(true); 309 - 310 - return ret; 292 + return 0; 311 293 } 312 294 313 295 static void __exit raumfeld_audio_exit(void)
+4 -4
sound/soc/soc-core.c
··· 1306 1306 /* no, then find CPU DAI from registered DAIs*/ 1307 1307 list_for_each_entry(cpu_dai, &dai_list, list) { 1308 1308 if (!strcmp(cpu_dai->name, dai_link->cpu_dai_name)) { 1309 - 1310 - if (!try_module_get(cpu_dai->dev->driver->owner)) 1311 - return -ENODEV; 1312 - 1313 1309 rtd->cpu_dai = cpu_dai; 1314 1310 goto find_codec; 1315 1311 } ··· 1618 1622 1619 1623 /* probe the cpu_dai */ 1620 1624 if (!cpu_dai->probed) { 1625 + if (!try_module_get(cpu_dai->dev->driver->owner)) 1626 + return -ENODEV; 1627 + 1621 1628 if (cpu_dai->driver->probe) { 1622 1629 ret = cpu_dai->driver->probe(cpu_dai); 1623 1630 if (ret < 0) { 1624 1631 printk(KERN_ERR "asoc: failed to probe CPU DAI %s\n", 1625 1632 cpu_dai->name); 1633 + module_put(cpu_dai->dev->driver->owner); 1626 1634 return ret; 1627 1635 } 1628 1636 }
+1 -1
sound/soc/soc-dapm.c
··· 1110 1110 trace_snd_soc_dapm_start(card); 1111 1111 1112 1112 list_for_each_entry(d, &card->dapm_list, list) 1113 - if (d->n_widgets) 1113 + if (d->n_widgets || d->codec == NULL) 1114 1114 d->dev_power = 0; 1115 1115 1116 1116 /* Check which widgets we need to power and store them in
+9 -8
sound/usb/card.c
··· 48 48 #include <linux/usb/audio.h> 49 49 #include <linux/usb/audio-v2.h> 50 50 51 + #include <sound/control.h> 51 52 #include <sound/core.h> 52 53 #include <sound/info.h> 53 54 #include <sound/pcm.h> ··· 493 492 } 494 493 } 495 494 496 - chip->txfr_quirk = 0; 497 - err = 1; /* continue */ 498 - if (quirk && quirk->ifnum != QUIRK_NO_INTERFACE) { 499 - /* need some special handlings */ 500 - if ((err = snd_usb_create_quirk(chip, intf, &usb_audio_driver, quirk)) < 0) 501 - goto __error; 502 - } 503 - 504 495 /* 505 496 * For devices with more than one control interface, we assume the 506 497 * first contains the audio controls. We might need a more specific ··· 500 507 */ 501 508 if (!chip->ctrl_intf) 502 509 chip->ctrl_intf = alts; 510 + 511 + chip->txfr_quirk = 0; 512 + err = 1; /* continue */ 513 + if (quirk && quirk->ifnum != QUIRK_NO_INTERFACE) { 514 + /* need some special handlings */ 515 + if ((err = snd_usb_create_quirk(chip, intf, &usb_audio_driver, quirk)) < 0) 516 + goto __error; 517 + } 503 518 504 519 if (err > 0) { 505 520 /* create normal USB audio interfaces */
+13 -19
sound/usb/mixer.c
··· 86 86 const struct usbmix_selector_map *selector_map; 87 87 }; 88 88 89 - enum { 90 - USB_MIXER_BOOLEAN, 91 - USB_MIXER_INV_BOOLEAN, 92 - USB_MIXER_S8, 93 - USB_MIXER_U8, 94 - USB_MIXER_S16, 95 - USB_MIXER_U16, 96 - }; 97 - 98 - 99 89 /*E-mu 0202/0404/0204 eXtension Unit(XU) control*/ 100 90 enum { 101 91 USB_XU_CLOCK_RATE = 0xe301, ··· 525 535 * if failed, give up and free the control instance. 526 536 */ 527 537 528 - static int add_control_to_empty(struct mixer_build *state, struct snd_kcontrol *kctl) 538 + int snd_usb_mixer_add_control(struct usb_mixer_interface *mixer, 539 + struct snd_kcontrol *kctl) 529 540 { 530 541 struct usb_mixer_elem_info *cval = kctl->private_data; 531 542 int err; 532 543 533 - while (snd_ctl_find_id(state->chip->card, &kctl->id)) 544 + while (snd_ctl_find_id(mixer->chip->card, &kctl->id)) 534 545 kctl->id.index++; 535 - if ((err = snd_ctl_add(state->chip->card, kctl)) < 0) { 546 + if ((err = snd_ctl_add(mixer->chip->card, kctl)) < 0) { 536 547 snd_printd(KERN_ERR "cannot add control (err = %d)\n", err); 537 548 return err; 538 549 } 539 550 cval->elem_id = &kctl->id; 540 - cval->next_id_elem = state->mixer->id_elems[cval->id]; 541 - state->mixer->id_elems[cval->id] = cval; 551 + cval->next_id_elem = mixer->id_elems[cval->id]; 552 + mixer->id_elems[cval->id] = cval; 542 553 return 0; 543 554 } 544 555 ··· 975 984 .put = NULL, 976 985 }; 977 986 987 + /* This symbol is exported in order to allow the mixer quirks to 988 + * hook up to the standard feature unit control mechanism */ 989 + struct snd_kcontrol_new *snd_usb_feature_unit_ctl = &usb_feature_unit_ctl; 978 990 979 991 /* 980 992 * build a feature control ··· 1170 1176 1171 1177 snd_printdd(KERN_INFO "[%d] FU [%s] ch = %d, val = %d/%d/%d\n", 1172 1178 cval->id, kctl->id.name, cval->channels, cval->min, cval->max, cval->res); 1173 - add_control_to_empty(state, kctl); 1179 + snd_usb_mixer_add_control(state->mixer, kctl); 1174 1180 } 1175 1181 1176 1182 ··· 1334 1340 1335 1341 snd_printdd(KERN_INFO "[%d] MU [%s] ch = %d, val = %d/%d\n", 1336 1342 cval->id, kctl->id.name, cval->channels, cval->min, cval->max); 1337 - add_control_to_empty(state, kctl); 1343 + snd_usb_mixer_add_control(state->mixer, kctl); 1338 1344 } 1339 1345 1340 1346 ··· 1635 1641 1636 1642 snd_printdd(KERN_INFO "[%d] PU [%s] ch = %d, val = %d/%d\n", 1637 1643 cval->id, kctl->id.name, cval->channels, cval->min, cval->max); 1638 - if ((err = add_control_to_empty(state, kctl)) < 0) 1644 + if ((err = snd_usb_mixer_add_control(state->mixer, kctl)) < 0) 1639 1645 return err; 1640 1646 } 1641 1647 return 0; ··· 1852 1858 1853 1859 snd_printdd(KERN_INFO "[%d] SU [%s] items = %d\n", 1854 1860 cval->id, kctl->id.name, desc->bNrInPins); 1855 - if ((err = add_control_to_empty(state, kctl)) < 0) 1861 + if ((err = snd_usb_mixer_add_control(state->mixer, kctl)) < 0) 1856 1862 return err; 1857 1863 1858 1864 return 0;
+13 -1
sound/usb/mixer.h
··· 24 24 u8 xonar_u1_status; 25 25 }; 26 26 27 - #define MAX_CHANNELS 10 /* max logical channels */ 27 + #define MAX_CHANNELS 16 /* max logical channels */ 28 + 29 + enum { 30 + USB_MIXER_BOOLEAN, 31 + USB_MIXER_INV_BOOLEAN, 32 + USB_MIXER_S8, 33 + USB_MIXER_U8, 34 + USB_MIXER_S16, 35 + USB_MIXER_U16, 36 + }; 28 37 29 38 struct usb_mixer_elem_info { 30 39 struct usb_mixer_interface *mixer; ··· 63 54 int request, int validx, int value_set); 64 55 void snd_usb_mixer_inactivate(struct usb_mixer_interface *mixer); 65 56 int snd_usb_mixer_activate(struct usb_mixer_interface *mixer); 57 + 58 + int snd_usb_mixer_add_control(struct usb_mixer_interface *mixer, 59 + struct snd_kcontrol *kctl); 66 60 67 61 #endif /* __USBMIXER_H */
+70
sound/usb/mixer_quirks.c
··· 40 40 #include "mixer_quirks.h" 41 41 #include "helper.h" 42 42 43 + extern struct snd_kcontrol_new *snd_usb_feature_unit_ctl; 44 + 43 45 /* 44 46 * Sound Blaster remote control configuration 45 47 * ··· 494 492 return err; 495 493 } 496 494 495 + /* M-Audio FastTrack Ultra quirks */ 496 + 497 + /* private_free callback */ 498 + static void usb_mixer_elem_free(struct snd_kcontrol *kctl) 499 + { 500 + kfree(kctl->private_data); 501 + kctl->private_data = NULL; 502 + } 503 + 504 + static int snd_maudio_ftu_create_ctl(struct usb_mixer_interface *mixer, 505 + int in, int out, const char *name) 506 + { 507 + struct usb_mixer_elem_info *cval; 508 + struct snd_kcontrol *kctl; 509 + 510 + cval = kzalloc(sizeof(*cval), GFP_KERNEL); 511 + if (!cval) 512 + return -ENOMEM; 513 + 514 + cval->id = 5; 515 + cval->mixer = mixer; 516 + cval->val_type = USB_MIXER_S16; 517 + cval->channels = 1; 518 + cval->control = out + 1; 519 + cval->cmask = 1 << in; 520 + 521 + kctl = snd_ctl_new1(snd_usb_feature_unit_ctl, cval); 522 + if (!kctl) { 523 + kfree(cval); 524 + return -ENOMEM; 525 + } 526 + 527 + snprintf(kctl->id.name, sizeof(kctl->id.name), name); 528 + kctl->private_free = usb_mixer_elem_free; 529 + return snd_usb_mixer_add_control(mixer, kctl); 530 + } 531 + 532 + static int snd_maudio_ftu_create_mixer(struct usb_mixer_interface *mixer) 533 + { 534 + char name[64]; 535 + int in, out, err; 536 + 537 + for (out = 0; out < 8; out++) { 538 + for (in = 0; in < 8; in++) { 539 + snprintf(name, sizeof(name), 540 + "AIn%d - Out%d Capture Volume", in + 1, out + 1); 541 + err = snd_maudio_ftu_create_ctl(mixer, in, out, name); 542 + if (err < 0) 543 + return err; 544 + } 545 + 546 + for (in = 8; in < 16; in++) { 547 + snprintf(name, sizeof(name), 548 + "DIn%d - Out%d Playback Volume", in - 7, out + 1); 549 + err = snd_maudio_ftu_create_ctl(mixer, in, out, name); 550 + if (err < 0) 551 + return err; 552 + } 553 + } 554 + 555 + return 0; 556 + } 557 + 497 558 void snd_emuusb_set_samplerate(struct snd_usb_audio *chip, 498 559 unsigned char samplerate_id) 499 560 { ··· 596 531 if (!snd_card_proc_new(mixer->chip->card, "audigy2nx", &entry)) 597 532 snd_info_set_text_ops(entry, mixer, 598 533 snd_audigy2nx_proc_read); 534 + break; 535 + 536 + case USB_ID(0x0763, 0x2080): /* M-Audio Fast Track Ultra */ 537 + case USB_ID(0x0763, 0x2081): /* M-Audio Fast Track Ultra 8R */ 538 + err = snd_maudio_ftu_create_mixer(mixer); 599 539 break; 600 540 601 541 case USB_ID(0x0b05, 0x1739):
+2 -2
sound/usb/quirks-table.h
··· 1988 1988 .data = & (const struct snd_usb_audio_quirk[]) { 1989 1989 { 1990 1990 .ifnum = 0, 1991 - .type = QUIRK_IGNORE_INTERFACE 1991 + .type = QUIRK_AUDIO_STANDARD_MIXER, 1992 1992 }, 1993 1993 { 1994 1994 .ifnum = 1, ··· 2055 2055 .data = & (const struct snd_usb_audio_quirk[]) { 2056 2056 { 2057 2057 .ifnum = 0, 2058 - .type = QUIRK_IGNORE_INTERFACE 2058 + .type = QUIRK_AUDIO_STANDARD_MIXER, 2059 2059 }, 2060 2060 { 2061 2061 .ifnum = 1,
+17 -1
sound/usb/quirks.c
··· 19 19 #include <linux/usb.h> 20 20 #include <linux/usb/audio.h> 21 21 22 + #include <sound/control.h> 22 23 #include <sound/core.h> 23 24 #include <sound/info.h> 24 25 #include <sound/pcm.h> ··· 264 263 } 265 264 266 265 /* 266 + * Create a standard mixer for the specified interface. 267 + */ 268 + static int create_standard_mixer_quirk(struct snd_usb_audio *chip, 269 + struct usb_interface *iface, 270 + struct usb_driver *driver, 271 + const struct snd_usb_audio_quirk *quirk) 272 + { 273 + if (quirk->ifnum < 0) 274 + return 0; 275 + 276 + return snd_usb_create_mixer(chip, quirk->ifnum, 0); 277 + } 278 + 279 + /* 267 280 * audio-interface quirks 268 281 * 269 282 * returns zero if no standard audio/MIDI parsing is needed. ··· 309 294 [QUIRK_AUDIO_STANDARD_INTERFACE] = create_standard_audio_quirk, 310 295 [QUIRK_AUDIO_FIXED_ENDPOINT] = create_fixed_stream_quirk, 311 296 [QUIRK_AUDIO_EDIROL_UAXX] = create_uaxx_quirk, 312 - [QUIRK_AUDIO_ALIGN_TRANSFER] = create_align_transfer_quirk 297 + [QUIRK_AUDIO_ALIGN_TRANSFER] = create_align_transfer_quirk, 298 + [QUIRK_AUDIO_STANDARD_MIXER] = create_standard_mixer_quirk, 313 299 }; 314 300 315 301 if (quirk->type < QUIRK_TYPE_COUNT) {
+1
sound/usb/usbaudio.h
··· 84 84 QUIRK_AUDIO_FIXED_ENDPOINT, 85 85 QUIRK_AUDIO_EDIROL_UAXX, 86 86 QUIRK_AUDIO_ALIGN_TRANSFER, 87 + QUIRK_AUDIO_STANDARD_MIXER, 87 88 88 89 QUIRK_TYPE_COUNT 89 90 };