diff options
| -rw-r--r-- | Documentation/sound/alsa/HD-Audio-Models.txt | 1 | ||||
| -rw-r--r-- | sound/atmel/ac97c.c | 5 | ||||
| -rw-r--r-- | sound/core/hrtimer.c | 7 | ||||
| -rw-r--r-- | sound/drivers/mtpav.c | 3 | ||||
| -rw-r--r-- | sound/oss/Makefile | 4 | ||||
| -rw-r--r-- | sound/pci/azt3328.c | 38 | ||||
| -rw-r--r-- | sound/pci/hda/hda_eld.c | 2 | ||||
| -rw-r--r-- | sound/pci/hda/hda_intel.c | 2 | ||||
| -rw-r--r-- | sound/pci/hda/patch_conexant.c | 149 | ||||
| -rw-r--r-- | sound/pci/hda/patch_hdmi.c | 2 | ||||
| -rw-r--r-- | sound/pci/hda/patch_realtek.c | 57 | ||||
| -rw-r--r-- | sound/pci/ice1712/delta.c | 7 | ||||
| -rw-r--r-- | sound/pci/oxygen/oxygen.h | 2 | ||||
| -rw-r--r-- | sound/pci/oxygen/oxygen_mixer.c | 2 | ||||
| -rw-r--r-- | sound/pci/oxygen/xonar_cs43xx.c | 2 | ||||
| -rw-r--r-- | sound/pci/oxygen/xonar_dg.c | 36 | ||||
| -rw-r--r-- | sound/pcmcia/pdaudiocf/pdaudiocf.h | 2 | ||||
| -rw-r--r-- | sound/pcmcia/vx/vxp_ops.c | 2 | ||||
| -rw-r--r-- | sound/usb/mixer.c | 4 | ||||
| -rw-r--r-- | sound/usb/quirks-table.h | 7 | ||||
| -rw-r--r-- | sound/usb/quirks.c | 3 |
21 files changed, 224 insertions, 113 deletions
diff --git a/Documentation/sound/alsa/HD-Audio-Models.txt b/Documentation/sound/alsa/HD-Audio-Models.txt index 16ae4300c747..0caf77e59be4 100644 --- a/Documentation/sound/alsa/HD-Audio-Models.txt +++ b/Documentation/sound/alsa/HD-Audio-Models.txt | |||
| @@ -296,6 +296,7 @@ Conexant 5066 | |||
| 296 | ============= | 296 | ============= |
| 297 | laptop Basic Laptop config (default) | 297 | laptop Basic Laptop config (default) |
| 298 | hp-laptop HP laptops, e g G60 | 298 | hp-laptop HP laptops, e g G60 |
| 299 | asus Asus K52JU, Lenovo G560 | ||
| 299 | dell-laptop Dell laptops | 300 | dell-laptop Dell laptops |
| 300 | dell-vostro Dell Vostro | 301 | dell-vostro Dell Vostro |
| 301 | olpc-xo-1_5 OLPC XO 1.5 | 302 | olpc-xo-1_5 OLPC XO 1.5 |
diff --git a/sound/atmel/ac97c.c b/sound/atmel/ac97c.c index 10c3a871a12d..b310702c646e 100644 --- a/sound/atmel/ac97c.c +++ b/sound/atmel/ac97c.c | |||
| @@ -33,9 +33,12 @@ | |||
| 33 | #include <linux/dw_dmac.h> | 33 | #include <linux/dw_dmac.h> |
| 34 | 34 | ||
| 35 | #include <mach/cpu.h> | 35 | #include <mach/cpu.h> |
| 36 | #include <mach/hardware.h> | ||
| 37 | #include <mach/gpio.h> | 36 | #include <mach/gpio.h> |
| 38 | 37 | ||
| 38 | #ifdef CONFIG_ARCH_AT91 | ||
| 39 | #include <mach/hardware.h> | ||
| 40 | #endif | ||
| 41 | |||
| 39 | #include "ac97c.h" | 42 | #include "ac97c.h" |
| 40 | 43 | ||
| 41 | enum { | 44 | enum { |
diff --git a/sound/core/hrtimer.c b/sound/core/hrtimer.c index 7730575bfadd..b8b31c433d64 100644 --- a/sound/core/hrtimer.c +++ b/sound/core/hrtimer.c | |||
| @@ -45,12 +45,13 @@ static enum hrtimer_restart snd_hrtimer_callback(struct hrtimer *hrt) | |||
| 45 | { | 45 | { |
| 46 | struct snd_hrtimer *stime = container_of(hrt, struct snd_hrtimer, hrt); | 46 | struct snd_hrtimer *stime = container_of(hrt, struct snd_hrtimer, hrt); |
| 47 | struct snd_timer *t = stime->timer; | 47 | struct snd_timer *t = stime->timer; |
| 48 | unsigned long oruns; | ||
| 48 | 49 | ||
| 49 | if (!atomic_read(&stime->running)) | 50 | if (!atomic_read(&stime->running)) |
| 50 | return HRTIMER_NORESTART; | 51 | return HRTIMER_NORESTART; |
| 51 | 52 | ||
| 52 | hrtimer_forward_now(hrt, ns_to_ktime(t->sticks * resolution)); | 53 | oruns = hrtimer_forward_now(hrt, ns_to_ktime(t->sticks * resolution)); |
| 53 | snd_timer_interrupt(stime->timer, t->sticks); | 54 | snd_timer_interrupt(stime->timer, t->sticks * oruns); |
| 54 | 55 | ||
| 55 | if (!atomic_read(&stime->running)) | 56 | if (!atomic_read(&stime->running)) |
| 56 | return HRTIMER_NORESTART; | 57 | return HRTIMER_NORESTART; |
| @@ -104,7 +105,7 @@ static int snd_hrtimer_stop(struct snd_timer *t) | |||
| 104 | } | 105 | } |
| 105 | 106 | ||
| 106 | static struct snd_timer_hardware hrtimer_hw = { | 107 | static struct snd_timer_hardware hrtimer_hw = { |
| 107 | .flags = SNDRV_TIMER_HW_AUTO, | 108 | .flags = SNDRV_TIMER_HW_AUTO | SNDRV_TIMER_HW_TASKLET, |
| 108 | .open = snd_hrtimer_open, | 109 | .open = snd_hrtimer_open, |
| 109 | .close = snd_hrtimer_close, | 110 | .close = snd_hrtimer_close, |
| 110 | .start = snd_hrtimer_start, | 111 | .start = snd_hrtimer_start, |
diff --git a/sound/drivers/mtpav.c b/sound/drivers/mtpav.c index da03597fc893..5c426df87678 100644 --- a/sound/drivers/mtpav.c +++ b/sound/drivers/mtpav.c | |||
| @@ -55,14 +55,13 @@ | |||
| 55 | #include <linux/err.h> | 55 | #include <linux/err.h> |
| 56 | #include <linux/platform_device.h> | 56 | #include <linux/platform_device.h> |
| 57 | #include <linux/ioport.h> | 57 | #include <linux/ioport.h> |
| 58 | #include <linux/io.h> | ||
| 58 | #include <linux/moduleparam.h> | 59 | #include <linux/moduleparam.h> |
| 59 | #include <sound/core.h> | 60 | #include <sound/core.h> |
| 60 | #include <sound/initval.h> | 61 | #include <sound/initval.h> |
| 61 | #include <sound/rawmidi.h> | 62 | #include <sound/rawmidi.h> |
| 62 | #include <linux/delay.h> | 63 | #include <linux/delay.h> |
| 63 | 64 | ||
| 64 | #include <asm/io.h> | ||
| 65 | |||
| 66 | /* | 65 | /* |
| 67 | * globals | 66 | * globals |
| 68 | */ | 67 | */ |
diff --git a/sound/oss/Makefile b/sound/oss/Makefile index 96f14dcd0cd1..90ffb99c6b17 100644 --- a/sound/oss/Makefile +++ b/sound/oss/Makefile | |||
| @@ -87,7 +87,7 @@ ifeq ($(CONFIG_PSS_HAVE_BOOT),y) | |||
| 87 | $(obj)/bin2hex pss_synth < $< > $@ | 87 | $(obj)/bin2hex pss_synth < $< > $@ |
| 88 | else | 88 | else |
| 89 | $(obj)/pss_boot.h: | 89 | $(obj)/pss_boot.h: |
| 90 | ( \ | 90 | $(Q)( \ |
| 91 | echo 'static unsigned char * pss_synth = NULL;'; \ | 91 | echo 'static unsigned char * pss_synth = NULL;'; \ |
| 92 | echo 'static int pss_synthLen = 0;'; \ | 92 | echo 'static int pss_synthLen = 0;'; \ |
| 93 | ) > $@ | 93 | ) > $@ |
| @@ -102,7 +102,7 @@ ifeq ($(CONFIG_TRIX_HAVE_BOOT),y) | |||
| 102 | $(obj)/hex2hex -i trix_boot < $< > $@ | 102 | $(obj)/hex2hex -i trix_boot < $< > $@ |
| 103 | else | 103 | else |
| 104 | $(obj)/trix_boot.h: | 104 | $(obj)/trix_boot.h: |
| 105 | ( \ | 105 | $(Q)( \ |
| 106 | echo 'static unsigned char * trix_boot = NULL;'; \ | 106 | echo 'static unsigned char * trix_boot = NULL;'; \ |
| 107 | echo 'static int trix_boot_len = 0;'; \ | 107 | echo 'static int trix_boot_len = 0;'; \ |
| 108 | ) > $@ | 108 | ) > $@ |
diff --git a/sound/pci/azt3328.c b/sound/pci/azt3328.c index 6117595fc075..573594bf3225 100644 --- a/sound/pci/azt3328.c +++ b/sound/pci/azt3328.c | |||
| @@ -979,31 +979,25 @@ snd_azf3328_codec_setfmt(struct snd_azf3328_codec_data *codec, | |||
| 979 | 979 | ||
| 980 | snd_azf3328_dbgcallenter(); | 980 | snd_azf3328_dbgcallenter(); |
| 981 | switch (bitrate) { | 981 | switch (bitrate) { |
| 982 | #define AZF_FMT_XLATE(in_freq, out_bits) \ | 982 | case AZF_FREQ_4000: freq = SOUNDFORMAT_FREQ_SUSPECTED_4000; break; |
| 983 | do { \ | 983 | case AZF_FREQ_4800: freq = SOUNDFORMAT_FREQ_SUSPECTED_4800; break; |
| 984 | case AZF_FREQ_ ## in_freq: \ | 984 | case AZF_FREQ_5512: |
| 985 | freq = SOUNDFORMAT_FREQ_ ## out_bits; \ | 985 | /* the AZF3328 names it "5510" for some strange reason */ |
| 986 | break; \ | 986 | freq = SOUNDFORMAT_FREQ_5510; break; |
| 987 | } while (0); | 987 | case AZF_FREQ_6620: freq = SOUNDFORMAT_FREQ_6620; break; |
| 988 | AZF_FMT_XLATE(4000, SUSPECTED_4000) | 988 | case AZF_FREQ_8000: freq = SOUNDFORMAT_FREQ_8000; break; |
| 989 | AZF_FMT_XLATE(4800, SUSPECTED_4800) | 989 | case AZF_FREQ_9600: freq = SOUNDFORMAT_FREQ_9600; break; |
| 990 | /* the AZF3328 names it "5510" for some strange reason: */ | 990 | case AZF_FREQ_11025: freq = SOUNDFORMAT_FREQ_11025; break; |
| 991 | AZF_FMT_XLATE(5512, 5510) | 991 | case AZF_FREQ_13240: freq = SOUNDFORMAT_FREQ_SUSPECTED_13240; break; |
| 992 | AZF_FMT_XLATE(6620, 6620) | 992 | case AZF_FREQ_16000: freq = SOUNDFORMAT_FREQ_16000; break; |
| 993 | AZF_FMT_XLATE(8000, 8000) | 993 | case AZF_FREQ_22050: freq = SOUNDFORMAT_FREQ_22050; break; |
| 994 | AZF_FMT_XLATE(9600, 9600) | 994 | case AZF_FREQ_32000: freq = SOUNDFORMAT_FREQ_32000; break; |
| 995 | AZF_FMT_XLATE(11025, 11025) | ||
| 996 | AZF_FMT_XLATE(13240, SUSPECTED_13240) | ||
| 997 | AZF_FMT_XLATE(16000, 16000) | ||
| 998 | AZF_FMT_XLATE(22050, 22050) | ||
| 999 | AZF_FMT_XLATE(32000, 32000) | ||
| 1000 | default: | 995 | default: |
| 1001 | snd_printk(KERN_WARNING "unknown bitrate %d, assuming 44.1kHz!\n", bitrate); | 996 | snd_printk(KERN_WARNING "unknown bitrate %d, assuming 44.1kHz!\n", bitrate); |
| 1002 | /* fall-through */ | 997 | /* fall-through */ |
| 1003 | AZF_FMT_XLATE(44100, 44100) | 998 | case AZF_FREQ_44100: freq = SOUNDFORMAT_FREQ_44100; break; |
| 1004 | AZF_FMT_XLATE(48000, 48000) | 999 | case AZF_FREQ_48000: freq = SOUNDFORMAT_FREQ_48000; break; |
| 1005 | AZF_FMT_XLATE(66200, SUSPECTED_66200) | 1000 | case AZF_FREQ_66200: freq = SOUNDFORMAT_FREQ_SUSPECTED_66200; break; |
| 1006 | #undef AZF_FMT_XLATE | ||
| 1007 | } | 1001 | } |
| 1008 | /* val = 0xff07; 3m27.993s (65301Hz; -> 64000Hz???) hmm, 66120, 65967, 66123 */ | 1002 | /* val = 0xff07; 3m27.993s (65301Hz; -> 64000Hz???) hmm, 66120, 65967, 66123 */ |
| 1009 | /* val = 0xff09; 17m15.098s (13123,478Hz; -> 12000Hz???) hmm, 13237.2Hz? */ | 1003 | /* val = 0xff09; 17m15.098s (13123,478Hz; -> 12000Hz???) hmm, 13237.2Hz? */ |
diff --git a/sound/pci/hda/hda_eld.c b/sound/pci/hda/hda_eld.c index 4a663471dadc..74b0560289c0 100644 --- a/sound/pci/hda/hda_eld.c +++ b/sound/pci/hda/hda_eld.c | |||
| @@ -381,7 +381,7 @@ static void hdmi_show_short_audio_desc(struct cea_sad *a) | |||
| 381 | snd_print_pcm_rates(a->rates, buf, sizeof(buf)); | 381 | snd_print_pcm_rates(a->rates, buf, sizeof(buf)); |
| 382 | 382 | ||
| 383 | if (a->format == AUDIO_CODING_TYPE_LPCM) | 383 | if (a->format == AUDIO_CODING_TYPE_LPCM) |
| 384 | snd_print_pcm_bits(a->sample_bits, buf2 + 8, sizeof(buf2 - 8)); | 384 | snd_print_pcm_bits(a->sample_bits, buf2 + 8, sizeof(buf2) - 8); |
| 385 | else if (a->max_bitrate) | 385 | else if (a->max_bitrate) |
| 386 | snprintf(buf2, sizeof(buf2), | 386 | snprintf(buf2, sizeof(buf2), |
| 387 | ", max bitrate = %d", a->max_bitrate); | 387 | ", max bitrate = %d", a->max_bitrate); |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 2e91a991eb15..0baffcdee8f9 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
| @@ -2703,7 +2703,7 @@ static int __devinit azx_probe(struct pci_dev *pci, | |||
| 2703 | if (err < 0) | 2703 | if (err < 0) |
| 2704 | goto out_free; | 2704 | goto out_free; |
| 2705 | #ifdef CONFIG_SND_HDA_PATCH_LOADER | 2705 | #ifdef CONFIG_SND_HDA_PATCH_LOADER |
| 2706 | if (patch[dev]) { | 2706 | if (patch[dev] && *patch[dev]) { |
| 2707 | snd_printk(KERN_ERR SFX "Applying patch firmware '%s'\n", | 2707 | snd_printk(KERN_ERR SFX "Applying patch firmware '%s'\n", |
| 2708 | patch[dev]); | 2708 | patch[dev]); |
| 2709 | err = snd_hda_load_patch(chip->bus, patch[dev]); | 2709 | err = snd_hda_load_patch(chip->bus, patch[dev]); |
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index 9bb030a469cd..fbe97d32140d 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c | |||
| @@ -85,6 +85,7 @@ struct conexant_spec { | |||
| 85 | unsigned int auto_mic; | 85 | unsigned int auto_mic; |
| 86 | int auto_mic_ext; /* autocfg.inputs[] index for ext mic */ | 86 | int auto_mic_ext; /* autocfg.inputs[] index for ext mic */ |
| 87 | unsigned int need_dac_fix; | 87 | unsigned int need_dac_fix; |
| 88 | hda_nid_t slave_dig_outs[2]; | ||
| 88 | 89 | ||
| 89 | /* capture */ | 90 | /* capture */ |
| 90 | unsigned int num_adc_nids; | 91 | unsigned int num_adc_nids; |
| @@ -127,6 +128,7 @@ struct conexant_spec { | |||
| 127 | unsigned int ideapad:1; | 128 | unsigned int ideapad:1; |
| 128 | unsigned int thinkpad:1; | 129 | unsigned int thinkpad:1; |
| 129 | unsigned int hp_laptop:1; | 130 | unsigned int hp_laptop:1; |
| 131 | unsigned int asus:1; | ||
| 130 | 132 | ||
| 131 | unsigned int ext_mic_present; | 133 | unsigned int ext_mic_present; |
| 132 | unsigned int recording; | 134 | unsigned int recording; |
| @@ -352,6 +354,8 @@ static int conexant_build_pcms(struct hda_codec *codec) | |||
| 352 | info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = | 354 | info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = |
| 353 | spec->dig_in_nid; | 355 | spec->dig_in_nid; |
| 354 | } | 356 | } |
| 357 | if (spec->slave_dig_outs[0]) | ||
| 358 | codec->slave_dig_outs = spec->slave_dig_outs; | ||
| 355 | } | 359 | } |
| 356 | 360 | ||
| 357 | return 0; | 361 | return 0; |
| @@ -403,10 +407,16 @@ static int conexant_add_jack(struct hda_codec *codec, | |||
| 403 | struct conexant_spec *spec; | 407 | struct conexant_spec *spec; |
| 404 | struct conexant_jack *jack; | 408 | struct conexant_jack *jack; |
| 405 | const char *name; | 409 | const char *name; |
| 406 | int err; | 410 | int i, err; |
| 407 | 411 | ||
| 408 | spec = codec->spec; | 412 | spec = codec->spec; |
| 409 | snd_array_init(&spec->jacks, sizeof(*jack), 32); | 413 | snd_array_init(&spec->jacks, sizeof(*jack), 32); |
| 414 | |||
| 415 | jack = spec->jacks.list; | ||
| 416 | for (i = 0; i < spec->jacks.used; i++, jack++) | ||
| 417 | if (jack->nid == nid) | ||
| 418 | return 0 ; /* already present */ | ||
| 419 | |||
| 410 | jack = snd_array_new(&spec->jacks); | 420 | jack = snd_array_new(&spec->jacks); |
| 411 | name = (type == SND_JACK_HEADPHONE) ? "Headphone" : "Mic" ; | 421 | name = (type == SND_JACK_HEADPHONE) ? "Headphone" : "Mic" ; |
| 412 | 422 | ||
| @@ -2100,7 +2110,7 @@ static int patch_cxt5051(struct hda_codec *codec) | |||
| 2100 | static hda_nid_t cxt5066_dac_nids[1] = { 0x10 }; | 2110 | static hda_nid_t cxt5066_dac_nids[1] = { 0x10 }; |
| 2101 | static hda_nid_t cxt5066_adc_nids[3] = { 0x14, 0x15, 0x16 }; | 2111 | static hda_nid_t cxt5066_adc_nids[3] = { 0x14, 0x15, 0x16 }; |
| 2102 | static hda_nid_t cxt5066_capsrc_nids[1] = { 0x17 }; | 2112 | static hda_nid_t cxt5066_capsrc_nids[1] = { 0x17 }; |
| 2103 | #define CXT5066_SPDIF_OUT 0x21 | 2113 | static hda_nid_t cxt5066_digout_pin_nids[2] = { 0x20, 0x22 }; |
| 2104 | 2114 | ||
| 2105 | /* OLPC's microphone port is DC coupled for use with external sensors, | 2115 | /* OLPC's microphone port is DC coupled for use with external sensors, |
| 2106 | * therefore we use a 50% mic bias in order to center the input signal with | 2116 | * therefore we use a 50% mic bias in order to center the input signal with |
| @@ -2312,6 +2322,19 @@ static void cxt5066_ideapad_automic(struct hda_codec *codec) | |||
| 2312 | } | 2322 | } |
| 2313 | } | 2323 | } |
| 2314 | 2324 | ||
| 2325 | |||
| 2326 | /* toggle input of built-in digital mic and mic jack appropriately */ | ||
| 2327 | static void cxt5066_asus_automic(struct hda_codec *codec) | ||
| 2328 | { | ||
| 2329 | unsigned int present; | ||
| 2330 | |||
| 2331 | present = snd_hda_jack_detect(codec, 0x1b); | ||
| 2332 | snd_printdd("CXT5066: external microphone present=%d\n", present); | ||
| 2333 | snd_hda_codec_write(codec, 0x17, 0, AC_VERB_SET_CONNECT_SEL, | ||
| 2334 | present ? 1 : 0); | ||
| 2335 | } | ||
| 2336 | |||
| 2337 | |||
| 2315 | /* toggle input of built-in digital mic and mic jack appropriately */ | 2338 | /* toggle input of built-in digital mic and mic jack appropriately */ |
| 2316 | static void cxt5066_hp_laptop_automic(struct hda_codec *codec) | 2339 | static void cxt5066_hp_laptop_automic(struct hda_codec *codec) |
| 2317 | { | 2340 | { |
| @@ -2387,79 +2410,55 @@ static void cxt5066_hp_automute(struct hda_codec *codec) | |||
| 2387 | cxt5066_update_speaker(codec); | 2410 | cxt5066_update_speaker(codec); |
| 2388 | } | 2411 | } |
| 2389 | 2412 | ||
| 2390 | /* unsolicited event for jack sensing */ | 2413 | /* Dispatch the right mic autoswitch function */ |
| 2391 | static void cxt5066_olpc_unsol_event(struct hda_codec *codec, unsigned int res) | 2414 | static void cxt5066_automic(struct hda_codec *codec) |
| 2392 | { | 2415 | { |
| 2393 | struct conexant_spec *spec = codec->spec; | 2416 | struct conexant_spec *spec = codec->spec; |
| 2394 | snd_printdd("CXT5066: unsol event %x (%x)\n", res, res >> 26); | ||
| 2395 | switch (res >> 26) { | ||
| 2396 | case CONEXANT_HP_EVENT: | ||
| 2397 | cxt5066_hp_automute(codec); | ||
| 2398 | break; | ||
| 2399 | case CONEXANT_MIC_EVENT: | ||
| 2400 | /* ignore mic events in DC mode; we're always using the jack */ | ||
| 2401 | if (!spec->dc_enable) | ||
| 2402 | cxt5066_olpc_automic(codec); | ||
| 2403 | break; | ||
| 2404 | } | ||
| 2405 | } | ||
| 2406 | 2417 | ||
| 2407 | /* unsolicited event for jack sensing */ | 2418 | if (spec->dell_vostro) |
| 2408 | static void cxt5066_vostro_event(struct hda_codec *codec, unsigned int res) | ||
| 2409 | { | ||
| 2410 | snd_printdd("CXT5066_vostro: unsol event %x (%x)\n", res, res >> 26); | ||
| 2411 | switch (res >> 26) { | ||
| 2412 | case CONEXANT_HP_EVENT: | ||
| 2413 | cxt5066_hp_automute(codec); | ||
| 2414 | break; | ||
| 2415 | case CONEXANT_MIC_EVENT: | ||
| 2416 | cxt5066_vostro_automic(codec); | 2419 | cxt5066_vostro_automic(codec); |
| 2417 | break; | 2420 | else if (spec->ideapad) |
| 2418 | } | ||
| 2419 | } | ||
| 2420 | |||
| 2421 | /* unsolicited event for jack sensing */ | ||
| 2422 | static void cxt5066_ideapad_event(struct hda_codec *codec, unsigned int res) | ||
| 2423 | { | ||
| 2424 | snd_printdd("CXT5066_ideapad: unsol event %x (%x)\n", res, res >> 26); | ||
| 2425 | switch (res >> 26) { | ||
| 2426 | case CONEXANT_HP_EVENT: | ||
| 2427 | cxt5066_hp_automute(codec); | ||
| 2428 | break; | ||
| 2429 | case CONEXANT_MIC_EVENT: | ||
| 2430 | cxt5066_ideapad_automic(codec); | 2421 | cxt5066_ideapad_automic(codec); |
| 2431 | break; | 2422 | else if (spec->thinkpad) |
| 2432 | } | 2423 | cxt5066_thinkpad_automic(codec); |
| 2424 | else if (spec->hp_laptop) | ||
| 2425 | cxt5066_hp_laptop_automic(codec); | ||
| 2426 | else if (spec->asus) | ||
| 2427 | cxt5066_asus_automic(codec); | ||
| 2433 | } | 2428 | } |
| 2434 | 2429 | ||
| 2435 | /* unsolicited event for jack sensing */ | 2430 | /* unsolicited event for jack sensing */ |
| 2436 | static void cxt5066_hp_laptop_event(struct hda_codec *codec, unsigned int res) | 2431 | static void cxt5066_olpc_unsol_event(struct hda_codec *codec, unsigned int res) |
| 2437 | { | 2432 | { |
| 2438 | snd_printdd("CXT5066_hp_laptop: unsol event %x (%x)\n", res, res >> 26); | 2433 | struct conexant_spec *spec = codec->spec; |
| 2434 | snd_printdd("CXT5066: unsol event %x (%x)\n", res, res >> 26); | ||
| 2439 | switch (res >> 26) { | 2435 | switch (res >> 26) { |
| 2440 | case CONEXANT_HP_EVENT: | 2436 | case CONEXANT_HP_EVENT: |
| 2441 | cxt5066_hp_automute(codec); | 2437 | cxt5066_hp_automute(codec); |
| 2442 | break; | 2438 | break; |
| 2443 | case CONEXANT_MIC_EVENT: | 2439 | case CONEXANT_MIC_EVENT: |
| 2444 | cxt5066_hp_laptop_automic(codec); | 2440 | /* ignore mic events in DC mode; we're always using the jack */ |
| 2441 | if (!spec->dc_enable) | ||
| 2442 | cxt5066_olpc_automic(codec); | ||
| 2445 | break; | 2443 | break; |
| 2446 | } | 2444 | } |
| 2447 | } | 2445 | } |
| 2448 | 2446 | ||
| 2449 | /* unsolicited event for jack sensing */ | 2447 | /* unsolicited event for jack sensing */ |
| 2450 | static void cxt5066_thinkpad_event(struct hda_codec *codec, unsigned int res) | 2448 | static void cxt5066_unsol_event(struct hda_codec *codec, unsigned int res) |
| 2451 | { | 2449 | { |
| 2452 | snd_printdd("CXT5066_thinkpad: unsol event %x (%x)\n", res, res >> 26); | 2450 | snd_printdd("CXT5066: unsol event %x (%x)\n", res, res >> 26); |
| 2453 | switch (res >> 26) { | 2451 | switch (res >> 26) { |
| 2454 | case CONEXANT_HP_EVENT: | 2452 | case CONEXANT_HP_EVENT: |
| 2455 | cxt5066_hp_automute(codec); | 2453 | cxt5066_hp_automute(codec); |
| 2456 | break; | 2454 | break; |
| 2457 | case CONEXANT_MIC_EVENT: | 2455 | case CONEXANT_MIC_EVENT: |
| 2458 | cxt5066_thinkpad_automic(codec); | 2456 | cxt5066_automic(codec); |
| 2459 | break; | 2457 | break; |
| 2460 | } | 2458 | } |
| 2461 | } | 2459 | } |
| 2462 | 2460 | ||
| 2461 | |||
| 2463 | static const struct hda_input_mux cxt5066_analog_mic_boost = { | 2462 | static const struct hda_input_mux cxt5066_analog_mic_boost = { |
| 2464 | .num_items = 5, | 2463 | .num_items = 5, |
| 2465 | .items = { | 2464 | .items = { |
| @@ -2633,6 +2632,27 @@ static void cxt5066_olpc_capture_cleanup(struct hda_codec *codec) | |||
| 2633 | spec->recording = 0; | 2632 | spec->recording = 0; |
| 2634 | } | 2633 | } |
| 2635 | 2634 | ||
| 2635 | static void conexant_check_dig_outs(struct hda_codec *codec, | ||
| 2636 | hda_nid_t *dig_pins, | ||
| 2637 | int num_pins) | ||
| 2638 | { | ||
| 2639 | struct conexant_spec *spec = codec->spec; | ||
| 2640 | hda_nid_t *nid_loc = &spec->multiout.dig_out_nid; | ||
| 2641 | int i; | ||
| 2642 | |||
| 2643 | for (i = 0; i < num_pins; i++, dig_pins++) { | ||
| 2644 | unsigned int cfg = snd_hda_codec_get_pincfg(codec, *dig_pins); | ||
| 2645 | if (get_defcfg_connect(cfg) == AC_JACK_PORT_NONE) | ||
| 2646 | continue; | ||
| 2647 | if (snd_hda_get_connections(codec, *dig_pins, nid_loc, 1) != 1) | ||
| 2648 | continue; | ||
| 2649 | if (spec->slave_dig_outs[0]) | ||
| 2650 | nid_loc++; | ||
| 2651 | else | ||
| 2652 | nid_loc = spec->slave_dig_outs; | ||
| 2653 | } | ||
| 2654 | } | ||
| 2655 | |||
| 2636 | static struct hda_input_mux cxt5066_capture_source = { | 2656 | static struct hda_input_mux cxt5066_capture_source = { |
| 2637 | .num_items = 4, | 2657 | .num_items = 4, |
| 2638 | .items = { | 2658 | .items = { |
| @@ -3039,20 +3059,11 @@ static struct hda_verb cxt5066_init_verbs_hp_laptop[] = { | |||
| 3039 | /* initialize jack-sensing, too */ | 3059 | /* initialize jack-sensing, too */ |
| 3040 | static int cxt5066_init(struct hda_codec *codec) | 3060 | static int cxt5066_init(struct hda_codec *codec) |
| 3041 | { | 3061 | { |
| 3042 | struct conexant_spec *spec = codec->spec; | ||
| 3043 | |||
| 3044 | snd_printdd("CXT5066: init\n"); | 3062 | snd_printdd("CXT5066: init\n"); |
| 3045 | conexant_init(codec); | 3063 | conexant_init(codec); |
| 3046 | if (codec->patch_ops.unsol_event) { | 3064 | if (codec->patch_ops.unsol_event) { |
| 3047 | cxt5066_hp_automute(codec); | 3065 | cxt5066_hp_automute(codec); |
| 3048 | if (spec->dell_vostro) | 3066 | cxt5066_automic(codec); |
| 3049 | cxt5066_vostro_automic(codec); | ||
| 3050 | else if (spec->ideapad) | ||
| 3051 | cxt5066_ideapad_automic(codec); | ||
| 3052 | else if (spec->thinkpad) | ||
| 3053 | cxt5066_thinkpad_automic(codec); | ||
| 3054 | else if (spec->hp_laptop) | ||
| 3055 | cxt5066_hp_laptop_automic(codec); | ||
| 3056 | } | 3067 | } |
| 3057 | cxt5066_set_mic_boost(codec); | 3068 | cxt5066_set_mic_boost(codec); |
| 3058 | return 0; | 3069 | return 0; |
| @@ -3080,6 +3091,7 @@ enum { | |||
| 3080 | CXT5066_DELL_VOSTRO, /* Dell Vostro 1015i */ | 3091 | CXT5066_DELL_VOSTRO, /* Dell Vostro 1015i */ |
| 3081 | CXT5066_IDEAPAD, /* Lenovo IdeaPad U150 */ | 3092 | CXT5066_IDEAPAD, /* Lenovo IdeaPad U150 */ |
| 3082 | CXT5066_THINKPAD, /* Lenovo ThinkPad T410s, others? */ | 3093 | CXT5066_THINKPAD, /* Lenovo ThinkPad T410s, others? */ |
| 3094 | CXT5066_ASUS, /* Asus K52JU, Lenovo G560 - Int mic at 0x1a and Ext mic at 0x1b */ | ||
| 3083 | CXT5066_HP_LAPTOP, /* HP Laptop */ | 3095 | CXT5066_HP_LAPTOP, /* HP Laptop */ |
| 3084 | CXT5066_MODELS | 3096 | CXT5066_MODELS |
| 3085 | }; | 3097 | }; |
| @@ -3091,6 +3103,7 @@ static const char * const cxt5066_models[CXT5066_MODELS] = { | |||
| 3091 | [CXT5066_DELL_VOSTRO] = "dell-vostro", | 3103 | [CXT5066_DELL_VOSTRO] = "dell-vostro", |
| 3092 | [CXT5066_IDEAPAD] = "ideapad", | 3104 | [CXT5066_IDEAPAD] = "ideapad", |
| 3093 | [CXT5066_THINKPAD] = "thinkpad", | 3105 | [CXT5066_THINKPAD] = "thinkpad", |
| 3106 | [CXT5066_ASUS] = "asus", | ||
| 3094 | [CXT5066_HP_LAPTOP] = "hp-laptop", | 3107 | [CXT5066_HP_LAPTOP] = "hp-laptop", |
| 3095 | }; | 3108 | }; |
| 3096 | 3109 | ||
| @@ -3102,7 +3115,9 @@ static struct snd_pci_quirk cxt5066_cfg_tbl[] = { | |||
| 3102 | SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTRO), | 3115 | SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTRO), |
| 3103 | SND_PCI_QUIRK(0x1028, 0x0408, "Dell Inspiron One 19T", CXT5066_IDEAPAD), | 3116 | SND_PCI_QUIRK(0x1028, 0x0408, "Dell Inspiron One 19T", CXT5066_IDEAPAD), |
| 3104 | SND_PCI_QUIRK(0x103c, 0x360b, "HP G60", CXT5066_HP_LAPTOP), | 3117 | SND_PCI_QUIRK(0x103c, 0x360b, "HP G60", CXT5066_HP_LAPTOP), |
| 3105 | SND_PCI_QUIRK(0x1043, 0x13f3, "Asus A52J", CXT5066_HP_LAPTOP), | 3118 | SND_PCI_QUIRK(0x1043, 0x13f3, "Asus A52J", CXT5066_ASUS), |
| 3119 | SND_PCI_QUIRK(0x1043, 0x1643, "Asus K52JU", CXT5066_ASUS), | ||
| 3120 | SND_PCI_QUIRK(0x1043, 0x1993, "Asus U50F", CXT5066_ASUS), | ||
| 3106 | SND_PCI_QUIRK(0x1179, 0xff1e, "Toshiba Satellite C650D", CXT5066_IDEAPAD), | 3121 | SND_PCI_QUIRK(0x1179, 0xff1e, "Toshiba Satellite C650D", CXT5066_IDEAPAD), |
| 3107 | SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba Satellite P500-PSPGSC-01800T", CXT5066_OLPC_XO_1_5), | 3122 | SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba Satellite P500-PSPGSC-01800T", CXT5066_OLPC_XO_1_5), |
| 3108 | SND_PCI_QUIRK(0x1179, 0xffe0, "Toshiba Satellite Pro T130-15F", CXT5066_OLPC_XO_1_5), | 3123 | SND_PCI_QUIRK(0x1179, 0xffe0, "Toshiba Satellite Pro T130-15F", CXT5066_OLPC_XO_1_5), |
| @@ -3111,7 +3126,9 @@ static struct snd_pci_quirk cxt5066_cfg_tbl[] = { | |||
| 3111 | SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT5066_OLPC_XO_1_5), | 3126 | SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT5066_OLPC_XO_1_5), |
| 3112 | SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo T400s", CXT5066_THINKPAD), | 3127 | SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo T400s", CXT5066_THINKPAD), |
| 3113 | SND_PCI_QUIRK(0x17aa, 0x21c5, "Thinkpad Edge 13", CXT5066_THINKPAD), | 3128 | SND_PCI_QUIRK(0x17aa, 0x21c5, "Thinkpad Edge 13", CXT5066_THINKPAD), |
| 3129 | SND_PCI_QUIRK(0x17aa, 0x21c6, "Thinkpad Edge 13", CXT5066_ASUS), | ||
| 3114 | SND_PCI_QUIRK(0x17aa, 0x215e, "Lenovo Thinkpad", CXT5066_THINKPAD), | 3130 | SND_PCI_QUIRK(0x17aa, 0x215e, "Lenovo Thinkpad", CXT5066_THINKPAD), |
| 3131 | SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo G560", CXT5066_ASUS), | ||
| 3115 | SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo", CXT5066_IDEAPAD), /* Fallback for Lenovos without dock mic */ | 3132 | SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo", CXT5066_IDEAPAD), /* Fallback for Lenovos without dock mic */ |
| 3116 | {} | 3133 | {} |
| 3117 | }; | 3134 | }; |
| @@ -3133,7 +3150,8 @@ static int patch_cxt5066(struct hda_codec *codec) | |||
| 3133 | spec->multiout.max_channels = 2; | 3150 | spec->multiout.max_channels = 2; |
| 3134 | spec->multiout.num_dacs = ARRAY_SIZE(cxt5066_dac_nids); | 3151 | spec->multiout.num_dacs = ARRAY_SIZE(cxt5066_dac_nids); |
| 3135 | spec->multiout.dac_nids = cxt5066_dac_nids; | 3152 | spec->multiout.dac_nids = cxt5066_dac_nids; |
| 3136 | spec->multiout.dig_out_nid = CXT5066_SPDIF_OUT; | 3153 | conexant_check_dig_outs(codec, cxt5066_digout_pin_nids, |
| 3154 | ARRAY_SIZE(cxt5066_digout_pin_nids)); | ||
| 3137 | spec->num_adc_nids = 1; | 3155 | spec->num_adc_nids = 1; |
| 3138 | spec->adc_nids = cxt5066_adc_nids; | 3156 | spec->adc_nids = cxt5066_adc_nids; |
| 3139 | spec->capsrc_nids = cxt5066_capsrc_nids; | 3157 | spec->capsrc_nids = cxt5066_capsrc_nids; |
| @@ -3167,17 +3185,20 @@ static int patch_cxt5066(struct hda_codec *codec) | |||
| 3167 | spec->num_init_verbs++; | 3185 | spec->num_init_verbs++; |
| 3168 | spec->dell_automute = 1; | 3186 | spec->dell_automute = 1; |
| 3169 | break; | 3187 | break; |
| 3188 | case CXT5066_ASUS: | ||
| 3170 | case CXT5066_HP_LAPTOP: | 3189 | case CXT5066_HP_LAPTOP: |
| 3171 | codec->patch_ops.init = cxt5066_init; | 3190 | codec->patch_ops.init = cxt5066_init; |
| 3172 | codec->patch_ops.unsol_event = cxt5066_hp_laptop_event; | 3191 | codec->patch_ops.unsol_event = cxt5066_unsol_event; |
| 3173 | spec->init_verbs[spec->num_init_verbs] = | 3192 | spec->init_verbs[spec->num_init_verbs] = |
| 3174 | cxt5066_init_verbs_hp_laptop; | 3193 | cxt5066_init_verbs_hp_laptop; |
| 3175 | spec->num_init_verbs++; | 3194 | spec->num_init_verbs++; |
| 3176 | spec->hp_laptop = 1; | 3195 | spec->hp_laptop = board_config == CXT5066_HP_LAPTOP; |
| 3196 | spec->asus = board_config == CXT5066_ASUS; | ||
| 3177 | spec->mixers[spec->num_mixers++] = cxt5066_mixer_master; | 3197 | spec->mixers[spec->num_mixers++] = cxt5066_mixer_master; |
| 3178 | spec->mixers[spec->num_mixers++] = cxt5066_mixers; | 3198 | spec->mixers[spec->num_mixers++] = cxt5066_mixers; |
| 3179 | /* no S/PDIF out */ | 3199 | /* no S/PDIF out */ |
| 3180 | spec->multiout.dig_out_nid = 0; | 3200 | if (board_config == CXT5066_HP_LAPTOP) |
| 3201 | spec->multiout.dig_out_nid = 0; | ||
| 3181 | /* input source automatically selected */ | 3202 | /* input source automatically selected */ |
| 3182 | spec->input_mux = NULL; | 3203 | spec->input_mux = NULL; |
| 3183 | spec->port_d_mode = 0; | 3204 | spec->port_d_mode = 0; |
| @@ -3207,7 +3228,7 @@ static int patch_cxt5066(struct hda_codec *codec) | |||
| 3207 | break; | 3228 | break; |
| 3208 | case CXT5066_DELL_VOSTRO: | 3229 | case CXT5066_DELL_VOSTRO: |
| 3209 | codec->patch_ops.init = cxt5066_init; | 3230 | codec->patch_ops.init = cxt5066_init; |
| 3210 | codec->patch_ops.unsol_event = cxt5066_vostro_event; | 3231 | codec->patch_ops.unsol_event = cxt5066_unsol_event; |
| 3211 | spec->init_verbs[0] = cxt5066_init_verbs_vostro; | 3232 | spec->init_verbs[0] = cxt5066_init_verbs_vostro; |
| 3212 | spec->mixers[spec->num_mixers++] = cxt5066_mixer_master_olpc; | 3233 | spec->mixers[spec->num_mixers++] = cxt5066_mixer_master_olpc; |
| 3213 | spec->mixers[spec->num_mixers++] = cxt5066_mixers; | 3234 | spec->mixers[spec->num_mixers++] = cxt5066_mixers; |
| @@ -3224,7 +3245,7 @@ static int patch_cxt5066(struct hda_codec *codec) | |||
| 3224 | break; | 3245 | break; |
| 3225 | case CXT5066_IDEAPAD: | 3246 | case CXT5066_IDEAPAD: |
| 3226 | codec->patch_ops.init = cxt5066_init; | 3247 | codec->patch_ops.init = cxt5066_init; |
| 3227 | codec->patch_ops.unsol_event = cxt5066_ideapad_event; | 3248 | codec->patch_ops.unsol_event = cxt5066_unsol_event; |
| 3228 | spec->mixers[spec->num_mixers++] = cxt5066_mixer_master; | 3249 | spec->mixers[spec->num_mixers++] = cxt5066_mixer_master; |
| 3229 | spec->mixers[spec->num_mixers++] = cxt5066_mixers; | 3250 | spec->mixers[spec->num_mixers++] = cxt5066_mixers; |
| 3230 | spec->init_verbs[0] = cxt5066_init_verbs_ideapad; | 3251 | spec->init_verbs[0] = cxt5066_init_verbs_ideapad; |
| @@ -3240,7 +3261,7 @@ static int patch_cxt5066(struct hda_codec *codec) | |||
| 3240 | break; | 3261 | break; |
| 3241 | case CXT5066_THINKPAD: | 3262 | case CXT5066_THINKPAD: |
| 3242 | codec->patch_ops.init = cxt5066_init; | 3263 | codec->patch_ops.init = cxt5066_init; |
| 3243 | codec->patch_ops.unsol_event = cxt5066_thinkpad_event; | 3264 | codec->patch_ops.unsol_event = cxt5066_unsol_event; |
| 3244 | spec->mixers[spec->num_mixers++] = cxt5066_mixer_master; | 3265 | spec->mixers[spec->num_mixers++] = cxt5066_mixer_master; |
| 3245 | spec->mixers[spec->num_mixers++] = cxt5066_mixers; | 3266 | spec->mixers[spec->num_mixers++] = cxt5066_mixers; |
| 3246 | spec->init_verbs[0] = cxt5066_init_verbs_thinkpad; | 3267 | spec->init_verbs[0] = cxt5066_init_verbs_thinkpad; |
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c index 2d5b83fa8d24..a58767736727 100644 --- a/sound/pci/hda/patch_hdmi.c +++ b/sound/pci/hda/patch_hdmi.c | |||
| @@ -642,6 +642,7 @@ static void hdmi_setup_audio_infoframe(struct hda_codec *codec, hda_nid_t nid, | |||
| 642 | hdmi_ai->ver = 0x01; | 642 | hdmi_ai->ver = 0x01; |
| 643 | hdmi_ai->len = 0x0a; | 643 | hdmi_ai->len = 0x0a; |
| 644 | hdmi_ai->CC02_CT47 = channels - 1; | 644 | hdmi_ai->CC02_CT47 = channels - 1; |
| 645 | hdmi_ai->CA = ca; | ||
| 645 | hdmi_checksum_audio_infoframe(hdmi_ai); | 646 | hdmi_checksum_audio_infoframe(hdmi_ai); |
| 646 | } else if (spec->sink_eld[i].conn_type == 1) { /* DisplayPort */ | 647 | } else if (spec->sink_eld[i].conn_type == 1) { /* DisplayPort */ |
| 647 | struct dp_audio_infoframe *dp_ai; | 648 | struct dp_audio_infoframe *dp_ai; |
| @@ -651,6 +652,7 @@ static void hdmi_setup_audio_infoframe(struct hda_codec *codec, hda_nid_t nid, | |||
| 651 | dp_ai->len = 0x1b; | 652 | dp_ai->len = 0x1b; |
| 652 | dp_ai->ver = 0x11 << 2; | 653 | dp_ai->ver = 0x11 << 2; |
| 653 | dp_ai->CC02_CT47 = channels - 1; | 654 | dp_ai->CC02_CT47 = channels - 1; |
| 655 | dp_ai->CA = ca; | ||
| 654 | } else { | 656 | } else { |
| 655 | snd_printd("HDMI: unknown connection type at pin %d\n", | 657 | snd_printd("HDMI: unknown connection type at pin %d\n", |
| 656 | pin_nid); | 658 | pin_nid); |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 269dbff70b92..3328a259a242 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -1721,7 +1721,9 @@ static void alc_apply_fixup(struct hda_codec *codec, int action) | |||
| 1721 | { | 1721 | { |
| 1722 | struct alc_spec *spec = codec->spec; | 1722 | struct alc_spec *spec = codec->spec; |
| 1723 | int id = spec->fixup_id; | 1723 | int id = spec->fixup_id; |
| 1724 | #ifdef CONFIG_SND_DEBUG_VERBOSE | ||
| 1724 | const char *modelname = spec->fixup_name; | 1725 | const char *modelname = spec->fixup_name; |
| 1726 | #endif | ||
| 1725 | int depth = 0; | 1727 | int depth = 0; |
| 1726 | 1728 | ||
| 1727 | if (!spec->fixup_list) | 1729 | if (!spec->fixup_list) |
| @@ -2288,6 +2290,29 @@ static struct snd_kcontrol_new alc888_base_mixer[] = { | |||
| 2288 | { } /* end */ | 2290 | { } /* end */ |
| 2289 | }; | 2291 | }; |
| 2290 | 2292 | ||
| 2293 | static struct snd_kcontrol_new alc888_acer_aspire_4930g_mixer[] = { | ||
| 2294 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), | ||
| 2295 | HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), | ||
| 2296 | HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), | ||
| 2297 | HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), | ||
| 2298 | HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0f, 2, 0x0, | ||
| 2299 | HDA_OUTPUT), | ||
| 2300 | HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0f, 2, 2, HDA_INPUT), | ||
| 2301 | HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0f, 1, 0x0, HDA_OUTPUT), | ||
| 2302 | HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0f, 1, 2, HDA_INPUT), | ||
| 2303 | HDA_CODEC_VOLUME("Side Playback Volume", 0x0e, 0x0, HDA_OUTPUT), | ||
| 2304 | HDA_BIND_MUTE("Side Playback Switch", 0x0e, 2, HDA_INPUT), | ||
| 2305 | HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), | ||
| 2306 | HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), | ||
| 2307 | HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), | ||
| 2308 | HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), | ||
| 2309 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), | ||
| 2310 | HDA_CODEC_VOLUME("Mic Boost Volume", 0x18, 0, HDA_INPUT), | ||
| 2311 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), | ||
| 2312 | { } /* end */ | ||
| 2313 | }; | ||
| 2314 | |||
| 2315 | |||
| 2291 | static struct snd_kcontrol_new alc889_acer_aspire_8930g_mixer[] = { | 2316 | static struct snd_kcontrol_new alc889_acer_aspire_8930g_mixer[] = { |
| 2292 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), | 2317 | HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), |
| 2293 | HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), | 2318 | HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), |
| @@ -10357,7 +10382,7 @@ static struct alc_config_preset alc882_presets[] = { | |||
| 10357 | .init_hook = alc_automute_amp, | 10382 | .init_hook = alc_automute_amp, |
| 10358 | }, | 10383 | }, |
| 10359 | [ALC888_ACER_ASPIRE_4930G] = { | 10384 | [ALC888_ACER_ASPIRE_4930G] = { |
| 10360 | .mixers = { alc888_base_mixer, | 10385 | .mixers = { alc888_acer_aspire_4930g_mixer, |
| 10361 | alc883_chmode_mixer }, | 10386 | alc883_chmode_mixer }, |
| 10362 | .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs, | 10387 | .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs, |
| 10363 | alc888_acer_aspire_4930g_verbs }, | 10388 | alc888_acer_aspire_4930g_verbs }, |
| @@ -10930,9 +10955,6 @@ static int alc_auto_add_mic_boost(struct hda_codec *codec) | |||
| 10930 | return 0; | 10955 | return 0; |
| 10931 | } | 10956 | } |
| 10932 | 10957 | ||
| 10933 | static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec, | ||
| 10934 | const struct auto_pin_cfg *cfg); | ||
| 10935 | |||
| 10936 | /* almost identical with ALC880 parser... */ | 10958 | /* almost identical with ALC880 parser... */ |
| 10937 | static int alc882_parse_auto_config(struct hda_codec *codec) | 10959 | static int alc882_parse_auto_config(struct hda_codec *codec) |
| 10938 | { | 10960 | { |
| @@ -10950,10 +10972,7 @@ static int alc882_parse_auto_config(struct hda_codec *codec) | |||
| 10950 | err = alc880_auto_fill_dac_nids(spec, &spec->autocfg); | 10972 | err = alc880_auto_fill_dac_nids(spec, &spec->autocfg); |
| 10951 | if (err < 0) | 10973 | if (err < 0) |
| 10952 | return err; | 10974 | return err; |
| 10953 | if (codec->vendor_id == 0x10ec0887) | 10975 | err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg); |
| 10954 | err = alc861vd_auto_create_multi_out_ctls(spec, &spec->autocfg); | ||
| 10955 | else | ||
| 10956 | err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg); | ||
| 10957 | if (err < 0) | 10976 | if (err < 0) |
| 10958 | return err; | 10977 | return err; |
| 10959 | err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0], | 10978 | err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0], |
| @@ -12635,6 +12654,8 @@ static struct snd_pci_quirk alc262_cfg_tbl[] = { | |||
| 12635 | ALC262_HP_BPC), | 12654 | ALC262_HP_BPC), |
| 12636 | SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1300, "HP xw series", | 12655 | SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1300, "HP xw series", |
| 12637 | ALC262_HP_BPC), | 12656 | ALC262_HP_BPC), |
| 12657 | SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1500, "HP z series", | ||
| 12658 | ALC262_HP_BPC), | ||
| 12638 | SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1700, "HP xw series", | 12659 | SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1700, "HP xw series", |
| 12639 | ALC262_HP_BPC), | 12660 | ALC262_HP_BPC), |
| 12640 | SND_PCI_QUIRK(0x103c, 0x2800, "HP D7000", ALC262_HP_BPC_D7000_WL), | 12661 | SND_PCI_QUIRK(0x103c, 0x2800, "HP D7000", ALC262_HP_BPC_D7000_WL), |
| @@ -14956,8 +14977,11 @@ static struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
| 14956 | SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ), | 14977 | SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ), |
| 14957 | SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO), | 14978 | SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO), |
| 14958 | SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z), | 14979 | SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z), |
| 14959 | SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE), | ||
| 14960 | SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE), | 14980 | SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE), |
| 14981 | SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE), | ||
| 14982 | SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE), | ||
| 14983 | SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE), | ||
| 14984 | SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE), | ||
| 14961 | SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW), | 14985 | SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW), |
| 14962 | SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD), | 14986 | SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD), |
| 14963 | {} | 14987 | {} |
| @@ -17134,7 +17158,7 @@ static void alc861vd_auto_init_analog_input(struct hda_codec *codec) | |||
| 17134 | #define alc861vd_idx_to_mixer_switch(nid) ((nid) + 0x0c) | 17158 | #define alc861vd_idx_to_mixer_switch(nid) ((nid) + 0x0c) |
| 17135 | 17159 | ||
| 17136 | /* add playback controls from the parsed DAC table */ | 17160 | /* add playback controls from the parsed DAC table */ |
| 17137 | /* Based on ALC880 version. But ALC861VD and ALC887 have separate, | 17161 | /* Based on ALC880 version. But ALC861VD has separate, |
| 17138 | * different NIDs for mute/unmute switch and volume control */ | 17162 | * different NIDs for mute/unmute switch and volume control */ |
| 17139 | static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec, | 17163 | static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec, |
| 17140 | const struct auto_pin_cfg *cfg) | 17164 | const struct auto_pin_cfg *cfg) |
| @@ -18801,6 +18825,7 @@ static struct snd_pci_quirk alc662_cfg_tbl[] = { | |||
| 18801 | ALC662_3ST_6ch_DIG), | 18825 | ALC662_3ST_6ch_DIG), |
| 18802 | SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x", | 18826 | SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x", |
| 18803 | ALC663_ASUS_H13), | 18827 | ALC663_ASUS_H13), |
| 18828 | SND_PCI_QUIRK(0x1991, 0x5628, "Ordissimo EVE", ALC662_LENOVO_101E), | ||
| 18804 | {} | 18829 | {} |
| 18805 | }; | 18830 | }; |
| 18806 | 18831 | ||
| @@ -19461,6 +19486,7 @@ enum { | |||
| 19461 | ALC662_FIXUP_ASPIRE, | 19486 | ALC662_FIXUP_ASPIRE, |
| 19462 | ALC662_FIXUP_IDEAPAD, | 19487 | ALC662_FIXUP_IDEAPAD, |
| 19463 | ALC272_FIXUP_MARIO, | 19488 | ALC272_FIXUP_MARIO, |
| 19489 | ALC662_FIXUP_CZC_P10T, | ||
| 19464 | }; | 19490 | }; |
| 19465 | 19491 | ||
| 19466 | static const struct alc_fixup alc662_fixups[] = { | 19492 | static const struct alc_fixup alc662_fixups[] = { |
| @@ -19481,14 +19507,23 @@ static const struct alc_fixup alc662_fixups[] = { | |||
| 19481 | [ALC272_FIXUP_MARIO] = { | 19507 | [ALC272_FIXUP_MARIO] = { |
| 19482 | .type = ALC_FIXUP_FUNC, | 19508 | .type = ALC_FIXUP_FUNC, |
| 19483 | .v.func = alc272_fixup_mario, | 19509 | .v.func = alc272_fixup_mario, |
| 19484 | } | 19510 | }, |
| 19511 | [ALC662_FIXUP_CZC_P10T] = { | ||
| 19512 | .type = ALC_FIXUP_VERBS, | ||
| 19513 | .v.verbs = (const struct hda_verb[]) { | ||
| 19514 | {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0}, | ||
| 19515 | {} | ||
| 19516 | } | ||
| 19517 | }, | ||
| 19485 | }; | 19518 | }; |
| 19486 | 19519 | ||
| 19487 | static struct snd_pci_quirk alc662_fixup_tbl[] = { | 19520 | static struct snd_pci_quirk alc662_fixup_tbl[] = { |
| 19521 | SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE), | ||
| 19488 | SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE), | 19522 | SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE), |
| 19489 | SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD), | 19523 | SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD), |
| 19490 | SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD), | 19524 | SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD), |
| 19491 | SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD), | 19525 | SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD), |
| 19526 | SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T), | ||
| 19492 | {} | 19527 | {} |
| 19493 | }; | 19528 | }; |
| 19494 | 19529 | ||
diff --git a/sound/pci/ice1712/delta.c b/sound/pci/ice1712/delta.c index 7b62de089fee..20c6b079d0df 100644 --- a/sound/pci/ice1712/delta.c +++ b/sound/pci/ice1712/delta.c | |||
| @@ -580,6 +580,7 @@ static int __devinit snd_ice1712_delta_init(struct snd_ice1712 *ice) | |||
| 580 | { | 580 | { |
| 581 | int err; | 581 | int err; |
| 582 | struct snd_akm4xxx *ak; | 582 | struct snd_akm4xxx *ak; |
| 583 | unsigned char tmp; | ||
| 583 | 584 | ||
| 584 | if (ice->eeprom.subvendor == ICE1712_SUBDEVICE_DELTA1010 && | 585 | if (ice->eeprom.subvendor == ICE1712_SUBDEVICE_DELTA1010 && |
| 585 | ice->eeprom.gpiodir == 0x7b) | 586 | ice->eeprom.gpiodir == 0x7b) |
| @@ -622,6 +623,12 @@ static int __devinit snd_ice1712_delta_init(struct snd_ice1712 *ice) | |||
| 622 | break; | 623 | break; |
| 623 | } | 624 | } |
| 624 | 625 | ||
| 626 | /* initialize the SPI clock to high */ | ||
| 627 | tmp = snd_ice1712_read(ice, ICE1712_IREG_GPIO_DATA); | ||
| 628 | tmp |= ICE1712_DELTA_AP_CCLK; | ||
| 629 | snd_ice1712_write(ice, ICE1712_IREG_GPIO_DATA, tmp); | ||
| 630 | udelay(5); | ||
| 631 | |||
| 625 | /* initialize spdif */ | 632 | /* initialize spdif */ |
| 626 | switch (ice->eeprom.subvendor) { | 633 | switch (ice->eeprom.subvendor) { |
| 627 | case ICE1712_SUBDEVICE_AUDIOPHILE: | 634 | case ICE1712_SUBDEVICE_AUDIOPHILE: |
diff --git a/sound/pci/oxygen/oxygen.h b/sound/pci/oxygen/oxygen.h index c2ae63d17cd2..f53897a708b4 100644 --- a/sound/pci/oxygen/oxygen.h +++ b/sound/pci/oxygen/oxygen.h | |||
| @@ -92,6 +92,8 @@ struct oxygen_model { | |||
| 92 | void (*update_dac_volume)(struct oxygen *chip); | 92 | void (*update_dac_volume)(struct oxygen *chip); |
| 93 | void (*update_dac_mute)(struct oxygen *chip); | 93 | void (*update_dac_mute)(struct oxygen *chip); |
| 94 | void (*update_center_lfe_mix)(struct oxygen *chip, bool mixed); | 94 | void (*update_center_lfe_mix)(struct oxygen *chip, bool mixed); |
| 95 | unsigned int (*adjust_dac_routing)(struct oxygen *chip, | ||
| 96 | unsigned int play_routing); | ||
| 95 | void (*gpio_changed)(struct oxygen *chip); | 97 | void (*gpio_changed)(struct oxygen *chip); |
| 96 | void (*uart_input)(struct oxygen *chip); | 98 | void (*uart_input)(struct oxygen *chip); |
| 97 | void (*ac97_switch)(struct oxygen *chip, | 99 | void (*ac97_switch)(struct oxygen *chip, |
diff --git a/sound/pci/oxygen/oxygen_mixer.c b/sound/pci/oxygen/oxygen_mixer.c index 9bff14d5895d..26c7e8bcb229 100644 --- a/sound/pci/oxygen/oxygen_mixer.c +++ b/sound/pci/oxygen/oxygen_mixer.c | |||
| @@ -180,6 +180,8 @@ void oxygen_update_dac_routing(struct oxygen *chip) | |||
| 180 | (1 << OXYGEN_PLAY_DAC1_SOURCE_SHIFT) | | 180 | (1 << OXYGEN_PLAY_DAC1_SOURCE_SHIFT) | |
| 181 | (2 << OXYGEN_PLAY_DAC2_SOURCE_SHIFT) | | 181 | (2 << OXYGEN_PLAY_DAC2_SOURCE_SHIFT) | |
| 182 | (3 << OXYGEN_PLAY_DAC3_SOURCE_SHIFT); | 182 | (3 << OXYGEN_PLAY_DAC3_SOURCE_SHIFT); |
| 183 | if (chip->model.adjust_dac_routing) | ||
| 184 | reg_value = chip->model.adjust_dac_routing(chip, reg_value); | ||
| 183 | oxygen_write16_masked(chip, OXYGEN_PLAY_ROUTING, reg_value, | 185 | oxygen_write16_masked(chip, OXYGEN_PLAY_ROUTING, reg_value, |
| 184 | OXYGEN_PLAY_DAC0_SOURCE_MASK | | 186 | OXYGEN_PLAY_DAC0_SOURCE_MASK | |
| 185 | OXYGEN_PLAY_DAC1_SOURCE_MASK | | 187 | OXYGEN_PLAY_DAC1_SOURCE_MASK | |
diff --git a/sound/pci/oxygen/xonar_cs43xx.c b/sound/pci/oxygen/xonar_cs43xx.c index 9f72d424969c..252719101c42 100644 --- a/sound/pci/oxygen/xonar_cs43xx.c +++ b/sound/pci/oxygen/xonar_cs43xx.c | |||
| @@ -392,7 +392,7 @@ static void dump_d1_registers(struct oxygen *chip, | |||
| 392 | unsigned int i; | 392 | unsigned int i; |
| 393 | 393 | ||
| 394 | snd_iprintf(buffer, "\nCS4398: 7?"); | 394 | snd_iprintf(buffer, "\nCS4398: 7?"); |
| 395 | for (i = 2; i <= 8; ++i) | 395 | for (i = 2; i < 8; ++i) |
| 396 | snd_iprintf(buffer, " %02x", data->cs4398_regs[i]); | 396 | snd_iprintf(buffer, " %02x", data->cs4398_regs[i]); |
| 397 | snd_iprintf(buffer, "\n"); | 397 | snd_iprintf(buffer, "\n"); |
| 398 | dump_cs4362a_registers(data, buffer); | 398 | dump_cs4362a_registers(data, buffer); |
diff --git a/sound/pci/oxygen/xonar_dg.c b/sound/pci/oxygen/xonar_dg.c index e1fa602eba79..bc6eb58be380 100644 --- a/sound/pci/oxygen/xonar_dg.c +++ b/sound/pci/oxygen/xonar_dg.c | |||
| @@ -24,6 +24,11 @@ | |||
| 24 | * | 24 | * |
| 25 | * SPI 0 -> CS4245 | 25 | * SPI 0 -> CS4245 |
| 26 | * | 26 | * |
| 27 | * I²S 1 -> CS4245 | ||
| 28 | * I²S 2 -> CS4361 (center/LFE) | ||
| 29 | * I²S 3 -> CS4361 (surround) | ||
| 30 | * I²S 4 -> CS4361 (front) | ||
| 31 | * | ||
| 27 | * GPIO 3 <- ? | 32 | * GPIO 3 <- ? |
| 28 | * GPIO 4 <- headphone detect | 33 | * GPIO 4 <- headphone detect |
| 29 | * GPIO 5 -> route input jack to line-in (0) or mic-in (1) | 34 | * GPIO 5 -> route input jack to line-in (0) or mic-in (1) |
| @@ -36,6 +41,7 @@ | |||
| 36 | * input 1 <- aux | 41 | * input 1 <- aux |
| 37 | * input 2 <- front mic | 42 | * input 2 <- front mic |
| 38 | * input 4 <- line/mic | 43 | * input 4 <- line/mic |
| 44 | * DAC out -> headphones | ||
| 39 | * aux out -> front panel headphones | 45 | * aux out -> front panel headphones |
| 40 | */ | 46 | */ |
| 41 | 47 | ||
| @@ -207,6 +213,35 @@ static void set_cs4245_adc_params(struct oxygen *chip, | |||
| 207 | cs4245_write_cached(chip, CS4245_ADC_CTRL, value); | 213 | cs4245_write_cached(chip, CS4245_ADC_CTRL, value); |
| 208 | } | 214 | } |
| 209 | 215 | ||
| 216 | static inline unsigned int shift_bits(unsigned int value, | ||
| 217 | unsigned int shift_from, | ||
| 218 | unsigned int shift_to, | ||
| 219 | unsigned int mask) | ||
| 220 | { | ||
| 221 | if (shift_from < shift_to) | ||
| 222 | return (value << (shift_to - shift_from)) & mask; | ||
| 223 | else | ||
| 224 | return (value >> (shift_from - shift_to)) & mask; | ||
| 225 | } | ||
| 226 | |||
| 227 | static unsigned int adjust_dg_dac_routing(struct oxygen *chip, | ||
| 228 | unsigned int play_routing) | ||
| 229 | { | ||
| 230 | return (play_routing & OXYGEN_PLAY_DAC0_SOURCE_MASK) | | ||
| 231 | shift_bits(play_routing, | ||
| 232 | OXYGEN_PLAY_DAC2_SOURCE_SHIFT, | ||
| 233 | OXYGEN_PLAY_DAC1_SOURCE_SHIFT, | ||
| 234 | OXYGEN_PLAY_DAC1_SOURCE_MASK) | | ||
| 235 | shift_bits(play_routing, | ||
| 236 | OXYGEN_PLAY_DAC1_SOURCE_SHIFT, | ||
| 237 | OXYGEN_PLAY_DAC2_SOURCE_SHIFT, | ||
| 238 | OXYGEN_PLAY_DAC2_SOURCE_MASK) | | ||
| 239 | shift_bits(play_routing, | ||
| 240 | OXYGEN_PLAY_DAC0_SOURCE_SHIFT, | ||
| 241 | OXYGEN_PLAY_DAC3_SOURCE_SHIFT, | ||
| 242 | OXYGEN_PLAY_DAC3_SOURCE_MASK); | ||
| 243 | } | ||
| 244 | |||
| 210 | static int output_switch_info(struct snd_kcontrol *ctl, | 245 | static int output_switch_info(struct snd_kcontrol *ctl, |
| 211 | struct snd_ctl_elem_info *info) | 246 | struct snd_ctl_elem_info *info) |
| 212 | { | 247 | { |
| @@ -557,6 +592,7 @@ struct oxygen_model model_xonar_dg = { | |||
| 557 | .resume = dg_resume, | 592 | .resume = dg_resume, |
| 558 | .set_dac_params = set_cs4245_dac_params, | 593 | .set_dac_params = set_cs4245_dac_params, |
| 559 | .set_adc_params = set_cs4245_adc_params, | 594 | .set_adc_params = set_cs4245_adc_params, |
| 595 | .adjust_dac_routing = adjust_dg_dac_routing, | ||
| 560 | .dump_registers = dump_cs4245_registers, | 596 | .dump_registers = dump_cs4245_registers, |
| 561 | .model_data_size = sizeof(struct dg), | 597 | .model_data_size = sizeof(struct dg), |
| 562 | .device_config = PLAYBACK_0_TO_I2S | | 598 | .device_config = PLAYBACK_0_TO_I2S | |
diff --git a/sound/pcmcia/pdaudiocf/pdaudiocf.h b/sound/pcmcia/pdaudiocf/pdaudiocf.h index bd26e092aead..6ce9ad700290 100644 --- a/sound/pcmcia/pdaudiocf/pdaudiocf.h +++ b/sound/pcmcia/pdaudiocf/pdaudiocf.h | |||
| @@ -22,7 +22,7 @@ | |||
| 22 | #define __PDAUDIOCF_H | 22 | #define __PDAUDIOCF_H |
| 23 | 23 | ||
| 24 | #include <sound/pcm.h> | 24 | #include <sound/pcm.h> |
| 25 | #include <asm/io.h> | 25 | #include <linux/io.h> |
| 26 | #include <linux/interrupt.h> | 26 | #include <linux/interrupt.h> |
| 27 | #include <pcmcia/cistpl.h> | 27 | #include <pcmcia/cistpl.h> |
| 28 | #include <pcmcia/ds.h> | 28 | #include <pcmcia/ds.h> |
diff --git a/sound/pcmcia/vx/vxp_ops.c b/sound/pcmcia/vx/vxp_ops.c index 989e04abb520..fe33e122e372 100644 --- a/sound/pcmcia/vx/vxp_ops.c +++ b/sound/pcmcia/vx/vxp_ops.c | |||
| @@ -23,8 +23,8 @@ | |||
| 23 | #include <linux/delay.h> | 23 | #include <linux/delay.h> |
| 24 | #include <linux/device.h> | 24 | #include <linux/device.h> |
| 25 | #include <linux/firmware.h> | 25 | #include <linux/firmware.h> |
| 26 | #include <linux/io.h> | ||
| 26 | #include <sound/core.h> | 27 | #include <sound/core.h> |
| 27 | #include <asm/io.h> | ||
| 28 | #include "vxpocket.h" | 28 | #include "vxpocket.h" |
| 29 | 29 | ||
| 30 | 30 | ||
diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index 7df89b3d7ded..85af6051b52d 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c | |||
| @@ -95,7 +95,7 @@ enum { | |||
| 95 | }; | 95 | }; |
| 96 | 96 | ||
| 97 | 97 | ||
| 98 | /*E-mu 0202(0404) eXtension Unit(XU) control*/ | 98 | /*E-mu 0202/0404/0204 eXtension Unit(XU) control*/ |
| 99 | enum { | 99 | enum { |
| 100 | USB_XU_CLOCK_RATE = 0xe301, | 100 | USB_XU_CLOCK_RATE = 0xe301, |
| 101 | USB_XU_CLOCK_SOURCE = 0xe302, | 101 | USB_XU_CLOCK_SOURCE = 0xe302, |
| @@ -1566,7 +1566,7 @@ static int build_audio_procunit(struct mixer_build *state, int unitid, void *raw | |||
| 1566 | cval->initialized = 1; | 1566 | cval->initialized = 1; |
| 1567 | } else { | 1567 | } else { |
| 1568 | if (type == USB_XU_CLOCK_RATE) { | 1568 | if (type == USB_XU_CLOCK_RATE) { |
| 1569 | /* E-Mu USB 0404/0202/TrackerPre | 1569 | /* E-Mu USB 0404/0202/TrackerPre/0204 |
| 1570 | * samplerate control quirk | 1570 | * samplerate control quirk |
| 1571 | */ | 1571 | */ |
| 1572 | cval->min = 0; | 1572 | cval->min = 0; |
diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h index 35999874d301..921a86fd9884 100644 --- a/sound/usb/quirks-table.h +++ b/sound/usb/quirks-table.h | |||
| @@ -79,6 +79,13 @@ | |||
| 79 | .idProduct = 0x3f0a, | 79 | .idProduct = 0x3f0a, |
| 80 | .bInterfaceClass = USB_CLASS_AUDIO, | 80 | .bInterfaceClass = USB_CLASS_AUDIO, |
| 81 | }, | 81 | }, |
| 82 | { | ||
| 83 | /* E-Mu 0204 USB */ | ||
| 84 | .match_flags = USB_DEVICE_ID_MATCH_DEVICE, | ||
| 85 | .idVendor = 0x041e, | ||
| 86 | .idProduct = 0x3f19, | ||
| 87 | .bInterfaceClass = USB_CLASS_AUDIO, | ||
| 88 | }, | ||
| 82 | 89 | ||
| 83 | /* | 90 | /* |
| 84 | * Logitech QuickCam: bDeviceClass is vendor-specific, so generic interface | 91 | * Logitech QuickCam: bDeviceClass is vendor-specific, so generic interface |
diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c index cf8bf088394b..e314cdb85003 100644 --- a/sound/usb/quirks.c +++ b/sound/usb/quirks.c | |||
| @@ -532,7 +532,7 @@ int snd_usb_is_big_endian_format(struct snd_usb_audio *chip, struct audioformat | |||
| 532 | } | 532 | } |
| 533 | 533 | ||
| 534 | /* | 534 | /* |
| 535 | * For E-Mu 0404USB/0202USB/TrackerPre sample rate should be set for device, | 535 | * For E-Mu 0404USB/0202USB/TrackerPre/0204 sample rate should be set for device, |
| 536 | * not for interface. | 536 | * not for interface. |
| 537 | */ | 537 | */ |
| 538 | 538 | ||
| @@ -589,6 +589,7 @@ void snd_usb_set_format_quirk(struct snd_usb_substream *subs, | |||
| 589 | case USB_ID(0x041e, 0x3f02): /* E-Mu 0202 USB */ | 589 | case USB_ID(0x041e, 0x3f02): /* E-Mu 0202 USB */ |
| 590 | case USB_ID(0x041e, 0x3f04): /* E-Mu 0404 USB */ | 590 | case USB_ID(0x041e, 0x3f04): /* E-Mu 0404 USB */ |
| 591 | case USB_ID(0x041e, 0x3f0a): /* E-Mu Tracker Pre */ | 591 | case USB_ID(0x041e, 0x3f0a): /* E-Mu Tracker Pre */ |
| 592 | case USB_ID(0x041e, 0x3f19): /* E-Mu 0204 USB */ | ||
| 592 | set_format_emu_quirk(subs, fmt); | 593 | set_format_emu_quirk(subs, fmt); |
| 593 | break; | 594 | break; |
| 594 | } | 595 | } |
