forked from Minki/linux
Merge branch 'topic/hda' into for-linus
This commit is contained in:
commit
f686c74cc3
@ -94,7 +94,7 @@ ALC662/663/272
|
||||
3stack-dig 3-stack (2-channel) with SPDIF
|
||||
3stack-6ch 3-stack (6-channel)
|
||||
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
|
||||
eeepc-p701 ASUS Eeepc P701
|
||||
eeepc-ep20 ASUS Eeepc EP20
|
||||
|
@ -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);
|
||||
|
||||
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
|
||||
* @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.
|
||||
*/
|
||||
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;
|
||||
int i, conn_len, conns;
|
||||
@ -417,8 +460,28 @@ int snd_hda_get_connections(struct hda_codec *codec, hda_nid_t nid,
|
||||
}
|
||||
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
|
||||
@ -1019,6 +1082,7 @@ static void snd_hda_codec_free(struct hda_codec *codec)
|
||||
list_del(&codec->list);
|
||||
snd_array_free(&codec->mixers);
|
||||
snd_array_free(&codec->nids);
|
||||
snd_array_free(&codec->conn_lists);
|
||||
codec->bus->caddr_tbl[codec->addr] = NULL;
|
||||
if (codec->patch_ops.free)
|
||||
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->driver_pins, sizeof(struct hda_pincfg), 16);
|
||||
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) {
|
||||
codec->modelname = kstrdup(codec->bus->modelname, GFP_KERNEL);
|
||||
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,
|
||||
int verb, int val)
|
||||
{
|
||||
hda_nid_t *d;
|
||||
const hda_nid_t *d;
|
||||
|
||||
snd_hda_codec_write_cache(codec, nid, 0, verb, val);
|
||||
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.
|
||||
*/
|
||||
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;
|
||||
|
||||
@ -3950,7 +4016,7 @@ int snd_hda_check_amp_list_power(struct hda_codec *codec,
|
||||
struct hda_loopback_check *check,
|
||||
hda_nid_t nid)
|
||||
{
|
||||
struct hda_amp_list *p;
|
||||
const struct hda_amp_list *p;
|
||||
int ch, v;
|
||||
|
||||
if (!check->amplist)
|
||||
@ -4118,7 +4184,7 @@ static void setup_dig_out_stream(struct hda_codec *codec, hda_nid_t nid,
|
||||
-1);
|
||||
snd_hda_codec_setup_stream(codec, nid, stream_tag, 0, format);
|
||||
if (codec->slave_dig_outs) {
|
||||
hda_nid_t *d;
|
||||
const hda_nid_t *d;
|
||||
for (d = codec->slave_dig_outs; *d; d++)
|
||||
snd_hda_codec_setup_stream(codec, *d, stream_tag, 0,
|
||||
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);
|
||||
if (codec->slave_dig_outs) {
|
||||
hda_nid_t *d;
|
||||
const hda_nid_t *d;
|
||||
for (d = codec->slave_dig_outs; *d; 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,
|
||||
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 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,
|
||||
struct hda_multi_out *mout)
|
||||
{
|
||||
hda_nid_t *nids = mout->dac_nids;
|
||||
const hda_nid_t *nids = mout->dac_nids;
|
||||
int 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
|
||||
*/
|
||||
|
||||
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++)
|
||||
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,
|
||||
struct auto_pin_cfg *cfg,
|
||||
hda_nid_t *ignore_nids)
|
||||
const hda_nid_t *ignore_nids)
|
||||
{
|
||||
hda_nid_t nid, end_nid;
|
||||
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
|
||||
*/
|
||||
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_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",
|
||||
cfg->speaker_outs, cfg->speaker_pins[0],
|
||||
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";
|
||||
case SND_JACK_HEADSET:
|
||||
return "Headset";
|
||||
case SND_JACK_VIDEOOUT:
|
||||
return "HDMI/DP";
|
||||
default:
|
||||
return "Misc";
|
||||
}
|
||||
|
@ -825,12 +825,14 @@ struct hda_codec {
|
||||
struct hda_cache_rec amp_cache; /* cache for amp access */
|
||||
struct hda_cache_rec cmd_cache; /* cache for other commands */
|
||||
|
||||
struct snd_array conn_lists; /* connection-list array */
|
||||
|
||||
struct mutex spdif_mutex;
|
||||
struct mutex control_mutex;
|
||||
unsigned int spdif_status; /* IEC958 status bits */
|
||||
unsigned short spdif_ctls; /* SPDIF control bits */
|
||||
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 driver_pins; /* pin configs set by codec parser */
|
||||
struct snd_array cvt_setups; /* audio convert setups */
|
||||
|
@ -126,6 +126,7 @@ MODULE_SUPPORTED_DEVICE("{{Intel, ICH6},"
|
||||
"{Intel, ICH10},"
|
||||
"{Intel, PCH},"
|
||||
"{Intel, CPT},"
|
||||
"{Intel, PPT},"
|
||||
"{Intel, PBG},"
|
||||
"{Intel, SCH},"
|
||||
"{ATI, SB450},"
|
||||
@ -1091,7 +1092,13 @@ static void azx_init_pci(struct azx *chip)
|
||||
? "Failed" : "OK");
|
||||
}
|
||||
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 */
|
||||
for (c = 0; c < max_slots; c++) {
|
||||
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 */
|
||||
switch (chip->driver_type) {
|
||||
case AZX_DRIVER_VIA:
|
||||
case AZX_DRIVER_ATI:
|
||||
/* Use link position directly, avoid any transfer problem. */
|
||||
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;
|
||||
@ -2549,6 +2574,13 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci,
|
||||
gcap &= ~ICH6_GCAP_64OK;
|
||||
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 */
|
||||
@ -2759,6 +2791,8 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
|
||||
{ PCI_DEVICE(0x8086, 0x1c20), .driver_data = AZX_DRIVER_PCH },
|
||||
/* PBG */
|
||||
{ PCI_DEVICE(0x8086, 0x1d20), .driver_data = AZX_DRIVER_PCH },
|
||||
/* Panther Point */
|
||||
{ PCI_DEVICE(0x8086, 0x1e20), .driver_data = AZX_DRIVER_PCH },
|
||||
/* SCH */
|
||||
{ PCI_DEVICE(0x8086, 0x811b), .driver_data = AZX_DRIVER_SCH },
|
||||
/* Generic Intel */
|
||||
|
@ -267,11 +267,11 @@ enum { HDA_DIG_NONE, HDA_DIG_EXCLUSIVE, HDA_DIG_ANALOG_DUP }; /* dig_out_used */
|
||||
|
||||
struct hda_multi_out {
|
||||
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 extra_out_nid[3]; /* optional DACs, 0 when not exists */
|
||||
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 dig_out_used; /* current usage of digital out (HDA_DIG_XXX) */
|
||||
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,
|
||||
const struct snd_pci_quirk *tbl);
|
||||
int snd_hda_add_new_ctls(struct hda_codec *codec,
|
||||
struct snd_kcontrol_new *knew);
|
||||
const struct snd_kcontrol_new *knew);
|
||||
|
||||
/*
|
||||
* unsolicited event handler
|
||||
@ -443,7 +443,7 @@ struct auto_pin_cfg {
|
||||
|
||||
int snd_hda_parse_pin_def_config(struct hda_codec *codec,
|
||||
struct auto_pin_cfg *cfg,
|
||||
hda_nid_t *ignore_nids);
|
||||
const hda_nid_t *ignore_nids);
|
||||
|
||||
/* amp values */
|
||||
#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);
|
||||
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 */
|
||||
#define HDA_NID_ITEM_AMP (1<<0)
|
||||
|
||||
@ -567,7 +573,7 @@ struct hda_amp_list {
|
||||
};
|
||||
|
||||
struct hda_loopback_check {
|
||||
struct hda_amp_list *amplist;
|
||||
const struct hda_amp_list *amplist;
|
||||
int power_on;
|
||||
};
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -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,
|
||||
int chan, int dir)
|
||||
@ -171,7 +171,7 @@ static int ca0110_build_controls(struct hda_codec *codec)
|
||||
{
|
||||
struct ca0110_spec *spec = codec->spec;
|
||||
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"
|
||||
};
|
||||
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,
|
||||
.channels_min = 2,
|
||||
.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,
|
||||
.channels_min = 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,
|
||||
.channels_min = 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,
|
||||
.channels_min = 2,
|
||||
.channels_max = 2,
|
||||
@ -389,7 +389,7 @@ static void ca0110_free(struct hda_codec *codec)
|
||||
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_pcms = ca0110_build_pcms,
|
||||
.init = ca0110_init,
|
||||
@ -539,7 +539,7 @@ static int patch_ca0110(struct hda_codec *codec)
|
||||
/*
|
||||
* 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 = 0x1102000b, .name = "CA0110-IBG", .patch = patch_ca0110 },
|
||||
{ .id = 0x1102000d, .name = "SB0880 X-Fi", .patch = patch_ca0110 },
|
||||
|
@ -51,7 +51,7 @@ struct cs_spec {
|
||||
unsigned int cur_adc_format;
|
||||
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_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,
|
||||
.channels_min = 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,
|
||||
.channels_min = 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,
|
||||
.channels_min = 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,
|
||||
.channels_min = 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 auto_pin_cfg *cfg = &spec->autocfg;
|
||||
hda_nid_t pin = cfg->inputs[idx].pin;
|
||||
unsigned int val = snd_hda_query_pin_caps(codec, pin);
|
||||
if (!(val & AC_PINCAP_PRES_DETECT))
|
||||
unsigned int val;
|
||||
if (!is_jack_detectable(codec, pin))
|
||||
return 0;
|
||||
val = snd_hda_codec_get_pincfg(codec, pin);
|
||||
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];
|
||||
unsigned int type;
|
||||
int j, nums;
|
||||
type = (get_wcaps(codec, nid) & AC_WCAP_TYPE)
|
||||
>> AC_WCAP_TYPE_SHIFT;
|
||||
type = get_wcaps_type(get_wcaps(codec, nid));
|
||||
if (type != AC_WID_AUD_IN)
|
||||
continue;
|
||||
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;
|
||||
int err, index;
|
||||
struct snd_kcontrol *kctl;
|
||||
static char *speakers[] = {
|
||||
static const char * const speakers[] = {
|
||||
"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"
|
||||
};
|
||||
|
||||
@ -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_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);
|
||||
}
|
||||
|
||||
static struct snd_kcontrol_new cs_capture_source = {
|
||||
static const struct snd_kcontrol_new cs_capture_source = {
|
||||
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
||||
.name = "Capture Source",
|
||||
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
|
||||
@ -719,7 +718,7 @@ static struct snd_kcontrol_new cs_capture_source = {
|
||||
.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 cs_spec *spec = codec->spec;
|
||||
@ -847,15 +846,14 @@ static void cs_automute(struct hda_codec *codec)
|
||||
{
|
||||
struct cs_spec *spec = codec->spec;
|
||||
struct auto_pin_cfg *cfg = &spec->autocfg;
|
||||
unsigned int caps, hp_present;
|
||||
unsigned int hp_present;
|
||||
hda_nid_t nid;
|
||||
int i;
|
||||
|
||||
hp_present = 0;
|
||||
for (i = 0; i < cfg->hp_outs; i++) {
|
||||
nid = cfg->hp_pins[i];
|
||||
caps = snd_hda_query_pin_caps(codec, nid);
|
||||
if (!(caps & AC_PINCAP_PRES_DETECT))
|
||||
if (!is_jack_detectable(codec, nid))
|
||||
continue;
|
||||
hp_present = snd_hda_jack_detect(codec, nid);
|
||||
if (hp_present)
|
||||
@ -924,7 +922,7 @@ static void init_output(struct hda_codec *codec)
|
||||
AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP);
|
||||
if (!cfg->speaker_outs)
|
||||
continue;
|
||||
if (get_wcaps(codec, nid) & AC_WCAP_UNSOL_CAP) {
|
||||
if (is_jack_detectable(codec, nid)) {
|
||||
snd_hda_codec_write(codec, nid, 0,
|
||||
AC_VERB_SET_UNSOLICITED_ENABLE,
|
||||
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);
|
||||
}
|
||||
|
||||
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_COEF_INDEX, IDX_DAC_CFG},
|
||||
{0x11, AC_VERB_SET_PROC_COEF,
|
||||
@ -1017,7 +1015,7 @@ static struct hda_verb cs_coef_init_verbs[] = {
|
||||
* 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 */
|
||||
{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_pcms = cs_build_pcms,
|
||||
.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, 0x0d94, "MacBookAir 3,1(2)", CS420X_MBP55),
|
||||
SND_PCI_QUIRK(0x10de, 0xcb79, "MacBookPro 5,5", CS420X_MBP55),
|
||||
@ -1180,7 +1178,7 @@ struct cs_pincfg {
|
||||
u32 val;
|
||||
};
|
||||
|
||||
static struct cs_pincfg mbp53_pincfgs[] = {
|
||||
static const struct cs_pincfg mbp53_pincfgs[] = {
|
||||
{ 0x09, 0x012b4050 },
|
||||
{ 0x0a, 0x90100141 },
|
||||
{ 0x0b, 0x90100140 },
|
||||
@ -1194,7 +1192,7 @@ static struct cs_pincfg mbp53_pincfgs[] = {
|
||||
{} /* terminator */
|
||||
};
|
||||
|
||||
static struct cs_pincfg mbp55_pincfgs[] = {
|
||||
static const struct cs_pincfg mbp55_pincfgs[] = {
|
||||
{ 0x09, 0x012b4030 },
|
||||
{ 0x0a, 0x90100121 },
|
||||
{ 0x0b, 0x90100120 },
|
||||
@ -1208,7 +1206,7 @@ static struct cs_pincfg mbp55_pincfgs[] = {
|
||||
{} /* terminator */
|
||||
};
|
||||
|
||||
static struct cs_pincfg imac27_pincfgs[] = {
|
||||
static const struct cs_pincfg imac27_pincfgs[] = {
|
||||
{ 0x09, 0x012b4050 },
|
||||
{ 0x0a, 0x90100140 },
|
||||
{ 0x0b, 0x90100142 },
|
||||
@ -1222,7 +1220,7 @@ static struct cs_pincfg imac27_pincfgs[] = {
|
||||
{} /* terminator */
|
||||
};
|
||||
|
||||
static struct cs_pincfg *cs_pincfgs[CS420X_MODELS] = {
|
||||
static const struct cs_pincfg *cs_pincfgs[CS420X_MODELS] = {
|
||||
[CS420X_MBP53] = mbp53_pincfgs,
|
||||
[CS420X_MBP55] = mbp55_pincfgs,
|
||||
[CS420X_IMAC27] = imac27_pincfgs,
|
||||
@ -1283,7 +1281,7 @@ static int patch_cs420x(struct hda_codec *codec)
|
||||
/*
|
||||
* 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 = 0x10134207, .name = "CS4207", .patch = patch_cs420x },
|
||||
{} /* terminator */
|
||||
|
@ -53,7 +53,7 @@ struct cmi_spec {
|
||||
int num_dacs;
|
||||
|
||||
/* capture */
|
||||
hda_nid_t *adc_nids;
|
||||
const hda_nid_t *adc_nids;
|
||||
hda_nid_t dig_in_nid;
|
||||
|
||||
/* 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 */
|
||||
static struct hda_verb cmi9880_ch2_init[] = {
|
||||
static const struct hda_verb cmi9880_ch2_init[] = {
|
||||
/* set line-in PIN for input */
|
||||
{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
|
||||
/* set mic PIN for input, also enable vref */
|
||||
@ -121,7 +121,7 @@ static struct hda_verb cmi9880_ch2_init[] = {
|
||||
};
|
||||
|
||||
/* 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 */
|
||||
{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
|
||||
/* set mic PIN for output */
|
||||
@ -132,7 +132,7 @@ static struct hda_verb cmi9880_ch6_init[] = {
|
||||
};
|
||||
|
||||
/* 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 */
|
||||
{ 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
|
||||
/* 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 },
|
||||
{ 6, cmi9880_ch6_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! */
|
||||
HDA_CODEC_MUTE("PCM Playback Switch", 0x03, 0x0, HDA_OUTPUT), /* front */
|
||||
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
|
||||
*/
|
||||
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,
|
||||
.name = "Channel Mode",
|
||||
@ -219,7 +219,7 @@ static struct snd_kcontrol_new cmi9880_ch_mode_mixer[] = {
|
||||
/* AUD-in selections:
|
||||
* 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,
|
||||
.items = {
|
||||
{ "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,
|
||||
.items = {
|
||||
{ "Front Mic", 0x5 },
|
||||
@ -239,11 +239,11 @@ static struct hda_input_mux cmi9880_no_line_mux = {
|
||||
};
|
||||
|
||||
/* 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
|
||||
};
|
||||
/* ADC0, ADC1 */
|
||||
static hda_nid_t cmi9880_adc_nids[2] = {
|
||||
static const hda_nid_t cmi9880_adc_nids[2] = {
|
||||
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) */
|
||||
{ 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
|
||||
/* port-E for HP out (front panel) */
|
||||
@ -281,7 +281,7 @@ static struct hda_verb cmi9880_basic_init[] = {
|
||||
{} /* terminator */
|
||||
};
|
||||
|
||||
static struct hda_verb cmi9880_allout_init[] = {
|
||||
static const struct hda_verb cmi9880_allout_init[] = {
|
||||
/* port-D for line out (rear panel) */
|
||||
{ 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
|
||||
/* 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,
|
||||
.channels_min = 2,
|
||||
.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,
|
||||
.channels_min = 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,
|
||||
.channels_min = 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,
|
||||
.channels_min = 2,
|
||||
.channels_max = 2,
|
||||
@ -617,14 +617,14 @@ static const char * const cmi9880_models[CMI_MODELS] = {
|
||||
[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(0x1854, 0x002b, "LG LS75", CMI_MINIMAL),
|
||||
SND_PCI_QUIRK(0x1854, 0x0032, "LG", CMI_FULL_DIG),
|
||||
{} /* terminator */
|
||||
};
|
||||
|
||||
static struct hda_codec_ops cmi9880_patch_ops = {
|
||||
static const struct hda_codec_ops cmi9880_patch_ops = {
|
||||
.build_controls = cmi9880_build_controls,
|
||||
.build_pcms = cmi9880_build_pcms,
|
||||
.init = cmi9880_init,
|
||||
@ -745,7 +745,7 @@ static int patch_cmi9880(struct hda_codec *codec)
|
||||
/*
|
||||
* 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 = 0x434d4980, .name = "CMI9880", .patch = patch_cmi9880 },
|
||||
{} /* terminator */
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -33,6 +33,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <sound/core.h>
|
||||
#include <sound/jack.h>
|
||||
#include "hda_codec.h"
|
||||
#include "hda_local.h"
|
||||
|
||||
@ -76,7 +77,7 @@ struct hdmi_spec {
|
||||
* ati/nvhdmi specific
|
||||
*/
|
||||
struct hda_multi_out multiout;
|
||||
struct hda_pcm_stream *pcm_playback;
|
||||
const struct hda_pcm_stream *pcm_playback;
|
||||
|
||||
/* misc flags */
|
||||
/* 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]);
|
||||
/* 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)
|
||||
@ -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)
|
||||
{
|
||||
struct hdmi_spec *spec = codec->spec;
|
||||
int err;
|
||||
|
||||
if (spec->num_pins >= MAX_HDMI_PINS) {
|
||||
snd_printk(KERN_WARNING
|
||||
@ -919,6 +923,12 @@ static int hdmi_add_pin(struct hda_codec *codec, hda_nid_t pin_nid)
|
||||
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]);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
static struct hda_pcm_stream generic_hdmi_pcm_playback = {
|
||||
static const struct hda_pcm_stream generic_hdmi_pcm_playback = {
|
||||
.substreams = 1,
|
||||
.channels_min = 2,
|
||||
.ops = {
|
||||
@ -1120,11 +1130,12 @@ static void generic_hdmi_free(struct hda_codec *codec)
|
||||
|
||||
for (i = 0; i < spec->num_pins; i++)
|
||||
snd_hda_eld_proc_free(codec, &spec->sink_eld[i]);
|
||||
snd_hda_input_jack_free(codec);
|
||||
|
||||
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,
|
||||
.free = generic_hdmi_free,
|
||||
.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_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 */
|
||||
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 */
|
||||
{ 0x1, Nv_VERB_SET_Audio_Protection_On, 0x1},
|
||||
/* enable digital output on pin widget */
|
||||
@ -1435,7 +1446,7 @@ static int nvhdmi_8ch_7x_pcm_prepare(struct hda_pcm_stream *hinfo,
|
||||
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,
|
||||
.channels_min = 2,
|
||||
.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,
|
||||
.channels_min = 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_pcms = generic_hdmi_build_pcms,
|
||||
.init = nvhdmi_7x_init,
|
||||
.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_pcms = generic_hdmi_build_pcms,
|
||||
.init = nvhdmi_7x_init,
|
||||
@ -1568,7 +1579,7 @@ static int atihdmi_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct hda_pcm_stream atihdmi_pcm_digital_playback = {
|
||||
static const struct hda_pcm_stream atihdmi_pcm_digital_playback = {
|
||||
.substreams = 1,
|
||||
.channels_min = 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 */
|
||||
{ 0x03, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
|
||||
{} /* terminator */
|
||||
@ -1599,7 +1610,7 @@ static int atihdmi_init(struct hda_codec *codec)
|
||||
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_pcms = generic_hdmi_build_pcms,
|
||||
.init = atihdmi_init,
|
||||
@ -1634,7 +1645,7 @@ static int patch_atihdmi(struct hda_codec *codec)
|
||||
/*
|
||||
* 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 = 0x10027919, .name = "RS600 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 = 0x80862804, .name = "IbexPeak 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 },
|
||||
{} /* 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:80862804");
|
||||
MODULE_ALIAS("snd-hda-codec-id:80862805");
|
||||
MODULE_ALIAS("snd-hda-codec-id:80862806");
|
||||
MODULE_ALIAS("snd-hda-codec-id:808629fb");
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -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("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,
|
||||
.channels_min = 1,
|
||||
.channels_max = 1,
|
||||
@ -200,12 +200,13 @@ static int si3054_build_pcms(struct hda_codec *codec)
|
||||
{
|
||||
struct si3054_spec *spec = codec->spec;
|
||||
struct hda_pcm *info = &spec->pcm;
|
||||
si3054_pcm.nid = codec->mfg;
|
||||
codec->num_pcms = 1;
|
||||
codec->pcm_info = info;
|
||||
info->name = "Si3054 Modem";
|
||||
info->stream[SNDRV_PCM_STREAM_PLAYBACK] = 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;
|
||||
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_pcms = si3054_build_pcms,
|
||||
.init = si3054_init,
|
||||
@ -283,7 +284,7 @@ static int patch_si3054(struct hda_codec *codec)
|
||||
/*
|
||||
* 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 = 0x163c3155, .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
Loading…
Reference in New Issue
Block a user