Merge branch 'devel-stable' into devel
Conflicts: MAINTAINERS arch/arm/mm/fault.c
This commit is contained in:
@@ -182,6 +182,10 @@ static int pmf_set_notify(struct gpio_runtime *rt,
|
||||
if (!old && notify) {
|
||||
irq_client = kzalloc(sizeof(struct pmf_irq_client),
|
||||
GFP_KERNEL);
|
||||
if (!irq_client) {
|
||||
err = -ENOMEM;
|
||||
goto out_unlock;
|
||||
}
|
||||
irq_client->data = notif;
|
||||
irq_client->handler = pmf_handle_notify_irq;
|
||||
irq_client->owner = THIS_MODULE;
|
||||
|
@@ -75,7 +75,7 @@ int __pxa2xx_pcm_hw_free(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct pxa2xx_runtime_data *rtd = substream->runtime->private_data;
|
||||
|
||||
if (rtd && rtd->params)
|
||||
if (rtd && rtd->params && rtd->params->drcmr)
|
||||
*rtd->params->drcmr = 0;
|
||||
|
||||
snd_pcm_set_runtime_buffer(substream, NULL);
|
||||
|
@@ -233,6 +233,18 @@ static int snd_pcm_update_hw_ptr_interrupt(struct snd_pcm_substream *substream)
|
||||
xrun(substream);
|
||||
return -EPIPE;
|
||||
}
|
||||
if (xrun_debug(substream, 8)) {
|
||||
char name[16];
|
||||
pcm_debug_name(substream, name, sizeof(name));
|
||||
snd_printd("period_update: %s: pos=0x%x/0x%x/0x%x, "
|
||||
"hwptr=0x%lx, hw_base=0x%lx, hw_intr=0x%lx\n",
|
||||
name, (unsigned int)pos,
|
||||
(unsigned int)runtime->period_size,
|
||||
(unsigned int)runtime->buffer_size,
|
||||
(unsigned long)old_hw_ptr,
|
||||
(unsigned long)runtime->hw_ptr_base,
|
||||
(unsigned long)runtime->hw_ptr_interrupt);
|
||||
}
|
||||
hw_base = runtime->hw_ptr_base;
|
||||
new_hw_ptr = hw_base + pos;
|
||||
hw_ptr_interrupt = runtime->hw_ptr_interrupt + runtime->period_size;
|
||||
@@ -244,18 +256,27 @@ static int snd_pcm_update_hw_ptr_interrupt(struct snd_pcm_substream *substream)
|
||||
delta = new_hw_ptr - hw_ptr_interrupt;
|
||||
}
|
||||
if (delta < 0) {
|
||||
delta += runtime->buffer_size;
|
||||
if (runtime->periods == 1 || new_hw_ptr < old_hw_ptr)
|
||||
delta += runtime->buffer_size;
|
||||
if (delta < 0) {
|
||||
hw_ptr_error(substream,
|
||||
"Unexpected hw_pointer value "
|
||||
"(stream=%i, pos=%ld, intr_ptr=%ld)\n",
|
||||
substream->stream, (long)pos,
|
||||
(long)hw_ptr_interrupt);
|
||||
#if 1
|
||||
/* simply skipping the hwptr update seems more
|
||||
* robust in some cases, e.g. on VMware with
|
||||
* inaccurate timer source
|
||||
*/
|
||||
return 0; /* skip this update */
|
||||
#else
|
||||
/* rebase to interrupt position */
|
||||
hw_base = new_hw_ptr = hw_ptr_interrupt;
|
||||
/* align hw_base to buffer_size */
|
||||
hw_base -= hw_base % runtime->buffer_size;
|
||||
delta = 0;
|
||||
#endif
|
||||
} else {
|
||||
hw_base += runtime->buffer_size;
|
||||
if (hw_base >= runtime->boundary)
|
||||
@@ -344,6 +365,19 @@ int snd_pcm_update_hw_ptr(struct snd_pcm_substream *substream)
|
||||
xrun(substream);
|
||||
return -EPIPE;
|
||||
}
|
||||
if (xrun_debug(substream, 16)) {
|
||||
char name[16];
|
||||
pcm_debug_name(substream, name, sizeof(name));
|
||||
snd_printd("hw_update: %s: pos=0x%x/0x%x/0x%x, "
|
||||
"hwptr=0x%lx, hw_base=0x%lx, hw_intr=0x%lx\n",
|
||||
name, (unsigned int)pos,
|
||||
(unsigned int)runtime->period_size,
|
||||
(unsigned int)runtime->buffer_size,
|
||||
(unsigned long)old_hw_ptr,
|
||||
(unsigned long)runtime->hw_ptr_base,
|
||||
(unsigned long)runtime->hw_ptr_interrupt);
|
||||
}
|
||||
|
||||
hw_base = runtime->hw_ptr_base;
|
||||
new_hw_ptr = hw_base + pos;
|
||||
|
||||
|
@@ -3,10 +3,6 @@
|
||||
# Copyright (c) 1999 by Jaroslav Kysela <perex@perex.cz>
|
||||
#
|
||||
|
||||
ifeq ($(CONFIG_SND_SEQUENCER_OSS),y)
|
||||
obj-$(CONFIG_SND_SEQUENCER) += oss/
|
||||
endif
|
||||
|
||||
snd-seq-device-objs := seq_device.o
|
||||
snd-seq-objs := seq.o seq_lock.o seq_clientmgr.o seq_memory.o seq_queue.o \
|
||||
seq_fifo.o seq_prioq.o seq_timer.o \
|
||||
@@ -19,7 +15,8 @@ snd-seq-virmidi-objs := seq_virmidi.o
|
||||
|
||||
obj-$(CONFIG_SND_SEQUENCER) += snd-seq.o snd-seq-device.o
|
||||
ifeq ($(CONFIG_SND_SEQUENCER_OSS),y)
|
||||
obj-$(CONFIG_SND_SEQUENCER) += snd-seq-midi-event.o
|
||||
obj-$(CONFIG_SND_SEQUENCER) += snd-seq-midi-event.o
|
||||
obj-$(CONFIG_SND_SEQUENCER) += oss/
|
||||
endif
|
||||
obj-$(CONFIG_SND_SEQ_DUMMY) += snd-seq-dummy.o
|
||||
|
||||
|
@@ -795,13 +795,13 @@ static int snd_gf1_pcm_volume_put(struct snd_kcontrol *kcontrol, struct snd_ctl_
|
||||
if (!(pcmp->flags & SNDRV_GF1_PCM_PFLG_ACTIVE))
|
||||
continue;
|
||||
/* load real volume - better precision */
|
||||
spin_lock_irqsave(&gus->reg_lock, flags);
|
||||
spin_lock(&gus->reg_lock);
|
||||
snd_gf1_select_voice(gus, pvoice->number);
|
||||
snd_gf1_ctrl_stop(gus, SNDRV_GF1_VB_VOLUME_CONTROL);
|
||||
vol = pvoice == pcmp->pvoices[0] ? gus->gf1.pcm_volume_level_left : gus->gf1.pcm_volume_level_right;
|
||||
snd_gf1_write16(gus, SNDRV_GF1_VW_VOLUME, vol);
|
||||
pcmp->final_volume = 1;
|
||||
spin_unlock_irqrestore(&gus->reg_lock, flags);
|
||||
spin_unlock(&gus->reg_lock);
|
||||
}
|
||||
spin_unlock_irqrestore(&gus->voice_alloc, flags);
|
||||
return change;
|
||||
|
@@ -325,8 +325,9 @@
|
||||
/*
|
||||
* Size of character arrays that store name and version of sound card
|
||||
*/
|
||||
#define CARDNAMELEN 15 /* Size of the card's name in chars */
|
||||
#define CARDVERLEN 2 /* Size of the card's version in chars */
|
||||
#define CARDNAMELEN 15 /* Size of the card's name in chars */
|
||||
#define CARDVERLEN 10 /* Size of the card's version in chars */
|
||||
#define CARDVERDIGITS 2 /* Number of digits in the version */
|
||||
|
||||
#if defined(CONFIG_SC6600)
|
||||
/*
|
||||
@@ -410,7 +411,7 @@
|
||||
|
||||
static int soft_cfg __initdata = 0; /* bitmapped config */
|
||||
static int soft_cfg_mss __initdata = 0; /* bitmapped mss config */
|
||||
static int ver[CARDVERLEN] __initdata = {0, 0}; /* DSP Ver:
|
||||
static int ver[CARDVERDIGITS] __initdata = {0, 0}; /* DSP Ver:
|
||||
hi->ver[0] lo->ver[1] */
|
||||
|
||||
#if defined(CONFIG_SC6600)
|
||||
@@ -957,7 +958,7 @@ static int __init aedsp16_dsp_version(int port)
|
||||
* string is finished.
|
||||
*/
|
||||
ver[len++] = ret;
|
||||
} while (len < CARDVERLEN);
|
||||
} while (len < CARDVERDIGITS);
|
||||
sprintf(DSPVersion, "%d.%d", ver[0], ver[1]);
|
||||
|
||||
DBG(("success.\n"));
|
||||
|
@@ -1074,7 +1074,7 @@ int attach_mpu401(struct address_info *hw_config, struct module *owner)
|
||||
sprintf(mpu_synth_info[m].name, "%s (MPU401)", hw_config->name);
|
||||
else
|
||||
sprintf(mpu_synth_info[m].name,
|
||||
"MPU-401 %d.%d%c Midi interface #%d",
|
||||
"MPU-401 %d.%d%c MIDI #%d",
|
||||
(int) (devc->version & 0xf0) >> 4,
|
||||
devc->version & 0x0f,
|
||||
revision_char,
|
||||
|
@@ -325,9 +325,9 @@ static struct snd_pcm_hardware snd_ca0106_capture_hw = {
|
||||
.rate_max = 192000,
|
||||
.channels_min = 2,
|
||||
.channels_max = 2,
|
||||
.buffer_bytes_max = ((65536 - 64) * 8),
|
||||
.buffer_bytes_max = 65536 - 128,
|
||||
.period_bytes_min = 64,
|
||||
.period_bytes_max = (65536 - 64),
|
||||
.period_bytes_max = 32768 - 64,
|
||||
.periods_min = 2,
|
||||
.periods_max = 2,
|
||||
.fifo_size = 0,
|
||||
|
@@ -242,13 +242,12 @@ static int get_amixer_rsc(struct amixer_mgr *mgr,
|
||||
|
||||
/* Allocate mem for amixer resource */
|
||||
amixer = kzalloc(sizeof(*amixer), GFP_KERNEL);
|
||||
if (NULL == amixer) {
|
||||
err = -ENOMEM;
|
||||
return err;
|
||||
}
|
||||
if (!amixer)
|
||||
return -ENOMEM;
|
||||
|
||||
/* Check whether there are sufficient
|
||||
* amixer resources to meet request. */
|
||||
err = 0;
|
||||
spin_lock_irqsave(&mgr->mgr_lock, flags);
|
||||
for (i = 0; i < desc->msr; i++) {
|
||||
err = mgr_get_resource(&mgr->mgr, 1, &idx);
|
||||
@@ -397,12 +396,11 @@ static int get_sum_rsc(struct sum_mgr *mgr,
|
||||
|
||||
/* Allocate mem for sum resource */
|
||||
sum = kzalloc(sizeof(*sum), GFP_KERNEL);
|
||||
if (NULL == sum) {
|
||||
err = -ENOMEM;
|
||||
return err;
|
||||
}
|
||||
if (!sum)
|
||||
return -ENOMEM;
|
||||
|
||||
/* Check whether there are sufficient sum resources to meet request. */
|
||||
err = 0;
|
||||
spin_lock_irqsave(&mgr->mgr_lock, flags);
|
||||
for (i = 0; i < desc->msr; i++) {
|
||||
err = mgr_get_resource(&mgr->mgr, 1, &idx);
|
||||
|
@@ -57,9 +57,9 @@ struct daio_rsc_idx idx_20k1[NUM_DAIOTYP] = {
|
||||
|
||||
struct daio_rsc_idx idx_20k2[NUM_DAIOTYP] = {
|
||||
[LINEO1] = {.left = 0x40, .right = 0x41},
|
||||
[LINEO2] = {.left = 0x70, .right = 0x71},
|
||||
[LINEO2] = {.left = 0x60, .right = 0x61},
|
||||
[LINEO3] = {.left = 0x50, .right = 0x51},
|
||||
[LINEO4] = {.left = 0x60, .right = 0x61},
|
||||
[LINEO4] = {.left = 0x70, .right = 0x71},
|
||||
[LINEIM] = {.left = 0x45, .right = 0xc5},
|
||||
[SPDIFOO] = {.left = 0x00, .right = 0x01},
|
||||
[SPDIFIO] = {.left = 0x05, .right = 0x85},
|
||||
|
@@ -724,12 +724,11 @@ static int get_srcimp_rsc(struct srcimp_mgr *mgr,
|
||||
|
||||
/* Allocate mem for SRCIMP resource */
|
||||
srcimp = kzalloc(sizeof(*srcimp), GFP_KERNEL);
|
||||
if (NULL == srcimp) {
|
||||
err = -ENOMEM;
|
||||
return err;
|
||||
}
|
||||
if (!srcimp)
|
||||
return -ENOMEM;
|
||||
|
||||
/* Check whether there are sufficient SRCIMP resources. */
|
||||
err = 0;
|
||||
spin_lock_irqsave(&mgr->mgr_lock, flags);
|
||||
for (i = 0; i < desc->msr; i++) {
|
||||
err = mgr_get_resource(&mgr->mgr, 1, &idx);
|
||||
|
@@ -332,6 +332,12 @@ int snd_hda_get_connections(struct hda_codec *codec, hda_nid_t nid,
|
||||
AC_VERB_GET_CONNECT_LIST, i);
|
||||
range_val = !!(parm & (1 << (shift-1))); /* ranges */
|
||||
val = parm & mask;
|
||||
if (val == 0) {
|
||||
snd_printk(KERN_WARNING "hda_codec: "
|
||||
"invalid CONNECT_LIST verb %x[%i]:%x\n",
|
||||
nid, i, parm);
|
||||
return 0;
|
||||
}
|
||||
parm >>= shift;
|
||||
if (range_val) {
|
||||
/* ranges between the previous and this one */
|
||||
|
@@ -508,7 +508,7 @@ static void hdmi_write_eld_info(struct snd_info_entry *entry,
|
||||
char name[64];
|
||||
char *sname;
|
||||
long long val;
|
||||
int n;
|
||||
unsigned int n;
|
||||
|
||||
while (!snd_info_get_line(buffer, line, sizeof(line))) {
|
||||
if (sscanf(line, "%s %llx", name, &val) != 2)
|
||||
@@ -539,7 +539,7 @@ static void hdmi_write_eld_info(struct snd_info_entry *entry,
|
||||
sname++;
|
||||
n = 10 * n + name[4] - '0';
|
||||
}
|
||||
if (n < 0 || n > 31) /* double the CEA limit */
|
||||
if (n >= ELD_MAX_SAD)
|
||||
continue;
|
||||
if (!strcmp(sname, "_coding_type"))
|
||||
e->sad[n].format = val;
|
||||
|
@@ -3754,7 +3754,7 @@ static int ad1884a_mobile_master_sw_put(struct snd_kcontrol *kcontrol,
|
||||
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,
|
||||
snd_hda_codec_write_cache(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,
|
||||
mute ? 0x02 : 0x0);
|
||||
return ret;
|
||||
}
|
||||
|
@@ -275,13 +275,13 @@ struct alc_spec {
|
||||
*/
|
||||
unsigned int num_init_verbs;
|
||||
|
||||
char stream_name_analog[16]; /* analog PCM stream */
|
||||
char stream_name_analog[32]; /* analog PCM stream */
|
||||
struct hda_pcm_stream *stream_analog_playback;
|
||||
struct hda_pcm_stream *stream_analog_capture;
|
||||
struct hda_pcm_stream *stream_analog_alt_playback;
|
||||
struct hda_pcm_stream *stream_analog_alt_capture;
|
||||
|
||||
char stream_name_digital[16]; /* digital PCM stream */
|
||||
char stream_name_digital[32]; /* digital PCM stream */
|
||||
struct hda_pcm_stream *stream_digital_playback;
|
||||
struct hda_pcm_stream *stream_digital_capture;
|
||||
|
||||
@@ -4505,6 +4505,12 @@ static int alc880_parse_auto_config(struct hda_codec *codec)
|
||||
&dig_nid, 1);
|
||||
if (err < 0)
|
||||
continue;
|
||||
if (dig_nid > 0x7f) {
|
||||
printk(KERN_ERR "alc880_auto: invalid dig_nid "
|
||||
"connection 0x%x for NID 0x%x\n", dig_nid,
|
||||
spec->autocfg.dig_out_pins[i]);
|
||||
continue;
|
||||
}
|
||||
if (!i)
|
||||
spec->multiout.dig_out_nid = dig_nid;
|
||||
else {
|
||||
@@ -10625,6 +10631,18 @@ static void alc262_lenovo_3000_unsol_event(struct hda_codec *codec,
|
||||
alc262_lenovo_3000_automute(codec, 1);
|
||||
}
|
||||
|
||||
static int amp_stereo_mute_update(struct hda_codec *codec, hda_nid_t nid,
|
||||
int dir, int idx, long *valp)
|
||||
{
|
||||
int i, change = 0;
|
||||
|
||||
for (i = 0; i < 2; i++, valp++)
|
||||
change |= snd_hda_codec_amp_update(codec, nid, i, dir, idx,
|
||||
HDA_AMP_MUTE,
|
||||
*valp ? 0 : HDA_AMP_MUTE);
|
||||
return change;
|
||||
}
|
||||
|
||||
/* bind hp and internal speaker mute (with plug check) */
|
||||
static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
@@ -10633,13 +10651,8 @@ static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol,
|
||||
long *valp = ucontrol->value.integer.value;
|
||||
int change;
|
||||
|
||||
change = snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
|
||||
HDA_AMP_MUTE,
|
||||
valp ? 0 : HDA_AMP_MUTE);
|
||||
change |= snd_hda_codec_amp_stereo(codec, 0x1b, HDA_OUTPUT, 0,
|
||||
HDA_AMP_MUTE,
|
||||
valp ? 0 : HDA_AMP_MUTE);
|
||||
|
||||
change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
|
||||
change |= amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
|
||||
if (change)
|
||||
alc262_fujitsu_automute(codec, 0);
|
||||
return change;
|
||||
@@ -10674,10 +10687,7 @@ static int alc262_lenovo_3000_master_sw_put(struct snd_kcontrol *kcontrol,
|
||||
long *valp = ucontrol->value.integer.value;
|
||||
int change;
|
||||
|
||||
change = snd_hda_codec_amp_stereo(codec, 0x1b, HDA_OUTPUT, 0,
|
||||
HDA_AMP_MUTE,
|
||||
valp ? 0 : HDA_AMP_MUTE);
|
||||
|
||||
change = amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
|
||||
if (change)
|
||||
alc262_lenovo_3000_automute(codec, 0);
|
||||
return change;
|
||||
@@ -11848,12 +11858,7 @@ static int alc268_acer_master_sw_put(struct snd_kcontrol *kcontrol,
|
||||
long *valp = ucontrol->value.integer.value;
|
||||
int change;
|
||||
|
||||
change = snd_hda_codec_amp_update(codec, 0x14, 0, HDA_OUTPUT, 0,
|
||||
HDA_AMP_MUTE,
|
||||
valp[0] ? 0 : HDA_AMP_MUTE);
|
||||
change |= snd_hda_codec_amp_update(codec, 0x14, 1, HDA_OUTPUT, 0,
|
||||
HDA_AMP_MUTE,
|
||||
valp[1] ? 0 : HDA_AMP_MUTE);
|
||||
change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
|
||||
if (change)
|
||||
alc268_acer_automute(codec, 0);
|
||||
return change;
|
||||
|
@@ -1809,6 +1809,8 @@ static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = {
|
||||
"Dell Studio 1537", STAC_DELL_M6_DMIC),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02a0,
|
||||
"Dell Studio 17", STAC_DELL_M6_DMIC),
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02be,
|
||||
"Dell Studio 1555", STAC_DELL_M6_DMIC),
|
||||
{} /* terminator */
|
||||
};
|
||||
|
||||
@@ -2378,6 +2380,7 @@ static struct snd_pci_quirk stac9205_cfg_tbl[] = {
|
||||
SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0228,
|
||||
"Dell Vostro 1500", STAC_9205_DELL_M42),
|
||||
/* Gateway */
|
||||
SND_PCI_QUIRK(0x107b, 0x0560, "Gateway T6834c", STAC_9205_EAPD),
|
||||
SND_PCI_QUIRK(0x107b, 0x0565, "Gateway T1616", STAC_9205_EAPD),
|
||||
{} /* terminator */
|
||||
};
|
||||
@@ -4065,7 +4068,7 @@ static int stac92xx_add_jack(struct hda_codec *codec,
|
||||
jack->nid = nid;
|
||||
jack->type = type;
|
||||
|
||||
sprintf(name, "%s at %s %s Jack",
|
||||
snprintf(name, sizeof(name), "%s at %s %s Jack",
|
||||
snd_hda_get_jack_type(def_conf),
|
||||
snd_hda_get_jack_connectivity(def_conf),
|
||||
snd_hda_get_jack_location(def_conf));
|
||||
@@ -5854,6 +5857,8 @@ static unsigned int *stac9872_brd_tbl[STAC_9872_MODELS] = {
|
||||
};
|
||||
|
||||
static struct snd_pci_quirk stac9872_cfg_tbl[] = {
|
||||
SND_PCI_QUIRK_MASK(0x104d, 0xfff0, 0x81e0,
|
||||
"Sony VAIO F/S", STAC_9872_VAIO),
|
||||
{} /* terminator */
|
||||
};
|
||||
|
||||
@@ -5866,6 +5871,8 @@ static int patch_stac9872(struct hda_codec *codec)
|
||||
if (spec == NULL)
|
||||
return -ENOMEM;
|
||||
codec->spec = spec;
|
||||
spec->num_pins = ARRAY_SIZE(stac9872_pin_nids);
|
||||
spec->pin_nids = stac9872_pin_nids;
|
||||
|
||||
spec->board_config = snd_hda_check_board_config(codec, STAC_9872_MODELS,
|
||||
stac9872_models,
|
||||
@@ -5877,8 +5884,6 @@ static int patch_stac9872(struct hda_codec *codec)
|
||||
stac92xx_set_config_regs(codec,
|
||||
stac9872_brd_tbl[spec->board_config]);
|
||||
|
||||
spec->num_pins = ARRAY_SIZE(stac9872_pin_nids);
|
||||
spec->pin_nids = stac9872_pin_nids;
|
||||
spec->multiout.dac_nids = spec->dac_nids;
|
||||
spec->num_adcs = ARRAY_SIZE(stac9872_adc_nids);
|
||||
spec->adc_nids = stac9872_adc_nids;
|
||||
|
@@ -2197,9 +2197,12 @@ static int __init alsa_card_riptide_init(void)
|
||||
if (err < 0)
|
||||
return err;
|
||||
#if defined(SUPPORT_JOYSTICK)
|
||||
pci_register_driver(&joystick_driver);
|
||||
err = pci_register_driver(&joystick_driver);
|
||||
/* On failure unregister formerly registered audio driver */
|
||||
if (err < 0)
|
||||
pci_unregister_driver(&driver);
|
||||
#endif
|
||||
return 0;
|
||||
return err;
|
||||
}
|
||||
|
||||
static void __exit alsa_card_riptide_exit(void)
|
||||
|
@@ -767,6 +767,7 @@ static int aic3x_hw_params(struct snd_pcm_substream *substream,
|
||||
int codec_clk = 0, bypass_pll = 0, fsref, last_clk = 0;
|
||||
u8 data, r, p, pll_q, pll_p = 1, pll_r = 1, pll_j = 1;
|
||||
u16 pll_d = 1;
|
||||
u8 reg;
|
||||
|
||||
/* select data word length */
|
||||
data =
|
||||
@@ -801,8 +802,16 @@ static int aic3x_hw_params(struct snd_pcm_substream *substream,
|
||||
pll_q &= 0xf;
|
||||
aic3x_write(codec, AIC3X_PLL_PROGA_REG, pll_q << PLLQ_SHIFT);
|
||||
aic3x_write(codec, AIC3X_GPIOB_REG, CODEC_CLKIN_CLKDIV);
|
||||
} else
|
||||
/* disable PLL if it is bypassed */
|
||||
reg = aic3x_read_reg_cache(codec, AIC3X_PLL_PROGA_REG);
|
||||
aic3x_write(codec, AIC3X_PLL_PROGA_REG, reg & ~PLL_ENABLE);
|
||||
|
||||
} else {
|
||||
aic3x_write(codec, AIC3X_GPIOB_REG, CODEC_CLKIN_PLLDIV);
|
||||
/* enable PLL when it is used */
|
||||
reg = aic3x_read_reg_cache(codec, AIC3X_PLL_PROGA_REG);
|
||||
aic3x_write(codec, AIC3X_PLL_PROGA_REG, reg | PLL_ENABLE);
|
||||
}
|
||||
|
||||
/* Route Left DAC to left channel input and
|
||||
* right DAC to right channel input */
|
||||
|
@@ -1037,14 +1037,14 @@ static int __devinit wm8988_spi_probe(struct spi_device *spi)
|
||||
codec->control_data = spi;
|
||||
codec->dev = &spi->dev;
|
||||
|
||||
spi->dev.driver_data = wm8988;
|
||||
dev_set_drvdata(&spi->dev, wm8988);
|
||||
|
||||
return wm8988_register(wm8988);
|
||||
}
|
||||
|
||||
static int __devexit wm8988_spi_remove(struct spi_device *spi)
|
||||
{
|
||||
struct wm8988_priv *wm8988 = spi->dev.driver_data;
|
||||
struct wm8988_priv *wm8988 = dev_get_drvdata(&spi->dev);
|
||||
|
||||
wm8988_unregister(wm8988);
|
||||
|
||||
|
@@ -20,12 +20,6 @@
|
||||
#define AC_CMD_ADDR(x) (x << 16)
|
||||
#define AC_CMD_DATA(x) (x & 0xffff)
|
||||
|
||||
#ifdef CONFIG_CPU_S3C2440
|
||||
#define IRQ_S3C244x_AC97 IRQ_S3C2440_AC97
|
||||
#else
|
||||
#define IRQ_S3C244x_AC97 IRQ_S3C2443_AC97
|
||||
#endif
|
||||
|
||||
extern struct snd_soc_dai s3c2443_ac97_dai[];
|
||||
|
||||
#endif /*S3C24XXAC97_H_*/
|
||||
|
@@ -48,6 +48,7 @@ config SND_USB_CAIAQ
|
||||
* Native Instruments Kore Controller
|
||||
* Native Instruments Kore Controller 2
|
||||
* Native Instruments Audio Kontrol 1
|
||||
* Native Instruments Audio 2 DJ
|
||||
* Native Instruments Audio 4 DJ
|
||||
* Native Instruments Audio 8 DJ
|
||||
* Native Instruments Guitar Rig Session I/O
|
||||
|
@@ -646,6 +646,7 @@ int snd_usb_caiaq_audio_init(struct snd_usb_caiaqdev *dev)
|
||||
case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_GUITARRIGMOBILE):
|
||||
dev->samplerates |= SNDRV_PCM_RATE_192000;
|
||||
/* fall thru */
|
||||
case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO2DJ):
|
||||
case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO4DJ):
|
||||
case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO8DJ):
|
||||
dev->samplerates |= SNDRV_PCM_RATE_88200;
|
||||
|
@@ -35,13 +35,14 @@
|
||||
#include "input.h"
|
||||
|
||||
MODULE_AUTHOR("Daniel Mack <daniel@caiaq.de>");
|
||||
MODULE_DESCRIPTION("caiaq USB audio, version 1.3.18");
|
||||
MODULE_DESCRIPTION("caiaq USB audio, version 1.3.19");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_SUPPORTED_DEVICE("{{Native Instruments, RigKontrol2},"
|
||||
"{Native Instruments, RigKontrol3},"
|
||||
"{Native Instruments, Kore Controller},"
|
||||
"{Native Instruments, Kore Controller 2},"
|
||||
"{Native Instruments, Audio Kontrol 1},"
|
||||
"{Native Instruments, Audio 2 DJ},"
|
||||
"{Native Instruments, Audio 4 DJ},"
|
||||
"{Native Instruments, Audio 8 DJ},"
|
||||
"{Native Instruments, Session I/O},"
|
||||
@@ -121,6 +122,11 @@ static struct usb_device_id snd_usb_id_table[] = {
|
||||
.idVendor = USB_VID_NATIVEINSTRUMENTS,
|
||||
.idProduct = USB_PID_AUDIO4DJ
|
||||
},
|
||||
{
|
||||
.match_flags = USB_DEVICE_ID_MATCH_DEVICE,
|
||||
.idVendor = USB_VID_NATIVEINSTRUMENTS,
|
||||
.idProduct = USB_PID_AUDIO2DJ
|
||||
},
|
||||
{ /* terminator */ }
|
||||
};
|
||||
|
||||
|
@@ -10,6 +10,7 @@
|
||||
#define USB_PID_KORECONTROLLER 0x4711
|
||||
#define USB_PID_KORECONTROLLER2 0x4712
|
||||
#define USB_PID_AK1 0x0815
|
||||
#define USB_PID_AUDIO2DJ 0x041c
|
||||
#define USB_PID_AUDIO4DJ 0x0839
|
||||
#define USB_PID_AUDIO8DJ 0x1978
|
||||
#define USB_PID_SESSIONIO 0x1915
|
||||
|
@@ -2661,7 +2661,7 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no)
|
||||
struct usb_interface_descriptor *altsd;
|
||||
int i, altno, err, stream;
|
||||
int format;
|
||||
struct audioformat *fp;
|
||||
struct audioformat *fp = NULL;
|
||||
unsigned char *fmt, *csep;
|
||||
int num;
|
||||
|
||||
@@ -2734,6 +2734,18 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no)
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Blue Microphones workaround: The last altsetting is identical
|
||||
* with the previous one, except for a larger packet size, but
|
||||
* is actually a mislabeled two-channel setting; ignore it.
|
||||
*/
|
||||
if (fmt[4] == 1 && fmt[5] == 2 && altno == 2 && num == 3 &&
|
||||
fp && fp->altsetting == 1 && fp->channels == 1 &&
|
||||
fp->format == SNDRV_PCM_FORMAT_S16_LE &&
|
||||
le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize) ==
|
||||
fp->maxpacksize * 2)
|
||||
continue;
|
||||
|
||||
csep = snd_usb_find_desc(alts->endpoint[0].extra, alts->endpoint[0].extralen, NULL, USB_DT_CS_ENDPOINT);
|
||||
/* Creamware Noah has this descriptor after the 2nd endpoint */
|
||||
if (!csep && altsd->bNumEndpoints >= 2)
|
||||
|
@@ -990,20 +990,35 @@ static void build_feature_ctl(struct mixer_build *state, unsigned char *desc,
|
||||
break;
|
||||
}
|
||||
|
||||
/* quirk for UDA1321/N101 */
|
||||
/* note that detection between firmware 2.1.1.7 (N101) and later 2.1.1.21 */
|
||||
/* is not very clear from datasheets */
|
||||
/* I hope that the min value is -15360 for newer firmware --jk */
|
||||
/* volume control quirks */
|
||||
switch (state->chip->usb_id) {
|
||||
case USB_ID(0x0471, 0x0101):
|
||||
case USB_ID(0x0471, 0x0104):
|
||||
case USB_ID(0x0471, 0x0105):
|
||||
case USB_ID(0x0672, 0x1041):
|
||||
/* quirk for UDA1321/N101.
|
||||
* note that detection between firmware 2.1.1.7 (N101)
|
||||
* and later 2.1.1.21 is not very clear from datasheets.
|
||||
* I hope that the min value is -15360 for newer firmware --jk
|
||||
*/
|
||||
if (!strcmp(kctl->id.name, "PCM Playback Volume") &&
|
||||
cval->min == -15616) {
|
||||
snd_printk(KERN_INFO "using volume control quirk for the UDA1321/N101 chip\n");
|
||||
snd_printk(KERN_INFO
|
||||
"set volume quirk for UDA1321/N101 chip\n");
|
||||
cval->max = -256;
|
||||
}
|
||||
break;
|
||||
|
||||
case USB_ID(0x046d, 0x09a4):
|
||||
if (!strcmp(kctl->id.name, "Mic Capture Volume")) {
|
||||
snd_printk(KERN_INFO
|
||||
"set volume quirk for QuickCam E3500\n");
|
||||
cval->min = 6080;
|
||||
cval->max = 8768;
|
||||
cval->res = 192;
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
snd_printdd(KERN_INFO "[%d] FU [%s] ch = %d, val = %d/%d/%d\n",
|
||||
|
Reference in New Issue
Block a user