Changeset 464
- Timestamp:
- Oct 8, 2009, 10:35:00 AM (16 years ago)
- Location:
- GPL/trunk/alsa-kernel
- Files:
-
- 72 edited
Legend:
- Unmodified
- Added
- Removed
-
GPL/trunk/alsa-kernel/core/control.c
r446 r464 421 421 422 422 /** 423 * snd_ctl_remove_u nlocked_id - remove the unlocked control of the given id and release it423 * snd_ctl_remove_user_ctl - remove and release the unlocked user control 424 424 * @file: active control handle 425 425 * @id: the control id to remove … … 430 430 * Returns 0 if successful, or a negative error code on failure. 431 431 */ 432 static int snd_ctl_remove_u nlocked_id(struct snd_ctl_file * file,433 432 static int snd_ctl_remove_user_ctl(struct snd_ctl_file * file, 433 struct snd_ctl_elem_id *id) 434 434 { 435 435 struct snd_card *card = file->card; … … 440 440 kctl = snd_ctl_find_id(card, id); 441 441 if (kctl == NULL) { 442 up_write(&card->controls_rwsem); 443 return -ENOENT; 442 ret = -ENOENT; 443 goto error; 444 } 445 if (!(kctl->vd[0].access & SNDRV_CTL_ELEM_ACCESS_USER)) { 446 ret = -EINVAL; 447 goto error; 444 448 } 445 449 for (idx = 0; idx < kctl->count; idx++) 446 450 if (kctl->vd[idx].owner != NULL && kctl->vd[idx].owner != file) { 447 up_write(&card->controls_rwsem);448 return -EBUSY;451 ret = -EBUSY; 452 goto error; 449 453 } 450 454 ret = snd_ctl_remove(card, kctl); 455 if (ret < 0) 456 goto error; 457 card->user_ctl_count--; 458 error: 451 459 up_write(&card->controls_rwsem); 452 460 return ret; … … 958 966 if (card->user_ctl_count >= MAX_USER_CONTROLS) 959 967 return -ENOMEM; 960 if (info->count > 1024)968 if (info->count < 1) 961 969 return -EINVAL; 962 970 access = info->access == 0 ? SNDRV_CTL_ELEM_ACCESS_READWRITE : … … 1059 1067 { 1060 1068 struct snd_ctl_elem_id id; 1061 int err;1062 1069 1063 1070 if (copy_from_user(&id, _id, sizeof(id))) 1064 1071 return -EFAULT; 1065 err = snd_ctl_remove_unlocked_id(file, &id); 1066 if (! err) { 1067 struct snd_card *card = file->card; 1068 down_write(&card->controls_rwsem); 1069 card->user_ctl_count--; 1070 up_write(&card->controls_rwsem); 1071 } 1072 return err; 1072 return snd_ctl_remove_user_ctl(file, &id); 1073 1073 } 1074 1074 -
GPL/trunk/alsa-kernel/core/info.c
r445 r464 89 89 90 90 nsize = PAGE_ALIGN(nsize); 91 #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 22) || \ 92 defined(CONFIG_SND_DEBUG_MEMORY) 91 93 nbuf = kmalloc(nsize, GFP_KERNEL); 94 if (!nbuf) 95 return -ENOMEM; 96 memcpy(nbuf, buffer->buffer, buffer->len); 97 kfree(buffer->buffer); 98 #else 99 nbuf = krealloc(buffer->buffer, nsize, GFP_KERNEL); 92 100 if (! nbuf) 93 101 return -ENOMEM; 94 95 memcpy(nbuf, buffer->buffer, buffer->len); 96 kfree(buffer->buffer); 102 #endif 103 97 104 buffer->buffer = nbuf; 98 105 buffer->len = nsize; -
GPL/trunk/alsa-kernel/core/init.c
r447 r464 165 165 if (!card) 166 166 return -ENOMEM; 167 if (xid) { 168 if (!snd_info_check_reserved_words(xid)) { 169 snd_printk(KERN_ERR 170 "given id string '%s' is reserved.\n", xid); 171 err = -EBUSY; 172 goto __error; 173 } 167 if (xid) 174 168 strlcpy(card->id, xid, sizeof(card->id)); 175 }176 169 err = 0; 177 170 mutex_lock(&snd_card_mutex); … … 516 509 EXPORT_SYMBOL(snd_card_free); 517 510 518 static void choose_default_id(struct snd_card *card)511 static void snd_card_set_id_no_lock(struct snd_card *card, const char *nid) 519 512 { 520 513 int i, len, idx_flag = 0, loops = SNDRV_CARDS; 521 char *id, *spos; 522 523 id = spos = card->shortname; 524 while (*id != '\0') { 525 if (*id == ' ') 526 spos = id + 1; 527 id++; 514 const char *spos, *src; 515 char *id; 516 517 if (nid == NULL) { 518 id = card->shortname; 519 spos = src = id; 520 while (*id != '\0') { 521 if (*id == ' ') 522 spos = id + 1; 523 id++; 524 } 525 } else { 526 spos = src = nid; 528 527 } 529 528 id = card->id; … … 531 530 spos++; 532 531 if (isdigit(*spos)) 533 *id++ = isalpha( card->shortname[0]) ? card->shortname[0] : 'D';532 *id++ = isalpha(src[0]) ? src[0] : 'D'; 534 533 while (*spos != '\0' && (size_t)(id - card->id) < sizeof(card->id) - 1) { 535 534 if (isalnum(*spos)) … … 546 545 while (1) { 547 546 if (loops-- == 0) { 548 snd_printk(KERN_ERR "unable to choose default card id (%s)\n", id);547 snd_printk(KERN_ERR "unable to set card id (%s)\n", id); 549 548 strcpy(card->id, card->proc_root->name); 550 549 return; … … 572 571 if ((size_t)len <= sizeof(card->id) - 2) 573 572 spos++; 574 * spos++ = '_';575 * spos++ = '1';576 * spos++ = '\0';573 *(char *)spos++ = '_'; 574 *(char *)spos++ = '1'; 575 *(char *)spos++ = '\0'; 577 576 idx_flag++; 578 577 } 579 578 } 580 579 } 580 581 /** 582 * snd_card_set_id - set card identification name 583 * @card: soundcard structure 584 * @nid: new identification string 585 * 586 * This function sets the card identification and checks for name 587 * collisions. 588 */ 589 void snd_card_set_id(struct snd_card *card, const char *nid) 590 { 591 /* check if user specified own card->id */ 592 if (card->id[0] != '\0') 593 return; 594 mutex_lock(&snd_card_mutex); 595 snd_card_set_id_no_lock(card, nid); 596 mutex_unlock(&snd_card_mutex); 597 } 598 EXPORT_SYMBOL(snd_card_set_id); 581 599 582 600 #ifndef CONFIG_SYSFS_DEPRECATED … … 673 691 return 0; 674 692 } 675 if (card->id[0] == '\0') 676 choose_default_id(card); 693 snd_card_set_id_no_lock(card, card->id[0] == '\0' ? NULL : card->id); 677 694 snd_cards[card->number] = card; 678 695 mutex_unlock(&snd_card_mutex); -
GPL/trunk/alsa-kernel/core/memalloc.c
r399 r464 236 236 dmab->area = snd_malloc_dev_pages(device, size, &dmab->addr); 237 237 break; 238 #endif 239 #ifdef CONFIG_SND_DMA_SGBUF 238 240 case SNDRV_DMA_TYPE_DEV_SG: 239 241 snd_malloc_sgbuf_pages(device, size, dmab, NULL); … … 306 308 snd_free_dev_pages(dmab->dev.dev, dmab->bytes, dmab->area, dmab->addr); 307 309 break; 310 #endif 311 #ifdef CONFIG_SND_DMA_SGBUF 308 312 case SNDRV_DMA_TYPE_DEV_SG: 309 313 snd_free_sgbuf_pages(dmab); -
GPL/trunk/alsa-kernel/core/misc.c
r443 r464 25 25 #include <sound/core.h> 26 26 27 #ifdef CONFIG_SND_DEBUG 28 29 #ifdef CONFIG_SND_DEBUG_VERBOSE 30 #define DEFAULT_DEBUG_LEVEL 2 31 #else 32 #define DEFAULT_DEBUG_LEVEL 1 33 #endif 34 35 static int debug = DEFAULT_DEBUG_LEVEL; 36 module_param(debug, int, 0644); 37 MODULE_PARM_DESC(debug, "Debug level (0 = disable)"); 38 39 #endif /* CONFIG_SND_DEBUG */ 40 27 41 void release_and_free_resource(struct resource *res) 28 42 { … … 36 50 37 51 #ifdef CONFIG_SND_VERBOSE_PRINTK 38 void snd_verbose_printk(const char *file, int line, const char *format, ...) 52 /* strip the leading path if the given path is absolute */ 53 static const char *sanity_file_name(const char *path) 54 { 55 if (*path == '/') 56 return strrchr(path, '/') + 1; 57 else 58 return path; 59 } 60 61 /* print file and line with a certain printk prefix */ 62 static int print_snd_pfx(unsigned int level, const char *path, int line, 63 const char *format) 64 { 65 const char *file = sanity_file_name(path); 66 char tmp[] = "<0>"; 67 const char *pfx = level ? KERN_DEBUG : KERN_DEFAULT; 68 int ret = 0; 69 70 if (format[0] == '<' && format[2] == '>') { 71 tmp[1] = format[1]; 72 pfx = tmp; 73 ret = 1; 74 } 75 printk("%sALSA %s:%d: ", pfx, file, line); 76 return ret; 77 } 78 #else 79 #define print_snd_pfx(level, path, line, format) 0 80 #endif 81 82 #if defined(CONFIG_SND_DEBUG) || defined(CONFIG_SND_VERBOSE_PRINTK) 83 void __snd_printk(unsigned int level, const char *path, int line, 84 const char *format, ...) 39 85 { 40 86 va_list args; 41 87 42 if (format[0] == '<' && format[1] >= '0' && format[1] <= '7' && format[2] == '>') { 43 char tmp[] = "<0>"; 44 tmp[1] = format[1]; 45 printk("%sALSA %s:%d: ", tmp, file, line); 46 format += 3; 47 } else { 48 printk("ALSA %s:%d: ", file, line); 49 } 88 #ifdef CONFIG_SND_DEBUG 89 if (debug < level) 90 return; 91 #endif 50 92 va_start(args, format); 93 if (print_snd_pfx(level, path, line, format)) 94 format += 3; /* skip the printk level-prefix */ 51 95 vprintk(format, args); 52 96 va_end(args); 53 97 } 54 55 EXPORT_SYMBOL(snd_verbose_printk); 56 #endif 57 58 #if defined(CONFIG_SND_DEBUG) && defined(CONFIG_SND_VERBOSE_PRINTK) 59 void snd_verbose_printd(const char *file, int line, const char *format, ...) 60 { 61 va_list args; 62 63 if (format[0] == '<' && format[1] >= '0' && format[1] <= '7' && format[2] == '>') { 64 char tmp[] = "<0>"; 65 tmp[1] = format[1]; 66 printk("%sALSA %s:%d: ", tmp, file, line); 67 format += 3; 68 } else { 69 printk(KERN_DEBUG "ALSA %s:%d: ", file, line); 70 } 71 va_start(args, format); 72 vprintk(format, args); 73 va_end(args); 74 75 } 76 77 EXPORT_SYMBOL(snd_verbose_printd); 98 EXPORT_SYMBOL_GPL(__snd_printk); 78 99 #endif 79 100 -
GPL/trunk/alsa-kernel/core/oss/pcm_oss.c
r446 r464 32 32 #include <linux/vmalloc.h> 33 33 #include <linux/moduleparam.h> 34 #include <linux/math64.h> 34 35 #include <linux/string.h> 35 36 #include <sound/core.h> … … 626 627 { 627 628 u64 bsize = (u64)runtime->oss.buffer_bytes * (u64)bytes; 628 u32 rem; 629 div64_32(&bsize, buffer_size, &rem); 630 return (long)bsize; 629 return div_u64(bsize, buffer_size); 631 630 } 632 631 #endif -
GPL/trunk/alsa-kernel/core/pcm_lib.c
r426 r464 23 23 #include <linux/slab.h> 24 24 #include <linux/time.h> 25 #include <linux/math64.h> 25 26 #include <sound/core.h> 26 27 #include <sound/control.h> … … 127 128 128 129 #ifdef CONFIG_SND_PCM_XRUN_DEBUG 129 #define xrun_debug(substream ) ((substream)->pstr->xrun_debug)130 #define xrun_debug(substream, mask) ((substream)->pstr->xrun_debug & (mask)) 130 131 #else 131 #define xrun_debug(substream ) 0132 #define xrun_debug(substream, mask) 0 132 133 #endif 133 134 134 #define dump_stack_on_xrun(substream) do { \135 if (xrun_debug(substream ) > 1)\136 dump_stack(); \135 #define dump_stack_on_xrun(substream) do { \ 136 if (xrun_debug(substream, 2)) \ 137 dump_stack(); \ 137 138 } while (0) 138 139 140 static void pcm_debug_name(struct snd_pcm_substream *substream, 141 char *name, size_t len) 142 { 143 snprintf(name, len, "pcmC%dD%d%c:%d", 144 substream->pcm->card->number, 145 substream->pcm->device, 146 substream->stream ? 'c' : 'p', 147 substream->number); 148 } 149 139 150 static void xrun(struct snd_pcm_substream *substream) 140 151 { 152 struct snd_pcm_runtime *runtime = substream->runtime; 153 154 if (runtime->tstamp_mode == SNDRV_PCM_TSTAMP_ENABLE) 155 snd_pcm_gettime(runtime, (struct timespec *)&runtime->status->tstamp); 141 156 snd_pcm_stop(substream, SNDRV_PCM_STATE_XRUN); 142 if (xrun_debug(substream)) { 143 snd_printd(KERN_DEBUG "XRUN: pcmC%dD%d%c\n", 144 substream->pcm->card->number, 145 substream->pcm->device, 146 substream->stream ? 'c' : 'p'); 157 if (xrun_debug(substream, 1)) { 158 char name[16]; 159 pcm_debug_name(substream, name, sizeof(name)); 160 snd_printd(KERN_DEBUG "XRUN: %s\n", name); 147 161 dump_stack_on_xrun(substream); 148 162 } … … 155 169 snd_pcm_uframes_t pos; 156 170 157 if (runtime->tstamp_mode == SNDRV_PCM_TSTAMP_ENABLE)158 snd_pcm_gettime(runtime, (struct timespec *)&runtime->status->tstamp);159 171 pos = substream->ops->pointer(substream); 160 172 if (pos == SNDRV_PCM_POS_XRUN) … … 162 174 if (pos >= runtime->buffer_size) { 163 175 if (printk_ratelimit()) { 164 snd_printd(KERN_ERR "BUG: stream = %i, pos = 0x%lx, " 176 char name[16]; 177 pcm_debug_name(substream, name, sizeof(name)); 178 snd_printd(KERN_ERR "BUG: %s, pos = 0x%lx, " 165 179 "buffer size = 0x%lx, period size = 0x%lx\n", 166 substream->stream, pos, runtime->buffer_size,180 name, pos, runtime->buffer_size, 167 181 runtime->period_size); 168 182 } … … 184 198 if (avail > runtime->avail_max) 185 199 runtime->avail_max = avail; 186 if ( avail >= runtime->stop_threshold) {187 if ( substream->runtime->status->state == SNDRV_PCM_STATE_DRAINING)200 if (runtime->status->state == SNDRV_PCM_STATE_DRAINING) { 201 if (avail >= runtime->buffer_size) { 188 202 snd_pcm_drain_done(substream); 189 else 203 return -EPIPE; 204 } 205 } else { 206 if (avail >= runtime->stop_threshold) { 190 207 xrun(substream); 191 return -EPIPE; 208 return -EPIPE; 209 } 192 210 } 193 211 if (avail >= runtime->control->avail_min) … … 199 217 #define hw_ptr_error(substream, fmt, args...) \ 200 218 do { \ 201 if (xrun_debug(substream )) { \219 if (xrun_debug(substream, 1)) { \ 202 220 if (printk_ratelimit()) { \ 203 221 snd_printd("PCM: " fmt, ##args); \ … … 223 241 return -EPIPE; 224 242 } 243 if (xrun_debug(substream, 8)) { 244 char name[16]; 245 pcm_debug_name(substream, name, sizeof(name)); 246 snd_printd("period_update: %s: pos=0x%x/0x%x/0x%x, " 247 "hwptr=0x%lx, hw_base=0x%lx, hw_intr=0x%lx\n", 248 name, (unsigned int)pos, 249 (unsigned int)runtime->period_size, 250 (unsigned int)runtime->buffer_size, 251 (unsigned long)old_hw_ptr, 252 (unsigned long)runtime->hw_ptr_base, 253 (unsigned long)runtime->hw_ptr_interrupt); 254 } 225 255 hw_base = runtime->hw_ptr_base; 226 256 new_hw_ptr = hw_base + pos; … … 234 264 } 235 265 if (delta < 0) { 236 delta += runtime->buffer_size; 266 if (runtime->periods == 1 || new_hw_ptr < old_hw_ptr) 267 delta += runtime->buffer_size; 237 268 if (delta < 0) { 238 269 hw_ptr_error(substream, … … 241 272 substream->stream, (long)pos, 242 273 (long)hw_ptr_interrupt); 274 #if 1 275 /* simply skipping the hwptr update seems more 276 * robust in some cases, e.g. on VMware with 277 * inaccurate timer source 278 */ 279 return 0; /* skip this update */ 280 #else 243 281 /* rebase to interrupt position */ 244 282 hw_base = new_hw_ptr = hw_ptr_interrupt; … … 246 284 hw_base -= hw_base % runtime->buffer_size; 247 285 delta = 0; 286 #endif 248 287 } else { 249 288 hw_base += runtime->buffer_size; … … 253 292 } 254 293 } 294 295 /* Do jiffies check only in xrun_debug mode */ 296 if (!xrun_debug(substream, 4)) 297 goto no_jiffies_check; 298 255 299 /* Skip the jiffies check for hardwares with BATCH flag. 256 300 * Such hardware usually just increases the position at each IRQ, … … 260 304 goto no_jiffies_check; 261 305 hdelta = new_hw_ptr - old_hw_ptr; 306 if (hdelta < runtime->delay) 307 goto no_jiffies_check; 308 hdelta -= runtime->delay; 262 309 jdelta = jiffies - runtime->hw_ptr_jiffies; 263 310 if (((hdelta * HZ) / runtime->rate) > jdelta + HZ/100) { … … 293 340 new_hw_ptr - new_hw_ptr % runtime->period_size; 294 341 } 342 runtime->hw_ptr_interrupt = hw_ptr_interrupt; 343 295 344 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK && 296 345 runtime->silence_size > 0) 297 346 snd_pcm_playback_silence(substream, new_hw_ptr); 298 347 348 if (runtime->status->hw_ptr == new_hw_ptr) 349 return 0; 350 299 351 runtime->hw_ptr_base = hw_base; 300 352 runtime->status->hw_ptr = new_hw_ptr; 301 353 runtime->hw_ptr_jiffies = jiffies; 302 runtime->hw_ptr_interrupt = hw_ptr_interrupt; 354 if (runtime->tstamp_mode == SNDRV_PCM_TSTAMP_ENABLE) 355 snd_pcm_gettime(runtime, (struct timespec *)&runtime->status->tstamp); 303 356 304 357 return snd_pcm_update_hw_ptr_post(substream, runtime); … … 320 373 return -EPIPE; 321 374 } 375 if (xrun_debug(substream, 16)) { 376 char name[16]; 377 pcm_debug_name(substream, name, sizeof(name)); 378 snd_printd("hw_update: %s: pos=0x%x/0x%x/0x%x, " 379 "hwptr=0x%lx, hw_base=0x%lx, hw_intr=0x%lx\n", 380 name, (unsigned int)pos, 381 (unsigned int)runtime->period_size, 382 (unsigned int)runtime->buffer_size, 383 (unsigned long)old_hw_ptr, 384 (unsigned long)runtime->hw_ptr_base, 385 (unsigned long)runtime->hw_ptr_interrupt); 386 } 387 322 388 hw_base = runtime->hw_ptr_base; 323 389 new_hw_ptr = hw_base + pos; … … 340 406 new_hw_ptr = hw_base + pos; 341 407 } 408 /* Do jiffies check only in xrun_debug mode */ 409 if (!xrun_debug(substream, 4)) 410 goto no_jiffies_check; 411 if (delta < runtime->delay) 412 goto no_jiffies_check; 413 delta -= runtime->delay; 342 414 if (((delta * HZ) / runtime->rate) > jdelta + HZ/100) { 343 415 hw_ptr_error(substream, … … 349 421 return 0; 350 422 } 423 no_jiffies_check: 351 424 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK && 352 425 runtime->silence_size > 0) 353 426 snd_pcm_playback_silence(substream, new_hw_ptr); 354 427 428 if (runtime->status->hw_ptr == new_hw_ptr) 429 return 0; 430 355 431 runtime->hw_ptr_base = hw_base; 356 432 runtime->status->hw_ptr = new_hw_ptr; 357 433 runtime->hw_ptr_jiffies = jiffies; 434 if (runtime->tstamp_mode == SNDRV_PCM_TSTAMP_ENABLE) 435 snd_pcm_gettime(runtime, (struct timespec *)&runtime->status->tstamp); 358 436 359 437 return snd_pcm_update_hw_ptr_post(substream, runtime); … … 449 527 return UINT_MAX; 450 528 } 451 div64_32(&n, c, r);529 n = div_u64_rem(n, c, r); 452 530 if (n >= UINT_MAX) { 453 531 *r = 0; … … 873 951 { 874 952 unsigned int k; 875 int changed = 0;953 struct snd_interval list_range; 876 954 877 955 if (!count) { … … 879 957 return -EINVAL; 880 958 } 959 snd_interval_any(&list_range); 960 list_range.min = UINT_MAX; 961 list_range.max = 0; 881 962 for (k = 0; k < count; k++) { 882 963 if (mask && !(mask & (1 << k))) 883 964 continue; 884 if (i->min == list[k] && !i->openmin) 885 goto _l1; 886 if (i->min < list[k]) { 887 i->min = list[k]; 888 i->openmin = 0; 889 changed = 1; 890 goto _l1; 891 } 965 if (!snd_interval_test(i, list[k])) 966 continue; 967 list_range.min = min(list_range.min, list[k]); 968 list_range.max = max(list_range.max, list[k]); 892 969 } 893 i->empty = 1; 894 return -EINVAL; 895 _l1: 896 for (k = count; k-- > 0;) { 897 if (mask && !(mask & (1 << k))) 898 continue; 899 if (i->max == list[k] && !i->openmax) 900 goto _l2; 901 if (i->max > list[k]) { 902 i->max = list[k]; 903 i->openmax = 0; 904 changed = 1; 905 goto _l2; 906 } 907 } 908 i->empty = 1; 909 return -EINVAL; 910 _l2: 911 if (snd_interval_checkempty(i)) { 912 i->empty = 1; 913 return -EINVAL; 914 } 915 return changed; 970 return snd_interval_refine(i, &list_range); 916 971 } 917 972 … … 1482 1537 else 1483 1538 runtime->status->hw_ptr = 0; 1484 runtime->hw_ptr_jiffies = jiffies;1485 1539 snd_pcm_stream_unlock_irqrestore(substream, flags); 1486 1540 return 0; … … 1522 1576 } 1523 1577 1578 static int snd_pcm_lib_ioctl_fifo_size(struct snd_pcm_substream *substream, 1579 void *arg) 1580 { 1581 struct snd_pcm_hw_params *params = arg; 1582 snd_pcm_format_t format; 1583 int channels, width; 1584 1585 params->fifo_size = substream->runtime->hw.fifo_size; 1586 if (!(substream->runtime->hw.info & SNDRV_PCM_INFO_FIFO_IN_FRAMES)) { 1587 format = params_format(params); 1588 channels = params_channels(params); 1589 width = snd_pcm_format_physical_width(format); 1590 params->fifo_size /= width * channels; 1591 } 1592 return 0; 1593 } 1594 1524 1595 /** 1525 1596 * snd_pcm_lib_ioctl - a generic PCM ioctl callback … … 1543 1614 case SNDRV_PCM_IOCTL1_CHANNEL_INFO: 1544 1615 return snd_pcm_lib_ioctl_channel_info(substream, arg); 1616 case SNDRV_PCM_IOCTL1_FIFO_SIZE: 1617 return snd_pcm_lib_ioctl_fifo_size(substream, arg); 1545 1618 } 1546 1619 return -ENXIO; -
GPL/trunk/alsa-kernel/core/pcm_memory.c
r399 r464 305 305 EXPORT_SYMBOL(snd_pcm_lib_preallocate_pages_for_all); 306 306 307 #ifdef CONFIG_SND_DMA_SGBUF 307 308 /** 308 309 * snd_pcm_sgbuf_ops_page - get the page struct at the given offset … … 350 351 } 351 352 EXPORT_SYMBOL(snd_pcm_sgbuf_get_chunk_size); 353 #endif /* CONFIG_SND_DMA_SGBUF */ 352 354 353 355 /** -
GPL/trunk/alsa-kernel/core/pcm_native.c
r446 r464 324 324 hw = &substream->runtime->hw; 325 325 if (!params->info) 326 params->info = hw->info; 327 if (!params->fifo_size) 328 params->fifo_size = hw->fifo_size; 326 params->info = hw->info & ~SNDRV_PCM_INFO_FIFO_IN_FRAMES; 327 if (!params->fifo_size) { 328 if (snd_mask_min(¶ms->masks[SNDRV_PCM_HW_PARAM_FORMAT]) == 329 snd_mask_max(¶ms->masks[SNDRV_PCM_HW_PARAM_FORMAT]) && 330 snd_mask_min(¶ms->masks[SNDRV_PCM_HW_PARAM_CHANNELS]) == 331 snd_mask_max(¶ms->masks[SNDRV_PCM_HW_PARAM_CHANNELS])) { 332 changed = substream->ops->ioctl(substream, 333 SNDRV_PCM_IOCTL1_FIFO_SIZE, params); 334 if (changed < 0) 335 return changed; 336 } 337 } 329 338 params->rmask = 0; 330 339 return 0; … … 599 608 status->avail = snd_pcm_playback_avail(runtime); 600 609 if (runtime->status->state == SNDRV_PCM_STATE_RUNNING || 601 runtime->status->state == SNDRV_PCM_STATE_DRAINING) 610 runtime->status->state == SNDRV_PCM_STATE_DRAINING) { 602 611 status->delay = runtime->buffer_size - status->avail; 603 else 612 status->delay += runtime->delay; 613 } else 604 614 status->delay = 0; 605 615 } else { 606 616 status->avail = snd_pcm_capture_avail(runtime); 607 617 if (runtime->status->state == SNDRV_PCM_STATE_RUNNING) 608 status->delay = status->avail ;618 status->delay = status->avail + runtime->delay; 609 619 else 610 620 status->delay = 0; … … 860 870 struct snd_pcm_runtime *runtime = substream->runtime; 861 871 snd_pcm_trigger_tstamp(substream); 872 runtime->hw_ptr_jiffies = jiffies; 862 873 runtime->status->state = state; 863 874 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK && … … 973 984 if (substream->runtime->trigger_master != substream) 974 985 return 0; 986 /* The jiffies check in snd_pcm_update_hw_ptr*() is done by 987 * a delta betwen the current jiffies, this gives a large enough 988 * delta, effectively to skip the check once. 989 */ 990 substream->runtime->hw_ptr_jiffies = jiffies - HZ * 1000; 975 991 return substream->ops->trigger(substream, 976 992 push ? SNDRV_PCM_TRIGGER_PAUSE_PUSH : … … 1339 1355 static int snd_pcm_pre_drain_init(struct snd_pcm_substream *substream, int state) 1340 1356 { 1341 if (substream->f_flags & O_NONBLOCK)1342 return -EAGAIN;1343 1357 substream->runtime->trigger_master = substream; 1344 1358 return 0; … … 1388 1402 struct snd_pcm_substream *substream; 1389 1403 wait_queue_t wait; 1390 snd_pcm_uframes_t stop_threshold;1391 1404 }; 1392 1405 … … 1400 1413 * (capture only) state. 1401 1414 */ 1402 static int snd_pcm_drain(struct snd_pcm_substream *substream) 1415 static int snd_pcm_drain(struct snd_pcm_substream *substream, 1416 struct file *file) 1403 1417 { 1404 1418 struct snd_card *card; … … 1407 1421 int result = 0; 1408 1422 int i, num_drecs; 1423 int nonblock = 0; 1409 1424 struct drain_rec *drec, drec_tmp, *d; 1410 1425 … … 1423 1438 } 1424 1439 } 1440 1441 if (file) { 1442 if (file->f_flags & O_NONBLOCK) 1443 nonblock = 1; 1444 } else if (substream->f_flags & O_NONBLOCK) 1445 nonblock = 1; 1446 1447 if (nonblock) 1448 goto lock; /* no need to allocate waitqueues */ 1425 1449 1426 1450 /* allocate temporary record for drain sync */ … … 1445 1469 init_waitqueue_entry(&d->wait, current); 1446 1470 add_wait_queue(&runtime->sleep, &d->wait); 1447 /* stop_threshold fixup to avoid endless loop when1448 * stop_threshold > buffer_size1449 */1450 d->stop_threshold = runtime->stop_threshold;1451 if (runtime->stop_threshold > runtime->buffer_size)1452 runtime->stop_threshold = runtime->buffer_size;1453 1471 } 1454 1472 } 1455 1473 up_read(&snd_pcm_link_rwsem); 1456 1474 1475 lock: 1457 1476 snd_pcm_stream_lock_irq(substream); 1458 1477 /* resume pause */ … … 1462 1481 /* pre-start/stop - all running streams are changed to DRAINING state */ 1463 1482 result = snd_pcm_action(&snd_pcm_action_drain_init, substream, 0); 1464 if (result < 0) { 1465 snd_pcm_stream_unlock_irq(substream); 1466 goto _error; 1483 if (result < 0) 1484 goto unlock; 1485 /* in non-blocking, we don't wait in ioctl but let caller poll */ 1486 if (nonblock) { 1487 result = -EAGAIN; 1488 goto unlock; 1467 1489 } 1468 1490 … … 1500 1522 } 1501 1523 1524 unlock: 1502 1525 snd_pcm_stream_unlock_irq(substream); 1503 1526 1504 _error: 1505 for (i = 0; i < num_drecs; i++) { 1506 d = &drec[i]; 1507 runtime = d->substream->runtime; 1508 remove_wait_queue(&runtime->sleep, &d->wait); 1509 runtime->stop_threshold = d->stop_threshold; 1510 } 1511 1512 if (drec != &drec_tmp) 1513 kfree(drec); 1527 if (!nonblock) { 1528 for (i = 0; i < num_drecs; i++) { 1529 d = &drec[i]; 1530 runtime = d->substream->runtime; 1531 remove_wait_queue(&runtime->sleep, &d->wait); 1532 } 1533 if (drec != &drec_tmp) 1534 kfree(drec); 1535 } 1514 1536 snd_power_unlock(card); 1515 1537 … … 2215 2237 ret = -EPIPE; 2216 2238 goto __end; 2239 case SNDRV_PCM_STATE_SUSPENDED: 2240 ret = -ESTRPIPE; 2241 goto __end; 2217 2242 default: 2218 2243 ret = -EBADFD; … … 2259 2284 case SNDRV_PCM_STATE_XRUN: 2260 2285 ret = -EPIPE; 2286 goto __end; 2287 case SNDRV_PCM_STATE_SUSPENDED: 2288 ret = -ESTRPIPE; 2261 2289 goto __end; 2262 2290 default: … … 2306 2334 ret = -EPIPE; 2307 2335 goto __end; 2336 case SNDRV_PCM_STATE_SUSPENDED: 2337 ret = -ESTRPIPE; 2338 goto __end; 2308 2339 default: 2309 2340 ret = -EBADFD; … … 2351 2382 case SNDRV_PCM_STATE_XRUN: 2352 2383 ret = -EPIPE; 2384 goto __end; 2385 case SNDRV_PCM_STATE_SUSPENDED: 2386 ret = -ESTRPIPE; 2353 2387 goto __end; 2354 2388 default: … … 2427 2461 else 2428 2462 n = snd_pcm_capture_avail(runtime); 2463 n += runtime->delay; 2429 2464 break; 2430 2465 case SNDRV_PCM_STATE_XRUN: … … 2550 2585 #endif 2551 2586 case SNDRV_PCM_IOCTL_DRAIN: 2552 return snd_pcm_drain(substream );2587 return snd_pcm_drain(substream, file); 2553 2588 case SNDRV_PCM_IOCTL_DROP: 2554 2589 return snd_pcm_drop(substream); -
GPL/trunk/alsa-kernel/core/rawmidi.c
r446 r464 283 283 substream->opened = 1; 284 284 if (substream->use_count++ == 0) 285 substream->active_sensing = 1;285 substream->active_sensing = 0; 286 286 if (mode & SNDRV_RAWMIDI_LFLG_APPEND) 287 287 substream->append = 1; -
GPL/trunk/alsa-kernel/core/seq/oss/seq_oss_midi.c
r447 r464 21 21 */ 22 22 23 #include <sound/asoundef.h> 23 24 #include "seq_oss_midi.h" 24 25 #include "seq_oss_readq.h" … … 477 478 if (dp->seq_mode == SNDRV_SEQ_OSS_MODE_SYNTH) { 478 479 ev.type = SNDRV_SEQ_EVENT_SENSING; 479 snd_seq_oss_dispatch(dp, &ev, 0, 0); /* active sensing */480 snd_seq_oss_dispatch(dp, &ev, 0, 0); 480 481 } 481 482 for (c = 0; c < 16; c++) { 482 483 ev.type = SNDRV_SEQ_EVENT_CONTROLLER; 483 484 ev.data.control.channel = c; 484 ev.data.control.param = 123;485 snd_seq_oss_dispatch(dp, &ev, 0, 0); /* all notes off */485 ev.data.control.param = MIDI_CTL_ALL_NOTES_OFF; 486 snd_seq_oss_dispatch(dp, &ev, 0, 0); 486 487 if (dp->seq_mode == SNDRV_SEQ_OSS_MODE_MUSIC) { 487 ev.data.control.param = 121; 488 snd_seq_oss_dispatch(dp, &ev, 0, 0); /* reset all controllers */ 488 ev.data.control.param = 489 MIDI_CTL_RESET_CONTROLLERS; 490 snd_seq_oss_dispatch(dp, &ev, 0, 0); 489 491 ev.type = SNDRV_SEQ_EVENT_PITCHBEND; 490 492 ev.data.control.value = 0; 491 snd_seq_oss_dispatch(dp, &ev, 0, 0); /* bender off */493 snd_seq_oss_dispatch(dp, &ev, 0, 0); 492 494 } 493 495 } -
GPL/trunk/alsa-kernel/core/seq/seq_midi.c
r399 r464 121 121 runtime = substream->runtime; 122 122 if ((tmp = runtime->avail) < count) { 123 snd_printd("warning, output event was lost (count = %i, available = %i)\n", count, tmp); 123 if (printk_ratelimit()) 124 snd_printk(KERN_ERR "MIDI output buffer overrun\n"); 124 125 return -ENOMEM; 125 126 } … … 237 238 params.avail_min = 1; 238 239 params.buffer_size = output_buffer_size; 240 params.no_active_sensing = 1; 239 241 if ((err = snd_rawmidi_output_params(msynth->output_rfile.output, ¶ms)) < 0) { 240 242 snd_rawmidi_kernel_release(&msynth->output_rfile); … … 249 251 { 250 252 struct seq_midisynth *msynth = private_data; 251 unsigned char buf = 0xff; /* MIDI reset */252 253 253 254 if (snd_BUG_ON(!msynth->output_rfile.output)) 254 255 return -EINVAL; 255 /* sending single MIDI reset message to shut the device up */256 snd_rawmidi_kernel_write(msynth->output_rfile.output, &buf, 1);257 256 snd_rawmidi_drain_output(msynth->output_rfile.output); 258 257 return snd_rawmidi_kernel_release(&msynth->output_rfile); -
GPL/trunk/alsa-kernel/core/seq/seq_midi_event.c
r305 r464 505 505 return -ENOMEM; 506 506 cmd = MIDI_CMD_CONTROL|(ev->data.control.channel & 0x0f); 507 bytes[0] = ev->data.control.param & 0x007f;508 bytes[1] = (ev->data.control.param & 0x3f80) >> 7;509 bytes[2] = ev->data.control.value & 0x007f;510 bytes[3] = (ev->data.control.value & 0x3f80) >> 7;507 bytes[0] = (ev->data.control.param & 0x3f80) >> 7; 508 bytes[1] = ev->data.control.param & 0x007f; 509 bytes[2] = (ev->data.control.value & 0x3f80) >> 7; 510 bytes[3] = ev->data.control.value & 0x007f; 511 511 if (cmd != dev->lastcmd && !dev->nostat) { 512 512 if (count < 9) -
GPL/trunk/alsa-kernel/core/vmaster.c
r426 r464 354 354 * The optional argument @tlv can be used to specify the TLV information 355 355 * for dB scale of the master control. It should be a single element 356 * with #SNDRV_CTL_TLVT_DB_SCALE type, and should be the max 0dB. 356 * with #SNDRV_CTL_TLVT_DB_SCALE, #SNDRV_CTL_TLV_DB_MINMAX or 357 * #SNDRV_CTL_TLVT_DB_MINMAX_MUTE type, and should be the max 0dB. 357 358 */ 358 359 struct snd_kcontrol *snd_ctl_make_virtual_master(char *name, … … 385 386 386 387 /* additional (constant) TLV read */ 387 if (tlv && tlv[0] == SNDRV_CTL_TLVT_DB_SCALE) { 388 if (tlv && 389 (tlv[0] == SNDRV_CTL_TLVT_DB_SCALE || 390 tlv[0] == SNDRV_CTL_TLVT_DB_MINMAX || 391 tlv[0] == SNDRV_CTL_TLVT_DB_MINMAX_MUTE)) { 388 392 kctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_TLV_READ; 389 393 memcpy(master->tlv, tlv, sizeof(master->tlv)); -
GPL/trunk/alsa-kernel/include/sound/ac97_codec.h
r402 r464 32 32 #include "control.h" 33 33 #include "info.h" 34 35 /* maximum number of devices on the AC97 bus */ 36 #define AC97_BUS_MAX_DEVICES 4 34 37 35 38 /* … … 650 653 extern struct bus_type ac97_bus_type; 651 654 655 /* AC97 platform_data adding function */ 656 static inline void snd_ac97_dev_add_pdata(struct snd_ac97 *ac97, void *data) 657 { 658 ac97->dev.platform_data = data; 659 } 660 652 661 #endif /* __SOUND_AC97_CODEC_H */ -
GPL/trunk/alsa-kernel/include/sound/asound.h
r426 r464 162 162 *****************************************************************************/ 163 163 164 #define SNDRV_PCM_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 9)164 #define SNDRV_PCM_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 10) 165 165 166 166 typedef unsigned long snd_pcm_uframes_t; … … 279 279 #define SNDRV_PCM_INFO_JOINT_DUPLEX 0x00200000 /* playback and capture stream are somewhat correlated */ 280 280 #define SNDRV_PCM_INFO_SYNC_START 0x00400000 /* pcm support some kind of sync go */ 281 #define SNDRV_PCM_INFO_FIFO_IN_FRAMES 0x80000000 /* internal kernel flag - FIFO size is in frames */ 281 282 282 283 typedef int __bitwise snd_pcm_state_t; -
GPL/trunk/alsa-kernel/include/sound/config.h
r455 r464 85 85 #define CONFIG_SND_DEBUG_DETECT 86 86 #define CONFIG_SND_DEBUG_VERBOSE 87 #define CONFIG_SND_DMA_SGBUF 87 88 #define CONFIG_SND_HDA_CODEC_ANALOG 88 89 #define CONFIG_SND_HDA_CODEC_ATIHDMI -
GPL/trunk/alsa-kernel/include/sound/core.h
r426 r464 324 324 struct snd_card **card_ret); 325 325 326 static inline __deprecated327 struct snd_card *snd_card_new(int idx, const char *id,328 struct module *module, int extra_size)329 {330 struct snd_card *card;331 if (snd_card_create(idx, id, module, extra_size, &card) < 0)332 return NULL;333 return card;334 }335 336 326 int snd_card_disconnect(struct snd_card *card); 337 327 int snd_card_free(struct snd_card *card); 338 328 int snd_card_free_when_closed(struct snd_card *card); 329 void snd_card_set_id(struct snd_card *card, const char *id); 339 330 int snd_card_register(struct snd_card *card); 340 331 int snd_card_info_init(void); … … 373 364 void release_and_free_resource(struct resource *res); 374 365 375 #ifdef CONFIG_SND_VERBOSE_PRINTK376 void snd_verbose_printk(const char *file, int line, const char *format, ...)377 __attribute__ ((format (printf, 3, 4)));378 #endif379 #if defined(CONFIG_SND_DEBUG) && defined(CONFIG_SND_VERBOSE_PRINTK)380 void snd_verbose_printd(const char *file, int line, const char *format, ...)381 __attribute__ ((format (printf, 3, 4)));382 #endif383 384 366 /* --- */ 385 367 386 #ifdef CONFIG_SND_VERBOSE_PRINTK 368 #if defined(CONFIG_SND_DEBUG) || defined(CONFIG_SND_VERBOSE_PRINTK) 369 void __snd_printk(unsigned int level, const char *file, int line, 370 const char *format, ...) 371 __attribute__ ((format (printf, 4, 5))); 372 #else 373 #ifndef TARGET_OS2 374 #define __snd_printk(level, file, line, format, args...) \ 375 printk(format, ##args) 376 #else 377 #define __snd_printk printk 378 #endif /* nothing */ 379 #endif 380 387 381 /** 388 382 * snd_printk - printk wrapper … … 392 386 * when configured with CONFIG_SND_VERBOSE_PRINTK. 393 387 */ 388 #ifndef TARGET_OS2 394 389 #define snd_printk(fmt, args...) \ 395 snd_verbose_printk(__FILE__, __LINE__, fmt ,##args) 396 #else 397 #ifndef TARGET_OS2 398 #define snd_printk(fmt, args...) \ 399 printk(fmt ,##args) 390 __snd_printk(0, __FILE__, __LINE__, fmt, ##args) 400 391 #else 401 392 #define snd_printk printk 402 393 #endif 403 #endif404 394 405 395 #ifdef CONFIG_SND_DEBUG 406 407 #ifdef CONFIG_SND_VERBOSE_PRINTK408 396 /** 409 397 * snd_printd - debug printk … … 414 402 */ 415 403 #define snd_printd(fmt, args...) \ 416 snd_verbose_printd(__FILE__, __LINE__, fmt ,##args) 417 #else 418 #define snd_printd(fmt, args...) \ 419 printk(fmt ,##args) 420 #endif 404 __snd_printk(1, __FILE__, __LINE__, fmt, ##args) 421 405 422 406 /** … … 478 462 */ 479 463 #ifndef TARGET_OS2 480 #define snd_printdd(format, args...) snd_printk(format, ##args) 464 #define snd_printdd(format, args...) \ 465 __snd_printk(2, __FILE__, __LINE__, format, ##args) 481 466 #else 482 467 #define snd_printdd snd_printk … … 484 469 #else 485 470 #ifndef TARGET_OS2 486 #define snd_printdd(format, args...) /* nothing */471 #define snd_printdd(format, args...) do { } while (0) 487 472 #else 488 473 #define snd_printdd 1 ? (void)0 : (void)((int (*)(char *, ...)) NULL) -
GPL/trunk/alsa-kernel/include/sound/memalloc.h
r410 r464 48 48 #define SNDRV_DMA_TYPE_CONTINUOUS 1 /* continuous no-DMA memory */ 49 49 #define SNDRV_DMA_TYPE_DEV 2 /* generic device continuous */ 50 #ifdef CONFIG_SND_DMA_SGBUF 50 51 #define SNDRV_DMA_TYPE_DEV_SG 3 /* generic device SG-buffer */ 52 #else 53 #define SNDRV_DMA_TYPE_DEV_SG SNDRV_DMA_TYPE_DEV /* no SG-buf support */ 54 #endif 51 55 52 56 /* … … 61 65 }; 62 66 67 #ifdef CONFIG_SND_DMA_SGBUF 63 68 /* 64 69 * Scatter-Gather generic device pages … … 108 113 return sgbuf->table[offset >> PAGE_SHIFT].buf + offset % PAGE_SIZE; 109 114 } 115 #endif /* CONFIG_SND_DMA_SGBUF */ 110 116 111 117 /* allocate/release a buffer */ -
GPL/trunk/alsa-kernel/include/sound/pcm.h
r426 r464 99 99 #define SNDRV_PCM_IOCTL1_CHANNEL_INFO 2 100 100 #define SNDRV_PCM_IOCTL1_GSTATE 3 101 #define SNDRV_PCM_IOCTL1_FIFO_SIZE 4 101 102 102 103 #define SNDRV_PCM_TRIGGER_STOP 0 … … 271 272 snd_pcm_uframes_t hw_ptr_interrupt; /* Position at interrupt time */ 272 273 unsigned long hw_ptr_jiffies; /* Time when hw_ptr is updated */ 274 snd_pcm_sframes_t delay; /* extra delay; typically FIFO size */ 273 275 274 276 /* -- HW params -- */ … … 490 492 void snd_pcm_vma_notify_data(void *client, void *data); 491 493 int snd_pcm_mmap_data(struct snd_pcm_substream *substream, struct file *file, struct vm_area_struct *area); 492 493 #if BITS_PER_LONG >= 64494 495 static inline void div64_32(u_int64_t *n, u_int32_t div, u_int32_t *rem)496 {497 *rem = *n % div;498 *n /= div;499 }500 501 #elif defined(i386)502 503 static inline void div64_32(u_int64_t *n, u_int32_t div, u_int32_t *rem)504 {505 u_int32_t low, high;506 low = *n & 0xffffffff;507 high = *n >> 32;508 if (high) {509 u_int32_t high1 = high % div;510 high /= div;511 asm("divl %2":"=a" (low), "=d" (*rem):"rm" (div), "a" (low), "d" (high1));512 *n = (u_int64_t)high << 32 | low;513 } else {514 *n = low / div;515 *rem = low % div;516 }517 }518 #else519 520 static inline void divl(u_int32_t high, u_int32_t low,521 u_int32_t div,522 u_int32_t *q, u_int32_t *r)523 {524 u_int64_t n = (u_int64_t)high << 32 | low;525 u_int64_t d = (u_int64_t)div << 31;526 u_int32_t q1 = 0;527 int c = 32;528 while (n > 0xffffffffU) {529 q1 <<= 1;530 if (n >= d) {531 n -= d;532 q1 |= 1;533 }534 d >>= 1;535 c--;536 }537 q1 <<= c;538 if (n) {539 low = n;540 *q = q1 | (low / div);541 *r = low % div;542 } else {543 *r = 0;544 *q = q1;545 }546 return;547 }548 549 static inline void div64_32(u_int64_t *n, u_int32_t div, u_int32_t *rem)550 {551 u_int32_t low, high;552 low = *n & 0xffffffff;553 high = *n >> 32;554 if (high) {555 u_int32_t high1 = high % div;556 u_int32_t low1 = low;557 high /= div;558 divl(high1, low1, div, &low, rem);559 *n = (u_int64_t)high << 32 | low;560 } else {561 *n = low / div;562 *rem = low % div;563 }564 }565 #endif566 494 567 495 /* … … 992 920 int snd_pcm_lib_free_pages(struct snd_pcm_substream *substream); 993 921 922 #ifdef CONFIG_SND_DMA_SGBUF 994 923 /* 995 924 * SG-buffer handling … … 1016 945 unsigned int snd_pcm_sgbuf_get_chunk_size(struct snd_pcm_substream *substream, 1017 946 unsigned int ofs, unsigned int size); 947 948 #else /* !SND_DMA_SGBUF */ 949 /* 950 * fake using a continuous buffer 951 */ 952 static inline dma_addr_t 953 snd_pcm_sgbuf_get_addr(struct snd_pcm_substream *substream, unsigned int ofs) 954 { 955 return substream->runtime->dma_addr + ofs; 956 } 957 958 static inline void * 959 snd_pcm_sgbuf_get_ptr(struct snd_pcm_substream *substream, unsigned int ofs) 960 { 961 return substream->runtime->dma_area + ofs; 962 } 963 964 #define snd_pcm_sgbuf_ops_page NULL 965 966 #define snd_pcm_sgbuf_get_chunk_size(subs, ofs, size) (size) 967 968 #endif /* SND_DMA_SGBUF */ 1018 969 1019 970 /* handle mmap counter - PCM mmap callback should handle this counter properly */ -
GPL/trunk/alsa-kernel/include/sound/soc-dapm.h
r426 r464 138 138 139 139 /* stream domain */ 140 #define SND_SOC_DAPM_AIF_IN(wname, stname, wslot, wreg, wshift, winvert) \ 141 { .id = snd_soc_dapm_aif_in, .name = wname, .sname = stname, \ 142 .reg = wreg, .shift = wshift, .invert = winvert } 143 #define SND_SOC_DAPM_AIF_OUT(wname, stname, wslot, wreg, wshift, winvert) \ 144 { .id = snd_soc_dapm_aif_out, .name = wname, .sname = stname, \ 145 .reg = wreg, .shift = wshift, .invert = winvert } 140 146 #define SND_SOC_DAPM_DAC(wname, stname, wreg, wshift, winvert) \ 141 147 { .id = snd_soc_dapm_dac, .name = wname, .sname = stname, .reg = wreg, \ 142 148 .shift = wshift, .invert = winvert} 149 #define SND_SOC_DAPM_DAC_E(wname, stname, wreg, wshift, winvert, \ 150 wevent, wflags) \ 151 { .id = snd_soc_dapm_dac, .name = wname, .sname = stname, .reg = wreg, \ 152 .shift = wshift, .invert = winvert, \ 153 .event = wevent, .event_flags = wflags} 143 154 #define SND_SOC_DAPM_ADC(wname, stname, wreg, wshift, winvert) \ 144 155 { .id = snd_soc_dapm_adc, .name = wname, .sname = stname, .reg = wreg, \ 145 156 .shift = wshift, .invert = winvert} 146 147 /* generic register modifier widget */ 157 #define SND_SOC_DAPM_ADC_E(wname, stname, wreg, wshift, winvert, \ 158 wevent, wflags) \ 159 { .id = snd_soc_dapm_adc, .name = wname, .sname = stname, .reg = wreg, \ 160 .shift = wshift, .invert = winvert, \ 161 .event = wevent, .event_flags = wflags} 162 163 /* generic widgets */ 148 164 #define SND_SOC_DAPM_REG(wid, wname, wreg, wshift, wmask, won_val, woff_val) \ 149 165 { .id = wid, .name = wname, .kcontrols = NULL, .num_kcontrols = 0, \ … … 151 167 .on_val = won_val, .off_val = woff_val, .event = dapm_reg_event, \ 152 168 .event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD} 169 #define SND_SOC_DAPM_SUPPLY(wname, wreg, wshift, winvert, wevent, wflags) \ 170 { .id = snd_soc_dapm_supply, .name = wname, .reg = wreg, \ 171 .shift = wshift, .invert = winvert, .event = wevent, \ 172 .event_flags = wflags} 153 173 154 174 /* dapm kcontrol types */ … … 266 286 int snd_soc_dapm_stream_event(struct snd_soc_codec *codec, char *stream, 267 287 int event); 268 int snd_soc_dapm_set_bias_level(struct snd_soc_device *socdev, 269 enum snd_soc_bias_level level); 288 void snd_soc_dapm_shutdown(struct snd_soc_device *socdev); 270 289 271 290 /* dapm sys fs - used by the core */ 272 291 int snd_soc_dapm_sys_add(struct device *dev); 292 void snd_soc_dapm_debugfs_init(struct snd_soc_codec *codec); 273 293 274 294 /* dapm audio pin control and status */ … … 299 319 snd_soc_dapm_pre, /* machine specific pre widget - exec first */ 300 320 snd_soc_dapm_post, /* machine specific post widget - exec last */ 321 snd_soc_dapm_supply, /* power/clock supply */ 322 snd_soc_dapm_aif_in, /* audio interface input */ 323 snd_soc_dapm_aif_out, /* audio interface output */ 301 324 }; 302 325 … … 358 381 unsigned char pmdown:1; /* waiting for timeout */ 359 382 383 int (*power_check)(struct snd_soc_dapm_widget *w); 384 360 385 /* external events */ 361 386 unsigned short event_flags; /* flags to specify event types */ … … 369 394 struct list_head sources; 370 395 struct list_head sinks; 396 397 /* used during DAPM updates */ 398 struct list_head power_list; 371 399 }; 372 400 -
GPL/trunk/alsa-kernel/include/sound/soc.h
r426 r464 119 119 .get = xhandler_get, .put = xhandler_put, \ 120 120 .private_value = SOC_SINGLE_VALUE(xreg, xshift, xmax, xinvert) } 121 #define SOC_DOUBLE_EXT(xname, xreg, shift_left, shift_right, xmax, xinvert,\ 122 xhandler_get, xhandler_put) \ 123 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\ 124 .info = snd_soc_info_volsw, \ 125 .get = xhandler_get, .put = xhandler_put, \ 126 .private_value = (unsigned long)&(struct soc_mixer_control) \ 127 {.reg = xreg, .shift = shift_left, .rshift = shift_right, \ 128 .max = xmax, .invert = xinvert} } 121 129 #define SOC_SINGLE_EXT_TLV(xname, xreg, xshift, xmax, xinvert,\ 122 130 xhandler_get, xhandler_put, tlv_array) \ … … 128 136 .get = xhandler_get, .put = xhandler_put, \ 129 137 .private_value = SOC_SINGLE_VALUE(xreg, xshift, xmax, xinvert) } 138 #define SOC_DOUBLE_EXT_TLV(xname, xreg, shift_left, shift_right, xmax, xinvert,\ 139 xhandler_get, xhandler_put, tlv_array) \ 140 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \ 141 .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \ 142 SNDRV_CTL_ELEM_ACCESS_READWRITE, \ 143 .tlv.p = (tlv_array), \ 144 .info = snd_soc_info_volsw, \ 145 .get = xhandler_get, .put = xhandler_put, \ 146 .private_value = (unsigned long)&(struct soc_mixer_control) \ 147 {.reg = xreg, .shift = shift_left, .rshift = shift_right, \ 148 .max = xmax, .invert = xinvert} } 149 #define SOC_DOUBLE_R_EXT_TLV(xname, reg_left, reg_right, xshift, xmax, xinvert,\ 150 xhandler_get, xhandler_put, tlv_array) \ 151 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \ 152 .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \ 153 SNDRV_CTL_ELEM_ACCESS_READWRITE, \ 154 .tlv.p = (tlv_array), \ 155 .info = snd_soc_info_volsw_2r, \ 156 .get = xhandler_get, .put = xhandler_put, \ 157 .private_value = (unsigned long)&(struct soc_mixer_control) \ 158 {.reg = reg_left, .rreg = reg_right, .shift = xshift, \ 159 .max = xmax, .invert = xinvert} } 130 160 #define SOC_SINGLE_BOOL_EXT(xname, xdata, xhandler_get, xhandler_put) \ 131 161 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ … … 180 210 extern struct snd_ac97_bus_ops soc_ac97_ops; 181 211 212 enum snd_soc_control_type { 213 SND_SOC_CUSTOM, 214 SND_SOC_I2C, 215 SND_SOC_SPI, 216 }; 217 182 218 int snd_soc_register_platform(struct snd_soc_platform *platform); 183 219 void snd_soc_unregister_platform(struct snd_soc_platform *platform); 184 220 int snd_soc_register_codec(struct snd_soc_codec *codec); 185 221 void snd_soc_unregister_codec(struct snd_soc_codec *codec); 222 int snd_soc_codec_volatile_register(struct snd_soc_codec *codec, int reg); 223 int snd_soc_codec_set_cache_io(struct snd_soc_codec *codec, 224 int addr_bits, int data_bits, 225 enum snd_soc_control_type control); 226 227 #ifdef CONFIG_PM 228 int snd_soc_suspend_device(struct device *dev); 229 int snd_soc_resume_device(struct device *dev); 230 #endif 186 231 187 232 /* pcm <-> DAI connect */ … … 207 252 #endif 208 253 209 /* codec IO */210 #define snd_soc_read(codec, reg) codec->read(codec, reg)211 #define snd_soc_write(codec, reg, value) codec->write(codec, reg, value)212 213 254 /* codec register bit access */ 214 255 int snd_soc_update_bits(struct snd_soc_codec *codec, unsigned short reg, 215 unsigned short mask, unsigned short value);256 unsigned int mask, unsigned int value); 216 257 int snd_soc_test_bits(struct snd_soc_codec *codec, unsigned short reg, 217 unsigned short mask, unsigned short value);258 unsigned int mask, unsigned int value); 218 259 219 260 int snd_soc_new_ac97_codec(struct snd_soc_codec *codec, … … 332 373 struct mutex mutex; 333 374 struct device *dev; 375 struct snd_soc_device *socdev; 334 376 335 377 struct list_head list; … … 352 394 int (*display_register)(struct snd_soc_codec *, char *, 353 395 size_t, unsigned int); 396 int (*volatile_register)(unsigned int); 397 int (*readable_register)(unsigned int); 354 398 hw_write_t hw_write; 355 hw_read_t hw_read;399 unsigned int (*hw_read)(struct snd_soc_codec *, unsigned int); 356 400 void *reg_cache; 357 401 short reg_cache_size; … … 373 417 struct dentry *debugfs_reg; 374 418 struct dentry *debugfs_pop_time; 419 struct dentry *debugfs_dapm; 375 420 #endif 376 421 }; … … 417 462 /* codec/machine specific init - e.g. add machine controls */ 418 463 int (*init)(struct snd_soc_codec *codec); 464 465 /* Symmetry requirements */ 466 unsigned int symmetric_rates:1; 467 468 /* Symmetry data - only valid if symmetry is being enforced */ 469 unsigned int rate; 419 470 420 471 /* DAI pcm */ … … 491 542 }; 492 543 544 /* codec IO */ 545 static inline unsigned int snd_soc_read(struct snd_soc_codec *codec, 546 unsigned int reg) 547 { 548 return codec->read(codec, reg); 549 } 550 551 static inline unsigned int snd_soc_write(struct snd_soc_codec *codec, 552 unsigned int reg, unsigned int val) 553 { 554 return codec->write(codec, reg, val); 555 } 556 493 557 #include <sound/soc-dai.h> 494 558 -
GPL/trunk/alsa-kernel/include/sound/tlv.h
r305 r464 36 36 #define SNDRV_CTL_TLVT_DB_LINEAR 2 /* linear volume */ 37 37 #define SNDRV_CTL_TLVT_DB_RANGE 3 /* dB range container */ 38 #define SNDRV_CTL_TLVT_DB_MINMAX 4 /* dB scale with min/max */ 39 #define SNDRV_CTL_TLVT_DB_MINMAX_MUTE 5 /* dB scale with min/max with mute */ 38 40 39 41 #define TLV_DB_SCALE_ITEM(min, step, mute) \ … … 42 44 #define DECLARE_TLV_DB_SCALE(name, min, step, mute) \ 43 45 unsigned int name[] = { TLV_DB_SCALE_ITEM(min, step, mute) } 46 47 /* dB scale specified with min/max values instead of step */ 48 #define TLV_DB_MINMAX_ITEM(min_dB, max_dB) \ 49 SNDRV_CTL_TLVT_DB_MINMAX, 2 * sizeof(unsigned int), \ 50 (min_dB), (max_dB) 51 #define TLV_DB_MINMAX_MUTE_ITEM(min_dB, max_dB) \ 52 SNDRV_CTL_TLVT_DB_MINMAX_MUTE, 2 * sizeof(unsigned int), \ 53 (min_dB), (max_dB) 54 #define DECLARE_TLV_DB_MINMAX(name, min_dB, max_dB) \ 55 unsigned int name[] = { TLV_DB_MINMAX_ITEM(min_dB, max_dB) } 56 #define DECLARE_TLV_DB_MINMAX_MUTE(name, min_dB, max_dB) \ 57 unsigned int name[] = { TLV_DB_MINMAX_MUTE_ITEM(min_dB, max_dB) } 44 58 45 59 /* linear volume between min_dB and max_dB (.01dB unit) */ -
GPL/trunk/alsa-kernel/include/sound/ymfpci.h
r305 r464 332 332 struct snd_rawmidi *rawmidi; 333 333 struct snd_timer *timer; 334 unsigned int timer_ticks; 334 335 335 336 struct pci_dev *pci; -
GPL/trunk/alsa-kernel/isa/cmi8330.c
r426 r464 1 1 /* 2 * Driver for C-Media's CMI8330 soundcards.2 * Driver for C-Media's CMI8330 and CMI8329 soundcards. 3 3 * Copyright (c) by George Talusan <gstalusan@uwaterloo.ca> 4 4 * http://www.undergrad.math.uwaterloo.ca/~gstalusa … … 36 36 * This card has two mixers and two PCM devices. I've cheesed it such 37 37 * that recording and playback can be done through the same device. 38 * The driver "magically" routes the capturing to the CMI8330codec,38 * The driver "magically" routes the capturing to the AD1848 codec, 39 39 * and playback to the SB16 codec. This allows for full-duplex mode 40 40 * to some extent. … … 65 65 */ 66 66 MODULE_AUTHOR("George Talusan <gstalusan@uwaterloo.ca>"); 67 MODULE_DESCRIPTION("C-Media CMI8330 ");67 MODULE_DESCRIPTION("C-Media CMI8330/CMI8329"); 68 68 MODULE_LICENSE("GPL"); 69 69 MODULE_SUPPORTED_DEVICE("{{C-Media,CMI8330,isapnp:{CMI0001,@@@0001,@X@0001}}}"); … … 87 87 88 88 module_param_array(index, int, NULL, 0444); 89 MODULE_PARM_DESC(index, "Index value for CMI8330 soundcard.");89 MODULE_PARM_DESC(index, "Index value for CMI8330/CMI8329 soundcard."); 90 90 module_param_array(id, charp, NULL, 0444); 91 MODULE_PARM_DESC(id, "ID string for CMI8330 soundcard.");91 MODULE_PARM_DESC(id, "ID string for CMI8330/CMI8329 soundcard."); 92 92 module_param_array(enable, bool, NULL, 0444); 93 MODULE_PARM_DESC(enable, "Enable CMI8330 soundcard.");93 MODULE_PARM_DESC(enable, "Enable CMI8330/CMI8329 soundcard."); 94 94 #ifdef CONFIG_PNP 95 95 module_param_array(isapnp, bool, NULL, 0444); … … 98 98 99 99 module_param_array(sbport, long, NULL, 0444); 100 MODULE_PARM_DESC(sbport, "Port # for CMI8330 SB driver.");100 MODULE_PARM_DESC(sbport, "Port # for CMI8330/CMI8329 SB driver."); 101 101 module_param_array(sbirq, int, NULL, 0444); 102 MODULE_PARM_DESC(sbirq, "IRQ # for CMI8330 SB driver.");102 MODULE_PARM_DESC(sbirq, "IRQ # for CMI8330/CMI8329 SB driver."); 103 103 module_param_array(sbdma8, int, NULL, 0444); 104 MODULE_PARM_DESC(sbdma8, "DMA8 for CMI8330 SB driver.");104 MODULE_PARM_DESC(sbdma8, "DMA8 for CMI8330/CMI8329 SB driver."); 105 105 module_param_array(sbdma16, int, NULL, 0444); 106 MODULE_PARM_DESC(sbdma16, "DMA16 for CMI8330 SB driver.");106 MODULE_PARM_DESC(sbdma16, "DMA16 for CMI8330/CMI8329 SB driver."); 107 107 108 108 module_param_array(wssport, long, NULL, 0444); 109 MODULE_PARM_DESC(wssport, "Port # for CMI8330 WSS driver.");109 MODULE_PARM_DESC(wssport, "Port # for CMI8330/CMI8329 WSS driver."); 110 110 module_param_array(wssirq, int, NULL, 0444); 111 MODULE_PARM_DESC(wssirq, "IRQ # for CMI8330 WSS driver.");111 MODULE_PARM_DESC(wssirq, "IRQ # for CMI8330/CMI8329 WSS driver."); 112 112 module_param_array(wssdma, int, NULL, 0444); 113 MODULE_PARM_DESC(wssdma, "DMA for CMI8330 WSS driver.");113 MODULE_PARM_DESC(wssdma, "DMA for CMI8330/CMI8329 WSS driver."); 114 114 115 115 module_param_array(fmport, long, NULL, 0444); 116 MODULE_PARM_DESC(fmport, "FM port # for CMI8330 driver.");116 MODULE_PARM_DESC(fmport, "FM port # for CMI8330/CMI8329 driver."); 117 117 module_param_array(mpuport, long, NULL, 0444); 118 MODULE_PARM_DESC(mpuport, "MPU-401 port # for CMI8330 driver.");118 MODULE_PARM_DESC(mpuport, "MPU-401 port # for CMI8330/CMI8329 driver."); 119 119 module_param_array(mpuirq, int, NULL, 0444); 120 MODULE_PARM_DESC(mpuirq, "IRQ # for CMI8330 MPU-401 port.");120 MODULE_PARM_DESC(mpuirq, "IRQ # for CMI8330/CMI8329 MPU-401 port."); 121 121 #ifdef CONFIG_PNP 122 122 static int isa_registered; … … 157 157 typedef int (*snd_pcm_open_callback_t)(struct snd_pcm_substream *); 158 158 159 enum card_type { 160 CMI8330, 161 CMI8329 162 }; 163 159 164 struct snd_cmi8330 { 160 165 #ifdef CONFIG_PNP … … 173 178 void *private_data; /* sb or wss */ 174 179 } streams[2]; 180 181 enum card_type type; 175 182 }; 176 183 … … 178 185 179 186 static struct pnp_card_device_id snd_cmi8330_pnpids[] = { 187 { .id = "CMI0001", .devs = { { "@X@0001" }, { "@@@0001" }, { "@H@0001" }, { "A@@0001" } } }, 180 188 { .id = "CMI0001", .devs = { { "@@@0001" }, { "@X@0001" }, { "@H@0001" } } }, 181 189 { .id = "" } … … 305 313 int err; 306 314 307 strcpy(card->mixername, "CMI8330/C3D");315 strcpy(card->mixername, (acard->type == CMI8329) ? "CMI8329" : "CMI8330/C3D"); 308 316 309 317 for (idx = 0; idx < ARRAY_SIZE(snd_cmi8330_controls); idx++) { … … 330 338 int err; 331 339 340 /* CMI8329 has a device with ID A@@0001, CMI8330 does not */ 341 acard->type = (id->devs[3].id[0]) ? CMI8329 : CMI8330; 342 332 343 acard->cap = pnp_request_card_device(card, id->devs[0].id, NULL); 333 344 if (acard->cap == NULL) … … 339 350 340 351 acard->mpu = pnp_request_card_device(card, id->devs[2].id, NULL); 341 if (acard-> play== NULL)352 if (acard->mpu == NULL) 342 353 return -EBUSY; 343 354 … … 346 357 err = pnp_activate_dev(pdev); 347 358 if (err < 0) { 348 snd_printk(KERN_ERR " CMI8330/C3DPnP configure failure\n");359 snd_printk(KERN_ERR "AD1848 PnP configure failure\n"); 349 360 return -EBUSY; 350 361 } … … 352 363 wssdma[dev] = pnp_dma(pdev, 0); 353 364 wssirq[dev] = pnp_irq(pdev, 0); 354 fmport[dev] = pnp_port_start(pdev, 1); 365 if (pnp_port_start(pdev, 1)) 366 fmport[dev] = pnp_port_start(pdev, 1); 355 367 356 368 /* allocate SB16 resources */ … … 359 371 err = pnp_activate_dev(pdev); 360 372 if (err < 0) { 361 snd_printk(KERN_ERR " CMI8330/C3D (SB16)PnP configure failure\n");373 snd_printk(KERN_ERR "SB16 PnP configure failure\n"); 362 374 return -EBUSY; 363 375 } … … 366 378 sbdma16[dev] = pnp_dma(pdev, 1); 367 379 sbirq[dev] = pnp_irq(pdev, 0); 380 /* On CMI8239, the OPL3 port might be present in SB16 PnP resources */ 381 if (fmport[dev] == SNDRV_AUTO_PORT) { 382 if (pnp_port_start(pdev, 1)) 383 fmport[dev] = pnp_port_start(pdev, 1); 384 else 385 fmport[dev] = 0x388; /* Or hardwired */ 386 } 368 387 369 388 /* allocate MPU-401 resources */ … … 371 390 372 391 err = pnp_activate_dev(pdev); 373 if (err < 0) { 374 snd_printk(KERN_ERR 375 "CMI8330/C3D (MPU-401) PnP configure failure\n"); 376 return -EBUSY; 377 } 378 mpuport[dev] = pnp_port_start(pdev, 0); 379 mpuirq[dev] = pnp_irq(pdev, 0); 392 if (err < 0) 393 snd_printk(KERN_ERR "MPU-401 PnP configure failure: will be disabled\n"); 394 else { 395 mpuport[dev] = pnp_port_start(pdev, 0); 396 mpuirq[dev] = pnp_irq(pdev, 0); 397 } 380 398 return 0; 381 399 } … … 431 449 }; 432 450 433 if ((err = snd_pcm_new(card, "CMI8330", 0, 1, 1, &pcm)) < 0)434 return err; 435 strcpy(pcm->name, "CMI8330");451 if ((err = snd_pcm_new(card, (chip->type == CMI8329) ? "CMI8329" : "CMI8330", 0, 1, 1, &pcm)) < 0) 452 return err; 453 strcpy(pcm->name, (chip->type == CMI8329) ? "CMI8329" : "CMI8330"); 436 454 pcm->private_data = chip; 437 455 … … 528 546 WSS_HW_DETECT, 0, &acard->wss); 529 547 if (err < 0) { 530 snd_printk(KERN_ERR PFX " (CMI8330)device busy??\n");548 snd_printk(KERN_ERR PFX "AD1848 device busy??\n"); 531 549 return err; 532 550 } 533 551 if (acard->wss->hardware != WSS_HW_CMI8330) { 534 snd_printk(KERN_ERR PFX " (CMI8330)not found during probe\n");552 snd_printk(KERN_ERR PFX "AD1848 not found during probe\n"); 535 553 return -ENODEV; 536 554 } … … 542 560 sbdma16[dev], 543 561 SB_HW_AUTO, &acard->sb)) < 0) { 544 snd_printk(KERN_ERR PFX " (SB16)device busy??\n");562 snd_printk(KERN_ERR PFX "SB16 device busy??\n"); 545 563 return err; 546 564 } 547 565 if (acard->sb->hardware != SB_HW_16) { 548 snd_printk(KERN_ERR PFX " (SB16)not found during probe\n");566 snd_printk(KERN_ERR PFX "SB16 not found during probe\n"); 549 567 return err; 550 568 } … … 586 604 } 587 605 588 strcpy(card->driver, "CMI8330/C3D");589 strcpy(card->shortname, "C-Media CMI8330/C3D");606 strcpy(card->driver, (acard->type == CMI8329) ? "CMI8329" : "CMI8330/C3D"); 607 strcpy(card->shortname, (acard->type == CMI8329) ? "C-Media CMI8329" : "C-Media CMI8330/C3D"); 590 608 sprintf(card->longname, "%s at 0x%lx, irq %d, dma %d", 591 609 card->shortname, -
GPL/trunk/alsa-kernel/isa/es1688/es1688.c
r426 r464 194 194 .match = snd_es1688_match, 195 195 .probe = snd_es1688_probe, 196 .remove = snd_es1688_remove,196 .remove = __devexit_p(snd_es1688_remove), 197 197 #if 0 /* FIXME */ 198 198 .suspend = snd_es1688_suspend, -
GPL/trunk/alsa-kernel/isa/gus/gus_pcm.c
r426 r464 796 796 continue; 797 797 /* load real volume - better precision */ 798 spin_lock _irqsave(&gus->reg_lock, flags);798 spin_lock(&gus->reg_lock); 799 799 snd_gf1_select_voice(gus, pvoice->number); 800 800 snd_gf1_ctrl_stop(gus, SNDRV_GF1_VB_VOLUME_CONTROL); … … 802 802 snd_gf1_write16(gus, SNDRV_GF1_VW_VOLUME, vol); 803 803 pcmp->final_volume = 1; 804 spin_unlock _irqrestore(&gus->reg_lock, flags);804 spin_unlock(&gus->reg_lock); 805 805 } 806 806 spin_unlock_irqrestore(&gus->voice_alloc, flags); -
GPL/trunk/alsa-kernel/isa/gus/gusextreme.c
r410 r464 349 349 .match = snd_gusextreme_match, 350 350 .probe = snd_gusextreme_probe, 351 .remove = snd_gusextreme_remove,351 .remove = __devexit_p(snd_gusextreme_remove), 352 352 #if 0 /* FIXME */ 353 353 .suspend = snd_gusextreme_suspend, -
GPL/trunk/alsa-kernel/pci/ac97/ac97_patch.c
r402 r464 959 959 960 960 static const struct snd_kcontrol_new snd_ac97_sigmatel_4speaker = 961 AC97_SINGLE("Sigmatel 4-Speaker Stereo Playback Switch", AC97_SIGMATEL_DAC2INVERT, 2, 1, 0); 962 961 AC97_SINGLE("Sigmatel 4-Speaker Stereo Playback Switch", 962 AC97_SIGMATEL_DAC2INVERT, 2, 1, 0); 963 964 /* "Sigmatel " removed due to excessive name length: */ 963 965 static const struct snd_kcontrol_new snd_ac97_sigmatel_phaseinvert = 964 AC97_SINGLE("Sigmatel Surround Phase Inversion Playback Switch", AC97_SIGMATEL_DAC2INVERT, 3, 1, 0); 966 AC97_SINGLE("Surround Phase Inversion Playback Switch", 967 AC97_SIGMATEL_DAC2INVERT, 3, 1, 0); 965 968 966 969 static const struct snd_kcontrol_new snd_ac97_sigmatel_controls[] = { -
GPL/trunk/alsa-kernel/pci/ali5451/ali5451.c
r426 r464 319 319 320 320 end_time = jiffies + msecs_to_jiffies(250); 321 do { 321 322 for (;;) { 322 323 res = snd_ali_5451_peek(codec,port); 323 324 if (!(res & 0x8000)) 324 325 return 0; 326 if (!time_after_eq(end_time, jiffies)) 327 break; 325 328 schedule_timeout_uninterruptible(1); 326 } while (time_after_eq(end_time, jiffies)); 329 } 330 327 331 snd_ali_5451_poke(codec, port, res & ~0x8000); 328 332 snd_printdd("ali_codec_ready: codec is not ready.\n "); … … 336 340 337 341 dwChk1 = snd_ali_5451_peek(codec, ALI_STIMER); 338 dwChk2 = snd_ali_5451_peek(codec, ALI_STIMER);339 340 342 end_time = jiffies + msecs_to_jiffies(250); 341 do { 343 344 for (;;) { 342 345 dwChk2 = snd_ali_5451_peek(codec, ALI_STIMER); 343 346 if (dwChk2 != dwChk1) 344 347 return 0; 348 if (!time_after_eq(end_time, jiffies)) 349 break; 345 350 schedule_timeout_uninterruptible(1); 346 } while (time_after_eq(end_time, jiffies)); 351 } 352 347 353 snd_printk(KERN_ERR "ali_stimer_read: stimer is not ready.\n"); 348 354 return -EIO; … … 481 487 } 482 488 483 #ifdef CODEC_RESET484 485 static int snd_ali_reset_codec(struct snd_ali *codec)486 {487 struct pci_dev *pci_dev;488 unsigned char bVal;489 unsigned int dwVal;490 unsigned short wCount, wReg;491 492 pci_dev = codec->pci_m1533;493 494 pci_read_config_dword(pci_dev, 0x7c, &dwVal);495 pci_write_config_dword(pci_dev, 0x7c, dwVal | 0x08000000);496 udelay(5000);497 pci_read_config_dword(pci_dev, 0x7c, &dwVal);498 pci_write_config_dword(pci_dev, 0x7c, dwVal & 0xf7ffffff);499 udelay(5000);500 501 bVal = inb(ALI_REG(codec,ALI_SCTRL));502 bVal |= 0x02;503 outb(ALI_REG(codec,ALI_SCTRL),bVal);504 udelay(5000);505 bVal = inb(ALI_REG(codec,ALI_SCTRL));506 bVal &= 0xfd;507 outb(ALI_REG(codec,ALI_SCTRL),bVal);508 udelay(15000);509 510 wCount = 200;511 while (wCount--) {512 wReg = snd_ali_codec_read(codec->ac97, AC97_POWERDOWN);513 if ((wReg & 0x000f) == 0x000f)514 return 0;515 udelay(5000);516 }517 return -1;518 }519 520 #endif521 522 489 /* 523 490 * ALI 5451 Controller … … 563 530 outl(gc, ALI_REG(codec, ALI_GC_CIR)); 564 531 } 565 566 #if 0 /* not used */567 static void snd_ali_enable_voice_irq(struct snd_ali *codec,568 unsigned int channel)569 {570 unsigned int mask;571 struct snd_ali_channel_control *pchregs = &(codec->chregs);572 573 snd_ali_printk("enable_voice_irq channel=%d\n",channel);574 575 mask = 1 << (channel & 0x1f);576 pchregs->data.ainten = inl(ALI_REG(codec, pchregs->regs.ainten));577 pchregs->data.ainten |= mask;578 outl(pchregs->data.ainten, ALI_REG(codec, pchregs->regs.ainten));579 }580 #endif581 532 582 533 static void snd_ali_disable_voice_irq(struct snd_ali *codec, … … 679 630 } 680 631 } 681 682 #if 0 /* not used */683 static void snd_ali_start_voice(struct snd_ali *codec, unsigned int channel)684 {685 unsigned int mask = 1 << (channel & 0x1f);686 687 snd_ali_printk("start_voice: channel=%d\n",channel);688 outl(mask, ALI_REG(codec,codec->chregs.regs.start));689 }690 #endif691 632 692 633 static void snd_ali_stop_voice(struct snd_ali *codec, unsigned int channel) -
GPL/trunk/alsa-kernel/pci/atiixp.c
r426 r464 288 288 */ 289 289 static struct pci_device_id snd_atiixp_ids[] = { 290 { 0x1002, 0x4341, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* SB200 */291 { 0x1002, 0x4361, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* SB300 */292 { 0x1002, 0x4370, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* SB400 */293 { 0x1002, 0x4382, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* SB600 */290 { PCI_VDEVICE(ATI, 0x4341), 0 }, /* SB200 */ 291 { PCI_VDEVICE(ATI, 0x4361), 0 }, /* SB300 */ 292 { PCI_VDEVICE(ATI, 0x4370), 0 }, /* SB400 */ 293 { PCI_VDEVICE(ATI, 0x4382), 0 }, /* SB600 */ 294 294 { 0, } 295 295 }; -
GPL/trunk/alsa-kernel/pci/au88x0/au8810.c
r305 r464 2 2 #include "au88x0.h" 3 3 static struct pci_device_id snd_vortex_ids[] = { 4 {PCI_VENDOR_ID_AUREAL, PCI_DEVICE_ID_AUREAL_ADVANTAGE, 5 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1,}, 4 {PCI_VDEVICE(AUREAL, PCI_DEVICE_ID_AUREAL_ADVANTAGE), 1,}, 6 5 {0,} 7 6 }; -
GPL/trunk/alsa-kernel/pci/au88x0/au8820.c
r305 r464 2 2 #include "au88x0.h" 3 3 static struct pci_device_id snd_vortex_ids[] = { 4 {PCI_VENDOR_ID_AUREAL, PCI_DEVICE_ID_AUREAL_VORTEX_1, 5 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0,}, 4 {PCI_VDEVICE(AUREAL, PCI_DEVICE_ID_AUREAL_VORTEX_1), 0,}, 6 5 {0,} 7 6 }; -
GPL/trunk/alsa-kernel/pci/au88x0/au8830.c
r305 r464 2 2 #include "au88x0.h" 3 3 static struct pci_device_id snd_vortex_ids[] = { 4 {PCI_VENDOR_ID_AUREAL, PCI_DEVICE_ID_AUREAL_VORTEX_2, 5 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0,}, 4 {PCI_VDEVICE(AUREAL, PCI_DEVICE_ID_AUREAL_VORTEX_2), 0,}, 6 5 {0,} 7 6 }; -
GPL/trunk/alsa-kernel/pci/au88x0/au88x0_core.c
r426 r464 1256 1256 1257 1257 temp = hwread(vortex->mmio, VORTEX_ADBDMA_STAT + (adbdma << 2)); 1258 temp = (dma->period_virt * dma->period_bytes) + (temp & POS_MASK);1259 return (temp);1258 temp = (dma->period_virt * dma->period_bytes) + (temp & (dma->period_bytes - 1)); 1259 return temp; 1260 1260 } 1261 1261 … … 1505 1505 1506 1506 temp = hwread(vortex->mmio, VORTEX_WTDMA_STAT + (wtdma << 2)); 1507 //temp = (temp & POS_MASK) + (((temp>>WT_SUBBUF_SHIFT) & WT_SUBBUF_MASK)*(dma->cfg0&POS_MASK)); 1508 temp = (temp & POS_MASK) + ((dma->period_virt) * (dma->period_bytes)); 1507 temp = (dma->period_virt * dma->period_bytes) + (temp & (dma->period_bytes - 1)); 1509 1508 return temp; 1510 1509 } … … 2442 2441 for (i = 0; i < NR_ADB; i++) { 2443 2442 if (vortex->dma_adb[i].fifo_status == FIFO_START) { 2444 if (vortex_adbdma_bufshift(vortex, i)) ; 2443 if (!vortex_adbdma_bufshift(vortex, i)) 2444 continue; 2445 2445 spin_unlock(&vortex->lock); 2446 2446 snd_pcm_period_elapsed(vortex->dma_adb[i]. -
GPL/trunk/alsa-kernel/pci/bt87x.c
r445 r464 355 355 SNDRV_PCM_INFO_INTERLEAVED | 356 356 SNDRV_PCM_INFO_BLOCK_TRANSFER | 357 SNDRV_PCM_INFO_MMAP_VALID, 357 SNDRV_PCM_INFO_MMAP_VALID | 358 SNDRV_PCM_INFO_BATCH, 358 359 .formats = SNDRV_PCM_FMTBIT_S16_LE, 359 360 .rates = 0, /* set at runtime */ … … 371 372 SNDRV_PCM_INFO_INTERLEAVED | 372 373 SNDRV_PCM_INFO_BLOCK_TRANSFER | 373 SNDRV_PCM_INFO_MMAP_VALID, 374 SNDRV_PCM_INFO_MMAP_VALID | 375 SNDRV_PCM_INFO_BATCH, 374 376 .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8, 375 377 .rates = SNDRV_PCM_RATE_KNOT, … … 814 816 /* Voodoo TV 200 */ 815 817 BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x121a, 0x3000, GENERIC), 818 /* Askey Computer Corp. MagicTView'99 */ 819 BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x144f, 0x3000, GENERIC), 816 820 /* AVerMedia Studio No. 103, 203, ...? */ 817 821 BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x1461, 0x0003, AVPHONE98), -
GPL/trunk/alsa-kernel/pci/ca0106/ca0106_main.c
r426 r464 326 326 .channels_min = 2, 327 327 .channels_max = 2, 328 .buffer_bytes_max = ((65536 - 64) * 8),328 .buffer_bytes_max = 65536 - 128, 329 329 .period_bytes_min = 64, 330 .period_bytes_max = (65536 - 64),330 .period_bytes_max = 32768 - 64, 331 331 .periods_min = 2, 332 332 .periods_max = 2, … … 1320 1320 1321 1321 pcm->info_flags = 0; 1322 pcm->dev_subclass = SNDRV_PCM_SUBCLASS_GENERIC_MIX;1323 1322 strcpy(pcm->name, "CA0106"); 1324 1323 … … 1882 1881 // PCI IDs 1883 1882 static struct pci_device_id snd_ca0106_ids[] = { 1884 { 0x1102, 0x0007, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* Audigy LS or Live 24bit */1883 { PCI_VDEVICE(CREATIVE, 0x0007), 0 }, /* Audigy LS or Live 24bit */ 1885 1884 { 0, } 1886 1885 }; -
GPL/trunk/alsa-kernel/pci/ca0106/ca0106_mixer.c
r410 r464 740 740 741 741 static __devinitdata 742 DECLARE_TLV_DB_SCALE(snd_ca0106_master_db_scale, -6375, 50, 1);742 DECLARE_TLV_DB_SCALE(snd_ca0106_master_db_scale, -6375, 25, 1); 743 743 744 744 static char *slave_vols[] __devinitdata = { … … 801 801 "External Amplifier", 802 802 "Sigmatel 4-Speaker Stereo Playback Switch", 803 "S igmatel Surround Phase Inversion Playback",803 "Surround Phase Inversion Playback Switch", 804 804 NULL 805 805 }; … … 842 842 if (!vmaster) 843 843 return -ENOMEM; 844 err = snd_ctl_add(card, vmaster); 845 if (err < 0) 846 return err; 844 847 add_slaves(card, vmaster, slave_vols); 845 848 … … 849 852 if (!vmaster) 850 853 return -ENOMEM; 854 err = snd_ctl_add(card, vmaster); 855 if (err < 0) 856 return err; 851 857 add_slaves(card, vmaster, slave_sws); 852 858 } 859 860 strcpy(card->mixername, "CA0106"); 853 861 return 0; 854 862 } -
GPL/trunk/alsa-kernel/pci/cmipci.c
r426 r464 2814 2814 2815 2815 static struct pci_device_id snd_cmipci_ids[] = { 2816 {PCI_V ENDOR_ID_CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8338A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},2817 {PCI_V ENDOR_ID_CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8338B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},2818 {PCI_V ENDOR_ID_CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8738, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},2819 {PCI_V ENDOR_ID_CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8738B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},2820 {PCI_V ENDOR_ID_AL, PCI_DEVICE_ID_CMEDIA_CM8738, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},2816 {PCI_VDEVICE(CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8338A), 0}, 2817 {PCI_VDEVICE(CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8338B), 0}, 2818 {PCI_VDEVICE(CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8738), 0}, 2819 {PCI_VDEVICE(CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8738B), 0}, 2820 {PCI_VDEVICE(AL, PCI_DEVICE_ID_CMEDIA_CM8738), 0}, 2821 2821 {0,}, 2822 2822 }; -
GPL/trunk/alsa-kernel/pci/cs4281.c
r426 r464 496 496 497 497 static struct pci_device_id snd_cs4281_ids[] = { 498 { 0x1013, 0x6005, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* CS4281 */498 { PCI_VDEVICE(CIRRUS, 0x6005), 0, }, /* CS4281 */ 499 499 { 0, } 500 500 }; -
GPL/trunk/alsa-kernel/pci/cs46xx/cs46xx.c
r410 r464 69 69 70 70 static struct pci_device_id snd_cs46xx_ids[] = { 71 { 0x1013, 0x6001, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* CS4280 */72 { 0x1013, 0x6003, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* CS4612 */73 { 0x1013, 0x6004, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* CS4615 */71 { PCI_VDEVICE(CIRRUS, 0x6001), 0, }, /* CS4280 */ 72 { PCI_VDEVICE(CIRRUS, 0x6003), 0, }, /* CS4612 */ 73 { PCI_VDEVICE(CIRRUS, 0x6004), 0, }, /* CS4615 */ 74 74 { 0, } 75 75 }; -
GPL/trunk/alsa-kernel/pci/emu10k1/emu10k1.c
r410 r464 84 84 */ 85 85 static struct pci_device_id snd_emu10k1_ids[] = { 86 { 0x1102, 0x0002, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* EMU10K1 */87 { 0x1102, 0x0004, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1 }, /* Audigy */88 { 0x1102, 0x0008, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1 }, /* Audigy 2 Value SB0400 */86 { PCI_VDEVICE(CREATIVE, 0x0002), 0 }, /* EMU10K1 */ 87 { PCI_VDEVICE(CREATIVE, 0x0004), 1 }, /* Audigy */ 88 { PCI_VDEVICE(CREATIVE, 0x0008), 1 }, /* Audigy 2 Value SB0400 */ 89 89 { 0, } 90 90 }; -
GPL/trunk/alsa-kernel/pci/emu10k1/emu10k1x.c
r426 r464 859 859 860 860 pcm->info_flags = 0; 861 pcm->dev_subclass = SNDRV_PCM_SUBCLASS_GENERIC_MIX;862 861 switch(device) { 863 862 case 0: … … 1613 1612 // PCI IDs 1614 1613 static struct pci_device_id snd_emu10k1x_ids[] = { 1615 { 0x1102, 0x0006, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, /* Dell OEM version (EMU10K1) */1614 { PCI_VDEVICE(CREATIVE, 0x0006), 0 }, /* Dell OEM version (EMU10K1) */ 1616 1615 { 0, } 1617 1616 }; -
GPL/trunk/alsa-kernel/pci/emu10k1/emupcm.c
r426 r464 1737 1737 .period_bytes_min = 1024, 1738 1738 .period_bytes_max = (128*1024), 1739 .periods_min = 1,1739 .periods_min = 2, 1740 1740 .periods_max = 1024, 1741 1741 .fifo_size = 0, -
GPL/trunk/alsa-kernel/pci/emu10k1/p16v.c
r426 r464 645 645 int capture=1; 646 646 647 /* snd_printk( "KERN_DEBUGsnd_p16v_pcm called. device=%d\n", device); */647 /* snd_printk(KERN_DEBUG "snd_p16v_pcm called. device=%d\n", device); */ 648 648 emu->p16v_device_offset = device; 649 649 if (rpcm) -
GPL/trunk/alsa-kernel/pci/ens1370.c
r426 r464 446 446 static struct pci_device_id snd_audiopci_ids[] = { 447 447 #ifdef CHIP1370 448 { 0x1274, 0x5000, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* ES1370 */448 { PCI_VDEVICE(ENSONIQ, 0x5000), 0, }, /* ES1370 */ 449 449 #endif 450 450 #ifdef CHIP1371 451 { 0x1274, 0x1371, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* ES1371 */452 { 0x1274, 0x5880, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* ES1373 - CT5880 */453 { 0x1102, 0x8938, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* Ectiva EV1938 */451 { PCI_VDEVICE(ENSONIQ, 0x1371), 0, }, /* ES1371 */ 452 { PCI_VDEVICE(ENSONIQ, 0x5880), 0, }, /* ES1373 - CT5880 */ 453 { PCI_VDEVICE(ECTIVA, 0x8938), 0, }, /* Ectiva EV1938 */ 454 454 #endif 455 455 { 0, } -
GPL/trunk/alsa-kernel/pci/es1938.c
r426 r464 245 245 246 246 static struct pci_device_id snd_es1938_ids[] = { 247 { 0x125d, 0x1969, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* Solo-1 */247 { PCI_VDEVICE(ESS, 0x1969), 0, }, /* Solo-1 */ 248 248 { 0, } 249 249 }; -
GPL/trunk/alsa-kernel/pci/hda/hda_beep.h
r426 r464 31 31 char phys[32]; 32 32 int tone; 33 int nid; 34 int enabled; 33 hda_nid_t nid; 34 unsigned int enabled:1; 35 unsigned int linear_tone:1; /* linear tone for IDT/STAC codec */ 35 36 struct work_struct beep_work; /* scheduled task for beep event */ 36 37 }; -
GPL/trunk/alsa-kernel/pci/hda/hda_codec.c
r426 r464 45 45 static struct hda_vendor_id hda_vendor_ids[] = { 46 46 { 0x1002, "ATI" }, 47 { 0x1013, "Cirrus Logic" }, 47 48 { 0x1057, "Motorola" }, 48 49 { 0x1095, "Silicon Image" }, 49 50 { 0x10de, "Nvidia" }, 50 51 { 0x10ec, "Realtek" }, 52 { 0x1102, "Creative" }, 51 53 { 0x1106, "VIA" }, 52 54 { 0x111d, "IDT" }, … … 150 152 u32 val; 151 153 152 val = (u32)(codec->addr & 0x0f) << 28; 154 if ((codec->addr & ~0xf) || (direct & ~1) || (nid & ~0x7f) || 155 (verb & ~0xfff) || (parm & ~0xffff)) { 156 printk(KERN_ERR "hda-codec: out of range cmd %x:%x:%x:%x:%x\n", 157 codec->addr, direct, nid, verb, parm); 158 return ~0; 159 } 160 161 val = (u32)codec->addr << 28; 153 162 val |= (u32)direct << 27; 154 163 val |= (u32)nid << 20; … … 156 165 val |= parm; 157 166 return val; 167 } 168 169 /* 170 * Send and receive a verb 171 */ 172 static int codec_exec_verb(struct hda_codec *codec, unsigned int cmd, 173 unsigned int *res) 174 { 175 struct hda_bus *bus = codec->bus; 176 int err; 177 178 if (cmd == ~0) 179 return -1; 180 181 if (res) 182 *res = -1; 183 again: 184 snd_hda_power_up(codec); 185 mutex_lock(&bus->cmd_mutex); 186 err = bus->ops.command(bus, cmd); 187 if (!err && res) 188 *res = bus->ops.get_response(bus, codec->addr); 189 mutex_unlock(&bus->cmd_mutex); 190 snd_hda_power_down(codec); 191 if (res && *res == -1 && bus->rirb_error) { 192 if (bus->response_reset) { 193 snd_printd("hda_codec: resetting BUS due to " 194 "fatal communication error\n"); 195 bus->ops.bus_reset(bus); 196 } 197 goto again; 198 } 199 /* clear reset-flag when the communication gets recovered */ 200 if (!err) 201 bus->response_reset = 0; 202 return err; 158 203 } 159 204 … … 174 219 unsigned int verb, unsigned int parm) 175 220 { 176 struct hda_bus *bus = codec->bus;221 unsigned cmd = make_codec_cmd(codec, nid, direct, verb, parm); 177 222 unsigned int res; 178 179 res = make_codec_cmd(codec, nid, direct, verb, parm); 180 snd_hda_power_up(codec); 181 mutex_lock(&bus->cmd_mutex); 182 if (!bus->ops.command(bus, res)) 183 res = bus->ops.get_response(bus); 184 else 185 res = (unsigned int)-1; 186 mutex_unlock(&bus->cmd_mutex); 187 snd_hda_power_down(codec); 223 codec_exec_verb(codec, cmd, &res); 188 224 return res; 189 225 } … … 205 241 unsigned int verb, unsigned int parm) 206 242 { 207 struct hda_bus *bus = codec->bus;243 unsigned int cmd = make_codec_cmd(codec, nid, direct, verb, parm); 208 244 unsigned int res; 209 int err; 210 211 res = make_codec_cmd(codec, nid, direct, verb, parm); 212 snd_hda_power_up(codec); 213 mutex_lock(&bus->cmd_mutex); 214 err = bus->ops.command(bus, res); 215 mutex_unlock(&bus->cmd_mutex); 216 snd_hda_power_down(codec); 217 return err; 245 return codec_exec_verb(codec, cmd, 246 codec->bus->sync_write ? &res : NULL); 218 247 } 219 248 EXPORT_SYMBOL_HDA(snd_hda_codec_write); … … 274 303 int i, conn_len, conns; 275 304 unsigned int shift, num_elems, mask; 305 unsigned int wcaps; 276 306 hda_nid_t prev_nid; 277 307 278 308 if (snd_BUG_ON(!conn_list || max_conns <= 0)) 279 309 return -EINVAL; 310 311 wcaps = get_wcaps(codec, nid); 312 if (!(wcaps & AC_WCAP_CONN_LIST) && 313 get_wcaps_type(wcaps) != AC_WID_VOL_KNB) { 314 snd_printk(KERN_WARNING "hda_codec: " 315 "connection list not available for 0x%x\n", nid); 316 return -EINVAL; 317 } 280 318 281 319 parm = snd_hda_param_read(codec, nid, AC_PAR_CONNLIST_LEN); … … 299 337 parm = snd_hda_codec_read(codec, nid, 0, 300 338 AC_VERB_GET_CONNECT_LIST, 0); 339 if (parm == -1 && codec->bus->rirb_error) 340 return -EIO; 301 341 conn_list[0] = parm & mask; 302 342 return 1; … … 310 350 hda_nid_t val, n; 311 351 312 if (i % num_elems == 0) 352 if (i % num_elems == 0) { 313 353 parm = snd_hda_codec_read(codec, nid, 0, 314 354 AC_VERB_GET_CONNECT_LIST, i); 355 if (parm == -1 && codec->bus->rirb_error) 356 return -EIO; 357 } 315 358 range_val = !!(parm & (1 << (shift-1))); /* ranges */ 316 359 val = parm & mask; 360 if (val == 0) { 361 snd_printk(KERN_WARNING "hda_codec: " 362 "invalid CONNECT_LIST verb %x[%i]:%x\n", 363 nid, i, parm); 364 return 0; 365 } 317 366 parm >>= shift; 318 367 if (range_val) { … … 618 667 const char *vendor = NULL; 619 668 u16 vendor_id = codec->vendor_id >> 16; 620 char tmp[16], name[32]; 669 char tmp[16]; 670 671 if (codec->vendor_name) 672 goto get_chip_name; 621 673 622 674 for (c = hda_vendor_ids; c->id; c++) { … … 630 682 vendor = tmp; 631 683 } 684 codec->vendor_name = kstrdup(vendor, GFP_KERNEL); 685 if (!codec->vendor_name) 686 return -ENOMEM; 687 688 get_chip_name: 689 if (codec->chip_name) 690 return 0; 691 632 692 if (codec->preset && codec->preset->name) 633 snprintf(name, sizeof(name), "%s %s", vendor, 634 codec->preset->name); 635 else 636 snprintf(name, sizeof(name), "%s ID %x", vendor, 637 codec->vendor_id & 0xffff); 638 codec->name = kstrdup(name, GFP_KERNEL); 639 if (!codec->name) 693 codec->chip_name = kstrdup(codec->preset->name, GFP_KERNEL); 694 else { 695 sprintf(tmp, "ID %x", codec->vendor_id & 0xffff); 696 codec->chip_name = kstrdup(tmp, GFP_KERNEL); 697 } 698 if (!codec->chip_name) 640 699 return -ENOMEM; 641 700 return 0; … … 698 757 struct hda_pincfg *pin; 699 758 unsigned int wcaps = get_wcaps(codec, nid); 700 unsigned int wid_type = (wcaps & AC_WCAP_TYPE) >> 701 AC_WCAP_TYPE_SHIFT; 759 unsigned int wid_type = get_wcaps_type(wcaps); 702 760 if (wid_type != AC_WID_PIN) 703 761 continue; … … 843 901 free_hda_cache(&codec->amp_cache); 844 902 free_hda_cache(&codec->cmd_cache); 845 kfree(codec->name); 903 kfree(codec->vendor_name); 904 kfree(codec->chip_name); 846 905 kfree(codec->modelname); 847 906 kfree(codec->wcaps); … … 861 920 */ 862 921 int /*__devinit*/ snd_hda_codec_new(struct hda_bus *bus, unsigned int codec_addr, 863 int do_init,struct hda_codec **codecp)922 struct hda_codec **codecp) 864 923 { 865 924 struct hda_codec *codec; … … 948 1007 AC_VERB_GET_SUBSYSTEM_ID, 0); 949 1008 } 950 if (bus->modelname)951 codec->modelname = kstrdup(bus->modelname, GFP_KERNEL);952 1009 953 1010 /* power-up all before initialization */ … … 956 1013 AC_PWRST_D0); 957 1014 958 if (do_init) {959 err = snd_hda_codec_configure(codec);960 if (err < 0)961 goto error;962 }963 1015 snd_hda_codec_proc_new(codec); 964 1016 … … 984 1036 985 1037 codec->preset = find_codec_preset(codec); 986 if (!codec-> name) {1038 if (!codec->vendor_name || !codec->chip_name) { 987 1039 err = get_codec_name(codec); 988 1040 if (err < 0) … … 991 1043 /* audio codec should override the mixer name */ 992 1044 if (codec->afg || !*codec->bus->card->mixername) 993 strlcpy(codec->bus->card->mixername, codec->name, 994 sizeof(codec->bus->card->mixername)); 1045 snprintf(codec->bus->card->mixername, 1046 sizeof(codec->bus->card->mixername), 1047 "%s %s", codec->vendor_name, codec->chip_name); 995 1048 996 1049 if (is_generic_config(codec)) { … … 1013 1066 return err; 1014 1067 } 1068 EXPORT_SYMBOL_HDA(snd_hda_codec_configure); 1015 1069 1016 1070 /** … … 1060 1114 #define HDA_HASH_KEY(nid,dir,idx) (u32)((nid) + ((idx) << 16) + ((dir) << 24)) 1061 1115 #define HDA_HASH_PINCAP_KEY(nid) (u32)((nid) + (0x02 << 24)) 1116 #define HDA_HASH_PARPCM_KEY(nid) (u32)((nid) + (0x03 << 24)) 1117 #define HDA_HASH_PARSTR_KEY(nid) (u32)((nid) + (0x04 << 24)) 1062 1118 #define INFO_AMP_CAPS (1<<0) 1063 1119 #define INFO_AMP_VOL(ch) (1 << (1 + (ch))) … … 1150 1206 EXPORT_SYMBOL_HDA(snd_hda_override_amp_caps); 1151 1207 1152 u32 snd_hda_query_pin_caps(struct hda_codec *codec, hda_nid_t nid) 1208 static unsigned int 1209 query_caps_hash(struct hda_codec *codec, hda_nid_t nid, u32 key, 1210 unsigned int (*func)(struct hda_codec *, hda_nid_t)) 1153 1211 { 1154 1212 struct hda_amp_info *info; 1155 1213 1156 info = get_alloc_amp_hash(codec, HDA_HASH_PINCAP_KEY(nid));1214 info = get_alloc_amp_hash(codec, key); 1157 1215 if (!info) 1158 1216 return 0; 1159 1217 if (!info->head.val) { 1160 info->amp_caps = snd_hda_param_read(codec, nid, AC_PAR_PIN_CAP);1161 1218 info->head.val |= INFO_AMP_CAPS; 1219 info->amp_caps = func(codec, nid); 1162 1220 } 1163 1221 return info->amp_caps; 1222 } 1223 1224 static unsigned int read_pin_cap(struct hda_codec *codec, hda_nid_t nid) 1225 { 1226 return snd_hda_param_read(codec, nid, AC_PAR_PIN_CAP); 1227 } 1228 1229 u32 snd_hda_query_pin_caps(struct hda_codec *codec, hda_nid_t nid) 1230 { 1231 return query_caps_hash(codec, nid, HDA_HASH_PINCAP_KEY(nid), 1232 read_pin_cap); 1164 1233 } 1165 1234 EXPORT_SYMBOL_HDA(snd_hda_query_pin_caps); … … 1437 1506 id.iface = SNDRV_CTL_ELEM_IFACE_MIXER; 1438 1507 id.index = idx; 1508 if (snd_BUG_ON(strlen(name) >= sizeof(id.name))) 1509 return NULL; 1439 1510 strcpy(id.name, name); 1440 1511 return snd_ctl_find_id(codec->bus->card, &id); … … 2247 2318 int direct, unsigned int verb, unsigned int parm) 2248 2319 { 2249 struct hda_bus *bus = codec->bus; 2250 unsigned int res; 2251 int err; 2252 2253 res = make_codec_cmd(codec, nid, direct, verb, parm); 2254 snd_hda_power_up(codec); 2255 mutex_lock(&bus->cmd_mutex); 2256 err = bus->ops.command(bus, res); 2257 if (!err) { 2258 struct hda_cache_head *c; 2259 u32 key; 2260 /* parm may contain the verb stuff for get/set amp */ 2261 verb = verb | (parm >> 8); 2262 parm &= 0xff; 2263 key = build_cmd_cache_key(nid, verb); 2264 c = get_alloc_hash(&codec->cmd_cache, key); 2265 if (c) 2266 c->val = parm; 2267 } 2268 mutex_unlock(&bus->cmd_mutex); 2269 snd_hda_power_down(codec); 2270 return err; 2320 int err = snd_hda_codec_write(codec, nid, direct, verb, parm); 2321 struct hda_cache_head *c; 2322 u32 key; 2323 2324 if (err < 0) 2325 return err; 2326 /* parm may contain the verb stuff for get/set amp */ 2327 verb = verb | (parm >> 8); 2328 parm &= 0xff; 2329 key = build_cmd_cache_key(nid, verb); 2330 mutex_lock(&codec->bus->cmd_mutex); 2331 c = get_alloc_hash(&codec->cmd_cache, key); 2332 if (c) 2333 c->val = parm; 2334 mutex_unlock(&codec->bus->cmd_mutex); 2335 return 0; 2271 2336 } 2272 2337 EXPORT_SYMBOL_HDA(snd_hda_codec_write_cache); … … 2316 2381 int i; 2317 2382 2318 snd_hda_codec_write(codec, fg, 0, AC_VERB_SET_POWER_STATE, 2383 /* this delay seems necessary to avoid click noise at power-down */ 2384 if (power_state == AC_PWRST_D3) 2385 msleep(100); 2386 snd_hda_codec_read(codec, fg, 0, AC_VERB_SET_POWER_STATE, 2319 2387 power_state); 2320 msleep(10); /* partial workaround for "azx_get_response timeout" */ 2388 /* partial workaround for "azx_get_response timeout" */ 2389 if (power_state == AC_PWRST_D0) 2390 msleep(10); 2321 2391 2322 2392 nid = codec->start_nid; … … 2324 2394 unsigned int wcaps = get_wcaps(codec, nid); 2325 2395 if (wcaps & AC_WCAP_POWER) { 2326 unsigned int wid_type = (wcaps & AC_WCAP_TYPE) >>2327 AC_WCAP_TYPE_SHIFT;2328 if (wid_type == AC_WID_PIN) {2396 unsigned int wid_type = get_wcaps_type(wcaps); 2397 if (power_state == AC_PWRST_D3 && 2398 wid_type == AC_WID_PIN) { 2329 2399 unsigned int pincap; 2330 2400 /* … … 2338 2408 AC_VERB_GET_EAPD_BTLENABLE, 0); 2339 2409 eapd &= 0x02; 2340 if ( power_state == AC_PWRST_D3 &&eapd)2410 if (eapd) 2341 2411 continue; 2342 2412 } … … 2532 2602 case 24: 2533 2603 case 32: 2534 if (maxbps >= 32 )2604 if (maxbps >= 32 || format == SNDRV_PCM_FORMAT_FLOAT_LE) 2535 2605 val |= 0x40; 2536 2606 else if (maxbps >= 24) … … 2549 2619 EXPORT_SYMBOL_HDA(snd_hda_calc_stream_format); 2550 2620 2621 static unsigned int get_pcm_param(struct hda_codec *codec, hda_nid_t nid) 2622 { 2623 unsigned int val = 0; 2624 if (nid != codec->afg && 2625 (get_wcaps(codec, nid) & AC_WCAP_FORMAT_OVRD)) 2626 val = snd_hda_param_read(codec, nid, AC_PAR_PCM); 2627 if (!val || val == -1) 2628 val = snd_hda_param_read(codec, codec->afg, AC_PAR_PCM); 2629 if (!val || val == -1) 2630 return 0; 2631 return val; 2632 } 2633 2634 static unsigned int query_pcm_param(struct hda_codec *codec, hda_nid_t nid) 2635 { 2636 return query_caps_hash(codec, nid, HDA_HASH_PARPCM_KEY(nid), 2637 get_pcm_param); 2638 } 2639 2640 static unsigned int get_stream_param(struct hda_codec *codec, hda_nid_t nid) 2641 { 2642 unsigned int streams = snd_hda_param_read(codec, nid, AC_PAR_STREAM); 2643 if (!streams || streams == -1) 2644 streams = snd_hda_param_read(codec, codec->afg, AC_PAR_STREAM); 2645 if (!streams || streams == -1) 2646 return 0; 2647 return streams; 2648 } 2649 2650 static unsigned int query_stream_param(struct hda_codec *codec, hda_nid_t nid) 2651 { 2652 return query_caps_hash(codec, nid, HDA_HASH_PARSTR_KEY(nid), 2653 get_stream_param); 2654 } 2655 2551 2656 /** 2552 2657 * snd_hda_query_supported_pcm - query the supported PCM rates and formats … … 2567 2672 unsigned int i, val, wcaps; 2568 2673 2569 val = 0;2570 2674 wcaps = get_wcaps(codec, nid); 2571 if (nid != codec->afg && (wcaps & AC_WCAP_FORMAT_OVRD)) { 2572 val = snd_hda_param_read(codec, nid, AC_PAR_PCM); 2573 if (val == -1) 2574 return -EIO; 2575 } 2576 if (!val) 2577 val = snd_hda_param_read(codec, codec->afg, AC_PAR_PCM); 2675 val = query_pcm_param(codec, nid); 2578 2676 2579 2677 if (ratesp) { … … 2597 2695 unsigned int streams, bps; 2598 2696 2599 streams = snd_hda_param_read(codec, nid, AC_PAR_STREAM);2600 if ( streams == -1)2697 streams = query_stream_param(codec, nid); 2698 if (!streams) 2601 2699 return -EIO; 2602 if (!streams) {2603 streams = snd_hda_param_read(codec, codec->afg,2604 AC_PAR_STREAM);2605 if (streams == -1)2606 return -EIO;2607 }2608 2700 2609 2701 bps = 0; … … 2637 2729 } 2638 2730 } 2639 else if (streams == AC_SUPFMT_FLOAT32) { 2640 /* should be exclusive */ 2731 if (streams & AC_SUPFMT_FLOAT32) { 2641 2732 formats |= SNDRV_PCM_FMTBIT_FLOAT_LE; 2642 bps = 32; 2643 } else if (streams == AC_SUPFMT_AC3) { 2733 if (!bps) 2734 bps = 32; 2735 } 2736 if (streams == AC_SUPFMT_AC3) { 2644 2737 /* should be exclusive */ 2645 2738 /* temporary hack: we have still no proper support … … 2679 2772 unsigned int val = 0, rate, stream; 2680 2773 2681 if (nid != codec->afg && 2682 (get_wcaps(codec, nid) & AC_WCAP_FORMAT_OVRD)) { 2683 val = snd_hda_param_read(codec, nid, AC_PAR_PCM); 2684 if (val == -1) 2685 return 0; 2686 } 2687 if (!val) { 2688 val = snd_hda_param_read(codec, codec->afg, AC_PAR_PCM); 2689 if (val == -1) 2690 return 0; 2691 } 2774 val = query_pcm_param(codec, nid); 2775 if (!val) 2776 return 0; 2692 2777 2693 2778 rate = format & 0xff00; … … 2701 2786 return 0; 2702 2787 2703 stream = snd_hda_param_read(codec, nid, AC_PAR_STREAM); 2704 if (stream == -1) 2705 return 0; 2706 if (!stream && nid != codec->afg) 2707 stream = snd_hda_param_read(codec, codec->afg, AC_PAR_STREAM); 2708 if (!stream || stream == -1) 2788 stream = query_stream_param(codec, nid); 2789 if (!stream) 2709 2790 return 0; 2710 2791 … … 3425 3506 mutex_lock(&codec->spdif_mutex); 3426 3507 if (mout->share_spdif) { 3427 runtime->hw.rates &= mout->spdif_rates; 3428 runtime->hw.formats &= mout->spdif_formats; 3429 if (mout->spdif_maxbps < hinfo->maxbps) 3430 hinfo->maxbps = mout->spdif_maxbps; 3508 if ((runtime->hw.rates & mout->spdif_rates) && 3509 (runtime->hw.formats & mout->spdif_formats)) { 3510 runtime->hw.rates &= mout->spdif_rates; 3511 runtime->hw.formats &= mout->spdif_formats; 3512 if (mout->spdif_maxbps < hinfo->maxbps) 3513 hinfo->maxbps = mout->spdif_maxbps; 3514 } else { 3515 mout->share_spdif = 0; 3516 /* FIXME: need notify? */ 3517 } 3431 3518 } 3432 3519 mutex_unlock(&codec->spdif_mutex); … … 3598 3685 for (nid = codec->start_nid; nid < end_nid; nid++) { 3599 3686 unsigned int wid_caps = get_wcaps(codec, nid); 3600 unsigned int wid_type = 3601 (wid_caps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT; 3687 unsigned int wid_type = get_wcaps_type(wid_caps); 3602 3688 unsigned int def_conf; 3603 3689 short assoc, loc; … … 3840 3926 * snd_hda_suspend - suspend the codecs 3841 3927 * @bus: the HDA bus 3842 * @state: suspsend state3843 3928 * 3844 3929 * Returns 0 if successful. 3845 3930 */ 3846 int snd_hda_suspend(struct hda_bus *bus , pm_message_t state)3931 int snd_hda_suspend(struct hda_bus *bus) 3847 3932 { 3848 3933 struct hda_codec *codec; -
GPL/trunk/alsa-kernel/pci/hda/hda_codec.h
r426 r464 569 569 int (*command)(struct hda_bus *bus, unsigned int cmd); 570 570 /* get a response from the last command */ 571 unsigned int (*get_response)(struct hda_bus *bus );571 unsigned int (*get_response)(struct hda_bus *bus, unsigned int addr); 572 572 /* free the private data */ 573 573 void (*private_free)(struct hda_bus *); … … 575 575 int (*attach_pcm)(struct hda_bus *bus, struct hda_codec *codec, 576 576 struct hda_pcm *pcm); 577 /* reset bus for retry verb */ 578 void (*bus_reset)(struct hda_bus *bus); 577 579 #ifdef CONFIG_SND_HDA_POWER_SAVE 578 580 /* notify power-up/down from codec to controller */ … … 627 629 /* misc op flags */ 628 630 unsigned int needs_damn_long_delay :1; 631 unsigned int allow_bus_reset:1; /* allow bus reset at fatal error */ 632 unsigned int sync_write:1; /* sync after verb write */ 633 /* status for codec/controller */ 629 634 unsigned int shutdown :1; /* being unloaded */ 635 unsigned int rirb_error:1; /* error in codec communication */ 636 unsigned int response_reset:1; /* controller was reset */ 637 unsigned int in_reset:1; /* during reset operation */ 630 638 }; 631 639 … … 752 760 const struct hda_codec_preset *preset; 753 761 struct module *owner; 754 const char *name; /* codec name */ 762 const char *vendor_name; /* codec vendor name */ 763 const char *chip_name; /* codec chip name */ 755 764 const char *modelname; /* model name for preset */ 756 765 … … 830 839 struct hda_bus **busp); 831 840 int snd_hda_codec_new(struct hda_bus *bus, unsigned int codec_addr, 832 int do_init, struct hda_codec **codecp); 841 struct hda_codec **codecp); 842 int snd_hda_codec_configure(struct hda_codec *codec); 833 843 834 844 /* … … 914 924 */ 915 925 #ifdef CONFIG_PM 916 int snd_hda_suspend(struct hda_bus *bus , pm_message_t state);926 int snd_hda_suspend(struct hda_bus *bus); 917 927 int snd_hda_resume(struct hda_bus *bus); 918 928 #endif … … 938 948 #endif 939 949 950 #ifdef CONFIG_SND_HDA_PATCH_LOADER 951 /* 952 * patch firmware 953 */ 954 int snd_hda_load_patch(struct hda_bus *bus, const char *patch); 955 #endif 956 940 957 /* 941 958 * Codec modularization -
GPL/trunk/alsa-kernel/pci/hda/hda_generic.c
r426 r464 122 122 return -ENOMEM; 123 123 node->nid = nid; 124 nconns = snd_hda_get_connections(codec, nid, conn_list, 125 HDA_MAX_CONNECTIONS); 126 if (nconns < 0) { 127 kfree(node); 128 return nconns; 124 node->wid_caps = get_wcaps(codec, nid); 125 node->type = get_wcaps_type(node->wid_caps); 126 if (node->wid_caps & AC_WCAP_CONN_LIST) { 127 nconns = snd_hda_get_connections(codec, nid, conn_list, 128 HDA_MAX_CONNECTIONS); 129 if (nconns < 0) { 130 kfree(node); 131 return nconns; 132 } 133 } else { 134 nconns = 0; 129 135 } 130 136 if (nconns <= ARRAY_SIZE(node->slist)) … … 141 147 memcpy(node->conn_list, conn_list, nconns * sizeof(hda_nid_t)); 142 148 node->nconns = nconns; 143 node->wid_caps = get_wcaps(codec, nid);144 node->type = (node->wid_caps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;145 149 146 150 if (node->type == AC_WID_PIN) { -
GPL/trunk/alsa-kernel/pci/hda/hda_hwdep.c
r426 r464 25 25 #include <linux/mutex.h> 26 26 #include <linux/ctype.h> 27 #include <linux/firmware.h> 27 28 #include <sound/core.h> 28 29 #include "hda_codec.h" … … 243 244 CODEC_INFO_SHOW(afg); 244 245 CODEC_INFO_SHOW(mfg); 245 CODEC_INFO_STR_SHOW(name); 246 CODEC_INFO_STR_SHOW(vendor_name); 247 CODEC_INFO_STR_SHOW(chip_name); 246 248 CODEC_INFO_STR_SHOW(modelname); 247 249 … … 276 278 CODEC_INFO_STORE(subsystem_id); 277 279 CODEC_INFO_STORE(revision_id); 278 CODEC_INFO_STR_STORE(name); 280 CODEC_INFO_STR_STORE(vendor_name); 281 CODEC_INFO_STR_STORE(chip_name); 279 282 CODEC_INFO_STR_STORE(modelname); 280 283 … … 311 314 } 312 315 313 static ssize_t init_verbs_store(struct device *dev, 314 struct device_attribute *attr, 315 const char *buf, size_t count) 316 { 317 struct snd_hwdep *hwdep = dev_get_drvdata(dev); 318 struct hda_codec *codec = hwdep->private_data; 316 static int parse_init_verbs(struct hda_codec *codec, const char *buf) 317 { 319 318 struct hda_verb *v; 320 319 int nid, verb, param; … … 330 329 v->verb = verb; 331 330 v->param = param; 331 return 0; 332 } 333 334 static ssize_t init_verbs_store(struct device *dev, 335 struct device_attribute *attr, 336 const char *buf, size_t count) 337 { 338 struct snd_hwdep *hwdep = dev_get_drvdata(dev); 339 struct hda_codec *codec = hwdep->private_data; 340 int err = parse_init_verbs(codec, buf); 341 if (err < 0) 342 return err; 332 343 return count; 333 344 } … … 375 386 #define MAX_HINTS 1024 376 387 377 static ssize_t hints_store(struct device *dev, 378 struct device_attribute *attr, 379 const char *buf, size_t count) 380 { 381 struct snd_hwdep *hwdep = dev_get_drvdata(dev); 382 struct hda_codec *codec = hwdep->private_data; 388 static int parse_hints(struct hda_codec *codec, const char *buf) 389 { 383 390 char *key, *val; 384 391 struct hda_hint *hint; … … 387 394 buf++; 388 395 if (!*buf || *buf == '#' || *buf == '\n') 389 return count;396 return 0; 390 397 if (*buf == '=') 391 398 return -EINVAL; … … 410 417 hint->key = key; 411 418 hint->val = val; 412 return count;419 return 0; 413 420 } 414 421 /* allocate a new hint entry */ … … 423 430 hint->key = key; 424 431 hint->val = val; 432 return 0; 433 } 434 435 static ssize_t hints_store(struct device *dev, 436 struct device_attribute *attr, 437 const char *buf, size_t count) 438 { 439 struct snd_hwdep *hwdep = dev_get_drvdata(dev); 440 struct hda_codec *codec = hwdep->private_data; 441 int err = parse_hints(codec, buf); 442 if (err < 0) 443 return err; 425 444 return count; 426 445 } … … 468 487 #define MAX_PIN_CONFIGS 32 469 488 470 static ssize_t user_pin_configs_store(struct device *dev, 471 struct device_attribute *attr, 472 const char *buf, size_t count) 473 { 474 struct snd_hwdep *hwdep = dev_get_drvdata(dev); 475 struct hda_codec *codec = hwdep->private_data; 489 static int parse_user_pin_configs(struct hda_codec *codec, const char *buf) 490 { 476 491 int nid, cfg; 477 int err;478 492 479 493 if (sscanf(buf, "%i %i", &nid, &cfg) != 2) … … 481 495 if (!nid) 482 496 return -EINVAL; 483 err = snd_hda_add_pincfg(codec, &codec->user_pins, nid, cfg); 497 return snd_hda_add_pincfg(codec, &codec->user_pins, nid, cfg); 498 } 499 500 static ssize_t user_pin_configs_store(struct device *dev, 501 struct device_attribute *attr, 502 const char *buf, size_t count) 503 { 504 struct snd_hwdep *hwdep = dev_get_drvdata(dev); 505 struct hda_codec *codec = hwdep->private_data; 506 int err = parse_user_pin_configs(codec, buf); 484 507 if (err < 0) 485 508 return err; … … 500 523 CODEC_ATTR_RO(afg), 501 524 CODEC_ATTR_RO(mfg), 502 CODEC_ATTR_RW(name), 525 CODEC_ATTR_RW(vendor_name), 526 CODEC_ATTR_RW(chip_name), 503 527 CODEC_ATTR_RW(modelname), 504 528 CODEC_ATTR_RW(init_verbs), … … 551 575 552 576 #endif /* CONFIG_SND_HDA_RECONFIG */ 577 578 #ifdef CONFIG_SND_HDA_PATCH_LOADER 579 580 /* parser mode */ 581 enum { 582 LINE_MODE_NONE, 583 LINE_MODE_CODEC, 584 LINE_MODE_MODEL, 585 LINE_MODE_PINCFG, 586 LINE_MODE_VERB, 587 LINE_MODE_HINT, 588 NUM_LINE_MODES, 589 }; 590 591 static inline int strmatch(const char *a, const char *b) 592 { 593 return strnicmp(a, b, strlen(b)) == 0; 594 } 595 596 /* parse the contents after the line "[codec]" 597 * accept only the line with three numbers, and assign the current codec 598 */ 599 static void parse_codec_mode(char *buf, struct hda_bus *bus, 600 struct hda_codec **codecp) 601 { 602 unsigned int vendorid, subid, caddr; 603 struct hda_codec *codec; 604 605 *codecp = NULL; 606 if (sscanf(buf, "%i %i %i", &vendorid, &subid, &caddr) == 3) { 607 list_for_each_entry(codec, &bus->codec_list, list) { 608 if (codec->addr == caddr) { 609 *codecp = codec; 610 break; 611 } 612 } 613 } 614 } 615 616 /* parse the contents after the other command tags, [pincfg], [verb], 617 * [hint] and [model] 618 * just pass to the sysfs helper (only when any codec was specified) 619 */ 620 static void parse_pincfg_mode(char *buf, struct hda_bus *bus, 621 struct hda_codec **codecp) 622 { 623 if (!*codecp) 624 return; 625 parse_user_pin_configs(*codecp, buf); 626 } 627 628 static void parse_verb_mode(char *buf, struct hda_bus *bus, 629 struct hda_codec **codecp) 630 { 631 if (!*codecp) 632 return; 633 parse_init_verbs(*codecp, buf); 634 } 635 636 static void parse_hint_mode(char *buf, struct hda_bus *bus, 637 struct hda_codec **codecp) 638 { 639 if (!*codecp) 640 return; 641 parse_hints(*codecp, buf); 642 } 643 644 static void parse_model_mode(char *buf, struct hda_bus *bus, 645 struct hda_codec **codecp) 646 { 647 if (!*codecp) 648 return; 649 kfree((*codecp)->modelname); 650 (*codecp)->modelname = kstrdup(buf, GFP_KERNEL); 651 } 652 653 struct hda_patch_item { 654 const char *tag; 655 void (*parser)(char *buf, struct hda_bus *bus, struct hda_codec **retc); 656 }; 657 658 static struct hda_patch_item patch_items[NUM_LINE_MODES] = { 659 [LINE_MODE_CODEC] = { "[codec]", parse_codec_mode }, 660 [LINE_MODE_MODEL] = { "[model]", parse_model_mode }, 661 [LINE_MODE_VERB] = { "[verb]", parse_verb_mode }, 662 [LINE_MODE_PINCFG] = { "[pincfg]", parse_pincfg_mode }, 663 [LINE_MODE_HINT] = { "[hint]", parse_hint_mode }, 664 }; 665 666 /* check the line starting with '[' -- change the parser mode accodingly */ 667 static int parse_line_mode(char *buf, struct hda_bus *bus) 668 { 669 int i; 670 for (i = 0; i < ARRAY_SIZE(patch_items); i++) { 671 if (!patch_items[i].tag) 672 continue; 673 if (strmatch(buf, patch_items[i].tag)) 674 return i; 675 } 676 return LINE_MODE_NONE; 677 } 678 679 /* copy one line from the buffer in fw, and update the fields in fw 680 * return zero if it reaches to the end of the buffer, or non-zero 681 * if successfully copied a line 682 * 683 * the spaces at the beginning and the end of the line are stripped 684 */ 685 static int get_line_from_fw(char *buf, int size, struct firmware *fw) 686 { 687 int len; 688 const char *p = fw->data; 689 while (isspace(*p) && fw->size) { 690 p++; 691 fw->size--; 692 } 693 if (!fw->size) 694 return 0; 695 if (size < fw->size) 696 size = fw->size; 697 698 for (len = 0; len < fw->size; len++) { 699 if (!*p) 700 break; 701 if (*p == '\n') { 702 p++; 703 len++; 704 break; 705 } 706 if (len < size) 707 *buf++ = *p++; 708 } 709 *buf = 0; 710 fw->size -= len; 711 fw->data = p; 712 remove_trail_spaces(buf); 713 return 1; 714 } 715 716 /* 717 * load a "patch" firmware file and parse it 718 */ 719 int snd_hda_load_patch(struct hda_bus *bus, const char *patch) 720 { 721 int err; 722 const struct firmware *fw; 723 struct firmware tmp; 724 char buf[128]; 725 struct hda_codec *codec; 726 int line_mode; 727 struct device *dev = bus->card->dev; 728 729 if (snd_BUG_ON(!dev)) 730 return -ENODEV; 731 err = request_firmware(&fw, patch, dev); 732 if (err < 0) { 733 printk(KERN_ERR "hda-codec: Cannot load the patch '%s'\n", 734 patch); 735 return err; 736 } 737 738 tmp = *fw; 739 line_mode = LINE_MODE_NONE; 740 codec = NULL; 741 while (get_line_from_fw(buf, sizeof(buf) - 1, &tmp)) { 742 if (!*buf || *buf == '#' || *buf == '\n') 743 continue; 744 if (*buf == '[') 745 line_mode = parse_line_mode(buf, bus); 746 else if (patch_items[line_mode].parser) 747 patch_items[line_mode].parser(buf, bus, &codec); 748 } 749 release_firmware(fw); 750 return 0; 751 } 752 EXPORT_SYMBOL_HDA(snd_hda_load_patch); 753 #endif /* CONFIG_SND_HDA_PATCH_LOADER */ -
GPL/trunk/alsa-kernel/pci/hda/hda_intel.c
r445 r464 67 67 static int single_cmd; 68 68 static int enable_msi; 69 #ifdef CONFIG_SND_HDA_PATCH_LOADER 70 static char *patch[SNDRV_CARDS]; 71 #endif 69 72 70 73 module_param_array(index, int, NULL, 0444); … … 90 93 module_param(enable_msi, int, 0444); 91 94 MODULE_PARM_DESC(enable_msi, "Enable Message Signaled Interrupt (MSI)"); 95 #ifdef CONFIG_SND_HDA_PATCH_LOADER 96 module_param_array(patch, charp, NULL, 0444); 97 MODULE_PARM_DESC(patch, "Patch file for Intel HD audio interface."); 98 #endif 92 99 93 100 #ifdef CONFIG_SND_HDA_POWER_SAVE … … 134 141 MODULE_DESCRIPTION("Intel HDA driver"); 135 142 143 #ifdef CONFIG_SND_VERBOSE_PRINTK 144 #define SFX /* nop */ 145 #else 136 146 #define SFX "hda-intel: " 137 147 #endif 138 148 139 149 /* … … 141 151 */ 142 152 #define ICH6_REG_GCAP 0x00 153 #define ICH6_GCAP_64OK (1 << 0) /* 64bit address support */ 154 #define ICH6_GCAP_NSDO (3 << 1) /* # of serial data out signals */ 155 #define ICH6_GCAP_BSS (31 << 3) /* # of bidirectional streams */ 156 #define ICH6_GCAP_ISS (15 << 8) /* # of input streams */ 157 #define ICH6_GCAP_OSS (15 << 12) /* # of output streams */ 143 158 #define ICH6_REG_VMIN 0x02 144 159 #define ICH6_REG_VMAJ 0x03 … … 146 161 #define ICH6_REG_INPAY 0x06 147 162 #define ICH6_REG_GCTL 0x08 163 #define ICH6_GCTL_RESET (1 << 0) /* controller reset */ 164 #define ICH6_GCTL_FCNTRL (1 << 1) /* flush control */ 165 #define ICH6_GCTL_UNSOL (1 << 8) /* accept unsol. response enable */ 148 166 #define ICH6_REG_WAKEEN 0x0c 149 167 #define ICH6_REG_STATESTS 0x0e 150 168 #define ICH6_REG_GSTS 0x10 169 #define ICH6_GSTS_FSTS (1 << 1) /* flush status */ 151 170 #define ICH6_REG_INTCTL 0x20 152 171 #define ICH6_REG_INTSTS 0x24 … … 156 175 #define ICH6_REG_CORBUBASE 0x44 157 176 #define ICH6_REG_CORBWP 0x48 158 #define ICH6_REG_CORBRP 0x4A 177 #define ICH6_REG_CORBRP 0x4a 178 #define ICH6_CORBRP_RST (1 << 15) /* read pointer reset */ 159 179 #define ICH6_REG_CORBCTL 0x4c 180 #define ICH6_CORBCTL_RUN (1 << 1) /* enable DMA */ 181 #define ICH6_CORBCTL_CMEIE (1 << 0) /* enable memory error irq */ 160 182 #define ICH6_REG_CORBSTS 0x4d 183 #define ICH6_CORBSTS_CMEI (1 << 0) /* memory error indication */ 161 184 #define ICH6_REG_CORBSIZE 0x4e 162 185 … … 164 187 #define ICH6_REG_RIRBUBASE 0x54 165 188 #define ICH6_REG_RIRBWP 0x58 189 #define ICH6_RIRBWP_RST (1 << 15) /* write pointer reset */ 166 190 #define ICH6_REG_RINTCNT 0x5a 167 191 #define ICH6_REG_RIRBCTL 0x5c 192 #define ICH6_RBCTL_IRQ_EN (1 << 0) /* enable IRQ */ 193 #define ICH6_RBCTL_DMA_EN (1 << 1) /* enable DMA */ 194 #define ICH6_RBCTL_OVERRUN_EN (1 << 2) /* enable overrun irq */ 168 195 #define ICH6_REG_RIRBSTS 0x5d 196 #define ICH6_RBSTS_IRQ (1 << 0) /* response irq */ 197 #define ICH6_RBSTS_OVERRUN (1 << 2) /* overrun irq */ 169 198 #define ICH6_REG_RIRBSIZE 0x5e 170 199 … … 237 266 /* STATESTS int mask: S3,SD2,SD1,SD0 */ 238 267 #define AZX_MAX_CODECS 4 239 #define STATESTS_INT_MASK 0x0f268 #define STATESTS_INT_MASK ((1 << AZX_MAX_CODECS) - 1) 240 269 241 270 /* SD_CTL bits */ … … 263 292 #define ICH6_INT_GLOBAL_EN 0x80000000 /* global interrupt enable bit */ 264 293 265 /* GCTL unsolicited response enable bit */266 #define ICH6_GCTL_UREN (1<<8)267 268 /* GCTL reset bit */269 #define ICH6_GCTL_RESET (1<<0)270 271 /* CORB/RIRB control, read/write pointer */272 #define ICH6_RBCTL_DMA_EN 0x02 /* enable DMA */273 #define ICH6_RBCTL_IRQ_EN 0x01 /* enable IRQ */274 #define ICH6_RBRWP_CLR 0x8000 /* read/write pointer clear */275 294 /* below are so far hardcoded - should read registers in future */ 276 295 #define ICH6_MAX_CORB_ENTRIES 256 … … 367 386 /* for RIRB */ 368 387 unsigned short rp, wp; /* read/write pointers */ 369 int cmds ;/* number of pending requests */370 u32 res ;/* last read value */388 int cmds[AZX_MAX_CODECS]; /* number of pending requests */ 389 u32 res[AZX_MAX_CODECS]; /* last read value */ 371 390 }; 372 391 … … 428 447 429 448 /* for debugging */ 430 unsigned int last_cmd ; /* last issued command (to sync) */449 unsigned int last_cmd[AZX_MAX_CODECS]; 431 450 432 451 /* for pending irqs */ … … 523 542 static void azx_init_cmd_io(struct azx *chip) 524 543 { 544 spin_lock_irq(&chip->reg_lock); 525 545 /* CORB set up */ 526 546 chip->corb.addr = chip->rb.addr; … … 534 554 azx_writew(chip, CORBWP, 0); 535 555 /* reset the corb hw read pointer */ 536 azx_writew(chip, CORBRP, ICH6_ RBRWP_CLR);556 azx_writew(chip, CORBRP, ICH6_CORBRP_RST); 537 557 /* enable corb dma */ 538 azx_writeb(chip, CORBCTL, ICH6_ RBCTL_DMA_EN);558 azx_writeb(chip, CORBCTL, ICH6_CORBCTL_RUN); 539 559 540 560 /* RIRB set up */ 541 561 chip->rirb.addr = chip->rb.addr + 2048; 542 562 chip->rirb.buf = (u32 *)(chip->rb.area + 2048); 563 chip->rirb.wp = chip->rirb.rp = 0; 564 memset(chip->rirb.cmds, 0, sizeof(chip->rirb.cmds)); 543 565 azx_writel(chip, RIRBLBASE, (u32)chip->rirb.addr); 544 566 azx_writel(chip, RIRBUBASE, upper_32_bits(chip->rirb.addr)); … … 547 569 azx_writeb(chip, RIRBSIZE, 0x02); 548 570 /* reset the rirb hw write pointer */ 549 azx_writew(chip, RIRBWP, ICH6_R BRWP_CLR);571 azx_writew(chip, RIRBWP, ICH6_RIRBWP_RST); 550 572 /* set N=1, get RIRB response interrupt for new entry */ 551 573 azx_writew(chip, RINTCNT, 1); 552 574 /* enable rirb dma and response irq */ 553 575 azx_writeb(chip, RIRBCTL, ICH6_RBCTL_DMA_EN | ICH6_RBCTL_IRQ_EN); 554 chip->rirb.rp = chip->rirb.cmds = 0;576 spin_unlock_irq(&chip->reg_lock); 555 577 } 556 578 557 579 static void azx_free_cmd_io(struct azx *chip) 558 580 { 581 spin_lock_irq(&chip->reg_lock); 559 582 /* disable ringbuffer DMAs */ 560 583 azx_writeb(chip, RIRBCTL, 0); 561 584 azx_writeb(chip, CORBCTL, 0); 585 spin_unlock_irq(&chip->reg_lock); 586 } 587 588 static unsigned int azx_command_addr(u32 cmd) 589 { 590 unsigned int addr = cmd >> 28; 591 592 if (addr >= AZX_MAX_CODECS) { 593 snd_BUG(); 594 addr = 0; 595 } 596 597 return addr; 598 } 599 600 static unsigned int azx_response_addr(u32 res) 601 { 602 unsigned int addr = res & 0xf; 603 604 if (addr >= AZX_MAX_CODECS) { 605 snd_BUG(); 606 addr = 0; 607 } 608 609 return addr; 562 610 } 563 611 … … 566 614 { 567 615 struct azx *chip = bus->private_data; 616 unsigned int addr = azx_command_addr(val); 568 617 unsigned int wp; 618 619 spin_lock_irq(&chip->reg_lock); 569 620 570 621 /* add command to corb */ … … 573 624 wp %= ICH6_MAX_CORB_ENTRIES; 574 625 575 spin_lock_irq(&chip->reg_lock); 576 chip->rirb.cmds++; 626 chip->rirb.cmds[addr]++; 577 627 chip->corb.buf[wp] = cpu_to_le32(val); 578 628 azx_writel(chip, CORBWP, wp); 629 579 630 spin_unlock_irq(&chip->reg_lock); 580 631 … … 588 639 { 589 640 unsigned int rp, wp; 641 unsigned int addr; 590 642 u32 res, res_ex; 591 643 … … 594 646 return; 595 647 chip->rirb.wp = wp; 596 648 597 649 while (chip->rirb.rp != wp) { 598 650 chip->rirb.rp++; … … 602 654 res_ex = le32_to_cpu(chip->rirb.buf[rp + 1]); 603 655 res = le32_to_cpu(chip->rirb.buf[rp]); 656 addr = azx_response_addr(res_ex); 604 657 if (res_ex & ICH6_RIRB_EX_UNSOL_EV) 605 658 snd_hda_queue_unsol_event(chip->bus, res, res_ex); 606 else if (chip->rirb.cmds ) {607 chip->rirb.res = res;659 else if (chip->rirb.cmds[addr]) { 660 chip->rirb.res[addr] = res; 608 661 smp_wmb(); 609 chip->rirb.cmds--; 610 } 662 chip->rirb.cmds[addr]--; 663 } else 664 snd_printk(KERN_ERR SFX "spurious response %#x:%#x, " 665 "last cmd=%#08x\n", 666 res, res_ex, 667 chip->last_cmd[addr]); 611 668 } 612 669 } 613 670 614 671 /* receive a response */ 615 static unsigned int azx_rirb_get_response(struct hda_bus *bus) 672 static unsigned int azx_rirb_get_response(struct hda_bus *bus, 673 unsigned int addr) 616 674 { 617 675 struct azx *chip = bus->private_data; … … 629 687 spin_unlock_irq(&chip->reg_lock); 630 688 } 631 if (!chip->rirb.cmds ) {689 if (!chip->rirb.cmds[addr]) { 632 690 smp_rmb(); 633 return chip->rirb.res; /* the last value */ 691 bus->rirb_error = 0; 692 return chip->rirb.res[addr]; /* the last value */ 634 693 } 635 694 if (time_after(jiffies, timeout)) … … 655 714 #endif 656 715 if (chip->msi) { 657 snd_printk(KERN_WARNING "hda_intel: No response from codec, " 658 "disabling MSI: last cmd=0x%08x\n", chip->last_cmd); 716 snd_printk(KERN_WARNING SFX "No response from codec, " 717 "disabling MSI: last cmd=0x%08x\n", 718 chip->last_cmd[addr]); 659 719 free_irq(chip->irq, chip); 660 720 chip->irq = -1; 661 721 pci_disable_msi(chip->pci); 662 722 chip->msi = 0; 663 if (azx_acquire_irq(chip, 1) < 0) 723 if (azx_acquire_irq(chip, 1) < 0) { 724 bus->rirb_error = 1; 664 725 return -1; 726 } 665 727 goto again; 666 728 } 667 729 668 730 if (!chip->polling_mode) { 669 snd_printk(KERN_WARNING "hda_intel:azx_get_response timeout, "731 snd_printk(KERN_WARNING SFX "azx_get_response timeout, " 670 732 "switching to polling mode: last cmd=0x%08x\n", 671 chip->last_cmd );733 chip->last_cmd[addr]); 672 734 chip->polling_mode = 1; 673 735 goto again; … … 682 744 } 683 745 746 /* a fatal communication error; need either to reset or to fallback 747 * to the single_cmd mode 748 */ 749 bus->rirb_error = 1; 750 if (bus->allow_bus_reset && !bus->response_reset && !bus->in_reset) { 751 bus->response_reset = 1; 752 return -1; /* give a chance to retry */ 753 } 754 684 755 snd_printk(KERN_ERR "hda_intel: azx_get_response timeout, " 685 756 "switching to single_cmd mode: last cmd=0x%08x\n", 686 chip->last_cmd); 687 chip->rirb.rp = azx_readb(chip, RIRBWP); 688 chip->rirb.cmds = 0; 689 /* switch to single_cmd mode */ 757 chip->last_cmd[addr]); 690 758 chip->single_cmd = 1; 759 bus->response_reset = 0; 760 /* re-initialize CORB/RIRB */ 691 761 azx_free_cmd_io(chip); 762 azx_init_cmd_io(chip); 692 763 return -1; 693 764 } … … 703 774 */ 704 775 776 /* receive a response */ 777 static int azx_single_wait_for_response(struct azx *chip, unsigned int addr) 778 { 779 int timeout = 50; 780 781 while (timeout--) { 782 /* check IRV busy bit */ 783 if (azx_readw(chip, IRS) & ICH6_IRS_VALID) { 784 /* reuse rirb.res as the response return value */ 785 chip->rirb.res[addr] = azx_readl(chip, IR); 786 return 0; 787 } 788 udelay(1); 789 } 790 if (printk_ratelimit()) 791 snd_printd(SFX "get_response timeout: IRS=0x%x\n", 792 azx_readw(chip, IRS)); 793 chip->rirb.res[addr] = -1; 794 return -EIO; 795 } 796 705 797 /* send a command */ 706 798 static int azx_single_send_cmd(struct hda_bus *bus, u32 val) 707 799 { 708 800 struct azx *chip = bus->private_data; 801 unsigned int addr = azx_command_addr(val); 709 802 int timeout = 50; 710 803 804 bus->rirb_error = 0; 711 805 while (timeout--) { 712 806 /* check ICB busy bit */ … … 718 812 azx_writew(chip, IRS, azx_readw(chip, IRS) | 719 813 ICH6_IRS_BUSY); 720 return 0;814 return azx_single_wait_for_response(chip, addr); 721 815 } 722 816 udelay(1); … … 729 823 730 824 /* receive a response */ 731 static unsigned int azx_single_get_response(struct hda_bus *bus) 825 static unsigned int azx_single_get_response(struct hda_bus *bus, 826 unsigned int addr) 732 827 { 733 828 struct azx *chip = bus->private_data; 734 int timeout = 50; 735 736 while (timeout--) { 737 /* check IRV busy bit */ 738 if (azx_readw(chip, IRS) & ICH6_IRS_VALID) 739 return azx_readl(chip, IR); 740 udelay(1); 741 } 742 if (printk_ratelimit()) 743 snd_printd(SFX "get_response timeout: IRS=0x%x\n", 744 azx_readw(chip, IRS)); 745 return (unsigned int)-1; 829 return chip->rirb.res[addr]; 746 830 } 747 831 … … 758 842 struct azx *chip = bus->private_data; 759 843 760 chip->last_cmd = val;844 chip->last_cmd[azx_command_addr(val)] = val; 761 845 if (chip->single_cmd) 762 846 return azx_single_send_cmd(bus, val); … … 766 850 767 851 /* get a response */ 768 static unsigned int azx_get_response(struct hda_bus *bus) 852 static unsigned int azx_get_response(struct hda_bus *bus, 853 unsigned int addr) 769 854 { 770 855 struct azx *chip = bus->private_data; 771 856 if (chip->single_cmd) 772 return azx_single_get_response(bus );857 return azx_single_get_response(bus, addr); 773 858 else 774 return azx_rirb_get_response(bus );859 return azx_rirb_get_response(bus, addr); 775 860 } 776 861 … … 811 896 /* check to see if controller is ready */ 812 897 if (!azx_readb(chip, GCTL)) { 813 snd_printd( "azx_reset: controller not ready!\n");898 snd_printd(SFX "azx_reset: controller not ready!\n"); 814 899 return -EBUSY; 815 900 } 816 901 817 902 /* Accept unsolicited responses */ 818 azx_writel(chip, GCTL, azx_readl(chip, GCTL) | ICH6_GCTL_U REN);903 azx_writel(chip, GCTL, azx_readl(chip, GCTL) | ICH6_GCTL_UNSOL); 819 904 820 905 /* detect codecs */ 821 906 if (!chip->codec_mask) { 822 907 chip->codec_mask = azx_readw(chip, STATESTS); 823 snd_printdd( "codec_mask = 0x%x\n", chip->codec_mask);908 snd_printdd(SFX "codec_mask = 0x%x\n", chip->codec_mask); 824 909 } 825 910 … … 931 1016 932 1017 /* initialize the codec command I/O */ 933 if (!chip->single_cmd) 934 azx_init_cmd_io(chip); 1018 azx_init_cmd_io(chip); 935 1019 936 1020 /* program the position buffer */ … … 989 1073 pci_read_config_word(chip->pci, INTEL_SCH_HDA_DEVC, &snoop); 990 1074 if (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP) { 991 pci_write_config_word(chip->pci, INTEL_SCH_HDA_DEVC, \1075 pci_write_config_word(chip->pci, INTEL_SCH_HDA_DEVC, 992 1076 snoop & (~INTEL_SCH_HDA_DEVC_NOSNOOP)); 993 1077 pci_read_config_word(chip->pci, 994 1078 INTEL_SCH_HDA_DEVC, &snoop); 995 snd_printdd( "HDA snoop disabled, enabling ... %s\n",\996 (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP) \1079 snd_printdd(SFX "HDA snoop disabled, enabling ... %s\n", 1080 (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP) 997 1081 ? "Failed" : "OK"); 998 1082 } … … 1048 1132 status = azx_readb(chip, RIRBSTS); 1049 1133 if (status & RIRB_INT_MASK) { 1050 if ( !chip->single_cmd && (status & RIRB_INT_RESPONSE))1134 if (status & RIRB_INT_RESPONSE) 1051 1135 azx_update_rirb(chip); 1052 1136 azx_writeb(chip, RIRBSTS, RIRB_INT_MASK); … … 1140 1224 pos_adj = frames_to_bytes(runtime, pos_adj); 1141 1225 if (pos_adj >= period_bytes) { 1142 snd_printk(KERN_WARNING "Too big adjustment %d\n",1226 snd_printk(KERN_WARNING SFX "Too big adjustment %d\n", 1143 1227 bdl_pos_adj[chip->dev_index]); 1144 1228 pos_adj = 0; … … 1164 1248 1165 1249 error: 1166 snd_printk(KERN_ERR "Too many BDL entries: buffer=%d, period=%d\n",1250 snd_printk(KERN_ERR SFX "Too many BDL entries: buffer=%d, period=%d\n", 1167 1251 azx_dev->bufsize, period_bytes); 1168 1252 return -EINVAL; … … 1251 1335 unsigned int res; 1252 1336 1337 mutex_lock(&chip->bus->cmd_mutex); 1253 1338 chip->probing = 1; 1254 1339 azx_send_cmd(chip->bus, cmd); 1255 res = azx_get_response(chip->bus );1340 res = azx_get_response(chip->bus, addr); 1256 1341 chip->probing = 0; 1342 mutex_unlock(&chip->bus->cmd_mutex); 1257 1343 if (res == -1) 1258 1344 return -EIO; 1259 snd_printdd( "hda_intel:codec #%d probed OK\n", addr);1345 snd_printdd(SFX "codec #%d probed OK\n", addr); 1260 1346 return 0; 1261 1347 } … … 1264 1350 struct hda_pcm *cpcm); 1265 1351 static void azx_stop_chip(struct azx *chip); 1352 1353 static void azx_bus_reset(struct hda_bus *bus) 1354 { 1355 struct azx *chip = bus->private_data; 1356 1357 bus->in_reset = 1; 1358 azx_stop_chip(chip); 1359 azx_init_chip(chip); 1360 #ifdef CONFIG_PM 1361 if (chip->initialized) { 1362 int i; 1363 1364 for (i = 0; i < AZX_MAX_PCMS; i++) 1365 snd_pcm_suspend_all(chip->pcm[i]); 1366 snd_hda_suspend(chip->bus); 1367 snd_hda_resume(chip->bus); 1368 } 1369 #endif 1370 bus->in_reset = 0; 1371 } 1266 1372 1267 1373 /* … … 1274 1380 }; 1275 1381 1276 static int __devinit azx_codec_create(struct azx *chip, const char *model, 1277 int no_init) 1382 static int __devinit azx_codec_create(struct azx *chip, const char *model) 1278 1383 { 1279 1384 struct hda_bus_template bus_temp; … … 1288 1393 bus_temp.ops.get_response = azx_get_response; 1289 1394 bus_temp.ops.attach_pcm = azx_attach_pcm_stream; 1395 bus_temp.ops.bus_reset = azx_bus_reset; 1290 1396 #ifdef CONFIG_SND_HDA_POWER_SAVE 1291 1397 bus_temp.power_save = &power_save; … … 1312 1418 * that don't exist 1313 1419 */ 1314 snd_printk(KERN_WARNING 1315 " hda_intel:Codec #%d probe error; "1420 snd_printk(KERN_WARNING SFX 1421 "Codec #%d probe error; " 1316 1422 "disabling it...\n", c); 1317 1423 chip->codec_mask &= ~(1 << c); … … 1333 1439 if ((chip->codec_mask & (1 << c)) & chip->codec_probe_mask) { 1334 1440 struct hda_codec *codec; 1335 err = snd_hda_codec_new(chip->bus, c, !no_init,&codec);1441 err = snd_hda_codec_new(chip->bus, c, &codec); 1336 1442 if (err < 0) 1337 1443 continue; … … 1343 1449 return -ENXIO; 1344 1450 } 1345 1451 return 0; 1452 } 1453 1454 /* configure each codec instance */ 1455 static int __devinit azx_codec_configure(struct azx *chip) 1456 { 1457 struct hda_codec *codec; 1458 list_for_each_entry(codec, &chip->bus->codec_list, list, struct hda_codec) { 1459 snd_hda_codec_configure(codec); 1460 } 1346 1461 return 0; 1347 1462 } … … 1441 1556 return err; 1442 1557 } 1558 snd_pcm_limit_hw_rates(runtime); 1559 /* sanity check */ 1560 if (snd_BUG_ON(!runtime->hw.channels_min) || 1561 snd_BUG_ON(!runtime->hw.channels_max) || 1562 snd_BUG_ON(!runtime->hw.formats) || 1563 snd_BUG_ON(!runtime->hw.rates)) { 1564 azx_release_device(azx_dev); 1565 hinfo->ops.close(hinfo, apcm->codec, substream); 1566 snd_hda_power_down(apcm->codec); 1567 mutex_unlock(&chip->open_mutex); 1568 return -EINVAL; 1569 } 1443 1570 spin_lock_irqsave(&chip->reg_lock, flags); 1444 1571 azx_dev->substream = substream; … … 1449 1576 snd_pcm_set_sync(substream); 1450 1577 mutex_unlock(&chip->open_mutex); 1451 1452 1578 return 0; 1453 1579 } … … 1529 1655 period_bytes = snd_pcm_lib_period_bytes(substream); 1530 1656 1531 snd_printdd( "azx_pcm_prepare: bufsize=0x%x, format=0x%x\n",1657 snd_printdd(SFX "azx_pcm_prepare: bufsize=0x%x, format=0x%x\n", 1532 1658 bufsize, format_val); 1533 1659 … … 1872 1998 if (err < 0) 1873 1999 return err; 1874 str cpy(pcm->name, cpcm->name);2000 strlcpy(pcm->name, cpcm->name, sizeof(pcm->name)); 1875 2001 apcm = kzalloc(sizeof(*apcm), GFP_KERNEL); 1876 2002 if (apcm == NULL) … … 2017 2143 snd_pcm_suspend_all(chip->pcm[i]); 2018 2144 if (chip->initialized) 2019 snd_hda_suspend(chip->bus , state);2145 snd_hda_suspend(chip->bus); 2020 2146 azx_stop_chip(chip); 2021 2147 if (chip->irq >= 0) { … … 2188 2314 SND_PCI_QUIRK(0x17c0, 0x4085, "Medion MD96630", 0x01), 2189 2315 /* forced codec slots */ 2316 SND_PCI_QUIRK(0x1043, 0x1262, "ASUS W5Fm", 0x103), 2190 2317 SND_PCI_QUIRK(0x1046, 0x1262, "ASUS W5F", 0x103), 2191 2318 {0} … … 2219 2346 } 2220 2347 2348 /* 2349 * white-list for enable_msi 2350 */ 2351 static struct snd_pci_quirk msi_white_list[] __devinitdata = { 2352 SND_PCI_QUIRK(0x103c, 0x3607, "HP Compa CQ40", 1), 2353 {0} 2354 }; 2355 2356 static void __devinit check_msi(struct azx *chip) 2357 { 2358 const struct snd_pci_quirk *q; 2359 2360 chip->msi = enable_msi; 2361 if (chip->msi) 2362 return; 2363 q = snd_pci_quirk_lookup(chip->pci, msi_white_list); 2364 if (q) { 2365 printk(KERN_INFO 2366 "hda_intel: msi for device %04x:%04x set to %d\n", 2367 q->subvendor, q->subdevice, q->value); 2368 chip->msi = q->value; 2369 } 2370 } 2371 2221 2372 2222 2373 /* … … 2253 2404 chip->irq = -1; 2254 2405 chip->driver_type = driver_type; 2255 ch ip->msi = enable_msi;2406 check_msi(chip); 2256 2407 chip->dev_index = dev; 2257 2408 INIT_WORK(&chip->irq_pending_work, azx_irq_pending_work); … … 2311 2462 2312 2463 gcap = azx_readw(chip, GCAP); 2313 snd_printdd("chipset global capabilities = 0x%x\n", gcap); 2314 2315 /* ATI chips seems buggy about 64bit DMA addresses */ 2316 if (chip->driver_type == AZX_DRIVER_ATI) 2317 gcap &= ~0x01; 2464 snd_printdd(SFX "chipset global capabilities = 0x%x\n", gcap); 2465 2466 /* disable SB600 64bit support for safety */ 2467 if ((chip->driver_type == AZX_DRIVER_ATI) || 2468 (chip->driver_type == AZX_DRIVER_ATIHDMI)) { 2469 struct pci_dev *p_smbus; 2470 p_smbus = pci_get_device(PCI_VENDOR_ID_ATI, 2471 PCI_DEVICE_ID_ATI_SBX00_SMBUS, 2472 NULL); 2473 if (p_smbus) { 2474 if (snd_pci_revision(p_smbus) < 0x30) 2475 gcap &= ~ICH6_GCAP_64OK; 2476 pci_dev_put(p_smbus); 2477 } 2478 } 2318 2479 2319 2480 /* allow 64bit DMA address if supported by H/W */ 2320 if ((gcap & 0x01) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64)))2481 if ((gcap & ICH6_GCAP_64OK) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64))) 2321 2482 pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(64)); 2322 2483 else { … … 2355 2516 GFP_KERNEL); 2356 2517 if (!chip->azx_dev) { 2357 snd_printk(KERN_ERR "cannot malloc azx_dev\n");2518 snd_printk(KERN_ERR SFX "cannot malloc azx_dev\n"); 2358 2519 goto errout; 2359 2520 } … … 2378 2539 } 2379 2540 /* allocate CORB/RIRB */ 2380 if (!chip->single_cmd) { 2381 err = azx_alloc_cmd_io(chip); 2382 if (err < 0) 2383 goto errout; 2384 } 2541 err = azx_alloc_cmd_io(chip); 2542 if (err < 0) 2543 goto errout; 2385 2544 2386 2545 /* initialize streams */ … … 2405 2564 2406 2565 strcpy(card->driver, "HDA-Intel"); 2407 strcpy(card->shortname, driver_short_names[chip->driver_type]); 2408 sprintf(card->longname, "%s at 0x%lx irq %i", 2409 card->shortname, chip->addr, chip->irq); 2566 strlcpy(card->shortname, driver_short_names[chip->driver_type], 2567 sizeof(card->shortname)); 2568 snprintf(card->longname, sizeof(card->longname), 2569 "%s at 0x%lx irq %i", 2570 card->shortname, chip->addr, chip->irq); 2410 2571 2411 2572 *rchip = chip; … … 2451 2612 } 2452 2613 2614 /* set this here since it's referred in snd_hda_load_patch() */ 2615 snd_card_set_dev(card, &pci->dev); 2616 2453 2617 err = azx_create(card, pci, dev, pci_id->driver_data, &chip); 2454 2618 if (err < 0) … … 2457 2621 2458 2622 /* create codec instances */ 2459 err = azx_codec_create(chip, model[dev] , probe_only[dev]);2623 err = azx_codec_create(chip, model[dev]); 2460 2624 if (err < 0) 2461 2625 goto out_free; 2626 #ifdef CONFIG_SND_HDA_PATCH_LOADER 2627 if (patch[dev]) { 2628 snd_printk(KERN_ERR SFX "Applying patch firmware '%s'\n", 2629 patch[dev]); 2630 err = snd_hda_load_patch(chip->bus, patch[dev]); 2631 if (err < 0) 2632 goto out_free; 2633 } 2634 #endif 2635 if (!probe_only[dev]) { 2636 err = azx_codec_configure(chip); 2637 if (err < 0) 2638 goto out_free; 2639 } 2462 2640 2463 2641 /* create PCM streams */ … … 2470 2648 if (err < 0) 2471 2649 goto out_free; 2472 2473 snd_card_set_dev(card, &pci->dev);2474 2650 2475 2651 err = snd_card_register(card); … … 2560 2736 /* Teradici */ 2561 2737 { PCI_DEVICE(0x6549, 0x1200), .driver_data = AZX_DRIVER_TERA }, 2562 /* AMD Generic, PCI class code and Vendor ID for HD Audio */ 2738 /* Creative X-Fi (CA0110-IBG) */ 2739 #if !defined(CONFIG_SND_CTXFI) && !defined(CONFIG_SND_CTXFI_MODULE) 2740 /* the following entry conflicts with snd-ctxfi driver, 2741 * as ctxfi driver mutates from HD-audio to native mode with 2742 * a special command sequence. 2743 */ 2744 { PCI_DEVICE(PCI_VENDOR_ID_CREATIVE, PCI_ANY_ID), 2745 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8, 2746 .class_mask = 0xffffff, 2747 .driver_data = AZX_DRIVER_GENERIC }, 2748 #else 2749 /* this entry seems still valid -- i.e. without emu20kx chip */ 2750 { PCI_DEVICE(0x1102, 0x0009), .driver_data = AZX_DRIVER_GENERIC }, 2751 #endif 2752 /* AMD/ATI Generic, PCI class code and Vendor ID for HD Audio */ 2563 2753 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_ANY_ID), 2754 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8, 2755 .class_mask = 0xffffff, 2756 .driver_data = AZX_DRIVER_GENERIC }, 2757 { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_ANY_ID), 2564 2758 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8, 2565 2759 .class_mask = 0xffffff, -
GPL/trunk/alsa-kernel/pci/hda/hda_local.h
r426 r464 100 100 unsigned int *tlv, const char **slaves); 101 101 int snd_hda_codec_reset(struct hda_codec *codec); 102 int snd_hda_codec_configure(struct hda_codec *codec);103 102 104 103 /* amp value bits */ … … 409 408 } 410 409 410 /* get the widget type from widget capability bits */ 411 #define get_wcaps_type(wcaps) (((wcaps) & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT) 412 413 static inline unsigned int get_wcaps_channels(u32 wcaps) 414 { 415 unsigned int chans; 416 417 chans = (wcaps & AC_WCAP_CHAN_CNT_EXT) >> 13; 418 chans = ((chans << 1) | 1) + 1; 419 420 return chans; 421 } 422 411 423 u32 query_amp_caps(struct hda_codec *codec, hda_nid_t nid, int direction); 412 424 int snd_hda_override_amp_caps(struct hda_codec *codec, hda_nid_t nid, int dir, -
GPL/trunk/alsa-kernel/pci/hda/hda_proc.c
r426 r464 467 467 int i, nodes; 468 468 469 snd_iprintf(buffer, "Codec: %s\n", 470 codec->name ? codec->name : "Not Set"); 469 snd_iprintf(buffer, "Codec: "); 470 if (codec->vendor_name && codec->chip_name) 471 snd_iprintf(buffer, "%s %s\n", 472 codec->vendor_name, codec->chip_name); 473 else 474 snd_iprintf(buffer, "Not Set\n"); 471 475 snd_iprintf(buffer, "Address: %d\n", codec->addr); 472 476 snd_iprintf(buffer, "Function Id: 0x%x\n", codec->function_id); … … 505 509 snd_hda_param_read(codec, nid, 506 510 AC_PAR_AUDIO_WIDGET_CAP); 507 unsigned int wid_type = 508 (wid_caps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT; 511 unsigned int wid_type = get_wcaps_type(wid_caps); 509 512 hda_nid_t conn[HDA_MAX_CONNECTIONS]; 510 513 int conn_len = 0; … … 513 516 get_wid_type_name(wid_type), wid_caps); 514 517 if (wid_caps & AC_WCAP_STEREO) { 515 unsigned int chans; 516 chans = (wid_caps & AC_WCAP_CHAN_CNT_EXT) >> 13; 517 chans = ((chans << 1) | 1) + 1; 518 unsigned int chans = get_wcaps_channels(wid_caps); 518 519 if (chans == 2) 519 520 snd_iprintf(buffer, " Stereo"); -
GPL/trunk/alsa-kernel/pci/hda/patch_analog.c
r426 r464 73 73 74 74 unsigned int jack_present :1; 75 unsigned int inv_jack_detect:1; 75 76 76 77 #ifdef CONFIG_SND_HDA_POWER_SAVE … … 670 671 }; 671 672 672 static struct snd_kcontrol_new ad1986a_laptop_ eapd_mixers[] = {673 static struct snd_kcontrol_new ad1986a_laptop_master_mixers[] = { 673 674 HDA_BIND_VOL("Master Playback Volume", &ad1986a_laptop_master_vol), 674 675 HDA_BIND_SW("Master Playback Switch", &ad1986a_laptop_master_sw), 675 HDA_CODEC_VOLUME("PCM Playback Volume", 0x03, 0x0, HDA_OUTPUT), 676 HDA_CODEC_MUTE("PCM Playback Switch", 0x03, 0x0, HDA_OUTPUT), 677 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x17, 0, HDA_OUTPUT), 678 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x17, 0, HDA_OUTPUT), 679 HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT), 680 HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT), 681 HDA_CODEC_VOLUME("Mic Boost", 0x0f, 0x0, HDA_OUTPUT), 682 HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT), 683 HDA_CODEC_MUTE("Capture Switch", 0x12, 0x0, HDA_OUTPUT), 684 { 685 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 686 .name = "Capture Source", 687 .info = ad198x_mux_enum_info, 688 .get = ad198x_mux_enum_get, 689 .put = ad198x_mux_enum_put, 690 }, 691 { 692 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 693 .name = "External Amplifier", 694 .info = ad198x_eapd_info, 695 .get = ad198x_eapd_get, 696 .put = ad198x_eapd_put, 697 .private_value = 0x1b | (1 << 8), /* port-D, inversed */ 698 }, 699 {0} /* end */ 700 }; 701 702 static struct snd_kcontrol_new ad1986a_samsung_mixers[] = { 703 HDA_BIND_VOL("Master Playback Volume", &ad1986a_laptop_master_vol), 704 HDA_BIND_SW("Master Playback Switch", &ad1986a_laptop_master_sw), 676 {0} /* end */ 677 }; 678 679 static struct snd_kcontrol_new ad1986a_laptop_eapd_mixers[] = { 705 680 HDA_CODEC_VOLUME("PCM Playback Volume", 0x03, 0x0, HDA_OUTPUT), 706 681 HDA_CODEC_MUTE("PCM Playback Switch", 0x03, 0x0, HDA_OUTPUT), … … 728 703 }; 729 704 705 static struct snd_kcontrol_new ad1986a_laptop_intmic_mixers[] = { 706 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x17, 0, HDA_OUTPUT), 707 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x17, 0, HDA_OUTPUT), 708 {0} /* end */ 709 }; 710 730 711 /* re-connect the mic boost input according to the jack sensing */ 731 712 static void ad1986a_automic(struct hda_codec *codec) … … 777 758 778 759 present = snd_hda_codec_read(codec, 0x1a, 0, AC_VERB_GET_PIN_SENSE, 0); 779 /* Lenovo N100 seems to report the reversed bit for HP jack-sensing */ 780 spec->jack_present = !(present & 0x80000000); 760 spec->jack_present = !!(present & 0x80000000); 761 if (spec->inv_jack_detect) 762 spec->jack_present = !spec->jack_present; 781 763 ad1986a_update_hp(codec); 782 764 } … … 817 799 } 818 800 819 static struct snd_kcontrol_new ad1986a_ laptop_automute_mixers[] = {801 static struct snd_kcontrol_new ad1986a_automute_master_mixers[] = { 820 802 HDA_BIND_VOL("Master Playback Volume", &ad1986a_laptop_master_vol), 821 803 { … … 827 809 .private_value = HDA_COMPOSE_AMP_VAL(0x1a, 3, 0, HDA_OUTPUT), 828 810 }, 829 HDA_CODEC_VOLUME("PCM Playback Volume", 0x03, 0x0, HDA_OUTPUT), 830 HDA_CODEC_MUTE("PCM Playback Switch", 0x03, 0x0, HDA_OUTPUT), 831 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x17, 0x0, HDA_OUTPUT), 832 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x17, 0x0, HDA_OUTPUT), 833 HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT), 834 HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT), 835 HDA_CODEC_VOLUME("Mic Boost", 0x0f, 0x0, HDA_OUTPUT), 836 HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT), 837 HDA_CODEC_MUTE("Capture Switch", 0x12, 0x0, HDA_OUTPUT), 838 { 839 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 840 .name = "Capture Source", 841 .info = ad198x_mux_enum_info, 842 .get = ad198x_mux_enum_get, 843 .put = ad198x_mux_enum_put, 844 }, 845 { 846 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 847 .name = "External Amplifier", 848 .info = ad198x_eapd_info, 849 .get = ad198x_eapd_get, 850 .put = ad198x_eapd_put, 851 .private_value = 0x1b | (1 << 8), /* port-D, inversed */ 852 }, 853 {0} /* end */ 854 }; 811 {0} /* end */ 812 }; 813 855 814 856 815 /* … … 982 941 }; 983 942 943 static void ad1986a_samsung_p50_unsol_event(struct hda_codec *codec, 944 unsigned int res) 945 { 946 switch (res >> 26) { 947 case AD1986A_HP_EVENT: 948 ad1986a_hp_automute(codec); 949 break; 950 case AD1986A_MIC_EVENT: 951 ad1986a_automic(codec); 952 break; 953 } 954 } 955 956 static int ad1986a_samsung_p50_init(struct hda_codec *codec) 957 { 958 ad198x_init(codec); 959 ad1986a_hp_automute(codec); 960 ad1986a_automic(codec); 961 return 0; 962 } 963 984 964 985 965 /* models */ … … 992 972 AD1986A_ULTRA, 993 973 AD1986A_SAMSUNG, 974 AD1986A_SAMSUNG_P50, 994 975 AD1986A_MODELS 995 976 }; … … 1003 984 [AD1986A_ULTRA] = "ultra", 1004 985 [AD1986A_SAMSUNG] = "samsung", 986 [AD1986A_SAMSUNG_P50] = "samsung-p50", 1005 987 }; 1006 988 … … 1025 1007 SND_PCI_QUIRK(0x144d, 0xb03c, "Samsung R55", AD1986A_3STACK), 1026 1008 SND_PCI_QUIRK(0x144d, 0xc01e, "FSC V2060", AD1986A_LAPTOP), 1009 SND_PCI_QUIRK(0x144d, 0xc024, "Samsung P50", AD1986A_SAMSUNG_P50), 1027 1010 SND_PCI_QUIRK(0x144d, 0xc027, "Samsung Q1", AD1986A_ULTRA), 1028 1011 SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc000, "Samsung", AD1986A_SAMSUNG), … … 1112 1095 break; 1113 1096 case AD1986A_LAPTOP_EAPD: 1114 spec->mixers[0] = ad1986a_laptop_eapd_mixers; 1097 spec->num_mixers = 3; 1098 spec->mixers[0] = ad1986a_laptop_master_mixers; 1099 spec->mixers[1] = ad1986a_laptop_eapd_mixers; 1100 spec->mixers[2] = ad1986a_laptop_intmic_mixers; 1115 1101 spec->num_init_verbs = 2; 1116 1102 spec->init_verbs[1] = ad1986a_eapd_init_verbs; … … 1123 1109 break; 1124 1110 case AD1986A_SAMSUNG: 1125 spec->mixers[0] = ad1986a_samsung_mixers; 1111 spec->num_mixers = 2; 1112 spec->mixers[0] = ad1986a_laptop_master_mixers; 1113 spec->mixers[1] = ad1986a_laptop_eapd_mixers; 1126 1114 spec->num_init_verbs = 3; 1127 1115 spec->init_verbs[1] = ad1986a_eapd_init_verbs; … … 1136 1124 codec->patch_ops.init = ad1986a_automic_init; 1137 1125 break; 1126 case AD1986A_SAMSUNG_P50: 1127 spec->num_mixers = 2; 1128 spec->mixers[0] = ad1986a_automute_master_mixers; 1129 spec->mixers[1] = ad1986a_laptop_eapd_mixers; 1130 spec->num_init_verbs = 4; 1131 spec->init_verbs[1] = ad1986a_eapd_init_verbs; 1132 spec->init_verbs[2] = ad1986a_automic_verbs; 1133 spec->init_verbs[3] = ad1986a_hp_init_verbs; 1134 spec->multiout.max_channels = 2; 1135 spec->multiout.num_dacs = 1; 1136 spec->multiout.dac_nids = ad1986a_laptop_dac_nids; 1137 if (!is_jack_available(codec, 0x25)) 1138 spec->multiout.dig_out_nid = 0; 1139 spec->input_mux = &ad1986a_automic_capture_source; 1140 codec->patch_ops.unsol_event = ad1986a_samsung_p50_unsol_event; 1141 codec->patch_ops.init = ad1986a_samsung_p50_init; 1142 break; 1138 1143 case AD1986A_LAPTOP_AUTOMUTE: 1139 spec->mixers[0] = ad1986a_laptop_automute_mixers; 1144 spec->num_mixers = 3; 1145 spec->mixers[0] = ad1986a_automute_master_mixers; 1146 spec->mixers[1] = ad1986a_laptop_eapd_mixers; 1147 spec->mixers[2] = ad1986a_laptop_intmic_mixers; 1140 1148 spec->num_init_verbs = 3; 1141 1149 spec->init_verbs[1] = ad1986a_eapd_init_verbs; … … 1149 1157 codec->patch_ops.unsol_event = ad1986a_hp_unsol_event; 1150 1158 codec->patch_ops.init = ad1986a_hp_init; 1159 /* Lenovo N100 seems to report the reversed bit 1160 * for HP jack-sensing 1161 */ 1162 spec->inv_jack_detect = 1; 1151 1163 break; 1152 1164 case AD1986A_ULTRA: … … 2971 2983 ad1988_models, ad1988_cfg_tbl); 2972 2984 if (board_config < 0) { 2973 printk(KERN_INFO "hda_codec: Unknown model for AD1988, trying auto-probe from BIOS...\n"); 2985 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", 2986 codec->chip_name); 2974 2987 board_config = AD1988_AUTO; 2975 2988 } … … 3735 3748 }; 3736 3749 3750 static int ad1884a_mobile_master_sw_put(struct snd_kcontrol *kcontrol, 3751 struct snd_ctl_elem_value *ucontrol) 3752 { 3753 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 3754 int ret = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol); 3755 int mute = (!ucontrol->value.integer.value[0] && 3756 !ucontrol->value.integer.value[1]); 3757 /* toggle GPIO1 according to the mute state */ 3758 snd_hda_codec_write_cache(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 3759 mute ? 0x02 : 0x0); 3760 return ret; 3761 } 3762 3737 3763 static struct snd_kcontrol_new ad1884a_mobile_mixers[] = { 3738 3764 HDA_CODEC_VOLUME("Master Playback Volume", 0x21, 0x0, HDA_OUTPUT), 3739 HDA_CODEC_MUTE("Master Playback Switch", 0x21, 0x0, HDA_OUTPUT), 3765 /*HDA_CODEC_MUTE("Master Playback Switch", 0x21, 0x0, HDA_OUTPUT),*/ 3766 { 3767 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 3768 .name = "Master Playback Switch", 3769 .info = snd_hda_mixer_amp_switch_info, 3770 .get = snd_hda_mixer_amp_switch_get, 3771 .put = ad1884a_mobile_master_sw_put, 3772 .private_value = HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT), 3773 }, 3740 3774 HDA_CODEC_VOLUME("PCM Playback Volume", 0x20, 0x5, HDA_INPUT), 3741 3775 HDA_CODEC_MUTE("PCM Playback Switch", 0x20, 0x5, HDA_INPUT), … … 3803 3837 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 3804 3838 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 3805 /* Port-F pin */3806 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_ HP},3839 /* Port-F (int speaker) pin */ 3840 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 3807 3841 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 3842 /* required for compaq 6530s/6531s speaker output */ 3843 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 3808 3844 /* Port-C pin - internal mic-in */ 3809 3845 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, … … 3858 3894 {0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_HP_EVENT}, 3859 3895 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_MIC_EVENT}, 3896 /* allow to touch GPIO1 (for mute control) */ 3897 {0x01, AC_VERB_SET_GPIO_MASK, 0x02}, 3898 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02}, 3899 {0x01, AC_VERB_SET_GPIO_DATA, 0x02}, /* first muted */ 3860 3900 {0} /* end */ 3861 3901 }; … … 3967 4007 SND_PCI_QUIRK(0x103c, 0x3056, "HP", AD1884A_MOBILE), 3968 4008 SND_PCI_QUIRK_MASK(0x103c, 0xfff0, 0x3070, "HP", AD1884A_MOBILE), 4009 SND_PCI_QUIRK_MASK(0x103c, 0xfff0, 0x30d0, "HP laptop", AD1884A_LAPTOP), 3969 4010 SND_PCI_QUIRK_MASK(0x103c, 0xfff0, 0x30e0, "HP laptop", AD1884A_LAPTOP), 3970 4011 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3600, "HP laptop", AD1884A_LAPTOP), 4012 SND_PCI_QUIRK_MASK(0x103c, 0xfff0, 0x7010, "HP laptop", AD1884A_MOBILE), 3971 4013 SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X300", AD1884A_THINKPAD), 3972 4014 {0} -
GPL/trunk/alsa-kernel/pci/hda/patch_atihdmi.c
r426 r464 142 142 */ 143 143 chans = get_wcaps(codec, CVT_NID); 144 chans = (chans & AC_WCAP_CHAN_CNT_EXT) >> 13; 145 chans = ((chans << 1) | 1) + 1; 144 chans = get_wcaps_channels(chans); 146 145 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = chans; 147 146 -
GPL/trunk/alsa-kernel/pci/hda/patch_cmedia.c
r426 r464 636 636 cmi9880_cfg_tbl); 637 637 if (spec->board_config < 0) { 638 snd_printdd(KERN_INFO "hda_codec: Unknown model for CMI9880\n"); 638 snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", 639 codec->chip_name); 639 640 spec->board_config = CMI_AUTO; /* try everything */ 640 641 } -
GPL/trunk/alsa-kernel/pci/hda/patch_conexant.c
r426 r464 109 109 hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS]; 110 110 111 unsigned int dell_automute; 112 unsigned int port_d_mode; 111 113 }; 112 114 … … 350 352 } 351 353 352 #ifdef CONFIG_SND_ JACK354 #ifdef CONFIG_SND_HDA_INPUT_JACK 353 355 static void conexant_free_jack_priv(struct snd_jack *jack) 354 356 { … … 464 466 static void conexant_free(struct hda_codec *codec) 465 467 { 466 #ifdef CONFIG_SND_ JACK468 #ifdef CONFIG_SND_HDA_INPUT_JACK 467 469 struct conexant_spec *spec = codec->spec; 468 470 if (spec->jacks.list) { … … 1849 1851 static struct snd_pci_quirk cxt5051_cfg_tbl[] = { 1850 1852 SND_PCI_QUIRK(0x103c, 0x30cf, "HP DV6736", CXT5051_HP_DV6736), 1853 SND_PCI_QUIRK(0x103c, 0x360b, "Compaq Presario CQ60", CXT5051_HP), 1851 1854 SND_PCI_QUIRK(0x14f1, 0x0101, "Conexant Reference board", 1852 1855 CXT5051_LAPTOP), … … 1908 1911 } 1909 1912 1913 /* Conexant 5066 specific */ 1914 1915 static hda_nid_t cxt5066_dac_nids[1] = { 0x10 }; 1916 static hda_nid_t cxt5066_adc_nids[3] = { 0x14, 0x15, 0x16 }; 1917 static hda_nid_t cxt5066_capsrc_nids[1] = { 0x17 }; 1918 #define CXT5066_SPDIF_OUT 0x21 1919 1920 static struct hda_channel_mode cxt5066_modes[1] = { 1921 { 2, NULL }, 1922 }; 1923 1924 static void cxt5066_update_speaker(struct hda_codec *codec) 1925 { 1926 struct conexant_spec *spec = codec->spec; 1927 unsigned int pinctl; 1928 1929 snd_printdd("CXT5066: update speaker, hp_present=%d\n", 1930 spec->hp_present); 1931 1932 /* Port A (HP) */ 1933 pinctl = ((spec->hp_present & 1) && spec->cur_eapd) ? PIN_HP : 0; 1934 snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 1935 pinctl); 1936 1937 /* Port D (HP/LO) */ 1938 pinctl = ((spec->hp_present & 2) && spec->cur_eapd) 1939 ? spec->port_d_mode : 0; 1940 snd_hda_codec_write(codec, 0x1c, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 1941 pinctl); 1942 1943 /* CLASS_D AMP */ 1944 pinctl = (!spec->hp_present && spec->cur_eapd) ? PIN_OUT : 0; 1945 snd_hda_codec_write(codec, 0x1f, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 1946 pinctl); 1947 1948 if (spec->dell_automute) { 1949 /* DELL AIO Port Rule: PortA > PortD > IntSpk */ 1950 pinctl = (!(spec->hp_present & 1) && spec->cur_eapd) 1951 ? PIN_OUT : 0; 1952 snd_hda_codec_write(codec, 0x1c, 0, 1953 AC_VERB_SET_PIN_WIDGET_CONTROL, pinctl); 1954 } 1955 } 1956 1957 /* turn on/off EAPD (+ mute HP) as a master switch */ 1958 static int cxt5066_hp_master_sw_put(struct snd_kcontrol *kcontrol, 1959 struct snd_ctl_elem_value *ucontrol) 1960 { 1961 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 1962 1963 if (!cxt_eapd_put(kcontrol, ucontrol)) 1964 return 0; 1965 1966 cxt5066_update_speaker(codec); 1967 return 1; 1968 } 1969 1970 /* toggle input of built-in and mic jack appropriately */ 1971 static void cxt5066_automic(struct hda_codec *codec) 1972 { 1973 static struct hda_verb ext_mic_present[] = { 1974 /* enable external mic, port B */ 1975 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 1976 1977 /* switch to external mic input */ 1978 {0x17, AC_VERB_SET_CONNECT_SEL, 0}, 1979 1980 /* disable internal mic, port C */ 1981 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 1982 {0} 1983 }; 1984 static struct hda_verb ext_mic_absent[] = { 1985 /* enable internal mic, port C */ 1986 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 1987 1988 /* switch to internal mic input */ 1989 {0x17, AC_VERB_SET_CONNECT_SEL, 1}, 1990 1991 /* disable external mic, port B */ 1992 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 1993 {0} 1994 }; 1995 unsigned int present; 1996 1997 present = snd_hda_codec_read(codec, 0x1a, 0, 1998 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 1999 if (present) { 2000 snd_printdd("CXT5066: external microphone detected\n"); 2001 snd_hda_sequence_write(codec, ext_mic_present); 2002 } else { 2003 snd_printdd("CXT5066: external microphone absent\n"); 2004 snd_hda_sequence_write(codec, ext_mic_absent); 2005 } 2006 } 2007 2008 /* mute internal speaker if HP is plugged */ 2009 static void cxt5066_hp_automute(struct hda_codec *codec) 2010 { 2011 struct conexant_spec *spec = codec->spec; 2012 unsigned int portA, portD; 2013 2014 /* Port A */ 2015 portA = snd_hda_codec_read(codec, 0x19, 0, AC_VERB_GET_PIN_SENSE, 0) 2016 & AC_PINSENSE_PRESENCE; 2017 2018 /* Port D */ 2019 portD = (snd_hda_codec_read(codec, 0x1c, 0, AC_VERB_GET_PIN_SENSE, 0) 2020 & AC_PINSENSE_PRESENCE) << 1; 2021 2022 spec->hp_present = !!(portA | portD); 2023 snd_printdd("CXT5066: hp automute portA=%x portD=%x present=%d\n", 2024 portA, portD, spec->hp_present); 2025 cxt5066_update_speaker(codec); 2026 } 2027 2028 /* unsolicited event for jack sensing */ 2029 static void cxt5066_unsol_event(struct hda_codec *codec, unsigned int res) 2030 { 2031 snd_printdd("CXT5066: unsol event %x (%x)\n", res, res >> 26); 2032 switch (res >> 26) { 2033 case CONEXANT_HP_EVENT: 2034 cxt5066_hp_automute(codec); 2035 break; 2036 case CONEXANT_MIC_EVENT: 2037 cxt5066_automic(codec); 2038 break; 2039 } 2040 } 2041 2042 static const struct hda_input_mux cxt5066_analog_mic_boost = { 2043 .num_items = 5, 2044 .items = { 2045 { "0dB", 0 }, 2046 { "10dB", 1 }, 2047 { "20dB", 2 }, 2048 { "30dB", 3 }, 2049 { "40dB", 4 }, 2050 }, 2051 }; 2052 2053 static int cxt5066_mic_boost_mux_enum_info(struct snd_kcontrol *kcontrol, 2054 struct snd_ctl_elem_info *uinfo) 2055 { 2056 return snd_hda_input_mux_info(&cxt5066_analog_mic_boost, uinfo); 2057 } 2058 2059 static int cxt5066_mic_boost_mux_enum_get(struct snd_kcontrol *kcontrol, 2060 struct snd_ctl_elem_value *ucontrol) 2061 { 2062 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 2063 int val; 2064 2065 val = snd_hda_codec_read(codec, 0x17, 0, 2066 AC_VERB_GET_AMP_GAIN_MUTE, AC_AMP_GET_OUTPUT); 2067 2068 ucontrol->value.enumerated.item[0] = val & AC_AMP_GAIN; 2069 return 0; 2070 } 2071 2072 static int cxt5066_mic_boost_mux_enum_put(struct snd_kcontrol *kcontrol, 2073 struct snd_ctl_elem_value *ucontrol) 2074 { 2075 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 2076 const struct hda_input_mux *imux = &cxt5066_analog_mic_boost; 2077 unsigned int idx; 2078 2079 if (!imux->num_items) 2080 return 0; 2081 idx = ucontrol->value.enumerated.item[0]; 2082 if (idx >= imux->num_items) 2083 idx = imux->num_items - 1; 2084 2085 snd_hda_codec_write_cache(codec, 0x17, 0, 2086 AC_VERB_SET_AMP_GAIN_MUTE, 2087 AC_AMP_SET_RIGHT | AC_AMP_SET_LEFT | AC_AMP_SET_OUTPUT | 2088 imux->items[idx].index); 2089 2090 return 1; 2091 } 2092 2093 static struct hda_input_mux cxt5066_capture_source = { 2094 .num_items = 4, 2095 .items = { 2096 { "Mic B", 0 }, 2097 { "Mic C", 1 }, 2098 { "Mic E", 2 }, 2099 { "Mic F", 3 }, 2100 }, 2101 }; 2102 2103 static struct hda_bind_ctls cxt5066_bind_capture_vol_others = { 2104 .ops = &snd_hda_bind_vol, 2105 .values = { 2106 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_INPUT), 2107 HDA_COMPOSE_AMP_VAL(0x14, 3, 2, HDA_INPUT), 2108 0 2109 }, 2110 }; 2111 2112 static struct hda_bind_ctls cxt5066_bind_capture_sw_others = { 2113 .ops = &snd_hda_bind_sw, 2114 .values = { 2115 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_INPUT), 2116 HDA_COMPOSE_AMP_VAL(0x14, 3, 2, HDA_INPUT), 2117 0 2118 }, 2119 }; 2120 2121 static struct snd_kcontrol_new cxt5066_mixer_master[] = { 2122 HDA_CODEC_VOLUME("Master Playback Volume", 0x10, 0x00, HDA_OUTPUT), 2123 {0} 2124 }; 2125 2126 static struct snd_kcontrol_new cxt5066_mixer_master_olpc[] = { 2127 { 2128 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 2129 .name = "Master Playback Volume", 2130 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | 2131 SNDRV_CTL_ELEM_ACCESS_TLV_READ | 2132 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK, 2133 .info = snd_hda_mixer_amp_volume_info, 2134 .get = snd_hda_mixer_amp_volume_get, 2135 .put = snd_hda_mixer_amp_volume_put, 2136 .tlv = { .c = snd_hda_mixer_amp_tlv }, 2137 /* offset by 28 volume steps to limit minimum gain to -46dB */ 2138 .private_value = 2139 HDA_COMPOSE_AMP_VAL_OFS(0x10, 3, 0, HDA_OUTPUT, 28), 2140 }, 2141 {0} 2142 }; 2143 2144 static struct snd_kcontrol_new cxt5066_mixers[] = { 2145 { 2146 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 2147 .name = "Master Playback Switch", 2148 .info = cxt_eapd_info, 2149 .get = cxt_eapd_get, 2150 .put = cxt5066_hp_master_sw_put, 2151 .private_value = 0x1d, 2152 }, 2153 2154 { 2155 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 2156 .name = "Analog Mic Boost Capture Enum", 2157 .info = cxt5066_mic_boost_mux_enum_info, 2158 .get = cxt5066_mic_boost_mux_enum_get, 2159 .put = cxt5066_mic_boost_mux_enum_put, 2160 }, 2161 2162 HDA_BIND_VOL("Capture Volume", &cxt5066_bind_capture_vol_others), 2163 HDA_BIND_SW("Capture Switch", &cxt5066_bind_capture_sw_others), 2164 {0} 2165 }; 2166 2167 static struct hda_verb cxt5066_init_verbs[] = { 2168 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, /* Port B */ 2169 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, /* Port C */ 2170 {0x1e, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Port F */ 2171 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Port E */ 2172 2173 /* Speakers */ 2174 {0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2175 {0x1f, AC_VERB_SET_CONNECT_SEL, 0x00}, /* DAC1 */ 2176 2177 /* HP, Amp */ 2178 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2179 {0x19, AC_VERB_SET_CONNECT_SEL, 0x00}, /* DAC1 */ 2180 2181 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2182 {0x1c, AC_VERB_SET_CONNECT_SEL, 0x00}, /* DAC1 */ 2183 2184 /* DAC1 */ 2185 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2186 2187 /* Node 14 connections: 0x17 0x18 0x23 0x24 0x27 */ 2188 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) | 0x50}, 2189 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 2190 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2) | 0x50}, 2191 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 2192 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 2193 2194 /* no digital microphone support yet */ 2195 {0x23, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 2196 2197 /* Audio input selector */ 2198 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x3}, 2199 2200 /* SPDIF route: PCM */ 2201 {0x20, AC_VERB_SET_CONNECT_SEL, 0x0}, 2202 {0x22, AC_VERB_SET_CONNECT_SEL, 0x0}, 2203 2204 {0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2205 {0x22, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2206 2207 /* EAPD */ 2208 {0x1d, AC_VERB_SET_EAPD_BTLENABLE, 0x2}, /* default on */ 2209 2210 /* not handling these yet */ 2211 {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, 0}, 2212 {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, 0}, 2213 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, 0}, 2214 {0x1c, AC_VERB_SET_UNSOLICITED_ENABLE, 0}, 2215 {0x1d, AC_VERB_SET_UNSOLICITED_ENABLE, 0}, 2216 {0x1e, AC_VERB_SET_UNSOLICITED_ENABLE, 0}, 2217 {0x20, AC_VERB_SET_UNSOLICITED_ENABLE, 0}, 2218 {0x22, AC_VERB_SET_UNSOLICITED_ENABLE, 0}, 2219 {0} /* end */ 2220 }; 2221 2222 static struct hda_verb cxt5066_init_verbs_olpc[] = { 2223 /* Port A: headphones */ 2224 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 2225 {0x19, AC_VERB_SET_CONNECT_SEL, 0x00}, /* DAC1 */ 2226 2227 /* Port B: external microphone */ 2228 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2229 2230 /* Port C: internal microphone */ 2231 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 2232 2233 /* Port D: unused */ 2234 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 2235 2236 /* Port E: unused, but has primary EAPD */ 2237 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 2238 {0x1d, AC_VERB_SET_EAPD_BTLENABLE, 0x2}, /* default on */ 2239 2240 /* Port F: unused */ 2241 {0x1e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 2242 2243 /* Port G: internal speakers */ 2244 {0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2245 {0x1f, AC_VERB_SET_CONNECT_SEL, 0x00}, /* DAC1 */ 2246 2247 /* DAC1 */ 2248 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2249 2250 /* DAC2: unused */ 2251 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2252 2253 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) | 0x50}, 2254 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 2255 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 2256 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 2257 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 2258 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 2259 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 2260 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 2261 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 2262 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 2263 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 2264 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 2265 2266 /* Disable digital microphone port */ 2267 {0x23, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 2268 2269 /* Audio input selectors */ 2270 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x3}, 2271 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 2272 2273 /* Disable SPDIF */ 2274 {0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 2275 {0x22, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 2276 2277 /* enable unsolicited events for Port A and B */ 2278 {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_HP_EVENT}, 2279 {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_MIC_EVENT}, 2280 {0} /* end */ 2281 }; 2282 2283 static struct hda_verb cxt5066_init_verbs_portd_lo[] = { 2284 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2285 {0} /* end */ 2286 }; 2287 2288 /* initialize jack-sensing, too */ 2289 static int cxt5066_init(struct hda_codec *codec) 2290 { 2291 snd_printdd("CXT5066: init\n"); 2292 conexant_init(codec); 2293 if (codec->patch_ops.unsol_event) { 2294 cxt5066_hp_automute(codec); 2295 cxt5066_automic(codec); 2296 } 2297 return 0; 2298 } 2299 2300 enum { 2301 CXT5066_LAPTOP, /* Laptops w/ EAPD support */ 2302 CXT5066_DELL_LAPTOP, /* Dell Laptop */ 2303 CXT5066_OLPC_XO_1_5, /* OLPC XO 1.5 */ 2304 CXT5066_MODELS 2305 }; 2306 2307 static const char *cxt5066_models[CXT5066_MODELS] = { 2308 [CXT5066_LAPTOP] = "laptop", 2309 [CXT5066_DELL_LAPTOP] = "dell-laptop", 2310 [CXT5066_OLPC_XO_1_5] = "olpc-xo-1_5", 2311 }; 2312 2313 static struct snd_pci_quirk cxt5066_cfg_tbl[] = { 2314 SND_PCI_QUIRK(0x14f1, 0x0101, "Conexant Reference board", 2315 CXT5066_LAPTOP), 2316 SND_PCI_QUIRK(0x1028, 0x02f5, "Dell", 2317 CXT5066_DELL_LAPTOP), 2318 {0} 2319 }; 2320 2321 static int patch_cxt5066(struct hda_codec *codec) 2322 { 2323 struct conexant_spec *spec; 2324 int board_config; 2325 2326 spec = kzalloc(sizeof(*spec), GFP_KERNEL); 2327 if (!spec) 2328 return -ENOMEM; 2329 codec->spec = spec; 2330 2331 codec->patch_ops = conexant_patch_ops; 2332 codec->patch_ops.init = cxt5066_init; 2333 2334 spec->dell_automute = 0; 2335 spec->multiout.max_channels = 2; 2336 spec->multiout.num_dacs = ARRAY_SIZE(cxt5066_dac_nids); 2337 spec->multiout.dac_nids = cxt5066_dac_nids; 2338 spec->multiout.dig_out_nid = CXT5066_SPDIF_OUT; 2339 spec->num_adc_nids = 1; 2340 spec->adc_nids = cxt5066_adc_nids; 2341 spec->capsrc_nids = cxt5066_capsrc_nids; 2342 spec->input_mux = &cxt5066_capture_source; 2343 2344 spec->port_d_mode = PIN_HP; 2345 2346 spec->num_init_verbs = 1; 2347 spec->init_verbs[0] = cxt5066_init_verbs; 2348 spec->num_channel_mode = ARRAY_SIZE(cxt5066_modes); 2349 spec->channel_mode = cxt5066_modes; 2350 spec->cur_adc = 0; 2351 spec->cur_adc_idx = 0; 2352 2353 board_config = snd_hda_check_board_config(codec, CXT5066_MODELS, 2354 cxt5066_models, cxt5066_cfg_tbl); 2355 switch (board_config) { 2356 default: 2357 case CXT5066_LAPTOP: 2358 spec->mixers[spec->num_mixers++] = cxt5066_mixer_master; 2359 spec->mixers[spec->num_mixers++] = cxt5066_mixers; 2360 break; 2361 case CXT5066_DELL_LAPTOP: 2362 spec->mixers[spec->num_mixers++] = cxt5066_mixer_master; 2363 spec->mixers[spec->num_mixers++] = cxt5066_mixers; 2364 2365 spec->port_d_mode = PIN_OUT; 2366 spec->init_verbs[spec->num_init_verbs] = cxt5066_init_verbs_portd_lo; 2367 spec->num_init_verbs++; 2368 spec->dell_automute = 1; 2369 break; 2370 case CXT5066_OLPC_XO_1_5: 2371 codec->patch_ops.unsol_event = cxt5066_unsol_event; 2372 spec->init_verbs[0] = cxt5066_init_verbs_olpc; 2373 spec->mixers[spec->num_mixers++] = cxt5066_mixer_master_olpc; 2374 spec->mixers[spec->num_mixers++] = cxt5066_mixers; 2375 spec->port_d_mode = 0; 2376 2377 /* no S/PDIF out */ 2378 spec->multiout.dig_out_nid = 0; 2379 2380 /* input source automatically selected */ 2381 spec->input_mux = NULL; 2382 break; 2383 } 2384 2385 return 0; 2386 } 1910 2387 1911 2388 /* … … 1919 2396 { .id = 0x14f15051, .name = "CX20561 (Hermosa)", 1920 2397 .patch = patch_cxt5051 }, 2398 { .id = 0x14f15066, .name = "CX20582 (Pebble)", 2399 .patch = patch_cxt5066 }, 1921 2400 {0} /* terminator */ 1922 2401 }; … … 1925 2404 MODULE_ALIAS("snd-hda-codec-id:14f15047"); 1926 2405 MODULE_ALIAS("snd-hda-codec-id:14f15051"); 2406 MODULE_ALIAS("snd-hda-codec-id:14f15066"); 1927 2407 1928 2408 MODULE_LICENSE("GPL"); -
GPL/trunk/alsa-kernel/pci/hda/patch_realtek.c
r426 r464 191 191 ALC272_DELL, 192 192 ALC272_DELL_ZM1, 193 ALC272_SAMSUNG_NC10, 193 194 ALC662_AUTO, 194 195 ALC662_MODEL_LAST, … … 206 207 ALC885_MACPRO, 207 208 ALC885_MBP3, 209 ALC885_MB5, 208 210 ALC885_IMAC24, 209 ALC882_AUTO,210 ALC882_MODEL_LAST,211 };212 213 /* ALC883 models */214 enum {215 211 ALC883_3ST_2ch_DIG, 216 212 ALC883_3ST_6ch_DIG, … … 219 215 ALC883_TARGA_DIG, 220 216 ALC883_TARGA_2ch_DIG, 217 ALC883_TARGA_8ch_DIG, 221 218 ALC883_ACER, 222 219 ALC883_ACER_ASPIRE, 223 220 ALC888_ACER_ASPIRE_4930G, 221 ALC888_ACER_ASPIRE_6530G, 222 ALC888_ACER_ASPIRE_8930G, 223 ALC888_ACER_ASPIRE_7730G, 224 224 ALC883_MEDION, 225 225 ALC883_MEDION_MD2, … … 237 237 ALC888_FUJITSU_XA3530, 238 238 ALC883_3ST_6ch_INTEL, 239 ALC889A_INTEL, 240 ALC889_INTEL, 239 241 ALC888_ASUS_M90V, 240 242 ALC888_ASUS_EEE1601, 243 ALC889A_MB31, 241 244 ALC1200_ASUS_P5Q, 242 ALC883_AUTO, 243 ALC883_MODEL_LAST, 244 }; 245 246 /* styles of capture selection */ 247 enum { 248 CAPT_MUX = 0, /* only mux based */ 249 CAPT_MIX, /* only mixer based */ 250 CAPT_1MUX_MIX, /* first mux and other mixers */ 245 ALC883_SONY_VAIO_TT, 246 ALC882_AUTO, 247 ALC882_MODEL_LAST, 251 248 }; 252 249 253 250 /* for GPIO Poll */ 254 251 #define GPIO_MASK 0x03 252 253 /* extra amp-initialization sequence types */ 254 enum { 255 ALC_INIT_NONE, 256 ALC_INIT_DEFAULT, 257 ALC_INIT_GPIO1, 258 ALC_INIT_GPIO2, 259 ALC_INIT_GPIO3, 260 }; 261 262 struct alc_mic_route { 263 hda_nid_t pin; 264 unsigned char mux_idx; 265 unsigned char amix_idx; 266 }; 267 268 #define MUX_IDX_UNDEF ((unsigned char)-1) 255 269 256 270 struct alc_spec { … … 267 281 unsigned int num_init_verbs; 268 282 269 char *stream_name_analog; /* analog PCM stream */283 char stream_name_analog[32]; /* analog PCM stream */ 270 284 struct hda_pcm_stream *stream_analog_playback; 271 285 struct hda_pcm_stream *stream_analog_capture; … … 273 287 struct hda_pcm_stream *stream_analog_alt_capture; 274 288 275 char *stream_name_digital; /* digital PCM stream */289 char stream_name_digital[32]; /* digital PCM stream */ 276 290 struct hda_pcm_stream *stream_digital_playback; 277 291 struct hda_pcm_stream *stream_digital_capture; … … 291 305 hda_nid_t *capsrc_nids; 292 306 hda_nid_t dig_in_nid; /* digital-in NID; optional */ 293 int capture_style; /* capture style (CAPT_*) */294 307 295 308 /* capture source */ … … 297 310 const struct hda_input_mux *input_mux; 298 311 unsigned int cur_mux[3]; 312 struct alc_mic_route ext_mic; 313 struct alc_mic_route int_mic; 299 314 300 315 /* channel model */ … … 302 317 int num_channel_mode; 303 318 int need_dac_fix; 319 int const_channel_count; 320 int ext_channel_count; 304 321 305 322 /* PCM information */ … … 311 328 struct hda_input_mux private_imux[3]; 312 329 hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS]; 330 hda_nid_t private_adc_nids[AUTO_CFG_MAX_OUTS]; 331 hda_nid_t private_capsrc_nids[AUTO_CFG_MAX_OUTS]; 313 332 314 333 /* hooks */ … … 320 339 unsigned int jack_present: 1; 321 340 unsigned int master_sw: 1; 341 unsigned int auto_mic:1; 322 342 323 343 /* other flags */ 324 344 unsigned int no_analog :1; /* digital I/O only */ 345 int init_amp; 325 346 326 347 /* for virtual master */ … … 356 377 const struct hda_channel_mode *channel_mode; 357 378 int need_dac_fix; 379 int const_channel_count; 358 380 unsigned int num_mux_defs; 359 381 const struct hda_input_mux *input_mux; 360 382 void (*unsol_event)(struct hda_codec *, unsigned int); 383 void (*setup)(struct hda_codec *); 361 384 void (*init_hook)(struct hda_codec *); 362 385 #ifdef CONFIG_SND_HDA_POWER_SAVE … … 401 424 hda_nid_t nid = spec->capsrc_nids ? 402 425 spec->capsrc_nids[adc_idx] : spec->adc_nids[adc_idx]; 426 unsigned int type; 403 427 404 428 mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx; 405 429 imux = &spec->input_mux[mux_idx]; 406 430 407 if (spec->capture_style &&408 !(spec->capture_style == CAPT_1MUX_MIX && !adc_idx)) {431 type = get_wcaps_type(get_wcaps(codec, nid)); 432 if (type == AC_WID_AUD_MIX) { 409 433 /* Matrix-mixer style (e.g. ALC882) */ 410 434 unsigned int *cur_val = &spec->cur_mux[adc_idx]; … … 450 474 return snd_hda_ch_mode_get(codec, ucontrol, spec->channel_mode, 451 475 spec->num_channel_mode, 452 spec-> multiout.max_channels);476 spec->ext_channel_count); 453 477 } 454 478 … … 460 484 int err = snd_hda_ch_mode_put(codec, ucontrol, spec->channel_mode, 461 485 spec->num_channel_mode, 462 &spec->multiout.max_channels); 463 if (err >= 0 && spec->need_dac_fix) 464 spec->multiout.num_dacs = spec->multiout.max_channels / 2; 486 &spec->ext_channel_count); 487 if (err >= 0 && !spec->const_channel_count) { 488 spec->multiout.max_channels = spec->ext_channel_count; 489 if (spec->need_dac_fix) 490 spec->multiout.num_dacs = spec->multiout.max_channels / 2; 491 } 465 492 return err; 466 493 } … … 544 571 /* Find enumerated value for current pinctl setting */ 545 572 i = alc_pin_mode_min(dir); 546 while ( alc_pin_mode_values[i] != pinctl && i <= alc_pin_mode_max(dir))573 while (i <= alc_pin_mode_max(dir) && alc_pin_mode_values[i] != pinctl) 547 574 i++; 548 575 *valp = i <= alc_pin_mode_max(dir) ? i: alc_pin_mode_min(dir); … … 777 804 if (pincap & AC_PINCAP_VREF_80) 778 805 val = PIN_VREF80; 806 else if (pincap & AC_PINCAP_VREF_50) 807 val = PIN_VREF50; 808 else if (pincap & AC_PINCAP_VREF_100) 809 val = PIN_VREF100; 810 else if (pincap & AC_PINCAP_VREF_GRD) 811 val = PIN_VREFGRD; 779 812 } 780 813 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, val); … … 821 854 * set up from the preset table 822 855 */ 823 static void setup_preset(struct alc_spec *spec,856 static void setup_preset(struct hda_codec *codec, 824 857 const struct alc_config_preset *preset) 825 858 { 859 struct alc_spec *spec = codec->spec; 826 860 int i; 827 861 … … 836 870 spec->num_channel_mode = preset->num_channel_mode; 837 871 spec->need_dac_fix = preset->need_dac_fix; 838 839 spec->multiout.max_channels = spec->channel_mode[0].channels; 872 spec->const_channel_count = preset->const_channel_count; 873 874 if (preset->const_channel_count) 875 spec->multiout.max_channels = preset->const_channel_count; 876 else 877 spec->multiout.max_channels = spec->channel_mode[0].channels; 878 spec->ext_channel_count = spec->channel_mode[0].channels; 840 879 841 880 spec->multiout.num_dacs = preset->num_dacs; … … 860 899 spec->loopback.amplist = preset->loopbacks; 861 900 #endif 901 902 if (preset->setup) 903 preset->setup(codec); 862 904 } 863 905 … … 916 958 } 917 959 918 static void alc_ sku_automute(struct hda_codec *codec)960 static void alc_automute_pin(struct hda_codec *codec) 919 961 { 920 962 struct alc_spec *spec = codec->spec; 921 unsigned int present; 922 unsigned int hp_nid = spec->autocfg.hp_pins[0]; 923 unsigned int sp_nid = spec->autocfg.speaker_pins[0]; 924 925 /* need to execute and sync at first */ 926 snd_hda_codec_read(codec, hp_nid, 0, AC_VERB_SET_PIN_SENSE, 0); 927 present = snd_hda_codec_read(codec, hp_nid, 0, 963 unsigned int present, pincap; 964 unsigned int nid = spec->autocfg.hp_pins[0]; 965 int i; 966 967 pincap = snd_hda_query_pin_caps(codec, nid); 968 if (pincap & AC_PINCAP_TRIG_REQ) /* need trigger? */ 969 snd_hda_codec_read(codec, nid, 0, AC_VERB_SET_PIN_SENSE, 0); 970 present = snd_hda_codec_read(codec, nid, 0, 928 971 AC_VERB_GET_PIN_SENSE, 0); 929 spec->jack_present = (present & 0x80000000) != 0; 930 snd_hda_codec_write(codec, sp_nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 931 spec->jack_present ? 0 : PIN_OUT); 932 } 933 934 #if 0 /* it's broken in some acses -- temporarily disabled */ 972 spec->jack_present = (present & AC_PINSENSE_PRESENCE) != 0; 973 for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) { 974 nid = spec->autocfg.speaker_pins[i]; 975 if (!nid) 976 break; 977 snd_hda_codec_write(codec, nid, 0, 978 AC_VERB_SET_PIN_WIDGET_CONTROL, 979 spec->jack_present ? 0 : PIN_OUT); 980 } 981 } 982 983 static int get_connection_index(struct hda_codec *codec, hda_nid_t mux, 984 hda_nid_t nid) 985 { 986 hda_nid_t conn[HDA_MAX_NUM_INPUTS]; 987 int i, nums; 988 989 nums = snd_hda_get_connections(codec, mux, conn, ARRAY_SIZE(conn)); 990 for (i = 0; i < nums; i++) 991 if (conn[i] == nid) 992 return i; 993 return -1; 994 } 995 935 996 static void alc_mic_automute(struct hda_codec *codec) 936 997 { 937 998 struct alc_spec *spec = codec->spec; 938 unsigned int present; 939 unsigned int mic_nid = spec->autocfg.input_pins[AUTO_PIN_MIC]; 940 unsigned int fmic_nid = spec->autocfg.input_pins[AUTO_PIN_FRONT_MIC]; 941 unsigned int mix_nid = spec->capsrc_nids[0]; 942 unsigned int capsrc_idx_mic, capsrc_idx_fmic; 943 944 capsrc_idx_mic = mic_nid - 0x18; 945 capsrc_idx_fmic = fmic_nid - 0x18; 946 present = snd_hda_codec_read(codec, mic_nid, 0, 947 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 948 snd_hda_codec_write(codec, mix_nid, 0, AC_VERB_SET_AMP_GAIN_MUTE, 949 0x7000 | (capsrc_idx_mic << 8) | (present ? 0 : 0x80)); 950 snd_hda_codec_write(codec, mix_nid, 0, AC_VERB_SET_AMP_GAIN_MUTE, 951 0x7000 | (capsrc_idx_fmic << 8) | (present ? 0x80 : 0)); 952 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, capsrc_idx_fmic, 953 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 954 } 955 #else 956 #define alc_mic_automute(codec) do {} while(0) /* NOP */ 957 #endif /* disabled */ 999 struct alc_mic_route *dead, *alive; 1000 unsigned int present, type; 1001 hda_nid_t cap_nid; 1002 1003 if (!spec->auto_mic) 1004 return; 1005 if (!spec->int_mic.pin || !spec->ext_mic.pin) 1006 return; 1007 if (snd_BUG_ON(!spec->adc_nids)) 1008 return; 1009 1010 cap_nid = spec->capsrc_nids ? spec->capsrc_nids[0] : spec->adc_nids[0]; 1011 1012 present = snd_hda_codec_read(codec, spec->ext_mic.pin, 0, 1013 AC_VERB_GET_PIN_SENSE, 0); 1014 present &= AC_PINSENSE_PRESENCE; 1015 if (present) { 1016 alive = &spec->ext_mic; 1017 dead = &spec->int_mic; 1018 } else { 1019 alive = &spec->int_mic; 1020 dead = &spec->ext_mic; 1021 } 1022 1023 type = get_wcaps_type(get_wcaps(codec, cap_nid)); 1024 if (type == AC_WID_AUD_MIX) { 1025 /* Matrix-mixer style (e.g. ALC882) */ 1026 snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT, 1027 alive->mux_idx, 1028 HDA_AMP_MUTE, 0); 1029 snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT, 1030 dead->mux_idx, 1031 HDA_AMP_MUTE, HDA_AMP_MUTE); 1032 } else { 1033 /* MUX style (e.g. ALC880) */ 1034 snd_hda_codec_write_cache(codec, cap_nid, 0, 1035 AC_VERB_SET_CONNECT_SEL, 1036 alive->mux_idx); 1037 } 1038 1039 /* FIXME: analog mixer */ 1040 } 958 1041 959 1042 /* unsolicited event for HP jack sensing */ … … 964 1047 else 965 1048 res >>= 26; 966 if (res == ALC880_HP_EVENT) 967 alc_sku_automute(codec); 968 969 if (res == ALC880_MIC_EVENT) 1049 switch (res) { 1050 case ALC880_HP_EVENT: 1051 alc_automute_pin(codec); 1052 break; 1053 case ALC880_MIC_EVENT: 970 1054 alc_mic_automute(codec); 1055 break; 1056 } 971 1057 } 972 1058 973 1059 static void alc_inithook(struct hda_codec *codec) 974 1060 { 975 alc_ sku_automute(codec);1061 alc_automute_pin(codec); 976 1062 alc_mic_automute(codec); 977 1063 } … … 995 1081 } 996 1082 997 /* 32-bit subsystem ID for BIOS loading in HD Audio codec. 998 * 31 ~ 16 : Manufacture ID 999 * 15 ~ 8 : SKU ID 1000 * 7 ~ 0 : Assembly ID 1001 * port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36 1002 */ 1003 static void alc_subsystem_id(struct hda_codec *codec, 1004 unsigned int porta, unsigned int porte, 1005 unsigned int portd) 1006 { 1007 unsigned int ass, tmp, i; 1008 unsigned nid; 1009 struct alc_spec *spec = codec->spec; 1010 1011 ass = codec->subsystem_id & 0xffff; 1012 if ((ass != codec->bus->pci->subsystem_device) && (ass & 1)) 1013 goto do_sku; 1014 1015 /* 1016 * 31~30 : port conetcivity 1017 * 29~21 : reserve 1018 * 20 : PCBEEP input 1019 * 19~16 : Check sum (15:1) 1020 * 15~1 : Custom 1021 * 0 : override 1022 */ 1023 nid = 0x1d; 1024 if (codec->vendor_id == 0x10ec0260) 1025 nid = 0x17; 1026 ass = snd_hda_codec_get_pincfg(codec, nid); 1027 if (!(ass & 1) && !(ass & 0x100000)) 1028 return; 1029 if ((ass >> 30) != 1) /* no physical connection */ 1030 return; 1031 1032 /* check sum */ 1033 tmp = 0; 1034 for (i = 1; i < 16; i++) { 1035 if ((ass >> i) & 1) 1036 tmp++; 1037 } 1038 if (((ass >> 16) & 0xf) != tmp) 1039 return; 1040 do_sku: 1041 /* 1042 * 0 : override 1043 * 1 : Swap Jack 1044 * 2 : 0 --> Desktop, 1 --> Laptop 1045 * 3~5 : External Amplifier control 1046 * 7~6 : Reserved 1047 */ 1048 tmp = (ass & 0x38) >> 3; /* external Amp control */ 1049 switch (tmp) { 1050 case 1: 1083 static void alc889_coef_init(struct hda_codec *codec) 1084 { 1085 unsigned int tmp; 1086 1087 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7); 1088 tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0); 1089 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7); 1090 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, tmp|0x2010); 1091 } 1092 1093 static void alc_auto_init_amp(struct hda_codec *codec, int type) 1094 { 1095 unsigned int tmp; 1096 1097 switch (type) { 1098 case ALC_INIT_GPIO1: 1051 1099 snd_hda_sequence_write(codec, alc_gpio1_init_verbs); 1052 1100 break; 1053 case 3:1101 case ALC_INIT_GPIO2: 1054 1102 snd_hda_sequence_write(codec, alc_gpio2_init_verbs); 1055 1103 break; 1056 case 7:1104 case ALC_INIT_GPIO3: 1057 1105 snd_hda_sequence_write(codec, alc_gpio3_init_verbs); 1058 1106 break; 1059 case 5: /* set EAPD output high */1107 case ALC_INIT_DEFAULT: 1060 1108 switch (codec->vendor_id) { 1061 1109 case 0x10ec0260: … … 1100 1148 case 0x10ec0887: 1101 1149 case 0x10ec0889: 1102 snd_hda_codec_write(codec, 0x20, 0, 1103 AC_VERB_SET_COEF_INDEX, 7); 1104 tmp = snd_hda_codec_read(codec, 0x20, 0, 1105 AC_VERB_GET_PROC_COEF, 0); 1106 snd_hda_codec_write(codec, 0x20, 0, 1107 AC_VERB_SET_COEF_INDEX, 7); 1108 snd_hda_codec_write(codec, 0x20, 0, 1109 AC_VERB_SET_PROC_COEF, 1110 tmp | 0x2010); 1150 alc889_coef_init(codec); 1111 1151 break; 1112 1152 case 0x10ec0888: 1113 /*alc888_coef_init(codec);*/ /* called in alc_init() */1153 alc888_coef_init(codec); 1114 1154 break; 1115 1155 case 0x10ec0267: … … 1126 1166 break; 1127 1167 } 1128 default: 1168 break; 1169 } 1170 } 1171 1172 static void alc_init_auto_hp(struct hda_codec *codec) 1173 { 1174 struct alc_spec *spec = codec->spec; 1175 1176 if (!spec->autocfg.hp_pins[0]) 1177 return; 1178 1179 if (!spec->autocfg.speaker_pins[0]) { 1180 if (spec->autocfg.line_out_pins[0] && 1181 spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT) 1182 spec->autocfg.speaker_pins[0] = 1183 spec->autocfg.line_out_pins[0]; 1184 else 1185 return; 1186 } 1187 1188 snd_printdd("realtek: Enable HP auto-muting on NID 0x%x\n", 1189 spec->autocfg.hp_pins[0]); 1190 snd_hda_codec_write_cache(codec, spec->autocfg.hp_pins[0], 0, 1191 AC_VERB_SET_UNSOLICITED_ENABLE, 1192 AC_USRSP_EN | ALC880_HP_EVENT); 1193 spec->unsol_event = alc_sku_unsol_event; 1194 } 1195 1196 static void alc_init_auto_mic(struct hda_codec *codec) 1197 { 1198 struct alc_spec *spec = codec->spec; 1199 struct auto_pin_cfg *cfg = &spec->autocfg; 1200 hda_nid_t fixed, ext; 1201 int i; 1202 1203 /* there must be only two mic inputs exclusively */ 1204 for (i = AUTO_PIN_LINE; i < AUTO_PIN_LAST; i++) 1205 if (cfg->input_pins[i]) 1206 return; 1207 1208 fixed = ext = 0; 1209 for (i = AUTO_PIN_MIC; i <= AUTO_PIN_FRONT_MIC; i++) { 1210 hda_nid_t nid = cfg->input_pins[i]; 1211 unsigned int defcfg; 1212 if (!nid) 1213 return; 1214 defcfg = snd_hda_codec_get_pincfg(codec, nid); 1215 switch (get_defcfg_connect(defcfg)) { 1216 case AC_JACK_PORT_FIXED: 1217 if (fixed) 1218 return; /* already occupied */ 1219 fixed = nid; 1220 break; 1221 case AC_JACK_PORT_COMPLEX: 1222 if (ext) 1223 return; /* already occupied */ 1224 ext = nid; 1225 break; 1226 default: 1227 return; /* invalid entry */ 1228 } 1229 } 1230 if (!(get_wcaps(codec, ext) & AC_WCAP_UNSOL_CAP)) 1231 return; /* no unsol support */ 1232 snd_printdd("realtek: Enable auto-mic switch on NID 0x%x/0x%x\n", 1233 ext, fixed); 1234 spec->ext_mic.pin = ext; 1235 spec->int_mic.pin = fixed; 1236 spec->ext_mic.mux_idx = MUX_IDX_UNDEF; /* set later */ 1237 spec->int_mic.mux_idx = MUX_IDX_UNDEF; /* set later */ 1238 spec->auto_mic = 1; 1239 snd_hda_codec_write_cache(codec, spec->ext_mic.pin, 0, 1240 AC_VERB_SET_UNSOLICITED_ENABLE, 1241 AC_USRSP_EN | ALC880_MIC_EVENT); 1242 spec->unsol_event = alc_sku_unsol_event; 1243 } 1244 1245 /* check subsystem ID and set up device-specific initialization; 1246 * return 1 if initialized, 0 if invalid SSID 1247 */ 1248 /* 32-bit subsystem ID for BIOS loading in HD Audio codec. 1249 * 31 ~ 16 : Manufacture ID 1250 * 15 ~ 8 : SKU ID 1251 * 7 ~ 0 : Assembly ID 1252 * port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36 1253 */ 1254 static int alc_subsystem_id(struct hda_codec *codec, 1255 hda_nid_t porta, hda_nid_t porte, 1256 hda_nid_t portd) 1257 { 1258 unsigned int ass, tmp, i; 1259 unsigned nid; 1260 struct alc_spec *spec = codec->spec; 1261 1262 ass = codec->subsystem_id & 0xffff; 1263 if ((ass != codec->bus->pci->subsystem_device) && (ass & 1)) 1264 goto do_sku; 1265 1266 /* invalid SSID, check the special NID pin defcfg instead */ 1267 /* 1268 * 31~30 : port connectivity 1269 * 29~21 : reserve 1270 * 20 : PCBEEP input 1271 * 19~16 : Check sum (15:1) 1272 * 15~1 : Custom 1273 * 0 : override 1274 */ 1275 nid = 0x1d; 1276 if (codec->vendor_id == 0x10ec0260) 1277 nid = 0x17; 1278 ass = snd_hda_codec_get_pincfg(codec, nid); 1279 snd_printd("realtek: No valid SSID, " 1280 "checking pincfg 0x%08x for NID 0x%x\n", 1281 ass, nid); 1282 if (!(ass & 1) && !(ass & 0x100000)) 1283 return 0; 1284 if ((ass >> 30) != 1) /* no physical connection */ 1285 return 0; 1286 1287 /* check sum */ 1288 tmp = 0; 1289 for (i = 1; i < 16; i++) { 1290 if ((ass >> i) & 1) 1291 tmp++; 1292 } 1293 if (((ass >> 16) & 0xf) != tmp) 1294 return 0; 1295 do_sku: 1296 snd_printd("realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n", 1297 ass & 0xffff, codec->vendor_id); 1298 /* 1299 * 0 : override 1300 * 1 : Swap Jack 1301 * 2 : 0 --> Desktop, 1 --> Laptop 1302 * 3~5 : External Amplifier control 1303 * 7~6 : Reserved 1304 */ 1305 tmp = (ass & 0x38) >> 3; /* external Amp control */ 1306 switch (tmp) { 1307 case 1: 1308 spec->init_amp = ALC_INIT_GPIO1; 1309 break; 1310 case 3: 1311 spec->init_amp = ALC_INIT_GPIO2; 1312 break; 1313 case 7: 1314 spec->init_amp = ALC_INIT_GPIO3; 1315 break; 1316 case 5: 1317 spec->init_amp = ALC_INIT_DEFAULT; 1129 1318 break; 1130 1319 } … … 1134 1323 */ 1135 1324 if (!(ass & 0x8000)) 1136 return ;1325 return 1; 1137 1326 /* 1138 1327 * 10~8 : Jack location … … 1142 1331 * when the external headphone out jack is plugged" 1143 1332 */ 1144 if (!spec->autocfg.speaker_pins[0]) {1145 if (spec->autocfg.line_out_pins[0])1146 spec->autocfg.speaker_pins[0] =1147 spec->autocfg.line_out_pins[0];1148 else1149 return;1150 }1151 1152 1333 if (!spec->autocfg.hp_pins[0]) { 1153 1334 tmp = (ass >> 11) & 0x3; /* HP to chassis */ … … 1159 1340 spec->autocfg.hp_pins[0] = portd; 1160 1341 else 1161 return ;1342 return 1; 1162 1343 } 1163 if (spec->autocfg.hp_pins[0]) 1164 snd_hda_codec_write(codec, spec->autocfg.hp_pins[0], 0, 1165 AC_VERB_SET_UNSOLICITED_ENABLE, 1166 AC_USRSP_EN | ALC880_HP_EVENT); 1167 1168 #if 0 /* it's broken in some acses -- temporarily disabled */ 1169 if (spec->autocfg.input_pins[AUTO_PIN_MIC] && 1170 spec->autocfg.input_pins[AUTO_PIN_FRONT_MIC]) 1171 snd_hda_codec_write(codec, 1172 spec->autocfg.input_pins[AUTO_PIN_MIC], 0, 1173 AC_VERB_SET_UNSOLICITED_ENABLE, 1174 AC_USRSP_EN | ALC880_MIC_EVENT); 1175 #endif /* disabled */ 1176 1177 spec->unsol_event = alc_sku_unsol_event; 1344 1345 alc_init_auto_hp(codec); 1346 alc_init_auto_mic(codec); 1347 return 1; 1348 } 1349 1350 static void alc_ssid_check(struct hda_codec *codec, 1351 hda_nid_t porta, hda_nid_t porte, hda_nid_t portd) 1352 { 1353 if (!alc_subsystem_id(codec, porta, porte, portd)) { 1354 struct alc_spec *spec = codec->spec; 1355 snd_printd("realtek: " 1356 "Enable default setup for auto mode as fallback\n"); 1357 spec->init_amp = ALC_INIT_DEFAULT; 1358 alc_init_auto_hp(codec); 1359 alc_init_auto_mic(codec); 1360 } 1178 1361 } 1179 1362 … … 1310 1493 }; 1311 1494 1312 static void alc888_fujitsu_xa3530_automute(struct hda_codec *codec) 1313 { 1314 unsigned int present; 1315 unsigned int bits; 1316 /* Line out presence */ 1317 present = snd_hda_codec_read(codec, 0x17, 0, 1318 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 1319 /* HP out presence */ 1320 present = present || snd_hda_codec_read(codec, 0x1b, 0, 1321 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 1322 bits = present ? HDA_AMP_MUTE : 0; 1495 static void alc_automute_amp(struct hda_codec *codec) 1496 { 1497 struct alc_spec *spec = codec->spec; 1498 unsigned int val, mute, pincap; 1499 hda_nid_t nid; 1500 int i; 1501 1502 spec->jack_present = 0; 1503 for (i = 0; i < ARRAY_SIZE(spec->autocfg.hp_pins); i++) { 1504 nid = spec->autocfg.hp_pins[i]; 1505 if (!nid) 1506 break; 1507 pincap = snd_hda_query_pin_caps(codec, nid); 1508 if (pincap & AC_PINCAP_TRIG_REQ) /* need trigger? */ 1509 snd_hda_codec_read(codec, nid, 0, 1510 AC_VERB_SET_PIN_SENSE, 0); 1511 val = snd_hda_codec_read(codec, nid, 0, 1512 AC_VERB_GET_PIN_SENSE, 0); 1513 if (val & AC_PINSENSE_PRESENCE) { 1514 spec->jack_present = 1; 1515 break; 1516 } 1517 } 1518 1519 mute = spec->jack_present ? HDA_AMP_MUTE : 0; 1323 1520 /* Toggle internal speakers muting */ 1324 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 1325 HDA_AMP_MUTE, bits); 1326 /* Toggle internal bass muting */ 1327 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 1328 HDA_AMP_MUTE, bits); 1329 } 1330 1331 static void alc888_fujitsu_xa3530_unsol_event(struct hda_codec *codec, 1332 unsigned int res) 1333 { 1334 if (res >> 26 == ALC880_HP_EVENT) 1335 alc888_fujitsu_xa3530_automute(codec); 1336 } 1337 1521 for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) { 1522 nid = spec->autocfg.speaker_pins[i]; 1523 if (!nid) 1524 break; 1525 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0, 1526 HDA_AMP_MUTE, mute); 1527 } 1528 } 1529 1530 static void alc_automute_amp_unsol_event(struct hda_codec *codec, 1531 unsigned int res) 1532 { 1533 if (codec->vendor_id == 0x10ec0880) 1534 res >>= 28; 1535 else 1536 res >>= 26; 1537 if (res == ALC880_HP_EVENT) 1538 alc_automute_amp(codec); 1539 } 1540 1541 static void alc889_automute_setup(struct hda_codec *codec) 1542 { 1543 struct alc_spec *spec = codec->spec; 1544 1545 spec->autocfg.hp_pins[0] = 0x15; 1546 spec->autocfg.speaker_pins[0] = 0x14; 1547 spec->autocfg.speaker_pins[1] = 0x16; 1548 spec->autocfg.speaker_pins[2] = 0x17; 1549 spec->autocfg.speaker_pins[3] = 0x19; 1550 spec->autocfg.speaker_pins[4] = 0x1a; 1551 } 1552 1553 static void alc889_intel_init_hook(struct hda_codec *codec) 1554 { 1555 alc889_coef_init(codec); 1556 alc_automute_amp(codec); 1557 } 1558 1559 static void alc888_fujitsu_xa3530_setup(struct hda_codec *codec) 1560 { 1561 struct alc_spec *spec = codec->spec; 1562 1563 spec->autocfg.hp_pins[0] = 0x17; /* line-out */ 1564 spec->autocfg.hp_pins[1] = 0x1b; /* hp */ 1565 spec->autocfg.speaker_pins[0] = 0x14; /* speaker */ 1566 spec->autocfg.speaker_pins[1] = 0x15; /* bass */ 1567 } 1338 1568 1339 1569 /* … … 1359 1589 }; 1360 1590 1591 /* 1592 * ALC888 Acer Aspire 6530G model 1593 */ 1594 1595 static struct hda_verb alc888_acer_aspire_6530g_verbs[] = { 1596 /* Bias voltage on for external mic port */ 1597 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80}, 1598 /* Front Mic: set to PIN_IN (empty by default) */ 1599 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 1600 /* Unselect Front Mic by default in input mixer 3 */ 1601 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)}, 1602 /* Enable unsolicited event for HP jack */ 1603 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 1604 /* Enable speaker output */ 1605 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 1606 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1607 /* Enable headphone output */ 1608 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP}, 1609 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1610 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 1611 {0} 1612 }; 1613 1614 /* 1615 * ALC889 Acer Aspire 8930G model 1616 */ 1617 1618 static struct hda_verb alc889_acer_aspire_8930g_verbs[] = { 1619 /* Front Mic: set to PIN_IN (empty by default) */ 1620 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 1621 /* Unselect Front Mic by default in input mixer 3 */ 1622 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)}, 1623 /* Enable unsolicited event for HP jack */ 1624 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 1625 /* Connect Internal Front to Front */ 1626 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 1627 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1628 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 1629 /* Connect Internal Rear to Rear */ 1630 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 1631 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1632 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01}, 1633 /* Connect Internal CLFE to CLFE */ 1634 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 1635 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1636 {0x16, AC_VERB_SET_CONNECT_SEL, 0x02}, 1637 /* Connect HP out to Front */ 1638 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP}, 1639 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 1640 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 1641 /* Enable all DACs */ 1642 /* DAC DISABLE/MUTE 1? */ 1643 /* setting bits 1-5 disables DAC nids 0x02-0x06 apparently. Init=0x38 */ 1644 {0x20, AC_VERB_SET_COEF_INDEX, 0x03}, 1645 {0x20, AC_VERB_SET_PROC_COEF, 0x0000}, 1646 /* DAC DISABLE/MUTE 2? */ 1647 /* some bit here disables the other DACs. Init=0x4900 */ 1648 {0x20, AC_VERB_SET_COEF_INDEX, 0x08}, 1649 {0x20, AC_VERB_SET_PROC_COEF, 0x0000}, 1650 /* Enable amplifiers */ 1651 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0x02}, 1652 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 0x02}, 1653 /* DMIC fix 1654 * This laptop has a stereo digital microphone. The mics are only 1cm apart 1655 * which makes the stereo useless. However, either the mic or the ALC889 1656 * makes the signal become a difference/sum signal instead of standard 1657 * stereo, which is annoying. So instead we flip this bit which makes the 1658 * codec replicate the sum signal to both channels, turning it into a 1659 * normal mono mic. 1660 */ 1661 /* DMIC_CONTROL? Init value = 0x0001 */ 1662 {0x20, AC_VERB_SET_COEF_INDEX, 0x0b}, 1663 {0x20, AC_VERB_SET_PROC_COEF, 0x0003}, 1664 {0} 1665 }; 1666 1361 1667 static struct hda_input_mux alc888_2_capture_sources[2] = { 1362 1668 /* Front mic only available on one ADC */ … … 1376 1682 { "Line", 0x2 }, 1377 1683 { "CD", 0x4 }, 1684 }, 1685 } 1686 }; 1687 1688 static struct hda_input_mux alc888_acer_aspire_6530_sources[2] = { 1689 /* Interal mic only available on one ADC */ 1690 { 1691 .num_items = 5, 1692 .items = { 1693 { "Ext Mic", 0x0 }, 1694 { "Line In", 0x2 }, 1695 { "CD", 0x4 }, 1696 { "Input Mix", 0xa }, 1697 { "Int Mic", 0xb }, 1698 }, 1699 }, 1700 { 1701 .num_items = 4, 1702 .items = { 1703 { "Ext Mic", 0x0 }, 1704 { "Line In", 0x2 }, 1705 { "CD", 0x4 }, 1706 { "Input Mix", 0xa }, 1707 }, 1708 } 1709 }; 1710 1711 static struct hda_input_mux alc889_capture_sources[3] = { 1712 /* Digital mic only available on first "ADC" */ 1713 { 1714 .num_items = 5, 1715 .items = { 1716 { "Mic", 0x0 }, 1717 { "Line", 0x2 }, 1718 { "CD", 0x4 }, 1719 { "Front Mic", 0xb }, 1720 { "Input Mix", 0xa }, 1721 }, 1722 }, 1723 { 1724 .num_items = 4, 1725 .items = { 1726 { "Mic", 0x0 }, 1727 { "Line", 0x2 }, 1728 { "CD", 0x4 }, 1729 { "Input Mix", 0xa }, 1730 }, 1731 }, 1732 { 1733 .num_items = 4, 1734 .items = { 1735 { "Mic", 0x0 }, 1736 { "Line", 0x2 }, 1737 { "CD", 0x4 }, 1738 { "Input Mix", 0xa }, 1378 1739 }, 1379 1740 } … … 1402 1763 }; 1403 1764 1404 static void alc888_acer_aspire_4930g_automute(struct hda_codec *codec) 1405 { 1406 unsigned int present; 1407 unsigned int bits; 1408 present = snd_hda_codec_read(codec, 0x15, 0, 1409 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 1410 bits = present ? HDA_AMP_MUTE : 0; 1411 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 1412 HDA_AMP_MUTE, bits); 1413 } 1414 1415 static void alc888_acer_aspire_4930g_unsol_event(struct hda_codec *codec, 1416 unsigned int res) 1417 { 1418 if (res >> 26 == ALC880_HP_EVENT) 1419 alc888_acer_aspire_4930g_automute(codec); 1765 static void alc888_acer_aspire_4930g_setup(struct hda_codec *codec) 1766 { 1767 struct alc_spec *spec = codec->spec; 1768 1769 spec->autocfg.hp_pins[0] = 0x15; 1770 spec->autocfg.speaker_pins[0] = 0x14; 1771 } 1772 1773 static void alc888_acer_aspire_6530g_setup(struct hda_codec *codec) 1774 { 1775 struct alc_spec *spec = codec->spec; 1776 1777 spec->autocfg.hp_pins[0] = 0x15; 1778 spec->autocfg.speaker_pins[0] = 0x14; 1779 spec->autocfg.speaker_pins[1] = 0x16; 1780 spec->autocfg.speaker_pins[2] = 0x17; 1781 } 1782 1783 static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec) 1784 { 1785 struct alc_spec *spec = codec->spec; 1786 1787 spec->autocfg.hp_pins[0] = 0x15; 1788 spec->autocfg.speaker_pins[0] = 0x14; 1789 spec->autocfg.speaker_pins[1] = 0x16; 1790 spec->autocfg.speaker_pins[2] = 0x1b; 1420 1791 } 1421 1792 … … 2385 2756 }; 2386 2757 2387 /* toggle speaker-output according to the hp-jack state */2388 static void alc880_uniwill_hp_automute(struct hda_codec *codec)2389 {2390 unsigned int present;2391 unsigned char bits;2392 2393 present = snd_hda_codec_read(codec, 0x14, 0,2394 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;2395 bits = present ? HDA_AMP_MUTE : 0;2396 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,2397 HDA_AMP_MUTE, bits);2398 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,2399 HDA_AMP_MUTE, bits);2400 }2401 2402 2758 /* auto-toggle front mic */ 2403 2759 static void alc880_uniwill_mic_automute(struct hda_codec *codec) … … 2412 2768 } 2413 2769 2414 static void alc880_uniwill_automute(struct hda_codec *codec) 2415 { 2416 alc880_uniwill_hp_automute(codec); 2770 static void alc880_uniwill_setup(struct hda_codec *codec) 2771 { 2772 struct alc_spec *spec = codec->spec; 2773 2774 spec->autocfg.hp_pins[0] = 0x14; 2775 spec->autocfg.speaker_pins[0] = 0x15; 2776 spec->autocfg.speaker_pins[0] = 0x16; 2777 } 2778 2779 static void alc880_uniwill_init_hook(struct hda_codec *codec) 2780 { 2781 alc_automute_amp(codec); 2417 2782 alc880_uniwill_mic_automute(codec); 2418 2783 } … … 2425 2790 */ 2426 2791 switch (res >> 28) { 2427 case ALC880_HP_EVENT:2428 alc880_uniwill_hp_automute(codec);2429 break;2430 2792 case ALC880_MIC_EVENT: 2431 2793 alc880_uniwill_mic_automute(codec); 2432 2794 break; 2795 default: 2796 alc_automute_amp_unsol_event(codec, res); 2797 break; 2433 2798 } 2434 2799 } 2435 2800 2436 static void alc880_uniwill_p53_hp_automute(struct hda_codec *codec) 2437 { 2438 unsigned int present; 2439 unsigned char bits; 2440 2441 present = snd_hda_codec_read(codec, 0x14, 0, 2442 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 2443 bits = present ? HDA_AMP_MUTE : 0; 2444 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, HDA_AMP_MUTE, bits); 2801 static void alc880_uniwill_p53_setup(struct hda_codec *codec) 2802 { 2803 struct alc_spec *spec = codec->spec; 2804 2805 spec->autocfg.hp_pins[0] = 0x14; 2806 spec->autocfg.speaker_pins[0] = 0x15; 2445 2807 } 2446 2808 … … 2464 2826 * definition. 4bit tag is placed at 28 bit! 2465 2827 */ 2466 if ((res >> 28) == ALC880_HP_EVENT)2467 alc880_uniwill_p53_hp_automute(codec);2468 2828 if ((res >> 28) == ALC880_DCVOL_EVENT) 2469 2829 alc880_uniwill_p53_dcvol_automute(codec); 2830 else 2831 alc_automute_amp_unsol_event(codec, res); 2470 2832 } 2471 2833 … … 2537 2899 #define alc880_gpio1_init_verbs alc_gpio1_init_verbs 2538 2900 #define alc880_gpio2_init_verbs alc_gpio2_init_verbs 2901 #define alc880_gpio3_init_verbs alc_gpio3_init_verbs 2539 2902 2540 2903 /* Clevo m520g init */ … … 2699 3062 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2700 3063 /* jack sense */ 2701 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | 0x1},3064 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 2702 3065 {0} 2703 3066 }; 2704 3067 2705 3068 /* toggle speaker-output according to the hp-jack state */ 2706 static void alc880_lg_automute(struct hda_codec *codec) 2707 { 2708 unsigned int present; 2709 unsigned char bits; 2710 2711 present = snd_hda_codec_read(codec, 0x1b, 0, 2712 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 2713 bits = present ? HDA_AMP_MUTE : 0; 2714 snd_hda_codec_amp_stereo(codec, 0x17, HDA_OUTPUT, 0, 2715 HDA_AMP_MUTE, bits); 2716 } 2717 2718 static void alc880_lg_unsol_event(struct hda_codec *codec, unsigned int res) 2719 { 2720 /* Looks like the unsol event is incompatible with the standard 2721 * definition. 4bit tag is placed at 28 bit! 2722 */ 2723 if ((res >> 28) == 0x01) 2724 alc880_lg_automute(codec); 3069 static void alc880_lg_setup(struct hda_codec *codec) 3070 { 3071 struct alc_spec *spec = codec->spec; 3072 3073 spec->autocfg.hp_pins[0] = 0x1b; 3074 spec->autocfg.speaker_pins[0] = 0x17; 2725 3075 } 2726 3076 … … 2796 3146 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2797 3147 /* jack sense */ 2798 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | 0x1},3148 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 2799 3149 {0} 2800 3150 }; 2801 3151 2802 3152 /* toggle speaker-output according to the hp-jack state */ 2803 static void alc880_lg_lw_automute(struct hda_codec *codec) 2804 { 2805 unsigned int present; 2806 unsigned char bits; 2807 2808 present = snd_hda_codec_read(codec, 0x1b, 0, 2809 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 2810 bits = present ? HDA_AMP_MUTE : 0; 2811 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 2812 HDA_AMP_MUTE, bits); 2813 } 2814 2815 static void alc880_lg_lw_unsol_event(struct hda_codec *codec, unsigned int res) 2816 { 2817 /* Looks like the unsol event is incompatible with the standard 2818 * definition. 4bit tag is placed at 28 bit! 2819 */ 2820 if ((res >> 28) == 0x01) 2821 alc880_lg_lw_automute(codec); 3153 static void alc880_lg_lw_setup(struct hda_codec *codec) 3154 { 3155 struct alc_spec *spec = codec->spec; 3156 3157 spec->autocfg.hp_pins[0] = 0x1b; 3158 spec->autocfg.speaker_pins[0] = 0x14; 2822 3159 } 2823 3160 … … 2866 3203 static void alc880_medion_rim_automute(struct hda_codec *codec) 2867 3204 { 2868 unsigned int present; 2869 unsigned char bits; 2870 2871 present = snd_hda_codec_read(codec, 0x14, 0, 2872 AC_VERB_GET_PIN_SENSE, 0) 2873 & AC_PINSENSE_PRESENCE; 2874 bits = present ? HDA_AMP_MUTE : 0; 2875 snd_hda_codec_amp_stereo(codec, 0x1b, HDA_OUTPUT, 0, 2876 HDA_AMP_MUTE, bits); 2877 if (present) 3205 struct alc_spec *spec = codec->spec; 3206 alc_automute_amp(codec); 3207 /* toggle EAPD */ 3208 if (spec->jack_present) 2878 3209 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 0); 2879 3210 else … … 2889 3220 if ((res >> 28) == ALC880_HP_EVENT) 2890 3221 alc880_medion_rim_automute(codec); 3222 } 3223 3224 static void alc880_medion_rim_setup(struct hda_codec *codec) 3225 { 3226 struct alc_spec *spec = codec->spec; 3227 3228 spec->autocfg.hp_pins[0] = 0x14; 3229 spec->autocfg.speaker_pins[0] = 0x1b; 2891 3230 } 2892 3231 … … 2919 3258 2920 3259 alc_fix_pll(codec); 2921 if (codec->vendor_id == 0x10ec0888) 2922 alc888_coef_init(codec); 3260 alc_auto_init_amp(codec, spec->init_amp); 2923 3261 2924 3262 for (i = 0; i < spec->num_init_verbs; i++) … … 3122 3460 goto skip_analog; 3123 3461 3462 snprintf(spec->stream_name_analog, sizeof(spec->stream_name_analog), 3463 "%s Analog", codec->chip_name); 3124 3464 info->name = spec->stream_name_analog; 3465 3125 3466 if (spec->stream_analog_playback) { 3126 3467 if (snd_BUG_ON(!spec->multiout.dac_nids)) … … 3148 3489 /* SPDIF for stream index #1 */ 3149 3490 if (spec->multiout.dig_out_nid || spec->dig_in_nid) { 3491 snprintf(spec->stream_name_digital, 3492 sizeof(spec->stream_name_digital), 3493 "%s Digital", codec->chip_name); 3150 3494 codec->num_pcms = 2; 3151 3495 codec->slave_dig_outs = spec->multiout.slave_dig_outs; … … 3750 4094 .input_mux = &alc880_f1734_capture_source, 3751 4095 .unsol_event = alc880_uniwill_p53_unsol_event, 3752 .init_hook = alc880_uniwill_p53_hp_automute, 4096 .setup = alc880_uniwill_p53_setup, 4097 .init_hook = alc_automute_amp, 3753 4098 }, 3754 4099 [ALC880_ASUS] = { … … 3827 4172 .input_mux = &alc880_capture_source, 3828 4173 .unsol_event = alc880_uniwill_unsol_event, 3829 .init_hook = alc880_uniwill_automute, 4174 .setup = alc880_uniwill_setup, 4175 .init_hook = alc880_uniwill_init_hook, 3830 4176 }, 3831 4177 [ALC880_UNIWILL_P53] = { … … 3839 4185 .input_mux = &alc880_capture_source, 3840 4186 .unsol_event = alc880_uniwill_p53_unsol_event, 3841 .init_hook = alc880_uniwill_p53_hp_automute, 4187 .setup = alc880_uniwill_p53_setup, 4188 .init_hook = alc_automute_amp, 3842 4189 }, 3843 4190 [ALC880_FUJITSU] = { … … 3853 4200 .input_mux = &alc880_capture_source, 3854 4201 .unsol_event = alc880_uniwill_p53_unsol_event, 3855 .init_hook = alc880_uniwill_p53_hp_automute, 4202 .setup = alc880_uniwill_p53_setup, 4203 .init_hook = alc_automute_amp, 3856 4204 }, 3857 4205 [ALC880_CLEVO] = { … … 3878 4226 .need_dac_fix = 1, 3879 4227 .input_mux = &alc880_lg_capture_source, 3880 .unsol_event = alc880_lg_unsol_event, 3881 .init_hook = alc880_lg_automute, 4228 .unsol_event = alc_automute_amp_unsol_event, 4229 .setup = alc880_lg_setup, 4230 .init_hook = alc_automute_amp, 3882 4231 #ifdef CONFIG_SND_HDA_POWER_SAVE 3883 4232 .loopbacks = alc880_lg_loopbacks, … … 3894 4243 .channel_mode = alc880_lg_lw_modes, 3895 4244 .input_mux = &alc880_lg_lw_capture_source, 3896 .unsol_event = alc880_lg_lw_unsol_event, 3897 .init_hook = alc880_lg_lw_automute, 4245 .unsol_event = alc_automute_amp_unsol_event, 4246 .setup = alc880_lg_lw_setup, 4247 .init_hook = alc_automute_amp, 3898 4248 }, 3899 4249 [ALC880_MEDION_RIM] = { … … 3909 4259 .input_mux = &alc880_medion_rim_capture_source, 3910 4260 .unsol_event = alc880_medion_rim_unsol_event, 4261 .setup = alc880_medion_rim_setup, 3911 4262 .init_hook = alc880_medion_rim_automute, 3912 4263 }, … … 3962 4313 #define alc880_is_multi_pin(nid) ((nid) >= 0x18) 3963 4314 #define alc880_multi_pin_idx(nid) ((nid) - 0x18) 3964 #define alc880_is_input_pin(nid) ((nid) >= 0x18)3965 #define alc880_input_pin_idx(nid) ((nid) - 0x18)3966 4315 #define alc880_idx_to_dac(nid) ((nid) + 0x02) 3967 4316 #define alc880_dac_to_idx(nid) ((nid) - 0x02) … … 4051 4400 return err; 4052 4401 } else { 4053 sprintf(name, "%s Playback Volume", chname[i]); 4402 const char *pfx; 4403 if (cfg->line_outs == 1 && 4404 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) 4405 pfx = "Speaker"; 4406 else 4407 pfx = chname[i]; 4408 sprintf(name, "%s Playback Volume", pfx); 4054 4409 err = add_control(spec, ALC_CTL_WIDGET_VOL, name, 4055 4410 HDA_COMPOSE_AMP_VAL(nid, 3, 0, … … 4057 4412 if (err < 0) 4058 4413 return err; 4059 sprintf(name, "%s Playback Switch", chname[i]);4414 sprintf(name, "%s Playback Switch", pfx); 4060 4415 err = add_control(spec, ALC_CTL_BIND_MUTE, name, 4061 4416 HDA_COMPOSE_AMP_VAL(nid, 3, 2, … … 4131 4486 } 4132 4487 4488 static int alc_is_input_pin(struct hda_codec *codec, hda_nid_t nid) 4489 { 4490 unsigned int pincap = snd_hda_query_pin_caps(codec, nid); 4491 return (pincap & AC_PINCAP_IN) != 0; 4492 } 4493 4133 4494 /* create playback/capture controls for input pins */ 4134 static int alc880_auto_create_analog_input_ctls(struct alc_spec *spec, 4135 const struct auto_pin_cfg *cfg) 4136 { 4495 static int alc_auto_create_input_ctls(struct hda_codec *codec, 4496 const struct auto_pin_cfg *cfg, 4497 hda_nid_t mixer, 4498 hda_nid_t cap1, hda_nid_t cap2) 4499 { 4500 struct alc_spec *spec = codec->spec; 4137 4501 struct hda_input_mux *imux = &spec->private_imux[0]; 4138 4502 int i, err, idx; 4139 4503 4140 4504 for (i = 0; i < AUTO_PIN_LAST; i++) { 4141 if (alc880_is_input_pin(cfg->input_pins[i])) { 4142 idx = alc880_input_pin_idx(cfg->input_pins[i]); 4143 err = new_analog_input(spec, cfg->input_pins[i], 4144 auto_pin_cfg_labels[i], 4145 idx, 0x0b); 4146 if (err < 0) 4147 return err; 4505 hda_nid_t pin; 4506 4507 pin = cfg->input_pins[i]; 4508 if (!alc_is_input_pin(codec, pin)) 4509 continue; 4510 4511 if (mixer) { 4512 idx = get_connection_index(codec, mixer, pin); 4513 if (idx >= 0) { 4514 err = new_analog_input(spec, pin, 4515 auto_pin_cfg_labels[i], 4516 idx, mixer); 4517 if (err < 0) 4518 return err; 4519 } 4520 } 4521 4522 if (!cap1) 4523 continue; 4524 idx = get_connection_index(codec, cap1, pin); 4525 if (idx < 0 && cap2) 4526 idx = get_connection_index(codec, cap2, pin); 4527 if (idx >= 0) { 4148 4528 imux->items[imux->num_items].label = 4149 4529 auto_pin_cfg_labels[i]; 4150 imux->items[imux->num_items].index = 4151 alc880_input_pin_idx(cfg->input_pins[i]); 4530 imux->items[imux->num_items].index = idx; 4152 4531 imux->num_items++; 4153 4532 } 4154 4533 } 4155 4534 return 0; 4535 } 4536 4537 static int alc880_auto_create_input_ctls(struct hda_codec *codec, 4538 const struct auto_pin_cfg *cfg) 4539 { 4540 return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x08, 0x09); 4156 4541 } 4157 4542 … … 4194 4579 int i; 4195 4580 4196 alc_subsystem_id(codec, 0x15, 0x1b, 0x14);4197 4581 for (i = 0; i < spec->autocfg.line_outs; i++) { 4198 4582 hda_nid_t nid = spec->autocfg.line_out_pins[i]; … … 4222 4606 for (i = 0; i < AUTO_PIN_LAST; i++) { 4223 4607 hda_nid_t nid = spec->autocfg.input_pins[i]; 4224 if (alc 880_is_input_pin(nid)) {4608 if (alc_is_input_pin(codec, nid)) { 4225 4609 alc_set_input_pin(codec, nid, i); 4226 4610 if (nid != ALC880_PIN_CD_NID && … … 4265 4649 if (err < 0) 4266 4650 return err; 4267 err = alc880_auto_create_ analog_input_ctls(spec, &spec->autocfg);4651 err = alc880_auto_create_input_ctls(codec, &spec->autocfg); 4268 4652 if (err < 0) 4269 4653 return err; … … 4299 4683 spec->input_mux = &spec->private_imux[0]; 4300 4684 4685 alc_ssid_check(codec, 0x15, 0x1b, 0x14); 4686 4301 4687 return 1; 4302 4688 } … … 4313 4699 } 4314 4700 4315 static void set_capture_mixer(struct alc_spec *spec) 4316 { 4701 /* check the ADC/MUX contains all input pins; some ADC/MUX contains only 4702 * one of two digital mic pins, e.g. on ALC272 4703 */ 4704 static void fixup_automic_adc(struct hda_codec *codec) 4705 { 4706 struct alc_spec *spec = codec->spec; 4707 int i; 4708 4709 for (i = 0; i < spec->num_adc_nids; i++) { 4710 hda_nid_t cap = spec->capsrc_nids ? 4711 spec->capsrc_nids[i] : spec->adc_nids[i]; 4712 int iidx, eidx; 4713 4714 iidx = get_connection_index(codec, cap, spec->int_mic.pin); 4715 if (iidx < 0) 4716 continue; 4717 eidx = get_connection_index(codec, cap, spec->ext_mic.pin); 4718 if (eidx < 0) 4719 continue; 4720 spec->int_mic.mux_idx = iidx; 4721 spec->ext_mic.mux_idx = eidx; 4722 if (spec->capsrc_nids) 4723 spec->capsrc_nids += i; 4724 spec->adc_nids += i; 4725 spec->num_adc_nids = 1; 4726 return; 4727 } 4728 snd_printd(KERN_INFO "hda_codec: %s: " 4729 "No ADC/MUX containing both 0x%x and 0x%x pins\n", 4730 codec->chip_name, spec->int_mic.pin, spec->ext_mic.pin); 4731 spec->auto_mic = 0; /* disable auto-mic to be sure */ 4732 } 4733 4734 static void set_capture_mixer(struct hda_codec *codec) 4735 { 4736 struct alc_spec *spec = codec->spec; 4317 4737 static struct snd_kcontrol_new *caps[2][3] = { 4318 4738 { alc_capture_mixer_nosrc1, … … 4325 4745 if (spec->num_adc_nids > 0 && spec->num_adc_nids <= 3) { 4326 4746 int mux; 4327 if (spec->input_mux && spec->input_mux->num_items > 1) 4747 if (spec->auto_mic) { 4748 mux = 0; 4749 fixup_automic_adc(codec); 4750 } else if (spec->input_mux && spec->input_mux->num_items > 1) 4328 4751 mux = 1; 4329 4752 else … … 4356 4779 alc880_cfg_tbl); 4357 4780 if (board_config < 0) { 4358 printk(KERN_INFO "hda_codec: Unknown model for ALC880, "4359 "trying auto-probe from BIOS...\n");4781 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", 4782 codec->chip_name); 4360 4783 board_config = ALC880_AUTO; 4361 4784 } … … 4382 4805 4383 4806 if (board_config != ALC880_AUTO) 4384 setup_preset(spec, &alc880_presets[board_config]); 4385 4386 spec->stream_name_analog = "ALC880 Analog"; 4807 setup_preset(codec, &alc880_presets[board_config]); 4808 4387 4809 spec->stream_analog_playback = &alc880_pcm_analog_playback; 4388 4810 spec->stream_analog_capture = &alc880_pcm_analog_capture; 4389 4811 spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture; 4390 4812 4391 spec->stream_name_digital = "ALC880 Digital";4392 4813 spec->stream_digital_playback = &alc880_pcm_digital_playback; 4393 4814 spec->stream_digital_capture = &alc880_pcm_digital_capture; … … 4397 4818 unsigned int wcap = get_wcaps(codec, alc880_adc_nids[0]); 4398 4819 /* get type */ 4399 wcap = (wcap & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;4820 wcap = get_wcaps_type(wcap); 4400 4821 if (wcap != AC_WID_AUD_IN) { 4401 4822 spec->adc_nids = alc880_adc_nids_alt; … … 4406 4827 } 4407 4828 } 4408 set_capture_mixer( spec);4829 set_capture_mixer(codec); 4409 4830 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); 4410 4831 … … 5598 6019 nid = cfg->line_out_pins[0]; 5599 6020 if (nid) { 5600 err = alc260_add_playback_controls(spec, nid, "Front", &vols); 6021 const char *pfx; 6022 if (!cfg->speaker_pins[0] && !cfg->hp_pins[0]) 6023 pfx = "Master"; 6024 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) 6025 pfx = "Speaker"; 6026 else 6027 pfx = "Front"; 6028 err = alc260_add_playback_controls(spec, nid, pfx, &vols); 5601 6029 if (err < 0) 5602 6030 return err; … … 5621 6049 5622 6050 /* create playback/capture controls for input pins */ 5623 static int alc260_auto_create_ analog_input_ctls(struct alc_spec *spec,6051 static int alc260_auto_create_input_ctls(struct hda_codec *codec, 5624 6052 const struct auto_pin_cfg *cfg) 5625 6053 { 5626 struct hda_input_mux *imux = &spec->private_imux[0]; 5627 int i, err, idx; 5628 5629 for (i = 0; i < AUTO_PIN_LAST; i++) { 5630 if (cfg->input_pins[i] >= 0x12) { 5631 idx = cfg->input_pins[i] - 0x12; 5632 err = new_analog_input(spec, cfg->input_pins[i], 5633 auto_pin_cfg_labels[i], idx, 5634 0x07); 5635 if (err < 0) 5636 return err; 5637 imux->items[imux->num_items].label = 5638 auto_pin_cfg_labels[i]; 5639 imux->items[imux->num_items].index = idx; 5640 imux->num_items++; 5641 } 5642 if (cfg->input_pins[i] >= 0x0f && cfg->input_pins[i] <= 0x10){ 5643 idx = cfg->input_pins[i] - 0x09; 5644 err = new_analog_input(spec, cfg->input_pins[i], 5645 auto_pin_cfg_labels[i], idx, 5646 0x07); 5647 if (err < 0) 5648 return err; 5649 imux->items[imux->num_items].label = 5650 auto_pin_cfg_labels[i]; 5651 imux->items[imux->num_items].index = idx; 5652 imux->num_items++; 5653 } 5654 } 5655 return 0; 6054 return alc_auto_create_input_ctls(codec, cfg, 0x07, 0x04, 0x05); 5656 6055 } 5657 6056 … … 5674 6073 hda_nid_t nid; 5675 6074 5676 alc_subsystem_id(codec, 0x10, 0x15, 0x0f);5677 6075 nid = spec->autocfg.line_out_pins[0]; 5678 6076 if (nid) { … … 5768 6166 if (!spec->kctls.list) 5769 6167 return 0; /* can't find valid BIOS pin config */ 5770 err = alc260_auto_create_ analog_input_ctls(spec, &spec->autocfg);6168 err = alc260_auto_create_input_ctls(codec, &spec->autocfg); 5771 6169 if (err < 0) 5772 6170 return err; … … 5783 6181 spec->num_mux_defs = 1; 5784 6182 spec->input_mux = &spec->private_imux[0]; 6183 6184 alc_ssid_check(codec, 0x10, 0x15, 0x0f); 5785 6185 5786 6186 return 1; … … 6001 6401 alc260_cfg_tbl); 6002 6402 if (board_config < 0) { 6003 snd_printd(KERN_INFO "hda_codec: Unknown model for ALC260, "6004 "trying auto-probe from BIOS...\n");6403 snd_printd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", 6404 codec->chip_name); 6005 6405 board_config = ALC260_AUTO; 6006 6406 } … … 6027 6427 6028 6428 if (board_config != ALC260_AUTO) 6029 setup_preset(spec, &alc260_presets[board_config]); 6030 6031 spec->stream_name_analog = "ALC260 Analog"; 6429 setup_preset(codec, &alc260_presets[board_config]); 6430 6032 6431 spec->stream_analog_playback = &alc260_pcm_analog_playback; 6033 6432 spec->stream_analog_capture = &alc260_pcm_analog_capture; 6034 6433 6035 spec->stream_name_digital = "ALC260 Digital";6036 6434 spec->stream_digital_playback = &alc260_pcm_digital_playback; 6037 6435 spec->stream_digital_capture = &alc260_pcm_digital_capture; … … 6040 6438 /* check whether NID 0x04 is valid */ 6041 6439 unsigned int wcap = get_wcaps(codec, 0x04); 6042 wcap = (wcap & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;6440 wcap = get_wcaps_type(wcap); 6043 6441 /* get type */ 6044 6442 if (wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) { … … 6050 6448 } 6051 6449 } 6052 set_capture_mixer( spec);6450 set_capture_mixer(codec); 6053 6451 set_beep_amp(spec, 0x07, 0x05, HDA_INPUT); 6054 6452 … … 6069 6467 6070 6468 /* 6071 * ALC882 support6469 * ALC882/883/885/888/889 support 6072 6470 * 6073 6471 * ALC882 is almost identical with ALC880 but has cleaner and more flexible … … 6081 6479 #define ALC882_DIGOUT_NID 0x06 6082 6480 #define ALC882_DIGIN_NID 0x0a 6481 #define ALC883_DIGOUT_NID ALC882_DIGOUT_NID 6482 #define ALC883_DIGIN_NID ALC882_DIGIN_NID 6483 #define ALC1200_DIGOUT_NID 0x10 6484 6083 6485 6084 6486 static struct hda_channel_mode alc882_ch_modes[1] = { … … 6086 6488 }; 6087 6489 6490 /* DACs */ 6088 6491 static hda_nid_t alc882_dac_nids[4] = { 6089 6492 /* front, rear, clfe, rear_surr */ 6090 6493 0x02, 0x03, 0x04, 0x05 6091 6494 }; 6092 6093 /* identical with ALC880 */ 6495 #define alc883_dac_nids alc882_dac_nids 6496 6497 /* ADCs */ 6094 6498 #define alc882_adc_nids alc880_adc_nids 6095 6499 #define alc882_adc_nids_alt alc880_adc_nids_alt 6500 #define alc883_adc_nids alc882_adc_nids_alt 6501 static hda_nid_t alc883_adc_nids_alt[1] = { 0x08 }; 6502 static hda_nid_t alc883_adc_nids_rev[2] = { 0x09, 0x08 }; 6503 #define alc889_adc_nids alc880_adc_nids 6096 6504 6097 6505 static hda_nid_t alc882_capsrc_nids[3] = { 0x24, 0x23, 0x22 }; 6098 6506 static hda_nid_t alc882_capsrc_nids_alt[2] = { 0x23, 0x22 }; 6507 #define alc883_capsrc_nids alc882_capsrc_nids_alt 6508 static hda_nid_t alc883_capsrc_nids_rev[2] = { 0x22, 0x23 }; 6509 #define alc889_capsrc_nids alc882_capsrc_nids 6099 6510 6100 6511 /* input MUX */ … … 6110 6521 }, 6111 6522 }; 6523 6524 #define alc883_capture_source alc882_capture_source 6525 6526 static struct hda_input_mux alc889_capture_source = { 6527 .num_items = 3, 6528 .items = { 6529 { "Front Mic", 0x0 }, 6530 { "Mic", 0x3 }, 6531 { "Line", 0x2 }, 6532 }, 6533 }; 6534 6535 static struct hda_input_mux mb5_capture_source = { 6536 .num_items = 3, 6537 .items = { 6538 { "Mic", 0x1 }, 6539 { "Line", 0x2 }, 6540 { "CD", 0x4 }, 6541 }, 6542 }; 6543 6544 static struct hda_input_mux alc883_3stack_6ch_intel = { 6545 .num_items = 4, 6546 .items = { 6547 { "Mic", 0x1 }, 6548 { "Front Mic", 0x0 }, 6549 { "Line", 0x2 }, 6550 { "CD", 0x4 }, 6551 }, 6552 }; 6553 6554 static struct hda_input_mux alc883_lenovo_101e_capture_source = { 6555 .num_items = 2, 6556 .items = { 6557 { "Mic", 0x1 }, 6558 { "Line", 0x2 }, 6559 }, 6560 }; 6561 6562 static struct hda_input_mux alc883_lenovo_nb0763_capture_source = { 6563 .num_items = 4, 6564 .items = { 6565 { "Mic", 0x0 }, 6566 { "iMic", 0x1 }, 6567 { "Line", 0x2 }, 6568 { "CD", 0x4 }, 6569 }, 6570 }; 6571 6572 static struct hda_input_mux alc883_fujitsu_pi2515_capture_source = { 6573 .num_items = 2, 6574 .items = { 6575 { "Mic", 0x0 }, 6576 { "Int Mic", 0x1 }, 6577 }, 6578 }; 6579 6580 static struct hda_input_mux alc883_lenovo_sky_capture_source = { 6581 .num_items = 3, 6582 .items = { 6583 { "Mic", 0x0 }, 6584 { "Front Mic", 0x1 }, 6585 { "Line", 0x4 }, 6586 }, 6587 }; 6588 6589 static struct hda_input_mux alc883_asus_eee1601_capture_source = { 6590 .num_items = 2, 6591 .items = { 6592 { "Mic", 0x0 }, 6593 { "Line", 0x2 }, 6594 }, 6595 }; 6596 6597 static struct hda_input_mux alc889A_mb31_capture_source = { 6598 .num_items = 2, 6599 .items = { 6600 { "Mic", 0x0 }, 6601 /* Front Mic (0x01) unused */ 6602 { "Line", 0x2 }, 6603 /* Line 2 (0x03) unused */ 6604 /* CD (0x04) unsused? */ 6605 }, 6606 }; 6607 6608 /* 6609 * 2ch mode 6610 */ 6611 static struct hda_channel_mode alc883_3ST_2ch_modes[1] = { 6612 { 2, NULL } 6613 }; 6614 6112 6615 /* 6113 6616 * 2ch mode … … 6118 6621 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 6119 6622 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 6623 {0} /* end */ 6624 }; 6625 6626 /* 6627 * 4ch mode 6628 */ 6629 static struct hda_verb alc882_3ST_ch4_init[] = { 6630 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 6631 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 6632 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6633 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 6634 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, 6120 6635 {0} /* end */ 6121 6636 }; … … 6134 6649 }; 6135 6650 6136 static struct hda_channel_mode alc882_3ST_6ch_modes[ 2] = {6651 static struct hda_channel_mode alc882_3ST_6ch_modes[3] = { 6137 6652 { 2, alc882_3ST_ch2_init }, 6653 { 4, alc882_3ST_ch4_init }, 6138 6654 { 6, alc882_3ST_ch6_init }, 6139 6655 }; 6656 6657 #define alc883_3ST_6ch_modes alc882_3ST_6ch_modes 6140 6658 6141 6659 /* … … 6167 6685 6168 6686 /* 6169 * macbook pro ALC885 can switch LineIn to LineOut without lo osing Mic6687 * macbook pro ALC885 can switch LineIn to LineOut without losing Mic 6170 6688 */ 6171 6689 … … 6195 6713 { 2, alc885_mbp_ch2_init }, 6196 6714 { 6, alc885_mbp_ch6_init }, 6715 }; 6716 6717 /* 6718 * 2ch 6719 * Speakers/Woofer/HP = Front 6720 * LineIn = Input 6721 */ 6722 static struct hda_verb alc885_mb5_ch2_init[] = { 6723 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 6724 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 6725 {0} /* end */ 6726 }; 6727 6728 /* 6729 * 6ch mode 6730 * Speakers/HP = Front 6731 * Woofer = LFE 6732 * LineIn = Surround 6733 */ 6734 static struct hda_verb alc885_mb5_ch6_init[] = { 6735 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 6736 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 6737 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, 6738 {0} /* end */ 6739 }; 6740 6741 static struct hda_channel_mode alc885_mb5_6ch_modes[2] = { 6742 { 2, alc885_mb5_ch2_init }, 6743 { 6, alc885_mb5_ch6_init }, 6744 }; 6745 6746 6747 /* 6748 * 2ch mode 6749 */ 6750 static struct hda_verb alc883_4ST_ch2_init[] = { 6751 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6752 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 6753 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 6754 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 6755 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 6756 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 6757 {0} /* end */ 6758 }; 6759 6760 /* 6761 * 4ch mode 6762 */ 6763 static struct hda_verb alc883_4ST_ch4_init[] = { 6764 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6765 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 6766 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 6767 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 6768 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6769 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 6770 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, 6771 {0} /* end */ 6772 }; 6773 6774 /* 6775 * 6ch mode 6776 */ 6777 static struct hda_verb alc883_4ST_ch6_init[] = { 6778 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6779 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 6780 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6781 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 6782 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 }, 6783 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6784 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 6785 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, 6786 {0} /* end */ 6787 }; 6788 6789 /* 6790 * 8ch mode 6791 */ 6792 static struct hda_verb alc883_4ST_ch8_init[] = { 6793 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6794 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 6795 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 }, 6796 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6797 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 6798 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 }, 6799 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6800 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 6801 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, 6802 {0} /* end */ 6803 }; 6804 6805 static struct hda_channel_mode alc883_4ST_8ch_modes[4] = { 6806 { 2, alc883_4ST_ch2_init }, 6807 { 4, alc883_4ST_ch4_init }, 6808 { 6, alc883_4ST_ch6_init }, 6809 { 8, alc883_4ST_ch8_init }, 6810 }; 6811 6812 6813 /* 6814 * 2ch mode 6815 */ 6816 static struct hda_verb alc883_3ST_ch2_intel_init[] = { 6817 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 6818 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 6819 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 6820 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 6821 {0} /* end */ 6822 }; 6823 6824 /* 6825 * 4ch mode 6826 */ 6827 static struct hda_verb alc883_3ST_ch4_intel_init[] = { 6828 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 6829 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 6830 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6831 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 6832 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, 6833 {0} /* end */ 6834 }; 6835 6836 /* 6837 * 6ch mode 6838 */ 6839 static struct hda_verb alc883_3ST_ch6_intel_init[] = { 6840 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6841 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 6842 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x02 }, 6843 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6844 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 6845 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 }, 6846 {0} /* end */ 6847 }; 6848 6849 static struct hda_channel_mode alc883_3ST_6ch_intel_modes[3] = { 6850 { 2, alc883_3ST_ch2_intel_init }, 6851 { 4, alc883_3ST_ch4_intel_init }, 6852 { 6, alc883_3ST_ch6_intel_init }, 6853 }; 6854 6855 /* 6856 * 2ch mode 6857 */ 6858 static struct hda_verb alc889_ch2_intel_init[] = { 6859 { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 }, 6860 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x00 }, 6861 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x00 }, 6862 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00 }, 6863 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 6864 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 6865 {0} /* end */ 6866 }; 6867 6868 /* 6869 * 6ch mode 6870 */ 6871 static struct hda_verb alc889_ch6_intel_init[] = { 6872 { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 }, 6873 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 }, 6874 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 }, 6875 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 }, 6876 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 6877 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 6878 {0} /* end */ 6879 }; 6880 6881 /* 6882 * 8ch mode 6883 */ 6884 static struct hda_verb alc889_ch8_intel_init[] = { 6885 { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 }, 6886 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 }, 6887 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 }, 6888 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 }, 6889 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x03 }, 6890 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6891 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 6892 {0} /* end */ 6893 }; 6894 6895 static struct hda_channel_mode alc889_8ch_intel_modes[3] = { 6896 { 2, alc889_ch2_intel_init }, 6897 { 6, alc889_ch6_intel_init }, 6898 { 8, alc889_ch8_intel_init }, 6899 }; 6900 6901 /* 6902 * 6ch mode 6903 */ 6904 static struct hda_verb alc883_sixstack_ch6_init[] = { 6905 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 }, 6906 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6907 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6908 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6909 {0} /* end */ 6910 }; 6911 6912 /* 6913 * 8ch mode 6914 */ 6915 static struct hda_verb alc883_sixstack_ch8_init[] = { 6916 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6917 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6918 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6919 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 6920 {0} /* end */ 6921 }; 6922 6923 static struct hda_channel_mode alc883_sixstack_modes[2] = { 6924 { 6, alc883_sixstack_ch6_init }, 6925 { 8, alc883_sixstack_ch8_init }, 6197 6926 }; 6198 6927 … … 6239 6968 {0} /* end */ 6240 6969 }; 6970 6971 static struct snd_kcontrol_new alc885_mb5_mixer[] = { 6972 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT), 6973 HDA_BIND_MUTE ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT), 6974 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT), 6975 HDA_BIND_MUTE ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT), 6976 HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT), 6977 HDA_BIND_MUTE ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT), 6978 HDA_CODEC_VOLUME("HP Playback Volume", 0x0f, 0x00, HDA_OUTPUT), 6979 HDA_BIND_MUTE ("HP Playback Switch", 0x0f, 0x02, HDA_INPUT), 6980 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 6981 HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 6982 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 6983 HDA_CODEC_MUTE ("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 6984 HDA_CODEC_VOLUME("Line Boost", 0x15, 0x00, HDA_INPUT), 6985 HDA_CODEC_VOLUME("Mic Boost", 0x19, 0x00, HDA_INPUT), 6986 {0} /* end */ 6987 }; 6988 6241 6989 static struct snd_kcontrol_new alc882_w2jc_mixer[] = { 6242 6990 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), … … 6314 7062 }; 6315 7063 6316 static struct hda_verb alc882_ init_verbs[] = {7064 static struct hda_verb alc882_base_init_verbs[] = { 6317 7065 /* Front mixer: unmute input/output amp left and right (volume = 0) */ 6318 7066 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, … … 6331 7079 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 6332 7080 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7081 7082 /* mute analog input loopbacks */ 7083 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7084 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7085 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 7086 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 7087 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 6333 7088 6334 7089 /* Front Pin: output 0 (0x0c) */ … … 6366 7121 /* FIXME: use matrix-type input source selection */ 6367 7122 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ 6368 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */6369 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},6370 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},6371 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},6372 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},6373 7123 /* Input mixer2 */ 6374 7124 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, … … 6381 7131 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 6382 7132 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 6383 /* ADC1: mute amp left and right */6384 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},6385 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},6386 7133 /* ADC2: mute amp left and right */ 6387 7134 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, … … 6394 7141 }; 6395 7142 7143 static struct hda_verb alc882_adc1_init_verbs[] = { 7144 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */ 7145 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 7146 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 7147 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 7148 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 7149 /* ADC1: mute amp left and right */ 7150 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7151 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00}, 7152 {0} 7153 }; 7154 6396 7155 static struct hda_verb alc882_eapd_verbs[] = { 6397 7156 /* change to EAPD mode */ … … 6400 7159 {0} 6401 7160 }; 7161 7162 static struct hda_verb alc889_eapd_verbs[] = { 7163 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2}, 7164 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2}, 7165 {0} 7166 }; 7167 7168 static struct hda_verb alc_hp15_unsol_verbs[] = { 7169 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, 7170 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 7171 {0} 7172 }; 7173 7174 static struct hda_verb alc885_init_verbs[] = { 7175 /* Front mixer: unmute input/output amp left and right (volume = 0) */ 7176 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 7177 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7178 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7179 /* Rear mixer */ 7180 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 7181 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7182 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7183 /* CLFE mixer */ 7184 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 7185 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7186 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7187 /* Side mixer */ 7188 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 7189 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7190 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7191 7192 /* mute analog input loopbacks */ 7193 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7194 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 7195 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 7196 7197 /* Front HP Pin: output 0 (0x0c) */ 7198 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 7199 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7200 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 7201 /* Front Pin: output 0 (0x0c) */ 7202 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 7203 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7204 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 7205 /* Rear Pin: output 1 (0x0d) */ 7206 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 7207 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7208 {0x19, AC_VERB_SET_CONNECT_SEL, 0x01}, 7209 /* CLFE Pin: output 2 (0x0e) */ 7210 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 7211 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7212 {0x16, AC_VERB_SET_CONNECT_SEL, 0x02}, 7213 /* Side Pin: output 3 (0x0f) */ 7214 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 7215 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7216 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03}, 7217 /* Mic (rear) pin: input vref at 80% */ 7218 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 7219 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 7220 /* Front Mic pin: input vref at 80% */ 7221 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 7222 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 7223 /* Line In pin: input */ 7224 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 7225 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 7226 7227 /* Mixer elements: 0x18, , 0x1a, 0x1b */ 7228 /* Input mixer1 */ 7229 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)}, 7230 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7231 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 7232 /* Input mixer2 */ 7233 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 7234 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 7235 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 7236 /* Input mixer3 */ 7237 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, 7238 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7239 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 7240 /* ADC2: mute amp left and right */ 7241 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7242 /* ADC3: mute amp left and right */ 7243 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7244 7245 {0} 7246 }; 7247 7248 static struct hda_verb alc885_init_input_verbs[] = { 7249 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 7250 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)}, 7251 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)}, 7252 {0} 7253 }; 7254 7255 7256 /* Unmute Selector 24h and set the default input to front mic */ 7257 static struct hda_verb alc889_init_input_verbs[] = { 7258 {0x24, AC_VERB_SET_CONNECT_SEL, 0x00}, 7259 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7260 {0} 7261 }; 7262 7263 7264 #define alc883_init_verbs alc882_base_init_verbs 6402 7265 6403 7266 /* Mac Pro test */ … … 6463 7326 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00}, 6464 7327 7328 {0} 7329 }; 7330 7331 /* Macbook 5,1 */ 7332 static struct hda_verb alc885_mb5_init_verbs[] = { 7333 /* DACs */ 7334 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7335 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7336 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7337 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7338 /* Front mixer */ 7339 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 7340 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7341 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7342 /* Surround mixer */ 7343 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 7344 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7345 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7346 /* LFE mixer */ 7347 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 7348 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7349 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7350 /* HP mixer */ 7351 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 7352 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 7353 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 7354 /* Front Pin (0x0c) */ 7355 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01}, 7356 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7357 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00}, 7358 /* LFE Pin (0x0e) */ 7359 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01}, 7360 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7361 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02}, 7362 /* HP Pin (0x0f) */ 7363 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 7364 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 7365 {0x14, AC_VERB_SET_CONNECT_SEL, 0x03}, 7366 /* Front Mic pin: input vref at 80% */ 7367 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80}, 7368 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 7369 /* Line In pin */ 7370 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 7371 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 7372 7373 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 7374 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 7375 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 7376 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 6465 7377 {0} 6466 7378 }; … … 6555 7467 6556 7468 /* Toggle speaker-output according to the hp-jack state */ 6557 static void alc885_imac24_automute(struct hda_codec *codec) 6558 { 6559 unsigned int present; 6560 6561 present = snd_hda_codec_read(codec, 0x14, 0, 6562 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 6563 snd_hda_codec_amp_stereo(codec, 0x18, HDA_OUTPUT, 0, 6564 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 6565 snd_hda_codec_amp_stereo(codec, 0x1a, HDA_OUTPUT, 0, 6566 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 6567 } 6568 6569 /* Processes unsolicited events. */ 6570 static void alc885_imac24_unsol_event(struct hda_codec *codec, 6571 unsigned int res) 6572 { 6573 /* Headphone insertion or removal. */ 6574 if ((res >> 26) == ALC880_HP_EVENT) 6575 alc885_imac24_automute(codec); 6576 } 6577 6578 static void alc885_mbp3_automute(struct hda_codec *codec) 6579 { 6580 unsigned int present; 6581 6582 present = snd_hda_codec_read(codec, 0x15, 0, 6583 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 6584 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 6585 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 6586 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 6587 HDA_AMP_MUTE, present ? 0 : HDA_AMP_MUTE); 6588 6589 } 6590 static void alc885_mbp3_unsol_event(struct hda_codec *codec, 6591 unsigned int res) 6592 { 6593 /* Headphone insertion or removal. */ 6594 if ((res >> 26) == ALC880_HP_EVENT) 6595 alc885_mbp3_automute(codec); 7469 static void alc885_imac24_setup(struct hda_codec *codec) 7470 { 7471 struct alc_spec *spec = codec->spec; 7472 7473 spec->autocfg.hp_pins[0] = 0x14; 7474 spec->autocfg.speaker_pins[0] = 0x18; 7475 spec->autocfg.speaker_pins[1] = 0x1a; 7476 } 7477 7478 static void alc885_mbp3_setup(struct hda_codec *codec) 7479 { 7480 struct alc_spec *spec = codec->spec; 7481 7482 spec->autocfg.hp_pins[0] = 0x15; 7483 spec->autocfg.speaker_pins[0] = 0x14; 6596 7484 } 6597 7485 … … 6609 7497 6610 7498 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 6611 {0x01, AC_VERB_SET_GPIO_MASK, 0x03},6612 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03},6613 {0x01, AC_VERB_SET_GPIO_DATA, 0x03},6614 7499 {0} /* end */ 6615 7500 }; … … 6618 7503 static void alc882_targa_automute(struct hda_codec *codec) 6619 7504 { 6620 unsigned int present; 6621 6622 present = snd_hda_codec_read(codec, 0x14, 0, 6623 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 6624 snd_hda_codec_amp_stereo(codec, 0x1b, HDA_OUTPUT, 0, 6625 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 7505 struct alc_spec *spec = codec->spec; 7506 alc_automute_amp(codec); 6626 7507 snd_hda_codec_write_cache(codec, 1, 0, AC_VERB_SET_GPIO_DATA, 6627 present ? 1 : 3); 7508 spec->jack_present ? 1 : 3); 7509 } 7510 7511 static void alc882_targa_setup(struct hda_codec *codec) 7512 { 7513 struct alc_spec *spec = codec->spec; 7514 7515 spec->autocfg.hp_pins[0] = 0x14; 7516 spec->autocfg.speaker_pins[0] = 0x1b; 6628 7517 } 6629 7518 6630 7519 static void alc882_targa_unsol_event(struct hda_codec *codec, unsigned int res) 6631 7520 { 6632 /* Looks like the unsol event is incompatible with the standard 6633 * definition. 4bit tag is placed at 26 bit! 6634 */ 6635 if (((res >> 26) == ALC880_HP_EVENT)) { 7521 if ((res >> 26) == ALC880_HP_EVENT) 6636 7522 alc882_targa_automute(codec); 6637 }6638 7523 } 6639 7524 … … 6717 7602 { 6718 7603 alc885_macpro_init_hook(codec); 6719 alc 885_imac24_automute(codec);7604 alc_automute_amp(codec); 6720 7605 } 6721 7606 … … 6723 7608 * generic initialization of ADC, input mixers and output mixers 6724 7609 */ 6725 static struct hda_verb alc88 2_auto_init_verbs[] = {7610 static struct hda_verb alc883_auto_init_verbs[] = { 6726 7611 /* 6727 7612 * Unmute ADC0-2 and set the default input to mic-in 6728 7613 */ 6729 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},6730 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},6731 7614 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, 6732 7615 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, … … 6769 7652 /* FIXME: use matrix-type input source selection */ 6770 7653 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */ 6771 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */6772 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},6773 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},6774 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},6775 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},6776 7654 /* Input mixer2 */ 6777 7655 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, … … 6788 7666 }; 6789 7667 7668 /* 2ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:front) */ 7669 static struct hda_verb alc889A_mb31_ch2_init[] = { 7670 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP as front */ 7671 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */ 7672 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Line as input */ 7673 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Line off */ 7674 {0} /* end */ 7675 }; 7676 7677 /* 4ch mode (Speaker:front, Subwoofer:CLFE, Line:CLFE, Headphones:front) */ 7678 static struct hda_verb alc889A_mb31_ch4_init[] = { 7679 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP as front */ 7680 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */ 7681 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Line as output */ 7682 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */ 7683 {0} /* end */ 7684 }; 7685 7686 /* 5ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:rear) */ 7687 static struct hda_verb alc889A_mb31_ch5_init[] = { 7688 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* HP as rear */ 7689 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */ 7690 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Line as input */ 7691 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Line off */ 7692 {0} /* end */ 7693 }; 7694 7695 /* 6ch mode (Speaker:front, Subwoofer:off, Line:CLFE, Headphones:Rear) */ 7696 static struct hda_verb alc889A_mb31_ch6_init[] = { 7697 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* HP as front */ 7698 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Subwoofer off */ 7699 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Line as output */ 7700 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */ 7701 {0} /* end */ 7702 }; 7703 7704 static struct hda_channel_mode alc889A_mb31_6ch_modes[4] = { 7705 { 2, alc889A_mb31_ch2_init }, 7706 { 4, alc889A_mb31_ch4_init }, 7707 { 5, alc889A_mb31_ch5_init }, 7708 { 6, alc889A_mb31_ch6_init }, 7709 }; 7710 7711 static struct hda_verb alc883_medion_eapd_verbs[] = { 7712 /* eanable EAPD on medion laptop */ 7713 {0x20, AC_VERB_SET_COEF_INDEX, 0x07}, 7714 {0x20, AC_VERB_SET_PROC_COEF, 0x3070}, 7715 {0} 7716 }; 7717 7718 #define alc883_base_mixer alc882_base_mixer 7719 7720 static struct snd_kcontrol_new alc883_mitac_mixer[] = { 7721 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7722 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 7723 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 7724 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 7725 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 7726 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 7727 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 7728 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7729 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 7730 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7731 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 7732 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 7733 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 7734 {0} /* end */ 7735 }; 7736 7737 static struct snd_kcontrol_new alc883_clevo_m720_mixer[] = { 7738 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7739 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT), 7740 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 7741 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT), 7742 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7743 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 7744 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7745 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 7746 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT), 7747 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 7748 {0} /* end */ 7749 }; 7750 7751 static struct snd_kcontrol_new alc883_2ch_fujitsu_pi2515_mixer[] = { 7752 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7753 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT), 7754 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 7755 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT), 7756 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7757 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 7758 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7759 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 7760 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT), 7761 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 7762 {0} /* end */ 7763 }; 7764 7765 static struct snd_kcontrol_new alc883_3ST_2ch_mixer[] = { 7766 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7767 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 7768 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 7769 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 7770 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 7771 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 7772 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 7773 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7774 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 7775 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7776 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 7777 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 7778 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 7779 {0} /* end */ 7780 }; 7781 7782 static struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = { 7783 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7784 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 7785 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 7786 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 7787 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 7788 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 7789 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 7790 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 7791 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 7792 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 7793 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 7794 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 7795 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 7796 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7797 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 7798 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7799 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 7800 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 7801 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 7802 {0} /* end */ 7803 }; 7804 7805 static struct snd_kcontrol_new alc883_3ST_6ch_intel_mixer[] = { 7806 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7807 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 7808 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 7809 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 7810 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, 7811 HDA_OUTPUT), 7812 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 7813 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 7814 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 7815 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 7816 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 7817 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 7818 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 7819 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 7820 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 7821 HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT), 7822 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 7823 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7824 HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT), 7825 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7826 {0} /* end */ 7827 }; 7828 7829 static struct snd_kcontrol_new alc885_8ch_intel_mixer[] = { 7830 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7831 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 7832 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 7833 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 7834 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, 7835 HDA_OUTPUT), 7836 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 7837 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 7838 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 7839 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 7840 HDA_BIND_MUTE("Speaker Playback Switch", 0x0f, 2, HDA_INPUT), 7841 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 7842 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 7843 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 7844 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x3, HDA_INPUT), 7845 HDA_CODEC_VOLUME("Mic Boost", 0x1b, 0, HDA_INPUT), 7846 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x3, HDA_INPUT), 7847 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7848 HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT), 7849 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7850 {0} /* end */ 7851 }; 7852 7853 static struct snd_kcontrol_new alc883_fivestack_mixer[] = { 7854 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7855 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 7856 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 7857 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 7858 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 7859 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 7860 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 7861 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 7862 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 7863 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 7864 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 7865 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 7866 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 7867 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7868 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 7869 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7870 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 7871 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 7872 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 7873 {0} /* end */ 7874 }; 7875 7876 static struct snd_kcontrol_new alc883_targa_mixer[] = { 7877 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7878 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT), 7879 HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 7880 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 7881 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT), 7882 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), 7883 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT), 7884 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT), 7885 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT), 7886 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 7887 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 7888 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 7889 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 7890 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7891 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 7892 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7893 {0} /* end */ 7894 }; 7895 7896 static struct snd_kcontrol_new alc883_targa_2ch_mixer[] = { 7897 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7898 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT), 7899 HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 7900 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 7901 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 7902 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7903 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 7904 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7905 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 7906 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT), 7907 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 7908 {0} /* end */ 7909 }; 7910 7911 static struct snd_kcontrol_new alc883_lenovo_101e_2ch_mixer[] = { 7912 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7913 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 7914 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 7915 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT), 7916 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 7917 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 7918 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 7919 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 7920 {0} /* end */ 7921 }; 7922 7923 static struct snd_kcontrol_new alc883_lenovo_nb0763_mixer[] = { 7924 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7925 HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT), 7926 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT), 7927 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 7928 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 7929 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7930 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7931 HDA_CODEC_VOLUME("iMic Playback Volume", 0x0b, 0x1, HDA_INPUT), 7932 HDA_CODEC_MUTE("iMic Playback Switch", 0x0b, 0x1, HDA_INPUT), 7933 {0} /* end */ 7934 }; 7935 7936 static struct snd_kcontrol_new alc883_medion_md2_mixer[] = { 7937 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7938 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT), 7939 HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT), 7940 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 7941 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 7942 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7943 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7944 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 7945 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 7946 {0} /* end */ 7947 }; 7948 7949 static struct snd_kcontrol_new alc883_acer_aspire_mixer[] = { 7950 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7951 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 7952 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT), 7953 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 7954 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 7955 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7956 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 7957 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7958 {0} /* end */ 7959 }; 7960 7961 static struct snd_kcontrol_new alc888_acer_aspire_6530_mixer[] = { 7962 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7963 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 7964 HDA_CODEC_VOLUME("LFE Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 7965 HDA_BIND_MUTE("LFE Playback Switch", 0x0f, 2, HDA_INPUT), 7966 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 7967 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 7968 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 7969 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 7970 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7971 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 7972 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7973 {0} /* end */ 7974 }; 7975 7976 static struct snd_kcontrol_new alc888_lenovo_sky_mixer[] = { 7977 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 7978 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 7979 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0e, 0x0, HDA_OUTPUT), 7980 HDA_BIND_MUTE("Surround Playback Switch", 0x0e, 2, HDA_INPUT), 7981 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 7982 0x0d, 1, 0x0, HDA_OUTPUT), 7983 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT), 7984 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT), 7985 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT), 7986 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT), 7987 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT), 7988 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 7989 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 7990 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 7991 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 7992 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 7993 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 7994 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 7995 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 7996 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 7997 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 7998 {0} /* end */ 7999 }; 8000 8001 static struct snd_kcontrol_new alc889A_mb31_mixer[] = { 8002 /* Output mixers */ 8003 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT), 8004 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 0x02, HDA_INPUT), 8005 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT), 8006 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT), 8007 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x00, 8008 HDA_OUTPUT), 8009 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x02, HDA_INPUT), 8010 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x00, HDA_OUTPUT), 8011 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x02, HDA_INPUT), 8012 /* Output switches */ 8013 HDA_CODEC_MUTE("Enable Speaker", 0x14, 0x00, HDA_OUTPUT), 8014 HDA_CODEC_MUTE("Enable Headphones", 0x15, 0x00, HDA_OUTPUT), 8015 HDA_CODEC_MUTE_MONO("Enable LFE", 0x16, 2, 0x00, HDA_OUTPUT), 8016 /* Boost mixers */ 8017 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT), 8018 HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT), 8019 /* Input mixers */ 8020 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT), 8021 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT), 8022 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 8023 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 8024 {0} /* end */ 8025 }; 8026 8027 static struct snd_kcontrol_new alc883_vaiott_mixer[] = { 8028 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 8029 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 8030 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 8031 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 8032 HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT), 8033 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 8034 {0} /* end */ 8035 }; 8036 8037 static struct hda_bind_ctls alc883_bind_cap_vol = { 8038 .ops = &snd_hda_bind_vol, 8039 .values = { 8040 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT), 8041 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT), 8042 0 8043 }, 8044 }; 8045 8046 static struct hda_bind_ctls alc883_bind_cap_switch = { 8047 .ops = &snd_hda_bind_sw, 8048 .values = { 8049 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT), 8050 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT), 8051 0 8052 }, 8053 }; 8054 8055 static struct snd_kcontrol_new alc883_asus_eee1601_mixer[] = { 8056 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 8057 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT), 8058 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT), 8059 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 8060 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 8061 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 8062 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 8063 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 8064 {0} /* end */ 8065 }; 8066 8067 static struct snd_kcontrol_new alc883_asus_eee1601_cap_mixer[] = { 8068 HDA_BIND_VOL("Capture Volume", &alc883_bind_cap_vol), 8069 HDA_BIND_SW("Capture Switch", &alc883_bind_cap_switch), 8070 { 8071 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 8072 /* .name = "Capture Source", */ 8073 .name = "Input Source", 8074 .count = 1, 8075 .info = alc_mux_enum_info, 8076 .get = alc_mux_enum_get, 8077 .put = alc_mux_enum_put, 8078 }, 8079 {0} /* end */ 8080 }; 8081 8082 static struct snd_kcontrol_new alc883_chmode_mixer[] = { 8083 { 8084 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 8085 .name = "Channel Mode", 8086 .info = alc_ch_mode_info, 8087 .get = alc_ch_mode_get, 8088 .put = alc_ch_mode_put, 8089 }, 8090 {0} /* end */ 8091 }; 8092 8093 /* toggle speaker-output according to the hp-jack state */ 8094 static void alc883_mitac_setup(struct hda_codec *codec) 8095 { 8096 struct alc_spec *spec = codec->spec; 8097 8098 spec->autocfg.hp_pins[0] = 0x15; 8099 spec->autocfg.speaker_pins[0] = 0x14; 8100 spec->autocfg.speaker_pins[1] = 0x17; 8101 } 8102 8103 /* auto-toggle front mic */ 8104 /* 8105 static void alc883_mitac_mic_automute(struct hda_codec *codec) 8106 { 8107 unsigned int present; 8108 unsigned char bits; 8109 8110 present = snd_hda_codec_read(codec, 0x18, 0, 8111 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 8112 bits = present ? HDA_AMP_MUTE : 0; 8113 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits); 8114 } 8115 */ 8116 8117 static struct hda_verb alc883_mitac_verbs[] = { 8118 /* HP */ 8119 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 8120 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8121 /* Subwoofer */ 8122 {0x17, AC_VERB_SET_CONNECT_SEL, 0x02}, 8123 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8124 8125 /* enable unsolicited event */ 8126 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8127 /* {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, */ 8128 8129 {0} /* end */ 8130 }; 8131 8132 static struct hda_verb alc883_clevo_m720_verbs[] = { 8133 /* HP */ 8134 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 8135 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8136 /* Int speaker */ 8137 {0x14, AC_VERB_SET_CONNECT_SEL, 0x01}, 8138 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8139 8140 /* enable unsolicited event */ 8141 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8142 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, 8143 8144 {0} /* end */ 8145 }; 8146 8147 static struct hda_verb alc883_2ch_fujitsu_pi2515_verbs[] = { 8148 /* HP */ 8149 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 8150 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8151 /* Subwoofer */ 8152 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, 8153 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8154 8155 /* enable unsolicited event */ 8156 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8157 8158 {0} /* end */ 8159 }; 8160 8161 static struct hda_verb alc883_targa_verbs[] = { 8162 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8163 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 8164 8165 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8166 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8167 8168 /* Connect Line-Out side jack (SPDIF) to Side */ 8169 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8170 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 8171 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03}, 8172 /* Connect Mic jack to CLFE */ 8173 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8174 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 8175 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, 8176 /* Connect Line-in jack to Surround */ 8177 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8178 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 8179 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, 8180 /* Connect HP out jack to Front */ 8181 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8182 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 8183 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, 8184 8185 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8186 8187 {0} /* end */ 8188 }; 8189 8190 static struct hda_verb alc883_lenovo_101e_verbs[] = { 8191 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 8192 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT|AC_USRSP_EN}, 8193 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT|AC_USRSP_EN}, 8194 {0} /* end */ 8195 }; 8196 8197 static struct hda_verb alc883_lenovo_nb0763_verbs[] = { 8198 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 8199 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8200 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8201 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8202 {0} /* end */ 8203 }; 8204 8205 static struct hda_verb alc888_lenovo_ms7195_verbs[] = { 8206 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8207 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 8208 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 8209 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT | AC_USRSP_EN}, 8210 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8211 {0} /* end */ 8212 }; 8213 8214 static struct hda_verb alc883_haier_w66_verbs[] = { 8215 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8216 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 8217 8218 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8219 8220 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, 8221 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8222 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8223 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8224 {0} /* end */ 8225 }; 8226 8227 static struct hda_verb alc888_lenovo_sky_verbs[] = { 8228 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8229 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 8230 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8231 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8232 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8233 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8234 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00}, 8235 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8236 {0} /* end */ 8237 }; 8238 8239 static struct hda_verb alc888_6st_dell_verbs[] = { 8240 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8241 {0} 8242 }; 8243 8244 static struct hda_verb alc883_vaiott_verbs[] = { 8245 /* HP */ 8246 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 8247 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8248 8249 /* enable unsolicited event */ 8250 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8251 8252 {0} /* end */ 8253 }; 8254 8255 static void alc888_3st_hp_setup(struct hda_codec *codec) 8256 { 8257 struct alc_spec *spec = codec->spec; 8258 8259 spec->autocfg.hp_pins[0] = 0x1b; 8260 spec->autocfg.speaker_pins[0] = 0x14; 8261 spec->autocfg.speaker_pins[1] = 0x16; 8262 spec->autocfg.speaker_pins[2] = 0x18; 8263 } 8264 8265 static struct hda_verb alc888_3st_hp_verbs[] = { 8266 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front: output 0 (0x0c) */ 8267 {0x16, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Rear : output 1 (0x0d) */ 8268 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* CLFE : output 2 (0x0e) */ 8269 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8270 {0} /* end */ 8271 }; 8272 8273 /* 8274 * 2ch mode 8275 */ 8276 static struct hda_verb alc888_3st_hp_2ch_init[] = { 8277 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 8278 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 8279 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, 8280 { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 8281 {0} /* end */ 8282 }; 8283 8284 /* 8285 * 4ch mode 8286 */ 8287 static struct hda_verb alc888_3st_hp_4ch_init[] = { 8288 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, 8289 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 8290 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 8291 { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 8292 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 }, 8293 {0} /* end */ 8294 }; 8295 8296 /* 8297 * 6ch mode 8298 */ 8299 static struct hda_verb alc888_3st_hp_6ch_init[] = { 8300 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 8301 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 8302 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 }, 8303 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, 8304 { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, 8305 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 }, 8306 {0} /* end */ 8307 }; 8308 8309 static struct hda_channel_mode alc888_3st_hp_modes[3] = { 8310 { 2, alc888_3st_hp_2ch_init }, 8311 { 4, alc888_3st_hp_4ch_init }, 8312 { 6, alc888_3st_hp_6ch_init }, 8313 }; 8314 8315 /* toggle front-jack and RCA according to the hp-jack state */ 8316 static void alc888_lenovo_ms7195_front_automute(struct hda_codec *codec) 8317 { 8318 unsigned int present; 8319 8320 present = snd_hda_codec_read(codec, 0x1b, 0, 8321 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 8322 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 8323 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 8324 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 8325 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 8326 } 8327 8328 /* toggle RCA according to the front-jack state */ 8329 static void alc888_lenovo_ms7195_rca_automute(struct hda_codec *codec) 8330 { 8331 unsigned int present; 8332 8333 present = snd_hda_codec_read(codec, 0x14, 0, 8334 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 8335 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 8336 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 8337 } 8338 8339 static void alc883_lenovo_ms7195_unsol_event(struct hda_codec *codec, 8340 unsigned int res) 8341 { 8342 if ((res >> 26) == ALC880_HP_EVENT) 8343 alc888_lenovo_ms7195_front_automute(codec); 8344 if ((res >> 26) == ALC880_FRONT_EVENT) 8345 alc888_lenovo_ms7195_rca_automute(codec); 8346 } 8347 8348 static struct hda_verb alc883_medion_md2_verbs[] = { 8349 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8350 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 8351 8352 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8353 8354 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8355 {0} /* end */ 8356 }; 8357 8358 /* toggle speaker-output according to the hp-jack state */ 8359 static void alc883_medion_md2_setup(struct hda_codec *codec) 8360 { 8361 struct alc_spec *spec = codec->spec; 8362 8363 spec->autocfg.hp_pins[0] = 0x14; 8364 spec->autocfg.speaker_pins[0] = 0x15; 8365 } 8366 8367 /* toggle speaker-output according to the hp-jack state */ 8368 #define alc883_targa_init_hook alc882_targa_init_hook 8369 #define alc883_targa_unsol_event alc882_targa_unsol_event 8370 8371 static void alc883_clevo_m720_mic_automute(struct hda_codec *codec) 8372 { 8373 unsigned int present; 8374 8375 present = snd_hda_codec_read(codec, 0x18, 0, 8376 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 8377 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, 8378 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 8379 } 8380 8381 static void alc883_clevo_m720_setup(struct hda_codec *codec) 8382 { 8383 struct alc_spec *spec = codec->spec; 8384 8385 spec->autocfg.hp_pins[0] = 0x15; 8386 spec->autocfg.speaker_pins[0] = 0x14; 8387 } 8388 8389 static void alc883_clevo_m720_init_hook(struct hda_codec *codec) 8390 { 8391 alc_automute_amp(codec); 8392 alc883_clevo_m720_mic_automute(codec); 8393 } 8394 8395 static void alc883_clevo_m720_unsol_event(struct hda_codec *codec, 8396 unsigned int res) 8397 { 8398 switch (res >> 26) { 8399 case ALC880_MIC_EVENT: 8400 alc883_clevo_m720_mic_automute(codec); 8401 break; 8402 default: 8403 alc_automute_amp_unsol_event(codec, res); 8404 break; 8405 } 8406 } 8407 8408 /* toggle speaker-output according to the hp-jack state */ 8409 static void alc883_2ch_fujitsu_pi2515_setup(struct hda_codec *codec) 8410 { 8411 struct alc_spec *spec = codec->spec; 8412 8413 spec->autocfg.hp_pins[0] = 0x14; 8414 spec->autocfg.speaker_pins[0] = 0x15; 8415 } 8416 8417 static void alc883_haier_w66_setup(struct hda_codec *codec) 8418 { 8419 struct alc_spec *spec = codec->spec; 8420 8421 spec->autocfg.hp_pins[0] = 0x1b; 8422 spec->autocfg.speaker_pins[0] = 0x14; 8423 } 8424 8425 static void alc883_lenovo_101e_ispeaker_automute(struct hda_codec *codec) 8426 { 8427 unsigned int present; 8428 unsigned char bits; 8429 8430 present = snd_hda_codec_read(codec, 0x14, 0, AC_VERB_GET_PIN_SENSE, 0) 8431 & AC_PINSENSE_PRESENCE; 8432 bits = present ? HDA_AMP_MUTE : 0; 8433 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 8434 HDA_AMP_MUTE, bits); 8435 } 8436 8437 static void alc883_lenovo_101e_all_automute(struct hda_codec *codec) 8438 { 8439 unsigned int present; 8440 unsigned char bits; 8441 8442 present = snd_hda_codec_read(codec, 0x1b, 0, 8443 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 8444 bits = present ? HDA_AMP_MUTE : 0; 8445 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 8446 HDA_AMP_MUTE, bits); 8447 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 8448 HDA_AMP_MUTE, bits); 8449 } 8450 8451 static void alc883_lenovo_101e_unsol_event(struct hda_codec *codec, 8452 unsigned int res) 8453 { 8454 if ((res >> 26) == ALC880_HP_EVENT) 8455 alc883_lenovo_101e_all_automute(codec); 8456 if ((res >> 26) == ALC880_FRONT_EVENT) 8457 alc883_lenovo_101e_ispeaker_automute(codec); 8458 } 8459 8460 /* toggle speaker-output according to the hp-jack state */ 8461 static void alc883_acer_aspire_setup(struct hda_codec *codec) 8462 { 8463 struct alc_spec *spec = codec->spec; 8464 8465 spec->autocfg.hp_pins[0] = 0x14; 8466 spec->autocfg.speaker_pins[0] = 0x15; 8467 spec->autocfg.speaker_pins[1] = 0x16; 8468 } 8469 8470 static struct hda_verb alc883_acer_eapd_verbs[] = { 8471 /* HP Pin: output 0 (0x0c) */ 8472 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8473 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 8474 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, 8475 /* Front Pin: output 0 (0x0c) */ 8476 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8477 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 8478 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8479 {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, 8480 /* eanable EAPD on medion laptop */ 8481 {0x20, AC_VERB_SET_COEF_INDEX, 0x07}, 8482 {0x20, AC_VERB_SET_PROC_COEF, 0x3050}, 8483 /* enable unsolicited event */ 8484 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8485 {0} 8486 }; 8487 8488 static struct hda_verb alc888_acer_aspire_7730G_verbs[] = { 8489 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, 8490 {0x17, AC_VERB_SET_CONNECT_SEL, 0x02}, 8491 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8492 {0} /* end */ 8493 }; 8494 8495 static void alc888_6st_dell_setup(struct hda_codec *codec) 8496 { 8497 struct alc_spec *spec = codec->spec; 8498 8499 spec->autocfg.hp_pins[0] = 0x1b; 8500 spec->autocfg.speaker_pins[0] = 0x14; 8501 spec->autocfg.speaker_pins[1] = 0x15; 8502 spec->autocfg.speaker_pins[2] = 0x16; 8503 spec->autocfg.speaker_pins[3] = 0x17; 8504 } 8505 8506 static void alc888_lenovo_sky_setup(struct hda_codec *codec) 8507 { 8508 struct alc_spec *spec = codec->spec; 8509 8510 spec->autocfg.hp_pins[0] = 0x1b; 8511 spec->autocfg.speaker_pins[0] = 0x14; 8512 spec->autocfg.speaker_pins[1] = 0x15; 8513 spec->autocfg.speaker_pins[2] = 0x16; 8514 spec->autocfg.speaker_pins[3] = 0x17; 8515 spec->autocfg.speaker_pins[4] = 0x1a; 8516 } 8517 8518 static void alc883_vaiott_setup(struct hda_codec *codec) 8519 { 8520 struct alc_spec *spec = codec->spec; 8521 8522 spec->autocfg.hp_pins[0] = 0x15; 8523 spec->autocfg.speaker_pins[0] = 0x14; 8524 spec->autocfg.speaker_pins[1] = 0x17; 8525 } 8526 8527 static struct hda_verb alc888_asus_m90v_verbs[] = { 8528 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 8529 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 8530 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 8531 /* enable unsolicited event */ 8532 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8533 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, 8534 {0} /* end */ 8535 }; 8536 8537 static void alc883_mode2_setup(struct hda_codec *codec) 8538 { 8539 struct alc_spec *spec = codec->spec; 8540 8541 spec->autocfg.hp_pins[0] = 0x1b; 8542 spec->autocfg.speaker_pins[0] = 0x14; 8543 spec->autocfg.speaker_pins[1] = 0x15; 8544 spec->autocfg.speaker_pins[2] = 0x16; 8545 spec->ext_mic.pin = 0x18; 8546 spec->int_mic.pin = 0x19; 8547 spec->ext_mic.mux_idx = 0; 8548 spec->int_mic.mux_idx = 1; 8549 spec->auto_mic = 1; 8550 } 8551 8552 static struct hda_verb alc888_asus_eee1601_verbs[] = { 8553 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 8554 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 8555 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 8556 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 8557 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 8558 {0x20, AC_VERB_SET_COEF_INDEX, 0x0b}, 8559 {0x20, AC_VERB_SET_PROC_COEF, 0x0838}, 8560 /* enable unsolicited event */ 8561 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8562 {0} /* end */ 8563 }; 8564 8565 static void alc883_eee1601_inithook(struct hda_codec *codec) 8566 { 8567 struct alc_spec *spec = codec->spec; 8568 8569 spec->autocfg.hp_pins[0] = 0x14; 8570 spec->autocfg.speaker_pins[0] = 0x1b; 8571 alc_automute_pin(codec); 8572 } 8573 8574 static struct hda_verb alc889A_mb31_verbs[] = { 8575 /* Init rear pin (used as headphone output) */ 8576 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4}, /* Apple Headphones */ 8577 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Connect to front */ 8578 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 8579 /* Init line pin (used as output in 4ch and 6ch mode) */ 8580 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02}, /* Connect to CLFE */ 8581 /* Init line 2 pin (used as headphone out by default) */ 8582 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Use as input */ 8583 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Mute output */ 8584 {0} /* end */ 8585 }; 8586 8587 /* Mute speakers according to the headphone jack state */ 8588 static void alc889A_mb31_automute(struct hda_codec *codec) 8589 { 8590 unsigned int present; 8591 8592 /* Mute only in 2ch or 4ch mode */ 8593 if (snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_CONNECT_SEL, 0) 8594 == 0x00) { 8595 present = snd_hda_codec_read(codec, 0x15, 0, 8596 AC_VERB_GET_PIN_SENSE, 0) & AC_PINSENSE_PRESENCE; 8597 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 8598 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 8599 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0, 8600 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 8601 } 8602 } 8603 8604 static void alc889A_mb31_unsol_event(struct hda_codec *codec, unsigned int res) 8605 { 8606 if ((res >> 26) == ALC880_HP_EVENT) 8607 alc889A_mb31_automute(codec); 8608 } 8609 8610 6790 8611 #ifdef CONFIG_SND_HDA_POWER_SAVE 6791 8612 #define alc882_loopbacks alc880_loopbacks 6792 8613 #endif 6793 8614 6794 /* pcm configuration: identi acal with ALC880 */8615 /* pcm configuration: identical with ALC880 */ 6795 8616 #define alc882_pcm_analog_playback alc880_pcm_analog_playback 6796 8617 #define alc882_pcm_analog_capture alc880_pcm_analog_capture 6797 8618 #define alc882_pcm_digital_playback alc880_pcm_digital_playback 6798 8619 #define alc882_pcm_digital_capture alc880_pcm_digital_capture 8620 8621 static hda_nid_t alc883_slave_dig_outs[] = { 8622 ALC1200_DIGOUT_NID, 0, 8623 }; 8624 8625 static hda_nid_t alc1200_slave_dig_outs[] = { 8626 ALC883_DIGOUT_NID, 0, 8627 }; 6799 8628 6800 8629 /* … … 6810 8639 [ALC882_ASUS_A7M] = "asus-a7m", 6811 8640 [ALC885_MACPRO] = "macpro", 8641 [ALC885_MB5] = "mb5", 6812 8642 [ALC885_MBP3] = "mbp3", 6813 8643 [ALC885_IMAC24] = "imac24", 8644 [ALC883_3ST_2ch_DIG] = "3stack-2ch-dig", 8645 [ALC883_3ST_6ch_DIG] = "3stack-6ch-dig", 8646 [ALC883_3ST_6ch] = "3stack-6ch", 8647 [ALC883_6ST_DIG] = "alc883-6stack-dig", 8648 [ALC883_TARGA_DIG] = "targa-dig", 8649 [ALC883_TARGA_2ch_DIG] = "targa-2ch-dig", 8650 [ALC883_TARGA_8ch_DIG] = "targa-8ch-dig", 8651 [ALC883_ACER] = "acer", 8652 [ALC883_ACER_ASPIRE] = "acer-aspire", 8653 [ALC888_ACER_ASPIRE_4930G] = "acer-aspire-4930g", 8654 [ALC888_ACER_ASPIRE_6530G] = "acer-aspire-6530g", 8655 [ALC888_ACER_ASPIRE_8930G] = "acer-aspire-8930g", 8656 [ALC888_ACER_ASPIRE_7730G] = "acer-aspire-7730g", 8657 [ALC883_MEDION] = "medion", 8658 [ALC883_MEDION_MD2] = "medion-md2", 8659 [ALC883_LAPTOP_EAPD] = "laptop-eapd", 8660 [ALC883_LENOVO_101E_2ch] = "lenovo-101e", 8661 [ALC883_LENOVO_NB0763] = "lenovo-nb0763", 8662 [ALC888_LENOVO_MS7195_DIG] = "lenovo-ms7195-dig", 8663 [ALC888_LENOVO_SKY] = "lenovo-sky", 8664 [ALC883_HAIER_W66] = "haier-w66", 8665 [ALC888_3ST_HP] = "3stack-hp", 8666 [ALC888_6ST_DELL] = "6stack-dell", 8667 [ALC883_MITAC] = "mitac", 8668 [ALC883_CLEVO_M720] = "clevo-m720", 8669 [ALC883_FUJITSU_PI2515] = "fujitsu-pi2515", 8670 [ALC888_FUJITSU_XA3530] = "fujitsu-xa3530", 8671 [ALC883_3ST_6ch_INTEL] = "3stack-6ch-intel", 8672 [ALC889A_INTEL] = "intel-alc889a", 8673 [ALC889_INTEL] = "intel-x58", 8674 [ALC1200_ASUS_P5Q] = "asus-p5q", 8675 [ALC889A_MB31] = "mb31", 8676 [ALC883_SONY_VAIO_TT] = "sony-vaio-tt", 6814 8677 [ALC882_AUTO] = "auto", 6815 8678 }; … … 6817 8680 static struct snd_pci_quirk alc882_cfg_tbl[] = { 6818 8681 SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC882_6ST_DIG), 8682 8683 SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE), 8684 SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_ACER_ASPIRE), 8685 SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_ACER_ASPIRE), 8686 SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE), 8687 SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE), 8688 SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE), 8689 SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G", 8690 ALC888_ACER_ASPIRE_4930G), 8691 SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G", 8692 ALC888_ACER_ASPIRE_4930G), 8693 SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G", 8694 ALC888_ACER_ASPIRE_8930G), 8695 SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G", 8696 ALC888_ACER_ASPIRE_8930G), 8697 SND_PCI_QUIRK(0x1025, 0x0157, "Acer X3200", ALC882_AUTO), 8698 SND_PCI_QUIRK(0x1025, 0x0158, "Acer AX1700-U3700A", ALC882_AUTO), 8699 SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G", 8700 ALC888_ACER_ASPIRE_6530G), 8701 SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G", 8702 ALC888_ACER_ASPIRE_6530G), 8703 SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G", 8704 ALC888_ACER_ASPIRE_7730G), 8705 /* default Acer -- disabled as it causes more problems. 8706 * model=auto should work fine now 8707 */ 8708 /* SND_PCI_QUIRK_VENDOR(0x1025, "Acer laptop", ALC883_ACER), */ 8709 8710 SND_PCI_QUIRK(0x1028, 0x020d, "Dell Inspiron 530", ALC888_6ST_DELL), 8711 8712 SND_PCI_QUIRK(0x103c, 0x2a3d, "HP Pavillion", ALC883_6ST_DIG), 8713 SND_PCI_QUIRK(0x103c, 0x2a4f, "HP Samba", ALC888_3ST_HP), 8714 SND_PCI_QUIRK(0x103c, 0x2a60, "HP Lucknow", ALC888_3ST_HP), 8715 SND_PCI_QUIRK(0x103c, 0x2a61, "HP Nettle", ALC883_6ST_DIG), 8716 SND_PCI_QUIRK(0x103c, 0x2a66, "HP Acacia", ALC888_3ST_HP), 8717 SND_PCI_QUIRK(0x103c, 0x2a72, "HP Educ.ar", ALC888_3ST_HP), 8718 6819 8719 SND_PCI_QUIRK(0x1043, 0x060d, "Asus A7J", ALC882_ASUS_A7J), 6820 8720 SND_PCI_QUIRK(0x1043, 0x1243, "Asus A7J", ALC882_ASUS_A7J), 6821 8721 SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_ASUS_A7M), 8722 SND_PCI_QUIRK(0x1043, 0x1873, "Asus M90V", ALC888_ASUS_M90V), 6822 8723 SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_W2JC), 6823 8724 SND_PCI_QUIRK(0x1043, 0x817f, "Asus P5LD2", ALC882_6ST_DIG), 6824 8725 SND_PCI_QUIRK(0x1043, 0x81d8, "Asus P5WD", ALC882_6ST_DIG), 8726 SND_PCI_QUIRK(0x1043, 0x8249, "Asus M2A-VM HDMI", ALC883_3ST_6ch_DIG), 8727 SND_PCI_QUIRK(0x1043, 0x8284, "Asus Z37E", ALC883_6ST_DIG), 8728 SND_PCI_QUIRK(0x1043, 0x82fe, "Asus P5Q-EM HDMI", ALC1200_ASUS_P5Q), 8729 SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_ASUS_EEE1601), 8730 8731 SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC883_SONY_VAIO_TT), 8732 SND_PCI_QUIRK(0x105b, 0x0ce8, "Foxconn P35AX-S", ALC883_6ST_DIG), 6825 8733 SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC882_6ST_DIG), 8734 SND_PCI_QUIRK(0x1071, 0x8227, "Mitac 82801H", ALC883_MITAC), 8735 SND_PCI_QUIRK(0x1071, 0x8253, "Mitac 8252d", ALC883_MITAC), 8736 SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC883_LAPTOP_EAPD), 8737 SND_PCI_QUIRK(0x10f1, 0x2350, "TYAN-S2350", ALC888_6ST_DELL), 8738 SND_PCI_QUIRK(0x108e, 0x534d, NULL, ALC883_3ST_6ch), 6826 8739 SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte P35 DS3R", ALC882_6ST_DIG), 8740 8741 SND_PCI_QUIRK(0x1462, 0x0349, "MSI", ALC883_TARGA_2ch_DIG), 8742 SND_PCI_QUIRK(0x1462, 0x040d, "MSI", ALC883_TARGA_2ch_DIG), 8743 SND_PCI_QUIRK(0x1462, 0x0579, "MSI", ALC883_TARGA_2ch_DIG), 6827 8744 SND_PCI_QUIRK(0x1462, 0x28fb, "Targa T8", ALC882_TARGA), /* MSI-1049 T8 */ 8745 SND_PCI_QUIRK(0x1462, 0x2fb3, "MSI", ALC883_TARGA_2ch_DIG), 6828 8746 SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC882_6ST_DIG), 6829 SND_PCI_QUIRK(0x161f, 0x2054, "Arima W820", ALC882_ARIMA), 8747 SND_PCI_QUIRK(0x1462, 0x3729, "MSI S420", ALC883_TARGA_DIG), 8748 SND_PCI_QUIRK(0x1462, 0x3783, "NEC S970", ALC883_TARGA_DIG), 8749 SND_PCI_QUIRK(0x1462, 0x3b7f, "MSI", ALC883_TARGA_2ch_DIG), 8750 SND_PCI_QUIRK(0x1462, 0x3ef9, "MSI", ALC883_TARGA_DIG), 8751 SND_PCI_QUIRK(0x1462, 0x3fc1, "MSI", ALC883_TARGA_DIG), 8752 SND_PCI_QUIRK(0x1462, 0x3fc3, "MSI", ALC883_TARGA_DIG), 8753 SND_PCI_QUIRK(0x1462, 0x3fcc, "MSI", ALC883_TARGA_DIG), 8754 SND_PCI_QUIRK(0x1462, 0x3fdf, "MSI", ALC883_TARGA_DIG), 8755 SND_PCI_QUIRK(0x1462, 0x42cd, "MSI", ALC883_TARGA_DIG), 8756 SND_PCI_QUIRK(0x1462, 0x4314, "MSI", ALC883_TARGA_DIG), 8757 SND_PCI_QUIRK(0x1462, 0x4319, "MSI", ALC883_TARGA_DIG), 8758 SND_PCI_QUIRK(0x1462, 0x4324, "MSI", ALC883_TARGA_DIG), 8759 SND_PCI_QUIRK(0x1462, 0x6510, "MSI GX620", ALC883_TARGA_8ch_DIG), 8760 SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC883_6ST_DIG), 8761 SND_PCI_QUIRK(0x1462, 0x7187, "MSI", ALC883_6ST_DIG), 8762 SND_PCI_QUIRK(0x1462, 0x7250, "MSI", ALC883_6ST_DIG), 8763 SND_PCI_QUIRK(0x1462, 0x7260, "MSI 7260", ALC883_TARGA_DIG), 8764 SND_PCI_QUIRK(0x1462, 0x7267, "MSI", ALC883_3ST_6ch_DIG), 8765 SND_PCI_QUIRK(0x1462, 0x7280, "MSI", ALC883_6ST_DIG), 8766 SND_PCI_QUIRK(0x1462, 0x7327, "MSI", ALC883_6ST_DIG), 8767 SND_PCI_QUIRK(0x1462, 0x7350, "MSI", ALC883_6ST_DIG), 8768 SND_PCI_QUIRK(0x1462, 0xa422, "MSI", ALC883_TARGA_2ch_DIG), 8769 SND_PCI_QUIRK(0x1462, 0xaa08, "MSI", ALC883_TARGA_2ch_DIG), 8770 8771 SND_PCI_QUIRK(0x147b, 0x1083, "Abit IP35-PRO", ALC883_6ST_DIG), 8772 SND_PCI_QUIRK(0x1558, 0x0721, "Clevo laptop M720R", ALC883_CLEVO_M720), 8773 SND_PCI_QUIRK(0x1558, 0x0722, "Clevo laptop M720SR", ALC883_CLEVO_M720), 8774 SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC883_LAPTOP_EAPD), 8775 SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch), 8776 /* SND_PCI_QUIRK(0x161f, 0x2054, "Arima W820", ALC882_ARIMA), */ 8777 SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION), 8778 SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1100, "FSC AMILO Xi/Pi25xx", 8779 ALC883_FUJITSU_PI2515), 8780 SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1130, "Fujitsu AMILO Xa35xx", 8781 ALC888_FUJITSU_XA3530), 8782 SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo 101e", ALC883_LENOVO_101E_2ch), 8783 SND_PCI_QUIRK(0x17aa, 0x2085, "Lenovo NB0763", ALC883_LENOVO_NB0763), 8784 SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763), 8785 SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763), 8786 SND_PCI_QUIRK(0x17aa, 0x101d, "Lenovo Sky", ALC888_LENOVO_SKY), 8787 SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2), 8788 SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG), 8789 SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG), 8790 SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66), 8791 8792 SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL), 8793 SND_PCI_QUIRK(0x8086, 0x0002, "DG33FBC", ALC883_3ST_6ch_INTEL), 8794 SND_PCI_QUIRK(0x8086, 0x2503, "82801H", ALC883_MITAC), 8795 SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_INTEL), 8796 SND_PCI_QUIRK(0x8086, 0x0021, "Intel IbexPeak", ALC889A_INTEL), 8797 SND_PCI_QUIRK(0x8086, 0x3b56, "Intel IbexPeak", ALC889A_INTEL), 8798 SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC883_3ST_6ch), 8799 6830 8800 {0} 8801 }; 8802 8803 /* codec SSID table for Intel Mac */ 8804 static struct snd_pci_quirk alc882_ssid_cfg_tbl[] = { 8805 SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC885_MBP3), 8806 SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC885_MBP3), 8807 SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC885_MBP3), 8808 SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC885_MACPRO), 8809 SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_IMAC24), 8810 SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_IMAC24), 8811 SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC885_MBP3), 8812 SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889A_MB31), 8813 SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC885_MBP3), 8814 SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_IMAC24), 8815 SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC885_MB5), 8816 /* FIXME: HP jack sense seems not working for MBP 5,1, so apparently 8817 * no perfect solution yet 8818 */ 8819 SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC885_MB5), 8820 {0} /* terminator */ 6831 8821 }; 6832 8822 … … 6834 8824 [ALC882_3ST_DIG] = { 6835 8825 .mixers = { alc882_base_mixer }, 6836 .init_verbs = { alc882_init_verbs }, 8826 .init_verbs = { alc882_base_init_verbs, 8827 alc882_adc1_init_verbs }, 6837 8828 .num_dacs = ARRAY_SIZE(alc882_dac_nids), 6838 8829 .dac_nids = alc882_dac_nids, … … 6846 8837 [ALC882_6ST_DIG] = { 6847 8838 .mixers = { alc882_base_mixer, alc882_chmode_mixer }, 6848 .init_verbs = { alc882_init_verbs }, 8839 .init_verbs = { alc882_base_init_verbs, 8840 alc882_adc1_init_verbs }, 6849 8841 .num_dacs = ARRAY_SIZE(alc882_dac_nids), 6850 8842 .dac_nids = alc882_dac_nids, … … 6857 8849 [ALC882_ARIMA] = { 6858 8850 .mixers = { alc882_base_mixer, alc882_chmode_mixer }, 6859 .init_verbs = { alc882_init_verbs, alc882_eapd_verbs }, 8851 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs, 8852 alc882_eapd_verbs }, 6860 8853 .num_dacs = ARRAY_SIZE(alc882_dac_nids), 6861 8854 .dac_nids = alc882_dac_nids, … … 6866 8859 [ALC882_W2JC] = { 6867 8860 .mixers = { alc882_w2jc_mixer, alc882_chmode_mixer }, 6868 .init_verbs = { alc882_ init_verbs, alc882_eapd_verbs,6869 alc88 0_gpio1_init_verbs },8861 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs, 8862 alc882_eapd_verbs, alc880_gpio1_init_verbs }, 6870 8863 .num_dacs = ARRAY_SIZE(alc882_dac_nids), 6871 8864 .dac_nids = alc882_dac_nids, … … 6887 8880 .dig_out_nid = ALC882_DIGOUT_NID, 6888 8881 .dig_in_nid = ALC882_DIGIN_NID, 6889 .unsol_event = alc885_mbp3_unsol_event, 6890 .init_hook = alc885_mbp3_automute, 8882 .unsol_event = alc_automute_amp_unsol_event, 8883 .setup = alc885_mbp3_setup, 8884 .init_hook = alc_automute_amp, 8885 }, 8886 [ALC885_MB5] = { 8887 .mixers = { alc885_mb5_mixer, alc882_chmode_mixer }, 8888 .init_verbs = { alc885_mb5_init_verbs, 8889 alc880_gpio1_init_verbs }, 8890 .num_dacs = ARRAY_SIZE(alc882_dac_nids), 8891 .dac_nids = alc882_dac_nids, 8892 .channel_mode = alc885_mb5_6ch_modes, 8893 .num_channel_mode = ARRAY_SIZE(alc885_mb5_6ch_modes), 8894 .input_mux = &mb5_capture_source, 8895 .dig_out_nid = ALC882_DIGOUT_NID, 8896 .dig_in_nid = ALC882_DIGIN_NID, 6891 8897 }, 6892 8898 [ALC885_MACPRO] = { … … 6912 8918 .channel_mode = alc882_ch_modes, 6913 8919 .input_mux = &alc882_capture_source, 6914 .unsol_event = alc885_imac24_unsol_event, 8920 .unsol_event = alc_automute_amp_unsol_event, 8921 .setup = alc885_imac24_setup, 6915 8922 .init_hook = alc885_imac24_init_hook, 6916 8923 }, 6917 8924 [ALC882_TARGA] = { 6918 8925 .mixers = { alc882_targa_mixer, alc882_chmode_mixer }, 6919 .init_verbs = { alc882_init_verbs, alc882_targa_verbs}, 8926 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs, 8927 alc880_gpio3_init_verbs, alc882_targa_verbs}, 6920 8928 .num_dacs = ARRAY_SIZE(alc882_dac_nids), 6921 8929 .dac_nids = alc882_dac_nids, … … 6929 8937 .input_mux = &alc882_capture_source, 6930 8938 .unsol_event = alc882_targa_unsol_event, 8939 .setup = alc882_targa_setup, 6931 8940 .init_hook = alc882_targa_automute, 6932 8941 }, 6933 8942 [ALC882_ASUS_A7J] = { 6934 8943 .mixers = { alc882_asus_a7j_mixer, alc882_chmode_mixer }, 6935 .init_verbs = { alc882_init_verbs, alc882_asus_a7j_verbs}, 8944 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs, 8945 alc882_asus_a7j_verbs}, 6936 8946 .num_dacs = ARRAY_SIZE(alc882_dac_nids), 6937 8947 .dac_nids = alc882_dac_nids, … … 6947 8957 [ALC882_ASUS_A7M] = { 6948 8958 .mixers = { alc882_asus_a7m_mixer, alc882_chmode_mixer }, 6949 .init_verbs = { alc882_ init_verbs, alc882_eapd_verbs,6950 alc88 0_gpio1_init_verbs,8959 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs, 8960 alc882_eapd_verbs, alc880_gpio1_init_verbs, 6951 8961 alc882_asus_a7m_verbs }, 6952 8962 .num_dacs = ARRAY_SIZE(alc882_dac_nids), … … 6958 8968 .input_mux = &alc882_capture_source, 6959 8969 }, 8970 [ALC883_3ST_2ch_DIG] = { 8971 .mixers = { alc883_3ST_2ch_mixer }, 8972 .init_verbs = { alc883_init_verbs }, 8973 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 8974 .dac_nids = alc883_dac_nids, 8975 .dig_out_nid = ALC883_DIGOUT_NID, 8976 .dig_in_nid = ALC883_DIGIN_NID, 8977 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 8978 .channel_mode = alc883_3ST_2ch_modes, 8979 .input_mux = &alc883_capture_source, 8980 }, 8981 [ALC883_3ST_6ch_DIG] = { 8982 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer }, 8983 .init_verbs = { alc883_init_verbs }, 8984 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 8985 .dac_nids = alc883_dac_nids, 8986 .dig_out_nid = ALC883_DIGOUT_NID, 8987 .dig_in_nid = ALC883_DIGIN_NID, 8988 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), 8989 .channel_mode = alc883_3ST_6ch_modes, 8990 .need_dac_fix = 1, 8991 .input_mux = &alc883_capture_source, 8992 }, 8993 [ALC883_3ST_6ch] = { 8994 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer }, 8995 .init_verbs = { alc883_init_verbs }, 8996 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 8997 .dac_nids = alc883_dac_nids, 8998 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), 8999 .channel_mode = alc883_3ST_6ch_modes, 9000 .need_dac_fix = 1, 9001 .input_mux = &alc883_capture_source, 9002 }, 9003 [ALC883_3ST_6ch_INTEL] = { 9004 .mixers = { alc883_3ST_6ch_intel_mixer, alc883_chmode_mixer }, 9005 .init_verbs = { alc883_init_verbs }, 9006 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9007 .dac_nids = alc883_dac_nids, 9008 .dig_out_nid = ALC883_DIGOUT_NID, 9009 .dig_in_nid = ALC883_DIGIN_NID, 9010 .slave_dig_outs = alc883_slave_dig_outs, 9011 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_intel_modes), 9012 .channel_mode = alc883_3ST_6ch_intel_modes, 9013 .need_dac_fix = 1, 9014 .input_mux = &alc883_3stack_6ch_intel, 9015 }, 9016 [ALC889A_INTEL] = { 9017 .mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer }, 9018 .init_verbs = { alc885_init_verbs, alc885_init_input_verbs, 9019 alc_hp15_unsol_verbs }, 9020 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9021 .dac_nids = alc883_dac_nids, 9022 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids), 9023 .adc_nids = alc889_adc_nids, 9024 .dig_out_nid = ALC883_DIGOUT_NID, 9025 .dig_in_nid = ALC883_DIGIN_NID, 9026 .slave_dig_outs = alc883_slave_dig_outs, 9027 .num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes), 9028 .channel_mode = alc889_8ch_intel_modes, 9029 .capsrc_nids = alc889_capsrc_nids, 9030 .input_mux = &alc889_capture_source, 9031 .setup = alc889_automute_setup, 9032 .init_hook = alc_automute_amp, 9033 .unsol_event = alc_automute_amp_unsol_event, 9034 .need_dac_fix = 1, 9035 }, 9036 [ALC889_INTEL] = { 9037 .mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer }, 9038 .init_verbs = { alc885_init_verbs, alc889_init_input_verbs, 9039 alc889_eapd_verbs, alc_hp15_unsol_verbs}, 9040 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9041 .dac_nids = alc883_dac_nids, 9042 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids), 9043 .adc_nids = alc889_adc_nids, 9044 .dig_out_nid = ALC883_DIGOUT_NID, 9045 .dig_in_nid = ALC883_DIGIN_NID, 9046 .slave_dig_outs = alc883_slave_dig_outs, 9047 .num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes), 9048 .channel_mode = alc889_8ch_intel_modes, 9049 .capsrc_nids = alc889_capsrc_nids, 9050 .input_mux = &alc889_capture_source, 9051 .setup = alc889_automute_setup, 9052 .init_hook = alc889_intel_init_hook, 9053 .unsol_event = alc_automute_amp_unsol_event, 9054 .need_dac_fix = 1, 9055 }, 9056 [ALC883_6ST_DIG] = { 9057 .mixers = { alc883_base_mixer, alc883_chmode_mixer }, 9058 .init_verbs = { alc883_init_verbs }, 9059 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9060 .dac_nids = alc883_dac_nids, 9061 .dig_out_nid = ALC883_DIGOUT_NID, 9062 .dig_in_nid = ALC883_DIGIN_NID, 9063 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes), 9064 .channel_mode = alc883_sixstack_modes, 9065 .input_mux = &alc883_capture_source, 9066 }, 9067 [ALC883_TARGA_DIG] = { 9068 .mixers = { alc883_targa_mixer, alc883_chmode_mixer }, 9069 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs, 9070 alc883_targa_verbs}, 9071 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9072 .dac_nids = alc883_dac_nids, 9073 .dig_out_nid = ALC883_DIGOUT_NID, 9074 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), 9075 .channel_mode = alc883_3ST_6ch_modes, 9076 .need_dac_fix = 1, 9077 .input_mux = &alc883_capture_source, 9078 .unsol_event = alc883_targa_unsol_event, 9079 .setup = alc882_targa_setup, 9080 .init_hook = alc882_targa_automute, 9081 }, 9082 [ALC883_TARGA_2ch_DIG] = { 9083 .mixers = { alc883_targa_2ch_mixer}, 9084 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs, 9085 alc883_targa_verbs}, 9086 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9087 .dac_nids = alc883_dac_nids, 9088 .adc_nids = alc883_adc_nids_alt, 9089 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt), 9090 .dig_out_nid = ALC883_DIGOUT_NID, 9091 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 9092 .channel_mode = alc883_3ST_2ch_modes, 9093 .input_mux = &alc883_capture_source, 9094 .unsol_event = alc883_targa_unsol_event, 9095 .setup = alc882_targa_setup, 9096 .init_hook = alc882_targa_automute, 9097 }, 9098 [ALC883_TARGA_8ch_DIG] = { 9099 .mixers = { alc883_base_mixer, alc883_chmode_mixer }, 9100 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs, 9101 alc883_targa_verbs }, 9102 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9103 .dac_nids = alc883_dac_nids, 9104 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev), 9105 .adc_nids = alc883_adc_nids_rev, 9106 .capsrc_nids = alc883_capsrc_nids_rev, 9107 .dig_out_nid = ALC883_DIGOUT_NID, 9108 .dig_in_nid = ALC883_DIGIN_NID, 9109 .num_channel_mode = ARRAY_SIZE(alc883_4ST_8ch_modes), 9110 .channel_mode = alc883_4ST_8ch_modes, 9111 .need_dac_fix = 1, 9112 .input_mux = &alc883_capture_source, 9113 .unsol_event = alc883_targa_unsol_event, 9114 .setup = alc882_targa_setup, 9115 .init_hook = alc882_targa_automute, 9116 }, 9117 [ALC883_ACER] = { 9118 .mixers = { alc883_base_mixer }, 9119 /* On TravelMate laptops, GPIO 0 enables the internal speaker 9120 * and the headphone jack. Turn this on and rely on the 9121 * standard mute methods whenever the user wants to turn 9122 * these outputs off. 9123 */ 9124 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs }, 9125 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9126 .dac_nids = alc883_dac_nids, 9127 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 9128 .channel_mode = alc883_3ST_2ch_modes, 9129 .input_mux = &alc883_capture_source, 9130 }, 9131 [ALC883_ACER_ASPIRE] = { 9132 .mixers = { alc883_acer_aspire_mixer }, 9133 .init_verbs = { alc883_init_verbs, alc883_acer_eapd_verbs }, 9134 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9135 .dac_nids = alc883_dac_nids, 9136 .dig_out_nid = ALC883_DIGOUT_NID, 9137 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 9138 .channel_mode = alc883_3ST_2ch_modes, 9139 .input_mux = &alc883_capture_source, 9140 .unsol_event = alc_automute_amp_unsol_event, 9141 .setup = alc883_acer_aspire_setup, 9142 .init_hook = alc_automute_amp, 9143 }, 9144 [ALC888_ACER_ASPIRE_4930G] = { 9145 .mixers = { alc888_base_mixer, 9146 alc883_chmode_mixer }, 9147 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs, 9148 alc888_acer_aspire_4930g_verbs }, 9149 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9150 .dac_nids = alc883_dac_nids, 9151 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev), 9152 .adc_nids = alc883_adc_nids_rev, 9153 .capsrc_nids = alc883_capsrc_nids_rev, 9154 .dig_out_nid = ALC883_DIGOUT_NID, 9155 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), 9156 .channel_mode = alc883_3ST_6ch_modes, 9157 .need_dac_fix = 1, 9158 .num_mux_defs = 9159 ARRAY_SIZE(alc888_2_capture_sources), 9160 .input_mux = alc888_2_capture_sources, 9161 .unsol_event = alc_automute_amp_unsol_event, 9162 .setup = alc888_acer_aspire_4930g_setup, 9163 .init_hook = alc_automute_amp, 9164 }, 9165 [ALC888_ACER_ASPIRE_6530G] = { 9166 .mixers = { alc888_acer_aspire_6530_mixer }, 9167 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs, 9168 alc888_acer_aspire_6530g_verbs }, 9169 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9170 .dac_nids = alc883_dac_nids, 9171 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev), 9172 .adc_nids = alc883_adc_nids_rev, 9173 .capsrc_nids = alc883_capsrc_nids_rev, 9174 .dig_out_nid = ALC883_DIGOUT_NID, 9175 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 9176 .channel_mode = alc883_3ST_2ch_modes, 9177 .num_mux_defs = 9178 ARRAY_SIZE(alc888_2_capture_sources), 9179 .input_mux = alc888_acer_aspire_6530_sources, 9180 .unsol_event = alc_automute_amp_unsol_event, 9181 .setup = alc888_acer_aspire_6530g_setup, 9182 .init_hook = alc_automute_amp, 9183 }, 9184 [ALC888_ACER_ASPIRE_8930G] = { 9185 .mixers = { alc888_base_mixer, 9186 alc883_chmode_mixer }, 9187 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs, 9188 alc889_acer_aspire_8930g_verbs }, 9189 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9190 .dac_nids = alc883_dac_nids, 9191 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids), 9192 .adc_nids = alc889_adc_nids, 9193 .capsrc_nids = alc889_capsrc_nids, 9194 .dig_out_nid = ALC883_DIGOUT_NID, 9195 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), 9196 .channel_mode = alc883_3ST_6ch_modes, 9197 .need_dac_fix = 1, 9198 .const_channel_count = 6, 9199 .num_mux_defs = 9200 ARRAY_SIZE(alc889_capture_sources), 9201 .input_mux = alc889_capture_sources, 9202 .unsol_event = alc_automute_amp_unsol_event, 9203 .setup = alc889_acer_aspire_8930g_setup, 9204 .init_hook = alc_automute_amp, 9205 }, 9206 [ALC888_ACER_ASPIRE_7730G] = { 9207 .mixers = { alc883_3ST_6ch_mixer, 9208 alc883_chmode_mixer }, 9209 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs, 9210 alc888_acer_aspire_7730G_verbs }, 9211 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9212 .dac_nids = alc883_dac_nids, 9213 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev), 9214 .adc_nids = alc883_adc_nids_rev, 9215 .capsrc_nids = alc883_capsrc_nids_rev, 9216 .dig_out_nid = ALC883_DIGOUT_NID, 9217 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), 9218 .channel_mode = alc883_3ST_6ch_modes, 9219 .need_dac_fix = 1, 9220 .const_channel_count = 6, 9221 .input_mux = &alc883_capture_source, 9222 .unsol_event = alc_automute_amp_unsol_event, 9223 .setup = alc888_acer_aspire_6530g_setup, 9224 .init_hook = alc_automute_amp, 9225 }, 9226 [ALC883_MEDION] = { 9227 .mixers = { alc883_fivestack_mixer, 9228 alc883_chmode_mixer }, 9229 .init_verbs = { alc883_init_verbs, 9230 alc883_medion_eapd_verbs }, 9231 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9232 .dac_nids = alc883_dac_nids, 9233 .adc_nids = alc883_adc_nids_alt, 9234 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt), 9235 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes), 9236 .channel_mode = alc883_sixstack_modes, 9237 .input_mux = &alc883_capture_source, 9238 }, 9239 [ALC883_MEDION_MD2] = { 9240 .mixers = { alc883_medion_md2_mixer}, 9241 .init_verbs = { alc883_init_verbs, alc883_medion_md2_verbs}, 9242 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9243 .dac_nids = alc883_dac_nids, 9244 .dig_out_nid = ALC883_DIGOUT_NID, 9245 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 9246 .channel_mode = alc883_3ST_2ch_modes, 9247 .input_mux = &alc883_capture_source, 9248 .unsol_event = alc_automute_amp_unsol_event, 9249 .setup = alc883_medion_md2_setup, 9250 .init_hook = alc_automute_amp, 9251 }, 9252 [ALC883_LAPTOP_EAPD] = { 9253 .mixers = { alc883_base_mixer }, 9254 .init_verbs = { alc883_init_verbs, alc882_eapd_verbs }, 9255 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9256 .dac_nids = alc883_dac_nids, 9257 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 9258 .channel_mode = alc883_3ST_2ch_modes, 9259 .input_mux = &alc883_capture_source, 9260 }, 9261 [ALC883_CLEVO_M720] = { 9262 .mixers = { alc883_clevo_m720_mixer }, 9263 .init_verbs = { alc883_init_verbs, alc883_clevo_m720_verbs }, 9264 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9265 .dac_nids = alc883_dac_nids, 9266 .dig_out_nid = ALC883_DIGOUT_NID, 9267 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 9268 .channel_mode = alc883_3ST_2ch_modes, 9269 .input_mux = &alc883_capture_source, 9270 .unsol_event = alc883_clevo_m720_unsol_event, 9271 .setup = alc883_clevo_m720_setup, 9272 .init_hook = alc883_clevo_m720_init_hook, 9273 }, 9274 [ALC883_LENOVO_101E_2ch] = { 9275 .mixers = { alc883_lenovo_101e_2ch_mixer}, 9276 .init_verbs = { alc883_init_verbs, alc883_lenovo_101e_verbs}, 9277 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9278 .dac_nids = alc883_dac_nids, 9279 .adc_nids = alc883_adc_nids_alt, 9280 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt), 9281 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 9282 .channel_mode = alc883_3ST_2ch_modes, 9283 .input_mux = &alc883_lenovo_101e_capture_source, 9284 .unsol_event = alc883_lenovo_101e_unsol_event, 9285 .init_hook = alc883_lenovo_101e_all_automute, 9286 }, 9287 [ALC883_LENOVO_NB0763] = { 9288 .mixers = { alc883_lenovo_nb0763_mixer }, 9289 .init_verbs = { alc883_init_verbs, alc883_lenovo_nb0763_verbs}, 9290 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9291 .dac_nids = alc883_dac_nids, 9292 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 9293 .channel_mode = alc883_3ST_2ch_modes, 9294 .need_dac_fix = 1, 9295 .input_mux = &alc883_lenovo_nb0763_capture_source, 9296 .unsol_event = alc_automute_amp_unsol_event, 9297 .setup = alc883_medion_md2_setup, 9298 .init_hook = alc_automute_amp, 9299 }, 9300 [ALC888_LENOVO_MS7195_DIG] = { 9301 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer }, 9302 .init_verbs = { alc883_init_verbs, alc888_lenovo_ms7195_verbs}, 9303 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9304 .dac_nids = alc883_dac_nids, 9305 .dig_out_nid = ALC883_DIGOUT_NID, 9306 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), 9307 .channel_mode = alc883_3ST_6ch_modes, 9308 .need_dac_fix = 1, 9309 .input_mux = &alc883_capture_source, 9310 .unsol_event = alc883_lenovo_ms7195_unsol_event, 9311 .init_hook = alc888_lenovo_ms7195_front_automute, 9312 }, 9313 [ALC883_HAIER_W66] = { 9314 .mixers = { alc883_targa_2ch_mixer}, 9315 .init_verbs = { alc883_init_verbs, alc883_haier_w66_verbs}, 9316 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9317 .dac_nids = alc883_dac_nids, 9318 .dig_out_nid = ALC883_DIGOUT_NID, 9319 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 9320 .channel_mode = alc883_3ST_2ch_modes, 9321 .input_mux = &alc883_capture_source, 9322 .unsol_event = alc_automute_amp_unsol_event, 9323 .setup = alc883_haier_w66_setup, 9324 .init_hook = alc_automute_amp, 9325 }, 9326 [ALC888_3ST_HP] = { 9327 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer }, 9328 .init_verbs = { alc883_init_verbs, alc888_3st_hp_verbs }, 9329 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9330 .dac_nids = alc883_dac_nids, 9331 .num_channel_mode = ARRAY_SIZE(alc888_3st_hp_modes), 9332 .channel_mode = alc888_3st_hp_modes, 9333 .need_dac_fix = 1, 9334 .input_mux = &alc883_capture_source, 9335 .unsol_event = alc_automute_amp_unsol_event, 9336 .setup = alc888_3st_hp_setup, 9337 .init_hook = alc_automute_amp, 9338 }, 9339 [ALC888_6ST_DELL] = { 9340 .mixers = { alc883_base_mixer, alc883_chmode_mixer }, 9341 .init_verbs = { alc883_init_verbs, alc888_6st_dell_verbs }, 9342 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9343 .dac_nids = alc883_dac_nids, 9344 .dig_out_nid = ALC883_DIGOUT_NID, 9345 .dig_in_nid = ALC883_DIGIN_NID, 9346 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes), 9347 .channel_mode = alc883_sixstack_modes, 9348 .input_mux = &alc883_capture_source, 9349 .unsol_event = alc_automute_amp_unsol_event, 9350 .setup = alc888_6st_dell_setup, 9351 .init_hook = alc_automute_amp, 9352 }, 9353 [ALC883_MITAC] = { 9354 .mixers = { alc883_mitac_mixer }, 9355 .init_verbs = { alc883_init_verbs, alc883_mitac_verbs }, 9356 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9357 .dac_nids = alc883_dac_nids, 9358 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 9359 .channel_mode = alc883_3ST_2ch_modes, 9360 .input_mux = &alc883_capture_source, 9361 .unsol_event = alc_automute_amp_unsol_event, 9362 .setup = alc883_mitac_setup, 9363 .init_hook = alc_automute_amp, 9364 }, 9365 [ALC883_FUJITSU_PI2515] = { 9366 .mixers = { alc883_2ch_fujitsu_pi2515_mixer }, 9367 .init_verbs = { alc883_init_verbs, 9368 alc883_2ch_fujitsu_pi2515_verbs}, 9369 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9370 .dac_nids = alc883_dac_nids, 9371 .dig_out_nid = ALC883_DIGOUT_NID, 9372 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 9373 .channel_mode = alc883_3ST_2ch_modes, 9374 .input_mux = &alc883_fujitsu_pi2515_capture_source, 9375 .unsol_event = alc_automute_amp_unsol_event, 9376 .setup = alc883_2ch_fujitsu_pi2515_setup, 9377 .init_hook = alc_automute_amp, 9378 }, 9379 [ALC888_FUJITSU_XA3530] = { 9380 .mixers = { alc888_base_mixer, alc883_chmode_mixer }, 9381 .init_verbs = { alc883_init_verbs, 9382 alc888_fujitsu_xa3530_verbs }, 9383 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9384 .dac_nids = alc883_dac_nids, 9385 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev), 9386 .adc_nids = alc883_adc_nids_rev, 9387 .capsrc_nids = alc883_capsrc_nids_rev, 9388 .dig_out_nid = ALC883_DIGOUT_NID, 9389 .num_channel_mode = ARRAY_SIZE(alc888_4ST_8ch_intel_modes), 9390 .channel_mode = alc888_4ST_8ch_intel_modes, 9391 .num_mux_defs = 9392 ARRAY_SIZE(alc888_2_capture_sources), 9393 .input_mux = alc888_2_capture_sources, 9394 .unsol_event = alc_automute_amp_unsol_event, 9395 .setup = alc888_fujitsu_xa3530_setup, 9396 .init_hook = alc_automute_amp, 9397 }, 9398 [ALC888_LENOVO_SKY] = { 9399 .mixers = { alc888_lenovo_sky_mixer, alc883_chmode_mixer }, 9400 .init_verbs = { alc883_init_verbs, alc888_lenovo_sky_verbs}, 9401 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9402 .dac_nids = alc883_dac_nids, 9403 .dig_out_nid = ALC883_DIGOUT_NID, 9404 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes), 9405 .channel_mode = alc883_sixstack_modes, 9406 .need_dac_fix = 1, 9407 .input_mux = &alc883_lenovo_sky_capture_source, 9408 .unsol_event = alc_automute_amp_unsol_event, 9409 .setup = alc888_lenovo_sky_setup, 9410 .init_hook = alc_automute_amp, 9411 }, 9412 [ALC888_ASUS_M90V] = { 9413 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer }, 9414 .init_verbs = { alc883_init_verbs, alc888_asus_m90v_verbs }, 9415 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9416 .dac_nids = alc883_dac_nids, 9417 .dig_out_nid = ALC883_DIGOUT_NID, 9418 .dig_in_nid = ALC883_DIGIN_NID, 9419 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes), 9420 .channel_mode = alc883_3ST_6ch_modes, 9421 .need_dac_fix = 1, 9422 .input_mux = &alc883_fujitsu_pi2515_capture_source, 9423 .unsol_event = alc_sku_unsol_event, 9424 .setup = alc883_mode2_setup, 9425 .init_hook = alc_inithook, 9426 }, 9427 [ALC888_ASUS_EEE1601] = { 9428 .mixers = { alc883_asus_eee1601_mixer }, 9429 .cap_mixer = alc883_asus_eee1601_cap_mixer, 9430 .init_verbs = { alc883_init_verbs, alc888_asus_eee1601_verbs }, 9431 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9432 .dac_nids = alc883_dac_nids, 9433 .dig_out_nid = ALC883_DIGOUT_NID, 9434 .dig_in_nid = ALC883_DIGIN_NID, 9435 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 9436 .channel_mode = alc883_3ST_2ch_modes, 9437 .need_dac_fix = 1, 9438 .input_mux = &alc883_asus_eee1601_capture_source, 9439 .unsol_event = alc_sku_unsol_event, 9440 .init_hook = alc883_eee1601_inithook, 9441 }, 9442 [ALC1200_ASUS_P5Q] = { 9443 .mixers = { alc883_base_mixer, alc883_chmode_mixer }, 9444 .init_verbs = { alc883_init_verbs }, 9445 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9446 .dac_nids = alc883_dac_nids, 9447 .dig_out_nid = ALC1200_DIGOUT_NID, 9448 .dig_in_nid = ALC883_DIGIN_NID, 9449 .slave_dig_outs = alc1200_slave_dig_outs, 9450 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes), 9451 .channel_mode = alc883_sixstack_modes, 9452 .input_mux = &alc883_capture_source, 9453 }, 9454 [ALC889A_MB31] = { 9455 .mixers = { alc889A_mb31_mixer, alc883_chmode_mixer}, 9456 .init_verbs = { alc883_init_verbs, alc889A_mb31_verbs, 9457 alc880_gpio1_init_verbs }, 9458 .adc_nids = alc883_adc_nids, 9459 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids), 9460 .dac_nids = alc883_dac_nids, 9461 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9462 .channel_mode = alc889A_mb31_6ch_modes, 9463 .num_channel_mode = ARRAY_SIZE(alc889A_mb31_6ch_modes), 9464 .input_mux = &alc889A_mb31_capture_source, 9465 .dig_out_nid = ALC883_DIGOUT_NID, 9466 .unsol_event = alc889A_mb31_unsol_event, 9467 .init_hook = alc889A_mb31_automute, 9468 }, 9469 [ALC883_SONY_VAIO_TT] = { 9470 .mixers = { alc883_vaiott_mixer }, 9471 .init_verbs = { alc883_init_verbs, alc883_vaiott_verbs }, 9472 .num_dacs = ARRAY_SIZE(alc883_dac_nids), 9473 .dac_nids = alc883_dac_nids, 9474 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), 9475 .channel_mode = alc883_3ST_2ch_modes, 9476 .input_mux = &alc883_capture_source, 9477 .unsol_event = alc_automute_amp_unsol_event, 9478 .setup = alc883_vaiott_setup, 9479 .init_hook = alc_automute_amp, 9480 }, 6960 9481 }; 6961 9482 … … 6987 9508 * BIOS auto configuration 6988 9509 */ 9510 static int alc882_auto_create_input_ctls(struct hda_codec *codec, 9511 const struct auto_pin_cfg *cfg) 9512 { 9513 return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x23, 0x22); 9514 } 9515 6989 9516 static void alc882_auto_set_output_and_unmute(struct hda_codec *codec, 6990 9517 hda_nid_t nid, int pin_type, … … 7009 9536 int i; 7010 9537 7011 alc_subsystem_id(codec, 0x15, 0x1b, 0x14);7012 9538 for (i = 0; i <= HDA_SIDE; i++) { 7013 9539 hda_nid_t nid = spec->autocfg.line_out_pins[i]; … … 7033 9559 } 7034 9560 7035 #define alc882_is_input_pin(nid) alc880_is_input_pin(nid)7036 #define ALC882_PIN_CD_NID ALC880_PIN_CD_NID7037 7038 9561 static void alc882_auto_init_analog_input(struct hda_codec *codec) 7039 9562 { … … 7045 9568 if (!nid) 7046 9569 continue; 7047 alc_set_input_pin(codec, nid, AUTO_PIN_FRONT_MIC /*i*/);9570 alc_set_input_pin(codec, nid, i); 7048 9571 if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP) 7049 9572 snd_hda_codec_write(codec, nid, 0, … … 7131 9654 { 7132 9655 struct alc_spec *spec = codec->spec; 7133 int err = alc880_parse_auto_config(codec); 7134 9656 static hda_nid_t alc882_ignore[] = { 0x1d, 0 }; 9657 int i, err; 9658 9659 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, 9660 alc882_ignore); 7135 9661 if (err < 0) 7136 9662 return err; 7137 else if (!err) 7138 return 0; /* no config found */ 9663 if (!spec->autocfg.line_outs) 9664 return 0; /* can't find valid BIOS pin config */ 9665 9666 err = alc880_auto_fill_dac_nids(spec, &spec->autocfg); 9667 if (err < 0) 9668 return err; 9669 err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg); 9670 if (err < 0) 9671 return err; 9672 err = alc880_auto_create_extra_out(spec, 9673 spec->autocfg.speaker_pins[0], 9674 "Speaker"); 9675 if (err < 0) 9676 return err; 9677 err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0], 9678 "Headphone"); 9679 if (err < 0) 9680 return err; 9681 err = alc882_auto_create_input_ctls(codec, &spec->autocfg); 9682 if (err < 0) 9683 return err; 9684 9685 spec->multiout.max_channels = spec->multiout.num_dacs * 2; 9686 9687 /* check multiple SPDIF-out (for recent codecs) */ 9688 for (i = 0; i < spec->autocfg.dig_outs; i++) { 9689 hda_nid_t dig_nid; 9690 err = snd_hda_get_connections(codec, 9691 spec->autocfg.dig_out_pins[i], 9692 &dig_nid, 1); 9693 if (err < 0) 9694 continue; 9695 if (!i) 9696 spec->multiout.dig_out_nid = dig_nid; 9697 else { 9698 spec->multiout.slave_dig_outs = spec->slave_dig_outs; 9699 spec->slave_dig_outs[i - 1] = dig_nid; 9700 if (i == ARRAY_SIZE(spec->slave_dig_outs) - 1) 9701 break; 9702 } 9703 } 9704 if (spec->autocfg.dig_in_pin) 9705 spec->dig_in_nid = ALC880_DIGIN_NID; 9706 9707 if (spec->kctls.list) 9708 add_mixer(spec, spec->kctls.list); 9709 9710 add_verb(spec, alc883_auto_init_verbs); 9711 /* if ADC 0x07 is available, initialize it, too */ 9712 if (get_wcaps_type(get_wcaps(codec, 0x07)) == AC_WID_AUD_IN) 9713 add_verb(spec, alc882_adc1_init_verbs); 9714 9715 spec->num_mux_defs = 1; 9716 spec->input_mux = &spec->private_imux[0]; 9717 9718 alc_ssid_check(codec, 0x15, 0x1b, 0x14); 7139 9719 7140 9720 err = alc_auto_add_mic_boost(codec); 7141 9721 if (err < 0) 7142 9722 return err; 7143 7144 /* hack - override the init verbs */7145 spec->init_verbs[0] = alc882_auto_init_verbs;7146 9723 7147 9724 return 1; /* config found */ … … 7160 9737 } 7161 9738 7162 static int patch_alc883(struct hda_codec *codec); /* called in patch_alc882() */7163 7164 9739 static int patch_alc882(struct hda_codec *codec) 7165 9740 { … … 7173 9748 codec->spec = spec; 7174 9749 9750 switch (codec->vendor_id) { 9751 case 0x10ec0882: 9752 case 0x10ec0885: 9753 break; 9754 default: 9755 /* ALC883 and variants */ 9756 alc_fix_pll_init(codec, 0x20, 0x0a, 10); 9757 break; 9758 } 9759 7175 9760 board_config = snd_hda_check_board_config(codec, ALC882_MODEL_LAST, 7176 9761 alc882_models, 7177 9762 alc882_cfg_tbl); 7178 9763 9764 if (board_config < 0 || board_config >= ALC882_MODEL_LAST) 9765 board_config = snd_hda_check_board_codec_sid_config(codec, 9766 ALC882_MODEL_LAST, alc882_models, alc882_ssid_cfg_tbl); 9767 7179 9768 if (board_config < 0 || board_config >= ALC882_MODEL_LAST) { 7180 /* Pick up systems that don't supply PCI SSID */ 7181 switch (codec->subsystem_id) { 7182 case 0x106b0c00: /* Mac Pro */ 7183 board_config = ALC885_MACPRO; 7184 break; 7185 case 0x106b1000: /* iMac 24 */ 7186 case 0x106b2800: /* AppleTV */ 7187 case 0x106b3e00: /* iMac 24 Aluminium */ 7188 board_config = ALC885_IMAC24; 7189 break; 7190 case 0x106b00a0: /* MacBookPro3,1 - Another revision */ 7191 case 0x106b00a1: /* Macbook (might be wrong - PCI SSID?) */ 7192 case 0x106b00a4: /* MacbookPro4,1 */ 7193 case 0x106b2c00: /* Macbook Pro rev3 */ 7194 case 0x106b3600: /* Macbook 3.1 */ 7195 case 0x106b3800: /* MacbookPro4,1 - latter revision */ 7196 board_config = ALC885_MBP3; 7197 break; 7198 default: 7199 /* ALC889A is handled better as ALC888-compatible */ 7200 if (codec->revision_id == 0x100101 || 7201 codec->revision_id == 0x100103) { 7202 alc_free(codec); 7203 return patch_alc883(codec); 7204 } 7205 printk(KERN_INFO "hda_codec: Unknown model for ALC882, " 7206 "trying auto-probe from BIOS...\n"); 7207 board_config = ALC882_AUTO; 7208 } 9769 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", 9770 codec->chip_name); 9771 board_config = ALC882_AUTO; 7209 9772 } 7210 9773 … … 7232 9795 7233 9796 if (board_config != ALC882_AUTO) 7234 setup_preset(spec, &alc882_presets[board_config]); 7235 7236 if (codec->vendor_id == 0x10ec0885) { 7237 spec->stream_name_analog = "ALC885 Analog"; 7238 spec->stream_name_digital = "ALC885 Digital"; 7239 } else { 7240 spec->stream_name_analog = "ALC882 Analog"; 7241 spec->stream_name_digital = "ALC882 Digital"; 7242 } 9797 setup_preset(codec, &alc882_presets[board_config]); 7243 9798 7244 9799 spec->stream_analog_playback = &alc882_pcm_analog_playback; … … 7251 9806 spec->stream_digital_capture = &alc882_pcm_digital_capture; 7252 9807 7253 spec->capture_style = CAPT_MIX; /* matrix-style capture */ 9808 if (codec->vendor_id == 0x10ec0888) 9809 spec->init_amp = ALC_INIT_DEFAULT; /* always initialize */ 9810 7254 9811 if (!spec->adc_nids && spec->input_mux) { 7255 /* check whether NID 0x07 is valid */ 7256 unsigned int wcap = get_wcaps(codec, 0x07); 7257 /* get type */ 7258 wcap = (wcap & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT; 7259 if (wcap != AC_WID_AUD_IN) { 7260 spec->adc_nids = alc882_adc_nids_alt; 7261 spec->num_adc_nids = ARRAY_SIZE(alc882_adc_nids_alt); 7262 spec->capsrc_nids = alc882_capsrc_nids_alt; 7263 } else { 7264 spec->adc_nids = alc882_adc_nids; 7265 spec->num_adc_nids = ARRAY_SIZE(alc882_adc_nids); 7266 spec->capsrc_nids = alc882_capsrc_nids; 9812 int i; 9813 spec->num_adc_nids = 0; 9814 for (i = 0; i < ARRAY_SIZE(alc882_adc_nids); i++) { 9815 hda_nid_t cap; 9816 hda_nid_t nid = alc882_adc_nids[i]; 9817 unsigned int wcap = get_wcaps(codec, nid); 9818 /* get type */ 9819 wcap = get_wcaps_type(wcap); 9820 if (wcap != AC_WID_AUD_IN) 9821 continue; 9822 spec->private_adc_nids[spec->num_adc_nids] = nid; 9823 err = snd_hda_get_connections(codec, nid, &cap, 1); 9824 if (err < 0) 9825 continue; 9826 spec->private_capsrc_nids[spec->num_adc_nids] = cap; 9827 spec->num_adc_nids++; 7267 9828 } 9829 spec->adc_nids = spec->private_adc_nids; 9830 spec->capsrc_nids = spec->private_capsrc_nids; 7268 9831 } 7269 set_capture_mixer(spec); 9832 9833 set_capture_mixer(codec); 7270 9834 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); 7271 9835 … … 7284 9848 } 7285 9849 7286 /*7287 * ALC883 support7288 *7289 * ALC883 is almost identical with ALC880 but has cleaner and more flexible7290 * configuration. Each pin widget can choose any input DACs and a mixer.7291 * Each ADC is connected from a mixer of all inputs. This makes possible7292 * 6-channel independent captures.7293 *7294 * In addition, an independent DAC for the multi-playback (not used in this7295 * driver yet).7296 */7297 #define ALC883_DIGOUT_NID 0x067298 #define ALC883_DIGIN_NID 0x0a7299 7300 #define ALC1200_DIGOUT_NID 0x107301 7302 static hda_nid_t alc883_dac_nids[4] = {7303 /* front, rear, clfe, rear_surr */7304 0x02, 0x03, 0x04, 0x057305 };7306 7307 static hda_nid_t alc883_adc_nids[2] = {7308 /* ADC1-2 */7309 0x08, 0x09,7310 };7311 7312 static hda_nid_t alc883_adc_nids_alt[1] = {7313 /* ADC1 */7314 0x08,7315 };7316 7317 static hda_nid_t alc883_adc_nids_rev[2] = {7318 /* ADC2-1 */7319 0x09, 0x087320 };7321 7322 #define alc889_adc_nids alc880_adc_nids7323 7324 static hda_nid_t alc883_capsrc_nids[2] = { 0x23, 0x22 };7325 7326 static hda_nid_t alc883_capsrc_nids_rev[2] = { 0x22, 0x23 };7327 7328 #define alc889_capsrc_nids alc882_capsrc_nids7329 7330 /* input MUX */7331 /* FIXME: should be a matrix-type input source selection */7332 7333 static struct hda_input_mux alc883_capture_source = {7334 .num_items = 4,7335 .items = {7336 { "Mic", 0x0 },7337 { "Front Mic", 0x1 },7338 { "Line", 0x2 },7339 { "CD", 0x4 },7340 },7341 };7342 7343 static struct hda_input_mux alc883_3stack_6ch_intel = {7344 .num_items = 4,7345 .items = {7346 { "Mic", 0x1 },7347 { "Front Mic", 0x0 },7348 { "Line", 0x2 },7349 { "CD", 0x4 },7350 },7351 };7352 7353 static struct hda_input_mux alc883_lenovo_101e_capture_source = {7354 .num_items = 2,7355 .items = {7356 { "Mic", 0x1 },7357 { "Line", 0x2 },7358 },7359 };7360 7361 static struct hda_input_mux alc883_lenovo_nb0763_capture_source = {7362 .num_items = 4,7363 .items = {7364 { "Mic", 0x0 },7365 { "iMic", 0x1 },7366 { "Line", 0x2 },7367 { "CD", 0x4 },7368 },7369 };7370 7371 static struct hda_input_mux alc883_fujitsu_pi2515_capture_source = {7372 .num_items = 2,7373 .items = {7374 { "Mic", 0x0 },7375 { "Int Mic", 0x1 },7376 },7377 };7378 7379 static struct hda_input_mux alc883_lenovo_sky_capture_source = {7380 .num_items = 3,7381 .items = {7382 { "Mic", 0x0 },7383 { "Front Mic", 0x1 },7384 { "Line", 0x4 },7385 },7386 };7387 7388 static struct hda_input_mux alc883_asus_eee1601_capture_source = {7389 .num_items = 2,7390 .items = {7391 { "Mic", 0x0 },7392 { "Line", 0x2 },7393 },7394 };7395 7396 /*7397 * 2ch mode7398 */7399 static struct hda_channel_mode alc883_3ST_2ch_modes[1] = {7400 { 2, NULL }7401 };7402 7403 /*7404 * 2ch mode7405 */7406 static struct hda_verb alc883_3ST_ch2_init[] = {7407 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },7408 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },7409 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },7410 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },7411 {0} /* end */7412 };7413 7414 /*7415 * 4ch mode7416 */7417 static struct hda_verb alc883_3ST_ch4_init[] = {7418 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },7419 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },7420 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },7421 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },7422 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },7423 {0} /* end */7424 };7425 7426 /*7427 * 6ch mode7428 */7429 static struct hda_verb alc883_3ST_ch6_init[] = {7430 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },7431 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },7432 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },7433 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },7434 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },7435 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },7436 {0} /* end */7437 };7438 7439 static struct hda_channel_mode alc883_3ST_6ch_modes[3] = {7440 { 2, alc883_3ST_ch2_init },7441 { 4, alc883_3ST_ch4_init },7442 { 6, alc883_3ST_ch6_init },7443 };7444 7445 /*7446 * 2ch mode7447 */7448 static struct hda_verb alc883_3ST_ch2_intel_init[] = {7449 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },7450 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },7451 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },7452 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },7453 {0} /* end */7454 };7455 7456 /*7457 * 4ch mode7458 */7459 static struct hda_verb alc883_3ST_ch4_intel_init[] = {7460 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },7461 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },7462 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },7463 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },7464 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },7465 {0} /* end */7466 };7467 7468 /*7469 * 6ch mode7470 */7471 static struct hda_verb alc883_3ST_ch6_intel_init[] = {7472 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },7473 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },7474 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x02 },7475 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },7476 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },7477 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },7478 {0} /* end */7479 };7480 7481 static struct hda_channel_mode alc883_3ST_6ch_intel_modes[3] = {7482 { 2, alc883_3ST_ch2_intel_init },7483 { 4, alc883_3ST_ch4_intel_init },7484 { 6, alc883_3ST_ch6_intel_init },7485 };7486 7487 /*7488 * 6ch mode7489 */7490 static struct hda_verb alc883_sixstack_ch6_init[] = {7491 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },7492 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },7493 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },7494 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },7495 {0} /* end */7496 };7497 7498 /*7499 * 8ch mode7500 */7501 static struct hda_verb alc883_sixstack_ch8_init[] = {7502 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },7503 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },7504 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },7505 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },7506 {0} /* end */7507 };7508 7509 static struct hda_channel_mode alc883_sixstack_modes[2] = {7510 { 6, alc883_sixstack_ch6_init },7511 { 8, alc883_sixstack_ch8_init },7512 };7513 7514 static struct hda_verb alc883_medion_eapd_verbs[] = {7515 /* eanable EAPD on medion laptop */7516 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},7517 {0x20, AC_VERB_SET_PROC_COEF, 0x3070},7518 {0}7519 };7520 7521 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x177522 * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b7523 */7524 7525 static struct snd_kcontrol_new alc883_base_mixer[] = {7526 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),7527 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),7528 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),7529 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),7530 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),7531 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),7532 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),7533 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),7534 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),7535 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),7536 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),7537 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),7538 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),7539 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),7540 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),7541 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),7542 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),7543 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),7544 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),7545 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),7546 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),7547 {0} /* end */7548 };7549 7550 static struct snd_kcontrol_new alc883_mitac_mixer[] = {7551 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),7552 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),7553 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),7554 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),7555 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),7556 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),7557 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),7558 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),7559 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),7560 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),7561 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),7562 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),7563 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),7564 {0} /* end */7565 };7566 7567 static struct snd_kcontrol_new alc883_clevo_m720_mixer[] = {7568 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),7569 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),7570 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),7571 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),7572 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),7573 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),7574 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),7575 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),7576 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),7577 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),7578 {0} /* end */7579 };7580 7581 static struct snd_kcontrol_new alc883_2ch_fujitsu_pi2515_mixer[] = {7582 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),7583 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),7584 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),7585 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),7586 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),7587 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),7588 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),7589 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),7590 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),7591 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),7592 {0} /* end */7593 };7594 7595 static struct snd_kcontrol_new alc883_3ST_2ch_mixer[] = {7596 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),7597 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),7598 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),7599 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),7600 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),7601 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),7602 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),7603 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),7604 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),7605 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),7606 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),7607 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),7608 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),7609 {0} /* end */7610 };7611 7612 static struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = {7613 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),7614 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),7615 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),7616 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),7617 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),7618 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),7619 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),7620 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),7621 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),7622 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),7623 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),7624 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),7625 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),7626 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),7627 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),7628 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),7629 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),7630 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),7631 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),7632 {0} /* end */7633 };7634 7635 static struct snd_kcontrol_new alc883_3ST_6ch_intel_mixer[] = {7636 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),7637 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),7638 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),7639 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),7640 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,7641 HDA_OUTPUT),7642 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),7643 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),7644 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),7645 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),7646 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),7647 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),7648 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),7649 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),7650 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),7651 HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),7652 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),7653 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),7654 HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT),7655 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),7656 {0} /* end */7657 };7658 7659 static struct snd_kcontrol_new alc883_fivestack_mixer[] = {7660 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),7661 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),7662 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),7663 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),7664 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),7665 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),7666 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),7667 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),7668 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),7669 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),7670 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),7671 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),7672 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),7673 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),7674 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),7675 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),7676 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),7677 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),7678 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),7679 {0} /* end */7680 };7681 7682 static struct snd_kcontrol_new alc883_tagra_mixer[] = {7683 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),7684 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),7685 HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),7686 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),7687 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),7688 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),7689 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),7690 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),7691 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),7692 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),7693 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),7694 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),7695 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),7696 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),7697 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),7698 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),7699 {0} /* end */7700 };7701 7702 static struct snd_kcontrol_new alc883_tagra_2ch_mixer[] = {7703 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),7704 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),7705 HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),7706 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),7707 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),7708 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),7709 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),7710 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),7711 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),7712 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),7713 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),7714 {0} /* end */7715 };7716 7717 static struct snd_kcontrol_new alc883_lenovo_101e_2ch_mixer[] = {7718 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),7719 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),7720 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),7721 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),7722 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),7723 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),7724 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),7725 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),7726 {0} /* end */7727 };7728 7729 static struct snd_kcontrol_new alc883_lenovo_nb0763_mixer[] = {7730 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),7731 HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),7732 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),7733 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),7734 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),7735 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),7736 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),7737 HDA_CODEC_VOLUME("iMic Playback Volume", 0x0b, 0x1, HDA_INPUT),7738 HDA_CODEC_MUTE("iMic Playback Switch", 0x0b, 0x1, HDA_INPUT),7739 {0} /* end */7740 };7741 7742 static struct snd_kcontrol_new alc883_medion_md2_mixer[] = {7743 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),7744 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),7745 HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),7746 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),7747 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),7748 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),7749 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),7750 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),7751 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),7752 {0} /* end */7753 };7754 7755 static struct snd_kcontrol_new alc883_acer_aspire_mixer[] = {7756 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),7757 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),7758 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),7759 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),7760 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),7761 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),7762 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),7763 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),7764 {0} /* end */7765 };7766 7767 static struct snd_kcontrol_new alc888_lenovo_sky_mixer[] = {7768 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),7769 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),7770 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0e, 0x0, HDA_OUTPUT),7771 HDA_BIND_MUTE("Surround Playback Switch", 0x0e, 2, HDA_INPUT),7772 HDA_CODEC_VOLUME_MONO("Center Playback Volume",7773 0x0d, 1, 0x0, HDA_OUTPUT),7774 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),7775 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),7776 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),7777 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),7778 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),7779 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),7780 HDA_CODEC_MUTE("iSpeaker Playback Switch", 0x1a, 0x0, HDA_OUTPUT),7781 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),7782 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),7783 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),7784 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),7785 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),7786 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),7787 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),7788 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),7789 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),7790 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),7791 {0} /* end */7792 };7793 7794 static struct hda_bind_ctls alc883_bind_cap_vol = {7795 .ops = &snd_hda_bind_vol,7796 .values = {7797 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),7798 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),7799 07800 },7801 };7802 7803 static struct hda_bind_ctls alc883_bind_cap_switch = {7804 .ops = &snd_hda_bind_sw,7805 .values = {7806 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),7807 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),7808 07809 },7810 };7811 7812 static struct snd_kcontrol_new alc883_asus_eee1601_mixer[] = {7813 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),7814 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),7815 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),7816 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),7817 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),7818 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),7819 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),7820 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),7821 {0} /* end */7822 };7823 7824 static struct snd_kcontrol_new alc883_asus_eee1601_cap_mixer[] = {7825 HDA_BIND_VOL("Capture Volume", &alc883_bind_cap_vol),7826 HDA_BIND_SW("Capture Switch", &alc883_bind_cap_switch),7827 {7828 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,7829 /* .name = "Capture Source", */7830 .name = "Input Source",7831 .count = 1,7832 .info = alc_mux_enum_info,7833 .get = alc_mux_enum_get,7834 .put = alc_mux_enum_put,7835 },7836 {0} /* end */7837 };7838 7839 static struct snd_kcontrol_new alc883_chmode_mixer[] = {7840 {7841 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,7842 .name = "Channel Mode",7843 .info = alc_ch_mode_info,7844 .get = alc_ch_mode_get,7845 .put = alc_ch_mode_put,7846 },7847 {0} /* end */7848 };7849 7850 static struct hda_verb alc883_init_verbs[] = {7851 /* ADC1: mute amp left and right */7852 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},7853 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},7854 /* ADC2: mute amp left and right */7855 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},7856 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},7857 /* Front mixer: unmute input/output amp left and right (volume = 0) */7858 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},7859 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},7860 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},7861 /* Rear mixer */7862 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},7863 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},7864 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},7865 /* CLFE mixer */7866 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},7867 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},7868 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},7869 /* Side mixer */7870 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},7871 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},7872 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},7873 7874 /* mute analog input loopbacks */7875 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},7876 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},7877 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},7878 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},7879 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},7880 7881 /* Front Pin: output 0 (0x0c) */7882 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},7883 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},7884 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},7885 /* Rear Pin: output 1 (0x0d) */7886 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},7887 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},7888 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},7889 /* CLFE Pin: output 2 (0x0e) */7890 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},7891 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},7892 {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},7893 /* Side Pin: output 3 (0x0f) */7894 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},7895 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},7896 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},7897 /* Mic (rear) pin: input vref at 80% */7898 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},7899 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},7900 /* Front Mic pin: input vref at 80% */7901 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},7902 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},7903 /* Line In pin: input */7904 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},7905 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},7906 /* Line-2 In: Headphone output (output 0 - 0x0c) */7907 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},7908 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},7909 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},7910 /* CD pin widget for input */7911 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},7912 7913 /* FIXME: use matrix-type input source selection */7914 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */7915 /* Input mixer2 */7916 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},7917 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},7918 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},7919 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},7920 /* Input mixer3 */7921 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},7922 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},7923 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},7924 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},7925 {0}7926 };7927 7928 /* toggle speaker-output according to the hp-jack state */7929 static void alc883_mitac_hp_automute(struct hda_codec *codec)7930 {7931 unsigned int present;7932 7933 present = snd_hda_codec_read(codec, 0x15, 0,7934 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;7935 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,7936 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);7937 snd_hda_codec_amp_stereo(codec, 0x17, HDA_OUTPUT, 0,7938 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);7939 }7940 7941 /* auto-toggle front mic */7942 /*7943 static void alc883_mitac_mic_automute(struct hda_codec *codec)7944 {7945 unsigned int present;7946 unsigned char bits;7947 7948 present = snd_hda_codec_read(codec, 0x18, 0,7949 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;7950 bits = present ? HDA_AMP_MUTE : 0;7951 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);7952 }7953 */7954 7955 static void alc883_mitac_automute(struct hda_codec *codec)7956 {7957 alc883_mitac_hp_automute(codec);7958 /* alc883_mitac_mic_automute(codec); */7959 }7960 7961 static void alc883_mitac_unsol_event(struct hda_codec *codec,7962 unsigned int res)7963 {7964 switch (res >> 26) {7965 case ALC880_HP_EVENT:7966 alc883_mitac_hp_automute(codec);7967 break;7968 case ALC880_MIC_EVENT:7969 /* alc883_mitac_mic_automute(codec); */7970 break;7971 }7972 }7973 7974 static struct hda_verb alc883_mitac_verbs[] = {7975 /* HP */7976 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},7977 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},7978 /* Subwoofer */7979 {0x17, AC_VERB_SET_CONNECT_SEL, 0x02},7980 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},7981 7982 /* enable unsolicited event */7983 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},7984 /* {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, */7985 7986 {0} /* end */7987 };7988 7989 static struct hda_verb alc883_clevo_m720_verbs[] = {7990 /* HP */7991 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},7992 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},7993 /* Int speaker */7994 {0x14, AC_VERB_SET_CONNECT_SEL, 0x01},7995 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},7996 7997 /* enable unsolicited event */7998 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},7999 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},8000 8001 {0} /* end */8002 };8003 8004 static struct hda_verb alc883_2ch_fujitsu_pi2515_verbs[] = {8005 /* HP */8006 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},8007 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},8008 /* Subwoofer */8009 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},8010 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},8011 8012 /* enable unsolicited event */8013 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},8014 8015 {0} /* end */8016 };8017 8018 static struct hda_verb alc883_tagra_verbs[] = {8019 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},8020 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},8021 8022 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},8023 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},8024 8025 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */8026 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */8027 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */8028 8029 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},8030 {0x01, AC_VERB_SET_GPIO_MASK, 0x03},8031 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03},8032 {0x01, AC_VERB_SET_GPIO_DATA, 0x03},8033 8034 {0} /* end */8035 };8036 8037 static struct hda_verb alc883_lenovo_101e_verbs[] = {8038 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},8039 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT|AC_USRSP_EN},8040 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT|AC_USRSP_EN},8041 {0} /* end */8042 };8043 8044 static struct hda_verb alc883_lenovo_nb0763_verbs[] = {8045 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},8046 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},8047 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},8048 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},8049 {0} /* end */8050 };8051 8052 static struct hda_verb alc888_lenovo_ms7195_verbs[] = {8053 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},8054 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},8055 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},8056 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT | AC_USRSP_EN},8057 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},8058 {0} /* end */8059 };8060 8061 static struct hda_verb alc883_haier_w66_verbs[] = {8062 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},8063 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},8064 8065 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},8066 8067 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},8068 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},8069 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},8070 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},8071 {0} /* end */8072 };8073 8074 static struct hda_verb alc888_lenovo_sky_verbs[] = {8075 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},8076 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},8077 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},8078 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},8079 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},8080 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},8081 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},8082 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},8083 {0} /* end */8084 };8085 8086 static struct hda_verb alc888_6st_dell_verbs[] = {8087 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},8088 {0}8089 };8090 8091 static void alc888_3st_hp_front_automute(struct hda_codec *codec)8092 {8093 unsigned int present, bits;8094 8095 present = snd_hda_codec_read(codec, 0x1b, 0,8096 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;8097 bits = present ? HDA_AMP_MUTE : 0;8098 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,8099 HDA_AMP_MUTE, bits);8100 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,8101 HDA_AMP_MUTE, bits);8102 snd_hda_codec_amp_stereo(codec, 0x18, HDA_OUTPUT, 0,8103 HDA_AMP_MUTE, bits);8104 }8105 8106 static void alc888_3st_hp_unsol_event(struct hda_codec *codec,8107 unsigned int res)8108 {8109 switch (res >> 26) {8110 case ALC880_HP_EVENT:8111 alc888_3st_hp_front_automute(codec);8112 break;8113 }8114 }8115 8116 static struct hda_verb alc888_3st_hp_verbs[] = {8117 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front: output 0 (0x0c) */8118 {0x16, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Rear : output 1 (0x0d) */8119 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* CLFE : output 2 (0x0e) */8120 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},8121 {0} /* end */8122 };8123 8124 /*8125 * 2ch mode8126 */8127 static struct hda_verb alc888_3st_hp_2ch_init[] = {8128 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },8129 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },8130 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },8131 { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },8132 {0} /* end */8133 };8134 8135 /*8136 * 4ch mode8137 */8138 static struct hda_verb alc888_3st_hp_4ch_init[] = {8139 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },8140 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },8141 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },8142 { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },8143 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },8144 {0} /* end */8145 };8146 8147 /*8148 * 6ch mode8149 */8150 static struct hda_verb alc888_3st_hp_6ch_init[] = {8151 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },8152 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },8153 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },8154 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },8155 { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },8156 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },8157 {0} /* end */8158 };8159 8160 static struct hda_channel_mode alc888_3st_hp_modes[3] = {8161 { 2, alc888_3st_hp_2ch_init },8162 { 4, alc888_3st_hp_4ch_init },8163 { 6, alc888_3st_hp_6ch_init },8164 };8165 8166 /* toggle front-jack and RCA according to the hp-jack state */8167 static void alc888_lenovo_ms7195_front_automute(struct hda_codec *codec)8168 {8169 unsigned int present;8170 8171 present = snd_hda_codec_read(codec, 0x1b, 0,8172 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;8173 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,8174 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);8175 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,8176 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);8177 }8178 8179 /* toggle RCA according to the front-jack state */8180 static void alc888_lenovo_ms7195_rca_automute(struct hda_codec *codec)8181 {8182 unsigned int present;8183 8184 present = snd_hda_codec_read(codec, 0x14, 0,8185 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;8186 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,8187 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);8188 }8189 8190 static void alc883_lenovo_ms7195_unsol_event(struct hda_codec *codec,8191 unsigned int res)8192 {8193 if ((res >> 26) == ALC880_HP_EVENT)8194 alc888_lenovo_ms7195_front_automute(codec);8195 if ((res >> 26) == ALC880_FRONT_EVENT)8196 alc888_lenovo_ms7195_rca_automute(codec);8197 }8198 8199 static struct hda_verb alc883_medion_md2_verbs[] = {8200 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},8201 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},8202 8203 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},8204 8205 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},8206 {0} /* end */8207 };8208 8209 /* toggle speaker-output according to the hp-jack state */8210 static void alc883_medion_md2_automute(struct hda_codec *codec)8211 {8212 unsigned int present;8213 8214 present = snd_hda_codec_read(codec, 0x14, 0,8215 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;8216 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,8217 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);8218 }8219 8220 static void alc883_medion_md2_unsol_event(struct hda_codec *codec,8221 unsigned int res)8222 {8223 if ((res >> 26) == ALC880_HP_EVENT)8224 alc883_medion_md2_automute(codec);8225 }8226 8227 /* toggle speaker-output according to the hp-jack state */8228 static void alc883_tagra_automute(struct hda_codec *codec)8229 {8230 unsigned int present;8231 unsigned char bits;8232 8233 present = snd_hda_codec_read(codec, 0x14, 0,8234 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;8235 bits = present ? HDA_AMP_MUTE : 0;8236 snd_hda_codec_amp_stereo(codec, 0x1b, HDA_OUTPUT, 0,8237 HDA_AMP_MUTE, bits);8238 snd_hda_codec_write_cache(codec, 1, 0, AC_VERB_SET_GPIO_DATA,8239 present ? 1 : 3);8240 }8241 8242 static void alc883_tagra_unsol_event(struct hda_codec *codec, unsigned int res)8243 {8244 if ((res >> 26) == ALC880_HP_EVENT)8245 alc883_tagra_automute(codec);8246 }8247 8248 /* toggle speaker-output according to the hp-jack state */8249 static void alc883_clevo_m720_hp_automute(struct hda_codec *codec)8250 {8251 unsigned int present;8252 unsigned char bits;8253 8254 present = snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_PIN_SENSE, 0)8255 & AC_PINSENSE_PRESENCE;8256 bits = present ? HDA_AMP_MUTE : 0;8257 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,8258 HDA_AMP_MUTE, bits);8259 }8260 8261 static void alc883_clevo_m720_mic_automute(struct hda_codec *codec)8262 {8263 unsigned int present;8264 8265 present = snd_hda_codec_read(codec, 0x18, 0,8266 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;8267 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1,8268 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);8269 }8270 8271 static void alc883_clevo_m720_automute(struct hda_codec *codec)8272 {8273 alc883_clevo_m720_hp_automute(codec);8274 alc883_clevo_m720_mic_automute(codec);8275 }8276 8277 static void alc883_clevo_m720_unsol_event(struct hda_codec *codec,8278 unsigned int res)8279 {8280 switch (res >> 26) {8281 case ALC880_HP_EVENT:8282 alc883_clevo_m720_hp_automute(codec);8283 break;8284 case ALC880_MIC_EVENT:8285 alc883_clevo_m720_mic_automute(codec);8286 break;8287 }8288 }8289 8290 /* toggle speaker-output according to the hp-jack state */8291 static void alc883_2ch_fujitsu_pi2515_automute(struct hda_codec *codec)8292 {8293 unsigned int present;8294 unsigned char bits;8295 8296 present = snd_hda_codec_read(codec, 0x14, 0, AC_VERB_GET_PIN_SENSE, 0)8297 & AC_PINSENSE_PRESENCE;8298 bits = present ? HDA_AMP_MUTE : 0;8299 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,8300 HDA_AMP_MUTE, bits);8301 }8302 8303 static void alc883_2ch_fujitsu_pi2515_unsol_event(struct hda_codec *codec,8304 unsigned int res)8305 {8306 if ((res >> 26) == ALC880_HP_EVENT)8307 alc883_2ch_fujitsu_pi2515_automute(codec);8308 }8309 8310 static void alc883_haier_w66_automute(struct hda_codec *codec)8311 {8312 unsigned int present;8313 unsigned char bits;8314 8315 present = snd_hda_codec_read(codec, 0x1b, 0,8316 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;8317 bits = present ? 0x80 : 0;8318 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,8319 0x80, bits);8320 }8321 8322 static void alc883_haier_w66_unsol_event(struct hda_codec *codec,8323 unsigned int res)8324 {8325 if ((res >> 26) == ALC880_HP_EVENT)8326 alc883_haier_w66_automute(codec);8327 }8328 8329 static void alc883_lenovo_101e_ispeaker_automute(struct hda_codec *codec)8330 {8331 unsigned int present;8332 unsigned char bits;8333 8334 present = snd_hda_codec_read(codec, 0x14, 0,8335 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;8336 bits = present ? HDA_AMP_MUTE : 0;8337 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,8338 HDA_AMP_MUTE, bits);8339 }8340 8341 static void alc883_lenovo_101e_all_automute(struct hda_codec *codec)8342 {8343 unsigned int present;8344 unsigned char bits;8345 8346 present = snd_hda_codec_read(codec, 0x1b, 0,8347 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;8348 bits = present ? HDA_AMP_MUTE : 0;8349 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,8350 HDA_AMP_MUTE, bits);8351 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,8352 HDA_AMP_MUTE, bits);8353 }8354 8355 static void alc883_lenovo_101e_unsol_event(struct hda_codec *codec,8356 unsigned int res)8357 {8358 if ((res >> 26) == ALC880_HP_EVENT)8359 alc883_lenovo_101e_all_automute(codec);8360 if ((res >> 26) == ALC880_FRONT_EVENT)8361 alc883_lenovo_101e_ispeaker_automute(codec);8362 }8363 8364 /* toggle speaker-output according to the hp-jack state */8365 static void alc883_acer_aspire_automute(struct hda_codec *codec)8366 {8367 unsigned int present;8368 8369 present = snd_hda_codec_read(codec, 0x14, 0,8370 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;8371 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,8372 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);8373 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,8374 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);8375 }8376 8377 static void alc883_acer_aspire_unsol_event(struct hda_codec *codec,8378 unsigned int res)8379 {8380 if ((res >> 26) == ALC880_HP_EVENT)8381 alc883_acer_aspire_automute(codec);8382 }8383 8384 static struct hda_verb alc883_acer_eapd_verbs[] = {8385 /* HP Pin: output 0 (0x0c) */8386 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},8387 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},8388 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},8389 /* Front Pin: output 0 (0x0c) */8390 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},8391 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},8392 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},8393 {0x16, AC_VERB_SET_CONNECT_SEL, 0x00},8394 /* eanable EAPD on medion laptop */8395 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},8396 {0x20, AC_VERB_SET_PROC_COEF, 0x3050},8397 /* enable unsolicited event */8398 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},8399 {0}8400 };8401 8402 static void alc888_6st_dell_front_automute(struct hda_codec *codec)8403 {8404 unsigned int present;8405 8406 present = snd_hda_codec_read(codec, 0x1b, 0,8407 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;8408 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,8409 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);8410 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,8411 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);8412 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,8413 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);8414 snd_hda_codec_amp_stereo(codec, 0x17, HDA_OUTPUT, 0,8415 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);8416 }8417 8418 static void alc888_6st_dell_unsol_event(struct hda_codec *codec,8419 unsigned int res)8420 {8421 switch (res >> 26) {8422 case ALC880_HP_EVENT:8423 /* printk(KERN_DEBUG "hp_event\n"); */8424 alc888_6st_dell_front_automute(codec);8425 break;8426 }8427 }8428 8429 static void alc888_lenovo_sky_front_automute(struct hda_codec *codec)8430 {8431 unsigned int mute;8432 unsigned int present;8433 8434 snd_hda_codec_read(codec, 0x1b, 0, AC_VERB_SET_PIN_SENSE, 0);8435 present = snd_hda_codec_read(codec, 0x1b, 0,8436 AC_VERB_GET_PIN_SENSE, 0);8437 present = (present & 0x80000000) != 0;8438 if (present) {8439 /* mute internal speaker */8440 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,8441 HDA_AMP_MUTE, HDA_AMP_MUTE);8442 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,8443 HDA_AMP_MUTE, HDA_AMP_MUTE);8444 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,8445 HDA_AMP_MUTE, HDA_AMP_MUTE);8446 snd_hda_codec_amp_stereo(codec, 0x17, HDA_OUTPUT, 0,8447 HDA_AMP_MUTE, HDA_AMP_MUTE);8448 snd_hda_codec_amp_stereo(codec, 0x1a, HDA_OUTPUT, 0,8449 HDA_AMP_MUTE, HDA_AMP_MUTE);8450 } else {8451 /* unmute internal speaker if necessary */8452 mute = snd_hda_codec_amp_read(codec, 0x1b, 0, HDA_OUTPUT, 0);8453 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,8454 HDA_AMP_MUTE, mute);8455 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,8456 HDA_AMP_MUTE, mute);8457 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,8458 HDA_AMP_MUTE, mute);8459 snd_hda_codec_amp_stereo(codec, 0x17, HDA_OUTPUT, 0,8460 HDA_AMP_MUTE, mute);8461 snd_hda_codec_amp_stereo(codec, 0x1a, HDA_OUTPUT, 0,8462 HDA_AMP_MUTE, mute);8463 }8464 }8465 8466 static void alc883_lenovo_sky_unsol_event(struct hda_codec *codec,8467 unsigned int res)8468 {8469 if ((res >> 26) == ALC880_HP_EVENT)8470 alc888_lenovo_sky_front_automute(codec);8471 }8472 8473 /*8474 * generic initialization of ADC, input mixers and output mixers8475 */8476 static struct hda_verb alc883_auto_init_verbs[] = {8477 /*8478 * Unmute ADC0-2 and set the default input to mic-in8479 */8480 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},8481 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},8482 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},8483 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},8484 8485 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback8486 * mixer widget8487 * Note: PASD motherboards uses the Line In 2 as the input for8488 * front panel mic (mic 2)8489 */8490 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */8491 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},8492 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},8493 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},8494 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},8495 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},8496 8497 /*8498 * Set up output mixers (0x0c - 0x0f)8499 */8500 /* set vol=0 to output mixers */8501 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},8502 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},8503 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},8504 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},8505 /* set up input amps for analog loopback */8506 /* Amp Indices: DAC = 0, mixer = 1 */8507 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},8508 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},8509 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},8510 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},8511 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},8512 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},8513 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},8514 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},8515 {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},8516 {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},8517 8518 /* FIXME: use matrix-type input source selection */8519 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */8520 /* Input mixer1 */8521 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},8522 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},8523 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},8524 /* {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)}, */8525 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)},8526 /* Input mixer2 */8527 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},8528 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},8529 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},8530 /* {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)}, */8531 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)},8532 8533 {0}8534 };8535 8536 static struct hda_verb alc888_asus_m90v_verbs[] = {8537 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},8538 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},8539 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},8540 /* enable unsolicited event */8541 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},8542 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},8543 {0} /* end */8544 };8545 8546 static void alc883_nb_mic_automute(struct hda_codec *codec)8547 {8548 unsigned int present;8549 8550 present = snd_hda_codec_read(codec, 0x18, 0,8551 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;8552 snd_hda_codec_write(codec, 0x23, 0, AC_VERB_SET_AMP_GAIN_MUTE,8553 0x7000 | (0x00 << 8) | (present ? 0 : 0x80));8554 snd_hda_codec_write(codec, 0x23, 0, AC_VERB_SET_AMP_GAIN_MUTE,8555 0x7000 | (0x01 << 8) | (present ? 0x80 : 0));8556 }8557 8558 static void alc883_M90V_speaker_automute(struct hda_codec *codec)8559 {8560 unsigned int present;8561 unsigned char bits;8562 8563 present = snd_hda_codec_read(codec, 0x1b, 0,8564 AC_VERB_GET_PIN_SENSE, 0)8565 & AC_PINSENSE_PRESENCE;8566 bits = present ? 0 : PIN_OUT;8567 snd_hda_codec_write(codec, 0x14, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,8568 bits);8569 snd_hda_codec_write(codec, 0x15, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,8570 bits);8571 snd_hda_codec_write(codec, 0x16, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,8572 bits);8573 }8574 8575 static void alc883_mode2_unsol_event(struct hda_codec *codec,8576 unsigned int res)8577 {8578 switch (res >> 26) {8579 case ALC880_HP_EVENT:8580 alc883_M90V_speaker_automute(codec);8581 break;8582 case ALC880_MIC_EVENT:8583 alc883_nb_mic_automute(codec);8584 break;8585 }8586 }8587 8588 static void alc883_mode2_inithook(struct hda_codec *codec)8589 {8590 alc883_M90V_speaker_automute(codec);8591 alc883_nb_mic_automute(codec);8592 }8593 8594 static struct hda_verb alc888_asus_eee1601_verbs[] = {8595 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},8596 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},8597 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},8598 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},8599 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},8600 {0x20, AC_VERB_SET_COEF_INDEX, 0x0b},8601 {0x20, AC_VERB_SET_PROC_COEF, 0x0838},8602 /* enable unsolicited event */8603 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},8604 {0} /* end */8605 };8606 8607 static void alc883_eee1601_speaker_automute(struct hda_codec *codec)8608 {8609 unsigned int present;8610 unsigned char bits;8611 8612 present = snd_hda_codec_read(codec, 0x14, 0,8613 AC_VERB_GET_PIN_SENSE, 0)8614 & AC_PINSENSE_PRESENCE;8615 bits = present ? 0 : PIN_OUT;8616 snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,8617 bits);8618 }8619 8620 static void alc883_eee1601_unsol_event(struct hda_codec *codec,8621 unsigned int res)8622 {8623 switch (res >> 26) {8624 case ALC880_HP_EVENT:8625 alc883_eee1601_speaker_automute(codec);8626 break;8627 }8628 }8629 8630 static void alc883_eee1601_inithook(struct hda_codec *codec)8631 {8632 alc883_eee1601_speaker_automute(codec);8633 }8634 8635 #ifdef CONFIG_SND_HDA_POWER_SAVE8636 #define alc883_loopbacks alc880_loopbacks8637 #endif8638 8639 /* pcm configuration: identiacal with ALC880 */8640 #define alc883_pcm_analog_playback alc880_pcm_analog_playback8641 #define alc883_pcm_analog_capture alc880_pcm_analog_capture8642 #define alc883_pcm_analog_alt_capture alc880_pcm_analog_alt_capture8643 #define alc883_pcm_digital_playback alc880_pcm_digital_playback8644 #define alc883_pcm_digital_capture alc880_pcm_digital_capture8645 8646 /*8647 * configuration and preset8648 */8649 static const char *alc883_models[ALC883_MODEL_LAST] = {8650 [ALC883_3ST_2ch_DIG] = "3stack-dig",8651 [ALC883_3ST_6ch_DIG] = "3stack-6ch-dig",8652 [ALC883_3ST_6ch] = "3stack-6ch",8653 [ALC883_6ST_DIG] = "6stack-dig",8654 [ALC883_TARGA_DIG] = "targa-dig",8655 [ALC883_TARGA_2ch_DIG] = "targa-2ch-dig",8656 [ALC883_ACER] = "acer",8657 [ALC883_ACER_ASPIRE] = "acer-aspire",8658 [ALC888_ACER_ASPIRE_4930G] = "acer-aspire-4930g",8659 [ALC883_MEDION] = "medion",8660 [ALC883_MEDION_MD2] = "medion-md2",8661 [ALC883_LAPTOP_EAPD] = "laptop-eapd",8662 [ALC883_LENOVO_101E_2ch] = "lenovo-101e",8663 [ALC883_LENOVO_NB0763] = "lenovo-nb0763",8664 [ALC888_LENOVO_MS7195_DIG] = "lenovo-ms7195-dig",8665 [ALC888_LENOVO_SKY] = "lenovo-sky",8666 [ALC883_HAIER_W66] = "haier-w66",8667 [ALC888_3ST_HP] = "3stack-hp",8668 [ALC888_6ST_DELL] = "6stack-dell",8669 [ALC883_MITAC] = "mitac",8670 [ALC883_CLEVO_M720] = "clevo-m720",8671 [ALC883_FUJITSU_PI2515] = "fujitsu-pi2515",8672 [ALC888_FUJITSU_XA3530] = "fujitsu-xa3530",8673 [ALC883_3ST_6ch_INTEL] = "3stack-6ch-intel",8674 [ALC1200_ASUS_P5Q] = "asus-p5q",8675 [ALC883_AUTO] = "auto",8676 };8677 8678 static struct snd_pci_quirk alc883_cfg_tbl[] = {8679 SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC883_3ST_6ch_DIG),8680 SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE),8681 SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_ACER_ASPIRE),8682 SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_ACER_ASPIRE),8683 SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE),8684 SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE),8685 SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE),8686 SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",8687 ALC888_ACER_ASPIRE_4930G),8688 SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",8689 ALC888_ACER_ASPIRE_4930G),8690 SND_PCI_QUIRK(0x1025, 0x0157, "Acer X3200", ALC883_AUTO),8691 SND_PCI_QUIRK(0x1025, 0x0158, "Acer AX1700-U3700A", ALC883_AUTO),8692 SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",8693 ALC888_ACER_ASPIRE_4930G),8694 SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",8695 ALC888_ACER_ASPIRE_4930G),8696 /* default Acer */8697 SND_PCI_QUIRK_VENDOR(0x1025, "Acer laptop", ALC883_ACER),8698 SND_PCI_QUIRK(0x1028, 0x020d, "Dell Inspiron 530", ALC888_6ST_DELL),8699 SND_PCI_QUIRK(0x103c, 0x2a3d, "HP Pavillion", ALC883_6ST_DIG),8700 SND_PCI_QUIRK(0x103c, 0x2a4f, "HP Samba", ALC888_3ST_HP),8701 SND_PCI_QUIRK(0x103c, 0x2a60, "HP Lucknow", ALC888_3ST_HP),8702 SND_PCI_QUIRK(0x103c, 0x2a61, "HP Nettle", ALC883_6ST_DIG),8703 SND_PCI_QUIRK(0x103c, 0x2a66, "HP Acacia", ALC888_3ST_HP),8704 SND_PCI_QUIRK(0x103c, 0x2a72, "HP Educ.ar", ALC888_3ST_HP),8705 SND_PCI_QUIRK(0x1043, 0x1873, "Asus M90V", ALC888_ASUS_M90V),8706 SND_PCI_QUIRK(0x1043, 0x8249, "Asus M2A-VM HDMI", ALC883_3ST_6ch_DIG),8707 SND_PCI_QUIRK(0x1043, 0x8284, "Asus Z37E", ALC883_6ST_DIG),8708 SND_PCI_QUIRK(0x1043, 0x82fe, "Asus P5Q-EM HDMI", ALC1200_ASUS_P5Q),8709 SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_ASUS_EEE1601),8710 SND_PCI_QUIRK(0x105b, 0x0ce8, "Foxconn P35AX-S", ALC883_6ST_DIG),8711 SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC883_6ST_DIG),8712 SND_PCI_QUIRK(0x1071, 0x8227, "Mitac 82801H", ALC883_MITAC),8713 SND_PCI_QUIRK(0x1071, 0x8253, "Mitac 8252d", ALC883_MITAC),8714 SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC883_LAPTOP_EAPD),8715 SND_PCI_QUIRK(0x10f1, 0x2350, "TYAN-S2350", ALC888_6ST_DELL),8716 SND_PCI_QUIRK(0x108e, 0x534d, NULL, ALC883_3ST_6ch),8717 SND_PCI_QUIRK(0x1458, 0xa002, "MSI", ALC883_6ST_DIG),8718 SND_PCI_QUIRK(0x1462, 0x0349, "MSI", ALC883_TARGA_2ch_DIG),8719 SND_PCI_QUIRK(0x1462, 0x040d, "MSI", ALC883_TARGA_2ch_DIG),8720 SND_PCI_QUIRK(0x1462, 0x0579, "MSI", ALC883_TARGA_2ch_DIG),8721 SND_PCI_QUIRK(0x1462, 0x2fb3, "MSI", ALC883_TARGA_2ch_DIG),8722 SND_PCI_QUIRK(0x1462, 0x3729, "MSI S420", ALC883_TARGA_DIG),8723 SND_PCI_QUIRK(0x1462, 0x3783, "NEC S970", ALC883_TARGA_DIG),8724 SND_PCI_QUIRK(0x1462, 0x3b7f, "MSI", ALC883_TARGA_2ch_DIG),8725 SND_PCI_QUIRK(0x1462, 0x3ef9, "MSI", ALC883_TARGA_DIG),8726 SND_PCI_QUIRK(0x1462, 0x3fc1, "MSI", ALC883_TARGA_DIG),8727 SND_PCI_QUIRK(0x1462, 0x3fc3, "MSI", ALC883_TARGA_DIG),8728 SND_PCI_QUIRK(0x1462, 0x3fcc, "MSI", ALC883_TARGA_DIG),8729 SND_PCI_QUIRK(0x1462, 0x3fdf, "MSI", ALC883_TARGA_DIG),8730 SND_PCI_QUIRK(0x1462, 0x4314, "MSI", ALC883_TARGA_DIG),8731 SND_PCI_QUIRK(0x1462, 0x4319, "MSI", ALC883_TARGA_DIG),8732 SND_PCI_QUIRK(0x1462, 0x4324, "MSI", ALC883_TARGA_DIG),8733 SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC883_6ST_DIG),8734 SND_PCI_QUIRK(0x1462, 0x7187, "MSI", ALC883_6ST_DIG),8735 SND_PCI_QUIRK(0x1462, 0x7250, "MSI", ALC883_6ST_DIG),8736 SND_PCI_QUIRK(0x1462, 0x7260, "MSI 7260", ALC883_TARGA_DIG),8737 SND_PCI_QUIRK(0x1462, 0x7267, "MSI", ALC883_3ST_6ch_DIG),8738 SND_PCI_QUIRK(0x1462, 0x7280, "MSI", ALC883_6ST_DIG),8739 SND_PCI_QUIRK(0x1462, 0x7327, "MSI", ALC883_6ST_DIG),8740 SND_PCI_QUIRK(0x1462, 0xa422, "MSI", ALC883_TARGA_2ch_DIG),8741 SND_PCI_QUIRK(0x147b, 0x1083, "Abit IP35-PRO", ALC883_6ST_DIG),8742 SND_PCI_QUIRK(0x1558, 0x0721, "Clevo laptop M720R", ALC883_CLEVO_M720),8743 SND_PCI_QUIRK(0x1558, 0x0722, "Clevo laptop M720SR", ALC883_CLEVO_M720),8744 SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC883_LAPTOP_EAPD),8745 SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch),8746 SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION),8747 SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1100, "FSC AMILO Xi/Pi25xx",8748 ALC883_FUJITSU_PI2515),8749 SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1130, "Fujitsu AMILO Xa35xx",8750 ALC888_FUJITSU_XA3530),8751 SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo 101e", ALC883_LENOVO_101E_2ch),8752 SND_PCI_QUIRK(0x17aa, 0x2085, "Lenovo NB0763", ALC883_LENOVO_NB0763),8753 SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763),8754 SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763),8755 SND_PCI_QUIRK(0x17aa, 0x101d, "Lenovo Sky", ALC888_LENOVO_SKY),8756 SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2),8757 SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG),8758 SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG),8759 SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66),8760 SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL),8761 SND_PCI_QUIRK(0x8086, 0x0002, "DG33FBC", ALC883_3ST_6ch_INTEL),8762 SND_PCI_QUIRK(0x8086, 0x2503, "82801H", ALC883_MITAC),8763 SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC883_3ST_6ch_INTEL),8764 SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC883_3ST_6ch),8765 {0}8766 };8767 8768 static hda_nid_t alc883_slave_dig_outs[] = {8769 ALC1200_DIGOUT_NID, 0,8770 };8771 8772 static hda_nid_t alc1200_slave_dig_outs[] = {8773 ALC883_DIGOUT_NID, 0,8774 };8775 8776 static struct alc_config_preset alc883_presets[] = {8777 [ALC883_3ST_2ch_DIG] = {8778 .mixers = { alc883_3ST_2ch_mixer },8779 .init_verbs = { alc883_init_verbs },8780 .num_dacs = ARRAY_SIZE(alc883_dac_nids),8781 .dac_nids = alc883_dac_nids,8782 .dig_out_nid = ALC883_DIGOUT_NID,8783 .dig_in_nid = ALC883_DIGIN_NID,8784 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),8785 .channel_mode = alc883_3ST_2ch_modes,8786 .input_mux = &alc883_capture_source,8787 },8788 [ALC883_3ST_6ch_DIG] = {8789 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },8790 .init_verbs = { alc883_init_verbs },8791 .num_dacs = ARRAY_SIZE(alc883_dac_nids),8792 .dac_nids = alc883_dac_nids,8793 .dig_out_nid = ALC883_DIGOUT_NID,8794 .dig_in_nid = ALC883_DIGIN_NID,8795 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),8796 .channel_mode = alc883_3ST_6ch_modes,8797 .need_dac_fix = 1,8798 .input_mux = &alc883_capture_source,8799 },8800 [ALC883_3ST_6ch] = {8801 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },8802 .init_verbs = { alc883_init_verbs },8803 .num_dacs = ARRAY_SIZE(alc883_dac_nids),8804 .dac_nids = alc883_dac_nids,8805 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),8806 .channel_mode = alc883_3ST_6ch_modes,8807 .need_dac_fix = 1,8808 .input_mux = &alc883_capture_source,8809 },8810 [ALC883_3ST_6ch_INTEL] = {8811 .mixers = { alc883_3ST_6ch_intel_mixer, alc883_chmode_mixer },8812 .init_verbs = { alc883_init_verbs },8813 .num_dacs = ARRAY_SIZE(alc883_dac_nids),8814 .dac_nids = alc883_dac_nids,8815 .dig_out_nid = ALC883_DIGOUT_NID,8816 .dig_in_nid = ALC883_DIGIN_NID,8817 .slave_dig_outs = alc883_slave_dig_outs,8818 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_intel_modes),8819 .channel_mode = alc883_3ST_6ch_intel_modes,8820 .need_dac_fix = 1,8821 .input_mux = &alc883_3stack_6ch_intel,8822 },8823 [ALC883_6ST_DIG] = {8824 .mixers = { alc883_base_mixer, alc883_chmode_mixer },8825 .init_verbs = { alc883_init_verbs },8826 .num_dacs = ARRAY_SIZE(alc883_dac_nids),8827 .dac_nids = alc883_dac_nids,8828 .dig_out_nid = ALC883_DIGOUT_NID,8829 .dig_in_nid = ALC883_DIGIN_NID,8830 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),8831 .channel_mode = alc883_sixstack_modes,8832 .input_mux = &alc883_capture_source,8833 },8834 [ALC883_TARGA_DIG] = {8835 .mixers = { alc883_tagra_mixer, alc883_chmode_mixer },8836 .init_verbs = { alc883_init_verbs, alc883_tagra_verbs},8837 .num_dacs = ARRAY_SIZE(alc883_dac_nids),8838 .dac_nids = alc883_dac_nids,8839 .dig_out_nid = ALC883_DIGOUT_NID,8840 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),8841 .channel_mode = alc883_3ST_6ch_modes,8842 .need_dac_fix = 1,8843 .input_mux = &alc883_capture_source,8844 .unsol_event = alc883_tagra_unsol_event,8845 .init_hook = alc883_tagra_automute,8846 },8847 [ALC883_TARGA_2ch_DIG] = {8848 .mixers = { alc883_tagra_2ch_mixer},8849 .init_verbs = { alc883_init_verbs, alc883_tagra_verbs},8850 .num_dacs = ARRAY_SIZE(alc883_dac_nids),8851 .dac_nids = alc883_dac_nids,8852 .adc_nids = alc883_adc_nids_alt,8853 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),8854 .dig_out_nid = ALC883_DIGOUT_NID,8855 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),8856 .channel_mode = alc883_3ST_2ch_modes,8857 .input_mux = &alc883_capture_source,8858 .unsol_event = alc883_tagra_unsol_event,8859 .init_hook = alc883_tagra_automute,8860 },8861 [ALC883_ACER] = {8862 .mixers = { alc883_base_mixer },8863 /* On TravelMate laptops, GPIO 0 enables the internal speaker8864 * and the headphone jack. Turn this on and rely on the8865 * standard mute methods whenever the user wants to turn8866 * these outputs off.8867 */8868 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs },8869 .num_dacs = ARRAY_SIZE(alc883_dac_nids),8870 .dac_nids = alc883_dac_nids,8871 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),8872 .channel_mode = alc883_3ST_2ch_modes,8873 .input_mux = &alc883_capture_source,8874 },8875 [ALC883_ACER_ASPIRE] = {8876 .mixers = { alc883_acer_aspire_mixer },8877 .init_verbs = { alc883_init_verbs, alc883_acer_eapd_verbs },8878 .num_dacs = ARRAY_SIZE(alc883_dac_nids),8879 .dac_nids = alc883_dac_nids,8880 .dig_out_nid = ALC883_DIGOUT_NID,8881 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),8882 .channel_mode = alc883_3ST_2ch_modes,8883 .input_mux = &alc883_capture_source,8884 .unsol_event = alc883_acer_aspire_unsol_event,8885 .init_hook = alc883_acer_aspire_automute,8886 },8887 [ALC888_ACER_ASPIRE_4930G] = {8888 .mixers = { alc888_base_mixer,8889 alc883_chmode_mixer },8890 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,8891 alc888_acer_aspire_4930g_verbs },8892 .num_dacs = ARRAY_SIZE(alc883_dac_nids),8893 .dac_nids = alc883_dac_nids,8894 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),8895 .adc_nids = alc883_adc_nids_rev,8896 .capsrc_nids = alc883_capsrc_nids_rev,8897 .dig_out_nid = ALC883_DIGOUT_NID,8898 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),8899 .channel_mode = alc883_3ST_6ch_modes,8900 .need_dac_fix = 1,8901 .num_mux_defs =8902 ARRAY_SIZE(alc888_2_capture_sources),8903 .input_mux = alc888_2_capture_sources,8904 .unsol_event = alc888_acer_aspire_4930g_unsol_event,8905 .init_hook = alc888_acer_aspire_4930g_automute,8906 },8907 [ALC883_MEDION] = {8908 .mixers = { alc883_fivestack_mixer,8909 alc883_chmode_mixer },8910 .init_verbs = { alc883_init_verbs,8911 alc883_medion_eapd_verbs },8912 .num_dacs = ARRAY_SIZE(alc883_dac_nids),8913 .dac_nids = alc883_dac_nids,8914 .adc_nids = alc883_adc_nids_alt,8915 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),8916 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),8917 .channel_mode = alc883_sixstack_modes,8918 .input_mux = &alc883_capture_source,8919 },8920 [ALC883_MEDION_MD2] = {8921 .mixers = { alc883_medion_md2_mixer},8922 .init_verbs = { alc883_init_verbs, alc883_medion_md2_verbs},8923 .num_dacs = ARRAY_SIZE(alc883_dac_nids),8924 .dac_nids = alc883_dac_nids,8925 .dig_out_nid = ALC883_DIGOUT_NID,8926 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),8927 .channel_mode = alc883_3ST_2ch_modes,8928 .input_mux = &alc883_capture_source,8929 .unsol_event = alc883_medion_md2_unsol_event,8930 .init_hook = alc883_medion_md2_automute,8931 },8932 [ALC883_LAPTOP_EAPD] = {8933 .mixers = { alc883_base_mixer },8934 .init_verbs = { alc883_init_verbs, alc882_eapd_verbs },8935 .num_dacs = ARRAY_SIZE(alc883_dac_nids),8936 .dac_nids = alc883_dac_nids,8937 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),8938 .channel_mode = alc883_3ST_2ch_modes,8939 .input_mux = &alc883_capture_source,8940 },8941 [ALC883_CLEVO_M720] = {8942 .mixers = { alc883_clevo_m720_mixer },8943 .init_verbs = { alc883_init_verbs, alc883_clevo_m720_verbs },8944 .num_dacs = ARRAY_SIZE(alc883_dac_nids),8945 .dac_nids = alc883_dac_nids,8946 .dig_out_nid = ALC883_DIGOUT_NID,8947 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),8948 .channel_mode = alc883_3ST_2ch_modes,8949 .input_mux = &alc883_capture_source,8950 .unsol_event = alc883_clevo_m720_unsol_event,8951 .init_hook = alc883_clevo_m720_automute,8952 },8953 [ALC883_LENOVO_101E_2ch] = {8954 .mixers = { alc883_lenovo_101e_2ch_mixer},8955 .init_verbs = { alc883_init_verbs, alc883_lenovo_101e_verbs},8956 .num_dacs = ARRAY_SIZE(alc883_dac_nids),8957 .dac_nids = alc883_dac_nids,8958 .adc_nids = alc883_adc_nids_alt,8959 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),8960 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),8961 .channel_mode = alc883_3ST_2ch_modes,8962 .input_mux = &alc883_lenovo_101e_capture_source,8963 .unsol_event = alc883_lenovo_101e_unsol_event,8964 .init_hook = alc883_lenovo_101e_all_automute,8965 },8966 [ALC883_LENOVO_NB0763] = {8967 .mixers = { alc883_lenovo_nb0763_mixer },8968 .init_verbs = { alc883_init_verbs, alc883_lenovo_nb0763_verbs},8969 .num_dacs = ARRAY_SIZE(alc883_dac_nids),8970 .dac_nids = alc883_dac_nids,8971 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),8972 .channel_mode = alc883_3ST_2ch_modes,8973 .need_dac_fix = 1,8974 .input_mux = &alc883_lenovo_nb0763_capture_source,8975 .unsol_event = alc883_medion_md2_unsol_event,8976 .init_hook = alc883_medion_md2_automute,8977 },8978 [ALC888_LENOVO_MS7195_DIG] = {8979 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },8980 .init_verbs = { alc883_init_verbs, alc888_lenovo_ms7195_verbs},8981 .num_dacs = ARRAY_SIZE(alc883_dac_nids),8982 .dac_nids = alc883_dac_nids,8983 .dig_out_nid = ALC883_DIGOUT_NID,8984 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),8985 .channel_mode = alc883_3ST_6ch_modes,8986 .need_dac_fix = 1,8987 .input_mux = &alc883_capture_source,8988 .unsol_event = alc883_lenovo_ms7195_unsol_event,8989 .init_hook = alc888_lenovo_ms7195_front_automute,8990 },8991 [ALC883_HAIER_W66] = {8992 .mixers = { alc883_tagra_2ch_mixer},8993 .init_verbs = { alc883_init_verbs, alc883_haier_w66_verbs},8994 .num_dacs = ARRAY_SIZE(alc883_dac_nids),8995 .dac_nids = alc883_dac_nids,8996 .dig_out_nid = ALC883_DIGOUT_NID,8997 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),8998 .channel_mode = alc883_3ST_2ch_modes,8999 .input_mux = &alc883_capture_source,9000 .unsol_event = alc883_haier_w66_unsol_event,9001 .init_hook = alc883_haier_w66_automute,9002 },9003 [ALC888_3ST_HP] = {9004 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },9005 .init_verbs = { alc883_init_verbs, alc888_3st_hp_verbs },9006 .num_dacs = ARRAY_SIZE(alc883_dac_nids),9007 .dac_nids = alc883_dac_nids,9008 .num_channel_mode = ARRAY_SIZE(alc888_3st_hp_modes),9009 .channel_mode = alc888_3st_hp_modes,9010 .need_dac_fix = 1,9011 .input_mux = &alc883_capture_source,9012 .unsol_event = alc888_3st_hp_unsol_event,9013 .init_hook = alc888_3st_hp_front_automute,9014 },9015 [ALC888_6ST_DELL] = {9016 .mixers = { alc883_base_mixer, alc883_chmode_mixer },9017 .init_verbs = { alc883_init_verbs, alc888_6st_dell_verbs },9018 .num_dacs = ARRAY_SIZE(alc883_dac_nids),9019 .dac_nids = alc883_dac_nids,9020 .dig_out_nid = ALC883_DIGOUT_NID,9021 .dig_in_nid = ALC883_DIGIN_NID,9022 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),9023 .channel_mode = alc883_sixstack_modes,9024 .input_mux = &alc883_capture_source,9025 .unsol_event = alc888_6st_dell_unsol_event,9026 .init_hook = alc888_6st_dell_front_automute,9027 },9028 [ALC883_MITAC] = {9029 .mixers = { alc883_mitac_mixer },9030 .init_verbs = { alc883_init_verbs, alc883_mitac_verbs },9031 .num_dacs = ARRAY_SIZE(alc883_dac_nids),9032 .dac_nids = alc883_dac_nids,9033 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),9034 .channel_mode = alc883_3ST_2ch_modes,9035 .input_mux = &alc883_capture_source,9036 .unsol_event = alc883_mitac_unsol_event,9037 .init_hook = alc883_mitac_automute,9038 },9039 [ALC883_FUJITSU_PI2515] = {9040 .mixers = { alc883_2ch_fujitsu_pi2515_mixer },9041 .init_verbs = { alc883_init_verbs,9042 alc883_2ch_fujitsu_pi2515_verbs},9043 .num_dacs = ARRAY_SIZE(alc883_dac_nids),9044 .dac_nids = alc883_dac_nids,9045 .dig_out_nid = ALC883_DIGOUT_NID,9046 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),9047 .channel_mode = alc883_3ST_2ch_modes,9048 .input_mux = &alc883_fujitsu_pi2515_capture_source,9049 .unsol_event = alc883_2ch_fujitsu_pi2515_unsol_event,9050 .init_hook = alc883_2ch_fujitsu_pi2515_automute,9051 },9052 [ALC888_FUJITSU_XA3530] = {9053 .mixers = { alc888_base_mixer, alc883_chmode_mixer },9054 .init_verbs = { alc883_init_verbs,9055 alc888_fujitsu_xa3530_verbs },9056 .num_dacs = ARRAY_SIZE(alc883_dac_nids),9057 .dac_nids = alc883_dac_nids,9058 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),9059 .adc_nids = alc883_adc_nids_rev,9060 .capsrc_nids = alc883_capsrc_nids_rev,9061 .dig_out_nid = ALC883_DIGOUT_NID,9062 .num_channel_mode = ARRAY_SIZE(alc888_4ST_8ch_intel_modes),9063 .channel_mode = alc888_4ST_8ch_intel_modes,9064 .num_mux_defs =9065 ARRAY_SIZE(alc888_2_capture_sources),9066 .input_mux = alc888_2_capture_sources,9067 .unsol_event = alc888_fujitsu_xa3530_unsol_event,9068 .init_hook = alc888_fujitsu_xa3530_automute,9069 },9070 [ALC888_LENOVO_SKY] = {9071 .mixers = { alc888_lenovo_sky_mixer, alc883_chmode_mixer },9072 .init_verbs = { alc883_init_verbs, alc888_lenovo_sky_verbs},9073 .num_dacs = ARRAY_SIZE(alc883_dac_nids),9074 .dac_nids = alc883_dac_nids,9075 .dig_out_nid = ALC883_DIGOUT_NID,9076 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),9077 .channel_mode = alc883_sixstack_modes,9078 .need_dac_fix = 1,9079 .input_mux = &alc883_lenovo_sky_capture_source,9080 .unsol_event = alc883_lenovo_sky_unsol_event,9081 .init_hook = alc888_lenovo_sky_front_automute,9082 },9083 [ALC888_ASUS_M90V] = {9084 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },9085 .init_verbs = { alc883_init_verbs, alc888_asus_m90v_verbs },9086 .num_dacs = ARRAY_SIZE(alc883_dac_nids),9087 .dac_nids = alc883_dac_nids,9088 .dig_out_nid = ALC883_DIGOUT_NID,9089 .dig_in_nid = ALC883_DIGIN_NID,9090 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),9091 .channel_mode = alc883_3ST_6ch_modes,9092 .need_dac_fix = 1,9093 .input_mux = &alc883_fujitsu_pi2515_capture_source,9094 .unsol_event = alc883_mode2_unsol_event,9095 .init_hook = alc883_mode2_inithook,9096 },9097 [ALC888_ASUS_EEE1601] = {9098 .mixers = { alc883_asus_eee1601_mixer },9099 .cap_mixer = alc883_asus_eee1601_cap_mixer,9100 .init_verbs = { alc883_init_verbs, alc888_asus_eee1601_verbs },9101 .num_dacs = ARRAY_SIZE(alc883_dac_nids),9102 .dac_nids = alc883_dac_nids,9103 .dig_out_nid = ALC883_DIGOUT_NID,9104 .dig_in_nid = ALC883_DIGIN_NID,9105 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),9106 .channel_mode = alc883_3ST_2ch_modes,9107 .need_dac_fix = 1,9108 .input_mux = &alc883_asus_eee1601_capture_source,9109 .unsol_event = alc883_eee1601_unsol_event,9110 .init_hook = alc883_eee1601_inithook,9111 },9112 [ALC1200_ASUS_P5Q] = {9113 .mixers = { alc883_base_mixer, alc883_chmode_mixer },9114 .init_verbs = { alc883_init_verbs },9115 .num_dacs = ARRAY_SIZE(alc883_dac_nids),9116 .dac_nids = alc883_dac_nids,9117 .dig_out_nid = ALC1200_DIGOUT_NID,9118 .dig_in_nid = ALC883_DIGIN_NID,9119 .slave_dig_outs = alc1200_slave_dig_outs,9120 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),9121 .channel_mode = alc883_sixstack_modes,9122 .input_mux = &alc883_capture_source,9123 },9124 };9125 9126 9127 /*9128 * BIOS auto configuration9129 */9130 static void alc883_auto_set_output_and_unmute(struct hda_codec *codec,9131 hda_nid_t nid, int pin_type,9132 int dac_idx)9133 {9134 /* set as output */9135 struct alc_spec *spec = codec->spec;9136 int idx;9137 9138 alc_set_pin_output(codec, nid, pin_type);9139 if (spec->multiout.dac_nids[dac_idx] == 0x25)9140 idx = 4;9141 else9142 idx = spec->multiout.dac_nids[dac_idx] - 2;9143 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);9144 9145 }9146 9147 static void alc883_auto_init_multi_out(struct hda_codec *codec)9148 {9149 struct alc_spec *spec = codec->spec;9150 int i;9151 9152 alc_subsystem_id(codec, 0x15, 0x1b, 0x14);9153 for (i = 0; i <= HDA_SIDE; i++) {9154 hda_nid_t nid = spec->autocfg.line_out_pins[i];9155 int pin_type = get_pin_type(spec->autocfg.line_out_type);9156 if (nid)9157 alc883_auto_set_output_and_unmute(codec, nid, pin_type,9158 i);9159 }9160 }9161 9162 static void alc883_auto_init_hp_out(struct hda_codec *codec)9163 {9164 struct alc_spec *spec = codec->spec;9165 hda_nid_t pin;9166 9167 pin = spec->autocfg.hp_pins[0];9168 if (pin) /* connect to front */9169 /* use dac 0 */9170 alc883_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);9171 pin = spec->autocfg.speaker_pins[0];9172 if (pin)9173 alc883_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);9174 }9175 9176 #define alc883_is_input_pin(nid) alc880_is_input_pin(nid)9177 #define ALC883_PIN_CD_NID ALC880_PIN_CD_NID9178 9179 static void alc883_auto_init_analog_input(struct hda_codec *codec)9180 {9181 struct alc_spec *spec = codec->spec;9182 int i;9183 9184 for (i = 0; i < AUTO_PIN_LAST; i++) {9185 hda_nid_t nid = spec->autocfg.input_pins[i];9186 if (alc883_is_input_pin(nid)) {9187 alc_set_input_pin(codec, nid, i);9188 if (nid != ALC883_PIN_CD_NID &&9189 (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))9190 snd_hda_codec_write(codec, nid, 0,9191 AC_VERB_SET_AMP_GAIN_MUTE,9192 AMP_OUT_MUTE);9193 }9194 }9195 }9196 9197 #define alc883_auto_init_input_src alc882_auto_init_input_src9198 9199 /* almost identical with ALC880 parser... */9200 static int alc883_parse_auto_config(struct hda_codec *codec)9201 {9202 struct alc_spec *spec = codec->spec;9203 int err = alc880_parse_auto_config(codec);9204 struct auto_pin_cfg *cfg = &spec->autocfg;9205 int i;9206 9207 if (err < 0)9208 return err;9209 else if (!err)9210 return 0; /* no config found */9211 9212 err = alc_auto_add_mic_boost(codec);9213 if (err < 0)9214 return err;9215 9216 /* hack - override the init verbs */9217 spec->init_verbs[0] = alc883_auto_init_verbs;9218 9219 /* setup input_mux for ALC889 */9220 if (codec->vendor_id == 0x10ec0889) {9221 /* digital-mic input pin is excluded in alc880_auto_create..()9222 * because it's under 0x189223 */9224 if (cfg->input_pins[AUTO_PIN_MIC] == 0x12 ||9225 cfg->input_pins[AUTO_PIN_FRONT_MIC] == 0x12) {9226 struct hda_input_mux *imux = &spec->private_imux[0];9227 for (i = 1; i < 3; i++)9228 memcpy(&spec->private_imux[i],9229 &spec->private_imux[0],9230 sizeof(spec->private_imux[0]));9231 imux->items[imux->num_items].label = "Int DMic";9232 imux->items[imux->num_items].index = 0x0b;9233 imux->num_items++;9234 spec->num_mux_defs = 3;9235 spec->input_mux = spec->private_imux;9236 }9237 }9238 9239 return 1; /* config found */9240 }9241 9242 /* additional initialization for auto-configuration model */9243 static void alc883_auto_init(struct hda_codec *codec)9244 {9245 struct alc_spec *spec = codec->spec;9246 alc883_auto_init_multi_out(codec);9247 alc883_auto_init_hp_out(codec);9248 alc883_auto_init_analog_input(codec);9249 alc883_auto_init_input_src(codec);9250 if (spec->unsol_event)9251 alc_inithook(codec);9252 }9253 9254 static int patch_alc883(struct hda_codec *codec)9255 {9256 struct alc_spec *spec;9257 int err, board_config;9258 9259 spec = kzalloc(sizeof(*spec), GFP_KERNEL);9260 if (spec == NULL)9261 return -ENOMEM;9262 9263 codec->spec = spec;9264 9265 alc_fix_pll_init(codec, 0x20, 0x0a, 10);9266 9267 board_config = snd_hda_check_board_config(codec, ALC883_MODEL_LAST,9268 alc883_models,9269 alc883_cfg_tbl);9270 if (board_config < 0) {9271 printk(KERN_INFO "hda_codec: Unknown model for ALC883, "9272 "trying auto-probe from BIOS...\n");9273 board_config = ALC883_AUTO;9274 }9275 9276 if (board_config == ALC883_AUTO) {9277 /* automatic parse from the BIOS config */9278 err = alc883_parse_auto_config(codec);9279 if (err < 0) {9280 alc_free(codec);9281 return err;9282 } else if (!err) {9283 printk(KERN_INFO9284 "hda_codec: Cannot set up configuration "9285 "from BIOS. Using base mode...\n");9286 board_config = ALC883_3ST_2ch_DIG;9287 }9288 }9289 9290 err = snd_hda_attach_beep_device(codec, 0x1);9291 if (err < 0) {9292 alc_free(codec);9293 return err;9294 }9295 9296 if (board_config != ALC883_AUTO)9297 setup_preset(spec, &alc883_presets[board_config]);9298 9299 switch (codec->vendor_id) {9300 case 0x10ec0888:9301 if (codec->revision_id == 0x100101) {9302 spec->stream_name_analog = "ALC1200 Analog";9303 spec->stream_name_digital = "ALC1200 Digital";9304 } else {9305 spec->stream_name_analog = "ALC888 Analog";9306 spec->stream_name_digital = "ALC888 Digital";9307 }9308 if (!spec->num_adc_nids) {9309 spec->num_adc_nids = ARRAY_SIZE(alc883_adc_nids);9310 spec->adc_nids = alc883_adc_nids;9311 }9312 if (!spec->capsrc_nids)9313 spec->capsrc_nids = alc883_capsrc_nids;9314 spec->capture_style = CAPT_MIX; /* matrix-style capture */9315 break;9316 case 0x10ec0889:9317 spec->stream_name_analog = "ALC889 Analog";9318 spec->stream_name_digital = "ALC889 Digital";9319 if (!spec->num_adc_nids) {9320 spec->num_adc_nids = ARRAY_SIZE(alc889_adc_nids);9321 spec->adc_nids = alc889_adc_nids;9322 }9323 if (!spec->capsrc_nids)9324 spec->capsrc_nids = alc889_capsrc_nids;9325 spec->capture_style = CAPT_1MUX_MIX; /* 1mux/Nmix-style9326 capture */9327 break;9328 default:9329 spec->stream_name_analog = "ALC883 Analog";9330 spec->stream_name_digital = "ALC883 Digital";9331 if (!spec->num_adc_nids) {9332 spec->num_adc_nids = ARRAY_SIZE(alc883_adc_nids);9333 spec->adc_nids = alc883_adc_nids;9334 }9335 if (!spec->capsrc_nids)9336 spec->capsrc_nids = alc883_capsrc_nids;9337 spec->capture_style = CAPT_MIX; /* matrix-style capture */9338 break;9339 }9340 9341 spec->stream_analog_playback = &alc883_pcm_analog_playback;9342 spec->stream_analog_capture = &alc883_pcm_analog_capture;9343 spec->stream_analog_alt_capture = &alc883_pcm_analog_alt_capture;9344 9345 spec->stream_digital_playback = &alc883_pcm_digital_playback;9346 spec->stream_digital_capture = &alc883_pcm_digital_capture;9347 9348 if (!spec->cap_mixer)9349 set_capture_mixer(spec);9350 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);9351 9352 spec->vmaster_nid = 0x0c;9353 9354 codec->patch_ops = alc_patch_ops;9355 if (board_config == ALC883_AUTO)9356 spec->init_hook = alc883_auto_init;9357 9358 #ifdef CONFIG_SND_HDA_POWER_SAVE9359 if (!spec->loopback.amplist)9360 spec->loopback.amplist = alc883_loopbacks;9361 #endif9362 codec->proc_widget_hook = print_realtek_coef;9363 9364 return 0;9365 }9366 9850 9367 9851 /* … … 9408 9892 }; 9409 9893 9410 static struct snd_kcontrol_new alc262_hippo1_mixer[] = {9411 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),9412 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),9413 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),9414 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),9415 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),9416 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),9417 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),9418 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),9419 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),9420 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),9421 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),9422 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),9423 /*HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT),*/9424 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),9425 {0} /* end */9426 };9427 9428 9894 /* update HP, line and mono-out pins according to the master switch */ 9429 9895 static void alc262_hp_master_update(struct hda_codec *codec) … … 9481 9947 } 9482 9948 9483 static int alc262_hp_master_sw_get(struct snd_kcontrol *kcontrol, 9484 struct snd_ctl_elem_value *ucontrol) 9485 { 9486 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 9487 struct alc_spec *spec = codec->spec; 9488 *ucontrol->value.integer.value = spec->master_sw; 9489 return 0; 9490 } 9949 #define alc262_hp_master_sw_get alc260_hp_master_sw_get 9491 9950 9492 9951 static int alc262_hp_master_sw_put(struct snd_kcontrol *kcontrol, … … 9504 9963 } 9505 9964 9965 #define ALC262_HP_MASTER_SWITCH \ 9966 { \ 9967 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 9968 .name = "Master Playback Switch", \ 9969 .info = snd_ctl_boolean_mono_info, \ 9970 .get = alc262_hp_master_sw_get, \ 9971 .put = alc262_hp_master_sw_put, \ 9972 } 9973 9506 9974 static struct snd_kcontrol_new alc262_HP_BPC_mixer[] = { 9507 { 9508 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 9509 .name = "Master Playback Switch", 9510 .info = snd_ctl_boolean_mono_info, 9511 .get = alc262_hp_master_sw_get, 9512 .put = alc262_hp_master_sw_put, 9513 }, 9975 ALC262_HP_MASTER_SWITCH, 9514 9976 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 9515 9977 HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT), … … 9535 9997 9536 9998 static struct snd_kcontrol_new alc262_HP_BPC_WildWest_mixer[] = { 9537 { 9538 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 9539 .name = "Master Playback Switch", 9540 .info = snd_ctl_boolean_mono_info, 9541 .get = alc262_hp_master_sw_get, 9542 .put = alc262_hp_master_sw_put, 9543 }, 9999 ALC262_HP_MASTER_SWITCH, 9544 10000 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 9545 10001 HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT), … … 9568 10024 9569 10025 /* mute/unmute internal speaker according to the hp jack and mute state */ 9570 static void alc262_hp_t5735_ automute(struct hda_codec *codec, int force)10026 static void alc262_hp_t5735_setup(struct hda_codec *codec) 9571 10027 { 9572 10028 struct alc_spec *spec = codec->spec; 9573 10029 9574 if (force || !spec->sense_updated) { 9575 unsigned int present; 9576 present = snd_hda_codec_read(codec, 0x15, 0, 9577 AC_VERB_GET_PIN_SENSE, 0); 9578 spec->jack_present = (present & AC_PINSENSE_PRESENCE) != 0; 9579 spec->sense_updated = 1; 9580 } 9581 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_OUTPUT, 0, HDA_AMP_MUTE, 9582 spec->jack_present ? HDA_AMP_MUTE : 0); 9583 } 9584 9585 static void alc262_hp_t5735_unsol_event(struct hda_codec *codec, 9586 unsigned int res) 9587 { 9588 if ((res >> 26) != ALC880_HP_EVENT) 9589 return; 9590 alc262_hp_t5735_automute(codec, 1); 9591 } 9592 9593 static void alc262_hp_t5735_init_hook(struct hda_codec *codec) 9594 { 9595 alc262_hp_t5735_automute(codec, 1); 10030 spec->autocfg.hp_pins[0] = 0x15; 10031 spec->autocfg.speaker_pins[0] = 0x0c; /* HACK: not actually a pin */ 9596 10032 } 9597 10033 … … 9646 10082 }; 9647 10083 9648 /* bind hp and internal speaker mute (with plug check) */ 9649 static int alc262_sony_master_sw_put(struct snd_kcontrol *kcontrol, 9650 struct snd_ctl_elem_value *ucontrol) 10084 /* bind hp and internal speaker mute (with plug check) as master switch */ 10085 static void alc262_hippo_master_update(struct hda_codec *codec) 10086 { 10087 struct alc_spec *spec = codec->spec; 10088 hda_nid_t hp_nid = spec->autocfg.hp_pins[0]; 10089 hda_nid_t line_nid = spec->autocfg.line_out_pins[0]; 10090 hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0]; 10091 unsigned int mute; 10092 10093 /* HP */ 10094 mute = spec->master_sw ? 0 : HDA_AMP_MUTE; 10095 snd_hda_codec_amp_stereo(codec, hp_nid, HDA_OUTPUT, 0, 10096 HDA_AMP_MUTE, mute); 10097 /* mute internal speaker per jack sense */ 10098 if (spec->jack_present) 10099 mute = HDA_AMP_MUTE; 10100 if (line_nid) 10101 snd_hda_codec_amp_stereo(codec, line_nid, HDA_OUTPUT, 0, 10102 HDA_AMP_MUTE, mute); 10103 if (speaker_nid && speaker_nid != line_nid) 10104 snd_hda_codec_amp_stereo(codec, speaker_nid, HDA_OUTPUT, 0, 10105 HDA_AMP_MUTE, mute); 10106 } 10107 10108 #define alc262_hippo_master_sw_get alc262_hp_master_sw_get 10109 10110 static int alc262_hippo_master_sw_put(struct snd_kcontrol *kcontrol, 10111 struct snd_ctl_elem_value *ucontrol) 9651 10112 { 9652 10113 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 9653 long *valp = ucontrol->value.integer.value; 9654 int change; 9655 9656 /* change hp mute */ 9657 change = snd_hda_codec_amp_update(codec, 0x15, 0, HDA_OUTPUT, 0, 9658 HDA_AMP_MUTE, 9659 valp[0] ? 0 : HDA_AMP_MUTE); 9660 change |= snd_hda_codec_amp_update(codec, 0x15, 1, HDA_OUTPUT, 0, 9661 HDA_AMP_MUTE, 9662 valp[1] ? 0 : HDA_AMP_MUTE); 9663 if (change) { 9664 /* change speaker according to HP jack state */ 9665 struct alc_spec *spec = codec->spec; 9666 unsigned int mute; 9667 if (spec->jack_present) 9668 mute = HDA_AMP_MUTE; 9669 else 9670 mute = snd_hda_codec_amp_read(codec, 0x15, 0, 9671 HDA_OUTPUT, 0); 9672 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 9673 HDA_AMP_MUTE, mute); 10114 struct alc_spec *spec = codec->spec; 10115 int val = !!*ucontrol->value.integer.value; 10116 10117 if (val == spec->master_sw) 10118 return 0; 10119 spec->master_sw = val; 10120 alc262_hippo_master_update(codec); 10121 return 1; 10122 } 10123 10124 #define ALC262_HIPPO_MASTER_SWITCH \ 10125 { \ 10126 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 10127 .name = "Master Playback Switch", \ 10128 .info = snd_ctl_boolean_mono_info, \ 10129 .get = alc262_hippo_master_sw_get, \ 10130 .put = alc262_hippo_master_sw_put, \ 9674 10131 } 9675 return change; 9676 } 10132 10133 static struct snd_kcontrol_new alc262_hippo_mixer[] = { 10134 ALC262_HIPPO_MASTER_SWITCH, 10135 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 10136 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 10137 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 10138 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 10139 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 10140 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 10141 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 10142 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 10143 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 10144 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 10145 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 10146 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT), 10147 {0} /* end */ 10148 }; 10149 10150 static struct snd_kcontrol_new alc262_hippo1_mixer[] = { 10151 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 10152 ALC262_HIPPO_MASTER_SWITCH, 10153 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT), 10154 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), 10155 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), 10156 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT), 10157 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 10158 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 10159 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 10160 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT), 10161 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT), 10162 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 10163 {0} /* end */ 10164 }; 10165 10166 /* mute/unmute internal speaker according to the hp jack and mute state */ 10167 static void alc262_hippo_automute(struct hda_codec *codec) 10168 { 10169 struct alc_spec *spec = codec->spec; 10170 hda_nid_t hp_nid = spec->autocfg.hp_pins[0]; 10171 unsigned int present; 10172 10173 /* need to execute and sync at first */ 10174 snd_hda_codec_read(codec, hp_nid, 0, AC_VERB_SET_PIN_SENSE, 0); 10175 present = snd_hda_codec_read(codec, hp_nid, 0, 10176 AC_VERB_GET_PIN_SENSE, 0); 10177 spec->jack_present = (present & 0x80000000) != 0; 10178 alc262_hippo_master_update(codec); 10179 } 10180 10181 static void alc262_hippo_unsol_event(struct hda_codec *codec, unsigned int res) 10182 { 10183 if ((res >> 26) != ALC880_HP_EVENT) 10184 return; 10185 alc262_hippo_automute(codec); 10186 } 10187 10188 static void alc262_hippo_setup(struct hda_codec *codec) 10189 { 10190 struct alc_spec *spec = codec->spec; 10191 10192 spec->autocfg.hp_pins[0] = 0x15; 10193 spec->autocfg.speaker_pins[0] = 0x14; 10194 } 10195 10196 static void alc262_hippo1_setup(struct hda_codec *codec) 10197 { 10198 struct alc_spec *spec = codec->spec; 10199 10200 spec->autocfg.hp_pins[0] = 0x1b; 10201 spec->autocfg.speaker_pins[0] = 0x14; 10202 } 10203 9677 10204 9678 10205 static struct snd_kcontrol_new alc262_sony_mixer[] = { 9679 10206 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 9680 { 9681 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 9682 .name = "Master Playback Switch", 9683 .info = snd_hda_mixer_amp_switch_info, 9684 .get = snd_hda_mixer_amp_switch_get, 9685 .put = alc262_sony_master_sw_put, 9686 .private_value = HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT), 9687 }, 10207 ALC262_HIPPO_MASTER_SWITCH, 9688 10208 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 9689 10209 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), … … 9694 10214 9695 10215 static struct snd_kcontrol_new alc262_benq_t31_mixer[] = { 9696 HDA_CODEC_VOLUME(" FrontPlayback Volume", 0x0c, 0x0, HDA_OUTPUT),9697 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),10216 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT), 10217 ALC262_HIPPO_MASTER_SWITCH, 9698 10218 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 9699 10219 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), … … 9736 10256 9737 10257 /* unsolicited event for HP jack sensing */ 9738 static void alc262_tyan_automute(struct hda_codec *codec) 9739 { 9740 unsigned int mute; 9741 unsigned int present; 9742 9743 snd_hda_codec_read(codec, 0x1b, 0, AC_VERB_SET_PIN_SENSE, 0); 9744 present = snd_hda_codec_read(codec, 0x1b, 0, 9745 AC_VERB_GET_PIN_SENSE, 0); 9746 present = (present & 0x80000000) != 0; 9747 if (present) { 9748 /* mute line output on ATX panel */ 9749 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 9750 HDA_AMP_MUTE, HDA_AMP_MUTE); 9751 } else { 9752 /* unmute line output if necessary */ 9753 mute = snd_hda_codec_amp_read(codec, 0x1b, 0, HDA_OUTPUT, 0); 9754 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 9755 HDA_AMP_MUTE, mute); 9756 } 9757 } 9758 9759 static void alc262_tyan_unsol_event(struct hda_codec *codec, 9760 unsigned int res) 9761 { 9762 if ((res >> 26) != ALC880_HP_EVENT) 9763 return; 9764 alc262_tyan_automute(codec); 9765 } 10258 static void alc262_tyan_setup(struct hda_codec *codec) 10259 { 10260 struct alc_spec *spec = codec->spec; 10261 10262 spec->autocfg.hp_pins[0] = 0x1b; 10263 spec->autocfg.speaker_pins[0] = 0x15; 10264 } 10265 9766 10266 9767 10267 #define alc262_capture_mixer alc882_capture_mixer … … 9853 10353 }; 9854 10354 9855 static struct hda_verb alc262_hippo_unsol_verbs[] = {9856 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},9857 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},9858 {0}9859 };9860 9861 10355 static struct hda_verb alc262_hippo1_unsol_verbs[] = { 9862 10356 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0}, … … 9877 10371 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 9878 10372 {0} 9879 };9880 9881 static struct hda_input_mux alc262_dmic_capture_source = {9882 .num_items = 2,9883 .items = {9884 { "Int DMic", 0x9 },9885 { "Mic", 0x0 },9886 },9887 10373 }; 9888 10374 … … 9908 10394 }; 9909 10395 9910 static void alc262_dmic_automute(struct hda_codec *codec) 9911 { 9912 unsigned int present; 9913 9914 present = snd_hda_codec_read(codec, 0x18, 0, 9915 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 9916 snd_hda_codec_write(codec, 0x22, 0, 9917 AC_VERB_SET_CONNECT_SEL, present ? 0x0 : 0x09); 9918 } 9919 9920 /* toggle speaker-output according to the hp-jack state */ 9921 static void alc262_toshiba_s06_speaker_automute(struct hda_codec *codec) 9922 { 9923 unsigned int present; 9924 unsigned char bits; 9925 9926 present = snd_hda_codec_read(codec, 0x15, 0, 9927 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 9928 bits = present ? 0 : PIN_OUT; 9929 snd_hda_codec_write(codec, 0x14, 0, 9930 AC_VERB_SET_PIN_WIDGET_CONTROL, bits); 9931 } 9932 9933 9934 9935 /* unsolicited event for HP jack sensing */ 9936 static void alc262_toshiba_s06_unsol_event(struct hda_codec *codec, 9937 unsigned int res) 9938 { 9939 if ((res >> 26) == ALC880_HP_EVENT) 9940 alc262_toshiba_s06_speaker_automute(codec); 9941 if ((res >> 26) == ALC880_MIC_EVENT) 9942 alc262_dmic_automute(codec); 9943 9944 } 9945 9946 static void alc262_toshiba_s06_init_hook(struct hda_codec *codec) 9947 { 9948 alc262_toshiba_s06_speaker_automute(codec); 9949 alc262_dmic_automute(codec); 9950 } 9951 9952 /* mute/unmute internal speaker according to the hp jack and mute state */ 9953 static void alc262_hippo_automute(struct hda_codec *codec) 10396 static void alc262_toshiba_s06_setup(struct hda_codec *codec) 9954 10397 { 9955 10398 struct alc_spec *spec = codec->spec; 9956 unsigned int mute; 9957 unsigned int present; 9958 9959 /* need to execute and sync at first */ 9960 snd_hda_codec_read(codec, 0x15, 0, AC_VERB_SET_PIN_SENSE, 0); 9961 present = snd_hda_codec_read(codec, 0x15, 0, 9962 AC_VERB_GET_PIN_SENSE, 0); 9963 spec->jack_present = (present & 0x80000000) != 0; 9964 if (spec->jack_present) { 9965 /* mute internal speaker */ 9966 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 9967 HDA_AMP_MUTE, HDA_AMP_MUTE); 9968 } else { 9969 /* unmute internal speaker if necessary */ 9970 mute = snd_hda_codec_amp_read(codec, 0x15, 0, HDA_OUTPUT, 0); 9971 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 9972 HDA_AMP_MUTE, mute); 9973 } 9974 } 9975 9976 /* unsolicited event for HP jack sensing */ 9977 static void alc262_hippo_unsol_event(struct hda_codec *codec, 9978 unsigned int res) 9979 { 9980 if ((res >> 26) != ALC880_HP_EVENT) 9981 return; 9982 alc262_hippo_automute(codec); 9983 } 9984 9985 static void alc262_hippo1_automute(struct hda_codec *codec) 9986 { 9987 unsigned int mute; 9988 unsigned int present; 9989 9990 snd_hda_codec_read(codec, 0x1b, 0, AC_VERB_SET_PIN_SENSE, 0); 9991 present = snd_hda_codec_read(codec, 0x1b, 0, 9992 AC_VERB_GET_PIN_SENSE, 0); 9993 present = (present & 0x80000000) != 0; 9994 if (present) { 9995 /* mute internal speaker */ 9996 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 9997 HDA_AMP_MUTE, HDA_AMP_MUTE); 9998 } else { 9999 /* unmute internal speaker if necessary */ 10000 mute = snd_hda_codec_amp_read(codec, 0x1b, 0, HDA_OUTPUT, 0); 10001 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 10002 HDA_AMP_MUTE, mute); 10003 } 10004 } 10005 10006 /* unsolicited event for HP jack sensing */ 10007 static void alc262_hippo1_unsol_event(struct hda_codec *codec, 10008 unsigned int res) 10009 { 10010 if ((res >> 26) != ALC880_HP_EVENT) 10011 return; 10012 alc262_hippo1_automute(codec); 10399 10400 spec->autocfg.hp_pins[0] = 0x15; 10401 spec->autocfg.speaker_pins[0] = 0x14; 10402 spec->ext_mic.pin = 0x18; 10403 spec->ext_mic.mux_idx = 0; 10404 spec->int_mic.pin = 0x12; 10405 spec->int_mic.mux_idx = 9; 10406 spec->auto_mic = 1; 10013 10407 } 10014 10408 … … 10199 10593 } 10200 10594 10595 static int amp_stereo_mute_update(struct hda_codec *codec, hda_nid_t nid, 10596 int dir, int idx, long *valp) 10597 { 10598 int i, change = 0; 10599 10600 for (i = 0; i < 2; i++, valp++) 10601 change |= snd_hda_codec_amp_update(codec, nid, i, dir, idx, 10602 HDA_AMP_MUTE, 10603 *valp ? 0 : HDA_AMP_MUTE); 10604 return change; 10605 } 10606 10201 10607 /* bind hp and internal speaker mute (with plug check) */ 10202 10608 static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol, … … 10207 10613 int change; 10208 10614 10209 change = snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 10210 HDA_AMP_MUTE, 10211 valp ? 0 : HDA_AMP_MUTE); 10212 change |= snd_hda_codec_amp_stereo(codec, 0x1b, HDA_OUTPUT, 0, 10213 HDA_AMP_MUTE, 10214 valp ? 0 : HDA_AMP_MUTE); 10215 10615 change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp); 10616 change |= amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp); 10216 10617 if (change) 10217 10618 alc262_fujitsu_automute(codec, 0); … … 10248 10649 int change; 10249 10650 10250 change = snd_hda_codec_amp_stereo(codec, 0x1b, HDA_OUTPUT, 0, 10251 HDA_AMP_MUTE, 10252 valp ? 0 : HDA_AMP_MUTE); 10253 10651 change = amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp); 10254 10652 if (change) 10255 10653 alc262_lenovo_3000_automute(codec, 0); … … 10280 10678 static struct snd_kcontrol_new alc262_toshiba_rx1_mixer[] = { 10281 10679 HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol), 10282 { 10283 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 10284 .name = "Master Playback Switch", 10285 .info = snd_hda_mixer_amp_switch_info, 10286 .get = snd_hda_mixer_amp_switch_get, 10287 .put = alc262_sony_master_sw_put, 10288 .private_value = HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT), 10289 }, 10680 ALC262_HIPPO_MASTER_SWITCH, 10290 10681 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 10291 10682 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), … … 10431 10822 }; 10432 10823 10824 /* We use two mixers depending on the output pin; 0x16 is a mono output 10825 * and thus it's bound with a different mixer. 10826 * This function returns which mixer amp should be used. 10827 */ 10828 static int alc262_check_volbit(hda_nid_t nid) 10829 { 10830 if (!nid) 10831 return 0; 10832 else if (nid == 0x16) 10833 return 2; 10834 else 10835 return 1; 10836 } 10837 10838 static int alc262_add_out_vol_ctl(struct alc_spec *spec, hda_nid_t nid, 10839 const char *pfx, int *vbits) 10840 { 10841 char name[32]; 10842 unsigned long val; 10843 int vbit; 10844 10845 vbit = alc262_check_volbit(nid); 10846 if (!vbit) 10847 return 0; 10848 if (*vbits & vbit) /* a volume control for this mixer already there */ 10849 return 0; 10850 *vbits |= vbit; 10851 snprintf(name, sizeof(name), "%s Playback Volume", pfx); 10852 if (vbit == 2) 10853 val = HDA_COMPOSE_AMP_VAL(0x0e, 2, 0, HDA_OUTPUT); 10854 else 10855 val = HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT); 10856 return add_control(spec, ALC_CTL_WIDGET_VOL, name, val); 10857 } 10858 10859 static int alc262_add_out_sw_ctl(struct alc_spec *spec, hda_nid_t nid, 10860 const char *pfx) 10861 { 10862 char name[32]; 10863 unsigned long val; 10864 10865 if (!nid) 10866 return 0; 10867 snprintf(name, sizeof(name), "%s Playback Switch", pfx); 10868 if (nid == 0x16) 10869 val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT); 10870 else 10871 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT); 10872 return add_control(spec, ALC_CTL_WIDGET_MUTE, name, val); 10873 } 10874 10433 10875 /* add playback controls from the parsed DAC table */ 10434 10876 static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec, 10435 10877 const struct auto_pin_cfg *cfg) 10436 10878 { 10437 hda_nid_t nid; 10879 const char *pfx; 10880 int vbits; 10438 10881 int err; 10439 10882 … … 10442 10885 spec->multiout.dac_nids[0] = 2; 10443 10886 10444 nid = cfg->line_out_pins[0]; 10445 if (nid) { 10446 err = add_control(spec, ALC_CTL_WIDGET_VOL, 10447 "Front Playback Volume", 10448 HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT)); 10449 if (err < 0) 10450 return err; 10451 err = add_control(spec, ALC_CTL_WIDGET_MUTE, 10452 "Front Playback Switch", 10453 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT)); 10454 if (err < 0) 10455 return err; 10456 } 10457 10458 nid = cfg->speaker_pins[0]; 10459 if (nid) { 10460 if (nid == 0x16) { 10461 err = add_control(spec, ALC_CTL_WIDGET_VOL, 10462 "Speaker Playback Volume", 10463 HDA_COMPOSE_AMP_VAL(0x0e, 2, 0, 10464 HDA_OUTPUT)); 10465 if (err < 0) 10466 return err; 10467 err = add_control(spec, ALC_CTL_WIDGET_MUTE, 10468 "Speaker Playback Switch", 10469 HDA_COMPOSE_AMP_VAL(nid, 2, 0, 10470 HDA_OUTPUT)); 10471 if (err < 0) 10472 return err; 10473 } else { 10474 err = add_control(spec, ALC_CTL_WIDGET_MUTE, 10475 "Speaker Playback Switch", 10476 HDA_COMPOSE_AMP_VAL(nid, 3, 0, 10477 HDA_OUTPUT)); 10478 if (err < 0) 10479 return err; 10480 } 10481 } 10482 nid = cfg->hp_pins[0]; 10483 if (nid) { 10484 /* spec->multiout.hp_nid = 2; */ 10485 if (nid == 0x16) { 10486 err = add_control(spec, ALC_CTL_WIDGET_VOL, 10487 "Headphone Playback Volume", 10488 HDA_COMPOSE_AMP_VAL(0x0e, 2, 0, 10489 HDA_OUTPUT)); 10490 if (err < 0) 10491 return err; 10492 err = add_control(spec, ALC_CTL_WIDGET_MUTE, 10493 "Headphone Playback Switch", 10494 HDA_COMPOSE_AMP_VAL(nid, 2, 0, 10495 HDA_OUTPUT)); 10496 if (err < 0) 10497 return err; 10498 } else { 10499 err = add_control(spec, ALC_CTL_WIDGET_MUTE, 10500 "Headphone Playback Switch", 10501 HDA_COMPOSE_AMP_VAL(nid, 3, 0, 10502 HDA_OUTPUT)); 10503 if (err < 0) 10504 return err; 10505 } 10506 } 10887 if (!cfg->speaker_pins[0] && !cfg->hp_pins[0]) 10888 pfx = "Master"; 10889 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) 10890 pfx = "Speaker"; 10891 else 10892 pfx = "Front"; 10893 err = alc262_add_out_sw_ctl(spec, cfg->line_out_pins[0], pfx); 10894 if (err < 0) 10895 return err; 10896 err = alc262_add_out_sw_ctl(spec, cfg->speaker_pins[0], "Speaker"); 10897 if (err < 0) 10898 return err; 10899 err = alc262_add_out_sw_ctl(spec, cfg->hp_pins[0], "Headphone"); 10900 if (err < 0) 10901 return err; 10902 10903 vbits = alc262_check_volbit(cfg->line_out_pins[0]) | 10904 alc262_check_volbit(cfg->speaker_pins[0]) | 10905 alc262_check_volbit(cfg->hp_pins[0]); 10906 if (vbits == 1 || vbits == 2) 10907 pfx = "Master"; /* only one mixer is used */ 10908 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) 10909 pfx = "Speaker"; 10910 else 10911 pfx = "Front"; 10912 vbits = 0; 10913 err = alc262_add_out_vol_ctl(spec, cfg->line_out_pins[0], pfx, &vbits); 10914 if (err < 0) 10915 return err; 10916 err = alc262_add_out_vol_ctl(spec, cfg->speaker_pins[0], "Speaker", 10917 &vbits); 10918 if (err < 0) 10919 return err; 10920 err = alc262_add_out_vol_ctl(spec, cfg->hp_pins[0], "Headphone", 10921 &vbits); 10922 if (err < 0) 10923 return err; 10507 10924 return 0; 10508 10925 } 10509 10926 10510 /* identical with ALC880 */ 10511 #define alc262_auto_create_analog_input_ctls \ 10512 alc880_auto_create_analog_input_ctls 10927 #define alc262_auto_create_input_ctls \ 10928 alc880_auto_create_input_ctls 10513 10929 10514 10930 /* … … 10634 11050 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20}, 10635 11051 10636 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x70 23},11052 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, 10637 11053 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, 10638 11054 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, 10639 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x70 23},11055 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, 10640 11056 {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, 10641 11057 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 }, … … 10643 11059 10644 11060 /* FIXME: use matrix-type input source selection */ 10645 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b*/10646 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs*/11061 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 0b, 12 */ 11062 /* Input mixer1: only unmute Mic */ 10647 11063 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 10648 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, 10649 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, 10650 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, 11064 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))}, 11065 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, 11066 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, 11067 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, 11068 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))}, 11069 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))}, 11070 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))}, 11071 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))}, 10651 11072 /* Input mixer2 */ 10652 11073 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 10653 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, 10654 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, 10655 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, 11074 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))}, 11075 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, 11076 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, 11077 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, 11078 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))}, 11079 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))}, 11080 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))}, 11081 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))}, 10656 11082 /* Input mixer3 */ 10657 11083 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, 10658 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, 10659 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, 10660 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, 11084 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))}, 11085 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))}, 11086 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))}, 11087 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))}, 11088 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))}, 11089 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))}, 11090 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))}, 11091 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))}, 10661 11092 10662 11093 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, … … 10783 11214 #endif 10784 11215 10785 /* pcm configuration: identi acal with ALC880 */11216 /* pcm configuration: identical with ALC880 */ 10786 11217 #define alc262_pcm_analog_playback alc880_pcm_analog_playback 10787 11218 #define alc262_pcm_analog_capture alc880_pcm_analog_capture … … 10813 11244 if (err < 0) 10814 11245 return err; 10815 err = alc262_auto_create_ analog_input_ctls(spec, &spec->autocfg);11246 err = alc262_auto_create_input_ctls(codec, &spec->autocfg); 10816 11247 if (err < 0) 10817 11248 return err; … … 10837 11268 if (err < 0) 10838 11269 return err; 11270 11271 alc_ssid_check(codec, 0x15, 0x14, 0x1b); 10839 11272 10840 11273 return 1; … … 10910 11343 SND_PCI_QUIRK(0x104d, 0x820f, "Sony ASSAMD", ALC262_SONY_ASSAMD), 10911 11344 SND_PCI_QUIRK(0x104d, 0x9016, "Sony VAIO", ALC262_AUTO), /* dig-only */ 11345 SND_PCI_QUIRK(0x104d, 0x9025, "Sony VAIO Z21MN", ALC262_TOSHIBA_S06), 10912 11346 SND_PCI_QUIRK_MASK(0x104d, 0xff00, 0x9000, "Sony VAIO", 10913 11347 ALC262_SONY_ASSAMD), … … 10940 11374 }, 10941 11375 [ALC262_HIPPO] = { 10942 .mixers = { alc262_ base_mixer },10943 .init_verbs = { alc262_init_verbs, alc 262_hippo_unsol_verbs},11376 .mixers = { alc262_hippo_mixer }, 11377 .init_verbs = { alc262_init_verbs, alc_hp15_unsol_verbs}, 10944 11378 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 10945 11379 .dac_nids = alc262_dac_nids, … … 10950 11384 .input_mux = &alc262_capture_source, 10951 11385 .unsol_event = alc262_hippo_unsol_event, 11386 .setup = alc262_hippo_setup, 10952 11387 .init_hook = alc262_hippo_automute, 10953 11388 }, … … 10962 11397 .channel_mode = alc262_modes, 10963 11398 .input_mux = &alc262_capture_source, 10964 .unsol_event = alc262_hippo1_unsol_event, 10965 .init_hook = alc262_hippo1_automute, 11399 .unsol_event = alc262_hippo_unsol_event, 11400 .setup = alc262_hippo1_setup, 11401 .init_hook = alc262_hippo_automute, 10966 11402 }, 10967 11403 [ALC262_FUJITSU] = { … … 11025 11461 .channel_mode = alc262_modes, 11026 11462 .input_mux = &alc262_capture_source, 11027 .unsol_event = alc262_hp_t5735_unsol_event, 11028 .init_hook = alc262_hp_t5735_init_hook, 11463 .unsol_event = alc_automute_amp_unsol_event, 11464 .setup = alc262_hp_t5735_setup, 11465 .init_hook = alc_automute_amp, 11029 11466 }, 11030 11467 [ALC262_HP_RP5700] = { … … 11057 11494 .input_mux = &alc262_capture_source, 11058 11495 .unsol_event = alc262_hippo_unsol_event, 11496 .setup = alc262_hippo_setup, 11059 11497 .init_hook = alc262_hippo_automute, 11060 11498 }, 11061 11499 [ALC262_BENQ_T31] = { 11062 11500 .mixers = { alc262_benq_t31_mixer }, 11063 .init_verbs = { alc262_init_verbs, alc262_benq_t31_EAPD_verbs, alc262_hippo_unsol_verbs }, 11501 .init_verbs = { alc262_init_verbs, alc262_benq_t31_EAPD_verbs, 11502 alc_hp15_unsol_verbs }, 11064 11503 .num_dacs = ARRAY_SIZE(alc262_dac_nids), 11065 11504 .dac_nids = alc262_dac_nids, … … 11069 11508 .input_mux = &alc262_capture_source, 11070 11509 .unsol_event = alc262_hippo_unsol_event, 11510 .setup = alc262_hippo_setup, 11071 11511 .init_hook = alc262_hippo_automute, 11072 11512 }, … … 11117 11557 .dac_nids = alc262_dac_nids, 11118 11558 .adc_nids = alc262_dmic_adc_nids, /* ADC0 */ 11559 .num_adc_nids = 1, /* single ADC */ 11119 11560 .dig_out_nid = ALC262_DIGOUT_NID, 11120 11561 .num_channel_mode = ARRAY_SIZE(alc262_modes), 11121 11562 .channel_mode = alc262_modes, 11122 . input_mux = &alc262_dmic_capture_source,11123 . unsol_event = alc262_toshiba_s06_unsol_event,11124 .init_hook = alc 262_toshiba_s06_init_hook,11563 .unsol_event = alc_sku_unsol_event, 11564 .setup = alc262_toshiba_s06_setup, 11565 .init_hook = alc_inithook, 11125 11566 }, 11126 11567 [ALC262_TOSHIBA_RX1] = { … … 11134 11575 .input_mux = &alc262_capture_source, 11135 11576 .unsol_event = alc262_hippo_unsol_event, 11577 .setup = alc262_hippo_setup, 11136 11578 .init_hook = alc262_hippo_automute, 11137 11579 }, … … 11146 11588 .channel_mode = alc262_modes, 11147 11589 .input_mux = &alc262_capture_source, 11148 .unsol_event = alc262_tyan_unsol_event, 11149 .init_hook = alc262_tyan_automute, 11590 .unsol_event = alc_automute_amp_unsol_event, 11591 .setup = alc262_tyan_setup, 11592 .init_hook = alc_automute_amp, 11150 11593 }, 11151 11594 }; … … 11182 11625 11183 11626 if (board_config < 0) { 11184 printk(KERN_INFO "hda_codec: Unknown model for ALC262, "11185 "trying auto-probe from BIOS...\n");11627 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", 11628 codec->chip_name); 11186 11629 board_config = ALC262_AUTO; 11187 11630 } … … 11210 11653 11211 11654 if (board_config != ALC262_AUTO) 11212 setup_preset(spec, &alc262_presets[board_config]); 11213 11214 spec->stream_name_analog = "ALC262 Analog"; 11655 setup_preset(codec, &alc262_presets[board_config]); 11656 11215 11657 spec->stream_analog_playback = &alc262_pcm_analog_playback; 11216 11658 spec->stream_analog_capture = &alc262_pcm_analog_capture; 11217 11659 11218 spec->stream_name_digital = "ALC262 Digital";11219 11660 spec->stream_digital_playback = &alc262_pcm_digital_playback; 11220 11661 spec->stream_digital_capture = &alc262_pcm_digital_capture; 11221 11662 11222 spec->capture_style = CAPT_MIX;11223 11663 if (!spec->adc_nids && spec->input_mux) { 11224 /* check whether NID 0x07 is valid */ 11225 unsigned int wcap = get_wcaps(codec, 0x07); 11226 11227 /* get type */ 11228 wcap = (wcap & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT; 11229 if (wcap != AC_WID_AUD_IN) { 11230 spec->adc_nids = alc262_adc_nids_alt; 11231 spec->num_adc_nids = ARRAY_SIZE(alc262_adc_nids_alt); 11232 spec->capsrc_nids = alc262_capsrc_nids_alt; 11664 int i; 11665 /* check whether the digital-mic has to be supported */ 11666 for (i = 0; i < spec->input_mux->num_items; i++) { 11667 if (spec->input_mux->items[i].index >= 9) 11668 break; 11669 } 11670 if (i < spec->input_mux->num_items) { 11671 /* use only ADC0 */ 11672 spec->adc_nids = alc262_dmic_adc_nids; 11673 spec->num_adc_nids = 1; 11674 spec->capsrc_nids = alc262_dmic_capsrc_nids; 11233 11675 } else { 11234 spec->adc_nids = alc262_adc_nids; 11235 spec->num_adc_nids = ARRAY_SIZE(alc262_adc_nids); 11236 spec->capsrc_nids = alc262_capsrc_nids; 11676 /* all analog inputs */ 11677 /* check whether NID 0x07 is valid */ 11678 unsigned int wcap = get_wcaps(codec, 0x07); 11679 11680 /* get type */ 11681 wcap = get_wcaps_type(wcap); 11682 if (wcap != AC_WID_AUD_IN) { 11683 spec->adc_nids = alc262_adc_nids_alt; 11684 spec->num_adc_nids = 11685 ARRAY_SIZE(alc262_adc_nids_alt); 11686 spec->capsrc_nids = alc262_capsrc_nids_alt; 11687 } else { 11688 spec->adc_nids = alc262_adc_nids; 11689 spec->num_adc_nids = 11690 ARRAY_SIZE(alc262_adc_nids); 11691 spec->capsrc_nids = alc262_capsrc_nids; 11692 } 11237 11693 } 11238 11694 } 11239 11695 if (!spec->cap_mixer && !spec->no_analog) 11240 set_capture_mixer( spec);11696 set_capture_mixer(codec); 11241 11697 if (!spec->no_analog) 11242 11698 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); … … 11291 11747 }; 11292 11748 11749 static struct snd_kcontrol_new alc268_toshiba_mixer[] = { 11750 /* output mixer control */ 11751 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT), 11752 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT), 11753 ALC262_HIPPO_MASTER_SWITCH, 11754 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), 11755 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT), 11756 HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT), 11757 {0} 11758 }; 11759 11293 11760 /* bind Beep switches of both NID 0x0f and 0x10 */ 11294 11761 static struct hda_bind_ctls alc268_bind_beep_sw = { … … 11314 11781 11315 11782 /* Toshiba specific */ 11316 #define alc268_toshiba_automute alc262_hippo_automute11317 11318 11783 static struct hda_verb alc268_toshiba_verbs[] = { 11319 11784 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 11320 11785 {0} /* end */ 11321 };11322 11323 static struct hda_input_mux alc268_acer_lc_capture_source = {11324 .num_items = 2,11325 .items = {11326 { "i-Mic", 0x6 },11327 { "E-Mic", 0x0 },11328 },11329 11786 }; 11330 11787 … … 11370 11827 int change; 11371 11828 11372 change = snd_hda_codec_amp_update(codec, 0x14, 0, HDA_OUTPUT, 0, 11373 HDA_AMP_MUTE, 11374 valp[0] ? 0 : HDA_AMP_MUTE); 11375 change |= snd_hda_codec_amp_update(codec, 0x14, 1, HDA_OUTPUT, 0, 11376 HDA_AMP_MUTE, 11377 valp[1] ? 0 : HDA_AMP_MUTE); 11829 change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp); 11378 11830 if (change) 11379 11831 alc268_acer_automute(codec, 0); … … 11451 11903 11452 11904 /* unsolicited event for HP jack sensing */ 11453 static void alc268_toshiba_unsol_event(struct hda_codec *codec, 11454 unsigned int res) 11455 { 11456 if ((res >> 26) != ALC880_HP_EVENT) 11457 return; 11458 alc268_toshiba_automute(codec); 11459 } 11905 #define alc268_toshiba_unsol_event alc262_hippo_unsol_event 11906 #define alc268_toshiba_setup alc262_hippo_setup 11907 #define alc268_toshiba_automute alc262_hippo_automute 11460 11908 11461 11909 static void alc268_acer_unsol_event(struct hda_codec *codec, … … 11487 11935 } 11488 11936 11489 11490 static void alc268_acer_mic_automute(struct hda_codec *codec)11491 {11492 unsigned int present;11493 11494 present = snd_hda_codec_read(codec, 0x18, 0,11495 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;11496 snd_hda_codec_write(codec, 0x23, 0, AC_VERB_SET_CONNECT_SEL,11497 present ? 0x0 : 0x6);11498 }11499 11500 11937 static void alc268_acer_lc_unsol_event(struct hda_codec *codec, 11501 11938 unsigned int res) 11502 11939 { 11503 if ((res >> 26) == ALC880_HP_EVENT) 11940 switch (res >> 26) { 11941 case ALC880_HP_EVENT: 11504 11942 alc268_aspire_one_speaker_automute(codec); 11505 if ((res >> 26) == ALC880_MIC_EVENT) 11506 alc268_acer_mic_automute(codec); 11943 break; 11944 case ALC880_MIC_EVENT: 11945 alc_mic_automute(codec); 11946 break; 11947 } 11948 } 11949 11950 static void alc268_acer_lc_setup(struct hda_codec *codec) 11951 { 11952 struct alc_spec *spec = codec->spec; 11953 spec->ext_mic.pin = 0x18; 11954 spec->ext_mic.mux_idx = 0; 11955 spec->int_mic.pin = 0x12; 11956 spec->int_mic.mux_idx = 6; 11957 spec->auto_mic = 1; 11507 11958 } 11508 11959 … … 11510 11961 { 11511 11962 alc268_aspire_one_speaker_automute(codec); 11512 alc 268_acer_mic_automute(codec);11963 alc_mic_automute(codec); 11513 11964 } 11514 11965 … … 11528 11979 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, 11529 11980 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, 11981 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, 11530 11982 {0} 11531 11983 }; 11532 11984 11533 11985 /* mute/unmute internal speaker according to the hp jack and mute state */ 11534 static void alc268_dell_automute(struct hda_codec *codec) 11535 { 11536 unsigned int present; 11537 unsigned int mute; 11538 11539 present = snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_PIN_SENSE, 0); 11540 if (present & 0x80000000) 11541 mute = HDA_AMP_MUTE; 11542 else 11543 mute = snd_hda_codec_amp_read(codec, 0x15, 0, HDA_OUTPUT, 0); 11544 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 11545 HDA_AMP_MUTE, mute); 11546 } 11547 11548 static void alc268_dell_unsol_event(struct hda_codec *codec, 11549 unsigned int res) 11550 { 11551 if ((res >> 26) != ALC880_HP_EVENT) 11552 return; 11553 alc268_dell_automute(codec); 11554 } 11555 11556 #define alc268_dell_init_hook alc268_dell_automute 11986 static void alc268_dell_setup(struct hda_codec *codec) 11987 { 11988 struct alc_spec *spec = codec->spec; 11989 11990 spec->autocfg.hp_pins[0] = 0x15; 11991 spec->autocfg.speaker_pins[0] = 0x14; 11992 spec->ext_mic.pin = 0x18; 11993 spec->ext_mic.mux_idx = 0; 11994 spec->int_mic.pin = 0x19; 11995 spec->int_mic.mux_idx = 1; 11996 spec->auto_mic = 1; 11997 } 11557 11998 11558 11999 static struct snd_kcontrol_new alc267_quanta_il1_mixer[] = { … … 11574 12015 }; 11575 12016 11576 static void alc267_quanta_il1_hp_automute(struct hda_codec *codec) 11577 { 11578 unsigned int present; 11579 11580 present = snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_PIN_SENSE, 0) 11581 & AC_PINSENSE_PRESENCE; 11582 snd_hda_codec_write(codec, 0x14, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 11583 present ? 0 : PIN_OUT); 11584 } 11585 11586 static void alc267_quanta_il1_mic_automute(struct hda_codec *codec) 11587 { 11588 unsigned int present; 11589 11590 present = snd_hda_codec_read(codec, 0x18, 0, 11591 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 11592 snd_hda_codec_write(codec, 0x23, 0, 11593 AC_VERB_SET_CONNECT_SEL, 11594 present ? 0x00 : 0x01); 11595 } 11596 11597 static void alc267_quanta_il1_automute(struct hda_codec *codec) 11598 { 11599 alc267_quanta_il1_hp_automute(codec); 11600 alc267_quanta_il1_mic_automute(codec); 11601 } 11602 11603 static void alc267_quanta_il1_unsol_event(struct hda_codec *codec, 11604 unsigned int res) 11605 { 11606 switch (res >> 26) { 11607 case ALC880_HP_EVENT: 11608 alc267_quanta_il1_hp_automute(codec); 11609 break; 11610 case ALC880_MIC_EVENT: 11611 alc267_quanta_il1_mic_automute(codec); 11612 break; 11613 } 12017 static void alc267_quanta_il1_setup(struct hda_codec *codec) 12018 { 12019 struct alc_spec *spec = codec->spec; 12020 spec->autocfg.hp_pins[0] = 0x15; 12021 spec->autocfg.speaker_pins[0] = 0x14; 12022 spec->ext_mic.pin = 0x18; 12023 spec->ext_mic.mux_idx = 0; 12024 spec->int_mic.pin = 0x19; 12025 spec->int_mic.mux_idx = 1; 12026 spec->auto_mic = 1; 11614 12027 } 11615 12028 … … 11691 12104 }; 11692 12105 12106 static struct snd_kcontrol_new alc268_capture_nosrc_mixer[] = { 12107 HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT), 12108 HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT), 12109 {0} /* end */ 12110 }; 12111 11693 12112 static struct snd_kcontrol_new alc268_capture_alt_mixer[] = { 11694 12113 HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT), 11695 12114 HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT), 11696 { 11697 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 11698 /* The multiple "Capture Source" controls confuse alsamixer 11699 * So call somewhat different.. 11700 */ 11701 /* .name = "Capture Source", */ 11702 .name = "Input Source", 11703 .count = 1, 11704 .info = alc_mux_enum_info, 11705 .get = alc_mux_enum_get, 11706 .put = alc_mux_enum_put, 11707 }, 12115 _DEFINE_CAPSRC(1), 11708 12116 {0} /* end */ 11709 12117 }; … … 11714 12122 HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x24, 0x0, HDA_OUTPUT), 11715 12123 HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x24, 0x0, HDA_OUTPUT), 11716 { 11717 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 11718 /* The multiple "Capture Source" controls confuse alsamixer 11719 * So call somewhat different.. 11720 */ 11721 /* .name = "Capture Source", */ 11722 .name = "Input Source", 11723 .count = 2, 11724 .info = alc_mux_enum_info, 11725 .get = alc_mux_enum_get, 11726 .put = alc_mux_enum_put, 11727 }, 12124 _DEFINE_CAPSRC(2), 11728 12125 {0} /* end */ 11729 12126 }; … … 11812 12209 { 11813 12210 char name[32]; 12211 hda_nid_t dac; 11814 12212 int err; 11815 12213 11816 12214 sprintf(name, "%s Playback Volume", ctlname); 11817 if (nid == 0x14) { 12215 switch (nid) { 12216 case 0x14: 12217 case 0x16: 12218 dac = 0x02; 12219 break; 12220 case 0x15: 12221 dac = 0x03; 12222 break; 12223 default: 12224 return 0; 12225 } 12226 if (spec->multiout.dac_nids[0] != dac && 12227 spec->multiout.dac_nids[1] != dac) { 11818 12228 err = add_control(spec, ALC_CTL_WIDGET_VOL, name, 11819 HDA_COMPOSE_AMP_VAL( 0x02, 3, idx,12229 HDA_COMPOSE_AMP_VAL(dac, 3, idx, 11820 12230 HDA_OUTPUT)); 11821 12231 if (err < 0) 11822 12232 return err; 11823 } else if (nid == 0x15) { 11824 err = add_control(spec, ALC_CTL_WIDGET_VOL, name, 11825 HDA_COMPOSE_AMP_VAL(0x03, 3, idx, 11826 HDA_OUTPUT)); 11827 if (err < 0) 11828 return err; 11829 } else 11830 return -1; 12233 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac; 12234 } 12235 11831 12236 sprintf(name, "%s Playback Switch", ctlname); 11832 err = add_control(spec, ALC_CTL_WIDGET_MUTE, name, 12237 if (nid != 0x16) 12238 err = add_control(spec, ALC_CTL_WIDGET_MUTE, name, 11833 12239 HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_OUTPUT)); 12240 else /* mono */ 12241 err = add_control(spec, ALC_CTL_WIDGET_MUTE, name, 12242 HDA_COMPOSE_AMP_VAL(nid, 2, idx, HDA_OUTPUT)); 11834 12243 if (err < 0) 11835 12244 return err; … … 11844 12253 int err; 11845 12254 11846 spec->multiout.num_dacs = 2; /* only use one dac */11847 12255 spec->multiout.dac_nids = spec->private_dac_nids; 11848 spec->multiout.dac_nids[0] = 2;11849 spec->multiout.dac_nids[1] = 3;11850 12256 11851 12257 nid = cfg->line_out_pins[0]; 11852 if (nid) 11853 alc268_new_analog_output(spec, nid, "Front", 0); 12258 if (nid) { 12259 const char *name; 12260 if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) 12261 name = "Speaker"; 12262 else 12263 name = "Front"; 12264 err = alc268_new_analog_output(spec, nid, name, 0); 12265 if (err < 0) 12266 return err; 12267 } 11854 12268 11855 12269 nid = cfg->speaker_pins[0]; … … 11860 12274 if (err < 0) 11861 12275 return err; 12276 } else { 12277 err = alc268_new_analog_output(spec, nid, "Speaker", 0); 12278 if (err < 0) 12279 return err; 11862 12280 } 11863 12281 nid = cfg->hp_pins[0]; 11864 if (nid) 11865 alc268_new_analog_output(spec, nid, "Headphone", 0); 12282 if (nid) { 12283 err = alc268_new_analog_output(spec, nid, "Headphone", 0); 12284 if (err < 0) 12285 return err; 12286 } 11866 12287 11867 12288 nid = cfg->line_out_pins[1] | cfg->line_out_pins[2]; … … 11869 12290 err = add_control(spec, ALC_CTL_WIDGET_MUTE, 11870 12291 "Mono Playback Switch", 11871 HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_ INPUT));12292 HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT)); 11872 12293 if (err < 0) 11873 12294 return err; … … 11877 12298 11878 12299 /* create playback/capture controls for input pins */ 11879 static int alc268_auto_create_ analog_input_ctls(struct alc_spec *spec,12300 static int alc268_auto_create_input_ctls(struct hda_codec *codec, 11880 12301 const struct auto_pin_cfg *cfg) 11881 12302 { 11882 struct hda_input_mux *imux = &spec->private_imux[0]; 11883 int i, idx1; 11884 11885 for (i = 0; i < AUTO_PIN_LAST; i++) { 11886 switch(cfg->input_pins[i]) { 11887 case 0x18: 11888 idx1 = 0; /* Mic 1 */ 11889 break; 11890 case 0x19: 11891 idx1 = 1; /* Mic 2 */ 11892 break; 11893 case 0x1a: 11894 idx1 = 2; /* Line In */ 11895 break; 11896 case 0x1c: 11897 idx1 = 3; /* CD */ 11898 break; 11899 case 0x12: 11900 case 0x13: 11901 idx1 = 6; /* digital mics */ 11902 break; 11903 default: 11904 continue; 11905 } 11906 imux->items[imux->num_items].label = auto_pin_cfg_labels[i]; 11907 imux->items[imux->num_items].index = idx1; 11908 imux->num_items++; 11909 } 11910 return 0; 12303 return alc_auto_create_input_ctls(codec, cfg, 0, 0x23, 0x24); 11911 12304 } 11912 12305 … … 11955 12348 } 11956 12349 11957 /* pcm configuration: identi acal with ALC880 */12350 /* pcm configuration: identical with ALC880 */ 11958 12351 #define alc268_pcm_analog_playback alc880_pcm_analog_playback 11959 12352 #define alc268_pcm_analog_capture alc880_pcm_analog_capture … … 11985 12378 if (err < 0) 11986 12379 return err; 11987 err = alc268_auto_create_ analog_input_ctls(spec, &spec->autocfg);12380 err = alc268_auto_create_input_ctls(codec, &spec->autocfg); 11988 12381 if (err < 0) 11989 12382 return err; … … 12004 12397 12005 12398 add_verb(spec, alc268_volume_init_verbs); 12006 spec->num_mux_defs = 1;12399 spec->num_mux_defs = 2; 12007 12400 spec->input_mux = &spec->private_imux[0]; 12008 12401 … … 12010 12403 if (err < 0) 12011 12404 return err; 12405 12406 alc_ssid_check(codec, 0x15, 0x1b, 0x14); 12012 12407 12013 12408 return 1; … … 12058 12453 SND_PCI_QUIRK(0x1028, 0x0253, "Dell OEM", ALC268_DELL), 12059 12454 SND_PCI_QUIRK(0x1028, 0x02b0, "Dell Inspiron Mini9", ALC268_DELL), 12060 SND_PCI_QUIRK(0x103c, 0x30cc, "TOSHIBA", ALC268_TOSHIBA), 12455 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3000, "HP TX25xx series", 12456 ALC268_TOSHIBA), 12061 12457 SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST), 12062 SND_PCI_QUIRK(0x1179, 0xff10, "TOSHIBA A205", ALC268_TOSHIBA), 12063 SND_PCI_QUIRK(0x1179, 0xff50, "TOSHIBA A305", ALC268_TOSHIBA), 12064 SND_PCI_QUIRK(0x1179, 0xff64, "TOSHIBA L305", ALC268_TOSHIBA), 12458 SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO), 12065 12459 SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA), 12066 12460 SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER), 12067 12461 SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1), 12068 SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO), 12462 SND_PCI_QUIRK(0x1854, 0x1775, "LG R510", ALC268_DELL), 12463 {0} 12464 }; 12465 12466 /* Toshiba laptops have no unique PCI SSID but only codec SSID */ 12467 static struct snd_pci_quirk alc268_ssid_cfg_tbl[] = { 12468 SND_PCI_QUIRK(0x1179, 0xff0a, "TOSHIBA X-200", ALC268_AUTO), 12469 SND_PCI_QUIRK(0x1179, 0xff0e, "TOSHIBA X-200 HDMI", ALC268_AUTO), 12470 SND_PCI_QUIRK_MASK(0x1179, 0xff00, 0xff00, "TOSHIBA A/Lx05", 12471 ALC268_TOSHIBA), 12069 12472 {0} 12070 12473 }; … … 12072 12475 static struct alc_config_preset alc268_presets[] = { 12073 12476 [ALC267_QUANTA_IL1] = { 12074 .mixers = { alc267_quanta_il1_mixer, alc268_beep_mixer }, 12477 .mixers = { alc267_quanta_il1_mixer, alc268_beep_mixer, 12478 alc268_capture_nosrc_mixer }, 12075 12479 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs, 12076 12480 alc267_quanta_il1_verbs }, … … 12082 12486 .num_channel_mode = ARRAY_SIZE(alc268_modes), 12083 12487 .channel_mode = alc268_modes, 12084 . input_mux = &alc268_capture_source,12085 . unsol_event = alc267_quanta_il1_unsol_event,12086 .init_hook = alc 267_quanta_il1_automute,12488 .unsol_event = alc_sku_unsol_event, 12489 .setup = alc267_quanta_il1_setup, 12490 .init_hook = alc_inithook, 12087 12491 }, 12088 12492 [ALC268_3ST] = { … … 12102 12506 }, 12103 12507 [ALC268_TOSHIBA] = { 12104 .mixers = { alc268_ base_mixer, alc268_capture_alt_mixer,12508 .mixers = { alc268_toshiba_mixer, alc268_capture_alt_mixer, 12105 12509 alc268_beep_mixer }, 12106 12510 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs, … … 12116 12520 .input_mux = &alc268_capture_source, 12117 12521 .unsol_event = alc268_toshiba_unsol_event, 12522 .setup = alc268_toshiba_setup, 12118 12523 .init_hook = alc268_toshiba_automute, 12119 12524 }, 12120 12525 [ALC268_ACER] = { 12121 .mixers = { alc268_acer_mixer, alc268_capture_ alt_mixer,12526 .mixers = { alc268_acer_mixer, alc268_capture_nosrc_mixer, 12122 12527 alc268_beep_mixer }, 12123 12528 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs, … … 12155 12560 .mixers = { alc268_acer_aspire_one_mixer, 12156 12561 alc268_beep_mixer, 12157 alc268_capture_ alt_mixer },12562 alc268_capture_nosrc_mixer }, 12158 12563 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs, 12159 12564 alc268_acer_aspire_one_verbs }, … … 12166 12571 .num_channel_mode = ARRAY_SIZE(alc268_modes), 12167 12572 .channel_mode = alc268_modes, 12168 .input_mux = &alc268_acer_lc_capture_source,12169 12573 .unsol_event = alc268_acer_lc_unsol_event, 12574 .setup = alc268_acer_lc_setup, 12170 12575 .init_hook = alc268_acer_lc_init_hook, 12171 12576 }, 12172 12577 [ALC268_DELL] = { 12173 .mixers = { alc268_dell_mixer, alc268_beep_mixer }, 12578 .mixers = { alc268_dell_mixer, alc268_beep_mixer, 12579 alc268_capture_nosrc_mixer }, 12174 12580 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs, 12175 12581 alc268_dell_verbs }, 12176 12582 .num_dacs = ARRAY_SIZE(alc268_dac_nids), 12177 12583 .dac_nids = alc268_dac_nids, 12584 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt), 12585 .adc_nids = alc268_adc_nids_alt, 12586 .capsrc_nids = alc268_capsrc_nids, 12178 12587 .hp_nid = 0x02, 12179 12588 .num_channel_mode = ARRAY_SIZE(alc268_modes), 12180 12589 .channel_mode = alc268_modes, 12181 .unsol_event = alc 268_dell_unsol_event,12182 . init_hook = alc268_dell_init_hook,12183 .in put_mux = &alc268_capture_source,12590 .unsol_event = alc_sku_unsol_event, 12591 .setup = alc268_dell_setup, 12592 .init_hook = alc_inithook, 12184 12593 }, 12185 12594 [ALC268_ZEPTO] = { … … 12198 12607 .channel_mode = alc268_modes, 12199 12608 .input_mux = &alc268_capture_source, 12200 . unsol_event = alc268_toshiba_unsol_event,12201 .init_hook = alc268_toshiba_automute 12609 .setup = alc268_toshiba_setup, 12610 .init_hook = alc268_toshiba_automute, 12202 12611 }, 12203 12612 #ifdef CONFIG_SND_DEBUG … … 12236 12645 alc268_cfg_tbl); 12237 12646 12647 if (board_config < 0 || board_config >= ALC268_MODEL_LAST) 12648 board_config = snd_hda_check_board_codec_sid_config(codec, 12649 ALC882_MODEL_LAST, alc268_models, alc268_ssid_cfg_tbl); 12650 12238 12651 if (board_config < 0 || board_config >= ALC268_MODEL_LAST) { 12239 printk(KERN_INFO "hda_codec: Unknown model for ALC268, "12240 "trying auto-probe from BIOS...\n");12652 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", 12653 codec->chip_name); 12241 12654 board_config = ALC268_AUTO; 12242 12655 } … … 12257 12670 12258 12671 if (board_config != ALC268_AUTO) 12259 setup_preset(spec, &alc268_presets[board_config]); 12260 12261 if (codec->vendor_id == 0x10ec0267) { 12262 spec->stream_name_analog = "ALC267 Analog"; 12263 spec->stream_name_digital = "ALC267 Digital"; 12264 } else { 12265 spec->stream_name_analog = "ALC268 Analog"; 12266 spec->stream_name_digital = "ALC268 Digital"; 12267 } 12672 setup_preset(codec, &alc268_presets[board_config]); 12268 12673 12269 12674 spec->stream_analog_playback = &alc268_pcm_analog_playback; … … 12302 12707 12303 12708 /* get type */ 12304 wcap = (wcap & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT; 12305 if (wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) { 12709 wcap = get_wcaps_type(wcap); 12710 if (spec->auto_mic || 12711 wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) { 12306 12712 spec->adc_nids = alc268_adc_nids_alt; 12307 12713 spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt); 12308 add_mixer(spec, alc268_capture_alt_mixer); 12714 if (spec->auto_mic || spec->input_mux->num_items == 1) 12715 add_mixer(spec, alc268_capture_nosrc_mixer); 12716 else 12717 add_mixer(spec, alc268_capture_alt_mixer); 12309 12718 } else { 12310 12719 spec->adc_nids = alc268_adc_nids; … … 12317 12726 snd_hda_codec_write_cache(codec, alc268_capsrc_nids[i], 12318 12727 0, AC_VERB_SET_CONNECT_SEL, 12728 i < spec->num_mux_defs ? 12729 spec->input_mux[i].items[0].index : 12319 12730 spec->input_mux->items[0].index); 12320 12731 } … … 12350 12761 * not a mux! 12351 12762 */ 12352 12353 static struct hda_input_mux alc269_eeepc_dmic_capture_source = {12354 .num_items = 2,12355 .items = {12356 { "i-Mic", 0x5 },12357 { "e-Mic", 0x0 },12358 },12359 };12360 12361 static struct hda_input_mux alc269_eeepc_amic_capture_source = {12362 .num_items = 2,12363 .items = {12364 { "i-Mic", 0x1 },12365 { "e-Mic", 0x0 },12366 },12367 };12368 12763 12369 12764 #define alc269_modes alc260_modes … … 12429 12824 }; 12430 12825 12431 /* bind volumes of both NID 0x0c and 0x0d */12432 static struct hda_bind_ctls alc269_epc_bind_vol = {12433 .ops = &snd_hda_bind_vol,12434 .values = {12435 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),12436 HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),12437 012438 },12439 };12440 12441 12826 static struct snd_kcontrol_new alc269_eeepc_mixer[] = { 12442 HDA_CODEC_MUTE("iSpeaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 12443 HDA_BIND_VOL("LineOut Playback Volume", &alc269_epc_bind_vol), 12444 HDA_CODEC_MUTE("LineOut Playback Switch", 0x15, 0x0, HDA_OUTPUT), 12827 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 12828 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT), 12829 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 12830 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT), 12445 12831 {0} /* end */ 12446 12832 }; … … 12455 12841 12456 12842 /* FSC amilo */ 12457 static struct snd_kcontrol_new alc269_fujitsu_mixer[] = { 12458 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 12459 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), 12460 HDA_BIND_VOL("PCM Playback Volume", &alc269_epc_bind_vol), 12461 {0} /* end */ 12462 }; 12843 #define alc269_fujitsu_mixer alc269_eeepc_mixer 12463 12844 12464 12845 static struct hda_verb alc269_quanta_fl1_verbs[] = { … … 12542 12923 } 12543 12924 12544 static void alc269_quanta_fl1_mic_automute(struct hda_codec *codec)12545 {12546 unsigned int present;12547 12548 present = snd_hda_codec_read(codec, 0x18, 0,12549 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;12550 snd_hda_codec_write(codec, 0x23, 0,12551 AC_VERB_SET_CONNECT_SEL, present ? 0x0 : 0x1);12552 }12553 12554 12925 static void alc269_lifebook_mic_autoswitch(struct hda_codec *codec) 12555 12926 { … … 12578 12949 unsigned int res) 12579 12950 { 12580 if ((res >> 26) == ALC880_HP_EVENT) 12951 switch (res >> 26) { 12952 case ALC880_HP_EVENT: 12581 12953 alc269_quanta_fl1_speaker_automute(codec); 12582 if ((res >> 26) == ALC880_MIC_EVENT) 12583 alc269_quanta_fl1_mic_automute(codec); 12954 break; 12955 case ALC880_MIC_EVENT: 12956 alc_mic_automute(codec); 12957 break; 12958 } 12584 12959 } 12585 12960 … … 12593 12968 } 12594 12969 12970 static void alc269_quanta_fl1_setup(struct hda_codec *codec) 12971 { 12972 struct alc_spec *spec = codec->spec; 12973 spec->ext_mic.pin = 0x18; 12974 spec->ext_mic.mux_idx = 0; 12975 spec->int_mic.pin = 0x19; 12976 spec->int_mic.mux_idx = 1; 12977 spec->auto_mic = 1; 12978 } 12979 12595 12980 static void alc269_quanta_fl1_init_hook(struct hda_codec *codec) 12596 12981 { 12597 12982 alc269_quanta_fl1_speaker_automute(codec); 12598 alc 269_quanta_fl1_mic_automute(codec);12983 alc_mic_automute(codec); 12599 12984 } 12600 12985 … … 12641 13026 } 12642 13027 12643 static void alc269_eeepc_dmic_automute(struct hda_codec *codec)12644 {12645 unsigned int present;12646 12647 present = snd_hda_codec_read(codec, 0x18, 0,12648 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;12649 snd_hda_codec_write(codec, 0x23, 0,12650 AC_VERB_SET_CONNECT_SEL, (present ? 0 : 5));12651 }12652 12653 static void alc269_eeepc_amic_automute(struct hda_codec *codec)12654 {12655 unsigned int present;12656 12657 present = snd_hda_codec_read(codec, 0x18, 0,12658 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;12659 snd_hda_codec_write(codec, 0x24, 0, AC_VERB_SET_AMP_GAIN_MUTE,12660 0x7000 | (0x00 << 8) | (present ? 0 : 0x80));12661 snd_hda_codec_write(codec, 0x24, 0, AC_VERB_SET_AMP_GAIN_MUTE,12662 0x7000 | (0x01 << 8) | (present ? 0x80 : 0));12663 }12664 12665 13028 /* unsolicited event for HP jack sensing */ 12666 static void alc269_eeepc_ dmic_unsol_event(struct hda_codec *codec,13029 static void alc269_eeepc_unsol_event(struct hda_codec *codec, 12667 13030 unsigned int res) 12668 13031 { 12669 if ((res >> 26) == ALC880_HP_EVENT) 13032 switch (res >> 26) { 13033 case ALC880_HP_EVENT: 12670 13034 alc269_speaker_automute(codec); 12671 12672 if ((res >> 26) == ALC880_MIC_EVENT) 12673 alc269_eeepc_dmic_automute(codec); 12674 } 12675 12676 static void alc269_eeepc_dmic_inithook(struct hda_codec *codec) 13035 break; 13036 case ALC880_MIC_EVENT: 13037 alc_mic_automute(codec); 13038 break; 13039 } 13040 } 13041 13042 static void alc269_eeepc_dmic_setup(struct hda_codec *codec) 13043 { 13044 struct alc_spec *spec = codec->spec; 13045 spec->ext_mic.pin = 0x18; 13046 spec->ext_mic.mux_idx = 0; 13047 spec->int_mic.pin = 0x12; 13048 spec->int_mic.mux_idx = 5; 13049 spec->auto_mic = 1; 13050 } 13051 13052 static void alc269_eeepc_amic_setup(struct hda_codec *codec) 13053 { 13054 struct alc_spec *spec = codec->spec; 13055 spec->ext_mic.pin = 0x18; 13056 spec->ext_mic.mux_idx = 0; 13057 spec->int_mic.pin = 0x19; 13058 spec->int_mic.mux_idx = 1; 13059 spec->auto_mic = 1; 13060 } 13061 13062 static void alc269_eeepc_inithook(struct hda_codec *codec) 12677 13063 { 12678 13064 alc269_speaker_automute(codec); 12679 alc269_eeepc_dmic_automute(codec); 12680 } 12681 12682 /* unsolicited event for HP jack sensing */ 12683 static void alc269_eeepc_amic_unsol_event(struct hda_codec *codec, 12684 unsigned int res) 12685 { 12686 if ((res >> 26) == ALC880_HP_EVENT) 12687 alc269_speaker_automute(codec); 12688 12689 if ((res >> 26) == ALC880_MIC_EVENT) 12690 alc269_eeepc_amic_automute(codec); 12691 } 12692 12693 static void alc269_eeepc_amic_inithook(struct hda_codec *codec) 12694 { 12695 alc269_speaker_automute(codec); 12696 alc269_eeepc_amic_automute(codec); 13065 alc_mic_automute(codec); 12697 13066 } 12698 13067 … … 12767 13136 }; 12768 13137 12769 /* add playback controls from the parsed DAC table */ 12770 static int alc269_auto_create_multi_out_ctls(struct alc_spec *spec, 12771 const struct auto_pin_cfg *cfg) 12772 { 12773 hda_nid_t nid; 12774 int err; 12775 12776 spec->multiout.num_dacs = 1; /* only use one dac */ 12777 spec->multiout.dac_nids = spec->private_dac_nids; 12778 spec->multiout.dac_nids[0] = 2; 12779 12780 nid = cfg->line_out_pins[0]; 12781 if (nid) { 12782 err = add_control(spec, ALC_CTL_WIDGET_VOL, 12783 "Front Playback Volume", 12784 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT)); 12785 if (err < 0) 12786 return err; 12787 err = add_control(spec, ALC_CTL_WIDGET_MUTE, 12788 "Front Playback Switch", 12789 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT)); 12790 if (err < 0) 12791 return err; 12792 } 12793 12794 nid = cfg->speaker_pins[0]; 12795 if (nid) { 12796 if (!cfg->line_out_pins[0]) { 12797 err = add_control(spec, ALC_CTL_WIDGET_VOL, 12798 "Speaker Playback Volume", 12799 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, 12800 HDA_OUTPUT)); 12801 if (err < 0) 12802 return err; 12803 } 12804 if (nid == 0x16) { 12805 err = add_control(spec, ALC_CTL_WIDGET_MUTE, 12806 "Speaker Playback Switch", 12807 HDA_COMPOSE_AMP_VAL(nid, 2, 0, 12808 HDA_OUTPUT)); 12809 if (err < 0) 12810 return err; 12811 } else { 12812 err = add_control(spec, ALC_CTL_WIDGET_MUTE, 12813 "Speaker Playback Switch", 12814 HDA_COMPOSE_AMP_VAL(nid, 3, 0, 12815 HDA_OUTPUT)); 12816 if (err < 0) 12817 return err; 12818 } 12819 } 12820 nid = cfg->hp_pins[0]; 12821 if (nid) { 12822 /* spec->multiout.hp_nid = 2; */ 12823 if (!cfg->line_out_pins[0] && !cfg->speaker_pins[0]) { 12824 err = add_control(spec, ALC_CTL_WIDGET_VOL, 12825 "Headphone Playback Volume", 12826 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, 12827 HDA_OUTPUT)); 12828 if (err < 0) 12829 return err; 12830 } 12831 if (nid == 0x16) { 12832 err = add_control(spec, ALC_CTL_WIDGET_MUTE, 12833 "Headphone Playback Switch", 12834 HDA_COMPOSE_AMP_VAL(nid, 2, 0, 12835 HDA_OUTPUT)); 12836 if (err < 0) 12837 return err; 12838 } else { 12839 err = add_control(spec, ALC_CTL_WIDGET_MUTE, 12840 "Headphone Playback Switch", 12841 HDA_COMPOSE_AMP_VAL(nid, 3, 0, 12842 HDA_OUTPUT)); 12843 if (err < 0) 12844 return err; 12845 } 12846 } 12847 return 0; 12848 } 12849 12850 static int alc269_auto_create_analog_input_ctls(struct alc_spec *spec, 12851 const struct auto_pin_cfg *cfg) 12852 { 12853 int err; 12854 12855 err = alc880_auto_create_analog_input_ctls(spec, cfg); 12856 if (err < 0) 12857 return err; 12858 /* digital-mic input pin is excluded in alc880_auto_create..() 12859 * because it's under 0x18 12860 */ 12861 if (cfg->input_pins[AUTO_PIN_MIC] == 0x12 || 12862 cfg->input_pins[AUTO_PIN_FRONT_MIC] == 0x12) { 12863 struct hda_input_mux *imux = &spec->private_imux[0]; 12864 imux->items[imux->num_items].label = "Int Mic"; 12865 imux->items[imux->num_items].index = 0x05; 12866 imux->num_items++; 12867 } 12868 return 0; 12869 } 13138 #define alc269_auto_create_multi_out_ctls \ 13139 alc268_auto_create_multi_out_ctls 13140 #define alc269_auto_create_input_ctls \ 13141 alc268_auto_create_input_ctls 12870 13142 12871 13143 #ifdef CONFIG_SND_HDA_POWER_SAVE … … 12873 13145 #endif 12874 13146 12875 /* pcm configuration: identi acal with ALC880 */13147 /* pcm configuration: identical with ALC880 */ 12876 13148 #define alc269_pcm_analog_playback alc880_pcm_analog_playback 12877 13149 #define alc269_pcm_analog_capture alc880_pcm_analog_capture … … 12917 13189 if (err < 0) 12918 13190 return err; 12919 err = alc269_auto_create_ analog_input_ctls(spec, &spec->autocfg);13191 err = alc269_auto_create_input_ctls(codec, &spec->autocfg); 12920 13192 if (err < 0) 12921 13193 return err; … … 12942 13214 12943 13215 if (!spec->cap_mixer && !spec->no_analog) 12944 set_capture_mixer(spec); 13216 set_capture_mixer(codec); 13217 13218 alc_ssid_check(codec, 0x15, 0x1b, 0x14); 12945 13219 12946 13220 return 1; … … 13016 13290 .input_mux = &alc269_capture_source, 13017 13291 .unsol_event = alc269_quanta_fl1_unsol_event, 13292 .setup = alc269_quanta_fl1_setup, 13018 13293 .init_hook = alc269_quanta_fl1_init_hook, 13019 13294 }, … … 13028 13303 .num_channel_mode = ARRAY_SIZE(alc269_modes), 13029 13304 .channel_mode = alc269_modes, 13030 . input_mux = &alc269_eeepc_amic_capture_source,13031 . unsol_event = alc269_eeepc_amic_unsol_event,13032 .init_hook = alc269_eeepc_ amic_inithook,13305 .unsol_event = alc269_eeepc_unsol_event, 13306 .setup = alc269_eeepc_amic_setup, 13307 .init_hook = alc269_eeepc_inithook, 13033 13308 }, 13034 13309 [ALC269_ASUS_EEEPC_P901] = { … … 13042 13317 .num_channel_mode = ARRAY_SIZE(alc269_modes), 13043 13318 .channel_mode = alc269_modes, 13044 . input_mux = &alc269_eeepc_dmic_capture_source,13045 . unsol_event = alc269_eeepc_dmic_unsol_event,13046 .init_hook = alc269_eeepc_ dmic_inithook,13319 .unsol_event = alc269_eeepc_unsol_event, 13320 .setup = alc269_eeepc_dmic_setup, 13321 .init_hook = alc269_eeepc_inithook, 13047 13322 }, 13048 13323 [ALC269_FUJITSU] = { … … 13056 13331 .num_channel_mode = ARRAY_SIZE(alc269_modes), 13057 13332 .channel_mode = alc269_modes, 13058 . input_mux = &alc269_eeepc_dmic_capture_source,13059 . unsol_event = alc269_eeepc_dmic_unsol_event,13060 .init_hook = alc269_eeepc_ dmic_inithook,13333 .unsol_event = alc269_eeepc_unsol_event, 13334 .setup = alc269_eeepc_dmic_setup, 13335 .init_hook = alc269_eeepc_inithook, 13061 13336 }, 13062 13337 [ALC269_LIFEBOOK] = { … … 13093 13368 13094 13369 if (board_config < 0) { 13095 printk(KERN_INFO "hda_codec: Unknown model for ALC269, "13096 "trying auto-probe from BIOS...\n");13370 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", 13371 codec->chip_name); 13097 13372 board_config = ALC269_AUTO; 13098 13373 } … … 13119 13394 13120 13395 if (board_config != ALC269_AUTO) 13121 setup_preset(spec, &alc269_presets[board_config]); 13122 13123 spec->stream_name_analog = "ALC269 Analog"; 13396 setup_preset(codec, &alc269_presets[board_config]); 13397 13124 13398 if (codec->subsystem_id == 0x17aa3bf8) { 13125 13399 /* Due to a hardware problem on Lenovo Ideadpad, we need to … … 13132 13406 spec->stream_analog_capture = &alc269_pcm_analog_capture; 13133 13407 } 13134 spec->stream_name_digital = "ALC269 Digital";13135 13408 spec->stream_digital_playback = &alc269_pcm_digital_playback; 13136 13409 spec->stream_digital_capture = &alc269_pcm_digital_capture; … … 13140 13413 spec->capsrc_nids = alc269_capsrc_nids; 13141 13414 if (!spec->cap_mixer) 13142 set_capture_mixer( spec);13415 set_capture_mixer(codec); 13143 13416 set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT); 13417 13418 spec->vmaster_nid = 0x02; 13144 13419 13145 13420 codec->patch_ops = alc_patch_ops; … … 13282 13557 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT), 13283 13558 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT), 13559 13284 13560 {0} /* end */ 13285 13561 }; … … 13687 13963 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, 13688 13964 13689 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_ UNMUTE(0)},13690 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_ UNMUTE(1)},13691 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_ UNMUTE(0)},13692 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_ UNMUTE(1)},13693 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_ UNMUTE(0)},13694 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_ UNMUTE(1)},13695 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_ UNMUTE(0)},13696 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_ UNMUTE(1)},13965 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 13966 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 13967 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 13968 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 13969 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 13970 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 13971 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 13972 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 13697 13973 13698 13974 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 13699 13975 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 13700 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_ UNMUTE(2)},13701 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_ UNMUTE(3)},13976 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 13977 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 13702 13978 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 13703 13979 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 13704 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_ UNMUTE(2)},13705 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_ UNMUTE(3)},13980 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 13981 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 13706 13982 13707 13983 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, /* set Mic 1 */ … … 13736 14012 } 13737 14013 13738 /* pcm configuration: identi acal with ALC880 */14014 /* pcm configuration: identical with ALC880 */ 13739 14015 #define alc861_pcm_analog_playback alc880_pcm_analog_playback 13740 14016 #define alc861_pcm_analog_capture alc880_pcm_analog_capture … … 13775 14051 }; 13776 14052 14053 static hda_nid_t alc861_look_for_dac(struct hda_codec *codec, hda_nid_t pin) 14054 { 14055 struct alc_spec *spec = codec->spec; 14056 hda_nid_t mix, srcs[5]; 14057 int i, j, num; 14058 14059 if (snd_hda_get_connections(codec, pin, &mix, 1) != 1) 14060 return 0; 14061 num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs)); 14062 if (num < 0) 14063 return 0; 14064 for (i = 0; i < num; i++) { 14065 unsigned int type; 14066 type = get_wcaps_type(get_wcaps(codec, srcs[i])); 14067 if (type != AC_WID_AUD_OUT) 14068 continue; 14069 for (j = 0; j < spec->multiout.num_dacs; j++) 14070 if (spec->multiout.dac_nids[j] == srcs[i]) 14071 break; 14072 if (j >= spec->multiout.num_dacs) 14073 return srcs[i]; 14074 } 14075 return 0; 14076 } 14077 13777 14078 /* fill in the dac_nids table from the parsed pin configuration */ 13778 static int alc861_auto_fill_dac_nids(struct alc_spec *spec,14079 static int alc861_auto_fill_dac_nids(struct hda_codec *codec, 13779 14080 const struct auto_pin_cfg *cfg) 13780 14081 { 14082 struct alc_spec *spec = codec->spec; 13781 14083 int i; 13782 hda_nid_t nid ;14084 hda_nid_t nid, dac; 13783 14085 13784 14086 spec->multiout.dac_nids = spec->private_dac_nids; 13785 14087 for (i = 0; i < cfg->line_outs; i++) { 13786 14088 nid = cfg->line_out_pins[i]; 13787 if (nid) { 13788 if (i >= ARRAY_SIZE(alc861_dac_nids)) 13789 continue; 13790 spec->multiout.dac_nids[i] = alc861_dac_nids[i]; 13791 } 14089 dac = alc861_look_for_dac(codec, nid); 14090 if (!dac) 14091 continue; 14092 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac; 13792 14093 } 13793 spec->multiout.num_dacs = cfg->line_outs;13794 14094 return 0; 13795 14095 } 13796 14096 14097 static int alc861_create_out_sw(struct hda_codec *codec, const char *pfx, 14098 hda_nid_t nid, unsigned int chs) 14099 { 14100 char name[32]; 14101 snprintf(name, sizeof(name), "%s Playback Switch", pfx); 14102 return add_control(codec->spec, ALC_CTL_WIDGET_MUTE, name, 14103 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT)); 14104 } 14105 13797 14106 /* add playback controls from the parsed DAC table */ 13798 static int alc861_auto_create_multi_out_ctls(struct alc_spec *spec,14107 static int alc861_auto_create_multi_out_ctls(struct hda_codec *codec, 13799 14108 const struct auto_pin_cfg *cfg) 13800 14109 { 13801 char name[32];14110 struct alc_spec *spec = codec->spec; 13802 14111 static const char *chname[4] = { 13803 14112 "Front", "Surround", NULL /*CLFE*/, "Side" 13804 14113 }; 13805 14114 hda_nid_t nid; 13806 int i, idx, err; 14115 int i, err; 14116 14117 if (cfg->line_outs == 1) { 14118 const char *pfx = NULL; 14119 if (!cfg->hp_outs) 14120 pfx = "Master"; 14121 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) 14122 pfx = "Speaker"; 14123 if (pfx) { 14124 nid = spec->multiout.dac_nids[0]; 14125 return alc861_create_out_sw(codec, pfx, nid, 3); 14126 } 14127 } 13807 14128 13808 14129 for (i = 0; i < cfg->line_outs; i++) { … … 13810 14131 if (!nid) 13811 14132 continue; 13812 if ( nid == 0x05) {14133 if (i == 2) { 13813 14134 /* Center/LFE */ 13814 err = add_control(spec, ALC_CTL_BIND_MUTE, 13815 "Center Playback Switch", 13816 HDA_COMPOSE_AMP_VAL(nid, 1, 0, 13817 HDA_OUTPUT)); 14135 err = alc861_create_out_sw(codec, "Center", nid, 1); 13818 14136 if (err < 0) 13819 14137 return err; 13820 err = add_control(spec, ALC_CTL_BIND_MUTE, 13821 "LFE Playback Switch", 13822 HDA_COMPOSE_AMP_VAL(nid, 2, 0, 13823 HDA_OUTPUT)); 14138 err = alc861_create_out_sw(codec, "LFE", nid, 2); 13824 14139 if (err < 0) 13825 14140 return err; 13826 14141 } else { 13827 for (idx = 0; idx < ARRAY_SIZE(alc861_dac_nids) - 1; 13828 idx++) 13829 if (nid == alc861_dac_nids[idx]) 13830 break; 13831 sprintf(name, "%s Playback Switch", chname[idx]); 13832 err = add_control(spec, ALC_CTL_BIND_MUTE, name, 13833 HDA_COMPOSE_AMP_VAL(nid, 3, 0, 13834 HDA_OUTPUT)); 14142 err = alc861_create_out_sw(codec, chname[i], nid, 3); 13835 14143 if (err < 0) 13836 14144 return err; … … 13840 14148 } 13841 14149 13842 static int alc861_auto_create_hp_ctls(struct alc_spec *spec, hda_nid_t pin) 13843 { 14150 static int alc861_auto_create_hp_ctls(struct hda_codec *codec, hda_nid_t pin) 14151 { 14152 struct alc_spec *spec = codec->spec; 13844 14153 int err; 13845 14154 hda_nid_t nid; … … 13849 14158 13850 14159 if ((pin >= 0x0b && pin <= 0x10) || pin == 0x1f || pin == 0x20) { 13851 nid = 0x03;13852 err = add_control(spec, ALC_CTL_WIDGET_MUTE,13853 "Headphone Playback Switch",13854 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT));13855 if (err < 0)13856 return err;13857 spec->multiout.hp_nid = nid;14160 nid = alc861_look_for_dac(codec, pin); 14161 if (nid) { 14162 err = alc861_create_out_sw(codec, "Headphone", nid, 3); 14163 if (err < 0) 14164 return err; 14165 spec->multiout.hp_nid = nid; 14166 } 13858 14167 } 13859 14168 return 0; … … 13861 14170 13862 14171 /* create playback/capture controls for input pins */ 13863 static int alc861_auto_create_ analog_input_ctls(struct alc_spec *spec,14172 static int alc861_auto_create_input_ctls(struct hda_codec *codec, 13864 14173 const struct auto_pin_cfg *cfg) 13865 14174 { 13866 struct hda_input_mux *imux = &spec->private_imux[0]; 13867 int i, err, idx, idx1; 13868 13869 for (i = 0; i < AUTO_PIN_LAST; i++) { 13870 switch (cfg->input_pins[i]) { 13871 case 0x0c: 13872 idx1 = 1; 13873 idx = 2; /* Line In */ 13874 break; 13875 case 0x0f: 13876 idx1 = 2; 13877 idx = 2; /* Line In */ 13878 break; 13879 case 0x0d: 13880 idx1 = 0; 13881 idx = 1; /* Mic In */ 13882 break; 13883 case 0x10: 13884 idx1 = 3; 13885 idx = 1; /* Mic In */ 13886 break; 13887 case 0x11: 13888 idx1 = 4; 13889 idx = 0; /* CD */ 13890 break; 13891 default: 13892 continue; 13893 } 13894 13895 err = new_analog_input(spec, cfg->input_pins[i], 13896 auto_pin_cfg_labels[i], idx, 0x15); 13897 if (err < 0) 13898 return err; 13899 13900 imux->items[imux->num_items].label = auto_pin_cfg_labels[i]; 13901 imux->items[imux->num_items].index = idx1; 13902 imux->num_items++; 13903 } 13904 return 0; 14175 return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x08, 0); 13905 14176 } 13906 14177 13907 14178 static void alc861_auto_set_output_and_unmute(struct hda_codec *codec, 13908 14179 hda_nid_t nid, 13909 int pin_type, int dac_idx) 13910 { 14180 int pin_type, hda_nid_t dac) 14181 { 14182 hda_nid_t mix, srcs[5]; 14183 int i, num; 14184 13911 14185 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 13912 14186 pin_type); 13913 snd_hda_codec_write(codec, dac _idx, 0, AC_VERB_SET_AMP_GAIN_MUTE,14187 snd_hda_codec_write(codec, dac, 0, AC_VERB_SET_AMP_GAIN_MUTE, 13914 14188 AMP_OUT_UNMUTE); 14189 if (snd_hda_get_connections(codec, nid, &mix, 1) != 1) 14190 return; 14191 num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs)); 14192 if (num < 0) 14193 return; 14194 for (i = 0; i < num; i++) { 14195 unsigned int mute; 14196 if (srcs[i] == dac || srcs[i] == 0x15) 14197 mute = AMP_IN_UNMUTE(i); 14198 else 14199 mute = AMP_IN_MUTE(i); 14200 snd_hda_codec_write(codec, mix, 0, AC_VERB_SET_AMP_GAIN_MUTE, 14201 mute); 14202 } 13915 14203 } 13916 14204 … … 13920 14208 int i; 13921 14209 13922 alc_subsystem_id(codec, 0x0e, 0x0f, 0x0b);13923 14210 for (i = 0; i < spec->autocfg.line_outs; i++) { 13924 14211 hda_nid_t nid = spec->autocfg.line_out_pins[i]; … … 13936 14223 13937 14224 pin = spec->autocfg.hp_pins[0]; 13938 if (pin) /* connect to front */14225 if (pin) 13939 14226 alc861_auto_set_output_and_unmute(codec, pin, PIN_HP, 13940 spec->multiout. dac_nids[0]);14227 spec->multiout.hp_nid); 13941 14228 pin = spec->autocfg.speaker_pins[0]; 13942 14229 if (pin) 13943 alc861_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0); 14230 alc861_auto_set_output_and_unmute(codec, pin, PIN_OUT, 14231 spec->multiout.dac_nids[0]); 13944 14232 } 13945 14233 … … 13973 14261 return 0; /* can't find valid BIOS pin config */ 13974 14262 13975 err = alc861_auto_fill_dac_nids( spec, &spec->autocfg);14263 err = alc861_auto_fill_dac_nids(codec, &spec->autocfg); 13976 14264 if (err < 0) 13977 14265 return err; 13978 err = alc861_auto_create_multi_out_ctls( spec, &spec->autocfg);14266 err = alc861_auto_create_multi_out_ctls(codec, &spec->autocfg); 13979 14267 if (err < 0) 13980 14268 return err; 13981 err = alc861_auto_create_hp_ctls( spec, spec->autocfg.hp_pins[0]);14269 err = alc861_auto_create_hp_ctls(codec, spec->autocfg.hp_pins[0]); 13982 14270 if (err < 0) 13983 14271 return err; 13984 err = alc861_auto_create_ analog_input_ctls(spec, &spec->autocfg);14272 err = alc861_auto_create_input_ctls(codec, &spec->autocfg); 13985 14273 if (err < 0) 13986 14274 return err; … … 14001 14289 spec->adc_nids = alc861_adc_nids; 14002 14290 spec->num_adc_nids = ARRAY_SIZE(alc861_adc_nids); 14003 set_capture_mixer(spec); 14291 set_capture_mixer(codec); 14292 14293 alc_ssid_check(codec, 0x0e, 0x0f, 0x0b); 14004 14294 14005 14295 return 1; … … 14192 14482 14193 14483 if (board_config < 0) { 14194 printk(KERN_INFO "hda_codec: Unknown model for ALC861, "14195 "trying auto-probe from BIOS...\n");14484 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", 14485 codec->chip_name); 14196 14486 board_config = ALC861_AUTO; 14197 14487 } … … 14218 14508 14219 14509 if (board_config != ALC861_AUTO) 14220 setup_preset(spec, &alc861_presets[board_config]); 14221 14222 spec->stream_name_analog = "ALC861 Analog"; 14510 setup_preset(codec, &alc861_presets[board_config]); 14511 14223 14512 spec->stream_analog_playback = &alc861_pcm_analog_playback; 14224 14513 spec->stream_analog_capture = &alc861_pcm_analog_capture; 14225 14514 14226 spec->stream_name_digital = "ALC861 Digital";14227 14515 spec->stream_digital_playback = &alc861_pcm_digital_playback; 14228 14516 spec->stream_digital_capture = &alc861_pcm_digital_capture; … … 14260 14548 /* dac_nids for ALC660vd are in a different order - according to 14261 14549 * Realtek's driver. 14262 * This should probably tesult in a different mixer for 6stack models14550 * This should probably result in a different mixer for 6stack models 14263 14551 * of ALC660vd codecs, but for now there is only 3stack mixer 14264 14552 * - and it is the same as in 861vd. … … 14611 14899 }; 14612 14900 14613 /* toggle speaker-output according to the hp-jack state */14614 static void alc861vd_lenovo_hp_automute(struct hda_codec *codec)14615 {14616 unsigned int present;14617 unsigned char bits;14618 14619 present = snd_hda_codec_read(codec, 0x1b, 0,14620 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;14621 bits = present ? HDA_AMP_MUTE : 0;14622 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,14623 HDA_AMP_MUTE, bits);14624 }14625 14626 14901 static void alc861vd_lenovo_mic_automute(struct hda_codec *codec) 14627 14902 { … … 14636 14911 } 14637 14912 14638 static void alc861vd_lenovo_automute(struct hda_codec *codec) 14639 { 14640 alc861vd_lenovo_hp_automute(codec); 14913 static void alc861vd_lenovo_setup(struct hda_codec *codec) 14914 { 14915 struct alc_spec *spec = codec->spec; 14916 spec->autocfg.hp_pins[0] = 0x1b; 14917 spec->autocfg.speaker_pins[0] = 0x14; 14918 } 14919 14920 static void alc861vd_lenovo_init_hook(struct hda_codec *codec) 14921 { 14922 alc_automute_amp(codec); 14641 14923 alc861vd_lenovo_mic_automute(codec); 14642 14924 } … … 14646 14928 { 14647 14929 switch (res >> 26) { 14648 case ALC880_HP_EVENT:14649 alc861vd_lenovo_hp_automute(codec);14650 break;14651 14930 case ALC880_MIC_EVENT: 14652 14931 alc861vd_lenovo_mic_automute(codec); 14932 break; 14933 default: 14934 alc_automute_amp_unsol_event(codec, res); 14653 14935 break; 14654 14936 } … … 14701 14983 14702 14984 /* toggle speaker-output according to the hp-jack state */ 14703 static void alc861vd_dallas_automute(struct hda_codec *codec) 14704 { 14705 unsigned int present; 14706 14707 present = snd_hda_codec_read(codec, 0x15, 0, 14708 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 14709 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 14710 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 14711 } 14712 14713 static void alc861vd_dallas_unsol_event(struct hda_codec *codec, unsigned int res) 14714 { 14715 if ((res >> 26) == ALC880_HP_EVENT) 14716 alc861vd_dallas_automute(codec); 14985 static void alc861vd_dallas_setup(struct hda_codec *codec) 14986 { 14987 struct alc_spec *spec = codec->spec; 14988 14989 spec->autocfg.hp_pins[0] = 0x15; 14990 spec->autocfg.speaker_pins[0] = 0x14; 14717 14991 } 14718 14992 … … 14721 14995 #endif 14722 14996 14723 /* pcm configuration: identi acal with ALC880 */14997 /* pcm configuration: identical with ALC880 */ 14724 14998 #define alc861vd_pcm_analog_playback alc880_pcm_analog_playback 14725 14999 #define alc861vd_pcm_analog_capture alc880_pcm_analog_capture … … 14753 15027 SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba A135", ALC861VD_LENOVO), 14754 15028 /*SND_PCI_QUIRK(0x1179, 0xff00, "DALLAS", ALC861VD_DALLAS),*/ /*lenovo*/ 14755 SND_PCI_QUIRK(0x1179, 0xff01, " DALLAS", ALC861VD_DALLAS),15029 SND_PCI_QUIRK(0x1179, 0xff01, "Toshiba A135", ALC861VD_LENOVO), 14756 15030 SND_PCI_QUIRK(0x1179, 0xff03, "Toshiba P205", ALC861VD_LENOVO), 14757 15031 SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_DALLAS), … … 14828 15102 .input_mux = &alc861vd_capture_source, 14829 15103 .unsol_event = alc861vd_lenovo_unsol_event, 14830 .init_hook = alc861vd_lenovo_automute, 15104 .setup = alc861vd_lenovo_setup, 15105 .init_hook = alc861vd_lenovo_init_hook, 14831 15106 }, 14832 15107 [ALC861VD_DALLAS] = { … … 14838 15113 .channel_mode = alc861vd_3stack_2ch_modes, 14839 15114 .input_mux = &alc861vd_dallas_capture_source, 14840 .unsol_event = alc861vd_dallas_unsol_event, 14841 .init_hook = alc861vd_dallas_automute, 15115 .unsol_event = alc_automute_amp_unsol_event, 15116 .setup = alc861vd_dallas_setup, 15117 .init_hook = alc_automute_amp, 14842 15118 }, 14843 15119 [ALC861VD_HP] = { … … 14850 15126 .channel_mode = alc861vd_3stack_2ch_modes, 14851 15127 .input_mux = &alc861vd_hp_capture_source, 14852 .unsol_event = alc861vd_dallas_unsol_event, 14853 .init_hook = alc861vd_dallas_automute, 15128 .unsol_event = alc_automute_amp_unsol_event, 15129 .setup = alc861vd_dallas_setup, 15130 .init_hook = alc_automute_amp, 14854 15131 }, 14855 15132 [ALC660VD_ASUS_V1S] = { … … 14866 15143 .input_mux = &alc861vd_capture_source, 14867 15144 .unsol_event = alc861vd_lenovo_unsol_event, 14868 .init_hook = alc861vd_lenovo_automute, 15145 .setup = alc861vd_lenovo_setup, 15146 .init_hook = alc861vd_lenovo_init_hook, 14869 15147 }, 14870 15148 }; … … 14873 15151 * BIOS auto configuration 14874 15152 */ 15153 static int alc861vd_auto_create_input_ctls(struct hda_codec *codec, 15154 const struct auto_pin_cfg *cfg) 15155 { 15156 return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x09, 0); 15157 } 15158 15159 14875 15160 static void alc861vd_auto_set_output_and_unmute(struct hda_codec *codec, 14876 15161 hda_nid_t nid, int pin_type, int dac_idx) … … 14884 15169 int i; 14885 15170 14886 alc_subsystem_id(codec, 0x15, 0x1b, 0x14);14887 15171 for (i = 0; i <= HDA_SIDE; i++) { 14888 15172 hda_nid_t nid = spec->autocfg.line_out_pins[i]; … … 14901 15185 14902 15186 pin = spec->autocfg.hp_pins[0]; 14903 if (pin) /* connect to front and 15187 if (pin) /* connect to front and use dac 0 */ 14904 15188 alc861vd_auto_set_output_and_unmute(codec, pin, PIN_HP, 0); 14905 15189 pin = spec->autocfg.speaker_pins[0]; … … 14908 15192 } 14909 15193 14910 #define alc861vd_is_input_pin(nid) alc880_is_input_pin(nid)14911 15194 #define ALC861VD_PIN_CD_NID ALC880_PIN_CD_NID 14912 15195 … … 14918 15201 for (i = 0; i < AUTO_PIN_LAST; i++) { 14919 15202 hda_nid_t nid = spec->autocfg.input_pins[i]; 14920 if (alc 861vd_is_input_pin(nid)) {15203 if (alc_is_input_pin(codec, nid)) { 14921 15204 alc_set_input_pin(codec, nid, i); 14922 15205 if (nid != ALC861VD_PIN_CD_NID && … … 14982 15265 return err; 14983 15266 } else { 14984 sprintf(name, "%s Playback Volume", chname[i]); 15267 const char *pfx; 15268 if (cfg->line_outs == 1 && 15269 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) { 15270 if (!cfg->hp_pins) 15271 pfx = "Speaker"; 15272 else 15273 pfx = "PCM"; 15274 } else 15275 pfx = chname[i]; 15276 sprintf(name, "%s Playback Volume", pfx); 14985 15277 err = add_control(spec, ALC_CTL_WIDGET_VOL, name, 14986 15278 HDA_COMPOSE_AMP_VAL(nid_v, 3, 0, … … 14988 15280 if (err < 0) 14989 15281 return err; 14990 sprintf(name, "%s Playback Switch", chname[i]); 15282 if (cfg->line_outs == 1 && 15283 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) 15284 pfx = "Speaker"; 15285 sprintf(name, "%s Playback Switch", pfx); 14991 15286 err = add_control(spec, ALC_CTL_BIND_MUTE, name, 14992 15287 HDA_COMPOSE_AMP_VAL(nid_s, 3, 2, … … 15081 15376 if (err < 0) 15082 15377 return err; 15083 err = alc8 80_auto_create_analog_input_ctls(spec, &spec->autocfg);15378 err = alc861vd_auto_create_input_ctls(codec, &spec->autocfg); 15084 15379 if (err < 0) 15085 15380 return err; … … 15101 15396 if (err < 0) 15102 15397 return err; 15398 15399 alc_ssid_check(codec, 0x15, 0x1b, 0x14); 15103 15400 15104 15401 return 1; … … 15133 15430 15134 15431 if (board_config < 0 || board_config >= ALC861VD_MODEL_LAST) { 15135 printk(KERN_INFO "hda_codec: Unknown model for ALC660VD/"15136 "ALC861VD, trying auto-probe from BIOS...\n");15432 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", 15433 codec->chip_name); 15137 15434 board_config = ALC861VD_AUTO; 15138 15435 } … … 15159 15456 15160 15457 if (board_config != ALC861VD_AUTO) 15161 setup_preset( spec, &alc861vd_presets[board_config]);15458 setup_preset(codec, &alc861vd_presets[board_config]); 15162 15459 15163 15460 if (codec->vendor_id == 0x10ec0660) { 15164 spec->stream_name_analog = "ALC660-VD Analog";15165 spec->stream_name_digital = "ALC660-VD Digital";15166 15461 /* always turn on EAPD */ 15167 15462 add_verb(spec, alc660vd_eapd_verbs); 15168 } else {15169 spec->stream_name_analog = "ALC861VD Analog";15170 spec->stream_name_digital = "ALC861VD Digital";15171 15463 } 15172 15464 … … 15177 15469 spec->stream_digital_capture = &alc861vd_pcm_digital_capture; 15178 15470 15179 spec->adc_nids = alc861vd_adc_nids; 15180 spec->num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids); 15181 spec->capsrc_nids = alc861vd_capsrc_nids; 15182 spec->capture_style = CAPT_MIX; 15183 15184 set_capture_mixer(spec); 15471 if (!spec->adc_nids) { 15472 spec->adc_nids = alc861vd_adc_nids; 15473 spec->num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids); 15474 } 15475 if (!spec->capsrc_nids) 15476 spec->capsrc_nids = alc861vd_capsrc_nids; 15477 15478 set_capture_mixer(codec); 15185 15479 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); 15186 15480 … … 15223 15517 }; 15224 15518 15225 static hda_nid_t alc662_adc_nids[ 1] = {15519 static hda_nid_t alc662_adc_nids[2] = { 15226 15520 /* ADC1-2 */ 15227 0x09, 15521 0x09, 0x08 15228 15522 }; 15229 15523 … … 15233 15527 }; 15234 15528 15235 static hda_nid_t alc662_capsrc_nids[ 1] = { 0x22};15529 static hda_nid_t alc662_capsrc_nids[2] = { 0x22, 0x23 }; 15236 15530 static hda_nid_t alc272_capsrc_nids[1] = { 0x23 }; 15237 15531 … … 15257 15551 }; 15258 15552 15259 static struct hda_input_mux alc662_eeepc_capture_source = {15260 .num_items = 2,15261 .items = {15262 { "i-Mic", 0x1 },15263 { "e-Mic", 0x0 },15264 },15265 };15266 15267 15553 static struct hda_input_mux alc663_capture_source = { 15268 15554 .num_items = 3, … … 15274 15560 }; 15275 15561 15276 static struct hda_input_mux alc663_m51va_capture_source = { 15277 .num_items = 2, 15562 #if 0 /* set to 1 for testing other input sources below */ 15563 static struct hda_input_mux alc272_nc10_capture_source = { 15564 .num_items = 16, 15278 15565 .items = { 15279 { "Ext-Mic", 0x0 }, 15280 { "D-Mic", 0x9 }, 15281 }, 15282 }; 15566 { "Autoselect Mic", 0x0 }, 15567 { "Internal Mic", 0x1 }, 15568 { "In-0x02", 0x2 }, 15569 { "In-0x03", 0x3 }, 15570 { "In-0x04", 0x4 }, 15571 { "In-0x05", 0x5 }, 15572 { "In-0x06", 0x6 }, 15573 { "In-0x07", 0x7 }, 15574 { "In-0x08", 0x8 }, 15575 { "In-0x09", 0x9 }, 15576 { "In-0x0a", 0x0a }, 15577 { "In-0x0b", 0x0b }, 15578 { "In-0x0c", 0x0c }, 15579 { "In-0x0d", 0x0d }, 15580 { "In-0x0e", 0x0e }, 15581 { "In-0x0f", 0x0f }, 15582 }, 15583 }; 15584 #endif 15283 15585 15284 15586 /* … … 15421 15723 15422 15724 static struct snd_kcontrol_new alc662_eeepc_p701_mixer[] = { 15423 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 15424 15425 HDA_CODEC_VOLUME("Line-Out Playback Volume", 0x02, 0x0, HDA_OUTPUT), 15426 HDA_CODEC_MUTE("Line-Out Playback Switch", 0x1b, 0x0, HDA_OUTPUT), 15725 HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT), 15726 ALC262_HIPPO_MASTER_SWITCH, 15427 15727 15428 15728 HDA_CODEC_VOLUME("e-Mic Boost", 0x18, 0, HDA_INPUT), … … 15437 15737 15438 15738 static struct snd_kcontrol_new alc662_eeepc_ep20_mixer[] = { 15439 HDA_CODEC_VOLUME("Line-Out Playback Volume", 0x02, 0x0, HDA_OUTPUT),15440 HDA_CODEC_ MUTE("Line-Out Playback Switch", 0x14, 0x0, HDA_OUTPUT),15739 ALC262_HIPPO_MASTER_SWITCH, 15740 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT), 15441 15741 HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT), 15442 HDA_BIND_MUTE("Surround Playback Switch", 0x03, 2, HDA_INPUT),15443 15742 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT), 15444 15743 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT), 15445 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x04, 1, 2, HDA_INPUT),15446 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x04, 2, 2, HDA_INPUT),15447 HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),15448 15744 HDA_BIND_MUTE("MuteCtrl Playback Switch", 0x0c, 2, HDA_INPUT), 15449 15745 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT), … … 15933 16229 } 15934 16230 15935 static void alc662_eeepc_mic_automute(struct hda_codec *codec)15936 {15937 unsigned int present;15938 15939 present = snd_hda_codec_read(codec, 0x18, 0,15940 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;15941 snd_hda_codec_write(codec, 0x22, 0, AC_VERB_SET_AMP_GAIN_MUTE,15942 0x7000 | (0x00 << 8) | (present ? 0 : 0x80));15943 snd_hda_codec_write(codec, 0x23, 0, AC_VERB_SET_AMP_GAIN_MUTE,15944 0x7000 | (0x00 << 8) | (present ? 0 : 0x80));15945 snd_hda_codec_write(codec, 0x22, 0, AC_VERB_SET_AMP_GAIN_MUTE,15946 0x7000 | (0x01 << 8) | (present ? 0x80 : 0));15947 snd_hda_codec_write(codec, 0x23, 0, AC_VERB_SET_AMP_GAIN_MUTE,15948 0x7000 | (0x01 << 8) | (present ? 0x80 : 0));15949 }15950 15951 16231 /* unsolicited event for HP jack sensing */ 15952 16232 static void alc662_eeepc_unsol_event(struct hda_codec *codec, 15953 16233 unsigned int res) 15954 16234 { 15955 if ((res >> 26) == ALC880_HP_EVENT)15956 alc262_hippo1_automute( codec );15957 15958 16235 if ((res >> 26) == ALC880_MIC_EVENT) 15959 alc662_eeepc_mic_automute(codec); 16236 alc_mic_automute(codec); 16237 else 16238 alc262_hippo_unsol_event(codec, res); 16239 } 16240 16241 static void alc662_eeepc_setup(struct hda_codec *codec) 16242 { 16243 struct alc_spec *spec = codec->spec; 16244 16245 alc262_hippo1_setup(codec); 16246 spec->ext_mic.pin = 0x18; 16247 spec->ext_mic.mux_idx = 0; 16248 spec->int_mic.pin = 0x19; 16249 spec->int_mic.mux_idx = 1; 16250 spec->auto_mic = 1; 15960 16251 } 15961 16252 15962 16253 static void alc662_eeepc_inithook(struct hda_codec *codec) 15963 16254 { 15964 alc262_hippo1_automute( codec ); 15965 alc662_eeepc_mic_automute(codec); 15966 } 15967 15968 static void alc662_eeepc_ep20_automute(struct hda_codec *codec) 15969 { 15970 unsigned int mute; 15971 unsigned int present; 15972 15973 snd_hda_codec_read(codec, 0x14, 0, AC_VERB_SET_PIN_SENSE, 0); 15974 present = snd_hda_codec_read(codec, 0x14, 0, 15975 AC_VERB_GET_PIN_SENSE, 0); 15976 present = (present & 0x80000000) != 0; 15977 if (present) { 15978 /* mute internal speaker */ 15979 snd_hda_codec_amp_stereo(codec, 0x1b, HDA_OUTPUT, 0, 15980 HDA_AMP_MUTE, HDA_AMP_MUTE); 15981 } else { 15982 /* unmute internal speaker if necessary */ 15983 mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0); 15984 snd_hda_codec_amp_stereo(codec, 0x1b, HDA_OUTPUT, 0, 15985 HDA_AMP_MUTE, mute); 15986 } 15987 } 15988 15989 /* unsolicited event for HP jack sensing */ 15990 static void alc662_eeepc_ep20_unsol_event(struct hda_codec *codec, 15991 unsigned int res) 15992 { 15993 if ((res >> 26) == ALC880_HP_EVENT) 15994 alc662_eeepc_ep20_automute(codec); 15995 } 15996 15997 static void alc662_eeepc_ep20_inithook(struct hda_codec *codec) 15998 { 15999 alc662_eeepc_ep20_automute(codec); 16000 } 16255 alc262_hippo_automute(codec); 16256 alc_mic_automute(codec); 16257 } 16258 16259 static void alc662_eeepc_ep20_setup(struct hda_codec *codec) 16260 { 16261 struct alc_spec *spec = codec->spec; 16262 16263 spec->autocfg.hp_pins[0] = 0x14; 16264 spec->autocfg.speaker_pins[0] = 0x1b; 16265 } 16266 16267 #define alc662_eeepc_ep20_inithook alc262_hippo_master_update 16001 16268 16002 16269 static void alc663_m51va_speaker_automute(struct hda_codec *codec) … … 16110 16377 } 16111 16378 16112 static void alc663_m51va_mic_automute(struct hda_codec *codec)16113 {16114 unsigned int present;16115 16116 present = snd_hda_codec_read(codec, 0x18, 0,16117 AC_VERB_GET_PIN_SENSE, 0)16118 & AC_PINSENSE_PRESENCE;16119 snd_hda_codec_write_cache(codec, 0x22, 0, AC_VERB_SET_AMP_GAIN_MUTE,16120 0x7000 | (0x00 << 8) | (present ? 0 : 0x80));16121 snd_hda_codec_write_cache(codec, 0x23, 0, AC_VERB_SET_AMP_GAIN_MUTE,16122 0x7000 | (0x00 << 8) | (present ? 0 : 0x80));16123 snd_hda_codec_write_cache(codec, 0x22, 0, AC_VERB_SET_AMP_GAIN_MUTE,16124 0x7000 | (0x09 << 8) | (present ? 0x80 : 0));16125 snd_hda_codec_write_cache(codec, 0x23, 0, AC_VERB_SET_AMP_GAIN_MUTE,16126 0x7000 | (0x09 << 8) | (present ? 0x80 : 0));16127 }16128 16129 16379 static void alc663_m51va_unsol_event(struct hda_codec *codec, 16130 16380 unsigned int res) … … 16135 16385 break; 16136 16386 case ALC880_MIC_EVENT: 16137 alc 663_m51va_mic_automute(codec);16387 alc_mic_automute(codec); 16138 16388 break; 16139 16389 } 16140 16390 } 16141 16391 16392 static void alc663_m51va_setup(struct hda_codec *codec) 16393 { 16394 struct alc_spec *spec = codec->spec; 16395 spec->ext_mic.pin = 0x18; 16396 spec->ext_mic.mux_idx = 0; 16397 spec->int_mic.pin = 0x12; 16398 spec->int_mic.mux_idx = 1; 16399 spec->auto_mic = 1; 16400 } 16401 16142 16402 static void alc663_m51va_inithook(struct hda_codec *codec) 16143 16403 { 16144 16404 alc663_m51va_speaker_automute(codec); 16145 alc 663_m51va_mic_automute(codec);16405 alc_mic_automute(codec); 16146 16406 } 16147 16407 16148 16408 /* ***************** Mode1 ******************************/ 16149 static void alc663_mode1_unsol_event(struct hda_codec *codec, 16150 unsigned int res) 16151 { 16152 switch (res >> 26) { 16153 case ALC880_HP_EVENT: 16154 alc663_m51va_speaker_automute(codec); 16155 break; 16156 case ALC880_MIC_EVENT: 16157 alc662_eeepc_mic_automute(codec); 16158 break; 16159 } 16160 } 16161 16162 static void alc663_mode1_inithook(struct hda_codec *codec) 16163 { 16164 alc663_m51va_speaker_automute(codec); 16165 alc662_eeepc_mic_automute(codec); 16166 } 16409 #define alc663_mode1_unsol_event alc663_m51va_unsol_event 16410 #define alc663_mode1_setup alc663_m51va_setup 16411 #define alc663_mode1_inithook alc663_m51va_inithook 16412 16167 16413 /* ***************** Mode2 ******************************/ 16168 16414 static void alc662_mode2_unsol_event(struct hda_codec *codec, … … 16174 16420 break; 16175 16421 case ALC880_MIC_EVENT: 16176 alc 662_eeepc_mic_automute(codec);16422 alc_mic_automute(codec); 16177 16423 break; 16178 16424 } 16179 16425 } 16180 16426 16427 #define alc662_mode2_setup alc663_m51va_setup 16428 16181 16429 static void alc662_mode2_inithook(struct hda_codec *codec) 16182 16430 { 16183 16431 alc662_f5z_speaker_automute(codec); 16184 alc 662_eeepc_mic_automute(codec);16432 alc_mic_automute(codec); 16185 16433 } 16186 16434 /* ***************** Mode3 ******************************/ … … 16193 16441 break; 16194 16442 case ALC880_MIC_EVENT: 16195 alc 662_eeepc_mic_automute(codec);16443 alc_mic_automute(codec); 16196 16444 break; 16197 16445 } 16198 16446 } 16199 16447 16448 #define alc663_mode3_setup alc663_m51va_setup 16449 16200 16450 static void alc663_mode3_inithook(struct hda_codec *codec) 16201 16451 { 16202 16452 alc663_two_hp_m1_speaker_automute(codec); 16203 alc 662_eeepc_mic_automute(codec);16453 alc_mic_automute(codec); 16204 16454 } 16205 16455 /* ***************** Mode4 ******************************/ … … 16212 16462 break; 16213 16463 case ALC880_MIC_EVENT: 16214 alc 662_eeepc_mic_automute(codec);16464 alc_mic_automute(codec); 16215 16465 break; 16216 16466 } 16217 16467 } 16218 16468 16469 #define alc663_mode4_setup alc663_m51va_setup 16470 16219 16471 static void alc663_mode4_inithook(struct hda_codec *codec) 16220 16472 { 16221 16473 alc663_21jd_two_speaker_automute(codec); 16222 alc 662_eeepc_mic_automute(codec);16474 alc_mic_automute(codec); 16223 16475 } 16224 16476 /* ***************** Mode5 ******************************/ … … 16231 16483 break; 16232 16484 case ALC880_MIC_EVENT: 16233 alc 662_eeepc_mic_automute(codec);16485 alc_mic_automute(codec); 16234 16486 break; 16235 16487 } 16236 16488 } 16237 16489 16490 #define alc663_mode5_setup alc663_m51va_setup 16491 16238 16492 static void alc663_mode5_inithook(struct hda_codec *codec) 16239 16493 { 16240 16494 alc663_15jd_two_speaker_automute(codec); 16241 alc 662_eeepc_mic_automute(codec);16495 alc_mic_automute(codec); 16242 16496 } 16243 16497 /* ***************** Mode6 ******************************/ … … 16250 16504 break; 16251 16505 case ALC880_MIC_EVENT: 16252 alc 662_eeepc_mic_automute(codec);16506 alc_mic_automute(codec); 16253 16507 break; 16254 16508 } 16255 16509 } 16256 16510 16511 #define alc663_mode6_setup alc663_m51va_setup 16512 16257 16513 static void alc663_mode6_inithook(struct hda_codec *codec) 16258 16514 { 16259 16515 alc663_two_hp_m2_speaker_automute(codec); 16260 alc 662_eeepc_mic_automute(codec);16516 alc_mic_automute(codec); 16261 16517 } 16262 16518 … … 16300 16556 break; 16301 16557 case ALC880_MIC_EVENT: 16302 alc 662_eeepc_mic_automute(codec);16558 alc_mic_automute(codec); 16303 16559 break; 16304 16560 } 16305 16561 } 16306 16562 16563 #define alc663_g71v_setup alc663_m51va_setup 16564 16307 16565 static void alc663_g71v_inithook(struct hda_codec *codec) 16308 16566 { 16309 16567 alc663_g71v_front_automute(codec); 16310 16568 alc663_g71v_hp_automute(codec); 16311 alc 662_eeepc_mic_automute(codec);16569 alc_mic_automute(codec); 16312 16570 } 16313 16571 … … 16320 16578 break; 16321 16579 case ALC880_MIC_EVENT: 16322 alc 662_eeepc_mic_automute(codec);16580 alc_mic_automute(codec); 16323 16581 break; 16324 16582 } 16325 16583 } 16326 16584 16585 #define alc663_g50v_setup alc663_m51va_setup 16586 16327 16587 static void alc663_g50v_inithook(struct hda_codec *codec) 16328 16588 { 16329 16589 alc663_m51va_speaker_automute(codec); 16330 alc662_eeepc_mic_automute(codec); 16331 } 16332 16333 /* bind hp and internal speaker mute (with plug check) */ 16334 static int alc662_ecs_master_sw_put(struct snd_kcontrol *kcontrol, 16335 struct snd_ctl_elem_value *ucontrol) 16336 { 16337 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 16338 long *valp = ucontrol->value.integer.value; 16339 int change; 16340 16341 change = snd_hda_codec_amp_update(codec, 0x1b, 0, HDA_OUTPUT, 0, 16342 HDA_AMP_MUTE, 16343 valp[0] ? 0 : HDA_AMP_MUTE); 16344 change |= snd_hda_codec_amp_update(codec, 0x1b, 1, HDA_OUTPUT, 0, 16345 HDA_AMP_MUTE, 16346 valp[1] ? 0 : HDA_AMP_MUTE); 16347 if (change) 16348 alc262_hippo1_automute(codec); 16349 return change; 16590 alc_mic_automute(codec); 16350 16591 } 16351 16592 16352 16593 static struct snd_kcontrol_new alc662_ecs_mixer[] = { 16353 16594 HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT), 16354 { 16355 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 16356 .name = "Master Playback Switch", 16357 .info = snd_hda_mixer_amp_switch_info, 16358 .get = snd_hda_mixer_amp_switch_get, 16359 .put = alc662_ecs_master_sw_put, 16360 .private_value = HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT), 16361 }, 16595 ALC262_HIPPO_MASTER_SWITCH, 16362 16596 16363 16597 HDA_CODEC_VOLUME("e-Mic/LineIn Boost", 0x18, 0, HDA_INPUT), … … 16371 16605 }; 16372 16606 16607 static struct snd_kcontrol_new alc272_nc10_mixer[] = { 16608 /* Master Playback automatically created from Speaker and Headphone */ 16609 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT), 16610 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT), 16611 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT), 16612 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT), 16613 16614 HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), 16615 HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), 16616 HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT), 16617 16618 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), 16619 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), 16620 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT), 16621 {0} /* end */ 16622 }; 16623 16373 16624 #ifdef CONFIG_SND_HDA_POWER_SAVE 16374 16625 #define alc662_loopbacks alc880_loopbacks … … 16376 16627 16377 16628 16378 /* pcm configuration: identi acal with ALC880 */16629 /* pcm configuration: identical with ALC880 */ 16379 16630 #define alc662_pcm_analog_playback alc880_pcm_analog_playback 16380 16631 #define alc662_pcm_analog_capture alc880_pcm_analog_capture … … 16404 16655 [ALC663_ASUS_MODE5] = "asus-mode5", 16405 16656 [ALC663_ASUS_MODE6] = "asus-mode6", 16657 [ALC272_DELL] = "dell", 16658 [ALC272_DELL_ZM1] = "dell-zm1", 16659 [ALC272_SAMSUNG_NC10] = "samsung-nc10", 16406 16660 [ALC662_AUTO] = "auto", 16407 16661 }; … … 16461 16715 SND_PCI_QUIRK(0x105b, 0x0d47, "Foxconn 45CMX/45GMX/45CMX-K", 16462 16716 ALC662_3ST_6ch_DIG), 16717 SND_PCI_QUIRK(0x144d, 0xca00, "Samsung NC10", ALC272_SAMSUNG_NC10), 16463 16718 SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L", 16464 16719 ALC662_3ST_6ch_DIG), … … 16537 16792 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 16538 16793 .channel_mode = alc662_3ST_2ch_modes, 16539 .input_mux = &alc662_eeepc_capture_source,16540 16794 .unsol_event = alc662_eeepc_unsol_event, 16795 .setup = alc662_eeepc_setup, 16541 16796 .init_hook = alc662_eeepc_inithook, 16542 16797 }, … … 16551 16806 .channel_mode = alc662_3ST_6ch_modes, 16552 16807 .input_mux = &alc662_lenovo_101e_capture_source, 16553 .unsol_event = alc662_eeepc_ep20_unsol_event, 16808 .unsol_event = alc662_eeepc_unsol_event, 16809 .setup = alc662_eeepc_ep20_setup, 16554 16810 .init_hook = alc662_eeepc_ep20_inithook, 16555 16811 }, … … 16562 16818 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 16563 16819 .channel_mode = alc662_3ST_2ch_modes, 16564 .input_mux = &alc662_eeepc_capture_source,16565 16820 .unsol_event = alc662_eeepc_unsol_event, 16821 .setup = alc662_eeepc_setup, 16566 16822 .init_hook = alc662_eeepc_inithook, 16567 16823 }, … … 16574 16830 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 16575 16831 .channel_mode = alc662_3ST_2ch_modes, 16576 .input_mux = &alc663_m51va_capture_source,16577 16832 .unsol_event = alc663_m51va_unsol_event, 16833 .setup = alc663_m51va_setup, 16578 16834 .init_hook = alc663_m51va_inithook, 16579 16835 }, … … 16586 16842 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 16587 16843 .channel_mode = alc662_3ST_2ch_modes, 16588 .input_mux = &alc662_eeepc_capture_source,16589 16844 .unsol_event = alc663_g71v_unsol_event, 16845 .setup = alc663_g71v_setup, 16590 16846 .init_hook = alc663_g71v_inithook, 16591 16847 }, … … 16597 16853 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 16598 16854 .channel_mode = alc662_3ST_2ch_modes, 16599 .input_mux = &alc663_m51va_capture_source,16600 16855 .unsol_event = alc663_m51va_unsol_event, 16601 16856 .init_hook = alc663_m51va_inithook, … … 16611 16866 .input_mux = &alc663_capture_source, 16612 16867 .unsol_event = alc663_g50v_unsol_event, 16868 .setup = alc663_g50v_setup, 16613 16869 .init_hook = alc663_g50v_inithook, 16614 16870 }, … … 16624 16880 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 16625 16881 .channel_mode = alc662_3ST_2ch_modes, 16626 .input_mux = &alc662_eeepc_capture_source,16627 16882 .unsol_event = alc663_mode1_unsol_event, 16883 .setup = alc663_mode1_setup, 16628 16884 .init_hook = alc663_mode1_inithook, 16629 16885 }, … … 16638 16894 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 16639 16895 .channel_mode = alc662_3ST_2ch_modes, 16640 .input_mux = &alc662_eeepc_capture_source,16641 16896 .unsol_event = alc662_mode2_unsol_event, 16897 .setup = alc662_mode2_setup, 16642 16898 .init_hook = alc662_mode2_inithook, 16643 16899 }, … … 16653 16909 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 16654 16910 .channel_mode = alc662_3ST_2ch_modes, 16655 .input_mux = &alc662_eeepc_capture_source,16656 16911 .unsol_event = alc663_mode3_unsol_event, 16912 .setup = alc663_mode3_setup, 16657 16913 .init_hook = alc663_mode3_inithook, 16658 16914 }, … … 16668 16924 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 16669 16925 .channel_mode = alc662_3ST_2ch_modes, 16670 .input_mux = &alc662_eeepc_capture_source,16671 16926 .unsol_event = alc663_mode4_unsol_event, 16927 .setup = alc663_mode4_setup, 16672 16928 .init_hook = alc663_mode4_inithook, 16673 16929 }, … … 16683 16939 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 16684 16940 .channel_mode = alc662_3ST_2ch_modes, 16685 .input_mux = &alc662_eeepc_capture_source,16686 16941 .unsol_event = alc663_mode5_unsol_event, 16942 .setup = alc663_mode5_setup, 16687 16943 .init_hook = alc663_mode5_inithook, 16688 16944 }, … … 16698 16954 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 16699 16955 .channel_mode = alc662_3ST_2ch_modes, 16700 .input_mux = &alc662_eeepc_capture_source,16701 16956 .unsol_event = alc663_mode6_unsol_event, 16957 .setup = alc663_mode6_setup, 16702 16958 .init_hook = alc663_mode6_inithook, 16703 16959 }, … … 16713 16969 .capsrc_nids = alc272_capsrc_nids, 16714 16970 .channel_mode = alc662_3ST_2ch_modes, 16715 .input_mux = &alc663_m51va_capture_source,16716 16971 .unsol_event = alc663_m51va_unsol_event, 16972 .setup = alc663_m51va_setup, 16717 16973 .init_hook = alc663_m51va_inithook, 16718 16974 }, … … 16725 16981 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 16726 16982 .adc_nids = alc662_adc_nids, 16727 .num_adc_nids = ARRAY_SIZE(alc662_adc_nids),16983 .num_adc_nids = 1, 16728 16984 .capsrc_nids = alc662_capsrc_nids, 16729 16985 .channel_mode = alc662_3ST_2ch_modes, 16730 .input_mux = &alc663_m51va_capture_source,16731 16986 .unsol_event = alc663_m51va_unsol_event, 16987 .setup = alc663_m51va_setup, 16732 16988 .init_hook = alc663_m51va_inithook, 16989 }, 16990 [ALC272_SAMSUNG_NC10] = { 16991 .mixers = { alc272_nc10_mixer }, 16992 .init_verbs = { alc662_init_verbs, 16993 alc663_21jd_amic_init_verbs }, 16994 .num_dacs = ARRAY_SIZE(alc272_dac_nids), 16995 .dac_nids = alc272_dac_nids, 16996 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes), 16997 .channel_mode = alc662_3ST_2ch_modes, 16998 /*.input_mux = &alc272_nc10_capture_source,*/ 16999 .unsol_event = alc663_mode4_unsol_event, 17000 .setup = alc663_mode4_setup, 17001 .init_hook = alc663_mode4_inithook, 16733 17002 }, 16734 17003 }; … … 16781 17050 return err; 16782 17051 } else { 16783 sprintf(name, "%s Playback Volume", chname[i]); 17052 const char *pfx; 17053 if (cfg->line_outs == 1 && 17054 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) { 17055 if (!cfg->hp_pins) 17056 pfx = "Speaker"; 17057 else 17058 pfx = "PCM"; 17059 } else 17060 pfx = chname[i]; 17061 sprintf(name, "%s Playback Volume", pfx); 16784 17062 err = add_control(spec, ALC_CTL_WIDGET_VOL, name, 16785 17063 HDA_COMPOSE_AMP_VAL(nid, 3, 0, … … 16787 17065 if (err < 0) 16788 17066 return err; 16789 sprintf(name, "%s Playback Switch", chname[i]); 17067 if (cfg->line_outs == 1 && 17068 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) 17069 pfx = "Speaker"; 17070 sprintf(name, "%s Playback Switch", pfx); 16790 17071 err = add_control(spec, ALC_CTL_WIDGET_MUTE, name, 16791 17072 HDA_COMPOSE_AMP_VAL(alc880_idx_to_mixer(i), … … 16849 17130 } 16850 17131 16851 /* return the index of the src widget from the connection list of the nid.16852 * return -1 if not found16853 */16854 static int alc662_input_pin_idx(struct hda_codec *codec, hda_nid_t nid,16855 hda_nid_t src)16856 {16857 hda_nid_t conn_list[HDA_MAX_CONNECTIONS];16858 int i, conns;16859 16860 conns = snd_hda_get_connections(codec, nid, conn_list,16861 ARRAY_SIZE(conn_list));16862 if (conns < 0)16863 return -1;16864 for (i = 0; i < conns; i++)16865 if (conn_list[i] == src)16866 return i;16867 return -1;16868 }16869 16870 static int alc662_is_input_pin(struct hda_codec *codec, hda_nid_t nid)16871 {16872 unsigned int pincap = snd_hda_query_pin_caps(codec, nid);16873 return (pincap & AC_PINCAP_IN) != 0;16874 }16875 16876 17132 /* create playback/capture controls for input pins */ 16877 static int alc662_auto_create_analog_input_ctls(struct hda_codec *codec, 16878 const struct auto_pin_cfg *cfg) 16879 { 16880 struct alc_spec *spec = codec->spec; 16881 struct hda_input_mux *imux = &spec->private_imux[0]; 16882 int i, err, idx; 16883 16884 for (i = 0; i < AUTO_PIN_LAST; i++) { 16885 if (alc662_is_input_pin(codec, cfg->input_pins[i])) { 16886 idx = alc662_input_pin_idx(codec, 0x0b, 16887 cfg->input_pins[i]); 16888 if (idx >= 0) { 16889 err = new_analog_input(spec, cfg->input_pins[i], 16890 auto_pin_cfg_labels[i], 16891 idx, 0x0b); 16892 if (err < 0) 16893 return err; 16894 } 16895 idx = alc662_input_pin_idx(codec, 0x22, 16896 cfg->input_pins[i]); 16897 if (idx >= 0) { 16898 imux->items[imux->num_items].label = 16899 auto_pin_cfg_labels[i]; 16900 imux->items[imux->num_items].index = idx; 16901 imux->num_items++; 16902 } 16903 } 16904 } 16905 return 0; 16906 } 17133 #define alc662_auto_create_input_ctls \ 17134 alc880_auto_create_input_ctls 16907 17135 16908 17136 static void alc662_auto_set_output_and_unmute(struct hda_codec *codec, … … 16926 17154 int i; 16927 17155 16928 alc_subsystem_id(codec, 0x15, 0x1b, 0x14);16929 17156 for (i = 0; i <= HDA_SIDE; i++) { 16930 17157 hda_nid_t nid = spec->autocfg.line_out_pins[i]; … … 16959 17186 for (i = 0; i < AUTO_PIN_LAST; i++) { 16960 17187 hda_nid_t nid = spec->autocfg.input_pins[i]; 16961 if (alc 662_is_input_pin(codec, nid)) {17188 if (alc_is_input_pin(codec, nid)) { 16962 17189 alc_set_input_pin(codec, nid, i); 16963 17190 if (nid != ALC662_PIN_CD_NID && … … 17000 17227 if (err < 0) 17001 17228 return err; 17002 err = alc662_auto_create_ analog_input_ctls(codec, &spec->autocfg);17229 err = alc662_auto_create_input_ctls(codec, &spec->autocfg); 17003 17230 if (err < 0) 17004 17231 return err; … … 17022 17249 if (err < 0) 17023 17250 return err; 17251 17252 alc_ssid_check(codec, 0x15, 0x1b, 0x14); 17024 17253 17025 17254 return 1; … … 17055 17284 alc662_cfg_tbl); 17056 17285 if (board_config < 0) { 17057 printk(KERN_INFO "hda_codec: Unknown model for ALC662, "17058 "trying auto-probe from BIOS...\n");17286 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", 17287 codec->chip_name); 17059 17288 board_config = ALC662_AUTO; 17060 17289 } … … 17081 17310 17082 17311 if (board_config != ALC662_AUTO) 17083 setup_preset(spec, &alc662_presets[board_config]); 17084 17085 if (codec->vendor_id == 0x10ec0663) { 17086 spec->stream_name_analog = "ALC663 Analog"; 17087 spec->stream_name_digital = "ALC663 Digital"; 17088 } else if (codec->vendor_id == 0x10ec0272) { 17089 spec->stream_name_analog = "ALC272 Analog"; 17090 spec->stream_name_digital = "ALC272 Digital"; 17091 } else { 17092 spec->stream_name_analog = "ALC662 Analog"; 17093 spec->stream_name_digital = "ALC662 Digital"; 17094 } 17312 setup_preset(codec, &alc662_presets[board_config]); 17095 17313 17096 17314 spec->stream_analog_playback = &alc662_pcm_analog_playback; … … 17100 17318 spec->stream_digital_capture = &alc662_pcm_digital_capture; 17101 17319 17102 spec->adc_nids = alc662_adc_nids; 17103 spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids); 17104 spec->capsrc_nids = alc662_capsrc_nids; 17105 spec->capture_style = CAPT_MIX; 17320 if (!spec->adc_nids) { 17321 spec->adc_nids = alc662_adc_nids; 17322 spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids); 17323 } 17324 if (!spec->capsrc_nids) 17325 spec->capsrc_nids = alc662_capsrc_nids; 17106 17326 17107 17327 if (!spec->cap_mixer) 17108 set_capture_mixer( spec);17328 set_capture_mixer(codec); 17109 17329 if (codec->vendor_id == 0x10ec0662) 17110 17330 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT); … … 17142 17362 { .id = 0x10ec0862, .name = "ALC861-VD", .patch = patch_alc861vd }, 17143 17363 { .id = 0x10ec0662, .rev = 0x100002, .name = "ALC662 rev2", 17144 .patch = patch_alc88 3},17364 .patch = patch_alc882 }, 17145 17365 { .id = 0x10ec0662, .rev = 0x100101, .name = "ALC662 rev1", 17146 17366 .patch = patch_alc662 }, … … 17148 17368 { .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 }, 17149 17369 { .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 }, 17150 { .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc88 3},17370 { .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc882 }, 17151 17371 { .id = 0x10ec0885, .rev = 0x100101, .name = "ALC889A", 17152 .patch = patch_alc882 }, /* should be patch_alc883() in future */17372 .patch = patch_alc882 }, 17153 17373 { .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A", 17154 .patch = patch_alc882 }, /* should be patch_alc883() in future */17374 .patch = patch_alc882 }, 17155 17375 { .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 }, 17156 { .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc88 3},17376 { .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc882 }, 17157 17377 { .id = 0x10ec0888, .rev = 0x100101, .name = "ALC1200", 17158 .patch = patch_alc88 3},17159 { .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc88 3},17160 { .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc88 3},17378 .patch = patch_alc882 }, 17379 { .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc882 }, 17380 { .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc882 }, 17161 17381 {0} /* terminator */ 17162 17382 }; -
GPL/trunk/alsa-kernel/pci/hda/patch_sigmatel.c
r426 r464 41 41 STAC_PWR_EVENT, 42 42 STAC_HP_EVENT, 43 STAC_LO_EVENT, 44 STAC_MIC_EVENT, 43 45 }; 44 46 … … 77 79 STAC_92HD73XX_NO_JD, /* no jack-detection */ 78 80 STAC_92HD73XX_REF, 81 STAC_92HD73XX_INTEL, 79 82 STAC_DELL_M6_AMIC, 80 83 STAC_DELL_M6_DMIC, … … 101 104 STAC_HP_DV5, 102 105 STAC_HP_HDX, 106 STAC_HP_DV4_1222NR, 103 107 STAC_92HD71BXX_MODELS 104 108 }; … … 151 155 STAC_D965_3ST, 152 156 STAC_D965_5ST, 157 STAC_D965_5ST_NO_FP, 153 158 STAC_DELL_3ST, 154 159 STAC_DELL_BIOS, … … 173 178 int type; 174 179 struct snd_jack *jack; 180 }; 181 182 struct sigmatel_mic_route { 183 hda_nid_t pin; 184 unsigned char mux_idx; 185 unsigned char dmux_idx; 175 186 }; 176 187 … … 186 197 unsigned int spdif_mute: 1; 187 198 unsigned int check_volume_offset:1; 199 unsigned int auto_mic:1; 188 200 189 201 /* gpio lines */ … … 193 205 unsigned int gpio_data; 194 206 unsigned int gpio_mute; 207 unsigned int gpio_led; 195 208 196 209 /* stream */ … … 236 249 hda_nid_t *smux_nids; 237 250 unsigned int num_smuxes; 251 unsigned int num_analog_muxes; 252 253 unsigned long *capvols; /* amp-volume attr: HDA_COMPOSE_AMP_VAL() */ 254 unsigned long *capsws; /* amp-mute attr: HDA_COMPOSE_AMP_VAL() */ 255 unsigned int num_caps; /* number of capture volume/switch elements */ 256 257 struct sigmatel_mic_route ext_mic; 258 struct sigmatel_mic_route int_mic; 259 238 260 const char **spdif_labels; 239 261 … … 332 354 }; 333 355 334 #define STAC92HD83XXX_NUM_DMICS 2 335 static hda_nid_t stac92hd83xxx_dmic_nids[STAC92HD83XXX_NUM_DMICS + 1] = { 336 0x11, 0x12, 0 337 }; 356 #define STAC92HD73XX_NUM_CAPS 2 357 static unsigned long stac92hd73xx_capvols[] = { 358 HDA_COMPOSE_AMP_VAL(0x20, 3, 0, HDA_OUTPUT), 359 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT), 360 }; 361 #define stac92hd73xx_capsws stac92hd73xx_capvols 338 362 339 363 #define STAC92HD83_DAC_COUNT 3 340 364 341 static hda_nid_t stac92hd83xxx_ dmux_nids[2] = {365 static hda_nid_t stac92hd83xxx_mux_nids[2] = { 342 366 0x17, 0x18, 343 367 }; … … 359 383 }; 360 384 361 static hda_nid_t stac92hd83xxx_amp_nids[1] = { 362 0xc, 363 }; 385 #define STAC92HD83XXX_NUM_CAPS 2 386 static unsigned long stac92hd83xxx_capvols[] = { 387 HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT), 388 HDA_COMPOSE_AMP_VAL(0x18, 3, 0, HDA_OUTPUT), 389 }; 390 #define stac92hd83xxx_capsws stac92hd83xxx_capvols 364 391 365 392 static hda_nid_t stac92hd71bxx_pwr_nids[3] = { … … 392 419 }; 393 420 421 #define STAC92HD71BXX_NUM_CAPS 2 422 static unsigned long stac92hd71bxx_capvols[] = { 423 HDA_COMPOSE_AMP_VAL(0x1c, 3, 0, HDA_OUTPUT), 424 HDA_COMPOSE_AMP_VAL(0x1d, 3, 0, HDA_OUTPUT), 425 }; 426 #define stac92hd71bxx_capsws stac92hd71bxx_capvols 427 394 428 static hda_nid_t stac925x_adc_nids[1] = { 395 429 0x03, … … 413 447 }; 414 448 449 static unsigned long stac925x_capvols[] = { 450 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_OUTPUT), 451 }; 452 static unsigned long stac925x_capsws[] = { 453 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT), 454 }; 455 415 456 static hda_nid_t stac922x_adc_nids[2] = { 416 457 0x06, 0x07, … … 420 461 0x12, 0x13, 421 462 }; 463 464 #define STAC922X_NUM_CAPS 2 465 static unsigned long stac922x_capvols[] = { 466 HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_INPUT), 467 HDA_COMPOSE_AMP_VAL(0x18, 3, 0, HDA_INPUT), 468 }; 469 #define stac922x_capsws stac922x_capvols 422 470 423 471 static hda_nid_t stac927x_slave_dig_outs[2] = { … … 450 498 }; 451 499 500 #define STAC927X_NUM_CAPS 3 501 static unsigned long stac927x_capvols[] = { 502 HDA_COMPOSE_AMP_VAL(0x18, 3, 0, HDA_INPUT), 503 HDA_COMPOSE_AMP_VAL(0x19, 3, 0, HDA_INPUT), 504 HDA_COMPOSE_AMP_VAL(0x1a, 3, 0, HDA_INPUT), 505 }; 506 static unsigned long stac927x_capsws[] = { 507 HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT), 508 HDA_COMPOSE_AMP_VAL(0x1c, 3, 0, HDA_OUTPUT), 509 HDA_COMPOSE_AMP_VAL(0x1d, 3, 0, HDA_OUTPUT), 510 }; 511 452 512 static const char *stac927x_spdif_labels[5] = { 453 513 "Digital Playback", "ADAT", "Analog Mux 1", … … 474 534 static hda_nid_t stac9205_dmic_nids[STAC9205_NUM_DMICS + 1] = { 475 535 0x17, 0x18, 0 536 }; 537 538 #define STAC9205_NUM_CAPS 2 539 static unsigned long stac9205_capvols[] = { 540 HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_INPUT), 541 HDA_COMPOSE_AMP_VAL(0x1c, 3, 0, HDA_INPUT), 542 }; 543 static unsigned long stac9205_capsws[] = { 544 HDA_COMPOSE_AMP_VAL(0x1d, 3, 0, HDA_OUTPUT), 545 HDA_COMPOSE_AMP_VAL(0x1e, 3, 0, HDA_OUTPUT), 476 546 }; 477 547 … … 634 704 } 635 705 706 static unsigned int stac92xx_vref_set(struct hda_codec *codec, 707 hda_nid_t nid, unsigned int new_vref) 708 { 709 int error; 710 unsigned int pincfg; 711 pincfg = snd_hda_codec_read(codec, nid, 0, 712 AC_VERB_GET_PIN_WIDGET_CONTROL, 0); 713 714 pincfg &= 0xff; 715 pincfg &= ~(AC_PINCTL_VREFEN | AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN); 716 pincfg |= new_vref; 717 718 if (new_vref == AC_PINCTL_VREF_HIZ) 719 pincfg |= AC_PINCTL_OUT_EN; 720 else 721 pincfg |= AC_PINCTL_IN_EN; 722 723 error = snd_hda_codec_write_cache(codec, nid, 0, 724 AC_VERB_SET_PIN_WIDGET_CONTROL, pincfg); 725 if (error < 0) 726 return error; 727 else 728 return 1; 729 } 730 731 static unsigned int stac92xx_vref_get(struct hda_codec *codec, hda_nid_t nid) 732 { 733 unsigned int vref; 734 vref = snd_hda_codec_read(codec, nid, 0, 735 AC_VERB_GET_PIN_WIDGET_CONTROL, 0); 736 vref &= AC_PINCTL_VREFEN; 737 return vref; 738 } 739 636 740 static int stac92xx_mux_enum_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) 637 741 { … … 656 760 struct sigmatel_spec *spec = codec->spec; 657 761 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); 658 659 return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol, 660 spec->mux_nids[adc_idx], &spec->cur_mux[adc_idx]); 762 const struct hda_input_mux *imux = spec->input_mux; 763 unsigned int idx, prev_idx; 764 765 idx = ucontrol->value.enumerated.item[0]; 766 if (idx >= imux->num_items) 767 idx = imux->num_items - 1; 768 prev_idx = spec->cur_mux[adc_idx]; 769 if (prev_idx == idx) 770 return 0; 771 if (idx < spec->num_analog_muxes) { 772 snd_hda_codec_write_cache(codec, spec->mux_nids[adc_idx], 0, 773 AC_VERB_SET_CONNECT_SEL, 774 imux->items[idx].index); 775 if (prev_idx >= spec->num_analog_muxes) { 776 imux = spec->dinput_mux; 777 /* 0 = analog */ 778 snd_hda_codec_write_cache(codec, 779 spec->dmux_nids[adc_idx], 0, 780 AC_VERB_SET_CONNECT_SEL, 781 imux->items[0].index); 782 } 783 } else { 784 imux = spec->dinput_mux; 785 snd_hda_codec_write_cache(codec, spec->dmux_nids[adc_idx], 0, 786 AC_VERB_SET_CONNECT_SEL, 787 imux->items[idx - 1].index); 788 } 789 spec->cur_mux[adc_idx] = idx; 790 return 1; 661 791 } 662 792 … … 888 1018 }; 889 1019 890 #define HD_DISABLE_PORTF 1891 static struct hda_verb stac92hd71bxx_analog_core_init[] = {892 /* start of config #1 */893 894 /* connect port 0f to audio mixer */895 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x2},896 /* start of config #2 */897 898 /* set master volume and direct control */899 { 0x28, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},900 {0}901 };902 903 1020 static struct hda_verb stac92hd71bxx_unmute_core_init[] = { 904 1021 /* unmute right and left channels for nodes 0x0f, 0xa, 0x0d */ … … 995 1112 } 996 1113 1114 #define DC_BIAS(xname, idx, nid) \ 1115 { \ 1116 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 1117 .name = xname, \ 1118 .index = idx, \ 1119 .info = stac92xx_dc_bias_info, \ 1120 .get = stac92xx_dc_bias_get, \ 1121 .put = stac92xx_dc_bias_put, \ 1122 .private_value = nid, \ 1123 } 1124 997 1125 static struct snd_kcontrol_new stac9200_mixer[] = { 998 1126 HDA_CODEC_VOLUME("Master Playback Volume", 0xb, 0, HDA_OUTPUT), … … 1022 1150 HDA_CODEC_MUTE("DAC Mixer Capture Switch", 0x1d, 0x3, HDA_INPUT), 1023 1151 1024 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x20, 0x0, HDA_OUTPUT),1025 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x20, 0x0, HDA_OUTPUT),1026 1027 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x21, 0x0, HDA_OUTPUT),1028 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x21, 0x0, HDA_OUTPUT),1029 1030 1152 {0} /* end */ 1031 1153 }; … … 1047 1169 1048 1170 static struct snd_kcontrol_new stac92hd73xx_8ch_mixer[] = { 1049 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x20, 0x0, HDA_OUTPUT),1050 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x20, 0x0, HDA_OUTPUT),1051 1052 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x21, 0x0, HDA_OUTPUT),1053 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x21, 0x0, HDA_OUTPUT),1054 1055 1171 HDA_CODEC_VOLUME("Front Mic Mixer Capture Volume", 0x1d, 0, HDA_INPUT), 1056 1172 HDA_CODEC_MUTE("Front Mic Mixer Capture Switch", 0x1d, 0, HDA_INPUT), … … 1071 1187 1072 1188 static struct snd_kcontrol_new stac92hd73xx_10ch_mixer[] = { 1073 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x20, 0x0, HDA_OUTPUT),1074 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x20, 0x0, HDA_OUTPUT),1075 1076 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x21, 0x0, HDA_OUTPUT),1077 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x21, 0x0, HDA_OUTPUT),1078 1079 1189 HDA_CODEC_VOLUME("Front Mic Mixer Capture Volume", 0x1d, 0, HDA_INPUT), 1080 1190 HDA_CODEC_MUTE("Front Mic Mixer Capture Switch", 0x1d, 0, HDA_INPUT), … … 1095 1205 1096 1206 1097 static struct snd_kcontrol_new stac92hd83xxx_mixer[] = {1098 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x17, 0x0, HDA_OUTPUT),1099 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x17, 0x0, HDA_OUTPUT),1100 1101 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x18, 0x0, HDA_OUTPUT),1102 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x18, 0x0, HDA_OUTPUT),1103 1104 HDA_CODEC_VOLUME("DAC0 Capture Volume", 0x1b, 0x3, HDA_INPUT),1105 HDA_CODEC_MUTE("DAC0 Capture Switch", 0x1b, 0x3, HDA_INPUT),1106 1107 HDA_CODEC_VOLUME("DAC1 Capture Volume", 0x1b, 0x4, HDA_INPUT),1108 HDA_CODEC_MUTE("DAC1 Capture Switch", 0x1b, 0x4, HDA_INPUT),1109 1110 HDA_CODEC_VOLUME("Front Mic Capture Volume", 0x1b, 0x0, HDA_INPUT),1111 HDA_CODEC_MUTE("Front Mic Capture Switch", 0x1b, 0x0, HDA_INPUT),1112 1113 HDA_CODEC_VOLUME("Line In Capture Volume", 0x1b, 0x2, HDA_INPUT),1114 HDA_CODEC_MUTE("Line In Capture Switch", 0x1b, 0x2, HDA_INPUT),1115 1116 /*1117 HDA_CODEC_VOLUME("Mic Capture Volume", 0x1b, 0x1, HDA_INPUT),1118 HDA_CODEC_MUTE("Mic Capture Switch", 0x1b 0x1, HDA_INPUT),1119 */1120 {0} /* end */1121 };1122 1123 static struct snd_kcontrol_new stac92hd71bxx_analog_mixer[] = {1124 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x1c, 0x0, HDA_OUTPUT),1125 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1c, 0x0, HDA_OUTPUT),1126 1127 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x1d, 0x0, HDA_OUTPUT),1128 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x1d, 0x0, HDA_OUTPUT),1129 /* analog pc-beep replaced with digital beep support */1130 /*1131 HDA_CODEC_VOLUME("PC Beep Volume", 0x17, 0x2, HDA_INPUT),1132 HDA_CODEC_MUTE("PC Beep Switch", 0x17, 0x2, HDA_INPUT),1133 */1134 1135 HDA_CODEC_MUTE("Import0 Mux Capture Switch", 0x17, 0x0, HDA_INPUT),1136 HDA_CODEC_VOLUME("Import0 Mux Capture Volume", 0x17, 0x0, HDA_INPUT),1137 1138 HDA_CODEC_MUTE("Import1 Mux Capture Switch", 0x17, 0x1, HDA_INPUT),1139 HDA_CODEC_VOLUME("Import1 Mux Capture Volume", 0x17, 0x1, HDA_INPUT),1140 1141 HDA_CODEC_MUTE("DAC0 Capture Switch", 0x17, 0x3, HDA_INPUT),1142 HDA_CODEC_VOLUME("DAC0 Capture Volume", 0x17, 0x3, HDA_INPUT),1143 1144 HDA_CODEC_MUTE("DAC1 Capture Switch", 0x17, 0x4, HDA_INPUT),1145 HDA_CODEC_VOLUME("DAC1 Capture Volume", 0x17, 0x4, HDA_INPUT),1146 {0} /* end */1147 };1148 1149 1207 static struct snd_kcontrol_new stac92hd71bxx_loopback[] = { 1150 1208 STAC_ANALOG_LOOPBACK(0xFA0, 0x7A0, 2) 1151 };1152 1153 static struct snd_kcontrol_new stac92hd71bxx_mixer[] = {1154 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x1c, 0x0, HDA_OUTPUT),1155 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1c, 0x0, HDA_OUTPUT),1156 1157 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x1d, 0x0, HDA_OUTPUT),1158 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x1d, 0x0, HDA_OUTPUT),1159 {0} /* end */1160 1209 }; 1161 1210 … … 1163 1212 HDA_CODEC_VOLUME("Master Playback Volume", 0x0e, 0, HDA_OUTPUT), 1164 1213 HDA_CODEC_MUTE("Master Playback Switch", 0x0e, 0, HDA_OUTPUT), 1165 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0, HDA_OUTPUT),1166 HDA_CODEC_MUTE("Capture Switch", 0x14, 0, HDA_OUTPUT),1167 {0} /* end */1168 };1169 1170 static struct snd_kcontrol_new stac9205_mixer[] = {1171 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x1b, 0x0, HDA_INPUT),1172 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1d, 0x0, HDA_OUTPUT),1173 1174 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x1c, 0x0, HDA_INPUT),1175 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x1e, 0x0, HDA_OUTPUT),1176 1214 {0} /* end */ 1177 1215 }; … … 1180 1218 STAC_ANALOG_LOOPBACK(0xFE0, 0x7E0, 1), 1181 1219 {0} 1182 };1183 1184 /* This needs to be generated dynamically based on sequence */1185 static struct snd_kcontrol_new stac922x_mixer[] = {1186 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x17, 0x0, HDA_INPUT),1187 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x17, 0x0, HDA_INPUT),1188 1189 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x18, 0x0, HDA_INPUT),1190 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x18, 0x0, HDA_INPUT),1191 {0} /* end */1192 };1193 1194 1195 static struct snd_kcontrol_new stac927x_mixer[] = {1196 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x0, 0x18, 0x0, HDA_INPUT),1197 HDA_CODEC_MUTE_IDX("Capture Switch", 0x0, 0x1b, 0x0, HDA_OUTPUT),1198 1199 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x1, 0x19, 0x0, HDA_INPUT),1200 HDA_CODEC_MUTE_IDX("Capture Switch", 0x1, 0x1c, 0x0, HDA_OUTPUT),1201 1202 HDA_CODEC_VOLUME_IDX("Capture Volume", 0x2, 0x1A, 0x0, HDA_INPUT),1203 HDA_CODEC_MUTE_IDX("Capture Switch", 0x2, 0x1d, 0x0, HDA_OUTPUT),1204 {0} /* end */1205 1220 }; 1206 1221 … … 1262 1277 int i; 1263 1278 1264 err = snd_hda_add_new_ctls(codec, spec->mixer); 1265 if (err < 0) 1266 return err; 1279 if (spec->mixer) { 1280 err = snd_hda_add_new_ctls(codec, spec->mixer); 1281 if (err < 0) 1282 return err; 1283 } 1267 1284 1268 1285 for (i = 0; i < spec->num_mixers; i++) { … … 1271 1288 return err; 1272 1289 } 1273 if (spec->num_dmuxes > 0) { 1290 if (!spec->auto_mic && spec->num_dmuxes > 0 && 1291 snd_hda_get_bool_hint(codec, "separate_dmux") == 1) { 1274 1292 stac_dmux_mixer.count = spec->num_dmuxes; 1275 1293 err = snd_hda_ctl_add(codec, … … 1730 1748 [STAC_92HD73XX_NO_JD] = "no-jd", 1731 1749 [STAC_92HD73XX_REF] = "ref", 1750 [STAC_92HD73XX_INTEL] = "intel", 1732 1751 [STAC_DELL_M6_AMIC] = "dell-m6-amic", 1733 1752 [STAC_DELL_M6_DMIC] = "dell-m6-dmic", … … 1742 1761 SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, 1743 1762 "DFI LanParty", STAC_92HD73XX_REF), 1763 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5002, 1764 "Intel DG45ID", STAC_92HD73XX_INTEL), 1765 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5003, 1766 "Intel DG45FC", STAC_92HD73XX_INTEL), 1744 1767 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0254, 1745 1768 "Dell Studio 1535", STAC_DELL_M6_DMIC), … … 1762 1785 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02a0, 1763 1786 "Dell Studio 17", STAC_DELL_M6_DMIC), 1787 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02be, 1788 "Dell Studio 1555", STAC_DELL_M6_DMIC), 1764 1789 {0} /* terminator */ 1765 1790 }; … … 1837 1862 [STAC_HP_DV5] = NULL, 1838 1863 [STAC_HP_HDX] = NULL, 1864 [STAC_HP_DV4_1222NR] = NULL, 1839 1865 }; 1840 1866 … … 1848 1874 [STAC_HP_DV5] = "hp-dv5", 1849 1875 [STAC_HP_HDX] = "hp-hdx", 1876 [STAC_HP_DV4_1222NR] = "hp-dv4-1222nr", 1850 1877 }; 1851 1878 … … 1856 1883 SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, 1857 1884 "DFI LanParty", STAC_92HD71BXX_REF), 1885 SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30fb, 1886 "HP dv4-1222nr", STAC_HP_DV4_1222NR), 1858 1887 SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3080, 1859 1888 "HP", STAC_HP_DV5), … … 1868 1897 SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361b, 1869 1898 "HP HDX", STAC_HP_HDX), /* HDX16 */ 1899 SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x7010, 1900 "HP", STAC_HP_DV5), 1870 1901 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0233, 1871 1902 "unknown Dell", STAC_DELL_M4_1), … … 2155 2186 }; 2156 2187 2188 static unsigned int d965_5st_no_fp_pin_configs[14] = { 2189 0x40000100, 0x40000100, 0x0181304e, 0x01014010, 2190 0x01a19040, 0x01011012, 0x01016011, 0x40000100, 2191 0x40000100, 0x40000100, 0x40000100, 0x01442070, 2192 0x40000100, 0x40000100 2193 }; 2194 2157 2195 static unsigned int dell_3st_pin_configs[14] = { 2158 2196 0x02211230, 0x02a11220, 0x01a19040, 0x01114210, … … 2167 2205 [STAC_D965_3ST] = d965_3st_pin_configs, 2168 2206 [STAC_D965_5ST] = d965_5st_pin_configs, 2207 [STAC_D965_5ST_NO_FP] = d965_5st_no_fp_pin_configs, 2169 2208 [STAC_DELL_3ST] = dell_3st_pin_configs, 2170 2209 [STAC_DELL_BIOS] = NULL, … … 2177 2216 [STAC_D965_3ST] = "3stack", 2178 2217 [STAC_D965_5ST] = "5stack", 2218 [STAC_D965_5ST_NO_FP] = "5stack-no-fp", 2179 2219 [STAC_DELL_3ST] = "dell-3stack", 2180 2220 [STAC_DELL_BIOS] = "dell-bios", … … 2204 2244 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0227, "Dell Vostro 1400 ", STAC_DELL_BIOS), 2205 2245 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x022e, "Dell ", STAC_DELL_BIOS), 2206 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x022f, "Dell Inspiron 1525", STAC_DELL_ 3ST),2246 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x022f, "Dell Inspiron 1525", STAC_DELL_BIOS), 2207 2247 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0242, "Dell ", STAC_DELL_BIOS), 2208 2248 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0243, "Dell ", STAC_DELL_BIOS), … … 2282 2322 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, 2283 2323 "DFI LanParty", STAC_9205_REF), 2324 SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0xfb30, 2325 "SigmaTel", STAC_9205_REF), 2284 2326 SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, 2285 2327 "DFI LanParty", STAC_9205_REF), … … 2316 2358 "Dell Vostro 1500", STAC_9205_DELL_M42), 2317 2359 /* Gateway */ 2360 SND_PCI_QUIRK(0x107b, 0x0560, "Gateway T6834c", STAC_9205_EAPD), 2318 2361 SND_PCI_QUIRK(0x107b, 0x0565, "Gateway T1616", STAC_9205_EAPD), 2319 2362 {0} /* terminator */ … … 2536 2579 } 2537 2580 2538 static unsigned int stac92xx_get_vref(struct hda_codec *codec, hda_nid_t nid) 2581 static unsigned int stac92xx_get_default_vref(struct hda_codec *codec, 2582 hda_nid_t nid) 2539 2583 { 2540 2584 unsigned int pincap = snd_hda_query_pin_caps(codec, nid); … … 2570 2614 } 2571 2615 2572 static void stac_issue_unsol_event(struct hda_codec *codec, hda_nid_t nid, 2573 unsigned char type); 2616 static void stac_issue_unsol_event(struct hda_codec *codec, hda_nid_t nid); 2574 2617 2575 2618 static int stac92xx_hp_switch_put(struct snd_kcontrol *kcontrol, … … 2585 2628 * switch changes 2586 2629 */ 2587 stac_issue_unsol_event(codec, nid , STAC_HP_EVENT);2630 stac_issue_unsol_event(codec, nid); 2588 2631 2589 2632 return 1; 2590 2633 } 2591 2634 2592 #define stac92xx_io_switch_info snd_ctl_boolean_mono_info 2635 static int stac92xx_dc_bias_info(struct snd_kcontrol *kcontrol, 2636 struct snd_ctl_elem_info *uinfo) 2637 { 2638 int i; 2639 static char *texts[] = { 2640 "Mic In", "Line In", "Line Out" 2641 }; 2642 2643 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 2644 struct sigmatel_spec *spec = codec->spec; 2645 hda_nid_t nid = kcontrol->private_value; 2646 2647 if (nid == spec->mic_switch || nid == spec->line_switch) 2648 i = 3; 2649 else 2650 i = 2; 2651 2652 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 2653 uinfo->value.enumerated.items = i; 2654 uinfo->count = 1; 2655 if (uinfo->value.enumerated.item >= i) 2656 uinfo->value.enumerated.item = i-1; 2657 strcpy(uinfo->value.enumerated.name, 2658 texts[uinfo->value.enumerated.item]); 2659 2660 return 0; 2661 } 2662 2663 static int stac92xx_dc_bias_get(struct snd_kcontrol *kcontrol, 2664 struct snd_ctl_elem_value *ucontrol) 2665 { 2666 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 2667 hda_nid_t nid = kcontrol->private_value; 2668 unsigned int vref = stac92xx_vref_get(codec, nid); 2669 2670 if (vref == stac92xx_get_default_vref(codec, nid)) 2671 ucontrol->value.enumerated.item[0] = 0; 2672 else if (vref == AC_PINCTL_VREF_GRD) 2673 ucontrol->value.enumerated.item[0] = 1; 2674 else if (vref == AC_PINCTL_VREF_HIZ) 2675 ucontrol->value.enumerated.item[0] = 2; 2676 2677 return 0; 2678 } 2679 2680 static int stac92xx_dc_bias_put(struct snd_kcontrol *kcontrol, 2681 struct snd_ctl_elem_value *ucontrol) 2682 { 2683 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 2684 unsigned int new_vref = 0; 2685 int error; 2686 hda_nid_t nid = kcontrol->private_value; 2687 2688 if (ucontrol->value.enumerated.item[0] == 0) 2689 new_vref = stac92xx_get_default_vref(codec, nid); 2690 else if (ucontrol->value.enumerated.item[0] == 1) 2691 new_vref = AC_PINCTL_VREF_GRD; 2692 else if (ucontrol->value.enumerated.item[0] == 2) 2693 new_vref = AC_PINCTL_VREF_HIZ; 2694 else 2695 return 0; 2696 2697 if (new_vref != stac92xx_vref_get(codec, nid)) { 2698 error = stac92xx_vref_set(codec, nid, new_vref); 2699 return error; 2700 } 2701 2702 return 0; 2703 } 2704 2705 static int stac92xx_io_switch_info(struct snd_kcontrol *kcontrol, 2706 struct snd_ctl_elem_info *uinfo) 2707 { 2708 static char *texts[2]; 2709 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 2710 struct sigmatel_spec *spec = codec->spec; 2711 2712 if (kcontrol->private_value == spec->line_switch) 2713 texts[0] = "Line In"; 2714 else 2715 texts[0] = "Mic In"; 2716 texts[1] = "Line Out"; 2717 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 2718 uinfo->value.enumerated.items = 2; 2719 uinfo->count = 1; 2720 2721 if (uinfo->value.enumerated.item >= 2) 2722 uinfo->value.enumerated.item = 1; 2723 strcpy(uinfo->value.enumerated.name, 2724 texts[uinfo->value.enumerated.item]); 2725 2726 return 0; 2727 } 2593 2728 2594 2729 static int stac92xx_io_switch_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) … … 2596 2731 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 2597 2732 struct sigmatel_spec *spec = codec->spec; 2598 int io_idx = kcontrol-> private_value & 0xff; 2599 2600 ucontrol->value.integer.value[0] = spec->io_switch[io_idx]; 2733 hda_nid_t nid = kcontrol->private_value; 2734 int io_idx = (nid == spec->mic_switch) ? 1 : 0; 2735 2736 ucontrol->value.enumerated.item[0] = spec->io_switch[io_idx]; 2601 2737 return 0; 2602 2738 } … … 2606 2742 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 2607 2743 struct sigmatel_spec *spec = codec->spec; 2608 hda_nid_t nid = kcontrol->private_value >> 8;2609 int io_idx = kcontrol-> private_value & 0xff;2610 unsigned short val = !!ucontrol->value. integer.value[0];2744 hda_nid_t nid = kcontrol->private_value; 2745 int io_idx = (nid == spec->mic_switch) ? 1 : 0; 2746 unsigned short val = !!ucontrol->value.enumerated.item[0]; 2611 2747 2612 2748 spec->io_switch[io_idx] = val; … … 2617 2753 unsigned int pinctl = AC_PINCTL_IN_EN; 2618 2754 if (io_idx) /* set VREF for mic */ 2619 pinctl |= stac92xx_get_ vref(codec, nid);2755 pinctl |= stac92xx_get_default_vref(codec, nid); 2620 2756 stac92xx_auto_set_pinctl(codec, nid, pinctl); 2621 2757 } … … 2625 2761 */ 2626 2762 if (spec->hp_detect) 2627 stac_issue_unsol_event(codec, nid , STAC_HP_EVENT);2763 stac_issue_unsol_event(codec, nid); 2628 2764 2629 2765 return 1; … … 2698 2834 STAC_CTL_WIDGET_HP_SWITCH, 2699 2835 STAC_CTL_WIDGET_IO_SWITCH, 2700 STAC_CTL_WIDGET_CLFE_SWITCH 2836 STAC_CTL_WIDGET_CLFE_SWITCH, 2837 STAC_CTL_WIDGET_DC_BIAS 2701 2838 }; 2702 2839 … … 2710 2847 STAC_CODEC_IO_SWITCH(NULL, 0), 2711 2848 STAC_CODEC_CLFE_SWITCH(NULL, 0), 2849 DC_BIAS(NULL, 0, 0), 2712 2850 }; 2713 2851 … … 2773 2911 }; 2774 2912 2913 static inline int stac92xx_add_jack_mode_control(struct hda_codec *codec, 2914 hda_nid_t nid, int idx) 2915 { 2916 int def_conf = snd_hda_codec_get_pincfg(codec, nid); 2917 int control = 0; 2918 struct sigmatel_spec *spec = codec->spec; 2919 char name[22]; 2920 2921 if (!((get_defcfg_connect(def_conf)) & AC_JACK_PORT_FIXED)) { 2922 if (stac92xx_get_default_vref(codec, nid) == AC_PINCTL_VREF_GRD 2923 && nid == spec->line_switch) 2924 control = STAC_CTL_WIDGET_IO_SWITCH; 2925 else if (snd_hda_query_pin_caps(codec, nid) 2926 & (AC_PINCAP_VREF_GRD << AC_PINCAP_VREF_SHIFT)) 2927 control = STAC_CTL_WIDGET_DC_BIAS; 2928 else if (nid == spec->mic_switch) 2929 control = STAC_CTL_WIDGET_IO_SWITCH; 2930 } 2931 2932 if (control) { 2933 strcpy(name, auto_pin_cfg_labels[idx]); 2934 return stac92xx_add_control(codec->spec, control, 2935 strcat(name, " Jack Mode"), nid); 2936 } 2937 2938 return 0; 2939 } 2940 2775 2941 static int stac92xx_add_input_source(struct sigmatel_spec *spec) 2776 2942 { … … 2778 2944 struct hda_input_mux *imux = &spec->private_imux; 2779 2945 2946 if (spec->auto_mic) 2947 return 0; /* no need for input source */ 2780 2948 if (!spec->num_adcs || imux->num_items <= 1) 2781 2949 return 0; /* no need for input source control */ … … 2871 3039 for (j = 0; j < conn_len; j++) { 2872 3040 wcaps = get_wcaps(codec, conn[j]); 2873 wtype = (wcaps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;3041 wtype = get_wcaps_type(wcaps); 2874 3042 /* we check only analog outputs */ 2875 3043 if (wtype != AC_WID_AUD_OUT || (wcaps & AC_WCAP_DIGITAL)) … … 3130 3298 } 3131 3299 3300 static int stac92xx_add_capvol_ctls(struct hda_codec *codec, unsigned long vol, 3301 unsigned long sw, int idx) 3302 { 3303 int err; 3304 err = stac92xx_add_control_idx(codec->spec, STAC_CTL_WIDGET_VOL, idx, 3305 "Capture Volume", vol); 3306 if (err < 0) 3307 return err; 3308 err = stac92xx_add_control_idx(codec->spec, STAC_CTL_WIDGET_MUTE, idx, 3309 "Capture Switch", sw); 3310 if (err < 0) 3311 return err; 3312 return 0; 3313 } 3314 3132 3315 /* add playback controls from the parsed DAC table */ 3133 3316 static int stac92xx_auto_create_multi_out_ctls(struct hda_codec *codec, … … 3135 3318 { 3136 3319 struct sigmatel_spec *spec = codec->spec; 3320 hda_nid_t nid; 3137 3321 int err; 3322 int idx; 3138 3323 3139 3324 err = create_multi_out_ctls(codec, cfg->line_outs, cfg->line_out_pins, … … 3152 3337 } 3153 3338 3154 if (spec->line_switch) { 3155 err = stac92xx_add_control(spec, STAC_CTL_WIDGET_IO_SWITCH, 3156 "Line In as Output Switch", 3157 spec->line_switch << 8); 3158 if (err < 0) 3159 return err; 3160 } 3161 3162 if (spec->mic_switch) { 3163 err = stac92xx_add_control(spec, STAC_CTL_WIDGET_IO_SWITCH, 3164 "Mic as Output Switch", 3165 (spec->mic_switch << 8) | 1); 3166 if (err < 0) 3167 return err; 3339 for (idx = AUTO_PIN_MIC; idx <= AUTO_PIN_FRONT_LINE; idx++) { 3340 nid = cfg->input_pins[idx]; 3341 if (nid) { 3342 err = stac92xx_add_jack_mode_control(codec, nid, idx); 3343 if (err < 0) 3344 return err; 3345 } 3168 3346 } 3169 3347 … … 3208 3386 con_lst, 3209 3387 HDA_MAX_NUM_INPUTS); 3210 if ( !num_cons|| num_cons > ARRAY_SIZE(stac92xx_mono_labels))3388 if (num_cons <= 0 || num_cons > ARRAY_SIZE(stac92xx_mono_labels)) 3211 3389 return -EINVAL; 3212 3390 … … 3321 3499 { 3322 3500 struct sigmatel_spec *spec = codec->spec; 3323 int wcaps, nid, i, err = 0;3501 int i, j, err = 0; 3324 3502 3325 3503 for (i = 0; i < spec->num_muxes; i++) { 3504 hda_nid_t nid; 3505 unsigned int wcaps; 3506 unsigned long val; 3507 3326 3508 nid = spec->mux_nids[i]; 3327 3509 wcaps = get_wcaps(codec, nid); 3328 3329 if (wcaps & AC_WCAP_OUT_AMP) { 3330 err = stac92xx_add_control_idx(spec, 3331 STAC_CTL_WIDGET_VOL, i, "Mux Capture Volume", 3332 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT)); 3333 if (err < 0) 3334 return err; 3510 if (!(wcaps & AC_WCAP_OUT_AMP)) 3511 continue; 3512 3513 /* check whether already the same control was created as 3514 * normal Capture Volume. 3515 */ 3516 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT); 3517 for (j = 0; j < spec->num_caps; j++) { 3518 if (spec->capvols[j] == val) 3519 break; 3335 3520 } 3521 if (j < spec->num_caps) 3522 continue; 3523 3524 err = stac92xx_add_control_idx(spec, STAC_CTL_WIDGET_VOL, i, 3525 "Mux Capture Volume", val); 3526 if (err < 0) 3527 return err; 3336 3528 } 3337 3529 return 0; … … 3354 3546 con_lst, 3355 3547 HDA_MAX_NUM_INPUTS); 3356 if ( !num_cons)3548 if (num_cons <= 0) 3357 3549 return -EINVAL; 3358 3550 … … 3375 3567 }; 3376 3568 3569 static int get_connection_index(struct hda_codec *codec, hda_nid_t mux, 3570 hda_nid_t nid) 3571 { 3572 hda_nid_t conn[HDA_MAX_NUM_INPUTS]; 3573 int i, nums; 3574 3575 nums = snd_hda_get_connections(codec, mux, conn, ARRAY_SIZE(conn)); 3576 for (i = 0; i < nums; i++) 3577 if (conn[i] == nid) 3578 return i; 3579 return -1; 3580 } 3581 3582 /* create a volume assigned to the given pin (only if supported) */ 3583 static int create_elem_capture_vol(struct hda_codec *codec, hda_nid_t nid, 3584 const char *label) 3585 { 3586 unsigned int caps, nums; 3587 char name[32]; 3588 3589 if (!(get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) 3590 return 0; 3591 caps = query_amp_caps(codec, nid, HDA_OUTPUT); 3592 nums = (caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT; 3593 if (!nums) 3594 return 0; 3595 snprintf(name, sizeof(name), "%s Capture Volume", label); 3596 return stac92xx_add_control(codec->spec, STAC_CTL_WIDGET_VOL, name, 3597 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT)); 3598 } 3599 3377 3600 /* create playback/capture controls for input pins on dmic capable codecs */ 3378 3601 static int stac92xx_auto_create_dmic_input_ctls(struct hda_codec *codec, … … 3380 3603 { 3381 3604 struct sigmatel_spec *spec = codec->spec; 3605 struct hda_input_mux *imux = &spec->private_imux; 3382 3606 struct hda_input_mux *dimux = &spec->private_dimux; 3383 hda_nid_t con_lst[HDA_MAX_NUM_INPUTS]; 3384 int err, i, j; 3385 char name[32]; 3607 int err, i, active_mics; 3608 unsigned int def_conf; 3386 3609 3387 3610 dimux->items[dimux->num_items].label = stac92xx_dmic_labels[0]; … … 3389 3612 dimux->num_items++; 3390 3613 3614 active_mics = 0; 3615 for (i = 0; i < spec->num_dmics; i++) { 3616 /* check the validity: sometimes it's a dead vendor-spec node */ 3617 if (get_wcaps_type(get_wcaps(codec, spec->dmic_nids[i])) 3618 != AC_WID_PIN) 3619 continue; 3620 def_conf = snd_hda_codec_get_pincfg(codec, spec->dmic_nids[i]); 3621 if (get_defcfg_connect(def_conf) != AC_JACK_PORT_NONE) 3622 active_mics++; 3623 } 3624 3391 3625 for (i = 0; i < spec->num_dmics; i++) { 3392 3626 hda_nid_t nid; 3393 3627 int index; 3394 int num_cons; 3395 unsigned int wcaps; 3396 unsigned int def_conf; 3397 3398 def_conf = snd_hda_codec_get_pincfg(codec, spec->dmic_nids[i]); 3628 const char *label; 3629 3630 nid = spec->dmic_nids[i]; 3631 if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN) 3632 continue; 3633 def_conf = snd_hda_codec_get_pincfg(codec, nid); 3399 3634 if (get_defcfg_connect(def_conf) == AC_JACK_PORT_NONE) 3400 3635 continue; 3401 3636 3402 nid = spec->dmic_nids[i]; 3403 num_cons = snd_hda_get_connections(codec, 3404 spec->dmux_nids[0], 3405 con_lst, 3406 HDA_MAX_NUM_INPUTS); 3407 for (j = 0; j < num_cons; j++) 3408 if (con_lst[j] == nid) { 3409 index = j; 3410 goto found; 3411 } 3412 continue; 3413 found: 3414 wcaps = get_wcaps(codec, nid) & 3415 (AC_WCAP_OUT_AMP | AC_WCAP_IN_AMP); 3416 3417 if (wcaps) { 3418 sprintf(name, "%s Capture Volume", 3419 stac92xx_dmic_labels[dimux->num_items]); 3420 3421 err = stac92xx_add_control(spec, 3422 STAC_CTL_WIDGET_VOL, 3423 name, 3424 HDA_COMPOSE_AMP_VAL(nid, 3, 0, 3425 (wcaps & AC_WCAP_OUT_AMP) ? 3426 HDA_OUTPUT : HDA_INPUT)); 3427 if (err < 0) 3428 return err; 3429 } 3430 3431 dimux->items[dimux->num_items].label = 3432 stac92xx_dmic_labels[dimux->num_items]; 3637 index = get_connection_index(codec, spec->dmux_nids[0], nid); 3638 if (index < 0) 3639 continue; 3640 3641 if (active_mics == 1) 3642 label = "Digital Mic"; 3643 else 3644 label = stac92xx_dmic_labels[dimux->num_items]; 3645 3646 err = create_elem_capture_vol(codec, nid, label); 3647 if (err < 0) 3648 return err; 3649 3650 dimux->items[dimux->num_items].label = label; 3433 3651 dimux->items[dimux->num_items].index = index; 3434 3652 dimux->num_items++; 3653 if (snd_hda_get_bool_hint(codec, "separate_dmux") != 1) { 3654 imux->items[imux->num_items].label = label; 3655 imux->items[imux->num_items].index = index; 3656 imux->num_items++; 3657 } 3435 3658 } 3436 3659 3437 3660 return 0; 3661 } 3662 3663 static int check_mic_pin(struct hda_codec *codec, hda_nid_t nid, 3664 hda_nid_t *fixed, hda_nid_t *ext) 3665 { 3666 unsigned int cfg; 3667 3668 if (!nid) 3669 return 0; 3670 cfg = snd_hda_codec_get_pincfg(codec, nid); 3671 switch (get_defcfg_connect(cfg)) { 3672 case AC_JACK_PORT_FIXED: 3673 if (*fixed) 3674 return 1; /* already occupied */ 3675 *fixed = nid; 3676 break; 3677 case AC_JACK_PORT_COMPLEX: 3678 if (*ext) 3679 return 1; /* already occupied */ 3680 *ext = nid; 3681 break; 3682 } 3683 return 0; 3684 } 3685 3686 static int set_mic_route(struct hda_codec *codec, 3687 struct sigmatel_mic_route *mic, 3688 hda_nid_t pin) 3689 { 3690 struct sigmatel_spec *spec = codec->spec; 3691 struct auto_pin_cfg *cfg = &spec->autocfg; 3692 int i; 3693 3694 mic->pin = pin; 3695 for (i = AUTO_PIN_MIC; i <= AUTO_PIN_FRONT_MIC; i++) 3696 if (pin == cfg->input_pins[i]) 3697 break; 3698 if (i <= AUTO_PIN_FRONT_MIC) { 3699 /* analog pin */ 3700 mic->dmux_idx = 0; 3701 i = get_connection_index(codec, spec->mux_nids[0], pin); 3702 if (i < 0) 3703 return -1; 3704 mic->mux_idx = i; 3705 } else if (spec->dmux_nids) { 3706 /* digital pin */ 3707 mic->mux_idx = 0; 3708 i = get_connection_index(codec, spec->dmux_nids[0], pin); 3709 if (i < 0) 3710 return -1; 3711 mic->dmux_idx = i; 3712 } 3713 return 0; 3714 } 3715 3716 /* return non-zero if the device is for automatic mic switch */ 3717 static int stac_check_auto_mic(struct hda_codec *codec) 3718 { 3719 struct sigmatel_spec *spec = codec->spec; 3720 struct auto_pin_cfg *cfg = &spec->autocfg; 3721 hda_nid_t fixed, ext; 3722 int i; 3723 3724 for (i = AUTO_PIN_LINE; i < AUTO_PIN_LAST; i++) { 3725 if (cfg->input_pins[i]) 3726 return 0; /* must be exclusively mics */ 3727 } 3728 fixed = ext = 0; 3729 for (i = AUTO_PIN_MIC; i <= AUTO_PIN_FRONT_MIC; i++) 3730 if (check_mic_pin(codec, cfg->input_pins[i], &fixed, &ext)) 3731 return 0; 3732 for (i = 0; i < spec->num_dmics; i++) 3733 if (check_mic_pin(codec, spec->dmic_nids[i], &fixed, &ext)) 3734 return 0; 3735 if (!fixed || !ext) 3736 return 0; 3737 if (!(get_wcaps(codec, ext) & AC_WCAP_UNSOL_CAP)) 3738 return 0; /* no unsol support */ 3739 if (set_mic_route(codec, &spec->ext_mic, ext) || 3740 set_mic_route(codec, &spec->int_mic, fixed)) 3741 return 0; /* something is wrong */ 3742 return 1; 3438 3743 } 3439 3744 … … 3443 3748 struct sigmatel_spec *spec = codec->spec; 3444 3749 struct hda_input_mux *imux = &spec->private_imux; 3445 hda_nid_t con_lst[HDA_MAX_NUM_INPUTS]; 3446 int i, j, k; 3750 int i, j; 3447 3751 3448 3752 for (i = 0; i < AUTO_PIN_LAST; i++) { 3449 int index; 3450 3451 if (!cfg->input_pins[i]) 3753 hda_nid_t nid = cfg->input_pins[i]; 3754 int index, err; 3755 3756 if (!nid) 3452 3757 continue; 3453 3758 index = -1; 3454 3759 for (j = 0; j < spec->num_muxes; j++) { 3455 int num_cons; 3456 num_cons = snd_hda_get_connections(codec, 3457 spec->mux_nids[j], 3458 con_lst, 3459 HDA_MAX_NUM_INPUTS); 3460 for (k = 0; k < num_cons; k++) 3461 if (con_lst[k] == cfg->input_pins[i]) { 3462 index = k; 3463 goto found; 3464 } 3760 index = get_connection_index(codec, spec->mux_nids[j], 3761 nid); 3762 if (index >= 0) 3763 break; 3465 3764 } 3466 continue; 3467 found: 3765 if (index < 0) 3766 continue; 3767 3768 err = create_elem_capture_vol(codec, nid, 3769 auto_pin_cfg_labels[i]); 3770 if (err < 0) 3771 return err; 3772 3468 3773 imux->items[imux->num_items].label = auto_pin_cfg_labels[i]; 3469 3774 imux->items[imux->num_items].index = index; 3470 3775 imux->num_items++; 3471 3776 } 3777 spec->num_analog_muxes = imux->num_items; 3472 3778 3473 3779 if (imux->num_items) { … … 3521 3827 struct sigmatel_spec *spec = codec->spec; 3522 3828 int hp_swap = 0; 3523 int err;3829 int i, err; 3524 3830 3525 3831 if ((err = snd_hda_parse_pin_def_config(codec, … … 3561 3867 spec->autocfg.mono_out_pin, conn_list, 1) && 3562 3868 snd_hda_get_connections(codec, conn_list[0], 3563 conn_list, 1) ) {3869 conn_list, 1) > 0) { 3564 3870 3565 3871 int wcaps = get_wcaps(codec, conn_list[0]); 3566 int wid_type = (wcaps & AC_WCAP_TYPE) 3567 >> AC_WCAP_TYPE_SHIFT; 3872 int wid_type = get_wcaps_type(wcaps); 3568 3873 /* LR swap check, some stac925x have a mux that 3569 3874 * changes the DACs output path instead of the … … 3630 3935 if (err < 0) 3631 3936 return err; 3937 /* IDT/STAC codecs have linear beep tone parameter */ 3938 codec->beep->linear_tone = 1; 3632 3939 /* if no beep switch is available, make its own one */ 3633 3940 caps = query_amp_caps(codec, nid, HDA_OUTPUT); … … 3652 3959 spec->autocfg.line_out_type = AUTO_PIN_HP_OUT; 3653 3960 spec->autocfg.line_outs = 0; 3961 } 3962 3963 if (stac_check_auto_mic(codec)) { 3964 spec->auto_mic = 1; 3965 /* only one capture for auto-mic */ 3966 spec->num_adcs = 1; 3967 spec->num_caps = 1; 3968 spec->num_muxes = 1; 3969 } 3970 3971 for (i = 0; i < spec->num_caps; i++) { 3972 err = stac92xx_add_capvol_ctls(codec, spec->capvols[i], 3973 spec->capsws[i], i); 3974 if (err < 0) 3975 return err; 3654 3976 } 3655 3977 … … 3852 4174 } 3853 4175 3854 #ifdef CONFIG_SND_ JACK4176 #ifdef CONFIG_SND_HDA_INPUT_JACK 3855 4177 static void stac92xx_free_jack_priv(struct snd_jack *jack) 3856 4178 { … … 3864 4186 hda_nid_t nid, int type) 3865 4187 { 3866 #ifdef CONFIG_SND_ JACK4188 #ifdef CONFIG_SND_HDA_INPUT_JACK 3867 4189 struct sigmatel_spec *spec = codec->spec; 3868 4190 struct sigmatel_jack *jack; … … 3882 4204 jack->type = type; 3883 4205 3884 s printf(name, "%s at %s %s Jack",4206 snprintf(name, sizeof(name), "%s at %s %s Jack", 3885 4207 snd_hda_get_jack_type(def_conf), 3886 4208 snd_hda_get_jack_connectivity(def_conf), … … 3916 4238 3917 4239 static struct sigmatel_event *stac_get_event(struct hda_codec *codec, 3918 hda_nid_t nid , unsigned char type)4240 hda_nid_t nid) 3919 4241 { 3920 4242 struct sigmatel_spec *spec = codec->spec; … … 3923 4245 3924 4246 for (i = 0; i < spec->events.used; i++, event++) { 3925 if (event->nid == nid && event->type == type)4247 if (event->nid == nid) 3926 4248 return event; 3927 4249 } … … 3943 4265 } 3944 4266 3945 static void enable_pin_detect(struct hda_codec *codec, hda_nid_t nid, 3946 unsigned int type) 4267 /* check if given nid is a valid pin and no other events are assigned 4268 * to it. If OK, assign the event, set the unsol flag, and returns 1. 4269 * Otherwise, returns zero. 4270 */ 4271 static int enable_pin_detect(struct hda_codec *codec, hda_nid_t nid, 4272 unsigned int type) 3947 4273 { 3948 4274 struct sigmatel_event *event; … … 3950 4276 3951 4277 if (!(get_wcaps(codec, nid) & AC_WCAP_UNSOL_CAP)) 3952 return; 3953 event = stac_get_event(codec, nid, type); 3954 if (event) 4278 return 0; 4279 event = stac_get_event(codec, nid); 4280 if (event) { 4281 if (event->type != type) 4282 return 0; 3955 4283 tag = event->tag; 3956 else4284 } else { 3957 4285 tag = stac_add_event(codec->spec, nid, type, 0); 3958 if (tag < 0) 3959 return; 4286 if (tag < 0) 4287 return 0; 4288 } 3960 4289 snd_hda_codec_write_cache(codec, nid, 0, 3961 4290 AC_VERB_SET_UNSOLICITED_ENABLE, 3962 4291 AC_USRSP_EN | tag); 4292 return 1; 3963 4293 } 3964 4294 … … 4053 4383 enable_pin_detect(codec, nid, STAC_HP_EVENT); 4054 4384 } 4385 if (cfg->line_out_type == AUTO_PIN_LINE_OUT && 4386 cfg->speaker_outs > 0) { 4387 /* enable pin-detect for line-outs as well */ 4388 for (i = 0; i < cfg->line_outs; i++) { 4389 hda_nid_t nid = cfg->line_out_pins[i]; 4390 enable_pin_detect(codec, nid, STAC_LO_EVENT); 4391 } 4392 } 4393 4055 4394 /* force to enable the first line-out; the others are set up 4056 4395 * in unsol_event … … 4059 4398 AC_PINCTL_OUT_EN); 4060 4399 /* fake event to set up pins */ 4061 stac_issue_unsol_event(codec, spec->autocfg.hp_pins[0], 4062 STAC_HP_EVENT); 4400 stac_issue_unsol_event(codec, spec->autocfg.hp_pins[0]); 4063 4401 } else { 4064 4402 stac92xx_auto_init_multi_out(codec); … … 4066 4404 for (i = 0; i < cfg->hp_outs; i++) 4067 4405 stac_toggle_power_map(codec, cfg->hp_pins[i], 1); 4406 } 4407 if (spec->auto_mic) { 4408 /* initialize connection to analog input */ 4409 if (spec->dmux_nids) 4410 snd_hda_codec_write_cache(codec, spec->dmux_nids[0], 0, 4411 AC_VERB_SET_CONNECT_SEL, 0); 4412 if (enable_pin_detect(codec, spec->ext_mic.pin, STAC_MIC_EVENT)) 4413 stac_issue_unsol_event(codec, spec->ext_mic.pin); 4068 4414 } 4069 4415 for (i = 0; i < AUTO_PIN_LAST; i++) { … … 4073 4419 if (i == AUTO_PIN_MIC || i == AUTO_PIN_FRONT_MIC) { 4074 4420 /* for mic pins, force to initialize */ 4075 pinctl = stac92xx_get_ vref(codec, nid);4421 pinctl = stac92xx_get_default_vref(codec, nid); 4076 4422 pinctl |= AC_PINCTL_IN_EN; 4077 4423 stac92xx_auto_set_pinctl(codec, nid, pinctl); … … 4080 4426 AC_VERB_GET_PIN_WIDGET_CONTROL, 0); 4081 4427 /* if PINCTL already set then skip */ 4082 if (!(pinctl & AC_PINCTL_IN_EN)) { 4428 /* Also, if both INPUT and OUTPUT are set, 4429 * it must be a BIOS bug; need to override, too 4430 */ 4431 if (!(pinctl & AC_PINCTL_IN_EN) || 4432 (pinctl & AC_PINCTL_OUT_EN)) { 4433 pinctl &= ~AC_PINCTL_OUT_EN; 4083 4434 pinctl |= AC_PINCTL_IN_EN; 4084 4435 stac92xx_auto_set_pinctl(codec, nid, … … 4088 4439 conf = snd_hda_codec_get_pincfg(codec, nid); 4089 4440 if (get_defcfg_connect(conf) != AC_JACK_PORT_FIXED) { 4090 enable_pin_detect(codec, nid, 4091 STAC_INSERT_EVENT); 4092 stac_issue_unsol_event(codec, nid, 4093 STAC_INSERT_EVENT); 4441 if (enable_pin_detect(codec, nid, 4442 STAC_INSERT_EVENT)) 4443 stac_issue_unsol_event(codec, nid); 4094 4444 } 4095 4445 } … … 4136 4486 continue; 4137 4487 } 4138 if (!stac_get_event(codec, nid, STAC_INSERT_EVENT)) { 4139 enable_pin_detect(codec, nid, STAC_PWR_EVENT); 4140 stac_issue_unsol_event(codec, nid, STAC_PWR_EVENT); 4141 } 4488 if (enable_pin_detect(codec, nid, STAC_PWR_EVENT)) 4489 stac_issue_unsol_event(codec, nid); 4142 4490 } 4143 4491 if (spec->dac_list) … … 4148 4496 static void stac92xx_free_jacks(struct hda_codec *codec) 4149 4497 { 4150 #ifdef CONFIG_SND_ JACK4498 #ifdef CONFIG_SND_HDA_INPUT_JACK 4151 4499 /* free jack instances manually when clearing/reconfiguring */ 4152 4500 struct sigmatel_spec *spec = codec->spec; … … 4242 4590 return 0; 4243 4591 } 4592 4593 static void stac92xx_line_out_detect(struct hda_codec *codec, 4594 int presence) 4595 { 4596 struct sigmatel_spec *spec = codec->spec; 4597 struct auto_pin_cfg *cfg = &spec->autocfg; 4598 int i; 4599 4600 for (i = 0; i < cfg->line_outs; i++) { 4601 if (presence) 4602 break; 4603 presence = get_pin_presence(codec, cfg->line_out_pins[i]); 4604 if (presence) { 4605 unsigned int pinctl; 4606 pinctl = snd_hda_codec_read(codec, 4607 cfg->line_out_pins[i], 0, 4608 AC_VERB_GET_PIN_WIDGET_CONTROL, 0); 4609 if (pinctl & AC_PINCTL_IN_EN) 4610 presence = 0; /* mic- or line-input */ 4611 } 4612 } 4613 4614 if (presence) { 4615 /* disable speakers */ 4616 for (i = 0; i < cfg->speaker_outs; i++) 4617 stac92xx_reset_pinctl(codec, cfg->speaker_pins[i], 4618 AC_PINCTL_OUT_EN); 4619 if (spec->eapd_mask && spec->eapd_switch) 4620 stac_gpio_set(codec, spec->gpio_mask, 4621 spec->gpio_dir, spec->gpio_data & 4622 ~spec->eapd_mask); 4623 } else { 4624 /* enable speakers */ 4625 for (i = 0; i < cfg->speaker_outs; i++) 4626 stac92xx_set_pinctl(codec, cfg->speaker_pins[i], 4627 AC_PINCTL_OUT_EN); 4628 if (spec->eapd_mask && spec->eapd_switch) 4629 stac_gpio_set(codec, spec->gpio_mask, 4630 spec->gpio_dir, spec->gpio_data | 4631 spec->eapd_mask); 4632 } 4633 } 4244 4634 4245 4635 /* return non-zero if the hp-pin of the given array index isn't … … 4295 4685 stac92xx_reset_pinctl(codec, cfg->line_out_pins[i], 4296 4686 AC_PINCTL_OUT_EN); 4297 for (i = 0; i < cfg->speaker_outs; i++)4298 stac92xx_reset_pinctl(codec, cfg->speaker_pins[i],4299 AC_PINCTL_OUT_EN);4300 if (spec->eapd_mask && spec->eapd_switch)4301 stac_gpio_set(codec, spec->gpio_mask,4302 spec->gpio_dir, spec->gpio_data &4303 ~spec->eapd_mask);4304 4687 } else { 4305 4688 /* enable lineouts */ … … 4310 4693 stac92xx_set_pinctl(codec, cfg->line_out_pins[i], 4311 4694 AC_PINCTL_OUT_EN); 4312 for (i = 0; i < cfg->speaker_outs; i++) 4313 stac92xx_set_pinctl(codec, cfg->speaker_pins[i], 4314 AC_PINCTL_OUT_EN); 4315 if (spec->eapd_mask && spec->eapd_switch) 4316 stac_gpio_set(codec, spec->gpio_mask, 4317 spec->gpio_dir, spec->gpio_data | 4318 spec->eapd_mask); 4319 } 4695 } 4696 stac92xx_line_out_detect(codec, presence); 4320 4697 /* toggle hp outs */ 4321 4698 for (i = 0; i < cfg->hp_outs; i++) { … … 4402 4779 } 4403 4780 4404 static void stac_issue_unsol_event(struct hda_codec *codec, hda_nid_t nid, 4405 unsigned char type) 4406 { 4407 struct sigmatel_event *event = stac_get_event(codec, nid, type); 4781 static void stac92xx_mic_detect(struct hda_codec *codec) 4782 { 4783 struct sigmatel_spec *spec = codec->spec; 4784 struct sigmatel_mic_route *mic; 4785 4786 if (get_pin_presence(codec, spec->ext_mic.pin)) 4787 mic = &spec->ext_mic; 4788 else 4789 mic = &spec->int_mic; 4790 if (mic->dmux_idx) 4791 snd_hda_codec_write_cache(codec, spec->dmux_nids[0], 0, 4792 AC_VERB_SET_CONNECT_SEL, 4793 mic->dmux_idx); 4794 else 4795 snd_hda_codec_write_cache(codec, spec->mux_nids[0], 0, 4796 AC_VERB_SET_CONNECT_SEL, 4797 mic->mux_idx); 4798 } 4799 4800 static void stac_issue_unsol_event(struct hda_codec *codec, hda_nid_t nid) 4801 { 4802 struct sigmatel_event *event = stac_get_event(codec, nid); 4408 4803 if (!event) 4409 4804 return; … … 4424 4819 switch (event->type) { 4425 4820 case STAC_HP_EVENT: 4821 case STAC_LO_EVENT: 4426 4822 stac92xx_hp_detect(codec); 4427 /* fallthru */ 4823 break; 4824 case STAC_MIC_EVENT: 4825 stac92xx_mic_detect(codec); 4826 break; 4827 } 4828 4829 switch (event->type) { 4830 case STAC_HP_EVENT: 4831 case STAC_LO_EVENT: 4832 case STAC_MIC_EVENT: 4428 4833 case STAC_INSERT_EVENT: 4429 4834 case STAC_PWR_EVENT: … … 4516 4921 /* fake event to set up pins again to override cached values */ 4517 4922 if (spec->hp_detect) 4518 stac_issue_unsol_event(codec, spec->autocfg.hp_pins[0], 4519 STAC_HP_EVENT); 4923 stac_issue_unsol_event(codec, spec->autocfg.hp_pins[0]); 4520 4924 return 0; 4521 4925 } 4522 4926 4523 4524 4927 /* 4525 * using power check for controlling mute led of HP HDXnotebooks4928 * using power check for controlling mute led of HP notebooks 4526 4929 * check for mute state only on Speakers (nid = 0x10) 4527 4930 * 4528 4931 * For this feature CONFIG_SND_HDA_POWER_SAVE is needed, otherwise 4529 4932 * the LED is NOT working properly ! 4933 * 4934 * Changed name to reflect that it now works for any designated 4935 * model, not just HP HDX. 4530 4936 */ 4531 4937 4532 4938 #ifdef CONFIG_SND_HDA_POWER_SAVE 4533 static int stac92xx_hp_ hdx_check_power_status(struct hda_codec *codec,4939 static int stac92xx_hp_check_power_status(struct hda_codec *codec, 4534 4940 hda_nid_t nid) 4535 4941 { … … 4539 4945 if (snd_hda_codec_amp_read(codec, nid, 0, HDA_OUTPUT, 0) & 4540 4946 HDA_AMP_MUTE) 4541 spec->gpio_data &= ~ 0x08;/* orange */4947 spec->gpio_data &= ~spec->gpio_led; /* orange */ 4542 4948 else 4543 spec->gpio_data |= 0x08;/* white */4949 spec->gpio_data |= spec->gpio_led; /* white */ 4544 4950 4545 4951 stac_gpio_set(codec, spec->gpio_mask, … … 4555 4961 { 4556 4962 struct sigmatel_spec *spec = codec->spec; 4963 int i; 4964 hda_nid_t nid; 4965 4966 /* reset each pin before powering down DAC/ADC to avoid click noise */ 4967 nid = codec->start_nid; 4968 for (i = 0; i < codec->num_nodes; i++, nid++) { 4969 unsigned int wcaps = get_wcaps(codec, nid); 4970 unsigned int wid_type = get_wcaps_type(wcaps); 4971 if (wid_type == AC_WID_PIN) 4972 snd_hda_codec_read(codec, nid, 0, 4973 AC_VERB_SET_PIN_WIDGET_CONTROL, 0); 4974 } 4975 4557 4976 if (spec->eapd_mask) 4558 4977 stac_gpio_set(codec, spec->gpio_mask, … … 4591 5010 stac9200_cfg_tbl); 4592 5011 if (spec->board_config < 0) 4593 snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC9200, using BIOS defaults\n"); 5012 snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", 5013 codec->chip_name); 4594 5014 else 4595 5015 stac92xx_set_config_regs(codec, … … 4663 5083 again: 4664 5084 if (spec->board_config < 0) 4665 snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC925x,"4666 "using BIOS defaults\n");5085 snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", 5086 codec->chip_name); 4667 5087 else 4668 5088 stac92xx_set_config_regs(codec, … … 4694 5114 spec->init = stac925x_core_init; 4695 5115 spec->mixer = stac925x_mixer; 5116 spec->num_caps = 1; 5117 spec->capvols = stac925x_capvols; 5118 spec->capsws = stac925x_capsws; 4696 5119 4697 5120 err = stac92xx_parse_auto_config(codec, 0x8, 0x7); … … 4714 5137 return 0; 4715 5138 } 4716 4717 static struct hda_input_mux stac92hd73xx_dmux = {4718 .num_items = 4,4719 .items = {4720 { "Analog Inputs", 0x0b },4721 { "Digital Mic 1", 0x09 },4722 { "Digital Mic 2", 0x0a },4723 { "CD", 0x08 },4724 }4725 };4726 5139 4727 5140 static int patch_stac92hd73xx(struct hda_codec *codec) … … 4746 5159 again: 4747 5160 if (spec->board_config < 0) 4748 snd_printdd(KERN_INFO "hda_codec: Unknown model for"4749 " STAC92HD73XX, using BIOS defaults\n");5161 snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", 5162 codec->chip_name); 4750 5163 else 4751 5164 stac92xx_set_config_regs(codec, … … 4794 5207 spec->num_adcs = ARRAY_SIZE(stac92hd73xx_adc_nids); 4795 5208 spec->num_dmuxes = ARRAY_SIZE(stac92hd73xx_dmux_nids); 4796 memcpy(&spec->private_dimux, &stac92hd73xx_dmux, 4797 sizeof(stac92hd73xx_dmux)); 5209 5210 spec->num_caps = STAC92HD73XX_NUM_CAPS; 5211 spec->capvols = stac92hd73xx_capvols; 5212 spec->capsws = stac92hd73xx_capsws; 4798 5213 4799 5214 switch (spec->board_config) { … … 4816 5231 snd_hda_codec_set_pincfg(codec, 0x0b, 0x90A70170); 4817 5232 spec->num_dmics = 0; 4818 spec->private_dimux.num_items = 1;4819 5233 break; 4820 5234 case STAC_DELL_M6_DMIC: /* Digital Mics */ 4821 5235 snd_hda_codec_set_pincfg(codec, 0x13, 0x90A60160); 4822 5236 spec->num_dmics = 1; 4823 spec->private_dimux.num_items = 2;4824 5237 break; 4825 5238 case STAC_DELL_M6_BOTH: /* Both */ … … 4827 5240 snd_hda_codec_set_pincfg(codec, 0x13, 0x90A60160); 4828 5241 spec->num_dmics = 1; 4829 spec->private_dimux.num_items = 2;4830 5242 break; 4831 5243 } … … 4835 5247 spec->num_smuxes = ARRAY_SIZE(stac92hd73xx_smux_nids); 4836 5248 spec->eapd_switch = 1; 5249 break; 4837 5250 } 4838 5251 if (spec->board_config > STAC_92HD73XX_REF) { … … 4841 5254 spec->gpio_data = 0x01; 4842 5255 } 4843 spec->dinput_mux = &spec->private_dimux;4844 5256 4845 5257 spec->num_pwrs = ARRAY_SIZE(stac92hd73xx_pwr_nids); … … 4873 5285 } 4874 5286 4875 static struct hda_input_mux stac92hd83xxx_dmux = {4876 .num_items = 3,4877 .items = {4878 { "Analog Inputs", 0x03 },4879 { "Digital Mic 1", 0x04 },4880 { "Digital Mic 2", 0x05 },4881 }4882 };4883 4884 5287 static int patch_stac92hd83xxx(struct hda_codec *codec) 4885 5288 { … … 4898 5301 spec->mono_nid = 0x19; 4899 5302 spec->digbeep_nid = 0x21; 4900 spec-> dmic_nids = stac92hd83xxx_dmic_nids;4901 spec-> dmux_nids = stac92hd83xxx_dmux_nids;5303 spec->mux_nids = stac92hd83xxx_mux_nids; 5304 spec->num_muxes = ARRAY_SIZE(stac92hd83xxx_mux_nids); 4902 5305 spec->adc_nids = stac92hd83xxx_adc_nids; 5306 spec->num_adcs = ARRAY_SIZE(stac92hd83xxx_adc_nids); 4903 5307 spec->pwr_nids = stac92hd83xxx_pwr_nids; 4904 spec->amp_nids = stac92hd83xxx_amp_nids;4905 5308 spec->pwr_mapping = stac92hd83xxx_pwr_mapping; 4906 5309 spec->num_pwrs = ARRAY_SIZE(stac92hd83xxx_pwr_nids); … … 4908 5311 4909 5312 spec->init = stac92hd83xxx_core_init; 4910 spec->mixer = stac92hd83xxx_mixer;4911 5313 spec->num_pins = ARRAY_SIZE(stac92hd83xxx_pin_nids); 4912 spec->num_dmuxes = ARRAY_SIZE(stac92hd83xxx_dmux_nids);4913 spec->num_adcs = ARRAY_SIZE(stac92hd83xxx_adc_nids);4914 spec->num_amps = ARRAY_SIZE(stac92hd83xxx_amp_nids);4915 spec->num_dmics = STAC92HD83XXX_NUM_DMICS;4916 spec->dinput_mux = &stac92hd83xxx_dmux;4917 5314 spec->pin_nids = stac92hd83xxx_pin_nids; 5315 spec->num_caps = STAC92HD83XXX_NUM_CAPS; 5316 spec->capvols = stac92hd83xxx_capvols; 5317 spec->capsws = stac92hd83xxx_capsws; 5318 4918 5319 spec->board_config = snd_hda_check_board_config(codec, 4919 5320 STAC_92HD83XXX_MODELS, … … 4922 5323 again: 4923 5324 if (spec->board_config < 0) 4924 snd_printdd(KERN_INFO "hda_codec: Unknown model for"4925 " STAC92HD83XXX, using BIOS defaults\n");5325 snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", 5326 codec->chip_name); 4926 5327 else 4927 5328 stac92xx_set_config_regs(codec, … … 4965 5366 num_dacs = snd_hda_get_connections(codec, nid, 4966 5367 conn, STAC92HD83_DAC_COUNT + 1) - 1; 5368 if (num_dacs < 0) 5369 num_dacs = STAC92HD83_DAC_COUNT; 4967 5370 4968 5371 /* set port X to select the last DAC … … 4977 5380 return 0; 4978 5381 } 4979 4980 static struct hda_input_mux stac92hd71bxx_dmux_nomixer = {4981 .num_items = 3,4982 .items = {4983 { "Analog Inputs", 0x00 },4984 { "Digital Mic 1", 0x02 },4985 { "Digital Mic 2", 0x03 },4986 }4987 };4988 4989 static struct hda_input_mux stac92hd71bxx_dmux_amixer = {4990 .num_items = 4,4991 .items = {4992 { "Analog Inputs", 0x00 },4993 { "Mixer", 0x01 },4994 { "Digital Mic 1", 0x02 },4995 { "Digital Mic 2", 0x03 },4996 }4997 };4998 5382 4999 5383 /* get the pin connection (fixed, none, etc) */ … … 5057 5441 struct hda_verb *unmute_init = stac92hd71bxx_unmute_core_init; 5058 5442 int err = 0; 5059 unsigned int ndmic_nids = 0;5060 5443 5061 5444 spec = kzalloc(sizeof(*spec), GFP_KERNEL); … … 5086 5469 again: 5087 5470 if (spec->board_config < 0) 5088 snd_printdd(KERN_INFO "hda_codec: Unknown model for"5089 " STAC92HD71BXX, using BIOS defaults\n");5471 snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", 5472 codec->chip_name); 5090 5473 else 5091 5474 stac92xx_set_config_regs(codec, … … 5101 5484 spec->dmic_nids = stac92hd71bxx_dmic_nids; 5102 5485 spec->dmux_nids = stac92hd71bxx_dmux_nids; 5486 5487 spec->num_caps = STAC92HD71BXX_NUM_CAPS; 5488 spec->capvols = stac92hd71bxx_capvols; 5489 spec->capsws = stac92hd71bxx_capsws; 5103 5490 5104 5491 switch (codec->vendor_id) { … … 5109 5496 case 0x111d76b4: /* 6 Port without Analog Mixer */ 5110 5497 case 0x111d76b5: 5111 memcpy(&spec->private_dimux, &stac92hd71bxx_dmux_nomixer,5112 sizeof(stac92hd71bxx_dmux_nomixer));5113 spec->mixer = stac92hd71bxx_mixer;5114 5498 spec->init = stac92hd71bxx_core_init; 5115 5499 codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs; … … 5117 5501 stac92hd71bxx_dmic_nids, 5118 5502 STAC92HD71BXX_NUM_DMICS); 5119 if (spec->num_dmics) {5120 spec->num_dmuxes = ARRAY_SIZE(stac92hd71bxx_dmux_nids);5121 spec->dinput_mux = &spec->private_dimux;5122 ndmic_nids = ARRAY_SIZE(stac92hd71bxx_dmic_nids) - 1;5123 }5124 5503 break; 5125 5504 case 0x111d7608: /* 5 Port with Analog Mixer */ 5126 memcpy(&spec->private_dimux, &stac92hd71bxx_dmux_amixer,5127 sizeof(stac92hd71bxx_dmux_amixer));5128 spec->private_dimux.num_items--;5129 5505 switch (spec->board_config) { 5130 5506 case STAC_HP_M4: … … 5148 5524 /* no output amps */ 5149 5525 spec->num_pwrs = 0; 5150 spec->mixer = stac92hd71bxx_analog_mixer;5151 spec->dinput_mux = &spec->private_dimux;5152 5153 5526 /* disable VSW */ 5154 spec->init = &stac92hd71bxx_analog_core_init[HD_DISABLE_PORTF];5527 spec->init = stac92hd71bxx_core_init; 5155 5528 unmute_init++; 5156 5529 snd_hda_codec_set_pincfg(codec, 0x0f, 0x40f000f0); … … 5160 5533 stac92hd71bxx_dmic_nids, 5161 5534 STAC92HD71BXX_NUM_DMICS - 1); 5162 spec->num_dmuxes = ARRAY_SIZE(stac92hd71bxx_dmux_nids);5163 ndmic_nids = ARRAY_SIZE(stac92hd71bxx_dmic_nids) - 2;5164 5535 break; 5165 5536 case 0x111d7603: /* 6 Port with Analog Mixer */ … … 5171 5542 /* fallthru */ 5172 5543 default: 5173 memcpy(&spec->private_dimux, &stac92hd71bxx_dmux_amixer, 5174 sizeof(stac92hd71bxx_dmux_amixer)); 5175 spec->dinput_mux = &spec->private_dimux; 5176 spec->mixer = stac92hd71bxx_analog_mixer; 5177 spec->init = stac92hd71bxx_analog_core_init; 5544 spec->init = stac92hd71bxx_core_init; 5178 5545 codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs; 5179 5546 spec->num_dmics = stac92hd71bxx_connected_ports(codec, 5180 5547 stac92hd71bxx_dmic_nids, 5181 5548 STAC92HD71BXX_NUM_DMICS); 5182 spec->num_dmuxes = ARRAY_SIZE(stac92hd71bxx_dmux_nids); 5183 ndmic_nids = ARRAY_SIZE(stac92hd71bxx_dmic_nids) - 1; 5549 break; 5184 5550 } 5185 5551 5186 5552 if (get_wcaps(codec, 0xa) & AC_WCAP_IN_AMP) 5187 5553 snd_hda_sequence_write_cache(codec, unmute_init); 5554 5555 /* Some HP machines seem to have unstable codec communications 5556 * especially with ATI fglrx driver. For recovering from the 5557 * CORB/RIRB stall, allow the BUS reset and keep always sync 5558 */ 5559 if (spec->board_config == STAC_HP_DV5) { 5560 codec->bus->sync_write = 1; 5561 codec->bus->allow_bus_reset = 1; 5562 } 5188 5563 5189 5564 spec->aloopback_ctl = stac92hd71bxx_loopback; … … 5200 5575 spec->num_muxes = ARRAY_SIZE(stac92hd71bxx_mux_nids); 5201 5576 spec->num_adcs = ARRAY_SIZE(stac92hd71bxx_adc_nids); 5577 spec->num_dmuxes = ARRAY_SIZE(stac92hd71bxx_dmux_nids); 5202 5578 spec->num_smuxes = stac92hd71bxx_connected_smuxes(codec, 0x1e); 5203 5579 … … 5220 5596 spec->num_dmuxes = 1; 5221 5597 break; 5598 case STAC_HP_DV4_1222NR: 5599 spec->num_dmics = 1; 5600 /* I don't know if it needs 1 or 2 smuxes - will wait for 5601 * bug reports to fix if needed 5602 */ 5603 spec->num_smuxes = 1; 5604 spec->num_dmuxes = 1; 5605 spec->gpio_led = 0x01; 5606 /* fallthrough */ 5222 5607 case STAC_HP_DV5: 5223 5608 snd_hda_codec_set_pincfg(codec, 0x0d, 0x90170010); … … 5228 5613 spec->num_dmuxes = 1; 5229 5614 spec->num_smuxes = 1; 5230 /* 5231 * For controlling MUTE LED on HP HDX16/HDX18 notebooks, 5232 * the CONFIG_SND_HDA_POWER_SAVE is needed to be set. 5233 */ 5615 /* orange/white mute led on GPIO3, orange=0, white=1 */ 5616 spec->gpio_led = 0x08; 5617 break; 5618 } 5619 5234 5620 #ifdef CONFIG_SND_HDA_POWER_SAVE 5235 /* orange/white mute led on GPIO3, orange=0, white=1 */ 5236 spec->gpio_mask |= 0x08; 5237 spec->gpio_dir |= 0x08; 5238 spec->gpio_data |= 0x08; /* set to white */ 5239 5621 if (spec->gpio_led) { 5622 spec->gpio_mask |= spec->gpio_led; 5623 spec->gpio_dir |= spec->gpio_led; 5624 spec->gpio_data |= spec->gpio_led; 5240 5625 /* register check_power_status callback. */ 5241 5626 codec->patch_ops.check_power_status = 5242 stac92xx_hp_hdx_check_power_status; 5627 stac92xx_hp_check_power_status; 5628 } 5243 5629 #endif 5244 break;5245 };5246 5630 5247 5631 spec->multiout.dac_nids = spec->dac_nids; 5248 if (spec->dinput_mux)5249 spec->private_dimux.num_items += spec->num_dmics - ndmic_nids;5250 5632 5251 5633 err = stac92xx_parse_auto_config(codec, 0x21, 0); … … 5268 5650 5269 5651 return 0; 5270 } ;5652 } 5271 5653 5272 5654 static int patch_stac922x(struct hda_codec *codec) … … 5325 5707 again: 5326 5708 if (spec->board_config < 0) 5327 snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC922x, "5328 "using BIOS defaults\n");5709 snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", 5710 codec->chip_name); 5329 5711 else 5330 5712 stac92xx_set_config_regs(codec, … … 5339 5721 5340 5722 spec->init = stac922x_core_init; 5341 spec->mixer = stac922x_mixer; 5723 5724 spec->num_caps = STAC922X_NUM_CAPS; 5725 spec->capvols = stac922x_capvols; 5726 spec->capsws = stac922x_capsws; 5342 5727 5343 5728 spec->multiout.dac_nids = spec->dac_nids; … … 5388 5773 again: 5389 5774 if (spec->board_config < 0) 5390 snd_printdd(KERN_INFO "hda_codec: Unknown model for"5391 "STAC927x, using BIOS defaults\n");5775 snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", 5776 codec->chip_name); 5392 5777 else 5393 5778 stac92xx_set_config_regs(codec, … … 5414 5799 5415 5800 spec->init = d965_core_init; 5416 spec->mixer = stac927x_mixer;5417 5801 break; 5418 5802 case STAC_DELL_BIOS: … … 5423 5807 snd_hda_codec_set_pincfg(codec, 0x21, 0x01442070); 5424 5808 break; 5425 } ;5809 } 5426 5810 /* configure the analog microphone on some laptops */ 5427 5811 snd_hda_codec_set_pincfg(codec, 0x0c, 0x90a79130); … … 5435 5819 spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x04; 5436 5820 spec->gpio_data = 0x04; 5821 switch (codec->subsystem_id) { 5822 case 0x1028022f: 5823 /* correct EAPD to be GPIO0 */ 5824 spec->eapd_mask = spec->gpio_mask = 0x01; 5825 spec->gpio_dir = spec->gpio_data = 0x01; 5826 break; 5827 }; 5437 5828 spec->dmic_nids = stac927x_dmic_nids; 5438 5829 spec->num_dmics = STAC927X_NUM_DMICS; 5439 5830 5440 5831 spec->init = d965_core_init; 5441 spec->mixer = stac927x_mixer;5442 5832 spec->dmux_nids = stac927x_dmux_nids; 5443 5833 spec->num_dmuxes = ARRAY_SIZE(stac927x_dmux_nids); … … 5452 5842 5453 5843 spec->init = stac927x_core_init; 5454 spec->mixer = stac927x_mixer; 5455 } 5844 } 5845 5846 spec->num_caps = STAC927X_NUM_CAPS; 5847 spec->capvols = stac927x_capvols; 5848 spec->capsws = stac927x_capsws; 5456 5849 5457 5850 spec->num_pwrs = 0; … … 5516 5909 again: 5517 5910 if (spec->board_config < 0) 5518 snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC9205, using BIOS defaults\n"); 5911 snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", 5912 codec->chip_name); 5519 5913 else 5520 5914 stac92xx_set_config_regs(codec, … … 5535 5929 5536 5930 spec->init = stac9205_core_init; 5537 spec->mixer = stac9205_mixer;5538 5931 spec->aloopback_ctl = stac9205_loopback; 5932 5933 spec->num_caps = STAC9205_NUM_CAPS; 5934 spec->capvols = stac9205_capvols; 5935 spec->capsws = stac9205_capsws; 5539 5936 5540 5937 spec->aloopback_mask = 0x40; … … 5612 6009 }; 5613 6010 5614 static struct snd_kcontrol_new stac9872_mixer[] = {5615 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0, HDA_INPUT),5616 HDA_CODEC_MUTE("Capture Switch", 0x09, 0, HDA_INPUT),5617 {0} /* end */5618 };5619 5620 6011 static hda_nid_t stac9872_pin_nids[] = { 5621 6012 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, … … 5630 6021 0x15 5631 6022 }; 6023 6024 static unsigned long stac9872_capvols[] = { 6025 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT), 6026 }; 6027 #define stac9872_capsws stac9872_capvols 5632 6028 5633 6029 static unsigned int stac9872_vaio_pin_configs[9] = { … … 5647 6043 5648 6044 static struct snd_pci_quirk stac9872_cfg_tbl[] = { 6045 SND_PCI_QUIRK_MASK(0x104d, 0xfff0, 0x81e0, 6046 "Sony VAIO F/S", STAC_9872_VAIO), 5649 6047 {0} /* terminator */ 5650 6048 }; … … 5659 6057 return -ENOMEM; 5660 6058 codec->spec = spec; 6059 spec->num_pins = ARRAY_SIZE(stac9872_pin_nids); 6060 spec->pin_nids = stac9872_pin_nids; 5661 6061 5662 6062 spec->board_config = snd_hda_check_board_config(codec, STAC_9872_MODELS, … … 5664 6064 stac9872_cfg_tbl); 5665 6065 if (spec->board_config < 0) 5666 snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC9872, "5667 "using BIOS defaults\n");6066 snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n", 6067 codec->chip_name); 5668 6068 else 5669 6069 stac92xx_set_config_regs(codec, 5670 6070 stac9872_brd_tbl[spec->board_config]); 5671 6071 5672 spec->num_pins = ARRAY_SIZE(stac9872_pin_nids);5673 spec->pin_nids = stac9872_pin_nids;5674 6072 spec->multiout.dac_nids = spec->dac_nids; 5675 6073 spec->num_adcs = ARRAY_SIZE(stac9872_adc_nids); … … 5677 6075 spec->num_muxes = ARRAY_SIZE(stac9872_mux_nids); 5678 6076 spec->mux_nids = stac9872_mux_nids; 5679 spec->mixer = stac9872_mixer;5680 6077 spec->init = stac9872_core_init; 6078 spec->num_caps = 1; 6079 spec->capvols = stac9872_capvols; 6080 spec->capsws = stac9872_capsws; 5681 6081 5682 6082 err = stac92xx_parse_auto_config(codec, 0x10, 0x12); … … 5733 6133 { .id = 0x83847662, .name = "STAC9872AK", .patch = patch_stac9872 }, 5734 6134 { .id = 0x83847664, .name = "CXD9872AKD", .patch = patch_stac9872 }, 6135 { .id = 0x83847698, .name = "STAC9205", .patch = patch_stac9205 }, 5735 6136 { .id = 0x838476a0, .name = "STAC9205", .patch = patch_stac9205 }, 5736 6137 { .id = 0x838476a1, .name = "STAC9205D", .patch = patch_stac9205 }, -
GPL/trunk/alsa-kernel/pci/hda/patch_via.c
r426 r464 206 206 /* playback */ 207 207 struct hda_multi_out multiout; 208 hda_nid_t extra_dig_out_nid;208 hda_nid_t slave_dig_outs[2]; 209 209 210 210 /* capture */ 211 211 unsigned int num_adc_nids; 212 212 hda_nid_t *adc_nids; 213 hda_nid_t mux_nids[3]; 213 214 hda_nid_t dig_in_nid; 215 hda_nid_t dig_in_pin; 214 216 215 217 /* capture source */ … … 320 322 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE, 321 323 AMP_OUT_UNMUTE); 324 if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD) 325 snd_hda_codec_write(codec, nid, 0, 326 AC_VERB_SET_EAPD_BTLENABLE, 0x02); 322 327 } 323 328 … … 388 393 struct via_spec *spec = codec->spec; 389 394 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id); 390 unsigned int vendor_id = codec->vendor_id; 391 392 /* AIW0 lydia 060801 add for correct sw0 input select */ 393 if (IS_VT1708_VENDORID(vendor_id) && (adc_idx == 0)) 394 return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol, 395 0x18, &spec->cur_mux[adc_idx]); 396 else if ((IS_VT1709_10CH_VENDORID(vendor_id) || 397 IS_VT1709_6CH_VENDORID(vendor_id)) && (adc_idx == 0)) 398 return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol, 399 0x19, &spec->cur_mux[adc_idx]); 400 else if ((IS_VT1708B_8CH_VENDORID(vendor_id) || 401 IS_VT1708B_4CH_VENDORID(vendor_id)) && (adc_idx == 0)) 402 return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol, 403 0x17, &spec->cur_mux[adc_idx]); 404 else if (IS_VT1702_VENDORID(vendor_id) && (adc_idx == 0)) 405 return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol, 406 0x13, &spec->cur_mux[adc_idx]); 407 else 408 return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol, 409 spec->adc_nids[adc_idx], 410 &spec->cur_mux[adc_idx]); 395 396 if (!spec->mux_nids[adc_idx]) 397 return -EINVAL; 398 return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol, 399 spec->mux_nids[adc_idx], 400 &spec->cur_mux[adc_idx]); 411 401 } 412 402 … … 732 722 } 733 723 734 /* setup SPDIF output stream */735 static void setup_dig_playback_stream(struct hda_codec *codec, hda_nid_t nid,736 unsigned int stream_tag, unsigned int format)737 {738 /* turn off SPDIF once; otherwise the IEC958 bits won't be updated */739 if (codec->spdif_ctls & AC_DIG1_ENABLE)740 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_1,741 codec->spdif_ctls & ~AC_DIG1_ENABLE & 0xff);742 snd_hda_codec_setup_stream(codec, nid, stream_tag, 0, format);743 /* turn on again (if needed) */744 if (codec->spdif_ctls & AC_DIG1_ENABLE)745 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_1,746 codec->spdif_ctls & 0xff);747 }748 749 724 static int via_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo, 750 725 struct hda_codec *codec, … … 754 729 { 755 730 struct via_spec *spec = codec->spec; 756 hda_nid_t nid; 757 758 /* 1st or 2nd S/PDIF */ 759 if (substream->number == 0) 760 nid = spec->multiout.dig_out_nid; 761 else if (substream->number == 1) 762 nid = spec->extra_dig_out_nid; 763 else 764 return -1; 765 766 mutex_lock(&codec->spdif_mutex); 767 setup_dig_playback_stream(codec, nid, stream_tag, format); 768 mutex_unlock(&codec->spdif_mutex); 731 return snd_hda_multi_out_dig_prepare(codec, &spec->multiout, 732 stream_tag, format, substream); 733 } 734 735 static int via_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo, 736 struct hda_codec *codec, 737 struct snd_pcm_substream *substream) 738 { 739 struct via_spec *spec = codec->spec; 740 snd_hda_multi_out_dig_cleanup(codec, &spec->multiout); 769 741 return 0; 770 742 } … … 843 815 .open = via_dig_playback_pcm_open, 844 816 .close = via_dig_playback_pcm_close, 845 .prepare = via_dig_playback_pcm_prepare 817 .prepare = via_dig_playback_pcm_prepare, 818 .cleanup = via_dig_playback_pcm_cleanup 846 819 }, 847 820 }; … … 875 848 return err; 876 849 spec->multiout.share_spdif = 1; 877 878 if (spec->extra_dig_out_nid) {879 err = snd_hda_create_spdif_out_ctls(codec,880 spec->extra_dig_out_nid);881 if (err < 0)882 return err;883 }884 850 } 885 851 if (spec->dig_in_nid) { … … 1014 980 } 1015 981 1016 static hda_nid_t slave_dig_outs[] = {1017 0,1018 };1019 1020 982 static int via_init(struct hda_codec *codec) 1021 983 { … … 1027 989 /* Lydia Add for EAPD enable */ 1028 990 if (!spec->dig_in_nid) { /* No Digital In connection */ 1029 if ( IS_VT1708_VENDORID(codec->vendor_id)) {1030 snd_hda_codec_write(codec, VT1708_DIGIN_PIN, 0,991 if (spec->dig_in_pin) { 992 snd_hda_codec_write(codec, spec->dig_in_pin, 0, 1031 993 AC_VERB_SET_PIN_WIDGET_CONTROL, 1032 994 PIN_OUT); 1033 snd_hda_codec_write(codec, VT1708_DIGIN_PIN, 0, 1034 AC_VERB_SET_EAPD_BTLENABLE, 0x02); 1035 } else if (IS_VT1709_10CH_VENDORID(codec->vendor_id) || 1036 IS_VT1709_6CH_VENDORID(codec->vendor_id)) { 1037 snd_hda_codec_write(codec, VT1709_DIGIN_PIN, 0, 1038 AC_VERB_SET_PIN_WIDGET_CONTROL, 1039 PIN_OUT); 1040 snd_hda_codec_write(codec, VT1709_DIGIN_PIN, 0, 1041 AC_VERB_SET_EAPD_BTLENABLE, 0x02); 1042 } else if (IS_VT1708B_8CH_VENDORID(codec->vendor_id) || 1043 IS_VT1708B_4CH_VENDORID(codec->vendor_id)) { 1044 snd_hda_codec_write(codec, VT1708B_DIGIN_PIN, 0, 1045 AC_VERB_SET_PIN_WIDGET_CONTROL, 1046 PIN_OUT); 1047 snd_hda_codec_write(codec, VT1708B_DIGIN_PIN, 0, 995 snd_hda_codec_write(codec, spec->dig_in_pin, 0, 1048 996 AC_VERB_SET_EAPD_BTLENABLE, 0x02); 1049 997 } … … 1052 1000 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN); 1053 1001 1054 /* no slave outs */ 1055 codec->slave_dig_outs = slave_dig_outs; 1002 /* assign slave outs */ 1003 if (spec->slave_dig_outs[0]) 1004 codec->slave_dig_outs = spec->slave_dig_outs; 1056 1005 1057 1006 return 0; … … 1354 1303 if (spec->autocfg.dig_outs) 1355 1304 spec->multiout.dig_out_nid = VT1708_DIGOUT_NID; 1305 spec->dig_in_pin = VT1708_DIGIN_PIN; 1356 1306 if (spec->autocfg.dig_in_pin) 1357 1307 spec->dig_in_nid = VT1708_DIGIN_NID; … … 1377 1327 via_auto_init_hp_out(codec); 1378 1328 via_auto_init_analog_input(codec); 1329 return 0; 1330 } 1331 1332 static int get_mux_nids(struct hda_codec *codec) 1333 { 1334 struct via_spec *spec = codec->spec; 1335 hda_nid_t nid, conn[8]; 1336 unsigned int type; 1337 int i, n; 1338 1339 for (i = 0; i < spec->num_adc_nids; i++) { 1340 nid = spec->adc_nids[i]; 1341 while (nid) { 1342 type = get_wcaps_type(get_wcaps(codec, nid)); 1343 if (type == AC_WID_PIN) 1344 break; 1345 n = snd_hda_get_connections(codec, nid, conn, 1346 ARRAY_SIZE(conn)); 1347 if (n <= 0) 1348 break; 1349 if (n > 1) { 1350 spec->mux_nids[i] = nid; 1351 break; 1352 } 1353 nid = conn[0]; 1354 } 1355 } 1379 1356 return 0; 1380 1357 } … … 1827 1804 if (spec->autocfg.dig_outs) 1828 1805 spec->multiout.dig_out_nid = VT1709_DIGOUT_NID; 1806 spec->dig_in_pin = VT1709_DIGIN_PIN; 1829 1807 if (spec->autocfg.dig_in_pin) 1830 1808 spec->dig_in_nid = VT1709_DIGIN_NID; … … 1887 1865 spec->adc_nids = vt1709_adc_nids; 1888 1866 spec->num_adc_nids = ARRAY_SIZE(vt1709_adc_nids); 1867 get_mux_nids(codec); 1889 1868 spec->mixers[spec->num_mixers] = vt1709_capture_mixer; 1890 1869 spec->num_mixers++; … … 1980 1959 spec->adc_nids = vt1709_adc_nids; 1981 1960 spec->num_adc_nids = ARRAY_SIZE(vt1709_adc_nids); 1961 get_mux_nids(codec); 1982 1962 spec->mixers[spec->num_mixers] = vt1709_capture_mixer; 1983 1963 spec->num_mixers++; … … 2139 2119 .open = via_dig_playback_pcm_open, 2140 2120 .close = via_dig_playback_pcm_close, 2141 .prepare = via_dig_playback_pcm_prepare 2121 .prepare = via_dig_playback_pcm_prepare, 2122 .cleanup = via_dig_playback_pcm_cleanup 2142 2123 }, 2143 2124 }; … … 2375 2356 if (spec->autocfg.dig_outs) 2376 2357 spec->multiout.dig_out_nid = VT1708B_DIGOUT_NID; 2358 spec->dig_in_pin = VT1708B_DIGIN_PIN; 2377 2359 if (spec->autocfg.dig_in_pin) 2378 2360 spec->dig_in_nid = VT1708B_DIGIN_NID; … … 2435 2417 spec->adc_nids = vt1708B_adc_nids; 2436 2418 spec->num_adc_nids = ARRAY_SIZE(vt1708B_adc_nids); 2419 get_mux_nids(codec); 2437 2420 spec->mixers[spec->num_mixers] = vt1708B_capture_mixer; 2438 2421 spec->num_mixers++; … … 2486 2469 spec->adc_nids = vt1708B_adc_nids; 2487 2470 spec->num_adc_nids = ARRAY_SIZE(vt1708B_adc_nids); 2471 get_mux_nids(codec); 2488 2472 spec->mixers[spec->num_mixers] = vt1708B_capture_mixer; 2489 2473 spec->num_mixers++; … … 2591 2575 2592 2576 static struct hda_pcm_stream vt1708S_pcm_digital_playback = { 2593 .substreams = 2,2577 .substreams = 1, 2594 2578 .channels_min = 2, 2595 2579 .channels_max = 2, … … 2598 2582 .open = via_dig_playback_pcm_open, 2599 2583 .close = via_dig_playback_pcm_close, 2600 .prepare = via_dig_playback_pcm_prepare 2584 .prepare = via_dig_playback_pcm_prepare, 2585 .cleanup = via_dig_playback_pcm_cleanup 2601 2586 }, 2602 2587 }; … … 2807 2792 } 2808 2793 2794 /* fill out digital output widgets; one for master and one for slave outputs */ 2795 static void fill_dig_outs(struct hda_codec *codec) 2796 { 2797 struct via_spec *spec = codec->spec; 2798 int i; 2799 2800 for (i = 0; i < spec->autocfg.dig_outs; i++) { 2801 hda_nid_t nid; 2802 int conn; 2803 2804 nid = spec->autocfg.dig_out_pins[i]; 2805 if (!nid) 2806 continue; 2807 conn = snd_hda_get_connections(codec, nid, &nid, 1); 2808 if (conn < 1) 2809 continue; 2810 if (!spec->multiout.dig_out_nid) 2811 spec->multiout.dig_out_nid = nid; 2812 else { 2813 spec->slave_dig_outs[0] = nid; 2814 break; /* at most two dig outs */ 2815 } 2816 } 2817 } 2818 2809 2819 static int vt1708S_parse_auto_config(struct hda_codec *codec) 2810 2820 { 2811 2821 struct via_spec *spec = codec->spec; 2812 2822 int err; 2813 static hda_nid_t vt1708s_ignore[] = {0x21, 0}; 2814 2815 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, 2816 vt1708s_ignore); 2823 2824 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL); 2817 2825 if (err < 0) 2818 2826 return err; … … 2835 2843 spec->multiout.max_channels = spec->multiout.num_dacs * 2; 2836 2844 2837 if (spec->autocfg.dig_outs) 2838 spec->multiout.dig_out_nid = VT1708S_DIGOUT_NID; 2839 2840 spec->extra_dig_out_nid = 0x15; 2845 fill_dig_outs(codec); 2841 2846 2842 2847 if (spec->kctls.list) … … 2857 2862 { 0x16, HDA_INPUT, 3 }, 2858 2863 { 0x16, HDA_INPUT, 4 }, 2859 { 2864 {0} /* end */ 2860 2865 }; 2861 2866 #endif … … 2896 2901 spec->adc_nids = vt1708S_adc_nids; 2897 2902 spec->num_adc_nids = ARRAY_SIZE(vt1708S_adc_nids); 2903 get_mux_nids(codec); 2898 2904 spec->mixers[spec->num_mixers] = vt1708S_capture_mixer; 2899 2905 spec->num_mixers++; … … 3002 3008 .open = via_dig_playback_pcm_open, 3003 3009 .close = via_dig_playback_pcm_close, 3004 .prepare = via_dig_playback_pcm_prepare 3010 .prepare = via_dig_playback_pcm_prepare, 3011 .cleanup = via_dig_playback_pcm_cleanup 3005 3012 }, 3006 3013 }; … … 3130 3137 struct via_spec *spec = codec->spec; 3131 3138 int err; 3132 static hda_nid_t vt1702_ignore[] = {0x1C, 0}; 3133 3134 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, 3135 vt1702_ignore); 3139 3140 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL); 3136 3141 if (err < 0) 3137 3142 return err; … … 3154 3159 spec->multiout.max_channels = spec->multiout.num_dacs * 2; 3155 3160 3156 if (spec->autocfg.dig_outs) 3157 spec->multiout.dig_out_nid = VT1702_DIGOUT_NID; 3158 3159 spec->extra_dig_out_nid = 0x1B; 3161 fill_dig_outs(codec); 3160 3162 3161 3163 if (spec->kctls.list) … … 3217 3219 spec->adc_nids = vt1702_adc_nids; 3218 3220 spec->num_adc_nids = ARRAY_SIZE(vt1702_adc_nids); 3221 get_mux_nids(codec); 3219 3222 spec->mixers[spec->num_mixers] = vt1702_capture_mixer; 3220 3223 spec->num_mixers++; -
GPL/trunk/alsa-kernel/pci/intel8x0.c
r445 r464 357 357 unsigned int pos_shift; 358 358 unsigned int last_pos; 359 unsigned long last_pos_jiffies;360 unsigned int jiffy_to_bytes;361 359 int frags; 362 360 int lvi; … … 424 422 425 423 static struct pci_device_id snd_intel8x0_ids[] = { 426 { 0x8086, 0x2415, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* 82801AA */427 { 0x8086, 0x2425, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* 82901AB */428 { 0x8086, 0x2445, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* 82801BA */429 { 0x8086, 0x2485, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* ICH3 */430 { 0x8086, 0x24c5, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL_ICH4 }, /* ICH4 */431 { 0x8086, 0x24d5, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL_ICH4 }, /* ICH5 */432 { 0x8086, 0x25a6, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL_ICH4 }, /* ESB */433 { 0x8086, 0x266e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL_ICH4 }, /* ICH6 */434 { 0x8086, 0x27de, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL_ICH4 }, /* ICH7 */435 { 0x8086, 0x2698, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL_ICH4 }, /* ESB2 */436 { 0x8086, 0x7195, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* 440MX */437 { 0x1039, 0x7012, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_SIS }, /* SI7012 */438 { 0x10de, 0x01b1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_NFORCE }, /* NFORCE */439 { 0x10de, 0x003a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_NFORCE }, /* MCP04 */440 { 0x10de, 0x006a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_NFORCE }, /* NFORCE2 */441 { 0x10de, 0x0059, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_NFORCE }, /* CK804 */442 { 0x10de, 0x008a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_NFORCE }, /* CK8 */443 { 0x10de, 0x00da, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_NFORCE }, /* NFORCE3 */444 { 0x10de, 0x00ea, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_NFORCE }, /* CK8S */445 { 0x10de, 0x026b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_NFORCE }, /* MCP51 */446 { 0x1022, 0x746d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* AMD8111 */447 { 0x1022, 0x7445, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_INTEL }, /* AMD768 */448 { 0x10b9, 0x5455, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEVICE_ALI }, /* Ali5455 */424 { PCI_VDEVICE(INTEL, 0x2415), DEVICE_INTEL }, /* 82801AA */ 425 { PCI_VDEVICE(INTEL, 0x2425), DEVICE_INTEL }, /* 82901AB */ 426 { PCI_VDEVICE(INTEL, 0x2445), DEVICE_INTEL }, /* 82801BA */ 427 { PCI_VDEVICE(INTEL, 0x2485), DEVICE_INTEL }, /* ICH3 */ 428 { PCI_VDEVICE(INTEL, 0x24c5), DEVICE_INTEL_ICH4 }, /* ICH4 */ 429 { PCI_VDEVICE(INTEL, 0x24d5), DEVICE_INTEL_ICH4 }, /* ICH5 */ 430 { PCI_VDEVICE(INTEL, 0x25a6), DEVICE_INTEL_ICH4 }, /* ESB */ 431 { PCI_VDEVICE(INTEL, 0x266e), DEVICE_INTEL_ICH4 }, /* ICH6 */ 432 { PCI_VDEVICE(INTEL, 0x27de), DEVICE_INTEL_ICH4 }, /* ICH7 */ 433 { PCI_VDEVICE(INTEL, 0x2698), DEVICE_INTEL_ICH4 }, /* ESB2 */ 434 { PCI_VDEVICE(INTEL, 0x7195), DEVICE_INTEL }, /* 440MX */ 435 { PCI_VDEVICE(SI, 0x7012), DEVICE_SIS }, /* SI7012 */ 436 { PCI_VDEVICE(NVIDIA, 0x01b1), DEVICE_NFORCE }, /* NFORCE */ 437 { PCI_VDEVICE(NVIDIA, 0x003a), DEVICE_NFORCE }, /* MCP04 */ 438 { PCI_VDEVICE(NVIDIA, 0x006a), DEVICE_NFORCE }, /* NFORCE2 */ 439 { PCI_VDEVICE(NVIDIA, 0x0059), DEVICE_NFORCE }, /* CK804 */ 440 { PCI_VDEVICE(NVIDIA, 0x008a), DEVICE_NFORCE }, /* CK8 */ 441 { PCI_VDEVICE(NVIDIA, 0x00da), DEVICE_NFORCE }, /* NFORCE3 */ 442 { PCI_VDEVICE(NVIDIA, 0x00ea), DEVICE_NFORCE }, /* CK8S */ 443 { PCI_VDEVICE(NVIDIA, 0x026b), DEVICE_NFORCE }, /* MCP51 */ 444 { PCI_VDEVICE(AMD, 0x746d), DEVICE_INTEL }, /* AMD8111 */ 445 { PCI_VDEVICE(AMD, 0x7445), DEVICE_INTEL }, /* AMD768 */ 446 { PCI_VDEVICE(AL, 0x5455), DEVICE_ALI }, /* Ali5455 */ 449 447 { 0, } 450 448 }; … … 845 843 val = ICH_IOCE | ICH_STARTBM; 846 844 ichdev->last_pos = ichdev->position; 847 ichdev->last_pos_jiffies = jiffies;848 845 break; 849 846 case SNDRV_PCM_TRIGGER_SUSPEND: … … 1049 1046 } 1050 1047 snd_intel8x0_setup_periods(chip, ichdev); 1051 ichdev->jiffy_to_bytes = (runtime->rate * 4 * ichdev->pos_shift) / HZ;1052 1048 return 0; 1053 1049 } … … 1074 1070 break; 1075 1071 } while (timeout--); 1072 ptr = ichdev->last_pos; 1076 1073 if (ptr1 != 0) { 1077 1074 ptr1 <<= ichdev->pos_shift; 1078 1075 ptr = ichdev->fragsize1 - ptr1; 1079 1076 ptr += position; 1080 ichdev->last_pos = ptr; 1081 ichdev->last_pos_jiffies = jiffies; 1082 } else { 1083 ptr1 = jiffies - ichdev->last_pos_jiffies; 1084 if (ptr1) 1085 ptr1 -= 1; 1086 ptr = ichdev->last_pos + ptr1 * ichdev->jiffy_to_bytes; 1087 ptr %= ichdev->size; 1088 } 1077 if (ptr < ichdev->last_pos) { 1078 unsigned int pos_base, last_base; 1079 pos_base = position / ichdev->fragsize1; 1080 last_base = ichdev->last_pos / ichdev->fragsize1; 1081 /* another sanity check; ptr1 can go back to full 1082 * before the base position is updated 1083 */ 1084 if (pos_base == last_base) 1085 ptr = ichdev->last_pos; 1086 } 1087 } 1088 ichdev->last_pos = ptr; 1089 1089 spin_unlock(&chip->reg_lock); 1090 1090 if (ptr >= ichdev->size) -
GPL/trunk/alsa-kernel/pci/korg1212/korg1212.c
r410 r464 1239 1239 .info = (SNDRV_PCM_INFO_MMAP | 1240 1240 SNDRV_PCM_INFO_MMAP_VALID | 1241 SNDRV_PCM_INFO_INTERLEAVED), 1241 SNDRV_PCM_INFO_INTERLEAVED | 1242 SNDRV_PCM_INFO_BATCH), 1242 1243 .formats = SNDRV_PCM_FMTBIT_S16_LE, 1243 1244 .rates = (SNDRV_PCM_RATE_44100 | … … 1259 1260 .info = (SNDRV_PCM_INFO_MMAP | 1260 1261 SNDRV_PCM_INFO_MMAP_VALID | 1261 SNDRV_PCM_INFO_INTERLEAVED), 1262 SNDRV_PCM_INFO_INTERLEAVED | 1263 SNDRV_PCM_INFO_BATCH), 1262 1264 .formats = SNDRV_PCM_FMTBIT_S16_LE, 1263 1265 .rates = (SNDRV_PCM_RATE_44100 | -
GPL/trunk/alsa-kernel/pci/nm256/nm256.c
r410 r464 264 264 */ 265 265 static struct pci_device_id snd_nm256_ids[] = { 266 {PCI_V ENDOR_ID_NEOMAGIC, PCI_DEVICE_ID_NEOMAGIC_NM256AV_AUDIO, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},267 {PCI_V ENDOR_ID_NEOMAGIC, PCI_DEVICE_ID_NEOMAGIC_NM256ZX_AUDIO, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},268 {PCI_V ENDOR_ID_NEOMAGIC, PCI_DEVICE_ID_NEOMAGIC_NM256XL_PLUS_AUDIO, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},266 {PCI_VDEVICE(NEOMAGIC, PCI_DEVICE_ID_NEOMAGIC_NM256AV_AUDIO), 0}, 267 {PCI_VDEVICE(NEOMAGIC, PCI_DEVICE_ID_NEOMAGIC_NM256ZX_AUDIO), 0}, 268 {PCI_VDEVICE(NEOMAGIC, PCI_DEVICE_ID_NEOMAGIC_NM256XL_PLUS_AUDIO), 0}, 269 269 {0,}, 270 270 }; -
GPL/trunk/alsa-kernel/pci/rme96.c
r410 r464 233 233 234 234 static struct pci_device_id snd_rme96_ids[] = { 235 { PCI_VENDOR_ID_XILINX, PCI_DEVICE_ID_RME_DIGI96, 236 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, 237 { PCI_VENDOR_ID_XILINX, PCI_DEVICE_ID_RME_DIGI96_8, 238 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, 239 { PCI_VENDOR_ID_XILINX, PCI_DEVICE_ID_RME_DIGI96_8_PRO, 240 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, 241 { PCI_VENDOR_ID_XILINX, PCI_DEVICE_ID_RME_DIGI96_8_PAD_OR_PST, 242 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, 235 { PCI_VDEVICE(XILINX, PCI_DEVICE_ID_RME_DIGI96), 0, }, 236 { PCI_VDEVICE(XILINX, PCI_DEVICE_ID_RME_DIGI96_8), 0, }, 237 { PCI_VDEVICE(XILINX, PCI_DEVICE_ID_RME_DIGI96_8_PRO), 0, }, 238 { PCI_VDEVICE(XILINX, PCI_DEVICE_ID_RME_DIGI96_8_PAD_OR_PST), 0, }, 243 239 { 0, } 244 240 }; -
GPL/trunk/alsa-kernel/pci/rme9652/hdsp.c
r426 r464 29 29 #include <linux/firmware.h> 30 30 #include <linux/moduleparam.h> 31 #include <linux/math64.h> 31 32 32 33 #include <sound/core.h> … … 403 404 #define HDSP_DMA_AREA_KILOBYTES (HDSP_DMA_AREA_BYTES/1024) 404 405 405 /* use hotplug firm eare loader? */406 /* use hotplug firmware loader? */ 406 407 #if defined(CONFIG_FW_LOADER) || defined(CONFIG_FW_LOADER_MODULE) 407 #if !defined(HDSP_USE_HWDEP_LOADER) && !defined(CONFIG_SND_HDSP)408 #if !defined(HDSP_USE_HWDEP_LOADER) 408 409 #define HDSP_FW_LOADER 409 410 #endif … … 1048 1049 { 1049 1050 u64 n; 1050 u32 r;1051 1051 1052 1052 if (rate >= 112000) … … 1056 1056 1057 1057 n = DDS_NUMERATOR; 1058 div64_32(&n, rate, &r);1058 n = div_u64(n, rate); 1059 1059 /* n should be less than 2^32 for being written to FREQ register */ 1060 1060 snd_BUG_ON(n >> 32); … … 3098 3098 { 3099 3099 u64 n; 3100 u32 r;3101 3100 unsigned int dds_value = hdsp->dds_value; 3102 3101 int system_sample_rate = hdsp->system_sample_rate; … … 3110 3109 * rate = n / dds_value 3111 3110 */ 3112 div64_32(&n, dds_value, &r);3111 n = div_u64(n, dds_value); 3113 3112 if (system_sample_rate >= 112000) 3114 3113 n *= 4; … … 3296 3295 int x; 3297 3296 3298 if (hdsp_check_for_iobox (hdsp)) { 3299 snd_iprintf(buffer, "No I/O box connected.\nPlease connect one and upload firmware.\n"); 3297 status = hdsp_read(hdsp, HDSP_statusRegister); 3298 status2 = hdsp_read(hdsp, HDSP_status2Register); 3299 3300 snd_iprintf(buffer, "%s (Card #%d)\n", hdsp->card_name, 3301 hdsp->card->number + 1); 3302 snd_iprintf(buffer, "Buffers: capture %p playback %p\n", 3303 hdsp->capture_buffer, hdsp->playback_buffer); 3304 snd_iprintf(buffer, "IRQ: %d Registers bus: 0x%lx VM: 0x%lx\n", 3305 hdsp->irq, hdsp->port, (unsigned long)hdsp->iobase); 3306 snd_iprintf(buffer, "Control register: 0x%x\n", hdsp->control_register); 3307 snd_iprintf(buffer, "Control2 register: 0x%x\n", 3308 hdsp->control2_register); 3309 snd_iprintf(buffer, "Status register: 0x%x\n", status); 3310 snd_iprintf(buffer, "Status2 register: 0x%x\n", status2); 3311 3312 if (hdsp_check_for_iobox(hdsp)) { 3313 snd_iprintf(buffer, "No I/O box connected.\n" 3314 "Please connect one and upload firmware.\n"); 3300 3315 return; 3301 3316 } 3302 3317 3303 3318 if (hdsp_check_for_firmware(hdsp, 0)) { 3304 3319 if (hdsp->state & HDSP_FirmwareCached) { 3305 3320 if (snd_hdsp_load_firmware_from_cache(hdsp) != 0) { 3306 snd_iprintf(buffer, "Firmware loading from cache failed, please upload manually.\n"); 3321 snd_iprintf(buffer, "Firmware loading from " 3322 "cache failed, " 3323 "please upload manually.\n"); 3307 3324 return; 3308 3325 } … … 3321 3338 } 3322 3339 3323 status = hdsp_read(hdsp, HDSP_statusRegister);3324 status2 = hdsp_read(hdsp, HDSP_status2Register);3325 3326 snd_iprintf(buffer, "%s (Card #%d)\n", hdsp->card_name, hdsp->card->number + 1);3327 snd_iprintf(buffer, "Buffers: capture %p playback %p\n",3328 hdsp->capture_buffer, hdsp->playback_buffer);3329 snd_iprintf(buffer, "IRQ: %d Registers bus: 0x%lx VM: 0x%lx\n",3330 hdsp->irq, hdsp->port, (unsigned long)hdsp->iobase);3331 snd_iprintf(buffer, "Control register: 0x%x\n", hdsp->control_register);3332 snd_iprintf(buffer, "Control2 register: 0x%x\n", hdsp->control2_register);3333 snd_iprintf(buffer, "Status register: 0x%x\n", status);3334 snd_iprintf(buffer, "Status2 register: 0x%x\n", status2);3335 3340 snd_iprintf(buffer, "FIFO status: %d\n", hdsp_read(hdsp, HDSP_fifoStatus) & 0xff); 3336 3341 snd_iprintf(buffer, "MIDI1 Output status: 0x%x\n", hdsp_read(hdsp, HDSP_midiStatusOut0)); … … 3352 3357 3353 3358 snd_iprintf(buffer, "\n"); 3354 3355 3359 3356 3360 switch (hdsp_clock_source(hdsp)) { -
GPL/trunk/alsa-kernel/pci/rme9652/hdspm.c
r426 r464 30 30 #include <linux/slab.h> 31 31 #include <linux/pci.h> 32 #include <linux/math64.h> 32 33 #include <asm/io.h> 33 34 … … 832 833 { 833 834 u64 n; 834 u32 r;835 835 836 836 if (rate >= 112000) … … 845 845 /* n = 104857600000000ULL; */ /* = 2^20 * 10^8 */ 846 846 n = 110100480000000ULL; /* Value checked for AES32 and MADI */ 847 div64_32(&n, rate, &r);847 n = div_u64(n, rate); 848 848 /* n should be less than 2^32 for being written to FREQ register */ 849 849 snd_BUG_ON(n >> 32); -
GPL/trunk/alsa-kernel/pci/sonicvibes.c
r426 r464 244 244 245 245 static struct pci_device_id snd_sonic_ids[] = { 246 { 0x5333, 0xca00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, },246 { PCI_VDEVICE(S3, 0xca00), 0, }, 247 247 { 0, } 248 248 }; -
GPL/trunk/alsa-kernel/pci/via82xx.c
r426 r464 86 86 static char *ac97_quirk; 87 87 static int dxs_support; 88 static int nodelay; 88 89 89 90 module_param(index, int, 0444); … … 103 104 module_param(dxs_support, int, 0444); 104 105 MODULE_PARM_DESC(dxs_support, "Support for DXS channels (0 = auto, 1 = enable, 2 = disable, 3 = 48k only, 4 = no VRA, 5 = enable any sample rate)"); 106 module_param(nodelay, int, 0444); 107 MODULE_PARM_DESC(nodelay, "Disable 500ms init delay"); 105 108 106 109 /* just for backward compatibility */ … … 400 403 static struct pci_device_id snd_via82xx_ids[] = { 401 404 /* 0x1106, 0x3058 */ 402 { PCI_V ENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_5, PCI_ANY_ID, PCI_ANY_ID, 0, 0, TYPE_CARD_VIA686, }, /* 686A */405 { PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_82C686_5), TYPE_CARD_VIA686, }, /* 686A */ 403 406 /* 0x1106, 0x3059 */ 404 { PCI_V ENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8233_5, PCI_ANY_ID, PCI_ANY_ID, 0, 0, TYPE_CARD_VIA8233, }, /* VT8233 */407 { PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_8233_5), TYPE_CARD_VIA8233, }, /* VT8233 */ 405 408 { 0, } 406 409 }; … … 550 553 err = snd_via82xx_codec_ready(chip, ac97->num); 551 554 /* here we need to wait fairly for long time.. */ 552 msleep(500); 555 if (!nodelay) 556 msleep(500); 553 557 } 554 558 -
GPL/trunk/alsa-kernel/pci/ymfpci/ymfpci.c
r410 r464 68 68 69 69 static struct pci_device_id snd_ymfpci_ids[] = { 70 { 0x1073, 0x0004, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* YMF724 */71 { 0x1073, 0x000d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* YMF724F */72 { 0x1073, 0x000a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* YMF740 */73 { 0x1073, 0x000c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* YMF740C */74 { 0x1073, 0x0010, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* YMF744 */75 { 0x1073, 0x0012, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* YMF754 */70 { PCI_VDEVICE(YAMAHA, 0x0004), 0, }, /* YMF724 */ 71 { PCI_VDEVICE(YAMAHA, 0x000d), 0, }, /* YMF724F */ 72 { PCI_VDEVICE(YAMAHA, 0x000a), 0, }, /* YMF740 */ 73 { PCI_VDEVICE(YAMAHA, 0x000c), 0, }, /* YMF740C */ 74 { PCI_VDEVICE(YAMAHA, 0x0010), 0, }, /* YMF744 */ 75 { PCI_VDEVICE(YAMAHA, 0x0012), 0, }, /* YMF754 */ 76 76 { 0, } 77 77 }; -
GPL/trunk/alsa-kernel/pci/ymfpci/ymfpci_main.c
r445 r464 835 835 if (status & 1) { 836 836 if (chip->timer) 837 snd_timer_interrupt(chip->timer, chip->timer ->sticks);837 snd_timer_interrupt(chip->timer, chip->timer_ticks); 838 838 } 839 839 snd_ymfpci_writew(chip, YDSXGR_INTFLAG, status); … … 1886 1886 1887 1887 chip = snd_timer_chip(timer); 1888 count = (timer->sticks << 1) - 1;1889 1888 spin_lock_irqsave(&chip->reg_lock, flags); 1889 if (timer->sticks > 1) { 1890 chip->timer_ticks = timer->sticks; 1891 count = timer->sticks - 1; 1892 } else { 1893 /* 1894 * Divisor 1 is not allowed; fake it by using divisor 2 and 1895 * counting two ticks for each interrupt. 1896 */ 1897 chip->timer_ticks = 2; 1898 count = 2 - 1; 1899 } 1890 1900 snd_ymfpci_writew(chip, YDSXGR_TIMERCOUNT, count); 1891 1901 snd_ymfpci_writeb(chip, YDSXGR_TIMERCTRL, 0x03); … … 1910 1920 { 1911 1921 *num = 1; 1912 *den = 48000;1922 *den = 96000; 1913 1923 return 0; 1914 1924 } … … 1916 1926 static struct snd_timer_hardware snd_ymfpci_timer_hw = { 1917 1927 .flags = SNDRV_TIMER_HW_AUTO, 1918 .resolution = 20833, /* 1/fs = 20.8333...us */1919 .ticks = 0x 8000,1928 .resolution = 10417, /* 1 / 96 kHz = 10.41666...us */ 1929 .ticks = 0x10000, 1920 1930 .start = snd_ymfpci_timer_start, 1921 1931 .stop = snd_ymfpci_timer_stop,
Note:
See TracChangeset
for help on using the changeset viewer.