mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 03:01:39 -04:00
Merge branches 'arm', 'at91', 'bcmring', 'ep93xx', 'mach-types', 'misc' and 'w90x900' into devel
This commit is contained in:
commit
cf7a2b4fb6
1298 changed files with 53846 additions and 14528 deletions
|
|
@ -338,7 +338,7 @@ static int __devinit snd_cmi8330_pnp(int dev, struct snd_cmi8330 *acard,
|
|||
return -EBUSY;
|
||||
|
||||
acard->mpu = pnp_request_card_device(card, id->devs[2].id, NULL);
|
||||
if (acard->play == NULL)
|
||||
if (acard->mpu == NULL)
|
||||
return -EBUSY;
|
||||
|
||||
pdev = acard->cap;
|
||||
|
|
|
|||
|
|
@ -199,7 +199,7 @@ MODULE_LICENSE("GPL");
|
|||
*/
|
||||
|
||||
static struct pci_device_id id_tbl[] = {
|
||||
{ PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_AUDIO, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
|
||||
{ PCI_VDEVICE(CYRIX, PCI_DEVICE_ID_CYRIX_5530_AUDIO), 0 },
|
||||
{ }
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -926,31 +926,21 @@ static struct midi_operations mpu401_midi_operations[MAX_MIDI_DEV];
|
|||
static void mpu401_chk_version(int n, struct mpu_config *devc)
|
||||
{
|
||||
int tmp;
|
||||
unsigned long flags;
|
||||
|
||||
devc->version = devc->revision = 0;
|
||||
|
||||
spin_lock_irqsave(&devc->lock,flags);
|
||||
if ((tmp = mpu_cmd(n, 0xAC, 0)) < 0)
|
||||
{
|
||||
spin_unlock_irqrestore(&devc->lock,flags);
|
||||
tmp = mpu_cmd(n, 0xAC, 0);
|
||||
if (tmp < 0)
|
||||
return;
|
||||
}
|
||||
if ((tmp & 0xf0) > 0x20) /* Why it's larger than 2.x ??? */
|
||||
{
|
||||
spin_unlock_irqrestore(&devc->lock,flags);
|
||||
return;
|
||||
}
|
||||
devc->version = tmp;
|
||||
|
||||
if ((tmp = mpu_cmd(n, 0xAD, 0)) < 0)
|
||||
{
|
||||
if ((tmp = mpu_cmd(n, 0xAD, 0)) < 0) {
|
||||
devc->version = 0;
|
||||
spin_unlock_irqrestore(&devc->lock,flags);
|
||||
return;
|
||||
}
|
||||
devc->revision = tmp;
|
||||
spin_unlock_irqrestore(&devc->lock,flags);
|
||||
}
|
||||
|
||||
int attach_mpu401(struct address_info *hw_config, struct module *owner)
|
||||
|
|
|
|||
|
|
@ -287,10 +287,10 @@ struct atiixp {
|
|||
/*
|
||||
*/
|
||||
static struct pci_device_id snd_atiixp_ids[] = {
|
||||
{ 0x1002, 0x4341, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* SB200 */
|
||||
{ 0x1002, 0x4361, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* SB300 */
|
||||
{ 0x1002, 0x4370, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* SB400 */
|
||||
{ 0x1002, 0x4382, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* SB600 */
|
||||
{ PCI_VDEVICE(ATI, 0x4341), 0 }, /* SB200 */
|
||||
{ PCI_VDEVICE(ATI, 0x4361), 0 }, /* SB300 */
|
||||
{ PCI_VDEVICE(ATI, 0x4370), 0 }, /* SB400 */
|
||||
{ PCI_VDEVICE(ATI, 0x4382), 0 }, /* SB600 */
|
||||
{ 0, }
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -262,8 +262,8 @@ struct atiixp_modem {
|
|||
/*
|
||||
*/
|
||||
static struct pci_device_id snd_atiixp_ids[] = {
|
||||
{ 0x1002, 0x434d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* SB200 */
|
||||
{ 0x1002, 0x4378, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* SB400 */
|
||||
{ PCI_VDEVICE(ATI, 0x434d), 0 }, /* SB200 */
|
||||
{ PCI_VDEVICE(ATI, 0x4378), 0 }, /* SB400 */
|
||||
{ 0, }
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,7 @@
|
|||
#include "au8810.h"
|
||||
#include "au88x0.h"
|
||||
static struct pci_device_id snd_vortex_ids[] = {
|
||||
{PCI_VENDOR_ID_AUREAL, PCI_DEVICE_ID_AUREAL_ADVANTAGE,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1,},
|
||||
{PCI_VDEVICE(AUREAL, PCI_DEVICE_ID_AUREAL_ADVANTAGE), 1,},
|
||||
{0,}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,7 @@
|
|||
#include "au8820.h"
|
||||
#include "au88x0.h"
|
||||
static struct pci_device_id snd_vortex_ids[] = {
|
||||
{PCI_VENDOR_ID_AUREAL, PCI_DEVICE_ID_AUREAL_VORTEX_1,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0,},
|
||||
{PCI_VDEVICE(AUREAL, PCI_DEVICE_ID_AUREAL_VORTEX_1), 0,},
|
||||
{0,}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,7 @@
|
|||
#include "au8830.h"
|
||||
#include "au88x0.h"
|
||||
static struct pci_device_id snd_vortex_ids[] = {
|
||||
{PCI_VENDOR_ID_AUREAL, PCI_DEVICE_ID_AUREAL_VORTEX_2,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0,},
|
||||
{PCI_VDEVICE(AUREAL, PCI_DEVICE_ID_AUREAL_VORTEX_2), 0,},
|
||||
{0,}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1876,7 +1876,7 @@ static int snd_ca0106_resume(struct pci_dev *pci)
|
|||
|
||||
// PCI IDs
|
||||
static struct pci_device_id snd_ca0106_ids[] = {
|
||||
{ 0x1102, 0x0007, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* Audigy LS or Live 24bit */
|
||||
{ PCI_VDEVICE(CREATIVE, 0x0007), 0 }, /* Audigy LS or Live 24bit */
|
||||
{ 0, }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, snd_ca0106_ids);
|
||||
|
|
|
|||
|
|
@ -2797,11 +2797,11 @@ static inline void snd_cmipci_proc_init(struct cmipci *cm) {}
|
|||
|
||||
|
||||
static struct pci_device_id snd_cmipci_ids[] = {
|
||||
{PCI_VENDOR_ID_CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8338A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
||||
{PCI_VENDOR_ID_CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8338B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
||||
{PCI_VENDOR_ID_CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8738, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
||||
{PCI_VENDOR_ID_CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8738B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
||||
{PCI_VENDOR_ID_AL, PCI_DEVICE_ID_CMEDIA_CM8738, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
||||
{PCI_VDEVICE(CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8338A), 0},
|
||||
{PCI_VDEVICE(CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8338B), 0},
|
||||
{PCI_VDEVICE(CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8738), 0},
|
||||
{PCI_VDEVICE(CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8738B), 0},
|
||||
{PCI_VDEVICE(AL, PCI_DEVICE_ID_CMEDIA_CM8738), 0},
|
||||
{0,},
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -495,7 +495,7 @@ struct cs4281 {
|
|||
static irqreturn_t snd_cs4281_interrupt(int irq, void *dev_id);
|
||||
|
||||
static struct pci_device_id snd_cs4281_ids[] = {
|
||||
{ 0x1013, 0x6005, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* CS4281 */
|
||||
{ PCI_VDEVICE(CIRRUS, 0x6005), 0, }, /* CS4281 */
|
||||
{ 0, }
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -65,9 +65,9 @@ module_param_array(mmap_valid, bool, NULL, 0444);
|
|||
MODULE_PARM_DESC(mmap_valid, "Support OSS mmap.");
|
||||
|
||||
static struct pci_device_id snd_cs46xx_ids[] = {
|
||||
{ 0x1013, 0x6001, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* CS4280 */
|
||||
{ 0x1013, 0x6003, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* CS4612 */
|
||||
{ 0x1013, 0x6004, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* CS4615 */
|
||||
{ PCI_VDEVICE(CIRRUS, 0x6001), 0, }, /* CS4280 */
|
||||
{ PCI_VDEVICE(CIRRUS, 0x6003), 0, }, /* CS4612 */
|
||||
{ PCI_VDEVICE(CIRRUS, 0x6004), 0, }, /* CS4615 */
|
||||
{ 0, }
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -77,9 +77,9 @@ MODULE_PARM_DESC(subsystem, "Force card subsystem model.");
|
|||
* Class 0401: 1102:0008 (rev 00) Subsystem: 1102:1001 -> Audigy2 Value Model:SB0400
|
||||
*/
|
||||
static struct pci_device_id snd_emu10k1_ids[] = {
|
||||
{ 0x1102, 0x0002, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* EMU10K1 */
|
||||
{ 0x1102, 0x0004, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1 }, /* Audigy */
|
||||
{ 0x1102, 0x0008, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1 }, /* Audigy 2 Value SB0400 */
|
||||
{ PCI_VDEVICE(CREATIVE, 0x0002), 0 }, /* EMU10K1 */
|
||||
{ PCI_VDEVICE(CREATIVE, 0x0004), 1 }, /* Audigy */
|
||||
{ PCI_VDEVICE(CREATIVE, 0x0008), 1 }, /* Audigy 2 Value SB0400 */
|
||||
{ 0, }
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1607,7 +1607,7 @@ static void __devexit snd_emu10k1x_remove(struct pci_dev *pci)
|
|||
|
||||
// PCI IDs
|
||||
static struct pci_device_id snd_emu10k1x_ids[] = {
|
||||
{ 0x1102, 0x0006, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* Dell OEM version (EMU10K1) */
|
||||
{ PCI_VDEVICE(CREATIVE, 0x0006), 0 }, /* Dell OEM version (EMU10K1) */
|
||||
{ 0, }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, snd_emu10k1x_ids);
|
||||
|
|
|
|||
|
|
@ -644,7 +644,7 @@ int __devinit snd_p16v_pcm(struct snd_emu10k1 *emu, int device, struct snd_pcm *
|
|||
int err;
|
||||
int capture=1;
|
||||
|
||||
/* snd_printk("KERN_DEBUG snd_p16v_pcm called. device=%d\n", device); */
|
||||
/* snd_printk(KERN_DEBUG "snd_p16v_pcm called. device=%d\n", device); */
|
||||
emu->p16v_device_offset = device;
|
||||
if (rpcm)
|
||||
*rpcm = NULL;
|
||||
|
|
|
|||
|
|
@ -445,12 +445,12 @@ static irqreturn_t snd_audiopci_interrupt(int irq, void *dev_id);
|
|||
|
||||
static struct pci_device_id snd_audiopci_ids[] = {
|
||||
#ifdef CHIP1370
|
||||
{ 0x1274, 0x5000, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* ES1370 */
|
||||
{ PCI_VDEVICE(ENSONIQ, 0x5000), 0, }, /* ES1370 */
|
||||
#endif
|
||||
#ifdef CHIP1371
|
||||
{ 0x1274, 0x1371, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* ES1371 */
|
||||
{ 0x1274, 0x5880, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* ES1373 - CT5880 */
|
||||
{ 0x1102, 0x8938, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* Ectiva EV1938 */
|
||||
{ PCI_VDEVICE(ENSONIQ, 0x1371), 0, }, /* ES1371 */
|
||||
{ PCI_VDEVICE(ENSONIQ, 0x5880), 0, }, /* ES1373 - CT5880 */
|
||||
{ PCI_VDEVICE(ECTIVA, 0x8938), 0, }, /* Ectiva EV1938 */
|
||||
#endif
|
||||
{ 0, }
|
||||
};
|
||||
|
|
|
|||
|
|
@ -244,7 +244,7 @@ struct es1938 {
|
|||
static irqreturn_t snd_es1938_interrupt(int irq, void *dev_id);
|
||||
|
||||
static struct pci_device_id snd_es1938_ids[] = {
|
||||
{ 0x125d, 0x1969, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* Solo-1 */
|
||||
{ PCI_VDEVICE(ESS, 0x1969), 0, }, /* Solo-1 */
|
||||
{ 0, }
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -50,19 +50,22 @@ static void snd_hda_generate_beep(struct work_struct *work)
|
|||
* The tone frequency of beep generator on IDT/STAC codecs is
|
||||
* defined from the 8bit tone parameter, in Hz,
|
||||
* freq = 48000 * (257 - tone) / 1024
|
||||
* that is from 12kHz to 93.75kHz in step of 46.875 hz
|
||||
* that is from 12kHz to 93.75Hz in steps of 46.875 Hz
|
||||
*/
|
||||
static int beep_linear_tone(struct hda_beep *beep, int hz)
|
||||
{
|
||||
if (hz <= 0)
|
||||
return 0;
|
||||
hz *= 1000; /* fixed point */
|
||||
hz = hz - DIGBEEP_HZ_MIN;
|
||||
hz = hz - DIGBEEP_HZ_MIN
|
||||
+ DIGBEEP_HZ_STEP / 2; /* round to nearest step */
|
||||
if (hz < 0)
|
||||
hz = 0; /* turn off PC beep*/
|
||||
else if (hz >= (DIGBEEP_HZ_MAX - DIGBEEP_HZ_MIN))
|
||||
hz = 0xff;
|
||||
hz = 1; /* max frequency */
|
||||
else {
|
||||
hz /= DIGBEEP_HZ_STEP;
|
||||
hz++;
|
||||
hz = 255 - hz;
|
||||
}
|
||||
return hz;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3470,10 +3470,16 @@ int snd_hda_multi_out_analog_open(struct hda_codec *codec,
|
|||
}
|
||||
mutex_lock(&codec->spdif_mutex);
|
||||
if (mout->share_spdif) {
|
||||
runtime->hw.rates &= mout->spdif_rates;
|
||||
runtime->hw.formats &= mout->spdif_formats;
|
||||
if (mout->spdif_maxbps < hinfo->maxbps)
|
||||
hinfo->maxbps = mout->spdif_maxbps;
|
||||
if ((runtime->hw.rates & mout->spdif_rates) &&
|
||||
(runtime->hw.formats & mout->spdif_formats)) {
|
||||
runtime->hw.rates &= mout->spdif_rates;
|
||||
runtime->hw.formats &= mout->spdif_formats;
|
||||
if (mout->spdif_maxbps < hinfo->maxbps)
|
||||
hinfo->maxbps = mout->spdif_maxbps;
|
||||
} else {
|
||||
mout->share_spdif = 0;
|
||||
/* FIXME: need notify? */
|
||||
}
|
||||
}
|
||||
mutex_unlock(&codec->spdif_mutex);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1454,6 +1454,18 @@ static int azx_pcm_open(struct snd_pcm_substream *substream)
|
|||
mutex_unlock(&chip->open_mutex);
|
||||
return err;
|
||||
}
|
||||
snd_pcm_limit_hw_rates(runtime);
|
||||
/* sanity check */
|
||||
if (snd_BUG_ON(!runtime->hw.channels_min) ||
|
||||
snd_BUG_ON(!runtime->hw.channels_max) ||
|
||||
snd_BUG_ON(!runtime->hw.formats) ||
|
||||
snd_BUG_ON(!runtime->hw.rates)) {
|
||||
azx_release_device(azx_dev);
|
||||
hinfo->ops.close(hinfo, apcm->codec, substream);
|
||||
snd_hda_power_down(apcm->codec);
|
||||
mutex_unlock(&chip->open_mutex);
|
||||
return -EINVAL;
|
||||
}
|
||||
spin_lock_irqsave(&chip->reg_lock, flags);
|
||||
azx_dev->substream = substream;
|
||||
azx_dev->running = 0;
|
||||
|
|
@ -1462,7 +1474,6 @@ static int azx_pcm_open(struct snd_pcm_substream *substream)
|
|||
runtime->private_data = azx_dev;
|
||||
snd_pcm_set_sync(substream);
|
||||
mutex_unlock(&chip->open_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -2322,9 +2333,19 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci,
|
|||
gcap = azx_readw(chip, GCAP);
|
||||
snd_printdd(SFX "chipset global capabilities = 0x%x\n", gcap);
|
||||
|
||||
/* ATI chips seems buggy about 64bit DMA addresses */
|
||||
if (chip->driver_type == AZX_DRIVER_ATI)
|
||||
gcap &= ~ICH6_GCAP_64OK;
|
||||
/* disable SB600 64bit support for safety */
|
||||
if ((chip->driver_type == AZX_DRIVER_ATI) ||
|
||||
(chip->driver_type == AZX_DRIVER_ATIHDMI)) {
|
||||
struct pci_dev *p_smbus;
|
||||
p_smbus = pci_get_device(PCI_VENDOR_ID_ATI,
|
||||
PCI_DEVICE_ID_ATI_SBX00_SMBUS,
|
||||
NULL);
|
||||
if (p_smbus) {
|
||||
if (p_smbus->revision < 0x30)
|
||||
gcap &= ~ICH6_GCAP_64OK;
|
||||
pci_dev_put(p_smbus);
|
||||
}
|
||||
}
|
||||
|
||||
/* allow 64bit DMA address if supported by H/W */
|
||||
if ((gcap & ICH6_GCAP_64OK) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64)))
|
||||
|
|
|
|||
|
|
@ -72,6 +72,7 @@ struct ad198x_spec {
|
|||
hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS];
|
||||
|
||||
unsigned int jack_present :1;
|
||||
unsigned int inv_jack_detect:1;
|
||||
|
||||
#ifdef CONFIG_SND_HDA_POWER_SAVE
|
||||
struct hda_loopback_check loopback;
|
||||
|
|
@ -669,13 +670,15 @@ static struct hda_input_mux ad1986a_automic_capture_source = {
|
|||
},
|
||||
};
|
||||
|
||||
static struct snd_kcontrol_new ad1986a_laptop_eapd_mixers[] = {
|
||||
static struct snd_kcontrol_new ad1986a_laptop_master_mixers[] = {
|
||||
HDA_BIND_VOL("Master Playback Volume", &ad1986a_laptop_master_vol),
|
||||
HDA_BIND_SW("Master Playback Switch", &ad1986a_laptop_master_sw),
|
||||
{ } /* end */
|
||||
};
|
||||
|
||||
static struct snd_kcontrol_new ad1986a_laptop_eapd_mixers[] = {
|
||||
HDA_CODEC_VOLUME("PCM Playback Volume", 0x03, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_MUTE("PCM Playback Switch", 0x03, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x17, 0, HDA_OUTPUT),
|
||||
HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x17, 0, HDA_OUTPUT),
|
||||
HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_VOLUME("Mic Boost", 0x0f, 0x0, HDA_OUTPUT),
|
||||
|
|
@ -699,31 +702,9 @@ static struct snd_kcontrol_new ad1986a_laptop_eapd_mixers[] = {
|
|||
{ } /* end */
|
||||
};
|
||||
|
||||
static struct snd_kcontrol_new ad1986a_samsung_mixers[] = {
|
||||
HDA_BIND_VOL("Master Playback Volume", &ad1986a_laptop_master_vol),
|
||||
HDA_BIND_SW("Master Playback Switch", &ad1986a_laptop_master_sw),
|
||||
HDA_CODEC_VOLUME("PCM Playback Volume", 0x03, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_MUTE("PCM Playback Switch", 0x03, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_VOLUME("Mic Boost", 0x0f, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_MUTE("Capture Switch", 0x12, 0x0, HDA_OUTPUT),
|
||||
{
|
||||
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
||||
.name = "Capture Source",
|
||||
.info = ad198x_mux_enum_info,
|
||||
.get = ad198x_mux_enum_get,
|
||||
.put = ad198x_mux_enum_put,
|
||||
},
|
||||
{
|
||||
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
||||
.name = "External Amplifier",
|
||||
.info = ad198x_eapd_info,
|
||||
.get = ad198x_eapd_get,
|
||||
.put = ad198x_eapd_put,
|
||||
.private_value = 0x1b | (1 << 8), /* port-D, inversed */
|
||||
},
|
||||
static struct snd_kcontrol_new ad1986a_laptop_intmic_mixers[] = {
|
||||
HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x17, 0, HDA_OUTPUT),
|
||||
HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x17, 0, HDA_OUTPUT),
|
||||
{ } /* end */
|
||||
};
|
||||
|
||||
|
|
@ -776,8 +757,9 @@ static void ad1986a_hp_automute(struct hda_codec *codec)
|
|||
unsigned int present;
|
||||
|
||||
present = snd_hda_codec_read(codec, 0x1a, 0, AC_VERB_GET_PIN_SENSE, 0);
|
||||
/* Lenovo N100 seems to report the reversed bit for HP jack-sensing */
|
||||
spec->jack_present = !(present & 0x80000000);
|
||||
spec->jack_present = !!(present & 0x80000000);
|
||||
if (spec->inv_jack_detect)
|
||||
spec->jack_present = !spec->jack_present;
|
||||
ad1986a_update_hp(codec);
|
||||
}
|
||||
|
||||
|
|
@ -816,7 +798,7 @@ static int ad1986a_hp_master_sw_put(struct snd_kcontrol *kcontrol,
|
|||
return change;
|
||||
}
|
||||
|
||||
static struct snd_kcontrol_new ad1986a_laptop_automute_mixers[] = {
|
||||
static struct snd_kcontrol_new ad1986a_automute_master_mixers[] = {
|
||||
HDA_BIND_VOL("Master Playback Volume", &ad1986a_laptop_master_vol),
|
||||
{
|
||||
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
||||
|
|
@ -826,33 +808,10 @@ static struct snd_kcontrol_new ad1986a_laptop_automute_mixers[] = {
|
|||
.put = ad1986a_hp_master_sw_put,
|
||||
.private_value = HDA_COMPOSE_AMP_VAL(0x1a, 3, 0, HDA_OUTPUT),
|
||||
},
|
||||
HDA_CODEC_VOLUME("PCM Playback Volume", 0x03, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_MUTE("PCM Playback Switch", 0x03, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x17, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x17, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_VOLUME("Mic Boost", 0x0f, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_MUTE("Capture Switch", 0x12, 0x0, HDA_OUTPUT),
|
||||
{
|
||||
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
||||
.name = "Capture Source",
|
||||
.info = ad198x_mux_enum_info,
|
||||
.get = ad198x_mux_enum_get,
|
||||
.put = ad198x_mux_enum_put,
|
||||
},
|
||||
{
|
||||
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
||||
.name = "External Amplifier",
|
||||
.info = ad198x_eapd_info,
|
||||
.get = ad198x_eapd_get,
|
||||
.put = ad198x_eapd_put,
|
||||
.private_value = 0x1b | (1 << 8), /* port-D, inversed */
|
||||
},
|
||||
{ } /* end */
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* initialization verbs
|
||||
*/
|
||||
|
|
@ -981,6 +940,27 @@ static struct hda_verb ad1986a_hp_init_verbs[] = {
|
|||
{}
|
||||
};
|
||||
|
||||
static void ad1986a_samsung_p50_unsol_event(struct hda_codec *codec,
|
||||
unsigned int res)
|
||||
{
|
||||
switch (res >> 26) {
|
||||
case AD1986A_HP_EVENT:
|
||||
ad1986a_hp_automute(codec);
|
||||
break;
|
||||
case AD1986A_MIC_EVENT:
|
||||
ad1986a_automic(codec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static int ad1986a_samsung_p50_init(struct hda_codec *codec)
|
||||
{
|
||||
ad198x_init(codec);
|
||||
ad1986a_hp_automute(codec);
|
||||
ad1986a_automic(codec);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* models */
|
||||
enum {
|
||||
|
|
@ -991,6 +971,7 @@ enum {
|
|||
AD1986A_LAPTOP_AUTOMUTE,
|
||||
AD1986A_ULTRA,
|
||||
AD1986A_SAMSUNG,
|
||||
AD1986A_SAMSUNG_P50,
|
||||
AD1986A_MODELS
|
||||
};
|
||||
|
||||
|
|
@ -1002,6 +983,7 @@ static const char *ad1986a_models[AD1986A_MODELS] = {
|
|||
[AD1986A_LAPTOP_AUTOMUTE] = "laptop-automute",
|
||||
[AD1986A_ULTRA] = "ultra",
|
||||
[AD1986A_SAMSUNG] = "samsung",
|
||||
[AD1986A_SAMSUNG_P50] = "samsung-p50",
|
||||
};
|
||||
|
||||
static struct snd_pci_quirk ad1986a_cfg_tbl[] = {
|
||||
|
|
@ -1024,6 +1006,7 @@ static struct snd_pci_quirk ad1986a_cfg_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1179, 0xff40, "Toshiba", AD1986A_LAPTOP_EAPD),
|
||||
SND_PCI_QUIRK(0x144d, 0xb03c, "Samsung R55", AD1986A_3STACK),
|
||||
SND_PCI_QUIRK(0x144d, 0xc01e, "FSC V2060", AD1986A_LAPTOP),
|
||||
SND_PCI_QUIRK(0x144d, 0xc024, "Samsung P50", AD1986A_SAMSUNG_P50),
|
||||
SND_PCI_QUIRK(0x144d, 0xc027, "Samsung Q1", AD1986A_ULTRA),
|
||||
SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc000, "Samsung", AD1986A_SAMSUNG),
|
||||
SND_PCI_QUIRK(0x144d, 0xc504, "Samsung Q35", AD1986A_3STACK),
|
||||
|
|
@ -1111,7 +1094,10 @@ static int patch_ad1986a(struct hda_codec *codec)
|
|||
spec->multiout.dac_nids = ad1986a_laptop_dac_nids;
|
||||
break;
|
||||
case AD1986A_LAPTOP_EAPD:
|
||||
spec->mixers[0] = ad1986a_laptop_eapd_mixers;
|
||||
spec->num_mixers = 3;
|
||||
spec->mixers[0] = ad1986a_laptop_master_mixers;
|
||||
spec->mixers[1] = ad1986a_laptop_eapd_mixers;
|
||||
spec->mixers[2] = ad1986a_laptop_intmic_mixers;
|
||||
spec->num_init_verbs = 2;
|
||||
spec->init_verbs[1] = ad1986a_eapd_init_verbs;
|
||||
spec->multiout.max_channels = 2;
|
||||
|
|
@ -1122,7 +1108,9 @@ static int patch_ad1986a(struct hda_codec *codec)
|
|||
spec->input_mux = &ad1986a_laptop_eapd_capture_source;
|
||||
break;
|
||||
case AD1986A_SAMSUNG:
|
||||
spec->mixers[0] = ad1986a_samsung_mixers;
|
||||
spec->num_mixers = 2;
|
||||
spec->mixers[0] = ad1986a_laptop_master_mixers;
|
||||
spec->mixers[1] = ad1986a_laptop_eapd_mixers;
|
||||
spec->num_init_verbs = 3;
|
||||
spec->init_verbs[1] = ad1986a_eapd_init_verbs;
|
||||
spec->init_verbs[2] = ad1986a_automic_verbs;
|
||||
|
|
@ -1135,8 +1123,28 @@ static int patch_ad1986a(struct hda_codec *codec)
|
|||
codec->patch_ops.unsol_event = ad1986a_automic_unsol_event;
|
||||
codec->patch_ops.init = ad1986a_automic_init;
|
||||
break;
|
||||
case AD1986A_SAMSUNG_P50:
|
||||
spec->num_mixers = 2;
|
||||
spec->mixers[0] = ad1986a_automute_master_mixers;
|
||||
spec->mixers[1] = ad1986a_laptop_eapd_mixers;
|
||||
spec->num_init_verbs = 4;
|
||||
spec->init_verbs[1] = ad1986a_eapd_init_verbs;
|
||||
spec->init_verbs[2] = ad1986a_automic_verbs;
|
||||
spec->init_verbs[3] = ad1986a_hp_init_verbs;
|
||||
spec->multiout.max_channels = 2;
|
||||
spec->multiout.num_dacs = 1;
|
||||
spec->multiout.dac_nids = ad1986a_laptop_dac_nids;
|
||||
if (!is_jack_available(codec, 0x25))
|
||||
spec->multiout.dig_out_nid = 0;
|
||||
spec->input_mux = &ad1986a_automic_capture_source;
|
||||
codec->patch_ops.unsol_event = ad1986a_samsung_p50_unsol_event;
|
||||
codec->patch_ops.init = ad1986a_samsung_p50_init;
|
||||
break;
|
||||
case AD1986A_LAPTOP_AUTOMUTE:
|
||||
spec->mixers[0] = ad1986a_laptop_automute_mixers;
|
||||
spec->num_mixers = 3;
|
||||
spec->mixers[0] = ad1986a_automute_master_mixers;
|
||||
spec->mixers[1] = ad1986a_laptop_eapd_mixers;
|
||||
spec->mixers[2] = ad1986a_laptop_intmic_mixers;
|
||||
spec->num_init_verbs = 3;
|
||||
spec->init_verbs[1] = ad1986a_eapd_init_verbs;
|
||||
spec->init_verbs[2] = ad1986a_hp_init_verbs;
|
||||
|
|
@ -1148,6 +1156,10 @@ static int patch_ad1986a(struct hda_codec *codec)
|
|||
spec->input_mux = &ad1986a_laptop_eapd_capture_source;
|
||||
codec->patch_ops.unsol_event = ad1986a_hp_unsol_event;
|
||||
codec->patch_ops.init = ad1986a_hp_init;
|
||||
/* Lenovo N100 seems to report the reversed bit
|
||||
* for HP jack-sensing
|
||||
*/
|
||||
spec->inv_jack_detect = 1;
|
||||
break;
|
||||
case AD1986A_ULTRA:
|
||||
spec->mixers[0] = ad1986a_laptop_eapd_mixers;
|
||||
|
|
@ -3734,9 +3746,30 @@ static struct snd_kcontrol_new ad1884a_laptop_mixers[] = {
|
|||
{ } /* end */
|
||||
};
|
||||
|
||||
static int ad1884a_mobile_master_sw_put(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
|
||||
int ret = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
|
||||
int mute = (!ucontrol->value.integer.value[0] &&
|
||||
!ucontrol->value.integer.value[1]);
|
||||
/* toggle GPIO1 according to the mute state */
|
||||
snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,
|
||||
mute ? 0x02 : 0x0);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct snd_kcontrol_new ad1884a_mobile_mixers[] = {
|
||||
HDA_CODEC_VOLUME("Master Playback Volume", 0x21, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_MUTE("Master Playback Switch", 0x21, 0x0, HDA_OUTPUT),
|
||||
/*HDA_CODEC_MUTE("Master Playback Switch", 0x21, 0x0, HDA_OUTPUT),*/
|
||||
{
|
||||
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
||||
.name = "Master Playback Switch",
|
||||
.info = snd_hda_mixer_amp_switch_info,
|
||||
.get = snd_hda_mixer_amp_switch_get,
|
||||
.put = ad1884a_mobile_master_sw_put,
|
||||
.private_value = HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
|
||||
},
|
||||
HDA_CODEC_VOLUME("PCM Playback Volume", 0x20, 0x5, HDA_INPUT),
|
||||
HDA_CODEC_MUTE("PCM Playback Switch", 0x20, 0x5, HDA_INPUT),
|
||||
HDA_CODEC_VOLUME("Mic Capture Volume", 0x14, 0x0, HDA_INPUT),
|
||||
|
|
@ -3857,6 +3890,10 @@ static struct hda_verb ad1884a_mobile_verbs[] = {
|
|||
/* unsolicited event for pin-sense */
|
||||
{0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_HP_EVENT},
|
||||
{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_MIC_EVENT},
|
||||
/* allow to touch GPIO1 (for mute control) */
|
||||
{0x01, AC_VERB_SET_GPIO_MASK, 0x02},
|
||||
{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02},
|
||||
{0x01, AC_VERB_SET_GPIO_DATA, 0x02}, /* first muted */
|
||||
{ } /* end */
|
||||
};
|
||||
|
||||
|
|
@ -3966,6 +4003,7 @@ static struct snd_pci_quirk ad1884a_cfg_tbl[] = {
|
|||
SND_PCI_QUIRK(0x103c, 0x3037, "HP 2230s", AD1884A_LAPTOP),
|
||||
SND_PCI_QUIRK(0x103c, 0x3056, "HP", AD1884A_MOBILE),
|
||||
SND_PCI_QUIRK_MASK(0x103c, 0xfff0, 0x3070, "HP", AD1884A_MOBILE),
|
||||
SND_PCI_QUIRK_MASK(0x103c, 0xfff0, 0x30d0, "HP laptop", AD1884A_LAPTOP),
|
||||
SND_PCI_QUIRK_MASK(0x103c, 0xfff0, 0x30e0, "HP laptop", AD1884A_LAPTOP),
|
||||
SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3600, "HP laptop", AD1884A_LAPTOP),
|
||||
SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X300", AD1884A_THINKPAD),
|
||||
|
|
|
|||
|
|
@ -510,7 +510,7 @@ static int ca0110_parse_auto_config(struct hda_codec *codec)
|
|||
}
|
||||
|
||||
|
||||
int patch_ca0110(struct hda_codec *codec)
|
||||
static int patch_ca0110(struct hda_codec *codec)
|
||||
{
|
||||
struct ca0110_spec *spec;
|
||||
int err;
|
||||
|
|
|
|||
|
|
@ -945,12 +945,13 @@ static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
|
|||
static void alc_automute_pin(struct hda_codec *codec)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
unsigned int present;
|
||||
unsigned int present, pincap;
|
||||
unsigned int nid = spec->autocfg.hp_pins[0];
|
||||
int i;
|
||||
|
||||
/* need to execute and sync at first */
|
||||
snd_hda_codec_read(codec, nid, 0, AC_VERB_SET_PIN_SENSE, 0);
|
||||
pincap = snd_hda_query_pin_caps(codec, nid);
|
||||
if (pincap & AC_PINCAP_TRIG_REQ) /* need trigger? */
|
||||
snd_hda_codec_read(codec, nid, 0, AC_VERB_SET_PIN_SENSE, 0);
|
||||
present = snd_hda_codec_read(codec, nid, 0,
|
||||
AC_VERB_GET_PIN_SENSE, 0);
|
||||
spec->jack_present = (present & AC_PINSENSE_PRESENCE) != 0;
|
||||
|
|
@ -1392,7 +1393,7 @@ static struct hda_verb alc888_fujitsu_xa3530_verbs[] = {
|
|||
static void alc_automute_amp(struct hda_codec *codec)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
unsigned int val, mute;
|
||||
unsigned int val, mute, pincap;
|
||||
hda_nid_t nid;
|
||||
int i;
|
||||
|
||||
|
|
@ -1401,6 +1402,10 @@ static void alc_automute_amp(struct hda_codec *codec)
|
|||
nid = spec->autocfg.hp_pins[i];
|
||||
if (!nid)
|
||||
break;
|
||||
pincap = snd_hda_query_pin_caps(codec, nid);
|
||||
if (pincap & AC_PINCAP_TRIG_REQ) /* need trigger? */
|
||||
snd_hda_codec_read(codec, nid, 0,
|
||||
AC_VERB_SET_PIN_SENSE, 0);
|
||||
val = snd_hda_codec_read(codec, nid, 0,
|
||||
AC_VERB_GET_PIN_SENSE, 0);
|
||||
if (val & AC_PINSENSE_PRESENCE) {
|
||||
|
|
@ -1471,6 +1476,10 @@ static struct hda_verb alc888_acer_aspire_4930g_verbs[] = {
|
|||
static struct hda_verb alc888_acer_aspire_6530g_verbs[] = {
|
||||
/* Bias voltage on for external mic port */
|
||||
{0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80},
|
||||
/* Front Mic: set to PIN_IN (empty by default) */
|
||||
{0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
|
||||
/* Unselect Front Mic by default in input mixer 3 */
|
||||
{0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
|
||||
/* Enable unsolicited event for HP jack */
|
||||
{0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
|
||||
/* Enable speaker output */
|
||||
|
|
@ -1560,18 +1569,22 @@ static struct hda_input_mux alc888_2_capture_sources[2] = {
|
|||
static struct hda_input_mux alc888_acer_aspire_6530_sources[2] = {
|
||||
/* Interal mic only available on one ADC */
|
||||
{
|
||||
.num_items = 3,
|
||||
.num_items = 5,
|
||||
.items = {
|
||||
{ "Ext Mic", 0x0 },
|
||||
{ "Line In", 0x2 },
|
||||
{ "CD", 0x4 },
|
||||
{ "Input Mix", 0xa },
|
||||
{ "Int Mic", 0xb },
|
||||
},
|
||||
},
|
||||
{
|
||||
.num_items = 2,
|
||||
.num_items = 4,
|
||||
.items = {
|
||||
{ "Ext Mic", 0x0 },
|
||||
{ "Line In", 0x2 },
|
||||
{ "CD", 0x4 },
|
||||
{ "Input Mix", 0xa },
|
||||
},
|
||||
}
|
||||
};
|
||||
|
|
@ -1639,6 +1652,17 @@ static void alc888_acer_aspire_4930g_init_hook(struct hda_codec *codec)
|
|||
alc_automute_amp(codec);
|
||||
}
|
||||
|
||||
static void alc888_acer_aspire_6530g_init_hook(struct hda_codec *codec)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
|
||||
spec->autocfg.hp_pins[0] = 0x15;
|
||||
spec->autocfg.speaker_pins[0] = 0x14;
|
||||
spec->autocfg.speaker_pins[1] = 0x16;
|
||||
spec->autocfg.speaker_pins[2] = 0x17;
|
||||
alc_automute_amp(codec);
|
||||
}
|
||||
|
||||
static void alc889_acer_aspire_8930g_init_hook(struct hda_codec *codec)
|
||||
{
|
||||
struct alc_spec *spec = codec->spec;
|
||||
|
|
@ -6895,9 +6919,6 @@ static struct hda_verb alc882_targa_verbs[] = {
|
|||
{0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
|
||||
|
||||
{0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
|
||||
{0x01, AC_VERB_SET_GPIO_MASK, 0x03},
|
||||
{0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03},
|
||||
{0x01, AC_VERB_SET_GPIO_DATA, 0x03},
|
||||
{ } /* end */
|
||||
};
|
||||
|
||||
|
|
@ -7217,7 +7238,8 @@ static struct alc_config_preset alc882_presets[] = {
|
|||
},
|
||||
[ALC882_TARGA] = {
|
||||
.mixers = { alc882_targa_mixer, alc882_chmode_mixer },
|
||||
.init_verbs = { alc882_init_verbs, alc882_targa_verbs},
|
||||
.init_verbs = { alc882_init_verbs, alc880_gpio3_init_verbs,
|
||||
alc882_targa_verbs},
|
||||
.num_dacs = ARRAY_SIZE(alc882_dac_nids),
|
||||
.dac_nids = alc882_dac_nids,
|
||||
.dig_out_nid = ALC882_DIGOUT_NID,
|
||||
|
|
@ -8189,6 +8211,8 @@ static struct snd_kcontrol_new alc888_acer_aspire_6530_mixer[] = {
|
|||
HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
|
||||
HDA_CODEC_VOLUME("LFE Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
|
||||
HDA_BIND_MUTE("LFE Playback Switch", 0x0f, 2, HDA_INPUT),
|
||||
HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
|
||||
HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
|
||||
HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
|
||||
HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
|
||||
HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
|
||||
|
|
@ -9064,7 +9088,7 @@ static struct snd_pci_quirk alc883_cfg_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1025, 0x0157, "Acer X3200", ALC883_AUTO),
|
||||
SND_PCI_QUIRK(0x1025, 0x0158, "Acer AX1700-U3700A", ALC883_AUTO),
|
||||
SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
|
||||
ALC888_ACER_ASPIRE_4930G),
|
||||
ALC888_ACER_ASPIRE_6530G),
|
||||
SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
|
||||
ALC888_ACER_ASPIRE_6530G),
|
||||
/* default Acer -- disabled as it causes more problems.
|
||||
|
|
@ -9212,7 +9236,8 @@ static struct alc_config_preset alc883_presets[] = {
|
|||
},
|
||||
[ALC883_TARGA_DIG] = {
|
||||
.mixers = { alc883_targa_mixer, alc883_chmode_mixer },
|
||||
.init_verbs = { alc883_init_verbs, alc883_targa_verbs},
|
||||
.init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
|
||||
alc883_targa_verbs},
|
||||
.num_dacs = ARRAY_SIZE(alc883_dac_nids),
|
||||
.dac_nids = alc883_dac_nids,
|
||||
.dig_out_nid = ALC883_DIGOUT_NID,
|
||||
|
|
@ -9225,7 +9250,8 @@ static struct alc_config_preset alc883_presets[] = {
|
|||
},
|
||||
[ALC883_TARGA_2ch_DIG] = {
|
||||
.mixers = { alc883_targa_2ch_mixer},
|
||||
.init_verbs = { alc883_init_verbs, alc883_targa_verbs},
|
||||
.init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
|
||||
alc883_targa_verbs},
|
||||
.num_dacs = ARRAY_SIZE(alc883_dac_nids),
|
||||
.dac_nids = alc883_dac_nids,
|
||||
.adc_nids = alc883_adc_nids_alt,
|
||||
|
|
@ -9317,7 +9343,7 @@ static struct alc_config_preset alc883_presets[] = {
|
|||
ARRAY_SIZE(alc888_2_capture_sources),
|
||||
.input_mux = alc888_acer_aspire_6530_sources,
|
||||
.unsol_event = alc_automute_amp_unsol_event,
|
||||
.init_hook = alc888_acer_aspire_4930g_init_hook,
|
||||
.init_hook = alc888_acer_aspire_6530g_init_hook,
|
||||
},
|
||||
[ALC888_ACER_ASPIRE_8930G] = {
|
||||
.mixers = { alc888_base_mixer,
|
||||
|
|
@ -12437,6 +12463,8 @@ static int alc268_parse_auto_config(struct hda_codec *codec)
|
|||
if (err < 0)
|
||||
return err;
|
||||
|
||||
alc_ssid_check(codec, 0x15, 0x1b, 0x14);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
@ -12848,20 +12876,11 @@ static struct snd_kcontrol_new alc269_lifebook_mixer[] = {
|
|||
{ }
|
||||
};
|
||||
|
||||
/* bind volumes of both NID 0x0c and 0x0d */
|
||||
static struct hda_bind_ctls alc269_epc_bind_vol = {
|
||||
.ops = &snd_hda_bind_vol,
|
||||
.values = {
|
||||
HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
|
||||
HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
|
||||
0
|
||||
},
|
||||
};
|
||||
|
||||
static struct snd_kcontrol_new alc269_eeepc_mixer[] = {
|
||||
HDA_CODEC_MUTE("iSpeaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
|
||||
HDA_BIND_VOL("LineOut Playback Volume", &alc269_epc_bind_vol),
|
||||
HDA_CODEC_MUTE("LineOut Playback Switch", 0x15, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
|
||||
{ } /* end */
|
||||
};
|
||||
|
||||
|
|
@ -12874,12 +12893,7 @@ static struct snd_kcontrol_new alc269_epc_capture_mixer[] = {
|
|||
};
|
||||
|
||||
/* FSC amilo */
|
||||
static struct snd_kcontrol_new alc269_fujitsu_mixer[] = {
|
||||
HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
|
||||
HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
|
||||
HDA_BIND_VOL("PCM Playback Volume", &alc269_epc_bind_vol),
|
||||
{ } /* end */
|
||||
};
|
||||
#define alc269_fujitsu_mixer alc269_eeepc_mixer
|
||||
|
||||
static struct hda_verb alc269_quanta_fl1_verbs[] = {
|
||||
{0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
|
||||
|
|
@ -13345,6 +13359,8 @@ static int alc269_parse_auto_config(struct hda_codec *codec)
|
|||
if (!spec->cap_mixer && !spec->no_analog)
|
||||
set_capture_mixer(spec);
|
||||
|
||||
alc_ssid_check(codec, 0x15, 0x1b, 0x14);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1590,8 +1590,6 @@ static struct snd_pci_quirk stac9200_cfg_tbl[] = {
|
|||
/* SigmaTel reference board */
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
|
||||
"DFI LanParty", STAC_REF),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0xfb30,
|
||||
"SigmaTel",STAC_9205_REF),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
|
||||
"DFI LanParty", STAC_REF),
|
||||
/* Dell laptops have BIOS problem */
|
||||
|
|
@ -2344,6 +2342,8 @@ static struct snd_pci_quirk stac9205_cfg_tbl[] = {
|
|||
/* SigmaTel reference board */
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
|
||||
"DFI LanParty", STAC_9205_REF),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0xfb30,
|
||||
"SigmaTel", STAC_9205_REF),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
|
||||
"DFI LanParty", STAC_9205_REF),
|
||||
/* Dell */
|
||||
|
|
|
|||
|
|
@ -210,7 +210,9 @@ struct via_spec {
|
|||
/* capture */
|
||||
unsigned int num_adc_nids;
|
||||
hda_nid_t *adc_nids;
|
||||
hda_nid_t mux_nids[3];
|
||||
hda_nid_t dig_in_nid;
|
||||
hda_nid_t dig_in_pin;
|
||||
|
||||
/* capture source */
|
||||
const struct hda_input_mux *input_mux;
|
||||
|
|
@ -319,6 +321,9 @@ static void via_auto_set_output_and_unmute(struct hda_codec *codec,
|
|||
pin_type);
|
||||
snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
|
||||
AMP_OUT_UNMUTE);
|
||||
if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
|
||||
snd_hda_codec_write(codec, nid, 0,
|
||||
AC_VERB_SET_EAPD_BTLENABLE, 0x02);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -387,27 +392,12 @@ static int via_mux_enum_put(struct snd_kcontrol *kcontrol,
|
|||
struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
|
||||
struct via_spec *spec = codec->spec;
|
||||
unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
|
||||
unsigned int vendor_id = codec->vendor_id;
|
||||
|
||||
/* AIW0 lydia 060801 add for correct sw0 input select */
|
||||
if (IS_VT1708_VENDORID(vendor_id) && (adc_idx == 0))
|
||||
return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol,
|
||||
0x18, &spec->cur_mux[adc_idx]);
|
||||
else if ((IS_VT1709_10CH_VENDORID(vendor_id) ||
|
||||
IS_VT1709_6CH_VENDORID(vendor_id)) && (adc_idx == 0))
|
||||
return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol,
|
||||
0x19, &spec->cur_mux[adc_idx]);
|
||||
else if ((IS_VT1708B_8CH_VENDORID(vendor_id) ||
|
||||
IS_VT1708B_4CH_VENDORID(vendor_id)) && (adc_idx == 0))
|
||||
return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol,
|
||||
0x17, &spec->cur_mux[adc_idx]);
|
||||
else if (IS_VT1702_VENDORID(vendor_id) && (adc_idx == 0))
|
||||
return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol,
|
||||
0x13, &spec->cur_mux[adc_idx]);
|
||||
else
|
||||
return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol,
|
||||
spec->adc_nids[adc_idx],
|
||||
&spec->cur_mux[adc_idx]);
|
||||
if (!spec->mux_nids[adc_idx])
|
||||
return -EINVAL;
|
||||
return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol,
|
||||
spec->mux_nids[adc_idx],
|
||||
&spec->cur_mux[adc_idx]);
|
||||
}
|
||||
|
||||
static int via_independent_hp_info(struct snd_kcontrol *kcontrol,
|
||||
|
|
@ -998,25 +988,11 @@ static int via_init(struct hda_codec *codec)
|
|||
|
||||
/* Lydia Add for EAPD enable */
|
||||
if (!spec->dig_in_nid) { /* No Digital In connection */
|
||||
if (IS_VT1708_VENDORID(codec->vendor_id)) {
|
||||
snd_hda_codec_write(codec, VT1708_DIGIN_PIN, 0,
|
||||
if (spec->dig_in_pin) {
|
||||
snd_hda_codec_write(codec, spec->dig_in_pin, 0,
|
||||
AC_VERB_SET_PIN_WIDGET_CONTROL,
|
||||
PIN_OUT);
|
||||
snd_hda_codec_write(codec, VT1708_DIGIN_PIN, 0,
|
||||
AC_VERB_SET_EAPD_BTLENABLE, 0x02);
|
||||
} else if (IS_VT1709_10CH_VENDORID(codec->vendor_id) ||
|
||||
IS_VT1709_6CH_VENDORID(codec->vendor_id)) {
|
||||
snd_hda_codec_write(codec, VT1709_DIGIN_PIN, 0,
|
||||
AC_VERB_SET_PIN_WIDGET_CONTROL,
|
||||
PIN_OUT);
|
||||
snd_hda_codec_write(codec, VT1709_DIGIN_PIN, 0,
|
||||
AC_VERB_SET_EAPD_BTLENABLE, 0x02);
|
||||
} else if (IS_VT1708B_8CH_VENDORID(codec->vendor_id) ||
|
||||
IS_VT1708B_4CH_VENDORID(codec->vendor_id)) {
|
||||
snd_hda_codec_write(codec, VT1708B_DIGIN_PIN, 0,
|
||||
AC_VERB_SET_PIN_WIDGET_CONTROL,
|
||||
PIN_OUT);
|
||||
snd_hda_codec_write(codec, VT1708B_DIGIN_PIN, 0,
|
||||
snd_hda_codec_write(codec, spec->dig_in_pin, 0,
|
||||
AC_VERB_SET_EAPD_BTLENABLE, 0x02);
|
||||
}
|
||||
} else /* enable SPDIF-input pin */
|
||||
|
|
@ -1326,6 +1302,7 @@ static int vt1708_parse_auto_config(struct hda_codec *codec)
|
|||
|
||||
if (spec->autocfg.dig_outs)
|
||||
spec->multiout.dig_out_nid = VT1708_DIGOUT_NID;
|
||||
spec->dig_in_pin = VT1708_DIGIN_PIN;
|
||||
if (spec->autocfg.dig_in_pin)
|
||||
spec->dig_in_nid = VT1708_DIGIN_NID;
|
||||
|
||||
|
|
@ -1352,6 +1329,34 @@ static int via_auto_init(struct hda_codec *codec)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int get_mux_nids(struct hda_codec *codec)
|
||||
{
|
||||
struct via_spec *spec = codec->spec;
|
||||
hda_nid_t nid, conn[8];
|
||||
unsigned int type;
|
||||
int i, n;
|
||||
|
||||
for (i = 0; i < spec->num_adc_nids; i++) {
|
||||
nid = spec->adc_nids[i];
|
||||
while (nid) {
|
||||
type = (get_wcaps(codec, nid) & AC_WCAP_TYPE)
|
||||
>> AC_WCAP_TYPE_SHIFT;
|
||||
if (type == AC_WID_PIN)
|
||||
break;
|
||||
n = snd_hda_get_connections(codec, nid, conn,
|
||||
ARRAY_SIZE(conn));
|
||||
if (n <= 0)
|
||||
break;
|
||||
if (n > 1) {
|
||||
spec->mux_nids[i] = nid;
|
||||
break;
|
||||
}
|
||||
nid = conn[0];
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int patch_vt1708(struct hda_codec *codec)
|
||||
{
|
||||
struct via_spec *spec;
|
||||
|
|
@ -1799,6 +1804,7 @@ static int vt1709_parse_auto_config(struct hda_codec *codec)
|
|||
|
||||
if (spec->autocfg.dig_outs)
|
||||
spec->multiout.dig_out_nid = VT1709_DIGOUT_NID;
|
||||
spec->dig_in_pin = VT1709_DIGIN_PIN;
|
||||
if (spec->autocfg.dig_in_pin)
|
||||
spec->dig_in_nid = VT1709_DIGIN_NID;
|
||||
|
||||
|
|
@ -1859,6 +1865,7 @@ static int patch_vt1709_10ch(struct hda_codec *codec)
|
|||
if (!spec->adc_nids && spec->input_mux) {
|
||||
spec->adc_nids = vt1709_adc_nids;
|
||||
spec->num_adc_nids = ARRAY_SIZE(vt1709_adc_nids);
|
||||
get_mux_nids(codec);
|
||||
spec->mixers[spec->num_mixers] = vt1709_capture_mixer;
|
||||
spec->num_mixers++;
|
||||
}
|
||||
|
|
@ -1952,6 +1959,7 @@ static int patch_vt1709_6ch(struct hda_codec *codec)
|
|||
if (!spec->adc_nids && spec->input_mux) {
|
||||
spec->adc_nids = vt1709_adc_nids;
|
||||
spec->num_adc_nids = ARRAY_SIZE(vt1709_adc_nids);
|
||||
get_mux_nids(codec);
|
||||
spec->mixers[spec->num_mixers] = vt1709_capture_mixer;
|
||||
spec->num_mixers++;
|
||||
}
|
||||
|
|
@ -2344,6 +2352,7 @@ static int vt1708B_parse_auto_config(struct hda_codec *codec)
|
|||
|
||||
if (spec->autocfg.dig_outs)
|
||||
spec->multiout.dig_out_nid = VT1708B_DIGOUT_NID;
|
||||
spec->dig_in_pin = VT1708B_DIGIN_PIN;
|
||||
if (spec->autocfg.dig_in_pin)
|
||||
spec->dig_in_nid = VT1708B_DIGIN_NID;
|
||||
|
||||
|
|
@ -2404,6 +2413,7 @@ static int patch_vt1708B_8ch(struct hda_codec *codec)
|
|||
if (!spec->adc_nids && spec->input_mux) {
|
||||
spec->adc_nids = vt1708B_adc_nids;
|
||||
spec->num_adc_nids = ARRAY_SIZE(vt1708B_adc_nids);
|
||||
get_mux_nids(codec);
|
||||
spec->mixers[spec->num_mixers] = vt1708B_capture_mixer;
|
||||
spec->num_mixers++;
|
||||
}
|
||||
|
|
@ -2455,6 +2465,7 @@ static int patch_vt1708B_4ch(struct hda_codec *codec)
|
|||
if (!spec->adc_nids && spec->input_mux) {
|
||||
spec->adc_nids = vt1708B_adc_nids;
|
||||
spec->num_adc_nids = ARRAY_SIZE(vt1708B_adc_nids);
|
||||
get_mux_nids(codec);
|
||||
spec->mixers[spec->num_mixers] = vt1708B_capture_mixer;
|
||||
spec->num_mixers++;
|
||||
}
|
||||
|
|
@ -2889,6 +2900,7 @@ static int patch_vt1708S(struct hda_codec *codec)
|
|||
if (!spec->adc_nids && spec->input_mux) {
|
||||
spec->adc_nids = vt1708S_adc_nids;
|
||||
spec->num_adc_nids = ARRAY_SIZE(vt1708S_adc_nids);
|
||||
get_mux_nids(codec);
|
||||
spec->mixers[spec->num_mixers] = vt1708S_capture_mixer;
|
||||
spec->num_mixers++;
|
||||
}
|
||||
|
|
@ -3206,6 +3218,7 @@ static int patch_vt1702(struct hda_codec *codec)
|
|||
if (!spec->adc_nids && spec->input_mux) {
|
||||
spec->adc_nids = vt1702_adc_nids;
|
||||
spec->num_adc_nids = ARRAY_SIZE(vt1702_adc_nids);
|
||||
get_mux_nids(codec);
|
||||
spec->mixers[spec->num_mixers] = vt1702_capture_mixer;
|
||||
spec->num_mixers++;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -107,7 +107,7 @@ MODULE_PARM_DESC(dxr_enable, "Enable DXR support for Terratec DMX6FIRE.");
|
|||
|
||||
|
||||
static const struct pci_device_id snd_ice1712_ids[] = {
|
||||
{ PCI_VENDOR_ID_ICE, PCI_DEVICE_ID_ICE_1712, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* ICE1712 */
|
||||
{ PCI_VDEVICE(ICE, PCI_DEVICE_ID_ICE_1712), 0 }, /* ICE1712 */
|
||||
{ 0, }
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -93,7 +93,7 @@ MODULE_PARM_DESC(model, "Use the given board model.");
|
|||
|
||||
/* Both VT1720 and VT1724 have the same PCI IDs */
|
||||
static const struct pci_device_id snd_vt1724_ids[] = {
|
||||
{ PCI_VENDOR_ID_ICE, PCI_DEVICE_ID_VT1724, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
|
||||
{ PCI_VDEVICE(ICE, PCI_DEVICE_ID_VT1724), 0 },
|
||||
{ 0, }
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -421,29 +421,29 @@ struct intel8x0 {
|
|||
};
|
||||
|
||||
static struct pci_device_id snd_intel8x0_ids[] = {
|
||||
{ 0x8086, 0x2415, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* 82801AA */
|
||||
{ 0x8086, 0x2425, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* 82901AB */
|
||||
{ 0x8086, 0x2445, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* 82801BA */
|
||||
{ 0x8086, 0x2485, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* ICH3 */
|
||||
{ 0x8086, 0x24c5, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL_ICH4 }, /* ICH4 */
|
||||
{ 0x8086, 0x24d5, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL_ICH4 }, /* ICH5 */
|
||||
{ 0x8086, 0x25a6, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL_ICH4 }, /* ESB */
|
||||
{ 0x8086, 0x266e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL_ICH4 }, /* ICH6 */
|
||||
{ 0x8086, 0x27de, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL_ICH4 }, /* ICH7 */
|
||||
{ 0x8086, 0x2698, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL_ICH4 }, /* ESB2 */
|
||||
{ 0x8086, 0x7195, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* 440MX */
|
||||
{ 0x1039, 0x7012, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_SIS }, /* SI7012 */
|
||||
{ 0x10de, 0x01b1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_NFORCE }, /* NFORCE */
|
||||
{ 0x10de, 0x003a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_NFORCE }, /* MCP04 */
|
||||
{ 0x10de, 0x006a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_NFORCE }, /* NFORCE2 */
|
||||
{ 0x10de, 0x0059, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_NFORCE }, /* CK804 */
|
||||
{ 0x10de, 0x008a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_NFORCE }, /* CK8 */
|
||||
{ 0x10de, 0x00da, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_NFORCE }, /* NFORCE3 */
|
||||
{ 0x10de, 0x00ea, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_NFORCE }, /* CK8S */
|
||||
{ 0x10de, 0x026b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_NFORCE }, /* MCP51 */
|
||||
{ 0x1022, 0x746d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* AMD8111 */
|
||||
{ 0x1022, 0x7445, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* AMD768 */
|
||||
{ 0x10b9, 0x5455, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_ALI }, /* Ali5455 */
|
||||
{ PCI_VDEVICE(INTEL, 0x2415), DEVICE_INTEL }, /* 82801AA */
|
||||
{ PCI_VDEVICE(INTEL, 0x2425), DEVICE_INTEL }, /* 82901AB */
|
||||
{ PCI_VDEVICE(INTEL, 0x2445), DEVICE_INTEL }, /* 82801BA */
|
||||
{ PCI_VDEVICE(INTEL, 0x2485), DEVICE_INTEL }, /* ICH3 */
|
||||
{ PCI_VDEVICE(INTEL, 0x24c5), DEVICE_INTEL_ICH4 }, /* ICH4 */
|
||||
{ PCI_VDEVICE(INTEL, 0x24d5), DEVICE_INTEL_ICH4 }, /* ICH5 */
|
||||
{ PCI_VDEVICE(INTEL, 0x25a6), DEVICE_INTEL_ICH4 }, /* ESB */
|
||||
{ PCI_VDEVICE(INTEL, 0x266e), DEVICE_INTEL_ICH4 }, /* ICH6 */
|
||||
{ PCI_VDEVICE(INTEL, 0x27de), DEVICE_INTEL_ICH4 }, /* ICH7 */
|
||||
{ PCI_VDEVICE(INTEL, 0x2698), DEVICE_INTEL_ICH4 }, /* ESB2 */
|
||||
{ PCI_VDEVICE(INTEL, 0x7195), DEVICE_INTEL }, /* 440MX */
|
||||
{ PCI_VDEVICE(SI, 0x7012), DEVICE_SIS }, /* SI7012 */
|
||||
{ PCI_VDEVICE(NVIDIA, 0x01b1), DEVICE_NFORCE }, /* NFORCE */
|
||||
{ PCI_VDEVICE(NVIDIA, 0x003a), DEVICE_NFORCE }, /* MCP04 */
|
||||
{ PCI_VDEVICE(NVIDIA, 0x006a), DEVICE_NFORCE }, /* NFORCE2 */
|
||||
{ PCI_VDEVICE(NVIDIA, 0x0059), DEVICE_NFORCE }, /* CK804 */
|
||||
{ PCI_VDEVICE(NVIDIA, 0x008a), DEVICE_NFORCE }, /* CK8 */
|
||||
{ PCI_VDEVICE(NVIDIA, 0x00da), DEVICE_NFORCE }, /* NFORCE3 */
|
||||
{ PCI_VDEVICE(NVIDIA, 0x00ea), DEVICE_NFORCE }, /* CK8S */
|
||||
{ PCI_VDEVICE(NVIDIA, 0x026b), DEVICE_NFORCE }, /* MCP51 */
|
||||
{ PCI_VDEVICE(AMD, 0x746d), DEVICE_INTEL }, /* AMD8111 */
|
||||
{ PCI_VDEVICE(AMD, 0x7445), DEVICE_INTEL }, /* AMD768 */
|
||||
{ PCI_VDEVICE(AL, 0x5455), DEVICE_ALI }, /* Ali5455 */
|
||||
{ 0, }
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -220,24 +220,24 @@ struct intel8x0m {
|
|||
};
|
||||
|
||||
static struct pci_device_id snd_intel8x0m_ids[] = {
|
||||
{ 0x8086, 0x2416, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* 82801AA */
|
||||
{ 0x8086, 0x2426, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* 82901AB */
|
||||
{ 0x8086, 0x2446, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* 82801BA */
|
||||
{ 0x8086, 0x2486, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* ICH3 */
|
||||
{ 0x8086, 0x24c6, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* ICH4 */
|
||||
{ 0x8086, 0x24d6, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* ICH5 */
|
||||
{ 0x8086, 0x266d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* ICH6 */
|
||||
{ 0x8086, 0x27dd, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* ICH7 */
|
||||
{ 0x8086, 0x7196, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* 440MX */
|
||||
{ 0x1022, 0x7446, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* AMD768 */
|
||||
{ 0x1039, 0x7013, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_SIS }, /* SI7013 */
|
||||
{ 0x10de, 0x01c1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_NFORCE }, /* NFORCE */
|
||||
{ 0x10de, 0x0069, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_NFORCE }, /* NFORCE2 */
|
||||
{ 0x10de, 0x0089, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_NFORCE }, /* NFORCE2s */
|
||||
{ 0x10de, 0x00d9, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_NFORCE }, /* NFORCE3 */
|
||||
{ PCI_VDEVICE(INTEL, 0x2416), DEVICE_INTEL }, /* 82801AA */
|
||||
{ PCI_VDEVICE(INTEL, 0x2426), DEVICE_INTEL }, /* 82901AB */
|
||||
{ PCI_VDEVICE(INTEL, 0x2446), DEVICE_INTEL }, /* 82801BA */
|
||||
{ PCI_VDEVICE(INTEL, 0x2486), DEVICE_INTEL }, /* ICH3 */
|
||||
{ PCI_VDEVICE(INTEL, 0x24c6), DEVICE_INTEL }, /* ICH4 */
|
||||
{ PCI_VDEVICE(INTEL, 0x24d6), DEVICE_INTEL }, /* ICH5 */
|
||||
{ PCI_VDEVICE(INTEL, 0x266d), DEVICE_INTEL }, /* ICH6 */
|
||||
{ PCI_VDEVICE(INTEL, 0x27dd), DEVICE_INTEL }, /* ICH7 */
|
||||
{ PCI_VDEVICE(INTEL, 0x7196), DEVICE_INTEL }, /* 440MX */
|
||||
{ PCI_VDEVICE(AMD, 0x7446), DEVICE_INTEL }, /* AMD768 */
|
||||
{ PCI_VDEVICE(SI, 0x7013), DEVICE_SIS }, /* SI7013 */
|
||||
{ PCI_VDEVICE(NVIDIA, 0x01c1), DEVICE_NFORCE }, /* NFORCE */
|
||||
{ PCI_VDEVICE(NVIDIA, 0x0069), DEVICE_NFORCE }, /* NFORCE2 */
|
||||
{ PCI_VDEVICE(NVIDIA, 0x0089), DEVICE_NFORCE }, /* NFORCE2s */
|
||||
{ PCI_VDEVICE(NVIDIA, 0x00d9), DEVICE_NFORCE }, /* NFORCE3 */
|
||||
#if 0
|
||||
{ 0x1022, 0x746d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* AMD8111 */
|
||||
{ 0x10b9, 0x5455, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_ALI }, /* Ali5455 */
|
||||
{ PCI_VDEVICE(AMD, 0x746d), DEVICE_INTEL }, /* AMD8111 */
|
||||
{ PCI_VDEVICE(AL, 0x5455), DEVICE_ALI }, /* Ali5455 */
|
||||
#endif
|
||||
{ 0, }
|
||||
};
|
||||
|
|
|
|||
|
|
@ -654,13 +654,12 @@ static int __devinit lx_init_ethersound_config(struct lx6464es *chip)
|
|||
int i;
|
||||
u32 orig_conf_es = lx_dsp_reg_read(chip, eReg_CONFES);
|
||||
|
||||
u32 default_conf_es = (64 << IOCR_OUTPUTS_OFFSET) |
|
||||
/* configure 64 io channels */
|
||||
u32 conf_es = (orig_conf_es & CONFES_READ_PART_MASK) |
|
||||
(64 << IOCR_INPUTS_OFFSET) |
|
||||
(64 << IOCR_OUTPUTS_OFFSET) |
|
||||
(FREQ_RATIO_SINGLE_MODE << FREQ_RATIO_OFFSET);
|
||||
|
||||
u32 conf_es = (orig_conf_es & CONFES_READ_PART_MASK)
|
||||
| (default_conf_es & CONFES_WRITE_PART_MASK);
|
||||
|
||||
snd_printdd("->lx_init_ethersound\n");
|
||||
|
||||
chip->freq_ratio = FREQ_RATIO_SINGLE_MODE;
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ MODULE_PARM_DESC(enable, "Enable Digigram " CARD_NAME " soundcard.");
|
|||
*/
|
||||
|
||||
static struct pci_device_id snd_mixart_ids[] = {
|
||||
{ 0x1057, 0x0003, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* MC8240 */
|
||||
{ PCI_VDEVICE(MOTOROLA, 0x0003), 0, }, /* MC8240 */
|
||||
{ 0, }
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -263,9 +263,9 @@ struct nm256 {
|
|||
* PCI ids
|
||||
*/
|
||||
static struct pci_device_id snd_nm256_ids[] = {
|
||||
{PCI_VENDOR_ID_NEOMAGIC, PCI_DEVICE_ID_NEOMAGIC_NM256AV_AUDIO, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
||||
{PCI_VENDOR_ID_NEOMAGIC, PCI_DEVICE_ID_NEOMAGIC_NM256ZX_AUDIO, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
||||
{PCI_VENDOR_ID_NEOMAGIC, PCI_DEVICE_ID_NEOMAGIC_NM256XL_PLUS_AUDIO, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
|
||||
{PCI_VDEVICE(NEOMAGIC, PCI_DEVICE_ID_NEOMAGIC_NM256AV_AUDIO), 0},
|
||||
{PCI_VDEVICE(NEOMAGIC, PCI_DEVICE_ID_NEOMAGIC_NM256ZX_AUDIO), 0},
|
||||
{PCI_VDEVICE(NEOMAGIC, PCI_DEVICE_ID_NEOMAGIC_NM256XL_PLUS_AUDIO), 0},
|
||||
{0,},
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -575,8 +575,10 @@ static int ac97_switch_put(struct snd_kcontrol *ctl,
|
|||
static int ac97_volume_info(struct snd_kcontrol *ctl,
|
||||
struct snd_ctl_elem_info *info)
|
||||
{
|
||||
int stereo = (ctl->private_value >> 16) & 1;
|
||||
|
||||
info->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
|
||||
info->count = 2;
|
||||
info->count = stereo ? 2 : 1;
|
||||
info->value.integer.min = 0;
|
||||
info->value.integer.max = 0x1f;
|
||||
return 0;
|
||||
|
|
@ -587,6 +589,7 @@ static int ac97_volume_get(struct snd_kcontrol *ctl,
|
|||
{
|
||||
struct oxygen *chip = ctl->private_data;
|
||||
unsigned int codec = (ctl->private_value >> 24) & 1;
|
||||
int stereo = (ctl->private_value >> 16) & 1;
|
||||
unsigned int index = ctl->private_value & 0xff;
|
||||
u16 reg;
|
||||
|
||||
|
|
@ -594,7 +597,8 @@ static int ac97_volume_get(struct snd_kcontrol *ctl,
|
|||
reg = oxygen_read_ac97(chip, codec, index);
|
||||
mutex_unlock(&chip->mutex);
|
||||
value->value.integer.value[0] = 31 - (reg & 0x1f);
|
||||
value->value.integer.value[1] = 31 - ((reg >> 8) & 0x1f);
|
||||
if (stereo)
|
||||
value->value.integer.value[1] = 31 - ((reg >> 8) & 0x1f);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -603,6 +607,7 @@ static int ac97_volume_put(struct snd_kcontrol *ctl,
|
|||
{
|
||||
struct oxygen *chip = ctl->private_data;
|
||||
unsigned int codec = (ctl->private_value >> 24) & 1;
|
||||
int stereo = (ctl->private_value >> 16) & 1;
|
||||
unsigned int index = ctl->private_value & 0xff;
|
||||
u16 oldreg, newreg;
|
||||
int change;
|
||||
|
|
@ -612,8 +617,11 @@ static int ac97_volume_put(struct snd_kcontrol *ctl,
|
|||
newreg = oldreg;
|
||||
newreg = (newreg & ~0x1f) |
|
||||
(31 - (value->value.integer.value[0] & 0x1f));
|
||||
newreg = (newreg & ~0x1f00) |
|
||||
((31 - (value->value.integer.value[0] & 0x1f)) << 8);
|
||||
if (stereo)
|
||||
newreg = (newreg & ~0x1f00) |
|
||||
((31 - (value->value.integer.value[1] & 0x1f)) << 8);
|
||||
else
|
||||
newreg = (newreg & ~0x1f00) | ((newreg & 0x1f) << 8);
|
||||
change = newreg != oldreg;
|
||||
if (change)
|
||||
oxygen_write_ac97(chip, codec, index, newreg);
|
||||
|
|
@ -673,7 +681,7 @@ static int ac97_fp_rec_volume_put(struct snd_kcontrol *ctl,
|
|||
.private_value = ((codec) << 24) | ((invert) << 16) | \
|
||||
((bitnr) << 8) | (index), \
|
||||
}
|
||||
#define AC97_VOLUME(xname, codec, index) { \
|
||||
#define AC97_VOLUME(xname, codec, index, stereo) { \
|
||||
.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
|
||||
.name = xname, \
|
||||
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \
|
||||
|
|
@ -682,7 +690,7 @@ static int ac97_fp_rec_volume_put(struct snd_kcontrol *ctl,
|
|||
.get = ac97_volume_get, \
|
||||
.put = ac97_volume_put, \
|
||||
.tlv = { .p = ac97_db_scale, }, \
|
||||
.private_value = ((codec) << 24) | (index), \
|
||||
.private_value = ((codec) << 24) | ((stereo) << 16) | (index), \
|
||||
}
|
||||
|
||||
static DECLARE_TLV_DB_SCALE(monitor_db_scale, -1000, 1000, 0);
|
||||
|
|
@ -882,18 +890,18 @@ static const struct {
|
|||
};
|
||||
|
||||
static const struct snd_kcontrol_new ac97_controls[] = {
|
||||
AC97_VOLUME("Mic Capture Volume", 0, AC97_MIC),
|
||||
AC97_VOLUME("Mic Capture Volume", 0, AC97_MIC, 0),
|
||||
AC97_SWITCH("Mic Capture Switch", 0, AC97_MIC, 15, 1),
|
||||
AC97_SWITCH("Mic Boost (+20dB)", 0, AC97_MIC, 6, 0),
|
||||
AC97_SWITCH("Line Capture Switch", 0, AC97_LINE, 15, 1),
|
||||
AC97_VOLUME("CD Capture Volume", 0, AC97_CD),
|
||||
AC97_VOLUME("CD Capture Volume", 0, AC97_CD, 1),
|
||||
AC97_SWITCH("CD Capture Switch", 0, AC97_CD, 15, 1),
|
||||
AC97_VOLUME("Aux Capture Volume", 0, AC97_AUX),
|
||||
AC97_VOLUME("Aux Capture Volume", 0, AC97_AUX, 1),
|
||||
AC97_SWITCH("Aux Capture Switch", 0, AC97_AUX, 15, 1),
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new ac97_fp_controls[] = {
|
||||
AC97_VOLUME("Front Panel Playback Volume", 1, AC97_HEADPHONE),
|
||||
AC97_VOLUME("Front Panel Playback Volume", 1, AC97_HEADPHONE, 1),
|
||||
AC97_SWITCH("Front Panel Playback Switch", 1, AC97_HEADPHONE, 15, 1),
|
||||
{
|
||||
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
||||
|
|
|
|||
|
|
@ -635,6 +635,8 @@ static void xonar_d2_resume(struct oxygen *chip)
|
|||
|
||||
static void xonar_d1_resume(struct oxygen *chip)
|
||||
{
|
||||
oxygen_set_bits8(chip, OXYGEN_FUNCTION, OXYGEN_FUNCTION_RESET_CODEC);
|
||||
msleep(1);
|
||||
cs43xx_init(chip);
|
||||
xonar_enable_output(chip);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -227,12 +227,9 @@ struct rme32 {
|
|||
};
|
||||
|
||||
static struct pci_device_id snd_rme32_ids[] = {
|
||||
{PCI_VENDOR_ID_XILINX_RME, PCI_DEVICE_ID_RME_DIGI32,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0,},
|
||||
{PCI_VENDOR_ID_XILINX_RME, PCI_DEVICE_ID_RME_DIGI32_8,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0,},
|
||||
{PCI_VENDOR_ID_XILINX_RME, PCI_DEVICE_ID_RME_DIGI32_PRO,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0,},
|
||||
{PCI_VDEVICE(XILINX_RME, PCI_DEVICE_ID_RME_DIGI32), 0,},
|
||||
{PCI_VDEVICE(XILINX_RME, PCI_DEVICE_ID_RME_DIGI32_8), 0,},
|
||||
{PCI_VDEVICE(XILINX_RME, PCI_DEVICE_ID_RME_DIGI32_PRO), 0,},
|
||||
{0,}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -232,14 +232,10 @@ struct rme96 {
|
|||
};
|
||||
|
||||
static struct pci_device_id snd_rme96_ids[] = {
|
||||
{ PCI_VENDOR_ID_XILINX, PCI_DEVICE_ID_RME_DIGI96,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, },
|
||||
{ PCI_VENDOR_ID_XILINX, PCI_DEVICE_ID_RME_DIGI96_8,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, },
|
||||
{ PCI_VENDOR_ID_XILINX, PCI_DEVICE_ID_RME_DIGI96_8_PRO,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, },
|
||||
{ PCI_VENDOR_ID_XILINX, PCI_DEVICE_ID_RME_DIGI96_8_PAD_OR_PST,
|
||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, },
|
||||
{ PCI_VDEVICE(XILINX, PCI_DEVICE_ID_RME_DIGI96), 0, },
|
||||
{ PCI_VDEVICE(XILINX, PCI_DEVICE_ID_RME_DIGI96_8), 0, },
|
||||
{ PCI_VDEVICE(XILINX, PCI_DEVICE_ID_RME_DIGI96_8_PRO), 0, },
|
||||
{ PCI_VDEVICE(XILINX, PCI_DEVICE_ID_RME_DIGI96_8_PAD_OR_PST), 0, },
|
||||
{ 0, }
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -243,7 +243,7 @@ struct sonicvibes {
|
|||
};
|
||||
|
||||
static struct pci_device_id snd_sonic_ids[] = {
|
||||
{ 0x5333, 0xca00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, },
|
||||
{ PCI_VDEVICE(S3, 0xca00), 0, },
|
||||
{ 0, }
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -402,9 +402,9 @@ struct via82xx {
|
|||
|
||||
static struct pci_device_id snd_via82xx_ids[] = {
|
||||
/* 0x1106, 0x3058 */
|
||||
{ PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_5, PCI_ANY_ID, PCI_ANY_ID, 0, 0, TYPE_CARD_VIA686, }, /* 686A */
|
||||
{ PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_82C686_5), TYPE_CARD_VIA686, }, /* 686A */
|
||||
/* 0x1106, 0x3059 */
|
||||
{ PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8233_5, PCI_ANY_ID, PCI_ANY_ID, 0, 0, TYPE_CARD_VIA8233, }, /* VT8233 */
|
||||
{ PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_8233_5), TYPE_CARD_VIA8233, }, /* VT8233 */
|
||||
{ 0, }
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -261,7 +261,7 @@ struct via82xx_modem {
|
|||
};
|
||||
|
||||
static struct pci_device_id snd_via82xx_modem_ids[] = {
|
||||
{ 0x1106, 0x3068, PCI_ANY_ID, PCI_ANY_ID, 0, 0, TYPE_CARD_VIA82XX_MODEM, },
|
||||
{ PCI_VDEVICE(VIA, 0x3068), TYPE_CARD_VIA82XX_MODEM, },
|
||||
{ 0, }
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -67,12 +67,12 @@ module_param_array(rear_switch, bool, NULL, 0444);
|
|||
MODULE_PARM_DESC(rear_switch, "Enable shared rear/line-in switch");
|
||||
|
||||
static struct pci_device_id snd_ymfpci_ids[] = {
|
||||
{ 0x1073, 0x0004, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* YMF724 */
|
||||
{ 0x1073, 0x000d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* YMF724F */
|
||||
{ 0x1073, 0x000a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* YMF740 */
|
||||
{ 0x1073, 0x000c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* YMF740C */
|
||||
{ 0x1073, 0x0010, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* YMF744 */
|
||||
{ 0x1073, 0x0012, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* YMF754 */
|
||||
{ PCI_VDEVICE(YAMAHA, 0x0004), 0, }, /* YMF724 */
|
||||
{ PCI_VDEVICE(YAMAHA, 0x000d), 0, }, /* YMF724F */
|
||||
{ PCI_VDEVICE(YAMAHA, 0x000a), 0, }, /* YMF740 */
|
||||
{ PCI_VDEVICE(YAMAHA, 0x000c), 0, }, /* YMF740C */
|
||||
{ PCI_VDEVICE(YAMAHA, 0x0010), 0, }, /* YMF744 */
|
||||
{ PCI_VDEVICE(YAMAHA, 0x0012), 0, }, /* YMF754 */
|
||||
{ 0, }
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -281,38 +281,6 @@ static struct snd_soc_card snd_soc_at91sam9g20ek = {
|
|||
.set_bias_level = at91sam9g20ek_set_bias_level,
|
||||
};
|
||||
|
||||
/*
|
||||
* FIXME: This is a temporary bodge to avoid cross-tree merge issues.
|
||||
* New drivers should register the wm8731 I2C device in the machine
|
||||
* setup code (under arch/arm for ARM systems).
|
||||
*/
|
||||
static int wm8731_i2c_register(void)
|
||||
{
|
||||
struct i2c_board_info info;
|
||||
struct i2c_adapter *adapter;
|
||||
struct i2c_client *client;
|
||||
|
||||
memset(&info, 0, sizeof(struct i2c_board_info));
|
||||
info.addr = 0x1b;
|
||||
strlcpy(info.type, "wm8731", I2C_NAME_SIZE);
|
||||
|
||||
adapter = i2c_get_adapter(0);
|
||||
if (!adapter) {
|
||||
printk(KERN_ERR "can't get i2c adapter 0\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
client = i2c_new_device(adapter, &info);
|
||||
i2c_put_adapter(adapter);
|
||||
if (!client) {
|
||||
printk(KERN_ERR "can't add i2c device at 0x%x\n",
|
||||
(unsigned int)info.addr);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct snd_soc_device at91sam9g20ek_snd_devdata = {
|
||||
.card = &snd_soc_at91sam9g20ek,
|
||||
.codec_dev = &soc_codec_dev_wm8731,
|
||||
|
|
@ -367,10 +335,6 @@ static int __init at91sam9g20ek_init(void)
|
|||
}
|
||||
ssc_p->ssc = ssc;
|
||||
|
||||
ret = wm8731_i2c_register();
|
||||
if (ret != 0)
|
||||
goto err_ssc;
|
||||
|
||||
at91sam9g20ek_snd_device = platform_device_alloc("soc-audio", -1);
|
||||
if (!at91sam9g20ek_snd_device) {
|
||||
printk(KERN_ERR "ASoC: Platform device allocation failed\n");
|
||||
|
|
|
|||
|
|
@ -79,7 +79,7 @@ static const u16 wm8753_reg[] = {
|
|||
0x0097, 0x0097, 0x0000, 0x0004,
|
||||
0x0000, 0x0083, 0x0024, 0x01ba,
|
||||
0x0000, 0x0083, 0x0024, 0x01ba,
|
||||
0x0000, 0x0000
|
||||
0x0000, 0x0000, 0x0000
|
||||
};
|
||||
|
||||
/* codec private data */
|
||||
|
|
@ -1660,11 +1660,11 @@ static int wm8753_register(struct wm8753_priv *wm8753)
|
|||
codec->set_bias_level = wm8753_set_bias_level;
|
||||
codec->dai = wm8753_dai;
|
||||
codec->num_dai = 2;
|
||||
codec->reg_cache_size = ARRAY_SIZE(wm8753->reg_cache);
|
||||
codec->reg_cache_size = ARRAY_SIZE(wm8753->reg_cache) + 1;
|
||||
codec->reg_cache = &wm8753->reg_cache;
|
||||
codec->private_data = wm8753;
|
||||
|
||||
memcpy(codec->reg_cache, wm8753_reg, sizeof(codec->reg_cache));
|
||||
memcpy(codec->reg_cache, wm8753_reg, sizeof(wm8753->reg_cache));
|
||||
INIT_DELAYED_WORK(&codec->delayed_work, wm8753_work);
|
||||
|
||||
ret = wm8753_reset(codec);
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ config SND_SOC_MPC5200_I2S
|
|||
config SND_SOC_MPC5200_AC97
|
||||
tristate "Freescale MPC5200 PSC in AC97 mode driver"
|
||||
depends on PPC_MPC52xx && PPC_BESTCOMM
|
||||
select AC97_BUS
|
||||
select SND_SOC_AC97_BUS
|
||||
select SND_MPC52xx_DMA
|
||||
select PPC_BESTCOMM_GEN_BD
|
||||
help
|
||||
|
|
@ -41,7 +41,7 @@ config SND_SOC_MPC5200_AC97
|
|||
|
||||
config SND_MPC52xx_SOC_PCM030
|
||||
tristate "SoC AC97 Audio support for Phytec pcm030 and WM9712"
|
||||
depends on PPC_MPC5200_SIMPLE && BROKEN
|
||||
depends on PPC_MPC5200_SIMPLE
|
||||
select SND_SOC_MPC5200_AC97
|
||||
select SND_SOC_WM9712
|
||||
help
|
||||
|
|
@ -50,7 +50,7 @@ config SND_MPC52xx_SOC_PCM030
|
|||
|
||||
config SND_MPC52xx_SOC_EFIKA
|
||||
tristate "SoC AC97 Audio support for bbplan Efika and STAC9766"
|
||||
depends on PPC_EFIKA && BROKEN
|
||||
depends on PPC_EFIKA
|
||||
select SND_SOC_MPC5200_AC97
|
||||
select SND_SOC_STAC9766
|
||||
help
|
||||
|
|
|
|||
|
|
@ -456,6 +456,7 @@ int mpc5200_audio_dma_create(struct of_device *op)
|
|||
return -ENODEV;
|
||||
|
||||
spin_lock_init(&psc_dma->lock);
|
||||
mutex_init(&psc_dma->mutex);
|
||||
psc_dma->id = be32_to_cpu(*prop);
|
||||
psc_dma->irq = irq;
|
||||
psc_dma->psc_regs = regs;
|
||||
|
|
|
|||
|
|
@ -55,6 +55,7 @@ struct psc_dma {
|
|||
unsigned int irq;
|
||||
struct device *dev;
|
||||
spinlock_t lock;
|
||||
struct mutex mutex;
|
||||
u32 sicr;
|
||||
uint sysclk;
|
||||
int imr;
|
||||
|
|
|
|||
|
|
@ -34,13 +34,20 @@ static unsigned short psc_ac97_read(struct snd_ac97 *ac97, unsigned short reg)
|
|||
int status;
|
||||
unsigned int val;
|
||||
|
||||
mutex_lock(&psc_dma->mutex);
|
||||
|
||||
/* Wait for command send status zero = ready */
|
||||
status = spin_event_timeout(!(in_be16(&psc_dma->psc_regs->sr_csr.status) &
|
||||
MPC52xx_PSC_SR_CMDSEND), 100, 0);
|
||||
if (status == 0) {
|
||||
pr_err("timeout on ac97 bus (rdy)\n");
|
||||
mutex_unlock(&psc_dma->mutex);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/* Force clear the data valid bit */
|
||||
in_be32(&psc_dma->psc_regs->ac97_data);
|
||||
|
||||
/* Send the read */
|
||||
out_be32(&psc_dma->psc_regs->ac97_cmd, (1<<31) | ((reg & 0x7f) << 24));
|
||||
|
||||
|
|
@ -50,16 +57,19 @@ static unsigned short psc_ac97_read(struct snd_ac97 *ac97, unsigned short reg)
|
|||
if (status == 0) {
|
||||
pr_err("timeout on ac97 read (val) %x\n",
|
||||
in_be16(&psc_dma->psc_regs->sr_csr.status));
|
||||
mutex_unlock(&psc_dma->mutex);
|
||||
return -ENODEV;
|
||||
}
|
||||
/* Get the data */
|
||||
val = in_be32(&psc_dma->psc_regs->ac97_data);
|
||||
if (((val >> 24) & 0x7f) != reg) {
|
||||
pr_err("reg echo error on ac97 read\n");
|
||||
mutex_unlock(&psc_dma->mutex);
|
||||
return -ENODEV;
|
||||
}
|
||||
val = (val >> 8) & 0xffff;
|
||||
|
||||
mutex_unlock(&psc_dma->mutex);
|
||||
return (unsigned short) val;
|
||||
}
|
||||
|
||||
|
|
@ -68,16 +78,21 @@ static void psc_ac97_write(struct snd_ac97 *ac97,
|
|||
{
|
||||
int status;
|
||||
|
||||
mutex_lock(&psc_dma->mutex);
|
||||
|
||||
/* Wait for command status zero = ready */
|
||||
status = spin_event_timeout(!(in_be16(&psc_dma->psc_regs->sr_csr.status) &
|
||||
MPC52xx_PSC_SR_CMDSEND), 100, 0);
|
||||
if (status == 0) {
|
||||
pr_err("timeout on ac97 bus (write)\n");
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
/* Write data */
|
||||
out_be32(&psc_dma->psc_regs->ac97_cmd,
|
||||
((reg & 0x7f) << 24) | (val << 8));
|
||||
|
||||
out:
|
||||
mutex_unlock(&psc_dma->mutex);
|
||||
}
|
||||
|
||||
static void psc_ac97_warm_reset(struct snd_ac97 *ac97)
|
||||
|
|
|
|||
|
|
@ -216,12 +216,15 @@ static snd_pcm_uframes_t omap_pcm_pointer(struct snd_pcm_substream *substream)
|
|||
dma_addr_t ptr;
|
||||
snd_pcm_uframes_t offset;
|
||||
|
||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
|
||||
ptr = omap_get_dma_src_pos(prtd->dma_ch);
|
||||
else
|
||||
if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
|
||||
ptr = omap_get_dma_dst_pos(prtd->dma_ch);
|
||||
offset = bytes_to_frames(runtime, ptr - runtime->dma_addr);
|
||||
} else if (!(cpu_is_omap1510())) {
|
||||
ptr = omap_get_dma_src_pos(prtd->dma_ch);
|
||||
offset = bytes_to_frames(runtime, ptr - runtime->dma_addr);
|
||||
} else
|
||||
offset = prtd->period_index * runtime->period_size;
|
||||
|
||||
offset = bytes_to_frames(runtime, ptr - runtime->dma_addr);
|
||||
if (offset >= runtime->buffer_size)
|
||||
offset = 0;
|
||||
|
||||
|
|
|
|||
|
|
@ -167,6 +167,7 @@ static int pxa2xx_i2s_hw_params(struct snd_pcm_substream *substream,
|
|||
|
||||
BUG_ON(IS_ERR(clk_i2s));
|
||||
clk_enable(clk_i2s);
|
||||
dai->private_data = dai;
|
||||
pxa_i2s_wait();
|
||||
|
||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
|
||||
|
|
@ -255,7 +256,10 @@ static void pxa2xx_i2s_shutdown(struct snd_pcm_substream *substream,
|
|||
if ((SACR1 & (SACR1_DREC | SACR1_DRPL)) == (SACR1_DREC | SACR1_DRPL)) {
|
||||
SACR0 &= ~SACR0_ENB;
|
||||
pxa_i2s_wait();
|
||||
clk_disable(clk_i2s);
|
||||
if (dai->private_data != NULL) {
|
||||
clk_disable(clk_i2s);
|
||||
dai->private_data = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -336,6 +340,7 @@ static int pxa2xx_i2s_probe(struct platform_device *dev)
|
|||
return PTR_ERR(clk_i2s);
|
||||
|
||||
pxa_i2s_dai.dev = &dev->dev;
|
||||
pxa_i2s_dai.private_data = NULL;
|
||||
ret = snd_soc_register_dai(&pxa_i2s_dai);
|
||||
if (ret != 0)
|
||||
clk_put(clk_i2s);
|
||||
|
|
|
|||
|
|
@ -10,6 +10,8 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/kdev_t.h>
|
||||
#include <linux/major.h>
|
||||
#include <sound/core.h>
|
||||
|
||||
#ifdef CONFIG_SOUND_OSS_CORE
|
||||
|
|
@ -29,6 +31,8 @@ MODULE_LICENSE("GPL");
|
|||
|
||||
static char *sound_nodename(struct device *dev)
|
||||
{
|
||||
if (MAJOR(dev->devt) == SOUND_MAJOR)
|
||||
return NULL;
|
||||
return kasprintf(GFP_KERNEL, "snd/%s", dev_name(dev));
|
||||
}
|
||||
|
||||
|
|
@ -104,7 +108,6 @@ module_exit(cleanup_soundcore);
|
|||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/sound.h>
|
||||
#include <linux/major.h>
|
||||
#include <linux/kmod.h>
|
||||
|
||||
#define SOUND_STEP 16
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@
|
|||
#include "input.h"
|
||||
|
||||
MODULE_AUTHOR("Daniel Mack <[email protected]>");
|
||||
MODULE_DESCRIPTION("caiaq USB audio, version 1.3.17");
|
||||
MODULE_DESCRIPTION("caiaq USB audio, version 1.3.18");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_SUPPORTED_DEVICE("{{Native Instruments, RigKontrol2},"
|
||||
"{Native Instruments, RigKontrol3},"
|
||||
|
|
@ -349,7 +349,9 @@ static void __devinit setup_card(struct snd_usb_caiaqdev *dev)
|
|||
log("Unable to set up control system (ret=%d)\n", ret);
|
||||
}
|
||||
|
||||
static int create_card(struct usb_device* usb_dev, struct snd_card **cardp)
|
||||
static int create_card(struct usb_device *usb_dev,
|
||||
struct usb_interface *intf,
|
||||
struct snd_card **cardp)
|
||||
{
|
||||
int devnum;
|
||||
int err;
|
||||
|
|
@ -374,7 +376,7 @@ static int create_card(struct usb_device* usb_dev, struct snd_card **cardp)
|
|||
dev->chip.usb_id = USB_ID(le16_to_cpu(usb_dev->descriptor.idVendor),
|
||||
le16_to_cpu(usb_dev->descriptor.idProduct));
|
||||
spin_lock_init(&dev->spinlock);
|
||||
snd_card_set_dev(card, &usb_dev->dev);
|
||||
snd_card_set_dev(card, &intf->dev);
|
||||
|
||||
*cardp = card;
|
||||
return 0;
|
||||
|
|
@ -461,7 +463,7 @@ static int __devinit snd_probe(struct usb_interface *intf,
|
|||
struct snd_card *card;
|
||||
struct usb_device *device = interface_to_usbdev(intf);
|
||||
|
||||
ret = create_card(device, &card);
|
||||
ret = create_card(device, intf, &card);
|
||||
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -514,7 +514,6 @@ static int usx2y_create_card(struct usb_device *device, struct snd_card **cardp)
|
|||
US122L(card)->chip.dev->bus->busnum,
|
||||
US122L(card)->chip.dev->devnum
|
||||
);
|
||||
snd_card_set_dev(card, &device->dev);
|
||||
*cardp = card;
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -531,6 +530,7 @@ static int us122l_usb_probe(struct usb_interface *intf,
|
|||
if (err < 0)
|
||||
return err;
|
||||
|
||||
snd_card_set_dev(card, &intf->dev);
|
||||
if (!us122l_create_card(card)) {
|
||||
snd_card_free(card);
|
||||
return -EINVAL;
|
||||
|
|
|
|||
|
|
@ -364,7 +364,6 @@ static int usX2Y_create_card(struct usb_device *device, struct snd_card **cardp)
|
|||
0,//us428(card)->usbmidi.ifnum,
|
||||
usX2Y(card)->chip.dev->bus->busnum, usX2Y(card)->chip.dev->devnum
|
||||
);
|
||||
snd_card_set_dev(card, &device->dev);
|
||||
*cardp = card;
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -388,6 +387,7 @@ static int usX2Y_usb_probe(struct usb_device *device,
|
|||
err = usX2Y_create_card(device, &card);
|
||||
if (err < 0)
|
||||
return err;
|
||||
snd_card_set_dev(card, &intf->dev);
|
||||
if ((err = usX2Y_hwdep_new(card, device)) < 0 ||
|
||||
(err = snd_card_register(card)) < 0) {
|
||||
snd_card_free(card);
|
||||
|
|
|
|||
|
|
@ -296,9 +296,10 @@ static void usX2Y_error_urb_status(struct usX2Ydev *usX2Y,
|
|||
static void usX2Y_error_sequence(struct usX2Ydev *usX2Y,
|
||||
struct snd_usX2Y_substream *subs, struct urb *urb)
|
||||
{
|
||||
snd_printk(KERN_ERR "Sequence Error!(hcd_frame=%i ep=%i%s;wait=%i,frame=%i).\n"
|
||||
KERN_ERR "Most propably some urb of usb-frame %i is still missing.\n"
|
||||
KERN_ERR "Cause could be too long delays in usb-hcd interrupt handling.\n",
|
||||
snd_printk(KERN_ERR
|
||||
"Sequence Error!(hcd_frame=%i ep=%i%s;wait=%i,frame=%i).\n"
|
||||
"Most propably some urb of usb-frame %i is still missing.\n"
|
||||
"Cause could be too long delays in usb-hcd interrupt handling.\n",
|
||||
usb_get_current_frame_number(usX2Y->chip.dev),
|
||||
subs->endpoint, usb_pipein(urb->pipe) ? "in" : "out",
|
||||
usX2Y->wait_iso_frame, urb->start_frame, usX2Y->wait_iso_frame);
|
||||
|
|
|
|||
Loading…
Reference in a new issue