Changeset 464


Ignore:
Timestamp:
Oct 8, 2009, 10:35:00 AM (16 years ago)
Author:
Paul Smedley
Message:

Update ALSA kernel to 1.0.21 level

Location:
GPL/trunk/alsa-kernel
Files:
72 edited

Legend:

Unmodified
Added
Removed
  • GPL/trunk/alsa-kernel/core/control.c

    r446 r464  
    421421
    422422/**
    423  * snd_ctl_remove_unlocked_id - remove the unlocked control of the given id and release it
     423 * snd_ctl_remove_user_ctl - remove and release the unlocked user control
    424424 * @file: active control handle
    425425 * @id: the control id to remove
     
    430430 * Returns 0 if successful, or a negative error code on failure.
    431431 */
    432 static int snd_ctl_remove_unlocked_id(struct snd_ctl_file * file,
    433                                       struct snd_ctl_elem_id *id)
     432static int snd_ctl_remove_user_ctl(struct snd_ctl_file * file,
     433                                   struct snd_ctl_elem_id *id)
    434434{
    435435        struct snd_card *card = file->card;
     
    440440        kctl = snd_ctl_find_id(card, id);
    441441        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;
    444448        }
    445449        for (idx = 0; idx < kctl->count; idx++)
    446450                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;
    449453                }
    450454        ret = snd_ctl_remove(card, kctl);
     455        if (ret < 0)
     456                goto error;
     457        card->user_ctl_count--;
     458error:
    451459        up_write(&card->controls_rwsem);
    452460        return ret;
     
    958966        if (card->user_ctl_count >= MAX_USER_CONTROLS)
    959967                return -ENOMEM;
    960         if (info->count > 1024)
     968        if (info->count < 1)
    961969                return -EINVAL;
    962970        access = info->access == 0 ? SNDRV_CTL_ELEM_ACCESS_READWRITE :
     
    10591067{
    10601068        struct snd_ctl_elem_id id;
    1061         int err;
    10621069
    10631070        if (copy_from_user(&id, _id, sizeof(id)))
    10641071                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);
    10731073}
    10741074
  • GPL/trunk/alsa-kernel/core/info.c

    r445 r464  
    8989
    9090        nsize = PAGE_ALIGN(nsize);
     91#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 22) || \
     92        defined(CONFIG_SND_DEBUG_MEMORY)
    9193        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);
    92100        if (! nbuf)
    93101                return -ENOMEM;
    94 
    95         memcpy(nbuf, buffer->buffer, buffer->len);
    96         kfree(buffer->buffer);
     102#endif
     103
    97104        buffer->buffer = nbuf;
    98105        buffer->len = nsize;
  • GPL/trunk/alsa-kernel/core/init.c

    r447 r464  
    165165        if (!card)
    166166                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)
    174168                strlcpy(card->id, xid, sizeof(card->id));
    175         }
    176169        err = 0;
    177170        mutex_lock(&snd_card_mutex);
     
    516509EXPORT_SYMBOL(snd_card_free);
    517510
    518 static void choose_default_id(struct snd_card *card)
     511static void snd_card_set_id_no_lock(struct snd_card *card, const char *nid)
    519512{
    520513        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;
    528527        }
    529528        id = card->id;
     
    531530                spos++;
    532531        if (isdigit(*spos))
    533                 *id++ = isalpha(card->shortname[0]) ? card->shortname[0] : 'D';
     532                *id++ = isalpha(src[0]) ? src[0] : 'D';
    534533        while (*spos != '\0' && (size_t)(id - card->id) < sizeof(card->id) - 1) {
    535534                if (isalnum(*spos))
     
    546545        while (1) {
    547546                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);
    549548                        strcpy(card->id, card->proc_root->name);
    550549                        return;
     
    572571                        if ((size_t)len <= sizeof(card->id) - 2)
    573572                                spos++;
    574                         *spos++ = '_';
    575                         *spos++ = '1';
    576                         *spos++ = '\0';
     573                        *(char *)spos++ = '_';
     574                        *(char *)spos++ = '1';
     575                        *(char *)spos++ = '\0';
    577576                        idx_flag++;
    578577                }
    579578        }
    580579}
     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 */
     589void 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}
     598EXPORT_SYMBOL(snd_card_set_id);
    581599
    582600#ifndef CONFIG_SYSFS_DEPRECATED
     
    673691                return 0;
    674692        }
    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);
    677694        snd_cards[card->number] = card;
    678695        mutex_unlock(&snd_card_mutex);
  • GPL/trunk/alsa-kernel/core/memalloc.c

    r399 r464  
    236236                dmab->area = snd_malloc_dev_pages(device, size, &dmab->addr);
    237237                break;
     238#endif
     239#ifdef CONFIG_SND_DMA_SGBUF
    238240        case SNDRV_DMA_TYPE_DEV_SG:
    239241                snd_malloc_sgbuf_pages(device, size, dmab, NULL);
     
    306308                snd_free_dev_pages(dmab->dev.dev, dmab->bytes, dmab->area, dmab->addr);
    307309                break;
     310#endif
     311#ifdef CONFIG_SND_DMA_SGBUF
    308312        case SNDRV_DMA_TYPE_DEV_SG:
    309313                snd_free_sgbuf_pages(dmab);
  • GPL/trunk/alsa-kernel/core/misc.c

    r443 r464  
    2525#include <sound/core.h>
    2626
     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
     35static int debug = DEFAULT_DEBUG_LEVEL;
     36module_param(debug, int, 0644);
     37MODULE_PARM_DESC(debug, "Debug level (0 = disable)");
     38
     39#endif /* CONFIG_SND_DEBUG */
     40
    2741void release_and_free_resource(struct resource *res)
    2842{
     
    3650
    3751#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 */
     53static 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 */
     62static 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)
     83void __snd_printk(unsigned int level, const char *path, int line,
     84                  const char *format, ...)
    3985{
    4086        va_list args;
    4187       
    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
    5092        va_start(args, format);
     93        if (print_snd_pfx(level, path, line, format))
     94                format += 3; /* skip the printk level-prefix */
    5195        vprintk(format, args);
    5296        va_end(args);
    5397}
    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);
     98EXPORT_SYMBOL_GPL(__snd_printk);
    7899#endif
    79100
  • GPL/trunk/alsa-kernel/core/oss/pcm_oss.c

    r446 r464  
    3232#include <linux/vmalloc.h>
    3333#include <linux/moduleparam.h>
     34#include <linux/math64.h>
    3435#include <linux/string.h>
    3536#include <sound/core.h>
     
    626627        {
    627628                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);
    631630        }
    632631#endif
  • GPL/trunk/alsa-kernel/core/pcm_lib.c

    r426 r464  
    2323#include <linux/slab.h>
    2424#include <linux/time.h>
     25#include <linux/math64.h>
    2526#include <sound/core.h>
    2627#include <sound/control.h>
     
    127128
    128129#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))
    130131#else
    131 #define xrun_debug(substream)   0
     132#define xrun_debug(substream, mask)     0
    132133#endif
    133134
    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();                   \
    137138        } while (0)
    138139
     140static 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
    139150static void xrun(struct snd_pcm_substream *substream)
    140151{
     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);
    141156        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);
    147161                dump_stack_on_xrun(substream);
    148162        }
     
    155169        snd_pcm_uframes_t pos;
    156170
    157         if (runtime->tstamp_mode == SNDRV_PCM_TSTAMP_ENABLE)
    158                 snd_pcm_gettime(runtime, (struct timespec *)&runtime->status->tstamp);
    159171        pos = substream->ops->pointer(substream);
    160172        if (pos == SNDRV_PCM_POS_XRUN)
     
    162174        if (pos >= runtime->buffer_size) {
    163175                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, "
    165179                                   "buffer size = 0x%lx, period size = 0x%lx\n",
    166                                    substream->stream, pos, runtime->buffer_size,
     180                                   name, pos, runtime->buffer_size,
    167181                                   runtime->period_size);
    168182                }
     
    184198        if (avail > runtime->avail_max)
    185199                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) {
    188202                        snd_pcm_drain_done(substream);
    189                 else
     203                        return -EPIPE;
     204                }
     205        } else {
     206                if (avail >= runtime->stop_threshold) {
    190207                        xrun(substream);
    191                 return -EPIPE;
     208                        return -EPIPE;
     209                }
    192210        }
    193211        if (avail >= runtime->control->avail_min)
     
    199217#define hw_ptr_error(substream, fmt, args...)                           \
    200218        do {                                                            \
    201                 if (xrun_debug(substream)) {                            \
     219                if (xrun_debug(substream, 1)) {                         \
    202220                        if (printk_ratelimit()) {                       \
    203221                                snd_printd("PCM: " fmt, ##args);        \
     
    223241                return -EPIPE;
    224242        }
     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        }
    225255        hw_base = runtime->hw_ptr_base;
    226256        new_hw_ptr = hw_base + pos;
     
    234264        }
    235265        if (delta < 0) {
    236                 delta += runtime->buffer_size;
     266                if (runtime->periods == 1 || new_hw_ptr < old_hw_ptr)
     267                        delta += runtime->buffer_size;
    237268                if (delta < 0) {
    238269                        hw_ptr_error(substream,
     
    241272                                     substream->stream, (long)pos,
    242273                                     (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
    243281                        /* rebase to interrupt position */
    244282                        hw_base = new_hw_ptr = hw_ptr_interrupt;
     
    246284                        hw_base -= hw_base % runtime->buffer_size;
    247285                        delta = 0;
     286#endif
    248287                } else {
    249288                        hw_base += runtime->buffer_size;
     
    253292                }
    254293        }
     294
     295        /* Do jiffies check only in xrun_debug mode */
     296        if (!xrun_debug(substream, 4))
     297                goto no_jiffies_check;
     298
    255299        /* Skip the jiffies check for hardwares with BATCH flag.
    256300         * Such hardware usually just increases the position at each IRQ,
     
    260304                goto no_jiffies_check;
    261305        hdelta = new_hw_ptr - old_hw_ptr;
     306        if (hdelta < runtime->delay)
     307                goto no_jiffies_check;
     308        hdelta -= runtime->delay;
    262309        jdelta = jiffies - runtime->hw_ptr_jiffies;
    263310        if (((hdelta * HZ) / runtime->rate) > jdelta + HZ/100) {
     
    293340                        new_hw_ptr - new_hw_ptr % runtime->period_size;
    294341        }
     342        runtime->hw_ptr_interrupt = hw_ptr_interrupt;
     343
    295344        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK &&
    296345            runtime->silence_size > 0)
    297346                snd_pcm_playback_silence(substream, new_hw_ptr);
    298347
     348        if (runtime->status->hw_ptr == new_hw_ptr)
     349                return 0;
     350
    299351        runtime->hw_ptr_base = hw_base;
    300352        runtime->status->hw_ptr = new_hw_ptr;
    301353        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);
    303356
    304357        return snd_pcm_update_hw_ptr_post(substream, runtime);
     
    320373                return -EPIPE;
    321374        }
     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
    322388        hw_base = runtime->hw_ptr_base;
    323389        new_hw_ptr = hw_base + pos;
     
    340406                new_hw_ptr = hw_base + pos;
    341407        }
     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;
    342414        if (((delta * HZ) / runtime->rate) > jdelta + HZ/100) {
    343415                hw_ptr_error(substream,
     
    349421                return 0;
    350422        }
     423 no_jiffies_check:
    351424        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK &&
    352425            runtime->silence_size > 0)
    353426                snd_pcm_playback_silence(substream, new_hw_ptr);
    354427
     428        if (runtime->status->hw_ptr == new_hw_ptr)
     429                return 0;
     430
    355431        runtime->hw_ptr_base = hw_base;
    356432        runtime->status->hw_ptr = new_hw_ptr;
    357433        runtime->hw_ptr_jiffies = jiffies;
     434        if (runtime->tstamp_mode == SNDRV_PCM_TSTAMP_ENABLE)
     435                snd_pcm_gettime(runtime, (struct timespec *)&runtime->status->tstamp);
    358436
    359437        return snd_pcm_update_hw_ptr_post(substream, runtime);
     
    449527                return UINT_MAX;
    450528        }
    451         div64_32(&n, c, r);
     529        n = div_u64_rem(n, c, r);
    452530        if (n >= UINT_MAX) {
    453531                *r = 0;
     
    873951{
    874952        unsigned int k;
    875         int changed = 0;
     953        struct snd_interval list_range;
    876954
    877955        if (!count) {
     
    879957                return -EINVAL;
    880958        }
     959        snd_interval_any(&list_range);
     960        list_range.min = UINT_MAX;
     961        list_range.max = 0;
    881962        for (k = 0; k < count; k++) {
    882963                if (mask && !(mask & (1 << k)))
    883964                        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]);
    892969        }
    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);
    916971}
    917972
     
    14821537        else
    14831538                runtime->status->hw_ptr = 0;
    1484         runtime->hw_ptr_jiffies = jiffies;
    14851539        snd_pcm_stream_unlock_irqrestore(substream, flags);
    14861540        return 0;
     
    15221576}
    15231577
     1578static 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
    15241595/**
    15251596 * snd_pcm_lib_ioctl - a generic PCM ioctl callback
     
    15431614        case SNDRV_PCM_IOCTL1_CHANNEL_INFO:
    15441615                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);
    15451618        }
    15461619        return -ENXIO;
  • GPL/trunk/alsa-kernel/core/pcm_memory.c

    r399 r464  
    305305EXPORT_SYMBOL(snd_pcm_lib_preallocate_pages_for_all);
    306306
     307#ifdef CONFIG_SND_DMA_SGBUF
    307308/**
    308309 * snd_pcm_sgbuf_ops_page - get the page struct at the given offset
     
    350351}
    351352EXPORT_SYMBOL(snd_pcm_sgbuf_get_chunk_size);
     353#endif /* CONFIG_SND_DMA_SGBUF */
    352354
    353355/**
  • GPL/trunk/alsa-kernel/core/pcm_native.c

    r446 r464  
    324324        hw = &substream->runtime->hw;
    325325        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(&params->masks[SNDRV_PCM_HW_PARAM_FORMAT]) ==
     329                    snd_mask_max(&params->masks[SNDRV_PCM_HW_PARAM_FORMAT]) &&
     330                    snd_mask_min(&params->masks[SNDRV_PCM_HW_PARAM_CHANNELS]) ==
     331                    snd_mask_max(&params->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        }
    329338        params->rmask = 0;
    330339        return 0;
     
    599608                status->avail = snd_pcm_playback_avail(runtime);
    600609                if (runtime->status->state == SNDRV_PCM_STATE_RUNNING ||
    601                     runtime->status->state == SNDRV_PCM_STATE_DRAINING)
     610                    runtime->status->state == SNDRV_PCM_STATE_DRAINING) {
    602611                        status->delay = runtime->buffer_size - status->avail;
    603                 else
     612                        status->delay += runtime->delay;
     613                } else
    604614                        status->delay = 0;
    605615        } else {
    606616                status->avail = snd_pcm_capture_avail(runtime);
    607617                if (runtime->status->state == SNDRV_PCM_STATE_RUNNING)
    608                         status->delay = status->avail;
     618                        status->delay = status->avail + runtime->delay;
    609619                else
    610620                        status->delay = 0;
     
    860870        struct snd_pcm_runtime *runtime = substream->runtime;
    861871        snd_pcm_trigger_tstamp(substream);
     872        runtime->hw_ptr_jiffies = jiffies;
    862873        runtime->status->state = state;
    863874        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK &&
     
    973984        if (substream->runtime->trigger_master != substream)
    974985                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;
    975991        return substream->ops->trigger(substream,
    976992                                       push ? SNDRV_PCM_TRIGGER_PAUSE_PUSH :
     
    13391355static int snd_pcm_pre_drain_init(struct snd_pcm_substream *substream, int state)
    13401356{
    1341         if (substream->f_flags & O_NONBLOCK)
    1342                 return -EAGAIN;
    13431357        substream->runtime->trigger_master = substream;
    13441358        return 0;
     
    13881402        struct snd_pcm_substream *substream;
    13891403        wait_queue_t wait;
    1390         snd_pcm_uframes_t stop_threshold;
    13911404};
    13921405
     
    14001413 * (capture only) state.
    14011414 */
    1402 static int snd_pcm_drain(struct snd_pcm_substream *substream)
     1415static int snd_pcm_drain(struct snd_pcm_substream *substream,
     1416                         struct file *file)
    14031417{
    14041418        struct snd_card *card;
     
    14071421        int result = 0;
    14081422        int i, num_drecs;
     1423        int nonblock = 0;
    14091424        struct drain_rec *drec, drec_tmp, *d;
    14101425
     
    14231438                }
    14241439        }
     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 */
    14251449
    14261450        /* allocate temporary record for drain sync */
     
    14451469                        init_waitqueue_entry(&d->wait, current);
    14461470                        add_wait_queue(&runtime->sleep, &d->wait);
    1447                         /* stop_threshold fixup to avoid endless loop when
    1448                          * stop_threshold > buffer_size
    1449                          */
    1450                         d->stop_threshold = runtime->stop_threshold;
    1451                         if (runtime->stop_threshold > runtime->buffer_size)
    1452                                 runtime->stop_threshold = runtime->buffer_size;
    14531471                }
    14541472        }
    14551473        up_read(&snd_pcm_link_rwsem);
    14561474
     1475 lock:
    14571476        snd_pcm_stream_lock_irq(substream);
    14581477        /* resume pause */
     
    14621481        /* pre-start/stop - all running streams are changed to DRAINING state */
    14631482        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;
    14671489        }
    14681490
     
    15001522        }
    15011523
     1524 unlock:
    15021525        snd_pcm_stream_unlock_irq(substream);
    15031526
    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        }
    15141536        snd_power_unlock(card);
    15151537
     
    22152237                ret = -EPIPE;
    22162238                goto __end;
     2239        case SNDRV_PCM_STATE_SUSPENDED:
     2240                ret = -ESTRPIPE;
     2241                goto __end;
    22172242        default:
    22182243                ret = -EBADFD;
     
    22592284        case SNDRV_PCM_STATE_XRUN:
    22602285                ret = -EPIPE;
     2286                goto __end;
     2287        case SNDRV_PCM_STATE_SUSPENDED:
     2288                ret = -ESTRPIPE;
    22612289                goto __end;
    22622290        default:
     
    23062334                ret = -EPIPE;
    23072335                goto __end;
     2336        case SNDRV_PCM_STATE_SUSPENDED:
     2337                ret = -ESTRPIPE;
     2338                goto __end;
    23082339        default:
    23092340                ret = -EBADFD;
     
    23512382        case SNDRV_PCM_STATE_XRUN:
    23522383                ret = -EPIPE;
     2384                goto __end;
     2385        case SNDRV_PCM_STATE_SUSPENDED:
     2386                ret = -ESTRPIPE;
    23532387                goto __end;
    23542388        default:
     
    24272461                else
    24282462                        n = snd_pcm_capture_avail(runtime);
     2463                n += runtime->delay;
    24292464                break;
    24302465        case SNDRV_PCM_STATE_XRUN:
     
    25502585#endif
    25512586        case SNDRV_PCM_IOCTL_DRAIN:
    2552                 return snd_pcm_drain(substream);
     2587                return snd_pcm_drain(substream, file);
    25532588        case SNDRV_PCM_IOCTL_DROP:
    25542589                return snd_pcm_drop(substream);
  • GPL/trunk/alsa-kernel/core/rawmidi.c

    r446 r464  
    283283        substream->opened = 1;
    284284        if (substream->use_count++ == 0)
    285                 substream->active_sensing = 1;
     285                substream->active_sensing = 0;
    286286        if (mode & SNDRV_RAWMIDI_LFLG_APPEND)
    287287                substream->append = 1;
  • GPL/trunk/alsa-kernel/core/seq/oss/seq_oss_midi.c

    r447 r464  
    2121 */
    2222
     23#include <sound/asoundef.h>
    2324#include "seq_oss_midi.h"
    2425#include "seq_oss_readq.h"
     
    477478                if (dp->seq_mode == SNDRV_SEQ_OSS_MODE_SYNTH) {
    478479                        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);
    480481                }
    481482                for (c = 0; c < 16; c++) {
    482483                        ev.type = SNDRV_SEQ_EVENT_CONTROLLER;
    483484                        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);
    486487                        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);
    489491                                ev.type = SNDRV_SEQ_EVENT_PITCHBEND;
    490492                                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);
    492494                        }
    493495                }
  • GPL/trunk/alsa-kernel/core/seq/seq_midi.c

    r399 r464  
    121121        runtime = substream->runtime;
    122122        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");
    124125                return -ENOMEM;
    125126        }
     
    237238        params.avail_min = 1;
    238239        params.buffer_size = output_buffer_size;
     240        params.no_active_sensing = 1;
    239241        if ((err = snd_rawmidi_output_params(msynth->output_rfile.output, &params)) < 0) {
    240242                snd_rawmidi_kernel_release(&msynth->output_rfile);
     
    249251{
    250252        struct seq_midisynth *msynth = private_data;
    251         unsigned char buf = 0xff; /* MIDI reset */
    252253
    253254        if (snd_BUG_ON(!msynth->output_rfile.output))
    254255                return -EINVAL;
    255         /* sending single MIDI reset message to shut the device up */
    256         snd_rawmidi_kernel_write(msynth->output_rfile.output, &buf, 1);
    257256        snd_rawmidi_drain_output(msynth->output_rfile.output);
    258257        return snd_rawmidi_kernel_release(&msynth->output_rfile);
  • GPL/trunk/alsa-kernel/core/seq/seq_midi_event.c

    r305 r464  
    505505                return -ENOMEM;
    506506        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;
    511511        if (cmd != dev->lastcmd && !dev->nostat) {
    512512                if (count < 9)
  • GPL/trunk/alsa-kernel/core/vmaster.c

    r426 r464  
    354354 * The optional argument @tlv can be used to specify the TLV information
    355355 * 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.
    357358 */
    358359struct snd_kcontrol *snd_ctl_make_virtual_master(char *name,
     
    385386
    386387        /* 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)) {
    388392                kctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_TLV_READ;
    389393                memcpy(master->tlv, tlv, sizeof(master->tlv));
  • GPL/trunk/alsa-kernel/include/sound/ac97_codec.h

    r402 r464  
    3232#include "control.h"
    3333#include "info.h"
     34
     35/* maximum number of devices on the AC97 bus */
     36#define AC97_BUS_MAX_DEVICES    4
    3437
    3538/*
     
    650653extern struct bus_type ac97_bus_type;
    651654
     655/* AC97 platform_data adding function */
     656static inline void snd_ac97_dev_add_pdata(struct snd_ac97 *ac97, void *data)
     657{
     658        ac97->dev.platform_data = data;
     659}
     660
    652661#endif /* __SOUND_AC97_CODEC_H */
  • GPL/trunk/alsa-kernel/include/sound/asound.h

    r426 r464  
    162162 *****************************************************************************/
    163163
    164 #define SNDRV_PCM_VERSION               SNDRV_PROTOCOL_VERSION(2, 0, 9)
     164#define SNDRV_PCM_VERSION               SNDRV_PROTOCOL_VERSION(2, 0, 10)
    165165
    166166typedef unsigned long snd_pcm_uframes_t;
     
    279279#define SNDRV_PCM_INFO_JOINT_DUPLEX     0x00200000      /* playback and capture stream are somewhat correlated */
    280280#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 */
    281282
    282283typedef int __bitwise snd_pcm_state_t;
  • GPL/trunk/alsa-kernel/include/sound/config.h

    r455 r464  
    8585#define CONFIG_SND_DEBUG_DETECT
    8686#define CONFIG_SND_DEBUG_VERBOSE
     87#define CONFIG_SND_DMA_SGBUF
    8788#define CONFIG_SND_HDA_CODEC_ANALOG
    8889#define CONFIG_SND_HDA_CODEC_ATIHDMI
  • GPL/trunk/alsa-kernel/include/sound/core.h

    r426 r464  
    324324                    struct snd_card **card_ret);
    325325
    326 static inline __deprecated
    327 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 
    336326int snd_card_disconnect(struct snd_card *card);
    337327int snd_card_free(struct snd_card *card);
    338328int snd_card_free_when_closed(struct snd_card *card);
     329void snd_card_set_id(struct snd_card *card, const char *id);
    339330int snd_card_register(struct snd_card *card);
    340331int snd_card_info_init(void);
     
    373364void release_and_free_resource(struct resource *res);
    374365
    375 #ifdef CONFIG_SND_VERBOSE_PRINTK
    376 void snd_verbose_printk(const char *file, int line, const char *format, ...)
    377      __attribute__ ((format (printf, 3, 4)));
    378 #endif
    379 #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 #endif
    383 
    384366/* --- */
    385367
    386 #ifdef CONFIG_SND_VERBOSE_PRINTK
     368#if defined(CONFIG_SND_DEBUG) || defined(CONFIG_SND_VERBOSE_PRINTK)
     369void __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
    387381/**
    388382 * snd_printk - printk wrapper
     
    392386 * when configured with CONFIG_SND_VERBOSE_PRINTK.
    393387 */
     388#ifndef TARGET_OS2
    394389#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)
    400391#else
    401392#define snd_printk printk
    402393#endif
    403 #endif
    404394
    405395#ifdef CONFIG_SND_DEBUG
    406 
    407 #ifdef CONFIG_SND_VERBOSE_PRINTK
    408396/**
    409397 * snd_printd - debug printk
     
    414402 */
    415403#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)
    421405
    422406/**
     
    478462 */
    479463#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)
    481466#else
    482467#define snd_printdd snd_printk
     
    484469#else
    485470#ifndef TARGET_OS2
    486 #define snd_printdd(format, args...) /* nothing */
     471#define snd_printdd(format, args...)    do { } while (0)
    487472#else
    488473#define snd_printdd 1 ? (void)0 : (void)((int (*)(char *, ...)) NULL)
  • GPL/trunk/alsa-kernel/include/sound/memalloc.h

    r410 r464  
    4848#define SNDRV_DMA_TYPE_CONTINUOUS       1       /* continuous no-DMA memory */
    4949#define SNDRV_DMA_TYPE_DEV              2       /* generic device continuous */
     50#ifdef CONFIG_SND_DMA_SGBUF
    5051#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
    5155
    5256/*
     
    6165};
    6266
     67#ifdef CONFIG_SND_DMA_SGBUF
    6368/*
    6469 * Scatter-Gather generic device pages
     
    108113        return sgbuf->table[offset >> PAGE_SHIFT].buf + offset % PAGE_SIZE;
    109114}
     115#endif /* CONFIG_SND_DMA_SGBUF */
    110116
    111117/* allocate/release a buffer */
  • GPL/trunk/alsa-kernel/include/sound/pcm.h

    r426 r464  
    9999#define SNDRV_PCM_IOCTL1_CHANNEL_INFO   2
    100100#define SNDRV_PCM_IOCTL1_GSTATE         3
     101#define SNDRV_PCM_IOCTL1_FIFO_SIZE      4
    101102
    102103#define SNDRV_PCM_TRIGGER_STOP          0
     
    271272        snd_pcm_uframes_t hw_ptr_interrupt; /* Position at interrupt time */
    272273        unsigned long hw_ptr_jiffies;   /* Time when hw_ptr is updated */
     274        snd_pcm_sframes_t delay;        /* extra delay; typically FIFO size */
    273275
    274276        /* -- HW params -- */
     
    490492void snd_pcm_vma_notify_data(void *client, void *data);
    491493int snd_pcm_mmap_data(struct snd_pcm_substream *substream, struct file *file, struct vm_area_struct *area);
    492 
    493 #if BITS_PER_LONG >= 64
    494 
    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 #else
    519 
    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 #endif
    566494
    567495/*
     
    992920int snd_pcm_lib_free_pages(struct snd_pcm_substream *substream);
    993921
     922#ifdef CONFIG_SND_DMA_SGBUF
    994923/*
    995924 * SG-buffer handling
     
    1016945unsigned int snd_pcm_sgbuf_get_chunk_size(struct snd_pcm_substream *substream,
    1017946                                          unsigned int ofs, unsigned int size);
     947
     948#else /* !SND_DMA_SGBUF */
     949/*
     950 * fake using a continuous buffer
     951 */
     952static inline dma_addr_t
     953snd_pcm_sgbuf_get_addr(struct snd_pcm_substream *substream, unsigned int ofs)
     954{
     955        return substream->runtime->dma_addr + ofs;
     956}
     957
     958static inline void *
     959snd_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 */
    1018969
    1019970/* handle mmap counter - PCM mmap callback should handle this counter properly */
  • GPL/trunk/alsa-kernel/include/sound/soc-dapm.h

    r426 r464  
    138138
    139139/* 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 }
    140146#define SND_SOC_DAPM_DAC(wname, stname, wreg, wshift, winvert) \
    141147{       .id = snd_soc_dapm_dac, .name = wname, .sname = stname, .reg = wreg, \
    142148        .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}
    143154#define SND_SOC_DAPM_ADC(wname, stname, wreg, wshift, winvert) \
    144155{       .id = snd_soc_dapm_adc, .name = wname, .sname = stname, .reg = wreg, \
    145156        .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 */
    148164#define SND_SOC_DAPM_REG(wid, wname, wreg, wshift, wmask, won_val, woff_val) \
    149165{       .id = wid, .name = wname, .kcontrols = NULL, .num_kcontrols = 0, \
     
    151167        .on_val = won_val, .off_val = woff_val, .event = dapm_reg_event, \
    152168        .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}
    153173
    154174/* dapm kcontrol types */
     
    266286int snd_soc_dapm_stream_event(struct snd_soc_codec *codec, char *stream,
    267287        int event);
    268 int snd_soc_dapm_set_bias_level(struct snd_soc_device *socdev,
    269         enum snd_soc_bias_level level);
     288void snd_soc_dapm_shutdown(struct snd_soc_device *socdev);
    270289
    271290/* dapm sys fs - used by the core */
    272291int snd_soc_dapm_sys_add(struct device *dev);
     292void snd_soc_dapm_debugfs_init(struct snd_soc_codec *codec);
    273293
    274294/* dapm audio pin control and status */
     
    299319        snd_soc_dapm_pre,                       /* machine specific pre widget - exec first */
    300320        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 */
    301324};
    302325
     
    358381        unsigned char pmdown:1;                 /* waiting for timeout */
    359382
     383        int (*power_check)(struct snd_soc_dapm_widget *w);
     384
    360385        /* external events */
    361386        unsigned short event_flags;             /* flags to specify event types */
     
    369394        struct list_head sources;
    370395        struct list_head sinks;
     396
     397        /* used during DAPM updates */
     398        struct list_head power_list;
    371399};
    372400
  • GPL/trunk/alsa-kernel/include/sound/soc.h

    r426 r464  
    119119        .get = xhandler_get, .put = xhandler_put, \
    120120        .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} }
    121129#define SOC_SINGLE_EXT_TLV(xname, xreg, xshift, xmax, xinvert,\
    122130         xhandler_get, xhandler_put, tlv_array) \
     
    128136        .get = xhandler_get, .put = xhandler_put, \
    129137        .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} }
    130160#define SOC_SINGLE_BOOL_EXT(xname, xdata, xhandler_get, xhandler_put) \
    131161{       .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
     
    180210extern struct snd_ac97_bus_ops soc_ac97_ops;
    181211
     212enum snd_soc_control_type {
     213        SND_SOC_CUSTOM,
     214        SND_SOC_I2C,
     215        SND_SOC_SPI,
     216};
     217
    182218int snd_soc_register_platform(struct snd_soc_platform *platform);
    183219void snd_soc_unregister_platform(struct snd_soc_platform *platform);
    184220int snd_soc_register_codec(struct snd_soc_codec *codec);
    185221void snd_soc_unregister_codec(struct snd_soc_codec *codec);
     222int snd_soc_codec_volatile_register(struct snd_soc_codec *codec, int reg);
     223int 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
     228int snd_soc_suspend_device(struct device *dev);
     229int snd_soc_resume_device(struct device *dev);
     230#endif
    186231
    187232/* pcm <-> DAI connect */
     
    207252#endif
    208253
    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 
    213254/* codec register bit access */
    214255int 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);
    216257int 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);
    218259
    219260int snd_soc_new_ac97_codec(struct snd_soc_codec *codec,
     
    332373        struct mutex mutex;
    333374        struct device *dev;
     375        struct snd_soc_device *socdev;
    334376
    335377        struct list_head list;
     
    352394        int (*display_register)(struct snd_soc_codec *, char *,
    353395                                size_t, unsigned int);
     396        int (*volatile_register)(unsigned int);
     397        int (*readable_register)(unsigned int);
    354398        hw_write_t hw_write;
    355         hw_read_t hw_read;
     399        unsigned int (*hw_read)(struct snd_soc_codec *, unsigned int);
    356400        void *reg_cache;
    357401        short reg_cache_size;
     
    373417        struct dentry *debugfs_reg;
    374418        struct dentry *debugfs_pop_time;
     419        struct dentry *debugfs_dapm;
    375420#endif
    376421};
     
    417462        /* codec/machine specific init - e.g. add machine controls */
    418463        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;
    419470
    420471        /* DAI pcm */
     
    491542};
    492543
     544/* codec IO */
     545static inline unsigned int snd_soc_read(struct snd_soc_codec *codec,
     546                                        unsigned int reg)
     547{
     548        return codec->read(codec, reg);
     549}
     550
     551static 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
    493557#include <sound/soc-dai.h>
    494558
  • GPL/trunk/alsa-kernel/include/sound/tlv.h

    r305 r464  
    3636#define SNDRV_CTL_TLVT_DB_LINEAR 2      /* linear volume */
    3737#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 */
    3840
    3941#define TLV_DB_SCALE_ITEM(min, step, mute)                      \
     
    4244#define DECLARE_TLV_DB_SCALE(name, min, step, mute) \
    4345        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) }
    4458
    4559/* linear volume between min_dB and max_dB (.01dB unit) */
  • GPL/trunk/alsa-kernel/include/sound/ymfpci.h

    r305 r464  
    332332        struct snd_rawmidi *rawmidi;
    333333        struct snd_timer *timer;
     334        unsigned int timer_ticks;
    334335
    335336        struct pci_dev *pci;
  • GPL/trunk/alsa-kernel/isa/cmi8330.c

    r426 r464  
    11/*
    2  *  Driver for C-Media's CMI8330 soundcards.
     2 *  Driver for C-Media's CMI8330 and CMI8329 soundcards.
    33 *  Copyright (c) by George Talusan <gstalusan@uwaterloo.ca>
    44 *    http://www.undergrad.math.uwaterloo.ca/~gstalusa
     
    3636 *  This card has two mixers and two PCM devices.  I've cheesed it such
    3737 *  that recording and playback can be done through the same device.
    38  *  The driver "magically" routes the capturing to the CMI8330 codec,
     38 *  The driver "magically" routes the capturing to the AD1848 codec,
    3939 *  and playback to the SB16 codec.  This allows for full-duplex mode
    4040 *  to some extent.
     
    6565 */
    6666MODULE_AUTHOR("George Talusan <gstalusan@uwaterloo.ca>");
    67 MODULE_DESCRIPTION("C-Media CMI8330");
     67MODULE_DESCRIPTION("C-Media CMI8330/CMI8329");
    6868MODULE_LICENSE("GPL");
    6969MODULE_SUPPORTED_DEVICE("{{C-Media,CMI8330,isapnp:{CMI0001,@@@0001,@X@0001}}}");
     
    8787
    8888module_param_array(index, int, NULL, 0444);
    89 MODULE_PARM_DESC(index, "Index value for CMI8330 soundcard.");
     89MODULE_PARM_DESC(index, "Index value for CMI8330/CMI8329 soundcard.");
    9090module_param_array(id, charp, NULL, 0444);
    91 MODULE_PARM_DESC(id, "ID string  for CMI8330 soundcard.");
     91MODULE_PARM_DESC(id, "ID string  for CMI8330/CMI8329 soundcard.");
    9292module_param_array(enable, bool, NULL, 0444);
    93 MODULE_PARM_DESC(enable, "Enable CMI8330 soundcard.");
     93MODULE_PARM_DESC(enable, "Enable CMI8330/CMI8329 soundcard.");
    9494#ifdef CONFIG_PNP
    9595module_param_array(isapnp, bool, NULL, 0444);
     
    9898
    9999module_param_array(sbport, long, NULL, 0444);
    100 MODULE_PARM_DESC(sbport, "Port # for CMI8330 SB driver.");
     100MODULE_PARM_DESC(sbport, "Port # for CMI8330/CMI8329 SB driver.");
    101101module_param_array(sbirq, int, NULL, 0444);
    102 MODULE_PARM_DESC(sbirq, "IRQ # for CMI8330 SB driver.");
     102MODULE_PARM_DESC(sbirq, "IRQ # for CMI8330/CMI8329 SB driver.");
    103103module_param_array(sbdma8, int, NULL, 0444);
    104 MODULE_PARM_DESC(sbdma8, "DMA8 for CMI8330 SB driver.");
     104MODULE_PARM_DESC(sbdma8, "DMA8 for CMI8330/CMI8329 SB driver.");
    105105module_param_array(sbdma16, int, NULL, 0444);
    106 MODULE_PARM_DESC(sbdma16, "DMA16 for CMI8330 SB driver.");
     106MODULE_PARM_DESC(sbdma16, "DMA16 for CMI8330/CMI8329 SB driver.");
    107107
    108108module_param_array(wssport, long, NULL, 0444);
    109 MODULE_PARM_DESC(wssport, "Port # for CMI8330 WSS driver.");
     109MODULE_PARM_DESC(wssport, "Port # for CMI8330/CMI8329 WSS driver.");
    110110module_param_array(wssirq, int, NULL, 0444);
    111 MODULE_PARM_DESC(wssirq, "IRQ # for CMI8330 WSS driver.");
     111MODULE_PARM_DESC(wssirq, "IRQ # for CMI8330/CMI8329 WSS driver.");
    112112module_param_array(wssdma, int, NULL, 0444);
    113 MODULE_PARM_DESC(wssdma, "DMA for CMI8330 WSS driver.");
     113MODULE_PARM_DESC(wssdma, "DMA for CMI8330/CMI8329 WSS driver.");
    114114
    115115module_param_array(fmport, long, NULL, 0444);
    116 MODULE_PARM_DESC(fmport, "FM port # for CMI8330 driver.");
     116MODULE_PARM_DESC(fmport, "FM port # for CMI8330/CMI8329 driver.");
    117117module_param_array(mpuport, long, NULL, 0444);
    118 MODULE_PARM_DESC(mpuport, "MPU-401 port # for CMI8330 driver.");
     118MODULE_PARM_DESC(mpuport, "MPU-401 port # for CMI8330/CMI8329 driver.");
    119119module_param_array(mpuirq, int, NULL, 0444);
    120 MODULE_PARM_DESC(mpuirq, "IRQ # for CMI8330 MPU-401 port.");
     120MODULE_PARM_DESC(mpuirq, "IRQ # for CMI8330/CMI8329 MPU-401 port.");
    121121#ifdef CONFIG_PNP
    122122static int isa_registered;
     
    157157typedef int (*snd_pcm_open_callback_t)(struct snd_pcm_substream *);
    158158
     159enum card_type {
     160        CMI8330,
     161        CMI8329
     162};
     163
    159164struct snd_cmi8330 {
    160165#ifdef CONFIG_PNP
     
    173178                void *private_data; /* sb or wss */
    174179        } streams[2];
     180
     181        enum card_type type;
    175182};
    176183
     
    178185
    179186static struct pnp_card_device_id snd_cmi8330_pnpids[] = {
     187        { .id = "CMI0001", .devs = { { "@X@0001" }, { "@@@0001" }, { "@H@0001" }, { "A@@0001" } } },
    180188        { .id = "CMI0001", .devs = { { "@@@0001" }, { "@X@0001" }, { "@H@0001" } } },
    181189        { .id = "" }
     
    305313        int err;
    306314
    307         strcpy(card->mixername, "CMI8330/C3D");
     315        strcpy(card->mixername, (acard->type == CMI8329) ? "CMI8329" : "CMI8330/C3D");
    308316
    309317        for (idx = 0; idx < ARRAY_SIZE(snd_cmi8330_controls); idx++) {
     
    330338        int err;
    331339
     340        /* CMI8329 has a device with ID A@@0001, CMI8330 does not */
     341        acard->type = (id->devs[3].id[0]) ? CMI8329 : CMI8330;
     342
    332343        acard->cap = pnp_request_card_device(card, id->devs[0].id, NULL);
    333344        if (acard->cap == NULL)
     
    339350
    340351        acard->mpu = pnp_request_card_device(card, id->devs[2].id, NULL);
    341         if (acard->play == NULL)
     352        if (acard->mpu == NULL)
    342353                return -EBUSY;
    343354
     
    346357        err = pnp_activate_dev(pdev);
    347358        if (err < 0) {
    348                 snd_printk(KERN_ERR "CMI8330/C3D PnP configure failure\n");
     359                snd_printk(KERN_ERR "AD1848 PnP configure failure\n");
    349360                return -EBUSY;
    350361        }
     
    352363        wssdma[dev] = pnp_dma(pdev, 0);
    353364        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);
    355367
    356368        /* allocate SB16 resources */
     
    359371        err = pnp_activate_dev(pdev);
    360372        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");
    362374                return -EBUSY;
    363375        }
     
    366378        sbdma16[dev] = pnp_dma(pdev, 1);
    367379        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        }
    368387
    369388        /* allocate MPU-401 resources */
     
    371390
    372391        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        }
    380398        return 0;
    381399}
     
    431449        };
    432450
    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");
    436454        pcm->private_data = chip;
    437455       
     
    528546                             WSS_HW_DETECT, 0, &acard->wss);
    529547        if (err < 0) {
    530                 snd_printk(KERN_ERR PFX "(CMI8330) device busy??\n");
     548                snd_printk(KERN_ERR PFX "AD1848 device busy??\n");
    531549                return err;
    532550        }
    533551        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");
    535553                return -ENODEV;
    536554        }
     
    542560                                    sbdma16[dev],
    543561                                    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");
    545563                return err;
    546564        }
    547565        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");
    549567                return err;
    550568        }
     
    586604        }
    587605
    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");
    590608        sprintf(card->longname, "%s at 0x%lx, irq %d, dma %d",
    591609                card->shortname,
  • GPL/trunk/alsa-kernel/isa/es1688/es1688.c

    r426 r464  
    194194        .match          = snd_es1688_match,
    195195        .probe          = snd_es1688_probe,
    196         .remove         = snd_es1688_remove,
     196        .remove         = __devexit_p(snd_es1688_remove),
    197197#if 0   /* FIXME */
    198198        .suspend        = snd_es1688_suspend,
  • GPL/trunk/alsa-kernel/isa/gus/gus_pcm.c

    r426 r464  
    796796                        continue;
    797797                /* load real volume - better precision */
    798                 spin_lock_irqsave(&gus->reg_lock, flags);
     798                spin_lock(&gus->reg_lock);
    799799                snd_gf1_select_voice(gus, pvoice->number);
    800800                snd_gf1_ctrl_stop(gus, SNDRV_GF1_VB_VOLUME_CONTROL);
     
    802802                snd_gf1_write16(gus, SNDRV_GF1_VW_VOLUME, vol);
    803803                pcmp->final_volume = 1;
    804                 spin_unlock_irqrestore(&gus->reg_lock, flags);
     804                spin_unlock(&gus->reg_lock);
    805805        }
    806806        spin_unlock_irqrestore(&gus->voice_alloc, flags);
  • GPL/trunk/alsa-kernel/isa/gus/gusextreme.c

    r410 r464  
    349349        .match          = snd_gusextreme_match,
    350350        .probe          = snd_gusextreme_probe,
    351         .remove         = snd_gusextreme_remove,
     351        .remove         = __devexit_p(snd_gusextreme_remove),
    352352#if 0   /* FIXME */
    353353        .suspend        = snd_gusextreme_suspend,
  • GPL/trunk/alsa-kernel/pci/ac97/ac97_patch.c

    r402 r464  
    959959
    960960static 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 
     961AC97_SINGLE("Sigmatel 4-Speaker Stereo Playback Switch",
     962                AC97_SIGMATEL_DAC2INVERT, 2, 1, 0);
     963
     964/* "Sigmatel " removed due to excessive name length: */
    963965static const struct snd_kcontrol_new snd_ac97_sigmatel_phaseinvert =
    964 AC97_SINGLE("Sigmatel Surround Phase Inversion Playback Switch", AC97_SIGMATEL_DAC2INVERT, 3, 1, 0);
     966AC97_SINGLE("Surround Phase Inversion Playback Switch",
     967                AC97_SIGMATEL_DAC2INVERT, 3, 1, 0);
    965968
    966969static const struct snd_kcontrol_new snd_ac97_sigmatel_controls[] = {
  • GPL/trunk/alsa-kernel/pci/ali5451/ali5451.c

    r426 r464  
    319319       
    320320        end_time = jiffies + msecs_to_jiffies(250);
    321         do {
     321
     322        for (;;) {
    322323                res = snd_ali_5451_peek(codec,port);
    323324                if (!(res & 0x8000))
    324325                        return 0;
     326                if (!time_after_eq(end_time, jiffies))
     327                        break;
    325328                schedule_timeout_uninterruptible(1);
    326         } while (time_after_eq(end_time, jiffies));
     329        }
     330
    327331        snd_ali_5451_poke(codec, port, res & ~0x8000);
    328332        snd_printdd("ali_codec_ready: codec is not ready.\n ");
     
    336340       
    337341        dwChk1 = snd_ali_5451_peek(codec, ALI_STIMER);
    338         dwChk2 = snd_ali_5451_peek(codec, ALI_STIMER);
    339 
    340342        end_time = jiffies + msecs_to_jiffies(250);
    341         do {
     343
     344        for (;;) {
    342345                dwChk2 = snd_ali_5451_peek(codec, ALI_STIMER);
    343346                if (dwChk2 != dwChk1)
    344347                        return 0;
     348                if (!time_after_eq(end_time, jiffies))
     349                        break;
    345350                schedule_timeout_uninterruptible(1);
    346         } while (time_after_eq(end_time, jiffies));
     351        }
     352
    347353        snd_printk(KERN_ERR "ali_stimer_read: stimer is not ready.\n");
    348354        return -EIO;
     
    481487}
    482488
    483 #ifdef CODEC_RESET
    484 
    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 #endif
    521 
    522489/*
    523490 *  ALI 5451 Controller
     
    563530        outl(gc, ALI_REG(codec, ALI_GC_CIR));
    564531}
    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 #endif
    581532
    582533static void snd_ali_disable_voice_irq(struct snd_ali *codec,
     
    679630        }
    680631}
    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 #endif
    691632
    692633static void snd_ali_stop_voice(struct snd_ali *codec, unsigned int channel)
  • GPL/trunk/alsa-kernel/pci/atiixp.c

    r426 r464  
    288288 */
    289289static 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 */
    294294        { 0, }
    295295};
  • GPL/trunk/alsa-kernel/pci/au88x0/au8810.c

    r305 r464  
    22#include "au88x0.h"
    33static 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,},
    65        {0,}
    76};
  • GPL/trunk/alsa-kernel/pci/au88x0/au8820.c

    r305 r464  
    22#include "au88x0.h"
    33static 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,},
    65        {0,}
    76};
  • GPL/trunk/alsa-kernel/pci/au88x0/au8830.c

    r305 r464  
    22#include "au88x0.h"
    33static 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,},
    65        {0,}
    76};
  • GPL/trunk/alsa-kernel/pci/au88x0/au88x0_core.c

    r426 r464  
    12561256
    12571257        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;
    12601260}
    12611261
     
    15051505
    15061506        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));
    15091508        return temp;
    15101509}
     
    24422441                for (i = 0; i < NR_ADB; i++) {
    24432442                        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;
    24452445                                spin_unlock(&vortex->lock);
    24462446                                snd_pcm_period_elapsed(vortex->dma_adb[i].
  • GPL/trunk/alsa-kernel/pci/bt87x.c

    r445 r464  
    355355                SNDRV_PCM_INFO_INTERLEAVED |
    356356                SNDRV_PCM_INFO_BLOCK_TRANSFER |
    357                 SNDRV_PCM_INFO_MMAP_VALID,
     357                SNDRV_PCM_INFO_MMAP_VALID |
     358                SNDRV_PCM_INFO_BATCH,
    358359        .formats = SNDRV_PCM_FMTBIT_S16_LE,
    359360        .rates = 0, /* set at runtime */
     
    371372                SNDRV_PCM_INFO_INTERLEAVED |
    372373                SNDRV_PCM_INFO_BLOCK_TRANSFER |
    373                 SNDRV_PCM_INFO_MMAP_VALID,
     374                SNDRV_PCM_INFO_MMAP_VALID |
     375                SNDRV_PCM_INFO_BATCH,
    374376        .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8,
    375377        .rates = SNDRV_PCM_RATE_KNOT,
     
    814816        /* Voodoo TV 200 */
    815817        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),
    816820        /* AVerMedia Studio No. 103, 203, ...? */
    817821        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x1461, 0x0003, AVPHONE98),
  • GPL/trunk/alsa-kernel/pci/ca0106/ca0106_main.c

    r426 r464  
    326326        .channels_min =         2,
    327327        .channels_max =         2,
    328         .buffer_bytes_max =     ((65536 - 64) * 8),
     328        .buffer_bytes_max =     65536 - 128,
    329329        .period_bytes_min =     64,
    330         .period_bytes_max =     (65536 - 64),
     330        .period_bytes_max =     32768 - 64,
    331331        .periods_min =          2,
    332332        .periods_max =          2,
     
    13201320
    13211321        pcm->info_flags = 0;
    1322         pcm->dev_subclass = SNDRV_PCM_SUBCLASS_GENERIC_MIX;
    13231322        strcpy(pcm->name, "CA0106");
    13241323
     
    18821881// PCI IDs
    18831882static 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 */
    18851884        { 0, }
    18861885};
  • GPL/trunk/alsa-kernel/pci/ca0106/ca0106_mixer.c

    r410 r464  
    740740
    741741static __devinitdata
    742 DECLARE_TLV_DB_SCALE(snd_ca0106_master_db_scale, -6375, 50, 1);
     742DECLARE_TLV_DB_SCALE(snd_ca0106_master_db_scale, -6375, 25, 1);
    743743
    744744static char *slave_vols[] __devinitdata = {
     
    801801                "External Amplifier",
    802802                "Sigmatel 4-Speaker Stereo Playback Switch",
    803                 "Sigmatel Surround Phase Inversion Playback ",
     803                "Surround Phase Inversion Playback Switch",
    804804                NULL
    805805        };
     
    842842        if (!vmaster)
    843843                return -ENOMEM;
     844        err = snd_ctl_add(card, vmaster);
     845        if (err < 0)
     846                return err;
    844847        add_slaves(card, vmaster, slave_vols);
    845848
     
    849852                if (!vmaster)
    850853                        return -ENOMEM;
     854                err = snd_ctl_add(card, vmaster);
     855                if (err < 0)
     856                        return err;
    851857                add_slaves(card, vmaster, slave_sws);
    852858        }
     859
     860        strcpy(card->mixername, "CA0106");
    853861        return 0;
    854862}
  • GPL/trunk/alsa-kernel/pci/cmipci.c

    r426 r464  
    28142814
    28152815static struct pci_device_id snd_cmipci_ids[] = {
    2816         {PCI_VENDOR_ID_CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8338A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
    2817         {PCI_VENDOR_ID_CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8338B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
    2818         {PCI_VENDOR_ID_CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8738, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
    2819         {PCI_VENDOR_ID_CMEDIA, PCI_DEVICE_ID_CMEDIA_CM8738B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
    2820         {PCI_VENDOR_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},
    28212821        {0,},
    28222822};
  • GPL/trunk/alsa-kernel/pci/cs4281.c

    r426 r464  
    496496
    497497static 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 */
    499499        { 0, }
    500500};
  • GPL/trunk/alsa-kernel/pci/cs46xx/cs46xx.c

    r410 r464  
    6969
    7070static 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 */
    7474        { 0, }
    7575};
  • GPL/trunk/alsa-kernel/pci/emu10k1/emu10k1.c

    r410 r464  
    8484 */
    8585static 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 */
    8989        { 0, }
    9090};
  • GPL/trunk/alsa-kernel/pci/emu10k1/emu10k1x.c

    r426 r464  
    859859
    860860        pcm->info_flags = 0;
    861         pcm->dev_subclass = SNDRV_PCM_SUBCLASS_GENERIC_MIX;
    862861        switch(device) {
    863862        case 0:
     
    16131612// PCI IDs
    16141613static 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) */
    16161615        { 0, }
    16171616};
  • GPL/trunk/alsa-kernel/pci/emu10k1/emupcm.c

    r426 r464  
    17371737        .period_bytes_min =     1024,
    17381738        .period_bytes_max =     (128*1024),
    1739         .periods_min =          1,
     1739        .periods_min =          2,
    17401740        .periods_max =          1024,
    17411741        .fifo_size =            0,
  • GPL/trunk/alsa-kernel/pci/emu10k1/p16v.c

    r426 r464  
    645645        int capture=1;
    646646 
    647         /* snd_printk("KERN_DEBUG snd_p16v_pcm called. device=%d\n", device); */
     647        /* snd_printk(KERN_DEBUG "snd_p16v_pcm called. device=%d\n", device); */
    648648        emu->p16v_device_offset = device;
    649649        if (rpcm)
  • GPL/trunk/alsa-kernel/pci/ens1370.c

    r426 r464  
    446446static struct pci_device_id snd_audiopci_ids[] = {
    447447#ifdef CHIP1370
    448         { 0x1274, 0x5000, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, },   /* ES1370 */
     448        { PCI_VDEVICE(ENSONIQ, 0x5000), 0, },   /* ES1370 */
    449449#endif
    450450#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 */
    454454#endif
    455455        { 0, }
  • GPL/trunk/alsa-kernel/pci/es1938.c

    r426 r464  
    245245
    246246static 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 */
    248248        { 0, }
    249249};
  • GPL/trunk/alsa-kernel/pci/hda/hda_beep.h

    r426 r464  
    3131        char phys[32];
    3232        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 */
    3536        struct work_struct beep_work; /* scheduled task for beep event */
    3637};
  • GPL/trunk/alsa-kernel/pci/hda/hda_codec.c

    r426 r464  
    4545static struct hda_vendor_id hda_vendor_ids[] = {
    4646        { 0x1002, "ATI" },
     47        { 0x1013, "Cirrus Logic" },
    4748        { 0x1057, "Motorola" },
    4849        { 0x1095, "Silicon Image" },
    4950        { 0x10de, "Nvidia" },
    5051        { 0x10ec, "Realtek" },
     52        { 0x1102, "Creative" },
    5153        { 0x1106, "VIA" },
    5254        { 0x111d, "IDT" },
     
    150152        u32 val;
    151153
    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;
    153162        val |= (u32)direct << 27;
    154163        val |= (u32)nid << 20;
     
    156165        val |= parm;
    157166        return val;
     167}
     168
     169/*
     170 * Send and receive a verb
     171 */
     172static 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;
    158203}
    159204
     
    174219                                unsigned int verb, unsigned int parm)
    175220{
    176         struct hda_bus *bus = codec->bus;
     221        unsigned cmd = make_codec_cmd(codec, nid, direct, verb, parm);
    177222        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);
    188224        return res;
    189225}
     
    205241                         unsigned int verb, unsigned int parm)
    206242{
    207         struct hda_bus *bus = codec->bus;
     243        unsigned int cmd = make_codec_cmd(codec, nid, direct, verb, parm);
    208244        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);
    218247}
    219248EXPORT_SYMBOL_HDA(snd_hda_codec_write);
     
    274303        int i, conn_len, conns;
    275304        unsigned int shift, num_elems, mask;
     305        unsigned int wcaps;
    276306        hda_nid_t prev_nid;
    277307
    278308        if (snd_BUG_ON(!conn_list || max_conns <= 0))
    279309                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        }
    280318
    281319        parm = snd_hda_param_read(codec, nid, AC_PAR_CONNLIST_LEN);
     
    299337                parm = snd_hda_codec_read(codec, nid, 0,
    300338                                          AC_VERB_GET_CONNECT_LIST, 0);
     339                if (parm == -1 && codec->bus->rirb_error)
     340                        return -EIO;
    301341                conn_list[0] = parm & mask;
    302342                return 1;
     
    310350                hda_nid_t val, n;
    311351
    312                 if (i % num_elems == 0)
     352                if (i % num_elems == 0) {
    313353                        parm = snd_hda_codec_read(codec, nid, 0,
    314354                                                  AC_VERB_GET_CONNECT_LIST, i);
     355                        if (parm == -1 && codec->bus->rirb_error)
     356                                return -EIO;
     357                }
    315358                range_val = !!(parm & (1 << (shift-1))); /* ranges */
    316359                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                }
    317366                parm >>= shift;
    318367                if (range_val) {
     
    618667        const char *vendor = NULL;
    619668        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;
    621673
    622674        for (c = hda_vendor_ids; c->id; c++) {
     
    630682                vendor = tmp;
    631683        }
     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
    632692        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)
    640699                return -ENOMEM;
    641700        return 0;
     
    698757                struct hda_pincfg *pin;
    699758                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);
    702760                if (wid_type != AC_WID_PIN)
    703761                        continue;
     
    843901        free_hda_cache(&codec->amp_cache);
    844902        free_hda_cache(&codec->cmd_cache);
    845         kfree(codec->name);
     903        kfree(codec->vendor_name);
     904        kfree(codec->chip_name);
    846905        kfree(codec->modelname);
    847906        kfree(codec->wcaps);
     
    861920 */
    862921int /*__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)
    864923{
    865924        struct hda_codec *codec;
     
    9481007                                           AC_VERB_GET_SUBSYSTEM_ID, 0);
    9491008        }
    950         if (bus->modelname)
    951                 codec->modelname = kstrdup(bus->modelname, GFP_KERNEL);
    9521009
    9531010        /* power-up all before initialization */
     
    9561013                            AC_PWRST_D0);
    9571014
    958         if (do_init) {
    959                 err = snd_hda_codec_configure(codec);
    960                 if (err < 0)
    961                         goto error;
    962         }
    9631015        snd_hda_codec_proc_new(codec);
    9641016
     
    9841036
    9851037        codec->preset = find_codec_preset(codec);
    986         if (!codec->name) {
     1038        if (!codec->vendor_name || !codec->chip_name) {
    9871039                err = get_codec_name(codec);
    9881040                if (err < 0)
     
    9911043        /* audio codec should override the mixer name */
    9921044        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);
    9951048
    9961049        if (is_generic_config(codec)) {
     
    10131066        return err;
    10141067}
     1068EXPORT_SYMBOL_HDA(snd_hda_codec_configure);
    10151069
    10161070/**
     
    10601114#define HDA_HASH_KEY(nid,dir,idx) (u32)((nid) + ((idx) << 16) + ((dir) << 24))
    10611115#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))
    10621118#define INFO_AMP_CAPS   (1<<0)
    10631119#define INFO_AMP_VOL(ch)        (1 << (1 + (ch)))
     
    11501206EXPORT_SYMBOL_HDA(snd_hda_override_amp_caps);
    11511207
    1152 u32 snd_hda_query_pin_caps(struct hda_codec *codec, hda_nid_t nid)
     1208static unsigned int
     1209query_caps_hash(struct hda_codec *codec, hda_nid_t nid, u32 key,
     1210                unsigned int (*func)(struct hda_codec *, hda_nid_t))
    11531211{
    11541212        struct hda_amp_info *info;
    11551213
    1156         info = get_alloc_amp_hash(codec, HDA_HASH_PINCAP_KEY(nid));
     1214        info = get_alloc_amp_hash(codec, key);
    11571215        if (!info)
    11581216                return 0;
    11591217        if (!info->head.val) {
    1160                 info->amp_caps = snd_hda_param_read(codec, nid, AC_PAR_PIN_CAP);
    11611218                info->head.val |= INFO_AMP_CAPS;
     1219                info->amp_caps = func(codec, nid);
    11621220        }
    11631221        return info->amp_caps;
     1222}
     1223
     1224static 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
     1229u32 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);
    11641233}
    11651234EXPORT_SYMBOL_HDA(snd_hda_query_pin_caps);
     
    14371506        id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
    14381507        id.index = idx;
     1508        if (snd_BUG_ON(strlen(name) >= sizeof(id.name)))
     1509                return NULL;
    14391510        strcpy(id.name, name);
    14401511        return snd_ctl_find_id(codec->bus->card, &id);
     
    22472318                              int direct, unsigned int verb, unsigned int parm)
    22482319{
    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;
    22712336}
    22722337EXPORT_SYMBOL_HDA(snd_hda_codec_write_cache);
     
    23162381        int i;
    23172382
    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,
    23192387                            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);
    23212391
    23222392        nid = codec->start_nid;
     
    23242394                unsigned int wcaps = get_wcaps(codec, nid);
    23252395                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) {
    23292399                                unsigned int pincap;
    23302400                                /*
     
    23382408                                                AC_VERB_GET_EAPD_BTLENABLE, 0);
    23392409                                        eapd &= 0x02;
    2340                                         if (power_state == AC_PWRST_D3 && eapd)
     2410                                        if (eapd)
    23412411                                                continue;
    23422412                                }
     
    25322602        case 24:
    25332603        case 32:
    2534                 if (maxbps >= 32)
     2604                if (maxbps >= 32 || format == SNDRV_PCM_FORMAT_FLOAT_LE)
    25352605                        val |= 0x40;
    25362606                else if (maxbps >= 24)
     
    25492619EXPORT_SYMBOL_HDA(snd_hda_calc_stream_format);
    25502620
     2621static 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
     2634static 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
     2640static 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
     2650static 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
    25512656/**
    25522657 * snd_hda_query_supported_pcm - query the supported PCM rates and formats
     
    25672672        unsigned int i, val, wcaps;
    25682673
    2569         val = 0;
    25702674        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);
    25782676
    25792677        if (ratesp) {
     
    25972695                unsigned int streams, bps;
    25982696
    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)
    26012699                        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                 }
    26082700
    26092701                bps = 0;
     
    26372729                        }
    26382730                }
    2639                 else if (streams == AC_SUPFMT_FLOAT32) {
    2640                         /* should be exclusive */
     2731                if (streams & AC_SUPFMT_FLOAT32) {
    26412732                        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) {
    26442737                        /* should be exclusive */
    26452738                        /* temporary hack: we have still no proper support
     
    26792772        unsigned int val = 0, rate, stream;
    26802773
    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;
    26922777
    26932778        rate = format & 0xff00;
     
    27012786                return 0;
    27022787
    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)
    27092790                return 0;
    27102791
     
    34253506                mutex_lock(&codec->spdif_mutex);
    34263507                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                        }
    34313518                }
    34323519                mutex_unlock(&codec->spdif_mutex);
     
    35983685        for (nid = codec->start_nid; nid < end_nid; nid++) {
    35993686                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);
    36023688                unsigned int def_conf;
    36033689                short assoc, loc;
     
    38403926 * snd_hda_suspend - suspend the codecs
    38413927 * @bus: the HDA bus
    3842  * @state: suspsend state
    38433928 *
    38443929 * Returns 0 if successful.
    38453930 */
    3846 int snd_hda_suspend(struct hda_bus *bus, pm_message_t state)
     3931int snd_hda_suspend(struct hda_bus *bus)
    38473932{
    38483933        struct hda_codec *codec;
  • GPL/trunk/alsa-kernel/pci/hda/hda_codec.h

    r426 r464  
    569569        int (*command)(struct hda_bus *bus, unsigned int cmd);
    570570        /* 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);
    572572        /* free the private data */
    573573        void (*private_free)(struct hda_bus *);
     
    575575        int (*attach_pcm)(struct hda_bus *bus, struct hda_codec *codec,
    576576                          struct hda_pcm *pcm);
     577        /* reset bus for retry verb */
     578        void (*bus_reset)(struct hda_bus *bus);
    577579#ifdef CONFIG_SND_HDA_POWER_SAVE
    578580        /* notify power-up/down from codec to controller */
     
    627629        /* misc op flags */
    628630        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 */
    629634        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 */
    630638};
    631639
     
    752760        const struct hda_codec_preset *preset;
    753761        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 */
    755764        const char *modelname;  /* model name for preset */
    756765
     
    830839                    struct hda_bus **busp);
    831840int 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);
     842int snd_hda_codec_configure(struct hda_codec *codec);
    833843
    834844/*
     
    914924 */
    915925#ifdef CONFIG_PM
    916 int snd_hda_suspend(struct hda_bus *bus, pm_message_t state);
     926int snd_hda_suspend(struct hda_bus *bus);
    917927int snd_hda_resume(struct hda_bus *bus);
    918928#endif
     
    938948#endif
    939949
     950#ifdef CONFIG_SND_HDA_PATCH_LOADER
     951/*
     952 * patch firmware
     953 */
     954int snd_hda_load_patch(struct hda_bus *bus, const char *patch);
     955#endif
     956
    940957/*
    941958 * Codec modularization
  • GPL/trunk/alsa-kernel/pci/hda/hda_generic.c

    r426 r464  
    122122                return -ENOMEM;
    123123        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;
    129135        }
    130136        if (nconns <= ARRAY_SIZE(node->slist))
     
    141147        memcpy(node->conn_list, conn_list, nconns * sizeof(hda_nid_t));
    142148        node->nconns = nconns;
    143         node->wid_caps = get_wcaps(codec, nid);
    144         node->type = (node->wid_caps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;
    145149
    146150        if (node->type == AC_WID_PIN) {
  • GPL/trunk/alsa-kernel/pci/hda/hda_hwdep.c

    r426 r464  
    2525#include <linux/mutex.h>
    2626#include <linux/ctype.h>
     27#include <linux/firmware.h>
    2728#include <sound/core.h>
    2829#include "hda_codec.h"
     
    243244CODEC_INFO_SHOW(afg);
    244245CODEC_INFO_SHOW(mfg);
    245 CODEC_INFO_STR_SHOW(name);
     246CODEC_INFO_STR_SHOW(vendor_name);
     247CODEC_INFO_STR_SHOW(chip_name);
    246248CODEC_INFO_STR_SHOW(modelname);
    247249
     
    276278CODEC_INFO_STORE(subsystem_id);
    277279CODEC_INFO_STORE(revision_id);
    278 CODEC_INFO_STR_STORE(name);
     280CODEC_INFO_STR_STORE(vendor_name);
     281CODEC_INFO_STR_STORE(chip_name);
    279282CODEC_INFO_STR_STORE(modelname);
    280283
     
    311314}
    312315
    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;
     316static int parse_init_verbs(struct hda_codec *codec, const char *buf)
     317{
    319318        struct hda_verb *v;
    320319        int nid, verb, param;
     
    330329        v->verb = verb;
    331330        v->param = param;
     331        return 0;
     332}
     333
     334static 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;
    332343        return count;
    333344}
     
    375386#define MAX_HINTS       1024
    376387
    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;
     388static int parse_hints(struct hda_codec *codec, const char *buf)
     389{
    383390        char *key, *val;
    384391        struct hda_hint *hint;
     
    387394                buf++;
    388395        if (!*buf || *buf == '#' || *buf == '\n')
    389                 return count;
     396                return 0;
    390397        if (*buf == '=')
    391398                return -EINVAL;
     
    410417                hint->key = key;
    411418                hint->val = val;
    412                 return count;
     419                return 0;
    413420        }
    414421        /* allocate a new hint entry */
     
    423430        hint->key = key;
    424431        hint->val = val;
     432        return 0;
     433}
     434
     435static 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;
    425444        return count;
    426445}
     
    468487#define MAX_PIN_CONFIGS         32
    469488
    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;
     489static int parse_user_pin_configs(struct hda_codec *codec, const char *buf)
     490{
    476491        int nid, cfg;
    477         int err;
    478492
    479493        if (sscanf(buf, "%i %i", &nid, &cfg) != 2)
     
    481495        if (!nid)
    482496                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
     500static 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);
    484507        if (err < 0)
    485508                return err;
     
    500523        CODEC_ATTR_RO(afg),
    501524        CODEC_ATTR_RO(mfg),
    502         CODEC_ATTR_RW(name),
     525        CODEC_ATTR_RW(vendor_name),
     526        CODEC_ATTR_RW(chip_name),
    503527        CODEC_ATTR_RW(modelname),
    504528        CODEC_ATTR_RW(init_verbs),
     
    551575
    552576#endif /* CONFIG_SND_HDA_RECONFIG */
     577
     578#ifdef CONFIG_SND_HDA_PATCH_LOADER
     579
     580/* parser mode */
     581enum {
     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
     591static 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 */
     599static 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 */
     620static 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
     628static 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
     636static 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
     644static 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
     653struct hda_patch_item {
     654        const char *tag;
     655        void (*parser)(char *buf, struct hda_bus *bus, struct hda_codec **retc);
     656};
     657
     658static 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 */
     667static 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 */
     685static 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 */
     719int 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}
     752EXPORT_SYMBOL_HDA(snd_hda_load_patch);
     753#endif /* CONFIG_SND_HDA_PATCH_LOADER */
  • GPL/trunk/alsa-kernel/pci/hda/hda_intel.c

    r445 r464  
    6767static int single_cmd;
    6868static int enable_msi;
     69#ifdef CONFIG_SND_HDA_PATCH_LOADER
     70static char *patch[SNDRV_CARDS];
     71#endif
    6972
    7073module_param_array(index, int, NULL, 0444);
     
    9093module_param(enable_msi, int, 0444);
    9194MODULE_PARM_DESC(enable_msi, "Enable Message Signaled Interrupt (MSI)");
     95#ifdef CONFIG_SND_HDA_PATCH_LOADER
     96module_param_array(patch, charp, NULL, 0444);
     97MODULE_PARM_DESC(patch, "Patch file for Intel HD audio interface.");
     98#endif
    9299
    93100#ifdef CONFIG_SND_HDA_POWER_SAVE
     
    134141MODULE_DESCRIPTION("Intel HDA driver");
    135142
     143#ifdef CONFIG_SND_VERBOSE_PRINTK
     144#define SFX     /* nop */
     145#else
    136146#define SFX     "hda-intel: "
    137 
     147#endif
    138148
    139149/*
     
    141151 */
    142152#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 */
    143158#define ICH6_REG_VMIN                   0x02
    144159#define ICH6_REG_VMAJ                   0x03
     
    146161#define ICH6_REG_INPAY                  0x06
    147162#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 */
    148166#define ICH6_REG_WAKEEN                 0x0c
    149167#define ICH6_REG_STATESTS               0x0e
    150168#define ICH6_REG_GSTS                   0x10
     169#define   ICH6_GSTS_FSTS        (1 << 1)   /* flush status */
    151170#define ICH6_REG_INTCTL                 0x20
    152171#define ICH6_REG_INTSTS                 0x24
     
    156175#define ICH6_REG_CORBUBASE              0x44
    157176#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 */
    159179#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 */
    160182#define ICH6_REG_CORBSTS                0x4d
     183#define   ICH6_CORBSTS_CMEI     (1 << 0)   /* memory error indication */
    161184#define ICH6_REG_CORBSIZE               0x4e
    162185
     
    164187#define ICH6_REG_RIRBUBASE              0x54
    165188#define ICH6_REG_RIRBWP                 0x58
     189#define   ICH6_RIRBWP_RST       (1 << 15)  /* write pointer reset */
    166190#define ICH6_REG_RINTCNT                0x5a
    167191#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 */
    168195#define ICH6_REG_RIRBSTS                0x5d
     196#define   ICH6_RBSTS_IRQ        (1 << 0)   /* response irq */
     197#define   ICH6_RBSTS_OVERRUN    (1 << 2)   /* overrun irq */
    169198#define ICH6_REG_RIRBSIZE               0x5e
    170199
     
    237266/* STATESTS int mask: S3,SD2,SD1,SD0 */
    238267#define AZX_MAX_CODECS          4
    239 #define STATESTS_INT_MASK       0x0f
     268#define STATESTS_INT_MASK       ((1 << AZX_MAX_CODECS) - 1)
    240269
    241270/* SD_CTL bits */
     
    263292#define ICH6_INT_GLOBAL_EN      0x80000000 /* global interrupt enable bit */
    264293
    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 */
    275294/* below are so far hardcoded - should read registers in future */
    276295#define ICH6_MAX_CORB_ENTRIES   256
     
    367386        /* for RIRB */
    368387        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 */
    371390};
    372391
     
    428447
    429448        /* for debugging */
    430         unsigned int last_cmd;  /* last issued command (to sync) */
     449        unsigned int last_cmd[AZX_MAX_CODECS];
    431450
    432451        /* for pending irqs */
     
    523542static void azx_init_cmd_io(struct azx *chip)
    524543{
     544        spin_lock_irq(&chip->reg_lock);
    525545        /* CORB set up */
    526546        chip->corb.addr = chip->rb.addr;
     
    534554        azx_writew(chip, CORBWP, 0);
    535555        /* reset the corb hw read pointer */
    536         azx_writew(chip, CORBRP, ICH6_RBRWP_CLR);
     556        azx_writew(chip, CORBRP, ICH6_CORBRP_RST);
    537557        /* enable corb dma */
    538         azx_writeb(chip, CORBCTL, ICH6_RBCTL_DMA_EN);
     558        azx_writeb(chip, CORBCTL, ICH6_CORBCTL_RUN);
    539559
    540560        /* RIRB set up */
    541561        chip->rirb.addr = chip->rb.addr + 2048;
    542562        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));
    543565        azx_writel(chip, RIRBLBASE, (u32)chip->rirb.addr);
    544566        azx_writel(chip, RIRBUBASE, upper_32_bits(chip->rirb.addr));
     
    547569        azx_writeb(chip, RIRBSIZE, 0x02);
    548570        /* reset the rirb hw write pointer */
    549         azx_writew(chip, RIRBWP, ICH6_RBRWP_CLR);
     571        azx_writew(chip, RIRBWP, ICH6_RIRBWP_RST);
    550572        /* set N=1, get RIRB response interrupt for new entry */
    551573        azx_writew(chip, RINTCNT, 1);
    552574        /* enable rirb dma and response irq */
    553575        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);
    555577}
    556578
    557579static void azx_free_cmd_io(struct azx *chip)
    558580{
     581        spin_lock_irq(&chip->reg_lock);
    559582        /* disable ringbuffer DMAs */
    560583        azx_writeb(chip, RIRBCTL, 0);
    561584        azx_writeb(chip, CORBCTL, 0);
     585        spin_unlock_irq(&chip->reg_lock);
     586}
     587
     588static 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
     600static 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;
    562610}
    563611
     
    566614{
    567615        struct azx *chip = bus->private_data;
     616        unsigned int addr = azx_command_addr(val);
    568617        unsigned int wp;
     618
     619        spin_lock_irq(&chip->reg_lock);
    569620
    570621        /* add command to corb */
     
    573624        wp %= ICH6_MAX_CORB_ENTRIES;
    574625
    575         spin_lock_irq(&chip->reg_lock);
    576         chip->rirb.cmds++;
     626        chip->rirb.cmds[addr]++;
    577627        chip->corb.buf[wp] = cpu_to_le32(val);
    578628        azx_writel(chip, CORBWP, wp);
     629
    579630        spin_unlock_irq(&chip->reg_lock);
    580631
     
    588639{
    589640        unsigned int rp, wp;
     641        unsigned int addr;
    590642        u32 res, res_ex;
    591643
     
    594646                return;
    595647        chip->rirb.wp = wp;
    596                
     648
    597649        while (chip->rirb.rp != wp) {
    598650                chip->rirb.rp++;
     
    602654                res_ex = le32_to_cpu(chip->rirb.buf[rp + 1]);
    603655                res = le32_to_cpu(chip->rirb.buf[rp]);
     656                addr = azx_response_addr(res_ex);
    604657                if (res_ex & ICH6_RIRB_EX_UNSOL_EV)
    605658                        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;
    608661                        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]);
    611668        }
    612669}
    613670
    614671/* receive a response */
    615 static unsigned int azx_rirb_get_response(struct hda_bus *bus)
     672static unsigned int azx_rirb_get_response(struct hda_bus *bus,
     673                                          unsigned int addr)
    616674{
    617675        struct azx *chip = bus->private_data;
     
    629687                        spin_unlock_irq(&chip->reg_lock);
    630688                }
    631                 if (!chip->rirb.cmds) {
     689                if (!chip->rirb.cmds[addr]) {
    632690                        smp_rmb();
    633                         return chip->rirb.res; /* the last value */
     691                        bus->rirb_error = 0;
     692                        return chip->rirb.res[addr]; /* the last value */
    634693                }
    635694                if (time_after(jiffies, timeout))
     
    655714#endif
    656715        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]);
    659719                free_irq(chip->irq, chip);
    660720                chip->irq = -1;
    661721                pci_disable_msi(chip->pci);
    662722                chip->msi = 0;
    663                 if (azx_acquire_irq(chip, 1) < 0)
     723                if (azx_acquire_irq(chip, 1) < 0) {
     724                        bus->rirb_error = 1;
    664725                        return -1;
     726                }
    665727                goto again;
    666728        }
    667729
    668730        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, "
    670732                           "switching to polling mode: last cmd=0x%08x\n",
    671                            chip->last_cmd);
     733                           chip->last_cmd[addr]);
    672734                chip->polling_mode = 1;
    673735                goto again;
     
    682744        }
    683745
     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
    684755        snd_printk(KERN_ERR "hda_intel: azx_get_response timeout, "
    685756                   "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]);
    690758        chip->single_cmd = 1;
     759        bus->response_reset = 0;
     760        /* re-initialize CORB/RIRB */
    691761        azx_free_cmd_io(chip);
     762        azx_init_cmd_io(chip);
    692763        return -1;
    693764}
     
    703774 */
    704775
     776/* receive a response */
     777static 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
    705797/* send a command */
    706798static int azx_single_send_cmd(struct hda_bus *bus, u32 val)
    707799{
    708800        struct azx *chip = bus->private_data;
     801        unsigned int addr = azx_command_addr(val);
    709802        int timeout = 50;
    710803
     804        bus->rirb_error = 0;
    711805        while (timeout--) {
    712806                /* check ICB busy bit */
     
    718812                        azx_writew(chip, IRS, azx_readw(chip, IRS) |
    719813                                   ICH6_IRS_BUSY);
    720                         return 0;
     814                        return azx_single_wait_for_response(chip, addr);
    721815                }
    722816                udelay(1);
     
    729823
    730824/* receive a response */
    731 static unsigned int azx_single_get_response(struct hda_bus *bus)
     825static unsigned int azx_single_get_response(struct hda_bus *bus,
     826                                            unsigned int addr)
    732827{
    733828        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];
    746830}
    747831
     
    758842        struct azx *chip = bus->private_data;
    759843
    760         chip->last_cmd = val;
     844        chip->last_cmd[azx_command_addr(val)] = val;
    761845        if (chip->single_cmd)
    762846                return azx_single_send_cmd(bus, val);
     
    766850
    767851/* get a response */
    768 static unsigned int azx_get_response(struct hda_bus *bus)
     852static unsigned int azx_get_response(struct hda_bus *bus,
     853                                     unsigned int addr)
    769854{
    770855        struct azx *chip = bus->private_data;
    771856        if (chip->single_cmd)
    772                 return azx_single_get_response(bus);
     857                return azx_single_get_response(bus, addr);
    773858        else
    774                 return azx_rirb_get_response(bus);
     859                return azx_rirb_get_response(bus, addr);
    775860}
    776861
     
    811896        /* check to see if controller is ready */
    812897        if (!azx_readb(chip, GCTL)) {
    813                 snd_printd("azx_reset: controller not ready!\n");
     898                snd_printd(SFX "azx_reset: controller not ready!\n");
    814899                return -EBUSY;
    815900        }
    816901
    817902        /* Accept unsolicited responses */
    818         azx_writel(chip, GCTL, azx_readl(chip, GCTL) | ICH6_GCTL_UREN);
     903        azx_writel(chip, GCTL, azx_readl(chip, GCTL) | ICH6_GCTL_UNSOL);
    819904
    820905        /* detect codecs */
    821906        if (!chip->codec_mask) {
    822907                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);
    824909        }
    825910
     
    9311016
    9321017        /* initialize the codec command I/O */
    933         if (!chip->single_cmd)
    934                 azx_init_cmd_io(chip);
     1018        azx_init_cmd_io(chip);
    9351019
    9361020        /* program the position buffer */
     
    9891073                pci_read_config_word(chip->pci, INTEL_SCH_HDA_DEVC, &snoop);
    9901074                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,
    9921076                                snoop & (~INTEL_SCH_HDA_DEVC_NOSNOOP));
    9931077                        pci_read_config_word(chip->pci,
    9941078                                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)
    9971081                                ? "Failed" : "OK");
    9981082                }
     
    10481132        status = azx_readb(chip, RIRBSTS);
    10491133        if (status & RIRB_INT_MASK) {
    1050                 if (!chip->single_cmd && (status & RIRB_INT_RESPONSE))
     1134                if (status & RIRB_INT_RESPONSE)
    10511135                        azx_update_rirb(chip);
    10521136                azx_writeb(chip, RIRBSTS, RIRB_INT_MASK);
     
    11401224                pos_adj = frames_to_bytes(runtime, pos_adj);
    11411225                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",
    11431227                                   bdl_pos_adj[chip->dev_index]);
    11441228                        pos_adj = 0;
     
    11641248
    11651249 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",
    11671251                   azx_dev->bufsize, period_bytes);
    11681252        return -EINVAL;
     
    12511335        unsigned int res;
    12521336
     1337        mutex_lock(&chip->bus->cmd_mutex);
    12531338        chip->probing = 1;
    12541339        azx_send_cmd(chip->bus, cmd);
    1255         res = azx_get_response(chip->bus);
     1340        res = azx_get_response(chip->bus, addr);
    12561341        chip->probing = 0;
     1342        mutex_unlock(&chip->bus->cmd_mutex);
    12571343        if (res == -1)
    12581344                return -EIO;
    1259         snd_printdd("hda_intel: codec #%d probed OK\n", addr);
     1345        snd_printdd(SFX "codec #%d probed OK\n", addr);
    12601346        return 0;
    12611347}
     
    12641350                                 struct hda_pcm *cpcm);
    12651351static void azx_stop_chip(struct azx *chip);
     1352
     1353static 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}
    12661372
    12671373/*
     
    12741380};
    12751381
    1276 static int __devinit azx_codec_create(struct azx *chip, const char *model,
    1277                                       int no_init)
     1382static int __devinit azx_codec_create(struct azx *chip, const char *model)
    12781383{
    12791384        struct hda_bus_template bus_temp;
     
    12881393        bus_temp.ops.get_response = azx_get_response;
    12891394        bus_temp.ops.attach_pcm = azx_attach_pcm_stream;
     1395        bus_temp.ops.bus_reset = azx_bus_reset;
    12901396#ifdef CONFIG_SND_HDA_POWER_SAVE
    12911397        bus_temp.power_save = &power_save;
     
    13121418                                 * that don't exist
    13131419                                 */
    1314                                 snd_printk(KERN_WARNING
    1315                                            "hda_intel: Codec #%d probe error; "
     1420                                snd_printk(KERN_WARNING SFX
     1421                                           "Codec #%d probe error; "
    13161422                                           "disabling it...\n", c);
    13171423                                chip->codec_mask &= ~(1 << c);
     
    13331439                if ((chip->codec_mask & (1 << c)) & chip->codec_probe_mask) {
    13341440                        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);
    13361442                        if (err < 0)
    13371443                                continue;
     
    13431449                return -ENXIO;
    13441450        }
    1345 
     1451        return 0;
     1452}
     1453
     1454/* configure each codec instance */
     1455static 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        }
    13461461        return 0;
    13471462}
     
    14411556                return err;
    14421557        }
     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        }
    14431570        spin_lock_irqsave(&chip->reg_lock, flags);
    14441571        azx_dev->substream = substream;
     
    14491576        snd_pcm_set_sync(substream);
    14501577        mutex_unlock(&chip->open_mutex);
    1451 
    14521578        return 0;
    14531579}
     
    15291655        period_bytes = snd_pcm_lib_period_bytes(substream);
    15301656
    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",
    15321658                    bufsize, format_val);
    15331659
     
    18721998        if (err < 0)
    18731999                return err;
    1874         strcpy(pcm->name, cpcm->name);
     2000        strlcpy(pcm->name, cpcm->name, sizeof(pcm->name));
    18752001        apcm = kzalloc(sizeof(*apcm), GFP_KERNEL);
    18762002        if (apcm == NULL)
     
    20172143                snd_pcm_suspend_all(chip->pcm[i]);
    20182144        if (chip->initialized)
    2019                 snd_hda_suspend(chip->bus, state);
     2145                snd_hda_suspend(chip->bus);
    20202146        azx_stop_chip(chip);
    20212147        if (chip->irq >= 0) {
     
    21882314        SND_PCI_QUIRK(0x17c0, 0x4085, "Medion MD96630", 0x01),
    21892315        /* forced codec slots */
     2316        SND_PCI_QUIRK(0x1043, 0x1262, "ASUS W5Fm", 0x103),
    21902317        SND_PCI_QUIRK(0x1046, 0x1262, "ASUS W5F", 0x103),
    21912318        {0}
     
    22192346}
    22202347
     2348/*
     2349 * white-list for enable_msi
     2350 */
     2351static struct snd_pci_quirk msi_white_list[] __devinitdata = {
     2352        SND_PCI_QUIRK(0x103c, 0x3607, "HP Compa CQ40", 1),
     2353        {0}
     2354};
     2355
     2356static 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
    22212372
    22222373/*
     
    22532404        chip->irq = -1;
    22542405        chip->driver_type = driver_type;
    2255         chip->msi = enable_msi;
     2406        check_msi(chip);
    22562407        chip->dev_index = dev;
    22572408        INIT_WORK(&chip->irq_pending_work, azx_irq_pending_work);
     
    23112462
    23122463        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        }
    23182479
    23192480        /* 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)))
    23212482                pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(64));
    23222483        else {
     
    23552516                                GFP_KERNEL);
    23562517        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");
    23582519                goto errout;
    23592520        }
     
    23782539        }
    23792540        /* 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;
    23852544
    23862545        /* initialize streams */
     
    24052564
    24062565        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);
    24102571
    24112572        *rchip = chip;
     
    24512612        }
    24522613
     2614        /* set this here since it's referred in snd_hda_load_patch() */
     2615        snd_card_set_dev(card, &pci->dev);
     2616
    24532617        err = azx_create(card, pci, dev, pci_id->driver_data, &chip);
    24542618        if (err < 0)
     
    24572621
    24582622        /* create codec instances */
    2459         err = azx_codec_create(chip, model[dev], probe_only[dev]);
     2623        err = azx_codec_create(chip, model[dev]);
    24602624        if (err < 0)
    24612625                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        }
    24622640
    24632641        /* create PCM streams */
     
    24702648        if (err < 0)
    24712649                goto out_free;
    2472 
    2473         snd_card_set_dev(card, &pci->dev);
    24742650
    24752651        err = snd_card_register(card);
     
    25602736        /* Teradici */
    25612737        { 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 */
    25632753        { 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),
    25642758          .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
    25652759          .class_mask = 0xffffff,
  • GPL/trunk/alsa-kernel/pci/hda/hda_local.h

    r426 r464  
    100100                        unsigned int *tlv, const char **slaves);
    101101int snd_hda_codec_reset(struct hda_codec *codec);
    102 int snd_hda_codec_configure(struct hda_codec *codec);
    103102
    104103/* amp value bits */
     
    409408}
    410409
     410/* get the widget type from widget capability bits */
     411#define get_wcaps_type(wcaps) (((wcaps) & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT)
     412
     413static 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
    411423u32 query_amp_caps(struct hda_codec *codec, hda_nid_t nid, int direction);
    412424int 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  
    467467        int i, nodes;
    468468
    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");
    471475        snd_iprintf(buffer, "Address: %d\n", codec->addr);
    472476        snd_iprintf(buffer, "Function Id: 0x%x\n", codec->function_id);
     
    505509                        snd_hda_param_read(codec, nid,
    506510                                           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);
    509512                hda_nid_t conn[HDA_MAX_CONNECTIONS];
    510513                int conn_len = 0;
     
    513516                            get_wid_type_name(wid_type), wid_caps);
    514517                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);
    518519                        if (chans == 2)
    519520                                snd_iprintf(buffer, " Stereo");
  • GPL/trunk/alsa-kernel/pci/hda/patch_analog.c

    r426 r464  
    7373
    7474        unsigned int jack_present :1;
     75        unsigned int inv_jack_detect:1;
    7576
    7677#ifdef CONFIG_SND_HDA_POWER_SAVE
     
    670671};
    671672
    672 static struct snd_kcontrol_new ad1986a_laptop_eapd_mixers[] = {
     673static struct snd_kcontrol_new ad1986a_laptop_master_mixers[] = {
    673674        HDA_BIND_VOL("Master Playback Volume", &ad1986a_laptop_master_vol),
    674675        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
     679static struct snd_kcontrol_new ad1986a_laptop_eapd_mixers[] = {
    705680        HDA_CODEC_VOLUME("PCM Playback Volume", 0x03, 0x0, HDA_OUTPUT),
    706681        HDA_CODEC_MUTE("PCM Playback Switch", 0x03, 0x0, HDA_OUTPUT),
     
    728703};
    729704
     705static 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
    730711/* re-connect the mic boost input according to the jack sensing */
    731712static void ad1986a_automic(struct hda_codec *codec)
     
    777758
    778759        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;
    781763        ad1986a_update_hp(codec);
    782764}
     
    817799}
    818800
    819 static struct snd_kcontrol_new ad1986a_laptop_automute_mixers[] = {
     801static struct snd_kcontrol_new ad1986a_automute_master_mixers[] = {
    820802        HDA_BIND_VOL("Master Playback Volume", &ad1986a_laptop_master_vol),
    821803        {
     
    827809                .private_value = HDA_COMPOSE_AMP_VAL(0x1a, 3, 0, HDA_OUTPUT),
    828810        },
    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
    855814
    856815/*
     
    982941};
    983942
     943static 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
     956static 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
    984964
    985965/* models */
     
    992972        AD1986A_ULTRA,
    993973        AD1986A_SAMSUNG,
     974        AD1986A_SAMSUNG_P50,
    994975        AD1986A_MODELS
    995976};
     
    1003984        [AD1986A_ULTRA]         = "ultra",
    1004985        [AD1986A_SAMSUNG]       = "samsung",
     986        [AD1986A_SAMSUNG_P50]   = "samsung-p50",
    1005987};
    1006988
     
    10251007        SND_PCI_QUIRK(0x144d, 0xb03c, "Samsung R55", AD1986A_3STACK),
    10261008        SND_PCI_QUIRK(0x144d, 0xc01e, "FSC V2060", AD1986A_LAPTOP),
     1009        SND_PCI_QUIRK(0x144d, 0xc024, "Samsung P50", AD1986A_SAMSUNG_P50),
    10271010        SND_PCI_QUIRK(0x144d, 0xc027, "Samsung Q1", AD1986A_ULTRA),
    10281011        SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc000, "Samsung", AD1986A_SAMSUNG),
     
    11121095                break;
    11131096        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;
    11151101                spec->num_init_verbs = 2;
    11161102                spec->init_verbs[1] = ad1986a_eapd_init_verbs;
     
    11231109                break;
    11241110        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;
    11261114                spec->num_init_verbs = 3;
    11271115                spec->init_verbs[1] = ad1986a_eapd_init_verbs;
     
    11361124                codec->patch_ops.init = ad1986a_automic_init;
    11371125                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;
    11381143        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;
    11401148                spec->num_init_verbs = 3;
    11411149                spec->init_verbs[1] = ad1986a_eapd_init_verbs;
     
    11491157                codec->patch_ops.unsol_event = ad1986a_hp_unsol_event;
    11501158                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;
    11511163                break;
    11521164        case AD1986A_ULTRA:
     
    29712983                                                  ad1988_models, ad1988_cfg_tbl);
    29722984        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);
    29742987                board_config = AD1988_AUTO;
    29752988        }
     
    37353748};
    37363749
     3750static 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
    37373763static struct snd_kcontrol_new ad1884a_mobile_mixers[] = {
    37383764        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        },
    37403774        HDA_CODEC_VOLUME("PCM Playback Volume", 0x20, 0x5, HDA_INPUT),
    37413775        HDA_CODEC_MUTE("PCM Playback Switch", 0x20, 0x5, HDA_INPUT),
     
    38033837        {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
    38043838        {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},
    38073841        {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},
    38083844        /* Port-C pin - internal mic-in */
    38093845        {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
     
    38583894        {0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_HP_EVENT},
    38593895        {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 */
    38603900        {0} /* end */
    38613901};
     
    39674007        SND_PCI_QUIRK(0x103c, 0x3056, "HP", AD1884A_MOBILE),
    39684008        SND_PCI_QUIRK_MASK(0x103c, 0xfff0, 0x3070, "HP", AD1884A_MOBILE),
     4009        SND_PCI_QUIRK_MASK(0x103c, 0xfff0, 0x30d0, "HP laptop", AD1884A_LAPTOP),
    39694010        SND_PCI_QUIRK_MASK(0x103c, 0xfff0, 0x30e0, "HP laptop", AD1884A_LAPTOP),
    39704011        SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3600, "HP laptop", AD1884A_LAPTOP),
     4012        SND_PCI_QUIRK_MASK(0x103c, 0xfff0, 0x7010, "HP laptop", AD1884A_MOBILE),
    39714013        SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X300", AD1884A_THINKPAD),
    39724014        {0}
  • GPL/trunk/alsa-kernel/pci/hda/patch_atihdmi.c

    r426 r464  
    142142         */
    143143        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);
    146145        info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = chans;
    147146
  • GPL/trunk/alsa-kernel/pci/hda/patch_cmedia.c

    r426 r464  
    636636                                                        cmi9880_cfg_tbl);
    637637        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);
    639640                spec->board_config = CMI_AUTO; /* try everything */
    640641        }
  • GPL/trunk/alsa-kernel/pci/hda/patch_conexant.c

    r426 r464  
    109109        hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS];
    110110
     111        unsigned int dell_automute;
     112        unsigned int port_d_mode;
    111113};
    112114
     
    350352}
    351353
    352 #ifdef CONFIG_SND_JACK
     354#ifdef CONFIG_SND_HDA_INPUT_JACK
    353355static void conexant_free_jack_priv(struct snd_jack *jack)
    354356{
     
    464466static void conexant_free(struct hda_codec *codec)
    465467{
    466 #ifdef CONFIG_SND_JACK
     468#ifdef CONFIG_SND_HDA_INPUT_JACK
    467469        struct conexant_spec *spec = codec->spec;
    468470        if (spec->jacks.list) {
     
    18491851static struct snd_pci_quirk cxt5051_cfg_tbl[] = {
    18501852        SND_PCI_QUIRK(0x103c, 0x30cf, "HP DV6736", CXT5051_HP_DV6736),
     1853        SND_PCI_QUIRK(0x103c, 0x360b, "Compaq Presario CQ60", CXT5051_HP),
    18511854        SND_PCI_QUIRK(0x14f1, 0x0101, "Conexant Reference board",
    18521855                      CXT5051_LAPTOP),
     
    19081911}
    19091912
     1913/* Conexant 5066 specific */
     1914
     1915static hda_nid_t cxt5066_dac_nids[1] = { 0x10 };
     1916static hda_nid_t cxt5066_adc_nids[3] = { 0x14, 0x15, 0x16 };
     1917static hda_nid_t cxt5066_capsrc_nids[1] = { 0x17 };
     1918#define CXT5066_SPDIF_OUT       0x21
     1919
     1920static struct hda_channel_mode cxt5066_modes[1] = {
     1921        { 2, NULL },
     1922};
     1923
     1924static 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 */
     1958static 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 */
     1971static 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 */
     2009static 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 */
     2029static 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
     2042static 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
     2053static 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
     2059static 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
     2072static 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
     2093static 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
     2103static 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
     2112static 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
     2121static struct snd_kcontrol_new cxt5066_mixer_master[] = {
     2122        HDA_CODEC_VOLUME("Master Playback Volume", 0x10, 0x00, HDA_OUTPUT),
     2123        {0}
     2124};
     2125
     2126static 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
     2144static 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
     2167static 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
     2222static 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
     2283static 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 */
     2289static 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
     2300enum {
     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
     2307static 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
     2313static 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
     2321static 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}
    19102387
    19112388/*
     
    19192396        { .id = 0x14f15051, .name = "CX20561 (Hermosa)",
    19202397          .patch = patch_cxt5051 },
     2398        { .id = 0x14f15066, .name = "CX20582 (Pebble)",
     2399          .patch = patch_cxt5066 },
    19212400        {0} /* terminator */
    19222401};
     
    19252404MODULE_ALIAS("snd-hda-codec-id:14f15047");
    19262405MODULE_ALIAS("snd-hda-codec-id:14f15051");
     2406MODULE_ALIAS("snd-hda-codec-id:14f15066");
    19272407
    19282408MODULE_LICENSE("GPL");
  • GPL/trunk/alsa-kernel/pci/hda/patch_realtek.c

    r426 r464  
    191191        ALC272_DELL,
    192192        ALC272_DELL_ZM1,
     193        ALC272_SAMSUNG_NC10,
    193194        ALC662_AUTO,
    194195        ALC662_MODEL_LAST,
     
    206207        ALC885_MACPRO,
    207208        ALC885_MBP3,
     209        ALC885_MB5,
    208210        ALC885_IMAC24,
    209         ALC882_AUTO,
    210         ALC882_MODEL_LAST,
    211 };
    212 
    213 /* ALC883 models */
    214 enum {
    215211        ALC883_3ST_2ch_DIG,
    216212        ALC883_3ST_6ch_DIG,
     
    219215        ALC883_TARGA_DIG,
    220216        ALC883_TARGA_2ch_DIG,
     217        ALC883_TARGA_8ch_DIG,
    221218        ALC883_ACER,
    222219        ALC883_ACER_ASPIRE,
    223220        ALC888_ACER_ASPIRE_4930G,
     221        ALC888_ACER_ASPIRE_6530G,
     222        ALC888_ACER_ASPIRE_8930G,
     223        ALC888_ACER_ASPIRE_7730G,
    224224        ALC883_MEDION,
    225225        ALC883_MEDION_MD2,
     
    237237        ALC888_FUJITSU_XA3530,
    238238        ALC883_3ST_6ch_INTEL,
     239        ALC889A_INTEL,
     240        ALC889_INTEL,
    239241        ALC888_ASUS_M90V,
    240242        ALC888_ASUS_EEE1601,
     243        ALC889A_MB31,
    241244        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,
    251248};
    252249
    253250/* for GPIO Poll */
    254251#define GPIO_MASK       0x03
     252
     253/* extra amp-initialization sequence types */
     254enum {
     255        ALC_INIT_NONE,
     256        ALC_INIT_DEFAULT,
     257        ALC_INIT_GPIO1,
     258        ALC_INIT_GPIO2,
     259        ALC_INIT_GPIO3,
     260};
     261
     262struct 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)
    255269
    256270struct alc_spec {
     
    267281        unsigned int num_init_verbs;
    268282
    269         char *stream_name_analog;       /* analog PCM stream */
     283        char stream_name_analog[32];    /* analog PCM stream */
    270284        struct hda_pcm_stream *stream_analog_playback;
    271285        struct hda_pcm_stream *stream_analog_capture;
     
    273287        struct hda_pcm_stream *stream_analog_alt_capture;
    274288
    275         char *stream_name_digital;      /* digital PCM stream */
     289        char stream_name_digital[32];   /* digital PCM stream */
    276290        struct hda_pcm_stream *stream_digital_playback;
    277291        struct hda_pcm_stream *stream_digital_capture;
     
    291305        hda_nid_t *capsrc_nids;
    292306        hda_nid_t dig_in_nid;           /* digital-in NID; optional */
    293         int capture_style;              /* capture style (CAPT_*) */
    294307
    295308        /* capture source */
     
    297310        const struct hda_input_mux *input_mux;
    298311        unsigned int cur_mux[3];
     312        struct alc_mic_route ext_mic;
     313        struct alc_mic_route int_mic;
    299314
    300315        /* channel model */
     
    302317        int num_channel_mode;
    303318        int need_dac_fix;
     319        int const_channel_count;
     320        int ext_channel_count;
    304321
    305322        /* PCM information */
     
    311328        struct hda_input_mux private_imux[3];
    312329        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];
    313332
    314333        /* hooks */
     
    320339        unsigned int jack_present: 1;
    321340        unsigned int master_sw: 1;
     341        unsigned int auto_mic:1;
    322342
    323343        /* other flags */
    324344        unsigned int no_analog :1; /* digital I/O only */
     345        int init_amp;
    325346
    326347        /* for virtual master */
     
    356377        const struct hda_channel_mode *channel_mode;
    357378        int need_dac_fix;
     379        int const_channel_count;
    358380        unsigned int num_mux_defs;
    359381        const struct hda_input_mux *input_mux;
    360382        void (*unsol_event)(struct hda_codec *, unsigned int);
     383        void (*setup)(struct hda_codec *);
    361384        void (*init_hook)(struct hda_codec *);
    362385#ifdef CONFIG_SND_HDA_POWER_SAVE
     
    401424        hda_nid_t nid = spec->capsrc_nids ?
    402425                spec->capsrc_nids[adc_idx] : spec->adc_nids[adc_idx];
     426        unsigned int type;
    403427
    404428        mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx;
    405429        imux = &spec->input_mux[mux_idx];
    406430
    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) {
    409433                /* Matrix-mixer style (e.g. ALC882) */
    410434                unsigned int *cur_val = &spec->cur_mux[adc_idx];
     
    450474        return snd_hda_ch_mode_get(codec, ucontrol, spec->channel_mode,
    451475                                   spec->num_channel_mode,
    452                                    spec->multiout.max_channels);
     476                                   spec->ext_channel_count);
    453477}
    454478
     
    460484        int err = snd_hda_ch_mode_put(codec, ucontrol, spec->channel_mode,
    461485                                      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        }
    465492        return err;
    466493}
     
    544571        /* Find enumerated value for current pinctl setting */
    545572        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)
    547574                i++;
    548575        *valp = i <= alc_pin_mode_max(dir) ? i: alc_pin_mode_min(dir);
     
    777804                if (pincap & AC_PINCAP_VREF_80)
    778805                        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;
    779812        }
    780813        snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, val);
     
    821854 * set up from the preset table
    822855 */
    823 static void setup_preset(struct alc_spec *spec,
     856static void setup_preset(struct hda_codec *codec,
    824857                         const struct alc_config_preset *preset)
    825858{
     859        struct alc_spec *spec = codec->spec;
    826860        int i;
    827861
     
    836870        spec->num_channel_mode = preset->num_channel_mode;
    837871        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;
    840879
    841880        spec->multiout.num_dacs = preset->num_dacs;
     
    860899        spec->loopback.amplist = preset->loopbacks;
    861900#endif
     901
     902        if (preset->setup)
     903                preset->setup(codec);
    862904}
    863905
     
    916958}
    917959
    918 static void alc_sku_automute(struct hda_codec *codec)
     960static void alc_automute_pin(struct hda_codec *codec)
    919961{
    920962        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,
    928971                                     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
     983static 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
    935996static void alc_mic_automute(struct hda_codec *codec)
    936997{
    937998        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}
    9581041
    9591042/* unsolicited event for HP jack sensing */
     
    9641047        else
    9651048                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:
    9701054                alc_mic_automute(codec);
     1055                break;
     1056        }
    9711057}
    9721058
    9731059static void alc_inithook(struct hda_codec *codec)
    9741060{
    975         alc_sku_automute(codec);
     1061        alc_automute_pin(codec);
    9761062        alc_mic_automute(codec);
    9771063}
     
    9951081}
    9961082
    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:
     1083static 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
     1093static 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:
    10511099                snd_hda_sequence_write(codec, alc_gpio1_init_verbs);
    10521100                break;
    1053         case 3:
     1101        case ALC_INIT_GPIO2:
    10541102                snd_hda_sequence_write(codec, alc_gpio2_init_verbs);
    10551103                break;
    1056         case 7:
     1104        case ALC_INIT_GPIO3:
    10571105                snd_hda_sequence_write(codec, alc_gpio3_init_verbs);
    10581106                break;
    1059         case 5: /* set EAPD output high */
     1107        case ALC_INIT_DEFAULT:
    10601108                switch (codec->vendor_id) {
    10611109                case 0x10ec0260:
     
    11001148                case 0x10ec0887:
    11011149                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);
    11111151                        break;
    11121152                case 0x10ec0888:
    1113                         /*alc888_coef_init(codec);*/ /* called in alc_init() */
     1153                        alc888_coef_init(codec);
    11141154                        break;
    11151155                case 0x10ec0267:
     
    11261166                        break;
    11271167                }
    1128         default:
     1168                break;
     1169        }
     1170}
     1171
     1172static 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
     1196static 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 */
     1254static 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;
     1295do_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;
    11291318                break;
    11301319        }
     
    11341323         */
    11351324        if (!(ass & 0x8000))
    1136                 return;
     1325                return 1;
    11371326        /*
    11381327         * 10~8 : Jack location
     
    11421331         *              when the external headphone out jack is plugged"
    11431332         */
    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                 else
    1149                         return;
    1150         }
    1151 
    11521333        if (!spec->autocfg.hp_pins[0]) {
    11531334                tmp = (ass >> 11) & 0x3;        /* HP to chassis */
     
    11591340                        spec->autocfg.hp_pins[0] = portd;
    11601341                else
    1161                         return;
     1342                        return 1;
    11621343        }
    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
     1350static 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        }
    11781361}
    11791362
     
    13101493};
    13111494
    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;
     1495static 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;
    13231520        /* 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
     1530static 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
     1541static 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
     1553static void alc889_intel_init_hook(struct hda_codec *codec)
     1554{
     1555        alc889_coef_init(codec);
     1556        alc_automute_amp(codec);
     1557}
     1558
     1559static 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}
    13381568
    13391569/*
     
    13591589};
    13601590
     1591/*
     1592 * ALC888 Acer Aspire 6530G model
     1593 */
     1594
     1595static 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
     1618static 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
    13611667static struct hda_input_mux alc888_2_capture_sources[2] = {
    13621668        /* Front mic only available on one ADC */
     
    13761682                        { "Line", 0x2 },
    13771683                        { "CD", 0x4 },
     1684                },
     1685        }
     1686};
     1687
     1688static 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
     1711static 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 },
    13781739                },
    13791740        }
     
    14021763};
    14031764
    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);
     1765static 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
     1773static 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
     1783static 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;
    14201791}
    14211792
     
    23852756};
    23862757
    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 
    24022758/* auto-toggle front mic */
    24032759static void alc880_uniwill_mic_automute(struct hda_codec *codec)
     
    24122768}
    24132769
    2414 static void alc880_uniwill_automute(struct hda_codec *codec)
    2415 {
    2416         alc880_uniwill_hp_automute(codec);
     2770static 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
     2779static void alc880_uniwill_init_hook(struct hda_codec *codec)
     2780{
     2781        alc_automute_amp(codec);
    24172782        alc880_uniwill_mic_automute(codec);
    24182783}
     
    24252790         */
    24262791        switch (res >> 28) {
    2427         case ALC880_HP_EVENT:
    2428                 alc880_uniwill_hp_automute(codec);
    2429                 break;
    24302792        case ALC880_MIC_EVENT:
    24312793                alc880_uniwill_mic_automute(codec);
    24322794                break;
     2795        default:
     2796                alc_automute_amp_unsol_event(codec, res);
     2797                break;
    24332798        }
    24342799}
    24352800
    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);
     2801static 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;
    24452807}
    24462808
     
    24642826         * definition.  4bit tag is placed at 28 bit!
    24652827         */
    2466         if ((res >> 28) == ALC880_HP_EVENT)
    2467                 alc880_uniwill_p53_hp_automute(codec);
    24682828        if ((res >> 28) == ALC880_DCVOL_EVENT)
    24692829                alc880_uniwill_p53_dcvol_automute(codec);
     2830        else
     2831                alc_automute_amp_unsol_event(codec, res);
    24702832}
    24712833
     
    25372899#define alc880_gpio1_init_verbs alc_gpio1_init_verbs
    25382900#define alc880_gpio2_init_verbs alc_gpio2_init_verbs
     2901#define alc880_gpio3_init_verbs alc_gpio3_init_verbs
    25392902
    25402903/* Clevo m520g init */
     
    26993062        {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
    27003063        /* 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},
    27023065        {0}
    27033066};
    27043067
    27053068/* 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);
     3069static 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;
    27253075}
    27263076
     
    27963146        {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
    27973147        /* 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},
    27993149        {0}
    28003150};
    28013151
    28023152/* 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);
     3153static 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;
    28223159}
    28233160
     
    28663203static void alc880_medion_rim_automute(struct hda_codec *codec)
    28673204{
    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)
    28783209                snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 0);
    28793210        else
     
    28893220        if ((res >> 28) == ALC880_HP_EVENT)
    28903221                alc880_medion_rim_automute(codec);
     3222}
     3223
     3224static 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;
    28913230}
    28923231
     
    29193258
    29203259        alc_fix_pll(codec);
    2921         if (codec->vendor_id == 0x10ec0888)
    2922                 alc888_coef_init(codec);
     3260        alc_auto_init_amp(codec, spec->init_amp);
    29233261
    29243262        for (i = 0; i < spec->num_init_verbs; i++)
     
    31223460                goto skip_analog;
    31233461
     3462        snprintf(spec->stream_name_analog, sizeof(spec->stream_name_analog),
     3463                 "%s Analog", codec->chip_name);
    31243464        info->name = spec->stream_name_analog;
     3465       
    31253466        if (spec->stream_analog_playback) {
    31263467                if (snd_BUG_ON(!spec->multiout.dac_nids))
     
    31483489        /* SPDIF for stream index #1 */
    31493490        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);
    31503494                codec->num_pcms = 2;
    31513495                codec->slave_dig_outs = spec->multiout.slave_dig_outs;
     
    37504094                .input_mux = &alc880_f1734_capture_source,
    37514095                .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,
    37534098        },
    37544099        [ALC880_ASUS] = {
     
    38274172                .input_mux = &alc880_capture_source,
    38284173                .unsol_event = alc880_uniwill_unsol_event,
    3829                 .init_hook = alc880_uniwill_automute,
     4174                .setup = alc880_uniwill_setup,
     4175                .init_hook = alc880_uniwill_init_hook,
    38304176        },
    38314177        [ALC880_UNIWILL_P53] = {
     
    38394185                .input_mux = &alc880_capture_source,
    38404186                .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,
    38424189        },
    38434190        [ALC880_FUJITSU] = {
     
    38534200                .input_mux = &alc880_capture_source,
    38544201                .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,
    38564204        },
    38574205        [ALC880_CLEVO] = {
     
    38784226                .need_dac_fix = 1,
    38794227                .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,
    38824231#ifdef CONFIG_SND_HDA_POWER_SAVE
    38834232                .loopbacks = alc880_lg_loopbacks,
     
    38944243                .channel_mode = alc880_lg_lw_modes,
    38954244                .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,
    38984248        },
    38994249        [ALC880_MEDION_RIM] = {
     
    39094259                .input_mux = &alc880_medion_rim_capture_source,
    39104260                .unsol_event = alc880_medion_rim_unsol_event,
     4261                .setup = alc880_medion_rim_setup,
    39114262                .init_hook = alc880_medion_rim_automute,
    39124263        },
     
    39624313#define alc880_is_multi_pin(nid)        ((nid) >= 0x18)
    39634314#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)
    39664315#define alc880_idx_to_dac(nid)          ((nid) + 0x02)
    39674316#define alc880_dac_to_idx(nid)          ((nid) - 0x02)
     
    40514400                                return err;
    40524401                } 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);
    40544409                        err = add_control(spec, ALC_CTL_WIDGET_VOL, name,
    40554410                                          HDA_COMPOSE_AMP_VAL(nid, 3, 0,
     
    40574412                        if (err < 0)
    40584413                                return err;
    4059                         sprintf(name, "%s Playback Switch", chname[i]);
     4414                        sprintf(name, "%s Playback Switch", pfx);
    40604415                        err = add_control(spec, ALC_CTL_BIND_MUTE, name,
    40614416                                          HDA_COMPOSE_AMP_VAL(nid, 3, 2,
     
    41314486}
    41324487
     4488static 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
    41334494/* 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 {
     4495static 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;
    41374501        struct hda_input_mux *imux = &spec->private_imux[0];
    41384502        int i, err, idx;
    41394503
    41404504        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) {
    41484528                        imux->items[imux->num_items].label =
    41494529                                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;
    41524531                        imux->num_items++;
    41534532                }
    41544533        }
    41554534        return 0;
     4535}
     4536
     4537static 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);
    41564541}
    41574542
     
    41944579        int i;
    41954580
    4196         alc_subsystem_id(codec, 0x15, 0x1b, 0x14);
    41974581        for (i = 0; i < spec->autocfg.line_outs; i++) {
    41984582                hda_nid_t nid = spec->autocfg.line_out_pins[i];
     
    42224606        for (i = 0; i < AUTO_PIN_LAST; i++) {
    42234607                hda_nid_t nid = spec->autocfg.input_pins[i];
    4224                 if (alc880_is_input_pin(nid)) {
     4608                if (alc_is_input_pin(codec, nid)) {
    42254609                        alc_set_input_pin(codec, nid, i);
    42264610                        if (nid != ALC880_PIN_CD_NID &&
     
    42654649        if (err < 0)
    42664650                return err;
    4267         err = alc880_auto_create_analog_input_ctls(spec, &spec->autocfg);
     4651        err = alc880_auto_create_input_ctls(codec, &spec->autocfg);
    42684652        if (err < 0)
    42694653                return err;
     
    42994683        spec->input_mux = &spec->private_imux[0];
    43004684
     4685        alc_ssid_check(codec, 0x15, 0x1b, 0x14);
     4686
    43014687        return 1;
    43024688}
     
    43134699}
    43144700
    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 */
     4704static 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
     4734static void set_capture_mixer(struct hda_codec *codec)
     4735{
     4736        struct alc_spec *spec = codec->spec;
    43174737        static struct snd_kcontrol_new *caps[2][3] = {
    43184738                { alc_capture_mixer_nosrc1,
     
    43254745        if (spec->num_adc_nids > 0 && spec->num_adc_nids <= 3) {
    43264746                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)
    43284751                        mux = 1;
    43294752                else
     
    43564779                                                  alc880_cfg_tbl);
    43574780        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);
    43604783                board_config = ALC880_AUTO;
    43614784        }
     
    43824805
    43834806        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
    43874809        spec->stream_analog_playback = &alc880_pcm_analog_playback;
    43884810        spec->stream_analog_capture = &alc880_pcm_analog_capture;
    43894811        spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
    43904812
    4391         spec->stream_name_digital = "ALC880 Digital";
    43924813        spec->stream_digital_playback = &alc880_pcm_digital_playback;
    43934814        spec->stream_digital_capture = &alc880_pcm_digital_capture;
     
    43974818                unsigned int wcap = get_wcaps(codec, alc880_adc_nids[0]);
    43984819                /* get type */
    4399                 wcap = (wcap & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;
     4820                wcap = get_wcaps_type(wcap);
    44004821                if (wcap != AC_WID_AUD_IN) {
    44014822                        spec->adc_nids = alc880_adc_nids_alt;
     
    44064827                }
    44074828        }
    4408         set_capture_mixer(spec);
     4829        set_capture_mixer(codec);
    44094830        set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
    44104831
     
    55986019        nid = cfg->line_out_pins[0];
    55996020        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);
    56016029                if (err < 0)
    56026030                        return err;
     
    56216049
    56226050/* create playback/capture controls for input pins */
    5623 static int alc260_auto_create_analog_input_ctls(struct alc_spec *spec,
     6051static int alc260_auto_create_input_ctls(struct hda_codec *codec,
    56246052                                                const struct auto_pin_cfg *cfg)
    56256053{
    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);
    56566055}
    56576056
     
    56746073        hda_nid_t nid;
    56756074
    5676         alc_subsystem_id(codec, 0x10, 0x15, 0x0f);
    56776075        nid = spec->autocfg.line_out_pins[0];
    56786076        if (nid) {
     
    57686166        if (!spec->kctls.list)
    57696167                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);
    57716169        if (err < 0)
    57726170                return err;
     
    57836181        spec->num_mux_defs = 1;
    57846182        spec->input_mux = &spec->private_imux[0];
     6183
     6184        alc_ssid_check(codec, 0x10, 0x15, 0x0f);
    57856185
    57866186        return 1;
     
    60016401                                                  alc260_cfg_tbl);
    60026402        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);
    60056405                board_config = ALC260_AUTO;
    60066406        }
     
    60276427
    60286428        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
    60326431        spec->stream_analog_playback = &alc260_pcm_analog_playback;
    60336432        spec->stream_analog_capture = &alc260_pcm_analog_capture;
    60346433
    6035         spec->stream_name_digital = "ALC260 Digital";
    60366434        spec->stream_digital_playback = &alc260_pcm_digital_playback;
    60376435        spec->stream_digital_capture = &alc260_pcm_digital_capture;
     
    60406438                /* check whether NID 0x04 is valid */
    60416439                unsigned int wcap = get_wcaps(codec, 0x04);
    6042                 wcap = (wcap & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;
     6440                wcap = get_wcaps_type(wcap);
    60436441                /* get type */
    60446442                if (wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
     
    60506448                }
    60516449        }
    6052         set_capture_mixer(spec);
     6450        set_capture_mixer(codec);
    60536451        set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
    60546452
     
    60696467
    60706468/*
    6071  * ALC882 support
     6469 * ALC882/883/885/888/889 support
    60726470 *
    60736471 * ALC882 is almost identical with ALC880 but has cleaner and more flexible
     
    60816479#define ALC882_DIGOUT_NID       0x06
    60826480#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
    60836485
    60846486static struct hda_channel_mode alc882_ch_modes[1] = {
     
    60866488};
    60876489
     6490/* DACs */
    60886491static hda_nid_t alc882_dac_nids[4] = {
    60896492        /* front, rear, clfe, rear_surr */
    60906493        0x02, 0x03, 0x04, 0x05
    60916494};
    6092 
    6093 /* identical with ALC880 */
     6495#define alc883_dac_nids         alc882_dac_nids
     6496
     6497/* ADCs */
    60946498#define alc882_adc_nids         alc880_adc_nids
    60956499#define alc882_adc_nids_alt     alc880_adc_nids_alt
     6500#define alc883_adc_nids         alc882_adc_nids_alt
     6501static hda_nid_t alc883_adc_nids_alt[1] = { 0x08 };
     6502static hda_nid_t alc883_adc_nids_rev[2] = { 0x09, 0x08 };
     6503#define alc889_adc_nids         alc880_adc_nids
    60966504
    60976505static hda_nid_t alc882_capsrc_nids[3] = { 0x24, 0x23, 0x22 };
    60986506static hda_nid_t alc882_capsrc_nids_alt[2] = { 0x23, 0x22 };
     6507#define alc883_capsrc_nids      alc882_capsrc_nids_alt
     6508static hda_nid_t alc883_capsrc_nids_rev[2] = { 0x22, 0x23 };
     6509#define alc889_capsrc_nids      alc882_capsrc_nids
    60996510
    61006511/* input MUX */
     
    61106521        },
    61116522};
     6523
     6524#define alc883_capture_source   alc882_capture_source
     6525
     6526static 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
     6535static 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
     6544static 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
     6554static struct hda_input_mux alc883_lenovo_101e_capture_source = {
     6555        .num_items = 2,
     6556        .items = {
     6557                { "Mic", 0x1 },
     6558                { "Line", 0x2 },
     6559        },
     6560};
     6561
     6562static 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
     6572static 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
     6580static 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
     6589static struct hda_input_mux alc883_asus_eee1601_capture_source = {
     6590        .num_items = 2,
     6591        .items = {
     6592                { "Mic", 0x0 },
     6593                { "Line", 0x2 },
     6594        },
     6595};
     6596
     6597static 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 */
     6611static struct hda_channel_mode alc883_3ST_2ch_modes[1] = {
     6612        { 2, NULL }
     6613};
     6614
    61126615/*
    61136616 * 2ch mode
     
    61186621        { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
    61196622        { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
     6623        {0} /* end */
     6624};
     6625
     6626/*
     6627 * 4ch mode
     6628 */
     6629static 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 },
    61206635        {0} /* end */
    61216636};
     
    61346649};
    61356650
    6136 static struct hda_channel_mode alc882_3ST_6ch_modes[2] = {
     6651static struct hda_channel_mode alc882_3ST_6ch_modes[3] = {
    61376652        { 2, alc882_3ST_ch2_init },
     6653        { 4, alc882_3ST_ch4_init },
    61386654        { 6, alc882_3ST_ch6_init },
    61396655};
     6656
     6657#define alc883_3ST_6ch_modes    alc882_3ST_6ch_modes
    61406658
    61416659/*
     
    61676685
    61686686/*
    6169  * macbook pro ALC885 can switch LineIn to LineOut without loosing Mic
     6687 * macbook pro ALC885 can switch LineIn to LineOut without losing Mic
    61706688 */
    61716689
     
    61956713        { 2, alc885_mbp_ch2_init },
    61966714        { 6, alc885_mbp_ch6_init },
     6715};
     6716
     6717/*
     6718 * 2ch
     6719 * Speakers/Woofer/HP = Front
     6720 * LineIn = Input
     6721 */
     6722static 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 */
     6734static 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
     6741static 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 */
     6750static 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 */
     6763static 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 */
     6777static 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 */
     6792static 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
     6805static 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 */
     6816static 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 */
     6827static 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 */
     6839static 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
     6849static 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 */
     6858static 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 */
     6871static 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 */
     6884static 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
     6895static 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 */
     6904static 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 */
     6915static 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
     6923static struct hda_channel_mode alc883_sixstack_modes[2] = {
     6924        { 6, alc883_sixstack_ch6_init },
     6925        { 8, alc883_sixstack_ch8_init },
    61976926};
    61986927
     
    62396968        {0} /* end */
    62406969};
     6970
     6971static 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
    62416989static struct snd_kcontrol_new alc882_w2jc_mixer[] = {
    62426990        HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
     
    63147062};
    63157063
    6316 static struct hda_verb alc882_init_verbs[] = {
     7064static struct hda_verb alc882_base_init_verbs[] = {
    63177065        /* Front mixer: unmute input/output amp left and right (volume = 0) */
    63187066        {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
     
    63317079        {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
    63327080        {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)},
    63337088
    63347089        /* Front Pin: output 0 (0x0c) */
     
    63667121        /* FIXME: use matrix-type input source selection */
    63677122        /* 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)},
    63737123        /* Input mixer2 */
    63747124        {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
     
    63817131        {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
    63827132        {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},
    63867133        /* ADC2: mute amp left and right */
    63877134        {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
     
    63947141};
    63957142
     7143static 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
    63967155static struct hda_verb alc882_eapd_verbs[] = {
    63977156        /* change to EAPD mode */
     
    64007159        {0}
    64017160};
     7161
     7162static 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
     7168static 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
     7174static 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
     7248static 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 */
     7257static 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
    64027265
    64037266/* Mac Pro test */
     
    64637326        {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
    64647327
     7328        {0}
     7329};
     7330
     7331/* Macbook 5,1 */
     7332static 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)},
    64657377        {0}
    64667378};
     
    65557467
    65567468/* 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);
     7469static 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
     7478static 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;
    65967484}
    65977485
     
    66097497
    66107498        {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},
    66147499        {0} /* end */
    66157500};
     
    66187503static void alc882_targa_automute(struct hda_codec *codec)
    66197504{
    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);
    66267507        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
     7511static 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;
    66287517}
    66297518
    66307519static void alc882_targa_unsol_event(struct hda_codec *codec, unsigned int res)
    66317520{
    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)
    66367522                alc882_targa_automute(codec);
    6637         }
    66387523}
    66397524
     
    67177602{
    67187603        alc885_macpro_init_hook(codec);
    6719         alc885_imac24_automute(codec);
     7604        alc_automute_amp(codec);
    67207605}
    67217606
     
    67237608 * generic initialization of ADC, input mixers and output mixers
    67247609 */
    6725 static struct hda_verb alc882_auto_init_verbs[] = {
     7610static struct hda_verb alc883_auto_init_verbs[] = {
    67267611        /*
    67277612         * Unmute ADC0-2 and set the default input to mic-in
    67287613         */
    6729         {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
    6730         {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
    67317614        {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
    67327615        {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
     
    67697652        /* FIXME: use matrix-type input source selection */
    67707653        /* 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))},
    67767654        /* Input mixer2 */
    67777655        {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
     
    67887666};
    67897667
     7668/* 2ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:front) */
     7669static 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) */
     7678static 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) */
     7687static 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) */
     7696static 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
     7704static 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
     7711static 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
     7720static 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
     7737static 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
     7751static 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
     7765static 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
     7782static 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
     7805static 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
     7829static 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
     7853static 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
     7876static 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
     7896static 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
     7911static 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
     7923static 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
     7936static 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
     7949static 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
     7961static 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
     7976static 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
     8001static 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
     8027static 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
     8037static 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
     8046static 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
     8055static 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
     8067static 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
     8082static 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 */
     8094static 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/*
     8105static 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
     8117static 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
     8132static 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
     8147static 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
     8161static 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
     8190static 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
     8197static 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
     8205static 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
     8214static 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
     8227static 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
     8239static struct hda_verb alc888_6st_dell_verbs[] = {
     8240        {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
     8241        {0}
     8242};
     8243
     8244static 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
     8255static 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
     8265static 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 */
     8276static 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 */
     8287static 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 */
     8299static 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
     8309static 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 */
     8316static 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 */
     8329static 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
     8339static 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
     8348static 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 */
     8359static 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
     8371static 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
     8381static 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
     8389static 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
     8395static 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 */
     8409static 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
     8417static 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
     8425static 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
     8437static 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
     8451static 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 */
     8461static 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
     8470static 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
     8488static 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
     8495static 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
     8506static 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
     8518static 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
     8527static 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
     8537static 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
     8552static 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
     8565static 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
     8574static 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 */
     8588static 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
     8604static 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
    67908611#ifdef CONFIG_SND_HDA_POWER_SAVE
    67918612#define alc882_loopbacks        alc880_loopbacks
    67928613#endif
    67938614
    6794 /* pcm configuration: identiacal with ALC880 */
     8615/* pcm configuration: identical with ALC880 */
    67958616#define alc882_pcm_analog_playback      alc880_pcm_analog_playback
    67968617#define alc882_pcm_analog_capture       alc880_pcm_analog_capture
    67978618#define alc882_pcm_digital_playback     alc880_pcm_digital_playback
    67988619#define alc882_pcm_digital_capture      alc880_pcm_digital_capture
     8620
     8621static hda_nid_t alc883_slave_dig_outs[] = {
     8622        ALC1200_DIGOUT_NID, 0,
     8623};
     8624
     8625static hda_nid_t alc1200_slave_dig_outs[] = {
     8626        ALC883_DIGOUT_NID, 0,
     8627};
    67998628
    68008629/*
     
    68108639        [ALC882_ASUS_A7M]       = "asus-a7m",
    68118640        [ALC885_MACPRO]         = "macpro",
     8641        [ALC885_MB5]            = "mb5",
    68128642        [ALC885_MBP3]           = "mbp3",
    68138643        [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",
    68148677        [ALC882_AUTO]           = "auto",
    68158678};
     
    68178680static struct snd_pci_quirk alc882_cfg_tbl[] = {
    68188681        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
    68198719        SND_PCI_QUIRK(0x1043, 0x060d, "Asus A7J", ALC882_ASUS_A7J),
    68208720        SND_PCI_QUIRK(0x1043, 0x1243, "Asus A7J", ALC882_ASUS_A7J),
    68218721        SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_ASUS_A7M),
     8722        SND_PCI_QUIRK(0x1043, 0x1873, "Asus M90V", ALC888_ASUS_M90V),
    68228723        SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_W2JC),
    68238724        SND_PCI_QUIRK(0x1043, 0x817f, "Asus P5LD2", ALC882_6ST_DIG),
    68248725        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),
    68258733        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),
    68268739        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),
    68278744        SND_PCI_QUIRK(0x1462, 0x28fb, "Targa T8", ALC882_TARGA), /* MSI-1049 T8  */
     8745        SND_PCI_QUIRK(0x1462, 0x2fb3, "MSI", ALC883_TARGA_2ch_DIG),
    68288746        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
    68308800        {0}
     8801};
     8802
     8803/* codec SSID table for Intel Mac */
     8804static 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 */
    68318821};
    68328822
     
    68348824        [ALC882_3ST_DIG] = {
    68358825                .mixers = { alc882_base_mixer },
    6836                 .init_verbs = { alc882_init_verbs },
     8826                .init_verbs = { alc882_base_init_verbs,
     8827                                alc882_adc1_init_verbs },
    68378828                .num_dacs = ARRAY_SIZE(alc882_dac_nids),
    68388829                .dac_nids = alc882_dac_nids,
     
    68468837        [ALC882_6ST_DIG] = {
    68478838                .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 },
    68498841                .num_dacs = ARRAY_SIZE(alc882_dac_nids),
    68508842                .dac_nids = alc882_dac_nids,
     
    68578849        [ALC882_ARIMA] = {
    68588850                .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 },
    68608853                .num_dacs = ARRAY_SIZE(alc882_dac_nids),
    68618854                .dac_nids = alc882_dac_nids,
     
    68668859        [ALC882_W2JC] = {
    68678860                .mixers = { alc882_w2jc_mixer, alc882_chmode_mixer },
    6868                 .init_verbs = { alc882_init_verbs, alc882_eapd_verbs,
    6869                                 alc880_gpio1_init_verbs },
     8861                .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
     8862                                alc882_eapd_verbs, alc880_gpio1_init_verbs },
    68708863                .num_dacs = ARRAY_SIZE(alc882_dac_nids),
    68718864                .dac_nids = alc882_dac_nids,
     
    68878880                .dig_out_nid = ALC882_DIGOUT_NID,
    68888881                .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,
    68918897        },
    68928898        [ALC885_MACPRO] = {
     
    69128918                .channel_mode = alc882_ch_modes,
    69138919                .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,
    69158922                .init_hook = alc885_imac24_init_hook,
    69168923        },
    69178924        [ALC882_TARGA] = {
    69188925                .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},
    69208928                .num_dacs = ARRAY_SIZE(alc882_dac_nids),
    69218929                .dac_nids = alc882_dac_nids,
     
    69298937                .input_mux = &alc882_capture_source,
    69308938                .unsol_event = alc882_targa_unsol_event,
     8939                .setup = alc882_targa_setup,
    69318940                .init_hook = alc882_targa_automute,
    69328941        },
    69338942        [ALC882_ASUS_A7J] = {
    69348943                .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},
    69368946                .num_dacs = ARRAY_SIZE(alc882_dac_nids),
    69378947                .dac_nids = alc882_dac_nids,
     
    69478957        [ALC882_ASUS_A7M] = {
    69488958                .mixers = { alc882_asus_a7m_mixer, alc882_chmode_mixer },
    6949                 .init_verbs = { alc882_init_verbs, alc882_eapd_verbs,
    6950                                 alc880_gpio1_init_verbs,
     8959                .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
     8960                                alc882_eapd_verbs, alc880_gpio1_init_verbs,
    69518961                                alc882_asus_a7m_verbs },
    69528962                .num_dacs = ARRAY_SIZE(alc882_dac_nids),
     
    69588968                .input_mux = &alc882_capture_source,
    69598969        },
     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        },
    69609481};
    69619482
     
    69879508 * BIOS auto configuration
    69889509 */
     9510static 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
    69899516static void alc882_auto_set_output_and_unmute(struct hda_codec *codec,
    69909517                                              hda_nid_t nid, int pin_type,
     
    70099536        int i;
    70109537
    7011         alc_subsystem_id(codec, 0x15, 0x1b, 0x14);
    70129538        for (i = 0; i <= HDA_SIDE; i++) {
    70139539                hda_nid_t nid = spec->autocfg.line_out_pins[i];
     
    70339559}
    70349560
    7035 #define alc882_is_input_pin(nid)        alc880_is_input_pin(nid)
    7036 #define ALC882_PIN_CD_NID               ALC880_PIN_CD_NID
    7037 
    70389561static void alc882_auto_init_analog_input(struct hda_codec *codec)
    70399562{
     
    70459568                if (!nid)
    70469569                        continue;
    7047                 alc_set_input_pin(codec, nid, AUTO_PIN_FRONT_MIC /*i*/);
     9570                alc_set_input_pin(codec, nid, i);
    70489571                if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)
    70499572                        snd_hda_codec_write(codec, nid, 0,
     
    71319654{
    71329655        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);
    71359661        if (err < 0)
    71369662                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);
    71399719
    71409720        err = alc_auto_add_mic_boost(codec);
    71419721        if (err < 0)
    71429722                return err;
    7143 
    7144         /* hack - override the init verbs */
    7145         spec->init_verbs[0] = alc882_auto_init_verbs;
    71469723
    71479724        return 1; /* config found */
     
    71609737}
    71619738
    7162 static int patch_alc883(struct hda_codec *codec); /* called in patch_alc882() */
    7163 
    71649739static int patch_alc882(struct hda_codec *codec)
    71659740{
     
    71739748        codec->spec = spec;
    71749749
     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
    71759760        board_config = snd_hda_check_board_config(codec, ALC882_MODEL_LAST,
    71769761                                                  alc882_models,
    71779762                                                  alc882_cfg_tbl);
    71789763
     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
    71799768        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;
    72099772        }
    72109773
     
    72329795
    72339796        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]);
    72439798
    72449799        spec->stream_analog_playback = &alc882_pcm_analog_playback;
     
    72519806        spec->stream_digital_capture = &alc882_pcm_digital_capture;
    72529807
    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
    72549811        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++;
    72679828                }
     9829                spec->adc_nids = spec->private_adc_nids;
     9830                spec->capsrc_nids = spec->private_capsrc_nids;
    72689831        }
    7269         set_capture_mixer(spec);
     9832
     9833        set_capture_mixer(codec);
    72709834        set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
    72719835
     
    72849848}
    72859849
    7286 /*
    7287  * ALC883 support
    7288  *
    7289  * ALC883 is almost identical with ALC880 but has cleaner and more flexible
    7290  * 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 possible
    7292  * 6-channel independent captures.
    7293  *
    7294  * In addition, an independent DAC for the multi-playback (not used in this
    7295  * driver yet).
    7296  */
    7297 #define ALC883_DIGOUT_NID       0x06
    7298 #define ALC883_DIGIN_NID        0x0a
    7299 
    7300 #define ALC1200_DIGOUT_NID      0x10
    7301 
    7302 static hda_nid_t alc883_dac_nids[4] = {
    7303         /* front, rear, clfe, rear_surr */
    7304         0x02, 0x03, 0x04, 0x05
    7305 };
    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, 0x08
    7320 };
    7321 
    7322 #define alc889_adc_nids         alc880_adc_nids
    7323 
    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_nids
    7329 
    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 mode
    7398  */
    7399 static struct hda_channel_mode alc883_3ST_2ch_modes[1] = {
    7400         { 2, NULL }
    7401 };
    7402 
    7403 /*
    7404  * 2ch mode
    7405  */
    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 mode
    7416  */
    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 mode
    7428  */
    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 mode
    7447  */
    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 mode
    7458  */
    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 mode
    7470  */
    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 mode
    7489  */
    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 mode
    7500  */
    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=0x17
    7522  *                 Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
    7523  */
    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                 0
    7800         },
    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                 0
    7809         },
    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 mode
    8126  */
    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 mode
    8137  */
    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 mode
    8149  */
    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 mixers
    8475  */
    8476 static struct hda_verb alc883_auto_init_verbs[] = {
    8477         /*
    8478          * Unmute ADC0-2 and set the default input to mic-in
    8479          */
    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-loopback
    8486          * mixer widget
    8487          * Note: PASD motherboards uses the Line In 2 as the input for
    8488          * 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_SAVE
    8636 #define alc883_loopbacks        alc880_loopbacks
    8637 #endif
    8638 
    8639 /* pcm configuration: identiacal with ALC880 */
    8640 #define alc883_pcm_analog_playback      alc880_pcm_analog_playback
    8641 #define alc883_pcm_analog_capture       alc880_pcm_analog_capture
    8642 #define alc883_pcm_analog_alt_capture   alc880_pcm_analog_alt_capture
    8643 #define alc883_pcm_digital_playback     alc880_pcm_digital_playback
    8644 #define alc883_pcm_digital_capture      alc880_pcm_digital_capture
    8645 
    8646 /*
    8647  * configuration and preset
    8648  */
    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 speaker
    8864                  * and the headphone jack.  Turn this on and rely on the
    8865                  * standard mute methods whenever the user wants to turn
    8866                  * 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 configuration
    9129  */
    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         else
    9142                 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_NID
    9178 
    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_src
    9198 
    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 0x18
    9223                  */
    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_INFO
    9284                                "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-style
    9326                                                         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_SAVE
    9359         if (!spec->loopback.amplist)
    9360                 spec->loopback.amplist = alc883_loopbacks;
    9361 #endif
    9362         codec->proc_widget_hook = print_realtek_coef;
    9363 
    9364         return 0;
    9365 }
    93669850
    93679851/*
     
    94089892};
    94099893
    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 
    94289894/* update HP, line and mono-out pins according to the master switch */
    94299895static void alc262_hp_master_update(struct hda_codec *codec)
     
    94819947}
    94829948
    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
    94919950
    94929951static int alc262_hp_master_sw_put(struct snd_kcontrol *kcontrol,
     
    95049963}
    95059964
     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
    95069974static 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,
    95149976        HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
    95159977        HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
     
    95359997
    95369998static 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,
    954410000        HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
    954510001        HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
     
    956810024
    956910025/* 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)
     10026static void alc262_hp_t5735_setup(struct hda_codec *codec)
    957110027{
    957210028        struct alc_spec *spec = codec->spec;
    957310029
    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 */
    959610032}
    959710033
     
    964610082};
    964710083
    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 */
     10085static 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
     10110static int alc262_hippo_master_sw_put(struct snd_kcontrol *kcontrol,
     10111                                      struct snd_ctl_elem_value *ucontrol)
    965110112{
    965210113        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,              \
    967410131        }
    9675         return change;
    9676 }
     10132
     10133static 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
     10150static 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 */
     10167static 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
     10181static 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
     10188static 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
     10196static 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
    967710204
    967810205static struct snd_kcontrol_new alc262_sony_mixer[] = {
    967910206        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,
    968810208        HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
    968910209        HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
     
    969410214
    969510215static struct snd_kcontrol_new alc262_benq_t31_mixer[] = {
    9696         HDA_CODEC_VOLUME("Front Playback 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,
    969810218        HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
    969910219        HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
     
    973610256
    973710257/* 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 }
     10258static 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
    976610266
    976710267#define alc262_capture_mixer            alc882_capture_mixer
     
    985310353};
    985410354
    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 
    986110355static struct hda_verb alc262_hippo1_unsol_verbs[] = {
    986210356        {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
     
    987710371        {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
    987810372        {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         },
    988710373};
    988810374
     
    990810394};
    990910395
    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)
     10396static void alc262_toshiba_s06_setup(struct hda_codec *codec)
    995410397{
    995510398        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;
    1001310407}
    1001410408
     
    1019910593}
    1020010594
     10595static 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
    1020110607/* bind hp and internal speaker mute (with plug check) */
    1020210608static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol,
     
    1020710613        int change;
    1020810614
    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);
    1021610617        if (change)
    1021710618                alc262_fujitsu_automute(codec, 0);
     
    1024810649        int change;
    1024910650
    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);
    1025410652        if (change)
    1025510653                alc262_lenovo_3000_automute(codec, 0);
     
    1028010678static struct snd_kcontrol_new alc262_toshiba_rx1_mixer[] = {
    1028110679        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,
    1029010681        HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
    1029110682        HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
     
    1043110822};
    1043210823
     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 */
     10828static 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
     10838static 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
     10859static 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
    1043310875/* add playback controls from the parsed DAC table */
    1043410876static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec,
    1043510877                                             const struct auto_pin_cfg *cfg)
    1043610878{
    10437         hda_nid_t nid;
     10879        const char *pfx;
     10880        int vbits;
    1043810881        int err;
    1043910882
     
    1044210885        spec->multiout.dac_nids[0] = 2;
    1044310886
    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;
    1050710924        return 0;
    1050810925}
    1050910926
    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
    1051310929
    1051410930/*
     
    1063411050        {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
    1063511051
    10636         {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 },
     11052        {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
    1063711053        {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
    1063811054        {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
    10639         {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 },
     11055        {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
    1064011056        {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
    1064111057        {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
     
    1064311059
    1064411060        /* 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 */
    1064711063        {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))},
    1065111072        /* Input mixer2 */
    1065211073        {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))},
    1065611082        /* Input mixer3 */
    1065711083        {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))},
    1066111092
    1066211093        {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
     
    1078311214#endif
    1078411215
    10785 /* pcm configuration: identiacal with ALC880 */
     11216/* pcm configuration: identical with ALC880 */
    1078611217#define alc262_pcm_analog_playback      alc880_pcm_analog_playback
    1078711218#define alc262_pcm_analog_capture       alc880_pcm_analog_capture
     
    1081311244        if (err < 0)
    1081411245                return err;
    10815         err = alc262_auto_create_analog_input_ctls(spec, &spec->autocfg);
     11246        err = alc262_auto_create_input_ctls(codec, &spec->autocfg);
    1081611247        if (err < 0)
    1081711248                return err;
     
    1083711268        if (err < 0)
    1083811269                return err;
     11270
     11271        alc_ssid_check(codec, 0x15, 0x14, 0x1b);
    1083911272
    1084011273        return 1;
     
    1091011343        SND_PCI_QUIRK(0x104d, 0x820f, "Sony ASSAMD", ALC262_SONY_ASSAMD),
    1091111344        SND_PCI_QUIRK(0x104d, 0x9016, "Sony VAIO", ALC262_AUTO), /* dig-only */
     11345        SND_PCI_QUIRK(0x104d, 0x9025, "Sony VAIO Z21MN", ALC262_TOSHIBA_S06),
    1091211346        SND_PCI_QUIRK_MASK(0x104d, 0xff00, 0x9000, "Sony VAIO",
    1091311347                           ALC262_SONY_ASSAMD),
     
    1094011374        },
    1094111375        [ALC262_HIPPO] = {
    10942                 .mixers = { alc262_base_mixer },
    10943                 .init_verbs = { alc262_init_verbs, alc262_hippo_unsol_verbs},
     11376                .mixers = { alc262_hippo_mixer },
     11377                .init_verbs = { alc262_init_verbs, alc_hp15_unsol_verbs},
    1094411378                .num_dacs = ARRAY_SIZE(alc262_dac_nids),
    1094511379                .dac_nids = alc262_dac_nids,
     
    1095011384                .input_mux = &alc262_capture_source,
    1095111385                .unsol_event = alc262_hippo_unsol_event,
     11386                .setup = alc262_hippo_setup,
    1095211387                .init_hook = alc262_hippo_automute,
    1095311388        },
     
    1096211397                .channel_mode = alc262_modes,
    1096311398                .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,
    1096611402        },
    1096711403        [ALC262_FUJITSU] = {
     
    1102511461                .channel_mode = alc262_modes,
    1102611462                .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,
    1102911466        },
    1103011467        [ALC262_HP_RP5700] = {
     
    1105711494                .input_mux = &alc262_capture_source,
    1105811495                .unsol_event = alc262_hippo_unsol_event,
     11496                .setup = alc262_hippo_setup,
    1105911497                .init_hook = alc262_hippo_automute,
    1106011498        },
    1106111499        [ALC262_BENQ_T31] = {
    1106211500                .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 },
    1106411503                .num_dacs = ARRAY_SIZE(alc262_dac_nids),
    1106511504                .dac_nids = alc262_dac_nids,
     
    1106911508                .input_mux = &alc262_capture_source,
    1107011509                .unsol_event = alc262_hippo_unsol_event,
     11510                .setup = alc262_hippo_setup,
    1107111511                .init_hook = alc262_hippo_automute,
    1107211512        },
     
    1111711557                .dac_nids = alc262_dac_nids,
    1111811558                .adc_nids = alc262_dmic_adc_nids, /* ADC0 */
     11559                .num_adc_nids = 1, /* single ADC */
    1111911560                .dig_out_nid = ALC262_DIGOUT_NID,
    1112011561                .num_channel_mode = ARRAY_SIZE(alc262_modes),
    1112111562                .channel_mode = alc262_modes,
    11122                 .input_mux = &alc262_dmic_capture_source,
    11123                 .unsol_event = alc262_toshiba_s06_unsol_event,
    11124                 .init_hook = alc262_toshiba_s06_init_hook,
     11563                .unsol_event = alc_sku_unsol_event,
     11564                .setup = alc262_toshiba_s06_setup,
     11565                .init_hook = alc_inithook,
    1112511566        },
    1112611567        [ALC262_TOSHIBA_RX1] = {
     
    1113411575                .input_mux = &alc262_capture_source,
    1113511576                .unsol_event = alc262_hippo_unsol_event,
     11577                .setup = alc262_hippo_setup,
    1113611578                .init_hook = alc262_hippo_automute,
    1113711579        },
     
    1114611588                .channel_mode = alc262_modes,
    1114711589                .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,
    1115011593        },
    1115111594};
     
    1118211625
    1118311626        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);
    1118611629                board_config = ALC262_AUTO;
    1118711630        }
     
    1121011653
    1121111654        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
    1121511657        spec->stream_analog_playback = &alc262_pcm_analog_playback;
    1121611658        spec->stream_analog_capture = &alc262_pcm_analog_capture;
    1121711659
    11218         spec->stream_name_digital = "ALC262 Digital";
    1121911660        spec->stream_digital_playback = &alc262_pcm_digital_playback;
    1122011661        spec->stream_digital_capture = &alc262_pcm_digital_capture;
    1122111662
    11222         spec->capture_style = CAPT_MIX;
    1122311663        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;
    1123311675                } 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                        }
    1123711693                }
    1123811694        }
    1123911695        if (!spec->cap_mixer && !spec->no_analog)
    11240                 set_capture_mixer(spec);
     11696                set_capture_mixer(codec);
    1124111697        if (!spec->no_analog)
    1124211698                set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
     
    1129111747};
    1129211748
     11749static 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
    1129311760/* bind Beep switches of both NID 0x0f and 0x10 */
    1129411761static struct hda_bind_ctls alc268_bind_beep_sw = {
     
    1131411781
    1131511782/* Toshiba specific */
    11316 #define alc268_toshiba_automute alc262_hippo_automute
    11317 
    1131811783static struct hda_verb alc268_toshiba_verbs[] = {
    1131911784        {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
    1132011785        {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         },
    1132911786};
    1133011787
     
    1137011827        int change;
    1137111828
    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);
    1137811830        if (change)
    1137911831                alc268_acer_automute(codec, 0);
     
    1145111903
    1145211904/* 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
    1146011908
    1146111909static void alc268_acer_unsol_event(struct hda_codec *codec,
     
    1148711935}
    1148811936
    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 
    1150011937static void alc268_acer_lc_unsol_event(struct hda_codec *codec,
    1150111938                                    unsigned int res)
    1150211939{
    11503         if ((res >> 26) == ALC880_HP_EVENT)
     11940        switch (res >> 26) {
     11941        case ALC880_HP_EVENT:
    1150411942                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
     11950static 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;
    1150711958}
    1150811959
     
    1151011961{
    1151111962        alc268_aspire_one_speaker_automute(codec);
    11512         alc268_acer_mic_automute(codec);
     11963        alc_mic_automute(codec);
    1151311964}
    1151411965
     
    1152811979        {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
    1152911980        {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},
    1153011982        {0}
    1153111983};
    1153211984
    1153311985/* 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
     11986static 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}
    1155711998
    1155811999static struct snd_kcontrol_new alc267_quanta_il1_mixer[] = {
     
    1157412015};
    1157512016
    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         }
     12017static 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;
    1161412027}
    1161512028
     
    1169112104};
    1169212105
     12106static 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
    1169312112static struct snd_kcontrol_new alc268_capture_alt_mixer[] = {
    1169412113        HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
    1169512114        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),
    1170812116        {0} /* end */
    1170912117};
     
    1171412122        HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x24, 0x0, HDA_OUTPUT),
    1171512123        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),
    1172812125        {0} /* end */
    1172912126};
     
    1181212209{
    1181312210        char name[32];
     12211        hda_nid_t dac;
    1181412212        int err;
    1181512213
    1181612214        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) {
    1181812228                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,
    1182012230                                                      HDA_OUTPUT));
    1182112231                if (err < 0)
    1182212232                        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
    1183112236        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,
    1183312239                          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));
    1183412243        if (err < 0)
    1183512244                return err;
     
    1184412253        int err;
    1184512254
    11846         spec->multiout.num_dacs = 2;    /* only use one dac */
    1184712255        spec->multiout.dac_nids = spec->private_dac_nids;
    11848         spec->multiout.dac_nids[0] = 2;
    11849         spec->multiout.dac_nids[1] = 3;
    1185012256
    1185112257        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        }
    1185412268
    1185512269        nid = cfg->speaker_pins[0];
     
    1186012274                if (err < 0)
    1186112275                        return err;
     12276        } else {
     12277                err = alc268_new_analog_output(spec, nid, "Speaker", 0);
     12278                if (err < 0)
     12279                        return err;
    1186212280        }
    1186312281        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        }
    1186612287
    1186712288        nid = cfg->line_out_pins[1] | cfg->line_out_pins[2];
     
    1186912290                err = add_control(spec, ALC_CTL_WIDGET_MUTE,
    1187012291                                  "Mono Playback Switch",
    11871                                   HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_INPUT));
     12292                                  HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT));
    1187212293                if (err < 0)
    1187312294                        return err;
     
    1187712298
    1187812299/* create playback/capture controls for input pins */
    11879 static int alc268_auto_create_analog_input_ctls(struct alc_spec *spec,
     12300static int alc268_auto_create_input_ctls(struct hda_codec *codec,
    1188012301                                                const struct auto_pin_cfg *cfg)
    1188112302{
    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);
    1191112304}
    1191212305
     
    1195512348}
    1195612349
    11957 /* pcm configuration: identiacal with ALC880 */
     12350/* pcm configuration: identical with ALC880 */
    1195812351#define alc268_pcm_analog_playback      alc880_pcm_analog_playback
    1195912352#define alc268_pcm_analog_capture       alc880_pcm_analog_capture
     
    1198512378        if (err < 0)
    1198612379                return err;
    11987         err = alc268_auto_create_analog_input_ctls(spec, &spec->autocfg);
     12380        err = alc268_auto_create_input_ctls(codec, &spec->autocfg);
    1198812381        if (err < 0)
    1198912382                return err;
     
    1200412397
    1200512398        add_verb(spec, alc268_volume_init_verbs);
    12006         spec->num_mux_defs = 1;
     12399        spec->num_mux_defs = 2;
    1200712400        spec->input_mux = &spec->private_imux[0];
    1200812401
     
    1201012403        if (err < 0)
    1201112404                return err;
     12405
     12406        alc_ssid_check(codec, 0x15, 0x1b, 0x14);
    1201212407
    1201312408        return 1;
     
    1205812453        SND_PCI_QUIRK(0x1028, 0x0253, "Dell OEM", ALC268_DELL),
    1205912454        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),
    1206112457        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),
    1206512459        SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA),
    1206612460        SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER),
    1206712461        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 */
     12467static 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),
    1206912472        {0}
    1207012473};
     
    1207212475static struct alc_config_preset alc268_presets[] = {
    1207312476        [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 },
    1207512479                .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
    1207612480                                alc267_quanta_il1_verbs },
     
    1208212486                .num_channel_mode = ARRAY_SIZE(alc268_modes),
    1208312487                .channel_mode = alc268_modes,
    12084                 .input_mux = &alc268_capture_source,
    12085                 .unsol_event = alc267_quanta_il1_unsol_event,
    12086                 .init_hook = alc267_quanta_il1_automute,
     12488                .unsol_event = alc_sku_unsol_event,
     12489                .setup = alc267_quanta_il1_setup,
     12490                .init_hook = alc_inithook,
    1208712491        },
    1208812492        [ALC268_3ST] = {
     
    1210212506        },
    1210312507        [ALC268_TOSHIBA] = {
    12104                 .mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
     12508                .mixers = { alc268_toshiba_mixer, alc268_capture_alt_mixer,
    1210512509                            alc268_beep_mixer },
    1210612510                .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
     
    1211612520                .input_mux = &alc268_capture_source,
    1211712521                .unsol_event = alc268_toshiba_unsol_event,
     12522                .setup = alc268_toshiba_setup,
    1211812523                .init_hook = alc268_toshiba_automute,
    1211912524        },
    1212012525        [ALC268_ACER] = {
    12121                 .mixers = { alc268_acer_mixer, alc268_capture_alt_mixer,
     12526                .mixers = { alc268_acer_mixer, alc268_capture_nosrc_mixer,
    1212212527                            alc268_beep_mixer },
    1212312528                .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
     
    1215512560                .mixers = { alc268_acer_aspire_one_mixer,
    1215612561                            alc268_beep_mixer,
    12157                             alc268_capture_alt_mixer },
     12562                            alc268_capture_nosrc_mixer },
    1215812563                .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
    1215912564                                alc268_acer_aspire_one_verbs },
     
    1216612571                .num_channel_mode = ARRAY_SIZE(alc268_modes),
    1216712572                .channel_mode = alc268_modes,
    12168                 .input_mux = &alc268_acer_lc_capture_source,
    1216912573                .unsol_event = alc268_acer_lc_unsol_event,
     12574                .setup = alc268_acer_lc_setup,
    1217012575                .init_hook = alc268_acer_lc_init_hook,
    1217112576        },
    1217212577        [ALC268_DELL] = {
    12173                 .mixers = { alc268_dell_mixer, alc268_beep_mixer },
     12578                .mixers = { alc268_dell_mixer, alc268_beep_mixer,
     12579                            alc268_capture_nosrc_mixer },
    1217412580                .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
    1217512581                                alc268_dell_verbs },
    1217612582                .num_dacs = ARRAY_SIZE(alc268_dac_nids),
    1217712583                .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,
    1217812587                .hp_nid = 0x02,
    1217912588                .num_channel_mode = ARRAY_SIZE(alc268_modes),
    1218012589                .channel_mode = alc268_modes,
    12181                 .unsol_event = alc268_dell_unsol_event,
    12182                 .init_hook = alc268_dell_init_hook,
    12183                 .input_mux = &alc268_capture_source,
     12590                .unsol_event = alc_sku_unsol_event,
     12591                .setup = alc268_dell_setup,
     12592                .init_hook = alc_inithook,
    1218412593        },
    1218512594        [ALC268_ZEPTO] = {
     
    1219812607                .channel_mode = alc268_modes,
    1219912608                .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,
    1220212611        },
    1220312612#ifdef CONFIG_SND_DEBUG
     
    1223612645                                                  alc268_cfg_tbl);
    1223712646
     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
    1223812651        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);
    1224112654                board_config = ALC268_AUTO;
    1224212655        }
     
    1225712670
    1225812671        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]);
    1226812673
    1226912674        spec->stream_analog_playback = &alc268_pcm_analog_playback;
     
    1230212707
    1230312708                /* 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) {
    1230612712                        spec->adc_nids = alc268_adc_nids_alt;
    1230712713                        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);
    1230912718                } else {
    1231012719                        spec->adc_nids = alc268_adc_nids;
     
    1231712726                        snd_hda_codec_write_cache(codec, alc268_capsrc_nids[i],
    1231812727                                0, AC_VERB_SET_CONNECT_SEL,
     12728                                i < spec->num_mux_defs ?
     12729                                spec->input_mux[i].items[0].index :
    1231912730                                spec->input_mux->items[0].index);
    1232012731        }
     
    1235012761 *       not a mux!
    1235112762 */
    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 };
    1236812763
    1236912764#define alc269_modes            alc260_modes
     
    1242912824};
    1243012825
    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                 0
    12438         },
    12439 };
    12440 
    1244112826static 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),
    1244512831        {0} /* end */
    1244612832};
     
    1245512841
    1245612842/* 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
    1246312844
    1246412845static struct hda_verb alc269_quanta_fl1_verbs[] = {
     
    1254212923}
    1254312924
    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 
    1255412925static void alc269_lifebook_mic_autoswitch(struct hda_codec *codec)
    1255512926{
     
    1257812949                                    unsigned int res)
    1257912950{
    12580         if ((res >> 26) == ALC880_HP_EVENT)
     12951        switch (res >> 26) {
     12952        case ALC880_HP_EVENT:
    1258112953                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        }
    1258412959}
    1258512960
     
    1259312968}
    1259412969
     12970static 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
    1259512980static void alc269_quanta_fl1_init_hook(struct hda_codec *codec)
    1259612981{
    1259712982        alc269_quanta_fl1_speaker_automute(codec);
    12598         alc269_quanta_fl1_mic_automute(codec);
     12983        alc_mic_automute(codec);
    1259912984}
    1260012985
     
    1264113026}
    1264213027
    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 
    1266513028/* unsolicited event for HP jack sensing */
    12666 static void alc269_eeepc_dmic_unsol_event(struct hda_codec *codec,
     13029static void alc269_eeepc_unsol_event(struct hda_codec *codec,
    1266713030                                     unsigned int res)
    1266813031{
    12669         if ((res >> 26) == ALC880_HP_EVENT)
     13032        switch (res >> 26) {
     13033        case ALC880_HP_EVENT:
    1267013034                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
     13042static 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
     13052static 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
     13062static void alc269_eeepc_inithook(struct hda_codec *codec)
    1267713063{
    1267813064        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);
    1269713066}
    1269813067
     
    1276713136};
    1276813137
    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
    1287013142
    1287113143#ifdef CONFIG_SND_HDA_POWER_SAVE
     
    1287313145#endif
    1287413146
    12875 /* pcm configuration: identiacal with ALC880 */
     13147/* pcm configuration: identical with ALC880 */
    1287613148#define alc269_pcm_analog_playback      alc880_pcm_analog_playback
    1287713149#define alc269_pcm_analog_capture       alc880_pcm_analog_capture
     
    1291713189        if (err < 0)
    1291813190                return err;
    12919         err = alc269_auto_create_analog_input_ctls(spec, &spec->autocfg);
     13191        err = alc269_auto_create_input_ctls(codec, &spec->autocfg);
    1292013192        if (err < 0)
    1292113193                return err;
     
    1294213214
    1294313215        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);
    1294513219
    1294613220        return 1;
     
    1301613290                .input_mux = &alc269_capture_source,
    1301713291                .unsol_event = alc269_quanta_fl1_unsol_event,
     13292                .setup = alc269_quanta_fl1_setup,
    1301813293                .init_hook = alc269_quanta_fl1_init_hook,
    1301913294        },
     
    1302813303                .num_channel_mode = ARRAY_SIZE(alc269_modes),
    1302913304                .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,
    1303313308        },
    1303413309        [ALC269_ASUS_EEEPC_P901] = {
     
    1304213317                .num_channel_mode = ARRAY_SIZE(alc269_modes),
    1304313318                .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,
    1304713322        },
    1304813323        [ALC269_FUJITSU] = {
     
    1305613331                .num_channel_mode = ARRAY_SIZE(alc269_modes),
    1305713332                .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,
    1306113336        },
    1306213337        [ALC269_LIFEBOOK] = {
     
    1309313368
    1309413369        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);
    1309713372                board_config = ALC269_AUTO;
    1309813373        }
     
    1311913394
    1312013395        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
    1312413398        if (codec->subsystem_id == 0x17aa3bf8) {
    1312513399                /* Due to a hardware problem on Lenovo Ideadpad, we need to
     
    1313213406                spec->stream_analog_capture = &alc269_pcm_analog_capture;
    1313313407        }
    13134         spec->stream_name_digital = "ALC269 Digital";
    1313513408        spec->stream_digital_playback = &alc269_pcm_digital_playback;
    1313613409        spec->stream_digital_capture = &alc269_pcm_digital_capture;
     
    1314013413        spec->capsrc_nids = alc269_capsrc_nids;
    1314113414        if (!spec->cap_mixer)
    13142                 set_capture_mixer(spec);
     13415                set_capture_mixer(codec);
    1314313416        set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
     13417
     13418        spec->vmaster_nid = 0x02;
    1314413419
    1314513420        codec->patch_ops = alc_patch_ops;
     
    1328213557        HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
    1328313558        HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
     13559
    1328413560        {0} /* end */
    1328513561};
     
    1368713963        {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c},
    1368813964
    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)},
    1369713973
    1369813974        {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
    1369913975        {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)},
    1370213978        {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
    1370313979        {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)},
    1370613982
    1370713983        {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},  /* set Mic 1 */
     
    1373614012}
    1373714013
    13738 /* pcm configuration: identiacal with ALC880 */
     14014/* pcm configuration: identical with ALC880 */
    1373914015#define alc861_pcm_analog_playback      alc880_pcm_analog_playback
    1374014016#define alc861_pcm_analog_capture       alc880_pcm_analog_capture
     
    1377514051};
    1377614052
     14053static 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
    1377714078/* fill in the dac_nids table from the parsed pin configuration */
    13778 static int alc861_auto_fill_dac_nids(struct alc_spec *spec,
     14079static int alc861_auto_fill_dac_nids(struct hda_codec *codec,
    1377914080                                     const struct auto_pin_cfg *cfg)
    1378014081{
     14082        struct alc_spec *spec = codec->spec;
    1378114083        int i;
    13782         hda_nid_t nid;
     14084        hda_nid_t nid, dac;
    1378314085
    1378414086        spec->multiout.dac_nids = spec->private_dac_nids;
    1378514087        for (i = 0; i < cfg->line_outs; i++) {
    1378614088                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;
    1379214093        }
    13793         spec->multiout.num_dacs = cfg->line_outs;
    1379414094        return 0;
    1379514095}
    1379614096
     14097static 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
    1379714106/* add playback controls from the parsed DAC table */
    13798 static int alc861_auto_create_multi_out_ctls(struct alc_spec *spec,
     14107static int alc861_auto_create_multi_out_ctls(struct hda_codec *codec,
    1379914108                                             const struct auto_pin_cfg *cfg)
    1380014109{
    13801         char name[32];
     14110        struct alc_spec *spec = codec->spec;
    1380214111        static const char *chname[4] = {
    1380314112                "Front", "Surround", NULL /*CLFE*/, "Side"
    1380414113        };
    1380514114        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        }
    1380714128
    1380814129        for (i = 0; i < cfg->line_outs; i++) {
     
    1381014131                if (!nid)
    1381114132                        continue;
    13812                 if (nid == 0x05) {
     14133                if (i == 2) {
    1381314134                        /* 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);
    1381814136                        if (err < 0)
    1381914137                                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);
    1382414139                        if (err < 0)
    1382514140                                return err;
    1382614141                } 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);
    1383514143                        if (err < 0)
    1383614144                                return err;
     
    1384014148}
    1384114149
    13842 static int alc861_auto_create_hp_ctls(struct alc_spec *spec, hda_nid_t pin)
    13843 {
     14150static int alc861_auto_create_hp_ctls(struct hda_codec *codec, hda_nid_t pin)
     14151{
     14152        struct alc_spec *spec = codec->spec;
    1384414153        int err;
    1384514154        hda_nid_t nid;
     
    1384914158
    1385014159        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                }
    1385814167        }
    1385914168        return 0;
     
    1386114170
    1386214171/* create playback/capture controls for input pins */
    13863 static int alc861_auto_create_analog_input_ctls(struct alc_spec *spec,
     14172static int alc861_auto_create_input_ctls(struct hda_codec *codec,
    1386414173                                                const struct auto_pin_cfg *cfg)
    1386514174{
    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);
    1390514176}
    1390614177
    1390714178static void alc861_auto_set_output_and_unmute(struct hda_codec *codec,
    1390814179                                              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
    1391114185        snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
    1391214186                            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,
    1391414188                            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        }
    1391514203}
    1391614204
     
    1392014208        int i;
    1392114209
    13922         alc_subsystem_id(codec, 0x0e, 0x0f, 0x0b);
    1392314210        for (i = 0; i < spec->autocfg.line_outs; i++) {
    1392414211                hda_nid_t nid = spec->autocfg.line_out_pins[i];
     
    1393614223
    1393714224        pin = spec->autocfg.hp_pins[0];
    13938         if (pin) /* connect to front */
     14225        if (pin)
    1393914226                alc861_auto_set_output_and_unmute(codec, pin, PIN_HP,
    13940                                                   spec->multiout.dac_nids[0]);
     14227                                                  spec->multiout.hp_nid);
    1394114228        pin = spec->autocfg.speaker_pins[0];
    1394214229        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]);
    1394414232}
    1394514233
     
    1397314261                return 0; /* can't find valid BIOS pin config */
    1397414262
    13975         err = alc861_auto_fill_dac_nids(spec, &spec->autocfg);
     14263        err = alc861_auto_fill_dac_nids(codec, &spec->autocfg);
    1397614264        if (err < 0)
    1397714265                return err;
    13978         err = alc861_auto_create_multi_out_ctls(spec, &spec->autocfg);
     14266        err = alc861_auto_create_multi_out_ctls(codec, &spec->autocfg);
    1397914267        if (err < 0)
    1398014268                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]);
    1398214270        if (err < 0)
    1398314271                return err;
    13984         err = alc861_auto_create_analog_input_ctls(spec, &spec->autocfg);
     14272        err = alc861_auto_create_input_ctls(codec, &spec->autocfg);
    1398514273        if (err < 0)
    1398614274                return err;
     
    1400114289        spec->adc_nids = alc861_adc_nids;
    1400214290        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);
    1400414294
    1400514295        return 1;
     
    1419214482
    1419314483        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);
    1419614486                board_config = ALC861_AUTO;
    1419714487        }
     
    1421814508
    1421914509        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
    1422314512        spec->stream_analog_playback = &alc861_pcm_analog_playback;
    1422414513        spec->stream_analog_capture = &alc861_pcm_analog_capture;
    1422514514
    14226         spec->stream_name_digital = "ALC861 Digital";
    1422714515        spec->stream_digital_playback = &alc861_pcm_digital_playback;
    1422814516        spec->stream_digital_capture = &alc861_pcm_digital_capture;
     
    1426014548/* dac_nids for ALC660vd are in a different order - according to
    1426114549 * Realtek's driver.
    14262  * This should probably tesult in a different mixer for 6stack models
     14550 * This should probably result in a different mixer for 6stack models
    1426314551 * of ALC660vd codecs, but for now there is only 3stack mixer
    1426414552 * - and it is the same as in 861vd.
     
    1461114899};
    1461214900
    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 
    1462614901static void alc861vd_lenovo_mic_automute(struct hda_codec *codec)
    1462714902{
     
    1463614911}
    1463714912
    14638 static void alc861vd_lenovo_automute(struct hda_codec *codec)
    14639 {
    14640         alc861vd_lenovo_hp_automute(codec);
     14913static 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
     14920static void alc861vd_lenovo_init_hook(struct hda_codec *codec)
     14921{
     14922        alc_automute_amp(codec);
    1464114923        alc861vd_lenovo_mic_automute(codec);
    1464214924}
     
    1464614928{
    1464714929        switch (res >> 26) {
    14648         case ALC880_HP_EVENT:
    14649                 alc861vd_lenovo_hp_automute(codec);
    14650                 break;
    1465114930        case ALC880_MIC_EVENT:
    1465214931                alc861vd_lenovo_mic_automute(codec);
     14932                break;
     14933        default:
     14934                alc_automute_amp_unsol_event(codec, res);
    1465314935                break;
    1465414936        }
     
    1470114983
    1470214984/* 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);
     14985static 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;
    1471714991}
    1471814992
     
    1472114995#endif
    1472214996
    14723 /* pcm configuration: identiacal with ALC880 */
     14997/* pcm configuration: identical with ALC880 */
    1472414998#define alc861vd_pcm_analog_playback    alc880_pcm_analog_playback
    1472514999#define alc861vd_pcm_analog_capture     alc880_pcm_analog_capture
     
    1475315027        SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba A135", ALC861VD_LENOVO),
    1475415028        /*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),
    1475615030        SND_PCI_QUIRK(0x1179, 0xff03, "Toshiba P205", ALC861VD_LENOVO),
    1475715031        SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_DALLAS),
     
    1482815102                .input_mux = &alc861vd_capture_source,
    1482915103                .unsol_event = alc861vd_lenovo_unsol_event,
    14830                 .init_hook = alc861vd_lenovo_automute,
     15104                .setup = alc861vd_lenovo_setup,
     15105                .init_hook = alc861vd_lenovo_init_hook,
    1483115106        },
    1483215107        [ALC861VD_DALLAS] = {
     
    1483815113                .channel_mode = alc861vd_3stack_2ch_modes,
    1483915114                .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,
    1484215118        },
    1484315119        [ALC861VD_HP] = {
     
    1485015126                .channel_mode = alc861vd_3stack_2ch_modes,
    1485115127                .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,
    1485415131        },
    1485515132        [ALC660VD_ASUS_V1S] = {
     
    1486615143                .input_mux = &alc861vd_capture_source,
    1486715144                .unsol_event = alc861vd_lenovo_unsol_event,
    14868                 .init_hook = alc861vd_lenovo_automute,
     15145                .setup = alc861vd_lenovo_setup,
     15146                .init_hook = alc861vd_lenovo_init_hook,
    1486915147        },
    1487015148};
     
    1487315151 * BIOS auto configuration
    1487415152 */
     15153static 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
    1487515160static void alc861vd_auto_set_output_and_unmute(struct hda_codec *codec,
    1487615161                                hda_nid_t nid, int pin_type, int dac_idx)
     
    1488415169        int i;
    1488515170
    14886         alc_subsystem_id(codec, 0x15, 0x1b, 0x14);
    1488715171        for (i = 0; i <= HDA_SIDE; i++) {
    1488815172                hda_nid_t nid = spec->autocfg.line_out_pins[i];
     
    1490115185
    1490215186        pin = spec->autocfg.hp_pins[0];
    14903         if (pin) /* connect to front and  use dac 0 */
     15187        if (pin) /* connect to front and use dac 0 */
    1490415188                alc861vd_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
    1490515189        pin = spec->autocfg.speaker_pins[0];
     
    1490815192}
    1490915193
    14910 #define alc861vd_is_input_pin(nid)      alc880_is_input_pin(nid)
    1491115194#define ALC861VD_PIN_CD_NID             ALC880_PIN_CD_NID
    1491215195
     
    1491815201        for (i = 0; i < AUTO_PIN_LAST; i++) {
    1491915202                hda_nid_t nid = spec->autocfg.input_pins[i];
    14920                 if (alc861vd_is_input_pin(nid)) {
     15203                if (alc_is_input_pin(codec, nid)) {
    1492115204                        alc_set_input_pin(codec, nid, i);
    1492215205                        if (nid != ALC861VD_PIN_CD_NID &&
     
    1498215265                                return err;
    1498315266                } 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);
    1498515277                        err = add_control(spec, ALC_CTL_WIDGET_VOL, name,
    1498615278                                          HDA_COMPOSE_AMP_VAL(nid_v, 3, 0,
     
    1498815280                        if (err < 0)
    1498915281                                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);
    1499115286                        err = add_control(spec, ALC_CTL_BIND_MUTE, name,
    1499215287                                          HDA_COMPOSE_AMP_VAL(nid_s, 3, 2,
     
    1508115376        if (err < 0)
    1508215377                return err;
    15083         err = alc880_auto_create_analog_input_ctls(spec, &spec->autocfg);
     15378        err = alc861vd_auto_create_input_ctls(codec, &spec->autocfg);
    1508415379        if (err < 0)
    1508515380                return err;
     
    1510115396        if (err < 0)
    1510215397                return err;
     15398
     15399        alc_ssid_check(codec, 0x15, 0x1b, 0x14);
    1510315400
    1510415401        return 1;
     
    1513315430
    1513415431        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);
    1513715434                board_config = ALC861VD_AUTO;
    1513815435        }
     
    1515915456
    1516015457        if (board_config != ALC861VD_AUTO)
    15161                 setup_preset(spec, &alc861vd_presets[board_config]);
     15458                setup_preset(codec, &alc861vd_presets[board_config]);
    1516215459
    1516315460        if (codec->vendor_id == 0x10ec0660) {
    15164                 spec->stream_name_analog = "ALC660-VD Analog";
    15165                 spec->stream_name_digital = "ALC660-VD Digital";
    1516615461                /* always turn on EAPD */
    1516715462                add_verb(spec, alc660vd_eapd_verbs);
    15168         } else {
    15169                 spec->stream_name_analog = "ALC861VD Analog";
    15170                 spec->stream_name_digital = "ALC861VD Digital";
    1517115463        }
    1517215464
     
    1517715469        spec->stream_digital_capture = &alc861vd_pcm_digital_capture;
    1517815470
    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);
    1518515479        set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
    1518615480
     
    1522315517};
    1522415518
    15225 static hda_nid_t alc662_adc_nids[1] = {
     15519static hda_nid_t alc662_adc_nids[2] = {
    1522615520        /* ADC1-2 */
    15227         0x09,
     15521        0x09, 0x08
    1522815522};
    1522915523
     
    1523315527};
    1523415528
    15235 static hda_nid_t alc662_capsrc_nids[1] = { 0x22 };
     15529static hda_nid_t alc662_capsrc_nids[2] = { 0x22, 0x23 };
    1523615530static hda_nid_t alc272_capsrc_nids[1] = { 0x23 };
    1523715531
     
    1525715551};
    1525815552
    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 
    1526715553static struct hda_input_mux alc663_capture_source = {
    1526815554        .num_items = 3,
     
    1527415560};
    1527515561
    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 */
     15563static struct hda_input_mux alc272_nc10_capture_source = {
     15564        .num_items = 16,
    1527815565        .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
    1528315585
    1528415586/*
     
    1542115723
    1542215724static 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,
    1542715727
    1542815728        HDA_CODEC_VOLUME("e-Mic Boost", 0x18, 0, HDA_INPUT),
     
    1543715737
    1543815738static 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),
    1544115741        HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
    15442         HDA_BIND_MUTE("Surround Playback Switch", 0x03, 2, HDA_INPUT),
    1544315742        HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
    1544415743        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),
    1544815744        HDA_BIND_MUTE("MuteCtrl Playback Switch", 0x0c, 2, HDA_INPUT),
    1544915745        HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
     
    1593316229}
    1593416230
    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 
    1595116231/* unsolicited event for HP jack sensing */
    1595216232static void alc662_eeepc_unsol_event(struct hda_codec *codec,
    1595316233                                     unsigned int res)
    1595416234{
    15955         if ((res >> 26) == ALC880_HP_EVENT)
    15956                 alc262_hippo1_automute( codec );
    15957 
    1595816235        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
     16241static 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;
    1596016251}
    1596116252
    1596216253static void alc662_eeepc_inithook(struct hda_codec *codec)
    1596316254{
    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
     16259static 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
    1600116268
    1600216269static void alc663_m51va_speaker_automute(struct hda_codec *codec)
     
    1611016377}
    1611116378
    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 
    1612916379static void alc663_m51va_unsol_event(struct hda_codec *codec,
    1613016380                                           unsigned int res)
     
    1613516385                break;
    1613616386        case ALC880_MIC_EVENT:
    16137                 alc663_m51va_mic_automute(codec);
     16387                alc_mic_automute(codec);
    1613816388                break;
    1613916389        }
    1614016390}
    1614116391
     16392static 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
    1614216402static void alc663_m51va_inithook(struct hda_codec *codec)
    1614316403{
    1614416404        alc663_m51va_speaker_automute(codec);
    16145         alc663_m51va_mic_automute(codec);
     16405        alc_mic_automute(codec);
    1614616406}
    1614716407
    1614816408/* ***************** 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
    1616716413/* ***************** Mode2 ******************************/
    1616816414static void alc662_mode2_unsol_event(struct hda_codec *codec,
     
    1617416420                break;
    1617516421        case ALC880_MIC_EVENT:
    16176                 alc662_eeepc_mic_automute(codec);
     16422                alc_mic_automute(codec);
    1617716423                break;
    1617816424        }
    1617916425}
    1618016426
     16427#define alc662_mode2_setup      alc663_m51va_setup
     16428
    1618116429static void alc662_mode2_inithook(struct hda_codec *codec)
    1618216430{
    1618316431        alc662_f5z_speaker_automute(codec);
    16184         alc662_eeepc_mic_automute(codec);
     16432        alc_mic_automute(codec);
    1618516433}
    1618616434/* ***************** Mode3 ******************************/
     
    1619316441                break;
    1619416442        case ALC880_MIC_EVENT:
    16195                 alc662_eeepc_mic_automute(codec);
     16443                alc_mic_automute(codec);
    1619616444                break;
    1619716445        }
    1619816446}
    1619916447
     16448#define alc663_mode3_setup      alc663_m51va_setup
     16449
    1620016450static void alc663_mode3_inithook(struct hda_codec *codec)
    1620116451{
    1620216452        alc663_two_hp_m1_speaker_automute(codec);
    16203         alc662_eeepc_mic_automute(codec);
     16453        alc_mic_automute(codec);
    1620416454}
    1620516455/* ***************** Mode4 ******************************/
     
    1621216462                break;
    1621316463        case ALC880_MIC_EVENT:
    16214                 alc662_eeepc_mic_automute(codec);
     16464                alc_mic_automute(codec);
    1621516465                break;
    1621616466        }
    1621716467}
    1621816468
     16469#define alc663_mode4_setup      alc663_m51va_setup
     16470
    1621916471static void alc663_mode4_inithook(struct hda_codec *codec)
    1622016472{
    1622116473        alc663_21jd_two_speaker_automute(codec);
    16222         alc662_eeepc_mic_automute(codec);
     16474        alc_mic_automute(codec);
    1622316475}
    1622416476/* ***************** Mode5 ******************************/
     
    1623116483                break;
    1623216484        case ALC880_MIC_EVENT:
    16233                 alc662_eeepc_mic_automute(codec);
     16485                alc_mic_automute(codec);
    1623416486                break;
    1623516487        }
    1623616488}
    1623716489
     16490#define alc663_mode5_setup      alc663_m51va_setup
     16491
    1623816492static void alc663_mode5_inithook(struct hda_codec *codec)
    1623916493{
    1624016494        alc663_15jd_two_speaker_automute(codec);
    16241         alc662_eeepc_mic_automute(codec);
     16495        alc_mic_automute(codec);
    1624216496}
    1624316497/* ***************** Mode6 ******************************/
     
    1625016504                break;
    1625116505        case ALC880_MIC_EVENT:
    16252                 alc662_eeepc_mic_automute(codec);
     16506                alc_mic_automute(codec);
    1625316507                break;
    1625416508        }
    1625516509}
    1625616510
     16511#define alc663_mode6_setup      alc663_m51va_setup
     16512
    1625716513static void alc663_mode6_inithook(struct hda_codec *codec)
    1625816514{
    1625916515        alc663_two_hp_m2_speaker_automute(codec);
    16260         alc662_eeepc_mic_automute(codec);
     16516        alc_mic_automute(codec);
    1626116517}
    1626216518
     
    1630016556                break;
    1630116557        case ALC880_MIC_EVENT:
    16302                 alc662_eeepc_mic_automute(codec);
     16558                alc_mic_automute(codec);
    1630316559                break;
    1630416560        }
    1630516561}
    1630616562
     16563#define alc663_g71v_setup       alc663_m51va_setup
     16564
    1630716565static void alc663_g71v_inithook(struct hda_codec *codec)
    1630816566{
    1630916567        alc663_g71v_front_automute(codec);
    1631016568        alc663_g71v_hp_automute(codec);
    16311         alc662_eeepc_mic_automute(codec);
     16569        alc_mic_automute(codec);
    1631216570}
    1631316571
     
    1632016578                break;
    1632116579        case ALC880_MIC_EVENT:
    16322                 alc662_eeepc_mic_automute(codec);
     16580                alc_mic_automute(codec);
    1632316581                break;
    1632416582        }
    1632516583}
    1632616584
     16585#define alc663_g50v_setup       alc663_m51va_setup
     16586
    1632716587static void alc663_g50v_inithook(struct hda_codec *codec)
    1632816588{
    1632916589        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);
    1635016591}
    1635116592
    1635216593static struct snd_kcontrol_new alc662_ecs_mixer[] = {
    1635316594        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,
    1636216596
    1636316597        HDA_CODEC_VOLUME("e-Mic/LineIn Boost", 0x18, 0, HDA_INPUT),
     
    1637116605};
    1637216606
     16607static 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
    1637316624#ifdef CONFIG_SND_HDA_POWER_SAVE
    1637416625#define alc662_loopbacks        alc880_loopbacks
     
    1637616627
    1637716628
    16378 /* pcm configuration: identiacal with ALC880 */
     16629/* pcm configuration: identical with ALC880 */
    1637916630#define alc662_pcm_analog_playback      alc880_pcm_analog_playback
    1638016631#define alc662_pcm_analog_capture       alc880_pcm_analog_capture
     
    1640416655        [ALC663_ASUS_MODE5] = "asus-mode5",
    1640516656        [ALC663_ASUS_MODE6] = "asus-mode6",
     16657        [ALC272_DELL]           = "dell",
     16658        [ALC272_DELL_ZM1]       = "dell-zm1",
     16659        [ALC272_SAMSUNG_NC10]   = "samsung-nc10",
    1640616660        [ALC662_AUTO]           = "auto",
    1640716661};
     
    1646116715        SND_PCI_QUIRK(0x105b, 0x0d47, "Foxconn 45CMX/45GMX/45CMX-K",
    1646216716                      ALC662_3ST_6ch_DIG),
     16717        SND_PCI_QUIRK(0x144d, 0xca00, "Samsung NC10", ALC272_SAMSUNG_NC10),
    1646316718        SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L",
    1646416719                      ALC662_3ST_6ch_DIG),
     
    1653716792                .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
    1653816793                .channel_mode = alc662_3ST_2ch_modes,
    16539                 .input_mux = &alc662_eeepc_capture_source,
    1654016794                .unsol_event = alc662_eeepc_unsol_event,
     16795                .setup = alc662_eeepc_setup,
    1654116796                .init_hook = alc662_eeepc_inithook,
    1654216797        },
     
    1655116806                .channel_mode = alc662_3ST_6ch_modes,
    1655216807                .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,
    1655416810                .init_hook = alc662_eeepc_ep20_inithook,
    1655516811        },
     
    1656216818                .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
    1656316819                .channel_mode = alc662_3ST_2ch_modes,
    16564                 .input_mux = &alc662_eeepc_capture_source,
    1656516820                .unsol_event = alc662_eeepc_unsol_event,
     16821                .setup = alc662_eeepc_setup,
    1656616822                .init_hook = alc662_eeepc_inithook,
    1656716823        },
     
    1657416830                .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
    1657516831                .channel_mode = alc662_3ST_2ch_modes,
    16576                 .input_mux = &alc663_m51va_capture_source,
    1657716832                .unsol_event = alc663_m51va_unsol_event,
     16833                .setup = alc663_m51va_setup,
    1657816834                .init_hook = alc663_m51va_inithook,
    1657916835        },
     
    1658616842                .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
    1658716843                .channel_mode = alc662_3ST_2ch_modes,
    16588                 .input_mux = &alc662_eeepc_capture_source,
    1658916844                .unsol_event = alc663_g71v_unsol_event,
     16845                .setup = alc663_g71v_setup,
    1659016846                .init_hook = alc663_g71v_inithook,
    1659116847        },
     
    1659716853                .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
    1659816854                .channel_mode = alc662_3ST_2ch_modes,
    16599                 .input_mux = &alc663_m51va_capture_source,
    1660016855                .unsol_event = alc663_m51va_unsol_event,
    1660116856                .init_hook = alc663_m51va_inithook,
     
    1661116866                .input_mux = &alc663_capture_source,
    1661216867                .unsol_event = alc663_g50v_unsol_event,
     16868                .setup = alc663_g50v_setup,
    1661316869                .init_hook = alc663_g50v_inithook,
    1661416870        },
     
    1662416880                .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
    1662516881                .channel_mode = alc662_3ST_2ch_modes,
    16626                 .input_mux = &alc662_eeepc_capture_source,
    1662716882                .unsol_event = alc663_mode1_unsol_event,
     16883                .setup = alc663_mode1_setup,
    1662816884                .init_hook = alc663_mode1_inithook,
    1662916885        },
     
    1663816894                .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
    1663916895                .channel_mode = alc662_3ST_2ch_modes,
    16640                 .input_mux = &alc662_eeepc_capture_source,
    1664116896                .unsol_event = alc662_mode2_unsol_event,
     16897                .setup = alc662_mode2_setup,
    1664216898                .init_hook = alc662_mode2_inithook,
    1664316899        },
     
    1665316909                .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
    1665416910                .channel_mode = alc662_3ST_2ch_modes,
    16655                 .input_mux = &alc662_eeepc_capture_source,
    1665616911                .unsol_event = alc663_mode3_unsol_event,
     16912                .setup = alc663_mode3_setup,
    1665716913                .init_hook = alc663_mode3_inithook,
    1665816914        },
     
    1666816924                .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
    1666916925                .channel_mode = alc662_3ST_2ch_modes,
    16670                 .input_mux = &alc662_eeepc_capture_source,
    1667116926                .unsol_event = alc663_mode4_unsol_event,
     16927                .setup = alc663_mode4_setup,
    1667216928                .init_hook = alc663_mode4_inithook,
    1667316929        },
     
    1668316939                .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
    1668416940                .channel_mode = alc662_3ST_2ch_modes,
    16685                 .input_mux = &alc662_eeepc_capture_source,
    1668616941                .unsol_event = alc663_mode5_unsol_event,
     16942                .setup = alc663_mode5_setup,
    1668716943                .init_hook = alc663_mode5_inithook,
    1668816944        },
     
    1669816954                .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
    1669916955                .channel_mode = alc662_3ST_2ch_modes,
    16700                 .input_mux = &alc662_eeepc_capture_source,
    1670116956                .unsol_event = alc663_mode6_unsol_event,
     16957                .setup = alc663_mode6_setup,
    1670216958                .init_hook = alc663_mode6_inithook,
    1670316959        },
     
    1671316969                .capsrc_nids = alc272_capsrc_nids,
    1671416970                .channel_mode = alc662_3ST_2ch_modes,
    16715                 .input_mux = &alc663_m51va_capture_source,
    1671616971                .unsol_event = alc663_m51va_unsol_event,
     16972                .setup = alc663_m51va_setup,
    1671716973                .init_hook = alc663_m51va_inithook,
    1671816974        },
     
    1672516981                .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
    1672616982                .adc_nids = alc662_adc_nids,
    16727                 .num_adc_nids = ARRAY_SIZE(alc662_adc_nids),
     16983                .num_adc_nids = 1,
    1672816984                .capsrc_nids = alc662_capsrc_nids,
    1672916985                .channel_mode = alc662_3ST_2ch_modes,
    16730                 .input_mux = &alc663_m51va_capture_source,
    1673116986                .unsol_event = alc663_m51va_unsol_event,
     16987                .setup = alc663_m51va_setup,
    1673216988                .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,
    1673317002        },
    1673417003};
     
    1678117050                                return err;
    1678217051                } 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);
    1678417062                        err = add_control(spec, ALC_CTL_WIDGET_VOL, name,
    1678517063                                          HDA_COMPOSE_AMP_VAL(nid, 3, 0,
     
    1678717065                        if (err < 0)
    1678817066                                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);
    1679017071                        err = add_control(spec, ALC_CTL_WIDGET_MUTE, name,
    1679117072                                HDA_COMPOSE_AMP_VAL(alc880_idx_to_mixer(i),
     
    1684917130}
    1685017131
    16851 /* return the index of the src widget from the connection list of the nid.
    16852  * return -1 if not found
    16853  */
    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 
    1687617132/* 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
    1690717135
    1690817136static void alc662_auto_set_output_and_unmute(struct hda_codec *codec,
     
    1692617154        int i;
    1692717155
    16928         alc_subsystem_id(codec, 0x15, 0x1b, 0x14);
    1692917156        for (i = 0; i <= HDA_SIDE; i++) {
    1693017157                hda_nid_t nid = spec->autocfg.line_out_pins[i];
     
    1695917186        for (i = 0; i < AUTO_PIN_LAST; i++) {
    1696017187                hda_nid_t nid = spec->autocfg.input_pins[i];
    16961                 if (alc662_is_input_pin(codec, nid)) {
     17188                if (alc_is_input_pin(codec, nid)) {
    1696217189                        alc_set_input_pin(codec, nid, i);
    1696317190                        if (nid != ALC662_PIN_CD_NID &&
     
    1700017227        if (err < 0)
    1700117228                return err;
    17002         err = alc662_auto_create_analog_input_ctls(codec, &spec->autocfg);
     17229        err = alc662_auto_create_input_ctls(codec, &spec->autocfg);
    1700317230        if (err < 0)
    1700417231                return err;
     
    1702217249        if (err < 0)
    1702317250                return err;
     17251
     17252        alc_ssid_check(codec, 0x15, 0x1b, 0x14);
    1702417253
    1702517254        return 1;
     
    1705517284                                                  alc662_cfg_tbl);
    1705617285        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);
    1705917288                board_config = ALC662_AUTO;
    1706017289        }
     
    1708117310
    1708217311        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]);
    1709517313
    1709617314        spec->stream_analog_playback = &alc662_pcm_analog_playback;
     
    1710017318        spec->stream_digital_capture = &alc662_pcm_digital_capture;
    1710117319
    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;
    1710617326
    1710717327        if (!spec->cap_mixer)
    17108                 set_capture_mixer(spec);
     17328                set_capture_mixer(codec);
    1710917329        if (codec->vendor_id == 0x10ec0662)
    1711017330                set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
     
    1714217362        { .id = 0x10ec0862, .name = "ALC861-VD", .patch = patch_alc861vd },
    1714317363        { .id = 0x10ec0662, .rev = 0x100002, .name = "ALC662 rev2",
    17144           .patch = patch_alc883 },
     17364          .patch = patch_alc882 },
    1714517365        { .id = 0x10ec0662, .rev = 0x100101, .name = "ALC662 rev1",
    1714617366          .patch = patch_alc662 },
     
    1714817368        { .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 },
    1714917369        { .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 },
    17150         { .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc883 },
     17370        { .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc882 },
    1715117371        { .id = 0x10ec0885, .rev = 0x100101, .name = "ALC889A",
    17152           .patch = patch_alc882 }, /* should be patch_alc883() in future */
     17372          .patch = patch_alc882 },
    1715317373        { .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A",
    17154           .patch = patch_alc882 }, /* should be patch_alc883() in future */
     17374          .patch = patch_alc882 },
    1715517375        { .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 },
    17156         { .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc883 },
     17376        { .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc882 },
    1715717377        { .id = 0x10ec0888, .rev = 0x100101, .name = "ALC1200",
    17158           .patch = patch_alc883 },
    17159         { .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc883 },
    17160         { .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc883 },
     17378          .patch = patch_alc882 },
     17379        { .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc882 },
     17380        { .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc882 },
    1716117381        {0} /* terminator */
    1716217382};
  • GPL/trunk/alsa-kernel/pci/hda/patch_sigmatel.c

    r426 r464  
    4141        STAC_PWR_EVENT,
    4242        STAC_HP_EVENT,
     43        STAC_LO_EVENT,
     44        STAC_MIC_EVENT,
    4345};
    4446
     
    7779        STAC_92HD73XX_NO_JD, /* no jack-detection */
    7880        STAC_92HD73XX_REF,
     81        STAC_92HD73XX_INTEL,
    7982        STAC_DELL_M6_AMIC,
    8083        STAC_DELL_M6_DMIC,
     
    101104        STAC_HP_DV5,
    102105        STAC_HP_HDX,
     106        STAC_HP_DV4_1222NR,
    103107        STAC_92HD71BXX_MODELS
    104108};
     
    151155        STAC_D965_3ST,
    152156        STAC_D965_5ST,
     157        STAC_D965_5ST_NO_FP,
    153158        STAC_DELL_3ST,
    154159        STAC_DELL_BIOS,
     
    173178        int type;
    174179        struct snd_jack *jack;
     180};
     181
     182struct sigmatel_mic_route {
     183        hda_nid_t pin;
     184        unsigned char mux_idx;
     185        unsigned char dmux_idx;
    175186};
    176187
     
    186197        unsigned int spdif_mute: 1;
    187198        unsigned int check_volume_offset:1;
     199        unsigned int auto_mic:1;
    188200
    189201        /* gpio lines */
     
    193205        unsigned int gpio_data;
    194206        unsigned int gpio_mute;
     207        unsigned int gpio_led;
    195208
    196209        /* stream */
     
    236249        hda_nid_t *smux_nids;
    237250        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
    238260        const char **spdif_labels;
    239261
     
    332354};
    333355
    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
     357static 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
    338362
    339363#define STAC92HD83_DAC_COUNT 3
    340364
    341 static hda_nid_t stac92hd83xxx_dmux_nids[2] = {
     365static hda_nid_t stac92hd83xxx_mux_nids[2] = {
    342366        0x17, 0x18,
    343367};
     
    359383};
    360384
    361 static hda_nid_t stac92hd83xxx_amp_nids[1] = {
    362         0xc,
    363 };
     385#define STAC92HD83XXX_NUM_CAPS  2
     386static 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
    364391
    365392static hda_nid_t stac92hd71bxx_pwr_nids[3] = {
     
    392419};
    393420
     421#define STAC92HD71BXX_NUM_CAPS          2
     422static 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
    394428static hda_nid_t stac925x_adc_nids[1] = {
    395429        0x03,
     
    413447};
    414448
     449static unsigned long stac925x_capvols[] = {
     450        HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_OUTPUT),
     451};
     452static unsigned long stac925x_capsws[] = {
     453        HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
     454};
     455
    415456static hda_nid_t stac922x_adc_nids[2] = {
    416457        0x06, 0x07,
     
    420461        0x12, 0x13,
    421462};
     463
     464#define STAC922X_NUM_CAPS       2
     465static 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
    422470
    423471static hda_nid_t stac927x_slave_dig_outs[2] = {
     
    450498};
    451499
     500#define STAC927X_NUM_CAPS       3
     501static 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};
     506static 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
    452512static const char *stac927x_spdif_labels[5] = {
    453513        "Digital Playback", "ADAT", "Analog Mux 1",
     
    474534static hda_nid_t stac9205_dmic_nids[STAC9205_NUM_DMICS + 1] = {
    475535        0x17, 0x18, 0
     536};
     537
     538#define STAC9205_NUM_CAPS       2
     539static 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};
     543static unsigned long stac9205_capsws[] = {
     544        HDA_COMPOSE_AMP_VAL(0x1d, 3, 0, HDA_OUTPUT),
     545        HDA_COMPOSE_AMP_VAL(0x1e, 3, 0, HDA_OUTPUT),
    476546};
    477547
     
    634704}
    635705
     706static 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
     731static 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
    636740static int stac92xx_mux_enum_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
    637741{
     
    656760        struct sigmatel_spec *spec = codec->spec;
    657761        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;
    661791}
    662792
     
    8881018};
    8891019
    890 #define HD_DISABLE_PORTF 1
    891 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 
    9031020static struct hda_verb stac92hd71bxx_unmute_core_init[] = {
    9041021        /* unmute right and left channels for nodes 0x0f, 0xa, 0x0d */
     
    9951112        }
    9961113
     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
    9971125static struct snd_kcontrol_new stac9200_mixer[] = {
    9981126        HDA_CODEC_VOLUME("Master Playback Volume", 0xb, 0, HDA_OUTPUT),
     
    10221150        HDA_CODEC_MUTE("DAC Mixer Capture Switch", 0x1d, 0x3, HDA_INPUT),
    10231151
    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 
    10301152        {0} /* end */
    10311153};
     
    10471169
    10481170static 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 
    10551171        HDA_CODEC_VOLUME("Front Mic Mixer Capture Volume", 0x1d, 0, HDA_INPUT),
    10561172        HDA_CODEC_MUTE("Front Mic Mixer Capture Switch", 0x1d, 0, HDA_INPUT),
     
    10711187
    10721188static 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 
    10791189        HDA_CODEC_VOLUME("Front Mic Mixer Capture Volume", 0x1d, 0, HDA_INPUT),
    10801190        HDA_CODEC_MUTE("Front Mic Mixer Capture Switch", 0x1d, 0, HDA_INPUT),
     
    10951205
    10961206
    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 
    11491207static struct snd_kcontrol_new stac92hd71bxx_loopback[] = {
    11501208        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 */
    11601209};
    11611210
     
    11631212        HDA_CODEC_VOLUME("Master Playback Volume", 0x0e, 0, HDA_OUTPUT),
    11641213        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),
    11761214        {0} /* end */
    11771215};
     
    11801218        STAC_ANALOG_LOOPBACK(0xFE0, 0x7E0, 1),
    11811219        {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 */
    12051220};
    12061221
     
    12621277        int i;
    12631278
    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        }
    12671284
    12681285        for (i = 0; i < spec->num_mixers; i++) {
     
    12711288                        return err;
    12721289        }
    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) {
    12741292                stac_dmux_mixer.count = spec->num_dmuxes;
    12751293                err = snd_hda_ctl_add(codec,
     
    17301748        [STAC_92HD73XX_NO_JD] = "no-jd",
    17311749        [STAC_92HD73XX_REF] = "ref",
     1750        [STAC_92HD73XX_INTEL] = "intel",
    17321751        [STAC_DELL_M6_AMIC] = "dell-m6-amic",
    17331752        [STAC_DELL_M6_DMIC] = "dell-m6-dmic",
     
    17421761        SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
    17431762                                "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),
    17441767        SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0254,
    17451768                                "Dell Studio 1535", STAC_DELL_M6_DMIC),
     
    17621785        SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02a0,
    17631786                                "Dell Studio 17", STAC_DELL_M6_DMIC),
     1787        SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02be,
     1788                                "Dell Studio 1555", STAC_DELL_M6_DMIC),
    17641789        {0} /* terminator */
    17651790};
     
    18371862        [STAC_HP_DV5]           = NULL,
    18381863        [STAC_HP_HDX]           = NULL,
     1864        [STAC_HP_DV4_1222NR]    = NULL,
    18391865};
    18401866
     
    18481874        [STAC_HP_DV5] = "hp-dv5",
    18491875        [STAC_HP_HDX] = "hp-hdx",
     1876        [STAC_HP_DV4_1222NR] = "hp-dv4-1222nr",
    18501877};
    18511878
     
    18561883        SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
    18571884                      "DFI LanParty", STAC_92HD71BXX_REF),
     1885        SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30fb,
     1886                      "HP dv4-1222nr", STAC_HP_DV4_1222NR),
    18581887        SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3080,
    18591888                      "HP", STAC_HP_DV5),
     
    18681897        SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361b,
    18691898                      "HP HDX", STAC_HP_HDX),  /* HDX16 */
     1899        SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x7010,
     1900                      "HP", STAC_HP_DV5),
    18701901        SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0233,
    18711902                                "unknown Dell", STAC_DELL_M4_1),
     
    21552186};
    21562187
     2188static 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
    21572195static unsigned int dell_3st_pin_configs[14] = {
    21582196        0x02211230, 0x02a11220, 0x01a19040, 0x01114210,
     
    21672205        [STAC_D965_3ST]  = d965_3st_pin_configs,
    21682206        [STAC_D965_5ST]  = d965_5st_pin_configs,
     2207        [STAC_D965_5ST_NO_FP]  = d965_5st_no_fp_pin_configs,
    21692208        [STAC_DELL_3ST]  = dell_3st_pin_configs,
    21702209        [STAC_DELL_BIOS] = NULL,
     
    21772216        [STAC_D965_3ST]         = "3stack",
    21782217        [STAC_D965_5ST]         = "5stack",
     2218        [STAC_D965_5ST_NO_FP]   = "5stack-no-fp",
    21792219        [STAC_DELL_3ST]         = "dell-3stack",
    21802220        [STAC_DELL_BIOS]        = "dell-bios",
     
    22042244        SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x0227, "Dell Vostro 1400  ", STAC_DELL_BIOS),
    22052245        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),
    22072247        SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x0242, "Dell     ", STAC_DELL_BIOS),
    22082248        SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x0243, "Dell     ", STAC_DELL_BIOS),
     
    22822322        SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
    22832323                      "DFI LanParty", STAC_9205_REF),
     2324        SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0xfb30,
     2325                      "SigmaTel", STAC_9205_REF),
    22842326        SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
    22852327                      "DFI LanParty", STAC_9205_REF),
     
    23162358                      "Dell Vostro 1500", STAC_9205_DELL_M42),
    23172359        /* Gateway */
     2360        SND_PCI_QUIRK(0x107b, 0x0560, "Gateway T6834c", STAC_9205_EAPD),
    23182361        SND_PCI_QUIRK(0x107b, 0x0565, "Gateway T1616", STAC_9205_EAPD),
    23192362        {0} /* terminator */
     
    25362579}
    25372580
    2538 static unsigned int stac92xx_get_vref(struct hda_codec *codec, hda_nid_t nid)
     2581static unsigned int stac92xx_get_default_vref(struct hda_codec *codec,
     2582                                        hda_nid_t nid)
    25392583{
    25402584        unsigned int pincap = snd_hda_query_pin_caps(codec, nid);
     
    25702614}
    25712615
    2572 static void stac_issue_unsol_event(struct hda_codec *codec, hda_nid_t nid,
    2573                                    unsigned char type);
     2616static void stac_issue_unsol_event(struct hda_codec *codec, hda_nid_t nid);
    25742617
    25752618static int stac92xx_hp_switch_put(struct snd_kcontrol *kcontrol,
     
    25852628         * switch changes
    25862629         */
    2587         stac_issue_unsol_event(codec, nid, STAC_HP_EVENT);
     2630        stac_issue_unsol_event(codec, nid);
    25882631
    25892632        return 1;
    25902633}
    25912634
    2592 #define stac92xx_io_switch_info         snd_ctl_boolean_mono_info
     2635static 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
     2663static 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
     2680static 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
     2705static 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}
    25932728
    25942729static int stac92xx_io_switch_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
     
    25962731        struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
    25972732        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];
    26012737        return 0;
    26022738}
     
    26062742        struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
    26072743        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];
    26112747
    26122748        spec->io_switch[io_idx] = val;
     
    26172753                unsigned int pinctl = AC_PINCTL_IN_EN;
    26182754                if (io_idx) /* set VREF for mic */
    2619                         pinctl |= stac92xx_get_vref(codec, nid);
     2755                        pinctl |= stac92xx_get_default_vref(codec, nid);
    26202756                stac92xx_auto_set_pinctl(codec, nid, pinctl);
    26212757        }
     
    26252761         */
    26262762        if (spec->hp_detect)
    2627                 stac_issue_unsol_event(codec, nid, STAC_HP_EVENT);
     2763                stac_issue_unsol_event(codec, nid);
    26282764
    26292765        return 1;
     
    26982834        STAC_CTL_WIDGET_HP_SWITCH,
    26992835        STAC_CTL_WIDGET_IO_SWITCH,
    2700         STAC_CTL_WIDGET_CLFE_SWITCH
     2836        STAC_CTL_WIDGET_CLFE_SWITCH,
     2837        STAC_CTL_WIDGET_DC_BIAS
    27012838};
    27022839
     
    27102847        STAC_CODEC_IO_SWITCH(NULL, 0),
    27112848        STAC_CODEC_CLFE_SWITCH(NULL, 0),
     2849        DC_BIAS(NULL, 0, 0),
    27122850};
    27132851
     
    27732911};
    27742912
     2913static 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
    27752941static int stac92xx_add_input_source(struct sigmatel_spec *spec)
    27762942{
     
    27782944        struct hda_input_mux *imux = &spec->private_imux;
    27792945
     2946        if (spec->auto_mic)
     2947                return 0; /* no need for input source */
    27802948        if (!spec->num_adcs || imux->num_items <= 1)
    27812949                return 0; /* no need for input source control */
     
    28713039        for (j = 0; j < conn_len; j++) {
    28723040                wcaps = get_wcaps(codec, conn[j]);
    2873                 wtype = (wcaps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;
     3041                wtype = get_wcaps_type(wcaps);
    28743042                /* we check only analog outputs */
    28753043                if (wtype != AC_WID_AUD_OUT || (wcaps & AC_WCAP_DIGITAL))
     
    31303298}
    31313299
     3300static 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
    31323315/* add playback controls from the parsed DAC table */
    31333316static int stac92xx_auto_create_multi_out_ctls(struct hda_codec *codec,
     
    31353318{
    31363319        struct sigmatel_spec *spec = codec->spec;
     3320        hda_nid_t nid;
    31373321        int err;
     3322        int idx;
    31383323
    31393324        err = create_multi_out_ctls(codec, cfg->line_outs, cfg->line_out_pins,
     
    31523337        }
    31533338
    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                }
    31683346        }
    31693347
     
    32083386                                con_lst,
    32093387                                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))
    32113389                return -EINVAL;
    32123390
     
    33213499{
    33223500        struct sigmatel_spec *spec = codec->spec;
    3323         int wcaps, nid, i, err = 0;
     3501        int i, j, err = 0;
    33243502
    33253503        for (i = 0; i < spec->num_muxes; i++) {
     3504                hda_nid_t nid;
     3505                unsigned int wcaps;
     3506                unsigned long val;
     3507
    33263508                nid = spec->mux_nids[i];
    33273509                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;
    33353520                }
     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;
    33363528        }
    33373529        return 0;
     
    33543546                                con_lst,
    33553547                                HDA_MAX_NUM_INPUTS);
    3356         if (!num_cons)
     3548        if (num_cons <= 0)
    33573549                return -EINVAL;
    33583550
     
    33753567};
    33763568
     3569static 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) */
     3583static 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
    33773600/* create playback/capture controls for input pins on dmic capable codecs */
    33783601static int stac92xx_auto_create_dmic_input_ctls(struct hda_codec *codec,
     
    33803603{
    33813604        struct sigmatel_spec *spec = codec->spec;
     3605        struct hda_input_mux *imux = &spec->private_imux;
    33823606        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;
    33863609
    33873610        dimux->items[dimux->num_items].label = stac92xx_dmic_labels[0];
     
    33893612        dimux->num_items++;
    33903613
     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
    33913625        for (i = 0; i < spec->num_dmics; i++) {
    33923626                hda_nid_t nid;
    33933627                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);
    33993634                if (get_defcfg_connect(def_conf) == AC_JACK_PORT_NONE)
    34003635                        continue;
    34013636
    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;
    34333651                dimux->items[dimux->num_items].index = index;
    34343652                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                }
    34353658        }
    34363659
    34373660        return 0;
     3661}
     3662
     3663static 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
     3686static 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 */
     3717static 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;
    34383743}
    34393744
     
    34433748        struct sigmatel_spec *spec = codec->spec;
    34443749        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;
    34473751
    34483752        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)
    34523757                        continue;
    34533758                index = -1;
    34543759                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;
    34653764                }
    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
    34683773                imux->items[imux->num_items].label = auto_pin_cfg_labels[i];
    34693774                imux->items[imux->num_items].index = index;
    34703775                imux->num_items++;
    34713776        }
     3777        spec->num_analog_muxes = imux->num_items;
    34723778
    34733779        if (imux->num_items) {
     
    35213827        struct sigmatel_spec *spec = codec->spec;
    35223828        int hp_swap = 0;
    3523         int err;
     3829        int i, err;
    35243830
    35253831        if ((err = snd_hda_parse_pin_def_config(codec,
     
    35613867                                spec->autocfg.mono_out_pin, conn_list, 1) &&
    35623868                                snd_hda_get_connections(codec, conn_list[0],
    3563                                 conn_list, 1)) {
     3869                                conn_list, 1) > 0) {
    35643870
    35653871                                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);
    35683873                                /* LR swap check, some stac925x have a mux that
    35693874                                 * changes the DACs output path instead of the
     
    36303935                if (err < 0)
    36313936                        return err;
     3937                /* IDT/STAC codecs have linear beep tone parameter */
     3938                codec->beep->linear_tone = 1;
    36323939                /* if no beep switch is available, make its own one */
    36333940                caps = query_amp_caps(codec, nid, HDA_OUTPUT);
     
    36523959                spec->autocfg.line_out_type = AUTO_PIN_HP_OUT;
    36533960                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;
    36543976        }
    36553977
     
    38524174}
    38534175
    3854 #ifdef CONFIG_SND_JACK
     4176#ifdef CONFIG_SND_HDA_INPUT_JACK
    38554177static void stac92xx_free_jack_priv(struct snd_jack *jack)
    38564178{
     
    38644186                hda_nid_t nid, int type)
    38654187{
    3866 #ifdef CONFIG_SND_JACK
     4188#ifdef CONFIG_SND_HDA_INPUT_JACK
    38674189        struct sigmatel_spec *spec = codec->spec;
    38684190        struct sigmatel_jack *jack;
     
    38824204        jack->type = type;
    38834205
    3884         sprintf(name, "%s at %s %s Jack",
     4206        snprintf(name, sizeof(name), "%s at %s %s Jack",
    38854207                snd_hda_get_jack_type(def_conf),
    38864208                snd_hda_get_jack_connectivity(def_conf),
     
    39164238
    39174239static struct sigmatel_event *stac_get_event(struct hda_codec *codec,
    3918                                              hda_nid_t nid, unsigned char type)
     4240                                             hda_nid_t nid)
    39194241{
    39204242        struct sigmatel_spec *spec = codec->spec;
     
    39234245
    39244246        for (i = 0; i < spec->events.used; i++, event++) {
    3925                 if (event->nid == nid && event->type == type)
     4247                if (event->nid == nid)
    39264248                        return event;
    39274249        }
     
    39434265}
    39444266
    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 */
     4271static int enable_pin_detect(struct hda_codec *codec, hda_nid_t nid,
     4272                             unsigned int type)
    39474273{
    39484274        struct sigmatel_event *event;
     
    39504276
    39514277        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;
    39554283                tag = event->tag;
    3956         else
     4284        } else {
    39574285                tag = stac_add_event(codec->spec, nid, type, 0);
    3958         if (tag < 0)
    3959                 return;
     4286                if (tag < 0)
     4287                        return 0;
     4288        }
    39604289        snd_hda_codec_write_cache(codec, nid, 0,
    39614290                                  AC_VERB_SET_UNSOLICITED_ENABLE,
    39624291                                  AC_USRSP_EN | tag);
     4292        return 1;
    39634293}
    39644294
     
    40534383                        enable_pin_detect(codec, nid, STAC_HP_EVENT);
    40544384                }
     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
    40554394                /* force to enable the first line-out; the others are set up
    40564395                 * in unsol_event
     
    40594398                                AC_PINCTL_OUT_EN);
    40604399                /* 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]);
    40634401        } else {
    40644402                stac92xx_auto_init_multi_out(codec);
     
    40664404                for (i = 0; i < cfg->hp_outs; i++)
    40674405                        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);
    40684414        }
    40694415        for (i = 0; i < AUTO_PIN_LAST; i++) {
     
    40734419                        if (i == AUTO_PIN_MIC || i == AUTO_PIN_FRONT_MIC) {
    40744420                                /* for mic pins, force to initialize */
    4075                                 pinctl = stac92xx_get_vref(codec, nid);
     4421                                pinctl = stac92xx_get_default_vref(codec, nid);
    40764422                                pinctl |= AC_PINCTL_IN_EN;
    40774423                                stac92xx_auto_set_pinctl(codec, nid, pinctl);
     
    40804426                                        AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
    40814427                                /* 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;
    40834434                                        pinctl |= AC_PINCTL_IN_EN;
    40844435                                        stac92xx_auto_set_pinctl(codec, nid,
     
    40884439                        conf = snd_hda_codec_get_pincfg(codec, nid);
    40894440                        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);
    40944444                        }
    40954445                }
     
    41364486                        continue;
    41374487                }
    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);
    41424490        }
    41434491        if (spec->dac_list)
     
    41484496static void stac92xx_free_jacks(struct hda_codec *codec)
    41494497{
    4150 #ifdef CONFIG_SND_JACK
     4498#ifdef CONFIG_SND_HDA_INPUT_JACK
    41514499        /* free jack instances manually when clearing/reconfiguring */
    41524500        struct sigmatel_spec *spec = codec->spec;
     
    42424590        return 0;
    42434591}
     4592
     4593static 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}
    42444634
    42454635/* return non-zero if the hp-pin of the given array index isn't
     
    42954685                        stac92xx_reset_pinctl(codec, cfg->line_out_pins[i],
    42964686                                                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);
    43044687        } else {
    43054688                /* enable lineouts */
     
    43104693                        stac92xx_set_pinctl(codec, cfg->line_out_pins[i],
    43114694                                                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);
    43204697        /* toggle hp outs */
    43214698        for (i = 0; i < cfg->hp_outs; i++) {
     
    44024779}
    44034780
    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);
     4781static 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
     4800static void stac_issue_unsol_event(struct hda_codec *codec, hda_nid_t nid)
     4801{
     4802        struct sigmatel_event *event = stac_get_event(codec, nid);
    44084803        if (!event)
    44094804                return;
     
    44244819        switch (event->type) {
    44254820        case STAC_HP_EVENT:
     4821        case STAC_LO_EVENT:
    44264822                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:
    44284833        case STAC_INSERT_EVENT:
    44294834        case STAC_PWR_EVENT:
     
    45164921        /* fake event to set up pins again to override cached values */
    45174922        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]);
    45204924        return 0;
    45214925}
    45224926
    4523 
    45244927/*
    4525  * using power check for controlling mute led of HP HDX notebooks
     4928 * using power check for controlling mute led of HP notebooks
    45264929 * check for mute state only on Speakers (nid = 0x10)
    45274930 *
    45284931 * For this feature CONFIG_SND_HDA_POWER_SAVE is needed, otherwise
    45294932 * 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.
    45304936 */
    45314937
    45324938#ifdef CONFIG_SND_HDA_POWER_SAVE
    4533 static int stac92xx_hp_hdx_check_power_status(struct hda_codec *codec,
     4939static int stac92xx_hp_check_power_status(struct hda_codec *codec,
    45344940                                              hda_nid_t nid)
    45354941{
     
    45394945                if (snd_hda_codec_amp_read(codec, nid, 0, HDA_OUTPUT, 0) &
    45404946                    HDA_AMP_MUTE)
    4541                         spec->gpio_data &= ~0x08; /* orange */
     4947                        spec->gpio_data &= ~spec->gpio_led; /* orange */
    45424948                else
    4543                         spec->gpio_data |= 0x08;  /* white */
     4949                        spec->gpio_data |= spec->gpio_led; /* white */
    45444950
    45454951                stac_gpio_set(codec, spec->gpio_mask,
     
    45554961{
    45564962        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
    45574976        if (spec->eapd_mask)
    45584977                stac_gpio_set(codec, spec->gpio_mask,
     
    45915010                                                        stac9200_cfg_tbl);
    45925011        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);
    45945014        else
    45955015                stac92xx_set_config_regs(codec,
     
    46635083 again:
    46645084        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);
    46675087        else
    46685088                stac92xx_set_config_regs(codec,
     
    46945114        spec->init = stac925x_core_init;
    46955115        spec->mixer = stac925x_mixer;
     5116        spec->num_caps = 1;
     5117        spec->capvols = stac925x_capvols;
     5118        spec->capsws = stac925x_capsws;
    46965119
    46975120        err = stac92xx_parse_auto_config(codec, 0x8, 0x7);
     
    47145137        return 0;
    47155138}
    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 };
    47265139
    47275140static int patch_stac92hd73xx(struct hda_codec *codec)
     
    47465159again:
    47475160        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);
    47505163        else
    47515164                stac92xx_set_config_regs(codec,
     
    47945207        spec->num_adcs = ARRAY_SIZE(stac92hd73xx_adc_nids);
    47955208        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;
    47985213
    47995214        switch (spec->board_config) {
     
    48165231                        snd_hda_codec_set_pincfg(codec, 0x0b, 0x90A70170);
    48175232                        spec->num_dmics = 0;
    4818                         spec->private_dimux.num_items = 1;
    48195233                        break;
    48205234                case STAC_DELL_M6_DMIC: /* Digital Mics */
    48215235                        snd_hda_codec_set_pincfg(codec, 0x13, 0x90A60160);
    48225236                        spec->num_dmics = 1;
    4823                         spec->private_dimux.num_items = 2;
    48245237                        break;
    48255238                case STAC_DELL_M6_BOTH: /* Both */
     
    48275240                        snd_hda_codec_set_pincfg(codec, 0x13, 0x90A60160);
    48285241                        spec->num_dmics = 1;
    4829                         spec->private_dimux.num_items = 2;
    48305242                        break;
    48315243                }
     
    48355247                spec->num_smuxes = ARRAY_SIZE(stac92hd73xx_smux_nids);
    48365248                spec->eapd_switch = 1;
     5249                break;
    48375250        }
    48385251        if (spec->board_config > STAC_92HD73XX_REF) {
     
    48415254                spec->gpio_data = 0x01;
    48425255        }
    4843         spec->dinput_mux = &spec->private_dimux;
    48445256
    48455257        spec->num_pwrs = ARRAY_SIZE(stac92hd73xx_pwr_nids);
     
    48735285}
    48745286
    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 
    48845287static int patch_stac92hd83xxx(struct hda_codec *codec)
    48855288{
     
    48985301        spec->mono_nid = 0x19;
    48995302        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);
    49025305        spec->adc_nids = stac92hd83xxx_adc_nids;
     5306        spec->num_adcs = ARRAY_SIZE(stac92hd83xxx_adc_nids);
    49035307        spec->pwr_nids = stac92hd83xxx_pwr_nids;
    4904         spec->amp_nids = stac92hd83xxx_amp_nids;
    49055308        spec->pwr_mapping = stac92hd83xxx_pwr_mapping;
    49065309        spec->num_pwrs = ARRAY_SIZE(stac92hd83xxx_pwr_nids);
     
    49085311
    49095312        spec->init = stac92hd83xxx_core_init;
    4910         spec->mixer = stac92hd83xxx_mixer;
    49115313        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;
    49175314        spec->pin_nids = stac92hd83xxx_pin_nids;
     5315        spec->num_caps = STAC92HD83XXX_NUM_CAPS;
     5316        spec->capvols = stac92hd83xxx_capvols;
     5317        spec->capsws = stac92hd83xxx_capsws;
     5318
    49185319        spec->board_config = snd_hda_check_board_config(codec,
    49195320                                                        STAC_92HD83XXX_MODELS,
     
    49225323again:
    49235324        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);
    49265327        else
    49275328                stac92xx_set_config_regs(codec,
     
    49655366        num_dacs = snd_hda_get_connections(codec, nid,
    49665367                                conn, STAC92HD83_DAC_COUNT + 1) - 1;
     5368        if (num_dacs < 0)
     5369                num_dacs = STAC92HD83_DAC_COUNT;
    49675370
    49685371        /* set port X to select the last DAC
     
    49775380        return 0;
    49785381}
    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 };
    49985382
    49995383/* get the pin connection (fixed, none, etc) */
     
    50575441        struct hda_verb *unmute_init = stac92hd71bxx_unmute_core_init;
    50585442        int err = 0;
    5059         unsigned int ndmic_nids = 0;
    50605443
    50615444        spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
     
    50865469again:
    50875470        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);
    50905473        else
    50915474                stac92xx_set_config_regs(codec,
     
    51015484        spec->dmic_nids = stac92hd71bxx_dmic_nids;
    51025485        spec->dmux_nids = stac92hd71bxx_dmux_nids;
     5486
     5487        spec->num_caps = STAC92HD71BXX_NUM_CAPS;
     5488        spec->capvols = stac92hd71bxx_capvols;
     5489        spec->capsws = stac92hd71bxx_capsws;
    51035490
    51045491        switch (codec->vendor_id) {
     
    51095496        case 0x111d76b4: /* 6 Port without Analog Mixer */
    51105497        case 0x111d76b5:
    5111                 memcpy(&spec->private_dimux, &stac92hd71bxx_dmux_nomixer,
    5112                        sizeof(stac92hd71bxx_dmux_nomixer));
    5113                 spec->mixer = stac92hd71bxx_mixer;
    51145498                spec->init = stac92hd71bxx_core_init;
    51155499                codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs;
     
    51175501                                        stac92hd71bxx_dmic_nids,
    51185502                                        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                 }
    51245503                break;
    51255504        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--;
    51295505                switch (spec->board_config) {
    51305506                case STAC_HP_M4:
     
    51485524                /* no output amps */
    51495525                spec->num_pwrs = 0;
    5150                 spec->mixer = stac92hd71bxx_analog_mixer;
    5151                 spec->dinput_mux = &spec->private_dimux;
    5152 
    51535526                /* disable VSW */
    5154                 spec->init = &stac92hd71bxx_analog_core_init[HD_DISABLE_PORTF];
     5527                spec->init = stac92hd71bxx_core_init;
    51555528                unmute_init++;
    51565529                snd_hda_codec_set_pincfg(codec, 0x0f, 0x40f000f0);
     
    51605533                                        stac92hd71bxx_dmic_nids,
    51615534                                        STAC92HD71BXX_NUM_DMICS - 1);
    5162                 spec->num_dmuxes = ARRAY_SIZE(stac92hd71bxx_dmux_nids);
    5163                 ndmic_nids = ARRAY_SIZE(stac92hd71bxx_dmic_nids) - 2;
    51645535                break;
    51655536        case 0x111d7603: /* 6 Port with Analog Mixer */
     
    51715542                /* fallthru */
    51725543        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;
    51785545                codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs;
    51795546                spec->num_dmics = stac92hd71bxx_connected_ports(codec,
    51805547                                        stac92hd71bxx_dmic_nids,
    51815548                                        STAC92HD71BXX_NUM_DMICS);
    5182                 spec->num_dmuxes = ARRAY_SIZE(stac92hd71bxx_dmux_nids);
    5183                 ndmic_nids = ARRAY_SIZE(stac92hd71bxx_dmic_nids) - 1;
     5549                break;
    51845550        }
    51855551
    51865552        if (get_wcaps(codec, 0xa) & AC_WCAP_IN_AMP)
    51875553                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        }
    51885563
    51895564        spec->aloopback_ctl = stac92hd71bxx_loopback;
     
    52005575        spec->num_muxes = ARRAY_SIZE(stac92hd71bxx_mux_nids);
    52015576        spec->num_adcs = ARRAY_SIZE(stac92hd71bxx_adc_nids);
     5577        spec->num_dmuxes = ARRAY_SIZE(stac92hd71bxx_dmux_nids);
    52025578        spec->num_smuxes = stac92hd71bxx_connected_smuxes(codec, 0x1e);
    52035579
     
    52205596                spec->num_dmuxes = 1;
    52215597                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 */
    52225607        case STAC_HP_DV5:
    52235608                snd_hda_codec_set_pincfg(codec, 0x0d, 0x90170010);
     
    52285613                spec->num_dmuxes = 1;
    52295614                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
    52345620#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;
    52405625                /* register check_power_status callback. */
    52415626                codec->patch_ops.check_power_status =
    5242                     stac92xx_hp_hdx_check_power_status;
     5627                        stac92xx_hp_check_power_status;
     5628        }
    52435629#endif 
    5244                 break;
    5245         };
    52465630
    52475631        spec->multiout.dac_nids = spec->dac_nids;
    5248         if (spec->dinput_mux)
    5249                 spec->private_dimux.num_items += spec->num_dmics - ndmic_nids;
    52505632
    52515633        err = stac92xx_parse_auto_config(codec, 0x21, 0);
     
    52685650
    52695651        return 0;
    5270 };
     5652}
    52715653
    52725654static int patch_stac922x(struct hda_codec *codec)
     
    53255707 again:
    53265708        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);
    53295711        else
    53305712                stac92xx_set_config_regs(codec,
     
    53395721
    53405722        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;
    53425727
    53435728        spec->multiout.dac_nids = spec->dac_nids;
     
    53885773 again:
    53895774        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);
    53925777        else
    53935778                stac92xx_set_config_regs(codec,
     
    54145799
    54155800                spec->init = d965_core_init;
    5416                 spec->mixer = stac927x_mixer;
    54175801                break;
    54185802        case STAC_DELL_BIOS:
     
    54235807                        snd_hda_codec_set_pincfg(codec, 0x21, 0x01442070);
    54245808                        break;
    5425                 };
     5809                }
    54265810                /* configure the analog microphone on some laptops */
    54275811                snd_hda_codec_set_pincfg(codec, 0x0c, 0x90a79130);
     
    54355819                spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x04;
    54365820                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                };
    54375828                spec->dmic_nids = stac927x_dmic_nids;
    54385829                spec->num_dmics = STAC927X_NUM_DMICS;
    54395830
    54405831                spec->init = d965_core_init;
    5441                 spec->mixer = stac927x_mixer;
    54425832                spec->dmux_nids = stac927x_dmux_nids;
    54435833                spec->num_dmuxes = ARRAY_SIZE(stac927x_dmux_nids);
     
    54525842
    54535843                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;
    54565849
    54575850        spec->num_pwrs = 0;
     
    55165909 again:
    55175910        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);
    55195913        else
    55205914                stac92xx_set_config_regs(codec,
     
    55355929
    55365930        spec->init = stac9205_core_init;
    5537         spec->mixer = stac9205_mixer;
    55385931        spec->aloopback_ctl = stac9205_loopback;
     5932
     5933        spec->num_caps = STAC9205_NUM_CAPS;
     5934        spec->capvols = stac9205_capvols;
     5935        spec->capsws = stac9205_capsws;
    55395936
    55405937        spec->aloopback_mask = 0x40;
     
    56126009};
    56136010
    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 
    56206011static hda_nid_t stac9872_pin_nids[] = {
    56216012        0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
     
    56306021        0x15
    56316022};
     6023
     6024static unsigned long stac9872_capvols[] = {
     6025        HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
     6026};
     6027#define stac9872_capsws         stac9872_capvols
    56326028
    56336029static unsigned int stac9872_vaio_pin_configs[9] = {
     
    56476043
    56486044static struct snd_pci_quirk stac9872_cfg_tbl[] = {
     6045        SND_PCI_QUIRK_MASK(0x104d, 0xfff0, 0x81e0,
     6046                           "Sony VAIO F/S", STAC_9872_VAIO),
    56496047        {0} /* terminator */
    56506048};
     
    56596057                return -ENOMEM;
    56606058        codec->spec = spec;
     6059        spec->num_pins = ARRAY_SIZE(stac9872_pin_nids);
     6060        spec->pin_nids = stac9872_pin_nids;
    56616061
    56626062        spec->board_config = snd_hda_check_board_config(codec, STAC_9872_MODELS,
     
    56646064                                                        stac9872_cfg_tbl);
    56656065        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);
    56686068        else
    56696069                stac92xx_set_config_regs(codec,
    56706070                                         stac9872_brd_tbl[spec->board_config]);
    56716071
    5672         spec->num_pins = ARRAY_SIZE(stac9872_pin_nids);
    5673         spec->pin_nids = stac9872_pin_nids;
    56746072        spec->multiout.dac_nids = spec->dac_nids;
    56756073        spec->num_adcs = ARRAY_SIZE(stac9872_adc_nids);
     
    56776075        spec->num_muxes = ARRAY_SIZE(stac9872_mux_nids);
    56786076        spec->mux_nids = stac9872_mux_nids;
    5679         spec->mixer = stac9872_mixer;
    56806077        spec->init = stac9872_core_init;
     6078        spec->num_caps = 1;
     6079        spec->capvols = stac9872_capvols;
     6080        spec->capsws = stac9872_capsws;
    56816081
    56826082        err = stac92xx_parse_auto_config(codec, 0x10, 0x12);
     
    57336133        { .id = 0x83847662, .name = "STAC9872AK", .patch = patch_stac9872 },
    57346134        { .id = 0x83847664, .name = "CXD9872AKD", .patch = patch_stac9872 },
     6135        { .id = 0x83847698, .name = "STAC9205", .patch = patch_stac9205 },
    57356136        { .id = 0x838476a0, .name = "STAC9205", .patch = patch_stac9205 },
    57366137        { .id = 0x838476a1, .name = "STAC9205D", .patch = patch_stac9205 },
  • GPL/trunk/alsa-kernel/pci/hda/patch_via.c

    r426 r464  
    206206        /* playback */
    207207        struct hda_multi_out multiout;
    208         hda_nid_t extra_dig_out_nid;
     208        hda_nid_t slave_dig_outs[2];
    209209
    210210        /* capture */
    211211        unsigned int num_adc_nids;
    212212        hda_nid_t *adc_nids;
     213        hda_nid_t mux_nids[3];
    213214        hda_nid_t dig_in_nid;
     215        hda_nid_t dig_in_pin;
    214216
    215217        /* capture source */
     
    320322        snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
    321323                            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);
    322327}
    323328
     
    388393        struct via_spec *spec = codec->spec;
    389394        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]);
    411401}
    412402
     
    732722}
    733723
    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 
    749724static int via_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
    750725                                        struct hda_codec *codec,
     
    754729{
    755730        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
     735static 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);
    769741        return 0;
    770742}
     
    843815                .open = via_dig_playback_pcm_open,
    844816                .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
    846819        },
    847820};
     
    875848                        return err;
    876849                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                 }
    884850        }
    885851        if (spec->dig_in_nid) {
     
    1014980}
    1015981
    1016 static hda_nid_t slave_dig_outs[] = {
    1017         0,
    1018 };
    1019 
    1020982static int via_init(struct hda_codec *codec)
    1021983{
     
    1027989        /* Lydia Add for EAPD enable */
    1028990        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,
    1031993                                            AC_VERB_SET_PIN_WIDGET_CONTROL,
    1032994                                            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,
    1048996                                            AC_VERB_SET_EAPD_BTLENABLE, 0x02);
    1049997                }
     
    10521000                                    AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN);
    10531001
    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;
    10561005
    10571006        return 0;
     
    13541303        if (spec->autocfg.dig_outs)
    13551304                spec->multiout.dig_out_nid = VT1708_DIGOUT_NID;
     1305        spec->dig_in_pin = VT1708_DIGIN_PIN;
    13561306        if (spec->autocfg.dig_in_pin)
    13571307                spec->dig_in_nid = VT1708_DIGIN_NID;
     
    13771327        via_auto_init_hp_out(codec);
    13781328        via_auto_init_analog_input(codec);
     1329        return 0;
     1330}
     1331
     1332static 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        }
    13791356        return 0;
    13801357}
     
    18271804        if (spec->autocfg.dig_outs)
    18281805                spec->multiout.dig_out_nid = VT1709_DIGOUT_NID;
     1806        spec->dig_in_pin = VT1709_DIGIN_PIN;
    18291807        if (spec->autocfg.dig_in_pin)
    18301808                spec->dig_in_nid = VT1709_DIGIN_NID;
     
    18871865                spec->adc_nids = vt1709_adc_nids;
    18881866                spec->num_adc_nids = ARRAY_SIZE(vt1709_adc_nids);
     1867                get_mux_nids(codec);
    18891868                spec->mixers[spec->num_mixers] = vt1709_capture_mixer;
    18901869                spec->num_mixers++;
     
    19801959                spec->adc_nids = vt1709_adc_nids;
    19811960                spec->num_adc_nids = ARRAY_SIZE(vt1709_adc_nids);
     1961                get_mux_nids(codec);
    19821962                spec->mixers[spec->num_mixers] = vt1709_capture_mixer;
    19831963                spec->num_mixers++;
     
    21392119                .open = via_dig_playback_pcm_open,
    21402120                .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
    21422123        },
    21432124};
     
    23752356        if (spec->autocfg.dig_outs)
    23762357                spec->multiout.dig_out_nid = VT1708B_DIGOUT_NID;
     2358        spec->dig_in_pin = VT1708B_DIGIN_PIN;
    23772359        if (spec->autocfg.dig_in_pin)
    23782360                spec->dig_in_nid = VT1708B_DIGIN_NID;
     
    24352417                spec->adc_nids = vt1708B_adc_nids;
    24362418                spec->num_adc_nids = ARRAY_SIZE(vt1708B_adc_nids);
     2419                get_mux_nids(codec);
    24372420                spec->mixers[spec->num_mixers] = vt1708B_capture_mixer;
    24382421                spec->num_mixers++;
     
    24862469                spec->adc_nids = vt1708B_adc_nids;
    24872470                spec->num_adc_nids = ARRAY_SIZE(vt1708B_adc_nids);
     2471                get_mux_nids(codec);
    24882472                spec->mixers[spec->num_mixers] = vt1708B_capture_mixer;
    24892473                spec->num_mixers++;
     
    25912575
    25922576static struct hda_pcm_stream vt1708S_pcm_digital_playback = {
    2593         .substreams = 2,
     2577        .substreams = 1,
    25942578        .channels_min = 2,
    25952579        .channels_max = 2,
     
    25982582                .open = via_dig_playback_pcm_open,
    25992583                .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
    26012586        },
    26022587};
     
    28072792}
    28082793
     2794/* fill out digital output widgets; one for master and one for slave outputs */
     2795static 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
    28092819static int vt1708S_parse_auto_config(struct hda_codec *codec)
    28102820{
    28112821        struct via_spec *spec = codec->spec;
    28122822        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);
    28172825        if (err < 0)
    28182826                return err;
     
    28352843        spec->multiout.max_channels = spec->multiout.num_dacs * 2;
    28362844
    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);
    28412846
    28422847        if (spec->kctls.list)
     
    28572862        { 0x16, HDA_INPUT, 3 },
    28582863        { 0x16, HDA_INPUT, 4 },
    2859         { } /* end */
     2864        {0} /* end */
    28602865};
    28612866#endif
     
    28962901                spec->adc_nids = vt1708S_adc_nids;
    28972902                spec->num_adc_nids = ARRAY_SIZE(vt1708S_adc_nids);
     2903                get_mux_nids(codec);
    28982904                spec->mixers[spec->num_mixers] = vt1708S_capture_mixer;
    28992905                spec->num_mixers++;
     
    30023008                .open = via_dig_playback_pcm_open,
    30033009                .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
    30053012        },
    30063013};
     
    31303137        struct via_spec *spec = codec->spec;
    31313138        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);
    31363141        if (err < 0)
    31373142                return err;
     
    31543159        spec->multiout.max_channels = spec->multiout.num_dacs * 2;
    31553160
    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);
    31603162
    31613163        if (spec->kctls.list)
     
    32173219                spec->adc_nids = vt1702_adc_nids;
    32183220                spec->num_adc_nids = ARRAY_SIZE(vt1702_adc_nids);
     3221                get_mux_nids(codec);
    32193222                spec->mixers[spec->num_mixers] = vt1702_capture_mixer;
    32203223                spec->num_mixers++;
  • GPL/trunk/alsa-kernel/pci/intel8x0.c

    r445 r464  
    357357        unsigned int pos_shift;
    358358        unsigned int last_pos;
    359         unsigned long last_pos_jiffies;
    360         unsigned int jiffy_to_bytes;
    361359        int frags;
    362360        int lvi;
     
    424422
    425423static 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 */
    449447        { 0, }
    450448};
     
    845843                val = ICH_IOCE | ICH_STARTBM;
    846844                ichdev->last_pos = ichdev->position;
    847                 ichdev->last_pos_jiffies = jiffies;
    848845                break;
    849846        case SNDRV_PCM_TRIGGER_SUSPEND:
     
    10491046        }
    10501047        snd_intel8x0_setup_periods(chip, ichdev);
    1051         ichdev->jiffy_to_bytes = (runtime->rate * 4 * ichdev->pos_shift) / HZ;
    10521048        return 0;
    10531049}
     
    10741070                        break;
    10751071        } while (timeout--);
     1072        ptr = ichdev->last_pos;
    10761073        if (ptr1 != 0) {
    10771074                ptr1 <<= ichdev->pos_shift;
    10781075                ptr = ichdev->fragsize1 - ptr1;
    10791076                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;
    10891089        spin_unlock(&chip->reg_lock);
    10901090        if (ptr >= ichdev->size)
  • GPL/trunk/alsa-kernel/pci/korg1212/korg1212.c

    r410 r464  
    12391239        .info =              (SNDRV_PCM_INFO_MMAP |
    12401240                              SNDRV_PCM_INFO_MMAP_VALID |
    1241                               SNDRV_PCM_INFO_INTERLEAVED),
     1241                              SNDRV_PCM_INFO_INTERLEAVED |
     1242                              SNDRV_PCM_INFO_BATCH),
    12421243        .formats =            SNDRV_PCM_FMTBIT_S16_LE,
    12431244        .rates =              (SNDRV_PCM_RATE_44100 |
     
    12591260        .info =              (SNDRV_PCM_INFO_MMAP |
    12601261                              SNDRV_PCM_INFO_MMAP_VALID |
    1261                               SNDRV_PCM_INFO_INTERLEAVED),
     1262                              SNDRV_PCM_INFO_INTERLEAVED |
     1263                              SNDRV_PCM_INFO_BATCH),
    12621264        .formats =            SNDRV_PCM_FMTBIT_S16_LE,
    12631265        .rates =              (SNDRV_PCM_RATE_44100 |
  • GPL/trunk/alsa-kernel/pci/nm256/nm256.c

    r410 r464  
    264264 */
    265265static struct pci_device_id snd_nm256_ids[] = {
    266         {PCI_VENDOR_ID_NEOMAGIC, PCI_DEVICE_ID_NEOMAGIC_NM256AV_AUDIO, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
    267         {PCI_VENDOR_ID_NEOMAGIC, PCI_DEVICE_ID_NEOMAGIC_NM256ZX_AUDIO, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
    268         {PCI_VENDOR_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},
    269269        {0,},
    270270};
  • GPL/trunk/alsa-kernel/pci/rme96.c

    r410 r464  
    233233
    234234static 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, },
    243239        { 0, }
    244240};
  • GPL/trunk/alsa-kernel/pci/rme9652/hdsp.c

    r426 r464  
    2929#include <linux/firmware.h>
    3030#include <linux/moduleparam.h>
     31#include <linux/math64.h>
    3132
    3233#include <sound/core.h>
     
    403404#define HDSP_DMA_AREA_KILOBYTES (HDSP_DMA_AREA_BYTES/1024)
    404405
    405 /* use hotplug firmeare loader? */
     406/* use hotplug firmware loader? */
    406407#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)
    408409#define HDSP_FW_LOADER
    409410#endif
     
    10481049{
    10491050        u64 n;
    1050         u32 r;
    10511051
    10521052        if (rate >= 112000)
     
    10561056
    10571057        n = DDS_NUMERATOR;
    1058         div64_32(&n, rate, &r);
     1058        n = div_u64(n, rate);
    10591059        /* n should be less than 2^32 for being written to FREQ register */
    10601060        snd_BUG_ON(n >> 32);
     
    30983098{
    30993099        u64 n;
    3100         u32 r;
    31013100        unsigned int dds_value = hdsp->dds_value;
    31023101        int system_sample_rate = hdsp->system_sample_rate;
     
    31103109         * rate = n / dds_value
    31113110         */
    3112         div64_32(&n, dds_value, &r);
     3111        n = div_u64(n, dds_value);
    31133112        if (system_sample_rate >= 112000)
    31143113                n *= 4;
     
    32963295        int x;
    32973296
    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");
    33003315                return;
    3301         }
     3316        }
    33023317
    33033318        if (hdsp_check_for_firmware(hdsp, 0)) {
    33043319                if (hdsp->state & HDSP_FirmwareCached) {
    33053320                        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");
    33073324                                return;
    33083325                        }
     
    33213338        }
    33223339
    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);
    33353340        snd_iprintf(buffer, "FIFO status: %d\n", hdsp_read(hdsp, HDSP_fifoStatus) & 0xff);
    33363341        snd_iprintf(buffer, "MIDI1 Output status: 0x%x\n", hdsp_read(hdsp, HDSP_midiStatusOut0));
     
    33523357
    33533358        snd_iprintf(buffer, "\n");
    3354 
    33553359
    33563360        switch (hdsp_clock_source(hdsp)) {
  • GPL/trunk/alsa-kernel/pci/rme9652/hdspm.c

    r426 r464  
    3030#include <linux/slab.h>
    3131#include <linux/pci.h>
     32#include <linux/math64.h>
    3233#include <asm/io.h>
    3334
     
    832833{
    833834        u64 n;
    834         u32 r;
    835835       
    836836        if (rate >= 112000)
     
    845845        /* n = 104857600000000ULL; */ /*  =  2^20 * 10^8 */
    846846        n = 110100480000000ULL;    /* Value checked for AES32 and MADI */
    847         div64_32(&n, rate, &r);
     847        n = div_u64(n, rate);
    848848        /* n should be less than 2^32 for being written to FREQ register */
    849849        snd_BUG_ON(n >> 32);
  • GPL/trunk/alsa-kernel/pci/sonicvibes.c

    r426 r464  
    244244
    245245static 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, },
    247247        { 0, }
    248248};
  • GPL/trunk/alsa-kernel/pci/via82xx.c

    r426 r464  
    8686static char *ac97_quirk;
    8787static int dxs_support;
     88static int nodelay;
    8889
    8990module_param(index, int, 0444);
     
    103104module_param(dxs_support, int, 0444);
    104105MODULE_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)");
     106module_param(nodelay, int, 0444);
     107MODULE_PARM_DESC(nodelay, "Disable 500ms init delay");
    105108
    106109/* just for backward compatibility */
     
    400403static struct pci_device_id snd_via82xx_ids[] = {
    401404        /* 0x1106, 0x3058 */
    402         { PCI_VENDOR_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 */
    403406        /* 0x1106, 0x3059 */
    404         { PCI_VENDOR_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 */
    405408        { 0, }
    406409};
     
    550553        err = snd_via82xx_codec_ready(chip, ac97->num);
    551554        /* here we need to wait fairly for long time.. */
    552         msleep(500);
     555        if (!nodelay)
     556                msleep(500);
    553557}
    554558
  • GPL/trunk/alsa-kernel/pci/ymfpci/ymfpci.c

    r410 r464  
    6868
    6969static 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 */
    7676        { 0, }
    7777};
  • GPL/trunk/alsa-kernel/pci/ymfpci/ymfpci_main.c

    r445 r464  
    835835        if (status & 1) {
    836836                if (chip->timer)
    837                         snd_timer_interrupt(chip->timer, chip->timer->sticks);
     837                        snd_timer_interrupt(chip->timer, chip->timer_ticks);
    838838        }
    839839        snd_ymfpci_writew(chip, YDSXGR_INTFLAG, status);
     
    18861886
    18871887        chip = snd_timer_chip(timer);
    1888         count = (timer->sticks << 1) - 1;
    18891888        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        }
    18901900        snd_ymfpci_writew(chip, YDSXGR_TIMERCOUNT, count);
    18911901        snd_ymfpci_writeb(chip, YDSXGR_TIMERCTRL, 0x03);
     
    19101920{
    19111921        *num = 1;
    1912         *den = 48000;
     1922        *den = 96000;
    19131923        return 0;
    19141924}
     
    19161926static struct snd_timer_hardware snd_ymfpci_timer_hw = {
    19171927        .flags = SNDRV_TIMER_HW_AUTO,
    1918         .resolution = 20833, /* 1/fs = 20.8333...us */
    1919         .ticks = 0x8000,
     1928        .resolution = 10417, /* 1 / 96 kHz = 10.41666...us */
     1929        .ticks = 0x10000,
    19201930        .start = snd_ymfpci_timer_start,
    19211931        .stop = snd_ymfpci_timer_stop,
Note: See TracChangeset for help on using the changeset viewer.