Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'topic/hda' into for-linus

+9553 -2224
+3
Documentation/sound/alsa/ALSA-Configuration.txt
··· 798 798 setup before initializing the codecs. This option is 799 799 available only when CONFIG_SND_HDA_PATCH_LOADER=y is set. 800 800 See HD-Audio.txt for details. 801 + beep_mode - Selects the beep registration mode (0=off, 1=on, 2= 802 + dynamic registration via mute switch on/off); the default 803 + value is set via CONFIG_SND_HDA_INPUT_BEEP_MODE kconfig. 801 804 802 805 [Single (global) options] 803 806 single_cmd - Use single immediate commands to communicate with
+1
Documentation/sound/alsa/HD-Audio-Models.txt
··· 391 391 ref Reference board 392 392 mic-ref Reference board with power management for ports 393 393 dell-s14 Dell laptop 394 + hp HP laptops with (inverted) mute-LED 394 395 auto BIOS setup (default) 395 396 396 397 STAC9872
+321
include/sound/ak4113.h
··· 1 + #ifndef __SOUND_AK4113_H 2 + #define __SOUND_AK4113_H 3 + 4 + /* 5 + * Routines for Asahi Kasei AK4113 6 + * Copyright (c) by Jaroslav Kysela <perex@perex.cz>, 7 + * Copyright (c) by Pavel Hofman <pavel.hofman@ivitera.com>, 8 + * 9 + * 10 + * This program is free software; you can redistribute it and/or modify 11 + * it under the terms of the GNU General Public License as published by 12 + * the Free Software Foundation; either version 2 of the License, or 13 + * (at your option) any later version. 14 + * 15 + * This program is distributed in the hope that it will be useful, 16 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 + * GNU General Public License for more details. 19 + * 20 + * You should have received a copy of the GNU General Public License 21 + * along with this program; if not, write to the Free Software 22 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 23 + * 24 + */ 25 + 26 + /* AK4113 registers */ 27 + /* power down */ 28 + #define AK4113_REG_PWRDN 0x00 29 + /* format control */ 30 + #define AK4113_REG_FORMAT 0x01 31 + /* input/output control */ 32 + #define AK4113_REG_IO0 0x02 33 + /* input/output control */ 34 + #define AK4113_REG_IO1 0x03 35 + /* interrupt0 mask */ 36 + #define AK4113_REG_INT0_MASK 0x04 37 + /* interrupt1 mask */ 38 + #define AK4113_REG_INT1_MASK 0x05 39 + /* DAT mask & DTS select */ 40 + #define AK4113_REG_DATDTS 0x06 41 + /* receiver status 0 */ 42 + #define AK4113_REG_RCS0 0x07 43 + /* receiver status 1 */ 44 + #define AK4113_REG_RCS1 0x08 45 + /* receiver status 2 */ 46 + #define AK4113_REG_RCS2 0x09 47 + /* RX channel status byte 0 */ 48 + #define AK4113_REG_RXCSB0 0x0a 49 + /* RX channel status byte 1 */ 50 + #define AK4113_REG_RXCSB1 0x0b 51 + /* RX channel status byte 2 */ 52 + #define AK4113_REG_RXCSB2 0x0c 53 + /* RX channel status byte 3 */ 54 + #define AK4113_REG_RXCSB3 0x0d 55 + /* RX channel status byte 4 */ 56 + #define AK4113_REG_RXCSB4 0x0e 57 + /* burst preamble Pc byte 0 */ 58 + #define AK4113_REG_Pc0 0x0f 59 + /* burst preamble Pc byte 1 */ 60 + #define AK4113_REG_Pc1 0x10 61 + /* burst preamble Pd byte 0 */ 62 + #define AK4113_REG_Pd0 0x11 63 + /* burst preamble Pd byte 1 */ 64 + #define AK4113_REG_Pd1 0x12 65 + /* Q-subcode address + control */ 66 + #define AK4113_REG_QSUB_ADDR 0x13 67 + /* Q-subcode track */ 68 + #define AK4113_REG_QSUB_TRACK 0x14 69 + /* Q-subcode index */ 70 + #define AK4113_REG_QSUB_INDEX 0x15 71 + /* Q-subcode minute */ 72 + #define AK4113_REG_QSUB_MINUTE 0x16 73 + /* Q-subcode second */ 74 + #define AK4113_REG_QSUB_SECOND 0x17 75 + /* Q-subcode frame */ 76 + #define AK4113_REG_QSUB_FRAME 0x18 77 + /* Q-subcode zero */ 78 + #define AK4113_REG_QSUB_ZERO 0x19 79 + /* Q-subcode absolute minute */ 80 + #define AK4113_REG_QSUB_ABSMIN 0x1a 81 + /* Q-subcode absolute second */ 82 + #define AK4113_REG_QSUB_ABSSEC 0x1b 83 + /* Q-subcode absolute frame */ 84 + #define AK4113_REG_QSUB_ABSFRM 0x1c 85 + 86 + /* sizes */ 87 + #define AK4113_REG_RXCSB_SIZE ((AK4113_REG_RXCSB4-AK4113_REG_RXCSB0)+1) 88 + #define AK4113_REG_QSUB_SIZE ((AK4113_REG_QSUB_ABSFRM-AK4113_REG_QSUB_ADDR)\ 89 + +1) 90 + 91 + #define AK4113_WRITABLE_REGS (AK4113_REG_DATDTS + 1) 92 + 93 + /* AK4113_REG_PWRDN bits */ 94 + /* Channel Status Select */ 95 + #define AK4113_CS12 (1<<7) 96 + /* Block Start & C/U Output Mode */ 97 + #define AK4113_BCU (1<<6) 98 + /* Master Clock Operation Select */ 99 + #define AK4113_CM1 (1<<5) 100 + /* Master Clock Operation Select */ 101 + #define AK4113_CM0 (1<<4) 102 + /* Master Clock Frequency Select */ 103 + #define AK4113_OCKS1 (1<<3) 104 + /* Master Clock Frequency Select */ 105 + #define AK4113_OCKS0 (1<<2) 106 + /* 0 = power down, 1 = normal operation */ 107 + #define AK4113_PWN (1<<1) 108 + /* 0 = reset & initialize (except thisregister), 1 = normal operation */ 109 + #define AK4113_RST (1<<0) 110 + 111 + /* AK4113_REQ_FORMAT bits */ 112 + /* V/TX Output select: 0 = Validity Flag Output, 1 = TX */ 113 + #define AK4113_VTX (1<<7) 114 + /* Audio Data Control */ 115 + #define AK4113_DIF2 (1<<6) 116 + /* Audio Data Control */ 117 + #define AK4113_DIF1 (1<<5) 118 + /* Audio Data Control */ 119 + #define AK4113_DIF0 (1<<4) 120 + /* Deemphasis Autodetect Enable (1 = enable) */ 121 + #define AK4113_DEAU (1<<3) 122 + /* 32kHz-48kHz Deemphasis Control */ 123 + #define AK4113_DEM1 (1<<2) 124 + /* 32kHz-48kHz Deemphasis Control */ 125 + #define AK4113_DEM0 (1<<1) 126 + #define AK4113_DEM_OFF (AK4113_DEM0) 127 + #define AK4113_DEM_44KHZ (0) 128 + #define AK4113_DEM_48KHZ (AK4113_DEM1) 129 + #define AK4113_DEM_32KHZ (AK4113_DEM0|AK4113_DEM1) 130 + /* STDO: 16-bit, right justified */ 131 + #define AK4113_DIF_16R (0) 132 + /* STDO: 18-bit, right justified */ 133 + #define AK4113_DIF_18R (AK4113_DIF0) 134 + /* STDO: 20-bit, right justified */ 135 + #define AK4113_DIF_20R (AK4113_DIF1) 136 + /* STDO: 24-bit, right justified */ 137 + #define AK4113_DIF_24R (AK4113_DIF1|AK4113_DIF0) 138 + /* STDO: 24-bit, left justified */ 139 + #define AK4113_DIF_24L (AK4113_DIF2) 140 + /* STDO: I2S */ 141 + #define AK4113_DIF_24I2S (AK4113_DIF2|AK4113_DIF0) 142 + /* STDO: 24-bit, left justified; LRCLK, BICK = Input */ 143 + #define AK4113_DIF_I24L (AK4113_DIF2|AK4113_DIF1) 144 + /* STDO: I2S; LRCLK, BICK = Input */ 145 + #define AK4113_DIF_I24I2S (AK4113_DIF2|AK4113_DIF1|AK4113_DIF0) 146 + 147 + /* AK4113_REG_IO0 */ 148 + /* XTL1=0,XTL0=0 -> 11.2896Mhz; XTL1=0,XTL0=1 -> 12.288Mhz */ 149 + #define AK4113_XTL1 (1<<6) 150 + /* XTL1=1,XTL0=0 -> 24.576Mhz; XTL1=1,XTL0=1 -> use channel status */ 151 + #define AK4113_XTL0 (1<<5) 152 + /* Block Start Signal Output: 0 = U-bit, 1 = C-bit (req. BCU = 1) */ 153 + #define AK4113_UCE (1<<4) 154 + /* TX Output Enable (1 = enable) */ 155 + #define AK4113_TXE (1<<3) 156 + /* Output Through Data Selector for TX pin */ 157 + #define AK4113_OPS2 (1<<2) 158 + /* Output Through Data Selector for TX pin */ 159 + #define AK4113_OPS1 (1<<1) 160 + /* Output Through Data Selector for TX pin */ 161 + #define AK4113_OPS0 (1<<0) 162 + /* 11.2896 MHz ref. Xtal freq. */ 163 + #define AK4113_XTL_11_2896M (0) 164 + /* 12.288 MHz ref. Xtal freq. */ 165 + #define AK4113_XTL_12_288M (AK4113_XTL0) 166 + /* 24.576 MHz ref. Xtal freq. */ 167 + #define AK4113_XTL_24_576M (AK4113_XTL1) 168 + 169 + /* AK4113_REG_IO1 */ 170 + /* Interrupt 0 pin Hold */ 171 + #define AK4113_EFH1 (1<<7) 172 + /* Interrupt 0 pin Hold */ 173 + #define AK4113_EFH0 (1<<6) 174 + #define AK4113_EFH_512LRCLK (0) 175 + #define AK4113_EFH_1024LRCLK (AK4113_EFH0) 176 + #define AK4113_EFH_2048LRCLK (AK4113_EFH1) 177 + #define AK4113_EFH_4096LRCLK (AK4113_EFH1|AK4113_EFH0) 178 + /* PLL Lock Time: 0 = 384/fs, 1 = 1/fs */ 179 + #define AK4113_FAST (1<<5) 180 + /* MCKO2 Output Select: 0 = CMx/OCKSx, 1 = Xtal */ 181 + #define AK4113_XMCK (1<<4) 182 + /* MCKO2 Output Freq. Select: 0 = x1, 1 = x0.5 (req. XMCK = 1) */ 183 + #define AK4113_DIV (1<<3) 184 + /* Input Recovery Data Select */ 185 + #define AK4113_IPS2 (1<<2) 186 + /* Input Recovery Data Select */ 187 + #define AK4113_IPS1 (1<<1) 188 + /* Input Recovery Data Select */ 189 + #define AK4113_IPS0 (1<<0) 190 + #define AK4113_IPS(x) ((x)&7) 191 + 192 + /* AK4113_REG_INT0_MASK && AK4113_REG_INT1_MASK*/ 193 + /* mask enable for QINT bit */ 194 + #define AK4113_MQI (1<<7) 195 + /* mask enable for AUTO bit */ 196 + #define AK4113_MAUT (1<<6) 197 + /* mask enable for CINT bit */ 198 + #define AK4113_MCIT (1<<5) 199 + /* mask enable for UNLOCK bit */ 200 + #define AK4113_MULK (1<<4) 201 + /* mask enable for V bit */ 202 + #define AK4113_V (1<<3) 203 + /* mask enable for STC bit */ 204 + #define AK4113_STC (1<<2) 205 + /* mask enable for AUDN bit */ 206 + #define AK4113_MAN (1<<1) 207 + /* mask enable for PAR bit */ 208 + #define AK4113_MPR (1<<0) 209 + 210 + /* AK4113_REG_DATDTS */ 211 + /* DAT Start ID Counter */ 212 + #define AK4113_DCNT (1<<4) 213 + /* DTS-CD 16-bit Sync Word Detect */ 214 + #define AK4113_DTS16 (1<<3) 215 + /* DTS-CD 14-bit Sync Word Detect */ 216 + #define AK4113_DTS14 (1<<2) 217 + /* mask enable for DAT bit (if 1, no INT1 effect */ 218 + #define AK4113_MDAT1 (1<<1) 219 + /* mask enable for DAT bit (if 1, no INT0 effect */ 220 + #define AK4113_MDAT0 (1<<0) 221 + 222 + /* AK4113_REG_RCS0 */ 223 + /* Q-subcode buffer interrupt, 0 = no change, 1 = changed */ 224 + #define AK4113_QINT (1<<7) 225 + /* Non-PCM or DTS stream auto detection, 0 = no detect, 1 = detect */ 226 + #define AK4113_AUTO (1<<6) 227 + /* channel status buffer interrupt, 0 = no change, 1 = change */ 228 + #define AK4113_CINT (1<<5) 229 + /* PLL lock status, 0 = lock, 1 = unlock */ 230 + #define AK4113_UNLCK (1<<4) 231 + /* Validity bit, 0 = valid, 1 = invalid */ 232 + #define AK4113_V (1<<3) 233 + /* sampling frequency or Pre-emphasis change, 0 = no detect, 1 = detect */ 234 + #define AK4113_STC (1<<2) 235 + /* audio bit output, 0 = audio, 1 = non-audio */ 236 + #define AK4113_AUDION (1<<1) 237 + /* parity error or biphase error status, 0 = no error, 1 = error */ 238 + #define AK4113_PAR (1<<0) 239 + 240 + /* AK4113_REG_RCS1 */ 241 + /* sampling frequency detection */ 242 + #define AK4113_FS3 (1<<7) 243 + #define AK4113_FS2 (1<<6) 244 + #define AK4113_FS1 (1<<5) 245 + #define AK4113_FS0 (1<<4) 246 + /* Pre-emphasis detect, 0 = OFF, 1 = ON */ 247 + #define AK4113_PEM (1<<3) 248 + /* DAT Start ID Detect, 0 = no detect, 1 = detect */ 249 + #define AK4113_DAT (1<<2) 250 + /* DTS-CD bit audio stream detect, 0 = no detect, 1 = detect */ 251 + #define AK4113_DTSCD (1<<1) 252 + /* Non-PCM bit stream detection, 0 = no detect, 1 = detect */ 253 + #define AK4113_NPCM (1<<0) 254 + #define AK4113_FS_8000HZ (AK4113_FS3|AK4113_FS0) 255 + #define AK4113_FS_11025HZ (AK4113_FS2|AK4113_FS0) 256 + #define AK4113_FS_16000HZ (AK4113_FS2|AK4113_FS1|AK4113_FS0) 257 + #define AK4113_FS_22050HZ (AK4113_FS2) 258 + #define AK4113_FS_24000HZ (AK4113_FS2|AK4113_FS1) 259 + #define AK4113_FS_32000HZ (AK4113_FS1|AK4113_FS0) 260 + #define AK4113_FS_44100HZ (0) 261 + #define AK4113_FS_48000HZ (AK4113_FS1) 262 + #define AK4113_FS_64000HZ (AK4113_FS3|AK4113_FS1|AK4113_FS0) 263 + #define AK4113_FS_88200HZ (AK4113_FS3) 264 + #define AK4113_FS_96000HZ (AK4113_FS3|AK4113_FS1) 265 + #define AK4113_FS_176400HZ (AK4113_FS3|AK4113_FS2) 266 + #define AK4113_FS_192000HZ (AK4113_FS3|AK4113_FS2|AK4113_FS1) 267 + 268 + /* AK4113_REG_RCS2 */ 269 + /* CRC for Q-subcode, 0 = no error, 1 = error */ 270 + #define AK4113_QCRC (1<<1) 271 + /* CRC for channel status, 0 = no error, 1 = error */ 272 + #define AK4113_CCRC (1<<0) 273 + 274 + /* flags for snd_ak4113_check_rate_and_errors() */ 275 + #define AK4113_CHECK_NO_STAT (1<<0) /* no statistics */ 276 + #define AK4113_CHECK_NO_RATE (1<<1) /* no rate check */ 277 + 278 + #define AK4113_CONTROLS 13 279 + 280 + typedef void (ak4113_write_t)(void *private_data, unsigned char addr, 281 + unsigned char data); 282 + typedef unsigned char (ak4113_read_t)(void *private_data, unsigned char addr); 283 + 284 + struct ak4113 { 285 + struct snd_card *card; 286 + ak4113_write_t *write; 287 + ak4113_read_t *read; 288 + void *private_data; 289 + unsigned int init:1; 290 + spinlock_t lock; 291 + unsigned char regmap[AK4113_WRITABLE_REGS]; 292 + struct snd_kcontrol *kctls[AK4113_CONTROLS]; 293 + struct snd_pcm_substream *substream; 294 + unsigned long parity_errors; 295 + unsigned long v_bit_errors; 296 + unsigned long qcrc_errors; 297 + unsigned long ccrc_errors; 298 + unsigned char rcs0; 299 + unsigned char rcs1; 300 + unsigned char rcs2; 301 + struct delayed_work work; 302 + unsigned int check_flags; 303 + void *change_callback_private; 304 + void (*change_callback)(struct ak4113 *ak4113, unsigned char c0, 305 + unsigned char c1); 306 + }; 307 + 308 + int snd_ak4113_create(struct snd_card *card, ak4113_read_t *read, 309 + ak4113_write_t *write, 310 + const unsigned char pgm[AK4113_WRITABLE_REGS], 311 + void *private_data, struct ak4113 **r_ak4113); 312 + void snd_ak4113_reg_write(struct ak4113 *ak4113, unsigned char reg, 313 + unsigned char mask, unsigned char val); 314 + void snd_ak4113_reinit(struct ak4113 *ak4113); 315 + int snd_ak4113_build(struct ak4113 *ak4113, 316 + struct snd_pcm_substream *capture_substream); 317 + int snd_ak4113_external_rate(struct ak4113 *ak4113); 318 + int snd_ak4113_check_rate_and_errors(struct ak4113 *ak4113, unsigned int flags); 319 + 320 + #endif /* __SOUND_AK4113_H */ 321 +
+6 -6
include/sound/ak4114.h
··· 95 95 96 96 /* AK4114_REG_IO0 */ 97 97 #define AK4114_TX1E (1<<7) /* TX1 Output Enable (1 = enable) */ 98 - #define AK4114_OPS12 (1<<2) /* Output Though Data Selector for TX1 pin */ 99 - #define AK4114_OPS11 (1<<1) /* Output Though Data Selector for TX1 pin */ 100 - #define AK4114_OPS10 (1<<0) /* Output Though Data Selector for TX1 pin */ 98 + #define AK4114_OPS12 (1<<6) /* Output Data Selector for TX1 pin */ 99 + #define AK4114_OPS11 (1<<5) /* Output Data Selector for TX1 pin */ 100 + #define AK4114_OPS10 (1<<4) /* Output Data Selector for TX1 pin */ 101 101 #define AK4114_TX0E (1<<3) /* TX0 Output Enable (1 = enable) */ 102 - #define AK4114_OPS02 (1<<2) /* Output Though Data Selector for TX0 pin */ 103 - #define AK4114_OPS01 (1<<1) /* Output Though Data Selector for TX0 pin */ 104 - #define AK4114_OPS00 (1<<0) /* Output Though Data Selector for TX0 pin */ 102 + #define AK4114_OPS02 (1<<2) /* Output Data Selector for TX0 pin */ 103 + #define AK4114_OPS01 (1<<1) /* Output Data Selector for TX0 pin */ 104 + #define AK4114_OPS00 (1<<0) /* Output Data Selector for TX0 pin */ 105 105 106 106 /* AK4114_REG_IO1 */ 107 107 #define AK4114_EFH1 (1<<7) /* Interrupt 0 pin Hold */
+4 -1
include/sound/ak4xxx-adda.h
··· 68 68 enum { 69 69 SND_AK4524, SND_AK4528, SND_AK4529, 70 70 SND_AK4355, SND_AK4358, SND_AK4381, 71 - SND_AK5365 71 + SND_AK5365, SND_AK4620, 72 72 } type; 73 73 74 74 /* (array) information of combined codecs */ ··· 76 76 const struct snd_akm4xxx_adc_channel *adc_info; 77 77 78 78 struct snd_ak4xxx_ops ops; 79 + unsigned int num_chips; 80 + unsigned int total_regs; 81 + const char *name; 79 82 }; 80 83 81 84 void snd_akm4xxx_write(struct snd_akm4xxx *ak, int chip, unsigned char reg,
+2 -1
sound/i2c/other/Makefile
··· 5 5 6 6 snd-ak4114-objs := ak4114.o 7 7 snd-ak4117-objs := ak4117.o 8 + snd-ak4113-objs := ak4113.o 8 9 snd-ak4xxx-adda-objs := ak4xxx-adda.o 9 10 snd-pt2258-objs := pt2258.o 10 11 snd-tea575x-tuner-objs := tea575x-tuner.o ··· 13 12 # Module Dependency 14 13 obj-$(CONFIG_SND_PDAUDIOCF) += snd-ak4117.o 15 14 obj-$(CONFIG_SND_ICE1712) += snd-ak4xxx-adda.o 16 - obj-$(CONFIG_SND_ICE1724) += snd-ak4114.o snd-ak4xxx-adda.o snd-pt2258.o 15 + obj-$(CONFIG_SND_ICE1724) += snd-ak4114.o snd-ak4113.o snd-ak4xxx-adda.o snd-pt2258.o 17 16 obj-$(CONFIG_SND_FM801_TEA575X) += snd-tea575x-tuner.o
+639
sound/i2c/other/ak4113.c
··· 1 + /* 2 + * Routines for control of the AK4113 via I2C/4-wire serial interface 3 + * IEC958 (S/PDIF) receiver by Asahi Kasei 4 + * Copyright (c) by Jaroslav Kysela <perex@perex.cz> 5 + * Copyright (c) by Pavel Hofman <pavel.hofman@ivitera.com> 6 + * 7 + * 8 + * This program is free software; you can redistribute it and/or modify 9 + * it under the terms of the GNU General Public License as published by 10 + * the Free Software Foundation; either version 2 of the License, or 11 + * (at your option) any later version. 12 + * 13 + * This program is distributed in the hope that it will be useful, 14 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 + * GNU General Public License for more details. 17 + * 18 + * You should have received a copy of the GNU General Public License 19 + * along with this program; if not, write to the Free Software 20 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 21 + * 22 + */ 23 + 24 + #include <linux/slab.h> 25 + #include <linux/delay.h> 26 + #include <sound/core.h> 27 + #include <sound/control.h> 28 + #include <sound/pcm.h> 29 + #include <sound/ak4113.h> 30 + #include <sound/asoundef.h> 31 + #include <sound/info.h> 32 + 33 + MODULE_AUTHOR("Pavel Hofman <pavel.hofman@ivitera.com>"); 34 + MODULE_DESCRIPTION("AK4113 IEC958 (S/PDIF) receiver by Asahi Kasei"); 35 + MODULE_LICENSE("GPL"); 36 + 37 + #define AK4113_ADDR 0x00 /* fixed address */ 38 + 39 + static void ak4113_stats(struct work_struct *work); 40 + static void ak4113_init_regs(struct ak4113 *chip); 41 + 42 + 43 + static void reg_write(struct ak4113 *ak4113, unsigned char reg, 44 + unsigned char val) 45 + { 46 + ak4113->write(ak4113->private_data, reg, val); 47 + if (reg < sizeof(ak4113->regmap)) 48 + ak4113->regmap[reg] = val; 49 + } 50 + 51 + static inline unsigned char reg_read(struct ak4113 *ak4113, unsigned char reg) 52 + { 53 + return ak4113->read(ak4113->private_data, reg); 54 + } 55 + 56 + static void snd_ak4113_free(struct ak4113 *chip) 57 + { 58 + chip->init = 1; /* don't schedule new work */ 59 + mb(); 60 + cancel_delayed_work(&chip->work); 61 + flush_scheduled_work(); 62 + kfree(chip); 63 + } 64 + 65 + static int snd_ak4113_dev_free(struct snd_device *device) 66 + { 67 + struct ak4113 *chip = device->device_data; 68 + snd_ak4113_free(chip); 69 + return 0; 70 + } 71 + 72 + int snd_ak4113_create(struct snd_card *card, ak4113_read_t *read, 73 + ak4113_write_t *write, const unsigned char pgm[5], 74 + void *private_data, struct ak4113 **r_ak4113) 75 + { 76 + struct ak4113 *chip; 77 + int err = 0; 78 + unsigned char reg; 79 + static struct snd_device_ops ops = { 80 + .dev_free = snd_ak4113_dev_free, 81 + }; 82 + 83 + chip = kzalloc(sizeof(*chip), GFP_KERNEL); 84 + if (chip == NULL) 85 + return -ENOMEM; 86 + spin_lock_init(&chip->lock); 87 + chip->card = card; 88 + chip->read = read; 89 + chip->write = write; 90 + chip->private_data = private_data; 91 + INIT_DELAYED_WORK(&chip->work, ak4113_stats); 92 + 93 + for (reg = 0; reg < AK4113_WRITABLE_REGS ; reg++) 94 + chip->regmap[reg] = pgm[reg]; 95 + ak4113_init_regs(chip); 96 + 97 + chip->rcs0 = reg_read(chip, AK4113_REG_RCS0) & ~(AK4113_QINT | 98 + AK4113_CINT | AK4113_STC); 99 + chip->rcs1 = reg_read(chip, AK4113_REG_RCS1); 100 + chip->rcs2 = reg_read(chip, AK4113_REG_RCS2); 101 + err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); 102 + if (err < 0) 103 + goto __fail; 104 + 105 + if (r_ak4113) 106 + *r_ak4113 = chip; 107 + return 0; 108 + 109 + __fail: 110 + snd_ak4113_free(chip); 111 + return err < 0 ? err : -EIO; 112 + } 113 + EXPORT_SYMBOL_GPL(snd_ak4113_create); 114 + 115 + void snd_ak4113_reg_write(struct ak4113 *chip, unsigned char reg, 116 + unsigned char mask, unsigned char val) 117 + { 118 + if (reg >= AK4113_WRITABLE_REGS) 119 + return; 120 + reg_write(chip, reg, (chip->regmap[reg] & ~mask) | val); 121 + } 122 + EXPORT_SYMBOL_GPL(snd_ak4113_reg_write); 123 + 124 + static void ak4113_init_regs(struct ak4113 *chip) 125 + { 126 + unsigned char old = chip->regmap[AK4113_REG_PWRDN], reg; 127 + 128 + /* bring the chip to reset state and powerdown state */ 129 + reg_write(chip, AK4113_REG_PWRDN, old & ~(AK4113_RST|AK4113_PWN)); 130 + udelay(200); 131 + /* release reset, but leave powerdown */ 132 + reg_write(chip, AK4113_REG_PWRDN, (old | AK4113_RST) & ~AK4113_PWN); 133 + udelay(200); 134 + for (reg = 1; reg < AK4113_WRITABLE_REGS; reg++) 135 + reg_write(chip, reg, chip->regmap[reg]); 136 + /* release powerdown, everything is initialized now */ 137 + reg_write(chip, AK4113_REG_PWRDN, old | AK4113_RST | AK4113_PWN); 138 + } 139 + 140 + void snd_ak4113_reinit(struct ak4113 *chip) 141 + { 142 + chip->init = 1; 143 + mb(); 144 + flush_scheduled_work(); 145 + ak4113_init_regs(chip); 146 + /* bring up statistics / event queing */ 147 + chip->init = 0; 148 + if (chip->kctls[0]) 149 + schedule_delayed_work(&chip->work, HZ / 10); 150 + } 151 + EXPORT_SYMBOL_GPL(snd_ak4113_reinit); 152 + 153 + static unsigned int external_rate(unsigned char rcs1) 154 + { 155 + switch (rcs1 & (AK4113_FS0|AK4113_FS1|AK4113_FS2|AK4113_FS3)) { 156 + case AK4113_FS_8000HZ: 157 + return 8000; 158 + case AK4113_FS_11025HZ: 159 + return 11025; 160 + case AK4113_FS_16000HZ: 161 + return 16000; 162 + case AK4113_FS_22050HZ: 163 + return 22050; 164 + case AK4113_FS_24000HZ: 165 + return 24000; 166 + case AK4113_FS_32000HZ: 167 + return 32000; 168 + case AK4113_FS_44100HZ: 169 + return 44100; 170 + case AK4113_FS_48000HZ: 171 + return 48000; 172 + case AK4113_FS_64000HZ: 173 + return 64000; 174 + case AK4113_FS_88200HZ: 175 + return 88200; 176 + case AK4113_FS_96000HZ: 177 + return 96000; 178 + case AK4113_FS_176400HZ: 179 + return 176400; 180 + case AK4113_FS_192000HZ: 181 + return 192000; 182 + default: 183 + return 0; 184 + } 185 + } 186 + 187 + static int snd_ak4113_in_error_info(struct snd_kcontrol *kcontrol, 188 + struct snd_ctl_elem_info *uinfo) 189 + { 190 + uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; 191 + uinfo->count = 1; 192 + uinfo->value.integer.min = 0; 193 + uinfo->value.integer.max = LONG_MAX; 194 + return 0; 195 + } 196 + 197 + static int snd_ak4113_in_error_get(struct snd_kcontrol *kcontrol, 198 + struct snd_ctl_elem_value *ucontrol) 199 + { 200 + struct ak4113 *chip = snd_kcontrol_chip(kcontrol); 201 + long *ptr; 202 + 203 + spin_lock_irq(&chip->lock); 204 + ptr = (long *)(((char *)chip) + kcontrol->private_value); 205 + ucontrol->value.integer.value[0] = *ptr; 206 + *ptr = 0; 207 + spin_unlock_irq(&chip->lock); 208 + return 0; 209 + } 210 + 211 + #define snd_ak4113_in_bit_info snd_ctl_boolean_mono_info 212 + 213 + static int snd_ak4113_in_bit_get(struct snd_kcontrol *kcontrol, 214 + struct snd_ctl_elem_value *ucontrol) 215 + { 216 + struct ak4113 *chip = snd_kcontrol_chip(kcontrol); 217 + unsigned char reg = kcontrol->private_value & 0xff; 218 + unsigned char bit = (kcontrol->private_value >> 8) & 0xff; 219 + unsigned char inv = (kcontrol->private_value >> 31) & 1; 220 + 221 + ucontrol->value.integer.value[0] = 222 + ((reg_read(chip, reg) & (1 << bit)) ? 1 : 0) ^ inv; 223 + return 0; 224 + } 225 + 226 + static int snd_ak4113_rx_info(struct snd_kcontrol *kcontrol, 227 + struct snd_ctl_elem_info *uinfo) 228 + { 229 + uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; 230 + uinfo->count = 1; 231 + uinfo->value.integer.min = 0; 232 + uinfo->value.integer.max = 5; 233 + return 0; 234 + } 235 + 236 + static int snd_ak4113_rx_get(struct snd_kcontrol *kcontrol, 237 + struct snd_ctl_elem_value *ucontrol) 238 + { 239 + struct ak4113 *chip = snd_kcontrol_chip(kcontrol); 240 + 241 + ucontrol->value.integer.value[0] = 242 + (AK4113_IPS(chip->regmap[AK4113_REG_IO1])); 243 + return 0; 244 + } 245 + 246 + static int snd_ak4113_rx_put(struct snd_kcontrol *kcontrol, 247 + struct snd_ctl_elem_value *ucontrol) 248 + { 249 + struct ak4113 *chip = snd_kcontrol_chip(kcontrol); 250 + int change; 251 + u8 old_val; 252 + 253 + spin_lock_irq(&chip->lock); 254 + old_val = chip->regmap[AK4113_REG_IO1]; 255 + change = ucontrol->value.integer.value[0] != AK4113_IPS(old_val); 256 + if (change) 257 + reg_write(chip, AK4113_REG_IO1, 258 + (old_val & (~AK4113_IPS(0xff))) | 259 + (AK4113_IPS(ucontrol->value.integer.value[0]))); 260 + spin_unlock_irq(&chip->lock); 261 + return change; 262 + } 263 + 264 + static int snd_ak4113_rate_info(struct snd_kcontrol *kcontrol, 265 + struct snd_ctl_elem_info *uinfo) 266 + { 267 + uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; 268 + uinfo->count = 1; 269 + uinfo->value.integer.min = 0; 270 + uinfo->value.integer.max = 192000; 271 + return 0; 272 + } 273 + 274 + static int snd_ak4113_rate_get(struct snd_kcontrol *kcontrol, 275 + struct snd_ctl_elem_value *ucontrol) 276 + { 277 + struct ak4113 *chip = snd_kcontrol_chip(kcontrol); 278 + 279 + ucontrol->value.integer.value[0] = external_rate(reg_read(chip, 280 + AK4113_REG_RCS1)); 281 + return 0; 282 + } 283 + 284 + static int snd_ak4113_spdif_info(struct snd_kcontrol *kcontrol, 285 + struct snd_ctl_elem_info *uinfo) 286 + { 287 + uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958; 288 + uinfo->count = 1; 289 + return 0; 290 + } 291 + 292 + static int snd_ak4113_spdif_get(struct snd_kcontrol *kcontrol, 293 + struct snd_ctl_elem_value *ucontrol) 294 + { 295 + struct ak4113 *chip = snd_kcontrol_chip(kcontrol); 296 + unsigned i; 297 + 298 + for (i = 0; i < AK4113_REG_RXCSB_SIZE; i++) 299 + ucontrol->value.iec958.status[i] = reg_read(chip, 300 + AK4113_REG_RXCSB0 + i); 301 + return 0; 302 + } 303 + 304 + static int snd_ak4113_spdif_mask_info(struct snd_kcontrol *kcontrol, 305 + struct snd_ctl_elem_info *uinfo) 306 + { 307 + uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958; 308 + uinfo->count = 1; 309 + return 0; 310 + } 311 + 312 + static int snd_ak4113_spdif_mask_get(struct snd_kcontrol *kcontrol, 313 + struct snd_ctl_elem_value *ucontrol) 314 + { 315 + memset(ucontrol->value.iec958.status, 0xff, AK4113_REG_RXCSB_SIZE); 316 + return 0; 317 + } 318 + 319 + static int snd_ak4113_spdif_pinfo(struct snd_kcontrol *kcontrol, 320 + struct snd_ctl_elem_info *uinfo) 321 + { 322 + uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; 323 + uinfo->value.integer.min = 0; 324 + uinfo->value.integer.max = 0xffff; 325 + uinfo->count = 4; 326 + return 0; 327 + } 328 + 329 + static int snd_ak4113_spdif_pget(struct snd_kcontrol *kcontrol, 330 + struct snd_ctl_elem_value *ucontrol) 331 + { 332 + struct ak4113 *chip = snd_kcontrol_chip(kcontrol); 333 + unsigned short tmp; 334 + 335 + ucontrol->value.integer.value[0] = 0xf8f2; 336 + ucontrol->value.integer.value[1] = 0x4e1f; 337 + tmp = reg_read(chip, AK4113_REG_Pc0) | 338 + (reg_read(chip, AK4113_REG_Pc1) << 8); 339 + ucontrol->value.integer.value[2] = tmp; 340 + tmp = reg_read(chip, AK4113_REG_Pd0) | 341 + (reg_read(chip, AK4113_REG_Pd1) << 8); 342 + ucontrol->value.integer.value[3] = tmp; 343 + return 0; 344 + } 345 + 346 + static int snd_ak4113_spdif_qinfo(struct snd_kcontrol *kcontrol, 347 + struct snd_ctl_elem_info *uinfo) 348 + { 349 + uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; 350 + uinfo->count = AK4113_REG_QSUB_SIZE; 351 + return 0; 352 + } 353 + 354 + static int snd_ak4113_spdif_qget(struct snd_kcontrol *kcontrol, 355 + struct snd_ctl_elem_value *ucontrol) 356 + { 357 + struct ak4113 *chip = snd_kcontrol_chip(kcontrol); 358 + unsigned i; 359 + 360 + for (i = 0; i < AK4113_REG_QSUB_SIZE; i++) 361 + ucontrol->value.bytes.data[i] = reg_read(chip, 362 + AK4113_REG_QSUB_ADDR + i); 363 + return 0; 364 + } 365 + 366 + /* Don't forget to change AK4113_CONTROLS define!!! */ 367 + static struct snd_kcontrol_new snd_ak4113_iec958_controls[] = { 368 + { 369 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 370 + .name = "IEC958 Parity Errors", 371 + .access = SNDRV_CTL_ELEM_ACCESS_READ | 372 + SNDRV_CTL_ELEM_ACCESS_VOLATILE, 373 + .info = snd_ak4113_in_error_info, 374 + .get = snd_ak4113_in_error_get, 375 + .private_value = offsetof(struct ak4113, parity_errors), 376 + }, 377 + { 378 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 379 + .name = "IEC958 V-Bit Errors", 380 + .access = SNDRV_CTL_ELEM_ACCESS_READ | 381 + SNDRV_CTL_ELEM_ACCESS_VOLATILE, 382 + .info = snd_ak4113_in_error_info, 383 + .get = snd_ak4113_in_error_get, 384 + .private_value = offsetof(struct ak4113, v_bit_errors), 385 + }, 386 + { 387 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 388 + .name = "IEC958 C-CRC Errors", 389 + .access = SNDRV_CTL_ELEM_ACCESS_READ | 390 + SNDRV_CTL_ELEM_ACCESS_VOLATILE, 391 + .info = snd_ak4113_in_error_info, 392 + .get = snd_ak4113_in_error_get, 393 + .private_value = offsetof(struct ak4113, ccrc_errors), 394 + }, 395 + { 396 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 397 + .name = "IEC958 Q-CRC Errors", 398 + .access = SNDRV_CTL_ELEM_ACCESS_READ | 399 + SNDRV_CTL_ELEM_ACCESS_VOLATILE, 400 + .info = snd_ak4113_in_error_info, 401 + .get = snd_ak4113_in_error_get, 402 + .private_value = offsetof(struct ak4113, qcrc_errors), 403 + }, 404 + { 405 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 406 + .name = "IEC958 External Rate", 407 + .access = SNDRV_CTL_ELEM_ACCESS_READ | 408 + SNDRV_CTL_ELEM_ACCESS_VOLATILE, 409 + .info = snd_ak4113_rate_info, 410 + .get = snd_ak4113_rate_get, 411 + }, 412 + { 413 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 414 + .name = SNDRV_CTL_NAME_IEC958("", CAPTURE, MASK), 415 + .access = SNDRV_CTL_ELEM_ACCESS_READ, 416 + .info = snd_ak4113_spdif_mask_info, 417 + .get = snd_ak4113_spdif_mask_get, 418 + }, 419 + { 420 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 421 + .name = SNDRV_CTL_NAME_IEC958("", CAPTURE, DEFAULT), 422 + .access = SNDRV_CTL_ELEM_ACCESS_READ | 423 + SNDRV_CTL_ELEM_ACCESS_VOLATILE, 424 + .info = snd_ak4113_spdif_info, 425 + .get = snd_ak4113_spdif_get, 426 + }, 427 + { 428 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 429 + .name = "IEC958 Preample Capture Default", 430 + .access = SNDRV_CTL_ELEM_ACCESS_READ | 431 + SNDRV_CTL_ELEM_ACCESS_VOLATILE, 432 + .info = snd_ak4113_spdif_pinfo, 433 + .get = snd_ak4113_spdif_pget, 434 + }, 435 + { 436 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 437 + .name = "IEC958 Q-subcode Capture Default", 438 + .access = SNDRV_CTL_ELEM_ACCESS_READ | 439 + SNDRV_CTL_ELEM_ACCESS_VOLATILE, 440 + .info = snd_ak4113_spdif_qinfo, 441 + .get = snd_ak4113_spdif_qget, 442 + }, 443 + { 444 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 445 + .name = "IEC958 Audio", 446 + .access = SNDRV_CTL_ELEM_ACCESS_READ | 447 + SNDRV_CTL_ELEM_ACCESS_VOLATILE, 448 + .info = snd_ak4113_in_bit_info, 449 + .get = snd_ak4113_in_bit_get, 450 + .private_value = (1<<31) | (1<<8) | AK4113_REG_RCS0, 451 + }, 452 + { 453 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 454 + .name = "IEC958 Non-PCM Bitstream", 455 + .access = SNDRV_CTL_ELEM_ACCESS_READ | 456 + SNDRV_CTL_ELEM_ACCESS_VOLATILE, 457 + .info = snd_ak4113_in_bit_info, 458 + .get = snd_ak4113_in_bit_get, 459 + .private_value = (0<<8) | AK4113_REG_RCS1, 460 + }, 461 + { 462 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 463 + .name = "IEC958 DTS Bitstream", 464 + .access = SNDRV_CTL_ELEM_ACCESS_READ | 465 + SNDRV_CTL_ELEM_ACCESS_VOLATILE, 466 + .info = snd_ak4113_in_bit_info, 467 + .get = snd_ak4113_in_bit_get, 468 + .private_value = (1<<8) | AK4113_REG_RCS1, 469 + }, 470 + { 471 + .iface = SNDRV_CTL_ELEM_IFACE_PCM, 472 + .name = "AK4113 Input Select", 473 + .access = SNDRV_CTL_ELEM_ACCESS_READ | 474 + SNDRV_CTL_ELEM_ACCESS_WRITE, 475 + .info = snd_ak4113_rx_info, 476 + .get = snd_ak4113_rx_get, 477 + .put = snd_ak4113_rx_put, 478 + } 479 + }; 480 + 481 + static void snd_ak4113_proc_regs_read(struct snd_info_entry *entry, 482 + struct snd_info_buffer *buffer) 483 + { 484 + struct ak4113 *ak4113 = entry->private_data; 485 + int reg, val; 486 + /* all ak4113 registers 0x00 - 0x1c */ 487 + for (reg = 0; reg < 0x1d; reg++) { 488 + val = reg_read(ak4113, reg); 489 + snd_iprintf(buffer, "0x%02x = 0x%02x\n", reg, val); 490 + } 491 + } 492 + 493 + static void snd_ak4113_proc_init(struct ak4113 *ak4113) 494 + { 495 + struct snd_info_entry *entry; 496 + if (!snd_card_proc_new(ak4113->card, "ak4113", &entry)) 497 + snd_info_set_text_ops(entry, ak4113, snd_ak4113_proc_regs_read); 498 + } 499 + 500 + int snd_ak4113_build(struct ak4113 *ak4113, 501 + struct snd_pcm_substream *cap_substream) 502 + { 503 + struct snd_kcontrol *kctl; 504 + unsigned int idx; 505 + int err; 506 + 507 + if (snd_BUG_ON(!cap_substream)) 508 + return -EINVAL; 509 + ak4113->substream = cap_substream; 510 + for (idx = 0; idx < AK4113_CONTROLS; idx++) { 511 + kctl = snd_ctl_new1(&snd_ak4113_iec958_controls[idx], ak4113); 512 + if (kctl == NULL) 513 + return -ENOMEM; 514 + kctl->id.device = cap_substream->pcm->device; 515 + kctl->id.subdevice = cap_substream->number; 516 + err = snd_ctl_add(ak4113->card, kctl); 517 + if (err < 0) 518 + return err; 519 + ak4113->kctls[idx] = kctl; 520 + } 521 + snd_ak4113_proc_init(ak4113); 522 + /* trigger workq */ 523 + schedule_delayed_work(&ak4113->work, HZ / 10); 524 + return 0; 525 + } 526 + EXPORT_SYMBOL_GPL(snd_ak4113_build); 527 + 528 + int snd_ak4113_external_rate(struct ak4113 *ak4113) 529 + { 530 + unsigned char rcs1; 531 + 532 + rcs1 = reg_read(ak4113, AK4113_REG_RCS1); 533 + return external_rate(rcs1); 534 + } 535 + EXPORT_SYMBOL_GPL(snd_ak4113_external_rate); 536 + 537 + int snd_ak4113_check_rate_and_errors(struct ak4113 *ak4113, unsigned int flags) 538 + { 539 + struct snd_pcm_runtime *runtime = 540 + ak4113->substream ? ak4113->substream->runtime : NULL; 541 + unsigned long _flags; 542 + int res = 0; 543 + unsigned char rcs0, rcs1, rcs2; 544 + unsigned char c0, c1; 545 + 546 + rcs1 = reg_read(ak4113, AK4113_REG_RCS1); 547 + if (flags & AK4113_CHECK_NO_STAT) 548 + goto __rate; 549 + rcs0 = reg_read(ak4113, AK4113_REG_RCS0); 550 + rcs2 = reg_read(ak4113, AK4113_REG_RCS2); 551 + spin_lock_irqsave(&ak4113->lock, _flags); 552 + if (rcs0 & AK4113_PAR) 553 + ak4113->parity_errors++; 554 + if (rcs0 & AK4113_V) 555 + ak4113->v_bit_errors++; 556 + if (rcs2 & AK4113_CCRC) 557 + ak4113->ccrc_errors++; 558 + if (rcs2 & AK4113_QCRC) 559 + ak4113->qcrc_errors++; 560 + c0 = (ak4113->rcs0 & (AK4113_QINT | AK4113_CINT | AK4113_STC | 561 + AK4113_AUDION | AK4113_AUTO | AK4113_UNLCK)) ^ 562 + (rcs0 & (AK4113_QINT | AK4113_CINT | AK4113_STC | 563 + AK4113_AUDION | AK4113_AUTO | AK4113_UNLCK)); 564 + c1 = (ak4113->rcs1 & (AK4113_DTSCD | AK4113_NPCM | AK4113_PEM | 565 + AK4113_DAT | 0xf0)) ^ 566 + (rcs1 & (AK4113_DTSCD | AK4113_NPCM | AK4113_PEM | 567 + AK4113_DAT | 0xf0)); 568 + ak4113->rcs0 = rcs0 & ~(AK4113_QINT | AK4113_CINT | AK4113_STC); 569 + ak4113->rcs1 = rcs1; 570 + ak4113->rcs2 = rcs2; 571 + spin_unlock_irqrestore(&ak4113->lock, _flags); 572 + 573 + if (rcs0 & AK4113_PAR) 574 + snd_ctl_notify(ak4113->card, SNDRV_CTL_EVENT_MASK_VALUE, 575 + &ak4113->kctls[0]->id); 576 + if (rcs0 & AK4113_V) 577 + snd_ctl_notify(ak4113->card, SNDRV_CTL_EVENT_MASK_VALUE, 578 + &ak4113->kctls[1]->id); 579 + if (rcs2 & AK4113_CCRC) 580 + snd_ctl_notify(ak4113->card, SNDRV_CTL_EVENT_MASK_VALUE, 581 + &ak4113->kctls[2]->id); 582 + if (rcs2 & AK4113_QCRC) 583 + snd_ctl_notify(ak4113->card, SNDRV_CTL_EVENT_MASK_VALUE, 584 + &ak4113->kctls[3]->id); 585 + 586 + /* rate change */ 587 + if (c1 & 0xf0) 588 + snd_ctl_notify(ak4113->card, SNDRV_CTL_EVENT_MASK_VALUE, 589 + &ak4113->kctls[4]->id); 590 + 591 + if ((c1 & AK4113_PEM) | (c0 & AK4113_CINT)) 592 + snd_ctl_notify(ak4113->card, SNDRV_CTL_EVENT_MASK_VALUE, 593 + &ak4113->kctls[6]->id); 594 + if (c0 & AK4113_QINT) 595 + snd_ctl_notify(ak4113->card, SNDRV_CTL_EVENT_MASK_VALUE, 596 + &ak4113->kctls[8]->id); 597 + 598 + if (c0 & AK4113_AUDION) 599 + snd_ctl_notify(ak4113->card, SNDRV_CTL_EVENT_MASK_VALUE, 600 + &ak4113->kctls[9]->id); 601 + if (c1 & AK4113_NPCM) 602 + snd_ctl_notify(ak4113->card, SNDRV_CTL_EVENT_MASK_VALUE, 603 + &ak4113->kctls[10]->id); 604 + if (c1 & AK4113_DTSCD) 605 + snd_ctl_notify(ak4113->card, SNDRV_CTL_EVENT_MASK_VALUE, 606 + &ak4113->kctls[11]->id); 607 + 608 + if (ak4113->change_callback && (c0 | c1) != 0) 609 + ak4113->change_callback(ak4113, c0, c1); 610 + 611 + __rate: 612 + /* compare rate */ 613 + res = external_rate(rcs1); 614 + if (!(flags & AK4113_CHECK_NO_RATE) && runtime && 615 + (runtime->rate != res)) { 616 + snd_pcm_stream_lock_irqsave(ak4113->substream, _flags); 617 + if (snd_pcm_running(ak4113->substream)) { 618 + /*printk(KERN_DEBUG "rate changed (%i <- %i)\n", 619 + * runtime->rate, res); */ 620 + snd_pcm_stop(ak4113->substream, 621 + SNDRV_PCM_STATE_DRAINING); 622 + wake_up(&runtime->sleep); 623 + res = 1; 624 + } 625 + snd_pcm_stream_unlock_irqrestore(ak4113->substream, _flags); 626 + } 627 + return res; 628 + } 629 + EXPORT_SYMBOL_GPL(snd_ak4113_check_rate_and_errors); 630 + 631 + static void ak4113_stats(struct work_struct *work) 632 + { 633 + struct ak4113 *chip = container_of(work, struct ak4113, work.work); 634 + 635 + if (!chip->init) 636 + snd_ak4113_check_rate_and_errors(chip, chip->check_flags); 637 + 638 + schedule_delayed_work(&chip->work, HZ / 10); 639 + }
+104 -32
sound/i2c/other/ak4xxx-adda.c
··· 19 19 * along with this program; if not, write to the Free Software 20 20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 21 21 * 22 - */ 22 + */ 23 23 24 24 #include <asm/io.h> 25 25 #include <linux/delay.h> ··· 29 29 #include <sound/control.h> 30 30 #include <sound/tlv.h> 31 31 #include <sound/ak4xxx-adda.h> 32 + #include <sound/info.h> 32 33 33 34 MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>, Takashi Iwai <tiwai@suse.de>"); 34 35 MODULE_DESCRIPTION("Routines for control of AK452x / AK43xx AD/DA converters"); ··· 53 52 static void ak4524_reset(struct snd_akm4xxx *ak, int state) 54 53 { 55 54 unsigned int chip; 56 - unsigned char reg, maxreg; 55 + unsigned char reg; 57 56 58 - if (ak->type == SND_AK4528) 59 - maxreg = 0x06; 60 - else 61 - maxreg = 0x08; 62 57 for (chip = 0; chip < ak->num_dacs/2; chip++) { 63 58 snd_akm4xxx_write(ak, chip, 0x01, state ? 0x00 : 0x03); 64 59 if (state) 65 60 continue; 66 61 /* DAC volumes */ 67 - for (reg = 0x04; reg < maxreg; reg++) 62 + for (reg = 0x04; reg < ak->total_regs; reg++) 68 63 snd_akm4xxx_write(ak, chip, reg, 69 64 snd_akm4xxx_get(ak, chip, reg)); 70 65 } 71 66 } 72 67 73 68 /* reset procedure for AK4355 and AK4358 */ 74 - static void ak435X_reset(struct snd_akm4xxx *ak, int state, 75 - unsigned char total_regs) 69 + static void ak435X_reset(struct snd_akm4xxx *ak, int state) 76 70 { 77 71 unsigned char reg; 78 72 ··· 75 79 snd_akm4xxx_write(ak, 0, 0x01, 0x02); /* reset and soft-mute */ 76 80 return; 77 81 } 78 - for (reg = 0x00; reg < total_regs; reg++) 82 + for (reg = 0x00; reg < ak->total_regs; reg++) 79 83 if (reg != 0x01) 80 84 snd_akm4xxx_write(ak, 0, reg, 81 85 snd_akm4xxx_get(ak, 0, reg)); ··· 87 91 { 88 92 unsigned int chip; 89 93 unsigned char reg; 90 - 91 94 for (chip = 0; chip < ak->num_dacs/2; chip++) { 92 95 snd_akm4xxx_write(ak, chip, 0x00, state ? 0x0c : 0x0f); 93 96 if (state) 94 97 continue; 95 - for (reg = 0x01; reg < 0x05; reg++) 98 + for (reg = 0x01; reg < ak->total_regs; reg++) 96 99 snd_akm4xxx_write(ak, chip, reg, 97 100 snd_akm4xxx_get(ak, chip, reg)); 98 101 } ··· 108 113 switch (ak->type) { 109 114 case SND_AK4524: 110 115 case SND_AK4528: 116 + case SND_AK4620: 111 117 ak4524_reset(ak, state); 112 118 break; 113 119 case SND_AK4529: 114 120 /* FIXME: needed for ak4529? */ 115 121 break; 116 122 case SND_AK4355: 117 - ak435X_reset(ak, state, 0x0b); 123 + ak435X_reset(ak, state); 118 124 break; 119 125 case SND_AK4358: 120 - ak435X_reset(ak, state, 0x10); 126 + ak435X_reset(ak, state); 121 127 break; 122 128 case SND_AK4381: 123 129 ak4381_reset(ak, state); ··· 135 139 * Volume conversion table for non-linear volumes 136 140 * from -63.5dB (mute) to 0dB step 0.5dB 137 141 * 138 - * Used for AK4524 input/ouput attenuation, AK4528, and 142 + * Used for AK4524/AK4620 input/ouput attenuation, AK4528, and 139 143 * AK5365 input attenuation 140 144 */ 141 145 static const unsigned char vol_cvt_datt[128] = { ··· 255 259 0x00, 0x0f, /* 0: power-up, un-reset */ 256 260 0xff, 0xff 257 261 }; 262 + static const unsigned char inits_ak4620[] = { 263 + 0x00, 0x07, /* 0: normal */ 264 + 0x01, 0x00, /* 0: reset */ 265 + 0x01, 0x02, /* 1: RSTAD */ 266 + 0x01, 0x03, /* 1: RSTDA */ 267 + 0x01, 0x0f, /* 1: normal */ 268 + 0x02, 0x60, /* 2: 24bit I2S */ 269 + 0x03, 0x01, /* 3: deemphasis off */ 270 + 0x04, 0x00, /* 4: LIN muted */ 271 + 0x05, 0x00, /* 5: RIN muted */ 272 + 0x06, 0x00, /* 6: LOUT muted */ 273 + 0x07, 0x00, /* 7: ROUT muted */ 274 + 0xff, 0xff 275 + }; 258 276 259 - int chip, num_chips; 277 + int chip; 260 278 const unsigned char *ptr, *inits; 261 279 unsigned char reg, data; 262 280 ··· 280 270 switch (ak->type) { 281 271 case SND_AK4524: 282 272 inits = inits_ak4524; 283 - num_chips = ak->num_dacs / 2; 273 + ak->num_chips = ak->num_dacs / 2; 274 + ak->name = "ak4524"; 275 + ak->total_regs = 0x08; 284 276 break; 285 277 case SND_AK4528: 286 278 inits = inits_ak4528; 287 - num_chips = ak->num_dacs / 2; 279 + ak->num_chips = ak->num_dacs / 2; 280 + ak->name = "ak4528"; 281 + ak->total_regs = 0x06; 288 282 break; 289 283 case SND_AK4529: 290 284 inits = inits_ak4529; 291 - num_chips = 1; 285 + ak->num_chips = 1; 286 + ak->name = "ak4529"; 287 + ak->total_regs = 0x0d; 292 288 break; 293 289 case SND_AK4355: 294 290 inits = inits_ak4355; 295 - num_chips = 1; 291 + ak->num_chips = 1; 292 + ak->name = "ak4355"; 293 + ak->total_regs = 0x0b; 296 294 break; 297 295 case SND_AK4358: 298 296 inits = inits_ak4358; 299 - num_chips = 1; 297 + ak->num_chips = 1; 298 + ak->name = "ak4358"; 299 + ak->total_regs = 0x10; 300 300 break; 301 301 case SND_AK4381: 302 302 inits = inits_ak4381; 303 - num_chips = ak->num_dacs / 2; 303 + ak->num_chips = ak->num_dacs / 2; 304 + ak->name = "ak4381"; 305 + ak->total_regs = 0x05; 304 306 break; 305 307 case SND_AK5365: 306 308 /* FIXME: any init sequence? */ 309 + ak->num_chips = 1; 310 + ak->name = "ak5365"; 311 + ak->total_regs = 0x08; 307 312 return; 313 + case SND_AK4620: 314 + inits = inits_ak4620; 315 + ak->num_chips = ak->num_dacs / 2; 316 + ak->name = "ak4620"; 317 + ak->total_regs = 0x08; 318 + break; 308 319 default: 309 320 snd_BUG(); 310 321 return; 311 322 } 312 323 313 - for (chip = 0; chip < num_chips; chip++) { 324 + for (chip = 0; chip < ak->num_chips; chip++) { 314 325 ptr = inits; 315 326 while (*ptr != 0xff) { 316 327 reg = *ptr++; 317 328 data = *ptr++; 318 329 snd_akm4xxx_write(ak, chip, reg, data); 330 + udelay(10); 319 331 } 320 332 } 321 333 } ··· 720 688 AK_COMPOSE(idx/2, (idx%2) + 3, 0, 255); 721 689 knew.tlv.p = db_scale_linear; 722 690 break; 691 + case SND_AK4620: 692 + /* register 6 & 7 */ 693 + knew.private_value = 694 + AK_COMPOSE(idx/2, (idx%2) + 6, 0, 255); 695 + knew.tlv.p = db_scale_linear; 696 + break; 723 697 default: 724 698 return -EINVAL; 725 699 } ··· 742 704 743 705 static int build_adc_controls(struct snd_akm4xxx *ak) 744 706 { 745 - int idx, err, mixer_ch, num_stereo; 707 + int idx, err, mixer_ch, num_stereo, max_steps; 746 708 struct snd_kcontrol_new knew; 747 709 748 710 mixer_ch = 0; 711 + if (ak->type == SND_AK4528) 712 + return 0; /* no controls */ 749 713 for (idx = 0; idx < ak->num_adcs;) { 750 714 memset(&knew, 0, sizeof(knew)); 751 715 if (! ak->adc_info || ! ak->adc_info[mixer_ch].name) { ··· 773 733 } 774 734 /* register 4 & 5 */ 775 735 if (ak->type == SND_AK5365) 776 - knew.private_value = 777 - AK_COMPOSE(idx/2, (idx%2) + 4, 0, 151) | 778 - AK_VOL_CVT | AK_IPGA; 736 + max_steps = 152; 779 737 else 780 - knew.private_value = 781 - AK_COMPOSE(idx/2, (idx%2) + 4, 0, 163) | 782 - AK_VOL_CVT | AK_IPGA; 738 + max_steps = 164; 739 + knew.private_value = 740 + AK_COMPOSE(idx/2, (idx%2) + 4, 0, max_steps) | 741 + AK_VOL_CVT | AK_IPGA; 783 742 knew.tlv.p = db_scale_vol_datt; 784 743 err = snd_ctl_add(ak->card, snd_ctl_new1(&knew, ak)); 785 744 if (err < 0) ··· 847 808 switch (ak->type) { 848 809 case SND_AK4524: 849 810 case SND_AK4528: 811 + case SND_AK4620: 850 812 /* register 3 */ 851 813 knew.private_value = AK_COMPOSE(idx, 3, 0, 0); 852 814 break; ··· 874 834 return 0; 875 835 } 876 836 837 + #ifdef CONFIG_PROC_FS 838 + static void proc_regs_read(struct snd_info_entry *entry, 839 + struct snd_info_buffer *buffer) 840 + { 841 + struct snd_akm4xxx *ak = (struct snd_akm4xxx *)entry->private_data; 842 + int reg, val, chip; 843 + for (chip = 0; chip < ak->num_chips; chip++) { 844 + for (reg = 0; reg < ak->total_regs; reg++) { 845 + val = snd_akm4xxx_get(ak, chip, reg); 846 + snd_iprintf(buffer, "chip %d: 0x%02x = 0x%02x\n", chip, 847 + reg, val); 848 + } 849 + } 850 + } 851 + 852 + static int proc_init(struct snd_akm4xxx *ak) 853 + { 854 + struct snd_info_entry *entry; 855 + int err; 856 + err = snd_card_proc_new(ak->card, ak->name, &entry); 857 + if (err < 0) 858 + return err; 859 + snd_info_set_text_ops(entry, ak, proc_regs_read); 860 + return 0; 861 + } 862 + #else /* !CONFIG_PROC_FS */ 863 + static int proc_init(struct snd_akm4xxx *ak) {} 864 + #endif 865 + 877 866 int snd_akm4xxx_build_controls(struct snd_akm4xxx *ak) 878 867 { 879 868 int err, num_emphs; ··· 914 845 err = build_adc_controls(ak); 915 846 if (err < 0) 916 847 return err; 917 - 918 848 if (ak->type == SND_AK4355 || ak->type == SND_AK4358) 919 849 num_emphs = 1; 850 + else if (ak->type == SND_AK4620) 851 + num_emphs = 0; 920 852 else 921 853 num_emphs = ak->num_dacs / 2; 922 854 err = build_deemphasis(ak, num_emphs); 923 855 if (err < 0) 924 856 return err; 857 + err = proc_init(ak); 858 + if (err < 0) 859 + return err; 925 860 926 861 return 0; 927 862 } 928 - 929 863 EXPORT_SYMBOL(snd_akm4xxx_build_controls); 930 864 931 865 static int __init alsa_akm4xxx_module_init(void)
+12 -1
sound/pci/hda/Kconfig
··· 38 38 Say Y here to build a digital beep interface for HD-audio 39 39 driver. This interface is used to generate digital beeps. 40 40 41 + config SND_HDA_INPUT_BEEP_MODE 42 + int "Digital beep registration mode (0=off, 1=on, 2=mute sw on/off)" 43 + depends on SND_HDA_INPUT_BEEP=y 44 + default "1" 45 + range 0 2 46 + help 47 + Set 0 to disable the digital beep interface for HD-audio by default. 48 + Set 1 to always enable the digital beep interface for HD-audio by 49 + default. Set 2 to control the beep device registration to input 50 + layer using a "Beep Switch" in mixer applications. 51 + 41 52 config SND_HDA_INPUT_JACK 42 53 bool "Support jack plugging notification via input layer" 43 - depends on INPUT=y || INPUT=SND_HDA_INTEL 54 + depends on INPUT=y || INPUT=SND 44 55 select SND_JACK 45 56 help 46 57 Say Y here to enable the jack plugging notification via
+96 -18
sound/pci/hda/hda_beep.c
··· 113 113 return 0; 114 114 } 115 115 116 - int snd_hda_attach_beep_device(struct hda_codec *codec, int nid) 116 + static void snd_hda_do_detach(struct hda_beep *beep) 117 + { 118 + input_unregister_device(beep->dev); 119 + beep->dev = NULL; 120 + cancel_work_sync(&beep->beep_work); 121 + /* turn off beep for sure */ 122 + snd_hda_codec_write_cache(beep->codec, beep->nid, 0, 123 + AC_VERB_SET_BEEP_CONTROL, 0); 124 + } 125 + 126 + static int snd_hda_do_attach(struct hda_beep *beep) 117 127 { 118 128 struct input_dev *input_dev; 119 - struct hda_beep *beep; 129 + struct hda_codec *codec = beep->codec; 120 130 int err; 121 131 122 - if (!snd_hda_get_bool_hint(codec, "beep")) 123 - return 0; /* disabled explicitly */ 124 - 125 - beep = kzalloc(sizeof(*beep), GFP_KERNEL); 126 - if (beep == NULL) 127 - return -ENOMEM; 128 - snprintf(beep->phys, sizeof(beep->phys), 129 - "card%d/codec#%d/beep0", codec->bus->card->number, codec->addr); 130 132 input_dev = input_allocate_device(); 131 133 if (!input_dev) { 132 - kfree(beep); 134 + printk(KERN_INFO "hda_beep: unable to allocate input device\n"); 133 135 return -ENOMEM; 134 136 } 135 137 ··· 153 151 err = input_register_device(input_dev); 154 152 if (err < 0) { 155 153 input_free_device(input_dev); 156 - kfree(beep); 154 + printk(KERN_INFO "hda_beep: unable to register input device\n"); 157 155 return err; 158 156 } 157 + beep->dev = input_dev; 158 + return 0; 159 + } 159 160 161 + static void snd_hda_do_register(struct work_struct *work) 162 + { 163 + struct hda_beep *beep = 164 + container_of(work, struct hda_beep, register_work); 165 + 166 + mutex_lock(&beep->mutex); 167 + if (beep->enabled && !beep->dev) 168 + snd_hda_do_attach(beep); 169 + mutex_unlock(&beep->mutex); 170 + } 171 + 172 + static void snd_hda_do_unregister(struct work_struct *work) 173 + { 174 + struct hda_beep *beep = 175 + container_of(work, struct hda_beep, unregister_work.work); 176 + 177 + mutex_lock(&beep->mutex); 178 + if (!beep->enabled && beep->dev) 179 + snd_hda_do_detach(beep); 180 + mutex_unlock(&beep->mutex); 181 + } 182 + 183 + int snd_hda_enable_beep_device(struct hda_codec *codec, int enable) 184 + { 185 + struct hda_beep *beep = codec->beep; 186 + enable = !!enable; 187 + if (beep == NULL) 188 + return 0; 189 + if (beep->enabled != enable) { 190 + beep->enabled = enable; 191 + if (!enable) { 192 + /* turn off beep */ 193 + snd_hda_codec_write_cache(beep->codec, beep->nid, 0, 194 + AC_VERB_SET_BEEP_CONTROL, 0); 195 + } 196 + if (beep->mode == HDA_BEEP_MODE_SWREG) { 197 + if (enable) { 198 + cancel_delayed_work(&beep->unregister_work); 199 + schedule_work(&beep->register_work); 200 + } else { 201 + schedule_delayed_work(&beep->unregister_work, 202 + HZ); 203 + } 204 + } 205 + return 1; 206 + } 207 + return 0; 208 + } 209 + EXPORT_SYMBOL_HDA(snd_hda_enable_beep_device); 210 + 211 + int snd_hda_attach_beep_device(struct hda_codec *codec, int nid) 212 + { 213 + struct hda_beep *beep; 214 + 215 + if (!snd_hda_get_bool_hint(codec, "beep")) 216 + return 0; /* disabled explicitly by hints */ 217 + if (codec->beep_mode == HDA_BEEP_MODE_OFF) 218 + return 0; /* disabled by module option */ 219 + 220 + beep = kzalloc(sizeof(*beep), GFP_KERNEL); 221 + if (beep == NULL) 222 + return -ENOMEM; 223 + snprintf(beep->phys, sizeof(beep->phys), 224 + "card%d/codec#%d/beep0", codec->bus->card->number, codec->addr); 160 225 /* enable linear scale */ 161 226 snd_hda_codec_write(codec, nid, 0, 162 227 AC_VERB_SET_DIGI_CONVERT_2, 0x01); 163 228 164 229 beep->nid = nid; 165 - beep->dev = input_dev; 166 230 beep->codec = codec; 167 - beep->enabled = 1; 231 + beep->mode = codec->beep_mode; 168 232 codec->beep = beep; 169 233 234 + INIT_WORK(&beep->register_work, &snd_hda_do_register); 235 + INIT_DELAYED_WORK(&beep->unregister_work, &snd_hda_do_unregister); 170 236 INIT_WORK(&beep->beep_work, &snd_hda_generate_beep); 237 + mutex_init(&beep->mutex); 238 + 239 + if (beep->mode == HDA_BEEP_MODE_ON) { 240 + beep->enabled = 1; 241 + snd_hda_do_register(&beep->register_work); 242 + } 243 + 171 244 return 0; 172 245 } 173 246 EXPORT_SYMBOL_HDA(snd_hda_attach_beep_device); ··· 251 174 { 252 175 struct hda_beep *beep = codec->beep; 253 176 if (beep) { 254 - cancel_work_sync(&beep->beep_work); 255 - 256 - input_unregister_device(beep->dev); 257 - kfree(beep); 177 + cancel_work_sync(&beep->register_work); 178 + cancel_delayed_work(&beep->unregister_work); 179 + if (beep->enabled) 180 + snd_hda_do_detach(beep); 258 181 codec->beep = NULL; 182 + kfree(beep); 259 183 } 260 184 } 261 185 EXPORT_SYMBOL_HDA(snd_hda_detach_beep_device);
+10
sound/pci/hda/hda_beep.h
··· 24 24 25 25 #include "hda_codec.h" 26 26 27 + #define HDA_BEEP_MODE_OFF 0 28 + #define HDA_BEEP_MODE_ON 1 29 + #define HDA_BEEP_MODE_SWREG 2 30 + 27 31 /* beep information */ 28 32 struct hda_beep { 29 33 struct input_dev *dev; 30 34 struct hda_codec *codec; 35 + unsigned int mode; 31 36 char phys[32]; 32 37 int tone; 33 38 hda_nid_t nid; 34 39 unsigned int enabled:1; 40 + unsigned int request_enable:1; 35 41 unsigned int linear_tone:1; /* linear tone for IDT/STAC codec */ 42 + struct work_struct register_work; /* registration work */ 43 + struct delayed_work unregister_work; /* unregistration work */ 36 44 struct work_struct beep_work; /* scheduled task for beep event */ 45 + struct mutex mutex; 37 46 }; 38 47 39 48 #ifdef CONFIG_SND_HDA_INPUT_BEEP 49 + int snd_hda_enable_beep_device(struct hda_codec *codec, int enable); 40 50 int snd_hda_attach_beep_device(struct hda_codec *codec, int nid); 41 51 void snd_hda_detach_beep_device(struct hda_codec *codec); 42 52 #else
+514 -91
sound/pci/hda/hda_codec.c
··· 30 30 #include <sound/tlv.h> 31 31 #include <sound/initval.h> 32 32 #include "hda_local.h" 33 + #include "hda_beep.h" 33 34 #include <sound/hda_hwdep.h> 34 35 35 36 /* ··· 94 93 static inline void hda_keep_power_on(struct hda_codec *codec) {} 95 94 #endif 96 95 96 + /** 97 + * snd_hda_get_jack_location - Give a location string of the jack 98 + * @cfg: pin default config value 99 + * 100 + * Parse the pin default config value and returns the string of the 101 + * jack location, e.g. "Rear", "Front", etc. 102 + */ 97 103 const char *snd_hda_get_jack_location(u32 cfg) 98 104 { 99 105 static char *bases[7] = { ··· 128 120 } 129 121 EXPORT_SYMBOL_HDA(snd_hda_get_jack_location); 130 122 123 + /** 124 + * snd_hda_get_jack_connectivity - Give a connectivity string of the jack 125 + * @cfg: pin default config value 126 + * 127 + * Parse the pin default config value and returns the string of the 128 + * jack connectivity, i.e. external or internal connection. 129 + */ 131 130 const char *snd_hda_get_jack_connectivity(u32 cfg) 132 131 { 133 132 static char *jack_locations[4] = { "Ext", "Int", "Sep", "Oth" }; ··· 143 128 } 144 129 EXPORT_SYMBOL_HDA(snd_hda_get_jack_connectivity); 145 130 131 + /** 132 + * snd_hda_get_jack_type - Give a type string of the jack 133 + * @cfg: pin default config value 134 + * 135 + * Parse the pin default config value and returns the string of the 136 + * jack type, i.e. the purpose of the jack, such as Line-Out or CD. 137 + */ 146 138 const char *snd_hda_get_jack_type(u32 cfg) 147 139 { 148 140 static char *jack_types[16] = { ··· 537 515 struct hda_codec *codec; 538 516 list_for_each_entry(codec, &bus->codec_list, list) { 539 517 snd_hda_hwdep_add_sysfs(codec); 518 + snd_hda_hwdep_add_power_sysfs(codec); 540 519 } 541 520 return 0; 542 521 } ··· 843 820 return 0; 844 821 } 845 822 823 + /** 824 + * snd_hda_codec_set_pincfg - Override a pin default configuration 825 + * @codec: the HDA codec 826 + * @nid: NID to set the pin config 827 + * @cfg: the pin default config value 828 + * 829 + * Override a pin default configuration value in the cache. 830 + * This value can be read by snd_hda_codec_get_pincfg() in a higher 831 + * priority than the real hardware value. 832 + */ 846 833 int snd_hda_codec_set_pincfg(struct hda_codec *codec, 847 834 hda_nid_t nid, unsigned int cfg) 848 835 { ··· 860 827 } 861 828 EXPORT_SYMBOL_HDA(snd_hda_codec_set_pincfg); 862 829 863 - /* get the current pin config value of the given pin NID */ 830 + /** 831 + * snd_hda_codec_get_pincfg - Obtain a pin-default configuration 832 + * @codec: the HDA codec 833 + * @nid: NID to get the pin config 834 + * 835 + * Get the current pin config value of the given pin NID. 836 + * If the pincfg value is cached or overridden via sysfs or driver, 837 + * returns the cached value. 838 + */ 864 839 unsigned int snd_hda_codec_get_pincfg(struct hda_codec *codec, hda_nid_t nid) 865 840 { 866 841 struct hda_pincfg *pin; ··· 985 944 mutex_init(&codec->control_mutex); 986 945 init_hda_cache(&codec->amp_cache, sizeof(struct hda_amp_info)); 987 946 init_hda_cache(&codec->cmd_cache, sizeof(struct hda_cache_head)); 988 - snd_array_init(&codec->mixers, sizeof(struct snd_kcontrol *), 32); 947 + snd_array_init(&codec->mixers, sizeof(struct hda_nid_item), 60); 989 948 snd_array_init(&codec->init_pins, sizeof(struct hda_pincfg), 16); 990 949 snd_array_init(&codec->driver_pins, sizeof(struct hda_pincfg), 16); 991 950 if (codec->bus->modelname) { ··· 1067 1026 } 1068 1027 EXPORT_SYMBOL_HDA(snd_hda_codec_new); 1069 1028 1029 + /** 1030 + * snd_hda_codec_configure - (Re-)configure the HD-audio codec 1031 + * @codec: the HDA codec 1032 + * 1033 + * Start parsing of the given codec tree and (re-)initialize the whole 1034 + * patch instance. 1035 + * 1036 + * Returns 0 if successful or a negative error code. 1037 + */ 1070 1038 int snd_hda_codec_configure(struct hda_codec *codec) 1071 1039 { 1072 1040 int err; ··· 1138 1088 } 1139 1089 EXPORT_SYMBOL_HDA(snd_hda_codec_setup_stream); 1140 1090 1091 + /** 1092 + * snd_hda_codec_cleanup_stream - clean up the codec for closing 1093 + * @codec: the CODEC to clean up 1094 + * @nid: the NID to clean up 1095 + */ 1141 1096 void snd_hda_codec_cleanup_stream(struct hda_codec *codec, hda_nid_t nid) 1142 1097 { 1143 1098 if (!nid) ··· 1218 1163 return (struct hda_amp_info *)get_alloc_hash(&codec->amp_cache, key); 1219 1164 } 1220 1165 1221 - /* 1222 - * query AMP capabilities for the given widget and direction 1166 + /** 1167 + * query_amp_caps - query AMP capabilities 1168 + * @codec: the HD-auio codec 1169 + * @nid: the NID to query 1170 + * @direction: either #HDA_INPUT or #HDA_OUTPUT 1171 + * 1172 + * Query AMP capabilities for the given widget and direction. 1173 + * Returns the obtained capability bits. 1174 + * 1175 + * When cap bits have been already read, this doesn't read again but 1176 + * returns the cached value. 1223 1177 */ 1224 1178 u32 query_amp_caps(struct hda_codec *codec, hda_nid_t nid, int direction) 1225 1179 { ··· 1251 1187 } 1252 1188 EXPORT_SYMBOL_HDA(query_amp_caps); 1253 1189 1190 + /** 1191 + * snd_hda_override_amp_caps - Override the AMP capabilities 1192 + * @codec: the CODEC to clean up 1193 + * @nid: the NID to clean up 1194 + * @direction: either #HDA_INPUT or #HDA_OUTPUT 1195 + * @caps: the capability bits to set 1196 + * 1197 + * Override the cached AMP caps bits value by the given one. 1198 + * This function is useful if the driver needs to adjust the AMP ranges, 1199 + * e.g. limit to 0dB, etc. 1200 + * 1201 + * Returns zero if successful or a negative error code. 1202 + */ 1254 1203 int snd_hda_override_amp_caps(struct hda_codec *codec, hda_nid_t nid, int dir, 1255 1204 unsigned int caps) 1256 1205 { ··· 1299 1222 return snd_hda_param_read(codec, nid, AC_PAR_PIN_CAP); 1300 1223 } 1301 1224 1225 + /** 1226 + * snd_hda_query_pin_caps - Query PIN capabilities 1227 + * @codec: the HD-auio codec 1228 + * @nid: the NID to query 1229 + * 1230 + * Query PIN capabilities for the given widget. 1231 + * Returns the obtained capability bits. 1232 + * 1233 + * When cap bits have been already read, this doesn't read again but 1234 + * returns the cached value. 1235 + */ 1302 1236 u32 snd_hda_query_pin_caps(struct hda_codec *codec, hda_nid_t nid) 1303 1237 { 1304 1238 return query_caps_hash(codec, nid, HDA_HASH_PINCAP_KEY(nid), 1305 1239 read_pin_cap); 1306 1240 } 1307 1241 EXPORT_SYMBOL_HDA(snd_hda_query_pin_caps); 1242 + 1243 + /** 1244 + * snd_hda_pin_sense - execute pin sense measurement 1245 + * @codec: the CODEC to sense 1246 + * @nid: the pin NID to sense 1247 + * 1248 + * Execute necessary pin sense measurement and return its Presence Detect, 1249 + * Impedance, ELD Valid etc. status bits. 1250 + */ 1251 + u32 snd_hda_pin_sense(struct hda_codec *codec, hda_nid_t nid) 1252 + { 1253 + u32 pincap = snd_hda_query_pin_caps(codec, nid); 1254 + 1255 + if (pincap & AC_PINCAP_TRIG_REQ) /* need trigger? */ 1256 + snd_hda_codec_read(codec, nid, 0, AC_VERB_SET_PIN_SENSE, 0); 1257 + 1258 + return snd_hda_codec_read(codec, nid, 0, 1259 + AC_VERB_GET_PIN_SENSE, 0); 1260 + } 1261 + EXPORT_SYMBOL_HDA(snd_hda_pin_sense); 1262 + 1263 + /** 1264 + * snd_hda_jack_detect - query pin Presence Detect status 1265 + * @codec: the CODEC to sense 1266 + * @nid: the pin NID to sense 1267 + * 1268 + * Query and return the pin's Presence Detect status. 1269 + */ 1270 + int snd_hda_jack_detect(struct hda_codec *codec, hda_nid_t nid) 1271 + { 1272 + u32 sense = snd_hda_pin_sense(codec, nid); 1273 + return !!(sense & AC_PINSENSE_PRESENCE); 1274 + } 1275 + EXPORT_SYMBOL_HDA(snd_hda_jack_detect); 1308 1276 1309 1277 /* 1310 1278 * read the current volume to info ··· 1391 1269 info->vol[ch] = val; 1392 1270 } 1393 1271 1394 - /* 1395 - * read AMP value. The volume is between 0 to 0x7f, 0x80 = mute bit. 1272 + /** 1273 + * snd_hda_codec_amp_read - Read AMP value 1274 + * @codec: HD-audio codec 1275 + * @nid: NID to read the AMP value 1276 + * @ch: channel (left=0 or right=1) 1277 + * @direction: #HDA_INPUT or #HDA_OUTPUT 1278 + * @index: the index value (only for input direction) 1279 + * 1280 + * Read AMP value. The volume is between 0 to 0x7f, 0x80 = mute bit. 1396 1281 */ 1397 1282 int snd_hda_codec_amp_read(struct hda_codec *codec, hda_nid_t nid, int ch, 1398 1283 int direction, int index) ··· 1412 1283 } 1413 1284 EXPORT_SYMBOL_HDA(snd_hda_codec_amp_read); 1414 1285 1415 - /* 1416 - * update the AMP value, mask = bit mask to set, val = the value 1286 + /** 1287 + * snd_hda_codec_amp_update - update the AMP value 1288 + * @codec: HD-audio codec 1289 + * @nid: NID to read the AMP value 1290 + * @ch: channel (left=0 or right=1) 1291 + * @direction: #HDA_INPUT or #HDA_OUTPUT 1292 + * @idx: the index value (only for input direction) 1293 + * @mask: bit mask to set 1294 + * @val: the bits value to set 1295 + * 1296 + * Update the AMP value with a bit mask. 1297 + * Returns 0 if the value is unchanged, 1 if changed. 1417 1298 */ 1418 1299 int snd_hda_codec_amp_update(struct hda_codec *codec, hda_nid_t nid, int ch, 1419 1300 int direction, int idx, int mask, int val) ··· 1442 1303 } 1443 1304 EXPORT_SYMBOL_HDA(snd_hda_codec_amp_update); 1444 1305 1445 - /* 1446 - * update the AMP stereo with the same mask and value 1306 + /** 1307 + * snd_hda_codec_amp_stereo - update the AMP stereo values 1308 + * @codec: HD-audio codec 1309 + * @nid: NID to read the AMP value 1310 + * @direction: #HDA_INPUT or #HDA_OUTPUT 1311 + * @idx: the index value (only for input direction) 1312 + * @mask: bit mask to set 1313 + * @val: the bits value to set 1314 + * 1315 + * Update the AMP values like snd_hda_codec_amp_update(), but for a 1316 + * stereo widget with the same mask and value. 1447 1317 */ 1448 1318 int snd_hda_codec_amp_stereo(struct hda_codec *codec, hda_nid_t nid, 1449 1319 int direction, int idx, int mask, int val) ··· 1466 1318 EXPORT_SYMBOL_HDA(snd_hda_codec_amp_stereo); 1467 1319 1468 1320 #ifdef SND_HDA_NEEDS_RESUME 1469 - /* resume the all amp commands from the cache */ 1321 + /** 1322 + * snd_hda_codec_resume_amp - Resume all AMP commands from the cache 1323 + * @codec: HD-audio codec 1324 + * 1325 + * Resume the all amp commands from the cache. 1326 + */ 1470 1327 void snd_hda_codec_resume_amp(struct hda_codec *codec) 1471 1328 { 1472 1329 struct hda_amp_info *buffer = codec->amp_cache.buf.list; ··· 1497 1344 EXPORT_SYMBOL_HDA(snd_hda_codec_resume_amp); 1498 1345 #endif /* SND_HDA_NEEDS_RESUME */ 1499 1346 1500 - /* volume */ 1347 + /** 1348 + * snd_hda_mixer_amp_volume_info - Info callback for a standard AMP mixer 1349 + * 1350 + * The control element is supposed to have the private_value field 1351 + * set up via HDA_COMPOSE_AMP_VAL*() or related macros. 1352 + */ 1501 1353 int snd_hda_mixer_amp_volume_info(struct snd_kcontrol *kcontrol, 1502 1354 struct snd_ctl_elem_info *uinfo) 1503 1355 { ··· 1558 1400 HDA_AMP_VOLMASK, val); 1559 1401 } 1560 1402 1403 + /** 1404 + * snd_hda_mixer_amp_volume_get - Get callback for a standard AMP mixer volume 1405 + * 1406 + * The control element is supposed to have the private_value field 1407 + * set up via HDA_COMPOSE_AMP_VAL*() or related macros. 1408 + */ 1561 1409 int snd_hda_mixer_amp_volume_get(struct snd_kcontrol *kcontrol, 1562 1410 struct snd_ctl_elem_value *ucontrol) 1563 1411 { ··· 1583 1419 } 1584 1420 EXPORT_SYMBOL_HDA(snd_hda_mixer_amp_volume_get); 1585 1421 1422 + /** 1423 + * snd_hda_mixer_amp_volume_put - Put callback for a standard AMP mixer volume 1424 + * 1425 + * The control element is supposed to have the private_value field 1426 + * set up via HDA_COMPOSE_AMP_VAL*() or related macros. 1427 + */ 1586 1428 int snd_hda_mixer_amp_volume_put(struct snd_kcontrol *kcontrol, 1587 1429 struct snd_ctl_elem_value *ucontrol) 1588 1430 { ··· 1613 1443 } 1614 1444 EXPORT_SYMBOL_HDA(snd_hda_mixer_amp_volume_put); 1615 1445 1446 + /** 1447 + * snd_hda_mixer_amp_volume_put - TLV callback for a standard AMP mixer volume 1448 + * 1449 + * The control element is supposed to have the private_value field 1450 + * set up via HDA_COMPOSE_AMP_VAL*() or related macros. 1451 + */ 1616 1452 int snd_hda_mixer_amp_tlv(struct snd_kcontrol *kcontrol, int op_flag, 1617 1453 unsigned int size, unsigned int __user *_tlv) 1618 1454 { ··· 1648 1472 } 1649 1473 EXPORT_SYMBOL_HDA(snd_hda_mixer_amp_tlv); 1650 1474 1651 - /* 1652 - * set (static) TLV for virtual master volume; recalculated as max 0dB 1475 + /** 1476 + * snd_hda_set_vmaster_tlv - Set TLV for a virtual master control 1477 + * @codec: HD-audio codec 1478 + * @nid: NID of a reference widget 1479 + * @dir: #HDA_INPUT or #HDA_OUTPUT 1480 + * @tlv: TLV data to be stored, at least 4 elements 1481 + * 1482 + * Set (static) TLV data for a virtual master volume using the AMP caps 1483 + * obtained from the reference NID. 1484 + * The volume range is recalculated as if the max volume is 0dB. 1653 1485 */ 1654 1486 void snd_hda_set_vmaster_tlv(struct hda_codec *codec, hda_nid_t nid, int dir, 1655 1487 unsigned int *tlv) ··· 1691 1507 return snd_ctl_find_id(codec->bus->card, &id); 1692 1508 } 1693 1509 1510 + /** 1511 + * snd_hda_find_mixer_ctl - Find a mixer control element with the given name 1512 + * @codec: HD-audio codec 1513 + * @name: ctl id name string 1514 + * 1515 + * Get the control element with the given id string and IFACE_MIXER. 1516 + */ 1694 1517 struct snd_kcontrol *snd_hda_find_mixer_ctl(struct hda_codec *codec, 1695 1518 const char *name) 1696 1519 { ··· 1705 1514 } 1706 1515 EXPORT_SYMBOL_HDA(snd_hda_find_mixer_ctl); 1707 1516 1708 - /* Add a control element and assign to the codec */ 1709 - int snd_hda_ctl_add(struct hda_codec *codec, struct snd_kcontrol *kctl) 1517 + /** 1518 + * snd_hda_ctl-add - Add a control element and assign to the codec 1519 + * @codec: HD-audio codec 1520 + * @nid: corresponding NID (optional) 1521 + * @kctl: the control element to assign 1522 + * 1523 + * Add the given control element to an array inside the codec instance. 1524 + * All control elements belonging to a codec are supposed to be added 1525 + * by this function so that a proper clean-up works at the free or 1526 + * reconfiguration time. 1527 + * 1528 + * If non-zero @nid is passed, the NID is assigned to the control element. 1529 + * The assignment is shown in the codec proc file. 1530 + * 1531 + * snd_hda_ctl_add() checks the control subdev id field whether 1532 + * #HDA_SUBDEV_NID_FLAG bit is set. If set (and @nid is zero), the lower 1533 + * bits value is taken as the NID to assign. 1534 + */ 1535 + int snd_hda_ctl_add(struct hda_codec *codec, hda_nid_t nid, 1536 + struct snd_kcontrol *kctl) 1710 1537 { 1711 1538 int err; 1712 - struct snd_kcontrol **knewp; 1539 + struct hda_nid_item *item; 1713 1540 1541 + if (kctl->id.subdevice & HDA_SUBDEV_NID_FLAG) { 1542 + if (nid == 0) 1543 + nid = kctl->id.subdevice & 0xffff; 1544 + kctl->id.subdevice = 0; 1545 + } 1714 1546 err = snd_ctl_add(codec->bus->card, kctl); 1715 1547 if (err < 0) 1716 1548 return err; 1717 - knewp = snd_array_new(&codec->mixers); 1718 - if (!knewp) 1549 + item = snd_array_new(&codec->mixers); 1550 + if (!item) 1719 1551 return -ENOMEM; 1720 - *knewp = kctl; 1552 + item->kctl = kctl; 1553 + item->nid = nid; 1721 1554 return 0; 1722 1555 } 1723 1556 EXPORT_SYMBOL_HDA(snd_hda_ctl_add); 1724 1557 1725 - /* Clear all controls assigned to the given codec */ 1558 + /** 1559 + * snd_hda_ctls_clear - Clear all controls assigned to the given codec 1560 + * @codec: HD-audio codec 1561 + */ 1726 1562 void snd_hda_ctls_clear(struct hda_codec *codec) 1727 1563 { 1728 1564 int i; 1729 - struct snd_kcontrol **kctls = codec->mixers.list; 1565 + struct hda_nid_item *items = codec->mixers.list; 1730 1566 for (i = 0; i < codec->mixers.used; i++) 1731 - snd_ctl_remove(codec->bus->card, kctls[i]); 1567 + snd_ctl_remove(codec->bus->card, items[i].kctl); 1732 1568 snd_array_free(&codec->mixers); 1733 1569 } 1734 1570 ··· 1781 1563 spin_unlock(&card->files_lock); 1782 1564 } 1783 1565 1566 + /** 1567 + * snd_hda_codec_reset - Clear all objects assigned to the codec 1568 + * @codec: HD-audio codec 1569 + * 1570 + * This frees the all PCM and control elements assigned to the codec, and 1571 + * clears the caches and restores the pin default configurations. 1572 + * 1573 + * When a device is being used, it returns -EBSY. If successfully freed, 1574 + * returns zero. 1575 + */ 1784 1576 int snd_hda_codec_reset(struct hda_codec *codec) 1785 1577 { 1786 1578 struct snd_card *card = codec->bus->card; ··· 1854 1626 return 0; 1855 1627 } 1856 1628 1857 - /* create a virtual master control and add slaves */ 1629 + /** 1630 + * snd_hda_add_vmaster - create a virtual master control and add slaves 1631 + * @codec: HD-audio codec 1632 + * @name: vmaster control name 1633 + * @tlv: TLV data (optional) 1634 + * @slaves: slave control names (optional) 1635 + * 1636 + * Create a virtual master control with the given name. The TLV data 1637 + * must be either NULL or a valid data. 1638 + * 1639 + * @slaves is a NULL-terminated array of strings, each of which is a 1640 + * slave control name. All controls with these names are assigned to 1641 + * the new virtual master control. 1642 + * 1643 + * This function returns zero if successful or a negative error code. 1644 + */ 1858 1645 int snd_hda_add_vmaster(struct hda_codec *codec, char *name, 1859 1646 unsigned int *tlv, const char **slaves) 1860 1647 { ··· 1886 1643 kctl = snd_ctl_make_virtual_master(name, tlv); 1887 1644 if (!kctl) 1888 1645 return -ENOMEM; 1889 - err = snd_hda_ctl_add(codec, kctl); 1646 + err = snd_hda_ctl_add(codec, 0, kctl); 1890 1647 if (err < 0) 1891 1648 return err; 1892 1649 ··· 1911 1668 } 1912 1669 EXPORT_SYMBOL_HDA(snd_hda_add_vmaster); 1913 1670 1914 - /* switch */ 1671 + /** 1672 + * snd_hda_mixer_amp_switch_info - Info callback for a standard AMP mixer switch 1673 + * 1674 + * The control element is supposed to have the private_value field 1675 + * set up via HDA_COMPOSE_AMP_VAL*() or related macros. 1676 + */ 1915 1677 int snd_hda_mixer_amp_switch_info(struct snd_kcontrol *kcontrol, 1916 1678 struct snd_ctl_elem_info *uinfo) 1917 1679 { ··· 1930 1682 } 1931 1683 EXPORT_SYMBOL_HDA(snd_hda_mixer_amp_switch_info); 1932 1684 1685 + /** 1686 + * snd_hda_mixer_amp_switch_get - Get callback for a standard AMP mixer switch 1687 + * 1688 + * The control element is supposed to have the private_value field 1689 + * set up via HDA_COMPOSE_AMP_VAL*() or related macros. 1690 + */ 1933 1691 int snd_hda_mixer_amp_switch_get(struct snd_kcontrol *kcontrol, 1934 1692 struct snd_ctl_elem_value *ucontrol) 1935 1693 { ··· 1956 1702 } 1957 1703 EXPORT_SYMBOL_HDA(snd_hda_mixer_amp_switch_get); 1958 1704 1705 + /** 1706 + * snd_hda_mixer_amp_switch_put - Put callback for a standard AMP mixer switch 1707 + * 1708 + * The control element is supposed to have the private_value field 1709 + * set up via HDA_COMPOSE_AMP_VAL*() or related macros. 1710 + */ 1959 1711 int snd_hda_mixer_amp_switch_put(struct snd_kcontrol *kcontrol, 1960 1712 struct snd_ctl_elem_value *ucontrol) 1961 1713 { ··· 1993 1733 } 1994 1734 EXPORT_SYMBOL_HDA(snd_hda_mixer_amp_switch_put); 1995 1735 1736 + #ifdef CONFIG_SND_HDA_INPUT_BEEP 1737 + /** 1738 + * snd_hda_mixer_amp_switch_put_beep - Put callback for a beep AMP switch 1739 + * 1740 + * This function calls snd_hda_enable_beep_device(), which behaves differently 1741 + * depending on beep_mode option. 1742 + */ 1743 + int snd_hda_mixer_amp_switch_put_beep(struct snd_kcontrol *kcontrol, 1744 + struct snd_ctl_elem_value *ucontrol) 1745 + { 1746 + struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 1747 + long *valp = ucontrol->value.integer.value; 1748 + 1749 + snd_hda_enable_beep_device(codec, *valp); 1750 + return snd_hda_mixer_amp_switch_put(kcontrol, ucontrol); 1751 + } 1752 + EXPORT_SYMBOL_HDA(snd_hda_mixer_amp_switch_put_beep); 1753 + #endif /* CONFIG_SND_HDA_INPUT_BEEP */ 1754 + 1996 1755 /* 1997 1756 * bound volume controls 1998 1757 * ··· 2021 1742 #define AMP_VAL_IDX_SHIFT 19 2022 1743 #define AMP_VAL_IDX_MASK (0x0f<<19) 2023 1744 1745 + /** 1746 + * snd_hda_mixer_bind_switch_get - Get callback for a bound volume control 1747 + * 1748 + * The control element is supposed to have the private_value field 1749 + * set up via HDA_BIND_MUTE*() macros. 1750 + */ 2024 1751 int snd_hda_mixer_bind_switch_get(struct snd_kcontrol *kcontrol, 2025 1752 struct snd_ctl_elem_value *ucontrol) 2026 1753 { ··· 2044 1759 } 2045 1760 EXPORT_SYMBOL_HDA(snd_hda_mixer_bind_switch_get); 2046 1761 1762 + /** 1763 + * snd_hda_mixer_bind_switch_put - Put callback for a bound volume control 1764 + * 1765 + * The control element is supposed to have the private_value field 1766 + * set up via HDA_BIND_MUTE*() macros. 1767 + */ 2047 1768 int snd_hda_mixer_bind_switch_put(struct snd_kcontrol *kcontrol, 2048 1769 struct snd_ctl_elem_value *ucontrol) 2049 1770 { ··· 2074 1783 } 2075 1784 EXPORT_SYMBOL_HDA(snd_hda_mixer_bind_switch_put); 2076 1785 2077 - /* 2078 - * generic bound volume/swtich controls 1786 + /** 1787 + * snd_hda_mixer_bind_ctls_info - Info callback for a generic bound control 1788 + * 1789 + * The control element is supposed to have the private_value field 1790 + * set up via HDA_BIND_VOL() or HDA_BIND_SW() macros. 2079 1791 */ 2080 1792 int snd_hda_mixer_bind_ctls_info(struct snd_kcontrol *kcontrol, 2081 1793 struct snd_ctl_elem_info *uinfo) ··· 2097 1803 } 2098 1804 EXPORT_SYMBOL_HDA(snd_hda_mixer_bind_ctls_info); 2099 1805 1806 + /** 1807 + * snd_hda_mixer_bind_ctls_get - Get callback for a generic bound control 1808 + * 1809 + * The control element is supposed to have the private_value field 1810 + * set up via HDA_BIND_VOL() or HDA_BIND_SW() macros. 1811 + */ 2100 1812 int snd_hda_mixer_bind_ctls_get(struct snd_kcontrol *kcontrol, 2101 1813 struct snd_ctl_elem_value *ucontrol) 2102 1814 { ··· 2120 1820 } 2121 1821 EXPORT_SYMBOL_HDA(snd_hda_mixer_bind_ctls_get); 2122 1822 1823 + /** 1824 + * snd_hda_mixer_bind_ctls_put - Put callback for a generic bound control 1825 + * 1826 + * The control element is supposed to have the private_value field 1827 + * set up via HDA_BIND_VOL() or HDA_BIND_SW() macros. 1828 + */ 2123 1829 int snd_hda_mixer_bind_ctls_put(struct snd_kcontrol *kcontrol, 2124 1830 struct snd_ctl_elem_value *ucontrol) 2125 1831 { ··· 2149 1843 } 2150 1844 EXPORT_SYMBOL_HDA(snd_hda_mixer_bind_ctls_put); 2151 1845 1846 + /** 1847 + * snd_hda_mixer_bind_tlv - TLV callback for a generic bound control 1848 + * 1849 + * The control element is supposed to have the private_value field 1850 + * set up via HDA_BIND_VOL() macro. 1851 + */ 2152 1852 int snd_hda_mixer_bind_tlv(struct snd_kcontrol *kcontrol, int op_flag, 2153 1853 unsigned int size, unsigned int __user *tlv) 2154 1854 { ··· 2438 2126 return -ENOMEM; 2439 2127 kctl->id.index = idx; 2440 2128 kctl->private_value = nid; 2441 - err = snd_hda_ctl_add(codec, kctl); 2129 + err = snd_hda_ctl_add(codec, nid, kctl); 2442 2130 if (err < 0) 2443 2131 return err; 2444 2132 } ··· 2477 2165 .put = spdif_share_sw_put, 2478 2166 }; 2479 2167 2168 + /** 2169 + * snd_hda_create_spdif_share_sw - create Default PCM switch 2170 + * @codec: the HDA codec 2171 + * @mout: multi-out instance 2172 + */ 2480 2173 int snd_hda_create_spdif_share_sw(struct hda_codec *codec, 2481 2174 struct hda_multi_out *mout) 2482 2175 { 2483 2176 if (!mout->dig_out_nid) 2484 2177 return 0; 2485 2178 /* ATTENTION: here mout is passed as private_data, instead of codec */ 2486 - return snd_hda_ctl_add(codec, 2487 - snd_ctl_new1(&spdif_share_sw, mout)); 2179 + return snd_hda_ctl_add(codec, mout->dig_out_nid, 2180 + snd_ctl_new1(&spdif_share_sw, mout)); 2488 2181 } 2489 2182 EXPORT_SYMBOL_HDA(snd_hda_create_spdif_share_sw); 2490 2183 ··· 2593 2276 if (!kctl) 2594 2277 return -ENOMEM; 2595 2278 kctl->private_value = nid; 2596 - err = snd_hda_ctl_add(codec, kctl); 2279 + err = snd_hda_ctl_add(codec, nid, kctl); 2597 2280 if (err < 0) 2598 2281 return err; 2599 2282 } ··· 2649 2332 } 2650 2333 EXPORT_SYMBOL_HDA(snd_hda_codec_write_cache); 2651 2334 2652 - /* resume the all commands from the cache */ 2335 + /** 2336 + * snd_hda_codec_resume_cache - Resume the all commands from the cache 2337 + * @codec: HD-audio codec 2338 + * 2339 + * Execute all verbs recorded in the command caches to resume. 2340 + */ 2653 2341 void snd_hda_codec_resume_cache(struct hda_codec *codec) 2654 2342 { 2655 2343 struct hda_cache_head *buffer = codec->cmd_cache.buf.list; ··· 2774 2452 codec->afg ? codec->afg : codec->mfg, 2775 2453 AC_PWRST_D3); 2776 2454 #ifdef CONFIG_SND_HDA_POWER_SAVE 2455 + snd_hda_update_power_acct(codec); 2777 2456 cancel_delayed_work(&codec->power_work); 2778 2457 codec->power_on = 0; 2779 2458 codec->power_transition = 0; 2459 + codec->power_jiffies = jiffies; 2780 2460 #endif 2781 2461 } 2782 2462 ··· 3080 2756 } 3081 2757 3082 2758 /** 3083 - * snd_hda_is_supported_format - check whether the given node supports 3084 - * the format val 2759 + * snd_hda_is_supported_format - Check the validity of the format 2760 + * @codec: HD-audio codec 2761 + * @nid: NID to check 2762 + * @format: the HD-audio format value to check 2763 + * 2764 + * Check whether the given node supports the format value. 3085 2765 * 3086 2766 * Returns 1 if supported, 0 if not. 3087 2767 */ ··· 3205 2877 return 0; 3206 2878 } 3207 2879 2880 + /* global */ 2881 + const char *snd_hda_pcm_type_name[HDA_PCM_NTYPES] = { 2882 + "Audio", "SPDIF", "HDMI", "Modem" 2883 + }; 2884 + 3208 2885 /* 3209 2886 * get the empty PCM device number to assign 3210 2887 */ 3211 2888 static int get_empty_pcm_device(struct hda_bus *bus, int type) 3212 2889 { 3213 - static const char *dev_name[HDA_PCM_NTYPES] = { 3214 - "Audio", "SPDIF", "HDMI", "Modem" 2890 + /* audio device indices; not linear to keep compatibility */ 2891 + static int audio_idx[HDA_PCM_NTYPES][5] = { 2892 + [HDA_PCM_TYPE_AUDIO] = { 0, 2, 4, 5, -1 }, 2893 + [HDA_PCM_TYPE_SPDIF] = { 1, -1 }, 2894 + [HDA_PCM_TYPE_HDMI] = { 3, 7, 8, 9, -1 }, 2895 + [HDA_PCM_TYPE_MODEM] = { 6, -1 }, 3215 2896 }; 3216 - /* starting device index for each PCM type */ 3217 - static int dev_idx[HDA_PCM_NTYPES] = { 3218 - [HDA_PCM_TYPE_AUDIO] = 0, 3219 - [HDA_PCM_TYPE_SPDIF] = 1, 3220 - [HDA_PCM_TYPE_HDMI] = 3, 3221 - [HDA_PCM_TYPE_MODEM] = 6 3222 - }; 3223 - /* normal audio device indices; not linear to keep compatibility */ 3224 - static int audio_idx[4] = { 0, 2, 4, 5 }; 3225 - int i, dev; 2897 + int i; 3226 2898 3227 - switch (type) { 3228 - case HDA_PCM_TYPE_AUDIO: 3229 - for (i = 0; i < ARRAY_SIZE(audio_idx); i++) { 3230 - dev = audio_idx[i]; 3231 - if (!test_bit(dev, bus->pcm_dev_bits)) 3232 - goto ok; 3233 - } 3234 - snd_printk(KERN_WARNING "Too many audio devices\n"); 3235 - return -EAGAIN; 3236 - case HDA_PCM_TYPE_SPDIF: 3237 - case HDA_PCM_TYPE_HDMI: 3238 - case HDA_PCM_TYPE_MODEM: 3239 - dev = dev_idx[type]; 3240 - if (test_bit(dev, bus->pcm_dev_bits)) { 3241 - snd_printk(KERN_WARNING "%s already defined\n", 3242 - dev_name[type]); 3243 - return -EAGAIN; 3244 - } 3245 - break; 3246 - default: 2899 + if (type >= HDA_PCM_NTYPES) { 3247 2900 snd_printk(KERN_WARNING "Invalid PCM type %d\n", type); 3248 2901 return -EINVAL; 3249 2902 } 3250 - ok: 3251 - set_bit(dev, bus->pcm_dev_bits); 3252 - return dev; 2903 + 2904 + for (i = 0; audio_idx[type][i] >= 0 ; i++) 2905 + if (!test_and_set_bit(audio_idx[type][i], bus->pcm_dev_bits)) 2906 + return audio_idx[type][i]; 2907 + 2908 + snd_printk(KERN_WARNING "Too many %s devices\n", snd_hda_pcm_type_name[type]); 2909 + return -EAGAIN; 3253 2910 } 3254 2911 3255 2912 /* ··· 3472 3159 */ 3473 3160 int snd_hda_add_new_ctls(struct hda_codec *codec, struct snd_kcontrol_new *knew) 3474 3161 { 3475 - int err; 3162 + int err; 3476 3163 3477 3164 for (; knew->name; knew++) { 3478 3165 struct snd_kcontrol *kctl; 3479 3166 kctl = snd_ctl_new1(knew, codec); 3480 3167 if (!kctl) 3481 3168 return -ENOMEM; 3482 - err = snd_hda_ctl_add(codec, kctl); 3169 + err = snd_hda_ctl_add(codec, 0, kctl); 3483 3170 if (err < 0) { 3484 3171 if (!codec->addr) 3485 3172 return err; ··· 3487 3174 if (!kctl) 3488 3175 return -ENOMEM; 3489 3176 kctl->id.device = codec->addr; 3490 - err = snd_hda_ctl_add(codec, kctl); 3177 + err = snd_hda_ctl_add(codec, 0, kctl); 3491 3178 if (err < 0) 3492 3179 return err; 3493 3180 } ··· 3520 3207 { 3521 3208 codec->power_count++; 3522 3209 codec->power_on = 1; 3210 + codec->power_jiffies = jiffies; 3523 3211 } 3524 3212 3213 + /* update the power on/off account with the current jiffies */ 3214 + void snd_hda_update_power_acct(struct hda_codec *codec) 3215 + { 3216 + unsigned long delta = jiffies - codec->power_jiffies; 3217 + if (codec->power_on) 3218 + codec->power_on_acct += delta; 3219 + else 3220 + codec->power_off_acct += delta; 3221 + codec->power_jiffies += delta; 3222 + } 3223 + 3224 + /** 3225 + * snd_hda_power_up - Power-up the codec 3226 + * @codec: HD-audio codec 3227 + * 3228 + * Increment the power-up counter and power up the hardware really when 3229 + * not turned on yet. 3230 + */ 3525 3231 void snd_hda_power_up(struct hda_codec *codec) 3526 3232 { 3527 3233 struct hda_bus *bus = codec->bus; ··· 3549 3217 if (codec->power_on || codec->power_transition) 3550 3218 return; 3551 3219 3220 + snd_hda_update_power_acct(codec); 3552 3221 codec->power_on = 1; 3222 + codec->power_jiffies = jiffies; 3553 3223 if (bus->ops.pm_notify) 3554 3224 bus->ops.pm_notify(bus); 3555 3225 hda_call_codec_resume(codec); ··· 3563 3229 #define power_save(codec) \ 3564 3230 ((codec)->bus->power_save ? *(codec)->bus->power_save : 0) 3565 3231 3566 - #define power_save(codec) \ 3567 - ((codec)->bus->power_save ? *(codec)->bus->power_save : 0) 3568 - 3232 + /** 3233 + * snd_hda_power_down - Power-down the codec 3234 + * @codec: HD-audio codec 3235 + * 3236 + * Decrement the power-up counter and schedules the power-off work if 3237 + * the counter rearches to zero. 3238 + */ 3569 3239 void snd_hda_power_down(struct hda_codec *codec) 3570 3240 { 3571 3241 --codec->power_count; ··· 3583 3245 } 3584 3246 EXPORT_SYMBOL_HDA(snd_hda_power_down); 3585 3247 3248 + /** 3249 + * snd_hda_check_amp_list_power - Check the amp list and update the power 3250 + * @codec: HD-audio codec 3251 + * @check: the object containing an AMP list and the status 3252 + * @nid: NID to check / update 3253 + * 3254 + * Check whether the given NID is in the amp list. If it's in the list, 3255 + * check the current AMP status, and update the the power-status according 3256 + * to the mute status. 3257 + * 3258 + * This function is supposed to be set or called from the check_power_status 3259 + * patch ops. 3260 + */ 3586 3261 int snd_hda_check_amp_list_power(struct hda_codec *codec, 3587 3262 struct hda_loopback_check *check, 3588 3263 hda_nid_t nid) ··· 3637 3286 /* 3638 3287 * Channel mode helper 3639 3288 */ 3289 + 3290 + /** 3291 + * snd_hda_ch_mode_info - Info callback helper for the channel mode enum 3292 + */ 3640 3293 int snd_hda_ch_mode_info(struct hda_codec *codec, 3641 3294 struct snd_ctl_elem_info *uinfo, 3642 3295 const struct hda_channel_mode *chmode, ··· 3657 3302 } 3658 3303 EXPORT_SYMBOL_HDA(snd_hda_ch_mode_info); 3659 3304 3305 + /** 3306 + * snd_hda_ch_mode_get - Get callback helper for the channel mode enum 3307 + */ 3660 3308 int snd_hda_ch_mode_get(struct hda_codec *codec, 3661 3309 struct snd_ctl_elem_value *ucontrol, 3662 3310 const struct hda_channel_mode *chmode, ··· 3678 3320 } 3679 3321 EXPORT_SYMBOL_HDA(snd_hda_ch_mode_get); 3680 3322 3323 + /** 3324 + * snd_hda_ch_mode_put - Put callback helper for the channel mode enum 3325 + */ 3681 3326 int snd_hda_ch_mode_put(struct hda_codec *codec, 3682 3327 struct snd_ctl_elem_value *ucontrol, 3683 3328 const struct hda_channel_mode *chmode, ··· 3705 3344 /* 3706 3345 * input MUX helper 3707 3346 */ 3347 + 3348 + /** 3349 + * snd_hda_input_mux_info_info - Info callback helper for the input-mux enum 3350 + */ 3708 3351 int snd_hda_input_mux_info(const struct hda_input_mux *imux, 3709 3352 struct snd_ctl_elem_info *uinfo) 3710 3353 { ··· 3727 3362 } 3728 3363 EXPORT_SYMBOL_HDA(snd_hda_input_mux_info); 3729 3364 3365 + /** 3366 + * snd_hda_input_mux_info_put - Put callback helper for the input-mux enum 3367 + */ 3730 3368 int snd_hda_input_mux_put(struct hda_codec *codec, 3731 3369 const struct hda_input_mux *imux, 3732 3370 struct snd_ctl_elem_value *ucontrol, ··· 3789 3421 } 3790 3422 } 3791 3423 3792 - /* 3793 - * open the digital out in the exclusive mode 3424 + /** 3425 + * snd_hda_bus_reboot_notify - call the reboot notifier of each codec 3426 + * @bus: HD-audio bus 3427 + */ 3428 + void snd_hda_bus_reboot_notify(struct hda_bus *bus) 3429 + { 3430 + struct hda_codec *codec; 3431 + 3432 + if (!bus) 3433 + return; 3434 + list_for_each_entry(codec, &bus->codec_list, list) { 3435 + #ifdef CONFIG_SND_HDA_POWER_SAVE 3436 + if (!codec->power_on) 3437 + continue; 3438 + #endif 3439 + if (codec->patch_ops.reboot_notify) 3440 + codec->patch_ops.reboot_notify(codec); 3441 + } 3442 + } 3443 + EXPORT_SYMBOL_HDA(snd_hda_bus_reboot_notify); 3444 + 3445 + /** 3446 + * snd_hda_multi_out_dig_open - open the digital out in the exclusive mode 3794 3447 */ 3795 3448 int snd_hda_multi_out_dig_open(struct hda_codec *codec, 3796 3449 struct hda_multi_out *mout) ··· 3826 3437 } 3827 3438 EXPORT_SYMBOL_HDA(snd_hda_multi_out_dig_open); 3828 3439 3440 + /** 3441 + * snd_hda_multi_out_dig_prepare - prepare the digital out stream 3442 + */ 3829 3443 int snd_hda_multi_out_dig_prepare(struct hda_codec *codec, 3830 3444 struct hda_multi_out *mout, 3831 3445 unsigned int stream_tag, ··· 3842 3450 } 3843 3451 EXPORT_SYMBOL_HDA(snd_hda_multi_out_dig_prepare); 3844 3452 3453 + /** 3454 + * snd_hda_multi_out_dig_cleanup - clean-up the digital out stream 3455 + */ 3845 3456 int snd_hda_multi_out_dig_cleanup(struct hda_codec *codec, 3846 3457 struct hda_multi_out *mout) 3847 3458 { ··· 3855 3460 } 3856 3461 EXPORT_SYMBOL_HDA(snd_hda_multi_out_dig_cleanup); 3857 3462 3858 - /* 3859 - * release the digital out 3463 + /** 3464 + * snd_hda_multi_out_dig_close - release the digital out stream 3860 3465 */ 3861 3466 int snd_hda_multi_out_dig_close(struct hda_codec *codec, 3862 3467 struct hda_multi_out *mout) ··· 3868 3473 } 3869 3474 EXPORT_SYMBOL_HDA(snd_hda_multi_out_dig_close); 3870 3475 3871 - /* 3872 - * set up more restrictions for analog out 3476 + /** 3477 + * snd_hda_multi_out_analog_open - open analog outputs 3478 + * 3479 + * Open analog outputs and set up the hw-constraints. 3480 + * If the digital outputs can be opened as slave, open the digital 3481 + * outputs, too. 3873 3482 */ 3874 3483 int snd_hda_multi_out_analog_open(struct hda_codec *codec, 3875 3484 struct hda_multi_out *mout, ··· 3918 3519 } 3919 3520 EXPORT_SYMBOL_HDA(snd_hda_multi_out_analog_open); 3920 3521 3921 - /* 3922 - * set up the i/o for analog out 3923 - * when the digital out is available, copy the front out to digital out, too. 3522 + /** 3523 + * snd_hda_multi_out_analog_prepare - Preapre the analog outputs. 3524 + * 3525 + * Set up the i/o for analog out. 3526 + * When the digital out is available, copy the front out to digital out, too. 3924 3527 */ 3925 3528 int snd_hda_multi_out_analog_prepare(struct hda_codec *codec, 3926 3529 struct hda_multi_out *mout, ··· 3979 3578 } 3980 3579 EXPORT_SYMBOL_HDA(snd_hda_multi_out_analog_prepare); 3981 3580 3982 - /* 3983 - * clean up the setting for analog out 3581 + /** 3582 + * snd_hda_multi_out_analog_cleanup - clean up the setting for analog out 3984 3583 */ 3985 3584 int snd_hda_multi_out_analog_cleanup(struct hda_codec *codec, 3986 3585 struct hda_multi_out *mout) ··· 4366 3965 * generic arrays 4367 3966 */ 4368 3967 4369 - /* get a new element from the given array 4370 - * if it exceeds the pre-allocated array size, re-allocate the array 3968 + /** 3969 + * snd_array_new - get a new element from the given array 3970 + * @array: the array object 3971 + * 3972 + * Get a new element from the given array. If it exceeds the 3973 + * pre-allocated array size, re-allocate the array. 3974 + * 3975 + * Returns NULL if allocation failed. 4371 3976 */ 4372 3977 void *snd_array_new(struct snd_array *array) 4373 3978 { ··· 4397 3990 } 4398 3991 EXPORT_SYMBOL_HDA(snd_array_new); 4399 3992 4400 - /* free the given array elements */ 3993 + /** 3994 + * snd_array_free - free the given array elements 3995 + * @array: the array object 3996 + */ 4401 3997 void snd_array_free(struct snd_array *array) 4402 3998 { 4403 3999 kfree(array->list); ··· 4410 4000 } 4411 4001 EXPORT_SYMBOL_HDA(snd_array_free); 4412 4002 4413 - /* 4003 + /** 4004 + * snd_print_pcm_rates - Print the supported PCM rates to the string buffer 4005 + * @pcm: PCM caps bits 4006 + * @buf: the string buffer to write 4007 + * @buflen: the max buffer length 4008 + * 4414 4009 * used by hda_proc.c and hda_eld.c 4415 4010 */ 4416 4011 void snd_print_pcm_rates(int pcm, char *buf, int buflen) ··· 4434 4019 } 4435 4020 EXPORT_SYMBOL_HDA(snd_print_pcm_rates); 4436 4021 4022 + /** 4023 + * snd_print_pcm_bits - Print the supported PCM fmt bits to the string buffer 4024 + * @pcm: PCM caps bits 4025 + * @buf: the string buffer to write 4026 + * @buflen: the max buffer length 4027 + * 4028 + * used by hda_proc.c and hda_eld.c 4029 + */ 4437 4030 void snd_print_pcm_bits(int pcm, char *buf, int buflen) 4438 4031 { 4439 4032 static unsigned int bits[] = { 8, 16, 20, 24, 32 };
+11
sound/pci/hda/hda_codec.h
··· 286 286 #define AC_PWRST_D1SUP (1<<1) 287 287 #define AC_PWRST_D2SUP (1<<2) 288 288 #define AC_PWRST_D3SUP (1<<3) 289 + #define AC_PWRST_D3COLDSUP (1<<4) 290 + #define AC_PWRST_S3D3COLDSUP (1<<29) 291 + #define AC_PWRST_CLKSTOP (1<<30) 292 + #define AC_PWRST_EPSS (1U<<31) 289 293 290 294 /* Power state values */ 291 295 #define AC_PWRST_SETTING (0xf<<0) ··· 678 674 #ifdef CONFIG_SND_HDA_POWER_SAVE 679 675 int (*check_power_status)(struct hda_codec *codec, hda_nid_t nid); 680 676 #endif 677 + void (*reboot_notify)(struct hda_codec *codec); 681 678 }; 682 679 683 680 /* record for amp information cache */ ··· 776 771 777 772 /* beep device */ 778 773 struct hda_beep *beep; 774 + unsigned int beep_mode; 779 775 780 776 /* widget capabilities cache */ 781 777 unsigned int num_nodes; ··· 817 811 unsigned int power_transition :1; /* power-state in transition */ 818 812 int power_count; /* current (global) power refcount */ 819 813 struct delayed_work power_work; /* delayed task for powerdown */ 814 + unsigned long power_on_acct; 815 + unsigned long power_off_acct; 816 + unsigned long power_jiffies; 820 817 #endif 821 818 822 819 /* codec-specific additional proc output */ ··· 919 910 * Misc 920 911 */ 921 912 void snd_hda_get_codec_name(struct hda_codec *codec, char *name, int namelen); 913 + void snd_hda_bus_reboot_notify(struct hda_bus *bus); 922 914 923 915 /* 924 916 * power management ··· 943 933 void snd_hda_power_up(struct hda_codec *codec); 944 934 void snd_hda_power_down(struct hda_codec *codec); 945 935 #define snd_hda_codec_needs_resume(codec) codec->power_count 936 + void snd_hda_update_power_acct(struct hda_codec *codec); 946 937 #else 947 938 static inline void snd_hda_power_up(struct hda_codec *codec) {} 948 939 static inline void snd_hda_power_down(struct hda_codec *codec) {}
+11 -9
sound/pci/hda/hda_eld.c
··· 309 309 return -EINVAL; 310 310 } 311 311 312 - static int hdmi_present_sense(struct hda_codec *codec, hda_nid_t nid) 313 - { 314 - return snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PIN_SENSE, 0); 315 - } 316 - 317 312 static int hdmi_eld_valid(struct hda_codec *codec, hda_nid_t nid) 318 313 { 319 314 int eldv; 320 315 int present; 321 316 322 - present = hdmi_present_sense(codec, nid); 317 + present = snd_hda_pin_sense(codec, nid); 323 318 eldv = (present & AC_PINSENSE_ELDV); 324 319 present = (present & AC_PINSENSE_PRESENCE); 325 320 ··· 472 477 [4 ... 7] = "reserved" 473 478 }; 474 479 480 + snd_iprintf(buffer, "monitor_present\t\t%d\n", e->monitor_present); 481 + snd_iprintf(buffer, "eld_valid\t\t%d\n", e->eld_valid); 475 482 snd_iprintf(buffer, "monitor_name\t\t%s\n", e->monitor_name); 476 483 snd_iprintf(buffer, "connection_type\t\t%s\n", 477 484 eld_connection_type_names[e->conn_type]); ··· 515 518 * monitor_name manufacture_id product_id 516 519 * eld_version edid_version 517 520 */ 518 - if (!strcmp(name, "connection_type")) 521 + if (!strcmp(name, "monitor_present")) 522 + e->monitor_present = val; 523 + else if (!strcmp(name, "eld_valid")) 524 + e->eld_valid = val; 525 + else if (!strcmp(name, "connection_type")) 519 526 e->conn_type = val; 520 527 else if (!strcmp(name, "port_id")) 521 528 e->port_id = val; ··· 561 560 } 562 561 563 562 564 - int snd_hda_eld_proc_new(struct hda_codec *codec, struct hdmi_eld *eld) 563 + int snd_hda_eld_proc_new(struct hda_codec *codec, struct hdmi_eld *eld, 564 + int index) 565 565 { 566 566 char name[32]; 567 567 struct snd_info_entry *entry; 568 568 int err; 569 569 570 - snprintf(name, sizeof(name), "eld#%d", codec->addr); 570 + snprintf(name, sizeof(name), "eld#%d.%d", codec->addr, index); 571 571 err = snd_card_proc_new(codec->bus->card, name, &entry); 572 572 if (err < 0) 573 573 return err;
+11 -6
sound/pci/hda/hda_generic.c
··· 727 727 if (is_loopback) 728 728 add_input_loopback(codec, node->nid, HDA_INPUT, index); 729 729 snd_printdd("[%s] NID=0x%x, DIR=IN, IDX=0x%x\n", name, node->nid, index); 730 - err = snd_hda_ctl_add(codec, snd_ctl_new1(&knew, codec)); 730 + err = snd_hda_ctl_add(codec, node->nid, 731 + snd_ctl_new1(&knew, codec)); 731 732 if (err < 0) 732 733 return err; 733 734 created = 1; ··· 738 737 if (is_loopback) 739 738 add_input_loopback(codec, node->nid, HDA_OUTPUT, 0); 740 739 snd_printdd("[%s] NID=0x%x, DIR=OUT\n", name, node->nid); 741 - err = snd_hda_ctl_add(codec, snd_ctl_new1(&knew, codec)); 740 + err = snd_hda_ctl_add(codec, node->nid, 741 + snd_ctl_new1(&knew, codec)); 742 742 if (err < 0) 743 743 return err; 744 744 created = 1; ··· 753 751 (node->amp_in_caps & AC_AMPCAP_NUM_STEPS)) { 754 752 knew = (struct snd_kcontrol_new)HDA_CODEC_VOLUME(name, node->nid, index, HDA_INPUT); 755 753 snd_printdd("[%s] NID=0x%x, DIR=IN, IDX=0x%x\n", name, node->nid, index); 756 - err = snd_hda_ctl_add(codec, snd_ctl_new1(&knew, codec)); 754 + err = snd_hda_ctl_add(codec, node->nid, 755 + snd_ctl_new1(&knew, codec)); 757 756 if (err < 0) 758 757 return err; 759 758 created = 1; ··· 762 759 (node->amp_out_caps & AC_AMPCAP_NUM_STEPS)) { 763 760 knew = (struct snd_kcontrol_new)HDA_CODEC_VOLUME(name, node->nid, 0, HDA_OUTPUT); 764 761 snd_printdd("[%s] NID=0x%x, DIR=OUT\n", name, node->nid); 765 - err = snd_hda_ctl_add(codec, snd_ctl_new1(&knew, codec)); 762 + err = snd_hda_ctl_add(codec, node->nid, 763 + snd_ctl_new1(&knew, codec)); 766 764 if (err < 0) 767 765 return err; 768 766 created = 1; ··· 861 857 } 862 858 863 859 /* create input MUX if multiple sources are available */ 864 - err = snd_hda_ctl_add(codec, snd_ctl_new1(&cap_sel, codec)); 860 + err = snd_hda_ctl_add(codec, 0, snd_ctl_new1(&cap_sel, codec)); 865 861 if (err < 0) 866 862 return err; 867 863 ··· 879 875 HDA_CODEC_VOLUME(name, adc_node->nid, 880 876 spec->input_mux.items[i].index, 881 877 HDA_INPUT); 882 - err = snd_hda_ctl_add(codec, snd_ctl_new1(&knew, codec)); 878 + err = snd_hda_ctl_add(codec, adc_node->nid, 879 + snd_ctl_new1(&knew, codec)); 883 880 if (err < 0) 884 881 return err; 885 882 }
+38
sound/pci/hda/hda_hwdep.c
··· 154 154 return 0; 155 155 } 156 156 157 + #ifdef CONFIG_SND_HDA_POWER_SAVE 158 + static ssize_t power_on_acct_show(struct device *dev, 159 + struct device_attribute *attr, 160 + char *buf) 161 + { 162 + struct snd_hwdep *hwdep = dev_get_drvdata(dev); 163 + struct hda_codec *codec = hwdep->private_data; 164 + snd_hda_update_power_acct(codec); 165 + return sprintf(buf, "%u\n", jiffies_to_msecs(codec->power_on_acct)); 166 + } 167 + 168 + static ssize_t power_off_acct_show(struct device *dev, 169 + struct device_attribute *attr, 170 + char *buf) 171 + { 172 + struct snd_hwdep *hwdep = dev_get_drvdata(dev); 173 + struct hda_codec *codec = hwdep->private_data; 174 + snd_hda_update_power_acct(codec); 175 + return sprintf(buf, "%u\n", jiffies_to_msecs(codec->power_off_acct)); 176 + } 177 + 178 + static struct device_attribute power_attrs[] = { 179 + __ATTR_RO(power_on_acct), 180 + __ATTR_RO(power_off_acct), 181 + }; 182 + 183 + int snd_hda_hwdep_add_power_sysfs(struct hda_codec *codec) 184 + { 185 + struct snd_hwdep *hwdep = codec->hwdep; 186 + int i; 187 + 188 + for (i = 0; i < ARRAY_SIZE(power_attrs); i++) 189 + snd_add_device_sysfs_file(SNDRV_DEVICE_TYPE_HWDEP, hwdep->card, 190 + hwdep->device, &power_attrs[i]); 191 + return 0; 192 + } 193 + #endif /* CONFIG_SND_HDA_POWER_SAVE */ 194 + 157 195 #ifdef CONFIG_SND_HDA_RECONFIG 158 196 159 197 /*
+34 -16
sound/pci/hda/hda_intel.c
··· 60 60 static int probe_mask[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = -1}; 61 61 static int probe_only[SNDRV_CARDS]; 62 62 static int single_cmd; 63 - static int enable_msi; 63 + static int enable_msi = -1; 64 64 #ifdef CONFIG_SND_HDA_PATCH_LOADER 65 65 static char *patch[SNDRV_CARDS]; 66 + #endif 67 + #ifdef CONFIG_SND_HDA_INPUT_BEEP 68 + static int beep_mode[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = 69 + CONFIG_SND_HDA_INPUT_BEEP_MODE}; 66 70 #endif 67 71 68 72 module_param_array(index, int, NULL, 0444); ··· 94 90 #ifdef CONFIG_SND_HDA_PATCH_LOADER 95 91 module_param_array(patch, charp, NULL, 0444); 96 92 MODULE_PARM_DESC(patch, "Patch file for Intel HD audio interface."); 93 + #endif 94 + #ifdef CONFIG_SND_HDA_INPUT_BEEP 95 + module_param_array(beep_mode, int, NULL, 0444); 96 + MODULE_PARM_DESC(beep_mode, "Select HDA Beep registration mode " 97 + "(0=off, 1=on, 2=mute switch on/off) (default=1)."); 97 98 #endif 98 99 99 100 #ifdef CONFIG_SND_HDA_POWER_SAVE ··· 413 404 unsigned short codec_mask; 414 405 int codec_probe_mask; /* copied from probe_mask option */ 415 406 struct hda_bus *bus; 407 + unsigned int beep_mode; 416 408 417 409 /* CORB/RIRB */ 418 410 struct azx_rb corb; ··· 687 677 } 688 678 } 689 679 680 + if (!chip->polling_mode) { 681 + snd_printk(KERN_WARNING SFX "azx_get_response timeout, " 682 + "switching to polling mode: last cmd=0x%08x\n", 683 + chip->last_cmd[addr]); 684 + chip->polling_mode = 1; 685 + goto again; 686 + } 687 + 690 688 if (chip->msi) { 691 689 snd_printk(KERN_WARNING SFX "No response from codec, " 692 690 "disabling MSI: last cmd=0x%08x\n", ··· 707 689 bus->rirb_error = 1; 708 690 return -1; 709 691 } 710 - goto again; 711 - } 712 - 713 - if (!chip->polling_mode) { 714 - snd_printk(KERN_WARNING SFX "azx_get_response timeout, " 715 - "switching to polling mode: last cmd=0x%08x\n", 716 - chip->last_cmd[addr]); 717 - chip->polling_mode = 1; 718 692 goto again; 719 693 } 720 694 ··· 1414 1404 err = snd_hda_codec_new(chip->bus, c, &codec); 1415 1405 if (err < 0) 1416 1406 continue; 1407 + codec->beep_mode = chip->beep_mode; 1417 1408 codecs++; 1418 1409 } 1419 1410 } ··· 2165 2154 static int azx_halt(struct notifier_block *nb, unsigned long event, void *buf) 2166 2155 { 2167 2156 struct azx *chip = container_of(nb, struct azx, reboot_notifier); 2157 + snd_hda_bus_reboot_notify(chip->bus); 2168 2158 azx_stop_chip(chip); 2169 2159 return NOTIFY_OK; 2170 2160 } ··· 2233 2221 static struct snd_pci_quirk position_fix_list[] __devinitdata = { 2234 2222 SND_PCI_QUIRK(0x1028, 0x01cc, "Dell D820", POS_FIX_LPIB), 2235 2223 SND_PCI_QUIRK(0x1028, 0x01de, "Dell Precision 390", POS_FIX_LPIB), 2224 + SND_PCI_QUIRK(0x103c, 0x306d, "HP dv3", POS_FIX_LPIB), 2236 2225 SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB), 2226 + SND_PCI_QUIRK(0x1462, 0x1002, "MSI Wind U115", POS_FIX_LPIB), 2237 2227 {} 2238 2228 }; 2239 2229 ··· 2318 2304 } 2319 2305 2320 2306 /* 2321 - * white-list for enable_msi 2307 + * white/black-list for enable_msi 2322 2308 */ 2323 - static struct snd_pci_quirk msi_white_list[] __devinitdata = { 2324 - SND_PCI_QUIRK(0x103c, 0x30f7, "HP Pavilion dv4t-1300", 1), 2325 - SND_PCI_QUIRK(0x103c, 0x3607, "HP Compa CQ40", 1), 2309 + static struct snd_pci_quirk msi_black_list[] __devinitdata = { 2326 2310 {} 2327 2311 }; 2328 2312 ··· 2328 2316 { 2329 2317 const struct snd_pci_quirk *q; 2330 2318 2331 - chip->msi = enable_msi; 2332 - if (chip->msi) 2319 + if (enable_msi >= 0) { 2320 + chip->msi = !!enable_msi; 2333 2321 return; 2334 - q = snd_pci_quirk_lookup(chip->pci, msi_white_list); 2322 + } 2323 + chip->msi = 1; /* enable MSI as default */ 2324 + q = snd_pci_quirk_lookup(chip->pci, msi_black_list); 2335 2325 if (q) { 2336 2326 printk(KERN_INFO 2337 2327 "hda_intel: msi for device %04x:%04x set to %d\n", ··· 2591 2577 if (err < 0) 2592 2578 goto out_free; 2593 2579 card->private_data = chip; 2580 + 2581 + #ifdef CONFIG_SND_HDA_INPUT_BEEP 2582 + chip->beep_mode = beep_mode[dev]; 2583 + #endif 2594 2584 2595 2585 /* create codec instances */ 2596 2586 err = azx_codec_create(chip, model[dev]);
+64 -5
sound/pci/hda/hda_local.h
··· 23 23 #ifndef __SOUND_HDA_LOCAL_H 24 24 #define __SOUND_HDA_LOCAL_H 25 25 26 + /* We abuse kcontrol_new.subdev field to pass the NID corresponding to 27 + * the given new control. If id.subdev has a bit flag HDA_SUBDEV_NID_FLAG, 28 + * snd_hda_ctl_add() takes the lower-bit subdev value as a valid NID. 29 + * 30 + * Note that the subdevice field is cleared again before the real registration 31 + * in snd_hda_ctl_add(), so that this value won't appear in the outside. 32 + */ 33 + #define HDA_SUBDEV_NID_FLAG (1U << 31) 34 + 26 35 /* 27 36 * for mixer controls 28 37 */ ··· 42 33 /* mono volume with index (index=0,1,...) (channel=1,2) */ 43 34 #define HDA_CODEC_VOLUME_MONO_IDX(xname, xcidx, nid, channel, xindex, direction) \ 44 35 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xcidx, \ 36 + .subdevice = HDA_SUBDEV_NID_FLAG | (nid), \ 45 37 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \ 46 38 SNDRV_CTL_ELEM_ACCESS_TLV_READ | \ 47 39 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK, \ ··· 63 53 /* mono mute switch with index (index=0,1,...) (channel=1,2) */ 64 54 #define HDA_CODEC_MUTE_MONO_IDX(xname, xcidx, nid, channel, xindex, direction) \ 65 55 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xcidx, \ 56 + .subdevice = HDA_SUBDEV_NID_FLAG | (nid), \ 66 57 .info = snd_hda_mixer_amp_switch_info, \ 67 58 .get = snd_hda_mixer_amp_switch_get, \ 68 59 .put = snd_hda_mixer_amp_switch_put, \ ··· 77 66 /* stereo mute switch */ 78 67 #define HDA_CODEC_MUTE(xname, nid, xindex, direction) \ 79 68 HDA_CODEC_MUTE_MONO(xname, nid, 3, xindex, direction) 69 + #ifdef CONFIG_SND_HDA_INPUT_BEEP 70 + /* special beep mono mute switch with index (index=0,1,...) (channel=1,2) */ 71 + #define HDA_CODEC_MUTE_BEEP_MONO_IDX(xname, xcidx, nid, channel, xindex, direction) \ 72 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xcidx, \ 73 + .subdevice = HDA_SUBDEV_NID_FLAG | (nid), \ 74 + .info = snd_hda_mixer_amp_switch_info, \ 75 + .get = snd_hda_mixer_amp_switch_get, \ 76 + .put = snd_hda_mixer_amp_switch_put_beep, \ 77 + .private_value = HDA_COMPOSE_AMP_VAL(nid, channel, xindex, direction) } 78 + #else 79 + /* no digital beep - just the standard one */ 80 + #define HDA_CODEC_MUTE_BEEP_MONO_IDX(xname, xcidx, nid, ch, xidx, dir) \ 81 + HDA_CODEC_MUTE_MONO_IDX(xname, xcidx, nid, ch, xidx, dir) 82 + #endif /* CONFIG_SND_HDA_INPUT_BEEP */ 83 + /* special beep mono mute switch */ 84 + #define HDA_CODEC_MUTE_BEEP_MONO(xname, nid, channel, xindex, direction) \ 85 + HDA_CODEC_MUTE_BEEP_MONO_IDX(xname, 0, nid, channel, xindex, direction) 86 + /* special beep stereo mute switch */ 87 + #define HDA_CODEC_MUTE_BEEP(xname, nid, xindex, direction) \ 88 + HDA_CODEC_MUTE_BEEP_MONO(xname, nid, 3, xindex, direction) 89 + 90 + extern const char *snd_hda_pcm_type_name[]; 80 91 81 92 int snd_hda_mixer_amp_volume_info(struct snd_kcontrol *kcontrol, 82 93 struct snd_ctl_elem_info *uinfo); ··· 114 81 struct snd_ctl_elem_value *ucontrol); 115 82 int snd_hda_mixer_amp_switch_put(struct snd_kcontrol *kcontrol, 116 83 struct snd_ctl_elem_value *ucontrol); 84 + #ifdef CONFIG_SND_HDA_INPUT_BEEP 85 + int snd_hda_mixer_amp_switch_put_beep(struct snd_kcontrol *kcontrol, 86 + struct snd_ctl_elem_value *ucontrol); 87 + #endif 117 88 /* lowlevel accessor with caching; use carefully */ 118 89 int snd_hda_codec_amp_read(struct hda_codec *codec, hda_nid_t nid, int ch, 119 90 int direction, int index); ··· 461 424 int snd_hda_override_amp_caps(struct hda_codec *codec, hda_nid_t nid, int dir, 462 425 unsigned int caps); 463 426 u32 snd_hda_query_pin_caps(struct hda_codec *codec, hda_nid_t nid); 427 + u32 snd_hda_pin_sense(struct hda_codec *codec, hda_nid_t nid); 428 + int snd_hda_jack_detect(struct hda_codec *codec, hda_nid_t nid); 464 429 465 - int snd_hda_ctl_add(struct hda_codec *codec, struct snd_kcontrol *kctl); 430 + struct hda_nid_item { 431 + struct snd_kcontrol *kctl; 432 + hda_nid_t nid; 433 + }; 434 + 435 + int snd_hda_ctl_add(struct hda_codec *codec, hda_nid_t nid, 436 + struct snd_kcontrol *kctl); 466 437 void snd_hda_ctls_clear(struct hda_codec *codec); 467 438 468 439 /* ··· 480 435 int snd_hda_create_hwdep(struct hda_codec *codec); 481 436 #else 482 437 static inline int snd_hda_create_hwdep(struct hda_codec *codec) { return 0; } 438 + #endif 439 + 440 + #if defined(CONFIG_SND_HDA_POWER_SAVE) && defined(CONFIG_SND_HDA_HWDEP) 441 + int snd_hda_hwdep_add_power_sysfs(struct hda_codec *codec); 442 + #else 443 + static inline int snd_hda_hwdep_add_power_sysfs(struct hda_codec *codec) 444 + { 445 + return 0; 446 + } 483 447 #endif 484 448 485 449 #ifdef CONFIG_SND_HDA_RECONFIG ··· 544 490 * AMP control callbacks 545 491 */ 546 492 /* retrieve parameters from private_value */ 547 - #define get_amp_nid(kc) ((kc)->private_value & 0xffff) 493 + #define get_amp_nid_(pv) ((pv) & 0xffff) 494 + #define get_amp_nid(kc) get_amp_nid_((kc)->private_value) 548 495 #define get_amp_channels(kc) (((kc)->private_value >> 16) & 0x3) 549 496 #define get_amp_direction(kc) (((kc)->private_value >> 18) & 0x1) 550 497 #define get_amp_index(kc) (((kc)->private_value >> 19) & 0xf) ··· 571 516 * ELD: EDID Like Data 572 517 */ 573 518 struct hdmi_eld { 519 + bool monitor_present; 520 + bool eld_valid; 574 521 int eld_size; 575 522 int baseline_len; 576 - int eld_ver; /* (eld_ver == 0) indicates invalid ELD */ 523 + int eld_ver; 577 524 int cea_edid_ver; 578 525 char monitor_name[ELD_MAX_MNL + 1]; 579 526 int manufacture_id; ··· 598 541 void snd_hdmi_show_eld(struct hdmi_eld *eld); 599 542 600 543 #ifdef CONFIG_PROC_FS 601 - int snd_hda_eld_proc_new(struct hda_codec *codec, struct hdmi_eld *eld); 544 + int snd_hda_eld_proc_new(struct hda_codec *codec, struct hdmi_eld *eld, 545 + int index); 602 546 void snd_hda_eld_proc_free(struct hda_codec *codec, struct hdmi_eld *eld); 603 547 #else 604 548 static inline int snd_hda_eld_proc_new(struct hda_codec *codec, 605 - struct hdmi_eld *eld) 549 + struct hdmi_eld *eld, 550 + int index) 606 551 { 607 552 return 0; 608 553 }
+70
sound/pci/hda/hda_proc.c
··· 26 26 #include "hda_codec.h" 27 27 #include "hda_local.h" 28 28 29 + static char *bits_names(unsigned int bits, char *names[], int size) 30 + { 31 + int i, n; 32 + static char buf[128]; 33 + 34 + for (i = 0, n = 0; i < size; i++) { 35 + if (bits & (1U<<i) && names[i]) 36 + n += snprintf(buf + n, sizeof(buf) - n, " %s", 37 + names[i]); 38 + } 39 + buf[n] = '\0'; 40 + 41 + return buf; 42 + } 43 + 29 44 static const char *get_wid_type_name(unsigned int wid_value) 30 45 { 31 46 static char *names[16] = { ··· 59 44 return names[wid_value]; 60 45 else 61 46 return "UNKNOWN Widget"; 47 + } 48 + 49 + static void print_nid_mixers(struct snd_info_buffer *buffer, 50 + struct hda_codec *codec, hda_nid_t nid) 51 + { 52 + int i; 53 + struct hda_nid_item *items = codec->mixers.list; 54 + struct snd_kcontrol *kctl; 55 + for (i = 0; i < codec->mixers.used; i++) { 56 + if (items[i].nid == nid) { 57 + kctl = items[i].kctl; 58 + snd_iprintf(buffer, 59 + " Control: name=\"%s\", index=%i, device=%i\n", 60 + kctl->id.name, kctl->id.index, kctl->id.device); 61 + } 62 + } 63 + } 64 + 65 + static void print_nid_pcms(struct snd_info_buffer *buffer, 66 + struct hda_codec *codec, hda_nid_t nid) 67 + { 68 + int pcm, type; 69 + struct hda_pcm *cpcm; 70 + for (pcm = 0; pcm < codec->num_pcms; pcm++) { 71 + cpcm = &codec->pcm_info[pcm]; 72 + for (type = 0; type < 2; type++) { 73 + if (cpcm->stream[type].nid != nid || cpcm->pcm == NULL) 74 + continue; 75 + snd_iprintf(buffer, " Device: name=\"%s\", " 76 + "type=\"%s\", device=%i\n", 77 + cpcm->name, 78 + snd_hda_pcm_type_name[cpcm->pcm_type], 79 + cpcm->pcm->device); 80 + } 81 + } 62 82 } 63 83 64 84 static void print_amp_caps(struct snd_info_buffer *buffer, ··· 413 363 static void print_power_state(struct snd_info_buffer *buffer, 414 364 struct hda_codec *codec, hda_nid_t nid) 415 365 { 366 + static char *names[] = { 367 + [ilog2(AC_PWRST_D0SUP)] = "D0", 368 + [ilog2(AC_PWRST_D1SUP)] = "D1", 369 + [ilog2(AC_PWRST_D2SUP)] = "D2", 370 + [ilog2(AC_PWRST_D3SUP)] = "D3", 371 + [ilog2(AC_PWRST_D3COLDSUP)] = "D3cold", 372 + [ilog2(AC_PWRST_S3D3COLDSUP)] = "S3D3cold", 373 + [ilog2(AC_PWRST_CLKSTOP)] = "CLKSTOP", 374 + [ilog2(AC_PWRST_EPSS)] = "EPSS", 375 + }; 376 + 377 + int sup = snd_hda_param_read(codec, nid, AC_PAR_POWER_STATE); 416 378 int pwr = snd_hda_codec_read(codec, nid, 0, 417 379 AC_VERB_GET_POWER_STATE, 0); 380 + if (sup) 381 + snd_iprintf(buffer, " Power states: %s\n", 382 + bits_names(sup, names, ARRAY_SIZE(names))); 383 + 418 384 snd_iprintf(buffer, " Power: setting=%s, actual=%s\n", 419 385 get_pwr_state(pwr & AC_PWRST_SETTING), 420 386 get_pwr_state((pwr & AC_PWRST_ACTUAL) >> ··· 523 457 (data & (1<<i)) ? 1 : 0, 524 458 (unsol & (1<<i)) ? 1 : 0); 525 459 /* FIXME: add GPO and GPI pin information */ 460 + print_nid_mixers(buffer, codec, nid); 526 461 } 527 462 528 463 static void print_codec_info(struct snd_info_entry *entry, ··· 602 535 if (wid_caps & AC_WCAP_CP_CAPS) 603 536 snd_iprintf(buffer, " CP"); 604 537 snd_iprintf(buffer, "\n"); 538 + 539 + print_nid_mixers(buffer, codec, nid); 540 + print_nid_pcms(buffer, codec, nid); 605 541 606 542 /* volume knob is a special widget that always have connection 607 543 * list
+28 -33
sound/pci/hda/patch_analog.c
··· 156 156 157 157 static void ad198x_free_kctls(struct hda_codec *codec); 158 158 159 + #ifdef CONFIG_SND_HDA_INPUT_BEEP 159 160 /* additional beep mixers; the actual parameters are overwritten at build */ 160 161 static struct snd_kcontrol_new ad_beep_mixer[] = { 161 162 HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_OUTPUT), 162 - HDA_CODEC_MUTE("Beep Playback Switch", 0, 0, HDA_OUTPUT), 163 + HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_OUTPUT), 163 164 { } /* end */ 164 165 }; 165 166 166 167 #define set_beep_amp(spec, nid, idx, dir) \ 167 168 ((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 1, idx, dir)) /* mono */ 169 + #else 170 + #define set_beep_amp(spec, nid, idx, dir) /* NOP */ 171 + #endif 168 172 169 173 static int ad198x_build_controls(struct hda_codec *codec) 170 174 { ··· 198 194 } 199 195 200 196 /* create beep controls if needed */ 197 + #ifdef CONFIG_SND_HDA_INPUT_BEEP 201 198 if (spec->beep_amp) { 202 199 struct snd_kcontrol_new *knew; 203 200 for (knew = ad_beep_mixer; knew->name; knew++) { ··· 207 202 if (!kctl) 208 203 return -ENOMEM; 209 204 kctl->private_value = spec->beep_amp; 210 - err = snd_hda_ctl_add(codec, kctl); 205 + err = snd_hda_ctl_add(codec, 206 + get_amp_nid_(spec->beep_amp), 207 + kctl); 211 208 if (err < 0) 212 209 return err; 213 210 } 214 211 } 212 + #endif 215 213 216 214 /* if we have no master control, let's create it */ 217 215 if (!snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) { ··· 720 712 static void ad1986a_automic(struct hda_codec *codec) 721 713 { 722 714 unsigned int present; 723 - present = snd_hda_codec_read(codec, 0x1f, 0, AC_VERB_GET_PIN_SENSE, 0); 715 + present = snd_hda_jack_detect(codec, 0x1f); 724 716 /* 0 = 0x1f, 2 = 0x1d, 4 = mixed */ 725 717 snd_hda_codec_write(codec, 0x0f, 0, AC_VERB_SET_CONNECT_SEL, 726 - (present & AC_PINSENSE_PRESENCE) ? 0 : 2); 718 + present ? 0 : 2); 727 719 } 728 720 729 721 #define AD1986A_MIC_EVENT 0x36 ··· 762 754 static void ad1986a_hp_automute(struct hda_codec *codec) 763 755 { 764 756 struct ad198x_spec *spec = codec->spec; 765 - unsigned int present; 766 757 767 - present = snd_hda_codec_read(codec, 0x1a, 0, AC_VERB_GET_PIN_SENSE, 0); 768 - spec->jack_present = !!(present & 0x80000000); 758 + spec->jack_present = snd_hda_jack_detect(codec, 0x1a); 769 759 if (spec->inv_jack_detect) 770 760 spec->jack_present = !spec->jack_present; 771 761 ad1986a_update_hp(codec); ··· 1553 1547 { 1554 1548 unsigned int present; 1555 1549 1556 - present = snd_hda_codec_read(codec, 0x06, 0, 1557 - AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 1550 + present = snd_hda_jack_detect(codec, 0x06); 1558 1551 snd_hda_codec_amp_stereo(codec, 0x05, HDA_OUTPUT, 0, 1559 1552 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 1560 1553 } ··· 1573 1568 }; 1574 1569 unsigned int present; 1575 1570 1576 - present = snd_hda_codec_read(codec, 0x08, 0, 1577 - AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 1571 + present = snd_hda_jack_detect(codec, 0x08); 1578 1572 if (present) 1579 1573 snd_hda_sequence_write(codec, mic_jack_on); 1580 1574 else ··· 2528 2524 { 2529 2525 if ((res >> 26) != AD1988_HP_EVENT) 2530 2526 return; 2531 - if (snd_hda_codec_read(codec, 0x11, 0, AC_VERB_GET_PIN_SENSE, 0) & (1 << 31)) 2527 + if (snd_hda_jack_detect(codec, 0x11)) 2532 2528 snd_hda_sequence_write(codec, ad1988_laptop_hp_on); 2533 2529 else 2534 2530 snd_hda_sequence_write(codec, ad1988_laptop_hp_off); ··· 2573 2569 knew->name = kstrdup(name, GFP_KERNEL); 2574 2570 if (! knew->name) 2575 2571 return -ENOMEM; 2572 + if (get_amp_nid_(val)) 2573 + knew->subdevice = HDA_SUBDEV_NID_FLAG | get_amp_nid_(val); 2576 2574 knew->private_value = val; 2577 2575 return 0; 2578 2576 } ··· 3774 3768 { 3775 3769 unsigned int present; 3776 3770 3777 - present = snd_hda_codec_read(codec, 0x11, 0, 3778 - AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 3771 + present = snd_hda_jack_detect(codec, 0x11); 3779 3772 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0, 3780 3773 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 3781 3774 snd_hda_codec_write(codec, 0x16, 0, AC_VERB_SET_EAPD_BTLENABLE, ··· 3786 3781 { 3787 3782 unsigned int present; 3788 3783 3789 - present = snd_hda_codec_read(codec, 0x14, 0, 3790 - AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 3784 + present = snd_hda_jack_detect(codec, 0x14); 3791 3785 snd_hda_codec_write(codec, 0x0c, 0, AC_VERB_SET_CONNECT_SEL, 3792 3786 present ? 0 : 1); 3793 3787 } ··· 3821 3817 { 3822 3818 unsigned int present; 3823 3819 3824 - present = snd_hda_codec_read(codec, 0x11, 0, AC_VERB_GET_PIN_SENSE, 0); 3825 - present &= AC_PINSENSE_PRESENCE; 3826 - if (!present) { 3827 - present = snd_hda_codec_read(codec, 0x12, 0, 3828 - AC_VERB_GET_PIN_SENSE, 0); 3829 - present &= AC_PINSENSE_PRESENCE; 3830 - } 3820 + present = snd_hda_jack_detect(codec, 0x11); 3821 + if (!present) 3822 + present = snd_hda_jack_detect(codec, 0x12); 3831 3823 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0, 3832 3824 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 3833 3825 snd_hda_codec_write(codec, 0x16, 0, AC_VERB_SET_EAPD_BTLENABLE, ··· 3835 3835 { 3836 3836 unsigned int idx; 3837 3837 3838 - if (snd_hda_codec_read(codec, 0x14, 0, AC_VERB_GET_PIN_SENSE, 0) & 3839 - AC_PINSENSE_PRESENCE) 3838 + if (snd_hda_jack_detect(codec, 0x14)) 3840 3839 idx = 0; 3841 - else if (snd_hda_codec_read(codec, 0x1c, 0, AC_VERB_GET_PIN_SENSE, 0) & 3842 - AC_PINSENSE_PRESENCE) 3840 + else if (snd_hda_jack_detect(codec, 0x1c)) 3843 3841 idx = 4; 3844 3842 else 3845 3843 idx = 1; ··· 4006 4008 { 4007 4009 unsigned int present; 4008 4010 4009 - present = snd_hda_codec_read(codec, 0x11, 0, AC_VERB_GET_PIN_SENSE, 0) 4010 - & AC_PINSENSE_PRESENCE; 4011 + present = snd_hda_jack_detect(codec, 0x11); 4011 4012 snd_hda_codec_amp_stereo(codec, 0x12, HDA_OUTPUT, 0, 4012 4013 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 4013 4014 } ··· 4114 4117 /* switch to external mic if plugged */ 4115 4118 static void ad1984a_touchsmart_automic(struct hda_codec *codec) 4116 4119 { 4117 - if (snd_hda_codec_read(codec, 0x1c, 0, 4118 - AC_VERB_GET_PIN_SENSE, 0) & 0x80000000) { 4120 + if (snd_hda_jack_detect(codec, 0x1c)) 4119 4121 snd_hda_codec_write(codec, 0x0c, 0, 4120 4122 AC_VERB_SET_CONNECT_SEL, 0x4); 4121 - } else { 4123 + else 4122 4124 snd_hda_codec_write(codec, 0x0c, 0, 4123 4125 AC_VERB_SET_CONNECT_SEL, 0x5); 4124 - } 4125 4126 } 4126 4127 4127 4128
+2 -2
sound/pci/hda/patch_ca0110.c
··· 144 144 struct snd_kcontrol_new knew = 145 145 HDA_CODEC_MUTE_MONO(namestr, nid, chan, 0, type); 146 146 sprintf(namestr, "%s %s Switch", pfx, dirstr[dir]); 147 - return snd_hda_ctl_add(codec, snd_ctl_new1(&knew, codec)); 147 + return snd_hda_ctl_add(codec, nid, snd_ctl_new1(&knew, codec)); 148 148 } 149 149 150 150 static int _add_volume(struct hda_codec *codec, hda_nid_t nid, const char *pfx, ··· 155 155 struct snd_kcontrol_new knew = 156 156 HDA_CODEC_VOLUME_MONO(namestr, nid, chan, 0, type); 157 157 sprintf(namestr, "%s %s Volume", pfx, dirstr[dir]); 158 - return snd_hda_ctl_add(codec, snd_ctl_new1(&knew, codec)); 158 + return snd_hda_ctl_add(codec, nid, snd_ctl_new1(&knew, codec)); 159 159 } 160 160 161 161 #define add_out_switch(codec, nid, pfx) _add_switch(codec, nid, pfx, 3, 0)
+11 -20
sound/pci/hda/patch_cirrus.c
··· 500 500 knew.private_value = pval; 501 501 snprintf(tmp, sizeof(tmp), "%s %s Switch", name, dir_sfx[dir]); 502 502 *kctlp = snd_ctl_new1(&knew, codec); 503 - return snd_hda_ctl_add(codec, *kctlp); 503 + return snd_hda_ctl_add(codec, get_amp_nid_(pval), *kctlp); 504 504 } 505 505 506 506 static int add_volume(struct hda_codec *codec, const char *name, ··· 513 513 knew.private_value = pval; 514 514 snprintf(tmp, sizeof(tmp), "%s %s Volume", name, dir_sfx[dir]); 515 515 *kctlp = snd_ctl_new1(&knew, codec); 516 - return snd_hda_ctl_add(codec, *kctlp); 516 + return snd_hda_ctl_add(codec, get_amp_nid_(pval), *kctlp); 517 517 } 518 518 519 519 static void fix_volume_caps(struct hda_codec *codec, hda_nid_t dac) ··· 536 536 537 537 spec->vmaster_sw = 538 538 snd_ctl_make_virtual_master("Master Playback Switch", NULL); 539 - err = snd_hda_ctl_add(codec, spec->vmaster_sw); 539 + err = snd_hda_ctl_add(codec, dac, spec->vmaster_sw); 540 540 if (err < 0) 541 541 return err; 542 542 543 543 snd_hda_set_vmaster_tlv(codec, dac, HDA_OUTPUT, tlv); 544 544 spec->vmaster_vol = 545 545 snd_ctl_make_virtual_master("Master Playback Volume", tlv); 546 - err = snd_hda_ctl_add(codec, spec->vmaster_vol); 546 + err = snd_hda_ctl_add(codec, dac, spec->vmaster_vol); 547 547 if (err < 0) 548 548 return err; 549 549 return 0; ··· 756 756 if (!kctl) 757 757 return -ENOMEM; 758 758 kctl->private_value = (long)spec->capture_bind[i]; 759 - err = snd_hda_ctl_add(codec, kctl); 759 + err = snd_hda_ctl_add(codec, 0, kctl); 760 760 if (err < 0) 761 761 return err; 762 762 } 763 763 764 764 if (spec->num_inputs > 1 && !spec->mic_detect) { 765 - err = snd_hda_ctl_add(codec, 765 + err = snd_hda_ctl_add(codec, 0, 766 766 snd_ctl_new1(&cs_capture_source, codec)); 767 767 if (err < 0) 768 768 return err; ··· 807 807 { 808 808 struct cs_spec *spec = codec->spec; 809 809 struct auto_pin_cfg *cfg = &spec->autocfg; 810 - unsigned int caps, present, hp_present; 810 + unsigned int caps, hp_present; 811 811 hda_nid_t nid; 812 812 int i; 813 813 ··· 817 817 caps = snd_hda_query_pin_caps(codec, nid); 818 818 if (!(caps & AC_PINCAP_PRES_DETECT)) 819 819 continue; 820 - if (caps & AC_PINCAP_TRIG_REQ) 821 - snd_hda_codec_read(codec, nid, 0, 822 - AC_VERB_SET_PIN_SENSE, 0); 823 - present = snd_hda_codec_read(codec, nid, 0, 824 - AC_VERB_GET_PIN_SENSE, 0); 825 - hp_present |= (present & AC_PINSENSE_PRESENCE) != 0; 820 + hp_present = snd_hda_jack_detect(codec, nid); 826 821 if (hp_present) 827 822 break; 828 823 } ··· 839 844 struct cs_spec *spec = codec->spec; 840 845 struct auto_pin_cfg *cfg = &spec->autocfg; 841 846 hda_nid_t nid; 842 - unsigned int caps, present; 847 + unsigned int present; 843 848 844 849 nid = cfg->input_pins[spec->automic_idx]; 845 - caps = snd_hda_query_pin_caps(codec, nid); 846 - if (caps & AC_PINCAP_TRIG_REQ) 847 - snd_hda_codec_read(codec, nid, 0, AC_VERB_SET_PIN_SENSE, 0); 848 - present = snd_hda_codec_read(codec, nid, 0, 849 - AC_VERB_GET_PIN_SENSE, 0); 850 - if (present & AC_PINSENSE_PRESENCE) 850 + present = snd_hda_jack_detect(codec, nid); 851 + if (present) 851 852 change_cur_input(codec, spec->automic_idx, 0); 852 853 else { 853 854 unsigned int imic = (spec->automic_idx == AUTO_PIN_MIC) ?
+150 -39
sound/pci/hda/patch_conexant.c
··· 397 397 for (i = 0; i < spec->jacks.used; i++) { 398 398 if (jacks->nid == nid) { 399 399 unsigned int present; 400 - present = snd_hda_codec_read(codec, nid, 0, 401 - AC_VERB_GET_PIN_SENSE, 0) & 402 - AC_PINSENSE_PRESENCE; 400 + present = snd_hda_jack_detect(codec, nid); 403 401 404 402 present = (present) ? jacks->type : 0 ; 405 403 ··· 748 750 }; 749 751 unsigned int present; 750 752 751 - present = snd_hda_codec_read(codec, 0x12, 0, 752 - AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 753 + present = snd_hda_jack_detect(codec, 0x12); 753 754 if (present) 754 755 snd_hda_sequence_write(codec, mic_jack_on); 755 756 else ··· 762 765 struct conexant_spec *spec = codec->spec; 763 766 unsigned int bits; 764 767 765 - spec->hp_present = snd_hda_codec_read(codec, 0x11, 0, 766 - AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 768 + spec->hp_present = snd_hda_jack_detect(codec, 0x11); 767 769 768 770 bits = (spec->hp_present || !spec->cur_eapd) ? HDA_AMP_MUTE : 0; 769 771 snd_hda_codec_amp_stereo(codec, 0x10, HDA_OUTPUT, 0, ··· 1171 1175 1172 1176 switch (codec->subsystem_id >> 16) { 1173 1177 case 0x103c: 1174 - /* HP laptop has a really bad sound over 0dB on NID 0x17. 1175 - * Fix max PCM level to 0 dB 1176 - * (originall it has 0x2b steps with 0dB offset 0x14) 1178 + case 0x1734: 1179 + /* HP & Fujitsu-Siemens laptops have really bad sound over 0dB 1180 + * on NID 0x17. Fix max PCM level to 0 dB 1181 + * (originally it has 0x2b steps with 0dB offset 0x14) 1177 1182 */ 1178 1183 snd_hda_override_amp_caps(codec, 0x17, HDA_INPUT, 1179 1184 (0x14 << AC_AMPCAP_OFFSET_SHIFT) | ··· 1240 1243 struct conexant_spec *spec = codec->spec; 1241 1244 unsigned int bits; 1242 1245 1243 - spec->hp_present = snd_hda_codec_read(codec, 0x13, 0, 1244 - AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 1246 + spec->hp_present = snd_hda_jack_detect(codec, 0x13); 1245 1247 1246 1248 bits = (spec->hp_present || !spec->cur_eapd) ? HDA_AMP_MUTE : 0; 1247 1249 /* See the note in cxt5047_hp_master_sw_put */ ··· 1263 1267 }; 1264 1268 unsigned int present; 1265 1269 1266 - present = snd_hda_codec_read(codec, 0x15, 0, 1267 - AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 1270 + present = snd_hda_jack_detect(codec, 0x15); 1268 1271 if (present) 1269 1272 snd_hda_sequence_write(codec, mic_jack_on); 1270 1273 else ··· 1410 1415 .get = conexant_mux_enum_get, 1411 1416 .put = conexant_mux_enum_put, 1412 1417 }, 1413 - HDA_CODEC_VOLUME("Input-1 Volume", 0x1a, 0x0, HDA_INPUT), 1414 - HDA_CODEC_MUTE("Input-1 Switch", 0x1a, 0x0, HDA_INPUT), 1415 - HDA_CODEC_VOLUME("Input-2 Volume", 0x1a, 0x1, HDA_INPUT), 1416 - HDA_CODEC_MUTE("Input-2 Switch", 0x1a, 0x1, HDA_INPUT), 1417 - HDA_CODEC_VOLUME("Input-3 Volume", 0x1a, 0x2, HDA_INPUT), 1418 - HDA_CODEC_MUTE("Input-3 Switch", 0x1a, 0x2, HDA_INPUT), 1419 - HDA_CODEC_VOLUME("Input-4 Volume", 0x1a, 0x3, HDA_INPUT), 1420 - HDA_CODEC_MUTE("Input-4 Switch", 0x1a, 0x3, HDA_INPUT), 1421 - HDA_CODEC_VOLUME("Input-5 Volume", 0x1a, 0x4, HDA_INPUT), 1422 - HDA_CODEC_MUTE("Input-5 Switch", 0x1a, 0x4, HDA_INPUT), 1418 + HDA_CODEC_VOLUME("Mic Boost Volume", 0x1a, 0x0, HDA_OUTPUT), 1423 1419 1424 1420 { } /* end */ 1425 1421 }; ··· 1607 1621 1608 1622 if (spec->no_auto_mic) 1609 1623 return; 1610 - present = snd_hda_codec_read(codec, 0x17, 0, 1611 - AC_VERB_GET_PIN_SENSE, 0) & 1612 - AC_PINSENSE_PRESENCE; 1624 + present = snd_hda_jack_detect(codec, 0x17); 1613 1625 snd_hda_codec_write(codec, 0x14, 0, 1614 1626 AC_VERB_SET_CONNECT_SEL, 1615 1627 present ? 0x01 : 0x00); ··· 1622 1638 1623 1639 if (spec->no_auto_mic) 1624 1640 return; 1625 - present = snd_hda_codec_read(codec, 0x18, 0, 1626 - AC_VERB_GET_PIN_SENSE, 0) & 1627 - AC_PINSENSE_PRESENCE; 1641 + present = snd_hda_jack_detect(codec, 0x18); 1628 1642 if (present) 1629 1643 spec->cur_adc_idx = 1; 1630 1644 else ··· 1643 1661 { 1644 1662 struct conexant_spec *spec = codec->spec; 1645 1663 1646 - spec->hp_present = snd_hda_codec_read(codec, 0x16, 0, 1647 - AC_VERB_GET_PIN_SENSE, 0) & 1648 - AC_PINSENSE_PRESENCE; 1664 + spec->hp_present = snd_hda_jack_detect(codec, 0x16); 1649 1665 cxt5051_update_speaker(codec); 1650 1666 } 1651 1667 ··· 1991 2011 }; 1992 2012 unsigned int present; 1993 2013 1994 - present = snd_hda_codec_read(codec, 0x1a, 0, 1995 - AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 2014 + present = snd_hda_jack_detect(codec, 0x1a); 2015 + if (present) { 2016 + snd_printdd("CXT5066: external microphone detected\n"); 2017 + snd_hda_sequence_write(codec, ext_mic_present); 2018 + } else { 2019 + snd_printdd("CXT5066: external microphone absent\n"); 2020 + snd_hda_sequence_write(codec, ext_mic_absent); 2021 + } 2022 + } 2023 + 2024 + /* toggle input of built-in digital mic and mic jack appropriately */ 2025 + static void cxt5066_vostro_automic(struct hda_codec *codec) 2026 + { 2027 + struct conexant_spec *spec = codec->spec; 2028 + unsigned int present; 2029 + 2030 + struct hda_verb ext_mic_present[] = { 2031 + /* enable external mic, port B */ 2032 + {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, spec->ext_mic_bias}, 2033 + 2034 + /* switch to external mic input */ 2035 + {0x17, AC_VERB_SET_CONNECT_SEL, 0}, 2036 + {0x14, AC_VERB_SET_CONNECT_SEL, 0}, 2037 + 2038 + /* disable internal digital mic */ 2039 + {0x23, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 2040 + {} 2041 + }; 2042 + static struct hda_verb ext_mic_absent[] = { 2043 + /* enable internal mic, port C */ 2044 + {0x23, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2045 + 2046 + /* switch to internal mic input */ 2047 + {0x14, AC_VERB_SET_CONNECT_SEL, 2}, 2048 + 2049 + /* disable external mic, port B */ 2050 + {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 2051 + {} 2052 + }; 2053 + 2054 + present = snd_hda_jack_detect(codec, 0x1a); 1996 2055 if (present) { 1997 2056 snd_printdd("CXT5066: external microphone detected\n"); 1998 2057 snd_hda_sequence_write(codec, ext_mic_present); ··· 2048 2029 unsigned int portA, portD; 2049 2030 2050 2031 /* Port A */ 2051 - portA = snd_hda_codec_read(codec, 0x19, 0, AC_VERB_GET_PIN_SENSE, 0) 2052 - & AC_PINSENSE_PRESENCE; 2032 + portA = snd_hda_jack_detect(codec, 0x19); 2053 2033 2054 2034 /* Port D */ 2055 - portD = (snd_hda_codec_read(codec, 0x1c, 0, AC_VERB_GET_PIN_SENSE, 0) 2056 - & AC_PINSENSE_PRESENCE) << 1; 2035 + portD = snd_hda_jack_detect(codec, 0x1c); 2057 2036 2058 2037 spec->hp_present = !!(portA | portD); 2059 2038 snd_printdd("CXT5066: hp automute portA=%x portD=%x present=%d\n", ··· 2069 2052 break; 2070 2053 case CONEXANT_MIC_EVENT: 2071 2054 cxt5066_automic(codec); 2055 + break; 2056 + } 2057 + } 2058 + 2059 + /* unsolicited event for jack sensing */ 2060 + static void cxt5066_vostro_event(struct hda_codec *codec, unsigned int res) 2061 + { 2062 + snd_printdd("CXT5066_vostro: unsol event %x (%x)\n", res, res >> 26); 2063 + switch (res >> 26) { 2064 + case CONEXANT_HP_EVENT: 2065 + cxt5066_hp_automute(codec); 2066 + break; 2067 + case CONEXANT_MIC_EVENT: 2068 + cxt5066_vostro_automic(codec); 2072 2069 break; 2073 2070 } 2074 2071 } ··· 2328 2297 { } /* end */ 2329 2298 }; 2330 2299 2300 + static struct hda_verb cxt5066_init_verbs_vostro[] = { 2301 + /* Port A: headphones */ 2302 + {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 2303 + {0x19, AC_VERB_SET_CONNECT_SEL, 0x00}, /* DAC1 */ 2304 + 2305 + /* Port B: external microphone */ 2306 + {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 2307 + 2308 + /* Port C: unused */ 2309 + {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 2310 + 2311 + /* Port D: unused */ 2312 + {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 2313 + 2314 + /* Port E: unused, but has primary EAPD */ 2315 + {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 2316 + {0x1d, AC_VERB_SET_EAPD_BTLENABLE, 0x2}, /* default on */ 2317 + 2318 + /* Port F: unused */ 2319 + {0x1e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 2320 + 2321 + /* Port G: internal speakers */ 2322 + {0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2323 + {0x1f, AC_VERB_SET_CONNECT_SEL, 0x00}, /* DAC1 */ 2324 + 2325 + /* DAC1 */ 2326 + {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 2327 + 2328 + /* DAC2: unused */ 2329 + {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, 2330 + 2331 + {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 2332 + {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 2333 + {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 2334 + {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 2335 + {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 2336 + {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 2337 + {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 2338 + {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 2339 + {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 2340 + {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 2341 + {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 2342 + {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 2343 + 2344 + /* Digital microphone port */ 2345 + {0x23, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, 2346 + 2347 + /* Audio input selectors */ 2348 + {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x3}, 2349 + {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE }, 2350 + 2351 + /* Disable SPDIF */ 2352 + {0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 2353 + {0x22, AC_VERB_SET_PIN_WIDGET_CONTROL, 0}, 2354 + 2355 + /* enable unsolicited events for Port A and B */ 2356 + {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_HP_EVENT}, 2357 + {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_MIC_EVENT}, 2358 + { } /* end */ 2359 + }; 2360 + 2331 2361 static struct hda_verb cxt5066_init_verbs_portd_lo[] = { 2332 2362 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, 2333 2363 { } /* end */ ··· 2410 2318 CXT5066_LAPTOP, /* Laptops w/ EAPD support */ 2411 2319 CXT5066_DELL_LAPTOP, /* Dell Laptop */ 2412 2320 CXT5066_OLPC_XO_1_5, /* OLPC XO 1.5 */ 2321 + CXT5066_DELL_VOSTO, /* Dell Vostro 1015i */ 2413 2322 CXT5066_MODELS 2414 2323 }; 2415 2324 ··· 2418 2325 [CXT5066_LAPTOP] = "laptop", 2419 2326 [CXT5066_DELL_LAPTOP] = "dell-laptop", 2420 2327 [CXT5066_OLPC_XO_1_5] = "olpc-xo-1_5", 2328 + [CXT5066_DELL_VOSTO] = "dell-vostro" 2421 2329 }; 2422 2330 2423 2331 static struct snd_pci_quirk cxt5066_cfg_tbl[] = { ··· 2427 2333 SND_PCI_QUIRK(0x1028, 0x02f5, "Dell", 2428 2334 CXT5066_DELL_LAPTOP), 2429 2335 SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT5066_OLPC_XO_1_5), 2336 + SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTO), 2430 2337 {} 2431 2338 }; 2432 2339 ··· 2495 2400 /* input source automatically selected */ 2496 2401 spec->input_mux = NULL; 2497 2402 break; 2403 + case CXT5066_DELL_VOSTO: 2404 + codec->patch_ops.unsol_event = cxt5066_vostro_event; 2405 + spec->init_verbs[0] = cxt5066_init_verbs_vostro; 2406 + spec->mixers[spec->num_mixers++] = cxt5066_mixer_master_olpc; 2407 + spec->mixers[spec->num_mixers++] = cxt5066_mixers; 2408 + spec->port_d_mode = 0; 2409 + 2410 + /* no S/PDIF out */ 2411 + spec->multiout.dig_out_nid = 0; 2412 + 2413 + /* input source automatically selected */ 2414 + spec->input_mux = NULL; 2415 + break; 2498 2416 } 2499 2417 2500 2418 return 0; ··· 2525 2417 .patch = patch_cxt5051 }, 2526 2418 { .id = 0x14f15066, .name = "CX20582 (Pebble)", 2527 2419 .patch = patch_cxt5066 }, 2420 + { .id = 0x14f15067, .name = "CX20583 (Pebble HSF)", 2421 + .patch = patch_cxt5066 }, 2528 2422 {} /* terminator */ 2529 2423 }; 2530 2424 ··· 2534 2424 MODULE_ALIAS("snd-hda-codec-id:14f15047"); 2535 2425 MODULE_ALIAS("snd-hda-codec-id:14f15051"); 2536 2426 MODULE_ALIAS("snd-hda-codec-id:14f15066"); 2427 + MODULE_ALIAS("snd-hda-codec-id:14f15067"); 2537 2428 2538 2429 MODULE_LICENSE("GPL"); 2539 2430 MODULE_DESCRIPTION("Conexant HD-audio codec");
+365 -123
sound/pci/hda/patch_intelhdmi.c
··· 33 33 #include "hda_codec.h" 34 34 #include "hda_local.h" 35 35 36 - static hda_nid_t cvt_nid; /* audio converter */ 37 - static hda_nid_t pin_nid; /* HDMI output pin */ 36 + /* 37 + * The HDMI/DisplayPort configuration can be highly dynamic. A graphics device 38 + * could support two independent pipes, each of them can be connected to one or 39 + * more ports (DVI, HDMI or DisplayPort). 40 + * 41 + * The HDA correspondence of pipes/ports are converter/pin nodes. 42 + */ 43 + #define INTEL_HDMI_CVTS 2 44 + #define INTEL_HDMI_PINS 3 38 45 39 - #define INTEL_HDMI_EVENT_TAG 0x08 46 + static char *intel_hdmi_pcm_names[INTEL_HDMI_CVTS] = { 47 + "INTEL HDMI 0", 48 + "INTEL HDMI 1", 49 + }; 40 50 41 51 struct intel_hdmi_spec { 42 - struct hda_multi_out multiout; 43 - struct hda_pcm pcm_rec; 44 - struct hdmi_eld sink_eld; 52 + int num_cvts; 53 + int num_pins; 54 + hda_nid_t cvt[INTEL_HDMI_CVTS+1]; /* audio sources */ 55 + hda_nid_t pin[INTEL_HDMI_PINS+1]; /* audio sinks */ 56 + 57 + /* 58 + * source connection for each pin 59 + */ 60 + hda_nid_t pin_cvt[INTEL_HDMI_PINS+1]; 61 + 62 + /* 63 + * HDMI sink attached to each pin 64 + */ 65 + struct hdmi_eld sink_eld[INTEL_HDMI_PINS]; 66 + 67 + /* 68 + * export one pcm per pipe 69 + */ 70 + struct hda_pcm pcm_rec[INTEL_HDMI_CVTS]; 45 71 }; 46 72 47 73 struct hdmi_audio_infoframe { ··· 210 184 { .ca_index = 0x31, .speakers = { FRW, FLW, RR, RL, FC, LFE, FR, FL } }, 211 185 }; 212 186 187 + 188 + /* 189 + * HDA/HDMI auto parsing 190 + */ 191 + 192 + static int hda_node_index(hda_nid_t *nids, hda_nid_t nid) 193 + { 194 + int i; 195 + 196 + for (i = 0; nids[i]; i++) 197 + if (nids[i] == nid) 198 + return i; 199 + 200 + snd_printk(KERN_WARNING "HDMI: nid %d not registered\n", nid); 201 + return -EINVAL; 202 + } 203 + 204 + static int intel_hdmi_read_pin_conn(struct hda_codec *codec, hda_nid_t pin_nid) 205 + { 206 + struct intel_hdmi_spec *spec = codec->spec; 207 + hda_nid_t conn_list[HDA_MAX_CONNECTIONS]; 208 + int conn_len, curr; 209 + int index; 210 + 211 + if (!(get_wcaps(codec, pin_nid) & AC_WCAP_CONN_LIST)) { 212 + snd_printk(KERN_WARNING 213 + "HDMI: pin %d wcaps %#x " 214 + "does not support connection list\n", 215 + pin_nid, get_wcaps(codec, pin_nid)); 216 + return -EINVAL; 217 + } 218 + 219 + conn_len = snd_hda_get_connections(codec, pin_nid, conn_list, 220 + HDA_MAX_CONNECTIONS); 221 + if (conn_len > 1) 222 + curr = snd_hda_codec_read(codec, pin_nid, 0, 223 + AC_VERB_GET_CONNECT_SEL, 0); 224 + else 225 + curr = 0; 226 + 227 + index = hda_node_index(spec->pin, pin_nid); 228 + if (index < 0) 229 + return -EINVAL; 230 + 231 + spec->pin_cvt[index] = conn_list[curr]; 232 + 233 + return 0; 234 + } 235 + 236 + static void hdmi_get_show_eld(struct hda_codec *codec, hda_nid_t pin_nid, 237 + struct hdmi_eld *eld) 238 + { 239 + if (!snd_hdmi_get_eld(eld, codec, pin_nid)) 240 + snd_hdmi_show_eld(eld); 241 + } 242 + 243 + static void hdmi_present_sense(struct hda_codec *codec, hda_nid_t pin_nid, 244 + struct hdmi_eld *eld) 245 + { 246 + int present = snd_hda_pin_sense(codec, pin_nid); 247 + 248 + eld->monitor_present = !!(present & AC_PINSENSE_PRESENCE); 249 + eld->eld_valid = !!(present & AC_PINSENSE_ELDV); 250 + 251 + if (present & AC_PINSENSE_ELDV) 252 + hdmi_get_show_eld(codec, pin_nid, eld); 253 + } 254 + 255 + static int intel_hdmi_add_pin(struct hda_codec *codec, hda_nid_t pin_nid) 256 + { 257 + struct intel_hdmi_spec *spec = codec->spec; 258 + 259 + if (spec->num_pins >= INTEL_HDMI_PINS) { 260 + snd_printk(KERN_WARNING 261 + "HDMI: no space for pin %d \n", pin_nid); 262 + return -EINVAL; 263 + } 264 + 265 + hdmi_present_sense(codec, pin_nid, &spec->sink_eld[spec->num_pins]); 266 + 267 + spec->pin[spec->num_pins] = pin_nid; 268 + spec->num_pins++; 269 + 270 + /* 271 + * It is assumed that converter nodes come first in the node list and 272 + * hence have been registered and usable now. 273 + */ 274 + return intel_hdmi_read_pin_conn(codec, pin_nid); 275 + } 276 + 277 + static int intel_hdmi_add_cvt(struct hda_codec *codec, hda_nid_t nid) 278 + { 279 + struct intel_hdmi_spec *spec = codec->spec; 280 + 281 + if (spec->num_cvts >= INTEL_HDMI_CVTS) { 282 + snd_printk(KERN_WARNING 283 + "HDMI: no space for converter %d \n", nid); 284 + return -EINVAL; 285 + } 286 + 287 + spec->cvt[spec->num_cvts] = nid; 288 + spec->num_cvts++; 289 + 290 + return 0; 291 + } 292 + 293 + static int intel_hdmi_parse_codec(struct hda_codec *codec) 294 + { 295 + hda_nid_t nid; 296 + int i, nodes; 297 + 298 + nodes = snd_hda_get_sub_nodes(codec, codec->afg, &nid); 299 + if (!nid || nodes < 0) { 300 + snd_printk(KERN_WARNING "HDMI: failed to get afg sub nodes\n"); 301 + return -EINVAL; 302 + } 303 + 304 + for (i = 0; i < nodes; i++, nid++) { 305 + unsigned int caps; 306 + unsigned int type; 307 + 308 + caps = snd_hda_param_read(codec, nid, AC_PAR_AUDIO_WIDGET_CAP); 309 + type = get_wcaps_type(caps); 310 + 311 + if (!(caps & AC_WCAP_DIGITAL)) 312 + continue; 313 + 314 + switch (type) { 315 + case AC_WID_AUD_OUT: 316 + if (intel_hdmi_add_cvt(codec, nid) < 0) 317 + return -EINVAL; 318 + break; 319 + case AC_WID_PIN: 320 + caps = snd_hda_param_read(codec, nid, AC_PAR_PIN_CAP); 321 + if (!(caps & AC_PINCAP_HDMI)) 322 + continue; 323 + if (intel_hdmi_add_pin(codec, nid) < 0) 324 + return -EINVAL; 325 + break; 326 + } 327 + } 328 + 329 + return 0; 330 + } 331 + 213 332 /* 214 333 * HDMI routines 215 334 */ 216 335 217 336 #ifdef BE_PARANOID 218 - static void hdmi_get_dip_index(struct hda_codec *codec, hda_nid_t nid, 337 + static void hdmi_get_dip_index(struct hda_codec *codec, hda_nid_t pin_nid, 219 338 int *packet_index, int *byte_index) 220 339 { 221 340 int val; 222 341 223 - val = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_HDMI_DIP_INDEX, 0); 342 + val = snd_hda_codec_read(codec, pin_nid, 0, 343 + AC_VERB_GET_HDMI_DIP_INDEX, 0); 224 344 225 345 *packet_index = val >> 5; 226 346 *byte_index = val & 0x1f; 227 347 } 228 348 #endif 229 349 230 - static void hdmi_set_dip_index(struct hda_codec *codec, hda_nid_t nid, 350 + static void hdmi_set_dip_index(struct hda_codec *codec, hda_nid_t pin_nid, 231 351 int packet_index, int byte_index) 232 352 { 233 353 int val; 234 354 235 355 val = (packet_index << 5) | (byte_index & 0x1f); 236 356 237 - snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_HDMI_DIP_INDEX, val); 357 + snd_hda_codec_write(codec, pin_nid, 0, AC_VERB_SET_HDMI_DIP_INDEX, val); 238 358 } 239 359 240 - static void hdmi_write_dip_byte(struct hda_codec *codec, hda_nid_t nid, 360 + static void hdmi_write_dip_byte(struct hda_codec *codec, hda_nid_t pin_nid, 241 361 unsigned char val) 242 362 { 243 - snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_HDMI_DIP_DATA, val); 363 + snd_hda_codec_write(codec, pin_nid, 0, AC_VERB_SET_HDMI_DIP_DATA, val); 244 364 } 245 365 246 - static void hdmi_enable_output(struct hda_codec *codec) 366 + static void hdmi_enable_output(struct hda_codec *codec, hda_nid_t pin_nid) 247 367 { 248 368 /* Unmute */ 249 369 if (get_wcaps(codec, pin_nid) & AC_WCAP_OUT_AMP) ··· 403 231 /* 404 232 * Enable Audio InfoFrame Transmission 405 233 */ 406 - static void hdmi_start_infoframe_trans(struct hda_codec *codec) 234 + static void hdmi_start_infoframe_trans(struct hda_codec *codec, 235 + hda_nid_t pin_nid) 407 236 { 408 237 hdmi_set_dip_index(codec, pin_nid, 0x0, 0x0); 409 238 snd_hda_codec_write(codec, pin_nid, 0, AC_VERB_SET_HDMI_DIP_XMIT, ··· 414 241 /* 415 242 * Disable Audio InfoFrame Transmission 416 243 */ 417 - static void hdmi_stop_infoframe_trans(struct hda_codec *codec) 244 + static void hdmi_stop_infoframe_trans(struct hda_codec *codec, 245 + hda_nid_t pin_nid) 418 246 { 419 247 hdmi_set_dip_index(codec, pin_nid, 0x0, 0x0); 420 248 snd_hda_codec_write(codec, pin_nid, 0, AC_VERB_SET_HDMI_DIP_XMIT, 421 249 AC_DIPXMIT_DISABLE); 422 250 } 423 251 424 - static int hdmi_get_channel_count(struct hda_codec *codec) 252 + static int hdmi_get_channel_count(struct hda_codec *codec, hda_nid_t nid) 425 253 { 426 - return 1 + snd_hda_codec_read(codec, cvt_nid, 0, 254 + return 1 + snd_hda_codec_read(codec, nid, 0, 427 255 AC_VERB_GET_CVT_CHAN_COUNT, 0); 428 256 } 429 257 430 - static void hdmi_set_channel_count(struct hda_codec *codec, int chs) 258 + static void hdmi_set_channel_count(struct hda_codec *codec, 259 + hda_nid_t nid, int chs) 431 260 { 432 - snd_hda_codec_write(codec, cvt_nid, 0, 433 - AC_VERB_SET_CVT_CHAN_COUNT, chs - 1); 434 - 435 - if (chs != hdmi_get_channel_count(codec)) 436 - snd_printd(KERN_INFO "HDMI channel count: expect %d, get %d\n", 437 - chs, hdmi_get_channel_count(codec)); 261 + if (chs != hdmi_get_channel_count(codec, nid)) 262 + snd_hda_codec_write(codec, nid, 0, 263 + AC_VERB_SET_CVT_CHAN_COUNT, chs - 1); 438 264 } 439 265 440 - static void hdmi_debug_channel_mapping(struct hda_codec *codec) 266 + static void hdmi_debug_channel_mapping(struct hda_codec *codec, hda_nid_t nid) 441 267 { 442 268 #ifdef CONFIG_SND_DEBUG_VERBOSE 443 269 int i; 444 270 int slot; 445 271 446 272 for (i = 0; i < 8; i++) { 447 - slot = snd_hda_codec_read(codec, cvt_nid, 0, 273 + slot = snd_hda_codec_read(codec, nid, 0, 448 274 AC_VERB_GET_HDMI_CHAN_SLOT, i); 449 275 printk(KERN_DEBUG "HDMI: ASP channel %d => slot %d\n", 450 - slot >> 4, slot & 0x7); 276 + slot >> 4, slot & 0xf); 451 277 } 452 278 #endif 453 - } 454 - 455 - static void hdmi_parse_eld(struct hda_codec *codec) 456 - { 457 - struct intel_hdmi_spec *spec = codec->spec; 458 - struct hdmi_eld *eld = &spec->sink_eld; 459 - 460 - if (!snd_hdmi_get_eld(eld, codec, pin_nid)) 461 - snd_hdmi_show_eld(eld); 462 279 } 463 280 464 281 ··· 456 293 * Audio InfoFrame routines 457 294 */ 458 295 459 - static void hdmi_debug_dip_size(struct hda_codec *codec) 296 + static void hdmi_debug_dip_size(struct hda_codec *codec, hda_nid_t pin_nid) 460 297 { 461 298 #ifdef CONFIG_SND_DEBUG_VERBOSE 462 299 int i; ··· 473 310 #endif 474 311 } 475 312 476 - static void hdmi_clear_dip_buffers(struct hda_codec *codec) 313 + static void hdmi_clear_dip_buffers(struct hda_codec *codec, hda_nid_t pin_nid) 477 314 { 478 315 #ifdef BE_PARANOID 479 316 int i, j; ··· 502 339 #endif 503 340 } 504 341 505 - static void hdmi_fill_audio_infoframe(struct hda_codec *codec, 506 - struct hdmi_audio_infoframe *ai) 342 + static void hdmi_checksum_audio_infoframe(struct hdmi_audio_infoframe *ai) 507 343 { 508 - u8 *params = (u8 *)ai; 344 + u8 *bytes = (u8 *)ai; 509 345 u8 sum = 0; 510 346 int i; 511 347 512 - hdmi_debug_dip_size(codec); 513 - hdmi_clear_dip_buffers(codec); /* be paranoid */ 348 + ai->checksum = 0; 514 349 515 - for (i = 0; i < sizeof(ai); i++) 516 - sum += params[i]; 350 + for (i = 0; i < sizeof(*ai); i++) 351 + sum += bytes[i]; 352 + 517 353 ai->checksum = - sum; 354 + } 355 + 356 + static void hdmi_fill_audio_infoframe(struct hda_codec *codec, 357 + hda_nid_t pin_nid, 358 + struct hdmi_audio_infoframe *ai) 359 + { 360 + u8 *bytes = (u8 *)ai; 361 + int i; 362 + 363 + hdmi_debug_dip_size(codec, pin_nid); 364 + hdmi_clear_dip_buffers(codec, pin_nid); /* be paranoid */ 365 + 366 + hdmi_checksum_audio_infoframe(ai); 518 367 519 368 hdmi_set_dip_index(codec, pin_nid, 0x0, 0x0); 520 - for (i = 0; i < sizeof(ai); i++) 521 - hdmi_write_dip_byte(codec, pin_nid, params[i]); 369 + for (i = 0; i < sizeof(*ai); i++) 370 + hdmi_write_dip_byte(codec, pin_nid, bytes[i]); 522 371 } 523 372 524 373 /* ··· 561 386 * 562 387 * TODO: it could select the wrong CA from multiple candidates. 563 388 */ 564 - static int hdmi_setup_channel_allocation(struct hda_codec *codec, 389 + static int hdmi_setup_channel_allocation(struct hda_codec *codec, hda_nid_t nid, 565 390 struct hdmi_audio_infoframe *ai) 566 391 { 567 392 struct intel_hdmi_spec *spec = codec->spec; 568 - struct hdmi_eld *eld = &spec->sink_eld; 393 + struct hdmi_eld *eld; 569 394 int i; 570 395 int spk_mask = 0; 571 396 int channels = 1 + (ai->CC02_CT47 & 0x7); ··· 576 401 */ 577 402 if (channels <= 2) 578 403 return 0; 404 + 405 + i = hda_node_index(spec->pin_cvt, nid); 406 + if (i < 0) 407 + return 0; 408 + eld = &spec->sink_eld[i]; 579 409 580 410 /* 581 411 * HDMI sink's ELD info cannot always be retrieved for now, e.g. ··· 619 439 return ai->CA; 620 440 } 621 441 622 - static void hdmi_setup_channel_mapping(struct hda_codec *codec, 623 - struct hdmi_audio_infoframe *ai) 442 + static void hdmi_setup_channel_mapping(struct hda_codec *codec, hda_nid_t nid, 443 + struct hdmi_audio_infoframe *ai) 624 444 { 625 445 int i; 626 446 ··· 633 453 */ 634 454 635 455 for (i = 0; i < 8; i++) 636 - snd_hda_codec_write(codec, cvt_nid, 0, 456 + snd_hda_codec_write(codec, nid, 0, 637 457 AC_VERB_SET_HDMI_CHAN_SLOT, 638 458 (i << 4) | i); 639 459 640 - hdmi_debug_channel_mapping(codec); 460 + hdmi_debug_channel_mapping(codec, nid); 641 461 } 642 462 463 + static bool hdmi_infoframe_uptodate(struct hda_codec *codec, hda_nid_t pin_nid, 464 + struct hdmi_audio_infoframe *ai) 465 + { 466 + u8 *bytes = (u8 *)ai; 467 + u8 val; 468 + int i; 643 469 644 - static void hdmi_setup_audio_infoframe(struct hda_codec *codec, 470 + if (snd_hda_codec_read(codec, pin_nid, 0, AC_VERB_GET_HDMI_DIP_XMIT, 0) 471 + != AC_DIPXMIT_BEST) 472 + return false; 473 + 474 + hdmi_set_dip_index(codec, pin_nid, 0x0, 0x0); 475 + for (i = 0; i < sizeof(*ai); i++) { 476 + val = snd_hda_codec_read(codec, pin_nid, 0, 477 + AC_VERB_GET_HDMI_DIP_DATA, 0); 478 + if (val != bytes[i]) 479 + return false; 480 + } 481 + 482 + return true; 483 + } 484 + 485 + static void hdmi_setup_audio_infoframe(struct hda_codec *codec, hda_nid_t nid, 645 486 struct snd_pcm_substream *substream) 646 487 { 488 + struct intel_hdmi_spec *spec = codec->spec; 489 + hda_nid_t pin_nid; 490 + int i; 647 491 struct hdmi_audio_infoframe ai = { 648 492 .type = 0x84, 649 493 .ver = 0x01, ··· 675 471 .CC02_CT47 = substream->runtime->channels - 1, 676 472 }; 677 473 678 - hdmi_setup_channel_allocation(codec, &ai); 679 - hdmi_setup_channel_mapping(codec, &ai); 474 + hdmi_setup_channel_allocation(codec, nid, &ai); 475 + hdmi_setup_channel_mapping(codec, nid, &ai); 680 476 681 - hdmi_fill_audio_infoframe(codec, &ai); 682 - hdmi_start_infoframe_trans(codec); 477 + for (i = 0; i < spec->num_pins; i++) { 478 + if (spec->pin_cvt[i] != nid) 479 + continue; 480 + if (!spec->sink_eld[i].monitor_present) 481 + continue; 482 + 483 + pin_nid = spec->pin[i]; 484 + if (!hdmi_infoframe_uptodate(codec, pin_nid, &ai)) { 485 + hdmi_stop_infoframe_trans(codec, pin_nid); 486 + hdmi_fill_audio_infoframe(codec, pin_nid, &ai); 487 + hdmi_start_infoframe_trans(codec, pin_nid); 488 + } 489 + } 683 490 } 684 491 685 492 ··· 700 485 701 486 static void hdmi_intrinsic_event(struct hda_codec *codec, unsigned int res) 702 487 { 488 + struct intel_hdmi_spec *spec = codec->spec; 489 + int tag = res >> AC_UNSOL_RES_TAG_SHIFT; 703 490 int pind = !!(res & AC_UNSOL_RES_PD); 704 491 int eldv = !!(res & AC_UNSOL_RES_ELDV); 492 + int index; 705 493 706 494 printk(KERN_INFO 707 - "HDMI hot plug event: Presence_Detect=%d ELD_Valid=%d\n", 708 - pind, eldv); 495 + "HDMI hot plug event: Pin=%d Presence_Detect=%d ELD_Valid=%d\n", 496 + tag, pind, eldv); 497 + 498 + index = hda_node_index(spec->pin, tag); 499 + if (index < 0) 500 + return; 501 + 502 + spec->sink_eld[index].monitor_present = pind; 503 + spec->sink_eld[index].eld_valid = eldv; 709 504 710 505 if (pind && eldv) { 711 - hdmi_parse_eld(codec); 506 + hdmi_get_show_eld(codec, spec->pin[index], &spec->sink_eld[index]); 712 507 /* TODO: do real things about ELD */ 713 508 } 714 509 } 715 510 716 511 static void hdmi_non_intrinsic_event(struct hda_codec *codec, unsigned int res) 717 512 { 513 + int tag = res >> AC_UNSOL_RES_TAG_SHIFT; 718 514 int subtag = (res & AC_UNSOL_RES_SUBTAG) >> AC_UNSOL_RES_SUBTAG_SHIFT; 719 515 int cp_state = !!(res & AC_UNSOL_RES_CP_STATE); 720 516 int cp_ready = !!(res & AC_UNSOL_RES_CP_READY); 721 517 722 518 printk(KERN_INFO 723 - "HDMI content protection event: SUBTAG=0x%x CP_STATE=%d CP_READY=%d\n", 519 + "HDMI CP event: PIN=%d SUBTAG=0x%x CP_STATE=%d CP_READY=%d\n", 520 + tag, 724 521 subtag, 725 522 cp_state, 726 523 cp_ready); ··· 747 520 748 521 static void intel_hdmi_unsol_event(struct hda_codec *codec, unsigned int res) 749 522 { 523 + struct intel_hdmi_spec *spec = codec->spec; 750 524 int tag = res >> AC_UNSOL_RES_TAG_SHIFT; 751 525 int subtag = (res & AC_UNSOL_RES_SUBTAG) >> AC_UNSOL_RES_SUBTAG_SHIFT; 752 526 753 - if (tag != INTEL_HDMI_EVENT_TAG) { 527 + if (hda_node_index(spec->pin, tag) < 0) { 754 528 snd_printd(KERN_INFO "Unexpected HDMI event tag 0x%x\n", tag); 755 529 return; 756 530 } ··· 766 538 * Callbacks 767 539 */ 768 540 769 - static int intel_hdmi_playback_pcm_open(struct hda_pcm_stream *hinfo, 770 - struct hda_codec *codec, 771 - struct snd_pcm_substream *substream) 541 + static void hdmi_setup_stream(struct hda_codec *codec, hda_nid_t nid, 542 + u32 stream_tag, int format) 772 543 { 773 - struct intel_hdmi_spec *spec = codec->spec; 544 + int tag; 545 + int fmt; 774 546 775 - return snd_hda_multi_out_dig_open(codec, &spec->multiout); 776 - } 547 + tag = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONV, 0) >> 4; 548 + fmt = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_STREAM_FORMAT, 0); 777 549 778 - static int intel_hdmi_playback_pcm_close(struct hda_pcm_stream *hinfo, 779 - struct hda_codec *codec, 780 - struct snd_pcm_substream *substream) 781 - { 782 - struct intel_hdmi_spec *spec = codec->spec; 550 + snd_printdd("hdmi_setup_stream: " 551 + "NID=0x%x, %sstream=0x%x, %sformat=0x%x\n", 552 + nid, 553 + tag == stream_tag ? "" : "new-", 554 + stream_tag, 555 + fmt == format ? "" : "new-", 556 + format); 783 557 784 - hdmi_stop_infoframe_trans(codec); 785 - 786 - return snd_hda_multi_out_dig_close(codec, &spec->multiout); 558 + if (tag != stream_tag) 559 + snd_hda_codec_write(codec, nid, 0, 560 + AC_VERB_SET_CHANNEL_STREAMID, stream_tag << 4); 561 + if (fmt != format) 562 + snd_hda_codec_write(codec, nid, 0, 563 + AC_VERB_SET_STREAM_FORMAT, format); 787 564 } 788 565 789 566 static int intel_hdmi_playback_pcm_prepare(struct hda_pcm_stream *hinfo, ··· 797 564 unsigned int format, 798 565 struct snd_pcm_substream *substream) 799 566 { 800 - struct intel_hdmi_spec *spec = codec->spec; 567 + hdmi_set_channel_count(codec, hinfo->nid, 568 + substream->runtime->channels); 801 569 802 - snd_hda_multi_out_dig_prepare(codec, &spec->multiout, stream_tag, 803 - format, substream); 570 + hdmi_setup_audio_infoframe(codec, hinfo->nid, substream); 804 571 805 - hdmi_set_channel_count(codec, substream->runtime->channels); 572 + hdmi_setup_stream(codec, hinfo->nid, stream_tag, format); 573 + return 0; 574 + } 806 575 807 - hdmi_setup_audio_infoframe(codec, substream); 808 - 576 + static int intel_hdmi_playback_pcm_cleanup(struct hda_pcm_stream *hinfo, 577 + struct hda_codec *codec, 578 + struct snd_pcm_substream *substream) 579 + { 809 580 return 0; 810 581 } 811 582 812 583 static struct hda_pcm_stream intel_hdmi_pcm_playback = { 813 584 .substreams = 1, 814 585 .channels_min = 2, 815 - .channels_max = 8, 816 586 .ops = { 817 - .open = intel_hdmi_playback_pcm_open, 818 - .close = intel_hdmi_playback_pcm_close, 819 - .prepare = intel_hdmi_playback_pcm_prepare 587 + .prepare = intel_hdmi_playback_pcm_prepare, 588 + .cleanup = intel_hdmi_playback_pcm_cleanup, 820 589 }, 821 590 }; 822 591 823 592 static int intel_hdmi_build_pcms(struct hda_codec *codec) 824 593 { 825 594 struct intel_hdmi_spec *spec = codec->spec; 826 - struct hda_pcm *info = &spec->pcm_rec; 595 + struct hda_pcm *info = spec->pcm_rec; 596 + int i; 827 597 828 - codec->num_pcms = 1; 598 + codec->num_pcms = spec->num_cvts; 829 599 codec->pcm_info = info; 830 600 831 - /* NID to query formats and rates and setup streams */ 832 - intel_hdmi_pcm_playback.nid = cvt_nid; 601 + for (i = 0; i < codec->num_pcms; i++, info++) { 602 + unsigned int chans; 833 603 834 - info->name = "INTEL HDMI"; 835 - info->pcm_type = HDA_PCM_TYPE_HDMI; 836 - info->stream[SNDRV_PCM_STREAM_PLAYBACK] = intel_hdmi_pcm_playback; 604 + chans = get_wcaps(codec, spec->cvt[i]); 605 + chans = get_wcaps_channels(chans); 606 + 607 + info->name = intel_hdmi_pcm_names[i]; 608 + info->pcm_type = HDA_PCM_TYPE_HDMI; 609 + info->stream[SNDRV_PCM_STREAM_PLAYBACK] = 610 + intel_hdmi_pcm_playback; 611 + info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->cvt[i]; 612 + info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = chans; 613 + } 837 614 838 615 return 0; 839 616 } ··· 852 609 { 853 610 struct intel_hdmi_spec *spec = codec->spec; 854 611 int err; 612 + int i; 855 613 856 - err = snd_hda_create_spdif_out_ctls(codec, spec->multiout.dig_out_nid); 857 - if (err < 0) 858 - return err; 614 + for (i = 0; i < codec->num_pcms; i++) { 615 + err = snd_hda_create_spdif_out_ctls(codec, spec->cvt[i]); 616 + if (err < 0) 617 + return err; 618 + } 859 619 860 620 return 0; 861 621 } 862 622 863 623 static int intel_hdmi_init(struct hda_codec *codec) 864 624 { 865 - hdmi_enable_output(codec); 625 + struct intel_hdmi_spec *spec = codec->spec; 626 + int i; 866 627 867 - snd_hda_codec_write(codec, pin_nid, 0, 868 - AC_VERB_SET_UNSOLICITED_ENABLE, 869 - AC_USRSP_EN | INTEL_HDMI_EVENT_TAG); 628 + for (i = 0; spec->pin[i]; i++) { 629 + hdmi_enable_output(codec, spec->pin[i]); 630 + snd_hda_codec_write(codec, spec->pin[i], 0, 631 + AC_VERB_SET_UNSOLICITED_ENABLE, 632 + AC_USRSP_EN | spec->pin[i]); 633 + } 870 634 return 0; 871 635 } 872 636 873 637 static void intel_hdmi_free(struct hda_codec *codec) 874 638 { 875 639 struct intel_hdmi_spec *spec = codec->spec; 640 + int i; 876 641 877 - snd_hda_eld_proc_free(codec, &spec->sink_eld); 642 + for (i = 0; i < spec->num_pins; i++) 643 + snd_hda_eld_proc_free(codec, &spec->sink_eld[i]); 644 + 878 645 kfree(spec); 879 646 } 880 647 ··· 896 643 .unsol_event = intel_hdmi_unsol_event, 897 644 }; 898 645 899 - static int do_patch_intel_hdmi(struct hda_codec *codec) 646 + static int patch_intel_hdmi(struct hda_codec *codec) 900 647 { 901 648 struct intel_hdmi_spec *spec; 649 + int i; 902 650 903 651 spec = kzalloc(sizeof(*spec), GFP_KERNEL); 904 652 if (spec == NULL) 905 653 return -ENOMEM; 906 654 907 - spec->multiout.num_dacs = 0; /* no analog */ 908 - spec->multiout.max_channels = 8; 909 - spec->multiout.dig_out_nid = cvt_nid; 910 - 911 655 codec->spec = spec; 656 + if (intel_hdmi_parse_codec(codec) < 0) { 657 + codec->spec = NULL; 658 + kfree(spec); 659 + return -EINVAL; 660 + } 912 661 codec->patch_ops = intel_hdmi_patch_ops; 913 662 914 - snd_hda_eld_proc_new(codec, &spec->sink_eld); 663 + for (i = 0; i < spec->num_pins; i++) 664 + snd_hda_eld_proc_new(codec, &spec->sink_eld[i], i); 915 665 916 666 init_channel_allocations(); 917 667 918 668 return 0; 919 - } 920 - 921 - static int patch_intel_hdmi(struct hda_codec *codec) 922 - { 923 - cvt_nid = 0x02; 924 - pin_nid = 0x03; 925 - return do_patch_intel_hdmi(codec); 926 - } 927 - 928 - static int patch_intel_hdmi_ibexpeak(struct hda_codec *codec) 929 - { 930 - cvt_nid = 0x02; 931 - pin_nid = 0x04; 932 - return do_patch_intel_hdmi(codec); 933 669 } 934 670 935 671 static struct hda_codec_preset snd_hda_preset_intelhdmi[] = { ··· 927 685 { .id = 0x80862802, .name = "G45 DEVCTG", .patch = patch_intel_hdmi }, 928 686 { .id = 0x80862803, .name = "G45 DEVELK", .patch = patch_intel_hdmi }, 929 687 { .id = 0x80862804, .name = "G45 DEVIBX", .patch = patch_intel_hdmi }, 930 - { .id = 0x80860054, .name = "Q57 DEVIBX", .patch = patch_intel_hdmi_ibexpeak }, 688 + { .id = 0x80860054, .name = "Q57 DEVIBX", .patch = patch_intel_hdmi }, 931 689 { .id = 0x10951392, .name = "SiI1392 HDMI", .patch = patch_intel_hdmi }, 932 690 {} /* terminator */ 933 691 };
+193 -243
sound/pci/hda/patch_realtek.c
··· 961 961 static void alc_automute_pin(struct hda_codec *codec) 962 962 { 963 963 struct alc_spec *spec = codec->spec; 964 - unsigned int present, pincap; 965 964 unsigned int nid = spec->autocfg.hp_pins[0]; 966 965 int i; 967 966 968 967 if (!nid) 969 968 return; 970 - pincap = snd_hda_query_pin_caps(codec, nid); 971 - if (pincap & AC_PINCAP_TRIG_REQ) /* need trigger? */ 972 - snd_hda_codec_read(codec, nid, 0, AC_VERB_SET_PIN_SENSE, 0); 973 - present = snd_hda_codec_read(codec, nid, 0, 974 - AC_VERB_GET_PIN_SENSE, 0); 975 - spec->jack_present = (present & AC_PINSENSE_PRESENCE) != 0; 969 + spec->jack_present = snd_hda_jack_detect(codec, nid); 976 970 for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) { 977 971 nid = spec->autocfg.speaker_pins[i]; 978 972 if (!nid) ··· 1006 1012 1007 1013 cap_nid = spec->capsrc_nids ? spec->capsrc_nids[0] : spec->adc_nids[0]; 1008 1014 1009 - present = snd_hda_codec_read(codec, spec->ext_mic.pin, 0, 1010 - AC_VERB_GET_PIN_SENSE, 0); 1011 - present &= AC_PINSENSE_PRESENCE; 1015 + present = snd_hda_jack_detect(codec, spec->ext_mic.pin); 1012 1016 if (present) { 1013 1017 alive = &spec->ext_mic; 1014 1018 dead = &spec->int_mic; ··· 1394 1402 add_verb(codec->spec, fix->verbs); 1395 1403 } 1396 1404 1405 + static int alc_read_coef_idx(struct hda_codec *codec, 1406 + unsigned int coef_idx) 1407 + { 1408 + unsigned int val; 1409 + snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 1410 + coef_idx); 1411 + val = snd_hda_codec_read(codec, 0x20, 0, 1412 + AC_VERB_GET_PROC_COEF, 0); 1413 + return val; 1414 + } 1415 + 1397 1416 /* 1398 1417 * ALC888 1399 1418 */ ··· 1516 1513 static void alc_automute_amp(struct hda_codec *codec) 1517 1514 { 1518 1515 struct alc_spec *spec = codec->spec; 1519 - unsigned int val, mute, pincap; 1516 + unsigned int mute; 1520 1517 hda_nid_t nid; 1521 1518 int i; 1522 1519 ··· 1525 1522 nid = spec->autocfg.hp_pins[i]; 1526 1523 if (!nid) 1527 1524 break; 1528 - pincap = snd_hda_query_pin_caps(codec, nid); 1529 - if (pincap & AC_PINCAP_TRIG_REQ) /* need trigger? */ 1530 - snd_hda_codec_read(codec, nid, 0, 1531 - AC_VERB_SET_PIN_SENSE, 0); 1532 - val = snd_hda_codec_read(codec, nid, 0, 1533 - AC_VERB_GET_PIN_SENSE, 0); 1534 - if (val & AC_PINSENSE_PRESENCE) { 1525 + if (snd_hda_jack_detect(codec, nid)) { 1535 1526 spec->jack_present = 1; 1536 1527 break; 1537 1528 } ··· 1783 1786 1784 1787 spec->autocfg.hp_pins[0] = 0x15; 1785 1788 spec->autocfg.speaker_pins[0] = 0x14; 1789 + spec->autocfg.speaker_pins[1] = 0x16; 1790 + spec->autocfg.speaker_pins[2] = 0x17; 1786 1791 } 1787 1792 1788 1793 static void alc888_acer_aspire_6530g_setup(struct hda_codec *codec) ··· 2409 2410 2410 2411 static void alc_free_kctls(struct hda_codec *codec); 2411 2412 2413 + #ifdef CONFIG_SND_HDA_INPUT_BEEP 2412 2414 /* additional beep mixers; the actual parameters are overwritten at build */ 2413 2415 static struct snd_kcontrol_new alc_beep_mixer[] = { 2414 2416 HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT), 2415 - HDA_CODEC_MUTE("Beep Playback Switch", 0, 0, HDA_INPUT), 2417 + HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT), 2416 2418 { } /* end */ 2417 2419 }; 2420 + #endif 2418 2421 2419 2422 static int alc_build_controls(struct hda_codec *codec) 2420 2423 { ··· 2453 2452 return err; 2454 2453 } 2455 2454 2455 + #ifdef CONFIG_SND_HDA_INPUT_BEEP 2456 2456 /* create beep controls if needed */ 2457 2457 if (spec->beep_amp) { 2458 2458 struct snd_kcontrol_new *knew; ··· 2463 2461 if (!kctl) 2464 2462 return -ENOMEM; 2465 2463 kctl->private_value = spec->beep_amp; 2466 - err = snd_hda_ctl_add(codec, kctl); 2464 + err = snd_hda_ctl_add(codec, 2465 + get_amp_nid_(spec->beep_amp), kctl); 2467 2466 if (err < 0) 2468 2467 return err; 2469 2468 } 2470 2469 } 2470 + #endif 2471 2471 2472 2472 /* if we have no master control, let's create it */ 2473 2473 if (!spec->no_analog && ··· 2783 2779 unsigned int present; 2784 2780 unsigned char bits; 2785 2781 2786 - present = snd_hda_codec_read(codec, 0x18, 0, 2787 - AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 2782 + present = snd_hda_jack_detect(codec, 0x18); 2788 2783 bits = present ? HDA_AMP_MUTE : 0; 2789 2784 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits); 2790 2785 } ··· 3483 3480 snprintf(spec->stream_name_analog, sizeof(spec->stream_name_analog), 3484 3481 "%s Analog", codec->chip_name); 3485 3482 info->name = spec->stream_name_analog; 3486 - 3483 + 3487 3484 if (spec->stream_analog_playback) { 3488 3485 if (snd_BUG_ON(!spec->multiout.dac_nids)) 3489 3486 return -EINVAL; ··· 4325 4322 knew->name = kstrdup(name, GFP_KERNEL); 4326 4323 if (!knew->name) 4327 4324 return -ENOMEM; 4325 + if (get_amp_nid_(val)) 4326 + knew->subdevice = HDA_SUBDEV_NID_FLAG | get_amp_nid_(val); 4328 4327 knew->private_value = val; 4329 4328 return 0; 4330 4329 } 4330 + 4331 + static int add_control_with_pfx(struct alc_spec *spec, int type, 4332 + const char *pfx, const char *dir, 4333 + const char *sfx, unsigned long val) 4334 + { 4335 + char name[32]; 4336 + snprintf(name, sizeof(name), "%s %s %s", pfx, dir, sfx); 4337 + return add_control(spec, type, name, val); 4338 + } 4339 + 4340 + #define add_pb_vol_ctrl(spec, type, pfx, val) \ 4341 + add_control_with_pfx(spec, type, pfx, "Playback", "Volume", val) 4342 + #define add_pb_sw_ctrl(spec, type, pfx, val) \ 4343 + add_control_with_pfx(spec, type, pfx, "Playback", "Switch", val) 4331 4344 4332 4345 #define alc880_is_fixed_pin(nid) ((nid) >= 0x14 && (nid) <= 0x17) 4333 4346 #define alc880_fixed_pin_idx(nid) ((nid) - 0x14) ··· 4398 4379 static int alc880_auto_create_multi_out_ctls(struct alc_spec *spec, 4399 4380 const struct auto_pin_cfg *cfg) 4400 4381 { 4401 - char name[32]; 4402 4382 static const char *chname[4] = { 4403 4383 "Front", "Surround", NULL /*CLFE*/, "Side" 4404 4384 }; ··· 4410 4392 nid = alc880_idx_to_mixer(alc880_dac_to_idx(spec->multiout.dac_nids[i])); 4411 4393 if (i == 2) { 4412 4394 /* Center/LFE */ 4413 - err = add_control(spec, ALC_CTL_WIDGET_VOL, 4414 - "Center Playback Volume", 4395 + err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, 4396 + "Center", 4415 4397 HDA_COMPOSE_AMP_VAL(nid, 1, 0, 4416 4398 HDA_OUTPUT)); 4417 4399 if (err < 0) 4418 4400 return err; 4419 - err = add_control(spec, ALC_CTL_WIDGET_VOL, 4420 - "LFE Playback Volume", 4401 + err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, 4402 + "LFE", 4421 4403 HDA_COMPOSE_AMP_VAL(nid, 2, 0, 4422 4404 HDA_OUTPUT)); 4423 4405 if (err < 0) 4424 4406 return err; 4425 - err = add_control(spec, ALC_CTL_BIND_MUTE, 4426 - "Center Playback Switch", 4407 + err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, 4408 + "Center", 4427 4409 HDA_COMPOSE_AMP_VAL(nid, 1, 2, 4428 4410 HDA_INPUT)); 4429 4411 if (err < 0) 4430 4412 return err; 4431 - err = add_control(spec, ALC_CTL_BIND_MUTE, 4432 - "LFE Playback Switch", 4413 + err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, 4414 + "LFE", 4433 4415 HDA_COMPOSE_AMP_VAL(nid, 2, 2, 4434 4416 HDA_INPUT)); 4435 4417 if (err < 0) ··· 4441 4423 pfx = "Speaker"; 4442 4424 else 4443 4425 pfx = chname[i]; 4444 - sprintf(name, "%s Playback Volume", pfx); 4445 - err = add_control(spec, ALC_CTL_WIDGET_VOL, name, 4426 + err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, 4446 4427 HDA_COMPOSE_AMP_VAL(nid, 3, 0, 4447 4428 HDA_OUTPUT)); 4448 4429 if (err < 0) 4449 4430 return err; 4450 - sprintf(name, "%s Playback Switch", pfx); 4451 - err = add_control(spec, ALC_CTL_BIND_MUTE, name, 4431 + err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx, 4452 4432 HDA_COMPOSE_AMP_VAL(nid, 3, 2, 4453 4433 HDA_INPUT)); 4454 4434 if (err < 0) ··· 4462 4446 { 4463 4447 hda_nid_t nid; 4464 4448 int err; 4465 - char name[32]; 4466 4449 4467 4450 if (!pin) 4468 4451 return 0; ··· 4475 4460 spec->multiout.extra_out_nid[0] = nid; 4476 4461 /* control HP volume/switch on the output mixer amp */ 4477 4462 nid = alc880_idx_to_mixer(alc880_fixed_pin_idx(pin)); 4478 - sprintf(name, "%s Playback Volume", pfx); 4479 - err = add_control(spec, ALC_CTL_WIDGET_VOL, name, 4463 + err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, 4480 4464 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT)); 4481 4465 if (err < 0) 4482 4466 return err; 4483 - sprintf(name, "%s Playback Switch", pfx); 4484 - err = add_control(spec, ALC_CTL_BIND_MUTE, name, 4467 + err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx, 4485 4468 HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT)); 4486 4469 if (err < 0) 4487 4470 return err; 4488 4471 } else if (alc880_is_multi_pin(pin)) { 4489 4472 /* set manual connection */ 4490 4473 /* we have only a switch on HP-out PIN */ 4491 - sprintf(name, "%s Playback Switch", pfx); 4492 - err = add_control(spec, ALC_CTL_WIDGET_MUTE, name, 4474 + err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, 4493 4475 HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT)); 4494 4476 if (err < 0) 4495 4477 return err; ··· 4499 4487 const char *ctlname, 4500 4488 int idx, hda_nid_t mix_nid) 4501 4489 { 4502 - char name[32]; 4503 4490 int err; 4504 4491 4505 - sprintf(name, "%s Playback Volume", ctlname); 4506 - err = add_control(spec, ALC_CTL_WIDGET_VOL, name, 4492 + err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname, 4507 4493 HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT)); 4508 4494 if (err < 0) 4509 4495 return err; 4510 - sprintf(name, "%s Playback Switch", ctlname); 4511 - err = add_control(spec, ALC_CTL_WIDGET_MUTE, name, 4496 + err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname, 4512 4497 HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT)); 4513 4498 if (err < 0) 4514 4499 return err; ··· 4782 4773 } 4783 4774 } 4784 4775 4776 + #ifdef CONFIG_SND_HDA_INPUT_BEEP 4785 4777 #define set_beep_amp(spec, nid, idx, dir) \ 4786 4778 ((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir)) 4779 + #else 4780 + #define set_beep_amp(spec, nid, idx, dir) /* NOP */ 4781 + #endif 4787 4782 4788 4783 /* 4789 4784 * OK, here we have finally the patch for ALC880 ··· 5100 5087 static void alc260_hp_automute(struct hda_codec *codec) 5101 5088 { 5102 5089 struct alc_spec *spec = codec->spec; 5103 - unsigned int present; 5104 5090 5105 - present = snd_hda_codec_read(codec, 0x10, 0, 5106 - AC_VERB_GET_PIN_SENSE, 0); 5107 - spec->jack_present = (present & AC_PINSENSE_PRESENCE) != 0; 5091 + spec->jack_present = snd_hda_jack_detect(codec, 0x10); 5108 5092 alc260_hp_master_update(codec, 0x0f, 0x10, 0x11); 5109 5093 } 5110 5094 ··· 5166 5156 static void alc260_hp_3013_automute(struct hda_codec *codec) 5167 5157 { 5168 5158 struct alc_spec *spec = codec->spec; 5169 - unsigned int present; 5170 5159 5171 - present = snd_hda_codec_read(codec, 0x15, 0, 5172 - AC_VERB_GET_PIN_SENSE, 0); 5173 - spec->jack_present = (present & AC_PINSENSE_PRESENCE) != 0; 5160 + spec->jack_present = snd_hda_jack_detect(codec, 0x15); 5174 5161 alc260_hp_master_update(codec, 0x15, 0x10, 0x11); 5175 5162 } 5176 5163 ··· 5180 5173 5181 5174 static void alc260_hp_3012_automute(struct hda_codec *codec) 5182 5175 { 5183 - unsigned int present, bits; 5176 + unsigned int bits = snd_hda_jack_detect(codec, 0x10) ? 0 : PIN_OUT; 5184 5177 5185 - present = snd_hda_codec_read(codec, 0x10, 0, 5186 - AC_VERB_GET_PIN_SENSE, 0) & AC_PINSENSE_PRESENCE; 5187 - 5188 - bits = present ? 0 : PIN_OUT; 5189 5178 snd_hda_codec_write(codec, 0x0f, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, 5190 5179 bits); 5191 5180 snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, ··· 5751 5748 unsigned int present; 5752 5749 5753 5750 /* speaker --> GPIO Data 0, hp or spdif --> GPIO data 1 */ 5754 - present = snd_hda_codec_read(codec, 0x0f, 0, 5755 - AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 5751 + present = snd_hda_jack_detect(codec, 0x0f); 5756 5752 if (present) { 5757 5753 snd_hda_codec_write_cache(codec, 0x01, 0, 5758 5754 AC_VERB_SET_GPIO_DATA, 1); ··· 5991 5989 { 5992 5990 hda_nid_t nid_vol; 5993 5991 unsigned long vol_val, sw_val; 5994 - char name[32]; 5995 5992 int err; 5996 5993 5997 5994 if (nid >= 0x0f && nid < 0x11) { ··· 6010 6009 6011 6010 if (!(*vol_bits & (1 << nid_vol))) { 6012 6011 /* first control for the volume widget */ 6013 - snprintf(name, sizeof(name), "%s Playback Volume", pfx); 6014 - err = add_control(spec, ALC_CTL_WIDGET_VOL, name, vol_val); 6012 + err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, vol_val); 6015 6013 if (err < 0) 6016 6014 return err; 6017 6015 *vol_bits |= (1 << nid_vol); 6018 6016 } 6019 - snprintf(name, sizeof(name), "%s Playback Switch", pfx); 6020 - err = add_control(spec, ALC_CTL_WIDGET_MUTE, name, sw_val); 6017 + err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, sw_val); 6021 6018 if (err < 0) 6022 6019 return err; 6023 6020 return 1; ··· 8183 8184 /* 8184 8185 static void alc883_mitac_mic_automute(struct hda_codec *codec) 8185 8186 { 8186 - unsigned int present; 8187 - unsigned char bits; 8187 + unsigned char bits = snd_hda_jack_detect(codec, 0x18) ? HDA_AMP_MUTE : 0; 8188 8188 8189 - present = snd_hda_codec_read(codec, 0x18, 0, 8190 - AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 8191 - bits = present ? HDA_AMP_MUTE : 0; 8192 8189 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits); 8193 8190 } 8194 8191 */ ··· 8406 8411 /* toggle front-jack and RCA according to the hp-jack state */ 8407 8412 static void alc888_lenovo_ms7195_front_automute(struct hda_codec *codec) 8408 8413 { 8409 - unsigned int present; 8414 + unsigned int present = snd_hda_jack_detect(codec, 0x1b); 8410 8415 8411 - present = snd_hda_codec_read(codec, 0x1b, 0, 8412 - AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 8413 8416 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 8414 8417 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 8415 8418 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, ··· 8417 8424 /* toggle RCA according to the front-jack state */ 8418 8425 static void alc888_lenovo_ms7195_rca_automute(struct hda_codec *codec) 8419 8426 { 8420 - unsigned int present; 8427 + unsigned int present = snd_hda_jack_detect(codec, 0x14); 8421 8428 8422 - present = snd_hda_codec_read(codec, 0x14, 0, 8423 - AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 8424 8429 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 8425 8430 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 8426 8431 } ··· 8459 8468 { 8460 8469 unsigned int present; 8461 8470 8462 - present = snd_hda_codec_read(codec, 0x18, 0, 8463 - AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 8471 + present = snd_hda_jack_detect(codec, 0x18); 8464 8472 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, 8465 8473 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 8466 8474 } ··· 8510 8520 8511 8521 static void alc883_lenovo_101e_ispeaker_automute(struct hda_codec *codec) 8512 8522 { 8513 - unsigned int present; 8514 - unsigned char bits; 8523 + int bits = snd_hda_jack_detect(codec, 0x14) ? HDA_AMP_MUTE : 0; 8515 8524 8516 - present = snd_hda_codec_read(codec, 0x14, 0, AC_VERB_GET_PIN_SENSE, 0) 8517 - & AC_PINSENSE_PRESENCE; 8518 - bits = present ? HDA_AMP_MUTE : 0; 8519 8525 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 8520 8526 HDA_AMP_MUTE, bits); 8521 8527 } 8522 8528 8523 8529 static void alc883_lenovo_101e_all_automute(struct hda_codec *codec) 8524 8530 { 8525 - unsigned int present; 8526 - unsigned char bits; 8531 + int bits = snd_hda_jack_detect(codec, 0x1b) ? HDA_AMP_MUTE : 0; 8527 8532 8528 - present = snd_hda_codec_read(codec, 0x1b, 0, 8529 - AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 8530 - bits = present ? HDA_AMP_MUTE : 0; 8531 8533 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 8532 8534 HDA_AMP_MUTE, bits); 8533 8535 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, ··· 8670 8688 /* Mute only in 2ch or 4ch mode */ 8671 8689 if (snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_CONNECT_SEL, 0) 8672 8690 == 0x00) { 8673 - present = snd_hda_codec_read(codec, 0x15, 0, 8674 - AC_VERB_GET_PIN_SENSE, 0) & AC_PINSENSE_PRESENCE; 8691 + present = snd_hda_jack_detect(codec, 0x15); 8675 8692 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 8676 8693 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 8677 8694 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0, ··· 10013 10032 static void alc262_hp_bpc_automute(struct hda_codec *codec) 10014 10033 { 10015 10034 struct alc_spec *spec = codec->spec; 10016 - unsigned int presence; 10017 - presence = snd_hda_codec_read(codec, 0x1b, 0, 10018 - AC_VERB_GET_PIN_SENSE, 0); 10019 - spec->jack_present = !!(presence & AC_PINSENSE_PRESENCE); 10035 + 10036 + spec->jack_present = snd_hda_jack_detect(codec, 0x1b); 10020 10037 alc262_hp_master_update(codec); 10021 10038 } 10022 10039 ··· 10028 10049 static void alc262_hp_wildwest_automute(struct hda_codec *codec) 10029 10050 { 10030 10051 struct alc_spec *spec = codec->spec; 10031 - unsigned int presence; 10032 - presence = snd_hda_codec_read(codec, 0x15, 0, 10033 - AC_VERB_GET_PIN_SENSE, 0); 10034 - spec->jack_present = !!(presence & AC_PINSENSE_PRESENCE); 10052 + 10053 + spec->jack_present = snd_hda_jack_detect(codec, 0x15); 10035 10054 alc262_hp_master_update(codec); 10036 10055 } 10037 10056 ··· 10263 10286 { 10264 10287 struct alc_spec *spec = codec->spec; 10265 10288 hda_nid_t hp_nid = spec->autocfg.hp_pins[0]; 10266 - unsigned int present; 10267 10289 10268 - /* need to execute and sync at first */ 10269 - snd_hda_codec_read(codec, hp_nid, 0, AC_VERB_SET_PIN_SENSE, 0); 10270 - present = snd_hda_codec_read(codec, hp_nid, 0, 10271 - AC_VERB_GET_PIN_SENSE, 0); 10272 - spec->jack_present = (present & 0x80000000) != 0; 10290 + spec->jack_present = snd_hda_jack_detect(codec, hp_nid); 10273 10291 alc262_hippo_master_update(codec); 10274 10292 } 10275 10293 ··· 10590 10618 unsigned int mute; 10591 10619 10592 10620 if (force || !spec->sense_updated) { 10593 - unsigned int present; 10594 - /* need to execute and sync at first */ 10595 - snd_hda_codec_read(codec, 0x14, 0, AC_VERB_SET_PIN_SENSE, 0); 10596 - /* check laptop HP jack */ 10597 - present = snd_hda_codec_read(codec, 0x14, 0, 10598 - AC_VERB_GET_PIN_SENSE, 0); 10599 - /* need to execute and sync at first */ 10600 - snd_hda_codec_read(codec, 0x1b, 0, AC_VERB_SET_PIN_SENSE, 0); 10601 - /* check docking HP jack */ 10602 - present |= snd_hda_codec_read(codec, 0x1b, 0, 10603 - AC_VERB_GET_PIN_SENSE, 0); 10604 - if (present & AC_PINSENSE_PRESENCE) 10605 - spec->jack_present = 1; 10606 - else 10607 - spec->jack_present = 0; 10621 + spec->jack_present = snd_hda_jack_detect(codec, 0x14) || 10622 + snd_hda_jack_detect(codec, 0x1b); 10608 10623 spec->sense_updated = 1; 10609 10624 } 10610 10625 /* unmute internal speaker only if both HPs are unplugged and ··· 10636 10677 unsigned int mute; 10637 10678 10638 10679 if (force || !spec->sense_updated) { 10639 - unsigned int present_int_hp; 10640 - /* need to execute and sync at first */ 10641 - snd_hda_codec_read(codec, 0x1b, 0, AC_VERB_SET_PIN_SENSE, 0); 10642 - present_int_hp = snd_hda_codec_read(codec, 0x1b, 0, 10643 - AC_VERB_GET_PIN_SENSE, 0); 10644 - spec->jack_present = (present_int_hp & 0x80000000) != 0; 10680 + spec->jack_present = snd_hda_jack_detect(codec, 0x1b); 10645 10681 spec->sense_updated = 1; 10646 10682 } 10647 10683 if (spec->jack_present) { ··· 10828 10874 mute = 0; 10829 10875 /* auto-mute only when HP is used as HP */ 10830 10876 if (!spec->cur_mux[0]) { 10831 - unsigned int present; 10832 - /* need to execute and sync at first */ 10833 - snd_hda_codec_read(codec, 0x15, 0, AC_VERB_SET_PIN_SENSE, 0); 10834 - present = snd_hda_codec_read(codec, 0x15, 0, 10835 - AC_VERB_GET_PIN_SENSE, 0); 10836 - spec->jack_present = (present & AC_PINSENSE_PRESENCE) != 0; 10877 + spec->jack_present = snd_hda_jack_detect(codec, 0x15); 10837 10878 if (spec->jack_present) 10838 10879 mute = HDA_AMP_MUTE; 10839 10880 } ··· 10905 10956 static int alc262_add_out_vol_ctl(struct alc_spec *spec, hda_nid_t nid, 10906 10957 const char *pfx, int *vbits) 10907 10958 { 10908 - char name[32]; 10909 10959 unsigned long val; 10910 10960 int vbit; 10911 10961 ··· 10914 10966 if (*vbits & vbit) /* a volume control for this mixer already there */ 10915 10967 return 0; 10916 10968 *vbits |= vbit; 10917 - snprintf(name, sizeof(name), "%s Playback Volume", pfx); 10918 10969 if (vbit == 2) 10919 10970 val = HDA_COMPOSE_AMP_VAL(0x0e, 2, 0, HDA_OUTPUT); 10920 10971 else 10921 10972 val = HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT); 10922 - return add_control(spec, ALC_CTL_WIDGET_VOL, name, val); 10973 + return add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, val); 10923 10974 } 10924 10975 10925 10976 static int alc262_add_out_sw_ctl(struct alc_spec *spec, hda_nid_t nid, 10926 10977 const char *pfx) 10927 10978 { 10928 - char name[32]; 10929 10979 unsigned long val; 10930 10980 10931 10981 if (!nid) 10932 10982 return 0; 10933 - snprintf(name, sizeof(name), "%s Playback Switch", pfx); 10934 10983 if (nid == 0x16) 10935 10984 val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT); 10936 10985 else 10937 10986 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT); 10938 - return add_control(spec, ALC_CTL_WIDGET_MUTE, name, val); 10987 + return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, val); 10939 10988 } 10940 10989 10941 10990 /* add playback controls from the parsed DAC table */ ··· 11408 11463 SND_PCI_QUIRK(0x104d, 0x9025, "Sony VAIO Z21MN", ALC262_TOSHIBA_S06), 11409 11464 SND_PCI_QUIRK(0x104d, 0x9035, "Sony VAIO VGN-FW170J", ALC262_AUTO), 11410 11465 SND_PCI_QUIRK(0x104d, 0x9047, "Sony VAIO Type G", ALC262_AUTO), 11466 + #if 0 /* disable the quirk since model=auto works better in recent versions */ 11411 11467 SND_PCI_QUIRK_MASK(0x104d, 0xff00, 0x9000, "Sony VAIO", 11412 11468 ALC262_SONY_ASSAMD), 11469 + #endif 11413 11470 SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1", 11414 11471 ALC262_TOSHIBA_RX1), 11415 11472 SND_PCI_QUIRK(0x1179, 0xff7b, "Toshiba S06", ALC262_TOSHIBA_S06), ··· 11870 11923 unsigned int mute; 11871 11924 11872 11925 if (force || !spec->sense_updated) { 11873 - unsigned int present; 11874 - present = snd_hda_codec_read(codec, 0x14, 0, 11875 - AC_VERB_GET_PIN_SENSE, 0); 11876 - spec->jack_present = (present & 0x80000000) != 0; 11926 + spec->jack_present = snd_hda_jack_detect(codec, 0x14); 11877 11927 spec->sense_updated = 1; 11878 11928 } 11879 11929 if (spec->jack_present) ··· 11989 12045 unsigned int present; 11990 12046 unsigned char bits; 11991 12047 11992 - present = snd_hda_codec_read(codec, 0x15, 0, 11993 - AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 12048 + present = snd_hda_jack_detect(codec, 0x15); 11994 12049 bits = present ? AMP_IN_MUTE(0) : 0; 11995 12050 snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 0, 11996 12051 AMP_IN_MUTE(0), bits); ··· 12270 12327 static int alc268_new_analog_output(struct alc_spec *spec, hda_nid_t nid, 12271 12328 const char *ctlname, int idx) 12272 12329 { 12273 - char name[32]; 12274 12330 hda_nid_t dac; 12275 12331 int err; 12276 12332 12277 - sprintf(name, "%s Playback Volume", ctlname); 12278 12333 switch (nid) { 12279 12334 case 0x14: 12280 12335 case 0x16: ··· 12286 12345 } 12287 12346 if (spec->multiout.dac_nids[0] != dac && 12288 12347 spec->multiout.dac_nids[1] != dac) { 12289 - err = add_control(spec, ALC_CTL_WIDGET_VOL, name, 12348 + err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname, 12290 12349 HDA_COMPOSE_AMP_VAL(dac, 3, idx, 12291 12350 HDA_OUTPUT)); 12292 12351 if (err < 0) ··· 12294 12353 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac; 12295 12354 } 12296 12355 12297 - sprintf(name, "%s Playback Switch", ctlname); 12298 12356 if (nid != 0x16) 12299 - err = add_control(spec, ALC_CTL_WIDGET_MUTE, name, 12357 + err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname, 12300 12358 HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_OUTPUT)); 12301 12359 else /* mono */ 12302 - err = add_control(spec, ALC_CTL_WIDGET_MUTE, name, 12360 + err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname, 12303 12361 HDA_COMPOSE_AMP_VAL(nid, 2, idx, HDA_OUTPUT)); 12304 12362 if (err < 0) 12305 12363 return err; ··· 12328 12388 12329 12389 nid = cfg->speaker_pins[0]; 12330 12390 if (nid == 0x1d) { 12331 - err = add_control(spec, ALC_CTL_WIDGET_VOL, 12332 - "Speaker Playback Volume", 12391 + err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, "Speaker", 12333 12392 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT)); 12334 12393 if (err < 0) 12335 12394 return err; ··· 12346 12407 12347 12408 nid = cfg->line_out_pins[1] | cfg->line_out_pins[2]; 12348 12409 if (nid == 0x16) { 12349 - err = add_control(spec, ALC_CTL_WIDGET_MUTE, 12350 - "Mono Playback Switch", 12410 + err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, "Mono", 12351 12411 HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT)); 12352 12412 if (err < 0) 12353 12413 return err; ··· 12972 13034 unsigned int present; 12973 13035 unsigned char bits; 12974 13036 12975 - present = snd_hda_codec_read(codec, 0x15, 0, 12976 - AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 13037 + present = snd_hda_jack_detect(codec, 0x15); 12977 13038 bits = present ? AMP_IN_MUTE(0) : 0; 12978 13039 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, 12979 13040 AMP_IN_MUTE(0), bits); ··· 12997 13060 unsigned char bits; 12998 13061 12999 13062 /* Check laptop headphone socket */ 13000 - present = snd_hda_codec_read(codec, 0x15, 0, 13001 - AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 13063 + present = snd_hda_jack_detect(codec, 0x15); 13002 13064 13003 13065 /* Check port replicator headphone socket */ 13004 - present |= snd_hda_codec_read(codec, 0x1a, 0, 13005 - AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 13066 + present |= snd_hda_jack_detect(codec, 0x1a); 13006 13067 13007 13068 bits = present ? AMP_IN_MUTE(0) : 0; 13008 13069 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, ··· 13024 13089 unsigned int present_laptop; 13025 13090 unsigned int present_dock; 13026 13091 13027 - present_laptop = snd_hda_codec_read(codec, 0x18, 0, 13028 - AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 13029 - 13030 - present_dock = snd_hda_codec_read(codec, 0x1b, 0, 13031 - AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 13092 + present_laptop = snd_hda_jack_detect(codec, 0x18); 13093 + present_dock = snd_hda_jack_detect(codec, 0x1b); 13032 13094 13033 13095 /* Laptop mic port overrides dock mic port, design decision */ 13034 13096 if (present_dock) ··· 13110 13178 unsigned int present; 13111 13179 unsigned char bits; 13112 13180 13113 - present = snd_hda_codec_read(codec, 0x15, 0, 13114 - AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 13181 + present = snd_hda_jack_detect(codec, 0x15); 13115 13182 bits = present ? AMP_IN_MUTE(0) : 0; 13116 13183 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, 13117 13184 AMP_IN_MUTE(0), bits); ··· 13455 13524 codec->spec = spec; 13456 13525 13457 13526 alc_fix_pll_init(codec, 0x20, 0x04, 15); 13527 + 13528 + if ((alc_read_coef_idx(codec, 0) & 0x00f0) == 0x0010){ 13529 + kfree(codec->chip_name); 13530 + codec->chip_name = kstrdup("ALC259", GFP_KERNEL); 13531 + if (!codec->chip_name) { 13532 + alc_free(codec); 13533 + return -ENOMEM; 13534 + } 13535 + } 13458 13536 13459 13537 board_config = snd_hda_check_board_config(codec, ALC269_MODEL_LAST, 13460 13538 alc269_models, ··· 14097 14157 /* toggle speaker-output according to the hp-jack state */ 14098 14158 static void alc861_toshiba_automute(struct hda_codec *codec) 14099 14159 { 14100 - unsigned int present; 14160 + unsigned int present = snd_hda_jack_detect(codec, 0x0f); 14101 14161 14102 - present = snd_hda_codec_read(codec, 0x0f, 0, 14103 - AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 14104 14162 snd_hda_codec_amp_stereo(codec, 0x16, HDA_INPUT, 0, 14105 14163 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 14106 14164 snd_hda_codec_amp_stereo(codec, 0x1a, HDA_INPUT, 3, ··· 14198 14260 static int alc861_create_out_sw(struct hda_codec *codec, const char *pfx, 14199 14261 hda_nid_t nid, unsigned int chs) 14200 14262 { 14201 - char name[32]; 14202 - snprintf(name, sizeof(name), "%s Playback Switch", pfx); 14203 - return add_control(codec->spec, ALC_CTL_WIDGET_MUTE, name, 14263 + return add_pb_sw_ctrl(codec->spec, ALC_CTL_WIDGET_MUTE, pfx, 14204 14264 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT)); 14205 14265 } 14206 14266 ··· 14563 14627 }, 14564 14628 }; 14565 14629 14630 + /* Pin config fixes */ 14631 + enum { 14632 + PINFIX_FSC_AMILO_PI1505, 14633 + }; 14634 + 14635 + static struct alc_pincfg alc861_fsc_amilo_pi1505_pinfix[] = { 14636 + { 0x0b, 0x0221101f }, /* HP */ 14637 + { 0x0f, 0x90170310 }, /* speaker */ 14638 + { } 14639 + }; 14640 + 14641 + static const struct alc_fixup alc861_fixups[] = { 14642 + [PINFIX_FSC_AMILO_PI1505] = { 14643 + .pins = alc861_fsc_amilo_pi1505_pinfix 14644 + }, 14645 + }; 14646 + 14647 + static struct snd_pci_quirk alc861_fixup_tbl[] = { 14648 + SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", PINFIX_FSC_AMILO_PI1505), 14649 + {} 14650 + }; 14566 14651 14567 14652 static int patch_alc861(struct hda_codec *codec) 14568 14653 { ··· 14606 14649 codec->chip_name); 14607 14650 board_config = ALC861_AUTO; 14608 14651 } 14652 + 14653 + alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups); 14609 14654 14610 14655 if (board_config == ALC861_AUTO) { 14611 14656 /* automatic parse from the BIOS config */ ··· 15026 15067 unsigned int present; 15027 15068 unsigned char bits; 15028 15069 15029 - present = snd_hda_codec_read(codec, 0x18, 0, 15030 - AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 15070 + present = snd_hda_jack_detect(codec, 0x18); 15031 15071 bits = present ? HDA_AMP_MUTE : 0; 15072 + 15032 15073 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, 15033 15074 HDA_AMP_MUTE, bits); 15034 15075 } ··· 15345 15386 static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec, 15346 15387 const struct auto_pin_cfg *cfg) 15347 15388 { 15348 - char name[32]; 15349 15389 static const char *chname[4] = {"Front", "Surround", "CLFE", "Side"}; 15350 15390 hda_nid_t nid_v, nid_s; 15351 15391 int i, err; ··· 15361 15403 15362 15404 if (i == 2) { 15363 15405 /* Center/LFE */ 15364 - err = add_control(spec, ALC_CTL_WIDGET_VOL, 15365 - "Center Playback Volume", 15406 + err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, 15407 + "Center", 15366 15408 HDA_COMPOSE_AMP_VAL(nid_v, 1, 0, 15367 15409 HDA_OUTPUT)); 15368 15410 if (err < 0) 15369 15411 return err; 15370 - err = add_control(spec, ALC_CTL_WIDGET_VOL, 15371 - "LFE Playback Volume", 15412 + err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, 15413 + "LFE", 15372 15414 HDA_COMPOSE_AMP_VAL(nid_v, 2, 0, 15373 15415 HDA_OUTPUT)); 15374 15416 if (err < 0) 15375 15417 return err; 15376 - err = add_control(spec, ALC_CTL_BIND_MUTE, 15377 - "Center Playback Switch", 15418 + err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, 15419 + "Center", 15378 15420 HDA_COMPOSE_AMP_VAL(nid_s, 1, 2, 15379 15421 HDA_INPUT)); 15380 15422 if (err < 0) 15381 15423 return err; 15382 - err = add_control(spec, ALC_CTL_BIND_MUTE, 15383 - "LFE Playback Switch", 15424 + err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, 15425 + "LFE", 15384 15426 HDA_COMPOSE_AMP_VAL(nid_s, 2, 2, 15385 15427 HDA_INPUT)); 15386 15428 if (err < 0) ··· 15395 15437 pfx = "PCM"; 15396 15438 } else 15397 15439 pfx = chname[i]; 15398 - sprintf(name, "%s Playback Volume", pfx); 15399 - err = add_control(spec, ALC_CTL_WIDGET_VOL, name, 15440 + err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, 15400 15441 HDA_COMPOSE_AMP_VAL(nid_v, 3, 0, 15401 15442 HDA_OUTPUT)); 15402 15443 if (err < 0) ··· 15403 15446 if (cfg->line_outs == 1 && 15404 15447 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) 15405 15448 pfx = "Speaker"; 15406 - sprintf(name, "%s Playback Switch", pfx); 15407 - err = add_control(spec, ALC_CTL_BIND_MUTE, name, 15449 + err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx, 15408 15450 HDA_COMPOSE_AMP_VAL(nid_s, 3, 2, 15409 15451 HDA_INPUT)); 15410 15452 if (err < 0) ··· 15421 15465 { 15422 15466 hda_nid_t nid_v, nid_s; 15423 15467 int err; 15424 - char name[32]; 15425 15468 15426 15469 if (!pin) 15427 15470 return 0; ··· 15438 15483 nid_s = alc861vd_idx_to_mixer_switch( 15439 15484 alc880_fixed_pin_idx(pin)); 15440 15485 15441 - sprintf(name, "%s Playback Volume", pfx); 15442 - err = add_control(spec, ALC_CTL_WIDGET_VOL, name, 15486 + err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, 15443 15487 HDA_COMPOSE_AMP_VAL(nid_v, 3, 0, HDA_OUTPUT)); 15444 15488 if (err < 0) 15445 15489 return err; 15446 - sprintf(name, "%s Playback Switch", pfx); 15447 - err = add_control(spec, ALC_CTL_BIND_MUTE, name, 15490 + err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx, 15448 15491 HDA_COMPOSE_AMP_VAL(nid_s, 3, 2, HDA_INPUT)); 15449 15492 if (err < 0) 15450 15493 return err; 15451 15494 } else if (alc880_is_multi_pin(pin)) { 15452 15495 /* set manual connection */ 15453 15496 /* we have only a switch on HP-out PIN */ 15454 - sprintf(name, "%s Playback Switch", pfx); 15455 - err = add_control(spec, ALC_CTL_WIDGET_MUTE, name, 15497 + err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, 15456 15498 HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT)); 15457 15499 if (err < 0) 15458 15500 return err; ··· 16339 16387 unsigned int present; 16340 16388 unsigned char bits; 16341 16389 16342 - present = snd_hda_codec_read(codec, 0x14, 0, 16343 - AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 16390 + present = snd_hda_jack_detect(codec, 0x14); 16344 16391 bits = present ? HDA_AMP_MUTE : 0; 16392 + 16345 16393 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 16346 16394 HDA_AMP_MUTE, bits); 16347 16395 } ··· 16351 16399 unsigned int present; 16352 16400 unsigned char bits; 16353 16401 16354 - present = snd_hda_codec_read(codec, 0x1b, 0, 16355 - AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 16402 + present = snd_hda_jack_detect(codec, 0x1b); 16356 16403 bits = present ? HDA_AMP_MUTE : 0; 16404 + 16357 16405 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 16358 16406 HDA_AMP_MUTE, bits); 16359 16407 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, ··· 16412 16460 unsigned int present; 16413 16461 unsigned char bits; 16414 16462 16415 - present = snd_hda_codec_read(codec, 0x21, 0, 16416 - AC_VERB_GET_PIN_SENSE, 0) 16417 - & AC_PINSENSE_PRESENCE; 16463 + present = snd_hda_jack_detect(codec, 0x21); 16418 16464 bits = present ? HDA_AMP_MUTE : 0; 16419 16465 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, 16420 16466 AMP_IN_MUTE(0), bits); ··· 16425 16475 unsigned int present; 16426 16476 unsigned char bits; 16427 16477 16428 - present = snd_hda_codec_read(codec, 0x21, 0, 16429 - AC_VERB_GET_PIN_SENSE, 0) 16430 - & AC_PINSENSE_PRESENCE; 16478 + present = snd_hda_jack_detect(codec, 0x21); 16431 16479 bits = present ? HDA_AMP_MUTE : 0; 16432 16480 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, 16433 16481 AMP_IN_MUTE(0), bits); ··· 16442 16494 unsigned int present; 16443 16495 unsigned char bits; 16444 16496 16445 - present = snd_hda_codec_read(codec, 0x15, 0, 16446 - AC_VERB_GET_PIN_SENSE, 0) 16447 - & AC_PINSENSE_PRESENCE; 16497 + present = snd_hda_jack_detect(codec, 0x15); 16448 16498 bits = present ? HDA_AMP_MUTE : 0; 16449 16499 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, 16450 16500 AMP_IN_MUTE(0), bits); ··· 16459 16513 unsigned int present; 16460 16514 unsigned char bits; 16461 16515 16462 - present = snd_hda_codec_read(codec, 0x1b, 0, 16463 - AC_VERB_GET_PIN_SENSE, 0) 16464 - & AC_PINSENSE_PRESENCE; 16516 + present = snd_hda_jack_detect(codec, 0x1b); 16465 16517 bits = present ? 0 : PIN_OUT; 16466 16518 snd_hda_codec_write(codec, 0x14, 0, 16467 16519 AC_VERB_SET_PIN_WIDGET_CONTROL, bits); ··· 16469 16525 { 16470 16526 unsigned int present1, present2; 16471 16527 16472 - present1 = snd_hda_codec_read(codec, 0x21, 0, 16473 - AC_VERB_GET_PIN_SENSE, 0) 16474 - & AC_PINSENSE_PRESENCE; 16475 - present2 = snd_hda_codec_read(codec, 0x15, 0, 16476 - AC_VERB_GET_PIN_SENSE, 0) 16477 - & AC_PINSENSE_PRESENCE; 16528 + present1 = snd_hda_jack_detect(codec, 0x21); 16529 + present2 = snd_hda_jack_detect(codec, 0x15); 16478 16530 16479 16531 if (present1 || present2) { 16480 16532 snd_hda_codec_write_cache(codec, 0x14, 0, ··· 16485 16545 { 16486 16546 unsigned int present1, present2; 16487 16547 16488 - present1 = snd_hda_codec_read(codec, 0x1b, 0, 16489 - AC_VERB_GET_PIN_SENSE, 0) 16490 - & AC_PINSENSE_PRESENCE; 16491 - present2 = snd_hda_codec_read(codec, 0x15, 0, 16492 - AC_VERB_GET_PIN_SENSE, 0) 16493 - & AC_PINSENSE_PRESENCE; 16548 + present1 = snd_hda_jack_detect(codec, 0x1b); 16549 + present2 = snd_hda_jack_detect(codec, 0x15); 16494 16550 16495 16551 if (present1 || present2) { 16496 16552 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0, ··· 16646 16710 unsigned int present; 16647 16711 unsigned char bits; 16648 16712 16649 - present = snd_hda_codec_read(codec, 0x21, 0, 16650 - AC_VERB_GET_PIN_SENSE, 0) 16651 - & AC_PINSENSE_PRESENCE; 16713 + present = snd_hda_jack_detect(codec, 0x21); 16652 16714 bits = present ? HDA_AMP_MUTE : 0; 16653 16715 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0, 16654 16716 HDA_AMP_MUTE, bits); ··· 16659 16725 unsigned int present; 16660 16726 unsigned char bits; 16661 16727 16662 - present = snd_hda_codec_read(codec, 0x15, 0, 16663 - AC_VERB_GET_PIN_SENSE, 0) 16664 - & AC_PINSENSE_PRESENCE; 16728 + present = snd_hda_jack_detect(codec, 0x15); 16665 16729 bits = present ? HDA_AMP_MUTE : 0; 16666 16730 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, 16667 16731 HDA_AMP_MUTE, bits); ··· 17196 17264 return 0; 17197 17265 } 17198 17266 17199 - static int alc662_add_vol_ctl(struct alc_spec *spec, const char *pfx, 17267 + static inline int alc662_add_vol_ctl(struct alc_spec *spec, const char *pfx, 17200 17268 hda_nid_t nid, unsigned int chs) 17201 17269 { 17202 - char name[32]; 17203 - sprintf(name, "%s Playback Volume", pfx); 17204 - return add_control(spec, ALC_CTL_WIDGET_VOL, name, 17270 + return add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, 17205 17271 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT)); 17206 17272 } 17207 17273 17208 - static int alc662_add_sw_ctl(struct alc_spec *spec, const char *pfx, 17274 + static inline int alc662_add_sw_ctl(struct alc_spec *spec, const char *pfx, 17209 17275 hda_nid_t nid, unsigned int chs) 17210 17276 { 17211 - char name[32]; 17212 - sprintf(name, "%s Playback Switch", pfx); 17213 - return add_control(spec, ALC_CTL_WIDGET_MUTE, name, 17277 + return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, 17214 17278 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_INPUT)); 17215 17279 } 17216 17280 ··· 17284 17356 return 0; 17285 17357 nid = alc662_look_for_dac(codec, pin); 17286 17358 if (!nid) { 17287 - char name[32]; 17288 17359 /* the corresponding DAC is already occupied */ 17289 17360 if (!(get_wcaps(codec, pin) & AC_WCAP_OUT_AMP)) 17290 17361 return 0; /* no way */ 17291 17362 /* create a switch only */ 17292 - sprintf(name, "%s Playback Switch", pfx); 17293 - return add_control(spec, ALC_CTL_WIDGET_MUTE, name, 17363 + return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, 17294 17364 HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT)); 17295 17365 } 17296 17366 ··· 17464 17538 17465 17539 alc_fix_pll_init(codec, 0x20, 0x04, 15); 17466 17540 17541 + if (alc_read_coef_idx(codec, 0)==0x8020){ 17542 + kfree(codec->chip_name); 17543 + codec->chip_name = kstrdup("ALC661", GFP_KERNEL); 17544 + if (!codec->chip_name) { 17545 + alc_free(codec); 17546 + return -ENOMEM; 17547 + } 17548 + } 17549 + 17467 17550 board_config = snd_hda_check_board_config(codec, ALC662_MODEL_LAST, 17468 17551 alc662_models, 17469 17552 alc662_cfg_tbl); ··· 17539 17604 return 0; 17540 17605 } 17541 17606 17607 + static int patch_alc888(struct hda_codec *codec) 17608 + { 17609 + if ((alc_read_coef_idx(codec, 0) & 0x00f0)==0x0030){ 17610 + kfree(codec->chip_name); 17611 + codec->chip_name = kstrdup("ALC888-VD", GFP_KERNEL); 17612 + if (!codec->chip_name) { 17613 + alc_free(codec); 17614 + return -ENOMEM; 17615 + } 17616 + return patch_alc662(codec); 17617 + } 17618 + return patch_alc882(codec); 17619 + } 17620 + 17542 17621 /* 17543 17622 * patch entries 17544 17623 */ ··· 17584 17635 { .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc882 }, 17585 17636 { .id = 0x10ec0888, .rev = 0x100101, .name = "ALC1200", 17586 17637 .patch = patch_alc882 }, 17587 - { .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc882 }, 17638 + { .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc888 }, 17588 17639 { .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc882 }, 17640 + { .id = 0x10ec0892, .name = "ALC892", .patch = patch_alc662 }, 17589 17641 {} /* terminator */ 17590 17642 }; 17591 17643
+107 -38
sound/pci/hda/patch_sigmatel.c
··· 93 93 STAC_92HD83XXX_REF, 94 94 STAC_92HD83XXX_PWR_REF, 95 95 STAC_DELL_S14, 96 + STAC_92HD83XXX_HP, 96 97 STAC_92HD83XXX_MODELS 97 98 }; 98 99 ··· 1086 1085 if (!spec->auto_mic && spec->num_dmuxes > 0 && 1087 1086 snd_hda_get_bool_hint(codec, "separate_dmux") == 1) { 1088 1087 stac_dmux_mixer.count = spec->num_dmuxes; 1089 - err = snd_hda_ctl_add(codec, 1088 + err = snd_hda_ctl_add(codec, 0, 1090 1089 snd_ctl_new1(&stac_dmux_mixer, codec)); 1091 1090 if (err < 0) 1092 1091 return err; ··· 1102 1101 spec->spdif_mute = 1; 1103 1102 } 1104 1103 stac_smux_mixer.count = spec->num_smuxes; 1105 - err = snd_hda_ctl_add(codec, 1104 + err = snd_hda_ctl_add(codec, 0, 1106 1105 snd_ctl_new1(&stac_smux_mixer, codec)); 1107 1106 if (err < 0) 1108 1107 return err; ··· 1625 1624 [STAC_92HD83XXX_REF] = "ref", 1626 1625 [STAC_92HD83XXX_PWR_REF] = "mic-ref", 1627 1626 [STAC_DELL_S14] = "dell-s14", 1627 + [STAC_92HD83XXX_HP] = "hp", 1628 1628 }; 1629 1629 1630 1630 static struct snd_pci_quirk stac92hd83xxx_cfg_tbl[] = { ··· 1636 1634 "DFI LanParty", STAC_92HD83XXX_REF), 1637 1635 SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02ba, 1638 1636 "unknown Dell", STAC_DELL_S14), 1637 + SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xff00, 0x3600, 1638 + "HP", STAC_92HD83XXX_HP), 1639 1639 {} /* terminator */ 1640 1640 }; 1641 1641 ··· 2652 2648 enum { 2653 2649 STAC_CTL_WIDGET_VOL, 2654 2650 STAC_CTL_WIDGET_MUTE, 2651 + STAC_CTL_WIDGET_MUTE_BEEP, 2655 2652 STAC_CTL_WIDGET_MONO_MUX, 2656 2653 STAC_CTL_WIDGET_HP_SWITCH, 2657 2654 STAC_CTL_WIDGET_IO_SWITCH, ··· 2663 2658 static struct snd_kcontrol_new stac92xx_control_templates[] = { 2664 2659 HDA_CODEC_VOLUME(NULL, 0, 0, 0), 2665 2660 HDA_CODEC_MUTE(NULL, 0, 0, 0), 2661 + HDA_CODEC_MUTE_BEEP(NULL, 0, 0, 0), 2666 2662 STAC_MONO_MUX, 2667 2663 STAC_CODEC_HP_SWITCH(NULL), 2668 2664 STAC_CODEC_IO_SWITCH(NULL, 0), ··· 2675 2669 static struct snd_kcontrol_new * 2676 2670 stac_control_new(struct sigmatel_spec *spec, 2677 2671 struct snd_kcontrol_new *ktemp, 2678 - const char *name) 2672 + const char *name, 2673 + hda_nid_t nid) 2679 2674 { 2680 2675 struct snd_kcontrol_new *knew; 2681 2676 ··· 2692 2685 spec->kctls.alloced--; 2693 2686 return NULL; 2694 2687 } 2688 + if (nid) 2689 + knew->subdevice = HDA_SUBDEV_NID_FLAG | nid; 2695 2690 return knew; 2696 2691 } 2697 2692 ··· 2702 2693 int idx, const char *name, 2703 2694 unsigned long val) 2704 2695 { 2705 - struct snd_kcontrol_new *knew = stac_control_new(spec, ktemp, name); 2696 + struct snd_kcontrol_new *knew = stac_control_new(spec, ktemp, name, 2697 + get_amp_nid_(val)); 2706 2698 if (!knew) 2707 2699 return -ENOMEM; 2708 2700 knew->index = idx; ··· 2774 2764 if (!spec->num_adcs || imux->num_items <= 1) 2775 2765 return 0; /* no need for input source control */ 2776 2766 knew = stac_control_new(spec, &stac_input_src_temp, 2777 - stac_input_src_temp.name); 2767 + stac_input_src_temp.name, 0); 2778 2768 if (!knew) 2779 2769 return -ENOMEM; 2780 2770 knew->count = spec->num_adcs; ··· 3231 3221 { 3232 3222 struct sigmatel_spec *spec = codec->spec; 3233 3223 u32 caps = query_amp_caps(codec, nid, HDA_OUTPUT); 3234 - int err; 3224 + int err, type = STAC_CTL_WIDGET_MUTE_BEEP; 3225 + 3226 + if (spec->anabeep_nid == nid) 3227 + type = STAC_CTL_WIDGET_MUTE; 3235 3228 3236 3229 /* check for mute support for the the amp */ 3237 3230 if ((caps & AC_AMPCAP_MUTE) >> AC_AMPCAP_MUTE_SHIFT) { 3238 - err = stac92xx_add_control(spec, STAC_CTL_WIDGET_MUTE, 3231 + err = stac92xx_add_control(spec, type, 3239 3232 "Beep Playback Switch", 3240 3233 HDA_COMPOSE_AMP_VAL(nid, 1, 0, HDA_OUTPUT)); 3241 3234 if (err < 0) ··· 3271 3258 struct snd_ctl_elem_value *ucontrol) 3272 3259 { 3273 3260 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 3274 - int enabled = !!ucontrol->value.integer.value[0]; 3275 - if (codec->beep->enabled != enabled) { 3276 - codec->beep->enabled = enabled; 3277 - return 1; 3278 - } 3279 - return 0; 3261 + return snd_hda_enable_beep_device(codec, ucontrol->value.integer.value[0]); 3280 3262 } 3281 3263 3282 3264 static struct snd_kcontrol_new stac92xx_dig_beep_ctrl = { ··· 3639 3631 } 3640 3632 } 3641 3633 3634 + static int is_dual_headphones(struct hda_codec *codec) 3635 + { 3636 + struct sigmatel_spec *spec = codec->spec; 3637 + int i, valid_hps; 3638 + 3639 + if (spec->autocfg.line_out_type != AUTO_PIN_SPEAKER_OUT || 3640 + spec->autocfg.hp_outs <= 1) 3641 + return 0; 3642 + valid_hps = 0; 3643 + for (i = 0; i < spec->autocfg.hp_outs; i++) { 3644 + hda_nid_t nid = spec->autocfg.hp_pins[i]; 3645 + unsigned int cfg = snd_hda_codec_get_pincfg(codec, nid); 3646 + if (get_defcfg_location(cfg) & AC_JACK_LOC_SEPARATE) 3647 + continue; 3648 + valid_hps++; 3649 + } 3650 + return (valid_hps > 1); 3651 + } 3652 + 3653 + 3642 3654 static int stac92xx_parse_auto_config(struct hda_codec *codec, hda_nid_t dig_out, hda_nid_t dig_in) 3643 3655 { 3644 3656 struct sigmatel_spec *spec = codec->spec; ··· 3675 3647 /* If we have no real line-out pin and multiple hp-outs, HPs should 3676 3648 * be set up as multi-channel outputs. 3677 3649 */ 3678 - if (spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT && 3679 - spec->autocfg.hp_outs > 1) { 3650 + if (is_dual_headphones(codec)) { 3680 3651 /* Copy hp_outs to line_outs, backup line_outs in 3681 3652 * speaker_outs so that the following routines can handle 3682 3653 * HP pins as primary outputs. ··· 4356 4329 snd_array_free(&spec->kctls); 4357 4330 } 4358 4331 4332 + static void stac92xx_shutup(struct hda_codec *codec) 4333 + { 4334 + struct sigmatel_spec *spec = codec->spec; 4335 + int i; 4336 + hda_nid_t nid; 4337 + 4338 + /* reset each pin before powering down DAC/ADC to avoid click noise */ 4339 + nid = codec->start_nid; 4340 + for (i = 0; i < codec->num_nodes; i++, nid++) { 4341 + unsigned int wcaps = get_wcaps(codec, nid); 4342 + unsigned int wid_type = get_wcaps_type(wcaps); 4343 + if (wid_type == AC_WID_PIN) 4344 + snd_hda_codec_read(codec, nid, 0, 4345 + AC_VERB_SET_PIN_WIDGET_CONTROL, 0); 4346 + } 4347 + 4348 + if (spec->eapd_mask) 4349 + stac_gpio_set(codec, spec->gpio_mask, 4350 + spec->gpio_dir, spec->gpio_data & 4351 + ~spec->eapd_mask); 4352 + } 4353 + 4359 4354 static void stac92xx_free(struct hda_codec *codec) 4360 4355 { 4361 4356 struct sigmatel_spec *spec = codec->spec; ··· 4385 4336 if (! spec) 4386 4337 return; 4387 4338 4339 + stac92xx_shutup(codec); 4388 4340 stac92xx_free_jacks(codec); 4389 4341 snd_array_free(&spec->events); 4390 4342 ··· 4436 4386 pin_ctl & ~flag); 4437 4387 } 4438 4388 4439 - static int get_pin_presence(struct hda_codec *codec, hda_nid_t nid) 4389 + static inline int get_pin_presence(struct hda_codec *codec, hda_nid_t nid) 4440 4390 { 4441 4391 if (!nid) 4442 4392 return 0; 4443 - if (snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PIN_SENSE, 0x00) 4444 - & (1 << 31)) 4393 + /* NOTE: we can't use snd_hda_jack_detect() here because STAC/IDT 4394 + * codecs behave wrongly when SET_PIN_SENSE is triggered, although 4395 + * the pincap gives TRIG_REQ bit. 4396 + */ 4397 + if (snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PIN_SENSE, 0) & 4398 + AC_PINSENSE_PRESENCE) 4445 4399 return 1; 4446 4400 return 0; 4447 4401 } ··· 4845 4791 4846 4792 return 0; 4847 4793 } 4794 + 4795 + static int idt92hd83xxx_hp_check_power_status(struct hda_codec *codec, 4796 + hda_nid_t nid) 4797 + { 4798 + struct sigmatel_spec *spec = codec->spec; 4799 + 4800 + if (nid != 0x13) 4801 + return 0; 4802 + if (snd_hda_codec_amp_read(codec, nid, 0, HDA_OUTPUT, 0) & HDA_AMP_MUTE) 4803 + spec->gpio_data |= spec->gpio_led; /* mute LED on */ 4804 + else 4805 + spec->gpio_data &= ~spec->gpio_led; /* mute LED off */ 4806 + stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, spec->gpio_data); 4807 + 4808 + return 0; 4809 + } 4810 + 4848 4811 #endif 4849 4812 4850 4813 static int stac92xx_suspend(struct hda_codec *codec, pm_message_t state) 4851 4814 { 4852 - struct sigmatel_spec *spec = codec->spec; 4853 - int i; 4854 - hda_nid_t nid; 4855 - 4856 - /* reset each pin before powering down DAC/ADC to avoid click noise */ 4857 - nid = codec->start_nid; 4858 - for (i = 0; i < codec->num_nodes; i++, nid++) { 4859 - unsigned int wcaps = get_wcaps(codec, nid); 4860 - unsigned int wid_type = get_wcaps_type(wcaps); 4861 - if (wid_type == AC_WID_PIN) 4862 - snd_hda_codec_read(codec, nid, 0, 4863 - AC_VERB_SET_PIN_WIDGET_CONTROL, 0); 4864 - } 4865 - 4866 - if (spec->eapd_mask) 4867 - stac_gpio_set(codec, spec->gpio_mask, 4868 - spec->gpio_dir, spec->gpio_data & 4869 - ~spec->eapd_mask); 4815 + stac92xx_shutup(codec); 4870 4816 return 0; 4871 4817 } 4872 4818 #endif ··· 4881 4827 .suspend = stac92xx_suspend, 4882 4828 .resume = stac92xx_resume, 4883 4829 #endif 4830 + .reboot_notify = stac92xx_shutup, 4884 4831 }; 4885 4832 4886 4833 static int patch_stac9200(struct hda_codec *codec) ··· 5227 5172 break; 5228 5173 } 5229 5174 5175 + codec->patch_ops = stac92xx_patch_ops; 5176 + 5177 + if (spec->board_config == STAC_92HD83XXX_HP) 5178 + spec->gpio_led = 0x01; 5179 + 5180 + #ifdef CONFIG_SND_HDA_POWER_SAVE 5181 + if (spec->gpio_led) { 5182 + spec->gpio_mask |= spec->gpio_led; 5183 + spec->gpio_dir |= spec->gpio_led; 5184 + spec->gpio_data |= spec->gpio_led; 5185 + /* register check_power_status callback. */ 5186 + codec->patch_ops.check_power_status = 5187 + idt92hd83xxx_hp_check_power_status; 5188 + } 5189 + #endif 5190 + 5230 5191 err = stac92xx_parse_auto_config(codec, 0x1d, 0); 5231 5192 if (!err) { 5232 5193 if (spec->board_config < 0) { ··· 5277 5206 */ 5278 5207 snd_hda_codec_write_cache(codec, nid, 0, 5279 5208 AC_VERB_SET_CONNECT_SEL, num_dacs); 5280 - 5281 - codec->patch_ops = stac92xx_patch_ops; 5282 5209 5283 5210 codec->proc_widget_hook = stac92hd_proc_hook; 5284 5211
+3220 -307
sound/pci/hda/patch_via.c
··· 1 1 /* 2 2 * Universal Interface for Intel High Definition Audio Codec 3 3 * 4 - * HD audio interface patch for VIA VT1702/VT1708/VT1709 codec 4 + * HD audio interface patch for VIA VT17xx/VT18xx/VT20xx codec 5 5 * 6 - * Copyright (c) 2006-2008 Lydia Wang <lydiawang@viatech.com> 7 - * Takashi Iwai <tiwai@suse.de> 6 + * (C) 2006-2009 VIA Technology, Inc. 7 + * (C) 2006-2008 Takashi Iwai <tiwai@suse.de> 8 8 * 9 9 * This driver is free software; you can redistribute it and/or modify 10 10 * it under the terms of the GNU General Public License as published by ··· 22 22 */ 23 23 24 24 /* * * * * * * * * * * * * * Release History * * * * * * * * * * * * * * * * */ 25 - /* */ 25 + /* */ 26 26 /* 2006-03-03 Lydia Wang Create the basic patch to support VT1708 codec */ 27 - /* 2006-03-14 Lydia Wang Modify hard code for some pin widget nid */ 28 - /* 2006-08-02 Lydia Wang Add support to VT1709 codec */ 27 + /* 2006-03-14 Lydia Wang Modify hard code for some pin widget nid */ 28 + /* 2006-08-02 Lydia Wang Add support to VT1709 codec */ 29 29 /* 2006-09-08 Lydia Wang Fix internal loopback recording source select bug */ 30 - /* 2007-09-12 Lydia Wang Add EAPD enable during driver initialization */ 31 - /* 2007-09-17 Lydia Wang Add VT1708B codec support */ 30 + /* 2007-09-12 Lydia Wang Add EAPD enable during driver initialization */ 31 + /* 2007-09-17 Lydia Wang Add VT1708B codec support */ 32 32 /* 2007-11-14 Lydia Wang Add VT1708A codec HP and CD pin connect config */ 33 33 /* 2008-02-03 Lydia Wang Fix Rear channels and Back channels inverse issue */ 34 - /* 2008-03-06 Lydia Wang Add VT1702 codec and VT1708S codec support */ 35 - /* 2008-04-09 Lydia Wang Add mute front speaker when HP plugin */ 36 - /* 2008-04-09 Lydia Wang Add Independent HP feature */ 34 + /* 2008-03-06 Lydia Wang Add VT1702 codec and VT1708S codec support */ 35 + /* 2008-04-09 Lydia Wang Add mute front speaker when HP plugin */ 36 + /* 2008-04-09 Lydia Wang Add Independent HP feature */ 37 37 /* 2008-05-28 Lydia Wang Add second S/PDIF Out support for VT1702 */ 38 - /* 2008-09-15 Logan Li Add VT1708S Mic Boost workaround/backdoor */ 39 - /* */ 38 + /* 2008-09-15 Logan Li Add VT1708S Mic Boost workaround/backdoor */ 39 + /* 2009-02-16 Logan Li Add support for VT1718S */ 40 + /* 2009-03-13 Logan Li Add support for VT1716S */ 41 + /* 2009-04-14 Lydai Wang Add support for VT1828S and VT2020 */ 42 + /* 2009-07-08 Lydia Wang Add support for VT2002P */ 43 + /* 2009-07-21 Lydia Wang Add support for VT1812 */ 44 + /* 2009-09-19 Lydia Wang Add support for VT1818S */ 45 + /* */ 40 46 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 41 47 42 48 ··· 82 76 #define VT1702_HP_NID 0x17 83 77 #define VT1702_DIGOUT_NID 0x11 84 78 85 - #define IS_VT1708_VENDORID(x) ((x) >= 0x11061708 && (x) <= 0x1106170b) 86 - #define IS_VT1709_10CH_VENDORID(x) ((x) >= 0x1106e710 && (x) <= 0x1106e713) 87 - #define IS_VT1709_6CH_VENDORID(x) ((x) >= 0x1106e714 && (x) <= 0x1106e717) 88 - #define IS_VT1708B_8CH_VENDORID(x) ((x) >= 0x1106e720 && (x) <= 0x1106e723) 89 - #define IS_VT1708B_4CH_VENDORID(x) ((x) >= 0x1106e724 && (x) <= 0x1106e727) 90 - #define IS_VT1708S_VENDORID(x) ((x) >= 0x11060397 && (x) <= 0x11067397) 91 - #define IS_VT1702_VENDORID(x) ((x) >= 0x11060398 && (x) <= 0x11067398) 92 - 93 79 enum VIA_HDA_CODEC { 94 80 UNKNOWN = -1, 95 81 VT1708, ··· 90 92 VT1708B_8CH, 91 93 VT1708B_4CH, 92 94 VT1708S, 95 + VT1708BCE, 93 96 VT1702, 97 + VT1718S, 98 + VT1716S, 99 + VT2002P, 100 + VT1812, 94 101 CODEC_TYPES, 95 102 }; 96 103 97 - static enum VIA_HDA_CODEC get_codec_type(u32 vendor_id) 98 - { 99 - u16 ven_id = vendor_id >> 16; 100 - u16 dev_id = vendor_id & 0xffff; 101 - enum VIA_HDA_CODEC codec_type; 102 - 103 - /* get codec type */ 104 - if (ven_id != 0x1106) 105 - codec_type = UNKNOWN; 106 - else if (dev_id >= 0x1708 && dev_id <= 0x170b) 107 - codec_type = VT1708; 108 - else if (dev_id >= 0xe710 && dev_id <= 0xe713) 109 - codec_type = VT1709_10CH; 110 - else if (dev_id >= 0xe714 && dev_id <= 0xe717) 111 - codec_type = VT1709_6CH; 112 - else if (dev_id >= 0xe720 && dev_id <= 0xe723) 113 - codec_type = VT1708B_8CH; 114 - else if (dev_id >= 0xe724 && dev_id <= 0xe727) 115 - codec_type = VT1708B_4CH; 116 - else if ((dev_id & 0xfff) == 0x397 117 - && (dev_id >> 12) < 8) 118 - codec_type = VT1708S; 119 - else if ((dev_id & 0xfff) == 0x398 120 - && (dev_id >> 12) < 8) 121 - codec_type = VT1702; 122 - else 123 - codec_type = UNKNOWN; 124 - return codec_type; 125 - }; 126 - 127 - #define VIA_HP_EVENT 0x01 128 - #define VIA_GPIO_EVENT 0x02 129 - 130 - enum { 131 - VIA_CTL_WIDGET_VOL, 132 - VIA_CTL_WIDGET_MUTE, 133 - }; 134 - 135 - enum { 136 - AUTO_SEQ_FRONT = 0, 137 - AUTO_SEQ_SURROUND, 138 - AUTO_SEQ_CENLFE, 139 - AUTO_SEQ_SIDE 140 - }; 141 - 142 - /* Some VT1708S based boards gets the micboost setting wrong, so we have 143 - * to apply some brute-force and re-write the TLV's by software. */ 144 - static int mic_boost_tlv(struct snd_kcontrol *kcontrol, int op_flag, 145 - unsigned int size, unsigned int __user *_tlv) 146 - { 147 - struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 148 - hda_nid_t nid = get_amp_nid(kcontrol); 149 - 150 - if (get_codec_type(codec->vendor_id) == VT1708S 151 - && (nid == 0x1a || nid == 0x1e)) { 152 - if (size < 4 * sizeof(unsigned int)) 153 - return -ENOMEM; 154 - if (put_user(1, _tlv)) /* SNDRV_CTL_TLVT_DB_SCALE */ 155 - return -EFAULT; 156 - if (put_user(2 * sizeof(unsigned int), _tlv + 1)) 157 - return -EFAULT; 158 - if (put_user(0, _tlv + 2)) /* offset = 0 */ 159 - return -EFAULT; 160 - if (put_user(1000, _tlv + 3)) /* step size = 10 dB */ 161 - return -EFAULT; 162 - } 163 - return 0; 164 - } 165 - 166 - static int mic_boost_volume_info(struct snd_kcontrol *kcontrol, 167 - struct snd_ctl_elem_info *uinfo) 168 - { 169 - struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 170 - hda_nid_t nid = get_amp_nid(kcontrol); 171 - 172 - if (get_codec_type(codec->vendor_id) == VT1708S 173 - && (nid == 0x1a || nid == 0x1e)) { 174 - uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; 175 - uinfo->count = 2; 176 - uinfo->value.integer.min = 0; 177 - uinfo->value.integer.max = 3; 178 - } 179 - return 0; 180 - } 181 - 182 - static struct snd_kcontrol_new vt1708_control_templates[] = { 183 - HDA_CODEC_VOLUME(NULL, 0, 0, 0), 184 - HDA_CODEC_MUTE(NULL, 0, 0, 0), 185 - }; 186 - 187 - 188 104 struct via_spec { 189 105 /* codec parameterization */ 190 - struct snd_kcontrol_new *mixers[3]; 106 + struct snd_kcontrol_new *mixers[6]; 191 107 unsigned int num_mixers; 192 108 193 109 struct hda_verb *init_verbs[5]; ··· 142 230 /* HP mode source */ 143 231 const struct hda_input_mux *hp_mux; 144 232 unsigned int hp_independent_mode; 233 + unsigned int hp_independent_mode_index; 234 + unsigned int smart51_enabled; 235 + unsigned int dmic_enabled; 236 + enum VIA_HDA_CODEC codec_type; 145 237 238 + /* work to check hp jack state */ 239 + struct hda_codec *codec; 240 + struct delayed_work vt1708_hp_work; 241 + int vt1708_jack_detectect; 242 + int vt1708_hp_present; 146 243 #ifdef CONFIG_SND_HDA_POWER_SAVE 147 244 struct hda_loopback_check loopback; 148 245 #endif 246 + }; 247 + 248 + static enum VIA_HDA_CODEC get_codec_type(struct hda_codec *codec) 249 + { 250 + u32 vendor_id = codec->vendor_id; 251 + u16 ven_id = vendor_id >> 16; 252 + u16 dev_id = vendor_id & 0xffff; 253 + enum VIA_HDA_CODEC codec_type; 254 + 255 + /* get codec type */ 256 + if (ven_id != 0x1106) 257 + codec_type = UNKNOWN; 258 + else if (dev_id >= 0x1708 && dev_id <= 0x170b) 259 + codec_type = VT1708; 260 + else if (dev_id >= 0xe710 && dev_id <= 0xe713) 261 + codec_type = VT1709_10CH; 262 + else if (dev_id >= 0xe714 && dev_id <= 0xe717) 263 + codec_type = VT1709_6CH; 264 + else if (dev_id >= 0xe720 && dev_id <= 0xe723) { 265 + codec_type = VT1708B_8CH; 266 + if (snd_hda_param_read(codec, 0x16, AC_PAR_CONNLIST_LEN) == 0x7) 267 + codec_type = VT1708BCE; 268 + } else if (dev_id >= 0xe724 && dev_id <= 0xe727) 269 + codec_type = VT1708B_4CH; 270 + else if ((dev_id & 0xfff) == 0x397 271 + && (dev_id >> 12) < 8) 272 + codec_type = VT1708S; 273 + else if ((dev_id & 0xfff) == 0x398 274 + && (dev_id >> 12) < 8) 275 + codec_type = VT1702; 276 + else if ((dev_id & 0xfff) == 0x428 277 + && (dev_id >> 12) < 8) 278 + codec_type = VT1718S; 279 + else if (dev_id == 0x0433 || dev_id == 0xa721) 280 + codec_type = VT1716S; 281 + else if (dev_id == 0x0441 || dev_id == 0x4441) 282 + codec_type = VT1718S; 283 + else if (dev_id == 0x0438 || dev_id == 0x4438) 284 + codec_type = VT2002P; 285 + else if (dev_id == 0x0448) 286 + codec_type = VT1812; 287 + else if (dev_id == 0x0440) 288 + codec_type = VT1708S; 289 + else 290 + codec_type = UNKNOWN; 291 + return codec_type; 292 + }; 293 + 294 + #define VIA_HP_EVENT 0x01 295 + #define VIA_GPIO_EVENT 0x02 296 + #define VIA_JACK_EVENT 0x04 297 + #define VIA_MONO_EVENT 0x08 298 + #define VIA_SPEAKER_EVENT 0x10 299 + #define VIA_BIND_HP_EVENT 0x20 300 + 301 + enum { 302 + VIA_CTL_WIDGET_VOL, 303 + VIA_CTL_WIDGET_MUTE, 304 + VIA_CTL_WIDGET_ANALOG_MUTE, 305 + VIA_CTL_WIDGET_BIND_PIN_MUTE, 306 + }; 307 + 308 + enum { 309 + AUTO_SEQ_FRONT = 0, 310 + AUTO_SEQ_SURROUND, 311 + AUTO_SEQ_CENLFE, 312 + AUTO_SEQ_SIDE 313 + }; 314 + 315 + static void analog_low_current_mode(struct hda_codec *codec, int stream_idle); 316 + static void set_jack_power_state(struct hda_codec *codec); 317 + static int is_aa_path_mute(struct hda_codec *codec); 318 + 319 + static void vt1708_start_hp_work(struct via_spec *spec) 320 + { 321 + if (spec->codec_type != VT1708 || spec->autocfg.hp_pins[0] == 0) 322 + return; 323 + snd_hda_codec_write(spec->codec, 0x1, 0, 0xf81, 324 + !spec->vt1708_jack_detectect); 325 + if (!delayed_work_pending(&spec->vt1708_hp_work)) 326 + schedule_delayed_work(&spec->vt1708_hp_work, 327 + msecs_to_jiffies(100)); 328 + } 329 + 330 + static void vt1708_stop_hp_work(struct via_spec *spec) 331 + { 332 + if (spec->codec_type != VT1708 || spec->autocfg.hp_pins[0] == 0) 333 + return; 334 + if (snd_hda_get_bool_hint(spec->codec, "analog_loopback_hp_detect") == 1 335 + && !is_aa_path_mute(spec->codec)) 336 + return; 337 + snd_hda_codec_write(spec->codec, 0x1, 0, 0xf81, 338 + !spec->vt1708_jack_detectect); 339 + cancel_delayed_work(&spec->vt1708_hp_work); 340 + flush_scheduled_work(); 341 + } 342 + 343 + 344 + static int analog_input_switch_put(struct snd_kcontrol *kcontrol, 345 + struct snd_ctl_elem_value *ucontrol) 346 + { 347 + int change = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol); 348 + struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 349 + 350 + set_jack_power_state(codec); 351 + analog_low_current_mode(snd_kcontrol_chip(kcontrol), -1); 352 + if (snd_hda_get_bool_hint(codec, "analog_loopback_hp_detect") == 1) { 353 + if (is_aa_path_mute(codec)) 354 + vt1708_start_hp_work(codec->spec); 355 + else 356 + vt1708_stop_hp_work(codec->spec); 357 + } 358 + return change; 359 + } 360 + 361 + /* modify .put = snd_hda_mixer_amp_switch_put */ 362 + #define ANALOG_INPUT_MUTE \ 363 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 364 + .name = NULL, \ 365 + .index = 0, \ 366 + .info = snd_hda_mixer_amp_switch_info, \ 367 + .get = snd_hda_mixer_amp_switch_get, \ 368 + .put = analog_input_switch_put, \ 369 + .private_value = HDA_COMPOSE_AMP_VAL(0, 3, 0, 0) } 370 + 371 + static void via_hp_bind_automute(struct hda_codec *codec); 372 + 373 + static int bind_pin_switch_put(struct snd_kcontrol *kcontrol, 374 + struct snd_ctl_elem_value *ucontrol) 375 + { 376 + struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 377 + struct via_spec *spec = codec->spec; 378 + int i; 379 + int change = 0; 380 + 381 + long *valp = ucontrol->value.integer.value; 382 + int lmute, rmute; 383 + if (strstr(kcontrol->id.name, "Switch") == NULL) { 384 + snd_printd("Invalid control!\n"); 385 + return change; 386 + } 387 + change = snd_hda_mixer_amp_switch_put(kcontrol, 388 + ucontrol); 389 + /* Get mute value */ 390 + lmute = *valp ? 0 : HDA_AMP_MUTE; 391 + valp++; 392 + rmute = *valp ? 0 : HDA_AMP_MUTE; 393 + 394 + /* Set hp pins */ 395 + if (!spec->hp_independent_mode) { 396 + for (i = 0; i < spec->autocfg.hp_outs; i++) { 397 + snd_hda_codec_amp_update( 398 + codec, spec->autocfg.hp_pins[i], 399 + 0, HDA_OUTPUT, 0, HDA_AMP_MUTE, 400 + lmute); 401 + snd_hda_codec_amp_update( 402 + codec, spec->autocfg.hp_pins[i], 403 + 1, HDA_OUTPUT, 0, HDA_AMP_MUTE, 404 + rmute); 405 + } 406 + } 407 + 408 + if (!lmute && !rmute) { 409 + /* Line Outs */ 410 + for (i = 0; i < spec->autocfg.line_outs; i++) 411 + snd_hda_codec_amp_stereo( 412 + codec, spec->autocfg.line_out_pins[i], 413 + HDA_OUTPUT, 0, HDA_AMP_MUTE, 0); 414 + /* Speakers */ 415 + for (i = 0; i < spec->autocfg.speaker_outs; i++) 416 + snd_hda_codec_amp_stereo( 417 + codec, spec->autocfg.speaker_pins[i], 418 + HDA_OUTPUT, 0, HDA_AMP_MUTE, 0); 419 + /* unmute */ 420 + via_hp_bind_automute(codec); 421 + 422 + } else { 423 + if (lmute) { 424 + /* Mute all left channels */ 425 + for (i = 1; i < spec->autocfg.line_outs; i++) 426 + snd_hda_codec_amp_update( 427 + codec, 428 + spec->autocfg.line_out_pins[i], 429 + 0, HDA_OUTPUT, 0, HDA_AMP_MUTE, 430 + lmute); 431 + for (i = 0; i < spec->autocfg.speaker_outs; i++) 432 + snd_hda_codec_amp_update( 433 + codec, 434 + spec->autocfg.speaker_pins[i], 435 + 0, HDA_OUTPUT, 0, HDA_AMP_MUTE, 436 + lmute); 437 + } 438 + if (rmute) { 439 + /* mute all right channels */ 440 + for (i = 1; i < spec->autocfg.line_outs; i++) 441 + snd_hda_codec_amp_update( 442 + codec, 443 + spec->autocfg.line_out_pins[i], 444 + 1, HDA_OUTPUT, 0, HDA_AMP_MUTE, 445 + rmute); 446 + for (i = 0; i < spec->autocfg.speaker_outs; i++) 447 + snd_hda_codec_amp_update( 448 + codec, 449 + spec->autocfg.speaker_pins[i], 450 + 1, HDA_OUTPUT, 0, HDA_AMP_MUTE, 451 + rmute); 452 + } 453 + } 454 + return change; 455 + } 456 + 457 + #define BIND_PIN_MUTE \ 458 + { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 459 + .name = NULL, \ 460 + .index = 0, \ 461 + .info = snd_hda_mixer_amp_switch_info, \ 462 + .get = snd_hda_mixer_amp_switch_get, \ 463 + .put = bind_pin_switch_put, \ 464 + .private_value = HDA_COMPOSE_AMP_VAL(0, 3, 0, 0) } 465 + 466 + static struct snd_kcontrol_new via_control_templates[] = { 467 + HDA_CODEC_VOLUME(NULL, 0, 0, 0), 468 + HDA_CODEC_MUTE(NULL, 0, 0, 0), 469 + ANALOG_INPUT_MUTE, 470 + BIND_PIN_MUTE, 149 471 }; 150 472 151 473 static hda_nid_t vt1708_adc_nids[2] = { ··· 407 261 0x12, 0x20, 0x1F 408 262 }; 409 263 264 + static hda_nid_t vt1718S_adc_nids[2] = { 265 + /* ADC1-2 */ 266 + 0x10, 0x11 267 + }; 268 + 269 + static hda_nid_t vt1716S_adc_nids[2] = { 270 + /* ADC1-2 */ 271 + 0x13, 0x14 272 + }; 273 + 274 + static hda_nid_t vt2002P_adc_nids[2] = { 275 + /* ADC1-2 */ 276 + 0x10, 0x11 277 + }; 278 + 279 + static hda_nid_t vt1812_adc_nids[2] = { 280 + /* ADC1-2 */ 281 + 0x10, 0x11 282 + }; 283 + 284 + 410 285 /* add dynamic controls */ 411 286 static int via_add_control(struct via_spec *spec, int type, const char *name, 412 287 unsigned long val) ··· 438 271 knew = snd_array_new(&spec->kctls); 439 272 if (!knew) 440 273 return -ENOMEM; 441 - *knew = vt1708_control_templates[type]; 274 + *knew = via_control_templates[type]; 442 275 knew->name = kstrdup(name, GFP_KERNEL); 443 276 if (!knew->name) 444 277 return -ENOMEM; 278 + if (get_amp_nid_(val)) 279 + knew->subdevice = HDA_SUBDEV_NID_FLAG | get_amp_nid_(val); 445 280 knew->private_value = val; 446 281 return 0; 447 282 } ··· 462 293 } 463 294 464 295 /* create input playback/capture controls for the given pin */ 465 - static int via_new_analog_input(struct via_spec *spec, hda_nid_t pin, 466 - const char *ctlname, int idx, int mix_nid) 296 + static int via_new_analog_input(struct via_spec *spec, const char *ctlname, 297 + int idx, int mix_nid) 467 298 { 468 299 char name[32]; 469 300 int err; ··· 474 305 if (err < 0) 475 306 return err; 476 307 sprintf(name, "%s Playback Switch", ctlname); 477 - err = via_add_control(spec, VIA_CTL_WIDGET_MUTE, name, 308 + err = via_add_control(spec, VIA_CTL_WIDGET_ANALOG_MUTE, name, 478 309 HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT)); 479 310 if (err < 0) 480 311 return err; ··· 491 322 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE, 492 323 AMP_OUT_UNMUTE); 493 324 if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD) 494 - snd_hda_codec_write(codec, nid, 0, 325 + snd_hda_codec_write(codec, nid, 0, 495 326 AC_VERB_SET_EAPD_BTLENABLE, 0x02); 496 327 } 497 328 ··· 512 343 { 513 344 struct via_spec *spec = codec->spec; 514 345 hda_nid_t pin; 346 + int i; 515 347 516 - pin = spec->autocfg.hp_pins[0]; 517 - if (pin) /* connect to front */ 518 - via_auto_set_output_and_unmute(codec, pin, PIN_HP, 0); 348 + for (i = 0; i < spec->autocfg.hp_outs; i++) { 349 + pin = spec->autocfg.hp_pins[i]; 350 + if (pin) /* connect to front */ 351 + via_auto_set_output_and_unmute(codec, pin, PIN_HP, 0); 352 + } 519 353 } 520 354 521 355 static void via_auto_init_analog_input(struct hda_codec *codec) ··· 536 364 537 365 } 538 366 } 367 + 368 + static int is_smart51_pins(struct via_spec *spec, hda_nid_t pin); 369 + 370 + static void set_pin_power_state(struct hda_codec *codec, hda_nid_t nid, 371 + unsigned int *affected_parm) 372 + { 373 + unsigned parm; 374 + unsigned def_conf = snd_hda_codec_get_pincfg(codec, nid); 375 + unsigned no_presence = (def_conf & AC_DEFCFG_MISC) 376 + >> AC_DEFCFG_MISC_SHIFT 377 + & AC_DEFCFG_MISC_NO_PRESENCE; /* do not support pin sense */ 378 + unsigned present = snd_hda_jack_detect(codec, nid); 379 + struct via_spec *spec = codec->spec; 380 + if ((spec->smart51_enabled && is_smart51_pins(spec, nid)) 381 + || ((no_presence || present) 382 + && get_defcfg_connect(def_conf) != AC_JACK_PORT_NONE)) { 383 + *affected_parm = AC_PWRST_D0; /* if it's connected */ 384 + parm = AC_PWRST_D0; 385 + } else 386 + parm = AC_PWRST_D3; 387 + 388 + snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_POWER_STATE, parm); 389 + } 390 + 391 + static void set_jack_power_state(struct hda_codec *codec) 392 + { 393 + struct via_spec *spec = codec->spec; 394 + int imux_is_smixer; 395 + unsigned int parm; 396 + 397 + if (spec->codec_type == VT1702) { 398 + imux_is_smixer = snd_hda_codec_read( 399 + codec, 0x13, 0, AC_VERB_GET_CONNECT_SEL, 0x00) == 3; 400 + /* inputs */ 401 + /* PW 1/2/5 (14h/15h/18h) */ 402 + parm = AC_PWRST_D3; 403 + set_pin_power_state(codec, 0x14, &parm); 404 + set_pin_power_state(codec, 0x15, &parm); 405 + set_pin_power_state(codec, 0x18, &parm); 406 + if (imux_is_smixer) 407 + parm = AC_PWRST_D0; /* SW0 = stereo mixer (idx 3) */ 408 + /* SW0 (13h), AIW 0/1/2 (12h/1fh/20h) */ 409 + snd_hda_codec_write(codec, 0x13, 0, AC_VERB_SET_POWER_STATE, 410 + parm); 411 + snd_hda_codec_write(codec, 0x12, 0, AC_VERB_SET_POWER_STATE, 412 + parm); 413 + snd_hda_codec_write(codec, 0x1f, 0, AC_VERB_SET_POWER_STATE, 414 + parm); 415 + snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_POWER_STATE, 416 + parm); 417 + 418 + /* outputs */ 419 + /* PW 3/4 (16h/17h) */ 420 + parm = AC_PWRST_D3; 421 + set_pin_power_state(codec, 0x16, &parm); 422 + set_pin_power_state(codec, 0x17, &parm); 423 + /* MW0 (1ah), AOW 0/1 (10h/1dh) */ 424 + snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_POWER_STATE, 425 + imux_is_smixer ? AC_PWRST_D0 : parm); 426 + snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, 427 + parm); 428 + snd_hda_codec_write(codec, 0x1d, 0, AC_VERB_SET_POWER_STATE, 429 + parm); 430 + } else if (spec->codec_type == VT1708B_8CH 431 + || spec->codec_type == VT1708B_4CH 432 + || spec->codec_type == VT1708S) { 433 + /* SW0 (17h) = stereo mixer */ 434 + int is_8ch = spec->codec_type != VT1708B_4CH; 435 + imux_is_smixer = snd_hda_codec_read( 436 + codec, 0x17, 0, AC_VERB_GET_CONNECT_SEL, 0x00) 437 + == ((spec->codec_type == VT1708S) ? 5 : 0); 438 + /* inputs */ 439 + /* PW 1/2/5 (1ah/1bh/1eh) */ 440 + parm = AC_PWRST_D3; 441 + set_pin_power_state(codec, 0x1a, &parm); 442 + set_pin_power_state(codec, 0x1b, &parm); 443 + set_pin_power_state(codec, 0x1e, &parm); 444 + if (imux_is_smixer) 445 + parm = AC_PWRST_D0; 446 + /* SW0 (17h), AIW 0/1 (13h/14h) */ 447 + snd_hda_codec_write(codec, 0x17, 0, AC_VERB_SET_POWER_STATE, 448 + parm); 449 + snd_hda_codec_write(codec, 0x13, 0, AC_VERB_SET_POWER_STATE, 450 + parm); 451 + snd_hda_codec_write(codec, 0x14, 0, AC_VERB_SET_POWER_STATE, 452 + parm); 453 + 454 + /* outputs */ 455 + /* PW0 (19h), SW1 (18h), AOW1 (11h) */ 456 + parm = AC_PWRST_D3; 457 + set_pin_power_state(codec, 0x19, &parm); 458 + snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_POWER_STATE, 459 + parm); 460 + snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, 461 + parm); 462 + 463 + /* PW6 (22h), SW2 (26h), AOW2 (24h) */ 464 + if (is_8ch) { 465 + parm = AC_PWRST_D3; 466 + set_pin_power_state(codec, 0x22, &parm); 467 + snd_hda_codec_write(codec, 0x26, 0, 468 + AC_VERB_SET_POWER_STATE, parm); 469 + snd_hda_codec_write(codec, 0x24, 0, 470 + AC_VERB_SET_POWER_STATE, parm); 471 + } 472 + 473 + /* PW 3/4/7 (1ch/1dh/23h) */ 474 + parm = AC_PWRST_D3; 475 + /* force to D0 for internal Speaker */ 476 + set_pin_power_state(codec, 0x1c, &parm); 477 + set_pin_power_state(codec, 0x1d, &parm); 478 + if (is_8ch) 479 + set_pin_power_state(codec, 0x23, &parm); 480 + /* MW0 (16h), Sw3 (27h), AOW 0/3 (10h/25h) */ 481 + snd_hda_codec_write(codec, 0x16, 0, AC_VERB_SET_POWER_STATE, 482 + imux_is_smixer ? AC_PWRST_D0 : parm); 483 + snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, 484 + parm); 485 + if (is_8ch) { 486 + snd_hda_codec_write(codec, 0x25, 0, 487 + AC_VERB_SET_POWER_STATE, parm); 488 + snd_hda_codec_write(codec, 0x27, 0, 489 + AC_VERB_SET_POWER_STATE, parm); 490 + } 491 + } else if (spec->codec_type == VT1718S) { 492 + /* MUX6 (1eh) = stereo mixer */ 493 + imux_is_smixer = snd_hda_codec_read( 494 + codec, 0x1e, 0, AC_VERB_GET_CONNECT_SEL, 0x00) == 5; 495 + /* inputs */ 496 + /* PW 5/6/7 (29h/2ah/2bh) */ 497 + parm = AC_PWRST_D3; 498 + set_pin_power_state(codec, 0x29, &parm); 499 + set_pin_power_state(codec, 0x2a, &parm); 500 + set_pin_power_state(codec, 0x2b, &parm); 501 + if (imux_is_smixer) 502 + parm = AC_PWRST_D0; 503 + /* MUX6/7 (1eh/1fh), AIW 0/1 (10h/11h) */ 504 + snd_hda_codec_write(codec, 0x1e, 0, AC_VERB_SET_POWER_STATE, 505 + parm); 506 + snd_hda_codec_write(codec, 0x1f, 0, AC_VERB_SET_POWER_STATE, 507 + parm); 508 + snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, 509 + parm); 510 + snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, 511 + parm); 512 + 513 + /* outputs */ 514 + /* PW3 (27h), MW2 (1ah), AOW3 (bh) */ 515 + parm = AC_PWRST_D3; 516 + set_pin_power_state(codec, 0x27, &parm); 517 + snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_POWER_STATE, 518 + parm); 519 + snd_hda_codec_write(codec, 0xb, 0, AC_VERB_SET_POWER_STATE, 520 + parm); 521 + 522 + /* PW2 (26h), AOW2 (ah) */ 523 + parm = AC_PWRST_D3; 524 + set_pin_power_state(codec, 0x26, &parm); 525 + snd_hda_codec_write(codec, 0xa, 0, AC_VERB_SET_POWER_STATE, 526 + parm); 527 + 528 + /* PW0/1 (24h/25h) */ 529 + parm = AC_PWRST_D3; 530 + set_pin_power_state(codec, 0x24, &parm); 531 + set_pin_power_state(codec, 0x25, &parm); 532 + if (!spec->hp_independent_mode) /* check for redirected HP */ 533 + set_pin_power_state(codec, 0x28, &parm); 534 + snd_hda_codec_write(codec, 0x8, 0, AC_VERB_SET_POWER_STATE, 535 + parm); 536 + snd_hda_codec_write(codec, 0x9, 0, AC_VERB_SET_POWER_STATE, 537 + parm); 538 + /* MW9 (21h), Mw2 (1ah), AOW0 (8h) */ 539 + snd_hda_codec_write(codec, 0x21, 0, AC_VERB_SET_POWER_STATE, 540 + imux_is_smixer ? AC_PWRST_D0 : parm); 541 + if (spec->hp_independent_mode) { 542 + /* PW4 (28h), MW3 (1bh), MUX1(34h), AOW4 (ch) */ 543 + parm = AC_PWRST_D3; 544 + set_pin_power_state(codec, 0x28, &parm); 545 + snd_hda_codec_write(codec, 0x1b, 0, 546 + AC_VERB_SET_POWER_STATE, parm); 547 + snd_hda_codec_write(codec, 0x34, 0, 548 + AC_VERB_SET_POWER_STATE, parm); 549 + snd_hda_codec_write(codec, 0xc, 0, 550 + AC_VERB_SET_POWER_STATE, parm); 551 + } 552 + } else if (spec->codec_type == VT1716S) { 553 + unsigned int mono_out, present; 554 + /* SW0 (17h) = stereo mixer */ 555 + imux_is_smixer = snd_hda_codec_read( 556 + codec, 0x17, 0, AC_VERB_GET_CONNECT_SEL, 0x00) == 5; 557 + /* inputs */ 558 + /* PW 1/2/5 (1ah/1bh/1eh) */ 559 + parm = AC_PWRST_D3; 560 + set_pin_power_state(codec, 0x1a, &parm); 561 + set_pin_power_state(codec, 0x1b, &parm); 562 + set_pin_power_state(codec, 0x1e, &parm); 563 + if (imux_is_smixer) 564 + parm = AC_PWRST_D0; 565 + /* SW0 (17h), AIW0(13h) */ 566 + snd_hda_codec_write(codec, 0x17, 0, AC_VERB_SET_POWER_STATE, 567 + parm); 568 + snd_hda_codec_write(codec, 0x13, 0, AC_VERB_SET_POWER_STATE, 569 + parm); 570 + 571 + parm = AC_PWRST_D3; 572 + set_pin_power_state(codec, 0x1e, &parm); 573 + /* PW11 (22h) */ 574 + if (spec->dmic_enabled) 575 + set_pin_power_state(codec, 0x22, &parm); 576 + else 577 + snd_hda_codec_write( 578 + codec, 0x22, 0, 579 + AC_VERB_SET_POWER_STATE, AC_PWRST_D3); 580 + 581 + /* SW2(26h), AIW1(14h) */ 582 + snd_hda_codec_write(codec, 0x26, 0, AC_VERB_SET_POWER_STATE, 583 + parm); 584 + snd_hda_codec_write(codec, 0x14, 0, AC_VERB_SET_POWER_STATE, 585 + parm); 586 + 587 + /* outputs */ 588 + /* PW0 (19h), SW1 (18h), AOW1 (11h) */ 589 + parm = AC_PWRST_D3; 590 + set_pin_power_state(codec, 0x19, &parm); 591 + /* Smart 5.1 PW2(1bh) */ 592 + if (spec->smart51_enabled) 593 + set_pin_power_state(codec, 0x1b, &parm); 594 + snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_POWER_STATE, 595 + parm); 596 + snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, 597 + parm); 598 + 599 + /* PW7 (23h), SW3 (27h), AOW3 (25h) */ 600 + parm = AC_PWRST_D3; 601 + set_pin_power_state(codec, 0x23, &parm); 602 + /* Smart 5.1 PW1(1ah) */ 603 + if (spec->smart51_enabled) 604 + set_pin_power_state(codec, 0x1a, &parm); 605 + snd_hda_codec_write(codec, 0x27, 0, AC_VERB_SET_POWER_STATE, 606 + parm); 607 + 608 + /* Smart 5.1 PW5(1eh) */ 609 + if (spec->smart51_enabled) 610 + set_pin_power_state(codec, 0x1e, &parm); 611 + snd_hda_codec_write(codec, 0x25, 0, AC_VERB_SET_POWER_STATE, 612 + parm); 613 + 614 + /* Mono out */ 615 + /* SW4(28h)->MW1(29h)-> PW12 (2ah)*/ 616 + present = snd_hda_jack_detect(codec, 0x1c); 617 + if (present) 618 + mono_out = 0; 619 + else { 620 + present = snd_hda_jack_detect(codec, 0x1d); 621 + if (!spec->hp_independent_mode && present) 622 + mono_out = 0; 623 + else 624 + mono_out = 1; 625 + } 626 + parm = mono_out ? AC_PWRST_D0 : AC_PWRST_D3; 627 + snd_hda_codec_write(codec, 0x28, 0, AC_VERB_SET_POWER_STATE, 628 + parm); 629 + snd_hda_codec_write(codec, 0x29, 0, AC_VERB_SET_POWER_STATE, 630 + parm); 631 + snd_hda_codec_write(codec, 0x2a, 0, AC_VERB_SET_POWER_STATE, 632 + parm); 633 + 634 + /* PW 3/4 (1ch/1dh) */ 635 + parm = AC_PWRST_D3; 636 + set_pin_power_state(codec, 0x1c, &parm); 637 + set_pin_power_state(codec, 0x1d, &parm); 638 + /* HP Independent Mode, power on AOW3 */ 639 + if (spec->hp_independent_mode) 640 + snd_hda_codec_write(codec, 0x25, 0, 641 + AC_VERB_SET_POWER_STATE, parm); 642 + 643 + /* force to D0 for internal Speaker */ 644 + /* MW0 (16h), AOW0 (10h) */ 645 + snd_hda_codec_write(codec, 0x16, 0, AC_VERB_SET_POWER_STATE, 646 + imux_is_smixer ? AC_PWRST_D0 : parm); 647 + snd_hda_codec_write(codec, 0x10, 0, AC_VERB_SET_POWER_STATE, 648 + mono_out ? AC_PWRST_D0 : parm); 649 + } else if (spec->codec_type == VT2002P) { 650 + unsigned int present; 651 + /* MUX9 (1eh) = stereo mixer */ 652 + imux_is_smixer = snd_hda_codec_read( 653 + codec, 0x1e, 0, AC_VERB_GET_CONNECT_SEL, 0x00) == 3; 654 + /* inputs */ 655 + /* PW 5/6/7 (29h/2ah/2bh) */ 656 + parm = AC_PWRST_D3; 657 + set_pin_power_state(codec, 0x29, &parm); 658 + set_pin_power_state(codec, 0x2a, &parm); 659 + set_pin_power_state(codec, 0x2b, &parm); 660 + if (imux_is_smixer) 661 + parm = AC_PWRST_D0; 662 + /* MUX9/10 (1eh/1fh), AIW 0/1 (10h/11h) */ 663 + snd_hda_codec_write(codec, 0x1e, 0, 664 + AC_VERB_SET_POWER_STATE, parm); 665 + snd_hda_codec_write(codec, 0x1f, 0, 666 + AC_VERB_SET_POWER_STATE, parm); 667 + snd_hda_codec_write(codec, 0x10, 0, 668 + AC_VERB_SET_POWER_STATE, parm); 669 + snd_hda_codec_write(codec, 0x11, 0, 670 + AC_VERB_SET_POWER_STATE, parm); 671 + 672 + /* outputs */ 673 + /* AOW0 (8h)*/ 674 + snd_hda_codec_write(codec, 0x8, 0, 675 + AC_VERB_SET_POWER_STATE, AC_PWRST_D0); 676 + 677 + /* PW4 (26h), MW4 (1ch), MUX4(37h) */ 678 + parm = AC_PWRST_D3; 679 + set_pin_power_state(codec, 0x26, &parm); 680 + snd_hda_codec_write(codec, 0x1c, 0, 681 + AC_VERB_SET_POWER_STATE, parm); 682 + snd_hda_codec_write(codec, 0x37, 683 + 0, AC_VERB_SET_POWER_STATE, parm); 684 + 685 + /* PW1 (25h), MW1 (19h), MUX1(35h), AOW1 (9h) */ 686 + parm = AC_PWRST_D3; 687 + set_pin_power_state(codec, 0x25, &parm); 688 + snd_hda_codec_write(codec, 0x19, 0, 689 + AC_VERB_SET_POWER_STATE, parm); 690 + snd_hda_codec_write(codec, 0x35, 0, 691 + AC_VERB_SET_POWER_STATE, parm); 692 + if (spec->hp_independent_mode) { 693 + snd_hda_codec_write(codec, 0x9, 0, 694 + AC_VERB_SET_POWER_STATE, parm); 695 + } 696 + 697 + /* Class-D */ 698 + /* PW0 (24h), MW0(18h), MUX0(34h) */ 699 + present = snd_hda_jack_detect(codec, 0x25); 700 + parm = AC_PWRST_D3; 701 + set_pin_power_state(codec, 0x24, &parm); 702 + if (present) { 703 + snd_hda_codec_write( 704 + codec, 0x18, 0, 705 + AC_VERB_SET_POWER_STATE, AC_PWRST_D3); 706 + snd_hda_codec_write( 707 + codec, 0x34, 0, 708 + AC_VERB_SET_POWER_STATE, AC_PWRST_D3); 709 + } else { 710 + snd_hda_codec_write( 711 + codec, 0x18, 0, 712 + AC_VERB_SET_POWER_STATE, AC_PWRST_D0); 713 + snd_hda_codec_write( 714 + codec, 0x34, 0, 715 + AC_VERB_SET_POWER_STATE, AC_PWRST_D0); 716 + } 717 + 718 + /* Mono Out */ 719 + /* PW15 (31h), MW8(17h), MUX8(3bh) */ 720 + present = snd_hda_jack_detect(codec, 0x26); 721 + parm = AC_PWRST_D3; 722 + set_pin_power_state(codec, 0x31, &parm); 723 + if (present) { 724 + snd_hda_codec_write( 725 + codec, 0x17, 0, 726 + AC_VERB_SET_POWER_STATE, AC_PWRST_D3); 727 + snd_hda_codec_write( 728 + codec, 0x3b, 0, 729 + AC_VERB_SET_POWER_STATE, AC_PWRST_D3); 730 + } else { 731 + snd_hda_codec_write( 732 + codec, 0x17, 0, 733 + AC_VERB_SET_POWER_STATE, AC_PWRST_D0); 734 + snd_hda_codec_write( 735 + codec, 0x3b, 0, 736 + AC_VERB_SET_POWER_STATE, AC_PWRST_D0); 737 + } 738 + 739 + /* MW9 (21h) */ 740 + if (imux_is_smixer || !is_aa_path_mute(codec)) 741 + snd_hda_codec_write( 742 + codec, 0x21, 0, 743 + AC_VERB_SET_POWER_STATE, AC_PWRST_D0); 744 + else 745 + snd_hda_codec_write( 746 + codec, 0x21, 0, 747 + AC_VERB_SET_POWER_STATE, AC_PWRST_D3); 748 + } else if (spec->codec_type == VT1812) { 749 + unsigned int present; 750 + /* MUX10 (1eh) = stereo mixer */ 751 + imux_is_smixer = snd_hda_codec_read( 752 + codec, 0x1e, 0, AC_VERB_GET_CONNECT_SEL, 0x00) == 5; 753 + /* inputs */ 754 + /* PW 5/6/7 (29h/2ah/2bh) */ 755 + parm = AC_PWRST_D3; 756 + set_pin_power_state(codec, 0x29, &parm); 757 + set_pin_power_state(codec, 0x2a, &parm); 758 + set_pin_power_state(codec, 0x2b, &parm); 759 + if (imux_is_smixer) 760 + parm = AC_PWRST_D0; 761 + /* MUX10/11 (1eh/1fh), AIW 0/1 (10h/11h) */ 762 + snd_hda_codec_write(codec, 0x1e, 0, 763 + AC_VERB_SET_POWER_STATE, parm); 764 + snd_hda_codec_write(codec, 0x1f, 0, 765 + AC_VERB_SET_POWER_STATE, parm); 766 + snd_hda_codec_write(codec, 0x10, 0, 767 + AC_VERB_SET_POWER_STATE, parm); 768 + snd_hda_codec_write(codec, 0x11, 0, 769 + AC_VERB_SET_POWER_STATE, parm); 770 + 771 + /* outputs */ 772 + /* AOW0 (8h)*/ 773 + snd_hda_codec_write(codec, 0x8, 0, 774 + AC_VERB_SET_POWER_STATE, AC_PWRST_D0); 775 + 776 + /* PW4 (28h), MW4 (18h), MUX4(38h) */ 777 + parm = AC_PWRST_D3; 778 + set_pin_power_state(codec, 0x28, &parm); 779 + snd_hda_codec_write(codec, 0x18, 0, 780 + AC_VERB_SET_POWER_STATE, parm); 781 + snd_hda_codec_write(codec, 0x38, 0, 782 + AC_VERB_SET_POWER_STATE, parm); 783 + 784 + /* PW1 (25h), MW1 (15h), MUX1(35h), AOW1 (9h) */ 785 + parm = AC_PWRST_D3; 786 + set_pin_power_state(codec, 0x25, &parm); 787 + snd_hda_codec_write(codec, 0x15, 0, 788 + AC_VERB_SET_POWER_STATE, parm); 789 + snd_hda_codec_write(codec, 0x35, 0, 790 + AC_VERB_SET_POWER_STATE, parm); 791 + if (spec->hp_independent_mode) { 792 + snd_hda_codec_write(codec, 0x9, 0, 793 + AC_VERB_SET_POWER_STATE, parm); 794 + } 795 + 796 + /* Internal Speaker */ 797 + /* PW0 (24h), MW0(14h), MUX0(34h) */ 798 + present = snd_hda_jack_detect(codec, 0x25); 799 + parm = AC_PWRST_D3; 800 + set_pin_power_state(codec, 0x24, &parm); 801 + if (present) { 802 + snd_hda_codec_write(codec, 0x14, 0, 803 + AC_VERB_SET_POWER_STATE, 804 + AC_PWRST_D3); 805 + snd_hda_codec_write(codec, 0x34, 0, 806 + AC_VERB_SET_POWER_STATE, 807 + AC_PWRST_D3); 808 + } else { 809 + snd_hda_codec_write(codec, 0x14, 0, 810 + AC_VERB_SET_POWER_STATE, 811 + AC_PWRST_D0); 812 + snd_hda_codec_write(codec, 0x34, 0, 813 + AC_VERB_SET_POWER_STATE, 814 + AC_PWRST_D0); 815 + } 816 + /* Mono Out */ 817 + /* PW13 (31h), MW13(1ch), MUX13(3ch), MW14(3eh) */ 818 + present = snd_hda_jack_detect(codec, 0x28); 819 + parm = AC_PWRST_D3; 820 + set_pin_power_state(codec, 0x31, &parm); 821 + if (present) { 822 + snd_hda_codec_write(codec, 0x1c, 0, 823 + AC_VERB_SET_POWER_STATE, 824 + AC_PWRST_D3); 825 + snd_hda_codec_write(codec, 0x3c, 0, 826 + AC_VERB_SET_POWER_STATE, 827 + AC_PWRST_D3); 828 + snd_hda_codec_write(codec, 0x3e, 0, 829 + AC_VERB_SET_POWER_STATE, 830 + AC_PWRST_D3); 831 + } else { 832 + snd_hda_codec_write(codec, 0x1c, 0, 833 + AC_VERB_SET_POWER_STATE, 834 + AC_PWRST_D0); 835 + snd_hda_codec_write(codec, 0x3c, 0, 836 + AC_VERB_SET_POWER_STATE, 837 + AC_PWRST_D0); 838 + snd_hda_codec_write(codec, 0x3e, 0, 839 + AC_VERB_SET_POWER_STATE, 840 + AC_PWRST_D0); 841 + } 842 + 843 + /* PW15 (33h), MW15 (1dh), MUX15(3dh) */ 844 + parm = AC_PWRST_D3; 845 + set_pin_power_state(codec, 0x33, &parm); 846 + snd_hda_codec_write(codec, 0x1d, 0, 847 + AC_VERB_SET_POWER_STATE, parm); 848 + snd_hda_codec_write(codec, 0x3d, 0, 849 + AC_VERB_SET_POWER_STATE, parm); 850 + 851 + /* MW9 (21h) */ 852 + if (imux_is_smixer || !is_aa_path_mute(codec)) 853 + snd_hda_codec_write( 854 + codec, 0x21, 0, 855 + AC_VERB_SET_POWER_STATE, AC_PWRST_D0); 856 + else 857 + snd_hda_codec_write( 858 + codec, 0x21, 0, 859 + AC_VERB_SET_POWER_STATE, AC_PWRST_D3); 860 + } 861 + } 862 + 539 863 /* 540 864 * input MUX handling 541 865 */ ··· 1063 395 1064 396 if (!spec->mux_nids[adc_idx]) 1065 397 return -EINVAL; 398 + /* switch to D0 beofre change index */ 399 + if (snd_hda_codec_read(codec, spec->mux_nids[adc_idx], 0, 400 + AC_VERB_GET_POWER_STATE, 0x00) != AC_PWRST_D0) 401 + snd_hda_codec_write(codec, spec->mux_nids[adc_idx], 0, 402 + AC_VERB_SET_POWER_STATE, AC_PWRST_D0); 403 + /* update jack power state */ 404 + set_jack_power_state(codec); 405 + 1066 406 return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol, 1067 407 spec->mux_nids[adc_idx], 1068 408 &spec->cur_mux[adc_idx]); ··· 1089 413 { 1090 414 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 1091 415 struct via_spec *spec = codec->spec; 1092 - hda_nid_t nid = spec->autocfg.hp_pins[0]; 1093 - unsigned int pinsel = snd_hda_codec_read(codec, nid, 0, 1094 - AC_VERB_GET_CONNECT_SEL, 1095 - 0x00); 416 + hda_nid_t nid; 417 + unsigned int pinsel; 1096 418 419 + switch (spec->codec_type) { 420 + case VT1718S: 421 + nid = 0x34; 422 + break; 423 + case VT2002P: 424 + nid = 0x35; 425 + break; 426 + case VT1812: 427 + nid = 0x3d; 428 + break; 429 + default: 430 + nid = spec->autocfg.hp_pins[0]; 431 + break; 432 + } 433 + /* use !! to translate conn sel 2 for VT1718S */ 434 + pinsel = !!snd_hda_codec_read(codec, nid, 0, 435 + AC_VERB_GET_CONNECT_SEL, 436 + 0x00); 1097 437 ucontrol->value.enumerated.item[0] = pinsel; 1098 438 439 + return 0; 440 + } 441 + 442 + static void activate_ctl(struct hda_codec *codec, const char *name, int active) 443 + { 444 + struct snd_kcontrol *ctl = snd_hda_find_mixer_ctl(codec, name); 445 + if (ctl) { 446 + ctl->vd[0].access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE; 447 + ctl->vd[0].access |= active 448 + ? 0 : SNDRV_CTL_ELEM_ACCESS_INACTIVE; 449 + snd_ctl_notify(codec->bus->card, 450 + SNDRV_CTL_EVENT_MASK_VALUE, &ctl->id); 451 + } 452 + } 453 + 454 + static int update_side_mute_status(struct hda_codec *codec) 455 + { 456 + /* mute side channel */ 457 + struct via_spec *spec = codec->spec; 458 + unsigned int parm = spec->hp_independent_mode 459 + ? AMP_OUT_MUTE : AMP_OUT_UNMUTE; 460 + hda_nid_t sw3; 461 + 462 + switch (spec->codec_type) { 463 + case VT1708: 464 + sw3 = 0x1b; 465 + break; 466 + case VT1709_10CH: 467 + sw3 = 0x29; 468 + break; 469 + case VT1708B_8CH: 470 + case VT1708S: 471 + sw3 = 0x27; 472 + break; 473 + default: 474 + sw3 = 0; 475 + break; 476 + } 477 + 478 + if (sw3) 479 + snd_hda_codec_write(codec, sw3, 0, AC_VERB_SET_AMP_GAIN_MUTE, 480 + parm); 1099 481 return 0; 1100 482 } 1101 483 ··· 1164 430 struct via_spec *spec = codec->spec; 1165 431 hda_nid_t nid = spec->autocfg.hp_pins[0]; 1166 432 unsigned int pinsel = ucontrol->value.enumerated.item[0]; 1167 - unsigned int con_nid = snd_hda_codec_read(codec, nid, 0, 1168 - AC_VERB_GET_CONNECT_LIST, 0) & 0xff; 433 + /* Get Independent Mode index of headphone pin widget */ 434 + spec->hp_independent_mode = spec->hp_independent_mode_index == pinsel 435 + ? 1 : 0; 1169 436 1170 - if (con_nid == spec->multiout.hp_nid) { 1171 - if (pinsel == 0) { 1172 - if (!spec->hp_independent_mode) { 1173 - if (spec->multiout.num_dacs > 1) 1174 - spec->multiout.num_dacs -= 1; 1175 - spec->hp_independent_mode = 1; 1176 - } 1177 - } else if (pinsel == 1) { 1178 - if (spec->hp_independent_mode) { 1179 - if (spec->multiout.num_dacs > 1) 1180 - spec->multiout.num_dacs += 1; 1181 - spec->hp_independent_mode = 0; 1182 - } 1183 - } 1184 - } else { 1185 - if (pinsel == 0) { 1186 - if (spec->hp_independent_mode) { 1187 - if (spec->multiout.num_dacs > 1) 1188 - spec->multiout.num_dacs += 1; 1189 - spec->hp_independent_mode = 0; 1190 - } 1191 - } else if (pinsel == 1) { 1192 - if (!spec->hp_independent_mode) { 1193 - if (spec->multiout.num_dacs > 1) 1194 - spec->multiout.num_dacs -= 1; 1195 - spec->hp_independent_mode = 1; 1196 - } 1197 - } 437 + switch (spec->codec_type) { 438 + case VT1718S: 439 + nid = 0x34; 440 + pinsel = pinsel ? 2 : 0; /* indep HP use AOW4 (index 2) */ 441 + spec->multiout.num_dacs = 4; 442 + break; 443 + case VT2002P: 444 + nid = 0x35; 445 + break; 446 + case VT1812: 447 + nid = 0x3d; 448 + break; 449 + default: 450 + nid = spec->autocfg.hp_pins[0]; 451 + break; 1198 452 } 1199 - snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, 1200 - pinsel); 453 + snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, pinsel); 1201 454 1202 - if (spec->multiout.hp_nid && 1203 - spec->multiout.hp_nid != spec->multiout.dac_nids[HDA_FRONT]) 1204 - snd_hda_codec_setup_stream(codec, 1205 - spec->multiout.hp_nid, 1206 - 0, 0, 0); 455 + if (spec->multiout.hp_nid && spec->multiout.hp_nid 456 + != spec->multiout.dac_nids[HDA_FRONT]) 457 + snd_hda_codec_setup_stream(codec, spec->multiout.hp_nid, 458 + 0, 0, 0); 1207 459 460 + update_side_mute_status(codec); 461 + /* update HP volume/swtich active state */ 462 + if (spec->codec_type == VT1708S 463 + || spec->codec_type == VT1702 464 + || spec->codec_type == VT1718S 465 + || spec->codec_type == VT1716S 466 + || spec->codec_type == VT2002P 467 + || spec->codec_type == VT1812) { 468 + activate_ctl(codec, "Headphone Playback Volume", 469 + spec->hp_independent_mode); 470 + activate_ctl(codec, "Headphone Playback Switch", 471 + spec->hp_independent_mode); 472 + } 1208 473 return 0; 1209 474 } 1210 475 ··· 1217 484 .put = via_independent_hp_put, 1218 485 }, 1219 486 { } /* end */ 487 + }; 488 + 489 + static void notify_aa_path_ctls(struct hda_codec *codec) 490 + { 491 + int i; 492 + struct snd_ctl_elem_id id; 493 + const char *labels[] = {"Mic", "Front Mic", "Line"}; 494 + 495 + memset(&id, 0, sizeof(id)); 496 + id.iface = SNDRV_CTL_ELEM_IFACE_MIXER; 497 + for (i = 0; i < ARRAY_SIZE(labels); i++) { 498 + sprintf(id.name, "%s Playback Volume", labels[i]); 499 + snd_ctl_notify(codec->bus->card, SNDRV_CTL_EVENT_MASK_VALUE, 500 + &id); 501 + } 502 + } 503 + 504 + static void mute_aa_path(struct hda_codec *codec, int mute) 505 + { 506 + struct via_spec *spec = codec->spec; 507 + hda_nid_t nid_mixer; 508 + int start_idx; 509 + int end_idx; 510 + int i; 511 + /* get nid of MW0 and start & end index */ 512 + switch (spec->codec_type) { 513 + case VT1708: 514 + nid_mixer = 0x17; 515 + start_idx = 2; 516 + end_idx = 4; 517 + break; 518 + case VT1709_10CH: 519 + case VT1709_6CH: 520 + nid_mixer = 0x18; 521 + start_idx = 2; 522 + end_idx = 4; 523 + break; 524 + case VT1708B_8CH: 525 + case VT1708B_4CH: 526 + case VT1708S: 527 + case VT1716S: 528 + nid_mixer = 0x16; 529 + start_idx = 2; 530 + end_idx = 4; 531 + break; 532 + default: 533 + return; 534 + } 535 + /* check AA path's mute status */ 536 + for (i = start_idx; i <= end_idx; i++) { 537 + int val = mute ? HDA_AMP_MUTE : HDA_AMP_UNMUTE; 538 + snd_hda_codec_amp_stereo(codec, nid_mixer, HDA_INPUT, i, 539 + HDA_AMP_MUTE, val); 540 + } 541 + } 542 + static int is_smart51_pins(struct via_spec *spec, hda_nid_t pin) 543 + { 544 + int res = 0; 545 + int index; 546 + for (index = AUTO_PIN_MIC; index < AUTO_PIN_FRONT_LINE; index++) { 547 + if (pin == spec->autocfg.input_pins[index]) { 548 + res = 1; 549 + break; 550 + } 551 + } 552 + return res; 553 + } 554 + 555 + static int via_smart51_info(struct snd_kcontrol *kcontrol, 556 + struct snd_ctl_elem_info *uinfo) 557 + { 558 + uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; 559 + uinfo->count = 1; 560 + uinfo->value.integer.min = 0; 561 + uinfo->value.integer.max = 1; 562 + return 0; 563 + } 564 + 565 + static int via_smart51_get(struct snd_kcontrol *kcontrol, 566 + struct snd_ctl_elem_value *ucontrol) 567 + { 568 + struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 569 + struct via_spec *spec = codec->spec; 570 + int index[] = { AUTO_PIN_MIC, AUTO_PIN_FRONT_MIC, AUTO_PIN_LINE }; 571 + int on = 1; 572 + int i; 573 + 574 + for (i = 0; i < ARRAY_SIZE(index); i++) { 575 + hda_nid_t nid = spec->autocfg.input_pins[index[i]]; 576 + if (nid) { 577 + int ctl = 578 + snd_hda_codec_read(codec, nid, 0, 579 + AC_VERB_GET_PIN_WIDGET_CONTROL, 580 + 0); 581 + if (i == AUTO_PIN_FRONT_MIC 582 + && spec->hp_independent_mode 583 + && spec->codec_type != VT1718S) 584 + continue; /* ignore FMic for independent HP */ 585 + if (ctl & AC_PINCTL_IN_EN 586 + && !(ctl & AC_PINCTL_OUT_EN)) 587 + on = 0; 588 + } 589 + } 590 + *ucontrol->value.integer.value = on; 591 + return 0; 592 + } 593 + 594 + static int via_smart51_put(struct snd_kcontrol *kcontrol, 595 + struct snd_ctl_elem_value *ucontrol) 596 + { 597 + struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 598 + struct via_spec *spec = codec->spec; 599 + int out_in = *ucontrol->value.integer.value 600 + ? AC_PINCTL_OUT_EN : AC_PINCTL_IN_EN; 601 + int index[] = { AUTO_PIN_MIC, AUTO_PIN_FRONT_MIC, AUTO_PIN_LINE }; 602 + int i; 603 + 604 + for (i = 0; i < ARRAY_SIZE(index); i++) { 605 + hda_nid_t nid = spec->autocfg.input_pins[index[i]]; 606 + if (i == AUTO_PIN_FRONT_MIC 607 + && spec->hp_independent_mode 608 + && spec->codec_type != VT1718S) 609 + continue; /* don't retask FMic for independent HP */ 610 + if (nid) { 611 + unsigned int parm = snd_hda_codec_read( 612 + codec, nid, 0, 613 + AC_VERB_GET_PIN_WIDGET_CONTROL, 0); 614 + parm &= ~(AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN); 615 + parm |= out_in; 616 + snd_hda_codec_write(codec, nid, 0, 617 + AC_VERB_SET_PIN_WIDGET_CONTROL, 618 + parm); 619 + if (out_in == AC_PINCTL_OUT_EN) { 620 + mute_aa_path(codec, 1); 621 + notify_aa_path_ctls(codec); 622 + } 623 + if (spec->codec_type == VT1718S) 624 + snd_hda_codec_amp_stereo( 625 + codec, nid, HDA_OUTPUT, 0, HDA_AMP_MUTE, 626 + HDA_AMP_UNMUTE); 627 + } 628 + if (i == AUTO_PIN_FRONT_MIC) { 629 + if (spec->codec_type == VT1708S 630 + || spec->codec_type == VT1716S) { 631 + /* input = index 1 (AOW3) */ 632 + snd_hda_codec_write( 633 + codec, nid, 0, 634 + AC_VERB_SET_CONNECT_SEL, 1); 635 + snd_hda_codec_amp_stereo( 636 + codec, nid, HDA_OUTPUT, 637 + 0, HDA_AMP_MUTE, HDA_AMP_UNMUTE); 638 + } 639 + } 640 + } 641 + spec->smart51_enabled = *ucontrol->value.integer.value; 642 + set_jack_power_state(codec); 643 + return 1; 644 + } 645 + 646 + static struct snd_kcontrol_new via_smart51_mixer[] = { 647 + { 648 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 649 + .name = "Smart 5.1", 650 + .count = 1, 651 + .info = via_smart51_info, 652 + .get = via_smart51_get, 653 + .put = via_smart51_put, 654 + }, 655 + {} /* end */ 1220 656 }; 1221 657 1222 658 /* capture mixer elements */ ··· 1408 506 }, 1409 507 { } /* end */ 1410 508 }; 509 + 510 + /* check AA path's mute statue */ 511 + static int is_aa_path_mute(struct hda_codec *codec) 512 + { 513 + int mute = 1; 514 + hda_nid_t nid_mixer; 515 + int start_idx; 516 + int end_idx; 517 + int i; 518 + struct via_spec *spec = codec->spec; 519 + /* get nid of MW0 and start & end index */ 520 + switch (spec->codec_type) { 521 + case VT1708B_8CH: 522 + case VT1708B_4CH: 523 + case VT1708S: 524 + case VT1716S: 525 + nid_mixer = 0x16; 526 + start_idx = 2; 527 + end_idx = 4; 528 + break; 529 + case VT1702: 530 + nid_mixer = 0x1a; 531 + start_idx = 1; 532 + end_idx = 3; 533 + break; 534 + case VT1718S: 535 + nid_mixer = 0x21; 536 + start_idx = 1; 537 + end_idx = 3; 538 + break; 539 + case VT2002P: 540 + case VT1812: 541 + nid_mixer = 0x21; 542 + start_idx = 0; 543 + end_idx = 2; 544 + break; 545 + default: 546 + return 0; 547 + } 548 + /* check AA path's mute status */ 549 + for (i = start_idx; i <= end_idx; i++) { 550 + unsigned int con_list = snd_hda_codec_read( 551 + codec, nid_mixer, 0, AC_VERB_GET_CONNECT_LIST, i/4*4); 552 + int shift = 8 * (i % 4); 553 + hda_nid_t nid_pin = (con_list & (0xff << shift)) >> shift; 554 + unsigned int defconf = snd_hda_codec_get_pincfg(codec, nid_pin); 555 + if (get_defcfg_connect(defconf) == AC_JACK_PORT_COMPLEX) { 556 + /* check mute status while the pin is connected */ 557 + int mute_l = snd_hda_codec_amp_read(codec, nid_mixer, 0, 558 + HDA_INPUT, i) >> 7; 559 + int mute_r = snd_hda_codec_amp_read(codec, nid_mixer, 1, 560 + HDA_INPUT, i) >> 7; 561 + if (!mute_l || !mute_r) { 562 + mute = 0; 563 + break; 564 + } 565 + } 566 + } 567 + return mute; 568 + } 569 + 570 + /* enter/exit analog low-current mode */ 571 + static void analog_low_current_mode(struct hda_codec *codec, int stream_idle) 572 + { 573 + struct via_spec *spec = codec->spec; 574 + static int saved_stream_idle = 1; /* saved stream idle status */ 575 + int enable = is_aa_path_mute(codec); 576 + unsigned int verb = 0; 577 + unsigned int parm = 0; 578 + 579 + if (stream_idle == -1) /* stream status did not change */ 580 + enable = enable && saved_stream_idle; 581 + else { 582 + enable = enable && stream_idle; 583 + saved_stream_idle = stream_idle; 584 + } 585 + 586 + /* decide low current mode's verb & parameter */ 587 + switch (spec->codec_type) { 588 + case VT1708B_8CH: 589 + case VT1708B_4CH: 590 + verb = 0xf70; 591 + parm = enable ? 0x02 : 0x00; /* 0x02: 2/3x, 0x00: 1x */ 592 + break; 593 + case VT1708S: 594 + case VT1718S: 595 + case VT1716S: 596 + verb = 0xf73; 597 + parm = enable ? 0x51 : 0xe1; /* 0x51: 4/28x, 0xe1: 1x */ 598 + break; 599 + case VT1702: 600 + verb = 0xf73; 601 + parm = enable ? 0x01 : 0x1d; /* 0x01: 4/40x, 0x1d: 1x */ 602 + break; 603 + case VT2002P: 604 + case VT1812: 605 + verb = 0xf93; 606 + parm = enable ? 0x00 : 0xe0; /* 0x00: 4/40x, 0xe0: 1x */ 607 + break; 608 + default: 609 + return; /* other codecs are not supported */ 610 + } 611 + /* send verb */ 612 + snd_hda_codec_write(codec, codec->afg, 0, verb, parm); 613 + } 614 + 1411 615 /* 1412 616 * generic initialization of ADC, input mixers and output mixers 1413 617 */ ··· 1542 534 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 1543 535 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 1544 536 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 1545 - 1546 - /* Setup default input to PW4 */ 1547 - {0x20, AC_VERB_SET_CONNECT_SEL, 0x1}, 537 + 538 + /* Setup default input MW0 to PW4 */ 539 + {0x20, AC_VERB_SET_CONNECT_SEL, 0}, 1548 540 /* PW9 Output enable */ 1549 541 {0x25, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, 1550 542 { } ··· 1555 547 struct snd_pcm_substream *substream) 1556 548 { 1557 549 struct via_spec *spec = codec->spec; 550 + int idle = substream->pstr->substream_opened == 1 551 + && substream->ref_count == 0; 552 + analog_low_current_mode(codec, idle); 1558 553 return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream, 1559 554 hinfo); 1560 555 } 1561 - 1562 - static int via_playback_pcm_prepare(struct hda_pcm_stream *hinfo, 1563 - struct hda_codec *codec, 1564 - unsigned int stream_tag, 1565 - unsigned int format, 1566 - struct snd_pcm_substream *substream) 1567 - { 1568 - struct via_spec *spec = codec->spec; 1569 - return snd_hda_multi_out_analog_prepare(codec, &spec->multiout, 1570 - stream_tag, format, substream); 1571 - } 1572 - 1573 - static int via_playback_pcm_cleanup(struct hda_pcm_stream *hinfo, 1574 - struct hda_codec *codec, 1575 - struct snd_pcm_substream *substream) 1576 - { 1577 - struct via_spec *spec = codec->spec; 1578 - return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout); 1579 - } 1580 - 1581 556 1582 557 static void playback_multi_pcm_prep_0(struct hda_codec *codec, 1583 558 unsigned int stream_tag, ··· 1606 615 snd_hda_codec_setup_stream(codec, nids[HDA_FRONT], stream_tag, 1607 616 0, format); 1608 617 1609 - if (mout->hp_nid && mout->hp_nid != nids[HDA_FRONT] && 1610 - !spec->hp_independent_mode) 618 + if (mout->hp_nid && mout->hp_nid != nids[HDA_FRONT] 619 + && !spec->hp_independent_mode) 1611 620 /* headphone out will just decode front left/right (stereo) */ 1612 621 snd_hda_codec_setup_stream(codec, mout->hp_nid, stream_tag, 1613 622 0, format); ··· 1649 658 snd_hda_codec_setup_stream(codec, mout->hp_nid, 1650 659 stream_tag, 0, format); 1651 660 } 1652 - 661 + vt1708_start_hp_work(spec); 1653 662 return 0; 1654 663 } 1655 664 ··· 1689 698 snd_hda_codec_setup_stream(codec, mout->hp_nid, 1690 699 0, 0, 0); 1691 700 } 1692 - 701 + vt1708_stop_hp_work(spec); 1693 702 return 0; 1694 703 } 1695 704 ··· 1770 779 }; 1771 780 1772 781 static struct hda_pcm_stream vt1708_pcm_analog_s16_playback = { 1773 - .substreams = 1, 782 + .substreams = 2, 1774 783 .channels_min = 2, 1775 784 .channels_max = 8, 1776 785 .nid = 0x10, /* NID to query formats and rates */ ··· 1781 790 .formats = SNDRV_PCM_FMTBIT_S16_LE, 1782 791 .ops = { 1783 792 .open = via_playback_pcm_open, 1784 - .prepare = via_playback_pcm_prepare, 1785 - .cleanup = via_playback_pcm_cleanup 793 + .prepare = via_playback_multi_pcm_prepare, 794 + .cleanup = via_playback_multi_pcm_cleanup 1786 795 }, 1787 796 }; 1788 797 ··· 1844 853 if (err < 0) 1845 854 return err; 1846 855 } 856 + 857 + /* init power states */ 858 + set_jack_power_state(codec); 859 + analog_low_current_mode(codec, 1); 860 + 1847 861 via_free_kctls(codec); /* no longer needed */ 1848 862 return 0; 1849 863 } ··· 1862 866 codec->pcm_info = info; 1863 867 1864 868 info->name = spec->stream_name_analog; 1865 - info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_analog_playback); 1866 - info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0]; 869 + info->stream[SNDRV_PCM_STREAM_PLAYBACK] = 870 + *(spec->stream_analog_playback); 871 + info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 872 + spec->multiout.dac_nids[0]; 1867 873 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_analog_capture); 1868 874 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0]; 1869 875 ··· 1902 904 return; 1903 905 1904 906 via_free_kctls(codec); 907 + vt1708_stop_hp_work(spec); 1905 908 kfree(codec->spec); 1906 909 } 1907 910 1908 911 /* mute internal speaker if HP is plugged */ 1909 912 static void via_hp_automute(struct hda_codec *codec) 1910 913 { 1911 - unsigned int present; 914 + unsigned int present = 0; 1912 915 struct via_spec *spec = codec->spec; 1913 916 1914 - present = snd_hda_codec_read(codec, spec->autocfg.hp_pins[0], 0, 1915 - AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; 1916 - snd_hda_codec_amp_stereo(codec, spec->autocfg.line_out_pins[0], 1917 - HDA_OUTPUT, 0, HDA_AMP_MUTE, 1918 - present ? HDA_AMP_MUTE : 0); 917 + present = snd_hda_jack_detect(codec, spec->autocfg.hp_pins[0]); 918 + 919 + if (!spec->hp_independent_mode) { 920 + struct snd_ctl_elem_id id; 921 + /* auto mute */ 922 + snd_hda_codec_amp_stereo( 923 + codec, spec->autocfg.line_out_pins[0], HDA_OUTPUT, 0, 924 + HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 925 + /* notify change */ 926 + memset(&id, 0, sizeof(id)); 927 + id.iface = SNDRV_CTL_ELEM_IFACE_MIXER; 928 + strcpy(id.name, "Front Playback Switch"); 929 + snd_ctl_notify(codec->bus->card, SNDRV_CTL_EVENT_MASK_VALUE, 930 + &id); 931 + } 932 + } 933 + 934 + /* mute mono out if HP or Line out is plugged */ 935 + static void via_mono_automute(struct hda_codec *codec) 936 + { 937 + unsigned int hp_present, lineout_present; 938 + struct via_spec *spec = codec->spec; 939 + 940 + if (spec->codec_type != VT1716S) 941 + return; 942 + 943 + lineout_present = snd_hda_jack_detect(codec, 944 + spec->autocfg.line_out_pins[0]); 945 + 946 + /* Mute Mono Out if Line Out is plugged */ 947 + if (lineout_present) { 948 + snd_hda_codec_amp_stereo( 949 + codec, 0x2A, HDA_OUTPUT, 0, HDA_AMP_MUTE, HDA_AMP_MUTE); 950 + return; 951 + } 952 + 953 + hp_present = snd_hda_jack_detect(codec, spec->autocfg.hp_pins[0]); 954 + 955 + if (!spec->hp_independent_mode) 956 + snd_hda_codec_amp_stereo( 957 + codec, 0x2A, HDA_OUTPUT, 0, HDA_AMP_MUTE, 958 + hp_present ? HDA_AMP_MUTE : 0); 1919 959 } 1920 960 1921 961 static void via_gpio_control(struct hda_codec *codec) ··· 2004 968 } 2005 969 } 2006 970 971 + /* mute Internal-Speaker if HP is plugged */ 972 + static void via_speaker_automute(struct hda_codec *codec) 973 + { 974 + unsigned int hp_present; 975 + struct via_spec *spec = codec->spec; 976 + 977 + if (spec->codec_type != VT2002P && spec->codec_type != VT1812) 978 + return; 979 + 980 + hp_present = snd_hda_jack_detect(codec, spec->autocfg.hp_pins[0]); 981 + 982 + if (!spec->hp_independent_mode) { 983 + struct snd_ctl_elem_id id; 984 + snd_hda_codec_amp_stereo( 985 + codec, spec->autocfg.speaker_pins[0], HDA_OUTPUT, 0, 986 + HDA_AMP_MUTE, hp_present ? HDA_AMP_MUTE : 0); 987 + /* notify change */ 988 + memset(&id, 0, sizeof(id)); 989 + id.iface = SNDRV_CTL_ELEM_IFACE_MIXER; 990 + strcpy(id.name, "Speaker Playback Switch"); 991 + snd_ctl_notify(codec->bus->card, SNDRV_CTL_EVENT_MASK_VALUE, 992 + &id); 993 + } 994 + } 995 + 996 + /* mute line-out and internal speaker if HP is plugged */ 997 + static void via_hp_bind_automute(struct hda_codec *codec) 998 + { 999 + /* use long instead of int below just to avoid an internal compiler 1000 + * error with gcc 4.0.x 1001 + */ 1002 + unsigned long hp_present, present = 0; 1003 + struct via_spec *spec = codec->spec; 1004 + int i; 1005 + 1006 + if (!spec->autocfg.hp_pins[0] || !spec->autocfg.line_out_pins[0]) 1007 + return; 1008 + 1009 + hp_present = snd_hda_jack_detect(codec, spec->autocfg.hp_pins[0]); 1010 + 1011 + present = snd_hda_jack_detect(codec, spec->autocfg.line_out_pins[0]); 1012 + 1013 + if (!spec->hp_independent_mode) { 1014 + /* Mute Line-Outs */ 1015 + for (i = 0; i < spec->autocfg.line_outs; i++) 1016 + snd_hda_codec_amp_stereo( 1017 + codec, spec->autocfg.line_out_pins[i], 1018 + HDA_OUTPUT, 0, 1019 + HDA_AMP_MUTE, hp_present ? HDA_AMP_MUTE : 0); 1020 + if (hp_present) 1021 + present = hp_present; 1022 + } 1023 + /* Speakers */ 1024 + for (i = 0; i < spec->autocfg.speaker_outs; i++) 1025 + snd_hda_codec_amp_stereo( 1026 + codec, spec->autocfg.speaker_pins[i], HDA_OUTPUT, 0, 1027 + HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0); 1028 + } 1029 + 1030 + 2007 1031 /* unsolicited event for jack sensing */ 2008 1032 static void via_unsol_event(struct hda_codec *codec, 2009 1033 unsigned int res) 2010 1034 { 2011 1035 res >>= 26; 2012 - if (res == VIA_HP_EVENT) 1036 + if (res & VIA_HP_EVENT) 2013 1037 via_hp_automute(codec); 2014 - else if (res == VIA_GPIO_EVENT) 1038 + if (res & VIA_GPIO_EVENT) 2015 1039 via_gpio_control(codec); 1040 + if (res & VIA_JACK_EVENT) 1041 + set_jack_power_state(codec); 1042 + if (res & VIA_MONO_EVENT) 1043 + via_mono_automute(codec); 1044 + if (res & VIA_SPEAKER_EVENT) 1045 + via_speaker_automute(codec); 1046 + if (res & VIA_BIND_HP_EVENT) 1047 + via_hp_bind_automute(codec); 2016 1048 } 2017 1049 2018 1050 static int via_init(struct hda_codec *codec) ··· 2090 986 for (i = 0; i < spec->num_iverbs; i++) 2091 987 snd_hda_sequence_write(codec, spec->init_verbs[i]); 2092 988 989 + spec->codec_type = get_codec_type(codec); 990 + if (spec->codec_type == VT1708BCE) 991 + spec->codec_type = VT1708S; /* VT1708BCE & VT1708S are almost 992 + same */ 2093 993 /* Lydia Add for EAPD enable */ 2094 994 if (!spec->dig_in_nid) { /* No Digital In connection */ 2095 995 if (spec->dig_in_pin) { ··· 2111 1003 if (spec->slave_dig_outs[0]) 2112 1004 codec->slave_dig_outs = spec->slave_dig_outs; 2113 1005 2114 - return 0; 1006 + return 0; 2115 1007 } 1008 + 1009 + #ifdef SND_HDA_NEEDS_RESUME 1010 + static int via_suspend(struct hda_codec *codec, pm_message_t state) 1011 + { 1012 + struct via_spec *spec = codec->spec; 1013 + vt1708_stop_hp_work(spec); 1014 + return 0; 1015 + } 1016 + #endif 2116 1017 2117 1018 #ifdef CONFIG_SND_HDA_POWER_SAVE 2118 1019 static int via_check_power_status(struct hda_codec *codec, hda_nid_t nid) ··· 2138 1021 .build_pcms = via_build_pcms, 2139 1022 .init = via_init, 2140 1023 .free = via_free, 1024 + #ifdef SND_HDA_NEEDS_RESUME 1025 + .suspend = via_suspend, 1026 + #endif 2141 1027 #ifdef CONFIG_SND_HDA_POWER_SAVE 2142 1028 .check_power_status = via_check_power_status, 2143 1029 #endif ··· 2156 1036 spec->multiout.num_dacs = cfg->line_outs; 2157 1037 2158 1038 spec->multiout.dac_nids = spec->private_dac_nids; 2159 - 2160 - for(i = 0; i < 4; i++) { 1039 + 1040 + for (i = 0; i < 4; i++) { 2161 1041 nid = cfg->line_out_pins[i]; 2162 1042 if (nid) { 2163 1043 /* config dac list */ ··· 2187 1067 { 2188 1068 char name[32]; 2189 1069 static const char *chname[4] = { "Front", "Surround", "C/LFE", "Side" }; 2190 - hda_nid_t nid, nid_vol = 0; 1070 + hda_nid_t nid, nid_vol, nid_vols[] = {0x17, 0x19, 0x1a, 0x1b}; 2191 1071 int i, err; 2192 1072 2193 1073 for (i = 0; i <= AUTO_SEQ_SIDE; i++) { ··· 2195 1075 2196 1076 if (!nid) 2197 1077 continue; 2198 - 2199 - if (i != AUTO_SEQ_FRONT) 2200 - nid_vol = 0x18 + i; 1078 + 1079 + nid_vol = nid_vols[i]; 2201 1080 2202 1081 if (i == AUTO_SEQ_CENLFE) { 2203 1082 /* Center/LFE */ ··· 2224 1105 HDA_OUTPUT)); 2225 1106 if (err < 0) 2226 1107 return err; 2227 - } else if (i == AUTO_SEQ_FRONT){ 1108 + } else if (i == AUTO_SEQ_FRONT) { 2228 1109 /* add control to mixer index 0 */ 2229 1110 err = via_add_control(spec, VIA_CTL_WIDGET_VOL, 2230 1111 "Master Front Playback Volume", 2231 - HDA_COMPOSE_AMP_VAL(0x17, 3, 0, 1112 + HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, 2232 1113 HDA_INPUT)); 2233 1114 if (err < 0) 2234 1115 return err; 2235 1116 err = via_add_control(spec, VIA_CTL_WIDGET_MUTE, 2236 1117 "Master Front Playback Switch", 2237 - HDA_COMPOSE_AMP_VAL(0x17, 3, 0, 1118 + HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, 2238 1119 HDA_INPUT)); 2239 1120 if (err < 0) 2240 1121 return err; 2241 - 1122 + 2242 1123 /* add control to PW3 */ 2243 1124 sprintf(name, "%s Playback Volume", chname[i]); 2244 1125 err = via_add_control(spec, VIA_CTL_WIDGET_VOL, name, ··· 2297 1178 return 0; 2298 1179 2299 1180 spec->multiout.hp_nid = VT1708_HP_NID; /* AOW3 */ 1181 + spec->hp_independent_mode_index = 1; 2300 1182 2301 1183 err = via_add_control(spec, VIA_CTL_WIDGET_VOL, 2302 1184 "Headphone Playback Volume", ··· 2338 1218 case 0x1d: /* Mic */ 2339 1219 idx = 2; 2340 1220 break; 2341 - 1221 + 2342 1222 case 0x1e: /* Line In */ 2343 1223 idx = 3; 2344 1224 break; ··· 2351 1231 idx = 1; 2352 1232 break; 2353 1233 } 2354 - err = via_new_analog_input(spec, cfg->input_pins[i], labels[i], 2355 - idx, 0x17); 1234 + err = via_new_analog_input(spec, labels[i], idx, 0x17); 2356 1235 if (err < 0) 2357 1236 return err; 2358 1237 imux->items[imux->num_items].label = labels[i]; ··· 2379 1260 def_conf = snd_hda_codec_get_pincfg(codec, nid); 2380 1261 seqassoc = (unsigned char) get_defcfg_association(def_conf); 2381 1262 seqassoc = (seqassoc << 4) | get_defcfg_sequence(def_conf); 2382 - if (get_defcfg_connect(def_conf) == AC_JACK_PORT_NONE) { 2383 - if (seqassoc == 0xff) { 2384 - def_conf = def_conf & (~(AC_JACK_PORT_BOTH << 30)); 2385 - snd_hda_codec_set_pincfg(codec, nid, def_conf); 2386 - } 1263 + if (get_defcfg_connect(def_conf) == AC_JACK_PORT_NONE 1264 + && (seqassoc == 0xf0 || seqassoc == 0xff)) { 1265 + def_conf = def_conf & (~(AC_JACK_PORT_BOTH << 30)); 1266 + snd_hda_codec_set_pincfg(codec, nid, def_conf); 2387 1267 } 2388 1268 2389 1269 return; 2390 1270 } 1271 + 1272 + static int vt1708_jack_detectect_get(struct snd_kcontrol *kcontrol, 1273 + struct snd_ctl_elem_value *ucontrol) 1274 + { 1275 + struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 1276 + struct via_spec *spec = codec->spec; 1277 + 1278 + if (spec->codec_type != VT1708) 1279 + return 0; 1280 + spec->vt1708_jack_detectect = 1281 + !((snd_hda_codec_read(codec, 0x1, 0, 0xf84, 0) >> 8) & 0x1); 1282 + ucontrol->value.integer.value[0] = spec->vt1708_jack_detectect; 1283 + return 0; 1284 + } 1285 + 1286 + static int vt1708_jack_detectect_put(struct snd_kcontrol *kcontrol, 1287 + struct snd_ctl_elem_value *ucontrol) 1288 + { 1289 + struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 1290 + struct via_spec *spec = codec->spec; 1291 + int change; 1292 + 1293 + if (spec->codec_type != VT1708) 1294 + return 0; 1295 + spec->vt1708_jack_detectect = ucontrol->value.integer.value[0]; 1296 + change = (0x1 & (snd_hda_codec_read(codec, 0x1, 0, 0xf84, 0) >> 8)) 1297 + == !spec->vt1708_jack_detectect; 1298 + if (spec->vt1708_jack_detectect) { 1299 + mute_aa_path(codec, 1); 1300 + notify_aa_path_ctls(codec); 1301 + } 1302 + return change; 1303 + } 1304 + 1305 + static struct snd_kcontrol_new vt1708_jack_detectect[] = { 1306 + { 1307 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 1308 + .name = "Jack Detect", 1309 + .count = 1, 1310 + .info = snd_ctl_boolean_mono_info, 1311 + .get = vt1708_jack_detectect_get, 1312 + .put = vt1708_jack_detectect_put, 1313 + }, 1314 + {} /* end */ 1315 + }; 2391 1316 2392 1317 static int vt1708_parse_auto_config(struct hda_codec *codec) 2393 1318 { ··· 2460 1297 err = vt1708_auto_create_analog_input_ctls(spec, &spec->autocfg); 2461 1298 if (err < 0) 2462 1299 return err; 1300 + /* add jack detect on/off control */ 1301 + err = snd_hda_add_new_ctls(codec, vt1708_jack_detectect); 1302 + if (err < 0) 1303 + return err; 2463 1304 2464 1305 spec->multiout.max_channels = spec->multiout.num_dacs * 2; 2465 1306 ··· 2483 1316 if (spec->hp_mux) 2484 1317 spec->mixers[spec->num_mixers++] = via_hp_mixer; 2485 1318 1319 + spec->mixers[spec->num_mixers++] = via_smart51_mixer; 2486 1320 return 1; 2487 1321 } 2488 1322 2489 1323 /* init callback for auto-configuration model -- overriding the default init */ 2490 1324 static int via_auto_init(struct hda_codec *codec) 2491 1325 { 1326 + struct via_spec *spec = codec->spec; 1327 + 2492 1328 via_init(codec); 2493 1329 via_auto_init_multi_out(codec); 2494 1330 via_auto_init_hp_out(codec); 2495 1331 via_auto_init_analog_input(codec); 1332 + if (spec->codec_type == VT2002P || spec->codec_type == VT1812) { 1333 + via_hp_bind_automute(codec); 1334 + } else { 1335 + via_hp_automute(codec); 1336 + via_speaker_automute(codec); 1337 + } 1338 + 2496 1339 return 0; 1340 + } 1341 + 1342 + static void vt1708_update_hp_jack_state(struct work_struct *work) 1343 + { 1344 + struct via_spec *spec = container_of(work, struct via_spec, 1345 + vt1708_hp_work.work); 1346 + if (spec->codec_type != VT1708) 1347 + return; 1348 + /* if jack state toggled */ 1349 + if (spec->vt1708_hp_present 1350 + != snd_hda_jack_detect(spec->codec, spec->autocfg.hp_pins[0])) { 1351 + spec->vt1708_hp_present ^= 1; 1352 + via_hp_automute(spec->codec); 1353 + } 1354 + vt1708_start_hp_work(spec); 2497 1355 } 2498 1356 2499 1357 static int get_mux_nids(struct hda_codec *codec) ··· 2570 1378 "from BIOS. Using genenic mode...\n"); 2571 1379 } 2572 1380 2573 - 1381 + 2574 1382 spec->stream_name_analog = "VT1708 Analog"; 2575 1383 spec->stream_analog_playback = &vt1708_pcm_analog_playback; 2576 1384 /* disable 32bit format on VT1708 */ ··· 2582 1390 spec->stream_digital_playback = &vt1708_pcm_digital_playback; 2583 1391 spec->stream_digital_capture = &vt1708_pcm_digital_capture; 2584 1392 2585 - 1393 + 2586 1394 if (!spec->adc_nids && spec->input_mux) { 2587 1395 spec->adc_nids = vt1708_adc_nids; 2588 1396 spec->num_adc_nids = ARRAY_SIZE(vt1708_adc_nids); ··· 2597 1405 #ifdef CONFIG_SND_HDA_POWER_SAVE 2598 1406 spec->loopback.amplist = vt1708_loopbacks; 2599 1407 #endif 2600 - 1408 + spec->codec = codec; 1409 + INIT_DELAYED_WORK(&spec->vt1708_hp_work, vt1708_update_hp_jack_state); 2601 1410 return 0; 2602 1411 } 2603 1412 ··· 2626 1433 }; 2627 1434 2628 1435 static struct hda_verb vt1709_uniwill_init_verbs[] = { 2629 - {0x20, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_HP_EVENT}, 1436 + {0x20, AC_VERB_SET_UNSOLICITED_ENABLE, 1437 + AC_USRSP_EN | VIA_HP_EVENT | VIA_JACK_EVENT}, 2630 1438 { } 2631 1439 }; 2632 1440 ··· 2667 1473 {0x1f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 2668 1474 {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 2669 1475 2670 - /* Set input of PW4 as AOW4 */ 2671 - {0x20, AC_VERB_SET_CONNECT_SEL, 0x1}, 1476 + /* Set input of PW4 as MW0 */ 1477 + {0x20, AC_VERB_SET_CONNECT_SEL, 0}, 2672 1478 /* PW9 Output enable */ 2673 1479 {0x24, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, 2674 1480 { } ··· 2681 1487 .nid = 0x10, /* NID to query formats and rates */ 2682 1488 .ops = { 2683 1489 .open = via_playback_pcm_open, 2684 - .prepare = via_playback_pcm_prepare, 2685 - .cleanup = via_playback_pcm_cleanup 1490 + .prepare = via_playback_multi_pcm_prepare, 1491 + .cleanup = via_playback_multi_pcm_cleanup, 2686 1492 }, 2687 1493 }; 2688 1494 ··· 2693 1499 .nid = 0x10, /* NID to query formats and rates */ 2694 1500 .ops = { 2695 1501 .open = via_playback_pcm_open, 2696 - .prepare = via_playback_pcm_prepare, 2697 - .cleanup = via_playback_pcm_cleanup 1502 + .prepare = via_playback_multi_pcm_prepare, 1503 + .cleanup = via_playback_multi_pcm_cleanup, 2698 1504 }, 2699 1505 }; 2700 1506 ··· 2769 1575 spec->multiout.dac_nids[cfg->line_outs] = 0x28; /* AOW4 */ 2770 1576 2771 1577 } else if (cfg->line_outs == 3) { /* 6 channels */ 2772 - for(i = 0; i < cfg->line_outs; i++) { 1578 + for (i = 0; i < cfg->line_outs; i++) { 2773 1579 nid = cfg->line_out_pins[i]; 2774 1580 if (nid) { 2775 1581 /* config dac list */ 2776 - switch(i) { 1582 + switch (i) { 2777 1583 case AUTO_SEQ_FRONT: 2778 1584 /* AOW0 */ 2779 1585 spec->multiout.dac_nids[i] = 0x10; ··· 2802 1608 { 2803 1609 char name[32]; 2804 1610 static const char *chname[4] = { "Front", "Surround", "C/LFE", "Side" }; 2805 - hda_nid_t nid = 0; 1611 + hda_nid_t nid, nid_vol, nid_vols[] = {0x18, 0x1a, 0x1b, 0x29}; 2806 1612 int i, err; 2807 1613 2808 1614 for (i = 0; i <= AUTO_SEQ_SIDE; i++) { 2809 1615 nid = cfg->line_out_pins[i]; 2810 1616 2811 - if (!nid) 1617 + if (!nid) 2812 1618 continue; 1619 + 1620 + nid_vol = nid_vols[i]; 2813 1621 2814 1622 if (i == AUTO_SEQ_CENLFE) { 2815 1623 /* Center/LFE */ 2816 1624 err = via_add_control(spec, VIA_CTL_WIDGET_VOL, 2817 1625 "Center Playback Volume", 2818 - HDA_COMPOSE_AMP_VAL(0x1b, 1, 0, 1626 + HDA_COMPOSE_AMP_VAL(nid_vol, 1, 0, 2819 1627 HDA_OUTPUT)); 2820 1628 if (err < 0) 2821 1629 return err; 2822 1630 err = via_add_control(spec, VIA_CTL_WIDGET_VOL, 2823 1631 "LFE Playback Volume", 2824 - HDA_COMPOSE_AMP_VAL(0x1b, 2, 0, 1632 + HDA_COMPOSE_AMP_VAL(nid_vol, 2, 0, 2825 1633 HDA_OUTPUT)); 2826 1634 if (err < 0) 2827 1635 return err; 2828 1636 err = via_add_control(spec, VIA_CTL_WIDGET_MUTE, 2829 1637 "Center Playback Switch", 2830 - HDA_COMPOSE_AMP_VAL(0x1b, 1, 0, 1638 + HDA_COMPOSE_AMP_VAL(nid_vol, 1, 0, 2831 1639 HDA_OUTPUT)); 2832 1640 if (err < 0) 2833 1641 return err; 2834 1642 err = via_add_control(spec, VIA_CTL_WIDGET_MUTE, 2835 1643 "LFE Playback Switch", 2836 - HDA_COMPOSE_AMP_VAL(0x1b, 2, 0, 1644 + HDA_COMPOSE_AMP_VAL(nid_vol, 2, 0, 2837 1645 HDA_OUTPUT)); 2838 1646 if (err < 0) 2839 1647 return err; 2840 - } else if (i == AUTO_SEQ_FRONT){ 2841 - /* add control to mixer index 0 */ 1648 + } else if (i == AUTO_SEQ_FRONT) { 1649 + /* ADD control to mixer index 0 */ 2842 1650 err = via_add_control(spec, VIA_CTL_WIDGET_VOL, 2843 1651 "Master Front Playback Volume", 2844 - HDA_COMPOSE_AMP_VAL(0x18, 3, 0, 1652 + HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, 2845 1653 HDA_INPUT)); 2846 1654 if (err < 0) 2847 1655 return err; 2848 1656 err = via_add_control(spec, VIA_CTL_WIDGET_MUTE, 2849 1657 "Master Front Playback Switch", 2850 - HDA_COMPOSE_AMP_VAL(0x18, 3, 0, 1658 + HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, 2851 1659 HDA_INPUT)); 2852 1660 if (err < 0) 2853 1661 return err; 2854 - 1662 + 2855 1663 /* add control to PW3 */ 2856 1664 sprintf(name, "%s Playback Volume", chname[i]); 2857 1665 err = via_add_control(spec, VIA_CTL_WIDGET_VOL, name, ··· 2870 1674 } else if (i == AUTO_SEQ_SURROUND) { 2871 1675 sprintf(name, "%s Playback Volume", chname[i]); 2872 1676 err = via_add_control(spec, VIA_CTL_WIDGET_VOL, name, 2873 - HDA_COMPOSE_AMP_VAL(0x1a, 3, 0, 1677 + HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, 2874 1678 HDA_OUTPUT)); 2875 1679 if (err < 0) 2876 1680 return err; 2877 1681 sprintf(name, "%s Playback Switch", chname[i]); 2878 1682 err = via_add_control(spec, VIA_CTL_WIDGET_MUTE, name, 2879 - HDA_COMPOSE_AMP_VAL(0x1a, 3, 0, 1683 + HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, 2880 1684 HDA_OUTPUT)); 2881 1685 if (err < 0) 2882 1686 return err; 2883 1687 } else if (i == AUTO_SEQ_SIDE) { 2884 1688 sprintf(name, "%s Playback Volume", chname[i]); 2885 1689 err = via_add_control(spec, VIA_CTL_WIDGET_VOL, name, 2886 - HDA_COMPOSE_AMP_VAL(0x29, 3, 0, 1690 + HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, 2887 1691 HDA_OUTPUT)); 2888 1692 if (err < 0) 2889 1693 return err; 2890 1694 sprintf(name, "%s Playback Switch", chname[i]); 2891 1695 err = via_add_control(spec, VIA_CTL_WIDGET_MUTE, name, 2892 - HDA_COMPOSE_AMP_VAL(0x29, 3, 0, 1696 + HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, 2893 1697 HDA_OUTPUT)); 2894 1698 if (err < 0) 2895 1699 return err; ··· 2910 1714 spec->multiout.hp_nid = VT1709_HP_DAC_NID; 2911 1715 else if (spec->multiout.num_dacs == 3) /* 6 channels */ 2912 1716 spec->multiout.hp_nid = 0; 1717 + spec->hp_independent_mode_index = 1; 2913 1718 2914 1719 err = via_add_control(spec, VIA_CTL_WIDGET_VOL, 2915 1720 "Headphone Playback Volume", ··· 2949 1752 case 0x1d: /* Mic */ 2950 1753 idx = 2; 2951 1754 break; 2952 - 1755 + 2953 1756 case 0x1e: /* Line In */ 2954 1757 idx = 3; 2955 1758 break; ··· 2962 1765 idx = 1; 2963 1766 break; 2964 1767 } 2965 - err = via_new_analog_input(spec, cfg->input_pins[i], labels[i], 2966 - idx, 0x18); 1768 + err = via_new_analog_input(spec, labels[i], idx, 0x18); 2967 1769 if (err < 0) 2968 1770 return err; 2969 1771 imux->items[imux->num_items].label = labels[i]; ··· 3012 1816 if (spec->hp_mux) 3013 1817 spec->mixers[spec->num_mixers++] = via_hp_mixer; 3014 1818 1819 + spec->mixers[spec->num_mixers++] = via_smart51_mixer; 3015 1820 return 1; 3016 1821 } 3017 1822 ··· 3058 1861 spec->stream_digital_playback = &vt1709_pcm_digital_playback; 3059 1862 spec->stream_digital_capture = &vt1709_pcm_digital_capture; 3060 1863 3061 - 1864 + 3062 1865 if (!spec->adc_nids && spec->input_mux) { 3063 1866 spec->adc_nids = vt1709_adc_nids; 3064 1867 spec->num_adc_nids = ARRAY_SIZE(vt1709_adc_nids); ··· 3152 1955 spec->stream_digital_playback = &vt1709_pcm_digital_playback; 3153 1956 spec->stream_digital_capture = &vt1709_pcm_digital_capture; 3154 1957 3155 - 1958 + 3156 1959 if (!spec->adc_nids && spec->input_mux) { 3157 1960 spec->adc_nids = vt1709_adc_nids; 3158 1961 spec->num_adc_nids = ARRAY_SIZE(vt1709_adc_nids); ··· 3221 2024 {0x27, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO}, 3222 2025 3223 2026 /* Setup default input to PW4 */ 3224 - {0x1d, AC_VERB_SET_CONNECT_SEL, 0x1}, 2027 + {0x1d, AC_VERB_SET_CONNECT_SEL, 0}, 3225 2028 /* PW9 Output enable */ 3226 2029 {0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, 3227 2030 /* PW10 Input enable */ ··· 3265 2068 }; 3266 2069 3267 2070 static struct hda_verb vt1708B_uniwill_init_verbs[] = { 3268 - {0x1D, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_HP_EVENT}, 2071 + {0x1d, AC_VERB_SET_UNSOLICITED_ENABLE, 2072 + AC_USRSP_EN | VIA_HP_EVENT | VIA_JACK_EVENT}, 2073 + {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 2074 + {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 2075 + {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 2076 + {0x1c, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 2077 + {0x1e, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 2078 + {0x22, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 2079 + {0x23, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 3269 2080 { } 3270 2081 }; 2082 + 2083 + static int via_pcm_open_close(struct hda_pcm_stream *hinfo, 2084 + struct hda_codec *codec, 2085 + struct snd_pcm_substream *substream) 2086 + { 2087 + int idle = substream->pstr->substream_opened == 1 2088 + && substream->ref_count == 0; 2089 + 2090 + analog_low_current_mode(codec, idle); 2091 + return 0; 2092 + } 3271 2093 3272 2094 static struct hda_pcm_stream vt1708B_8ch_pcm_analog_playback = { 3273 2095 .substreams = 2, ··· 3296 2080 .ops = { 3297 2081 .open = via_playback_pcm_open, 3298 2082 .prepare = via_playback_multi_pcm_prepare, 3299 - .cleanup = via_playback_multi_pcm_cleanup 2083 + .cleanup = via_playback_multi_pcm_cleanup, 2084 + .close = via_pcm_open_close 3300 2085 }, 3301 2086 }; 3302 2087 ··· 3319 2102 .channels_max = 2, 3320 2103 .nid = 0x13, /* NID to query formats and rates */ 3321 2104 .ops = { 2105 + .open = via_pcm_open_close, 3322 2106 .prepare = via_capture_pcm_prepare, 3323 - .cleanup = via_capture_pcm_cleanup 2107 + .cleanup = via_capture_pcm_cleanup, 2108 + .close = via_pcm_open_close 3324 2109 }, 3325 2110 }; 3326 2111 ··· 3479 2260 return 0; 3480 2261 3481 2262 spec->multiout.hp_nid = VT1708B_HP_NID; /* AOW3 */ 2263 + spec->hp_independent_mode_index = 1; 3482 2264 3483 2265 err = via_add_control(spec, VIA_CTL_WIDGET_VOL, 3484 2266 "Headphone Playback Volume", ··· 3533 2313 idx = 1; 3534 2314 break; 3535 2315 } 3536 - err = via_new_analog_input(spec, cfg->input_pins[i], labels[i], 3537 - idx, 0x16); 2316 + err = via_new_analog_input(spec, labels[i], idx, 0x16); 3538 2317 if (err < 0) 3539 2318 return err; 3540 2319 imux->items[imux->num_items].label = labels[i]; ··· 3583 2364 if (spec->hp_mux) 3584 2365 spec->mixers[spec->num_mixers++] = via_hp_mixer; 3585 2366 2367 + spec->mixers[spec->num_mixers++] = via_smart51_mixer; 3586 2368 return 1; 3587 2369 } 3588 2370 ··· 3596 2376 { } /* end */ 3597 2377 }; 3598 2378 #endif 3599 - 2379 + static int patch_vt1708S(struct hda_codec *codec); 3600 2380 static int patch_vt1708B_8ch(struct hda_codec *codec) 3601 2381 { 3602 2382 struct via_spec *spec; 3603 2383 int err; 3604 2384 2385 + if (get_codec_type(codec) == VT1708BCE) 2386 + return patch_vt1708S(codec); 3605 2387 /* create a codec specific record */ 3606 2388 spec = kzalloc(sizeof(*spec), GFP_KERNEL); 3607 2389 if (spec == NULL) ··· 3705 2483 3706 2484 /* Patch for VT1708S */ 3707 2485 3708 - /* VT1708S software backdoor based override for buggy hardware micboost 3709 - * setting */ 3710 - #define MIC_BOOST_VOLUME(xname, nid) { \ 3711 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ 3712 - .name = xname, \ 3713 - .index = 0, \ 3714 - .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \ 3715 - SNDRV_CTL_ELEM_ACCESS_TLV_READ | \ 3716 - SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK, \ 3717 - .info = mic_boost_volume_info, \ 3718 - .get = snd_hda_mixer_amp_volume_get, \ 3719 - .put = snd_hda_mixer_amp_volume_put, \ 3720 - .tlv = { .c = mic_boost_tlv }, \ 3721 - .private_value = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT) } 3722 - 3723 2486 /* capture mixer elements */ 3724 2487 static struct snd_kcontrol_new vt1708S_capture_mixer[] = { 3725 2488 HDA_CODEC_VOLUME("Capture Volume", 0x13, 0x0, HDA_INPUT), 3726 2489 HDA_CODEC_MUTE("Capture Switch", 0x13, 0x0, HDA_INPUT), 3727 2490 HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x14, 0x0, HDA_INPUT), 3728 2491 HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x14, 0x0, HDA_INPUT), 3729 - MIC_BOOST_VOLUME("Mic Boost Capture Volume", 0x1A), 3730 - MIC_BOOST_VOLUME("Front Mic Boost Capture Volume", 0x1E), 2492 + HDA_CODEC_VOLUME("Mic Boost Capture Volume", 0x1A, 0x0, HDA_INPUT), 2493 + HDA_CODEC_VOLUME("Front Mic Boost Capture Volume", 0x1E, 0x0, 2494 + HDA_INPUT), 3731 2495 { 3732 2496 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 3733 2497 /* The multiple "Capture Source" controls confuse alsamixer ··· 3750 2542 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, 3751 2543 /* Enable Mic Boost Volume backdoor */ 3752 2544 {0x1, 0xf98, 0x1}, 2545 + /* don't bybass mixer */ 2546 + {0x1, 0xf88, 0xc0}, 3753 2547 { } 3754 2548 }; 3755 2549 3756 2550 static struct hda_verb vt1708S_uniwill_init_verbs[] = { 3757 - {0x1D, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_HP_EVENT}, 2551 + {0x1d, AC_VERB_SET_UNSOLICITED_ENABLE, 2552 + AC_USRSP_EN | VIA_HP_EVENT | VIA_JACK_EVENT}, 2553 + {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 2554 + {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 2555 + {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 2556 + {0x1c, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 2557 + {0x1e, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 2558 + {0x22, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 2559 + {0x23, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 3758 2560 { } 3759 2561 }; 3760 2562 ··· 3775 2557 .nid = 0x10, /* NID to query formats and rates */ 3776 2558 .ops = { 3777 2559 .open = via_playback_pcm_open, 3778 - .prepare = via_playback_pcm_prepare, 3779 - .cleanup = via_playback_pcm_cleanup 2560 + .prepare = via_playback_multi_pcm_prepare, 2561 + .cleanup = via_playback_multi_pcm_cleanup, 2562 + .close = via_pcm_open_close 3780 2563 }, 3781 2564 }; 3782 2565 ··· 3787 2568 .channels_max = 2, 3788 2569 .nid = 0x13, /* NID to query formats and rates */ 3789 2570 .ops = { 2571 + .open = via_pcm_open_close, 3790 2572 .prepare = via_capture_pcm_prepare, 3791 - .cleanup = via_capture_pcm_cleanup 2573 + .cleanup = via_capture_pcm_cleanup, 2574 + .close = via_pcm_open_close 3792 2575 }, 3793 2576 }; 3794 2577 ··· 3947 2726 return 0; 3948 2727 3949 2728 spec->multiout.hp_nid = VT1708S_HP_NID; /* AOW3 */ 2729 + spec->hp_independent_mode_index = 1; 3950 2730 3951 2731 err = via_add_control(spec, VIA_CTL_WIDGET_VOL, 3952 2732 "Headphone Playback Volume", ··· 4002 2780 idx = 1; 4003 2781 break; 4004 2782 } 4005 - err = via_new_analog_input(spec, cfg->input_pins[i], labels[i], 4006 - idx, 0x16); 2783 + err = via_new_analog_input(spec, labels[i], idx, 0x16); 4007 2784 if (err < 0) 4008 2785 return err; 4009 2786 imux->items[imux->num_items].label = labels[i]; ··· 4073 2852 if (spec->hp_mux) 4074 2853 spec->mixers[spec->num_mixers++] = via_hp_mixer; 4075 2854 2855 + spec->mixers[spec->num_mixers++] = via_smart51_mixer; 4076 2856 return 1; 4077 2857 } 4078 2858 ··· 4086 2864 { } /* end */ 4087 2865 }; 4088 2866 #endif 2867 + 2868 + static void override_mic_boost(struct hda_codec *codec, hda_nid_t pin, 2869 + int offset, int num_steps, int step_size) 2870 + { 2871 + snd_hda_override_amp_caps(codec, pin, HDA_INPUT, 2872 + (offset << AC_AMPCAP_OFFSET_SHIFT) | 2873 + (num_steps << AC_AMPCAP_NUM_STEPS_SHIFT) | 2874 + (step_size << AC_AMPCAP_STEP_SIZE_SHIFT) | 2875 + (0 << AC_AMPCAP_MUTE_SHIFT)); 2876 + } 4089 2877 4090 2878 static int patch_vt1708S(struct hda_codec *codec) 4091 2879 { ··· 4122 2890 spec->init_verbs[spec->num_iverbs++] = vt1708S_volume_init_verbs; 4123 2891 spec->init_verbs[spec->num_iverbs++] = vt1708S_uniwill_init_verbs; 4124 2892 4125 - spec->stream_name_analog = "VT1708S Analog"; 2893 + if (codec->vendor_id == 0x11060440) 2894 + spec->stream_name_analog = "VT1818S Analog"; 2895 + else 2896 + spec->stream_name_analog = "VT1708S Analog"; 4126 2897 spec->stream_analog_playback = &vt1708S_pcm_analog_playback; 4127 2898 spec->stream_analog_capture = &vt1708S_pcm_analog_capture; 4128 2899 4129 - spec->stream_name_digital = "VT1708S Digital"; 2900 + if (codec->vendor_id == 0x11060440) 2901 + spec->stream_name_digital = "VT1818S Digital"; 2902 + else 2903 + spec->stream_name_digital = "VT1708S Digital"; 4130 2904 spec->stream_digital_playback = &vt1708S_pcm_digital_playback; 4131 2905 4132 2906 if (!spec->adc_nids && spec->input_mux) { 4133 2907 spec->adc_nids = vt1708S_adc_nids; 4134 2908 spec->num_adc_nids = ARRAY_SIZE(vt1708S_adc_nids); 4135 2909 get_mux_nids(codec); 2910 + override_mic_boost(codec, 0x1a, 0, 3, 40); 2911 + override_mic_boost(codec, 0x1e, 0, 3, 40); 4136 2912 spec->mixers[spec->num_mixers] = vt1708S_capture_mixer; 4137 2913 spec->num_mixers++; 4138 2914 } ··· 4153 2913 spec->loopback.amplist = vt1708S_loopbacks; 4154 2914 #endif 4155 2915 2916 + /* correct names for VT1708BCE */ 2917 + if (get_codec_type(codec) == VT1708BCE) { 2918 + kfree(codec->chip_name); 2919 + codec->chip_name = kstrdup("VT1708BCE", GFP_KERNEL); 2920 + snprintf(codec->bus->card->mixername, 2921 + sizeof(codec->bus->card->mixername), 2922 + "%s %s", codec->vendor_name, codec->chip_name); 2923 + spec->stream_name_analog = "VT1708BCE Analog"; 2924 + spec->stream_name_digital = "VT1708BCE Digital"; 2925 + } 4156 2926 return 0; 4157 2927 } 4158 2928 ··· 4217 2967 /* PW6 PW7 Output enable */ 4218 2968 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, 4219 2969 {0x1C, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, 2970 + /* mixer enable */ 2971 + {0x1, 0xF88, 0x3}, 2972 + /* GPIO 0~2 */ 2973 + {0x1, 0xF82, 0x3F}, 4220 2974 { } 4221 2975 }; 4222 2976 4223 2977 static struct hda_verb vt1702_uniwill_init_verbs[] = { 4224 - {0x01, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_GPIO_EVENT}, 4225 - {0x17, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_HP_EVENT}, 2978 + {0x17, AC_VERB_SET_UNSOLICITED_ENABLE, 2979 + AC_USRSP_EN | VIA_HP_EVENT | VIA_JACK_EVENT}, 2980 + {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 2981 + {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 2982 + {0x16, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 2983 + {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 4226 2984 { } 4227 2985 }; 4228 2986 ··· 4242 2984 .ops = { 4243 2985 .open = via_playback_pcm_open, 4244 2986 .prepare = via_playback_multi_pcm_prepare, 4245 - .cleanup = via_playback_multi_pcm_cleanup 2987 + .cleanup = via_playback_multi_pcm_cleanup, 2988 + .close = via_pcm_open_close 4246 2989 }, 4247 2990 }; 4248 2991 ··· 4253 2994 .channels_max = 2, 4254 2995 .nid = 0x12, /* NID to query formats and rates */ 4255 2996 .ops = { 2997 + .open = via_pcm_open_close, 4256 2998 .prepare = via_capture_pcm_prepare, 4257 - .cleanup = via_capture_pcm_cleanup 2999 + .cleanup = via_capture_pcm_cleanup, 3000 + .close = via_pcm_open_close 4258 3001 }, 4259 3002 }; 4260 3003 ··· 4326 3065 4327 3066 static int vt1702_auto_create_hp_ctls(struct via_spec *spec, hda_nid_t pin) 4328 3067 { 4329 - int err; 4330 - 3068 + int err, i; 3069 + struct hda_input_mux *imux; 3070 + static const char *texts[] = { "ON", "OFF", NULL}; 4331 3071 if (!pin) 4332 3072 return 0; 4333 - 4334 3073 spec->multiout.hp_nid = 0x1D; 3074 + spec->hp_independent_mode_index = 0; 4335 3075 4336 3076 err = via_add_control(spec, VIA_CTL_WIDGET_VOL, 4337 3077 "Headphone Playback Volume", ··· 4346 3084 if (err < 0) 4347 3085 return err; 4348 3086 4349 - create_hp_imux(spec); 3087 + imux = &spec->private_imux[1]; 4350 3088 3089 + /* for hp mode select */ 3090 + i = 0; 3091 + while (texts[i] != NULL) { 3092 + imux->items[imux->num_items].label = texts[i]; 3093 + imux->items[imux->num_items].index = i; 3094 + imux->num_items++; 3095 + i++; 3096 + } 3097 + 3098 + spec->hp_mux = &spec->private_imux[1]; 4351 3099 return 0; 4352 3100 } 4353 3101 ··· 4393 3121 idx = 3; 4394 3122 break; 4395 3123 } 4396 - err = via_new_analog_input(spec, cfg->input_pins[i], 4397 - labels[i], idx, 0x1A); 3124 + err = via_new_analog_input(spec, labels[i], idx, 0x1A); 4398 3125 if (err < 0) 4399 3126 return err; 4400 3127 imux->items[imux->num_items].label = labels[i]; ··· 4423 3152 err = vt1702_auto_create_hp_ctls(spec, spec->autocfg.hp_pins[0]); 4424 3153 if (err < 0) 4425 3154 return err; 3155 + /* limit AA path volume to 0 dB */ 3156 + snd_hda_override_amp_caps(codec, 0x1A, HDA_INPUT, 3157 + (0x17 << AC_AMPCAP_OFFSET_SHIFT) | 3158 + (0x17 << AC_AMPCAP_NUM_STEPS_SHIFT) | 3159 + (0x5 << AC_AMPCAP_STEP_SIZE_SHIFT) | 3160 + (1 << AC_AMPCAP_MUTE_SHIFT)); 4426 3161 err = vt1702_auto_create_analog_input_ctls(spec, &spec->autocfg); 4427 3162 if (err < 0) 4428 3163 return err; ··· 4462 3185 { 4463 3186 struct via_spec *spec; 4464 3187 int err; 4465 - unsigned int response; 4466 - unsigned char control; 4467 3188 4468 3189 /* create a codec specific record */ 4469 3190 spec = kzalloc(sizeof(*spec), GFP_KERNEL); ··· 4506 3231 spec->loopback.amplist = vt1702_loopbacks; 4507 3232 #endif 4508 3233 4509 - /* Open backdoor */ 4510 - response = snd_hda_codec_read(codec, codec->afg, 0, 0xF8C, 0); 4511 - control = (unsigned char)(response & 0xff); 4512 - control |= 0x3; 4513 - snd_hda_codec_write(codec, codec->afg, 0, 0xF88, control); 3234 + return 0; 3235 + } 4514 3236 4515 - /* Enable GPIO 0&1 for volume&mute control */ 4516 - /* Enable GPIO 2 for DMIC-DATA */ 4517 - response = snd_hda_codec_read(codec, codec->afg, 0, 0xF84, 0); 4518 - control = (unsigned char)((response >> 16) & 0x3f); 4519 - snd_hda_codec_write(codec, codec->afg, 0, 0xF82, control); 3237 + /* Patch for VT1718S */ 3238 + 3239 + /* capture mixer elements */ 3240 + static struct snd_kcontrol_new vt1718S_capture_mixer[] = { 3241 + HDA_CODEC_VOLUME("Capture Volume", 0x10, 0x0, HDA_INPUT), 3242 + HDA_CODEC_MUTE("Capture Switch", 0x10, 0x0, HDA_INPUT), 3243 + HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x11, 0x0, HDA_INPUT), 3244 + HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x11, 0x0, HDA_INPUT), 3245 + HDA_CODEC_VOLUME("Mic Boost Capture Volume", 0x2b, 0x0, HDA_INPUT), 3246 + HDA_CODEC_VOLUME("Front Mic Boost Capture Volume", 0x29, 0x0, 3247 + HDA_INPUT), 3248 + { 3249 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 3250 + /* The multiple "Capture Source" controls confuse alsamixer 3251 + * So call somewhat different.. 3252 + */ 3253 + .name = "Input Source", 3254 + .count = 2, 3255 + .info = via_mux_enum_info, 3256 + .get = via_mux_enum_get, 3257 + .put = via_mux_enum_put, 3258 + }, 3259 + { } /* end */ 3260 + }; 3261 + 3262 + static struct hda_verb vt1718S_volume_init_verbs[] = { 3263 + /* 3264 + * Unmute ADC0-1 and set the default input to mic-in 3265 + */ 3266 + {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 3267 + {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 3268 + 3269 + 3270 + /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback 3271 + * mixer widget 3272 + */ 3273 + /* Amp Indices: CD = 1, Mic1 = 2, Line = 3, Mic2 = 4 */ 3274 + {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 3275 + {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 3276 + {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 3277 + {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 3278 + {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, 3279 + 3280 + /* Setup default input of Front HP to MW9 */ 3281 + {0x28, AC_VERB_SET_CONNECT_SEL, 0x1}, 3282 + /* PW9 PW10 Output enable */ 3283 + {0x2d, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_OUT_EN}, 3284 + {0x2e, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_OUT_EN}, 3285 + /* PW11 Input enable */ 3286 + {0x2f, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_IN_EN}, 3287 + /* Enable Boost Volume backdoor */ 3288 + {0x1, 0xf88, 0x8}, 3289 + /* MW0/1/2/3/4: un-mute index 0 (AOWx), mute index 1 (MW9) */ 3290 + {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 3291 + {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 3292 + {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 3293 + {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 3294 + {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 3295 + {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 3296 + {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 3297 + {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 3298 + {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 3299 + {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 3300 + /* set MUX1 = 2 (AOW4), MUX2 = 1 (AOW3) */ 3301 + {0x34, AC_VERB_SET_CONNECT_SEL, 0x2}, 3302 + {0x35, AC_VERB_SET_CONNECT_SEL, 0x1}, 3303 + /* Unmute MW4's index 0 */ 3304 + {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 3305 + { } 3306 + }; 3307 + 3308 + 3309 + static struct hda_verb vt1718S_uniwill_init_verbs[] = { 3310 + {0x28, AC_VERB_SET_UNSOLICITED_ENABLE, 3311 + AC_USRSP_EN | VIA_HP_EVENT | VIA_JACK_EVENT}, 3312 + {0x24, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 3313 + {0x25, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 3314 + {0x26, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 3315 + {0x27, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 3316 + {0x29, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 3317 + {0x2a, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 3318 + {0x2b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 3319 + { } 3320 + }; 3321 + 3322 + static struct hda_pcm_stream vt1718S_pcm_analog_playback = { 3323 + .substreams = 2, 3324 + .channels_min = 2, 3325 + .channels_max = 10, 3326 + .nid = 0x8, /* NID to query formats and rates */ 3327 + .ops = { 3328 + .open = via_playback_pcm_open, 3329 + .prepare = via_playback_multi_pcm_prepare, 3330 + .cleanup = via_playback_multi_pcm_cleanup, 3331 + .close = via_pcm_open_close, 3332 + }, 3333 + }; 3334 + 3335 + static struct hda_pcm_stream vt1718S_pcm_analog_capture = { 3336 + .substreams = 2, 3337 + .channels_min = 2, 3338 + .channels_max = 2, 3339 + .nid = 0x10, /* NID to query formats and rates */ 3340 + .ops = { 3341 + .open = via_pcm_open_close, 3342 + .prepare = via_capture_pcm_prepare, 3343 + .cleanup = via_capture_pcm_cleanup, 3344 + .close = via_pcm_open_close, 3345 + }, 3346 + }; 3347 + 3348 + static struct hda_pcm_stream vt1718S_pcm_digital_playback = { 3349 + .substreams = 2, 3350 + .channels_min = 2, 3351 + .channels_max = 2, 3352 + /* NID is set in via_build_pcms */ 3353 + .ops = { 3354 + .open = via_dig_playback_pcm_open, 3355 + .close = via_dig_playback_pcm_close, 3356 + .prepare = via_dig_playback_pcm_prepare, 3357 + .cleanup = via_dig_playback_pcm_cleanup 3358 + }, 3359 + }; 3360 + 3361 + static struct hda_pcm_stream vt1718S_pcm_digital_capture = { 3362 + .substreams = 1, 3363 + .channels_min = 2, 3364 + .channels_max = 2, 3365 + }; 3366 + 3367 + /* fill in the dac_nids table from the parsed pin configuration */ 3368 + static int vt1718S_auto_fill_dac_nids(struct via_spec *spec, 3369 + const struct auto_pin_cfg *cfg) 3370 + { 3371 + int i; 3372 + hda_nid_t nid; 3373 + 3374 + spec->multiout.num_dacs = cfg->line_outs; 3375 + 3376 + spec->multiout.dac_nids = spec->private_dac_nids; 3377 + 3378 + for (i = 0; i < 4; i++) { 3379 + nid = cfg->line_out_pins[i]; 3380 + if (nid) { 3381 + /* config dac list */ 3382 + switch (i) { 3383 + case AUTO_SEQ_FRONT: 3384 + spec->multiout.dac_nids[i] = 0x8; 3385 + break; 3386 + case AUTO_SEQ_CENLFE: 3387 + spec->multiout.dac_nids[i] = 0xa; 3388 + break; 3389 + case AUTO_SEQ_SURROUND: 3390 + spec->multiout.dac_nids[i] = 0x9; 3391 + break; 3392 + case AUTO_SEQ_SIDE: 3393 + spec->multiout.dac_nids[i] = 0xb; 3394 + break; 3395 + } 3396 + } 3397 + } 3398 + 3399 + return 0; 3400 + } 3401 + 3402 + /* add playback controls from the parsed DAC table */ 3403 + static int vt1718S_auto_create_multi_out_ctls(struct via_spec *spec, 3404 + const struct auto_pin_cfg *cfg) 3405 + { 3406 + char name[32]; 3407 + static const char *chname[4] = { "Front", "Surround", "C/LFE", "Side" }; 3408 + hda_nid_t nid_vols[] = {0x8, 0x9, 0xa, 0xb}; 3409 + hda_nid_t nid_mutes[] = {0x24, 0x25, 0x26, 0x27}; 3410 + hda_nid_t nid, nid_vol, nid_mute = 0; 3411 + int i, err; 3412 + 3413 + for (i = 0; i <= AUTO_SEQ_SIDE; i++) { 3414 + nid = cfg->line_out_pins[i]; 3415 + 3416 + if (!nid) 3417 + continue; 3418 + nid_vol = nid_vols[i]; 3419 + nid_mute = nid_mutes[i]; 3420 + 3421 + if (i == AUTO_SEQ_CENLFE) { 3422 + /* Center/LFE */ 3423 + err = via_add_control(spec, VIA_CTL_WIDGET_VOL, 3424 + "Center Playback Volume", 3425 + HDA_COMPOSE_AMP_VAL(nid_vol, 1, 0, 3426 + HDA_OUTPUT)); 3427 + if (err < 0) 3428 + return err; 3429 + err = via_add_control(spec, VIA_CTL_WIDGET_VOL, 3430 + "LFE Playback Volume", 3431 + HDA_COMPOSE_AMP_VAL(nid_vol, 2, 0, 3432 + HDA_OUTPUT)); 3433 + if (err < 0) 3434 + return err; 3435 + err = via_add_control( 3436 + spec, VIA_CTL_WIDGET_MUTE, 3437 + "Center Playback Switch", 3438 + HDA_COMPOSE_AMP_VAL(nid_mute, 1, 0, 3439 + HDA_OUTPUT)); 3440 + if (err < 0) 3441 + return err; 3442 + err = via_add_control( 3443 + spec, VIA_CTL_WIDGET_MUTE, 3444 + "LFE Playback Switch", 3445 + HDA_COMPOSE_AMP_VAL(nid_mute, 2, 0, 3446 + HDA_OUTPUT)); 3447 + if (err < 0) 3448 + return err; 3449 + } else if (i == AUTO_SEQ_FRONT) { 3450 + /* Front */ 3451 + sprintf(name, "%s Playback Volume", chname[i]); 3452 + err = via_add_control( 3453 + spec, VIA_CTL_WIDGET_VOL, name, 3454 + HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT)); 3455 + if (err < 0) 3456 + return err; 3457 + sprintf(name, "%s Playback Switch", chname[i]); 3458 + err = via_add_control( 3459 + spec, VIA_CTL_WIDGET_MUTE, name, 3460 + HDA_COMPOSE_AMP_VAL(nid_mute, 3, 0, 3461 + HDA_OUTPUT)); 3462 + if (err < 0) 3463 + return err; 3464 + } else { 3465 + sprintf(name, "%s Playback Volume", chname[i]); 3466 + err = via_add_control( 3467 + spec, VIA_CTL_WIDGET_VOL, name, 3468 + HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT)); 3469 + if (err < 0) 3470 + return err; 3471 + sprintf(name, "%s Playback Switch", chname[i]); 3472 + err = via_add_control( 3473 + spec, VIA_CTL_WIDGET_MUTE, name, 3474 + HDA_COMPOSE_AMP_VAL(nid_mute, 3, 0, 3475 + HDA_OUTPUT)); 3476 + if (err < 0) 3477 + return err; 3478 + } 3479 + } 3480 + return 0; 3481 + } 3482 + 3483 + static int vt1718S_auto_create_hp_ctls(struct via_spec *spec, hda_nid_t pin) 3484 + { 3485 + int err; 3486 + 3487 + if (!pin) 3488 + return 0; 3489 + 3490 + spec->multiout.hp_nid = 0xc; /* AOW4 */ 3491 + spec->hp_independent_mode_index = 1; 3492 + 3493 + err = via_add_control(spec, VIA_CTL_WIDGET_VOL, 3494 + "Headphone Playback Volume", 3495 + HDA_COMPOSE_AMP_VAL(0xc, 3, 0, HDA_OUTPUT)); 3496 + if (err < 0) 3497 + return err; 3498 + 3499 + err = via_add_control(spec, VIA_CTL_WIDGET_MUTE, 3500 + "Headphone Playback Switch", 3501 + HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT)); 3502 + if (err < 0) 3503 + return err; 3504 + 3505 + create_hp_imux(spec); 3506 + return 0; 3507 + } 3508 + 3509 + /* create playback/capture controls for input pins */ 3510 + static int vt1718S_auto_create_analog_input_ctls(struct via_spec *spec, 3511 + const struct auto_pin_cfg *cfg) 3512 + { 3513 + static char *labels[] = { 3514 + "Mic", "Front Mic", "Line", "Front Line", "CD", "Aux", NULL 3515 + }; 3516 + struct hda_input_mux *imux = &spec->private_imux[0]; 3517 + int i, err, idx = 0; 3518 + 3519 + /* for internal loopback recording select */ 3520 + imux->items[imux->num_items].label = "Stereo Mixer"; 3521 + imux->items[imux->num_items].index = 5; 3522 + imux->num_items++; 3523 + 3524 + for (i = 0; i < AUTO_PIN_LAST; i++) { 3525 + if (!cfg->input_pins[i]) 3526 + continue; 3527 + 3528 + switch (cfg->input_pins[i]) { 3529 + case 0x2b: /* Mic */ 3530 + idx = 1; 3531 + break; 3532 + 3533 + case 0x2a: /* Line In */ 3534 + idx = 2; 3535 + break; 3536 + 3537 + case 0x29: /* Front Mic */ 3538 + idx = 3; 3539 + break; 3540 + 3541 + case 0x2c: /* CD */ 3542 + idx = 0; 3543 + break; 3544 + } 3545 + err = via_new_analog_input(spec, labels[i], idx, 0x21); 3546 + if (err < 0) 3547 + return err; 3548 + imux->items[imux->num_items].label = labels[i]; 3549 + imux->items[imux->num_items].index = idx; 3550 + imux->num_items++; 3551 + } 3552 + return 0; 3553 + } 3554 + 3555 + static int vt1718S_parse_auto_config(struct hda_codec *codec) 3556 + { 3557 + struct via_spec *spec = codec->spec; 3558 + int err; 3559 + 3560 + err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL); 3561 + 3562 + if (err < 0) 3563 + return err; 3564 + err = vt1718S_auto_fill_dac_nids(spec, &spec->autocfg); 3565 + if (err < 0) 3566 + return err; 3567 + if (!spec->autocfg.line_outs && !spec->autocfg.hp_pins[0]) 3568 + return 0; /* can't find valid BIOS pin config */ 3569 + 3570 + err = vt1718S_auto_create_multi_out_ctls(spec, &spec->autocfg); 3571 + if (err < 0) 3572 + return err; 3573 + err = vt1718S_auto_create_hp_ctls(spec, spec->autocfg.hp_pins[0]); 3574 + if (err < 0) 3575 + return err; 3576 + err = vt1718S_auto_create_analog_input_ctls(spec, &spec->autocfg); 3577 + if (err < 0) 3578 + return err; 3579 + 3580 + spec->multiout.max_channels = spec->multiout.num_dacs * 2; 3581 + 3582 + fill_dig_outs(codec); 3583 + 3584 + if (spec->autocfg.dig_in_pin && codec->vendor_id == 0x11060428) 3585 + spec->dig_in_nid = 0x13; 3586 + 3587 + if (spec->kctls.list) 3588 + spec->mixers[spec->num_mixers++] = spec->kctls.list; 3589 + 3590 + spec->input_mux = &spec->private_imux[0]; 3591 + 3592 + if (spec->hp_mux) 3593 + spec->mixers[spec->num_mixers++] = via_hp_mixer; 3594 + 3595 + spec->mixers[spec->num_mixers++] = via_smart51_mixer; 3596 + 3597 + return 1; 3598 + } 3599 + 3600 + #ifdef CONFIG_SND_HDA_POWER_SAVE 3601 + static struct hda_amp_list vt1718S_loopbacks[] = { 3602 + { 0x21, HDA_INPUT, 1 }, 3603 + { 0x21, HDA_INPUT, 2 }, 3604 + { 0x21, HDA_INPUT, 3 }, 3605 + { 0x21, HDA_INPUT, 4 }, 3606 + { } /* end */ 3607 + }; 3608 + #endif 3609 + 3610 + static int patch_vt1718S(struct hda_codec *codec) 3611 + { 3612 + struct via_spec *spec; 3613 + int err; 3614 + 3615 + /* create a codec specific record */ 3616 + spec = kzalloc(sizeof(*spec), GFP_KERNEL); 3617 + if (spec == NULL) 3618 + return -ENOMEM; 3619 + 3620 + codec->spec = spec; 3621 + 3622 + /* automatic parse from the BIOS config */ 3623 + err = vt1718S_parse_auto_config(codec); 3624 + if (err < 0) { 3625 + via_free(codec); 3626 + return err; 3627 + } else if (!err) { 3628 + printk(KERN_INFO "hda_codec: Cannot set up configuration " 3629 + "from BIOS. Using genenic mode...\n"); 3630 + } 3631 + 3632 + spec->init_verbs[spec->num_iverbs++] = vt1718S_volume_init_verbs; 3633 + spec->init_verbs[spec->num_iverbs++] = vt1718S_uniwill_init_verbs; 3634 + 3635 + if (codec->vendor_id == 0x11060441) 3636 + spec->stream_name_analog = "VT2020 Analog"; 3637 + else if (codec->vendor_id == 0x11064441) 3638 + spec->stream_name_analog = "VT1828S Analog"; 3639 + else 3640 + spec->stream_name_analog = "VT1718S Analog"; 3641 + spec->stream_analog_playback = &vt1718S_pcm_analog_playback; 3642 + spec->stream_analog_capture = &vt1718S_pcm_analog_capture; 3643 + 3644 + if (codec->vendor_id == 0x11060441) 3645 + spec->stream_name_digital = "VT2020 Digital"; 3646 + else if (codec->vendor_id == 0x11064441) 3647 + spec->stream_name_digital = "VT1828S Digital"; 3648 + else 3649 + spec->stream_name_digital = "VT1718S Digital"; 3650 + spec->stream_digital_playback = &vt1718S_pcm_digital_playback; 3651 + if (codec->vendor_id == 0x11060428 || codec->vendor_id == 0x11060441) 3652 + spec->stream_digital_capture = &vt1718S_pcm_digital_capture; 3653 + 3654 + if (!spec->adc_nids && spec->input_mux) { 3655 + spec->adc_nids = vt1718S_adc_nids; 3656 + spec->num_adc_nids = ARRAY_SIZE(vt1718S_adc_nids); 3657 + get_mux_nids(codec); 3658 + override_mic_boost(codec, 0x2b, 0, 3, 40); 3659 + override_mic_boost(codec, 0x29, 0, 3, 40); 3660 + spec->mixers[spec->num_mixers] = vt1718S_capture_mixer; 3661 + spec->num_mixers++; 3662 + } 3663 + 3664 + codec->patch_ops = via_patch_ops; 3665 + 3666 + codec->patch_ops.init = via_auto_init; 3667 + codec->patch_ops.unsol_event = via_unsol_event; 3668 + 3669 + #ifdef CONFIG_SND_HDA_POWER_SAVE 3670 + spec->loopback.amplist = vt1718S_loopbacks; 3671 + #endif 3672 + 3673 + return 0; 3674 + } 3675 + 3676 + /* Patch for VT1716S */ 3677 + 3678 + static int vt1716s_dmic_info(struct snd_kcontrol *kcontrol, 3679 + struct snd_ctl_elem_info *uinfo) 3680 + { 3681 + uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; 3682 + uinfo->count = 1; 3683 + uinfo->value.integer.min = 0; 3684 + uinfo->value.integer.max = 1; 3685 + return 0; 3686 + } 3687 + 3688 + static int vt1716s_dmic_get(struct snd_kcontrol *kcontrol, 3689 + struct snd_ctl_elem_value *ucontrol) 3690 + { 3691 + struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 3692 + int index = 0; 3693 + 3694 + index = snd_hda_codec_read(codec, 0x26, 0, 3695 + AC_VERB_GET_CONNECT_SEL, 0); 3696 + if (index != -1) 3697 + *ucontrol->value.integer.value = index; 3698 + 3699 + return 0; 3700 + } 3701 + 3702 + static int vt1716s_dmic_put(struct snd_kcontrol *kcontrol, 3703 + struct snd_ctl_elem_value *ucontrol) 3704 + { 3705 + struct hda_codec *codec = snd_kcontrol_chip(kcontrol); 3706 + struct via_spec *spec = codec->spec; 3707 + int index = *ucontrol->value.integer.value; 3708 + 3709 + snd_hda_codec_write(codec, 0x26, 0, 3710 + AC_VERB_SET_CONNECT_SEL, index); 3711 + spec->dmic_enabled = index; 3712 + set_jack_power_state(codec); 3713 + 3714 + return 1; 3715 + } 3716 + 3717 + /* capture mixer elements */ 3718 + static struct snd_kcontrol_new vt1716S_capture_mixer[] = { 3719 + HDA_CODEC_VOLUME("Capture Volume", 0x13, 0x0, HDA_INPUT), 3720 + HDA_CODEC_MUTE("Capture Switch", 0x13, 0x0, HDA_INPUT), 3721 + HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x14, 0x0, HDA_INPUT), 3722 + HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x14, 0x0, HDA_INPUT), 3723 + HDA_CODEC_VOLUME("Mic Boost Capture Volume", 0x1A, 0x0, HDA_INPUT), 3724 + HDA_CODEC_VOLUME("Front Mic Boost Capture Volume", 0x1E, 0x0, 3725 + HDA_INPUT), 3726 + { 3727 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 3728 + .name = "Input Source", 3729 + .count = 1, 3730 + .info = via_mux_enum_info, 3731 + .get = via_mux_enum_get, 3732 + .put = via_mux_enum_put, 3733 + }, 3734 + { } /* end */ 3735 + }; 3736 + 3737 + static struct snd_kcontrol_new vt1716s_dmic_mixer[] = { 3738 + HDA_CODEC_VOLUME("Digital Mic Capture Volume", 0x22, 0x0, HDA_INPUT), 3739 + { 3740 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 3741 + .name = "Digital Mic Capture Switch", 3742 + .count = 1, 3743 + .info = vt1716s_dmic_info, 3744 + .get = vt1716s_dmic_get, 3745 + .put = vt1716s_dmic_put, 3746 + }, 3747 + {} /* end */ 3748 + }; 3749 + 3750 + 3751 + /* mono-out mixer elements */ 3752 + static struct snd_kcontrol_new vt1716S_mono_out_mixer[] = { 3753 + HDA_CODEC_MUTE("Mono Playback Switch", 0x2a, 0x0, HDA_OUTPUT), 3754 + { } /* end */ 3755 + }; 3756 + 3757 + static struct hda_verb vt1716S_volume_init_verbs[] = { 3758 + /* 3759 + * Unmute ADC0-1 and set the default input to mic-in 3760 + */ 3761 + {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 3762 + {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 3763 + 3764 + 3765 + /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback 3766 + * mixer widget 3767 + */ 3768 + /* Amp Indices: CD = 1, Mic1 = 2, Line = 3, Mic2 = 4 */ 3769 + {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 3770 + {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 3771 + {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 3772 + {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 3773 + {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 3774 + 3775 + /* MUX Indices: Stereo Mixer = 5 */ 3776 + {0x17, AC_VERB_SET_CONNECT_SEL, 0x5}, 3777 + 3778 + /* Setup default input of PW4 to MW0 */ 3779 + {0x1d, AC_VERB_SET_CONNECT_SEL, 0x0}, 3780 + 3781 + /* Setup default input of SW1 as MW0 */ 3782 + {0x18, AC_VERB_SET_CONNECT_SEL, 0x1}, 3783 + 3784 + /* Setup default input of SW4 as AOW0 */ 3785 + {0x28, AC_VERB_SET_CONNECT_SEL, 0x1}, 3786 + 3787 + /* PW9 PW10 Output enable */ 3788 + {0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, 3789 + {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, 3790 + 3791 + /* Unmute SW1, PW12 */ 3792 + {0x29, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 3793 + {0x2a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, 3794 + /* PW12 Output enable */ 3795 + {0x2a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40}, 3796 + /* Enable Boost Volume backdoor */ 3797 + {0x1, 0xf8a, 0x80}, 3798 + /* don't bybass mixer */ 3799 + {0x1, 0xf88, 0xc0}, 3800 + /* Enable mono output */ 3801 + {0x1, 0xf90, 0x08}, 3802 + { } 3803 + }; 3804 + 3805 + 3806 + static struct hda_verb vt1716S_uniwill_init_verbs[] = { 3807 + {0x1d, AC_VERB_SET_UNSOLICITED_ENABLE, 3808 + AC_USRSP_EN | VIA_HP_EVENT | VIA_JACK_EVENT}, 3809 + {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 3810 + {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 3811 + {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 3812 + {0x1c, AC_VERB_SET_UNSOLICITED_ENABLE, 3813 + AC_USRSP_EN | VIA_MONO_EVENT | VIA_JACK_EVENT}, 3814 + {0x1e, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 3815 + {0x23, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 3816 + { } 3817 + }; 3818 + 3819 + static struct hda_pcm_stream vt1716S_pcm_analog_playback = { 3820 + .substreams = 2, 3821 + .channels_min = 2, 3822 + .channels_max = 6, 3823 + .nid = 0x10, /* NID to query formats and rates */ 3824 + .ops = { 3825 + .open = via_playback_pcm_open, 3826 + .prepare = via_playback_multi_pcm_prepare, 3827 + .cleanup = via_playback_multi_pcm_cleanup, 3828 + .close = via_pcm_open_close, 3829 + }, 3830 + }; 3831 + 3832 + static struct hda_pcm_stream vt1716S_pcm_analog_capture = { 3833 + .substreams = 2, 3834 + .channels_min = 2, 3835 + .channels_max = 2, 3836 + .nid = 0x13, /* NID to query formats and rates */ 3837 + .ops = { 3838 + .open = via_pcm_open_close, 3839 + .prepare = via_capture_pcm_prepare, 3840 + .cleanup = via_capture_pcm_cleanup, 3841 + .close = via_pcm_open_close, 3842 + }, 3843 + }; 3844 + 3845 + static struct hda_pcm_stream vt1716S_pcm_digital_playback = { 3846 + .substreams = 2, 3847 + .channels_min = 2, 3848 + .channels_max = 2, 3849 + /* NID is set in via_build_pcms */ 3850 + .ops = { 3851 + .open = via_dig_playback_pcm_open, 3852 + .close = via_dig_playback_pcm_close, 3853 + .prepare = via_dig_playback_pcm_prepare, 3854 + .cleanup = via_dig_playback_pcm_cleanup 3855 + }, 3856 + }; 3857 + 3858 + /* fill in the dac_nids table from the parsed pin configuration */ 3859 + static int vt1716S_auto_fill_dac_nids(struct via_spec *spec, 3860 + const struct auto_pin_cfg *cfg) 3861 + { int i; 3862 + hda_nid_t nid; 3863 + 3864 + spec->multiout.num_dacs = cfg->line_outs; 3865 + 3866 + spec->multiout.dac_nids = spec->private_dac_nids; 3867 + 3868 + for (i = 0; i < 3; i++) { 3869 + nid = cfg->line_out_pins[i]; 3870 + if (nid) { 3871 + /* config dac list */ 3872 + switch (i) { 3873 + case AUTO_SEQ_FRONT: 3874 + spec->multiout.dac_nids[i] = 0x10; 3875 + break; 3876 + case AUTO_SEQ_CENLFE: 3877 + spec->multiout.dac_nids[i] = 0x25; 3878 + break; 3879 + case AUTO_SEQ_SURROUND: 3880 + spec->multiout.dac_nids[i] = 0x11; 3881 + break; 3882 + } 3883 + } 3884 + } 3885 + 3886 + return 0; 3887 + } 3888 + 3889 + /* add playback controls from the parsed DAC table */ 3890 + static int vt1716S_auto_create_multi_out_ctls(struct via_spec *spec, 3891 + const struct auto_pin_cfg *cfg) 3892 + { 3893 + char name[32]; 3894 + static const char *chname[3] = { "Front", "Surround", "C/LFE" }; 3895 + hda_nid_t nid_vols[] = {0x10, 0x11, 0x25}; 3896 + hda_nid_t nid_mutes[] = {0x1C, 0x18, 0x27}; 3897 + hda_nid_t nid, nid_vol, nid_mute; 3898 + int i, err; 3899 + 3900 + for (i = 0; i <= AUTO_SEQ_CENLFE; i++) { 3901 + nid = cfg->line_out_pins[i]; 3902 + 3903 + if (!nid) 3904 + continue; 3905 + 3906 + nid_vol = nid_vols[i]; 3907 + nid_mute = nid_mutes[i]; 3908 + 3909 + if (i == AUTO_SEQ_CENLFE) { 3910 + err = via_add_control( 3911 + spec, VIA_CTL_WIDGET_VOL, 3912 + "Center Playback Volume", 3913 + HDA_COMPOSE_AMP_VAL(nid_vol, 1, 0, HDA_OUTPUT)); 3914 + if (err < 0) 3915 + return err; 3916 + err = via_add_control( 3917 + spec, VIA_CTL_WIDGET_VOL, 3918 + "LFE Playback Volume", 3919 + HDA_COMPOSE_AMP_VAL(nid_vol, 2, 0, HDA_OUTPUT)); 3920 + if (err < 0) 3921 + return err; 3922 + err = via_add_control( 3923 + spec, VIA_CTL_WIDGET_MUTE, 3924 + "Center Playback Switch", 3925 + HDA_COMPOSE_AMP_VAL(nid_mute, 1, 0, 3926 + HDA_OUTPUT)); 3927 + if (err < 0) 3928 + return err; 3929 + err = via_add_control( 3930 + spec, VIA_CTL_WIDGET_MUTE, 3931 + "LFE Playback Switch", 3932 + HDA_COMPOSE_AMP_VAL(nid_mute, 2, 0, 3933 + HDA_OUTPUT)); 3934 + if (err < 0) 3935 + return err; 3936 + } else if (i == AUTO_SEQ_FRONT) { 3937 + 3938 + err = via_add_control( 3939 + spec, VIA_CTL_WIDGET_VOL, 3940 + "Master Front Playback Volume", 3941 + HDA_COMPOSE_AMP_VAL(0x16, 3, 0, HDA_INPUT)); 3942 + if (err < 0) 3943 + return err; 3944 + err = via_add_control( 3945 + spec, VIA_CTL_WIDGET_MUTE, 3946 + "Master Front Playback Switch", 3947 + HDA_COMPOSE_AMP_VAL(0x16, 3, 0, HDA_INPUT)); 3948 + if (err < 0) 3949 + return err; 3950 + 3951 + sprintf(name, "%s Playback Volume", chname[i]); 3952 + err = via_add_control( 3953 + spec, VIA_CTL_WIDGET_VOL, name, 3954 + HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT)); 3955 + if (err < 0) 3956 + return err; 3957 + sprintf(name, "%s Playback Switch", chname[i]); 3958 + err = via_add_control( 3959 + spec, VIA_CTL_WIDGET_MUTE, name, 3960 + HDA_COMPOSE_AMP_VAL(nid_mute, 3, 0, 3961 + HDA_OUTPUT)); 3962 + if (err < 0) 3963 + return err; 3964 + } else { 3965 + sprintf(name, "%s Playback Volume", chname[i]); 3966 + err = via_add_control( 3967 + spec, VIA_CTL_WIDGET_VOL, name, 3968 + HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT)); 3969 + if (err < 0) 3970 + return err; 3971 + sprintf(name, "%s Playback Switch", chname[i]); 3972 + err = via_add_control( 3973 + spec, VIA_CTL_WIDGET_MUTE, name, 3974 + HDA_COMPOSE_AMP_VAL(nid_mute, 3, 0, 3975 + HDA_OUTPUT)); 3976 + if (err < 0) 3977 + return err; 3978 + } 3979 + } 3980 + return 0; 3981 + } 3982 + 3983 + static int vt1716S_auto_create_hp_ctls(struct via_spec *spec, hda_nid_t pin) 3984 + { 3985 + int err; 3986 + 3987 + if (!pin) 3988 + return 0; 3989 + 3990 + spec->multiout.hp_nid = 0x25; /* AOW3 */ 3991 + spec->hp_independent_mode_index = 1; 3992 + 3993 + err = via_add_control(spec, VIA_CTL_WIDGET_VOL, 3994 + "Headphone Playback Volume", 3995 + HDA_COMPOSE_AMP_VAL(0x25, 3, 0, HDA_OUTPUT)); 3996 + if (err < 0) 3997 + return err; 3998 + 3999 + err = via_add_control(spec, VIA_CTL_WIDGET_MUTE, 4000 + "Headphone Playback Switch", 4001 + HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT)); 4002 + if (err < 0) 4003 + return err; 4004 + 4005 + create_hp_imux(spec); 4006 + return 0; 4007 + } 4008 + 4009 + /* create playback/capture controls for input pins */ 4010 + static int vt1716S_auto_create_analog_input_ctls(struct via_spec *spec, 4011 + const struct auto_pin_cfg *cfg) 4012 + { 4013 + static char *labels[] = { 4014 + "Mic", "Front Mic", "Line", "Front Line", "CD", "Aux", NULL 4015 + }; 4016 + struct hda_input_mux *imux = &spec->private_imux[0]; 4017 + int i, err, idx = 0; 4018 + 4019 + /* for internal loopback recording select */ 4020 + imux->items[imux->num_items].label = "Stereo Mixer"; 4021 + imux->items[imux->num_items].index = 5; 4022 + imux->num_items++; 4023 + 4024 + for (i = 0; i < AUTO_PIN_LAST; i++) { 4025 + if (!cfg->input_pins[i]) 4026 + continue; 4027 + 4028 + switch (cfg->input_pins[i]) { 4029 + case 0x1a: /* Mic */ 4030 + idx = 2; 4031 + break; 4032 + 4033 + case 0x1b: /* Line In */ 4034 + idx = 3; 4035 + break; 4036 + 4037 + case 0x1e: /* Front Mic */ 4038 + idx = 4; 4039 + break; 4040 + 4041 + case 0x1f: /* CD */ 4042 + idx = 1; 4043 + break; 4044 + } 4045 + err = via_new_analog_input(spec, labels[i], idx, 0x16); 4046 + if (err < 0) 4047 + return err; 4048 + imux->items[imux->num_items].label = labels[i]; 4049 + imux->items[imux->num_items].index = idx-1; 4050 + imux->num_items++; 4051 + } 4052 + return 0; 4053 + } 4054 + 4055 + static int vt1716S_parse_auto_config(struct hda_codec *codec) 4056 + { 4057 + struct via_spec *spec = codec->spec; 4058 + int err; 4059 + 4060 + err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL); 4061 + if (err < 0) 4062 + return err; 4063 + err = vt1716S_auto_fill_dac_nids(spec, &spec->autocfg); 4064 + if (err < 0) 4065 + return err; 4066 + if (!spec->autocfg.line_outs && !spec->autocfg.hp_pins[0]) 4067 + return 0; /* can't find valid BIOS pin config */ 4068 + 4069 + err = vt1716S_auto_create_multi_out_ctls(spec, &spec->autocfg); 4070 + if (err < 0) 4071 + return err; 4072 + err = vt1716S_auto_create_hp_ctls(spec, spec->autocfg.hp_pins[0]); 4073 + if (err < 0) 4074 + return err; 4075 + err = vt1716S_auto_create_analog_input_ctls(spec, &spec->autocfg); 4076 + if (err < 0) 4077 + return err; 4078 + 4079 + spec->multiout.max_channels = spec->multiout.num_dacs * 2; 4080 + 4081 + fill_dig_outs(codec); 4082 + 4083 + if (spec->kctls.list) 4084 + spec->mixers[spec->num_mixers++] = spec->kctls.list; 4085 + 4086 + spec->input_mux = &spec->private_imux[0]; 4087 + 4088 + if (spec->hp_mux) 4089 + spec->mixers[spec->num_mixers++] = via_hp_mixer; 4090 + 4091 + spec->mixers[spec->num_mixers++] = via_smart51_mixer; 4092 + 4093 + return 1; 4094 + } 4095 + 4096 + #ifdef CONFIG_SND_HDA_POWER_SAVE 4097 + static struct hda_amp_list vt1716S_loopbacks[] = { 4098 + { 0x16, HDA_INPUT, 1 }, 4099 + { 0x16, HDA_INPUT, 2 }, 4100 + { 0x16, HDA_INPUT, 3 }, 4101 + { 0x16, HDA_INPUT, 4 }, 4102 + { } /* end */ 4103 + }; 4104 + #endif 4105 + 4106 + static int patch_vt1716S(struct hda_codec *codec) 4107 + { 4108 + struct via_spec *spec; 4109 + int err; 4110 + 4111 + /* create a codec specific record */ 4112 + spec = kzalloc(sizeof(*spec), GFP_KERNEL); 4113 + if (spec == NULL) 4114 + return -ENOMEM; 4115 + 4116 + codec->spec = spec; 4117 + 4118 + /* automatic parse from the BIOS config */ 4119 + err = vt1716S_parse_auto_config(codec); 4120 + if (err < 0) { 4121 + via_free(codec); 4122 + return err; 4123 + } else if (!err) { 4124 + printk(KERN_INFO "hda_codec: Cannot set up configuration " 4125 + "from BIOS. Using genenic mode...\n"); 4126 + } 4127 + 4128 + spec->init_verbs[spec->num_iverbs++] = vt1716S_volume_init_verbs; 4129 + spec->init_verbs[spec->num_iverbs++] = vt1716S_uniwill_init_verbs; 4130 + 4131 + spec->stream_name_analog = "VT1716S Analog"; 4132 + spec->stream_analog_playback = &vt1716S_pcm_analog_playback; 4133 + spec->stream_analog_capture = &vt1716S_pcm_analog_capture; 4134 + 4135 + spec->stream_name_digital = "VT1716S Digital"; 4136 + spec->stream_digital_playback = &vt1716S_pcm_digital_playback; 4137 + 4138 + if (!spec->adc_nids && spec->input_mux) { 4139 + spec->adc_nids = vt1716S_adc_nids; 4140 + spec->num_adc_nids = ARRAY_SIZE(vt1716S_adc_nids); 4141 + get_mux_nids(codec); 4142 + override_mic_boost(codec, 0x1a, 0, 3, 40); 4143 + override_mic_boost(codec, 0x1e, 0, 3, 40); 4144 + spec->mixers[spec->num_mixers] = vt1716S_capture_mixer; 4145 + spec->num_mixers++; 4146 + } 4147 + 4148 + spec->mixers[spec->num_mixers] = vt1716s_dmic_mixer; 4149 + spec->num_mixers++; 4150 + 4151 + spec->mixers[spec->num_mixers++] = vt1716S_mono_out_mixer; 4152 + 4153 + codec->patch_ops = via_patch_ops; 4154 + 4155 + codec->patch_ops.init = via_auto_init; 4156 + codec->patch_ops.unsol_event = via_unsol_event; 4157 + 4158 + #ifdef CONFIG_SND_HDA_POWER_SAVE 4159 + spec->loopback.amplist = vt1716S_loopbacks; 4160 + #endif 4161 + 4162 + return 0; 4163 + } 4164 + 4165 + /* for vt2002P */ 4166 + 4167 + /* capture mixer elements */ 4168 + static struct snd_kcontrol_new vt2002P_capture_mixer[] = { 4169 + HDA_CODEC_VOLUME("Capture Volume", 0x10, 0x0, HDA_INPUT), 4170 + HDA_CODEC_MUTE("Capture Switch", 0x10, 0x0, HDA_INPUT), 4171 + HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x11, 0x0, HDA_INPUT), 4172 + HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x11, 0x0, HDA_INPUT), 4173 + HDA_CODEC_VOLUME("Mic Boost Capture Volume", 0x2b, 0x0, HDA_INPUT), 4174 + HDA_CODEC_VOLUME("Front Mic Boost Capture Volume", 0x29, 0x0, 4175 + HDA_INPUT), 4176 + { 4177 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 4178 + /* The multiple "Capture Source" controls confuse alsamixer 4179 + * So call somewhat different.. 4180 + */ 4181 + /* .name = "Capture Source", */ 4182 + .name = "Input Source", 4183 + .count = 2, 4184 + .info = via_mux_enum_info, 4185 + .get = via_mux_enum_get, 4186 + .put = via_mux_enum_put, 4187 + }, 4188 + { } /* end */ 4189 + }; 4190 + 4191 + static struct hda_verb vt2002P_volume_init_verbs[] = { 4192 + /* 4193 + * Unmute ADC0-1 and set the default input to mic-in 4194 + */ 4195 + {0x8, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 4196 + {0x9, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 4197 + 4198 + 4199 + /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback 4200 + * mixer widget 4201 + */ 4202 + /* Amp Indices: CD = 1, Mic1 = 2, Line = 3, Mic2 = 4 */ 4203 + {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 4204 + {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 4205 + {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 4206 + {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 4207 + {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 4208 + 4209 + /* MUX Indices: Mic = 0 */ 4210 + {0x1e, AC_VERB_SET_CONNECT_SEL, 0}, 4211 + {0x1f, AC_VERB_SET_CONNECT_SEL, 0}, 4212 + 4213 + /* PW9 Output enable */ 4214 + {0x2d, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_OUT_EN}, 4215 + 4216 + /* Enable Boost Volume backdoor */ 4217 + {0x1, 0xfb9, 0x24}, 4218 + 4219 + /* MW0/1/4/8: un-mute index 0 (MUXx), un-mute index 1 (MW9) */ 4220 + {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 4221 + {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 4222 + {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 4223 + {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 4224 + {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 4225 + {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 4226 + {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 4227 + {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 4228 + 4229 + /* set MUX0/1/4/8 = 0 (AOW0) */ 4230 + {0x34, AC_VERB_SET_CONNECT_SEL, 0}, 4231 + {0x35, AC_VERB_SET_CONNECT_SEL, 0}, 4232 + {0x37, AC_VERB_SET_CONNECT_SEL, 0}, 4233 + {0x3b, AC_VERB_SET_CONNECT_SEL, 0}, 4234 + 4235 + /* set PW0 index=0 (MW0) */ 4236 + {0x24, AC_VERB_SET_CONNECT_SEL, 0}, 4237 + 4238 + /* Enable AOW0 to MW9 */ 4239 + {0x1, 0xfb8, 0x88}, 4240 + { } 4241 + }; 4242 + 4243 + 4244 + static struct hda_verb vt2002P_uniwill_init_verbs[] = { 4245 + {0x25, AC_VERB_SET_UNSOLICITED_ENABLE, 4246 + AC_USRSP_EN | VIA_JACK_EVENT | VIA_BIND_HP_EVENT}, 4247 + {0x26, AC_VERB_SET_UNSOLICITED_ENABLE, 4248 + AC_USRSP_EN | VIA_JACK_EVENT | VIA_BIND_HP_EVENT}, 4249 + {0x29, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 4250 + {0x2a, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 4251 + {0x2b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 4252 + { } 4253 + }; 4254 + 4255 + static struct hda_pcm_stream vt2002P_pcm_analog_playback = { 4256 + .substreams = 2, 4257 + .channels_min = 2, 4258 + .channels_max = 2, 4259 + .nid = 0x8, /* NID to query formats and rates */ 4260 + .ops = { 4261 + .open = via_playback_pcm_open, 4262 + .prepare = via_playback_multi_pcm_prepare, 4263 + .cleanup = via_playback_multi_pcm_cleanup, 4264 + .close = via_pcm_open_close, 4265 + }, 4266 + }; 4267 + 4268 + static struct hda_pcm_stream vt2002P_pcm_analog_capture = { 4269 + .substreams = 2, 4270 + .channels_min = 2, 4271 + .channels_max = 2, 4272 + .nid = 0x10, /* NID to query formats and rates */ 4273 + .ops = { 4274 + .open = via_pcm_open_close, 4275 + .prepare = via_capture_pcm_prepare, 4276 + .cleanup = via_capture_pcm_cleanup, 4277 + .close = via_pcm_open_close, 4278 + }, 4279 + }; 4280 + 4281 + static struct hda_pcm_stream vt2002P_pcm_digital_playback = { 4282 + .substreams = 1, 4283 + .channels_min = 2, 4284 + .channels_max = 2, 4285 + /* NID is set in via_build_pcms */ 4286 + .ops = { 4287 + .open = via_dig_playback_pcm_open, 4288 + .close = via_dig_playback_pcm_close, 4289 + .prepare = via_dig_playback_pcm_prepare, 4290 + .cleanup = via_dig_playback_pcm_cleanup 4291 + }, 4292 + }; 4293 + 4294 + /* fill in the dac_nids table from the parsed pin configuration */ 4295 + static int vt2002P_auto_fill_dac_nids(struct via_spec *spec, 4296 + const struct auto_pin_cfg *cfg) 4297 + { 4298 + spec->multiout.num_dacs = 1; 4299 + spec->multiout.dac_nids = spec->private_dac_nids; 4300 + if (cfg->line_out_pins[0]) 4301 + spec->multiout.dac_nids[0] = 0x8; 4302 + return 0; 4303 + } 4304 + 4305 + /* add playback controls from the parsed DAC table */ 4306 + static int vt2002P_auto_create_multi_out_ctls(struct via_spec *spec, 4307 + const struct auto_pin_cfg *cfg) 4308 + { 4309 + int err; 4310 + 4311 + if (!cfg->line_out_pins[0]) 4312 + return -1; 4313 + 4314 + 4315 + /* Line-Out: PortE */ 4316 + err = via_add_control(spec, VIA_CTL_WIDGET_VOL, 4317 + "Master Front Playback Volume", 4318 + HDA_COMPOSE_AMP_VAL(0x8, 3, 0, HDA_OUTPUT)); 4319 + if (err < 0) 4320 + return err; 4321 + err = via_add_control(spec, VIA_CTL_WIDGET_BIND_PIN_MUTE, 4322 + "Master Front Playback Switch", 4323 + HDA_COMPOSE_AMP_VAL(0x26, 3, 0, HDA_OUTPUT)); 4324 + if (err < 0) 4325 + return err; 4326 + 4327 + return 0; 4328 + } 4329 + 4330 + static int vt2002P_auto_create_hp_ctls(struct via_spec *spec, hda_nid_t pin) 4331 + { 4332 + int err; 4333 + 4334 + if (!pin) 4335 + return 0; 4336 + 4337 + spec->multiout.hp_nid = 0x9; 4338 + spec->hp_independent_mode_index = 1; 4339 + 4340 + err = via_add_control(spec, VIA_CTL_WIDGET_VOL, 4341 + "Headphone Playback Volume", 4342 + HDA_COMPOSE_AMP_VAL( 4343 + spec->multiout.hp_nid, 3, 0, HDA_OUTPUT)); 4344 + if (err < 0) 4345 + return err; 4346 + 4347 + err = via_add_control(spec, VIA_CTL_WIDGET_MUTE, 4348 + "Headphone Playback Switch", 4349 + HDA_COMPOSE_AMP_VAL(0x25, 3, 0, HDA_OUTPUT)); 4350 + if (err < 0) 4351 + return err; 4352 + 4353 + create_hp_imux(spec); 4354 + return 0; 4355 + } 4356 + 4357 + /* create playback/capture controls for input pins */ 4358 + static int vt2002P_auto_create_analog_input_ctls(struct via_spec *spec, 4359 + const struct auto_pin_cfg *cfg) 4360 + { 4361 + static char *labels[] = { 4362 + "Mic", "Front Mic", "Line", "Front Line", "CD", "Aux", NULL 4363 + }; 4364 + struct hda_input_mux *imux = &spec->private_imux[0]; 4365 + int i, err, idx = 0; 4366 + 4367 + for (i = 0; i < AUTO_PIN_LAST; i++) { 4368 + if (!cfg->input_pins[i]) 4369 + continue; 4370 + 4371 + switch (cfg->input_pins[i]) { 4372 + case 0x2b: /* Mic */ 4373 + idx = 0; 4374 + break; 4375 + 4376 + case 0x2a: /* Line In */ 4377 + idx = 1; 4378 + break; 4379 + 4380 + case 0x29: /* Front Mic */ 4381 + idx = 2; 4382 + break; 4383 + } 4384 + err = via_new_analog_input(spec, labels[i], idx, 0x21); 4385 + if (err < 0) 4386 + return err; 4387 + imux->items[imux->num_items].label = labels[i]; 4388 + imux->items[imux->num_items].index = idx; 4389 + imux->num_items++; 4390 + } 4391 + 4392 + /* build volume/mute control of loopback */ 4393 + err = via_new_analog_input(spec, "Stereo Mixer", 3, 0x21); 4394 + if (err < 0) 4395 + return err; 4396 + 4397 + /* for internal loopback recording select */ 4398 + imux->items[imux->num_items].label = "Stereo Mixer"; 4399 + imux->items[imux->num_items].index = 3; 4400 + imux->num_items++; 4401 + 4402 + /* for digital mic select */ 4403 + imux->items[imux->num_items].label = "Digital Mic"; 4404 + imux->items[imux->num_items].index = 4; 4405 + imux->num_items++; 4406 + 4407 + return 0; 4408 + } 4409 + 4410 + static int vt2002P_parse_auto_config(struct hda_codec *codec) 4411 + { 4412 + struct via_spec *spec = codec->spec; 4413 + int err; 4414 + 4415 + 4416 + err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL); 4417 + if (err < 0) 4418 + return err; 4419 + 4420 + err = vt2002P_auto_fill_dac_nids(spec, &spec->autocfg); 4421 + if (err < 0) 4422 + return err; 4423 + 4424 + if (!spec->autocfg.line_outs && !spec->autocfg.hp_pins[0]) 4425 + return 0; /* can't find valid BIOS pin config */ 4426 + 4427 + err = vt2002P_auto_create_multi_out_ctls(spec, &spec->autocfg); 4428 + if (err < 0) 4429 + return err; 4430 + err = vt2002P_auto_create_hp_ctls(spec, spec->autocfg.hp_pins[0]); 4431 + if (err < 0) 4432 + return err; 4433 + err = vt2002P_auto_create_analog_input_ctls(spec, &spec->autocfg); 4434 + if (err < 0) 4435 + return err; 4436 + 4437 + spec->multiout.max_channels = spec->multiout.num_dacs * 2; 4438 + 4439 + fill_dig_outs(codec); 4440 + 4441 + if (spec->kctls.list) 4442 + spec->mixers[spec->num_mixers++] = spec->kctls.list; 4443 + 4444 + spec->input_mux = &spec->private_imux[0]; 4445 + 4446 + if (spec->hp_mux) 4447 + spec->mixers[spec->num_mixers++] = via_hp_mixer; 4448 + 4449 + return 1; 4450 + } 4451 + 4452 + #ifdef CONFIG_SND_HDA_POWER_SAVE 4453 + static struct hda_amp_list vt2002P_loopbacks[] = { 4454 + { 0x21, HDA_INPUT, 0 }, 4455 + { 0x21, HDA_INPUT, 1 }, 4456 + { 0x21, HDA_INPUT, 2 }, 4457 + { } /* end */ 4458 + }; 4459 + #endif 4460 + 4461 + 4462 + /* patch for vt2002P */ 4463 + static int patch_vt2002P(struct hda_codec *codec) 4464 + { 4465 + struct via_spec *spec; 4466 + int err; 4467 + 4468 + /* create a codec specific record */ 4469 + spec = kzalloc(sizeof(*spec), GFP_KERNEL); 4470 + if (spec == NULL) 4471 + return -ENOMEM; 4472 + 4473 + codec->spec = spec; 4474 + 4475 + /* automatic parse from the BIOS config */ 4476 + err = vt2002P_parse_auto_config(codec); 4477 + if (err < 0) { 4478 + via_free(codec); 4479 + return err; 4480 + } else if (!err) { 4481 + printk(KERN_INFO "hda_codec: Cannot set up configuration " 4482 + "from BIOS. Using genenic mode...\n"); 4483 + } 4484 + 4485 + spec->init_verbs[spec->num_iverbs++] = vt2002P_volume_init_verbs; 4486 + spec->init_verbs[spec->num_iverbs++] = vt2002P_uniwill_init_verbs; 4487 + 4488 + spec->stream_name_analog = "VT2002P Analog"; 4489 + spec->stream_analog_playback = &vt2002P_pcm_analog_playback; 4490 + spec->stream_analog_capture = &vt2002P_pcm_analog_capture; 4491 + 4492 + spec->stream_name_digital = "VT2002P Digital"; 4493 + spec->stream_digital_playback = &vt2002P_pcm_digital_playback; 4494 + 4495 + if (!spec->adc_nids && spec->input_mux) { 4496 + spec->adc_nids = vt2002P_adc_nids; 4497 + spec->num_adc_nids = ARRAY_SIZE(vt2002P_adc_nids); 4498 + get_mux_nids(codec); 4499 + override_mic_boost(codec, 0x2b, 0, 3, 40); 4500 + override_mic_boost(codec, 0x29, 0, 3, 40); 4501 + spec->mixers[spec->num_mixers] = vt2002P_capture_mixer; 4502 + spec->num_mixers++; 4503 + } 4504 + 4505 + codec->patch_ops = via_patch_ops; 4506 + 4507 + codec->patch_ops.init = via_auto_init; 4508 + codec->patch_ops.unsol_event = via_unsol_event; 4509 + 4510 + #ifdef CONFIG_SND_HDA_POWER_SAVE 4511 + spec->loopback.amplist = vt2002P_loopbacks; 4512 + #endif 4513 + 4514 + return 0; 4515 + } 4516 + 4517 + /* for vt1812 */ 4518 + 4519 + /* capture mixer elements */ 4520 + static struct snd_kcontrol_new vt1812_capture_mixer[] = { 4521 + HDA_CODEC_VOLUME("Capture Volume", 0x10, 0x0, HDA_INPUT), 4522 + HDA_CODEC_MUTE("Capture Switch", 0x10, 0x0, HDA_INPUT), 4523 + HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x11, 0x0, HDA_INPUT), 4524 + HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x11, 0x0, HDA_INPUT), 4525 + HDA_CODEC_MUTE("Mic Boost Capture Volume", 0x2b, 0x0, HDA_INPUT), 4526 + HDA_CODEC_MUTE("Front Mic Boost Capture Volume", 0x29, 0x0, 4527 + HDA_INPUT), 4528 + { 4529 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 4530 + /* The multiple "Capture Source" controls confuse alsamixer 4531 + * So call somewhat different.. 4532 + */ 4533 + .name = "Input Source", 4534 + .count = 2, 4535 + .info = via_mux_enum_info, 4536 + .get = via_mux_enum_get, 4537 + .put = via_mux_enum_put, 4538 + }, 4539 + { } /* end */ 4540 + }; 4541 + 4542 + static struct hda_verb vt1812_volume_init_verbs[] = { 4543 + /* 4544 + * Unmute ADC0-1 and set the default input to mic-in 4545 + */ 4546 + {0x8, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 4547 + {0x9, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 4548 + 4549 + 4550 + /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback 4551 + * mixer widget 4552 + */ 4553 + /* Amp Indices: CD = 1, Mic1 = 2, Line = 3, Mic2 = 4 */ 4554 + {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, 4555 + {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, 4556 + {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, 4557 + {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, 4558 + {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, 4559 + 4560 + /* MUX Indices: Mic = 0 */ 4561 + {0x1e, AC_VERB_SET_CONNECT_SEL, 0}, 4562 + {0x1f, AC_VERB_SET_CONNECT_SEL, 0}, 4563 + 4564 + /* PW9 Output enable */ 4565 + {0x2d, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_OUT_EN}, 4566 + 4567 + /* Enable Boost Volume backdoor */ 4568 + {0x1, 0xfb9, 0x24}, 4569 + 4570 + /* MW0/1/4/13/15: un-mute index 0 (MUXx), un-mute index 1 (MW9) */ 4571 + {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 4572 + {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 4573 + {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 4574 + {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 4575 + {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, 4576 + {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 4577 + {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 4578 + {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 4579 + {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 4580 + {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, 4581 + 4582 + /* set MUX0/1/4/13/15 = 0 (AOW0) */ 4583 + {0x34, AC_VERB_SET_CONNECT_SEL, 0}, 4584 + {0x35, AC_VERB_SET_CONNECT_SEL, 0}, 4585 + {0x38, AC_VERB_SET_CONNECT_SEL, 0}, 4586 + {0x3c, AC_VERB_SET_CONNECT_SEL, 0}, 4587 + {0x3d, AC_VERB_SET_CONNECT_SEL, 0}, 4588 + 4589 + /* Enable AOW0 to MW9 */ 4590 + {0x1, 0xfb8, 0xa8}, 4591 + { } 4592 + }; 4593 + 4594 + 4595 + static struct hda_verb vt1812_uniwill_init_verbs[] = { 4596 + {0x33, AC_VERB_SET_UNSOLICITED_ENABLE, 4597 + AC_USRSP_EN | VIA_JACK_EVENT | VIA_BIND_HP_EVENT}, 4598 + {0x25, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT }, 4599 + {0x28, AC_VERB_SET_UNSOLICITED_ENABLE, 4600 + AC_USRSP_EN | VIA_JACK_EVENT | VIA_BIND_HP_EVENT}, 4601 + {0x29, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 4602 + {0x2a, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 4603 + {0x2b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | VIA_JACK_EVENT}, 4604 + { } 4605 + }; 4606 + 4607 + static struct hda_pcm_stream vt1812_pcm_analog_playback = { 4608 + .substreams = 2, 4609 + .channels_min = 2, 4610 + .channels_max = 2, 4611 + .nid = 0x8, /* NID to query formats and rates */ 4612 + .ops = { 4613 + .open = via_playback_pcm_open, 4614 + .prepare = via_playback_multi_pcm_prepare, 4615 + .cleanup = via_playback_multi_pcm_cleanup, 4616 + .close = via_pcm_open_close, 4617 + }, 4618 + }; 4619 + 4620 + static struct hda_pcm_stream vt1812_pcm_analog_capture = { 4621 + .substreams = 2, 4622 + .channels_min = 2, 4623 + .channels_max = 2, 4624 + .nid = 0x10, /* NID to query formats and rates */ 4625 + .ops = { 4626 + .open = via_pcm_open_close, 4627 + .prepare = via_capture_pcm_prepare, 4628 + .cleanup = via_capture_pcm_cleanup, 4629 + .close = via_pcm_open_close, 4630 + }, 4631 + }; 4632 + 4633 + static struct hda_pcm_stream vt1812_pcm_digital_playback = { 4634 + .substreams = 1, 4635 + .channels_min = 2, 4636 + .channels_max = 2, 4637 + /* NID is set in via_build_pcms */ 4638 + .ops = { 4639 + .open = via_dig_playback_pcm_open, 4640 + .close = via_dig_playback_pcm_close, 4641 + .prepare = via_dig_playback_pcm_prepare, 4642 + .cleanup = via_dig_playback_pcm_cleanup 4643 + }, 4644 + }; 4645 + /* fill in the dac_nids table from the parsed pin configuration */ 4646 + static int vt1812_auto_fill_dac_nids(struct via_spec *spec, 4647 + const struct auto_pin_cfg *cfg) 4648 + { 4649 + spec->multiout.num_dacs = 1; 4650 + spec->multiout.dac_nids = spec->private_dac_nids; 4651 + if (cfg->line_out_pins[0]) 4652 + spec->multiout.dac_nids[0] = 0x8; 4653 + return 0; 4654 + } 4655 + 4656 + 4657 + /* add playback controls from the parsed DAC table */ 4658 + static int vt1812_auto_create_multi_out_ctls(struct via_spec *spec, 4659 + const struct auto_pin_cfg *cfg) 4660 + { 4661 + int err; 4662 + 4663 + if (!cfg->line_out_pins[0]) 4664 + return -1; 4665 + 4666 + /* Line-Out: PortE */ 4667 + err = via_add_control(spec, VIA_CTL_WIDGET_VOL, 4668 + "Master Front Playback Volume", 4669 + HDA_COMPOSE_AMP_VAL(0x8, 3, 0, HDA_OUTPUT)); 4670 + if (err < 0) 4671 + return err; 4672 + err = via_add_control(spec, VIA_CTL_WIDGET_BIND_PIN_MUTE, 4673 + "Master Front Playback Switch", 4674 + HDA_COMPOSE_AMP_VAL(0x28, 3, 0, HDA_OUTPUT)); 4675 + if (err < 0) 4676 + return err; 4677 + 4678 + return 0; 4679 + } 4680 + 4681 + static int vt1812_auto_create_hp_ctls(struct via_spec *spec, hda_nid_t pin) 4682 + { 4683 + int err; 4684 + 4685 + if (!pin) 4686 + return 0; 4687 + 4688 + spec->multiout.hp_nid = 0x9; 4689 + spec->hp_independent_mode_index = 1; 4690 + 4691 + 4692 + err = via_add_control(spec, VIA_CTL_WIDGET_VOL, 4693 + "Headphone Playback Volume", 4694 + HDA_COMPOSE_AMP_VAL( 4695 + spec->multiout.hp_nid, 3, 0, HDA_OUTPUT)); 4696 + if (err < 0) 4697 + return err; 4698 + 4699 + err = via_add_control(spec, VIA_CTL_WIDGET_MUTE, 4700 + "Headphone Playback Switch", 4701 + HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT)); 4702 + if (err < 0) 4703 + return err; 4704 + 4705 + create_hp_imux(spec); 4706 + return 0; 4707 + } 4708 + 4709 + /* create playback/capture controls for input pins */ 4710 + static int vt1812_auto_create_analog_input_ctls(struct via_spec *spec, 4711 + const struct auto_pin_cfg *cfg) 4712 + { 4713 + static char *labels[] = { 4714 + "Mic", "Front Mic", "Line", "Front Line", "CD", "Aux", NULL 4715 + }; 4716 + struct hda_input_mux *imux = &spec->private_imux[0]; 4717 + int i, err, idx = 0; 4718 + 4719 + for (i = 0; i < AUTO_PIN_LAST; i++) { 4720 + if (!cfg->input_pins[i]) 4721 + continue; 4722 + 4723 + switch (cfg->input_pins[i]) { 4724 + case 0x2b: /* Mic */ 4725 + idx = 0; 4726 + break; 4727 + 4728 + case 0x2a: /* Line In */ 4729 + idx = 1; 4730 + break; 4731 + 4732 + case 0x29: /* Front Mic */ 4733 + idx = 2; 4734 + break; 4735 + } 4736 + err = via_new_analog_input(spec, labels[i], idx, 0x21); 4737 + if (err < 0) 4738 + return err; 4739 + imux->items[imux->num_items].label = labels[i]; 4740 + imux->items[imux->num_items].index = idx; 4741 + imux->num_items++; 4742 + } 4743 + /* build volume/mute control of loopback */ 4744 + err = via_new_analog_input(spec, "Stereo Mixer", 5, 0x21); 4745 + if (err < 0) 4746 + return err; 4747 + 4748 + /* for internal loopback recording select */ 4749 + imux->items[imux->num_items].label = "Stereo Mixer"; 4750 + imux->items[imux->num_items].index = 5; 4751 + imux->num_items++; 4752 + 4753 + /* for digital mic select */ 4754 + imux->items[imux->num_items].label = "Digital Mic"; 4755 + imux->items[imux->num_items].index = 6; 4756 + imux->num_items++; 4757 + 4758 + return 0; 4759 + } 4760 + 4761 + static int vt1812_parse_auto_config(struct hda_codec *codec) 4762 + { 4763 + struct via_spec *spec = codec->spec; 4764 + int err; 4765 + 4766 + 4767 + err = snd_hda_parse_pin_def_config(codec, &spec->autocfg, NULL); 4768 + if (err < 0) 4769 + return err; 4770 + fill_dig_outs(codec); 4771 + err = vt1812_auto_fill_dac_nids(spec, &spec->autocfg); 4772 + if (err < 0) 4773 + return err; 4774 + 4775 + if (!spec->autocfg.line_outs && !spec->autocfg.hp_outs) 4776 + return 0; /* can't find valid BIOS pin config */ 4777 + 4778 + err = vt1812_auto_create_multi_out_ctls(spec, &spec->autocfg); 4779 + if (err < 0) 4780 + return err; 4781 + err = vt1812_auto_create_hp_ctls(spec, spec->autocfg.hp_pins[0]); 4782 + if (err < 0) 4783 + return err; 4784 + err = vt1812_auto_create_analog_input_ctls(spec, &spec->autocfg); 4785 + if (err < 0) 4786 + return err; 4787 + 4788 + spec->multiout.max_channels = spec->multiout.num_dacs * 2; 4789 + 4790 + fill_dig_outs(codec); 4791 + 4792 + if (spec->kctls.list) 4793 + spec->mixers[spec->num_mixers++] = spec->kctls.list; 4794 + 4795 + spec->input_mux = &spec->private_imux[0]; 4796 + 4797 + if (spec->hp_mux) 4798 + spec->mixers[spec->num_mixers++] = via_hp_mixer; 4799 + 4800 + return 1; 4801 + } 4802 + 4803 + #ifdef CONFIG_SND_HDA_POWER_SAVE 4804 + static struct hda_amp_list vt1812_loopbacks[] = { 4805 + { 0x21, HDA_INPUT, 0 }, 4806 + { 0x21, HDA_INPUT, 1 }, 4807 + { 0x21, HDA_INPUT, 2 }, 4808 + { } /* end */ 4809 + }; 4810 + #endif 4811 + 4812 + 4813 + /* patch for vt1812 */ 4814 + static int patch_vt1812(struct hda_codec *codec) 4815 + { 4816 + struct via_spec *spec; 4817 + int err; 4818 + 4819 + /* create a codec specific record */ 4820 + spec = kzalloc(sizeof(*spec), GFP_KERNEL); 4821 + if (spec == NULL) 4822 + return -ENOMEM; 4823 + 4824 + codec->spec = spec; 4825 + 4826 + /* automatic parse from the BIOS config */ 4827 + err = vt1812_parse_auto_config(codec); 4828 + if (err < 0) { 4829 + via_free(codec); 4830 + return err; 4831 + } else if (!err) { 4832 + printk(KERN_INFO "hda_codec: Cannot set up configuration " 4833 + "from BIOS. Using genenic mode...\n"); 4834 + } 4835 + 4836 + 4837 + spec->init_verbs[spec->num_iverbs++] = vt1812_volume_init_verbs; 4838 + spec->init_verbs[spec->num_iverbs++] = vt1812_uniwill_init_verbs; 4839 + 4840 + spec->stream_name_analog = "VT1812 Analog"; 4841 + spec->stream_analog_playback = &vt1812_pcm_analog_playback; 4842 + spec->stream_analog_capture = &vt1812_pcm_analog_capture; 4843 + 4844 + spec->stream_name_digital = "VT1812 Digital"; 4845 + spec->stream_digital_playback = &vt1812_pcm_digital_playback; 4846 + 4847 + 4848 + if (!spec->adc_nids && spec->input_mux) { 4849 + spec->adc_nids = vt1812_adc_nids; 4850 + spec->num_adc_nids = ARRAY_SIZE(vt1812_adc_nids); 4851 + get_mux_nids(codec); 4852 + override_mic_boost(codec, 0x2b, 0, 3, 40); 4853 + override_mic_boost(codec, 0x29, 0, 3, 40); 4854 + spec->mixers[spec->num_mixers] = vt1812_capture_mixer; 4855 + spec->num_mixers++; 4856 + } 4857 + 4858 + codec->patch_ops = via_patch_ops; 4859 + 4860 + codec->patch_ops.init = via_auto_init; 4861 + codec->patch_ops.unsol_event = via_unsol_event; 4862 + 4863 + #ifdef CONFIG_SND_HDA_POWER_SAVE 4864 + spec->loopback.amplist = vt1812_loopbacks; 4865 + #endif 4520 4866 4521 4867 return 0; 4522 4868 } ··· 6214 3318 .patch = patch_vt1702}, 6215 3319 { .id = 0x11067398, .name = "VT1702", 6216 3320 .patch = patch_vt1702}, 3321 + { .id = 0x11060428, .name = "VT1718S", 3322 + .patch = patch_vt1718S}, 3323 + { .id = 0x11064428, .name = "VT1718S", 3324 + .patch = patch_vt1718S}, 3325 + { .id = 0x11060441, .name = "VT2020", 3326 + .patch = patch_vt1718S}, 3327 + { .id = 0x11064441, .name = "VT1828S", 3328 + .patch = patch_vt1718S}, 3329 + { .id = 0x11060433, .name = "VT1716S", 3330 + .patch = patch_vt1716S}, 3331 + { .id = 0x1106a721, .name = "VT1716S", 3332 + .patch = patch_vt1716S}, 3333 + { .id = 0x11060438, .name = "VT2002P", .patch = patch_vt2002P}, 3334 + { .id = 0x11064438, .name = "VT2002P", .patch = patch_vt2002P}, 3335 + { .id = 0x11060448, .name = "VT1812", .patch = patch_vt1812}, 3336 + { .id = 0x11060440, .name = "VT1818S", 3337 + .patch = patch_vt1708S}, 6217 3338 {} /* terminator */ 6218 3339 }; 6219 3340
+1 -1
sound/pci/ice1712/Makefile
··· 5 5 6 6 snd-ice17xx-ak4xxx-objs := ak4xxx.o 7 7 snd-ice1712-objs := ice1712.o delta.o hoontech.o ews.o 8 - snd-ice1724-objs := ice1724.o amp.o revo.o aureon.o vt1720_mobo.o pontis.o prodigy192.o prodigy_hifi.o juli.o phase.o wtm.o se.o maya44.o 8 + snd-ice1724-objs := ice1724.o amp.o revo.o aureon.o vt1720_mobo.o pontis.o prodigy192.o prodigy_hifi.o juli.o phase.o wtm.o se.o maya44.o quartet.o 9 9 10 10 # Toplevel Module Dependency 11 11 obj-$(CONFIG_SND_ICE1712) += snd-ice1712.o snd-ice17xx-ak4xxx.o
+12
sound/pci/ice1712/ice1712.c
··· 298 298 inb(ICEREG(ice, DATA)); /* dummy read for pci-posting */ 299 299 } 300 300 301 + static unsigned int snd_ice1712_get_gpio_dir(struct snd_ice1712 *ice) 302 + { 303 + return snd_ice1712_read(ice, ICE1712_IREG_GPIO_DIRECTION); 304 + } 305 + 306 + static unsigned int snd_ice1712_get_gpio_mask(struct snd_ice1712 *ice) 307 + { 308 + return snd_ice1712_read(ice, ICE1712_IREG_GPIO_WRITE_MASK); 309 + } 310 + 301 311 static void snd_ice1712_set_gpio_mask(struct snd_ice1712 *ice, unsigned int data) 302 312 { 303 313 snd_ice1712_write(ice, ICE1712_IREG_GPIO_WRITE_MASK, data); ··· 2567 2557 mutex_init(&ice->i2c_mutex); 2568 2558 mutex_init(&ice->open_mutex); 2569 2559 ice->gpio.set_mask = snd_ice1712_set_gpio_mask; 2560 + ice->gpio.get_mask = snd_ice1712_get_gpio_mask; 2570 2561 ice->gpio.set_dir = snd_ice1712_set_gpio_dir; 2562 + ice->gpio.get_dir = snd_ice1712_get_gpio_dir; 2571 2563 ice->gpio.set_data = snd_ice1712_set_gpio_data; 2572 2564 ice->gpio.get_data = snd_ice1712_get_gpio_data; 2573 2565
+12 -2
sound/pci/ice1712/ice1712.h
··· 359 359 unsigned int saved[2]; /* for ewx_i2c */ 360 360 /* operators */ 361 361 void (*set_mask)(struct snd_ice1712 *ice, unsigned int data); 362 + unsigned int (*get_mask)(struct snd_ice1712 *ice); 362 363 void (*set_dir)(struct snd_ice1712 *ice, unsigned int data); 364 + unsigned int (*get_dir)(struct snd_ice1712 *ice); 363 365 void (*set_data)(struct snd_ice1712 *ice, unsigned int data); 364 366 unsigned int (*get_data)(struct snd_ice1712 *ice); 365 367 /* misc operators - move to another place? */ ··· 379 377 unsigned int (*get_rate)(struct snd_ice1712 *ice); 380 378 void (*set_rate)(struct snd_ice1712 *ice, unsigned int rate); 381 379 unsigned char (*set_mclk)(struct snd_ice1712 *ice, unsigned int rate); 382 - void (*set_spdif_clock)(struct snd_ice1712 *ice); 383 - 380 + int (*set_spdif_clock)(struct snd_ice1712 *ice, int type); 381 + int (*get_spdif_master_type)(struct snd_ice1712 *ice); 382 + char **ext_clock_names; 383 + int ext_clock_count; 384 + void (*pro_open)(struct snd_ice1712 *, struct snd_pcm_substream *); 384 385 #ifdef CONFIG_PM 385 386 int (*pm_suspend)(struct snd_ice1712 *); 386 387 int (*pm_resume)(struct snd_ice1712 *); ··· 402 397 static inline void snd_ice1712_gpio_set_dir(struct snd_ice1712 *ice, unsigned int bits) 403 398 { 404 399 ice->gpio.set_dir(ice, bits); 400 + } 401 + 402 + static inline unsigned int snd_ice1712_gpio_get_dir(struct snd_ice1712 *ice) 403 + { 404 + return ice->gpio.get_dir(ice); 405 405 } 406 406 407 407 static inline void snd_ice1712_gpio_set_mask(struct snd_ice1712 *ice, unsigned int bits)
+83 -20
sound/pci/ice1712/ice1724.c
··· 53 53 #include "phase.h" 54 54 #include "wtm.h" 55 55 #include "se.h" 56 + #include "quartet.h" 56 57 57 58 MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>"); 58 59 MODULE_DESCRIPTION("VIA ICEnsemble ICE1724/1720 (Envy24HT/PT)"); ··· 71 70 PHASE_DEVICE_DESC 72 71 WTM_DEVICE_DESC 73 72 SE_DEVICE_DESC 73 + QTET_DEVICE_DESC 74 74 "{VIA,VT1720}," 75 75 "{VIA,VT1724}," 76 76 "{ICEnsemble,Generic ICE1724}," ··· 106 104 static int PRO_RATE_RESET = 1; 107 105 static unsigned int PRO_RATE_DEFAULT = 44100; 108 106 107 + static char *ext_clock_names[1] = { "IEC958 In" }; 108 + 109 109 /* 110 110 * Basic I/O 111 111 */ ··· 122 118 return (inb(ICEMT1724(ice, RATE)) & VT1724_SPDIF_MASTER) ? 1 : 0; 123 119 } 124 120 121 + /* 122 + * locking rate makes sense only for internal clock mode 123 + */ 125 124 static inline int is_pro_rate_locked(struct snd_ice1712 *ice) 126 125 { 127 - return ice->is_spdif_master(ice) || PRO_RATE_LOCKED; 126 + return (!ice->is_spdif_master(ice)) && PRO_RATE_LOCKED; 128 127 } 129 128 130 129 /* ··· 203 196 inw(ICEREG1724(ice, GPIO_DIRECTION)); /* dummy read for pci-posting */ 204 197 } 205 198 199 + /* get gpio direction 0 = read, 1 = write */ 200 + static unsigned int snd_vt1724_get_gpio_dir(struct snd_ice1712 *ice) 201 + { 202 + return inl(ICEREG1724(ice, GPIO_DIRECTION)); 203 + } 204 + 206 205 /* set the gpio mask (0 = writable) */ 207 206 static void snd_vt1724_set_gpio_mask(struct snd_ice1712 *ice, unsigned int data) 208 207 { ··· 216 203 if (!ice->vt1720) /* VT1720 supports only 16 GPIO bits */ 217 204 outb((data >> 16) & 0xff, ICEREG1724(ice, GPIO_WRITE_MASK_22)); 218 205 inw(ICEREG1724(ice, GPIO_WRITE_MASK)); /* dummy read for pci-posting */ 206 + } 207 + 208 + static unsigned int snd_vt1724_get_gpio_mask(struct snd_ice1712 *ice) 209 + { 210 + unsigned int mask; 211 + if (!ice->vt1720) 212 + mask = (unsigned int)inb(ICEREG1724(ice, GPIO_WRITE_MASK_22)); 213 + else 214 + mask = 0; 215 + mask = (mask << 16) | inw(ICEREG1724(ice, GPIO_WRITE_MASK)); 216 + return mask; 219 217 } 220 218 221 219 static void snd_vt1724_set_gpio_data(struct snd_ice1712 *ice, unsigned int data) ··· 675 651 return ((rate == ice->cur_rate) && !force) ? 0 : -EBUSY; 676 652 } 677 653 if (!force && is_pro_rate_locked(ice)) { 654 + /* comparing required and current rate - makes sense for 655 + * internal clock only */ 678 656 spin_unlock_irqrestore(&ice->reg_lock, flags); 679 657 return (rate == ice->cur_rate) ? 0 : -EBUSY; 680 658 } 681 659 682 - old_rate = ice->get_rate(ice); 683 - if (force || (old_rate != rate)) 684 - ice->set_rate(ice, rate); 685 - else if (rate == ice->cur_rate) { 686 - spin_unlock_irqrestore(&ice->reg_lock, flags); 687 - return 0; 660 + if (force || !ice->is_spdif_master(ice)) { 661 + /* force means the rate was switched by ucontrol, otherwise 662 + * setting clock rate for internal clock mode */ 663 + old_rate = ice->get_rate(ice); 664 + if (force || (old_rate != rate)) 665 + ice->set_rate(ice, rate); 666 + else if (rate == ice->cur_rate) { 667 + spin_unlock_irqrestore(&ice->reg_lock, flags); 668 + return 0; 669 + } 688 670 } 689 671 690 672 ice->cur_rate = rate; ··· 1046 1016 VT1724_BUFFER_ALIGN); 1047 1017 snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 1048 1018 VT1724_BUFFER_ALIGN); 1019 + if (ice->pro_open) 1020 + ice->pro_open(ice, substream); 1049 1021 return 0; 1050 1022 } 1051 1023 ··· 1066 1034 VT1724_BUFFER_ALIGN); 1067 1035 snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 1068 1036 VT1724_BUFFER_ALIGN); 1037 + if (ice->pro_open) 1038 + ice->pro_open(ice, substream); 1069 1039 return 0; 1070 1040 } 1071 1041 ··· 1821 1787 struct snd_ctl_elem_info *uinfo) 1822 1788 { 1823 1789 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); 1824 - 1790 + int hw_rates_count = ice->hw_rates->count; 1825 1791 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 1826 1792 uinfo->count = 1; 1827 - uinfo->value.enumerated.items = ice->hw_rates->count + 1; 1793 + 1794 + uinfo->value.enumerated.items = hw_rates_count + ice->ext_clock_count; 1795 + /* upper limit - keep at top */ 1828 1796 if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items) 1829 1797 uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1; 1830 - if (uinfo->value.enumerated.item == uinfo->value.enumerated.items - 1) 1831 - strcpy(uinfo->value.enumerated.name, "IEC958 Input"); 1798 + if (uinfo->value.enumerated.item >= hw_rates_count) 1799 + /* ext_clock items */ 1800 + strcpy(uinfo->value.enumerated.name, 1801 + ice->ext_clock_names[ 1802 + uinfo->value.enumerated.item - hw_rates_count]); 1832 1803 else 1804 + /* int clock items */ 1833 1805 sprintf(uinfo->value.enumerated.name, "%d", 1834 1806 ice->hw_rates->list[uinfo->value.enumerated.item]); 1835 1807 return 0; ··· 1849 1809 1850 1810 spin_lock_irq(&ice->reg_lock); 1851 1811 if (ice->is_spdif_master(ice)) { 1852 - ucontrol->value.enumerated.item[0] = ice->hw_rates->count; 1812 + ucontrol->value.enumerated.item[0] = ice->hw_rates->count + 1813 + ice->get_spdif_master_type(ice); 1853 1814 } else { 1854 1815 rate = ice->get_rate(ice); 1855 1816 ucontrol->value.enumerated.item[0] = 0; ··· 1865 1824 return 0; 1866 1825 } 1867 1826 1827 + static int stdclock_get_spdif_master_type(struct snd_ice1712 *ice) 1828 + { 1829 + /* standard external clock - only single type - SPDIF IN */ 1830 + return 0; 1831 + } 1832 + 1868 1833 /* setting clock to external - SPDIF */ 1869 - static void stdclock_set_spdif_clock(struct snd_ice1712 *ice) 1834 + static int stdclock_set_spdif_clock(struct snd_ice1712 *ice, int type) 1870 1835 { 1871 1836 unsigned char oval; 1872 1837 unsigned char i2s_oval; ··· 1881 1834 /* setting 256fs */ 1882 1835 i2s_oval = inb(ICEMT1724(ice, I2S_FORMAT)); 1883 1836 outb(i2s_oval & ~VT1724_MT_I2S_MCLK_128X, ICEMT1724(ice, I2S_FORMAT)); 1837 + return 0; 1884 1838 } 1839 + 1885 1840 1886 1841 static int snd_vt1724_pro_internal_clock_put(struct snd_kcontrol *kcontrol, 1887 1842 struct snd_ctl_elem_value *ucontrol) ··· 1891 1842 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); 1892 1843 unsigned int old_rate, new_rate; 1893 1844 unsigned int item = ucontrol->value.enumerated.item[0]; 1894 - unsigned int spdif = ice->hw_rates->count; 1845 + unsigned int first_ext_clock = ice->hw_rates->count; 1895 1846 1896 - if (item > spdif) 1847 + if (item > first_ext_clock + ice->ext_clock_count - 1) 1897 1848 return -EINVAL; 1898 1849 1850 + /* if rate = 0 => external clock */ 1899 1851 spin_lock_irq(&ice->reg_lock); 1900 1852 if (ice->is_spdif_master(ice)) 1901 1853 old_rate = 0; 1902 1854 else 1903 1855 old_rate = ice->get_rate(ice); 1904 - if (item == spdif) { 1905 - /* switching to external clock via SPDIF */ 1906 - ice->set_spdif_clock(ice); 1856 + if (item >= first_ext_clock) { 1857 + /* switching to external clock */ 1858 + ice->set_spdif_clock(ice, item - first_ext_clock); 1907 1859 new_rate = 0; 1908 1860 } else { 1909 1861 /* internal on-card clock */ ··· 1916 1866 } 1917 1867 spin_unlock_irq(&ice->reg_lock); 1918 1868 1919 - /* the first reset to the SPDIF master mode? */ 1869 + /* the first switch to the ext. clock mode? */ 1920 1870 if (old_rate != new_rate && !new_rate) { 1921 1871 /* notify akm chips as well */ 1922 1872 unsigned int i; ··· 2186 2136 snd_vt1724_phase_cards, 2187 2137 snd_vt1724_wtm_cards, 2188 2138 snd_vt1724_se_cards, 2139 + snd_vt1724_qtet_cards, 2189 2140 NULL, 2190 2141 }; 2191 2142 ··· 2485 2434 mutex_init(&ice->open_mutex); 2486 2435 mutex_init(&ice->i2c_mutex); 2487 2436 ice->gpio.set_mask = snd_vt1724_set_gpio_mask; 2437 + ice->gpio.get_mask = snd_vt1724_get_gpio_mask; 2488 2438 ice->gpio.set_dir = snd_vt1724_set_gpio_dir; 2439 + ice->gpio.get_dir = snd_vt1724_get_gpio_dir; 2489 2440 ice->gpio.set_data = snd_vt1724_set_gpio_data; 2490 2441 ice->gpio.get_data = snd_vt1724_get_gpio_data; 2491 2442 ice->card = card; ··· 2575 2522 return err; 2576 2523 } 2577 2524 2525 + /* field init before calling chip_init */ 2526 + ice->ext_clock_count = 0; 2527 + 2578 2528 for (tbl = card_tables; *tbl; tbl++) { 2579 2529 for (c = *tbl; c->subvendor; c++) { 2580 2530 if (c->subvendor == ice->eeprom.subvendor) { ··· 2616 2560 ice->set_mclk = stdclock_set_mclk; 2617 2561 if (!ice->set_spdif_clock) 2618 2562 ice->set_spdif_clock = stdclock_set_spdif_clock; 2563 + if (!ice->get_spdif_master_type) 2564 + ice->get_spdif_master_type = stdclock_get_spdif_master_type; 2565 + if (!ice->ext_clock_names) 2566 + ice->ext_clock_names = ext_clock_names; 2567 + if (!ice->ext_clock_count) 2568 + ice->ext_clock_count = ARRAY_SIZE(ext_clock_names); 2569 + 2619 2570 if (!ice->hw_rates) 2620 2571 set_std_hw_rates(ice); 2621 2572 ··· 2782 2719 2783 2720 if (ice->pm_saved_is_spdif_master) { 2784 2721 /* switching to external clock via SPDIF */ 2785 - ice->set_spdif_clock(ice); 2722 + ice->set_spdif_clock(ice, 0); 2786 2723 } else { 2787 2724 /* internal on-card clock */ 2788 2725 snd_vt1724_set_pro_rate(ice, ice->pro_rate_default, 1);
+2 -22
sound/pci/ice1712/juli.c
··· 412 412 }, 413 413 }; 414 414 415 - 416 - static void ak4358_proc_regs_read(struct snd_info_entry *entry, 417 - struct snd_info_buffer *buffer) 418 - { 419 - struct snd_ice1712 *ice = (struct snd_ice1712 *)entry->private_data; 420 - int reg, val; 421 - for (reg = 0; reg <= 0xf; reg++) { 422 - val = snd_akm4xxx_get(ice->akm, 0, reg); 423 - snd_iprintf(buffer, "0x%02x = 0x%02x\n", reg, val); 424 - } 425 - } 426 - 427 - static void ak4358_proc_init(struct snd_ice1712 *ice) 428 - { 429 - struct snd_info_entry *entry; 430 - if (!snd_card_proc_new(ice->card, "ak4358_codec", &entry)) 431 - snd_info_set_text_ops(entry, ice, ak4358_proc_regs_read); 432 - } 433 - 434 415 static char *slave_vols[] __devinitdata = { 435 416 PCM_VOLUME, 436 417 MONITOR_AN_IN_VOLUME, ··· 477 496 /* only capture SPDIF over AK4114 */ 478 497 err = snd_ak4114_build(spec->ak4114, NULL, 479 498 ice->pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream); 480 - 481 - ak4358_proc_init(ice); 482 499 if (err < 0) 483 500 return err; 484 501 return 0; ··· 554 575 } 555 576 556 577 /* setting clock to external - SPDIF */ 557 - static void juli_set_spdif_clock(struct snd_ice1712 *ice) 578 + static int juli_set_spdif_clock(struct snd_ice1712 *ice, int type) 558 579 { 559 580 unsigned int old; 560 581 old = ice->gpio.get_data(ice); 561 582 /* external clock (= 0), multiply 1x, 48kHz */ 562 583 ice->gpio.set_data(ice, (old & ~GPIO_RATE_MASK) | GPIO_MULTI_1X | 563 584 GPIO_FREQ_48KHZ); 585 + return 0; 564 586 } 565 587 566 588 /* Called when ak4114 detects change in the input SPDIF stream */
+1130
sound/pci/ice1712/quartet.c
··· 1 + /* 2 + * ALSA driver for ICEnsemble VT1724 (Envy24HT) 3 + * 4 + * Lowlevel functions for Infrasonic Quartet 5 + * 6 + * Copyright (c) 2009 Pavel Hofman <pavel.hofman@ivitera.com> 7 + * 8 + * 9 + * This program is free software; you can redistribute it and/or modify 10 + * it under the terms of the GNU General Public License as published by 11 + * the Free Software Foundation; either version 2 of the License, or 12 + * (at your option) any later version. 13 + * 14 + * This program is distributed in the hope that it will be useful, 15 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 + * GNU General Public License for more details. 18 + * 19 + * You should have received a copy of the GNU General Public License 20 + * along with this program; if not, write to the Free Software 21 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 22 + * 23 + */ 24 + 25 + #include <asm/io.h> 26 + #include <linux/delay.h> 27 + #include <linux/interrupt.h> 28 + #include <linux/init.h> 29 + #include <linux/slab.h> 30 + #include <sound/core.h> 31 + #include <sound/tlv.h> 32 + #include <sound/info.h> 33 + 34 + #include "ice1712.h" 35 + #include "envy24ht.h" 36 + #include <sound/ak4113.h> 37 + #include "quartet.h" 38 + 39 + struct qtet_spec { 40 + struct ak4113 *ak4113; 41 + unsigned int scr; /* system control register */ 42 + unsigned int mcr; /* monitoring control register */ 43 + unsigned int cpld; /* cpld register */ 44 + }; 45 + 46 + struct qtet_kcontrol_private { 47 + unsigned int bit; 48 + void (*set_register)(struct snd_ice1712 *ice, unsigned int val); 49 + unsigned int (*get_register)(struct snd_ice1712 *ice); 50 + unsigned char *texts[2]; 51 + }; 52 + 53 + enum { 54 + IN12_SEL = 0, 55 + IN34_SEL, 56 + AIN34_SEL, 57 + COAX_OUT, 58 + IN12_MON12, 59 + IN12_MON34, 60 + IN34_MON12, 61 + IN34_MON34, 62 + OUT12_MON34, 63 + OUT34_MON12, 64 + }; 65 + 66 + static char *ext_clock_names[3] = {"IEC958 In", "Word Clock 1xFS", 67 + "Word Clock 256xFS"}; 68 + 69 + /* chip address on I2C bus */ 70 + #define AK4113_ADDR 0x26 /* S/PDIF receiver */ 71 + 72 + /* chip address on SPI bus */ 73 + #define AK4620_ADDR 0x02 /* ADC/DAC */ 74 + 75 + 76 + /* 77 + * GPIO pins 78 + */ 79 + 80 + /* GPIO0 - O - DATA0, def. 0 */ 81 + #define GPIO_D0 (1<<0) 82 + /* GPIO1 - I/O - DATA1, Jack Detect Input0 (0:present, 1:missing), def. 1 */ 83 + #define GPIO_D1_JACKDTC0 (1<<1) 84 + /* GPIO2 - I/O - DATA2, Jack Detect Input1 (0:present, 1:missing), def. 1 */ 85 + #define GPIO_D2_JACKDTC1 (1<<2) 86 + /* GPIO3 - I/O - DATA3, def. 1 */ 87 + #define GPIO_D3 (1<<3) 88 + /* GPIO4 - I/O - DATA4, SPI CDTO, def. 1 */ 89 + #define GPIO_D4_SPI_CDTO (1<<4) 90 + /* GPIO5 - I/O - DATA5, SPI CCLK, def. 1 */ 91 + #define GPIO_D5_SPI_CCLK (1<<5) 92 + /* GPIO6 - I/O - DATA6, Cable Detect Input (0:detected, 1:not detected */ 93 + #define GPIO_D6_CD (1<<6) 94 + /* GPIO7 - I/O - DATA7, Device Detect Input (0:detected, 1:not detected */ 95 + #define GPIO_D7_DD (1<<7) 96 + /* GPIO8 - O - CPLD Chip Select, def. 1 */ 97 + #define GPIO_CPLD_CSN (1<<8) 98 + /* GPIO9 - O - CPLD register read/write (0:write, 1:read), def. 0 */ 99 + #define GPIO_CPLD_RW (1<<9) 100 + /* GPIO10 - O - SPI Chip Select for CODEC#0, def. 1 */ 101 + #define GPIO_SPI_CSN0 (1<<10) 102 + /* GPIO11 - O - SPI Chip Select for CODEC#1, def. 1 */ 103 + #define GPIO_SPI_CSN1 (1<<11) 104 + /* GPIO12 - O - Ex. Register Output Enable (0:enable, 1:disable), def. 1, 105 + * init 0 */ 106 + #define GPIO_EX_GPIOE (1<<12) 107 + /* GPIO13 - O - Ex. Register0 Chip Select for System Control Register, 108 + * def. 1 */ 109 + #define GPIO_SCR (1<<13) 110 + /* GPIO14 - O - Ex. Register1 Chip Select for Monitor Control Register, 111 + * def. 1 */ 112 + #define GPIO_MCR (1<<14) 113 + 114 + #define GPIO_SPI_ALL (GPIO_D4_SPI_CDTO | GPIO_D5_SPI_CCLK |\ 115 + GPIO_SPI_CSN0 | GPIO_SPI_CSN1) 116 + 117 + #define GPIO_DATA_MASK (GPIO_D0 | GPIO_D1_JACKDTC0 | \ 118 + GPIO_D2_JACKDTC1 | GPIO_D3 | \ 119 + GPIO_D4_SPI_CDTO | GPIO_D5_SPI_CCLK | \ 120 + GPIO_D6_CD | GPIO_D7_DD) 121 + 122 + /* System Control Register GPIO_SCR data bits */ 123 + /* Mic/Line select relay (0:line, 1:mic) */ 124 + #define SCR_RELAY GPIO_D0 125 + /* Phantom power drive control (0:5V, 1:48V) */ 126 + #define SCR_PHP_V GPIO_D1_JACKDTC0 127 + /* H/W mute control (0:Normal, 1:Mute) */ 128 + #define SCR_MUTE GPIO_D2_JACKDTC1 129 + /* Phantom power control (0:Phantom on, 1:off) */ 130 + #define SCR_PHP GPIO_D3 131 + /* Analog input 1/2 Source Select */ 132 + #define SCR_AIN12_SEL0 GPIO_D4_SPI_CDTO 133 + #define SCR_AIN12_SEL1 GPIO_D5_SPI_CCLK 134 + /* Analog input 3/4 Source Select (0:line, 1:hi-z) */ 135 + #define SCR_AIN34_SEL GPIO_D6_CD 136 + /* Codec Power Down (0:power down, 1:normal) */ 137 + #define SCR_CODEC_PDN GPIO_D7_DD 138 + 139 + #define SCR_AIN12_LINE (0) 140 + #define SCR_AIN12_MIC (SCR_AIN12_SEL0) 141 + #define SCR_AIN12_LOWCUT (SCR_AIN12_SEL1 | SCR_AIN12_SEL0) 142 + 143 + /* Monitor Control Register GPIO_MCR data bits */ 144 + /* Input 1/2 to Monitor 1/2 (0:off, 1:on) */ 145 + #define MCR_IN12_MON12 GPIO_D0 146 + /* Input 1/2 to Monitor 3/4 (0:off, 1:on) */ 147 + #define MCR_IN12_MON34 GPIO_D1_JACKDTC0 148 + /* Input 3/4 to Monitor 1/2 (0:off, 1:on) */ 149 + #define MCR_IN34_MON12 GPIO_D2_JACKDTC1 150 + /* Input 3/4 to Monitor 3/4 (0:off, 1:on) */ 151 + #define MCR_IN34_MON34 GPIO_D3 152 + /* Output to Monitor 1/2 (0:off, 1:on) */ 153 + #define MCR_OUT34_MON12 GPIO_D4_SPI_CDTO 154 + /* Output to Monitor 3/4 (0:off, 1:on) */ 155 + #define MCR_OUT12_MON34 GPIO_D5_SPI_CCLK 156 + 157 + /* CPLD Register DATA bits */ 158 + /* Clock Rate Select */ 159 + #define CPLD_CKS0 GPIO_D0 160 + #define CPLD_CKS1 GPIO_D1_JACKDTC0 161 + #define CPLD_CKS2 GPIO_D2_JACKDTC1 162 + /* Sync Source Select (0:Internal, 1:External) */ 163 + #define CPLD_SYNC_SEL GPIO_D3 164 + /* Word Clock FS Select (0:FS, 1:256FS) */ 165 + #define CPLD_WORD_SEL GPIO_D4_SPI_CDTO 166 + /* Coaxial Output Source (IS-Link) (0:SPDIF, 1:I2S) */ 167 + #define CPLD_COAX_OUT GPIO_D5_SPI_CCLK 168 + /* Input 1/2 Source Select (0:Analog12, 1:An34) */ 169 + #define CPLD_IN12_SEL GPIO_D6_CD 170 + /* Input 3/4 Source Select (0:Analog34, 1:Digital In) */ 171 + #define CPLD_IN34_SEL GPIO_D7_DD 172 + 173 + /* internal clock (CPLD_SYNC_SEL = 0) options */ 174 + #define CPLD_CKS_44100HZ (0) 175 + #define CPLD_CKS_48000HZ (CPLD_CKS0) 176 + #define CPLD_CKS_88200HZ (CPLD_CKS1) 177 + #define CPLD_CKS_96000HZ (CPLD_CKS1 | CPLD_CKS0) 178 + #define CPLD_CKS_176400HZ (CPLD_CKS2) 179 + #define CPLD_CKS_192000HZ (CPLD_CKS2 | CPLD_CKS0) 180 + 181 + #define CPLD_CKS_MASK (CPLD_CKS0 | CPLD_CKS1 | CPLD_CKS2) 182 + 183 + /* external clock (CPLD_SYNC_SEL = 1) options */ 184 + /* external clock - SPDIF */ 185 + #define CPLD_EXT_SPDIF (0 | CPLD_SYNC_SEL) 186 + /* external clock - WordClock 1xfs */ 187 + #define CPLD_EXT_WORDCLOCK_1FS (CPLD_CKS1 | CPLD_SYNC_SEL) 188 + /* external clock - WordClock 256xfs */ 189 + #define CPLD_EXT_WORDCLOCK_256FS (CPLD_CKS1 | CPLD_WORD_SEL |\ 190 + CPLD_SYNC_SEL) 191 + 192 + #define EXT_SPDIF_TYPE 0 193 + #define EXT_WORDCLOCK_1FS_TYPE 1 194 + #define EXT_WORDCLOCK_256FS_TYPE 2 195 + 196 + #define AK4620_DFS0 (1<<0) 197 + #define AK4620_DFS1 (1<<1) 198 + #define AK4620_CKS0 (1<<2) 199 + #define AK4620_CKS1 (1<<3) 200 + /* Clock and Format Control register */ 201 + #define AK4620_DFS_REG 0x02 202 + 203 + /* Deem and Volume Control register */ 204 + #define AK4620_DEEMVOL_REG 0x03 205 + #define AK4620_SMUTE (1<<7) 206 + 207 + /* 208 + * Conversion from int value to its binary form. Used for debugging. 209 + * The output buffer must be allocated prior to calling the function. 210 + */ 211 + static char *get_binary(char *buffer, int value) 212 + { 213 + int i, j, pos; 214 + pos = 0; 215 + for (i = 0; i < 4; ++i) { 216 + for (j = 0; j < 8; ++j) { 217 + if (value & (1 << (31-(i*8 + j)))) 218 + buffer[pos] = '1'; 219 + else 220 + buffer[pos] = '0'; 221 + pos++; 222 + } 223 + if (i < 3) { 224 + buffer[pos] = ' '; 225 + pos++; 226 + } 227 + } 228 + buffer[pos] = '\0'; 229 + return buffer; 230 + } 231 + 232 + /* 233 + * Initial setup of the conversion array GPIO <-> rate 234 + */ 235 + static unsigned int qtet_rates[] = { 236 + 44100, 48000, 88200, 237 + 96000, 176400, 192000, 238 + }; 239 + 240 + static unsigned int cks_vals[] = { 241 + CPLD_CKS_44100HZ, CPLD_CKS_48000HZ, CPLD_CKS_88200HZ, 242 + CPLD_CKS_96000HZ, CPLD_CKS_176400HZ, CPLD_CKS_192000HZ, 243 + }; 244 + 245 + static struct snd_pcm_hw_constraint_list qtet_rates_info = { 246 + .count = ARRAY_SIZE(qtet_rates), 247 + .list = qtet_rates, 248 + .mask = 0, 249 + }; 250 + 251 + static void qtet_ak4113_write(void *private_data, unsigned char reg, 252 + unsigned char val) 253 + { 254 + snd_vt1724_write_i2c((struct snd_ice1712 *)private_data, AK4113_ADDR, 255 + reg, val); 256 + } 257 + 258 + static unsigned char qtet_ak4113_read(void *private_data, unsigned char reg) 259 + { 260 + return snd_vt1724_read_i2c((struct snd_ice1712 *)private_data, 261 + AK4113_ADDR, reg); 262 + } 263 + 264 + 265 + /* 266 + * AK4620 section 267 + */ 268 + 269 + /* 270 + * Write data to addr register of ak4620 271 + */ 272 + static void qtet_akm_write(struct snd_akm4xxx *ak, int chip, 273 + unsigned char addr, unsigned char data) 274 + { 275 + unsigned int tmp, orig_dir; 276 + int idx; 277 + unsigned int addrdata; 278 + struct snd_ice1712 *ice = ak->private_data[0]; 279 + 280 + if (snd_BUG_ON(chip < 0 || chip >= 4)) 281 + return; 282 + /*printk(KERN_DEBUG "Writing to AK4620: chip=%d, addr=0x%x, 283 + data=0x%x\n", chip, addr, data);*/ 284 + orig_dir = ice->gpio.get_dir(ice); 285 + ice->gpio.set_dir(ice, orig_dir | GPIO_SPI_ALL); 286 + /* set mask - only SPI bits */ 287 + ice->gpio.set_mask(ice, ~GPIO_SPI_ALL); 288 + 289 + tmp = ice->gpio.get_data(ice); 290 + /* high all */ 291 + tmp |= GPIO_SPI_ALL; 292 + ice->gpio.set_data(ice, tmp); 293 + udelay(100); 294 + /* drop chip select */ 295 + if (chip) 296 + /* CODEC 1 */ 297 + tmp &= ~GPIO_SPI_CSN1; 298 + else 299 + tmp &= ~GPIO_SPI_CSN0; 300 + ice->gpio.set_data(ice, tmp); 301 + udelay(100); 302 + 303 + /* build I2C address + data byte */ 304 + addrdata = (AK4620_ADDR << 6) | 0x20 | (addr & 0x1f); 305 + addrdata = (addrdata << 8) | data; 306 + for (idx = 15; idx >= 0; idx--) { 307 + /* drop clock */ 308 + tmp &= ~GPIO_D5_SPI_CCLK; 309 + ice->gpio.set_data(ice, tmp); 310 + udelay(100); 311 + /* set data */ 312 + if (addrdata & (1 << idx)) 313 + tmp |= GPIO_D4_SPI_CDTO; 314 + else 315 + tmp &= ~GPIO_D4_SPI_CDTO; 316 + ice->gpio.set_data(ice, tmp); 317 + udelay(100); 318 + /* raise clock */ 319 + tmp |= GPIO_D5_SPI_CCLK; 320 + ice->gpio.set_data(ice, tmp); 321 + udelay(100); 322 + } 323 + /* all back to 1 */ 324 + tmp |= GPIO_SPI_ALL; 325 + ice->gpio.set_data(ice, tmp); 326 + udelay(100); 327 + 328 + /* return all gpios to non-writable */ 329 + ice->gpio.set_mask(ice, 0xffffff); 330 + /* restore GPIOs direction */ 331 + ice->gpio.set_dir(ice, orig_dir); 332 + } 333 + 334 + static void qtet_akm_set_regs(struct snd_akm4xxx *ak, unsigned char addr, 335 + unsigned char mask, unsigned char value) 336 + { 337 + unsigned char tmp; 338 + int chip; 339 + for (chip = 0; chip < ak->num_chips; chip++) { 340 + tmp = snd_akm4xxx_get(ak, chip, addr); 341 + /* clear the bits */ 342 + tmp &= ~mask; 343 + /* set the new bits */ 344 + tmp |= value; 345 + snd_akm4xxx_write(ak, chip, addr, tmp); 346 + } 347 + } 348 + 349 + /* 350 + * change the rate of AK4620 351 + */ 352 + static void qtet_akm_set_rate_val(struct snd_akm4xxx *ak, unsigned int rate) 353 + { 354 + unsigned char ak4620_dfs; 355 + 356 + if (rate == 0) /* no hint - S/PDIF input is master or the new spdif 357 + input rate undetected, simply return */ 358 + return; 359 + 360 + /* adjust DFS on codecs - see datasheet */ 361 + if (rate > 108000) 362 + ak4620_dfs = AK4620_DFS1 | AK4620_CKS1; 363 + else if (rate > 54000) 364 + ak4620_dfs = AK4620_DFS0 | AK4620_CKS0; 365 + else 366 + ak4620_dfs = 0; 367 + 368 + /* set new value */ 369 + qtet_akm_set_regs(ak, AK4620_DFS_REG, AK4620_DFS0 | AK4620_DFS1 | 370 + AK4620_CKS0 | AK4620_CKS1, ak4620_dfs); 371 + } 372 + 373 + #define AK_CONTROL(xname, xch) { .name = xname, .num_channels = xch } 374 + 375 + #define PCM_12_PLAYBACK_VOLUME "PCM 1/2 Playback Volume" 376 + #define PCM_34_PLAYBACK_VOLUME "PCM 3/4 Playback Volume" 377 + #define PCM_12_CAPTURE_VOLUME "PCM 1/2 Capture Volume" 378 + #define PCM_34_CAPTURE_VOLUME "PCM 3/4 Capture Volume" 379 + 380 + static const struct snd_akm4xxx_dac_channel qtet_dac[] = { 381 + AK_CONTROL(PCM_12_PLAYBACK_VOLUME, 2), 382 + AK_CONTROL(PCM_34_PLAYBACK_VOLUME, 2), 383 + }; 384 + 385 + static const struct snd_akm4xxx_adc_channel qtet_adc[] = { 386 + AK_CONTROL(PCM_12_CAPTURE_VOLUME, 2), 387 + AK_CONTROL(PCM_34_CAPTURE_VOLUME, 2), 388 + }; 389 + 390 + static struct snd_akm4xxx akm_qtet_dac __devinitdata = { 391 + .type = SND_AK4620, 392 + .num_dacs = 4, /* DAC1 - Output 12 393 + */ 394 + .num_adcs = 4, /* ADC1 - Input 12 395 + */ 396 + .ops = { 397 + .write = qtet_akm_write, 398 + .set_rate_val = qtet_akm_set_rate_val, 399 + }, 400 + .dac_info = qtet_dac, 401 + .adc_info = qtet_adc, 402 + }; 403 + 404 + /* Communication routines with the CPLD */ 405 + 406 + 407 + /* Writes data to external register reg, both reg and data are 408 + * GPIO representations */ 409 + static void reg_write(struct snd_ice1712 *ice, unsigned int reg, 410 + unsigned int data) 411 + { 412 + unsigned int tmp; 413 + 414 + mutex_lock(&ice->gpio_mutex); 415 + /* set direction of used GPIOs*/ 416 + /* all outputs */ 417 + tmp = 0x00ffff; 418 + ice->gpio.set_dir(ice, tmp); 419 + /* mask - writable bits */ 420 + ice->gpio.set_mask(ice, ~(tmp)); 421 + /* write the data */ 422 + tmp = ice->gpio.get_data(ice); 423 + tmp &= ~GPIO_DATA_MASK; 424 + tmp |= data; 425 + ice->gpio.set_data(ice, tmp); 426 + udelay(100); 427 + /* drop output enable */ 428 + tmp &= ~GPIO_EX_GPIOE; 429 + ice->gpio.set_data(ice, tmp); 430 + udelay(100); 431 + /* drop the register gpio */ 432 + tmp &= ~reg; 433 + ice->gpio.set_data(ice, tmp); 434 + udelay(100); 435 + /* raise the register GPIO */ 436 + tmp |= reg; 437 + ice->gpio.set_data(ice, tmp); 438 + udelay(100); 439 + 440 + /* raise all data gpios */ 441 + tmp |= GPIO_DATA_MASK; 442 + ice->gpio.set_data(ice, tmp); 443 + /* mask - immutable bits */ 444 + ice->gpio.set_mask(ice, 0xffffff); 445 + /* outputs only 8-15 */ 446 + ice->gpio.set_dir(ice, 0x00ff00); 447 + mutex_unlock(&ice->gpio_mutex); 448 + } 449 + 450 + static unsigned int get_scr(struct snd_ice1712 *ice) 451 + { 452 + struct qtet_spec *spec = ice->spec; 453 + return spec->scr; 454 + } 455 + 456 + static unsigned int get_mcr(struct snd_ice1712 *ice) 457 + { 458 + struct qtet_spec *spec = ice->spec; 459 + return spec->mcr; 460 + } 461 + 462 + static unsigned int get_cpld(struct snd_ice1712 *ice) 463 + { 464 + struct qtet_spec *spec = ice->spec; 465 + return spec->cpld; 466 + } 467 + 468 + static void set_scr(struct snd_ice1712 *ice, unsigned int val) 469 + { 470 + struct qtet_spec *spec = ice->spec; 471 + reg_write(ice, GPIO_SCR, val); 472 + spec->scr = val; 473 + } 474 + 475 + static void set_mcr(struct snd_ice1712 *ice, unsigned int val) 476 + { 477 + struct qtet_spec *spec = ice->spec; 478 + reg_write(ice, GPIO_MCR, val); 479 + spec->mcr = val; 480 + } 481 + 482 + static void set_cpld(struct snd_ice1712 *ice, unsigned int val) 483 + { 484 + struct qtet_spec *spec = ice->spec; 485 + reg_write(ice, GPIO_CPLD_CSN, val); 486 + spec->cpld = val; 487 + } 488 + #ifdef CONFIG_PROC_FS 489 + static void proc_regs_read(struct snd_info_entry *entry, 490 + struct snd_info_buffer *buffer) 491 + { 492 + struct snd_ice1712 *ice = entry->private_data; 493 + char bin_buffer[36]; 494 + 495 + snd_iprintf(buffer, "SCR: %s\n", get_binary(bin_buffer, 496 + get_scr(ice))); 497 + snd_iprintf(buffer, "MCR: %s\n", get_binary(bin_buffer, 498 + get_mcr(ice))); 499 + snd_iprintf(buffer, "CPLD: %s\n", get_binary(bin_buffer, 500 + get_cpld(ice))); 501 + } 502 + 503 + static void proc_init(struct snd_ice1712 *ice) 504 + { 505 + struct snd_info_entry *entry; 506 + if (!snd_card_proc_new(ice->card, "quartet", &entry)) 507 + snd_info_set_text_ops(entry, ice, proc_regs_read); 508 + } 509 + #else /* !CONFIG_PROC_FS */ 510 + static void proc_init(struct snd_ice1712 *ice) {} 511 + #endif 512 + 513 + static int qtet_mute_get(struct snd_kcontrol *kcontrol, 514 + struct snd_ctl_elem_value *ucontrol) 515 + { 516 + struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); 517 + unsigned int val; 518 + val = get_scr(ice) & SCR_MUTE; 519 + ucontrol->value.integer.value[0] = (val) ? 0 : 1; 520 + return 0; 521 + } 522 + 523 + static int qtet_mute_put(struct snd_kcontrol *kcontrol, 524 + struct snd_ctl_elem_value *ucontrol) 525 + { 526 + struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); 527 + unsigned int old, new, smute; 528 + old = get_scr(ice) & SCR_MUTE; 529 + if (ucontrol->value.integer.value[0]) { 530 + /* unmute */ 531 + new = 0; 532 + /* un-smuting DAC */ 533 + smute = 0; 534 + } else { 535 + /* mute */ 536 + new = SCR_MUTE; 537 + /* smuting DAC */ 538 + smute = AK4620_SMUTE; 539 + } 540 + if (old != new) { 541 + struct snd_akm4xxx *ak = ice->akm; 542 + set_scr(ice, (get_scr(ice) & ~SCR_MUTE) | new); 543 + /* set smute */ 544 + qtet_akm_set_regs(ak, AK4620_DEEMVOL_REG, AK4620_SMUTE, smute); 545 + return 1; 546 + } 547 + /* no change */ 548 + return 0; 549 + } 550 + 551 + static int qtet_ain12_enum_info(struct snd_kcontrol *kcontrol, 552 + struct snd_ctl_elem_info *uinfo) 553 + { 554 + static char *texts[3] = {"Line In 1/2", "Mic", "Mic + Low-cut"}; 555 + uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 556 + uinfo->count = 1; 557 + uinfo->value.enumerated.items = ARRAY_SIZE(texts); 558 + 559 + if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items) 560 + uinfo->value.enumerated.item = 561 + uinfo->value.enumerated.items - 1; 562 + strcpy(uinfo->value.enumerated.name, 563 + texts[uinfo->value.enumerated.item]); 564 + 565 + return 0; 566 + } 567 + 568 + static int qtet_ain12_sw_get(struct snd_kcontrol *kcontrol, 569 + struct snd_ctl_elem_value *ucontrol) 570 + { 571 + struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); 572 + unsigned int val, result; 573 + val = get_scr(ice) & (SCR_AIN12_SEL1 | SCR_AIN12_SEL0); 574 + switch (val) { 575 + case SCR_AIN12_LINE: 576 + result = 0; 577 + break; 578 + case SCR_AIN12_MIC: 579 + result = 1; 580 + break; 581 + case SCR_AIN12_LOWCUT: 582 + result = 2; 583 + break; 584 + default: 585 + /* BUG - no other combinations allowed */ 586 + snd_BUG(); 587 + result = 0; 588 + } 589 + ucontrol->value.integer.value[0] = result; 590 + return 0; 591 + } 592 + 593 + static int qtet_ain12_sw_put(struct snd_kcontrol *kcontrol, 594 + struct snd_ctl_elem_value *ucontrol) 595 + { 596 + struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); 597 + unsigned int old, new, tmp, masked_old; 598 + old = new = get_scr(ice); 599 + masked_old = old & (SCR_AIN12_SEL1 | SCR_AIN12_SEL0); 600 + tmp = ucontrol->value.integer.value[0]; 601 + if (tmp == 2) 602 + tmp = 3; /* binary 10 is not supported */ 603 + tmp <<= 4; /* shifting to SCR_AIN12_SEL0 */ 604 + if (tmp != masked_old) { 605 + /* change requested */ 606 + switch (tmp) { 607 + case SCR_AIN12_LINE: 608 + new = old & ~(SCR_AIN12_SEL1 | SCR_AIN12_SEL0); 609 + set_scr(ice, new); 610 + /* turn off relay */ 611 + new &= ~SCR_RELAY; 612 + set_scr(ice, new); 613 + break; 614 + case SCR_AIN12_MIC: 615 + /* turn on relay */ 616 + new = old | SCR_RELAY; 617 + set_scr(ice, new); 618 + new = (new & ~SCR_AIN12_SEL1) | SCR_AIN12_SEL0; 619 + set_scr(ice, new); 620 + break; 621 + case SCR_AIN12_LOWCUT: 622 + /* turn on relay */ 623 + new = old | SCR_RELAY; 624 + set_scr(ice, new); 625 + new |= SCR_AIN12_SEL1 | SCR_AIN12_SEL0; 626 + set_scr(ice, new); 627 + break; 628 + default: 629 + snd_BUG(); 630 + } 631 + return 1; 632 + } 633 + /* no change */ 634 + return 0; 635 + } 636 + 637 + static int qtet_php_get(struct snd_kcontrol *kcontrol, 638 + struct snd_ctl_elem_value *ucontrol) 639 + { 640 + struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); 641 + unsigned int val; 642 + /* if phantom voltage =48V, phantom on */ 643 + val = get_scr(ice) & SCR_PHP_V; 644 + ucontrol->value.integer.value[0] = val ? 1 : 0; 645 + return 0; 646 + } 647 + 648 + static int qtet_php_put(struct snd_kcontrol *kcontrol, 649 + struct snd_ctl_elem_value *ucontrol) 650 + { 651 + struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); 652 + unsigned int old, new; 653 + old = new = get_scr(ice); 654 + if (ucontrol->value.integer.value[0] /* phantom on requested */ 655 + && (~old & SCR_PHP_V)) /* 0 = voltage 5V */ { 656 + /* is off, turn on */ 657 + /* turn voltage on first, = 1 */ 658 + new = old | SCR_PHP_V; 659 + set_scr(ice, new); 660 + /* turn phantom on, = 0 */ 661 + new &= ~SCR_PHP; 662 + set_scr(ice, new); 663 + } else if (!ucontrol->value.integer.value[0] && (old & SCR_PHP_V)) { 664 + /* phantom off requested and 1 = voltage 48V */ 665 + /* is on, turn off */ 666 + /* turn voltage off first, = 0 */ 667 + new = old & ~SCR_PHP_V; 668 + set_scr(ice, new); 669 + /* turn phantom off, = 1 */ 670 + new |= SCR_PHP; 671 + set_scr(ice, new); 672 + } 673 + if (old != new) 674 + return 1; 675 + /* no change */ 676 + return 0; 677 + } 678 + 679 + #define PRIV_SW(xid, xbit, xreg) [xid] = {.bit = xbit,\ 680 + .set_register = set_##xreg,\ 681 + .get_register = get_##xreg, } 682 + 683 + 684 + #define PRIV_ENUM2(xid, xbit, xreg, xtext1, xtext2) [xid] = {.bit = xbit,\ 685 + .set_register = set_##xreg,\ 686 + .get_register = get_##xreg,\ 687 + .texts = {xtext1, xtext2} } 688 + 689 + static struct qtet_kcontrol_private qtet_privates[] = { 690 + PRIV_ENUM2(IN12_SEL, CPLD_IN12_SEL, cpld, "An In 1/2", "An In 3/4"), 691 + PRIV_ENUM2(IN34_SEL, CPLD_IN34_SEL, cpld, "An In 3/4", "IEC958 In"), 692 + PRIV_ENUM2(AIN34_SEL, SCR_AIN34_SEL, scr, "Line In 3/4", "Hi-Z"), 693 + PRIV_ENUM2(COAX_OUT, CPLD_COAX_OUT, cpld, "IEC958", "I2S"), 694 + PRIV_SW(IN12_MON12, MCR_IN12_MON12, mcr), 695 + PRIV_SW(IN12_MON34, MCR_IN12_MON34, mcr), 696 + PRIV_SW(IN34_MON12, MCR_IN34_MON12, mcr), 697 + PRIV_SW(IN34_MON34, MCR_IN34_MON34, mcr), 698 + PRIV_SW(OUT12_MON34, MCR_OUT12_MON34, mcr), 699 + PRIV_SW(OUT34_MON12, MCR_OUT34_MON12, mcr), 700 + }; 701 + 702 + static int qtet_enum_info(struct snd_kcontrol *kcontrol, 703 + struct snd_ctl_elem_info *uinfo) 704 + { 705 + struct qtet_kcontrol_private private = 706 + qtet_privates[kcontrol->private_value]; 707 + uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 708 + uinfo->count = 1; 709 + uinfo->value.enumerated.items = ARRAY_SIZE(private.texts); 710 + 711 + if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items) 712 + uinfo->value.enumerated.item = 713 + uinfo->value.enumerated.items - 1; 714 + strcpy(uinfo->value.enumerated.name, 715 + private.texts[uinfo->value.enumerated.item]); 716 + 717 + return 0; 718 + } 719 + 720 + static int qtet_sw_get(struct snd_kcontrol *kcontrol, 721 + struct snd_ctl_elem_value *ucontrol) 722 + { 723 + struct qtet_kcontrol_private private = 724 + qtet_privates[kcontrol->private_value]; 725 + struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); 726 + ucontrol->value.integer.value[0] = 727 + (private.get_register(ice) & private.bit) ? 1 : 0; 728 + return 0; 729 + } 730 + 731 + static int qtet_sw_put(struct snd_kcontrol *kcontrol, 732 + struct snd_ctl_elem_value *ucontrol) 733 + { 734 + struct qtet_kcontrol_private private = 735 + qtet_privates[kcontrol->private_value]; 736 + struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol); 737 + unsigned int old, new; 738 + old = private.get_register(ice); 739 + if (ucontrol->value.integer.value[0]) 740 + new = old | private.bit; 741 + else 742 + new = old & ~private.bit; 743 + if (old != new) { 744 + private.set_register(ice, new); 745 + return 1; 746 + } 747 + /* no change */ 748 + return 0; 749 + } 750 + 751 + #define qtet_sw_info snd_ctl_boolean_mono_info 752 + 753 + #define QTET_CONTROL(xname, xtype, xpriv) \ 754 + {.iface = SNDRV_CTL_ELEM_IFACE_MIXER,\ 755 + .name = xname,\ 756 + .info = qtet_##xtype##_info,\ 757 + .get = qtet_sw_get,\ 758 + .put = qtet_sw_put,\ 759 + .private_value = xpriv } 760 + 761 + static struct snd_kcontrol_new qtet_controls[] __devinitdata = { 762 + { 763 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 764 + .name = "Master Playback Switch", 765 + .info = qtet_sw_info, 766 + .get = qtet_mute_get, 767 + .put = qtet_mute_put, 768 + .private_value = 0 769 + }, 770 + { 771 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 772 + .name = "Phantom Power", 773 + .info = qtet_sw_info, 774 + .get = qtet_php_get, 775 + .put = qtet_php_put, 776 + .private_value = 0 777 + }, 778 + { 779 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 780 + .name = "Analog In 1/2 Capture Switch", 781 + .info = qtet_ain12_enum_info, 782 + .get = qtet_ain12_sw_get, 783 + .put = qtet_ain12_sw_put, 784 + .private_value = 0 785 + }, 786 + QTET_CONTROL("Analog In 3/4 Capture Switch", enum, AIN34_SEL), 787 + QTET_CONTROL("PCM In 1/2 Capture Switch", enum, IN12_SEL), 788 + QTET_CONTROL("PCM In 3/4 Capture Switch", enum, IN34_SEL), 789 + QTET_CONTROL("Coax Output Source", enum, COAX_OUT), 790 + QTET_CONTROL("Analog In 1/2 to Monitor 1/2", sw, IN12_MON12), 791 + QTET_CONTROL("Analog In 1/2 to Monitor 3/4", sw, IN12_MON34), 792 + QTET_CONTROL("Analog In 3/4 to Monitor 1/2", sw, IN34_MON12), 793 + QTET_CONTROL("Analog In 3/4 to Monitor 3/4", sw, IN34_MON34), 794 + QTET_CONTROL("Output 1/2 to Monitor 3/4", sw, OUT12_MON34), 795 + QTET_CONTROL("Output 3/4 to Monitor 1/2", sw, OUT34_MON12), 796 + }; 797 + 798 + static char *slave_vols[] __devinitdata = { 799 + PCM_12_PLAYBACK_VOLUME, 800 + PCM_34_PLAYBACK_VOLUME, 801 + NULL 802 + }; 803 + 804 + static __devinitdata 805 + DECLARE_TLV_DB_SCALE(qtet_master_db_scale, -6350, 50, 1); 806 + 807 + static struct snd_kcontrol __devinit *ctl_find(struct snd_card *card, 808 + const char *name) 809 + { 810 + struct snd_ctl_elem_id sid; 811 + memset(&sid, 0, sizeof(sid)); 812 + /* FIXME: strcpy is bad. */ 813 + strcpy(sid.name, name); 814 + sid.iface = SNDRV_CTL_ELEM_IFACE_MIXER; 815 + return snd_ctl_find_id(card, &sid); 816 + } 817 + 818 + static void __devinit add_slaves(struct snd_card *card, 819 + struct snd_kcontrol *master, char **list) 820 + { 821 + for (; *list; list++) { 822 + struct snd_kcontrol *slave = ctl_find(card, *list); 823 + if (slave) 824 + snd_ctl_add_slave(master, slave); 825 + } 826 + } 827 + 828 + static int __devinit qtet_add_controls(struct snd_ice1712 *ice) 829 + { 830 + struct qtet_spec *spec = ice->spec; 831 + int err, i; 832 + struct snd_kcontrol *vmaster; 833 + err = snd_ice1712_akm4xxx_build_controls(ice); 834 + if (err < 0) 835 + return err; 836 + for (i = 0; i < ARRAY_SIZE(qtet_controls); i++) { 837 + err = snd_ctl_add(ice->card, 838 + snd_ctl_new1(&qtet_controls[i], ice)); 839 + if (err < 0) 840 + return err; 841 + } 842 + 843 + /* Create virtual master control */ 844 + vmaster = snd_ctl_make_virtual_master("Master Playback Volume", 845 + qtet_master_db_scale); 846 + if (!vmaster) 847 + return -ENOMEM; 848 + add_slaves(ice->card, vmaster, slave_vols); 849 + err = snd_ctl_add(ice->card, vmaster); 850 + if (err < 0) 851 + return err; 852 + /* only capture SPDIF over AK4113 */ 853 + err = snd_ak4113_build(spec->ak4113, 854 + ice->pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream); 855 + if (err < 0) 856 + return err; 857 + return 0; 858 + } 859 + 860 + static inline int qtet_is_spdif_master(struct snd_ice1712 *ice) 861 + { 862 + /* CPLD_SYNC_SEL: 0 = internal, 1 = external (i.e. spdif master) */ 863 + return (get_cpld(ice) & CPLD_SYNC_SEL) ? 1 : 0; 864 + } 865 + 866 + static unsigned int qtet_get_rate(struct snd_ice1712 *ice) 867 + { 868 + int i; 869 + unsigned char result; 870 + 871 + result = get_cpld(ice) & CPLD_CKS_MASK; 872 + for (i = 0; i < ARRAY_SIZE(cks_vals); i++) 873 + if (cks_vals[i] == result) 874 + return qtet_rates[i]; 875 + return 0; 876 + } 877 + 878 + static int get_cks_val(int rate) 879 + { 880 + int i; 881 + for (i = 0; i < ARRAY_SIZE(qtet_rates); i++) 882 + if (qtet_rates[i] == rate) 883 + return cks_vals[i]; 884 + return 0; 885 + } 886 + 887 + /* setting new rate */ 888 + static void qtet_set_rate(struct snd_ice1712 *ice, unsigned int rate) 889 + { 890 + unsigned int new; 891 + unsigned char val; 892 + /* switching ice1724 to external clock - supplied by ext. circuits */ 893 + val = inb(ICEMT1724(ice, RATE)); 894 + outb(val | VT1724_SPDIF_MASTER, ICEMT1724(ice, RATE)); 895 + 896 + new = (get_cpld(ice) & ~CPLD_CKS_MASK) | get_cks_val(rate); 897 + /* switch to internal clock, drop CPLD_SYNC_SEL */ 898 + new &= ~CPLD_SYNC_SEL; 899 + /* printk(KERN_DEBUG "QT - set_rate: old %x, new %x\n", 900 + get_cpld(ice), new); */ 901 + set_cpld(ice, new); 902 + } 903 + 904 + static inline unsigned char qtet_set_mclk(struct snd_ice1712 *ice, 905 + unsigned int rate) 906 + { 907 + /* no change in master clock */ 908 + return 0; 909 + } 910 + 911 + /* setting clock to external - SPDIF */ 912 + static int qtet_set_spdif_clock(struct snd_ice1712 *ice, int type) 913 + { 914 + unsigned int old, new; 915 + 916 + old = new = get_cpld(ice); 917 + new &= ~(CPLD_CKS_MASK | CPLD_WORD_SEL); 918 + switch (type) { 919 + case EXT_SPDIF_TYPE: 920 + new |= CPLD_EXT_SPDIF; 921 + break; 922 + case EXT_WORDCLOCK_1FS_TYPE: 923 + new |= CPLD_EXT_WORDCLOCK_1FS; 924 + break; 925 + case EXT_WORDCLOCK_256FS_TYPE: 926 + new |= CPLD_EXT_WORDCLOCK_256FS; 927 + break; 928 + default: 929 + snd_BUG(); 930 + } 931 + if (old != new) { 932 + set_cpld(ice, new); 933 + /* changed */ 934 + return 1; 935 + } 936 + return 0; 937 + } 938 + 939 + static int qtet_get_spdif_master_type(struct snd_ice1712 *ice) 940 + { 941 + unsigned int val; 942 + int result; 943 + val = get_cpld(ice); 944 + /* checking only rate/clock-related bits */ 945 + val &= (CPLD_CKS_MASK | CPLD_WORD_SEL | CPLD_SYNC_SEL); 946 + if (!(val & CPLD_SYNC_SEL)) { 947 + /* switched to internal clock, is not any external type */ 948 + result = -1; 949 + } else { 950 + switch (val) { 951 + case (CPLD_EXT_SPDIF): 952 + result = EXT_SPDIF_TYPE; 953 + break; 954 + case (CPLD_EXT_WORDCLOCK_1FS): 955 + result = EXT_WORDCLOCK_1FS_TYPE; 956 + break; 957 + case (CPLD_EXT_WORDCLOCK_256FS): 958 + result = EXT_WORDCLOCK_256FS_TYPE; 959 + break; 960 + default: 961 + /* undefined combination of external clock setup */ 962 + snd_BUG(); 963 + result = 0; 964 + } 965 + } 966 + return result; 967 + } 968 + 969 + /* Called when ak4113 detects change in the input SPDIF stream */ 970 + static void qtet_ak4113_change(struct ak4113 *ak4113, unsigned char c0, 971 + unsigned char c1) 972 + { 973 + struct snd_ice1712 *ice = ak4113->change_callback_private; 974 + int rate; 975 + if ((qtet_get_spdif_master_type(ice) == EXT_SPDIF_TYPE) && 976 + c1) { 977 + /* only for SPDIF master mode, rate was changed */ 978 + rate = snd_ak4113_external_rate(ak4113); 979 + /* printk(KERN_DEBUG "ak4113 - input rate changed to %d\n", 980 + rate); */ 981 + qtet_akm_set_rate_val(ice->akm, rate); 982 + } 983 + } 984 + 985 + /* 986 + * If clock slaved to SPDIF-IN, setting runtime rate 987 + * to the detected external rate 988 + */ 989 + static void qtet_spdif_in_open(struct snd_ice1712 *ice, 990 + struct snd_pcm_substream *substream) 991 + { 992 + struct qtet_spec *spec = ice->spec; 993 + struct snd_pcm_runtime *runtime = substream->runtime; 994 + int rate; 995 + 996 + if (qtet_get_spdif_master_type(ice) != EXT_SPDIF_TYPE) 997 + /* not external SPDIF, no rate limitation */ 998 + return; 999 + /* only external SPDIF can detect incoming sample rate */ 1000 + rate = snd_ak4113_external_rate(spec->ak4113); 1001 + if (rate >= runtime->hw.rate_min && rate <= runtime->hw.rate_max) { 1002 + runtime->hw.rate_min = rate; 1003 + runtime->hw.rate_max = rate; 1004 + } 1005 + } 1006 + 1007 + /* 1008 + * initialize the chip 1009 + */ 1010 + static int __devinit qtet_init(struct snd_ice1712 *ice) 1011 + { 1012 + static const unsigned char ak4113_init_vals[] = { 1013 + /* AK4113_REG_PWRDN */ AK4113_RST | AK4113_PWN | 1014 + AK4113_OCKS0 | AK4113_OCKS1, 1015 + /* AK4113_REQ_FORMAT */ AK4113_DIF_I24I2S | AK4113_VTX | 1016 + AK4113_DEM_OFF | AK4113_DEAU, 1017 + /* AK4113_REG_IO0 */ AK4113_OPS2 | AK4113_TXE | 1018 + AK4113_XTL_24_576M, 1019 + /* AK4113_REG_IO1 */ AK4113_EFH_1024LRCLK | AK4113_IPS(0), 1020 + /* AK4113_REG_INT0_MASK */ 0, 1021 + /* AK4113_REG_INT1_MASK */ 0, 1022 + /* AK4113_REG_DATDTS */ 0, 1023 + }; 1024 + int err; 1025 + struct qtet_spec *spec; 1026 + struct snd_akm4xxx *ak; 1027 + unsigned char val; 1028 + 1029 + /* switching ice1724 to external clock - supplied by ext. circuits */ 1030 + val = inb(ICEMT1724(ice, RATE)); 1031 + outb(val | VT1724_SPDIF_MASTER, ICEMT1724(ice, RATE)); 1032 + 1033 + spec = kzalloc(sizeof(*spec), GFP_KERNEL); 1034 + if (!spec) 1035 + return -ENOMEM; 1036 + /* qtet is clocked by Xilinx array */ 1037 + ice->hw_rates = &qtet_rates_info; 1038 + ice->is_spdif_master = qtet_is_spdif_master; 1039 + ice->get_rate = qtet_get_rate; 1040 + ice->set_rate = qtet_set_rate; 1041 + ice->set_mclk = qtet_set_mclk; 1042 + ice->set_spdif_clock = qtet_set_spdif_clock; 1043 + ice->get_spdif_master_type = qtet_get_spdif_master_type; 1044 + ice->ext_clock_names = ext_clock_names; 1045 + ice->ext_clock_count = ARRAY_SIZE(ext_clock_names); 1046 + /* since Qtet can detect correct SPDIF-in rate, all streams can be 1047 + * limited to this specific rate */ 1048 + ice->spdif.ops.open = ice->pro_open = qtet_spdif_in_open; 1049 + ice->spec = spec; 1050 + 1051 + /* Mute Off */ 1052 + /* SCR Initialize*/ 1053 + /* keep codec power down first */ 1054 + set_scr(ice, SCR_PHP); 1055 + udelay(1); 1056 + /* codec power up */ 1057 + set_scr(ice, SCR_PHP | SCR_CODEC_PDN); 1058 + 1059 + /* MCR Initialize */ 1060 + set_mcr(ice, 0); 1061 + 1062 + /* CPLD Initialize */ 1063 + set_cpld(ice, 0); 1064 + 1065 + 1066 + ice->num_total_dacs = 2; 1067 + ice->num_total_adcs = 2; 1068 + 1069 + ice->akm = kcalloc(2, sizeof(struct snd_akm4xxx), GFP_KERNEL); 1070 + ak = ice->akm; 1071 + if (!ak) 1072 + return -ENOMEM; 1073 + /* only one codec with two chips */ 1074 + ice->akm_codecs = 1; 1075 + err = snd_ice1712_akm4xxx_init(ak, &akm_qtet_dac, NULL, ice); 1076 + if (err < 0) 1077 + return err; 1078 + err = snd_ak4113_create(ice->card, 1079 + qtet_ak4113_read, 1080 + qtet_ak4113_write, 1081 + ak4113_init_vals, 1082 + ice, &spec->ak4113); 1083 + if (err < 0) 1084 + return err; 1085 + /* callback for codecs rate setting */ 1086 + spec->ak4113->change_callback = qtet_ak4113_change; 1087 + spec->ak4113->change_callback_private = ice; 1088 + /* AK41143 in Quartet can detect external rate correctly 1089 + * (i.e. check_flags = 0) */ 1090 + spec->ak4113->check_flags = 0; 1091 + 1092 + proc_init(ice); 1093 + 1094 + qtet_set_rate(ice, 44100); 1095 + return 0; 1096 + } 1097 + 1098 + static unsigned char qtet_eeprom[] __devinitdata = { 1099 + [ICE_EEP2_SYSCONF] = 0x28, /* clock 256(24MHz), mpu401, 1xADC, 1100 + 1xDACs, SPDIF in */ 1101 + [ICE_EEP2_ACLINK] = 0x80, /* I2S */ 1102 + [ICE_EEP2_I2S] = 0x78, /* 96k, 24bit, 192k */ 1103 + [ICE_EEP2_SPDIF] = 0xc3, /* out-en, out-int, in, out-ext */ 1104 + [ICE_EEP2_GPIO_DIR] = 0x00, /* 0-7 inputs, switched to output 1105 + only during output operations */ 1106 + [ICE_EEP2_GPIO_DIR1] = 0xff, /* 8-15 outputs */ 1107 + [ICE_EEP2_GPIO_DIR2] = 0x00, 1108 + [ICE_EEP2_GPIO_MASK] = 0xff, /* changed only for OUT operations */ 1109 + [ICE_EEP2_GPIO_MASK1] = 0x00, 1110 + [ICE_EEP2_GPIO_MASK2] = 0xff, 1111 + 1112 + [ICE_EEP2_GPIO_STATE] = 0x00, /* inputs */ 1113 + [ICE_EEP2_GPIO_STATE1] = 0x7d, /* all 1, but GPIO_CPLD_RW 1114 + and GPIO15 always zero */ 1115 + [ICE_EEP2_GPIO_STATE2] = 0x00, /* inputs */ 1116 + }; 1117 + 1118 + /* entry point */ 1119 + struct snd_ice1712_card_info snd_vt1724_qtet_cards[] __devinitdata = { 1120 + { 1121 + .subvendor = VT1724_SUBDEVICE_QTET, 1122 + .name = "Infrasonic Quartet", 1123 + .model = "quartet", 1124 + .chip_init = qtet_init, 1125 + .build_controls = qtet_add_controls, 1126 + .eeprom_size = sizeof(qtet_eeprom), 1127 + .eeprom_data = qtet_eeprom, 1128 + }, 1129 + { } /* terminator */ 1130 + };
+10
sound/pci/ice1712/quartet.h
··· 1 + #ifndef __SOUND_QTET_H 2 + #define __SOUND_QTET_H 3 + 4 + #define QTET_DEVICE_DESC "{Infrasonic,Quartet}," 5 + 6 + #define VT1724_SUBDEVICE_QTET 0x30305349 /* Infrasonic Quartet */ 7 + 8 + extern struct snd_ice1712_card_info snd_vt1724_qtet_cards[]; 9 + 10 + #endif /* __SOUND_QTET_H */
+2 -1
sound/pci/oxygen/Makefile
··· 1 1 snd-oxygen-lib-objs := oxygen_io.o oxygen_lib.o oxygen_mixer.o oxygen_pcm.o 2 2 snd-hifier-objs := hifier.o 3 3 snd-oxygen-objs := oxygen.o 4 - snd-virtuoso-objs := virtuoso.o 4 + snd-virtuoso-objs := virtuoso.o xonar_lib.o \ 5 + xonar_pcm179x.o xonar_cs43xx.o xonar_hdmi.o 5 6 6 7 obj-$(CONFIG_SND_OXYGEN_LIB) += snd-oxygen-lib.o 7 8 obj-$(CONFIG_SND_HIFIER) += snd-hifier.o
+83
sound/pci/oxygen/cs2000.h
··· 1 + #ifndef CS2000_H_INCLUDED 2 + #define CS2000_H_INCLUDED 3 + 4 + #define CS2000_DEV_ID 0x01 5 + #define CS2000_DEV_CTRL 0x02 6 + #define CS2000_DEV_CFG_1 0x03 7 + #define CS2000_DEV_CFG_2 0x04 8 + #define CS2000_GLOBAL_CFG 0x05 9 + #define CS2000_RATIO_0 0x06 /* 32 bits, big endian */ 10 + #define CS2000_RATIO_1 0x0a 11 + #define CS2000_RATIO_2 0x0e 12 + #define CS2000_RATIO_3 0x12 13 + #define CS2000_FUN_CFG_1 0x16 14 + #define CS2000_FUN_CFG_2 0x17 15 + #define CS2000_FUN_CFG_3 0x1e 16 + 17 + /* DEV_ID */ 18 + #define CS2000_DEVICE_MASK 0xf8 19 + #define CS2000_REVISION_MASK 0x07 20 + 21 + /* DEV_CTRL */ 22 + #define CS2000_UNLOCK 0x80 23 + #define CS2000_AUX_OUT_DIS 0x02 24 + #define CS2000_CLK_OUT_DIS 0x01 25 + 26 + /* DEV_CFG_1 */ 27 + #define CS2000_R_MOD_SEL_MASK 0xe0 28 + #define CS2000_R_MOD_SEL_1 0x00 29 + #define CS2000_R_MOD_SEL_2 0x20 30 + #define CS2000_R_MOD_SEL_4 0x40 31 + #define CS2000_R_MOD_SEL_8 0x60 32 + #define CS2000_R_MOD_SEL_1_2 0x80 33 + #define CS2000_R_MOD_SEL_1_4 0xa0 34 + #define CS2000_R_MOD_SEL_1_8 0xc0 35 + #define CS2000_R_MOD_SEL_1_16 0xe0 36 + #define CS2000_R_SEL_MASK 0x18 37 + #define CS2000_R_SEL_SHIFT 3 38 + #define CS2000_AUX_OUT_SRC_MASK 0x06 39 + #define CS2000_AUX_OUT_SRC_REF_CLK 0x00 40 + #define CS2000_AUX_OUT_SRC_CLK_IN 0x02 41 + #define CS2000_AUX_OUT_SRC_CLK_OUT 0x04 42 + #define CS2000_AUX_OUT_SRC_PLL_LOCK 0x06 43 + #define CS2000_EN_DEV_CFG_1 0x01 44 + 45 + /* DEV_CFG_2 */ 46 + #define CS2000_LOCK_CLK_MASK 0x06 47 + #define CS2000_LOCK_CLK_SHIFT 1 48 + #define CS2000_FRAC_N_SRC_MASK 0x01 49 + #define CS2000_FRAC_N_SRC_STATIC 0x00 50 + #define CS2000_FRAC_N_SRC_DYNAMIC 0x01 51 + 52 + /* GLOBAL_CFG */ 53 + #define CS2000_FREEZE 0x08 54 + #define CS2000_EN_DEV_CFG_2 0x01 55 + 56 + /* FUN_CFG_1 */ 57 + #define CS2000_CLK_SKIP_EN 0x80 58 + #define CS2000_AUX_LOCK_CFG_MASK 0x40 59 + #define CS2000_AUX_LOCK_CFG_PP_HIGH 0x00 60 + #define CS2000_AUX_LOCK_CFG_OD_LOW 0x40 61 + #define CS2000_REF_CLK_DIV_MASK 0x18 62 + #define CS2000_REF_CLK_DIV_4 0x00 63 + #define CS2000_REF_CLK_DIV_2 0x08 64 + #define CS2000_REF_CLK_DIV_1 0x10 65 + 66 + /* FUN_CFG_2 */ 67 + #define CS2000_CLK_OUT_UNL 0x10 68 + #define CS2000_L_F_RATIO_CFG_MASK 0x08 69 + #define CS2000_L_F_RATIO_CFG_20_12 0x00 70 + #define CS2000_L_F_RATIO_CFG_12_20 0x08 71 + 72 + /* FUN_CFG_3 */ 73 + #define CS2000_CLK_IN_BW_MASK 0x70 74 + #define CS2000_CLK_IN_BW_1 0x00 75 + #define CS2000_CLK_IN_BW_2 0x10 76 + #define CS2000_CLK_IN_BW_4 0x20 77 + #define CS2000_CLK_IN_BW_8 0x30 78 + #define CS2000_CLK_IN_BW_16 0x40 79 + #define CS2000_CLK_IN_BW_32 0x50 80 + #define CS2000_CLK_IN_BW_64 0x60 81 + #define CS2000_CLK_IN_BW_128 0x70 82 + 83 + #endif
+38 -23
sound/pci/oxygen/hifier.c
··· 17 17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18 18 */ 19 19 20 + /* 21 + * CMI8788: 22 + * 23 + * SPI 0 -> AK4396 24 + */ 25 + 20 26 #include <linux/delay.h> 21 27 #include <linux/pci.h> 22 28 #include <sound/control.h> ··· 57 51 MODULE_DEVICE_TABLE(pci, hifier_ids); 58 52 59 53 struct hifier_data { 60 - u8 ak4396_ctl2; 54 + u8 ak4396_regs[5]; 61 55 }; 62 56 63 57 static void ak4396_write(struct oxygen *chip, u8 reg, u8 value) 64 58 { 59 + struct hifier_data *data = chip->model_data; 60 + 65 61 oxygen_write_spi(chip, OXYGEN_SPI_TRIGGER | 66 62 OXYGEN_SPI_DATA_LENGTH_2 | 67 63 OXYGEN_SPI_CLOCK_160 | 68 64 (0 << OXYGEN_SPI_CODEC_SHIFT) | 69 65 OXYGEN_SPI_CEN_LATCH_CLOCK_HI, 70 66 AK4396_WRITE | (reg << 8) | value); 67 + data->ak4396_regs[reg] = value; 71 68 } 72 69 73 - static void update_ak4396_volume(struct oxygen *chip) 70 + static void ak4396_write_cached(struct oxygen *chip, u8 reg, u8 value) 74 71 { 75 - ak4396_write(chip, AK4396_LCH_ATT, chip->dac_volume[0]); 76 - ak4396_write(chip, AK4396_RCH_ATT, chip->dac_volume[1]); 72 + struct hifier_data *data = chip->model_data; 73 + 74 + if (value != data->ak4396_regs[reg]) 75 + ak4396_write(chip, reg, value); 77 76 } 78 77 79 78 static void hifier_registers_init(struct oxygen *chip) ··· 86 75 struct hifier_data *data = chip->model_data; 87 76 88 77 ak4396_write(chip, AK4396_CONTROL_1, AK4396_DIF_24_MSB | AK4396_RSTN); 89 - ak4396_write(chip, AK4396_CONTROL_2, data->ak4396_ctl2); 78 + ak4396_write(chip, AK4396_CONTROL_2, 79 + data->ak4396_regs[AK4396_CONTROL_2]); 90 80 ak4396_write(chip, AK4396_CONTROL_3, AK4396_PCM); 91 - update_ak4396_volume(chip); 81 + ak4396_write(chip, AK4396_LCH_ATT, chip->dac_volume[0]); 82 + ak4396_write(chip, AK4396_RCH_ATT, chip->dac_volume[1]); 92 83 } 93 84 94 85 static void hifier_init(struct oxygen *chip) 95 86 { 96 87 struct hifier_data *data = chip->model_data; 97 88 98 - data->ak4396_ctl2 = AK4396_SMUTE | AK4396_DEM_OFF | AK4396_DFS_NORMAL; 89 + data->ak4396_regs[AK4396_CONTROL_2] = 90 + AK4396_SMUTE | AK4396_DEM_OFF | AK4396_DFS_NORMAL; 99 91 hifier_registers_init(chip); 100 92 101 93 snd_component_add(chip->card, "AK4396"); ··· 120 106 struct hifier_data *data = chip->model_data; 121 107 u8 value; 122 108 123 - value = data->ak4396_ctl2 & ~AK4396_DFS_MASK; 109 + value = data->ak4396_regs[AK4396_CONTROL_2] & ~AK4396_DFS_MASK; 124 110 if (params_rate(params) <= 54000) 125 111 value |= AK4396_DFS_NORMAL; 126 112 else if (params_rate(params) <= 108000) 127 113 value |= AK4396_DFS_DOUBLE; 128 114 else 129 115 value |= AK4396_DFS_QUAD; 130 - data->ak4396_ctl2 = value; 131 116 132 117 msleep(1); /* wait for the new MCLK to become stable */ 133 118 134 - ak4396_write(chip, AK4396_CONTROL_1, AK4396_DIF_24_MSB); 135 - ak4396_write(chip, AK4396_CONTROL_2, value); 136 - ak4396_write(chip, AK4396_CONTROL_1, AK4396_DIF_24_MSB | AK4396_RSTN); 119 + if (value != data->ak4396_regs[AK4396_CONTROL_2]) { 120 + ak4396_write(chip, AK4396_CONTROL_1, 121 + AK4396_DIF_24_MSB); 122 + ak4396_write(chip, AK4396_CONTROL_2, value); 123 + ak4396_write(chip, AK4396_CONTROL_1, 124 + AK4396_DIF_24_MSB | AK4396_RSTN); 125 + } 126 + } 127 + 128 + static void update_ak4396_volume(struct oxygen *chip) 129 + { 130 + ak4396_write_cached(chip, AK4396_LCH_ATT, chip->dac_volume[0]); 131 + ak4396_write_cached(chip, AK4396_RCH_ATT, chip->dac_volume[1]); 137 132 } 138 133 139 134 static void update_ak4396_mute(struct oxygen *chip) ··· 150 127 struct hifier_data *data = chip->model_data; 151 128 u8 value; 152 129 153 - value = data->ak4396_ctl2 & ~AK4396_SMUTE; 130 + value = data->ak4396_regs[AK4396_CONTROL_2] & ~AK4396_SMUTE; 154 131 if (chip->dac_mute) 155 132 value |= AK4396_SMUTE; 156 - data->ak4396_ctl2 = value; 157 - ak4396_write(chip, AK4396_CONTROL_2, value); 133 + ak4396_write_cached(chip, AK4396_CONTROL_2, value); 158 134 } 159 135 160 136 static void set_cs5340_params(struct oxygen *chip, ··· 163 141 164 142 static const DECLARE_TLV_DB_LINEAR(ak4396_db_scale, TLV_DB_GAIN_MUTE, 0); 165 143 166 - static int hifier_control_filter(struct snd_kcontrol_new *template) 167 - { 168 - if (!strcmp(template->name, "Stereo Upmixing")) 169 - return 1; /* stereo only - we don't need upmixing */ 170 - return 0; 171 - } 172 - 173 144 static const struct oxygen_model model_hifier = { 174 145 .shortname = "C-Media CMI8787", 175 146 .longname = "C-Media Oxygen HD Audio", 176 147 .chip = "CMI8788", 177 148 .init = hifier_init, 178 - .control_filter = hifier_control_filter, 179 149 .cleanup = hifier_cleanup, 180 150 .resume = hifier_resume, 151 + .get_i2s_mclk = oxygen_default_i2s_mclk, 181 152 .set_dac_params = set_ak4396_params, 182 153 .set_adc_params = set_cs5340_params, 183 154 .update_dac_volume = update_ak4396_volume,
+199 -49
sound/pci/oxygen/oxygen.c
··· 18 18 */ 19 19 20 20 /* 21 + * CMI8788: 22 + * 21 23 * SPI 0 -> 1st AK4396 (front) 22 24 * SPI 1 -> 2nd AK4396 (surround) 23 25 * SPI 2 -> 3rd AK4396 (center/LFE) ··· 29 27 * GPIO 0 -> DFS0 of AK5385 30 28 * GPIO 1 -> DFS1 of AK5385 31 29 * GPIO 8 -> enable headphone amplifier on HT-Omega models 30 + * 31 + * CM9780: 32 + * 33 + * GPO 0 -> route line-in (0) or AC97 output (1) to ADC input 32 34 */ 33 35 34 36 #include <linux/delay.h> ··· 97 91 #define GPIO_CLARO_HP 0x0100 98 92 99 93 struct generic_data { 100 - u8 ak4396_ctl2; 101 - u16 saved_wm8785_registers[2]; 94 + u8 ak4396_regs[4][5]; 95 + u16 wm8785_regs[3]; 102 96 }; 103 97 104 98 static void ak4396_write(struct oxygen *chip, unsigned int codec, ··· 108 102 static const u8 codec_spi_map[4] = { 109 103 0, 1, 2, 4 110 104 }; 105 + struct generic_data *data = chip->model_data; 106 + 111 107 oxygen_write_spi(chip, OXYGEN_SPI_TRIGGER | 112 108 OXYGEN_SPI_DATA_LENGTH_2 | 113 109 OXYGEN_SPI_CLOCK_160 | 114 110 (codec_spi_map[codec] << OXYGEN_SPI_CODEC_SHIFT) | 115 111 OXYGEN_SPI_CEN_LATCH_CLOCK_HI, 116 112 AK4396_WRITE | (reg << 8) | value); 113 + data->ak4396_regs[codec][reg] = value; 114 + } 115 + 116 + static void ak4396_write_cached(struct oxygen *chip, unsigned int codec, 117 + u8 reg, u8 value) 118 + { 119 + struct generic_data *data = chip->model_data; 120 + 121 + if (value != data->ak4396_regs[codec][reg]) 122 + ak4396_write(chip, codec, reg, value); 117 123 } 118 124 119 125 static void wm8785_write(struct oxygen *chip, u8 reg, unsigned int value) ··· 138 120 (3 << OXYGEN_SPI_CODEC_SHIFT) | 139 121 OXYGEN_SPI_CEN_LATCH_CLOCK_LO, 140 122 (reg << 9) | value); 141 - if (reg < ARRAY_SIZE(data->saved_wm8785_registers)) 142 - data->saved_wm8785_registers[reg] = value; 143 - } 144 - 145 - static void update_ak4396_volume(struct oxygen *chip) 146 - { 147 - unsigned int i; 148 - 149 - for (i = 0; i < 4; ++i) { 150 - ak4396_write(chip, i, 151 - AK4396_LCH_ATT, chip->dac_volume[i * 2]); 152 - ak4396_write(chip, i, 153 - AK4396_RCH_ATT, chip->dac_volume[i * 2 + 1]); 154 - } 123 + if (reg < ARRAY_SIZE(data->wm8785_regs)) 124 + data->wm8785_regs[reg] = value; 155 125 } 156 126 157 127 static void ak4396_registers_init(struct oxygen *chip) ··· 148 142 unsigned int i; 149 143 150 144 for (i = 0; i < 4; ++i) { 151 - ak4396_write(chip, i, 152 - AK4396_CONTROL_1, AK4396_DIF_24_MSB | AK4396_RSTN); 153 - ak4396_write(chip, i, 154 - AK4396_CONTROL_2, data->ak4396_ctl2); 155 - ak4396_write(chip, i, 156 - AK4396_CONTROL_3, AK4396_PCM); 145 + ak4396_write(chip, i, AK4396_CONTROL_1, 146 + AK4396_DIF_24_MSB | AK4396_RSTN); 147 + ak4396_write(chip, i, AK4396_CONTROL_2, 148 + data->ak4396_regs[0][AK4396_CONTROL_2]); 149 + ak4396_write(chip, i, AK4396_CONTROL_3, 150 + AK4396_PCM); 151 + ak4396_write(chip, i, AK4396_LCH_ATT, 152 + chip->dac_volume[i * 2]); 153 + ak4396_write(chip, i, AK4396_RCH_ATT, 154 + chip->dac_volume[i * 2 + 1]); 157 155 } 158 - update_ak4396_volume(chip); 159 156 } 160 157 161 158 static void ak4396_init(struct oxygen *chip) 162 159 { 163 160 struct generic_data *data = chip->model_data; 164 161 165 - data->ak4396_ctl2 = AK4396_SMUTE | AK4396_DEM_OFF | AK4396_DFS_NORMAL; 162 + data->ak4396_regs[0][AK4396_CONTROL_2] = 163 + AK4396_SMUTE | AK4396_DEM_OFF | AK4396_DFS_NORMAL; 166 164 ak4396_registers_init(chip); 167 165 snd_component_add(chip->card, "AK4396"); 168 166 } ··· 183 173 struct generic_data *data = chip->model_data; 184 174 185 175 wm8785_write(chip, WM8785_R7, 0); 186 - wm8785_write(chip, WM8785_R0, data->saved_wm8785_registers[0]); 187 - wm8785_write(chip, WM8785_R1, data->saved_wm8785_registers[1]); 176 + wm8785_write(chip, WM8785_R0, data->wm8785_regs[0]); 177 + wm8785_write(chip, WM8785_R2, data->wm8785_regs[2]); 188 178 } 189 179 190 180 static void wm8785_init(struct oxygen *chip) 191 181 { 192 182 struct generic_data *data = chip->model_data; 193 183 194 - data->saved_wm8785_registers[0] = WM8785_MCR_SLAVE | 195 - WM8785_OSR_SINGLE | WM8785_FORMAT_LJUST; 196 - data->saved_wm8785_registers[1] = WM8785_WL_24; 184 + data->wm8785_regs[0] = 185 + WM8785_MCR_SLAVE | WM8785_OSR_SINGLE | WM8785_FORMAT_LJUST; 186 + data->wm8785_regs[2] = WM8785_HPFR | WM8785_HPFL; 197 187 wm8785_registers_init(chip); 198 188 snd_component_add(chip->card, "WM8785"); 199 189 } ··· 274 264 unsigned int i; 275 265 u8 value; 276 266 277 - value = data->ak4396_ctl2 & ~AK4396_DFS_MASK; 267 + value = data->ak4396_regs[0][AK4396_CONTROL_2] & ~AK4396_DFS_MASK; 278 268 if (params_rate(params) <= 54000) 279 269 value |= AK4396_DFS_NORMAL; 280 270 else if (params_rate(params) <= 108000) 281 271 value |= AK4396_DFS_DOUBLE; 282 272 else 283 273 value |= AK4396_DFS_QUAD; 284 - data->ak4396_ctl2 = value; 285 274 286 275 msleep(1); /* wait for the new MCLK to become stable */ 287 276 277 + if (value != data->ak4396_regs[0][AK4396_CONTROL_2]) { 278 + for (i = 0; i < 4; ++i) { 279 + ak4396_write(chip, i, AK4396_CONTROL_1, 280 + AK4396_DIF_24_MSB); 281 + ak4396_write(chip, i, AK4396_CONTROL_2, value); 282 + ak4396_write(chip, i, AK4396_CONTROL_1, 283 + AK4396_DIF_24_MSB | AK4396_RSTN); 284 + } 285 + } 286 + } 287 + 288 + static void update_ak4396_volume(struct oxygen *chip) 289 + { 290 + unsigned int i; 291 + 288 292 for (i = 0; i < 4; ++i) { 289 - ak4396_write(chip, i, 290 - AK4396_CONTROL_1, AK4396_DIF_24_MSB); 291 - ak4396_write(chip, i, 292 - AK4396_CONTROL_2, value); 293 - ak4396_write(chip, i, 294 - AK4396_CONTROL_1, AK4396_DIF_24_MSB | AK4396_RSTN); 293 + ak4396_write_cached(chip, i, AK4396_LCH_ATT, 294 + chip->dac_volume[i * 2]); 295 + ak4396_write_cached(chip, i, AK4396_RCH_ATT, 296 + chip->dac_volume[i * 2 + 1]); 295 297 } 296 298 } 297 299 ··· 313 291 unsigned int i; 314 292 u8 value; 315 293 316 - value = data->ak4396_ctl2 & ~AK4396_SMUTE; 294 + value = data->ak4396_regs[0][AK4396_CONTROL_2] & ~AK4396_SMUTE; 317 295 if (chip->dac_mute) 318 296 value |= AK4396_SMUTE; 319 - data->ak4396_ctl2 = value; 320 297 for (i = 0; i < 4; ++i) 321 - ak4396_write(chip, i, AK4396_CONTROL_2, value); 298 + ak4396_write_cached(chip, i, AK4396_CONTROL_2, value); 322 299 } 323 300 324 301 static void set_wm8785_params(struct oxygen *chip, 325 302 struct snd_pcm_hw_params *params) 326 303 { 304 + struct generic_data *data = chip->model_data; 327 305 unsigned int value; 328 - 329 - wm8785_write(chip, WM8785_R7, 0); 330 306 331 307 value = WM8785_MCR_SLAVE | WM8785_FORMAT_LJUST; 332 308 if (params_rate(params) <= 48000) ··· 333 313 value |= WM8785_OSR_DOUBLE; 334 314 else 335 315 value |= WM8785_OSR_QUAD; 336 - wm8785_write(chip, WM8785_R0, value); 337 - 338 - if (snd_pcm_format_width(params_format(params)) <= 16) 339 - value = WM8785_WL_16; 340 - else 341 - value = WM8785_WL_24; 342 - wm8785_write(chip, WM8785_R1, value); 316 + if (value != data->wm8785_regs[0]) { 317 + wm8785_write(chip, WM8785_R7, 0); 318 + wm8785_write(chip, WM8785_R0, value); 319 + wm8785_write(chip, WM8785_R2, data->wm8785_regs[2]); 320 + } 343 321 } 344 322 345 323 static void set_ak5385_params(struct oxygen *chip, ··· 355 337 value, GPIO_AK5385_DFS_MASK); 356 338 } 357 339 340 + static int rolloff_info(struct snd_kcontrol *ctl, 341 + struct snd_ctl_elem_info *info) 342 + { 343 + static const char *const names[2] = { 344 + "Sharp Roll-off", "Slow Roll-off" 345 + }; 346 + 347 + info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 348 + info->count = 1; 349 + info->value.enumerated.items = 2; 350 + if (info->value.enumerated.item >= 2) 351 + info->value.enumerated.item = 1; 352 + strcpy(info->value.enumerated.name, names[info->value.enumerated.item]); 353 + return 0; 354 + } 355 + 356 + static int rolloff_get(struct snd_kcontrol *ctl, 357 + struct snd_ctl_elem_value *value) 358 + { 359 + struct oxygen *chip = ctl->private_data; 360 + struct generic_data *data = chip->model_data; 361 + 362 + value->value.enumerated.item[0] = 363 + (data->ak4396_regs[0][AK4396_CONTROL_2] & AK4396_SLOW) != 0; 364 + return 0; 365 + } 366 + 367 + static int rolloff_put(struct snd_kcontrol *ctl, 368 + struct snd_ctl_elem_value *value) 369 + { 370 + struct oxygen *chip = ctl->private_data; 371 + struct generic_data *data = chip->model_data; 372 + unsigned int i; 373 + int changed; 374 + u8 reg; 375 + 376 + mutex_lock(&chip->mutex); 377 + reg = data->ak4396_regs[0][AK4396_CONTROL_2]; 378 + if (value->value.enumerated.item[0]) 379 + reg |= AK4396_SLOW; 380 + else 381 + reg &= ~AK4396_SLOW; 382 + changed = reg != data->ak4396_regs[0][AK4396_CONTROL_2]; 383 + if (changed) { 384 + for (i = 0; i < 4; ++i) 385 + ak4396_write(chip, i, AK4396_CONTROL_2, reg); 386 + } 387 + mutex_unlock(&chip->mutex); 388 + return changed; 389 + } 390 + 391 + static const struct snd_kcontrol_new rolloff_control = { 392 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 393 + .name = "DAC Filter Playback Enum", 394 + .info = rolloff_info, 395 + .get = rolloff_get, 396 + .put = rolloff_put, 397 + }; 398 + 399 + static int hpf_info(struct snd_kcontrol *ctl, struct snd_ctl_elem_info *info) 400 + { 401 + static const char *const names[2] = { 402 + "None", "High-pass Filter" 403 + }; 404 + 405 + info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 406 + info->count = 1; 407 + info->value.enumerated.items = 2; 408 + if (info->value.enumerated.item >= 2) 409 + info->value.enumerated.item = 1; 410 + strcpy(info->value.enumerated.name, names[info->value.enumerated.item]); 411 + return 0; 412 + } 413 + 414 + static int hpf_get(struct snd_kcontrol *ctl, struct snd_ctl_elem_value *value) 415 + { 416 + struct oxygen *chip = ctl->private_data; 417 + struct generic_data *data = chip->model_data; 418 + 419 + value->value.enumerated.item[0] = 420 + (data->wm8785_regs[WM8785_R2] & WM8785_HPFR) != 0; 421 + return 0; 422 + } 423 + 424 + static int hpf_put(struct snd_kcontrol *ctl, struct snd_ctl_elem_value *value) 425 + { 426 + struct oxygen *chip = ctl->private_data; 427 + struct generic_data *data = chip->model_data; 428 + unsigned int reg; 429 + int changed; 430 + 431 + mutex_lock(&chip->mutex); 432 + reg = data->wm8785_regs[WM8785_R2] & ~(WM8785_HPFR | WM8785_HPFL); 433 + if (value->value.enumerated.item[0]) 434 + reg |= WM8785_HPFR | WM8785_HPFL; 435 + changed = reg != data->wm8785_regs[WM8785_R2]; 436 + if (changed) 437 + wm8785_write(chip, WM8785_R2, reg); 438 + mutex_unlock(&chip->mutex); 439 + return changed; 440 + } 441 + 442 + static const struct snd_kcontrol_new hpf_control = { 443 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 444 + .name = "ADC Filter Capture Enum", 445 + .info = hpf_info, 446 + .get = hpf_get, 447 + .put = hpf_put, 448 + }; 449 + 450 + static int generic_mixer_init(struct oxygen *chip) 451 + { 452 + return snd_ctl_add(chip->card, snd_ctl_new1(&rolloff_control, chip)); 453 + } 454 + 455 + static int generic_wm8785_mixer_init(struct oxygen *chip) 456 + { 457 + int err; 458 + 459 + err = generic_mixer_init(chip); 460 + if (err < 0) 461 + return err; 462 + err = snd_ctl_add(chip->card, snd_ctl_new1(&hpf_control, chip)); 463 + if (err < 0) 464 + return err; 465 + return 0; 466 + } 467 + 358 468 static const DECLARE_TLV_DB_LINEAR(ak4396_db_scale, TLV_DB_GAIN_MUTE, 0); 359 469 360 470 static const struct oxygen_model model_generic = { ··· 490 344 .longname = "C-Media Oxygen HD Audio", 491 345 .chip = "CMI8788", 492 346 .init = generic_init, 347 + .mixer_init = generic_wm8785_mixer_init, 493 348 .cleanup = generic_cleanup, 494 349 .resume = generic_resume, 350 + .get_i2s_mclk = oxygen_default_i2s_mclk, 495 351 .set_dac_params = set_ak4396_params, 496 352 .set_adc_params = set_wm8785_params, 497 353 .update_dac_volume = update_ak4396_volume, ··· 522 374 switch (id->driver_data) { 523 375 case MODEL_MERIDIAN: 524 376 chip->model.init = meridian_init; 377 + chip->model.mixer_init = generic_mixer_init; 525 378 chip->model.resume = meridian_resume; 526 379 chip->model.set_adc_params = set_ak5385_params; 527 380 chip->model.device_config = PLAYBACK_0_TO_I2S | ··· 538 389 break; 539 390 case MODEL_CLARO_HALO: 540 391 chip->model.init = claro_halo_init; 392 + chip->model.mixer_init = generic_mixer_init; 541 393 chip->model.cleanup = claro_cleanup; 542 394 chip->model.suspend = claro_suspend; 543 395 chip->model.resume = claro_resume;
+5
sound/pci/oxygen/oxygen.h
··· 78 78 void (*resume)(struct oxygen *chip); 79 79 void (*pcm_hardware_filter)(unsigned int channel, 80 80 struct snd_pcm_hardware *hardware); 81 + unsigned int (*get_i2s_mclk)(struct oxygen *chip, unsigned int channel, 82 + struct snd_pcm_hw_params *hw_params); 81 83 void (*set_dac_params)(struct oxygen *chip, 82 84 struct snd_pcm_hw_params *params); 83 85 void (*set_adc_params)(struct oxygen *chip, 84 86 struct snd_pcm_hw_params *params); 85 87 void (*update_dac_volume)(struct oxygen *chip); 86 88 void (*update_dac_mute)(struct oxygen *chip); 89 + void (*update_center_lfe_mix)(struct oxygen *chip, bool mixed); 87 90 void (*gpio_changed)(struct oxygen *chip); 88 91 void (*uart_input)(struct oxygen *chip); 89 92 void (*ac97_switch)(struct oxygen *chip, ··· 165 162 /* oxygen_pcm.c */ 166 163 167 164 int oxygen_pcm_init(struct oxygen *chip); 165 + unsigned int oxygen_default_i2s_mclk(struct oxygen *chip, unsigned int channel, 166 + struct snd_pcm_hw_params *hw_params); 168 167 169 168 /* oxygen_io.c */ 170 169
+28 -1
sound/pci/oxygen/oxygen_lib.c
··· 278 278 static void oxygen_restore_eeprom(struct oxygen *chip, 279 279 const struct pci_device_id *id) 280 280 { 281 - if (oxygen_read_eeprom(chip, 0) != OXYGEN_EEPROM_ID) { 281 + u16 eeprom_id; 282 + 283 + eeprom_id = oxygen_read_eeprom(chip, 0); 284 + if (eeprom_id != OXYGEN_EEPROM_ID && 285 + (eeprom_id != 0xffff || id->subdevice != 0x8788)) { 282 286 /* 283 287 * This function gets called only when a known card model has 284 288 * been detected, i.e., we know there is a valid subsystem ··· 304 300 OXYGEN_MISC_WRITE_PCI_SUBID); 305 301 306 302 snd_printk(KERN_INFO "EEPROM ID restored\n"); 303 + } 304 + } 305 + 306 + static void pci_bridge_magic(void) 307 + { 308 + struct pci_dev *pci = NULL; 309 + u32 tmp; 310 + 311 + for (;;) { 312 + /* If there is any Pericom PI7C9X110 PCI-E/PCI bridge ... */ 313 + pci = pci_get_device(0x12d8, 0xe110, pci); 314 + if (!pci) 315 + break; 316 + /* 317 + * ... configure its secondary internal arbiter to park to 318 + * the secondary port, instead of to the last master. 319 + */ 320 + if (!pci_read_config_dword(pci, 0x40, &tmp)) { 321 + tmp |= 1; 322 + pci_write_config_dword(pci, 0x40, tmp); 323 + } 324 + /* Why? Try asking C-Media. */ 307 325 } 308 326 } 309 327 ··· 607 581 snd_card_set_dev(card, &pci->dev); 608 582 card->private_free = oxygen_card_free; 609 583 584 + pci_bridge_magic(); 610 585 oxygen_init(chip); 611 586 chip->model.init(chip); 612 587
+35 -17
sound/pci/oxygen/oxygen_mixer.c
··· 99 99 100 100 static int upmix_info(struct snd_kcontrol *ctl, struct snd_ctl_elem_info *info) 101 101 { 102 - static const char *const names[3] = { 103 - "Front", "Front+Surround", "Front+Surround+Back" 102 + static const char *const names[5] = { 103 + "Front", 104 + "Front+Surround", 105 + "Front+Surround+Back", 106 + "Front+Surround+Center/LFE", 107 + "Front+Surround+Center/LFE+Back", 104 108 }; 105 109 struct oxygen *chip = ctl->private_data; 106 - unsigned int count = 2 + (chip->model.dac_channels == 8); 110 + unsigned int count = chip->model.update_center_lfe_mix ? 5 : 3; 107 111 108 112 info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 109 113 info->count = 1; ··· 131 127 void oxygen_update_dac_routing(struct oxygen *chip) 132 128 { 133 129 /* DAC 0: front, DAC 1: surround, DAC 2: center/LFE, DAC 3: back */ 134 - static const unsigned int reg_values[3] = { 130 + static const unsigned int reg_values[5] = { 135 131 /* stereo -> front */ 136 132 (0 << OXYGEN_PLAY_DAC0_SOURCE_SHIFT) | 137 133 (1 << OXYGEN_PLAY_DAC1_SOURCE_SHIFT) | ··· 146 142 (0 << OXYGEN_PLAY_DAC0_SOURCE_SHIFT) | 147 143 (0 << OXYGEN_PLAY_DAC1_SOURCE_SHIFT) | 148 144 (2 << OXYGEN_PLAY_DAC2_SOURCE_SHIFT) | 145 + (0 << OXYGEN_PLAY_DAC3_SOURCE_SHIFT), 146 + /* stereo -> front+surround+center/LFE */ 147 + (0 << OXYGEN_PLAY_DAC0_SOURCE_SHIFT) | 148 + (0 << OXYGEN_PLAY_DAC1_SOURCE_SHIFT) | 149 + (0 << OXYGEN_PLAY_DAC2_SOURCE_SHIFT) | 150 + (3 << OXYGEN_PLAY_DAC3_SOURCE_SHIFT), 151 + /* stereo -> front+surround+center/LFE+back */ 152 + (0 << OXYGEN_PLAY_DAC0_SOURCE_SHIFT) | 153 + (0 << OXYGEN_PLAY_DAC1_SOURCE_SHIFT) | 154 + (0 << OXYGEN_PLAY_DAC2_SOURCE_SHIFT) | 149 155 (0 << OXYGEN_PLAY_DAC3_SOURCE_SHIFT), 150 156 }; 151 157 u8 channels; ··· 181 167 OXYGEN_PLAY_DAC1_SOURCE_MASK | 182 168 OXYGEN_PLAY_DAC2_SOURCE_MASK | 183 169 OXYGEN_PLAY_DAC3_SOURCE_MASK); 170 + if (chip->model.update_center_lfe_mix) 171 + chip->model.update_center_lfe_mix(chip, chip->dac_routing > 2); 184 172 } 185 173 186 174 static int upmix_put(struct snd_kcontrol *ctl, struct snd_ctl_elem_value *value) 187 175 { 188 176 struct oxygen *chip = ctl->private_data; 189 - unsigned int count = 2 + (chip->model.dac_channels == 8); 177 + unsigned int count = chip->model.update_center_lfe_mix ? 5 : 3; 190 178 int changed; 191 179 180 + if (value->value.enumerated.item[0] >= count) 181 + return -EINVAL; 192 182 mutex_lock(&chip->mutex); 193 183 changed = value->value.enumerated.item[0] != chip->dac_routing; 194 184 if (changed) { 195 - chip->dac_routing = min(value->value.enumerated.item[0], 196 - count - 1); 197 - spin_lock_irq(&chip->reg_lock); 185 + chip->dac_routing = value->value.enumerated.item[0]; 198 186 oxygen_update_dac_routing(chip); 199 - spin_unlock_irq(&chip->reg_lock); 200 187 } 201 188 mutex_unlock(&chip->mutex); 202 189 return changed; ··· 805 790 .controls = { 806 791 { 807 792 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 808 - .name = "Analog Input Monitor Switch", 793 + .name = "Analog Input Monitor Playback Switch", 809 794 .info = snd_ctl_boolean_mono_info, 810 795 .get = monitor_get, 811 796 .put = monitor_put, ··· 813 798 }, 814 799 { 815 800 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 816 - .name = "Analog Input Monitor Volume", 801 + .name = "Analog Input Monitor Playback Volume", 817 802 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | 818 803 SNDRV_CTL_ELEM_ACCESS_TLV_READ, 819 804 .info = monitor_volume_info, ··· 830 815 .controls = { 831 816 { 832 817 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 833 - .name = "Analog Input Monitor Switch", 818 + .name = "Analog Input Monitor Playback Switch", 834 819 .info = snd_ctl_boolean_mono_info, 835 820 .get = monitor_get, 836 821 .put = monitor_put, ··· 838 823 }, 839 824 { 840 825 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 841 - .name = "Analog Input Monitor Volume", 826 + .name = "Analog Input Monitor Playback Volume", 842 827 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | 843 828 SNDRV_CTL_ELEM_ACCESS_TLV_READ, 844 829 .info = monitor_volume_info, ··· 855 840 .controls = { 856 841 { 857 842 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 858 - .name = "Analog Input Monitor Switch", 843 + .name = "Analog Input Monitor Playback Switch", 859 844 .index = 1, 860 845 .info = snd_ctl_boolean_mono_info, 861 846 .get = monitor_get, ··· 864 849 }, 865 850 { 866 851 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 867 - .name = "Analog Input Monitor Volume", 852 + .name = "Analog Input Monitor Playback Volume", 868 853 .index = 1, 869 854 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | 870 855 SNDRV_CTL_ELEM_ACCESS_TLV_READ, ··· 882 867 .controls = { 883 868 { 884 869 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 885 - .name = "Digital Input Monitor Switch", 870 + .name = "Digital Input Monitor Playback Switch", 886 871 .info = snd_ctl_boolean_mono_info, 887 872 .get = monitor_get, 888 873 .put = monitor_put, ··· 890 875 }, 891 876 { 892 877 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 893 - .name = "Digital Input Monitor Volume", 878 + .name = "Digital Input Monitor Playback Volume", 894 879 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | 895 880 SNDRV_CTL_ELEM_ACCESS_TLV_READ, 896 881 .info = monitor_volume_info, ··· 969 954 if (err == 1) 970 955 continue; 971 956 } 957 + if (!strcmp(template.name, "Stereo Upmixing") && 958 + chip->model.dac_channels == 2) 959 + continue; 972 960 if (!strcmp(template.name, "Master Playback Volume") && 973 961 chip->model.dac_tlv) { 974 962 template.tlv.p = chip->model.dac_tlv;
+13 -6
sound/pci/oxygen/oxygen_pcm.c
··· 271 271 } 272 272 } 273 273 274 - static unsigned int oxygen_i2s_mclk(struct snd_pcm_hw_params *hw_params) 274 + unsigned int oxygen_default_i2s_mclk(struct oxygen *chip, 275 + unsigned int channel, 276 + struct snd_pcm_hw_params *hw_params) 275 277 { 276 278 if (params_rate(hw_params) <= 96000) 277 279 return OXYGEN_I2S_MCLK_256; 278 280 else 279 281 return OXYGEN_I2S_MCLK_128; 280 282 } 283 + EXPORT_SYMBOL(oxygen_default_i2s_mclk); 281 284 282 285 static unsigned int oxygen_i2s_bits(struct snd_pcm_hw_params *hw_params) 283 286 { ··· 357 354 OXYGEN_REC_FORMAT_A_MASK); 358 355 oxygen_write16_masked(chip, OXYGEN_I2S_A_FORMAT, 359 356 oxygen_rate(hw_params) | 360 - oxygen_i2s_mclk(hw_params) | 357 + chip->model.get_i2s_mclk(chip, PCM_A, hw_params) | 361 358 chip->model.adc_i2s_format | 362 359 oxygen_i2s_bits(hw_params), 363 360 OXYGEN_I2S_RATE_MASK | ··· 393 390 if (!is_ac97) 394 391 oxygen_write16_masked(chip, OXYGEN_I2S_B_FORMAT, 395 392 oxygen_rate(hw_params) | 396 - oxygen_i2s_mclk(hw_params) | 393 + chip->model.get_i2s_mclk(chip, PCM_B, 394 + hw_params) | 397 395 chip->model.adc_i2s_format | 398 396 oxygen_i2s_bits(hw_params), 399 397 OXYGEN_I2S_RATE_MASK | ··· 439 435 if (err < 0) 440 436 return err; 441 437 438 + mutex_lock(&chip->mutex); 442 439 spin_lock_irq(&chip->reg_lock); 443 440 oxygen_clear_bits32(chip, OXYGEN_SPDIF_CONTROL, 444 441 OXYGEN_SPDIF_OUT_ENABLE); ··· 451 446 OXYGEN_SPDIF_OUT_RATE_MASK); 452 447 oxygen_update_spdif_source(chip); 453 448 spin_unlock_irq(&chip->reg_lock); 449 + mutex_unlock(&chip->mutex); 454 450 return 0; 455 451 } 456 452 ··· 465 459 if (err < 0) 466 460 return err; 467 461 462 + mutex_lock(&chip->mutex); 468 463 spin_lock_irq(&chip->reg_lock); 469 464 oxygen_write8_masked(chip, OXYGEN_PLAY_CHANNELS, 470 465 oxygen_play_channels(hw_params), ··· 476 469 oxygen_write16_masked(chip, OXYGEN_I2S_MULTICH_FORMAT, 477 470 oxygen_rate(hw_params) | 478 471 chip->model.dac_i2s_format | 479 - oxygen_i2s_mclk(hw_params) | 472 + chip->model.get_i2s_mclk(chip, PCM_MULTICH, 473 + hw_params) | 480 474 oxygen_i2s_bits(hw_params), 481 475 OXYGEN_I2S_RATE_MASK | 482 476 OXYGEN_I2S_FORMAT_MASK | 483 477 OXYGEN_I2S_MCLK_MASK | 484 478 OXYGEN_I2S_BITS_MASK); 485 - oxygen_update_dac_routing(chip); 486 479 oxygen_update_spdif_source(chip); 487 480 spin_unlock_irq(&chip->reg_lock); 488 481 489 - mutex_lock(&chip->mutex); 490 482 chip->model.set_dac_params(chip, hw_params); 483 + oxygen_update_dac_routing(chip); 491 484 mutex_unlock(&chip->mutex); 492 485 return 0; 493 486 }
+14 -1091
sound/pci/oxygen/virtuoso.c
··· 17 17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18 18 */ 19 19 20 - /* 21 - * Xonar D2/D2X 22 - * ------------ 23 - * 24 - * CMI8788: 25 - * 26 - * SPI 0 -> 1st PCM1796 (front) 27 - * SPI 1 -> 2nd PCM1796 (surround) 28 - * SPI 2 -> 3rd PCM1796 (center/LFE) 29 - * SPI 4 -> 4th PCM1796 (back) 30 - * 31 - * GPIO 2 -> M0 of CS5381 32 - * GPIO 3 -> M1 of CS5381 33 - * GPIO 5 <- external power present (D2X only) 34 - * GPIO 7 -> ALT 35 - * GPIO 8 -> enable output to speakers 36 - */ 37 - 38 - /* 39 - * Xonar D1/DX 40 - * ----------- 41 - * 42 - * CMI8788: 43 - * 44 - * I²C <-> CS4398 (front) 45 - * <-> CS4362A (surround, center/LFE, back) 46 - * 47 - * GPI 0 <- external power present (DX only) 48 - * 49 - * GPIO 0 -> enable output to speakers 50 - * GPIO 1 -> enable front panel I/O 51 - * GPIO 2 -> M0 of CS5361 52 - * GPIO 3 -> M1 of CS5361 53 - * GPIO 8 -> route input jack to line-in (0) or mic-in (1) 54 - * 55 - * CS4398: 56 - * 57 - * AD0 <- 1 58 - * AD1 <- 1 59 - * 60 - * CS4362A: 61 - * 62 - * AD0 <- 0 63 - */ 64 - 65 - /* 66 - * Xonar HDAV1.3 (Deluxe) 67 - * ---------------------- 68 - * 69 - * CMI8788: 70 - * 71 - * I²C <-> PCM1796 (front) 72 - * 73 - * GPI 0 <- external power present 74 - * 75 - * GPIO 0 -> enable output to speakers 76 - * GPIO 2 -> M0 of CS5381 77 - * GPIO 3 -> M1 of CS5381 78 - * GPIO 8 -> route input jack to line-in (0) or mic-in (1) 79 - * 80 - * TXD -> HDMI controller 81 - * RXD <- HDMI controller 82 - * 83 - * PCM1796 front: AD1,0 <- 0,0 84 - * 85 - * no daughterboard 86 - * ---------------- 87 - * 88 - * GPIO 4 <- 1 89 - * 90 - * H6 daughterboard 91 - * ---------------- 92 - * 93 - * GPIO 4 <- 0 94 - * GPIO 5 <- 0 95 - * 96 - * I²C <-> PCM1796 (surround) 97 - * <-> PCM1796 (center/LFE) 98 - * <-> PCM1796 (back) 99 - * 100 - * PCM1796 surround: AD1,0 <- 0,1 101 - * PCM1796 center/LFE: AD1,0 <- 1,0 102 - * PCM1796 back: AD1,0 <- 1,1 103 - * 104 - * unknown daughterboard 105 - * --------------------- 106 - * 107 - * GPIO 4 <- 0 108 - * GPIO 5 <- 1 109 - * 110 - * I²C <-> CS4362A (surround, center/LFE, back) 111 - * 112 - * CS4362A: AD0 <- 0 113 - */ 114 - 115 - /* 116 - * Xonar Essence ST (Deluxe)/STX 117 - * ----------------------------- 118 - * 119 - * CMI8788: 120 - * 121 - * I²C <-> PCM1792A 122 - * 123 - * GPI 0 <- external power present 124 - * 125 - * GPIO 0 -> enable output to speakers 126 - * GPIO 1 -> route HP to front panel (0) or rear jack (1) 127 - * GPIO 2 -> M0 of CS5381 128 - * GPIO 3 -> M1 of CS5381 129 - * GPIO 7 -> route output to speaker jacks (0) or HP (1) 130 - * GPIO 8 -> route input jack to line-in (0) or mic-in (1) 131 - * 132 - * PCM1792A: 133 - * 134 - * AD0 <- 0 135 - * 136 - * H6 daughterboard 137 - * ---------------- 138 - * 139 - * GPIO 4 <- 0 140 - * GPIO 5 <- 0 141 - */ 142 - 143 20 #include <linux/pci.h> 144 21 #include <linux/delay.h> 145 - #include <linux/mutex.h> 146 - #include <sound/ac97_codec.h> 147 - #include <sound/asoundef.h> 148 - #include <sound/control.h> 149 22 #include <sound/core.h> 150 23 #include <sound/initval.h> 151 24 #include <sound/pcm.h> 152 - #include <sound/pcm_params.h> 153 - #include <sound/tlv.h> 154 - #include "oxygen.h" 155 - #include "cm9780.h" 156 - #include "pcm1796.h" 157 - #include "cs4398.h" 158 - #include "cs4362a.h" 25 + #include "xonar.h" 159 26 160 27 MODULE_AUTHOR("Clemens Ladisch <clemens@ladisch.de>"); 161 28 MODULE_DESCRIPTION("Asus AVx00 driver"); ··· 40 173 module_param_array(enable, bool, NULL, 0444); 41 174 MODULE_PARM_DESC(enable, "enable card"); 42 175 43 - enum { 44 - MODEL_D2, 45 - MODEL_D2X, 46 - MODEL_D1, 47 - MODEL_DX, 48 - MODEL_HDAV, /* without daughterboard */ 49 - MODEL_HDAV_H6, /* with H6 daughterboard */ 50 - MODEL_ST, 51 - MODEL_ST_H6, 52 - MODEL_STX, 53 - }; 54 - 55 176 static struct pci_device_id xonar_ids[] __devinitdata = { 56 - { OXYGEN_PCI_SUBID(0x1043, 0x8269), .driver_data = MODEL_D2 }, 57 - { OXYGEN_PCI_SUBID(0x1043, 0x8275), .driver_data = MODEL_DX }, 58 - { OXYGEN_PCI_SUBID(0x1043, 0x82b7), .driver_data = MODEL_D2X }, 59 - { OXYGEN_PCI_SUBID(0x1043, 0x8314), .driver_data = MODEL_HDAV }, 60 - { OXYGEN_PCI_SUBID(0x1043, 0x8327), .driver_data = MODEL_DX }, 61 - { OXYGEN_PCI_SUBID(0x1043, 0x834f), .driver_data = MODEL_D1 }, 62 - { OXYGEN_PCI_SUBID(0x1043, 0x835c), .driver_data = MODEL_STX }, 63 - { OXYGEN_PCI_SUBID(0x1043, 0x835d), .driver_data = MODEL_ST }, 177 + { OXYGEN_PCI_SUBID(0x1043, 0x8269) }, 178 + { OXYGEN_PCI_SUBID(0x1043, 0x8275) }, 179 + { OXYGEN_PCI_SUBID(0x1043, 0x82b7) }, 180 + { OXYGEN_PCI_SUBID(0x1043, 0x8314) }, 181 + { OXYGEN_PCI_SUBID(0x1043, 0x8327) }, 182 + { OXYGEN_PCI_SUBID(0x1043, 0x834f) }, 183 + { OXYGEN_PCI_SUBID(0x1043, 0x835c) }, 184 + { OXYGEN_PCI_SUBID(0x1043, 0x835d) }, 64 185 { OXYGEN_PCI_SUBID_BROKEN_EEPROM }, 65 186 { } 66 187 }; 67 188 MODULE_DEVICE_TABLE(pci, xonar_ids); 68 189 69 - 70 - #define GPIO_CS53x1_M_MASK 0x000c 71 - #define GPIO_CS53x1_M_SINGLE 0x0000 72 - #define GPIO_CS53x1_M_DOUBLE 0x0004 73 - #define GPIO_CS53x1_M_QUAD 0x0008 74 - 75 - #define GPIO_D2X_EXT_POWER 0x0020 76 - #define GPIO_D2_ALT 0x0080 77 - #define GPIO_D2_OUTPUT_ENABLE 0x0100 78 - 79 - #define GPI_DX_EXT_POWER 0x01 80 - #define GPIO_DX_OUTPUT_ENABLE 0x0001 81 - #define GPIO_DX_FRONT_PANEL 0x0002 82 - #define GPIO_DX_INPUT_ROUTE 0x0100 83 - 84 - #define GPIO_DB_MASK 0x0030 85 - #define GPIO_DB_H6 0x0000 86 - #define GPIO_DB_XX 0x0020 87 - 88 - #define GPIO_ST_HP_REAR 0x0002 89 - #define GPIO_ST_HP 0x0080 90 - 91 - #define I2C_DEVICE_PCM1796(i) (0x98 + ((i) << 1)) /* 10011, ADx=i, /W=0 */ 92 - #define I2C_DEVICE_CS4398 0x9e /* 10011, AD1=1, AD0=1, /W=0 */ 93 - #define I2C_DEVICE_CS4362A 0x30 /* 001100, AD0=0, /W=0 */ 94 - 95 - struct xonar_data { 96 - unsigned int anti_pop_delay; 97 - unsigned int dacs; 98 - u16 output_enable_bit; 99 - u8 ext_power_reg; 100 - u8 ext_power_int_reg; 101 - u8 ext_power_bit; 102 - u8 has_power; 103 - u8 pcm1796_oversampling; 104 - u8 cs4398_fm; 105 - u8 cs4362a_fm; 106 - u8 hdmi_params[5]; 107 - }; 108 - 109 - static void xonar_gpio_changed(struct oxygen *chip); 110 - 111 - static inline void pcm1796_write_spi(struct oxygen *chip, unsigned int codec, 112 - u8 reg, u8 value) 113 - { 114 - /* maps ALSA channel pair number to SPI output */ 115 - static const u8 codec_map[4] = { 116 - 0, 1, 2, 4 117 - }; 118 - oxygen_write_spi(chip, OXYGEN_SPI_TRIGGER | 119 - OXYGEN_SPI_DATA_LENGTH_2 | 120 - OXYGEN_SPI_CLOCK_160 | 121 - (codec_map[codec] << OXYGEN_SPI_CODEC_SHIFT) | 122 - OXYGEN_SPI_CEN_LATCH_CLOCK_HI, 123 - (reg << 8) | value); 124 - } 125 - 126 - static inline void pcm1796_write_i2c(struct oxygen *chip, unsigned int codec, 127 - u8 reg, u8 value) 128 - { 129 - oxygen_write_i2c(chip, I2C_DEVICE_PCM1796(codec), reg, value); 130 - } 131 - 132 - static void pcm1796_write(struct oxygen *chip, unsigned int codec, 133 - u8 reg, u8 value) 134 - { 135 - if ((chip->model.function_flags & OXYGEN_FUNCTION_2WIRE_SPI_MASK) == 136 - OXYGEN_FUNCTION_SPI) 137 - pcm1796_write_spi(chip, codec, reg, value); 138 - else 139 - pcm1796_write_i2c(chip, codec, reg, value); 140 - } 141 - 142 - static void cs4398_write(struct oxygen *chip, u8 reg, u8 value) 143 - { 144 - oxygen_write_i2c(chip, I2C_DEVICE_CS4398, reg, value); 145 - } 146 - 147 - static void cs4362a_write(struct oxygen *chip, u8 reg, u8 value) 148 - { 149 - oxygen_write_i2c(chip, I2C_DEVICE_CS4362A, reg, value); 150 - } 151 - 152 - static void hdmi_write_command(struct oxygen *chip, u8 command, 153 - unsigned int count, const u8 *params) 154 - { 155 - unsigned int i; 156 - u8 checksum; 157 - 158 - oxygen_write_uart(chip, 0xfb); 159 - oxygen_write_uart(chip, 0xef); 160 - oxygen_write_uart(chip, command); 161 - oxygen_write_uart(chip, count); 162 - for (i = 0; i < count; ++i) 163 - oxygen_write_uart(chip, params[i]); 164 - checksum = 0xfb + 0xef + command + count; 165 - for (i = 0; i < count; ++i) 166 - checksum += params[i]; 167 - oxygen_write_uart(chip, checksum); 168 - } 169 - 170 - static void xonar_enable_output(struct oxygen *chip) 171 - { 172 - struct xonar_data *data = chip->model_data; 173 - 174 - msleep(data->anti_pop_delay); 175 - oxygen_set_bits16(chip, OXYGEN_GPIO_DATA, data->output_enable_bit); 176 - } 177 - 178 - static void xonar_common_init(struct oxygen *chip) 179 - { 180 - struct xonar_data *data = chip->model_data; 181 - 182 - if (data->ext_power_reg) { 183 - oxygen_set_bits8(chip, data->ext_power_int_reg, 184 - data->ext_power_bit); 185 - chip->interrupt_mask |= OXYGEN_INT_GPIO; 186 - chip->model.gpio_changed = xonar_gpio_changed; 187 - data->has_power = !!(oxygen_read8(chip, data->ext_power_reg) 188 - & data->ext_power_bit); 189 - } 190 - oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, 191 - GPIO_CS53x1_M_MASK | data->output_enable_bit); 192 - oxygen_write16_masked(chip, OXYGEN_GPIO_DATA, 193 - GPIO_CS53x1_M_SINGLE, GPIO_CS53x1_M_MASK); 194 - oxygen_ac97_set_bits(chip, 0, CM9780_JACK, CM9780_FMIC2MIC); 195 - xonar_enable_output(chip); 196 - } 197 - 198 - static void update_pcm1796_volume(struct oxygen *chip) 199 - { 200 - struct xonar_data *data = chip->model_data; 201 - unsigned int i; 202 - 203 - for (i = 0; i < data->dacs; ++i) { 204 - pcm1796_write(chip, i, 16, chip->dac_volume[i * 2]); 205 - pcm1796_write(chip, i, 17, chip->dac_volume[i * 2 + 1]); 206 - } 207 - } 208 - 209 - static void update_pcm1796_mute(struct oxygen *chip) 210 - { 211 - struct xonar_data *data = chip->model_data; 212 - unsigned int i; 213 - u8 value; 214 - 215 - value = PCM1796_DMF_DISABLED | PCM1796_FMT_24_LJUST | PCM1796_ATLD; 216 - if (chip->dac_mute) 217 - value |= PCM1796_MUTE; 218 - for (i = 0; i < data->dacs; ++i) 219 - pcm1796_write(chip, i, 18, value); 220 - } 221 - 222 - static void pcm1796_init(struct oxygen *chip) 223 - { 224 - struct xonar_data *data = chip->model_data; 225 - unsigned int i; 226 - 227 - for (i = 0; i < data->dacs; ++i) { 228 - pcm1796_write(chip, i, 19, PCM1796_FLT_SHARP | PCM1796_ATS_1); 229 - pcm1796_write(chip, i, 20, data->pcm1796_oversampling); 230 - pcm1796_write(chip, i, 21, 0); 231 - } 232 - update_pcm1796_mute(chip); /* set ATLD before ATL/ATR */ 233 - update_pcm1796_volume(chip); 234 - } 235 - 236 - static void xonar_d2_init(struct oxygen *chip) 237 - { 238 - struct xonar_data *data = chip->model_data; 239 - 240 - data->anti_pop_delay = 300; 241 - data->dacs = 4; 242 - data->output_enable_bit = GPIO_D2_OUTPUT_ENABLE; 243 - data->pcm1796_oversampling = PCM1796_OS_64; 244 - 245 - pcm1796_init(chip); 246 - 247 - oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_D2_ALT); 248 - oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, GPIO_D2_ALT); 249 - 250 - xonar_common_init(chip); 251 - 252 - snd_component_add(chip->card, "PCM1796"); 253 - snd_component_add(chip->card, "CS5381"); 254 - } 255 - 256 - static void xonar_d2x_init(struct oxygen *chip) 257 - { 258 - struct xonar_data *data = chip->model_data; 259 - 260 - data->ext_power_reg = OXYGEN_GPIO_DATA; 261 - data->ext_power_int_reg = OXYGEN_GPIO_INTERRUPT_MASK; 262 - data->ext_power_bit = GPIO_D2X_EXT_POWER; 263 - oxygen_clear_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_D2X_EXT_POWER); 264 - 265 - xonar_d2_init(chip); 266 - } 267 - 268 - static void update_cs4362a_volumes(struct oxygen *chip) 269 - { 270 - u8 mute; 271 - 272 - mute = chip->dac_mute ? CS4362A_MUTE : 0; 273 - cs4362a_write(chip, 7, (127 - chip->dac_volume[2]) | mute); 274 - cs4362a_write(chip, 8, (127 - chip->dac_volume[3]) | mute); 275 - cs4362a_write(chip, 10, (127 - chip->dac_volume[4]) | mute); 276 - cs4362a_write(chip, 11, (127 - chip->dac_volume[5]) | mute); 277 - cs4362a_write(chip, 13, (127 - chip->dac_volume[6]) | mute); 278 - cs4362a_write(chip, 14, (127 - chip->dac_volume[7]) | mute); 279 - } 280 - 281 - static void update_cs43xx_volume(struct oxygen *chip) 282 - { 283 - cs4398_write(chip, 5, (127 - chip->dac_volume[0]) * 2); 284 - cs4398_write(chip, 6, (127 - chip->dac_volume[1]) * 2); 285 - update_cs4362a_volumes(chip); 286 - } 287 - 288 - static void update_cs43xx_mute(struct oxygen *chip) 289 - { 290 - u8 reg; 291 - 292 - reg = CS4398_MUTEP_LOW | CS4398_PAMUTE; 293 - if (chip->dac_mute) 294 - reg |= CS4398_MUTE_B | CS4398_MUTE_A; 295 - cs4398_write(chip, 4, reg); 296 - update_cs4362a_volumes(chip); 297 - } 298 - 299 - static void cs43xx_init(struct oxygen *chip) 300 - { 301 - struct xonar_data *data = chip->model_data; 302 - 303 - /* set CPEN (control port mode) and power down */ 304 - cs4398_write(chip, 8, CS4398_CPEN | CS4398_PDN); 305 - cs4362a_write(chip, 0x01, CS4362A_PDN | CS4362A_CPEN); 306 - /* configure */ 307 - cs4398_write(chip, 2, data->cs4398_fm); 308 - cs4398_write(chip, 3, CS4398_ATAPI_B_R | CS4398_ATAPI_A_L); 309 - cs4398_write(chip, 7, CS4398_RMP_DN | CS4398_RMP_UP | 310 - CS4398_ZERO_CROSS | CS4398_SOFT_RAMP); 311 - cs4362a_write(chip, 0x02, CS4362A_DIF_LJUST); 312 - cs4362a_write(chip, 0x03, CS4362A_MUTEC_6 | CS4362A_AMUTE | 313 - CS4362A_RMP_UP | CS4362A_ZERO_CROSS | CS4362A_SOFT_RAMP); 314 - cs4362a_write(chip, 0x04, CS4362A_RMP_DN | CS4362A_DEM_NONE); 315 - cs4362a_write(chip, 0x05, 0); 316 - cs4362a_write(chip, 0x06, data->cs4362a_fm); 317 - cs4362a_write(chip, 0x09, data->cs4362a_fm); 318 - cs4362a_write(chip, 0x0c, data->cs4362a_fm); 319 - update_cs43xx_volume(chip); 320 - update_cs43xx_mute(chip); 321 - /* clear power down */ 322 - cs4398_write(chip, 8, CS4398_CPEN); 323 - cs4362a_write(chip, 0x01, CS4362A_CPEN); 324 - } 325 - 326 - static void xonar_d1_init(struct oxygen *chip) 327 - { 328 - struct xonar_data *data = chip->model_data; 329 - 330 - data->anti_pop_delay = 800; 331 - data->output_enable_bit = GPIO_DX_OUTPUT_ENABLE; 332 - data->cs4398_fm = CS4398_FM_SINGLE | CS4398_DEM_NONE | CS4398_DIF_LJUST; 333 - data->cs4362a_fm = CS4362A_FM_SINGLE | 334 - CS4362A_ATAPI_B_R | CS4362A_ATAPI_A_L; 335 - 336 - oxygen_write16(chip, OXYGEN_2WIRE_BUS_STATUS, 337 - OXYGEN_2WIRE_LENGTH_8 | 338 - OXYGEN_2WIRE_INTERRUPT_MASK | 339 - OXYGEN_2WIRE_SPEED_FAST); 340 - 341 - cs43xx_init(chip); 342 - 343 - oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, 344 - GPIO_DX_FRONT_PANEL | GPIO_DX_INPUT_ROUTE); 345 - oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, 346 - GPIO_DX_FRONT_PANEL | GPIO_DX_INPUT_ROUTE); 347 - 348 - xonar_common_init(chip); 349 - 350 - snd_component_add(chip->card, "CS4398"); 351 - snd_component_add(chip->card, "CS4362A"); 352 - snd_component_add(chip->card, "CS5361"); 353 - } 354 - 355 - static void xonar_dx_init(struct oxygen *chip) 356 - { 357 - struct xonar_data *data = chip->model_data; 358 - 359 - data->ext_power_reg = OXYGEN_GPI_DATA; 360 - data->ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK; 361 - data->ext_power_bit = GPI_DX_EXT_POWER; 362 - 363 - xonar_d1_init(chip); 364 - } 365 - 366 - static void xonar_hdav_init(struct oxygen *chip) 367 - { 368 - struct xonar_data *data = chip->model_data; 369 - u8 param; 370 - 371 - oxygen_write16(chip, OXYGEN_2WIRE_BUS_STATUS, 372 - OXYGEN_2WIRE_LENGTH_8 | 373 - OXYGEN_2WIRE_INTERRUPT_MASK | 374 - OXYGEN_2WIRE_SPEED_FAST); 375 - 376 - data->anti_pop_delay = 100; 377 - data->dacs = chip->model.private_data == MODEL_HDAV_H6 ? 4 : 1; 378 - data->output_enable_bit = GPIO_DX_OUTPUT_ENABLE; 379 - data->ext_power_reg = OXYGEN_GPI_DATA; 380 - data->ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK; 381 - data->ext_power_bit = GPI_DX_EXT_POWER; 382 - data->pcm1796_oversampling = PCM1796_OS_64; 383 - 384 - pcm1796_init(chip); 385 - 386 - oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_DX_INPUT_ROUTE); 387 - oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, GPIO_DX_INPUT_ROUTE); 388 - 389 - oxygen_reset_uart(chip); 390 - param = 0; 391 - hdmi_write_command(chip, 0x61, 1, &param); 392 - param = 1; 393 - hdmi_write_command(chip, 0x74, 1, &param); 394 - data->hdmi_params[1] = IEC958_AES3_CON_FS_48000; 395 - data->hdmi_params[4] = 1; 396 - hdmi_write_command(chip, 0x54, 5, data->hdmi_params); 397 - 398 - xonar_common_init(chip); 399 - 400 - snd_component_add(chip->card, "PCM1796"); 401 - snd_component_add(chip->card, "CS5381"); 402 - } 403 - 404 - static void xonar_st_init(struct oxygen *chip) 405 - { 406 - struct xonar_data *data = chip->model_data; 407 - 408 - oxygen_write16(chip, OXYGEN_2WIRE_BUS_STATUS, 409 - OXYGEN_2WIRE_LENGTH_8 | 410 - OXYGEN_2WIRE_INTERRUPT_MASK | 411 - OXYGEN_2WIRE_SPEED_FAST); 412 - 413 - if (chip->model.private_data == MODEL_ST_H6) 414 - chip->model.dac_channels = 8; 415 - data->anti_pop_delay = 100; 416 - data->dacs = chip->model.private_data == MODEL_ST_H6 ? 4 : 1; 417 - data->output_enable_bit = GPIO_DX_OUTPUT_ENABLE; 418 - data->pcm1796_oversampling = PCM1796_OS_64; 419 - 420 - pcm1796_init(chip); 421 - 422 - oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, 423 - GPIO_DX_INPUT_ROUTE | GPIO_ST_HP_REAR | GPIO_ST_HP); 424 - oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, 425 - GPIO_DX_INPUT_ROUTE | GPIO_ST_HP_REAR | GPIO_ST_HP); 426 - 427 - xonar_common_init(chip); 428 - 429 - snd_component_add(chip->card, "PCM1792A"); 430 - snd_component_add(chip->card, "CS5381"); 431 - } 432 - 433 - static void xonar_stx_init(struct oxygen *chip) 434 - { 435 - struct xonar_data *data = chip->model_data; 436 - 437 - data->ext_power_reg = OXYGEN_GPI_DATA; 438 - data->ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK; 439 - data->ext_power_bit = GPI_DX_EXT_POWER; 440 - 441 - xonar_st_init(chip); 442 - } 443 - 444 - static void xonar_disable_output(struct oxygen *chip) 445 - { 446 - struct xonar_data *data = chip->model_data; 447 - 448 - oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, data->output_enable_bit); 449 - } 450 - 451 - static void xonar_d2_cleanup(struct oxygen *chip) 452 - { 453 - xonar_disable_output(chip); 454 - } 455 - 456 - static void xonar_d1_cleanup(struct oxygen *chip) 457 - { 458 - xonar_disable_output(chip); 459 - cs4362a_write(chip, 0x01, CS4362A_PDN | CS4362A_CPEN); 460 - oxygen_clear_bits8(chip, OXYGEN_FUNCTION, OXYGEN_FUNCTION_RESET_CODEC); 461 - } 462 - 463 - static void xonar_hdav_cleanup(struct oxygen *chip) 464 - { 465 - u8 param = 0; 466 - 467 - hdmi_write_command(chip, 0x74, 1, &param); 468 - xonar_disable_output(chip); 469 - } 470 - 471 - static void xonar_st_cleanup(struct oxygen *chip) 472 - { 473 - xonar_disable_output(chip); 474 - } 475 - 476 - static void xonar_d2_suspend(struct oxygen *chip) 477 - { 478 - xonar_d2_cleanup(chip); 479 - } 480 - 481 - static void xonar_d1_suspend(struct oxygen *chip) 482 - { 483 - xonar_d1_cleanup(chip); 484 - } 485 - 486 - static void xonar_hdav_suspend(struct oxygen *chip) 487 - { 488 - xonar_hdav_cleanup(chip); 489 - msleep(2); 490 - } 491 - 492 - static void xonar_st_suspend(struct oxygen *chip) 493 - { 494 - xonar_st_cleanup(chip); 495 - } 496 - 497 - static void xonar_d2_resume(struct oxygen *chip) 498 - { 499 - pcm1796_init(chip); 500 - xonar_enable_output(chip); 501 - } 502 - 503 - static void xonar_d1_resume(struct oxygen *chip) 504 - { 505 - oxygen_set_bits8(chip, OXYGEN_FUNCTION, OXYGEN_FUNCTION_RESET_CODEC); 506 - msleep(1); 507 - cs43xx_init(chip); 508 - xonar_enable_output(chip); 509 - } 510 - 511 - static void xonar_hdav_resume(struct oxygen *chip) 512 - { 513 - struct xonar_data *data = chip->model_data; 514 - u8 param; 515 - 516 - oxygen_reset_uart(chip); 517 - param = 0; 518 - hdmi_write_command(chip, 0x61, 1, &param); 519 - param = 1; 520 - hdmi_write_command(chip, 0x74, 1, &param); 521 - hdmi_write_command(chip, 0x54, 5, data->hdmi_params); 522 - pcm1796_init(chip); 523 - xonar_enable_output(chip); 524 - } 525 - 526 - static void xonar_st_resume(struct oxygen *chip) 527 - { 528 - pcm1796_init(chip); 529 - xonar_enable_output(chip); 530 - } 531 - 532 - static void xonar_hdav_pcm_hardware_filter(unsigned int channel, 533 - struct snd_pcm_hardware *hardware) 534 - { 535 - if (channel == PCM_MULTICH) { 536 - hardware->rates = SNDRV_PCM_RATE_44100 | 537 - SNDRV_PCM_RATE_48000 | 538 - SNDRV_PCM_RATE_96000 | 539 - SNDRV_PCM_RATE_192000; 540 - hardware->rate_min = 44100; 541 - } 542 - } 543 - 544 - static void set_pcm1796_params(struct oxygen *chip, 545 - struct snd_pcm_hw_params *params) 546 - { 547 - struct xonar_data *data = chip->model_data; 548 - unsigned int i; 549 - 550 - data->pcm1796_oversampling = 551 - params_rate(params) >= 96000 ? PCM1796_OS_32 : PCM1796_OS_64; 552 - for (i = 0; i < data->dacs; ++i) 553 - pcm1796_write(chip, i, 20, data->pcm1796_oversampling); 554 - } 555 - 556 - static void set_cs53x1_params(struct oxygen *chip, 557 - struct snd_pcm_hw_params *params) 558 - { 559 - unsigned int value; 560 - 561 - if (params_rate(params) <= 54000) 562 - value = GPIO_CS53x1_M_SINGLE; 563 - else if (params_rate(params) <= 108000) 564 - value = GPIO_CS53x1_M_DOUBLE; 565 - else 566 - value = GPIO_CS53x1_M_QUAD; 567 - oxygen_write16_masked(chip, OXYGEN_GPIO_DATA, 568 - value, GPIO_CS53x1_M_MASK); 569 - } 570 - 571 - static void set_cs43xx_params(struct oxygen *chip, 572 - struct snd_pcm_hw_params *params) 573 - { 574 - struct xonar_data *data = chip->model_data; 575 - 576 - data->cs4398_fm = CS4398_DEM_NONE | CS4398_DIF_LJUST; 577 - data->cs4362a_fm = CS4362A_ATAPI_B_R | CS4362A_ATAPI_A_L; 578 - if (params_rate(params) <= 50000) { 579 - data->cs4398_fm |= CS4398_FM_SINGLE; 580 - data->cs4362a_fm |= CS4362A_FM_SINGLE; 581 - } else if (params_rate(params) <= 100000) { 582 - data->cs4398_fm |= CS4398_FM_DOUBLE; 583 - data->cs4362a_fm |= CS4362A_FM_DOUBLE; 584 - } else { 585 - data->cs4398_fm |= CS4398_FM_QUAD; 586 - data->cs4362a_fm |= CS4362A_FM_QUAD; 587 - } 588 - cs4398_write(chip, 2, data->cs4398_fm); 589 - cs4362a_write(chip, 0x06, data->cs4362a_fm); 590 - cs4362a_write(chip, 0x09, data->cs4362a_fm); 591 - cs4362a_write(chip, 0x0c, data->cs4362a_fm); 592 - } 593 - 594 - static void set_hdmi_params(struct oxygen *chip, 595 - struct snd_pcm_hw_params *params) 596 - { 597 - struct xonar_data *data = chip->model_data; 598 - 599 - data->hdmi_params[0] = 0; /* 1 = non-audio */ 600 - switch (params_rate(params)) { 601 - case 44100: 602 - data->hdmi_params[1] = IEC958_AES3_CON_FS_44100; 603 - break; 604 - case 48000: 605 - data->hdmi_params[1] = IEC958_AES3_CON_FS_48000; 606 - break; 607 - default: /* 96000 */ 608 - data->hdmi_params[1] = IEC958_AES3_CON_FS_96000; 609 - break; 610 - case 192000: 611 - data->hdmi_params[1] = IEC958_AES3_CON_FS_192000; 612 - break; 613 - } 614 - data->hdmi_params[2] = params_channels(params) / 2 - 1; 615 - if (params_format(params) == SNDRV_PCM_FORMAT_S16_LE) 616 - data->hdmi_params[3] = 0; 617 - else 618 - data->hdmi_params[3] = 0xc0; 619 - data->hdmi_params[4] = 1; /* ? */ 620 - hdmi_write_command(chip, 0x54, 5, data->hdmi_params); 621 - } 622 - 623 - static void set_hdav_params(struct oxygen *chip, 624 - struct snd_pcm_hw_params *params) 625 - { 626 - set_pcm1796_params(chip, params); 627 - set_hdmi_params(chip, params); 628 - } 629 - 630 - static void xonar_gpio_changed(struct oxygen *chip) 631 - { 632 - struct xonar_data *data = chip->model_data; 633 - u8 has_power; 634 - 635 - has_power = !!(oxygen_read8(chip, data->ext_power_reg) 636 - & data->ext_power_bit); 637 - if (has_power != data->has_power) { 638 - data->has_power = has_power; 639 - if (has_power) { 640 - snd_printk(KERN_NOTICE "power restored\n"); 641 - } else { 642 - snd_printk(KERN_CRIT 643 - "Hey! Don't unplug the power cable!\n"); 644 - /* TODO: stop PCMs */ 645 - } 646 - } 647 - } 648 - 649 - static void xonar_hdav_uart_input(struct oxygen *chip) 650 - { 651 - if (chip->uart_input_count >= 2 && 652 - chip->uart_input[chip->uart_input_count - 2] == 'O' && 653 - chip->uart_input[chip->uart_input_count - 1] == 'K') { 654 - printk(KERN_DEBUG "message from Xonar HDAV HDMI chip received:\n"); 655 - print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, 656 - chip->uart_input, chip->uart_input_count); 657 - chip->uart_input_count = 0; 658 - } 659 - } 660 - 661 - static int gpio_bit_switch_get(struct snd_kcontrol *ctl, 662 - struct snd_ctl_elem_value *value) 663 - { 664 - struct oxygen *chip = ctl->private_data; 665 - u16 bit = ctl->private_value; 666 - 667 - value->value.integer.value[0] = 668 - !!(oxygen_read16(chip, OXYGEN_GPIO_DATA) & bit); 669 - return 0; 670 - } 671 - 672 - static int gpio_bit_switch_put(struct snd_kcontrol *ctl, 673 - struct snd_ctl_elem_value *value) 674 - { 675 - struct oxygen *chip = ctl->private_data; 676 - u16 bit = ctl->private_value; 677 - u16 old_bits, new_bits; 678 - int changed; 679 - 680 - spin_lock_irq(&chip->reg_lock); 681 - old_bits = oxygen_read16(chip, OXYGEN_GPIO_DATA); 682 - if (value->value.integer.value[0]) 683 - new_bits = old_bits | bit; 684 - else 685 - new_bits = old_bits & ~bit; 686 - changed = new_bits != old_bits; 687 - if (changed) 688 - oxygen_write16(chip, OXYGEN_GPIO_DATA, new_bits); 689 - spin_unlock_irq(&chip->reg_lock); 690 - return changed; 691 - } 692 - 693 - static const struct snd_kcontrol_new alt_switch = { 694 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 695 - .name = "Analog Loopback Switch", 696 - .info = snd_ctl_boolean_mono_info, 697 - .get = gpio_bit_switch_get, 698 - .put = gpio_bit_switch_put, 699 - .private_value = GPIO_D2_ALT, 700 - }; 701 - 702 - static const struct snd_kcontrol_new front_panel_switch = { 703 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 704 - .name = "Front Panel Switch", 705 - .info = snd_ctl_boolean_mono_info, 706 - .get = gpio_bit_switch_get, 707 - .put = gpio_bit_switch_put, 708 - .private_value = GPIO_DX_FRONT_PANEL, 709 - }; 710 - 711 - static int st_output_switch_info(struct snd_kcontrol *ctl, 712 - struct snd_ctl_elem_info *info) 713 - { 714 - static const char *const names[3] = { 715 - "Speakers", "Headphones", "FP Headphones" 716 - }; 717 - 718 - info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 719 - info->count = 1; 720 - info->value.enumerated.items = 3; 721 - if (info->value.enumerated.item >= 3) 722 - info->value.enumerated.item = 2; 723 - strcpy(info->value.enumerated.name, names[info->value.enumerated.item]); 724 - return 0; 725 - } 726 - 727 - static int st_output_switch_get(struct snd_kcontrol *ctl, 728 - struct snd_ctl_elem_value *value) 729 - { 730 - struct oxygen *chip = ctl->private_data; 731 - u16 gpio; 732 - 733 - gpio = oxygen_read16(chip, OXYGEN_GPIO_DATA); 734 - if (!(gpio & GPIO_ST_HP)) 735 - value->value.enumerated.item[0] = 0; 736 - else if (gpio & GPIO_ST_HP_REAR) 737 - value->value.enumerated.item[0] = 1; 738 - else 739 - value->value.enumerated.item[0] = 2; 740 - return 0; 741 - } 742 - 743 - 744 - static int st_output_switch_put(struct snd_kcontrol *ctl, 745 - struct snd_ctl_elem_value *value) 746 - { 747 - struct oxygen *chip = ctl->private_data; 748 - u16 gpio_old, gpio; 749 - 750 - mutex_lock(&chip->mutex); 751 - gpio_old = oxygen_read16(chip, OXYGEN_GPIO_DATA); 752 - gpio = gpio_old; 753 - switch (value->value.enumerated.item[0]) { 754 - case 0: 755 - gpio &= ~(GPIO_ST_HP | GPIO_ST_HP_REAR); 756 - break; 757 - case 1: 758 - gpio |= GPIO_ST_HP | GPIO_ST_HP_REAR; 759 - break; 760 - case 2: 761 - gpio = (gpio | GPIO_ST_HP) & ~GPIO_ST_HP_REAR; 762 - break; 763 - } 764 - oxygen_write16(chip, OXYGEN_GPIO_DATA, gpio); 765 - mutex_unlock(&chip->mutex); 766 - return gpio != gpio_old; 767 - } 768 - 769 - static const struct snd_kcontrol_new st_output_switch = { 770 - .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 771 - .name = "Analog Output", 772 - .info = st_output_switch_info, 773 - .get = st_output_switch_get, 774 - .put = st_output_switch_put, 775 - }; 776 - 777 - static void xonar_line_mic_ac97_switch(struct oxygen *chip, 778 - unsigned int reg, unsigned int mute) 779 - { 780 - if (reg == AC97_LINE) { 781 - spin_lock_irq(&chip->reg_lock); 782 - oxygen_write16_masked(chip, OXYGEN_GPIO_DATA, 783 - mute ? GPIO_DX_INPUT_ROUTE : 0, 784 - GPIO_DX_INPUT_ROUTE); 785 - spin_unlock_irq(&chip->reg_lock); 786 - } 787 - } 788 - 789 - static const DECLARE_TLV_DB_SCALE(pcm1796_db_scale, -6000, 50, 0); 790 - static const DECLARE_TLV_DB_SCALE(cs4362a_db_scale, -6000, 100, 0); 791 - 792 - static int xonar_d2_control_filter(struct snd_kcontrol_new *template) 793 - { 794 - if (!strncmp(template->name, "CD Capture ", 11)) 795 - /* CD in is actually connected to the video in pin */ 796 - template->private_value ^= AC97_CD ^ AC97_VIDEO; 797 - return 0; 798 - } 799 - 800 - static int xonar_d1_control_filter(struct snd_kcontrol_new *template) 801 - { 802 - if (!strncmp(template->name, "CD Capture ", 11)) 803 - return 1; /* no CD input */ 804 - return 0; 805 - } 806 - 807 - static int xonar_st_control_filter(struct snd_kcontrol_new *template) 808 - { 809 - if (!strncmp(template->name, "CD Capture ", 11)) 810 - return 1; /* no CD input */ 811 - if (!strcmp(template->name, "Stereo Upmixing")) 812 - return 1; /* stereo only - we don't need upmixing */ 813 - return 0; 814 - } 815 - 816 - static int xonar_d2_mixer_init(struct oxygen *chip) 817 - { 818 - return snd_ctl_add(chip->card, snd_ctl_new1(&alt_switch, chip)); 819 - } 820 - 821 - static int xonar_d1_mixer_init(struct oxygen *chip) 822 - { 823 - return snd_ctl_add(chip->card, snd_ctl_new1(&front_panel_switch, chip)); 824 - } 825 - 826 - static int xonar_st_mixer_init(struct oxygen *chip) 827 - { 828 - return snd_ctl_add(chip->card, snd_ctl_new1(&st_output_switch, chip)); 829 - } 830 - 831 - static const struct oxygen_model model_xonar_d2 = { 832 - .longname = "Asus Virtuoso 200", 833 - .chip = "AV200", 834 - .init = xonar_d2_init, 835 - .control_filter = xonar_d2_control_filter, 836 - .mixer_init = xonar_d2_mixer_init, 837 - .cleanup = xonar_d2_cleanup, 838 - .suspend = xonar_d2_suspend, 839 - .resume = xonar_d2_resume, 840 - .set_dac_params = set_pcm1796_params, 841 - .set_adc_params = set_cs53x1_params, 842 - .update_dac_volume = update_pcm1796_volume, 843 - .update_dac_mute = update_pcm1796_mute, 844 - .dac_tlv = pcm1796_db_scale, 845 - .model_data_size = sizeof(struct xonar_data), 846 - .device_config = PLAYBACK_0_TO_I2S | 847 - PLAYBACK_1_TO_SPDIF | 848 - CAPTURE_0_FROM_I2S_2 | 849 - CAPTURE_1_FROM_SPDIF | 850 - MIDI_OUTPUT | 851 - MIDI_INPUT, 852 - .dac_channels = 8, 853 - .dac_volume_min = 255 - 2*60, 854 - .dac_volume_max = 255, 855 - .misc_flags = OXYGEN_MISC_MIDI, 856 - .function_flags = OXYGEN_FUNCTION_SPI | 857 - OXYGEN_FUNCTION_ENABLE_SPI_4_5, 858 - .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, 859 - .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, 860 - }; 861 - 862 - static const struct oxygen_model model_xonar_d1 = { 863 - .longname = "Asus Virtuoso 100", 864 - .chip = "AV200", 865 - .init = xonar_d1_init, 866 - .control_filter = xonar_d1_control_filter, 867 - .mixer_init = xonar_d1_mixer_init, 868 - .cleanup = xonar_d1_cleanup, 869 - .suspend = xonar_d1_suspend, 870 - .resume = xonar_d1_resume, 871 - .set_dac_params = set_cs43xx_params, 872 - .set_adc_params = set_cs53x1_params, 873 - .update_dac_volume = update_cs43xx_volume, 874 - .update_dac_mute = update_cs43xx_mute, 875 - .ac97_switch = xonar_line_mic_ac97_switch, 876 - .dac_tlv = cs4362a_db_scale, 877 - .model_data_size = sizeof(struct xonar_data), 878 - .device_config = PLAYBACK_0_TO_I2S | 879 - PLAYBACK_1_TO_SPDIF | 880 - CAPTURE_0_FROM_I2S_2, 881 - .dac_channels = 8, 882 - .dac_volume_min = 127 - 60, 883 - .dac_volume_max = 127, 884 - .function_flags = OXYGEN_FUNCTION_2WIRE, 885 - .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, 886 - .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, 887 - }; 888 - 889 - static const struct oxygen_model model_xonar_hdav = { 890 - .longname = "Asus Virtuoso 200", 891 - .chip = "AV200", 892 - .init = xonar_hdav_init, 893 - .cleanup = xonar_hdav_cleanup, 894 - .suspend = xonar_hdav_suspend, 895 - .resume = xonar_hdav_resume, 896 - .pcm_hardware_filter = xonar_hdav_pcm_hardware_filter, 897 - .set_dac_params = set_hdav_params, 898 - .set_adc_params = set_cs53x1_params, 899 - .update_dac_volume = update_pcm1796_volume, 900 - .update_dac_mute = update_pcm1796_mute, 901 - .uart_input = xonar_hdav_uart_input, 902 - .ac97_switch = xonar_line_mic_ac97_switch, 903 - .dac_tlv = pcm1796_db_scale, 904 - .model_data_size = sizeof(struct xonar_data), 905 - .device_config = PLAYBACK_0_TO_I2S | 906 - PLAYBACK_1_TO_SPDIF | 907 - CAPTURE_0_FROM_I2S_2 | 908 - CAPTURE_1_FROM_SPDIF, 909 - .dac_channels = 8, 910 - .dac_volume_min = 255 - 2*60, 911 - .dac_volume_max = 255, 912 - .misc_flags = OXYGEN_MISC_MIDI, 913 - .function_flags = OXYGEN_FUNCTION_2WIRE, 914 - .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, 915 - .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, 916 - }; 917 - 918 - static const struct oxygen_model model_xonar_st = { 919 - .longname = "Asus Virtuoso 100", 920 - .chip = "AV200", 921 - .init = xonar_st_init, 922 - .control_filter = xonar_st_control_filter, 923 - .mixer_init = xonar_st_mixer_init, 924 - .cleanup = xonar_st_cleanup, 925 - .suspend = xonar_st_suspend, 926 - .resume = xonar_st_resume, 927 - .set_dac_params = set_pcm1796_params, 928 - .set_adc_params = set_cs53x1_params, 929 - .update_dac_volume = update_pcm1796_volume, 930 - .update_dac_mute = update_pcm1796_mute, 931 - .ac97_switch = xonar_line_mic_ac97_switch, 932 - .dac_tlv = pcm1796_db_scale, 933 - .model_data_size = sizeof(struct xonar_data), 934 - .device_config = PLAYBACK_0_TO_I2S | 935 - PLAYBACK_1_TO_SPDIF | 936 - CAPTURE_0_FROM_I2S_2, 937 - .dac_channels = 2, 938 - .dac_volume_min = 255 - 2*60, 939 - .dac_volume_max = 255, 940 - .function_flags = OXYGEN_FUNCTION_2WIRE, 941 - .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, 942 - .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, 943 - }; 944 - 945 190 static int __devinit get_xonar_model(struct oxygen *chip, 946 191 const struct pci_device_id *id) 947 192 { 948 - static const struct oxygen_model *const models[] = { 949 - [MODEL_D1] = &model_xonar_d1, 950 - [MODEL_DX] = &model_xonar_d1, 951 - [MODEL_D2] = &model_xonar_d2, 952 - [MODEL_D2X] = &model_xonar_d2, 953 - [MODEL_HDAV] = &model_xonar_hdav, 954 - [MODEL_ST] = &model_xonar_st, 955 - [MODEL_STX] = &model_xonar_st, 956 - }; 957 - static const char *const names[] = { 958 - [MODEL_D1] = "Xonar D1", 959 - [MODEL_DX] = "Xonar DX", 960 - [MODEL_D2] = "Xonar D2", 961 - [MODEL_D2X] = "Xonar D2X", 962 - [MODEL_HDAV] = "Xonar HDAV1.3", 963 - [MODEL_HDAV_H6] = "Xonar HDAV1.3+H6", 964 - [MODEL_ST] = "Xonar Essence ST", 965 - [MODEL_ST_H6] = "Xonar Essence ST+H6", 966 - [MODEL_STX] = "Xonar Essence STX", 967 - }; 968 - unsigned int model = id->driver_data; 969 - 970 - if (model >= ARRAY_SIZE(models) || !models[model]) 971 - return -EINVAL; 972 - chip->model = *models[model]; 973 - 974 - switch (model) { 975 - case MODEL_D2X: 976 - chip->model.init = xonar_d2x_init; 977 - break; 978 - case MODEL_DX: 979 - chip->model.init = xonar_dx_init; 980 - break; 981 - case MODEL_HDAV: 982 - oxygen_clear_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_DB_MASK); 983 - switch (oxygen_read16(chip, OXYGEN_GPIO_DATA) & GPIO_DB_MASK) { 984 - case GPIO_DB_H6: 985 - model = MODEL_HDAV_H6; 986 - break; 987 - case GPIO_DB_XX: 988 - snd_printk(KERN_ERR "unknown daughterboard\n"); 989 - return -ENODEV; 990 - } 991 - break; 992 - case MODEL_ST: 993 - oxygen_clear_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_DB_MASK); 994 - switch (oxygen_read16(chip, OXYGEN_GPIO_DATA) & GPIO_DB_MASK) { 995 - case GPIO_DB_H6: 996 - model = MODEL_ST_H6; 997 - break; 998 - } 999 - break; 1000 - case MODEL_STX: 1001 - chip->model.init = xonar_stx_init; 1002 - oxygen_clear_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_DB_MASK); 1003 - break; 1004 - } 1005 - 1006 - chip->model.shortname = names[model]; 1007 - chip->model.private_data = model; 1008 - return 0; 193 + if (get_xonar_pcm179x_model(chip, id) >= 0) 194 + return 0; 195 + if (get_xonar_cs43xx_model(chip, id) >= 0) 196 + return 0; 197 + return -EINVAL; 1009 198 } 1010 199 1011 200 static int __devinit xonar_probe(struct pci_dev *pci,
+50
sound/pci/oxygen/xonar.h
··· 1 + #ifndef XONAR_H_INCLUDED 2 + #define XONAR_H_INCLUDED 3 + 4 + #include "oxygen.h" 5 + 6 + struct xonar_generic { 7 + unsigned int anti_pop_delay; 8 + u16 output_enable_bit; 9 + u8 ext_power_reg; 10 + u8 ext_power_int_reg; 11 + u8 ext_power_bit; 12 + u8 has_power; 13 + }; 14 + 15 + struct xonar_hdmi { 16 + u8 params[5]; 17 + }; 18 + 19 + /* generic helper functions */ 20 + 21 + void xonar_enable_output(struct oxygen *chip); 22 + void xonar_disable_output(struct oxygen *chip); 23 + void xonar_init_ext_power(struct oxygen *chip); 24 + void xonar_init_cs53x1(struct oxygen *chip); 25 + void xonar_set_cs53x1_params(struct oxygen *chip, 26 + struct snd_pcm_hw_params *params); 27 + int xonar_gpio_bit_switch_get(struct snd_kcontrol *ctl, 28 + struct snd_ctl_elem_value *value); 29 + int xonar_gpio_bit_switch_put(struct snd_kcontrol *ctl, 30 + struct snd_ctl_elem_value *value); 31 + 32 + /* model-specific card drivers */ 33 + 34 + int get_xonar_pcm179x_model(struct oxygen *chip, 35 + const struct pci_device_id *id); 36 + int get_xonar_cs43xx_model(struct oxygen *chip, 37 + const struct pci_device_id *id); 38 + 39 + /* HDMI helper functions */ 40 + 41 + void xonar_hdmi_init(struct oxygen *chip, struct xonar_hdmi *data); 42 + void xonar_hdmi_cleanup(struct oxygen *chip); 43 + void xonar_hdmi_resume(struct oxygen *chip, struct xonar_hdmi *hdmi); 44 + void xonar_hdmi_pcm_hardware_filter(unsigned int channel, 45 + struct snd_pcm_hardware *hardware); 46 + void xonar_set_hdmi_params(struct oxygen *chip, struct xonar_hdmi *hdmi, 47 + struct snd_pcm_hw_params *params); 48 + void xonar_hdmi_uart_input(struct oxygen *chip); 49 + 50 + #endif
+434
sound/pci/oxygen/xonar_cs43xx.c
··· 1 + /* 2 + * card driver for models with CS4398/CS4362A DACs (Xonar D1/DX) 3 + * 4 + * Copyright (c) Clemens Ladisch <clemens@ladisch.de> 5 + * 6 + * 7 + * This driver is free software; you can redistribute it and/or modify 8 + * it under the terms of the GNU General Public License, version 2. 9 + * 10 + * This driver is distributed in the hope that it will be useful, 11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 + * GNU General Public License for more details. 14 + * 15 + * You should have received a copy of the GNU General Public License 16 + * along with this driver; if not, see <http://www.gnu.org/licenses/>. 17 + */ 18 + 19 + /* 20 + * Xonar D1/DX 21 + * ----------- 22 + * 23 + * CMI8788: 24 + * 25 + * I²C <-> CS4398 (front) 26 + * <-> CS4362A (surround, center/LFE, back) 27 + * 28 + * GPI 0 <- external power present (DX only) 29 + * 30 + * GPIO 0 -> enable output to speakers 31 + * GPIO 1 -> enable front panel I/O 32 + * GPIO 2 -> M0 of CS5361 33 + * GPIO 3 -> M1 of CS5361 34 + * GPIO 8 -> route input jack to line-in (0) or mic-in (1) 35 + * 36 + * CS4398: 37 + * 38 + * AD0 <- 1 39 + * AD1 <- 1 40 + * 41 + * CS4362A: 42 + * 43 + * AD0 <- 0 44 + * 45 + * CM9780: 46 + * 47 + * GPO 0 -> route line-in (0) or AC97 output (1) to CS5361 input 48 + */ 49 + 50 + #include <linux/pci.h> 51 + #include <linux/delay.h> 52 + #include <sound/ac97_codec.h> 53 + #include <sound/control.h> 54 + #include <sound/core.h> 55 + #include <sound/pcm.h> 56 + #include <sound/pcm_params.h> 57 + #include <sound/tlv.h> 58 + #include "xonar.h" 59 + #include "cs4398.h" 60 + #include "cs4362a.h" 61 + 62 + #define GPI_EXT_POWER 0x01 63 + #define GPIO_D1_OUTPUT_ENABLE 0x0001 64 + #define GPIO_D1_FRONT_PANEL 0x0002 65 + #define GPIO_D1_INPUT_ROUTE 0x0100 66 + 67 + #define I2C_DEVICE_CS4398 0x9e /* 10011, AD1=1, AD0=1, /W=0 */ 68 + #define I2C_DEVICE_CS4362A 0x30 /* 001100, AD0=0, /W=0 */ 69 + 70 + struct xonar_cs43xx { 71 + struct xonar_generic generic; 72 + u8 cs4398_regs[8]; 73 + u8 cs4362a_regs[15]; 74 + }; 75 + 76 + static void cs4398_write(struct oxygen *chip, u8 reg, u8 value) 77 + { 78 + struct xonar_cs43xx *data = chip->model_data; 79 + 80 + oxygen_write_i2c(chip, I2C_DEVICE_CS4398, reg, value); 81 + if (reg < ARRAY_SIZE(data->cs4398_regs)) 82 + data->cs4398_regs[reg] = value; 83 + } 84 + 85 + static void cs4398_write_cached(struct oxygen *chip, u8 reg, u8 value) 86 + { 87 + struct xonar_cs43xx *data = chip->model_data; 88 + 89 + if (value != data->cs4398_regs[reg]) 90 + cs4398_write(chip, reg, value); 91 + } 92 + 93 + static void cs4362a_write(struct oxygen *chip, u8 reg, u8 value) 94 + { 95 + struct xonar_cs43xx *data = chip->model_data; 96 + 97 + oxygen_write_i2c(chip, I2C_DEVICE_CS4362A, reg, value); 98 + if (reg < ARRAY_SIZE(data->cs4362a_regs)) 99 + data->cs4362a_regs[reg] = value; 100 + } 101 + 102 + static void cs4362a_write_cached(struct oxygen *chip, u8 reg, u8 value) 103 + { 104 + struct xonar_cs43xx *data = chip->model_data; 105 + 106 + if (value != data->cs4362a_regs[reg]) 107 + cs4362a_write(chip, reg, value); 108 + } 109 + 110 + static void cs43xx_registers_init(struct oxygen *chip) 111 + { 112 + struct xonar_cs43xx *data = chip->model_data; 113 + unsigned int i; 114 + 115 + /* set CPEN (control port mode) and power down */ 116 + cs4398_write(chip, 8, CS4398_CPEN | CS4398_PDN); 117 + cs4362a_write(chip, 0x01, CS4362A_PDN | CS4362A_CPEN); 118 + /* configure */ 119 + cs4398_write(chip, 2, data->cs4398_regs[2]); 120 + cs4398_write(chip, 3, CS4398_ATAPI_B_R | CS4398_ATAPI_A_L); 121 + cs4398_write(chip, 4, data->cs4398_regs[4]); 122 + cs4398_write(chip, 5, data->cs4398_regs[5]); 123 + cs4398_write(chip, 6, data->cs4398_regs[6]); 124 + cs4398_write(chip, 7, data->cs4398_regs[7]); 125 + cs4362a_write(chip, 0x02, CS4362A_DIF_LJUST); 126 + cs4362a_write(chip, 0x03, CS4362A_MUTEC_6 | CS4362A_AMUTE | 127 + CS4362A_RMP_UP | CS4362A_ZERO_CROSS | CS4362A_SOFT_RAMP); 128 + cs4362a_write(chip, 0x04, data->cs4362a_regs[0x04]); 129 + cs4362a_write(chip, 0x05, 0); 130 + for (i = 6; i <= 14; ++i) 131 + cs4362a_write(chip, i, data->cs4362a_regs[i]); 132 + /* clear power down */ 133 + cs4398_write(chip, 8, CS4398_CPEN); 134 + cs4362a_write(chip, 0x01, CS4362A_CPEN); 135 + } 136 + 137 + static void xonar_d1_init(struct oxygen *chip) 138 + { 139 + struct xonar_cs43xx *data = chip->model_data; 140 + 141 + data->generic.anti_pop_delay = 800; 142 + data->generic.output_enable_bit = GPIO_D1_OUTPUT_ENABLE; 143 + data->cs4398_regs[2] = 144 + CS4398_FM_SINGLE | CS4398_DEM_NONE | CS4398_DIF_LJUST; 145 + data->cs4398_regs[4] = CS4398_MUTEP_LOW | 146 + CS4398_MUTE_B | CS4398_MUTE_A | CS4398_PAMUTE; 147 + data->cs4398_regs[5] = 60 * 2; 148 + data->cs4398_regs[6] = 60 * 2; 149 + data->cs4398_regs[7] = CS4398_RMP_DN | CS4398_RMP_UP | 150 + CS4398_ZERO_CROSS | CS4398_SOFT_RAMP; 151 + data->cs4362a_regs[4] = CS4362A_RMP_DN | CS4362A_DEM_NONE; 152 + data->cs4362a_regs[6] = CS4362A_FM_SINGLE | 153 + CS4362A_ATAPI_B_R | CS4362A_ATAPI_A_L; 154 + data->cs4362a_regs[7] = 60 | CS4362A_MUTE; 155 + data->cs4362a_regs[8] = 60 | CS4362A_MUTE; 156 + data->cs4362a_regs[9] = data->cs4362a_regs[6]; 157 + data->cs4362a_regs[10] = 60 | CS4362A_MUTE; 158 + data->cs4362a_regs[11] = 60 | CS4362A_MUTE; 159 + data->cs4362a_regs[12] = data->cs4362a_regs[6]; 160 + data->cs4362a_regs[13] = 60 | CS4362A_MUTE; 161 + data->cs4362a_regs[14] = 60 | CS4362A_MUTE; 162 + 163 + oxygen_write16(chip, OXYGEN_2WIRE_BUS_STATUS, 164 + OXYGEN_2WIRE_LENGTH_8 | 165 + OXYGEN_2WIRE_INTERRUPT_MASK | 166 + OXYGEN_2WIRE_SPEED_FAST); 167 + 168 + cs43xx_registers_init(chip); 169 + 170 + oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, 171 + GPIO_D1_FRONT_PANEL | GPIO_D1_INPUT_ROUTE); 172 + oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, 173 + GPIO_D1_FRONT_PANEL | GPIO_D1_INPUT_ROUTE); 174 + 175 + xonar_init_cs53x1(chip); 176 + xonar_enable_output(chip); 177 + 178 + snd_component_add(chip->card, "CS4398"); 179 + snd_component_add(chip->card, "CS4362A"); 180 + snd_component_add(chip->card, "CS5361"); 181 + } 182 + 183 + static void xonar_dx_init(struct oxygen *chip) 184 + { 185 + struct xonar_cs43xx *data = chip->model_data; 186 + 187 + data->generic.ext_power_reg = OXYGEN_GPI_DATA; 188 + data->generic.ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK; 189 + data->generic.ext_power_bit = GPI_EXT_POWER; 190 + xonar_init_ext_power(chip); 191 + xonar_d1_init(chip); 192 + } 193 + 194 + static void xonar_d1_cleanup(struct oxygen *chip) 195 + { 196 + xonar_disable_output(chip); 197 + cs4362a_write(chip, 0x01, CS4362A_PDN | CS4362A_CPEN); 198 + oxygen_clear_bits8(chip, OXYGEN_FUNCTION, OXYGEN_FUNCTION_RESET_CODEC); 199 + } 200 + 201 + static void xonar_d1_suspend(struct oxygen *chip) 202 + { 203 + xonar_d1_cleanup(chip); 204 + } 205 + 206 + static void xonar_d1_resume(struct oxygen *chip) 207 + { 208 + oxygen_set_bits8(chip, OXYGEN_FUNCTION, OXYGEN_FUNCTION_RESET_CODEC); 209 + msleep(1); 210 + cs43xx_registers_init(chip); 211 + xonar_enable_output(chip); 212 + } 213 + 214 + static void set_cs43xx_params(struct oxygen *chip, 215 + struct snd_pcm_hw_params *params) 216 + { 217 + struct xonar_cs43xx *data = chip->model_data; 218 + u8 cs4398_fm, cs4362a_fm; 219 + 220 + if (params_rate(params) <= 50000) { 221 + cs4398_fm = CS4398_FM_SINGLE; 222 + cs4362a_fm = CS4362A_FM_SINGLE; 223 + } else if (params_rate(params) <= 100000) { 224 + cs4398_fm = CS4398_FM_DOUBLE; 225 + cs4362a_fm = CS4362A_FM_DOUBLE; 226 + } else { 227 + cs4398_fm = CS4398_FM_QUAD; 228 + cs4362a_fm = CS4362A_FM_QUAD; 229 + } 230 + cs4398_fm |= CS4398_DEM_NONE | CS4398_DIF_LJUST; 231 + cs4398_write_cached(chip, 2, cs4398_fm); 232 + cs4362a_fm |= data->cs4362a_regs[6] & ~CS4362A_FM_MASK; 233 + cs4362a_write_cached(chip, 6, cs4362a_fm); 234 + cs4362a_write_cached(chip, 12, cs4362a_fm); 235 + cs4362a_fm &= CS4362A_FM_MASK; 236 + cs4362a_fm |= data->cs4362a_regs[9] & ~CS4362A_FM_MASK; 237 + cs4362a_write_cached(chip, 9, cs4362a_fm); 238 + } 239 + 240 + static void update_cs4362a_volumes(struct oxygen *chip) 241 + { 242 + unsigned int i; 243 + u8 mute; 244 + 245 + mute = chip->dac_mute ? CS4362A_MUTE : 0; 246 + for (i = 0; i < 6; ++i) 247 + cs4362a_write_cached(chip, 7 + i + i / 2, 248 + (127 - chip->dac_volume[2 + i]) | mute); 249 + } 250 + 251 + static void update_cs43xx_volume(struct oxygen *chip) 252 + { 253 + cs4398_write_cached(chip, 5, (127 - chip->dac_volume[0]) * 2); 254 + cs4398_write_cached(chip, 6, (127 - chip->dac_volume[1]) * 2); 255 + update_cs4362a_volumes(chip); 256 + } 257 + 258 + static void update_cs43xx_mute(struct oxygen *chip) 259 + { 260 + u8 reg; 261 + 262 + reg = CS4398_MUTEP_LOW | CS4398_PAMUTE; 263 + if (chip->dac_mute) 264 + reg |= CS4398_MUTE_B | CS4398_MUTE_A; 265 + cs4398_write_cached(chip, 4, reg); 266 + update_cs4362a_volumes(chip); 267 + } 268 + 269 + static void update_cs43xx_center_lfe_mix(struct oxygen *chip, bool mixed) 270 + { 271 + struct xonar_cs43xx *data = chip->model_data; 272 + u8 reg; 273 + 274 + reg = data->cs4362a_regs[9] & ~CS4362A_ATAPI_MASK; 275 + if (mixed) 276 + reg |= CS4362A_ATAPI_B_LR | CS4362A_ATAPI_A_LR; 277 + else 278 + reg |= CS4362A_ATAPI_B_R | CS4362A_ATAPI_A_L; 279 + cs4362a_write_cached(chip, 9, reg); 280 + } 281 + 282 + static const struct snd_kcontrol_new front_panel_switch = { 283 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 284 + .name = "Front Panel Switch", 285 + .info = snd_ctl_boolean_mono_info, 286 + .get = xonar_gpio_bit_switch_get, 287 + .put = xonar_gpio_bit_switch_put, 288 + .private_value = GPIO_D1_FRONT_PANEL, 289 + }; 290 + 291 + static int rolloff_info(struct snd_kcontrol *ctl, 292 + struct snd_ctl_elem_info *info) 293 + { 294 + static const char *const names[2] = { 295 + "Fast Roll-off", "Slow Roll-off" 296 + }; 297 + 298 + info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 299 + info->count = 1; 300 + info->value.enumerated.items = 2; 301 + if (info->value.enumerated.item >= 2) 302 + info->value.enumerated.item = 1; 303 + strcpy(info->value.enumerated.name, names[info->value.enumerated.item]); 304 + return 0; 305 + } 306 + 307 + static int rolloff_get(struct snd_kcontrol *ctl, 308 + struct snd_ctl_elem_value *value) 309 + { 310 + struct oxygen *chip = ctl->private_data; 311 + struct xonar_cs43xx *data = chip->model_data; 312 + 313 + value->value.enumerated.item[0] = 314 + (data->cs4398_regs[7] & CS4398_FILT_SEL) != 0; 315 + return 0; 316 + } 317 + 318 + static int rolloff_put(struct snd_kcontrol *ctl, 319 + struct snd_ctl_elem_value *value) 320 + { 321 + struct oxygen *chip = ctl->private_data; 322 + struct xonar_cs43xx *data = chip->model_data; 323 + int changed; 324 + u8 reg; 325 + 326 + mutex_lock(&chip->mutex); 327 + reg = data->cs4398_regs[7]; 328 + if (value->value.enumerated.item[0]) 329 + reg |= CS4398_FILT_SEL; 330 + else 331 + reg &= ~CS4398_FILT_SEL; 332 + changed = reg != data->cs4398_regs[7]; 333 + if (changed) { 334 + cs4398_write(chip, 7, reg); 335 + if (reg & CS4398_FILT_SEL) 336 + reg = data->cs4362a_regs[0x04] | CS4362A_FILT_SEL; 337 + else 338 + reg = data->cs4362a_regs[0x04] & ~CS4362A_FILT_SEL; 339 + cs4362a_write(chip, 0x04, reg); 340 + } 341 + mutex_unlock(&chip->mutex); 342 + return changed; 343 + } 344 + 345 + static const struct snd_kcontrol_new rolloff_control = { 346 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 347 + .name = "DAC Filter Playback Enum", 348 + .info = rolloff_info, 349 + .get = rolloff_get, 350 + .put = rolloff_put, 351 + }; 352 + 353 + static void xonar_d1_line_mic_ac97_switch(struct oxygen *chip, 354 + unsigned int reg, unsigned int mute) 355 + { 356 + if (reg == AC97_LINE) { 357 + spin_lock_irq(&chip->reg_lock); 358 + oxygen_write16_masked(chip, OXYGEN_GPIO_DATA, 359 + mute ? GPIO_D1_INPUT_ROUTE : 0, 360 + GPIO_D1_INPUT_ROUTE); 361 + spin_unlock_irq(&chip->reg_lock); 362 + } 363 + } 364 + 365 + static const DECLARE_TLV_DB_SCALE(cs4362a_db_scale, -6000, 100, 0); 366 + 367 + static int xonar_d1_control_filter(struct snd_kcontrol_new *template) 368 + { 369 + if (!strncmp(template->name, "CD Capture ", 11)) 370 + return 1; /* no CD input */ 371 + return 0; 372 + } 373 + 374 + static int xonar_d1_mixer_init(struct oxygen *chip) 375 + { 376 + int err; 377 + 378 + err = snd_ctl_add(chip->card, snd_ctl_new1(&front_panel_switch, chip)); 379 + if (err < 0) 380 + return err; 381 + err = snd_ctl_add(chip->card, snd_ctl_new1(&rolloff_control, chip)); 382 + if (err < 0) 383 + return err; 384 + return 0; 385 + } 386 + 387 + static const struct oxygen_model model_xonar_d1 = { 388 + .longname = "Asus Virtuoso 100", 389 + .chip = "AV200", 390 + .init = xonar_d1_init, 391 + .control_filter = xonar_d1_control_filter, 392 + .mixer_init = xonar_d1_mixer_init, 393 + .cleanup = xonar_d1_cleanup, 394 + .suspend = xonar_d1_suspend, 395 + .resume = xonar_d1_resume, 396 + .get_i2s_mclk = oxygen_default_i2s_mclk, 397 + .set_dac_params = set_cs43xx_params, 398 + .set_adc_params = xonar_set_cs53x1_params, 399 + .update_dac_volume = update_cs43xx_volume, 400 + .update_dac_mute = update_cs43xx_mute, 401 + .update_center_lfe_mix = update_cs43xx_center_lfe_mix, 402 + .ac97_switch = xonar_d1_line_mic_ac97_switch, 403 + .dac_tlv = cs4362a_db_scale, 404 + .model_data_size = sizeof(struct xonar_cs43xx), 405 + .device_config = PLAYBACK_0_TO_I2S | 406 + PLAYBACK_1_TO_SPDIF | 407 + CAPTURE_0_FROM_I2S_2, 408 + .dac_channels = 8, 409 + .dac_volume_min = 127 - 60, 410 + .dac_volume_max = 127, 411 + .function_flags = OXYGEN_FUNCTION_2WIRE, 412 + .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, 413 + .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, 414 + }; 415 + 416 + int __devinit get_xonar_cs43xx_model(struct oxygen *chip, 417 + const struct pci_device_id *id) 418 + { 419 + switch (id->subdevice) { 420 + case 0x834f: 421 + chip->model = model_xonar_d1; 422 + chip->model.shortname = "Xonar D1"; 423 + break; 424 + case 0x8275: 425 + case 0x8327: 426 + chip->model = model_xonar_d1; 427 + chip->model.shortname = "Xonar DX"; 428 + chip->model.init = xonar_dx_init; 429 + break; 430 + default: 431 + return -EINVAL; 432 + } 433 + return 0; 434 + }
+128
sound/pci/oxygen/xonar_hdmi.c
··· 1 + /* 2 + * helper functions for HDMI models (Xonar HDAV1.3) 3 + * 4 + * Copyright (c) Clemens Ladisch <clemens@ladisch.de> 5 + * 6 + * 7 + * This driver is free software; you can redistribute it and/or modify 8 + * it under the terms of the GNU General Public License, version 2. 9 + * 10 + * This driver is distributed in the hope that it will be useful, 11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 + * GNU General Public License for more details. 14 + * 15 + * You should have received a copy of the GNU General Public License 16 + * along with this driver; if not, see <http://www.gnu.org/licenses/>. 17 + */ 18 + 19 + #include <linux/pci.h> 20 + #include <linux/delay.h> 21 + #include <sound/asoundef.h> 22 + #include <sound/control.h> 23 + #include <sound/core.h> 24 + #include <sound/pcm.h> 25 + #include <sound/pcm_params.h> 26 + #include <sound/tlv.h> 27 + #include "xonar.h" 28 + 29 + static void hdmi_write_command(struct oxygen *chip, u8 command, 30 + unsigned int count, const u8 *params) 31 + { 32 + unsigned int i; 33 + u8 checksum; 34 + 35 + oxygen_write_uart(chip, 0xfb); 36 + oxygen_write_uart(chip, 0xef); 37 + oxygen_write_uart(chip, command); 38 + oxygen_write_uart(chip, count); 39 + for (i = 0; i < count; ++i) 40 + oxygen_write_uart(chip, params[i]); 41 + checksum = 0xfb + 0xef + command + count; 42 + for (i = 0; i < count; ++i) 43 + checksum += params[i]; 44 + oxygen_write_uart(chip, checksum); 45 + } 46 + 47 + static void xonar_hdmi_init_commands(struct oxygen *chip, 48 + struct xonar_hdmi *hdmi) 49 + { 50 + u8 param; 51 + 52 + oxygen_reset_uart(chip); 53 + param = 0; 54 + hdmi_write_command(chip, 0x61, 1, &param); 55 + param = 1; 56 + hdmi_write_command(chip, 0x74, 1, &param); 57 + hdmi_write_command(chip, 0x54, 5, hdmi->params); 58 + } 59 + 60 + void xonar_hdmi_init(struct oxygen *chip, struct xonar_hdmi *hdmi) 61 + { 62 + hdmi->params[1] = IEC958_AES3_CON_FS_48000; 63 + hdmi->params[4] = 1; 64 + xonar_hdmi_init_commands(chip, hdmi); 65 + } 66 + 67 + void xonar_hdmi_cleanup(struct oxygen *chip) 68 + { 69 + u8 param = 0; 70 + 71 + hdmi_write_command(chip, 0x74, 1, &param); 72 + } 73 + 74 + void xonar_hdmi_resume(struct oxygen *chip, struct xonar_hdmi *hdmi) 75 + { 76 + xonar_hdmi_init_commands(chip, hdmi); 77 + } 78 + 79 + void xonar_hdmi_pcm_hardware_filter(unsigned int channel, 80 + struct snd_pcm_hardware *hardware) 81 + { 82 + if (channel == PCM_MULTICH) { 83 + hardware->rates = SNDRV_PCM_RATE_44100 | 84 + SNDRV_PCM_RATE_48000 | 85 + SNDRV_PCM_RATE_96000 | 86 + SNDRV_PCM_RATE_192000; 87 + hardware->rate_min = 44100; 88 + } 89 + } 90 + 91 + void xonar_set_hdmi_params(struct oxygen *chip, struct xonar_hdmi *hdmi, 92 + struct snd_pcm_hw_params *params) 93 + { 94 + hdmi->params[0] = 0; /* 1 = non-audio */ 95 + switch (params_rate(params)) { 96 + case 44100: 97 + hdmi->params[1] = IEC958_AES3_CON_FS_44100; 98 + break; 99 + case 48000: 100 + hdmi->params[1] = IEC958_AES3_CON_FS_48000; 101 + break; 102 + default: /* 96000 */ 103 + hdmi->params[1] = IEC958_AES3_CON_FS_96000; 104 + break; 105 + case 192000: 106 + hdmi->params[1] = IEC958_AES3_CON_FS_192000; 107 + break; 108 + } 109 + hdmi->params[2] = params_channels(params) / 2 - 1; 110 + if (params_format(params) == SNDRV_PCM_FORMAT_S16_LE) 111 + hdmi->params[3] = 0; 112 + else 113 + hdmi->params[3] = 0xc0; 114 + hdmi->params[4] = 1; /* ? */ 115 + hdmi_write_command(chip, 0x54, 5, hdmi->params); 116 + } 117 + 118 + void xonar_hdmi_uart_input(struct oxygen *chip) 119 + { 120 + if (chip->uart_input_count >= 2 && 121 + chip->uart_input[chip->uart_input_count - 2] == 'O' && 122 + chip->uart_input[chip->uart_input_count - 1] == 'K') { 123 + printk(KERN_DEBUG "message from HDMI chip received:\n"); 124 + print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, 125 + chip->uart_input, chip->uart_input_count); 126 + chip->uart_input_count = 0; 127 + } 128 + }
+132
sound/pci/oxygen/xonar_lib.c
··· 1 + /* 2 + * helper functions for Asus Xonar cards 3 + * 4 + * Copyright (c) Clemens Ladisch <clemens@ladisch.de> 5 + * 6 + * 7 + * This driver is free software; you can redistribute it and/or modify 8 + * it under the terms of the GNU General Public License, version 2. 9 + * 10 + * This driver is distributed in the hope that it will be useful, 11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 + * GNU General Public License for more details. 14 + * 15 + * You should have received a copy of the GNU General Public License 16 + * along with this driver; if not, see <http://www.gnu.org/licenses/>. 17 + */ 18 + 19 + #include <linux/delay.h> 20 + #include <sound/core.h> 21 + #include <sound/control.h> 22 + #include <sound/pcm.h> 23 + #include <sound/pcm_params.h> 24 + #include "xonar.h" 25 + 26 + 27 + #define GPIO_CS53x1_M_MASK 0x000c 28 + #define GPIO_CS53x1_M_SINGLE 0x0000 29 + #define GPIO_CS53x1_M_DOUBLE 0x0004 30 + #define GPIO_CS53x1_M_QUAD 0x0008 31 + 32 + 33 + void xonar_enable_output(struct oxygen *chip) 34 + { 35 + struct xonar_generic *data = chip->model_data; 36 + 37 + oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, data->output_enable_bit); 38 + msleep(data->anti_pop_delay); 39 + oxygen_set_bits16(chip, OXYGEN_GPIO_DATA, data->output_enable_bit); 40 + } 41 + 42 + void xonar_disable_output(struct oxygen *chip) 43 + { 44 + struct xonar_generic *data = chip->model_data; 45 + 46 + oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, data->output_enable_bit); 47 + } 48 + 49 + static void xonar_ext_power_gpio_changed(struct oxygen *chip) 50 + { 51 + struct xonar_generic *data = chip->model_data; 52 + u8 has_power; 53 + 54 + has_power = !!(oxygen_read8(chip, data->ext_power_reg) 55 + & data->ext_power_bit); 56 + if (has_power != data->has_power) { 57 + data->has_power = has_power; 58 + if (has_power) { 59 + snd_printk(KERN_NOTICE "power restored\n"); 60 + } else { 61 + snd_printk(KERN_CRIT 62 + "Hey! Don't unplug the power cable!\n"); 63 + /* TODO: stop PCMs */ 64 + } 65 + } 66 + } 67 + 68 + void xonar_init_ext_power(struct oxygen *chip) 69 + { 70 + struct xonar_generic *data = chip->model_data; 71 + 72 + oxygen_set_bits8(chip, data->ext_power_int_reg, 73 + data->ext_power_bit); 74 + chip->interrupt_mask |= OXYGEN_INT_GPIO; 75 + chip->model.gpio_changed = xonar_ext_power_gpio_changed; 76 + data->has_power = !!(oxygen_read8(chip, data->ext_power_reg) 77 + & data->ext_power_bit); 78 + } 79 + 80 + void xonar_init_cs53x1(struct oxygen *chip) 81 + { 82 + oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_CS53x1_M_MASK); 83 + oxygen_write16_masked(chip, OXYGEN_GPIO_DATA, 84 + GPIO_CS53x1_M_SINGLE, GPIO_CS53x1_M_MASK); 85 + } 86 + 87 + void xonar_set_cs53x1_params(struct oxygen *chip, 88 + struct snd_pcm_hw_params *params) 89 + { 90 + unsigned int value; 91 + 92 + if (params_rate(params) <= 54000) 93 + value = GPIO_CS53x1_M_SINGLE; 94 + else if (params_rate(params) <= 108000) 95 + value = GPIO_CS53x1_M_DOUBLE; 96 + else 97 + value = GPIO_CS53x1_M_QUAD; 98 + oxygen_write16_masked(chip, OXYGEN_GPIO_DATA, 99 + value, GPIO_CS53x1_M_MASK); 100 + } 101 + 102 + int xonar_gpio_bit_switch_get(struct snd_kcontrol *ctl, 103 + struct snd_ctl_elem_value *value) 104 + { 105 + struct oxygen *chip = ctl->private_data; 106 + u16 bit = ctl->private_value; 107 + 108 + value->value.integer.value[0] = 109 + !!(oxygen_read16(chip, OXYGEN_GPIO_DATA) & bit); 110 + return 0; 111 + } 112 + 113 + int xonar_gpio_bit_switch_put(struct snd_kcontrol *ctl, 114 + struct snd_ctl_elem_value *value) 115 + { 116 + struct oxygen *chip = ctl->private_data; 117 + u16 bit = ctl->private_value; 118 + u16 old_bits, new_bits; 119 + int changed; 120 + 121 + spin_lock_irq(&chip->reg_lock); 122 + old_bits = oxygen_read16(chip, OXYGEN_GPIO_DATA); 123 + if (value->value.integer.value[0]) 124 + new_bits = old_bits | bit; 125 + else 126 + new_bits = old_bits & ~bit; 127 + changed = new_bits != old_bits; 128 + if (changed) 129 + oxygen_write16(chip, OXYGEN_GPIO_DATA, new_bits); 130 + spin_unlock_irq(&chip->reg_lock); 131 + return changed; 132 + }
+1115
sound/pci/oxygen/xonar_pcm179x.c
··· 1 + /* 2 + * card driver for models with PCM1796 DACs (Xonar D2/D2X/HDAV1.3/ST/STX) 3 + * 4 + * Copyright (c) Clemens Ladisch <clemens@ladisch.de> 5 + * 6 + * 7 + * This driver is free software; you can redistribute it and/or modify 8 + * it under the terms of the GNU General Public License, version 2. 9 + * 10 + * This driver is distributed in the hope that it will be useful, 11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 + * GNU General Public License for more details. 14 + * 15 + * You should have received a copy of the GNU General Public License 16 + * along with this driver; if not, see <http://www.gnu.org/licenses/>. 17 + */ 18 + 19 + /* 20 + * Xonar D2/D2X 21 + * ------------ 22 + * 23 + * CMI8788: 24 + * 25 + * SPI 0 -> 1st PCM1796 (front) 26 + * SPI 1 -> 2nd PCM1796 (surround) 27 + * SPI 2 -> 3rd PCM1796 (center/LFE) 28 + * SPI 4 -> 4th PCM1796 (back) 29 + * 30 + * GPIO 2 -> M0 of CS5381 31 + * GPIO 3 -> M1 of CS5381 32 + * GPIO 5 <- external power present (D2X only) 33 + * GPIO 7 -> ALT 34 + * GPIO 8 -> enable output to speakers 35 + * 36 + * CM9780: 37 + * 38 + * GPO 0 -> route line-in (0) or AC97 output (1) to CS5381 input 39 + */ 40 + 41 + /* 42 + * Xonar HDAV1.3 (Deluxe) 43 + * ---------------------- 44 + * 45 + * CMI8788: 46 + * 47 + * I²C <-> PCM1796 (front) 48 + * 49 + * GPI 0 <- external power present 50 + * 51 + * GPIO 0 -> enable output to speakers 52 + * GPIO 2 -> M0 of CS5381 53 + * GPIO 3 -> M1 of CS5381 54 + * GPIO 8 -> route input jack to line-in (0) or mic-in (1) 55 + * 56 + * TXD -> HDMI controller 57 + * RXD <- HDMI controller 58 + * 59 + * PCM1796 front: AD1,0 <- 0,0 60 + * 61 + * CM9780: 62 + * 63 + * GPO 0 -> route line-in (0) or AC97 output (1) to CS5381 input 64 + * 65 + * no daughterboard 66 + * ---------------- 67 + * 68 + * GPIO 4 <- 1 69 + * 70 + * H6 daughterboard 71 + * ---------------- 72 + * 73 + * GPIO 4 <- 0 74 + * GPIO 5 <- 0 75 + * 76 + * I²C <-> PCM1796 (surround) 77 + * <-> PCM1796 (center/LFE) 78 + * <-> PCM1796 (back) 79 + * 80 + * PCM1796 surround: AD1,0 <- 0,1 81 + * PCM1796 center/LFE: AD1,0 <- 1,0 82 + * PCM1796 back: AD1,0 <- 1,1 83 + * 84 + * unknown daughterboard 85 + * --------------------- 86 + * 87 + * GPIO 4 <- 0 88 + * GPIO 5 <- 1 89 + * 90 + * I²C <-> CS4362A (surround, center/LFE, back) 91 + * 92 + * CS4362A: AD0 <- 0 93 + */ 94 + 95 + /* 96 + * Xonar Essence ST (Deluxe)/STX 97 + * ----------------------------- 98 + * 99 + * CMI8788: 100 + * 101 + * I²C <-> PCM1792A 102 + * <-> CS2000 (ST only) 103 + * 104 + * ADC1 MCLK -> REF_CLK of CS2000 (ST only) 105 + * 106 + * GPI 0 <- external power present (STX only) 107 + * 108 + * GPIO 0 -> enable output to speakers 109 + * GPIO 1 -> route HP to front panel (0) or rear jack (1) 110 + * GPIO 2 -> M0 of CS5381 111 + * GPIO 3 -> M1 of CS5381 112 + * GPIO 7 -> route output to speaker jacks (0) or HP (1) 113 + * GPIO 8 -> route input jack to line-in (0) or mic-in (1) 114 + * 115 + * PCM1792A: 116 + * 117 + * AD1,0 <- 0,0 118 + * SCK <- CLK_OUT of CS2000 (ST only) 119 + * 120 + * CS2000: 121 + * 122 + * AD0 <- 0 123 + * 124 + * CM9780: 125 + * 126 + * GPO 0 -> route line-in (0) or AC97 output (1) to CS5381 input 127 + * 128 + * H6 daughterboard 129 + * ---------------- 130 + * 131 + * GPIO 4 <- 0 132 + * GPIO 5 <- 0 133 + */ 134 + 135 + #include <linux/pci.h> 136 + #include <linux/delay.h> 137 + #include <linux/mutex.h> 138 + #include <sound/ac97_codec.h> 139 + #include <sound/control.h> 140 + #include <sound/core.h> 141 + #include <sound/pcm.h> 142 + #include <sound/pcm_params.h> 143 + #include <sound/tlv.h> 144 + #include "xonar.h" 145 + #include "cm9780.h" 146 + #include "pcm1796.h" 147 + #include "cs2000.h" 148 + 149 + 150 + #define GPIO_D2X_EXT_POWER 0x0020 151 + #define GPIO_D2_ALT 0x0080 152 + #define GPIO_D2_OUTPUT_ENABLE 0x0100 153 + 154 + #define GPI_EXT_POWER 0x01 155 + #define GPIO_INPUT_ROUTE 0x0100 156 + 157 + #define GPIO_HDAV_OUTPUT_ENABLE 0x0001 158 + 159 + #define GPIO_DB_MASK 0x0030 160 + #define GPIO_DB_H6 0x0000 161 + 162 + #define GPIO_ST_OUTPUT_ENABLE 0x0001 163 + #define GPIO_ST_HP_REAR 0x0002 164 + #define GPIO_ST_HP 0x0080 165 + 166 + #define I2C_DEVICE_PCM1796(i) (0x98 + ((i) << 1)) /* 10011, ii, /W=0 */ 167 + #define I2C_DEVICE_CS2000 0x9c /* 100111, 0, /W=0 */ 168 + 169 + #define PCM1796_REG_BASE 16 170 + 171 + 172 + struct xonar_pcm179x { 173 + struct xonar_generic generic; 174 + unsigned int dacs; 175 + u8 pcm1796_regs[4][5]; 176 + unsigned int current_rate; 177 + bool os_128; 178 + bool hp_active; 179 + s8 hp_gain_offset; 180 + bool has_cs2000; 181 + u8 cs2000_fun_cfg_1; 182 + }; 183 + 184 + struct xonar_hdav { 185 + struct xonar_pcm179x pcm179x; 186 + struct xonar_hdmi hdmi; 187 + }; 188 + 189 + 190 + static inline void pcm1796_write_spi(struct oxygen *chip, unsigned int codec, 191 + u8 reg, u8 value) 192 + { 193 + /* maps ALSA channel pair number to SPI output */ 194 + static const u8 codec_map[4] = { 195 + 0, 1, 2, 4 196 + }; 197 + oxygen_write_spi(chip, OXYGEN_SPI_TRIGGER | 198 + OXYGEN_SPI_DATA_LENGTH_2 | 199 + OXYGEN_SPI_CLOCK_160 | 200 + (codec_map[codec] << OXYGEN_SPI_CODEC_SHIFT) | 201 + OXYGEN_SPI_CEN_LATCH_CLOCK_HI, 202 + (reg << 8) | value); 203 + } 204 + 205 + static inline void pcm1796_write_i2c(struct oxygen *chip, unsigned int codec, 206 + u8 reg, u8 value) 207 + { 208 + oxygen_write_i2c(chip, I2C_DEVICE_PCM1796(codec), reg, value); 209 + } 210 + 211 + static void pcm1796_write(struct oxygen *chip, unsigned int codec, 212 + u8 reg, u8 value) 213 + { 214 + struct xonar_pcm179x *data = chip->model_data; 215 + 216 + if ((chip->model.function_flags & OXYGEN_FUNCTION_2WIRE_SPI_MASK) == 217 + OXYGEN_FUNCTION_SPI) 218 + pcm1796_write_spi(chip, codec, reg, value); 219 + else 220 + pcm1796_write_i2c(chip, codec, reg, value); 221 + if ((unsigned int)(reg - PCM1796_REG_BASE) 222 + < ARRAY_SIZE(data->pcm1796_regs[codec])) 223 + data->pcm1796_regs[codec][reg - PCM1796_REG_BASE] = value; 224 + } 225 + 226 + static void pcm1796_write_cached(struct oxygen *chip, unsigned int codec, 227 + u8 reg, u8 value) 228 + { 229 + struct xonar_pcm179x *data = chip->model_data; 230 + 231 + if (value != data->pcm1796_regs[codec][reg - PCM1796_REG_BASE]) 232 + pcm1796_write(chip, codec, reg, value); 233 + } 234 + 235 + static void cs2000_write(struct oxygen *chip, u8 reg, u8 value) 236 + { 237 + struct xonar_pcm179x *data = chip->model_data; 238 + 239 + oxygen_write_i2c(chip, I2C_DEVICE_CS2000, reg, value); 240 + if (reg == CS2000_FUN_CFG_1) 241 + data->cs2000_fun_cfg_1 = value; 242 + } 243 + 244 + static void cs2000_write_cached(struct oxygen *chip, u8 reg, u8 value) 245 + { 246 + struct xonar_pcm179x *data = chip->model_data; 247 + 248 + if (reg != CS2000_FUN_CFG_1 || 249 + value != data->cs2000_fun_cfg_1) 250 + cs2000_write(chip, reg, value); 251 + } 252 + 253 + static void pcm1796_registers_init(struct oxygen *chip) 254 + { 255 + struct xonar_pcm179x *data = chip->model_data; 256 + unsigned int i; 257 + s8 gain_offset; 258 + 259 + gain_offset = data->hp_active ? data->hp_gain_offset : 0; 260 + for (i = 0; i < data->dacs; ++i) { 261 + /* set ATLD before ATL/ATR */ 262 + pcm1796_write(chip, i, 18, 263 + data->pcm1796_regs[0][18 - PCM1796_REG_BASE]); 264 + pcm1796_write(chip, i, 16, chip->dac_volume[i * 2] 265 + + gain_offset); 266 + pcm1796_write(chip, i, 17, chip->dac_volume[i * 2 + 1] 267 + + gain_offset); 268 + pcm1796_write(chip, i, 19, 269 + data->pcm1796_regs[0][19 - PCM1796_REG_BASE]); 270 + pcm1796_write(chip, i, 20, 271 + data->pcm1796_regs[0][20 - PCM1796_REG_BASE]); 272 + pcm1796_write(chip, i, 21, 0); 273 + } 274 + } 275 + 276 + static void pcm1796_init(struct oxygen *chip) 277 + { 278 + struct xonar_pcm179x *data = chip->model_data; 279 + 280 + data->pcm1796_regs[0][18 - PCM1796_REG_BASE] = PCM1796_MUTE | 281 + PCM1796_DMF_DISABLED | PCM1796_FMT_24_LJUST | PCM1796_ATLD; 282 + data->pcm1796_regs[0][19 - PCM1796_REG_BASE] = 283 + PCM1796_FLT_SHARP | PCM1796_ATS_1; 284 + data->pcm1796_regs[0][20 - PCM1796_REG_BASE] = PCM1796_OS_64; 285 + pcm1796_registers_init(chip); 286 + data->current_rate = 48000; 287 + } 288 + 289 + static void xonar_d2_init(struct oxygen *chip) 290 + { 291 + struct xonar_pcm179x *data = chip->model_data; 292 + 293 + data->generic.anti_pop_delay = 300; 294 + data->generic.output_enable_bit = GPIO_D2_OUTPUT_ENABLE; 295 + data->dacs = 4; 296 + 297 + pcm1796_init(chip); 298 + 299 + oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_D2_ALT); 300 + oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, GPIO_D2_ALT); 301 + 302 + oxygen_ac97_set_bits(chip, 0, CM9780_JACK, CM9780_FMIC2MIC); 303 + 304 + xonar_init_cs53x1(chip); 305 + xonar_enable_output(chip); 306 + 307 + snd_component_add(chip->card, "PCM1796"); 308 + snd_component_add(chip->card, "CS5381"); 309 + } 310 + 311 + static void xonar_d2x_init(struct oxygen *chip) 312 + { 313 + struct xonar_pcm179x *data = chip->model_data; 314 + 315 + data->generic.ext_power_reg = OXYGEN_GPIO_DATA; 316 + data->generic.ext_power_int_reg = OXYGEN_GPIO_INTERRUPT_MASK; 317 + data->generic.ext_power_bit = GPIO_D2X_EXT_POWER; 318 + oxygen_clear_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_D2X_EXT_POWER); 319 + xonar_init_ext_power(chip); 320 + xonar_d2_init(chip); 321 + } 322 + 323 + static void xonar_hdav_init(struct oxygen *chip) 324 + { 325 + struct xonar_hdav *data = chip->model_data; 326 + 327 + oxygen_write16(chip, OXYGEN_2WIRE_BUS_STATUS, 328 + OXYGEN_2WIRE_LENGTH_8 | 329 + OXYGEN_2WIRE_INTERRUPT_MASK | 330 + OXYGEN_2WIRE_SPEED_FAST); 331 + 332 + data->pcm179x.generic.anti_pop_delay = 100; 333 + data->pcm179x.generic.output_enable_bit = GPIO_HDAV_OUTPUT_ENABLE; 334 + data->pcm179x.generic.ext_power_reg = OXYGEN_GPI_DATA; 335 + data->pcm179x.generic.ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK; 336 + data->pcm179x.generic.ext_power_bit = GPI_EXT_POWER; 337 + data->pcm179x.dacs = chip->model.private_data ? 4 : 1; 338 + 339 + pcm1796_init(chip); 340 + 341 + oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_INPUT_ROUTE); 342 + oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, GPIO_INPUT_ROUTE); 343 + 344 + xonar_init_cs53x1(chip); 345 + xonar_init_ext_power(chip); 346 + xonar_hdmi_init(chip, &data->hdmi); 347 + xonar_enable_output(chip); 348 + 349 + snd_component_add(chip->card, "PCM1796"); 350 + snd_component_add(chip->card, "CS5381"); 351 + } 352 + 353 + static void xonar_st_init_i2c(struct oxygen *chip) 354 + { 355 + oxygen_write16(chip, OXYGEN_2WIRE_BUS_STATUS, 356 + OXYGEN_2WIRE_LENGTH_8 | 357 + OXYGEN_2WIRE_INTERRUPT_MASK | 358 + OXYGEN_2WIRE_SPEED_FAST); 359 + } 360 + 361 + static void xonar_st_init_common(struct oxygen *chip) 362 + { 363 + struct xonar_pcm179x *data = chip->model_data; 364 + 365 + data->generic.anti_pop_delay = 100; 366 + data->generic.output_enable_bit = GPIO_ST_OUTPUT_ENABLE; 367 + data->dacs = chip->model.private_data ? 4 : 1; 368 + data->hp_gain_offset = 2*-18; 369 + 370 + pcm1796_init(chip); 371 + 372 + oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, 373 + GPIO_INPUT_ROUTE | GPIO_ST_HP_REAR | GPIO_ST_HP); 374 + oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, 375 + GPIO_INPUT_ROUTE | GPIO_ST_HP_REAR | GPIO_ST_HP); 376 + 377 + xonar_init_cs53x1(chip); 378 + xonar_enable_output(chip); 379 + 380 + snd_component_add(chip->card, "PCM1792A"); 381 + snd_component_add(chip->card, "CS5381"); 382 + } 383 + 384 + static void cs2000_registers_init(struct oxygen *chip) 385 + { 386 + struct xonar_pcm179x *data = chip->model_data; 387 + 388 + cs2000_write(chip, CS2000_GLOBAL_CFG, CS2000_FREEZE); 389 + cs2000_write(chip, CS2000_DEV_CTRL, 0); 390 + cs2000_write(chip, CS2000_DEV_CFG_1, 391 + CS2000_R_MOD_SEL_1 | 392 + (0 << CS2000_R_SEL_SHIFT) | 393 + CS2000_AUX_OUT_SRC_REF_CLK | 394 + CS2000_EN_DEV_CFG_1); 395 + cs2000_write(chip, CS2000_DEV_CFG_2, 396 + (0 << CS2000_LOCK_CLK_SHIFT) | 397 + CS2000_FRAC_N_SRC_STATIC); 398 + cs2000_write(chip, CS2000_RATIO_0 + 0, 0x00); /* 1.0 */ 399 + cs2000_write(chip, CS2000_RATIO_0 + 1, 0x10); 400 + cs2000_write(chip, CS2000_RATIO_0 + 2, 0x00); 401 + cs2000_write(chip, CS2000_RATIO_0 + 3, 0x00); 402 + cs2000_write(chip, CS2000_FUN_CFG_1, data->cs2000_fun_cfg_1); 403 + cs2000_write(chip, CS2000_FUN_CFG_2, 0); 404 + cs2000_write(chip, CS2000_GLOBAL_CFG, CS2000_EN_DEV_CFG_2); 405 + } 406 + 407 + static void xonar_st_init(struct oxygen *chip) 408 + { 409 + struct xonar_pcm179x *data = chip->model_data; 410 + 411 + data->has_cs2000 = 1; 412 + data->cs2000_fun_cfg_1 = CS2000_REF_CLK_DIV_1; 413 + 414 + oxygen_write16(chip, OXYGEN_I2S_A_FORMAT, 415 + OXYGEN_RATE_48000 | OXYGEN_I2S_FORMAT_I2S | 416 + OXYGEN_I2S_MCLK_128 | OXYGEN_I2S_BITS_16 | 417 + OXYGEN_I2S_MASTER | OXYGEN_I2S_BCLK_64); 418 + 419 + xonar_st_init_i2c(chip); 420 + cs2000_registers_init(chip); 421 + xonar_st_init_common(chip); 422 + 423 + snd_component_add(chip->card, "CS2000"); 424 + } 425 + 426 + static void xonar_stx_init(struct oxygen *chip) 427 + { 428 + struct xonar_pcm179x *data = chip->model_data; 429 + 430 + xonar_st_init_i2c(chip); 431 + data->generic.ext_power_reg = OXYGEN_GPI_DATA; 432 + data->generic.ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK; 433 + data->generic.ext_power_bit = GPI_EXT_POWER; 434 + xonar_init_ext_power(chip); 435 + xonar_st_init_common(chip); 436 + } 437 + 438 + static void xonar_d2_cleanup(struct oxygen *chip) 439 + { 440 + xonar_disable_output(chip); 441 + } 442 + 443 + static void xonar_hdav_cleanup(struct oxygen *chip) 444 + { 445 + xonar_hdmi_cleanup(chip); 446 + xonar_disable_output(chip); 447 + msleep(2); 448 + } 449 + 450 + static void xonar_st_cleanup(struct oxygen *chip) 451 + { 452 + xonar_disable_output(chip); 453 + } 454 + 455 + static void xonar_d2_suspend(struct oxygen *chip) 456 + { 457 + xonar_d2_cleanup(chip); 458 + } 459 + 460 + static void xonar_hdav_suspend(struct oxygen *chip) 461 + { 462 + xonar_hdav_cleanup(chip); 463 + } 464 + 465 + static void xonar_st_suspend(struct oxygen *chip) 466 + { 467 + xonar_st_cleanup(chip); 468 + } 469 + 470 + static void xonar_d2_resume(struct oxygen *chip) 471 + { 472 + pcm1796_registers_init(chip); 473 + xonar_enable_output(chip); 474 + } 475 + 476 + static void xonar_hdav_resume(struct oxygen *chip) 477 + { 478 + struct xonar_hdav *data = chip->model_data; 479 + 480 + pcm1796_registers_init(chip); 481 + xonar_hdmi_resume(chip, &data->hdmi); 482 + xonar_enable_output(chip); 483 + } 484 + 485 + static void xonar_stx_resume(struct oxygen *chip) 486 + { 487 + pcm1796_registers_init(chip); 488 + xonar_enable_output(chip); 489 + } 490 + 491 + static void xonar_st_resume(struct oxygen *chip) 492 + { 493 + cs2000_registers_init(chip); 494 + xonar_stx_resume(chip); 495 + } 496 + 497 + static unsigned int mclk_from_rate(struct oxygen *chip, unsigned int rate) 498 + { 499 + struct xonar_pcm179x *data = chip->model_data; 500 + 501 + if (rate <= 32000) 502 + return OXYGEN_I2S_MCLK_512; 503 + else if (rate <= 48000 && data->os_128) 504 + return OXYGEN_I2S_MCLK_512; 505 + else if (rate <= 96000) 506 + return OXYGEN_I2S_MCLK_256; 507 + else 508 + return OXYGEN_I2S_MCLK_128; 509 + } 510 + 511 + static unsigned int get_pcm1796_i2s_mclk(struct oxygen *chip, 512 + unsigned int channel, 513 + struct snd_pcm_hw_params *params) 514 + { 515 + if (channel == PCM_MULTICH) 516 + return mclk_from_rate(chip, params_rate(params)); 517 + else 518 + return oxygen_default_i2s_mclk(chip, channel, params); 519 + } 520 + 521 + static void update_pcm1796_oversampling(struct oxygen *chip) 522 + { 523 + struct xonar_pcm179x *data = chip->model_data; 524 + unsigned int i; 525 + u8 reg; 526 + 527 + if (data->current_rate <= 32000) 528 + reg = PCM1796_OS_128; 529 + else if (data->current_rate <= 48000 && data->os_128) 530 + reg = PCM1796_OS_128; 531 + else if (data->current_rate <= 96000 || data->os_128) 532 + reg = PCM1796_OS_64; 533 + else 534 + reg = PCM1796_OS_32; 535 + for (i = 0; i < data->dacs; ++i) 536 + pcm1796_write_cached(chip, i, 20, reg); 537 + } 538 + 539 + static void set_pcm1796_params(struct oxygen *chip, 540 + struct snd_pcm_hw_params *params) 541 + { 542 + struct xonar_pcm179x *data = chip->model_data; 543 + 544 + data->current_rate = params_rate(params); 545 + update_pcm1796_oversampling(chip); 546 + } 547 + 548 + static void update_pcm1796_volume(struct oxygen *chip) 549 + { 550 + struct xonar_pcm179x *data = chip->model_data; 551 + unsigned int i; 552 + s8 gain_offset; 553 + 554 + gain_offset = data->hp_active ? data->hp_gain_offset : 0; 555 + for (i = 0; i < data->dacs; ++i) { 556 + pcm1796_write_cached(chip, i, 16, chip->dac_volume[i * 2] 557 + + gain_offset); 558 + pcm1796_write_cached(chip, i, 17, chip->dac_volume[i * 2 + 1] 559 + + gain_offset); 560 + } 561 + } 562 + 563 + static void update_pcm1796_mute(struct oxygen *chip) 564 + { 565 + struct xonar_pcm179x *data = chip->model_data; 566 + unsigned int i; 567 + u8 value; 568 + 569 + value = PCM1796_DMF_DISABLED | PCM1796_FMT_24_LJUST | PCM1796_ATLD; 570 + if (chip->dac_mute) 571 + value |= PCM1796_MUTE; 572 + for (i = 0; i < data->dacs; ++i) 573 + pcm1796_write_cached(chip, i, 18, value); 574 + } 575 + 576 + static void update_cs2000_rate(struct oxygen *chip, unsigned int rate) 577 + { 578 + struct xonar_pcm179x *data = chip->model_data; 579 + u8 rate_mclk, reg; 580 + 581 + switch (rate) { 582 + /* XXX Why is the I2S A MCLK half the actual I2S MCLK? */ 583 + case 32000: 584 + rate_mclk = OXYGEN_RATE_32000 | OXYGEN_I2S_MCLK_256; 585 + break; 586 + case 44100: 587 + if (data->os_128) 588 + rate_mclk = OXYGEN_RATE_44100 | OXYGEN_I2S_MCLK_256; 589 + else 590 + rate_mclk = OXYGEN_RATE_44100 | OXYGEN_I2S_MCLK_128; 591 + break; 592 + default: /* 48000 */ 593 + if (data->os_128) 594 + rate_mclk = OXYGEN_RATE_48000 | OXYGEN_I2S_MCLK_256; 595 + else 596 + rate_mclk = OXYGEN_RATE_48000 | OXYGEN_I2S_MCLK_128; 597 + break; 598 + case 64000: 599 + rate_mclk = OXYGEN_RATE_32000 | OXYGEN_I2S_MCLK_256; 600 + break; 601 + case 88200: 602 + rate_mclk = OXYGEN_RATE_44100 | OXYGEN_I2S_MCLK_256; 603 + break; 604 + case 96000: 605 + rate_mclk = OXYGEN_RATE_48000 | OXYGEN_I2S_MCLK_256; 606 + break; 607 + case 176400: 608 + rate_mclk = OXYGEN_RATE_44100 | OXYGEN_I2S_MCLK_256; 609 + break; 610 + case 192000: 611 + rate_mclk = OXYGEN_RATE_48000 | OXYGEN_I2S_MCLK_256; 612 + break; 613 + } 614 + oxygen_write16_masked(chip, OXYGEN_I2S_A_FORMAT, rate_mclk, 615 + OXYGEN_I2S_RATE_MASK | OXYGEN_I2S_MCLK_MASK); 616 + if ((rate_mclk & OXYGEN_I2S_MCLK_MASK) <= OXYGEN_I2S_MCLK_128) 617 + reg = CS2000_REF_CLK_DIV_1; 618 + else 619 + reg = CS2000_REF_CLK_DIV_2; 620 + cs2000_write_cached(chip, CS2000_FUN_CFG_1, reg); 621 + } 622 + 623 + static void set_st_params(struct oxygen *chip, 624 + struct snd_pcm_hw_params *params) 625 + { 626 + update_cs2000_rate(chip, params_rate(params)); 627 + set_pcm1796_params(chip, params); 628 + } 629 + 630 + static void set_hdav_params(struct oxygen *chip, 631 + struct snd_pcm_hw_params *params) 632 + { 633 + struct xonar_hdav *data = chip->model_data; 634 + 635 + set_pcm1796_params(chip, params); 636 + xonar_set_hdmi_params(chip, &data->hdmi, params); 637 + } 638 + 639 + static const struct snd_kcontrol_new alt_switch = { 640 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 641 + .name = "Analog Loopback Switch", 642 + .info = snd_ctl_boolean_mono_info, 643 + .get = xonar_gpio_bit_switch_get, 644 + .put = xonar_gpio_bit_switch_put, 645 + .private_value = GPIO_D2_ALT, 646 + }; 647 + 648 + static int rolloff_info(struct snd_kcontrol *ctl, 649 + struct snd_ctl_elem_info *info) 650 + { 651 + static const char *const names[2] = { 652 + "Sharp Roll-off", "Slow Roll-off" 653 + }; 654 + 655 + info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 656 + info->count = 1; 657 + info->value.enumerated.items = 2; 658 + if (info->value.enumerated.item >= 2) 659 + info->value.enumerated.item = 1; 660 + strcpy(info->value.enumerated.name, names[info->value.enumerated.item]); 661 + return 0; 662 + } 663 + 664 + static int rolloff_get(struct snd_kcontrol *ctl, 665 + struct snd_ctl_elem_value *value) 666 + { 667 + struct oxygen *chip = ctl->private_data; 668 + struct xonar_pcm179x *data = chip->model_data; 669 + 670 + value->value.enumerated.item[0] = 671 + (data->pcm1796_regs[0][19 - PCM1796_REG_BASE] & 672 + PCM1796_FLT_MASK) != PCM1796_FLT_SHARP; 673 + return 0; 674 + } 675 + 676 + static int rolloff_put(struct snd_kcontrol *ctl, 677 + struct snd_ctl_elem_value *value) 678 + { 679 + struct oxygen *chip = ctl->private_data; 680 + struct xonar_pcm179x *data = chip->model_data; 681 + unsigned int i; 682 + int changed; 683 + u8 reg; 684 + 685 + mutex_lock(&chip->mutex); 686 + reg = data->pcm1796_regs[0][19 - PCM1796_REG_BASE]; 687 + reg &= ~PCM1796_FLT_MASK; 688 + if (!value->value.enumerated.item[0]) 689 + reg |= PCM1796_FLT_SHARP; 690 + else 691 + reg |= PCM1796_FLT_SLOW; 692 + changed = reg != data->pcm1796_regs[0][19 - PCM1796_REG_BASE]; 693 + if (changed) { 694 + for (i = 0; i < data->dacs; ++i) 695 + pcm1796_write(chip, i, 19, reg); 696 + } 697 + mutex_unlock(&chip->mutex); 698 + return changed; 699 + } 700 + 701 + static const struct snd_kcontrol_new rolloff_control = { 702 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 703 + .name = "DAC Filter Playback Enum", 704 + .info = rolloff_info, 705 + .get = rolloff_get, 706 + .put = rolloff_put, 707 + }; 708 + 709 + static int os_128_info(struct snd_kcontrol *ctl, struct snd_ctl_elem_info *info) 710 + { 711 + static const char *const names[2] = { "64x", "128x" }; 712 + 713 + info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 714 + info->count = 1; 715 + info->value.enumerated.items = 2; 716 + if (info->value.enumerated.item >= 2) 717 + info->value.enumerated.item = 1; 718 + strcpy(info->value.enumerated.name, names[info->value.enumerated.item]); 719 + return 0; 720 + } 721 + 722 + static int os_128_get(struct snd_kcontrol *ctl, 723 + struct snd_ctl_elem_value *value) 724 + { 725 + struct oxygen *chip = ctl->private_data; 726 + struct xonar_pcm179x *data = chip->model_data; 727 + 728 + value->value.enumerated.item[0] = data->os_128; 729 + return 0; 730 + } 731 + 732 + static int os_128_put(struct snd_kcontrol *ctl, 733 + struct snd_ctl_elem_value *value) 734 + { 735 + struct oxygen *chip = ctl->private_data; 736 + struct xonar_pcm179x *data = chip->model_data; 737 + int changed; 738 + 739 + mutex_lock(&chip->mutex); 740 + changed = value->value.enumerated.item[0] != data->os_128; 741 + if (changed) { 742 + data->os_128 = value->value.enumerated.item[0]; 743 + if (data->has_cs2000) 744 + update_cs2000_rate(chip, data->current_rate); 745 + oxygen_write16_masked(chip, OXYGEN_I2S_MULTICH_FORMAT, 746 + mclk_from_rate(chip, data->current_rate), 747 + OXYGEN_I2S_MCLK_MASK); 748 + update_pcm1796_oversampling(chip); 749 + } 750 + mutex_unlock(&chip->mutex); 751 + return changed; 752 + } 753 + 754 + static const struct snd_kcontrol_new os_128_control = { 755 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 756 + .name = "DAC Oversampling Playback Enum", 757 + .info = os_128_info, 758 + .get = os_128_get, 759 + .put = os_128_put, 760 + }; 761 + 762 + static int st_output_switch_info(struct snd_kcontrol *ctl, 763 + struct snd_ctl_elem_info *info) 764 + { 765 + static const char *const names[3] = { 766 + "Speakers", "Headphones", "FP Headphones" 767 + }; 768 + 769 + info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 770 + info->count = 1; 771 + info->value.enumerated.items = 3; 772 + if (info->value.enumerated.item >= 3) 773 + info->value.enumerated.item = 2; 774 + strcpy(info->value.enumerated.name, names[info->value.enumerated.item]); 775 + return 0; 776 + } 777 + 778 + static int st_output_switch_get(struct snd_kcontrol *ctl, 779 + struct snd_ctl_elem_value *value) 780 + { 781 + struct oxygen *chip = ctl->private_data; 782 + u16 gpio; 783 + 784 + gpio = oxygen_read16(chip, OXYGEN_GPIO_DATA); 785 + if (!(gpio & GPIO_ST_HP)) 786 + value->value.enumerated.item[0] = 0; 787 + else if (gpio & GPIO_ST_HP_REAR) 788 + value->value.enumerated.item[0] = 1; 789 + else 790 + value->value.enumerated.item[0] = 2; 791 + return 0; 792 + } 793 + 794 + 795 + static int st_output_switch_put(struct snd_kcontrol *ctl, 796 + struct snd_ctl_elem_value *value) 797 + { 798 + struct oxygen *chip = ctl->private_data; 799 + struct xonar_pcm179x *data = chip->model_data; 800 + u16 gpio_old, gpio; 801 + 802 + mutex_lock(&chip->mutex); 803 + gpio_old = oxygen_read16(chip, OXYGEN_GPIO_DATA); 804 + gpio = gpio_old; 805 + switch (value->value.enumerated.item[0]) { 806 + case 0: 807 + gpio &= ~(GPIO_ST_HP | GPIO_ST_HP_REAR); 808 + break; 809 + case 1: 810 + gpio |= GPIO_ST_HP | GPIO_ST_HP_REAR; 811 + break; 812 + case 2: 813 + gpio = (gpio | GPIO_ST_HP) & ~GPIO_ST_HP_REAR; 814 + break; 815 + } 816 + oxygen_write16(chip, OXYGEN_GPIO_DATA, gpio); 817 + data->hp_active = gpio & GPIO_ST_HP; 818 + update_pcm1796_volume(chip); 819 + mutex_unlock(&chip->mutex); 820 + return gpio != gpio_old; 821 + } 822 + 823 + static int st_hp_volume_offset_info(struct snd_kcontrol *ctl, 824 + struct snd_ctl_elem_info *info) 825 + { 826 + static const char *const names[3] = { 827 + "< 64 ohms", "64-300 ohms", "300-600 ohms" 828 + }; 829 + 830 + info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; 831 + info->count = 1; 832 + info->value.enumerated.items = 3; 833 + if (info->value.enumerated.item > 2) 834 + info->value.enumerated.item = 2; 835 + strcpy(info->value.enumerated.name, names[info->value.enumerated.item]); 836 + return 0; 837 + } 838 + 839 + static int st_hp_volume_offset_get(struct snd_kcontrol *ctl, 840 + struct snd_ctl_elem_value *value) 841 + { 842 + struct oxygen *chip = ctl->private_data; 843 + struct xonar_pcm179x *data = chip->model_data; 844 + 845 + mutex_lock(&chip->mutex); 846 + if (data->hp_gain_offset < 2*-6) 847 + value->value.enumerated.item[0] = 0; 848 + else if (data->hp_gain_offset < 0) 849 + value->value.enumerated.item[0] = 1; 850 + else 851 + value->value.enumerated.item[0] = 2; 852 + mutex_unlock(&chip->mutex); 853 + return 0; 854 + } 855 + 856 + 857 + static int st_hp_volume_offset_put(struct snd_kcontrol *ctl, 858 + struct snd_ctl_elem_value *value) 859 + { 860 + static const s8 offsets[] = { 2*-18, 2*-6, 0 }; 861 + struct oxygen *chip = ctl->private_data; 862 + struct xonar_pcm179x *data = chip->model_data; 863 + s8 offset; 864 + int changed; 865 + 866 + if (value->value.enumerated.item[0] > 2) 867 + return -EINVAL; 868 + offset = offsets[value->value.enumerated.item[0]]; 869 + mutex_lock(&chip->mutex); 870 + changed = offset != data->hp_gain_offset; 871 + if (changed) { 872 + data->hp_gain_offset = offset; 873 + update_pcm1796_volume(chip); 874 + } 875 + mutex_unlock(&chip->mutex); 876 + return changed; 877 + } 878 + 879 + static const struct snd_kcontrol_new st_controls[] = { 880 + { 881 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 882 + .name = "Analog Output", 883 + .info = st_output_switch_info, 884 + .get = st_output_switch_get, 885 + .put = st_output_switch_put, 886 + }, 887 + { 888 + .iface = SNDRV_CTL_ELEM_IFACE_MIXER, 889 + .name = "Headphones Impedance Playback Enum", 890 + .info = st_hp_volume_offset_info, 891 + .get = st_hp_volume_offset_get, 892 + .put = st_hp_volume_offset_put, 893 + }, 894 + }; 895 + 896 + static void xonar_line_mic_ac97_switch(struct oxygen *chip, 897 + unsigned int reg, unsigned int mute) 898 + { 899 + if (reg == AC97_LINE) { 900 + spin_lock_irq(&chip->reg_lock); 901 + oxygen_write16_masked(chip, OXYGEN_GPIO_DATA, 902 + mute ? GPIO_INPUT_ROUTE : 0, 903 + GPIO_INPUT_ROUTE); 904 + spin_unlock_irq(&chip->reg_lock); 905 + } 906 + } 907 + 908 + static const DECLARE_TLV_DB_SCALE(pcm1796_db_scale, -6000, 50, 0); 909 + 910 + static int xonar_d2_control_filter(struct snd_kcontrol_new *template) 911 + { 912 + if (!strncmp(template->name, "CD Capture ", 11)) 913 + /* CD in is actually connected to the video in pin */ 914 + template->private_value ^= AC97_CD ^ AC97_VIDEO; 915 + return 0; 916 + } 917 + 918 + static int xonar_st_control_filter(struct snd_kcontrol_new *template) 919 + { 920 + if (!strncmp(template->name, "CD Capture ", 11)) 921 + return 1; /* no CD input */ 922 + return 0; 923 + } 924 + 925 + static int add_pcm1796_controls(struct oxygen *chip) 926 + { 927 + int err; 928 + 929 + err = snd_ctl_add(chip->card, snd_ctl_new1(&rolloff_control, chip)); 930 + if (err < 0) 931 + return err; 932 + err = snd_ctl_add(chip->card, snd_ctl_new1(&os_128_control, chip)); 933 + if (err < 0) 934 + return err; 935 + return 0; 936 + } 937 + 938 + static int xonar_d2_mixer_init(struct oxygen *chip) 939 + { 940 + int err; 941 + 942 + err = snd_ctl_add(chip->card, snd_ctl_new1(&alt_switch, chip)); 943 + if (err < 0) 944 + return err; 945 + err = add_pcm1796_controls(chip); 946 + if (err < 0) 947 + return err; 948 + return 0; 949 + } 950 + 951 + static int xonar_hdav_mixer_init(struct oxygen *chip) 952 + { 953 + return add_pcm1796_controls(chip); 954 + } 955 + 956 + static int xonar_st_mixer_init(struct oxygen *chip) 957 + { 958 + unsigned int i; 959 + int err; 960 + 961 + for (i = 0; i < ARRAY_SIZE(st_controls); ++i) { 962 + err = snd_ctl_add(chip->card, 963 + snd_ctl_new1(&st_controls[i], chip)); 964 + if (err < 0) 965 + return err; 966 + } 967 + err = add_pcm1796_controls(chip); 968 + if (err < 0) 969 + return err; 970 + return 0; 971 + } 972 + 973 + static const struct oxygen_model model_xonar_d2 = { 974 + .longname = "Asus Virtuoso 200", 975 + .chip = "AV200", 976 + .init = xonar_d2_init, 977 + .control_filter = xonar_d2_control_filter, 978 + .mixer_init = xonar_d2_mixer_init, 979 + .cleanup = xonar_d2_cleanup, 980 + .suspend = xonar_d2_suspend, 981 + .resume = xonar_d2_resume, 982 + .get_i2s_mclk = get_pcm1796_i2s_mclk, 983 + .set_dac_params = set_pcm1796_params, 984 + .set_adc_params = xonar_set_cs53x1_params, 985 + .update_dac_volume = update_pcm1796_volume, 986 + .update_dac_mute = update_pcm1796_mute, 987 + .dac_tlv = pcm1796_db_scale, 988 + .model_data_size = sizeof(struct xonar_pcm179x), 989 + .device_config = PLAYBACK_0_TO_I2S | 990 + PLAYBACK_1_TO_SPDIF | 991 + CAPTURE_0_FROM_I2S_2 | 992 + CAPTURE_1_FROM_SPDIF | 993 + MIDI_OUTPUT | 994 + MIDI_INPUT, 995 + .dac_channels = 8, 996 + .dac_volume_min = 255 - 2*60, 997 + .dac_volume_max = 255, 998 + .misc_flags = OXYGEN_MISC_MIDI, 999 + .function_flags = OXYGEN_FUNCTION_SPI | 1000 + OXYGEN_FUNCTION_ENABLE_SPI_4_5, 1001 + .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, 1002 + .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, 1003 + }; 1004 + 1005 + static const struct oxygen_model model_xonar_hdav = { 1006 + .longname = "Asus Virtuoso 200", 1007 + .chip = "AV200", 1008 + .init = xonar_hdav_init, 1009 + .mixer_init = xonar_hdav_mixer_init, 1010 + .cleanup = xonar_hdav_cleanup, 1011 + .suspend = xonar_hdav_suspend, 1012 + .resume = xonar_hdav_resume, 1013 + .pcm_hardware_filter = xonar_hdmi_pcm_hardware_filter, 1014 + .get_i2s_mclk = get_pcm1796_i2s_mclk, 1015 + .set_dac_params = set_hdav_params, 1016 + .set_adc_params = xonar_set_cs53x1_params, 1017 + .update_dac_volume = update_pcm1796_volume, 1018 + .update_dac_mute = update_pcm1796_mute, 1019 + .uart_input = xonar_hdmi_uart_input, 1020 + .ac97_switch = xonar_line_mic_ac97_switch, 1021 + .dac_tlv = pcm1796_db_scale, 1022 + .model_data_size = sizeof(struct xonar_hdav), 1023 + .device_config = PLAYBACK_0_TO_I2S | 1024 + PLAYBACK_1_TO_SPDIF | 1025 + CAPTURE_0_FROM_I2S_2 | 1026 + CAPTURE_1_FROM_SPDIF, 1027 + .dac_channels = 8, 1028 + .dac_volume_min = 255 - 2*60, 1029 + .dac_volume_max = 255, 1030 + .misc_flags = OXYGEN_MISC_MIDI, 1031 + .function_flags = OXYGEN_FUNCTION_2WIRE, 1032 + .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, 1033 + .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, 1034 + }; 1035 + 1036 + static const struct oxygen_model model_xonar_st = { 1037 + .longname = "Asus Virtuoso 100", 1038 + .chip = "AV200", 1039 + .init = xonar_st_init, 1040 + .control_filter = xonar_st_control_filter, 1041 + .mixer_init = xonar_st_mixer_init, 1042 + .cleanup = xonar_st_cleanup, 1043 + .suspend = xonar_st_suspend, 1044 + .resume = xonar_st_resume, 1045 + .get_i2s_mclk = get_pcm1796_i2s_mclk, 1046 + .set_dac_params = set_st_params, 1047 + .set_adc_params = xonar_set_cs53x1_params, 1048 + .update_dac_volume = update_pcm1796_volume, 1049 + .update_dac_mute = update_pcm1796_mute, 1050 + .ac97_switch = xonar_line_mic_ac97_switch, 1051 + .dac_tlv = pcm1796_db_scale, 1052 + .model_data_size = sizeof(struct xonar_pcm179x), 1053 + .device_config = PLAYBACK_0_TO_I2S | 1054 + PLAYBACK_1_TO_SPDIF | 1055 + CAPTURE_0_FROM_I2S_2, 1056 + .dac_channels = 2, 1057 + .dac_volume_min = 255 - 2*60, 1058 + .dac_volume_max = 255, 1059 + .function_flags = OXYGEN_FUNCTION_2WIRE, 1060 + .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, 1061 + .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, 1062 + }; 1063 + 1064 + int __devinit get_xonar_pcm179x_model(struct oxygen *chip, 1065 + const struct pci_device_id *id) 1066 + { 1067 + switch (id->subdevice) { 1068 + case 0x8269: 1069 + chip->model = model_xonar_d2; 1070 + chip->model.shortname = "Xonar D2"; 1071 + break; 1072 + case 0x82b7: 1073 + chip->model = model_xonar_d2; 1074 + chip->model.shortname = "Xonar D2X"; 1075 + chip->model.init = xonar_d2x_init; 1076 + break; 1077 + case 0x8314: 1078 + chip->model = model_xonar_hdav; 1079 + oxygen_clear_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_DB_MASK); 1080 + switch (oxygen_read16(chip, OXYGEN_GPIO_DATA) & GPIO_DB_MASK) { 1081 + default: 1082 + chip->model.shortname = "Xonar HDAV1.3"; 1083 + break; 1084 + case GPIO_DB_H6: 1085 + chip->model.shortname = "Xonar HDAV1.3+H6"; 1086 + chip->model.private_data = 1; 1087 + break; 1088 + } 1089 + break; 1090 + case 0x835d: 1091 + chip->model = model_xonar_st; 1092 + oxygen_clear_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_DB_MASK); 1093 + switch (oxygen_read16(chip, OXYGEN_GPIO_DATA) & GPIO_DB_MASK) { 1094 + default: 1095 + chip->model.shortname = "Xonar ST"; 1096 + break; 1097 + case GPIO_DB_H6: 1098 + chip->model.shortname = "Xonar ST+H6"; 1099 + chip->model.dac_channels = 8; 1100 + chip->model.private_data = 1; 1101 + break; 1102 + } 1103 + break; 1104 + case 0x835c: 1105 + chip->model = model_xonar_st; 1106 + chip->model.shortname = "Xonar STX"; 1107 + chip->model.init = xonar_stx_init; 1108 + chip->model.resume = xonar_stx_resume; 1109 + chip->model.set_dac_params = set_pcm1796_params; 1110 + break; 1111 + default: 1112 + return -EINVAL; 1113 + } 1114 + return 0; 1115 + }