aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci
diff options
context:
space:
mode:
authorDavid Vrabel <david.vrabel@csr.com>2008-11-19 09:48:07 -0500
committerDavid Vrabel <david.vrabel@csr.com>2008-11-19 09:48:07 -0500
commitdba0a918722ee0f0ba3442575e4448c3ab622be4 (patch)
treefdb466cf09e7916135098d651b18924b2fe9ba5f /sound/pci
parent0996e6382482ce9014787693d3884e9468153a5c (diff)
parent7f0f598a0069d1ab072375965a4b69137233169c (diff)
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6 into for-upstream
Diffstat (limited to 'sound/pci')
-rw-r--r--sound/pci/ac97/ac97_codec.c6
-rw-r--r--sound/pci/ad1889.c2
-rw-r--r--sound/pci/atiixp.c2
-rw-r--r--sound/pci/atiixp_modem.c2
-rw-r--r--sound/pci/au88x0/au88x0.c3
-rw-r--r--sound/pci/bt87x.c3
-rw-r--r--sound/pci/cs4281.c4
-rw-r--r--sound/pci/cs5530.c4
-rw-r--r--sound/pci/emu10k1/emu10k1_main.c3
-rw-r--r--sound/pci/hda/hda_beep.c8
-rw-r--r--sound/pci/hda/hda_beep.h1
-rw-r--r--sound/pci/hda/hda_codec.c1
-rw-r--r--sound/pci/hda/hda_intel.c31
-rw-r--r--sound/pci/hda/hda_proc.c2
-rw-r--r--sound/pci/hda/patch_analog.c3
-rw-r--r--sound/pci/hda/patch_realtek.c107
-rw-r--r--sound/pci/hda/patch_sigmatel.c204
-rw-r--r--sound/pci/ice1712/ice1712.c6
-rw-r--r--sound/pci/intel8x0.c1
-rw-r--r--sound/pci/mixart/mixart.c3
-rw-r--r--sound/pci/pcxhr/pcxhr.c5
-rw-r--r--sound/pci/rme9652/hdsp.c27
22 files changed, 352 insertions, 76 deletions
diff --git a/sound/pci/ac97/ac97_codec.c b/sound/pci/ac97/ac97_codec.c
index 6704acbca8c0..bd510eceff1f 100644
--- a/sound/pci/ac97/ac97_codec.c
+++ b/sound/pci/ac97/ac97_codec.c
@@ -1927,9 +1927,9 @@ static int snd_ac97_dev_register(struct snd_device *device)
1927 ac97->dev.bus = &ac97_bus_type; 1927 ac97->dev.bus = &ac97_bus_type;
1928 ac97->dev.parent = ac97->bus->card->dev; 1928 ac97->dev.parent = ac97->bus->card->dev;
1929 ac97->dev.release = ac97_device_release; 1929 ac97->dev.release = ac97_device_release;
1930 snprintf(ac97->dev.bus_id, BUS_ID_SIZE, "%d-%d:%s", 1930 dev_set_name(&ac97->dev, "%d-%d:%s",
1931 ac97->bus->card->number, ac97->num, 1931 ac97->bus->card->number, ac97->num,
1932 snd_ac97_get_short_name(ac97)); 1932 snd_ac97_get_short_name(ac97));
1933 if ((err = device_register(&ac97->dev)) < 0) { 1933 if ((err = device_register(&ac97->dev)) < 0) {
1934 snd_printk(KERN_ERR "Can't register ac97 bus\n"); 1934 snd_printk(KERN_ERR "Can't register ac97 bus\n");
1935 ac97->dev.bus = NULL; 1935 ac97->dev.bus = NULL;
diff --git a/sound/pci/ad1889.c b/sound/pci/ad1889.c
index 92f3a976ef2e..a7f38e63303f 100644
--- a/sound/pci/ad1889.c
+++ b/sound/pci/ad1889.c
@@ -932,7 +932,7 @@ snd_ad1889_create(struct snd_card *card,
932 goto free_and_ret; 932 goto free_and_ret;
933 933
934 chip->bar = pci_resource_start(pci, 0); 934 chip->bar = pci_resource_start(pci, 0);
935 chip->iobase = ioremap_nocache(chip->bar, pci_resource_len(pci, 0)); 935 chip->iobase = pci_ioremap_bar(pci, 0);
936 if (chip->iobase == NULL) { 936 if (chip->iobase == NULL) {
937 printk(KERN_ERR PFX "unable to reserve region.\n"); 937 printk(KERN_ERR PFX "unable to reserve region.\n");
938 err = -EBUSY; 938 err = -EBUSY;
diff --git a/sound/pci/atiixp.c b/sound/pci/atiixp.c
index 085a52b8c807..226fe8237d31 100644
--- a/sound/pci/atiixp.c
+++ b/sound/pci/atiixp.c
@@ -1609,7 +1609,7 @@ static int __devinit snd_atiixp_create(struct snd_card *card,
1609 return err; 1609 return err;
1610 } 1610 }
1611 chip->addr = pci_resource_start(pci, 0); 1611 chip->addr = pci_resource_start(pci, 0);
1612 chip->remap_addr = ioremap_nocache(chip->addr, pci_resource_len(pci, 0)); 1612 chip->remap_addr = pci_ioremap_bar(pci, 0);
1613 if (chip->remap_addr == NULL) { 1613 if (chip->remap_addr == NULL) {
1614 snd_printk(KERN_ERR "AC'97 space ioremap problem\n"); 1614 snd_printk(KERN_ERR "AC'97 space ioremap problem\n");
1615 snd_atiixp_free(chip); 1615 snd_atiixp_free(chip);
diff --git a/sound/pci/atiixp_modem.c b/sound/pci/atiixp_modem.c
index 2f106306c7fe..0e6e5cc1c501 100644
--- a/sound/pci/atiixp_modem.c
+++ b/sound/pci/atiixp_modem.c
@@ -1252,7 +1252,7 @@ static int __devinit snd_atiixp_create(struct snd_card *card,
1252 return err; 1252 return err;
1253 } 1253 }
1254 chip->addr = pci_resource_start(pci, 0); 1254 chip->addr = pci_resource_start(pci, 0);
1255 chip->remap_addr = ioremap_nocache(chip->addr, pci_resource_len(pci, 0)); 1255 chip->remap_addr = pci_ioremap_bar(pci, 0);
1256 if (chip->remap_addr == NULL) { 1256 if (chip->remap_addr == NULL) {
1257 snd_printk(KERN_ERR "AC'97 space ioremap problem\n"); 1257 snd_printk(KERN_ERR "AC'97 space ioremap problem\n");
1258 snd_atiixp_free(chip); 1258 snd_atiixp_free(chip);
diff --git a/sound/pci/au88x0/au88x0.c b/sound/pci/au88x0/au88x0.c
index 68368e490074..a36d4d1fd419 100644
--- a/sound/pci/au88x0/au88x0.c
+++ b/sound/pci/au88x0/au88x0.c
@@ -180,8 +180,7 @@ snd_vortex_create(struct snd_card *card, struct pci_dev *pci, vortex_t ** rchip)
180 if ((err = pci_request_regions(pci, CARD_NAME_SHORT)) != 0) 180 if ((err = pci_request_regions(pci, CARD_NAME_SHORT)) != 0)
181 goto regions_out; 181 goto regions_out;
182 182
183 chip->mmio = ioremap_nocache(pci_resource_start(pci, 0), 183 chip->mmio = pci_ioremap_bar(pci, 0);
184 pci_resource_len(pci, 0));
185 if (!chip->mmio) { 184 if (!chip->mmio) {
186 printk(KERN_ERR "MMIO area remap failed.\n"); 185 printk(KERN_ERR "MMIO area remap failed.\n");
187 err = -ENOMEM; 186 err = -ENOMEM;
diff --git a/sound/pci/bt87x.c b/sound/pci/bt87x.c
index 3aa8d973540a..1aa1c0402540 100644
--- a/sound/pci/bt87x.c
+++ b/sound/pci/bt87x.c
@@ -749,8 +749,7 @@ static int __devinit snd_bt87x_create(struct snd_card *card,
749 pci_disable_device(pci); 749 pci_disable_device(pci);
750 return err; 750 return err;
751 } 751 }
752 chip->mmio = ioremap_nocache(pci_resource_start(pci, 0), 752 chip->mmio = pci_ioremap_bar(pci, 0);
753 pci_resource_len(pci, 0));
754 if (!chip->mmio) { 753 if (!chip->mmio) {
755 snd_printk(KERN_ERR "cannot remap io memory\n"); 754 snd_printk(KERN_ERR "cannot remap io memory\n");
756 err = -ENOMEM; 755 err = -ENOMEM;
diff --git a/sound/pci/cs4281.c b/sound/pci/cs4281.c
index ef9308f7c45b..192e7842e181 100644
--- a/sound/pci/cs4281.c
+++ b/sound/pci/cs4281.c
@@ -1382,8 +1382,8 @@ static int __devinit snd_cs4281_create(struct snd_card *card,
1382 chip->ba0_addr = pci_resource_start(pci, 0); 1382 chip->ba0_addr = pci_resource_start(pci, 0);
1383 chip->ba1_addr = pci_resource_start(pci, 1); 1383 chip->ba1_addr = pci_resource_start(pci, 1);
1384 1384
1385 chip->ba0 = ioremap_nocache(chip->ba0_addr, pci_resource_len(pci, 0)); 1385 chip->ba0 = pci_ioremap_bar(pci, 0);
1386 chip->ba1 = ioremap_nocache(chip->ba1_addr, pci_resource_len(pci, 1)); 1386 chip->ba1 = pci_ioremap_bar(pci, 1);
1387 if (!chip->ba0 || !chip->ba1) { 1387 if (!chip->ba0 || !chip->ba1) {
1388 snd_cs4281_free(chip); 1388 snd_cs4281_free(chip);
1389 return -ENOMEM; 1389 return -ENOMEM;
diff --git a/sound/pci/cs5530.c b/sound/pci/cs5530.c
index 7ff8b68e997e..6dea5b5cc774 100644
--- a/sound/pci/cs5530.c
+++ b/sound/pci/cs5530.c
@@ -2,7 +2,7 @@
2 * cs5530.c - Initialisation code for Cyrix/NatSemi VSA1 softaudio 2 * cs5530.c - Initialisation code for Cyrix/NatSemi VSA1 softaudio
3 * 3 *
4 * (C) Copyright 2007 Ash Willis <ashwillis@programmer.net> 4 * (C) Copyright 2007 Ash Willis <ashwillis@programmer.net>
5 * (C) Copyright 2003 Red Hat Inc <alan@redhat.com> 5 * (C) Copyright 2003 Red Hat Inc <alan@lxorguk.ukuu.org.uk>
6 * 6 *
7 * This driver was ported (shamelessly ripped ;) from oss/kahlua.c but I did 7 * This driver was ported (shamelessly ripped ;) from oss/kahlua.c but I did
8 * mess with it a bit. The chip seems to have to have trouble with full duplex 8 * mess with it a bit. The chip seems to have to have trouble with full duplex
@@ -132,7 +132,7 @@ static int __devinit snd_cs5530_create(struct snd_card *card,
132 } 132 }
133 chip->pci_base = pci_resource_start(pci, 0); 133 chip->pci_base = pci_resource_start(pci, 0);
134 134
135 mem = ioremap_nocache(chip->pci_base, pci_resource_len(pci, 0)); 135 mem = pci_ioremap_bar(pci, 0);
136 if (mem == NULL) { 136 if (mem == NULL) {
137 kfree(chip); 137 kfree(chip);
138 pci_disable_device(pci); 138 pci_disable_device(pci);
diff --git a/sound/pci/emu10k1/emu10k1_main.c b/sound/pci/emu10k1/emu10k1_main.c
index 2f283ea6ad9a..de5ee8f097f6 100644
--- a/sound/pci/emu10k1/emu10k1_main.c
+++ b/sound/pci/emu10k1/emu10k1_main.c
@@ -1464,6 +1464,7 @@ static struct snd_emu_chip_details emu_chip_details[] = {
1464 .ca0151_chip = 1, 1464 .ca0151_chip = 1,
1465 .spk71 = 1, 1465 .spk71 = 1,
1466 .spdif_bug = 1, 1466 .spdif_bug = 1,
1467 .invert_shared_spdif = 1, /* digital/analog switch swapped */
1467 .ac97_chip = 1} , 1468 .ac97_chip = 1} ,
1468 {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x20021102, 1469 {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x20021102,
1469 .driver = "Audigy2", .name = "Audigy 2 ZS [SB0350]", 1470 .driver = "Audigy2", .name = "Audigy 2 ZS [SB0350]",
@@ -1473,6 +1474,7 @@ static struct snd_emu_chip_details emu_chip_details[] = {
1473 .ca0151_chip = 1, 1474 .ca0151_chip = 1,
1474 .spk71 = 1, 1475 .spk71 = 1,
1475 .spdif_bug = 1, 1476 .spdif_bug = 1,
1477 .invert_shared_spdif = 1, /* digital/analog switch swapped */
1476 .ac97_chip = 1} , 1478 .ac97_chip = 1} ,
1477 {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x20011102, 1479 {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x20011102,
1478 .driver = "Audigy2", .name = "Audigy 2 ZS [2001]", 1480 .driver = "Audigy2", .name = "Audigy 2 ZS [2001]",
@@ -1482,6 +1484,7 @@ static struct snd_emu_chip_details emu_chip_details[] = {
1482 .ca0151_chip = 1, 1484 .ca0151_chip = 1,
1483 .spk71 = 1, 1485 .spk71 = 1,
1484 .spdif_bug = 1, 1486 .spdif_bug = 1,
1487 .invert_shared_spdif = 1, /* digital/analog switch swapped */
1485 .ac97_chip = 1} , 1488 .ac97_chip = 1} ,
1486 /* Audigy 2 */ 1489 /* Audigy 2 */
1487 /* Tested by James@superbug.co.uk 3rd July 2005 */ 1490 /* Tested by James@superbug.co.uk 3rd July 2005 */
diff --git a/sound/pci/hda/hda_beep.c b/sound/pci/hda/hda_beep.c
index 9b77b3e0fa98..3ecd7e797dee 100644
--- a/sound/pci/hda/hda_beep.c
+++ b/sound/pci/hda/hda_beep.c
@@ -37,6 +37,9 @@ static void snd_hda_generate_beep(struct work_struct *work)
37 container_of(work, struct hda_beep, beep_work); 37 container_of(work, struct hda_beep, beep_work);
38 struct hda_codec *codec = beep->codec; 38 struct hda_codec *codec = beep->codec;
39 39
40 if (!beep->enabled)
41 return;
42
40 /* generate tone */ 43 /* generate tone */
41 snd_hda_codec_write_cache(codec, beep->nid, 0, 44 snd_hda_codec_write_cache(codec, beep->nid, 0,
42 AC_VERB_SET_BEEP_CONTROL, beep->tone); 45 AC_VERB_SET_BEEP_CONTROL, beep->tone);
@@ -85,6 +88,10 @@ int snd_hda_attach_beep_device(struct hda_codec *codec, int nid)
85 snprintf(beep->phys, sizeof(beep->phys), 88 snprintf(beep->phys, sizeof(beep->phys),
86 "card%d/codec#%d/beep0", codec->bus->card->number, codec->addr); 89 "card%d/codec#%d/beep0", codec->bus->card->number, codec->addr);
87 input_dev = input_allocate_device(); 90 input_dev = input_allocate_device();
91 if (!input_dev) {
92 kfree(beep);
93 return -ENOMEM;
94 }
88 95
89 /* setup digital beep device */ 96 /* setup digital beep device */
90 input_dev->name = "HDA Digital PCBeep"; 97 input_dev->name = "HDA Digital PCBeep";
@@ -115,6 +122,7 @@ int snd_hda_attach_beep_device(struct hda_codec *codec, int nid)
115 beep->nid = nid; 122 beep->nid = nid;
116 beep->dev = input_dev; 123 beep->dev = input_dev;
117 beep->codec = codec; 124 beep->codec = codec;
125 beep->enabled = 1;
118 codec->beep = beep; 126 codec->beep = beep;
119 127
120 INIT_WORK(&beep->beep_work, &snd_hda_generate_beep); 128 INIT_WORK(&beep->beep_work, &snd_hda_generate_beep);
diff --git a/sound/pci/hda/hda_beep.h b/sound/pci/hda/hda_beep.h
index de4036e6e710..b9679f081cae 100644
--- a/sound/pci/hda/hda_beep.h
+++ b/sound/pci/hda/hda_beep.h
@@ -31,6 +31,7 @@ struct hda_beep {
31 char phys[32]; 31 char phys[32];
32 int tone; 32 int tone;
33 int nid; 33 int nid;
34 int enabled;
34 struct work_struct beep_work; /* scheduled task for beep event */ 35 struct work_struct beep_work; /* scheduled task for beep event */
35}; 36};
36 37
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
index 6447754ae56e..ba1ab737b55f 100644
--- a/sound/pci/hda/hda_codec.c
+++ b/sound/pci/hda/hda_codec.c
@@ -64,6 +64,7 @@ static struct hda_vendor_id hda_vendor_ids[] = {
64 { 0x14f1, "Conexant" }, 64 { 0x14f1, "Conexant" },
65 { 0x17e8, "Chrontel" }, 65 { 0x17e8, "Chrontel" },
66 { 0x1854, "LG" }, 66 { 0x1854, "LG" },
67 { 0x1aec, "Wolfson Microelectronics" },
67 { 0x434d, "C-Media" }, 68 { 0x434d, "C-Media" },
68 { 0x8384, "SigmaTel" }, 69 { 0x8384, "SigmaTel" },
69 {} /* terminator */ 70 {} /* terminator */
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
index 9f316c1b2790..35722ec920cb 100644
--- a/sound/pci/hda/hda_intel.c
+++ b/sound/pci/hda/hda_intel.c
@@ -45,6 +45,7 @@
45#include <linux/slab.h> 45#include <linux/slab.h>
46#include <linux/pci.h> 46#include <linux/pci.h>
47#include <linux/mutex.h> 47#include <linux/mutex.h>
48#include <linux/reboot.h>
48#include <sound/core.h> 49#include <sound/core.h>
49#include <sound/initval.h> 50#include <sound/initval.h>
50#include "hda_codec.h" 51#include "hda_codec.h"
@@ -397,6 +398,9 @@ struct azx {
397 398
398 /* for pending irqs */ 399 /* for pending irqs */
399 struct work_struct irq_pending_work; 400 struct work_struct irq_pending_work;
401
402 /* reboot notifier (for mysterious hangup problem at power-down) */
403 struct notifier_block reboot_notifier;
400}; 404};
401 405
402/* driver types */ 406/* driver types */
@@ -1979,12 +1983,36 @@ static int azx_resume(struct pci_dev *pci)
1979 1983
1980 1984
1981/* 1985/*
1986 * reboot notifier for hang-up problem at power-down
1987 */
1988static int azx_halt(struct notifier_block *nb, unsigned long event, void *buf)
1989{
1990 struct azx *chip = container_of(nb, struct azx, reboot_notifier);
1991 azx_stop_chip(chip);
1992 return NOTIFY_OK;
1993}
1994
1995static void azx_notifier_register(struct azx *chip)
1996{
1997 chip->reboot_notifier.notifier_call = azx_halt;
1998 register_reboot_notifier(&chip->reboot_notifier);
1999}
2000
2001static void azx_notifier_unregister(struct azx *chip)
2002{
2003 if (chip->reboot_notifier.notifier_call)
2004 unregister_reboot_notifier(&chip->reboot_notifier);
2005}
2006
2007/*
1982 * destructor 2008 * destructor
1983 */ 2009 */
1984static int azx_free(struct azx *chip) 2010static int azx_free(struct azx *chip)
1985{ 2011{
1986 int i; 2012 int i;
1987 2013
2014 azx_notifier_unregister(chip);
2015
1988 if (chip->initialized) { 2016 if (chip->initialized) {
1989 azx_clear_irq_pending(chip); 2017 azx_clear_irq_pending(chip);
1990 for (i = 0; i < chip->num_streams; i++) 2018 for (i = 0; i < chip->num_streams; i++)
@@ -2158,7 +2186,7 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci,
2158 } 2186 }
2159 2187
2160 chip->addr = pci_resource_start(pci, 0); 2188 chip->addr = pci_resource_start(pci, 0);
2161 chip->remap_addr = ioremap_nocache(chip->addr, pci_resource_len(pci,0)); 2189 chip->remap_addr = pci_ioremap_bar(pci, 0);
2162 if (chip->remap_addr == NULL) { 2190 if (chip->remap_addr == NULL) {
2163 snd_printk(KERN_ERR SFX "ioremap error\n"); 2191 snd_printk(KERN_ERR SFX "ioremap error\n");
2164 err = -ENXIO; 2192 err = -ENXIO;
@@ -2348,6 +2376,7 @@ static int __devinit azx_probe(struct pci_dev *pci,
2348 pci_set_drvdata(pci, card); 2376 pci_set_drvdata(pci, card);
2349 chip->running = 1; 2377 chip->running = 1;
2350 power_down_all_codecs(chip); 2378 power_down_all_codecs(chip);
2379 azx_notifier_register(chip);
2351 2380
2352 dev++; 2381 dev++;
2353 return err; 2382 return err;
diff --git a/sound/pci/hda/hda_proc.c b/sound/pci/hda/hda_proc.c
index 743d77922bce..c39af986bff1 100644
--- a/sound/pci/hda/hda_proc.c
+++ b/sound/pci/hda/hda_proc.c
@@ -483,6 +483,8 @@ static void print_gpio(struct snd_info_buffer *buffer,
483 (gpio & AC_GPIO_UNSOLICITED) ? 1 : 0, 483 (gpio & AC_GPIO_UNSOLICITED) ? 1 : 0,
484 (gpio & AC_GPIO_WAKE) ? 1 : 0); 484 (gpio & AC_GPIO_WAKE) ? 1 : 0);
485 max = gpio & AC_GPIO_IO_COUNT; 485 max = gpio & AC_GPIO_IO_COUNT;
486 if (!max || max > 8)
487 return;
486 enable = snd_hda_codec_read(codec, nid, 0, 488 enable = snd_hda_codec_read(codec, nid, 0,
487 AC_VERB_GET_GPIO_MASK, 0); 489 AC_VERB_GET_GPIO_MASK, 0);
488 direction = snd_hda_codec_read(codec, nid, 0, 490 direction = snd_hda_codec_read(codec, nid, 0,
diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c
index 2b00c4afdf97..686c77491dea 100644
--- a/sound/pci/hda/patch_analog.c
+++ b/sound/pci/hda/patch_analog.c
@@ -3860,6 +3860,9 @@ static const char *ad1884a_models[AD1884A_MODELS] = {
3860 3860
3861static struct snd_pci_quirk ad1884a_cfg_tbl[] = { 3861static struct snd_pci_quirk ad1884a_cfg_tbl[] = {
3862 SND_PCI_QUIRK(0x103c, 0x3030, "HP", AD1884A_MOBILE), 3862 SND_PCI_QUIRK(0x103c, 0x3030, "HP", AD1884A_MOBILE),
3863 SND_PCI_QUIRK(0x103c, 0x3056, "HP", AD1884A_MOBILE),
3864 SND_PCI_QUIRK(0x103c, 0x30e7, "HP EliteBook 8530p", AD1884A_LAPTOP),
3865 SND_PCI_QUIRK(0x103c, 0x3614, "HP 6730s", AD1884A_LAPTOP),
3863 SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X300", AD1884A_THINKPAD), 3866 SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X300", AD1884A_THINKPAD),
3864 {} 3867 {}
3865}; 3868};
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index ef4955c73c88..a378c0145125 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -307,6 +307,13 @@ struct alc_spec {
307 /* for PLL fix */ 307 /* for PLL fix */
308 hda_nid_t pll_nid; 308 hda_nid_t pll_nid;
309 unsigned int pll_coef_idx, pll_coef_bit; 309 unsigned int pll_coef_idx, pll_coef_bit;
310
311#ifdef SND_HDA_NEEDS_RESUME
312#define ALC_MAX_PINS 16
313 unsigned int num_pins;
314 hda_nid_t pin_nids[ALC_MAX_PINS];
315 unsigned int pin_cfgs[ALC_MAX_PINS];
316#endif
310}; 317};
311 318
312/* 319/*
@@ -822,6 +829,7 @@ static void alc_sku_automute(struct hda_codec *codec)
822 spec->jack_present ? 0 : PIN_OUT); 829 spec->jack_present ? 0 : PIN_OUT);
823} 830}
824 831
832#if 0 /* it's broken in some acses -- temporarily disabled */
825static void alc_mic_automute(struct hda_codec *codec) 833static void alc_mic_automute(struct hda_codec *codec)
826{ 834{
827 struct alc_spec *spec = codec->spec; 835 struct alc_spec *spec = codec->spec;
@@ -842,6 +850,9 @@ static void alc_mic_automute(struct hda_codec *codec)
842 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, capsrc_idx_fmic, 850 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, capsrc_idx_fmic,
843 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 851 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
844} 852}
853#else
854#define alc_mic_automute(codec) /* NOP */
855#endif /* disabled */
845 856
846/* unsolicited event for HP jack sensing */ 857/* unsolicited event for HP jack sensing */
847static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res) 858static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res)
@@ -1051,12 +1062,14 @@ do_sku:
1051 AC_VERB_SET_UNSOLICITED_ENABLE, 1062 AC_VERB_SET_UNSOLICITED_ENABLE,
1052 AC_USRSP_EN | ALC880_HP_EVENT); 1063 AC_USRSP_EN | ALC880_HP_EVENT);
1053 1064
1065#if 0 /* it's broken in some acses -- temporarily disabled */
1054 if (spec->autocfg.input_pins[AUTO_PIN_MIC] && 1066 if (spec->autocfg.input_pins[AUTO_PIN_MIC] &&
1055 spec->autocfg.input_pins[AUTO_PIN_FRONT_MIC]) 1067 spec->autocfg.input_pins[AUTO_PIN_FRONT_MIC])
1056 snd_hda_codec_write(codec, 1068 snd_hda_codec_write(codec,
1057 spec->autocfg.input_pins[AUTO_PIN_MIC], 0, 1069 spec->autocfg.input_pins[AUTO_PIN_MIC], 0,
1058 AC_VERB_SET_UNSOLICITED_ENABLE, 1070 AC_VERB_SET_UNSOLICITED_ENABLE,
1059 AC_USRSP_EN | ALC880_MIC_EVENT); 1071 AC_USRSP_EN | ALC880_MIC_EVENT);
1072#endif /* disabled */
1060 1073
1061 spec->unsol_event = alc_sku_unsol_event; 1074 spec->unsol_event = alc_sku_unsol_event;
1062} 1075}
@@ -2778,6 +2791,64 @@ static void alc_free(struct hda_codec *codec)
2778 codec->spec = NULL; /* to be sure */ 2791 codec->spec = NULL; /* to be sure */
2779} 2792}
2780 2793
2794#ifdef SND_HDA_NEEDS_RESUME
2795static void store_pin_configs(struct hda_codec *codec)
2796{
2797 struct alc_spec *spec = codec->spec;
2798 hda_nid_t nid, end_nid;
2799
2800 end_nid = codec->start_nid + codec->num_nodes;
2801 for (nid = codec->start_nid; nid < end_nid; nid++) {
2802 unsigned int wid_caps = get_wcaps(codec, nid);
2803 unsigned int wid_type =
2804 (wid_caps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;
2805 if (wid_type != AC_WID_PIN)
2806 continue;
2807 if (spec->num_pins >= ARRAY_SIZE(spec->pin_nids))
2808 break;
2809 spec->pin_nids[spec->num_pins] = nid;
2810 spec->pin_cfgs[spec->num_pins] =
2811 snd_hda_codec_read(codec, nid, 0,
2812 AC_VERB_GET_CONFIG_DEFAULT, 0);
2813 spec->num_pins++;
2814 }
2815}
2816
2817static void resume_pin_configs(struct hda_codec *codec)
2818{
2819 struct alc_spec *spec = codec->spec;
2820 int i;
2821
2822 for (i = 0; i < spec->num_pins; i++) {
2823 hda_nid_t pin_nid = spec->pin_nids[i];
2824 unsigned int pin_config = spec->pin_cfgs[i];
2825 snd_hda_codec_write(codec, pin_nid, 0,
2826 AC_VERB_SET_CONFIG_DEFAULT_BYTES_0,
2827 pin_config & 0x000000ff);
2828 snd_hda_codec_write(codec, pin_nid, 0,
2829 AC_VERB_SET_CONFIG_DEFAULT_BYTES_1,
2830 (pin_config & 0x0000ff00) >> 8);
2831 snd_hda_codec_write(codec, pin_nid, 0,
2832 AC_VERB_SET_CONFIG_DEFAULT_BYTES_2,
2833 (pin_config & 0x00ff0000) >> 16);
2834 snd_hda_codec_write(codec, pin_nid, 0,
2835 AC_VERB_SET_CONFIG_DEFAULT_BYTES_3,
2836 pin_config >> 24);
2837 }
2838}
2839
2840static int alc_resume(struct hda_codec *codec)
2841{
2842 resume_pin_configs(codec);
2843 codec->patch_ops.init(codec);
2844 snd_hda_codec_resume_amp(codec);
2845 snd_hda_codec_resume_cache(codec);
2846 return 0;
2847}
2848#else
2849#define store_pin_configs(codec)
2850#endif
2851
2781/* 2852/*
2782 */ 2853 */
2783static struct hda_codec_ops alc_patch_ops = { 2854static struct hda_codec_ops alc_patch_ops = {
@@ -2786,6 +2857,9 @@ static struct hda_codec_ops alc_patch_ops = {
2786 .init = alc_init, 2857 .init = alc_init,
2787 .free = alc_free, 2858 .free = alc_free,
2788 .unsol_event = alc_unsol_event, 2859 .unsol_event = alc_unsol_event,
2860#ifdef SND_HDA_NEEDS_RESUME
2861 .resume = alc_resume,
2862#endif
2789#ifdef CONFIG_SND_HDA_POWER_SAVE 2863#ifdef CONFIG_SND_HDA_POWER_SAVE
2790 .check_power_status = alc_check_power_status, 2864 .check_power_status = alc_check_power_status,
2791#endif 2865#endif
@@ -3832,6 +3906,7 @@ static int alc880_parse_auto_config(struct hda_codec *codec)
3832 spec->num_mux_defs = 1; 3906 spec->num_mux_defs = 1;
3833 spec->input_mux = &spec->private_imux; 3907 spec->input_mux = &spec->private_imux;
3834 3908
3909 store_pin_configs(codec);
3835 return 1; 3910 return 1;
3836} 3911}
3837 3912
@@ -5250,6 +5325,7 @@ static int alc260_parse_auto_config(struct hda_codec *codec)
5250 } 5325 }
5251 spec->num_mixers++; 5326 spec->num_mixers++;
5252 5327
5328 store_pin_configs(codec);
5253 return 1; 5329 return 1;
5254} 5330}
5255 5331
@@ -8338,6 +8414,7 @@ static const char *alc883_models[ALC883_MODEL_LAST] = {
8338static struct snd_pci_quirk alc883_cfg_tbl[] = { 8414static struct snd_pci_quirk alc883_cfg_tbl[] = {
8339 SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC883_3ST_6ch_DIG), 8415 SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC883_3ST_6ch_DIG),
8340 SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE), 8416 SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE),
8417 SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_ACER_ASPIRE),
8341 SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE), 8418 SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE),
8342 SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE), 8419 SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE),
8343 SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE), 8420 SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE),
@@ -8392,6 +8469,7 @@ static struct snd_pci_quirk alc883_cfg_tbl[] = {
8392 SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763), 8469 SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763),
8393 SND_PCI_QUIRK(0x17aa, 0x101d, "Lenovo Sky", ALC888_LENOVO_SKY), 8470 SND_PCI_QUIRK(0x17aa, 0x101d, "Lenovo Sky", ALC888_LENOVO_SKY),
8394 SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2), 8471 SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2),
8472 SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG),
8395 SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG), 8473 SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG),
8396 SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66), 8474 SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66),
8397 SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL), 8475 SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL),
@@ -10313,6 +10391,7 @@ static int alc262_parse_auto_config(struct hda_codec *codec)
10313 if (err < 0) 10391 if (err < 0)
10314 return err; 10392 return err;
10315 10393
10394 store_pin_configs(codec);
10316 return 1; 10395 return 1;
10317} 10396}
10318 10397
@@ -11447,6 +11526,7 @@ static int alc268_parse_auto_config(struct hda_codec *codec)
11447 if (err < 0) 11526 if (err < 0)
11448 return err; 11527 return err;
11449 11528
11529 store_pin_configs(codec);
11450 return 1; 11530 return 1;
11451} 11531}
11452 11532
@@ -12166,8 +12246,26 @@ static int alc269_auto_create_multi_out_ctls(struct alc_spec *spec,
12166 return 0; 12246 return 0;
12167} 12247}
12168 12248
12169#define alc269_auto_create_analog_input_ctls \ 12249static int alc269_auto_create_analog_input_ctls(struct alc_spec *spec,
12170 alc880_auto_create_analog_input_ctls 12250 const struct auto_pin_cfg *cfg)
12251{
12252 int err;
12253
12254 err = alc880_auto_create_analog_input_ctls(spec, cfg);
12255 if (err < 0)
12256 return err;
12257 /* digital-mic input pin is excluded in alc880_auto_create..()
12258 * because it's under 0x18
12259 */
12260 if (cfg->input_pins[AUTO_PIN_MIC] == 0x12 ||
12261 cfg->input_pins[AUTO_PIN_FRONT_MIC] == 0x12) {
12262 struct hda_input_mux *imux = &spec->private_imux;
12263 imux->items[imux->num_items].label = "Int Mic";
12264 imux->items[imux->num_items].index = 0x05;
12265 imux->num_items++;
12266 }
12267 return 0;
12268}
12171 12269
12172#ifdef CONFIG_SND_HDA_POWER_SAVE 12270#ifdef CONFIG_SND_HDA_POWER_SAVE
12173#define alc269_loopbacks alc880_loopbacks 12271#define alc269_loopbacks alc880_loopbacks
@@ -12230,6 +12328,7 @@ static int alc269_parse_auto_config(struct hda_codec *codec)
12230 spec->mixers[spec->num_mixers] = alc269_capture_mixer; 12328 spec->mixers[spec->num_mixers] = alc269_capture_mixer;
12231 spec->num_mixers++; 12329 spec->num_mixers++;
12232 12330
12331 store_pin_configs(codec);
12233 return 1; 12332 return 1;
12234} 12333}
12235 12334
@@ -13316,6 +13415,7 @@ static int alc861_parse_auto_config(struct hda_codec *codec)
13316 spec->mixers[spec->num_mixers] = alc861_capture_mixer; 13415 spec->mixers[spec->num_mixers] = alc861_capture_mixer;
13317 spec->num_mixers++; 13416 spec->num_mixers++;
13318 13417
13418 store_pin_configs(codec);
13319 return 1; 13419 return 1;
13320} 13420}
13321 13421
@@ -14427,6 +14527,7 @@ static int alc861vd_parse_auto_config(struct hda_codec *codec)
14427 if (err < 0) 14527 if (err < 0)
14428 return err; 14528 return err;
14429 14529
14530 store_pin_configs(codec);
14430 return 1; 14531 return 1;
14431} 14532}
14432 14533
@@ -16258,6 +16359,8 @@ static int alc662_parse_auto_config(struct hda_codec *codec)
16258 16359
16259 spec->mixers[spec->num_mixers] = alc662_capture_mixer; 16360 spec->mixers[spec->num_mixers] = alc662_capture_mixer;
16260 spec->num_mixers++; 16361 spec->num_mixers++;
16362
16363 store_pin_configs(codec);
16261 return 1; 16364 return 1;
16262} 16365}
16263 16366
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c
index 788fdc6f3264..9563b5bbb272 100644
--- a/sound/pci/hda/patch_sigmatel.c
+++ b/sound/pci/hda/patch_sigmatel.c
@@ -36,9 +36,11 @@
36#include "hda_beep.h" 36#include "hda_beep.h"
37 37
38#define NUM_CONTROL_ALLOC 32 38#define NUM_CONTROL_ALLOC 32
39
40#define STAC_VREF_EVENT 0x00
41#define STAC_INSERT_EVENT 0x10
39#define STAC_PWR_EVENT 0x20 42#define STAC_PWR_EVENT 0x20
40#define STAC_HP_EVENT 0x30 43#define STAC_HP_EVENT 0x30
41#define STAC_VREF_EVENT 0x40
42 44
43enum { 45enum {
44 STAC_REF, 46 STAC_REF,
@@ -69,6 +71,7 @@ enum {
69enum { 71enum {
70 STAC_92HD73XX_REF, 72 STAC_92HD73XX_REF,
71 STAC_DELL_M6, 73 STAC_DELL_M6,
74 STAC_DELL_EQ,
72 STAC_92HD73XX_MODELS 75 STAC_92HD73XX_MODELS
73}; 76};
74 77
@@ -211,7 +214,7 @@ struct sigmatel_spec {
211 /* i/o switches */ 214 /* i/o switches */
212 unsigned int io_switch[2]; 215 unsigned int io_switch[2];
213 unsigned int clfe_swap; 216 unsigned int clfe_swap;
214 unsigned int hp_switch; 217 unsigned int hp_switch; /* NID of HP as line-out */
215 unsigned int aloopback; 218 unsigned int aloopback;
216 219
217 struct hda_pcm pcm_rec[2]; /* PCM information */ 220 struct hda_pcm pcm_rec[2]; /* PCM information */
@@ -566,10 +569,8 @@ static int stac92xx_smux_enum_put(struct snd_kcontrol *kcontrol,
566 nid = codec->slave_dig_outs[smux_idx - 1]; 569 nid = codec->slave_dig_outs[smux_idx - 1];
567 if (spec->cur_smux[smux_idx] == smux->num_items - 1) 570 if (spec->cur_smux[smux_idx] == smux->num_items - 1)
568 val = AMP_OUT_MUTE; 571 val = AMP_OUT_MUTE;
569 if (smux_idx == 0)
570 nid = spec->multiout.dig_out_nid;
571 else 572 else
572 nid = codec->slave_dig_outs[smux_idx - 1]; 573 val = AMP_OUT_UNMUTE;
573 /* un/mute SPDIF out */ 574 /* un/mute SPDIF out */
574 snd_hda_codec_write_cache(codec, nid, 0, 575 snd_hda_codec_write_cache(codec, nid, 0,
575 AC_VERB_SET_AMP_GAIN_MUTE, val); 576 AC_VERB_SET_AMP_GAIN_MUTE, val);
@@ -775,9 +776,7 @@ static struct hda_verb dell_eq_core_init[] = {
775}; 776};
776 777
777static struct hda_verb dell_m6_core_init[] = { 778static struct hda_verb dell_m6_core_init[] = {
778 /* set master volume to max value without distortion 779 { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
779 * and direct control */
780 { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xec},
781 /* setup audio connections */ 780 /* setup audio connections */
782 { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00}, 781 { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},
783 { 0x0a, AC_VERB_SET_CONNECT_SEL, 0x01}, 782 { 0x0a, AC_VERB_SET_CONNECT_SEL, 0x01},
@@ -1602,11 +1601,13 @@ static unsigned int dell_m6_pin_configs[13] = {
1602static unsigned int *stac92hd73xx_brd_tbl[STAC_92HD73XX_MODELS] = { 1601static unsigned int *stac92hd73xx_brd_tbl[STAC_92HD73XX_MODELS] = {
1603 [STAC_92HD73XX_REF] = ref92hd73xx_pin_configs, 1602 [STAC_92HD73XX_REF] = ref92hd73xx_pin_configs,
1604 [STAC_DELL_M6] = dell_m6_pin_configs, 1603 [STAC_DELL_M6] = dell_m6_pin_configs,
1604 [STAC_DELL_EQ] = dell_m6_pin_configs,
1605}; 1605};
1606 1606
1607static const char *stac92hd73xx_models[STAC_92HD73XX_MODELS] = { 1607static const char *stac92hd73xx_models[STAC_92HD73XX_MODELS] = {
1608 [STAC_92HD73XX_REF] = "ref", 1608 [STAC_92HD73XX_REF] = "ref",
1609 [STAC_DELL_M6] = "dell-m6", 1609 [STAC_DELL_M6] = "dell-m6",
1610 [STAC_DELL_EQ] = "dell-eq",
1610}; 1611};
1611 1612
1612static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = { 1613static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = {
@@ -1687,6 +1688,10 @@ static struct snd_pci_quirk stac92hd71bxx_cfg_tbl[] = {
1687 /* SigmaTel reference board */ 1688 /* SigmaTel reference board */
1688 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, 1689 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1689 "DFI LanParty", STAC_92HD71BXX_REF), 1690 "DFI LanParty", STAC_92HD71BXX_REF),
1691 SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30f2,
1692 "HP dv5", STAC_HP_M4),
1693 SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30f4,
1694 "HP dv7", STAC_HP_M4),
1690 SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361a, 1695 SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361a,
1691 "unknown HP", STAC_HP_M4), 1696 "unknown HP", STAC_HP_M4),
1692 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0233, 1697 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0233,
@@ -2444,7 +2449,7 @@ static int stac92xx_hp_switch_get(struct snd_kcontrol *kcontrol,
2444 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 2449 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2445 struct sigmatel_spec *spec = codec->spec; 2450 struct sigmatel_spec *spec = codec->spec;
2446 2451
2447 ucontrol->value.integer.value[0] = spec->hp_switch; 2452 ucontrol->value.integer.value[0] = !!spec->hp_switch;
2448 return 0; 2453 return 0;
2449} 2454}
2450 2455
@@ -2453,8 +2458,9 @@ static int stac92xx_hp_switch_put(struct snd_kcontrol *kcontrol,
2453{ 2458{
2454 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 2459 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2455 struct sigmatel_spec *spec = codec->spec; 2460 struct sigmatel_spec *spec = codec->spec;
2456 2461 int nid = kcontrol->private_value;
2457 spec->hp_switch = ucontrol->value.integer.value[0]; 2462
2463 spec->hp_switch = ucontrol->value.integer.value[0] ? nid : 0;
2458 2464
2459 /* check to be sure that the ports are upto date with 2465 /* check to be sure that the ports are upto date with
2460 * switch changes 2466 * switch changes
@@ -2587,8 +2593,10 @@ static struct snd_kcontrol_new stac92xx_control_templates[] = {
2587}; 2593};
2588 2594
2589/* add dynamic controls */ 2595/* add dynamic controls */
2590static int stac92xx_add_control_idx(struct sigmatel_spec *spec, int type, 2596static int stac92xx_add_control_temp(struct sigmatel_spec *spec,
2591 int idx, const char *name, unsigned long val) 2597 struct snd_kcontrol_new *ktemp,
2598 int idx, const char *name,
2599 unsigned long val)
2592{ 2600{
2593 struct snd_kcontrol_new *knew; 2601 struct snd_kcontrol_new *knew;
2594 2602
@@ -2607,20 +2615,29 @@ static int stac92xx_add_control_idx(struct sigmatel_spec *spec, int type,
2607 } 2615 }
2608 2616
2609 knew = &spec->kctl_alloc[spec->num_kctl_used]; 2617 knew = &spec->kctl_alloc[spec->num_kctl_used];
2610 *knew = stac92xx_control_templates[type]; 2618 *knew = *ktemp;
2611 knew->index = idx; 2619 knew->index = idx;
2612 knew->name = kstrdup(name, GFP_KERNEL); 2620 knew->name = kstrdup(name, GFP_KERNEL);
2613 if (! knew->name) 2621 if (!knew->name)
2614 return -ENOMEM; 2622 return -ENOMEM;
2615 knew->private_value = val; 2623 knew->private_value = val;
2616 spec->num_kctl_used++; 2624 spec->num_kctl_used++;
2617 return 0; 2625 return 0;
2618} 2626}
2619 2627
2628static inline int stac92xx_add_control_idx(struct sigmatel_spec *spec,
2629 int type, int idx, const char *name,
2630 unsigned long val)
2631{
2632 return stac92xx_add_control_temp(spec,
2633 &stac92xx_control_templates[type],
2634 idx, name, val);
2635}
2636
2620 2637
2621/* add dynamic controls */ 2638/* add dynamic controls */
2622static int stac92xx_add_control(struct sigmatel_spec *spec, int type, 2639static inline int stac92xx_add_control(struct sigmatel_spec *spec, int type,
2623 const char *name, unsigned long val) 2640 const char *name, unsigned long val)
2624{ 2641{
2625 return stac92xx_add_control_idx(spec, type, 0, name, val); 2642 return stac92xx_add_control_idx(spec, type, 0, name, val);
2626} 2643}
@@ -2863,7 +2880,8 @@ static int stac92xx_auto_create_multi_out_ctls(struct hda_codec *codec,
2863 if (cfg->hp_outs > 1) { 2880 if (cfg->hp_outs > 1) {
2864 err = stac92xx_add_control(spec, 2881 err = stac92xx_add_control(spec,
2865 STAC_CTL_WIDGET_HP_SWITCH, 2882 STAC_CTL_WIDGET_HP_SWITCH,
2866 "Headphone as Line Out Switch", 0); 2883 "Headphone as Line Out Switch",
2884 cfg->hp_pins[cfg->hp_outs - 1]);
2867 if (err < 0) 2885 if (err < 0)
2868 return err; 2886 return err;
2869 } 2887 }
@@ -3061,6 +3079,43 @@ static int stac92xx_auto_create_beep_ctls(struct hda_codec *codec,
3061 return 0; 3079 return 0;
3062} 3080}
3063 3081
3082#ifdef CONFIG_SND_HDA_INPUT_BEEP
3083#define stac92xx_dig_beep_switch_info snd_ctl_boolean_mono_info
3084
3085static int stac92xx_dig_beep_switch_get(struct snd_kcontrol *kcontrol,
3086 struct snd_ctl_elem_value *ucontrol)
3087{
3088 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3089 ucontrol->value.integer.value[0] = codec->beep->enabled;
3090 return 0;
3091}
3092
3093static int stac92xx_dig_beep_switch_put(struct snd_kcontrol *kcontrol,
3094 struct snd_ctl_elem_value *ucontrol)
3095{
3096 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3097 int enabled = !!ucontrol->value.integer.value[0];
3098 if (codec->beep->enabled != enabled) {
3099 codec->beep->enabled = enabled;
3100 return 1;
3101 }
3102 return 0;
3103}
3104
3105static struct snd_kcontrol_new stac92xx_dig_beep_ctrl = {
3106 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3107 .info = stac92xx_dig_beep_switch_info,
3108 .get = stac92xx_dig_beep_switch_get,
3109 .put = stac92xx_dig_beep_switch_put,
3110};
3111
3112static int stac92xx_beep_switch_ctl(struct hda_codec *codec)
3113{
3114 return stac92xx_add_control_temp(codec->spec, &stac92xx_dig_beep_ctrl,
3115 0, "PC Beep Playback Switch", 0);
3116}
3117#endif
3118
3064static int stac92xx_auto_create_mux_input_ctls(struct hda_codec *codec) 3119static int stac92xx_auto_create_mux_input_ctls(struct hda_codec *codec)
3065{ 3120{
3066 struct sigmatel_spec *spec = codec->spec; 3121 struct sigmatel_spec *spec = codec->spec;
@@ -3367,6 +3422,7 @@ static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out
3367#ifdef CONFIG_SND_HDA_INPUT_BEEP 3422#ifdef CONFIG_SND_HDA_INPUT_BEEP
3368 if (spec->digbeep_nid > 0) { 3423 if (spec->digbeep_nid > 0) {
3369 hda_nid_t nid = spec->digbeep_nid; 3424 hda_nid_t nid = spec->digbeep_nid;
3425 unsigned int caps;
3370 3426
3371 err = stac92xx_auto_create_beep_ctls(codec, nid); 3427 err = stac92xx_auto_create_beep_ctls(codec, nid);
3372 if (err < 0) 3428 if (err < 0)
@@ -3374,6 +3430,14 @@ static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out
3374 err = snd_hda_attach_beep_device(codec, nid); 3430 err = snd_hda_attach_beep_device(codec, nid);
3375 if (err < 0) 3431 if (err < 0)
3376 return err; 3432 return err;
3433 /* if no beep switch is available, make its own one */
3434 caps = query_amp_caps(codec, nid, HDA_OUTPUT);
3435 if (codec->beep &&
3436 !((caps & AC_AMPCAP_MUTE) >> AC_AMPCAP_MUTE_SHIFT)) {
3437 err = stac92xx_beep_switch_ctl(codec);
3438 if (err < 0)
3439 return err;
3440 }
3377 } 3441 }
3378#endif 3442#endif
3379 3443
@@ -3531,6 +3595,12 @@ static int stac9200_parse_auto_config(struct hda_codec *codec)
3531 if ((err = stac9200_auto_create_lfe_ctls(codec, &spec->autocfg)) < 0) 3595 if ((err = stac9200_auto_create_lfe_ctls(codec, &spec->autocfg)) < 0)
3532 return err; 3596 return err;
3533 3597
3598 if (spec->num_muxes > 0) {
3599 err = stac92xx_auto_create_mux_input_ctls(codec);
3600 if (err < 0)
3601 return err;
3602 }
3603
3534 if (spec->autocfg.dig_out_pin) 3604 if (spec->autocfg.dig_out_pin)
3535 spec->multiout.dig_out_nid = 0x05; 3605 spec->multiout.dig_out_nid = 0x05;
3536 if (spec->autocfg.dig_in_pin) 3606 if (spec->autocfg.dig_in_pin)
@@ -3648,14 +3718,18 @@ static int stac92xx_init(struct hda_codec *codec)
3648 for (i = 0; i < AUTO_PIN_LAST; i++) { 3718 for (i = 0; i < AUTO_PIN_LAST; i++) {
3649 hda_nid_t nid = cfg->input_pins[i]; 3719 hda_nid_t nid = cfg->input_pins[i];
3650 if (nid) { 3720 if (nid) {
3651 unsigned int pinctl = snd_hda_codec_read(codec, nid, 3721 unsigned int pinctl;
3652 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0); 3722 if (i == AUTO_PIN_MIC || i == AUTO_PIN_FRONT_MIC) {
3653 /* if PINCTL already set then skip */ 3723 /* for mic pins, force to initialize */
3654 if (pinctl & AC_PINCAP_IN) 3724 pinctl = stac92xx_get_vref(codec, nid);
3655 continue; 3725 } else {
3656 pinctl = AC_PINCTL_IN_EN; 3726 pinctl = snd_hda_codec_read(codec, nid, 0,
3657 if (i == AUTO_PIN_MIC || i == AUTO_PIN_FRONT_MIC) 3727 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3658 pinctl |= stac92xx_get_vref(codec, nid); 3728 /* if PINCTL already set then skip */
3729 if (pinctl & AC_PINCTL_IN_EN)
3730 continue;
3731 }
3732 pinctl |= AC_PINCTL_IN_EN;
3659 stac92xx_auto_set_pinctl(codec, nid, pinctl); 3733 stac92xx_auto_set_pinctl(codec, nid, pinctl);
3660 } 3734 }
3661 } 3735 }
@@ -3777,11 +3851,30 @@ static int get_hp_pin_presence(struct hda_codec *codec, hda_nid_t nid)
3777 return 0; 3851 return 0;
3778} 3852}
3779 3853
3854/* return non-zero if the hp-pin of the given array index isn't
3855 * a jack-detection target
3856 */
3857static int no_hp_sensing(struct sigmatel_spec *spec, int i)
3858{
3859 struct auto_pin_cfg *cfg = &spec->autocfg;
3860
3861 /* ignore sensing of shared line and mic jacks */
3862 if (spec->line_switch &&
3863 cfg->hp_pins[i] == cfg->input_pins[AUTO_PIN_LINE])
3864 return 1;
3865 if (spec->mic_switch &&
3866 cfg->hp_pins[i] == cfg->input_pins[AUTO_PIN_MIC])
3867 return 1;
3868 /* ignore if the pin is set as line-out */
3869 if (cfg->hp_pins[i] == spec->hp_switch)
3870 return 1;
3871 return 0;
3872}
3873
3780static void stac92xx_hp_detect(struct hda_codec *codec, unsigned int res) 3874static void stac92xx_hp_detect(struct hda_codec *codec, unsigned int res)
3781{ 3875{
3782 struct sigmatel_spec *spec = codec->spec; 3876 struct sigmatel_spec *spec = codec->spec;
3783 struct auto_pin_cfg *cfg = &spec->autocfg; 3877 struct auto_pin_cfg *cfg = &spec->autocfg;
3784 int nid = cfg->hp_pins[cfg->hp_outs - 1];
3785 int i, presence; 3878 int i, presence;
3786 3879
3787 presence = 0; 3880 presence = 0;
@@ -3792,15 +3885,16 @@ static void stac92xx_hp_detect(struct hda_codec *codec, unsigned int res)
3792 for (i = 0; i < cfg->hp_outs; i++) { 3885 for (i = 0; i < cfg->hp_outs; i++) {
3793 if (presence) 3886 if (presence)
3794 break; 3887 break;
3795 if (spec->hp_switch && cfg->hp_pins[i] == nid) 3888 if (no_hp_sensing(spec, i))
3796 break; 3889 continue;
3797 presence = get_hp_pin_presence(codec, cfg->hp_pins[i]); 3890 presence = get_hp_pin_presence(codec, cfg->hp_pins[i]);
3798 } 3891 }
3799 3892
3800 if (presence) { 3893 if (presence) {
3801 /* disable lineouts, enable hp */ 3894 /* disable lineouts */
3802 if (spec->hp_switch) 3895 if (spec->hp_switch)
3803 stac92xx_reset_pinctl(codec, nid, AC_PINCTL_OUT_EN); 3896 stac92xx_reset_pinctl(codec, spec->hp_switch,
3897 AC_PINCTL_OUT_EN);
3804 for (i = 0; i < cfg->line_outs; i++) 3898 for (i = 0; i < cfg->line_outs; i++)
3805 stac92xx_reset_pinctl(codec, cfg->line_out_pins[i], 3899 stac92xx_reset_pinctl(codec, cfg->line_out_pins[i],
3806 AC_PINCTL_OUT_EN); 3900 AC_PINCTL_OUT_EN);
@@ -3812,9 +3906,10 @@ static void stac92xx_hp_detect(struct hda_codec *codec, unsigned int res)
3812 spec->gpio_dir, spec->gpio_data & 3906 spec->gpio_dir, spec->gpio_data &
3813 ~spec->eapd_mask); 3907 ~spec->eapd_mask);
3814 } else { 3908 } else {
3815 /* enable lineouts, disable hp */ 3909 /* enable lineouts */
3816 if (spec->hp_switch) 3910 if (spec->hp_switch)
3817 stac92xx_set_pinctl(codec, nid, AC_PINCTL_OUT_EN); 3911 stac92xx_set_pinctl(codec, spec->hp_switch,
3912 AC_PINCTL_OUT_EN);
3818 for (i = 0; i < cfg->line_outs; i++) 3913 for (i = 0; i < cfg->line_outs; i++)
3819 stac92xx_set_pinctl(codec, cfg->line_out_pins[i], 3914 stac92xx_set_pinctl(codec, cfg->line_out_pins[i],
3820 AC_PINCTL_OUT_EN); 3915 AC_PINCTL_OUT_EN);
@@ -3826,8 +3921,16 @@ static void stac92xx_hp_detect(struct hda_codec *codec, unsigned int res)
3826 spec->gpio_dir, spec->gpio_data | 3921 spec->gpio_dir, spec->gpio_data |
3827 spec->eapd_mask); 3922 spec->eapd_mask);
3828 } 3923 }
3829 if (!spec->hp_switch && cfg->hp_outs > 1 && presence) 3924 /* toggle hp outs */
3830 stac92xx_set_pinctl(codec, nid, AC_PINCTL_OUT_EN); 3925 for (i = 0; i < cfg->hp_outs; i++) {
3926 unsigned int val = AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN;
3927 if (no_hp_sensing(spec, i))
3928 continue;
3929 if (presence)
3930 stac92xx_set_pinctl(codec, cfg->hp_pins[i], val);
3931 else
3932 stac92xx_reset_pinctl(codec, cfg->hp_pins[i], val);
3933 }
3831} 3934}
3832 3935
3833static void stac92xx_pin_sense(struct hda_codec *codec, int idx) 3936static void stac92xx_pin_sense(struct hda_codec *codec, int idx)
@@ -4133,12 +4236,17 @@ again:
4133 sizeof(stac92hd73xx_dmux)); 4236 sizeof(stac92hd73xx_dmux));
4134 4237
4135 switch (spec->board_config) { 4238 switch (spec->board_config) {
4136 case STAC_DELL_M6: 4239 case STAC_DELL_EQ:
4137 spec->init = dell_eq_core_init; 4240 spec->init = dell_eq_core_init;
4241 /* fallthru */
4242 case STAC_DELL_M6:
4138 spec->num_smuxes = 0; 4243 spec->num_smuxes = 0;
4139 spec->mixer = &stac92hd73xx_6ch_mixer[DELL_M6_MIXER]; 4244 spec->mixer = &stac92hd73xx_6ch_mixer[DELL_M6_MIXER];
4140 spec->amp_nids = &stac92hd73xx_amp_nids[DELL_M6_AMP]; 4245 spec->amp_nids = &stac92hd73xx_amp_nids[DELL_M6_AMP];
4141 spec->num_amps = 1; 4246 spec->num_amps = 1;
4247
4248 if (!spec->init)
4249 spec->init = dell_m6_core_init;
4142 switch (codec->subsystem_id) { 4250 switch (codec->subsystem_id) {
4143 case 0x1028025e: /* Analog Mics */ 4251 case 0x1028025e: /* Analog Mics */
4144 case 0x1028025f: 4252 case 0x1028025f:
@@ -4148,8 +4256,6 @@ again:
4148 break; 4256 break;
4149 case 0x10280271: /* Digital Mics */ 4257 case 0x10280271: /* Digital Mics */
4150 case 0x10280272: 4258 case 0x10280272:
4151 spec->init = dell_m6_core_init;
4152 /* fall-through */
4153 case 0x10280254: 4259 case 0x10280254:
4154 case 0x10280255: 4260 case 0x10280255:
4155 stac92xx_set_config_reg(codec, 0x13, 0x90A60160); 4261 stac92xx_set_config_reg(codec, 0x13, 0x90A60160);
@@ -4376,6 +4482,13 @@ again:
4376 stac92xx_set_config_regs(codec); 4482 stac92xx_set_config_regs(codec);
4377 } 4483 }
4378 4484
4485 if (spec->board_config > STAC_92HD71BXX_REF) {
4486 /* GPIO0 = EAPD */
4487 spec->gpio_mask = 0x01;
4488 spec->gpio_dir = 0x01;
4489 spec->gpio_data = 0x01;
4490 }
4491
4379 switch (codec->vendor_id) { 4492 switch (codec->vendor_id) {
4380 case 0x111d76b6: /* 4 Port without Analog Mixer */ 4493 case 0x111d76b6: /* 4 Port without Analog Mixer */
4381 case 0x111d76b7: 4494 case 0x111d76b7:
@@ -4386,10 +4499,10 @@ again:
4386 codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs; 4499 codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs;
4387 break; 4500 break;
4388 case 0x111d7608: /* 5 Port with Analog Mixer */ 4501 case 0x111d7608: /* 5 Port with Analog Mixer */
4389 switch (codec->subsystem_id) { 4502 switch (spec->board_config) {
4390 case 0x103c361a: 4503 case STAC_HP_M4:
4391 /* Enable VREF power saving on GPIO1 detect */ 4504 /* Enable VREF power saving on GPIO1 detect */
4392 snd_hda_codec_write(codec, codec->afg, 0, 4505 snd_hda_codec_write_cache(codec, codec->afg, 0,
4393 AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x02); 4506 AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x02);
4394 snd_hda_codec_write_cache(codec, codec->afg, 0, 4507 snd_hda_codec_write_cache(codec, codec->afg, 0,
4395 AC_VERB_SET_UNSOLICITED_ENABLE, 4508 AC_VERB_SET_UNSOLICITED_ENABLE,
@@ -4435,13 +4548,6 @@ again:
4435 spec->aloopback_mask = 0x50; 4548 spec->aloopback_mask = 0x50;
4436 spec->aloopback_shift = 0; 4549 spec->aloopback_shift = 0;
4437 4550
4438 if (spec->board_config > STAC_92HD71BXX_REF) {
4439 /* GPIO0 = EAPD */
4440 spec->gpio_mask = 0x01;
4441 spec->gpio_dir = 0x01;
4442 spec->gpio_data = 0x01;
4443 }
4444
4445 spec->powerdown_adcs = 1; 4551 spec->powerdown_adcs = 1;
4446 spec->digbeep_nid = 0x26; 4552 spec->digbeep_nid = 0x26;
4447 spec->mux_nids = stac92hd71bxx_mux_nids; 4553 spec->mux_nids = stac92hd71bxx_mux_nids;
@@ -4789,7 +4895,7 @@ static int patch_stac9205(struct hda_codec *codec)
4789 stac92xx_set_config_reg(codec, 0x20, 0x1c410030); 4895 stac92xx_set_config_reg(codec, 0x20, 0x1c410030);
4790 4896
4791 /* Enable unsol response for GPIO4/Dock HP connection */ 4897 /* Enable unsol response for GPIO4/Dock HP connection */
4792 snd_hda_codec_write(codec, codec->afg, 0, 4898 snd_hda_codec_write_cache(codec, codec->afg, 0,
4793 AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x10); 4899 AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x10);
4794 snd_hda_codec_write_cache(codec, codec->afg, 0, 4900 snd_hda_codec_write_cache(codec, codec->afg, 0,
4795 AC_VERB_SET_UNSOLICITED_ENABLE, 4901 AC_VERB_SET_UNSOLICITED_ENABLE,
diff --git a/sound/pci/ice1712/ice1712.c b/sound/pci/ice1712/ice1712.c
index 5b442383fcda..58d7cda03de5 100644
--- a/sound/pci/ice1712/ice1712.c
+++ b/sound/pci/ice1712/ice1712.c
@@ -2688,12 +2688,13 @@ static int __devinit snd_ice1712_probe(struct pci_dev *pci,
2688 return err; 2688 return err;
2689 } 2689 }
2690 2690
2691 if (ice_has_con_ac97(ice)) 2691 if (ice_has_con_ac97(ice)) {
2692 err = snd_ice1712_pcm(ice, pcm_dev++, NULL); 2692 err = snd_ice1712_pcm(ice, pcm_dev++, NULL);
2693 if (err < 0) { 2693 if (err < 0) {
2694 snd_card_free(card); 2694 snd_card_free(card);
2695 return err; 2695 return err;
2696 } 2696 }
2697 }
2697 2698
2698 err = snd_ice1712_ac97_mixer(ice); 2699 err = snd_ice1712_ac97_mixer(ice);
2699 if (err < 0) { 2700 if (err < 0) {
@@ -2715,12 +2716,13 @@ static int __devinit snd_ice1712_probe(struct pci_dev *pci,
2715 } 2716 }
2716 } 2717 }
2717 2718
2718 if (ice_has_con_ac97(ice)) 2719 if (ice_has_con_ac97(ice)) {
2719 err = snd_ice1712_pcm_ds(ice, pcm_dev++, NULL); 2720 err = snd_ice1712_pcm_ds(ice, pcm_dev++, NULL);
2720 if (err < 0) { 2721 if (err < 0) {
2721 snd_card_free(card); 2722 snd_card_free(card);
2722 return err; 2723 return err;
2723 } 2724 }
2725 }
2724 2726
2725 if (!c->no_mpu401) { 2727 if (!c->no_mpu401) {
2726 err = snd_mpu401_uart_new(card, 0, MPU401_HW_ICE1712, 2728 err = snd_mpu401_uart_new(card, 0, MPU401_HW_ICE1712,
diff --git a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c
index c88d1eace1c4..19d3391e229f 100644
--- a/sound/pci/intel8x0.c
+++ b/sound/pci/intel8x0.c
@@ -2702,6 +2702,7 @@ static struct snd_pci_quirk intel8x0_clock_list[] __devinitdata = {
2702 SND_PCI_QUIRK(0x0e11, 0x008a, "AD1885", 41000), 2702 SND_PCI_QUIRK(0x0e11, 0x008a, "AD1885", 41000),
2703 SND_PCI_QUIRK(0x1028, 0x00be, "AD1885", 44100), 2703 SND_PCI_QUIRK(0x1028, 0x00be, "AD1885", 44100),
2704 SND_PCI_QUIRK(0x1028, 0x0177, "AD1980", 48000), 2704 SND_PCI_QUIRK(0x1028, 0x0177, "AD1980", 48000),
2705 SND_PCI_QUIRK(0x1028, 0x01ad, "AD1981B", 48000),
2705 SND_PCI_QUIRK(0x1043, 0x80f3, "AD1985", 48000), 2706 SND_PCI_QUIRK(0x1043, 0x80f3, "AD1985", 48000),
2706 { } /* terminator */ 2707 { } /* terminator */
2707}; 2708};
diff --git a/sound/pci/mixart/mixart.c b/sound/pci/mixart/mixart.c
index 2d0dce649a64..ae7601f353a7 100644
--- a/sound/pci/mixart/mixart.c
+++ b/sound/pci/mixart/mixart.c
@@ -1314,8 +1314,7 @@ static int __devinit snd_mixart_probe(struct pci_dev *pci,
1314 } 1314 }
1315 for (i = 0; i < 2; i++) { 1315 for (i = 0; i < 2; i++) {
1316 mgr->mem[i].phys = pci_resource_start(pci, i); 1316 mgr->mem[i].phys = pci_resource_start(pci, i);
1317 mgr->mem[i].virt = ioremap_nocache(mgr->mem[i].phys, 1317 mgr->mem[i].virt = pci_ioremap_bar(pci, i);
1318 pci_resource_len(pci, i));
1319 if (!mgr->mem[i].virt) { 1318 if (!mgr->mem[i].virt) {
1320 printk(KERN_ERR "unable to remap resource 0x%lx\n", 1319 printk(KERN_ERR "unable to remap resource 0x%lx\n",
1321 mgr->mem[i].phys); 1320 mgr->mem[i].phys);
diff --git a/sound/pci/pcxhr/pcxhr.c b/sound/pci/pcxhr/pcxhr.c
index 0e06c6c9fcc0..73de6e989b3d 100644
--- a/sound/pci/pcxhr/pcxhr.c
+++ b/sound/pci/pcxhr/pcxhr.c
@@ -1229,8 +1229,11 @@ static int __devinit pcxhr_probe(struct pci_dev *pci, const struct pci_device_id
1229 return -ENOMEM; 1229 return -ENOMEM;
1230 } 1230 }
1231 1231
1232 if (snd_BUG_ON(pci_id->driver_data >= PCI_ID_LAST)) 1232 if (snd_BUG_ON(pci_id->driver_data >= PCI_ID_LAST)) {
1233 kfree(mgr);
1234 pci_disable_device(pci);
1233 return -ENODEV; 1235 return -ENODEV;
1236 }
1234 card_name = pcxhr_board_params[pci_id->driver_data].board_name; 1237 card_name = pcxhr_board_params[pci_id->driver_data].board_name;
1235 mgr->playback_chips = pcxhr_board_params[pci_id->driver_data].playback_chips; 1238 mgr->playback_chips = pcxhr_board_params[pci_id->driver_data].playback_chips;
1236 mgr->capture_chips = pcxhr_board_params[pci_id->driver_data].capture_chips; 1239 mgr->capture_chips = pcxhr_board_params[pci_id->driver_data].capture_chips;
diff --git a/sound/pci/rme9652/hdsp.c b/sound/pci/rme9652/hdsp.c
index d723543beadd..736246f98acc 100644
--- a/sound/pci/rme9652/hdsp.c
+++ b/sound/pci/rme9652/hdsp.c
@@ -4548,11 +4548,20 @@ static int snd_hdsp_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigne
4548{ 4548{
4549 struct hdsp *hdsp = (struct hdsp *)hw->private_data; 4549 struct hdsp *hdsp = (struct hdsp *)hw->private_data;
4550 void __user *argp = (void __user *)arg; 4550 void __user *argp = (void __user *)arg;
4551 int err;
4551 4552
4552 switch (cmd) { 4553 switch (cmd) {
4553 case SNDRV_HDSP_IOCTL_GET_PEAK_RMS: { 4554 case SNDRV_HDSP_IOCTL_GET_PEAK_RMS: {
4554 struct hdsp_peak_rms __user *peak_rms = (struct hdsp_peak_rms __user *)arg; 4555 struct hdsp_peak_rms __user *peak_rms = (struct hdsp_peak_rms __user *)arg;
4555 4556
4557 err = hdsp_check_for_iobox(hdsp);
4558 if (err < 0)
4559 return err;
4560
4561 err = hdsp_check_for_firmware(hdsp, 1);
4562 if (err < 0)
4563 return err;
4564
4556 if (!(hdsp->state & HDSP_FirmwareLoaded)) { 4565 if (!(hdsp->state & HDSP_FirmwareLoaded)) {
4557 snd_printk(KERN_ERR "Hammerfall-DSP: firmware needs to be uploaded to the card.\n"); 4566 snd_printk(KERN_ERR "Hammerfall-DSP: firmware needs to be uploaded to the card.\n");
4558 return -EINVAL; 4567 return -EINVAL;
@@ -4572,10 +4581,14 @@ static int snd_hdsp_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigne
4572 unsigned long flags; 4581 unsigned long flags;
4573 int i; 4582 int i;
4574 4583
4575 if (!(hdsp->state & HDSP_FirmwareLoaded)) { 4584 err = hdsp_check_for_iobox(hdsp);
4576 snd_printk(KERN_ERR "Hammerfall-DSP: Firmware needs to be uploaded to the card.\n"); 4585 if (err < 0)
4577 return -EINVAL; 4586 return err;
4578 } 4587
4588 err = hdsp_check_for_firmware(hdsp, 1);
4589 if (err < 0)
4590 return err;
4591
4579 spin_lock_irqsave(&hdsp->lock, flags); 4592 spin_lock_irqsave(&hdsp->lock, flags);
4580 info.pref_sync_ref = (unsigned char)hdsp_pref_sync_ref(hdsp); 4593 info.pref_sync_ref = (unsigned char)hdsp_pref_sync_ref(hdsp);
4581 info.wordclock_sync_check = (unsigned char)hdsp_wc_sync_check(hdsp); 4594 info.wordclock_sync_check = (unsigned char)hdsp_wc_sync_check(hdsp);
@@ -5045,6 +5058,10 @@ static int __devinit snd_hdsp_create(struct snd_card *card,
5045 /* we wait 2 seconds to let freshly inserted cardbus cards do their hardware init */ 5058 /* we wait 2 seconds to let freshly inserted cardbus cards do their hardware init */
5046 ssleep(2); 5059 ssleep(2);
5047 5060
5061 err = hdsp_check_for_iobox(hdsp);
5062 if (err < 0)
5063 return err;
5064
5048 if ((hdsp_read (hdsp, HDSP_statusRegister) & HDSP_DllError) != 0) { 5065 if ((hdsp_read (hdsp, HDSP_statusRegister) & HDSP_DllError) != 0) {
5049#ifdef HDSP_FW_LOADER 5066#ifdef HDSP_FW_LOADER
5050 if ((err = hdsp_request_fw_loader(hdsp)) < 0) 5067 if ((err = hdsp_request_fw_loader(hdsp)) < 0)
@@ -5057,7 +5074,7 @@ static int __devinit snd_hdsp_create(struct snd_card *card,
5057 /* init is complete, we return */ 5074 /* init is complete, we return */
5058 return 0; 5075 return 0;
5059#endif 5076#endif
5060 /* no iobox connected, we defer initialization */ 5077 /* we defer initialization */
5061 snd_printk(KERN_INFO "Hammerfall-DSP: card initialization pending : waiting for firmware\n"); 5078 snd_printk(KERN_INFO "Hammerfall-DSP: card initialization pending : waiting for firmware\n");
5062 if ((err = snd_hdsp_create_hwdep(card, hdsp)) < 0) 5079 if ((err = snd_hdsp_create_hwdep(card, hdsp)) < 0)
5063 return err; 5080 return err;