diff options
| -rw-r--r-- | sound/pci/hda/hda_beep.c | 11 | ||||
| -rw-r--r-- | sound/pci/hda/hda_intel.c | 34 | ||||
| -rw-r--r-- | sound/pci/hda/patch_realtek.c | 16 | ||||
| -rw-r--r-- | sound/pci/hda/patch_sigmatel.c | 4 | ||||
| -rw-r--r-- | sound/pci/hda/patch_via.c | 89 | ||||
| -rw-r--r-- | sound/soc/codecs/wm8753.c | 6 | ||||
| -rw-r--r-- | sound/soc/fsl/mpc5200_dma.c | 1 | ||||
| -rw-r--r-- | sound/soc/fsl/mpc5200_dma.h | 1 | ||||
| -rw-r--r-- | sound/soc/fsl/mpc5200_psc_ac97.c | 17 |
9 files changed, 113 insertions, 66 deletions
diff --git a/sound/pci/hda/hda_beep.c b/sound/pci/hda/hda_beep.c index 29272f2e95a0..b0275a050870 100644 --- a/sound/pci/hda/hda_beep.c +++ b/sound/pci/hda/hda_beep.c | |||
| @@ -50,19 +50,22 @@ static void snd_hda_generate_beep(struct work_struct *work) | |||
| 50 | * The tone frequency of beep generator on IDT/STAC codecs is | 50 | * The tone frequency of beep generator on IDT/STAC codecs is |
| 51 | * defined from the 8bit tone parameter, in Hz, | 51 | * defined from the 8bit tone parameter, in Hz, |
| 52 | * freq = 48000 * (257 - tone) / 1024 | 52 | * freq = 48000 * (257 - tone) / 1024 |
| 53 | * that is from 12kHz to 93.75kHz in step of 46.875 hz | 53 | * that is from 12kHz to 93.75Hz in steps of 46.875 Hz |
| 54 | */ | 54 | */ |
| 55 | static int beep_linear_tone(struct hda_beep *beep, int hz) | 55 | static int beep_linear_tone(struct hda_beep *beep, int hz) |
| 56 | { | 56 | { |
| 57 | if (hz <= 0) | ||
| 58 | return 0; | ||
| 57 | hz *= 1000; /* fixed point */ | 59 | hz *= 1000; /* fixed point */ |
| 58 | hz = hz - DIGBEEP_HZ_MIN; | 60 | hz = hz - DIGBEEP_HZ_MIN |
| 61 | + DIGBEEP_HZ_STEP / 2; /* round to nearest step */ | ||
| 59 | if (hz < 0) | 62 | if (hz < 0) |
| 60 | hz = 0; /* turn off PC beep*/ | 63 | hz = 0; /* turn off PC beep*/ |
| 61 | else if (hz >= (DIGBEEP_HZ_MAX - DIGBEEP_HZ_MIN)) | 64 | else if (hz >= (DIGBEEP_HZ_MAX - DIGBEEP_HZ_MIN)) |
| 62 | hz = 0xff; | 65 | hz = 1; /* max frequency */ |
| 63 | else { | 66 | else { |
| 64 | hz /= DIGBEEP_HZ_STEP; | 67 | hz /= DIGBEEP_HZ_STEP; |
| 65 | hz++; | 68 | hz = 255 - hz; |
| 66 | } | 69 | } |
| 67 | return hz; | 70 | return hz; |
| 68 | } | 71 | } |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 1877d95d4aa6..77c1b840ca8b 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
| @@ -1455,6 +1455,17 @@ static int azx_pcm_open(struct snd_pcm_substream *substream) | |||
| 1455 | return err; | 1455 | return err; |
| 1456 | } | 1456 | } |
| 1457 | snd_pcm_limit_hw_rates(runtime); | 1457 | snd_pcm_limit_hw_rates(runtime); |
| 1458 | /* sanity check */ | ||
| 1459 | if (snd_BUG_ON(!runtime->hw.channels_min) || | ||
| 1460 | snd_BUG_ON(!runtime->hw.channels_max) || | ||
| 1461 | snd_BUG_ON(!runtime->hw.formats) || | ||
| 1462 | snd_BUG_ON(!runtime->hw.rates)) { | ||
| 1463 | azx_release_device(azx_dev); | ||
| 1464 | hinfo->ops.close(hinfo, apcm->codec, substream); | ||
| 1465 | snd_hda_power_down(apcm->codec); | ||
| 1466 | mutex_unlock(&chip->open_mutex); | ||
| 1467 | return -EINVAL; | ||
| 1468 | } | ||
| 1458 | spin_lock_irqsave(&chip->reg_lock, flags); | 1469 | spin_lock_irqsave(&chip->reg_lock, flags); |
| 1459 | azx_dev->substream = substream; | 1470 | azx_dev->substream = substream; |
| 1460 | azx_dev->running = 0; | 1471 | azx_dev->running = 0; |
| @@ -1463,13 +1474,6 @@ static int azx_pcm_open(struct snd_pcm_substream *substream) | |||
| 1463 | runtime->private_data = azx_dev; | 1474 | runtime->private_data = azx_dev; |
| 1464 | snd_pcm_set_sync(substream); | 1475 | snd_pcm_set_sync(substream); |
| 1465 | mutex_unlock(&chip->open_mutex); | 1476 | mutex_unlock(&chip->open_mutex); |
| 1466 | |||
| 1467 | if (snd_BUG_ON(!runtime->hw.channels_min || !runtime->hw.channels_max)) | ||
| 1468 | return -EINVAL; | ||
| 1469 | if (snd_BUG_ON(!runtime->hw.formats)) | ||
| 1470 | return -EINVAL; | ||
| 1471 | if (snd_BUG_ON(!runtime->hw.rates)) | ||
| 1472 | return -EINVAL; | ||
| 1473 | return 0; | 1477 | return 0; |
| 1474 | } | 1478 | } |
| 1475 | 1479 | ||
| @@ -2329,9 +2333,19 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci, | |||
| 2329 | gcap = azx_readw(chip, GCAP); | 2333 | gcap = azx_readw(chip, GCAP); |
| 2330 | snd_printdd(SFX "chipset global capabilities = 0x%x\n", gcap); | 2334 | snd_printdd(SFX "chipset global capabilities = 0x%x\n", gcap); |
| 2331 | 2335 | ||
| 2332 | /* ATI chips seems buggy about 64bit DMA addresses */ | 2336 | /* disable SB600 64bit support for safety */ |
| 2333 | if (chip->driver_type == AZX_DRIVER_ATI) | 2337 | if ((chip->driver_type == AZX_DRIVER_ATI) || |
| 2334 | gcap &= ~ICH6_GCAP_64OK; | 2338 | (chip->driver_type == AZX_DRIVER_ATIHDMI)) { |
| 2339 | struct pci_dev *p_smbus; | ||
| 2340 | p_smbus = pci_get_device(PCI_VENDOR_ID_ATI, | ||
| 2341 | PCI_DEVICE_ID_ATI_SBX00_SMBUS, | ||
| 2342 | NULL); | ||
| 2343 | if (p_smbus) { | ||
| 2344 | if (p_smbus->revision < 0x30) | ||
| 2345 | gcap &= ~ICH6_GCAP_64OK; | ||
| 2346 | pci_dev_put(p_smbus); | ||
| 2347 | } | ||
| 2348 | } | ||
| 2335 | 2349 | ||
| 2336 | /* allow 64bit DMA address if supported by H/W */ | 2350 | /* allow 64bit DMA address if supported by H/W */ |
| 2337 | if ((gcap & ICH6_GCAP_64OK) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64))) | 2351 | if ((gcap & ICH6_GCAP_64OK) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64))) |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index e661b21354be..bbb9b42e2604 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -6919,9 +6919,6 @@ static struct hda_verb alc882_targa_verbs[] = { | |||
| 6919 | {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ | 6919 | {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */ |
| 6920 | 6920 | ||
| 6921 | {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, | 6921 | {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, |
| 6922 | {0x01, AC_VERB_SET_GPIO_MASK, 0x03}, | ||
| 6923 | {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03}, | ||
| 6924 | {0x01, AC_VERB_SET_GPIO_DATA, 0x03}, | ||
| 6925 | { } /* end */ | 6922 | { } /* end */ |
| 6926 | }; | 6923 | }; |
| 6927 | 6924 | ||
| @@ -7241,7 +7238,8 @@ static struct alc_config_preset alc882_presets[] = { | |||
| 7241 | }, | 7238 | }, |
| 7242 | [ALC882_TARGA] = { | 7239 | [ALC882_TARGA] = { |
| 7243 | .mixers = { alc882_targa_mixer, alc882_chmode_mixer }, | 7240 | .mixers = { alc882_targa_mixer, alc882_chmode_mixer }, |
| 7244 | .init_verbs = { alc882_init_verbs, alc882_targa_verbs}, | 7241 | .init_verbs = { alc882_init_verbs, alc880_gpio3_init_verbs, |
| 7242 | alc882_targa_verbs}, | ||
| 7245 | .num_dacs = ARRAY_SIZE(alc882_dac_nids), | 7243 | .num_dacs = ARRAY_SIZE(alc882_dac_nids), |
| 7246 | .dac_nids = alc882_dac_nids, | 7244 | .dac_nids = alc882_dac_nids, |
| 7247 | .dig_out_nid = ALC882_DIGOUT_NID, | 7245 | .dig_out_nid = ALC882_DIGOUT_NID, |
| @@ -9238,7 +9236,8 @@ static struct alc_config_preset alc883_presets[] = { | |||
| 9238 | }, | 9236 | }, |
| 9239 | [ALC883_TARGA_DIG] = { | 9237 | [ALC883_TARGA_DIG] = { |
| 9240 | .mixers = { alc883_targa_mixer, alc883_chmode_mixer }, | 9238 | .mixers = { alc883_targa_mixer, alc883_chmode_mixer }, |
| 9241 | .init_verbs = { alc883_init_verbs, alc883_targa_verbs}, | 9239 | .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs, |
| 9240 | alc883_targa_verbs}, | ||
| 9242 | .num_dacs = ARRAY_SIZE(alc883_dac_nids), | 9241 | .num_dacs = ARRAY_SIZE(alc883_dac_nids), |
| 9243 | .dac_nids = alc883_dac_nids, | 9242 | .dac_nids = alc883_dac_nids, |
| 9244 | .dig_out_nid = ALC883_DIGOUT_NID, | 9243 | .dig_out_nid = ALC883_DIGOUT_NID, |
| @@ -9251,7 +9250,8 @@ static struct alc_config_preset alc883_presets[] = { | |||
| 9251 | }, | 9250 | }, |
| 9252 | [ALC883_TARGA_2ch_DIG] = { | 9251 | [ALC883_TARGA_2ch_DIG] = { |
| 9253 | .mixers = { alc883_targa_2ch_mixer}, | 9252 | .mixers = { alc883_targa_2ch_mixer}, |
| 9254 | .init_verbs = { alc883_init_verbs, alc883_targa_verbs}, | 9253 | .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs, |
| 9254 | alc883_targa_verbs}, | ||
| 9255 | .num_dacs = ARRAY_SIZE(alc883_dac_nids), | 9255 | .num_dacs = ARRAY_SIZE(alc883_dac_nids), |
| 9256 | .dac_nids = alc883_dac_nids, | 9256 | .dac_nids = alc883_dac_nids, |
| 9257 | .adc_nids = alc883_adc_nids_alt, | 9257 | .adc_nids = alc883_adc_nids_alt, |
| @@ -12878,9 +12878,9 @@ static struct snd_kcontrol_new alc269_lifebook_mixer[] = { | |||
| 12878 | 12878 | ||
| 12879 | static struct snd_kcontrol_new alc269_eeepc_mixer[] = { | 12879 | static struct snd_kcontrol_new alc269_eeepc_mixer[] = { |
| 12880 | HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), | 12880 | HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), |
| 12881 | HDA_CODEC_MUTE("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT), | 12881 | HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT), |
| 12882 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), | 12882 | HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), |
| 12883 | HDA_CODEC_MUTE("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT), | 12883 | HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT), |
| 12884 | { } /* end */ | 12884 | { } /* end */ |
| 12885 | }; | 12885 | }; |
| 12886 | 12886 | ||
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 14f3c3e0f62d..41b5b3a18c1e 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
| @@ -1590,8 +1590,6 @@ static struct snd_pci_quirk stac9200_cfg_tbl[] = { | |||
| 1590 | /* SigmaTel reference board */ | 1590 | /* SigmaTel reference board */ |
| 1591 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, | 1591 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, |
| 1592 | "DFI LanParty", STAC_REF), | 1592 | "DFI LanParty", STAC_REF), |
| 1593 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0xfb30, | ||
| 1594 | "SigmaTel",STAC_9205_REF), | ||
| 1595 | SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, | 1593 | SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, |
| 1596 | "DFI LanParty", STAC_REF), | 1594 | "DFI LanParty", STAC_REF), |
| 1597 | /* Dell laptops have BIOS problem */ | 1595 | /* Dell laptops have BIOS problem */ |
| @@ -2344,6 +2342,8 @@ static struct snd_pci_quirk stac9205_cfg_tbl[] = { | |||
| 2344 | /* SigmaTel reference board */ | 2342 | /* SigmaTel reference board */ |
| 2345 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, | 2343 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, |
| 2346 | "DFI LanParty", STAC_9205_REF), | 2344 | "DFI LanParty", STAC_9205_REF), |
| 2345 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0xfb30, | ||
| 2346 | "SigmaTel", STAC_9205_REF), | ||
| 2347 | SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, | 2347 | SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, |
| 2348 | "DFI LanParty", STAC_9205_REF), | 2348 | "DFI LanParty", STAC_9205_REF), |
| 2349 | /* Dell */ | 2349 | /* Dell */ |
diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c index 8e004fb6961a..9008b4b013aa 100644 --- a/sound/pci/hda/patch_via.c +++ b/sound/pci/hda/patch_via.c | |||
| @@ -210,7 +210,9 @@ struct via_spec { | |||
| 210 | /* capture */ | 210 | /* capture */ |
| 211 | unsigned int num_adc_nids; | 211 | unsigned int num_adc_nids; |
| 212 | hda_nid_t *adc_nids; | 212 | hda_nid_t *adc_nids; |
| 213 | hda_nid_t mux_nids[3]; | ||
| 213 | hda_nid_t dig_in_nid; | 214 | hda_nid_t dig_in_nid; |
| 215 | hda_nid_t dig_in_pin; | ||
| 214 | 216 | ||
| 215 | /* capture source */ | 217 | /* capture source */ |
| 216 | const struct hda_input_mux *input_mux; | 218 | const struct hda_input_mux *input_mux; |
| @@ -319,6 +321,9 @@ static void via_auto_set_output_and_unmute(struct hda_codec *codec, | |||
| 319 | pin_type); | 321 | pin_type); |
| 320 | snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE, | 322 | snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE, |
| 321 | AMP_OUT_UNMUTE); | 323 | AMP_OUT_UNMUTE); |
| 324 | if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD) | ||
| 325 | snd_hda_codec_write(codec, nid, 0, | ||
| 326 | AC_VERB_SET_EAPD_BTLENABLE, 0x02); | ||
| 322 | } | 327 | } |
| 323 | 328 | ||
| 324 | 329 | ||
| @@ -387,27 +392,12 @@ static int via_mux_enum_put(struct snd_kcontrol *kcontrol, | |||
| 387 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); | 392 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); |
| 388 | struct via_spec *spec = codec->spec; | 393 | struct via_spec *spec = codec->spec; |
| 389 | unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); | 394 | unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); |
| 390 | unsigned int vendor_id = codec->vendor_id; | 395 | |
| 391 | 396 | if (!spec->mux_nids[adc_idx]) | |
| 392 | /* AIW0 lydia 060801 add for correct sw0 input select */ | 397 | return -EINVAL; |
| 393 | if (IS_VT1708_VENDORID(vendor_id) && (adc_idx == 0)) | 398 | return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol, |
| 394 | return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol, | 399 | spec->mux_nids[adc_idx], |
| 395 | 0x18, &spec->cur_mux[adc_idx]); | 400 | &spec->cur_mux[adc_idx]); |
| 396 | else if ((IS_VT1709_10CH_VENDORID(vendor_id) || | ||
| 397 | IS_VT1709_6CH_VENDORID(vendor_id)) && (adc_idx == 0)) | ||
| 398 | return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol, | ||
| 399 | 0x19, &spec->cur_mux[adc_idx]); | ||
| 400 | else if ((IS_VT1708B_8CH_VENDORID(vendor_id) || | ||
| 401 | IS_VT1708B_4CH_VENDORID(vendor_id)) && (adc_idx == 0)) | ||
| 402 | return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol, | ||
| 403 | 0x17, &spec->cur_mux[adc_idx]); | ||
| 404 | else if (IS_VT1702_VENDORID(vendor_id) && (adc_idx == 0)) | ||
| 405 | return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol, | ||
| 406 | 0x13, &spec->cur_mux[adc_idx]); | ||
| 407 | else | ||
| 408 | return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol, | ||
| 409 | spec->adc_nids[adc_idx], | ||
| 410 | &spec->cur_mux[adc_idx]); | ||
| 411 | } | 401 | } |
| 412 | 402 | ||
| 413 | static int via_independent_hp_info(struct snd_kcontrol *kcontrol, | 403 | static int via_independent_hp_info(struct snd_kcontrol *kcontrol, |
| @@ -998,25 +988,11 @@ static int via_init(struct hda_codec *codec) | |||
| 998 | 988 | ||
| 999 | /* Lydia Add for EAPD enable */ | 989 | /* Lydia Add for EAPD enable */ |
| 1000 | if (!spec->dig_in_nid) { /* No Digital In connection */ | 990 | if (!spec->dig_in_nid) { /* No Digital In connection */ |
| 1001 | if (IS_VT1708_VENDORID(codec->vendor_id)) { | 991 | if (spec->dig_in_pin) { |
| 1002 | snd_hda_codec_write(codec, VT1708_DIGIN_PIN, 0, | 992 | snd_hda_codec_write(codec, spec->dig_in_pin, 0, |
| 1003 | AC_VERB_SET_PIN_WIDGET_CONTROL, | ||
| 1004 | PIN_OUT); | ||
| 1005 | snd_hda_codec_write(codec, VT1708_DIGIN_PIN, 0, | ||
| 1006 | AC_VERB_SET_EAPD_BTLENABLE, 0x02); | ||
| 1007 | } else if (IS_VT1709_10CH_VENDORID(codec->vendor_id) || | ||
| 1008 | IS_VT1709_6CH_VENDORID(codec->vendor_id)) { | ||
| 1009 | snd_hda_codec_write(codec, VT1709_DIGIN_PIN, 0, | ||
| 1010 | AC_VERB_SET_PIN_WIDGET_CONTROL, | 993 | AC_VERB_SET_PIN_WIDGET_CONTROL, |
| 1011 | PIN_OUT); | 994 | PIN_OUT); |
| 1012 | snd_hda_codec_write(codec, VT1709_DIGIN_PIN, 0, | 995 | snd_hda_codec_write(codec, spec->dig_in_pin, 0, |
| 1013 | AC_VERB_SET_EAPD_BTLENABLE, 0x02); | ||
| 1014 | } else if (IS_VT1708B_8CH_VENDORID(codec->vendor_id) || | ||
| 1015 | IS_VT1708B_4CH_VENDORID(codec->vendor_id)) { | ||
| 1016 | snd_hda_codec_write(codec, VT1708B_DIGIN_PIN, 0, | ||
| 1017 | AC_VERB_SET_PIN_WIDGET_CONTROL, | ||
| 1018 | PIN_OUT); | ||
| 1019 | snd_hda_codec_write(codec, VT1708B_DIGIN_PIN, 0, | ||
| 1020 | AC_VERB_SET_EAPD_BTLENABLE, 0x02); | 996 | AC_VERB_SET_EAPD_BTLENABLE, 0x02); |
| 1021 | } | 997 | } |
| 1022 | } else /* enable SPDIF-input pin */ | 998 | } else /* enable SPDIF-input pin */ |
| @@ -1326,6 +1302,7 @@ static int vt1708_parse_auto_config(struct hda_codec *codec) | |||
| 1326 | 1302 | ||
| 1327 | if (spec->autocfg.dig_outs) | 1303 | if (spec->autocfg.dig_outs) |
| 1328 | spec->multiout.dig_out_nid = VT1708_DIGOUT_NID; | 1304 | spec->multiout.dig_out_nid = VT1708_DIGOUT_NID; |
| 1305 | spec->dig_in_pin = VT1708_DIGIN_PIN; | ||
| 1329 | if (spec->autocfg.dig_in_pin) | 1306 | if (spec->autocfg.dig_in_pin) |
| 1330 | spec->dig_in_nid = VT1708_DIGIN_NID; | 1307 | spec->dig_in_nid = VT1708_DIGIN_NID; |
| 1331 | 1308 | ||
| @@ -1352,6 +1329,34 @@ static int via_auto_init(struct hda_codec *codec) | |||
| 1352 | return 0; | 1329 | return 0; |
| 1353 | } | 1330 | } |
| 1354 | 1331 | ||
| 1332 | static int get_mux_nids(struct hda_codec *codec) | ||
| 1333 | { | ||
| 1334 | struct via_spec *spec = codec->spec; | ||
| 1335 | hda_nid_t nid, conn[8]; | ||
| 1336 | unsigned int type; | ||
| 1337 | int i, n; | ||
| 1338 | |||
| 1339 | for (i = 0; i < spec->num_adc_nids; i++) { | ||
| 1340 | nid = spec->adc_nids[i]; | ||
| 1341 | while (nid) { | ||
| 1342 | type = (get_wcaps(codec, nid) & AC_WCAP_TYPE) | ||
| 1343 | >> AC_WCAP_TYPE_SHIFT; | ||
| 1344 | if (type == AC_WID_PIN) | ||
| 1345 | break; | ||
| 1346 | n = snd_hda_get_connections(codec, nid, conn, | ||
| 1347 | ARRAY_SIZE(conn)); | ||
| 1348 | if (n <= 0) | ||
| 1349 | break; | ||
| 1350 | if (n > 1) { | ||
| 1351 | spec->mux_nids[i] = nid; | ||
| 1352 | break; | ||
| 1353 | } | ||
| 1354 | nid = conn[0]; | ||
| 1355 | } | ||
| 1356 | } | ||
| 1357 | return 0; | ||
| 1358 | } | ||
| 1359 | |||
| 1355 | static int patch_vt1708(struct hda_codec *codec) | 1360 | static int patch_vt1708(struct hda_codec *codec) |
| 1356 | { | 1361 | { |
| 1357 | struct via_spec *spec; | 1362 | struct via_spec *spec; |
| @@ -1799,6 +1804,7 @@ static int vt1709_parse_auto_config(struct hda_codec *codec) | |||
| 1799 | 1804 | ||
| 1800 | if (spec->autocfg.dig_outs) | 1805 | if (spec->autocfg.dig_outs) |
| 1801 | spec->multiout.dig_out_nid = VT1709_DIGOUT_NID; | 1806 | spec->multiout.dig_out_nid = VT1709_DIGOUT_NID; |
| 1807 | spec->dig_in_pin = VT1709_DIGIN_PIN; | ||
| 1802 | if (spec->autocfg.dig_in_pin) | 1808 | if (spec->autocfg.dig_in_pin) |
| 1803 | spec->dig_in_nid = VT1709_DIGIN_NID; | 1809 | spec->dig_in_nid = VT1709_DIGIN_NID; |
| 1804 | 1810 | ||
| @@ -1859,6 +1865,7 @@ static int patch_vt1709_10ch(struct hda_codec *codec) | |||
| 1859 | if (!spec->adc_nids && spec->input_mux) { | 1865 | if (!spec->adc_nids && spec->input_mux) { |
| 1860 | spec->adc_nids = vt1709_adc_nids; | 1866 | spec->adc_nids = vt1709_adc_nids; |
| 1861 | spec->num_adc_nids = ARRAY_SIZE(vt1709_adc_nids); | 1867 | spec->num_adc_nids = ARRAY_SIZE(vt1709_adc_nids); |
| 1868 | get_mux_nids(codec); | ||
| 1862 | spec->mixers[spec->num_mixers] = vt1709_capture_mixer; | 1869 | spec->mixers[spec->num_mixers] = vt1709_capture_mixer; |
| 1863 | spec->num_mixers++; | 1870 | spec->num_mixers++; |
| 1864 | } | 1871 | } |
| @@ -1952,6 +1959,7 @@ static int patch_vt1709_6ch(struct hda_codec *codec) | |||
| 1952 | if (!spec->adc_nids && spec->input_mux) { | 1959 | if (!spec->adc_nids && spec->input_mux) { |
| 1953 | spec->adc_nids = vt1709_adc_nids; | 1960 | spec->adc_nids = vt1709_adc_nids; |
| 1954 | spec->num_adc_nids = ARRAY_SIZE(vt1709_adc_nids); | 1961 | spec->num_adc_nids = ARRAY_SIZE(vt1709_adc_nids); |
| 1962 | get_mux_nids(codec); | ||
| 1955 | spec->mixers[spec->num_mixers] = vt1709_capture_mixer; | 1963 | spec->mixers[spec->num_mixers] = vt1709_capture_mixer; |
| 1956 | spec->num_mixers++; | 1964 | spec->num_mixers++; |
| 1957 | } | 1965 | } |
| @@ -2344,6 +2352,7 @@ static int vt1708B_parse_auto_config(struct hda_codec *codec) | |||
| 2344 | 2352 | ||
| 2345 | if (spec->autocfg.dig_outs) | 2353 | if (spec->autocfg.dig_outs) |
| 2346 | spec->multiout.dig_out_nid = VT1708B_DIGOUT_NID; | 2354 | spec->multiout.dig_out_nid = VT1708B_DIGOUT_NID; |
| 2355 | spec->dig_in_pin = VT1708B_DIGIN_PIN; | ||
| 2347 | if (spec->autocfg.dig_in_pin) | 2356 | if (spec->autocfg.dig_in_pin) |
| 2348 | spec->dig_in_nid = VT1708B_DIGIN_NID; | 2357 | spec->dig_in_nid = VT1708B_DIGIN_NID; |
| 2349 | 2358 | ||
| @@ -2404,6 +2413,7 @@ static int patch_vt1708B_8ch(struct hda_codec *codec) | |||
| 2404 | if (!spec->adc_nids && spec->input_mux) { | 2413 | if (!spec->adc_nids && spec->input_mux) { |
| 2405 | spec->adc_nids = vt1708B_adc_nids; | 2414 | spec->adc_nids = vt1708B_adc_nids; |
| 2406 | spec->num_adc_nids = ARRAY_SIZE(vt1708B_adc_nids); | 2415 | spec->num_adc_nids = ARRAY_SIZE(vt1708B_adc_nids); |
| 2416 | get_mux_nids(codec); | ||
| 2407 | spec->mixers[spec->num_mixers] = vt1708B_capture_mixer; | 2417 | spec->mixers[spec->num_mixers] = vt1708B_capture_mixer; |
| 2408 | spec->num_mixers++; | 2418 | spec->num_mixers++; |
| 2409 | } | 2419 | } |
| @@ -2455,6 +2465,7 @@ static int patch_vt1708B_4ch(struct hda_codec *codec) | |||
| 2455 | if (!spec->adc_nids && spec->input_mux) { | 2465 | if (!spec->adc_nids && spec->input_mux) { |
| 2456 | spec->adc_nids = vt1708B_adc_nids; | 2466 | spec->adc_nids = vt1708B_adc_nids; |
| 2457 | spec->num_adc_nids = ARRAY_SIZE(vt1708B_adc_nids); | 2467 | spec->num_adc_nids = ARRAY_SIZE(vt1708B_adc_nids); |
| 2468 | get_mux_nids(codec); | ||
| 2458 | spec->mixers[spec->num_mixers] = vt1708B_capture_mixer; | 2469 | spec->mixers[spec->num_mixers] = vt1708B_capture_mixer; |
| 2459 | spec->num_mixers++; | 2470 | spec->num_mixers++; |
| 2460 | } | 2471 | } |
| @@ -2889,6 +2900,7 @@ static int patch_vt1708S(struct hda_codec *codec) | |||
| 2889 | if (!spec->adc_nids && spec->input_mux) { | 2900 | if (!spec->adc_nids && spec->input_mux) { |
| 2890 | spec->adc_nids = vt1708S_adc_nids; | 2901 | spec->adc_nids = vt1708S_adc_nids; |
| 2891 | spec->num_adc_nids = ARRAY_SIZE(vt1708S_adc_nids); | 2902 | spec->num_adc_nids = ARRAY_SIZE(vt1708S_adc_nids); |
| 2903 | get_mux_nids(codec); | ||
| 2892 | spec->mixers[spec->num_mixers] = vt1708S_capture_mixer; | 2904 | spec->mixers[spec->num_mixers] = vt1708S_capture_mixer; |
| 2893 | spec->num_mixers++; | 2905 | spec->num_mixers++; |
| 2894 | } | 2906 | } |
| @@ -3206,6 +3218,7 @@ static int patch_vt1702(struct hda_codec *codec) | |||
| 3206 | if (!spec->adc_nids && spec->input_mux) { | 3218 | if (!spec->adc_nids && spec->input_mux) { |
| 3207 | spec->adc_nids = vt1702_adc_nids; | 3219 | spec->adc_nids = vt1702_adc_nids; |
| 3208 | spec->num_adc_nids = ARRAY_SIZE(vt1702_adc_nids); | 3220 | spec->num_adc_nids = ARRAY_SIZE(vt1702_adc_nids); |
| 3221 | get_mux_nids(codec); | ||
| 3209 | spec->mixers[spec->num_mixers] = vt1702_capture_mixer; | 3222 | spec->mixers[spec->num_mixers] = vt1702_capture_mixer; |
| 3210 | spec->num_mixers++; | 3223 | spec->num_mixers++; |
| 3211 | } | 3224 | } |
diff --git a/sound/soc/codecs/wm8753.c b/sound/soc/codecs/wm8753.c index d28eeaceb857..49c4b2898aff 100644 --- a/sound/soc/codecs/wm8753.c +++ b/sound/soc/codecs/wm8753.c | |||
| @@ -79,7 +79,7 @@ static const u16 wm8753_reg[] = { | |||
| 79 | 0x0097, 0x0097, 0x0000, 0x0004, | 79 | 0x0097, 0x0097, 0x0000, 0x0004, |
| 80 | 0x0000, 0x0083, 0x0024, 0x01ba, | 80 | 0x0000, 0x0083, 0x0024, 0x01ba, |
| 81 | 0x0000, 0x0083, 0x0024, 0x01ba, | 81 | 0x0000, 0x0083, 0x0024, 0x01ba, |
| 82 | 0x0000, 0x0000 | 82 | 0x0000, 0x0000, 0x0000 |
| 83 | }; | 83 | }; |
| 84 | 84 | ||
| 85 | /* codec private data */ | 85 | /* codec private data */ |
| @@ -1660,11 +1660,11 @@ static int wm8753_register(struct wm8753_priv *wm8753) | |||
| 1660 | codec->set_bias_level = wm8753_set_bias_level; | 1660 | codec->set_bias_level = wm8753_set_bias_level; |
| 1661 | codec->dai = wm8753_dai; | 1661 | codec->dai = wm8753_dai; |
| 1662 | codec->num_dai = 2; | 1662 | codec->num_dai = 2; |
| 1663 | codec->reg_cache_size = ARRAY_SIZE(wm8753->reg_cache); | 1663 | codec->reg_cache_size = ARRAY_SIZE(wm8753->reg_cache) + 1; |
| 1664 | codec->reg_cache = &wm8753->reg_cache; | 1664 | codec->reg_cache = &wm8753->reg_cache; |
| 1665 | codec->private_data = wm8753; | 1665 | codec->private_data = wm8753; |
| 1666 | 1666 | ||
| 1667 | memcpy(codec->reg_cache, wm8753_reg, sizeof(codec->reg_cache)); | 1667 | memcpy(codec->reg_cache, wm8753_reg, sizeof(wm8753->reg_cache)); |
| 1668 | INIT_DELAYED_WORK(&codec->delayed_work, wm8753_work); | 1668 | INIT_DELAYED_WORK(&codec->delayed_work, wm8753_work); |
| 1669 | 1669 | ||
| 1670 | ret = wm8753_reset(codec); | 1670 | ret = wm8753_reset(codec); |
diff --git a/sound/soc/fsl/mpc5200_dma.c b/sound/soc/fsl/mpc5200_dma.c index efec33a1c5bd..f0a2d4071998 100644 --- a/sound/soc/fsl/mpc5200_dma.c +++ b/sound/soc/fsl/mpc5200_dma.c | |||
| @@ -456,6 +456,7 @@ int mpc5200_audio_dma_create(struct of_device *op) | |||
| 456 | return -ENODEV; | 456 | return -ENODEV; |
| 457 | 457 | ||
| 458 | spin_lock_init(&psc_dma->lock); | 458 | spin_lock_init(&psc_dma->lock); |
| 459 | mutex_init(&psc_dma->mutex); | ||
| 459 | psc_dma->id = be32_to_cpu(*prop); | 460 | psc_dma->id = be32_to_cpu(*prop); |
| 460 | psc_dma->irq = irq; | 461 | psc_dma->irq = irq; |
| 461 | psc_dma->psc_regs = regs; | 462 | psc_dma->psc_regs = regs; |
diff --git a/sound/soc/fsl/mpc5200_dma.h b/sound/soc/fsl/mpc5200_dma.h index 2000803f06a7..8d396bb9d9fe 100644 --- a/sound/soc/fsl/mpc5200_dma.h +++ b/sound/soc/fsl/mpc5200_dma.h | |||
| @@ -55,6 +55,7 @@ struct psc_dma { | |||
| 55 | unsigned int irq; | 55 | unsigned int irq; |
| 56 | struct device *dev; | 56 | struct device *dev; |
| 57 | spinlock_t lock; | 57 | spinlock_t lock; |
| 58 | struct mutex mutex; | ||
| 58 | u32 sicr; | 59 | u32 sicr; |
| 59 | uint sysclk; | 60 | uint sysclk; |
| 60 | int imr; | 61 | int imr; |
diff --git a/sound/soc/fsl/mpc5200_psc_ac97.c b/sound/soc/fsl/mpc5200_psc_ac97.c index 794a247b3eb5..7eb549985d49 100644 --- a/sound/soc/fsl/mpc5200_psc_ac97.c +++ b/sound/soc/fsl/mpc5200_psc_ac97.c | |||
| @@ -34,13 +34,20 @@ static unsigned short psc_ac97_read(struct snd_ac97 *ac97, unsigned short reg) | |||
| 34 | int status; | 34 | int status; |
| 35 | unsigned int val; | 35 | unsigned int val; |
| 36 | 36 | ||
| 37 | mutex_lock(&psc_dma->mutex); | ||
| 38 | |||
| 37 | /* Wait for command send status zero = ready */ | 39 | /* Wait for command send status zero = ready */ |
| 38 | status = spin_event_timeout(!(in_be16(&psc_dma->psc_regs->sr_csr.status) & | 40 | status = spin_event_timeout(!(in_be16(&psc_dma->psc_regs->sr_csr.status) & |
| 39 | MPC52xx_PSC_SR_CMDSEND), 100, 0); | 41 | MPC52xx_PSC_SR_CMDSEND), 100, 0); |
| 40 | if (status == 0) { | 42 | if (status == 0) { |
| 41 | pr_err("timeout on ac97 bus (rdy)\n"); | 43 | pr_err("timeout on ac97 bus (rdy)\n"); |
| 44 | mutex_unlock(&psc_dma->mutex); | ||
| 42 | return -ENODEV; | 45 | return -ENODEV; |
| 43 | } | 46 | } |
| 47 | |||
| 48 | /* Force clear the data valid bit */ | ||
| 49 | in_be32(&psc_dma->psc_regs->ac97_data); | ||
| 50 | |||
| 44 | /* Send the read */ | 51 | /* Send the read */ |
| 45 | out_be32(&psc_dma->psc_regs->ac97_cmd, (1<<31) | ((reg & 0x7f) << 24)); | 52 | out_be32(&psc_dma->psc_regs->ac97_cmd, (1<<31) | ((reg & 0x7f) << 24)); |
| 46 | 53 | ||
| @@ -50,16 +57,19 @@ static unsigned short psc_ac97_read(struct snd_ac97 *ac97, unsigned short reg) | |||
| 50 | if (status == 0) { | 57 | if (status == 0) { |
| 51 | pr_err("timeout on ac97 read (val) %x\n", | 58 | pr_err("timeout on ac97 read (val) %x\n", |
| 52 | in_be16(&psc_dma->psc_regs->sr_csr.status)); | 59 | in_be16(&psc_dma->psc_regs->sr_csr.status)); |
| 60 | mutex_unlock(&psc_dma->mutex); | ||
| 53 | return -ENODEV; | 61 | return -ENODEV; |
| 54 | } | 62 | } |
| 55 | /* Get the data */ | 63 | /* Get the data */ |
| 56 | val = in_be32(&psc_dma->psc_regs->ac97_data); | 64 | val = in_be32(&psc_dma->psc_regs->ac97_data); |
| 57 | if (((val >> 24) & 0x7f) != reg) { | 65 | if (((val >> 24) & 0x7f) != reg) { |
| 58 | pr_err("reg echo error on ac97 read\n"); | 66 | pr_err("reg echo error on ac97 read\n"); |
| 67 | mutex_unlock(&psc_dma->mutex); | ||
| 59 | return -ENODEV; | 68 | return -ENODEV; |
| 60 | } | 69 | } |
| 61 | val = (val >> 8) & 0xffff; | 70 | val = (val >> 8) & 0xffff; |
| 62 | 71 | ||
| 72 | mutex_unlock(&psc_dma->mutex); | ||
| 63 | return (unsigned short) val; | 73 | return (unsigned short) val; |
| 64 | } | 74 | } |
| 65 | 75 | ||
| @@ -68,16 +78,21 @@ static void psc_ac97_write(struct snd_ac97 *ac97, | |||
| 68 | { | 78 | { |
| 69 | int status; | 79 | int status; |
| 70 | 80 | ||
| 81 | mutex_lock(&psc_dma->mutex); | ||
| 82 | |||
| 71 | /* Wait for command status zero = ready */ | 83 | /* Wait for command status zero = ready */ |
| 72 | status = spin_event_timeout(!(in_be16(&psc_dma->psc_regs->sr_csr.status) & | 84 | status = spin_event_timeout(!(in_be16(&psc_dma->psc_regs->sr_csr.status) & |
| 73 | MPC52xx_PSC_SR_CMDSEND), 100, 0); | 85 | MPC52xx_PSC_SR_CMDSEND), 100, 0); |
| 74 | if (status == 0) { | 86 | if (status == 0) { |
| 75 | pr_err("timeout on ac97 bus (write)\n"); | 87 | pr_err("timeout on ac97 bus (write)\n"); |
| 76 | return; | 88 | goto out; |
| 77 | } | 89 | } |
| 78 | /* Write data */ | 90 | /* Write data */ |
| 79 | out_be32(&psc_dma->psc_regs->ac97_cmd, | 91 | out_be32(&psc_dma->psc_regs->ac97_cmd, |
| 80 | ((reg & 0x7f) << 24) | (val << 8)); | 92 | ((reg & 0x7f) << 24) | (val << 8)); |
| 93 | |||
| 94 | out: | ||
| 95 | mutex_unlock(&psc_dma->mutex); | ||
| 81 | } | 96 | } |
| 82 | 97 | ||
| 83 | static void psc_ac97_warm_reset(struct snd_ac97 *ac97) | 98 | static void psc_ac97_warm_reset(struct snd_ac97 *ac97) |
