mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-13 20:33:15 +00:00
Merge branch 'for-linus' into for-next
Back-merged for refactoring beep stuff.
This commit is contained in:
commit
cf30f46acd
@ -912,7 +912,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||
models depending on the codec chip. The list of available models
|
||||
is found in HD-Audio-Models.txt
|
||||
|
||||
The model name "genric" is treated as a special case. When this
|
||||
The model name "generic" is treated as a special case. When this
|
||||
model is given, the driver uses the generic codec parser without
|
||||
"codec-patch". It's sometimes good for testing and debugging.
|
||||
|
||||
|
@ -285,7 +285,7 @@ sample data.
|
||||
<H4>
|
||||
7.2.4 Close Callback</H4>
|
||||
The <TT>close</TT> callback is called when this device is closed by the
|
||||
applicaion. If any private data was allocated in open callback, it must
|
||||
application. If any private data was allocated in open callback, it must
|
||||
be released in the close callback. The deletion of ALSA port should be
|
||||
done here, too. This callback must not be NULL.
|
||||
<H4>
|
||||
|
@ -285,7 +285,12 @@ local_event(struct seq_oss_devinfo *dp, union evrec *q, struct snd_seq_event *ev
|
||||
static int
|
||||
note_on_event(struct seq_oss_devinfo *dp, int dev, int ch, int note, int vel, struct snd_seq_event *ev)
|
||||
{
|
||||
struct seq_oss_synthinfo *info = &dp->synths[dev];
|
||||
struct seq_oss_synthinfo *info;
|
||||
|
||||
if (!snd_seq_oss_synth_is_valid(dp, dev))
|
||||
return -ENXIO;
|
||||
|
||||
info = &dp->synths[dev];
|
||||
switch (info->arg.event_passing) {
|
||||
case SNDRV_SEQ_OSS_PROCESS_EVENTS:
|
||||
if (! info->ch || ch < 0 || ch >= info->nr_voices) {
|
||||
@ -340,7 +345,12 @@ note_on_event(struct seq_oss_devinfo *dp, int dev, int ch, int note, int vel, st
|
||||
static int
|
||||
note_off_event(struct seq_oss_devinfo *dp, int dev, int ch, int note, int vel, struct snd_seq_event *ev)
|
||||
{
|
||||
struct seq_oss_synthinfo *info = &dp->synths[dev];
|
||||
struct seq_oss_synthinfo *info;
|
||||
|
||||
if (!snd_seq_oss_synth_is_valid(dp, dev))
|
||||
return -ENXIO;
|
||||
|
||||
info = &dp->synths[dev];
|
||||
switch (info->arg.event_passing) {
|
||||
case SNDRV_SEQ_OSS_PROCESS_EVENTS:
|
||||
if (! info->ch || ch < 0 || ch >= info->nr_voices) {
|
||||
|
@ -290,10 +290,10 @@ int snd_seq_timer_open(struct snd_seq_queue *q)
|
||||
tid.device = SNDRV_TIMER_GLOBAL_SYSTEM;
|
||||
err = snd_timer_open(&t, str, &tid, q->queue);
|
||||
}
|
||||
if (err < 0) {
|
||||
snd_printk(KERN_ERR "seq fatal error: cannot create timer (%i)\n", err);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
if (err < 0) {
|
||||
snd_printk(KERN_ERR "seq fatal error: cannot create timer (%i)\n", err);
|
||||
return err;
|
||||
}
|
||||
t->callback = snd_seq_timer_interrupt;
|
||||
t->callback_data = q;
|
||||
|
@ -213,7 +213,10 @@ static int slave_put(struct snd_kcontrol *kcontrol,
|
||||
}
|
||||
if (!changed)
|
||||
return 0;
|
||||
return slave_put_val(slave, ucontrol);
|
||||
err = slave_put_val(slave, ucontrol);
|
||||
if (err < 0)
|
||||
return err;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int slave_tlv_cmd(struct snd_kcontrol *kcontrol,
|
||||
|
@ -545,6 +545,9 @@ static void seq_chn_common_event(unsigned char *event_rec)
|
||||
case MIDI_PGM_CHANGE:
|
||||
if (seq_mode == SEQ_2)
|
||||
{
|
||||
if (chn > 15)
|
||||
break;
|
||||
|
||||
synth_devs[dev]->chn_info[chn].pgm_num = p1;
|
||||
if ((int) dev >= num_synths)
|
||||
synth_devs[dev]->set_instr(dev, chn, p1);
|
||||
@ -596,6 +599,9 @@ static void seq_chn_common_event(unsigned char *event_rec)
|
||||
case MIDI_PITCH_BEND:
|
||||
if (seq_mode == SEQ_2)
|
||||
{
|
||||
if (chn > 15)
|
||||
break;
|
||||
|
||||
synth_devs[dev]->chn_info[chn].bender_value = w14;
|
||||
|
||||
if ((int) dev < num_synths)
|
||||
|
@ -2549,7 +2549,7 @@ static int snd_asihpi_sampleclock_add(struct snd_card_asihpi *asihpi,
|
||||
|
||||
static int snd_card_asihpi_mixer_new(struct snd_card_asihpi *asihpi)
|
||||
{
|
||||
struct snd_card *card = asihpi->card;
|
||||
struct snd_card *card;
|
||||
unsigned int idx = 0;
|
||||
unsigned int subindex = 0;
|
||||
int err;
|
||||
@ -2557,6 +2557,7 @@ static int snd_card_asihpi_mixer_new(struct snd_card_asihpi *asihpi)
|
||||
|
||||
if (snd_BUG_ON(!asihpi))
|
||||
return -EINVAL;
|
||||
card = asihpi->card;
|
||||
strcpy(card->mixername, "Asihpi Mixer");
|
||||
|
||||
err =
|
||||
|
@ -494,7 +494,7 @@ static unsigned int get_num_conns(struct hda_codec *codec, hda_nid_t nid)
|
||||
|
||||
int snd_hda_get_num_raw_conns(struct hda_codec *codec, hda_nid_t nid)
|
||||
{
|
||||
return get_num_conns(codec, nid) & AC_CLIST_LENGTH;
|
||||
return snd_hda_get_raw_connections(codec, nid, NULL, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -517,9 +517,6 @@ int snd_hda_get_raw_connections(struct hda_codec *codec, hda_nid_t nid,
|
||||
hda_nid_t prev_nid;
|
||||
int null_count = 0;
|
||||
|
||||
if (snd_BUG_ON(!conn_list || max_conns <= 0))
|
||||
return -EINVAL;
|
||||
|
||||
parm = get_num_conns(codec, nid);
|
||||
if (!parm)
|
||||
return 0;
|
||||
@ -545,7 +542,8 @@ int snd_hda_get_raw_connections(struct hda_codec *codec, hda_nid_t nid,
|
||||
AC_VERB_GET_CONNECT_LIST, 0);
|
||||
if (parm == -1 && codec->bus->rirb_error)
|
||||
return -EIO;
|
||||
conn_list[0] = parm & mask;
|
||||
if (conn_list)
|
||||
conn_list[0] = parm & mask;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -580,14 +578,20 @@ int snd_hda_get_raw_connections(struct hda_codec *codec, hda_nid_t nid,
|
||||
continue;
|
||||
}
|
||||
for (n = prev_nid + 1; n <= val; n++) {
|
||||
if (conns >= max_conns)
|
||||
return -ENOSPC;
|
||||
conn_list[conns++] = n;
|
||||
if (conn_list) {
|
||||
if (conns >= max_conns)
|
||||
return -ENOSPC;
|
||||
conn_list[conns] = n;
|
||||
}
|
||||
conns++;
|
||||
}
|
||||
} else {
|
||||
if (conns >= max_conns)
|
||||
return -ENOSPC;
|
||||
conn_list[conns++] = val;
|
||||
if (conn_list) {
|
||||
if (conns >= max_conns)
|
||||
return -ENOSPC;
|
||||
conn_list[conns] = val;
|
||||
}
|
||||
conns++;
|
||||
}
|
||||
prev_nid = val;
|
||||
}
|
||||
@ -3331,6 +3335,8 @@ int snd_hda_create_dig_out_ctls(struct hda_codec *codec,
|
||||
return -EBUSY;
|
||||
}
|
||||
spdif = snd_array_new(&codec->spdif_out);
|
||||
if (!spdif)
|
||||
return -ENOMEM;
|
||||
for (dig_mix = dig_mixes; dig_mix->name; dig_mix++) {
|
||||
kctl = snd_ctl_new1(dig_mix, codec);
|
||||
if (!kctl)
|
||||
@ -3428,11 +3434,16 @@ static struct snd_kcontrol_new spdif_share_sw = {
|
||||
int snd_hda_create_spdif_share_sw(struct hda_codec *codec,
|
||||
struct hda_multi_out *mout)
|
||||
{
|
||||
struct snd_kcontrol *kctl;
|
||||
|
||||
if (!mout->dig_out_nid)
|
||||
return 0;
|
||||
|
||||
kctl = snd_ctl_new1(&spdif_share_sw, mout);
|
||||
if (!kctl)
|
||||
return -ENOMEM;
|
||||
/* ATTENTION: here mout is passed as private_data, instead of codec */
|
||||
return snd_hda_ctl_add(codec, mout->dig_out_nid,
|
||||
snd_ctl_new1(&spdif_share_sw, mout));
|
||||
return snd_hda_ctl_add(codec, mout->dig_out_nid, kctl);
|
||||
}
|
||||
EXPORT_SYMBOL_HDA(snd_hda_create_spdif_share_sw);
|
||||
|
||||
|
@ -2298,6 +2298,11 @@ static int dspxfr_one_seg(struct hda_codec *codec,
|
||||
hda_frame_size_words = ((sample_rate_div == 0) ? 0 :
|
||||
(num_chans * sample_rate_mul / sample_rate_div));
|
||||
|
||||
if (hda_frame_size_words == 0) {
|
||||
snd_printdd(KERN_ERR "frmsz zero\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
buffer_size_words = min(buffer_size_words,
|
||||
(unsigned int)(UC_RANGE(chip_addx, 1) ?
|
||||
65536 : 32768));
|
||||
@ -2308,8 +2313,7 @@ static int dspxfr_one_seg(struct hda_codec *codec,
|
||||
chip_addx, hda_frame_size_words, num_chans,
|
||||
sample_rate_mul, sample_rate_div, buffer_size_words);
|
||||
|
||||
if ((buffer_addx == NULL) || (hda_frame_size_words == 0) ||
|
||||
(buffer_size_words < hda_frame_size_words)) {
|
||||
if (buffer_size_words < hda_frame_size_words) {
|
||||
snd_printdd(KERN_ERR "dspxfr_one_seg:failed\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
@ -3235,7 +3239,7 @@ static int ca0132_set_vipsource(struct hda_codec *codec, int val)
|
||||
struct ca0132_spec *spec = codec->spec;
|
||||
unsigned int tmp;
|
||||
|
||||
if (!dspload_is_loaded(codec))
|
||||
if (spec->dsp_state != DSP_DOWNLOADED)
|
||||
return 0;
|
||||
|
||||
/* if CrystalVoice if off, vipsource should be 0 */
|
||||
@ -4263,11 +4267,12 @@ static void ca0132_refresh_widget_caps(struct hda_codec *codec)
|
||||
*/
|
||||
static void ca0132_setup_defaults(struct hda_codec *codec)
|
||||
{
|
||||
struct ca0132_spec *spec = codec->spec;
|
||||
unsigned int tmp;
|
||||
int num_fx;
|
||||
int idx, i;
|
||||
|
||||
if (!dspload_is_loaded(codec))
|
||||
if (spec->dsp_state != DSP_DOWNLOADED)
|
||||
return;
|
||||
|
||||
/* out, in effects + voicefx */
|
||||
@ -4347,12 +4352,16 @@ static bool ca0132_download_dsp_images(struct hda_codec *codec)
|
||||
return false;
|
||||
|
||||
dsp_os_image = (struct dsp_image_seg *)(fw_entry->data);
|
||||
dspload_image(codec, dsp_os_image, 0, 0, true, 0);
|
||||
if (dspload_image(codec, dsp_os_image, 0, 0, true, 0)) {
|
||||
pr_err("ca0132 dspload_image failed.\n");
|
||||
goto exit_download;
|
||||
}
|
||||
|
||||
dsp_loaded = dspload_wait_loaded(codec);
|
||||
|
||||
exit_download:
|
||||
release_firmware(fw_entry);
|
||||
|
||||
|
||||
return dsp_loaded;
|
||||
}
|
||||
|
||||
@ -4363,16 +4372,13 @@ static void ca0132_download_dsp(struct hda_codec *codec)
|
||||
#ifndef CONFIG_SND_HDA_CODEC_CA0132_DSP
|
||||
return; /* NOP */
|
||||
#endif
|
||||
spec->dsp_state = DSP_DOWNLOAD_INIT;
|
||||
|
||||
if (spec->dsp_state == DSP_DOWNLOAD_INIT) {
|
||||
chipio_enable_clocks(codec);
|
||||
spec->dsp_state = DSP_DOWNLOADING;
|
||||
if (!ca0132_download_dsp_images(codec))
|
||||
spec->dsp_state = DSP_DOWNLOAD_FAILED;
|
||||
else
|
||||
spec->dsp_state = DSP_DOWNLOADED;
|
||||
}
|
||||
chipio_enable_clocks(codec);
|
||||
spec->dsp_state = DSP_DOWNLOADING;
|
||||
if (!ca0132_download_dsp_images(codec))
|
||||
spec->dsp_state = DSP_DOWNLOAD_FAILED;
|
||||
else
|
||||
spec->dsp_state = DSP_DOWNLOADED;
|
||||
|
||||
if (spec->dsp_state == DSP_DOWNLOADED)
|
||||
ca0132_set_dsp_msr(codec, true);
|
||||
|
@ -506,6 +506,8 @@ static int patch_cs420x(struct hda_codec *codec)
|
||||
if (!spec)
|
||||
return -ENOMEM;
|
||||
|
||||
spec->gen.automute_hook = cs_automute;
|
||||
|
||||
snd_hda_pick_fixup(codec, cs420x_models, cs420x_fixup_tbl,
|
||||
cs420x_fixups);
|
||||
snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
|
||||
@ -893,6 +895,8 @@ static int patch_cs4210(struct hda_codec *codec)
|
||||
if (!spec)
|
||||
return -ENOMEM;
|
||||
|
||||
spec->gen.automute_hook = cs_automute;
|
||||
|
||||
snd_hda_pick_fixup(codec, cs421x_models, cs421x_fixup_tbl,
|
||||
cs421x_fixups);
|
||||
snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
|
||||
|
@ -1142,7 +1142,7 @@ static int patch_cxt5045(struct hda_codec *codec)
|
||||
}
|
||||
|
||||
if (spec->beep_amp)
|
||||
snd_hda_attach_beep_device(codec, spec->beep_amp);
|
||||
snd_hda_attach_beep_device(codec, get_amp_nid_(spec->beep_amp));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1921,7 +1921,7 @@ static int patch_cxt5051(struct hda_codec *codec)
|
||||
}
|
||||
|
||||
if (spec->beep_amp)
|
||||
snd_hda_attach_beep_device(codec, spec->beep_amp);
|
||||
snd_hda_attach_beep_device(codec, get_amp_nid_(spec->beep_amp));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -3099,7 +3099,7 @@ static int patch_cxt5066(struct hda_codec *codec)
|
||||
}
|
||||
|
||||
if (spec->beep_amp)
|
||||
snd_hda_attach_beep_device(codec, spec->beep_amp);
|
||||
snd_hda_attach_beep_device(codec, get_amp_nid_(spec->beep_amp));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -3191,11 +3191,17 @@ static int cx_auto_build_controls(struct hda_codec *codec)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void cx_auto_free(struct hda_codec *codec)
|
||||
{
|
||||
snd_hda_detach_beep_device(codec);
|
||||
snd_hda_gen_free(codec);
|
||||
}
|
||||
|
||||
static const struct hda_codec_ops cx_auto_patch_ops = {
|
||||
.build_controls = cx_auto_build_controls,
|
||||
.build_pcms = snd_hda_gen_build_pcms,
|
||||
.init = snd_hda_gen_init,
|
||||
.free = snd_hda_gen_free,
|
||||
.free = cx_auto_free,
|
||||
.unsol_event = snd_hda_jack_unsol_event,
|
||||
#ifdef CONFIG_PM
|
||||
.check_power_status = snd_hda_gen_check_power_status,
|
||||
@ -3390,7 +3396,7 @@ static int patch_conexant_auto(struct hda_codec *codec)
|
||||
|
||||
codec->patch_ops = cx_auto_patch_ops;
|
||||
if (spec->beep_amp)
|
||||
snd_hda_attach_beep_device(codec, spec->beep_amp);
|
||||
snd_hda_attach_beep_device(codec, get_amp_nid_(spec->beep_amp));
|
||||
|
||||
/* Some laptops with Conexant chips show stalls in S3 resume,
|
||||
* which falls into the single-cmd mode.
|
||||
|
@ -3182,6 +3182,7 @@ static int patch_alc269(struct hda_codec *codec)
|
||||
case 0x10ec0290:
|
||||
spec->codec_variant = ALC269_TYPE_ALC280;
|
||||
break;
|
||||
case 0x10ec0233:
|
||||
case 0x10ec0282:
|
||||
case 0x10ec0283:
|
||||
spec->codec_variant = ALC269_TYPE_ALC282;
|
||||
@ -3881,6 +3882,7 @@ static int patch_alc680(struct hda_codec *codec)
|
||||
*/
|
||||
static const struct hda_codec_preset snd_hda_preset_realtek[] = {
|
||||
{ .id = 0x10ec0221, .name = "ALC221", .patch = patch_alc269 },
|
||||
{ .id = 0x10ec0233, .name = "ALC233", .patch = patch_alc269 },
|
||||
{ .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 },
|
||||
{ .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 },
|
||||
{ .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 },
|
||||
|
@ -815,6 +815,29 @@ static int find_mute_led_cfg(struct hda_codec *codec, int default_polarity)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* check whether a built-in speaker is included in parsed pins */
|
||||
static bool has_builtin_speaker(struct hda_codec *codec)
|
||||
{
|
||||
struct sigmatel_spec *spec = codec->spec;
|
||||
hda_nid_t *nid_pin;
|
||||
int nids, i;
|
||||
|
||||
if (spec->gen.autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT) {
|
||||
nid_pin = spec->gen.autocfg.line_out_pins;
|
||||
nids = spec->gen.autocfg.line_outs;
|
||||
} else {
|
||||
nid_pin = spec->gen.autocfg.speaker_pins;
|
||||
nids = spec->gen.autocfg.speaker_outs;
|
||||
}
|
||||
|
||||
for (i = 0; i < nids; i++) {
|
||||
unsigned int def_conf = snd_hda_codec_get_pincfg(codec, nid_pin[i]);
|
||||
if (snd_hda_get_input_pin_attr(def_conf) == INPUT_PIN_ATTR_INT)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* PC beep controls
|
||||
*/
|
||||
@ -3891,6 +3914,12 @@ static int patch_stac92hd73xx(struct hda_codec *codec)
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Don't GPIO-mute speakers if there are no internal speakers, because
|
||||
* the GPIO might be necessary for Headphone
|
||||
*/
|
||||
if (spec->eapd_switch && !has_builtin_speaker(codec))
|
||||
spec->eapd_switch = 0;
|
||||
|
||||
codec->proc_widget_hook = stac92hd7x_proc_hook;
|
||||
|
||||
snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
|
||||
|
@ -2594,6 +2594,8 @@ static int snd_ice1712_create(struct snd_card *card,
|
||||
snd_ice1712_proc_init(ice);
|
||||
synchronize_irq(pci->irq);
|
||||
|
||||
card->private_data = ice;
|
||||
|
||||
err = pci_request_regions(pci, "ICE1712");
|
||||
if (err < 0) {
|
||||
kfree(ice);
|
||||
|
@ -573,6 +573,13 @@ static const struct reg_default wm5102_sysclk_reva_patch[] = {
|
||||
{ 0x025e, 0x0112 },
|
||||
};
|
||||
|
||||
static const struct reg_default wm5102_sysclk_revb_patch[] = {
|
||||
{ 0x3081, 0x08FE },
|
||||
{ 0x3083, 0x00ED },
|
||||
{ 0x30C1, 0x08FE },
|
||||
{ 0x30C3, 0x00ED },
|
||||
};
|
||||
|
||||
static int wm5102_sysclk_ev(struct snd_soc_dapm_widget *w,
|
||||
struct snd_kcontrol *kcontrol, int event)
|
||||
{
|
||||
@ -587,6 +594,10 @@ static int wm5102_sysclk_ev(struct snd_soc_dapm_widget *w,
|
||||
patch = wm5102_sysclk_reva_patch;
|
||||
patch_size = ARRAY_SIZE(wm5102_sysclk_reva_patch);
|
||||
break;
|
||||
default:
|
||||
patch = wm5102_sysclk_revb_patch;
|
||||
patch_size = ARRAY_SIZE(wm5102_sysclk_revb_patch);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (event) {
|
||||
@ -755,7 +766,7 @@ SOC_SINGLE("SPKDAT1 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_5L,
|
||||
|
||||
SOC_DOUBLE_R("HPOUT1 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_1L,
|
||||
ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_MUTE_SHIFT, 1, 1),
|
||||
SOC_DOUBLE_R("OUT2 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_2L,
|
||||
SOC_DOUBLE_R("HPOUT2 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_2L,
|
||||
ARIZONA_DAC_DIGITAL_VOLUME_2R, ARIZONA_OUT2L_MUTE_SHIFT, 1, 1),
|
||||
SOC_SINGLE("EPOUT Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_3L,
|
||||
ARIZONA_OUT3L_MUTE_SHIFT, 1, 1),
|
||||
@ -767,7 +778,7 @@ SOC_DOUBLE_R("SPKDAT1 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_5L,
|
||||
SOC_DOUBLE_R_TLV("HPOUT1 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_1L,
|
||||
ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_VOL_SHIFT,
|
||||
0xbf, 0, digital_tlv),
|
||||
SOC_DOUBLE_R_TLV("OUT2 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_2L,
|
||||
SOC_DOUBLE_R_TLV("HPOUT2 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_2L,
|
||||
ARIZONA_DAC_DIGITAL_VOLUME_2R, ARIZONA_OUT2L_VOL_SHIFT,
|
||||
0xbf, 0, digital_tlv),
|
||||
SOC_SINGLE_TLV("EPOUT Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_3L,
|
||||
|
@ -213,9 +213,9 @@ ARIZONA_MIXER_CONTROLS("SPKDAT2R", ARIZONA_OUT6RMIX_INPUT_1_SOURCE),
|
||||
|
||||
SOC_SINGLE("HPOUT1 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_1L,
|
||||
ARIZONA_OUT1_OSR_SHIFT, 1, 0),
|
||||
SOC_SINGLE("OUT2 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_2L,
|
||||
SOC_SINGLE("HPOUT2 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_2L,
|
||||
ARIZONA_OUT2_OSR_SHIFT, 1, 0),
|
||||
SOC_SINGLE("OUT3 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_3L,
|
||||
SOC_SINGLE("HPOUT3 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_3L,
|
||||
ARIZONA_OUT3_OSR_SHIFT, 1, 0),
|
||||
SOC_SINGLE("Speaker High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_4L,
|
||||
ARIZONA_OUT4_OSR_SHIFT, 1, 0),
|
||||
@ -226,9 +226,9 @@ SOC_SINGLE("SPKDAT2 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_6L,
|
||||
|
||||
SOC_DOUBLE_R("HPOUT1 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_1L,
|
||||
ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_MUTE_SHIFT, 1, 1),
|
||||
SOC_DOUBLE_R("OUT2 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_2L,
|
||||
SOC_DOUBLE_R("HPOUT2 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_2L,
|
||||
ARIZONA_DAC_DIGITAL_VOLUME_2R, ARIZONA_OUT2L_MUTE_SHIFT, 1, 1),
|
||||
SOC_DOUBLE_R("OUT3 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_3L,
|
||||
SOC_DOUBLE_R("HPOUT3 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_3L,
|
||||
ARIZONA_DAC_DIGITAL_VOLUME_3R, ARIZONA_OUT3L_MUTE_SHIFT, 1, 1),
|
||||
SOC_DOUBLE_R("Speaker Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_4L,
|
||||
ARIZONA_DAC_DIGITAL_VOLUME_4R, ARIZONA_OUT4L_MUTE_SHIFT, 1, 1),
|
||||
@ -240,10 +240,10 @@ SOC_DOUBLE_R("SPKDAT2 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_6L,
|
||||
SOC_DOUBLE_R_TLV("HPOUT1 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_1L,
|
||||
ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_VOL_SHIFT,
|
||||
0xbf, 0, digital_tlv),
|
||||
SOC_DOUBLE_R_TLV("OUT2 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_2L,
|
||||
SOC_DOUBLE_R_TLV("HPOUT2 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_2L,
|
||||
ARIZONA_DAC_DIGITAL_VOLUME_2R, ARIZONA_OUT2L_VOL_SHIFT,
|
||||
0xbf, 0, digital_tlv),
|
||||
SOC_DOUBLE_R_TLV("OUT3 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_3L,
|
||||
SOC_DOUBLE_R_TLV("HPOUT3 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_3L,
|
||||
ARIZONA_DAC_DIGITAL_VOLUME_3R, ARIZONA_OUT3L_VOL_SHIFT,
|
||||
0xbf, 0, digital_tlv),
|
||||
SOC_DOUBLE_R_TLV("Speaker Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_4L,
|
||||
@ -260,11 +260,11 @@ SOC_DOUBLE_R_RANGE_TLV("HPOUT1 Volume", ARIZONA_OUTPUT_PATH_CONFIG_1L,
|
||||
ARIZONA_OUTPUT_PATH_CONFIG_1R,
|
||||
ARIZONA_OUT1L_PGA_VOL_SHIFT,
|
||||
0x34, 0x40, 0, ana_tlv),
|
||||
SOC_DOUBLE_R_RANGE_TLV("OUT2 Volume", ARIZONA_OUTPUT_PATH_CONFIG_2L,
|
||||
SOC_DOUBLE_R_RANGE_TLV("HPOUT2 Volume", ARIZONA_OUTPUT_PATH_CONFIG_2L,
|
||||
ARIZONA_OUTPUT_PATH_CONFIG_2R,
|
||||
ARIZONA_OUT2L_PGA_VOL_SHIFT,
|
||||
0x34, 0x40, 0, ana_tlv),
|
||||
SOC_DOUBLE_R_RANGE_TLV("OUT3 Volume", ARIZONA_OUTPUT_PATH_CONFIG_3L,
|
||||
SOC_DOUBLE_R_RANGE_TLV("HPOUT3 Volume", ARIZONA_OUTPUT_PATH_CONFIG_3L,
|
||||
ARIZONA_OUTPUT_PATH_CONFIG_3R,
|
||||
ARIZONA_OUT3L_PGA_VOL_SHIFT, 0x34, 0x40, 0, ana_tlv),
|
||||
|
||||
|
@ -1301,7 +1301,7 @@ static irqreturn_t wm8350_hpl_jack_handler(int irq, void *data)
|
||||
if (device_may_wakeup(wm8350->dev))
|
||||
pm_wakeup_event(wm8350->dev, 250);
|
||||
|
||||
schedule_delayed_work(&priv->hpl.work, 200);
|
||||
schedule_delayed_work(&priv->hpl.work, msecs_to_jiffies(200));
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@ -1318,7 +1318,7 @@ static irqreturn_t wm8350_hpr_jack_handler(int irq, void *data)
|
||||
if (device_may_wakeup(wm8350->dev))
|
||||
pm_wakeup_event(wm8350->dev, 250);
|
||||
|
||||
schedule_delayed_work(&priv->hpr.work, 200);
|
||||
schedule_delayed_work(&priv->hpr.work, msecs_to_jiffies(200));
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
@ -53,8 +53,8 @@
|
||||
* using 2 wire for device control, so we cache them instead.
|
||||
*/
|
||||
static const struct reg_default wm8960_reg_defaults[] = {
|
||||
{ 0x0, 0x0097 },
|
||||
{ 0x1, 0x0097 },
|
||||
{ 0x0, 0x00a7 },
|
||||
{ 0x1, 0x00a7 },
|
||||
{ 0x2, 0x0000 },
|
||||
{ 0x3, 0x0000 },
|
||||
{ 0x4, 0x0000 },
|
||||
@ -323,8 +323,8 @@ SND_SOC_DAPM_MIXER("Left Input Mixer", WM8960_POWER3, 5, 0,
|
||||
SND_SOC_DAPM_MIXER("Right Input Mixer", WM8960_POWER3, 4, 0,
|
||||
wm8960_rin, ARRAY_SIZE(wm8960_rin)),
|
||||
|
||||
SND_SOC_DAPM_ADC("Left ADC", "Capture", WM8960_POWER2, 3, 0),
|
||||
SND_SOC_DAPM_ADC("Right ADC", "Capture", WM8960_POWER2, 2, 0),
|
||||
SND_SOC_DAPM_ADC("Left ADC", "Capture", WM8960_POWER1, 3, 0),
|
||||
SND_SOC_DAPM_ADC("Right ADC", "Capture", WM8960_POWER1, 2, 0),
|
||||
|
||||
SND_SOC_DAPM_DAC("Left DAC", "Playback", WM8960_POWER2, 8, 0),
|
||||
SND_SOC_DAPM_DAC("Right DAC", "Playback", WM8960_POWER2, 7, 0),
|
||||
|
@ -121,7 +121,7 @@
|
||||
|
||||
#define TEGRA20_I2S_TIMING_NON_SYM_ENABLE (1 << 12)
|
||||
#define TEGRA20_I2S_TIMING_CHANNEL_BIT_COUNT_SHIFT 0
|
||||
#define TEGRA20_I2S_TIMING_CHANNEL_BIT_COUNT_MASK_US 0x7fff
|
||||
#define TEGRA20_I2S_TIMING_CHANNEL_BIT_COUNT_MASK_US 0x7ff
|
||||
#define TEGRA20_I2S_TIMING_CHANNEL_BIT_COUNT_MASK (TEGRA20_I2S_TIMING_CHANNEL_BIT_COUNT_MASK_US << TEGRA20_I2S_TIMING_CHANNEL_BIT_COUNT_SHIFT)
|
||||
|
||||
/* Fields in TEGRA20_I2S_FIFO_SCR */
|
||||
|
@ -110,7 +110,7 @@
|
||||
|
||||
#define TEGRA30_I2S_TIMING_NON_SYM_ENABLE (1 << 12)
|
||||
#define TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_SHIFT 0
|
||||
#define TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_MASK_US 0x7fff
|
||||
#define TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_MASK_US 0x7ff
|
||||
#define TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_MASK (TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_MASK_US << TEGRA30_I2S_TIMING_CHANNEL_BIT_COUNT_SHIFT)
|
||||
|
||||
/* Fields in TEGRA30_I2S_OFFSET */
|
||||
|
@ -243,6 +243,21 @@ static int snd_usb_create_streams(struct snd_usb_audio *chip, int ctrlif)
|
||||
struct usb_interface_assoc_descriptor *assoc =
|
||||
usb_ifnum_to_if(dev, ctrlif)->intf_assoc;
|
||||
|
||||
if (!assoc) {
|
||||
/*
|
||||
* Firmware writers cannot count to three. So to find
|
||||
* the IAD on the NuForce UDH-100, also check the next
|
||||
* interface.
|
||||
*/
|
||||
struct usb_interface *iface =
|
||||
usb_ifnum_to_if(dev, ctrlif + 1);
|
||||
if (iface &&
|
||||
iface->intf_assoc &&
|
||||
iface->intf_assoc->bFunctionClass == USB_CLASS_AUDIO &&
|
||||
iface->intf_assoc->bFunctionProtocol == UAC_VERSION_2)
|
||||
assoc = iface->intf_assoc;
|
||||
}
|
||||
|
||||
if (!assoc) {
|
||||
snd_printk(KERN_ERR "Audio class v2 interfaces need an interface association\n");
|
||||
return -EINVAL;
|
||||
|
Loading…
Reference in New Issue
Block a user