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
|
models depending on the codec chip. The list of available models
|
||||||
is found in HD-Audio-Models.txt
|
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
|
model is given, the driver uses the generic codec parser without
|
||||||
"codec-patch". It's sometimes good for testing and debugging.
|
"codec-patch". It's sometimes good for testing and debugging.
|
||||||
|
|
||||||
|
|
|
@ -285,7 +285,7 @@ sample data.
|
||||||
<H4>
|
<H4>
|
||||||
7.2.4 Close Callback</H4>
|
7.2.4 Close Callback</H4>
|
||||||
The <TT>close</TT> callback is called when this device is closed by the
|
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
|
be released in the close callback. The deletion of ALSA port should be
|
||||||
done here, too. This callback must not be NULL.
|
done here, too. This callback must not be NULL.
|
||||||
<H4>
|
<H4>
|
||||||
|
|
|
@ -285,7 +285,12 @@ local_event(struct seq_oss_devinfo *dp, union evrec *q, struct snd_seq_event *ev
|
||||||
static int
|
static int
|
||||||
note_on_event(struct seq_oss_devinfo *dp, int dev, int ch, int note, int vel, struct snd_seq_event *ev)
|
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) {
|
switch (info->arg.event_passing) {
|
||||||
case SNDRV_SEQ_OSS_PROCESS_EVENTS:
|
case SNDRV_SEQ_OSS_PROCESS_EVENTS:
|
||||||
if (! info->ch || ch < 0 || ch >= info->nr_voices) {
|
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
|
static int
|
||||||
note_off_event(struct seq_oss_devinfo *dp, int dev, int ch, int note, int vel, struct snd_seq_event *ev)
|
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) {
|
switch (info->arg.event_passing) {
|
||||||
case SNDRV_SEQ_OSS_PROCESS_EVENTS:
|
case SNDRV_SEQ_OSS_PROCESS_EVENTS:
|
||||||
if (! info->ch || ch < 0 || ch >= info->nr_voices) {
|
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;
|
tid.device = SNDRV_TIMER_GLOBAL_SYSTEM;
|
||||||
err = snd_timer_open(&t, str, &tid, q->queue);
|
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);
|
if (err < 0) {
|
||||||
return err;
|
snd_printk(KERN_ERR "seq fatal error: cannot create timer (%i)\n", err);
|
||||||
}
|
return err;
|
||||||
}
|
}
|
||||||
t->callback = snd_seq_timer_interrupt;
|
t->callback = snd_seq_timer_interrupt;
|
||||||
t->callback_data = q;
|
t->callback_data = q;
|
||||||
|
|
|
@ -213,7 +213,10 @@ static int slave_put(struct snd_kcontrol *kcontrol,
|
||||||
}
|
}
|
||||||
if (!changed)
|
if (!changed)
|
||||||
return 0;
|
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,
|
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:
|
case MIDI_PGM_CHANGE:
|
||||||
if (seq_mode == SEQ_2)
|
if (seq_mode == SEQ_2)
|
||||||
{
|
{
|
||||||
|
if (chn > 15)
|
||||||
|
break;
|
||||||
|
|
||||||
synth_devs[dev]->chn_info[chn].pgm_num = p1;
|
synth_devs[dev]->chn_info[chn].pgm_num = p1;
|
||||||
if ((int) dev >= num_synths)
|
if ((int) dev >= num_synths)
|
||||||
synth_devs[dev]->set_instr(dev, chn, p1);
|
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:
|
case MIDI_PITCH_BEND:
|
||||||
if (seq_mode == SEQ_2)
|
if (seq_mode == SEQ_2)
|
||||||
{
|
{
|
||||||
|
if (chn > 15)
|
||||||
|
break;
|
||||||
|
|
||||||
synth_devs[dev]->chn_info[chn].bender_value = w14;
|
synth_devs[dev]->chn_info[chn].bender_value = w14;
|
||||||
|
|
||||||
if ((int) dev < num_synths)
|
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)
|
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 idx = 0;
|
||||||
unsigned int subindex = 0;
|
unsigned int subindex = 0;
|
||||||
int err;
|
int err;
|
||||||
|
@ -2557,6 +2557,7 @@ static int snd_card_asihpi_mixer_new(struct snd_card_asihpi *asihpi)
|
||||||
|
|
||||||
if (snd_BUG_ON(!asihpi))
|
if (snd_BUG_ON(!asihpi))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
card = asihpi->card;
|
||||||
strcpy(card->mixername, "Asihpi Mixer");
|
strcpy(card->mixername, "Asihpi Mixer");
|
||||||
|
|
||||||
err =
|
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)
|
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;
|
hda_nid_t prev_nid;
|
||||||
int null_count = 0;
|
int null_count = 0;
|
||||||
|
|
||||||
if (snd_BUG_ON(!conn_list || max_conns <= 0))
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
parm = get_num_conns(codec, nid);
|
parm = get_num_conns(codec, nid);
|
||||||
if (!parm)
|
if (!parm)
|
||||||
return 0;
|
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);
|
AC_VERB_GET_CONNECT_LIST, 0);
|
||||||
if (parm == -1 && codec->bus->rirb_error)
|
if (parm == -1 && codec->bus->rirb_error)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
conn_list[0] = parm & mask;
|
if (conn_list)
|
||||||
|
conn_list[0] = parm & mask;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -580,14 +578,20 @@ int snd_hda_get_raw_connections(struct hda_codec *codec, hda_nid_t nid,
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
for (n = prev_nid + 1; n <= val; n++) {
|
for (n = prev_nid + 1; n <= val; n++) {
|
||||||
if (conns >= max_conns)
|
if (conn_list) {
|
||||||
return -ENOSPC;
|
if (conns >= max_conns)
|
||||||
conn_list[conns++] = n;
|
return -ENOSPC;
|
||||||
|
conn_list[conns] = n;
|
||||||
|
}
|
||||||
|
conns++;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (conns >= max_conns)
|
if (conn_list) {
|
||||||
return -ENOSPC;
|
if (conns >= max_conns)
|
||||||
conn_list[conns++] = val;
|
return -ENOSPC;
|
||||||
|
conn_list[conns] = val;
|
||||||
|
}
|
||||||
|
conns++;
|
||||||
}
|
}
|
||||||
prev_nid = val;
|
prev_nid = val;
|
||||||
}
|
}
|
||||||
|
@ -3331,6 +3335,8 @@ int snd_hda_create_dig_out_ctls(struct hda_codec *codec,
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
spdif = snd_array_new(&codec->spdif_out);
|
spdif = snd_array_new(&codec->spdif_out);
|
||||||
|
if (!spdif)
|
||||||
|
return -ENOMEM;
|
||||||
for (dig_mix = dig_mixes; dig_mix->name; dig_mix++) {
|
for (dig_mix = dig_mixes; dig_mix->name; dig_mix++) {
|
||||||
kctl = snd_ctl_new1(dig_mix, codec);
|
kctl = snd_ctl_new1(dig_mix, codec);
|
||||||
if (!kctl)
|
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,
|
int snd_hda_create_spdif_share_sw(struct hda_codec *codec,
|
||||||
struct hda_multi_out *mout)
|
struct hda_multi_out *mout)
|
||||||
{
|
{
|
||||||
|
struct snd_kcontrol *kctl;
|
||||||
|
|
||||||
if (!mout->dig_out_nid)
|
if (!mout->dig_out_nid)
|
||||||
return 0;
|
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 */
|
/* ATTENTION: here mout is passed as private_data, instead of codec */
|
||||||
return snd_hda_ctl_add(codec, mout->dig_out_nid,
|
return snd_hda_ctl_add(codec, mout->dig_out_nid, kctl);
|
||||||
snd_ctl_new1(&spdif_share_sw, mout));
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_HDA(snd_hda_create_spdif_share_sw);
|
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 :
|
hda_frame_size_words = ((sample_rate_div == 0) ? 0 :
|
||||||
(num_chans * sample_rate_mul / sample_rate_div));
|
(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,
|
buffer_size_words = min(buffer_size_words,
|
||||||
(unsigned int)(UC_RANGE(chip_addx, 1) ?
|
(unsigned int)(UC_RANGE(chip_addx, 1) ?
|
||||||
65536 : 32768));
|
65536 : 32768));
|
||||||
|
@ -2308,8 +2313,7 @@ static int dspxfr_one_seg(struct hda_codec *codec,
|
||||||
chip_addx, hda_frame_size_words, num_chans,
|
chip_addx, hda_frame_size_words, num_chans,
|
||||||
sample_rate_mul, sample_rate_div, buffer_size_words);
|
sample_rate_mul, sample_rate_div, buffer_size_words);
|
||||||
|
|
||||||
if ((buffer_addx == NULL) || (hda_frame_size_words == 0) ||
|
if (buffer_size_words < hda_frame_size_words) {
|
||||||
(buffer_size_words < hda_frame_size_words)) {
|
|
||||||
snd_printdd(KERN_ERR "dspxfr_one_seg:failed\n");
|
snd_printdd(KERN_ERR "dspxfr_one_seg:failed\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
@ -3235,7 +3239,7 @@ static int ca0132_set_vipsource(struct hda_codec *codec, int val)
|
||||||
struct ca0132_spec *spec = codec->spec;
|
struct ca0132_spec *spec = codec->spec;
|
||||||
unsigned int tmp;
|
unsigned int tmp;
|
||||||
|
|
||||||
if (!dspload_is_loaded(codec))
|
if (spec->dsp_state != DSP_DOWNLOADED)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* if CrystalVoice if off, vipsource should be 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)
|
static void ca0132_setup_defaults(struct hda_codec *codec)
|
||||||
{
|
{
|
||||||
|
struct ca0132_spec *spec = codec->spec;
|
||||||
unsigned int tmp;
|
unsigned int tmp;
|
||||||
int num_fx;
|
int num_fx;
|
||||||
int idx, i;
|
int idx, i;
|
||||||
|
|
||||||
if (!dspload_is_loaded(codec))
|
if (spec->dsp_state != DSP_DOWNLOADED)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* out, in effects + voicefx */
|
/* out, in effects + voicefx */
|
||||||
|
@ -4347,12 +4352,16 @@ static bool ca0132_download_dsp_images(struct hda_codec *codec)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
dsp_os_image = (struct dsp_image_seg *)(fw_entry->data);
|
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);
|
dsp_loaded = dspload_wait_loaded(codec);
|
||||||
|
|
||||||
|
exit_download:
|
||||||
release_firmware(fw_entry);
|
release_firmware(fw_entry);
|
||||||
|
|
||||||
|
|
||||||
return dsp_loaded;
|
return dsp_loaded;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4363,16 +4372,13 @@ static void ca0132_download_dsp(struct hda_codec *codec)
|
||||||
#ifndef CONFIG_SND_HDA_CODEC_CA0132_DSP
|
#ifndef CONFIG_SND_HDA_CODEC_CA0132_DSP
|
||||||
return; /* NOP */
|
return; /* NOP */
|
||||||
#endif
|
#endif
|
||||||
spec->dsp_state = DSP_DOWNLOAD_INIT;
|
|
||||||
|
|
||||||
if (spec->dsp_state == DSP_DOWNLOAD_INIT) {
|
chipio_enable_clocks(codec);
|
||||||
chipio_enable_clocks(codec);
|
spec->dsp_state = DSP_DOWNLOADING;
|
||||||
spec->dsp_state = DSP_DOWNLOADING;
|
if (!ca0132_download_dsp_images(codec))
|
||||||
if (!ca0132_download_dsp_images(codec))
|
spec->dsp_state = DSP_DOWNLOAD_FAILED;
|
||||||
spec->dsp_state = DSP_DOWNLOAD_FAILED;
|
else
|
||||||
else
|
spec->dsp_state = DSP_DOWNLOADED;
|
||||||
spec->dsp_state = DSP_DOWNLOADED;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (spec->dsp_state == DSP_DOWNLOADED)
|
if (spec->dsp_state == DSP_DOWNLOADED)
|
||||||
ca0132_set_dsp_msr(codec, true);
|
ca0132_set_dsp_msr(codec, true);
|
||||||
|
|
|
@ -506,6 +506,8 @@ static int patch_cs420x(struct hda_codec *codec)
|
||||||
if (!spec)
|
if (!spec)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
spec->gen.automute_hook = cs_automute;
|
||||||
|
|
||||||
snd_hda_pick_fixup(codec, cs420x_models, cs420x_fixup_tbl,
|
snd_hda_pick_fixup(codec, cs420x_models, cs420x_fixup_tbl,
|
||||||
cs420x_fixups);
|
cs420x_fixups);
|
||||||
snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
|
snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
|
||||||
|
@ -893,6 +895,8 @@ static int patch_cs4210(struct hda_codec *codec)
|
||||||
if (!spec)
|
if (!spec)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
spec->gen.automute_hook = cs_automute;
|
||||||
|
|
||||||
snd_hda_pick_fixup(codec, cs421x_models, cs421x_fixup_tbl,
|
snd_hda_pick_fixup(codec, cs421x_models, cs421x_fixup_tbl,
|
||||||
cs421x_fixups);
|
cs421x_fixups);
|
||||||
snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
|
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)
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1921,7 +1921,7 @@ static int patch_cxt5051(struct hda_codec *codec)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (spec->beep_amp)
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -3099,7 +3099,7 @@ static int patch_cxt5066(struct hda_codec *codec)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (spec->beep_amp)
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -3191,11 +3191,17 @@ static int cx_auto_build_controls(struct hda_codec *codec)
|
||||||
return 0;
|
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 = {
|
static const struct hda_codec_ops cx_auto_patch_ops = {
|
||||||
.build_controls = cx_auto_build_controls,
|
.build_controls = cx_auto_build_controls,
|
||||||
.build_pcms = snd_hda_gen_build_pcms,
|
.build_pcms = snd_hda_gen_build_pcms,
|
||||||
.init = snd_hda_gen_init,
|
.init = snd_hda_gen_init,
|
||||||
.free = snd_hda_gen_free,
|
.free = cx_auto_free,
|
||||||
.unsol_event = snd_hda_jack_unsol_event,
|
.unsol_event = snd_hda_jack_unsol_event,
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
.check_power_status = snd_hda_gen_check_power_status,
|
.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;
|
codec->patch_ops = cx_auto_patch_ops;
|
||||||
if (spec->beep_amp)
|
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,
|
/* Some laptops with Conexant chips show stalls in S3 resume,
|
||||||
* which falls into the single-cmd mode.
|
* which falls into the single-cmd mode.
|
||||||
|
|
|
@ -3182,6 +3182,7 @@ static int patch_alc269(struct hda_codec *codec)
|
||||||
case 0x10ec0290:
|
case 0x10ec0290:
|
||||||
spec->codec_variant = ALC269_TYPE_ALC280;
|
spec->codec_variant = ALC269_TYPE_ALC280;
|
||||||
break;
|
break;
|
||||||
|
case 0x10ec0233:
|
||||||
case 0x10ec0282:
|
case 0x10ec0282:
|
||||||
case 0x10ec0283:
|
case 0x10ec0283:
|
||||||
spec->codec_variant = ALC269_TYPE_ALC282;
|
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[] = {
|
static const struct hda_codec_preset snd_hda_preset_realtek[] = {
|
||||||
{ .id = 0x10ec0221, .name = "ALC221", .patch = patch_alc269 },
|
{ .id = 0x10ec0221, .name = "ALC221", .patch = patch_alc269 },
|
||||||
|
{ .id = 0x10ec0233, .name = "ALC233", .patch = patch_alc269 },
|
||||||
{ .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 },
|
{ .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 },
|
||||||
{ .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 },
|
{ .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 },
|
||||||
{ .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 },
|
{ .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;
|
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
|
* PC beep controls
|
||||||
*/
|
*/
|
||||||
|
@ -3891,6 +3914,12 @@ static int patch_stac92hd73xx(struct hda_codec *codec)
|
||||||
return err;
|
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;
|
codec->proc_widget_hook = stac92hd7x_proc_hook;
|
||||||
|
|
||||||
snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
|
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);
|
snd_ice1712_proc_init(ice);
|
||||||
synchronize_irq(pci->irq);
|
synchronize_irq(pci->irq);
|
||||||
|
|
||||||
|
card->private_data = ice;
|
||||||
|
|
||||||
err = pci_request_regions(pci, "ICE1712");
|
err = pci_request_regions(pci, "ICE1712");
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
kfree(ice);
|
kfree(ice);
|
||||||
|
|
|
@ -573,6 +573,13 @@ static const struct reg_default wm5102_sysclk_reva_patch[] = {
|
||||||
{ 0x025e, 0x0112 },
|
{ 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,
|
static int wm5102_sysclk_ev(struct snd_soc_dapm_widget *w,
|
||||||
struct snd_kcontrol *kcontrol, int event)
|
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 = wm5102_sysclk_reva_patch;
|
||||||
patch_size = ARRAY_SIZE(wm5102_sysclk_reva_patch);
|
patch_size = ARRAY_SIZE(wm5102_sysclk_reva_patch);
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
patch = wm5102_sysclk_revb_patch;
|
||||||
|
patch_size = ARRAY_SIZE(wm5102_sysclk_revb_patch);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (event) {
|
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,
|
SOC_DOUBLE_R("HPOUT1 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_1L,
|
||||||
ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_MUTE_SHIFT, 1, 1),
|
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),
|
ARIZONA_DAC_DIGITAL_VOLUME_2R, ARIZONA_OUT2L_MUTE_SHIFT, 1, 1),
|
||||||
SOC_SINGLE("EPOUT Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_3L,
|
SOC_SINGLE("EPOUT Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_3L,
|
||||||
ARIZONA_OUT3L_MUTE_SHIFT, 1, 1),
|
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,
|
SOC_DOUBLE_R_TLV("HPOUT1 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_1L,
|
||||||
ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_VOL_SHIFT,
|
ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_VOL_SHIFT,
|
||||||
0xbf, 0, digital_tlv),
|
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,
|
ARIZONA_DAC_DIGITAL_VOLUME_2R, ARIZONA_OUT2L_VOL_SHIFT,
|
||||||
0xbf, 0, digital_tlv),
|
0xbf, 0, digital_tlv),
|
||||||
SOC_SINGLE_TLV("EPOUT Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_3L,
|
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,
|
SOC_SINGLE("HPOUT1 High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_1L,
|
||||||
ARIZONA_OUT1_OSR_SHIFT, 1, 0),
|
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),
|
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),
|
ARIZONA_OUT3_OSR_SHIFT, 1, 0),
|
||||||
SOC_SINGLE("Speaker High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_4L,
|
SOC_SINGLE("Speaker High Performance Switch", ARIZONA_OUTPUT_PATH_CONFIG_4L,
|
||||||
ARIZONA_OUT4_OSR_SHIFT, 1, 0),
|
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,
|
SOC_DOUBLE_R("HPOUT1 Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_1L,
|
||||||
ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_MUTE_SHIFT, 1, 1),
|
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),
|
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),
|
ARIZONA_DAC_DIGITAL_VOLUME_3R, ARIZONA_OUT3L_MUTE_SHIFT, 1, 1),
|
||||||
SOC_DOUBLE_R("Speaker Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_4L,
|
SOC_DOUBLE_R("Speaker Digital Switch", ARIZONA_DAC_DIGITAL_VOLUME_4L,
|
||||||
ARIZONA_DAC_DIGITAL_VOLUME_4R, ARIZONA_OUT4L_MUTE_SHIFT, 1, 1),
|
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,
|
SOC_DOUBLE_R_TLV("HPOUT1 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_1L,
|
||||||
ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_VOL_SHIFT,
|
ARIZONA_DAC_DIGITAL_VOLUME_1R, ARIZONA_OUT1L_VOL_SHIFT,
|
||||||
0xbf, 0, digital_tlv),
|
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,
|
ARIZONA_DAC_DIGITAL_VOLUME_2R, ARIZONA_OUT2L_VOL_SHIFT,
|
||||||
0xbf, 0, digital_tlv),
|
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,
|
ARIZONA_DAC_DIGITAL_VOLUME_3R, ARIZONA_OUT3L_VOL_SHIFT,
|
||||||
0xbf, 0, digital_tlv),
|
0xbf, 0, digital_tlv),
|
||||||
SOC_DOUBLE_R_TLV("Speaker Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_4L,
|
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_OUTPUT_PATH_CONFIG_1R,
|
||||||
ARIZONA_OUT1L_PGA_VOL_SHIFT,
|
ARIZONA_OUT1L_PGA_VOL_SHIFT,
|
||||||
0x34, 0x40, 0, ana_tlv),
|
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_OUTPUT_PATH_CONFIG_2R,
|
||||||
ARIZONA_OUT2L_PGA_VOL_SHIFT,
|
ARIZONA_OUT2L_PGA_VOL_SHIFT,
|
||||||
0x34, 0x40, 0, ana_tlv),
|
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_OUTPUT_PATH_CONFIG_3R,
|
||||||
ARIZONA_OUT3L_PGA_VOL_SHIFT, 0x34, 0x40, 0, ana_tlv),
|
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))
|
if (device_may_wakeup(wm8350->dev))
|
||||||
pm_wakeup_event(wm8350->dev, 250);
|
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;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
@ -1318,7 +1318,7 @@ static irqreturn_t wm8350_hpr_jack_handler(int irq, void *data)
|
||||||
if (device_may_wakeup(wm8350->dev))
|
if (device_may_wakeup(wm8350->dev))
|
||||||
pm_wakeup_event(wm8350->dev, 250);
|
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;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,8 +53,8 @@
|
||||||
* using 2 wire for device control, so we cache them instead.
|
* using 2 wire for device control, so we cache them instead.
|
||||||
*/
|
*/
|
||||||
static const struct reg_default wm8960_reg_defaults[] = {
|
static const struct reg_default wm8960_reg_defaults[] = {
|
||||||
{ 0x0, 0x0097 },
|
{ 0x0, 0x00a7 },
|
||||||
{ 0x1, 0x0097 },
|
{ 0x1, 0x00a7 },
|
||||||
{ 0x2, 0x0000 },
|
{ 0x2, 0x0000 },
|
||||||
{ 0x3, 0x0000 },
|
{ 0x3, 0x0000 },
|
||||||
{ 0x4, 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,
|
SND_SOC_DAPM_MIXER("Right Input Mixer", WM8960_POWER3, 4, 0,
|
||||||
wm8960_rin, ARRAY_SIZE(wm8960_rin)),
|
wm8960_rin, ARRAY_SIZE(wm8960_rin)),
|
||||||
|
|
||||||
SND_SOC_DAPM_ADC("Left ADC", "Capture", WM8960_POWER2, 3, 0),
|
SND_SOC_DAPM_ADC("Left ADC", "Capture", WM8960_POWER1, 3, 0),
|
||||||
SND_SOC_DAPM_ADC("Right ADC", "Capture", WM8960_POWER2, 2, 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("Left DAC", "Playback", WM8960_POWER2, 8, 0),
|
||||||
SND_SOC_DAPM_DAC("Right DAC", "Playback", WM8960_POWER2, 7, 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_NON_SYM_ENABLE (1 << 12)
|
||||||
#define TEGRA20_I2S_TIMING_CHANNEL_BIT_COUNT_SHIFT 0
|
#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)
|
#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 */
|
/* Fields in TEGRA20_I2S_FIFO_SCR */
|
||||||
|
|
|
@ -110,7 +110,7 @@
|
||||||
|
|
||||||
#define TEGRA30_I2S_TIMING_NON_SYM_ENABLE (1 << 12)
|
#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_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)
|
#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 */
|
/* 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 =
|
struct usb_interface_assoc_descriptor *assoc =
|
||||||
usb_ifnum_to_if(dev, ctrlif)->intf_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) {
|
if (!assoc) {
|
||||||
snd_printk(KERN_ERR "Audio class v2 interfaces need an interface association\n");
|
snd_printk(KERN_ERR "Audio class v2 interfaces need an interface association\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
Loading…
Reference in New Issue