cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

patch_ca0132.c (284408B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * HD audio interface patch for Creative CA0132 chip
      4 *
      5 * Copyright (c) 2011, Creative Technology Ltd.
      6 *
      7 * Based on patch_ca0110.c
      8 * Copyright (c) 2008 Takashi Iwai <tiwai@suse.de>
      9 */
     10
     11#include <linux/init.h>
     12#include <linux/delay.h>
     13#include <linux/slab.h>
     14#include <linux/mutex.h>
     15#include <linux/module.h>
     16#include <linux/firmware.h>
     17#include <linux/kernel.h>
     18#include <linux/types.h>
     19#include <linux/io.h>
     20#include <linux/pci.h>
     21#include <asm/io.h>
     22#include <sound/core.h>
     23#include <sound/hda_codec.h>
     24#include "hda_local.h"
     25#include "hda_auto_parser.h"
     26#include "hda_jack.h"
     27
     28#include "ca0132_regs.h"
     29
     30/* Enable this to see controls for tuning purpose. */
     31/*#define ENABLE_TUNING_CONTROLS*/
     32
     33#ifdef ENABLE_TUNING_CONTROLS
     34#include <sound/tlv.h>
     35#endif
     36
     37#define FLOAT_ZERO	0x00000000
     38#define FLOAT_ONE	0x3f800000
     39#define FLOAT_TWO	0x40000000
     40#define FLOAT_THREE     0x40400000
     41#define FLOAT_FIVE	0x40a00000
     42#define FLOAT_SIX       0x40c00000
     43#define FLOAT_EIGHT     0x41000000
     44#define FLOAT_MINUS_5	0xc0a00000
     45
     46#define UNSOL_TAG_DSP	0x16
     47
     48#define DSP_DMA_WRITE_BUFLEN_INIT (1UL<<18)
     49#define DSP_DMA_WRITE_BUFLEN_OVLY (1UL<<15)
     50
     51#define DMA_TRANSFER_FRAME_SIZE_NWORDS		8
     52#define DMA_TRANSFER_MAX_FRAME_SIZE_NWORDS	32
     53#define DMA_OVERLAY_FRAME_SIZE_NWORDS		2
     54
     55#define MASTERCONTROL				0x80
     56#define MASTERCONTROL_ALLOC_DMA_CHAN		10
     57#define MASTERCONTROL_QUERY_SPEAKER_EQ_ADDRESS	60
     58
     59#define WIDGET_CHIP_CTRL      0x15
     60#define WIDGET_DSP_CTRL       0x16
     61
     62#define MEM_CONNID_MICIN1     3
     63#define MEM_CONNID_MICIN2     5
     64#define MEM_CONNID_MICOUT1    12
     65#define MEM_CONNID_MICOUT2    14
     66#define MEM_CONNID_WUH        10
     67#define MEM_CONNID_DSP        16
     68#define MEM_CONNID_DMIC       100
     69
     70#define SCP_SET    0
     71#define SCP_GET    1
     72
     73#define EFX_FILE   "ctefx.bin"
     74#define DESKTOP_EFX_FILE   "ctefx-desktop.bin"
     75#define R3DI_EFX_FILE  "ctefx-r3di.bin"
     76
     77#ifdef CONFIG_SND_HDA_CODEC_CA0132_DSP
     78MODULE_FIRMWARE(EFX_FILE);
     79MODULE_FIRMWARE(DESKTOP_EFX_FILE);
     80MODULE_FIRMWARE(R3DI_EFX_FILE);
     81#endif
     82
     83static const char *const dirstr[2] = { "Playback", "Capture" };
     84
     85#define NUM_OF_OUTPUTS 2
     86static const char *const out_type_str[2] = { "Speakers", "Headphone" };
     87enum {
     88	SPEAKER_OUT,
     89	HEADPHONE_OUT,
     90};
     91
     92enum {
     93	DIGITAL_MIC,
     94	LINE_MIC_IN
     95};
     96
     97/* Strings for Input Source Enum Control */
     98static const char *const in_src_str[3] = { "Microphone", "Line In", "Front Microphone" };
     99#define IN_SRC_NUM_OF_INPUTS 3
    100enum {
    101	REAR_MIC,
    102	REAR_LINE_IN,
    103	FRONT_MIC,
    104};
    105
    106enum {
    107#define VNODE_START_NID    0x80
    108	VNID_SPK = VNODE_START_NID,			/* Speaker vnid */
    109	VNID_MIC,
    110	VNID_HP_SEL,
    111	VNID_AMIC1_SEL,
    112	VNID_HP_ASEL,
    113	VNID_AMIC1_ASEL,
    114	VNODE_END_NID,
    115#define VNODES_COUNT  (VNODE_END_NID - VNODE_START_NID)
    116
    117#define EFFECT_START_NID    0x90
    118#define OUT_EFFECT_START_NID    EFFECT_START_NID
    119	SURROUND = OUT_EFFECT_START_NID,
    120	CRYSTALIZER,
    121	DIALOG_PLUS,
    122	SMART_VOLUME,
    123	X_BASS,
    124	EQUALIZER,
    125	OUT_EFFECT_END_NID,
    126#define OUT_EFFECTS_COUNT  (OUT_EFFECT_END_NID - OUT_EFFECT_START_NID)
    127
    128#define IN_EFFECT_START_NID  OUT_EFFECT_END_NID
    129	ECHO_CANCELLATION = IN_EFFECT_START_NID,
    130	VOICE_FOCUS,
    131	MIC_SVM,
    132	NOISE_REDUCTION,
    133	IN_EFFECT_END_NID,
    134#define IN_EFFECTS_COUNT  (IN_EFFECT_END_NID - IN_EFFECT_START_NID)
    135
    136	VOICEFX = IN_EFFECT_END_NID,
    137	PLAY_ENHANCEMENT,
    138	CRYSTAL_VOICE,
    139	EFFECT_END_NID,
    140	OUTPUT_SOURCE_ENUM,
    141	INPUT_SOURCE_ENUM,
    142	XBASS_XOVER,
    143	EQ_PRESET_ENUM,
    144	SMART_VOLUME_ENUM,
    145	MIC_BOOST_ENUM,
    146	AE5_HEADPHONE_GAIN_ENUM,
    147	AE5_SOUND_FILTER_ENUM,
    148	ZXR_HEADPHONE_GAIN,
    149	SPEAKER_CHANNEL_CFG_ENUM,
    150	SPEAKER_FULL_RANGE_FRONT,
    151	SPEAKER_FULL_RANGE_REAR,
    152	BASS_REDIRECTION,
    153	BASS_REDIRECTION_XOVER,
    154#define EFFECTS_COUNT  (EFFECT_END_NID - EFFECT_START_NID)
    155};
    156
    157/* Effects values size*/
    158#define EFFECT_VALS_MAX_COUNT 12
    159
    160/*
    161 * Default values for the effect slider controls, they are in order of their
    162 * effect NID's. Surround, Crystalizer, Dialog Plus, Smart Volume, and then
    163 * X-bass.
    164 */
    165static const unsigned int effect_slider_defaults[] = {67, 65, 50, 74, 50};
    166/* Amount of effect level sliders for ca0132_alt controls. */
    167#define EFFECT_LEVEL_SLIDERS 5
    168
    169/* Latency introduced by DSP blocks in milliseconds. */
    170#define DSP_CAPTURE_INIT_LATENCY        0
    171#define DSP_CRYSTAL_VOICE_LATENCY       124
    172#define DSP_PLAYBACK_INIT_LATENCY       13
    173#define DSP_PLAY_ENHANCEMENT_LATENCY    30
    174#define DSP_SPEAKER_OUT_LATENCY         7
    175
    176struct ct_effect {
    177	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
    178	hda_nid_t nid;
    179	int mid; /*effect module ID*/
    180	int reqs[EFFECT_VALS_MAX_COUNT]; /*effect module request*/
    181	int direct; /* 0:output; 1:input*/
    182	int params; /* number of default non-on/off params */
    183	/*effect default values, 1st is on/off. */
    184	unsigned int def_vals[EFFECT_VALS_MAX_COUNT];
    185};
    186
    187#define EFX_DIR_OUT 0
    188#define EFX_DIR_IN  1
    189
    190static const struct ct_effect ca0132_effects[EFFECTS_COUNT] = {
    191	{ .name = "Surround",
    192	  .nid = SURROUND,
    193	  .mid = 0x96,
    194	  .reqs = {0, 1},
    195	  .direct = EFX_DIR_OUT,
    196	  .params = 1,
    197	  .def_vals = {0x3F800000, 0x3F2B851F}
    198	},
    199	{ .name = "Crystalizer",
    200	  .nid = CRYSTALIZER,
    201	  .mid = 0x96,
    202	  .reqs = {7, 8},
    203	  .direct = EFX_DIR_OUT,
    204	  .params = 1,
    205	  .def_vals = {0x3F800000, 0x3F266666}
    206	},
    207	{ .name = "Dialog Plus",
    208	  .nid = DIALOG_PLUS,
    209	  .mid = 0x96,
    210	  .reqs = {2, 3},
    211	  .direct = EFX_DIR_OUT,
    212	  .params = 1,
    213	  .def_vals = {0x00000000, 0x3F000000}
    214	},
    215	{ .name = "Smart Volume",
    216	  .nid = SMART_VOLUME,
    217	  .mid = 0x96,
    218	  .reqs = {4, 5, 6},
    219	  .direct = EFX_DIR_OUT,
    220	  .params = 2,
    221	  .def_vals = {0x3F800000, 0x3F3D70A4, 0x00000000}
    222	},
    223	{ .name = "X-Bass",
    224	  .nid = X_BASS,
    225	  .mid = 0x96,
    226	  .reqs = {24, 23, 25},
    227	  .direct = EFX_DIR_OUT,
    228	  .params = 2,
    229	  .def_vals = {0x3F800000, 0x42A00000, 0x3F000000}
    230	},
    231	{ .name = "Equalizer",
    232	  .nid = EQUALIZER,
    233	  .mid = 0x96,
    234	  .reqs = {9, 10, 11, 12, 13, 14,
    235			15, 16, 17, 18, 19, 20},
    236	  .direct = EFX_DIR_OUT,
    237	  .params = 11,
    238	  .def_vals = {0x00000000, 0x00000000, 0x00000000, 0x00000000,
    239		       0x00000000, 0x00000000, 0x00000000, 0x00000000,
    240		       0x00000000, 0x00000000, 0x00000000, 0x00000000}
    241	},
    242	{ .name = "Echo Cancellation",
    243	  .nid = ECHO_CANCELLATION,
    244	  .mid = 0x95,
    245	  .reqs = {0, 1, 2, 3},
    246	  .direct = EFX_DIR_IN,
    247	  .params = 3,
    248	  .def_vals = {0x00000000, 0x3F3A9692, 0x00000000, 0x00000000}
    249	},
    250	{ .name = "Voice Focus",
    251	  .nid = VOICE_FOCUS,
    252	  .mid = 0x95,
    253	  .reqs = {6, 7, 8, 9},
    254	  .direct = EFX_DIR_IN,
    255	  .params = 3,
    256	  .def_vals = {0x3F800000, 0x3D7DF3B6, 0x41F00000, 0x41F00000}
    257	},
    258	{ .name = "Mic SVM",
    259	  .nid = MIC_SVM,
    260	  .mid = 0x95,
    261	  .reqs = {44, 45},
    262	  .direct = EFX_DIR_IN,
    263	  .params = 1,
    264	  .def_vals = {0x00000000, 0x3F3D70A4}
    265	},
    266	{ .name = "Noise Reduction",
    267	  .nid = NOISE_REDUCTION,
    268	  .mid = 0x95,
    269	  .reqs = {4, 5},
    270	  .direct = EFX_DIR_IN,
    271	  .params = 1,
    272	  .def_vals = {0x3F800000, 0x3F000000}
    273	},
    274	{ .name = "VoiceFX",
    275	  .nid = VOICEFX,
    276	  .mid = 0x95,
    277	  .reqs = {10, 11, 12, 13, 14, 15, 16, 17, 18},
    278	  .direct = EFX_DIR_IN,
    279	  .params = 8,
    280	  .def_vals = {0x00000000, 0x43C80000, 0x44AF0000, 0x44FA0000,
    281		       0x3F800000, 0x3F800000, 0x3F800000, 0x00000000,
    282		       0x00000000}
    283	}
    284};
    285
    286/* Tuning controls */
    287#ifdef ENABLE_TUNING_CONTROLS
    288
    289enum {
    290#define TUNING_CTL_START_NID  0xC0
    291	WEDGE_ANGLE = TUNING_CTL_START_NID,
    292	SVM_LEVEL,
    293	EQUALIZER_BAND_0,
    294	EQUALIZER_BAND_1,
    295	EQUALIZER_BAND_2,
    296	EQUALIZER_BAND_3,
    297	EQUALIZER_BAND_4,
    298	EQUALIZER_BAND_5,
    299	EQUALIZER_BAND_6,
    300	EQUALIZER_BAND_7,
    301	EQUALIZER_BAND_8,
    302	EQUALIZER_BAND_9,
    303	TUNING_CTL_END_NID
    304#define TUNING_CTLS_COUNT  (TUNING_CTL_END_NID - TUNING_CTL_START_NID)
    305};
    306
    307struct ct_tuning_ctl {
    308	char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
    309	hda_nid_t parent_nid;
    310	hda_nid_t nid;
    311	int mid; /*effect module ID*/
    312	int req; /*effect module request*/
    313	int direct; /* 0:output; 1:input*/
    314	unsigned int def_val;/*effect default values*/
    315};
    316
    317static const struct ct_tuning_ctl ca0132_tuning_ctls[] = {
    318	{ .name = "Wedge Angle",
    319	  .parent_nid = VOICE_FOCUS,
    320	  .nid = WEDGE_ANGLE,
    321	  .mid = 0x95,
    322	  .req = 8,
    323	  .direct = EFX_DIR_IN,
    324	  .def_val = 0x41F00000
    325	},
    326	{ .name = "SVM Level",
    327	  .parent_nid = MIC_SVM,
    328	  .nid = SVM_LEVEL,
    329	  .mid = 0x95,
    330	  .req = 45,
    331	  .direct = EFX_DIR_IN,
    332	  .def_val = 0x3F3D70A4
    333	},
    334	{ .name = "EQ Band0",
    335	  .parent_nid = EQUALIZER,
    336	  .nid = EQUALIZER_BAND_0,
    337	  .mid = 0x96,
    338	  .req = 11,
    339	  .direct = EFX_DIR_OUT,
    340	  .def_val = 0x00000000
    341	},
    342	{ .name = "EQ Band1",
    343	  .parent_nid = EQUALIZER,
    344	  .nid = EQUALIZER_BAND_1,
    345	  .mid = 0x96,
    346	  .req = 12,
    347	  .direct = EFX_DIR_OUT,
    348	  .def_val = 0x00000000
    349	},
    350	{ .name = "EQ Band2",
    351	  .parent_nid = EQUALIZER,
    352	  .nid = EQUALIZER_BAND_2,
    353	  .mid = 0x96,
    354	  .req = 13,
    355	  .direct = EFX_DIR_OUT,
    356	  .def_val = 0x00000000
    357	},
    358	{ .name = "EQ Band3",
    359	  .parent_nid = EQUALIZER,
    360	  .nid = EQUALIZER_BAND_3,
    361	  .mid = 0x96,
    362	  .req = 14,
    363	  .direct = EFX_DIR_OUT,
    364	  .def_val = 0x00000000
    365	},
    366	{ .name = "EQ Band4",
    367	  .parent_nid = EQUALIZER,
    368	  .nid = EQUALIZER_BAND_4,
    369	  .mid = 0x96,
    370	  .req = 15,
    371	  .direct = EFX_DIR_OUT,
    372	  .def_val = 0x00000000
    373	},
    374	{ .name = "EQ Band5",
    375	  .parent_nid = EQUALIZER,
    376	  .nid = EQUALIZER_BAND_5,
    377	  .mid = 0x96,
    378	  .req = 16,
    379	  .direct = EFX_DIR_OUT,
    380	  .def_val = 0x00000000
    381	},
    382	{ .name = "EQ Band6",
    383	  .parent_nid = EQUALIZER,
    384	  .nid = EQUALIZER_BAND_6,
    385	  .mid = 0x96,
    386	  .req = 17,
    387	  .direct = EFX_DIR_OUT,
    388	  .def_val = 0x00000000
    389	},
    390	{ .name = "EQ Band7",
    391	  .parent_nid = EQUALIZER,
    392	  .nid = EQUALIZER_BAND_7,
    393	  .mid = 0x96,
    394	  .req = 18,
    395	  .direct = EFX_DIR_OUT,
    396	  .def_val = 0x00000000
    397	},
    398	{ .name = "EQ Band8",
    399	  .parent_nid = EQUALIZER,
    400	  .nid = EQUALIZER_BAND_8,
    401	  .mid = 0x96,
    402	  .req = 19,
    403	  .direct = EFX_DIR_OUT,
    404	  .def_val = 0x00000000
    405	},
    406	{ .name = "EQ Band9",
    407	  .parent_nid = EQUALIZER,
    408	  .nid = EQUALIZER_BAND_9,
    409	  .mid = 0x96,
    410	  .req = 20,
    411	  .direct = EFX_DIR_OUT,
    412	  .def_val = 0x00000000
    413	}
    414};
    415#endif
    416
    417/* Voice FX Presets */
    418#define VOICEFX_MAX_PARAM_COUNT 9
    419
    420struct ct_voicefx {
    421	char *name;
    422	hda_nid_t nid;
    423	int mid;
    424	int reqs[VOICEFX_MAX_PARAM_COUNT]; /*effect module request*/
    425};
    426
    427struct ct_voicefx_preset {
    428	char *name; /*preset name*/
    429	unsigned int vals[VOICEFX_MAX_PARAM_COUNT];
    430};
    431
    432static const struct ct_voicefx ca0132_voicefx = {
    433	.name = "VoiceFX Capture Switch",
    434	.nid = VOICEFX,
    435	.mid = 0x95,
    436	.reqs = {10, 11, 12, 13, 14, 15, 16, 17, 18}
    437};
    438
    439static const struct ct_voicefx_preset ca0132_voicefx_presets[] = {
    440	{ .name = "Neutral",
    441	  .vals = { 0x00000000, 0x43C80000, 0x44AF0000,
    442		    0x44FA0000, 0x3F800000, 0x3F800000,
    443		    0x3F800000, 0x00000000, 0x00000000 }
    444	},
    445	{ .name = "Female2Male",
    446	  .vals = { 0x3F800000, 0x43C80000, 0x44AF0000,
    447		    0x44FA0000, 0x3F19999A, 0x3F866666,
    448		    0x3F800000, 0x00000000, 0x00000000 }
    449	},
    450	{ .name = "Male2Female",
    451	  .vals = { 0x3F800000, 0x43C80000, 0x44AF0000,
    452		    0x450AC000, 0x4017AE14, 0x3F6B851F,
    453		    0x3F800000, 0x00000000, 0x00000000 }
    454	},
    455	{ .name = "ScrappyKid",
    456	  .vals = { 0x3F800000, 0x43C80000, 0x44AF0000,
    457		    0x44FA0000, 0x40400000, 0x3F28F5C3,
    458		    0x3F800000, 0x00000000, 0x00000000 }
    459	},
    460	{ .name = "Elderly",
    461	  .vals = { 0x3F800000, 0x44324000, 0x44BB8000,
    462		    0x44E10000, 0x3FB33333, 0x3FB9999A,
    463		    0x3F800000, 0x3E3A2E43, 0x00000000 }
    464	},
    465	{ .name = "Orc",
    466	  .vals = { 0x3F800000, 0x43EA0000, 0x44A52000,
    467		    0x45098000, 0x3F266666, 0x3FC00000,
    468		    0x3F800000, 0x00000000, 0x00000000 }
    469	},
    470	{ .name = "Elf",
    471	  .vals = { 0x3F800000, 0x43C70000, 0x44AE6000,
    472		    0x45193000, 0x3F8E147B, 0x3F75C28F,
    473		    0x3F800000, 0x00000000, 0x00000000 }
    474	},
    475	{ .name = "Dwarf",
    476	  .vals = { 0x3F800000, 0x43930000, 0x44BEE000,
    477		    0x45007000, 0x3F451EB8, 0x3F7851EC,
    478		    0x3F800000, 0x00000000, 0x00000000 }
    479	},
    480	{ .name = "AlienBrute",
    481	  .vals = { 0x3F800000, 0x43BFC5AC, 0x44B28FDF,
    482		    0x451F6000, 0x3F266666, 0x3FA7D945,
    483		    0x3F800000, 0x3CF5C28F, 0x00000000 }
    484	},
    485	{ .name = "Robot",
    486	  .vals = { 0x3F800000, 0x43C80000, 0x44AF0000,
    487		    0x44FA0000, 0x3FB2718B, 0x3F800000,
    488		    0xBC07010E, 0x00000000, 0x00000000 }
    489	},
    490	{ .name = "Marine",
    491	  .vals = { 0x3F800000, 0x43C20000, 0x44906000,
    492		    0x44E70000, 0x3F4CCCCD, 0x3F8A3D71,
    493		    0x3F0A3D71, 0x00000000, 0x00000000 }
    494	},
    495	{ .name = "Emo",
    496	  .vals = { 0x3F800000, 0x43C80000, 0x44AF0000,
    497		    0x44FA0000, 0x3F800000, 0x3F800000,
    498		    0x3E4CCCCD, 0x00000000, 0x00000000 }
    499	},
    500	{ .name = "DeepVoice",
    501	  .vals = { 0x3F800000, 0x43A9C5AC, 0x44AA4FDF,
    502		    0x44FFC000, 0x3EDBB56F, 0x3F99C4CA,
    503		    0x3F800000, 0x00000000, 0x00000000 }
    504	},
    505	{ .name = "Munchkin",
    506	  .vals = { 0x3F800000, 0x43C80000, 0x44AF0000,
    507		    0x44FA0000, 0x3F800000, 0x3F1A043C,
    508		    0x3F800000, 0x00000000, 0x00000000 }
    509	}
    510};
    511
    512/* ca0132 EQ presets, taken from Windows Sound Blaster Z Driver */
    513
    514#define EQ_PRESET_MAX_PARAM_COUNT 11
    515
    516struct ct_eq {
    517	char *name;
    518	hda_nid_t nid;
    519	int mid;
    520	int reqs[EQ_PRESET_MAX_PARAM_COUNT]; /*effect module request*/
    521};
    522
    523struct ct_eq_preset {
    524	char *name; /*preset name*/
    525	unsigned int vals[EQ_PRESET_MAX_PARAM_COUNT];
    526};
    527
    528static const struct ct_eq ca0132_alt_eq_enum = {
    529	.name = "FX: Equalizer Preset Switch",
    530	.nid = EQ_PRESET_ENUM,
    531	.mid = 0x96,
    532	.reqs = {10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}
    533};
    534
    535
    536static const struct ct_eq_preset ca0132_alt_eq_presets[] = {
    537	{ .name = "Flat",
    538	 .vals = { 0x00000000, 0x00000000, 0x00000000,
    539		   0x00000000, 0x00000000, 0x00000000,
    540		   0x00000000, 0x00000000, 0x00000000,
    541		   0x00000000, 0x00000000	     }
    542	},
    543	{ .name = "Acoustic",
    544	 .vals = { 0x00000000, 0x00000000, 0x3F8CCCCD,
    545		   0x40000000, 0x00000000, 0x00000000,
    546		   0x00000000, 0x00000000, 0x40000000,
    547		   0x40000000, 0x40000000	     }
    548	},
    549	{ .name = "Classical",
    550	 .vals = { 0x00000000, 0x00000000, 0x40C00000,
    551		   0x40C00000, 0x40466666, 0x00000000,
    552		   0x00000000, 0x00000000, 0x00000000,
    553		   0x40466666, 0x40466666	     }
    554	},
    555	{ .name = "Country",
    556	 .vals = { 0x00000000, 0xBF99999A, 0x00000000,
    557		   0x3FA66666, 0x3FA66666, 0x3F8CCCCD,
    558		   0x00000000, 0x00000000, 0x40000000,
    559		   0x40466666, 0x40800000	     }
    560	},
    561	{ .name = "Dance",
    562	 .vals = { 0x00000000, 0xBF99999A, 0x40000000,
    563		   0x40466666, 0x40866666, 0xBF99999A,
    564		   0xBF99999A, 0x00000000, 0x00000000,
    565		   0x40800000, 0x40800000	     }
    566	},
    567	{ .name = "Jazz",
    568	 .vals = { 0x00000000, 0x00000000, 0x00000000,
    569		   0x3F8CCCCD, 0x40800000, 0x40800000,
    570		   0x40800000, 0x00000000, 0x3F8CCCCD,
    571		   0x40466666, 0x40466666	     }
    572	},
    573	{ .name = "New Age",
    574	 .vals = { 0x00000000, 0x00000000, 0x40000000,
    575		   0x40000000, 0x00000000, 0x00000000,
    576		   0x00000000, 0x3F8CCCCD, 0x40000000,
    577		   0x40000000, 0x40000000	     }
    578	},
    579	{ .name = "Pop",
    580	 .vals = { 0x00000000, 0xBFCCCCCD, 0x00000000,
    581		   0x40000000, 0x40000000, 0x00000000,
    582		   0xBF99999A, 0xBF99999A, 0x00000000,
    583		   0x40466666, 0x40C00000	     }
    584	},
    585	{ .name = "Rock",
    586	 .vals = { 0x00000000, 0xBF99999A, 0xBF99999A,
    587		   0x3F8CCCCD, 0x40000000, 0xBF99999A,
    588		   0xBF99999A, 0x00000000, 0x00000000,
    589		   0x40800000, 0x40800000	     }
    590	},
    591	{ .name = "Vocal",
    592	 .vals = { 0x00000000, 0xC0000000, 0xBF99999A,
    593		   0xBF99999A, 0x00000000, 0x40466666,
    594		   0x40800000, 0x40466666, 0x00000000,
    595		   0x00000000, 0x3F8CCCCD	     }
    596	}
    597};
    598
    599/*
    600 * DSP reqs for handling full-range speakers/bass redirection. If a speaker is
    601 * set as not being full range, and bass redirection is enabled, all
    602 * frequencies below the crossover frequency are redirected to the LFE
    603 * channel. If the surround configuration has no LFE channel, this can't be
    604 * enabled. X-Bass must be disabled when using these.
    605 */
    606enum speaker_range_reqs {
    607	SPEAKER_BASS_REDIRECT            = 0x15,
    608	SPEAKER_BASS_REDIRECT_XOVER_FREQ = 0x16,
    609	/* Between 0x16-0x1a are the X-Bass reqs. */
    610	SPEAKER_FULL_RANGE_FRONT_L_R     = 0x1a,
    611	SPEAKER_FULL_RANGE_CENTER_LFE    = 0x1b,
    612	SPEAKER_FULL_RANGE_REAR_L_R      = 0x1c,
    613	SPEAKER_FULL_RANGE_SURROUND_L_R  = 0x1d,
    614	SPEAKER_BASS_REDIRECT_SUB_GAIN   = 0x1e,
    615};
    616
    617/*
    618 * Definitions for the DSP req's to handle speaker tuning. These all belong to
    619 * module ID 0x96, the output effects module.
    620 */
    621enum speaker_tuning_reqs {
    622	/*
    623	 * Currently, this value is always set to 0.0f. However, on Windows,
    624	 * when selecting certain headphone profiles on the new Sound Blaster
    625	 * connect software, the QUERY_SPEAKER_EQ_ADDRESS req on mid 0x80 is
    626	 * sent. This gets the speaker EQ address area, which is then used to
    627	 * send over (presumably) an equalizer profile for the specific
    628	 * headphone setup. It is sent using the same method the DSP
    629	 * firmware is uploaded with, which I believe is why the 'ctspeq.bin'
    630	 * file exists in linux firmware tree but goes unused. It would also
    631	 * explain why the QUERY_SPEAKER_EQ_ADDRESS req is defined but unused.
    632	 * Once this profile is sent over, SPEAKER_TUNING_USE_SPEAKER_EQ is
    633	 * set to 1.0f.
    634	 */
    635	SPEAKER_TUNING_USE_SPEAKER_EQ           = 0x1f,
    636	SPEAKER_TUNING_ENABLE_CENTER_EQ         = 0x20,
    637	SPEAKER_TUNING_FRONT_LEFT_VOL_LEVEL     = 0x21,
    638	SPEAKER_TUNING_FRONT_RIGHT_VOL_LEVEL    = 0x22,
    639	SPEAKER_TUNING_CENTER_VOL_LEVEL         = 0x23,
    640	SPEAKER_TUNING_LFE_VOL_LEVEL            = 0x24,
    641	SPEAKER_TUNING_REAR_LEFT_VOL_LEVEL      = 0x25,
    642	SPEAKER_TUNING_REAR_RIGHT_VOL_LEVEL     = 0x26,
    643	SPEAKER_TUNING_SURROUND_LEFT_VOL_LEVEL  = 0x27,
    644	SPEAKER_TUNING_SURROUND_RIGHT_VOL_LEVEL = 0x28,
    645	/*
    646	 * Inversion is used when setting headphone virtualization to line
    647	 * out. Not sure why this is, but it's the only place it's ever used.
    648	 */
    649	SPEAKER_TUNING_FRONT_LEFT_INVERT        = 0x29,
    650	SPEAKER_TUNING_FRONT_RIGHT_INVERT       = 0x2a,
    651	SPEAKER_TUNING_CENTER_INVERT            = 0x2b,
    652	SPEAKER_TUNING_LFE_INVERT               = 0x2c,
    653	SPEAKER_TUNING_REAR_LEFT_INVERT         = 0x2d,
    654	SPEAKER_TUNING_REAR_RIGHT_INVERT        = 0x2e,
    655	SPEAKER_TUNING_SURROUND_LEFT_INVERT     = 0x2f,
    656	SPEAKER_TUNING_SURROUND_RIGHT_INVERT    = 0x30,
    657	/* Delay is used when setting surround speaker distance in Windows. */
    658	SPEAKER_TUNING_FRONT_LEFT_DELAY         = 0x31,
    659	SPEAKER_TUNING_FRONT_RIGHT_DELAY        = 0x32,
    660	SPEAKER_TUNING_CENTER_DELAY             = 0x33,
    661	SPEAKER_TUNING_LFE_DELAY                = 0x34,
    662	SPEAKER_TUNING_REAR_LEFT_DELAY          = 0x35,
    663	SPEAKER_TUNING_REAR_RIGHT_DELAY         = 0x36,
    664	SPEAKER_TUNING_SURROUND_LEFT_DELAY      = 0x37,
    665	SPEAKER_TUNING_SURROUND_RIGHT_DELAY     = 0x38,
    666	/* Of these two, only mute seems to ever be used. */
    667	SPEAKER_TUNING_MAIN_VOLUME              = 0x39,
    668	SPEAKER_TUNING_MUTE                     = 0x3a,
    669};
    670
    671/* Surround output channel count configuration structures. */
    672#define SPEAKER_CHANNEL_CFG_COUNT 5
    673enum {
    674	SPEAKER_CHANNELS_2_0,
    675	SPEAKER_CHANNELS_2_1,
    676	SPEAKER_CHANNELS_4_0,
    677	SPEAKER_CHANNELS_4_1,
    678	SPEAKER_CHANNELS_5_1,
    679};
    680
    681struct ca0132_alt_speaker_channel_cfg {
    682	char *name;
    683	unsigned int val;
    684};
    685
    686static const struct ca0132_alt_speaker_channel_cfg speaker_channel_cfgs[] = {
    687	{ .name = "2.0",
    688	  .val = FLOAT_ONE
    689	},
    690	{ .name = "2.1",
    691	  .val = FLOAT_TWO
    692	},
    693	{ .name = "4.0",
    694	  .val = FLOAT_FIVE
    695	},
    696	{ .name = "4.1",
    697	  .val = FLOAT_SIX
    698	},
    699	{ .name = "5.1",
    700	  .val = FLOAT_EIGHT
    701	}
    702};
    703
    704/*
    705 * DSP volume setting structs. Req 1 is left volume, req 2 is right volume,
    706 * and I don't know what the third req is, but it's always zero. I assume it's
    707 * some sort of update or set command to tell the DSP there's new volume info.
    708 */
    709#define DSP_VOL_OUT 0
    710#define DSP_VOL_IN  1
    711
    712struct ct_dsp_volume_ctl {
    713	hda_nid_t vnid;
    714	int mid; /* module ID*/
    715	unsigned int reqs[3]; /* scp req ID */
    716};
    717
    718static const struct ct_dsp_volume_ctl ca0132_alt_vol_ctls[] = {
    719	{ .vnid = VNID_SPK,
    720	  .mid = 0x32,
    721	  .reqs = {3, 4, 2}
    722	},
    723	{ .vnid = VNID_MIC,
    724	  .mid = 0x37,
    725	  .reqs = {2, 3, 1}
    726	}
    727};
    728
    729/* Values for ca0113_mmio_command_set for selecting output. */
    730#define AE_CA0113_OUT_SET_COMMANDS 6
    731struct ae_ca0113_output_set {
    732	unsigned int group[AE_CA0113_OUT_SET_COMMANDS];
    733	unsigned int target[AE_CA0113_OUT_SET_COMMANDS];
    734	unsigned int vals[NUM_OF_OUTPUTS][AE_CA0113_OUT_SET_COMMANDS];
    735};
    736
    737static const struct ae_ca0113_output_set ae5_ca0113_output_presets = {
    738	.group =  { 0x30, 0x30, 0x48, 0x48, 0x48, 0x30 },
    739	.target = { 0x2e, 0x30, 0x0d, 0x17, 0x19, 0x32 },
    740		    /* Speakers. */
    741	.vals =   { { 0x00, 0x00, 0x40, 0x00, 0x00, 0x3f },
    742		    /* Headphones. */
    743		    { 0x3f, 0x3f, 0x00, 0x00, 0x00, 0x00 } },
    744};
    745
    746static const struct ae_ca0113_output_set ae7_ca0113_output_presets = {
    747	.group  = { 0x30, 0x30, 0x48, 0x48, 0x48, 0x30 },
    748	.target = { 0x2e, 0x30, 0x0d, 0x17, 0x19, 0x32 },
    749		    /* Speakers. */
    750	.vals   = { { 0x00, 0x00, 0x40, 0x00, 0x00, 0x3f },
    751		    /* Headphones. */
    752		    { 0x3f, 0x3f, 0x00, 0x00, 0x02, 0x00 } },
    753};
    754
    755/* ae5 ca0113 command sequences to set headphone gain levels. */
    756#define AE5_HEADPHONE_GAIN_PRESET_MAX_COMMANDS 4
    757struct ae5_headphone_gain_set {
    758	char *name;
    759	unsigned int vals[AE5_HEADPHONE_GAIN_PRESET_MAX_COMMANDS];
    760};
    761
    762static const struct ae5_headphone_gain_set ae5_headphone_gain_presets[] = {
    763	{ .name = "Low (16-31",
    764	  .vals = { 0xff, 0x2c, 0xf5, 0x32 }
    765	},
    766	{ .name = "Medium (32-149",
    767	  .vals = { 0x38, 0xa8, 0x3e, 0x4c }
    768	},
    769	{ .name = "High (150-600",
    770	  .vals = { 0xff, 0xff, 0xff, 0x7f }
    771	}
    772};
    773
    774struct ae5_filter_set {
    775	char *name;
    776	unsigned int val;
    777};
    778
    779static const struct ae5_filter_set ae5_filter_presets[] = {
    780	{ .name = "Slow Roll Off",
    781	  .val = 0xa0
    782	},
    783	{ .name = "Minimum Phase",
    784	  .val = 0xc0
    785	},
    786	{ .name = "Fast Roll Off",
    787	  .val = 0x80
    788	}
    789};
    790
    791/*
    792 * Data structures for storing audio router remapping data. These are used to
    793 * remap a currently active streams ports.
    794 */
    795struct chipio_stream_remap_data {
    796	unsigned int stream_id;
    797	unsigned int count;
    798
    799	unsigned int offset[16];
    800	unsigned int value[16];
    801};
    802
    803static const struct chipio_stream_remap_data stream_remap_data[] = {
    804	{ .stream_id = 0x14,
    805	  .count     = 0x04,
    806	  .offset    = { 0x00, 0x04, 0x08, 0x0c },
    807	  .value     = { 0x0001f8c0, 0x0001f9c1, 0x0001fac6, 0x0001fbc7 },
    808	},
    809	{ .stream_id = 0x0c,
    810	  .count     = 0x0c,
    811	  .offset    = { 0x00, 0x04, 0x08, 0x0c, 0x10, 0x14, 0x18, 0x1c,
    812			 0x20, 0x24, 0x28, 0x2c },
    813	  .value     = { 0x0001e0c0, 0x0001e1c1, 0x0001e4c2, 0x0001e5c3,
    814			 0x0001e2c4, 0x0001e3c5, 0x0001e8c6, 0x0001e9c7,
    815			 0x0001ecc8, 0x0001edc9, 0x0001eaca, 0x0001ebcb },
    816	},
    817	{ .stream_id = 0x0c,
    818	  .count     = 0x08,
    819	  .offset    = { 0x08, 0x0c, 0x10, 0x14, 0x20, 0x24, 0x28, 0x2c },
    820	  .value     = { 0x000140c2, 0x000141c3, 0x000150c4, 0x000151c5,
    821			 0x000142c8, 0x000143c9, 0x000152ca, 0x000153cb },
    822	}
    823};
    824
    825enum hda_cmd_vendor_io {
    826	/* for DspIO node */
    827	VENDOR_DSPIO_SCP_WRITE_DATA_LOW      = 0x000,
    828	VENDOR_DSPIO_SCP_WRITE_DATA_HIGH     = 0x100,
    829
    830	VENDOR_DSPIO_STATUS                  = 0xF01,
    831	VENDOR_DSPIO_SCP_POST_READ_DATA      = 0x702,
    832	VENDOR_DSPIO_SCP_READ_DATA           = 0xF02,
    833	VENDOR_DSPIO_DSP_INIT                = 0x703,
    834	VENDOR_DSPIO_SCP_POST_COUNT_QUERY    = 0x704,
    835	VENDOR_DSPIO_SCP_READ_COUNT          = 0xF04,
    836
    837	/* for ChipIO node */
    838	VENDOR_CHIPIO_ADDRESS_LOW            = 0x000,
    839	VENDOR_CHIPIO_ADDRESS_HIGH           = 0x100,
    840	VENDOR_CHIPIO_STREAM_FORMAT          = 0x200,
    841	VENDOR_CHIPIO_DATA_LOW               = 0x300,
    842	VENDOR_CHIPIO_DATA_HIGH              = 0x400,
    843
    844	VENDOR_CHIPIO_8051_WRITE_DIRECT      = 0x500,
    845	VENDOR_CHIPIO_8051_READ_DIRECT       = 0xD00,
    846
    847	VENDOR_CHIPIO_GET_PARAMETER          = 0xF00,
    848	VENDOR_CHIPIO_STATUS                 = 0xF01,
    849	VENDOR_CHIPIO_HIC_POST_READ          = 0x702,
    850	VENDOR_CHIPIO_HIC_READ_DATA          = 0xF03,
    851
    852	VENDOR_CHIPIO_8051_DATA_WRITE        = 0x707,
    853	VENDOR_CHIPIO_8051_DATA_READ         = 0xF07,
    854	VENDOR_CHIPIO_8051_PMEM_READ         = 0xF08,
    855	VENDOR_CHIPIO_8051_IRAM_WRITE        = 0x709,
    856	VENDOR_CHIPIO_8051_IRAM_READ         = 0xF09,
    857
    858	VENDOR_CHIPIO_CT_EXTENSIONS_ENABLE   = 0x70A,
    859	VENDOR_CHIPIO_CT_EXTENSIONS_GET      = 0xF0A,
    860
    861	VENDOR_CHIPIO_PLL_PMU_WRITE          = 0x70C,
    862	VENDOR_CHIPIO_PLL_PMU_READ           = 0xF0C,
    863	VENDOR_CHIPIO_8051_ADDRESS_LOW       = 0x70D,
    864	VENDOR_CHIPIO_8051_ADDRESS_HIGH      = 0x70E,
    865	VENDOR_CHIPIO_FLAG_SET               = 0x70F,
    866	VENDOR_CHIPIO_FLAGS_GET              = 0xF0F,
    867	VENDOR_CHIPIO_PARAM_SET              = 0x710,
    868	VENDOR_CHIPIO_PARAM_GET              = 0xF10,
    869
    870	VENDOR_CHIPIO_PORT_ALLOC_CONFIG_SET  = 0x711,
    871	VENDOR_CHIPIO_PORT_ALLOC_SET         = 0x712,
    872	VENDOR_CHIPIO_PORT_ALLOC_GET         = 0xF12,
    873	VENDOR_CHIPIO_PORT_FREE_SET          = 0x713,
    874
    875	VENDOR_CHIPIO_PARAM_EX_ID_GET        = 0xF17,
    876	VENDOR_CHIPIO_PARAM_EX_ID_SET        = 0x717,
    877	VENDOR_CHIPIO_PARAM_EX_VALUE_GET     = 0xF18,
    878	VENDOR_CHIPIO_PARAM_EX_VALUE_SET     = 0x718,
    879
    880	VENDOR_CHIPIO_DMIC_CTL_SET           = 0x788,
    881	VENDOR_CHIPIO_DMIC_CTL_GET           = 0xF88,
    882	VENDOR_CHIPIO_DMIC_PIN_SET           = 0x789,
    883	VENDOR_CHIPIO_DMIC_PIN_GET           = 0xF89,
    884	VENDOR_CHIPIO_DMIC_MCLK_SET          = 0x78A,
    885	VENDOR_CHIPIO_DMIC_MCLK_GET          = 0xF8A,
    886
    887	VENDOR_CHIPIO_EAPD_SEL_SET           = 0x78D
    888};
    889
    890/*
    891 *  Control flag IDs
    892 */
    893enum control_flag_id {
    894	/* Connection manager stream setup is bypassed/enabled */
    895	CONTROL_FLAG_C_MGR                  = 0,
    896	/* DSP DMA is bypassed/enabled */
    897	CONTROL_FLAG_DMA                    = 1,
    898	/* 8051 'idle' mode is disabled/enabled */
    899	CONTROL_FLAG_IDLE_ENABLE            = 2,
    900	/* Tracker for the SPDIF-in path is bypassed/enabled */
    901	CONTROL_FLAG_TRACKER                = 3,
    902	/* DigitalOut to Spdif2Out connection is disabled/enabled */
    903	CONTROL_FLAG_SPDIF2OUT              = 4,
    904	/* Digital Microphone is disabled/enabled */
    905	CONTROL_FLAG_DMIC                   = 5,
    906	/* ADC_B rate is 48 kHz/96 kHz */
    907	CONTROL_FLAG_ADC_B_96KHZ            = 6,
    908	/* ADC_C rate is 48 kHz/96 kHz */
    909	CONTROL_FLAG_ADC_C_96KHZ            = 7,
    910	/* DAC rate is 48 kHz/96 kHz (affects all DACs) */
    911	CONTROL_FLAG_DAC_96KHZ              = 8,
    912	/* DSP rate is 48 kHz/96 kHz */
    913	CONTROL_FLAG_DSP_96KHZ              = 9,
    914	/* SRC clock is 98 MHz/196 MHz (196 MHz forces rate to 96 KHz) */
    915	CONTROL_FLAG_SRC_CLOCK_196MHZ       = 10,
    916	/* SRC rate is 48 kHz/96 kHz (48 kHz disabled when clock is 196 MHz) */
    917	CONTROL_FLAG_SRC_RATE_96KHZ         = 11,
    918	/* Decode Loop (DSP->SRC->DSP) is disabled/enabled */
    919	CONTROL_FLAG_DECODE_LOOP            = 12,
    920	/* De-emphasis filter on DAC-1 disabled/enabled */
    921	CONTROL_FLAG_DAC1_DEEMPHASIS        = 13,
    922	/* De-emphasis filter on DAC-2 disabled/enabled */
    923	CONTROL_FLAG_DAC2_DEEMPHASIS        = 14,
    924	/* De-emphasis filter on DAC-3 disabled/enabled */
    925	CONTROL_FLAG_DAC3_DEEMPHASIS        = 15,
    926	/* High-pass filter on ADC_B disabled/enabled */
    927	CONTROL_FLAG_ADC_B_HIGH_PASS        = 16,
    928	/* High-pass filter on ADC_C disabled/enabled */
    929	CONTROL_FLAG_ADC_C_HIGH_PASS        = 17,
    930	/* Common mode on Port_A disabled/enabled */
    931	CONTROL_FLAG_PORT_A_COMMON_MODE     = 18,
    932	/* Common mode on Port_D disabled/enabled */
    933	CONTROL_FLAG_PORT_D_COMMON_MODE     = 19,
    934	/* Impedance for ramp generator on Port_A 16 Ohm/10K Ohm */
    935	CONTROL_FLAG_PORT_A_10KOHM_LOAD     = 20,
    936	/* Impedance for ramp generator on Port_D, 16 Ohm/10K Ohm */
    937	CONTROL_FLAG_PORT_D_10KOHM_LOAD     = 21,
    938	/* ASI rate is 48kHz/96kHz */
    939	CONTROL_FLAG_ASI_96KHZ              = 22,
    940	/* DAC power settings able to control attached ports no/yes */
    941	CONTROL_FLAG_DACS_CONTROL_PORTS     = 23,
    942	/* Clock Stop OK reporting is disabled/enabled */
    943	CONTROL_FLAG_CONTROL_STOP_OK_ENABLE = 24,
    944	/* Number of control flags */
    945	CONTROL_FLAGS_MAX = (CONTROL_FLAG_CONTROL_STOP_OK_ENABLE+1)
    946};
    947
    948/*
    949 * Control parameter IDs
    950 */
    951enum control_param_id {
    952	/* 0: None, 1: Mic1In*/
    953	CONTROL_PARAM_VIP_SOURCE               = 1,
    954	/* 0: force HDA, 1: allow DSP if HDA Spdif1Out stream is idle */
    955	CONTROL_PARAM_SPDIF1_SOURCE            = 2,
    956	/* Port A output stage gain setting to use when 16 Ohm output
    957	 * impedance is selected*/
    958	CONTROL_PARAM_PORTA_160OHM_GAIN        = 8,
    959	/* Port D output stage gain setting to use when 16 Ohm output
    960	 * impedance is selected*/
    961	CONTROL_PARAM_PORTD_160OHM_GAIN        = 10,
    962
    963	/*
    964	 * This control param name was found in the 8051 memory, and makes
    965	 * sense given the fact the AE-5 uses it and has the ASI flag set.
    966	 */
    967	CONTROL_PARAM_ASI                      = 23,
    968
    969	/* Stream Control */
    970
    971	/* Select stream with the given ID */
    972	CONTROL_PARAM_STREAM_ID                = 24,
    973	/* Source connection point for the selected stream */
    974	CONTROL_PARAM_STREAM_SOURCE_CONN_POINT = 25,
    975	/* Destination connection point for the selected stream */
    976	CONTROL_PARAM_STREAM_DEST_CONN_POINT   = 26,
    977	/* Number of audio channels in the selected stream */
    978	CONTROL_PARAM_STREAMS_CHANNELS         = 27,
    979	/*Enable control for the selected stream */
    980	CONTROL_PARAM_STREAM_CONTROL           = 28,
    981
    982	/* Connection Point Control */
    983
    984	/* Select connection point with the given ID */
    985	CONTROL_PARAM_CONN_POINT_ID            = 29,
    986	/* Connection point sample rate */
    987	CONTROL_PARAM_CONN_POINT_SAMPLE_RATE   = 30,
    988
    989	/* Node Control */
    990
    991	/* Select HDA node with the given ID */
    992	CONTROL_PARAM_NODE_ID                  = 31
    993};
    994
    995/*
    996 *  Dsp Io Status codes
    997 */
    998enum hda_vendor_status_dspio {
    999	/* Success */
   1000	VENDOR_STATUS_DSPIO_OK                       = 0x00,
   1001	/* Busy, unable to accept new command, the host must retry */
   1002	VENDOR_STATUS_DSPIO_BUSY                     = 0x01,
   1003	/* SCP command queue is full */
   1004	VENDOR_STATUS_DSPIO_SCP_COMMAND_QUEUE_FULL   = 0x02,
   1005	/* SCP response queue is empty */
   1006	VENDOR_STATUS_DSPIO_SCP_RESPONSE_QUEUE_EMPTY = 0x03
   1007};
   1008
   1009/*
   1010 *  Chip Io Status codes
   1011 */
   1012enum hda_vendor_status_chipio {
   1013	/* Success */
   1014	VENDOR_STATUS_CHIPIO_OK   = 0x00,
   1015	/* Busy, unable to accept new command, the host must retry */
   1016	VENDOR_STATUS_CHIPIO_BUSY = 0x01
   1017};
   1018
   1019/*
   1020 *  CA0132 sample rate
   1021 */
   1022enum ca0132_sample_rate {
   1023	SR_6_000        = 0x00,
   1024	SR_8_000        = 0x01,
   1025	SR_9_600        = 0x02,
   1026	SR_11_025       = 0x03,
   1027	SR_16_000       = 0x04,
   1028	SR_22_050       = 0x05,
   1029	SR_24_000       = 0x06,
   1030	SR_32_000       = 0x07,
   1031	SR_44_100       = 0x08,
   1032	SR_48_000       = 0x09,
   1033	SR_88_200       = 0x0A,
   1034	SR_96_000       = 0x0B,
   1035	SR_144_000      = 0x0C,
   1036	SR_176_400      = 0x0D,
   1037	SR_192_000      = 0x0E,
   1038	SR_384_000      = 0x0F,
   1039
   1040	SR_COUNT        = 0x10,
   1041
   1042	SR_RATE_UNKNOWN = 0x1F
   1043};
   1044
   1045enum dsp_download_state {
   1046	DSP_DOWNLOAD_FAILED = -1,
   1047	DSP_DOWNLOAD_INIT   = 0,
   1048	DSP_DOWNLOADING     = 1,
   1049	DSP_DOWNLOADED      = 2
   1050};
   1051
   1052/* retrieve parameters from hda format */
   1053#define get_hdafmt_chs(fmt)	(fmt & 0xf)
   1054#define get_hdafmt_bits(fmt)	((fmt >> 4) & 0x7)
   1055#define get_hdafmt_rate(fmt)	((fmt >> 8) & 0x7f)
   1056#define get_hdafmt_type(fmt)	((fmt >> 15) & 0x1)
   1057
   1058/*
   1059 * CA0132 specific
   1060 */
   1061
   1062struct ca0132_spec {
   1063	const struct snd_kcontrol_new *mixers[5];
   1064	unsigned int num_mixers;
   1065	const struct hda_verb *base_init_verbs;
   1066	const struct hda_verb *base_exit_verbs;
   1067	const struct hda_verb *chip_init_verbs;
   1068	const struct hda_verb *desktop_init_verbs;
   1069	struct hda_verb *spec_init_verbs;
   1070	struct auto_pin_cfg autocfg;
   1071
   1072	/* Nodes configurations */
   1073	struct hda_multi_out multiout;
   1074	hda_nid_t out_pins[AUTO_CFG_MAX_OUTS];
   1075	hda_nid_t dacs[AUTO_CFG_MAX_OUTS];
   1076	unsigned int num_outputs;
   1077	hda_nid_t input_pins[AUTO_PIN_LAST];
   1078	hda_nid_t adcs[AUTO_PIN_LAST];
   1079	hda_nid_t dig_out;
   1080	hda_nid_t dig_in;
   1081	unsigned int num_inputs;
   1082	hda_nid_t shared_mic_nid;
   1083	hda_nid_t shared_out_nid;
   1084	hda_nid_t unsol_tag_hp;
   1085	hda_nid_t unsol_tag_front_hp; /* for desktop ca0132 codecs */
   1086	hda_nid_t unsol_tag_amic1;
   1087
   1088	/* chip access */
   1089	struct mutex chipio_mutex; /* chip access mutex */
   1090	u32 curr_chip_addx;
   1091
   1092	/* DSP download related */
   1093	enum dsp_download_state dsp_state;
   1094	unsigned int dsp_stream_id;
   1095	unsigned int wait_scp;
   1096	unsigned int wait_scp_header;
   1097	unsigned int wait_num_data;
   1098	unsigned int scp_resp_header;
   1099	unsigned int scp_resp_data[4];
   1100	unsigned int scp_resp_count;
   1101	bool startup_check_entered;
   1102	bool dsp_reload;
   1103
   1104	/* mixer and effects related */
   1105	unsigned char dmic_ctl;
   1106	int cur_out_type;
   1107	int cur_mic_type;
   1108	long vnode_lvol[VNODES_COUNT];
   1109	long vnode_rvol[VNODES_COUNT];
   1110	long vnode_lswitch[VNODES_COUNT];
   1111	long vnode_rswitch[VNODES_COUNT];
   1112	long effects_switch[EFFECTS_COUNT];
   1113	long voicefx_val;
   1114	long cur_mic_boost;
   1115	/* ca0132_alt control related values */
   1116	unsigned char in_enum_val;
   1117	unsigned char out_enum_val;
   1118	unsigned char channel_cfg_val;
   1119	unsigned char speaker_range_val[2];
   1120	unsigned char mic_boost_enum_val;
   1121	unsigned char smart_volume_setting;
   1122	unsigned char bass_redirection_val;
   1123	long bass_redirect_xover_freq;
   1124	long fx_ctl_val[EFFECT_LEVEL_SLIDERS];
   1125	long xbass_xover_freq;
   1126	long eq_preset_val;
   1127	unsigned int tlv[4];
   1128	struct hda_vmaster_mute_hook vmaster_mute;
   1129	/* AE-5 Control values */
   1130	unsigned char ae5_headphone_gain_val;
   1131	unsigned char ae5_filter_val;
   1132	/* ZxR Control Values */
   1133	unsigned char zxr_gain_set;
   1134
   1135	struct hda_codec *codec;
   1136	struct delayed_work unsol_hp_work;
   1137	int quirk;
   1138
   1139#ifdef ENABLE_TUNING_CONTROLS
   1140	long cur_ctl_vals[TUNING_CTLS_COUNT];
   1141#endif
   1142	/*
   1143	 * The Recon3D, Sound Blaster Z, Sound Blaster ZxR, and Sound Blaster
   1144	 * AE-5 all use PCI region 2 to toggle GPIO and other currently unknown
   1145	 * things.
   1146	 */
   1147	bool use_pci_mmio;
   1148	void __iomem *mem_base;
   1149
   1150	/*
   1151	 * Whether or not to use the alt functions like alt_select_out,
   1152	 * alt_select_in, etc. Only used on desktop codecs for now, because of
   1153	 * surround sound support.
   1154	 */
   1155	bool use_alt_functions;
   1156
   1157	/*
   1158	 * Whether or not to use alt controls:	volume effect sliders, EQ
   1159	 * presets, smart volume presets, and new control names with FX prefix.
   1160	 * Renames PlayEnhancement and CrystalVoice too.
   1161	 */
   1162	bool use_alt_controls;
   1163};
   1164
   1165/*
   1166 * CA0132 quirks table
   1167 */
   1168enum {
   1169	QUIRK_NONE,
   1170	QUIRK_ALIENWARE,
   1171	QUIRK_ALIENWARE_M17XR4,
   1172	QUIRK_SBZ,
   1173	QUIRK_ZXR,
   1174	QUIRK_ZXR_DBPRO,
   1175	QUIRK_R3DI,
   1176	QUIRK_R3D,
   1177	QUIRK_AE5,
   1178	QUIRK_AE7,
   1179};
   1180
   1181#ifdef CONFIG_PCI
   1182#define ca0132_quirk(spec)		((spec)->quirk)
   1183#define ca0132_use_pci_mmio(spec)	((spec)->use_pci_mmio)
   1184#define ca0132_use_alt_functions(spec)	((spec)->use_alt_functions)
   1185#define ca0132_use_alt_controls(spec)	((spec)->use_alt_controls)
   1186#else
   1187#define ca0132_quirk(spec)		({ (void)(spec); QUIRK_NONE; })
   1188#define ca0132_use_alt_functions(spec)	({ (void)(spec); false; })
   1189#define ca0132_use_pci_mmio(spec)	({ (void)(spec); false; })
   1190#define ca0132_use_alt_controls(spec)	({ (void)(spec); false; })
   1191#endif
   1192
   1193static const struct hda_pintbl alienware_pincfgs[] = {
   1194	{ 0x0b, 0x90170110 }, /* Builtin Speaker */
   1195	{ 0x0c, 0x411111f0 }, /* N/A */
   1196	{ 0x0d, 0x411111f0 }, /* N/A */
   1197	{ 0x0e, 0x411111f0 }, /* N/A */
   1198	{ 0x0f, 0x0321101f }, /* HP */
   1199	{ 0x10, 0x411111f0 }, /* Headset?  disabled for now */
   1200	{ 0x11, 0x03a11021 }, /* Mic */
   1201	{ 0x12, 0xd5a30140 }, /* Builtin Mic */
   1202	{ 0x13, 0x411111f0 }, /* N/A */
   1203	{ 0x18, 0x411111f0 }, /* N/A */
   1204	{}
   1205};
   1206
   1207/* Sound Blaster Z pin configs taken from Windows Driver */
   1208static const struct hda_pintbl sbz_pincfgs[] = {
   1209	{ 0x0b, 0x01017010 }, /* Port G -- Lineout FRONT L/R */
   1210	{ 0x0c, 0x014510f0 }, /* SPDIF Out 1 */
   1211	{ 0x0d, 0x014510f0 }, /* Digital Out */
   1212	{ 0x0e, 0x01c510f0 }, /* SPDIF In */
   1213	{ 0x0f, 0x0221701f }, /* Port A -- BackPanel HP */
   1214	{ 0x10, 0x01017012 }, /* Port D -- Center/LFE or FP Hp */
   1215	{ 0x11, 0x01017014 }, /* Port B -- LineMicIn2 / Rear L/R */
   1216	{ 0x12, 0x01a170f0 }, /* Port C -- LineIn1 */
   1217	{ 0x13, 0x908700f0 }, /* What U Hear In*/
   1218	{ 0x18, 0x50d000f0 }, /* N/A */
   1219	{}
   1220};
   1221
   1222/* Sound Blaster ZxR pin configs taken from Windows Driver */
   1223static const struct hda_pintbl zxr_pincfgs[] = {
   1224	{ 0x0b, 0x01047110 }, /* Port G -- Lineout FRONT L/R */
   1225	{ 0x0c, 0x414510f0 }, /* SPDIF Out 1 - Disabled*/
   1226	{ 0x0d, 0x014510f0 }, /* Digital Out */
   1227	{ 0x0e, 0x41c520f0 }, /* SPDIF In - Disabled*/
   1228	{ 0x0f, 0x0122711f }, /* Port A -- BackPanel HP */
   1229	{ 0x10, 0x01017111 }, /* Port D -- Center/LFE */
   1230	{ 0x11, 0x01017114 }, /* Port B -- LineMicIn2 / Rear L/R */
   1231	{ 0x12, 0x01a271f0 }, /* Port C -- LineIn1 */
   1232	{ 0x13, 0x908700f0 }, /* What U Hear In*/
   1233	{ 0x18, 0x50d000f0 }, /* N/A */
   1234	{}
   1235};
   1236
   1237/* Recon3D pin configs taken from Windows Driver */
   1238static const struct hda_pintbl r3d_pincfgs[] = {
   1239	{ 0x0b, 0x01014110 }, /* Port G -- Lineout FRONT L/R */
   1240	{ 0x0c, 0x014510f0 }, /* SPDIF Out 1 */
   1241	{ 0x0d, 0x014510f0 }, /* Digital Out */
   1242	{ 0x0e, 0x01c520f0 }, /* SPDIF In */
   1243	{ 0x0f, 0x0221401f }, /* Port A -- BackPanel HP */
   1244	{ 0x10, 0x01016011 }, /* Port D -- Center/LFE or FP Hp */
   1245	{ 0x11, 0x01011014 }, /* Port B -- LineMicIn2 / Rear L/R */
   1246	{ 0x12, 0x02a090f0 }, /* Port C -- LineIn1 */
   1247	{ 0x13, 0x908700f0 }, /* What U Hear In*/
   1248	{ 0x18, 0x50d000f0 }, /* N/A */
   1249	{}
   1250};
   1251
   1252/* Sound Blaster AE-5 pin configs taken from Windows Driver */
   1253static const struct hda_pintbl ae5_pincfgs[] = {
   1254	{ 0x0b, 0x01017010 }, /* Port G -- Lineout FRONT L/R */
   1255	{ 0x0c, 0x014510f0 }, /* SPDIF Out 1 */
   1256	{ 0x0d, 0x014510f0 }, /* Digital Out */
   1257	{ 0x0e, 0x01c510f0 }, /* SPDIF In */
   1258	{ 0x0f, 0x01017114 }, /* Port A -- Rear L/R. */
   1259	{ 0x10, 0x01017012 }, /* Port D -- Center/LFE or FP Hp */
   1260	{ 0x11, 0x012170ff }, /* Port B -- LineMicIn2 / Rear Headphone */
   1261	{ 0x12, 0x01a170f0 }, /* Port C -- LineIn1 */
   1262	{ 0x13, 0x908700f0 }, /* What U Hear In*/
   1263	{ 0x18, 0x50d000f0 }, /* N/A */
   1264	{}
   1265};
   1266
   1267/* Recon3D integrated pin configs taken from Windows Driver */
   1268static const struct hda_pintbl r3di_pincfgs[] = {
   1269	{ 0x0b, 0x01014110 }, /* Port G -- Lineout FRONT L/R */
   1270	{ 0x0c, 0x014510f0 }, /* SPDIF Out 1 */
   1271	{ 0x0d, 0x014510f0 }, /* Digital Out */
   1272	{ 0x0e, 0x41c520f0 }, /* SPDIF In */
   1273	{ 0x0f, 0x0221401f }, /* Port A -- BackPanel HP */
   1274	{ 0x10, 0x01016011 }, /* Port D -- Center/LFE or FP Hp */
   1275	{ 0x11, 0x01011014 }, /* Port B -- LineMicIn2 / Rear L/R */
   1276	{ 0x12, 0x02a090f0 }, /* Port C -- LineIn1 */
   1277	{ 0x13, 0x908700f0 }, /* What U Hear In*/
   1278	{ 0x18, 0x500000f0 }, /* N/A */
   1279	{}
   1280};
   1281
   1282static const struct hda_pintbl ae7_pincfgs[] = {
   1283	{ 0x0b, 0x01017010 },
   1284	{ 0x0c, 0x014510f0 },
   1285	{ 0x0d, 0x414510f0 },
   1286	{ 0x0e, 0x01c520f0 },
   1287	{ 0x0f, 0x01017114 },
   1288	{ 0x10, 0x01017011 },
   1289	{ 0x11, 0x018170ff },
   1290	{ 0x12, 0x01a170f0 },
   1291	{ 0x13, 0x908700f0 },
   1292	{ 0x18, 0x500000f0 },
   1293	{}
   1294};
   1295
   1296static const struct snd_pci_quirk ca0132_quirks[] = {
   1297	SND_PCI_QUIRK(0x1028, 0x057b, "Alienware M17x R4", QUIRK_ALIENWARE_M17XR4),
   1298	SND_PCI_QUIRK(0x1028, 0x0685, "Alienware 15 2015", QUIRK_ALIENWARE),
   1299	SND_PCI_QUIRK(0x1028, 0x0688, "Alienware 17 2015", QUIRK_ALIENWARE),
   1300	SND_PCI_QUIRK(0x1028, 0x0708, "Alienware 15 R2 2016", QUIRK_ALIENWARE),
   1301	SND_PCI_QUIRK(0x1102, 0x0010, "Sound Blaster Z", QUIRK_SBZ),
   1302	SND_PCI_QUIRK(0x1102, 0x0023, "Sound Blaster Z", QUIRK_SBZ),
   1303	SND_PCI_QUIRK(0x1102, 0x0027, "Sound Blaster Z", QUIRK_SBZ),
   1304	SND_PCI_QUIRK(0x1102, 0x0033, "Sound Blaster ZxR", QUIRK_SBZ),
   1305	SND_PCI_QUIRK(0x1458, 0xA016, "Recon3Di", QUIRK_R3DI),
   1306	SND_PCI_QUIRK(0x1458, 0xA026, "Gigabyte G1.Sniper Z97", QUIRK_R3DI),
   1307	SND_PCI_QUIRK(0x1458, 0xA036, "Gigabyte GA-Z170X-Gaming 7", QUIRK_R3DI),
   1308	SND_PCI_QUIRK(0x3842, 0x1038, "EVGA X99 Classified", QUIRK_R3DI),
   1309	SND_PCI_QUIRK(0x1102, 0x0013, "Recon3D", QUIRK_R3D),
   1310	SND_PCI_QUIRK(0x1102, 0x0018, "Recon3D", QUIRK_R3D),
   1311	SND_PCI_QUIRK(0x1102, 0x0051, "Sound Blaster AE-5", QUIRK_AE5),
   1312	SND_PCI_QUIRK(0x1102, 0x0191, "Sound Blaster AE-5 Plus", QUIRK_AE5),
   1313	SND_PCI_QUIRK(0x1102, 0x0081, "Sound Blaster AE-7", QUIRK_AE7),
   1314	{}
   1315};
   1316
   1317/* Output selection quirk info structures. */
   1318#define MAX_QUIRK_MMIO_GPIO_SET_VALS 3
   1319#define MAX_QUIRK_SCP_SET_VALS 2
   1320struct ca0132_alt_out_set_info {
   1321	unsigned int dac2port; /* ParamID 0x0d value. */
   1322
   1323	bool has_hda_gpio;
   1324	char hda_gpio_pin;
   1325	char hda_gpio_set;
   1326
   1327	unsigned int mmio_gpio_count;
   1328	char mmio_gpio_pin[MAX_QUIRK_MMIO_GPIO_SET_VALS];
   1329	char mmio_gpio_set[MAX_QUIRK_MMIO_GPIO_SET_VALS];
   1330
   1331	unsigned int scp_cmds_count;
   1332	unsigned int scp_cmd_mid[MAX_QUIRK_SCP_SET_VALS];
   1333	unsigned int scp_cmd_req[MAX_QUIRK_SCP_SET_VALS];
   1334	unsigned int scp_cmd_val[MAX_QUIRK_SCP_SET_VALS];
   1335
   1336	bool has_chipio_write;
   1337	unsigned int chipio_write_addr;
   1338	unsigned int chipio_write_data;
   1339};
   1340
   1341struct ca0132_alt_out_set_quirk_data {
   1342	int quirk_id;
   1343
   1344	bool has_headphone_gain;
   1345	bool is_ae_series;
   1346
   1347	struct ca0132_alt_out_set_info out_set_info[NUM_OF_OUTPUTS];
   1348};
   1349
   1350static const struct ca0132_alt_out_set_quirk_data quirk_out_set_data[] = {
   1351	{ .quirk_id = QUIRK_R3DI,
   1352	  .has_headphone_gain = false,
   1353	  .is_ae_series       = false,
   1354	  .out_set_info = {
   1355		/* Speakers. */
   1356		{ .dac2port         = 0x24,
   1357		  .has_hda_gpio     = true,
   1358		  .hda_gpio_pin     = 2,
   1359		  .hda_gpio_set     = 1,
   1360		  .mmio_gpio_count  = 0,
   1361		  .scp_cmds_count   = 0,
   1362		  .has_chipio_write = false,
   1363		},
   1364		/* Headphones. */
   1365		{ .dac2port         = 0x21,
   1366		  .has_hda_gpio     = true,
   1367		  .hda_gpio_pin     = 2,
   1368		  .hda_gpio_set     = 0,
   1369		  .mmio_gpio_count  = 0,
   1370		  .scp_cmds_count   = 0,
   1371		  .has_chipio_write = false,
   1372		} },
   1373	},
   1374	{ .quirk_id = QUIRK_R3D,
   1375	  .has_headphone_gain = false,
   1376	  .is_ae_series       = false,
   1377	  .out_set_info = {
   1378		/* Speakers. */
   1379		{ .dac2port         = 0x24,
   1380		  .has_hda_gpio     = false,
   1381		  .mmio_gpio_count  = 1,
   1382		  .mmio_gpio_pin    = { 1 },
   1383		  .mmio_gpio_set    = { 1 },
   1384		  .scp_cmds_count   = 0,
   1385		  .has_chipio_write = false,
   1386		},
   1387		/* Headphones. */
   1388		{ .dac2port         = 0x21,
   1389		  .has_hda_gpio     = false,
   1390		  .mmio_gpio_count  = 1,
   1391		  .mmio_gpio_pin    = { 1 },
   1392		  .mmio_gpio_set    = { 0 },
   1393		  .scp_cmds_count   = 0,
   1394		  .has_chipio_write = false,
   1395		} },
   1396	},
   1397	{ .quirk_id = QUIRK_SBZ,
   1398	  .has_headphone_gain = false,
   1399	  .is_ae_series       = false,
   1400	  .out_set_info = {
   1401		/* Speakers. */
   1402		{ .dac2port         = 0x18,
   1403		  .has_hda_gpio     = false,
   1404		  .mmio_gpio_count  = 3,
   1405		  .mmio_gpio_pin    = { 7, 4, 1 },
   1406		  .mmio_gpio_set    = { 0, 1, 1 },
   1407		  .scp_cmds_count   = 0,
   1408		  .has_chipio_write = false, },
   1409		/* Headphones. */
   1410		{ .dac2port         = 0x12,
   1411		  .has_hda_gpio     = false,
   1412		  .mmio_gpio_count  = 3,
   1413		  .mmio_gpio_pin    = { 7, 4, 1 },
   1414		  .mmio_gpio_set    = { 1, 1, 0 },
   1415		  .scp_cmds_count   = 0,
   1416		  .has_chipio_write = false,
   1417		} },
   1418	},
   1419	{ .quirk_id = QUIRK_ZXR,
   1420	  .has_headphone_gain = true,
   1421	  .is_ae_series       = false,
   1422	  .out_set_info = {
   1423		/* Speakers. */
   1424		{ .dac2port         = 0x24,
   1425		  .has_hda_gpio     = false,
   1426		  .mmio_gpio_count  = 3,
   1427		  .mmio_gpio_pin    = { 2, 3, 5 },
   1428		  .mmio_gpio_set    = { 1, 1, 0 },
   1429		  .scp_cmds_count   = 0,
   1430		  .has_chipio_write = false,
   1431		},
   1432		/* Headphones. */
   1433		{ .dac2port         = 0x21,
   1434		  .has_hda_gpio     = false,
   1435		  .mmio_gpio_count  = 3,
   1436		  .mmio_gpio_pin    = { 2, 3, 5 },
   1437		  .mmio_gpio_set    = { 0, 1, 1 },
   1438		  .scp_cmds_count   = 0,
   1439		  .has_chipio_write = false,
   1440		} },
   1441	},
   1442	{ .quirk_id = QUIRK_AE5,
   1443	  .has_headphone_gain = true,
   1444	  .is_ae_series       = true,
   1445	  .out_set_info = {
   1446		/* Speakers. */
   1447		{ .dac2port          = 0xa4,
   1448		  .has_hda_gpio      = false,
   1449		  .mmio_gpio_count   = 0,
   1450		  .scp_cmds_count    = 2,
   1451		  .scp_cmd_mid       = { 0x96, 0x96 },
   1452		  .scp_cmd_req       = { SPEAKER_TUNING_FRONT_LEFT_INVERT,
   1453					 SPEAKER_TUNING_FRONT_RIGHT_INVERT },
   1454		  .scp_cmd_val       = { FLOAT_ZERO, FLOAT_ZERO },
   1455		  .has_chipio_write  = true,
   1456		  .chipio_write_addr = 0x0018b03c,
   1457		  .chipio_write_data = 0x00000012
   1458		},
   1459		/* Headphones. */
   1460		{ .dac2port          = 0xa1,
   1461		  .has_hda_gpio      = false,
   1462		  .mmio_gpio_count   = 0,
   1463		  .scp_cmds_count    = 2,
   1464		  .scp_cmd_mid       = { 0x96, 0x96 },
   1465		  .scp_cmd_req       = { SPEAKER_TUNING_FRONT_LEFT_INVERT,
   1466					 SPEAKER_TUNING_FRONT_RIGHT_INVERT },
   1467		  .scp_cmd_val       = { FLOAT_ONE, FLOAT_ONE },
   1468		  .has_chipio_write  = true,
   1469		  .chipio_write_addr = 0x0018b03c,
   1470		  .chipio_write_data = 0x00000012
   1471		} },
   1472	},
   1473	{ .quirk_id = QUIRK_AE7,
   1474	  .has_headphone_gain = true,
   1475	  .is_ae_series       = true,
   1476	  .out_set_info = {
   1477		/* Speakers. */
   1478		{ .dac2port          = 0x58,
   1479		  .has_hda_gpio      = false,
   1480		  .mmio_gpio_count   = 1,
   1481		  .mmio_gpio_pin     = { 0 },
   1482		  .mmio_gpio_set     = { 1 },
   1483		  .scp_cmds_count    = 2,
   1484		  .scp_cmd_mid       = { 0x96, 0x96 },
   1485		  .scp_cmd_req       = { SPEAKER_TUNING_FRONT_LEFT_INVERT,
   1486					 SPEAKER_TUNING_FRONT_RIGHT_INVERT },
   1487		  .scp_cmd_val       = { FLOAT_ZERO, FLOAT_ZERO },
   1488		  .has_chipio_write  = true,
   1489		  .chipio_write_addr = 0x0018b03c,
   1490		  .chipio_write_data = 0x00000000
   1491		},
   1492		/* Headphones. */
   1493		{ .dac2port          = 0x58,
   1494		  .has_hda_gpio      = false,
   1495		  .mmio_gpio_count   = 1,
   1496		  .mmio_gpio_pin     = { 0 },
   1497		  .mmio_gpio_set     = { 1 },
   1498		  .scp_cmds_count    = 2,
   1499		  .scp_cmd_mid       = { 0x96, 0x96 },
   1500		  .scp_cmd_req       = { SPEAKER_TUNING_FRONT_LEFT_INVERT,
   1501					 SPEAKER_TUNING_FRONT_RIGHT_INVERT },
   1502		  .scp_cmd_val       = { FLOAT_ONE, FLOAT_ONE },
   1503		  .has_chipio_write  = true,
   1504		  .chipio_write_addr = 0x0018b03c,
   1505		  .chipio_write_data = 0x00000010
   1506		} },
   1507	}
   1508};
   1509
   1510/*
   1511 * CA0132 codec access
   1512 */
   1513static unsigned int codec_send_command(struct hda_codec *codec, hda_nid_t nid,
   1514		unsigned int verb, unsigned int parm, unsigned int *res)
   1515{
   1516	unsigned int response;
   1517	response = snd_hda_codec_read(codec, nid, 0, verb, parm);
   1518	*res = response;
   1519
   1520	return ((response == -1) ? -1 : 0);
   1521}
   1522
   1523static int codec_set_converter_format(struct hda_codec *codec, hda_nid_t nid,
   1524		unsigned short converter_format, unsigned int *res)
   1525{
   1526	return codec_send_command(codec, nid, VENDOR_CHIPIO_STREAM_FORMAT,
   1527				converter_format & 0xffff, res);
   1528}
   1529
   1530static int codec_set_converter_stream_channel(struct hda_codec *codec,
   1531				hda_nid_t nid, unsigned char stream,
   1532				unsigned char channel, unsigned int *res)
   1533{
   1534	unsigned char converter_stream_channel = 0;
   1535
   1536	converter_stream_channel = (stream << 4) | (channel & 0x0f);
   1537	return codec_send_command(codec, nid, AC_VERB_SET_CHANNEL_STREAMID,
   1538				converter_stream_channel, res);
   1539}
   1540
   1541/* Chip access helper function */
   1542static int chipio_send(struct hda_codec *codec,
   1543		       unsigned int reg,
   1544		       unsigned int data)
   1545{
   1546	unsigned int res;
   1547	unsigned long timeout = jiffies + msecs_to_jiffies(1000);
   1548
   1549	/* send bits of data specified by reg */
   1550	do {
   1551		res = snd_hda_codec_read(codec, WIDGET_CHIP_CTRL, 0,
   1552					 reg, data);
   1553		if (res == VENDOR_STATUS_CHIPIO_OK)
   1554			return 0;
   1555		msleep(20);
   1556	} while (time_before(jiffies, timeout));
   1557
   1558	return -EIO;
   1559}
   1560
   1561/*
   1562 * Write chip address through the vendor widget -- NOT protected by the Mutex!
   1563 */
   1564static int chipio_write_address(struct hda_codec *codec,
   1565				unsigned int chip_addx)
   1566{
   1567	struct ca0132_spec *spec = codec->spec;
   1568	int res;
   1569
   1570	if (spec->curr_chip_addx == chip_addx)
   1571			return 0;
   1572
   1573	/* send low 16 bits of the address */
   1574	res = chipio_send(codec, VENDOR_CHIPIO_ADDRESS_LOW,
   1575			  chip_addx & 0xffff);
   1576
   1577	if (res != -EIO) {
   1578		/* send high 16 bits of the address */
   1579		res = chipio_send(codec, VENDOR_CHIPIO_ADDRESS_HIGH,
   1580				  chip_addx >> 16);
   1581	}
   1582
   1583	spec->curr_chip_addx = (res < 0) ? ~0U : chip_addx;
   1584
   1585	return res;
   1586}
   1587
   1588/*
   1589 * Write data through the vendor widget -- NOT protected by the Mutex!
   1590 */
   1591static int chipio_write_data(struct hda_codec *codec, unsigned int data)
   1592{
   1593	struct ca0132_spec *spec = codec->spec;
   1594	int res;
   1595
   1596	/* send low 16 bits of the data */
   1597	res = chipio_send(codec, VENDOR_CHIPIO_DATA_LOW, data & 0xffff);
   1598
   1599	if (res != -EIO) {
   1600		/* send high 16 bits of the data */
   1601		res = chipio_send(codec, VENDOR_CHIPIO_DATA_HIGH,
   1602				  data >> 16);
   1603	}
   1604
   1605	/*If no error encountered, automatically increment the address
   1606	as per chip behaviour*/
   1607	spec->curr_chip_addx = (res != -EIO) ?
   1608					(spec->curr_chip_addx + 4) : ~0U;
   1609	return res;
   1610}
   1611
   1612/*
   1613 * Write multiple data through the vendor widget -- NOT protected by the Mutex!
   1614 */
   1615static int chipio_write_data_multiple(struct hda_codec *codec,
   1616				      const u32 *data,
   1617				      unsigned int count)
   1618{
   1619	int status = 0;
   1620
   1621	if (data == NULL) {
   1622		codec_dbg(codec, "chipio_write_data null ptr\n");
   1623		return -EINVAL;
   1624	}
   1625
   1626	while ((count-- != 0) && (status == 0))
   1627		status = chipio_write_data(codec, *data++);
   1628
   1629	return status;
   1630}
   1631
   1632
   1633/*
   1634 * Read data through the vendor widget -- NOT protected by the Mutex!
   1635 */
   1636static int chipio_read_data(struct hda_codec *codec, unsigned int *data)
   1637{
   1638	struct ca0132_spec *spec = codec->spec;
   1639	int res;
   1640
   1641	/* post read */
   1642	res = chipio_send(codec, VENDOR_CHIPIO_HIC_POST_READ, 0);
   1643
   1644	if (res != -EIO) {
   1645		/* read status */
   1646		res = chipio_send(codec, VENDOR_CHIPIO_STATUS, 0);
   1647	}
   1648
   1649	if (res != -EIO) {
   1650		/* read data */
   1651		*data = snd_hda_codec_read(codec, WIDGET_CHIP_CTRL, 0,
   1652					   VENDOR_CHIPIO_HIC_READ_DATA,
   1653					   0);
   1654	}
   1655
   1656	/*If no error encountered, automatically increment the address
   1657	as per chip behaviour*/
   1658	spec->curr_chip_addx = (res != -EIO) ?
   1659					(spec->curr_chip_addx + 4) : ~0U;
   1660	return res;
   1661}
   1662
   1663/*
   1664 * Write given value to the given address through the chip I/O widget.
   1665 * protected by the Mutex
   1666 */
   1667static int chipio_write(struct hda_codec *codec,
   1668		unsigned int chip_addx, const unsigned int data)
   1669{
   1670	struct ca0132_spec *spec = codec->spec;
   1671	int err;
   1672
   1673	mutex_lock(&spec->chipio_mutex);
   1674
   1675	/* write the address, and if successful proceed to write data */
   1676	err = chipio_write_address(codec, chip_addx);
   1677	if (err < 0)
   1678		goto exit;
   1679
   1680	err = chipio_write_data(codec, data);
   1681	if (err < 0)
   1682		goto exit;
   1683
   1684exit:
   1685	mutex_unlock(&spec->chipio_mutex);
   1686	return err;
   1687}
   1688
   1689/*
   1690 * Write given value to the given address through the chip I/O widget.
   1691 * not protected by the Mutex
   1692 */
   1693static int chipio_write_no_mutex(struct hda_codec *codec,
   1694		unsigned int chip_addx, const unsigned int data)
   1695{
   1696	int err;
   1697
   1698
   1699	/* write the address, and if successful proceed to write data */
   1700	err = chipio_write_address(codec, chip_addx);
   1701	if (err < 0)
   1702		goto exit;
   1703
   1704	err = chipio_write_data(codec, data);
   1705	if (err < 0)
   1706		goto exit;
   1707
   1708exit:
   1709	return err;
   1710}
   1711
   1712/*
   1713 * Write multiple values to the given address through the chip I/O widget.
   1714 * protected by the Mutex
   1715 */
   1716static int chipio_write_multiple(struct hda_codec *codec,
   1717				 u32 chip_addx,
   1718				 const u32 *data,
   1719				 unsigned int count)
   1720{
   1721	struct ca0132_spec *spec = codec->spec;
   1722	int status;
   1723
   1724	mutex_lock(&spec->chipio_mutex);
   1725	status = chipio_write_address(codec, chip_addx);
   1726	if (status < 0)
   1727		goto error;
   1728
   1729	status = chipio_write_data_multiple(codec, data, count);
   1730error:
   1731	mutex_unlock(&spec->chipio_mutex);
   1732
   1733	return status;
   1734}
   1735
   1736/*
   1737 * Read the given address through the chip I/O widget
   1738 * protected by the Mutex
   1739 */
   1740static int chipio_read(struct hda_codec *codec,
   1741		unsigned int chip_addx, unsigned int *data)
   1742{
   1743	struct ca0132_spec *spec = codec->spec;
   1744	int err;
   1745
   1746	mutex_lock(&spec->chipio_mutex);
   1747
   1748	/* write the address, and if successful proceed to write data */
   1749	err = chipio_write_address(codec, chip_addx);
   1750	if (err < 0)
   1751		goto exit;
   1752
   1753	err = chipio_read_data(codec, data);
   1754	if (err < 0)
   1755		goto exit;
   1756
   1757exit:
   1758	mutex_unlock(&spec->chipio_mutex);
   1759	return err;
   1760}
   1761
   1762/*
   1763 * Set chip control flags through the chip I/O widget.
   1764 */
   1765static void chipio_set_control_flag(struct hda_codec *codec,
   1766				    enum control_flag_id flag_id,
   1767				    bool flag_state)
   1768{
   1769	unsigned int val;
   1770	unsigned int flag_bit;
   1771
   1772	flag_bit = (flag_state ? 1 : 0);
   1773	val = (flag_bit << 7) | (flag_id);
   1774	snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
   1775			    VENDOR_CHIPIO_FLAG_SET, val);
   1776}
   1777
   1778/*
   1779 * Set chip parameters through the chip I/O widget.
   1780 */
   1781static void chipio_set_control_param(struct hda_codec *codec,
   1782		enum control_param_id param_id, int param_val)
   1783{
   1784	struct ca0132_spec *spec = codec->spec;
   1785	int val;
   1786
   1787	if ((param_id < 32) && (param_val < 8)) {
   1788		val = (param_val << 5) | (param_id);
   1789		snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
   1790				    VENDOR_CHIPIO_PARAM_SET, val);
   1791	} else {
   1792		mutex_lock(&spec->chipio_mutex);
   1793		if (chipio_send(codec, VENDOR_CHIPIO_STATUS, 0) == 0) {
   1794			snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
   1795					    VENDOR_CHIPIO_PARAM_EX_ID_SET,
   1796					    param_id);
   1797			snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
   1798					    VENDOR_CHIPIO_PARAM_EX_VALUE_SET,
   1799					    param_val);
   1800		}
   1801		mutex_unlock(&spec->chipio_mutex);
   1802	}
   1803}
   1804
   1805/*
   1806 * Set chip parameters through the chip I/O widget. NO MUTEX.
   1807 */
   1808static void chipio_set_control_param_no_mutex(struct hda_codec *codec,
   1809		enum control_param_id param_id, int param_val)
   1810{
   1811	int val;
   1812
   1813	if ((param_id < 32) && (param_val < 8)) {
   1814		val = (param_val << 5) | (param_id);
   1815		snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
   1816				    VENDOR_CHIPIO_PARAM_SET, val);
   1817	} else {
   1818		if (chipio_send(codec, VENDOR_CHIPIO_STATUS, 0) == 0) {
   1819			snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
   1820					    VENDOR_CHIPIO_PARAM_EX_ID_SET,
   1821					    param_id);
   1822			snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
   1823					    VENDOR_CHIPIO_PARAM_EX_VALUE_SET,
   1824					    param_val);
   1825		}
   1826	}
   1827}
   1828/*
   1829 * Connect stream to a source point, and then connect
   1830 * that source point to a destination point.
   1831 */
   1832static void chipio_set_stream_source_dest(struct hda_codec *codec,
   1833				int streamid, int source_point, int dest_point)
   1834{
   1835	chipio_set_control_param_no_mutex(codec,
   1836			CONTROL_PARAM_STREAM_ID, streamid);
   1837	chipio_set_control_param_no_mutex(codec,
   1838			CONTROL_PARAM_STREAM_SOURCE_CONN_POINT, source_point);
   1839	chipio_set_control_param_no_mutex(codec,
   1840			CONTROL_PARAM_STREAM_DEST_CONN_POINT, dest_point);
   1841}
   1842
   1843/*
   1844 * Set number of channels in the selected stream.
   1845 */
   1846static void chipio_set_stream_channels(struct hda_codec *codec,
   1847				int streamid, unsigned int channels)
   1848{
   1849	chipio_set_control_param_no_mutex(codec,
   1850			CONTROL_PARAM_STREAM_ID, streamid);
   1851	chipio_set_control_param_no_mutex(codec,
   1852			CONTROL_PARAM_STREAMS_CHANNELS, channels);
   1853}
   1854
   1855/*
   1856 * Enable/Disable audio stream.
   1857 */
   1858static void chipio_set_stream_control(struct hda_codec *codec,
   1859				int streamid, int enable)
   1860{
   1861	chipio_set_control_param_no_mutex(codec,
   1862			CONTROL_PARAM_STREAM_ID, streamid);
   1863	chipio_set_control_param_no_mutex(codec,
   1864			CONTROL_PARAM_STREAM_CONTROL, enable);
   1865}
   1866
   1867/*
   1868 * Get ChipIO audio stream's status.
   1869 */
   1870static void chipio_get_stream_control(struct hda_codec *codec,
   1871				int streamid, unsigned int *enable)
   1872{
   1873	chipio_set_control_param_no_mutex(codec,
   1874			CONTROL_PARAM_STREAM_ID, streamid);
   1875	*enable = snd_hda_codec_read(codec, WIDGET_CHIP_CTRL, 0,
   1876			   VENDOR_CHIPIO_PARAM_GET,
   1877			   CONTROL_PARAM_STREAM_CONTROL);
   1878}
   1879
   1880/*
   1881 * Set sampling rate of the connection point. NO MUTEX.
   1882 */
   1883static void chipio_set_conn_rate_no_mutex(struct hda_codec *codec,
   1884				int connid, enum ca0132_sample_rate rate)
   1885{
   1886	chipio_set_control_param_no_mutex(codec,
   1887			CONTROL_PARAM_CONN_POINT_ID, connid);
   1888	chipio_set_control_param_no_mutex(codec,
   1889			CONTROL_PARAM_CONN_POINT_SAMPLE_RATE, rate);
   1890}
   1891
   1892/*
   1893 * Set sampling rate of the connection point.
   1894 */
   1895static void chipio_set_conn_rate(struct hda_codec *codec,
   1896				int connid, enum ca0132_sample_rate rate)
   1897{
   1898	chipio_set_control_param(codec, CONTROL_PARAM_CONN_POINT_ID, connid);
   1899	chipio_set_control_param(codec, CONTROL_PARAM_CONN_POINT_SAMPLE_RATE,
   1900				 rate);
   1901}
   1902
   1903/*
   1904 * Writes to the 8051's internal address space directly instead of indirectly,
   1905 * giving access to the special function registers located at addresses
   1906 * 0x80-0xFF.
   1907 */
   1908static void chipio_8051_write_direct(struct hda_codec *codec,
   1909		unsigned int addr, unsigned int data)
   1910{
   1911	unsigned int verb;
   1912
   1913	verb = VENDOR_CHIPIO_8051_WRITE_DIRECT | data;
   1914	snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0, verb, addr);
   1915}
   1916
   1917/*
   1918 * Writes to the 8051's exram, which has 16-bits of address space.
   1919 * Data at addresses 0x2000-0x7fff is mirrored to 0x8000-0xdfff.
   1920 * Data at 0x8000-0xdfff can also be used as program memory for the 8051 by
   1921 * setting the pmem bank selection SFR.
   1922 * 0xe000-0xffff is always mapped as program memory, with only 0xf000-0xffff
   1923 * being writable.
   1924 */
   1925static void chipio_8051_set_address(struct hda_codec *codec, unsigned int addr)
   1926{
   1927	unsigned int tmp;
   1928
   1929	/* Lower 8-bits. */
   1930	tmp = addr & 0xff;
   1931	snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
   1932			    VENDOR_CHIPIO_8051_ADDRESS_LOW, tmp);
   1933
   1934	/* Upper 8-bits. */
   1935	tmp = (addr >> 8) & 0xff;
   1936	snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
   1937			    VENDOR_CHIPIO_8051_ADDRESS_HIGH, tmp);
   1938}
   1939
   1940static void chipio_8051_set_data(struct hda_codec *codec, unsigned int data)
   1941{
   1942	/* 8-bits of data. */
   1943	snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
   1944			    VENDOR_CHIPIO_8051_DATA_WRITE, data & 0xff);
   1945}
   1946
   1947static unsigned int chipio_8051_get_data(struct hda_codec *codec)
   1948{
   1949	return snd_hda_codec_read(codec, WIDGET_CHIP_CTRL, 0,
   1950				   VENDOR_CHIPIO_8051_DATA_READ, 0);
   1951}
   1952
   1953/* PLL_PMU writes share the lower address register of the 8051 exram writes. */
   1954static void chipio_8051_set_data_pll(struct hda_codec *codec, unsigned int data)
   1955{
   1956	/* 8-bits of data. */
   1957	snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
   1958			    VENDOR_CHIPIO_PLL_PMU_WRITE, data & 0xff);
   1959}
   1960
   1961static void chipio_8051_write_exram(struct hda_codec *codec,
   1962		unsigned int addr, unsigned int data)
   1963{
   1964	struct ca0132_spec *spec = codec->spec;
   1965
   1966	mutex_lock(&spec->chipio_mutex);
   1967
   1968	chipio_8051_set_address(codec, addr);
   1969	chipio_8051_set_data(codec, data);
   1970
   1971	mutex_unlock(&spec->chipio_mutex);
   1972}
   1973
   1974static void chipio_8051_write_exram_no_mutex(struct hda_codec *codec,
   1975		unsigned int addr, unsigned int data)
   1976{
   1977	chipio_8051_set_address(codec, addr);
   1978	chipio_8051_set_data(codec, data);
   1979}
   1980
   1981/* Readback data from the 8051's exram. No mutex. */
   1982static void chipio_8051_read_exram(struct hda_codec *codec,
   1983		unsigned int addr, unsigned int *data)
   1984{
   1985	chipio_8051_set_address(codec, addr);
   1986	*data = chipio_8051_get_data(codec);
   1987}
   1988
   1989static void chipio_8051_write_pll_pmu(struct hda_codec *codec,
   1990		unsigned int addr, unsigned int data)
   1991{
   1992	struct ca0132_spec *spec = codec->spec;
   1993
   1994	mutex_lock(&spec->chipio_mutex);
   1995
   1996	chipio_8051_set_address(codec, addr & 0xff);
   1997	chipio_8051_set_data_pll(codec, data);
   1998
   1999	mutex_unlock(&spec->chipio_mutex);
   2000}
   2001
   2002static void chipio_8051_write_pll_pmu_no_mutex(struct hda_codec *codec,
   2003		unsigned int addr, unsigned int data)
   2004{
   2005	chipio_8051_set_address(codec, addr & 0xff);
   2006	chipio_8051_set_data_pll(codec, data);
   2007}
   2008
   2009/*
   2010 * Enable clocks.
   2011 */
   2012static void chipio_enable_clocks(struct hda_codec *codec)
   2013{
   2014	struct ca0132_spec *spec = codec->spec;
   2015
   2016	mutex_lock(&spec->chipio_mutex);
   2017
   2018	chipio_8051_write_pll_pmu_no_mutex(codec, 0x00, 0xff);
   2019	chipio_8051_write_pll_pmu_no_mutex(codec, 0x05, 0x0b);
   2020	chipio_8051_write_pll_pmu_no_mutex(codec, 0x06, 0xff);
   2021
   2022	mutex_unlock(&spec->chipio_mutex);
   2023}
   2024
   2025/*
   2026 * CA0132 DSP IO stuffs
   2027 */
   2028static int dspio_send(struct hda_codec *codec, unsigned int reg,
   2029		      unsigned int data)
   2030{
   2031	int res;
   2032	unsigned long timeout = jiffies + msecs_to_jiffies(1000);
   2033
   2034	/* send bits of data specified by reg to dsp */
   2035	do {
   2036		res = snd_hda_codec_read(codec, WIDGET_DSP_CTRL, 0, reg, data);
   2037		if ((res >= 0) && (res != VENDOR_STATUS_DSPIO_BUSY))
   2038			return res;
   2039		msleep(20);
   2040	} while (time_before(jiffies, timeout));
   2041
   2042	return -EIO;
   2043}
   2044
   2045/*
   2046 * Wait for DSP to be ready for commands
   2047 */
   2048static void dspio_write_wait(struct hda_codec *codec)
   2049{
   2050	int status;
   2051	unsigned long timeout = jiffies + msecs_to_jiffies(1000);
   2052
   2053	do {
   2054		status = snd_hda_codec_read(codec, WIDGET_DSP_CTRL, 0,
   2055						VENDOR_DSPIO_STATUS, 0);
   2056		if ((status == VENDOR_STATUS_DSPIO_OK) ||
   2057		    (status == VENDOR_STATUS_DSPIO_SCP_RESPONSE_QUEUE_EMPTY))
   2058			break;
   2059		msleep(1);
   2060	} while (time_before(jiffies, timeout));
   2061}
   2062
   2063/*
   2064 * Write SCP data to DSP
   2065 */
   2066static int dspio_write(struct hda_codec *codec, unsigned int scp_data)
   2067{
   2068	struct ca0132_spec *spec = codec->spec;
   2069	int status;
   2070
   2071	dspio_write_wait(codec);
   2072
   2073	mutex_lock(&spec->chipio_mutex);
   2074	status = dspio_send(codec, VENDOR_DSPIO_SCP_WRITE_DATA_LOW,
   2075			    scp_data & 0xffff);
   2076	if (status < 0)
   2077		goto error;
   2078
   2079	status = dspio_send(codec, VENDOR_DSPIO_SCP_WRITE_DATA_HIGH,
   2080				    scp_data >> 16);
   2081	if (status < 0)
   2082		goto error;
   2083
   2084	/* OK, now check if the write itself has executed*/
   2085	status = snd_hda_codec_read(codec, WIDGET_DSP_CTRL, 0,
   2086				    VENDOR_DSPIO_STATUS, 0);
   2087error:
   2088	mutex_unlock(&spec->chipio_mutex);
   2089
   2090	return (status == VENDOR_STATUS_DSPIO_SCP_COMMAND_QUEUE_FULL) ?
   2091			-EIO : 0;
   2092}
   2093
   2094/*
   2095 * Write multiple SCP data to DSP
   2096 */
   2097static int dspio_write_multiple(struct hda_codec *codec,
   2098				unsigned int *buffer, unsigned int size)
   2099{
   2100	int status = 0;
   2101	unsigned int count;
   2102
   2103	if (buffer == NULL)
   2104		return -EINVAL;
   2105
   2106	count = 0;
   2107	while (count < size) {
   2108		status = dspio_write(codec, *buffer++);
   2109		if (status != 0)
   2110			break;
   2111		count++;
   2112	}
   2113
   2114	return status;
   2115}
   2116
   2117static int dspio_read(struct hda_codec *codec, unsigned int *data)
   2118{
   2119	int status;
   2120
   2121	status = dspio_send(codec, VENDOR_DSPIO_SCP_POST_READ_DATA, 0);
   2122	if (status == -EIO)
   2123		return status;
   2124
   2125	status = dspio_send(codec, VENDOR_DSPIO_STATUS, 0);
   2126	if (status == -EIO ||
   2127	    status == VENDOR_STATUS_DSPIO_SCP_RESPONSE_QUEUE_EMPTY)
   2128		return -EIO;
   2129
   2130	*data = snd_hda_codec_read(codec, WIDGET_DSP_CTRL, 0,
   2131				   VENDOR_DSPIO_SCP_READ_DATA, 0);
   2132
   2133	return 0;
   2134}
   2135
   2136static int dspio_read_multiple(struct hda_codec *codec, unsigned int *buffer,
   2137			       unsigned int *buf_size, unsigned int size_count)
   2138{
   2139	int status = 0;
   2140	unsigned int size = *buf_size;
   2141	unsigned int count;
   2142	unsigned int skip_count;
   2143	unsigned int dummy;
   2144
   2145	if (buffer == NULL)
   2146		return -1;
   2147
   2148	count = 0;
   2149	while (count < size && count < size_count) {
   2150		status = dspio_read(codec, buffer++);
   2151		if (status != 0)
   2152			break;
   2153		count++;
   2154	}
   2155
   2156	skip_count = count;
   2157	if (status == 0) {
   2158		while (skip_count < size) {
   2159			status = dspio_read(codec, &dummy);
   2160			if (status != 0)
   2161				break;
   2162			skip_count++;
   2163		}
   2164	}
   2165	*buf_size = count;
   2166
   2167	return status;
   2168}
   2169
   2170/*
   2171 * Construct the SCP header using corresponding fields
   2172 */
   2173static inline unsigned int
   2174make_scp_header(unsigned int target_id, unsigned int source_id,
   2175		unsigned int get_flag, unsigned int req,
   2176		unsigned int device_flag, unsigned int resp_flag,
   2177		unsigned int error_flag, unsigned int data_size)
   2178{
   2179	unsigned int header = 0;
   2180
   2181	header = (data_size & 0x1f) << 27;
   2182	header |= (error_flag & 0x01) << 26;
   2183	header |= (resp_flag & 0x01) << 25;
   2184	header |= (device_flag & 0x01) << 24;
   2185	header |= (req & 0x7f) << 17;
   2186	header |= (get_flag & 0x01) << 16;
   2187	header |= (source_id & 0xff) << 8;
   2188	header |= target_id & 0xff;
   2189
   2190	return header;
   2191}
   2192
   2193/*
   2194 * Extract corresponding fields from SCP header
   2195 */
   2196static inline void
   2197extract_scp_header(unsigned int header,
   2198		   unsigned int *target_id, unsigned int *source_id,
   2199		   unsigned int *get_flag, unsigned int *req,
   2200		   unsigned int *device_flag, unsigned int *resp_flag,
   2201		   unsigned int *error_flag, unsigned int *data_size)
   2202{
   2203	if (data_size)
   2204		*data_size = (header >> 27) & 0x1f;
   2205	if (error_flag)
   2206		*error_flag = (header >> 26) & 0x01;
   2207	if (resp_flag)
   2208		*resp_flag = (header >> 25) & 0x01;
   2209	if (device_flag)
   2210		*device_flag = (header >> 24) & 0x01;
   2211	if (req)
   2212		*req = (header >> 17) & 0x7f;
   2213	if (get_flag)
   2214		*get_flag = (header >> 16) & 0x01;
   2215	if (source_id)
   2216		*source_id = (header >> 8) & 0xff;
   2217	if (target_id)
   2218		*target_id = header & 0xff;
   2219}
   2220
   2221#define SCP_MAX_DATA_WORDS  (16)
   2222
   2223/* Structure to contain any SCP message */
   2224struct scp_msg {
   2225	unsigned int hdr;
   2226	unsigned int data[SCP_MAX_DATA_WORDS];
   2227};
   2228
   2229static void dspio_clear_response_queue(struct hda_codec *codec)
   2230{
   2231	unsigned long timeout = jiffies + msecs_to_jiffies(1000);
   2232	unsigned int dummy = 0;
   2233	int status;
   2234
   2235	/* clear all from the response queue */
   2236	do {
   2237		status = dspio_read(codec, &dummy);
   2238	} while (status == 0 && time_before(jiffies, timeout));
   2239}
   2240
   2241static int dspio_get_response_data(struct hda_codec *codec)
   2242{
   2243	struct ca0132_spec *spec = codec->spec;
   2244	unsigned int data = 0;
   2245	unsigned int count;
   2246
   2247	if (dspio_read(codec, &data) < 0)
   2248		return -EIO;
   2249
   2250	if ((data & 0x00ffffff) == spec->wait_scp_header) {
   2251		spec->scp_resp_header = data;
   2252		spec->scp_resp_count = data >> 27;
   2253		count = spec->wait_num_data;
   2254		dspio_read_multiple(codec, spec->scp_resp_data,
   2255				    &spec->scp_resp_count, count);
   2256		return 0;
   2257	}
   2258
   2259	return -EIO;
   2260}
   2261
   2262/*
   2263 * Send SCP message to DSP
   2264 */
   2265static int dspio_send_scp_message(struct hda_codec *codec,
   2266				  unsigned char *send_buf,
   2267				  unsigned int send_buf_size,
   2268				  unsigned char *return_buf,
   2269				  unsigned int return_buf_size,
   2270				  unsigned int *bytes_returned)
   2271{
   2272	struct ca0132_spec *spec = codec->spec;
   2273	int status;
   2274	unsigned int scp_send_size = 0;
   2275	unsigned int total_size;
   2276	bool waiting_for_resp = false;
   2277	unsigned int header;
   2278	struct scp_msg *ret_msg;
   2279	unsigned int resp_src_id, resp_target_id;
   2280	unsigned int data_size, src_id, target_id, get_flag, device_flag;
   2281
   2282	if (bytes_returned)
   2283		*bytes_returned = 0;
   2284
   2285	/* get scp header from buffer */
   2286	header = *((unsigned int *)send_buf);
   2287	extract_scp_header(header, &target_id, &src_id, &get_flag, NULL,
   2288			   &device_flag, NULL, NULL, &data_size);
   2289	scp_send_size = data_size + 1;
   2290	total_size = (scp_send_size * 4);
   2291
   2292	if (send_buf_size < total_size)
   2293		return -EINVAL;
   2294
   2295	if (get_flag || device_flag) {
   2296		if (!return_buf || return_buf_size < 4 || !bytes_returned)
   2297			return -EINVAL;
   2298
   2299		spec->wait_scp_header = *((unsigned int *)send_buf);
   2300
   2301		/* swap source id with target id */
   2302		resp_target_id = src_id;
   2303		resp_src_id = target_id;
   2304		spec->wait_scp_header &= 0xffff0000;
   2305		spec->wait_scp_header |= (resp_src_id << 8) | (resp_target_id);
   2306		spec->wait_num_data = return_buf_size/sizeof(unsigned int) - 1;
   2307		spec->wait_scp = 1;
   2308		waiting_for_resp = true;
   2309	}
   2310
   2311	status = dspio_write_multiple(codec, (unsigned int *)send_buf,
   2312				      scp_send_size);
   2313	if (status < 0) {
   2314		spec->wait_scp = 0;
   2315		return status;
   2316	}
   2317
   2318	if (waiting_for_resp) {
   2319		unsigned long timeout = jiffies + msecs_to_jiffies(1000);
   2320		memset(return_buf, 0, return_buf_size);
   2321		do {
   2322			msleep(20);
   2323		} while (spec->wait_scp && time_before(jiffies, timeout));
   2324		waiting_for_resp = false;
   2325		if (!spec->wait_scp) {
   2326			ret_msg = (struct scp_msg *)return_buf;
   2327			memcpy(&ret_msg->hdr, &spec->scp_resp_header, 4);
   2328			memcpy(&ret_msg->data, spec->scp_resp_data,
   2329			       spec->wait_num_data);
   2330			*bytes_returned = (spec->scp_resp_count + 1) * 4;
   2331			status = 0;
   2332		} else {
   2333			status = -EIO;
   2334		}
   2335		spec->wait_scp = 0;
   2336	}
   2337
   2338	return status;
   2339}
   2340
   2341/**
   2342 * dspio_scp - Prepare and send the SCP message to DSP
   2343 * @codec: the HDA codec
   2344 * @mod_id: ID of the DSP module to send the command
   2345 * @src_id: ID of the source
   2346 * @req: ID of request to send to the DSP module
   2347 * @dir: SET or GET
   2348 * @data: pointer to the data to send with the request, request specific
   2349 * @len: length of the data, in bytes
   2350 * @reply: point to the buffer to hold data returned for a reply
   2351 * @reply_len: length of the reply buffer returned from GET
   2352 *
   2353 * Returns zero or a negative error code.
   2354 */
   2355static int dspio_scp(struct hda_codec *codec,
   2356		int mod_id, int src_id, int req, int dir, const void *data,
   2357		unsigned int len, void *reply, unsigned int *reply_len)
   2358{
   2359	int status = 0;
   2360	struct scp_msg scp_send, scp_reply;
   2361	unsigned int ret_bytes, send_size, ret_size;
   2362	unsigned int send_get_flag, reply_resp_flag, reply_error_flag;
   2363	unsigned int reply_data_size;
   2364
   2365	memset(&scp_send, 0, sizeof(scp_send));
   2366	memset(&scp_reply, 0, sizeof(scp_reply));
   2367
   2368	if ((len != 0 && data == NULL) || (len > SCP_MAX_DATA_WORDS))
   2369		return -EINVAL;
   2370
   2371	if (dir == SCP_GET && reply == NULL) {
   2372		codec_dbg(codec, "dspio_scp get but has no buffer\n");
   2373		return -EINVAL;
   2374	}
   2375
   2376	if (reply != NULL && (reply_len == NULL || (*reply_len == 0))) {
   2377		codec_dbg(codec, "dspio_scp bad resp buf len parms\n");
   2378		return -EINVAL;
   2379	}
   2380
   2381	scp_send.hdr = make_scp_header(mod_id, src_id, (dir == SCP_GET), req,
   2382				       0, 0, 0, len/sizeof(unsigned int));
   2383	if (data != NULL && len > 0) {
   2384		len = min((unsigned int)(sizeof(scp_send.data)), len);
   2385		memcpy(scp_send.data, data, len);
   2386	}
   2387
   2388	ret_bytes = 0;
   2389	send_size = sizeof(unsigned int) + len;
   2390	status = dspio_send_scp_message(codec, (unsigned char *)&scp_send,
   2391					send_size, (unsigned char *)&scp_reply,
   2392					sizeof(scp_reply), &ret_bytes);
   2393
   2394	if (status < 0) {
   2395		codec_dbg(codec, "dspio_scp: send scp msg failed\n");
   2396		return status;
   2397	}
   2398
   2399	/* extract send and reply headers members */
   2400	extract_scp_header(scp_send.hdr, NULL, NULL, &send_get_flag,
   2401			   NULL, NULL, NULL, NULL, NULL);
   2402	extract_scp_header(scp_reply.hdr, NULL, NULL, NULL, NULL, NULL,
   2403			   &reply_resp_flag, &reply_error_flag,
   2404			   &reply_data_size);
   2405
   2406	if (!send_get_flag)
   2407		return 0;
   2408
   2409	if (reply_resp_flag && !reply_error_flag) {
   2410		ret_size = (ret_bytes - sizeof(scp_reply.hdr))
   2411					/ sizeof(unsigned int);
   2412
   2413		if (*reply_len < ret_size*sizeof(unsigned int)) {
   2414			codec_dbg(codec, "reply too long for buf\n");
   2415			return -EINVAL;
   2416		} else if (ret_size != reply_data_size) {
   2417			codec_dbg(codec, "RetLen and HdrLen .NE.\n");
   2418			return -EINVAL;
   2419		} else if (!reply) {
   2420			codec_dbg(codec, "NULL reply\n");
   2421			return -EINVAL;
   2422		} else {
   2423			*reply_len = ret_size*sizeof(unsigned int);
   2424			memcpy(reply, scp_reply.data, *reply_len);
   2425		}
   2426	} else {
   2427		codec_dbg(codec, "reply ill-formed or errflag set\n");
   2428		return -EIO;
   2429	}
   2430
   2431	return status;
   2432}
   2433
   2434/*
   2435 * Set DSP parameters
   2436 */
   2437static int dspio_set_param(struct hda_codec *codec, int mod_id,
   2438			int src_id, int req, const void *data, unsigned int len)
   2439{
   2440	return dspio_scp(codec, mod_id, src_id, req, SCP_SET, data, len, NULL,
   2441			NULL);
   2442}
   2443
   2444static int dspio_set_uint_param(struct hda_codec *codec, int mod_id,
   2445			int req, const unsigned int data)
   2446{
   2447	return dspio_set_param(codec, mod_id, 0x20, req, &data,
   2448			sizeof(unsigned int));
   2449}
   2450
   2451/*
   2452 * Allocate a DSP DMA channel via an SCP message
   2453 */
   2454static int dspio_alloc_dma_chan(struct hda_codec *codec, unsigned int *dma_chan)
   2455{
   2456	int status = 0;
   2457	unsigned int size = sizeof(dma_chan);
   2458
   2459	codec_dbg(codec, "     dspio_alloc_dma_chan() -- begin\n");
   2460	status = dspio_scp(codec, MASTERCONTROL, 0x20,
   2461			MASTERCONTROL_ALLOC_DMA_CHAN, SCP_GET, NULL, 0,
   2462			dma_chan, &size);
   2463
   2464	if (status < 0) {
   2465		codec_dbg(codec, "dspio_alloc_dma_chan: SCP Failed\n");
   2466		return status;
   2467	}
   2468
   2469	if ((*dma_chan + 1) == 0) {
   2470		codec_dbg(codec, "no free dma channels to allocate\n");
   2471		return -EBUSY;
   2472	}
   2473
   2474	codec_dbg(codec, "dspio_alloc_dma_chan: chan=%d\n", *dma_chan);
   2475	codec_dbg(codec, "     dspio_alloc_dma_chan() -- complete\n");
   2476
   2477	return status;
   2478}
   2479
   2480/*
   2481 * Free a DSP DMA via an SCP message
   2482 */
   2483static int dspio_free_dma_chan(struct hda_codec *codec, unsigned int dma_chan)
   2484{
   2485	int status = 0;
   2486	unsigned int dummy = 0;
   2487
   2488	codec_dbg(codec, "     dspio_free_dma_chan() -- begin\n");
   2489	codec_dbg(codec, "dspio_free_dma_chan: chan=%d\n", dma_chan);
   2490
   2491	status = dspio_scp(codec, MASTERCONTROL, 0x20,
   2492			MASTERCONTROL_ALLOC_DMA_CHAN, SCP_SET, &dma_chan,
   2493			sizeof(dma_chan), NULL, &dummy);
   2494
   2495	if (status < 0) {
   2496		codec_dbg(codec, "dspio_free_dma_chan: SCP Failed\n");
   2497		return status;
   2498	}
   2499
   2500	codec_dbg(codec, "     dspio_free_dma_chan() -- complete\n");
   2501
   2502	return status;
   2503}
   2504
   2505/*
   2506 * (Re)start the DSP
   2507 */
   2508static int dsp_set_run_state(struct hda_codec *codec)
   2509{
   2510	unsigned int dbg_ctrl_reg;
   2511	unsigned int halt_state;
   2512	int err;
   2513
   2514	err = chipio_read(codec, DSP_DBGCNTL_INST_OFFSET, &dbg_ctrl_reg);
   2515	if (err < 0)
   2516		return err;
   2517
   2518	halt_state = (dbg_ctrl_reg & DSP_DBGCNTL_STATE_MASK) >>
   2519		      DSP_DBGCNTL_STATE_LOBIT;
   2520
   2521	if (halt_state != 0) {
   2522		dbg_ctrl_reg &= ~((halt_state << DSP_DBGCNTL_SS_LOBIT) &
   2523				  DSP_DBGCNTL_SS_MASK);
   2524		err = chipio_write(codec, DSP_DBGCNTL_INST_OFFSET,
   2525				   dbg_ctrl_reg);
   2526		if (err < 0)
   2527			return err;
   2528
   2529		dbg_ctrl_reg |= (halt_state << DSP_DBGCNTL_EXEC_LOBIT) &
   2530				DSP_DBGCNTL_EXEC_MASK;
   2531		err = chipio_write(codec, DSP_DBGCNTL_INST_OFFSET,
   2532				   dbg_ctrl_reg);
   2533		if (err < 0)
   2534			return err;
   2535	}
   2536
   2537	return 0;
   2538}
   2539
   2540/*
   2541 * Reset the DSP
   2542 */
   2543static int dsp_reset(struct hda_codec *codec)
   2544{
   2545	unsigned int res;
   2546	int retry = 20;
   2547
   2548	codec_dbg(codec, "dsp_reset\n");
   2549	do {
   2550		res = dspio_send(codec, VENDOR_DSPIO_DSP_INIT, 0);
   2551		retry--;
   2552	} while (res == -EIO && retry);
   2553
   2554	if (!retry) {
   2555		codec_dbg(codec, "dsp_reset timeout\n");
   2556		return -EIO;
   2557	}
   2558
   2559	return 0;
   2560}
   2561
   2562/*
   2563 * Convert chip address to DSP address
   2564 */
   2565static unsigned int dsp_chip_to_dsp_addx(unsigned int chip_addx,
   2566					bool *code, bool *yram)
   2567{
   2568	*code = *yram = false;
   2569
   2570	if (UC_RANGE(chip_addx, 1)) {
   2571		*code = true;
   2572		return UC_OFF(chip_addx);
   2573	} else if (X_RANGE_ALL(chip_addx, 1)) {
   2574		return X_OFF(chip_addx);
   2575	} else if (Y_RANGE_ALL(chip_addx, 1)) {
   2576		*yram = true;
   2577		return Y_OFF(chip_addx);
   2578	}
   2579
   2580	return INVALID_CHIP_ADDRESS;
   2581}
   2582
   2583/*
   2584 * Check if the DSP DMA is active
   2585 */
   2586static bool dsp_is_dma_active(struct hda_codec *codec, unsigned int dma_chan)
   2587{
   2588	unsigned int dma_chnlstart_reg;
   2589
   2590	chipio_read(codec, DSPDMAC_CHNLSTART_INST_OFFSET, &dma_chnlstart_reg);
   2591
   2592	return ((dma_chnlstart_reg & (1 <<
   2593			(DSPDMAC_CHNLSTART_EN_LOBIT + dma_chan))) != 0);
   2594}
   2595
   2596static int dsp_dma_setup_common(struct hda_codec *codec,
   2597				unsigned int chip_addx,
   2598				unsigned int dma_chan,
   2599				unsigned int port_map_mask,
   2600				bool ovly)
   2601{
   2602	int status = 0;
   2603	unsigned int chnl_prop;
   2604	unsigned int dsp_addx;
   2605	unsigned int active;
   2606	bool code, yram;
   2607
   2608	codec_dbg(codec, "-- dsp_dma_setup_common() -- Begin ---------\n");
   2609
   2610	if (dma_chan >= DSPDMAC_DMA_CFG_CHANNEL_COUNT) {
   2611		codec_dbg(codec, "dma chan num invalid\n");
   2612		return -EINVAL;
   2613	}
   2614
   2615	if (dsp_is_dma_active(codec, dma_chan)) {
   2616		codec_dbg(codec, "dma already active\n");
   2617		return -EBUSY;
   2618	}
   2619
   2620	dsp_addx = dsp_chip_to_dsp_addx(chip_addx, &code, &yram);
   2621
   2622	if (dsp_addx == INVALID_CHIP_ADDRESS) {
   2623		codec_dbg(codec, "invalid chip addr\n");
   2624		return -ENXIO;
   2625	}
   2626
   2627	chnl_prop = DSPDMAC_CHNLPROP_AC_MASK;
   2628	active = 0;
   2629
   2630	codec_dbg(codec, "   dsp_dma_setup_common()    start reg pgm\n");
   2631
   2632	if (ovly) {
   2633		status = chipio_read(codec, DSPDMAC_CHNLPROP_INST_OFFSET,
   2634				     &chnl_prop);
   2635
   2636		if (status < 0) {
   2637			codec_dbg(codec, "read CHNLPROP Reg fail\n");
   2638			return status;
   2639		}
   2640		codec_dbg(codec, "dsp_dma_setup_common() Read CHNLPROP\n");
   2641	}
   2642
   2643	if (!code)
   2644		chnl_prop &= ~(1 << (DSPDMAC_CHNLPROP_MSPCE_LOBIT + dma_chan));
   2645	else
   2646		chnl_prop |=  (1 << (DSPDMAC_CHNLPROP_MSPCE_LOBIT + dma_chan));
   2647
   2648	chnl_prop &= ~(1 << (DSPDMAC_CHNLPROP_DCON_LOBIT + dma_chan));
   2649
   2650	status = chipio_write(codec, DSPDMAC_CHNLPROP_INST_OFFSET, chnl_prop);
   2651	if (status < 0) {
   2652		codec_dbg(codec, "write CHNLPROP Reg fail\n");
   2653		return status;
   2654	}
   2655	codec_dbg(codec, "   dsp_dma_setup_common()    Write CHNLPROP\n");
   2656
   2657	if (ovly) {
   2658		status = chipio_read(codec, DSPDMAC_ACTIVE_INST_OFFSET,
   2659				     &active);
   2660
   2661		if (status < 0) {
   2662			codec_dbg(codec, "read ACTIVE Reg fail\n");
   2663			return status;
   2664		}
   2665		codec_dbg(codec, "dsp_dma_setup_common() Read ACTIVE\n");
   2666	}
   2667
   2668	active &= (~(1 << (DSPDMAC_ACTIVE_AAR_LOBIT + dma_chan))) &
   2669		DSPDMAC_ACTIVE_AAR_MASK;
   2670
   2671	status = chipio_write(codec, DSPDMAC_ACTIVE_INST_OFFSET, active);
   2672	if (status < 0) {
   2673		codec_dbg(codec, "write ACTIVE Reg fail\n");
   2674		return status;
   2675	}
   2676
   2677	codec_dbg(codec, "   dsp_dma_setup_common()    Write ACTIVE\n");
   2678
   2679	status = chipio_write(codec, DSPDMAC_AUDCHSEL_INST_OFFSET(dma_chan),
   2680			      port_map_mask);
   2681	if (status < 0) {
   2682		codec_dbg(codec, "write AUDCHSEL Reg fail\n");
   2683		return status;
   2684	}
   2685	codec_dbg(codec, "   dsp_dma_setup_common()    Write AUDCHSEL\n");
   2686
   2687	status = chipio_write(codec, DSPDMAC_IRQCNT_INST_OFFSET(dma_chan),
   2688			DSPDMAC_IRQCNT_BICNT_MASK | DSPDMAC_IRQCNT_CICNT_MASK);
   2689	if (status < 0) {
   2690		codec_dbg(codec, "write IRQCNT Reg fail\n");
   2691		return status;
   2692	}
   2693	codec_dbg(codec, "   dsp_dma_setup_common()    Write IRQCNT\n");
   2694
   2695	codec_dbg(codec,
   2696		   "ChipA=0x%x,DspA=0x%x,dmaCh=%u, "
   2697		   "CHSEL=0x%x,CHPROP=0x%x,Active=0x%x\n",
   2698		   chip_addx, dsp_addx, dma_chan,
   2699		   port_map_mask, chnl_prop, active);
   2700
   2701	codec_dbg(codec, "-- dsp_dma_setup_common() -- Complete ------\n");
   2702
   2703	return 0;
   2704}
   2705
   2706/*
   2707 * Setup the DSP DMA per-transfer-specific registers
   2708 */
   2709static int dsp_dma_setup(struct hda_codec *codec,
   2710			unsigned int chip_addx,
   2711			unsigned int count,
   2712			unsigned int dma_chan)
   2713{
   2714	int status = 0;
   2715	bool code, yram;
   2716	unsigned int dsp_addx;
   2717	unsigned int addr_field;
   2718	unsigned int incr_field;
   2719	unsigned int base_cnt;
   2720	unsigned int cur_cnt;
   2721	unsigned int dma_cfg = 0;
   2722	unsigned int adr_ofs = 0;
   2723	unsigned int xfr_cnt = 0;
   2724	const unsigned int max_dma_count = 1 << (DSPDMAC_XFRCNT_BCNT_HIBIT -
   2725						DSPDMAC_XFRCNT_BCNT_LOBIT + 1);
   2726
   2727	codec_dbg(codec, "-- dsp_dma_setup() -- Begin ---------\n");
   2728
   2729	if (count > max_dma_count) {
   2730		codec_dbg(codec, "count too big\n");
   2731		return -EINVAL;
   2732	}
   2733
   2734	dsp_addx = dsp_chip_to_dsp_addx(chip_addx, &code, &yram);
   2735	if (dsp_addx == INVALID_CHIP_ADDRESS) {
   2736		codec_dbg(codec, "invalid chip addr\n");
   2737		return -ENXIO;
   2738	}
   2739
   2740	codec_dbg(codec, "   dsp_dma_setup()    start reg pgm\n");
   2741
   2742	addr_field = dsp_addx << DSPDMAC_DMACFG_DBADR_LOBIT;
   2743	incr_field   = 0;
   2744
   2745	if (!code) {
   2746		addr_field <<= 1;
   2747		if (yram)
   2748			addr_field |= (1 << DSPDMAC_DMACFG_DBADR_LOBIT);
   2749
   2750		incr_field  = (1 << DSPDMAC_DMACFG_AINCR_LOBIT);
   2751	}
   2752
   2753	dma_cfg = addr_field + incr_field;
   2754	status = chipio_write(codec, DSPDMAC_DMACFG_INST_OFFSET(dma_chan),
   2755				dma_cfg);
   2756	if (status < 0) {
   2757		codec_dbg(codec, "write DMACFG Reg fail\n");
   2758		return status;
   2759	}
   2760	codec_dbg(codec, "   dsp_dma_setup()    Write DMACFG\n");
   2761
   2762	adr_ofs = (count - 1) << (DSPDMAC_DSPADROFS_BOFS_LOBIT +
   2763							(code ? 0 : 1));
   2764
   2765	status = chipio_write(codec, DSPDMAC_DSPADROFS_INST_OFFSET(dma_chan),
   2766				adr_ofs);
   2767	if (status < 0) {
   2768		codec_dbg(codec, "write DSPADROFS Reg fail\n");
   2769		return status;
   2770	}
   2771	codec_dbg(codec, "   dsp_dma_setup()    Write DSPADROFS\n");
   2772
   2773	base_cnt = (count - 1) << DSPDMAC_XFRCNT_BCNT_LOBIT;
   2774
   2775	cur_cnt  = (count - 1) << DSPDMAC_XFRCNT_CCNT_LOBIT;
   2776
   2777	xfr_cnt = base_cnt | cur_cnt;
   2778
   2779	status = chipio_write(codec,
   2780				DSPDMAC_XFRCNT_INST_OFFSET(dma_chan), xfr_cnt);
   2781	if (status < 0) {
   2782		codec_dbg(codec, "write XFRCNT Reg fail\n");
   2783		return status;
   2784	}
   2785	codec_dbg(codec, "   dsp_dma_setup()    Write XFRCNT\n");
   2786
   2787	codec_dbg(codec,
   2788		   "ChipA=0x%x, cnt=0x%x, DMACFG=0x%x, "
   2789		   "ADROFS=0x%x, XFRCNT=0x%x\n",
   2790		   chip_addx, count, dma_cfg, adr_ofs, xfr_cnt);
   2791
   2792	codec_dbg(codec, "-- dsp_dma_setup() -- Complete ---------\n");
   2793
   2794	return 0;
   2795}
   2796
   2797/*
   2798 * Start the DSP DMA
   2799 */
   2800static int dsp_dma_start(struct hda_codec *codec,
   2801			 unsigned int dma_chan, bool ovly)
   2802{
   2803	unsigned int reg = 0;
   2804	int status = 0;
   2805
   2806	codec_dbg(codec, "-- dsp_dma_start() -- Begin ---------\n");
   2807
   2808	if (ovly) {
   2809		status = chipio_read(codec,
   2810				     DSPDMAC_CHNLSTART_INST_OFFSET, &reg);
   2811
   2812		if (status < 0) {
   2813			codec_dbg(codec, "read CHNLSTART reg fail\n");
   2814			return status;
   2815		}
   2816		codec_dbg(codec, "-- dsp_dma_start()    Read CHNLSTART\n");
   2817
   2818		reg &= ~(DSPDMAC_CHNLSTART_EN_MASK |
   2819				DSPDMAC_CHNLSTART_DIS_MASK);
   2820	}
   2821
   2822	status = chipio_write(codec, DSPDMAC_CHNLSTART_INST_OFFSET,
   2823			reg | (1 << (dma_chan + DSPDMAC_CHNLSTART_EN_LOBIT)));
   2824	if (status < 0) {
   2825		codec_dbg(codec, "write CHNLSTART reg fail\n");
   2826		return status;
   2827	}
   2828	codec_dbg(codec, "-- dsp_dma_start() -- Complete ---------\n");
   2829
   2830	return status;
   2831}
   2832
   2833/*
   2834 * Stop the DSP DMA
   2835 */
   2836static int dsp_dma_stop(struct hda_codec *codec,
   2837			unsigned int dma_chan, bool ovly)
   2838{
   2839	unsigned int reg = 0;
   2840	int status = 0;
   2841
   2842	codec_dbg(codec, "-- dsp_dma_stop() -- Begin ---------\n");
   2843
   2844	if (ovly) {
   2845		status = chipio_read(codec,
   2846				     DSPDMAC_CHNLSTART_INST_OFFSET, &reg);
   2847
   2848		if (status < 0) {
   2849			codec_dbg(codec, "read CHNLSTART reg fail\n");
   2850			return status;
   2851		}
   2852		codec_dbg(codec, "-- dsp_dma_stop()    Read CHNLSTART\n");
   2853		reg &= ~(DSPDMAC_CHNLSTART_EN_MASK |
   2854				DSPDMAC_CHNLSTART_DIS_MASK);
   2855	}
   2856
   2857	status = chipio_write(codec, DSPDMAC_CHNLSTART_INST_OFFSET,
   2858			reg | (1 << (dma_chan + DSPDMAC_CHNLSTART_DIS_LOBIT)));
   2859	if (status < 0) {
   2860		codec_dbg(codec, "write CHNLSTART reg fail\n");
   2861		return status;
   2862	}
   2863	codec_dbg(codec, "-- dsp_dma_stop() -- Complete ---------\n");
   2864
   2865	return status;
   2866}
   2867
   2868/**
   2869 * dsp_allocate_router_ports - Allocate router ports
   2870 *
   2871 * @codec: the HDA codec
   2872 * @num_chans: number of channels in the stream
   2873 * @ports_per_channel: number of ports per channel
   2874 * @start_device: start device
   2875 * @port_map: pointer to the port list to hold the allocated ports
   2876 *
   2877 * Returns zero or a negative error code.
   2878 */
   2879static int dsp_allocate_router_ports(struct hda_codec *codec,
   2880				     unsigned int num_chans,
   2881				     unsigned int ports_per_channel,
   2882				     unsigned int start_device,
   2883				     unsigned int *port_map)
   2884{
   2885	int status = 0;
   2886	int res;
   2887	u8 val;
   2888
   2889	status = chipio_send(codec, VENDOR_CHIPIO_STATUS, 0);
   2890	if (status < 0)
   2891		return status;
   2892
   2893	val = start_device << 6;
   2894	val |= (ports_per_channel - 1) << 4;
   2895	val |= num_chans - 1;
   2896
   2897	snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
   2898			    VENDOR_CHIPIO_PORT_ALLOC_CONFIG_SET,
   2899			    val);
   2900
   2901	snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
   2902			    VENDOR_CHIPIO_PORT_ALLOC_SET,
   2903			    MEM_CONNID_DSP);
   2904
   2905	status = chipio_send(codec, VENDOR_CHIPIO_STATUS, 0);
   2906	if (status < 0)
   2907		return status;
   2908
   2909	res = snd_hda_codec_read(codec, WIDGET_CHIP_CTRL, 0,
   2910				VENDOR_CHIPIO_PORT_ALLOC_GET, 0);
   2911
   2912	*port_map = res;
   2913
   2914	return (res < 0) ? res : 0;
   2915}
   2916
   2917/*
   2918 * Free router ports
   2919 */
   2920static int dsp_free_router_ports(struct hda_codec *codec)
   2921{
   2922	int status = 0;
   2923
   2924	status = chipio_send(codec, VENDOR_CHIPIO_STATUS, 0);
   2925	if (status < 0)
   2926		return status;
   2927
   2928	snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
   2929			    VENDOR_CHIPIO_PORT_FREE_SET,
   2930			    MEM_CONNID_DSP);
   2931
   2932	status = chipio_send(codec, VENDOR_CHIPIO_STATUS, 0);
   2933
   2934	return status;
   2935}
   2936
   2937/*
   2938 * Allocate DSP ports for the download stream
   2939 */
   2940static int dsp_allocate_ports(struct hda_codec *codec,
   2941			unsigned int num_chans,
   2942			unsigned int rate_multi, unsigned int *port_map)
   2943{
   2944	int status;
   2945
   2946	codec_dbg(codec, "     dsp_allocate_ports() -- begin\n");
   2947
   2948	if ((rate_multi != 1) && (rate_multi != 2) && (rate_multi != 4)) {
   2949		codec_dbg(codec, "bad rate multiple\n");
   2950		return -EINVAL;
   2951	}
   2952
   2953	status = dsp_allocate_router_ports(codec, num_chans,
   2954					   rate_multi, 0, port_map);
   2955
   2956	codec_dbg(codec, "     dsp_allocate_ports() -- complete\n");
   2957
   2958	return status;
   2959}
   2960
   2961static int dsp_allocate_ports_format(struct hda_codec *codec,
   2962			const unsigned short fmt,
   2963			unsigned int *port_map)
   2964{
   2965	int status;
   2966	unsigned int num_chans;
   2967
   2968	unsigned int sample_rate_div = ((get_hdafmt_rate(fmt) >> 0) & 3) + 1;
   2969	unsigned int sample_rate_mul = ((get_hdafmt_rate(fmt) >> 3) & 3) + 1;
   2970	unsigned int rate_multi = sample_rate_mul / sample_rate_div;
   2971
   2972	if ((rate_multi != 1) && (rate_multi != 2) && (rate_multi != 4)) {
   2973		codec_dbg(codec, "bad rate multiple\n");
   2974		return -EINVAL;
   2975	}
   2976
   2977	num_chans = get_hdafmt_chs(fmt) + 1;
   2978
   2979	status = dsp_allocate_ports(codec, num_chans, rate_multi, port_map);
   2980
   2981	return status;
   2982}
   2983
   2984/*
   2985 * free DSP ports
   2986 */
   2987static int dsp_free_ports(struct hda_codec *codec)
   2988{
   2989	int status;
   2990
   2991	codec_dbg(codec, "     dsp_free_ports() -- begin\n");
   2992
   2993	status = dsp_free_router_ports(codec);
   2994	if (status < 0) {
   2995		codec_dbg(codec, "free router ports fail\n");
   2996		return status;
   2997	}
   2998	codec_dbg(codec, "     dsp_free_ports() -- complete\n");
   2999
   3000	return status;
   3001}
   3002
   3003/*
   3004 *  HDA DMA engine stuffs for DSP code download
   3005 */
   3006struct dma_engine {
   3007	struct hda_codec *codec;
   3008	unsigned short m_converter_format;
   3009	struct snd_dma_buffer *dmab;
   3010	unsigned int buf_size;
   3011};
   3012
   3013
   3014enum dma_state {
   3015	DMA_STATE_STOP  = 0,
   3016	DMA_STATE_RUN   = 1
   3017};
   3018
   3019static int dma_convert_to_hda_format(struct hda_codec *codec,
   3020		unsigned int sample_rate,
   3021		unsigned short channels,
   3022		unsigned short *hda_format)
   3023{
   3024	unsigned int format_val;
   3025
   3026	format_val = snd_hdac_calc_stream_format(sample_rate,
   3027				channels, SNDRV_PCM_FORMAT_S32_LE, 32, 0);
   3028
   3029	if (hda_format)
   3030		*hda_format = (unsigned short)format_val;
   3031
   3032	return 0;
   3033}
   3034
   3035/*
   3036 *  Reset DMA for DSP download
   3037 */
   3038static int dma_reset(struct dma_engine *dma)
   3039{
   3040	struct hda_codec *codec = dma->codec;
   3041	struct ca0132_spec *spec = codec->spec;
   3042	int status;
   3043
   3044	if (dma->dmab->area)
   3045		snd_hda_codec_load_dsp_cleanup(codec, dma->dmab);
   3046
   3047	status = snd_hda_codec_load_dsp_prepare(codec,
   3048			dma->m_converter_format,
   3049			dma->buf_size,
   3050			dma->dmab);
   3051	if (status < 0)
   3052		return status;
   3053	spec->dsp_stream_id = status;
   3054	return 0;
   3055}
   3056
   3057static int dma_set_state(struct dma_engine *dma, enum dma_state state)
   3058{
   3059	bool cmd;
   3060
   3061	switch (state) {
   3062	case DMA_STATE_STOP:
   3063		cmd = false;
   3064		break;
   3065	case DMA_STATE_RUN:
   3066		cmd = true;
   3067		break;
   3068	default:
   3069		return 0;
   3070	}
   3071
   3072	snd_hda_codec_load_dsp_trigger(dma->codec, cmd);
   3073	return 0;
   3074}
   3075
   3076static unsigned int dma_get_buffer_size(struct dma_engine *dma)
   3077{
   3078	return dma->dmab->bytes;
   3079}
   3080
   3081static unsigned char *dma_get_buffer_addr(struct dma_engine *dma)
   3082{
   3083	return dma->dmab->area;
   3084}
   3085
   3086static int dma_xfer(struct dma_engine *dma,
   3087		const unsigned int *data,
   3088		unsigned int count)
   3089{
   3090	memcpy(dma->dmab->area, data, count);
   3091	return 0;
   3092}
   3093
   3094static void dma_get_converter_format(
   3095		struct dma_engine *dma,
   3096		unsigned short *format)
   3097{
   3098	if (format)
   3099		*format = dma->m_converter_format;
   3100}
   3101
   3102static unsigned int dma_get_stream_id(struct dma_engine *dma)
   3103{
   3104	struct ca0132_spec *spec = dma->codec->spec;
   3105
   3106	return spec->dsp_stream_id;
   3107}
   3108
   3109struct dsp_image_seg {
   3110	u32 magic;
   3111	u32 chip_addr;
   3112	u32 count;
   3113	u32 data[];
   3114};
   3115
   3116static const u32 g_magic_value = 0x4c46584d;
   3117static const u32 g_chip_addr_magic_value = 0xFFFFFF01;
   3118
   3119static bool is_valid(const struct dsp_image_seg *p)
   3120{
   3121	return p->magic == g_magic_value;
   3122}
   3123
   3124static bool is_hci_prog_list_seg(const struct dsp_image_seg *p)
   3125{
   3126	return g_chip_addr_magic_value == p->chip_addr;
   3127}
   3128
   3129static bool is_last(const struct dsp_image_seg *p)
   3130{
   3131	return p->count == 0;
   3132}
   3133
   3134static size_t dsp_sizeof(const struct dsp_image_seg *p)
   3135{
   3136	return struct_size(p, data, p->count);
   3137}
   3138
   3139static const struct dsp_image_seg *get_next_seg_ptr(
   3140				const struct dsp_image_seg *p)
   3141{
   3142	return (struct dsp_image_seg *)((unsigned char *)(p) + dsp_sizeof(p));
   3143}
   3144
   3145/*
   3146 * CA0132 chip DSP transfer stuffs.  For DSP download.
   3147 */
   3148#define INVALID_DMA_CHANNEL (~0U)
   3149
   3150/*
   3151 * Program a list of address/data pairs via the ChipIO widget.
   3152 * The segment data is in the format of successive pairs of words.
   3153 * These are repeated as indicated by the segment's count field.
   3154 */
   3155static int dspxfr_hci_write(struct hda_codec *codec,
   3156			const struct dsp_image_seg *fls)
   3157{
   3158	int status;
   3159	const u32 *data;
   3160	unsigned int count;
   3161
   3162	if (fls == NULL || fls->chip_addr != g_chip_addr_magic_value) {
   3163		codec_dbg(codec, "hci_write invalid params\n");
   3164		return -EINVAL;
   3165	}
   3166
   3167	count = fls->count;
   3168	data = (u32 *)(fls->data);
   3169	while (count >= 2) {
   3170		status = chipio_write(codec, data[0], data[1]);
   3171		if (status < 0) {
   3172			codec_dbg(codec, "hci_write chipio failed\n");
   3173			return status;
   3174		}
   3175		count -= 2;
   3176		data  += 2;
   3177	}
   3178	return 0;
   3179}
   3180
   3181/**
   3182 * dspxfr_one_seg - Write a block of data into DSP code or data RAM using pre-allocated DMA engine.
   3183 *
   3184 * @codec: the HDA codec
   3185 * @fls: pointer to a fast load image
   3186 * @reloc: Relocation address for loading single-segment overlays, or 0 for
   3187 *	   no relocation
   3188 * @dma_engine: pointer to DMA engine to be used for DSP download
   3189 * @dma_chan: The number of DMA channels used for DSP download
   3190 * @port_map_mask: port mapping
   3191 * @ovly: TRUE if overlay format is required
   3192 *
   3193 * Returns zero or a negative error code.
   3194 */
   3195static int dspxfr_one_seg(struct hda_codec *codec,
   3196			const struct dsp_image_seg *fls,
   3197			unsigned int reloc,
   3198			struct dma_engine *dma_engine,
   3199			unsigned int dma_chan,
   3200			unsigned int port_map_mask,
   3201			bool ovly)
   3202{
   3203	int status = 0;
   3204	bool comm_dma_setup_done = false;
   3205	const unsigned int *data;
   3206	unsigned int chip_addx;
   3207	unsigned int words_to_write;
   3208	unsigned int buffer_size_words;
   3209	unsigned char *buffer_addx;
   3210	unsigned short hda_format;
   3211	unsigned int sample_rate_div;
   3212	unsigned int sample_rate_mul;
   3213	unsigned int num_chans;
   3214	unsigned int hda_frame_size_words;
   3215	unsigned int remainder_words;
   3216	const u32 *data_remainder;
   3217	u32 chip_addx_remainder;
   3218	unsigned int run_size_words;
   3219	const struct dsp_image_seg *hci_write = NULL;
   3220	unsigned long timeout;
   3221	bool dma_active;
   3222
   3223	if (fls == NULL)
   3224		return -EINVAL;
   3225	if (is_hci_prog_list_seg(fls)) {
   3226		hci_write = fls;
   3227		fls = get_next_seg_ptr(fls);
   3228	}
   3229
   3230	if (hci_write && (!fls || is_last(fls))) {
   3231		codec_dbg(codec, "hci_write\n");
   3232		return dspxfr_hci_write(codec, hci_write);
   3233	}
   3234
   3235	if (fls == NULL || dma_engine == NULL || port_map_mask == 0) {
   3236		codec_dbg(codec, "Invalid Params\n");
   3237		return -EINVAL;
   3238	}
   3239
   3240	data = fls->data;
   3241	chip_addx = fls->chip_addr;
   3242	words_to_write = fls->count;
   3243
   3244	if (!words_to_write)
   3245		return hci_write ? dspxfr_hci_write(codec, hci_write) : 0;
   3246	if (reloc)
   3247		chip_addx = (chip_addx & (0xFFFF0000 << 2)) + (reloc << 2);
   3248
   3249	if (!UC_RANGE(chip_addx, words_to_write) &&
   3250	    !X_RANGE_ALL(chip_addx, words_to_write) &&
   3251	    !Y_RANGE_ALL(chip_addx, words_to_write)) {
   3252		codec_dbg(codec, "Invalid chip_addx Params\n");
   3253		return -EINVAL;
   3254	}
   3255
   3256	buffer_size_words = (unsigned int)dma_get_buffer_size(dma_engine) /
   3257					sizeof(u32);
   3258
   3259	buffer_addx = dma_get_buffer_addr(dma_engine);
   3260
   3261	if (buffer_addx == NULL) {
   3262		codec_dbg(codec, "dma_engine buffer NULL\n");
   3263		return -EINVAL;
   3264	}
   3265
   3266	dma_get_converter_format(dma_engine, &hda_format);
   3267	sample_rate_div = ((get_hdafmt_rate(hda_format) >> 0) & 3) + 1;
   3268	sample_rate_mul = ((get_hdafmt_rate(hda_format) >> 3) & 3) + 1;
   3269	num_chans = get_hdafmt_chs(hda_format) + 1;
   3270
   3271	hda_frame_size_words = ((sample_rate_div == 0) ? 0 :
   3272			(num_chans * sample_rate_mul / sample_rate_div));
   3273
   3274	if (hda_frame_size_words == 0) {
   3275		codec_dbg(codec, "frmsz zero\n");
   3276		return -EINVAL;
   3277	}
   3278
   3279	buffer_size_words = min(buffer_size_words,
   3280				(unsigned int)(UC_RANGE(chip_addx, 1) ?
   3281				65536 : 32768));
   3282	buffer_size_words -= buffer_size_words % hda_frame_size_words;
   3283	codec_dbg(codec,
   3284		   "chpadr=0x%08x frmsz=%u nchan=%u "
   3285		   "rate_mul=%u div=%u bufsz=%u\n",
   3286		   chip_addx, hda_frame_size_words, num_chans,
   3287		   sample_rate_mul, sample_rate_div, buffer_size_words);
   3288
   3289	if (buffer_size_words < hda_frame_size_words) {
   3290		codec_dbg(codec, "dspxfr_one_seg:failed\n");
   3291		return -EINVAL;
   3292	}
   3293
   3294	remainder_words = words_to_write % hda_frame_size_words;
   3295	data_remainder = data;
   3296	chip_addx_remainder = chip_addx;
   3297
   3298	data += remainder_words;
   3299	chip_addx += remainder_words*sizeof(u32);
   3300	words_to_write -= remainder_words;
   3301
   3302	while (words_to_write != 0) {
   3303		run_size_words = min(buffer_size_words, words_to_write);
   3304		codec_dbg(codec, "dspxfr (seg loop)cnt=%u rs=%u remainder=%u\n",
   3305			    words_to_write, run_size_words, remainder_words);
   3306		dma_xfer(dma_engine, data, run_size_words*sizeof(u32));
   3307		if (!comm_dma_setup_done) {
   3308			status = dsp_dma_stop(codec, dma_chan, ovly);
   3309			if (status < 0)
   3310				return status;
   3311			status = dsp_dma_setup_common(codec, chip_addx,
   3312						dma_chan, port_map_mask, ovly);
   3313			if (status < 0)
   3314				return status;
   3315			comm_dma_setup_done = true;
   3316		}
   3317
   3318		status = dsp_dma_setup(codec, chip_addx,
   3319						run_size_words, dma_chan);
   3320		if (status < 0)
   3321			return status;
   3322		status = dsp_dma_start(codec, dma_chan, ovly);
   3323		if (status < 0)
   3324			return status;
   3325		if (!dsp_is_dma_active(codec, dma_chan)) {
   3326			codec_dbg(codec, "dspxfr:DMA did not start\n");
   3327			return -EIO;
   3328		}
   3329		status = dma_set_state(dma_engine, DMA_STATE_RUN);
   3330		if (status < 0)
   3331			return status;
   3332		if (remainder_words != 0) {
   3333			status = chipio_write_multiple(codec,
   3334						chip_addx_remainder,
   3335						data_remainder,
   3336						remainder_words);
   3337			if (status < 0)
   3338				return status;
   3339			remainder_words = 0;
   3340		}
   3341		if (hci_write) {
   3342			status = dspxfr_hci_write(codec, hci_write);
   3343			if (status < 0)
   3344				return status;
   3345			hci_write = NULL;
   3346		}
   3347
   3348		timeout = jiffies + msecs_to_jiffies(2000);
   3349		do {
   3350			dma_active = dsp_is_dma_active(codec, dma_chan);
   3351			if (!dma_active)
   3352				break;
   3353			msleep(20);
   3354		} while (time_before(jiffies, timeout));
   3355		if (dma_active)
   3356			break;
   3357
   3358		codec_dbg(codec, "+++++ DMA complete\n");
   3359		dma_set_state(dma_engine, DMA_STATE_STOP);
   3360		status = dma_reset(dma_engine);
   3361
   3362		if (status < 0)
   3363			return status;
   3364
   3365		data += run_size_words;
   3366		chip_addx += run_size_words*sizeof(u32);
   3367		words_to_write -= run_size_words;
   3368	}
   3369
   3370	if (remainder_words != 0) {
   3371		status = chipio_write_multiple(codec, chip_addx_remainder,
   3372					data_remainder, remainder_words);
   3373	}
   3374
   3375	return status;
   3376}
   3377
   3378/**
   3379 * dspxfr_image - Write the entire DSP image of a DSP code/data overlay to DSP memories
   3380 *
   3381 * @codec: the HDA codec
   3382 * @fls_data: pointer to a fast load image
   3383 * @reloc: Relocation address for loading single-segment overlays, or 0 for
   3384 *	   no relocation
   3385 * @sample_rate: sampling rate of the stream used for DSP download
   3386 * @channels: channels of the stream used for DSP download
   3387 * @ovly: TRUE if overlay format is required
   3388 *
   3389 * Returns zero or a negative error code.
   3390 */
   3391static int dspxfr_image(struct hda_codec *codec,
   3392			const struct dsp_image_seg *fls_data,
   3393			unsigned int reloc,
   3394			unsigned int sample_rate,
   3395			unsigned short channels,
   3396			bool ovly)
   3397{
   3398	struct ca0132_spec *spec = codec->spec;
   3399	int status;
   3400	unsigned short hda_format = 0;
   3401	unsigned int response;
   3402	unsigned char stream_id = 0;
   3403	struct dma_engine *dma_engine;
   3404	unsigned int dma_chan;
   3405	unsigned int port_map_mask;
   3406
   3407	if (fls_data == NULL)
   3408		return -EINVAL;
   3409
   3410	dma_engine = kzalloc(sizeof(*dma_engine), GFP_KERNEL);
   3411	if (!dma_engine)
   3412		return -ENOMEM;
   3413
   3414	dma_engine->dmab = kzalloc(sizeof(*dma_engine->dmab), GFP_KERNEL);
   3415	if (!dma_engine->dmab) {
   3416		kfree(dma_engine);
   3417		return -ENOMEM;
   3418	}
   3419
   3420	dma_engine->codec = codec;
   3421	dma_convert_to_hda_format(codec, sample_rate, channels, &hda_format);
   3422	dma_engine->m_converter_format = hda_format;
   3423	dma_engine->buf_size = (ovly ? DSP_DMA_WRITE_BUFLEN_OVLY :
   3424			DSP_DMA_WRITE_BUFLEN_INIT) * 2;
   3425
   3426	dma_chan = ovly ? INVALID_DMA_CHANNEL : 0;
   3427
   3428	status = codec_set_converter_format(codec, WIDGET_CHIP_CTRL,
   3429					hda_format, &response);
   3430
   3431	if (status < 0) {
   3432		codec_dbg(codec, "set converter format fail\n");
   3433		goto exit;
   3434	}
   3435
   3436	status = snd_hda_codec_load_dsp_prepare(codec,
   3437				dma_engine->m_converter_format,
   3438				dma_engine->buf_size,
   3439				dma_engine->dmab);
   3440	if (status < 0)
   3441		goto exit;
   3442	spec->dsp_stream_id = status;
   3443
   3444	if (ovly) {
   3445		status = dspio_alloc_dma_chan(codec, &dma_chan);
   3446		if (status < 0) {
   3447			codec_dbg(codec, "alloc dmachan fail\n");
   3448			dma_chan = INVALID_DMA_CHANNEL;
   3449			goto exit;
   3450		}
   3451	}
   3452
   3453	port_map_mask = 0;
   3454	status = dsp_allocate_ports_format(codec, hda_format,
   3455					&port_map_mask);
   3456	if (status < 0) {
   3457		codec_dbg(codec, "alloc ports fail\n");
   3458		goto exit;
   3459	}
   3460
   3461	stream_id = dma_get_stream_id(dma_engine);
   3462	status = codec_set_converter_stream_channel(codec,
   3463			WIDGET_CHIP_CTRL, stream_id, 0, &response);
   3464	if (status < 0) {
   3465		codec_dbg(codec, "set stream chan fail\n");
   3466		goto exit;
   3467	}
   3468
   3469	while ((fls_data != NULL) && !is_last(fls_data)) {
   3470		if (!is_valid(fls_data)) {
   3471			codec_dbg(codec, "FLS check fail\n");
   3472			status = -EINVAL;
   3473			goto exit;
   3474		}
   3475		status = dspxfr_one_seg(codec, fls_data, reloc,
   3476					dma_engine, dma_chan,
   3477					port_map_mask, ovly);
   3478		if (status < 0)
   3479			break;
   3480
   3481		if (is_hci_prog_list_seg(fls_data))
   3482			fls_data = get_next_seg_ptr(fls_data);
   3483
   3484		if ((fls_data != NULL) && !is_last(fls_data))
   3485			fls_data = get_next_seg_ptr(fls_data);
   3486	}
   3487
   3488	if (port_map_mask != 0)
   3489		status = dsp_free_ports(codec);
   3490
   3491	if (status < 0)
   3492		goto exit;
   3493
   3494	status = codec_set_converter_stream_channel(codec,
   3495				WIDGET_CHIP_CTRL, 0, 0, &response);
   3496
   3497exit:
   3498	if (ovly && (dma_chan != INVALID_DMA_CHANNEL))
   3499		dspio_free_dma_chan(codec, dma_chan);
   3500
   3501	if (dma_engine->dmab->area)
   3502		snd_hda_codec_load_dsp_cleanup(codec, dma_engine->dmab);
   3503	kfree(dma_engine->dmab);
   3504	kfree(dma_engine);
   3505
   3506	return status;
   3507}
   3508
   3509/*
   3510 * CA0132 DSP download stuffs.
   3511 */
   3512static void dspload_post_setup(struct hda_codec *codec)
   3513{
   3514	struct ca0132_spec *spec = codec->spec;
   3515	codec_dbg(codec, "---- dspload_post_setup ------\n");
   3516	if (!ca0132_use_alt_functions(spec)) {
   3517		/*set DSP speaker to 2.0 configuration*/
   3518		chipio_write(codec, XRAM_XRAM_INST_OFFSET(0x18), 0x08080080);
   3519		chipio_write(codec, XRAM_XRAM_INST_OFFSET(0x19), 0x3f800000);
   3520
   3521		/*update write pointer*/
   3522		chipio_write(codec, XRAM_XRAM_INST_OFFSET(0x29), 0x00000002);
   3523	}
   3524}
   3525
   3526/**
   3527 * dspload_image - Download DSP from a DSP Image Fast Load structure.
   3528 *
   3529 * @codec: the HDA codec
   3530 * @fls: pointer to a fast load image
   3531 * @ovly: TRUE if overlay format is required
   3532 * @reloc: Relocation address for loading single-segment overlays, or 0 for
   3533 *	   no relocation
   3534 * @autostart: TRUE if DSP starts after loading; ignored if ovly is TRUE
   3535 * @router_chans: number of audio router channels to be allocated (0 means use
   3536 *		  internal defaults; max is 32)
   3537 *
   3538 * Download DSP from a DSP Image Fast Load structure. This structure is a
   3539 * linear, non-constant sized element array of structures, each of which
   3540 * contain the count of the data to be loaded, the data itself, and the
   3541 * corresponding starting chip address of the starting data location.
   3542 * Returns zero or a negative error code.
   3543 */
   3544static int dspload_image(struct hda_codec *codec,
   3545			const struct dsp_image_seg *fls,
   3546			bool ovly,
   3547			unsigned int reloc,
   3548			bool autostart,
   3549			int router_chans)
   3550{
   3551	int status = 0;
   3552	unsigned int sample_rate;
   3553	unsigned short channels;
   3554
   3555	codec_dbg(codec, "---- dspload_image begin ------\n");
   3556	if (router_chans == 0) {
   3557		if (!ovly)
   3558			router_chans = DMA_TRANSFER_FRAME_SIZE_NWORDS;
   3559		else
   3560			router_chans = DMA_OVERLAY_FRAME_SIZE_NWORDS;
   3561	}
   3562
   3563	sample_rate = 48000;
   3564	channels = (unsigned short)router_chans;
   3565
   3566	while (channels > 16) {
   3567		sample_rate *= 2;
   3568		channels /= 2;
   3569	}
   3570
   3571	do {
   3572		codec_dbg(codec, "Ready to program DMA\n");
   3573		if (!ovly)
   3574			status = dsp_reset(codec);
   3575
   3576		if (status < 0)
   3577			break;
   3578
   3579		codec_dbg(codec, "dsp_reset() complete\n");
   3580		status = dspxfr_image(codec, fls, reloc, sample_rate, channels,
   3581				      ovly);
   3582
   3583		if (status < 0)
   3584			break;
   3585
   3586		codec_dbg(codec, "dspxfr_image() complete\n");
   3587		if (autostart && !ovly) {
   3588			dspload_post_setup(codec);
   3589			status = dsp_set_run_state(codec);
   3590		}
   3591
   3592		codec_dbg(codec, "LOAD FINISHED\n");
   3593	} while (0);
   3594
   3595	return status;
   3596}
   3597
   3598#ifdef CONFIG_SND_HDA_CODEC_CA0132_DSP
   3599static bool dspload_is_loaded(struct hda_codec *codec)
   3600{
   3601	unsigned int data = 0;
   3602	int status = 0;
   3603
   3604	status = chipio_read(codec, 0x40004, &data);
   3605	if ((status < 0) || (data != 1))
   3606		return false;
   3607
   3608	return true;
   3609}
   3610#else
   3611#define dspload_is_loaded(codec)	false
   3612#endif
   3613
   3614static bool dspload_wait_loaded(struct hda_codec *codec)
   3615{
   3616	unsigned long timeout = jiffies + msecs_to_jiffies(2000);
   3617
   3618	do {
   3619		if (dspload_is_loaded(codec)) {
   3620			codec_info(codec, "ca0132 DSP downloaded and running\n");
   3621			return true;
   3622		}
   3623		msleep(20);
   3624	} while (time_before(jiffies, timeout));
   3625
   3626	codec_err(codec, "ca0132 failed to download DSP\n");
   3627	return false;
   3628}
   3629
   3630/*
   3631 * ca0113 related functions. The ca0113 acts as the HDA bus for the pci-e
   3632 * based cards, and has a second mmio region, region2, that's used for special
   3633 * commands.
   3634 */
   3635
   3636/*
   3637 * For cards with PCI-E region2 (Sound Blaster Z/ZxR, Recon3D, and AE-5)
   3638 * the mmio address 0x320 is used to set GPIO pins. The format for the data
   3639 * The first eight bits are just the number of the pin. So far, I've only seen
   3640 * this number go to 7.
   3641 * AE-5 note: The AE-5 seems to use pins 2 and 3 to somehow set the color value
   3642 * of the on-card LED. It seems to use pin 2 for data, then toggles 3 to on and
   3643 * then off to send that bit.
   3644 */
   3645static void ca0113_mmio_gpio_set(struct hda_codec *codec, unsigned int gpio_pin,
   3646		bool enable)
   3647{
   3648	struct ca0132_spec *spec = codec->spec;
   3649	unsigned short gpio_data;
   3650
   3651	gpio_data = gpio_pin & 0xF;
   3652	gpio_data |= ((enable << 8) & 0x100);
   3653
   3654	writew(gpio_data, spec->mem_base + 0x320);
   3655}
   3656
   3657/*
   3658 * Special pci region2 commands that are only used by the AE-5. They follow
   3659 * a set format, and require reads at certain points to seemingly 'clear'
   3660 * the response data. My first tests didn't do these reads, and would cause
   3661 * the card to get locked up until the memory was read. These commands
   3662 * seem to work with three distinct values that I've taken to calling group,
   3663 * target-id, and value.
   3664 */
   3665static void ca0113_mmio_command_set(struct hda_codec *codec, unsigned int group,
   3666		unsigned int target, unsigned int value)
   3667{
   3668	struct ca0132_spec *spec = codec->spec;
   3669	unsigned int write_val;
   3670
   3671	writel(0x0000007e, spec->mem_base + 0x210);
   3672	readl(spec->mem_base + 0x210);
   3673	writel(0x0000005a, spec->mem_base + 0x210);
   3674	readl(spec->mem_base + 0x210);
   3675	readl(spec->mem_base + 0x210);
   3676
   3677	writel(0x00800005, spec->mem_base + 0x20c);
   3678	writel(group, spec->mem_base + 0x804);
   3679
   3680	writel(0x00800005, spec->mem_base + 0x20c);
   3681	write_val = (target & 0xff);
   3682	write_val |= (value << 8);
   3683
   3684
   3685	writel(write_val, spec->mem_base + 0x204);
   3686	/*
   3687	 * Need delay here or else it goes too fast and works inconsistently.
   3688	 */
   3689	msleep(20);
   3690
   3691	readl(spec->mem_base + 0x860);
   3692	readl(spec->mem_base + 0x854);
   3693	readl(spec->mem_base + 0x840);
   3694
   3695	writel(0x00800004, spec->mem_base + 0x20c);
   3696	writel(0x00000000, spec->mem_base + 0x210);
   3697	readl(spec->mem_base + 0x210);
   3698	readl(spec->mem_base + 0x210);
   3699}
   3700
   3701/*
   3702 * This second type of command is used for setting the sound filter type.
   3703 */
   3704static void ca0113_mmio_command_set_type2(struct hda_codec *codec,
   3705		unsigned int group, unsigned int target, unsigned int value)
   3706{
   3707	struct ca0132_spec *spec = codec->spec;
   3708	unsigned int write_val;
   3709
   3710	writel(0x0000007e, spec->mem_base + 0x210);
   3711	readl(spec->mem_base + 0x210);
   3712	writel(0x0000005a, spec->mem_base + 0x210);
   3713	readl(spec->mem_base + 0x210);
   3714	readl(spec->mem_base + 0x210);
   3715
   3716	writel(0x00800003, spec->mem_base + 0x20c);
   3717	writel(group, spec->mem_base + 0x804);
   3718
   3719	writel(0x00800005, spec->mem_base + 0x20c);
   3720	write_val = (target & 0xff);
   3721	write_val |= (value << 8);
   3722
   3723
   3724	writel(write_val, spec->mem_base + 0x204);
   3725	msleep(20);
   3726	readl(spec->mem_base + 0x860);
   3727	readl(spec->mem_base + 0x854);
   3728	readl(spec->mem_base + 0x840);
   3729
   3730	writel(0x00800004, spec->mem_base + 0x20c);
   3731	writel(0x00000000, spec->mem_base + 0x210);
   3732	readl(spec->mem_base + 0x210);
   3733	readl(spec->mem_base + 0x210);
   3734}
   3735
   3736/*
   3737 * Setup GPIO for the other variants of Core3D.
   3738 */
   3739
   3740/*
   3741 * Sets up the GPIO pins so that they are discoverable. If this isn't done,
   3742 * the card shows as having no GPIO pins.
   3743 */
   3744static void ca0132_gpio_init(struct hda_codec *codec)
   3745{
   3746	struct ca0132_spec *spec = codec->spec;
   3747
   3748	switch (ca0132_quirk(spec)) {
   3749	case QUIRK_SBZ:
   3750	case QUIRK_AE5:
   3751	case QUIRK_AE7:
   3752		snd_hda_codec_write(codec, 0x01, 0, 0x793, 0x00);
   3753		snd_hda_codec_write(codec, 0x01, 0, 0x794, 0x53);
   3754		snd_hda_codec_write(codec, 0x01, 0, 0x790, 0x23);
   3755		break;
   3756	case QUIRK_R3DI:
   3757		snd_hda_codec_write(codec, 0x01, 0, 0x793, 0x00);
   3758		snd_hda_codec_write(codec, 0x01, 0, 0x794, 0x5B);
   3759		break;
   3760	default:
   3761		break;
   3762	}
   3763
   3764}
   3765
   3766/* Sets the GPIO for audio output. */
   3767static void ca0132_gpio_setup(struct hda_codec *codec)
   3768{
   3769	struct ca0132_spec *spec = codec->spec;
   3770
   3771	switch (ca0132_quirk(spec)) {
   3772	case QUIRK_SBZ:
   3773		snd_hda_codec_write(codec, 0x01, 0,
   3774				AC_VERB_SET_GPIO_DIRECTION, 0x07);
   3775		snd_hda_codec_write(codec, 0x01, 0,
   3776				AC_VERB_SET_GPIO_MASK, 0x07);
   3777		snd_hda_codec_write(codec, 0x01, 0,
   3778				AC_VERB_SET_GPIO_DATA, 0x04);
   3779		snd_hda_codec_write(codec, 0x01, 0,
   3780				AC_VERB_SET_GPIO_DATA, 0x06);
   3781		break;
   3782	case QUIRK_R3DI:
   3783		snd_hda_codec_write(codec, 0x01, 0,
   3784				AC_VERB_SET_GPIO_DIRECTION, 0x1E);
   3785		snd_hda_codec_write(codec, 0x01, 0,
   3786				AC_VERB_SET_GPIO_MASK, 0x1F);
   3787		snd_hda_codec_write(codec, 0x01, 0,
   3788				AC_VERB_SET_GPIO_DATA, 0x0C);
   3789		break;
   3790	default:
   3791		break;
   3792	}
   3793}
   3794
   3795/*
   3796 * GPIO control functions for the Recon3D integrated.
   3797 */
   3798
   3799enum r3di_gpio_bit {
   3800	/* Bit 1 - Switch between front/rear mic. 0 = rear, 1 = front */
   3801	R3DI_MIC_SELECT_BIT = 1,
   3802	/* Bit 2 - Switch between headphone/line out. 0 = Headphone, 1 = Line */
   3803	R3DI_OUT_SELECT_BIT = 2,
   3804	/*
   3805	 * I dunno what this actually does, but it stays on until the dsp
   3806	 * is downloaded.
   3807	 */
   3808	R3DI_GPIO_DSP_DOWNLOADING = 3,
   3809	/*
   3810	 * Same as above, no clue what it does, but it comes on after the dsp
   3811	 * is downloaded.
   3812	 */
   3813	R3DI_GPIO_DSP_DOWNLOADED = 4
   3814};
   3815
   3816enum r3di_mic_select {
   3817	/* Set GPIO bit 1 to 0 for rear mic */
   3818	R3DI_REAR_MIC = 0,
   3819	/* Set GPIO bit 1 to 1 for front microphone*/
   3820	R3DI_FRONT_MIC = 1
   3821};
   3822
   3823enum r3di_out_select {
   3824	/* Set GPIO bit 2 to 0 for headphone */
   3825	R3DI_HEADPHONE_OUT = 0,
   3826	/* Set GPIO bit 2 to 1 for speaker */
   3827	R3DI_LINE_OUT = 1
   3828};
   3829enum r3di_dsp_status {
   3830	/* Set GPIO bit 3 to 1 until DSP is downloaded */
   3831	R3DI_DSP_DOWNLOADING = 0,
   3832	/* Set GPIO bit 4 to 1 once DSP is downloaded */
   3833	R3DI_DSP_DOWNLOADED = 1
   3834};
   3835
   3836
   3837static void r3di_gpio_mic_set(struct hda_codec *codec,
   3838		enum r3di_mic_select cur_mic)
   3839{
   3840	unsigned int cur_gpio;
   3841
   3842	/* Get the current GPIO Data setup */
   3843	cur_gpio = snd_hda_codec_read(codec, 0x01, 0, AC_VERB_GET_GPIO_DATA, 0);
   3844
   3845	switch (cur_mic) {
   3846	case R3DI_REAR_MIC:
   3847		cur_gpio &= ~(1 << R3DI_MIC_SELECT_BIT);
   3848		break;
   3849	case R3DI_FRONT_MIC:
   3850		cur_gpio |= (1 << R3DI_MIC_SELECT_BIT);
   3851		break;
   3852	}
   3853	snd_hda_codec_write(codec, codec->core.afg, 0,
   3854			    AC_VERB_SET_GPIO_DATA, cur_gpio);
   3855}
   3856
   3857static void r3di_gpio_dsp_status_set(struct hda_codec *codec,
   3858		enum r3di_dsp_status dsp_status)
   3859{
   3860	unsigned int cur_gpio;
   3861
   3862	/* Get the current GPIO Data setup */
   3863	cur_gpio = snd_hda_codec_read(codec, 0x01, 0, AC_VERB_GET_GPIO_DATA, 0);
   3864
   3865	switch (dsp_status) {
   3866	case R3DI_DSP_DOWNLOADING:
   3867		cur_gpio |= (1 << R3DI_GPIO_DSP_DOWNLOADING);
   3868		snd_hda_codec_write(codec, codec->core.afg, 0,
   3869				AC_VERB_SET_GPIO_DATA, cur_gpio);
   3870		break;
   3871	case R3DI_DSP_DOWNLOADED:
   3872		/* Set DOWNLOADING bit to 0. */
   3873		cur_gpio &= ~(1 << R3DI_GPIO_DSP_DOWNLOADING);
   3874
   3875		snd_hda_codec_write(codec, codec->core.afg, 0,
   3876				AC_VERB_SET_GPIO_DATA, cur_gpio);
   3877
   3878		cur_gpio |= (1 << R3DI_GPIO_DSP_DOWNLOADED);
   3879		break;
   3880	}
   3881
   3882	snd_hda_codec_write(codec, codec->core.afg, 0,
   3883			    AC_VERB_SET_GPIO_DATA, cur_gpio);
   3884}
   3885
   3886/*
   3887 * PCM callbacks
   3888 */
   3889static int ca0132_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
   3890			struct hda_codec *codec,
   3891			unsigned int stream_tag,
   3892			unsigned int format,
   3893			struct snd_pcm_substream *substream)
   3894{
   3895	struct ca0132_spec *spec = codec->spec;
   3896
   3897	snd_hda_codec_setup_stream(codec, spec->dacs[0], stream_tag, 0, format);
   3898
   3899	return 0;
   3900}
   3901
   3902static int ca0132_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
   3903			struct hda_codec *codec,
   3904			struct snd_pcm_substream *substream)
   3905{
   3906	struct ca0132_spec *spec = codec->spec;
   3907
   3908	if (spec->dsp_state == DSP_DOWNLOADING)
   3909		return 0;
   3910
   3911	/*If Playback effects are on, allow stream some time to flush
   3912	 *effects tail*/
   3913	if (spec->effects_switch[PLAY_ENHANCEMENT - EFFECT_START_NID])
   3914		msleep(50);
   3915
   3916	snd_hda_codec_cleanup_stream(codec, spec->dacs[0]);
   3917
   3918	return 0;
   3919}
   3920
   3921static unsigned int ca0132_playback_pcm_delay(struct hda_pcm_stream *info,
   3922			struct hda_codec *codec,
   3923			struct snd_pcm_substream *substream)
   3924{
   3925	struct ca0132_spec *spec = codec->spec;
   3926	unsigned int latency = DSP_PLAYBACK_INIT_LATENCY;
   3927	struct snd_pcm_runtime *runtime = substream->runtime;
   3928
   3929	if (spec->dsp_state != DSP_DOWNLOADED)
   3930		return 0;
   3931
   3932	/* Add latency if playback enhancement and either effect is enabled. */
   3933	if (spec->effects_switch[PLAY_ENHANCEMENT - EFFECT_START_NID]) {
   3934		if ((spec->effects_switch[SURROUND - EFFECT_START_NID]) ||
   3935		    (spec->effects_switch[DIALOG_PLUS - EFFECT_START_NID]))
   3936			latency += DSP_PLAY_ENHANCEMENT_LATENCY;
   3937	}
   3938
   3939	/* Applying Speaker EQ adds latency as well. */
   3940	if (spec->cur_out_type == SPEAKER_OUT)
   3941		latency += DSP_SPEAKER_OUT_LATENCY;
   3942
   3943	return (latency * runtime->rate) / 1000;
   3944}
   3945
   3946/*
   3947 * Digital out
   3948 */
   3949static int ca0132_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
   3950					struct hda_codec *codec,
   3951					struct snd_pcm_substream *substream)
   3952{
   3953	struct ca0132_spec *spec = codec->spec;
   3954	return snd_hda_multi_out_dig_open(codec, &spec->multiout);
   3955}
   3956
   3957static int ca0132_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
   3958			struct hda_codec *codec,
   3959			unsigned int stream_tag,
   3960			unsigned int format,
   3961			struct snd_pcm_substream *substream)
   3962{
   3963	struct ca0132_spec *spec = codec->spec;
   3964	return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
   3965					     stream_tag, format, substream);
   3966}
   3967
   3968static int ca0132_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
   3969			struct hda_codec *codec,
   3970			struct snd_pcm_substream *substream)
   3971{
   3972	struct ca0132_spec *spec = codec->spec;
   3973	return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
   3974}
   3975
   3976static int ca0132_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
   3977					 struct hda_codec *codec,
   3978					 struct snd_pcm_substream *substream)
   3979{
   3980	struct ca0132_spec *spec = codec->spec;
   3981	return snd_hda_multi_out_dig_close(codec, &spec->multiout);
   3982}
   3983
   3984/*
   3985 * Analog capture
   3986 */
   3987static int ca0132_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
   3988					struct hda_codec *codec,
   3989					unsigned int stream_tag,
   3990					unsigned int format,
   3991					struct snd_pcm_substream *substream)
   3992{
   3993	snd_hda_codec_setup_stream(codec, hinfo->nid,
   3994				   stream_tag, 0, format);
   3995
   3996	return 0;
   3997}
   3998
   3999static int ca0132_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
   4000			struct hda_codec *codec,
   4001			struct snd_pcm_substream *substream)
   4002{
   4003	struct ca0132_spec *spec = codec->spec;
   4004
   4005	if (spec->dsp_state == DSP_DOWNLOADING)
   4006		return 0;
   4007
   4008	snd_hda_codec_cleanup_stream(codec, hinfo->nid);
   4009	return 0;
   4010}
   4011
   4012static unsigned int ca0132_capture_pcm_delay(struct hda_pcm_stream *info,
   4013			struct hda_codec *codec,
   4014			struct snd_pcm_substream *substream)
   4015{
   4016	struct ca0132_spec *spec = codec->spec;
   4017	unsigned int latency = DSP_CAPTURE_INIT_LATENCY;
   4018	struct snd_pcm_runtime *runtime = substream->runtime;
   4019
   4020	if (spec->dsp_state != DSP_DOWNLOADED)
   4021		return 0;
   4022
   4023	if (spec->effects_switch[CRYSTAL_VOICE - EFFECT_START_NID])
   4024		latency += DSP_CRYSTAL_VOICE_LATENCY;
   4025
   4026	return (latency * runtime->rate) / 1000;
   4027}
   4028
   4029/*
   4030 * Controls stuffs.
   4031 */
   4032
   4033/*
   4034 * Mixer controls helpers.
   4035 */
   4036#define CA0132_CODEC_VOL_MONO(xname, nid, channel, dir) \
   4037	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
   4038	  .name = xname, \
   4039	  .subdevice = HDA_SUBDEV_AMP_FLAG, \
   4040	  .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \
   4041			SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
   4042			SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK, \
   4043	  .info = ca0132_volume_info, \
   4044	  .get = ca0132_volume_get, \
   4045	  .put = ca0132_volume_put, \
   4046	  .tlv = { .c = ca0132_volume_tlv }, \
   4047	  .private_value = HDA_COMPOSE_AMP_VAL(nid, channel, 0, dir) }
   4048
   4049/*
   4050 * Creates a mixer control that uses defaults of HDA_CODEC_VOL except for the
   4051 * volume put, which is used for setting the DSP volume. This was done because
   4052 * the ca0132 functions were taking too much time and causing lag.
   4053 */
   4054#define CA0132_ALT_CODEC_VOL_MONO(xname, nid, channel, dir) \
   4055	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
   4056	  .name = xname, \
   4057	  .subdevice = HDA_SUBDEV_AMP_FLAG, \
   4058	  .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \
   4059			SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
   4060			SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK, \
   4061	  .info = snd_hda_mixer_amp_volume_info, \
   4062	  .get = snd_hda_mixer_amp_volume_get, \
   4063	  .put = ca0132_alt_volume_put, \
   4064	  .tlv = { .c = snd_hda_mixer_amp_tlv }, \
   4065	  .private_value = HDA_COMPOSE_AMP_VAL(nid, channel, 0, dir) }
   4066
   4067#define CA0132_CODEC_MUTE_MONO(xname, nid, channel, dir) \
   4068	{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
   4069	  .name = xname, \
   4070	  .subdevice = HDA_SUBDEV_AMP_FLAG, \
   4071	  .info = snd_hda_mixer_amp_switch_info, \
   4072	  .get = ca0132_switch_get, \
   4073	  .put = ca0132_switch_put, \
   4074	  .private_value = HDA_COMPOSE_AMP_VAL(nid, channel, 0, dir) }
   4075
   4076/* stereo */
   4077#define CA0132_CODEC_VOL(xname, nid, dir) \
   4078	CA0132_CODEC_VOL_MONO(xname, nid, 3, dir)
   4079#define CA0132_ALT_CODEC_VOL(xname, nid, dir) \
   4080	CA0132_ALT_CODEC_VOL_MONO(xname, nid, 3, dir)
   4081#define CA0132_CODEC_MUTE(xname, nid, dir) \
   4082	CA0132_CODEC_MUTE_MONO(xname, nid, 3, dir)
   4083
   4084/* lookup tables */
   4085/*
   4086 * Lookup table with decibel values for the DSP. When volume is changed in
   4087 * Windows, the DSP is also sent the dB value in floating point. In Windows,
   4088 * these values have decimal points, probably because the Windows driver
   4089 * actually uses floating point. We can't here, so I made a lookup table of
   4090 * values -90 to 9. -90 is the lowest decibel value for both the ADC's and the
   4091 * DAC's, and 9 is the maximum.
   4092 */
   4093static const unsigned int float_vol_db_lookup[] = {
   40940xC2B40000, 0xC2B20000, 0xC2B00000, 0xC2AE0000, 0xC2AC0000, 0xC2AA0000,
   40950xC2A80000, 0xC2A60000, 0xC2A40000, 0xC2A20000, 0xC2A00000, 0xC29E0000,
   40960xC29C0000, 0xC29A0000, 0xC2980000, 0xC2960000, 0xC2940000, 0xC2920000,
   40970xC2900000, 0xC28E0000, 0xC28C0000, 0xC28A0000, 0xC2880000, 0xC2860000,
   40980xC2840000, 0xC2820000, 0xC2800000, 0xC27C0000, 0xC2780000, 0xC2740000,
   40990xC2700000, 0xC26C0000, 0xC2680000, 0xC2640000, 0xC2600000, 0xC25C0000,
   41000xC2580000, 0xC2540000, 0xC2500000, 0xC24C0000, 0xC2480000, 0xC2440000,
   41010xC2400000, 0xC23C0000, 0xC2380000, 0xC2340000, 0xC2300000, 0xC22C0000,
   41020xC2280000, 0xC2240000, 0xC2200000, 0xC21C0000, 0xC2180000, 0xC2140000,
   41030xC2100000, 0xC20C0000, 0xC2080000, 0xC2040000, 0xC2000000, 0xC1F80000,
   41040xC1F00000, 0xC1E80000, 0xC1E00000, 0xC1D80000, 0xC1D00000, 0xC1C80000,
   41050xC1C00000, 0xC1B80000, 0xC1B00000, 0xC1A80000, 0xC1A00000, 0xC1980000,
   41060xC1900000, 0xC1880000, 0xC1800000, 0xC1700000, 0xC1600000, 0xC1500000,
   41070xC1400000, 0xC1300000, 0xC1200000, 0xC1100000, 0xC1000000, 0xC0E00000,
   41080xC0C00000, 0xC0A00000, 0xC0800000, 0xC0400000, 0xC0000000, 0xBF800000,
   41090x00000000, 0x3F800000, 0x40000000, 0x40400000, 0x40800000, 0x40A00000,
   41100x40C00000, 0x40E00000, 0x41000000, 0x41100000
   4111};
   4112
   4113/*
   4114 * This table counts from float 0 to 1 in increments of .01, which is
   4115 * useful for a few different sliders.
   4116 */
   4117static const unsigned int float_zero_to_one_lookup[] = {
   41180x00000000, 0x3C23D70A, 0x3CA3D70A, 0x3CF5C28F, 0x3D23D70A, 0x3D4CCCCD,
   41190x3D75C28F, 0x3D8F5C29, 0x3DA3D70A, 0x3DB851EC, 0x3DCCCCCD, 0x3DE147AE,
   41200x3DF5C28F, 0x3E051EB8, 0x3E0F5C29, 0x3E19999A, 0x3E23D70A, 0x3E2E147B,
   41210x3E3851EC, 0x3E428F5C, 0x3E4CCCCD, 0x3E570A3D, 0x3E6147AE, 0x3E6B851F,
   41220x3E75C28F, 0x3E800000, 0x3E851EB8, 0x3E8A3D71, 0x3E8F5C29, 0x3E947AE1,
   41230x3E99999A, 0x3E9EB852, 0x3EA3D70A, 0x3EA8F5C3, 0x3EAE147B, 0x3EB33333,
   41240x3EB851EC, 0x3EBD70A4, 0x3EC28F5C, 0x3EC7AE14, 0x3ECCCCCD, 0x3ED1EB85,
   41250x3ED70A3D, 0x3EDC28F6, 0x3EE147AE, 0x3EE66666, 0x3EEB851F, 0x3EF0A3D7,
   41260x3EF5C28F, 0x3EFAE148, 0x3F000000, 0x3F028F5C, 0x3F051EB8, 0x3F07AE14,
   41270x3F0A3D71, 0x3F0CCCCD, 0x3F0F5C29, 0x3F11EB85, 0x3F147AE1, 0x3F170A3D,
   41280x3F19999A, 0x3F1C28F6, 0x3F1EB852, 0x3F2147AE, 0x3F23D70A, 0x3F266666,
   41290x3F28F5C3, 0x3F2B851F, 0x3F2E147B, 0x3F30A3D7, 0x3F333333, 0x3F35C28F,
   41300x3F3851EC, 0x3F3AE148, 0x3F3D70A4, 0x3F400000, 0x3F428F5C, 0x3F451EB8,
   41310x3F47AE14, 0x3F4A3D71, 0x3F4CCCCD, 0x3F4F5C29, 0x3F51EB85, 0x3F547AE1,
   41320x3F570A3D, 0x3F59999A, 0x3F5C28F6, 0x3F5EB852, 0x3F6147AE, 0x3F63D70A,
   41330x3F666666, 0x3F68F5C3, 0x3F6B851F, 0x3F6E147B, 0x3F70A3D7, 0x3F733333,
   41340x3F75C28F, 0x3F7851EC, 0x3F7AE148, 0x3F7D70A4, 0x3F800000
   4135};
   4136
   4137/*
   4138 * This table counts from float 10 to 1000, which is the range of the x-bass
   4139 * crossover slider in Windows.
   4140 */
   4141static const unsigned int float_xbass_xover_lookup[] = {
   41420x41200000, 0x41A00000, 0x41F00000, 0x42200000, 0x42480000, 0x42700000,
   41430x428C0000, 0x42A00000, 0x42B40000, 0x42C80000, 0x42DC0000, 0x42F00000,
   41440x43020000, 0x430C0000, 0x43160000, 0x43200000, 0x432A0000, 0x43340000,
   41450x433E0000, 0x43480000, 0x43520000, 0x435C0000, 0x43660000, 0x43700000,
   41460x437A0000, 0x43820000, 0x43870000, 0x438C0000, 0x43910000, 0x43960000,
   41470x439B0000, 0x43A00000, 0x43A50000, 0x43AA0000, 0x43AF0000, 0x43B40000,
   41480x43B90000, 0x43BE0000, 0x43C30000, 0x43C80000, 0x43CD0000, 0x43D20000,
   41490x43D70000, 0x43DC0000, 0x43E10000, 0x43E60000, 0x43EB0000, 0x43F00000,
   41500x43F50000, 0x43FA0000, 0x43FF0000, 0x44020000, 0x44048000, 0x44070000,
   41510x44098000, 0x440C0000, 0x440E8000, 0x44110000, 0x44138000, 0x44160000,
   41520x44188000, 0x441B0000, 0x441D8000, 0x44200000, 0x44228000, 0x44250000,
   41530x44278000, 0x442A0000, 0x442C8000, 0x442F0000, 0x44318000, 0x44340000,
   41540x44368000, 0x44390000, 0x443B8000, 0x443E0000, 0x44408000, 0x44430000,
   41550x44458000, 0x44480000, 0x444A8000, 0x444D0000, 0x444F8000, 0x44520000,
   41560x44548000, 0x44570000, 0x44598000, 0x445C0000, 0x445E8000, 0x44610000,
   41570x44638000, 0x44660000, 0x44688000, 0x446B0000, 0x446D8000, 0x44700000,
   41580x44728000, 0x44750000, 0x44778000, 0x447A0000
   4159};
   4160
   4161/* The following are for tuning of products */
   4162#ifdef ENABLE_TUNING_CONTROLS
   4163
   4164static const unsigned int voice_focus_vals_lookup[] = {
   41650x41A00000, 0x41A80000, 0x41B00000, 0x41B80000, 0x41C00000, 0x41C80000,
   41660x41D00000, 0x41D80000, 0x41E00000, 0x41E80000, 0x41F00000, 0x41F80000,
   41670x42000000, 0x42040000, 0x42080000, 0x420C0000, 0x42100000, 0x42140000,
   41680x42180000, 0x421C0000, 0x42200000, 0x42240000, 0x42280000, 0x422C0000,
   41690x42300000, 0x42340000, 0x42380000, 0x423C0000, 0x42400000, 0x42440000,
   41700x42480000, 0x424C0000, 0x42500000, 0x42540000, 0x42580000, 0x425C0000,
   41710x42600000, 0x42640000, 0x42680000, 0x426C0000, 0x42700000, 0x42740000,
   41720x42780000, 0x427C0000, 0x42800000, 0x42820000, 0x42840000, 0x42860000,
   41730x42880000, 0x428A0000, 0x428C0000, 0x428E0000, 0x42900000, 0x42920000,
   41740x42940000, 0x42960000, 0x42980000, 0x429A0000, 0x429C0000, 0x429E0000,
   41750x42A00000, 0x42A20000, 0x42A40000, 0x42A60000, 0x42A80000, 0x42AA0000,
   41760x42AC0000, 0x42AE0000, 0x42B00000, 0x42B20000, 0x42B40000, 0x42B60000,
   41770x42B80000, 0x42BA0000, 0x42BC0000, 0x42BE0000, 0x42C00000, 0x42C20000,
   41780x42C40000, 0x42C60000, 0x42C80000, 0x42CA0000, 0x42CC0000, 0x42CE0000,
   41790x42D00000, 0x42D20000, 0x42D40000, 0x42D60000, 0x42D80000, 0x42DA0000,
   41800x42DC0000, 0x42DE0000, 0x42E00000, 0x42E20000, 0x42E40000, 0x42E60000,
   41810x42E80000, 0x42EA0000, 0x42EC0000, 0x42EE0000, 0x42F00000, 0x42F20000,
   41820x42F40000, 0x42F60000, 0x42F80000, 0x42FA0000, 0x42FC0000, 0x42FE0000,
   41830x43000000, 0x43010000, 0x43020000, 0x43030000, 0x43040000, 0x43050000,
   41840x43060000, 0x43070000, 0x43080000, 0x43090000, 0x430A0000, 0x430B0000,
   41850x430C0000, 0x430D0000, 0x430E0000, 0x430F0000, 0x43100000, 0x43110000,
   41860x43120000, 0x43130000, 0x43140000, 0x43150000, 0x43160000, 0x43170000,
   41870x43180000, 0x43190000, 0x431A0000, 0x431B0000, 0x431C0000, 0x431D0000,
   41880x431E0000, 0x431F0000, 0x43200000, 0x43210000, 0x43220000, 0x43230000,
   41890x43240000, 0x43250000, 0x43260000, 0x43270000, 0x43280000, 0x43290000,
   41900x432A0000, 0x432B0000, 0x432C0000, 0x432D0000, 0x432E0000, 0x432F0000,
   41910x43300000, 0x43310000, 0x43320000, 0x43330000, 0x43340000
   4192};
   4193
   4194static const unsigned int mic_svm_vals_lookup[] = {
   41950x00000000, 0x3C23D70A, 0x3CA3D70A, 0x3CF5C28F, 0x3D23D70A, 0x3D4CCCCD,
   41960x3D75C28F, 0x3D8F5C29, 0x3DA3D70A, 0x3DB851EC, 0x3DCCCCCD, 0x3DE147AE,
   41970x3DF5C28F, 0x3E051EB8, 0x3E0F5C29, 0x3E19999A, 0x3E23D70A, 0x3E2E147B,
   41980x3E3851EC, 0x3E428F5C, 0x3E4CCCCD, 0x3E570A3D, 0x3E6147AE, 0x3E6B851F,
   41990x3E75C28F, 0x3E800000, 0x3E851EB8, 0x3E8A3D71, 0x3E8F5C29, 0x3E947AE1,
   42000x3E99999A, 0x3E9EB852, 0x3EA3D70A, 0x3EA8F5C3, 0x3EAE147B, 0x3EB33333,
   42010x3EB851EC, 0x3EBD70A4, 0x3EC28F5C, 0x3EC7AE14, 0x3ECCCCCD, 0x3ED1EB85,
   42020x3ED70A3D, 0x3EDC28F6, 0x3EE147AE, 0x3EE66666, 0x3EEB851F, 0x3EF0A3D7,
   42030x3EF5C28F, 0x3EFAE148, 0x3F000000, 0x3F028F5C, 0x3F051EB8, 0x3F07AE14,
   42040x3F0A3D71, 0x3F0CCCCD, 0x3F0F5C29, 0x3F11EB85, 0x3F147AE1, 0x3F170A3D,
   42050x3F19999A, 0x3F1C28F6, 0x3F1EB852, 0x3F2147AE, 0x3F23D70A, 0x3F266666,
   42060x3F28F5C3, 0x3F2B851F, 0x3F2E147B, 0x3F30A3D7, 0x3F333333, 0x3F35C28F,
   42070x3F3851EC, 0x3F3AE148, 0x3F3D70A4, 0x3F400000, 0x3F428F5C, 0x3F451EB8,
   42080x3F47AE14, 0x3F4A3D71, 0x3F4CCCCD, 0x3F4F5C29, 0x3F51EB85, 0x3F547AE1,
   42090x3F570A3D, 0x3F59999A, 0x3F5C28F6, 0x3F5EB852, 0x3F6147AE, 0x3F63D70A,
   42100x3F666666, 0x3F68F5C3, 0x3F6B851F, 0x3F6E147B, 0x3F70A3D7, 0x3F733333,
   42110x3F75C28F, 0x3F7851EC, 0x3F7AE148, 0x3F7D70A4, 0x3F800000
   4212};
   4213
   4214static const unsigned int equalizer_vals_lookup[] = {
   42150xC1C00000, 0xC1B80000, 0xC1B00000, 0xC1A80000, 0xC1A00000, 0xC1980000,
   42160xC1900000, 0xC1880000, 0xC1800000, 0xC1700000, 0xC1600000, 0xC1500000,
   42170xC1400000, 0xC1300000, 0xC1200000, 0xC1100000, 0xC1000000, 0xC0E00000,
   42180xC0C00000, 0xC0A00000, 0xC0800000, 0xC0400000, 0xC0000000, 0xBF800000,
   42190x00000000, 0x3F800000, 0x40000000, 0x40400000, 0x40800000, 0x40A00000,
   42200x40C00000, 0x40E00000, 0x41000000, 0x41100000, 0x41200000, 0x41300000,
   42210x41400000, 0x41500000, 0x41600000, 0x41700000, 0x41800000, 0x41880000,
   42220x41900000, 0x41980000, 0x41A00000, 0x41A80000, 0x41B00000, 0x41B80000,
   42230x41C00000
   4224};
   4225
   4226static int tuning_ctl_set(struct hda_codec *codec, hda_nid_t nid,
   4227			  const unsigned int *lookup, int idx)
   4228{
   4229	int i = 0;
   4230
   4231	for (i = 0; i < TUNING_CTLS_COUNT; i++)
   4232		if (nid == ca0132_tuning_ctls[i].nid)
   4233			break;
   4234
   4235	snd_hda_power_up(codec);
   4236	dspio_set_param(codec, ca0132_tuning_ctls[i].mid, 0x20,
   4237			ca0132_tuning_ctls[i].req,
   4238			&(lookup[idx]), sizeof(unsigned int));
   4239	snd_hda_power_down(codec);
   4240
   4241	return 1;
   4242}
   4243
   4244static int tuning_ctl_get(struct snd_kcontrol *kcontrol,
   4245			  struct snd_ctl_elem_value *ucontrol)
   4246{
   4247	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
   4248	struct ca0132_spec *spec = codec->spec;
   4249	hda_nid_t nid = get_amp_nid(kcontrol);
   4250	long *valp = ucontrol->value.integer.value;
   4251	int idx = nid - TUNING_CTL_START_NID;
   4252
   4253	*valp = spec->cur_ctl_vals[idx];
   4254	return 0;
   4255}
   4256
   4257static int voice_focus_ctl_info(struct snd_kcontrol *kcontrol,
   4258			      struct snd_ctl_elem_info *uinfo)
   4259{
   4260	int chs = get_amp_channels(kcontrol);
   4261	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
   4262	uinfo->count = chs == 3 ? 2 : 1;
   4263	uinfo->value.integer.min = 20;
   4264	uinfo->value.integer.max = 180;
   4265	uinfo->value.integer.step = 1;
   4266
   4267	return 0;
   4268}
   4269
   4270static int voice_focus_ctl_put(struct snd_kcontrol *kcontrol,
   4271				struct snd_ctl_elem_value *ucontrol)
   4272{
   4273	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
   4274	struct ca0132_spec *spec = codec->spec;
   4275	hda_nid_t nid = get_amp_nid(kcontrol);
   4276	long *valp = ucontrol->value.integer.value;
   4277	int idx;
   4278
   4279	idx = nid - TUNING_CTL_START_NID;
   4280	/* any change? */
   4281	if (spec->cur_ctl_vals[idx] == *valp)
   4282		return 0;
   4283
   4284	spec->cur_ctl_vals[idx] = *valp;
   4285
   4286	idx = *valp - 20;
   4287	tuning_ctl_set(codec, nid, voice_focus_vals_lookup, idx);
   4288
   4289	return 1;
   4290}
   4291
   4292static int mic_svm_ctl_info(struct snd_kcontrol *kcontrol,
   4293			      struct snd_ctl_elem_info *uinfo)
   4294{
   4295	int chs = get_amp_channels(kcontrol);
   4296	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
   4297	uinfo->count = chs == 3 ? 2 : 1;
   4298	uinfo->value.integer.min = 0;
   4299	uinfo->value.integer.max = 100;
   4300	uinfo->value.integer.step = 1;
   4301
   4302	return 0;
   4303}
   4304
   4305static int mic_svm_ctl_put(struct snd_kcontrol *kcontrol,
   4306				struct snd_ctl_elem_value *ucontrol)
   4307{
   4308	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
   4309	struct ca0132_spec *spec = codec->spec;
   4310	hda_nid_t nid = get_amp_nid(kcontrol);
   4311	long *valp = ucontrol->value.integer.value;
   4312	int idx;
   4313
   4314	idx = nid - TUNING_CTL_START_NID;
   4315	/* any change? */
   4316	if (spec->cur_ctl_vals[idx] == *valp)
   4317		return 0;
   4318
   4319	spec->cur_ctl_vals[idx] = *valp;
   4320
   4321	idx = *valp;
   4322	tuning_ctl_set(codec, nid, mic_svm_vals_lookup, idx);
   4323
   4324	return 0;
   4325}
   4326
   4327static int equalizer_ctl_info(struct snd_kcontrol *kcontrol,
   4328			      struct snd_ctl_elem_info *uinfo)
   4329{
   4330	int chs = get_amp_channels(kcontrol);
   4331	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
   4332	uinfo->count = chs == 3 ? 2 : 1;
   4333	uinfo->value.integer.min = 0;
   4334	uinfo->value.integer.max = 48;
   4335	uinfo->value.integer.step = 1;
   4336
   4337	return 0;
   4338}
   4339
   4340static int equalizer_ctl_put(struct snd_kcontrol *kcontrol,
   4341				struct snd_ctl_elem_value *ucontrol)
   4342{
   4343	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
   4344	struct ca0132_spec *spec = codec->spec;
   4345	hda_nid_t nid = get_amp_nid(kcontrol);
   4346	long *valp = ucontrol->value.integer.value;
   4347	int idx;
   4348
   4349	idx = nid - TUNING_CTL_START_NID;
   4350	/* any change? */
   4351	if (spec->cur_ctl_vals[idx] == *valp)
   4352		return 0;
   4353
   4354	spec->cur_ctl_vals[idx] = *valp;
   4355
   4356	idx = *valp;
   4357	tuning_ctl_set(codec, nid, equalizer_vals_lookup, idx);
   4358
   4359	return 1;
   4360}
   4361
   4362static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(voice_focus_db_scale, 2000, 100, 0);
   4363static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(eq_db_scale, -2400, 100, 0);
   4364
   4365static int add_tuning_control(struct hda_codec *codec,
   4366				hda_nid_t pnid, hda_nid_t nid,
   4367				const char *name, int dir)
   4368{
   4369	char namestr[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
   4370	int type = dir ? HDA_INPUT : HDA_OUTPUT;
   4371	struct snd_kcontrol_new knew =
   4372		HDA_CODEC_VOLUME_MONO(namestr, nid, 1, 0, type);
   4373
   4374	knew.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
   4375			SNDRV_CTL_ELEM_ACCESS_TLV_READ;
   4376	knew.tlv.c = 0;
   4377	knew.tlv.p = 0;
   4378	switch (pnid) {
   4379	case VOICE_FOCUS:
   4380		knew.info = voice_focus_ctl_info;
   4381		knew.get = tuning_ctl_get;
   4382		knew.put = voice_focus_ctl_put;
   4383		knew.tlv.p = voice_focus_db_scale;
   4384		break;
   4385	case MIC_SVM:
   4386		knew.info = mic_svm_ctl_info;
   4387		knew.get = tuning_ctl_get;
   4388		knew.put = mic_svm_ctl_put;
   4389		break;
   4390	case EQUALIZER:
   4391		knew.info = equalizer_ctl_info;
   4392		knew.get = tuning_ctl_get;
   4393		knew.put = equalizer_ctl_put;
   4394		knew.tlv.p = eq_db_scale;
   4395		break;
   4396	default:
   4397		return 0;
   4398	}
   4399	knew.private_value =
   4400		HDA_COMPOSE_AMP_VAL(nid, 1, 0, type);
   4401	sprintf(namestr, "%s %s Volume", name, dirstr[dir]);
   4402	return snd_hda_ctl_add(codec, nid, snd_ctl_new1(&knew, codec));
   4403}
   4404
   4405static int add_tuning_ctls(struct hda_codec *codec)
   4406{
   4407	int i;
   4408	int err;
   4409
   4410	for (i = 0; i < TUNING_CTLS_COUNT; i++) {
   4411		err = add_tuning_control(codec,
   4412					ca0132_tuning_ctls[i].parent_nid,
   4413					ca0132_tuning_ctls[i].nid,
   4414					ca0132_tuning_ctls[i].name,
   4415					ca0132_tuning_ctls[i].direct);
   4416		if (err < 0)
   4417			return err;
   4418	}
   4419
   4420	return 0;
   4421}
   4422
   4423static void ca0132_init_tuning_defaults(struct hda_codec *codec)
   4424{
   4425	struct ca0132_spec *spec = codec->spec;
   4426	int i;
   4427
   4428	/* Wedge Angle defaults to 30.  10 below is 30 - 20.  20 is min. */
   4429	spec->cur_ctl_vals[WEDGE_ANGLE - TUNING_CTL_START_NID] = 10;
   4430	/* SVM level defaults to 0.74. */
   4431	spec->cur_ctl_vals[SVM_LEVEL - TUNING_CTL_START_NID] = 74;
   4432
   4433	/* EQ defaults to 0dB. */
   4434	for (i = 2; i < TUNING_CTLS_COUNT; i++)
   4435		spec->cur_ctl_vals[i] = 24;
   4436}
   4437#endif /*ENABLE_TUNING_CONTROLS*/
   4438
   4439/*
   4440 * Select the active output.
   4441 * If autodetect is enabled, output will be selected based on jack detection.
   4442 * If jack inserted, headphone will be selected, else built-in speakers
   4443 * If autodetect is disabled, output will be selected based on selection.
   4444 */
   4445static int ca0132_select_out(struct hda_codec *codec)
   4446{
   4447	struct ca0132_spec *spec = codec->spec;
   4448	unsigned int pin_ctl;
   4449	int jack_present;
   4450	int auto_jack;
   4451	unsigned int tmp;
   4452	int err;
   4453
   4454	codec_dbg(codec, "ca0132_select_out\n");
   4455
   4456	snd_hda_power_up_pm(codec);
   4457
   4458	auto_jack = spec->vnode_lswitch[VNID_HP_ASEL - VNODE_START_NID];
   4459
   4460	if (auto_jack)
   4461		jack_present = snd_hda_jack_detect(codec, spec->unsol_tag_hp);
   4462	else
   4463		jack_present =
   4464			spec->vnode_lswitch[VNID_HP_SEL - VNODE_START_NID];
   4465
   4466	if (jack_present)
   4467		spec->cur_out_type = HEADPHONE_OUT;
   4468	else
   4469		spec->cur_out_type = SPEAKER_OUT;
   4470
   4471	if (spec->cur_out_type == SPEAKER_OUT) {
   4472		codec_dbg(codec, "ca0132_select_out speaker\n");
   4473		/*speaker out config*/
   4474		tmp = FLOAT_ONE;
   4475		err = dspio_set_uint_param(codec, 0x80, 0x04, tmp);
   4476		if (err < 0)
   4477			goto exit;
   4478		/*enable speaker EQ*/
   4479		tmp = FLOAT_ONE;
   4480		err = dspio_set_uint_param(codec, 0x8f, 0x00, tmp);
   4481		if (err < 0)
   4482			goto exit;
   4483
   4484		/* Setup EAPD */
   4485		snd_hda_codec_write(codec, spec->out_pins[1], 0,
   4486				    VENDOR_CHIPIO_EAPD_SEL_SET, 0x02);
   4487		snd_hda_codec_write(codec, spec->out_pins[0], 0,
   4488				    AC_VERB_SET_EAPD_BTLENABLE, 0x00);
   4489		snd_hda_codec_write(codec, spec->out_pins[0], 0,
   4490				    VENDOR_CHIPIO_EAPD_SEL_SET, 0x00);
   4491		snd_hda_codec_write(codec, spec->out_pins[0], 0,
   4492				    AC_VERB_SET_EAPD_BTLENABLE, 0x02);
   4493
   4494		/* disable headphone node */
   4495		pin_ctl = snd_hda_codec_read(codec, spec->out_pins[1], 0,
   4496					AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
   4497		snd_hda_set_pin_ctl(codec, spec->out_pins[1],
   4498				    pin_ctl & ~PIN_HP);
   4499		/* enable speaker node */
   4500		pin_ctl = snd_hda_codec_read(codec, spec->out_pins[0], 0,
   4501				AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
   4502		snd_hda_set_pin_ctl(codec, spec->out_pins[0],
   4503				    pin_ctl | PIN_OUT);
   4504	} else {
   4505		codec_dbg(codec, "ca0132_select_out hp\n");
   4506		/*headphone out config*/
   4507		tmp = FLOAT_ZERO;
   4508		err = dspio_set_uint_param(codec, 0x80, 0x04, tmp);
   4509		if (err < 0)
   4510			goto exit;
   4511		/*disable speaker EQ*/
   4512		tmp = FLOAT_ZERO;
   4513		err = dspio_set_uint_param(codec, 0x8f, 0x00, tmp);
   4514		if (err < 0)
   4515			goto exit;
   4516
   4517		/* Setup EAPD */
   4518		snd_hda_codec_write(codec, spec->out_pins[0], 0,
   4519				    VENDOR_CHIPIO_EAPD_SEL_SET, 0x00);
   4520		snd_hda_codec_write(codec, spec->out_pins[0], 0,
   4521				    AC_VERB_SET_EAPD_BTLENABLE, 0x00);
   4522		snd_hda_codec_write(codec, spec->out_pins[1], 0,
   4523				    VENDOR_CHIPIO_EAPD_SEL_SET, 0x02);
   4524		snd_hda_codec_write(codec, spec->out_pins[0], 0,
   4525				    AC_VERB_SET_EAPD_BTLENABLE, 0x02);
   4526
   4527		/* disable speaker*/
   4528		pin_ctl = snd_hda_codec_read(codec, spec->out_pins[0], 0,
   4529					AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
   4530		snd_hda_set_pin_ctl(codec, spec->out_pins[0],
   4531				    pin_ctl & ~PIN_HP);
   4532		/* enable headphone*/
   4533		pin_ctl = snd_hda_codec_read(codec, spec->out_pins[1], 0,
   4534					AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
   4535		snd_hda_set_pin_ctl(codec, spec->out_pins[1],
   4536				    pin_ctl | PIN_HP);
   4537	}
   4538
   4539exit:
   4540	snd_hda_power_down_pm(codec);
   4541
   4542	return err < 0 ? err : 0;
   4543}
   4544
   4545static int ae5_headphone_gain_set(struct hda_codec *codec, long val);
   4546static int zxr_headphone_gain_set(struct hda_codec *codec, long val);
   4547static int ca0132_effects_set(struct hda_codec *codec, hda_nid_t nid, long val);
   4548
   4549static void ae5_mmio_select_out(struct hda_codec *codec)
   4550{
   4551	struct ca0132_spec *spec = codec->spec;
   4552	const struct ae_ca0113_output_set *out_cmds;
   4553	unsigned int i;
   4554
   4555	if (ca0132_quirk(spec) == QUIRK_AE5)
   4556		out_cmds = &ae5_ca0113_output_presets;
   4557	else
   4558		out_cmds = &ae7_ca0113_output_presets;
   4559
   4560	for (i = 0; i < AE_CA0113_OUT_SET_COMMANDS; i++)
   4561		ca0113_mmio_command_set(codec, out_cmds->group[i],
   4562				out_cmds->target[i],
   4563				out_cmds->vals[spec->cur_out_type][i]);
   4564}
   4565
   4566static int ca0132_alt_set_full_range_speaker(struct hda_codec *codec)
   4567{
   4568	struct ca0132_spec *spec = codec->spec;
   4569	int quirk = ca0132_quirk(spec);
   4570	unsigned int tmp;
   4571	int err;
   4572
   4573	/* 2.0/4.0 setup has no LFE channel, so setting full-range does nothing. */
   4574	if (spec->channel_cfg_val == SPEAKER_CHANNELS_4_0
   4575			|| spec->channel_cfg_val == SPEAKER_CHANNELS_2_0)
   4576		return 0;
   4577
   4578	/* Set front L/R full range. Zero for full-range, one for redirection. */
   4579	tmp = spec->speaker_range_val[0] ? FLOAT_ZERO : FLOAT_ONE;
   4580	err = dspio_set_uint_param(codec, 0x96,
   4581			SPEAKER_FULL_RANGE_FRONT_L_R, tmp);
   4582	if (err < 0)
   4583		return err;
   4584
   4585	/* When setting full-range rear, both rear and center/lfe are set. */
   4586	tmp = spec->speaker_range_val[1] ? FLOAT_ZERO : FLOAT_ONE;
   4587	err = dspio_set_uint_param(codec, 0x96,
   4588			SPEAKER_FULL_RANGE_CENTER_LFE, tmp);
   4589	if (err < 0)
   4590		return err;
   4591
   4592	err = dspio_set_uint_param(codec, 0x96,
   4593			SPEAKER_FULL_RANGE_REAR_L_R, tmp);
   4594	if (err < 0)
   4595		return err;
   4596
   4597	/*
   4598	 * Only the AE series cards set this value when setting full-range,
   4599	 * and it's always 1.0f.
   4600	 */
   4601	if (quirk == QUIRK_AE5 || quirk == QUIRK_AE7) {
   4602		err = dspio_set_uint_param(codec, 0x96,
   4603				SPEAKER_FULL_RANGE_SURROUND_L_R, FLOAT_ONE);
   4604		if (err < 0)
   4605			return err;
   4606	}
   4607
   4608	return 0;
   4609}
   4610
   4611static int ca0132_alt_surround_set_bass_redirection(struct hda_codec *codec,
   4612		bool val)
   4613{
   4614	struct ca0132_spec *spec = codec->spec;
   4615	unsigned int tmp;
   4616	int err;
   4617
   4618	if (val && spec->channel_cfg_val != SPEAKER_CHANNELS_4_0 &&
   4619			spec->channel_cfg_val != SPEAKER_CHANNELS_2_0)
   4620		tmp = FLOAT_ONE;
   4621	else
   4622		tmp = FLOAT_ZERO;
   4623
   4624	err = dspio_set_uint_param(codec, 0x96, SPEAKER_BASS_REDIRECT, tmp);
   4625	if (err < 0)
   4626		return err;
   4627
   4628	/* If it is enabled, make sure to set the crossover frequency. */
   4629	if (tmp) {
   4630		tmp = float_xbass_xover_lookup[spec->xbass_xover_freq];
   4631		err = dspio_set_uint_param(codec, 0x96,
   4632				SPEAKER_BASS_REDIRECT_XOVER_FREQ, tmp);
   4633		if (err < 0)
   4634			return err;
   4635	}
   4636
   4637	return 0;
   4638}
   4639
   4640/*
   4641 * These are the commands needed to setup output on each of the different card
   4642 * types.
   4643 */
   4644static void ca0132_alt_select_out_get_quirk_data(struct hda_codec *codec,
   4645		const struct ca0132_alt_out_set_quirk_data **quirk_data)
   4646{
   4647	struct ca0132_spec *spec = codec->spec;
   4648	int quirk = ca0132_quirk(spec);
   4649	unsigned int i;
   4650
   4651	*quirk_data = NULL;
   4652	for (i = 0; i < ARRAY_SIZE(quirk_out_set_data); i++) {
   4653		if (quirk_out_set_data[i].quirk_id == quirk) {
   4654			*quirk_data = &quirk_out_set_data[i];
   4655			return;
   4656		}
   4657	}
   4658}
   4659
   4660static int ca0132_alt_select_out_quirk_set(struct hda_codec *codec)
   4661{
   4662	const struct ca0132_alt_out_set_quirk_data *quirk_data;
   4663	const struct ca0132_alt_out_set_info *out_info;
   4664	struct ca0132_spec *spec = codec->spec;
   4665	unsigned int i, gpio_data;
   4666	int err;
   4667
   4668	ca0132_alt_select_out_get_quirk_data(codec, &quirk_data);
   4669	if (!quirk_data)
   4670		return 0;
   4671
   4672	out_info = &quirk_data->out_set_info[spec->cur_out_type];
   4673	if (quirk_data->is_ae_series)
   4674		ae5_mmio_select_out(codec);
   4675
   4676	if (out_info->has_hda_gpio) {
   4677		gpio_data = snd_hda_codec_read(codec, codec->core.afg, 0,
   4678				AC_VERB_GET_GPIO_DATA, 0);
   4679
   4680		if (out_info->hda_gpio_set)
   4681			gpio_data |= (1 << out_info->hda_gpio_pin);
   4682		else
   4683			gpio_data &= ~(1 << out_info->hda_gpio_pin);
   4684
   4685		snd_hda_codec_write(codec, codec->core.afg, 0,
   4686				    AC_VERB_SET_GPIO_DATA, gpio_data);
   4687	}
   4688
   4689	if (out_info->mmio_gpio_count) {
   4690		for (i = 0; i < out_info->mmio_gpio_count; i++) {
   4691			ca0113_mmio_gpio_set(codec, out_info->mmio_gpio_pin[i],
   4692					out_info->mmio_gpio_set[i]);
   4693		}
   4694	}
   4695
   4696	if (out_info->scp_cmds_count) {
   4697		for (i = 0; i < out_info->scp_cmds_count; i++) {
   4698			err = dspio_set_uint_param(codec,
   4699					out_info->scp_cmd_mid[i],
   4700					out_info->scp_cmd_req[i],
   4701					out_info->scp_cmd_val[i]);
   4702			if (err < 0)
   4703				return err;
   4704		}
   4705	}
   4706
   4707	chipio_set_control_param(codec, 0x0d, out_info->dac2port);
   4708
   4709	if (out_info->has_chipio_write) {
   4710		chipio_write(codec, out_info->chipio_write_addr,
   4711				out_info->chipio_write_data);
   4712	}
   4713
   4714	if (quirk_data->has_headphone_gain) {
   4715		if (spec->cur_out_type != HEADPHONE_OUT) {
   4716			if (quirk_data->is_ae_series)
   4717				ae5_headphone_gain_set(codec, 2);
   4718			else
   4719				zxr_headphone_gain_set(codec, 0);
   4720		} else {
   4721			if (quirk_data->is_ae_series)
   4722				ae5_headphone_gain_set(codec,
   4723						spec->ae5_headphone_gain_val);
   4724			else
   4725				zxr_headphone_gain_set(codec,
   4726						spec->zxr_gain_set);
   4727		}
   4728	}
   4729
   4730	return 0;
   4731}
   4732
   4733static void ca0132_set_out_node_pincfg(struct hda_codec *codec, hda_nid_t nid,
   4734		bool out_enable, bool hp_enable)
   4735{
   4736	unsigned int pin_ctl;
   4737
   4738	pin_ctl = snd_hda_codec_read(codec, nid, 0,
   4739			AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
   4740
   4741	pin_ctl = hp_enable ? pin_ctl | PIN_HP_AMP : pin_ctl & ~PIN_HP_AMP;
   4742	pin_ctl = out_enable ? pin_ctl | PIN_OUT : pin_ctl & ~PIN_OUT;
   4743	snd_hda_set_pin_ctl(codec, nid, pin_ctl);
   4744}
   4745
   4746/*
   4747 * This function behaves similarly to the ca0132_select_out funciton above,
   4748 * except with a few differences. It adds the ability to select the current
   4749 * output with an enumerated control "output source" if the auto detect
   4750 * mute switch is set to off. If the auto detect mute switch is enabled, it
   4751 * will detect either headphone or lineout(SPEAKER_OUT) from jack detection.
   4752 * It also adds the ability to auto-detect the front headphone port.
   4753 */
   4754static int ca0132_alt_select_out(struct hda_codec *codec)
   4755{
   4756	struct ca0132_spec *spec = codec->spec;
   4757	unsigned int tmp, outfx_set;
   4758	int jack_present;
   4759	int auto_jack;
   4760	int err;
   4761	/* Default Headphone is rear headphone */
   4762	hda_nid_t headphone_nid = spec->out_pins[1];
   4763
   4764	codec_dbg(codec, "%s\n", __func__);
   4765
   4766	snd_hda_power_up_pm(codec);
   4767
   4768	auto_jack = spec->vnode_lswitch[VNID_HP_ASEL - VNODE_START_NID];
   4769
   4770	/*
   4771	 * If headphone rear or front is plugged in, set to headphone.
   4772	 * If neither is plugged in, set to rear line out. Only if
   4773	 * hp/speaker auto detect is enabled.
   4774	 */
   4775	if (auto_jack) {
   4776		jack_present = snd_hda_jack_detect(codec, spec->unsol_tag_hp) ||
   4777			   snd_hda_jack_detect(codec, spec->unsol_tag_front_hp);
   4778
   4779		if (jack_present)
   4780			spec->cur_out_type = HEADPHONE_OUT;
   4781		else
   4782			spec->cur_out_type = SPEAKER_OUT;
   4783	} else
   4784		spec->cur_out_type = spec->out_enum_val;
   4785
   4786	outfx_set = spec->effects_switch[PLAY_ENHANCEMENT - EFFECT_START_NID];
   4787
   4788	/* Begin DSP output switch, mute DSP volume. */
   4789	err = dspio_set_uint_param(codec, 0x96, SPEAKER_TUNING_MUTE, FLOAT_ONE);
   4790	if (err < 0)
   4791		goto exit;
   4792
   4793	if (ca0132_alt_select_out_quirk_set(codec) < 0)
   4794		goto exit;
   4795
   4796	switch (spec->cur_out_type) {
   4797	case SPEAKER_OUT:
   4798		codec_dbg(codec, "%s speaker\n", __func__);
   4799
   4800		/* Enable EAPD */
   4801		snd_hda_codec_write(codec, spec->out_pins[0], 0,
   4802			AC_VERB_SET_EAPD_BTLENABLE, 0x01);
   4803
   4804		/* Disable headphone node. */
   4805		ca0132_set_out_node_pincfg(codec, spec->out_pins[1], 0, 0);
   4806		/* Set front L-R to output. */
   4807		ca0132_set_out_node_pincfg(codec, spec->out_pins[0], 1, 0);
   4808		/* Set Center/LFE to output. */
   4809		ca0132_set_out_node_pincfg(codec, spec->out_pins[2], 1, 0);
   4810		/* Set rear surround to output. */
   4811		ca0132_set_out_node_pincfg(codec, spec->out_pins[3], 1, 0);
   4812
   4813		/*
   4814		 * Without PlayEnhancement being enabled, if we've got a 2.0
   4815		 * setup, set it to floating point eight to disable any DSP
   4816		 * processing effects.
   4817		 */
   4818		if (!outfx_set && spec->channel_cfg_val == SPEAKER_CHANNELS_2_0)
   4819			tmp = FLOAT_EIGHT;
   4820		else
   4821			tmp = speaker_channel_cfgs[spec->channel_cfg_val].val;
   4822
   4823		err = dspio_set_uint_param(codec, 0x80, 0x04, tmp);
   4824		if (err < 0)
   4825			goto exit;
   4826
   4827		break;
   4828	case HEADPHONE_OUT:
   4829		codec_dbg(codec, "%s hp\n", __func__);
   4830		snd_hda_codec_write(codec, spec->out_pins[0], 0,
   4831			AC_VERB_SET_EAPD_BTLENABLE, 0x00);
   4832
   4833		/* Disable all speaker nodes. */
   4834		ca0132_set_out_node_pincfg(codec, spec->out_pins[0], 0, 0);
   4835		ca0132_set_out_node_pincfg(codec, spec->out_pins[2], 0, 0);
   4836		ca0132_set_out_node_pincfg(codec, spec->out_pins[3], 0, 0);
   4837
   4838		/* enable headphone, either front or rear */
   4839		if (snd_hda_jack_detect(codec, spec->unsol_tag_front_hp))
   4840			headphone_nid = spec->out_pins[2];
   4841		else if (snd_hda_jack_detect(codec, spec->unsol_tag_hp))
   4842			headphone_nid = spec->out_pins[1];
   4843
   4844		ca0132_set_out_node_pincfg(codec, headphone_nid, 1, 1);
   4845
   4846		if (outfx_set)
   4847			err = dspio_set_uint_param(codec, 0x80, 0x04, FLOAT_ONE);
   4848		else
   4849			err = dspio_set_uint_param(codec, 0x80, 0x04, FLOAT_ZERO);
   4850
   4851		if (err < 0)
   4852			goto exit;
   4853		break;
   4854	}
   4855	/*
   4856	 * If output effects are enabled, set the X-Bass effect value again to
   4857	 * make sure that it's properly enabled/disabled for speaker
   4858	 * configurations with an LFE channel.
   4859	 */
   4860	if (outfx_set)
   4861		ca0132_effects_set(codec, X_BASS,
   4862			spec->effects_switch[X_BASS - EFFECT_START_NID]);
   4863
   4864	/* Set speaker EQ bypass attenuation to 0. */
   4865	err = dspio_set_uint_param(codec, 0x8f, 0x01, FLOAT_ZERO);
   4866	if (err < 0)
   4867		goto exit;
   4868
   4869	/*
   4870	 * Although unused on all cards but the AE series, this is always set
   4871	 * to zero when setting the output.
   4872	 */
   4873	err = dspio_set_uint_param(codec, 0x96,
   4874			SPEAKER_TUNING_USE_SPEAKER_EQ, FLOAT_ZERO);
   4875	if (err < 0)
   4876		goto exit;
   4877
   4878	if (spec->cur_out_type == SPEAKER_OUT)
   4879		err = ca0132_alt_surround_set_bass_redirection(codec,
   4880				spec->bass_redirection_val);
   4881	else
   4882		err = ca0132_alt_surround_set_bass_redirection(codec, 0);
   4883
   4884	/* Unmute DSP now that we're done with output selection. */
   4885	err = dspio_set_uint_param(codec, 0x96,
   4886			SPEAKER_TUNING_MUTE, FLOAT_ZERO);
   4887	if (err < 0)
   4888		goto exit;
   4889
   4890	if (spec->cur_out_type == SPEAKER_OUT) {
   4891		err = ca0132_alt_set_full_range_speaker(codec);
   4892		if (err < 0)
   4893			goto exit;
   4894	}
   4895
   4896exit:
   4897	snd_hda_power_down_pm(codec);
   4898
   4899	return err < 0 ? err : 0;
   4900}
   4901
   4902static void ca0132_unsol_hp_delayed(struct work_struct *work)
   4903{
   4904	struct ca0132_spec *spec = container_of(
   4905		to_delayed_work(work), struct ca0132_spec, unsol_hp_work);
   4906	struct hda_jack_tbl *jack;
   4907
   4908	if (ca0132_use_alt_functions(spec))
   4909		ca0132_alt_select_out(spec->codec);
   4910	else
   4911		ca0132_select_out(spec->codec);
   4912
   4913	jack = snd_hda_jack_tbl_get(spec->codec, spec->unsol_tag_hp);
   4914	if (jack) {
   4915		jack->block_report = 0;
   4916		snd_hda_jack_report_sync(spec->codec);
   4917	}
   4918}
   4919
   4920static void ca0132_set_dmic(struct hda_codec *codec, int enable);
   4921static int ca0132_mic_boost_set(struct hda_codec *codec, long val);
   4922static void resume_mic1(struct hda_codec *codec, unsigned int oldval);
   4923static int stop_mic1(struct hda_codec *codec);
   4924static int ca0132_cvoice_switch_set(struct hda_codec *codec);
   4925static int ca0132_alt_mic_boost_set(struct hda_codec *codec, long val);
   4926
   4927/*
   4928 * Select the active VIP source
   4929 */
   4930static int ca0132_set_vipsource(struct hda_codec *codec, int val)
   4931{
   4932	struct ca0132_spec *spec = codec->spec;
   4933	unsigned int tmp;
   4934
   4935	if (spec->dsp_state != DSP_DOWNLOADED)
   4936		return 0;
   4937
   4938	/* if CrystalVoice if off, vipsource should be 0 */
   4939	if (!spec->effects_switch[CRYSTAL_VOICE - EFFECT_START_NID] ||
   4940	    (val == 0)) {
   4941		chipio_set_control_param(codec, CONTROL_PARAM_VIP_SOURCE, 0);
   4942		chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_96_000);
   4943		chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_96_000);
   4944		if (spec->cur_mic_type == DIGITAL_MIC)
   4945			tmp = FLOAT_TWO;
   4946		else
   4947			tmp = FLOAT_ONE;
   4948		dspio_set_uint_param(codec, 0x80, 0x00, tmp);
   4949		tmp = FLOAT_ZERO;
   4950		dspio_set_uint_param(codec, 0x80, 0x05, tmp);
   4951	} else {
   4952		chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_16_000);
   4953		chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_16_000);
   4954		if (spec->cur_mic_type == DIGITAL_MIC)
   4955			tmp = FLOAT_TWO;
   4956		else
   4957			tmp = FLOAT_ONE;
   4958		dspio_set_uint_param(codec, 0x80, 0x00, tmp);
   4959		tmp = FLOAT_ONE;
   4960		dspio_set_uint_param(codec, 0x80, 0x05, tmp);
   4961		msleep(20);
   4962		chipio_set_control_param(codec, CONTROL_PARAM_VIP_SOURCE, val);
   4963	}
   4964
   4965	return 1;
   4966}
   4967
   4968static int ca0132_alt_set_vipsource(struct hda_codec *codec, int val)
   4969{
   4970	struct ca0132_spec *spec = codec->spec;
   4971	unsigned int tmp;
   4972
   4973	if (spec->dsp_state != DSP_DOWNLOADED)
   4974		return 0;
   4975
   4976	codec_dbg(codec, "%s\n", __func__);
   4977
   4978	chipio_set_stream_control(codec, 0x03, 0);
   4979	chipio_set_stream_control(codec, 0x04, 0);
   4980
   4981	/* if CrystalVoice is off, vipsource should be 0 */
   4982	if (!spec->effects_switch[CRYSTAL_VOICE - EFFECT_START_NID] ||
   4983	    (val == 0) || spec->in_enum_val == REAR_LINE_IN) {
   4984		codec_dbg(codec, "%s: off.", __func__);
   4985		chipio_set_control_param(codec, CONTROL_PARAM_VIP_SOURCE, 0);
   4986
   4987		tmp = FLOAT_ZERO;
   4988		dspio_set_uint_param(codec, 0x80, 0x05, tmp);
   4989
   4990		chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_96_000);
   4991		chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_96_000);
   4992		if (ca0132_quirk(spec) == QUIRK_R3DI)
   4993			chipio_set_conn_rate(codec, 0x0F, SR_96_000);
   4994
   4995
   4996		if (spec->in_enum_val == REAR_LINE_IN)
   4997			tmp = FLOAT_ZERO;
   4998		else {
   4999			if (ca0132_quirk(spec) == QUIRK_SBZ)
   5000				tmp = FLOAT_THREE;
   5001			else
   5002				tmp = FLOAT_ONE;
   5003		}
   5004
   5005		dspio_set_uint_param(codec, 0x80, 0x00, tmp);
   5006
   5007	} else {
   5008		codec_dbg(codec, "%s: on.", __func__);
   5009		chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_16_000);
   5010		chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_16_000);
   5011		if (ca0132_quirk(spec) == QUIRK_R3DI)
   5012			chipio_set_conn_rate(codec, 0x0F, SR_16_000);
   5013
   5014		if (spec->effects_switch[VOICE_FOCUS - EFFECT_START_NID])
   5015			tmp = FLOAT_TWO;
   5016		else
   5017			tmp = FLOAT_ONE;
   5018		dspio_set_uint_param(codec, 0x80, 0x00, tmp);
   5019
   5020		tmp = FLOAT_ONE;
   5021		dspio_set_uint_param(codec, 0x80, 0x05, tmp);
   5022
   5023		msleep(20);
   5024		chipio_set_control_param(codec, CONTROL_PARAM_VIP_SOURCE, val);
   5025	}
   5026
   5027	chipio_set_stream_control(codec, 0x03, 1);
   5028	chipio_set_stream_control(codec, 0x04, 1);
   5029
   5030	return 1;
   5031}
   5032
   5033/*
   5034 * Select the active microphone.
   5035 * If autodetect is enabled, mic will be selected based on jack detection.
   5036 * If jack inserted, ext.mic will be selected, else built-in mic
   5037 * If autodetect is disabled, mic will be selected based on selection.
   5038 */
   5039static int ca0132_select_mic(struct hda_codec *codec)
   5040{
   5041	struct ca0132_spec *spec = codec->spec;
   5042	int jack_present;
   5043	int auto_jack;
   5044
   5045	codec_dbg(codec, "ca0132_select_mic\n");
   5046
   5047	snd_hda_power_up_pm(codec);
   5048
   5049	auto_jack = spec->vnode_lswitch[VNID_AMIC1_ASEL - VNODE_START_NID];
   5050
   5051	if (auto_jack)
   5052		jack_present = snd_hda_jack_detect(codec, spec->unsol_tag_amic1);
   5053	else
   5054		jack_present =
   5055			spec->vnode_lswitch[VNID_AMIC1_SEL - VNODE_START_NID];
   5056
   5057	if (jack_present)
   5058		spec->cur_mic_type = LINE_MIC_IN;
   5059	else
   5060		spec->cur_mic_type = DIGITAL_MIC;
   5061
   5062	if (spec->cur_mic_type == DIGITAL_MIC) {
   5063		/* enable digital Mic */
   5064		chipio_set_conn_rate(codec, MEM_CONNID_DMIC, SR_32_000);
   5065		ca0132_set_dmic(codec, 1);
   5066		ca0132_mic_boost_set(codec, 0);
   5067		/* set voice focus */
   5068		ca0132_effects_set(codec, VOICE_FOCUS,
   5069				   spec->effects_switch
   5070				   [VOICE_FOCUS - EFFECT_START_NID]);
   5071	} else {
   5072		/* disable digital Mic */
   5073		chipio_set_conn_rate(codec, MEM_CONNID_DMIC, SR_96_000);
   5074		ca0132_set_dmic(codec, 0);
   5075		ca0132_mic_boost_set(codec, spec->cur_mic_boost);
   5076		/* disable voice focus */
   5077		ca0132_effects_set(codec, VOICE_FOCUS, 0);
   5078	}
   5079
   5080	snd_hda_power_down_pm(codec);
   5081
   5082	return 0;
   5083}
   5084
   5085/*
   5086 * Select the active input.
   5087 * Mic detection isn't used, because it's kind of pointless on the SBZ.
   5088 * The front mic has no jack-detection, so the only way to switch to it
   5089 * is to do it manually in alsamixer.
   5090 */
   5091static int ca0132_alt_select_in(struct hda_codec *codec)
   5092{
   5093	struct ca0132_spec *spec = codec->spec;
   5094	unsigned int tmp;
   5095
   5096	codec_dbg(codec, "%s\n", __func__);
   5097
   5098	snd_hda_power_up_pm(codec);
   5099
   5100	chipio_set_stream_control(codec, 0x03, 0);
   5101	chipio_set_stream_control(codec, 0x04, 0);
   5102
   5103	spec->cur_mic_type = spec->in_enum_val;
   5104
   5105	switch (spec->cur_mic_type) {
   5106	case REAR_MIC:
   5107		switch (ca0132_quirk(spec)) {
   5108		case QUIRK_SBZ:
   5109		case QUIRK_R3D:
   5110			ca0113_mmio_gpio_set(codec, 0, false);
   5111			tmp = FLOAT_THREE;
   5112			break;
   5113		case QUIRK_ZXR:
   5114			tmp = FLOAT_THREE;
   5115			break;
   5116		case QUIRK_R3DI:
   5117			r3di_gpio_mic_set(codec, R3DI_REAR_MIC);
   5118			tmp = FLOAT_ONE;
   5119			break;
   5120		case QUIRK_AE5:
   5121			ca0113_mmio_command_set(codec, 0x30, 0x28, 0x00);
   5122			tmp = FLOAT_THREE;
   5123			break;
   5124		case QUIRK_AE7:
   5125			ca0113_mmio_command_set(codec, 0x30, 0x28, 0x00);
   5126			tmp = FLOAT_THREE;
   5127			chipio_set_conn_rate(codec, MEM_CONNID_MICIN2,
   5128					SR_96_000);
   5129			chipio_set_conn_rate(codec, MEM_CONNID_MICOUT2,
   5130					SR_96_000);
   5131			dspio_set_uint_param(codec, 0x80, 0x01, FLOAT_ZERO);
   5132			break;
   5133		default:
   5134			tmp = FLOAT_ONE;
   5135			break;
   5136		}
   5137
   5138		chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_96_000);
   5139		chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_96_000);
   5140		if (ca0132_quirk(spec) == QUIRK_R3DI)
   5141			chipio_set_conn_rate(codec, 0x0F, SR_96_000);
   5142
   5143		dspio_set_uint_param(codec, 0x80, 0x00, tmp);
   5144
   5145		chipio_set_stream_control(codec, 0x03, 1);
   5146		chipio_set_stream_control(codec, 0x04, 1);
   5147		switch (ca0132_quirk(spec)) {
   5148		case QUIRK_SBZ:
   5149			chipio_write(codec, 0x18B098, 0x0000000C);
   5150			chipio_write(codec, 0x18B09C, 0x0000000C);
   5151			break;
   5152		case QUIRK_ZXR:
   5153			chipio_write(codec, 0x18B098, 0x0000000C);
   5154			chipio_write(codec, 0x18B09C, 0x000000CC);
   5155			break;
   5156		case QUIRK_AE5:
   5157			chipio_write(codec, 0x18B098, 0x0000000C);
   5158			chipio_write(codec, 0x18B09C, 0x0000004C);
   5159			break;
   5160		default:
   5161			break;
   5162		}
   5163		ca0132_alt_mic_boost_set(codec, spec->mic_boost_enum_val);
   5164		break;
   5165	case REAR_LINE_IN:
   5166		ca0132_mic_boost_set(codec, 0);
   5167		switch (ca0132_quirk(spec)) {
   5168		case QUIRK_SBZ:
   5169		case QUIRK_R3D:
   5170			ca0113_mmio_gpio_set(codec, 0, false);
   5171			break;
   5172		case QUIRK_R3DI:
   5173			r3di_gpio_mic_set(codec, R3DI_REAR_MIC);
   5174			break;
   5175		case QUIRK_AE5:
   5176			ca0113_mmio_command_set(codec, 0x30, 0x28, 0x00);
   5177			break;
   5178		case QUIRK_AE7:
   5179			ca0113_mmio_command_set(codec, 0x30, 0x28, 0x3f);
   5180			chipio_set_conn_rate(codec, MEM_CONNID_MICIN2,
   5181					SR_96_000);
   5182			chipio_set_conn_rate(codec, MEM_CONNID_MICOUT2,
   5183					SR_96_000);
   5184			dspio_set_uint_param(codec, 0x80, 0x01, FLOAT_ZERO);
   5185			break;
   5186		default:
   5187			break;
   5188		}
   5189
   5190		chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_96_000);
   5191		chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_96_000);
   5192		if (ca0132_quirk(spec) == QUIRK_R3DI)
   5193			chipio_set_conn_rate(codec, 0x0F, SR_96_000);
   5194
   5195		if (ca0132_quirk(spec) == QUIRK_AE7)
   5196			tmp = FLOAT_THREE;
   5197		else
   5198			tmp = FLOAT_ZERO;
   5199		dspio_set_uint_param(codec, 0x80, 0x00, tmp);
   5200
   5201		switch (ca0132_quirk(spec)) {
   5202		case QUIRK_SBZ:
   5203		case QUIRK_AE5:
   5204			chipio_write(codec, 0x18B098, 0x00000000);
   5205			chipio_write(codec, 0x18B09C, 0x00000000);
   5206			break;
   5207		default:
   5208			break;
   5209		}
   5210		chipio_set_stream_control(codec, 0x03, 1);
   5211		chipio_set_stream_control(codec, 0x04, 1);
   5212		break;
   5213	case FRONT_MIC:
   5214		switch (ca0132_quirk(spec)) {
   5215		case QUIRK_SBZ:
   5216		case QUIRK_R3D:
   5217			ca0113_mmio_gpio_set(codec, 0, true);
   5218			ca0113_mmio_gpio_set(codec, 5, false);
   5219			tmp = FLOAT_THREE;
   5220			break;
   5221		case QUIRK_R3DI:
   5222			r3di_gpio_mic_set(codec, R3DI_FRONT_MIC);
   5223			tmp = FLOAT_ONE;
   5224			break;
   5225		case QUIRK_AE5:
   5226			ca0113_mmio_command_set(codec, 0x30, 0x28, 0x3f);
   5227			tmp = FLOAT_THREE;
   5228			break;
   5229		default:
   5230			tmp = FLOAT_ONE;
   5231			break;
   5232		}
   5233
   5234		chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_96_000);
   5235		chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_96_000);
   5236		if (ca0132_quirk(spec) == QUIRK_R3DI)
   5237			chipio_set_conn_rate(codec, 0x0F, SR_96_000);
   5238
   5239		dspio_set_uint_param(codec, 0x80, 0x00, tmp);
   5240
   5241		chipio_set_stream_control(codec, 0x03, 1);
   5242		chipio_set_stream_control(codec, 0x04, 1);
   5243
   5244		switch (ca0132_quirk(spec)) {
   5245		case QUIRK_SBZ:
   5246			chipio_write(codec, 0x18B098, 0x0000000C);
   5247			chipio_write(codec, 0x18B09C, 0x000000CC);
   5248			break;
   5249		case QUIRK_AE5:
   5250			chipio_write(codec, 0x18B098, 0x0000000C);
   5251			chipio_write(codec, 0x18B09C, 0x0000004C);
   5252			break;
   5253		default:
   5254			break;
   5255		}
   5256		ca0132_alt_mic_boost_set(codec, spec->mic_boost_enum_val);
   5257		break;
   5258	}
   5259	ca0132_cvoice_switch_set(codec);
   5260
   5261	snd_hda_power_down_pm(codec);
   5262	return 0;
   5263}
   5264
   5265/*
   5266 * Check if VNODE settings take effect immediately.
   5267 */
   5268static bool ca0132_is_vnode_effective(struct hda_codec *codec,
   5269				     hda_nid_t vnid,
   5270				     hda_nid_t *shared_nid)
   5271{
   5272	struct ca0132_spec *spec = codec->spec;
   5273	hda_nid_t nid;
   5274
   5275	switch (vnid) {
   5276	case VNID_SPK:
   5277		nid = spec->shared_out_nid;
   5278		break;
   5279	case VNID_MIC:
   5280		nid = spec->shared_mic_nid;
   5281		break;
   5282	default:
   5283		return false;
   5284	}
   5285
   5286	if (shared_nid)
   5287		*shared_nid = nid;
   5288
   5289	return true;
   5290}
   5291
   5292/*
   5293* The following functions are control change helpers.
   5294* They return 0 if no changed.  Return 1 if changed.
   5295*/
   5296static int ca0132_voicefx_set(struct hda_codec *codec, int enable)
   5297{
   5298	struct ca0132_spec *spec = codec->spec;
   5299	unsigned int tmp;
   5300
   5301	/* based on CrystalVoice state to enable VoiceFX. */
   5302	if (enable) {
   5303		tmp = spec->effects_switch[CRYSTAL_VOICE - EFFECT_START_NID] ?
   5304			FLOAT_ONE : FLOAT_ZERO;
   5305	} else {
   5306		tmp = FLOAT_ZERO;
   5307	}
   5308
   5309	dspio_set_uint_param(codec, ca0132_voicefx.mid,
   5310			     ca0132_voicefx.reqs[0], tmp);
   5311
   5312	return 1;
   5313}
   5314
   5315/*
   5316 * Set the effects parameters
   5317 */
   5318static int ca0132_effects_set(struct hda_codec *codec, hda_nid_t nid, long val)
   5319{
   5320	struct ca0132_spec *spec = codec->spec;
   5321	unsigned int on, tmp, channel_cfg;
   5322	int num_fx = OUT_EFFECTS_COUNT + IN_EFFECTS_COUNT;
   5323	int err = 0;
   5324	int idx = nid - EFFECT_START_NID;
   5325
   5326	if ((idx < 0) || (idx >= num_fx))
   5327		return 0; /* no changed */
   5328
   5329	/* for out effect, qualify with PE */
   5330	if ((nid >= OUT_EFFECT_START_NID) && (nid < OUT_EFFECT_END_NID)) {
   5331		/* if PE if off, turn off out effects. */
   5332		if (!spec->effects_switch[PLAY_ENHANCEMENT - EFFECT_START_NID])
   5333			val = 0;
   5334		if (spec->cur_out_type == SPEAKER_OUT && nid == X_BASS) {
   5335			channel_cfg = spec->channel_cfg_val;
   5336			if (channel_cfg != SPEAKER_CHANNELS_2_0 &&
   5337					channel_cfg != SPEAKER_CHANNELS_4_0)
   5338				val = 0;
   5339		}
   5340	}
   5341
   5342	/* for in effect, qualify with CrystalVoice */
   5343	if ((nid >= IN_EFFECT_START_NID) && (nid < IN_EFFECT_END_NID)) {
   5344		/* if CrystalVoice if off, turn off in effects. */
   5345		if (!spec->effects_switch[CRYSTAL_VOICE - EFFECT_START_NID])
   5346			val = 0;
   5347
   5348		/* Voice Focus applies to 2-ch Mic, Digital Mic */
   5349		if ((nid == VOICE_FOCUS) && (spec->cur_mic_type != DIGITAL_MIC))
   5350			val = 0;
   5351
   5352		/* If Voice Focus on SBZ, set to two channel. */
   5353		if ((nid == VOICE_FOCUS) && ca0132_use_pci_mmio(spec)
   5354				&& (spec->cur_mic_type != REAR_LINE_IN)) {
   5355			if (spec->effects_switch[CRYSTAL_VOICE -
   5356						 EFFECT_START_NID]) {
   5357
   5358				if (spec->effects_switch[VOICE_FOCUS -
   5359							 EFFECT_START_NID]) {
   5360					tmp = FLOAT_TWO;
   5361					val = 1;
   5362				} else
   5363					tmp = FLOAT_ONE;
   5364
   5365				dspio_set_uint_param(codec, 0x80, 0x00, tmp);
   5366			}
   5367		}
   5368		/*
   5369		 * For SBZ noise reduction, there's an extra command
   5370		 * to module ID 0x47. No clue why.
   5371		 */
   5372		if ((nid == NOISE_REDUCTION) && ca0132_use_pci_mmio(spec)
   5373				&& (spec->cur_mic_type != REAR_LINE_IN)) {
   5374			if (spec->effects_switch[CRYSTAL_VOICE -
   5375						 EFFECT_START_NID]) {
   5376				if (spec->effects_switch[NOISE_REDUCTION -
   5377							 EFFECT_START_NID])
   5378					tmp = FLOAT_ONE;
   5379				else
   5380					tmp = FLOAT_ZERO;
   5381			} else
   5382				tmp = FLOAT_ZERO;
   5383
   5384			dspio_set_uint_param(codec, 0x47, 0x00, tmp);
   5385		}
   5386
   5387		/* If rear line in disable effects. */
   5388		if (ca0132_use_alt_functions(spec) &&
   5389				spec->in_enum_val == REAR_LINE_IN)
   5390			val = 0;
   5391	}
   5392
   5393	codec_dbg(codec, "ca0132_effect_set: nid=0x%x, val=%ld\n",
   5394		    nid, val);
   5395
   5396	on = (val == 0) ? FLOAT_ZERO : FLOAT_ONE;
   5397	err = dspio_set_uint_param(codec, ca0132_effects[idx].mid,
   5398				   ca0132_effects[idx].reqs[0], on);
   5399
   5400	if (err < 0)
   5401		return 0; /* no changed */
   5402
   5403	return 1;
   5404}
   5405
   5406/*
   5407 * Turn on/off Playback Enhancements
   5408 */
   5409static int ca0132_pe_switch_set(struct hda_codec *codec)
   5410{
   5411	struct ca0132_spec *spec = codec->spec;
   5412	hda_nid_t nid;
   5413	int i, ret = 0;
   5414
   5415	codec_dbg(codec, "ca0132_pe_switch_set: val=%ld\n",
   5416		    spec->effects_switch[PLAY_ENHANCEMENT - EFFECT_START_NID]);
   5417
   5418	if (ca0132_use_alt_functions(spec))
   5419		ca0132_alt_select_out(codec);
   5420
   5421	i = OUT_EFFECT_START_NID - EFFECT_START_NID;
   5422	nid = OUT_EFFECT_START_NID;
   5423	/* PE affects all out effects */
   5424	for (; nid < OUT_EFFECT_END_NID; nid++, i++)
   5425		ret |= ca0132_effects_set(codec, nid, spec->effects_switch[i]);
   5426
   5427	return ret;
   5428}
   5429
   5430/* Check if Mic1 is streaming, if so, stop streaming */
   5431static int stop_mic1(struct hda_codec *codec)
   5432{
   5433	struct ca0132_spec *spec = codec->spec;
   5434	unsigned int oldval = snd_hda_codec_read(codec, spec->adcs[0], 0,
   5435						 AC_VERB_GET_CONV, 0);
   5436	if (oldval != 0)
   5437		snd_hda_codec_write(codec, spec->adcs[0], 0,
   5438				    AC_VERB_SET_CHANNEL_STREAMID,
   5439				    0);
   5440	return oldval;
   5441}
   5442
   5443/* Resume Mic1 streaming if it was stopped. */
   5444static void resume_mic1(struct hda_codec *codec, unsigned int oldval)
   5445{
   5446	struct ca0132_spec *spec = codec->spec;
   5447	/* Restore the previous stream and channel */
   5448	if (oldval != 0)
   5449		snd_hda_codec_write(codec, spec->adcs[0], 0,
   5450				    AC_VERB_SET_CHANNEL_STREAMID,
   5451				    oldval);
   5452}
   5453
   5454/*
   5455 * Turn on/off CrystalVoice
   5456 */
   5457static int ca0132_cvoice_switch_set(struct hda_codec *codec)
   5458{
   5459	struct ca0132_spec *spec = codec->spec;
   5460	hda_nid_t nid;
   5461	int i, ret = 0;
   5462	unsigned int oldval;
   5463
   5464	codec_dbg(codec, "ca0132_cvoice_switch_set: val=%ld\n",
   5465		    spec->effects_switch[CRYSTAL_VOICE - EFFECT_START_NID]);
   5466
   5467	i = IN_EFFECT_START_NID - EFFECT_START_NID;
   5468	nid = IN_EFFECT_START_NID;
   5469	/* CrystalVoice affects all in effects */
   5470	for (; nid < IN_EFFECT_END_NID; nid++, i++)
   5471		ret |= ca0132_effects_set(codec, nid, spec->effects_switch[i]);
   5472
   5473	/* including VoiceFX */
   5474	ret |= ca0132_voicefx_set(codec, (spec->voicefx_val ? 1 : 0));
   5475
   5476	/* set correct vipsource */
   5477	oldval = stop_mic1(codec);
   5478	if (ca0132_use_alt_functions(spec))
   5479		ret |= ca0132_alt_set_vipsource(codec, 1);
   5480	else
   5481		ret |= ca0132_set_vipsource(codec, 1);
   5482	resume_mic1(codec, oldval);
   5483	return ret;
   5484}
   5485
   5486static int ca0132_mic_boost_set(struct hda_codec *codec, long val)
   5487{
   5488	struct ca0132_spec *spec = codec->spec;
   5489	int ret = 0;
   5490
   5491	if (val) /* on */
   5492		ret = snd_hda_codec_amp_update(codec, spec->input_pins[0], 0,
   5493					HDA_INPUT, 0, HDA_AMP_VOLMASK, 3);
   5494	else /* off */
   5495		ret = snd_hda_codec_amp_update(codec, spec->input_pins[0], 0,
   5496					HDA_INPUT, 0, HDA_AMP_VOLMASK, 0);
   5497
   5498	return ret;
   5499}
   5500
   5501static int ca0132_alt_mic_boost_set(struct hda_codec *codec, long val)
   5502{
   5503	struct ca0132_spec *spec = codec->spec;
   5504	int ret = 0;
   5505
   5506	ret = snd_hda_codec_amp_update(codec, spec->input_pins[0], 0,
   5507				HDA_INPUT, 0, HDA_AMP_VOLMASK, val);
   5508	return ret;
   5509}
   5510
   5511static int ae5_headphone_gain_set(struct hda_codec *codec, long val)
   5512{
   5513	unsigned int i;
   5514
   5515	for (i = 0; i < 4; i++)
   5516		ca0113_mmio_command_set(codec, 0x48, 0x11 + i,
   5517				ae5_headphone_gain_presets[val].vals[i]);
   5518	return 0;
   5519}
   5520
   5521/*
   5522 * gpio pin 1 is a relay that switches on/off, apparently setting the headphone
   5523 * amplifier to handle a 600 ohm load.
   5524 */
   5525static int zxr_headphone_gain_set(struct hda_codec *codec, long val)
   5526{
   5527	ca0113_mmio_gpio_set(codec, 1, val);
   5528
   5529	return 0;
   5530}
   5531
   5532static int ca0132_vnode_switch_set(struct snd_kcontrol *kcontrol,
   5533				struct snd_ctl_elem_value *ucontrol)
   5534{
   5535	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
   5536	hda_nid_t nid = get_amp_nid(kcontrol);
   5537	hda_nid_t shared_nid = 0;
   5538	bool effective;
   5539	int ret = 0;
   5540	struct ca0132_spec *spec = codec->spec;
   5541	int auto_jack;
   5542
   5543	if (nid == VNID_HP_SEL) {
   5544		auto_jack =
   5545			spec->vnode_lswitch[VNID_HP_ASEL - VNODE_START_NID];
   5546		if (!auto_jack) {
   5547			if (ca0132_use_alt_functions(spec))
   5548				ca0132_alt_select_out(codec);
   5549			else
   5550				ca0132_select_out(codec);
   5551		}
   5552		return 1;
   5553	}
   5554
   5555	if (nid == VNID_AMIC1_SEL) {
   5556		auto_jack =
   5557			spec->vnode_lswitch[VNID_AMIC1_ASEL - VNODE_START_NID];
   5558		if (!auto_jack)
   5559			ca0132_select_mic(codec);
   5560		return 1;
   5561	}
   5562
   5563	if (nid == VNID_HP_ASEL) {
   5564		if (ca0132_use_alt_functions(spec))
   5565			ca0132_alt_select_out(codec);
   5566		else
   5567			ca0132_select_out(codec);
   5568		return 1;
   5569	}
   5570
   5571	if (nid == VNID_AMIC1_ASEL) {
   5572		ca0132_select_mic(codec);
   5573		return 1;
   5574	}
   5575
   5576	/* if effective conditions, then update hw immediately. */
   5577	effective = ca0132_is_vnode_effective(codec, nid, &shared_nid);
   5578	if (effective) {
   5579		int dir = get_amp_direction(kcontrol);
   5580		int ch = get_amp_channels(kcontrol);
   5581		unsigned long pval;
   5582
   5583		mutex_lock(&codec->control_mutex);
   5584		pval = kcontrol->private_value;
   5585		kcontrol->private_value = HDA_COMPOSE_AMP_VAL(shared_nid, ch,
   5586								0, dir);
   5587		ret = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
   5588		kcontrol->private_value = pval;
   5589		mutex_unlock(&codec->control_mutex);
   5590	}
   5591
   5592	return ret;
   5593}
   5594/* End of control change helpers. */
   5595
   5596static void ca0132_alt_bass_redirection_xover_set(struct hda_codec *codec,
   5597		long idx)
   5598{
   5599	snd_hda_power_up(codec);
   5600
   5601	dspio_set_param(codec, 0x96, 0x20, SPEAKER_BASS_REDIRECT_XOVER_FREQ,
   5602			&(float_xbass_xover_lookup[idx]), sizeof(unsigned int));
   5603
   5604	snd_hda_power_down(codec);
   5605}
   5606
   5607/*
   5608 * Below I've added controls to mess with the effect levels, I've only enabled
   5609 * them on the Sound Blaster Z, but they would probably also work on the
   5610 * Chromebook. I figured they were probably tuned specifically for it, and left
   5611 * out for a reason.
   5612 */
   5613
   5614/* Sets DSP effect level from the sliders above the controls */
   5615
   5616static int ca0132_alt_slider_ctl_set(struct hda_codec *codec, hda_nid_t nid,
   5617			  const unsigned int *lookup, int idx)
   5618{
   5619	int i = 0;
   5620	unsigned int y;
   5621	/*
   5622	 * For X_BASS, req 2 is actually crossover freq instead of
   5623	 * effect level
   5624	 */
   5625	if (nid == X_BASS)
   5626		y = 2;
   5627	else
   5628		y = 1;
   5629
   5630	snd_hda_power_up(codec);
   5631	if (nid == XBASS_XOVER) {
   5632		for (i = 0; i < OUT_EFFECTS_COUNT; i++)
   5633			if (ca0132_effects[i].nid == X_BASS)
   5634				break;
   5635
   5636		dspio_set_param(codec, ca0132_effects[i].mid, 0x20,
   5637				ca0132_effects[i].reqs[1],
   5638				&(lookup[idx - 1]), sizeof(unsigned int));
   5639	} else {
   5640		/* Find the actual effect structure */
   5641		for (i = 0; i < OUT_EFFECTS_COUNT; i++)
   5642			if (nid == ca0132_effects[i].nid)
   5643				break;
   5644
   5645		dspio_set_param(codec, ca0132_effects[i].mid, 0x20,
   5646				ca0132_effects[i].reqs[y],
   5647				&(lookup[idx]), sizeof(unsigned int));
   5648	}
   5649
   5650	snd_hda_power_down(codec);
   5651
   5652	return 0;
   5653}
   5654
   5655static int ca0132_alt_xbass_xover_slider_ctl_get(struct snd_kcontrol *kcontrol,
   5656			  struct snd_ctl_elem_value *ucontrol)
   5657{
   5658	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
   5659	struct ca0132_spec *spec = codec->spec;
   5660	long *valp = ucontrol->value.integer.value;
   5661	hda_nid_t nid = get_amp_nid(kcontrol);
   5662
   5663	if (nid == BASS_REDIRECTION_XOVER)
   5664		*valp = spec->bass_redirect_xover_freq;
   5665	else
   5666		*valp = spec->xbass_xover_freq;
   5667
   5668	return 0;
   5669}
   5670
   5671static int ca0132_alt_slider_ctl_get(struct snd_kcontrol *kcontrol,
   5672			  struct snd_ctl_elem_value *ucontrol)
   5673{
   5674	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
   5675	struct ca0132_spec *spec = codec->spec;
   5676	hda_nid_t nid = get_amp_nid(kcontrol);
   5677	long *valp = ucontrol->value.integer.value;
   5678	int idx = nid - OUT_EFFECT_START_NID;
   5679
   5680	*valp = spec->fx_ctl_val[idx];
   5681	return 0;
   5682}
   5683
   5684/*
   5685 * The X-bass crossover starts at 10hz, so the min is 1. The
   5686 * frequency is set in multiples of 10.
   5687 */
   5688static int ca0132_alt_xbass_xover_slider_info(struct snd_kcontrol *kcontrol,
   5689		struct snd_ctl_elem_info *uinfo)
   5690{
   5691	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
   5692	uinfo->count = 1;
   5693	uinfo->value.integer.min = 1;
   5694	uinfo->value.integer.max = 100;
   5695	uinfo->value.integer.step = 1;
   5696
   5697	return 0;
   5698}
   5699
   5700static int ca0132_alt_effect_slider_info(struct snd_kcontrol *kcontrol,
   5701		struct snd_ctl_elem_info *uinfo)
   5702{
   5703	int chs = get_amp_channels(kcontrol);
   5704
   5705	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
   5706	uinfo->count = chs == 3 ? 2 : 1;
   5707	uinfo->value.integer.min = 0;
   5708	uinfo->value.integer.max = 100;
   5709	uinfo->value.integer.step = 1;
   5710
   5711	return 0;
   5712}
   5713
   5714static int ca0132_alt_xbass_xover_slider_put(struct snd_kcontrol *kcontrol,
   5715				struct snd_ctl_elem_value *ucontrol)
   5716{
   5717	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
   5718	struct ca0132_spec *spec = codec->spec;
   5719	hda_nid_t nid = get_amp_nid(kcontrol);
   5720	long *valp = ucontrol->value.integer.value;
   5721	long *cur_val;
   5722	int idx;
   5723
   5724	if (nid == BASS_REDIRECTION_XOVER)
   5725		cur_val = &spec->bass_redirect_xover_freq;
   5726	else
   5727		cur_val = &spec->xbass_xover_freq;
   5728
   5729	/* any change? */
   5730	if (*cur_val == *valp)
   5731		return 0;
   5732
   5733	*cur_val = *valp;
   5734
   5735	idx = *valp;
   5736	if (nid == BASS_REDIRECTION_XOVER)
   5737		ca0132_alt_bass_redirection_xover_set(codec, *cur_val);
   5738	else
   5739		ca0132_alt_slider_ctl_set(codec, nid, float_xbass_xover_lookup, idx);
   5740
   5741	return 0;
   5742}
   5743
   5744static int ca0132_alt_effect_slider_put(struct snd_kcontrol *kcontrol,
   5745				struct snd_ctl_elem_value *ucontrol)
   5746{
   5747	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
   5748	struct ca0132_spec *spec = codec->spec;
   5749	hda_nid_t nid = get_amp_nid(kcontrol);
   5750	long *valp = ucontrol->value.integer.value;
   5751	int idx;
   5752
   5753	idx = nid - EFFECT_START_NID;
   5754	/* any change? */
   5755	if (spec->fx_ctl_val[idx] == *valp)
   5756		return 0;
   5757
   5758	spec->fx_ctl_val[idx] = *valp;
   5759
   5760	idx = *valp;
   5761	ca0132_alt_slider_ctl_set(codec, nid, float_zero_to_one_lookup, idx);
   5762
   5763	return 0;
   5764}
   5765
   5766
   5767/*
   5768 * Mic Boost Enum for alternative ca0132 codecs. I didn't like that the original
   5769 * only has off or full 30 dB, and didn't like making a volume slider that has
   5770 * traditional 0-100 in alsamixer that goes in big steps. I like enum better.
   5771 */
   5772#define MIC_BOOST_NUM_OF_STEPS 4
   5773#define MIC_BOOST_ENUM_MAX_STRLEN 10
   5774
   5775static int ca0132_alt_mic_boost_info(struct snd_kcontrol *kcontrol,
   5776				 struct snd_ctl_elem_info *uinfo)
   5777{
   5778	char *sfx = "dB";
   5779	char namestr[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
   5780
   5781	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
   5782	uinfo->count = 1;
   5783	uinfo->value.enumerated.items = MIC_BOOST_NUM_OF_STEPS;
   5784	if (uinfo->value.enumerated.item >= MIC_BOOST_NUM_OF_STEPS)
   5785		uinfo->value.enumerated.item = MIC_BOOST_NUM_OF_STEPS - 1;
   5786	sprintf(namestr, "%d %s", (uinfo->value.enumerated.item * 10), sfx);
   5787	strcpy(uinfo->value.enumerated.name, namestr);
   5788	return 0;
   5789}
   5790
   5791static int ca0132_alt_mic_boost_get(struct snd_kcontrol *kcontrol,
   5792				struct snd_ctl_elem_value *ucontrol)
   5793{
   5794	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
   5795	struct ca0132_spec *spec = codec->spec;
   5796
   5797	ucontrol->value.enumerated.item[0] = spec->mic_boost_enum_val;
   5798	return 0;
   5799}
   5800
   5801static int ca0132_alt_mic_boost_put(struct snd_kcontrol *kcontrol,
   5802				struct snd_ctl_elem_value *ucontrol)
   5803{
   5804	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
   5805	struct ca0132_spec *spec = codec->spec;
   5806	int sel = ucontrol->value.enumerated.item[0];
   5807	unsigned int items = MIC_BOOST_NUM_OF_STEPS;
   5808
   5809	if (sel >= items)
   5810		return 0;
   5811
   5812	codec_dbg(codec, "ca0132_alt_mic_boost: boost=%d\n",
   5813		    sel);
   5814
   5815	spec->mic_boost_enum_val = sel;
   5816
   5817	if (spec->in_enum_val != REAR_LINE_IN)
   5818		ca0132_alt_mic_boost_set(codec, spec->mic_boost_enum_val);
   5819
   5820	return 1;
   5821}
   5822
   5823/*
   5824 * Sound BlasterX AE-5 Headphone Gain Controls.
   5825 */
   5826#define AE5_HEADPHONE_GAIN_MAX 3
   5827static int ae5_headphone_gain_info(struct snd_kcontrol *kcontrol,
   5828				 struct snd_ctl_elem_info *uinfo)
   5829{
   5830	char *sfx = " Ohms)";
   5831	char namestr[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
   5832
   5833	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
   5834	uinfo->count = 1;
   5835	uinfo->value.enumerated.items = AE5_HEADPHONE_GAIN_MAX;
   5836	if (uinfo->value.enumerated.item >= AE5_HEADPHONE_GAIN_MAX)
   5837		uinfo->value.enumerated.item = AE5_HEADPHONE_GAIN_MAX - 1;
   5838	sprintf(namestr, "%s %s",
   5839		ae5_headphone_gain_presets[uinfo->value.enumerated.item].name,
   5840		sfx);
   5841	strcpy(uinfo->value.enumerated.name, namestr);
   5842	return 0;
   5843}
   5844
   5845static int ae5_headphone_gain_get(struct snd_kcontrol *kcontrol,
   5846				struct snd_ctl_elem_value *ucontrol)
   5847{
   5848	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
   5849	struct ca0132_spec *spec = codec->spec;
   5850
   5851	ucontrol->value.enumerated.item[0] = spec->ae5_headphone_gain_val;
   5852	return 0;
   5853}
   5854
   5855static int ae5_headphone_gain_put(struct snd_kcontrol *kcontrol,
   5856				struct snd_ctl_elem_value *ucontrol)
   5857{
   5858	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
   5859	struct ca0132_spec *spec = codec->spec;
   5860	int sel = ucontrol->value.enumerated.item[0];
   5861	unsigned int items = AE5_HEADPHONE_GAIN_MAX;
   5862
   5863	if (sel >= items)
   5864		return 0;
   5865
   5866	codec_dbg(codec, "ae5_headphone_gain: boost=%d\n",
   5867		    sel);
   5868
   5869	spec->ae5_headphone_gain_val = sel;
   5870
   5871	if (spec->out_enum_val == HEADPHONE_OUT)
   5872		ae5_headphone_gain_set(codec, spec->ae5_headphone_gain_val);
   5873
   5874	return 1;
   5875}
   5876
   5877/*
   5878 * Sound BlasterX AE-5 sound filter enumerated control.
   5879 */
   5880#define AE5_SOUND_FILTER_MAX 3
   5881
   5882static int ae5_sound_filter_info(struct snd_kcontrol *kcontrol,
   5883				 struct snd_ctl_elem_info *uinfo)
   5884{
   5885	char namestr[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
   5886
   5887	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
   5888	uinfo->count = 1;
   5889	uinfo->value.enumerated.items = AE5_SOUND_FILTER_MAX;
   5890	if (uinfo->value.enumerated.item >= AE5_SOUND_FILTER_MAX)
   5891		uinfo->value.enumerated.item = AE5_SOUND_FILTER_MAX - 1;
   5892	sprintf(namestr, "%s",
   5893			ae5_filter_presets[uinfo->value.enumerated.item].name);
   5894	strcpy(uinfo->value.enumerated.name, namestr);
   5895	return 0;
   5896}
   5897
   5898static int ae5_sound_filter_get(struct snd_kcontrol *kcontrol,
   5899				struct snd_ctl_elem_value *ucontrol)
   5900{
   5901	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
   5902	struct ca0132_spec *spec = codec->spec;
   5903
   5904	ucontrol->value.enumerated.item[0] = spec->ae5_filter_val;
   5905	return 0;
   5906}
   5907
   5908static int ae5_sound_filter_put(struct snd_kcontrol *kcontrol,
   5909				struct snd_ctl_elem_value *ucontrol)
   5910{
   5911	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
   5912	struct ca0132_spec *spec = codec->spec;
   5913	int sel = ucontrol->value.enumerated.item[0];
   5914	unsigned int items = AE5_SOUND_FILTER_MAX;
   5915
   5916	if (sel >= items)
   5917		return 0;
   5918
   5919	codec_dbg(codec, "ae5_sound_filter: %s\n",
   5920			ae5_filter_presets[sel].name);
   5921
   5922	spec->ae5_filter_val = sel;
   5923
   5924	ca0113_mmio_command_set_type2(codec, 0x48, 0x07,
   5925			ae5_filter_presets[sel].val);
   5926
   5927	return 1;
   5928}
   5929
   5930/*
   5931 * Input Select Control for alternative ca0132 codecs. This exists because
   5932 * front microphone has no auto-detect, and we need a way to set the rear
   5933 * as line-in
   5934 */
   5935static int ca0132_alt_input_source_info(struct snd_kcontrol *kcontrol,
   5936				 struct snd_ctl_elem_info *uinfo)
   5937{
   5938	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
   5939	uinfo->count = 1;
   5940	uinfo->value.enumerated.items = IN_SRC_NUM_OF_INPUTS;
   5941	if (uinfo->value.enumerated.item >= IN_SRC_NUM_OF_INPUTS)
   5942		uinfo->value.enumerated.item = IN_SRC_NUM_OF_INPUTS - 1;
   5943	strcpy(uinfo->value.enumerated.name,
   5944			in_src_str[uinfo->value.enumerated.item]);
   5945	return 0;
   5946}
   5947
   5948static int ca0132_alt_input_source_get(struct snd_kcontrol *kcontrol,
   5949				struct snd_ctl_elem_value *ucontrol)
   5950{
   5951	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
   5952	struct ca0132_spec *spec = codec->spec;
   5953
   5954	ucontrol->value.enumerated.item[0] = spec->in_enum_val;
   5955	return 0;
   5956}
   5957
   5958static int ca0132_alt_input_source_put(struct snd_kcontrol *kcontrol,
   5959				struct snd_ctl_elem_value *ucontrol)
   5960{
   5961	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
   5962	struct ca0132_spec *spec = codec->spec;
   5963	int sel = ucontrol->value.enumerated.item[0];
   5964	unsigned int items = IN_SRC_NUM_OF_INPUTS;
   5965
   5966	/*
   5967	 * The AE-7 has no front microphone, so limit items to 2: rear mic and
   5968	 * line-in.
   5969	 */
   5970	if (ca0132_quirk(spec) == QUIRK_AE7)
   5971		items = 2;
   5972
   5973	if (sel >= items)
   5974		return 0;
   5975
   5976	codec_dbg(codec, "ca0132_alt_input_select: sel=%d, preset=%s\n",
   5977		    sel, in_src_str[sel]);
   5978
   5979	spec->in_enum_val = sel;
   5980
   5981	ca0132_alt_select_in(codec);
   5982
   5983	return 1;
   5984}
   5985
   5986/* Sound Blaster Z Output Select Control */
   5987static int ca0132_alt_output_select_get_info(struct snd_kcontrol *kcontrol,
   5988				 struct snd_ctl_elem_info *uinfo)
   5989{
   5990	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
   5991	uinfo->count = 1;
   5992	uinfo->value.enumerated.items = NUM_OF_OUTPUTS;
   5993	if (uinfo->value.enumerated.item >= NUM_OF_OUTPUTS)
   5994		uinfo->value.enumerated.item = NUM_OF_OUTPUTS - 1;
   5995	strcpy(uinfo->value.enumerated.name,
   5996			out_type_str[uinfo->value.enumerated.item]);
   5997	return 0;
   5998}
   5999
   6000static int ca0132_alt_output_select_get(struct snd_kcontrol *kcontrol,
   6001				struct snd_ctl_elem_value *ucontrol)
   6002{
   6003	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
   6004	struct ca0132_spec *spec = codec->spec;
   6005
   6006	ucontrol->value.enumerated.item[0] = spec->out_enum_val;
   6007	return 0;
   6008}
   6009
   6010static int ca0132_alt_output_select_put(struct snd_kcontrol *kcontrol,
   6011				struct snd_ctl_elem_value *ucontrol)
   6012{
   6013	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
   6014	struct ca0132_spec *spec = codec->spec;
   6015	int sel = ucontrol->value.enumerated.item[0];
   6016	unsigned int items = NUM_OF_OUTPUTS;
   6017	unsigned int auto_jack;
   6018
   6019	if (sel >= items)
   6020		return 0;
   6021
   6022	codec_dbg(codec, "ca0132_alt_output_select: sel=%d, preset=%s\n",
   6023		    sel, out_type_str[sel]);
   6024
   6025	spec->out_enum_val = sel;
   6026
   6027	auto_jack = spec->vnode_lswitch[VNID_HP_ASEL - VNODE_START_NID];
   6028
   6029	if (!auto_jack)
   6030		ca0132_alt_select_out(codec);
   6031
   6032	return 1;
   6033}
   6034
   6035/* Select surround output type: 2.1, 4.0, 4.1, or 5.1. */
   6036static int ca0132_alt_speaker_channel_cfg_get_info(struct snd_kcontrol *kcontrol,
   6037				 struct snd_ctl_elem_info *uinfo)
   6038{
   6039	unsigned int items = SPEAKER_CHANNEL_CFG_COUNT;
   6040
   6041	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
   6042	uinfo->count = 1;
   6043	uinfo->value.enumerated.items = items;
   6044	if (uinfo->value.enumerated.item >= items)
   6045		uinfo->value.enumerated.item = items - 1;
   6046	strcpy(uinfo->value.enumerated.name,
   6047			speaker_channel_cfgs[uinfo->value.enumerated.item].name);
   6048	return 0;
   6049}
   6050
   6051static int ca0132_alt_speaker_channel_cfg_get(struct snd_kcontrol *kcontrol,
   6052				struct snd_ctl_elem_value *ucontrol)
   6053{
   6054	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
   6055	struct ca0132_spec *spec = codec->spec;
   6056
   6057	ucontrol->value.enumerated.item[0] = spec->channel_cfg_val;
   6058	return 0;
   6059}
   6060
   6061static int ca0132_alt_speaker_channel_cfg_put(struct snd_kcontrol *kcontrol,
   6062				struct snd_ctl_elem_value *ucontrol)
   6063{
   6064	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
   6065	struct ca0132_spec *spec = codec->spec;
   6066	int sel = ucontrol->value.enumerated.item[0];
   6067	unsigned int items = SPEAKER_CHANNEL_CFG_COUNT;
   6068
   6069	if (sel >= items)
   6070		return 0;
   6071
   6072	codec_dbg(codec, "ca0132_alt_speaker_channels: sel=%d, channels=%s\n",
   6073		    sel, speaker_channel_cfgs[sel].name);
   6074
   6075	spec->channel_cfg_val = sel;
   6076
   6077	if (spec->out_enum_val == SPEAKER_OUT)
   6078		ca0132_alt_select_out(codec);
   6079
   6080	return 1;
   6081}
   6082
   6083/*
   6084 * Smart Volume output setting control. Three different settings, Normal,
   6085 * which takes the value from the smart volume slider. The two others, loud
   6086 * and night, disregard the slider value and have uneditable values.
   6087 */
   6088#define NUM_OF_SVM_SETTINGS 3
   6089static const char *const out_svm_set_enum_str[3] = {"Normal", "Loud", "Night" };
   6090
   6091static int ca0132_alt_svm_setting_info(struct snd_kcontrol *kcontrol,
   6092				 struct snd_ctl_elem_info *uinfo)
   6093{
   6094	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
   6095	uinfo->count = 1;
   6096	uinfo->value.enumerated.items = NUM_OF_SVM_SETTINGS;
   6097	if (uinfo->value.enumerated.item >= NUM_OF_SVM_SETTINGS)
   6098		uinfo->value.enumerated.item = NUM_OF_SVM_SETTINGS - 1;
   6099	strcpy(uinfo->value.enumerated.name,
   6100			out_svm_set_enum_str[uinfo->value.enumerated.item]);
   6101	return 0;
   6102}
   6103
   6104static int ca0132_alt_svm_setting_get(struct snd_kcontrol *kcontrol,
   6105				struct snd_ctl_elem_value *ucontrol)
   6106{
   6107	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
   6108	struct ca0132_spec *spec = codec->spec;
   6109
   6110	ucontrol->value.enumerated.item[0] = spec->smart_volume_setting;
   6111	return 0;
   6112}
   6113
   6114static int ca0132_alt_svm_setting_put(struct snd_kcontrol *kcontrol,
   6115				struct snd_ctl_elem_value *ucontrol)
   6116{
   6117	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
   6118	struct ca0132_spec *spec = codec->spec;
   6119	int sel = ucontrol->value.enumerated.item[0];
   6120	unsigned int items = NUM_OF_SVM_SETTINGS;
   6121	unsigned int idx = SMART_VOLUME - EFFECT_START_NID;
   6122	unsigned int tmp;
   6123
   6124	if (sel >= items)
   6125		return 0;
   6126
   6127	codec_dbg(codec, "ca0132_alt_svm_setting: sel=%d, preset=%s\n",
   6128		    sel, out_svm_set_enum_str[sel]);
   6129
   6130	spec->smart_volume_setting = sel;
   6131
   6132	switch (sel) {
   6133	case 0:
   6134		tmp = FLOAT_ZERO;
   6135		break;
   6136	case 1:
   6137		tmp = FLOAT_ONE;
   6138		break;
   6139	case 2:
   6140		tmp = FLOAT_TWO;
   6141		break;
   6142	default:
   6143		tmp = FLOAT_ZERO;
   6144		break;
   6145	}
   6146	/* Req 2 is the Smart Volume Setting req. */
   6147	dspio_set_uint_param(codec, ca0132_effects[idx].mid,
   6148			ca0132_effects[idx].reqs[2], tmp);
   6149	return 1;
   6150}
   6151
   6152/* Sound Blaster Z EQ preset controls */
   6153static int ca0132_alt_eq_preset_info(struct snd_kcontrol *kcontrol,
   6154				 struct snd_ctl_elem_info *uinfo)
   6155{
   6156	unsigned int items = ARRAY_SIZE(ca0132_alt_eq_presets);
   6157
   6158	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
   6159	uinfo->count = 1;
   6160	uinfo->value.enumerated.items = items;
   6161	if (uinfo->value.enumerated.item >= items)
   6162		uinfo->value.enumerated.item = items - 1;
   6163	strcpy(uinfo->value.enumerated.name,
   6164		ca0132_alt_eq_presets[uinfo->value.enumerated.item].name);
   6165	return 0;
   6166}
   6167
   6168static int ca0132_alt_eq_preset_get(struct snd_kcontrol *kcontrol,
   6169				struct snd_ctl_elem_value *ucontrol)
   6170{
   6171	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
   6172	struct ca0132_spec *spec = codec->spec;
   6173
   6174	ucontrol->value.enumerated.item[0] = spec->eq_preset_val;
   6175	return 0;
   6176}
   6177
   6178static int ca0132_alt_eq_preset_put(struct snd_kcontrol *kcontrol,
   6179				struct snd_ctl_elem_value *ucontrol)
   6180{
   6181	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
   6182	struct ca0132_spec *spec = codec->spec;
   6183	int i, err = 0;
   6184	int sel = ucontrol->value.enumerated.item[0];
   6185	unsigned int items = ARRAY_SIZE(ca0132_alt_eq_presets);
   6186
   6187	if (sel >= items)
   6188		return 0;
   6189
   6190	codec_dbg(codec, "%s: sel=%d, preset=%s\n", __func__, sel,
   6191			ca0132_alt_eq_presets[sel].name);
   6192	/*
   6193	 * Idx 0 is default.
   6194	 * Default needs to qualify with CrystalVoice state.
   6195	 */
   6196	for (i = 0; i < EQ_PRESET_MAX_PARAM_COUNT; i++) {
   6197		err = dspio_set_uint_param(codec, ca0132_alt_eq_enum.mid,
   6198				ca0132_alt_eq_enum.reqs[i],
   6199				ca0132_alt_eq_presets[sel].vals[i]);
   6200		if (err < 0)
   6201			break;
   6202	}
   6203
   6204	if (err >= 0)
   6205		spec->eq_preset_val = sel;
   6206
   6207	return 1;
   6208}
   6209
   6210static int ca0132_voicefx_info(struct snd_kcontrol *kcontrol,
   6211				 struct snd_ctl_elem_info *uinfo)
   6212{
   6213	unsigned int items = ARRAY_SIZE(ca0132_voicefx_presets);
   6214
   6215	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
   6216	uinfo->count = 1;
   6217	uinfo->value.enumerated.items = items;
   6218	if (uinfo->value.enumerated.item >= items)
   6219		uinfo->value.enumerated.item = items - 1;
   6220	strcpy(uinfo->value.enumerated.name,
   6221	       ca0132_voicefx_presets[uinfo->value.enumerated.item].name);
   6222	return 0;
   6223}
   6224
   6225static int ca0132_voicefx_get(struct snd_kcontrol *kcontrol,
   6226				struct snd_ctl_elem_value *ucontrol)
   6227{
   6228	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
   6229	struct ca0132_spec *spec = codec->spec;
   6230
   6231	ucontrol->value.enumerated.item[0] = spec->voicefx_val;
   6232	return 0;
   6233}
   6234
   6235static int ca0132_voicefx_put(struct snd_kcontrol *kcontrol,
   6236				struct snd_ctl_elem_value *ucontrol)
   6237{
   6238	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
   6239	struct ca0132_spec *spec = codec->spec;
   6240	int i, err = 0;
   6241	int sel = ucontrol->value.enumerated.item[0];
   6242
   6243	if (sel >= ARRAY_SIZE(ca0132_voicefx_presets))
   6244		return 0;
   6245
   6246	codec_dbg(codec, "ca0132_voicefx_put: sel=%d, preset=%s\n",
   6247		    sel, ca0132_voicefx_presets[sel].name);
   6248
   6249	/*
   6250	 * Idx 0 is default.
   6251	 * Default needs to qualify with CrystalVoice state.
   6252	 */
   6253	for (i = 0; i < VOICEFX_MAX_PARAM_COUNT; i++) {
   6254		err = dspio_set_uint_param(codec, ca0132_voicefx.mid,
   6255				ca0132_voicefx.reqs[i],
   6256				ca0132_voicefx_presets[sel].vals[i]);
   6257		if (err < 0)
   6258			break;
   6259	}
   6260
   6261	if (err >= 0) {
   6262		spec->voicefx_val = sel;
   6263		/* enable voice fx */
   6264		ca0132_voicefx_set(codec, (sel ? 1 : 0));
   6265	}
   6266
   6267	return 1;
   6268}
   6269
   6270static int ca0132_switch_get(struct snd_kcontrol *kcontrol,
   6271				struct snd_ctl_elem_value *ucontrol)
   6272{
   6273	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
   6274	struct ca0132_spec *spec = codec->spec;
   6275	hda_nid_t nid = get_amp_nid(kcontrol);
   6276	int ch = get_amp_channels(kcontrol);
   6277	long *valp = ucontrol->value.integer.value;
   6278
   6279	/* vnode */
   6280	if ((nid >= VNODE_START_NID) && (nid < VNODE_END_NID)) {
   6281		if (ch & 1) {
   6282			*valp = spec->vnode_lswitch[nid - VNODE_START_NID];
   6283			valp++;
   6284		}
   6285		if (ch & 2) {
   6286			*valp = spec->vnode_rswitch[nid - VNODE_START_NID];
   6287			valp++;
   6288		}
   6289		return 0;
   6290	}
   6291
   6292	/* effects, include PE and CrystalVoice */
   6293	if ((nid >= EFFECT_START_NID) && (nid < EFFECT_END_NID)) {
   6294		*valp = spec->effects_switch[nid - EFFECT_START_NID];
   6295		return 0;
   6296	}
   6297
   6298	/* mic boost */
   6299	if (nid == spec->input_pins[0]) {
   6300		*valp = spec->cur_mic_boost;
   6301		return 0;
   6302	}
   6303
   6304	if (nid == ZXR_HEADPHONE_GAIN) {
   6305		*valp = spec->zxr_gain_set;
   6306		return 0;
   6307	}
   6308
   6309	if (nid == SPEAKER_FULL_RANGE_FRONT || nid == SPEAKER_FULL_RANGE_REAR) {
   6310		*valp = spec->speaker_range_val[nid - SPEAKER_FULL_RANGE_FRONT];
   6311		return 0;
   6312	}
   6313
   6314	if (nid == BASS_REDIRECTION) {
   6315		*valp = spec->bass_redirection_val;
   6316		return 0;
   6317	}
   6318
   6319	return 0;
   6320}
   6321
   6322static int ca0132_switch_put(struct snd_kcontrol *kcontrol,
   6323			     struct snd_ctl_elem_value *ucontrol)
   6324{
   6325	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
   6326	struct ca0132_spec *spec = codec->spec;
   6327	hda_nid_t nid = get_amp_nid(kcontrol);
   6328	int ch = get_amp_channels(kcontrol);
   6329	long *valp = ucontrol->value.integer.value;
   6330	int changed = 1;
   6331
   6332	codec_dbg(codec, "ca0132_switch_put: nid=0x%x, val=%ld\n",
   6333		    nid, *valp);
   6334
   6335	snd_hda_power_up(codec);
   6336	/* vnode */
   6337	if ((nid >= VNODE_START_NID) && (nid < VNODE_END_NID)) {
   6338		if (ch & 1) {
   6339			spec->vnode_lswitch[nid - VNODE_START_NID] = *valp;
   6340			valp++;
   6341		}
   6342		if (ch & 2) {
   6343			spec->vnode_rswitch[nid - VNODE_START_NID] = *valp;
   6344			valp++;
   6345		}
   6346		changed = ca0132_vnode_switch_set(kcontrol, ucontrol);
   6347		goto exit;
   6348	}
   6349
   6350	/* PE */
   6351	if (nid == PLAY_ENHANCEMENT) {
   6352		spec->effects_switch[nid - EFFECT_START_NID] = *valp;
   6353		changed = ca0132_pe_switch_set(codec);
   6354		goto exit;
   6355	}
   6356
   6357	/* CrystalVoice */
   6358	if (nid == CRYSTAL_VOICE) {
   6359		spec->effects_switch[nid - EFFECT_START_NID] = *valp;
   6360		changed = ca0132_cvoice_switch_set(codec);
   6361		goto exit;
   6362	}
   6363
   6364	/* out and in effects */
   6365	if (((nid >= OUT_EFFECT_START_NID) && (nid < OUT_EFFECT_END_NID)) ||
   6366	    ((nid >= IN_EFFECT_START_NID) && (nid < IN_EFFECT_END_NID))) {
   6367		spec->effects_switch[nid - EFFECT_START_NID] = *valp;
   6368		changed = ca0132_effects_set(codec, nid, *valp);
   6369		goto exit;
   6370	}
   6371
   6372	/* mic boost */
   6373	if (nid == spec->input_pins[0]) {
   6374		spec->cur_mic_boost = *valp;
   6375		if (ca0132_use_alt_functions(spec)) {
   6376			if (spec->in_enum_val != REAR_LINE_IN)
   6377				changed = ca0132_mic_boost_set(codec, *valp);
   6378		} else {
   6379			/* Mic boost does not apply to Digital Mic */
   6380			if (spec->cur_mic_type != DIGITAL_MIC)
   6381				changed = ca0132_mic_boost_set(codec, *valp);
   6382		}
   6383
   6384		goto exit;
   6385	}
   6386
   6387	if (nid == ZXR_HEADPHONE_GAIN) {
   6388		spec->zxr_gain_set = *valp;
   6389		if (spec->cur_out_type == HEADPHONE_OUT)
   6390			changed = zxr_headphone_gain_set(codec, *valp);
   6391		else
   6392			changed = 0;
   6393
   6394		goto exit;
   6395	}
   6396
   6397	if (nid == SPEAKER_FULL_RANGE_FRONT || nid == SPEAKER_FULL_RANGE_REAR) {
   6398		spec->speaker_range_val[nid - SPEAKER_FULL_RANGE_FRONT] = *valp;
   6399		if (spec->cur_out_type == SPEAKER_OUT)
   6400			ca0132_alt_set_full_range_speaker(codec);
   6401
   6402		changed = 0;
   6403	}
   6404
   6405	if (nid == BASS_REDIRECTION) {
   6406		spec->bass_redirection_val = *valp;
   6407		if (spec->cur_out_type == SPEAKER_OUT)
   6408			ca0132_alt_surround_set_bass_redirection(codec, *valp);
   6409
   6410		changed = 0;
   6411	}
   6412
   6413exit:
   6414	snd_hda_power_down(codec);
   6415	return changed;
   6416}
   6417
   6418/*
   6419 * Volume related
   6420 */
   6421/*
   6422 * Sets the internal DSP decibel level to match the DAC for output, and the
   6423 * ADC for input. Currently only the SBZ sets dsp capture volume level, and
   6424 * all alternative codecs set DSP playback volume.
   6425 */
   6426static void ca0132_alt_dsp_volume_put(struct hda_codec *codec, hda_nid_t nid)
   6427{
   6428	struct ca0132_spec *spec = codec->spec;
   6429	unsigned int dsp_dir;
   6430	unsigned int lookup_val;
   6431
   6432	if (nid == VNID_SPK)
   6433		dsp_dir = DSP_VOL_OUT;
   6434	else
   6435		dsp_dir = DSP_VOL_IN;
   6436
   6437	lookup_val = spec->vnode_lvol[nid - VNODE_START_NID];
   6438
   6439	dspio_set_uint_param(codec,
   6440		ca0132_alt_vol_ctls[dsp_dir].mid,
   6441		ca0132_alt_vol_ctls[dsp_dir].reqs[0],
   6442		float_vol_db_lookup[lookup_val]);
   6443
   6444	lookup_val = spec->vnode_rvol[nid - VNODE_START_NID];
   6445
   6446	dspio_set_uint_param(codec,
   6447		ca0132_alt_vol_ctls[dsp_dir].mid,
   6448		ca0132_alt_vol_ctls[dsp_dir].reqs[1],
   6449		float_vol_db_lookup[lookup_val]);
   6450
   6451	dspio_set_uint_param(codec,
   6452		ca0132_alt_vol_ctls[dsp_dir].mid,
   6453		ca0132_alt_vol_ctls[dsp_dir].reqs[2], FLOAT_ZERO);
   6454}
   6455
   6456static int ca0132_volume_info(struct snd_kcontrol *kcontrol,
   6457			      struct snd_ctl_elem_info *uinfo)
   6458{
   6459	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
   6460	struct ca0132_spec *spec = codec->spec;
   6461	hda_nid_t nid = get_amp_nid(kcontrol);
   6462	int ch = get_amp_channels(kcontrol);
   6463	int dir = get_amp_direction(kcontrol);
   6464	unsigned long pval;
   6465	int err;
   6466
   6467	switch (nid) {
   6468	case VNID_SPK:
   6469		/* follow shared_out info */
   6470		nid = spec->shared_out_nid;
   6471		mutex_lock(&codec->control_mutex);
   6472		pval = kcontrol->private_value;
   6473		kcontrol->private_value = HDA_COMPOSE_AMP_VAL(nid, ch, 0, dir);
   6474		err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
   6475		kcontrol->private_value = pval;
   6476		mutex_unlock(&codec->control_mutex);
   6477		break;
   6478	case VNID_MIC:
   6479		/* follow shared_mic info */
   6480		nid = spec->shared_mic_nid;
   6481		mutex_lock(&codec->control_mutex);
   6482		pval = kcontrol->private_value;
   6483		kcontrol->private_value = HDA_COMPOSE_AMP_VAL(nid, ch, 0, dir);
   6484		err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
   6485		kcontrol->private_value = pval;
   6486		mutex_unlock(&codec->control_mutex);
   6487		break;
   6488	default:
   6489		err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
   6490	}
   6491	return err;
   6492}
   6493
   6494static int ca0132_volume_get(struct snd_kcontrol *kcontrol,
   6495				struct snd_ctl_elem_value *ucontrol)
   6496{
   6497	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
   6498	struct ca0132_spec *spec = codec->spec;
   6499	hda_nid_t nid = get_amp_nid(kcontrol);
   6500	int ch = get_amp_channels(kcontrol);
   6501	long *valp = ucontrol->value.integer.value;
   6502
   6503	/* store the left and right volume */
   6504	if (ch & 1) {
   6505		*valp = spec->vnode_lvol[nid - VNODE_START_NID];
   6506		valp++;
   6507	}
   6508	if (ch & 2) {
   6509		*valp = spec->vnode_rvol[nid - VNODE_START_NID];
   6510		valp++;
   6511	}
   6512	return 0;
   6513}
   6514
   6515static int ca0132_volume_put(struct snd_kcontrol *kcontrol,
   6516				struct snd_ctl_elem_value *ucontrol)
   6517{
   6518	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
   6519	struct ca0132_spec *spec = codec->spec;
   6520	hda_nid_t nid = get_amp_nid(kcontrol);
   6521	int ch = get_amp_channels(kcontrol);
   6522	long *valp = ucontrol->value.integer.value;
   6523	hda_nid_t shared_nid = 0;
   6524	bool effective;
   6525	int changed = 1;
   6526
   6527	/* store the left and right volume */
   6528	if (ch & 1) {
   6529		spec->vnode_lvol[nid - VNODE_START_NID] = *valp;
   6530		valp++;
   6531	}
   6532	if (ch & 2) {
   6533		spec->vnode_rvol[nid - VNODE_START_NID] = *valp;
   6534		valp++;
   6535	}
   6536
   6537	/* if effective conditions, then update hw immediately. */
   6538	effective = ca0132_is_vnode_effective(codec, nid, &shared_nid);
   6539	if (effective) {
   6540		int dir = get_amp_direction(kcontrol);
   6541		unsigned long pval;
   6542
   6543		snd_hda_power_up(codec);
   6544		mutex_lock(&codec->control_mutex);
   6545		pval = kcontrol->private_value;
   6546		kcontrol->private_value = HDA_COMPOSE_AMP_VAL(shared_nid, ch,
   6547								0, dir);
   6548		changed = snd_hda_mixer_amp_volume_put(kcontrol, ucontrol);
   6549		kcontrol->private_value = pval;
   6550		mutex_unlock(&codec->control_mutex);
   6551		snd_hda_power_down(codec);
   6552	}
   6553
   6554	return changed;
   6555}
   6556
   6557/*
   6558 * This function is the same as the one above, because using an if statement
   6559 * inside of the above volume control for the DSP volume would cause too much
   6560 * lag. This is a lot more smooth.
   6561 */
   6562static int ca0132_alt_volume_put(struct snd_kcontrol *kcontrol,
   6563				struct snd_ctl_elem_value *ucontrol)
   6564{
   6565	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
   6566	struct ca0132_spec *spec = codec->spec;
   6567	hda_nid_t nid = get_amp_nid(kcontrol);
   6568	int ch = get_amp_channels(kcontrol);
   6569	long *valp = ucontrol->value.integer.value;
   6570	hda_nid_t vnid = 0;
   6571	int changed;
   6572
   6573	switch (nid) {
   6574	case 0x02:
   6575		vnid = VNID_SPK;
   6576		break;
   6577	case 0x07:
   6578		vnid = VNID_MIC;
   6579		break;
   6580	}
   6581
   6582	/* store the left and right volume */
   6583	if (ch & 1) {
   6584		spec->vnode_lvol[vnid - VNODE_START_NID] = *valp;
   6585		valp++;
   6586	}
   6587	if (ch & 2) {
   6588		spec->vnode_rvol[vnid - VNODE_START_NID] = *valp;
   6589		valp++;
   6590	}
   6591
   6592	snd_hda_power_up(codec);
   6593	ca0132_alt_dsp_volume_put(codec, vnid);
   6594	mutex_lock(&codec->control_mutex);
   6595	changed = snd_hda_mixer_amp_volume_put(kcontrol, ucontrol);
   6596	mutex_unlock(&codec->control_mutex);
   6597	snd_hda_power_down(codec);
   6598
   6599	return changed;
   6600}
   6601
   6602static int ca0132_volume_tlv(struct snd_kcontrol *kcontrol, int op_flag,
   6603			     unsigned int size, unsigned int __user *tlv)
   6604{
   6605	struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
   6606	struct ca0132_spec *spec = codec->spec;
   6607	hda_nid_t nid = get_amp_nid(kcontrol);
   6608	int ch = get_amp_channels(kcontrol);
   6609	int dir = get_amp_direction(kcontrol);
   6610	unsigned long pval;
   6611	int err;
   6612
   6613	switch (nid) {
   6614	case VNID_SPK:
   6615		/* follow shared_out tlv */
   6616		nid = spec->shared_out_nid;
   6617		mutex_lock(&codec->control_mutex);
   6618		pval = kcontrol->private_value;
   6619		kcontrol->private_value = HDA_COMPOSE_AMP_VAL(nid, ch, 0, dir);
   6620		err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
   6621		kcontrol->private_value = pval;
   6622		mutex_unlock(&codec->control_mutex);
   6623		break;
   6624	case VNID_MIC:
   6625		/* follow shared_mic tlv */
   6626		nid = spec->shared_mic_nid;
   6627		mutex_lock(&codec->control_mutex);
   6628		pval = kcontrol->private_value;
   6629		kcontrol->private_value = HDA_COMPOSE_AMP_VAL(nid, ch, 0, dir);
   6630		err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
   6631		kcontrol->private_value = pval;
   6632		mutex_unlock(&codec->control_mutex);
   6633		break;
   6634	default:
   6635		err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
   6636	}
   6637	return err;
   6638}
   6639
   6640/* Add volume slider control for effect level */
   6641static int ca0132_alt_add_effect_slider(struct hda_codec *codec, hda_nid_t nid,
   6642					const char *pfx, int dir)
   6643{
   6644	char namestr[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
   6645	int type = dir ? HDA_INPUT : HDA_OUTPUT;
   6646	struct snd_kcontrol_new knew =
   6647		HDA_CODEC_VOLUME_MONO(namestr, nid, 1, 0, type);
   6648
   6649	sprintf(namestr, "FX: %s %s Volume", pfx, dirstr[dir]);
   6650
   6651	knew.tlv.c = NULL;
   6652
   6653	switch (nid) {
   6654	case XBASS_XOVER:
   6655		knew.info = ca0132_alt_xbass_xover_slider_info;
   6656		knew.get = ca0132_alt_xbass_xover_slider_ctl_get;
   6657		knew.put = ca0132_alt_xbass_xover_slider_put;
   6658		break;
   6659	default:
   6660		knew.info = ca0132_alt_effect_slider_info;
   6661		knew.get = ca0132_alt_slider_ctl_get;
   6662		knew.put = ca0132_alt_effect_slider_put;
   6663		knew.private_value =
   6664			HDA_COMPOSE_AMP_VAL(nid, 1, 0, type);
   6665		break;
   6666	}
   6667
   6668	return snd_hda_ctl_add(codec, nid, snd_ctl_new1(&knew, codec));
   6669}
   6670
   6671/*
   6672 * Added FX: prefix for the alternative codecs, because otherwise the surround
   6673 * effect would conflict with the Surround sound volume control. Also seems more
   6674 * clear as to what the switches do. Left alone for others.
   6675 */
   6676static int add_fx_switch(struct hda_codec *codec, hda_nid_t nid,
   6677			 const char *pfx, int dir)
   6678{
   6679	struct ca0132_spec *spec = codec->spec;
   6680	char namestr[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
   6681	int type = dir ? HDA_INPUT : HDA_OUTPUT;
   6682	struct snd_kcontrol_new knew =
   6683		CA0132_CODEC_MUTE_MONO(namestr, nid, 1, type);
   6684	/* If using alt_controls, add FX: prefix. But, don't add FX:
   6685	 * prefix to OutFX or InFX enable controls.
   6686	 */
   6687	if (ca0132_use_alt_controls(spec) && (nid <= IN_EFFECT_END_NID))
   6688		sprintf(namestr, "FX: %s %s Switch", pfx, dirstr[dir]);
   6689	else
   6690		sprintf(namestr, "%s %s Switch", pfx, dirstr[dir]);
   6691
   6692	return snd_hda_ctl_add(codec, nid, snd_ctl_new1(&knew, codec));
   6693}
   6694
   6695static int add_voicefx(struct hda_codec *codec)
   6696{
   6697	struct snd_kcontrol_new knew =
   6698		HDA_CODEC_MUTE_MONO(ca0132_voicefx.name,
   6699				    VOICEFX, 1, 0, HDA_INPUT);
   6700	knew.info = ca0132_voicefx_info;
   6701	knew.get = ca0132_voicefx_get;
   6702	knew.put = ca0132_voicefx_put;
   6703	return snd_hda_ctl_add(codec, VOICEFX, snd_ctl_new1(&knew, codec));
   6704}
   6705
   6706/* Create the EQ Preset control */
   6707static int add_ca0132_alt_eq_presets(struct hda_codec *codec)
   6708{
   6709	struct snd_kcontrol_new knew =
   6710		HDA_CODEC_MUTE_MONO(ca0132_alt_eq_enum.name,
   6711				    EQ_PRESET_ENUM, 1, 0, HDA_OUTPUT);
   6712	knew.info = ca0132_alt_eq_preset_info;
   6713	knew.get = ca0132_alt_eq_preset_get;
   6714	knew.put = ca0132_alt_eq_preset_put;
   6715	return snd_hda_ctl_add(codec, EQ_PRESET_ENUM,
   6716				snd_ctl_new1(&knew, codec));
   6717}
   6718
   6719/*
   6720 * Add enumerated control for the three different settings of the smart volume
   6721 * output effect. Normal just uses the slider value, and loud and night are
   6722 * their own things that ignore that value.
   6723 */
   6724static int ca0132_alt_add_svm_enum(struct hda_codec *codec)
   6725{
   6726	struct snd_kcontrol_new knew =
   6727		HDA_CODEC_MUTE_MONO("FX: Smart Volume Setting",
   6728				    SMART_VOLUME_ENUM, 1, 0, HDA_OUTPUT);
   6729	knew.info = ca0132_alt_svm_setting_info;
   6730	knew.get = ca0132_alt_svm_setting_get;
   6731	knew.put = ca0132_alt_svm_setting_put;
   6732	return snd_hda_ctl_add(codec, SMART_VOLUME_ENUM,
   6733				snd_ctl_new1(&knew, codec));
   6734
   6735}
   6736
   6737/*
   6738 * Create an Output Select enumerated control for codecs with surround
   6739 * out capabilities.
   6740 */
   6741static int ca0132_alt_add_output_enum(struct hda_codec *codec)
   6742{
   6743	struct snd_kcontrol_new knew =
   6744		HDA_CODEC_MUTE_MONO("Output Select",
   6745				    OUTPUT_SOURCE_ENUM, 1, 0, HDA_OUTPUT);
   6746	knew.info = ca0132_alt_output_select_get_info;
   6747	knew.get = ca0132_alt_output_select_get;
   6748	knew.put = ca0132_alt_output_select_put;
   6749	return snd_hda_ctl_add(codec, OUTPUT_SOURCE_ENUM,
   6750				snd_ctl_new1(&knew, codec));
   6751}
   6752
   6753/*
   6754 * Add a control for selecting channel count on speaker output. Setting this
   6755 * allows the DSP to do bass redirection and channel upmixing on surround
   6756 * configurations.
   6757 */
   6758static int ca0132_alt_add_speaker_channel_cfg_enum(struct hda_codec *codec)
   6759{
   6760	struct snd_kcontrol_new knew =
   6761		HDA_CODEC_MUTE_MONO("Surround Channel Config",
   6762				    SPEAKER_CHANNEL_CFG_ENUM, 1, 0, HDA_OUTPUT);
   6763	knew.info = ca0132_alt_speaker_channel_cfg_get_info;
   6764	knew.get = ca0132_alt_speaker_channel_cfg_get;
   6765	knew.put = ca0132_alt_speaker_channel_cfg_put;
   6766	return snd_hda_ctl_add(codec, SPEAKER_CHANNEL_CFG_ENUM,
   6767				snd_ctl_new1(&knew, codec));
   6768}
   6769
   6770/*
   6771 * Full range front stereo and rear surround switches. When these are set to
   6772 * full range, the lower frequencies from these channels are no longer
   6773 * redirected to the LFE channel.
   6774 */
   6775static int ca0132_alt_add_front_full_range_switch(struct hda_codec *codec)
   6776{
   6777	struct snd_kcontrol_new knew =
   6778		CA0132_CODEC_MUTE_MONO("Full-Range Front Speakers",
   6779				    SPEAKER_FULL_RANGE_FRONT, 1, HDA_OUTPUT);
   6780
   6781	return snd_hda_ctl_add(codec, SPEAKER_FULL_RANGE_FRONT,
   6782				snd_ctl_new1(&knew, codec));
   6783}
   6784
   6785static int ca0132_alt_add_rear_full_range_switch(struct hda_codec *codec)
   6786{
   6787	struct snd_kcontrol_new knew =
   6788		CA0132_CODEC_MUTE_MONO("Full-Range Rear Speakers",
   6789				    SPEAKER_FULL_RANGE_REAR, 1, HDA_OUTPUT);
   6790
   6791	return snd_hda_ctl_add(codec, SPEAKER_FULL_RANGE_REAR,
   6792				snd_ctl_new1(&knew, codec));
   6793}
   6794
   6795/*
   6796 * Bass redirection redirects audio below the crossover frequency to the LFE
   6797 * channel on speakers that are set as not being full-range. On configurations
   6798 * without an LFE channel, it does nothing. Bass redirection seems to be the
   6799 * replacement for X-Bass on configurations with an LFE channel.
   6800 */
   6801static int ca0132_alt_add_bass_redirection_crossover(struct hda_codec *codec)
   6802{
   6803	const char *namestr = "Bass Redirection Crossover";
   6804	struct snd_kcontrol_new knew =
   6805		HDA_CODEC_VOLUME_MONO(namestr, BASS_REDIRECTION_XOVER, 1, 0,
   6806				HDA_OUTPUT);
   6807
   6808	knew.tlv.c = NULL;
   6809	knew.info = ca0132_alt_xbass_xover_slider_info;
   6810	knew.get = ca0132_alt_xbass_xover_slider_ctl_get;
   6811	knew.put = ca0132_alt_xbass_xover_slider_put;
   6812
   6813	return snd_hda_ctl_add(codec, BASS_REDIRECTION_XOVER,
   6814			snd_ctl_new1(&knew, codec));
   6815}
   6816
   6817static int ca0132_alt_add_bass_redirection_switch(struct hda_codec *codec)
   6818{
   6819	const char *namestr = "Bass Redirection";
   6820	struct snd_kcontrol_new knew =
   6821		CA0132_CODEC_MUTE_MONO(namestr, BASS_REDIRECTION, 1,
   6822				HDA_OUTPUT);
   6823
   6824	return snd_hda_ctl_add(codec, BASS_REDIRECTION,
   6825			snd_ctl_new1(&knew, codec));
   6826}
   6827
   6828/*
   6829 * Create an Input Source enumerated control for the alternate ca0132 codecs
   6830 * because the front microphone has no auto-detect, and Line-in has to be set
   6831 * somehow.
   6832 */
   6833static int ca0132_alt_add_input_enum(struct hda_codec *codec)
   6834{
   6835	struct snd_kcontrol_new knew =
   6836		HDA_CODEC_MUTE_MONO("Input Source",
   6837				    INPUT_SOURCE_ENUM, 1, 0, HDA_INPUT);
   6838	knew.info = ca0132_alt_input_source_info;
   6839	knew.get = ca0132_alt_input_source_get;
   6840	knew.put = ca0132_alt_input_source_put;
   6841	return snd_hda_ctl_add(codec, INPUT_SOURCE_ENUM,
   6842				snd_ctl_new1(&knew, codec));
   6843}
   6844
   6845/*
   6846 * Add mic boost enumerated control. Switches through 0dB to 30dB. This adds
   6847 * more control than the original mic boost, which is either full 30dB or off.
   6848 */
   6849static int ca0132_alt_add_mic_boost_enum(struct hda_codec *codec)
   6850{
   6851	struct snd_kcontrol_new knew =
   6852		HDA_CODEC_MUTE_MONO("Mic Boost Capture Switch",
   6853				    MIC_BOOST_ENUM, 1, 0, HDA_INPUT);
   6854	knew.info = ca0132_alt_mic_boost_info;
   6855	knew.get = ca0132_alt_mic_boost_get;
   6856	knew.put = ca0132_alt_mic_boost_put;
   6857	return snd_hda_ctl_add(codec, MIC_BOOST_ENUM,
   6858				snd_ctl_new1(&knew, codec));
   6859
   6860}
   6861
   6862/*
   6863 * Add headphone gain enumerated control for the AE-5. This switches between
   6864 * three modes, low, medium, and high. When non-headphone outputs are selected,
   6865 * it is automatically set to high. This is the same behavior as Windows.
   6866 */
   6867static int ae5_add_headphone_gain_enum(struct hda_codec *codec)
   6868{
   6869	struct snd_kcontrol_new knew =
   6870		HDA_CODEC_MUTE_MONO("AE-5: Headphone Gain",
   6871				    AE5_HEADPHONE_GAIN_ENUM, 1, 0, HDA_OUTPUT);
   6872	knew.info = ae5_headphone_gain_info;
   6873	knew.get = ae5_headphone_gain_get;
   6874	knew.put = ae5_headphone_gain_put;
   6875	return snd_hda_ctl_add(codec, AE5_HEADPHONE_GAIN_ENUM,
   6876				snd_ctl_new1(&knew, codec));
   6877}
   6878
   6879/*
   6880 * Add sound filter enumerated control for the AE-5. This adds three different
   6881 * settings: Slow Roll Off, Minimum Phase, and Fast Roll Off. From what I've
   6882 * read into it, it changes the DAC's interpolation filter.
   6883 */
   6884static int ae5_add_sound_filter_enum(struct hda_codec *codec)
   6885{
   6886	struct snd_kcontrol_new knew =
   6887		HDA_CODEC_MUTE_MONO("AE-5: Sound Filter",
   6888				    AE5_SOUND_FILTER_ENUM, 1, 0, HDA_OUTPUT);
   6889	knew.info = ae5_sound_filter_info;
   6890	knew.get = ae5_sound_filter_get;
   6891	knew.put = ae5_sound_filter_put;
   6892	return snd_hda_ctl_add(codec, AE5_SOUND_FILTER_ENUM,
   6893				snd_ctl_new1(&knew, codec));
   6894}
   6895
   6896static int zxr_add_headphone_gain_switch(struct hda_codec *codec)
   6897{
   6898	struct snd_kcontrol_new knew =
   6899		CA0132_CODEC_MUTE_MONO("ZxR: 600 Ohm Gain",
   6900				    ZXR_HEADPHONE_GAIN, 1, HDA_OUTPUT);
   6901
   6902	return snd_hda_ctl_add(codec, ZXR_HEADPHONE_GAIN,
   6903				snd_ctl_new1(&knew, codec));
   6904}
   6905
   6906/*
   6907 * Need to create follower controls for the alternate codecs that have surround
   6908 * capabilities.
   6909 */
   6910static const char * const ca0132_alt_follower_pfxs[] = {
   6911	"Front", "Surround", "Center", "LFE", NULL,
   6912};
   6913
   6914/*
   6915 * Also need special channel map, because the default one is incorrect.
   6916 * I think this has to do with the pin for rear surround being 0x11,
   6917 * and the center/lfe being 0x10. Usually the pin order is the opposite.
   6918 */
   6919static const struct snd_pcm_chmap_elem ca0132_alt_chmaps[] = {
   6920	{ .channels = 2,
   6921	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },
   6922	{ .channels = 4,
   6923	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
   6924		   SNDRV_CHMAP_RL, SNDRV_CHMAP_RR } },
   6925	{ .channels = 6,
   6926	  .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
   6927		   SNDRV_CHMAP_FC, SNDRV_CHMAP_LFE,
   6928		   SNDRV_CHMAP_RL, SNDRV_CHMAP_RR } },
   6929	{ }
   6930};
   6931
   6932/* Add the correct chmap for streams with 6 channels. */
   6933static void ca0132_alt_add_chmap_ctls(struct hda_codec *codec)
   6934{
   6935	int err = 0;
   6936	struct hda_pcm *pcm;
   6937
   6938	list_for_each_entry(pcm, &codec->pcm_list_head, list) {
   6939		struct hda_pcm_stream *hinfo =
   6940			&pcm->stream[SNDRV_PCM_STREAM_PLAYBACK];
   6941		struct snd_pcm_chmap *chmap;
   6942		const struct snd_pcm_chmap_elem *elem;
   6943
   6944		elem = ca0132_alt_chmaps;
   6945		if (hinfo->channels_max == 6) {
   6946			err = snd_pcm_add_chmap_ctls(pcm->pcm,
   6947					SNDRV_PCM_STREAM_PLAYBACK,
   6948					elem, hinfo->channels_max, 0, &chmap);
   6949			if (err < 0)
   6950				codec_dbg(codec, "snd_pcm_add_chmap_ctls failed!");
   6951		}
   6952	}
   6953}
   6954
   6955/*
   6956 * When changing Node IDs for Mixer Controls below, make sure to update
   6957 * Node IDs in ca0132_config() as well.
   6958 */
   6959static const struct snd_kcontrol_new ca0132_mixer[] = {
   6960	CA0132_CODEC_VOL("Master Playback Volume", VNID_SPK, HDA_OUTPUT),
   6961	CA0132_CODEC_MUTE("Master Playback Switch", VNID_SPK, HDA_OUTPUT),
   6962	CA0132_CODEC_VOL("Capture Volume", VNID_MIC, HDA_INPUT),
   6963	CA0132_CODEC_MUTE("Capture Switch", VNID_MIC, HDA_INPUT),
   6964	HDA_CODEC_VOLUME("Analog-Mic2 Capture Volume", 0x08, 0, HDA_INPUT),
   6965	HDA_CODEC_MUTE("Analog-Mic2 Capture Switch", 0x08, 0, HDA_INPUT),
   6966	HDA_CODEC_VOLUME("What U Hear Capture Volume", 0x0a, 0, HDA_INPUT),
   6967	HDA_CODEC_MUTE("What U Hear Capture Switch", 0x0a, 0, HDA_INPUT),
   6968	CA0132_CODEC_MUTE_MONO("Mic1-Boost (30dB) Capture Switch",
   6969			       0x12, 1, HDA_INPUT),
   6970	CA0132_CODEC_MUTE_MONO("HP/Speaker Playback Switch",
   6971			       VNID_HP_SEL, 1, HDA_OUTPUT),
   6972	CA0132_CODEC_MUTE_MONO("AMic1/DMic Capture Switch",
   6973			       VNID_AMIC1_SEL, 1, HDA_INPUT),
   6974	CA0132_CODEC_MUTE_MONO("HP/Speaker Auto Detect Playback Switch",
   6975			       VNID_HP_ASEL, 1, HDA_OUTPUT),
   6976	CA0132_CODEC_MUTE_MONO("AMic1/DMic Auto Detect Capture Switch",
   6977			       VNID_AMIC1_ASEL, 1, HDA_INPUT),
   6978	{ } /* end */
   6979};
   6980
   6981/*
   6982 * Desktop specific control mixer. Removes auto-detect for mic, and adds
   6983 * surround controls. Also sets both the Front Playback and Capture Volume
   6984 * controls to alt so they set the DSP's decibel level.
   6985 */
   6986static const struct snd_kcontrol_new desktop_mixer[] = {
   6987	CA0132_ALT_CODEC_VOL("Front Playback Volume", 0x02, HDA_OUTPUT),
   6988	CA0132_CODEC_MUTE("Front Playback Switch", VNID_SPK, HDA_OUTPUT),
   6989	HDA_CODEC_VOLUME("Surround Playback Volume", 0x04, 0, HDA_OUTPUT),
   6990	HDA_CODEC_MUTE("Surround Playback Switch", 0x04, 0, HDA_OUTPUT),
   6991	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x03, 1, 0, HDA_OUTPUT),
   6992	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x03, 1, 0, HDA_OUTPUT),
   6993	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x03, 2, 0, HDA_OUTPUT),
   6994	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x03, 2, 0, HDA_OUTPUT),
   6995	CA0132_ALT_CODEC_VOL("Capture Volume", 0x07, HDA_INPUT),
   6996	CA0132_CODEC_MUTE("Capture Switch", VNID_MIC, HDA_INPUT),
   6997	HDA_CODEC_VOLUME("What U Hear Capture Volume", 0x0a, 0, HDA_INPUT),
   6998	HDA_CODEC_MUTE("What U Hear Capture Switch", 0x0a, 0, HDA_INPUT),
   6999	CA0132_CODEC_MUTE_MONO("HP/Speaker Auto Detect Playback Switch",
   7000				VNID_HP_ASEL, 1, HDA_OUTPUT),
   7001	{ } /* end */
   7002};
   7003
   7004/*
   7005 * Same as the Sound Blaster Z, except doesn't use the alt volume for capture
   7006 * because it doesn't set decibel levels for the DSP for capture.
   7007 */
   7008static const struct snd_kcontrol_new r3di_mixer[] = {
   7009	CA0132_ALT_CODEC_VOL("Front Playback Volume", 0x02, HDA_OUTPUT),
   7010	CA0132_CODEC_MUTE("Front Playback Switch", VNID_SPK, HDA_OUTPUT),
   7011	HDA_CODEC_VOLUME("Surround Playback Volume", 0x04, 0, HDA_OUTPUT),
   7012	HDA_CODEC_MUTE("Surround Playback Switch", 0x04, 0, HDA_OUTPUT),
   7013	HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x03, 1, 0, HDA_OUTPUT),
   7014	HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x03, 1, 0, HDA_OUTPUT),
   7015	HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x03, 2, 0, HDA_OUTPUT),
   7016	HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x03, 2, 0, HDA_OUTPUT),
   7017	CA0132_CODEC_VOL("Capture Volume", VNID_MIC, HDA_INPUT),
   7018	CA0132_CODEC_MUTE("Capture Switch", VNID_MIC, HDA_INPUT),
   7019	HDA_CODEC_VOLUME("What U Hear Capture Volume", 0x0a, 0, HDA_INPUT),
   7020	HDA_CODEC_MUTE("What U Hear Capture Switch", 0x0a, 0, HDA_INPUT),
   7021	CA0132_CODEC_MUTE_MONO("HP/Speaker Auto Detect Playback Switch",
   7022				VNID_HP_ASEL, 1, HDA_OUTPUT),
   7023	{ } /* end */
   7024};
   7025
   7026static int ca0132_build_controls(struct hda_codec *codec)
   7027{
   7028	struct ca0132_spec *spec = codec->spec;
   7029	int i, num_fx, num_sliders;
   7030	int err = 0;
   7031
   7032	/* Add Mixer controls */
   7033	for (i = 0; i < spec->num_mixers; i++) {
   7034		err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
   7035		if (err < 0)
   7036			return err;
   7037	}
   7038	/* Setup vmaster with surround followers for desktop ca0132 devices */
   7039	if (ca0132_use_alt_functions(spec)) {
   7040		snd_hda_set_vmaster_tlv(codec, spec->dacs[0], HDA_OUTPUT,
   7041					spec->tlv);
   7042		snd_hda_add_vmaster(codec, "Master Playback Volume",
   7043					spec->tlv, ca0132_alt_follower_pfxs,
   7044					"Playback Volume", 0);
   7045		err = __snd_hda_add_vmaster(codec, "Master Playback Switch",
   7046					    NULL, ca0132_alt_follower_pfxs,
   7047					    "Playback Switch",
   7048					    true, 0, &spec->vmaster_mute.sw_kctl);
   7049		if (err < 0)
   7050			return err;
   7051	}
   7052
   7053	/* Add in and out effects controls.
   7054	 * VoiceFX, PE and CrystalVoice are added separately.
   7055	 */
   7056	num_fx = OUT_EFFECTS_COUNT + IN_EFFECTS_COUNT;
   7057	for (i = 0; i < num_fx; i++) {
   7058		/* Desktop cards break if Echo Cancellation is used. */
   7059		if (ca0132_use_pci_mmio(spec)) {
   7060			if (i == (ECHO_CANCELLATION - IN_EFFECT_START_NID +
   7061						OUT_EFFECTS_COUNT))
   7062				continue;
   7063		}
   7064
   7065		err = add_fx_switch(codec, ca0132_effects[i].nid,
   7066				    ca0132_effects[i].name,
   7067				    ca0132_effects[i].direct);
   7068		if (err < 0)
   7069			return err;
   7070	}
   7071	/*
   7072	 * If codec has use_alt_controls set to true, add effect level sliders,
   7073	 * EQ presets, and Smart Volume presets. Also, change names to add FX
   7074	 * prefix, and change PlayEnhancement and CrystalVoice to match.
   7075	 */
   7076	if (ca0132_use_alt_controls(spec)) {
   7077		err = ca0132_alt_add_svm_enum(codec);
   7078		if (err < 0)
   7079			return err;
   7080
   7081		err = add_ca0132_alt_eq_presets(codec);
   7082		if (err < 0)
   7083			return err;
   7084
   7085		err = add_fx_switch(codec, PLAY_ENHANCEMENT,
   7086					"Enable OutFX", 0);
   7087		if (err < 0)
   7088			return err;
   7089
   7090		err = add_fx_switch(codec, CRYSTAL_VOICE,
   7091					"Enable InFX", 1);
   7092		if (err < 0)
   7093			return err;
   7094
   7095		num_sliders = OUT_EFFECTS_COUNT - 1;
   7096		for (i = 0; i < num_sliders; i++) {
   7097			err = ca0132_alt_add_effect_slider(codec,
   7098					    ca0132_effects[i].nid,
   7099					    ca0132_effects[i].name,
   7100					    ca0132_effects[i].direct);
   7101			if (err < 0)
   7102				return err;
   7103		}
   7104
   7105		err = ca0132_alt_add_effect_slider(codec, XBASS_XOVER,
   7106					"X-Bass Crossover", EFX_DIR_OUT);
   7107
   7108		if (err < 0)
   7109			return err;
   7110	} else {
   7111		err = add_fx_switch(codec, PLAY_ENHANCEMENT,
   7112					"PlayEnhancement", 0);
   7113		if (err < 0)
   7114			return err;
   7115
   7116		err = add_fx_switch(codec, CRYSTAL_VOICE,
   7117					"CrystalVoice", 1);
   7118		if (err < 0)
   7119			return err;
   7120	}
   7121	err = add_voicefx(codec);
   7122	if (err < 0)
   7123		return err;
   7124
   7125	/*
   7126	 * If the codec uses alt_functions, you need the enumerated controls
   7127	 * to select the new outputs and inputs, plus add the new mic boost
   7128	 * setting control.
   7129	 */
   7130	if (ca0132_use_alt_functions(spec)) {
   7131		err = ca0132_alt_add_output_enum(codec);
   7132		if (err < 0)
   7133			return err;
   7134		err = ca0132_alt_add_speaker_channel_cfg_enum(codec);
   7135		if (err < 0)
   7136			return err;
   7137		err = ca0132_alt_add_front_full_range_switch(codec);
   7138		if (err < 0)
   7139			return err;
   7140		err = ca0132_alt_add_rear_full_range_switch(codec);
   7141		if (err < 0)
   7142			return err;
   7143		err = ca0132_alt_add_bass_redirection_crossover(codec);
   7144		if (err < 0)
   7145			return err;
   7146		err = ca0132_alt_add_bass_redirection_switch(codec);
   7147		if (err < 0)
   7148			return err;
   7149		err = ca0132_alt_add_mic_boost_enum(codec);
   7150		if (err < 0)
   7151			return err;
   7152		/*
   7153		 * ZxR only has microphone input, there is no front panel
   7154		 * header on the card, and aux-in is handled by the DBPro board.
   7155		 */
   7156		if (ca0132_quirk(spec) != QUIRK_ZXR) {
   7157			err = ca0132_alt_add_input_enum(codec);
   7158			if (err < 0)
   7159				return err;
   7160		}
   7161	}
   7162
   7163	switch (ca0132_quirk(spec)) {
   7164	case QUIRK_AE5:
   7165	case QUIRK_AE7:
   7166		err = ae5_add_headphone_gain_enum(codec);
   7167		if (err < 0)
   7168			return err;
   7169		err = ae5_add_sound_filter_enum(codec);
   7170		if (err < 0)
   7171			return err;
   7172		break;
   7173	case QUIRK_ZXR:
   7174		err = zxr_add_headphone_gain_switch(codec);
   7175		if (err < 0)
   7176			return err;
   7177		break;
   7178	default:
   7179		break;
   7180	}
   7181
   7182#ifdef ENABLE_TUNING_CONTROLS
   7183	add_tuning_ctls(codec);
   7184#endif
   7185
   7186	err = snd_hda_jack_add_kctls(codec, &spec->autocfg);
   7187	if (err < 0)
   7188		return err;
   7189
   7190	if (spec->dig_out) {
   7191		err = snd_hda_create_spdif_out_ctls(codec, spec->dig_out,
   7192						    spec->dig_out);
   7193		if (err < 0)
   7194			return err;
   7195		err = snd_hda_create_spdif_share_sw(codec, &spec->multiout);
   7196		if (err < 0)
   7197			return err;
   7198		/* spec->multiout.share_spdif = 1; */
   7199	}
   7200
   7201	if (spec->dig_in) {
   7202		err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in);
   7203		if (err < 0)
   7204			return err;
   7205	}
   7206
   7207	if (ca0132_use_alt_functions(spec))
   7208		ca0132_alt_add_chmap_ctls(codec);
   7209
   7210	return 0;
   7211}
   7212
   7213static int dbpro_build_controls(struct hda_codec *codec)
   7214{
   7215	struct ca0132_spec *spec = codec->spec;
   7216	int err = 0;
   7217
   7218	if (spec->dig_out) {
   7219		err = snd_hda_create_spdif_out_ctls(codec, spec->dig_out,
   7220				spec->dig_out);
   7221		if (err < 0)
   7222			return err;
   7223	}
   7224
   7225	if (spec->dig_in) {
   7226		err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in);
   7227		if (err < 0)
   7228			return err;
   7229	}
   7230
   7231	return 0;
   7232}
   7233
   7234/*
   7235 * PCM
   7236 */
   7237static const struct hda_pcm_stream ca0132_pcm_analog_playback = {
   7238	.substreams = 1,
   7239	.channels_min = 2,
   7240	.channels_max = 6,
   7241	.ops = {
   7242		.prepare = ca0132_playback_pcm_prepare,
   7243		.cleanup = ca0132_playback_pcm_cleanup,
   7244		.get_delay = ca0132_playback_pcm_delay,
   7245	},
   7246};
   7247
   7248static const struct hda_pcm_stream ca0132_pcm_analog_capture = {
   7249	.substreams = 1,
   7250	.channels_min = 2,
   7251	.channels_max = 2,
   7252	.ops = {
   7253		.prepare = ca0132_capture_pcm_prepare,
   7254		.cleanup = ca0132_capture_pcm_cleanup,
   7255		.get_delay = ca0132_capture_pcm_delay,
   7256	},
   7257};
   7258
   7259static const struct hda_pcm_stream ca0132_pcm_digital_playback = {
   7260	.substreams = 1,
   7261	.channels_min = 2,
   7262	.channels_max = 2,
   7263	.ops = {
   7264		.open = ca0132_dig_playback_pcm_open,
   7265		.close = ca0132_dig_playback_pcm_close,
   7266		.prepare = ca0132_dig_playback_pcm_prepare,
   7267		.cleanup = ca0132_dig_playback_pcm_cleanup
   7268	},
   7269};
   7270
   7271static const struct hda_pcm_stream ca0132_pcm_digital_capture = {
   7272	.substreams = 1,
   7273	.channels_min = 2,
   7274	.channels_max = 2,
   7275};
   7276
   7277static int ca0132_build_pcms(struct hda_codec *codec)
   7278{
   7279	struct ca0132_spec *spec = codec->spec;
   7280	struct hda_pcm *info;
   7281
   7282	info = snd_hda_codec_pcm_new(codec, "CA0132 Analog");
   7283	if (!info)
   7284		return -ENOMEM;
   7285	if (ca0132_use_alt_functions(spec)) {
   7286		info->own_chmap = true;
   7287		info->stream[SNDRV_PCM_STREAM_PLAYBACK].chmap
   7288			= ca0132_alt_chmaps;
   7289	}
   7290	info->stream[SNDRV_PCM_STREAM_PLAYBACK] = ca0132_pcm_analog_playback;
   7291	info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->dacs[0];
   7292	info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max =
   7293		spec->multiout.max_channels;
   7294	info->stream[SNDRV_PCM_STREAM_CAPTURE] = ca0132_pcm_analog_capture;
   7295	info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = 1;
   7296	info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adcs[0];
   7297
   7298	/* With the DSP enabled, desktops don't use this ADC. */
   7299	if (!ca0132_use_alt_functions(spec)) {
   7300		info = snd_hda_codec_pcm_new(codec, "CA0132 Analog Mic-In2");
   7301		if (!info)
   7302			return -ENOMEM;
   7303		info->stream[SNDRV_PCM_STREAM_CAPTURE] =
   7304			ca0132_pcm_analog_capture;
   7305		info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = 1;
   7306		info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adcs[1];
   7307	}
   7308
   7309	info = snd_hda_codec_pcm_new(codec, "CA0132 What U Hear");
   7310	if (!info)
   7311		return -ENOMEM;
   7312	info->stream[SNDRV_PCM_STREAM_CAPTURE] = ca0132_pcm_analog_capture;
   7313	info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = 1;
   7314	info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adcs[2];
   7315
   7316	if (!spec->dig_out && !spec->dig_in)
   7317		return 0;
   7318
   7319	info = snd_hda_codec_pcm_new(codec, "CA0132 Digital");
   7320	if (!info)
   7321		return -ENOMEM;
   7322	info->pcm_type = HDA_PCM_TYPE_SPDIF;
   7323	if (spec->dig_out) {
   7324		info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
   7325			ca0132_pcm_digital_playback;
   7326		info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->dig_out;
   7327	}
   7328	if (spec->dig_in) {
   7329		info->stream[SNDRV_PCM_STREAM_CAPTURE] =
   7330			ca0132_pcm_digital_capture;
   7331		info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in;
   7332	}
   7333
   7334	return 0;
   7335}
   7336
   7337static int dbpro_build_pcms(struct hda_codec *codec)
   7338{
   7339	struct ca0132_spec *spec = codec->spec;
   7340	struct hda_pcm *info;
   7341
   7342	info = snd_hda_codec_pcm_new(codec, "CA0132 Alt Analog");
   7343	if (!info)
   7344		return -ENOMEM;
   7345	info->stream[SNDRV_PCM_STREAM_CAPTURE] = ca0132_pcm_analog_capture;
   7346	info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = 1;
   7347	info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adcs[0];
   7348
   7349
   7350	if (!spec->dig_out && !spec->dig_in)
   7351		return 0;
   7352
   7353	info = snd_hda_codec_pcm_new(codec, "CA0132 Digital");
   7354	if (!info)
   7355		return -ENOMEM;
   7356	info->pcm_type = HDA_PCM_TYPE_SPDIF;
   7357	if (spec->dig_out) {
   7358		info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
   7359			ca0132_pcm_digital_playback;
   7360		info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->dig_out;
   7361	}
   7362	if (spec->dig_in) {
   7363		info->stream[SNDRV_PCM_STREAM_CAPTURE] =
   7364			ca0132_pcm_digital_capture;
   7365		info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in;
   7366	}
   7367
   7368	return 0;
   7369}
   7370
   7371static void init_output(struct hda_codec *codec, hda_nid_t pin, hda_nid_t dac)
   7372{
   7373	if (pin) {
   7374		snd_hda_set_pin_ctl(codec, pin, PIN_HP);
   7375		if (get_wcaps(codec, pin) & AC_WCAP_OUT_AMP)
   7376			snd_hda_codec_write(codec, pin, 0,
   7377					    AC_VERB_SET_AMP_GAIN_MUTE,
   7378					    AMP_OUT_UNMUTE);
   7379	}
   7380	if (dac && (get_wcaps(codec, dac) & AC_WCAP_OUT_AMP))
   7381		snd_hda_codec_write(codec, dac, 0,
   7382				    AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO);
   7383}
   7384
   7385static void init_input(struct hda_codec *codec, hda_nid_t pin, hda_nid_t adc)
   7386{
   7387	if (pin) {
   7388		snd_hda_set_pin_ctl(codec, pin, PIN_VREF80);
   7389		if (get_wcaps(codec, pin) & AC_WCAP_IN_AMP)
   7390			snd_hda_codec_write(codec, pin, 0,
   7391					    AC_VERB_SET_AMP_GAIN_MUTE,
   7392					    AMP_IN_UNMUTE(0));
   7393	}
   7394	if (adc && (get_wcaps(codec, adc) & AC_WCAP_IN_AMP)) {
   7395		snd_hda_codec_write(codec, adc, 0, AC_VERB_SET_AMP_GAIN_MUTE,
   7396				    AMP_IN_UNMUTE(0));
   7397
   7398		/* init to 0 dB and unmute. */
   7399		snd_hda_codec_amp_stereo(codec, adc, HDA_INPUT, 0,
   7400					 HDA_AMP_VOLMASK, 0x5a);
   7401		snd_hda_codec_amp_stereo(codec, adc, HDA_INPUT, 0,
   7402					 HDA_AMP_MUTE, 0);
   7403	}
   7404}
   7405
   7406static void refresh_amp_caps(struct hda_codec *codec, hda_nid_t nid, int dir)
   7407{
   7408	unsigned int caps;
   7409
   7410	caps = snd_hda_param_read(codec, nid, dir == HDA_OUTPUT ?
   7411				  AC_PAR_AMP_OUT_CAP : AC_PAR_AMP_IN_CAP);
   7412	snd_hda_override_amp_caps(codec, nid, dir, caps);
   7413}
   7414
   7415/*
   7416 * Switch between Digital built-in mic and analog mic.
   7417 */
   7418static void ca0132_set_dmic(struct hda_codec *codec, int enable)
   7419{
   7420	struct ca0132_spec *spec = codec->spec;
   7421	unsigned int tmp;
   7422	u8 val;
   7423	unsigned int oldval;
   7424
   7425	codec_dbg(codec, "ca0132_set_dmic: enable=%d\n", enable);
   7426
   7427	oldval = stop_mic1(codec);
   7428	ca0132_set_vipsource(codec, 0);
   7429	if (enable) {
   7430		/* set DMic input as 2-ch */
   7431		tmp = FLOAT_TWO;
   7432		dspio_set_uint_param(codec, 0x80, 0x00, tmp);
   7433
   7434		val = spec->dmic_ctl;
   7435		val |= 0x80;
   7436		snd_hda_codec_write(codec, spec->input_pins[0], 0,
   7437				    VENDOR_CHIPIO_DMIC_CTL_SET, val);
   7438
   7439		if (!(spec->dmic_ctl & 0x20))
   7440			chipio_set_control_flag(codec, CONTROL_FLAG_DMIC, 1);
   7441	} else {
   7442		/* set AMic input as mono */
   7443		tmp = FLOAT_ONE;
   7444		dspio_set_uint_param(codec, 0x80, 0x00, tmp);
   7445
   7446		val = spec->dmic_ctl;
   7447		/* clear bit7 and bit5 to disable dmic */
   7448		val &= 0x5f;
   7449		snd_hda_codec_write(codec, spec->input_pins[0], 0,
   7450				    VENDOR_CHIPIO_DMIC_CTL_SET, val);
   7451
   7452		if (!(spec->dmic_ctl & 0x20))
   7453			chipio_set_control_flag(codec, CONTROL_FLAG_DMIC, 0);
   7454	}
   7455	ca0132_set_vipsource(codec, 1);
   7456	resume_mic1(codec, oldval);
   7457}
   7458
   7459/*
   7460 * Initialization for Digital Mic.
   7461 */
   7462static void ca0132_init_dmic(struct hda_codec *codec)
   7463{
   7464	struct ca0132_spec *spec = codec->spec;
   7465	u8 val;
   7466
   7467	/* Setup Digital Mic here, but don't enable.
   7468	 * Enable based on jack detect.
   7469	 */
   7470
   7471	/* MCLK uses MPIO1, set to enable.
   7472	 * Bit 2-0: MPIO select
   7473	 * Bit   3: set to disable
   7474	 * Bit 7-4: reserved
   7475	 */
   7476	val = 0x01;
   7477	snd_hda_codec_write(codec, spec->input_pins[0], 0,
   7478			    VENDOR_CHIPIO_DMIC_MCLK_SET, val);
   7479
   7480	/* Data1 uses MPIO3. Data2 not use
   7481	 * Bit 2-0: Data1 MPIO select
   7482	 * Bit   3: set disable Data1
   7483	 * Bit 6-4: Data2 MPIO select
   7484	 * Bit   7: set disable Data2
   7485	 */
   7486	val = 0x83;
   7487	snd_hda_codec_write(codec, spec->input_pins[0], 0,
   7488			    VENDOR_CHIPIO_DMIC_PIN_SET, val);
   7489
   7490	/* Use Ch-0 and Ch-1. Rate is 48K, mode 1. Disable DMic first.
   7491	 * Bit 3-0: Channel mask
   7492	 * Bit   4: set for 48KHz, clear for 32KHz
   7493	 * Bit   5: mode
   7494	 * Bit   6: set to select Data2, clear for Data1
   7495	 * Bit   7: set to enable DMic, clear for AMic
   7496	 */
   7497	if (ca0132_quirk(spec) == QUIRK_ALIENWARE_M17XR4)
   7498		val = 0x33;
   7499	else
   7500		val = 0x23;
   7501	/* keep a copy of dmic ctl val for enable/disable dmic purpuse */
   7502	spec->dmic_ctl = val;
   7503	snd_hda_codec_write(codec, spec->input_pins[0], 0,
   7504			    VENDOR_CHIPIO_DMIC_CTL_SET, val);
   7505}
   7506
   7507/*
   7508 * Initialization for Analog Mic 2
   7509 */
   7510static void ca0132_init_analog_mic2(struct hda_codec *codec)
   7511{
   7512	struct ca0132_spec *spec = codec->spec;
   7513
   7514	mutex_lock(&spec->chipio_mutex);
   7515
   7516	chipio_8051_write_exram_no_mutex(codec, 0x1920, 0x00);
   7517	chipio_8051_write_exram_no_mutex(codec, 0x192d, 0x00);
   7518
   7519	mutex_unlock(&spec->chipio_mutex);
   7520}
   7521
   7522static void ca0132_refresh_widget_caps(struct hda_codec *codec)
   7523{
   7524	struct ca0132_spec *spec = codec->spec;
   7525	int i;
   7526
   7527	codec_dbg(codec, "ca0132_refresh_widget_caps.\n");
   7528	snd_hda_codec_update_widgets(codec);
   7529
   7530	for (i = 0; i < spec->multiout.num_dacs; i++)
   7531		refresh_amp_caps(codec, spec->dacs[i], HDA_OUTPUT);
   7532
   7533	for (i = 0; i < spec->num_outputs; i++)
   7534		refresh_amp_caps(codec, spec->out_pins[i], HDA_OUTPUT);
   7535
   7536	for (i = 0; i < spec->num_inputs; i++) {
   7537		refresh_amp_caps(codec, spec->adcs[i], HDA_INPUT);
   7538		refresh_amp_caps(codec, spec->input_pins[i], HDA_INPUT);
   7539	}
   7540}
   7541
   7542
   7543/* If there is an active channel for some reason, find it and free it. */
   7544static void ca0132_alt_free_active_dma_channels(struct hda_codec *codec)
   7545{
   7546	unsigned int i, tmp;
   7547	int status;
   7548
   7549	/* Read active DSPDMAC channel register. */
   7550	status = chipio_read(codec, DSPDMAC_CHNLSTART_MODULE_OFFSET, &tmp);
   7551	if (status >= 0) {
   7552		/* AND against 0xfff to get the active channel bits. */
   7553		tmp = tmp & 0xfff;
   7554
   7555		/* If there are no active channels, nothing to free. */
   7556		if (!tmp)
   7557			return;
   7558	} else {
   7559		codec_dbg(codec, "%s: Failed to read active DSP DMA channel register.\n",
   7560				__func__);
   7561		return;
   7562	}
   7563
   7564	/*
   7565	 * Check each DSP DMA channel for activity, and if the channel is
   7566	 * active, free it.
   7567	 */
   7568	for (i = 0; i < DSPDMAC_DMA_CFG_CHANNEL_COUNT; i++) {
   7569		if (dsp_is_dma_active(codec, i)) {
   7570			status = dspio_free_dma_chan(codec, i);
   7571			if (status < 0)
   7572				codec_dbg(codec, "%s: Failed to free active DSP DMA channel %d.\n",
   7573						__func__, i);
   7574		}
   7575	}
   7576}
   7577
   7578/*
   7579 * In the case of CT_EXTENSIONS_ENABLE being set to 1, and the DSP being in
   7580 * use, audio is no longer routed directly to the DAC/ADC from the HDA stream.
   7581 * Instead, audio is now routed through the DSP's DMA controllers, which
   7582 * the DSP is tasked with setting up itself. Through debugging, it seems the
   7583 * cause of most of the no-audio on startup issues were due to improperly
   7584 * configured DSP DMA channels.
   7585 *
   7586 * Normally, the DSP configures these the first time an HDA audio stream is
   7587 * started post DSP firmware download. That is why creating a 'dummy' stream
   7588 * worked in fixing the audio in some cases. This works most of the time, but
   7589 * sometimes if a stream is started/stopped before the DSP can setup the DMA
   7590 * configuration registers, it ends up in a broken state. Issues can also
   7591 * arise if streams are started in an unusual order, i.e the audio output dma
   7592 * channel being sandwiched between the mic1 and mic2 dma channels.
   7593 *
   7594 * The solution to this is to make sure that the DSP has no DMA channels
   7595 * in use post DSP firmware download, and then to manually start each default
   7596 * DSP stream that uses the DMA channels. These are 0x0c, the audio output
   7597 * stream, 0x03, analog mic 1, and 0x04, analog mic 2.
   7598 */
   7599static void ca0132_alt_start_dsp_audio_streams(struct hda_codec *codec)
   7600{
   7601	static const unsigned int dsp_dma_stream_ids[] = { 0x0c, 0x03, 0x04 };
   7602	struct ca0132_spec *spec = codec->spec;
   7603	unsigned int i, tmp;
   7604
   7605	/*
   7606	 * Check if any of the default streams are active, and if they are,
   7607	 * stop them.
   7608	 */
   7609	mutex_lock(&spec->chipio_mutex);
   7610
   7611	for (i = 0; i < ARRAY_SIZE(dsp_dma_stream_ids); i++) {
   7612		chipio_get_stream_control(codec, dsp_dma_stream_ids[i], &tmp);
   7613
   7614		if (tmp) {
   7615			chipio_set_stream_control(codec,
   7616					dsp_dma_stream_ids[i], 0);
   7617		}
   7618	}
   7619
   7620	mutex_unlock(&spec->chipio_mutex);
   7621
   7622	/*
   7623	 * If all DSP streams are inactive, there should be no active DSP DMA
   7624	 * channels. Check and make sure this is the case, and if it isn't,
   7625	 * free any active channels.
   7626	 */
   7627	ca0132_alt_free_active_dma_channels(codec);
   7628
   7629	mutex_lock(&spec->chipio_mutex);
   7630
   7631	/* Make sure stream 0x0c is six channels. */
   7632	chipio_set_stream_channels(codec, 0x0c, 6);
   7633
   7634	for (i = 0; i < ARRAY_SIZE(dsp_dma_stream_ids); i++) {
   7635		chipio_set_stream_control(codec,
   7636				dsp_dma_stream_ids[i], 1);
   7637
   7638		/* Give the DSP some time to setup the DMA channel. */
   7639		msleep(75);
   7640	}
   7641
   7642	mutex_unlock(&spec->chipio_mutex);
   7643}
   7644
   7645/*
   7646 * The region of ChipIO memory from 0x190000-0x1903fc is a sort of 'audio
   7647 * router', where each entry represents a 48khz audio channel, with a format
   7648 * of an 8-bit destination, an 8-bit source, and an unknown 2-bit number
   7649 * value. The 2-bit number value is seemingly 0 if inactive, 1 if active,
   7650 * and 3 if it's using Sample Rate Converter ports.
   7651 * An example is:
   7652 * 0x0001f8c0
   7653 * In this case, f8 is the destination, and c0 is the source. The number value
   7654 * is 1.
   7655 * This region of memory is normally managed internally by the 8051, where
   7656 * the region of exram memory from 0x1477-0x1575 has each byte represent an
   7657 * entry within the 0x190000 range, and when a range of entries is in use, the
   7658 * ending value is overwritten with 0xff.
   7659 * 0x1578 in exram is a table of 0x25 entries, corresponding to the ChipIO
   7660 * streamID's, where each entry is a starting 0x190000 port offset.
   7661 * 0x159d in exram is the same as 0x1578, except it contains the ending port
   7662 * offset for the corresponding streamID.
   7663 *
   7664 * On certain cards, such as the SBZ/ZxR/AE7, these are originally setup by
   7665 * the 8051, then manually overwritten to remap the ports to work with the
   7666 * new DACs.
   7667 *
   7668 * Currently known portID's:
   7669 * 0x00-0x1f: HDA audio stream input/output ports.
   7670 * 0x80-0xbf: Sample rate converter input/outputs. Only valid ports seem to
   7671 *            have the lower-nibble set to 0x1, 0x2, and 0x9.
   7672 * 0xc0-0xdf: DSP DMA input/output ports. Dynamically assigned.
   7673 * 0xe0-0xff: DAC/ADC audio input/output ports.
   7674 *
   7675 * Currently known streamID's:
   7676 * 0x03: Mic1 ADC to DSP.
   7677 * 0x04: Mic2 ADC to DSP.
   7678 * 0x05: HDA node 0x02 audio stream to DSP.
   7679 * 0x0f: DSP Mic exit to HDA node 0x07.
   7680 * 0x0c: DSP processed audio to DACs.
   7681 * 0x14: DAC0, front L/R.
   7682 *
   7683 * It is possible to route the HDA audio streams directly to the DAC and
   7684 * bypass the DSP entirely, with the only downside being that since the DSP
   7685 * does volume control, the only volume control you'll get is through PCM on
   7686 * the PC side, in the same way volume is handled for optical out. This may be
   7687 * useful for debugging.
   7688 */
   7689static void chipio_remap_stream(struct hda_codec *codec,
   7690		const struct chipio_stream_remap_data *remap_data)
   7691{
   7692	unsigned int i, stream_offset;
   7693
   7694	/* Get the starting port for the stream to be remapped. */
   7695	chipio_8051_read_exram(codec, 0x1578 + remap_data->stream_id,
   7696			&stream_offset);
   7697
   7698	/*
   7699	 * Check if the stream's port value is 0xff, because the 8051 may not
   7700	 * have gotten around to setting up the stream yet. Wait until it's
   7701	 * setup to remap it's ports.
   7702	 */
   7703	if (stream_offset == 0xff) {
   7704		for (i = 0; i < 5; i++) {
   7705			msleep(25);
   7706
   7707			chipio_8051_read_exram(codec, 0x1578 + remap_data->stream_id,
   7708					&stream_offset);
   7709
   7710			if (stream_offset != 0xff)
   7711				break;
   7712		}
   7713	}
   7714
   7715	if (stream_offset == 0xff) {
   7716		codec_info(codec, "%s: Stream 0x%02x ports aren't allocated, remap failed!\n",
   7717				__func__, remap_data->stream_id);
   7718		return;
   7719	}
   7720
   7721	/* Offset isn't in bytes, its in 32-bit words, so multiply it by 4. */
   7722	stream_offset *= 0x04;
   7723	stream_offset += 0x190000;
   7724
   7725	for (i = 0; i < remap_data->count; i++) {
   7726		chipio_write_no_mutex(codec,
   7727				stream_offset + remap_data->offset[i],
   7728				remap_data->value[i]);
   7729	}
   7730
   7731	/* Update stream map configuration. */
   7732	chipio_write_no_mutex(codec, 0x19042c, 0x00000001);
   7733}
   7734
   7735/*
   7736 * Default speaker tuning values setup for alternative codecs.
   7737 */
   7738static const unsigned int sbz_default_delay_values[] = {
   7739	/* Non-zero values are floating point 0.000198. */
   7740	0x394f9e38, 0x394f9e38, 0x00000000, 0x00000000, 0x00000000, 0x00000000
   7741};
   7742
   7743static const unsigned int zxr_default_delay_values[] = {
   7744	/* Non-zero values are floating point 0.000220. */
   7745	0x00000000, 0x00000000, 0x3966afcd, 0x3966afcd, 0x3966afcd, 0x3966afcd
   7746};
   7747
   7748static const unsigned int ae5_default_delay_values[] = {
   7749	/* Non-zero values are floating point 0.000100. */
   7750	0x00000000, 0x00000000, 0x38d1b717, 0x38d1b717, 0x38d1b717, 0x38d1b717
   7751};
   7752
   7753/*
   7754 * If we never change these, probably only need them on initialization.
   7755 */
   7756static void ca0132_alt_init_speaker_tuning(struct hda_codec *codec)
   7757{
   7758	struct ca0132_spec *spec = codec->spec;
   7759	unsigned int i, tmp, start_req, end_req;
   7760	const unsigned int *values;
   7761
   7762	switch (ca0132_quirk(spec)) {
   7763	case QUIRK_SBZ:
   7764		values = sbz_default_delay_values;
   7765		break;
   7766	case QUIRK_ZXR:
   7767		values = zxr_default_delay_values;
   7768		break;
   7769	case QUIRK_AE5:
   7770	case QUIRK_AE7:
   7771		values = ae5_default_delay_values;
   7772		break;
   7773	default:
   7774		values = sbz_default_delay_values;
   7775		break;
   7776	}
   7777
   7778	tmp = FLOAT_ZERO;
   7779	dspio_set_uint_param(codec, 0x96, SPEAKER_TUNING_ENABLE_CENTER_EQ, tmp);
   7780
   7781	start_req = SPEAKER_TUNING_FRONT_LEFT_VOL_LEVEL;
   7782	end_req = SPEAKER_TUNING_REAR_RIGHT_VOL_LEVEL;
   7783	for (i = start_req; i < end_req + 1; i++)
   7784		dspio_set_uint_param(codec, 0x96, i, tmp);
   7785
   7786	start_req = SPEAKER_TUNING_FRONT_LEFT_INVERT;
   7787	end_req = SPEAKER_TUNING_REAR_RIGHT_INVERT;
   7788	for (i = start_req; i < end_req + 1; i++)
   7789		dspio_set_uint_param(codec, 0x96, i, tmp);
   7790
   7791
   7792	for (i = 0; i < 6; i++)
   7793		dspio_set_uint_param(codec, 0x96,
   7794				SPEAKER_TUNING_FRONT_LEFT_DELAY + i, values[i]);
   7795}
   7796
   7797/*
   7798 * Initialize mic for non-chromebook ca0132 implementations.
   7799 */
   7800static void ca0132_alt_init_analog_mics(struct hda_codec *codec)
   7801{
   7802	struct ca0132_spec *spec = codec->spec;
   7803	unsigned int tmp;
   7804
   7805	/* Mic 1 Setup */
   7806	chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_96_000);
   7807	chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_96_000);
   7808	if (ca0132_quirk(spec) == QUIRK_R3DI) {
   7809		chipio_set_conn_rate(codec, 0x0F, SR_96_000);
   7810		tmp = FLOAT_ONE;
   7811	} else
   7812		tmp = FLOAT_THREE;
   7813	dspio_set_uint_param(codec, 0x80, 0x00, tmp);
   7814
   7815	/* Mic 2 setup (not present on desktop cards) */
   7816	chipio_set_conn_rate(codec, MEM_CONNID_MICIN2, SR_96_000);
   7817	chipio_set_conn_rate(codec, MEM_CONNID_MICOUT2, SR_96_000);
   7818	if (ca0132_quirk(spec) == QUIRK_R3DI)
   7819		chipio_set_conn_rate(codec, 0x0F, SR_96_000);
   7820	tmp = FLOAT_ZERO;
   7821	dspio_set_uint_param(codec, 0x80, 0x01, tmp);
   7822}
   7823
   7824/*
   7825 * Sets the source of stream 0x14 to connpointID 0x48, and the destination
   7826 * connpointID to 0x91. If this isn't done, the destination is 0x71, and
   7827 * you get no sound. I'm guessing this has to do with the Sound Blaster Z
   7828 * having an updated DAC, which changes the destination to that DAC.
   7829 */
   7830static void sbz_connect_streams(struct hda_codec *codec)
   7831{
   7832	struct ca0132_spec *spec = codec->spec;
   7833
   7834	mutex_lock(&spec->chipio_mutex);
   7835
   7836	codec_dbg(codec, "Connect Streams entered, mutex locked and loaded.\n");
   7837
   7838	/* This value is 0x43 for 96khz, and 0x83 for 192khz. */
   7839	chipio_write_no_mutex(codec, 0x18a020, 0x00000043);
   7840
   7841	/* Setup stream 0x14 with it's source and destination points */
   7842	chipio_set_stream_source_dest(codec, 0x14, 0x48, 0x91);
   7843	chipio_set_conn_rate_no_mutex(codec, 0x48, SR_96_000);
   7844	chipio_set_conn_rate_no_mutex(codec, 0x91, SR_96_000);
   7845	chipio_set_stream_channels(codec, 0x14, 2);
   7846	chipio_set_stream_control(codec, 0x14, 1);
   7847
   7848	codec_dbg(codec, "Connect Streams exited, mutex released.\n");
   7849
   7850	mutex_unlock(&spec->chipio_mutex);
   7851}
   7852
   7853/*
   7854 * Write data through ChipIO to setup proper stream destinations.
   7855 * Not sure how it exactly works, but it seems to direct data
   7856 * to different destinations. Example is f8 to c0, e0 to c0.
   7857 * All I know is, if you don't set these, you get no sound.
   7858 */
   7859static void sbz_chipio_startup_data(struct hda_codec *codec)
   7860{
   7861	const struct chipio_stream_remap_data *dsp_out_remap_data;
   7862	struct ca0132_spec *spec = codec->spec;
   7863
   7864	mutex_lock(&spec->chipio_mutex);
   7865	codec_dbg(codec, "Startup Data entered, mutex locked and loaded.\n");
   7866
   7867	/* Remap DAC0's output ports. */
   7868	chipio_remap_stream(codec, &stream_remap_data[0]);
   7869
   7870	/* Remap DSP audio output stream ports. */
   7871	switch (ca0132_quirk(spec)) {
   7872	case QUIRK_SBZ:
   7873		dsp_out_remap_data = &stream_remap_data[1];
   7874		break;
   7875
   7876	case QUIRK_ZXR:
   7877		dsp_out_remap_data = &stream_remap_data[2];
   7878		break;
   7879
   7880	default:
   7881		dsp_out_remap_data = NULL;
   7882		break;
   7883	}
   7884
   7885	if (dsp_out_remap_data)
   7886		chipio_remap_stream(codec, dsp_out_remap_data);
   7887
   7888	codec_dbg(codec, "Startup Data exited, mutex released.\n");
   7889	mutex_unlock(&spec->chipio_mutex);
   7890}
   7891
   7892static void ca0132_alt_dsp_initial_mic_setup(struct hda_codec *codec)
   7893{
   7894	struct ca0132_spec *spec = codec->spec;
   7895	unsigned int tmp;
   7896
   7897	chipio_set_stream_control(codec, 0x03, 0);
   7898	chipio_set_stream_control(codec, 0x04, 0);
   7899
   7900	chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_96_000);
   7901	chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_96_000);
   7902
   7903	tmp = FLOAT_THREE;
   7904	dspio_set_uint_param(codec, 0x80, 0x00, tmp);
   7905
   7906	chipio_set_stream_control(codec, 0x03, 1);
   7907	chipio_set_stream_control(codec, 0x04, 1);
   7908
   7909	switch (ca0132_quirk(spec)) {
   7910	case QUIRK_SBZ:
   7911		chipio_write(codec, 0x18b098, 0x0000000c);
   7912		chipio_write(codec, 0x18b09C, 0x0000000c);
   7913		break;
   7914	case QUIRK_AE5:
   7915		chipio_write(codec, 0x18b098, 0x0000000c);
   7916		chipio_write(codec, 0x18b09c, 0x0000004c);
   7917		break;
   7918	default:
   7919		break;
   7920	}
   7921}
   7922
   7923static void ae5_post_dsp_register_set(struct hda_codec *codec)
   7924{
   7925	struct ca0132_spec *spec = codec->spec;
   7926
   7927	chipio_8051_write_direct(codec, 0x93, 0x10);
   7928	chipio_8051_write_pll_pmu(codec, 0x44, 0xc2);
   7929
   7930	writeb(0xff, spec->mem_base + 0x304);
   7931	writeb(0xff, spec->mem_base + 0x304);
   7932	writeb(0xff, spec->mem_base + 0x304);
   7933	writeb(0xff, spec->mem_base + 0x304);
   7934	writeb(0x00, spec->mem_base + 0x100);
   7935	writeb(0xff, spec->mem_base + 0x304);
   7936	writeb(0x00, spec->mem_base + 0x100);
   7937	writeb(0xff, spec->mem_base + 0x304);
   7938	writeb(0x00, spec->mem_base + 0x100);
   7939	writeb(0xff, spec->mem_base + 0x304);
   7940	writeb(0x00, spec->mem_base + 0x100);
   7941	writeb(0xff, spec->mem_base + 0x304);
   7942
   7943	ca0113_mmio_command_set(codec, 0x30, 0x2b, 0x3f);
   7944	ca0113_mmio_command_set(codec, 0x30, 0x2d, 0x3f);
   7945	ca0113_mmio_command_set(codec, 0x48, 0x07, 0x83);
   7946}
   7947
   7948static void ae5_post_dsp_param_setup(struct hda_codec *codec)
   7949{
   7950	/*
   7951	 * Param3 in the 8051's memory is represented by the ascii string 'mch'
   7952	 * which seems to be 'multichannel'. This is also mentioned in the
   7953	 * AE-5's registry values in Windows.
   7954	 */
   7955	chipio_set_control_param(codec, 3, 0);
   7956	/*
   7957	 * I believe ASI is 'audio serial interface' and that it's used to
   7958	 * change colors on the external LED strip connected to the AE-5.
   7959	 */
   7960	chipio_set_control_flag(codec, CONTROL_FLAG_ASI_96KHZ, 1);
   7961
   7962	snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0, 0x724, 0x83);
   7963	chipio_set_control_param(codec, CONTROL_PARAM_ASI, 0);
   7964
   7965	chipio_8051_write_exram(codec, 0xfa92, 0x22);
   7966}
   7967
   7968static void ae5_post_dsp_pll_setup(struct hda_codec *codec)
   7969{
   7970	chipio_8051_write_pll_pmu(codec, 0x41, 0xc8);
   7971	chipio_8051_write_pll_pmu(codec, 0x45, 0xcc);
   7972	chipio_8051_write_pll_pmu(codec, 0x40, 0xcb);
   7973	chipio_8051_write_pll_pmu(codec, 0x43, 0xc7);
   7974	chipio_8051_write_pll_pmu(codec, 0x51, 0x8d);
   7975}
   7976
   7977static void ae5_post_dsp_stream_setup(struct hda_codec *codec)
   7978{
   7979	struct ca0132_spec *spec = codec->spec;
   7980
   7981	mutex_lock(&spec->chipio_mutex);
   7982
   7983	snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0, 0x725, 0x81);
   7984
   7985	chipio_set_conn_rate_no_mutex(codec, 0x70, SR_96_000);
   7986
   7987	chipio_set_stream_source_dest(codec, 0x5, 0x43, 0x0);
   7988
   7989	chipio_set_stream_source_dest(codec, 0x18, 0x9, 0xd0);
   7990	chipio_set_conn_rate_no_mutex(codec, 0xd0, SR_96_000);
   7991	chipio_set_stream_channels(codec, 0x18, 6);
   7992	chipio_set_stream_control(codec, 0x18, 1);
   7993
   7994	chipio_set_control_param_no_mutex(codec, CONTROL_PARAM_ASI, 4);
   7995
   7996	chipio_8051_write_pll_pmu_no_mutex(codec, 0x43, 0xc7);
   7997
   7998	ca0113_mmio_command_set(codec, 0x48, 0x01, 0x80);
   7999
   8000	mutex_unlock(&spec->chipio_mutex);
   8001}
   8002
   8003static void ae5_post_dsp_startup_data(struct hda_codec *codec)
   8004{
   8005	struct ca0132_spec *spec = codec->spec;
   8006
   8007	mutex_lock(&spec->chipio_mutex);
   8008
   8009	chipio_write_no_mutex(codec, 0x189000, 0x0001f101);
   8010	chipio_write_no_mutex(codec, 0x189004, 0x0001f101);
   8011	chipio_write_no_mutex(codec, 0x189024, 0x00014004);
   8012	chipio_write_no_mutex(codec, 0x189028, 0x0002000f);
   8013
   8014	ca0113_mmio_command_set(codec, 0x48, 0x0a, 0x05);
   8015	chipio_set_control_param_no_mutex(codec, CONTROL_PARAM_ASI, 7);
   8016	ca0113_mmio_command_set(codec, 0x48, 0x0b, 0x12);
   8017	ca0113_mmio_command_set(codec, 0x48, 0x04, 0x00);
   8018	ca0113_mmio_command_set(codec, 0x48, 0x06, 0x48);
   8019	ca0113_mmio_command_set(codec, 0x48, 0x0a, 0x05);
   8020	ca0113_mmio_command_set(codec, 0x48, 0x07, 0x83);
   8021	ca0113_mmio_command_set(codec, 0x48, 0x0f, 0x00);
   8022	ca0113_mmio_command_set(codec, 0x48, 0x10, 0x00);
   8023	ca0113_mmio_gpio_set(codec, 0, true);
   8024	ca0113_mmio_gpio_set(codec, 1, true);
   8025	ca0113_mmio_command_set(codec, 0x48, 0x07, 0x80);
   8026
   8027	chipio_write_no_mutex(codec, 0x18b03c, 0x00000012);
   8028
   8029	ca0113_mmio_command_set(codec, 0x48, 0x0f, 0x00);
   8030	ca0113_mmio_command_set(codec, 0x48, 0x10, 0x00);
   8031
   8032	mutex_unlock(&spec->chipio_mutex);
   8033}
   8034
   8035static void ae7_post_dsp_setup_ports(struct hda_codec *codec)
   8036{
   8037	struct ca0132_spec *spec = codec->spec;
   8038
   8039	mutex_lock(&spec->chipio_mutex);
   8040
   8041	/* Seems to share the same port remapping as the SBZ. */
   8042	chipio_remap_stream(codec, &stream_remap_data[1]);
   8043
   8044	ca0113_mmio_command_set(codec, 0x30, 0x30, 0x00);
   8045	ca0113_mmio_command_set(codec, 0x48, 0x0d, 0x40);
   8046	ca0113_mmio_command_set(codec, 0x48, 0x17, 0x00);
   8047	ca0113_mmio_command_set(codec, 0x48, 0x19, 0x00);
   8048	ca0113_mmio_command_set(codec, 0x48, 0x11, 0xff);
   8049	ca0113_mmio_command_set(codec, 0x48, 0x12, 0xff);
   8050	ca0113_mmio_command_set(codec, 0x48, 0x13, 0xff);
   8051	ca0113_mmio_command_set(codec, 0x48, 0x14, 0x7f);
   8052
   8053	mutex_unlock(&spec->chipio_mutex);
   8054}
   8055
   8056static void ae7_post_dsp_asi_stream_setup(struct hda_codec *codec)
   8057{
   8058	struct ca0132_spec *spec = codec->spec;
   8059
   8060	mutex_lock(&spec->chipio_mutex);
   8061
   8062	snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0, 0x725, 0x81);
   8063	ca0113_mmio_command_set(codec, 0x30, 0x2b, 0x00);
   8064
   8065	chipio_set_conn_rate_no_mutex(codec, 0x70, SR_96_000);
   8066
   8067	chipio_set_stream_source_dest(codec, 0x05, 0x43, 0x00);
   8068	chipio_set_stream_source_dest(codec, 0x18, 0x09, 0xd0);
   8069
   8070	chipio_set_conn_rate_no_mutex(codec, 0xd0, SR_96_000);
   8071	chipio_set_stream_channels(codec, 0x18, 6);
   8072	chipio_set_stream_control(codec, 0x18, 1);
   8073
   8074	chipio_set_control_param_no_mutex(codec, CONTROL_PARAM_ASI, 4);
   8075
   8076	mutex_unlock(&spec->chipio_mutex);
   8077}
   8078
   8079static void ae7_post_dsp_pll_setup(struct hda_codec *codec)
   8080{
   8081	static const unsigned int addr[] = {
   8082		0x41, 0x45, 0x40, 0x43, 0x51
   8083	};
   8084	static const unsigned int data[] = {
   8085		0xc8, 0xcc, 0xcb, 0xc7, 0x8d
   8086	};
   8087	unsigned int i;
   8088
   8089	for (i = 0; i < ARRAY_SIZE(addr); i++)
   8090		chipio_8051_write_pll_pmu_no_mutex(codec, addr[i], data[i]);
   8091}
   8092
   8093static void ae7_post_dsp_asi_setup_ports(struct hda_codec *codec)
   8094{
   8095	struct ca0132_spec *spec = codec->spec;
   8096	static const unsigned int target[] = {
   8097		0x0b, 0x04, 0x06, 0x0a, 0x0c, 0x11, 0x12, 0x13, 0x14
   8098	};
   8099	static const unsigned int data[] = {
   8100		0x12, 0x00, 0x48, 0x05, 0x5f, 0xff, 0xff, 0xff, 0x7f
   8101	};
   8102	unsigned int i;
   8103
   8104	mutex_lock(&spec->chipio_mutex);
   8105
   8106	chipio_8051_write_pll_pmu_no_mutex(codec, 0x43, 0xc7);
   8107
   8108	chipio_write_no_mutex(codec, 0x189000, 0x0001f101);
   8109	chipio_write_no_mutex(codec, 0x189004, 0x0001f101);
   8110	chipio_write_no_mutex(codec, 0x189024, 0x00014004);
   8111	chipio_write_no_mutex(codec, 0x189028, 0x0002000f);
   8112
   8113	ae7_post_dsp_pll_setup(codec);
   8114	chipio_set_control_param_no_mutex(codec, CONTROL_PARAM_ASI, 7);
   8115
   8116	for (i = 0; i < ARRAY_SIZE(target); i++)
   8117		ca0113_mmio_command_set(codec, 0x48, target[i], data[i]);
   8118
   8119	ca0113_mmio_command_set_type2(codec, 0x48, 0x07, 0x83);
   8120	ca0113_mmio_command_set(codec, 0x48, 0x0f, 0x00);
   8121	ca0113_mmio_command_set(codec, 0x48, 0x10, 0x00);
   8122
   8123	chipio_set_stream_source_dest(codec, 0x21, 0x64, 0x56);
   8124	chipio_set_stream_channels(codec, 0x21, 2);
   8125	chipio_set_conn_rate_no_mutex(codec, 0x56, SR_8_000);
   8126
   8127	chipio_set_control_param_no_mutex(codec, CONTROL_PARAM_NODE_ID, 0x09);
   8128	/*
   8129	 * In the 8051's memory, this param is referred to as 'n2sid', which I
   8130	 * believe is 'node to streamID'. It seems to be a way to assign a
   8131	 * stream to a given HDA node.
   8132	 */
   8133	chipio_set_control_param_no_mutex(codec, 0x20, 0x21);
   8134
   8135	chipio_write_no_mutex(codec, 0x18b038, 0x00000088);
   8136
   8137	/*
   8138	 * Now, at this point on Windows, an actual stream is setup and
   8139	 * seemingly sends data to the HDA node 0x09, which is the digital
   8140	 * audio input node. This is left out here, because obviously I don't
   8141	 * know what data is being sent. Interestingly, the AE-5 seems to go
   8142	 * through the motions of getting here and never actually takes this
   8143	 * step, but the AE-7 does.
   8144	 */
   8145
   8146	ca0113_mmio_gpio_set(codec, 0, 1);
   8147	ca0113_mmio_gpio_set(codec, 1, 1);
   8148
   8149	ca0113_mmio_command_set_type2(codec, 0x48, 0x07, 0x83);
   8150	chipio_write_no_mutex(codec, 0x18b03c, 0x00000000);
   8151	ca0113_mmio_command_set(codec, 0x48, 0x0f, 0x00);
   8152	ca0113_mmio_command_set(codec, 0x48, 0x10, 0x00);
   8153
   8154	chipio_set_stream_source_dest(codec, 0x05, 0x43, 0x00);
   8155	chipio_set_stream_source_dest(codec, 0x18, 0x09, 0xd0);
   8156
   8157	chipio_set_conn_rate_no_mutex(codec, 0xd0, SR_96_000);
   8158	chipio_set_stream_channels(codec, 0x18, 6);
   8159
   8160	/*
   8161	 * Runs again, this has been repeated a few times, but I'm just
   8162	 * following what the Windows driver does.
   8163	 */
   8164	ae7_post_dsp_pll_setup(codec);
   8165	chipio_set_control_param_no_mutex(codec, CONTROL_PARAM_ASI, 7);
   8166
   8167	mutex_unlock(&spec->chipio_mutex);
   8168}
   8169
   8170/*
   8171 * The Windows driver has commands that seem to setup ASI, which I believe to
   8172 * be some sort of audio serial interface. My current speculation is that it's
   8173 * related to communicating with the new DAC.
   8174 */
   8175static void ae7_post_dsp_asi_setup(struct hda_codec *codec)
   8176{
   8177	chipio_8051_write_direct(codec, 0x93, 0x10);
   8178
   8179	chipio_8051_write_pll_pmu(codec, 0x44, 0xc2);
   8180
   8181	ca0113_mmio_command_set_type2(codec, 0x48, 0x07, 0x83);
   8182	ca0113_mmio_command_set(codec, 0x30, 0x2e, 0x3f);
   8183
   8184	chipio_set_control_param(codec, 3, 3);
   8185	chipio_set_control_flag(codec, CONTROL_FLAG_ASI_96KHZ, 1);
   8186
   8187	snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0, 0x724, 0x83);
   8188	chipio_set_control_param(codec, CONTROL_PARAM_ASI, 0);
   8189	snd_hda_codec_write(codec, 0x17, 0, 0x794, 0x00);
   8190
   8191	chipio_8051_write_exram(codec, 0xfa92, 0x22);
   8192
   8193	ae7_post_dsp_pll_setup(codec);
   8194	ae7_post_dsp_asi_stream_setup(codec);
   8195
   8196	chipio_8051_write_pll_pmu(codec, 0x43, 0xc7);
   8197
   8198	ae7_post_dsp_asi_setup_ports(codec);
   8199}
   8200
   8201/*
   8202 * Setup default parameters for DSP
   8203 */
   8204static void ca0132_setup_defaults(struct hda_codec *codec)
   8205{
   8206	struct ca0132_spec *spec = codec->spec;
   8207	unsigned int tmp;
   8208	int num_fx;
   8209	int idx, i;
   8210
   8211	if (spec->dsp_state != DSP_DOWNLOADED)
   8212		return;
   8213
   8214	/* out, in effects + voicefx */
   8215	num_fx = OUT_EFFECTS_COUNT + IN_EFFECTS_COUNT + 1;
   8216	for (idx = 0; idx < num_fx; idx++) {
   8217		for (i = 0; i <= ca0132_effects[idx].params; i++) {
   8218			dspio_set_uint_param(codec, ca0132_effects[idx].mid,
   8219					     ca0132_effects[idx].reqs[i],
   8220					     ca0132_effects[idx].def_vals[i]);
   8221		}
   8222	}
   8223
   8224	/*remove DSP headroom*/
   8225	tmp = FLOAT_ZERO;
   8226	dspio_set_uint_param(codec, 0x96, 0x3C, tmp);
   8227
   8228	/*set speaker EQ bypass attenuation*/
   8229	dspio_set_uint_param(codec, 0x8f, 0x01, tmp);
   8230
   8231	/* set AMic1 and AMic2 as mono mic */
   8232	tmp = FLOAT_ONE;
   8233	dspio_set_uint_param(codec, 0x80, 0x00, tmp);
   8234	dspio_set_uint_param(codec, 0x80, 0x01, tmp);
   8235
   8236	/* set AMic1 as CrystalVoice input */
   8237	tmp = FLOAT_ONE;
   8238	dspio_set_uint_param(codec, 0x80, 0x05, tmp);
   8239
   8240	/* set WUH source */
   8241	tmp = FLOAT_TWO;
   8242	dspio_set_uint_param(codec, 0x31, 0x00, tmp);
   8243}
   8244
   8245/*
   8246 * Setup default parameters for Recon3D/Recon3Di DSP.
   8247 */
   8248
   8249static void r3d_setup_defaults(struct hda_codec *codec)
   8250{
   8251	struct ca0132_spec *spec = codec->spec;
   8252	unsigned int tmp;
   8253	int num_fx;
   8254	int idx, i;
   8255
   8256	if (spec->dsp_state != DSP_DOWNLOADED)
   8257		return;
   8258
   8259	ca0132_alt_init_analog_mics(codec);
   8260	ca0132_alt_start_dsp_audio_streams(codec);
   8261
   8262	/*remove DSP headroom*/
   8263	tmp = FLOAT_ZERO;
   8264	dspio_set_uint_param(codec, 0x96, 0x3C, tmp);
   8265
   8266	/* set WUH source */
   8267	tmp = FLOAT_TWO;
   8268	dspio_set_uint_param(codec, 0x31, 0x00, tmp);
   8269	chipio_set_conn_rate(codec, MEM_CONNID_WUH, SR_48_000);
   8270
   8271	/* Set speaker source? */
   8272	dspio_set_uint_param(codec, 0x32, 0x00, tmp);
   8273
   8274	if (ca0132_quirk(spec) == QUIRK_R3DI)
   8275		r3di_gpio_dsp_status_set(codec, R3DI_DSP_DOWNLOADED);
   8276
   8277	/* Disable mute on Center/LFE. */
   8278	if (ca0132_quirk(spec) == QUIRK_R3D) {
   8279		ca0113_mmio_gpio_set(codec, 2, false);
   8280		ca0113_mmio_gpio_set(codec, 4, true);
   8281	}
   8282
   8283	/* Setup effect defaults */
   8284	num_fx = OUT_EFFECTS_COUNT + IN_EFFECTS_COUNT + 1;
   8285	for (idx = 0; idx < num_fx; idx++) {
   8286		for (i = 0; i <= ca0132_effects[idx].params; i++) {
   8287			dspio_set_uint_param(codec,
   8288					ca0132_effects[idx].mid,
   8289					ca0132_effects[idx].reqs[i],
   8290					ca0132_effects[idx].def_vals[i]);
   8291		}
   8292	}
   8293}
   8294
   8295/*
   8296 * Setup default parameters for the Sound Blaster Z DSP. A lot more going on
   8297 * than the Chromebook setup.
   8298 */
   8299static void sbz_setup_defaults(struct hda_codec *codec)
   8300{
   8301	struct ca0132_spec *spec = codec->spec;
   8302	unsigned int tmp;
   8303	int num_fx;
   8304	int idx, i;
   8305
   8306	if (spec->dsp_state != DSP_DOWNLOADED)
   8307		return;
   8308
   8309	ca0132_alt_init_analog_mics(codec);
   8310	ca0132_alt_start_dsp_audio_streams(codec);
   8311	sbz_connect_streams(codec);
   8312	sbz_chipio_startup_data(codec);
   8313
   8314	/*
   8315	 * Sets internal input loopback to off, used to have a switch to
   8316	 * enable input loopback, but turned out to be way too buggy.
   8317	 */
   8318	tmp = FLOAT_ONE;
   8319	dspio_set_uint_param(codec, 0x37, 0x08, tmp);
   8320	dspio_set_uint_param(codec, 0x37, 0x10, tmp);
   8321
   8322	/*remove DSP headroom*/
   8323	tmp = FLOAT_ZERO;
   8324	dspio_set_uint_param(codec, 0x96, 0x3C, tmp);
   8325
   8326	/* set WUH source */
   8327	tmp = FLOAT_TWO;
   8328	dspio_set_uint_param(codec, 0x31, 0x00, tmp);
   8329	chipio_set_conn_rate(codec, MEM_CONNID_WUH, SR_48_000);
   8330
   8331	/* Set speaker source? */
   8332	dspio_set_uint_param(codec, 0x32, 0x00, tmp);
   8333
   8334	ca0132_alt_dsp_initial_mic_setup(codec);
   8335
   8336	/* out, in effects + voicefx */
   8337	num_fx = OUT_EFFECTS_COUNT + IN_EFFECTS_COUNT + 1;
   8338	for (idx = 0; idx < num_fx; idx++) {
   8339		for (i = 0; i <= ca0132_effects[idx].params; i++) {
   8340			dspio_set_uint_param(codec,
   8341					ca0132_effects[idx].mid,
   8342					ca0132_effects[idx].reqs[i],
   8343					ca0132_effects[idx].def_vals[i]);
   8344		}
   8345	}
   8346
   8347	ca0132_alt_init_speaker_tuning(codec);
   8348}
   8349
   8350/*
   8351 * Setup default parameters for the Sound BlasterX AE-5 DSP.
   8352 */
   8353static void ae5_setup_defaults(struct hda_codec *codec)
   8354{
   8355	struct ca0132_spec *spec = codec->spec;
   8356	unsigned int tmp;
   8357	int num_fx;
   8358	int idx, i;
   8359
   8360	if (spec->dsp_state != DSP_DOWNLOADED)
   8361		return;
   8362
   8363	ca0132_alt_init_analog_mics(codec);
   8364	ca0132_alt_start_dsp_audio_streams(codec);
   8365
   8366	/* New, unknown SCP req's */
   8367	tmp = FLOAT_ZERO;
   8368	dspio_set_uint_param(codec, 0x96, 0x29, tmp);
   8369	dspio_set_uint_param(codec, 0x96, 0x2a, tmp);
   8370	dspio_set_uint_param(codec, 0x80, 0x0d, tmp);
   8371	dspio_set_uint_param(codec, 0x80, 0x0e, tmp);
   8372
   8373	ca0113_mmio_command_set(codec, 0x30, 0x2e, 0x3f);
   8374	ca0113_mmio_gpio_set(codec, 0, false);
   8375	ca0113_mmio_command_set(codec, 0x30, 0x28, 0x00);
   8376
   8377	/* Internal loopback off */
   8378	tmp = FLOAT_ONE;
   8379	dspio_set_uint_param(codec, 0x37, 0x08, tmp);
   8380	dspio_set_uint_param(codec, 0x37, 0x10, tmp);
   8381
   8382	/*remove DSP headroom*/
   8383	tmp = FLOAT_ZERO;
   8384	dspio_set_uint_param(codec, 0x96, 0x3C, tmp);
   8385
   8386	/* set WUH source */
   8387	tmp = FLOAT_TWO;
   8388	dspio_set_uint_param(codec, 0x31, 0x00, tmp);
   8389	chipio_set_conn_rate(codec, MEM_CONNID_WUH, SR_48_000);
   8390
   8391	/* Set speaker source? */
   8392	dspio_set_uint_param(codec, 0x32, 0x00, tmp);
   8393
   8394	ca0132_alt_dsp_initial_mic_setup(codec);
   8395	ae5_post_dsp_register_set(codec);
   8396	ae5_post_dsp_param_setup(codec);
   8397	ae5_post_dsp_pll_setup(codec);
   8398	ae5_post_dsp_stream_setup(codec);
   8399	ae5_post_dsp_startup_data(codec);
   8400
   8401	/* out, in effects + voicefx */
   8402	num_fx = OUT_EFFECTS_COUNT + IN_EFFECTS_COUNT + 1;
   8403	for (idx = 0; idx < num_fx; idx++) {
   8404		for (i = 0; i <= ca0132_effects[idx].params; i++) {
   8405			dspio_set_uint_param(codec,
   8406					ca0132_effects[idx].mid,
   8407					ca0132_effects[idx].reqs[i],
   8408					ca0132_effects[idx].def_vals[i]);
   8409		}
   8410	}
   8411
   8412	ca0132_alt_init_speaker_tuning(codec);
   8413}
   8414
   8415/*
   8416 * Setup default parameters for the Sound Blaster AE-7 DSP.
   8417 */
   8418static void ae7_setup_defaults(struct hda_codec *codec)
   8419{
   8420	struct ca0132_spec *spec = codec->spec;
   8421	unsigned int tmp;
   8422	int num_fx;
   8423	int idx, i;
   8424
   8425	if (spec->dsp_state != DSP_DOWNLOADED)
   8426		return;
   8427
   8428	ca0132_alt_init_analog_mics(codec);
   8429	ca0132_alt_start_dsp_audio_streams(codec);
   8430	ae7_post_dsp_setup_ports(codec);
   8431
   8432	tmp = FLOAT_ZERO;
   8433	dspio_set_uint_param(codec, 0x96,
   8434			SPEAKER_TUNING_FRONT_LEFT_INVERT, tmp);
   8435	dspio_set_uint_param(codec, 0x96,
   8436			SPEAKER_TUNING_FRONT_RIGHT_INVERT, tmp);
   8437
   8438	ca0113_mmio_command_set(codec, 0x30, 0x2e, 0x3f);
   8439
   8440	/* New, unknown SCP req's */
   8441	dspio_set_uint_param(codec, 0x80, 0x0d, tmp);
   8442	dspio_set_uint_param(codec, 0x80, 0x0e, tmp);
   8443
   8444	ca0113_mmio_gpio_set(codec, 0, false);
   8445
   8446	/* Internal loopback off */
   8447	tmp = FLOAT_ONE;
   8448	dspio_set_uint_param(codec, 0x37, 0x08, tmp);
   8449	dspio_set_uint_param(codec, 0x37, 0x10, tmp);
   8450
   8451	/*remove DSP headroom*/
   8452	tmp = FLOAT_ZERO;
   8453	dspio_set_uint_param(codec, 0x96, 0x3C, tmp);
   8454
   8455	/* set WUH source */
   8456	tmp = FLOAT_TWO;
   8457	dspio_set_uint_param(codec, 0x31, 0x00, tmp);
   8458	chipio_set_conn_rate(codec, MEM_CONNID_WUH, SR_48_000);
   8459
   8460	/* Set speaker source? */
   8461	dspio_set_uint_param(codec, 0x32, 0x00, tmp);
   8462	ca0113_mmio_command_set(codec, 0x30, 0x28, 0x00);
   8463
   8464	/*
   8465	 * This is the second time we've called this, but this is seemingly
   8466	 * what Windows does.
   8467	 */
   8468	ca0132_alt_init_analog_mics(codec);
   8469
   8470	ae7_post_dsp_asi_setup(codec);
   8471
   8472	/*
   8473	 * Not sure why, but these are both set to 1. They're only set to 0
   8474	 * upon shutdown.
   8475	 */
   8476	ca0113_mmio_gpio_set(codec, 0, true);
   8477	ca0113_mmio_gpio_set(codec, 1, true);
   8478
   8479	/* Volume control related. */
   8480	ca0113_mmio_command_set(codec, 0x48, 0x0f, 0x04);
   8481	ca0113_mmio_command_set(codec, 0x48, 0x10, 0x04);
   8482	ca0113_mmio_command_set_type2(codec, 0x48, 0x07, 0x80);
   8483
   8484	/* out, in effects + voicefx */
   8485	num_fx = OUT_EFFECTS_COUNT + IN_EFFECTS_COUNT + 1;
   8486	for (idx = 0; idx < num_fx; idx++) {
   8487		for (i = 0; i <= ca0132_effects[idx].params; i++) {
   8488			dspio_set_uint_param(codec,
   8489					ca0132_effects[idx].mid,
   8490					ca0132_effects[idx].reqs[i],
   8491					ca0132_effects[idx].def_vals[i]);
   8492		}
   8493	}
   8494
   8495	ca0132_alt_init_speaker_tuning(codec);
   8496}
   8497
   8498/*
   8499 * Initialization of flags in chip
   8500 */
   8501static void ca0132_init_flags(struct hda_codec *codec)
   8502{
   8503	struct ca0132_spec *spec = codec->spec;
   8504
   8505	if (ca0132_use_alt_functions(spec)) {
   8506		chipio_set_control_flag(codec, CONTROL_FLAG_DSP_96KHZ, 1);
   8507		chipio_set_control_flag(codec, CONTROL_FLAG_DAC_96KHZ, 1);
   8508		chipio_set_control_flag(codec, CONTROL_FLAG_ADC_B_96KHZ, 1);
   8509		chipio_set_control_flag(codec, CONTROL_FLAG_ADC_C_96KHZ, 1);
   8510		chipio_set_control_flag(codec, CONTROL_FLAG_SRC_RATE_96KHZ, 1);
   8511		chipio_set_control_flag(codec, CONTROL_FLAG_IDLE_ENABLE, 0);
   8512		chipio_set_control_flag(codec, CONTROL_FLAG_SPDIF2OUT, 0);
   8513		chipio_set_control_flag(codec,
   8514				CONTROL_FLAG_PORT_D_10KOHM_LOAD, 0);
   8515		chipio_set_control_flag(codec,
   8516				CONTROL_FLAG_PORT_A_10KOHM_LOAD, 1);
   8517	} else {
   8518		chipio_set_control_flag(codec, CONTROL_FLAG_IDLE_ENABLE, 0);
   8519		chipio_set_control_flag(codec,
   8520				CONTROL_FLAG_PORT_A_COMMON_MODE, 0);
   8521		chipio_set_control_flag(codec,
   8522				CONTROL_FLAG_PORT_D_COMMON_MODE, 0);
   8523		chipio_set_control_flag(codec,
   8524				CONTROL_FLAG_PORT_A_10KOHM_LOAD, 0);
   8525		chipio_set_control_flag(codec,
   8526				CONTROL_FLAG_PORT_D_10KOHM_LOAD, 0);
   8527		chipio_set_control_flag(codec, CONTROL_FLAG_ADC_C_HIGH_PASS, 1);
   8528	}
   8529}
   8530
   8531/*
   8532 * Initialization of parameters in chip
   8533 */
   8534static void ca0132_init_params(struct hda_codec *codec)
   8535{
   8536	struct ca0132_spec *spec = codec->spec;
   8537
   8538	if (ca0132_use_alt_functions(spec)) {
   8539		chipio_set_conn_rate(codec, MEM_CONNID_WUH, SR_48_000);
   8540		chipio_set_conn_rate(codec, 0x0B, SR_48_000);
   8541		chipio_set_control_param(codec, CONTROL_PARAM_SPDIF1_SOURCE, 0);
   8542		chipio_set_control_param(codec, 0, 0);
   8543		chipio_set_control_param(codec, CONTROL_PARAM_VIP_SOURCE, 0);
   8544	}
   8545
   8546	chipio_set_control_param(codec, CONTROL_PARAM_PORTA_160OHM_GAIN, 6);
   8547	chipio_set_control_param(codec, CONTROL_PARAM_PORTD_160OHM_GAIN, 6);
   8548}
   8549
   8550static void ca0132_set_dsp_msr(struct hda_codec *codec, bool is96k)
   8551{
   8552	chipio_set_control_flag(codec, CONTROL_FLAG_DSP_96KHZ, is96k);
   8553	chipio_set_control_flag(codec, CONTROL_FLAG_DAC_96KHZ, is96k);
   8554	chipio_set_control_flag(codec, CONTROL_FLAG_SRC_RATE_96KHZ, is96k);
   8555	chipio_set_control_flag(codec, CONTROL_FLAG_SRC_CLOCK_196MHZ, is96k);
   8556	chipio_set_control_flag(codec, CONTROL_FLAG_ADC_B_96KHZ, is96k);
   8557	chipio_set_control_flag(codec, CONTROL_FLAG_ADC_C_96KHZ, is96k);
   8558
   8559	chipio_set_conn_rate(codec, MEM_CONNID_MICIN1, SR_96_000);
   8560	chipio_set_conn_rate(codec, MEM_CONNID_MICOUT1, SR_96_000);
   8561	chipio_set_conn_rate(codec, MEM_CONNID_WUH, SR_48_000);
   8562}
   8563
   8564static bool ca0132_download_dsp_images(struct hda_codec *codec)
   8565{
   8566	bool dsp_loaded = false;
   8567	struct ca0132_spec *spec = codec->spec;
   8568	const struct dsp_image_seg *dsp_os_image;
   8569	const struct firmware *fw_entry = NULL;
   8570	/*
   8571	 * Alternate firmwares for different variants. The Recon3Di apparently
   8572	 * can use the default firmware, but I'll leave the option in case
   8573	 * it needs it again.
   8574	 */
   8575	switch (ca0132_quirk(spec)) {
   8576	case QUIRK_SBZ:
   8577	case QUIRK_R3D:
   8578	case QUIRK_AE5:
   8579		if (request_firmware(&fw_entry, DESKTOP_EFX_FILE,
   8580					codec->card->dev) != 0)
   8581			codec_dbg(codec, "Desktop firmware not found.");
   8582		else
   8583			codec_dbg(codec, "Desktop firmware selected.");
   8584		break;
   8585	case QUIRK_R3DI:
   8586		if (request_firmware(&fw_entry, R3DI_EFX_FILE,
   8587					codec->card->dev) != 0)
   8588			codec_dbg(codec, "Recon3Di alt firmware not detected.");
   8589		else
   8590			codec_dbg(codec, "Recon3Di firmware selected.");
   8591		break;
   8592	default:
   8593		break;
   8594	}
   8595	/*
   8596	 * Use default ctefx.bin if no alt firmware is detected, or if none
   8597	 * exists for your particular codec.
   8598	 */
   8599	if (!fw_entry) {
   8600		codec_dbg(codec, "Default firmware selected.");
   8601		if (request_firmware(&fw_entry, EFX_FILE,
   8602					codec->card->dev) != 0)
   8603			return false;
   8604	}
   8605
   8606	dsp_os_image = (struct dsp_image_seg *)(fw_entry->data);
   8607	if (dspload_image(codec, dsp_os_image, 0, 0, true, 0)) {
   8608		codec_err(codec, "ca0132 DSP load image failed\n");
   8609		goto exit_download;
   8610	}
   8611
   8612	dsp_loaded = dspload_wait_loaded(codec);
   8613
   8614exit_download:
   8615	release_firmware(fw_entry);
   8616
   8617	return dsp_loaded;
   8618}
   8619
   8620static void ca0132_download_dsp(struct hda_codec *codec)
   8621{
   8622	struct ca0132_spec *spec = codec->spec;
   8623
   8624#ifndef CONFIG_SND_HDA_CODEC_CA0132_DSP
   8625	return; /* NOP */
   8626#endif
   8627
   8628	if (spec->dsp_state == DSP_DOWNLOAD_FAILED)
   8629		return; /* don't retry failures */
   8630
   8631	chipio_enable_clocks(codec);
   8632	if (spec->dsp_state != DSP_DOWNLOADED) {
   8633		spec->dsp_state = DSP_DOWNLOADING;
   8634
   8635		if (!ca0132_download_dsp_images(codec))
   8636			spec->dsp_state = DSP_DOWNLOAD_FAILED;
   8637		else
   8638			spec->dsp_state = DSP_DOWNLOADED;
   8639	}
   8640
   8641	/* For codecs using alt functions, this is already done earlier */
   8642	if (spec->dsp_state == DSP_DOWNLOADED && !ca0132_use_alt_functions(spec))
   8643		ca0132_set_dsp_msr(codec, true);
   8644}
   8645
   8646static void ca0132_process_dsp_response(struct hda_codec *codec,
   8647					struct hda_jack_callback *callback)
   8648{
   8649	struct ca0132_spec *spec = codec->spec;
   8650
   8651	codec_dbg(codec, "ca0132_process_dsp_response\n");
   8652	snd_hda_power_up_pm(codec);
   8653	if (spec->wait_scp) {
   8654		if (dspio_get_response_data(codec) >= 0)
   8655			spec->wait_scp = 0;
   8656	}
   8657
   8658	dspio_clear_response_queue(codec);
   8659	snd_hda_power_down_pm(codec);
   8660}
   8661
   8662static void hp_callback(struct hda_codec *codec, struct hda_jack_callback *cb)
   8663{
   8664	struct ca0132_spec *spec = codec->spec;
   8665	struct hda_jack_tbl *tbl;
   8666
   8667	/* Delay enabling the HP amp, to let the mic-detection
   8668	 * state machine run.
   8669	 */
   8670	tbl = snd_hda_jack_tbl_get(codec, cb->nid);
   8671	if (tbl)
   8672		tbl->block_report = 1;
   8673	schedule_delayed_work(&spec->unsol_hp_work, msecs_to_jiffies(500));
   8674}
   8675
   8676static void amic_callback(struct hda_codec *codec, struct hda_jack_callback *cb)
   8677{
   8678	struct ca0132_spec *spec = codec->spec;
   8679
   8680	if (ca0132_use_alt_functions(spec))
   8681		ca0132_alt_select_in(codec);
   8682	else
   8683		ca0132_select_mic(codec);
   8684}
   8685
   8686static void ca0132_setup_unsol(struct hda_codec *codec)
   8687{
   8688	struct ca0132_spec *spec = codec->spec;
   8689	snd_hda_jack_detect_enable_callback(codec, spec->unsol_tag_hp, hp_callback);
   8690	snd_hda_jack_detect_enable_callback(codec, spec->unsol_tag_amic1,
   8691					    amic_callback);
   8692	snd_hda_jack_detect_enable_callback(codec, UNSOL_TAG_DSP,
   8693					    ca0132_process_dsp_response);
   8694	/* Front headphone jack detection */
   8695	if (ca0132_use_alt_functions(spec))
   8696		snd_hda_jack_detect_enable_callback(codec,
   8697			spec->unsol_tag_front_hp, hp_callback);
   8698}
   8699
   8700/*
   8701 * Verbs tables.
   8702 */
   8703
   8704/* Sends before DSP download. */
   8705static const struct hda_verb ca0132_base_init_verbs[] = {
   8706	/*enable ct extension*/
   8707	{0x15, VENDOR_CHIPIO_CT_EXTENSIONS_ENABLE, 0x1},
   8708	{}
   8709};
   8710
   8711/* Send at exit. */
   8712static const struct hda_verb ca0132_base_exit_verbs[] = {
   8713	/*set afg to D3*/
   8714	{0x01, AC_VERB_SET_POWER_STATE, 0x03},
   8715	/*disable ct extension*/
   8716	{0x15, VENDOR_CHIPIO_CT_EXTENSIONS_ENABLE, 0},
   8717	{}
   8718};
   8719
   8720/* Other verbs tables. Sends after DSP download. */
   8721
   8722static const struct hda_verb ca0132_init_verbs0[] = {
   8723	/* chip init verbs */
   8724	{0x15, 0x70D, 0xF0},
   8725	{0x15, 0x70E, 0xFE},
   8726	{0x15, 0x707, 0x75},
   8727	{0x15, 0x707, 0xD3},
   8728	{0x15, 0x707, 0x09},
   8729	{0x15, 0x707, 0x53},
   8730	{0x15, 0x707, 0xD4},
   8731	{0x15, 0x707, 0xEF},
   8732	{0x15, 0x707, 0x75},
   8733	{0x15, 0x707, 0xD3},
   8734	{0x15, 0x707, 0x09},
   8735	{0x15, 0x707, 0x02},
   8736	{0x15, 0x707, 0x37},
   8737	{0x15, 0x707, 0x78},
   8738	{0x15, 0x53C, 0xCE},
   8739	{0x15, 0x575, 0xC9},
   8740	{0x15, 0x53D, 0xCE},
   8741	{0x15, 0x5B7, 0xC9},
   8742	{0x15, 0x70D, 0xE8},
   8743	{0x15, 0x70E, 0xFE},
   8744	{0x15, 0x707, 0x02},
   8745	{0x15, 0x707, 0x68},
   8746	{0x15, 0x707, 0x62},
   8747	{0x15, 0x53A, 0xCE},
   8748	{0x15, 0x546, 0xC9},
   8749	{0x15, 0x53B, 0xCE},
   8750	{0x15, 0x5E8, 0xC9},
   8751	{}
   8752};
   8753
   8754/* Extra init verbs for desktop cards. */
   8755static const struct hda_verb ca0132_init_verbs1[] = {
   8756	{0x15, 0x70D, 0x20},
   8757	{0x15, 0x70E, 0x19},
   8758	{0x15, 0x707, 0x00},
   8759	{0x15, 0x539, 0xCE},
   8760	{0x15, 0x546, 0xC9},
   8761	{0x15, 0x70D, 0xB7},
   8762	{0x15, 0x70E, 0x09},
   8763	{0x15, 0x707, 0x10},
   8764	{0x15, 0x70D, 0xAF},
   8765	{0x15, 0x70E, 0x09},
   8766	{0x15, 0x707, 0x01},
   8767	{0x15, 0x707, 0x05},
   8768	{0x15, 0x70D, 0x73},
   8769	{0x15, 0x70E, 0x09},
   8770	{0x15, 0x707, 0x14},
   8771	{0x15, 0x6FF, 0xC4},
   8772	{}
   8773};
   8774
   8775static void ca0132_init_chip(struct hda_codec *codec)
   8776{
   8777	struct ca0132_spec *spec = codec->spec;
   8778	int num_fx;
   8779	int i;
   8780	unsigned int on;
   8781
   8782	mutex_init(&spec->chipio_mutex);
   8783
   8784	/*
   8785	 * The Windows driver always does this upon startup, which seems to
   8786	 * clear out any previous configuration. This should help issues where
   8787	 * a boot into Windows prior to a boot into Linux breaks things. Also,
   8788	 * Windows always sends the reset twice.
   8789	 */
   8790	if (ca0132_use_alt_functions(spec)) {
   8791		chipio_set_control_flag(codec, CONTROL_FLAG_IDLE_ENABLE, 0);
   8792		chipio_write_no_mutex(codec, 0x18b0a4, 0x000000c2);
   8793
   8794		snd_hda_codec_write(codec, codec->core.afg, 0,
   8795			    AC_VERB_SET_CODEC_RESET, 0);
   8796		snd_hda_codec_write(codec, codec->core.afg, 0,
   8797			    AC_VERB_SET_CODEC_RESET, 0);
   8798	}
   8799
   8800	spec->cur_out_type = SPEAKER_OUT;
   8801	if (!ca0132_use_alt_functions(spec))
   8802		spec->cur_mic_type = DIGITAL_MIC;
   8803	else
   8804		spec->cur_mic_type = REAR_MIC;
   8805
   8806	spec->cur_mic_boost = 0;
   8807
   8808	for (i = 0; i < VNODES_COUNT; i++) {
   8809		spec->vnode_lvol[i] = 0x5a;
   8810		spec->vnode_rvol[i] = 0x5a;
   8811		spec->vnode_lswitch[i] = 0;
   8812		spec->vnode_rswitch[i] = 0;
   8813	}
   8814
   8815	/*
   8816	 * Default states for effects are in ca0132_effects[].
   8817	 */
   8818	num_fx = OUT_EFFECTS_COUNT + IN_EFFECTS_COUNT;
   8819	for (i = 0; i < num_fx; i++) {
   8820		on = (unsigned int)ca0132_effects[i].reqs[0];
   8821		spec->effects_switch[i] = on ? 1 : 0;
   8822	}
   8823	/*
   8824	 * Sets defaults for the effect slider controls, only for alternative
   8825	 * ca0132 codecs. Also sets x-bass crossover frequency to 80hz.
   8826	 */
   8827	if (ca0132_use_alt_controls(spec)) {
   8828		/* Set speakers to default to full range. */
   8829		spec->speaker_range_val[0] = 1;
   8830		spec->speaker_range_val[1] = 1;
   8831
   8832		spec->xbass_xover_freq = 8;
   8833		for (i = 0; i < EFFECT_LEVEL_SLIDERS; i++)
   8834			spec->fx_ctl_val[i] = effect_slider_defaults[i];
   8835
   8836		spec->bass_redirect_xover_freq = 8;
   8837	}
   8838
   8839	spec->voicefx_val = 0;
   8840	spec->effects_switch[PLAY_ENHANCEMENT - EFFECT_START_NID] = 1;
   8841	spec->effects_switch[CRYSTAL_VOICE - EFFECT_START_NID] = 0;
   8842
   8843	/*
   8844	 * The ZxR doesn't have a front panel header, and it's line-in is on
   8845	 * the daughter board. So, there is no input enum control, and we need
   8846	 * to make sure that spec->in_enum_val is set properly.
   8847	 */
   8848	if (ca0132_quirk(spec) == QUIRK_ZXR)
   8849		spec->in_enum_val = REAR_MIC;
   8850
   8851#ifdef ENABLE_TUNING_CONTROLS
   8852	ca0132_init_tuning_defaults(codec);
   8853#endif
   8854}
   8855
   8856/*
   8857 * Recon3Di exit specific commands.
   8858 */
   8859/* prevents popping noise on shutdown */
   8860static void r3di_gpio_shutdown(struct hda_codec *codec)
   8861{
   8862	snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 0x00);
   8863}
   8864
   8865/*
   8866 * Sound Blaster Z exit specific commands.
   8867 */
   8868static void sbz_region2_exit(struct hda_codec *codec)
   8869{
   8870	struct ca0132_spec *spec = codec->spec;
   8871	unsigned int i;
   8872
   8873	for (i = 0; i < 4; i++)
   8874		writeb(0x0, spec->mem_base + 0x100);
   8875	for (i = 0; i < 8; i++)
   8876		writeb(0xb3, spec->mem_base + 0x304);
   8877
   8878	ca0113_mmio_gpio_set(codec, 0, false);
   8879	ca0113_mmio_gpio_set(codec, 1, false);
   8880	ca0113_mmio_gpio_set(codec, 4, true);
   8881	ca0113_mmio_gpio_set(codec, 5, false);
   8882	ca0113_mmio_gpio_set(codec, 7, false);
   8883}
   8884
   8885static void sbz_set_pin_ctl_default(struct hda_codec *codec)
   8886{
   8887	static const hda_nid_t pins[] = {0x0B, 0x0C, 0x0E, 0x12, 0x13};
   8888	unsigned int i;
   8889
   8890	snd_hda_codec_write(codec, 0x11, 0,
   8891			AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40);
   8892
   8893	for (i = 0; i < ARRAY_SIZE(pins); i++)
   8894		snd_hda_codec_write(codec, pins[i], 0,
   8895				AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00);
   8896}
   8897
   8898static void ca0132_clear_unsolicited(struct hda_codec *codec)
   8899{
   8900	static const hda_nid_t pins[] = {0x0B, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13};
   8901	unsigned int i;
   8902
   8903	for (i = 0; i < ARRAY_SIZE(pins); i++) {
   8904		snd_hda_codec_write(codec, pins[i], 0,
   8905				AC_VERB_SET_UNSOLICITED_ENABLE, 0x00);
   8906	}
   8907}
   8908
   8909/* On shutdown, sends commands in sets of three */
   8910static void sbz_gpio_shutdown_commands(struct hda_codec *codec, int dir,
   8911							int mask, int data)
   8912{
   8913	if (dir >= 0)
   8914		snd_hda_codec_write(codec, 0x01, 0,
   8915				AC_VERB_SET_GPIO_DIRECTION, dir);
   8916	if (mask >= 0)
   8917		snd_hda_codec_write(codec, 0x01, 0,
   8918				AC_VERB_SET_GPIO_MASK, mask);
   8919
   8920	if (data >= 0)
   8921		snd_hda_codec_write(codec, 0x01, 0,
   8922				AC_VERB_SET_GPIO_DATA, data);
   8923}
   8924
   8925static void zxr_dbpro_power_state_shutdown(struct hda_codec *codec)
   8926{
   8927	static const hda_nid_t pins[] = {0x05, 0x0c, 0x09, 0x0e, 0x08, 0x11, 0x01};
   8928	unsigned int i;
   8929
   8930	for (i = 0; i < ARRAY_SIZE(pins); i++)
   8931		snd_hda_codec_write(codec, pins[i], 0,
   8932				AC_VERB_SET_POWER_STATE, 0x03);
   8933}
   8934
   8935static void sbz_exit_chip(struct hda_codec *codec)
   8936{
   8937	chipio_set_stream_control(codec, 0x03, 0);
   8938	chipio_set_stream_control(codec, 0x04, 0);
   8939
   8940	/* Mess with GPIO */
   8941	sbz_gpio_shutdown_commands(codec, 0x07, 0x07, -1);
   8942	sbz_gpio_shutdown_commands(codec, 0x07, 0x07, 0x05);
   8943	sbz_gpio_shutdown_commands(codec, 0x07, 0x07, 0x01);
   8944
   8945	chipio_set_stream_control(codec, 0x14, 0);
   8946	chipio_set_stream_control(codec, 0x0C, 0);
   8947
   8948	chipio_set_conn_rate(codec, 0x41, SR_192_000);
   8949	chipio_set_conn_rate(codec, 0x91, SR_192_000);
   8950
   8951	chipio_write(codec, 0x18a020, 0x00000083);
   8952
   8953	sbz_gpio_shutdown_commands(codec, 0x07, 0x07, 0x03);
   8954	sbz_gpio_shutdown_commands(codec, 0x07, 0x07, 0x07);
   8955	sbz_gpio_shutdown_commands(codec, 0x07, 0x07, 0x06);
   8956
   8957	chipio_set_stream_control(codec, 0x0C, 0);
   8958
   8959	chipio_set_control_param(codec, 0x0D, 0x24);
   8960
   8961	ca0132_clear_unsolicited(codec);
   8962	sbz_set_pin_ctl_default(codec);
   8963
   8964	snd_hda_codec_write(codec, 0x0B, 0,
   8965		AC_VERB_SET_EAPD_BTLENABLE, 0x00);
   8966
   8967	sbz_region2_exit(codec);
   8968}
   8969
   8970static void r3d_exit_chip(struct hda_codec *codec)
   8971{
   8972	ca0132_clear_unsolicited(codec);
   8973	snd_hda_codec_write(codec, 0x01, 0, 0x793, 0x00);
   8974	snd_hda_codec_write(codec, 0x01, 0, 0x794, 0x5b);
   8975}
   8976
   8977static void ae5_exit_chip(struct hda_codec *codec)
   8978{
   8979	chipio_set_stream_control(codec, 0x03, 0);
   8980	chipio_set_stream_control(codec, 0x04, 0);
   8981
   8982	ca0113_mmio_command_set(codec, 0x30, 0x32, 0x3f);
   8983	ca0113_mmio_command_set(codec, 0x48, 0x07, 0x83);
   8984	ca0113_mmio_command_set(codec, 0x48, 0x07, 0x83);
   8985	ca0113_mmio_command_set(codec, 0x30, 0x30, 0x00);
   8986	ca0113_mmio_command_set(codec, 0x30, 0x2b, 0x00);
   8987	ca0113_mmio_command_set(codec, 0x30, 0x2d, 0x00);
   8988	ca0113_mmio_gpio_set(codec, 0, false);
   8989	ca0113_mmio_gpio_set(codec, 1, false);
   8990
   8991	snd_hda_codec_write(codec, 0x01, 0, 0x793, 0x00);
   8992	snd_hda_codec_write(codec, 0x01, 0, 0x794, 0x53);
   8993
   8994	chipio_set_control_param(codec, CONTROL_PARAM_ASI, 0);
   8995
   8996	chipio_set_stream_control(codec, 0x18, 0);
   8997	chipio_set_stream_control(codec, 0x0c, 0);
   8998
   8999	snd_hda_codec_write(codec, 0x01, 0, 0x724, 0x83);
   9000}
   9001
   9002static void ae7_exit_chip(struct hda_codec *codec)
   9003{
   9004	chipio_set_stream_control(codec, 0x18, 0);
   9005	chipio_set_stream_source_dest(codec, 0x21, 0xc8, 0xc8);
   9006	chipio_set_stream_channels(codec, 0x21, 0);
   9007	chipio_set_control_param(codec, CONTROL_PARAM_NODE_ID, 0x09);
   9008	chipio_set_control_param(codec, 0x20, 0x01);
   9009
   9010	chipio_set_control_param(codec, CONTROL_PARAM_ASI, 0);
   9011
   9012	chipio_set_stream_control(codec, 0x18, 0);
   9013	chipio_set_stream_control(codec, 0x0c, 0);
   9014
   9015	ca0113_mmio_command_set(codec, 0x30, 0x2b, 0x00);
   9016	snd_hda_codec_write(codec, 0x15, 0, 0x724, 0x83);
   9017	ca0113_mmio_command_set_type2(codec, 0x48, 0x07, 0x83);
   9018	ca0113_mmio_command_set(codec, 0x30, 0x30, 0x00);
   9019	ca0113_mmio_command_set(codec, 0x30, 0x2e, 0x00);
   9020	ca0113_mmio_gpio_set(codec, 0, false);
   9021	ca0113_mmio_gpio_set(codec, 1, false);
   9022	ca0113_mmio_command_set(codec, 0x30, 0x32, 0x3f);
   9023
   9024	snd_hda_codec_write(codec, 0x01, 0, 0x793, 0x00);
   9025	snd_hda_codec_write(codec, 0x01, 0, 0x794, 0x53);
   9026}
   9027
   9028static void zxr_exit_chip(struct hda_codec *codec)
   9029{
   9030	chipio_set_stream_control(codec, 0x03, 0);
   9031	chipio_set_stream_control(codec, 0x04, 0);
   9032	chipio_set_stream_control(codec, 0x14, 0);
   9033	chipio_set_stream_control(codec, 0x0C, 0);
   9034
   9035	chipio_set_conn_rate(codec, 0x41, SR_192_000);
   9036	chipio_set_conn_rate(codec, 0x91, SR_192_000);
   9037
   9038	chipio_write(codec, 0x18a020, 0x00000083);
   9039
   9040	snd_hda_codec_write(codec, 0x01, 0, 0x793, 0x00);
   9041	snd_hda_codec_write(codec, 0x01, 0, 0x794, 0x53);
   9042
   9043	ca0132_clear_unsolicited(codec);
   9044	sbz_set_pin_ctl_default(codec);
   9045	snd_hda_codec_write(codec, 0x0B, 0, AC_VERB_SET_EAPD_BTLENABLE, 0x00);
   9046
   9047	ca0113_mmio_gpio_set(codec, 5, false);
   9048	ca0113_mmio_gpio_set(codec, 2, false);
   9049	ca0113_mmio_gpio_set(codec, 3, false);
   9050	ca0113_mmio_gpio_set(codec, 0, false);
   9051	ca0113_mmio_gpio_set(codec, 4, true);
   9052	ca0113_mmio_gpio_set(codec, 0, true);
   9053	ca0113_mmio_gpio_set(codec, 5, true);
   9054	ca0113_mmio_gpio_set(codec, 2, false);
   9055	ca0113_mmio_gpio_set(codec, 3, false);
   9056}
   9057
   9058static void ca0132_exit_chip(struct hda_codec *codec)
   9059{
   9060	/* put any chip cleanup stuffs here. */
   9061
   9062	if (dspload_is_loaded(codec))
   9063		dsp_reset(codec);
   9064}
   9065
   9066/*
   9067 * This fixes a problem that was hard to reproduce. Very rarely, I would
   9068 * boot up, and there would be no sound, but the DSP indicated it had loaded
   9069 * properly. I did a few memory dumps to see if anything was different, and
   9070 * there were a few areas of memory uninitialized with a1a2a3a4. This function
   9071 * checks if those areas are uninitialized, and if they are, it'll attempt to
   9072 * reload the card 3 times. Usually it fixes by the second.
   9073 */
   9074static void sbz_dsp_startup_check(struct hda_codec *codec)
   9075{
   9076	struct ca0132_spec *spec = codec->spec;
   9077	unsigned int dsp_data_check[4];
   9078	unsigned int cur_address = 0x390;
   9079	unsigned int i;
   9080	unsigned int failure = 0;
   9081	unsigned int reload = 3;
   9082
   9083	if (spec->startup_check_entered)
   9084		return;
   9085
   9086	spec->startup_check_entered = true;
   9087
   9088	for (i = 0; i < 4; i++) {
   9089		chipio_read(codec, cur_address, &dsp_data_check[i]);
   9090		cur_address += 0x4;
   9091	}
   9092	for (i = 0; i < 4; i++) {
   9093		if (dsp_data_check[i] == 0xa1a2a3a4)
   9094			failure = 1;
   9095	}
   9096
   9097	codec_dbg(codec, "Startup Check: %d ", failure);
   9098	if (failure)
   9099		codec_info(codec, "DSP not initialized properly. Attempting to fix.");
   9100	/*
   9101	 * While the failure condition is true, and we haven't reached our
   9102	 * three reload limit, continue trying to reload the driver and
   9103	 * fix the issue.
   9104	 */
   9105	while (failure && (reload != 0)) {
   9106		codec_info(codec, "Reloading... Tries left: %d", reload);
   9107		sbz_exit_chip(codec);
   9108		spec->dsp_state = DSP_DOWNLOAD_INIT;
   9109		codec->patch_ops.init(codec);
   9110		failure = 0;
   9111		for (i = 0; i < 4; i++) {
   9112			chipio_read(codec, cur_address, &dsp_data_check[i]);
   9113			cur_address += 0x4;
   9114		}
   9115		for (i = 0; i < 4; i++) {
   9116			if (dsp_data_check[i] == 0xa1a2a3a4)
   9117				failure = 1;
   9118		}
   9119		reload--;
   9120	}
   9121
   9122	if (!failure && reload < 3)
   9123		codec_info(codec, "DSP fixed.");
   9124
   9125	if (!failure)
   9126		return;
   9127
   9128	codec_info(codec, "DSP failed to initialize properly. Either try a full shutdown or a suspend to clear the internal memory.");
   9129}
   9130
   9131/*
   9132 * This is for the extra volume verbs 0x797 (left) and 0x798 (right). These add
   9133 * extra precision for decibel values. If you had the dB value in floating point
   9134 * you would take the value after the decimal point, multiply by 64, and divide
   9135 * by 2. So for 8.59, it's (59 * 64) / 100. Useful if someone wanted to
   9136 * implement fixed point or floating point dB volumes. For now, I'll set them
   9137 * to 0 just incase a value has lingered from a boot into Windows.
   9138 */
   9139static void ca0132_alt_vol_setup(struct hda_codec *codec)
   9140{
   9141	snd_hda_codec_write(codec, 0x02, 0, 0x797, 0x00);
   9142	snd_hda_codec_write(codec, 0x02, 0, 0x798, 0x00);
   9143	snd_hda_codec_write(codec, 0x03, 0, 0x797, 0x00);
   9144	snd_hda_codec_write(codec, 0x03, 0, 0x798, 0x00);
   9145	snd_hda_codec_write(codec, 0x04, 0, 0x797, 0x00);
   9146	snd_hda_codec_write(codec, 0x04, 0, 0x798, 0x00);
   9147	snd_hda_codec_write(codec, 0x07, 0, 0x797, 0x00);
   9148	snd_hda_codec_write(codec, 0x07, 0, 0x798, 0x00);
   9149}
   9150
   9151/*
   9152 * Extra commands that don't really fit anywhere else.
   9153 */
   9154static void sbz_pre_dsp_setup(struct hda_codec *codec)
   9155{
   9156	struct ca0132_spec *spec = codec->spec;
   9157
   9158	writel(0x00820680, spec->mem_base + 0x01C);
   9159	writel(0x00820680, spec->mem_base + 0x01C);
   9160
   9161	chipio_write(codec, 0x18b0a4, 0x000000c2);
   9162
   9163	snd_hda_codec_write(codec, 0x11, 0,
   9164			AC_VERB_SET_PIN_WIDGET_CONTROL, 0x44);
   9165}
   9166
   9167static void r3d_pre_dsp_setup(struct hda_codec *codec)
   9168{
   9169	chipio_write(codec, 0x18b0a4, 0x000000c2);
   9170
   9171	chipio_8051_write_exram(codec, 0x1c1e, 0x5b);
   9172
   9173	snd_hda_codec_write(codec, 0x11, 0,
   9174			AC_VERB_SET_PIN_WIDGET_CONTROL, 0x44);
   9175}
   9176
   9177static void r3di_pre_dsp_setup(struct hda_codec *codec)
   9178{
   9179	chipio_write(codec, 0x18b0a4, 0x000000c2);
   9180
   9181	chipio_8051_write_exram(codec, 0x1c1e, 0x5b);
   9182	chipio_8051_write_exram(codec, 0x1920, 0x00);
   9183	chipio_8051_write_exram(codec, 0x1921, 0x40);
   9184
   9185	snd_hda_codec_write(codec, 0x11, 0,
   9186			AC_VERB_SET_PIN_WIDGET_CONTROL, 0x04);
   9187}
   9188
   9189/*
   9190 * The ZxR seems to use alternative DAC's for the surround channels, which
   9191 * require PLL PMU setup for the clock rate, I'm guessing. Without setting
   9192 * this up, we get no audio out of the surround jacks.
   9193 */
   9194static void zxr_pre_dsp_setup(struct hda_codec *codec)
   9195{
   9196	static const unsigned int addr[] = { 0x43, 0x40, 0x41, 0x42, 0x45 };
   9197	static const unsigned int data[] = { 0x08, 0x0c, 0x0b, 0x07, 0x0d };
   9198	unsigned int i;
   9199
   9200	chipio_write(codec, 0x189000, 0x0001f100);
   9201	msleep(50);
   9202	chipio_write(codec, 0x18900c, 0x0001f100);
   9203	msleep(50);
   9204
   9205	/*
   9206	 * This writes a RET instruction at the entry point of the function at
   9207	 * 0xfa92 in exram. This function seems to have something to do with
   9208	 * ASI. Might be some way to prevent the card from reconfiguring the
   9209	 * ASI stuff itself.
   9210	 */
   9211	chipio_8051_write_exram(codec, 0xfa92, 0x22);
   9212
   9213	chipio_8051_write_pll_pmu(codec, 0x51, 0x98);
   9214
   9215	snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0, 0x725, 0x82);
   9216	chipio_set_control_param(codec, CONTROL_PARAM_ASI, 3);
   9217
   9218	chipio_write(codec, 0x18902c, 0x00000000);
   9219	msleep(50);
   9220	chipio_write(codec, 0x18902c, 0x00000003);
   9221	msleep(50);
   9222
   9223	for (i = 0; i < ARRAY_SIZE(addr); i++)
   9224		chipio_8051_write_pll_pmu(codec, addr[i], data[i]);
   9225}
   9226
   9227/*
   9228 * These are sent before the DSP is downloaded. Not sure
   9229 * what they do, or if they're necessary. Could possibly
   9230 * be removed. Figure they're better to leave in.
   9231 */
   9232static const unsigned int ca0113_mmio_init_address_sbz[] = {
   9233	0x400, 0x408, 0x40c, 0x01c, 0xc0c, 0xc00, 0xc04, 0xc0c, 0xc0c, 0xc0c,
   9234	0xc0c, 0xc08, 0xc08, 0xc08, 0xc08, 0xc08, 0xc04
   9235};
   9236
   9237static const unsigned int ca0113_mmio_init_data_sbz[] = {
   9238	0x00000030, 0x00000000, 0x00000003, 0x00000003, 0x00000003,
   9239	0x00000003, 0x000000c1, 0x000000f1, 0x00000001, 0x000000c7,
   9240	0x000000c1, 0x00000080
   9241};
   9242
   9243static const unsigned int ca0113_mmio_init_data_zxr[] = {
   9244	0x00000030, 0x00000000, 0x00000000, 0x00000003, 0x00000003,
   9245	0x00000003, 0x00000001, 0x000000f1, 0x00000001, 0x000000c7,
   9246	0x000000c1, 0x00000080
   9247};
   9248
   9249static const unsigned int ca0113_mmio_init_address_ae5[] = {
   9250	0x400, 0x42c, 0x46c, 0x4ac, 0x4ec, 0x43c, 0x47c, 0x4bc, 0x4fc, 0x408,
   9251	0x100, 0x410, 0x40c, 0x100, 0x100, 0x830, 0x86c, 0x800, 0x86c, 0x800,
   9252	0x804, 0x20c, 0x01c, 0xc0c, 0xc00, 0xc04, 0xc0c, 0xc0c, 0xc0c, 0xc0c,
   9253	0xc08, 0xc08, 0xc08, 0xc08, 0xc08, 0xc04, 0x01c
   9254};
   9255
   9256static const unsigned int ca0113_mmio_init_data_ae5[] = {
   9257	0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
   9258	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000001,
   9259	0x00000600, 0x00000014, 0x00000001, 0x0000060f, 0x0000070f,
   9260	0x00000aff, 0x00000000, 0x0000006b, 0x00000001, 0x0000006b,
   9261	0x00000057, 0x00800000, 0x00880680, 0x00000080, 0x00000030,
   9262	0x00000000, 0x00000000, 0x00000003, 0x00000003, 0x00000003,
   9263	0x00000001, 0x000000f1, 0x00000001, 0x000000c7, 0x000000c1,
   9264	0x00000080, 0x00880680
   9265};
   9266
   9267static void ca0132_mmio_init_sbz(struct hda_codec *codec)
   9268{
   9269	struct ca0132_spec *spec = codec->spec;
   9270	unsigned int tmp[2], i, count, cur_addr;
   9271	const unsigned int *addr, *data;
   9272
   9273	addr = ca0113_mmio_init_address_sbz;
   9274	for (i = 0; i < 3; i++)
   9275		writel(0x00000000, spec->mem_base + addr[i]);
   9276
   9277	cur_addr = i;
   9278	switch (ca0132_quirk(spec)) {
   9279	case QUIRK_ZXR:
   9280		tmp[0] = 0x00880480;
   9281		tmp[1] = 0x00000080;
   9282		break;
   9283	case QUIRK_SBZ:
   9284		tmp[0] = 0x00820680;
   9285		tmp[1] = 0x00000083;
   9286		break;
   9287	case QUIRK_R3D:
   9288		tmp[0] = 0x00880680;
   9289		tmp[1] = 0x00000083;
   9290		break;
   9291	default:
   9292		tmp[0] = 0x00000000;
   9293		tmp[1] = 0x00000000;
   9294		break;
   9295	}
   9296
   9297	for (i = 0; i < 2; i++)
   9298		writel(tmp[i], spec->mem_base + addr[cur_addr + i]);
   9299
   9300	cur_addr += i;
   9301
   9302	switch (ca0132_quirk(spec)) {
   9303	case QUIRK_ZXR:
   9304		count = ARRAY_SIZE(ca0113_mmio_init_data_zxr);
   9305		data = ca0113_mmio_init_data_zxr;
   9306		break;
   9307	default:
   9308		count = ARRAY_SIZE(ca0113_mmio_init_data_sbz);
   9309		data = ca0113_mmio_init_data_sbz;
   9310		break;
   9311	}
   9312
   9313	for (i = 0; i < count; i++)
   9314		writel(data[i], spec->mem_base + addr[cur_addr + i]);
   9315}
   9316
   9317static void ca0132_mmio_init_ae5(struct hda_codec *codec)
   9318{
   9319	struct ca0132_spec *spec = codec->spec;
   9320	const unsigned int *addr, *data;
   9321	unsigned int i, count;
   9322
   9323	addr = ca0113_mmio_init_address_ae5;
   9324	data = ca0113_mmio_init_data_ae5;
   9325	count = ARRAY_SIZE(ca0113_mmio_init_data_ae5);
   9326
   9327	if (ca0132_quirk(spec) == QUIRK_AE7) {
   9328		writel(0x00000680, spec->mem_base + 0x1c);
   9329		writel(0x00880680, spec->mem_base + 0x1c);
   9330	}
   9331
   9332	for (i = 0; i < count; i++) {
   9333		/*
   9334		 * AE-7 shares all writes with the AE-5, except that it writes
   9335		 * a different value to 0x20c.
   9336		 */
   9337		if (i == 21 && ca0132_quirk(spec) == QUIRK_AE7) {
   9338			writel(0x00800001, spec->mem_base + addr[i]);
   9339			continue;
   9340		}
   9341
   9342		writel(data[i], spec->mem_base + addr[i]);
   9343	}
   9344
   9345	if (ca0132_quirk(spec) == QUIRK_AE5)
   9346		writel(0x00880680, spec->mem_base + 0x1c);
   9347}
   9348
   9349static void ca0132_mmio_init(struct hda_codec *codec)
   9350{
   9351	struct ca0132_spec *spec = codec->spec;
   9352
   9353	switch (ca0132_quirk(spec)) {
   9354	case QUIRK_R3D:
   9355	case QUIRK_SBZ:
   9356	case QUIRK_ZXR:
   9357		ca0132_mmio_init_sbz(codec);
   9358		break;
   9359	case QUIRK_AE5:
   9360		ca0132_mmio_init_ae5(codec);
   9361		break;
   9362	default:
   9363		break;
   9364	}
   9365}
   9366
   9367static const unsigned int ca0132_ae5_register_set_addresses[] = {
   9368	0x304, 0x304, 0x304, 0x304, 0x100, 0x304, 0x100, 0x304, 0x100, 0x304,
   9369	0x100, 0x304, 0x86c, 0x800, 0x86c, 0x800, 0x804
   9370};
   9371
   9372static const unsigned char ca0132_ae5_register_set_data[] = {
   9373	0x0f, 0x0e, 0x1f, 0x0c, 0x3f, 0x08, 0x7f, 0x00, 0xff, 0x00, 0x6b,
   9374	0x01, 0x6b, 0x57
   9375};
   9376
   9377/*
   9378 * This function writes to some SFR's, does some region2 writes, and then
   9379 * eventually resets the codec with the 0x7ff verb. Not quite sure why it does
   9380 * what it does.
   9381 */
   9382static void ae5_register_set(struct hda_codec *codec)
   9383{
   9384	struct ca0132_spec *spec = codec->spec;
   9385	unsigned int count = ARRAY_SIZE(ca0132_ae5_register_set_addresses);
   9386	const unsigned int *addr = ca0132_ae5_register_set_addresses;
   9387	const unsigned char *data = ca0132_ae5_register_set_data;
   9388	unsigned int i, cur_addr;
   9389	unsigned char tmp[3];
   9390
   9391	if (ca0132_quirk(spec) == QUIRK_AE7)
   9392		chipio_8051_write_pll_pmu(codec, 0x41, 0xc8);
   9393
   9394	chipio_8051_write_direct(codec, 0x93, 0x10);
   9395	chipio_8051_write_pll_pmu(codec, 0x44, 0xc2);
   9396
   9397	if (ca0132_quirk(spec) == QUIRK_AE7) {
   9398		tmp[0] = 0x03;
   9399		tmp[1] = 0x03;
   9400		tmp[2] = 0x07;
   9401	} else {
   9402		tmp[0] = 0x0f;
   9403		tmp[1] = 0x0f;
   9404		tmp[2] = 0x0f;
   9405	}
   9406
   9407	for (i = cur_addr = 0; i < 3; i++, cur_addr++)
   9408		writeb(tmp[i], spec->mem_base + addr[cur_addr]);
   9409
   9410	/*
   9411	 * First writes are in single bytes, final are in 4 bytes. So, we use
   9412	 * writeb, then writel.
   9413	 */
   9414	for (i = 0; cur_addr < 12; i++, cur_addr++)
   9415		writeb(data[i], spec->mem_base + addr[cur_addr]);
   9416
   9417	for (; cur_addr < count; i++, cur_addr++)
   9418		writel(data[i], spec->mem_base + addr[cur_addr]);
   9419
   9420	writel(0x00800001, spec->mem_base + 0x20c);
   9421
   9422	if (ca0132_quirk(spec) == QUIRK_AE7) {
   9423		ca0113_mmio_command_set_type2(codec, 0x48, 0x07, 0x83);
   9424		ca0113_mmio_command_set(codec, 0x30, 0x2e, 0x3f);
   9425	} else {
   9426		ca0113_mmio_command_set(codec, 0x30, 0x2d, 0x3f);
   9427	}
   9428
   9429	chipio_8051_write_direct(codec, 0x90, 0x00);
   9430	chipio_8051_write_direct(codec, 0x90, 0x10);
   9431
   9432	if (ca0132_quirk(spec) == QUIRK_AE5)
   9433		ca0113_mmio_command_set(codec, 0x48, 0x07, 0x83);
   9434}
   9435
   9436/*
   9437 * Extra init functions for alternative ca0132 codecs. Done
   9438 * here so they don't clutter up the main ca0132_init function
   9439 * anymore than they have to.
   9440 */
   9441static void ca0132_alt_init(struct hda_codec *codec)
   9442{
   9443	struct ca0132_spec *spec = codec->spec;
   9444
   9445	ca0132_alt_vol_setup(codec);
   9446
   9447	switch (ca0132_quirk(spec)) {
   9448	case QUIRK_SBZ:
   9449		codec_dbg(codec, "SBZ alt_init");
   9450		ca0132_gpio_init(codec);
   9451		sbz_pre_dsp_setup(codec);
   9452		snd_hda_sequence_write(codec, spec->chip_init_verbs);
   9453		snd_hda_sequence_write(codec, spec->desktop_init_verbs);
   9454		break;
   9455	case QUIRK_R3DI:
   9456		codec_dbg(codec, "R3DI alt_init");
   9457		ca0132_gpio_init(codec);
   9458		ca0132_gpio_setup(codec);
   9459		r3di_gpio_dsp_status_set(codec, R3DI_DSP_DOWNLOADING);
   9460		r3di_pre_dsp_setup(codec);
   9461		snd_hda_sequence_write(codec, spec->chip_init_verbs);
   9462		snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0, 0x6FF, 0xC4);
   9463		break;
   9464	case QUIRK_R3D:
   9465		r3d_pre_dsp_setup(codec);
   9466		snd_hda_sequence_write(codec, spec->chip_init_verbs);
   9467		snd_hda_sequence_write(codec, spec->desktop_init_verbs);
   9468		break;
   9469	case QUIRK_AE5:
   9470		ca0132_gpio_init(codec);
   9471		chipio_8051_write_pll_pmu(codec, 0x49, 0x88);
   9472		chipio_write(codec, 0x18b030, 0x00000020);
   9473		snd_hda_sequence_write(codec, spec->chip_init_verbs);
   9474		snd_hda_sequence_write(codec, spec->desktop_init_verbs);
   9475		ca0113_mmio_command_set(codec, 0x30, 0x32, 0x3f);
   9476		break;
   9477	case QUIRK_AE7:
   9478		ca0132_gpio_init(codec);
   9479		chipio_8051_write_pll_pmu(codec, 0x49, 0x88);
   9480		snd_hda_sequence_write(codec, spec->chip_init_verbs);
   9481		snd_hda_sequence_write(codec, spec->desktop_init_verbs);
   9482		chipio_write(codec, 0x18b008, 0x000000f8);
   9483		chipio_write(codec, 0x18b008, 0x000000f0);
   9484		chipio_write(codec, 0x18b030, 0x00000020);
   9485		ca0113_mmio_command_set(codec, 0x30, 0x32, 0x3f);
   9486		break;
   9487	case QUIRK_ZXR:
   9488		chipio_8051_write_pll_pmu(codec, 0x49, 0x88);
   9489		snd_hda_sequence_write(codec, spec->chip_init_verbs);
   9490		snd_hda_sequence_write(codec, spec->desktop_init_verbs);
   9491		zxr_pre_dsp_setup(codec);
   9492		break;
   9493	default:
   9494		break;
   9495	}
   9496}
   9497
   9498static int ca0132_init(struct hda_codec *codec)
   9499{
   9500	struct ca0132_spec *spec = codec->spec;
   9501	struct auto_pin_cfg *cfg = &spec->autocfg;
   9502	int i;
   9503	bool dsp_loaded;
   9504
   9505	/*
   9506	 * If the DSP is already downloaded, and init has been entered again,
   9507	 * there's only two reasons for it. One, the codec has awaken from a
   9508	 * suspended state, and in that case dspload_is_loaded will return
   9509	 * false, and the init will be ran again. The other reason it gets
   9510	 * re entered is on startup for some reason it triggers a suspend and
   9511	 * resume state. In this case, it will check if the DSP is downloaded,
   9512	 * and not run the init function again. For codecs using alt_functions,
   9513	 * it will check if the DSP is loaded properly.
   9514	 */
   9515	if (spec->dsp_state == DSP_DOWNLOADED) {
   9516		dsp_loaded = dspload_is_loaded(codec);
   9517		if (!dsp_loaded) {
   9518			spec->dsp_reload = true;
   9519			spec->dsp_state = DSP_DOWNLOAD_INIT;
   9520		} else {
   9521			if (ca0132_quirk(spec) == QUIRK_SBZ)
   9522				sbz_dsp_startup_check(codec);
   9523			return 0;
   9524		}
   9525	}
   9526
   9527	if (spec->dsp_state != DSP_DOWNLOAD_FAILED)
   9528		spec->dsp_state = DSP_DOWNLOAD_INIT;
   9529	spec->curr_chip_addx = INVALID_CHIP_ADDRESS;
   9530
   9531	if (ca0132_use_pci_mmio(spec))
   9532		ca0132_mmio_init(codec);
   9533
   9534	snd_hda_power_up_pm(codec);
   9535
   9536	if (ca0132_quirk(spec) == QUIRK_AE5 || ca0132_quirk(spec) == QUIRK_AE7)
   9537		ae5_register_set(codec);
   9538
   9539	ca0132_init_params(codec);
   9540	ca0132_init_flags(codec);
   9541
   9542	snd_hda_sequence_write(codec, spec->base_init_verbs);
   9543
   9544	if (ca0132_use_alt_functions(spec))
   9545		ca0132_alt_init(codec);
   9546
   9547	ca0132_download_dsp(codec);
   9548
   9549	ca0132_refresh_widget_caps(codec);
   9550
   9551	switch (ca0132_quirk(spec)) {
   9552	case QUIRK_R3DI:
   9553	case QUIRK_R3D:
   9554		r3d_setup_defaults(codec);
   9555		break;
   9556	case QUIRK_SBZ:
   9557	case QUIRK_ZXR:
   9558		sbz_setup_defaults(codec);
   9559		break;
   9560	case QUIRK_AE5:
   9561		ae5_setup_defaults(codec);
   9562		break;
   9563	case QUIRK_AE7:
   9564		ae7_setup_defaults(codec);
   9565		break;
   9566	default:
   9567		ca0132_setup_defaults(codec);
   9568		ca0132_init_analog_mic2(codec);
   9569		ca0132_init_dmic(codec);
   9570		break;
   9571	}
   9572
   9573	for (i = 0; i < spec->num_outputs; i++)
   9574		init_output(codec, spec->out_pins[i], spec->dacs[0]);
   9575
   9576	init_output(codec, cfg->dig_out_pins[0], spec->dig_out);
   9577
   9578	for (i = 0; i < spec->num_inputs; i++)
   9579		init_input(codec, spec->input_pins[i], spec->adcs[i]);
   9580
   9581	init_input(codec, cfg->dig_in_pin, spec->dig_in);
   9582
   9583	if (!ca0132_use_alt_functions(spec)) {
   9584		snd_hda_sequence_write(codec, spec->chip_init_verbs);
   9585		snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
   9586			    VENDOR_CHIPIO_PARAM_EX_ID_SET, 0x0D);
   9587		snd_hda_codec_write(codec, WIDGET_CHIP_CTRL, 0,
   9588			    VENDOR_CHIPIO_PARAM_EX_VALUE_SET, 0x20);
   9589	}
   9590
   9591	if (ca0132_quirk(spec) == QUIRK_SBZ)
   9592		ca0132_gpio_setup(codec);
   9593
   9594	snd_hda_sequence_write(codec, spec->spec_init_verbs);
   9595	if (ca0132_use_alt_functions(spec)) {
   9596		ca0132_alt_select_out(codec);
   9597		ca0132_alt_select_in(codec);
   9598	} else {
   9599		ca0132_select_out(codec);
   9600		ca0132_select_mic(codec);
   9601	}
   9602
   9603	snd_hda_jack_report_sync(codec);
   9604
   9605	/*
   9606	 * Re set the PlayEnhancement switch on a resume event, because the
   9607	 * controls will not be reloaded.
   9608	 */
   9609	if (spec->dsp_reload) {
   9610		spec->dsp_reload = false;
   9611		ca0132_pe_switch_set(codec);
   9612	}
   9613
   9614	snd_hda_power_down_pm(codec);
   9615
   9616	return 0;
   9617}
   9618
   9619static int dbpro_init(struct hda_codec *codec)
   9620{
   9621	struct ca0132_spec *spec = codec->spec;
   9622	struct auto_pin_cfg *cfg = &spec->autocfg;
   9623	unsigned int i;
   9624
   9625	init_output(codec, cfg->dig_out_pins[0], spec->dig_out);
   9626	init_input(codec, cfg->dig_in_pin, spec->dig_in);
   9627
   9628	for (i = 0; i < spec->num_inputs; i++)
   9629		init_input(codec, spec->input_pins[i], spec->adcs[i]);
   9630
   9631	return 0;
   9632}
   9633
   9634static void ca0132_free(struct hda_codec *codec)
   9635{
   9636	struct ca0132_spec *spec = codec->spec;
   9637
   9638	cancel_delayed_work_sync(&spec->unsol_hp_work);
   9639	snd_hda_power_up(codec);
   9640	switch (ca0132_quirk(spec)) {
   9641	case QUIRK_SBZ:
   9642		sbz_exit_chip(codec);
   9643		break;
   9644	case QUIRK_ZXR:
   9645		zxr_exit_chip(codec);
   9646		break;
   9647	case QUIRK_R3D:
   9648		r3d_exit_chip(codec);
   9649		break;
   9650	case QUIRK_AE5:
   9651		ae5_exit_chip(codec);
   9652		break;
   9653	case QUIRK_AE7:
   9654		ae7_exit_chip(codec);
   9655		break;
   9656	case QUIRK_R3DI:
   9657		r3di_gpio_shutdown(codec);
   9658		break;
   9659	default:
   9660		break;
   9661	}
   9662
   9663	snd_hda_sequence_write(codec, spec->base_exit_verbs);
   9664	ca0132_exit_chip(codec);
   9665
   9666	snd_hda_power_down(codec);
   9667#ifdef CONFIG_PCI
   9668	if (spec->mem_base)
   9669		pci_iounmap(codec->bus->pci, spec->mem_base);
   9670#endif
   9671	kfree(spec->spec_init_verbs);
   9672	kfree(codec->spec);
   9673}
   9674
   9675static void dbpro_free(struct hda_codec *codec)
   9676{
   9677	struct ca0132_spec *spec = codec->spec;
   9678
   9679	zxr_dbpro_power_state_shutdown(codec);
   9680
   9681	kfree(spec->spec_init_verbs);
   9682	kfree(codec->spec);
   9683}
   9684
   9685#ifdef CONFIG_PM
   9686static int ca0132_suspend(struct hda_codec *codec)
   9687{
   9688	struct ca0132_spec *spec = codec->spec;
   9689
   9690	cancel_delayed_work_sync(&spec->unsol_hp_work);
   9691	return 0;
   9692}
   9693#endif
   9694
   9695static const struct hda_codec_ops ca0132_patch_ops = {
   9696	.build_controls = ca0132_build_controls,
   9697	.build_pcms = ca0132_build_pcms,
   9698	.init = ca0132_init,
   9699	.free = ca0132_free,
   9700	.unsol_event = snd_hda_jack_unsol_event,
   9701#ifdef CONFIG_PM
   9702	.suspend = ca0132_suspend,
   9703#endif
   9704};
   9705
   9706static const struct hda_codec_ops dbpro_patch_ops = {
   9707	.build_controls = dbpro_build_controls,
   9708	.build_pcms = dbpro_build_pcms,
   9709	.init = dbpro_init,
   9710	.free = dbpro_free,
   9711};
   9712
   9713static void ca0132_config(struct hda_codec *codec)
   9714{
   9715	struct ca0132_spec *spec = codec->spec;
   9716
   9717	spec->dacs[0] = 0x2;
   9718	spec->dacs[1] = 0x3;
   9719	spec->dacs[2] = 0x4;
   9720
   9721	spec->multiout.dac_nids = spec->dacs;
   9722	spec->multiout.num_dacs = 3;
   9723
   9724	if (!ca0132_use_alt_functions(spec))
   9725		spec->multiout.max_channels = 2;
   9726	else
   9727		spec->multiout.max_channels = 6;
   9728
   9729	switch (ca0132_quirk(spec)) {
   9730	case QUIRK_ALIENWARE:
   9731		codec_dbg(codec, "%s: QUIRK_ALIENWARE applied.\n", __func__);
   9732		snd_hda_apply_pincfgs(codec, alienware_pincfgs);
   9733		break;
   9734	case QUIRK_SBZ:
   9735		codec_dbg(codec, "%s: QUIRK_SBZ applied.\n", __func__);
   9736		snd_hda_apply_pincfgs(codec, sbz_pincfgs);
   9737		break;
   9738	case QUIRK_ZXR:
   9739		codec_dbg(codec, "%s: QUIRK_ZXR applied.\n", __func__);
   9740		snd_hda_apply_pincfgs(codec, zxr_pincfgs);
   9741		break;
   9742	case QUIRK_R3D:
   9743		codec_dbg(codec, "%s: QUIRK_R3D applied.\n", __func__);
   9744		snd_hda_apply_pincfgs(codec, r3d_pincfgs);
   9745		break;
   9746	case QUIRK_R3DI:
   9747		codec_dbg(codec, "%s: QUIRK_R3DI applied.\n", __func__);
   9748		snd_hda_apply_pincfgs(codec, r3di_pincfgs);
   9749		break;
   9750	case QUIRK_AE5:
   9751		codec_dbg(codec, "%s: QUIRK_AE5 applied.\n", __func__);
   9752		snd_hda_apply_pincfgs(codec, ae5_pincfgs);
   9753		break;
   9754	case QUIRK_AE7:
   9755		codec_dbg(codec, "%s: QUIRK_AE7 applied.\n", __func__);
   9756		snd_hda_apply_pincfgs(codec, ae7_pincfgs);
   9757		break;
   9758	default:
   9759		break;
   9760	}
   9761
   9762	switch (ca0132_quirk(spec)) {
   9763	case QUIRK_ALIENWARE:
   9764		spec->num_outputs = 2;
   9765		spec->out_pins[0] = 0x0b; /* speaker out */
   9766		spec->out_pins[1] = 0x0f;
   9767		spec->shared_out_nid = 0x2;
   9768		spec->unsol_tag_hp = 0x0f;
   9769
   9770		spec->adcs[0] = 0x7; /* digital mic / analog mic1 */
   9771		spec->adcs[1] = 0x8; /* analog mic2 */
   9772		spec->adcs[2] = 0xa; /* what u hear */
   9773
   9774		spec->num_inputs = 3;
   9775		spec->input_pins[0] = 0x12;
   9776		spec->input_pins[1] = 0x11;
   9777		spec->input_pins[2] = 0x13;
   9778		spec->shared_mic_nid = 0x7;
   9779		spec->unsol_tag_amic1 = 0x11;
   9780		break;
   9781	case QUIRK_SBZ:
   9782	case QUIRK_R3D:
   9783		spec->num_outputs = 2;
   9784		spec->out_pins[0] = 0x0B; /* Line out */
   9785		spec->out_pins[1] = 0x0F; /* Rear headphone out */
   9786		spec->out_pins[2] = 0x10; /* Front Headphone / Center/LFE*/
   9787		spec->out_pins[3] = 0x11; /* Rear surround */
   9788		spec->shared_out_nid = 0x2;
   9789		spec->unsol_tag_hp = spec->out_pins[1];
   9790		spec->unsol_tag_front_hp = spec->out_pins[2];
   9791
   9792		spec->adcs[0] = 0x7; /* Rear Mic / Line-in */
   9793		spec->adcs[1] = 0x8; /* Front Mic, but only if no DSP */
   9794		spec->adcs[2] = 0xa; /* what u hear */
   9795
   9796		spec->num_inputs = 2;
   9797		spec->input_pins[0] = 0x12; /* Rear Mic / Line-in */
   9798		spec->input_pins[1] = 0x13; /* What U Hear */
   9799		spec->shared_mic_nid = 0x7;
   9800		spec->unsol_tag_amic1 = spec->input_pins[0];
   9801
   9802		/* SPDIF I/O */
   9803		spec->dig_out = 0x05;
   9804		spec->multiout.dig_out_nid = spec->dig_out;
   9805		spec->dig_in = 0x09;
   9806		break;
   9807	case QUIRK_ZXR:
   9808		spec->num_outputs = 2;
   9809		spec->out_pins[0] = 0x0B; /* Line out */
   9810		spec->out_pins[1] = 0x0F; /* Rear headphone out */
   9811		spec->out_pins[2] = 0x10; /* Center/LFE */
   9812		spec->out_pins[3] = 0x11; /* Rear surround */
   9813		spec->shared_out_nid = 0x2;
   9814		spec->unsol_tag_hp = spec->out_pins[1];
   9815		spec->unsol_tag_front_hp = spec->out_pins[2];
   9816
   9817		spec->adcs[0] = 0x7; /* Rear Mic / Line-in */
   9818		spec->adcs[1] = 0x8; /* Not connected, no front mic */
   9819		spec->adcs[2] = 0xa; /* what u hear */
   9820
   9821		spec->num_inputs = 2;
   9822		spec->input_pins[0] = 0x12; /* Rear Mic / Line-in */
   9823		spec->input_pins[1] = 0x13; /* What U Hear */
   9824		spec->shared_mic_nid = 0x7;
   9825		spec->unsol_tag_amic1 = spec->input_pins[0];
   9826		break;
   9827	case QUIRK_ZXR_DBPRO:
   9828		spec->adcs[0] = 0x8; /* ZxR DBPro Aux In */
   9829
   9830		spec->num_inputs = 1;
   9831		spec->input_pins[0] = 0x11; /* RCA Line-in */
   9832
   9833		spec->dig_out = 0x05;
   9834		spec->multiout.dig_out_nid = spec->dig_out;
   9835
   9836		spec->dig_in = 0x09;
   9837		break;
   9838	case QUIRK_AE5:
   9839	case QUIRK_AE7:
   9840		spec->num_outputs = 2;
   9841		spec->out_pins[0] = 0x0B; /* Line out */
   9842		spec->out_pins[1] = 0x11; /* Rear headphone out */
   9843		spec->out_pins[2] = 0x10; /* Front Headphone / Center/LFE*/
   9844		spec->out_pins[3] = 0x0F; /* Rear surround */
   9845		spec->shared_out_nid = 0x2;
   9846		spec->unsol_tag_hp = spec->out_pins[1];
   9847		spec->unsol_tag_front_hp = spec->out_pins[2];
   9848
   9849		spec->adcs[0] = 0x7; /* Rear Mic / Line-in */
   9850		spec->adcs[1] = 0x8; /* Front Mic, but only if no DSP */
   9851		spec->adcs[2] = 0xa; /* what u hear */
   9852
   9853		spec->num_inputs = 2;
   9854		spec->input_pins[0] = 0x12; /* Rear Mic / Line-in */
   9855		spec->input_pins[1] = 0x13; /* What U Hear */
   9856		spec->shared_mic_nid = 0x7;
   9857		spec->unsol_tag_amic1 = spec->input_pins[0];
   9858
   9859		/* SPDIF I/O */
   9860		spec->dig_out = 0x05;
   9861		spec->multiout.dig_out_nid = spec->dig_out;
   9862		break;
   9863	case QUIRK_R3DI:
   9864		spec->num_outputs = 2;
   9865		spec->out_pins[0] = 0x0B; /* Line out */
   9866		spec->out_pins[1] = 0x0F; /* Rear headphone out */
   9867		spec->out_pins[2] = 0x10; /* Front Headphone / Center/LFE*/
   9868		spec->out_pins[3] = 0x11; /* Rear surround */
   9869		spec->shared_out_nid = 0x2;
   9870		spec->unsol_tag_hp = spec->out_pins[1];
   9871		spec->unsol_tag_front_hp = spec->out_pins[2];
   9872
   9873		spec->adcs[0] = 0x07; /* Rear Mic / Line-in */
   9874		spec->adcs[1] = 0x08; /* Front Mic, but only if no DSP */
   9875		spec->adcs[2] = 0x0a; /* what u hear */
   9876
   9877		spec->num_inputs = 2;
   9878		spec->input_pins[0] = 0x12; /* Rear Mic / Line-in */
   9879		spec->input_pins[1] = 0x13; /* What U Hear */
   9880		spec->shared_mic_nid = 0x7;
   9881		spec->unsol_tag_amic1 = spec->input_pins[0];
   9882
   9883		/* SPDIF I/O */
   9884		spec->dig_out = 0x05;
   9885		spec->multiout.dig_out_nid = spec->dig_out;
   9886		break;
   9887	default:
   9888		spec->num_outputs = 2;
   9889		spec->out_pins[0] = 0x0b; /* speaker out */
   9890		spec->out_pins[1] = 0x10; /* headphone out */
   9891		spec->shared_out_nid = 0x2;
   9892		spec->unsol_tag_hp = spec->out_pins[1];
   9893
   9894		spec->adcs[0] = 0x7; /* digital mic / analog mic1 */
   9895		spec->adcs[1] = 0x8; /* analog mic2 */
   9896		spec->adcs[2] = 0xa; /* what u hear */
   9897
   9898		spec->num_inputs = 3;
   9899		spec->input_pins[0] = 0x12;
   9900		spec->input_pins[1] = 0x11;
   9901		spec->input_pins[2] = 0x13;
   9902		spec->shared_mic_nid = 0x7;
   9903		spec->unsol_tag_amic1 = spec->input_pins[0];
   9904
   9905		/* SPDIF I/O */
   9906		spec->dig_out = 0x05;
   9907		spec->multiout.dig_out_nid = spec->dig_out;
   9908		spec->dig_in = 0x09;
   9909		break;
   9910	}
   9911}
   9912
   9913static int ca0132_prepare_verbs(struct hda_codec *codec)
   9914{
   9915/* Verbs + terminator (an empty element) */
   9916#define NUM_SPEC_VERBS 2
   9917	struct ca0132_spec *spec = codec->spec;
   9918
   9919	spec->chip_init_verbs = ca0132_init_verbs0;
   9920	/*
   9921	 * Since desktop cards use pci_mmio, this can be used to determine
   9922	 * whether or not to use these verbs instead of a separate bool.
   9923	 */
   9924	if (ca0132_use_pci_mmio(spec))
   9925		spec->desktop_init_verbs = ca0132_init_verbs1;
   9926	spec->spec_init_verbs = kcalloc(NUM_SPEC_VERBS,
   9927					sizeof(struct hda_verb),
   9928					GFP_KERNEL);
   9929	if (!spec->spec_init_verbs)
   9930		return -ENOMEM;
   9931
   9932	/* config EAPD */
   9933	spec->spec_init_verbs[0].nid = 0x0b;
   9934	spec->spec_init_verbs[0].param = 0x78D;
   9935	spec->spec_init_verbs[0].verb = 0x00;
   9936
   9937	/* Previously commented configuration */
   9938	/*
   9939	spec->spec_init_verbs[2].nid = 0x0b;
   9940	spec->spec_init_verbs[2].param = AC_VERB_SET_EAPD_BTLENABLE;
   9941	spec->spec_init_verbs[2].verb = 0x02;
   9942
   9943	spec->spec_init_verbs[3].nid = 0x10;
   9944	spec->spec_init_verbs[3].param = 0x78D;
   9945	spec->spec_init_verbs[3].verb = 0x02;
   9946
   9947	spec->spec_init_verbs[4].nid = 0x10;
   9948	spec->spec_init_verbs[4].param = AC_VERB_SET_EAPD_BTLENABLE;
   9949	spec->spec_init_verbs[4].verb = 0x02;
   9950	*/
   9951
   9952	/* Terminator: spec->spec_init_verbs[NUM_SPEC_VERBS-1] */
   9953	return 0;
   9954}
   9955
   9956/*
   9957 * The Sound Blaster ZxR shares the same PCI subsystem ID as some regular
   9958 * Sound Blaster Z cards. However, they have different HDA codec subsystem
   9959 * ID's. So, we check for the ZxR's subsystem ID, as well as the DBPro
   9960 * daughter boards ID.
   9961 */
   9962static void sbz_detect_quirk(struct hda_codec *codec)
   9963{
   9964	struct ca0132_spec *spec = codec->spec;
   9965
   9966	switch (codec->core.subsystem_id) {
   9967	case 0x11020033:
   9968		spec->quirk = QUIRK_ZXR;
   9969		break;
   9970	case 0x1102003f:
   9971		spec->quirk = QUIRK_ZXR_DBPRO;
   9972		break;
   9973	default:
   9974		spec->quirk = QUIRK_SBZ;
   9975		break;
   9976	}
   9977}
   9978
   9979static int patch_ca0132(struct hda_codec *codec)
   9980{
   9981	struct ca0132_spec *spec;
   9982	int err;
   9983	const struct snd_pci_quirk *quirk;
   9984
   9985	codec_dbg(codec, "patch_ca0132\n");
   9986
   9987	spec = kzalloc(sizeof(*spec), GFP_KERNEL);
   9988	if (!spec)
   9989		return -ENOMEM;
   9990	codec->spec = spec;
   9991	spec->codec = codec;
   9992
   9993	/* Detect codec quirk */
   9994	quirk = snd_pci_quirk_lookup(codec->bus->pci, ca0132_quirks);
   9995	if (quirk)
   9996		spec->quirk = quirk->value;
   9997	else
   9998		spec->quirk = QUIRK_NONE;
   9999	if (ca0132_quirk(spec) == QUIRK_SBZ)
  10000		sbz_detect_quirk(codec);
  10001
  10002	if (ca0132_quirk(spec) == QUIRK_ZXR_DBPRO)
  10003		codec->patch_ops = dbpro_patch_ops;
  10004	else
  10005		codec->patch_ops = ca0132_patch_ops;
  10006
  10007	codec->pcm_format_first = 1;
  10008	codec->no_sticky_stream = 1;
  10009
  10010
  10011	spec->dsp_state = DSP_DOWNLOAD_INIT;
  10012	spec->num_mixers = 1;
  10013
  10014	/* Set which mixers each quirk uses. */
  10015	switch (ca0132_quirk(spec)) {
  10016	case QUIRK_SBZ:
  10017		spec->mixers[0] = desktop_mixer;
  10018		snd_hda_codec_set_name(codec, "Sound Blaster Z");
  10019		break;
  10020	case QUIRK_ZXR:
  10021		spec->mixers[0] = desktop_mixer;
  10022		snd_hda_codec_set_name(codec, "Sound Blaster ZxR");
  10023		break;
  10024	case QUIRK_ZXR_DBPRO:
  10025		break;
  10026	case QUIRK_R3D:
  10027		spec->mixers[0] = desktop_mixer;
  10028		snd_hda_codec_set_name(codec, "Recon3D");
  10029		break;
  10030	case QUIRK_R3DI:
  10031		spec->mixers[0] = r3di_mixer;
  10032		snd_hda_codec_set_name(codec, "Recon3Di");
  10033		break;
  10034	case QUIRK_AE5:
  10035		spec->mixers[0] = desktop_mixer;
  10036		snd_hda_codec_set_name(codec, "Sound BlasterX AE-5");
  10037		break;
  10038	case QUIRK_AE7:
  10039		spec->mixers[0] = desktop_mixer;
  10040		snd_hda_codec_set_name(codec, "Sound Blaster AE-7");
  10041		break;
  10042	default:
  10043		spec->mixers[0] = ca0132_mixer;
  10044		break;
  10045	}
  10046
  10047	/* Setup whether or not to use alt functions/controls/pci_mmio */
  10048	switch (ca0132_quirk(spec)) {
  10049	case QUIRK_SBZ:
  10050	case QUIRK_R3D:
  10051	case QUIRK_AE5:
  10052	case QUIRK_AE7:
  10053	case QUIRK_ZXR:
  10054		spec->use_alt_controls = true;
  10055		spec->use_alt_functions = true;
  10056		spec->use_pci_mmio = true;
  10057		break;
  10058	case QUIRK_R3DI:
  10059		spec->use_alt_controls = true;
  10060		spec->use_alt_functions = true;
  10061		spec->use_pci_mmio = false;
  10062		break;
  10063	default:
  10064		spec->use_alt_controls = false;
  10065		spec->use_alt_functions = false;
  10066		spec->use_pci_mmio = false;
  10067		break;
  10068	}
  10069
  10070#ifdef CONFIG_PCI
  10071	if (spec->use_pci_mmio) {
  10072		spec->mem_base = pci_iomap(codec->bus->pci, 2, 0xC20);
  10073		if (spec->mem_base == NULL) {
  10074			codec_warn(codec, "pci_iomap failed! Setting quirk to QUIRK_NONE.");
  10075			spec->quirk = QUIRK_NONE;
  10076		}
  10077	}
  10078#endif
  10079
  10080	spec->base_init_verbs = ca0132_base_init_verbs;
  10081	spec->base_exit_verbs = ca0132_base_exit_verbs;
  10082
  10083	INIT_DELAYED_WORK(&spec->unsol_hp_work, ca0132_unsol_hp_delayed);
  10084
  10085	ca0132_init_chip(codec);
  10086
  10087	ca0132_config(codec);
  10088
  10089	err = ca0132_prepare_verbs(codec);
  10090	if (err < 0)
  10091		goto error;
  10092
  10093	err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL);
  10094	if (err < 0)
  10095		goto error;
  10096
  10097	ca0132_setup_unsol(codec);
  10098
  10099	return 0;
  10100
  10101 error:
  10102	ca0132_free(codec);
  10103	return err;
  10104}
  10105
  10106/*
  10107 * patch entries
  10108 */
  10109static const struct hda_device_id snd_hda_id_ca0132[] = {
  10110	HDA_CODEC_ENTRY(0x11020011, "CA0132", patch_ca0132),
  10111	{} /* terminator */
  10112};
  10113MODULE_DEVICE_TABLE(hdaudio, snd_hda_id_ca0132);
  10114
  10115MODULE_LICENSE("GPL");
  10116MODULE_DESCRIPTION("Creative Sound Core3D codec");
  10117
  10118static struct hda_codec_driver ca0132_driver = {
  10119	.id = snd_hda_id_ca0132,
  10120};
  10121
  10122module_hda_codec_driver(ca0132_driver);