Merge branch 'topic/ca0132-fix' into for-linus
This is a series of fixes for CA0132, especially the missing SPDIF I/O and the mixer build errors.
This commit is contained in:
commit
fa2f5bf096
@ -1386,6 +1386,44 @@ int snd_hda_codec_configure(struct hda_codec *codec)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_HDA(snd_hda_codec_configure);
|
EXPORT_SYMBOL_HDA(snd_hda_codec_configure);
|
||||||
|
|
||||||
|
/* update the stream-id if changed */
|
||||||
|
static void update_pcm_stream_id(struct hda_codec *codec,
|
||||||
|
struct hda_cvt_setup *p, hda_nid_t nid,
|
||||||
|
u32 stream_tag, int channel_id)
|
||||||
|
{
|
||||||
|
unsigned int oldval, newval;
|
||||||
|
|
||||||
|
if (p->stream_tag != stream_tag || p->channel_id != channel_id) {
|
||||||
|
oldval = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONV, 0);
|
||||||
|
newval = (stream_tag << 4) | channel_id;
|
||||||
|
if (oldval != newval)
|
||||||
|
snd_hda_codec_write(codec, nid, 0,
|
||||||
|
AC_VERB_SET_CHANNEL_STREAMID,
|
||||||
|
newval);
|
||||||
|
p->stream_tag = stream_tag;
|
||||||
|
p->channel_id = channel_id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* update the format-id if changed */
|
||||||
|
static void update_pcm_format(struct hda_codec *codec, struct hda_cvt_setup *p,
|
||||||
|
hda_nid_t nid, int format)
|
||||||
|
{
|
||||||
|
unsigned int oldval;
|
||||||
|
|
||||||
|
if (p->format_id != format) {
|
||||||
|
oldval = snd_hda_codec_read(codec, nid, 0,
|
||||||
|
AC_VERB_GET_STREAM_FORMAT, 0);
|
||||||
|
if (oldval != format) {
|
||||||
|
msleep(1);
|
||||||
|
snd_hda_codec_write(codec, nid, 0,
|
||||||
|
AC_VERB_SET_STREAM_FORMAT,
|
||||||
|
format);
|
||||||
|
}
|
||||||
|
p->format_id = format;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* snd_hda_codec_setup_stream - set up the codec for streaming
|
* snd_hda_codec_setup_stream - set up the codec for streaming
|
||||||
* @codec: the CODEC to set up
|
* @codec: the CODEC to set up
|
||||||
@ -1400,7 +1438,6 @@ void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid,
|
|||||||
{
|
{
|
||||||
struct hda_codec *c;
|
struct hda_codec *c;
|
||||||
struct hda_cvt_setup *p;
|
struct hda_cvt_setup *p;
|
||||||
unsigned int oldval, newval;
|
|
||||||
int type;
|
int type;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -1413,29 +1450,13 @@ void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid,
|
|||||||
p = get_hda_cvt_setup(codec, nid);
|
p = get_hda_cvt_setup(codec, nid);
|
||||||
if (!p)
|
if (!p)
|
||||||
return;
|
return;
|
||||||
/* update the stream-id if changed */
|
|
||||||
if (p->stream_tag != stream_tag || p->channel_id != channel_id) {
|
if (codec->pcm_format_first)
|
||||||
oldval = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONV, 0);
|
update_pcm_format(codec, p, nid, format);
|
||||||
newval = (stream_tag << 4) | channel_id;
|
update_pcm_stream_id(codec, p, nid, stream_tag, channel_id);
|
||||||
if (oldval != newval)
|
if (!codec->pcm_format_first)
|
||||||
snd_hda_codec_write(codec, nid, 0,
|
update_pcm_format(codec, p, nid, format);
|
||||||
AC_VERB_SET_CHANNEL_STREAMID,
|
|
||||||
newval);
|
|
||||||
p->stream_tag = stream_tag;
|
|
||||||
p->channel_id = channel_id;
|
|
||||||
}
|
|
||||||
/* update the format-id if changed */
|
|
||||||
if (p->format_id != format) {
|
|
||||||
oldval = snd_hda_codec_read(codec, nid, 0,
|
|
||||||
AC_VERB_GET_STREAM_FORMAT, 0);
|
|
||||||
if (oldval != format) {
|
|
||||||
msleep(1);
|
|
||||||
snd_hda_codec_write(codec, nid, 0,
|
|
||||||
AC_VERB_SET_STREAM_FORMAT,
|
|
||||||
format);
|
|
||||||
}
|
|
||||||
p->format_id = format;
|
|
||||||
}
|
|
||||||
p->active = 1;
|
p->active = 1;
|
||||||
p->dirty = 0;
|
p->dirty = 0;
|
||||||
|
|
||||||
|
@ -861,6 +861,7 @@ struct hda_codec {
|
|||||||
unsigned int no_trigger_sense:1; /* don't trigger at pin-sensing */
|
unsigned int no_trigger_sense:1; /* don't trigger at pin-sensing */
|
||||||
unsigned int ignore_misc_bit:1; /* ignore MISC_NO_PRESENCE bit */
|
unsigned int ignore_misc_bit:1; /* ignore MISC_NO_PRESENCE bit */
|
||||||
unsigned int no_jack_detect:1; /* Machine has no jack-detection */
|
unsigned int no_jack_detect:1; /* Machine has no jack-detection */
|
||||||
|
unsigned int pcm_format_first:1; /* PCM format must be set first */
|
||||||
#ifdef CONFIG_SND_HDA_POWER_SAVE
|
#ifdef CONFIG_SND_HDA_POWER_SAVE
|
||||||
unsigned int power_on :1; /* current (global) power-state */
|
unsigned int power_on :1; /* current (global) power-state */
|
||||||
int power_transition; /* power-state in transition */
|
int power_transition; /* power-state in transition */
|
||||||
|
@ -246,7 +246,7 @@ static void init_output(struct hda_codec *codec, hda_nid_t pin, hda_nid_t dac)
|
|||||||
AC_VERB_SET_AMP_GAIN_MUTE,
|
AC_VERB_SET_AMP_GAIN_MUTE,
|
||||||
AMP_OUT_UNMUTE);
|
AMP_OUT_UNMUTE);
|
||||||
}
|
}
|
||||||
if (dac)
|
if (dac && (get_wcaps(codec, dac) & AC_WCAP_OUT_AMP))
|
||||||
snd_hda_codec_write(codec, dac, 0,
|
snd_hda_codec_write(codec, dac, 0,
|
||||||
AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO);
|
AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO);
|
||||||
}
|
}
|
||||||
@ -261,7 +261,7 @@ static void init_input(struct hda_codec *codec, hda_nid_t pin, hda_nid_t adc)
|
|||||||
AC_VERB_SET_AMP_GAIN_MUTE,
|
AC_VERB_SET_AMP_GAIN_MUTE,
|
||||||
AMP_IN_UNMUTE(0));
|
AMP_IN_UNMUTE(0));
|
||||||
}
|
}
|
||||||
if (adc)
|
if (adc && (get_wcaps(codec, adc) & AC_WCAP_IN_AMP))
|
||||||
snd_hda_codec_write(codec, adc, 0, AC_VERB_SET_AMP_GAIN_MUTE,
|
snd_hda_codec_write(codec, adc, 0, AC_VERB_SET_AMP_GAIN_MUTE,
|
||||||
AMP_IN_UNMUTE(0));
|
AMP_IN_UNMUTE(0));
|
||||||
}
|
}
|
||||||
@ -275,6 +275,10 @@ static int _add_switch(struct hda_codec *codec, hda_nid_t nid, const char *pfx,
|
|||||||
int type = dir ? HDA_INPUT : HDA_OUTPUT;
|
int type = dir ? HDA_INPUT : HDA_OUTPUT;
|
||||||
struct snd_kcontrol_new knew =
|
struct snd_kcontrol_new knew =
|
||||||
HDA_CODEC_MUTE_MONO(namestr, nid, chan, 0, type);
|
HDA_CODEC_MUTE_MONO(namestr, nid, chan, 0, type);
|
||||||
|
if ((query_amp_caps(codec, nid, type) & AC_AMPCAP_MUTE) == 0) {
|
||||||
|
snd_printdd("Skipping '%s %s Switch' (no mute on node 0x%x)\n", pfx, dirstr[dir], nid);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
sprintf(namestr, "%s %s Switch", pfx, dirstr[dir]);
|
sprintf(namestr, "%s %s Switch", pfx, dirstr[dir]);
|
||||||
return snd_hda_ctl_add(codec, nid, snd_ctl_new1(&knew, codec));
|
return snd_hda_ctl_add(codec, nid, snd_ctl_new1(&knew, codec));
|
||||||
}
|
}
|
||||||
@ -286,6 +290,10 @@ static int _add_volume(struct hda_codec *codec, hda_nid_t nid, const char *pfx,
|
|||||||
int type = dir ? HDA_INPUT : HDA_OUTPUT;
|
int type = dir ? HDA_INPUT : HDA_OUTPUT;
|
||||||
struct snd_kcontrol_new knew =
|
struct snd_kcontrol_new knew =
|
||||||
HDA_CODEC_VOLUME_MONO(namestr, nid, chan, 0, type);
|
HDA_CODEC_VOLUME_MONO(namestr, nid, chan, 0, type);
|
||||||
|
if ((query_amp_caps(codec, nid, type) & AC_AMPCAP_NUM_STEPS) == 0) {
|
||||||
|
snd_printdd("Skipping '%s %s Volume' (no amp on node 0x%x)\n", pfx, dirstr[dir], nid);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
sprintf(namestr, "%s %s Volume", pfx, dirstr[dir]);
|
sprintf(namestr, "%s %s Volume", pfx, dirstr[dir]);
|
||||||
return snd_hda_ctl_add(codec, nid, snd_ctl_new1(&knew, codec));
|
return snd_hda_ctl_add(codec, nid, snd_ctl_new1(&knew, codec));
|
||||||
}
|
}
|
||||||
@ -463,51 +471,18 @@ exit:
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* PCM stuffs
|
|
||||||
*/
|
|
||||||
static void ca0132_setup_stream(struct hda_codec *codec, hda_nid_t nid,
|
|
||||||
u32 stream_tag,
|
|
||||||
int channel_id, int format)
|
|
||||||
{
|
|
||||||
unsigned int oldval, newval;
|
|
||||||
|
|
||||||
if (!nid)
|
|
||||||
return;
|
|
||||||
|
|
||||||
snd_printdd("ca0132_setup_stream: "
|
|
||||||
"NID=0x%x, stream=0x%x, channel=%d, format=0x%x\n",
|
|
||||||
nid, stream_tag, channel_id, format);
|
|
||||||
|
|
||||||
/* update the format-id if changed */
|
|
||||||
oldval = snd_hda_codec_read(codec, nid, 0,
|
|
||||||
AC_VERB_GET_STREAM_FORMAT,
|
|
||||||
0);
|
|
||||||
if (oldval != format) {
|
|
||||||
msleep(20);
|
|
||||||
snd_hda_codec_write(codec, nid, 0,
|
|
||||||
AC_VERB_SET_STREAM_FORMAT,
|
|
||||||
format);
|
|
||||||
}
|
|
||||||
|
|
||||||
oldval = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONV, 0);
|
|
||||||
newval = (stream_tag << 4) | channel_id;
|
|
||||||
if (oldval != newval) {
|
|
||||||
snd_hda_codec_write(codec, nid, 0,
|
|
||||||
AC_VERB_SET_CHANNEL_STREAMID,
|
|
||||||
newval);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ca0132_cleanup_stream(struct hda_codec *codec, hda_nid_t nid)
|
|
||||||
{
|
|
||||||
snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_STREAM_FORMAT, 0);
|
|
||||||
snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CHANNEL_STREAMID, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* PCM callbacks
|
* PCM callbacks
|
||||||
*/
|
*/
|
||||||
|
static int ca0132_playback_pcm_open(struct hda_pcm_stream *hinfo,
|
||||||
|
struct hda_codec *codec,
|
||||||
|
struct snd_pcm_substream *substream)
|
||||||
|
{
|
||||||
|
struct ca0132_spec *spec = codec->spec;
|
||||||
|
return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
|
||||||
|
hinfo);
|
||||||
|
}
|
||||||
|
|
||||||
static int ca0132_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
|
static int ca0132_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
|
||||||
struct hda_codec *codec,
|
struct hda_codec *codec,
|
||||||
unsigned int stream_tag,
|
unsigned int stream_tag,
|
||||||
@ -515,10 +490,8 @@ static int ca0132_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
|
|||||||
struct snd_pcm_substream *substream)
|
struct snd_pcm_substream *substream)
|
||||||
{
|
{
|
||||||
struct ca0132_spec *spec = codec->spec;
|
struct ca0132_spec *spec = codec->spec;
|
||||||
|
return snd_hda_multi_out_analog_prepare(codec, &spec->multiout,
|
||||||
ca0132_setup_stream(codec, spec->dacs[0], stream_tag, 0, format);
|
stream_tag, format, substream);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ca0132_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
|
static int ca0132_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
|
||||||
@ -526,15 +499,20 @@ static int ca0132_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
|
|||||||
struct snd_pcm_substream *substream)
|
struct snd_pcm_substream *substream)
|
||||||
{
|
{
|
||||||
struct ca0132_spec *spec = codec->spec;
|
struct ca0132_spec *spec = codec->spec;
|
||||||
|
return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
|
||||||
ca0132_cleanup_stream(codec, spec->dacs[0]);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Digital out
|
* Digital out
|
||||||
*/
|
*/
|
||||||
|
static int ca0132_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
|
||||||
|
struct hda_codec *codec,
|
||||||
|
struct snd_pcm_substream *substream)
|
||||||
|
{
|
||||||
|
struct ca0132_spec *spec = codec->spec;
|
||||||
|
return snd_hda_multi_out_dig_open(codec, &spec->multiout);
|
||||||
|
}
|
||||||
|
|
||||||
static int ca0132_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
|
static int ca0132_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
|
||||||
struct hda_codec *codec,
|
struct hda_codec *codec,
|
||||||
unsigned int stream_tag,
|
unsigned int stream_tag,
|
||||||
@ -542,10 +520,8 @@ static int ca0132_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
|
|||||||
struct snd_pcm_substream *substream)
|
struct snd_pcm_substream *substream)
|
||||||
{
|
{
|
||||||
struct ca0132_spec *spec = codec->spec;
|
struct ca0132_spec *spec = codec->spec;
|
||||||
|
return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
|
||||||
ca0132_setup_stream(codec, spec->dig_out, stream_tag, 0, format);
|
stream_tag, format, substream);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ca0132_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
|
static int ca0132_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
|
||||||
@ -553,65 +529,15 @@ static int ca0132_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
|
|||||||
struct snd_pcm_substream *substream)
|
struct snd_pcm_substream *substream)
|
||||||
{
|
{
|
||||||
struct ca0132_spec *spec = codec->spec;
|
struct ca0132_spec *spec = codec->spec;
|
||||||
|
return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
|
||||||
ca0132_cleanup_stream(codec, spec->dig_out);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
static int ca0132_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
|
||||||
* Analog capture
|
struct hda_codec *codec,
|
||||||
*/
|
struct snd_pcm_substream *substream)
|
||||||
static int ca0132_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
|
|
||||||
struct hda_codec *codec,
|
|
||||||
unsigned int stream_tag,
|
|
||||||
unsigned int format,
|
|
||||||
struct snd_pcm_substream *substream)
|
|
||||||
{
|
{
|
||||||
struct ca0132_spec *spec = codec->spec;
|
struct ca0132_spec *spec = codec->spec;
|
||||||
|
return snd_hda_multi_out_dig_close(codec, &spec->multiout);
|
||||||
ca0132_setup_stream(codec, spec->adcs[substream->number],
|
|
||||||
stream_tag, 0, format);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int ca0132_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
|
|
||||||
struct hda_codec *codec,
|
|
||||||
struct snd_pcm_substream *substream)
|
|
||||||
{
|
|
||||||
struct ca0132_spec *spec = codec->spec;
|
|
||||||
|
|
||||||
ca0132_cleanup_stream(codec, spec->adcs[substream->number]);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Digital capture
|
|
||||||
*/
|
|
||||||
static int ca0132_dig_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
|
|
||||||
struct hda_codec *codec,
|
|
||||||
unsigned int stream_tag,
|
|
||||||
unsigned int format,
|
|
||||||
struct snd_pcm_substream *substream)
|
|
||||||
{
|
|
||||||
struct ca0132_spec *spec = codec->spec;
|
|
||||||
|
|
||||||
ca0132_setup_stream(codec, spec->dig_in, stream_tag, 0, format);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int ca0132_dig_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
|
|
||||||
struct hda_codec *codec,
|
|
||||||
struct snd_pcm_substream *substream)
|
|
||||||
{
|
|
||||||
struct ca0132_spec *spec = codec->spec;
|
|
||||||
|
|
||||||
ca0132_cleanup_stream(codec, spec->dig_in);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -621,6 +547,7 @@ static struct hda_pcm_stream ca0132_pcm_analog_playback = {
|
|||||||
.channels_min = 2,
|
.channels_min = 2,
|
||||||
.channels_max = 2,
|
.channels_max = 2,
|
||||||
.ops = {
|
.ops = {
|
||||||
|
.open = ca0132_playback_pcm_open,
|
||||||
.prepare = ca0132_playback_pcm_prepare,
|
.prepare = ca0132_playback_pcm_prepare,
|
||||||
.cleanup = ca0132_playback_pcm_cleanup
|
.cleanup = ca0132_playback_pcm_cleanup
|
||||||
},
|
},
|
||||||
@ -630,10 +557,6 @@ static struct hda_pcm_stream ca0132_pcm_analog_capture = {
|
|||||||
.substreams = 1,
|
.substreams = 1,
|
||||||
.channels_min = 2,
|
.channels_min = 2,
|
||||||
.channels_max = 2,
|
.channels_max = 2,
|
||||||
.ops = {
|
|
||||||
.prepare = ca0132_capture_pcm_prepare,
|
|
||||||
.cleanup = ca0132_capture_pcm_cleanup
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct hda_pcm_stream ca0132_pcm_digital_playback = {
|
static struct hda_pcm_stream ca0132_pcm_digital_playback = {
|
||||||
@ -641,6 +564,8 @@ static struct hda_pcm_stream ca0132_pcm_digital_playback = {
|
|||||||
.channels_min = 2,
|
.channels_min = 2,
|
||||||
.channels_max = 2,
|
.channels_max = 2,
|
||||||
.ops = {
|
.ops = {
|
||||||
|
.open = ca0132_dig_playback_pcm_open,
|
||||||
|
.close = ca0132_dig_playback_pcm_close,
|
||||||
.prepare = ca0132_dig_playback_pcm_prepare,
|
.prepare = ca0132_dig_playback_pcm_prepare,
|
||||||
.cleanup = ca0132_dig_playback_pcm_cleanup
|
.cleanup = ca0132_dig_playback_pcm_cleanup
|
||||||
},
|
},
|
||||||
@ -650,10 +575,6 @@ static struct hda_pcm_stream ca0132_pcm_digital_capture = {
|
|||||||
.substreams = 1,
|
.substreams = 1,
|
||||||
.channels_min = 2,
|
.channels_min = 2,
|
||||||
.channels_max = 2,
|
.channels_max = 2,
|
||||||
.ops = {
|
|
||||||
.prepare = ca0132_dig_capture_pcm_prepare,
|
|
||||||
.cleanup = ca0132_dig_capture_pcm_cleanup
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int ca0132_build_pcms(struct hda_codec *codec)
|
static int ca0132_build_pcms(struct hda_codec *codec)
|
||||||
@ -928,18 +849,16 @@ static int ca0132_build_controls(struct hda_codec *codec)
|
|||||||
spec->dig_out);
|
spec->dig_out);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
err = add_out_volume(codec, spec->dig_out, "IEC958");
|
err = snd_hda_create_spdif_share_sw(codec, &spec->multiout);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
|
/* spec->multiout.share_spdif = 1; */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (spec->dig_in) {
|
if (spec->dig_in) {
|
||||||
err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in);
|
err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
err = add_in_volume(codec, spec->dig_in, "IEC958");
|
|
||||||
if (err < 0)
|
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -961,6 +880,9 @@ static void ca0132_config(struct hda_codec *codec)
|
|||||||
struct ca0132_spec *spec = codec->spec;
|
struct ca0132_spec *spec = codec->spec;
|
||||||
struct auto_pin_cfg *cfg = &spec->autocfg;
|
struct auto_pin_cfg *cfg = &spec->autocfg;
|
||||||
|
|
||||||
|
codec->pcm_format_first = 1;
|
||||||
|
codec->no_sticky_stream = 1;
|
||||||
|
|
||||||
/* line-outs */
|
/* line-outs */
|
||||||
cfg->line_outs = 1;
|
cfg->line_outs = 1;
|
||||||
cfg->line_out_pins[0] = 0x0b; /* front */
|
cfg->line_out_pins[0] = 0x0b; /* front */
|
||||||
@ -988,14 +910,24 @@ static void ca0132_config(struct hda_codec *codec)
|
|||||||
|
|
||||||
/* Mic-in */
|
/* Mic-in */
|
||||||
spec->input_pins[0] = 0x12;
|
spec->input_pins[0] = 0x12;
|
||||||
spec->input_labels[0] = "Mic-In";
|
spec->input_labels[0] = "Mic";
|
||||||
spec->adcs[0] = 0x07;
|
spec->adcs[0] = 0x07;
|
||||||
|
|
||||||
/* Line-In */
|
/* Line-In */
|
||||||
spec->input_pins[1] = 0x11;
|
spec->input_pins[1] = 0x11;
|
||||||
spec->input_labels[1] = "Line-In";
|
spec->input_labels[1] = "Line";
|
||||||
spec->adcs[1] = 0x08;
|
spec->adcs[1] = 0x08;
|
||||||
spec->num_inputs = 2;
|
spec->num_inputs = 2;
|
||||||
|
|
||||||
|
/* SPDIF I/O */
|
||||||
|
spec->dig_out = 0x05;
|
||||||
|
spec->multiout.dig_out_nid = spec->dig_out;
|
||||||
|
cfg->dig_out_pins[0] = 0x0c;
|
||||||
|
cfg->dig_outs = 1;
|
||||||
|
cfg->dig_out_type[0] = HDA_PCM_TYPE_SPDIF;
|
||||||
|
spec->dig_in = 0x09;
|
||||||
|
cfg->dig_in_pin = 0x0e;
|
||||||
|
cfg->dig_in_type = HDA_PCM_TYPE_SPDIF;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ca0132_init_chip(struct hda_codec *codec)
|
static void ca0132_init_chip(struct hda_codec *codec)
|
||||||
|
Loading…
Reference in New Issue
Block a user