Linux Audio

Check our new training course

Loading...
v6.13.7
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3 * Universal Interface for Intel High Definition Audio Codec
   4 *
   5 * HD audio interface patch for SigmaTel STAC92xx
   6 *
   7 * Copyright (c) 2005 Embedded Alley Solutions, Inc.
   8 * Matt Porter <mporter@embeddedalley.com>
   9 *
  10 * Based on patch_cmedia.c and patch_realtek.c
  11 * Copyright (c) 2004 Takashi Iwai <tiwai@suse.de>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  12 */
  13
  14#include <linux/init.h>
  15#include <linux/delay.h>
  16#include <linux/slab.h>
  17#include <linux/pci.h>
  18#include <linux/dmi.h>
  19#include <linux/module.h>
  20#include <sound/core.h>
 
  21#include <sound/jack.h>
  22#include <sound/hda_codec.h>
 
  23#include "hda_local.h"
  24#include "hda_auto_parser.h"
  25#include "hda_beep.h"
  26#include "hda_jack.h"
  27#include "hda_generic.h"
  28
  29enum {
 
 
 
 
 
 
 
 
 
 
  30	STAC_REF,
  31	STAC_9200_OQO,
  32	STAC_9200_DELL_D21,
  33	STAC_9200_DELL_D22,
  34	STAC_9200_DELL_D23,
  35	STAC_9200_DELL_M21,
  36	STAC_9200_DELL_M22,
  37	STAC_9200_DELL_M23,
  38	STAC_9200_DELL_M24,
  39	STAC_9200_DELL_M25,
  40	STAC_9200_DELL_M26,
  41	STAC_9200_DELL_M27,
  42	STAC_9200_M4,
  43	STAC_9200_M4_2,
  44	STAC_9200_PANASONIC,
  45	STAC_9200_EAPD_INIT,
  46	STAC_9200_MODELS
  47};
  48
  49enum {
 
  50	STAC_9205_REF,
  51	STAC_9205_DELL_M42,
  52	STAC_9205_DELL_M43,
  53	STAC_9205_DELL_M44,
  54	STAC_9205_EAPD,
  55	STAC_9205_MODELS
  56};
  57
  58enum {
 
  59	STAC_92HD73XX_NO_JD, /* no jack-detection */
  60	STAC_92HD73XX_REF,
  61	STAC_92HD73XX_INTEL,
  62	STAC_DELL_M6_AMIC,
  63	STAC_DELL_M6_DMIC,
  64	STAC_DELL_M6_BOTH,
  65	STAC_DELL_EQ,
  66	STAC_ALIENWARE_M17X,
  67	STAC_ELO_VUPOINT_15MX,
  68	STAC_92HD89XX_HP_FRONT_JACK,
  69	STAC_92HD89XX_HP_Z1_G2_RIGHT_MIC_JACK,
  70	STAC_92HD73XX_ASUS_MOBO,
  71	STAC_92HD73XX_MODELS
  72};
  73
  74enum {
 
  75	STAC_92HD83XXX_REF,
  76	STAC_92HD83XXX_PWR_REF,
  77	STAC_DELL_S14,
  78	STAC_DELL_VOSTRO_3500,
  79	STAC_92HD83XXX_HP_cNB11_INTQUAD,
  80	STAC_HP_DV7_4000,
  81	STAC_HP_ZEPHYR,
  82	STAC_92HD83XXX_HP_LED,
  83	STAC_92HD83XXX_HP_INV_LED,
  84	STAC_92HD83XXX_HP_MIC_LED,
  85	STAC_HP_LED_GPIO10,
  86	STAC_92HD83XXX_HEADSET_JACK,
  87	STAC_92HD83XXX_HP,
  88	STAC_HP_ENVY_BASS,
  89	STAC_HP_BNB13_EQ,
  90	STAC_HP_ENVY_TS_BASS,
  91	STAC_HP_ENVY_TS_DAC_BIND,
  92	STAC_92HD83XXX_GPIO10_EAPD,
  93	STAC_92HD83XXX_MODELS
  94};
  95
  96enum {
 
  97	STAC_92HD71BXX_REF,
  98	STAC_DELL_M4_1,
  99	STAC_DELL_M4_2,
 100	STAC_DELL_M4_3,
 101	STAC_HP_M4,
 102	STAC_HP_DV4,
 103	STAC_HP_DV5,
 104	STAC_HP_HDX,
 105	STAC_92HD71BXX_HP,
 106	STAC_92HD71BXX_NO_DMIC,
 107	STAC_92HD71BXX_NO_SMUX,
 108	STAC_92HD71BXX_MODELS
 109};
 110
 111enum {
 112	STAC_92HD95_HP_LED,
 113	STAC_92HD95_HP_BASS,
 114	STAC_92HD95_MODELS
 115};
 116
 117enum {
 118	STAC_925x_REF,
 119	STAC_M1,
 120	STAC_M1_2,
 121	STAC_M2,
 122	STAC_M2_2,
 123	STAC_M3,
 124	STAC_M5,
 125	STAC_M6,
 126	STAC_925x_MODELS
 127};
 128
 129enum {
 
 130	STAC_D945_REF,
 131	STAC_D945GTP3,
 132	STAC_D945GTP5,
 133	STAC_INTEL_MAC_V1,
 134	STAC_INTEL_MAC_V2,
 135	STAC_INTEL_MAC_V3,
 136	STAC_INTEL_MAC_V4,
 137	STAC_INTEL_MAC_V5,
 138	STAC_INTEL_MAC_AUTO,
 
 
 
 
 
 
 
 
 
 139	STAC_ECS_202,
 140	STAC_922X_DELL_D81,
 141	STAC_922X_DELL_D82,
 142	STAC_922X_DELL_M81,
 143	STAC_922X_DELL_M82,
 144	STAC_922X_INTEL_MAC_GPIO,
 145	STAC_922X_MODELS
 146};
 147
 148enum {
 
 149	STAC_D965_REF_NO_JD, /* no jack-detection */
 150	STAC_D965_REF,
 151	STAC_D965_3ST,
 152	STAC_D965_5ST,
 153	STAC_D965_5ST_NO_FP,
 154	STAC_D965_VERBS,
 155	STAC_DELL_3ST,
 156	STAC_DELL_BIOS,
 157	STAC_NEMO_DEFAULT,
 158	STAC_DELL_BIOS_AMIC,
 159	STAC_DELL_BIOS_SPDIF,
 160	STAC_927X_DELL_DMIC,
 161	STAC_927X_VOLKNOB,
 162	STAC_927X_MODELS
 163};
 164
 165enum {
 
 166	STAC_9872_VAIO,
 167	STAC_9872_MODELS
 168};
 169
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 170struct sigmatel_spec {
 171	struct hda_gen_spec gen;
 
 172
 
 173	unsigned int eapd_switch: 1;
 
 
 
 
 
 
 174	unsigned int linear_tone_beep:1;
 175	unsigned int headset_jack:1; /* 4-pin headset jack (hp + mono mic) */
 176	unsigned int volknob_init:1; /* special volume-knob initialization */
 177	unsigned int powerdown_adcs:1;
 178	unsigned int have_spdif_mux:1;
 179
 180	/* gpio lines */
 181	unsigned int eapd_mask;
 182	unsigned int gpio_mask;
 183	unsigned int gpio_dir;
 184	unsigned int gpio_data;
 185	unsigned int gpio_mute;
 186	unsigned int gpio_led;
 187	unsigned int gpio_led_polarity;
 188	unsigned int vref_mute_led_nid; /* pin NID for mute-LED vref control */
 189	unsigned int vref_led;
 190	int default_polarity;
 191
 192	unsigned int mic_mute_led_gpio; /* capture mute LED GPIO */
 193	unsigned int mic_enabled; /* current mic mute state (bitmask) */
 194
 195	/* stream */
 196	unsigned int stream_delay;
 197
 198	/* analog loopback */
 199	const struct snd_kcontrol_new *aloopback_ctl;
 200	unsigned int aloopback;
 201	unsigned char aloopback_mask;
 202	unsigned char aloopback_shift;
 203
 204	/* power management */
 205	unsigned int power_map_bits;
 206	unsigned int num_pwrs;
 
 207	const hda_nid_t *pwr_nids;
 208	unsigned int active_adcs;
 209
 210	/* beep widgets */
 211	hda_nid_t anabeep_nid;
 212	bool beep_power_on;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 213
 214	/* SPDIF-out mux */
 215	const char * const *spdif_labels;
 216	struct hda_input_mux spdif_mux;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 217	unsigned int cur_smux[2];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 218};
 219
 220#define AC_VERB_IDT_SET_POWER_MAP	0x7ec
 221#define AC_VERB_IDT_GET_POWER_MAP	0xfec
 
 
 
 
 
 222
 223static const hda_nid_t stac92hd73xx_pwr_nids[8] = {
 224	0x0a, 0x0b, 0x0c, 0xd, 0x0e,
 225	0x0f, 0x10, 0x11
 226};
 227
 228static const hda_nid_t stac92hd83xxx_pwr_nids[7] = {
 229	0x0a, 0x0b, 0x0c, 0xd, 0x0e,
 230	0x0f, 0x10
 231};
 232
 233static const hda_nid_t stac92hd71bxx_pwr_nids[3] = {
 234	0x0a, 0x0d, 0x0f
 235};
 236
 
 
 
 
 237
 238/*
 239 * PCM hooks
 240 */
 241static void stac_playback_pcm_hook(struct hda_pcm_stream *hinfo,
 242				   struct hda_codec *codec,
 243				   struct snd_pcm_substream *substream,
 244				   int action)
 245{
 246	struct sigmatel_spec *spec = codec->spec;
 247	if (action == HDA_GEN_PCM_ACT_OPEN && spec->stream_delay)
 248		msleep(spec->stream_delay);
 249}
 250
 251static void stac_capture_pcm_hook(struct hda_pcm_stream *hinfo,
 252				  struct hda_codec *codec,
 253				  struct snd_pcm_substream *substream,
 254				  int action)
 255{
 256	struct sigmatel_spec *spec = codec->spec;
 257	int i, idx = 0;
 258
 259	if (!spec->powerdown_adcs)
 260		return;
 
 261
 262	for (i = 0; i < spec->gen.num_all_adcs; i++) {
 263		if (spec->gen.all_adcs[i] == hinfo->nid) {
 264			idx = i;
 265			break;
 266		}
 267	}
 268
 269	switch (action) {
 270	case HDA_GEN_PCM_ACT_OPEN:
 271		msleep(40);
 272		snd_hda_codec_write(codec, hinfo->nid, 0,
 273				    AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
 274		spec->active_adcs |= (1 << idx);
 275		break;
 276	case HDA_GEN_PCM_ACT_CLOSE:
 277		snd_hda_codec_write(codec, hinfo->nid, 0,
 278				    AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
 279		spec->active_adcs &= ~(1 << idx);
 280		break;
 281	}
 282}
 283
 284/*
 285 * Early 2006 Intel Macintoshes with STAC9220X5 codecs seem to have a
 286 * funky external mute control using GPIO pins.
 287 */
 288
 289static void stac_gpio_set(struct hda_codec *codec, unsigned int mask,
 290			  unsigned int dir_mask, unsigned int data)
 291{
 292	unsigned int gpiostate, gpiomask, gpiodir;
 293	hda_nid_t fg = codec->core.afg;
 294
 295	codec_dbg(codec, "%s msk %x dir %x gpio %x\n", __func__, mask, dir_mask, data);
 
 
 296
 297	gpiostate = snd_hda_codec_read(codec, fg, 0,
 298				       AC_VERB_GET_GPIO_DATA, 0);
 299	gpiostate = (gpiostate & ~dir_mask) | (data & dir_mask);
 300
 301	gpiomask = snd_hda_codec_read(codec, fg, 0,
 302				      AC_VERB_GET_GPIO_MASK, 0);
 303	gpiomask |= mask;
 304
 305	gpiodir = snd_hda_codec_read(codec, fg, 0,
 306				     AC_VERB_GET_GPIO_DIRECTION, 0);
 307	gpiodir |= dir_mask;
 308
 309	/* Configure GPIOx as CMOS */
 310	snd_hda_codec_write(codec, fg, 0, 0x7e7, 0);
 
 311
 312	snd_hda_codec_write(codec, fg, 0,
 313			    AC_VERB_SET_GPIO_MASK, gpiomask);
 314	snd_hda_codec_read(codec, fg, 0,
 315			   AC_VERB_SET_GPIO_DIRECTION, gpiodir); /* sync */
 316
 317	msleep(1);
 
 
 318
 319	snd_hda_codec_read(codec, fg, 0,
 320			   AC_VERB_SET_GPIO_DATA, gpiostate); /* sync */
 321}
 322
 323/* hook for controlling mic-mute LED GPIO */
 324static int stac_capture_led_update(struct led_classdev *led_cdev,
 325				   enum led_brightness brightness)
 326{
 327	struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
 328	struct sigmatel_spec *spec = codec->spec;
 329
 330	if (brightness)
 331		spec->gpio_data |= spec->mic_mute_led_gpio;
 332	else
 333		spec->gpio_data &= ~spec->mic_mute_led_gpio;
 334	stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, spec->gpio_data);
 335	return 0;
 336}
 337
 338static int stac_vrefout_set(struct hda_codec *codec,
 339					hda_nid_t nid, unsigned int new_vref)
 340{
 341	int error, pinctl;
 342
 343	codec_dbg(codec, "%s, nid %x ctl %x\n", __func__, nid, new_vref);
 344	pinctl = snd_hda_codec_read(codec, nid, 0,
 345				AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
 
 
 
 346
 347	if (pinctl < 0)
 348		return pinctl;
 
 349
 350	pinctl &= 0xff;
 351	pinctl &= ~AC_PINCTL_VREFEN;
 352	pinctl |= (new_vref & AC_PINCTL_VREFEN);
 353
 354	error = snd_hda_set_pin_ctl_cache(codec, nid, pinctl);
 355	if (error < 0)
 356		return error;
 357
 358	return 1;
 359}
 
 
 360
 361/* prevent codec AFG to D3 state when vref-out pin is used for mute LED */
 362/* this hook is set in stac_setup_gpio() */
 363static unsigned int stac_vref_led_power_filter(struct hda_codec *codec,
 364					       hda_nid_t nid,
 365					       unsigned int power_state)
 366{
 367	if (nid == codec->core.afg && power_state == AC_PWRST_D3)
 368		return AC_PWRST_D1;
 369	return snd_hda_gen_path_power_filter(codec, nid, power_state);
 370}
 371
 372/* update mute-LED accoring to the master switch */
 373static void stac_update_led_status(struct hda_codec *codec, bool muted)
 374{
 375	struct sigmatel_spec *spec = codec->spec;
 
 
 376
 377	if (!spec->gpio_led)
 378		return;
 
 379
 380	/* LED state is inverted on these systems */
 381	if (spec->gpio_led_polarity)
 382		muted = !muted;
 383
 384	if (!spec->vref_mute_led_nid) {
 385		if (muted)
 386			spec->gpio_data |= spec->gpio_led;
 387		else
 388			spec->gpio_data &= ~spec->gpio_led;
 389		stac_gpio_set(codec, spec->gpio_mask,
 390				spec->gpio_dir, spec->gpio_data);
 391	} else {
 392		spec->vref_led = muted ? AC_PINCTL_VREF_50 : AC_PINCTL_VREF_GRD;
 393		stac_vrefout_set(codec,	spec->vref_mute_led_nid,
 394				 spec->vref_led);
 395	}
 396}
 397
 398/* vmaster hook to update mute LED */
 399static int stac_vmaster_hook(struct led_classdev *led_cdev,
 400			     enum led_brightness brightness)
 401{
 402	struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
 403
 404	stac_update_led_status(codec, brightness);
 405	return 0;
 406}
 407
 408/* automute hook to handle GPIO mute and EAPD updates */
 409static void stac_update_outputs(struct hda_codec *codec)
 410{
 411	struct sigmatel_spec *spec = codec->spec;
 412
 413	if (spec->gpio_mute)
 414		spec->gen.master_mute =
 415			!(snd_hda_codec_read(codec, codec->core.afg, 0,
 416				AC_VERB_GET_GPIO_DATA, 0) & spec->gpio_mute);
 417
 418	snd_hda_gen_update_outputs(codec);
 419
 420	if (spec->eapd_mask && spec->eapd_switch) {
 421		unsigned int val = spec->gpio_data;
 422		if (spec->gen.speaker_muted)
 423			val &= ~spec->eapd_mask;
 424		else
 425			val |= spec->eapd_mask;
 426		if (spec->gpio_data != val) {
 427			spec->gpio_data = val;
 428			stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir,
 429				      val);
 430		}
 431	}
 432}
 433
 434static void stac_toggle_power_map(struct hda_codec *codec, hda_nid_t nid,
 435				  bool enable, bool do_write)
 436{
 437	struct sigmatel_spec *spec = codec->spec;
 438	unsigned int idx, val;
 439
 440	for (idx = 0; idx < spec->num_pwrs; idx++) {
 441		if (spec->pwr_nids[idx] == nid)
 442			break;
 443	}
 444	if (idx >= spec->num_pwrs)
 445		return;
 446
 447	idx = 1 << idx;
 
 
 
 448
 449	val = spec->power_map_bits;
 450	if (enable)
 451		val &= ~idx;
 452	else
 453		val |= idx;
 
 
 
 
 
 
 454
 455	/* power down unused output ports */
 456	if (val != spec->power_map_bits) {
 457		spec->power_map_bits = val;
 458		if (do_write)
 459			snd_hda_codec_write(codec, codec->core.afg, 0,
 460					    AC_VERB_IDT_SET_POWER_MAP, val);
 461	}
 462}
 463
 464/* update power bit per jack plug/unplug */
 465static void jack_update_power(struct hda_codec *codec,
 466			      struct hda_jack_callback *jack)
 467{
 468	struct sigmatel_spec *spec = codec->spec;
 469	int i;
 470
 471	if (!spec->num_pwrs)
 472		return;
 
 473
 474	if (jack && jack->nid) {
 475		stac_toggle_power_map(codec, jack->nid,
 476				      snd_hda_jack_detect(codec, jack->nid),
 477				      true);
 478		return;
 479	}
 480
 481	/* update all jacks */
 482	for (i = 0; i < spec->num_pwrs; i++) {
 483		hda_nid_t nid = spec->pwr_nids[i];
 484		if (!snd_hda_jack_tbl_get(codec, nid))
 485			continue;
 486		stac_toggle_power_map(codec, nid,
 487				      snd_hda_jack_detect(codec, nid),
 488				      false);
 489	}
 490
 491	snd_hda_codec_write(codec, codec->core.afg, 0,
 492			    AC_VERB_IDT_SET_POWER_MAP,
 493			    spec->power_map_bits);
 494}
 495
 496static void stac_vref_event(struct hda_codec *codec,
 497			    struct hda_jack_callback *event)
 498{
 499	unsigned int data;
 
 
 
 
 
 500
 501	data = snd_hda_codec_read(codec, codec->core.afg, 0,
 502				  AC_VERB_GET_GPIO_DATA, 0);
 503	/* toggle VREF state based on GPIOx status */
 504	snd_hda_codec_write(codec, codec->core.afg, 0, 0x7e0,
 505			    !!(data & (1 << event->private_data)));
 506}
 507
 508/* initialize the power map and enable the power event to jacks that
 509 * haven't been assigned to automute
 510 */
 511static void stac_init_power_map(struct hda_codec *codec)
 512{
 513	struct sigmatel_spec *spec = codec->spec;
 514	int i;
 515
 516	for (i = 0; i < spec->num_pwrs; i++)  {
 517		hda_nid_t nid = spec->pwr_nids[i];
 518		unsigned int def_conf = snd_hda_codec_get_pincfg(codec, nid);
 519		def_conf = get_defcfg_connect(def_conf);
 520		if (def_conf == AC_JACK_PORT_COMPLEX &&
 521		    spec->vref_mute_led_nid != nid &&
 522		    is_jack_detectable(codec, nid)) {
 523			snd_hda_jack_detect_enable_callback(codec, nid,
 524							    jack_update_power);
 525		} else {
 526			if (def_conf == AC_JACK_PORT_NONE)
 527				stac_toggle_power_map(codec, nid, false, false);
 528			else
 529				stac_toggle_power_map(codec, nid, true, false);
 530		}
 531	}
 532}
 533
 534/*
 535 */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 536
 537static inline bool get_int_hint(struct hda_codec *codec, const char *key,
 538				int *valp)
 539{
 540	return !snd_hda_get_int_hint(codec, key, valp);
 
 
 541}
 542
 543/* override some hints from the hwdep entry */
 544static void stac_store_hints(struct hda_codec *codec)
 545{
 
 546	struct sigmatel_spec *spec = codec->spec;
 547	int val;
 548
 549	if (get_int_hint(codec, "gpio_mask", &spec->gpio_mask)) {
 550		spec->eapd_mask = spec->gpio_dir = spec->gpio_data =
 551			spec->gpio_mask;
 552	}
 553	if (get_int_hint(codec, "gpio_dir", &spec->gpio_dir))
 554		spec->gpio_dir &= spec->gpio_mask;
 555	if (get_int_hint(codec, "gpio_data", &spec->gpio_data))
 556		spec->gpio_data &= spec->gpio_mask;
 557	if (get_int_hint(codec, "eapd_mask", &spec->eapd_mask))
 558		spec->eapd_mask &= spec->gpio_mask;
 559	if (get_int_hint(codec, "gpio_mute", &spec->gpio_mute))
 560		spec->gpio_mute &= spec->gpio_mask;
 561	val = snd_hda_get_bool_hint(codec, "eapd_switch");
 562	if (val >= 0)
 563		spec->eapd_switch = val;
 564}
 565
 566/*
 567 * loopback controls
 568 */
 
 
 
 569
 570#define stac_aloopback_info snd_ctl_boolean_mono_info
 
 
 571
 572static int stac_aloopback_get(struct snd_kcontrol *kcontrol,
 573			      struct snd_ctl_elem_value *ucontrol)
 574{
 575	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
 576	unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
 577	struct sigmatel_spec *spec = codec->spec;
 578
 579	ucontrol->value.integer.value[0] = !!(spec->aloopback &
 580					      (spec->aloopback_mask << idx));
 581	return 0;
 582}
 583
 584static int stac_aloopback_put(struct snd_kcontrol *kcontrol,
 585			      struct snd_ctl_elem_value *ucontrol)
 586{
 587	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
 588	struct sigmatel_spec *spec = codec->spec;
 589	unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
 590	unsigned int dac_mode;
 591	unsigned int val, idx_val;
 592
 593	idx_val = spec->aloopback_mask << idx;
 594	if (ucontrol->value.integer.value[0])
 595		val = spec->aloopback | idx_val;
 596	else
 597		val = spec->aloopback & ~idx_val;
 598	if (spec->aloopback == val)
 599		return 0;
 600
 601	spec->aloopback = val;
 
 
 
 
 
 
 
 
 602
 603	/* Only return the bits defined by the shift value of the
 604	 * first two bytes of the mask
 605	 */
 606	dac_mode = snd_hda_codec_read(codec, codec->core.afg, 0,
 607				      kcontrol->private_value & 0xFFFF, 0x0);
 608	dac_mode >>= spec->aloopback_shift;
 609
 610	if (spec->aloopback & idx_val) {
 611		snd_hda_power_up(codec);
 612		dac_mode |= idx_val;
 613	} else {
 614		snd_hda_power_down(codec);
 615		dac_mode &= ~idx_val;
 
 
 
 
 
 
 616	}
 617
 618	snd_hda_codec_write_cache(codec, codec->core.afg, 0,
 619		kcontrol->private_value >> 16, dac_mode);
 620
 621	return 1;
 622}
 623
 624#define STAC_ANALOG_LOOPBACK(verb_read, verb_write, cnt) \
 625	{ \
 626		.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
 627		.name  = "Analog Loopback", \
 628		.count = cnt, \
 629		.info  = stac_aloopback_info, \
 630		.get   = stac_aloopback_get, \
 631		.put   = stac_aloopback_put, \
 632		.private_value = verb_read | (verb_write << 16), \
 633	}
 634
 635/*
 636 * Mute LED handling on HP laptops
 637 */
 638
 639/* check whether it's a HP laptop with a docking port */
 640static bool hp_bnb2011_with_dock(struct hda_codec *codec)
 641{
 642	if (codec->core.vendor_id != 0x111d7605 &&
 643	    codec->core.vendor_id != 0x111d76d1)
 644		return false;
 645
 646	switch (codec->core.subsystem_id) {
 647	case 0x103c1618:
 648	case 0x103c1619:
 649	case 0x103c161a:
 650	case 0x103c161b:
 651	case 0x103c161c:
 652	case 0x103c161d:
 653	case 0x103c161e:
 654	case 0x103c161f:
 655
 656	case 0x103c162a:
 657	case 0x103c162b:
 658
 659	case 0x103c1630:
 660	case 0x103c1631:
 
 661
 662	case 0x103c1633:
 663	case 0x103c1634:
 664	case 0x103c1635:
 665
 666	case 0x103c3587:
 667	case 0x103c3588:
 668	case 0x103c3589:
 669	case 0x103c358a:
 670
 671	case 0x103c3667:
 672	case 0x103c3668:
 673	case 0x103c3669:
 
 674
 675		return true;
 676	}
 677	return false;
 678}
 
 679
 680static bool hp_blike_system(u32 subsystem_id)
 
 681{
 682	switch (subsystem_id) {
 683	case 0x103c1473: /* HP ProBook 6550b */
 684	case 0x103c1520:
 685	case 0x103c1521:
 686	case 0x103c1523:
 687	case 0x103c1524:
 688	case 0x103c1525:
 689	case 0x103c1722:
 690	case 0x103c1723:
 691	case 0x103c1724:
 692	case 0x103c1725:
 693	case 0x103c1726:
 694	case 0x103c1727:
 695	case 0x103c1728:
 696	case 0x103c1729:
 697	case 0x103c172a:
 698	case 0x103c172b:
 699	case 0x103c307e:
 700	case 0x103c307f:
 701	case 0x103c3080:
 702	case 0x103c3081:
 703	case 0x103c7007:
 704	case 0x103c7008:
 705		return true;
 706	}
 707	return false;
 708}
 709
 710static void set_hp_led_gpio(struct hda_codec *codec)
 711{
 712	struct sigmatel_spec *spec = codec->spec;
 713	unsigned int gpio;
 714
 715	if (spec->gpio_led)
 716		return;
 
 
 717
 718	gpio = snd_hda_param_read(codec, codec->core.afg, AC_PAR_GPIO_CAP);
 719	gpio &= AC_GPIO_IO_COUNT;
 720	if (gpio > 3)
 721		spec->gpio_led = 0x08; /* GPIO 3 */
 722	else
 723		spec->gpio_led = 0x01; /* GPIO 0 */
 724}
 725
 726/*
 727 * This method searches for the mute LED GPIO configuration
 728 * provided as OEM string in SMBIOS. The format of that string
 729 * is HP_Mute_LED_P_G or HP_Mute_LED_P
 730 * where P can be 0 or 1 and defines mute LED GPIO control state (low/high)
 731 * that corresponds to the NOT muted state of the master volume
 732 * and G is the index of the GPIO to use as the mute LED control (0..9)
 733 * If _G portion is missing it is assigned based on the codec ID
 734 *
 735 * So, HP B-series like systems may have HP_Mute_LED_0 (current models)
 736 * or  HP_Mute_LED_0_3 (future models) OEM SMBIOS strings
 737 *
 738 *
 739 * The dv-series laptops don't seem to have the HP_Mute_LED* strings in
 740 * SMBIOS - at least the ones I have seen do not have them - which include
 741 * my own system (HP Pavilion dv6-1110ax) and my cousin's
 742 * HP Pavilion dv9500t CTO.
 743 * Need more information on whether it is true across the entire series.
 744 * -- kunal
 745 */
 746static int find_mute_led_cfg(struct hda_codec *codec, int default_polarity)
 747{
 748	struct sigmatel_spec *spec = codec->spec;
 749	const struct dmi_device *dev = NULL;
 750
 751	if (get_int_hint(codec, "gpio_led", &spec->gpio_led)) {
 752		get_int_hint(codec, "gpio_led_polarity",
 753			     &spec->gpio_led_polarity);
 754		return 1;
 755	}
 756
 757	while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, NULL, dev))) {
 758		if (sscanf(dev->name, "HP_Mute_LED_%u_%x",
 759			   &spec->gpio_led_polarity,
 760			   &spec->gpio_led) == 2) {
 761			unsigned int max_gpio;
 762			max_gpio = snd_hda_param_read(codec, codec->core.afg,
 763						      AC_PAR_GPIO_CAP);
 764			max_gpio &= AC_GPIO_IO_COUNT;
 765			if (spec->gpio_led < max_gpio)
 766				spec->gpio_led = 1 << spec->gpio_led;
 767			else
 768				spec->vref_mute_led_nid = spec->gpio_led;
 769			return 1;
 770		}
 771		if (sscanf(dev->name, "HP_Mute_LED_%u",
 772			   &spec->gpio_led_polarity) == 1) {
 773			set_hp_led_gpio(codec);
 774			return 1;
 775		}
 776		/* BIOS bug: unfilled OEM string */
 777		if (strstr(dev->name, "HP_Mute_LED_P_G")) {
 778			set_hp_led_gpio(codec);
 779			if (default_polarity >= 0)
 780				spec->gpio_led_polarity = default_polarity;
 781			else
 782				spec->gpio_led_polarity = 1;
 783			return 1;
 784		}
 785	}
 786
 787	/*
 788	 * Fallback case - if we don't find the DMI strings,
 789	 * we statically set the GPIO - if not a B-series system
 790	 * and default polarity is provided
 791	 */
 792	if (!hp_blike_system(codec->core.subsystem_id) &&
 793	    (default_polarity == 0 || default_polarity == 1)) {
 794		set_hp_led_gpio(codec);
 795		spec->gpio_led_polarity = default_polarity;
 796		return 1;
 797	}
 798	return 0;
 799}
 800
 801/* check whether a built-in speaker is included in parsed pins */
 802static bool has_builtin_speaker(struct hda_codec *codec)
 803{
 
 804	struct sigmatel_spec *spec = codec->spec;
 805	const hda_nid_t *nid_pin;
 806	int nids, i;
 807
 808	if (spec->gen.autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT) {
 809		nid_pin = spec->gen.autocfg.line_out_pins;
 810		nids = spec->gen.autocfg.line_outs;
 811	} else {
 812		nid_pin = spec->gen.autocfg.speaker_pins;
 813		nids = spec->gen.autocfg.speaker_outs;
 814	}
 815
 816	for (i = 0; i < nids; i++) {
 817		unsigned int def_conf = snd_hda_codec_get_pincfg(codec, nid_pin[i]);
 818		if (snd_hda_get_input_pin_attr(def_conf) == INPUT_PIN_ATTR_INT)
 819			return true;
 820	}
 821	return false;
 822}
 823
 824/*
 825 * PC beep controls
 826 */
 827
 828/* create PC beep volume controls */
 829static int stac_auto_create_beep_ctls(struct hda_codec *codec,
 830						hda_nid_t nid)
 831{
 
 832	struct sigmatel_spec *spec = codec->spec;
 833	u32 caps = query_amp_caps(codec, nid, HDA_OUTPUT);
 834	struct snd_kcontrol_new *knew;
 835	static const struct snd_kcontrol_new abeep_mute_ctl =
 836		HDA_CODEC_MUTE(NULL, 0, 0, 0);
 837	static const struct snd_kcontrol_new dbeep_mute_ctl =
 838		HDA_CODEC_MUTE_BEEP(NULL, 0, 0, 0);
 839	static const struct snd_kcontrol_new beep_vol_ctl =
 840		HDA_CODEC_VOLUME(NULL, 0, 0, 0);
 841
 842	/* check for mute support for the amp */
 843	if ((caps & AC_AMPCAP_MUTE) >> AC_AMPCAP_MUTE_SHIFT) {
 844		const struct snd_kcontrol_new *temp;
 845		if (spec->anabeep_nid == nid)
 846			temp = &abeep_mute_ctl;
 847		else
 848			temp = &dbeep_mute_ctl;
 849		knew = snd_hda_gen_add_kctl(&spec->gen,
 850					    "Beep Playback Switch", temp);
 851		if (!knew)
 852			return -ENOMEM;
 853		knew->private_value =
 854			HDA_COMPOSE_AMP_VAL(nid, 1, 0, HDA_OUTPUT);
 855	}
 856
 857	/* check to see if there is volume support for the amp */
 858	if ((caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT) {
 859		knew = snd_hda_gen_add_kctl(&spec->gen,
 860					    "Beep Playback Volume",
 861					    &beep_vol_ctl);
 862		if (!knew)
 863			return -ENOMEM;
 864		knew->private_value =
 865			HDA_COMPOSE_AMP_VAL(nid, 1, 0, HDA_OUTPUT);
 866	}
 867	return 0;
 868}
 869
 870#ifdef CONFIG_SND_HDA_INPUT_BEEP
 871#define stac_dig_beep_switch_info snd_ctl_boolean_mono_info
 872
 873static int stac_dig_beep_switch_get(struct snd_kcontrol *kcontrol,
 874				    struct snd_ctl_elem_value *ucontrol)
 875{
 876	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
 877	ucontrol->value.integer.value[0] = codec->beep->enabled;
 878	return 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 879}
 880
 881static int stac_dig_beep_switch_put(struct snd_kcontrol *kcontrol,
 882				    struct snd_ctl_elem_value *ucontrol)
 883{
 884	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
 885	return snd_hda_enable_beep_device(codec, ucontrol->value.integer.value[0]);
 
 886}
 887
 888static const struct snd_kcontrol_new stac_dig_beep_ctrl = {
 889	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 890	.name = "Beep Playback Switch",
 891	.info = stac_dig_beep_switch_info,
 892	.get = stac_dig_beep_switch_get,
 893	.put = stac_dig_beep_switch_put,
 894};
 895
 896static int stac_beep_switch_ctl(struct hda_codec *codec)
 897{
 
 898	struct sigmatel_spec *spec = codec->spec;
 899
 900	if (!snd_hda_gen_add_kctl(&spec->gen, NULL, &stac_dig_beep_ctrl))
 901		return -ENOMEM;
 902	return 0;
 903}
 904#endif
 905
 906/*
 907 * SPDIF-out mux controls
 908 */
 909
 910static int stac_smux_enum_info(struct snd_kcontrol *kcontrol,
 911			       struct snd_ctl_elem_info *uinfo)
 912{
 913	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
 914	struct sigmatel_spec *spec = codec->spec;
 915	return snd_hda_input_mux_info(&spec->spdif_mux, uinfo);
 
 
 916}
 917
 918static int stac_smux_enum_get(struct snd_kcontrol *kcontrol,
 919			      struct snd_ctl_elem_value *ucontrol)
 
 
 920{
 921	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
 
 922	struct sigmatel_spec *spec = codec->spec;
 923	unsigned int smux_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
 924
 925	ucontrol->value.enumerated.item[0] = spec->cur_smux[smux_idx];
 
 926	return 0;
 927}
 928
 929static int stac_smux_enum_put(struct snd_kcontrol *kcontrol,
 930			      struct snd_ctl_elem_value *ucontrol)
 931{
 932	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
 933	struct sigmatel_spec *spec = codec->spec;
 934	unsigned int smux_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
 935
 936	return snd_hda_input_mux_put(codec, &spec->spdif_mux, ucontrol,
 937				     spec->gen.autocfg.dig_out_pins[smux_idx],
 938				     &spec->cur_smux[smux_idx]);
 939}
 940
 941static const struct snd_kcontrol_new stac_smux_mixer = {
 942	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 943	.name = "IEC958 Playback Source",
 944	/* count set later */
 945	.info = stac_smux_enum_info,
 946	.get = stac_smux_enum_get,
 947	.put = stac_smux_enum_put,
 948};
 949
 950static const char * const stac_spdif_labels[] = {
 951	"Digital Playback", "Analog Mux 1", "Analog Mux 2", NULL
 952};
 953
 954static int stac_create_spdif_mux_ctls(struct hda_codec *codec)
 955{
 956	struct sigmatel_spec *spec = codec->spec;
 957	struct auto_pin_cfg *cfg = &spec->gen.autocfg;
 958	const char * const *labels = spec->spdif_labels;
 959	struct snd_kcontrol_new *kctl;
 960	int i, num_cons;
 961
 962	if (cfg->dig_outs < 1)
 
 
 
 
 
 963		return 0;
 964
 965	num_cons = snd_hda_get_num_conns(codec, cfg->dig_out_pins[0]);
 966	if (num_cons <= 1)
 967		return 0;
 968
 969	if (!labels)
 970		labels = stac_spdif_labels;
 971	for (i = 0; i < num_cons; i++) {
 972		if (snd_BUG_ON(!labels[i]))
 973			return -EINVAL;
 974		snd_hda_add_imux_item(codec, &spec->spdif_mux, labels[i], i, NULL);
 
 
 
 
 
 
 
 975	}
 976
 977	kctl = snd_hda_gen_add_kctl(&spec->gen, NULL, &stac_smux_mixer);
 978	if (!kctl)
 979		return -ENOMEM;
 980	kctl->count = cfg->dig_outs;
 981
 982	return 0;
 983}
 984
 
 
 
 
 
 
 985static const struct hda_verb stac9200_eapd_init[] = {
 986	/* set dac0mux for dac converter */
 987	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
 988	{0x08, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
 989	{}
 990};
 991
 992static const struct hda_verb dell_eq_core_init[] = {
 993	/* set master volume to max value without distortion
 994	 * and direct control */
 995	{ 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xec},
 996	{}
 997};
 998
 999static const struct hda_verb stac92hd73xx_core_init[] = {
1000	/* set master volume and direct control */
1001	{ 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
1002	{}
1003};
1004
1005static const struct hda_verb stac92hd83xxx_core_init[] = {
1006	/* power state controls amps */
1007	{ 0x01, AC_VERB_SET_EAPD, 1 << 2},
1008	{}
1009};
1010
1011static const struct hda_verb stac92hd83xxx_hp_zephyr_init[] = {
1012	{ 0x22, 0x785, 0x43 },
1013	{ 0x22, 0x782, 0xe0 },
1014	{ 0x22, 0x795, 0x00 },
1015	{}
1016};
1017
1018static const struct hda_verb stac92hd71bxx_core_init[] = {
1019	/* set master volume and direct control */
1020	{ 0x28, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
1021	{}
1022};
1023
1024static const hda_nid_t stac92hd71bxx_unmute_nids[] = {
1025	/* unmute right and left channels for nodes 0x0f, 0xa, 0x0d */
1026	0x0f, 0x0a, 0x0d, 0
 
 
 
1027};
1028
1029static const struct hda_verb stac925x_core_init[] = {
1030	/* set dac0mux for dac converter */
1031	{ 0x06, AC_VERB_SET_CONNECT_SEL, 0x00},
1032	/* mute the master volume */
1033	{ 0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1034	{}
1035};
1036
1037static const struct hda_verb stac922x_core_init[] = {
1038	/* set master volume and direct control */
1039	{ 0x16, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
1040	{}
1041};
1042
1043static const struct hda_verb d965_core_init[] = {
 
 
1044	/* unmute node 0x1b */
1045	{ 0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
1046	/* select node 0x03 as DAC */
1047	{ 0x0b, AC_VERB_SET_CONNECT_SEL, 0x01},
1048	{}
1049};
1050
1051static const struct hda_verb dell_3st_core_init[] = {
1052	/* don't set delta bit */
1053	{0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0x7f},
1054	/* unmute node 0x1b */
1055	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
1056	/* select node 0x03 as DAC */
1057	{0x0b, AC_VERB_SET_CONNECT_SEL, 0x01},
1058	{}
1059};
1060
1061static const struct hda_verb stac927x_core_init[] = {
1062	/* set master volume and direct control */
1063	{ 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
1064	/* enable analog pc beep path */
1065	{ 0x01, AC_VERB_SET_DIGI_CONVERT_2, 1 << 5},
1066	{}
1067};
1068
1069static const struct hda_verb stac927x_volknob_core_init[] = {
1070	/* don't set delta bit */
1071	{0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0x7f},
1072	/* enable analog pc beep path */
1073	{0x01, AC_VERB_SET_DIGI_CONVERT_2, 1 << 5},
1074	{}
1075};
1076
1077static const struct hda_verb stac9205_core_init[] = {
1078	/* set master volume and direct control */
1079	{ 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
1080	/* enable analog pc beep path */
1081	{ 0x01, AC_VERB_SET_DIGI_CONVERT_2, 1 << 5},
1082	{}
1083};
1084
1085static const struct snd_kcontrol_new stac92hd73xx_6ch_loopback =
1086	STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 3);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1087
1088static const struct snd_kcontrol_new stac92hd73xx_8ch_loopback =
1089	STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 4);
 
 
1090
1091static const struct snd_kcontrol_new stac92hd73xx_10ch_loopback =
1092	STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 5);
 
 
1093
1094static const struct snd_kcontrol_new stac92hd71bxx_loopback =
1095	STAC_ANALOG_LOOPBACK(0xFA0, 0x7A0, 2);
1096
1097static const struct snd_kcontrol_new stac9205_loopback =
1098	STAC_ANALOG_LOOPBACK(0xFE0, 0x7E0, 1);
1099
1100static const struct snd_kcontrol_new stac927x_loopback =
1101	STAC_ANALOG_LOOPBACK(0xFEB, 0x7EB, 1);
1102
1103static const struct hda_pintbl ref9200_pin_configs[] = {
1104	{ 0x08, 0x01c47010 },
1105	{ 0x09, 0x01447010 },
1106	{ 0x0d, 0x0221401f },
1107	{ 0x0e, 0x01114010 },
1108	{ 0x0f, 0x02a19020 },
1109	{ 0x10, 0x01a19021 },
1110	{ 0x11, 0x90100140 },
1111	{ 0x12, 0x01813122 },
1112	{}
1113};
1114
1115static const struct hda_pintbl gateway9200_m4_pin_configs[] = {
1116	{ 0x08, 0x400000fe },
1117	{ 0x09, 0x404500f4 },
1118	{ 0x0d, 0x400100f0 },
1119	{ 0x0e, 0x90110010 },
1120	{ 0x0f, 0x400100f1 },
1121	{ 0x10, 0x02a1902e },
1122	{ 0x11, 0x500000f2 },
1123	{ 0x12, 0x500000f3 },
 
 
 
 
1124	{}
1125};
1126
1127static const struct hda_pintbl gateway9200_m4_2_pin_configs[] = {
1128	{ 0x08, 0x400000fe },
1129	{ 0x09, 0x404500f4 },
1130	{ 0x0d, 0x400100f0 },
1131	{ 0x0e, 0x90110010 },
1132	{ 0x0f, 0x400100f1 },
1133	{ 0x10, 0x02a1902e },
1134	{ 0x11, 0x500000f2 },
1135	{ 0x12, 0x500000f3 },
1136	{}
1137};
1138
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1139/*
1140    STAC 9200 pin configs for
1141    102801A8
1142    102801DE
1143    102801E8
1144*/
1145static const struct hda_pintbl dell9200_d21_pin_configs[] = {
1146	{ 0x08, 0x400001f0 },
1147	{ 0x09, 0x400001f1 },
1148	{ 0x0d, 0x02214030 },
1149	{ 0x0e, 0x01014010 },
1150	{ 0x0f, 0x02a19020 },
1151	{ 0x10, 0x01a19021 },
1152	{ 0x11, 0x90100140 },
1153	{ 0x12, 0x01813122 },
1154	{}
1155};
1156
1157/*
1158    STAC 9200 pin configs for
1159    102801C0
1160    102801C1
1161*/
1162static const struct hda_pintbl dell9200_d22_pin_configs[] = {
1163	{ 0x08, 0x400001f0 },
1164	{ 0x09, 0x400001f1 },
1165	{ 0x0d, 0x0221401f },
1166	{ 0x0e, 0x01014010 },
1167	{ 0x0f, 0x01813020 },
1168	{ 0x10, 0x02a19021 },
1169	{ 0x11, 0x90100140 },
1170	{ 0x12, 0x400001f2 },
1171	{}
1172};
1173
1174/*
1175    STAC 9200 pin configs for
1176    102801C4 (Dell Dimension E310)
1177    102801C5
1178    102801C7
1179    102801D9
1180    102801DA
1181    102801E3
1182*/
1183static const struct hda_pintbl dell9200_d23_pin_configs[] = {
1184	{ 0x08, 0x400001f0 },
1185	{ 0x09, 0x400001f1 },
1186	{ 0x0d, 0x0221401f },
1187	{ 0x0e, 0x01014010 },
1188	{ 0x0f, 0x01813020 },
1189	{ 0x10, 0x01a19021 },
1190	{ 0x11, 0x90100140 },
1191	{ 0x12, 0x400001f2 },
1192	{}
1193};
1194
1195
1196/* 
1197    STAC 9200-32 pin configs for
1198    102801B5 (Dell Inspiron 630m)
1199    102801D8 (Dell Inspiron 640m)
1200*/
1201static const struct hda_pintbl dell9200_m21_pin_configs[] = {
1202	{ 0x08, 0x40c003fa },
1203	{ 0x09, 0x03441340 },
1204	{ 0x0d, 0x0321121f },
1205	{ 0x0e, 0x90170310 },
1206	{ 0x0f, 0x408003fb },
1207	{ 0x10, 0x03a11020 },
1208	{ 0x11, 0x401003fc },
1209	{ 0x12, 0x403003fd },
1210	{}
1211};
1212
1213/* 
1214    STAC 9200-32 pin configs for
1215    102801C2 (Dell Latitude D620)
1216    102801C8 
1217    102801CC (Dell Latitude D820)
1218    102801D4 
1219    102801D6 
1220*/
1221static const struct hda_pintbl dell9200_m22_pin_configs[] = {
1222	{ 0x08, 0x40c003fa },
1223	{ 0x09, 0x0144131f },
1224	{ 0x0d, 0x0321121f },
1225	{ 0x0e, 0x90170310 },
1226	{ 0x0f, 0x90a70321 },
1227	{ 0x10, 0x03a11020 },
1228	{ 0x11, 0x401003fb },
1229	{ 0x12, 0x40f000fc },
1230	{}
1231};
1232
1233/* 
1234    STAC 9200-32 pin configs for
1235    102801CE (Dell XPS M1710)
1236    102801CF (Dell Precision M90)
1237*/
1238static const struct hda_pintbl dell9200_m23_pin_configs[] = {
1239	{ 0x08, 0x40c003fa },
1240	{ 0x09, 0x01441340 },
1241	{ 0x0d, 0x0421421f },
1242	{ 0x0e, 0x90170310 },
1243	{ 0x0f, 0x408003fb },
1244	{ 0x10, 0x04a1102e },
1245	{ 0x11, 0x90170311 },
1246	{ 0x12, 0x403003fc },
1247	{}
1248};
1249
1250/*
1251    STAC 9200-32 pin configs for 
1252    102801C9
1253    102801CA
1254    102801CB (Dell Latitude 120L)
1255    102801D3
1256*/
1257static const struct hda_pintbl dell9200_m24_pin_configs[] = {
1258	{ 0x08, 0x40c003fa },
1259	{ 0x09, 0x404003fb },
1260	{ 0x0d, 0x0321121f },
1261	{ 0x0e, 0x90170310 },
1262	{ 0x0f, 0x408003fc },
1263	{ 0x10, 0x03a11020 },
1264	{ 0x11, 0x401003fd },
1265	{ 0x12, 0x403003fe },
1266	{}
1267};
1268
1269/*
1270    STAC 9200-32 pin configs for
1271    102801BD (Dell Inspiron E1505n)
1272    102801EE
1273    102801EF
1274*/
1275static const struct hda_pintbl dell9200_m25_pin_configs[] = {
1276	{ 0x08, 0x40c003fa },
1277	{ 0x09, 0x01441340 },
1278	{ 0x0d, 0x0421121f },
1279	{ 0x0e, 0x90170310 },
1280	{ 0x0f, 0x408003fb },
1281	{ 0x10, 0x04a11020 },
1282	{ 0x11, 0x401003fc },
1283	{ 0x12, 0x403003fd },
1284	{}
1285};
1286
1287/*
1288    STAC 9200-32 pin configs for
1289    102801F5 (Dell Inspiron 1501)
1290    102801F6
1291*/
1292static const struct hda_pintbl dell9200_m26_pin_configs[] = {
1293	{ 0x08, 0x40c003fa },
1294	{ 0x09, 0x404003fb },
1295	{ 0x0d, 0x0421121f },
1296	{ 0x0e, 0x90170310 },
1297	{ 0x0f, 0x408003fc },
1298	{ 0x10, 0x04a11020 },
1299	{ 0x11, 0x401003fd },
1300	{ 0x12, 0x403003fe },
1301	{}
1302};
1303
1304/*
1305    STAC 9200-32
1306    102801CD (Dell Inspiron E1705/9400)
1307*/
1308static const struct hda_pintbl dell9200_m27_pin_configs[] = {
1309	{ 0x08, 0x40c003fa },
1310	{ 0x09, 0x01441340 },
1311	{ 0x0d, 0x0421121f },
1312	{ 0x0e, 0x90170310 },
1313	{ 0x0f, 0x90170310 },
1314	{ 0x10, 0x04a11020 },
1315	{ 0x11, 0x90170310 },
1316	{ 0x12, 0x40f003fc },
1317	{}
1318};
1319
1320static const struct hda_pintbl oqo9200_pin_configs[] = {
1321	{ 0x08, 0x40c000f0 },
1322	{ 0x09, 0x404000f1 },
1323	{ 0x0d, 0x0221121f },
1324	{ 0x0e, 0x02211210 },
1325	{ 0x0f, 0x90170111 },
1326	{ 0x10, 0x90a70120 },
1327	{ 0x11, 0x400000f2 },
1328	{ 0x12, 0x400000f3 },
1329	{}
1330};
1331
1332/*
1333 *  STAC 92HD700
1334 *  18881000 Amigaone X1000
1335 */
1336static const struct hda_pintbl nemo_pin_configs[] = {
1337	{ 0x0a, 0x02214020 },	/* Front panel HP socket */
1338	{ 0x0b, 0x02a19080 },	/* Front Mic */
1339	{ 0x0c, 0x0181304e },	/* Line in */
1340	{ 0x0d, 0x01014010 },	/* Line out */
1341	{ 0x0e, 0x01a19040 },	/* Rear Mic */
1342	{ 0x0f, 0x01011012 },	/* Rear speakers */
1343	{ 0x10, 0x01016011 },	/* Center speaker */
1344	{ 0x11, 0x01012014 },	/* Side speakers (7.1) */
1345	{ 0x12, 0x103301f0 },	/* Motherboard CD line in connector */
1346	{ 0x13, 0x411111f0 },	/* Unused */
1347	{ 0x14, 0x411111f0 },	/* Unused */
1348	{ 0x21, 0x01442170 },	/* S/PDIF line out */
1349	{ 0x22, 0x411111f0 },	/* Unused */
1350	{ 0x23, 0x411111f0 },	/* Unused */
1351	{}
1352};
1353
1354static void stac9200_fixup_panasonic(struct hda_codec *codec,
1355				     const struct hda_fixup *fix, int action)
1356{
1357	struct sigmatel_spec *spec = codec->spec;
1358
1359	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1360		spec->gpio_mask = spec->gpio_dir = 0x09;
1361		spec->gpio_data = 0x00;
1362		/* CF-74 has no headphone detection, and the driver should *NOT*
1363		 * do detection and HP/speaker toggle because the hardware does it.
1364		 */
1365		spec->gen.suppress_auto_mute = 1;
1366	}
1367}
1368
1369
1370static const struct hda_fixup stac9200_fixups[] = {
1371	[STAC_REF] = {
1372		.type = HDA_FIXUP_PINS,
1373		.v.pins = ref9200_pin_configs,
1374	},
1375	[STAC_9200_OQO] = {
1376		.type = HDA_FIXUP_PINS,
1377		.v.pins = oqo9200_pin_configs,
1378		.chained = true,
1379		.chain_id = STAC_9200_EAPD_INIT,
1380	},
1381	[STAC_9200_DELL_D21] = {
1382		.type = HDA_FIXUP_PINS,
1383		.v.pins = dell9200_d21_pin_configs,
1384	},
1385	[STAC_9200_DELL_D22] = {
1386		.type = HDA_FIXUP_PINS,
1387		.v.pins = dell9200_d22_pin_configs,
1388	},
1389	[STAC_9200_DELL_D23] = {
1390		.type = HDA_FIXUP_PINS,
1391		.v.pins = dell9200_d23_pin_configs,
1392	},
1393	[STAC_9200_DELL_M21] = {
1394		.type = HDA_FIXUP_PINS,
1395		.v.pins = dell9200_m21_pin_configs,
1396	},
1397	[STAC_9200_DELL_M22] = {
1398		.type = HDA_FIXUP_PINS,
1399		.v.pins = dell9200_m22_pin_configs,
1400	},
1401	[STAC_9200_DELL_M23] = {
1402		.type = HDA_FIXUP_PINS,
1403		.v.pins = dell9200_m23_pin_configs,
1404	},
1405	[STAC_9200_DELL_M24] = {
1406		.type = HDA_FIXUP_PINS,
1407		.v.pins = dell9200_m24_pin_configs,
1408	},
1409	[STAC_9200_DELL_M25] = {
1410		.type = HDA_FIXUP_PINS,
1411		.v.pins = dell9200_m25_pin_configs,
1412	},
1413	[STAC_9200_DELL_M26] = {
1414		.type = HDA_FIXUP_PINS,
1415		.v.pins = dell9200_m26_pin_configs,
1416	},
1417	[STAC_9200_DELL_M27] = {
1418		.type = HDA_FIXUP_PINS,
1419		.v.pins = dell9200_m27_pin_configs,
1420	},
1421	[STAC_9200_M4] = {
1422		.type = HDA_FIXUP_PINS,
1423		.v.pins = gateway9200_m4_pin_configs,
1424		.chained = true,
1425		.chain_id = STAC_9200_EAPD_INIT,
1426	},
1427	[STAC_9200_M4_2] = {
1428		.type = HDA_FIXUP_PINS,
1429		.v.pins = gateway9200_m4_2_pin_configs,
1430		.chained = true,
1431		.chain_id = STAC_9200_EAPD_INIT,
1432	},
1433	[STAC_9200_PANASONIC] = {
1434		.type = HDA_FIXUP_FUNC,
1435		.v.func = stac9200_fixup_panasonic,
1436	},
1437	[STAC_9200_EAPD_INIT] = {
1438		.type = HDA_FIXUP_VERBS,
1439		.v.verbs = (const struct hda_verb[]) {
1440			{0x08, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
1441			{}
1442		},
1443	},
1444};
1445
1446static const struct hda_model_fixup stac9200_models[] = {
1447	{ .id = STAC_REF, .name = "ref" },
1448	{ .id = STAC_9200_OQO, .name = "oqo" },
1449	{ .id = STAC_9200_DELL_D21, .name = "dell-d21" },
1450	{ .id = STAC_9200_DELL_D22, .name = "dell-d22" },
1451	{ .id = STAC_9200_DELL_D23, .name = "dell-d23" },
1452	{ .id = STAC_9200_DELL_M21, .name = "dell-m21" },
1453	{ .id = STAC_9200_DELL_M22, .name = "dell-m22" },
1454	{ .id = STAC_9200_DELL_M23, .name = "dell-m23" },
1455	{ .id = STAC_9200_DELL_M24, .name = "dell-m24" },
1456	{ .id = STAC_9200_DELL_M25, .name = "dell-m25" },
1457	{ .id = STAC_9200_DELL_M26, .name = "dell-m26" },
1458	{ .id = STAC_9200_DELL_M27, .name = "dell-m27" },
1459	{ .id = STAC_9200_M4, .name = "gateway-m4" },
1460	{ .id = STAC_9200_M4_2, .name = "gateway-m4-2" },
1461	{ .id = STAC_9200_PANASONIC, .name = "panasonic" },
1462	{}
1463};
1464
1465static const struct hda_quirk stac9200_fixup_tbl[] = {
1466	/* SigmaTel reference board */
1467	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1468		      "DFI LanParty", STAC_REF),
1469	SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
1470		      "DFI LanParty", STAC_REF),
1471	/* Dell laptops have BIOS problem */
1472	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a8,
1473		      "unknown Dell", STAC_9200_DELL_D21),
1474	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01b5,
1475		      "Dell Inspiron 630m", STAC_9200_DELL_M21),
1476	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01bd,
1477		      "Dell Inspiron E1505n", STAC_9200_DELL_M25),
1478	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c0,
1479		      "unknown Dell", STAC_9200_DELL_D22),
1480	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c1,
1481		      "unknown Dell", STAC_9200_DELL_D22),
1482	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c2,
1483		      "Dell Latitude D620", STAC_9200_DELL_M22),
1484	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c5,
1485		      "unknown Dell", STAC_9200_DELL_D23),
1486	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c7,
1487		      "unknown Dell", STAC_9200_DELL_D23),
1488	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c8,
1489		      "unknown Dell", STAC_9200_DELL_M22),
1490	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c9,
1491		      "unknown Dell", STAC_9200_DELL_M24),
1492	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ca,
1493		      "unknown Dell", STAC_9200_DELL_M24),
1494	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cb,
1495		      "Dell Latitude 120L", STAC_9200_DELL_M24),
1496	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cc,
1497		      "Dell Latitude D820", STAC_9200_DELL_M22),
1498	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cd,
1499		      "Dell Inspiron E1705/9400", STAC_9200_DELL_M27),
1500	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ce,
1501		      "Dell XPS M1710", STAC_9200_DELL_M23),
1502	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cf,
1503		      "Dell Precision M90", STAC_9200_DELL_M23),
1504	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d3,
1505		      "unknown Dell", STAC_9200_DELL_M22),
1506	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d4,
1507		      "unknown Dell", STAC_9200_DELL_M22),
1508	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d6,
1509		      "unknown Dell", STAC_9200_DELL_M22),
1510	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d8,
1511		      "Dell Inspiron 640m", STAC_9200_DELL_M21),
1512	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d9,
1513		      "unknown Dell", STAC_9200_DELL_D23),
1514	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01da,
1515		      "unknown Dell", STAC_9200_DELL_D23),
1516	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01de,
1517		      "unknown Dell", STAC_9200_DELL_D21),
1518	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01e3,
1519		      "unknown Dell", STAC_9200_DELL_D23),
1520	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01e8,
1521		      "unknown Dell", STAC_9200_DELL_D21),
1522	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ee,
1523		      "unknown Dell", STAC_9200_DELL_M25),
1524	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ef,
1525		      "unknown Dell", STAC_9200_DELL_M25),
1526	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f5,
1527		      "Dell Inspiron 1501", STAC_9200_DELL_M26),
1528	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f6,
1529		      "unknown Dell", STAC_9200_DELL_M26),
1530	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0201,
1531		      "Dell Latitude D430", STAC_9200_DELL_M22),
1532	/* Panasonic */
1533	SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-74", STAC_9200_PANASONIC),
1534	/* Gateway machines needs EAPD to be set on resume */
1535	SND_PCI_QUIRK(0x107b, 0x0205, "Gateway S-7110M", STAC_9200_M4),
1536	SND_PCI_QUIRK(0x107b, 0x0317, "Gateway MT3423, MX341*", STAC_9200_M4_2),
1537	SND_PCI_QUIRK(0x107b, 0x0318, "Gateway ML3019, MT3707", STAC_9200_M4_2),
1538	/* OQO Mobile */
1539	SND_PCI_QUIRK(0x1106, 0x3288, "OQO Model 2", STAC_9200_OQO),
1540	{} /* terminator */
1541};
1542
1543static const struct hda_pintbl ref925x_pin_configs[] = {
1544	{ 0x07, 0x40c003f0 },
1545	{ 0x08, 0x424503f2 },
1546	{ 0x0a, 0x01813022 },
1547	{ 0x0b, 0x02a19021 },
1548	{ 0x0c, 0x90a70320 },
1549	{ 0x0d, 0x02214210 },
1550	{ 0x10, 0x01019020 },
1551	{ 0x11, 0x9033032e },
1552	{}
1553};
1554
1555static const struct hda_pintbl stac925xM1_pin_configs[] = {
1556	{ 0x07, 0x40c003f4 },
1557	{ 0x08, 0x424503f2 },
1558	{ 0x0a, 0x400000f3 },
1559	{ 0x0b, 0x02a19020 },
1560	{ 0x0c, 0x40a000f0 },
1561	{ 0x0d, 0x90100210 },
1562	{ 0x10, 0x400003f1 },
1563	{ 0x11, 0x9033032e },
1564	{}
1565};
1566
1567static const struct hda_pintbl stac925xM1_2_pin_configs[] = {
1568	{ 0x07, 0x40c003f4 },
1569	{ 0x08, 0x424503f2 },
1570	{ 0x0a, 0x400000f3 },
1571	{ 0x0b, 0x02a19020 },
1572	{ 0x0c, 0x40a000f0 },
1573	{ 0x0d, 0x90100210 },
1574	{ 0x10, 0x400003f1 },
1575	{ 0x11, 0x9033032e },
1576	{}
1577};
1578
1579static const struct hda_pintbl stac925xM2_pin_configs[] = {
1580	{ 0x07, 0x40c003f4 },
1581	{ 0x08, 0x424503f2 },
1582	{ 0x0a, 0x400000f3 },
1583	{ 0x0b, 0x02a19020 },
1584	{ 0x0c, 0x40a000f0 },
1585	{ 0x0d, 0x90100210 },
1586	{ 0x10, 0x400003f1 },
1587	{ 0x11, 0x9033032e },
1588	{}
1589};
1590
1591static const struct hda_pintbl stac925xM2_2_pin_configs[] = {
1592	{ 0x07, 0x40c003f4 },
1593	{ 0x08, 0x424503f2 },
1594	{ 0x0a, 0x400000f3 },
1595	{ 0x0b, 0x02a19020 },
1596	{ 0x0c, 0x40a000f0 },
1597	{ 0x0d, 0x90100210 },
1598	{ 0x10, 0x400003f1 },
1599	{ 0x11, 0x9033032e },
1600	{}
1601};
1602
1603static const struct hda_pintbl stac925xM3_pin_configs[] = {
1604	{ 0x07, 0x40c003f4 },
1605	{ 0x08, 0x424503f2 },
1606	{ 0x0a, 0x400000f3 },
1607	{ 0x0b, 0x02a19020 },
1608	{ 0x0c, 0x40a000f0 },
1609	{ 0x0d, 0x90100210 },
1610	{ 0x10, 0x400003f1 },
1611	{ 0x11, 0x503303f3 },
1612	{}
1613};
1614
1615static const struct hda_pintbl stac925xM5_pin_configs[] = {
1616	{ 0x07, 0x40c003f4 },
1617	{ 0x08, 0x424503f2 },
1618	{ 0x0a, 0x400000f3 },
1619	{ 0x0b, 0x02a19020 },
1620	{ 0x0c, 0x40a000f0 },
1621	{ 0x0d, 0x90100210 },
1622	{ 0x10, 0x400003f1 },
1623	{ 0x11, 0x9033032e },
1624	{}
1625};
1626
1627static const struct hda_pintbl stac925xM6_pin_configs[] = {
1628	{ 0x07, 0x40c003f4 },
1629	{ 0x08, 0x424503f2 },
1630	{ 0x0a, 0x400000f3 },
1631	{ 0x0b, 0x02a19020 },
1632	{ 0x0c, 0x40a000f0 },
1633	{ 0x0d, 0x90100210 },
1634	{ 0x10, 0x400003f1 },
1635	{ 0x11, 0x90330320 },
1636	{}
1637};
1638
1639static const struct hda_fixup stac925x_fixups[] = {
1640	[STAC_REF] = {
1641		.type = HDA_FIXUP_PINS,
1642		.v.pins = ref925x_pin_configs,
1643	},
1644	[STAC_M1] = {
1645		.type = HDA_FIXUP_PINS,
1646		.v.pins = stac925xM1_pin_configs,
1647	},
1648	[STAC_M1_2] = {
1649		.type = HDA_FIXUP_PINS,
1650		.v.pins = stac925xM1_2_pin_configs,
1651	},
1652	[STAC_M2] = {
1653		.type = HDA_FIXUP_PINS,
1654		.v.pins = stac925xM2_pin_configs,
1655	},
1656	[STAC_M2_2] = {
1657		.type = HDA_FIXUP_PINS,
1658		.v.pins = stac925xM2_2_pin_configs,
1659	},
1660	[STAC_M3] = {
1661		.type = HDA_FIXUP_PINS,
1662		.v.pins = stac925xM3_pin_configs,
1663	},
1664	[STAC_M5] = {
1665		.type = HDA_FIXUP_PINS,
1666		.v.pins = stac925xM5_pin_configs,
1667	},
1668	[STAC_M6] = {
1669		.type = HDA_FIXUP_PINS,
1670		.v.pins = stac925xM6_pin_configs,
1671	},
1672};
1673
1674static const struct hda_model_fixup stac925x_models[] = {
1675	{ .id = STAC_REF, .name = "ref" },
1676	{ .id = STAC_M1, .name = "m1" },
1677	{ .id = STAC_M1_2, .name = "m1-2" },
1678	{ .id = STAC_M2, .name = "m2" },
1679	{ .id = STAC_M2_2, .name = "m2-2" },
1680	{ .id = STAC_M3, .name = "m3" },
1681	{ .id = STAC_M5, .name = "m5" },
1682	{ .id = STAC_M6, .name = "m6" },
1683	{}
1684};
1685
1686static const struct hda_quirk stac925x_fixup_tbl[] = {
1687	/* SigmaTel reference board */
1688	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, "DFI LanParty", STAC_REF),
1689	SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, "DFI LanParty", STAC_REF),
1690	SND_PCI_QUIRK(0x8384, 0x7632, "Stac9202 Reference Board", STAC_REF),
1691
1692	/* Default table for unknown ID */
1693	SND_PCI_QUIRK(0x1002, 0x437b, "Gateway mobile", STAC_M2_2),
1694
1695	/* gateway machines are checked via codec ssid */
1696	SND_PCI_QUIRK(0x107b, 0x0316, "Gateway M255", STAC_M2),
1697	SND_PCI_QUIRK(0x107b, 0x0366, "Gateway MP6954", STAC_M5),
1698	SND_PCI_QUIRK(0x107b, 0x0461, "Gateway NX560XL", STAC_M1),
1699	SND_PCI_QUIRK(0x107b, 0x0681, "Gateway NX860", STAC_M2),
1700	SND_PCI_QUIRK(0x107b, 0x0367, "Gateway MX6453", STAC_M1_2),
1701	/* Not sure about the brand name for those */
1702	SND_PCI_QUIRK(0x107b, 0x0281, "Gateway mobile", STAC_M1),
1703	SND_PCI_QUIRK(0x107b, 0x0507, "Gateway mobile", STAC_M3),
1704	SND_PCI_QUIRK(0x107b, 0x0281, "Gateway mobile", STAC_M6),
1705	SND_PCI_QUIRK(0x107b, 0x0685, "Gateway mobile", STAC_M2_2),
1706	{} /* terminator */
1707};
1708
1709static const struct hda_pintbl ref92hd73xx_pin_configs[] = {
1710	// Port A-H
1711	{ 0x0a, 0x02214030 },
1712	{ 0x0b, 0x02a19040 },
1713	{ 0x0c, 0x01a19020 },
1714	{ 0x0d, 0x02214030 },
1715	{ 0x0e, 0x0181302e },
1716	{ 0x0f, 0x01014010 },
1717	{ 0x10, 0x01014020 },
1718	{ 0x11, 0x01014030 },
1719	// CD in
1720	{ 0x12, 0x02319040 },
1721	// Digial Mic ins
1722	{ 0x13, 0x90a000f0 },
1723	{ 0x14, 0x90a000f0 },
1724	// Digital outs
1725	{ 0x22, 0x01452050 },
1726	{ 0x23, 0x01452050 },
1727	{}
1728};
1729
1730static const struct hda_pintbl dell_m6_pin_configs[] = {
1731	{ 0x0a, 0x0321101f },
1732	{ 0x0b, 0x4f00000f },
1733	{ 0x0c, 0x4f0000f0 },
1734	{ 0x0d, 0x90170110 },
1735	{ 0x0e, 0x03a11020 },
1736	{ 0x0f, 0x0321101f },
1737	{ 0x10, 0x4f0000f0 },
1738	{ 0x11, 0x4f0000f0 },
1739	{ 0x12, 0x4f0000f0 },
1740	{ 0x13, 0x90a60160 },
1741	{ 0x14, 0x4f0000f0 },
1742	{ 0x22, 0x4f0000f0 },
1743	{ 0x23, 0x4f0000f0 },
1744	{}
1745};
1746
1747static const struct hda_pintbl alienware_m17x_pin_configs[] = {
1748	{ 0x0a, 0x0321101f },
1749	{ 0x0b, 0x0321101f },
1750	{ 0x0c, 0x03a11020 },
1751	{ 0x0d, 0x03014020 },
1752	{ 0x0e, 0x90170110 },
1753	{ 0x0f, 0x4f0000f0 },
1754	{ 0x10, 0x4f0000f0 },
1755	{ 0x11, 0x4f0000f0 },
1756	{ 0x12, 0x4f0000f0 },
1757	{ 0x13, 0x90a60160 },
1758	{ 0x14, 0x4f0000f0 },
1759	{ 0x22, 0x4f0000f0 },
1760	{ 0x23, 0x904601b0 },
1761	{}
1762};
1763
1764static const struct hda_pintbl intel_dg45id_pin_configs[] = {
1765	// Analog outputs
1766	{ 0x0a, 0x02214230 },
1767	{ 0x0b, 0x02A19240 },
1768	{ 0x0c, 0x01013214 },
1769	{ 0x0d, 0x01014210 },
1770	{ 0x0e, 0x01A19250 },
1771	{ 0x0f, 0x01011212 },
1772	{ 0x10, 0x01016211 },
1773	// Digital output
1774	{ 0x22, 0x01451380 },
1775	{ 0x23, 0x40f000f0 },
1776	{}
1777};
1778
1779static const struct hda_pintbl stac92hd89xx_hp_front_jack_pin_configs[] = {
1780	{ 0x0a, 0x02214030 },
1781	{ 0x0b, 0x02A19010 },
1782	{}
1783};
1784
1785static const struct hda_pintbl stac92hd89xx_hp_z1_g2_right_mic_jack_pin_configs[] = {
1786	{ 0x0e, 0x400000f0 },
1787	{}
1788};
1789
1790static void stac92hd73xx_fixup_ref(struct hda_codec *codec,
1791				   const struct hda_fixup *fix, int action)
1792{
1793	struct sigmatel_spec *spec = codec->spec;
1794
1795	if (action != HDA_FIXUP_ACT_PRE_PROBE)
1796		return;
1797
1798	snd_hda_apply_pincfgs(codec, ref92hd73xx_pin_configs);
1799	spec->gpio_mask = spec->gpio_dir = spec->gpio_data = 0;
1800}
1801
1802static void stac92hd73xx_fixup_dell(struct hda_codec *codec)
1803{
1804	struct sigmatel_spec *spec = codec->spec;
1805
1806	snd_hda_apply_pincfgs(codec, dell_m6_pin_configs);
1807	spec->eapd_switch = 0;
1808}
1809
1810static void stac92hd73xx_fixup_dell_eq(struct hda_codec *codec,
1811				       const struct hda_fixup *fix, int action)
1812{
1813	struct sigmatel_spec *spec = codec->spec;
1814
1815	if (action != HDA_FIXUP_ACT_PRE_PROBE)
1816		return;
1817
1818	stac92hd73xx_fixup_dell(codec);
1819	snd_hda_add_verbs(codec, dell_eq_core_init);
1820	spec->volknob_init = 1;
1821}
1822
1823/* Analog Mics */
1824static void stac92hd73xx_fixup_dell_m6_amic(struct hda_codec *codec,
1825				    const struct hda_fixup *fix, int action)
1826{
1827	if (action != HDA_FIXUP_ACT_PRE_PROBE)
1828		return;
1829
1830	stac92hd73xx_fixup_dell(codec);
1831	snd_hda_codec_set_pincfg(codec, 0x0b, 0x90A70170);
1832}
1833
1834/* Digital Mics */
1835static void stac92hd73xx_fixup_dell_m6_dmic(struct hda_codec *codec,
1836				    const struct hda_fixup *fix, int action)
1837{
1838	if (action != HDA_FIXUP_ACT_PRE_PROBE)
1839		return;
1840
1841	stac92hd73xx_fixup_dell(codec);
1842	snd_hda_codec_set_pincfg(codec, 0x13, 0x90A60160);
1843}
1844
1845/* Both */
1846static void stac92hd73xx_fixup_dell_m6_both(struct hda_codec *codec,
1847				    const struct hda_fixup *fix, int action)
1848{
1849	if (action != HDA_FIXUP_ACT_PRE_PROBE)
1850		return;
1851
1852	stac92hd73xx_fixup_dell(codec);
1853	snd_hda_codec_set_pincfg(codec, 0x0b, 0x90A70170);
1854	snd_hda_codec_set_pincfg(codec, 0x13, 0x90A60160);
1855}
1856
1857static void stac92hd73xx_fixup_alienware_m17x(struct hda_codec *codec,
1858				    const struct hda_fixup *fix, int action)
1859{
1860	struct sigmatel_spec *spec = codec->spec;
1861
1862	if (action != HDA_FIXUP_ACT_PRE_PROBE)
1863		return;
1864
1865	snd_hda_apply_pincfgs(codec, alienware_m17x_pin_configs);
1866	spec->eapd_switch = 0;
1867}
1868
1869static void stac92hd73xx_fixup_no_jd(struct hda_codec *codec,
1870				     const struct hda_fixup *fix, int action)
1871{
1872	if (action == HDA_FIXUP_ACT_PRE_PROBE)
1873		codec->no_jack_detect = 1;
1874}
1875
1876
1877static void stac92hd73xx_disable_automute(struct hda_codec *codec,
1878				     const struct hda_fixup *fix, int action)
1879{
1880	struct sigmatel_spec *spec = codec->spec;
1881
1882	if (action != HDA_FIXUP_ACT_PRE_PROBE)
1883		return;
1884
1885	spec->gen.suppress_auto_mute = 1;
1886}
1887
1888static const struct hda_fixup stac92hd73xx_fixups[] = {
1889	[STAC_92HD73XX_REF] = {
1890		.type = HDA_FIXUP_FUNC,
1891		.v.func = stac92hd73xx_fixup_ref,
1892	},
1893	[STAC_DELL_M6_AMIC] = {
1894		.type = HDA_FIXUP_FUNC,
1895		.v.func = stac92hd73xx_fixup_dell_m6_amic,
1896	},
1897	[STAC_DELL_M6_DMIC] = {
1898		.type = HDA_FIXUP_FUNC,
1899		.v.func = stac92hd73xx_fixup_dell_m6_dmic,
1900	},
1901	[STAC_DELL_M6_BOTH] = {
1902		.type = HDA_FIXUP_FUNC,
1903		.v.func = stac92hd73xx_fixup_dell_m6_both,
1904	},
1905	[STAC_DELL_EQ]	= {
1906		.type = HDA_FIXUP_FUNC,
1907		.v.func = stac92hd73xx_fixup_dell_eq,
1908	},
1909	[STAC_ALIENWARE_M17X] = {
1910		.type = HDA_FIXUP_FUNC,
1911		.v.func = stac92hd73xx_fixup_alienware_m17x,
1912	},
1913	[STAC_ELO_VUPOINT_15MX] = {
1914		.type = HDA_FIXUP_FUNC,
1915		.v.func = stac92hd73xx_disable_automute,
1916	},
1917	[STAC_92HD73XX_INTEL] = {
1918		.type = HDA_FIXUP_PINS,
1919		.v.pins = intel_dg45id_pin_configs,
1920	},
1921	[STAC_92HD73XX_NO_JD] = {
1922		.type = HDA_FIXUP_FUNC,
1923		.v.func = stac92hd73xx_fixup_no_jd,
1924	},
1925	[STAC_92HD89XX_HP_FRONT_JACK] = {
1926		.type = HDA_FIXUP_PINS,
1927		.v.pins = stac92hd89xx_hp_front_jack_pin_configs,
1928	},
1929	[STAC_92HD89XX_HP_Z1_G2_RIGHT_MIC_JACK] = {
1930		.type = HDA_FIXUP_PINS,
1931		.v.pins = stac92hd89xx_hp_z1_g2_right_mic_jack_pin_configs,
1932	},
1933	[STAC_92HD73XX_ASUS_MOBO] = {
1934		.type = HDA_FIXUP_PINS,
1935		.v.pins = (const struct hda_pintbl[]) {
1936			/* enable 5.1 and SPDIF out */
1937			{ 0x0c, 0x01014411 },
1938			{ 0x0d, 0x01014410 },
1939			{ 0x0e, 0x01014412 },
1940			{ 0x22, 0x014b1180 },
1941			{ }
1942		}
1943	},
1944};
1945
1946static const struct hda_model_fixup stac92hd73xx_models[] = {
1947	{ .id = STAC_92HD73XX_NO_JD, .name = "no-jd" },
1948	{ .id = STAC_92HD73XX_REF, .name = "ref" },
1949	{ .id = STAC_92HD73XX_INTEL, .name = "intel" },
1950	{ .id = STAC_DELL_M6_AMIC, .name = "dell-m6-amic" },
1951	{ .id = STAC_DELL_M6_DMIC, .name = "dell-m6-dmic" },
1952	{ .id = STAC_DELL_M6_BOTH, .name = "dell-m6" },
1953	{ .id = STAC_DELL_EQ, .name = "dell-eq" },
1954	{ .id = STAC_ALIENWARE_M17X, .name = "alienware" },
1955	{ .id = STAC_ELO_VUPOINT_15MX, .name = "elo-vupoint-15mx" },
1956	{ .id = STAC_92HD73XX_ASUS_MOBO, .name = "asus-mobo" },
1957	{}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1958};
1959
1960static const struct hda_quirk stac92hd73xx_fixup_tbl[] = {
1961	/* SigmaTel reference board */
1962	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1963				"DFI LanParty", STAC_92HD73XX_REF),
1964	SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
1965				"DFI LanParty", STAC_92HD73XX_REF),
1966	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5001,
1967				"Intel DP45SG", STAC_92HD73XX_INTEL),
1968	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5002,
1969				"Intel DG45ID", STAC_92HD73XX_INTEL),
1970	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5003,
1971				"Intel DG45FC", STAC_92HD73XX_INTEL),
1972	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0254,
1973				"Dell Studio 1535", STAC_DELL_M6_DMIC),
1974	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0255,
1975				"unknown Dell", STAC_DELL_M6_DMIC),
1976	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0256,
1977				"unknown Dell", STAC_DELL_M6_BOTH),
1978	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0257,
1979				"unknown Dell", STAC_DELL_M6_BOTH),
1980	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x025e,
1981				"unknown Dell", STAC_DELL_M6_AMIC),
1982	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x025f,
1983				"unknown Dell", STAC_DELL_M6_AMIC),
1984	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0271,
1985				"unknown Dell", STAC_DELL_M6_DMIC),
1986	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0272,
1987				"unknown Dell", STAC_DELL_M6_DMIC),
1988	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x029f,
1989				"Dell Studio 1537", STAC_DELL_M6_DMIC),
1990	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02a0,
1991				"Dell Studio 17", STAC_DELL_M6_DMIC),
1992	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02be,
1993				"Dell Studio 1555", STAC_DELL_M6_DMIC),
1994	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02bd,
1995				"Dell Studio 1557", STAC_DELL_M6_DMIC),
1996	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02fe,
1997				"Dell Studio XPS 1645", STAC_DELL_M6_DMIC),
1998	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0413,
1999				"Dell Studio 1558", STAC_DELL_M6_DMIC),
2000	/* codec SSID matching */
 
 
 
2001	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02a1,
2002		      "Alienware M17x", STAC_ALIENWARE_M17X),
2003	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x043a,
2004		      "Alienware M17x", STAC_ALIENWARE_M17X),
2005	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0490,
2006		      "Alienware M17x R3", STAC_DELL_EQ),
2007	SND_PCI_QUIRK(0x1059, 0x1011,
2008		      "ELO VuPoint 15MX", STAC_ELO_VUPOINT_15MX),
2009	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1927,
2010				"HP Z1 G2", STAC_92HD89XX_HP_Z1_G2_RIGHT_MIC_JACK),
2011	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2b17,
2012				"unknown HP", STAC_92HD89XX_HP_FRONT_JACK),
2013	SND_PCI_QUIRK(PCI_VENDOR_ID_ASUSTEK, 0x83f8, "ASUS AT4NM10",
2014		      STAC_92HD73XX_ASUS_MOBO),
2015	{} /* terminator */
2016};
2017
2018static const struct hda_pintbl ref92hd83xxx_pin_configs[] = {
2019	{ 0x0a, 0x02214030 },
2020	{ 0x0b, 0x02211010 },
2021	{ 0x0c, 0x02a19020 },
2022	{ 0x0d, 0x02170130 },
2023	{ 0x0e, 0x01014050 },
2024	{ 0x0f, 0x01819040 },
2025	{ 0x10, 0x01014020 },
2026	{ 0x11, 0x90a3014e },
2027	{ 0x1f, 0x01451160 },
2028	{ 0x20, 0x98560170 },
2029	{}
2030};
2031
2032static const struct hda_pintbl dell_s14_pin_configs[] = {
2033	{ 0x0a, 0x0221403f },
2034	{ 0x0b, 0x0221101f },
2035	{ 0x0c, 0x02a19020 },
2036	{ 0x0d, 0x90170110 },
2037	{ 0x0e, 0x40f000f0 },
2038	{ 0x0f, 0x40f000f0 },
2039	{ 0x10, 0x40f000f0 },
2040	{ 0x11, 0x90a60160 },
2041	{ 0x1f, 0x40f000f0 },
2042	{ 0x20, 0x40f000f0 },
2043	{}
2044};
2045
2046static const struct hda_pintbl dell_vostro_3500_pin_configs[] = {
2047	{ 0x0a, 0x02a11020 },
2048	{ 0x0b, 0x0221101f },
2049	{ 0x0c, 0x400000f0 },
2050	{ 0x0d, 0x90170110 },
2051	{ 0x0e, 0x400000f1 },
2052	{ 0x0f, 0x400000f2 },
2053	{ 0x10, 0x400000f3 },
2054	{ 0x11, 0x90a60160 },
2055	{ 0x1f, 0x400000f4 },
2056	{ 0x20, 0x400000f5 },
2057	{}
2058};
2059
2060static const struct hda_pintbl hp_dv7_4000_pin_configs[] = {
2061	{ 0x0a, 0x03a12050 },
2062	{ 0x0b, 0x0321201f },
2063	{ 0x0c, 0x40f000f0 },
2064	{ 0x0d, 0x90170110 },
2065	{ 0x0e, 0x40f000f0 },
2066	{ 0x0f, 0x40f000f0 },
2067	{ 0x10, 0x90170110 },
2068	{ 0x11, 0xd5a30140 },
2069	{ 0x1f, 0x40f000f0 },
2070	{ 0x20, 0x40f000f0 },
2071	{}
2072};
2073
2074static const struct hda_pintbl hp_zephyr_pin_configs[] = {
2075	{ 0x0a, 0x01813050 },
2076	{ 0x0b, 0x0421201f },
2077	{ 0x0c, 0x04a1205e },
2078	{ 0x0d, 0x96130310 },
2079	{ 0x0e, 0x96130310 },
2080	{ 0x0f, 0x0101401f },
2081	{ 0x10, 0x1111611f },
2082	{ 0x11, 0xd5a30130 },
2083	{}
2084};
2085
2086static const struct hda_pintbl hp_cNB11_intquad_pin_configs[] = {
2087	{ 0x0a, 0x40f000f0 },
2088	{ 0x0b, 0x0221101f },
2089	{ 0x0c, 0x02a11020 },
2090	{ 0x0d, 0x92170110 },
2091	{ 0x0e, 0x40f000f0 },
2092	{ 0x0f, 0x92170110 },
2093	{ 0x10, 0x40f000f0 },
2094	{ 0x11, 0xd5a30130 },
2095	{ 0x1f, 0x40f000f0 },
2096	{ 0x20, 0x40f000f0 },
2097	{}
2098};
2099
2100static void stac92hd83xxx_fixup_hp(struct hda_codec *codec,
2101				   const struct hda_fixup *fix, int action)
2102{
2103	struct sigmatel_spec *spec = codec->spec;
2104
2105	if (action != HDA_FIXUP_ACT_PRE_PROBE)
2106		return;
2107
2108	if (hp_bnb2011_with_dock(codec)) {
2109		snd_hda_codec_set_pincfg(codec, 0xa, 0x2101201f);
2110		snd_hda_codec_set_pincfg(codec, 0xf, 0x2181205e);
2111	}
2112
2113	if (find_mute_led_cfg(codec, spec->default_polarity))
2114		codec_dbg(codec, "mute LED gpio %d polarity %d\n",
2115				spec->gpio_led,
2116				spec->gpio_led_polarity);
2117
2118	/* allow auto-switching of dock line-in */
2119	spec->gen.line_in_auto_switch = true;
2120}
2121
2122static void stac92hd83xxx_fixup_hp_zephyr(struct hda_codec *codec,
2123				   const struct hda_fixup *fix, int action)
2124{
2125	if (action != HDA_FIXUP_ACT_PRE_PROBE)
2126		return;
2127
2128	snd_hda_apply_pincfgs(codec, hp_zephyr_pin_configs);
2129	snd_hda_add_verbs(codec, stac92hd83xxx_hp_zephyr_init);
2130}
2131
2132static void stac92hd83xxx_fixup_hp_led(struct hda_codec *codec,
2133				   const struct hda_fixup *fix, int action)
2134{
2135	struct sigmatel_spec *spec = codec->spec;
2136
2137	if (action == HDA_FIXUP_ACT_PRE_PROBE)
2138		spec->default_polarity = 0;
2139}
2140
2141static void stac92hd83xxx_fixup_hp_inv_led(struct hda_codec *codec,
2142				   const struct hda_fixup *fix, int action)
2143{
2144	struct sigmatel_spec *spec = codec->spec;
2145
2146	if (action == HDA_FIXUP_ACT_PRE_PROBE)
2147		spec->default_polarity = 1;
2148}
2149
2150static void stac92hd83xxx_fixup_hp_mic_led(struct hda_codec *codec,
2151				   const struct hda_fixup *fix, int action)
2152{
2153	struct sigmatel_spec *spec = codec->spec;
2154
2155	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
2156		spec->mic_mute_led_gpio = 0x08; /* GPIO3 */
2157		/* resetting controller clears GPIO, so we need to keep on */
2158		codec->core.power_caps &= ~AC_PWRST_CLKSTOP;
2159	}
2160}
2161
2162static void stac92hd83xxx_fixup_hp_led_gpio10(struct hda_codec *codec,
2163				   const struct hda_fixup *fix, int action)
2164{
2165	struct sigmatel_spec *spec = codec->spec;
2166
2167	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
2168		spec->gpio_led = 0x10; /* GPIO4 */
2169		spec->default_polarity = 0;
2170	}
2171}
2172
2173static void stac92hd83xxx_fixup_headset_jack(struct hda_codec *codec,
2174				   const struct hda_fixup *fix, int action)
2175{
2176	struct sigmatel_spec *spec = codec->spec;
2177
2178	if (action == HDA_FIXUP_ACT_PRE_PROBE)
2179		spec->headset_jack = 1;
2180}
2181
2182static void stac92hd83xxx_fixup_gpio10_eapd(struct hda_codec *codec,
2183					    const struct hda_fixup *fix,
2184					    int action)
2185{
2186	struct sigmatel_spec *spec = codec->spec;
2187
2188	if (action != HDA_FIXUP_ACT_PRE_PROBE)
2189		return;
2190	spec->eapd_mask = spec->gpio_mask = spec->gpio_dir =
2191		spec->gpio_data = 0x10;
2192	spec->eapd_switch = 0;
2193}
2194
2195static void hp_envy_ts_fixup_dac_bind(struct hda_codec *codec,
2196					    const struct hda_fixup *fix,
2197					    int action)
2198{
2199	struct sigmatel_spec *spec = codec->spec;
2200	static const hda_nid_t preferred_pairs[] = {
2201		0xd, 0x13,
2202		0
2203	};
2204
2205	if (action != HDA_FIXUP_ACT_PRE_PROBE)
2206		return;
2207
2208	spec->gen.preferred_dacs = preferred_pairs;
2209}
2210
2211static const struct hda_verb hp_bnb13_eq_verbs[] = {
2212	/* 44.1KHz base */
2213	{ 0x22, 0x7A6, 0x3E },
2214	{ 0x22, 0x7A7, 0x68 },
2215	{ 0x22, 0x7A8, 0x17 },
2216	{ 0x22, 0x7A9, 0x3E },
2217	{ 0x22, 0x7AA, 0x68 },
2218	{ 0x22, 0x7AB, 0x17 },
2219	{ 0x22, 0x7AC, 0x00 },
2220	{ 0x22, 0x7AD, 0x80 },
2221	{ 0x22, 0x7A6, 0x83 },
2222	{ 0x22, 0x7A7, 0x2F },
2223	{ 0x22, 0x7A8, 0xD1 },
2224	{ 0x22, 0x7A9, 0x83 },
2225	{ 0x22, 0x7AA, 0x2F },
2226	{ 0x22, 0x7AB, 0xD1 },
2227	{ 0x22, 0x7AC, 0x01 },
2228	{ 0x22, 0x7AD, 0x80 },
2229	{ 0x22, 0x7A6, 0x3E },
2230	{ 0x22, 0x7A7, 0x68 },
2231	{ 0x22, 0x7A8, 0x17 },
2232	{ 0x22, 0x7A9, 0x3E },
2233	{ 0x22, 0x7AA, 0x68 },
2234	{ 0x22, 0x7AB, 0x17 },
2235	{ 0x22, 0x7AC, 0x02 },
2236	{ 0x22, 0x7AD, 0x80 },
2237	{ 0x22, 0x7A6, 0x7C },
2238	{ 0x22, 0x7A7, 0xC6 },
2239	{ 0x22, 0x7A8, 0x0C },
2240	{ 0x22, 0x7A9, 0x7C },
2241	{ 0x22, 0x7AA, 0xC6 },
2242	{ 0x22, 0x7AB, 0x0C },
2243	{ 0x22, 0x7AC, 0x03 },
2244	{ 0x22, 0x7AD, 0x80 },
2245	{ 0x22, 0x7A6, 0xC3 },
2246	{ 0x22, 0x7A7, 0x25 },
2247	{ 0x22, 0x7A8, 0xAF },
2248	{ 0x22, 0x7A9, 0xC3 },
2249	{ 0x22, 0x7AA, 0x25 },
2250	{ 0x22, 0x7AB, 0xAF },
2251	{ 0x22, 0x7AC, 0x04 },
2252	{ 0x22, 0x7AD, 0x80 },
2253	{ 0x22, 0x7A6, 0x3E },
2254	{ 0x22, 0x7A7, 0x85 },
2255	{ 0x22, 0x7A8, 0x73 },
2256	{ 0x22, 0x7A9, 0x3E },
2257	{ 0x22, 0x7AA, 0x85 },
2258	{ 0x22, 0x7AB, 0x73 },
2259	{ 0x22, 0x7AC, 0x05 },
2260	{ 0x22, 0x7AD, 0x80 },
2261	{ 0x22, 0x7A6, 0x85 },
2262	{ 0x22, 0x7A7, 0x39 },
2263	{ 0x22, 0x7A8, 0xC7 },
2264	{ 0x22, 0x7A9, 0x85 },
2265	{ 0x22, 0x7AA, 0x39 },
2266	{ 0x22, 0x7AB, 0xC7 },
2267	{ 0x22, 0x7AC, 0x06 },
2268	{ 0x22, 0x7AD, 0x80 },
2269	{ 0x22, 0x7A6, 0x3C },
2270	{ 0x22, 0x7A7, 0x90 },
2271	{ 0x22, 0x7A8, 0xB0 },
2272	{ 0x22, 0x7A9, 0x3C },
2273	{ 0x22, 0x7AA, 0x90 },
2274	{ 0x22, 0x7AB, 0xB0 },
2275	{ 0x22, 0x7AC, 0x07 },
2276	{ 0x22, 0x7AD, 0x80 },
2277	{ 0x22, 0x7A6, 0x7A },
2278	{ 0x22, 0x7A7, 0xC6 },
2279	{ 0x22, 0x7A8, 0x39 },
2280	{ 0x22, 0x7A9, 0x7A },
2281	{ 0x22, 0x7AA, 0xC6 },
2282	{ 0x22, 0x7AB, 0x39 },
2283	{ 0x22, 0x7AC, 0x08 },
2284	{ 0x22, 0x7AD, 0x80 },
2285	{ 0x22, 0x7A6, 0xC4 },
2286	{ 0x22, 0x7A7, 0xE9 },
2287	{ 0x22, 0x7A8, 0xDC },
2288	{ 0x22, 0x7A9, 0xC4 },
2289	{ 0x22, 0x7AA, 0xE9 },
2290	{ 0x22, 0x7AB, 0xDC },
2291	{ 0x22, 0x7AC, 0x09 },
2292	{ 0x22, 0x7AD, 0x80 },
2293	{ 0x22, 0x7A6, 0x3D },
2294	{ 0x22, 0x7A7, 0xE1 },
2295	{ 0x22, 0x7A8, 0x0D },
2296	{ 0x22, 0x7A9, 0x3D },
2297	{ 0x22, 0x7AA, 0xE1 },
2298	{ 0x22, 0x7AB, 0x0D },
2299	{ 0x22, 0x7AC, 0x0A },
2300	{ 0x22, 0x7AD, 0x80 },
2301	{ 0x22, 0x7A6, 0x89 },
2302	{ 0x22, 0x7A7, 0xB6 },
2303	{ 0x22, 0x7A8, 0xEB },
2304	{ 0x22, 0x7A9, 0x89 },
2305	{ 0x22, 0x7AA, 0xB6 },
2306	{ 0x22, 0x7AB, 0xEB },
2307	{ 0x22, 0x7AC, 0x0B },
2308	{ 0x22, 0x7AD, 0x80 },
2309	{ 0x22, 0x7A6, 0x39 },
2310	{ 0x22, 0x7A7, 0x9D },
2311	{ 0x22, 0x7A8, 0xFE },
2312	{ 0x22, 0x7A9, 0x39 },
2313	{ 0x22, 0x7AA, 0x9D },
2314	{ 0x22, 0x7AB, 0xFE },
2315	{ 0x22, 0x7AC, 0x0C },
2316	{ 0x22, 0x7AD, 0x80 },
2317	{ 0x22, 0x7A6, 0x76 },
2318	{ 0x22, 0x7A7, 0x49 },
2319	{ 0x22, 0x7A8, 0x15 },
2320	{ 0x22, 0x7A9, 0x76 },
2321	{ 0x22, 0x7AA, 0x49 },
2322	{ 0x22, 0x7AB, 0x15 },
2323	{ 0x22, 0x7AC, 0x0D },
2324	{ 0x22, 0x7AD, 0x80 },
2325	{ 0x22, 0x7A6, 0xC8 },
2326	{ 0x22, 0x7A7, 0x80 },
2327	{ 0x22, 0x7A8, 0xF5 },
2328	{ 0x22, 0x7A9, 0xC8 },
2329	{ 0x22, 0x7AA, 0x80 },
2330	{ 0x22, 0x7AB, 0xF5 },
2331	{ 0x22, 0x7AC, 0x0E },
2332	{ 0x22, 0x7AD, 0x80 },
2333	{ 0x22, 0x7A6, 0x40 },
2334	{ 0x22, 0x7A7, 0x00 },
2335	{ 0x22, 0x7A8, 0x00 },
2336	{ 0x22, 0x7A9, 0x40 },
2337	{ 0x22, 0x7AA, 0x00 },
2338	{ 0x22, 0x7AB, 0x00 },
2339	{ 0x22, 0x7AC, 0x0F },
2340	{ 0x22, 0x7AD, 0x80 },
2341	{ 0x22, 0x7A6, 0x90 },
2342	{ 0x22, 0x7A7, 0x68 },
2343	{ 0x22, 0x7A8, 0xF1 },
2344	{ 0x22, 0x7A9, 0x90 },
2345	{ 0x22, 0x7AA, 0x68 },
2346	{ 0x22, 0x7AB, 0xF1 },
2347	{ 0x22, 0x7AC, 0x10 },
2348	{ 0x22, 0x7AD, 0x80 },
2349	{ 0x22, 0x7A6, 0x34 },
2350	{ 0x22, 0x7A7, 0x47 },
2351	{ 0x22, 0x7A8, 0x6C },
2352	{ 0x22, 0x7A9, 0x34 },
2353	{ 0x22, 0x7AA, 0x47 },
2354	{ 0x22, 0x7AB, 0x6C },
2355	{ 0x22, 0x7AC, 0x11 },
2356	{ 0x22, 0x7AD, 0x80 },
2357	{ 0x22, 0x7A6, 0x6F },
2358	{ 0x22, 0x7A7, 0x97 },
2359	{ 0x22, 0x7A8, 0x0F },
2360	{ 0x22, 0x7A9, 0x6F },
2361	{ 0x22, 0x7AA, 0x97 },
2362	{ 0x22, 0x7AB, 0x0F },
2363	{ 0x22, 0x7AC, 0x12 },
2364	{ 0x22, 0x7AD, 0x80 },
2365	{ 0x22, 0x7A6, 0xCB },
2366	{ 0x22, 0x7A7, 0xB8 },
2367	{ 0x22, 0x7A8, 0x94 },
2368	{ 0x22, 0x7A9, 0xCB },
2369	{ 0x22, 0x7AA, 0xB8 },
2370	{ 0x22, 0x7AB, 0x94 },
2371	{ 0x22, 0x7AC, 0x13 },
2372	{ 0x22, 0x7AD, 0x80 },
2373	{ 0x22, 0x7A6, 0x40 },
2374	{ 0x22, 0x7A7, 0x00 },
2375	{ 0x22, 0x7A8, 0x00 },
2376	{ 0x22, 0x7A9, 0x40 },
2377	{ 0x22, 0x7AA, 0x00 },
2378	{ 0x22, 0x7AB, 0x00 },
2379	{ 0x22, 0x7AC, 0x14 },
2380	{ 0x22, 0x7AD, 0x80 },
2381	{ 0x22, 0x7A6, 0x95 },
2382	{ 0x22, 0x7A7, 0x76 },
2383	{ 0x22, 0x7A8, 0x5B },
2384	{ 0x22, 0x7A9, 0x95 },
2385	{ 0x22, 0x7AA, 0x76 },
2386	{ 0x22, 0x7AB, 0x5B },
2387	{ 0x22, 0x7AC, 0x15 },
2388	{ 0x22, 0x7AD, 0x80 },
2389	{ 0x22, 0x7A6, 0x31 },
2390	{ 0x22, 0x7A7, 0xAC },
2391	{ 0x22, 0x7A8, 0x31 },
2392	{ 0x22, 0x7A9, 0x31 },
2393	{ 0x22, 0x7AA, 0xAC },
2394	{ 0x22, 0x7AB, 0x31 },
2395	{ 0x22, 0x7AC, 0x16 },
2396	{ 0x22, 0x7AD, 0x80 },
2397	{ 0x22, 0x7A6, 0x6A },
2398	{ 0x22, 0x7A7, 0x89 },
2399	{ 0x22, 0x7A8, 0xA5 },
2400	{ 0x22, 0x7A9, 0x6A },
2401	{ 0x22, 0x7AA, 0x89 },
2402	{ 0x22, 0x7AB, 0xA5 },
2403	{ 0x22, 0x7AC, 0x17 },
2404	{ 0x22, 0x7AD, 0x80 },
2405	{ 0x22, 0x7A6, 0xCE },
2406	{ 0x22, 0x7A7, 0x53 },
2407	{ 0x22, 0x7A8, 0xCF },
2408	{ 0x22, 0x7A9, 0xCE },
2409	{ 0x22, 0x7AA, 0x53 },
2410	{ 0x22, 0x7AB, 0xCF },
2411	{ 0x22, 0x7AC, 0x18 },
2412	{ 0x22, 0x7AD, 0x80 },
2413	{ 0x22, 0x7A6, 0x40 },
2414	{ 0x22, 0x7A7, 0x00 },
2415	{ 0x22, 0x7A8, 0x00 },
2416	{ 0x22, 0x7A9, 0x40 },
2417	{ 0x22, 0x7AA, 0x00 },
2418	{ 0x22, 0x7AB, 0x00 },
2419	{ 0x22, 0x7AC, 0x19 },
2420	{ 0x22, 0x7AD, 0x80 },
2421	/* 48KHz base */
2422	{ 0x22, 0x7A6, 0x3E },
2423	{ 0x22, 0x7A7, 0x88 },
2424	{ 0x22, 0x7A8, 0xDC },
2425	{ 0x22, 0x7A9, 0x3E },
2426	{ 0x22, 0x7AA, 0x88 },
2427	{ 0x22, 0x7AB, 0xDC },
2428	{ 0x22, 0x7AC, 0x1A },
2429	{ 0x22, 0x7AD, 0x80 },
2430	{ 0x22, 0x7A6, 0x82 },
2431	{ 0x22, 0x7A7, 0xEE },
2432	{ 0x22, 0x7A8, 0x46 },
2433	{ 0x22, 0x7A9, 0x82 },
2434	{ 0x22, 0x7AA, 0xEE },
2435	{ 0x22, 0x7AB, 0x46 },
2436	{ 0x22, 0x7AC, 0x1B },
2437	{ 0x22, 0x7AD, 0x80 },
2438	{ 0x22, 0x7A6, 0x3E },
2439	{ 0x22, 0x7A7, 0x88 },
2440	{ 0x22, 0x7A8, 0xDC },
2441	{ 0x22, 0x7A9, 0x3E },
2442	{ 0x22, 0x7AA, 0x88 },
2443	{ 0x22, 0x7AB, 0xDC },
2444	{ 0x22, 0x7AC, 0x1C },
2445	{ 0x22, 0x7AD, 0x80 },
2446	{ 0x22, 0x7A6, 0x7D },
2447	{ 0x22, 0x7A7, 0x09 },
2448	{ 0x22, 0x7A8, 0x28 },
2449	{ 0x22, 0x7A9, 0x7D },
2450	{ 0x22, 0x7AA, 0x09 },
2451	{ 0x22, 0x7AB, 0x28 },
2452	{ 0x22, 0x7AC, 0x1D },
2453	{ 0x22, 0x7AD, 0x80 },
2454	{ 0x22, 0x7A6, 0xC2 },
2455	{ 0x22, 0x7A7, 0xE5 },
2456	{ 0x22, 0x7A8, 0xB4 },
2457	{ 0x22, 0x7A9, 0xC2 },
2458	{ 0x22, 0x7AA, 0xE5 },
2459	{ 0x22, 0x7AB, 0xB4 },
2460	{ 0x22, 0x7AC, 0x1E },
2461	{ 0x22, 0x7AD, 0x80 },
2462	{ 0x22, 0x7A6, 0x3E },
2463	{ 0x22, 0x7A7, 0xA3 },
2464	{ 0x22, 0x7A8, 0x1F },
2465	{ 0x22, 0x7A9, 0x3E },
2466	{ 0x22, 0x7AA, 0xA3 },
2467	{ 0x22, 0x7AB, 0x1F },
2468	{ 0x22, 0x7AC, 0x1F },
2469	{ 0x22, 0x7AD, 0x80 },
2470	{ 0x22, 0x7A6, 0x84 },
2471	{ 0x22, 0x7A7, 0xCA },
2472	{ 0x22, 0x7A8, 0xF1 },
2473	{ 0x22, 0x7A9, 0x84 },
2474	{ 0x22, 0x7AA, 0xCA },
2475	{ 0x22, 0x7AB, 0xF1 },
2476	{ 0x22, 0x7AC, 0x20 },
2477	{ 0x22, 0x7AD, 0x80 },
2478	{ 0x22, 0x7A6, 0x3C },
2479	{ 0x22, 0x7A7, 0xD5 },
2480	{ 0x22, 0x7A8, 0x9C },
2481	{ 0x22, 0x7A9, 0x3C },
2482	{ 0x22, 0x7AA, 0xD5 },
2483	{ 0x22, 0x7AB, 0x9C },
2484	{ 0x22, 0x7AC, 0x21 },
2485	{ 0x22, 0x7AD, 0x80 },
2486	{ 0x22, 0x7A6, 0x7B },
2487	{ 0x22, 0x7A7, 0x35 },
2488	{ 0x22, 0x7A8, 0x0F },
2489	{ 0x22, 0x7A9, 0x7B },
2490	{ 0x22, 0x7AA, 0x35 },
2491	{ 0x22, 0x7AB, 0x0F },
2492	{ 0x22, 0x7AC, 0x22 },
2493	{ 0x22, 0x7AD, 0x80 },
2494	{ 0x22, 0x7A6, 0xC4 },
2495	{ 0x22, 0x7A7, 0x87 },
2496	{ 0x22, 0x7A8, 0x45 },
2497	{ 0x22, 0x7A9, 0xC4 },
2498	{ 0x22, 0x7AA, 0x87 },
2499	{ 0x22, 0x7AB, 0x45 },
2500	{ 0x22, 0x7AC, 0x23 },
2501	{ 0x22, 0x7AD, 0x80 },
2502	{ 0x22, 0x7A6, 0x3E },
2503	{ 0x22, 0x7A7, 0x0A },
2504	{ 0x22, 0x7A8, 0x78 },
2505	{ 0x22, 0x7A9, 0x3E },
2506	{ 0x22, 0x7AA, 0x0A },
2507	{ 0x22, 0x7AB, 0x78 },
2508	{ 0x22, 0x7AC, 0x24 },
2509	{ 0x22, 0x7AD, 0x80 },
2510	{ 0x22, 0x7A6, 0x88 },
2511	{ 0x22, 0x7A7, 0xE2 },
2512	{ 0x22, 0x7A8, 0x05 },
2513	{ 0x22, 0x7A9, 0x88 },
2514	{ 0x22, 0x7AA, 0xE2 },
2515	{ 0x22, 0x7AB, 0x05 },
2516	{ 0x22, 0x7AC, 0x25 },
2517	{ 0x22, 0x7AD, 0x80 },
2518	{ 0x22, 0x7A6, 0x3A },
2519	{ 0x22, 0x7A7, 0x1A },
2520	{ 0x22, 0x7A8, 0xA3 },
2521	{ 0x22, 0x7A9, 0x3A },
2522	{ 0x22, 0x7AA, 0x1A },
2523	{ 0x22, 0x7AB, 0xA3 },
2524	{ 0x22, 0x7AC, 0x26 },
2525	{ 0x22, 0x7AD, 0x80 },
2526	{ 0x22, 0x7A6, 0x77 },
2527	{ 0x22, 0x7A7, 0x1D },
2528	{ 0x22, 0x7A8, 0xFB },
2529	{ 0x22, 0x7A9, 0x77 },
2530	{ 0x22, 0x7AA, 0x1D },
2531	{ 0x22, 0x7AB, 0xFB },
2532	{ 0x22, 0x7AC, 0x27 },
2533	{ 0x22, 0x7AD, 0x80 },
2534	{ 0x22, 0x7A6, 0xC7 },
2535	{ 0x22, 0x7A7, 0xDA },
2536	{ 0x22, 0x7A8, 0xE5 },
2537	{ 0x22, 0x7A9, 0xC7 },
2538	{ 0x22, 0x7AA, 0xDA },
2539	{ 0x22, 0x7AB, 0xE5 },
2540	{ 0x22, 0x7AC, 0x28 },
2541	{ 0x22, 0x7AD, 0x80 },
2542	{ 0x22, 0x7A6, 0x40 },
2543	{ 0x22, 0x7A7, 0x00 },
2544	{ 0x22, 0x7A8, 0x00 },
2545	{ 0x22, 0x7A9, 0x40 },
2546	{ 0x22, 0x7AA, 0x00 },
2547	{ 0x22, 0x7AB, 0x00 },
2548	{ 0x22, 0x7AC, 0x29 },
2549	{ 0x22, 0x7AD, 0x80 },
2550	{ 0x22, 0x7A6, 0x8E },
2551	{ 0x22, 0x7A7, 0xD7 },
2552	{ 0x22, 0x7A8, 0x22 },
2553	{ 0x22, 0x7A9, 0x8E },
2554	{ 0x22, 0x7AA, 0xD7 },
2555	{ 0x22, 0x7AB, 0x22 },
2556	{ 0x22, 0x7AC, 0x2A },
2557	{ 0x22, 0x7AD, 0x80 },
2558	{ 0x22, 0x7A6, 0x35 },
2559	{ 0x22, 0x7A7, 0x26 },
2560	{ 0x22, 0x7A8, 0xC6 },
2561	{ 0x22, 0x7A9, 0x35 },
2562	{ 0x22, 0x7AA, 0x26 },
2563	{ 0x22, 0x7AB, 0xC6 },
2564	{ 0x22, 0x7AC, 0x2B },
2565	{ 0x22, 0x7AD, 0x80 },
2566	{ 0x22, 0x7A6, 0x71 },
2567	{ 0x22, 0x7A7, 0x28 },
2568	{ 0x22, 0x7A8, 0xDE },
2569	{ 0x22, 0x7A9, 0x71 },
2570	{ 0x22, 0x7AA, 0x28 },
2571	{ 0x22, 0x7AB, 0xDE },
2572	{ 0x22, 0x7AC, 0x2C },
2573	{ 0x22, 0x7AD, 0x80 },
2574	{ 0x22, 0x7A6, 0xCA },
2575	{ 0x22, 0x7A7, 0xD9 },
2576	{ 0x22, 0x7A8, 0x3A },
2577	{ 0x22, 0x7A9, 0xCA },
2578	{ 0x22, 0x7AA, 0xD9 },
2579	{ 0x22, 0x7AB, 0x3A },
2580	{ 0x22, 0x7AC, 0x2D },
2581	{ 0x22, 0x7AD, 0x80 },
2582	{ 0x22, 0x7A6, 0x40 },
2583	{ 0x22, 0x7A7, 0x00 },
2584	{ 0x22, 0x7A8, 0x00 },
2585	{ 0x22, 0x7A9, 0x40 },
2586	{ 0x22, 0x7AA, 0x00 },
2587	{ 0x22, 0x7AB, 0x00 },
2588	{ 0x22, 0x7AC, 0x2E },
2589	{ 0x22, 0x7AD, 0x80 },
2590	{ 0x22, 0x7A6, 0x93 },
2591	{ 0x22, 0x7A7, 0x5E },
2592	{ 0x22, 0x7A8, 0xD8 },
2593	{ 0x22, 0x7A9, 0x93 },
2594	{ 0x22, 0x7AA, 0x5E },
2595	{ 0x22, 0x7AB, 0xD8 },
2596	{ 0x22, 0x7AC, 0x2F },
2597	{ 0x22, 0x7AD, 0x80 },
2598	{ 0x22, 0x7A6, 0x32 },
2599	{ 0x22, 0x7A7, 0xB7 },
2600	{ 0x22, 0x7A8, 0xB1 },
2601	{ 0x22, 0x7A9, 0x32 },
2602	{ 0x22, 0x7AA, 0xB7 },
2603	{ 0x22, 0x7AB, 0xB1 },
2604	{ 0x22, 0x7AC, 0x30 },
2605	{ 0x22, 0x7AD, 0x80 },
2606	{ 0x22, 0x7A6, 0x6C },
2607	{ 0x22, 0x7A7, 0xA1 },
2608	{ 0x22, 0x7A8, 0x28 },
2609	{ 0x22, 0x7A9, 0x6C },
2610	{ 0x22, 0x7AA, 0xA1 },
2611	{ 0x22, 0x7AB, 0x28 },
2612	{ 0x22, 0x7AC, 0x31 },
2613	{ 0x22, 0x7AD, 0x80 },
2614	{ 0x22, 0x7A6, 0xCD },
2615	{ 0x22, 0x7A7, 0x48 },
2616	{ 0x22, 0x7A8, 0x4F },
2617	{ 0x22, 0x7A9, 0xCD },
2618	{ 0x22, 0x7AA, 0x48 },
2619	{ 0x22, 0x7AB, 0x4F },
2620	{ 0x22, 0x7AC, 0x32 },
2621	{ 0x22, 0x7AD, 0x80 },
2622	{ 0x22, 0x7A6, 0x40 },
2623	{ 0x22, 0x7A7, 0x00 },
2624	{ 0x22, 0x7A8, 0x00 },
2625	{ 0x22, 0x7A9, 0x40 },
2626	{ 0x22, 0x7AA, 0x00 },
2627	{ 0x22, 0x7AB, 0x00 },
2628	{ 0x22, 0x7AC, 0x33 },
2629	{ 0x22, 0x7AD, 0x80 },
2630	/* common */
2631	{ 0x22, 0x782, 0xC1 },
2632	{ 0x22, 0x771, 0x2C },
2633	{ 0x22, 0x772, 0x2C },
2634	{ 0x22, 0x788, 0x04 },
2635	{ 0x01, 0x7B0, 0x08 },
2636	{}
2637};
2638
2639static const struct hda_fixup stac92hd83xxx_fixups[] = {
2640	[STAC_92HD83XXX_REF] = {
2641		.type = HDA_FIXUP_PINS,
2642		.v.pins = ref92hd83xxx_pin_configs,
2643	},
2644	[STAC_92HD83XXX_PWR_REF] = {
2645		.type = HDA_FIXUP_PINS,
2646		.v.pins = ref92hd83xxx_pin_configs,
2647	},
2648	[STAC_DELL_S14] = {
2649		.type = HDA_FIXUP_PINS,
2650		.v.pins = dell_s14_pin_configs,
2651	},
2652	[STAC_DELL_VOSTRO_3500] = {
2653		.type = HDA_FIXUP_PINS,
2654		.v.pins = dell_vostro_3500_pin_configs,
2655	},
2656	[STAC_92HD83XXX_HP_cNB11_INTQUAD] = {
2657		.type = HDA_FIXUP_PINS,
2658		.v.pins = hp_cNB11_intquad_pin_configs,
2659		.chained = true,
2660		.chain_id = STAC_92HD83XXX_HP,
2661	},
2662	[STAC_92HD83XXX_HP] = {
2663		.type = HDA_FIXUP_FUNC,
2664		.v.func = stac92hd83xxx_fixup_hp,
2665	},
2666	[STAC_HP_DV7_4000] = {
2667		.type = HDA_FIXUP_PINS,
2668		.v.pins = hp_dv7_4000_pin_configs,
2669		.chained = true,
2670		.chain_id = STAC_92HD83XXX_HP,
2671	},
2672	[STAC_HP_ZEPHYR] = {
2673		.type = HDA_FIXUP_FUNC,
2674		.v.func = stac92hd83xxx_fixup_hp_zephyr,
2675		.chained = true,
2676		.chain_id = STAC_92HD83XXX_HP,
2677	},
2678	[STAC_92HD83XXX_HP_LED] = {
2679		.type = HDA_FIXUP_FUNC,
2680		.v.func = stac92hd83xxx_fixup_hp_led,
2681		.chained = true,
2682		.chain_id = STAC_92HD83XXX_HP,
2683	},
2684	[STAC_92HD83XXX_HP_INV_LED] = {
2685		.type = HDA_FIXUP_FUNC,
2686		.v.func = stac92hd83xxx_fixup_hp_inv_led,
2687		.chained = true,
2688		.chain_id = STAC_92HD83XXX_HP,
2689	},
2690	[STAC_92HD83XXX_HP_MIC_LED] = {
2691		.type = HDA_FIXUP_FUNC,
2692		.v.func = stac92hd83xxx_fixup_hp_mic_led,
2693		.chained = true,
2694		.chain_id = STAC_92HD83XXX_HP,
2695	},
2696	[STAC_HP_LED_GPIO10] = {
2697		.type = HDA_FIXUP_FUNC,
2698		.v.func = stac92hd83xxx_fixup_hp_led_gpio10,
2699		.chained = true,
2700		.chain_id = STAC_92HD83XXX_HP,
2701	},
2702	[STAC_92HD83XXX_HEADSET_JACK] = {
2703		.type = HDA_FIXUP_FUNC,
2704		.v.func = stac92hd83xxx_fixup_headset_jack,
2705	},
2706	[STAC_HP_ENVY_BASS] = {
2707		.type = HDA_FIXUP_PINS,
2708		.v.pins = (const struct hda_pintbl[]) {
2709			{ 0x0f, 0x90170111 },
2710			{}
2711		},
2712	},
2713	[STAC_HP_BNB13_EQ] = {
2714		.type = HDA_FIXUP_VERBS,
2715		.v.verbs = hp_bnb13_eq_verbs,
2716		.chained = true,
2717		.chain_id = STAC_92HD83XXX_HP_MIC_LED,
2718	},
2719	[STAC_HP_ENVY_TS_BASS] = {
2720		.type = HDA_FIXUP_PINS,
2721		.v.pins = (const struct hda_pintbl[]) {
2722			{ 0x10, 0x92170111 },
2723			{}
2724		},
2725	},
2726	[STAC_HP_ENVY_TS_DAC_BIND] = {
2727		.type = HDA_FIXUP_FUNC,
2728		.v.func = hp_envy_ts_fixup_dac_bind,
2729		.chained = true,
2730		.chain_id = STAC_HP_ENVY_TS_BASS,
2731	},
2732	[STAC_92HD83XXX_GPIO10_EAPD] = {
2733		.type = HDA_FIXUP_FUNC,
2734		.v.func = stac92hd83xxx_fixup_gpio10_eapd,
2735	},
2736};
2737
2738static const struct hda_model_fixup stac92hd83xxx_models[] = {
2739	{ .id = STAC_92HD83XXX_REF, .name = "ref" },
2740	{ .id = STAC_92HD83XXX_PWR_REF, .name = "mic-ref" },
2741	{ .id = STAC_DELL_S14, .name = "dell-s14" },
2742	{ .id = STAC_DELL_VOSTRO_3500, .name = "dell-vostro-3500" },
2743	{ .id = STAC_92HD83XXX_HP_cNB11_INTQUAD, .name = "hp_cNB11_intquad" },
2744	{ .id = STAC_HP_DV7_4000, .name = "hp-dv7-4000" },
2745	{ .id = STAC_HP_ZEPHYR, .name = "hp-zephyr" },
2746	{ .id = STAC_92HD83XXX_HP_LED, .name = "hp-led" },
2747	{ .id = STAC_92HD83XXX_HP_INV_LED, .name = "hp-inv-led" },
2748	{ .id = STAC_92HD83XXX_HP_MIC_LED, .name = "hp-mic-led" },
2749	{ .id = STAC_92HD83XXX_HEADSET_JACK, .name = "headset-jack" },
2750	{ .id = STAC_HP_ENVY_BASS, .name = "hp-envy-bass" },
2751	{ .id = STAC_HP_BNB13_EQ, .name = "hp-bnb13-eq" },
2752	{ .id = STAC_HP_ENVY_TS_BASS, .name = "hp-envy-ts-bass" },
2753	{}
2754};
2755
2756static const struct hda_quirk stac92hd83xxx_fixup_tbl[] = {
2757	/* SigmaTel reference board */
2758	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
2759		      "DFI LanParty", STAC_92HD83XXX_REF),
2760	SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
2761		      "DFI LanParty", STAC_92HD83XXX_REF),
2762	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02ba,
2763		      "unknown Dell", STAC_DELL_S14),
2764	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0532,
2765		      "Dell Latitude E6230", STAC_92HD83XXX_HEADSET_JACK),
2766	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0533,
2767		      "Dell Latitude E6330", STAC_92HD83XXX_HEADSET_JACK),
2768	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0534,
2769		      "Dell Latitude E6430", STAC_92HD83XXX_HEADSET_JACK),
2770	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0535,
2771		      "Dell Latitude E6530", STAC_92HD83XXX_HEADSET_JACK),
2772	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x053c,
2773		      "Dell Latitude E5430", STAC_92HD83XXX_HEADSET_JACK),
2774	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x053d,
2775		      "Dell Latitude E5530", STAC_92HD83XXX_HEADSET_JACK),
2776	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0549,
2777		      "Dell Latitude E5430", STAC_92HD83XXX_HEADSET_JACK),
2778	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x057d,
2779		      "Dell Latitude E6430s", STAC_92HD83XXX_HEADSET_JACK),
2780	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0584,
2781		      "Dell Latitude E6430U", STAC_92HD83XXX_HEADSET_JACK),
2782	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x1028,
2783		      "Dell Vostro 3500", STAC_DELL_VOSTRO_3500),
2784	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1656,
2785			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
2786	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1657,
2787			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
2788	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1658,
2789			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
2790	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1659,
2791			  "HP Pavilion dv7", STAC_HP_DV7_4000),
2792	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x165A,
2793			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
2794	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x165B,
2795			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
2796	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1888,
2797			  "HP Envy Spectre", STAC_HP_ENVY_BASS),
2798	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1899,
2799			  "HP Folio 13", STAC_HP_LED_GPIO10),
2800	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x18df,
2801			  "HP Folio", STAC_HP_BNB13_EQ),
2802	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x18F8,
2803			  "HP bNB13", STAC_HP_BNB13_EQ),
2804	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1909,
2805			  "HP bNB13", STAC_HP_BNB13_EQ),
2806	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x190A,
2807			  "HP bNB13", STAC_HP_BNB13_EQ),
2808	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x190e,
2809			  "HP ENVY TS", STAC_HP_ENVY_TS_BASS),
2810	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1967,
2811			  "HP ENVY TS", STAC_HP_ENVY_TS_DAC_BIND),
2812	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1940,
2813			  "HP bNB13", STAC_HP_BNB13_EQ),
2814	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1941,
2815			  "HP bNB13", STAC_HP_BNB13_EQ),
2816	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1942,
2817			  "HP bNB13", STAC_HP_BNB13_EQ),
2818	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1943,
2819			  "HP bNB13", STAC_HP_BNB13_EQ),
2820	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1944,
2821			  "HP bNB13", STAC_HP_BNB13_EQ),
2822	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1945,
2823			  "HP bNB13", STAC_HP_BNB13_EQ),
2824	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1946,
2825			  "HP bNB13", STAC_HP_BNB13_EQ),
2826	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1948,
2827			  "HP bNB13", STAC_HP_BNB13_EQ),
2828	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1949,
2829			  "HP bNB13", STAC_HP_BNB13_EQ),
2830	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x194A,
2831			  "HP bNB13", STAC_HP_BNB13_EQ),
2832	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x194B,
2833			  "HP bNB13", STAC_HP_BNB13_EQ),
2834	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x194C,
2835			  "HP bNB13", STAC_HP_BNB13_EQ),
2836	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x194E,
2837			  "HP bNB13", STAC_HP_BNB13_EQ),
2838	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x194F,
2839			  "HP bNB13", STAC_HP_BNB13_EQ),
2840	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1950,
2841			  "HP bNB13", STAC_HP_BNB13_EQ),
2842	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1951,
2843			  "HP bNB13", STAC_HP_BNB13_EQ),
2844	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x195A,
2845			  "HP bNB13", STAC_HP_BNB13_EQ),
2846	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x195B,
2847			  "HP bNB13", STAC_HP_BNB13_EQ),
2848	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x195C,
2849			  "HP bNB13", STAC_HP_BNB13_EQ),
2850	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1991,
2851			  "HP bNB13", STAC_HP_BNB13_EQ),
2852	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2103,
2853			  "HP bNB13", STAC_HP_BNB13_EQ),
2854	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2104,
2855			  "HP bNB13", STAC_HP_BNB13_EQ),
2856	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2105,
2857			  "HP bNB13", STAC_HP_BNB13_EQ),
2858	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2106,
2859			  "HP bNB13", STAC_HP_BNB13_EQ),
2860	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2107,
2861			  "HP bNB13", STAC_HP_BNB13_EQ),
2862	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2108,
2863			  "HP bNB13", STAC_HP_BNB13_EQ),
2864	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2109,
2865			  "HP bNB13", STAC_HP_BNB13_EQ),
2866	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x210A,
2867			  "HP bNB13", STAC_HP_BNB13_EQ),
2868	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x210B,
2869			  "HP bNB13", STAC_HP_BNB13_EQ),
2870	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x211C,
2871			  "HP bNB13", STAC_HP_BNB13_EQ),
2872	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x211D,
2873			  "HP bNB13", STAC_HP_BNB13_EQ),
2874	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x211E,
2875			  "HP bNB13", STAC_HP_BNB13_EQ),
2876	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x211F,
2877			  "HP bNB13", STAC_HP_BNB13_EQ),
2878	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2120,
2879			  "HP bNB13", STAC_HP_BNB13_EQ),
2880	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2121,
2881			  "HP bNB13", STAC_HP_BNB13_EQ),
2882	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2122,
2883			  "HP bNB13", STAC_HP_BNB13_EQ),
2884	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2123,
2885			  "HP bNB13", STAC_HP_BNB13_EQ),
2886	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x213E,
2887			  "HP bNB13", STAC_HP_BNB13_EQ),
2888	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x213F,
2889			  "HP bNB13", STAC_HP_BNB13_EQ),
2890	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x2140,
2891			  "HP bNB13", STAC_HP_BNB13_EQ),
2892	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x21B2,
2893			  "HP bNB13", STAC_HP_BNB13_EQ),
2894	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x21B3,
2895			  "HP bNB13", STAC_HP_BNB13_EQ),
2896	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x21B5,
2897			  "HP bNB13", STAC_HP_BNB13_EQ),
2898	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x21B6,
2899			  "HP bNB13", STAC_HP_BNB13_EQ),
2900	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xff00, 0x1900,
2901			  "HP", STAC_92HD83XXX_HP_MIC_LED),
2902	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xff00, 0x2000,
2903			  "HP", STAC_92HD83XXX_HP_MIC_LED),
2904	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xff00, 0x2100,
2905			  "HP", STAC_92HD83XXX_HP_MIC_LED),
2906	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3388,
2907			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
2908	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3389,
2909			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
2910	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x355B,
2911			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
2912	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x355C,
2913			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
2914	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x355D,
2915			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
2916	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x355E,
2917			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
2918	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x355F,
2919			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
2920	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3560,
2921			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
2922	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x358B,
2923			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
2924	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x358C,
2925			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
2926	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x358D,
2927			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
2928	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3591,
2929			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
2930	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3592,
2931			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
2932	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3593,
2933			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
2934	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3561,
2935			  "HP", STAC_HP_ZEPHYR),
2936	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3660,
2937			  "HP Mini", STAC_92HD83XXX_HP_LED),
2938	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x144E,
2939			  "HP Pavilion dv5", STAC_92HD83XXX_HP_INV_LED),
2940	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x148a,
2941		      "HP Mini", STAC_92HD83XXX_HP_LED),
2942	SND_PCI_QUIRK_VENDOR(PCI_VENDOR_ID_HP, "HP", STAC_92HD83XXX_HP),
2943	/* match both for 0xfa91 and 0xfa93 */
2944	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_TOSHIBA, 0xfffd, 0xfa91,
2945		      "Toshiba Satellite S50D", STAC_92HD83XXX_GPIO10_EAPD),
2946	{} /* terminator */
2947};
2948
2949/* HP dv7 bass switch - GPIO5 */
2950#define stac_hp_bass_gpio_info	snd_ctl_boolean_mono_info
2951static int stac_hp_bass_gpio_get(struct snd_kcontrol *kcontrol,
2952				 struct snd_ctl_elem_value *ucontrol)
2953{
2954	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2955	struct sigmatel_spec *spec = codec->spec;
2956	ucontrol->value.integer.value[0] = !!(spec->gpio_data & 0x20);
2957	return 0;
2958}
2959
2960static int stac_hp_bass_gpio_put(struct snd_kcontrol *kcontrol,
2961				 struct snd_ctl_elem_value *ucontrol)
2962{
2963	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2964	struct sigmatel_spec *spec = codec->spec;
2965	unsigned int gpio_data;
2966
2967	gpio_data = (spec->gpio_data & ~0x20) |
2968		(ucontrol->value.integer.value[0] ? 0x20 : 0);
2969	if (gpio_data == spec->gpio_data)
2970		return 0;
2971	spec->gpio_data = gpio_data;
2972	stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, spec->gpio_data);
2973	return 1;
2974}
2975
2976static const struct snd_kcontrol_new stac_hp_bass_sw_ctrl = {
2977	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2978	.info = stac_hp_bass_gpio_info,
2979	.get = stac_hp_bass_gpio_get,
2980	.put = stac_hp_bass_gpio_put,
2981};
2982
2983static int stac_add_hp_bass_switch(struct hda_codec *codec)
2984{
2985	struct sigmatel_spec *spec = codec->spec;
2986
2987	if (!snd_hda_gen_add_kctl(&spec->gen, "Bass Speaker Playback Switch",
2988				  &stac_hp_bass_sw_ctrl))
2989		return -ENOMEM;
2990
2991	spec->gpio_mask |= 0x20;
2992	spec->gpio_dir |= 0x20;
2993	spec->gpio_data |= 0x20;
2994	return 0;
2995}
2996
2997static const struct hda_pintbl ref92hd71bxx_pin_configs[] = {
2998	{ 0x0a, 0x02214030 },
2999	{ 0x0b, 0x02a19040 },
3000	{ 0x0c, 0x01a19020 },
3001	{ 0x0d, 0x01014010 },
3002	{ 0x0e, 0x0181302e },
3003	{ 0x0f, 0x01014010 },
3004	{ 0x14, 0x01019020 },
3005	{ 0x18, 0x90a000f0 },
3006	{ 0x19, 0x90a000f0 },
3007	{ 0x1e, 0x01452050 },
3008	{ 0x1f, 0x01452050 },
3009	{}
3010};
3011
3012static const struct hda_pintbl dell_m4_1_pin_configs[] = {
3013	{ 0x0a, 0x0421101f },
3014	{ 0x0b, 0x04a11221 },
3015	{ 0x0c, 0x40f000f0 },
3016	{ 0x0d, 0x90170110 },
3017	{ 0x0e, 0x23a1902e },
3018	{ 0x0f, 0x23014250 },
3019	{ 0x14, 0x40f000f0 },
3020	{ 0x18, 0x90a000f0 },
3021	{ 0x19, 0x40f000f0 },
3022	{ 0x1e, 0x4f0000f0 },
3023	{ 0x1f, 0x4f0000f0 },
3024	{}
3025};
3026
3027static const struct hda_pintbl dell_m4_2_pin_configs[] = {
3028	{ 0x0a, 0x0421101f },
3029	{ 0x0b, 0x04a11221 },
3030	{ 0x0c, 0x90a70330 },
3031	{ 0x0d, 0x90170110 },
3032	{ 0x0e, 0x23a1902e },
3033	{ 0x0f, 0x23014250 },
3034	{ 0x14, 0x40f000f0 },
3035	{ 0x18, 0x40f000f0 },
3036	{ 0x19, 0x40f000f0 },
3037	{ 0x1e, 0x044413b0 },
3038	{ 0x1f, 0x044413b0 },
3039	{}
3040};
3041
3042static const struct hda_pintbl dell_m4_3_pin_configs[] = {
3043	{ 0x0a, 0x0421101f },
3044	{ 0x0b, 0x04a11221 },
3045	{ 0x0c, 0x90a70330 },
3046	{ 0x0d, 0x90170110 },
3047	{ 0x0e, 0x40f000f0 },
3048	{ 0x0f, 0x40f000f0 },
3049	{ 0x14, 0x40f000f0 },
3050	{ 0x18, 0x90a000f0 },
3051	{ 0x19, 0x40f000f0 },
3052	{ 0x1e, 0x044413b0 },
3053	{ 0x1f, 0x044413b0 },
3054	{}
3055};
3056
3057static void stac92hd71bxx_fixup_ref(struct hda_codec *codec,
3058				    const struct hda_fixup *fix, int action)
3059{
3060	struct sigmatel_spec *spec = codec->spec;
3061
3062	if (action != HDA_FIXUP_ACT_PRE_PROBE)
3063		return;
3064
3065	snd_hda_apply_pincfgs(codec, ref92hd71bxx_pin_configs);
3066	spec->gpio_mask = spec->gpio_dir = spec->gpio_data = 0;
3067}
3068
3069static void stac92hd71bxx_fixup_hp_m4(struct hda_codec *codec,
3070				      const struct hda_fixup *fix, int action)
3071{
3072	struct sigmatel_spec *spec = codec->spec;
3073	struct hda_jack_callback *jack;
3074
3075	if (action != HDA_FIXUP_ACT_PRE_PROBE)
3076		return;
3077
3078	/* Enable VREF power saving on GPIO1 detect */
3079	snd_hda_codec_write_cache(codec, codec->core.afg, 0,
3080				  AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x02);
3081	jack = snd_hda_jack_detect_enable_callback(codec, codec->core.afg,
3082						   stac_vref_event);
3083	if (!IS_ERR(jack))
3084		jack->private_data = 0x02;
3085
3086	spec->gpio_mask |= 0x02;
3087
3088	/* enable internal microphone */
3089	snd_hda_codec_set_pincfg(codec, 0x0e, 0x01813040);
3090}
3091
3092static void stac92hd71bxx_fixup_hp_dv4(struct hda_codec *codec,
3093				       const struct hda_fixup *fix, int action)
3094{
3095	struct sigmatel_spec *spec = codec->spec;
3096
3097	if (action != HDA_FIXUP_ACT_PRE_PROBE)
3098		return;
3099	spec->gpio_led = 0x01;
3100}
3101
3102static void stac92hd71bxx_fixup_hp_dv5(struct hda_codec *codec,
3103				       const struct hda_fixup *fix, int action)
3104{
3105	unsigned int cap;
3106
3107	switch (action) {
3108	case HDA_FIXUP_ACT_PRE_PROBE:
3109		snd_hda_codec_set_pincfg(codec, 0x0d, 0x90170010);
3110		break;
3111
3112	case HDA_FIXUP_ACT_PROBE:
3113		/* enable bass on HP dv7 */
3114		cap = snd_hda_param_read(codec, 0x1, AC_PAR_GPIO_CAP);
3115		cap &= AC_GPIO_IO_COUNT;
3116		if (cap >= 6)
3117			stac_add_hp_bass_switch(codec);
3118		break;
3119	}
3120}
3121
3122static void stac92hd71bxx_fixup_hp_hdx(struct hda_codec *codec,
3123				       const struct hda_fixup *fix, int action)
3124{
3125	struct sigmatel_spec *spec = codec->spec;
3126
3127	if (action != HDA_FIXUP_ACT_PRE_PROBE)
3128		return;
3129	spec->gpio_led = 0x08;
3130}
3131
3132static bool is_hp_output(struct hda_codec *codec, hda_nid_t pin)
3133{
3134	unsigned int pin_cfg = snd_hda_codec_get_pincfg(codec, pin);
3135
3136	/* count line-out, too, as BIOS sets often so */
3137	return get_defcfg_connect(pin_cfg) != AC_JACK_PORT_NONE &&
3138		(get_defcfg_device(pin_cfg) == AC_JACK_LINE_OUT ||
3139		 get_defcfg_device(pin_cfg) == AC_JACK_HP_OUT);
3140}
3141
3142static void fixup_hp_headphone(struct hda_codec *codec, hda_nid_t pin)
3143{
3144	unsigned int pin_cfg = snd_hda_codec_get_pincfg(codec, pin);
3145
3146	/* It was changed in the BIOS to just satisfy MS DTM.
3147	 * Lets turn it back into follower HP
3148	 */
3149	pin_cfg = (pin_cfg & (~AC_DEFCFG_DEVICE)) |
3150		(AC_JACK_HP_OUT << AC_DEFCFG_DEVICE_SHIFT);
3151	pin_cfg = (pin_cfg & (~(AC_DEFCFG_DEF_ASSOC | AC_DEFCFG_SEQUENCE))) |
3152		0x1f;
3153	snd_hda_codec_set_pincfg(codec, pin, pin_cfg);
3154}
3155
3156static void stac92hd71bxx_fixup_hp(struct hda_codec *codec,
3157				   const struct hda_fixup *fix, int action)
3158{
3159	struct sigmatel_spec *spec = codec->spec;
3160
3161	if (action != HDA_FIXUP_ACT_PRE_PROBE)
3162		return;
3163
3164	/* when both output A and F are assigned, these are supposedly
3165	 * dock and built-in headphones; fix both pin configs
3166	 */
3167	if (is_hp_output(codec, 0x0a) && is_hp_output(codec, 0x0f)) {
3168		fixup_hp_headphone(codec, 0x0a);
3169		fixup_hp_headphone(codec, 0x0f);
3170	}
3171
3172	if (find_mute_led_cfg(codec, 1))
3173		codec_dbg(codec, "mute LED gpio %d polarity %d\n",
3174				spec->gpio_led,
3175				spec->gpio_led_polarity);
3176
3177}
3178
3179static const struct hda_fixup stac92hd71bxx_fixups[] = {
3180	[STAC_92HD71BXX_REF] = {
3181		.type = HDA_FIXUP_FUNC,
3182		.v.func = stac92hd71bxx_fixup_ref,
3183	},
3184	[STAC_DELL_M4_1] = {
3185		.type = HDA_FIXUP_PINS,
3186		.v.pins = dell_m4_1_pin_configs,
3187	},
3188	[STAC_DELL_M4_2] = {
3189		.type = HDA_FIXUP_PINS,
3190		.v.pins = dell_m4_2_pin_configs,
3191	},
3192	[STAC_DELL_M4_3] = {
3193		.type = HDA_FIXUP_PINS,
3194		.v.pins = dell_m4_3_pin_configs,
3195	},
3196	[STAC_HP_M4] = {
3197		.type = HDA_FIXUP_FUNC,
3198		.v.func = stac92hd71bxx_fixup_hp_m4,
3199		.chained = true,
3200		.chain_id = STAC_92HD71BXX_HP,
3201	},
3202	[STAC_HP_DV4] = {
3203		.type = HDA_FIXUP_FUNC,
3204		.v.func = stac92hd71bxx_fixup_hp_dv4,
3205		.chained = true,
3206		.chain_id = STAC_HP_DV5,
3207	},
3208	[STAC_HP_DV5] = {
3209		.type = HDA_FIXUP_FUNC,
3210		.v.func = stac92hd71bxx_fixup_hp_dv5,
3211		.chained = true,
3212		.chain_id = STAC_92HD71BXX_HP,
3213	},
3214	[STAC_HP_HDX] = {
3215		.type = HDA_FIXUP_FUNC,
3216		.v.func = stac92hd71bxx_fixup_hp_hdx,
3217		.chained = true,
3218		.chain_id = STAC_92HD71BXX_HP,
3219	},
3220	[STAC_92HD71BXX_HP] = {
3221		.type = HDA_FIXUP_FUNC,
3222		.v.func = stac92hd71bxx_fixup_hp,
3223	},
3224};
3225
3226static const struct hda_model_fixup stac92hd71bxx_models[] = {
3227	{ .id = STAC_92HD71BXX_REF, .name = "ref" },
3228	{ .id = STAC_DELL_M4_1, .name = "dell-m4-1" },
3229	{ .id = STAC_DELL_M4_2, .name = "dell-m4-2" },
3230	{ .id = STAC_DELL_M4_3, .name = "dell-m4-3" },
3231	{ .id = STAC_HP_M4, .name = "hp-m4" },
3232	{ .id = STAC_HP_DV4, .name = "hp-dv4" },
3233	{ .id = STAC_HP_DV5, .name = "hp-dv5" },
3234	{ .id = STAC_HP_HDX, .name = "hp-hdx" },
3235	{ .id = STAC_HP_DV4, .name = "hp-dv4-1222nr" },
3236	{}
3237};
3238
3239static const struct hda_quirk stac92hd71bxx_fixup_tbl[] = {
3240	/* SigmaTel reference board */
3241	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
3242		      "DFI LanParty", STAC_92HD71BXX_REF),
3243	SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
3244		      "DFI LanParty", STAC_92HD71BXX_REF),
 
 
3245	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x1720,
3246			  "HP", STAC_HP_DV5),
3247	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3080,
3248		      "HP", STAC_HP_DV5),
3249	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x30f0,
3250		      "HP dv4-7", STAC_HP_DV4),
3251	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3600,
3252		      "HP dv4-7", STAC_HP_DV5),
3253	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3610,
3254		      "HP HDX", STAC_HP_HDX),  /* HDX18 */
3255	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361a,
3256		      "HP mini 1000", STAC_HP_M4),
3257	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361b,
3258		      "HP HDX", STAC_HP_HDX),  /* HDX16 */
3259	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3620,
3260		      "HP dv6", STAC_HP_DV5),
3261	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3061,
3262		      "HP dv6", STAC_HP_DV5), /* HP dv6-1110ax */
3263	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x363e,
3264		      "HP DV6", STAC_HP_DV5),
3265	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x7010,
3266		      "HP", STAC_HP_DV5),
3267	SND_PCI_QUIRK_VENDOR(PCI_VENDOR_ID_HP, "HP", STAC_92HD71BXX_HP),
3268	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0233,
3269				"unknown Dell", STAC_DELL_M4_1),
3270	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0234,
3271				"unknown Dell", STAC_DELL_M4_1),
3272	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0250,
3273				"unknown Dell", STAC_DELL_M4_1),
3274	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x024f,
3275				"unknown Dell", STAC_DELL_M4_1),
3276	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x024d,
3277				"unknown Dell", STAC_DELL_M4_1),
3278	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0251,
3279				"unknown Dell", STAC_DELL_M4_1),
3280	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0277,
3281				"unknown Dell", STAC_DELL_M4_1),
3282	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0263,
3283				"unknown Dell", STAC_DELL_M4_2),
3284	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0265,
3285				"unknown Dell", STAC_DELL_M4_2),
3286	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0262,
3287				"unknown Dell", STAC_DELL_M4_2),
3288	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0264,
3289				"unknown Dell", STAC_DELL_M4_2),
3290	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02aa,
3291				"unknown Dell", STAC_DELL_M4_3),
3292	{} /* terminator */
3293};
3294
3295static const struct hda_pintbl ref922x_pin_configs[] = {
3296	{ 0x0a, 0x01014010 },
3297	{ 0x0b, 0x01016011 },
3298	{ 0x0c, 0x01012012 },
3299	{ 0x0d, 0x0221401f },
3300	{ 0x0e, 0x01813122 },
3301	{ 0x0f, 0x01011014 },
3302	{ 0x10, 0x01441030 },
3303	{ 0x11, 0x01c41030 },
3304	{ 0x15, 0x40000100 },
3305	{ 0x1b, 0x40000100 },
3306	{}
3307};
3308
3309/*
3310    STAC 922X pin configs for
3311    102801A7
3312    102801AB
3313    102801A9
3314    102801D1
3315    102801D2
3316*/
3317static const struct hda_pintbl dell_922x_d81_pin_configs[] = {
3318	{ 0x0a, 0x02214030 },
3319	{ 0x0b, 0x01a19021 },
3320	{ 0x0c, 0x01111012 },
3321	{ 0x0d, 0x01114010 },
3322	{ 0x0e, 0x02a19020 },
3323	{ 0x0f, 0x01117011 },
3324	{ 0x10, 0x400001f0 },
3325	{ 0x11, 0x400001f1 },
3326	{ 0x15, 0x01813122 },
3327	{ 0x1b, 0x400001f2 },
3328	{}
3329};
3330
3331/*
3332    STAC 922X pin configs for
3333    102801AC
3334    102801D0
3335*/
3336static const struct hda_pintbl dell_922x_d82_pin_configs[] = {
3337	{ 0x0a, 0x02214030 },
3338	{ 0x0b, 0x01a19021 },
3339	{ 0x0c, 0x01111012 },
3340	{ 0x0d, 0x01114010 },
3341	{ 0x0e, 0x02a19020 },
3342	{ 0x0f, 0x01117011 },
3343	{ 0x10, 0x01451140 },
3344	{ 0x11, 0x400001f0 },
3345	{ 0x15, 0x01813122 },
3346	{ 0x1b, 0x400001f1 },
3347	{}
3348};
3349
3350/*
3351    STAC 922X pin configs for
3352    102801BF
3353*/
3354static const struct hda_pintbl dell_922x_m81_pin_configs[] = {
3355	{ 0x0a, 0x0321101f },
3356	{ 0x0b, 0x01112024 },
3357	{ 0x0c, 0x01111222 },
3358	{ 0x0d, 0x91174220 },
3359	{ 0x0e, 0x03a11050 },
3360	{ 0x0f, 0x01116221 },
3361	{ 0x10, 0x90a70330 },
3362	{ 0x11, 0x01452340 },
3363	{ 0x15, 0x40C003f1 },
3364	{ 0x1b, 0x405003f0 },
3365	{}
3366};
3367
3368/*
3369    STAC 9221 A1 pin configs for
3370    102801D7 (Dell XPS M1210)
3371*/
3372static const struct hda_pintbl dell_922x_m82_pin_configs[] = {
3373	{ 0x0a, 0x02211211 },
3374	{ 0x0b, 0x408103ff },
3375	{ 0x0c, 0x02a1123e },
3376	{ 0x0d, 0x90100310 },
3377	{ 0x0e, 0x408003f1 },
3378	{ 0x0f, 0x0221121f },
3379	{ 0x10, 0x03451340 },
3380	{ 0x11, 0x40c003f2 },
3381	{ 0x15, 0x508003f3 },
3382	{ 0x1b, 0x405003f4 },
3383	{}
3384};
3385
3386static const struct hda_pintbl d945gtp3_pin_configs[] = {
3387	{ 0x0a, 0x0221401f },
3388	{ 0x0b, 0x01a19022 },
3389	{ 0x0c, 0x01813021 },
3390	{ 0x0d, 0x01014010 },
3391	{ 0x0e, 0x40000100 },
3392	{ 0x0f, 0x40000100 },
3393	{ 0x10, 0x40000100 },
3394	{ 0x11, 0x40000100 },
3395	{ 0x15, 0x02a19120 },
3396	{ 0x1b, 0x40000100 },
3397	{}
3398};
3399
3400static const struct hda_pintbl d945gtp5_pin_configs[] = {
3401	{ 0x0a, 0x0221401f },
3402	{ 0x0b, 0x01011012 },
3403	{ 0x0c, 0x01813024 },
3404	{ 0x0d, 0x01014010 },
3405	{ 0x0e, 0x01a19021 },
3406	{ 0x0f, 0x01016011 },
3407	{ 0x10, 0x01452130 },
3408	{ 0x11, 0x40000100 },
3409	{ 0x15, 0x02a19320 },
3410	{ 0x1b, 0x40000100 },
3411	{}
3412};
3413
3414static const struct hda_pintbl intel_mac_v1_pin_configs[] = {
3415	{ 0x0a, 0x0121e21f },
3416	{ 0x0b, 0x400000ff },
3417	{ 0x0c, 0x9017e110 },
3418	{ 0x0d, 0x400000fd },
3419	{ 0x0e, 0x400000fe },
3420	{ 0x0f, 0x0181e020 },
3421	{ 0x10, 0x1145e030 },
3422	{ 0x11, 0x11c5e240 },
3423	{ 0x15, 0x400000fc },
3424	{ 0x1b, 0x400000fb },
3425	{}
3426};
3427
3428static const struct hda_pintbl intel_mac_v2_pin_configs[] = {
3429	{ 0x0a, 0x0121e21f },
3430	{ 0x0b, 0x90a7012e },
3431	{ 0x0c, 0x9017e110 },
3432	{ 0x0d, 0x400000fd },
3433	{ 0x0e, 0x400000fe },
3434	{ 0x0f, 0x0181e020 },
3435	{ 0x10, 0x1145e230 },
3436	{ 0x11, 0x500000fa },
3437	{ 0x15, 0x400000fc },
3438	{ 0x1b, 0x400000fb },
3439	{}
3440};
3441
3442static const struct hda_pintbl intel_mac_v3_pin_configs[] = {
3443	{ 0x0a, 0x0121e21f },
3444	{ 0x0b, 0x90a7012e },
3445	{ 0x0c, 0x9017e110 },
3446	{ 0x0d, 0x400000fd },
3447	{ 0x0e, 0x400000fe },
3448	{ 0x0f, 0x0181e020 },
3449	{ 0x10, 0x1145e230 },
3450	{ 0x11, 0x11c5e240 },
3451	{ 0x15, 0x400000fc },
3452	{ 0x1b, 0x400000fb },
3453	{}
3454};
3455
3456static const struct hda_pintbl intel_mac_v4_pin_configs[] = {
3457	{ 0x0a, 0x0321e21f },
3458	{ 0x0b, 0x03a1e02e },
3459	{ 0x0c, 0x9017e110 },
3460	{ 0x0d, 0x9017e11f },
3461	{ 0x0e, 0x400000fe },
3462	{ 0x0f, 0x0381e020 },
3463	{ 0x10, 0x1345e230 },
3464	{ 0x11, 0x13c5e240 },
3465	{ 0x15, 0x400000fc },
3466	{ 0x1b, 0x400000fb },
3467	{}
3468};
3469
3470static const struct hda_pintbl intel_mac_v5_pin_configs[] = {
3471	{ 0x0a, 0x0321e21f },
3472	{ 0x0b, 0x03a1e02e },
3473	{ 0x0c, 0x9017e110 },
3474	{ 0x0d, 0x9017e11f },
3475	{ 0x0e, 0x400000fe },
3476	{ 0x0f, 0x0381e020 },
3477	{ 0x10, 0x1345e230 },
3478	{ 0x11, 0x13c5e240 },
3479	{ 0x15, 0x400000fc },
3480	{ 0x1b, 0x400000fb },
3481	{}
3482};
3483
3484static const struct hda_pintbl ecs202_pin_configs[] = {
3485	{ 0x0a, 0x0221401f },
3486	{ 0x0b, 0x02a19020 },
3487	{ 0x0c, 0x01a19020 },
3488	{ 0x0d, 0x01114010 },
3489	{ 0x0e, 0x408000f0 },
3490	{ 0x0f, 0x01813022 },
3491	{ 0x10, 0x074510a0 },
3492	{ 0x11, 0x40c400f1 },
3493	{ 0x15, 0x9037012e },
3494	{ 0x1b, 0x40e000f2 },
3495	{}
3496};
3497
3498/* codec SSIDs for Intel Mac sharing the same PCI SSID 8384:7680 */
3499static const struct hda_quirk stac922x_intel_mac_fixup_tbl[] = {
3500	SND_PCI_QUIRK(0x0000, 0x0100, "Mac Mini", STAC_INTEL_MAC_V3),
3501	SND_PCI_QUIRK(0x106b, 0x0800, "Mac", STAC_INTEL_MAC_V1),
3502	SND_PCI_QUIRK(0x106b, 0x0600, "Mac", STAC_INTEL_MAC_V2),
3503	SND_PCI_QUIRK(0x106b, 0x0700, "Mac", STAC_INTEL_MAC_V2),
3504	SND_PCI_QUIRK(0x106b, 0x0e00, "Mac", STAC_INTEL_MAC_V3),
3505	SND_PCI_QUIRK(0x106b, 0x0f00, "Mac", STAC_INTEL_MAC_V3),
3506	SND_PCI_QUIRK(0x106b, 0x1600, "Mac", STAC_INTEL_MAC_V3),
3507	SND_PCI_QUIRK(0x106b, 0x1700, "Mac", STAC_INTEL_MAC_V3),
3508	SND_PCI_QUIRK(0x106b, 0x0200, "Mac", STAC_INTEL_MAC_V3),
3509	SND_PCI_QUIRK(0x106b, 0x1e00, "Mac", STAC_INTEL_MAC_V3),
3510	SND_PCI_QUIRK(0x106b, 0x1a00, "Mac", STAC_INTEL_MAC_V4),
3511	SND_PCI_QUIRK(0x106b, 0x0a00, "Mac", STAC_INTEL_MAC_V5),
3512	SND_PCI_QUIRK(0x106b, 0x2200, "Mac", STAC_INTEL_MAC_V5),
3513	{}
3514};
3515
3516static const struct hda_fixup stac922x_fixups[];
3517
3518/* remap the fixup from codec SSID and apply it */
3519static void stac922x_fixup_intel_mac_auto(struct hda_codec *codec,
3520					  const struct hda_fixup *fix,
3521					  int action)
3522{
3523	if (action != HDA_FIXUP_ACT_PRE_PROBE)
3524		return;
3525
3526	codec->fixup_id = HDA_FIXUP_ID_NOT_SET;
3527	snd_hda_pick_fixup(codec, NULL, stac922x_intel_mac_fixup_tbl,
3528			   stac922x_fixups);
3529	if (codec->fixup_id != HDA_FIXUP_ID_NOT_SET)
3530		snd_hda_apply_fixup(codec, action);
3531}
3532
3533static void stac922x_fixup_intel_mac_gpio(struct hda_codec *codec,
3534					  const struct hda_fixup *fix,
3535					  int action)
3536{
3537	struct sigmatel_spec *spec = codec->spec;
3538
3539	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3540		spec->gpio_mask = spec->gpio_dir = 0x03;
3541		spec->gpio_data = 0x03;
3542	}
3543}
3544
3545static const struct hda_fixup stac922x_fixups[] = {
3546	[STAC_D945_REF] = {
3547		.type = HDA_FIXUP_PINS,
3548		.v.pins = ref922x_pin_configs,
3549	},
3550	[STAC_D945GTP3] = {
3551		.type = HDA_FIXUP_PINS,
3552		.v.pins = d945gtp3_pin_configs,
3553	},
3554	[STAC_D945GTP5] = {
3555		.type = HDA_FIXUP_PINS,
3556		.v.pins = d945gtp5_pin_configs,
3557	},
3558	[STAC_INTEL_MAC_AUTO] = {
3559		.type = HDA_FIXUP_FUNC,
3560		.v.func = stac922x_fixup_intel_mac_auto,
3561	},
3562	[STAC_INTEL_MAC_V1] = {
3563		.type = HDA_FIXUP_PINS,
3564		.v.pins = intel_mac_v1_pin_configs,
3565		.chained = true,
3566		.chain_id = STAC_922X_INTEL_MAC_GPIO,
3567	},
3568	[STAC_INTEL_MAC_V2] = {
3569		.type = HDA_FIXUP_PINS,
3570		.v.pins = intel_mac_v2_pin_configs,
3571		.chained = true,
3572		.chain_id = STAC_922X_INTEL_MAC_GPIO,
3573	},
3574	[STAC_INTEL_MAC_V3] = {
3575		.type = HDA_FIXUP_PINS,
3576		.v.pins = intel_mac_v3_pin_configs,
3577		.chained = true,
3578		.chain_id = STAC_922X_INTEL_MAC_GPIO,
3579	},
3580	[STAC_INTEL_MAC_V4] = {
3581		.type = HDA_FIXUP_PINS,
3582		.v.pins = intel_mac_v4_pin_configs,
3583		.chained = true,
3584		.chain_id = STAC_922X_INTEL_MAC_GPIO,
3585	},
3586	[STAC_INTEL_MAC_V5] = {
3587		.type = HDA_FIXUP_PINS,
3588		.v.pins = intel_mac_v5_pin_configs,
3589		.chained = true,
3590		.chain_id = STAC_922X_INTEL_MAC_GPIO,
3591	},
3592	[STAC_922X_INTEL_MAC_GPIO] = {
3593		.type = HDA_FIXUP_FUNC,
3594		.v.func = stac922x_fixup_intel_mac_gpio,
3595	},
3596	[STAC_ECS_202] = {
3597		.type = HDA_FIXUP_PINS,
3598		.v.pins = ecs202_pin_configs,
3599	},
3600	[STAC_922X_DELL_D81] = {
3601		.type = HDA_FIXUP_PINS,
3602		.v.pins = dell_922x_d81_pin_configs,
3603	},
3604	[STAC_922X_DELL_D82] = {
3605		.type = HDA_FIXUP_PINS,
3606		.v.pins = dell_922x_d82_pin_configs,
3607	},
3608	[STAC_922X_DELL_M81] = {
3609		.type = HDA_FIXUP_PINS,
3610		.v.pins = dell_922x_m81_pin_configs,
3611	},
3612	[STAC_922X_DELL_M82] = {
3613		.type = HDA_FIXUP_PINS,
3614		.v.pins = dell_922x_m82_pin_configs,
3615	},
3616};
3617
3618static const struct hda_model_fixup stac922x_models[] = {
3619	{ .id = STAC_D945_REF, .name = "ref" },
3620	{ .id = STAC_D945GTP5, .name = "5stack" },
3621	{ .id = STAC_D945GTP3, .name = "3stack" },
3622	{ .id = STAC_INTEL_MAC_V1, .name = "intel-mac-v1" },
3623	{ .id = STAC_INTEL_MAC_V2, .name = "intel-mac-v2" },
3624	{ .id = STAC_INTEL_MAC_V3, .name = "intel-mac-v3" },
3625	{ .id = STAC_INTEL_MAC_V4, .name = "intel-mac-v4" },
3626	{ .id = STAC_INTEL_MAC_V5, .name = "intel-mac-v5" },
3627	{ .id = STAC_INTEL_MAC_AUTO, .name = "intel-mac-auto" },
3628	{ .id = STAC_ECS_202, .name = "ecs202" },
3629	{ .id = STAC_922X_DELL_D81, .name = "dell-d81" },
3630	{ .id = STAC_922X_DELL_D82, .name = "dell-d82" },
3631	{ .id = STAC_922X_DELL_M81, .name = "dell-m81" },
3632	{ .id = STAC_922X_DELL_M82, .name = "dell-m82" },
3633	/* for backward compatibility */
3634	{ .id = STAC_INTEL_MAC_V3, .name = "macmini" },
3635	{ .id = STAC_INTEL_MAC_V5, .name = "macbook" },
3636	{ .id = STAC_INTEL_MAC_V3, .name = "macbook-pro-v1" },
3637	{ .id = STAC_INTEL_MAC_V3, .name = "macbook-pro" },
3638	{ .id = STAC_INTEL_MAC_V2, .name = "imac-intel" },
3639	{ .id = STAC_INTEL_MAC_V3, .name = "imac-intel-20" },
3640	{}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3641};
3642
3643static const struct hda_quirk stac922x_fixup_tbl[] = {
3644	/* SigmaTel reference board */
3645	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
3646		      "DFI LanParty", STAC_D945_REF),
3647	SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
3648		      "DFI LanParty", STAC_D945_REF),
3649	/* Intel 945G based systems */
3650	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0101,
3651		      "Intel D945G", STAC_D945GTP3),
3652	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0202,
3653		      "Intel D945G", STAC_D945GTP3),
3654	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0606,
3655		      "Intel D945G", STAC_D945GTP3),
3656	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0601,
3657		      "Intel D945G", STAC_D945GTP3),
3658	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0111,
3659		      "Intel D945G", STAC_D945GTP3),
3660	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1115,
3661		      "Intel D945G", STAC_D945GTP3),
3662	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1116,
3663		      "Intel D945G", STAC_D945GTP3),
3664	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1117,
3665		      "Intel D945G", STAC_D945GTP3),
3666	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1118,
3667		      "Intel D945G", STAC_D945GTP3),
3668	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1119,
3669		      "Intel D945G", STAC_D945GTP3),
3670	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x8826,
3671		      "Intel D945G", STAC_D945GTP3),
3672	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5049,
3673		      "Intel D945G", STAC_D945GTP3),
3674	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5055,
3675		      "Intel D945G", STAC_D945GTP3),
3676	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5048,
3677		      "Intel D945G", STAC_D945GTP3),
3678	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0110,
3679		      "Intel D945G", STAC_D945GTP3),
3680	/* Intel D945G 5-stack systems */
3681	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0404,
3682		      "Intel D945G", STAC_D945GTP5),
3683	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0303,
3684		      "Intel D945G", STAC_D945GTP5),
3685	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0013,
3686		      "Intel D945G", STAC_D945GTP5),
3687	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0417,
3688		      "Intel D945G", STAC_D945GTP5),
3689	/* Intel 945P based systems */
3690	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0b0b,
3691		      "Intel D945P", STAC_D945GTP3),
3692	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0112,
3693		      "Intel D945P", STAC_D945GTP3),
3694	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0d0d,
3695		      "Intel D945P", STAC_D945GTP3),
3696	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0909,
3697		      "Intel D945P", STAC_D945GTP3),
3698	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0505,
3699		      "Intel D945P", STAC_D945GTP3),
3700	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0707,
3701		      "Intel D945P", STAC_D945GTP5),
3702	/* other intel */
3703	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0204,
3704		      "Intel D945", STAC_D945_REF),
3705	/* other systems  */
3706
3707	/* Apple Intel Mac (Mac Mini, MacBook, MacBook Pro...) */
3708	SND_PCI_QUIRK(0x8384, 0x7680, "Mac", STAC_INTEL_MAC_AUTO),
3709
3710	/* Dell systems  */
3711	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a7,
3712		      "unknown Dell", STAC_922X_DELL_D81),
3713	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a9,
3714		      "unknown Dell", STAC_922X_DELL_D81),
3715	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ab,
3716		      "unknown Dell", STAC_922X_DELL_D81),
3717	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ac,
3718		      "unknown Dell", STAC_922X_DELL_D82),
3719	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01bf,
3720		      "unknown Dell", STAC_922X_DELL_M81),
3721	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d0,
3722		      "unknown Dell", STAC_922X_DELL_D82),
3723	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d1,
3724		      "unknown Dell", STAC_922X_DELL_D81),
3725	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d2,
3726		      "unknown Dell", STAC_922X_DELL_D81),
3727	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d7,
3728		      "Dell XPS M1210", STAC_922X_DELL_M82),
3729	/* ECS/PC Chips boards */
3730	SND_PCI_QUIRK_MASK(0x1019, 0xf000, 0x2000,
3731		      "ECS/PC chips", STAC_ECS_202),
3732	{} /* terminator */
3733};
3734
3735static const struct hda_pintbl ref927x_pin_configs[] = {
3736	{ 0x0a, 0x02214020 },
3737	{ 0x0b, 0x02a19080 },
3738	{ 0x0c, 0x0181304e },
3739	{ 0x0d, 0x01014010 },
3740	{ 0x0e, 0x01a19040 },
3741	{ 0x0f, 0x01011012 },
3742	{ 0x10, 0x01016011 },
3743	{ 0x11, 0x0101201f },
3744	{ 0x12, 0x183301f0 },
3745	{ 0x13, 0x18a001f0 },
3746	{ 0x14, 0x18a001f0 },
3747	{ 0x21, 0x01442070 },
3748	{ 0x22, 0x01c42190 },
3749	{ 0x23, 0x40000100 },
3750	{}
3751};
3752
3753static const struct hda_pintbl d965_3st_pin_configs[] = {
3754	{ 0x0a, 0x0221401f },
3755	{ 0x0b, 0x02a19120 },
3756	{ 0x0c, 0x40000100 },
3757	{ 0x0d, 0x01014011 },
3758	{ 0x0e, 0x01a19021 },
3759	{ 0x0f, 0x01813024 },
3760	{ 0x10, 0x40000100 },
3761	{ 0x11, 0x40000100 },
3762	{ 0x12, 0x40000100 },
3763	{ 0x13, 0x40000100 },
3764	{ 0x14, 0x40000100 },
3765	{ 0x21, 0x40000100 },
3766	{ 0x22, 0x40000100 },
3767	{ 0x23, 0x40000100 },
3768	{}
3769};
3770
3771static const struct hda_pintbl d965_5st_pin_configs[] = {
3772	{ 0x0a, 0x02214020 },
3773	{ 0x0b, 0x02a19080 },
3774	{ 0x0c, 0x0181304e },
3775	{ 0x0d, 0x01014010 },
3776	{ 0x0e, 0x01a19040 },
3777	{ 0x0f, 0x01011012 },
3778	{ 0x10, 0x01016011 },
3779	{ 0x11, 0x40000100 },
3780	{ 0x12, 0x40000100 },
3781	{ 0x13, 0x40000100 },
3782	{ 0x14, 0x40000100 },
3783	{ 0x21, 0x01442070 },
3784	{ 0x22, 0x40000100 },
3785	{ 0x23, 0x40000100 },
3786	{}
 
 
 
 
3787};
3788
3789static const struct hda_pintbl d965_5st_no_fp_pin_configs[] = {
3790	{ 0x0a, 0x40000100 },
3791	{ 0x0b, 0x40000100 },
3792	{ 0x0c, 0x0181304e },
3793	{ 0x0d, 0x01014010 },
3794	{ 0x0e, 0x01a19040 },
3795	{ 0x0f, 0x01011012 },
3796	{ 0x10, 0x01016011 },
3797	{ 0x11, 0x40000100 },
3798	{ 0x12, 0x40000100 },
3799	{ 0x13, 0x40000100 },
3800	{ 0x14, 0x40000100 },
3801	{ 0x21, 0x01442070 },
3802	{ 0x22, 0x40000100 },
3803	{ 0x23, 0x40000100 },
3804	{}
3805};
3806
3807static const struct hda_pintbl dell_3st_pin_configs[] = {
3808	{ 0x0a, 0x02211230 },
3809	{ 0x0b, 0x02a11220 },
3810	{ 0x0c, 0x01a19040 },
3811	{ 0x0d, 0x01114210 },
3812	{ 0x0e, 0x01111212 },
3813	{ 0x0f, 0x01116211 },
3814	{ 0x10, 0x01813050 },
3815	{ 0x11, 0x01112214 },
3816	{ 0x12, 0x403003fa },
3817	{ 0x13, 0x90a60040 },
3818	{ 0x14, 0x90a60040 },
3819	{ 0x21, 0x404003fb },
3820	{ 0x22, 0x40c003fc },
3821	{ 0x23, 0x40000100 },
3822	{}
3823};
3824
3825static void stac927x_fixup_ref_no_jd(struct hda_codec *codec,
3826				     const struct hda_fixup *fix, int action)
3827{
3828	/* no jack detecion for ref-no-jd model */
3829	if (action == HDA_FIXUP_ACT_PRE_PROBE)
3830		codec->no_jack_detect = 1;
3831}
3832
3833static void stac927x_fixup_ref(struct hda_codec *codec,
3834			       const struct hda_fixup *fix, int action)
3835{
3836	struct sigmatel_spec *spec = codec->spec;
3837
3838	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3839		snd_hda_apply_pincfgs(codec, ref927x_pin_configs);
3840		spec->eapd_mask = spec->gpio_mask = 0;
3841		spec->gpio_dir = spec->gpio_data = 0;
3842	}
3843}
3844
3845static void stac927x_fixup_dell_dmic(struct hda_codec *codec,
3846				     const struct hda_fixup *fix, int action)
3847{
3848	struct sigmatel_spec *spec = codec->spec;
3849
3850	if (action != HDA_FIXUP_ACT_PRE_PROBE)
3851		return;
3852
3853	if (codec->core.subsystem_id != 0x1028022f) {
3854		/* GPIO2 High = Enable EAPD */
3855		spec->eapd_mask = spec->gpio_mask = 0x04;
3856		spec->gpio_dir = spec->gpio_data = 0x04;
3857	}
3858
3859	snd_hda_add_verbs(codec, dell_3st_core_init);
3860	spec->volknob_init = 1;
3861}
3862
3863static void stac927x_fixup_volknob(struct hda_codec *codec,
3864				   const struct hda_fixup *fix, int action)
3865{
3866	struct sigmatel_spec *spec = codec->spec;
3867
3868	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3869		snd_hda_add_verbs(codec, stac927x_volknob_core_init);
3870		spec->volknob_init = 1;
3871	}
3872}
3873
3874static const struct hda_fixup stac927x_fixups[] = {
3875	[STAC_D965_REF_NO_JD] = {
3876		.type = HDA_FIXUP_FUNC,
3877		.v.func = stac927x_fixup_ref_no_jd,
3878		.chained = true,
3879		.chain_id = STAC_D965_REF,
3880	},
3881	[STAC_D965_REF] = {
3882		.type = HDA_FIXUP_FUNC,
3883		.v.func = stac927x_fixup_ref,
3884	},
3885	[STAC_D965_3ST] = {
3886		.type = HDA_FIXUP_PINS,
3887		.v.pins = d965_3st_pin_configs,
3888		.chained = true,
3889		.chain_id = STAC_D965_VERBS,
3890	},
3891	[STAC_D965_5ST] = {
3892		.type = HDA_FIXUP_PINS,
3893		.v.pins = d965_5st_pin_configs,
3894		.chained = true,
3895		.chain_id = STAC_D965_VERBS,
3896	},
3897	[STAC_D965_VERBS] = {
3898		.type = HDA_FIXUP_VERBS,
3899		.v.verbs = d965_core_init,
3900	},
3901	[STAC_D965_5ST_NO_FP] = {
3902		.type = HDA_FIXUP_PINS,
3903		.v.pins = d965_5st_no_fp_pin_configs,
3904	},
3905	[STAC_NEMO_DEFAULT] = {
3906		.type = HDA_FIXUP_PINS,
3907		.v.pins = nemo_pin_configs,
3908	},
3909	[STAC_DELL_3ST] = {
3910		.type = HDA_FIXUP_PINS,
3911		.v.pins = dell_3st_pin_configs,
3912		.chained = true,
3913		.chain_id = STAC_927X_DELL_DMIC,
3914	},
3915	[STAC_DELL_BIOS] = {
3916		.type = HDA_FIXUP_PINS,
3917		.v.pins = (const struct hda_pintbl[]) {
3918			/* correct the front output jack as a hp out */
3919			{ 0x0f, 0x0221101f },
3920			/* correct the front input jack as a mic */
3921			{ 0x0e, 0x02a79130 },
3922			{}
3923		},
3924		.chained = true,
3925		.chain_id = STAC_927X_DELL_DMIC,
3926	},
3927	[STAC_DELL_BIOS_AMIC] = {
3928		.type = HDA_FIXUP_PINS,
3929		.v.pins = (const struct hda_pintbl[]) {
3930			/* configure the analog microphone on some laptops */
3931			{ 0x0c, 0x90a79130 },
3932			{}
3933		},
3934		.chained = true,
3935		.chain_id = STAC_DELL_BIOS,
3936	},
3937	[STAC_DELL_BIOS_SPDIF] = {
3938		.type = HDA_FIXUP_PINS,
3939		.v.pins = (const struct hda_pintbl[]) {
3940			/* correct the device field to SPDIF out */
3941			{ 0x21, 0x01442070 },
3942			{}
3943		},
3944		.chained = true,
3945		.chain_id = STAC_DELL_BIOS,
3946	},
3947	[STAC_927X_DELL_DMIC] = {
3948		.type = HDA_FIXUP_FUNC,
3949		.v.func = stac927x_fixup_dell_dmic,
3950	},
3951	[STAC_927X_VOLKNOB] = {
3952		.type = HDA_FIXUP_FUNC,
3953		.v.func = stac927x_fixup_volknob,
3954	},
3955};
3956
3957static const struct hda_model_fixup stac927x_models[] = {
3958	{ .id = STAC_D965_REF_NO_JD, .name = "ref-no-jd" },
3959	{ .id = STAC_D965_REF, .name = "ref" },
3960	{ .id = STAC_D965_3ST, .name = "3stack" },
3961	{ .id = STAC_D965_5ST, .name = "5stack" },
3962	{ .id = STAC_D965_5ST_NO_FP, .name = "5stack-no-fp" },
3963	{ .id = STAC_DELL_3ST, .name = "dell-3stack" },
3964	{ .id = STAC_DELL_BIOS, .name = "dell-bios" },
3965	{ .id = STAC_NEMO_DEFAULT, .name = "nemo-default" },
3966	{ .id = STAC_DELL_BIOS_AMIC, .name = "dell-bios-amic" },
3967	{ .id = STAC_927X_VOLKNOB, .name = "volknob" },
3968	{}
3969};
3970
3971static const struct hda_quirk stac927x_fixup_tbl[] = {
3972	/* SigmaTel reference board */
3973	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
3974		      "DFI LanParty", STAC_D965_REF),
3975	SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
3976		      "DFI LanParty", STAC_D965_REF),
3977	 /* Intel 946 based systems */
3978	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x3d01, "Intel D946", STAC_D965_3ST),
3979	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0xa301, "Intel D946", STAC_D965_3ST),
3980	/* 965 based 3 stack systems */
3981	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2100,
3982			   "Intel D965", STAC_D965_3ST),
3983	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2000,
3984			   "Intel D965", STAC_D965_3ST),
3985	/* Dell 3 stack systems */
3986	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x01dd, "Dell Dimension E520", STAC_DELL_3ST),
3987	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x01ed, "Dell     ", STAC_DELL_3ST),
3988	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x01f4, "Dell     ", STAC_DELL_3ST),
3989	/* Dell 3 stack systems with verb table in BIOS */
3990	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x01f3, "Dell Inspiron 1420", STAC_DELL_BIOS),
3991	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x01f7, "Dell XPS M1730", STAC_DELL_BIOS),
3992	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x0227, "Dell Vostro 1400  ", STAC_DELL_BIOS),
3993	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x022e, "Dell     ", STAC_DELL_BIOS_SPDIF),
3994	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x022f, "Dell Inspiron 1525", STAC_DELL_BIOS),
3995	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x0242, "Dell     ", STAC_DELL_BIOS),
3996	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x0243, "Dell     ", STAC_DELL_BIOS),
3997	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x02ff, "Dell     ", STAC_DELL_BIOS),
3998	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x0209, "Dell XPS 1330", STAC_DELL_BIOS_SPDIF),
3999	/* 965 based 5 stack systems */
4000	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2300,
4001			   "Intel D965", STAC_D965_5ST),
4002	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2500,
4003			   "Intel D965", STAC_D965_5ST),
4004	/* Nemo */
4005	SND_PCI_QUIRK(0x1888, 0x1000, "AmigaOne X1000", STAC_NEMO_DEFAULT),
4006	/* volume-knob fixes */
4007	SND_PCI_QUIRK_VENDOR(0x10cf, "FSC", STAC_927X_VOLKNOB),
4008	{} /* terminator */
4009};
4010
4011static const struct hda_pintbl ref9205_pin_configs[] = {
4012	{ 0x0a, 0x40000100 },
4013	{ 0x0b, 0x40000100 },
4014	{ 0x0c, 0x01016011 },
4015	{ 0x0d, 0x01014010 },
4016	{ 0x0e, 0x01813122 },
4017	{ 0x0f, 0x01a19021 },
4018	{ 0x14, 0x01019020 },
4019	{ 0x16, 0x40000100 },
4020	{ 0x17, 0x90a000f0 },
4021	{ 0x18, 0x90a000f0 },
4022	{ 0x21, 0x01441030 },
4023	{ 0x22, 0x01c41030 },
4024	{}
4025};
4026
4027/*
4028    STAC 9205 pin configs for
4029    102801F1
4030    102801F2
4031    102801FC
4032    102801FD
4033    10280204
4034    1028021F
4035    10280228 (Dell Vostro 1500)
4036    10280229 (Dell Vostro 1700)
4037*/
4038static const struct hda_pintbl dell_9205_m42_pin_configs[] = {
4039	{ 0x0a, 0x0321101F },
4040	{ 0x0b, 0x03A11020 },
4041	{ 0x0c, 0x400003FA },
4042	{ 0x0d, 0x90170310 },
4043	{ 0x0e, 0x400003FB },
4044	{ 0x0f, 0x400003FC },
4045	{ 0x14, 0x400003FD },
4046	{ 0x16, 0x40F000F9 },
4047	{ 0x17, 0x90A60330 },
4048	{ 0x18, 0x400003FF },
4049	{ 0x21, 0x0144131F },
4050	{ 0x22, 0x40C003FE },
4051	{}
4052};
4053
4054/*
4055    STAC 9205 pin configs for
4056    102801F9
4057    102801FA
4058    102801FE
4059    102801FF (Dell Precision M4300)
4060    10280206
4061    10280200
4062    10280201
4063*/
4064static const struct hda_pintbl dell_9205_m43_pin_configs[] = {
4065	{ 0x0a, 0x0321101f },
4066	{ 0x0b, 0x03a11020 },
4067	{ 0x0c, 0x90a70330 },
4068	{ 0x0d, 0x90170310 },
4069	{ 0x0e, 0x400000fe },
4070	{ 0x0f, 0x400000ff },
4071	{ 0x14, 0x400000fd },
4072	{ 0x16, 0x40f000f9 },
4073	{ 0x17, 0x400000fa },
4074	{ 0x18, 0x400000fc },
4075	{ 0x21, 0x0144131f },
4076	{ 0x22, 0x40c003f8 },
4077	/* Enable SPDIF in/out */
4078	{ 0x1f, 0x01441030 },
4079	{ 0x20, 0x1c410030 },
4080	{}
4081};
4082
4083static const struct hda_pintbl dell_9205_m44_pin_configs[] = {
4084	{ 0x0a, 0x0421101f },
4085	{ 0x0b, 0x04a11020 },
4086	{ 0x0c, 0x400003fa },
4087	{ 0x0d, 0x90170310 },
4088	{ 0x0e, 0x400003fb },
4089	{ 0x0f, 0x400003fc },
4090	{ 0x14, 0x400003fd },
4091	{ 0x16, 0x400003f9 },
4092	{ 0x17, 0x90a60330 },
4093	{ 0x18, 0x400003ff },
4094	{ 0x21, 0x01441340 },
4095	{ 0x22, 0x40c003fe },
4096	{}
4097};
4098
4099static void stac9205_fixup_ref(struct hda_codec *codec,
4100			       const struct hda_fixup *fix, int action)
4101{
4102	struct sigmatel_spec *spec = codec->spec;
4103
4104	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4105		snd_hda_apply_pincfgs(codec, ref9205_pin_configs);
4106		/* SPDIF-In enabled */
4107		spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0;
4108	}
4109}
4110
4111static void stac9205_fixup_dell_m43(struct hda_codec *codec,
4112				    const struct hda_fixup *fix, int action)
4113{
4114	struct sigmatel_spec *spec = codec->spec;
4115	struct hda_jack_callback *jack;
4116
4117	if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4118		snd_hda_apply_pincfgs(codec, dell_9205_m43_pin_configs);
4119
4120		/* Enable unsol response for GPIO4/Dock HP connection */
4121		snd_hda_codec_write_cache(codec, codec->core.afg, 0,
4122			AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x10);
4123		jack = snd_hda_jack_detect_enable_callback(codec, codec->core.afg,
4124							   stac_vref_event);
4125		if (!IS_ERR(jack))
4126			jack->private_data = 0x01;
4127
4128		spec->gpio_dir = 0x0b;
4129		spec->eapd_mask = 0x01;
4130		spec->gpio_mask = 0x1b;
4131		spec->gpio_mute = 0x10;
4132		/* GPIO0 High = EAPD, GPIO1 Low = Headphone Mute,
4133		 * GPIO3 Low = DRM
4134		 */
4135		spec->gpio_data = 0x01;
4136	}
4137}
4138
4139static void stac9205_fixup_eapd(struct hda_codec *codec,
4140				const struct hda_fixup *fix, int action)
4141{
4142	struct sigmatel_spec *spec = codec->spec;
4143
4144	if (action == HDA_FIXUP_ACT_PRE_PROBE)
4145		spec->eapd_switch = 0;
4146}
4147
4148static const struct hda_fixup stac9205_fixups[] = {
4149	[STAC_9205_REF] = {
4150		.type = HDA_FIXUP_FUNC,
4151		.v.func = stac9205_fixup_ref,
4152	},
4153	[STAC_9205_DELL_M42] = {
4154		.type = HDA_FIXUP_PINS,
4155		.v.pins = dell_9205_m42_pin_configs,
4156	},
4157	[STAC_9205_DELL_M43] = {
4158		.type = HDA_FIXUP_FUNC,
4159		.v.func = stac9205_fixup_dell_m43,
4160	},
4161	[STAC_9205_DELL_M44] = {
4162		.type = HDA_FIXUP_PINS,
4163		.v.pins = dell_9205_m44_pin_configs,
4164	},
4165	[STAC_9205_EAPD] = {
4166		.type = HDA_FIXUP_FUNC,
4167		.v.func = stac9205_fixup_eapd,
4168	},
4169	{}
4170};
4171
4172static const struct hda_model_fixup stac9205_models[] = {
4173	{ .id = STAC_9205_REF, .name = "ref" },
4174	{ .id = STAC_9205_DELL_M42, .name = "dell-m42" },
4175	{ .id = STAC_9205_DELL_M43, .name = "dell-m43" },
4176	{ .id = STAC_9205_DELL_M44, .name = "dell-m44" },
4177	{ .id = STAC_9205_EAPD, .name = "eapd" },
4178	{}
4179};
4180
4181static const struct hda_quirk stac9205_fixup_tbl[] = {
4182	/* SigmaTel reference board */
4183	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
4184		      "DFI LanParty", STAC_9205_REF),
4185	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0xfb30,
4186		      "SigmaTel", STAC_9205_REF),
4187	SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
4188		      "DFI LanParty", STAC_9205_REF),
4189	/* Dell */
4190	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f1,
4191		      "unknown Dell", STAC_9205_DELL_M42),
4192	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f2,
4193		      "unknown Dell", STAC_9205_DELL_M42),
4194	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f8,
4195		      "Dell Precision", STAC_9205_DELL_M43),
4196	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f9,
4197		      "Dell Precision", STAC_9205_DELL_M43),
4198	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fa,
4199		      "Dell Precision", STAC_9205_DELL_M43),
4200	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fc,
4201		      "unknown Dell", STAC_9205_DELL_M42),
4202	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fd,
4203		      "unknown Dell", STAC_9205_DELL_M42),
4204	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fe,
4205		      "Dell Precision", STAC_9205_DELL_M43),
4206	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ff,
4207		      "Dell Precision M4300", STAC_9205_DELL_M43),
4208	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0204,
4209		      "unknown Dell", STAC_9205_DELL_M42),
4210	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0206,
4211		      "Dell Precision", STAC_9205_DELL_M43),
4212	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021b,
4213		      "Dell Precision", STAC_9205_DELL_M43),
4214	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021c,
4215		      "Dell Precision", STAC_9205_DELL_M43),
4216	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021f,
4217		      "Dell Inspiron", STAC_9205_DELL_M44),
4218	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0228,
4219		      "Dell Vostro 1500", STAC_9205_DELL_M42),
4220	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0229,
4221		      "Dell Vostro 1700", STAC_9205_DELL_M42),
4222	/* Gateway */
4223	SND_PCI_QUIRK(0x107b, 0x0560, "Gateway T6834c", STAC_9205_EAPD),
4224	SND_PCI_QUIRK(0x107b, 0x0565, "Gateway T1616", STAC_9205_EAPD),
4225	{} /* terminator */
4226};
4227
4228static void stac92hd95_fixup_hp_led(struct hda_codec *codec,
4229				    const struct hda_fixup *fix, int action)
4230{
 
4231	struct sigmatel_spec *spec = codec->spec;
4232
4233	if (action != HDA_FIXUP_ACT_PRE_PROBE)
4234		return;
4235
4236	if (find_mute_led_cfg(codec, spec->default_polarity))
4237		codec_dbg(codec, "mute LED gpio %d polarity %d\n",
4238				spec->gpio_led,
4239				spec->gpio_led_polarity);
4240}
4241
4242static const struct hda_fixup stac92hd95_fixups[] = {
4243	[STAC_92HD95_HP_LED] = {
4244		.type = HDA_FIXUP_FUNC,
4245		.v.func = stac92hd95_fixup_hp_led,
4246	},
4247	[STAC_92HD95_HP_BASS] = {
4248		.type = HDA_FIXUP_VERBS,
4249		.v.verbs = (const struct hda_verb[]) {
4250			{0x1a, 0x795, 0x00}, /* HPF to 100Hz */
4251			{}
4252		},
4253		.chained = true,
4254		.chain_id = STAC_92HD95_HP_LED,
4255	},
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4256};
4257
4258static const struct hda_quirk stac92hd95_fixup_tbl[] = {
4259	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1911, "HP Spectre 13", STAC_92HD95_HP_BASS),
4260	{} /* terminator */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4261};
4262
4263static const struct hda_model_fixup stac92hd95_models[] = {
4264	{ .id = STAC_92HD95_HP_LED, .name = "hp-led" },
4265	{ .id = STAC_92HD95_HP_BASS, .name = "hp-bass" },
4266	{}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4267};
4268
 
 
 
4269
4270static int stac_parse_auto_config(struct hda_codec *codec)
4271{
4272	struct sigmatel_spec *spec = codec->spec;
4273	int err;
4274	int flags = 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4275
4276	if (spec->headset_jack)
4277		flags |= HDA_PINCFG_HEADSET_MIC;
 
 
 
 
 
 
 
 
 
 
4278
4279	err = snd_hda_parse_pin_defcfg(codec, &spec->gen.autocfg, NULL, flags);
 
 
 
 
 
 
 
 
 
 
 
 
4280	if (err < 0)
4281		return err;
 
 
 
 
 
 
 
 
 
 
 
 
4282
4283	/* add hooks */
4284	spec->gen.pcm_playback_hook = stac_playback_pcm_hook;
4285	spec->gen.pcm_capture_hook = stac_capture_pcm_hook;
4286
4287	spec->gen.automute_hook = stac_update_outputs;
 
 
 
4288
4289	if (spec->gpio_led)
4290		snd_hda_gen_add_mute_led_cdev(codec, stac_vmaster_hook);
 
 
 
 
4291
4292	err = snd_hda_gen_parse_auto_config(codec, &spec->gen.autocfg);
4293	if (err < 0)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4294		return err;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4295
4296	if (spec->vref_mute_led_nid) {
4297		err = snd_hda_gen_fix_pin_power(codec, spec->vref_mute_led_nid);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4298		if (err < 0)
4299			return err;
4300	}
4301
4302	/* setup analog beep controls */
4303	if (spec->anabeep_nid > 0) {
4304		err = stac_auto_create_beep_ctls(codec,
4305						 spec->anabeep_nid);
4306		if (err < 0)
4307			return err;
4308	}
4309
4310	/* setup digital beep controls and input device */
4311#ifdef CONFIG_SND_HDA_INPUT_BEEP
4312	if (spec->gen.beep_nid) {
4313		hda_nid_t nid = spec->gen.beep_nid;
4314		unsigned int caps;
4315
4316		err = stac_auto_create_beep_ctls(codec, nid);
 
 
 
4317		if (err < 0)
4318			return err;
4319		if (codec->beep) {
4320			/* IDT/STAC codecs have linear beep tone parameter */
4321			codec->beep->linear_tone = spec->linear_tone_beep;
4322			/* keep power up while beep is enabled */
4323			codec->beep->keep_power_at_enable = 1;
4324			/* if no beep switch is available, make its own one */
4325			caps = query_amp_caps(codec, nid, HDA_OUTPUT);
4326			if (!(caps & AC_AMPCAP_MUTE)) {
4327				err = stac_beep_switch_ctl(codec);
4328				if (err < 0)
4329					return err;
4330			}
4331		}
4332	}
4333#endif
4334
4335	if (spec->aloopback_ctl &&
4336	    snd_hda_get_bool_hint(codec, "loopback") == 1) {
4337		unsigned int wr_verb =
4338			spec->aloopback_ctl->private_value >> 16;
4339		if (snd_hdac_regmap_add_vendor_verb(&codec->core, wr_verb))
4340			return -ENOMEM;
4341		if (!snd_hda_gen_add_kctl(&spec->gen, NULL, spec->aloopback_ctl))
4342			return -ENOMEM;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4343	}
4344
4345	if (spec->have_spdif_mux) {
4346		err = stac_create_spdif_mux_ctls(codec);
 
 
 
 
4347		if (err < 0)
4348			return err;
4349	}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4350
4351	stac_init_power_map(codec);
 
4352
 
 
 
 
 
 
 
 
 
 
 
 
4353	return 0;
4354}
4355
4356static int stac_init(struct hda_codec *codec)
 
4357{
4358	struct sigmatel_spec *spec = codec->spec;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4359	int i;
4360
 
 
 
 
 
 
 
 
 
4361	/* override some hints */
4362	stac_store_hints(codec);
4363
4364	/* set up GPIO */
 
4365	/* turn on EAPD statically when spec->eapd_switch isn't set.
4366	 * otherwise, unsol event will turn it on/off dynamically
4367	 */
4368	if (!spec->eapd_switch)
4369		spec->gpio_data |= spec->eapd_mask;
4370	stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, spec->gpio_data);
4371
4372	snd_hda_gen_init(codec);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4373
4374	/* sync the power-map */
4375	if (spec->num_pwrs)
4376		snd_hda_codec_write(codec, codec->core.afg, 0,
4377				    AC_VERB_IDT_SET_POWER_MAP,
4378				    spec->power_map_bits);
4379
4380	/* power down inactive ADCs */
4381	if (spec->powerdown_adcs) {
4382		for (i = 0; i < spec->gen.num_all_adcs; i++) {
4383			if (spec->active_adcs & (1 << i))
4384				continue;
4385			snd_hda_codec_write(codec, spec->gen.all_adcs[i], 0,
4386					    AC_VERB_SET_POWER_STATE,
4387					    AC_PWRST_D3);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4388		}
 
 
 
 
 
 
 
 
4389	}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4390
 
 
 
 
 
 
 
 
 
 
4391	return 0;
4392}
4393
4394#define stac_free	snd_hda_gen_free
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4395
4396#ifdef CONFIG_SND_PROC_FS
4397static void stac92hd_proc_hook(struct snd_info_buffer *buffer,
4398			       struct hda_codec *codec, hda_nid_t nid)
4399{
4400	if (nid == codec->core.afg)
4401		snd_iprintf(buffer, "Power-Map: 0x%02x\n", 
4402			    snd_hda_codec_read(codec, nid, 0,
4403					       AC_VERB_IDT_GET_POWER_MAP, 0));
4404}
4405
4406static void analog_loop_proc_hook(struct snd_info_buffer *buffer,
4407				  struct hda_codec *codec,
4408				  unsigned int verb)
4409{
4410	snd_iprintf(buffer, "Analog Loopback: 0x%02x\n",
4411		    snd_hda_codec_read(codec, codec->core.afg, 0, verb, 0));
4412}
4413
4414/* stac92hd71bxx, stac92hd73xx */
4415static void stac92hd7x_proc_hook(struct snd_info_buffer *buffer,
4416				 struct hda_codec *codec, hda_nid_t nid)
4417{
4418	stac92hd_proc_hook(buffer, codec, nid);
4419	if (nid == codec->core.afg)
4420		analog_loop_proc_hook(buffer, codec, 0xfa0);
4421}
4422
4423static void stac9205_proc_hook(struct snd_info_buffer *buffer,
4424			       struct hda_codec *codec, hda_nid_t nid)
4425{
4426	if (nid == codec->core.afg)
4427		analog_loop_proc_hook(buffer, codec, 0xfe0);
4428}
4429
4430static void stac927x_proc_hook(struct snd_info_buffer *buffer,
4431			       struct hda_codec *codec, hda_nid_t nid)
4432{
4433	if (nid == codec->core.afg)
4434		analog_loop_proc_hook(buffer, codec, 0xfeb);
4435}
4436#else
4437#define stac92hd_proc_hook	NULL
4438#define stac92hd7x_proc_hook	NULL
4439#define stac9205_proc_hook	NULL
4440#define stac927x_proc_hook	NULL
4441#endif
4442
4443static int stac_suspend(struct hda_codec *codec)
 
4444{
4445	struct sigmatel_spec *spec = codec->spec;
4446
4447	snd_hda_shutup_pins(codec);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4448
4449	if (spec->eapd_mask)
4450		stac_gpio_set(codec, spec->gpio_mask,
4451				spec->gpio_dir, spec->gpio_data &
4452				~spec->eapd_mask);
4453
 
 
 
 
 
 
 
 
 
 
4454	return 0;
4455}
4456
4457static const struct hda_codec_ops stac_patch_ops = {
4458	.build_controls = snd_hda_gen_build_controls,
4459	.build_pcms = snd_hda_gen_build_pcms,
4460	.init = stac_init,
4461	.free = stac_free,
4462	.unsol_event = snd_hda_jack_unsol_event,
4463	.suspend = stac_suspend,
4464};
 
 
 
 
 
4465
4466static int alloc_stac_spec(struct hda_codec *codec)
 
4467{
4468	struct sigmatel_spec *spec;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4469
4470	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
4471	if (!spec)
4472		return -ENOMEM;
4473	snd_hda_gen_spec_init(&spec->gen);
4474	codec->spec = spec;
4475	codec->no_trigger_sense = 1; /* seems common with STAC/IDT codecs */
4476	spec->gen.dac_min_mute = true;
4477	codec->patch_ops = stac_patch_ops;
4478	return 0;
4479}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4480
4481static int patch_stac9200(struct hda_codec *codec)
4482{
4483	struct sigmatel_spec *spec;
4484	int err;
4485
4486	err = alloc_stac_spec(codec);
4487	if (err < 0)
4488		return err;
4489
4490	spec = codec->spec;
 
4491	spec->linear_tone_beep = 1;
4492	spec->gen.own_eapd_ctl = 1;
4493
4494	codec->power_filter = snd_hda_codec_eapd_power_filter;
 
 
 
 
 
 
 
 
4495
4496	snd_hda_add_verbs(codec, stac9200_eapd_init);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4497
4498	snd_hda_pick_fixup(codec, stac9200_models, stac9200_fixup_tbl,
4499			   stac9200_fixups);
4500	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
 
4501
4502	err = stac_parse_auto_config(codec);
4503	if (err < 0) {
4504		stac_free(codec);
4505		return err;
4506	}
4507
4508	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
 
 
 
 
 
 
4509
4510	return 0;
4511}
4512
4513static int patch_stac925x(struct hda_codec *codec)
4514{
4515	struct sigmatel_spec *spec;
4516	int err;
4517
4518	err = alloc_stac_spec(codec);
4519	if (err < 0)
4520		return err;
4521
4522	spec = codec->spec;
 
4523	spec->linear_tone_beep = 1;
4524	spec->gen.own_eapd_ctl = 1;
 
4525
4526	snd_hda_add_verbs(codec, stac925x_core_init);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4527
4528	snd_hda_pick_fixup(codec, stac925x_models, stac925x_fixup_tbl,
4529			   stac925x_fixups);
4530	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4531
4532	err = stac_parse_auto_config(codec);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4533	if (err < 0) {
4534		stac_free(codec);
4535		return err;
4536	}
4537
4538	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
4539
4540	return 0;
4541}
4542
4543static int patch_stac92hd73xx(struct hda_codec *codec)
4544{
4545	struct sigmatel_spec *spec;
4546	int err;
 
4547	int num_dacs;
4548
4549	err = alloc_stac_spec(codec);
4550	if (err < 0)
4551		return err;
4552
4553	spec = codec->spec;
4554	/* enable power_save_node only for new 92HD89xx chips, as it causes
4555	 * click noises on old 92HD73xx chips.
4556	 */
4557	if ((codec->core.vendor_id & 0xfffffff0) != 0x111d7670)
4558		codec->power_save_node = 1;
4559	spec->linear_tone_beep = 0;
4560	spec->gen.mixer_nid = 0x1d;
4561	spec->have_spdif_mux = 1;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4562
4563	num_dacs = snd_hda_get_num_conns(codec, 0x0a) - 1;
4564	if (num_dacs < 3 || num_dacs > 5) {
4565		codec_warn(codec,
4566			   "Could not determine number of channels defaulting to DAC count\n");
4567		num_dacs = 5;
4568	}
4569
4570	switch (num_dacs) {
4571	case 0x3: /* 6 Channel */
4572		spec->aloopback_ctl = &stac92hd73xx_6ch_loopback;
4573		break;
4574	case 0x4: /* 8 Channel */
4575		spec->aloopback_ctl = &stac92hd73xx_8ch_loopback;
4576		break;
4577	case 0x5: /* 10 Channel */
4578		spec->aloopback_ctl = &stac92hd73xx_10ch_loopback;
4579		break;
4580	}
 
4581
4582	spec->aloopback_mask = 0x01;
4583	spec->aloopback_shift = 8;
4584
4585	spec->gen.beep_nid = 0x1c; /* digital beep */
4586
4587	/* GPIO0 High = Enable EAPD */
4588	spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x1;
4589	spec->gpio_data = 0x01;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4590
4591	spec->eapd_switch = 1;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4592
4593	spec->num_pwrs = ARRAY_SIZE(stac92hd73xx_pwr_nids);
4594	spec->pwr_nids = stac92hd73xx_pwr_nids;
4595
4596	spec->gen.own_eapd_ctl = 1;
4597	spec->gen.power_down_unused = 1;
4598
4599	snd_hda_pick_fixup(codec, stac92hd73xx_models, stac92hd73xx_fixup_tbl,
4600			   stac92hd73xx_fixups);
4601	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
4602
4603	if (!spec->volknob_init)
4604		snd_hda_add_verbs(codec, stac92hd73xx_core_init);
 
 
 
 
 
 
 
4605
4606	err = stac_parse_auto_config(codec);
4607	if (err < 0) {
4608		stac_free(codec);
4609		return err;
4610	}
4611
4612	/* Don't GPIO-mute speakers if there are no internal speakers, because
4613	 * the GPIO might be necessary for Headphone
4614	 */
4615	if (spec->eapd_switch && !has_builtin_speaker(codec))
4616		spec->eapd_switch = 0;
4617
4618	codec->proc_widget_hook = stac92hd7x_proc_hook;
4619
4620	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
 
4621
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4622	return 0;
4623}
4624
4625static void stac_setup_gpio(struct hda_codec *codec)
4626{
4627	struct sigmatel_spec *spec = codec->spec;
 
 
4628
4629	spec->gpio_mask |= spec->eapd_mask;
4630	if (spec->gpio_led) {
4631		if (!spec->vref_mute_led_nid) {
4632			spec->gpio_mask |= spec->gpio_led;
4633			spec->gpio_dir |= spec->gpio_led;
4634			spec->gpio_data |= spec->gpio_led;
4635		} else {
4636			codec->power_filter = stac_vref_led_power_filter;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4637		}
4638	}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4639
4640	if (spec->mic_mute_led_gpio) {
4641		spec->gpio_mask |= spec->mic_mute_led_gpio;
4642		spec->gpio_dir |= spec->mic_mute_led_gpio;
4643		spec->mic_enabled = 0;
4644		spec->gpio_data |= spec->mic_mute_led_gpio;
4645		snd_hda_gen_add_micmute_led_cdev(codec, stac_capture_led_update);
4646	}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4647}
4648
4649static int patch_stac92hd83xxx(struct hda_codec *codec)
4650{
4651	struct sigmatel_spec *spec;
 
4652	int err;
 
4653
4654	err = alloc_stac_spec(codec);
4655	if (err < 0)
4656		return err;
4657
4658	/* longer delay needed for D3 */
4659	codec->core.power_caps &= ~AC_PWRST_EPSS;
 
 
4660
4661	spec = codec->spec;
4662	codec->power_save_node = 1;
4663	spec->linear_tone_beep = 0;
4664	spec->gen.own_eapd_ctl = 1;
4665	spec->gen.power_down_unused = 1;
4666	spec->gen.mixer_nid = 0x1b;
4667
4668	spec->gen.beep_nid = 0x21; /* digital beep */
 
 
 
 
4669	spec->pwr_nids = stac92hd83xxx_pwr_nids;
 
4670	spec->num_pwrs = ARRAY_SIZE(stac92hd83xxx_pwr_nids);
4671	spec->default_polarity = -1; /* no default cfg */
 
4672
4673	snd_hda_add_verbs(codec, stac92hd83xxx_core_init);
 
 
 
 
 
 
 
 
 
 
4674
4675	snd_hda_pick_fixup(codec, stac92hd83xxx_models, stac92hd83xxx_fixup_tbl,
4676			   stac92hd83xxx_fixups);
4677	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4678
4679	stac_setup_gpio(codec);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4680
4681	err = stac_parse_auto_config(codec);
4682	if (err < 0) {
4683		stac_free(codec);
4684		return err;
4685	}
4686
4687	codec->proc_widget_hook = stac92hd_proc_hook;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4688
4689	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
4690
4691	return 0;
4692}
4693
4694static const hda_nid_t stac92hd95_pwr_nids[] = {
4695	0x0a, 0x0b, 0x0c, 0x0d
4696};
4697
4698static int patch_stac92hd95(struct hda_codec *codec)
4699{
4700	struct sigmatel_spec *spec;
4701	int err;
4702
4703	err = alloc_stac_spec(codec);
4704	if (err < 0)
4705		return err;
4706
4707	/* longer delay needed for D3 */
4708	codec->core.power_caps &= ~AC_PWRST_EPSS;
 
 
 
4709
4710	spec = codec->spec;
4711	codec->power_save_node = 1;
4712	spec->linear_tone_beep = 0;
4713	spec->gen.own_eapd_ctl = 1;
4714	spec->gen.power_down_unused = 1;
 
 
 
 
 
 
 
4715
4716	spec->gen.beep_nid = 0x19; /* digital beep */
4717	spec->pwr_nids = stac92hd95_pwr_nids;
4718	spec->num_pwrs = ARRAY_SIZE(stac92hd95_pwr_nids);
4719	spec->default_polarity = 0;
 
 
 
 
 
 
4720
4721	snd_hda_pick_fixup(codec, stac92hd95_models, stac92hd95_fixup_tbl,
4722			   stac92hd95_fixups);
4723	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
 
 
 
4724
4725	stac_setup_gpio(codec);
 
 
 
 
 
 
 
4726
4727	err = stac_parse_auto_config(codec);
4728	if (err < 0) {
4729		stac_free(codec);
4730		return err;
4731	}
 
4732
4733	codec->proc_widget_hook = stac92hd_proc_hook;
 
 
4734
4735	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
 
 
4736
 
 
 
4737	return 0;
4738}
4739
4740static int patch_stac92hd71bxx(struct hda_codec *codec)
4741{
4742	struct sigmatel_spec *spec;
4743	const hda_nid_t *unmute_nids = stac92hd71bxx_unmute_nids;
4744	int err;
 
4745
4746	err = alloc_stac_spec(codec);
4747	if (err < 0)
4748		return err;
4749
4750	spec = codec->spec;
4751	/* disabled power_save_node since it causes noises on a Dell machine */
4752	/* codec->power_save_node = 1; */
4753	spec->linear_tone_beep = 0;
4754	spec->gen.own_eapd_ctl = 1;
4755	spec->gen.power_down_unused = 1;
4756	spec->gen.mixer_nid = 0x17;
4757	spec->have_spdif_mux = 1;
4758
4759	/* GPIO0 = EAPD */
4760	spec->gpio_mask = 0x01;
4761	spec->gpio_dir = 0x01;
4762	spec->gpio_data = 0x01;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4763
4764	switch (codec->core.vendor_id) {
4765	case 0x111d76b6: /* 4 Port without Analog Mixer */
4766	case 0x111d76b7:
4767		unmute_nids++;
 
 
 
 
 
 
 
 
4768		break;
4769	case 0x111d7608: /* 5 Port with Analog Mixer */
4770		if ((codec->core.revision_id & 0xf) == 0 ||
4771		    (codec->core.revision_id & 0xf) == 1)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4772			spec->stream_delay = 40; /* 40 milliseconds */
4773
 
 
4774		/* disable VSW */
4775		unmute_nids++;
 
4776		snd_hda_codec_set_pincfg(codec, 0x0f, 0x40f000f0);
4777		snd_hda_codec_set_pincfg(codec, 0x19, 0x40f000f3);
 
 
 
 
4778		break;
4779	case 0x111d7603: /* 6 Port with Analog Mixer */
4780		if ((codec->core.revision_id & 0xf) == 1)
4781			spec->stream_delay = 40; /* 40 milliseconds */
4782
 
 
 
 
 
 
 
 
 
4783		break;
4784	}
4785
4786	if (get_wcaps_type(get_wcaps(codec, 0x28)) == AC_WID_VOL_KNB)
4787		snd_hda_add_verbs(codec, stac92hd71bxx_core_init);
4788
4789	if (get_wcaps(codec, 0xa) & AC_WCAP_IN_AMP) {
4790		const hda_nid_t *p;
4791		for (p = unmute_nids; *p; p++)
4792			snd_hda_codec_amp_init_stereo(codec, *p, HDA_INPUT, 0,
4793						      0xff, 0x00);
4794	}
4795
4796	spec->aloopback_ctl = &stac92hd71bxx_loopback;
4797	spec->aloopback_mask = 0x50;
4798	spec->aloopback_shift = 0;
4799
4800	spec->powerdown_adcs = 1;
4801	spec->gen.beep_nid = 0x26; /* digital beep */
4802	spec->num_pwrs = ARRAY_SIZE(stac92hd71bxx_pwr_nids);
 
 
4803	spec->pwr_nids = stac92hd71bxx_pwr_nids;
4804
4805	snd_hda_pick_fixup(codec, stac92hd71bxx_models, stac92hd71bxx_fixup_tbl,
4806			   stac92hd71bxx_fixups);
4807	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4808
4809	stac_setup_gpio(codec);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4810
4811	err = stac_parse_auto_config(codec);
4812	if (err < 0) {
4813		stac_free(codec);
4814		return err;
4815	}
4816
4817	codec->proc_widget_hook = stac92hd7x_proc_hook;
 
 
 
 
 
 
 
 
4818
4819	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
4820
4821	return 0;
4822}
4823
4824static int patch_stac922x(struct hda_codec *codec)
4825{
4826	struct sigmatel_spec *spec;
4827	int err;
4828
4829	err = alloc_stac_spec(codec);
4830	if (err < 0)
4831		return err;
4832
4833	spec = codec->spec;
 
4834	spec->linear_tone_beep = 1;
4835	spec->gen.own_eapd_ctl = 1;
 
 
 
 
 
 
 
 
 
 
 
 
4836
4837	snd_hda_add_verbs(codec, stac922x_core_init);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4838
4839	/* Fix Mux capture level; max to 2 */
4840	snd_hda_override_amp_caps(codec, 0x12, HDA_OUTPUT,
4841				  (0 << AC_AMPCAP_OFFSET_SHIFT) |
4842				  (2 << AC_AMPCAP_NUM_STEPS_SHIFT) |
4843				  (0x27 << AC_AMPCAP_STEP_SIZE_SHIFT) |
4844				  (0 << AC_AMPCAP_MUTE_SHIFT));
 
4845
4846	snd_hda_pick_fixup(codec, stac922x_models, stac922x_fixup_tbl,
4847			   stac922x_fixups);
4848	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
 
 
 
 
 
 
 
 
 
4849
4850	err = stac_parse_auto_config(codec);
 
 
 
 
 
 
 
 
 
 
 
4851	if (err < 0) {
4852		stac_free(codec);
4853		return err;
4854	}
4855
4856	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
 
 
 
 
 
 
 
4857
4858	return 0;
4859}
4860
4861static const char * const stac927x_spdif_labels[] = {
4862	"Digital Playback", "ADAT", "Analog Mux 1",
4863	"Analog Mux 2", "Analog Mux 3", NULL
4864};
4865
4866static int patch_stac927x(struct hda_codec *codec)
4867{
4868	struct sigmatel_spec *spec;
4869	int err;
4870
4871	err = alloc_stac_spec(codec);
4872	if (err < 0)
4873		return err;
4874
4875	spec = codec->spec;
 
4876	spec->linear_tone_beep = 1;
4877	spec->gen.own_eapd_ctl = 1;
4878	spec->have_spdif_mux = 1;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4879	spec->spdif_labels = stac927x_spdif_labels;
 
 
4880
4881	spec->gen.beep_nid = 0x23; /* digital beep */
 
 
 
 
4882
4883	/* GPIO0 High = Enable EAPD */
4884	spec->eapd_mask = spec->gpio_mask = 0x01;
4885	spec->gpio_dir = spec->gpio_data = 0x01;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4886
4887	spec->aloopback_ctl = &stac927x_loopback;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4888	spec->aloopback_mask = 0x40;
4889	spec->aloopback_shift = 0;
4890	spec->eapd_switch = 1;
4891
4892	snd_hda_pick_fixup(codec, stac927x_models, stac927x_fixup_tbl,
4893			   stac927x_fixups);
4894	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
4895
4896	if (!spec->volknob_init)
4897		snd_hda_add_verbs(codec, stac927x_core_init);
4898
4899	err = stac_parse_auto_config(codec);
 
 
4900	if (err < 0) {
4901		stac_free(codec);
4902		return err;
4903	}
4904
 
 
4905	codec->proc_widget_hook = stac927x_proc_hook;
4906
4907	/*
4908	 * !!FIXME!!
4909	 * The STAC927x seem to require fairly long delays for certain
4910	 * command sequences.  With too short delays (even if the answer
4911	 * is set to RIRB properly), it results in the silence output
4912	 * on some hardwares like Dell.
4913	 *
4914	 * The below flag enables the longer delay (see get_response
4915	 * in hda_intel.c).
4916	 */
4917	codec->bus->core.needs_damn_long_delay = 1;
4918
4919	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
 
 
4920
4921	return 0;
4922}
4923
4924static int patch_stac9205(struct hda_codec *codec)
4925{
4926	struct sigmatel_spec *spec;
4927	int err;
4928
4929	err = alloc_stac_spec(codec);
4930	if (err < 0)
4931		return err;
4932
4933	spec = codec->spec;
 
4934	spec->linear_tone_beep = 1;
4935	spec->gen.own_eapd_ctl = 1;
4936	spec->have_spdif_mux = 1;
4937
4938	spec->gen.beep_nid = 0x23; /* digital beep */
 
 
 
 
 
 
 
 
4939
4940	snd_hda_add_verbs(codec, stac9205_core_init);
4941	spec->aloopback_ctl = &stac9205_loopback;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4942
4943	spec->aloopback_mask = 0x40;
4944	spec->aloopback_shift = 0;
 
 
 
 
4945	
4946	/* GPIO0 High = EAPD */
4947	spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x1;
4948	spec->gpio_data = 0x01;
 
 
4949
4950	/* Turn on/off EAPD per HP plugging */
4951	spec->eapd_switch = 1;
 
 
 
 
 
 
 
4952
4953	snd_hda_pick_fixup(codec, stac9205_models, stac9205_fixup_tbl,
4954			   stac9205_fixups);
4955	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4956
4957	err = stac_parse_auto_config(codec);
 
 
 
 
 
 
 
 
 
4958	if (err < 0) {
4959		stac_free(codec);
4960		return err;
4961	}
4962
4963	codec->proc_widget_hook = stac9205_proc_hook;
4964
4965	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
4966
4967	return 0;
4968}
4969
4970/*
4971 * STAC9872 hack
4972 */
4973
4974static const struct hda_verb stac9872_core_init[] = {
4975	{0x15, AC_VERB_SET_CONNECT_SEL, 0x1}, /* mic-sel: 0a,0d,14,02 */
4976	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Mic-in -> 0x9 */
4977	{}
4978};
4979
4980static const struct hda_pintbl stac9872_vaio_pin_configs[] = {
4981	{ 0x0a, 0x03211020 },
4982	{ 0x0b, 0x411111f0 },
4983	{ 0x0c, 0x411111f0 },
4984	{ 0x0d, 0x03a15030 },
4985	{ 0x0e, 0x411111f0 },
4986	{ 0x0f, 0x90170110 },
4987	{ 0x11, 0x411111f0 },
4988	{ 0x13, 0x411111f0 },
4989	{ 0x14, 0x90a7013e },
4990	{}
4991};
4992
4993static const struct hda_model_fixup stac9872_models[] = {
4994	{ .id = STAC_9872_VAIO, .name = "vaio" },
4995	{}
4996};
4997
4998static const struct hda_fixup stac9872_fixups[] = {
4999	[STAC_9872_VAIO] = {
5000		.type = HDA_FIXUP_PINS,
5001		.v.pins = stac9872_vaio_pin_configs,
5002	},
 
 
 
 
 
 
 
 
5003};
5004
5005static const struct hda_quirk stac9872_fixup_tbl[] = {
 
 
 
 
 
 
 
 
 
5006	SND_PCI_QUIRK_MASK(0x104d, 0xfff0, 0x81e0,
5007			   "Sony VAIO F/S", STAC_9872_VAIO),
5008	{} /* terminator */
5009};
5010
5011static int patch_stac9872(struct hda_codec *codec)
5012{
5013	struct sigmatel_spec *spec;
5014	int err;
5015
5016	err = alloc_stac_spec(codec);
5017	if (err < 0)
5018		return err;
5019
5020	spec = codec->spec;
5021	spec->linear_tone_beep = 1;
5022	spec->gen.own_eapd_ctl = 1;
 
5023
5024	snd_hda_add_verbs(codec, stac9872_core_init);
 
 
 
 
 
 
 
 
5025
5026	snd_hda_pick_fixup(codec, stac9872_models, stac9872_fixup_tbl,
5027			   stac9872_fixups);
5028	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
 
 
 
 
 
 
5029
5030	err = stac_parse_auto_config(codec);
5031	if (err < 0) {
5032		stac_free(codec);
5033		return -EINVAL;
5034	}
5035
5036	snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
5037
5038	return 0;
5039}
5040
5041
5042/*
5043 * patch entries
5044 */
5045static const struct hda_device_id snd_hda_id_sigmatel[] = {
5046	HDA_CODEC_ENTRY(0x83847690, "STAC9200", patch_stac9200),
5047	HDA_CODEC_ENTRY(0x83847882, "STAC9220 A1", patch_stac922x),
5048	HDA_CODEC_ENTRY(0x83847680, "STAC9221 A1", patch_stac922x),
5049	HDA_CODEC_ENTRY(0x83847880, "STAC9220 A2", patch_stac922x),
5050	HDA_CODEC_ENTRY(0x83847681, "STAC9220D/9223D A2", patch_stac922x),
5051	HDA_CODEC_ENTRY(0x83847682, "STAC9221 A2", patch_stac922x),
5052	HDA_CODEC_ENTRY(0x83847683, "STAC9221D A2", patch_stac922x),
5053	HDA_CODEC_ENTRY(0x83847618, "STAC9227", patch_stac927x),
5054	HDA_CODEC_ENTRY(0x83847619, "STAC9227", patch_stac927x),
5055	HDA_CODEC_ENTRY(0x83847638, "STAC92HD700", patch_stac927x),
5056	HDA_CODEC_ENTRY(0x83847616, "STAC9228", patch_stac927x),
5057	HDA_CODEC_ENTRY(0x83847617, "STAC9228", patch_stac927x),
5058	HDA_CODEC_ENTRY(0x83847614, "STAC9229", patch_stac927x),
5059	HDA_CODEC_ENTRY(0x83847615, "STAC9229", patch_stac927x),
5060	HDA_CODEC_ENTRY(0x83847620, "STAC9274", patch_stac927x),
5061	HDA_CODEC_ENTRY(0x83847621, "STAC9274D", patch_stac927x),
5062	HDA_CODEC_ENTRY(0x83847622, "STAC9273X", patch_stac927x),
5063	HDA_CODEC_ENTRY(0x83847623, "STAC9273D", patch_stac927x),
5064	HDA_CODEC_ENTRY(0x83847624, "STAC9272X", patch_stac927x),
5065	HDA_CODEC_ENTRY(0x83847625, "STAC9272D", patch_stac927x),
5066	HDA_CODEC_ENTRY(0x83847626, "STAC9271X", patch_stac927x),
5067	HDA_CODEC_ENTRY(0x83847627, "STAC9271D", patch_stac927x),
5068	HDA_CODEC_ENTRY(0x83847628, "STAC9274X5NH", patch_stac927x),
5069	HDA_CODEC_ENTRY(0x83847629, "STAC9274D5NH", patch_stac927x),
5070	HDA_CODEC_ENTRY(0x83847632, "STAC9202",  patch_stac925x),
5071	HDA_CODEC_ENTRY(0x83847633, "STAC9202D", patch_stac925x),
5072	HDA_CODEC_ENTRY(0x83847634, "STAC9250", patch_stac925x),
5073	HDA_CODEC_ENTRY(0x83847635, "STAC9250D", patch_stac925x),
5074	HDA_CODEC_ENTRY(0x83847636, "STAC9251", patch_stac925x),
5075	HDA_CODEC_ENTRY(0x83847637, "STAC9250D", patch_stac925x),
5076	HDA_CODEC_ENTRY(0x83847645, "92HD206X", patch_stac927x),
5077	HDA_CODEC_ENTRY(0x83847646, "92HD206D", patch_stac927x),
5078	/* The following does not take into account .id=0x83847661 when subsys =
5079	 * 104D0C00 which is STAC9225s. Because of this, some SZ Notebooks are
5080	 * currently not fully supported.
5081	 */
5082	HDA_CODEC_ENTRY(0x83847661, "CXD9872RD/K", patch_stac9872),
5083	HDA_CODEC_ENTRY(0x83847662, "STAC9872AK", patch_stac9872),
5084	HDA_CODEC_ENTRY(0x83847664, "CXD9872AKD", patch_stac9872),
5085	HDA_CODEC_ENTRY(0x83847698, "STAC9205", patch_stac9205),
5086	HDA_CODEC_ENTRY(0x838476a0, "STAC9205", patch_stac9205),
5087	HDA_CODEC_ENTRY(0x838476a1, "STAC9205D", patch_stac9205),
5088	HDA_CODEC_ENTRY(0x838476a2, "STAC9204", patch_stac9205),
5089	HDA_CODEC_ENTRY(0x838476a3, "STAC9204D", patch_stac9205),
5090	HDA_CODEC_ENTRY(0x838476a4, "STAC9255", patch_stac9205),
5091	HDA_CODEC_ENTRY(0x838476a5, "STAC9255D", patch_stac9205),
5092	HDA_CODEC_ENTRY(0x838476a6, "STAC9254", patch_stac9205),
5093	HDA_CODEC_ENTRY(0x838476a7, "STAC9254D", patch_stac9205),
5094	HDA_CODEC_ENTRY(0x111d7603, "92HD75B3X5", patch_stac92hd71bxx),
5095	HDA_CODEC_ENTRY(0x111d7604, "92HD83C1X5", patch_stac92hd83xxx),
5096	HDA_CODEC_ENTRY(0x111d76d4, "92HD83C1C5", patch_stac92hd83xxx),
5097	HDA_CODEC_ENTRY(0x111d7605, "92HD81B1X5", patch_stac92hd83xxx),
5098	HDA_CODEC_ENTRY(0x111d76d5, "92HD81B1C5", patch_stac92hd83xxx),
5099	HDA_CODEC_ENTRY(0x111d76d1, "92HD87B1/3", patch_stac92hd83xxx),
5100	HDA_CODEC_ENTRY(0x111d76d9, "92HD87B2/4", patch_stac92hd83xxx),
5101	HDA_CODEC_ENTRY(0x111d7666, "92HD88B3", patch_stac92hd83xxx),
5102	HDA_CODEC_ENTRY(0x111d7667, "92HD88B1", patch_stac92hd83xxx),
5103	HDA_CODEC_ENTRY(0x111d7668, "92HD88B2", patch_stac92hd83xxx),
5104	HDA_CODEC_ENTRY(0x111d7669, "92HD88B4", patch_stac92hd83xxx),
5105	HDA_CODEC_ENTRY(0x111d7608, "92HD75B2X5", patch_stac92hd71bxx),
5106	HDA_CODEC_ENTRY(0x111d7674, "92HD73D1X5", patch_stac92hd73xx),
5107	HDA_CODEC_ENTRY(0x111d7675, "92HD73C1X5", patch_stac92hd73xx),
5108	HDA_CODEC_ENTRY(0x111d7676, "92HD73E1X5", patch_stac92hd73xx),
5109	HDA_CODEC_ENTRY(0x111d7695, "92HD95", patch_stac92hd95),
5110	HDA_CODEC_ENTRY(0x111d76b0, "92HD71B8X", patch_stac92hd71bxx),
5111	HDA_CODEC_ENTRY(0x111d76b1, "92HD71B8X", patch_stac92hd71bxx),
5112	HDA_CODEC_ENTRY(0x111d76b2, "92HD71B7X", patch_stac92hd71bxx),
5113	HDA_CODEC_ENTRY(0x111d76b3, "92HD71B7X", patch_stac92hd71bxx),
5114	HDA_CODEC_ENTRY(0x111d76b4, "92HD71B6X", patch_stac92hd71bxx),
5115	HDA_CODEC_ENTRY(0x111d76b5, "92HD71B6X", patch_stac92hd71bxx),
5116	HDA_CODEC_ENTRY(0x111d76b6, "92HD71B5X", patch_stac92hd71bxx),
5117	HDA_CODEC_ENTRY(0x111d76b7, "92HD71B5X", patch_stac92hd71bxx),
5118	HDA_CODEC_ENTRY(0x111d76c0, "92HD89C3", patch_stac92hd73xx),
5119	HDA_CODEC_ENTRY(0x111d76c1, "92HD89C2", patch_stac92hd73xx),
5120	HDA_CODEC_ENTRY(0x111d76c2, "92HD89C1", patch_stac92hd73xx),
5121	HDA_CODEC_ENTRY(0x111d76c3, "92HD89B3", patch_stac92hd73xx),
5122	HDA_CODEC_ENTRY(0x111d76c4, "92HD89B2", patch_stac92hd73xx),
5123	HDA_CODEC_ENTRY(0x111d76c5, "92HD89B1", patch_stac92hd73xx),
5124	HDA_CODEC_ENTRY(0x111d76c6, "92HD89E3", patch_stac92hd73xx),
5125	HDA_CODEC_ENTRY(0x111d76c7, "92HD89E2", patch_stac92hd73xx),
5126	HDA_CODEC_ENTRY(0x111d76c8, "92HD89E1", patch_stac92hd73xx),
5127	HDA_CODEC_ENTRY(0x111d76c9, "92HD89D3", patch_stac92hd73xx),
5128	HDA_CODEC_ENTRY(0x111d76ca, "92HD89D2", patch_stac92hd73xx),
5129	HDA_CODEC_ENTRY(0x111d76cb, "92HD89D1", patch_stac92hd73xx),
5130	HDA_CODEC_ENTRY(0x111d76cc, "92HD89F3", patch_stac92hd73xx),
5131	HDA_CODEC_ENTRY(0x111d76cd, "92HD89F2", patch_stac92hd73xx),
5132	HDA_CODEC_ENTRY(0x111d76ce, "92HD89F1", patch_stac92hd73xx),
5133	HDA_CODEC_ENTRY(0x111d76df, "92HD93BXX", patch_stac92hd83xxx),
5134	HDA_CODEC_ENTRY(0x111d76e0, "92HD91BXX", patch_stac92hd83xxx),
5135	HDA_CODEC_ENTRY(0x111d76e3, "92HD98BXX", patch_stac92hd83xxx),
5136	HDA_CODEC_ENTRY(0x111d76e5, "92HD99BXX", patch_stac92hd83xxx),
5137	HDA_CODEC_ENTRY(0x111d76e7, "92HD90BXX", patch_stac92hd83xxx),
5138	HDA_CODEC_ENTRY(0x111d76e8, "92HD66B1X5", patch_stac92hd83xxx),
5139	HDA_CODEC_ENTRY(0x111d76e9, "92HD66B2X5", patch_stac92hd83xxx),
5140	HDA_CODEC_ENTRY(0x111d76ea, "92HD66B3X5", patch_stac92hd83xxx),
5141	HDA_CODEC_ENTRY(0x111d76eb, "92HD66C1X5", patch_stac92hd83xxx),
5142	HDA_CODEC_ENTRY(0x111d76ec, "92HD66C2X5", patch_stac92hd83xxx),
5143	HDA_CODEC_ENTRY(0x111d76ed, "92HD66C3X5", patch_stac92hd83xxx),
5144	HDA_CODEC_ENTRY(0x111d76ee, "92HD66B1X3", patch_stac92hd83xxx),
5145	HDA_CODEC_ENTRY(0x111d76ef, "92HD66B2X3", patch_stac92hd83xxx),
5146	HDA_CODEC_ENTRY(0x111d76f0, "92HD66B3X3", patch_stac92hd83xxx),
5147	HDA_CODEC_ENTRY(0x111d76f1, "92HD66C1X3", patch_stac92hd83xxx),
5148	HDA_CODEC_ENTRY(0x111d76f2, "92HD66C2X3", patch_stac92hd83xxx),
5149	HDA_CODEC_ENTRY(0x111d76f3, "92HD66C3/65", patch_stac92hd83xxx),
5150	{} /* terminator */
5151};
5152MODULE_DEVICE_TABLE(hdaudio, snd_hda_id_sigmatel);
 
 
5153
5154MODULE_LICENSE("GPL");
5155MODULE_DESCRIPTION("IDT/Sigmatel HD-audio codec");
5156
5157static struct hda_codec_driver sigmatel_driver = {
5158	.id = snd_hda_id_sigmatel,
 
5159};
5160
5161module_hda_codec_driver(sigmatel_driver);
 
 
 
 
 
 
 
 
 
 
 
v3.1
 
   1/*
   2 * Universal Interface for Intel High Definition Audio Codec
   3 *
   4 * HD audio interface patch for SigmaTel STAC92xx
   5 *
   6 * Copyright (c) 2005 Embedded Alley Solutions, Inc.
   7 * Matt Porter <mporter@embeddedalley.com>
   8 *
   9 * Based on patch_cmedia.c and patch_realtek.c
  10 * Copyright (c) 2004 Takashi Iwai <tiwai@suse.de>
  11 *
  12 *  This driver is free software; you can redistribute it and/or modify
  13 *  it under the terms of the GNU General Public License as published by
  14 *  the Free Software Foundation; either version 2 of the License, or
  15 *  (at your option) any later version.
  16 *
  17 *  This driver is distributed in the hope that it will be useful,
  18 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  19 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20 *  GNU General Public License for more details.
  21 *
  22 *  You should have received a copy of the GNU General Public License
  23 *  along with this program; if not, write to the Free Software
  24 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  25 */
  26
  27#include <linux/init.h>
  28#include <linux/delay.h>
  29#include <linux/slab.h>
  30#include <linux/pci.h>
  31#include <linux/dmi.h>
 
  32#include <sound/core.h>
  33#include <sound/asoundef.h>
  34#include <sound/jack.h>
  35#include <sound/tlv.h>
  36#include "hda_codec.h"
  37#include "hda_local.h"
 
  38#include "hda_beep.h"
 
 
  39
  40enum {
  41	STAC_VREF_EVENT	= 1,
  42	STAC_INSERT_EVENT,
  43	STAC_PWR_EVENT,
  44	STAC_HP_EVENT,
  45	STAC_LO_EVENT,
  46	STAC_MIC_EVENT,
  47};
  48
  49enum {
  50	STAC_AUTO,
  51	STAC_REF,
  52	STAC_9200_OQO,
  53	STAC_9200_DELL_D21,
  54	STAC_9200_DELL_D22,
  55	STAC_9200_DELL_D23,
  56	STAC_9200_DELL_M21,
  57	STAC_9200_DELL_M22,
  58	STAC_9200_DELL_M23,
  59	STAC_9200_DELL_M24,
  60	STAC_9200_DELL_M25,
  61	STAC_9200_DELL_M26,
  62	STAC_9200_DELL_M27,
  63	STAC_9200_M4,
  64	STAC_9200_M4_2,
  65	STAC_9200_PANASONIC,
 
  66	STAC_9200_MODELS
  67};
  68
  69enum {
  70	STAC_9205_AUTO,
  71	STAC_9205_REF,
  72	STAC_9205_DELL_M42,
  73	STAC_9205_DELL_M43,
  74	STAC_9205_DELL_M44,
  75	STAC_9205_EAPD,
  76	STAC_9205_MODELS
  77};
  78
  79enum {
  80	STAC_92HD73XX_AUTO,
  81	STAC_92HD73XX_NO_JD, /* no jack-detection */
  82	STAC_92HD73XX_REF,
  83	STAC_92HD73XX_INTEL,
  84	STAC_DELL_M6_AMIC,
  85	STAC_DELL_M6_DMIC,
  86	STAC_DELL_M6_BOTH,
  87	STAC_DELL_EQ,
  88	STAC_ALIENWARE_M17X,
 
 
 
 
  89	STAC_92HD73XX_MODELS
  90};
  91
  92enum {
  93	STAC_92HD83XXX_AUTO,
  94	STAC_92HD83XXX_REF,
  95	STAC_92HD83XXX_PWR_REF,
  96	STAC_DELL_S14,
  97	STAC_92HD83XXX_HP,
  98	STAC_92HD83XXX_HP_cNB11_INTQUAD,
  99	STAC_HP_DV7_4000,
 
 
 
 
 
 
 
 
 
 
 
 
 100	STAC_92HD83XXX_MODELS
 101};
 102
 103enum {
 104	STAC_92HD71BXX_AUTO,
 105	STAC_92HD71BXX_REF,
 106	STAC_DELL_M4_1,
 107	STAC_DELL_M4_2,
 108	STAC_DELL_M4_3,
 109	STAC_HP_M4,
 110	STAC_HP_DV4,
 111	STAC_HP_DV5,
 112	STAC_HP_HDX,
 113	STAC_HP_DV4_1222NR,
 
 
 114	STAC_92HD71BXX_MODELS
 115};
 116
 117enum {
 118	STAC_925x_AUTO,
 
 
 
 
 
 119	STAC_925x_REF,
 120	STAC_M1,
 121	STAC_M1_2,
 122	STAC_M2,
 123	STAC_M2_2,
 124	STAC_M3,
 125	STAC_M5,
 126	STAC_M6,
 127	STAC_925x_MODELS
 128};
 129
 130enum {
 131	STAC_922X_AUTO,
 132	STAC_D945_REF,
 133	STAC_D945GTP3,
 134	STAC_D945GTP5,
 135	STAC_INTEL_MAC_V1,
 136	STAC_INTEL_MAC_V2,
 137	STAC_INTEL_MAC_V3,
 138	STAC_INTEL_MAC_V4,
 139	STAC_INTEL_MAC_V5,
 140	STAC_INTEL_MAC_AUTO, /* This model is selected if no module parameter
 141			      * is given, one of the above models will be
 142			      * chosen according to the subsystem id. */
 143	/* for backward compatibility */
 144	STAC_MACMINI,
 145	STAC_MACBOOK,
 146	STAC_MACBOOK_PRO_V1,
 147	STAC_MACBOOK_PRO_V2,
 148	STAC_IMAC_INTEL,
 149	STAC_IMAC_INTEL_20,
 150	STAC_ECS_202,
 151	STAC_922X_DELL_D81,
 152	STAC_922X_DELL_D82,
 153	STAC_922X_DELL_M81,
 154	STAC_922X_DELL_M82,
 
 155	STAC_922X_MODELS
 156};
 157
 158enum {
 159	STAC_927X_AUTO,
 160	STAC_D965_REF_NO_JD, /* no jack-detection */
 161	STAC_D965_REF,
 162	STAC_D965_3ST,
 163	STAC_D965_5ST,
 164	STAC_D965_5ST_NO_FP,
 
 165	STAC_DELL_3ST,
 166	STAC_DELL_BIOS,
 
 
 
 
 167	STAC_927X_VOLKNOB,
 168	STAC_927X_MODELS
 169};
 170
 171enum {
 172	STAC_9872_AUTO,
 173	STAC_9872_VAIO,
 174	STAC_9872_MODELS
 175};
 176
 177struct sigmatel_event {
 178	hda_nid_t nid;
 179	unsigned char type;
 180	unsigned char tag;
 181	int data;
 182};
 183
 184struct sigmatel_mic_route {
 185	hda_nid_t pin;
 186	signed char mux_idx;
 187	signed char dmux_idx;
 188};
 189
 190#define MAX_PINS_NUM 16
 191#define MAX_ADCS_NUM 4
 192#define MAX_DMICS_NUM 4
 193
 194struct sigmatel_spec {
 195	struct snd_kcontrol_new *mixers[4];
 196	unsigned int num_mixers;
 197
 198	int board_config;
 199	unsigned int eapd_switch: 1;
 200	unsigned int surr_switch: 1;
 201	unsigned int alt_switch: 1;
 202	unsigned int hp_detect: 1;
 203	unsigned int spdif_mute: 1;
 204	unsigned int check_volume_offset:1;
 205	unsigned int auto_mic:1;
 206	unsigned int linear_tone_beep:1;
 
 
 
 
 207
 208	/* gpio lines */
 209	unsigned int eapd_mask;
 210	unsigned int gpio_mask;
 211	unsigned int gpio_dir;
 212	unsigned int gpio_data;
 213	unsigned int gpio_mute;
 214	unsigned int gpio_led;
 215	unsigned int gpio_led_polarity;
 
 216	unsigned int vref_led;
 
 
 
 
 217
 218	/* stream */
 219	unsigned int stream_delay;
 220
 221	/* analog loopback */
 222	const struct snd_kcontrol_new *aloopback_ctl;
 
 223	unsigned char aloopback_mask;
 224	unsigned char aloopback_shift;
 225
 226	/* power management */
 
 227	unsigned int num_pwrs;
 228	const unsigned int *pwr_mapping;
 229	const hda_nid_t *pwr_nids;
 230	const hda_nid_t *dac_list;
 231
 232	/* events */
 233	struct snd_array events;
 234
 235	/* playback */
 236	struct hda_input_mux *mono_mux;
 237	unsigned int cur_mmux;
 238	struct hda_multi_out multiout;
 239	hda_nid_t dac_nids[5];
 240	hda_nid_t hp_dacs[5];
 241	hda_nid_t speaker_dacs[5];
 242
 243	int volume_offset;
 244
 245	/* capture */
 246	const hda_nid_t *adc_nids;
 247	unsigned int num_adcs;
 248	const hda_nid_t *mux_nids;
 249	unsigned int num_muxes;
 250	const hda_nid_t *dmic_nids;
 251	unsigned int num_dmics;
 252	const hda_nid_t *dmux_nids;
 253	unsigned int num_dmuxes;
 254	const hda_nid_t *smux_nids;
 255	unsigned int num_smuxes;
 256	unsigned int num_analog_muxes;
 257
 258	const unsigned long *capvols; /* amp-volume attr: HDA_COMPOSE_AMP_VAL() */
 259	const unsigned long *capsws; /* amp-mute attr: HDA_COMPOSE_AMP_VAL() */
 260	unsigned int num_caps; /* number of capture volume/switch elements */
 261
 262	struct sigmatel_mic_route ext_mic;
 263	struct sigmatel_mic_route int_mic;
 264	struct sigmatel_mic_route dock_mic;
 265
 
 266	const char * const *spdif_labels;
 267
 268	hda_nid_t dig_in_nid;
 269	hda_nid_t mono_nid;
 270	hda_nid_t anabeep_nid;
 271	hda_nid_t digbeep_nid;
 272
 273	/* pin widgets */
 274	const hda_nid_t *pin_nids;
 275	unsigned int num_pins;
 276
 277	/* codec specific stuff */
 278	const struct hda_verb *init;
 279	const struct snd_kcontrol_new *mixer;
 280
 281	/* capture source */
 282	struct hda_input_mux *dinput_mux;
 283	unsigned int cur_dmux[2];
 284	struct hda_input_mux *input_mux;
 285	unsigned int cur_mux[3];
 286	struct hda_input_mux *sinput_mux;
 287	unsigned int cur_smux[2];
 288	unsigned int cur_amux;
 289	hda_nid_t *amp_nids;
 290	unsigned int powerdown_adcs;
 291
 292	/* i/o switches */
 293	unsigned int io_switch[2];
 294	unsigned int clfe_swap;
 295	hda_nid_t line_switch;	/* shared line-in for input and output */
 296	hda_nid_t mic_switch;	/* shared mic-in for input and output */
 297	hda_nid_t hp_switch; /* NID of HP as line-out */
 298	unsigned int aloopback;
 299
 300	struct hda_pcm pcm_rec[2];	/* PCM information */
 301
 302	/* dynamic controls and input_mux */
 303	struct auto_pin_cfg autocfg;
 304	struct snd_array kctls;
 305	struct hda_input_mux private_dimux;
 306	struct hda_input_mux private_imux;
 307	struct hda_input_mux private_smux;
 308	struct hda_input_mux private_mono_mux;
 309
 310	/* auto spec */
 311	unsigned auto_pin_cnt;
 312	hda_nid_t auto_pin_nids[MAX_PINS_NUM];
 313	unsigned auto_adc_cnt;
 314	hda_nid_t auto_adc_nids[MAX_ADCS_NUM];
 315	hda_nid_t auto_mux_nids[MAX_ADCS_NUM];
 316	hda_nid_t auto_dmux_nids[MAX_ADCS_NUM];
 317	unsigned long auto_capvols[MAX_ADCS_NUM];
 318	unsigned auto_dmic_cnt;
 319	hda_nid_t auto_dmic_nids[MAX_DMICS_NUM];
 320};
 321
 322static const hda_nid_t stac9200_adc_nids[1] = {
 323        0x03,
 324};
 325
 326static const hda_nid_t stac9200_mux_nids[1] = {
 327        0x0c,
 328};
 329
 330static const hda_nid_t stac9200_dac_nids[1] = {
 331        0x02,
 332};
 333
 334static const hda_nid_t stac92hd73xx_pwr_nids[8] = {
 335	0x0a, 0x0b, 0x0c, 0xd, 0x0e,
 336	0x0f, 0x10, 0x11
 337};
 338
 339static const hda_nid_t stac92hd73xx_slave_dig_outs[2] = {
 340	0x26, 0,
 
 341};
 342
 343static const hda_nid_t stac92hd73xx_adc_nids[2] = {
 344	0x1a, 0x1b
 345};
 346
 347#define STAC92HD73XX_NUM_DMICS	2
 348static const hda_nid_t stac92hd73xx_dmic_nids[STAC92HD73XX_NUM_DMICS + 1] = {
 349	0x13, 0x14, 0
 350};
 351
 352#define STAC92HD73_DAC_COUNT 5
 
 
 
 
 
 
 
 
 
 
 
 353
 354static const hda_nid_t stac92hd73xx_mux_nids[2] = {
 355	0x20, 0x21,
 356};
 
 
 
 
 357
 358static const hda_nid_t stac92hd73xx_dmux_nids[2] = {
 359	0x20, 0x21,
 360};
 361
 362static const hda_nid_t stac92hd73xx_smux_nids[2] = {
 363	0x22, 0x23,
 364};
 
 
 
 365
 366#define STAC92HD73XX_NUM_CAPS	2
 367static const unsigned long stac92hd73xx_capvols[] = {
 368	HDA_COMPOSE_AMP_VAL(0x20, 3, 0, HDA_OUTPUT),
 369	HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
 370};
 371#define stac92hd73xx_capsws	stac92hd73xx_capvols
 
 
 
 
 
 
 
 
 372
 373#define STAC92HD83_DAC_COUNT 3
 
 
 
 374
 375static const hda_nid_t stac92hd83xxx_pwr_nids[4] = {
 376	0xa, 0xb, 0xd, 0xe,
 377};
 
 
 378
 379static const hda_nid_t stac92hd83xxx_slave_dig_outs[2] = {
 380	0x1e, 0,
 381};
 382
 383static const unsigned int stac92hd83xxx_pwr_mapping[4] = {
 384	0x03, 0x0c, 0x20, 0x40,
 385};
 386
 387static const hda_nid_t stac92hd83xxx_dmic_nids[] = {
 388		0x11, 0x20,
 389};
 390
 391static const hda_nid_t stac92hd71bxx_pwr_nids[3] = {
 392	0x0a, 0x0d, 0x0f
 393};
 394
 395static const hda_nid_t stac92hd71bxx_adc_nids[2] = {
 396	0x12, 0x13,
 397};
 398
 399static const hda_nid_t stac92hd71bxx_mux_nids[2] = {
 400	0x1a, 0x1b
 401};
 
 402
 403static const hda_nid_t stac92hd71bxx_dmux_nids[2] = {
 404	0x1c, 0x1d,
 405};
 406
 407static const hda_nid_t stac92hd71bxx_smux_nids[2] = {
 408	0x24, 0x25,
 409};
 410
 411#define STAC92HD71BXX_NUM_DMICS	2
 412static const hda_nid_t stac92hd71bxx_dmic_nids[STAC92HD71BXX_NUM_DMICS + 1] = {
 413	0x18, 0x19, 0
 414};
 
 
 415
 416static const hda_nid_t stac92hd71bxx_dmic_5port_nids[STAC92HD71BXX_NUM_DMICS] = {
 417	0x18, 0
 418};
 
 
 
 
 419
 420static const hda_nid_t stac92hd71bxx_slave_dig_outs[2] = {
 421	0x22, 0
 422};
 
 423
 424#define STAC92HD71BXX_NUM_CAPS		2
 425static const unsigned long stac92hd71bxx_capvols[] = {
 426	HDA_COMPOSE_AMP_VAL(0x1c, 3, 0, HDA_OUTPUT),
 427	HDA_COMPOSE_AMP_VAL(0x1d, 3, 0, HDA_OUTPUT),
 428};
 429#define stac92hd71bxx_capsws	stac92hd71bxx_capvols
 430
 431static const hda_nid_t stac925x_adc_nids[1] = {
 432        0x03,
 433};
 434
 435static const hda_nid_t stac925x_mux_nids[1] = {
 436        0x0f,
 437};
 438
 439static const hda_nid_t stac925x_dac_nids[1] = {
 440        0x02,
 441};
 442
 443#define STAC925X_NUM_DMICS	1
 444static const hda_nid_t stac925x_dmic_nids[STAC925X_NUM_DMICS + 1] = {
 445	0x15, 0
 446};
 447
 448static const hda_nid_t stac925x_dmux_nids[1] = {
 449	0x14,
 450};
 
 
 
 
 
 
 
 451
 452static const unsigned long stac925x_capvols[] = {
 453	HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_OUTPUT),
 454};
 455static const unsigned long stac925x_capsws[] = {
 456	HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
 457};
 458
 459static const hda_nid_t stac922x_adc_nids[2] = {
 460        0x06, 0x07,
 461};
 462
 463static const hda_nid_t stac922x_mux_nids[2] = {
 464        0x12, 0x13,
 465};
 466
 467#define STAC922X_NUM_CAPS	2
 468static const unsigned long stac922x_capvols[] = {
 469	HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_INPUT),
 470	HDA_COMPOSE_AMP_VAL(0x18, 3, 0, HDA_INPUT),
 471};
 472#define stac922x_capsws		stac922x_capvols
 
 
 
 
 
 
 
 473
 474static const hda_nid_t stac927x_slave_dig_outs[2] = {
 475	0x1f, 0,
 476};
 
 
 477
 478static const hda_nid_t stac927x_adc_nids[3] = {
 479        0x07, 0x08, 0x09
 480};
 481
 482static const hda_nid_t stac927x_mux_nids[3] = {
 483        0x15, 0x16, 0x17
 484};
 
 485
 486static const hda_nid_t stac927x_smux_nids[1] = {
 487	0x21,
 488};
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 489
 490static const hda_nid_t stac927x_dac_nids[6] = {
 491	0x02, 0x03, 0x04, 0x05, 0x06, 0
 492};
 
 
 493
 494static const hda_nid_t stac927x_dmux_nids[1] = {
 495	0x1b,
 496};
 
 
 
 497
 498#define STAC927X_NUM_DMICS 2
 499static const hda_nid_t stac927x_dmic_nids[STAC927X_NUM_DMICS + 1] = {
 500	0x13, 0x14, 0
 501};
 502
 503#define STAC927X_NUM_CAPS	3
 504static const unsigned long stac927x_capvols[] = {
 505	HDA_COMPOSE_AMP_VAL(0x18, 3, 0, HDA_INPUT),
 506	HDA_COMPOSE_AMP_VAL(0x19, 3, 0, HDA_INPUT),
 507	HDA_COMPOSE_AMP_VAL(0x1a, 3, 0, HDA_INPUT),
 508};
 509static const unsigned long stac927x_capsws[] = {
 510	HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
 511	HDA_COMPOSE_AMP_VAL(0x1c, 3, 0, HDA_OUTPUT),
 512	HDA_COMPOSE_AMP_VAL(0x1d, 3, 0, HDA_OUTPUT),
 513};
 514
 515static const char * const stac927x_spdif_labels[5] = {
 516	"Digital Playback", "ADAT", "Analog Mux 1",
 517	"Analog Mux 2", "Analog Mux 3"
 518};
 
 
 
 
 519
 520static const hda_nid_t stac9205_adc_nids[2] = {
 521        0x12, 0x13
 522};
 
 
 
 523
 524static const hda_nid_t stac9205_mux_nids[2] = {
 525        0x19, 0x1a
 526};
 527
 528static const hda_nid_t stac9205_dmux_nids[1] = {
 529	0x1d,
 530};
 
 
 
 531
 532static const hda_nid_t stac9205_smux_nids[1] = {
 533	0x21,
 534};
 
 
 
 
 
 
 535
 536#define STAC9205_NUM_DMICS	2
 537static const hda_nid_t stac9205_dmic_nids[STAC9205_NUM_DMICS + 1] = {
 538        0x17, 0x18, 0
 539};
 540
 541#define STAC9205_NUM_CAPS	2
 542static const unsigned long stac9205_capvols[] = {
 543	HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_INPUT),
 544	HDA_COMPOSE_AMP_VAL(0x1c, 3, 0, HDA_INPUT),
 545};
 546static const unsigned long stac9205_capsws[] = {
 547	HDA_COMPOSE_AMP_VAL(0x1d, 3, 0, HDA_OUTPUT),
 548	HDA_COMPOSE_AMP_VAL(0x1e, 3, 0, HDA_OUTPUT),
 549};
 550
 551static const hda_nid_t stac9200_pin_nids[8] = {
 552	0x08, 0x09, 0x0d, 0x0e, 
 553	0x0f, 0x10, 0x11, 0x12,
 554};
 
 
 555
 556static const hda_nid_t stac925x_pin_nids[8] = {
 557	0x07, 0x08, 0x0a, 0x0b, 
 558	0x0c, 0x0d, 0x10, 0x11,
 559};
 
 
 
 560
 561static const hda_nid_t stac922x_pin_nids[10] = {
 562	0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
 563	0x0f, 0x10, 0x11, 0x15, 0x1b,
 564};
 
 
 
 
 
 
 
 
 
 
 
 
 
 565
 566static const hda_nid_t stac92hd73xx_pin_nids[13] = {
 567	0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
 568	0x0f, 0x10, 0x11, 0x12, 0x13,
 569	0x14, 0x22, 0x23
 570};
 571
 572#define STAC92HD71BXX_NUM_PINS 13
 573static const hda_nid_t stac92hd71bxx_pin_nids_4port[STAC92HD71BXX_NUM_PINS] = {
 574	0x0a, 0x0b, 0x0c, 0x0d, 0x00,
 575	0x00, 0x14, 0x18, 0x19, 0x1e,
 576	0x1f, 0x20, 0x27
 577};
 578static const hda_nid_t stac92hd71bxx_pin_nids_6port[STAC92HD71BXX_NUM_PINS] = {
 579	0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
 580	0x0f, 0x14, 0x18, 0x19, 0x1e,
 581	0x1f, 0x20, 0x27
 582};
 583
 584static const hda_nid_t stac927x_pin_nids[14] = {
 585	0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
 586	0x0f, 0x10, 0x11, 0x12, 0x13,
 587	0x14, 0x21, 0x22, 0x23,
 588};
 589
 590static const hda_nid_t stac9205_pin_nids[12] = {
 591	0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
 592	0x0f, 0x14, 0x16, 0x17, 0x18,
 593	0x21, 0x22,
 594};
 595
 596static int stac92xx_dmux_enum_info(struct snd_kcontrol *kcontrol,
 597				   struct snd_ctl_elem_info *uinfo)
 598{
 599	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
 600	struct sigmatel_spec *spec = codec->spec;
 601	return snd_hda_input_mux_info(spec->dinput_mux, uinfo);
 602}
 603
 604static int stac92xx_dmux_enum_get(struct snd_kcontrol *kcontrol,
 605				  struct snd_ctl_elem_value *ucontrol)
 606{
 607	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
 608	struct sigmatel_spec *spec = codec->spec;
 609	unsigned int dmux_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
 610
 611	ucontrol->value.enumerated.item[0] = spec->cur_dmux[dmux_idx];
 612	return 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 613}
 614
 615static int stac92xx_dmux_enum_put(struct snd_kcontrol *kcontrol,
 616				  struct snd_ctl_elem_value *ucontrol)
 617{
 618	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
 619	struct sigmatel_spec *spec = codec->spec;
 620	unsigned int dmux_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
 621
 622	return snd_hda_input_mux_put(codec, spec->dinput_mux, ucontrol,
 623			spec->dmux_nids[dmux_idx], &spec->cur_dmux[dmux_idx]);
 624}
 625
 626static int stac92xx_smux_enum_info(struct snd_kcontrol *kcontrol,
 627				   struct snd_ctl_elem_info *uinfo)
 628{
 629	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
 
 630	struct sigmatel_spec *spec = codec->spec;
 631	return snd_hda_input_mux_info(spec->sinput_mux, uinfo);
 
 
 
 632}
 633
 634static int stac92xx_smux_enum_get(struct snd_kcontrol *kcontrol,
 635				  struct snd_ctl_elem_value *ucontrol)
 636{
 637	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
 638	struct sigmatel_spec *spec = codec->spec;
 639	unsigned int smux_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
 
 
 640
 641	ucontrol->value.enumerated.item[0] = spec->cur_smux[smux_idx];
 642	return 0;
 643}
 
 
 
 
 644
 645static int stac92xx_smux_enum_put(struct snd_kcontrol *kcontrol,
 646				  struct snd_ctl_elem_value *ucontrol)
 647{
 648	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
 649	struct sigmatel_spec *spec = codec->spec;
 650	struct hda_input_mux *smux = &spec->private_smux;
 651	unsigned int smux_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
 652	int err, val;
 653	hda_nid_t nid;
 654
 655	err = snd_hda_input_mux_put(codec, spec->sinput_mux, ucontrol,
 656			spec->smux_nids[smux_idx], &spec->cur_smux[smux_idx]);
 657	if (err < 0)
 658		return err;
 
 
 659
 660	if (spec->spdif_mute) {
 661		if (smux_idx == 0)
 662			nid = spec->multiout.dig_out_nid;
 663		else
 664			nid = codec->slave_dig_outs[smux_idx - 1];
 665		if (spec->cur_smux[smux_idx] == smux->num_items - 1)
 666			val = HDA_AMP_MUTE;
 667		else
 668			val = 0;
 669		/* un/mute SPDIF out */
 670		snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
 671					 HDA_AMP_MUTE, val);
 672	}
 673	return 0;
 
 
 
 
 674}
 675
 676#ifdef CONFIG_SND_HDA_POWER_SAVE
 677static int stac_vrefout_set(struct hda_codec *codec,
 678					hda_nid_t nid, unsigned int new_vref)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 679{
 680	int error, pinctl;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 681
 682	snd_printdd("%s, nid %x ctl %x\n", __func__, nid, new_vref);
 683	pinctl = snd_hda_codec_read(codec, nid, 0,
 684				AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
 685
 686	if (pinctl < 0)
 687		return pinctl;
 
 688
 689	pinctl &= 0xff;
 690	pinctl &= ~AC_PINCTL_VREFEN;
 691	pinctl |= (new_vref & AC_PINCTL_VREFEN);
 
 692
 693	error = snd_hda_codec_write_cache(codec, nid, 0,
 694					AC_VERB_SET_PIN_WIDGET_CONTROL, pinctl);
 695	if (error < 0)
 696		return error;
 697
 698	return 1;
 
 
 699}
 700#endif
 701
 702static unsigned int stac92xx_vref_set(struct hda_codec *codec,
 703					hda_nid_t nid, unsigned int new_vref)
 704{
 705	int error;
 706	unsigned int pincfg;
 707	pincfg = snd_hda_codec_read(codec, nid, 0,
 708				AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 709
 710	pincfg &= 0xff;
 711	pincfg &= ~(AC_PINCTL_VREFEN | AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN);
 712	pincfg |= new_vref;
 
 713
 714	if (new_vref == AC_PINCTL_VREF_HIZ)
 715		pincfg |= AC_PINCTL_OUT_EN;
 716	else
 717		pincfg |= AC_PINCTL_IN_EN;
 718
 719	error = snd_hda_codec_write_cache(codec, nid, 0,
 720					AC_VERB_SET_PIN_WIDGET_CONTROL, pincfg);
 721	if (error < 0)
 722		return error;
 723	else
 724		return 1;
 725}
 726
 727static unsigned int stac92xx_vref_get(struct hda_codec *codec, hda_nid_t nid)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 728{
 729	unsigned int vref;
 730	vref = snd_hda_codec_read(codec, nid, 0,
 731				AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
 732	vref &= AC_PINCTL_VREFEN;
 733	return vref;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 734}
 735
 736static int stac92xx_mux_enum_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
 
 737{
 738	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
 739	struct sigmatel_spec *spec = codec->spec;
 740	return snd_hda_input_mux_info(spec->input_mux, uinfo);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 741}
 742
 743static int stac92xx_mux_enum_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
 
 
 
 
 
 
 744{
 745	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
 746	struct sigmatel_spec *spec = codec->spec;
 747	unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 748
 749	ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
 
 
 
 
 
 
 
 
 
 750	return 0;
 751}
 752
 753static int stac92xx_mux_enum_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
 
 
 
 
 754{
 755	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
 756	struct sigmatel_spec *spec = codec->spec;
 757	unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
 758	const struct hda_input_mux *imux = spec->input_mux;
 759	unsigned int idx, prev_idx, didx;
 760
 761	idx = ucontrol->value.enumerated.item[0];
 762	if (idx >= imux->num_items)
 763		idx = imux->num_items - 1;
 764	prev_idx = spec->cur_mux[adc_idx];
 765	if (prev_idx == idx)
 766		return 0;
 767	if (idx < spec->num_analog_muxes) {
 768		snd_hda_codec_write_cache(codec, spec->mux_nids[adc_idx], 0,
 769					  AC_VERB_SET_CONNECT_SEL,
 770					  imux->items[idx].index);
 771		if (prev_idx >= spec->num_analog_muxes &&
 772		    spec->mux_nids[adc_idx] != spec->dmux_nids[adc_idx]) {
 773			imux = spec->dinput_mux;
 774			/* 0 = analog */
 775			snd_hda_codec_write_cache(codec,
 776						  spec->dmux_nids[adc_idx], 0,
 777						  AC_VERB_SET_CONNECT_SEL,
 778						  imux->items[0].index);
 779		}
 780	} else {
 781		imux = spec->dinput_mux;
 782		/* first dimux item is hardcoded to select analog imux,
 783		 * so lets skip it
 784		 */
 785		didx = idx - spec->num_analog_muxes + 1;
 786		snd_hda_codec_write_cache(codec, spec->dmux_nids[adc_idx], 0,
 787					  AC_VERB_SET_CONNECT_SEL,
 788					  imux->items[didx].index);
 789	}
 790	spec->cur_mux[adc_idx] = idx;
 791	return 1;
 792}
 793
 794static int stac92xx_mono_mux_enum_info(struct snd_kcontrol *kcontrol,
 795	struct snd_ctl_elem_info *uinfo)
 796{
 797	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
 798	struct sigmatel_spec *spec = codec->spec;
 799	return snd_hda_input_mux_info(spec->mono_mux, uinfo);
 800}
 801
 802static int stac92xx_mono_mux_enum_get(struct snd_kcontrol *kcontrol,
 803	struct snd_ctl_elem_value *ucontrol)
 
 
 
 
 
 
 
 804{
 805	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
 806	struct sigmatel_spec *spec = codec->spec;
 807
 808	ucontrol->value.enumerated.item[0] = spec->cur_mmux;
 
 809	return 0;
 810}
 
 
 
 
 
 811
 812static int stac92xx_mono_mux_enum_put(struct snd_kcontrol *kcontrol,
 813	struct snd_ctl_elem_value *ucontrol)
 814{
 815	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
 816	struct sigmatel_spec *spec = codec->spec;
 817
 818	return snd_hda_input_mux_put(codec, spec->mono_mux, ucontrol,
 819				     spec->mono_nid, &spec->cur_mmux);
 820}
 821
 822#define stac92xx_aloopback_info snd_ctl_boolean_mono_info
 823
 824static int stac92xx_aloopback_get(struct snd_kcontrol *kcontrol,
 825	struct snd_ctl_elem_value *ucontrol)
 826{
 827	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
 828	unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
 829	struct sigmatel_spec *spec = codec->spec;
 
 830
 831	ucontrol->value.integer.value[0] = !!(spec->aloopback &
 832					      (spec->aloopback_mask << idx));
 833	return 0;
 834}
 835
 836static int stac92xx_aloopback_put(struct snd_kcontrol *kcontrol,
 837		struct snd_ctl_elem_value *ucontrol)
 838{
 839	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
 840	struct sigmatel_spec *spec = codec->spec;
 841	unsigned int idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
 842	unsigned int dac_mode;
 843	unsigned int val, idx_val;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 844
 845	idx_val = spec->aloopback_mask << idx;
 846	if (ucontrol->value.integer.value[0])
 847		val = spec->aloopback | idx_val;
 848	else
 849		val = spec->aloopback & ~idx_val;
 850	if (spec->aloopback == val)
 851		return 0;
 852
 853	spec->aloopback = val;
 
 
 854
 855	/* Only return the bits defined by the shift value of the
 856	 * first two bytes of the mask
 857	 */
 858	dac_mode = snd_hda_codec_read(codec, codec->afg, 0,
 859				      kcontrol->private_value & 0xFFFF, 0x0);
 860	dac_mode >>= spec->aloopback_shift;
 861
 862	if (spec->aloopback & idx_val) {
 863		snd_hda_power_up(codec);
 864		dac_mode |= idx_val;
 865	} else {
 866		snd_hda_power_down(codec);
 867		dac_mode &= ~idx_val;
 868	}
 869
 870	snd_hda_codec_write_cache(codec, codec->afg, 0,
 871		kcontrol->private_value >> 16, dac_mode);
 
 
 872
 873	return 1;
 874}
 875
 876static const struct hda_verb stac9200_core_init[] = {
 877	/* set dac0mux for dac converter */
 878	{ 0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
 879	{}
 880};
 881
 882static const struct hda_verb stac9200_eapd_init[] = {
 883	/* set dac0mux for dac converter */
 884	{0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
 885	{0x08, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
 886	{}
 887};
 888
 889static const struct hda_verb dell_eq_core_init[] = {
 890	/* set master volume to max value without distortion
 891	 * and direct control */
 892	{ 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xec},
 893	{}
 894};
 895
 896static const struct hda_verb stac92hd73xx_core_init[] = {
 897	/* set master volume and direct control */
 898	{ 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
 899	{}
 900};
 901
 902static const struct hda_verb stac92hd83xxx_core_init[] = {
 903	/* power state controls amps */
 904	{ 0x01, AC_VERB_SET_EAPD, 1 << 2},
 905	{}
 906};
 907
 
 
 
 
 
 
 
 908static const struct hda_verb stac92hd71bxx_core_init[] = {
 909	/* set master volume and direct control */
 910	{ 0x28, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
 911	{}
 912};
 913
 914static const struct hda_verb stac92hd71bxx_unmute_core_init[] = {
 915	/* unmute right and left channels for nodes 0x0f, 0xa, 0x0d */
 916	{ 0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
 917	{ 0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
 918	{ 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
 919	{}
 920};
 921
 922static const struct hda_verb stac925x_core_init[] = {
 923	/* set dac0mux for dac converter */
 924	{ 0x06, AC_VERB_SET_CONNECT_SEL, 0x00},
 925	/* mute the master volume */
 926	{ 0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
 927	{}
 928};
 929
 930static const struct hda_verb stac922x_core_init[] = {
 931	/* set master volume and direct control */	
 932	{ 0x16, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
 933	{}
 934};
 935
 936static const struct hda_verb d965_core_init[] = {
 937	/* set master volume and direct control */	
 938	{ 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
 939	/* unmute node 0x1b */
 940	{ 0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
 941	/* select node 0x03 as DAC */	
 942	{ 0x0b, AC_VERB_SET_CONNECT_SEL, 0x01},
 943	{}
 944};
 945
 946static const struct hda_verb dell_3st_core_init[] = {
 947	/* don't set delta bit */
 948	{0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0x7f},
 949	/* unmute node 0x1b */
 950	{0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
 951	/* select node 0x03 as DAC */
 952	{0x0b, AC_VERB_SET_CONNECT_SEL, 0x01},
 953	{}
 954};
 955
 956static const struct hda_verb stac927x_core_init[] = {
 957	/* set master volume and direct control */	
 958	{ 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
 959	/* enable analog pc beep path */
 960	{ 0x01, AC_VERB_SET_DIGI_CONVERT_2, 1 << 5},
 961	{}
 962};
 963
 964static const struct hda_verb stac927x_volknob_core_init[] = {
 965	/* don't set delta bit */
 966	{0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0x7f},
 967	/* enable analog pc beep path */
 968	{0x01, AC_VERB_SET_DIGI_CONVERT_2, 1 << 5},
 969	{}
 970};
 971
 972static const struct hda_verb stac9205_core_init[] = {
 973	/* set master volume and direct control */	
 974	{ 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
 975	/* enable analog pc beep path */
 976	{ 0x01, AC_VERB_SET_DIGI_CONVERT_2, 1 << 5},
 977	{}
 978};
 979
 980#define STAC_MONO_MUX \
 981	{ \
 982		.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
 983		.name = "Mono Mux", \
 984		.count = 1, \
 985		.info = stac92xx_mono_mux_enum_info, \
 986		.get = stac92xx_mono_mux_enum_get, \
 987		.put = stac92xx_mono_mux_enum_put, \
 988	}
 989
 990#define STAC_ANALOG_LOOPBACK(verb_read, verb_write, cnt) \
 991	{ \
 992		.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
 993		.name  = "Analog Loopback", \
 994		.count = cnt, \
 995		.info  = stac92xx_aloopback_info, \
 996		.get   = stac92xx_aloopback_get, \
 997		.put   = stac92xx_aloopback_put, \
 998		.private_value = verb_read | (verb_write << 16), \
 999	}
1000
1001#define DC_BIAS(xname, idx, nid) \
1002	{ \
1003		.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1004		.name = xname, \
1005		.index = idx, \
1006		.info = stac92xx_dc_bias_info, \
1007		.get = stac92xx_dc_bias_get, \
1008		.put = stac92xx_dc_bias_put, \
1009		.private_value = nid, \
1010	}
1011
1012static const struct snd_kcontrol_new stac9200_mixer[] = {
1013	HDA_CODEC_VOLUME_MIN_MUTE("Master Playback Volume", 0xb, 0, HDA_OUTPUT),
1014	HDA_CODEC_MUTE("Master Playback Switch", 0xb, 0, HDA_OUTPUT),
1015	HDA_CODEC_VOLUME("Capture Volume", 0x0a, 0, HDA_OUTPUT),
1016	HDA_CODEC_MUTE("Capture Switch", 0x0a, 0, HDA_OUTPUT),
1017	{ } /* end */
1018};
1019
1020static const struct snd_kcontrol_new stac92hd73xx_6ch_loopback[] = {
1021	STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 3),
1022	{}
1023};
1024
1025static const struct snd_kcontrol_new stac92hd73xx_8ch_loopback[] = {
1026	STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 4),
1027	{}
1028};
1029
1030static const struct snd_kcontrol_new stac92hd73xx_10ch_loopback[] = {
1031	STAC_ANALOG_LOOPBACK(0xFA0, 0x7A1, 5),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1032	{}
1033};
1034
1035
1036static const struct snd_kcontrol_new stac92hd71bxx_loopback[] = {
1037	STAC_ANALOG_LOOPBACK(0xFA0, 0x7A0, 2)
1038};
1039
1040static const struct snd_kcontrol_new stac925x_mixer[] = {
1041	HDA_CODEC_VOLUME_MIN_MUTE("Master Playback Volume", 0xe, 0, HDA_OUTPUT),
1042	HDA_CODEC_MUTE("Master Playback Switch", 0x0e, 0, HDA_OUTPUT),
1043	{ } /* end */
1044};
1045
1046static const struct snd_kcontrol_new stac9205_loopback[] = {
1047	STAC_ANALOG_LOOPBACK(0xFE0, 0x7E0, 1),
1048	{}
1049};
1050
1051static const struct snd_kcontrol_new stac927x_loopback[] = {
1052	STAC_ANALOG_LOOPBACK(0xFEB, 0x7EB, 1),
 
 
 
 
 
 
 
1053	{}
1054};
1055
1056static struct snd_kcontrol_new stac_dmux_mixer = {
1057	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1058	.name = "Digital Input Source",
1059	/* count set later */
1060	.info = stac92xx_dmux_enum_info,
1061	.get = stac92xx_dmux_enum_get,
1062	.put = stac92xx_dmux_enum_put,
1063};
1064
1065static struct snd_kcontrol_new stac_smux_mixer = {
1066	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1067	.name = "IEC958 Playback Source",
1068	/* count set later */
1069	.info = stac92xx_smux_enum_info,
1070	.get = stac92xx_smux_enum_get,
1071	.put = stac92xx_smux_enum_put,
1072};
1073
1074static const char * const slave_vols[] = {
1075	"Front Playback Volume",
1076	"Surround Playback Volume",
1077	"Center Playback Volume",
1078	"LFE Playback Volume",
1079	"Side Playback Volume",
1080	"Headphone Playback Volume",
1081	"Speaker Playback Volume",
1082	NULL
1083};
1084
1085static const char * const slave_sws[] = {
1086	"Front Playback Switch",
1087	"Surround Playback Switch",
1088	"Center Playback Switch",
1089	"LFE Playback Switch",
1090	"Side Playback Switch",
1091	"Headphone Playback Switch",
1092	"Speaker Playback Switch",
1093	"IEC958 Playback Switch",
1094	NULL
1095};
1096
1097static void stac92xx_free_kctls(struct hda_codec *codec);
1098static int stac92xx_add_jack(struct hda_codec *codec, hda_nid_t nid, int type);
1099
1100static int stac92xx_build_controls(struct hda_codec *codec)
1101{
1102	struct sigmatel_spec *spec = codec->spec;
1103	struct auto_pin_cfg *cfg = &spec->autocfg;
1104	hda_nid_t nid;
1105	int err;
1106	int i;
1107
1108	if (spec->mixer) {
1109		err = snd_hda_add_new_ctls(codec, spec->mixer);
1110		if (err < 0)
1111			return err;
1112	}
1113
1114	for (i = 0; i < spec->num_mixers; i++) {
1115		err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
1116		if (err < 0)
1117			return err;
1118	}
1119	if (!spec->auto_mic && spec->num_dmuxes > 0 &&
1120	    snd_hda_get_bool_hint(codec, "separate_dmux") == 1) {
1121		stac_dmux_mixer.count = spec->num_dmuxes;
1122		err = snd_hda_ctl_add(codec, 0,
1123				  snd_ctl_new1(&stac_dmux_mixer, codec));
1124		if (err < 0)
1125			return err;
1126	}
1127	if (spec->num_smuxes > 0) {
1128		int wcaps = get_wcaps(codec, spec->multiout.dig_out_nid);
1129		struct hda_input_mux *smux = &spec->private_smux;
1130		/* check for mute support on SPDIF out */
1131		if (wcaps & AC_WCAP_OUT_AMP) {
1132			snd_hda_add_imux_item(smux, "Off", 0, NULL);
1133			spec->spdif_mute = 1;
1134		}
1135		stac_smux_mixer.count = spec->num_smuxes;
1136		err = snd_hda_ctl_add(codec, 0,
1137				  snd_ctl_new1(&stac_smux_mixer, codec));
1138		if (err < 0)
1139			return err;
1140	}
1141
1142	if (spec->multiout.dig_out_nid) {
1143		err = snd_hda_create_spdif_out_ctls(codec,
1144						    spec->multiout.dig_out_nid,
1145						    spec->multiout.dig_out_nid);
1146		if (err < 0)
1147			return err;
1148		err = snd_hda_create_spdif_share_sw(codec,
1149						    &spec->multiout);
1150		if (err < 0)
1151			return err;
1152		spec->multiout.share_spdif = 1;
1153	}
1154	if (spec->dig_in_nid && !(spec->gpio_dir & 0x01)) {
1155		err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
1156		if (err < 0)
1157			return err;
1158	}
1159
1160	/* if we have no master control, let's create it */
1161	if (!snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
1162		unsigned int vmaster_tlv[4];
1163		snd_hda_set_vmaster_tlv(codec, spec->multiout.dac_nids[0],
1164					HDA_OUTPUT, vmaster_tlv);
1165		/* correct volume offset */
1166		vmaster_tlv[2] += vmaster_tlv[3] * spec->volume_offset;
1167		/* minimum value is actually mute */
1168		vmaster_tlv[3] |= TLV_DB_SCALE_MUTE;
1169		err = snd_hda_add_vmaster(codec, "Master Playback Volume",
1170					  vmaster_tlv, slave_vols);
1171		if (err < 0)
1172			return err;
1173	}
1174	if (!snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
1175		err = snd_hda_add_vmaster(codec, "Master Playback Switch",
1176					  NULL, slave_sws);
1177		if (err < 0)
1178			return err;
1179	}
1180
1181	if (spec->aloopback_ctl &&
1182	    snd_hda_get_bool_hint(codec, "loopback") == 1) {
1183		err = snd_hda_add_new_ctls(codec, spec->aloopback_ctl);
1184		if (err < 0)
1185			return err;
1186	}
1187
1188	stac92xx_free_kctls(codec); /* no longer needed */
1189
1190	/* create jack input elements */
1191	if (spec->hp_detect) {
1192		for (i = 0; i < cfg->hp_outs; i++) {
1193			int type = SND_JACK_HEADPHONE;
1194			nid = cfg->hp_pins[i];
1195			/* jack detection */
1196			if (cfg->hp_outs == i)
1197				type |= SND_JACK_LINEOUT;
1198			err = stac92xx_add_jack(codec, nid, type);
1199			if (err < 0)
1200				return err;
1201		}
1202	}
1203	for (i = 0; i < cfg->line_outs; i++) {
1204		err = stac92xx_add_jack(codec, cfg->line_out_pins[i],
1205					SND_JACK_LINEOUT);
1206		if (err < 0)
1207			return err;
1208	}
1209	for (i = 0; i < cfg->num_inputs; i++) {
1210		nid = cfg->inputs[i].pin;
1211		err = stac92xx_add_jack(codec, nid, SND_JACK_MICROPHONE);
1212		if (err < 0)
1213			return err;
1214	}
1215
1216	return 0;	
1217}
1218
1219static const unsigned int ref9200_pin_configs[8] = {
1220	0x01c47010, 0x01447010, 0x0221401f, 0x01114010,
1221	0x02a19020, 0x01a19021, 0x90100140, 0x01813122,
1222};
1223
1224static const unsigned int gateway9200_m4_pin_configs[8] = {
1225	0x400000fe, 0x404500f4, 0x400100f0, 0x90110010,
1226	0x400100f1, 0x02a1902e, 0x500000f2, 0x500000f3,
1227};
1228static const unsigned int gateway9200_m4_2_pin_configs[8] = {
1229	0x400000fe, 0x404500f4, 0x400100f0, 0x90110010,
1230	0x400100f1, 0x02a1902e, 0x500000f2, 0x500000f3,
1231};
1232
1233/*
1234    STAC 9200 pin configs for
1235    102801A8
1236    102801DE
1237    102801E8
1238*/
1239static const unsigned int dell9200_d21_pin_configs[8] = {
1240	0x400001f0, 0x400001f1, 0x02214030, 0x01014010, 
1241	0x02a19020, 0x01a19021, 0x90100140, 0x01813122,
 
 
 
 
 
 
 
1242};
1243
1244/* 
1245    STAC 9200 pin configs for
1246    102801C0
1247    102801C1
1248*/
1249static const unsigned int dell9200_d22_pin_configs[8] = {
1250	0x400001f0, 0x400001f1, 0x0221401f, 0x01014010, 
1251	0x01813020, 0x02a19021, 0x90100140, 0x400001f2,
 
 
 
 
 
 
 
1252};
1253
1254/* 
1255    STAC 9200 pin configs for
1256    102801C4 (Dell Dimension E310)
1257    102801C5
1258    102801C7
1259    102801D9
1260    102801DA
1261    102801E3
1262*/
1263static const unsigned int dell9200_d23_pin_configs[8] = {
1264	0x400001f0, 0x400001f1, 0x0221401f, 0x01014010, 
1265	0x01813020, 0x01a19021, 0x90100140, 0x400001f2, 
 
 
 
 
 
 
 
1266};
1267
1268
1269/* 
1270    STAC 9200-32 pin configs for
1271    102801B5 (Dell Inspiron 630m)
1272    102801D8 (Dell Inspiron 640m)
1273*/
1274static const unsigned int dell9200_m21_pin_configs[8] = {
1275	0x40c003fa, 0x03441340, 0x0321121f, 0x90170310,
1276	0x408003fb, 0x03a11020, 0x401003fc, 0x403003fd,
 
 
 
 
 
 
 
1277};
1278
1279/* 
1280    STAC 9200-32 pin configs for
1281    102801C2 (Dell Latitude D620)
1282    102801C8 
1283    102801CC (Dell Latitude D820)
1284    102801D4 
1285    102801D6 
1286*/
1287static const unsigned int dell9200_m22_pin_configs[8] = {
1288	0x40c003fa, 0x0144131f, 0x0321121f, 0x90170310, 
1289	0x90a70321, 0x03a11020, 0x401003fb, 0x40f000fc,
 
 
 
 
 
 
 
1290};
1291
1292/* 
1293    STAC 9200-32 pin configs for
1294    102801CE (Dell XPS M1710)
1295    102801CF (Dell Precision M90)
1296*/
1297static const unsigned int dell9200_m23_pin_configs[8] = {
1298	0x40c003fa, 0x01441340, 0x0421421f, 0x90170310,
1299	0x408003fb, 0x04a1102e, 0x90170311, 0x403003fc,
 
 
 
 
 
 
 
1300};
1301
1302/*
1303    STAC 9200-32 pin configs for 
1304    102801C9
1305    102801CA
1306    102801CB (Dell Latitude 120L)
1307    102801D3
1308*/
1309static const unsigned int dell9200_m24_pin_configs[8] = {
1310	0x40c003fa, 0x404003fb, 0x0321121f, 0x90170310, 
1311	0x408003fc, 0x03a11020, 0x401003fd, 0x403003fe, 
 
 
 
 
 
 
 
1312};
1313
1314/*
1315    STAC 9200-32 pin configs for
1316    102801BD (Dell Inspiron E1505n)
1317    102801EE
1318    102801EF
1319*/
1320static const unsigned int dell9200_m25_pin_configs[8] = {
1321	0x40c003fa, 0x01441340, 0x0421121f, 0x90170310, 
1322	0x408003fb, 0x04a11020, 0x401003fc, 0x403003fd,
 
 
 
 
 
 
 
1323};
1324
1325/*
1326    STAC 9200-32 pin configs for
1327    102801F5 (Dell Inspiron 1501)
1328    102801F6
1329*/
1330static const unsigned int dell9200_m26_pin_configs[8] = {
1331	0x40c003fa, 0x404003fb, 0x0421121f, 0x90170310, 
1332	0x408003fc, 0x04a11020, 0x401003fd, 0x403003fe,
 
 
 
 
 
 
 
1333};
1334
1335/*
1336    STAC 9200-32
1337    102801CD (Dell Inspiron E1705/9400)
1338*/
1339static const unsigned int dell9200_m27_pin_configs[8] = {
1340	0x40c003fa, 0x01441340, 0x0421121f, 0x90170310,
1341	0x90170310, 0x04a11020, 0x90170310, 0x40f003fc,
1342};
1343
1344static const unsigned int oqo9200_pin_configs[8] = {
1345	0x40c000f0, 0x404000f1, 0x0221121f, 0x02211210,
1346	0x90170111, 0x90a70120, 0x400000f2, 0x400000f3,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1347};
1348
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1349
1350static const unsigned int *stac9200_brd_tbl[STAC_9200_MODELS] = {
1351	[STAC_REF] = ref9200_pin_configs,
1352	[STAC_9200_OQO] = oqo9200_pin_configs,
1353	[STAC_9200_DELL_D21] = dell9200_d21_pin_configs,
1354	[STAC_9200_DELL_D22] = dell9200_d22_pin_configs,
1355	[STAC_9200_DELL_D23] = dell9200_d23_pin_configs,
1356	[STAC_9200_DELL_M21] = dell9200_m21_pin_configs,
1357	[STAC_9200_DELL_M22] = dell9200_m22_pin_configs,
1358	[STAC_9200_DELL_M23] = dell9200_m23_pin_configs,
1359	[STAC_9200_DELL_M24] = dell9200_m24_pin_configs,
1360	[STAC_9200_DELL_M25] = dell9200_m25_pin_configs,
1361	[STAC_9200_DELL_M26] = dell9200_m26_pin_configs,
1362	[STAC_9200_DELL_M27] = dell9200_m27_pin_configs,
1363	[STAC_9200_M4] = gateway9200_m4_pin_configs,
1364	[STAC_9200_M4_2] = gateway9200_m4_2_pin_configs,
1365	[STAC_9200_PANASONIC] = ref9200_pin_configs,
1366};
1367
1368static const char * const stac9200_models[STAC_9200_MODELS] = {
1369	[STAC_AUTO] = "auto",
1370	[STAC_REF] = "ref",
1371	[STAC_9200_OQO] = "oqo",
1372	[STAC_9200_DELL_D21] = "dell-d21",
1373	[STAC_9200_DELL_D22] = "dell-d22",
1374	[STAC_9200_DELL_D23] = "dell-d23",
1375	[STAC_9200_DELL_M21] = "dell-m21",
1376	[STAC_9200_DELL_M22] = "dell-m22",
1377	[STAC_9200_DELL_M23] = "dell-m23",
1378	[STAC_9200_DELL_M24] = "dell-m24",
1379	[STAC_9200_DELL_M25] = "dell-m25",
1380	[STAC_9200_DELL_M26] = "dell-m26",
1381	[STAC_9200_DELL_M27] = "dell-m27",
1382	[STAC_9200_M4] = "gateway-m4",
1383	[STAC_9200_M4_2] = "gateway-m4-2",
1384	[STAC_9200_PANASONIC] = "panasonic",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1385};
1386
1387static const struct snd_pci_quirk stac9200_cfg_tbl[] = {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1388	/* SigmaTel reference board */
1389	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1390		      "DFI LanParty", STAC_REF),
1391	SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
1392		      "DFI LanParty", STAC_REF),
1393	/* Dell laptops have BIOS problem */
1394	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a8,
1395		      "unknown Dell", STAC_9200_DELL_D21),
1396	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01b5,
1397		      "Dell Inspiron 630m", STAC_9200_DELL_M21),
1398	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01bd,
1399		      "Dell Inspiron E1505n", STAC_9200_DELL_M25),
1400	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c0,
1401		      "unknown Dell", STAC_9200_DELL_D22),
1402	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c1,
1403		      "unknown Dell", STAC_9200_DELL_D22),
1404	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c2,
1405		      "Dell Latitude D620", STAC_9200_DELL_M22),
1406	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c5,
1407		      "unknown Dell", STAC_9200_DELL_D23),
1408	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c7,
1409		      "unknown Dell", STAC_9200_DELL_D23),
1410	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c8,
1411		      "unknown Dell", STAC_9200_DELL_M22),
1412	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01c9,
1413		      "unknown Dell", STAC_9200_DELL_M24),
1414	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ca,
1415		      "unknown Dell", STAC_9200_DELL_M24),
1416	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cb,
1417		      "Dell Latitude 120L", STAC_9200_DELL_M24),
1418	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cc,
1419		      "Dell Latitude D820", STAC_9200_DELL_M22),
1420	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cd,
1421		      "Dell Inspiron E1705/9400", STAC_9200_DELL_M27),
1422	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ce,
1423		      "Dell XPS M1710", STAC_9200_DELL_M23),
1424	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cf,
1425		      "Dell Precision M90", STAC_9200_DELL_M23),
1426	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d3,
1427		      "unknown Dell", STAC_9200_DELL_M22),
1428	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d4,
1429		      "unknown Dell", STAC_9200_DELL_M22),
1430	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d6,
1431		      "unknown Dell", STAC_9200_DELL_M22),
1432	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d8,
1433		      "Dell Inspiron 640m", STAC_9200_DELL_M21),
1434	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d9,
1435		      "unknown Dell", STAC_9200_DELL_D23),
1436	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01da,
1437		      "unknown Dell", STAC_9200_DELL_D23),
1438	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01de,
1439		      "unknown Dell", STAC_9200_DELL_D21),
1440	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01e3,
1441		      "unknown Dell", STAC_9200_DELL_D23),
1442	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01e8,
1443		      "unknown Dell", STAC_9200_DELL_D21),
1444	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ee,
1445		      "unknown Dell", STAC_9200_DELL_M25),
1446	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ef,
1447		      "unknown Dell", STAC_9200_DELL_M25),
1448	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f5,
1449		      "Dell Inspiron 1501", STAC_9200_DELL_M26),
1450	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f6,
1451		      "unknown Dell", STAC_9200_DELL_M26),
 
 
1452	/* Panasonic */
1453	SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-74", STAC_9200_PANASONIC),
1454	/* Gateway machines needs EAPD to be set on resume */
1455	SND_PCI_QUIRK(0x107b, 0x0205, "Gateway S-7110M", STAC_9200_M4),
1456	SND_PCI_QUIRK(0x107b, 0x0317, "Gateway MT3423, MX341*", STAC_9200_M4_2),
1457	SND_PCI_QUIRK(0x107b, 0x0318, "Gateway ML3019, MT3707", STAC_9200_M4_2),
1458	/* OQO Mobile */
1459	SND_PCI_QUIRK(0x1106, 0x3288, "OQO Model 2", STAC_9200_OQO),
1460	{} /* terminator */
1461};
1462
1463static const unsigned int ref925x_pin_configs[8] = {
1464	0x40c003f0, 0x424503f2, 0x01813022, 0x02a19021,
1465	0x90a70320, 0x02214210, 0x01019020, 0x9033032e,
 
 
 
 
 
 
 
1466};
1467
1468static const unsigned int stac925xM1_pin_configs[8] = {
1469	0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
1470	0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e,
 
 
 
 
 
 
 
1471};
1472
1473static const unsigned int stac925xM1_2_pin_configs[8] = {
1474	0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
1475	0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e,
 
 
 
 
 
 
 
1476};
1477
1478static const unsigned int stac925xM2_pin_configs[8] = {
1479	0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
1480	0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e,
 
 
 
 
 
 
 
1481};
1482
1483static const unsigned int stac925xM2_2_pin_configs[8] = {
1484	0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
1485	0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e,
 
 
 
 
 
 
 
1486};
1487
1488static const unsigned int stac925xM3_pin_configs[8] = {
1489	0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
1490	0x40a000f0, 0x90100210, 0x400003f1, 0x503303f3,
 
 
 
 
 
 
 
1491};
1492
1493static const unsigned int stac925xM5_pin_configs[8] = {
1494	0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
1495	0x40a000f0, 0x90100210, 0x400003f1, 0x9033032e,
 
 
 
 
 
 
 
1496};
1497
1498static const unsigned int stac925xM6_pin_configs[8] = {
1499	0x40c003f4, 0x424503f2, 0x400000f3, 0x02a19020,
1500	0x40a000f0, 0x90100210, 0x400003f1, 0x90330320,
 
 
 
 
 
 
 
1501};
1502
1503static const unsigned int *stac925x_brd_tbl[STAC_925x_MODELS] = {
1504	[STAC_REF] = ref925x_pin_configs,
1505	[STAC_M1] = stac925xM1_pin_configs,
1506	[STAC_M1_2] = stac925xM1_2_pin_configs,
1507	[STAC_M2] = stac925xM2_pin_configs,
1508	[STAC_M2_2] = stac925xM2_2_pin_configs,
1509	[STAC_M3] = stac925xM3_pin_configs,
1510	[STAC_M5] = stac925xM5_pin_configs,
1511	[STAC_M6] = stac925xM6_pin_configs,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1512};
1513
1514static const char * const stac925x_models[STAC_925x_MODELS] = {
1515	[STAC_925x_AUTO] = "auto",
1516	[STAC_REF] = "ref",
1517	[STAC_M1] = "m1",
1518	[STAC_M1_2] = "m1-2",
1519	[STAC_M2] = "m2",
1520	[STAC_M2_2] = "m2-2",
1521	[STAC_M3] = "m3",
1522	[STAC_M5] = "m5",
1523	[STAC_M6] = "m6",
1524};
1525
1526static const struct snd_pci_quirk stac925x_codec_id_cfg_tbl[] = {
 
 
 
 
 
 
 
 
 
1527	SND_PCI_QUIRK(0x107b, 0x0316, "Gateway M255", STAC_M2),
1528	SND_PCI_QUIRK(0x107b, 0x0366, "Gateway MP6954", STAC_M5),
1529	SND_PCI_QUIRK(0x107b, 0x0461, "Gateway NX560XL", STAC_M1),
1530	SND_PCI_QUIRK(0x107b, 0x0681, "Gateway NX860", STAC_M2),
1531	SND_PCI_QUIRK(0x107b, 0x0367, "Gateway MX6453", STAC_M1_2),
1532	/* Not sure about the brand name for those */
1533	SND_PCI_QUIRK(0x107b, 0x0281, "Gateway mobile", STAC_M1),
1534	SND_PCI_QUIRK(0x107b, 0x0507, "Gateway mobile", STAC_M3),
1535	SND_PCI_QUIRK(0x107b, 0x0281, "Gateway mobile", STAC_M6),
1536	SND_PCI_QUIRK(0x107b, 0x0685, "Gateway mobile", STAC_M2_2),
1537	{} /* terminator */
1538};
1539
1540static const struct snd_pci_quirk stac925x_cfg_tbl[] = {
1541	/* SigmaTel reference board */
1542	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, "DFI LanParty", STAC_REF),
1543	SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101, "DFI LanParty", STAC_REF),
1544	SND_PCI_QUIRK(0x8384, 0x7632, "Stac9202 Reference Board", STAC_REF),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1545
1546	/* Default table for unknown ID */
1547	SND_PCI_QUIRK(0x1002, 0x437b, "Gateway mobile", STAC_M2_2),
1548
1549	{} /* terminator */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1550};
1551
1552static const unsigned int ref92hd73xx_pin_configs[13] = {
1553	0x02214030, 0x02a19040, 0x01a19020, 0x02214030,
1554	0x0181302e, 0x01014010, 0x01014020, 0x01014030,
1555	0x02319040, 0x90a000f0, 0x90a000f0, 0x01452050,
1556	0x01452050,
1557};
1558
1559static const unsigned int dell_m6_pin_configs[13] = {
1560	0x0321101f, 0x4f00000f, 0x4f0000f0, 0x90170110,
1561	0x03a11020, 0x0321101f, 0x4f0000f0, 0x4f0000f0,
1562	0x4f0000f0, 0x90a60160, 0x4f0000f0, 0x4f0000f0,
1563	0x4f0000f0,
1564};
1565
1566static const unsigned int alienware_m17x_pin_configs[13] = {
1567	0x0321101f, 0x0321101f, 0x03a11020, 0x03014020,
1568	0x90170110, 0x4f0000f0, 0x4f0000f0, 0x4f0000f0,
1569	0x4f0000f0, 0x90a60160, 0x4f0000f0, 0x4f0000f0,
1570	0x904601b0,
1571};
1572
1573static const unsigned int intel_dg45id_pin_configs[13] = {
1574	0x02214230, 0x02A19240, 0x01013214, 0x01014210,
1575	0x01A19250, 0x01011212, 0x01016211
1576};
1577
1578static const unsigned int *stac92hd73xx_brd_tbl[STAC_92HD73XX_MODELS] = {
1579	[STAC_92HD73XX_REF]	= ref92hd73xx_pin_configs,
1580	[STAC_DELL_M6_AMIC]	= dell_m6_pin_configs,
1581	[STAC_DELL_M6_DMIC]	= dell_m6_pin_configs,
1582	[STAC_DELL_M6_BOTH]	= dell_m6_pin_configs,
1583	[STAC_DELL_EQ]	= dell_m6_pin_configs,
1584	[STAC_ALIENWARE_M17X]	= alienware_m17x_pin_configs,
1585	[STAC_92HD73XX_INTEL]	= intel_dg45id_pin_configs,
1586};
1587
1588static const char * const stac92hd73xx_models[STAC_92HD73XX_MODELS] = {
1589	[STAC_92HD73XX_AUTO] = "auto",
1590	[STAC_92HD73XX_NO_JD] = "no-jd",
1591	[STAC_92HD73XX_REF] = "ref",
1592	[STAC_92HD73XX_INTEL] = "intel",
1593	[STAC_DELL_M6_AMIC] = "dell-m6-amic",
1594	[STAC_DELL_M6_DMIC] = "dell-m6-dmic",
1595	[STAC_DELL_M6_BOTH] = "dell-m6",
1596	[STAC_DELL_EQ] = "dell-eq",
1597	[STAC_ALIENWARE_M17X] = "alienware",
1598};
1599
1600static const struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = {
1601	/* SigmaTel reference board */
1602	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1603				"DFI LanParty", STAC_92HD73XX_REF),
1604	SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
1605				"DFI LanParty", STAC_92HD73XX_REF),
 
 
1606	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5002,
1607				"Intel DG45ID", STAC_92HD73XX_INTEL),
1608	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5003,
1609				"Intel DG45FC", STAC_92HD73XX_INTEL),
1610	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0254,
1611				"Dell Studio 1535", STAC_DELL_M6_DMIC),
1612	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0255,
1613				"unknown Dell", STAC_DELL_M6_DMIC),
1614	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0256,
1615				"unknown Dell", STAC_DELL_M6_BOTH),
1616	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0257,
1617				"unknown Dell", STAC_DELL_M6_BOTH),
1618	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x025e,
1619				"unknown Dell", STAC_DELL_M6_AMIC),
1620	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x025f,
1621				"unknown Dell", STAC_DELL_M6_AMIC),
1622	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0271,
1623				"unknown Dell", STAC_DELL_M6_DMIC),
1624	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0272,
1625				"unknown Dell", STAC_DELL_M6_DMIC),
1626	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x029f,
1627				"Dell Studio 1537", STAC_DELL_M6_DMIC),
1628	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02a0,
1629				"Dell Studio 17", STAC_DELL_M6_DMIC),
1630	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02be,
1631				"Dell Studio 1555", STAC_DELL_M6_DMIC),
1632	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02bd,
1633				"Dell Studio 1557", STAC_DELL_M6_DMIC),
1634	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02fe,
1635				"Dell Studio XPS 1645", STAC_DELL_M6_BOTH),
1636	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0413,
1637				"Dell Studio 1558", STAC_DELL_M6_DMIC),
1638	{} /* terminator */
1639};
1640
1641static const struct snd_pci_quirk stac92hd73xx_codec_id_cfg_tbl[] = {
1642	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02a1,
1643		      "Alienware M17x", STAC_ALIENWARE_M17X),
1644	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x043a,
1645		      "Alienware M17x", STAC_ALIENWARE_M17X),
 
 
 
 
 
 
 
 
 
 
1646	{} /* terminator */
1647};
1648
1649static const unsigned int ref92hd83xxx_pin_configs[10] = {
1650	0x02214030, 0x02211010, 0x02a19020, 0x02170130,
1651	0x01014050, 0x01819040, 0x01014020, 0x90a3014e,
1652	0x01451160, 0x98560170,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1653};
1654
1655static const unsigned int dell_s14_pin_configs[10] = {
1656	0x0221403f, 0x0221101f, 0x02a19020, 0x90170110,
1657	0x40f000f0, 0x40f000f0, 0x40f000f0, 0x90a60160,
1658	0x40f000f0, 0x40f000f0,
 
 
 
 
 
 
1659};
1660
1661static const unsigned int hp_dv7_4000_pin_configs[10] = {
1662	0x03a12050, 0x0321201f, 0x40f000f0, 0x90170110,
1663	0x40f000f0, 0x40f000f0, 0x90170110, 0xd5a30140,
1664	0x40f000f0, 0x40f000f0,
 
 
 
 
 
 
 
 
1665};
1666
1667static const unsigned int hp_cNB11_intquad_pin_configs[10] = {
1668	0x40f000f0, 0x0221101f, 0x02a11020, 0x92170110,
1669	0x40f000f0, 0x92170110, 0x40f000f0, 0xd5a30130,
1670	0x40f000f0, 0x40f000f0,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1671};
1672
1673static const unsigned int *stac92hd83xxx_brd_tbl[STAC_92HD83XXX_MODELS] = {
1674	[STAC_92HD83XXX_REF] = ref92hd83xxx_pin_configs,
1675	[STAC_92HD83XXX_PWR_REF] = ref92hd83xxx_pin_configs,
1676	[STAC_DELL_S14] = dell_s14_pin_configs,
1677	[STAC_92HD83XXX_HP_cNB11_INTQUAD] = hp_cNB11_intquad_pin_configs,
1678	[STAC_HP_DV7_4000] = hp_dv7_4000_pin_configs,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1679};
1680
1681static const char * const stac92hd83xxx_models[STAC_92HD83XXX_MODELS] = {
1682	[STAC_92HD83XXX_AUTO] = "auto",
1683	[STAC_92HD83XXX_REF] = "ref",
1684	[STAC_92HD83XXX_PWR_REF] = "mic-ref",
1685	[STAC_DELL_S14] = "dell-s14",
1686	[STAC_92HD83XXX_HP] = "hp",
1687	[STAC_92HD83XXX_HP_cNB11_INTQUAD] = "hp_cNB11_intquad",
1688	[STAC_HP_DV7_4000] = "hp-dv7-4000",
 
 
 
 
 
 
 
 
1689};
1690
1691static const struct snd_pci_quirk stac92hd83xxx_cfg_tbl[] = {
1692	/* SigmaTel reference board */
1693	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1694		      "DFI LanParty", STAC_92HD83XXX_REF),
1695	SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
1696		      "DFI LanParty", STAC_92HD83XXX_REF),
1697	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02ba,
1698		      "unknown Dell", STAC_DELL_S14),
1699	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xff00, 0x3600,
1700			  "HP", STAC_92HD83XXX_HP),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1701	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1656,
1702			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1703	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1657,
1704			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1705	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1658,
1706			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1707	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x1659,
1708			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1709	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x165A,
1710			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1711	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x165B,
1712			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1713	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3388,
1714			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1715	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3389,
1716			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1717	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x355B,
1718			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1719	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x355C,
1720			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1721	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x355D,
1722			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1723	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x355E,
1724			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1725	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x355F,
1726			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1727	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3560,
1728			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1729	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x358B,
1730			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1731	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x358C,
1732			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1733	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x358D,
1734			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1735	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3591,
1736			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1737	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3592,
1738			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
1739	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3593,
1740			  "HP", STAC_92HD83XXX_HP_cNB11_INTQUAD),
 
 
 
 
 
 
 
 
 
 
 
 
1741	{} /* terminator */
1742};
1743
1744static const unsigned int ref92hd71bxx_pin_configs[STAC92HD71BXX_NUM_PINS] = {
1745	0x02214030, 0x02a19040, 0x01a19020, 0x01014010,
1746	0x0181302e, 0x01014010, 0x01019020, 0x90a000f0,
1747	0x90a000f0, 0x01452050, 0x01452050, 0x00000000,
1748	0x00000000
1749};
1750
1751static const unsigned int dell_m4_1_pin_configs[STAC92HD71BXX_NUM_PINS] = {
1752	0x0421101f, 0x04a11221, 0x40f000f0, 0x90170110,
1753	0x23a1902e, 0x23014250, 0x40f000f0, 0x90a000f0,
1754	0x40f000f0, 0x4f0000f0, 0x4f0000f0, 0x00000000,
1755	0x00000000
1756};
1757
1758static const unsigned int dell_m4_2_pin_configs[STAC92HD71BXX_NUM_PINS] = {
1759	0x0421101f, 0x04a11221, 0x90a70330, 0x90170110,
1760	0x23a1902e, 0x23014250, 0x40f000f0, 0x40f000f0,
1761	0x40f000f0, 0x044413b0, 0x044413b0, 0x00000000,
1762	0x00000000
1763};
1764
1765static const unsigned int dell_m4_3_pin_configs[STAC92HD71BXX_NUM_PINS] = {
1766	0x0421101f, 0x04a11221, 0x90a70330, 0x90170110,
1767	0x40f000f0, 0x40f000f0, 0x40f000f0, 0x90a000f0,
1768	0x40f000f0, 0x044413b0, 0x044413b0, 0x00000000,
1769	0x00000000
1770};
1771
1772static const unsigned int *stac92hd71bxx_brd_tbl[STAC_92HD71BXX_MODELS] = {
1773	[STAC_92HD71BXX_REF] = ref92hd71bxx_pin_configs,
1774	[STAC_DELL_M4_1]	= dell_m4_1_pin_configs,
1775	[STAC_DELL_M4_2]	= dell_m4_2_pin_configs,
1776	[STAC_DELL_M4_3]	= dell_m4_3_pin_configs,
1777	[STAC_HP_M4]		= NULL,
1778	[STAC_HP_DV4]		= NULL,
1779	[STAC_HP_DV5]		= NULL,
1780	[STAC_HP_HDX]           = NULL,
1781	[STAC_HP_DV4_1222NR]	= NULL,
1782};
1783
1784static const char * const stac92hd71bxx_models[STAC_92HD71BXX_MODELS] = {
1785	[STAC_92HD71BXX_AUTO] = "auto",
1786	[STAC_92HD71BXX_REF] = "ref",
1787	[STAC_DELL_M4_1] = "dell-m4-1",
1788	[STAC_DELL_M4_2] = "dell-m4-2",
1789	[STAC_DELL_M4_3] = "dell-m4-3",
1790	[STAC_HP_M4] = "hp-m4",
1791	[STAC_HP_DV4] = "hp-dv4",
1792	[STAC_HP_DV5] = "hp-dv5",
1793	[STAC_HP_HDX] = "hp-hdx",
1794	[STAC_HP_DV4_1222NR] = "hp-dv4-1222nr",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1795};
1796
1797static const struct snd_pci_quirk stac92hd71bxx_cfg_tbl[] = {
1798	/* SigmaTel reference board */
1799	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
1800		      "DFI LanParty", STAC_92HD71BXX_REF),
1801	SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
1802		      "DFI LanParty", STAC_92HD71BXX_REF),
1803	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30fb,
1804		      "HP dv4-1222nr", STAC_HP_DV4_1222NR),
1805	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x1720,
1806			  "HP", STAC_HP_DV5),
1807	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3080,
1808		      "HP", STAC_HP_DV5),
1809	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x30f0,
1810		      "HP dv4-7", STAC_HP_DV4),
1811	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3600,
1812		      "HP dv4-7", STAC_HP_DV5),
1813	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3610,
1814		      "HP HDX", STAC_HP_HDX),  /* HDX18 */
1815	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361a,
1816		      "HP mini 1000", STAC_HP_M4),
1817	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361b,
1818		      "HP HDX", STAC_HP_HDX),  /* HDX16 */
1819	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3620,
1820		      "HP dv6", STAC_HP_DV5),
1821	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x3061,
1822		      "HP dv6", STAC_HP_DV5), /* HP dv6-1110ax */
1823	SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x363e,
1824		      "HP DV6", STAC_HP_DV5),
1825	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x7010,
1826		      "HP", STAC_HP_DV5),
 
1827	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0233,
1828				"unknown Dell", STAC_DELL_M4_1),
1829	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0234,
1830				"unknown Dell", STAC_DELL_M4_1),
1831	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0250,
1832				"unknown Dell", STAC_DELL_M4_1),
1833	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x024f,
1834				"unknown Dell", STAC_DELL_M4_1),
1835	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x024d,
1836				"unknown Dell", STAC_DELL_M4_1),
1837	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0251,
1838				"unknown Dell", STAC_DELL_M4_1),
1839	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0277,
1840				"unknown Dell", STAC_DELL_M4_1),
1841	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0263,
1842				"unknown Dell", STAC_DELL_M4_2),
1843	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0265,
1844				"unknown Dell", STAC_DELL_M4_2),
1845	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0262,
1846				"unknown Dell", STAC_DELL_M4_2),
1847	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0264,
1848				"unknown Dell", STAC_DELL_M4_2),
1849	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02aa,
1850				"unknown Dell", STAC_DELL_M4_3),
1851	{} /* terminator */
1852};
1853
1854static const unsigned int ref922x_pin_configs[10] = {
1855	0x01014010, 0x01016011, 0x01012012, 0x0221401f,
1856	0x01813122, 0x01011014, 0x01441030, 0x01c41030,
1857	0x40000100, 0x40000100,
 
 
 
 
 
 
 
 
1858};
1859
1860/*
1861    STAC 922X pin configs for
1862    102801A7
1863    102801AB
1864    102801A9
1865    102801D1
1866    102801D2
1867*/
1868static const unsigned int dell_922x_d81_pin_configs[10] = {
1869	0x02214030, 0x01a19021, 0x01111012, 0x01114010,
1870	0x02a19020, 0x01117011, 0x400001f0, 0x400001f1,
1871	0x01813122, 0x400001f2,
 
 
 
 
 
 
 
 
1872};
1873
1874/*
1875    STAC 922X pin configs for
1876    102801AC
1877    102801D0
1878*/
1879static const unsigned int dell_922x_d82_pin_configs[10] = {
1880	0x02214030, 0x01a19021, 0x01111012, 0x01114010,
1881	0x02a19020, 0x01117011, 0x01451140, 0x400001f0,
1882	0x01813122, 0x400001f1,
 
 
 
 
 
 
 
 
1883};
1884
1885/*
1886    STAC 922X pin configs for
1887    102801BF
1888*/
1889static const unsigned int dell_922x_m81_pin_configs[10] = {
1890	0x0321101f, 0x01112024, 0x01111222, 0x91174220,
1891	0x03a11050, 0x01116221, 0x90a70330, 0x01452340, 
1892	0x40C003f1, 0x405003f0,
 
 
 
 
 
 
 
 
1893};
1894
1895/*
1896    STAC 9221 A1 pin configs for
1897    102801D7 (Dell XPS M1210)
1898*/
1899static const unsigned int dell_922x_m82_pin_configs[10] = {
1900	0x02211211, 0x408103ff, 0x02a1123e, 0x90100310, 
1901	0x408003f1, 0x0221121f, 0x03451340, 0x40c003f2, 
1902	0x508003f3, 0x405003f4, 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1903};
1904
1905static const unsigned int d945gtp3_pin_configs[10] = {
1906	0x0221401f, 0x01a19022, 0x01813021, 0x01014010,
1907	0x40000100, 0x40000100, 0x40000100, 0x40000100,
1908	0x02a19120, 0x40000100,
 
 
 
 
 
 
 
 
1909};
1910
1911static const unsigned int d945gtp5_pin_configs[10] = {
1912	0x0221401f, 0x01011012, 0x01813024, 0x01014010,
1913	0x01a19021, 0x01016011, 0x01452130, 0x40000100,
1914	0x02a19320, 0x40000100,
 
 
 
 
 
 
 
 
1915};
1916
1917static const unsigned int intel_mac_v1_pin_configs[10] = {
1918	0x0121e21f, 0x400000ff, 0x9017e110, 0x400000fd,
1919	0x400000fe, 0x0181e020, 0x1145e030, 0x11c5e240,
1920	0x400000fc, 0x400000fb,
 
 
 
 
 
 
 
 
1921};
1922
1923static const unsigned int intel_mac_v2_pin_configs[10] = {
1924	0x0121e21f, 0x90a7012e, 0x9017e110, 0x400000fd,
1925	0x400000fe, 0x0181e020, 0x1145e230, 0x500000fa,
1926	0x400000fc, 0x400000fb,
 
 
 
 
 
 
 
 
1927};
1928
1929static const unsigned int intel_mac_v3_pin_configs[10] = {
1930	0x0121e21f, 0x90a7012e, 0x9017e110, 0x400000fd,
1931	0x400000fe, 0x0181e020, 0x1145e230, 0x11c5e240,
1932	0x400000fc, 0x400000fb,
 
 
 
 
 
 
 
 
1933};
1934
1935static const unsigned int intel_mac_v4_pin_configs[10] = {
1936	0x0321e21f, 0x03a1e02e, 0x9017e110, 0x9017e11f,
1937	0x400000fe, 0x0381e020, 0x1345e230, 0x13c5e240,
1938	0x400000fc, 0x400000fb,
 
 
 
 
 
 
 
 
1939};
1940
1941static const unsigned int intel_mac_v5_pin_configs[10] = {
1942	0x0321e21f, 0x03a1e02e, 0x9017e110, 0x9017e11f,
1943	0x400000fe, 0x0381e020, 0x1345e230, 0x13c5e240,
1944	0x400000fc, 0x400000fb,
 
 
 
 
 
 
 
 
 
 
 
 
1945};
1946
1947static const unsigned int ecs202_pin_configs[10] = {
1948	0x0221401f, 0x02a19020, 0x01a19020, 0x01114010,
1949	0x408000f0, 0x01813022, 0x074510a0, 0x40c400f1,
1950	0x9037012e, 0x40e000f2,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1951};
1952
1953static const unsigned int *stac922x_brd_tbl[STAC_922X_MODELS] = {
1954	[STAC_D945_REF] = ref922x_pin_configs,
1955	[STAC_D945GTP3] = d945gtp3_pin_configs,
1956	[STAC_D945GTP5] = d945gtp5_pin_configs,
1957	[STAC_INTEL_MAC_V1] = intel_mac_v1_pin_configs,
1958	[STAC_INTEL_MAC_V2] = intel_mac_v2_pin_configs,
1959	[STAC_INTEL_MAC_V3] = intel_mac_v3_pin_configs,
1960	[STAC_INTEL_MAC_V4] = intel_mac_v4_pin_configs,
1961	[STAC_INTEL_MAC_V5] = intel_mac_v5_pin_configs,
1962	[STAC_INTEL_MAC_AUTO] = intel_mac_v3_pin_configs,
 
 
 
 
 
1963	/* for backward compatibility */
1964	[STAC_MACMINI] = intel_mac_v3_pin_configs,
1965	[STAC_MACBOOK] = intel_mac_v5_pin_configs,
1966	[STAC_MACBOOK_PRO_V1] = intel_mac_v3_pin_configs,
1967	[STAC_MACBOOK_PRO_V2] = intel_mac_v3_pin_configs,
1968	[STAC_IMAC_INTEL] = intel_mac_v2_pin_configs,
1969	[STAC_IMAC_INTEL_20] = intel_mac_v3_pin_configs,
1970	[STAC_ECS_202] = ecs202_pin_configs,
1971	[STAC_922X_DELL_D81] = dell_922x_d81_pin_configs,
1972	[STAC_922X_DELL_D82] = dell_922x_d82_pin_configs,	
1973	[STAC_922X_DELL_M81] = dell_922x_m81_pin_configs,
1974	[STAC_922X_DELL_M82] = dell_922x_m82_pin_configs,	
1975};
1976
1977static const char * const stac922x_models[STAC_922X_MODELS] = {
1978	[STAC_922X_AUTO] = "auto",
1979	[STAC_D945_REF]	= "ref",
1980	[STAC_D945GTP5]	= "5stack",
1981	[STAC_D945GTP3]	= "3stack",
1982	[STAC_INTEL_MAC_V1] = "intel-mac-v1",
1983	[STAC_INTEL_MAC_V2] = "intel-mac-v2",
1984	[STAC_INTEL_MAC_V3] = "intel-mac-v3",
1985	[STAC_INTEL_MAC_V4] = "intel-mac-v4",
1986	[STAC_INTEL_MAC_V5] = "intel-mac-v5",
1987	[STAC_INTEL_MAC_AUTO] = "intel-mac-auto",
1988	/* for backward compatibility */
1989	[STAC_MACMINI]	= "macmini",
1990	[STAC_MACBOOK]	= "macbook",
1991	[STAC_MACBOOK_PRO_V1]	= "macbook-pro-v1",
1992	[STAC_MACBOOK_PRO_V2]	= "macbook-pro",
1993	[STAC_IMAC_INTEL] = "imac-intel",
1994	[STAC_IMAC_INTEL_20] = "imac-intel-20",
1995	[STAC_ECS_202] = "ecs202",
1996	[STAC_922X_DELL_D81] = "dell-d81",
1997	[STAC_922X_DELL_D82] = "dell-d82",
1998	[STAC_922X_DELL_M81] = "dell-m81",
1999	[STAC_922X_DELL_M82] = "dell-m82",
2000};
2001
2002static const struct snd_pci_quirk stac922x_cfg_tbl[] = {
2003	/* SigmaTel reference board */
2004	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
2005		      "DFI LanParty", STAC_D945_REF),
2006	SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
2007		      "DFI LanParty", STAC_D945_REF),
2008	/* Intel 945G based systems */
2009	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0101,
2010		      "Intel D945G", STAC_D945GTP3),
2011	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0202,
2012		      "Intel D945G", STAC_D945GTP3),
2013	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0606,
2014		      "Intel D945G", STAC_D945GTP3),
2015	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0601,
2016		      "Intel D945G", STAC_D945GTP3),
2017	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0111,
2018		      "Intel D945G", STAC_D945GTP3),
2019	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1115,
2020		      "Intel D945G", STAC_D945GTP3),
2021	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1116,
2022		      "Intel D945G", STAC_D945GTP3),
2023	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1117,
2024		      "Intel D945G", STAC_D945GTP3),
2025	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1118,
2026		      "Intel D945G", STAC_D945GTP3),
2027	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x1119,
2028		      "Intel D945G", STAC_D945GTP3),
2029	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x8826,
2030		      "Intel D945G", STAC_D945GTP3),
2031	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5049,
2032		      "Intel D945G", STAC_D945GTP3),
2033	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5055,
2034		      "Intel D945G", STAC_D945GTP3),
2035	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5048,
2036		      "Intel D945G", STAC_D945GTP3),
2037	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0110,
2038		      "Intel D945G", STAC_D945GTP3),
2039	/* Intel D945G 5-stack systems */
2040	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0404,
2041		      "Intel D945G", STAC_D945GTP5),
2042	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0303,
2043		      "Intel D945G", STAC_D945GTP5),
2044	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0013,
2045		      "Intel D945G", STAC_D945GTP5),
2046	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0417,
2047		      "Intel D945G", STAC_D945GTP5),
2048	/* Intel 945P based systems */
2049	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0b0b,
2050		      "Intel D945P", STAC_D945GTP3),
2051	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0112,
2052		      "Intel D945P", STAC_D945GTP3),
2053	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0d0d,
2054		      "Intel D945P", STAC_D945GTP3),
2055	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0909,
2056		      "Intel D945P", STAC_D945GTP3),
2057	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0505,
2058		      "Intel D945P", STAC_D945GTP3),
2059	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0707,
2060		      "Intel D945P", STAC_D945GTP5),
2061	/* other intel */
2062	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0204,
2063		      "Intel D945", STAC_D945_REF),
2064	/* other systems  */
 
2065	/* Apple Intel Mac (Mac Mini, MacBook, MacBook Pro...) */
2066	SND_PCI_QUIRK(0x8384, 0x7680,
2067		      "Mac", STAC_INTEL_MAC_AUTO),
2068	/* Dell systems  */
2069	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a7,
2070		      "unknown Dell", STAC_922X_DELL_D81),
2071	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a9,
2072		      "unknown Dell", STAC_922X_DELL_D81),
2073	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ab,
2074		      "unknown Dell", STAC_922X_DELL_D81),
2075	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ac,
2076		      "unknown Dell", STAC_922X_DELL_D82),
2077	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01bf,
2078		      "unknown Dell", STAC_922X_DELL_M81),
2079	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d0,
2080		      "unknown Dell", STAC_922X_DELL_D82),
2081	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d1,
2082		      "unknown Dell", STAC_922X_DELL_D81),
2083	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d2,
2084		      "unknown Dell", STAC_922X_DELL_D81),
2085	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d7,
2086		      "Dell XPS M1210", STAC_922X_DELL_M82),
2087	/* ECS/PC Chips boards */
2088	SND_PCI_QUIRK_MASK(0x1019, 0xf000, 0x2000,
2089		      "ECS/PC chips", STAC_ECS_202),
2090	{} /* terminator */
2091};
2092
2093static const unsigned int ref927x_pin_configs[14] = {
2094	0x02214020, 0x02a19080, 0x0181304e, 0x01014010,
2095	0x01a19040, 0x01011012, 0x01016011, 0x0101201f, 
2096	0x183301f0, 0x18a001f0, 0x18a001f0, 0x01442070,
2097	0x01c42190, 0x40000100,
2098};
2099
2100static const unsigned int d965_3st_pin_configs[14] = {
2101	0x0221401f, 0x02a19120, 0x40000100, 0x01014011,
2102	0x01a19021, 0x01813024, 0x40000100, 0x40000100,
2103	0x40000100, 0x40000100, 0x40000100, 0x40000100,
2104	0x40000100, 0x40000100
2105};
2106
2107static const unsigned int d965_5st_pin_configs[14] = {
2108	0x02214020, 0x02a19080, 0x0181304e, 0x01014010,
2109	0x01a19040, 0x01011012, 0x01016011, 0x40000100,
2110	0x40000100, 0x40000100, 0x40000100, 0x01442070,
2111	0x40000100, 0x40000100
2112};
2113
2114static const unsigned int d965_5st_no_fp_pin_configs[14] = {
2115	0x40000100, 0x40000100, 0x0181304e, 0x01014010,
2116	0x01a19040, 0x01011012, 0x01016011, 0x40000100,
2117	0x40000100, 0x40000100, 0x40000100, 0x01442070,
2118	0x40000100, 0x40000100
2119};
2120
2121static const unsigned int dell_3st_pin_configs[14] = {
2122	0x02211230, 0x02a11220, 0x01a19040, 0x01114210,
2123	0x01111212, 0x01116211, 0x01813050, 0x01112214,
2124	0x403003fa, 0x90a60040, 0x90a60040, 0x404003fb,
2125	0x40c003fc, 0x40000100
2126};
2127
2128static const unsigned int *stac927x_brd_tbl[STAC_927X_MODELS] = {
2129	[STAC_D965_REF_NO_JD] = ref927x_pin_configs,
2130	[STAC_D965_REF]  = ref927x_pin_configs,
2131	[STAC_D965_3ST]  = d965_3st_pin_configs,
2132	[STAC_D965_5ST]  = d965_5st_pin_configs,
2133	[STAC_D965_5ST_NO_FP]  = d965_5st_no_fp_pin_configs,
2134	[STAC_DELL_3ST]  = dell_3st_pin_configs,
2135	[STAC_DELL_BIOS] = NULL,
2136	[STAC_927X_VOLKNOB] = NULL,
2137};
2138
2139static const char * const stac927x_models[STAC_927X_MODELS] = {
2140	[STAC_927X_AUTO]	= "auto",
2141	[STAC_D965_REF_NO_JD]	= "ref-no-jd",
2142	[STAC_D965_REF]		= "ref",
2143	[STAC_D965_3ST]		= "3stack",
2144	[STAC_D965_5ST]		= "5stack",
2145	[STAC_D965_5ST_NO_FP]	= "5stack-no-fp",
2146	[STAC_DELL_3ST]		= "dell-3stack",
2147	[STAC_DELL_BIOS]	= "dell-bios",
2148	[STAC_927X_VOLKNOB]	= "volknob",
2149};
2150
2151static const struct snd_pci_quirk stac927x_cfg_tbl[] = {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2152	/* SigmaTel reference board */
2153	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
2154		      "DFI LanParty", STAC_D965_REF),
2155	SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
2156		      "DFI LanParty", STAC_D965_REF),
2157	 /* Intel 946 based systems */
2158	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x3d01, "Intel D946", STAC_D965_3ST),
2159	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0xa301, "Intel D946", STAC_D965_3ST),
2160	/* 965 based 3 stack systems */
2161	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2100,
2162			   "Intel D965", STAC_D965_3ST),
2163	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2000,
2164			   "Intel D965", STAC_D965_3ST),
2165	/* Dell 3 stack systems */
2166	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x01dd, "Dell Dimension E520", STAC_DELL_3ST),
2167	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x01ed, "Dell     ", STAC_DELL_3ST),
2168	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x01f4, "Dell     ", STAC_DELL_3ST),
2169	/* Dell 3 stack systems with verb table in BIOS */
2170	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x01f3, "Dell Inspiron 1420", STAC_DELL_BIOS),
2171	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x01f7, "Dell XPS M1730", STAC_DELL_BIOS),
2172	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x0227, "Dell Vostro 1400  ", STAC_DELL_BIOS),
2173	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x022e, "Dell     ", STAC_DELL_BIOS),
2174	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x022f, "Dell Inspiron 1525", STAC_DELL_BIOS),
2175	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x0242, "Dell     ", STAC_DELL_BIOS),
2176	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x0243, "Dell     ", STAC_DELL_BIOS),
2177	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x02ff, "Dell     ", STAC_DELL_BIOS),
2178	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x0209, "Dell XPS 1330", STAC_DELL_BIOS),
2179	/* 965 based 5 stack systems */
2180	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2300,
2181			   "Intel D965", STAC_D965_5ST),
2182	SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2500,
2183			   "Intel D965", STAC_D965_5ST),
 
 
2184	/* volume-knob fixes */
2185	SND_PCI_QUIRK_VENDOR(0x10cf, "FSC", STAC_927X_VOLKNOB),
2186	{} /* terminator */
2187};
2188
2189static const unsigned int ref9205_pin_configs[12] = {
2190	0x40000100, 0x40000100, 0x01016011, 0x01014010,
2191	0x01813122, 0x01a19021, 0x01019020, 0x40000100,
2192	0x90a000f0, 0x90a000f0, 0x01441030, 0x01c41030
 
 
 
 
 
 
 
 
 
 
2193};
2194
2195/*
2196    STAC 9205 pin configs for
2197    102801F1
2198    102801F2
2199    102801FC
2200    102801FD
2201    10280204
2202    1028021F
2203    10280228 (Dell Vostro 1500)
2204    10280229 (Dell Vostro 1700)
2205*/
2206static const unsigned int dell_9205_m42_pin_configs[12] = {
2207	0x0321101F, 0x03A11020, 0x400003FA, 0x90170310,
2208	0x400003FB, 0x400003FC, 0x400003FD, 0x40F000F9,
2209	0x90A60330, 0x400003FF, 0x0144131F, 0x40C003FE,
 
 
 
 
 
 
 
 
 
 
2210};
2211
2212/*
2213    STAC 9205 pin configs for
2214    102801F9
2215    102801FA
2216    102801FE
2217    102801FF (Dell Precision M4300)
2218    10280206
2219    10280200
2220    10280201
2221*/
2222static const unsigned int dell_9205_m43_pin_configs[12] = {
2223	0x0321101f, 0x03a11020, 0x90a70330, 0x90170310,
2224	0x400000fe, 0x400000ff, 0x400000fd, 0x40f000f9,
2225	0x400000fa, 0x400000fc, 0x0144131f, 0x40c003f8,
 
 
 
 
 
 
 
 
 
 
 
 
 
2226};
2227
2228static const unsigned int dell_9205_m44_pin_configs[12] = {
2229	0x0421101f, 0x04a11020, 0x400003fa, 0x90170310,
2230	0x400003fb, 0x400003fc, 0x400003fd, 0x400003f9,
2231	0x90a60330, 0x400003ff, 0x01441340, 0x40c003fe,
 
 
 
 
 
 
 
 
 
 
2232};
2233
2234static const unsigned int *stac9205_brd_tbl[STAC_9205_MODELS] = {
2235	[STAC_9205_REF] = ref9205_pin_configs,
2236	[STAC_9205_DELL_M42] = dell_9205_m42_pin_configs,
2237	[STAC_9205_DELL_M43] = dell_9205_m43_pin_configs,
2238	[STAC_9205_DELL_M44] = dell_9205_m44_pin_configs,
2239	[STAC_9205_EAPD] = NULL,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2240};
2241
2242static const char * const stac9205_models[STAC_9205_MODELS] = {
2243	[STAC_9205_AUTO] = "auto",
2244	[STAC_9205_REF] = "ref",
2245	[STAC_9205_DELL_M42] = "dell-m42",
2246	[STAC_9205_DELL_M43] = "dell-m43",
2247	[STAC_9205_DELL_M44] = "dell-m44",
2248	[STAC_9205_EAPD] = "eapd",
2249};
2250
2251static const struct snd_pci_quirk stac9205_cfg_tbl[] = {
2252	/* SigmaTel reference board */
2253	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
2254		      "DFI LanParty", STAC_9205_REF),
2255	SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0xfb30,
2256		      "SigmaTel", STAC_9205_REF),
2257	SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
2258		      "DFI LanParty", STAC_9205_REF),
2259	/* Dell */
2260	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f1,
2261		      "unknown Dell", STAC_9205_DELL_M42),
2262	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f2,
2263		      "unknown Dell", STAC_9205_DELL_M42),
2264	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f8,
2265		      "Dell Precision", STAC_9205_DELL_M43),
2266	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f9,
2267		      "Dell Precision", STAC_9205_DELL_M43),
2268	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fa,
2269		      "Dell Precision", STAC_9205_DELL_M43),
2270	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fc,
2271		      "unknown Dell", STAC_9205_DELL_M42),
2272	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fd,
2273		      "unknown Dell", STAC_9205_DELL_M42),
2274	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01fe,
2275		      "Dell Precision", STAC_9205_DELL_M43),
2276	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ff,
2277		      "Dell Precision M4300", STAC_9205_DELL_M43),
2278	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0204,
2279		      "unknown Dell", STAC_9205_DELL_M42),
2280	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0206,
2281		      "Dell Precision", STAC_9205_DELL_M43),
2282	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021b,
2283		      "Dell Precision", STAC_9205_DELL_M43),
2284	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021c,
2285		      "Dell Precision", STAC_9205_DELL_M43),
2286	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x021f,
2287		      "Dell Inspiron", STAC_9205_DELL_M44),
2288	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0228,
2289		      "Dell Vostro 1500", STAC_9205_DELL_M42),
2290	SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0229,
2291		      "Dell Vostro 1700", STAC_9205_DELL_M42),
2292	/* Gateway */
2293	SND_PCI_QUIRK(0x107b, 0x0560, "Gateway T6834c", STAC_9205_EAPD),
2294	SND_PCI_QUIRK(0x107b, 0x0565, "Gateway T1616", STAC_9205_EAPD),
2295	{} /* terminator */
2296};
2297
2298static void stac92xx_set_config_regs(struct hda_codec *codec,
2299				     const unsigned int *pincfgs)
2300{
2301	int i;
2302	struct sigmatel_spec *spec = codec->spec;
2303
2304	if (!pincfgs)
2305		return;
2306
2307	for (i = 0; i < spec->num_pins; i++)
2308		if (spec->pin_nids[i] && pincfgs[i])
2309			snd_hda_codec_set_pincfg(codec, spec->pin_nids[i],
2310						 pincfgs[i]);
2311}
2312
2313/*
2314 * Analog playback callbacks
2315 */
2316static int stac92xx_playback_pcm_open(struct hda_pcm_stream *hinfo,
2317				      struct hda_codec *codec,
2318				      struct snd_pcm_substream *substream)
2319{
2320	struct sigmatel_spec *spec = codec->spec;
2321	if (spec->stream_delay)
2322		msleep(spec->stream_delay);
2323	return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
2324					     hinfo);
2325}
2326
2327static int stac92xx_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
2328					 struct hda_codec *codec,
2329					 unsigned int stream_tag,
2330					 unsigned int format,
2331					 struct snd_pcm_substream *substream)
2332{
2333	struct sigmatel_spec *spec = codec->spec;
2334	return snd_hda_multi_out_analog_prepare(codec, &spec->multiout, stream_tag, format, substream);
2335}
2336
2337static int stac92xx_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
2338					struct hda_codec *codec,
2339					struct snd_pcm_substream *substream)
2340{
2341	struct sigmatel_spec *spec = codec->spec;
2342	return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
2343}
2344
2345/*
2346 * Digital playback callbacks
2347 */
2348static int stac92xx_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
2349					  struct hda_codec *codec,
2350					  struct snd_pcm_substream *substream)
2351{
2352	struct sigmatel_spec *spec = codec->spec;
2353	return snd_hda_multi_out_dig_open(codec, &spec->multiout);
2354}
2355
2356static int stac92xx_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
2357					   struct hda_codec *codec,
2358					   struct snd_pcm_substream *substream)
2359{
2360	struct sigmatel_spec *spec = codec->spec;
2361	return snd_hda_multi_out_dig_close(codec, &spec->multiout);
2362}
2363
2364static int stac92xx_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
2365					 struct hda_codec *codec,
2366					 unsigned int stream_tag,
2367					 unsigned int format,
2368					 struct snd_pcm_substream *substream)
2369{
2370	struct sigmatel_spec *spec = codec->spec;
2371	return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
2372					     stream_tag, format, substream);
2373}
2374
2375static int stac92xx_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
2376					struct hda_codec *codec,
2377					struct snd_pcm_substream *substream)
2378{
2379	struct sigmatel_spec *spec = codec->spec;
2380	return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
2381}
2382
2383
2384/*
2385 * Analog capture callbacks
2386 */
2387static int stac92xx_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
2388					struct hda_codec *codec,
2389					unsigned int stream_tag,
2390					unsigned int format,
2391					struct snd_pcm_substream *substream)
2392{
2393	struct sigmatel_spec *spec = codec->spec;
2394	hda_nid_t nid = spec->adc_nids[substream->number];
2395
2396	if (spec->powerdown_adcs) {
2397		msleep(40);
2398		snd_hda_codec_write(codec, nid, 0,
2399			AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
2400	}
2401	snd_hda_codec_setup_stream(codec, nid, stream_tag, 0, format);
2402	return 0;
2403}
2404
2405static int stac92xx_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
2406					struct hda_codec *codec,
2407					struct snd_pcm_substream *substream)
2408{
2409	struct sigmatel_spec *spec = codec->spec;
2410	hda_nid_t nid = spec->adc_nids[substream->number];
2411
2412	snd_hda_codec_cleanup_stream(codec, nid);
2413	if (spec->powerdown_adcs)
2414		snd_hda_codec_write(codec, nid, 0,
2415			AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
2416	return 0;
2417}
2418
2419static const struct hda_pcm_stream stac92xx_pcm_digital_playback = {
2420	.substreams = 1,
2421	.channels_min = 2,
2422	.channels_max = 2,
2423	/* NID is set in stac92xx_build_pcms */
2424	.ops = {
2425		.open = stac92xx_dig_playback_pcm_open,
2426		.close = stac92xx_dig_playback_pcm_close,
2427		.prepare = stac92xx_dig_playback_pcm_prepare,
2428		.cleanup = stac92xx_dig_playback_pcm_cleanup
2429	},
2430};
2431
2432static const struct hda_pcm_stream stac92xx_pcm_digital_capture = {
2433	.substreams = 1,
2434	.channels_min = 2,
2435	.channels_max = 2,
2436	/* NID is set in stac92xx_build_pcms */
2437};
2438
2439static const struct hda_pcm_stream stac92xx_pcm_analog_playback = {
2440	.substreams = 1,
2441	.channels_min = 2,
2442	.channels_max = 8,
2443	.nid = 0x02, /* NID to query formats and rates */
2444	.ops = {
2445		.open = stac92xx_playback_pcm_open,
2446		.prepare = stac92xx_playback_pcm_prepare,
2447		.cleanup = stac92xx_playback_pcm_cleanup
2448	},
2449};
2450
2451static const struct hda_pcm_stream stac92xx_pcm_analog_alt_playback = {
2452	.substreams = 1,
2453	.channels_min = 2,
2454	.channels_max = 2,
2455	.nid = 0x06, /* NID to query formats and rates */
2456	.ops = {
2457		.open = stac92xx_playback_pcm_open,
2458		.prepare = stac92xx_playback_pcm_prepare,
2459		.cleanup = stac92xx_playback_pcm_cleanup
2460	},
2461};
2462
2463static const struct hda_pcm_stream stac92xx_pcm_analog_capture = {
2464	.channels_min = 2,
2465	.channels_max = 2,
2466	/* NID + .substreams is set in stac92xx_build_pcms */
2467	.ops = {
2468		.prepare = stac92xx_capture_pcm_prepare,
2469		.cleanup = stac92xx_capture_pcm_cleanup
2470	},
2471};
2472
2473static int stac92xx_build_pcms(struct hda_codec *codec)
2474{
2475	struct sigmatel_spec *spec = codec->spec;
2476	struct hda_pcm *info = spec->pcm_rec;
2477
2478	codec->num_pcms = 1;
2479	codec->pcm_info = info;
2480
2481	info->name = "STAC92xx Analog";
2482	info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_analog_playback;
2483	info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
2484		spec->multiout.dac_nids[0];
2485	info->stream[SNDRV_PCM_STREAM_CAPTURE] = stac92xx_pcm_analog_capture;
2486	info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
2487	info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = spec->num_adcs;
2488
2489	if (spec->alt_switch) {
2490		codec->num_pcms++;
2491		info++;
2492		info->name = "STAC92xx Analog Alt";
2493		info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_analog_alt_playback;
2494	}
2495
2496	if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
2497		codec->num_pcms++;
2498		info++;
2499		info->name = "STAC92xx Digital";
2500		info->pcm_type = spec->autocfg.dig_out_type[0];
2501		if (spec->multiout.dig_out_nid) {
2502			info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_digital_playback;
2503			info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
2504		}
2505		if (spec->dig_in_nid) {
2506			info->stream[SNDRV_PCM_STREAM_CAPTURE] = stac92xx_pcm_digital_capture;
2507			info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
2508		}
2509	}
2510
2511	return 0;
2512}
2513
2514static unsigned int stac92xx_get_default_vref(struct hda_codec *codec,
2515					hda_nid_t nid)
2516{
2517	unsigned int pincap = snd_hda_query_pin_caps(codec, nid);
2518	pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
2519	if (pincap & AC_PINCAP_VREF_100)
2520		return AC_PINCTL_VREF_100;
2521	if (pincap & AC_PINCAP_VREF_80)
2522		return AC_PINCTL_VREF_80;
2523	if (pincap & AC_PINCAP_VREF_50)
2524		return AC_PINCTL_VREF_50;
2525	if (pincap & AC_PINCAP_VREF_GRD)
2526		return AC_PINCTL_VREF_GRD;
2527	return 0;
2528}
2529
2530static void stac92xx_auto_set_pinctl(struct hda_codec *codec, hda_nid_t nid, int pin_type)
2531
2532{
2533	snd_hda_codec_write_cache(codec, nid, 0,
2534				  AC_VERB_SET_PIN_WIDGET_CONTROL, pin_type);
2535}
2536
2537#define stac92xx_hp_switch_info		snd_ctl_boolean_mono_info
2538
2539static int stac92xx_hp_switch_get(struct snd_kcontrol *kcontrol,
2540			struct snd_ctl_elem_value *ucontrol)
2541{
2542	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2543	struct sigmatel_spec *spec = codec->spec;
2544
2545	ucontrol->value.integer.value[0] = !!spec->hp_switch;
2546	return 0;
2547}
2548
2549static void stac_issue_unsol_event(struct hda_codec *codec, hda_nid_t nid);
2550
2551static int stac92xx_hp_switch_put(struct snd_kcontrol *kcontrol,
2552			struct snd_ctl_elem_value *ucontrol)
2553{
2554	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2555	struct sigmatel_spec *spec = codec->spec;
2556	int nid = kcontrol->private_value;
2557 
2558	spec->hp_switch = ucontrol->value.integer.value[0] ? nid : 0;
2559
2560	/* check to be sure that the ports are up to date with
2561	 * switch changes
2562	 */
2563	stac_issue_unsol_event(codec, nid);
2564
2565	return 1;
2566}
2567
2568static int stac92xx_dc_bias_info(struct snd_kcontrol *kcontrol,
2569				struct snd_ctl_elem_info *uinfo)
2570{
2571	int i;
2572	static const char * const texts[] = {
2573		"Mic In", "Line In", "Line Out"
2574	};
2575
2576	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2577	struct sigmatel_spec *spec = codec->spec;
2578	hda_nid_t nid = kcontrol->private_value;
2579
2580	if (nid == spec->mic_switch || nid == spec->line_switch)
2581		i = 3;
2582	else
2583		i = 2;
2584
2585	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2586	uinfo->value.enumerated.items = i;
2587	uinfo->count = 1;
2588	if (uinfo->value.enumerated.item >= i)
2589		uinfo->value.enumerated.item = i-1;
2590	strcpy(uinfo->value.enumerated.name,
2591		texts[uinfo->value.enumerated.item]);
2592
2593	return 0;
2594}
2595
2596static int stac92xx_dc_bias_get(struct snd_kcontrol *kcontrol,
2597				struct snd_ctl_elem_value *ucontrol)
2598{
2599	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2600	hda_nid_t nid = kcontrol->private_value;
2601	unsigned int vref = stac92xx_vref_get(codec, nid);
2602
2603	if (vref == stac92xx_get_default_vref(codec, nid))
2604		ucontrol->value.enumerated.item[0] = 0;
2605	else if (vref == AC_PINCTL_VREF_GRD)
2606		ucontrol->value.enumerated.item[0] = 1;
2607	else if (vref == AC_PINCTL_VREF_HIZ)
2608		ucontrol->value.enumerated.item[0] = 2;
2609
2610	return 0;
2611}
2612
2613static int stac92xx_dc_bias_put(struct snd_kcontrol *kcontrol,
2614				struct snd_ctl_elem_value *ucontrol)
2615{
2616	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2617	unsigned int new_vref = 0;
2618	int error;
2619	hda_nid_t nid = kcontrol->private_value;
2620
2621	if (ucontrol->value.enumerated.item[0] == 0)
2622		new_vref = stac92xx_get_default_vref(codec, nid);
2623	else if (ucontrol->value.enumerated.item[0] == 1)
2624		new_vref = AC_PINCTL_VREF_GRD;
2625	else if (ucontrol->value.enumerated.item[0] == 2)
2626		new_vref = AC_PINCTL_VREF_HIZ;
2627	else
2628		return 0;
2629
2630	if (new_vref != stac92xx_vref_get(codec, nid)) {
2631		error = stac92xx_vref_set(codec, nid, new_vref);
2632		return error;
2633	}
2634
2635	return 0;
2636}
2637
2638static int stac92xx_io_switch_info(struct snd_kcontrol *kcontrol,
2639				struct snd_ctl_elem_info *uinfo)
2640{
2641	char *texts[2];
2642	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2643	struct sigmatel_spec *spec = codec->spec;
2644
2645	if (kcontrol->private_value == spec->line_switch)
2646		texts[0] = "Line In";
2647	else
2648		texts[0] = "Mic In";
2649	texts[1] = "Line Out";
2650	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
2651	uinfo->value.enumerated.items = 2;
2652	uinfo->count = 1;
2653
2654	if (uinfo->value.enumerated.item >= 2)
2655		uinfo->value.enumerated.item = 1;
2656	strcpy(uinfo->value.enumerated.name,
2657		texts[uinfo->value.enumerated.item]);
2658
2659	return 0;
2660}
2661
2662static int stac92xx_io_switch_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2663{
2664	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2665	struct sigmatel_spec *spec = codec->spec;
2666	hda_nid_t nid = kcontrol->private_value;
2667	int io_idx = (nid == spec->mic_switch) ? 1 : 0;
2668
2669	ucontrol->value.enumerated.item[0] = spec->io_switch[io_idx];
2670	return 0;
2671}
2672
2673static int stac92xx_io_switch_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2674{
2675        struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2676	struct sigmatel_spec *spec = codec->spec;
2677	hda_nid_t nid = kcontrol->private_value;
2678	int io_idx = (nid == spec->mic_switch) ? 1 : 0;
2679	unsigned short val = !!ucontrol->value.enumerated.item[0];
2680
2681	spec->io_switch[io_idx] = val;
2682
2683	if (val)
2684		stac92xx_auto_set_pinctl(codec, nid, AC_PINCTL_OUT_EN);
2685	else {
2686		unsigned int pinctl = AC_PINCTL_IN_EN;
2687		if (io_idx) /* set VREF for mic */
2688			pinctl |= stac92xx_get_default_vref(codec, nid);
2689		stac92xx_auto_set_pinctl(codec, nid, pinctl);
2690	}
2691
2692	/* check the auto-mute again: we need to mute/unmute the speaker
2693	 * appropriately according to the pin direction
2694	 */
2695	if (spec->hp_detect)
2696		stac_issue_unsol_event(codec, nid);
2697
2698        return 1;
2699}
2700
2701#define stac92xx_clfe_switch_info snd_ctl_boolean_mono_info
2702
2703static int stac92xx_clfe_switch_get(struct snd_kcontrol *kcontrol,
2704		struct snd_ctl_elem_value *ucontrol)
2705{
2706	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2707	struct sigmatel_spec *spec = codec->spec;
2708
2709	ucontrol->value.integer.value[0] = spec->clfe_swap;
2710	return 0;
2711}
2712
2713static int stac92xx_clfe_switch_put(struct snd_kcontrol *kcontrol,
2714		struct snd_ctl_elem_value *ucontrol)
2715{
2716	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2717	struct sigmatel_spec *spec = codec->spec;
2718	hda_nid_t nid = kcontrol->private_value & 0xff;
2719	unsigned int val = !!ucontrol->value.integer.value[0];
2720
2721	if (spec->clfe_swap == val)
2722		return 0;
2723
2724	spec->clfe_swap = val;
2725
2726	snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
2727		spec->clfe_swap ? 0x4 : 0x0);
2728
2729	return 1;
2730}
2731
2732#define STAC_CODEC_HP_SWITCH(xname) \
2733	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2734	  .name = xname, \
2735	  .index = 0, \
2736	  .info = stac92xx_hp_switch_info, \
2737	  .get = stac92xx_hp_switch_get, \
2738	  .put = stac92xx_hp_switch_put, \
2739	}
2740
2741#define STAC_CODEC_IO_SWITCH(xname, xpval) \
2742	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2743	  .name = xname, \
2744	  .index = 0, \
2745          .info = stac92xx_io_switch_info, \
2746          .get = stac92xx_io_switch_get, \
2747          .put = stac92xx_io_switch_put, \
2748          .private_value = xpval, \
2749	}
2750
2751#define STAC_CODEC_CLFE_SWITCH(xname, xpval) \
2752	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2753	  .name = xname, \
2754	  .index = 0, \
2755	  .info = stac92xx_clfe_switch_info, \
2756	  .get = stac92xx_clfe_switch_get, \
2757	  .put = stac92xx_clfe_switch_put, \
2758	  .private_value = xpval, \
2759	}
2760
2761enum {
2762	STAC_CTL_WIDGET_VOL,
2763	STAC_CTL_WIDGET_MUTE,
2764	STAC_CTL_WIDGET_MUTE_BEEP,
2765	STAC_CTL_WIDGET_MONO_MUX,
2766	STAC_CTL_WIDGET_HP_SWITCH,
2767	STAC_CTL_WIDGET_IO_SWITCH,
2768	STAC_CTL_WIDGET_CLFE_SWITCH,
2769	STAC_CTL_WIDGET_DC_BIAS
2770};
2771
2772static const struct snd_kcontrol_new stac92xx_control_templates[] = {
2773	HDA_CODEC_VOLUME(NULL, 0, 0, 0),
2774	HDA_CODEC_MUTE(NULL, 0, 0, 0),
2775	HDA_CODEC_MUTE_BEEP(NULL, 0, 0, 0),
2776	STAC_MONO_MUX,
2777	STAC_CODEC_HP_SWITCH(NULL),
2778	STAC_CODEC_IO_SWITCH(NULL, 0),
2779	STAC_CODEC_CLFE_SWITCH(NULL, 0),
2780	DC_BIAS(NULL, 0, 0),
2781};
2782
2783/* add dynamic controls */
2784static struct snd_kcontrol_new *
2785stac_control_new(struct sigmatel_spec *spec,
2786		 const struct snd_kcontrol_new *ktemp,
2787		 const char *name,
2788		 unsigned int subdev)
2789{
2790	struct snd_kcontrol_new *knew;
2791
2792	snd_array_init(&spec->kctls, sizeof(*knew), 32);
2793	knew = snd_array_new(&spec->kctls);
2794	if (!knew)
2795		return NULL;
2796	*knew = *ktemp;
2797	knew->name = kstrdup(name, GFP_KERNEL);
2798	if (!knew->name) {
2799		/* roolback */
2800		memset(knew, 0, sizeof(*knew));
2801		spec->kctls.alloced--;
2802		return NULL;
2803	}
2804	knew->subdevice = subdev;
2805	return knew;
2806}
2807
2808static int stac92xx_add_control_temp(struct sigmatel_spec *spec,
2809				     const struct snd_kcontrol_new *ktemp,
2810				     int idx, const char *name,
2811				     unsigned long val)
2812{
2813	struct snd_kcontrol_new *knew = stac_control_new(spec, ktemp, name,
2814							 HDA_SUBDEV_AMP_FLAG);
2815	if (!knew)
2816		return -ENOMEM;
2817	knew->index = idx;
2818	knew->private_value = val;
2819	return 0;
2820}
2821
2822static inline int stac92xx_add_control_idx(struct sigmatel_spec *spec,
2823					   int type, int idx, const char *name,
2824					   unsigned long val)
2825{
2826	return stac92xx_add_control_temp(spec,
2827					 &stac92xx_control_templates[type],
2828					 idx, name, val);
2829}
2830
2831
2832/* add dynamic controls */
2833static inline int stac92xx_add_control(struct sigmatel_spec *spec, int type,
2834				       const char *name, unsigned long val)
2835{
2836	return stac92xx_add_control_idx(spec, type, 0, name, val);
2837}
2838
2839static const struct snd_kcontrol_new stac_input_src_temp = {
2840	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2841	.name = "Input Source",
2842	.info = stac92xx_mux_enum_info,
2843	.get = stac92xx_mux_enum_get,
2844	.put = stac92xx_mux_enum_put,
2845};
2846
2847static inline int stac92xx_add_jack_mode_control(struct hda_codec *codec,
2848						hda_nid_t nid, int idx)
2849{
2850	int def_conf = snd_hda_codec_get_pincfg(codec, nid);
2851	int control = 0;
2852	struct sigmatel_spec *spec = codec->spec;
2853	char name[22];
2854
2855	if (snd_hda_get_input_pin_attr(def_conf) != INPUT_PIN_ATTR_INT) {
2856		if (stac92xx_get_default_vref(codec, nid) == AC_PINCTL_VREF_GRD
2857			&& nid == spec->line_switch)
2858			control = STAC_CTL_WIDGET_IO_SWITCH;
2859		else if (snd_hda_query_pin_caps(codec, nid)
2860			& (AC_PINCAP_VREF_GRD << AC_PINCAP_VREF_SHIFT))
2861			control = STAC_CTL_WIDGET_DC_BIAS;
2862		else if (nid == spec->mic_switch)
2863			control = STAC_CTL_WIDGET_IO_SWITCH;
2864	}
2865
2866	if (control) {
2867		strcpy(name, hda_get_input_pin_label(codec, nid, 1));
2868		return stac92xx_add_control(codec->spec, control,
2869					strcat(name, " Jack Mode"), nid);
2870	}
2871
2872	return 0;
2873}
2874
2875static int stac92xx_add_input_source(struct sigmatel_spec *spec)
2876{
2877	struct snd_kcontrol_new *knew;
2878	struct hda_input_mux *imux = &spec->private_imux;
2879
2880	if (spec->auto_mic)
2881		return 0; /* no need for input source */
2882	if (!spec->num_adcs || imux->num_items <= 1)
2883		return 0; /* no need for input source control */
2884	knew = stac_control_new(spec, &stac_input_src_temp,
2885				stac_input_src_temp.name, 0);
2886	if (!knew)
2887		return -ENOMEM;
2888	knew->count = spec->num_adcs;
2889	return 0;
2890}
2891
2892/* check whether the line-input can be used as line-out */
2893static hda_nid_t check_line_out_switch(struct hda_codec *codec)
2894{
2895	struct sigmatel_spec *spec = codec->spec;
2896	struct auto_pin_cfg *cfg = &spec->autocfg;
2897	hda_nid_t nid;
2898	unsigned int pincap;
2899	int i;
2900
2901	if (cfg->line_out_type != AUTO_PIN_LINE_OUT)
2902		return 0;
2903	for (i = 0; i < cfg->num_inputs; i++) {
2904		if (cfg->inputs[i].type == AUTO_PIN_LINE_IN) {
2905			nid = cfg->inputs[i].pin;
2906			pincap = snd_hda_query_pin_caps(codec, nid);
2907			if (pincap & AC_PINCAP_OUT)
2908				return nid;
2909		}
2910	}
2911	return 0;
2912}
2913
2914static hda_nid_t get_unassigned_dac(struct hda_codec *codec, hda_nid_t nid);
2915
2916/* check whether the mic-input can be used as line-out */
2917static hda_nid_t check_mic_out_switch(struct hda_codec *codec, hda_nid_t *dac)
2918{
2919	struct sigmatel_spec *spec = codec->spec;
2920	struct auto_pin_cfg *cfg = &spec->autocfg;
2921	unsigned int def_conf, pincap;
2922	int i;
2923
2924	*dac = 0;
2925	if (cfg->line_out_type != AUTO_PIN_LINE_OUT)
2926		return 0;
2927	for (i = 0; i < cfg->num_inputs; i++) {
2928		hda_nid_t nid = cfg->inputs[i].pin;
2929		if (cfg->inputs[i].type != AUTO_PIN_MIC)
2930			continue;
2931		def_conf = snd_hda_codec_get_pincfg(codec, nid);
2932		/* some laptops have an internal analog microphone
2933		 * which can't be used as a output */
2934		if (snd_hda_get_input_pin_attr(def_conf) != INPUT_PIN_ATTR_INT) {
2935			pincap = snd_hda_query_pin_caps(codec, nid);
2936			if (pincap & AC_PINCAP_OUT) {
2937				*dac = get_unassigned_dac(codec, nid);
2938				if (*dac)
2939					return nid;
2940			}
2941		}
2942	}
2943	return 0;
2944}
2945
2946static int is_in_dac_nids(struct sigmatel_spec *spec, hda_nid_t nid)
2947{
2948	int i;
2949	
2950	for (i = 0; i < spec->multiout.num_dacs; i++) {
2951		if (spec->multiout.dac_nids[i] == nid)
2952			return 1;
2953	}
2954
2955	return 0;
2956}
2957
2958static int check_all_dac_nids(struct sigmatel_spec *spec, hda_nid_t nid)
2959{
2960	int i;
2961	if (is_in_dac_nids(spec, nid))
2962		return 1;
2963	for (i = 0; i < spec->autocfg.hp_outs; i++)
2964		if (spec->hp_dacs[i] == nid)
2965			return 1;
2966	for (i = 0; i < spec->autocfg.speaker_outs; i++)
2967		if (spec->speaker_dacs[i] == nid)
2968			return 1;
2969	return 0;
2970}
2971
2972static hda_nid_t get_unassigned_dac(struct hda_codec *codec, hda_nid_t nid)
2973{
2974	struct sigmatel_spec *spec = codec->spec;
2975	int j, conn_len;
2976	hda_nid_t conn[HDA_MAX_CONNECTIONS];
2977	unsigned int wcaps, wtype;
2978
2979	conn_len = snd_hda_get_connections(codec, nid, conn,
2980					   HDA_MAX_CONNECTIONS);
2981	/* 92HD88: trace back up the link of nids to find the DAC */
2982	while (conn_len == 1 && (get_wcaps_type(get_wcaps(codec, conn[0]))
2983					!= AC_WID_AUD_OUT)) {
2984		nid = conn[0];
2985		conn_len = snd_hda_get_connections(codec, nid, conn,
2986			HDA_MAX_CONNECTIONS);
2987	}
2988	for (j = 0; j < conn_len; j++) {
2989		wcaps = get_wcaps(codec, conn[j]);
2990		wtype = get_wcaps_type(wcaps);
2991		/* we check only analog outputs */
2992		if (wtype != AC_WID_AUD_OUT || (wcaps & AC_WCAP_DIGITAL))
2993			continue;
2994		/* if this route has a free DAC, assign it */
2995		if (!check_all_dac_nids(spec, conn[j])) {
2996			if (conn_len > 1) {
2997				/* select this DAC in the pin's input mux */
2998				snd_hda_codec_write_cache(codec, nid, 0,
2999						  AC_VERB_SET_CONNECT_SEL, j);
3000			}
3001			return conn[j];
3002		}
3003	}
3004	/* if all DACs are already assigned, connect to the primary DAC */
3005	if (conn_len > 1) {
3006		for (j = 0; j < conn_len; j++) {
3007			if (conn[j] == spec->multiout.dac_nids[0]) {
3008				snd_hda_codec_write_cache(codec, nid, 0,
3009						  AC_VERB_SET_CONNECT_SEL, j);
3010				break;
3011			}
3012		}
3013	}
3014	return 0;
3015}
3016
3017static int add_spec_dacs(struct sigmatel_spec *spec, hda_nid_t nid);
3018static int add_spec_extra_dacs(struct sigmatel_spec *spec, hda_nid_t nid);
3019
3020/*
3021 * Fill in the dac_nids table from the parsed pin configuration
3022 * This function only works when every pin in line_out_pins[]
3023 * contains atleast one DAC in its connection list. Some 92xx
3024 * codecs are not connected directly to a DAC, such as the 9200
3025 * and 9202/925x. For those, dac_nids[] must be hard-coded.
3026 */
3027static int stac92xx_auto_fill_dac_nids(struct hda_codec *codec)
3028{
3029	struct sigmatel_spec *spec = codec->spec;
3030	struct auto_pin_cfg *cfg = &spec->autocfg;
3031	int i;
3032	hda_nid_t nid, dac;
3033	
3034	for (i = 0; i < cfg->line_outs; i++) {
3035		nid = cfg->line_out_pins[i];
3036		dac = get_unassigned_dac(codec, nid);
3037		if (!dac) {
3038			if (spec->multiout.num_dacs > 0) {
3039				/* we have already working output pins,
3040				 * so let's drop the broken ones again
3041				 */
3042				cfg->line_outs = spec->multiout.num_dacs;
3043				break;
3044			}
3045			/* error out, no available DAC found */
3046			snd_printk(KERN_ERR
3047				   "%s: No available DAC for pin 0x%x\n",
3048				   __func__, nid);
3049			return -ENODEV;
3050		}
3051		add_spec_dacs(spec, dac);
3052	}
3053
3054	for (i = 0; i < cfg->hp_outs; i++) {
3055		nid = cfg->hp_pins[i];
3056		dac = get_unassigned_dac(codec, nid);
3057		if (dac) {
3058			if (!spec->multiout.hp_nid)
3059				spec->multiout.hp_nid = dac;
3060			else
3061				add_spec_extra_dacs(spec, dac);
3062		}
3063		spec->hp_dacs[i] = dac;
3064	}
3065
3066	for (i = 0; i < cfg->speaker_outs; i++) {
3067		nid = cfg->speaker_pins[i];
3068		dac = get_unassigned_dac(codec, nid);
3069		if (dac)
3070			add_spec_extra_dacs(spec, dac);
3071		spec->speaker_dacs[i] = dac;
3072	}
3073
3074	/* add line-in as output */
3075	nid = check_line_out_switch(codec);
3076	if (nid) {
3077		dac = get_unassigned_dac(codec, nid);
3078		if (dac) {
3079			snd_printdd("STAC: Add line-in 0x%x as output %d\n",
3080				    nid, cfg->line_outs);
3081			cfg->line_out_pins[cfg->line_outs] = nid;
3082			cfg->line_outs++;
3083			spec->line_switch = nid;
3084			add_spec_dacs(spec, dac);
3085		}
3086	}
3087	/* add mic as output */
3088	nid = check_mic_out_switch(codec, &dac);
3089	if (nid && dac) {
3090		snd_printdd("STAC: Add mic-in 0x%x as output %d\n",
3091			    nid, cfg->line_outs);
3092		cfg->line_out_pins[cfg->line_outs] = nid;
3093		cfg->line_outs++;
3094		spec->mic_switch = nid;
3095		add_spec_dacs(spec, dac);
3096	}
3097
3098	snd_printd("stac92xx: dac_nids=%d (0x%x/0x%x/0x%x/0x%x/0x%x)\n",
3099		   spec->multiout.num_dacs,
3100		   spec->multiout.dac_nids[0],
3101		   spec->multiout.dac_nids[1],
3102		   spec->multiout.dac_nids[2],
3103		   spec->multiout.dac_nids[3],
3104		   spec->multiout.dac_nids[4]);
3105
3106	return 0;
3107}
3108
3109/* create volume control/switch for the given prefx type */
3110static int create_controls_idx(struct hda_codec *codec, const char *pfx,
3111			       int idx, hda_nid_t nid, int chs)
3112{
3113	struct sigmatel_spec *spec = codec->spec;
3114	char name[32];
3115	int err;
3116
3117	if (!spec->check_volume_offset) {
3118		unsigned int caps, step, nums, db_scale;
3119		caps = query_amp_caps(codec, nid, HDA_OUTPUT);
3120		step = (caps & AC_AMPCAP_STEP_SIZE) >>
3121			AC_AMPCAP_STEP_SIZE_SHIFT;
3122		step = (step + 1) * 25; /* in .01dB unit */
3123		nums = (caps & AC_AMPCAP_NUM_STEPS) >>
3124			AC_AMPCAP_NUM_STEPS_SHIFT;
3125		db_scale = nums * step;
3126		/* if dB scale is over -64dB, and finer enough,
3127		 * let's reduce it to half
3128		 */
3129		if (db_scale > 6400 && nums >= 0x1f)
3130			spec->volume_offset = nums / 2;
3131		spec->check_volume_offset = 1;
3132	}
3133
3134	sprintf(name, "%s Playback Volume", pfx);
3135	err = stac92xx_add_control_idx(spec, STAC_CTL_WIDGET_VOL, idx, name,
3136		HDA_COMPOSE_AMP_VAL_OFS(nid, chs, 0, HDA_OUTPUT,
3137					spec->volume_offset));
3138	if (err < 0)
3139		return err;
3140	sprintf(name, "%s Playback Switch", pfx);
3141	err = stac92xx_add_control_idx(spec, STAC_CTL_WIDGET_MUTE, idx, name,
3142				   HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
3143	if (err < 0)
3144		return err;
3145	return 0;
3146}
3147
3148#define create_controls(codec, pfx, nid, chs) \
3149	create_controls_idx(codec, pfx, 0, nid, chs)
3150
3151static int add_spec_dacs(struct sigmatel_spec *spec, hda_nid_t nid)
3152{
3153	if (spec->multiout.num_dacs > 4) {
3154		printk(KERN_WARNING "stac92xx: No space for DAC 0x%x\n", nid);
3155		return 1;
3156	} else {
3157		snd_BUG_ON(spec->multiout.dac_nids != spec->dac_nids);
3158		spec->dac_nids[spec->multiout.num_dacs] = nid;
3159		spec->multiout.num_dacs++;
3160	}
3161	return 0;
3162}
3163
3164static int add_spec_extra_dacs(struct sigmatel_spec *spec, hda_nid_t nid)
3165{
3166	int i;
3167	for (i = 0; i < ARRAY_SIZE(spec->multiout.extra_out_nid); i++) {
3168		if (!spec->multiout.extra_out_nid[i]) {
3169			spec->multiout.extra_out_nid[i] = nid;
3170			return 0;
3171		}
3172	}
3173	printk(KERN_WARNING "stac92xx: No space for extra DAC 0x%x\n", nid);
3174	return 1;
3175}
3176
3177/* Create output controls
3178 * The mixer elements are named depending on the given type (AUTO_PIN_XXX_OUT)
3179 */
3180static int create_multi_out_ctls(struct hda_codec *codec, int num_outs,
3181				 const hda_nid_t *pins,
3182				 const hda_nid_t *dac_nids,
3183				 int type)
3184{
3185	struct sigmatel_spec *spec = codec->spec;
3186	static const char * const chname[4] = {
3187		"Front", "Surround", NULL /*CLFE*/, "Side"
3188	};
3189	hda_nid_t nid;
3190	int i, err;
3191	unsigned int wid_caps;
3192
3193	for (i = 0; i < num_outs && i < ARRAY_SIZE(chname); i++) {
3194		if (type == AUTO_PIN_HP_OUT && !spec->hp_detect) {
3195			if (is_jack_detectable(codec, pins[i]))
3196				spec->hp_detect = 1;
3197		}
3198		nid = dac_nids[i];
3199		if (!nid)
3200			continue;
3201		if (type != AUTO_PIN_HP_OUT && i == 2) {
3202			/* Center/LFE */
3203			err = create_controls(codec, "Center", nid, 1);
3204			if (err < 0)
3205				return err;
3206			err = create_controls(codec, "LFE", nid, 2);
3207			if (err < 0)
3208				return err;
3209
3210			wid_caps = get_wcaps(codec, nid);
3211
3212			if (wid_caps & AC_WCAP_LR_SWAP) {
3213				err = stac92xx_add_control(spec,
3214					STAC_CTL_WIDGET_CLFE_SWITCH,
3215					"Swap Center/LFE Playback Switch", nid);
3216
3217				if (err < 0)
3218					return err;
3219			}
3220
3221		} else {
3222			const char *name;
3223			int idx;
3224			switch (type) {
3225			case AUTO_PIN_HP_OUT:
3226				name = "Headphone";
3227				idx = i;
3228				break;
3229			case AUTO_PIN_SPEAKER_OUT:
3230				name = "Speaker";
3231				idx = i;
3232				break;
3233			default:
3234				name = chname[i];
3235				idx = 0;
3236				break;
3237			}
3238			err = create_controls_idx(codec, name, idx, nid, 3);
3239			if (err < 0)
3240				return err;
3241		}
3242	}
3243	return 0;
3244}
3245
3246static int stac92xx_add_capvol_ctls(struct hda_codec *codec, unsigned long vol,
3247				    unsigned long sw, int idx)
3248{
3249	int err;
3250	err = stac92xx_add_control_idx(codec->spec, STAC_CTL_WIDGET_VOL, idx,
3251				       "Capture Volume", vol);
3252	if (err < 0)
3253		return err;
3254	err = stac92xx_add_control_idx(codec->spec, STAC_CTL_WIDGET_MUTE, idx,
3255				       "Capture Switch", sw);
3256	if (err < 0)
3257		return err;
3258	return 0;
3259}
3260
3261/* add playback controls from the parsed DAC table */
3262static int stac92xx_auto_create_multi_out_ctls(struct hda_codec *codec,
3263					       const struct auto_pin_cfg *cfg)
3264{
3265	struct sigmatel_spec *spec = codec->spec;
3266	hda_nid_t nid;
3267	int err;
3268	int idx;
3269
3270	err = create_multi_out_ctls(codec, cfg->line_outs, cfg->line_out_pins,
3271				    spec->multiout.dac_nids,
3272				    cfg->line_out_type);
3273	if (err < 0)
3274		return err;
3275
3276	if (cfg->hp_outs > 1 && cfg->line_out_type == AUTO_PIN_LINE_OUT) {
3277		err = stac92xx_add_control(spec,
3278			STAC_CTL_WIDGET_HP_SWITCH,
3279			"Headphone as Line Out Switch",
3280			cfg->hp_pins[cfg->hp_outs - 1]);
3281		if (err < 0)
3282			return err;
3283	}
3284
3285	for (idx = 0; idx < cfg->num_inputs; idx++) {
3286		if (cfg->inputs[idx].type > AUTO_PIN_LINE_IN)
3287			break;
3288		nid = cfg->inputs[idx].pin;
3289		err = stac92xx_add_jack_mode_control(codec, nid, idx);
3290		if (err < 0)
3291			return err;
3292	}
3293
3294	return 0;
3295}
3296
3297/* add playback controls for Speaker and HP outputs */
3298static int stac92xx_auto_create_hp_ctls(struct hda_codec *codec,
3299					struct auto_pin_cfg *cfg)
3300{
3301	struct sigmatel_spec *spec = codec->spec;
3302	int err;
3303
3304	err = create_multi_out_ctls(codec, cfg->hp_outs, cfg->hp_pins,
3305				    spec->hp_dacs, AUTO_PIN_HP_OUT);
3306	if (err < 0)
3307		return err;
3308
3309	err = create_multi_out_ctls(codec, cfg->speaker_outs, cfg->speaker_pins,
3310				    spec->speaker_dacs, AUTO_PIN_SPEAKER_OUT);
3311	if (err < 0)
3312		return err;
3313
3314	return 0;
3315}
3316
3317/* labels for mono mux outputs */
3318static const char * const stac92xx_mono_labels[4] = {
3319	"DAC0", "DAC1", "Mixer", "DAC2"
3320};
3321
3322/* create mono mux for mono out on capable codecs */
3323static int stac92xx_auto_create_mono_output_ctls(struct hda_codec *codec)
3324{
3325	struct sigmatel_spec *spec = codec->spec;
3326	struct hda_input_mux *mono_mux = &spec->private_mono_mux;
3327	int i, num_cons;
3328	hda_nid_t con_lst[ARRAY_SIZE(stac92xx_mono_labels)];
3329
3330	num_cons = snd_hda_get_connections(codec,
3331				spec->mono_nid,
3332				con_lst,
3333				HDA_MAX_NUM_INPUTS);
3334	if (num_cons <= 0 || num_cons > ARRAY_SIZE(stac92xx_mono_labels))
3335		return -EINVAL;
3336
3337	for (i = 0; i < num_cons; i++)
3338		snd_hda_add_imux_item(mono_mux, stac92xx_mono_labels[i], i,
3339				      NULL);
3340
3341	return stac92xx_add_control(spec, STAC_CTL_WIDGET_MONO_MUX,
3342				"Mono Mux", spec->mono_nid);
3343}
3344
3345/* create PC beep volume controls */
3346static int stac92xx_auto_create_beep_ctls(struct hda_codec *codec,
3347						hda_nid_t nid)
3348{
3349	struct sigmatel_spec *spec = codec->spec;
3350	u32 caps = query_amp_caps(codec, nid, HDA_OUTPUT);
3351	int err, type = STAC_CTL_WIDGET_MUTE_BEEP;
3352
3353	if (spec->anabeep_nid == nid)
3354		type = STAC_CTL_WIDGET_MUTE;
3355
3356	/* check for mute support for the the amp */
3357	if ((caps & AC_AMPCAP_MUTE) >> AC_AMPCAP_MUTE_SHIFT) {
3358		err = stac92xx_add_control(spec, type,
3359			"Beep Playback Switch",
3360			HDA_COMPOSE_AMP_VAL(nid, 1, 0, HDA_OUTPUT));
3361			if (err < 0)
3362				return err;
3363	}
3364
3365	/* check to see if there is volume support for the amp */
3366	if ((caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT) {
3367		err = stac92xx_add_control(spec, STAC_CTL_WIDGET_VOL,
3368			"Beep Playback Volume",
3369			HDA_COMPOSE_AMP_VAL(nid, 1, 0, HDA_OUTPUT));
3370			if (err < 0)
3371				return err;
3372	}
3373	return 0;
3374}
3375
3376#ifdef CONFIG_SND_HDA_INPUT_BEEP
3377#define stac92xx_dig_beep_switch_info snd_ctl_boolean_mono_info
3378
3379static int stac92xx_dig_beep_switch_get(struct snd_kcontrol *kcontrol,
3380					struct snd_ctl_elem_value *ucontrol)
3381{
3382	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3383	ucontrol->value.integer.value[0] = codec->beep->enabled;
3384	return 0;
3385}
3386
3387static int stac92xx_dig_beep_switch_put(struct snd_kcontrol *kcontrol,
3388					struct snd_ctl_elem_value *ucontrol)
3389{
3390	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3391	return snd_hda_enable_beep_device(codec, ucontrol->value.integer.value[0]);
3392}
3393
3394static const struct snd_kcontrol_new stac92xx_dig_beep_ctrl = {
3395	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3396	.info = stac92xx_dig_beep_switch_info,
3397	.get = stac92xx_dig_beep_switch_get,
3398	.put = stac92xx_dig_beep_switch_put,
3399};
3400
3401static int stac92xx_beep_switch_ctl(struct hda_codec *codec)
3402{
3403	return stac92xx_add_control_temp(codec->spec, &stac92xx_dig_beep_ctrl,
3404					 0, "Beep Playback Switch", 0);
3405}
3406#endif
3407
3408static int stac92xx_auto_create_mux_input_ctls(struct hda_codec *codec)
3409{
3410	struct sigmatel_spec *spec = codec->spec;
3411	int i, j, err = 0;
3412
3413	for (i = 0; i < spec->num_muxes; i++) {
3414		hda_nid_t nid;
3415		unsigned int wcaps;
3416		unsigned long val;
3417
3418		nid = spec->mux_nids[i];
3419		wcaps = get_wcaps(codec, nid);
3420		if (!(wcaps & AC_WCAP_OUT_AMP))
3421			continue;
3422
3423		/* check whether already the same control was created as
3424		 * normal Capture Volume.
3425		 */
3426		val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
3427		for (j = 0; j < spec->num_caps; j++) {
3428			if (spec->capvols[j] == val)
3429				break;
3430		}
3431		if (j < spec->num_caps)
3432			continue;
3433
3434		err = stac92xx_add_control_idx(spec, STAC_CTL_WIDGET_VOL, i,
3435					       "Mux Capture Volume", val);
3436		if (err < 0)
3437			return err;
3438	}
3439	return 0;
3440};
3441
3442static const char * const stac92xx_spdif_labels[3] = {
3443	"Digital Playback", "Analog Mux 1", "Analog Mux 2",
3444};
3445
3446static int stac92xx_auto_create_spdif_mux_ctls(struct hda_codec *codec)
3447{
3448	struct sigmatel_spec *spec = codec->spec;
3449	struct hda_input_mux *spdif_mux = &spec->private_smux;
3450	const char * const *labels = spec->spdif_labels;
3451	int i, num_cons;
3452	hda_nid_t con_lst[HDA_MAX_NUM_INPUTS];
3453
3454	num_cons = snd_hda_get_connections(codec,
3455				spec->smux_nids[0],
3456				con_lst,
3457				HDA_MAX_NUM_INPUTS);
3458	if (num_cons <= 0)
3459		return -EINVAL;
3460
3461	if (!labels)
3462		labels = stac92xx_spdif_labels;
3463
3464	for (i = 0; i < num_cons; i++)
3465		snd_hda_add_imux_item(spdif_mux, labels[i], i, NULL);
3466
3467	return 0;
3468}
3469
3470/* labels for dmic mux inputs */
3471static const char * const stac92xx_dmic_labels[5] = {
3472	"Analog Inputs", "Digital Mic 1", "Digital Mic 2",
3473	"Digital Mic 3", "Digital Mic 4"
3474};
3475
3476static hda_nid_t get_connected_node(struct hda_codec *codec, hda_nid_t mux,
3477				    int idx)
3478{
3479	hda_nid_t conn[HDA_MAX_NUM_INPUTS];
3480	int nums;
3481	nums = snd_hda_get_connections(codec, mux, conn, ARRAY_SIZE(conn));
3482	if (idx >= 0 && idx < nums)
3483		return conn[idx];
3484	return 0;
3485}
3486
3487/* look for NID recursively */
3488#define get_connection_index(codec, mux, nid) \
3489	snd_hda_get_conn_index(codec, mux, nid, 1)
3490
3491/* create a volume assigned to the given pin (only if supported) */
3492/* return 1 if the volume control is created */
3493static int create_elem_capture_vol(struct hda_codec *codec, hda_nid_t nid,
3494				   const char *label, int idx, int direction)
3495{
3496	unsigned int caps, nums;
3497	char name[32];
3498	int err;
3499
3500	if (direction == HDA_OUTPUT)
3501		caps = AC_WCAP_OUT_AMP;
3502	else
3503		caps = AC_WCAP_IN_AMP;
3504	if (!(get_wcaps(codec, nid) & caps))
3505		return 0;
3506	caps = query_amp_caps(codec, nid, direction);
3507	nums = (caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT;
3508	if (!nums)
3509		return 0;
3510	snprintf(name, sizeof(name), "%s Capture Volume", label);
3511	err = stac92xx_add_control_idx(codec->spec, STAC_CTL_WIDGET_VOL, idx, name,
3512				       HDA_COMPOSE_AMP_VAL(nid, 3, 0, direction));
3513	if (err < 0)
3514		return err;
3515	return 1;
3516}
3517
3518/* create playback/capture controls for input pins on dmic capable codecs */
3519static int stac92xx_auto_create_dmic_input_ctls(struct hda_codec *codec,
3520						const struct auto_pin_cfg *cfg)
3521{
3522	struct sigmatel_spec *spec = codec->spec;
3523	struct hda_input_mux *imux = &spec->private_imux;
3524	struct hda_input_mux *dimux = &spec->private_dimux;
3525	int err, i;
3526	unsigned int def_conf;
3527
3528	snd_hda_add_imux_item(dimux, stac92xx_dmic_labels[0], 0, NULL);
 
 
3529
3530	for (i = 0; i < spec->num_dmics; i++) {
3531		hda_nid_t nid;
3532		int index, type_idx;
3533		const char *label;
3534
3535		nid = spec->dmic_nids[i];
3536		if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
3537			continue;
3538		def_conf = snd_hda_codec_get_pincfg(codec, nid);
3539		if (get_defcfg_connect(def_conf) == AC_JACK_PORT_NONE)
3540			continue;
3541
3542		index = get_connection_index(codec, spec->dmux_nids[0], nid);
3543		if (index < 0)
3544			continue;
3545
3546		label = hda_get_input_pin_label(codec, nid, 1);
3547		snd_hda_add_imux_item(dimux, label, index, &type_idx);
3548		if (snd_hda_get_bool_hint(codec, "separate_dmux") != 1)
3549			snd_hda_add_imux_item(imux, label, index, &type_idx);
3550
3551		err = create_elem_capture_vol(codec, nid, label, type_idx,
3552					      HDA_INPUT);
3553		if (err < 0)
3554			return err;
3555		if (!err) {
3556			err = create_elem_capture_vol(codec, nid, label,
3557						      type_idx, HDA_OUTPUT);
3558			if (err < 0)
3559				return err;
3560			if (!err) {
3561				nid = get_connected_node(codec,
3562						spec->dmux_nids[0], index);
3563				if (nid)
3564					err = create_elem_capture_vol(codec,
3565							nid, label,
3566							type_idx, HDA_INPUT);
3567				if (err < 0)
3568					return err;
3569			}
3570		}
3571	}
3572
3573	return 0;
3574}
3575
3576static int check_mic_pin(struct hda_codec *codec, hda_nid_t nid,
3577			 hda_nid_t *fixed, hda_nid_t *ext, hda_nid_t *dock)
3578{
3579	unsigned int cfg;
3580	unsigned int type;
3581
3582	if (!nid)
3583		return 0;
3584	cfg = snd_hda_codec_get_pincfg(codec, nid);
3585	type = get_defcfg_device(cfg);
3586	switch (snd_hda_get_input_pin_attr(cfg)) {
3587	case INPUT_PIN_ATTR_INT:
3588		if (*fixed)
3589			return 1; /* already occupied */
3590		if (type != AC_JACK_MIC_IN)
3591			return 1; /* invalid type */
3592		*fixed = nid;
3593		break;
3594	case INPUT_PIN_ATTR_UNUSED:
3595		break;
3596	case INPUT_PIN_ATTR_DOCK:
3597		if (*dock)
3598			return 1; /* already occupied */
3599		if (type != AC_JACK_MIC_IN && type != AC_JACK_LINE_IN)
3600			return 1; /* invalid type */
3601		*dock = nid;
3602		break;
3603	default:
3604		if (*ext)
3605			return 1; /* already occupied */
3606		if (type != AC_JACK_MIC_IN)
3607			return 1; /* invalid type */
3608		*ext = nid;
3609		break;
3610	}
3611	return 0;
3612}
3613
3614static int set_mic_route(struct hda_codec *codec,
3615			 struct sigmatel_mic_route *mic,
3616			 hda_nid_t pin)
3617{
3618	struct sigmatel_spec *spec = codec->spec;
3619	struct auto_pin_cfg *cfg = &spec->autocfg;
3620	int i;
3621
3622	mic->pin = pin;
3623	if (pin == 0)
3624		return 0;
3625	for (i = 0; i < cfg->num_inputs; i++) {
3626		if (pin == cfg->inputs[i].pin)
3627			break;
3628	}
3629	if (i < cfg->num_inputs && cfg->inputs[i].type == AUTO_PIN_MIC) {
3630		/* analog pin */
3631		i = get_connection_index(codec, spec->mux_nids[0], pin);
3632		if (i < 0)
3633			return -1;
3634		mic->mux_idx = i;
3635		mic->dmux_idx = -1;
3636		if (spec->dmux_nids)
3637			mic->dmux_idx = get_connection_index(codec,
3638							     spec->dmux_nids[0],
3639							     spec->mux_nids[0]);
3640	}  else if (spec->dmux_nids) {
3641		/* digital pin */
3642		i = get_connection_index(codec, spec->dmux_nids[0], pin);
3643		if (i < 0)
3644			return -1;
3645		mic->dmux_idx = i;
3646		mic->mux_idx = -1;
3647		if (spec->mux_nids)
3648			mic->mux_idx = get_connection_index(codec,
3649							    spec->mux_nids[0],
3650							    spec->dmux_nids[0]);
3651	}
3652	return 0;
3653}
3654
3655/* return non-zero if the device is for automatic mic switch */
3656static int stac_check_auto_mic(struct hda_codec *codec)
3657{
3658	struct sigmatel_spec *spec = codec->spec;
3659	struct auto_pin_cfg *cfg = &spec->autocfg;
3660	hda_nid_t fixed, ext, dock;
3661	int i;
3662
3663	fixed = ext = dock = 0;
3664	for (i = 0; i < cfg->num_inputs; i++)
3665		if (check_mic_pin(codec, cfg->inputs[i].pin,
3666		    &fixed, &ext, &dock))
3667			return 0;
3668	for (i = 0; i < spec->num_dmics; i++)
3669		if (check_mic_pin(codec, spec->dmic_nids[i],
3670		    &fixed, &ext, &dock))
3671			return 0;
3672	if (!fixed || (!ext && !dock))
3673		return 0; /* no input to switch */
3674	if (!is_jack_detectable(codec, ext))
3675		return 0; /* no unsol support */
3676	if (set_mic_route(codec, &spec->ext_mic, ext) ||
3677	    set_mic_route(codec, &spec->int_mic, fixed) ||
3678	    set_mic_route(codec, &spec->dock_mic, dock))
3679		return 0; /* something is wrong */
3680	return 1;
3681}
3682
3683/* create playback/capture controls for input pins */
3684static int stac92xx_auto_create_analog_input_ctls(struct hda_codec *codec, const struct auto_pin_cfg *cfg)
3685{
3686	struct sigmatel_spec *spec = codec->spec;
3687	struct hda_input_mux *imux = &spec->private_imux;
3688	int i, j;
3689	const char *label;
3690
3691	for (i = 0; i < cfg->num_inputs; i++) {
3692		hda_nid_t nid = cfg->inputs[i].pin;
3693		int index, err, type_idx;
3694
3695		index = -1;
3696		for (j = 0; j < spec->num_muxes; j++) {
3697			index = get_connection_index(codec, spec->mux_nids[j],
3698						     nid);
3699			if (index >= 0)
3700				break;
3701		}
3702		if (index < 0)
3703			continue;
3704
3705		label = hda_get_autocfg_input_label(codec, cfg, i);
3706		snd_hda_add_imux_item(imux, label, index, &type_idx);
3707
3708		err = create_elem_capture_vol(codec, nid,
3709					      label, type_idx,
3710					      HDA_INPUT);
3711		if (err < 0)
3712			return err;
3713	}
3714	spec->num_analog_muxes = imux->num_items;
3715
3716	if (imux->num_items) {
3717		/*
3718		 * Set the current input for the muxes.
3719		 * The STAC9221 has two input muxes with identical source
3720		 * NID lists.  Hopefully this won't get confused.
3721		 */
3722		for (i = 0; i < spec->num_muxes; i++) {
3723			snd_hda_codec_write_cache(codec, spec->mux_nids[i], 0,
3724						  AC_VERB_SET_CONNECT_SEL,
3725						  imux->items[0].index);
3726		}
3727	}
3728
3729	return 0;
3730}
3731
3732static void stac92xx_auto_init_multi_out(struct hda_codec *codec)
3733{
3734	struct sigmatel_spec *spec = codec->spec;
3735	int i;
3736
3737	for (i = 0; i < spec->autocfg.line_outs; i++) {
3738		hda_nid_t nid = spec->autocfg.line_out_pins[i];
3739		stac92xx_auto_set_pinctl(codec, nid, AC_PINCTL_OUT_EN);
3740	}
3741}
3742
3743static void stac92xx_auto_init_hp_out(struct hda_codec *codec)
3744{
3745	struct sigmatel_spec *spec = codec->spec;
3746	int i;
3747
3748	for (i = 0; i < spec->autocfg.hp_outs; i++) {
3749		hda_nid_t pin;
3750		pin = spec->autocfg.hp_pins[i];
3751		if (pin) /* connect to front */
3752			stac92xx_auto_set_pinctl(codec, pin, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
3753	}
3754	for (i = 0; i < spec->autocfg.speaker_outs; i++) {
3755		hda_nid_t pin;
3756		pin = spec->autocfg.speaker_pins[i];
3757		if (pin) /* connect to front */
3758			stac92xx_auto_set_pinctl(codec, pin, AC_PINCTL_OUT_EN);
3759	}
3760}
3761
3762static int is_dual_headphones(struct hda_codec *codec)
3763{
3764	struct sigmatel_spec *spec = codec->spec;
3765	int i, valid_hps;
3766
3767	if (spec->autocfg.line_out_type != AUTO_PIN_SPEAKER_OUT ||
3768	    spec->autocfg.hp_outs <= 1)
3769		return 0;
3770	valid_hps = 0;
3771	for (i = 0; i < spec->autocfg.hp_outs; i++) {
3772		hda_nid_t nid = spec->autocfg.hp_pins[i];
3773		unsigned int cfg = snd_hda_codec_get_pincfg(codec, nid);
3774		if (get_defcfg_location(cfg) & AC_JACK_LOC_SEPARATE)
3775			continue;
3776		valid_hps++;
3777	}
3778	return (valid_hps > 1);
3779}
3780
3781
3782static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out, hda_nid_t dig_in)
3783{
3784	struct sigmatel_spec *spec = codec->spec;
3785	int hp_swap = 0;
3786	int i, err;
3787
3788	if ((err = snd_hda_parse_pin_def_config(codec,
3789						&spec->autocfg,
3790						spec->dmic_nids)) < 0)
3791		return err;
3792	if (! spec->autocfg.line_outs)
3793		return 0; /* can't find valid pin config */
3794
3795	/* If we have no real line-out pin and multiple hp-outs, HPs should
3796	 * be set up as multi-channel outputs.
3797	 */
3798	if (is_dual_headphones(codec)) {
3799		/* Copy hp_outs to line_outs, backup line_outs in
3800		 * speaker_outs so that the following routines can handle
3801		 * HP pins as primary outputs.
3802		 */
3803		snd_printdd("stac92xx: Enabling multi-HPs workaround\n");
3804		memcpy(spec->autocfg.speaker_pins, spec->autocfg.line_out_pins,
3805		       sizeof(spec->autocfg.line_out_pins));
3806		spec->autocfg.speaker_outs = spec->autocfg.line_outs;
3807		memcpy(spec->autocfg.line_out_pins, spec->autocfg.hp_pins,
3808		       sizeof(spec->autocfg.hp_pins));
3809		spec->autocfg.line_outs = spec->autocfg.hp_outs;
3810		spec->autocfg.line_out_type = AUTO_PIN_HP_OUT;
3811		spec->autocfg.hp_outs = 0;
3812		hp_swap = 1;
3813	}
3814	if (spec->autocfg.mono_out_pin) {
3815		int dir = get_wcaps(codec, spec->autocfg.mono_out_pin) &
3816			(AC_WCAP_OUT_AMP | AC_WCAP_IN_AMP);
3817		u32 caps = query_amp_caps(codec,
3818				spec->autocfg.mono_out_pin, dir);
3819		hda_nid_t conn_list[1];
3820
3821		/* get the mixer node and then the mono mux if it exists */
3822		if (snd_hda_get_connections(codec,
3823				spec->autocfg.mono_out_pin, conn_list, 1) &&
3824				snd_hda_get_connections(codec, conn_list[0],
3825				conn_list, 1) > 0) {
3826
3827				int wcaps = get_wcaps(codec, conn_list[0]);
3828				int wid_type = get_wcaps_type(wcaps);
3829				/* LR swap check, some stac925x have a mux that
3830 				 * changes the DACs output path instead of the
3831 				 * mono-mux path.
3832 				 */
3833				if (wid_type == AC_WID_AUD_SEL &&
3834						!(wcaps & AC_WCAP_LR_SWAP))
3835					spec->mono_nid = conn_list[0];
3836		}
3837		if (dir) {
3838			hda_nid_t nid = spec->autocfg.mono_out_pin;
3839
3840			/* most mono outs have a least a mute/unmute switch */
3841			dir = (dir & AC_WCAP_OUT_AMP) ? HDA_OUTPUT : HDA_INPUT;
3842			err = stac92xx_add_control(spec, STAC_CTL_WIDGET_MUTE,
3843				"Mono Playback Switch",
3844				HDA_COMPOSE_AMP_VAL(nid, 1, 0, dir));
3845			if (err < 0)
3846				return err;
3847			/* check for volume support for the amp */
3848			if ((caps & AC_AMPCAP_NUM_STEPS)
3849					>> AC_AMPCAP_NUM_STEPS_SHIFT) {
3850				err = stac92xx_add_control(spec,
3851					STAC_CTL_WIDGET_VOL,
3852					"Mono Playback Volume",
3853				HDA_COMPOSE_AMP_VAL(nid, 1, 0, dir));
3854				if (err < 0)
3855					return err;
3856			}
3857		}
3858
3859		stac92xx_auto_set_pinctl(codec, spec->autocfg.mono_out_pin,
3860					 AC_PINCTL_OUT_EN);
3861	}
3862
3863	if (!spec->multiout.num_dacs) {
3864		err = stac92xx_auto_fill_dac_nids(codec);
3865		if (err < 0)
3866			return err;
3867		err = stac92xx_auto_create_multi_out_ctls(codec,
3868							  &spec->autocfg);
3869		if (err < 0)
3870			return err;
3871	}
3872
3873	/* setup analog beep controls */
3874	if (spec->anabeep_nid > 0) {
3875		err = stac92xx_auto_create_beep_ctls(codec,
3876			spec->anabeep_nid);
3877		if (err < 0)
3878			return err;
3879	}
3880
3881	/* setup digital beep controls and input device */
3882#ifdef CONFIG_SND_HDA_INPUT_BEEP
3883	if (spec->digbeep_nid > 0) {
3884		hda_nid_t nid = spec->digbeep_nid;
3885		unsigned int caps;
3886
3887		err = stac92xx_auto_create_beep_ctls(codec, nid);
3888		if (err < 0)
3889			return err;
3890		err = snd_hda_attach_beep_device(codec, nid);
3891		if (err < 0)
3892			return err;
3893		if (codec->beep) {
3894			/* IDT/STAC codecs have linear beep tone parameter */
3895			codec->beep->linear_tone = spec->linear_tone_beep;
 
 
3896			/* if no beep switch is available, make its own one */
3897			caps = query_amp_caps(codec, nid, HDA_OUTPUT);
3898			if (!(caps & AC_AMPCAP_MUTE)) {
3899				err = stac92xx_beep_switch_ctl(codec);
3900				if (err < 0)
3901					return err;
3902			}
3903		}
3904	}
3905#endif
3906
3907	err = stac92xx_auto_create_hp_ctls(codec, &spec->autocfg);
3908	if (err < 0)
3909		return err;
3910
3911	/* All output parsing done, now restore the swapped hp pins */
3912	if (hp_swap) {
3913		memcpy(spec->autocfg.hp_pins, spec->autocfg.line_out_pins,
3914		       sizeof(spec->autocfg.hp_pins));
3915		spec->autocfg.hp_outs = spec->autocfg.line_outs;
3916		spec->autocfg.line_out_type = AUTO_PIN_HP_OUT;
3917		spec->autocfg.line_outs = 0;
3918	}
3919
3920	if (stac_check_auto_mic(codec)) {
3921		spec->auto_mic = 1;
3922		/* only one capture for auto-mic */
3923		spec->num_adcs = 1;
3924		spec->num_caps = 1;
3925		spec->num_muxes = 1;
3926	}
3927
3928	for (i = 0; i < spec->num_caps; i++) {
3929		err = stac92xx_add_capvol_ctls(codec, spec->capvols[i],
3930					       spec->capsws[i], i);
3931		if (err < 0)
3932			return err;
3933	}
3934
3935	err = stac92xx_auto_create_analog_input_ctls(codec, &spec->autocfg);
3936	if (err < 0)
3937		return err;
3938
3939	if (spec->mono_nid > 0) {
3940		err = stac92xx_auto_create_mono_output_ctls(codec);
3941		if (err < 0)
3942			return err;
3943	}
3944	if (spec->num_dmics > 0 && !spec->dinput_mux)
3945		if ((err = stac92xx_auto_create_dmic_input_ctls(codec,
3946						&spec->autocfg)) < 0)
3947			return err;
3948	if (spec->num_muxes > 0) {
3949		err = stac92xx_auto_create_mux_input_ctls(codec);
3950		if (err < 0)
3951			return err;
3952	}
3953	if (spec->num_smuxes > 0) {
3954		err = stac92xx_auto_create_spdif_mux_ctls(codec);
3955		if (err < 0)
3956			return err;
3957	}
3958
3959	err = stac92xx_add_input_source(spec);
3960	if (err < 0)
3961		return err;
3962
3963	spec->multiout.max_channels = spec->multiout.num_dacs * 2;
3964	if (spec->multiout.max_channels > 2)
3965		spec->surr_switch = 1;
3966
3967	if (spec->autocfg.dig_outs)
3968		spec->multiout.dig_out_nid = dig_out;
3969	if (dig_in && spec->autocfg.dig_in_pin)
3970		spec->dig_in_nid = dig_in;
3971
3972	if (spec->kctls.list)
3973		spec->mixers[spec->num_mixers++] = spec->kctls.list;
3974
3975	spec->input_mux = &spec->private_imux;
3976	if (!spec->dinput_mux)
3977		spec->dinput_mux = &spec->private_dimux;
3978	spec->sinput_mux = &spec->private_smux;
3979	spec->mono_mux = &spec->private_mono_mux;
3980	return 1;
3981}
3982
3983/* add playback controls for HP output */
3984static int stac9200_auto_create_hp_ctls(struct hda_codec *codec,
3985					struct auto_pin_cfg *cfg)
3986{
3987	struct sigmatel_spec *spec = codec->spec;
3988	hda_nid_t pin = cfg->hp_pins[0];
3989
3990	if (! pin)
3991		return 0;
3992
3993	if (is_jack_detectable(codec, pin))
3994		spec->hp_detect = 1;
3995
3996	return 0;
3997}
3998
3999/* add playback controls for LFE output */
4000static int stac9200_auto_create_lfe_ctls(struct hda_codec *codec,
4001					struct auto_pin_cfg *cfg)
4002{
4003	struct sigmatel_spec *spec = codec->spec;
4004	int err;
4005	hda_nid_t lfe_pin = 0x0;
4006	int i;
4007
4008	/*
4009	 * search speaker outs and line outs for a mono speaker pin
4010	 * with an amp.  If one is found, add LFE controls
4011	 * for it.
4012	 */
4013	for (i = 0; i < spec->autocfg.speaker_outs && lfe_pin == 0x0; i++) {
4014		hda_nid_t pin = spec->autocfg.speaker_pins[i];
4015		unsigned int wcaps = get_wcaps(codec, pin);
4016		wcaps &= (AC_WCAP_STEREO | AC_WCAP_OUT_AMP);
4017		if (wcaps == AC_WCAP_OUT_AMP)
4018			/* found a mono speaker with an amp, must be lfe */
4019			lfe_pin = pin;
4020	}
4021
4022	/* if speaker_outs is 0, then speakers may be in line_outs */
4023	if (lfe_pin == 0 && spec->autocfg.speaker_outs == 0) {
4024		for (i = 0; i < spec->autocfg.line_outs && lfe_pin == 0x0; i++) {
4025			hda_nid_t pin = spec->autocfg.line_out_pins[i];
4026			unsigned int defcfg;
4027			defcfg = snd_hda_codec_get_pincfg(codec, pin);
4028			if (get_defcfg_device(defcfg) == AC_JACK_SPEAKER) {
4029				unsigned int wcaps = get_wcaps(codec, pin);
4030				wcaps &= (AC_WCAP_STEREO | AC_WCAP_OUT_AMP);
4031				if (wcaps == AC_WCAP_OUT_AMP)
4032					/* found a mono speaker with an amp,
4033					   must be lfe */
4034					lfe_pin = pin;
4035			}
4036		}
4037	}
4038
4039	if (lfe_pin) {
4040		err = create_controls(codec, "LFE", lfe_pin, 1);
4041		if (err < 0)
4042			return err;
4043	}
4044
4045	return 0;
4046}
4047
4048static int stac9200_parse_auto_config(struct hda_codec *codec)
4049{
4050	struct sigmatel_spec *spec = codec->spec;
4051	int err;
4052
4053	if ((err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL)) < 0)
4054		return err;
4055
4056	if ((err = stac92xx_auto_create_analog_input_ctls(codec, &spec->autocfg)) < 0)
4057		return err;
4058
4059	if ((err = stac9200_auto_create_hp_ctls(codec, &spec->autocfg)) < 0)
4060		return err;
4061
4062	if ((err = stac9200_auto_create_lfe_ctls(codec, &spec->autocfg)) < 0)
4063		return err;
4064
4065	if (spec->num_muxes > 0) {
4066		err = stac92xx_auto_create_mux_input_ctls(codec);
4067		if (err < 0)
4068			return err;
4069	}
4070
4071	err = stac92xx_add_input_source(spec);
4072	if (err < 0)
4073		return err;
4074
4075	if (spec->autocfg.dig_outs)
4076		spec->multiout.dig_out_nid = 0x05;
4077	if (spec->autocfg.dig_in_pin)
4078		spec->dig_in_nid = 0x04;
4079
4080	if (spec->kctls.list)
4081		spec->mixers[spec->num_mixers++] = spec->kctls.list;
4082
4083	spec->input_mux = &spec->private_imux;
4084	spec->dinput_mux = &spec->private_dimux;
4085
4086	return 1;
4087}
4088
4089/*
4090 * Early 2006 Intel Macintoshes with STAC9220X5 codecs seem to have a
4091 * funky external mute control using GPIO pins.
4092 */
4093
4094static void stac_gpio_set(struct hda_codec *codec, unsigned int mask,
4095			  unsigned int dir_mask, unsigned int data)
4096{
4097	unsigned int gpiostate, gpiomask, gpiodir;
4098
4099	snd_printdd("%s msk %x dir %x gpio %x\n", __func__, mask, dir_mask, data);
4100
4101	gpiostate = snd_hda_codec_read(codec, codec->afg, 0,
4102				       AC_VERB_GET_GPIO_DATA, 0);
4103	gpiostate = (gpiostate & ~dir_mask) | (data & dir_mask);
4104
4105	gpiomask = snd_hda_codec_read(codec, codec->afg, 0,
4106				      AC_VERB_GET_GPIO_MASK, 0);
4107	gpiomask |= mask;
4108
4109	gpiodir = snd_hda_codec_read(codec, codec->afg, 0,
4110				     AC_VERB_GET_GPIO_DIRECTION, 0);
4111	gpiodir |= dir_mask;
4112
4113	/* Configure GPIOx as CMOS */
4114	snd_hda_codec_write(codec, codec->afg, 0, 0x7e7, 0);
4115
4116	snd_hda_codec_write(codec, codec->afg, 0,
4117			    AC_VERB_SET_GPIO_MASK, gpiomask);
4118	snd_hda_codec_read(codec, codec->afg, 0,
4119			   AC_VERB_SET_GPIO_DIRECTION, gpiodir); /* sync */
4120
4121	msleep(1);
4122
4123	snd_hda_codec_read(codec, codec->afg, 0,
4124			   AC_VERB_SET_GPIO_DATA, gpiostate); /* sync */
4125}
4126
4127static int stac92xx_add_jack(struct hda_codec *codec,
4128		hda_nid_t nid, int type)
4129{
4130#ifdef CONFIG_SND_HDA_INPUT_JACK
4131	int def_conf = snd_hda_codec_get_pincfg(codec, nid);
4132	int connectivity = get_defcfg_connect(def_conf);
4133	char name[32];
4134	int err;
4135
4136	if (connectivity && connectivity != AC_JACK_PORT_FIXED)
4137		return 0;
4138
4139	snprintf(name, sizeof(name), "%s at %s %s Jack",
4140		snd_hda_get_jack_type(def_conf),
4141		snd_hda_get_jack_connectivity(def_conf),
4142		snd_hda_get_jack_location(def_conf));
4143
4144	err = snd_hda_input_jack_add(codec, nid, type, name);
4145	if (err < 0)
4146		return err;
4147#endif /* CONFIG_SND_HDA_INPUT_JACK */
4148	return 0;
4149}
4150
4151static int stac_add_event(struct sigmatel_spec *spec, hda_nid_t nid,
4152			  unsigned char type, int data)
4153{
4154	struct sigmatel_event *event;
4155
4156	snd_array_init(&spec->events, sizeof(*event), 32);
4157	event = snd_array_new(&spec->events);
4158	if (!event)
4159		return -ENOMEM;
4160	event->nid = nid;
4161	event->type = type;
4162	event->tag = spec->events.used;
4163	event->data = data;
4164
4165	return event->tag;
4166}
4167
4168static struct sigmatel_event *stac_get_event(struct hda_codec *codec,
4169					     hda_nid_t nid)
4170{
4171	struct sigmatel_spec *spec = codec->spec;
4172	struct sigmatel_event *event = spec->events.list;
4173	int i;
4174
4175	for (i = 0; i < spec->events.used; i++, event++) {
4176		if (event->nid == nid)
4177			return event;
4178	}
4179	return NULL;
4180}
4181
4182static struct sigmatel_event *stac_get_event_from_tag(struct hda_codec *codec,
4183						      unsigned char tag)
4184{
4185	struct sigmatel_spec *spec = codec->spec;
4186	struct sigmatel_event *event = spec->events.list;
4187	int i;
4188
4189	for (i = 0; i < spec->events.used; i++, event++) {
4190		if (event->tag == tag)
4191			return event;
4192	}
4193	return NULL;
4194}
4195
4196/* check if given nid is a valid pin and no other events are assigned
4197 * to it.  If OK, assign the event, set the unsol flag, and returns 1.
4198 * Otherwise, returns zero.
4199 */
4200static int enable_pin_detect(struct hda_codec *codec, hda_nid_t nid,
4201			     unsigned int type)
4202{
4203	struct sigmatel_event *event;
4204	int tag;
4205
4206	if (!is_jack_detectable(codec, nid))
4207		return 0;
4208	event = stac_get_event(codec, nid);
4209	if (event) {
4210		if (event->type != type)
4211			return 0;
4212		tag = event->tag;
4213	} else {
4214		tag = stac_add_event(codec->spec, nid, type, 0);
4215		if (tag < 0)
4216			return 0;
4217	}
4218	snd_hda_codec_write_cache(codec, nid, 0,
4219				  AC_VERB_SET_UNSOLICITED_ENABLE,
4220				  AC_USRSP_EN | tag);
4221	return 1;
4222}
4223
4224static int is_nid_hp_pin(struct auto_pin_cfg *cfg, hda_nid_t nid)
4225{
4226	int i;
4227	for (i = 0; i < cfg->hp_outs; i++)
4228		if (cfg->hp_pins[i] == nid)
4229			return 1; /* nid is a HP-Out */
4230
4231	return 0; /* nid is not a HP-Out */
4232};
4233
4234static void stac92xx_power_down(struct hda_codec *codec)
4235{
4236	struct sigmatel_spec *spec = codec->spec;
4237
4238	/* power down inactive DACs */
4239	const hda_nid_t *dac;
4240	for (dac = spec->dac_list; *dac; dac++)
4241		if (!check_all_dac_nids(spec, *dac))
4242			snd_hda_codec_write(codec, *dac, 0,
4243					AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
4244}
4245
4246static void stac_toggle_power_map(struct hda_codec *codec, hda_nid_t nid,
4247				  int enable);
4248
4249static inline int get_int_hint(struct hda_codec *codec, const char *key,
4250			       int *valp)
4251{
4252	const char *p;
4253	p = snd_hda_get_hint(codec, key);
4254	if (p) {
4255		unsigned long val;
4256		if (!strict_strtoul(p, 0, &val)) {
4257			*valp = val;
4258			return 1;
4259		}
4260	}
4261	return 0;
4262}
4263
4264/* override some hints from the hwdep entry */
4265static void stac_store_hints(struct hda_codec *codec)
4266{
4267	struct sigmatel_spec *spec = codec->spec;
4268	int val;
4269
4270	val = snd_hda_get_bool_hint(codec, "hp_detect");
4271	if (val >= 0)
4272		spec->hp_detect = val;
4273	if (get_int_hint(codec, "gpio_mask", &spec->gpio_mask)) {
4274		spec->eapd_mask = spec->gpio_dir = spec->gpio_data =
4275			spec->gpio_mask;
4276	}
4277	if (get_int_hint(codec, "gpio_dir", &spec->gpio_dir))
4278		spec->gpio_mask &= spec->gpio_mask;
4279	if (get_int_hint(codec, "gpio_data", &spec->gpio_data))
4280		spec->gpio_dir &= spec->gpio_mask;
4281	if (get_int_hint(codec, "eapd_mask", &spec->eapd_mask))
4282		spec->eapd_mask &= spec->gpio_mask;
4283	if (get_int_hint(codec, "gpio_mute", &spec->gpio_mute))
4284		spec->gpio_mute &= spec->gpio_mask;
4285	val = snd_hda_get_bool_hint(codec, "eapd_switch");
4286	if (val >= 0)
4287		spec->eapd_switch = val;
4288	get_int_hint(codec, "gpio_led_polarity", &spec->gpio_led_polarity);
4289	if (get_int_hint(codec, "gpio_led", &spec->gpio_led)) {
4290		if (spec->gpio_led <= 8) {
4291			spec->gpio_mask |= spec->gpio_led;
4292			spec->gpio_dir |= spec->gpio_led;
4293			if (spec->gpio_led_polarity)
4294				spec->gpio_data |= spec->gpio_led;
4295		}
4296	}
4297}
4298
4299static int stac92xx_init(struct hda_codec *codec)
4300{
4301	struct sigmatel_spec *spec = codec->spec;
4302	struct auto_pin_cfg *cfg = &spec->autocfg;
4303	unsigned int gpio;
4304	int i;
4305
4306	snd_hda_sequence_write(codec, spec->init);
4307
4308	/* power down adcs initially */
4309	if (spec->powerdown_adcs)
4310		for (i = 0; i < spec->num_adcs; i++)
4311			snd_hda_codec_write(codec,
4312				spec->adc_nids[i], 0,
4313				AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
4314
4315	/* override some hints */
4316	stac_store_hints(codec);
4317
4318	/* set up GPIO */
4319	gpio = spec->gpio_data;
4320	/* turn on EAPD statically when spec->eapd_switch isn't set.
4321	 * otherwise, unsol event will turn it on/off dynamically
4322	 */
4323	if (!spec->eapd_switch)
4324		gpio |= spec->eapd_mask;
4325	stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, gpio);
4326
4327	/* set up pins */
4328	if (spec->hp_detect) {
4329		/* Enable unsolicited responses on the HP widget */
4330		for (i = 0; i < cfg->hp_outs; i++) {
4331			hda_nid_t nid = cfg->hp_pins[i];
4332			enable_pin_detect(codec, nid, STAC_HP_EVENT);
4333		}
4334		if (cfg->line_out_type == AUTO_PIN_LINE_OUT &&
4335		    cfg->speaker_outs > 0) {
4336			/* enable pin-detect for line-outs as well */
4337			for (i = 0; i < cfg->line_outs; i++) {
4338				hda_nid_t nid = cfg->line_out_pins[i];
4339				enable_pin_detect(codec, nid, STAC_LO_EVENT);
4340			}
4341		}
4342
4343		/* force to enable the first line-out; the others are set up
4344		 * in unsol_event
4345		 */
4346		stac92xx_auto_set_pinctl(codec, spec->autocfg.line_out_pins[0],
4347				AC_PINCTL_OUT_EN);
4348		/* fake event to set up pins */
4349		if (cfg->hp_pins[0])
4350			stac_issue_unsol_event(codec, cfg->hp_pins[0]);
4351		else if (cfg->line_out_pins[0])
4352			stac_issue_unsol_event(codec, cfg->line_out_pins[0]);
4353	} else {
4354		stac92xx_auto_init_multi_out(codec);
4355		stac92xx_auto_init_hp_out(codec);
4356		for (i = 0; i < cfg->hp_outs; i++)
4357			stac_toggle_power_map(codec, cfg->hp_pins[i], 1);
4358	}
4359	if (spec->auto_mic) {
4360		/* initialize connection to analog input */
4361		if (spec->dmux_nids)
4362			snd_hda_codec_write_cache(codec, spec->dmux_nids[0], 0,
4363					  AC_VERB_SET_CONNECT_SEL, 0);
4364		if (enable_pin_detect(codec, spec->ext_mic.pin, STAC_MIC_EVENT))
4365			stac_issue_unsol_event(codec, spec->ext_mic.pin);
4366		if (enable_pin_detect(codec, spec->dock_mic.pin,
4367		    STAC_MIC_EVENT))
4368			stac_issue_unsol_event(codec, spec->dock_mic.pin);
4369	}
4370	for (i = 0; i < cfg->num_inputs; i++) {
4371		hda_nid_t nid = cfg->inputs[i].pin;
4372		int type = cfg->inputs[i].type;
4373		unsigned int pinctl, conf;
4374		if (type == AUTO_PIN_MIC) {
4375			/* for mic pins, force to initialize */
4376			pinctl = stac92xx_get_default_vref(codec, nid);
4377			pinctl |= AC_PINCTL_IN_EN;
4378			stac92xx_auto_set_pinctl(codec, nid, pinctl);
4379		} else {
4380			pinctl = snd_hda_codec_read(codec, nid, 0,
4381					AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4382			/* if PINCTL already set then skip */
4383			/* Also, if both INPUT and OUTPUT are set,
4384			 * it must be a BIOS bug; need to override, too
4385			 */
4386			if (!(pinctl & AC_PINCTL_IN_EN) ||
4387			    (pinctl & AC_PINCTL_OUT_EN)) {
4388				pinctl &= ~AC_PINCTL_OUT_EN;
4389				pinctl |= AC_PINCTL_IN_EN;
4390				stac92xx_auto_set_pinctl(codec, nid, pinctl);
4391			}
4392		}
4393		conf = snd_hda_codec_get_pincfg(codec, nid);
4394		if (get_defcfg_connect(conf) != AC_JACK_PORT_FIXED) {
4395			if (enable_pin_detect(codec, nid, STAC_INSERT_EVENT))
4396				stac_issue_unsol_event(codec, nid);
4397		}
4398	}
4399	for (i = 0; i < spec->num_dmics; i++)
4400		stac92xx_auto_set_pinctl(codec, spec->dmic_nids[i],
4401					AC_PINCTL_IN_EN);
4402	if (cfg->dig_out_pins[0])
4403		stac92xx_auto_set_pinctl(codec, cfg->dig_out_pins[0],
4404					 AC_PINCTL_OUT_EN);
4405	if (cfg->dig_in_pin)
4406		stac92xx_auto_set_pinctl(codec, cfg->dig_in_pin,
4407					 AC_PINCTL_IN_EN);
4408	for (i = 0; i < spec->num_pwrs; i++)  {
4409		hda_nid_t nid = spec->pwr_nids[i];
4410		int pinctl, def_conf;
4411
4412		/* power on when no jack detection is available */
4413		if (!spec->hp_detect) {
4414			stac_toggle_power_map(codec, nid, 1);
4415			continue;
4416		}
4417
4418		if (is_nid_hp_pin(cfg, nid))
4419			continue; /* already has an unsol event */
4420
4421		pinctl = snd_hda_codec_read(codec, nid, 0,
4422					    AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4423		/* outputs are only ports capable of power management
4424		 * any attempts on powering down a input port cause the
4425		 * referenced VREF to act quirky.
4426		 */
4427		if (pinctl & AC_PINCTL_IN_EN) {
4428			stac_toggle_power_map(codec, nid, 1);
4429			continue;
4430		}
4431		def_conf = snd_hda_codec_get_pincfg(codec, nid);
4432		def_conf = get_defcfg_connect(def_conf);
4433		/* skip any ports that don't have jacks since presence
4434 		 * detection is useless */
4435		if (def_conf != AC_JACK_PORT_COMPLEX) {
4436			if (def_conf != AC_JACK_PORT_NONE)
4437				stac_toggle_power_map(codec, nid, 1);
4438			continue;
4439		}
4440		if (enable_pin_detect(codec, nid, STAC_PWR_EVENT))
4441			stac_issue_unsol_event(codec, nid);
4442	}
4443
4444	/* sync mute LED */
4445	if (spec->gpio_led)
4446		hda_call_check_power_status(codec, 0x01);
4447	if (spec->dac_list)
4448		stac92xx_power_down(codec);
4449	return 0;
4450}
4451
4452static void stac92xx_free_kctls(struct hda_codec *codec)
4453{
4454	struct sigmatel_spec *spec = codec->spec;
4455
4456	if (spec->kctls.list) {
4457		struct snd_kcontrol_new *kctl = spec->kctls.list;
4458		int i;
4459		for (i = 0; i < spec->kctls.used; i++)
4460			kfree(kctl[i].name);
4461	}
4462	snd_array_free(&spec->kctls);
4463}
4464
4465static void stac92xx_shutup_pins(struct hda_codec *codec)
4466{
4467	unsigned int i, def_conf;
4468
4469	if (codec->bus->shutdown)
4470		return;
4471	for (i = 0; i < codec->init_pins.used; i++) {
4472		struct hda_pincfg *pin = snd_array_elem(&codec->init_pins, i);
4473		def_conf = snd_hda_codec_get_pincfg(codec, pin->nid);
4474		if (get_defcfg_connect(def_conf) != AC_JACK_PORT_NONE)
4475			snd_hda_codec_write(codec, pin->nid, 0,
4476				    AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
4477	}
4478}
4479
4480static void stac92xx_shutup(struct hda_codec *codec)
4481{
4482	struct sigmatel_spec *spec = codec->spec;
4483
4484	stac92xx_shutup_pins(codec);
4485
4486	if (spec->eapd_mask)
4487		stac_gpio_set(codec, spec->gpio_mask,
4488				spec->gpio_dir, spec->gpio_data &
4489				~spec->eapd_mask);
4490}
4491
4492static void stac92xx_free(struct hda_codec *codec)
4493{
4494	struct sigmatel_spec *spec = codec->spec;
4495
4496	if (! spec)
4497		return;
4498
4499	stac92xx_shutup(codec);
4500	snd_hda_input_jack_free(codec);
4501	snd_array_free(&spec->events);
4502
4503	kfree(spec);
4504	snd_hda_detach_beep_device(codec);
4505}
4506
4507static void stac92xx_set_pinctl(struct hda_codec *codec, hda_nid_t nid,
4508				unsigned int flag)
4509{
4510	unsigned int old_ctl, pin_ctl;
4511
4512	pin_ctl = snd_hda_codec_read(codec, nid,
4513			0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00);
4514
4515	if (pin_ctl & AC_PINCTL_IN_EN) {
4516		/*
4517		 * we need to check the current set-up direction of
4518		 * shared input pins since they can be switched via
4519		 * "xxx as Output" mixer switch
4520		 */
4521		struct sigmatel_spec *spec = codec->spec;
4522		if (nid == spec->line_switch || nid == spec->mic_switch)
4523			return;
4524	}
4525
4526	old_ctl = pin_ctl;
4527	/* if setting pin direction bits, clear the current
4528	   direction bits first */
4529	if (flag & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN))
4530		pin_ctl &= ~(AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN);
4531	
4532	pin_ctl |= flag;
4533	if (old_ctl != pin_ctl)
4534		snd_hda_codec_write_cache(codec, nid, 0,
4535					  AC_VERB_SET_PIN_WIDGET_CONTROL,
4536					  pin_ctl);
4537}
4538
4539static void stac92xx_reset_pinctl(struct hda_codec *codec, hda_nid_t nid,
4540				  unsigned int flag)
4541{
4542	unsigned int pin_ctl = snd_hda_codec_read(codec, nid,
4543			0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00);
4544	if (pin_ctl & flag)
4545		snd_hda_codec_write_cache(codec, nid, 0,
4546					  AC_VERB_SET_PIN_WIDGET_CONTROL,
4547					  pin_ctl & ~flag);
4548}
4549
4550static inline int get_pin_presence(struct hda_codec *codec, hda_nid_t nid)
4551{
4552	if (!nid)
4553		return 0;
4554	return snd_hda_jack_detect(codec, nid);
4555}
4556
4557static void stac92xx_line_out_detect(struct hda_codec *codec,
4558				     int presence)
4559{
4560	struct sigmatel_spec *spec = codec->spec;
4561	struct auto_pin_cfg *cfg = &spec->autocfg;
4562	int i;
4563
4564	for (i = 0; i < cfg->line_outs; i++) {
4565		if (presence)
4566			break;
4567		presence = get_pin_presence(codec, cfg->line_out_pins[i]);
4568		if (presence) {
4569			unsigned int pinctl;
4570			pinctl = snd_hda_codec_read(codec,
4571						    cfg->line_out_pins[i], 0,
4572					    AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4573			if (pinctl & AC_PINCTL_IN_EN)
4574				presence = 0; /* mic- or line-input */
4575		}
4576	}
4577
4578	if (presence) {
4579		/* disable speakers */
4580		for (i = 0; i < cfg->speaker_outs; i++)
4581			stac92xx_reset_pinctl(codec, cfg->speaker_pins[i],
4582						AC_PINCTL_OUT_EN);
4583		if (spec->eapd_mask && spec->eapd_switch)
4584			stac_gpio_set(codec, spec->gpio_mask,
4585				spec->gpio_dir, spec->gpio_data &
4586				~spec->eapd_mask);
4587	} else {
4588		/* enable speakers */
4589		for (i = 0; i < cfg->speaker_outs; i++)
4590			stac92xx_set_pinctl(codec, cfg->speaker_pins[i],
4591						AC_PINCTL_OUT_EN);
4592		if (spec->eapd_mask && spec->eapd_switch)
4593			stac_gpio_set(codec, spec->gpio_mask,
4594				spec->gpio_dir, spec->gpio_data |
4595				spec->eapd_mask);
4596	}
4597} 
4598
4599/* return non-zero if the hp-pin of the given array index isn't
4600 * a jack-detection target
4601 */
4602static int no_hp_sensing(struct sigmatel_spec *spec, int i)
4603{
4604	struct auto_pin_cfg *cfg = &spec->autocfg;
4605
4606	/* ignore sensing of shared line and mic jacks */
4607	if (cfg->hp_pins[i] == spec->line_switch)
4608		return 1;
4609	if (cfg->hp_pins[i] == spec->mic_switch)
4610		return 1;
4611	/* ignore if the pin is set as line-out */
4612	if (cfg->hp_pins[i] == spec->hp_switch)
4613		return 1;
4614	return 0;
4615}
4616
4617static void stac92xx_hp_detect(struct hda_codec *codec)
4618{
4619	struct sigmatel_spec *spec = codec->spec;
4620	struct auto_pin_cfg *cfg = &spec->autocfg;
4621	int i, presence;
4622
4623	presence = 0;
4624	if (spec->gpio_mute)
4625		presence = !(snd_hda_codec_read(codec, codec->afg, 0,
4626			AC_VERB_GET_GPIO_DATA, 0) & spec->gpio_mute);
4627
4628	for (i = 0; i < cfg->hp_outs; i++) {
4629		if (presence)
4630			break;
4631		if (no_hp_sensing(spec, i))
4632			continue;
4633		presence = get_pin_presence(codec, cfg->hp_pins[i]);
4634		if (presence) {
4635			unsigned int pinctl;
4636			pinctl = snd_hda_codec_read(codec, cfg->hp_pins[i], 0,
4637					    AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4638			if (pinctl & AC_PINCTL_IN_EN)
4639				presence = 0; /* mic- or line-input */
4640		}
4641	}
4642
4643	if (presence) {
4644		/* disable lineouts */
4645		if (spec->hp_switch)
4646			stac92xx_reset_pinctl(codec, spec->hp_switch,
4647					      AC_PINCTL_OUT_EN);
4648		for (i = 0; i < cfg->line_outs; i++)
4649			stac92xx_reset_pinctl(codec, cfg->line_out_pins[i],
4650						AC_PINCTL_OUT_EN);
4651	} else {
4652		/* enable lineouts */
4653		if (spec->hp_switch)
4654			stac92xx_set_pinctl(codec, spec->hp_switch,
4655					    AC_PINCTL_OUT_EN);
4656		for (i = 0; i < cfg->line_outs; i++)
4657			stac92xx_set_pinctl(codec, cfg->line_out_pins[i],
4658						AC_PINCTL_OUT_EN);
4659	}
4660	stac92xx_line_out_detect(codec, presence);
4661	/* toggle hp outs */
4662	for (i = 0; i < cfg->hp_outs; i++) {
4663		unsigned int val = AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN;
4664		if (no_hp_sensing(spec, i))
4665			continue;
4666		if (presence)
4667			stac92xx_set_pinctl(codec, cfg->hp_pins[i], val);
4668#if 0 /* FIXME */
4669/* Resetting the pinctl like below may lead to (a sort of) regressions
4670 * on some devices since they use the HP pin actually for line/speaker
4671 * outs although the default pin config shows a different pin (that is
4672 * wrong and useless).
4673 *
4674 * So, it's basically a problem of default pin configs, likely a BIOS issue.
4675 * But, disabling the code below just works around it, and I'm too tired of
4676 * bug reports with such devices... 
4677 */
4678		else
4679			stac92xx_reset_pinctl(codec, cfg->hp_pins[i], val);
4680#endif /* FIXME */
4681	}
4682} 
4683
4684static void stac_toggle_power_map(struct hda_codec *codec, hda_nid_t nid,
4685				  int enable)
4686{
4687	struct sigmatel_spec *spec = codec->spec;
4688	unsigned int idx, val;
4689
4690	for (idx = 0; idx < spec->num_pwrs; idx++) {
4691		if (spec->pwr_nids[idx] == nid)
4692			break;
4693	}
4694	if (idx >= spec->num_pwrs)
4695		return;
4696
4697	/* several codecs have two power down bits */
4698	if (spec->pwr_mapping)
4699		idx = spec->pwr_mapping[idx];
4700	else
4701		idx = 1 << idx;
4702
4703	val = snd_hda_codec_read(codec, codec->afg, 0, 0x0fec, 0x0) & 0xff;
4704	if (enable)
4705		val &= ~idx;
4706	else
4707		val |= idx;
4708
4709	/* power down unused output ports */
4710	snd_hda_codec_write(codec, codec->afg, 0, 0x7ec, val);
4711}
4712
4713static void stac92xx_pin_sense(struct hda_codec *codec, hda_nid_t nid)
4714{
4715	stac_toggle_power_map(codec, nid, get_pin_presence(codec, nid));
4716}
4717
4718/* get the pin connection (fixed, none, etc) */
4719static unsigned int stac_get_defcfg_connect(struct hda_codec *codec, int idx)
4720{
4721	struct sigmatel_spec *spec = codec->spec;
4722	unsigned int cfg;
4723
4724	cfg = snd_hda_codec_get_pincfg(codec, spec->pin_nids[idx]);
4725	return get_defcfg_connect(cfg);
4726}
4727
4728static int stac92xx_connected_ports(struct hda_codec *codec,
4729				    const hda_nid_t *nids, int num_nids)
4730{
4731	struct sigmatel_spec *spec = codec->spec;
4732	int idx, num;
4733	unsigned int def_conf;
4734
4735	for (num = 0; num < num_nids; num++) {
4736		for (idx = 0; idx < spec->num_pins; idx++)
4737			if (spec->pin_nids[idx] == nids[num])
4738				break;
4739		if (idx >= spec->num_pins)
4740			break;
4741		def_conf = stac_get_defcfg_connect(codec, idx);
4742		if (def_conf == AC_JACK_PORT_NONE)
4743			break;
4744	}
4745	return num;
4746}
4747
4748static void stac92xx_mic_detect(struct hda_codec *codec)
4749{
4750	struct sigmatel_spec *spec = codec->spec;
4751	struct sigmatel_mic_route *mic;
4752
4753	if (get_pin_presence(codec, spec->ext_mic.pin))
4754		mic = &spec->ext_mic;
4755	else if (get_pin_presence(codec, spec->dock_mic.pin))
4756		mic = &spec->dock_mic;
4757	else
4758		mic = &spec->int_mic;
4759	if (mic->dmux_idx >= 0)
4760		snd_hda_codec_write_cache(codec, spec->dmux_nids[0], 0,
4761					  AC_VERB_SET_CONNECT_SEL,
4762					  mic->dmux_idx);
4763	if (mic->mux_idx >= 0)
4764		snd_hda_codec_write_cache(codec, spec->mux_nids[0], 0,
4765					  AC_VERB_SET_CONNECT_SEL,
4766					  mic->mux_idx);
4767}
4768
4769static void stac_issue_unsol_event(struct hda_codec *codec, hda_nid_t nid)
4770{
4771	struct sigmatel_event *event = stac_get_event(codec, nid);
4772	if (!event)
4773		return;
4774	codec->patch_ops.unsol_event(codec, (unsigned)event->tag << 26);
4775}
4776
4777static void stac92xx_unsol_event(struct hda_codec *codec, unsigned int res)
4778{
4779	struct sigmatel_spec *spec = codec->spec;
4780	struct sigmatel_event *event;
4781	int tag, data;
4782
4783	tag = (res >> 26) & 0x7f;
4784	event = stac_get_event_from_tag(codec, tag);
4785	if (!event)
4786		return;
4787
4788	switch (event->type) {
4789	case STAC_HP_EVENT:
4790	case STAC_LO_EVENT:
4791		stac92xx_hp_detect(codec);
4792		break;
4793	case STAC_MIC_EVENT:
4794		stac92xx_mic_detect(codec);
4795		break;
4796	}
4797
4798	switch (event->type) {
4799	case STAC_HP_EVENT:
4800	case STAC_LO_EVENT:
4801	case STAC_MIC_EVENT:
4802	case STAC_INSERT_EVENT:
4803	case STAC_PWR_EVENT:
4804		if (spec->num_pwrs > 0)
4805			stac92xx_pin_sense(codec, event->nid);
4806		snd_hda_input_jack_report(codec, event->nid);
4807
4808		switch (codec->subsystem_id) {
4809		case 0x103c308f:
4810			if (event->nid == 0xb) {
4811				int pin = AC_PINCTL_IN_EN;
4812
4813				if (get_pin_presence(codec, 0xa)
4814						&& get_pin_presence(codec, 0xb))
4815					pin |= AC_PINCTL_VREF_80;
4816				if (!get_pin_presence(codec, 0xb))
4817					pin |= AC_PINCTL_VREF_80;
4818
4819				/* toggle VREF state based on mic + hp pin
4820				 * status
4821				 */
4822				stac92xx_auto_set_pinctl(codec, 0x0a, pin);
4823			}
4824		}
4825		break;
4826	case STAC_VREF_EVENT:
4827		data = snd_hda_codec_read(codec, codec->afg, 0,
4828					  AC_VERB_GET_GPIO_DATA, 0);
4829		/* toggle VREF state based on GPIOx status */
4830		snd_hda_codec_write(codec, codec->afg, 0, 0x7e0,
4831				    !!(data & (1 << event->data)));
4832		break;
4833	}
4834}
4835
4836static int hp_blike_system(u32 subsystem_id);
4837
4838static void set_hp_led_gpio(struct hda_codec *codec)
4839{
4840	struct sigmatel_spec *spec = codec->spec;
4841	unsigned int gpio;
4842
4843	if (spec->gpio_led)
4844		return;
4845
4846	gpio = snd_hda_param_read(codec, codec->afg, AC_PAR_GPIO_CAP);
4847	gpio &= AC_GPIO_IO_COUNT;
4848	if (gpio > 3)
4849		spec->gpio_led = 0x08; /* GPIO 3 */
4850	else
4851		spec->gpio_led = 0x01; /* GPIO 0 */
4852}
4853
4854/*
4855 * This method searches for the mute LED GPIO configuration
4856 * provided as OEM string in SMBIOS. The format of that string
4857 * is HP_Mute_LED_P_G or HP_Mute_LED_P
4858 * where P can be 0 or 1 and defines mute LED GPIO control state (low/high)
4859 * that corresponds to the NOT muted state of the master volume
4860 * and G is the index of the GPIO to use as the mute LED control (0..9)
4861 * If _G portion is missing it is assigned based on the codec ID
4862 *
4863 * So, HP B-series like systems may have HP_Mute_LED_0 (current models)
4864 * or  HP_Mute_LED_0_3 (future models) OEM SMBIOS strings
4865 *
4866 *
4867 * The dv-series laptops don't seem to have the HP_Mute_LED* strings in
4868 * SMBIOS - at least the ones I have seen do not have them - which include
4869 * my own system (HP Pavilion dv6-1110ax) and my cousin's
4870 * HP Pavilion dv9500t CTO.
4871 * Need more information on whether it is true across the entire series.
4872 * -- kunal
4873 */
4874static int find_mute_led_gpio(struct hda_codec *codec, int default_polarity)
4875{
4876	struct sigmatel_spec *spec = codec->spec;
4877	const struct dmi_device *dev = NULL;
4878
4879	if ((codec->subsystem_id >> 16) == PCI_VENDOR_ID_HP) {
4880		while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING,
4881								NULL, dev))) {
4882			if (sscanf(dev->name, "HP_Mute_LED_%d_%x",
4883				  &spec->gpio_led_polarity,
4884				  &spec->gpio_led) == 2) {
4885				if (spec->gpio_led < 4)
4886					spec->gpio_led = 1 << spec->gpio_led;
4887				return 1;
4888			}
4889			if (sscanf(dev->name, "HP_Mute_LED_%d",
4890				  &spec->gpio_led_polarity) == 1) {
4891				set_hp_led_gpio(codec);
4892				return 1;
4893			}
4894		}
4895
4896		/*
4897		 * Fallback case - if we don't find the DMI strings,
4898		 * we statically set the GPIO - if not a B-series system.
4899		 */
4900		if (!hp_blike_system(codec->subsystem_id)) {
4901			set_hp_led_gpio(codec);
4902			spec->gpio_led_polarity = default_polarity;
4903			return 1;
4904		}
4905	}
4906	return 0;
4907}
4908
4909static int hp_blike_system(u32 subsystem_id)
4910{
4911	switch (subsystem_id) {
4912	case 0x103c1520:
4913	case 0x103c1521:
4914	case 0x103c1523:
4915	case 0x103c1524:
4916	case 0x103c1525:
4917	case 0x103c1722:
4918	case 0x103c1723:
4919	case 0x103c1724:
4920	case 0x103c1725:
4921	case 0x103c1726:
4922	case 0x103c1727:
4923	case 0x103c1728:
4924	case 0x103c1729:
4925	case 0x103c172a:
4926	case 0x103c172b:
4927	case 0x103c307e:
4928	case 0x103c307f:
4929	case 0x103c3080:
4930	case 0x103c3081:
4931	case 0x103c7007:
4932	case 0x103c7008:
4933		return 1;
4934	}
4935	return 0;
4936}
4937
4938#ifdef CONFIG_PROC_FS
4939static void stac92hd_proc_hook(struct snd_info_buffer *buffer,
4940			       struct hda_codec *codec, hda_nid_t nid)
4941{
4942	if (nid == codec->afg)
4943		snd_iprintf(buffer, "Power-Map: 0x%02x\n", 
4944			    snd_hda_codec_read(codec, nid, 0, 0x0fec, 0x0));
 
4945}
4946
4947static void analog_loop_proc_hook(struct snd_info_buffer *buffer,
4948				  struct hda_codec *codec,
4949				  unsigned int verb)
4950{
4951	snd_iprintf(buffer, "Analog Loopback: 0x%02x\n",
4952		    snd_hda_codec_read(codec, codec->afg, 0, verb, 0));
4953}
4954
4955/* stac92hd71bxx, stac92hd73xx */
4956static void stac92hd7x_proc_hook(struct snd_info_buffer *buffer,
4957				 struct hda_codec *codec, hda_nid_t nid)
4958{
4959	stac92hd_proc_hook(buffer, codec, nid);
4960	if (nid == codec->afg)
4961		analog_loop_proc_hook(buffer, codec, 0xfa0);
4962}
4963
4964static void stac9205_proc_hook(struct snd_info_buffer *buffer,
4965			       struct hda_codec *codec, hda_nid_t nid)
4966{
4967	if (nid == codec->afg)
4968		analog_loop_proc_hook(buffer, codec, 0xfe0);
4969}
4970
4971static void stac927x_proc_hook(struct snd_info_buffer *buffer,
4972			       struct hda_codec *codec, hda_nid_t nid)
4973{
4974	if (nid == codec->afg)
4975		analog_loop_proc_hook(buffer, codec, 0xfeb);
4976}
4977#else
4978#define stac92hd_proc_hook	NULL
4979#define stac92hd7x_proc_hook	NULL
4980#define stac9205_proc_hook	NULL
4981#define stac927x_proc_hook	NULL
4982#endif
4983
4984#ifdef CONFIG_PM
4985static int stac92xx_resume(struct hda_codec *codec)
4986{
4987	struct sigmatel_spec *spec = codec->spec;
4988
4989	stac92xx_init(codec);
4990	snd_hda_codec_resume_amp(codec);
4991	snd_hda_codec_resume_cache(codec);
4992	/* fake event to set up pins again to override cached values */
4993	if (spec->hp_detect) {
4994		if (spec->autocfg.hp_pins[0])
4995			stac_issue_unsol_event(codec, spec->autocfg.hp_pins[0]);
4996		else if (spec->autocfg.line_out_pins[0])
4997			stac_issue_unsol_event(codec,
4998					       spec->autocfg.line_out_pins[0]);
4999	}
5000	return 0;
5001}
5002
5003static int stac92xx_suspend(struct hda_codec *codec, pm_message_t state)
5004{
5005	stac92xx_shutup(codec);
5006	return 0;
5007}
5008
5009#ifdef CONFIG_SND_HDA_POWER_SAVE
5010static int stac92xx_pre_resume(struct hda_codec *codec)
5011{
5012	struct sigmatel_spec *spec = codec->spec;
5013
5014	/* sync mute LED */
5015	if (spec->gpio_led) {
5016		if (spec->gpio_led <= 8) {
5017			stac_gpio_set(codec, spec->gpio_mask,
5018					spec->gpio_dir, spec->gpio_data);
5019		} else {
5020			stac_vrefout_set(codec,
5021					spec->gpio_led, spec->vref_led);
5022		}
5023	}
5024	return 0;
5025}
5026
5027static int stac92xx_post_suspend(struct hda_codec *codec)
5028{
5029	struct sigmatel_spec *spec = codec->spec;
5030	if (spec->gpio_led > 8) {
5031		/* with vref-out pin used for mute led control
5032		 * codec AFG is prevented from D3 state, but on
5033		 * system suspend it can (and should) be used
5034		 */
5035		snd_hda_codec_read(codec, codec->afg, 0,
5036				AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
5037	}
5038	return 0;
5039}
5040
5041static void stac92xx_set_power_state(struct hda_codec *codec, hda_nid_t fg,
5042				unsigned int power_state)
5043{
5044	unsigned int afg_power_state = power_state;
5045	struct sigmatel_spec *spec = codec->spec;
5046
5047	if (power_state == AC_PWRST_D3) {
5048		if (spec->gpio_led > 8) {
5049			/* with vref-out pin used for mute led control
5050			 * codec AFG is prevented from D3 state
5051			 */
5052			afg_power_state = AC_PWRST_D1;
5053		}
5054		/* this delay seems necessary to avoid click noise at power-down */
5055		msleep(100);
5056	}
5057	snd_hda_codec_read(codec, fg, 0, AC_VERB_SET_POWER_STATE,
5058			afg_power_state);
5059	snd_hda_codec_set_power_to_all(codec, fg, power_state, true);
5060}
5061
5062/*
5063 * For this feature CONFIG_SND_HDA_POWER_SAVE is needed
5064 * as mute LED state is updated in check_power_status hook
5065 */
5066static int stac92xx_update_led_status(struct hda_codec *codec)
5067{
5068	struct sigmatel_spec *spec = codec->spec;
5069	int i, num_ext_dacs, muted = 1;
5070	unsigned int muted_lvl, notmtd_lvl;
5071	hda_nid_t nid;
5072
5073	if (!spec->gpio_led)
5074		return 0;
5075
5076	for (i = 0; i < spec->multiout.num_dacs; i++) {
5077		nid = spec->multiout.dac_nids[i];
5078		if (!(snd_hda_codec_amp_read(codec, nid, 0, HDA_OUTPUT, 0) &
5079		      HDA_AMP_MUTE)) {
5080			muted = 0; /* something heard */
5081			break;
5082		}
5083	}
5084	if (muted && spec->multiout.hp_nid)
5085		if (!(snd_hda_codec_amp_read(codec,
5086				spec->multiout.hp_nid, 0, HDA_OUTPUT, 0) &
5087					HDA_AMP_MUTE)) {
5088			muted = 0; /* HP is not muted */
5089		}
5090	num_ext_dacs = ARRAY_SIZE(spec->multiout.extra_out_nid);
5091	for (i = 0; muted && i < num_ext_dacs; i++) {
5092		nid = spec->multiout.extra_out_nid[i];
5093		if (nid == 0)
5094			break;
5095		if (!(snd_hda_codec_amp_read(codec, nid, 0, HDA_OUTPUT, 0) &
5096		      HDA_AMP_MUTE)) {
5097			muted = 0; /* extra output is not muted */
5098		}
5099	}
5100	/*polarity defines *not* muted state level*/
5101	if (spec->gpio_led <= 8) {
5102		if (muted)
5103			spec->gpio_data &= ~spec->gpio_led; /* orange */
5104		else
5105			spec->gpio_data |= spec->gpio_led; /* white */
5106
5107		if (!spec->gpio_led_polarity) {
5108			/* LED state is inverted on these systems */
5109			spec->gpio_data ^= spec->gpio_led;
5110		}
5111		stac_gpio_set(codec, spec->gpio_mask,
5112				spec->gpio_dir, spec->gpio_data);
5113	} else {
5114		notmtd_lvl = spec->gpio_led_polarity ?
5115				AC_PINCTL_VREF_HIZ : AC_PINCTL_VREF_GRD;
5116		muted_lvl = spec->gpio_led_polarity ?
5117				AC_PINCTL_VREF_GRD : AC_PINCTL_VREF_HIZ;
5118		spec->vref_led = muted ? muted_lvl : notmtd_lvl;
5119		stac_vrefout_set(codec,	spec->gpio_led, spec->vref_led);
5120	}
5121	return 0;
5122}
5123
5124/*
5125 * use power check for controlling mute led of HP notebooks
5126 */
5127static int stac92xx_check_power_status(struct hda_codec *codec,
5128					      hda_nid_t nid)
5129{
5130	stac92xx_update_led_status(codec);
5131
 
 
 
 
 
 
 
 
5132	return 0;
5133}
5134#endif /* CONFIG_SND_HDA_POWER_SAVE */
5135#endif /* CONFIG_PM */
5136
5137static const struct hda_codec_ops stac92xx_patch_ops = {
5138	.build_controls = stac92xx_build_controls,
5139	.build_pcms = stac92xx_build_pcms,
5140	.init = stac92xx_init,
5141	.free = stac92xx_free,
5142	.unsol_event = stac92xx_unsol_event,
5143#ifdef CONFIG_PM
5144	.suspend = stac92xx_suspend,
5145	.resume = stac92xx_resume,
5146#endif
5147	.reboot_notify = stac92xx_shutup,
5148};
5149
5150static int patch_stac9200(struct hda_codec *codec)
5151{
5152	struct sigmatel_spec *spec;
5153	int err;
5154
5155	spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
5156	if (spec == NULL)
5157		return -ENOMEM;
5158
5159	codec->no_trigger_sense = 1;
5160	codec->spec = spec;
5161	spec->linear_tone_beep = 1;
5162	spec->num_pins = ARRAY_SIZE(stac9200_pin_nids);
5163	spec->pin_nids = stac9200_pin_nids;
5164	spec->board_config = snd_hda_check_board_config(codec, STAC_9200_MODELS,
5165							stac9200_models,
5166							stac9200_cfg_tbl);
5167	if (spec->board_config < 0)
5168		snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5169			    codec->chip_name);
5170	else
5171		stac92xx_set_config_regs(codec,
5172					 stac9200_brd_tbl[spec->board_config]);
5173
5174	spec->multiout.max_channels = 2;
5175	spec->multiout.num_dacs = 1;
5176	spec->multiout.dac_nids = stac9200_dac_nids;
5177	spec->adc_nids = stac9200_adc_nids;
5178	spec->mux_nids = stac9200_mux_nids;
5179	spec->num_muxes = 1;
5180	spec->num_dmics = 0;
5181	spec->num_adcs = 1;
5182	spec->num_pwrs = 0;
5183
5184	if (spec->board_config == STAC_9200_M4 ||
5185	    spec->board_config == STAC_9200_M4_2 ||
5186	    spec->board_config == STAC_9200_OQO)
5187		spec->init = stac9200_eapd_init;
5188	else
5189		spec->init = stac9200_core_init;
5190	spec->mixer = stac9200_mixer;
5191
5192	if (spec->board_config == STAC_9200_PANASONIC) {
5193		spec->gpio_mask = spec->gpio_dir = 0x09;
5194		spec->gpio_data = 0x00;
5195	}
5196
5197	err = stac9200_parse_auto_config(codec);
5198	if (err < 0) {
5199		stac92xx_free(codec);
5200		return err;
5201	}
5202
5203	/* CF-74 has no headphone detection, and the driver should *NOT*
5204	 * do detection and HP/speaker toggle because the hardware does it.
5205	 */
5206	if (spec->board_config == STAC_9200_PANASONIC)
5207		spec->hp_detect = 0;
5208
5209	codec->patch_ops = stac92xx_patch_ops;
5210
5211	return 0;
5212}
5213
5214static int patch_stac925x(struct hda_codec *codec)
5215{
5216	struct sigmatel_spec *spec;
5217	int err;
5218
5219	spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
5220	if (spec == NULL)
5221		return -ENOMEM;
5222
5223	codec->no_trigger_sense = 1;
5224	codec->spec = spec;
5225	spec->linear_tone_beep = 1;
5226	spec->num_pins = ARRAY_SIZE(stac925x_pin_nids);
5227	spec->pin_nids = stac925x_pin_nids;
5228
5229	/* Check first for codec ID */
5230	spec->board_config = snd_hda_check_board_codec_sid_config(codec,
5231							STAC_925x_MODELS,
5232							stac925x_models,
5233							stac925x_codec_id_cfg_tbl);
5234
5235	/* Now checks for PCI ID, if codec ID is not found */
5236	if (spec->board_config < 0)
5237		spec->board_config = snd_hda_check_board_config(codec,
5238							STAC_925x_MODELS,
5239							stac925x_models,
5240							stac925x_cfg_tbl);
5241 again:
5242	if (spec->board_config < 0)
5243		snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5244			    codec->chip_name);
5245	else
5246		stac92xx_set_config_regs(codec,
5247					 stac925x_brd_tbl[spec->board_config]);
5248
5249	spec->multiout.max_channels = 2;
5250	spec->multiout.num_dacs = 1;
5251	spec->multiout.dac_nids = stac925x_dac_nids;
5252	spec->adc_nids = stac925x_adc_nids;
5253	spec->mux_nids = stac925x_mux_nids;
5254	spec->num_muxes = 1;
5255	spec->num_adcs = 1;
5256	spec->num_pwrs = 0;
5257	switch (codec->vendor_id) {
5258	case 0x83847632: /* STAC9202  */
5259	case 0x83847633: /* STAC9202D */
5260	case 0x83847636: /* STAC9251  */
5261	case 0x83847637: /* STAC9251D */
5262		spec->num_dmics = STAC925X_NUM_DMICS;
5263		spec->dmic_nids = stac925x_dmic_nids;
5264		spec->num_dmuxes = ARRAY_SIZE(stac925x_dmux_nids);
5265		spec->dmux_nids = stac925x_dmux_nids;
5266		break;
5267	default:
5268		spec->num_dmics = 0;
5269		break;
5270	}
5271
5272	spec->init = stac925x_core_init;
5273	spec->mixer = stac925x_mixer;
5274	spec->num_caps = 1;
5275	spec->capvols = stac925x_capvols;
5276	spec->capsws = stac925x_capsws;
5277
5278	err = stac92xx_parse_auto_config(codec, 0x8, 0x7);
5279	if (!err) {
5280		if (spec->board_config < 0) {
5281			printk(KERN_WARNING "hda_codec: No auto-config is "
5282			       "available, default to model=ref\n");
5283			spec->board_config = STAC_925x_REF;
5284			goto again;
5285		}
5286		err = -EINVAL;
5287	}
5288	if (err < 0) {
5289		stac92xx_free(codec);
5290		return err;
5291	}
5292
5293	codec->patch_ops = stac92xx_patch_ops;
5294
5295	return 0;
5296}
5297
5298static int patch_stac92hd73xx(struct hda_codec *codec)
5299{
5300	struct sigmatel_spec *spec;
5301	hda_nid_t conn[STAC92HD73_DAC_COUNT + 2];
5302	int err = 0;
5303	int num_dacs;
5304
5305	spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
5306	if (spec == NULL)
5307		return -ENOMEM;
5308
5309	codec->no_trigger_sense = 1;
5310	codec->spec = spec;
 
 
 
 
5311	spec->linear_tone_beep = 0;
5312	codec->slave_dig_outs = stac92hd73xx_slave_dig_outs;
5313	spec->num_pins = ARRAY_SIZE(stac92hd73xx_pin_nids);
5314	spec->pin_nids = stac92hd73xx_pin_nids;
5315	spec->board_config = snd_hda_check_board_config(codec,
5316							STAC_92HD73XX_MODELS,
5317							stac92hd73xx_models,
5318							stac92hd73xx_cfg_tbl);
5319	/* check codec subsystem id if not found */
5320	if (spec->board_config < 0)
5321		spec->board_config =
5322			snd_hda_check_board_codec_sid_config(codec,
5323				STAC_92HD73XX_MODELS, stac92hd73xx_models,
5324				stac92hd73xx_codec_id_cfg_tbl);
5325again:
5326	if (spec->board_config < 0)
5327		snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5328			    codec->chip_name);
5329	else
5330		stac92xx_set_config_regs(codec,
5331				stac92hd73xx_brd_tbl[spec->board_config]);
5332
5333	num_dacs = snd_hda_get_connections(codec, 0x0a,
5334			conn, STAC92HD73_DAC_COUNT + 2) - 1;
5335
 
5336	if (num_dacs < 3 || num_dacs > 5) {
5337		printk(KERN_WARNING "hda_codec: Could not determine "
5338		       "number of channels defaulting to DAC count\n");
5339		num_dacs = STAC92HD73_DAC_COUNT;
5340	}
5341	spec->init = stac92hd73xx_core_init;
5342	switch (num_dacs) {
5343	case 0x3: /* 6 Channel */
5344		spec->aloopback_ctl = stac92hd73xx_6ch_loopback;
5345		break;
5346	case 0x4: /* 8 Channel */
5347		spec->aloopback_ctl = stac92hd73xx_8ch_loopback;
5348		break;
5349	case 0x5: /* 10 Channel */
5350		spec->aloopback_ctl = stac92hd73xx_10ch_loopback;
5351		break;
5352	}
5353	spec->multiout.dac_nids = spec->dac_nids;
5354
5355	spec->aloopback_mask = 0x01;
5356	spec->aloopback_shift = 8;
5357
5358	spec->digbeep_nid = 0x1c;
5359	spec->mux_nids = stac92hd73xx_mux_nids;
5360	spec->adc_nids = stac92hd73xx_adc_nids;
5361	spec->dmic_nids = stac92hd73xx_dmic_nids;
5362	spec->dmux_nids = stac92hd73xx_dmux_nids;
5363	spec->smux_nids = stac92hd73xx_smux_nids;
5364
5365	spec->num_muxes = ARRAY_SIZE(stac92hd73xx_mux_nids);
5366	spec->num_adcs = ARRAY_SIZE(stac92hd73xx_adc_nids);
5367	spec->num_dmuxes = ARRAY_SIZE(stac92hd73xx_dmux_nids);
5368
5369	spec->num_caps = STAC92HD73XX_NUM_CAPS;
5370	spec->capvols = stac92hd73xx_capvols;
5371	spec->capsws = stac92hd73xx_capsws;
5372
5373	switch (spec->board_config) {
5374	case STAC_DELL_EQ:
5375		spec->init = dell_eq_core_init;
5376		/* fallthru */
5377	case STAC_DELL_M6_AMIC:
5378	case STAC_DELL_M6_DMIC:
5379	case STAC_DELL_M6_BOTH:
5380		spec->num_smuxes = 0;
5381		spec->eapd_switch = 0;
5382
5383		switch (spec->board_config) {
5384		case STAC_DELL_M6_AMIC: /* Analog Mics */
5385			snd_hda_codec_set_pincfg(codec, 0x0b, 0x90A70170);
5386			spec->num_dmics = 0;
5387			break;
5388		case STAC_DELL_M6_DMIC: /* Digital Mics */
5389			snd_hda_codec_set_pincfg(codec, 0x13, 0x90A60160);
5390			spec->num_dmics = 1;
5391			break;
5392		case STAC_DELL_M6_BOTH: /* Both */
5393			snd_hda_codec_set_pincfg(codec, 0x0b, 0x90A70170);
5394			snd_hda_codec_set_pincfg(codec, 0x13, 0x90A60160);
5395			spec->num_dmics = 1;
5396			break;
5397		}
5398		break;
5399	case STAC_ALIENWARE_M17X:
5400		spec->num_dmics = STAC92HD73XX_NUM_DMICS;
5401		spec->num_smuxes = ARRAY_SIZE(stac92hd73xx_smux_nids);
5402		spec->eapd_switch = 0;
5403		break;
5404	default:
5405		spec->num_dmics = STAC92HD73XX_NUM_DMICS;
5406		spec->num_smuxes = ARRAY_SIZE(stac92hd73xx_smux_nids);
5407		spec->eapd_switch = 1;
5408		break;
5409	}
5410	if (spec->board_config != STAC_92HD73XX_REF) {
5411		/* GPIO0 High = Enable EAPD */
5412		spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x1;
5413		spec->gpio_data = 0x01;
5414	}
5415
5416	spec->num_pwrs = ARRAY_SIZE(stac92hd73xx_pwr_nids);
5417	spec->pwr_nids = stac92hd73xx_pwr_nids;
5418
5419	err = stac92xx_parse_auto_config(codec, 0x25, 0x27);
 
 
 
 
 
5420
5421	if (!err) {
5422		if (spec->board_config < 0) {
5423			printk(KERN_WARNING "hda_codec: No auto-config is "
5424			       "available, default to model=ref\n");
5425			spec->board_config = STAC_92HD73XX_REF;
5426			goto again;
5427		}
5428		err = -EINVAL;
5429	}
5430
 
5431	if (err < 0) {
5432		stac92xx_free(codec);
5433		return err;
5434	}
5435
5436	if (spec->board_config == STAC_92HD73XX_NO_JD)
5437		spec->hp_detect = 0;
5438
5439	codec->patch_ops = stac92xx_patch_ops;
 
5440
5441	codec->proc_widget_hook = stac92hd7x_proc_hook;
5442
5443	return 0;
5444}
5445
5446static int hp_bnb2011_with_dock(struct hda_codec *codec)
5447{
5448	if (codec->vendor_id != 0x111d7605 &&
5449	    codec->vendor_id != 0x111d76d1)
5450		return 0;
5451
5452	switch (codec->subsystem_id) {
5453	case 0x103c1618:
5454	case 0x103c1619:
5455	case 0x103c161a:
5456	case 0x103c161b:
5457	case 0x103c161c:
5458	case 0x103c161d:
5459	case 0x103c161e:
5460	case 0x103c161f:
5461
5462	case 0x103c162a:
5463	case 0x103c162b:
5464
5465	case 0x103c1630:
5466	case 0x103c1631:
5467
5468	case 0x103c1633:
5469	case 0x103c1634:
5470	case 0x103c1635:
5471
5472	case 0x103c3587:
5473	case 0x103c3588:
5474	case 0x103c3589:
5475	case 0x103c358a:
5476
5477	case 0x103c3667:
5478	case 0x103c3668:
5479	case 0x103c3669:
5480
5481		return 1;
5482	}
5483	return 0;
5484}
5485
5486static void stac92hd8x_add_pin(struct hda_codec *codec, hda_nid_t nid)
5487{
5488	struct sigmatel_spec *spec = codec->spec;
5489	unsigned int def_conf = snd_hda_codec_get_pincfg(codec, nid);
5490	int i;
5491
5492	spec->auto_pin_nids[spec->auto_pin_cnt] = nid;
5493	spec->auto_pin_cnt++;
5494
5495	if (get_defcfg_device(def_conf) == AC_JACK_MIC_IN &&
5496	    get_defcfg_connect(def_conf) != AC_JACK_PORT_NONE) {
5497		for (i = 0; i < ARRAY_SIZE(stac92hd83xxx_dmic_nids); i++) {
5498			if (nid == stac92hd83xxx_dmic_nids[i]) {
5499				spec->auto_dmic_nids[spec->auto_dmic_cnt] = nid;
5500				spec->auto_dmic_cnt++;
5501			}
5502		}
5503	}
5504}
5505
5506static void stac92hd8x_add_adc(struct hda_codec *codec, hda_nid_t nid)
5507{
5508	struct sigmatel_spec *spec = codec->spec;
5509
5510	spec->auto_adc_nids[spec->auto_adc_cnt] = nid;
5511	spec->auto_adc_cnt++;
5512}
5513
5514static void stac92hd8x_add_mux(struct hda_codec *codec, hda_nid_t nid)
5515{
5516	int i, j;
5517	struct sigmatel_spec *spec = codec->spec;
5518
5519	for (i = 0; i < spec->auto_adc_cnt; i++) {
5520		if (get_connection_index(codec,
5521				spec->auto_adc_nids[i], nid) >= 0) {
5522			/* mux and volume for adc_nids[i] */
5523			if (!spec->auto_mux_nids[i]) {
5524				spec->auto_mux_nids[i] = nid;
5525				/* 92hd codecs capture volume is in mux */
5526				spec->auto_capvols[i] = HDA_COMPOSE_AMP_VAL(nid,
5527							3, 0, HDA_OUTPUT);
5528			}
5529			for (j = 0; j < spec->auto_dmic_cnt; j++) {
5530				if (get_connection_index(codec, nid,
5531						spec->auto_dmic_nids[j]) >= 0) {
5532					/* dmux for adc_nids[i] */
5533					if (!spec->auto_dmux_nids[i])
5534						spec->auto_dmux_nids[i] = nid;
5535					break;
5536				}
5537			}
5538			break;
5539		}
5540	}
5541}
5542
5543static void stac92hd8x_fill_auto_spec(struct hda_codec *codec)
5544{
5545	hda_nid_t nid, end_nid;
5546	unsigned int wid_caps, wid_type;
5547	struct sigmatel_spec *spec = codec->spec;
5548
5549	end_nid = codec->start_nid + codec->num_nodes;
5550
5551	for (nid = codec->start_nid; nid < end_nid; nid++) {
5552		wid_caps = get_wcaps(codec, nid);
5553		wid_type = get_wcaps_type(wid_caps);
5554
5555		if (wid_type == AC_WID_PIN)
5556			stac92hd8x_add_pin(codec, nid);
5557
5558		if (wid_type == AC_WID_AUD_IN && !(wid_caps & AC_WCAP_DIGITAL))
5559			stac92hd8x_add_adc(codec, nid);
5560	}
5561
5562	for (nid = codec->start_nid; nid < end_nid; nid++) {
5563		wid_caps = get_wcaps(codec, nid);
5564		wid_type = get_wcaps_type(wid_caps);
5565
5566		if (wid_type == AC_WID_AUD_SEL)
5567			stac92hd8x_add_mux(codec, nid);
5568	}
5569
5570	spec->pin_nids = spec->auto_pin_nids;
5571	spec->num_pins = spec->auto_pin_cnt;
5572	spec->adc_nids = spec->auto_adc_nids;
5573	spec->num_adcs = spec->auto_adc_cnt;
5574	spec->capvols = spec->auto_capvols;
5575	spec->capsws = spec->auto_capvols;
5576	spec->num_caps = spec->auto_adc_cnt;
5577	spec->mux_nids = spec->auto_mux_nids;
5578	spec->num_muxes = spec->auto_adc_cnt;
5579	spec->dmux_nids = spec->auto_dmux_nids;
5580	spec->num_dmuxes = spec->auto_adc_cnt;
5581	spec->dmic_nids = spec->auto_dmic_nids;
5582	spec->num_dmics = spec->auto_dmic_cnt;
5583}
5584
5585static int patch_stac92hd83xxx(struct hda_codec *codec)
5586{
5587	struct sigmatel_spec *spec;
5588	hda_nid_t conn[STAC92HD83_DAC_COUNT + 1];
5589	int err;
5590	int num_dacs;
5591
5592	spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
5593	if (spec == NULL)
5594		return -ENOMEM;
5595
5596	if (hp_bnb2011_with_dock(codec)) {
5597		snd_hda_codec_set_pincfg(codec, 0xa, 0x2101201f);
5598		snd_hda_codec_set_pincfg(codec, 0xf, 0x2181205e);
5599	}
5600
5601	/* reset pin power-down; Windows may leave these bits after reboot */
5602	snd_hda_codec_write_cache(codec, codec->afg, 0, 0x7EC, 0);
5603	snd_hda_codec_write_cache(codec, codec->afg, 0, 0x7ED, 0);
5604	codec->no_trigger_sense = 1;
5605	codec->spec = spec;
 
5606
5607	stac92hd8x_fill_auto_spec(codec);
5608
5609	spec->linear_tone_beep = 0;
5610	codec->slave_dig_outs = stac92hd83xxx_slave_dig_outs;
5611	spec->digbeep_nid = 0x21;
5612	spec->pwr_nids = stac92hd83xxx_pwr_nids;
5613	spec->pwr_mapping = stac92hd83xxx_pwr_mapping;
5614	spec->num_pwrs = ARRAY_SIZE(stac92hd83xxx_pwr_nids);
5615	spec->multiout.dac_nids = spec->dac_nids;
5616	spec->init = stac92hd83xxx_core_init;
5617
5618	spec->board_config = snd_hda_check_board_config(codec,
5619							STAC_92HD83XXX_MODELS,
5620							stac92hd83xxx_models,
5621							stac92hd83xxx_cfg_tbl);
5622again:
5623	if (spec->board_config < 0)
5624		snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5625			    codec->chip_name);
5626	else
5627		stac92xx_set_config_regs(codec,
5628				stac92hd83xxx_brd_tbl[spec->board_config]);
5629
5630	switch (codec->vendor_id) {
5631	case 0x111d76d1:
5632	case 0x111d76d9:
5633	case 0x111d76df:
5634	case 0x111d76e5:
5635	case 0x111d7666:
5636	case 0x111d7667:
5637	case 0x111d7668:
5638	case 0x111d7669:
5639	case 0x111d76e3:
5640	case 0x111d7604:
5641	case 0x111d76d4:
5642	case 0x111d7605:
5643	case 0x111d76d5:
5644	case 0x111d76e7:
5645		if (spec->board_config == STAC_92HD83XXX_PWR_REF)
5646			break;
5647		spec->num_pwrs = 0;
5648		break;
5649	}
5650
5651	codec->patch_ops = stac92xx_patch_ops;
5652
5653	if (find_mute_led_gpio(codec, 0))
5654		snd_printd("mute LED gpio %d polarity %d\n",
5655				spec->gpio_led,
5656				spec->gpio_led_polarity);
5657
5658#ifdef CONFIG_SND_HDA_POWER_SAVE
5659	if (spec->gpio_led) {
5660		if (spec->gpio_led <= 8) {
5661			spec->gpio_mask |= spec->gpio_led;
5662			spec->gpio_dir |= spec->gpio_led;
5663			spec->gpio_data |= spec->gpio_led;
5664		} else {
5665			codec->patch_ops.set_power_state =
5666					stac92xx_set_power_state;
5667			codec->patch_ops.post_suspend =
5668					stac92xx_post_suspend;
5669		}
5670		codec->patch_ops.pre_resume = stac92xx_pre_resume;
5671		codec->patch_ops.check_power_status =
5672			stac92xx_check_power_status;
5673	}
5674#endif	
5675
5676	err = stac92xx_parse_auto_config(codec, 0x1d, 0);
5677	if (!err) {
5678		if (spec->board_config < 0) {
5679			printk(KERN_WARNING "hda_codec: No auto-config is "
5680			       "available, default to model=ref\n");
5681			spec->board_config = STAC_92HD83XXX_REF;
5682			goto again;
5683		}
5684		err = -EINVAL;
5685	}
5686
 
5687	if (err < 0) {
5688		stac92xx_free(codec);
5689		return err;
5690	}
5691
5692	/* docking output support */
5693	num_dacs = snd_hda_get_connections(codec, 0xF,
5694				conn, STAC92HD83_DAC_COUNT + 1) - 1;
5695	/* skip non-DAC connections */
5696	while (num_dacs >= 0 &&
5697			(get_wcaps_type(get_wcaps(codec, conn[num_dacs]))
5698					!= AC_WID_AUD_OUT))
5699		num_dacs--;
5700	/* set port E and F to select the last DAC */
5701	if (num_dacs >= 0) {
5702		snd_hda_codec_write_cache(codec, 0xE, 0,
5703			AC_VERB_SET_CONNECT_SEL, num_dacs);
5704		snd_hda_codec_write_cache(codec, 0xF, 0,
5705			AC_VERB_SET_CONNECT_SEL, num_dacs);
5706	}
5707
5708	codec->proc_widget_hook = stac92hd_proc_hook;
5709
5710	return 0;
5711}
5712
5713static int stac92hd71bxx_connected_smuxes(struct hda_codec *codec,
5714					  hda_nid_t dig0pin)
 
 
 
5715{
5716	struct sigmatel_spec *spec = codec->spec;
5717	int idx;
 
 
 
 
5718
5719	for (idx = 0; idx < spec->num_pins; idx++)
5720		if (spec->pin_nids[idx] == dig0pin)
5721			break;
5722	if ((idx + 2) >= spec->num_pins)
5723		return 0;
5724
5725	/* dig1pin case */
5726	if (stac_get_defcfg_connect(codec, idx + 1) != AC_JACK_PORT_NONE)
5727		return 2;
5728
5729	/* dig0pin + dig2pin case */
5730	if (stac_get_defcfg_connect(codec, idx + 2) != AC_JACK_PORT_NONE)
5731		return 2;
5732	if (stac_get_defcfg_connect(codec, idx) != AC_JACK_PORT_NONE)
5733		return 1;
5734	else
5735		return 0;
5736}
5737
5738/* HP dv7 bass switch - GPIO5 */
5739#define stac_hp_bass_gpio_info	snd_ctl_boolean_mono_info
5740static int stac_hp_bass_gpio_get(struct snd_kcontrol *kcontrol,
5741				 struct snd_ctl_elem_value *ucontrol)
5742{
5743	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5744	struct sigmatel_spec *spec = codec->spec;
5745	ucontrol->value.integer.value[0] = !!(spec->gpio_data & 0x20);
5746	return 0;
5747}
5748
5749static int stac_hp_bass_gpio_put(struct snd_kcontrol *kcontrol,
5750				 struct snd_ctl_elem_value *ucontrol)
5751{
5752	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5753	struct sigmatel_spec *spec = codec->spec;
5754	unsigned int gpio_data;
5755
5756	gpio_data = (spec->gpio_data & ~0x20) |
5757		(ucontrol->value.integer.value[0] ? 0x20 : 0);
5758	if (gpio_data == spec->gpio_data)
5759		return 0;
5760	spec->gpio_data = gpio_data;
5761	stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, spec->gpio_data);
5762	return 1;
5763}
5764
5765static const struct snd_kcontrol_new stac_hp_bass_sw_ctrl = {
5766	.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5767	.info = stac_hp_bass_gpio_info,
5768	.get = stac_hp_bass_gpio_get,
5769	.put = stac_hp_bass_gpio_put,
5770};
5771
5772static int stac_add_hp_bass_switch(struct hda_codec *codec)
5773{
5774	struct sigmatel_spec *spec = codec->spec;
5775
5776	if (!stac_control_new(spec, &stac_hp_bass_sw_ctrl,
5777			      "Bass Speaker Playback Switch", 0))
5778		return -ENOMEM;
5779
5780	spec->gpio_mask |= 0x20;
5781	spec->gpio_dir |= 0x20;
5782	spec->gpio_data |= 0x20;
5783	return 0;
5784}
5785
5786static int patch_stac92hd71bxx(struct hda_codec *codec)
5787{
5788	struct sigmatel_spec *spec;
5789	const struct hda_verb *unmute_init = stac92hd71bxx_unmute_core_init;
5790	unsigned int pin_cfg;
5791	int err = 0;
5792
5793	spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
5794	if (spec == NULL)
5795		return -ENOMEM;
5796
5797	codec->no_trigger_sense = 1;
5798	codec->spec = spec;
 
5799	spec->linear_tone_beep = 0;
5800	codec->patch_ops = stac92xx_patch_ops;
5801	spec->num_pins = STAC92HD71BXX_NUM_PINS;
5802	switch (codec->vendor_id) {
5803	case 0x111d76b6:
5804	case 0x111d76b7:
5805		spec->pin_nids = stac92hd71bxx_pin_nids_4port;
5806		break;
5807	case 0x111d7603:
5808	case 0x111d7608:
5809		/* On 92HD75Bx 0x27 isn't a pin nid */
5810		spec->num_pins--;
5811		/* fallthrough */
5812	default:
5813		spec->pin_nids = stac92hd71bxx_pin_nids_6port;
5814	}
5815	spec->num_pwrs = ARRAY_SIZE(stac92hd71bxx_pwr_nids);
5816	spec->board_config = snd_hda_check_board_config(codec,
5817							STAC_92HD71BXX_MODELS,
5818							stac92hd71bxx_models,
5819							stac92hd71bxx_cfg_tbl);
5820again:
5821	if (spec->board_config < 0)
5822		snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5823			    codec->chip_name);
5824	else
5825		stac92xx_set_config_regs(codec,
5826				stac92hd71bxx_brd_tbl[spec->board_config]);
5827
5828	if (spec->board_config != STAC_92HD71BXX_REF) {
5829		/* GPIO0 = EAPD */
5830		spec->gpio_mask = 0x01;
5831		spec->gpio_dir = 0x01;
5832		spec->gpio_data = 0x01;
5833	}
5834
5835	spec->dmic_nids = stac92hd71bxx_dmic_nids;
5836	spec->dmux_nids = stac92hd71bxx_dmux_nids;
5837
5838	spec->num_caps = STAC92HD71BXX_NUM_CAPS;
5839	spec->capvols = stac92hd71bxx_capvols;
5840	spec->capsws = stac92hd71bxx_capsws;
5841
5842	switch (codec->vendor_id) {
5843	case 0x111d76b6: /* 4 Port without Analog Mixer */
5844	case 0x111d76b7:
5845		unmute_init++;
5846		/* fallthru */
5847	case 0x111d76b4: /* 6 Port without Analog Mixer */
5848	case 0x111d76b5:
5849		spec->init = stac92hd71bxx_core_init;
5850		codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs;
5851		spec->num_dmics = stac92xx_connected_ports(codec,
5852					stac92hd71bxx_dmic_nids,
5853					STAC92HD71BXX_NUM_DMICS);
5854		break;
5855	case 0x111d7608: /* 5 Port with Analog Mixer */
5856		switch (spec->board_config) {
5857		case STAC_HP_M4:
5858			/* Enable VREF power saving on GPIO1 detect */
5859			err = stac_add_event(spec, codec->afg,
5860					     STAC_VREF_EVENT, 0x02);
5861			if (err < 0)
5862				return err;
5863			snd_hda_codec_write_cache(codec, codec->afg, 0,
5864				AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x02);
5865			snd_hda_codec_write_cache(codec, codec->afg, 0,
5866				AC_VERB_SET_UNSOLICITED_ENABLE,
5867				AC_USRSP_EN | err);
5868			spec->gpio_mask |= 0x02;
5869			break;
5870		}
5871		if ((codec->revision_id & 0xf) == 0 ||
5872		    (codec->revision_id & 0xf) == 1)
5873			spec->stream_delay = 40; /* 40 milliseconds */
5874
5875		/* no output amps */
5876		spec->num_pwrs = 0;
5877		/* disable VSW */
5878		spec->init = stac92hd71bxx_core_init;
5879		unmute_init++;
5880		snd_hda_codec_set_pincfg(codec, 0x0f, 0x40f000f0);
5881		snd_hda_codec_set_pincfg(codec, 0x19, 0x40f000f3);
5882		spec->dmic_nids = stac92hd71bxx_dmic_5port_nids;
5883		spec->num_dmics = stac92xx_connected_ports(codec,
5884					stac92hd71bxx_dmic_5port_nids,
5885					STAC92HD71BXX_NUM_DMICS - 1);
5886		break;
5887	case 0x111d7603: /* 6 Port with Analog Mixer */
5888		if ((codec->revision_id & 0xf) == 1)
5889			spec->stream_delay = 40; /* 40 milliseconds */
5890
5891		/* no output amps */
5892		spec->num_pwrs = 0;
5893		/* fallthru */
5894	default:
5895		spec->init = stac92hd71bxx_core_init;
5896		codec->slave_dig_outs = stac92hd71bxx_slave_dig_outs;
5897		spec->num_dmics = stac92xx_connected_ports(codec,
5898					stac92hd71bxx_dmic_nids,
5899					STAC92HD71BXX_NUM_DMICS);
5900		break;
5901	}
5902
5903	if (get_wcaps(codec, 0xa) & AC_WCAP_IN_AMP)
5904		snd_hda_sequence_write_cache(codec, unmute_init);
5905
5906	spec->aloopback_ctl = stac92hd71bxx_loopback;
 
 
 
 
 
 
 
5907	spec->aloopback_mask = 0x50;
5908	spec->aloopback_shift = 0;
5909
5910	spec->powerdown_adcs = 1;
5911	spec->digbeep_nid = 0x26;
5912	spec->mux_nids = stac92hd71bxx_mux_nids;
5913	spec->adc_nids = stac92hd71bxx_adc_nids;
5914	spec->smux_nids = stac92hd71bxx_smux_nids;
5915	spec->pwr_nids = stac92hd71bxx_pwr_nids;
5916
5917	spec->num_muxes = ARRAY_SIZE(stac92hd71bxx_mux_nids);
5918	spec->num_adcs = ARRAY_SIZE(stac92hd71bxx_adc_nids);
5919	spec->num_dmuxes = ARRAY_SIZE(stac92hd71bxx_dmux_nids);
5920	spec->num_smuxes = stac92hd71bxx_connected_smuxes(codec, 0x1e);
5921
5922	snd_printdd("Found board config: %d\n", spec->board_config);
5923
5924	switch (spec->board_config) {
5925	case STAC_HP_M4:
5926		/* enable internal microphone */
5927		snd_hda_codec_set_pincfg(codec, 0x0e, 0x01813040);
5928		stac92xx_auto_set_pinctl(codec, 0x0e,
5929			AC_PINCTL_IN_EN | AC_PINCTL_VREF_80);
5930		/* fallthru */
5931	case STAC_DELL_M4_2:
5932		spec->num_dmics = 0;
5933		spec->num_smuxes = 0;
5934		spec->num_dmuxes = 0;
5935		break;
5936	case STAC_DELL_M4_1:
5937	case STAC_DELL_M4_3:
5938		spec->num_dmics = 1;
5939		spec->num_smuxes = 0;
5940		spec->num_dmuxes = 1;
5941		break;
5942	case STAC_HP_DV4_1222NR:
5943		spec->num_dmics = 1;
5944		/* I don't know if it needs 1 or 2 smuxes - will wait for
5945		 * bug reports to fix if needed
5946		 */
5947		spec->num_smuxes = 1;
5948		spec->num_dmuxes = 1;
5949		/* fallthrough */
5950	case STAC_HP_DV4:
5951		spec->gpio_led = 0x01;
5952		/* fallthrough */
5953	case STAC_HP_DV5:
5954		snd_hda_codec_set_pincfg(codec, 0x0d, 0x90170010);
5955		stac92xx_auto_set_pinctl(codec, 0x0d, AC_PINCTL_OUT_EN);
5956		/* HP dv6 gives the headphone pin as a line-out.  Thus we
5957		 * need to set hp_detect flag here to force to enable HP
5958		 * detection.
5959		 */
5960		spec->hp_detect = 1;
5961		break;
5962	case STAC_HP_HDX:
5963		spec->num_dmics = 1;
5964		spec->num_dmuxes = 1;
5965		spec->num_smuxes = 1;
5966		spec->gpio_led = 0x08;
5967		break;
5968	}
5969
5970	if (hp_blike_system(codec->subsystem_id)) {
5971		pin_cfg = snd_hda_codec_get_pincfg(codec, 0x0f);
5972		if (get_defcfg_device(pin_cfg) == AC_JACK_LINE_OUT ||
5973			get_defcfg_device(pin_cfg) == AC_JACK_SPEAKER  ||
5974			get_defcfg_device(pin_cfg) == AC_JACK_HP_OUT) {
5975			/* It was changed in the BIOS to just satisfy MS DTM.
5976			 * Lets turn it back into slaved HP
5977			 */
5978			pin_cfg = (pin_cfg & (~AC_DEFCFG_DEVICE))
5979					| (AC_JACK_HP_OUT <<
5980						AC_DEFCFG_DEVICE_SHIFT);
5981			pin_cfg = (pin_cfg & (~(AC_DEFCFG_DEF_ASSOC
5982							| AC_DEFCFG_SEQUENCE)))
5983								| 0x1f;
5984			snd_hda_codec_set_pincfg(codec, 0x0f, pin_cfg);
5985		}
5986	}
5987
5988	if (find_mute_led_gpio(codec, 1))
5989		snd_printd("mute LED gpio %d polarity %d\n",
5990				spec->gpio_led,
5991				spec->gpio_led_polarity);
5992
5993#ifdef CONFIG_SND_HDA_POWER_SAVE
5994	if (spec->gpio_led) {
5995		if (spec->gpio_led <= 8) {
5996			spec->gpio_mask |= spec->gpio_led;
5997			spec->gpio_dir |= spec->gpio_led;
5998			spec->gpio_data |= spec->gpio_led;
5999		} else {
6000			codec->patch_ops.set_power_state =
6001					stac92xx_set_power_state;
6002			codec->patch_ops.post_suspend =
6003					stac92xx_post_suspend;
6004		}
6005		codec->patch_ops.pre_resume = stac92xx_pre_resume;
6006		codec->patch_ops.check_power_status =
6007			stac92xx_check_power_status;
6008	}
6009#endif	
6010
6011	spec->multiout.dac_nids = spec->dac_nids;
6012
6013	err = stac92xx_parse_auto_config(codec, 0x21, 0);
6014	if (!err) {
6015		if (spec->board_config < 0) {
6016			printk(KERN_WARNING "hda_codec: No auto-config is "
6017			       "available, default to model=ref\n");
6018			spec->board_config = STAC_92HD71BXX_REF;
6019			goto again;
6020		}
6021		err = -EINVAL;
6022	}
6023
 
6024	if (err < 0) {
6025		stac92xx_free(codec);
6026		return err;
6027	}
6028
6029	/* enable bass on HP dv7 */
6030	if (spec->board_config == STAC_HP_DV4 ||
6031	    spec->board_config == STAC_HP_DV5) {
6032		unsigned int cap;
6033		cap = snd_hda_param_read(codec, 0x1, AC_PAR_GPIO_CAP);
6034		cap &= AC_GPIO_IO_COUNT;
6035		if (cap >= 6)
6036			stac_add_hp_bass_switch(codec);
6037	}
6038
6039	codec->proc_widget_hook = stac92hd7x_proc_hook;
6040
6041	return 0;
6042}
6043
6044static int patch_stac922x(struct hda_codec *codec)
6045{
6046	struct sigmatel_spec *spec;
6047	int err;
6048
6049	spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
6050	if (spec == NULL)
6051		return -ENOMEM;
6052
6053	codec->no_trigger_sense = 1;
6054	codec->spec = spec;
6055	spec->linear_tone_beep = 1;
6056	spec->num_pins = ARRAY_SIZE(stac922x_pin_nids);
6057	spec->pin_nids = stac922x_pin_nids;
6058	spec->board_config = snd_hda_check_board_config(codec, STAC_922X_MODELS,
6059							stac922x_models,
6060							stac922x_cfg_tbl);
6061	if (spec->board_config == STAC_INTEL_MAC_AUTO) {
6062		spec->gpio_mask = spec->gpio_dir = 0x03;
6063		spec->gpio_data = 0x03;
6064		/* Intel Macs have all same PCI SSID, so we need to check
6065		 * codec SSID to distinguish the exact models
6066		 */
6067		printk(KERN_INFO "hda_codec: STAC922x, Apple subsys_id=%x\n", codec->subsystem_id);
6068		switch (codec->subsystem_id) {
6069
6070		case 0x106b0800:
6071			spec->board_config = STAC_INTEL_MAC_V1;
6072			break;
6073		case 0x106b0600:
6074		case 0x106b0700:
6075			spec->board_config = STAC_INTEL_MAC_V2;
6076			break;
6077		case 0x106b0e00:
6078		case 0x106b0f00:
6079		case 0x106b1600:
6080		case 0x106b1700:
6081		case 0x106b0200:
6082		case 0x106b1e00:
6083			spec->board_config = STAC_INTEL_MAC_V3;
6084			break;
6085		case 0x106b1a00:
6086		case 0x00000100:
6087			spec->board_config = STAC_INTEL_MAC_V4;
6088			break;
6089		case 0x106b0a00:
6090		case 0x106b2200:
6091			spec->board_config = STAC_INTEL_MAC_V5;
6092			break;
6093		default:
6094			spec->board_config = STAC_INTEL_MAC_V3;
6095			break;
6096		}
6097	}
6098
6099 again:
6100	if (spec->board_config < 0)
6101		snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
6102			    codec->chip_name);
6103	else
6104		stac92xx_set_config_regs(codec,
6105				stac922x_brd_tbl[spec->board_config]);
6106
6107	spec->adc_nids = stac922x_adc_nids;
6108	spec->mux_nids = stac922x_mux_nids;
6109	spec->num_muxes = ARRAY_SIZE(stac922x_mux_nids);
6110	spec->num_adcs = ARRAY_SIZE(stac922x_adc_nids);
6111	spec->num_dmics = 0;
6112	spec->num_pwrs = 0;
6113
6114	spec->init = stac922x_core_init;
6115
6116	spec->num_caps = STAC922X_NUM_CAPS;
6117	spec->capvols = stac922x_capvols;
6118	spec->capsws = stac922x_capsws;
6119
6120	spec->multiout.dac_nids = spec->dac_nids;
6121	
6122	err = stac92xx_parse_auto_config(codec, 0x08, 0x09);
6123	if (!err) {
6124		if (spec->board_config < 0) {
6125			printk(KERN_WARNING "hda_codec: No auto-config is "
6126			       "available, default to model=ref\n");
6127			spec->board_config = STAC_D945_REF;
6128			goto again;
6129		}
6130		err = -EINVAL;
6131	}
6132	if (err < 0) {
6133		stac92xx_free(codec);
6134		return err;
6135	}
6136
6137	codec->patch_ops = stac92xx_patch_ops;
6138
6139	/* Fix Mux capture level; max to 2 */
6140	snd_hda_override_amp_caps(codec, 0x12, HDA_OUTPUT,
6141				  (0 << AC_AMPCAP_OFFSET_SHIFT) |
6142				  (2 << AC_AMPCAP_NUM_STEPS_SHIFT) |
6143				  (0x27 << AC_AMPCAP_STEP_SIZE_SHIFT) |
6144				  (0 << AC_AMPCAP_MUTE_SHIFT));
6145
6146	return 0;
6147}
6148
 
 
 
 
 
6149static int patch_stac927x(struct hda_codec *codec)
6150{
6151	struct sigmatel_spec *spec;
6152	int err;
6153
6154	spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
6155	if (spec == NULL)
6156		return -ENOMEM;
6157
6158	codec->no_trigger_sense = 1;
6159	codec->spec = spec;
6160	spec->linear_tone_beep = 1;
6161	codec->slave_dig_outs = stac927x_slave_dig_outs;
6162	spec->num_pins = ARRAY_SIZE(stac927x_pin_nids);
6163	spec->pin_nids = stac927x_pin_nids;
6164	spec->board_config = snd_hda_check_board_config(codec, STAC_927X_MODELS,
6165							stac927x_models,
6166							stac927x_cfg_tbl);
6167 again:
6168	if (spec->board_config < 0)
6169		snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
6170			    codec->chip_name);
6171	else
6172		stac92xx_set_config_regs(codec,
6173				stac927x_brd_tbl[spec->board_config]);
6174
6175	spec->digbeep_nid = 0x23;
6176	spec->adc_nids = stac927x_adc_nids;
6177	spec->num_adcs = ARRAY_SIZE(stac927x_adc_nids);
6178	spec->mux_nids = stac927x_mux_nids;
6179	spec->num_muxes = ARRAY_SIZE(stac927x_mux_nids);
6180	spec->smux_nids = stac927x_smux_nids;
6181	spec->num_smuxes = ARRAY_SIZE(stac927x_smux_nids);
6182	spec->spdif_labels = stac927x_spdif_labels;
6183	spec->dac_list = stac927x_dac_nids;
6184	spec->multiout.dac_nids = spec->dac_nids;
6185
6186	if (spec->board_config != STAC_D965_REF) {
6187		/* GPIO0 High = Enable EAPD */
6188		spec->eapd_mask = spec->gpio_mask = 0x01;
6189		spec->gpio_dir = spec->gpio_data = 0x01;
6190	}
6191
6192	switch (spec->board_config) {
6193	case STAC_D965_3ST:
6194	case STAC_D965_5ST:
6195		/* GPIO0 High = Enable EAPD */
6196		spec->num_dmics = 0;
6197		spec->init = d965_core_init;
6198		break;
6199	case STAC_DELL_BIOS:
6200		switch (codec->subsystem_id) {
6201		case 0x10280209:
6202		case 0x1028022e:
6203			/* correct the device field to SPDIF out */
6204			snd_hda_codec_set_pincfg(codec, 0x21, 0x01442070);
6205			break;
6206		}
6207		/* configure the analog microphone on some laptops */
6208		snd_hda_codec_set_pincfg(codec, 0x0c, 0x90a79130);
6209		/* correct the front output jack as a hp out */
6210		snd_hda_codec_set_pincfg(codec, 0x0f, 0x0227011f);
6211		/* correct the front input jack as a mic */
6212		snd_hda_codec_set_pincfg(codec, 0x0e, 0x02a79130);
6213		/* fallthru */
6214	case STAC_DELL_3ST:
6215		if (codec->subsystem_id != 0x1028022f) {
6216			/* GPIO2 High = Enable EAPD */
6217			spec->eapd_mask = spec->gpio_mask = 0x04;
6218			spec->gpio_dir = spec->gpio_data = 0x04;
6219		}
6220		spec->dmic_nids = stac927x_dmic_nids;
6221		spec->num_dmics = STAC927X_NUM_DMICS;
6222
6223		spec->init = dell_3st_core_init;
6224		spec->dmux_nids = stac927x_dmux_nids;
6225		spec->num_dmuxes = ARRAY_SIZE(stac927x_dmux_nids);
6226		break;
6227	case STAC_927X_VOLKNOB:
6228		spec->num_dmics = 0;
6229		spec->init = stac927x_volknob_core_init;
6230		break;
6231	default:
6232		spec->num_dmics = 0;
6233		spec->init = stac927x_core_init;
6234		break;
6235	}
6236
6237	spec->num_caps = STAC927X_NUM_CAPS;
6238	spec->capvols = stac927x_capvols;
6239	spec->capsws = stac927x_capsws;
6240
6241	spec->num_pwrs = 0;
6242	spec->aloopback_ctl = stac927x_loopback;
6243	spec->aloopback_mask = 0x40;
6244	spec->aloopback_shift = 0;
6245	spec->eapd_switch = 1;
6246
6247	err = stac92xx_parse_auto_config(codec, 0x1e, 0x20);
6248	if (!err) {
6249		if (spec->board_config < 0) {
6250			printk(KERN_WARNING "hda_codec: No auto-config is "
6251			       "available, default to model=ref\n");
6252			spec->board_config = STAC_D965_REF;
6253			goto again;
6254		}
6255		err = -EINVAL;
6256	}
6257	if (err < 0) {
6258		stac92xx_free(codec);
6259		return err;
6260	}
6261
6262	codec->patch_ops = stac92xx_patch_ops;
6263
6264	codec->proc_widget_hook = stac927x_proc_hook;
6265
6266	/*
6267	 * !!FIXME!!
6268	 * The STAC927x seem to require fairly long delays for certain
6269	 * command sequences.  With too short delays (even if the answer
6270	 * is set to RIRB properly), it results in the silence output
6271	 * on some hardwares like Dell.
6272	 *
6273	 * The below flag enables the longer delay (see get_response
6274	 * in hda_intel.c).
6275	 */
6276	codec->bus->needs_damn_long_delay = 1;
6277
6278	/* no jack detecion for ref-no-jd model */
6279	if (spec->board_config == STAC_D965_REF_NO_JD)
6280		spec->hp_detect = 0;
6281
6282	return 0;
6283}
6284
6285static int patch_stac9205(struct hda_codec *codec)
6286{
6287	struct sigmatel_spec *spec;
6288	int err;
6289
6290	spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
6291	if (spec == NULL)
6292		return -ENOMEM;
6293
6294	codec->no_trigger_sense = 1;
6295	codec->spec = spec;
6296	spec->linear_tone_beep = 1;
6297	spec->num_pins = ARRAY_SIZE(stac9205_pin_nids);
6298	spec->pin_nids = stac9205_pin_nids;
6299	spec->board_config = snd_hda_check_board_config(codec, STAC_9205_MODELS,
6300							stac9205_models,
6301							stac9205_cfg_tbl);
6302 again:
6303	if (spec->board_config < 0)
6304		snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
6305			    codec->chip_name);
6306	else
6307		stac92xx_set_config_regs(codec,
6308					 stac9205_brd_tbl[spec->board_config]);
6309
6310	spec->digbeep_nid = 0x23;
6311	spec->adc_nids = stac9205_adc_nids;
6312	spec->num_adcs = ARRAY_SIZE(stac9205_adc_nids);
6313	spec->mux_nids = stac9205_mux_nids;
6314	spec->num_muxes = ARRAY_SIZE(stac9205_mux_nids);
6315	spec->smux_nids = stac9205_smux_nids;
6316	spec->num_smuxes = ARRAY_SIZE(stac9205_smux_nids);
6317	spec->dmic_nids = stac9205_dmic_nids;
6318	spec->num_dmics = STAC9205_NUM_DMICS;
6319	spec->dmux_nids = stac9205_dmux_nids;
6320	spec->num_dmuxes = ARRAY_SIZE(stac9205_dmux_nids);
6321	spec->num_pwrs = 0;
6322
6323	spec->init = stac9205_core_init;
6324	spec->aloopback_ctl = stac9205_loopback;
6325
6326	spec->num_caps = STAC9205_NUM_CAPS;
6327	spec->capvols = stac9205_capvols;
6328	spec->capsws = stac9205_capsws;
6329
6330	spec->aloopback_mask = 0x40;
6331	spec->aloopback_shift = 0;
6332	/* Turn on/off EAPD per HP plugging */
6333	if (spec->board_config != STAC_9205_EAPD)
6334		spec->eapd_switch = 1;
6335	spec->multiout.dac_nids = spec->dac_nids;
6336	
6337	switch (spec->board_config){
6338	case STAC_9205_DELL_M43:
6339		/* Enable SPDIF in/out */
6340		snd_hda_codec_set_pincfg(codec, 0x1f, 0x01441030);
6341		snd_hda_codec_set_pincfg(codec, 0x20, 0x1c410030);
6342
6343		/* Enable unsol response for GPIO4/Dock HP connection */
6344		err = stac_add_event(spec, codec->afg, STAC_VREF_EVENT, 0x01);
6345		if (err < 0)
6346			return err;
6347		snd_hda_codec_write_cache(codec, codec->afg, 0,
6348			AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x10);
6349		snd_hda_codec_write_cache(codec, codec->afg, 0,
6350					  AC_VERB_SET_UNSOLICITED_ENABLE,
6351					  AC_USRSP_EN | err);
6352
6353		spec->gpio_dir = 0x0b;
6354		spec->eapd_mask = 0x01;
6355		spec->gpio_mask = 0x1b;
6356		spec->gpio_mute = 0x10;
6357		/* GPIO0 High = EAPD, GPIO1 Low = Headphone Mute,
6358		 * GPIO3 Low = DRM
6359		 */
6360		spec->gpio_data = 0x01;
6361		break;
6362	case STAC_9205_REF:
6363		/* SPDIF-In enabled */
6364		break;
6365	default:
6366		/* GPIO0 High = EAPD */
6367		spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x1;
6368		spec->gpio_data = 0x01;
6369		break;
6370	}
6371
6372	err = stac92xx_parse_auto_config(codec, 0x1f, 0x20);
6373	if (!err) {
6374		if (spec->board_config < 0) {
6375			printk(KERN_WARNING "hda_codec: No auto-config is "
6376			       "available, default to model=ref\n");
6377			spec->board_config = STAC_9205_REF;
6378			goto again;
6379		}
6380		err = -EINVAL;
6381	}
6382	if (err < 0) {
6383		stac92xx_free(codec);
6384		return err;
6385	}
6386
6387	codec->patch_ops = stac92xx_patch_ops;
6388
6389	codec->proc_widget_hook = stac9205_proc_hook;
6390
6391	return 0;
6392}
6393
6394/*
6395 * STAC9872 hack
6396 */
6397
6398static const struct hda_verb stac9872_core_init[] = {
6399	{0x15, AC_VERB_SET_CONNECT_SEL, 0x1}, /* mic-sel: 0a,0d,14,02 */
6400	{0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Mic-in -> 0x9 */
6401	{}
6402};
6403
6404static const hda_nid_t stac9872_pin_nids[] = {
6405	0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
6406	0x11, 0x13, 0x14,
 
 
 
 
 
 
 
 
6407};
6408
6409static const hda_nid_t stac9872_adc_nids[] = {
6410	0x8 /*,0x6*/
 
6411};
6412
6413static const hda_nid_t stac9872_mux_nids[] = {
6414	0x15
6415};
6416
6417static const unsigned long stac9872_capvols[] = {
6418	HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
6419};
6420#define stac9872_capsws		stac9872_capvols
6421
6422static const unsigned int stac9872_vaio_pin_configs[9] = {
6423	0x03211020, 0x411111f0, 0x411111f0, 0x03a15030,
6424	0x411111f0, 0x90170110, 0x411111f0, 0x411111f0,
6425	0x90a7013e
6426};
6427
6428static const char * const stac9872_models[STAC_9872_MODELS] = {
6429	[STAC_9872_AUTO] = "auto",
6430	[STAC_9872_VAIO] = "vaio",
6431};
6432
6433static const unsigned int *stac9872_brd_tbl[STAC_9872_MODELS] = {
6434	[STAC_9872_VAIO] = stac9872_vaio_pin_configs,
6435};
6436
6437static const struct snd_pci_quirk stac9872_cfg_tbl[] = {
6438	SND_PCI_QUIRK_MASK(0x104d, 0xfff0, 0x81e0,
6439			   "Sony VAIO F/S", STAC_9872_VAIO),
6440	{} /* terminator */
6441};
6442
6443static int patch_stac9872(struct hda_codec *codec)
6444{
6445	struct sigmatel_spec *spec;
6446	int err;
6447
6448	spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
6449	if (spec == NULL)
6450		return -ENOMEM;
6451	codec->no_trigger_sense = 1;
6452	codec->spec = spec;
6453	spec->linear_tone_beep = 1;
6454	spec->num_pins = ARRAY_SIZE(stac9872_pin_nids);
6455	spec->pin_nids = stac9872_pin_nids;
6456
6457	spec->board_config = snd_hda_check_board_config(codec, STAC_9872_MODELS,
6458							stac9872_models,
6459							stac9872_cfg_tbl);
6460	if (spec->board_config < 0)
6461		snd_printdd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
6462			    codec->chip_name);
6463	else
6464		stac92xx_set_config_regs(codec,
6465					 stac9872_brd_tbl[spec->board_config]);
6466
6467	spec->multiout.dac_nids = spec->dac_nids;
6468	spec->num_adcs = ARRAY_SIZE(stac9872_adc_nids);
6469	spec->adc_nids = stac9872_adc_nids;
6470	spec->num_muxes = ARRAY_SIZE(stac9872_mux_nids);
6471	spec->mux_nids = stac9872_mux_nids;
6472	spec->init = stac9872_core_init;
6473	spec->num_caps = 1;
6474	spec->capvols = stac9872_capvols;
6475	spec->capsws = stac9872_capsws;
6476
6477	err = stac92xx_parse_auto_config(codec, 0x10, 0x12);
6478	if (err < 0) {
6479		stac92xx_free(codec);
6480		return -EINVAL;
6481	}
6482	spec->input_mux = &spec->private_imux;
6483	codec->patch_ops = stac92xx_patch_ops;
 
6484	return 0;
6485}
6486
6487
6488/*
6489 * patch entries
6490 */
6491static const struct hda_codec_preset snd_hda_preset_sigmatel[] = {
6492 	{ .id = 0x83847690, .name = "STAC9200", .patch = patch_stac9200 },
6493 	{ .id = 0x83847882, .name = "STAC9220 A1", .patch = patch_stac922x },
6494 	{ .id = 0x83847680, .name = "STAC9221 A1", .patch = patch_stac922x },
6495 	{ .id = 0x83847880, .name = "STAC9220 A2", .patch = patch_stac922x },
6496 	{ .id = 0x83847681, .name = "STAC9220D/9223D A2", .patch = patch_stac922x },
6497 	{ .id = 0x83847682, .name = "STAC9221 A2", .patch = patch_stac922x },
6498 	{ .id = 0x83847683, .name = "STAC9221D A2", .patch = patch_stac922x },
6499 	{ .id = 0x83847618, .name = "STAC9227", .patch = patch_stac927x },
6500 	{ .id = 0x83847619, .name = "STAC9227", .patch = patch_stac927x },
6501 	{ .id = 0x83847616, .name = "STAC9228", .patch = patch_stac927x },
6502 	{ .id = 0x83847617, .name = "STAC9228", .patch = patch_stac927x },
6503 	{ .id = 0x83847614, .name = "STAC9229", .patch = patch_stac927x },
6504 	{ .id = 0x83847615, .name = "STAC9229", .patch = patch_stac927x },
6505 	{ .id = 0x83847620, .name = "STAC9274", .patch = patch_stac927x },
6506 	{ .id = 0x83847621, .name = "STAC9274D", .patch = patch_stac927x },
6507 	{ .id = 0x83847622, .name = "STAC9273X", .patch = patch_stac927x },
6508 	{ .id = 0x83847623, .name = "STAC9273D", .patch = patch_stac927x },
6509 	{ .id = 0x83847624, .name = "STAC9272X", .patch = patch_stac927x },
6510 	{ .id = 0x83847625, .name = "STAC9272D", .patch = patch_stac927x },
6511 	{ .id = 0x83847626, .name = "STAC9271X", .patch = patch_stac927x },
6512 	{ .id = 0x83847627, .name = "STAC9271D", .patch = patch_stac927x },
6513 	{ .id = 0x83847628, .name = "STAC9274X5NH", .patch = patch_stac927x },
6514 	{ .id = 0x83847629, .name = "STAC9274D5NH", .patch = patch_stac927x },
6515	{ .id = 0x83847632, .name = "STAC9202",  .patch = patch_stac925x },
6516	{ .id = 0x83847633, .name = "STAC9202D", .patch = patch_stac925x },
6517	{ .id = 0x83847634, .name = "STAC9250", .patch = patch_stac925x },
6518	{ .id = 0x83847635, .name = "STAC9250D", .patch = patch_stac925x },
6519	{ .id = 0x83847636, .name = "STAC9251", .patch = patch_stac925x },
6520	{ .id = 0x83847637, .name = "STAC9250D", .patch = patch_stac925x },
6521	{ .id = 0x83847645, .name = "92HD206X", .patch = patch_stac927x },
6522	{ .id = 0x83847646, .name = "92HD206D", .patch = patch_stac927x },
6523 	/* The following does not take into account .id=0x83847661 when subsys =
6524 	 * 104D0C00 which is STAC9225s. Because of this, some SZ Notebooks are
6525 	 * currently not fully supported.
6526 	 */
6527 	{ .id = 0x83847661, .name = "CXD9872RD/K", .patch = patch_stac9872 },
6528 	{ .id = 0x83847662, .name = "STAC9872AK", .patch = patch_stac9872 },
6529 	{ .id = 0x83847664, .name = "CXD9872AKD", .patch = patch_stac9872 },
6530	{ .id = 0x83847698, .name = "STAC9205", .patch = patch_stac9205 },
6531 	{ .id = 0x838476a0, .name = "STAC9205", .patch = patch_stac9205 },
6532 	{ .id = 0x838476a1, .name = "STAC9205D", .patch = patch_stac9205 },
6533 	{ .id = 0x838476a2, .name = "STAC9204", .patch = patch_stac9205 },
6534 	{ .id = 0x838476a3, .name = "STAC9204D", .patch = patch_stac9205 },
6535 	{ .id = 0x838476a4, .name = "STAC9255", .patch = patch_stac9205 },
6536 	{ .id = 0x838476a5, .name = "STAC9255D", .patch = patch_stac9205 },
6537 	{ .id = 0x838476a6, .name = "STAC9254", .patch = patch_stac9205 },
6538 	{ .id = 0x838476a7, .name = "STAC9254D", .patch = patch_stac9205 },
6539	{ .id = 0x111d7603, .name = "92HD75B3X5", .patch = patch_stac92hd71bxx},
6540	{ .id = 0x111d7604, .name = "92HD83C1X5", .patch = patch_stac92hd83xxx},
6541	{ .id = 0x111d76d4, .name = "92HD83C1C5", .patch = patch_stac92hd83xxx},
6542	{ .id = 0x111d7605, .name = "92HD81B1X5", .patch = patch_stac92hd83xxx},
6543	{ .id = 0x111d76d5, .name = "92HD81B1C5", .patch = patch_stac92hd83xxx},
6544	{ .id = 0x111d76d1, .name = "92HD87B1/3", .patch = patch_stac92hd83xxx},
6545	{ .id = 0x111d76d9, .name = "92HD87B2/4", .patch = patch_stac92hd83xxx},
6546	{ .id = 0x111d7666, .name = "92HD88B3", .patch = patch_stac92hd83xxx},
6547	{ .id = 0x111d7667, .name = "92HD88B1", .patch = patch_stac92hd83xxx},
6548	{ .id = 0x111d7668, .name = "92HD88B2", .patch = patch_stac92hd83xxx},
6549	{ .id = 0x111d7669, .name = "92HD88B4", .patch = patch_stac92hd83xxx},
6550	{ .id = 0x111d7608, .name = "92HD75B2X5", .patch = patch_stac92hd71bxx},
6551	{ .id = 0x111d7674, .name = "92HD73D1X5", .patch = patch_stac92hd73xx },
6552	{ .id = 0x111d7675, .name = "92HD73C1X5", .patch = patch_stac92hd73xx },
6553	{ .id = 0x111d7676, .name = "92HD73E1X5", .patch = patch_stac92hd73xx },
6554	{ .id = 0x111d76b0, .name = "92HD71B8X", .patch = patch_stac92hd71bxx },
6555	{ .id = 0x111d76b1, .name = "92HD71B8X", .patch = patch_stac92hd71bxx },
6556	{ .id = 0x111d76b2, .name = "92HD71B7X", .patch = patch_stac92hd71bxx },
6557	{ .id = 0x111d76b3, .name = "92HD71B7X", .patch = patch_stac92hd71bxx },
6558	{ .id = 0x111d76b4, .name = "92HD71B6X", .patch = patch_stac92hd71bxx },
6559	{ .id = 0x111d76b5, .name = "92HD71B6X", .patch = patch_stac92hd71bxx },
6560	{ .id = 0x111d76b6, .name = "92HD71B5X", .patch = patch_stac92hd71bxx },
6561	{ .id = 0x111d76b7, .name = "92HD71B5X", .patch = patch_stac92hd71bxx },
6562	{ .id = 0x111d76c0, .name = "92HD89C3", .patch = patch_stac92hd73xx },
6563	{ .id = 0x111d76c1, .name = "92HD89C2", .patch = patch_stac92hd73xx },
6564	{ .id = 0x111d76c2, .name = "92HD89C1", .patch = patch_stac92hd73xx },
6565	{ .id = 0x111d76c3, .name = "92HD89B3", .patch = patch_stac92hd73xx },
6566	{ .id = 0x111d76c4, .name = "92HD89B2", .patch = patch_stac92hd73xx },
6567	{ .id = 0x111d76c5, .name = "92HD89B1", .patch = patch_stac92hd73xx },
6568	{ .id = 0x111d76c6, .name = "92HD89E3", .patch = patch_stac92hd73xx },
6569	{ .id = 0x111d76c7, .name = "92HD89E2", .patch = patch_stac92hd73xx },
6570	{ .id = 0x111d76c8, .name = "92HD89E1", .patch = patch_stac92hd73xx },
6571	{ .id = 0x111d76c9, .name = "92HD89D3", .patch = patch_stac92hd73xx },
6572	{ .id = 0x111d76ca, .name = "92HD89D2", .patch = patch_stac92hd73xx },
6573	{ .id = 0x111d76cb, .name = "92HD89D1", .patch = patch_stac92hd73xx },
6574	{ .id = 0x111d76cc, .name = "92HD89F3", .patch = patch_stac92hd73xx },
6575	{ .id = 0x111d76cd, .name = "92HD89F2", .patch = patch_stac92hd73xx },
6576	{ .id = 0x111d76ce, .name = "92HD89F1", .patch = patch_stac92hd73xx },
6577	{ .id = 0x111d76df, .name = "92HD93BXX", .patch = patch_stac92hd83xxx},
6578	{ .id = 0x111d76e0, .name = "92HD91BXX", .patch = patch_stac92hd83xxx},
6579	{ .id = 0x111d76e3, .name = "92HD98BXX", .patch = patch_stac92hd83xxx},
6580	{ .id = 0x111d76e5, .name = "92HD99BXX", .patch = patch_stac92hd83xxx},
6581	{ .id = 0x111d76e7, .name = "92HD90BXX", .patch = patch_stac92hd83xxx},
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6582	{} /* terminator */
6583};
6584
6585MODULE_ALIAS("snd-hda-codec-id:8384*");
6586MODULE_ALIAS("snd-hda-codec-id:111d*");
6587
6588MODULE_LICENSE("GPL");
6589MODULE_DESCRIPTION("IDT/Sigmatel HD-audio codec");
6590
6591static struct hda_codec_preset_list sigmatel_list = {
6592	.preset = snd_hda_preset_sigmatel,
6593	.owner = THIS_MODULE,
6594};
6595
6596static int __init patch_sigmatel_init(void)
6597{
6598	return snd_hda_add_codec_preset(&sigmatel_list);
6599}
6600
6601static void __exit patch_sigmatel_exit(void)
6602{
6603	snd_hda_delete_codec_preset(&sigmatel_list);
6604}
6605
6606module_init(patch_sigmatel_init)
6607module_exit(patch_sigmatel_exit)