diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-12 13:00:06 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-12 13:00:06 -0400 |
| commit | 14a4fa20a10d76eb98b7feb25be60735217929ba (patch) | |
| tree | 56e8201d1646540f8726330d82b03748debe2dfa | |
| parent | 16bb85bc12e7d0b066b1471185f3889cb1ceb382 (diff) | |
| parent | c6774bcd33b21d57457d4c604388670efdf03258 (diff) | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6:
ASoC: add AD1980 obsolete information
ASoC: register cache should be 1 byte aligned for 1 byte long register
ALSA: hda - Adding support for new IDT 92HD87XX codecs
ASoC: Fix inverted mute controls for WM8580
ALSA: HDA: Use model=auto for LG R510
ALSA: hda - Update model entries in HD-Audio-Models.txt
ALSA: hda: document VIA models
ALSA: hda - patch_nvhdmi.c: Add missing codec IDs, unify names
ALSA: hda - add support for Conexant CX20584
ALSA: hda - New snd-hda-intel model/pin config for hp dv7-4000
ALSA: hda - Fix missing stream for second ADC on Realtek ALC260 HDA codec
ALSA: hda - Make converter setups sticky
ALSA: hda - Add support for Acer ZGA ALC271 (1025:047c)
sound/oss: Adjust confusing if indentation
sound: oss: au1550_ac97.c removed duplicated #include
ASoC: Fix for changed Eureka Kconfig symbol names
| -rw-r--r-- | Documentation/sound/alsa/HD-Audio-Models.txt | 13 | ||||
| -rw-r--r-- | sound/oss/ad1848.c | 2 | ||||
| -rw-r--r-- | sound/oss/au1550_ac97.c | 1 | ||||
| -rw-r--r-- | sound/pci/hda/hda_codec.c | 150 | ||||
| -rw-r--r-- | sound/pci/hda/hda_codec.h | 12 | ||||
| -rw-r--r-- | sound/pci/hda/hda_intel.c | 6 | ||||
| -rw-r--r-- | sound/pci/hda/patch_conexant.c | 3 | ||||
| -rw-r--r-- | sound/pci/hda/patch_nvhdmi.c | 61 | ||||
| -rw-r--r-- | sound/pci/hda/patch_realtek.c | 41 | ||||
| -rw-r--r-- | sound/pci/hda/patch_sigmatel.c | 13 | ||||
| -rw-r--r-- | sound/soc/blackfin/Kconfig | 7 | ||||
| -rw-r--r-- | sound/soc/blackfin/bf5xx-ad1980.c | 10 | ||||
| -rw-r--r-- | sound/soc/codecs/ad1980.c | 10 | ||||
| -rw-r--r-- | sound/soc/codecs/ad1980.h | 6 | ||||
| -rw-r--r-- | sound/soc/codecs/wm8580.c | 6 | ||||
| -rw-r--r-- | sound/soc/imx/Kconfig | 4 | ||||
| -rw-r--r-- | sound/soc/soc-cache.c | 4 |
17 files changed, 304 insertions, 45 deletions
diff --git a/Documentation/sound/alsa/HD-Audio-Models.txt b/Documentation/sound/alsa/HD-Audio-Models.txt index 03771d7c5dd7..ce46fa1e643e 100644 --- a/Documentation/sound/alsa/HD-Audio-Models.txt +++ b/Documentation/sound/alsa/HD-Audio-Models.txt | |||
| @@ -83,8 +83,8 @@ ALC269 | |||
| 83 | ====== | 83 | ====== |
| 84 | basic Basic preset | 84 | basic Basic preset |
| 85 | quanta Quanta FL1 | 85 | quanta Quanta FL1 |
| 86 | eeepc-p703 ASUS Eeepc P703 P900A | 86 | laptop-amic Laptops with analog-mic input |
| 87 | eeepc-p901 ASUS Eeepc P901 S101 | 87 | laptop-dmic Laptops with digital-mic input |
| 88 | fujitsu FSC Amilo | 88 | fujitsu FSC Amilo |
| 89 | lifebook Fujitsu Lifebook S6420 | 89 | lifebook Fujitsu Lifebook S6420 |
| 90 | auto auto-config reading BIOS (default) | 90 | auto auto-config reading BIOS (default) |
| @@ -109,6 +109,8 @@ ALC662/663/272 | |||
| 109 | asus-mode4 ASUS | 109 | asus-mode4 ASUS |
| 110 | asus-mode5 ASUS | 110 | asus-mode5 ASUS |
| 111 | asus-mode6 ASUS | 111 | asus-mode6 ASUS |
| 112 | asus-mode7 ASUS | ||
| 113 | asus-mode8 ASUS | ||
| 112 | dell Dell with ALC272 | 114 | dell Dell with ALC272 |
| 113 | dell-zm1 Dell ZM1 with ALC272 | 115 | dell-zm1 Dell ZM1 with ALC272 |
| 114 | samsung-nc10 Samsung NC10 mini notebook | 116 | samsung-nc10 Samsung NC10 mini notebook |
| @@ -295,8 +297,10 @@ Conexant 5066 | |||
| 295 | ============= | 297 | ============= |
| 296 | laptop Basic Laptop config (default) | 298 | laptop Basic Laptop config (default) |
| 297 | dell-laptop Dell laptops | 299 | dell-laptop Dell laptops |
| 300 | dell-vostro Dell Vostro | ||
| 298 | olpc-xo-1_5 OLPC XO 1.5 | 301 | olpc-xo-1_5 OLPC XO 1.5 |
| 299 | ideapad Lenovo IdeaPad U150 | 302 | ideapad Lenovo IdeaPad U150 |
| 303 | thinkpad Lenovo Thinkpad | ||
| 300 | 304 | ||
| 301 | STAC9200 | 305 | STAC9200 |
| 302 | ======== | 306 | ======== |
| @@ -404,6 +408,7 @@ STAC92HD83* | |||
| 404 | mic-ref Reference board with power management for ports | 408 | mic-ref Reference board with power management for ports |
| 405 | dell-s14 Dell laptop | 409 | dell-s14 Dell laptop |
| 406 | hp HP laptops with (inverted) mute-LED | 410 | hp HP laptops with (inverted) mute-LED |
| 411 | hp-dv7-4000 HP dv-7 4000 | ||
| 407 | auto BIOS setup (default) | 412 | auto BIOS setup (default) |
| 408 | 413 | ||
| 409 | STAC9872 | 414 | STAC9872 |
| @@ -416,3 +421,7 @@ Cirrus Logic CS4206/4207 | |||
| 416 | mbp55 MacBook Pro 5,5 | 421 | mbp55 MacBook Pro 5,5 |
| 417 | imac27 IMac 27 Inch | 422 | imac27 IMac 27 Inch |
| 418 | auto BIOS setup (default) | 423 | auto BIOS setup (default) |
| 424 | |||
| 425 | VIA VT17xx/VT18xx/VT20xx | ||
| 426 | ======================== | ||
| 427 | auto BIOS setup (default) | ||
diff --git a/sound/oss/ad1848.c b/sound/oss/ad1848.c index 24793c5b65ac..4d2a6ae978f7 100644 --- a/sound/oss/ad1848.c +++ b/sound/oss/ad1848.c | |||
| @@ -716,7 +716,7 @@ static int ad1848_mixer_ioctl(int dev, unsigned int cmd, void __user *arg) | |||
| 716 | 716 | ||
| 717 | default: | 717 | default: |
| 718 | if (get_user(val, (int __user *)arg)) | 718 | if (get_user(val, (int __user *)arg)) |
| 719 | return -EFAULT; | 719 | return -EFAULT; |
| 720 | val = ad1848_mixer_set(devc, cmd & 0xff, val); | 720 | val = ad1848_mixer_set(devc, cmd & 0xff, val); |
| 721 | break; | 721 | break; |
| 722 | } | 722 | } |
diff --git a/sound/oss/au1550_ac97.c b/sound/oss/au1550_ac97.c index c4a4cdc07ab9..c6f2621221ba 100644 --- a/sound/oss/au1550_ac97.c +++ b/sound/oss/au1550_ac97.c | |||
| @@ -50,7 +50,6 @@ | |||
| 50 | #include <linux/poll.h> | 50 | #include <linux/poll.h> |
| 51 | #include <linux/bitops.h> | 51 | #include <linux/bitops.h> |
| 52 | #include <linux/spinlock.h> | 52 | #include <linux/spinlock.h> |
| 53 | #include <linux/smp_lock.h> | ||
| 54 | #include <linux/ac97_codec.h> | 53 | #include <linux/ac97_codec.h> |
| 55 | #include <linux/mutex.h> | 54 | #include <linux/mutex.h> |
| 56 | 55 | ||
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index a7802b99436c..720a81d711e3 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
| @@ -971,6 +971,36 @@ static void restore_init_pincfgs(struct hda_codec *codec) | |||
| 971 | } | 971 | } |
| 972 | 972 | ||
| 973 | /* | 973 | /* |
| 974 | * audio-converter setup caches | ||
| 975 | */ | ||
| 976 | struct hda_cvt_setup { | ||
| 977 | hda_nid_t nid; | ||
| 978 | u8 stream_tag; | ||
| 979 | u8 channel_id; | ||
| 980 | u16 format_id; | ||
| 981 | unsigned char active; /* cvt is currently used */ | ||
| 982 | unsigned char dirty; /* setups should be cleared */ | ||
| 983 | }; | ||
| 984 | |||
| 985 | /* get or create a cache entry for the given audio converter NID */ | ||
| 986 | static struct hda_cvt_setup * | ||
| 987 | get_hda_cvt_setup(struct hda_codec *codec, hda_nid_t nid) | ||
| 988 | { | ||
| 989 | struct hda_cvt_setup *p; | ||
| 990 | int i; | ||
| 991 | |||
| 992 | for (i = 0; i < codec->cvt_setups.used; i++) { | ||
| 993 | p = snd_array_elem(&codec->cvt_setups, i); | ||
| 994 | if (p->nid == nid) | ||
| 995 | return p; | ||
| 996 | } | ||
| 997 | p = snd_array_new(&codec->cvt_setups); | ||
| 998 | if (p) | ||
| 999 | p->nid = nid; | ||
| 1000 | return p; | ||
| 1001 | } | ||
| 1002 | |||
| 1003 | /* | ||
| 974 | * codec destructor | 1004 | * codec destructor |
| 975 | */ | 1005 | */ |
| 976 | static void snd_hda_codec_free(struct hda_codec *codec) | 1006 | static void snd_hda_codec_free(struct hda_codec *codec) |
| @@ -1038,12 +1068,14 @@ int /*__devinit*/ snd_hda_codec_new(struct hda_bus *bus, | |||
| 1038 | codec->addr = codec_addr; | 1068 | codec->addr = codec_addr; |
| 1039 | mutex_init(&codec->spdif_mutex); | 1069 | mutex_init(&codec->spdif_mutex); |
| 1040 | mutex_init(&codec->control_mutex); | 1070 | mutex_init(&codec->control_mutex); |
| 1071 | mutex_init(&codec->prepare_mutex); | ||
| 1041 | init_hda_cache(&codec->amp_cache, sizeof(struct hda_amp_info)); | 1072 | init_hda_cache(&codec->amp_cache, sizeof(struct hda_amp_info)); |
| 1042 | init_hda_cache(&codec->cmd_cache, sizeof(struct hda_cache_head)); | 1073 | init_hda_cache(&codec->cmd_cache, sizeof(struct hda_cache_head)); |
| 1043 | snd_array_init(&codec->mixers, sizeof(struct hda_nid_item), 32); | 1074 | snd_array_init(&codec->mixers, sizeof(struct hda_nid_item), 32); |
| 1044 | snd_array_init(&codec->nids, sizeof(struct hda_nid_item), 32); | 1075 | snd_array_init(&codec->nids, sizeof(struct hda_nid_item), 32); |
| 1045 | snd_array_init(&codec->init_pins, sizeof(struct hda_pincfg), 16); | 1076 | snd_array_init(&codec->init_pins, sizeof(struct hda_pincfg), 16); |
| 1046 | snd_array_init(&codec->driver_pins, sizeof(struct hda_pincfg), 16); | 1077 | snd_array_init(&codec->driver_pins, sizeof(struct hda_pincfg), 16); |
| 1078 | snd_array_init(&codec->cvt_setups, sizeof(struct hda_cvt_setup), 8); | ||
| 1047 | if (codec->bus->modelname) { | 1079 | if (codec->bus->modelname) { |
| 1048 | codec->modelname = kstrdup(codec->bus->modelname, GFP_KERNEL); | 1080 | codec->modelname = kstrdup(codec->bus->modelname, GFP_KERNEL); |
| 1049 | if (!codec->modelname) { | 1081 | if (!codec->modelname) { |
| @@ -1181,16 +1213,51 @@ void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid, | |||
| 1181 | u32 stream_tag, | 1213 | u32 stream_tag, |
| 1182 | int channel_id, int format) | 1214 | int channel_id, int format) |
| 1183 | { | 1215 | { |
| 1216 | struct hda_cvt_setup *p; | ||
| 1217 | unsigned int oldval, newval; | ||
| 1218 | int i; | ||
| 1219 | |||
| 1184 | if (!nid) | 1220 | if (!nid) |
| 1185 | return; | 1221 | return; |
| 1186 | 1222 | ||
| 1187 | snd_printdd("hda_codec_setup_stream: " | 1223 | snd_printdd("hda_codec_setup_stream: " |
| 1188 | "NID=0x%x, stream=0x%x, channel=%d, format=0x%x\n", | 1224 | "NID=0x%x, stream=0x%x, channel=%d, format=0x%x\n", |
| 1189 | nid, stream_tag, channel_id, format); | 1225 | nid, stream_tag, channel_id, format); |
| 1190 | snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CHANNEL_STREAMID, | 1226 | p = get_hda_cvt_setup(codec, nid); |
| 1191 | (stream_tag << 4) | channel_id); | 1227 | if (!p) |
| 1192 | msleep(1); | 1228 | return; |
| 1193 | snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_STREAM_FORMAT, format); | 1229 | /* update the stream-id if changed */ |
| 1230 | if (p->stream_tag != stream_tag || p->channel_id != channel_id) { | ||
| 1231 | oldval = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONV, 0); | ||
| 1232 | newval = (stream_tag << 4) | channel_id; | ||
| 1233 | if (oldval != newval) | ||
| 1234 | snd_hda_codec_write(codec, nid, 0, | ||
| 1235 | AC_VERB_SET_CHANNEL_STREAMID, | ||
| 1236 | newval); | ||
| 1237 | p->stream_tag = stream_tag; | ||
| 1238 | p->channel_id = channel_id; | ||
| 1239 | } | ||
| 1240 | /* update the format-id if changed */ | ||
| 1241 | if (p->format_id != format) { | ||
| 1242 | oldval = snd_hda_codec_read(codec, nid, 0, | ||
| 1243 | AC_VERB_GET_STREAM_FORMAT, 0); | ||
| 1244 | if (oldval != format) { | ||
| 1245 | msleep(1); | ||
| 1246 | snd_hda_codec_write(codec, nid, 0, | ||
| 1247 | AC_VERB_SET_STREAM_FORMAT, | ||
| 1248 | format); | ||
| 1249 | } | ||
| 1250 | p->format_id = format; | ||
| 1251 | } | ||
| 1252 | p->active = 1; | ||
| 1253 | p->dirty = 0; | ||
| 1254 | |||
| 1255 | /* make other inactive cvts with the same stream-tag dirty */ | ||
| 1256 | for (i = 0; i < codec->cvt_setups.used; i++) { | ||
| 1257 | p = snd_array_elem(&codec->cvt_setups, i); | ||
| 1258 | if (!p->active && p->stream_tag == stream_tag) | ||
| 1259 | p->dirty = 1; | ||
| 1260 | } | ||
| 1194 | } | 1261 | } |
| 1195 | EXPORT_SYMBOL_HDA(snd_hda_codec_setup_stream); | 1262 | EXPORT_SYMBOL_HDA(snd_hda_codec_setup_stream); |
| 1196 | 1263 | ||
| @@ -1201,17 +1268,54 @@ EXPORT_SYMBOL_HDA(snd_hda_codec_setup_stream); | |||
| 1201 | */ | 1268 | */ |
| 1202 | void snd_hda_codec_cleanup_stream(struct hda_codec *codec, hda_nid_t nid) | 1269 | void snd_hda_codec_cleanup_stream(struct hda_codec *codec, hda_nid_t nid) |
| 1203 | { | 1270 | { |
| 1271 | struct hda_cvt_setup *p; | ||
| 1272 | |||
| 1204 | if (!nid) | 1273 | if (!nid) |
| 1205 | return; | 1274 | return; |
| 1206 | 1275 | ||
| 1207 | snd_printdd("hda_codec_cleanup_stream: NID=0x%x\n", nid); | 1276 | snd_printdd("hda_codec_cleanup_stream: NID=0x%x\n", nid); |
| 1277 | /* here we just clear the active flag; actual clean-ups will be done | ||
| 1278 | * in purify_inactive_streams() | ||
| 1279 | */ | ||
| 1280 | p = get_hda_cvt_setup(codec, nid); | ||
| 1281 | if (p) | ||
| 1282 | p->active = 0; | ||
| 1283 | } | ||
| 1284 | EXPORT_SYMBOL_HDA(snd_hda_codec_cleanup_stream); | ||
| 1285 | |||
| 1286 | static void really_cleanup_stream(struct hda_codec *codec, | ||
| 1287 | struct hda_cvt_setup *q) | ||
| 1288 | { | ||
| 1289 | hda_nid_t nid = q->nid; | ||
| 1208 | snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CHANNEL_STREAMID, 0); | 1290 | snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CHANNEL_STREAMID, 0); |
| 1209 | #if 0 /* keep the format */ | ||
| 1210 | msleep(1); | ||
| 1211 | snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_STREAM_FORMAT, 0); | 1291 | snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_STREAM_FORMAT, 0); |
| 1212 | #endif | 1292 | memset(q, 0, sizeof(*q)); |
| 1293 | q->nid = nid; | ||
| 1294 | } | ||
| 1295 | |||
| 1296 | /* clean up the all conflicting obsolete streams */ | ||
| 1297 | static void purify_inactive_streams(struct hda_codec *codec) | ||
| 1298 | { | ||
| 1299 | int i; | ||
| 1300 | |||
| 1301 | for (i = 0; i < codec->cvt_setups.used; i++) { | ||
| 1302 | struct hda_cvt_setup *p = snd_array_elem(&codec->cvt_setups, i); | ||
| 1303 | if (p->dirty) | ||
| 1304 | really_cleanup_stream(codec, p); | ||
| 1305 | } | ||
| 1306 | } | ||
| 1307 | |||
| 1308 | /* clean up all streams; called from suspend */ | ||
| 1309 | static void hda_cleanup_all_streams(struct hda_codec *codec) | ||
| 1310 | { | ||
| 1311 | int i; | ||
| 1312 | |||
| 1313 | for (i = 0; i < codec->cvt_setups.used; i++) { | ||
| 1314 | struct hda_cvt_setup *p = snd_array_elem(&codec->cvt_setups, i); | ||
| 1315 | if (p->stream_tag) | ||
| 1316 | really_cleanup_stream(codec, p); | ||
| 1317 | } | ||
| 1213 | } | 1318 | } |
| 1214 | EXPORT_SYMBOL_HDA(snd_hda_codec_cleanup_stream); | ||
| 1215 | 1319 | ||
| 1216 | /* | 1320 | /* |
| 1217 | * amp access functions | 1321 | * amp access functions |
| @@ -2928,6 +3032,7 @@ static void hda_call_codec_suspend(struct hda_codec *codec) | |||
| 2928 | { | 3032 | { |
| 2929 | if (codec->patch_ops.suspend) | 3033 | if (codec->patch_ops.suspend) |
| 2930 | codec->patch_ops.suspend(codec, PMSG_SUSPEND); | 3034 | codec->patch_ops.suspend(codec, PMSG_SUSPEND); |
| 3035 | hda_cleanup_all_streams(codec); | ||
| 2931 | hda_set_power_state(codec, | 3036 | hda_set_power_state(codec, |
| 2932 | codec->afg ? codec->afg : codec->mfg, | 3037 | codec->afg ? codec->afg : codec->mfg, |
| 2933 | AC_PWRST_D3); | 3038 | AC_PWRST_D3); |
| @@ -3377,6 +3482,35 @@ static int set_pcm_default_values(struct hda_codec *codec, | |||
| 3377 | return 0; | 3482 | return 0; |
| 3378 | } | 3483 | } |
| 3379 | 3484 | ||
| 3485 | /* | ||
| 3486 | * codec prepare/cleanup entries | ||
| 3487 | */ | ||
| 3488 | int snd_hda_codec_prepare(struct hda_codec *codec, | ||
| 3489 | struct hda_pcm_stream *hinfo, | ||
| 3490 | unsigned int stream, | ||
| 3491 | unsigned int format, | ||
| 3492 | struct snd_pcm_substream *substream) | ||
| 3493 | { | ||
| 3494 | int ret; | ||
| 3495 | mutex_lock(&codec->prepare_mutex); | ||
| 3496 | ret = hinfo->ops.prepare(hinfo, codec, stream, format, substream); | ||
| 3497 | if (ret >= 0) | ||
| 3498 | purify_inactive_streams(codec); | ||
| 3499 | mutex_unlock(&codec->prepare_mutex); | ||
| 3500 | return ret; | ||
| 3501 | } | ||
| 3502 | EXPORT_SYMBOL_HDA(snd_hda_codec_prepare); | ||
| 3503 | |||
| 3504 | void snd_hda_codec_cleanup(struct hda_codec *codec, | ||
| 3505 | struct hda_pcm_stream *hinfo, | ||
| 3506 | struct snd_pcm_substream *substream) | ||
| 3507 | { | ||
| 3508 | mutex_lock(&codec->prepare_mutex); | ||
| 3509 | hinfo->ops.cleanup(hinfo, codec, substream); | ||
| 3510 | mutex_unlock(&codec->prepare_mutex); | ||
| 3511 | } | ||
| 3512 | EXPORT_SYMBOL_HDA(snd_hda_codec_cleanup); | ||
| 3513 | |||
| 3380 | /* global */ | 3514 | /* global */ |
| 3381 | const char *snd_hda_pcm_type_name[HDA_PCM_NTYPES] = { | 3515 | const char *snd_hda_pcm_type_name[HDA_PCM_NTYPES] = { |
| 3382 | "Audio", "SPDIF", "HDMI", "Modem" | 3516 | "Audio", "SPDIF", "HDMI", "Modem" |
diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h index 0328cf55cdba..3f7a479881e5 100644 --- a/sound/pci/hda/hda_codec.h +++ b/sound/pci/hda/hda_codec.h | |||
| @@ -826,12 +826,14 @@ struct hda_codec { | |||
| 826 | 826 | ||
| 827 | struct mutex spdif_mutex; | 827 | struct mutex spdif_mutex; |
| 828 | struct mutex control_mutex; | 828 | struct mutex control_mutex; |
| 829 | struct mutex prepare_mutex; | ||
| 829 | unsigned int spdif_status; /* IEC958 status bits */ | 830 | unsigned int spdif_status; /* IEC958 status bits */ |
| 830 | unsigned short spdif_ctls; /* SPDIF control bits */ | 831 | unsigned short spdif_ctls; /* SPDIF control bits */ |
| 831 | unsigned int spdif_in_enable; /* SPDIF input enable? */ | 832 | unsigned int spdif_in_enable; /* SPDIF input enable? */ |
| 832 | hda_nid_t *slave_dig_outs; /* optional digital out slave widgets */ | 833 | hda_nid_t *slave_dig_outs; /* optional digital out slave widgets */ |
| 833 | struct snd_array init_pins; /* initial (BIOS) pin configurations */ | 834 | struct snd_array init_pins; /* initial (BIOS) pin configurations */ |
| 834 | struct snd_array driver_pins; /* pin configs set by codec parser */ | 835 | struct snd_array driver_pins; /* pin configs set by codec parser */ |
| 836 | struct snd_array cvt_setups; /* audio convert setups */ | ||
| 835 | 837 | ||
| 836 | #ifdef CONFIG_SND_HDA_HWDEP | 838 | #ifdef CONFIG_SND_HDA_HWDEP |
| 837 | struct snd_hwdep *hwdep; /* assigned hwdep device */ | 839 | struct snd_hwdep *hwdep; /* assigned hwdep device */ |
| @@ -948,6 +950,16 @@ int snd_hda_codec_build_controls(struct hda_codec *codec); | |||
| 948 | */ | 950 | */ |
| 949 | int snd_hda_build_pcms(struct hda_bus *bus); | 951 | int snd_hda_build_pcms(struct hda_bus *bus); |
| 950 | int snd_hda_codec_build_pcms(struct hda_codec *codec); | 952 | int snd_hda_codec_build_pcms(struct hda_codec *codec); |
| 953 | |||
| 954 | int snd_hda_codec_prepare(struct hda_codec *codec, | ||
| 955 | struct hda_pcm_stream *hinfo, | ||
| 956 | unsigned int stream, | ||
| 957 | unsigned int format, | ||
| 958 | struct snd_pcm_substream *substream); | ||
| 959 | void snd_hda_codec_cleanup(struct hda_codec *codec, | ||
| 960 | struct hda_pcm_stream *hinfo, | ||
| 961 | struct snd_pcm_substream *substream); | ||
| 962 | |||
| 951 | void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid, | 963 | void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid, |
| 952 | u32 stream_tag, | 964 | u32 stream_tag, |
| 953 | int channel_id, int format); | 965 | int channel_id, int format); |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 66d420212d9a..1053fff4bd0a 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
| @@ -1634,7 +1634,7 @@ static int azx_pcm_hw_free(struct snd_pcm_substream *substream) | |||
| 1634 | azx_dev->period_bytes = 0; | 1634 | azx_dev->period_bytes = 0; |
| 1635 | azx_dev->format_val = 0; | 1635 | azx_dev->format_val = 0; |
| 1636 | 1636 | ||
| 1637 | hinfo->ops.cleanup(hinfo, apcm->codec, substream); | 1637 | snd_hda_codec_cleanup(apcm->codec, hinfo, substream); |
| 1638 | 1638 | ||
| 1639 | return snd_pcm_lib_free_pages(substream); | 1639 | return snd_pcm_lib_free_pages(substream); |
| 1640 | } | 1640 | } |
| @@ -1688,8 +1688,8 @@ static int azx_pcm_prepare(struct snd_pcm_substream *substream) | |||
| 1688 | else | 1688 | else |
| 1689 | azx_dev->fifo_size = 0; | 1689 | azx_dev->fifo_size = 0; |
| 1690 | 1690 | ||
| 1691 | return hinfo->ops.prepare(hinfo, apcm->codec, azx_dev->stream_tag, | 1691 | return snd_hda_codec_prepare(apcm->codec, hinfo, azx_dev->stream_tag, |
| 1692 | azx_dev->format_val, substream); | 1692 | azx_dev->format_val, substream); |
| 1693 | } | 1693 | } |
| 1694 | 1694 | ||
| 1695 | static int azx_pcm_trigger(struct snd_pcm_substream *substream, int cmd) | 1695 | static int azx_pcm_trigger(struct snd_pcm_substream *substream, int cmd) |
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c index df8b19b17308..f7e234e5ee96 100644 --- a/sound/pci/hda/patch_conexant.c +++ b/sound/pci/hda/patch_conexant.c | |||
| @@ -3206,6 +3206,8 @@ static struct hda_codec_preset snd_hda_preset_conexant[] = { | |||
| 3206 | .patch = patch_cxt5066 }, | 3206 | .patch = patch_cxt5066 }, |
| 3207 | { .id = 0x14f15067, .name = "CX20583 (Pebble HSF)", | 3207 | { .id = 0x14f15067, .name = "CX20583 (Pebble HSF)", |
| 3208 | .patch = patch_cxt5066 }, | 3208 | .patch = patch_cxt5066 }, |
| 3209 | { .id = 0x14f15068, .name = "CX20584", | ||
| 3210 | .patch = patch_cxt5066 }, | ||
| 3209 | { .id = 0x14f15069, .name = "CX20585", | 3211 | { .id = 0x14f15069, .name = "CX20585", |
| 3210 | .patch = patch_cxt5066 }, | 3212 | .patch = patch_cxt5066 }, |
| 3211 | {} /* terminator */ | 3213 | {} /* terminator */ |
| @@ -3216,6 +3218,7 @@ MODULE_ALIAS("snd-hda-codec-id:14f15047"); | |||
| 3216 | MODULE_ALIAS("snd-hda-codec-id:14f15051"); | 3218 | MODULE_ALIAS("snd-hda-codec-id:14f15051"); |
| 3217 | MODULE_ALIAS("snd-hda-codec-id:14f15066"); | 3219 | MODULE_ALIAS("snd-hda-codec-id:14f15066"); |
| 3218 | MODULE_ALIAS("snd-hda-codec-id:14f15067"); | 3220 | MODULE_ALIAS("snd-hda-codec-id:14f15067"); |
| 3221 | MODULE_ALIAS("snd-hda-codec-id:14f15068"); | ||
| 3219 | MODULE_ALIAS("snd-hda-codec-id:14f15069"); | 3222 | MODULE_ALIAS("snd-hda-codec-id:14f15069"); |
| 3220 | 3223 | ||
| 3221 | MODULE_LICENSE("GPL"); | 3224 | MODULE_LICENSE("GPL"); |
diff --git a/sound/pci/hda/patch_nvhdmi.c b/sound/pci/hda/patch_nvhdmi.c index a281836fd472..77e2b4028b9f 100644 --- a/sound/pci/hda/patch_nvhdmi.c +++ b/sound/pci/hda/patch_nvhdmi.c | |||
| @@ -540,26 +540,32 @@ static int patch_nvhdmi_2ch(struct hda_codec *codec) | |||
| 540 | * patch entries | 540 | * patch entries |
| 541 | */ | 541 | */ |
| 542 | static struct hda_codec_preset snd_hda_preset_nvhdmi[] = { | 542 | static struct hda_codec_preset snd_hda_preset_nvhdmi[] = { |
| 543 | { .id = 0x10de0002, .name = "MCP77/78 HDMI", | 543 | { .id = 0x10de0002, .name = "MCP77/78 HDMI", .patch = patch_nvhdmi_8ch_7x }, |
| 544 | .patch = patch_nvhdmi_8ch_7x }, | 544 | { .id = 0x10de0003, .name = "MCP77/78 HDMI", .patch = patch_nvhdmi_8ch_7x }, |
| 545 | { .id = 0x10de0003, .name = "MCP77/78 HDMI", | 545 | { .id = 0x10de0005, .name = "MCP77/78 HDMI", .patch = patch_nvhdmi_8ch_7x }, |
| 546 | .patch = patch_nvhdmi_8ch_7x }, | 546 | { .id = 0x10de0006, .name = "MCP77/78 HDMI", .patch = patch_nvhdmi_8ch_7x }, |
| 547 | { .id = 0x10de0005, .name = "MCP77/78 HDMI", | 547 | { .id = 0x10de0007, .name = "MCP79/7A HDMI", .patch = patch_nvhdmi_8ch_7x }, |
| 548 | .patch = patch_nvhdmi_8ch_7x }, | 548 | { .id = 0x10de000a, .name = "GPU 0a HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
| 549 | { .id = 0x10de0006, .name = "MCP77/78 HDMI", | 549 | { .id = 0x10de000b, .name = "GPU 0b HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
| 550 | .patch = patch_nvhdmi_8ch_7x }, | 550 | { .id = 0x10de000c, .name = "MCP89 HDMI", .patch = patch_nvhdmi_8ch_89 }, |
| 551 | { .id = 0x10de0007, .name = "MCP79/7A HDMI", | 551 | { .id = 0x10de000d, .name = "GPU 0d HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
| 552 | .patch = patch_nvhdmi_8ch_7x }, | 552 | { .id = 0x10de0010, .name = "GPU 10 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
| 553 | { .id = 0x10de000a, .name = "GT220 HDMI", | 553 | { .id = 0x10de0011, .name = "GPU 11 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
| 554 | .patch = patch_nvhdmi_8ch_89 }, | 554 | { .id = 0x10de0012, .name = "GPU 12 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
| 555 | { .id = 0x10de000b, .name = "GT21x HDMI", | 555 | { .id = 0x10de0013, .name = "GPU 13 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
| 556 | .patch = patch_nvhdmi_8ch_89 }, | 556 | { .id = 0x10de0014, .name = "GPU 14 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
| 557 | { .id = 0x10de000c, .name = "MCP89 HDMI", | 557 | { .id = 0x10de0018, .name = "GPU 18 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
| 558 | .patch = patch_nvhdmi_8ch_89 }, | 558 | { .id = 0x10de0019, .name = "GPU 19 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
| 559 | { .id = 0x10de000d, .name = "GT240 HDMI", | 559 | { .id = 0x10de001a, .name = "GPU 1a HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
| 560 | .patch = patch_nvhdmi_8ch_89 }, | 560 | { .id = 0x10de001b, .name = "GPU 1b HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
| 561 | { .id = 0x10de0067, .name = "MCP67 HDMI", .patch = patch_nvhdmi_2ch }, | 561 | { .id = 0x10de001c, .name = "GPU 1c HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
| 562 | { .id = 0x10de8001, .name = "MCP73 HDMI", .patch = patch_nvhdmi_2ch }, | 562 | { .id = 0x10de0040, .name = "GPU 40 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
| 563 | { .id = 0x10de0041, .name = "GPU 41 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, | ||
| 564 | { .id = 0x10de0042, .name = "GPU 42 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, | ||
| 565 | { .id = 0x10de0043, .name = "GPU 43 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, | ||
| 566 | { .id = 0x10de0044, .name = "GPU 44 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, | ||
| 567 | { .id = 0x10de0067, .name = "MCP67 HDMI", .patch = patch_nvhdmi_2ch }, | ||
| 568 | { .id = 0x10de8001, .name = "MCP73 HDMI", .patch = patch_nvhdmi_2ch }, | ||
| 563 | {} /* terminator */ | 569 | {} /* terminator */ |
| 564 | }; | 570 | }; |
| 565 | 571 | ||
| @@ -572,6 +578,21 @@ MODULE_ALIAS("snd-hda-codec-id:10de000a"); | |||
| 572 | MODULE_ALIAS("snd-hda-codec-id:10de000b"); | 578 | MODULE_ALIAS("snd-hda-codec-id:10de000b"); |
| 573 | MODULE_ALIAS("snd-hda-codec-id:10de000c"); | 579 | MODULE_ALIAS("snd-hda-codec-id:10de000c"); |
| 574 | MODULE_ALIAS("snd-hda-codec-id:10de000d"); | 580 | MODULE_ALIAS("snd-hda-codec-id:10de000d"); |
| 581 | MODULE_ALIAS("snd-hda-codec-id:10de0010"); | ||
| 582 | MODULE_ALIAS("snd-hda-codec-id:10de0011"); | ||
| 583 | MODULE_ALIAS("snd-hda-codec-id:10de0012"); | ||
| 584 | MODULE_ALIAS("snd-hda-codec-id:10de0013"); | ||
| 585 | MODULE_ALIAS("snd-hda-codec-id:10de0014"); | ||
| 586 | MODULE_ALIAS("snd-hda-codec-id:10de0018"); | ||
| 587 | MODULE_ALIAS("snd-hda-codec-id:10de0019"); | ||
| 588 | MODULE_ALIAS("snd-hda-codec-id:10de001a"); | ||
| 589 | MODULE_ALIAS("snd-hda-codec-id:10de001b"); | ||
| 590 | MODULE_ALIAS("snd-hda-codec-id:10de001c"); | ||
| 591 | MODULE_ALIAS("snd-hda-codec-id:10de0040"); | ||
| 592 | MODULE_ALIAS("snd-hda-codec-id:10de0041"); | ||
| 593 | MODULE_ALIAS("snd-hda-codec-id:10de0042"); | ||
| 594 | MODULE_ALIAS("snd-hda-codec-id:10de0043"); | ||
| 595 | MODULE_ALIAS("snd-hda-codec-id:10de0044"); | ||
| 575 | MODULE_ALIAS("snd-hda-codec-id:10de0067"); | 596 | MODULE_ALIAS("snd-hda-codec-id:10de0067"); |
| 576 | MODULE_ALIAS("snd-hda-codec-id:10de8001"); | 597 | MODULE_ALIAS("snd-hda-codec-id:10de8001"); |
| 577 | 598 | ||
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 6ac53f7de549..55d6e5b6bb7d 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -137,6 +137,7 @@ enum { | |||
| 137 | ALC269VB_DMIC, | 137 | ALC269VB_DMIC, |
| 138 | ALC269_FUJITSU, | 138 | ALC269_FUJITSU, |
| 139 | ALC269_LIFEBOOK, | 139 | ALC269_LIFEBOOK, |
| 140 | ALC271_ACER, | ||
| 140 | ALC269_AUTO, | 141 | ALC269_AUTO, |
| 141 | ALC269_MODEL_LAST /* last tag */ | 142 | ALC269_MODEL_LAST /* last tag */ |
| 142 | }; | 143 | }; |
| @@ -7041,6 +7042,7 @@ static int patch_alc260(struct hda_codec *codec) | |||
| 7041 | 7042 | ||
| 7042 | spec->stream_analog_playback = &alc260_pcm_analog_playback; | 7043 | spec->stream_analog_playback = &alc260_pcm_analog_playback; |
| 7043 | spec->stream_analog_capture = &alc260_pcm_analog_capture; | 7044 | spec->stream_analog_capture = &alc260_pcm_analog_capture; |
| 7045 | spec->stream_analog_alt_capture = &alc260_pcm_analog_capture; | ||
| 7044 | 7046 | ||
| 7045 | spec->stream_digital_playback = &alc260_pcm_digital_playback; | 7047 | spec->stream_digital_playback = &alc260_pcm_digital_playback; |
| 7046 | spec->stream_digital_capture = &alc260_pcm_digital_capture; | 7048 | spec->stream_digital_capture = &alc260_pcm_digital_capture; |
| @@ -13475,7 +13477,6 @@ static struct snd_pci_quirk alc268_cfg_tbl[] = { | |||
| 13475 | SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA), | 13477 | SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA), |
| 13476 | SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER), | 13478 | SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER), |
| 13477 | SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1), | 13479 | SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1), |
| 13478 | SND_PCI_QUIRK(0x1854, 0x1775, "LG R510", ALC268_DELL), | ||
| 13479 | {} | 13480 | {} |
| 13480 | }; | 13481 | }; |
| 13481 | 13482 | ||
| @@ -13866,6 +13867,12 @@ static struct snd_kcontrol_new alc269vb_laptop_mixer[] = { | |||
| 13866 | { } /* end */ | 13867 | { } /* end */ |
| 13867 | }; | 13868 | }; |
| 13868 | 13869 | ||
| 13870 | static struct snd_kcontrol_new alc269_asus_mixer[] = { | ||
| 13871 | HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT), | ||
| 13872 | HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x0, HDA_INPUT), | ||
| 13873 | { } /* end */ | ||
| 13874 | }; | ||
| 13875 | |||
| 13869 | /* capture mixer elements */ | 13876 | /* capture mixer elements */ |
| 13870 | static struct snd_kcontrol_new alc269_laptop_analog_capture_mixer[] = { | 13877 | static struct snd_kcontrol_new alc269_laptop_analog_capture_mixer[] = { |
| 13871 | HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT), | 13878 | HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT), |
| @@ -14086,6 +14093,20 @@ static struct hda_verb alc269vb_laptop_amic_init_verbs[] = { | |||
| 14086 | {} | 14093 | {} |
| 14087 | }; | 14094 | }; |
| 14088 | 14095 | ||
| 14096 | static struct hda_verb alc271_acer_dmic_verbs[] = { | ||
| 14097 | {0x20, AC_VERB_SET_COEF_INDEX, 0x0d}, | ||
| 14098 | {0x20, AC_VERB_SET_PROC_COEF, 0x4000}, | ||
| 14099 | {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, | ||
| 14100 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
| 14101 | {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, | ||
| 14102 | {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | ||
| 14103 | {0x21, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
| 14104 | {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, | ||
| 14105 | {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT}, | ||
| 14106 | {0x22, AC_VERB_SET_CONNECT_SEL, 6}, | ||
| 14107 | { } | ||
| 14108 | }; | ||
| 14109 | |||
| 14089 | /* toggle speaker-output according to the hp-jack state */ | 14110 | /* toggle speaker-output according to the hp-jack state */ |
| 14090 | static void alc269_speaker_automute(struct hda_codec *codec) | 14111 | static void alc269_speaker_automute(struct hda_codec *codec) |
| 14091 | { | 14112 | { |
| @@ -14465,6 +14486,7 @@ static const char *alc269_models[ALC269_MODEL_LAST] = { | |||
| 14465 | 14486 | ||
| 14466 | static struct snd_pci_quirk alc269_cfg_tbl[] = { | 14487 | static struct snd_pci_quirk alc269_cfg_tbl[] = { |
| 14467 | SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_QUANTA_FL1), | 14488 | SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_QUANTA_FL1), |
| 14489 | SND_PCI_QUIRK(0x1025, 0x047c, "ACER ZGA", ALC271_ACER), | ||
| 14468 | SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A", | 14490 | SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A", |
| 14469 | ALC269_AMIC), | 14491 | ALC269_AMIC), |
| 14470 | SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269VB_AMIC), | 14492 | SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269VB_AMIC), |
| @@ -14626,6 +14648,23 @@ static struct alc_config_preset alc269_presets[] = { | |||
| 14626 | .unsol_event = alc269_lifebook_unsol_event, | 14648 | .unsol_event = alc269_lifebook_unsol_event, |
| 14627 | .init_hook = alc269_lifebook_init_hook, | 14649 | .init_hook = alc269_lifebook_init_hook, |
| 14628 | }, | 14650 | }, |
| 14651 | [ALC271_ACER] = { | ||
| 14652 | .mixers = { alc269_asus_mixer }, | ||
| 14653 | .cap_mixer = alc269vb_laptop_digital_capture_mixer, | ||
| 14654 | .init_verbs = { alc269_init_verbs, alc271_acer_dmic_verbs }, | ||
| 14655 | .num_dacs = ARRAY_SIZE(alc269_dac_nids), | ||
| 14656 | .dac_nids = alc269_dac_nids, | ||
| 14657 | .adc_nids = alc262_dmic_adc_nids, | ||
| 14658 | .num_adc_nids = ARRAY_SIZE(alc262_dmic_adc_nids), | ||
| 14659 | .capsrc_nids = alc262_dmic_capsrc_nids, | ||
| 14660 | .num_channel_mode = ARRAY_SIZE(alc269_modes), | ||
| 14661 | .channel_mode = alc269_modes, | ||
| 14662 | .input_mux = &alc269_capture_source, | ||
| 14663 | .dig_out_nid = ALC880_DIGOUT_NID, | ||
| 14664 | .unsol_event = alc_sku_unsol_event, | ||
| 14665 | .setup = alc269vb_laptop_dmic_setup, | ||
| 14666 | .init_hook = alc_inithook, | ||
| 14667 | }, | ||
| 14629 | }; | 14668 | }; |
| 14630 | 14669 | ||
| 14631 | static int patch_alc269(struct hda_codec *codec) | 14670 | static int patch_alc269(struct hda_codec *codec) |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index b8d730c47df1..f3f861bd1bf8 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
| @@ -94,6 +94,7 @@ enum { | |||
| 94 | STAC_92HD83XXX_PWR_REF, | 94 | STAC_92HD83XXX_PWR_REF, |
| 95 | STAC_DELL_S14, | 95 | STAC_DELL_S14, |
| 96 | STAC_92HD83XXX_HP, | 96 | STAC_92HD83XXX_HP, |
| 97 | STAC_HP_DV7_4000, | ||
| 97 | STAC_92HD83XXX_MODELS | 98 | STAC_92HD83XXX_MODELS |
| 98 | }; | 99 | }; |
| 99 | 100 | ||
| @@ -1632,10 +1633,17 @@ static unsigned int dell_s14_pin_configs[10] = { | |||
| 1632 | 0x40f000f0, 0x40f000f0, | 1633 | 0x40f000f0, 0x40f000f0, |
| 1633 | }; | 1634 | }; |
| 1634 | 1635 | ||
| 1636 | static unsigned int hp_dv7_4000_pin_configs[10] = { | ||
| 1637 | 0x03a12050, 0x0321201f, 0x40f000f0, 0x90170110, | ||
| 1638 | 0x40f000f0, 0x40f000f0, 0x90170110, 0xd5a30140, | ||
| 1639 | 0x40f000f0, 0x40f000f0, | ||
| 1640 | }; | ||
| 1641 | |||
| 1635 | static unsigned int *stac92hd83xxx_brd_tbl[STAC_92HD83XXX_MODELS] = { | 1642 | static unsigned int *stac92hd83xxx_brd_tbl[STAC_92HD83XXX_MODELS] = { |
| 1636 | [STAC_92HD83XXX_REF] = ref92hd83xxx_pin_configs, | 1643 | [STAC_92HD83XXX_REF] = ref92hd83xxx_pin_configs, |
| 1637 | [STAC_92HD83XXX_PWR_REF] = ref92hd83xxx_pin_configs, | 1644 | [STAC_92HD83XXX_PWR_REF] = ref92hd83xxx_pin_configs, |
| 1638 | [STAC_DELL_S14] = dell_s14_pin_configs, | 1645 | [STAC_DELL_S14] = dell_s14_pin_configs, |
| 1646 | [STAC_HP_DV7_4000] = hp_dv7_4000_pin_configs, | ||
| 1639 | }; | 1647 | }; |
| 1640 | 1648 | ||
| 1641 | static const char *stac92hd83xxx_models[STAC_92HD83XXX_MODELS] = { | 1649 | static const char *stac92hd83xxx_models[STAC_92HD83XXX_MODELS] = { |
| @@ -1644,6 +1652,7 @@ static const char *stac92hd83xxx_models[STAC_92HD83XXX_MODELS] = { | |||
| 1644 | [STAC_92HD83XXX_PWR_REF] = "mic-ref", | 1652 | [STAC_92HD83XXX_PWR_REF] = "mic-ref", |
| 1645 | [STAC_DELL_S14] = "dell-s14", | 1653 | [STAC_DELL_S14] = "dell-s14", |
| 1646 | [STAC_92HD83XXX_HP] = "hp", | 1654 | [STAC_92HD83XXX_HP] = "hp", |
| 1655 | [STAC_HP_DV7_4000] = "hp-dv7-4000", | ||
| 1647 | }; | 1656 | }; |
| 1648 | 1657 | ||
| 1649 | static struct snd_pci_quirk stac92hd83xxx_cfg_tbl[] = { | 1658 | static struct snd_pci_quirk stac92hd83xxx_cfg_tbl[] = { |
| @@ -5340,6 +5349,8 @@ again: | |||
| 5340 | case 0x111d7667: | 5349 | case 0x111d7667: |
| 5341 | case 0x111d7668: | 5350 | case 0x111d7668: |
| 5342 | case 0x111d7669: | 5351 | case 0x111d7669: |
| 5352 | case 0x111d76d1: | ||
| 5353 | case 0x111d76d9: | ||
| 5343 | spec->num_pins = ARRAY_SIZE(stac92hd88xxx_pin_nids); | 5354 | spec->num_pins = ARRAY_SIZE(stac92hd88xxx_pin_nids); |
| 5344 | spec->pin_nids = stac92hd88xxx_pin_nids; | 5355 | spec->pin_nids = stac92hd88xxx_pin_nids; |
| 5345 | spec->mono_nid = 0; | 5356 | spec->mono_nid = 0; |
| @@ -6274,6 +6285,8 @@ static struct hda_codec_preset snd_hda_preset_sigmatel[] = { | |||
| 6274 | { .id = 0x111d76d4, .name = "92HD83C1C5", .patch = patch_stac92hd83xxx}, | 6285 | { .id = 0x111d76d4, .name = "92HD83C1C5", .patch = patch_stac92hd83xxx}, |
| 6275 | { .id = 0x111d7605, .name = "92HD81B1X5", .patch = patch_stac92hd83xxx}, | 6286 | { .id = 0x111d7605, .name = "92HD81B1X5", .patch = patch_stac92hd83xxx}, |
| 6276 | { .id = 0x111d76d5, .name = "92HD81B1C5", .patch = patch_stac92hd83xxx}, | 6287 | { .id = 0x111d76d5, .name = "92HD81B1C5", .patch = patch_stac92hd83xxx}, |
| 6288 | { .id = 0x111d76d1, .name = "92HD87B1/3", .patch = patch_stac92hd83xxx}, | ||
| 6289 | { .id = 0x111d76d9, .name = "92HD87B2/4", .patch = patch_stac92hd83xxx}, | ||
| 6277 | { .id = 0x111d7666, .name = "92HD88B3", .patch = patch_stac92hd83xxx}, | 6290 | { .id = 0x111d7666, .name = "92HD88B3", .patch = patch_stac92hd83xxx}, |
| 6278 | { .id = 0x111d7667, .name = "92HD88B1", .patch = patch_stac92hd83xxx}, | 6291 | { .id = 0x111d7667, .name = "92HD88B1", .patch = patch_stac92hd83xxx}, |
| 6279 | { .id = 0x111d7668, .name = "92HD88B2", .patch = patch_stac92hd83xxx}, | 6292 | { .id = 0x111d7668, .name = "92HD88B2", .patch = patch_stac92hd83xxx}, |
diff --git a/sound/soc/blackfin/Kconfig b/sound/soc/blackfin/Kconfig index 8ef25025f3dc..3abeeddc67d3 100644 --- a/sound/soc/blackfin/Kconfig +++ b/sound/soc/blackfin/Kconfig | |||
| @@ -105,13 +105,18 @@ config SND_BF5XX_RESET_GPIO_NUM | |||
| 105 | Set the correct GPIO for RESET the sound chip. | 105 | Set the correct GPIO for RESET the sound chip. |
| 106 | 106 | ||
| 107 | config SND_BF5XX_SOC_AD1980 | 107 | config SND_BF5XX_SOC_AD1980 |
| 108 | tristate "SoC AD1980/1 Audio support for BF5xx" | 108 | tristate "SoC AD1980/1 Audio support for BF5xx (Obsolete)" |
| 109 | depends on SND_BF5XX_AC97 | 109 | depends on SND_BF5XX_AC97 |
| 110 | select SND_BF5XX_SOC_AC97 | 110 | select SND_BF5XX_SOC_AC97 |
| 111 | select SND_SOC_AD1980 | 111 | select SND_SOC_AD1980 |
| 112 | help | 112 | help |
| 113 | Say Y if you want to add support for SoC audio on BF5xx STAMP/EZKIT. | 113 | Say Y if you want to add support for SoC audio on BF5xx STAMP/EZKIT. |
| 114 | 114 | ||
| 115 | Warning: | ||
| 116 | Because Analog Devices Inc. discontinued the ad1980 sound chip since | ||
| 117 | Sep. 2009, this ad1980 driver is not maintained, tested and supported | ||
| 118 | by ADI now. | ||
| 119 | |||
| 115 | config SND_BF5XX_SOC_SPORT | 120 | config SND_BF5XX_SOC_SPORT |
| 116 | tristate | 121 | tristate |
| 117 | 122 | ||
diff --git a/sound/soc/blackfin/bf5xx-ad1980.c b/sound/soc/blackfin/bf5xx-ad1980.c index d8f591273778..92f7c327bb7a 100644 --- a/sound/soc/blackfin/bf5xx-ad1980.c +++ b/sound/soc/blackfin/bf5xx-ad1980.c | |||
| @@ -26,6 +26,14 @@ | |||
| 26 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | 26 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
| 27 | */ | 27 | */ |
| 28 | 28 | ||
| 29 | /* | ||
| 30 | * WARNING: | ||
| 31 | * | ||
| 32 | * Because Analog Devices Inc. discontinued the ad1980 sound chip since | ||
| 33 | * Sep. 2009, this ad1980 driver is not maintained, tested and supported | ||
| 34 | * by ADI now. | ||
| 35 | */ | ||
| 36 | |||
| 29 | #include <linux/module.h> | 37 | #include <linux/module.h> |
| 30 | #include <linux/moduleparam.h> | 38 | #include <linux/moduleparam.h> |
| 31 | #include <linux/device.h> | 39 | #include <linux/device.h> |
| @@ -109,5 +117,5 @@ module_exit(bf5xx_board_exit); | |||
| 109 | 117 | ||
| 110 | /* Module information */ | 118 | /* Module information */ |
| 111 | MODULE_AUTHOR("Cliff Cai"); | 119 | MODULE_AUTHOR("Cliff Cai"); |
| 112 | MODULE_DESCRIPTION("ALSA SoC AD1980/1 BF5xx board"); | 120 | MODULE_DESCRIPTION("ALSA SoC AD1980/1 BF5xx board (Obsolete)"); |
| 113 | MODULE_LICENSE("GPL"); | 121 | MODULE_LICENSE("GPL"); |
diff --git a/sound/soc/codecs/ad1980.c b/sound/soc/codecs/ad1980.c index 042072738cdc..70cfaec3be2c 100644 --- a/sound/soc/codecs/ad1980.c +++ b/sound/soc/codecs/ad1980.c | |||
| @@ -11,6 +11,14 @@ | |||
| 11 | * option) any later version. | 11 | * option) any later version. |
| 12 | */ | 12 | */ |
| 13 | 13 | ||
| 14 | /* | ||
| 15 | * WARNING: | ||
| 16 | * | ||
| 17 | * Because Analog Devices Inc. discontinued the ad1980 sound chip since | ||
| 18 | * Sep. 2009, this ad1980 driver is not maintained, tested and supported | ||
| 19 | * by ADI now. | ||
| 20 | */ | ||
| 21 | |||
| 14 | #include <linux/init.h> | 22 | #include <linux/init.h> |
| 15 | #include <linux/slab.h> | 23 | #include <linux/slab.h> |
| 16 | #include <linux/module.h> | 24 | #include <linux/module.h> |
| @@ -298,6 +306,6 @@ struct snd_soc_codec_device soc_codec_dev_ad1980 = { | |||
| 298 | }; | 306 | }; |
| 299 | EXPORT_SYMBOL_GPL(soc_codec_dev_ad1980); | 307 | EXPORT_SYMBOL_GPL(soc_codec_dev_ad1980); |
| 300 | 308 | ||
| 301 | MODULE_DESCRIPTION("ASoC ad1980 driver"); | 309 | MODULE_DESCRIPTION("ASoC ad1980 driver (Obsolete)"); |
| 302 | MODULE_AUTHOR("Roy Huang, Cliff Cai"); | 310 | MODULE_AUTHOR("Roy Huang, Cliff Cai"); |
| 303 | MODULE_LICENSE("GPL"); | 311 | MODULE_LICENSE("GPL"); |
diff --git a/sound/soc/codecs/ad1980.h b/sound/soc/codecs/ad1980.h index db6c8500d66b..538f37c90806 100644 --- a/sound/soc/codecs/ad1980.h +++ b/sound/soc/codecs/ad1980.h | |||
| @@ -1,5 +1,11 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * ad1980.h -- ad1980 Soc Audio driver | 2 | * ad1980.h -- ad1980 Soc Audio driver |
| 3 | * | ||
| 4 | * WARNING: | ||
| 5 | * | ||
| 6 | * Because Analog Devices Inc. discontinued the ad1980 sound chip since | ||
| 7 | * Sep. 2009, this ad1980 driver is not maintained, tested and supported | ||
| 8 | * by ADI now. | ||
| 3 | */ | 9 | */ |
| 4 | 10 | ||
| 5 | #ifndef _AD1980_H | 11 | #ifndef _AD1980_H |
diff --git a/sound/soc/codecs/wm8580.c b/sound/soc/codecs/wm8580.c index c3571ee5c11b..72deeabef4fe 100644 --- a/sound/soc/codecs/wm8580.c +++ b/sound/soc/codecs/wm8580.c | |||
| @@ -269,9 +269,9 @@ SOC_DOUBLE("DAC2 Invert Switch", WM8580_DAC_CONTROL4, 2, 3, 1, 0), | |||
| 269 | SOC_DOUBLE("DAC3 Invert Switch", WM8580_DAC_CONTROL4, 4, 5, 1, 0), | 269 | SOC_DOUBLE("DAC3 Invert Switch", WM8580_DAC_CONTROL4, 4, 5, 1, 0), |
| 270 | 270 | ||
| 271 | SOC_SINGLE("DAC ZC Switch", WM8580_DAC_CONTROL5, 5, 1, 0), | 271 | SOC_SINGLE("DAC ZC Switch", WM8580_DAC_CONTROL5, 5, 1, 0), |
| 272 | SOC_SINGLE("DAC1 Switch", WM8580_DAC_CONTROL5, 0, 1, 0), | 272 | SOC_SINGLE("DAC1 Switch", WM8580_DAC_CONTROL5, 0, 1, 1), |
| 273 | SOC_SINGLE("DAC2 Switch", WM8580_DAC_CONTROL5, 1, 1, 0), | 273 | SOC_SINGLE("DAC2 Switch", WM8580_DAC_CONTROL5, 1, 1, 1), |
| 274 | SOC_SINGLE("DAC3 Switch", WM8580_DAC_CONTROL5, 2, 1, 0), | 274 | SOC_SINGLE("DAC3 Switch", WM8580_DAC_CONTROL5, 2, 1, 1), |
| 275 | 275 | ||
| 276 | SOC_DOUBLE("ADC Mute Switch", WM8580_ADC_CONTROL1, 0, 1, 1, 0), | 276 | SOC_DOUBLE("ADC Mute Switch", WM8580_ADC_CONTROL1, 0, 1, 1, 0), |
| 277 | SOC_SINGLE("ADC High-Pass Filter Switch", WM8580_ADC_CONTROL1, 4, 1, 0), | 277 | SOC_SINGLE("ADC High-Pass Filter Switch", WM8580_ADC_CONTROL1, 4, 1, 0), |
diff --git a/sound/soc/imx/Kconfig b/sound/soc/imx/Kconfig index 52dac5e3874c..687c76fc0839 100644 --- a/sound/soc/imx/Kconfig +++ b/sound/soc/imx/Kconfig | |||
| @@ -28,7 +28,9 @@ config SND_SOC_PHYCORE_AC97 | |||
| 28 | 28 | ||
| 29 | config SND_SOC_EUKREA_TLV320 | 29 | config SND_SOC_EUKREA_TLV320 |
| 30 | tristate "Eukrea TLV320" | 30 | tristate "Eukrea TLV320" |
| 31 | depends on MACH_EUKREA_MBIMX27_BASEBOARD || MACH_EUKREA_MBIMXSD_BASEBOARD | 31 | depends on MACH_EUKREA_MBIMX27_BASEBOARD \ |
| 32 | || MACH_EUKREA_MBIMXSD25_BASEBOARD \ | ||
| 33 | || MACH_EUKREA_MBIMXSD35_BASEBOARD | ||
| 32 | select SND_SOC_TLV320AIC23 | 34 | select SND_SOC_TLV320AIC23 |
| 33 | help | 35 | help |
| 34 | Enable I2S based access to the TLV320AIC23B codec attached | 36 | Enable I2S based access to the TLV320AIC23B codec attached |
diff --git a/sound/soc/soc-cache.c b/sound/soc/soc-cache.c index 472af38188c1..adbc68ce9050 100644 --- a/sound/soc/soc-cache.c +++ b/sound/soc/soc-cache.c | |||
| @@ -340,7 +340,7 @@ static unsigned int snd_soc_16_8_read_i2c(struct snd_soc_codec *codec, | |||
| 340 | static unsigned int snd_soc_16_8_read(struct snd_soc_codec *codec, | 340 | static unsigned int snd_soc_16_8_read(struct snd_soc_codec *codec, |
| 341 | unsigned int reg) | 341 | unsigned int reg) |
| 342 | { | 342 | { |
| 343 | u16 *cache = codec->reg_cache; | 343 | u8 *cache = codec->reg_cache; |
| 344 | 344 | ||
| 345 | reg &= 0xff; | 345 | reg &= 0xff; |
| 346 | if (reg >= codec->reg_cache_size) | 346 | if (reg >= codec->reg_cache_size) |
| @@ -351,7 +351,7 @@ static unsigned int snd_soc_16_8_read(struct snd_soc_codec *codec, | |||
| 351 | static int snd_soc_16_8_write(struct snd_soc_codec *codec, unsigned int reg, | 351 | static int snd_soc_16_8_write(struct snd_soc_codec *codec, unsigned int reg, |
| 352 | unsigned int value) | 352 | unsigned int value) |
| 353 | { | 353 | { |
| 354 | u16 *cache = codec->reg_cache; | 354 | u8 *cache = codec->reg_cache; |
| 355 | u8 data[3]; | 355 | u8 data[3]; |
| 356 | int ret; | 356 | int ret; |
| 357 | 357 | ||
