Merge branch 'topic/hda' into for-linus

This commit is contained in:
Takashi Iwai 2011-05-22 10:01:35 +02:00
commit f686c74cc3
15 changed files with 4106 additions and 3275 deletions

View File

@ -94,7 +94,7 @@ ALC662/663/272
3stack-dig 3-stack (2-channel) with SPDIF 3stack-dig 3-stack (2-channel) with SPDIF
3stack-6ch 3-stack (6-channel) 3stack-6ch 3-stack (6-channel)
3stack-6ch-dig 3-stack (6-channel) with SPDIF 3stack-6ch-dig 3-stack (6-channel) with SPDIF
6stack-dig 6-stack with SPDIF 5stack-dig 5-stack with SPDIF
lenovo-101e Lenovo laptop lenovo-101e Lenovo laptop
eeepc-p701 ASUS Eeepc P701 eeepc-p701 ASUS Eeepc P701
eeepc-ep20 ASUS Eeepc EP20 eeepc-ep20 ASUS Eeepc EP20

View File

@ -307,6 +307,12 @@ int snd_hda_get_sub_nodes(struct hda_codec *codec, hda_nid_t nid,
} }
EXPORT_SYMBOL_HDA(snd_hda_get_sub_nodes); EXPORT_SYMBOL_HDA(snd_hda_get_sub_nodes);
static int _hda_get_connections(struct hda_codec *codec, hda_nid_t nid,
hda_nid_t *conn_list, int max_conns);
static bool add_conn_list(struct snd_array *array, hda_nid_t nid);
static int copy_conn_list(hda_nid_t nid, hda_nid_t *dst, int max_dst,
hda_nid_t *src, int len);
/** /**
* snd_hda_get_connections - get connection list * snd_hda_get_connections - get connection list
* @codec: the HDA codec * @codec: the HDA codec
@ -320,7 +326,44 @@ EXPORT_SYMBOL_HDA(snd_hda_get_sub_nodes);
* Returns the number of connections, or a negative error code. * Returns the number of connections, or a negative error code.
*/ */
int snd_hda_get_connections(struct hda_codec *codec, hda_nid_t nid, int snd_hda_get_connections(struct hda_codec *codec, hda_nid_t nid,
hda_nid_t *conn_list, int max_conns) hda_nid_t *conn_list, int max_conns)
{
struct snd_array *array = &codec->conn_lists;
int i, len, old_used;
hda_nid_t list[HDA_MAX_CONNECTIONS];
/* look up the cached results */
for (i = 0; i < array->used; ) {
hda_nid_t *p = snd_array_elem(array, i);
len = p[1];
if (nid == *p)
return copy_conn_list(nid, conn_list, max_conns,
p + 2, len);
i += len + 2;
}
len = _hda_get_connections(codec, nid, list, HDA_MAX_CONNECTIONS);
if (len < 0)
return len;
/* add to the cache */
old_used = array->used;
if (!add_conn_list(array, nid) || !add_conn_list(array, len))
goto error_add;
for (i = 0; i < len; i++)
if (!add_conn_list(array, list[i]))
goto error_add;
return copy_conn_list(nid, conn_list, max_conns, list, len);
error_add:
array->used = old_used;
return -ENOMEM;
}
EXPORT_SYMBOL_HDA(snd_hda_get_connections);
static int _hda_get_connections(struct hda_codec *codec, hda_nid_t nid,
hda_nid_t *conn_list, int max_conns)
{ {
unsigned int parm; unsigned int parm;
int i, conn_len, conns; int i, conn_len, conns;
@ -417,8 +460,28 @@ int snd_hda_get_connections(struct hda_codec *codec, hda_nid_t nid,
} }
return conns; return conns;
} }
EXPORT_SYMBOL_HDA(snd_hda_get_connections);
static bool add_conn_list(struct snd_array *array, hda_nid_t nid)
{
hda_nid_t *p = snd_array_new(array);
if (!p)
return false;
*p = nid;
return true;
}
static int copy_conn_list(hda_nid_t nid, hda_nid_t *dst, int max_dst,
hda_nid_t *src, int len)
{
if (len > max_dst) {
snd_printk(KERN_ERR "hda_codec: "
"Too many connections %d for NID 0x%x\n",
len, nid);
return -EINVAL;
}
memcpy(dst, src, len * sizeof(hda_nid_t));
return len;
}
/** /**
* snd_hda_queue_unsol_event - add an unsolicited event to queue * snd_hda_queue_unsol_event - add an unsolicited event to queue
@ -1019,6 +1082,7 @@ static void snd_hda_codec_free(struct hda_codec *codec)
list_del(&codec->list); list_del(&codec->list);
snd_array_free(&codec->mixers); snd_array_free(&codec->mixers);
snd_array_free(&codec->nids); snd_array_free(&codec->nids);
snd_array_free(&codec->conn_lists);
codec->bus->caddr_tbl[codec->addr] = NULL; codec->bus->caddr_tbl[codec->addr] = NULL;
if (codec->patch_ops.free) if (codec->patch_ops.free)
codec->patch_ops.free(codec); codec->patch_ops.free(codec);
@ -1079,6 +1143,7 @@ int /*__devinit*/ snd_hda_codec_new(struct hda_bus *bus,
snd_array_init(&codec->init_pins, sizeof(struct hda_pincfg), 16); snd_array_init(&codec->init_pins, sizeof(struct hda_pincfg), 16);
snd_array_init(&codec->driver_pins, sizeof(struct hda_pincfg), 16); snd_array_init(&codec->driver_pins, sizeof(struct hda_pincfg), 16);
snd_array_init(&codec->cvt_setups, sizeof(struct hda_cvt_setup), 8); snd_array_init(&codec->cvt_setups, sizeof(struct hda_cvt_setup), 8);
snd_array_init(&codec->conn_lists, sizeof(hda_nid_t), 64);
if (codec->bus->modelname) { if (codec->bus->modelname) {
codec->modelname = kstrdup(codec->bus->modelname, GFP_KERNEL); codec->modelname = kstrdup(codec->bus->modelname, GFP_KERNEL);
if (!codec->modelname) { if (!codec->modelname) {
@ -2556,7 +2621,7 @@ static unsigned int convert_to_spdif_status(unsigned short val)
static void set_dig_out(struct hda_codec *codec, hda_nid_t nid, static void set_dig_out(struct hda_codec *codec, hda_nid_t nid,
int verb, int val) int verb, int val)
{ {
hda_nid_t *d; const hda_nid_t *d;
snd_hda_codec_write_cache(codec, nid, 0, verb, val); snd_hda_codec_write_cache(codec, nid, 0, verb, val);
d = codec->slave_dig_outs; d = codec->slave_dig_outs;
@ -3807,7 +3872,8 @@ EXPORT_SYMBOL_HDA(snd_hda_check_board_codec_sid_config);
* *
* Returns 0 if successful, or a negative error code. * Returns 0 if successful, or a negative error code.
*/ */
int snd_hda_add_new_ctls(struct hda_codec *codec, struct snd_kcontrol_new *knew) int snd_hda_add_new_ctls(struct hda_codec *codec,
const struct snd_kcontrol_new *knew)
{ {
int err; int err;
@ -3950,7 +4016,7 @@ int snd_hda_check_amp_list_power(struct hda_codec *codec,
struct hda_loopback_check *check, struct hda_loopback_check *check,
hda_nid_t nid) hda_nid_t nid)
{ {
struct hda_amp_list *p; const struct hda_amp_list *p;
int ch, v; int ch, v;
if (!check->amplist) if (!check->amplist)
@ -4118,7 +4184,7 @@ static void setup_dig_out_stream(struct hda_codec *codec, hda_nid_t nid,
-1); -1);
snd_hda_codec_setup_stream(codec, nid, stream_tag, 0, format); snd_hda_codec_setup_stream(codec, nid, stream_tag, 0, format);
if (codec->slave_dig_outs) { if (codec->slave_dig_outs) {
hda_nid_t *d; const hda_nid_t *d;
for (d = codec->slave_dig_outs; *d; d++) for (d = codec->slave_dig_outs; *d; d++)
snd_hda_codec_setup_stream(codec, *d, stream_tag, 0, snd_hda_codec_setup_stream(codec, *d, stream_tag, 0,
format); format);
@ -4133,7 +4199,7 @@ static void cleanup_dig_out_stream(struct hda_codec *codec, hda_nid_t nid)
{ {
snd_hda_codec_cleanup_stream(codec, nid); snd_hda_codec_cleanup_stream(codec, nid);
if (codec->slave_dig_outs) { if (codec->slave_dig_outs) {
hda_nid_t *d; const hda_nid_t *d;
for (d = codec->slave_dig_outs; *d; d++) for (d = codec->slave_dig_outs; *d; d++)
snd_hda_codec_cleanup_stream(codec, *d); snd_hda_codec_cleanup_stream(codec, *d);
} }
@ -4280,7 +4346,7 @@ int snd_hda_multi_out_analog_prepare(struct hda_codec *codec,
unsigned int format, unsigned int format,
struct snd_pcm_substream *substream) struct snd_pcm_substream *substream)
{ {
hda_nid_t *nids = mout->dac_nids; const hda_nid_t *nids = mout->dac_nids;
int chs = substream->runtime->channels; int chs = substream->runtime->channels;
int i; int i;
@ -4335,7 +4401,7 @@ EXPORT_SYMBOL_HDA(snd_hda_multi_out_analog_prepare);
int snd_hda_multi_out_analog_cleanup(struct hda_codec *codec, int snd_hda_multi_out_analog_cleanup(struct hda_codec *codec,
struct hda_multi_out *mout) struct hda_multi_out *mout)
{ {
hda_nid_t *nids = mout->dac_nids; const hda_nid_t *nids = mout->dac_nids;
int i; int i;
for (i = 0; i < mout->num_dacs; i++) for (i = 0; i < mout->num_dacs; i++)
@ -4360,7 +4426,7 @@ EXPORT_SYMBOL_HDA(snd_hda_multi_out_analog_cleanup);
* Helper for automatic pin configuration * Helper for automatic pin configuration
*/ */
static int is_in_nid_list(hda_nid_t nid, hda_nid_t *list) static int is_in_nid_list(hda_nid_t nid, const hda_nid_t *list)
{ {
for (; *list; list++) for (; *list; list++)
if (*list == nid) if (*list == nid)
@ -4441,7 +4507,7 @@ static void sort_autocfg_input_pins(struct auto_pin_cfg *cfg)
*/ */
int snd_hda_parse_pin_def_config(struct hda_codec *codec, int snd_hda_parse_pin_def_config(struct hda_codec *codec,
struct auto_pin_cfg *cfg, struct auto_pin_cfg *cfg,
hda_nid_t *ignore_nids) const hda_nid_t *ignore_nids)
{ {
hda_nid_t nid, end_nid; hda_nid_t nid, end_nid;
short seq, assoc_line_out, assoc_speaker; short seq, assoc_line_out, assoc_speaker;
@ -4632,10 +4698,13 @@ int snd_hda_parse_pin_def_config(struct hda_codec *codec,
/* /*
* debug prints of the parsed results * debug prints of the parsed results
*/ */
snd_printd("autoconfig: line_outs=%d (0x%x/0x%x/0x%x/0x%x/0x%x)\n", snd_printd("autoconfig: line_outs=%d (0x%x/0x%x/0x%x/0x%x/0x%x) type:%s\n",
cfg->line_outs, cfg->line_out_pins[0], cfg->line_out_pins[1], cfg->line_outs, cfg->line_out_pins[0], cfg->line_out_pins[1],
cfg->line_out_pins[2], cfg->line_out_pins[3], cfg->line_out_pins[2], cfg->line_out_pins[3],
cfg->line_out_pins[4]); cfg->line_out_pins[4],
cfg->line_out_type == AUTO_PIN_HP_OUT ? "hp" :
(cfg->line_out_type == AUTO_PIN_SPEAKER_OUT ?
"speaker" : "line"));
snd_printd(" speaker_outs=%d (0x%x/0x%x/0x%x/0x%x/0x%x)\n", snd_printd(" speaker_outs=%d (0x%x/0x%x/0x%x/0x%x/0x%x)\n",
cfg->speaker_outs, cfg->speaker_pins[0], cfg->speaker_outs, cfg->speaker_pins[0],
cfg->speaker_pins[1], cfg->speaker_pins[2], cfg->speaker_pins[1], cfg->speaker_pins[2],
@ -4986,6 +5055,8 @@ static const char *get_jack_default_name(struct hda_codec *codec, hda_nid_t nid,
return "Line-out"; return "Line-out";
case SND_JACK_HEADSET: case SND_JACK_HEADSET:
return "Headset"; return "Headset";
case SND_JACK_VIDEOOUT:
return "HDMI/DP";
default: default:
return "Misc"; return "Misc";
} }

View File

@ -825,12 +825,14 @@ struct hda_codec {
struct hda_cache_rec amp_cache; /* cache for amp access */ struct hda_cache_rec amp_cache; /* cache for amp access */
struct hda_cache_rec cmd_cache; /* cache for other commands */ struct hda_cache_rec cmd_cache; /* cache for other commands */
struct snd_array conn_lists; /* connection-list array */
struct mutex spdif_mutex; struct mutex spdif_mutex;
struct mutex control_mutex; struct mutex control_mutex;
unsigned int spdif_status; /* IEC958 status bits */ unsigned int spdif_status; /* IEC958 status bits */
unsigned short spdif_ctls; /* SPDIF control bits */ unsigned short spdif_ctls; /* SPDIF control bits */
unsigned int spdif_in_enable; /* SPDIF input enable? */ unsigned int spdif_in_enable; /* SPDIF input enable? */
hda_nid_t *slave_dig_outs; /* optional digital out slave widgets */ const hda_nid_t *slave_dig_outs; /* optional digital out slave widgets */
struct snd_array init_pins; /* initial (BIOS) pin configurations */ struct snd_array init_pins; /* initial (BIOS) pin configurations */
struct snd_array driver_pins; /* pin configs set by codec parser */ struct snd_array driver_pins; /* pin configs set by codec parser */
struct snd_array cvt_setups; /* audio convert setups */ struct snd_array cvt_setups; /* audio convert setups */

View File

@ -126,6 +126,7 @@ MODULE_SUPPORTED_DEVICE("{{Intel, ICH6},"
"{Intel, ICH10}," "{Intel, ICH10},"
"{Intel, PCH}," "{Intel, PCH},"
"{Intel, CPT}," "{Intel, CPT},"
"{Intel, PPT},"
"{Intel, PBG}," "{Intel, PBG},"
"{Intel, SCH}," "{Intel, SCH},"
"{ATI, SB450}," "{ATI, SB450},"
@ -1091,7 +1092,13 @@ static void azx_init_pci(struct azx *chip)
? "Failed" : "OK"); ? "Failed" : "OK");
} }
break; break;
default:
/* AMD Hudson needs the similar snoop, as it seems... */
if (chip->pci->vendor == PCI_VENDOR_ID_AMD)
update_pci_byte(chip->pci,
ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR,
0x07, ATI_SB450_HDAUDIO_ENABLE_SNOOP);
break;
} }
} }
@ -1446,6 +1453,17 @@ static int __devinit azx_codec_create(struct azx *chip, const char *model)
} }
} }
/* AMD chipsets often cause the communication stalls upon certain
* sequence like the pin-detection. It seems that forcing the synced
* access works around the stall. Grrr...
*/
if (chip->pci->vendor == PCI_VENDOR_ID_AMD ||
chip->pci->vendor == PCI_VENDOR_ID_ATI) {
snd_printk(KERN_INFO SFX "Enable sync_write for AMD chipset\n");
chip->bus->sync_write = 1;
chip->bus->allow_bus_reset = 1;
}
/* Then create codec instances */ /* Then create codec instances */
for (c = 0; c < max_slots; c++) { for (c = 0; c < max_slots; c++) {
if ((chip->codec_mask & (1 << c)) & chip->codec_probe_mask) { if ((chip->codec_mask & (1 << c)) & chip->codec_probe_mask) {
@ -2349,9 +2367,16 @@ static int __devinit check_position_fix(struct azx *chip, int fix)
/* Check VIA/ATI HD Audio Controller exist */ /* Check VIA/ATI HD Audio Controller exist */
switch (chip->driver_type) { switch (chip->driver_type) {
case AZX_DRIVER_VIA: case AZX_DRIVER_VIA:
case AZX_DRIVER_ATI:
/* Use link position directly, avoid any transfer problem. */ /* Use link position directly, avoid any transfer problem. */
return POS_FIX_VIACOMBO; return POS_FIX_VIACOMBO;
case AZX_DRIVER_ATI:
/* ATI chipsets don't work well with position-buffer */
return POS_FIX_LPIB;
case AZX_DRIVER_GENERIC:
/* AMD chipsets also don't work with position-buffer */
if (chip->pci->vendor == PCI_VENDOR_ID_AMD)
return POS_FIX_LPIB;
break;
} }
return POS_FIX_AUTO; return POS_FIX_AUTO;
@ -2549,6 +2574,13 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci,
gcap &= ~ICH6_GCAP_64OK; gcap &= ~ICH6_GCAP_64OK;
pci_dev_put(p_smbus); pci_dev_put(p_smbus);
} }
} else {
/* FIXME: not sure whether this is really needed, but
* Hudson isn't stable enough for allowing everything...
* let's check later again.
*/
if (chip->pci->vendor == PCI_VENDOR_ID_AMD)
gcap &= ~ICH6_GCAP_64OK;
} }
/* disable 64bit DMA address for Teradici */ /* disable 64bit DMA address for Teradici */
@ -2759,6 +2791,8 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
{ PCI_DEVICE(0x8086, 0x1c20), .driver_data = AZX_DRIVER_PCH }, { PCI_DEVICE(0x8086, 0x1c20), .driver_data = AZX_DRIVER_PCH },
/* PBG */ /* PBG */
{ PCI_DEVICE(0x8086, 0x1d20), .driver_data = AZX_DRIVER_PCH }, { PCI_DEVICE(0x8086, 0x1d20), .driver_data = AZX_DRIVER_PCH },
/* Panther Point */
{ PCI_DEVICE(0x8086, 0x1e20), .driver_data = AZX_DRIVER_PCH },
/* SCH */ /* SCH */
{ PCI_DEVICE(0x8086, 0x811b), .driver_data = AZX_DRIVER_SCH }, { PCI_DEVICE(0x8086, 0x811b), .driver_data = AZX_DRIVER_SCH },
/* Generic Intel */ /* Generic Intel */

View File

@ -267,11 +267,11 @@ enum { HDA_DIG_NONE, HDA_DIG_EXCLUSIVE, HDA_DIG_ANALOG_DUP }; /* dig_out_used */
struct hda_multi_out { struct hda_multi_out {
int num_dacs; /* # of DACs, must be more than 1 */ int num_dacs; /* # of DACs, must be more than 1 */
hda_nid_t *dac_nids; /* DAC list */ const hda_nid_t *dac_nids; /* DAC list */
hda_nid_t hp_nid; /* optional DAC for HP, 0 when not exists */ hda_nid_t hp_nid; /* optional DAC for HP, 0 when not exists */
hda_nid_t extra_out_nid[3]; /* optional DACs, 0 when not exists */ hda_nid_t extra_out_nid[3]; /* optional DACs, 0 when not exists */
hda_nid_t dig_out_nid; /* digital out audio widget */ hda_nid_t dig_out_nid; /* digital out audio widget */
hda_nid_t *slave_dig_outs; const hda_nid_t *slave_dig_outs;
int max_channels; /* currently supported analog channels */ int max_channels; /* currently supported analog channels */
int dig_out_used; /* current usage of digital out (HDA_DIG_XXX) */ int dig_out_used; /* current usage of digital out (HDA_DIG_XXX) */
int no_share_stream; /* don't share a stream with multiple pins */ int no_share_stream; /* don't share a stream with multiple pins */
@ -347,7 +347,7 @@ int snd_hda_check_board_codec_sid_config(struct hda_codec *codec,
int num_configs, const char * const *models, int num_configs, const char * const *models,
const struct snd_pci_quirk *tbl); const struct snd_pci_quirk *tbl);
int snd_hda_add_new_ctls(struct hda_codec *codec, int snd_hda_add_new_ctls(struct hda_codec *codec,
struct snd_kcontrol_new *knew); const struct snd_kcontrol_new *knew);
/* /*
* unsolicited event handler * unsolicited event handler
@ -443,7 +443,7 @@ struct auto_pin_cfg {
int snd_hda_parse_pin_def_config(struct hda_codec *codec, int snd_hda_parse_pin_def_config(struct hda_codec *codec,
struct auto_pin_cfg *cfg, struct auto_pin_cfg *cfg,
hda_nid_t *ignore_nids); const hda_nid_t *ignore_nids);
/* amp values */ /* amp values */
#define AMP_IN_MUTE(idx) (0x7080 | ((idx)<<8)) #define AMP_IN_MUTE(idx) (0x7080 | ((idx)<<8))
@ -493,6 +493,12 @@ u32 snd_hda_query_pin_caps(struct hda_codec *codec, hda_nid_t nid);
u32 snd_hda_pin_sense(struct hda_codec *codec, hda_nid_t nid); u32 snd_hda_pin_sense(struct hda_codec *codec, hda_nid_t nid);
int snd_hda_jack_detect(struct hda_codec *codec, hda_nid_t nid); int snd_hda_jack_detect(struct hda_codec *codec, hda_nid_t nid);
static inline bool is_jack_detectable(struct hda_codec *codec, hda_nid_t nid)
{
return (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_PRES_DETECT) &&
(get_wcaps(codec, nid) & AC_WCAP_UNSOL_CAP);
}
/* flags for hda_nid_item */ /* flags for hda_nid_item */
#define HDA_NID_ITEM_AMP (1<<0) #define HDA_NID_ITEM_AMP (1<<0)
@ -567,7 +573,7 @@ struct hda_amp_list {
}; };
struct hda_loopback_check { struct hda_loopback_check {
struct hda_amp_list *amplist; const struct hda_amp_list *amplist;
int power_on; int power_on;
}; };

File diff suppressed because it is too large Load Diff

View File

@ -134,7 +134,7 @@ static int ca0110_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
/* /*
*/ */
static char *dirstr[2] = { "Playback", "Capture" }; static const char * const dirstr[2] = { "Playback", "Capture" };
static int _add_switch(struct hda_codec *codec, hda_nid_t nid, const char *pfx, static int _add_switch(struct hda_codec *codec, hda_nid_t nid, const char *pfx,
int chan, int dir) int chan, int dir)
@ -171,7 +171,7 @@ static int ca0110_build_controls(struct hda_codec *codec)
{ {
struct ca0110_spec *spec = codec->spec; struct ca0110_spec *spec = codec->spec;
struct auto_pin_cfg *cfg = &spec->autocfg; struct auto_pin_cfg *cfg = &spec->autocfg;
static char *prefix[AUTO_CFG_MAX_OUTS] = { static const char * const prefix[AUTO_CFG_MAX_OUTS] = {
"Front", "Surround", NULL, "Side", "Multi" "Front", "Surround", NULL, "Side", "Multi"
}; };
hda_nid_t mutenid; hda_nid_t mutenid;
@ -259,7 +259,7 @@ static int ca0110_build_controls(struct hda_codec *codec)
/* /*
*/ */
static struct hda_pcm_stream ca0110_pcm_analog_playback = { static const struct hda_pcm_stream ca0110_pcm_analog_playback = {
.substreams = 1, .substreams = 1,
.channels_min = 2, .channels_min = 2,
.channels_max = 8, .channels_max = 8,
@ -270,7 +270,7 @@ static struct hda_pcm_stream ca0110_pcm_analog_playback = {
}, },
}; };
static struct hda_pcm_stream ca0110_pcm_analog_capture = { static const struct hda_pcm_stream ca0110_pcm_analog_capture = {
.substreams = 1, .substreams = 1,
.channels_min = 2, .channels_min = 2,
.channels_max = 2, .channels_max = 2,
@ -280,7 +280,7 @@ static struct hda_pcm_stream ca0110_pcm_analog_capture = {
}, },
}; };
static struct hda_pcm_stream ca0110_pcm_digital_playback = { static const struct hda_pcm_stream ca0110_pcm_digital_playback = {
.substreams = 1, .substreams = 1,
.channels_min = 2, .channels_min = 2,
.channels_max = 2, .channels_max = 2,
@ -291,7 +291,7 @@ static struct hda_pcm_stream ca0110_pcm_digital_playback = {
}, },
}; };
static struct hda_pcm_stream ca0110_pcm_digital_capture = { static const struct hda_pcm_stream ca0110_pcm_digital_capture = {
.substreams = 1, .substreams = 1,
.channels_min = 2, .channels_min = 2,
.channels_max = 2, .channels_max = 2,
@ -389,7 +389,7 @@ static void ca0110_free(struct hda_codec *codec)
kfree(codec->spec); kfree(codec->spec);
} }
static struct hda_codec_ops ca0110_patch_ops = { static const struct hda_codec_ops ca0110_patch_ops = {
.build_controls = ca0110_build_controls, .build_controls = ca0110_build_controls,
.build_pcms = ca0110_build_pcms, .build_pcms = ca0110_build_pcms,
.init = ca0110_init, .init = ca0110_init,
@ -539,7 +539,7 @@ static int patch_ca0110(struct hda_codec *codec)
/* /*
* patch entries * patch entries
*/ */
static struct hda_codec_preset snd_hda_preset_ca0110[] = { static const struct hda_codec_preset snd_hda_preset_ca0110[] = {
{ .id = 0x1102000a, .name = "CA0110-IBG", .patch = patch_ca0110 }, { .id = 0x1102000a, .name = "CA0110-IBG", .patch = patch_ca0110 },
{ .id = 0x1102000b, .name = "CA0110-IBG", .patch = patch_ca0110 }, { .id = 0x1102000b, .name = "CA0110-IBG", .patch = patch_ca0110 },
{ .id = 0x1102000d, .name = "SB0880 X-Fi", .patch = patch_ca0110 }, { .id = 0x1102000d, .name = "SB0880 X-Fi", .patch = patch_ca0110 },

View File

@ -51,7 +51,7 @@ struct cs_spec {
unsigned int cur_adc_format; unsigned int cur_adc_format;
hda_nid_t dig_in; hda_nid_t dig_in;
struct hda_bind_ctls *capture_bind[2]; const struct hda_bind_ctls *capture_bind[2];
unsigned int gpio_mask; unsigned int gpio_mask;
unsigned int gpio_dir; unsigned int gpio_dir;
@ -231,7 +231,7 @@ static int cs_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
/* /*
*/ */
static struct hda_pcm_stream cs_pcm_analog_playback = { static const struct hda_pcm_stream cs_pcm_analog_playback = {
.substreams = 1, .substreams = 1,
.channels_min = 2, .channels_min = 2,
.channels_max = 2, .channels_max = 2,
@ -242,7 +242,7 @@ static struct hda_pcm_stream cs_pcm_analog_playback = {
}, },
}; };
static struct hda_pcm_stream cs_pcm_analog_capture = { static const struct hda_pcm_stream cs_pcm_analog_capture = {
.substreams = 1, .substreams = 1,
.channels_min = 2, .channels_min = 2,
.channels_max = 2, .channels_max = 2,
@ -252,7 +252,7 @@ static struct hda_pcm_stream cs_pcm_analog_capture = {
}, },
}; };
static struct hda_pcm_stream cs_pcm_digital_playback = { static const struct hda_pcm_stream cs_pcm_digital_playback = {
.substreams = 1, .substreams = 1,
.channels_min = 2, .channels_min = 2,
.channels_max = 2, .channels_max = 2,
@ -264,7 +264,7 @@ static struct hda_pcm_stream cs_pcm_digital_playback = {
}, },
}; };
static struct hda_pcm_stream cs_pcm_digital_capture = { static const struct hda_pcm_stream cs_pcm_digital_capture = {
.substreams = 1, .substreams = 1,
.channels_min = 2, .channels_min = 2,
.channels_max = 2, .channels_max = 2,
@ -331,8 +331,8 @@ static int is_ext_mic(struct hda_codec *codec, unsigned int idx)
struct cs_spec *spec = codec->spec; struct cs_spec *spec = codec->spec;
struct auto_pin_cfg *cfg = &spec->autocfg; struct auto_pin_cfg *cfg = &spec->autocfg;
hda_nid_t pin = cfg->inputs[idx].pin; hda_nid_t pin = cfg->inputs[idx].pin;
unsigned int val = snd_hda_query_pin_caps(codec, pin); unsigned int val;
if (!(val & AC_PINCAP_PRES_DETECT)) if (!is_jack_detectable(codec, pin))
return 0; return 0;
val = snd_hda_codec_get_pincfg(codec, pin); val = snd_hda_codec_get_pincfg(codec, pin);
return (snd_hda_get_input_pin_attr(val) != INPUT_PIN_ATTR_INT); return (snd_hda_get_input_pin_attr(val) != INPUT_PIN_ATTR_INT);
@ -349,8 +349,7 @@ static hda_nid_t get_adc(struct hda_codec *codec, hda_nid_t pin,
hda_nid_t pins[2]; hda_nid_t pins[2];
unsigned int type; unsigned int type;
int j, nums; int j, nums;
type = (get_wcaps(codec, nid) & AC_WCAP_TYPE) type = get_wcaps_type(get_wcaps(codec, nid));
>> AC_WCAP_TYPE_SHIFT;
if (type != AC_WID_AUD_IN) if (type != AC_WID_AUD_IN)
continue; continue;
nums = snd_hda_get_connections(codec, nid, pins, nums = snd_hda_get_connections(codec, nid, pins,
@ -559,10 +558,10 @@ static int add_output(struct hda_codec *codec, hda_nid_t dac, int idx,
const char *name; const char *name;
int err, index; int err, index;
struct snd_kcontrol *kctl; struct snd_kcontrol *kctl;
static char *speakers[] = { static const char * const speakers[] = {
"Front Speaker", "Surround Speaker", "Bass Speaker" "Front Speaker", "Surround Speaker", "Bass Speaker"
}; };
static char *line_outs[] = { static const char * const line_outs[] = {
"Front Line-Out", "Surround Line-Out", "Bass Line-Out" "Front Line-Out", "Surround Line-Out", "Bass Line-Out"
}; };
@ -642,7 +641,7 @@ static int build_output(struct hda_codec *codec)
/* /*
*/ */
static struct snd_kcontrol_new cs_capture_ctls[] = { static const struct snd_kcontrol_new cs_capture_ctls[] = {
HDA_BIND_SW("Capture Switch", 0), HDA_BIND_SW("Capture Switch", 0),
HDA_BIND_VOL("Capture Volume", 0), HDA_BIND_VOL("Capture Volume", 0),
}; };
@ -710,7 +709,7 @@ static int cs_capture_source_put(struct snd_kcontrol *kcontrol,
return change_cur_input(codec, idx, 0); return change_cur_input(codec, idx, 0);
} }
static struct snd_kcontrol_new cs_capture_source = { static const struct snd_kcontrol_new cs_capture_source = {
.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
.name = "Capture Source", .name = "Capture Source",
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE, .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
@ -719,7 +718,7 @@ static struct snd_kcontrol_new cs_capture_source = {
.put = cs_capture_source_put, .put = cs_capture_source_put,
}; };
static struct hda_bind_ctls *make_bind_capture(struct hda_codec *codec, static const struct hda_bind_ctls *make_bind_capture(struct hda_codec *codec,
struct hda_ctl_ops *ops) struct hda_ctl_ops *ops)
{ {
struct cs_spec *spec = codec->spec; struct cs_spec *spec = codec->spec;
@ -847,15 +846,14 @@ static void cs_automute(struct hda_codec *codec)
{ {
struct cs_spec *spec = codec->spec; struct cs_spec *spec = codec->spec;
struct auto_pin_cfg *cfg = &spec->autocfg; struct auto_pin_cfg *cfg = &spec->autocfg;
unsigned int caps, hp_present; unsigned int hp_present;
hda_nid_t nid; hda_nid_t nid;
int i; int i;
hp_present = 0; hp_present = 0;
for (i = 0; i < cfg->hp_outs; i++) { for (i = 0; i < cfg->hp_outs; i++) {
nid = cfg->hp_pins[i]; nid = cfg->hp_pins[i];
caps = snd_hda_query_pin_caps(codec, nid); if (!is_jack_detectable(codec, nid))
if (!(caps & AC_PINCAP_PRES_DETECT))
continue; continue;
hp_present = snd_hda_jack_detect(codec, nid); hp_present = snd_hda_jack_detect(codec, nid);
if (hp_present) if (hp_present)
@ -924,7 +922,7 @@ static void init_output(struct hda_codec *codec)
AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP); AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP);
if (!cfg->speaker_outs) if (!cfg->speaker_outs)
continue; continue;
if (get_wcaps(codec, nid) & AC_WCAP_UNSOL_CAP) { if (is_jack_detectable(codec, nid)) {
snd_hda_codec_write(codec, nid, 0, snd_hda_codec_write(codec, nid, 0,
AC_VERB_SET_UNSOLICITED_ENABLE, AC_VERB_SET_UNSOLICITED_ENABLE,
AC_USRSP_EN | HP_EVENT); AC_USRSP_EN | HP_EVENT);
@ -983,7 +981,7 @@ static void init_input(struct hda_codec *codec)
cs_vendor_coef_set(codec, IDX_ADC_CFG, coef); cs_vendor_coef_set(codec, IDX_ADC_CFG, coef);
} }
static struct hda_verb cs_coef_init_verbs[] = { static const struct hda_verb cs_coef_init_verbs[] = {
{0x11, AC_VERB_SET_PROC_STATE, 1}, {0x11, AC_VERB_SET_PROC_STATE, 1},
{0x11, AC_VERB_SET_COEF_INDEX, IDX_DAC_CFG}, {0x11, AC_VERB_SET_COEF_INDEX, IDX_DAC_CFG},
{0x11, AC_VERB_SET_PROC_COEF, {0x11, AC_VERB_SET_PROC_COEF,
@ -1017,7 +1015,7 @@ static struct hda_verb cs_coef_init_verbs[] = {
* blocks, which will alleviate the issue. * blocks, which will alleviate the issue.
*/ */
static struct hda_verb cs_errata_init_verbs[] = { static const struct hda_verb cs_errata_init_verbs[] = {
{0x01, AC_VERB_SET_POWER_STATE, 0x00}, /* AFG: D0 */ {0x01, AC_VERB_SET_POWER_STATE, 0x00}, /* AFG: D0 */
{0x11, AC_VERB_SET_PROC_STATE, 0x01}, /* VPW: processing on */ {0x11, AC_VERB_SET_PROC_STATE, 0x01}, /* VPW: processing on */
@ -1126,7 +1124,7 @@ static void cs_unsol_event(struct hda_codec *codec, unsigned int res)
} }
} }
static struct hda_codec_ops cs_patch_ops = { static const struct hda_codec_ops cs_patch_ops = {
.build_controls = cs_build_controls, .build_controls = cs_build_controls,
.build_pcms = cs_build_pcms, .build_pcms = cs_build_pcms,
.init = cs_init, .init = cs_init,
@ -1166,7 +1164,7 @@ static const char * const cs420x_models[CS420X_MODELS] = {
}; };
static struct snd_pci_quirk cs420x_cfg_tbl[] = { static const struct snd_pci_quirk cs420x_cfg_tbl[] = {
SND_PCI_QUIRK(0x10de, 0x0ac0, "MacBookPro 5,3", CS420X_MBP53), SND_PCI_QUIRK(0x10de, 0x0ac0, "MacBookPro 5,3", CS420X_MBP53),
SND_PCI_QUIRK(0x10de, 0x0d94, "MacBookAir 3,1(2)", CS420X_MBP55), SND_PCI_QUIRK(0x10de, 0x0d94, "MacBookAir 3,1(2)", CS420X_MBP55),
SND_PCI_QUIRK(0x10de, 0xcb79, "MacBookPro 5,5", CS420X_MBP55), SND_PCI_QUIRK(0x10de, 0xcb79, "MacBookPro 5,5", CS420X_MBP55),
@ -1180,7 +1178,7 @@ struct cs_pincfg {
u32 val; u32 val;
}; };
static struct cs_pincfg mbp53_pincfgs[] = { static const struct cs_pincfg mbp53_pincfgs[] = {
{ 0x09, 0x012b4050 }, { 0x09, 0x012b4050 },
{ 0x0a, 0x90100141 }, { 0x0a, 0x90100141 },
{ 0x0b, 0x90100140 }, { 0x0b, 0x90100140 },
@ -1194,7 +1192,7 @@ static struct cs_pincfg mbp53_pincfgs[] = {
{} /* terminator */ {} /* terminator */
}; };
static struct cs_pincfg mbp55_pincfgs[] = { static const struct cs_pincfg mbp55_pincfgs[] = {
{ 0x09, 0x012b4030 }, { 0x09, 0x012b4030 },
{ 0x0a, 0x90100121 }, { 0x0a, 0x90100121 },
{ 0x0b, 0x90100120 }, { 0x0b, 0x90100120 },
@ -1208,7 +1206,7 @@ static struct cs_pincfg mbp55_pincfgs[] = {
{} /* terminator */ {} /* terminator */
}; };
static struct cs_pincfg imac27_pincfgs[] = { static const struct cs_pincfg imac27_pincfgs[] = {
{ 0x09, 0x012b4050 }, { 0x09, 0x012b4050 },
{ 0x0a, 0x90100140 }, { 0x0a, 0x90100140 },
{ 0x0b, 0x90100142 }, { 0x0b, 0x90100142 },
@ -1222,7 +1220,7 @@ static struct cs_pincfg imac27_pincfgs[] = {
{} /* terminator */ {} /* terminator */
}; };
static struct cs_pincfg *cs_pincfgs[CS420X_MODELS] = { static const struct cs_pincfg *cs_pincfgs[CS420X_MODELS] = {
[CS420X_MBP53] = mbp53_pincfgs, [CS420X_MBP53] = mbp53_pincfgs,
[CS420X_MBP55] = mbp55_pincfgs, [CS420X_MBP55] = mbp55_pincfgs,
[CS420X_IMAC27] = imac27_pincfgs, [CS420X_IMAC27] = imac27_pincfgs,
@ -1283,7 +1281,7 @@ static int patch_cs420x(struct hda_codec *codec)
/* /*
* patch entries * patch entries
*/ */
static struct hda_codec_preset snd_hda_preset_cirrus[] = { static const struct hda_codec_preset snd_hda_preset_cirrus[] = {
{ .id = 0x10134206, .name = "CS4206", .patch = patch_cs420x }, { .id = 0x10134206, .name = "CS4206", .patch = patch_cs420x },
{ .id = 0x10134207, .name = "CS4207", .patch = patch_cs420x }, { .id = 0x10134207, .name = "CS4207", .patch = patch_cs420x },
{} /* terminator */ {} /* terminator */

View File

@ -53,7 +53,7 @@ struct cmi_spec {
int num_dacs; int num_dacs;
/* capture */ /* capture */
hda_nid_t *adc_nids; const hda_nid_t *adc_nids;
hda_nid_t dig_in_nid; hda_nid_t dig_in_nid;
/* capture source */ /* capture source */
@ -110,7 +110,7 @@ static int cmi_mux_enum_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_v
*/ */
/* 3-stack / 2 channel */ /* 3-stack / 2 channel */
static struct hda_verb cmi9880_ch2_init[] = { static const struct hda_verb cmi9880_ch2_init[] = {
/* set line-in PIN for input */ /* set line-in PIN for input */
{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
/* set mic PIN for input, also enable vref */ /* set mic PIN for input, also enable vref */
@ -121,7 +121,7 @@ static struct hda_verb cmi9880_ch2_init[] = {
}; };
/* 3-stack / 6 channel */ /* 3-stack / 6 channel */
static struct hda_verb cmi9880_ch6_init[] = { static const struct hda_verb cmi9880_ch6_init[] = {
/* set line-in PIN for output */ /* set line-in PIN for output */
{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
/* set mic PIN for output */ /* set mic PIN for output */
@ -132,7 +132,7 @@ static struct hda_verb cmi9880_ch6_init[] = {
}; };
/* 3-stack+front / 8 channel */ /* 3-stack+front / 8 channel */
static struct hda_verb cmi9880_ch8_init[] = { static const struct hda_verb cmi9880_ch8_init[] = {
/* set line-in PIN for output */ /* set line-in PIN for output */
{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
/* set mic PIN for output */ /* set mic PIN for output */
@ -142,7 +142,7 @@ static struct hda_verb cmi9880_ch8_init[] = {
{} {}
}; };
static struct hda_channel_mode cmi9880_channel_modes[3] = { static const struct hda_channel_mode cmi9880_channel_modes[3] = {
{ 2, cmi9880_ch2_init }, { 2, cmi9880_ch2_init },
{ 6, cmi9880_ch6_init }, { 6, cmi9880_ch6_init },
{ 8, cmi9880_ch8_init }, { 8, cmi9880_ch8_init },
@ -174,7 +174,7 @@ static int cmi_ch_mode_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_va
/* /*
*/ */
static struct snd_kcontrol_new cmi9880_basic_mixer[] = { static const struct snd_kcontrol_new cmi9880_basic_mixer[] = {
/* CMI9880 has no playback volumes! */ /* CMI9880 has no playback volumes! */
HDA_CODEC_MUTE("PCM Playback Switch", 0x03, 0x0, HDA_OUTPUT), /* front */ HDA_CODEC_MUTE("PCM Playback Switch", 0x03, 0x0, HDA_OUTPUT), /* front */
HDA_CODEC_MUTE("Surround Playback Switch", 0x04, 0x0, HDA_OUTPUT), HDA_CODEC_MUTE("Surround Playback Switch", 0x04, 0x0, HDA_OUTPUT),
@ -205,7 +205,7 @@ static struct snd_kcontrol_new cmi9880_basic_mixer[] = {
/* /*
* shared I/O pins * shared I/O pins
*/ */
static struct snd_kcontrol_new cmi9880_ch_mode_mixer[] = { static const struct snd_kcontrol_new cmi9880_ch_mode_mixer[] = {
{ {
.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
.name = "Channel Mode", .name = "Channel Mode",
@ -219,7 +219,7 @@ static struct snd_kcontrol_new cmi9880_ch_mode_mixer[] = {
/* AUD-in selections: /* AUD-in selections:
* 0x0b 0x0c 0x0d 0x0e 0x0f 0x10 0x11 0x1f 0x20 * 0x0b 0x0c 0x0d 0x0e 0x0f 0x10 0x11 0x1f 0x20
*/ */
static struct hda_input_mux cmi9880_basic_mux = { static const struct hda_input_mux cmi9880_basic_mux = {
.num_items = 4, .num_items = 4,
.items = { .items = {
{ "Front Mic", 0x5 }, { "Front Mic", 0x5 },
@ -229,7 +229,7 @@ static struct hda_input_mux cmi9880_basic_mux = {
} }
}; };
static struct hda_input_mux cmi9880_no_line_mux = { static const struct hda_input_mux cmi9880_no_line_mux = {
.num_items = 3, .num_items = 3,
.items = { .items = {
{ "Front Mic", 0x5 }, { "Front Mic", 0x5 },
@ -239,11 +239,11 @@ static struct hda_input_mux cmi9880_no_line_mux = {
}; };
/* front, rear, clfe, rear_surr */ /* front, rear, clfe, rear_surr */
static hda_nid_t cmi9880_dac_nids[4] = { static const hda_nid_t cmi9880_dac_nids[4] = {
0x03, 0x04, 0x05, 0x06 0x03, 0x04, 0x05, 0x06
}; };
/* ADC0, ADC1 */ /* ADC0, ADC1 */
static hda_nid_t cmi9880_adc_nids[2] = { static const hda_nid_t cmi9880_adc_nids[2] = {
0x08, 0x09 0x08, 0x09
}; };
@ -252,7 +252,7 @@ static hda_nid_t cmi9880_adc_nids[2] = {
/* /*
*/ */
static struct hda_verb cmi9880_basic_init[] = { static const struct hda_verb cmi9880_basic_init[] = {
/* port-D for line out (rear panel) */ /* port-D for line out (rear panel) */
{ 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
/* port-E for HP out (front panel) */ /* port-E for HP out (front panel) */
@ -281,7 +281,7 @@ static struct hda_verb cmi9880_basic_init[] = {
{} /* terminator */ {} /* terminator */
}; };
static struct hda_verb cmi9880_allout_init[] = { static const struct hda_verb cmi9880_allout_init[] = {
/* port-D for line out (rear panel) */ /* port-D for line out (rear panel) */
{ 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
/* port-E for HP out (front panel) */ /* port-E for HP out (front panel) */
@ -528,7 +528,7 @@ static int cmi9880_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
/* /*
*/ */
static struct hda_pcm_stream cmi9880_pcm_analog_playback = { static const struct hda_pcm_stream cmi9880_pcm_analog_playback = {
.substreams = 1, .substreams = 1,
.channels_min = 2, .channels_min = 2,
.channels_max = 8, .channels_max = 8,
@ -540,7 +540,7 @@ static struct hda_pcm_stream cmi9880_pcm_analog_playback = {
}, },
}; };
static struct hda_pcm_stream cmi9880_pcm_analog_capture = { static const struct hda_pcm_stream cmi9880_pcm_analog_capture = {
.substreams = 2, .substreams = 2,
.channels_min = 2, .channels_min = 2,
.channels_max = 2, .channels_max = 2,
@ -551,7 +551,7 @@ static struct hda_pcm_stream cmi9880_pcm_analog_capture = {
}, },
}; };
static struct hda_pcm_stream cmi9880_pcm_digital_playback = { static const struct hda_pcm_stream cmi9880_pcm_digital_playback = {
.substreams = 1, .substreams = 1,
.channels_min = 2, .channels_min = 2,
.channels_max = 2, .channels_max = 2,
@ -563,7 +563,7 @@ static struct hda_pcm_stream cmi9880_pcm_digital_playback = {
}, },
}; };
static struct hda_pcm_stream cmi9880_pcm_digital_capture = { static const struct hda_pcm_stream cmi9880_pcm_digital_capture = {
.substreams = 1, .substreams = 1,
.channels_min = 2, .channels_min = 2,
.channels_max = 2, .channels_max = 2,
@ -617,14 +617,14 @@ static const char * const cmi9880_models[CMI_MODELS] = {
[CMI_AUTO] = "auto", [CMI_AUTO] = "auto",
}; };
static struct snd_pci_quirk cmi9880_cfg_tbl[] = { static const struct snd_pci_quirk cmi9880_cfg_tbl[] = {
SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", CMI_FULL_DIG), SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", CMI_FULL_DIG),
SND_PCI_QUIRK(0x1854, 0x002b, "LG LS75", CMI_MINIMAL), SND_PCI_QUIRK(0x1854, 0x002b, "LG LS75", CMI_MINIMAL),
SND_PCI_QUIRK(0x1854, 0x0032, "LG", CMI_FULL_DIG), SND_PCI_QUIRK(0x1854, 0x0032, "LG", CMI_FULL_DIG),
{} /* terminator */ {} /* terminator */
}; };
static struct hda_codec_ops cmi9880_patch_ops = { static const struct hda_codec_ops cmi9880_patch_ops = {
.build_controls = cmi9880_build_controls, .build_controls = cmi9880_build_controls,
.build_pcms = cmi9880_build_pcms, .build_pcms = cmi9880_build_pcms,
.init = cmi9880_init, .init = cmi9880_init,
@ -745,7 +745,7 @@ static int patch_cmi9880(struct hda_codec *codec)
/* /*
* patch entries * patch entries
*/ */
static struct hda_codec_preset snd_hda_preset_cmedia[] = { static const struct hda_codec_preset snd_hda_preset_cmedia[] = {
{ .id = 0x13f69880, .name = "CMI9880", .patch = patch_cmi9880 }, { .id = 0x13f69880, .name = "CMI9880", .patch = patch_cmi9880 },
{ .id = 0x434d4980, .name = "CMI9880", .patch = patch_cmi9880 }, { .id = 0x434d4980, .name = "CMI9880", .patch = patch_cmi9880 },
{} /* terminator */ {} /* terminator */

File diff suppressed because it is too large Load Diff

View File

@ -33,6 +33,7 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/moduleparam.h> #include <linux/moduleparam.h>
#include <sound/core.h> #include <sound/core.h>
#include <sound/jack.h>
#include "hda_codec.h" #include "hda_codec.h"
#include "hda_local.h" #include "hda_local.h"
@ -76,7 +77,7 @@ struct hdmi_spec {
* ati/nvhdmi specific * ati/nvhdmi specific
*/ */
struct hda_multi_out multiout; struct hda_multi_out multiout;
struct hda_pcm_stream *pcm_playback; const struct hda_pcm_stream *pcm_playback;
/* misc flags */ /* misc flags */
/* PD bit indicates only the update, not the current state */ /* PD bit indicates only the update, not the current state */
@ -720,6 +721,8 @@ static void hdmi_intrinsic_event(struct hda_codec *codec, unsigned int res)
&spec->sink_eld[index]); &spec->sink_eld[index]);
/* TODO: do real things about ELD */ /* TODO: do real things about ELD */
} }
snd_hda_input_jack_report(codec, tag);
} }
static void hdmi_non_intrinsic_event(struct hda_codec *codec, unsigned int res) static void hdmi_non_intrinsic_event(struct hda_codec *codec, unsigned int res)
@ -912,6 +915,7 @@ static void hdmi_present_sense(struct hda_codec *codec, hda_nid_t pin_nid,
static int hdmi_add_pin(struct hda_codec *codec, hda_nid_t pin_nid) static int hdmi_add_pin(struct hda_codec *codec, hda_nid_t pin_nid)
{ {
struct hdmi_spec *spec = codec->spec; struct hdmi_spec *spec = codec->spec;
int err;
if (spec->num_pins >= MAX_HDMI_PINS) { if (spec->num_pins >= MAX_HDMI_PINS) {
snd_printk(KERN_WARNING snd_printk(KERN_WARNING
@ -919,6 +923,12 @@ static int hdmi_add_pin(struct hda_codec *codec, hda_nid_t pin_nid)
return -E2BIG; return -E2BIG;
} }
err = snd_hda_input_jack_add(codec, pin_nid,
SND_JACK_VIDEOOUT, NULL);
if (err < 0)
return err;
snd_hda_input_jack_report(codec, pin_nid);
hdmi_present_sense(codec, pin_nid, &spec->sink_eld[spec->num_pins]); hdmi_present_sense(codec, pin_nid, &spec->sink_eld[spec->num_pins]);
spec->pin[spec->num_pins] = pin_nid; spec->pin[spec->num_pins] = pin_nid;
@ -1044,7 +1054,7 @@ static int generic_hdmi_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
return hdmi_setup_stream(codec, hinfo->nid, stream_tag, format); return hdmi_setup_stream(codec, hinfo->nid, stream_tag, format);
} }
static struct hda_pcm_stream generic_hdmi_pcm_playback = { static const struct hda_pcm_stream generic_hdmi_pcm_playback = {
.substreams = 1, .substreams = 1,
.channels_min = 2, .channels_min = 2,
.ops = { .ops = {
@ -1120,11 +1130,12 @@ static void generic_hdmi_free(struct hda_codec *codec)
for (i = 0; i < spec->num_pins; i++) for (i = 0; i < spec->num_pins; i++)
snd_hda_eld_proc_free(codec, &spec->sink_eld[i]); snd_hda_eld_proc_free(codec, &spec->sink_eld[i]);
snd_hda_input_jack_free(codec);
kfree(spec); kfree(spec);
} }
static struct hda_codec_ops generic_hdmi_patch_ops = { static const struct hda_codec_ops generic_hdmi_patch_ops = {
.init = generic_hdmi_init, .init = generic_hdmi_init,
.free = generic_hdmi_free, .free = generic_hdmi_free,
.build_pcms = generic_hdmi_build_pcms, .build_pcms = generic_hdmi_build_pcms,
@ -1169,12 +1180,12 @@ static int patch_generic_hdmi(struct hda_codec *codec)
#define nvhdmi_master_con_nid_7x 0x04 #define nvhdmi_master_con_nid_7x 0x04
#define nvhdmi_master_pin_nid_7x 0x05 #define nvhdmi_master_pin_nid_7x 0x05
static hda_nid_t nvhdmi_con_nids_7x[4] = { static const hda_nid_t nvhdmi_con_nids_7x[4] = {
/*front, rear, clfe, rear_surr */ /*front, rear, clfe, rear_surr */
0x6, 0x8, 0xa, 0xc, 0x6, 0x8, 0xa, 0xc,
}; };
static struct hda_verb nvhdmi_basic_init_7x[] = { static const struct hda_verb nvhdmi_basic_init_7x[] = {
/* set audio protect on */ /* set audio protect on */
{ 0x1, Nv_VERB_SET_Audio_Protection_On, 0x1}, { 0x1, Nv_VERB_SET_Audio_Protection_On, 0x1},
/* enable digital output on pin widget */ /* enable digital output on pin widget */
@ -1435,7 +1446,7 @@ static int nvhdmi_8ch_7x_pcm_prepare(struct hda_pcm_stream *hinfo,
return 0; return 0;
} }
static struct hda_pcm_stream nvhdmi_pcm_playback_8ch_7x = { static const struct hda_pcm_stream nvhdmi_pcm_playback_8ch_7x = {
.substreams = 1, .substreams = 1,
.channels_min = 2, .channels_min = 2,
.channels_max = 8, .channels_max = 8,
@ -1450,7 +1461,7 @@ static struct hda_pcm_stream nvhdmi_pcm_playback_8ch_7x = {
}, },
}; };
static struct hda_pcm_stream nvhdmi_pcm_playback_2ch = { static const struct hda_pcm_stream nvhdmi_pcm_playback_2ch = {
.substreams = 1, .substreams = 1,
.channels_min = 2, .channels_min = 2,
.channels_max = 2, .channels_max = 2,
@ -1465,14 +1476,14 @@ static struct hda_pcm_stream nvhdmi_pcm_playback_2ch = {
}, },
}; };
static struct hda_codec_ops nvhdmi_patch_ops_8ch_7x = { static const struct hda_codec_ops nvhdmi_patch_ops_8ch_7x = {
.build_controls = generic_hdmi_build_controls, .build_controls = generic_hdmi_build_controls,
.build_pcms = generic_hdmi_build_pcms, .build_pcms = generic_hdmi_build_pcms,
.init = nvhdmi_7x_init, .init = nvhdmi_7x_init,
.free = generic_hdmi_free, .free = generic_hdmi_free,
}; };
static struct hda_codec_ops nvhdmi_patch_ops_2ch = { static const struct hda_codec_ops nvhdmi_patch_ops_2ch = {
.build_controls = generic_hdmi_build_controls, .build_controls = generic_hdmi_build_controls,
.build_pcms = generic_hdmi_build_pcms, .build_pcms = generic_hdmi_build_pcms,
.init = nvhdmi_7x_init, .init = nvhdmi_7x_init,
@ -1568,7 +1579,7 @@ static int atihdmi_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
return 0; return 0;
} }
static struct hda_pcm_stream atihdmi_pcm_digital_playback = { static const struct hda_pcm_stream atihdmi_pcm_digital_playback = {
.substreams = 1, .substreams = 1,
.channels_min = 2, .channels_min = 2,
.channels_max = 2, .channels_max = 2,
@ -1580,7 +1591,7 @@ static struct hda_pcm_stream atihdmi_pcm_digital_playback = {
}, },
}; };
static struct hda_verb atihdmi_basic_init[] = { static const struct hda_verb atihdmi_basic_init[] = {
/* enable digital output on pin widget */ /* enable digital output on pin widget */
{ 0x03, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, { 0x03, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
{} /* terminator */ {} /* terminator */
@ -1599,7 +1610,7 @@ static int atihdmi_init(struct hda_codec *codec)
return 0; return 0;
} }
static struct hda_codec_ops atihdmi_patch_ops = { static const struct hda_codec_ops atihdmi_patch_ops = {
.build_controls = generic_hdmi_build_controls, .build_controls = generic_hdmi_build_controls,
.build_pcms = generic_hdmi_build_pcms, .build_pcms = generic_hdmi_build_pcms,
.init = atihdmi_init, .init = atihdmi_init,
@ -1634,7 +1645,7 @@ static int patch_atihdmi(struct hda_codec *codec)
/* /*
* patch entries * patch entries
*/ */
static struct hda_codec_preset snd_hda_preset_hdmi[] = { static const struct hda_codec_preset snd_hda_preset_hdmi[] = {
{ .id = 0x1002793c, .name = "RS600 HDMI", .patch = patch_atihdmi }, { .id = 0x1002793c, .name = "RS600 HDMI", .patch = patch_atihdmi },
{ .id = 0x10027919, .name = "RS600 HDMI", .patch = patch_atihdmi }, { .id = 0x10027919, .name = "RS600 HDMI", .patch = patch_atihdmi },
{ .id = 0x1002791a, .name = "RS690/780 HDMI", .patch = patch_atihdmi }, { .id = 0x1002791a, .name = "RS690/780 HDMI", .patch = patch_atihdmi },
@ -1677,6 +1688,7 @@ static struct hda_codec_preset snd_hda_preset_hdmi[] = {
{ .id = 0x80862803, .name = "Eaglelake HDMI", .patch = patch_generic_hdmi }, { .id = 0x80862803, .name = "Eaglelake HDMI", .patch = patch_generic_hdmi },
{ .id = 0x80862804, .name = "IbexPeak HDMI", .patch = patch_generic_hdmi }, { .id = 0x80862804, .name = "IbexPeak HDMI", .patch = patch_generic_hdmi },
{ .id = 0x80862805, .name = "CougarPoint HDMI", .patch = patch_generic_hdmi }, { .id = 0x80862805, .name = "CougarPoint HDMI", .patch = patch_generic_hdmi },
{ .id = 0x80862806, .name = "PantherPoint HDMI", .patch = patch_generic_hdmi },
{ .id = 0x808629fb, .name = "Crestline HDMI", .patch = patch_generic_hdmi }, { .id = 0x808629fb, .name = "Crestline HDMI", .patch = patch_generic_hdmi },
{} /* terminator */ {} /* terminator */
}; };
@ -1722,6 +1734,7 @@ MODULE_ALIAS("snd-hda-codec-id:80862802");
MODULE_ALIAS("snd-hda-codec-id:80862803"); MODULE_ALIAS("snd-hda-codec-id:80862803");
MODULE_ALIAS("snd-hda-codec-id:80862804"); MODULE_ALIAS("snd-hda-codec-id:80862804");
MODULE_ALIAS("snd-hda-codec-id:80862805"); MODULE_ALIAS("snd-hda-codec-id:80862805");
MODULE_ALIAS("snd-hda-codec-id:80862806");
MODULE_ALIAS("snd-hda-codec-id:808629fb"); MODULE_ALIAS("snd-hda-codec-id:808629fb");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");

File diff suppressed because it is too large Load Diff

View File

@ -130,7 +130,7 @@ static int si3054_switch_put(struct snd_kcontrol *kcontrol,
} }
static struct snd_kcontrol_new si3054_modem_mixer[] = { static const struct snd_kcontrol_new si3054_modem_mixer[] = {
SI3054_KCONTROL("Off-hook Switch", SI3054_GPIO_CONTROL, SI3054_GPIO_OH), SI3054_KCONTROL("Off-hook Switch", SI3054_GPIO_CONTROL, SI3054_GPIO_OH),
SI3054_KCONTROL("Caller ID Switch", SI3054_GPIO_CONTROL, SI3054_GPIO_CID), SI3054_KCONTROL("Caller ID Switch", SI3054_GPIO_CONTROL, SI3054_GPIO_CID),
{} {}
@ -181,7 +181,7 @@ static int si3054_pcm_open(struct hda_pcm_stream *hinfo,
} }
static struct hda_pcm_stream si3054_pcm = { static const struct hda_pcm_stream si3054_pcm = {
.substreams = 1, .substreams = 1,
.channels_min = 1, .channels_min = 1,
.channels_max = 1, .channels_max = 1,
@ -200,12 +200,13 @@ static int si3054_build_pcms(struct hda_codec *codec)
{ {
struct si3054_spec *spec = codec->spec; struct si3054_spec *spec = codec->spec;
struct hda_pcm *info = &spec->pcm; struct hda_pcm *info = &spec->pcm;
si3054_pcm.nid = codec->mfg;
codec->num_pcms = 1; codec->num_pcms = 1;
codec->pcm_info = info; codec->pcm_info = info;
info->name = "Si3054 Modem"; info->name = "Si3054 Modem";
info->stream[SNDRV_PCM_STREAM_PLAYBACK] = si3054_pcm; info->stream[SNDRV_PCM_STREAM_PLAYBACK] = si3054_pcm;
info->stream[SNDRV_PCM_STREAM_CAPTURE] = si3054_pcm; info->stream[SNDRV_PCM_STREAM_CAPTURE] = si3054_pcm;
info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = codec->mfg;
info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = codec->mfg;
info->pcm_type = HDA_PCM_TYPE_MODEM; info->pcm_type = HDA_PCM_TYPE_MODEM;
return 0; return 0;
} }
@ -263,7 +264,7 @@ static void si3054_free(struct hda_codec *codec)
/* /*
*/ */
static struct hda_codec_ops si3054_patch_ops = { static const struct hda_codec_ops si3054_patch_ops = {
.build_controls = si3054_build_controls, .build_controls = si3054_build_controls,
.build_pcms = si3054_build_pcms, .build_pcms = si3054_build_pcms,
.init = si3054_init, .init = si3054_init,
@ -283,7 +284,7 @@ static int patch_si3054(struct hda_codec *codec)
/* /*
* patch entries * patch entries
*/ */
static struct hda_codec_preset snd_hda_preset_si3054[] = { static const struct hda_codec_preset snd_hda_preset_si3054[] = {
{ .id = 0x163c3055, .name = "Si3054", .patch = patch_si3054 }, { .id = 0x163c3055, .name = "Si3054", .patch = patch_si3054 },
{ .id = 0x163c3155, .name = "Si3054", .patch = patch_si3054 }, { .id = 0x163c3155, .name = "Si3054", .patch = patch_si3054 },
{ .id = 0x11c13026, .name = "Si3054", .patch = patch_si3054 }, { .id = 0x11c13026, .name = "Si3054", .patch = patch_si3054 },

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff