aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2012-12-17 18:22:27 -0500
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>2012-12-17 18:22:27 -0500
commit376bddd34433065aeb9b9a140870537feecf90ef (patch)
treea40e2b84ad89f4b3ba968de65a4bf7ff6ccae835 /sound/pci
parentd526e85f60fce9aa2a1432cbd06e3cf20c1644c8 (diff)
parent667b504a2c411e4d5915a6e2260a3857ba9f797a (diff)
Merge remote-tracking branch 'agust/next' into next
Brings some 52xx updates. Also manually merged tools/perf/perf.h. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Diffstat (limited to 'sound/pci')
-rw-r--r--sound/pci/es1968.c11
-rw-r--r--sound/pci/fm801.c11
-rw-r--r--sound/pci/hda/hda_codec.c13
-rw-r--r--sound/pci/hda/hda_codec.h1
-rw-r--r--sound/pci/hda/hda_intel.c41
-rw-r--r--sound/pci/hda/patch_analog.c1
-rw-r--r--sound/pci/hda/patch_cirrus.c22
-rw-r--r--sound/pci/hda/patch_realtek.c28
-rw-r--r--sound/pci/hda/patch_via.c36
-rw-r--r--sound/pci/rme9652/hdspm.c5
10 files changed, 112 insertions, 57 deletions
diff --git a/sound/pci/es1968.c b/sound/pci/es1968.c
index 5d0e568fdea1..7266020c16cb 100644
--- a/sound/pci/es1968.c
+++ b/sound/pci/es1968.c
@@ -2581,9 +2581,14 @@ static u8 snd_es1968_tea575x_get_pins(struct snd_tea575x *tea)
2581 struct es1968 *chip = tea->private_data; 2581 struct es1968 *chip = tea->private_data;
2582 unsigned long io = chip->io_port + GPIO_DATA; 2582 unsigned long io = chip->io_port + GPIO_DATA;
2583 u16 val = inw(io); 2583 u16 val = inw(io);
2584 u8 ret;
2584 2585
2585 return (val & STR_DATA) ? TEA575X_DATA : 0 | 2586 ret = 0;
2586 (val & STR_MOST) ? TEA575X_MOST : 0; 2587 if (val & STR_DATA)
2588 ret |= TEA575X_DATA;
2589 if (val & STR_MOST)
2590 ret |= TEA575X_MOST;
2591 return ret;
2587} 2592}
2588 2593
2589static void snd_es1968_tea575x_set_direction(struct snd_tea575x *tea, bool output) 2594static void snd_es1968_tea575x_set_direction(struct snd_tea575x *tea, bool output)
@@ -2655,6 +2660,8 @@ static struct ess_device_list pm_whitelist[] __devinitdata = {
2655 { TYPE_MAESTRO2E, 0x1179 }, 2660 { TYPE_MAESTRO2E, 0x1179 },
2656 { TYPE_MAESTRO2E, 0x14c0 }, /* HP omnibook 4150 */ 2661 { TYPE_MAESTRO2E, 0x14c0 }, /* HP omnibook 4150 */
2657 { TYPE_MAESTRO2E, 0x1558 }, 2662 { TYPE_MAESTRO2E, 0x1558 },
2663 { TYPE_MAESTRO2E, 0x125d }, /* a PCI card, e.g. Terratec DMX */
2664 { TYPE_MAESTRO2, 0x125d }, /* a PCI card, e.g. SF64-PCE2 */
2658}; 2665};
2659 2666
2660static struct ess_device_list mpu_blacklist[] __devinitdata = { 2667static struct ess_device_list mpu_blacklist[] __devinitdata = {
diff --git a/sound/pci/fm801.c b/sound/pci/fm801.c
index cc2e91d15538..c5806f89be1e 100644
--- a/sound/pci/fm801.c
+++ b/sound/pci/fm801.c
@@ -767,9 +767,14 @@ static u8 snd_fm801_tea575x_get_pins(struct snd_tea575x *tea)
767 struct fm801 *chip = tea->private_data; 767 struct fm801 *chip = tea->private_data;
768 unsigned short reg = inw(FM801_REG(chip, GPIO_CTRL)); 768 unsigned short reg = inw(FM801_REG(chip, GPIO_CTRL));
769 struct snd_fm801_tea575x_gpio gpio = *get_tea575x_gpio(chip); 769 struct snd_fm801_tea575x_gpio gpio = *get_tea575x_gpio(chip);
770 770 u8 ret;
771 return (reg & FM801_GPIO_GP(gpio.data)) ? TEA575X_DATA : 0 | 771
772 (reg & FM801_GPIO_GP(gpio.most)) ? TEA575X_MOST : 0; 772 ret = 0;
773 if (reg & FM801_GPIO_GP(gpio.data))
774 ret |= TEA575X_DATA;
775 if (reg & FM801_GPIO_GP(gpio.most))
776 ret |= TEA575X_MOST;
777 return ret;
773} 778}
774 779
775static void snd_fm801_tea575x_set_direction(struct snd_tea575x *tea, bool output) 780static void snd_fm801_tea575x_set_direction(struct snd_tea575x *tea, bool output)
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
index 70d4848b5cd0..d010de12335e 100644
--- a/sound/pci/hda/hda_codec.c
+++ b/sound/pci/hda/hda_codec.c
@@ -95,6 +95,7 @@ int snd_hda_delete_codec_preset(struct hda_codec_preset_list *preset)
95EXPORT_SYMBOL_HDA(snd_hda_delete_codec_preset); 95EXPORT_SYMBOL_HDA(snd_hda_delete_codec_preset);
96 96
97#ifdef CONFIG_PM 97#ifdef CONFIG_PM
98#define codec_in_pm(codec) ((codec)->in_pm)
98static void hda_power_work(struct work_struct *work); 99static void hda_power_work(struct work_struct *work);
99static void hda_keep_power_on(struct hda_codec *codec); 100static void hda_keep_power_on(struct hda_codec *codec);
100#define hda_codec_is_power_on(codec) ((codec)->power_on) 101#define hda_codec_is_power_on(codec) ((codec)->power_on)
@@ -104,6 +105,7 @@ static inline void hda_call_pm_notify(struct hda_bus *bus, bool power_up)
104 bus->ops.pm_notify(bus, power_up); 105 bus->ops.pm_notify(bus, power_up);
105} 106}
106#else 107#else
108#define codec_in_pm(codec) 0
107static inline void hda_keep_power_on(struct hda_codec *codec) {} 109static inline void hda_keep_power_on(struct hda_codec *codec) {}
108#define hda_codec_is_power_on(codec) 1 110#define hda_codec_is_power_on(codec) 1
109#define hda_call_pm_notify(bus, state) {} 111#define hda_call_pm_notify(bus, state) {}
@@ -228,7 +230,7 @@ static int codec_exec_verb(struct hda_codec *codec, unsigned int cmd,
228 } 230 }
229 mutex_unlock(&bus->cmd_mutex); 231 mutex_unlock(&bus->cmd_mutex);
230 snd_hda_power_down(codec); 232 snd_hda_power_down(codec);
231 if (res && *res == -1 && bus->rirb_error) { 233 if (!codec_in_pm(codec) && res && *res == -1 && bus->rirb_error) {
232 if (bus->response_reset) { 234 if (bus->response_reset) {
233 snd_printd("hda_codec: resetting BUS due to " 235 snd_printd("hda_codec: resetting BUS due to "
234 "fatal communication error\n"); 236 "fatal communication error\n");
@@ -238,7 +240,7 @@ static int codec_exec_verb(struct hda_codec *codec, unsigned int cmd,
238 goto again; 240 goto again;
239 } 241 }
240 /* clear reset-flag when the communication gets recovered */ 242 /* clear reset-flag when the communication gets recovered */
241 if (!err) 243 if (!err || codec_in_pm(codec))
242 bus->response_reset = 0; 244 bus->response_reset = 0;
243 return err; 245 return err;
244} 246}
@@ -3616,6 +3618,8 @@ static unsigned int hda_call_codec_suspend(struct hda_codec *codec, bool in_wq)
3616{ 3618{
3617 unsigned int state; 3619 unsigned int state;
3618 3620
3621 codec->in_pm = 1;
3622
3619 if (codec->patch_ops.suspend) 3623 if (codec->patch_ops.suspend)
3620 codec->patch_ops.suspend(codec); 3624 codec->patch_ops.suspend(codec);
3621 hda_cleanup_all_streams(codec); 3625 hda_cleanup_all_streams(codec);
@@ -3630,6 +3634,7 @@ static unsigned int hda_call_codec_suspend(struct hda_codec *codec, bool in_wq)
3630 codec->power_transition = 0; 3634 codec->power_transition = 0;
3631 codec->power_jiffies = jiffies; 3635 codec->power_jiffies = jiffies;
3632 spin_unlock(&codec->power_lock); 3636 spin_unlock(&codec->power_lock);
3637 codec->in_pm = 0;
3633 return state; 3638 return state;
3634} 3639}
3635 3640
@@ -3638,6 +3643,8 @@ static unsigned int hda_call_codec_suspend(struct hda_codec *codec, bool in_wq)
3638 */ 3643 */
3639static void hda_call_codec_resume(struct hda_codec *codec) 3644static void hda_call_codec_resume(struct hda_codec *codec)
3640{ 3645{
3646 codec->in_pm = 1;
3647
3641 /* set as if powered on for avoiding re-entering the resume 3648 /* set as if powered on for avoiding re-entering the resume
3642 * in the resume / power-save sequence 3649 * in the resume / power-save sequence
3643 */ 3650 */
@@ -3656,6 +3663,8 @@ static void hda_call_codec_resume(struct hda_codec *codec)
3656 snd_hda_codec_resume_cache(codec); 3663 snd_hda_codec_resume_cache(codec);
3657 } 3664 }
3658 snd_hda_jack_report_sync(codec); 3665 snd_hda_jack_report_sync(codec);
3666
3667 codec->in_pm = 0;
3659 snd_hda_power_down(codec); /* flag down before returning */ 3668 snd_hda_power_down(codec); /* flag down before returning */
3660} 3669}
3661#endif /* CONFIG_PM */ 3670#endif /* CONFIG_PM */
diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h
index 507fe8a917b6..4f4e545c0f4b 100644
--- a/sound/pci/hda/hda_codec.h
+++ b/sound/pci/hda/hda_codec.h
@@ -869,6 +869,7 @@ struct hda_codec {
869 unsigned int power_on :1; /* current (global) power-state */ 869 unsigned int power_on :1; /* current (global) power-state */
870 unsigned int d3_stop_clk:1; /* support D3 operation without BCLK */ 870 unsigned int d3_stop_clk:1; /* support D3 operation without BCLK */
871 unsigned int pm_down_notified:1; /* PM notified to controller */ 871 unsigned int pm_down_notified:1; /* PM notified to controller */
872 unsigned int in_pm:1; /* suspend/resume being performed */
872 int power_transition; /* power-state in transition */ 873 int power_transition; /* power-state in transition */
873 int power_count; /* current (global) power refcount */ 874 int power_count; /* current (global) power refcount */
874 struct delayed_work power_work; /* delayed task for powerdown */ 875 struct delayed_work power_work; /* delayed task for powerdown */
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
index 72b085ae7d46..f9d870e554d9 100644
--- a/sound/pci/hda/hda_intel.c
+++ b/sound/pci/hda/hda_intel.c
@@ -556,6 +556,12 @@ enum {
556#define AZX_DCAPS_ALIGN_BUFSIZE (1 << 22) /* buffer size alignment */ 556#define AZX_DCAPS_ALIGN_BUFSIZE (1 << 22) /* buffer size alignment */
557#define AZX_DCAPS_4K_BDLE_BOUNDARY (1 << 23) /* BDLE in 4k boundary */ 557#define AZX_DCAPS_4K_BDLE_BOUNDARY (1 << 23) /* BDLE in 4k boundary */
558#define AZX_DCAPS_COUNT_LPIB_DELAY (1 << 25) /* Take LPIB as delay */ 558#define AZX_DCAPS_COUNT_LPIB_DELAY (1 << 25) /* Take LPIB as delay */
559#define AZX_DCAPS_PM_RUNTIME (1 << 26) /* runtime PM support */
560
561/* quirks for Intel PCH */
562#define AZX_DCAPS_INTEL_PCH \
563 (AZX_DCAPS_SCH_SNOOP | AZX_DCAPS_BUFSIZE | \
564 AZX_DCAPS_COUNT_LPIB_DELAY | AZX_DCAPS_PM_RUNTIME)
559 565
560/* quirks for ATI SB / AMD Hudson */ 566/* quirks for ATI SB / AMD Hudson */
561#define AZX_DCAPS_PRESET_ATI_SB \ 567#define AZX_DCAPS_PRESET_ATI_SB \
@@ -2433,6 +2439,9 @@ static void azx_power_notify(struct hda_bus *bus, bool power_up)
2433{ 2439{
2434 struct azx *chip = bus->private_data; 2440 struct azx *chip = bus->private_data;
2435 2441
2442 if (!(chip->driver_caps & AZX_DCAPS_PM_RUNTIME))
2443 return;
2444
2436 if (power_up) 2445 if (power_up)
2437 pm_runtime_get_sync(&chip->pci->dev); 2446 pm_runtime_get_sync(&chip->pci->dev);
2438 else 2447 else
@@ -2548,7 +2557,8 @@ static int azx_runtime_suspend(struct device *dev)
2548 struct snd_card *card = dev_get_drvdata(dev); 2557 struct snd_card *card = dev_get_drvdata(dev);
2549 struct azx *chip = card->private_data; 2558 struct azx *chip = card->private_data;
2550 2559
2551 if (!power_save_controller) 2560 if (!power_save_controller ||
2561 !(chip->driver_caps & AZX_DCAPS_PM_RUNTIME))
2552 return -EAGAIN; 2562 return -EAGAIN;
2553 2563
2554 azx_stop_chip(chip); 2564 azx_stop_chip(chip);
@@ -3429,39 +3439,30 @@ static void __devexit azx_remove(struct pci_dev *pci)
3429static DEFINE_PCI_DEVICE_TABLE(azx_ids) = { 3439static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
3430 /* CPT */ 3440 /* CPT */
3431 { PCI_DEVICE(0x8086, 0x1c20), 3441 { PCI_DEVICE(0x8086, 0x1c20),
3432 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP | 3442 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
3433 AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY },
3434 /* PBG */ 3443 /* PBG */
3435 { PCI_DEVICE(0x8086, 0x1d20), 3444 { PCI_DEVICE(0x8086, 0x1d20),
3436 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP | 3445 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
3437 AZX_DCAPS_BUFSIZE},
3438 /* Panther Point */ 3446 /* Panther Point */
3439 { PCI_DEVICE(0x8086, 0x1e20), 3447 { PCI_DEVICE(0x8086, 0x1e20),
3440 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP | 3448 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
3441 AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY },
3442 /* Lynx Point */ 3449 /* Lynx Point */
3443 { PCI_DEVICE(0x8086, 0x8c20), 3450 { PCI_DEVICE(0x8086, 0x8c20),
3444 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP | 3451 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
3445 AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY },
3446 /* Lynx Point-LP */ 3452 /* Lynx Point-LP */
3447 { PCI_DEVICE(0x8086, 0x9c20), 3453 { PCI_DEVICE(0x8086, 0x9c20),
3448 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP | 3454 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
3449 AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY },
3450 /* Lynx Point-LP */ 3455 /* Lynx Point-LP */
3451 { PCI_DEVICE(0x8086, 0x9c21), 3456 { PCI_DEVICE(0x8086, 0x9c21),
3452 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP | 3457 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
3453 AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY },
3454 /* Haswell */ 3458 /* Haswell */
3455 { PCI_DEVICE(0x8086, 0x0c0c), 3459 { PCI_DEVICE(0x8086, 0x0c0c),
3456 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP | 3460 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH },
3457 AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY },
3458 { PCI_DEVICE(0x8086, 0x0d0c), 3461 { PCI_DEVICE(0x8086, 0x0d0c),
3459 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP | 3462 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH },
3460 AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY },
3461 /* 5 Series/3400 */ 3463 /* 5 Series/3400 */
3462 { PCI_DEVICE(0x8086, 0x3b56), 3464 { PCI_DEVICE(0x8086, 0x3b56),
3463 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP | 3465 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH },
3464 AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY },
3465 /* SCH */ 3466 /* SCH */
3466 { PCI_DEVICE(0x8086, 0x811b), 3467 { PCI_DEVICE(0x8086, 0x811b),
3467 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP | 3468 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP |
@@ -3563,6 +3564,8 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
3563 /* Teradici */ 3564 /* Teradici */
3564 { PCI_DEVICE(0x6549, 0x1200), 3565 { PCI_DEVICE(0x6549, 0x1200),
3565 .driver_data = AZX_DRIVER_TERA | AZX_DCAPS_NO_64BIT }, 3566 .driver_data = AZX_DRIVER_TERA | AZX_DCAPS_NO_64BIT },
3567 { PCI_DEVICE(0x6549, 0x2200),
3568 .driver_data = AZX_DRIVER_TERA | AZX_DCAPS_NO_64BIT },
3566 /* Creative X-Fi (CA0110-IBG) */ 3569 /* Creative X-Fi (CA0110-IBG) */
3567 /* CTHDA chips */ 3570 /* CTHDA chips */
3568 { PCI_DEVICE(0x1102, 0x0010), 3571 { PCI_DEVICE(0x1102, 0x0010),
diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c
index cdd43eadbc67..1eeba7386666 100644
--- a/sound/pci/hda/patch_analog.c
+++ b/sound/pci/hda/patch_analog.c
@@ -545,6 +545,7 @@ static int ad198x_build_pcms(struct hda_codec *codec)
545 if (spec->multiout.dig_out_nid) { 545 if (spec->multiout.dig_out_nid) {
546 info++; 546 info++;
547 codec->num_pcms++; 547 codec->num_pcms++;
548 codec->spdif_status_reset = 1;
548 info->name = "AD198x Digital"; 549 info->name = "AD198x Digital";
549 info->pcm_type = HDA_PCM_TYPE_SPDIF; 550 info->pcm_type = HDA_PCM_TYPE_SPDIF;
550 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = ad198x_pcm_digital_playback; 551 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = ad198x_pcm_digital_playback;
diff --git a/sound/pci/hda/patch_cirrus.c b/sound/pci/hda/patch_cirrus.c
index 61a71131711c..3bcb67172358 100644
--- a/sound/pci/hda/patch_cirrus.c
+++ b/sound/pci/hda/patch_cirrus.c
@@ -101,8 +101,8 @@ enum {
101#define CS420X_VENDOR_NID 0x11 101#define CS420X_VENDOR_NID 0x11
102#define CS_DIG_OUT1_PIN_NID 0x10 102#define CS_DIG_OUT1_PIN_NID 0x10
103#define CS_DIG_OUT2_PIN_NID 0x15 103#define CS_DIG_OUT2_PIN_NID 0x15
104#define CS_DMIC1_PIN_NID 0x12 104#define CS_DMIC1_PIN_NID 0x0e
105#define CS_DMIC2_PIN_NID 0x0e 105#define CS_DMIC2_PIN_NID 0x12
106 106
107/* coef indices */ 107/* coef indices */
108#define IDX_SPDIF_STAT 0x0000 108#define IDX_SPDIF_STAT 0x0000
@@ -466,6 +466,7 @@ static int parse_output(struct hda_codec *codec)
466 memcpy(cfg->speaker_pins, cfg->line_out_pins, 466 memcpy(cfg->speaker_pins, cfg->line_out_pins,
467 sizeof(cfg->speaker_pins)); 467 sizeof(cfg->speaker_pins));
468 cfg->line_outs = 0; 468 cfg->line_outs = 0;
469 memset(cfg->line_out_pins, 0, sizeof(cfg->line_out_pins));
469 } 470 }
470 471
471 return 0; 472 return 0;
@@ -1079,14 +1080,18 @@ static void init_input(struct hda_codec *codec)
1079 cs_automic(codec, NULL); 1080 cs_automic(codec, NULL);
1080 1081
1081 coef = 0x000a; /* ADC1/2 - Digital and Analog Soft Ramp */ 1082 coef = 0x000a; /* ADC1/2 - Digital and Analog Soft Ramp */
1083 cs_vendor_coef_set(codec, IDX_ADC_CFG, coef);
1084
1085 coef = cs_vendor_coef_get(codec, IDX_BEEP_CFG);
1082 if (is_active_pin(codec, CS_DMIC2_PIN_NID)) 1086 if (is_active_pin(codec, CS_DMIC2_PIN_NID))
1083 coef |= 0x0500; /* DMIC2 2 chan on, GPIO1 off */ 1087 coef |= 1 << 4; /* DMIC2 2 chan on, GPIO1 off */
1084 if (is_active_pin(codec, CS_DMIC1_PIN_NID)) 1088 if (is_active_pin(codec, CS_DMIC1_PIN_NID))
1085 coef |= 0x1800; /* DMIC1 2 chan on, GPIO0 off 1089 coef |= 1 << 3; /* DMIC1 2 chan on, GPIO0 off
1086 * No effect if SPDIF_OUT2 is 1090 * No effect if SPDIF_OUT2 is
1087 * selected in IDX_SPDIF_CTL. 1091 * selected in IDX_SPDIF_CTL.
1088 */ 1092 */
1089 cs_vendor_coef_set(codec, IDX_ADC_CFG, coef); 1093
1094 cs_vendor_coef_set(codec, IDX_BEEP_CFG, coef);
1090 } else { 1095 } else {
1091 if (spec->mic_detect) 1096 if (spec->mic_detect)
1092 cs_automic(codec, NULL); 1097 cs_automic(codec, NULL);
@@ -1107,7 +1112,7 @@ static const struct hda_verb cs_coef_init_verbs[] = {
1107 | 0x0400 /* Disable Coefficient Auto increment */ 1112 | 0x0400 /* Disable Coefficient Auto increment */
1108 )}, 1113 )},
1109 /* Beep */ 1114 /* Beep */
1110 {0x11, AC_VERB_SET_COEF_INDEX, IDX_DAC_CFG}, 1115 {0x11, AC_VERB_SET_COEF_INDEX, IDX_BEEP_CFG},
1111 {0x11, AC_VERB_SET_PROC_COEF, 0x0007}, /* Enable Beep thru DAC1/2/3 */ 1116 {0x11, AC_VERB_SET_PROC_COEF, 0x0007}, /* Enable Beep thru DAC1/2/3 */
1112 1117
1113 {} /* terminator */ 1118 {} /* terminator */
@@ -1728,8 +1733,7 @@ static int cs421x_mux_enum_put(struct snd_kcontrol *kcontrol,
1728 1733
1729} 1734}
1730 1735
1731static struct snd_kcontrol_new cs421x_capture_source = { 1736static const struct snd_kcontrol_new cs421x_capture_source = {
1732
1733 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 1737 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1734 .name = "Capture Source", 1738 .name = "Capture Source",
1735 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, 1739 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
@@ -1946,7 +1950,7 @@ static int cs421x_suspend(struct hda_codec *codec)
1946} 1950}
1947#endif 1951#endif
1948 1952
1949static struct hda_codec_ops cs421x_patch_ops = { 1953static const struct hda_codec_ops cs421x_patch_ops = {
1950 .build_controls = cs421x_build_controls, 1954 .build_controls = cs421x_build_controls,
1951 .build_pcms = cs_build_pcms, 1955 .build_pcms = cs_build_pcms,
1952 .init = cs421x_init, 1956 .init = cs421x_init,
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index f7397ad02a0d..ad68d223f8af 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -5407,6 +5407,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
5407 SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC889_FIXUP_IMAC91_VREF), 5407 SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC889_FIXUP_IMAC91_VREF),
5408 SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC889_FIXUP_IMAC91_VREF), 5408 SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC889_FIXUP_IMAC91_VREF),
5409 SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 5,1", ALC885_FIXUP_MACPRO_GPIO), 5409 SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 5,1", ALC885_FIXUP_MACPRO_GPIO),
5410 SND_PCI_QUIRK(0x106b, 0x4300, "iMac 9,1", ALC889_FIXUP_IMAC91_VREF),
5410 SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF), 5411 SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF),
5411 SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF), 5412 SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF),
5412 SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_IMAC91_VREF), 5413 SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_IMAC91_VREF),
@@ -5840,7 +5841,7 @@ static int alc269_parse_auto_config(struct hda_codec *codec)
5840 return alc_parse_auto_config(codec, alc269_ignore, ssids); 5841 return alc_parse_auto_config(codec, alc269_ignore, ssids);
5841} 5842}
5842 5843
5843static void alc269_toggle_power_output(struct hda_codec *codec, int power_up) 5844static void alc269vb_toggle_power_output(struct hda_codec *codec, int power_up)
5844{ 5845{
5845 int val = alc_read_coef_idx(codec, 0x04); 5846 int val = alc_read_coef_idx(codec, 0x04);
5846 if (power_up) 5847 if (power_up)
@@ -5857,10 +5858,10 @@ static void alc269_shutup(struct hda_codec *codec)
5857 if (spec->codec_variant != ALC269_TYPE_ALC269VB) 5858 if (spec->codec_variant != ALC269_TYPE_ALC269VB)
5858 return; 5859 return;
5859 5860
5860 if ((alc_get_coef0(codec) & 0x00ff) == 0x017) 5861 if (spec->codec_variant == ALC269_TYPE_ALC269VB)
5861 alc269_toggle_power_output(codec, 0); 5862 alc269vb_toggle_power_output(codec, 0);
5862 if ((alc_get_coef0(codec) & 0x00ff) == 0x018) { 5863 if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
5863 alc269_toggle_power_output(codec, 0); 5864 (alc_get_coef0(codec) & 0x00ff) == 0x018) {
5864 msleep(150); 5865 msleep(150);
5865 } 5866 }
5866} 5867}
@@ -5870,24 +5871,22 @@ static int alc269_resume(struct hda_codec *codec)
5870{ 5871{
5871 struct alc_spec *spec = codec->spec; 5872 struct alc_spec *spec = codec->spec;
5872 5873
5873 if (spec->codec_variant == ALC269_TYPE_ALC269VB || 5874 if (spec->codec_variant == ALC269_TYPE_ALC269VB)
5875 alc269vb_toggle_power_output(codec, 0);
5876 if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
5874 (alc_get_coef0(codec) & 0x00ff) == 0x018) { 5877 (alc_get_coef0(codec) & 0x00ff) == 0x018) {
5875 alc269_toggle_power_output(codec, 0);
5876 msleep(150); 5878 msleep(150);
5877 } 5879 }
5878 5880
5879 codec->patch_ops.init(codec); 5881 codec->patch_ops.init(codec);
5880 5882
5881 if (spec->codec_variant == ALC269_TYPE_ALC269VB || 5883 if (spec->codec_variant == ALC269_TYPE_ALC269VB)
5884 alc269vb_toggle_power_output(codec, 1);
5885 if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
5882 (alc_get_coef0(codec) & 0x00ff) == 0x017) { 5886 (alc_get_coef0(codec) & 0x00ff) == 0x017) {
5883 alc269_toggle_power_output(codec, 1);
5884 msleep(200); 5887 msleep(200);
5885 } 5888 }
5886 5889
5887 if (spec->codec_variant == ALC269_TYPE_ALC269VB ||
5888 (alc_get_coef0(codec) & 0x00ff) == 0x018)
5889 alc269_toggle_power_output(codec, 1);
5890
5891 snd_hda_codec_resume_amp(codec); 5890 snd_hda_codec_resume_amp(codec);
5892 snd_hda_codec_resume_cache(codec); 5891 snd_hda_codec_resume_cache(codec);
5893 hda_call_check_power_status(codec, 0x01); 5892 hda_call_check_power_status(codec, 0x01);
@@ -7066,6 +7065,7 @@ static const struct hda_codec_preset snd_hda_preset_realtek[] = {
7066 { .id = 0x10ec0282, .name = "ALC282", .patch = patch_alc269 }, 7065 { .id = 0x10ec0282, .name = "ALC282", .patch = patch_alc269 },
7067 { .id = 0x10ec0283, .name = "ALC283", .patch = patch_alc269 }, 7066 { .id = 0x10ec0283, .name = "ALC283", .patch = patch_alc269 },
7068 { .id = 0x10ec0290, .name = "ALC290", .patch = patch_alc269 }, 7067 { .id = 0x10ec0290, .name = "ALC290", .patch = patch_alc269 },
7068 { .id = 0x10ec0292, .name = "ALC292", .patch = patch_alc269 },
7069 { .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660", 7069 { .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660",
7070 .patch = patch_alc861 }, 7070 .patch = patch_alc861 },
7071 { .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd }, 7071 { .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd },
@@ -7079,6 +7079,7 @@ static const struct hda_codec_preset snd_hda_preset_realtek[] = {
7079 .patch = patch_alc662 }, 7079 .patch = patch_alc662 },
7080 { .id = 0x10ec0663, .name = "ALC663", .patch = patch_alc662 }, 7080 { .id = 0x10ec0663, .name = "ALC663", .patch = patch_alc662 },
7081 { .id = 0x10ec0665, .name = "ALC665", .patch = patch_alc662 }, 7081 { .id = 0x10ec0665, .name = "ALC665", .patch = patch_alc662 },
7082 { .id = 0x10ec0668, .name = "ALC668", .patch = patch_alc662 },
7082 { .id = 0x10ec0670, .name = "ALC670", .patch = patch_alc662 }, 7083 { .id = 0x10ec0670, .name = "ALC670", .patch = patch_alc662 },
7083 { .id = 0x10ec0680, .name = "ALC680", .patch = patch_alc680 }, 7084 { .id = 0x10ec0680, .name = "ALC680", .patch = patch_alc680 },
7084 { .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 }, 7085 { .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 },
@@ -7096,6 +7097,7 @@ static const struct hda_codec_preset snd_hda_preset_realtek[] = {
7096 { .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc882 }, 7097 { .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc882 },
7097 { .id = 0x10ec0892, .name = "ALC892", .patch = patch_alc662 }, 7098 { .id = 0x10ec0892, .name = "ALC892", .patch = patch_alc662 },
7098 { .id = 0x10ec0899, .name = "ALC898", .patch = patch_alc882 }, 7099 { .id = 0x10ec0899, .name = "ALC898", .patch = patch_alc882 },
7100 { .id = 0x10ec0900, .name = "ALC1150", .patch = patch_alc882 },
7099 {} /* terminator */ 7101 {} /* terminator */
7100}; 7102};
7101 7103
diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c
index 72a2f60b087c..019e1a00414a 100644
--- a/sound/pci/hda/patch_via.c
+++ b/sound/pci/hda/patch_via.c
@@ -1809,11 +1809,11 @@ static int via_auto_fill_dac_nids(struct hda_codec *codec)
1809{ 1809{
1810 struct via_spec *spec = codec->spec; 1810 struct via_spec *spec = codec->spec;
1811 const struct auto_pin_cfg *cfg = &spec->autocfg; 1811 const struct auto_pin_cfg *cfg = &spec->autocfg;
1812 int i, dac_num; 1812 int i;
1813 hda_nid_t nid; 1813 hda_nid_t nid;
1814 1814
1815 spec->multiout.num_dacs = 0;
1815 spec->multiout.dac_nids = spec->private_dac_nids; 1816 spec->multiout.dac_nids = spec->private_dac_nids;
1816 dac_num = 0;
1817 for (i = 0; i < cfg->line_outs; i++) { 1817 for (i = 0; i < cfg->line_outs; i++) {
1818 hda_nid_t dac = 0; 1818 hda_nid_t dac = 0;
1819 nid = cfg->line_out_pins[i]; 1819 nid = cfg->line_out_pins[i];
@@ -1824,16 +1824,13 @@ static int via_auto_fill_dac_nids(struct hda_codec *codec)
1824 if (!i && parse_output_path(codec, nid, dac, 1, 1824 if (!i && parse_output_path(codec, nid, dac, 1,
1825 &spec->out_mix_path)) 1825 &spec->out_mix_path))
1826 dac = spec->out_mix_path.path[0]; 1826 dac = spec->out_mix_path.path[0];
1827 if (dac) { 1827 if (dac)
1828 spec->private_dac_nids[i] = dac; 1828 spec->private_dac_nids[spec->multiout.num_dacs++] = dac;
1829 dac_num++;
1830 }
1831 } 1829 }
1832 if (!spec->out_path[0].depth && spec->out_mix_path.depth) { 1830 if (!spec->out_path[0].depth && spec->out_mix_path.depth) {
1833 spec->out_path[0] = spec->out_mix_path; 1831 spec->out_path[0] = spec->out_mix_path;
1834 spec->out_mix_path.depth = 0; 1832 spec->out_mix_path.depth = 0;
1835 } 1833 }
1836 spec->multiout.num_dacs = dac_num;
1837 return 0; 1834 return 0;
1838} 1835}
1839 1836
@@ -3628,6 +3625,7 @@ static void set_widgets_power_state_vt2002P(struct hda_codec *codec)
3628 */ 3625 */
3629enum { 3626enum {
3630 VIA_FIXUP_INTMIC_BOOST, 3627 VIA_FIXUP_INTMIC_BOOST,
3628 VIA_FIXUP_ASUS_G75,
3631}; 3629};
3632 3630
3633static void via_fixup_intmic_boost(struct hda_codec *codec, 3631static void via_fixup_intmic_boost(struct hda_codec *codec,
@@ -3642,13 +3640,35 @@ static const struct hda_fixup via_fixups[] = {
3642 .type = HDA_FIXUP_FUNC, 3640 .type = HDA_FIXUP_FUNC,
3643 .v.func = via_fixup_intmic_boost, 3641 .v.func = via_fixup_intmic_boost,
3644 }, 3642 },
3643 [VIA_FIXUP_ASUS_G75] = {
3644 .type = HDA_FIXUP_PINS,
3645 .v.pins = (const struct hda_pintbl[]) {
3646 /* set 0x24 and 0x33 as speakers */
3647 { 0x24, 0x991301f0 },
3648 { 0x33, 0x991301f1 }, /* subwoofer */
3649 { }
3650 }
3651 },
3645}; 3652};
3646 3653
3647static const struct snd_pci_quirk vt2002p_fixups[] = { 3654static const struct snd_pci_quirk vt2002p_fixups[] = {
3655 SND_PCI_QUIRK(0x1043, 0x1487, "Asus G75", VIA_FIXUP_ASUS_G75),
3648 SND_PCI_QUIRK(0x1043, 0x8532, "Asus X202E", VIA_FIXUP_INTMIC_BOOST), 3656 SND_PCI_QUIRK(0x1043, 0x8532, "Asus X202E", VIA_FIXUP_INTMIC_BOOST),
3649 {} 3657 {}
3650}; 3658};
3651 3659
3660/* NIDs 0x24 and 0x33 on VT1802 have connections to non-existing NID 0x3e
3661 * Replace this with mixer NID 0x1c
3662 */
3663static void fix_vt1802_connections(struct hda_codec *codec)
3664{
3665 static hda_nid_t conn_24[] = { 0x14, 0x1c };
3666 static hda_nid_t conn_33[] = { 0x1c };
3667
3668 snd_hda_override_conn_list(codec, 0x24, ARRAY_SIZE(conn_24), conn_24);
3669 snd_hda_override_conn_list(codec, 0x33, ARRAY_SIZE(conn_33), conn_33);
3670}
3671
3652/* patch for vt2002P */ 3672/* patch for vt2002P */
3653static int patch_vt2002P(struct hda_codec *codec) 3673static int patch_vt2002P(struct hda_codec *codec)
3654{ 3674{
@@ -3663,6 +3683,8 @@ static int patch_vt2002P(struct hda_codec *codec)
3663 spec->aa_mix_nid = 0x21; 3683 spec->aa_mix_nid = 0x21;
3664 override_mic_boost(codec, 0x2b, 0, 3, 40); 3684 override_mic_boost(codec, 0x2b, 0, 3, 40);
3665 override_mic_boost(codec, 0x29, 0, 3, 40); 3685 override_mic_boost(codec, 0x29, 0, 3, 40);
3686 if (spec->codec_type == VT1802)
3687 fix_vt1802_connections(codec);
3666 add_secret_dac_path(codec); 3688 add_secret_dac_path(codec);
3667 3689
3668 snd_hda_pick_fixup(codec, NULL, vt2002p_fixups, via_fixups); 3690 snd_hda_pick_fixup(codec, NULL, vt2002p_fixups, via_fixups);
diff --git a/sound/pci/rme9652/hdspm.c b/sound/pci/rme9652/hdspm.c
index f1cd1e387801..748e36c66603 100644
--- a/sound/pci/rme9652/hdspm.c
+++ b/sound/pci/rme9652/hdspm.c
@@ -3979,7 +3979,8 @@ static int snd_hdspm_get_sync_check(struct snd_kcontrol *kcontrol,
3979 case 8: /* SYNC IN */ 3979 case 8: /* SYNC IN */
3980 val = hdspm_sync_in_sync_check(hdspm); break; 3980 val = hdspm_sync_in_sync_check(hdspm); break;
3981 default: 3981 default:
3982 val = hdspm_s1_sync_check(hdspm, ucontrol->id.index-1); 3982 val = hdspm_s1_sync_check(hdspm,
3983 kcontrol->private_value-1);
3983 } 3984 }
3984 break; 3985 break;
3985 3986
@@ -4899,7 +4900,7 @@ snd_hdspm_proc_read_madi(struct snd_info_entry * entry,
4899 insel = "Coaxial"; 4900 insel = "Coaxial";
4900 break; 4901 break;
4901 default: 4902 default:
4902 insel = "Unkown"; 4903 insel = "Unknown";
4903 } 4904 }
4904 4905
4905 snd_iprintf(buffer, 4906 snd_iprintf(buffer,