Commit d21b37ea authored by Takashi Iwai's avatar Takashi Iwai Committed by Jaroslav Kysela

[ALSA] Fix and cleanup of CM9880 auto-configuration

HDA Codec driver
Fix and cleanup of CM9880 automatic PIN configuration.
snd_hda_codec_setup_stream() doesn't do anything when NID is 0.
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent b0c95f51
...@@ -549,6 +549,9 @@ int snd_hda_codec_new(struct hda_bus *bus, unsigned int codec_addr, ...@@ -549,6 +549,9 @@ int snd_hda_codec_new(struct hda_bus *bus, unsigned int codec_addr,
void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid, u32 stream_tag, void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid, u32 stream_tag,
int channel_id, int format) int channel_id, int format)
{ {
if (! nid)
return;
snd_printdd("hda_codec_setup_stream: NID=0x%x, stream=0x%x, channel=%d, format=0x%x\n", snd_printdd("hda_codec_setup_stream: NID=0x%x, stream=0x%x, channel=%d, format=0x%x\n",
nid, stream_tag, channel_id, format); nid, stream_tag, channel_id, format);
snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CHANNEL_STREAMID, snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CHANNEL_STREAMID,
......
...@@ -259,7 +259,9 @@ enum { ...@@ -259,7 +259,9 @@ enum {
/* configuration default - 32bit */ /* configuration default - 32bit */
#define AC_DEFCFG_SEQUENCE (0xf<<0) #define AC_DEFCFG_SEQUENCE (0xf<<0)
#define AC_DEFCFG_DEF_ASSOC (0xf<<4) #define AC_DEFCFG_DEF_ASSOC (0xf<<4)
#define AC_DEFCFG_ASSOC_SHIFT 4
#define AC_DEFCFG_MISC (0xf<<8) #define AC_DEFCFG_MISC (0xf<<8)
#define AC_DEFCFG_MISC_SHIFT 8
#define AC_DEFCFG_COLOR (0xf<<12) #define AC_DEFCFG_COLOR (0xf<<12)
#define AC_DEFCFG_COLOR_SHIFT 12 #define AC_DEFCFG_COLOR_SHIFT 12
#define AC_DEFCFG_CONN_TYPE (0xf<<16) #define AC_DEFCFG_CONN_TYPE (0xf<<16)
......
...@@ -365,7 +365,6 @@ static int cmi9880_build_controls(struct hda_codec *codec) ...@@ -365,7 +365,6 @@ static int cmi9880_build_controls(struct hda_codec *codec)
return 0; return 0;
} }
#define AC_DEFCFG_ASSOC_SHIFT 4
#define get_defcfg_connect(cfg) ((cfg & AC_DEFCFG_PORT_CONN) >> AC_DEFCFG_PORT_CONN_SHIFT) #define get_defcfg_connect(cfg) ((cfg & AC_DEFCFG_PORT_CONN) >> AC_DEFCFG_PORT_CONN_SHIFT)
#define get_defcfg_association(cfg) ((cfg & AC_DEFCFG_DEF_ASSOC) >> AC_DEFCFG_ASSOC_SHIFT) #define get_defcfg_association(cfg) ((cfg & AC_DEFCFG_DEF_ASSOC) >> AC_DEFCFG_ASSOC_SHIFT)
#define get_defcfg_sequence(cfg) (cfg & AC_DEFCFG_SEQUENCE) #define get_defcfg_sequence(cfg) (cfg & AC_DEFCFG_SEQUENCE)
...@@ -796,6 +795,7 @@ static int patch_cmi9880(struct hda_codec *codec) ...@@ -796,6 +795,7 @@ static int patch_cmi9880(struct hda_codec *codec)
{ {
unsigned int port_e, port_f, port_g, port_h; unsigned int port_e, port_f, port_g, port_h;
unsigned int port_spdifi, port_spdifo; unsigned int port_spdifi, port_spdifo;
int max_channels;
/* collect pin default configuration */ /* collect pin default configuration */
cmi9880_get_pin_def_config(codec); cmi9880_get_pin_def_config(codec);
port_e = cmi9880_get_def_config(codec, 0x0f); port_e = cmi9880_get_def_config(codec, 0x0f);
...@@ -805,33 +805,40 @@ static int patch_cmi9880(struct hda_codec *codec) ...@@ -805,33 +805,40 @@ static int patch_cmi9880(struct hda_codec *codec)
port_spdifi = cmi9880_get_def_config(codec, 0x13); port_spdifi = cmi9880_get_def_config(codec, 0x13);
port_spdifo = cmi9880_get_def_config(codec, 0x12); port_spdifo = cmi9880_get_def_config(codec, 0x12);
spec->front_panel = 1; spec->front_panel = 1;
if ((get_defcfg_connect(port_e) == AC_JACK_PORT_NONE) if (get_defcfg_connect(port_e) == AC_JACK_PORT_NONE ||
|| (get_defcfg_connect(port_f) == AC_JACK_PORT_NONE)) { get_defcfg_connect(port_f) == AC_JACK_PORT_NONE) {
spec->surr_switch = 1; spec->surr_switch = 1;
/* no front panel */ /* no front panel */
if ((get_defcfg_connect(port_g) == AC_JACK_PORT_NONE) if (get_defcfg_connect(port_g) == AC_JACK_PORT_NONE ||
|| (get_defcfg_connect(port_h) == AC_JACK_PORT_NONE)) { get_defcfg_connect(port_h) == AC_JACK_PORT_NONE) {
/* no optional rear panel */ /* no optional rear panel */
spec->board_config = CMI_MINIMAL; spec->board_config = CMI_MINIMAL;
spec->front_panel = 0; spec->front_panel = 0;
spec->num_ch_modes = 2; spec->num_ch_modes = 2;
} else } else {
spec->board_config = CMI_MIN_FP; spec->board_config = CMI_MIN_FP;
spec->num_ch_modes = 3; spec->num_ch_modes = 3;
}
spec->channel_modes = cmi9880_channel_modes; spec->channel_modes = cmi9880_channel_modes;
spec->input_mux = &cmi9880_basic_mux; spec->input_mux = &cmi9880_basic_mux;
spec->multiout.max_channels = cmi9880_channel_modes[0].channels;
} else { } else {
spec->input_mux = &cmi9880_basic_mux; spec->input_mux = &cmi9880_basic_mux;
if (get_defcfg_connect(port_spdifo) != 1) if (get_defcfg_connect(port_spdifo) != AC_JACK_PORT_NONE)
spec->multiout.dig_out_nid = CMI_DIG_OUT_NID; spec->multiout.dig_out_nid = CMI_DIG_OUT_NID;
if (get_defcfg_connect(port_spdifi) != 1) if (get_defcfg_connect(port_spdifi) != AC_JACK_PORT_NONE)
spec->dig_in_nid = CMI_DIG_IN_NID; spec->dig_in_nid = CMI_DIG_IN_NID;
spec->multiout.max_channels = 8;
} }
spec->multiout.max_channels = cmi9880_get_multich_pins(codec); max_channels = cmi9880_get_multich_pins(codec);
cmi9880_fill_multi_dac_nids(codec); if (max_channels > 0) {
cmi9880_fill_multi_init(codec); spec->multiout.max_channels = max_channels;
} cmi9880_fill_multi_dac_nids(codec);
cmi9880_fill_multi_init(codec);
} else
snd_printd("patch_cmedia: cannot detect association in defcfg\n");
break; break;
}
} }
spec->multiout.num_dacs = 4; spec->multiout.num_dacs = 4;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment