Commit 5ec02a1c authored by Takashi Iwai's avatar Takashi Iwai

Merge branch 'fix/hda' into topic/hda

parents 34588709 e0d32e33
...@@ -68,6 +68,7 @@ MODULE_PARM_DESC(enable, "Enable FM801 soundcard."); ...@@ -68,6 +68,7 @@ MODULE_PARM_DESC(enable, "Enable FM801 soundcard.");
module_param_array(tea575x_tuner, int, NULL, 0444); module_param_array(tea575x_tuner, int, NULL, 0444);
MODULE_PARM_DESC(tea575x_tuner, "TEA575x tuner access method (0 = auto, 1 = SF256-PCS, 2=SF256-PCP, 3=SF64-PCR, 8=disable, +16=tuner-only)."); MODULE_PARM_DESC(tea575x_tuner, "TEA575x tuner access method (0 = auto, 1 = SF256-PCS, 2=SF256-PCP, 3=SF64-PCR, 8=disable, +16=tuner-only).");
#define TUNER_DISABLED (1<<3)
#define TUNER_ONLY (1<<4) #define TUNER_ONLY (1<<4)
#define TUNER_TYPE_MASK (~TUNER_ONLY & 0xFFFF) #define TUNER_TYPE_MASK (~TUNER_ONLY & 0xFFFF)
...@@ -1150,7 +1151,8 @@ static int snd_fm801_free(struct fm801 *chip) ...@@ -1150,7 +1151,8 @@ static int snd_fm801_free(struct fm801 *chip)
__end_hw: __end_hw:
#ifdef CONFIG_SND_FM801_TEA575X_BOOL #ifdef CONFIG_SND_FM801_TEA575X_BOOL
snd_tea575x_exit(&chip->tea); if (!(chip->tea575x_tuner & TUNER_DISABLED))
snd_tea575x_exit(&chip->tea);
#endif #endif
if (chip->irq >= 0) if (chip->irq >= 0)
free_irq(chip->irq, chip); free_irq(chip->irq, chip);
...@@ -1236,7 +1238,6 @@ static int __devinit snd_fm801_create(struct snd_card *card, ...@@ -1236,7 +1238,6 @@ static int __devinit snd_fm801_create(struct snd_card *card,
(tea575x_tuner & TUNER_TYPE_MASK) < 4) { (tea575x_tuner & TUNER_TYPE_MASK) < 4) {
if (snd_tea575x_init(&chip->tea)) { if (snd_tea575x_init(&chip->tea)) {
snd_printk(KERN_ERR "TEA575x radio not found\n"); snd_printk(KERN_ERR "TEA575x radio not found\n");
snd_fm801_free(chip);
return -ENODEV; return -ENODEV;
} }
} else if ((tea575x_tuner & TUNER_TYPE_MASK) == 0) { } else if ((tea575x_tuner & TUNER_TYPE_MASK) == 0) {
...@@ -1251,11 +1252,15 @@ static int __devinit snd_fm801_create(struct snd_card *card, ...@@ -1251,11 +1252,15 @@ static int __devinit snd_fm801_create(struct snd_card *card,
} }
if (tea575x_tuner == 4) { if (tea575x_tuner == 4) {
snd_printk(KERN_ERR "TEA575x radio not found\n"); snd_printk(KERN_ERR "TEA575x radio not found\n");
snd_fm801_free(chip); chip->tea575x_tuner = TUNER_DISABLED;
return -ENODEV;
} }
} }
strlcpy(chip->tea.card, snd_fm801_tea575x_gpios[(tea575x_tuner & TUNER_TYPE_MASK) - 1].name, sizeof(chip->tea.card)); if (!(chip->tea575x_tuner & TUNER_DISABLED)) {
strlcpy(chip->tea.card,
snd_fm801_tea575x_gpios[(tea575x_tuner &
TUNER_TYPE_MASK) - 1].name,
sizeof(chip->tea.card));
}
#endif #endif
*rchip = chip; *rchip = chip;
......
...@@ -594,6 +594,10 @@ static void alc_line_automute(struct hda_codec *codec) ...@@ -594,6 +594,10 @@ static void alc_line_automute(struct hda_codec *codec)
{ {
struct alc_spec *spec = codec->spec; struct alc_spec *spec = codec->spec;
/* check LO jack only when it's different from HP */
if (spec->autocfg.line_out_pins[0] == spec->autocfg.hp_pins[0])
return;
spec->line_jack_present = spec->line_jack_present =
detect_jacks(codec, ARRAY_SIZE(spec->autocfg.line_out_pins), detect_jacks(codec, ARRAY_SIZE(spec->autocfg.line_out_pins),
spec->autocfg.line_out_pins); spec->autocfg.line_out_pins);
...@@ -1347,7 +1351,9 @@ static int alc_subsystem_id(struct hda_codec *codec, ...@@ -1347,7 +1351,9 @@ static int alc_subsystem_id(struct hda_codec *codec,
* 15 : 1 --> enable the function "Mute internal speaker * 15 : 1 --> enable the function "Mute internal speaker
* when the external headphone out jack is plugged" * when the external headphone out jack is plugged"
*/ */
if (!spec->autocfg.hp_pins[0]) { if (!spec->autocfg.hp_pins[0] &&
!(spec->autocfg.line_out_pins[0] &&
spec->autocfg.line_out_type == AUTO_PIN_HP_OUT)) {
hda_nid_t nid; hda_nid_t nid;
tmp = (ass >> 11) & 0x3; /* HP to chassis */ tmp = (ass >> 11) & 0x3; /* HP to chassis */
if (tmp == 0) if (tmp == 0)
......
...@@ -5630,6 +5630,7 @@ static int patch_stac92hd83xxx(struct hda_codec *codec) ...@@ -5630,6 +5630,7 @@ static int patch_stac92hd83xxx(struct hda_codec *codec)
switch (codec->vendor_id) { switch (codec->vendor_id) {
case 0x111d76d1: case 0x111d76d1:
case 0x111d76d9: case 0x111d76d9:
case 0x111d76df:
case 0x111d76e5: case 0x111d76e5:
case 0x111d7666: case 0x111d7666:
case 0x111d7667: case 0x111d7667:
......
...@@ -128,7 +128,7 @@ static int snd_ad73311_configure(void) ...@@ -128,7 +128,7 @@ static int snd_ad73311_configure(void)
return 0; return 0;
} }
static int bf5xx_probe(struct platform_device *pdev) static int bf5xx_probe(struct snd_soc_card *card)
{ {
int err; int err;
if (gpio_request(GPIO_SE, "AD73311_SE")) { if (gpio_request(GPIO_SE, "AD73311_SE")) {
......
...@@ -3479,31 +3479,6 @@ int wm8962_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack) ...@@ -3479,31 +3479,6 @@ int wm8962_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack)
} }
EXPORT_SYMBOL_GPL(wm8962_mic_detect); EXPORT_SYMBOL_GPL(wm8962_mic_detect);
#ifdef CONFIG_PM
static int wm8962_resume(struct snd_soc_codec *codec)
{
u16 *reg_cache = codec->reg_cache;
int i;
/* Restore the registers */
for (i = 1; i < codec->driver->reg_cache_size; i++) {
switch (i) {
case WM8962_SOFTWARE_RESET:
continue;
default:
break;
}
if (reg_cache[i] != wm8962_reg[i])
snd_soc_write(codec, i, reg_cache[i]);
}
return 0;
}
#else
#define wm8962_resume NULL
#endif
#if defined(CONFIG_INPUT) || defined(CONFIG_INPUT_MODULE) #if defined(CONFIG_INPUT) || defined(CONFIG_INPUT_MODULE)
static int beep_rates[] = { static int beep_rates[] = {
500, 1000, 2000, 4000, 500, 1000, 2000, 4000,
...@@ -4015,7 +3990,6 @@ static int wm8962_remove(struct snd_soc_codec *codec) ...@@ -4015,7 +3990,6 @@ static int wm8962_remove(struct snd_soc_codec *codec)
static struct snd_soc_codec_driver soc_codec_dev_wm8962 = { static struct snd_soc_codec_driver soc_codec_dev_wm8962 = {
.probe = wm8962_probe, .probe = wm8962_probe,
.remove = wm8962_remove, .remove = wm8962_remove,
.resume = wm8962_resume,
.set_bias_level = wm8962_set_bias_level, .set_bias_level = wm8962_set_bias_level,
.reg_cache_size = WM8962_MAX_REGISTER + 1, .reg_cache_size = WM8962_MAX_REGISTER + 1,
.reg_word_size = sizeof(u16), .reg_word_size = sizeof(u16),
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/debugfs.h> #include <linux/debugfs.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/ctype.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <sound/ac97_codec.h> #include <sound/ac97_codec.h>
#include <sound/core.h> #include <sound/core.h>
...@@ -1434,9 +1435,20 @@ static void snd_soc_instantiate_card(struct snd_soc_card *card) ...@@ -1434,9 +1435,20 @@ static void snd_soc_instantiate_card(struct snd_soc_card *card)
"%s", card->name); "%s", card->name);
snprintf(card->snd_card->longname, sizeof(card->snd_card->longname), snprintf(card->snd_card->longname, sizeof(card->snd_card->longname),
"%s", card->long_name ? card->long_name : card->name); "%s", card->long_name ? card->long_name : card->name);
if (card->driver_name) snprintf(card->snd_card->driver, sizeof(card->snd_card->driver),
strlcpy(card->snd_card->driver, card->driver_name, "%s", card->driver_name ? card->driver_name : card->name);
sizeof(card->snd_card->driver)); for (i = 0; i < ARRAY_SIZE(card->snd_card->driver); i++) {
switch (card->snd_card->driver[i]) {
case '_':
case '-':
case '\0':
break;
default:
if (!isalnum(card->snd_card->driver[i]))
card->snd_card->driver[i] = '_';
break;
}
}
if (card->late_probe) { if (card->late_probe) {
ret = card->late_probe(card); ret = card->late_probe(card);
......
...@@ -532,6 +532,7 @@ snd_usb_audio_probe(struct usb_device *dev, ...@@ -532,6 +532,7 @@ snd_usb_audio_probe(struct usb_device *dev,
__error: __error:
if (chip && !chip->num_interfaces) if (chip && !chip->num_interfaces)
snd_card_free(chip->card); snd_card_free(chip->card);
chip->probing = 0;
mutex_unlock(&register_mutex); mutex_unlock(&register_mutex);
__err_val: __err_val:
return NULL; return NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment