blob: f81489a2b13450bd3b493f251b742a681f08d093 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 *
Takashi Iwaid01ce992007-07-27 16:52:19 +02003 * hda_intel.c - Implementation of primary alsa driver code base
4 * for Intel HD Audio.
Linus Torvalds1da177e2005-04-16 15:20:36 -07005 *
6 * Copyright(c) 2004 Intel Corporation. All rights reserved.
7 *
8 * Copyright (c) 2004 Takashi Iwai <tiwai@suse.de>
9 * PeiSen Hou <pshou@realtek.com.tw>
10 *
11 * This program is free software; you can redistribute it and/or modify it
12 * under the terms of the GNU General Public License as published by the Free
13 * Software Foundation; either version 2 of the License, or (at your option)
14 * any later version.
15 *
16 * This program is distributed in the hope that it will be useful, but WITHOUT
17 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
19 * more details.
20 *
21 * You should have received a copy of the GNU General Public License along with
22 * this program; if not, write to the Free Software Foundation, Inc., 59
23 * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24 *
25 * CONTACTS:
26 *
27 * Matt Jared matt.jared@intel.com
28 * Andy Kopp andy.kopp@intel.com
29 * Dan Kogan dan.d.kogan@intel.com
30 *
31 * CHANGES:
32 *
33 * 2004.12.01 Major rewrite by tiwai, merged the work of pshou
34 *
35 */
36
Linus Torvalds1da177e2005-04-16 15:20:36 -070037#include <linux/delay.h>
38#include <linux/interrupt.h>
Randy Dunlap362775e2005-11-07 14:43:23 +010039#include <linux/kernel.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070040#include <linux/module.h>
Andrew Morton24982c52008-03-04 10:08:58 +010041#include <linux/dma-mapping.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070042#include <linux/moduleparam.h>
43#include <linux/init.h>
44#include <linux/slab.h>
45#include <linux/pci.h>
Ingo Molnar62932df2006-01-16 16:34:20 +010046#include <linux/mutex.h>
Takashi Iwai0cbf0092008-10-29 16:18:25 +010047#include <linux/reboot.h>
Takashi Iwai27fe48d92011-09-28 17:16:09 +020048#include <linux/io.h>
49#ifdef CONFIG_X86
50/* for snoop control */
51#include <asm/pgtable.h>
52#include <asm/cacheflush.h>
53#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070054#include <sound/core.h>
55#include <sound/initval.h>
Takashi Iwai91219472012-04-26 12:13:25 +020056#include <linux/vgaarb.h>
Takashi Iwaia82d51e2012-04-26 12:23:42 +020057#include <linux/vga_switcheroo.h>
Takashi Iwai4918cda2012-08-09 12:33:28 +020058#include <linux/firmware.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070059#include "hda_codec.h"
60
61
Takashi Iwai5aba4f82008-01-07 15:16:37 +010062static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
63static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
Rusty Russella67ff6a2011-12-15 13:49:36 +103064static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
Takashi Iwai5aba4f82008-01-07 15:16:37 +010065static char *model[SNDRV_CARDS];
66static int position_fix[SNDRV_CARDS];
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +020067static int bdl_pos_adj[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = -1};
Takashi Iwai5aba4f82008-01-07 15:16:37 +010068static int probe_mask[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = -1};
Takashi Iwaid4d9cd032008-12-19 15:19:11 +010069static int probe_only[SNDRV_CARDS];
Rusty Russella67ff6a2011-12-15 13:49:36 +103070static bool single_cmd;
Takashi Iwai716238552009-09-28 13:14:04 +020071static int enable_msi = -1;
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +020072#ifdef CONFIG_SND_HDA_PATCH_LOADER
73static char *patch[SNDRV_CARDS];
74#endif
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +010075#ifdef CONFIG_SND_HDA_INPUT_BEEP
Takashi Iwai0920c9b2012-07-03 16:58:48 +020076static bool beep_mode[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] =
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +010077 CONFIG_SND_HDA_INPUT_BEEP_MODE};
78#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070079
Takashi Iwai5aba4f82008-01-07 15:16:37 +010080module_param_array(index, int, NULL, 0444);
Linus Torvalds1da177e2005-04-16 15:20:36 -070081MODULE_PARM_DESC(index, "Index value for Intel HD audio interface.");
Takashi Iwai5aba4f82008-01-07 15:16:37 +010082module_param_array(id, charp, NULL, 0444);
Linus Torvalds1da177e2005-04-16 15:20:36 -070083MODULE_PARM_DESC(id, "ID string for Intel HD audio interface.");
Takashi Iwai5aba4f82008-01-07 15:16:37 +010084module_param_array(enable, bool, NULL, 0444);
85MODULE_PARM_DESC(enable, "Enable Intel HD audio interface.");
86module_param_array(model, charp, NULL, 0444);
Linus Torvalds1da177e2005-04-16 15:20:36 -070087MODULE_PARM_DESC(model, "Use the given board model.");
Takashi Iwai5aba4f82008-01-07 15:16:37 +010088module_param_array(position_fix, int, NULL, 0444);
David Henningsson4cb36312010-09-30 10:12:50 +020089MODULE_PARM_DESC(position_fix, "DMA pointer read method."
Takashi Iwaia6f2fd52012-02-28 11:58:40 +010090 "(0 = auto, 1 = LPIB, 2 = POSBUF, 3 = VIACOMBO, 4 = COMBO).");
Takashi Iwai555e2192008-06-10 17:53:34 +020091module_param_array(bdl_pos_adj, int, NULL, 0644);
92MODULE_PARM_DESC(bdl_pos_adj, "BDL position adjustment offset.");
Takashi Iwai5aba4f82008-01-07 15:16:37 +010093module_param_array(probe_mask, int, NULL, 0444);
Takashi Iwai606ad752005-11-24 16:03:40 +010094MODULE_PARM_DESC(probe_mask, "Bitmask to probe codecs (default = -1).");
Jaroslav Kysela079e6832010-03-26 11:16:59 +010095module_param_array(probe_only, int, NULL, 0444);
Takashi Iwaid4d9cd032008-12-19 15:19:11 +010096MODULE_PARM_DESC(probe_only, "Only probing and no codec initialization.");
Takashi Iwai27346162006-01-12 18:28:44 +010097module_param(single_cmd, bool, 0444);
Takashi Iwaid01ce992007-07-27 16:52:19 +020098MODULE_PARM_DESC(single_cmd, "Use single command to communicate with codecs "
99 "(for debugging only).");
Takashi Iwaiac9ef6c2012-01-20 12:08:44 +0100100module_param(enable_msi, bint, 0444);
Takashi Iwai134a11f2006-11-10 12:08:37 +0100101MODULE_PARM_DESC(enable_msi, "Enable Message Signaled Interrupt (MSI)");
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +0200102#ifdef CONFIG_SND_HDA_PATCH_LOADER
103module_param_array(patch, charp, NULL, 0444);
104MODULE_PARM_DESC(patch, "Patch file for Intel HD audio interface.");
105#endif
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +0100106#ifdef CONFIG_SND_HDA_INPUT_BEEP
Takashi Iwai0920c9b2012-07-03 16:58:48 +0200107module_param_array(beep_mode, bool, NULL, 0444);
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +0100108MODULE_PARM_DESC(beep_mode, "Select HDA Beep registration mode "
Takashi Iwai0920c9b2012-07-03 16:58:48 +0200109 "(0=off, 1=on) (default=1).");
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +0100110#endif
Takashi Iwai606ad752005-11-24 16:03:40 +0100111
Takashi Iwaidee1b662007-08-13 16:10:30 +0200112#ifdef CONFIG_SND_HDA_POWER_SAVE
Takashi Iwai65fcd412012-08-14 17:13:32 +0200113static int param_set_xint(const char *val, const struct kernel_param *kp);
114static struct kernel_param_ops param_ops_xint = {
115 .set = param_set_xint,
116 .get = param_get_int,
117};
118#define param_check_xint param_check_int
119
Takashi Iwaifee2fba2008-11-27 12:43:28 +0100120static int power_save = CONFIG_SND_HDA_POWER_SAVE_DEFAULT;
Takashi Iwai65fcd412012-08-14 17:13:32 +0200121module_param(power_save, xint, 0644);
Takashi Iwaifee2fba2008-11-27 12:43:28 +0100122MODULE_PARM_DESC(power_save, "Automatic power-saving timeout "
123 "(in second, 0 = disable).");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700124
Takashi Iwaidee1b662007-08-13 16:10:30 +0200125/* reset the HD-audio controller in power save mode.
126 * this may give more power-saving, but will take longer time to
127 * wake up.
128 */
Rusty Russella67ff6a2011-12-15 13:49:36 +1030129static bool power_save_controller = 1;
Takashi Iwaidee1b662007-08-13 16:10:30 +0200130module_param(power_save_controller, bool, 0644);
131MODULE_PARM_DESC(power_save_controller, "Reset controller in power save mode.");
132#endif
133
Takashi Iwai7bfe0592012-01-23 17:53:39 +0100134static int align_buffer_size = -1;
135module_param(align_buffer_size, bint, 0644);
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -0500136MODULE_PARM_DESC(align_buffer_size,
137 "Force buffer and period sizes to be multiple of 128 bytes.");
138
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200139#ifdef CONFIG_X86
140static bool hda_snoop = true;
141module_param_named(snoop, hda_snoop, bool, 0444);
142MODULE_PARM_DESC(snoop, "Enable/disable snooping");
143#define azx_snoop(chip) (chip)->snoop
144#else
145#define hda_snoop true
146#define azx_snoop(chip) true
147#endif
148
149
Linus Torvalds1da177e2005-04-16 15:20:36 -0700150MODULE_LICENSE("GPL");
151MODULE_SUPPORTED_DEVICE("{{Intel, ICH6},"
152 "{Intel, ICH6M},"
Jason Gaston2f1b3812005-05-01 08:58:50 -0700153 "{Intel, ICH7},"
Frederick Lif5d40b32005-05-12 14:55:20 +0200154 "{Intel, ESB2},"
Jason Gastond2981392006-01-10 11:07:37 +0100155 "{Intel, ICH8},"
Jason Gastonf9cc8a82006-11-22 11:53:52 +0100156 "{Intel, ICH9},"
Jason Gastonc34f5a02008-01-29 12:38:49 +0100157 "{Intel, ICH10},"
Seth Heasleyb29c2362008-08-08 15:56:39 -0700158 "{Intel, PCH},"
Seth Heasleyd2f2fcd2010-01-12 17:03:35 -0800159 "{Intel, CPT},"
Seth Heasleyd2edeb72011-04-20 10:59:57 -0700160 "{Intel, PPT},"
Seth Heasley8bc039a2012-01-23 16:24:31 -0800161 "{Intel, LPT},"
Wang Xingchaoe926f2c2012-06-13 10:23:51 +0800162 "{Intel, HPT},"
Seth Heasleycea310e2010-09-10 16:29:56 -0700163 "{Intel, PBG},"
Tobin Davis4979bca2008-01-30 08:13:55 +0100164 "{Intel, SCH},"
Takashi Iwaifc20a562005-05-12 15:00:41 +0200165 "{ATI, SB450},"
Felix Kuehling89be83f2006-03-31 12:33:59 +0200166 "{ATI, SB600},"
Felix Kuehling778b6e12006-05-17 11:22:21 +0200167 "{ATI, RS600},"
Felix Kuehling5b15c952006-10-16 12:49:47 +0200168 "{ATI, RS690},"
Wolke Liue6db1112007-04-27 12:20:57 +0200169 "{ATI, RS780},"
170 "{ATI, R600},"
Herton Ronaldo Krzesinski2797f722007-11-05 18:21:56 +0100171 "{ATI, RV630},"
172 "{ATI, RV610},"
Wolke Liu27da1832007-11-16 11:06:30 +0100173 "{ATI, RV670},"
174 "{ATI, RV635},"
175 "{ATI, RV620},"
176 "{ATI, RV770},"
Takashi Iwaifc20a562005-05-12 15:00:41 +0200177 "{VIA, VT8251},"
Takashi Iwai47672312005-08-12 16:44:04 +0200178 "{VIA, VT8237A},"
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200179 "{SiS, SIS966},"
180 "{ULI, M5461}}");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700181MODULE_DESCRIPTION("Intel HDA driver");
182
Takashi Iwai4abc1cc2009-05-19 12:16:46 +0200183#ifdef CONFIG_SND_VERBOSE_PRINTK
184#define SFX /* nop */
185#else
Linus Torvalds1da177e2005-04-16 15:20:36 -0700186#define SFX "hda-intel: "
Takashi Iwai4abc1cc2009-05-19 12:16:46 +0200187#endif
Takashi Iwaicb53c622007-08-10 17:21:45 +0200188
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200189#if defined(CONFIG_PM) && defined(CONFIG_VGA_SWITCHEROO)
190#ifdef CONFIG_SND_HDA_CODEC_HDMI
191#define SUPPORT_VGA_SWITCHEROO
192#endif
193#endif
194
195
Takashi Iwaicb53c622007-08-10 17:21:45 +0200196/*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700197 * registers
198 */
199#define ICH6_REG_GCAP 0x00
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200200#define ICH6_GCAP_64OK (1 << 0) /* 64bit address support */
201#define ICH6_GCAP_NSDO (3 << 1) /* # of serial data out signals */
202#define ICH6_GCAP_BSS (31 << 3) /* # of bidirectional streams */
203#define ICH6_GCAP_ISS (15 << 8) /* # of input streams */
204#define ICH6_GCAP_OSS (15 << 12) /* # of output streams */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700205#define ICH6_REG_VMIN 0x02
206#define ICH6_REG_VMAJ 0x03
207#define ICH6_REG_OUTPAY 0x04
208#define ICH6_REG_INPAY 0x06
209#define ICH6_REG_GCTL 0x08
Takashi Iwai8a933ec2009-05-31 09:28:12 +0200210#define ICH6_GCTL_RESET (1 << 0) /* controller reset */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200211#define ICH6_GCTL_FCNTRL (1 << 1) /* flush control */
212#define ICH6_GCTL_UNSOL (1 << 8) /* accept unsol. response enable */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700213#define ICH6_REG_WAKEEN 0x0c
214#define ICH6_REG_STATESTS 0x0e
215#define ICH6_REG_GSTS 0x10
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200216#define ICH6_GSTS_FSTS (1 << 1) /* flush status */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700217#define ICH6_REG_INTCTL 0x20
218#define ICH6_REG_INTSTS 0x24
Jaroslav Kyselae5463722010-05-11 10:21:46 +0200219#define ICH6_REG_WALLCLK 0x30 /* 24Mhz source */
Takashi Iwai8b0bd222011-06-10 14:56:26 +0200220#define ICH6_REG_OLD_SSYNC 0x34 /* SSYNC for old ICH */
221#define ICH6_REG_SSYNC 0x38
Linus Torvalds1da177e2005-04-16 15:20:36 -0700222#define ICH6_REG_CORBLBASE 0x40
223#define ICH6_REG_CORBUBASE 0x44
224#define ICH6_REG_CORBWP 0x48
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200225#define ICH6_REG_CORBRP 0x4a
226#define ICH6_CORBRP_RST (1 << 15) /* read pointer reset */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700227#define ICH6_REG_CORBCTL 0x4c
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200228#define ICH6_CORBCTL_RUN (1 << 1) /* enable DMA */
229#define ICH6_CORBCTL_CMEIE (1 << 0) /* enable memory error irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700230#define ICH6_REG_CORBSTS 0x4d
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200231#define ICH6_CORBSTS_CMEI (1 << 0) /* memory error indication */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700232#define ICH6_REG_CORBSIZE 0x4e
233
234#define ICH6_REG_RIRBLBASE 0x50
235#define ICH6_REG_RIRBUBASE 0x54
236#define ICH6_REG_RIRBWP 0x58
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200237#define ICH6_RIRBWP_RST (1 << 15) /* write pointer reset */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700238#define ICH6_REG_RINTCNT 0x5a
239#define ICH6_REG_RIRBCTL 0x5c
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200240#define ICH6_RBCTL_IRQ_EN (1 << 0) /* enable IRQ */
241#define ICH6_RBCTL_DMA_EN (1 << 1) /* enable DMA */
242#define ICH6_RBCTL_OVERRUN_EN (1 << 2) /* enable overrun irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700243#define ICH6_REG_RIRBSTS 0x5d
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200244#define ICH6_RBSTS_IRQ (1 << 0) /* response irq */
245#define ICH6_RBSTS_OVERRUN (1 << 2) /* overrun irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700246#define ICH6_REG_RIRBSIZE 0x5e
247
248#define ICH6_REG_IC 0x60
249#define ICH6_REG_IR 0x64
250#define ICH6_REG_IRS 0x68
251#define ICH6_IRS_VALID (1<<1)
252#define ICH6_IRS_BUSY (1<<0)
253
254#define ICH6_REG_DPLBASE 0x70
255#define ICH6_REG_DPUBASE 0x74
256#define ICH6_DPLBASE_ENABLE 0x1 /* Enable position buffer */
257
258/* SD offset: SDI0=0x80, SDI1=0xa0, ... SDO3=0x160 */
259enum { SDI0, SDI1, SDI2, SDI3, SDO0, SDO1, SDO2, SDO3 };
260
261/* stream register offsets from stream base */
262#define ICH6_REG_SD_CTL 0x00
263#define ICH6_REG_SD_STS 0x03
264#define ICH6_REG_SD_LPIB 0x04
265#define ICH6_REG_SD_CBL 0x08
266#define ICH6_REG_SD_LVI 0x0c
267#define ICH6_REG_SD_FIFOW 0x0e
268#define ICH6_REG_SD_FIFOSIZE 0x10
269#define ICH6_REG_SD_FORMAT 0x12
270#define ICH6_REG_SD_BDLPL 0x18
271#define ICH6_REG_SD_BDLPU 0x1c
272
273/* PCI space */
274#define ICH6_PCIREG_TCSEL 0x44
275
276/*
277 * other constants
278 */
279
280/* max number of SDs */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200281/* ICH, ATI and VIA have 4 playback and 4 capture */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200282#define ICH6_NUM_CAPTURE 4
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200283#define ICH6_NUM_PLAYBACK 4
284
285/* ULI has 6 playback and 5 capture */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200286#define ULI_NUM_CAPTURE 5
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200287#define ULI_NUM_PLAYBACK 6
288
Felix Kuehling778b6e12006-05-17 11:22:21 +0200289/* ATI HDMI has 1 playback and 0 capture */
Felix Kuehling778b6e12006-05-17 11:22:21 +0200290#define ATIHDMI_NUM_CAPTURE 0
Felix Kuehling778b6e12006-05-17 11:22:21 +0200291#define ATIHDMI_NUM_PLAYBACK 1
292
Kailang Yangf2690022008-05-27 11:44:55 +0200293/* TERA has 4 playback and 3 capture */
294#define TERA_NUM_CAPTURE 3
295#define TERA_NUM_PLAYBACK 4
296
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200297/* this number is statically defined for simplicity */
298#define MAX_AZX_DEV 16
299
Linus Torvalds1da177e2005-04-16 15:20:36 -0700300/* max number of fragments - we may use more if allocating more pages for BDL */
Takashi Iwai4ce107b2008-02-06 14:50:19 +0100301#define BDL_SIZE 4096
302#define AZX_MAX_BDL_ENTRIES (BDL_SIZE / 16)
303#define AZX_MAX_FRAG 32
Linus Torvalds1da177e2005-04-16 15:20:36 -0700304/* max buffer size - no h/w limit, you can increase as you like */
305#define AZX_MAX_BUF_SIZE (1024*1024*1024)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700306
307/* RIRB int mask: overrun[2], response[0] */
308#define RIRB_INT_RESPONSE 0x01
309#define RIRB_INT_OVERRUN 0x04
310#define RIRB_INT_MASK 0x05
311
Takashi Iwai2f5983f2008-09-03 16:00:44 +0200312/* STATESTS int mask: S3,SD2,SD1,SD0 */
Wei Ni7445dfc2010-03-03 15:05:53 +0800313#define AZX_MAX_CODECS 8
314#define AZX_DEFAULT_CODECS 4
Wu Fengguangdeadff12009-08-01 18:45:16 +0800315#define STATESTS_INT_MASK ((1 << AZX_MAX_CODECS) - 1)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700316
317/* SD_CTL bits */
318#define SD_CTL_STREAM_RESET 0x01 /* stream reset bit */
319#define SD_CTL_DMA_START 0x02 /* stream DMA start bit */
Takashi Iwai850f0e52008-03-18 17:11:05 +0100320#define SD_CTL_STRIPE (3 << 16) /* stripe control */
321#define SD_CTL_TRAFFIC_PRIO (1 << 18) /* traffic priority */
322#define SD_CTL_DIR (1 << 19) /* bi-directional stream */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700323#define SD_CTL_STREAM_TAG_MASK (0xf << 20)
324#define SD_CTL_STREAM_TAG_SHIFT 20
325
326/* SD_CTL and SD_STS */
327#define SD_INT_DESC_ERR 0x10 /* descriptor error interrupt */
328#define SD_INT_FIFO_ERR 0x08 /* FIFO error interrupt */
329#define SD_INT_COMPLETE 0x04 /* completion interrupt */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200330#define SD_INT_MASK (SD_INT_DESC_ERR|SD_INT_FIFO_ERR|\
331 SD_INT_COMPLETE)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700332
333/* SD_STS */
334#define SD_STS_FIFO_READY 0x20 /* FIFO ready */
335
336/* INTCTL and INTSTS */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200337#define ICH6_INT_ALL_STREAM 0xff /* all stream interrupts */
338#define ICH6_INT_CTRL_EN 0x40000000 /* controller interrupt enable bit */
339#define ICH6_INT_GLOBAL_EN 0x80000000 /* global interrupt enable bit */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700340
Linus Torvalds1da177e2005-04-16 15:20:36 -0700341/* below are so far hardcoded - should read registers in future */
342#define ICH6_MAX_CORB_ENTRIES 256
343#define ICH6_MAX_RIRB_ENTRIES 256
344
Takashi Iwaic74db862005-05-12 14:26:27 +0200345/* position fix mode */
346enum {
Takashi Iwai0be3b5d2005-09-05 17:11:40 +0200347 POS_FIX_AUTO,
Takashi Iwaid2e1c972008-06-10 17:53:34 +0200348 POS_FIX_LPIB,
Takashi Iwai0be3b5d2005-09-05 17:11:40 +0200349 POS_FIX_POSBUF,
David Henningsson4cb36312010-09-30 10:12:50 +0200350 POS_FIX_VIACOMBO,
Takashi Iwaia6f2fd52012-02-28 11:58:40 +0100351 POS_FIX_COMBO,
Takashi Iwaic74db862005-05-12 14:26:27 +0200352};
Linus Torvalds1da177e2005-04-16 15:20:36 -0700353
Frederick Lif5d40b32005-05-12 14:55:20 +0200354/* Defines for ATI HD Audio support in SB450 south bridge */
Frederick Lif5d40b32005-05-12 14:55:20 +0200355#define ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR 0x42
356#define ATI_SB450_HDAUDIO_ENABLE_SNOOP 0x02
357
Vinod Gda3fca22005-09-13 18:49:12 +0200358/* Defines for Nvidia HDA support */
359#define NVIDIA_HDA_TRANSREG_ADDR 0x4e
360#define NVIDIA_HDA_ENABLE_COHBITS 0x0f
Peer Chen320dcc32008-08-20 16:43:24 -0700361#define NVIDIA_HDA_ISTRM_COH 0x4d
362#define NVIDIA_HDA_OSTRM_COH 0x4c
363#define NVIDIA_HDA_ENABLE_COHBIT 0x01
Frederick Lif5d40b32005-05-12 14:55:20 +0200364
Takashi Iwai90a5ad52008-02-22 18:36:22 +0100365/* Defines for Intel SCH HDA snoop control */
366#define INTEL_SCH_HDA_DEVC 0x78
367#define INTEL_SCH_HDA_DEVC_NOSNOOP (0x1<<11)
368
Joseph Chan0e153472008-08-26 14:38:03 +0200369/* Define IN stream 0 FIFO size offset in VIA controller */
370#define VIA_IN_STREAM0_FIFO_SIZE_OFFSET 0x90
371/* Define VIA HD Audio Device ID*/
372#define VIA_HDAC_DEVICE_ID 0x3288
373
Yang, Libinc4da29c2008-11-13 11:07:07 +0100374/* HD Audio class code */
375#define PCI_CLASS_MULTIMEDIA_HD_AUDIO 0x0403
Takashi Iwai90a5ad52008-02-22 18:36:22 +0100376
Linus Torvalds1da177e2005-04-16 15:20:36 -0700377/*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700378 */
379
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100380struct azx_dev {
Takashi Iwai4ce107b2008-02-06 14:50:19 +0100381 struct snd_dma_buffer bdl; /* BDL buffer */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200382 u32 *posbuf; /* position buffer pointer */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700383
Takashi Iwaid01ce992007-07-27 16:52:19 +0200384 unsigned int bufsize; /* size of the play buffer in bytes */
Takashi Iwai9ad593f2008-05-16 12:34:47 +0200385 unsigned int period_bytes; /* size of the period in bytes */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200386 unsigned int frags; /* number for period in the play buffer */
387 unsigned int fifo_size; /* FIFO size */
Jaroslav Kyselae5463722010-05-11 10:21:46 +0200388 unsigned long start_wallclk; /* start + minimum wallclk */
389 unsigned long period_wallclk; /* wallclk for period */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700390
Takashi Iwaid01ce992007-07-27 16:52:19 +0200391 void __iomem *sd_addr; /* stream descriptor pointer */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700392
Takashi Iwaid01ce992007-07-27 16:52:19 +0200393 u32 sd_int_sta_mask; /* stream int status mask */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700394
395 /* pcm support */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200396 struct snd_pcm_substream *substream; /* assigned substream,
397 * set in PCM open
398 */
399 unsigned int format_val; /* format value to be set in the
400 * controller and the codec
401 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700402 unsigned char stream_tag; /* assigned stream */
403 unsigned char index; /* stream index */
Takashi Iwaid5cf9912011-10-06 10:07:58 +0200404 int assigned_key; /* last device# key assigned to */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700405
Pavel Machek927fc862006-08-31 17:03:43 +0200406 unsigned int opened :1;
407 unsigned int running :1;
Takashi Iwai675f25d2008-06-10 17:53:20 +0200408 unsigned int irq_pending :1;
Joseph Chan0e153472008-08-26 14:38:03 +0200409 /*
410 * For VIA:
411 * A flag to ensure DMA position is 0
412 * when link position is not greater than FIFO size
413 */
414 unsigned int insufficient :1;
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200415 unsigned int wc_marked:1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700416};
417
418/* CORB/RIRB */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100419struct azx_rb {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700420 u32 *buf; /* CORB/RIRB buffer
421 * Each CORB entry is 4byte, RIRB is 8byte
422 */
423 dma_addr_t addr; /* physical address of CORB/RIRB buffer */
424 /* for RIRB */
425 unsigned short rp, wp; /* read/write pointers */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800426 int cmds[AZX_MAX_CODECS]; /* number of pending requests */
427 u32 res[AZX_MAX_CODECS]; /* last read value */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700428};
429
Takashi Iwai01b65bf2011-11-24 14:31:46 +0100430struct azx_pcm {
431 struct azx *chip;
432 struct snd_pcm *pcm;
433 struct hda_codec *codec;
434 struct hda_pcm_stream *hinfo[2];
435 struct list_head list;
436};
437
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100438struct azx {
439 struct snd_card *card;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700440 struct pci_dev *pci;
Takashi Iwai555e2192008-06-10 17:53:34 +0200441 int dev_index;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700442
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200443 /* chip type specific */
444 int driver_type;
Takashi Iwai9477c582011-05-25 09:11:37 +0200445 unsigned int driver_caps;
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200446 int playback_streams;
447 int playback_index_offset;
448 int capture_streams;
449 int capture_index_offset;
450 int num_streams;
451
Linus Torvalds1da177e2005-04-16 15:20:36 -0700452 /* pci resources */
453 unsigned long addr;
454 void __iomem *remap_addr;
455 int irq;
456
457 /* locks */
458 spinlock_t reg_lock;
Ingo Molnar62932df2006-01-16 16:34:20 +0100459 struct mutex open_mutex;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700460
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200461 /* streams (x num_streams) */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100462 struct azx_dev *azx_dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700463
464 /* PCM */
Takashi Iwai01b65bf2011-11-24 14:31:46 +0100465 struct list_head pcm_list; /* azx_pcm list */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700466
467 /* HD codec */
468 unsigned short codec_mask;
Takashi Iwaif1eaaee2009-02-13 08:16:55 +0100469 int codec_probe_mask; /* copied from probe_mask option */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700470 struct hda_bus *bus;
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +0100471 unsigned int beep_mode;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700472
473 /* CORB/RIRB */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100474 struct azx_rb corb;
475 struct azx_rb rirb;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700476
Takashi Iwai4ce107b2008-02-06 14:50:19 +0100477 /* CORB/RIRB and position buffers */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700478 struct snd_dma_buffer rb;
479 struct snd_dma_buffer posbuf;
Takashi Iwaic74db862005-05-12 14:26:27 +0200480
Takashi Iwai4918cda2012-08-09 12:33:28 +0200481#ifdef CONFIG_SND_HDA_PATCH_LOADER
482 const struct firmware *fw;
483#endif
484
Takashi Iwaic74db862005-05-12 14:26:27 +0200485 /* flags */
Shahin Ghazinouribeaffc32010-05-11 08:19:55 +0200486 int position_fix[2]; /* for both playback/capture streams */
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200487 int poll_count;
Takashi Iwaicb53c622007-08-10 17:21:45 +0200488 unsigned int running :1;
Pavel Machek927fc862006-08-31 17:03:43 +0200489 unsigned int initialized :1;
490 unsigned int single_cmd :1;
491 unsigned int polling_mode :1;
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200492 unsigned int msi :1;
Takashi Iwaia6a950a2008-06-10 17:53:35 +0200493 unsigned int irq_pending_warned :1;
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +0100494 unsigned int probing :1; /* codec probing phase */
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200495 unsigned int snoop:1;
Takashi Iwai52409aa2012-01-23 17:10:24 +0100496 unsigned int align_buffer_size:1;
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200497 unsigned int region_requested:1;
498
499 /* VGA-switcheroo setup */
500 unsigned int use_vga_switcheroo:1;
501 unsigned int init_failed:1; /* delayed init failed */
502 unsigned int disabled:1; /* disabled by VGA-switcher */
Takashi Iwai43bbb6c2007-07-06 20:22:05 +0200503
504 /* for debugging */
Wu Fengguangfeb27342009-08-01 19:17:14 +0800505 unsigned int last_cmd[AZX_MAX_CODECS];
Takashi Iwai9ad593f2008-05-16 12:34:47 +0200506
507 /* for pending irqs */
508 struct work_struct irq_pending_work;
Takashi Iwai0cbf0092008-10-29 16:18:25 +0100509
510 /* reboot notifier (for mysterious hangup problem at power-down) */
511 struct notifier_block reboot_notifier;
Takashi Iwai65fcd412012-08-14 17:13:32 +0200512
513 /* card list (for power_save trigger) */
514 struct list_head list;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700515};
516
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200517/* driver types */
518enum {
519 AZX_DRIVER_ICH,
Seth Heasley32679f92010-02-22 17:31:09 -0800520 AZX_DRIVER_PCH,
Tobin Davis4979bca2008-01-30 08:13:55 +0100521 AZX_DRIVER_SCH,
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200522 AZX_DRIVER_ATI,
Felix Kuehling778b6e12006-05-17 11:22:21 +0200523 AZX_DRIVER_ATIHDMI,
Andiry Xu1815b342011-12-14 16:10:27 +0800524 AZX_DRIVER_ATIHDMI_NS,
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200525 AZX_DRIVER_VIA,
526 AZX_DRIVER_SIS,
527 AZX_DRIVER_ULI,
Vinod Gda3fca22005-09-13 18:49:12 +0200528 AZX_DRIVER_NVIDIA,
Kailang Yangf2690022008-05-27 11:44:55 +0200529 AZX_DRIVER_TERA,
Takashi Iwai14d34f12010-10-21 09:03:25 +0200530 AZX_DRIVER_CTX,
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200531 AZX_DRIVER_CTHDA,
Yang, Libinc4da29c2008-11-13 11:07:07 +0100532 AZX_DRIVER_GENERIC,
Takashi Iwai2f5983f2008-09-03 16:00:44 +0200533 AZX_NUM_DRIVERS, /* keep this as last entry */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200534};
535
Takashi Iwai9477c582011-05-25 09:11:37 +0200536/* driver quirks (capabilities) */
537/* bits 0-7 are used for indicating driver type */
538#define AZX_DCAPS_NO_TCSEL (1 << 8) /* No Intel TCSEL bit */
539#define AZX_DCAPS_NO_MSI (1 << 9) /* No MSI support */
540#define AZX_DCAPS_ATI_SNOOP (1 << 10) /* ATI snoop enable */
541#define AZX_DCAPS_NVIDIA_SNOOP (1 << 11) /* Nvidia snoop enable */
542#define AZX_DCAPS_SCH_SNOOP (1 << 12) /* SCH/PCH snoop enable */
543#define AZX_DCAPS_RIRB_DELAY (1 << 13) /* Long delay in read loop */
544#define AZX_DCAPS_RIRB_PRE_DELAY (1 << 14) /* Put a delay before read */
545#define AZX_DCAPS_CTX_WORKAROUND (1 << 15) /* X-Fi workaround */
546#define AZX_DCAPS_POSFIX_LPIB (1 << 16) /* Use LPIB as default */
547#define AZX_DCAPS_POSFIX_VIA (1 << 17) /* Use VIACOMBO as default */
548#define AZX_DCAPS_NO_64BIT (1 << 18) /* No 64bit address */
549#define AZX_DCAPS_SYNC_WRITE (1 << 19) /* sync each cmd write */
Takashi Iwai8b0bd222011-06-10 14:56:26 +0200550#define AZX_DCAPS_OLD_SSYNC (1 << 20) /* Old SSYNC reg for ICH */
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -0500551#define AZX_DCAPS_BUFSIZE (1 << 21) /* no buffer size alignment */
Takashi Iwai7bfe0592012-01-23 17:53:39 +0100552#define AZX_DCAPS_ALIGN_BUFSIZE (1 << 22) /* buffer size alignment */
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200553#define AZX_DCAPS_4K_BDLE_BOUNDARY (1 << 23) /* BDLE in 4k boundary */
Seth Heasleyc20c5a82012-06-14 14:23:53 -0700554#define AZX_DCAPS_POSFIX_COMBO (1 << 24) /* Use COMBO as default */
Takashi Iwai9477c582011-05-25 09:11:37 +0200555
556/* quirks for ATI SB / AMD Hudson */
557#define AZX_DCAPS_PRESET_ATI_SB \
558 (AZX_DCAPS_ATI_SNOOP | AZX_DCAPS_NO_TCSEL | \
559 AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB)
560
561/* quirks for ATI/AMD HDMI */
562#define AZX_DCAPS_PRESET_ATI_HDMI \
563 (AZX_DCAPS_NO_TCSEL | AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB)
564
565/* quirks for Nvidia */
566#define AZX_DCAPS_PRESET_NVIDIA \
Takashi Iwai7bfe0592012-01-23 17:53:39 +0100567 (AZX_DCAPS_NVIDIA_SNOOP | AZX_DCAPS_RIRB_DELAY | AZX_DCAPS_NO_MSI |\
568 AZX_DCAPS_ALIGN_BUFSIZE)
Takashi Iwai9477c582011-05-25 09:11:37 +0200569
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200570#define AZX_DCAPS_PRESET_CTHDA \
571 (AZX_DCAPS_NO_MSI | AZX_DCAPS_POSFIX_LPIB | AZX_DCAPS_4K_BDLE_BOUNDARY)
572
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200573/*
574 * VGA-switcher support
575 */
576#ifdef SUPPORT_VGA_SWITCHEROO
Takashi Iwai5cb543d2012-08-09 13:49:23 +0200577#define use_vga_switcheroo(chip) ((chip)->use_vga_switcheroo)
578#else
579#define use_vga_switcheroo(chip) 0
580#endif
581
582#if defined(SUPPORT_VGA_SWITCHEROO) || defined(CONFIG_SND_HDA_PATCH_LOADER)
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200583#define DELAYED_INIT_MARK
584#define DELAYED_INITDATA_MARK
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200585#else
586#define DELAYED_INIT_MARK __devinit
587#define DELAYED_INITDATA_MARK __devinitdata
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200588#endif
589
590static char *driver_short_names[] DELAYED_INITDATA_MARK = {
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200591 [AZX_DRIVER_ICH] = "HDA Intel",
Seth Heasley32679f92010-02-22 17:31:09 -0800592 [AZX_DRIVER_PCH] = "HDA Intel PCH",
Tobin Davis4979bca2008-01-30 08:13:55 +0100593 [AZX_DRIVER_SCH] = "HDA Intel MID",
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200594 [AZX_DRIVER_ATI] = "HDA ATI SB",
Felix Kuehling778b6e12006-05-17 11:22:21 +0200595 [AZX_DRIVER_ATIHDMI] = "HDA ATI HDMI",
Andiry Xu1815b342011-12-14 16:10:27 +0800596 [AZX_DRIVER_ATIHDMI_NS] = "HDA ATI HDMI",
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200597 [AZX_DRIVER_VIA] = "HDA VIA VT82xx",
598 [AZX_DRIVER_SIS] = "HDA SIS966",
Vinod Gda3fca22005-09-13 18:49:12 +0200599 [AZX_DRIVER_ULI] = "HDA ULI M5461",
600 [AZX_DRIVER_NVIDIA] = "HDA NVidia",
Kailang Yangf2690022008-05-27 11:44:55 +0200601 [AZX_DRIVER_TERA] = "HDA Teradici",
Takashi Iwai14d34f12010-10-21 09:03:25 +0200602 [AZX_DRIVER_CTX] = "HDA Creative",
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200603 [AZX_DRIVER_CTHDA] = "HDA Creative",
Yang, Libinc4da29c2008-11-13 11:07:07 +0100604 [AZX_DRIVER_GENERIC] = "HD-Audio Generic",
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200605};
606
Linus Torvalds1da177e2005-04-16 15:20:36 -0700607/*
608 * macros for easy use
609 */
610#define azx_writel(chip,reg,value) \
611 writel(value, (chip)->remap_addr + ICH6_REG_##reg)
612#define azx_readl(chip,reg) \
613 readl((chip)->remap_addr + ICH6_REG_##reg)
614#define azx_writew(chip,reg,value) \
615 writew(value, (chip)->remap_addr + ICH6_REG_##reg)
616#define azx_readw(chip,reg) \
617 readw((chip)->remap_addr + ICH6_REG_##reg)
618#define azx_writeb(chip,reg,value) \
619 writeb(value, (chip)->remap_addr + ICH6_REG_##reg)
620#define azx_readb(chip,reg) \
621 readb((chip)->remap_addr + ICH6_REG_##reg)
622
623#define azx_sd_writel(dev,reg,value) \
624 writel(value, (dev)->sd_addr + ICH6_REG_##reg)
625#define azx_sd_readl(dev,reg) \
626 readl((dev)->sd_addr + ICH6_REG_##reg)
627#define azx_sd_writew(dev,reg,value) \
628 writew(value, (dev)->sd_addr + ICH6_REG_##reg)
629#define azx_sd_readw(dev,reg) \
630 readw((dev)->sd_addr + ICH6_REG_##reg)
631#define azx_sd_writeb(dev,reg,value) \
632 writeb(value, (dev)->sd_addr + ICH6_REG_##reg)
633#define azx_sd_readb(dev,reg) \
634 readb((dev)->sd_addr + ICH6_REG_##reg)
635
636/* for pcm support */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100637#define get_azx_dev(substream) (substream->runtime->private_data)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700638
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200639#ifdef CONFIG_X86
640static void __mark_pages_wc(struct azx *chip, void *addr, size_t size, bool on)
641{
642 if (azx_snoop(chip))
643 return;
644 if (addr && size) {
645 int pages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
646 if (on)
647 set_memory_wc((unsigned long)addr, pages);
648 else
649 set_memory_wb((unsigned long)addr, pages);
650 }
651}
652
653static inline void mark_pages_wc(struct azx *chip, struct snd_dma_buffer *buf,
654 bool on)
655{
656 __mark_pages_wc(chip, buf->area, buf->bytes, on);
657}
658static inline void mark_runtime_wc(struct azx *chip, struct azx_dev *azx_dev,
659 struct snd_pcm_runtime *runtime, bool on)
660{
661 if (azx_dev->wc_marked != on) {
662 __mark_pages_wc(chip, runtime->dma_area, runtime->dma_bytes, on);
663 azx_dev->wc_marked = on;
664 }
665}
666#else
667/* NOP for other archs */
668static inline void mark_pages_wc(struct azx *chip, struct snd_dma_buffer *buf,
669 bool on)
670{
671}
672static inline void mark_runtime_wc(struct azx *chip, struct azx_dev *azx_dev,
673 struct snd_pcm_runtime *runtime, bool on)
674{
675}
676#endif
677
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200678static int azx_acquire_irq(struct azx *chip, int do_disconnect);
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200679static int azx_send_cmd(struct hda_bus *bus, unsigned int val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700680/*
681 * Interface for HD codec
682 */
683
Linus Torvalds1da177e2005-04-16 15:20:36 -0700684/*
685 * CORB / RIRB interface
686 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100687static int azx_alloc_cmd_io(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700688{
689 int err;
690
691 /* single page (at least 4096 bytes) must suffice for both ringbuffes */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200692 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
693 snd_dma_pci_data(chip->pci),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700694 PAGE_SIZE, &chip->rb);
695 if (err < 0) {
696 snd_printk(KERN_ERR SFX "cannot allocate CORB/RIRB\n");
697 return err;
698 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200699 mark_pages_wc(chip, &chip->rb, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700700 return 0;
701}
702
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100703static void azx_init_cmd_io(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700704{
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800705 spin_lock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700706 /* CORB set up */
707 chip->corb.addr = chip->rb.addr;
708 chip->corb.buf = (u32 *)chip->rb.area;
709 azx_writel(chip, CORBLBASE, (u32)chip->corb.addr);
Takashi Iwai766979e2008-06-13 20:53:56 +0200710 azx_writel(chip, CORBUBASE, upper_32_bits(chip->corb.addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700711
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200712 /* set the corb size to 256 entries (ULI requires explicitly) */
713 azx_writeb(chip, CORBSIZE, 0x02);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700714 /* set the corb write pointer to 0 */
715 azx_writew(chip, CORBWP, 0);
716 /* reset the corb hw read pointer */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200717 azx_writew(chip, CORBRP, ICH6_CORBRP_RST);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700718 /* enable corb dma */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200719 azx_writeb(chip, CORBCTL, ICH6_CORBCTL_RUN);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700720
721 /* RIRB set up */
722 chip->rirb.addr = chip->rb.addr + 2048;
723 chip->rirb.buf = (u32 *)(chip->rb.area + 2048);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800724 chip->rirb.wp = chip->rirb.rp = 0;
725 memset(chip->rirb.cmds, 0, sizeof(chip->rirb.cmds));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700726 azx_writel(chip, RIRBLBASE, (u32)chip->rirb.addr);
Takashi Iwai766979e2008-06-13 20:53:56 +0200727 azx_writel(chip, RIRBUBASE, upper_32_bits(chip->rirb.addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700728
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200729 /* set the rirb size to 256 entries (ULI requires explicitly) */
730 azx_writeb(chip, RIRBSIZE, 0x02);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700731 /* reset the rirb hw write pointer */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200732 azx_writew(chip, RIRBWP, ICH6_RIRBWP_RST);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700733 /* set N=1, get RIRB response interrupt for new entry */
Takashi Iwai9477c582011-05-25 09:11:37 +0200734 if (chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND)
Takashi Iwai14d34f12010-10-21 09:03:25 +0200735 azx_writew(chip, RINTCNT, 0xc0);
736 else
737 azx_writew(chip, RINTCNT, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700738 /* enable rirb dma and response irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700739 azx_writeb(chip, RIRBCTL, ICH6_RBCTL_DMA_EN | ICH6_RBCTL_IRQ_EN);
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800740 spin_unlock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700741}
742
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100743static void azx_free_cmd_io(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700744{
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800745 spin_lock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700746 /* disable ringbuffer DMAs */
747 azx_writeb(chip, RIRBCTL, 0);
748 azx_writeb(chip, CORBCTL, 0);
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800749 spin_unlock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700750}
751
Wu Fengguangdeadff12009-08-01 18:45:16 +0800752static unsigned int azx_command_addr(u32 cmd)
753{
754 unsigned int addr = cmd >> 28;
755
756 if (addr >= AZX_MAX_CODECS) {
757 snd_BUG();
758 addr = 0;
759 }
760
761 return addr;
762}
763
764static unsigned int azx_response_addr(u32 res)
765{
766 unsigned int addr = res & 0xf;
767
768 if (addr >= AZX_MAX_CODECS) {
769 snd_BUG();
770 addr = 0;
771 }
772
773 return addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700774}
775
776/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100777static int azx_corb_send_cmd(struct hda_bus *bus, u32 val)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700778{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100779 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800780 unsigned int addr = azx_command_addr(val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700781 unsigned int wp;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700782
Wu Fengguangc32649f2009-08-01 18:48:12 +0800783 spin_lock_irq(&chip->reg_lock);
784
Linus Torvalds1da177e2005-04-16 15:20:36 -0700785 /* add command to corb */
786 wp = azx_readb(chip, CORBWP);
787 wp++;
788 wp %= ICH6_MAX_CORB_ENTRIES;
789
Wu Fengguangdeadff12009-08-01 18:45:16 +0800790 chip->rirb.cmds[addr]++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700791 chip->corb.buf[wp] = cpu_to_le32(val);
792 azx_writel(chip, CORBWP, wp);
Wu Fengguangc32649f2009-08-01 18:48:12 +0800793
Linus Torvalds1da177e2005-04-16 15:20:36 -0700794 spin_unlock_irq(&chip->reg_lock);
795
796 return 0;
797}
798
799#define ICH6_RIRB_EX_UNSOL_EV (1<<4)
800
801/* retrieve RIRB entry - called from interrupt handler */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100802static void azx_update_rirb(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700803{
804 unsigned int rp, wp;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800805 unsigned int addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700806 u32 res, res_ex;
807
808 wp = azx_readb(chip, RIRBWP);
809 if (wp == chip->rirb.wp)
810 return;
811 chip->rirb.wp = wp;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800812
Linus Torvalds1da177e2005-04-16 15:20:36 -0700813 while (chip->rirb.rp != wp) {
814 chip->rirb.rp++;
815 chip->rirb.rp %= ICH6_MAX_RIRB_ENTRIES;
816
817 rp = chip->rirb.rp << 1; /* an RIRB entry is 8-bytes */
818 res_ex = le32_to_cpu(chip->rirb.buf[rp + 1]);
819 res = le32_to_cpu(chip->rirb.buf[rp]);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800820 addr = azx_response_addr(res_ex);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700821 if (res_ex & ICH6_RIRB_EX_UNSOL_EV)
822 snd_hda_queue_unsol_event(chip->bus, res, res_ex);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800823 else if (chip->rirb.cmds[addr]) {
824 chip->rirb.res[addr] = res;
Takashi Iwai2add9b92008-03-18 09:47:06 +0100825 smp_wmb();
Wu Fengguangdeadff12009-08-01 18:45:16 +0800826 chip->rirb.cmds[addr]--;
Wu Fengguange310bb02009-08-01 19:18:45 +0800827 } else
828 snd_printk(KERN_ERR SFX "spurious response %#x:%#x, "
829 "last cmd=%#08x\n",
830 res, res_ex,
831 chip->last_cmd[addr]);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700832 }
833}
834
835/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800836static unsigned int azx_rirb_get_response(struct hda_bus *bus,
837 unsigned int addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700838{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100839 struct azx *chip = bus->private_data;
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200840 unsigned long timeout;
David Henningsson32cf4022012-05-04 11:05:55 +0200841 unsigned long loopcounter;
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200842 int do_poll = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700843
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200844 again:
845 timeout = jiffies + msecs_to_jiffies(1000);
David Henningsson32cf4022012-05-04 11:05:55 +0200846
847 for (loopcounter = 0;; loopcounter++) {
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200848 if (chip->polling_mode || do_poll) {
Takashi Iwaie96224a2006-08-21 17:57:44 +0200849 spin_lock_irq(&chip->reg_lock);
850 azx_update_rirb(chip);
851 spin_unlock_irq(&chip->reg_lock);
852 }
Wu Fengguangdeadff12009-08-01 18:45:16 +0800853 if (!chip->rirb.cmds[addr]) {
Takashi Iwai2add9b92008-03-18 09:47:06 +0100854 smp_rmb();
Takashi Iwaib6132912009-03-24 07:36:09 +0100855 bus->rirb_error = 0;
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200856
857 if (!do_poll)
858 chip->poll_count = 0;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800859 return chip->rirb.res[addr]; /* the last value */
Takashi Iwai2add9b92008-03-18 09:47:06 +0100860 }
Takashi Iwai28a0d9d2008-01-18 15:32:32 +0100861 if (time_after(jiffies, timeout))
862 break;
David Henningsson32cf4022012-05-04 11:05:55 +0200863 if (bus->needs_damn_long_delay || loopcounter > 3000)
Takashi Iwai52987652008-01-16 16:09:47 +0100864 msleep(2); /* temporary workaround */
865 else {
866 udelay(10);
867 cond_resched();
868 }
Takashi Iwai28a0d9d2008-01-18 15:32:32 +0100869 }
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200870
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200871 if (!chip->polling_mode && chip->poll_count < 2) {
872 snd_printdd(SFX "azx_get_response timeout, "
873 "polling the codec once: last cmd=0x%08x\n",
874 chip->last_cmd[addr]);
875 do_poll = 1;
876 chip->poll_count++;
877 goto again;
878 }
879
880
Takashi Iwai23c4a882009-10-30 13:21:49 +0100881 if (!chip->polling_mode) {
882 snd_printk(KERN_WARNING SFX "azx_get_response timeout, "
883 "switching to polling mode: last cmd=0x%08x\n",
884 chip->last_cmd[addr]);
885 chip->polling_mode = 1;
886 goto again;
887 }
888
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200889 if (chip->msi) {
Takashi Iwai4abc1cc2009-05-19 12:16:46 +0200890 snd_printk(KERN_WARNING SFX "No response from codec, "
Wu Fengguangfeb27342009-08-01 19:17:14 +0800891 "disabling MSI: last cmd=0x%08x\n",
892 chip->last_cmd[addr]);
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200893 free_irq(chip->irq, chip);
894 chip->irq = -1;
895 pci_disable_msi(chip->pci);
896 chip->msi = 0;
Takashi Iwaib6132912009-03-24 07:36:09 +0100897 if (azx_acquire_irq(chip, 1) < 0) {
898 bus->rirb_error = 1;
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200899 return -1;
Takashi Iwaib6132912009-03-24 07:36:09 +0100900 }
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200901 goto again;
902 }
903
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +0100904 if (chip->probing) {
905 /* If this critical timeout happens during the codec probing
906 * phase, this is likely an access to a non-existing codec
907 * slot. Better to return an error and reset the system.
908 */
909 return -1;
910 }
911
Takashi Iwai8dd78332009-06-02 01:16:07 +0200912 /* a fatal communication error; need either to reset or to fallback
913 * to the single_cmd mode
914 */
Takashi Iwaib6132912009-03-24 07:36:09 +0100915 bus->rirb_error = 1;
Takashi Iwaib20f3b82009-06-02 01:20:22 +0200916 if (bus->allow_bus_reset && !bus->response_reset && !bus->in_reset) {
Takashi Iwai8dd78332009-06-02 01:16:07 +0200917 bus->response_reset = 1;
918 return -1; /* give a chance to retry */
919 }
920
921 snd_printk(KERN_ERR "hda_intel: azx_get_response timeout, "
922 "switching to single_cmd mode: last cmd=0x%08x\n",
Wu Fengguangfeb27342009-08-01 19:17:14 +0800923 chip->last_cmd[addr]);
Takashi Iwai8dd78332009-06-02 01:16:07 +0200924 chip->single_cmd = 1;
925 bus->response_reset = 0;
Takashi Iwai1a696972009-11-07 09:49:04 +0100926 /* release CORB/RIRB */
Takashi Iwai4fcd3922009-05-25 18:34:52 +0200927 azx_free_cmd_io(chip);
Takashi Iwai1a696972009-11-07 09:49:04 +0100928 /* disable unsolicited responses */
929 azx_writel(chip, GCTL, azx_readl(chip, GCTL) & ~ICH6_GCTL_UNSOL);
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200930 return -1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700931}
932
Linus Torvalds1da177e2005-04-16 15:20:36 -0700933/*
934 * Use the single immediate command instead of CORB/RIRB for simplicity
935 *
936 * Note: according to Intel, this is not preferred use. The command was
937 * intended for the BIOS only, and may get confused with unsolicited
938 * responses. So, we shouldn't use it for normal operation from the
939 * driver.
940 * I left the codes, however, for debugging/testing purposes.
941 */
942
Takashi Iwaib05a7d42009-05-28 11:59:12 +0200943/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800944static int azx_single_wait_for_response(struct azx *chip, unsigned int addr)
Takashi Iwaib05a7d42009-05-28 11:59:12 +0200945{
946 int timeout = 50;
947
948 while (timeout--) {
949 /* check IRV busy bit */
950 if (azx_readw(chip, IRS) & ICH6_IRS_VALID) {
951 /* reuse rirb.res as the response return value */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800952 chip->rirb.res[addr] = azx_readl(chip, IR);
Takashi Iwaib05a7d42009-05-28 11:59:12 +0200953 return 0;
954 }
955 udelay(1);
956 }
957 if (printk_ratelimit())
958 snd_printd(SFX "get_response timeout: IRS=0x%x\n",
959 azx_readw(chip, IRS));
Wu Fengguangdeadff12009-08-01 18:45:16 +0800960 chip->rirb.res[addr] = -1;
Takashi Iwaib05a7d42009-05-28 11:59:12 +0200961 return -EIO;
962}
963
Linus Torvalds1da177e2005-04-16 15:20:36 -0700964/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100965static int azx_single_send_cmd(struct hda_bus *bus, u32 val)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700966{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100967 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800968 unsigned int addr = azx_command_addr(val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700969 int timeout = 50;
970
Takashi Iwai8dd78332009-06-02 01:16:07 +0200971 bus->rirb_error = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700972 while (timeout--) {
973 /* check ICB busy bit */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200974 if (!((azx_readw(chip, IRS) & ICH6_IRS_BUSY))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700975 /* Clear IRV valid bit */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200976 azx_writew(chip, IRS, azx_readw(chip, IRS) |
977 ICH6_IRS_VALID);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700978 azx_writel(chip, IC, val);
Takashi Iwaid01ce992007-07-27 16:52:19 +0200979 azx_writew(chip, IRS, azx_readw(chip, IRS) |
980 ICH6_IRS_BUSY);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800981 return azx_single_wait_for_response(chip, addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700982 }
983 udelay(1);
984 }
Marc Boucher1cfd52b2008-01-22 15:29:26 +0100985 if (printk_ratelimit())
986 snd_printd(SFX "send_cmd timeout: IRS=0x%x, val=0x%x\n",
987 azx_readw(chip, IRS), val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700988 return -EIO;
989}
990
991/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800992static unsigned int azx_single_get_response(struct hda_bus *bus,
993 unsigned int addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700994{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100995 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800996 return chip->rirb.res[addr];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700997}
998
Takashi Iwai111d3af2006-02-16 18:17:58 +0100999/*
1000 * The below are the main callbacks from hda_codec.
1001 *
1002 * They are just the skeleton to call sub-callbacks according to the
1003 * current setting of chip->single_cmd.
1004 */
1005
1006/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001007static int azx_send_cmd(struct hda_bus *bus, unsigned int val)
Takashi Iwai111d3af2006-02-16 18:17:58 +01001008{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001009 struct azx *chip = bus->private_data;
Takashi Iwai43bbb6c2007-07-06 20:22:05 +02001010
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001011 if (chip->disabled)
1012 return 0;
Wu Fengguangfeb27342009-08-01 19:17:14 +08001013 chip->last_cmd[azx_command_addr(val)] = val;
Takashi Iwai111d3af2006-02-16 18:17:58 +01001014 if (chip->single_cmd)
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001015 return azx_single_send_cmd(bus, val);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001016 else
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001017 return azx_corb_send_cmd(bus, val);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001018}
1019
1020/* get a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +08001021static unsigned int azx_get_response(struct hda_bus *bus,
1022 unsigned int addr)
Takashi Iwai111d3af2006-02-16 18:17:58 +01001023{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001024 struct azx *chip = bus->private_data;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001025 if (chip->disabled)
1026 return 0;
Takashi Iwai111d3af2006-02-16 18:17:58 +01001027 if (chip->single_cmd)
Wu Fengguangdeadff12009-08-01 18:45:16 +08001028 return azx_single_get_response(bus, addr);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001029 else
Wu Fengguangdeadff12009-08-01 18:45:16 +08001030 return azx_rirb_get_response(bus, addr);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001031}
1032
Takashi Iwaicb53c622007-08-10 17:21:45 +02001033#ifdef CONFIG_SND_HDA_POWER_SAVE
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001034static void azx_power_notify(struct hda_bus *bus);
Takashi Iwaicb53c622007-08-10 17:21:45 +02001035#endif
Takashi Iwai111d3af2006-02-16 18:17:58 +01001036
Linus Torvalds1da177e2005-04-16 15:20:36 -07001037/* reset codec link */
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001038static int azx_reset(struct azx *chip, int full_reset)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001039{
1040 int count;
1041
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001042 if (!full_reset)
1043 goto __skip;
1044
Danny Tholene8a7f132007-09-11 21:41:56 +02001045 /* clear STATESTS */
1046 azx_writeb(chip, STATESTS, STATESTS_INT_MASK);
1047
Linus Torvalds1da177e2005-04-16 15:20:36 -07001048 /* reset controller */
1049 azx_writel(chip, GCTL, azx_readl(chip, GCTL) & ~ICH6_GCTL_RESET);
1050
1051 count = 50;
1052 while (azx_readb(chip, GCTL) && --count)
1053 msleep(1);
1054
1055 /* delay for >= 100us for codec PLL to settle per spec
1056 * Rev 0.9 section 5.5.1
1057 */
1058 msleep(1);
1059
1060 /* Bring controller out of reset */
1061 azx_writeb(chip, GCTL, azx_readb(chip, GCTL) | ICH6_GCTL_RESET);
1062
1063 count = 50;
Pavel Machek927fc862006-08-31 17:03:43 +02001064 while (!azx_readb(chip, GCTL) && --count)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001065 msleep(1);
1066
Pavel Machek927fc862006-08-31 17:03:43 +02001067 /* Brent Chartrand said to wait >= 540us for codecs to initialize */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001068 msleep(1);
1069
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001070 __skip:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001071 /* check to see if controller is ready */
Pavel Machek927fc862006-08-31 17:03:43 +02001072 if (!azx_readb(chip, GCTL)) {
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001073 snd_printd(SFX "azx_reset: controller not ready!\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001074 return -EBUSY;
1075 }
1076
Matt41e2fce2005-07-04 17:49:55 +02001077 /* Accept unsolicited responses */
Takashi Iwai1a696972009-11-07 09:49:04 +01001078 if (!chip->single_cmd)
1079 azx_writel(chip, GCTL, azx_readl(chip, GCTL) |
1080 ICH6_GCTL_UNSOL);
Matt41e2fce2005-07-04 17:49:55 +02001081
Linus Torvalds1da177e2005-04-16 15:20:36 -07001082 /* detect codecs */
Pavel Machek927fc862006-08-31 17:03:43 +02001083 if (!chip->codec_mask) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001084 chip->codec_mask = azx_readw(chip, STATESTS);
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001085 snd_printdd(SFX "codec_mask = 0x%x\n", chip->codec_mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001086 }
1087
1088 return 0;
1089}
1090
1091
1092/*
1093 * Lowlevel interface
1094 */
1095
1096/* enable interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001097static void azx_int_enable(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001098{
1099 /* enable controller CIE and GIE */
1100 azx_writel(chip, INTCTL, azx_readl(chip, INTCTL) |
1101 ICH6_INT_CTRL_EN | ICH6_INT_GLOBAL_EN);
1102}
1103
1104/* disable interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001105static void azx_int_disable(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001106{
1107 int i;
1108
1109 /* disable interrupts in stream descriptor */
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001110 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001111 struct azx_dev *azx_dev = &chip->azx_dev[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001112 azx_sd_writeb(azx_dev, SD_CTL,
1113 azx_sd_readb(azx_dev, SD_CTL) & ~SD_INT_MASK);
1114 }
1115
1116 /* disable SIE for all streams */
1117 azx_writeb(chip, INTCTL, 0);
1118
1119 /* disable controller CIE and GIE */
1120 azx_writel(chip, INTCTL, azx_readl(chip, INTCTL) &
1121 ~(ICH6_INT_CTRL_EN | ICH6_INT_GLOBAL_EN));
1122}
1123
1124/* clear interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001125static void azx_int_clear(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001126{
1127 int i;
1128
1129 /* clear stream status */
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001130 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001131 struct azx_dev *azx_dev = &chip->azx_dev[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001132 azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK);
1133 }
1134
1135 /* clear STATESTS */
1136 azx_writeb(chip, STATESTS, STATESTS_INT_MASK);
1137
1138 /* clear rirb status */
1139 azx_writeb(chip, RIRBSTS, RIRB_INT_MASK);
1140
1141 /* clear int status */
1142 azx_writel(chip, INTSTS, ICH6_INT_CTRL_EN | ICH6_INT_ALL_STREAM);
1143}
1144
1145/* start a stream */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001146static void azx_stream_start(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001147{
Joseph Chan0e153472008-08-26 14:38:03 +02001148 /*
1149 * Before stream start, initialize parameter
1150 */
1151 azx_dev->insufficient = 1;
1152
Linus Torvalds1da177e2005-04-16 15:20:36 -07001153 /* enable SIE */
Wei Niccc5df02010-01-26 15:59:33 +08001154 azx_writel(chip, INTCTL,
1155 azx_readl(chip, INTCTL) | (1 << azx_dev->index));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001156 /* set DMA start and interrupt mask */
1157 azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) |
1158 SD_CTL_DMA_START | SD_INT_MASK);
1159}
1160
Takashi Iwai1dddab42009-03-18 15:15:37 +01001161/* stop DMA */
1162static void azx_stream_clear(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001163{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001164 azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) &
1165 ~(SD_CTL_DMA_START | SD_INT_MASK));
1166 azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK); /* to be sure */
Takashi Iwai1dddab42009-03-18 15:15:37 +01001167}
1168
1169/* stop a stream */
1170static void azx_stream_stop(struct azx *chip, struct azx_dev *azx_dev)
1171{
1172 azx_stream_clear(chip, azx_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001173 /* disable SIE */
Wei Niccc5df02010-01-26 15:59:33 +08001174 azx_writel(chip, INTCTL,
1175 azx_readl(chip, INTCTL) & ~(1 << azx_dev->index));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001176}
1177
1178
1179/*
Takashi Iwaicb53c622007-08-10 17:21:45 +02001180 * reset and start the controller registers
Linus Torvalds1da177e2005-04-16 15:20:36 -07001181 */
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001182static void azx_init_chip(struct azx *chip, int full_reset)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001183{
Takashi Iwaicb53c622007-08-10 17:21:45 +02001184 if (chip->initialized)
1185 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001186
1187 /* reset controller */
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001188 azx_reset(chip, full_reset);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001189
1190 /* initialize interrupts */
1191 azx_int_clear(chip);
1192 azx_int_enable(chip);
1193
1194 /* initialize the codec command I/O */
Takashi Iwai1a696972009-11-07 09:49:04 +01001195 if (!chip->single_cmd)
1196 azx_init_cmd_io(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001197
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02001198 /* program the position buffer */
1199 azx_writel(chip, DPLBASE, (u32)chip->posbuf.addr);
Takashi Iwai766979e2008-06-13 20:53:56 +02001200 azx_writel(chip, DPUBASE, upper_32_bits(chip->posbuf.addr));
Frederick Lif5d40b32005-05-12 14:55:20 +02001201
Takashi Iwaicb53c622007-08-10 17:21:45 +02001202 chip->initialized = 1;
1203}
1204
1205/*
1206 * initialize the PCI registers
1207 */
1208/* update bits in a PCI register byte */
1209static void update_pci_byte(struct pci_dev *pci, unsigned int reg,
1210 unsigned char mask, unsigned char val)
1211{
1212 unsigned char data;
1213
1214 pci_read_config_byte(pci, reg, &data);
1215 data &= ~mask;
1216 data |= (val & mask);
1217 pci_write_config_byte(pci, reg, data);
1218}
1219
1220static void azx_init_pci(struct azx *chip)
1221{
1222 /* Clear bits 0-2 of PCI register TCSEL (at offset 0x44)
1223 * TCSEL == Traffic Class Select Register, which sets PCI express QOS
1224 * Ensuring these bits are 0 clears playback static on some HD Audio
Adam Lackorzynskia09e89f2011-03-10 17:41:56 +01001225 * codecs.
1226 * The PCI register TCSEL is defined in the Intel manuals.
Takashi Iwaicb53c622007-08-10 17:21:45 +02001227 */
Linus Torvalds46f2cc82011-05-27 19:45:28 -07001228 if (!(chip->driver_caps & AZX_DCAPS_NO_TCSEL)) {
Takashi Iwai9477c582011-05-25 09:11:37 +02001229 snd_printdd(SFX "Clearing TCSEL\n");
Adam Lackorzynskia09e89f2011-03-10 17:41:56 +01001230 update_pci_byte(chip->pci, ICH6_PCIREG_TCSEL, 0x07, 0);
Takashi Iwai9477c582011-05-25 09:11:37 +02001231 }
Takashi Iwaicb53c622007-08-10 17:21:45 +02001232
Takashi Iwai9477c582011-05-25 09:11:37 +02001233 /* For ATI SB450/600/700/800/900 and AMD Hudson azalia HD audio,
1234 * we need to enable snoop.
1235 */
1236 if (chip->driver_caps & AZX_DCAPS_ATI_SNOOP) {
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001237 snd_printdd(SFX "Setting ATI snoop: %d\n", azx_snoop(chip));
Takashi Iwaicb53c622007-08-10 17:21:45 +02001238 update_pci_byte(chip->pci,
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001239 ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR, 0x07,
1240 azx_snoop(chip) ? ATI_SB450_HDAUDIO_ENABLE_SNOOP : 0);
Takashi Iwai9477c582011-05-25 09:11:37 +02001241 }
1242
1243 /* For NVIDIA HDA, enable snoop */
1244 if (chip->driver_caps & AZX_DCAPS_NVIDIA_SNOOP) {
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001245 snd_printdd(SFX "Setting Nvidia snoop: %d\n", azx_snoop(chip));
Takashi Iwaicb53c622007-08-10 17:21:45 +02001246 update_pci_byte(chip->pci,
1247 NVIDIA_HDA_TRANSREG_ADDR,
1248 0x0f, NVIDIA_HDA_ENABLE_COHBITS);
Peer Chen320dcc32008-08-20 16:43:24 -07001249 update_pci_byte(chip->pci,
1250 NVIDIA_HDA_ISTRM_COH,
1251 0x01, NVIDIA_HDA_ENABLE_COHBIT);
1252 update_pci_byte(chip->pci,
1253 NVIDIA_HDA_OSTRM_COH,
1254 0x01, NVIDIA_HDA_ENABLE_COHBIT);
Takashi Iwai9477c582011-05-25 09:11:37 +02001255 }
1256
1257 /* Enable SCH/PCH snoop if needed */
1258 if (chip->driver_caps & AZX_DCAPS_SCH_SNOOP) {
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001259 unsigned short snoop;
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001260 pci_read_config_word(chip->pci, INTEL_SCH_HDA_DEVC, &snoop);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001261 if ((!azx_snoop(chip) && !(snoop & INTEL_SCH_HDA_DEVC_NOSNOOP)) ||
1262 (azx_snoop(chip) && (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP))) {
1263 snoop &= ~INTEL_SCH_HDA_DEVC_NOSNOOP;
1264 if (!azx_snoop(chip))
1265 snoop |= INTEL_SCH_HDA_DEVC_NOSNOOP;
1266 pci_write_config_word(chip->pci, INTEL_SCH_HDA_DEVC, snoop);
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001267 pci_read_config_word(chip->pci,
1268 INTEL_SCH_HDA_DEVC, &snoop);
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001269 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001270 snd_printdd(SFX "SCH snoop: %s\n",
1271 (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP)
1272 ? "Disabled" : "Enabled");
Vinod Gda3fca22005-09-13 18:49:12 +02001273 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001274}
1275
1276
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001277static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev);
1278
Linus Torvalds1da177e2005-04-16 15:20:36 -07001279/*
1280 * interrupt handler
1281 */
David Howells7d12e782006-10-05 14:55:46 +01001282static irqreturn_t azx_interrupt(int irq, void *dev_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001283{
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001284 struct azx *chip = dev_id;
1285 struct azx_dev *azx_dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001286 u32 status;
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001287 u8 sd_status;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001288 int i, ok;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001289
1290 spin_lock(&chip->reg_lock);
1291
Dan Carpenter60911062012-05-18 10:36:11 +03001292 if (chip->disabled) {
1293 spin_unlock(&chip->reg_lock);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001294 return IRQ_NONE;
Dan Carpenter60911062012-05-18 10:36:11 +03001295 }
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001296
Linus Torvalds1da177e2005-04-16 15:20:36 -07001297 status = azx_readl(chip, INTSTS);
1298 if (status == 0) {
1299 spin_unlock(&chip->reg_lock);
1300 return IRQ_NONE;
1301 }
1302
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001303 for (i = 0; i < chip->num_streams; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001304 azx_dev = &chip->azx_dev[i];
1305 if (status & azx_dev->sd_int_sta_mask) {
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001306 sd_status = azx_sd_readb(azx_dev, SD_STS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001307 azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK);
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001308 if (!azx_dev->substream || !azx_dev->running ||
1309 !(sd_status & SD_INT_COMPLETE))
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001310 continue;
1311 /* check whether this IRQ is really acceptable */
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001312 ok = azx_position_ok(chip, azx_dev);
1313 if (ok == 1) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001314 azx_dev->irq_pending = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001315 spin_unlock(&chip->reg_lock);
1316 snd_pcm_period_elapsed(azx_dev->substream);
1317 spin_lock(&chip->reg_lock);
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001318 } else if (ok == 0 && chip->bus && chip->bus->workq) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001319 /* bogus IRQ, process it later */
1320 azx_dev->irq_pending = 1;
Takashi Iwai6acaed32009-01-12 10:09:24 +01001321 queue_work(chip->bus->workq,
1322 &chip->irq_pending_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001323 }
1324 }
1325 }
1326
1327 /* clear rirb int */
1328 status = azx_readb(chip, RIRBSTS);
1329 if (status & RIRB_INT_MASK) {
Takashi Iwai14d34f12010-10-21 09:03:25 +02001330 if (status & RIRB_INT_RESPONSE) {
Takashi Iwai9477c582011-05-25 09:11:37 +02001331 if (chip->driver_caps & AZX_DCAPS_RIRB_PRE_DELAY)
Takashi Iwai14d34f12010-10-21 09:03:25 +02001332 udelay(80);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001333 azx_update_rirb(chip);
Takashi Iwai14d34f12010-10-21 09:03:25 +02001334 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001335 azx_writeb(chip, RIRBSTS, RIRB_INT_MASK);
1336 }
1337
1338#if 0
1339 /* clear state status int */
1340 if (azx_readb(chip, STATESTS) & 0x04)
1341 azx_writeb(chip, STATESTS, 0x04);
1342#endif
1343 spin_unlock(&chip->reg_lock);
1344
1345 return IRQ_HANDLED;
1346}
1347
1348
1349/*
Takashi Iwai675f25d2008-06-10 17:53:20 +02001350 * set up a BDL entry
1351 */
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001352static int setup_bdle(struct azx *chip,
1353 struct snd_pcm_substream *substream,
Takashi Iwai675f25d2008-06-10 17:53:20 +02001354 struct azx_dev *azx_dev, u32 **bdlp,
1355 int ofs, int size, int with_ioc)
1356{
Takashi Iwai675f25d2008-06-10 17:53:20 +02001357 u32 *bdl = *bdlp;
1358
1359 while (size > 0) {
1360 dma_addr_t addr;
1361 int chunk;
1362
1363 if (azx_dev->frags >= AZX_MAX_BDL_ENTRIES)
1364 return -EINVAL;
1365
Takashi Iwai77a23f22008-08-21 13:00:13 +02001366 addr = snd_pcm_sgbuf_get_addr(substream, ofs);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001367 /* program the address field of the BDL entry */
1368 bdl[0] = cpu_to_le32((u32)addr);
Takashi Iwai766979e2008-06-13 20:53:56 +02001369 bdl[1] = cpu_to_le32(upper_32_bits(addr));
Takashi Iwai675f25d2008-06-10 17:53:20 +02001370 /* program the size field of the BDL entry */
Takashi Iwaifc4abee2008-07-30 15:13:34 +02001371 chunk = snd_pcm_sgbuf_get_chunk_size(substream, ofs, size);
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001372 /* one BDLE cannot cross 4K boundary on CTHDA chips */
1373 if (chip->driver_caps & AZX_DCAPS_4K_BDLE_BOUNDARY) {
1374 u32 remain = 0x1000 - (ofs & 0xfff);
1375 if (chunk > remain)
1376 chunk = remain;
1377 }
Takashi Iwai675f25d2008-06-10 17:53:20 +02001378 bdl[2] = cpu_to_le32(chunk);
1379 /* program the IOC to enable interrupt
1380 * only when the whole fragment is processed
1381 */
1382 size -= chunk;
1383 bdl[3] = (size || !with_ioc) ? 0 : cpu_to_le32(0x01);
1384 bdl += 4;
1385 azx_dev->frags++;
1386 ofs += chunk;
1387 }
1388 *bdlp = bdl;
1389 return ofs;
1390}
1391
1392/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001393 * set up BDL entries
1394 */
Takashi Iwai555e2192008-06-10 17:53:34 +02001395static int azx_setup_periods(struct azx *chip,
1396 struct snd_pcm_substream *substream,
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001397 struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001398{
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001399 u32 *bdl;
1400 int i, ofs, periods, period_bytes;
Takashi Iwai555e2192008-06-10 17:53:34 +02001401 int pos_adj;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001402
1403 /* reset BDL address */
1404 azx_sd_writel(azx_dev, SD_BDLPL, 0);
1405 azx_sd_writel(azx_dev, SD_BDLPU, 0);
1406
Takashi Iwai97b71c92009-03-18 15:09:13 +01001407 period_bytes = azx_dev->period_bytes;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001408 periods = azx_dev->bufsize / period_bytes;
1409
Linus Torvalds1da177e2005-04-16 15:20:36 -07001410 /* program the initial BDL entries */
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001411 bdl = (u32 *)azx_dev->bdl.area;
1412 ofs = 0;
1413 azx_dev->frags = 0;
Takashi Iwai555e2192008-06-10 17:53:34 +02001414 pos_adj = bdl_pos_adj[chip->dev_index];
1415 if (pos_adj > 0) {
Takashi Iwai675f25d2008-06-10 17:53:20 +02001416 struct snd_pcm_runtime *runtime = substream->runtime;
Takashi Iwaie785d3d2008-07-15 16:28:43 +02001417 int pos_align = pos_adj;
Takashi Iwai555e2192008-06-10 17:53:34 +02001418 pos_adj = (pos_adj * runtime->rate + 47999) / 48000;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001419 if (!pos_adj)
Takashi Iwaie785d3d2008-07-15 16:28:43 +02001420 pos_adj = pos_align;
1421 else
1422 pos_adj = ((pos_adj + pos_align - 1) / pos_align) *
1423 pos_align;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001424 pos_adj = frames_to_bytes(runtime, pos_adj);
1425 if (pos_adj >= period_bytes) {
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001426 snd_printk(KERN_WARNING SFX "Too big adjustment %d\n",
Takashi Iwai555e2192008-06-10 17:53:34 +02001427 bdl_pos_adj[chip->dev_index]);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001428 pos_adj = 0;
1429 } else {
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001430 ofs = setup_bdle(chip, substream, azx_dev,
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001431 &bdl, ofs, pos_adj,
1432 !substream->runtime->no_period_wakeup);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001433 if (ofs < 0)
1434 goto error;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001435 }
Takashi Iwai555e2192008-06-10 17:53:34 +02001436 } else
1437 pos_adj = 0;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001438 for (i = 0; i < periods; i++) {
1439 if (i == periods - 1 && pos_adj)
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001440 ofs = setup_bdle(chip, substream, azx_dev, &bdl, ofs,
Takashi Iwai675f25d2008-06-10 17:53:20 +02001441 period_bytes - pos_adj, 0);
1442 else
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001443 ofs = setup_bdle(chip, substream, azx_dev, &bdl, ofs,
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001444 period_bytes,
1445 !substream->runtime->no_period_wakeup);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001446 if (ofs < 0)
1447 goto error;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001448 }
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001449 return 0;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001450
1451 error:
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001452 snd_printk(KERN_ERR SFX "Too many BDL entries: buffer=%d, period=%d\n",
Takashi Iwai675f25d2008-06-10 17:53:20 +02001453 azx_dev->bufsize, period_bytes);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001454 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001455}
1456
Takashi Iwai1dddab42009-03-18 15:15:37 +01001457/* reset stream */
1458static void azx_stream_reset(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001459{
1460 unsigned char val;
1461 int timeout;
1462
Takashi Iwai1dddab42009-03-18 15:15:37 +01001463 azx_stream_clear(chip, azx_dev);
1464
Takashi Iwaid01ce992007-07-27 16:52:19 +02001465 azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) |
1466 SD_CTL_STREAM_RESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001467 udelay(3);
1468 timeout = 300;
1469 while (!((val = azx_sd_readb(azx_dev, SD_CTL)) & SD_CTL_STREAM_RESET) &&
1470 --timeout)
1471 ;
1472 val &= ~SD_CTL_STREAM_RESET;
1473 azx_sd_writeb(azx_dev, SD_CTL, val);
1474 udelay(3);
1475
1476 timeout = 300;
1477 /* waiting for hardware to report that the stream is out of reset */
1478 while (((val = azx_sd_readb(azx_dev, SD_CTL)) & SD_CTL_STREAM_RESET) &&
1479 --timeout)
1480 ;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001481
1482 /* reset first position - may not be synced with hw at this time */
1483 *azx_dev->posbuf = 0;
Takashi Iwai1dddab42009-03-18 15:15:37 +01001484}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001485
Takashi Iwai1dddab42009-03-18 15:15:37 +01001486/*
1487 * set up the SD for streaming
1488 */
1489static int azx_setup_controller(struct azx *chip, struct azx_dev *azx_dev)
1490{
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001491 unsigned int val;
Takashi Iwai1dddab42009-03-18 15:15:37 +01001492 /* make sure the run bit is zero for SD */
1493 azx_stream_clear(chip, azx_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001494 /* program the stream_tag */
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001495 val = azx_sd_readl(azx_dev, SD_CTL);
1496 val = (val & ~SD_CTL_STREAM_TAG_MASK) |
1497 (azx_dev->stream_tag << SD_CTL_STREAM_TAG_SHIFT);
1498 if (!azx_snoop(chip))
1499 val |= SD_CTL_TRAFFIC_PRIO;
1500 azx_sd_writel(azx_dev, SD_CTL, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001501
1502 /* program the length of samples in cyclic buffer */
1503 azx_sd_writel(azx_dev, SD_CBL, azx_dev->bufsize);
1504
1505 /* program the stream format */
1506 /* this value needs to be the same as the one programmed */
1507 azx_sd_writew(azx_dev, SD_FORMAT, azx_dev->format_val);
1508
1509 /* program the stream LVI (last valid index) of the BDL */
1510 azx_sd_writew(azx_dev, SD_LVI, azx_dev->frags - 1);
1511
1512 /* program the BDL address */
1513 /* lower BDL address */
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001514 azx_sd_writel(azx_dev, SD_BDLPL, (u32)azx_dev->bdl.addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001515 /* upper BDL address */
Takashi Iwai766979e2008-06-13 20:53:56 +02001516 azx_sd_writel(azx_dev, SD_BDLPU, upper_32_bits(azx_dev->bdl.addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001517
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02001518 /* enable the position buffer */
David Henningsson4cb36312010-09-30 10:12:50 +02001519 if (chip->position_fix[0] != POS_FIX_LPIB ||
1520 chip->position_fix[1] != POS_FIX_LPIB) {
Takashi Iwaiee9d6b92008-03-14 15:52:20 +01001521 if (!(azx_readl(chip, DPLBASE) & ICH6_DPLBASE_ENABLE))
1522 azx_writel(chip, DPLBASE,
1523 (u32)chip->posbuf.addr | ICH6_DPLBASE_ENABLE);
1524 }
Takashi Iwaic74db862005-05-12 14:26:27 +02001525
Linus Torvalds1da177e2005-04-16 15:20:36 -07001526 /* set the interrupt enable bits in the descriptor control register */
Takashi Iwaid01ce992007-07-27 16:52:19 +02001527 azx_sd_writel(azx_dev, SD_CTL,
1528 azx_sd_readl(azx_dev, SD_CTL) | SD_INT_MASK);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001529
1530 return 0;
1531}
1532
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001533/*
1534 * Probe the given codec address
1535 */
1536static int probe_codec(struct azx *chip, int addr)
1537{
1538 unsigned int cmd = (addr << 28) | (AC_NODE_ROOT << 20) |
1539 (AC_VERB_PARAMETERS << 8) | AC_PAR_VENDOR_ID;
1540 unsigned int res;
1541
Wu Fengguanga678cde2009-08-01 18:46:46 +08001542 mutex_lock(&chip->bus->cmd_mutex);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001543 chip->probing = 1;
1544 azx_send_cmd(chip->bus, cmd);
Wu Fengguangdeadff12009-08-01 18:45:16 +08001545 res = azx_get_response(chip->bus, addr);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001546 chip->probing = 0;
Wu Fengguanga678cde2009-08-01 18:46:46 +08001547 mutex_unlock(&chip->bus->cmd_mutex);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001548 if (res == -1)
1549 return -EIO;
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001550 snd_printdd(SFX "codec #%d probed OK\n", addr);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001551 return 0;
1552}
1553
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001554static int azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec,
1555 struct hda_pcm *cpcm);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001556static void azx_stop_chip(struct azx *chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001557
Takashi Iwai8dd78332009-06-02 01:16:07 +02001558static void azx_bus_reset(struct hda_bus *bus)
1559{
1560 struct azx *chip = bus->private_data;
Takashi Iwai8dd78332009-06-02 01:16:07 +02001561
1562 bus->in_reset = 1;
1563 azx_stop_chip(chip);
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001564 azx_init_chip(chip, 1);
Alexander Beregalov65f75982009-06-04 13:46:16 +04001565#ifdef CONFIG_PM
Takashi Iwai8dd78332009-06-02 01:16:07 +02001566 if (chip->initialized) {
Takashi Iwai01b65bf2011-11-24 14:31:46 +01001567 struct azx_pcm *p;
1568 list_for_each_entry(p, &chip->pcm_list, list)
1569 snd_pcm_suspend_all(p->pcm);
Takashi Iwai8dd78332009-06-02 01:16:07 +02001570 snd_hda_suspend(chip->bus);
1571 snd_hda_resume(chip->bus);
1572 }
Alexander Beregalov65f75982009-06-04 13:46:16 +04001573#endif
Takashi Iwai8dd78332009-06-02 01:16:07 +02001574 bus->in_reset = 0;
1575}
1576
Linus Torvalds1da177e2005-04-16 15:20:36 -07001577/*
1578 * Codec initialization
1579 */
1580
Takashi Iwai2f5983f2008-09-03 16:00:44 +02001581/* number of codec slots for each chipset: 0 = default slots (i.e. 4) */
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001582static unsigned int azx_max_codecs[AZX_NUM_DRIVERS] DELAYED_INITDATA_MARK = {
Wei Ni7445dfc2010-03-03 15:05:53 +08001583 [AZX_DRIVER_NVIDIA] = 8,
Kailang Yangf2690022008-05-27 11:44:55 +02001584 [AZX_DRIVER_TERA] = 1,
Takashi Iwaia9995a32007-03-12 21:30:46 +01001585};
1586
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001587static int DELAYED_INIT_MARK azx_codec_create(struct azx *chip, const char *model)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001588{
1589 struct hda_bus_template bus_temp;
Takashi Iwai34c25352008-10-28 11:38:58 +01001590 int c, codecs, err;
1591 int max_slots;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001592
1593 memset(&bus_temp, 0, sizeof(bus_temp));
1594 bus_temp.private_data = chip;
1595 bus_temp.modelname = model;
1596 bus_temp.pci = chip->pci;
Takashi Iwai111d3af2006-02-16 18:17:58 +01001597 bus_temp.ops.command = azx_send_cmd;
1598 bus_temp.ops.get_response = azx_get_response;
Takashi Iwai176d5332008-07-30 15:01:44 +02001599 bus_temp.ops.attach_pcm = azx_attach_pcm_stream;
Takashi Iwai8dd78332009-06-02 01:16:07 +02001600 bus_temp.ops.bus_reset = azx_bus_reset;
Takashi Iwaicb53c622007-08-10 17:21:45 +02001601#ifdef CONFIG_SND_HDA_POWER_SAVE
Takashi Iwai11cd41b2008-11-28 07:22:18 +01001602 bus_temp.power_save = &power_save;
Takashi Iwaicb53c622007-08-10 17:21:45 +02001603 bus_temp.ops.pm_notify = azx_power_notify;
1604#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07001605
Takashi Iwaid01ce992007-07-27 16:52:19 +02001606 err = snd_hda_bus_new(chip->card, &bus_temp, &chip->bus);
1607 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001608 return err;
1609
Takashi Iwai9477c582011-05-25 09:11:37 +02001610 if (chip->driver_caps & AZX_DCAPS_RIRB_DELAY) {
1611 snd_printd(SFX "Enable delay in RIRB handling\n");
Wei Nidc9c8e22008-09-26 13:55:56 +08001612 chip->bus->needs_damn_long_delay = 1;
Takashi Iwai9477c582011-05-25 09:11:37 +02001613 }
Wei Nidc9c8e22008-09-26 13:55:56 +08001614
Takashi Iwai34c25352008-10-28 11:38:58 +01001615 codecs = 0;
Takashi Iwai2f5983f2008-09-03 16:00:44 +02001616 max_slots = azx_max_codecs[chip->driver_type];
1617 if (!max_slots)
Wei Ni7445dfc2010-03-03 15:05:53 +08001618 max_slots = AZX_DEFAULT_CODECS;
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001619
1620 /* First try to probe all given codec slots */
1621 for (c = 0; c < max_slots; c++) {
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01001622 if ((chip->codec_mask & (1 << c)) & chip->codec_probe_mask) {
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001623 if (probe_codec(chip, c) < 0) {
1624 /* Some BIOSen give you wrong codec addresses
1625 * that don't exist
1626 */
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001627 snd_printk(KERN_WARNING SFX
1628 "Codec #%d probe error; "
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001629 "disabling it...\n", c);
1630 chip->codec_mask &= ~(1 << c);
1631 /* More badly, accessing to a non-existing
1632 * codec often screws up the controller chip,
Paul Menzel24481582010-02-08 20:37:26 +01001633 * and disturbs the further communications.
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001634 * Thus if an error occurs during probing,
1635 * better to reset the controller chip to
1636 * get back to the sanity state.
1637 */
1638 azx_stop_chip(chip);
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001639 azx_init_chip(chip, 1);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001640 }
1641 }
1642 }
1643
Takashi Iwaid507cd62011-04-26 15:25:02 +02001644 /* AMD chipsets often cause the communication stalls upon certain
1645 * sequence like the pin-detection. It seems that forcing the synced
1646 * access works around the stall. Grrr...
1647 */
Takashi Iwai9477c582011-05-25 09:11:37 +02001648 if (chip->driver_caps & AZX_DCAPS_SYNC_WRITE) {
1649 snd_printd(SFX "Enable sync_write for stable communication\n");
Takashi Iwaid507cd62011-04-26 15:25:02 +02001650 chip->bus->sync_write = 1;
1651 chip->bus->allow_bus_reset = 1;
1652 }
1653
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001654 /* Then create codec instances */
Takashi Iwai34c25352008-10-28 11:38:58 +01001655 for (c = 0; c < max_slots; c++) {
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01001656 if ((chip->codec_mask & (1 << c)) & chip->codec_probe_mask) {
Takashi Iwaibccad142007-04-24 12:23:53 +02001657 struct hda_codec *codec;
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001658 err = snd_hda_codec_new(chip->bus, c, &codec);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001659 if (err < 0)
1660 continue;
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +01001661 codec->beep_mode = chip->beep_mode;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001662 codecs++;
Takashi Iwai19a982b2007-03-21 15:14:35 +01001663 }
1664 }
1665 if (!codecs) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001666 snd_printk(KERN_ERR SFX "no codecs initialized\n");
1667 return -ENXIO;
1668 }
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001669 return 0;
1670}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001671
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001672/* configure each codec instance */
1673static int __devinit azx_codec_configure(struct azx *chip)
1674{
1675 struct hda_codec *codec;
1676 list_for_each_entry(codec, &chip->bus->codec_list, list) {
1677 snd_hda_codec_configure(codec);
1678 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001679 return 0;
1680}
1681
1682
1683/*
1684 * PCM support
1685 */
1686
1687/* assign a stream for the PCM */
Wu Fengguangef18bed2009-12-25 13:14:27 +08001688static inline struct azx_dev *
1689azx_assign_device(struct azx *chip, struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001690{
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001691 int dev, i, nums;
Wu Fengguangef18bed2009-12-25 13:14:27 +08001692 struct azx_dev *res = NULL;
Takashi Iwaid5cf9912011-10-06 10:07:58 +02001693 /* make a non-zero unique key for the substream */
1694 int key = (substream->pcm->device << 16) | (substream->number << 2) |
1695 (substream->stream + 1);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001696
1697 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001698 dev = chip->playback_index_offset;
1699 nums = chip->playback_streams;
1700 } else {
1701 dev = chip->capture_index_offset;
1702 nums = chip->capture_streams;
1703 }
1704 for (i = 0; i < nums; i++, dev++)
Takashi Iwaid01ce992007-07-27 16:52:19 +02001705 if (!chip->azx_dev[dev].opened) {
Wu Fengguangef18bed2009-12-25 13:14:27 +08001706 res = &chip->azx_dev[dev];
Takashi Iwaid5cf9912011-10-06 10:07:58 +02001707 if (res->assigned_key == key)
Wu Fengguangef18bed2009-12-25 13:14:27 +08001708 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001709 }
Wu Fengguangef18bed2009-12-25 13:14:27 +08001710 if (res) {
1711 res->opened = 1;
Takashi Iwaid5cf9912011-10-06 10:07:58 +02001712 res->assigned_key = key;
Wu Fengguangef18bed2009-12-25 13:14:27 +08001713 }
1714 return res;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001715}
1716
1717/* release the assigned stream */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001718static inline void azx_release_device(struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001719{
1720 azx_dev->opened = 0;
1721}
1722
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001723static struct snd_pcm_hardware azx_pcm_hw = {
Takashi Iwaid01ce992007-07-27 16:52:19 +02001724 .info = (SNDRV_PCM_INFO_MMAP |
1725 SNDRV_PCM_INFO_INTERLEAVED |
Linus Torvalds1da177e2005-04-16 15:20:36 -07001726 SNDRV_PCM_INFO_BLOCK_TRANSFER |
1727 SNDRV_PCM_INFO_MMAP_VALID |
Pavel Machek927fc862006-08-31 17:03:43 +02001728 /* No full-resume yet implemented */
1729 /* SNDRV_PCM_INFO_RESUME |*/
Takashi Iwai850f0e52008-03-18 17:11:05 +01001730 SNDRV_PCM_INFO_PAUSE |
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001731 SNDRV_PCM_INFO_SYNC_START |
1732 SNDRV_PCM_INFO_NO_PERIOD_WAKEUP),
Linus Torvalds1da177e2005-04-16 15:20:36 -07001733 .formats = SNDRV_PCM_FMTBIT_S16_LE,
1734 .rates = SNDRV_PCM_RATE_48000,
1735 .rate_min = 48000,
1736 .rate_max = 48000,
1737 .channels_min = 2,
1738 .channels_max = 2,
1739 .buffer_bytes_max = AZX_MAX_BUF_SIZE,
1740 .period_bytes_min = 128,
1741 .period_bytes_max = AZX_MAX_BUF_SIZE / 2,
1742 .periods_min = 2,
1743 .periods_max = AZX_MAX_FRAG,
1744 .fifo_size = 0,
1745};
1746
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001747static int azx_pcm_open(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001748{
1749 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1750 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001751 struct azx *chip = apcm->chip;
1752 struct azx_dev *azx_dev;
1753 struct snd_pcm_runtime *runtime = substream->runtime;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001754 unsigned long flags;
1755 int err;
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001756 int buff_step;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001757
Ingo Molnar62932df2006-01-16 16:34:20 +01001758 mutex_lock(&chip->open_mutex);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001759 azx_dev = azx_assign_device(chip, substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001760 if (azx_dev == NULL) {
Ingo Molnar62932df2006-01-16 16:34:20 +01001761 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001762 return -EBUSY;
1763 }
1764 runtime->hw = azx_pcm_hw;
1765 runtime->hw.channels_min = hinfo->channels_min;
1766 runtime->hw.channels_max = hinfo->channels_max;
1767 runtime->hw.formats = hinfo->formats;
1768 runtime->hw.rates = hinfo->rates;
1769 snd_pcm_limit_hw_rates(runtime);
1770 snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
Takashi Iwai52409aa2012-01-23 17:10:24 +01001771 if (chip->align_buffer_size)
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001772 /* constrain buffer sizes to be multiple of 128
1773 bytes. This is more efficient in terms of memory
1774 access but isn't required by the HDA spec and
1775 prevents users from specifying exact period/buffer
1776 sizes. For example for 44.1kHz, a period size set
1777 to 20ms will be rounded to 19.59ms. */
1778 buff_step = 128;
1779 else
1780 /* Don't enforce steps on buffer sizes, still need to
1781 be multiple of 4 bytes (HDA spec). Tested on Intel
1782 HDA controllers, may not work on all devices where
1783 option needs to be disabled */
1784 buff_step = 4;
1785
Joachim Deguara5f1545b2007-03-16 15:01:36 +01001786 snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001787 buff_step);
Joachim Deguara5f1545b2007-03-16 15:01:36 +01001788 snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001789 buff_step);
Dylan Reidb4a91cf2012-06-15 19:36:23 -07001790 snd_hda_power_up_d3wait(apcm->codec);
Takashi Iwaid01ce992007-07-27 16:52:19 +02001791 err = hinfo->ops.open(hinfo, apcm->codec, substream);
1792 if (err < 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001793 azx_release_device(azx_dev);
Takashi Iwaicb53c622007-08-10 17:21:45 +02001794 snd_hda_power_down(apcm->codec);
Ingo Molnar62932df2006-01-16 16:34:20 +01001795 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001796 return err;
1797 }
Takashi Iwai70d321e2009-07-03 23:06:45 +02001798 snd_pcm_limit_hw_rates(runtime);
Takashi Iwaiaba66532009-07-05 11:44:46 +02001799 /* sanity check */
1800 if (snd_BUG_ON(!runtime->hw.channels_min) ||
1801 snd_BUG_ON(!runtime->hw.channels_max) ||
1802 snd_BUG_ON(!runtime->hw.formats) ||
1803 snd_BUG_ON(!runtime->hw.rates)) {
1804 azx_release_device(azx_dev);
1805 hinfo->ops.close(hinfo, apcm->codec, substream);
1806 snd_hda_power_down(apcm->codec);
1807 mutex_unlock(&chip->open_mutex);
1808 return -EINVAL;
1809 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001810 spin_lock_irqsave(&chip->reg_lock, flags);
1811 azx_dev->substream = substream;
1812 azx_dev->running = 0;
1813 spin_unlock_irqrestore(&chip->reg_lock, flags);
1814
1815 runtime->private_data = azx_dev;
Takashi Iwai850f0e52008-03-18 17:11:05 +01001816 snd_pcm_set_sync(substream);
Ingo Molnar62932df2006-01-16 16:34:20 +01001817 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001818 return 0;
1819}
1820
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001821static int azx_pcm_close(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001822{
1823 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1824 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001825 struct azx *chip = apcm->chip;
1826 struct azx_dev *azx_dev = get_azx_dev(substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001827 unsigned long flags;
1828
Ingo Molnar62932df2006-01-16 16:34:20 +01001829 mutex_lock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001830 spin_lock_irqsave(&chip->reg_lock, flags);
1831 azx_dev->substream = NULL;
1832 azx_dev->running = 0;
1833 spin_unlock_irqrestore(&chip->reg_lock, flags);
1834 azx_release_device(azx_dev);
1835 hinfo->ops.close(hinfo, apcm->codec, substream);
Takashi Iwaicb53c622007-08-10 17:21:45 +02001836 snd_hda_power_down(apcm->codec);
Ingo Molnar62932df2006-01-16 16:34:20 +01001837 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001838 return 0;
1839}
1840
Takashi Iwaid01ce992007-07-27 16:52:19 +02001841static int azx_pcm_hw_params(struct snd_pcm_substream *substream,
1842 struct snd_pcm_hw_params *hw_params)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001843{
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001844 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1845 struct azx *chip = apcm->chip;
1846 struct snd_pcm_runtime *runtime = substream->runtime;
Takashi Iwai97b71c92009-03-18 15:09:13 +01001847 struct azx_dev *azx_dev = get_azx_dev(substream);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001848 int ret;
Takashi Iwai97b71c92009-03-18 15:09:13 +01001849
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001850 mark_runtime_wc(chip, azx_dev, runtime, false);
Takashi Iwai97b71c92009-03-18 15:09:13 +01001851 azx_dev->bufsize = 0;
1852 azx_dev->period_bytes = 0;
1853 azx_dev->format_val = 0;
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001854 ret = snd_pcm_lib_malloc_pages(substream,
Takashi Iwaid01ce992007-07-27 16:52:19 +02001855 params_buffer_bytes(hw_params));
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001856 if (ret < 0)
1857 return ret;
1858 mark_runtime_wc(chip, azx_dev, runtime, true);
1859 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001860}
1861
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001862static int azx_pcm_hw_free(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001863{
1864 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001865 struct azx_dev *azx_dev = get_azx_dev(substream);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001866 struct azx *chip = apcm->chip;
1867 struct snd_pcm_runtime *runtime = substream->runtime;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001868 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
1869
1870 /* reset BDL address */
1871 azx_sd_writel(azx_dev, SD_BDLPL, 0);
1872 azx_sd_writel(azx_dev, SD_BDLPU, 0);
1873 azx_sd_writel(azx_dev, SD_CTL, 0);
Takashi Iwai97b71c92009-03-18 15:09:13 +01001874 azx_dev->bufsize = 0;
1875 azx_dev->period_bytes = 0;
1876 azx_dev->format_val = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001877
Takashi Iwaieb541332010-08-06 13:48:11 +02001878 snd_hda_codec_cleanup(apcm->codec, hinfo, substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001879
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001880 mark_runtime_wc(chip, azx_dev, runtime, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001881 return snd_pcm_lib_free_pages(substream);
1882}
1883
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001884static int azx_pcm_prepare(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001885{
1886 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001887 struct azx *chip = apcm->chip;
1888 struct azx_dev *azx_dev = get_azx_dev(substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001889 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001890 struct snd_pcm_runtime *runtime = substream->runtime;
Takashi Iwai62b7e5e2010-10-22 17:15:47 +02001891 unsigned int bufsize, period_bytes, format_val, stream_tag;
Takashi Iwai97b71c92009-03-18 15:09:13 +01001892 int err;
Stephen Warren7c9359762011-06-01 11:14:17 -06001893 struct hda_spdif_out *spdif =
1894 snd_hda_spdif_out_of_nid(apcm->codec, hinfo->nid);
1895 unsigned short ctls = spdif ? spdif->ctls : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001896
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001897 azx_stream_reset(chip, azx_dev);
Takashi Iwai97b71c92009-03-18 15:09:13 +01001898 format_val = snd_hda_calc_stream_format(runtime->rate,
1899 runtime->channels,
1900 runtime->format,
Anssi Hannula32c168c2010-08-03 13:28:57 +03001901 hinfo->maxbps,
Stephen Warren7c9359762011-06-01 11:14:17 -06001902 ctls);
Takashi Iwai97b71c92009-03-18 15:09:13 +01001903 if (!format_val) {
Takashi Iwaid01ce992007-07-27 16:52:19 +02001904 snd_printk(KERN_ERR SFX
1905 "invalid format_val, rate=%d, ch=%d, format=%d\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001906 runtime->rate, runtime->channels, runtime->format);
1907 return -EINVAL;
1908 }
1909
Takashi Iwai97b71c92009-03-18 15:09:13 +01001910 bufsize = snd_pcm_lib_buffer_bytes(substream);
1911 period_bytes = snd_pcm_lib_period_bytes(substream);
1912
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001913 snd_printdd(SFX "azx_pcm_prepare: bufsize=0x%x, format=0x%x\n",
Takashi Iwai97b71c92009-03-18 15:09:13 +01001914 bufsize, format_val);
1915
1916 if (bufsize != azx_dev->bufsize ||
1917 period_bytes != azx_dev->period_bytes ||
1918 format_val != azx_dev->format_val) {
1919 azx_dev->bufsize = bufsize;
1920 azx_dev->period_bytes = period_bytes;
1921 azx_dev->format_val = format_val;
1922 err = azx_setup_periods(chip, substream, azx_dev);
1923 if (err < 0)
1924 return err;
1925 }
1926
Jaroslav Kyselae5463722010-05-11 10:21:46 +02001927 /* wallclk has 24Mhz clock source */
1928 azx_dev->period_wallclk = (((runtime->period_size * 24000) /
1929 runtime->rate) * 1000);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001930 azx_setup_controller(chip, azx_dev);
1931 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
1932 azx_dev->fifo_size = azx_sd_readw(azx_dev, SD_FIFOSIZE) + 1;
1933 else
1934 azx_dev->fifo_size = 0;
1935
Takashi Iwai62b7e5e2010-10-22 17:15:47 +02001936 stream_tag = azx_dev->stream_tag;
1937 /* CA-IBG chips need the playback stream starting from 1 */
Takashi Iwai9477c582011-05-25 09:11:37 +02001938 if ((chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND) &&
Takashi Iwai62b7e5e2010-10-22 17:15:47 +02001939 stream_tag > chip->capture_streams)
1940 stream_tag -= chip->capture_streams;
1941 return snd_hda_codec_prepare(apcm->codec, hinfo, stream_tag,
Takashi Iwaieb541332010-08-06 13:48:11 +02001942 azx_dev->format_val, substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001943}
1944
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001945static int azx_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001946{
1947 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001948 struct azx *chip = apcm->chip;
Takashi Iwai850f0e52008-03-18 17:11:05 +01001949 struct azx_dev *azx_dev;
1950 struct snd_pcm_substream *s;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001951 int rstart = 0, start, nsync = 0, sbits = 0;
Takashi Iwai850f0e52008-03-18 17:11:05 +01001952 int nwait, timeout;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001953
Linus Torvalds1da177e2005-04-16 15:20:36 -07001954 switch (cmd) {
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001955 case SNDRV_PCM_TRIGGER_START:
1956 rstart = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001957 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
1958 case SNDRV_PCM_TRIGGER_RESUME:
Takashi Iwai850f0e52008-03-18 17:11:05 +01001959 start = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001960 break;
1961 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
Jaroslav Kysela47123192005-08-15 20:53:07 +02001962 case SNDRV_PCM_TRIGGER_SUSPEND:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001963 case SNDRV_PCM_TRIGGER_STOP:
Takashi Iwai850f0e52008-03-18 17:11:05 +01001964 start = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001965 break;
1966 default:
Takashi Iwai850f0e52008-03-18 17:11:05 +01001967 return -EINVAL;
1968 }
1969
1970 snd_pcm_group_for_each_entry(s, substream) {
1971 if (s->pcm->card != substream->pcm->card)
1972 continue;
1973 azx_dev = get_azx_dev(s);
1974 sbits |= 1 << azx_dev->index;
1975 nsync++;
1976 snd_pcm_trigger_done(s, substream);
1977 }
1978
1979 spin_lock(&chip->reg_lock);
1980 if (nsync > 1) {
1981 /* first, set SYNC bits of corresponding streams */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02001982 if (chip->driver_caps & AZX_DCAPS_OLD_SSYNC)
1983 azx_writel(chip, OLD_SSYNC,
1984 azx_readl(chip, OLD_SSYNC) | sbits);
1985 else
1986 azx_writel(chip, SSYNC, azx_readl(chip, SSYNC) | sbits);
Takashi Iwai850f0e52008-03-18 17:11:05 +01001987 }
1988 snd_pcm_group_for_each_entry(s, substream) {
1989 if (s->pcm->card != substream->pcm->card)
1990 continue;
1991 azx_dev = get_azx_dev(s);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02001992 if (start) {
1993 azx_dev->start_wallclk = azx_readl(chip, WALLCLK);
1994 if (!rstart)
1995 azx_dev->start_wallclk -=
1996 azx_dev->period_wallclk;
Takashi Iwai850f0e52008-03-18 17:11:05 +01001997 azx_stream_start(chip, azx_dev);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02001998 } else {
Takashi Iwai850f0e52008-03-18 17:11:05 +01001999 azx_stream_stop(chip, azx_dev);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002000 }
Takashi Iwai850f0e52008-03-18 17:11:05 +01002001 azx_dev->running = start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002002 }
2003 spin_unlock(&chip->reg_lock);
Takashi Iwai850f0e52008-03-18 17:11:05 +01002004 if (start) {
2005 if (nsync == 1)
2006 return 0;
2007 /* wait until all FIFOs get ready */
2008 for (timeout = 5000; timeout; timeout--) {
2009 nwait = 0;
2010 snd_pcm_group_for_each_entry(s, substream) {
2011 if (s->pcm->card != substream->pcm->card)
2012 continue;
2013 azx_dev = get_azx_dev(s);
2014 if (!(azx_sd_readb(azx_dev, SD_STS) &
2015 SD_STS_FIFO_READY))
2016 nwait++;
2017 }
2018 if (!nwait)
2019 break;
2020 cpu_relax();
2021 }
2022 } else {
2023 /* wait until all RUN bits are cleared */
2024 for (timeout = 5000; timeout; timeout--) {
2025 nwait = 0;
2026 snd_pcm_group_for_each_entry(s, substream) {
2027 if (s->pcm->card != substream->pcm->card)
2028 continue;
2029 azx_dev = get_azx_dev(s);
2030 if (azx_sd_readb(azx_dev, SD_CTL) &
2031 SD_CTL_DMA_START)
2032 nwait++;
2033 }
2034 if (!nwait)
2035 break;
2036 cpu_relax();
2037 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002038 }
Takashi Iwai850f0e52008-03-18 17:11:05 +01002039 if (nsync > 1) {
2040 spin_lock(&chip->reg_lock);
2041 /* reset SYNC bits */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02002042 if (chip->driver_caps & AZX_DCAPS_OLD_SSYNC)
2043 azx_writel(chip, OLD_SSYNC,
2044 azx_readl(chip, OLD_SSYNC) & ~sbits);
2045 else
2046 azx_writel(chip, SSYNC, azx_readl(chip, SSYNC) & ~sbits);
Takashi Iwai850f0e52008-03-18 17:11:05 +01002047 spin_unlock(&chip->reg_lock);
2048 }
2049 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002050}
2051
Joseph Chan0e153472008-08-26 14:38:03 +02002052/* get the current DMA position with correction on VIA chips */
2053static unsigned int azx_via_get_position(struct azx *chip,
2054 struct azx_dev *azx_dev)
2055{
2056 unsigned int link_pos, mini_pos, bound_pos;
2057 unsigned int mod_link_pos, mod_dma_pos, mod_mini_pos;
2058 unsigned int fifo_size;
2059
2060 link_pos = azx_sd_readl(azx_dev, SD_LPIB);
Takashi Iwaib4a655e2011-06-07 12:26:56 +02002061 if (azx_dev->substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
Joseph Chan0e153472008-08-26 14:38:03 +02002062 /* Playback, no problem using link position */
2063 return link_pos;
2064 }
2065
2066 /* Capture */
2067 /* For new chipset,
2068 * use mod to get the DMA position just like old chipset
2069 */
2070 mod_dma_pos = le32_to_cpu(*azx_dev->posbuf);
2071 mod_dma_pos %= azx_dev->period_bytes;
2072
2073 /* azx_dev->fifo_size can't get FIFO size of in stream.
2074 * Get from base address + offset.
2075 */
2076 fifo_size = readw(chip->remap_addr + VIA_IN_STREAM0_FIFO_SIZE_OFFSET);
2077
2078 if (azx_dev->insufficient) {
2079 /* Link position never gather than FIFO size */
2080 if (link_pos <= fifo_size)
2081 return 0;
2082
2083 azx_dev->insufficient = 0;
2084 }
2085
2086 if (link_pos <= fifo_size)
2087 mini_pos = azx_dev->bufsize + link_pos - fifo_size;
2088 else
2089 mini_pos = link_pos - fifo_size;
2090
2091 /* Find nearest previous boudary */
2092 mod_mini_pos = mini_pos % azx_dev->period_bytes;
2093 mod_link_pos = link_pos % azx_dev->period_bytes;
2094 if (mod_link_pos >= fifo_size)
2095 bound_pos = link_pos - mod_link_pos;
2096 else if (mod_dma_pos >= mod_mini_pos)
2097 bound_pos = mini_pos - mod_mini_pos;
2098 else {
2099 bound_pos = mini_pos - mod_mini_pos + azx_dev->period_bytes;
2100 if (bound_pos >= azx_dev->bufsize)
2101 bound_pos = 0;
2102 }
2103
2104 /* Calculate real DMA position we want */
2105 return bound_pos + mod_dma_pos;
2106}
2107
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002108static unsigned int azx_get_position(struct azx *chip,
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002109 struct azx_dev *azx_dev,
2110 bool with_check)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002111{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002112 unsigned int pos;
David Henningsson4cb36312010-09-30 10:12:50 +02002113 int stream = azx_dev->substream->stream;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002114
David Henningsson4cb36312010-09-30 10:12:50 +02002115 switch (chip->position_fix[stream]) {
2116 case POS_FIX_LPIB:
2117 /* read LPIB */
2118 pos = azx_sd_readl(azx_dev, SD_LPIB);
2119 break;
2120 case POS_FIX_VIACOMBO:
Joseph Chan0e153472008-08-26 14:38:03 +02002121 pos = azx_via_get_position(chip, azx_dev);
David Henningsson4cb36312010-09-30 10:12:50 +02002122 break;
2123 default:
2124 /* use the position buffer */
2125 pos = le32_to_cpu(*azx_dev->posbuf);
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002126 if (with_check && chip->position_fix[stream] == POS_FIX_AUTO) {
Takashi Iwaia8103642011-06-07 12:23:23 +02002127 if (!pos || pos == (u32)-1) {
2128 printk(KERN_WARNING
2129 "hda-intel: Invalid position buffer, "
2130 "using LPIB read method instead.\n");
2131 chip->position_fix[stream] = POS_FIX_LPIB;
2132 pos = azx_sd_readl(azx_dev, SD_LPIB);
2133 } else
2134 chip->position_fix[stream] = POS_FIX_POSBUF;
2135 }
2136 break;
Takashi Iwaic74db862005-05-12 14:26:27 +02002137 }
David Henningsson4cb36312010-09-30 10:12:50 +02002138
Linus Torvalds1da177e2005-04-16 15:20:36 -07002139 if (pos >= azx_dev->bufsize)
2140 pos = 0;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002141 return pos;
2142}
2143
2144static snd_pcm_uframes_t azx_pcm_pointer(struct snd_pcm_substream *substream)
2145{
2146 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2147 struct azx *chip = apcm->chip;
2148 struct azx_dev *azx_dev = get_azx_dev(substream);
2149 return bytes_to_frames(substream->runtime,
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002150 azx_get_position(chip, azx_dev, false));
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002151}
2152
2153/*
2154 * Check whether the current DMA position is acceptable for updating
2155 * periods. Returns non-zero if it's OK.
2156 *
2157 * Many HD-audio controllers appear pretty inaccurate about
2158 * the update-IRQ timing. The IRQ is issued before actually the
2159 * data is processed. So, we need to process it afterwords in a
2160 * workqueue.
2161 */
2162static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev)
2163{
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002164 u32 wallclk;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002165 unsigned int pos;
Shahin Ghazinouribeaffc32010-05-11 08:19:55 +02002166 int stream;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002167
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002168 wallclk = azx_readl(chip, WALLCLK) - azx_dev->start_wallclk;
2169 if (wallclk < (azx_dev->period_wallclk * 2) / 3)
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002170 return -1; /* bogus (too early) interrupt */
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002171
Shahin Ghazinouribeaffc32010-05-11 08:19:55 +02002172 stream = azx_dev->substream->stream;
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002173 pos = azx_get_position(chip, azx_dev, true);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002174
Takashi Iwaid6d8bf52010-02-12 18:17:06 +01002175 if (WARN_ONCE(!azx_dev->period_bytes,
2176 "hda-intel: zero azx_dev->period_bytes"))
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002177 return -1; /* this shouldn't happen! */
Jaroslav Kyselaedb39932010-06-02 13:29:17 +02002178 if (wallclk < (azx_dev->period_wallclk * 5) / 4 &&
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002179 pos % azx_dev->period_bytes > azx_dev->period_bytes / 2)
2180 /* NG - it's below the first next period boundary */
2181 return bdl_pos_adj[chip->dev_index] ? 0 : -1;
Jaroslav Kyselaedb39932010-06-02 13:29:17 +02002182 azx_dev->start_wallclk += wallclk;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002183 return 1; /* OK, it's fine */
2184}
2185
2186/*
2187 * The work for pending PCM period updates.
2188 */
2189static void azx_irq_pending_work(struct work_struct *work)
2190{
2191 struct azx *chip = container_of(work, struct azx, irq_pending_work);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002192 int i, pending, ok;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002193
Takashi Iwaia6a950a2008-06-10 17:53:35 +02002194 if (!chip->irq_pending_warned) {
2195 printk(KERN_WARNING
2196 "hda-intel: IRQ timing workaround is activated "
2197 "for card #%d. Suggest a bigger bdl_pos_adj.\n",
2198 chip->card->number);
2199 chip->irq_pending_warned = 1;
2200 }
2201
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002202 for (;;) {
2203 pending = 0;
2204 spin_lock_irq(&chip->reg_lock);
2205 for (i = 0; i < chip->num_streams; i++) {
2206 struct azx_dev *azx_dev = &chip->azx_dev[i];
2207 if (!azx_dev->irq_pending ||
2208 !azx_dev->substream ||
2209 !azx_dev->running)
2210 continue;
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002211 ok = azx_position_ok(chip, azx_dev);
2212 if (ok > 0) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002213 azx_dev->irq_pending = 0;
2214 spin_unlock(&chip->reg_lock);
2215 snd_pcm_period_elapsed(azx_dev->substream);
2216 spin_lock(&chip->reg_lock);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002217 } else if (ok < 0) {
2218 pending = 0; /* too early */
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002219 } else
2220 pending++;
2221 }
2222 spin_unlock_irq(&chip->reg_lock);
2223 if (!pending)
2224 return;
Takashi Iwai08af4952010-08-03 14:39:04 +02002225 msleep(1);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002226 }
2227}
2228
2229/* clear irq_pending flags and assure no on-going workq */
2230static void azx_clear_irq_pending(struct azx *chip)
2231{
2232 int i;
2233
2234 spin_lock_irq(&chip->reg_lock);
2235 for (i = 0; i < chip->num_streams; i++)
2236 chip->azx_dev[i].irq_pending = 0;
2237 spin_unlock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002238}
2239
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002240#ifdef CONFIG_X86
2241static int azx_pcm_mmap(struct snd_pcm_substream *substream,
2242 struct vm_area_struct *area)
2243{
2244 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2245 struct azx *chip = apcm->chip;
2246 if (!azx_snoop(chip))
2247 area->vm_page_prot = pgprot_writecombine(area->vm_page_prot);
2248 return snd_pcm_lib_default_mmap(substream, area);
2249}
2250#else
2251#define azx_pcm_mmap NULL
2252#endif
2253
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002254static struct snd_pcm_ops azx_pcm_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002255 .open = azx_pcm_open,
2256 .close = azx_pcm_close,
2257 .ioctl = snd_pcm_lib_ioctl,
2258 .hw_params = azx_pcm_hw_params,
2259 .hw_free = azx_pcm_hw_free,
2260 .prepare = azx_pcm_prepare,
2261 .trigger = azx_pcm_trigger,
2262 .pointer = azx_pcm_pointer,
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002263 .mmap = azx_pcm_mmap,
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002264 .page = snd_pcm_sgbuf_ops_page,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002265};
2266
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002267static void azx_pcm_free(struct snd_pcm *pcm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002268{
Takashi Iwai176d5332008-07-30 15:01:44 +02002269 struct azx_pcm *apcm = pcm->private_data;
2270 if (apcm) {
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002271 list_del(&apcm->list);
Takashi Iwai176d5332008-07-30 15:01:44 +02002272 kfree(apcm);
2273 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002274}
2275
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002276#define MAX_PREALLOC_SIZE (32 * 1024 * 1024)
2277
Takashi Iwai176d5332008-07-30 15:01:44 +02002278static int
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002279azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec,
2280 struct hda_pcm *cpcm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002281{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002282 struct azx *chip = bus->private_data;
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002283 struct snd_pcm *pcm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002284 struct azx_pcm *apcm;
Takashi Iwai176d5332008-07-30 15:01:44 +02002285 int pcm_dev = cpcm->device;
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002286 unsigned int size;
Takashi Iwai176d5332008-07-30 15:01:44 +02002287 int s, err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002288
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002289 list_for_each_entry(apcm, &chip->pcm_list, list) {
2290 if (apcm->pcm->device == pcm_dev) {
2291 snd_printk(KERN_ERR SFX "PCM %d already exists\n", pcm_dev);
2292 return -EBUSY;
2293 }
Takashi Iwai176d5332008-07-30 15:01:44 +02002294 }
2295 err = snd_pcm_new(chip->card, cpcm->name, pcm_dev,
2296 cpcm->stream[SNDRV_PCM_STREAM_PLAYBACK].substreams,
2297 cpcm->stream[SNDRV_PCM_STREAM_CAPTURE].substreams,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002298 &pcm);
2299 if (err < 0)
2300 return err;
Takashi Iwai18cb7102009-04-16 10:22:24 +02002301 strlcpy(pcm->name, cpcm->name, sizeof(pcm->name));
Takashi Iwai176d5332008-07-30 15:01:44 +02002302 apcm = kzalloc(sizeof(*apcm), GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002303 if (apcm == NULL)
2304 return -ENOMEM;
2305 apcm->chip = chip;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002306 apcm->pcm = pcm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002307 apcm->codec = codec;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002308 pcm->private_data = apcm;
2309 pcm->private_free = azx_pcm_free;
Takashi Iwai176d5332008-07-30 15:01:44 +02002310 if (cpcm->pcm_type == HDA_PCM_TYPE_MODEM)
2311 pcm->dev_class = SNDRV_PCM_CLASS_MODEM;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002312 list_add_tail(&apcm->list, &chip->pcm_list);
Takashi Iwai176d5332008-07-30 15:01:44 +02002313 cpcm->pcm = pcm;
2314 for (s = 0; s < 2; s++) {
2315 apcm->hinfo[s] = &cpcm->stream[s];
2316 if (cpcm->stream[s].substreams)
2317 snd_pcm_set_ops(pcm, s, &azx_pcm_ops);
2318 }
2319 /* buffer pre-allocation */
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002320 size = CONFIG_SND_HDA_PREALLOC_SIZE * 1024;
2321 if (size > MAX_PREALLOC_SIZE)
2322 size = MAX_PREALLOC_SIZE;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002323 snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV_SG,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002324 snd_dma_pci_data(chip->pci),
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002325 size, MAX_PREALLOC_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002326 return 0;
2327}
2328
2329/*
2330 * mixer creation - all stuff is implemented in hda module
2331 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002332static int __devinit azx_mixer_create(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002333{
2334 return snd_hda_build_controls(chip->bus);
2335}
2336
2337
2338/*
2339 * initialize SD streams
2340 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002341static int __devinit azx_init_stream(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002342{
2343 int i;
2344
2345 /* initialize each stream (aka device)
Takashi Iwaid01ce992007-07-27 16:52:19 +02002346 * assign the starting bdl address to each stream (device)
2347 * and initialize
Linus Torvalds1da177e2005-04-16 15:20:36 -07002348 */
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002349 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002350 struct azx_dev *azx_dev = &chip->azx_dev[i];
Takashi Iwai929861c2006-08-31 16:55:40 +02002351 azx_dev->posbuf = (u32 __iomem *)(chip->posbuf.area + i * 8);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002352 /* offset: SDI0=0x80, SDI1=0xa0, ... SDO3=0x160 */
2353 azx_dev->sd_addr = chip->remap_addr + (0x20 * i + 0x80);
2354 /* int mask: SDI0=0x01, SDI1=0x02, ... SDO3=0x80 */
2355 azx_dev->sd_int_sta_mask = 1 << i;
2356 /* stream tag: must be non-zero and unique */
2357 azx_dev->index = i;
2358 azx_dev->stream_tag = i + 1;
2359 }
2360
2361 return 0;
2362}
2363
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002364static int azx_acquire_irq(struct azx *chip, int do_disconnect)
2365{
Takashi Iwai437a5a42006-11-21 12:14:23 +01002366 if (request_irq(chip->pci->irq, azx_interrupt,
2367 chip->msi ? 0 : IRQF_SHARED,
Takashi Iwai934c2b62011-06-10 16:36:37 +02002368 KBUILD_MODNAME, chip)) {
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002369 printk(KERN_ERR "hda-intel: unable to grab IRQ %d, "
2370 "disabling device\n", chip->pci->irq);
2371 if (do_disconnect)
2372 snd_card_disconnect(chip->card);
2373 return -1;
2374 }
2375 chip->irq = chip->pci->irq;
Takashi Iwai69e13412006-11-21 12:10:55 +01002376 pci_intx(chip->pci, !chip->msi);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002377 return 0;
2378}
2379
Linus Torvalds1da177e2005-04-16 15:20:36 -07002380
Takashi Iwaicb53c622007-08-10 17:21:45 +02002381static void azx_stop_chip(struct azx *chip)
2382{
Takashi Iwai95e99fd2007-08-13 15:29:04 +02002383 if (!chip->initialized)
Takashi Iwaicb53c622007-08-10 17:21:45 +02002384 return;
2385
2386 /* disable interrupts */
2387 azx_int_disable(chip);
2388 azx_int_clear(chip);
2389
2390 /* disable CORB/RIRB */
2391 azx_free_cmd_io(chip);
2392
2393 /* disable position buffer */
2394 azx_writel(chip, DPLBASE, 0);
2395 azx_writel(chip, DPUBASE, 0);
2396
2397 chip->initialized = 0;
2398}
2399
2400#ifdef CONFIG_SND_HDA_POWER_SAVE
2401/* power-up/down the controller */
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002402static void azx_power_notify(struct hda_bus *bus)
Takashi Iwaicb53c622007-08-10 17:21:45 +02002403{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002404 struct azx *chip = bus->private_data;
Takashi Iwaicb53c622007-08-10 17:21:45 +02002405 struct hda_codec *c;
2406 int power_on = 0;
2407
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002408 list_for_each_entry(c, &bus->codec_list, list) {
Takashi Iwaicb53c622007-08-10 17:21:45 +02002409 if (c->power_on) {
2410 power_on = 1;
2411 break;
2412 }
2413 }
2414 if (power_on)
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01002415 azx_init_chip(chip, 1);
Wu Fengguang0287d972009-12-11 20:15:11 +08002416 else if (chip->running && power_save_controller &&
2417 !bus->power_keep_link_on)
Takashi Iwaicb53c622007-08-10 17:21:45 +02002418 azx_stop_chip(chip);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002419}
Takashi Iwai65fcd412012-08-14 17:13:32 +02002420
2421static DEFINE_MUTEX(card_list_lock);
2422static LIST_HEAD(card_list);
2423
2424static void azx_add_card_list(struct azx *chip)
2425{
2426 mutex_lock(&card_list_lock);
2427 list_add(&chip->list, &card_list);
2428 mutex_unlock(&card_list_lock);
2429}
2430
2431static void azx_del_card_list(struct azx *chip)
2432{
2433 mutex_lock(&card_list_lock);
2434 list_del_init(&chip->list);
2435 mutex_unlock(&card_list_lock);
2436}
2437
2438/* trigger power-save check at writing parameter */
2439static int param_set_xint(const char *val, const struct kernel_param *kp)
2440{
2441 struct azx *chip;
2442 struct hda_codec *c;
2443 int prev = power_save;
2444 int ret = param_set_int(val, kp);
2445
2446 if (ret || prev == power_save)
2447 return ret;
2448
2449 mutex_lock(&card_list_lock);
2450 list_for_each_entry(chip, &card_list, list) {
2451 if (!chip->bus || chip->disabled)
2452 continue;
2453 list_for_each_entry(c, &chip->bus->codec_list, list)
2454 snd_hda_power_sync(c);
2455 }
2456 mutex_unlock(&card_list_lock);
2457 return 0;
2458}
2459#else
2460#define azx_add_card_list(chip) /* NOP */
2461#define azx_del_card_list(chip) /* NOP */
Takashi Iwai5c0b9be2008-12-11 11:47:17 +01002462#endif /* CONFIG_SND_HDA_POWER_SAVE */
2463
Takashi Iwai7ccbde52012-08-14 18:10:09 +02002464#if defined(CONFIG_PM_SLEEP) || defined(SUPPORT_VGA_SWITCHEROO)
Takashi Iwai5c0b9be2008-12-11 11:47:17 +01002465/*
2466 * power management
2467 */
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002468static int azx_suspend(struct device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002469{
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002470 struct pci_dev *pci = to_pci_dev(dev);
2471 struct snd_card *card = dev_get_drvdata(dev);
Takashi Iwai421a1252005-11-17 16:11:09 +01002472 struct azx *chip = card->private_data;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002473 struct azx_pcm *p;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002474
Takashi Iwai421a1252005-11-17 16:11:09 +01002475 snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002476 azx_clear_irq_pending(chip);
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002477 list_for_each_entry(p, &chip->pcm_list, list)
2478 snd_pcm_suspend_all(p->pcm);
Takashi Iwai0b7a2e92007-08-14 15:18:26 +02002479 if (chip->initialized)
Takashi Iwai8dd78332009-06-02 01:16:07 +02002480 snd_hda_suspend(chip->bus);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002481 azx_stop_chip(chip);
Takashi Iwai30b35392006-10-11 18:52:53 +02002482 if (chip->irq >= 0) {
Takashi Iwai43001c92006-09-08 12:30:03 +02002483 free_irq(chip->irq, chip);
Takashi Iwai30b35392006-10-11 18:52:53 +02002484 chip->irq = -1;
2485 }
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002486 if (chip->msi)
Takashi Iwai43001c92006-09-08 12:30:03 +02002487 pci_disable_msi(chip->pci);
Takashi Iwai421a1252005-11-17 16:11:09 +01002488 pci_disable_device(pci);
2489 pci_save_state(pci);
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002490 pci_set_power_state(pci, PCI_D3hot);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002491 return 0;
2492}
2493
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002494static int azx_resume(struct device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002495{
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002496 struct pci_dev *pci = to_pci_dev(dev);
2497 struct snd_card *card = dev_get_drvdata(dev);
Takashi Iwai421a1252005-11-17 16:11:09 +01002498 struct azx *chip = card->private_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002499
Takashi Iwaid14a7e02009-02-16 10:13:03 +01002500 pci_set_power_state(pci, PCI_D0);
2501 pci_restore_state(pci);
Takashi Iwai30b35392006-10-11 18:52:53 +02002502 if (pci_enable_device(pci) < 0) {
2503 printk(KERN_ERR "hda-intel: pci_enable_device failed, "
2504 "disabling device\n");
2505 snd_card_disconnect(card);
2506 return -EIO;
2507 }
2508 pci_set_master(pci);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002509 if (chip->msi)
2510 if (pci_enable_msi(pci) < 0)
2511 chip->msi = 0;
2512 if (azx_acquire_irq(chip, 1) < 0)
Takashi Iwai30b35392006-10-11 18:52:53 +02002513 return -EIO;
Takashi Iwaicb53c622007-08-10 17:21:45 +02002514 azx_init_pci(chip);
Maxim Levitskyd804ad92007-09-03 15:28:04 +02002515
Takashi Iwai7f308302012-05-08 16:52:23 +02002516 azx_init_chip(chip, 1);
Maxim Levitskyd804ad92007-09-03 15:28:04 +02002517
Linus Torvalds1da177e2005-04-16 15:20:36 -07002518 snd_hda_resume(chip->bus);
Takashi Iwai421a1252005-11-17 16:11:09 +01002519 snd_power_change_state(card, SNDRV_CTL_POWER_D0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002520 return 0;
2521}
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002522static SIMPLE_DEV_PM_OPS(azx_pm, azx_suspend, azx_resume);
2523#define AZX_PM_OPS &azx_pm
2524#else
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002525#define AZX_PM_OPS NULL
Takashi Iwai7ccbde52012-08-14 18:10:09 +02002526#endif /* CONFIG_PM_SLEEP || SUPPORT_VGA_SWITCHEROO */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002527
2528
2529/*
Takashi Iwai0cbf0092008-10-29 16:18:25 +01002530 * reboot notifier for hang-up problem at power-down
2531 */
2532static int azx_halt(struct notifier_block *nb, unsigned long event, void *buf)
2533{
2534 struct azx *chip = container_of(nb, struct azx, reboot_notifier);
Takashi Iwaifb8d1a32009-11-10 16:02:29 +01002535 snd_hda_bus_reboot_notify(chip->bus);
Takashi Iwai0cbf0092008-10-29 16:18:25 +01002536 azx_stop_chip(chip);
2537 return NOTIFY_OK;
2538}
2539
2540static void azx_notifier_register(struct azx *chip)
2541{
2542 chip->reboot_notifier.notifier_call = azx_halt;
2543 register_reboot_notifier(&chip->reboot_notifier);
2544}
2545
2546static void azx_notifier_unregister(struct azx *chip)
2547{
2548 if (chip->reboot_notifier.notifier_call)
2549 unregister_reboot_notifier(&chip->reboot_notifier);
2550}
2551
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002552static int DELAYED_INIT_MARK azx_first_init(struct azx *chip);
2553static int DELAYED_INIT_MARK azx_probe_continue(struct azx *chip);
2554
Steven Newbury8393ec4a2012-06-08 13:06:29 +02002555#ifdef SUPPORT_VGA_SWITCHEROO
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002556static struct pci_dev __devinit *get_bound_vga(struct pci_dev *pci);
2557
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002558static void azx_vs_set_state(struct pci_dev *pci,
2559 enum vga_switcheroo_state state)
2560{
2561 struct snd_card *card = pci_get_drvdata(pci);
2562 struct azx *chip = card->private_data;
2563 bool disabled;
2564
2565 if (chip->init_failed)
2566 return;
2567
2568 disabled = (state == VGA_SWITCHEROO_OFF);
2569 if (chip->disabled == disabled)
2570 return;
2571
2572 if (!chip->bus) {
2573 chip->disabled = disabled;
2574 if (!disabled) {
2575 snd_printk(KERN_INFO SFX
2576 "%s: Start delayed initialization\n",
2577 pci_name(chip->pci));
2578 if (azx_first_init(chip) < 0 ||
2579 azx_probe_continue(chip) < 0) {
2580 snd_printk(KERN_ERR SFX
2581 "%s: initialization error\n",
2582 pci_name(chip->pci));
2583 chip->init_failed = true;
2584 }
2585 }
2586 } else {
2587 snd_printk(KERN_INFO SFX
2588 "%s %s via VGA-switcheroo\n",
2589 disabled ? "Disabling" : "Enabling",
2590 pci_name(chip->pci));
2591 if (disabled) {
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002592 azx_suspend(&pci->dev);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002593 chip->disabled = true;
2594 snd_hda_lock_devices(chip->bus);
2595 } else {
2596 snd_hda_unlock_devices(chip->bus);
2597 chip->disabled = false;
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002598 azx_resume(&pci->dev);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002599 }
2600 }
2601}
2602
2603static bool azx_vs_can_switch(struct pci_dev *pci)
2604{
2605 struct snd_card *card = pci_get_drvdata(pci);
2606 struct azx *chip = card->private_data;
2607
2608 if (chip->init_failed)
2609 return false;
2610 if (chip->disabled || !chip->bus)
2611 return true;
2612 if (snd_hda_lock_devices(chip->bus))
2613 return false;
2614 snd_hda_unlock_devices(chip->bus);
2615 return true;
2616}
2617
2618static void __devinit init_vga_switcheroo(struct azx *chip)
2619{
2620 struct pci_dev *p = get_bound_vga(chip->pci);
2621 if (p) {
2622 snd_printk(KERN_INFO SFX
2623 "%s: Handle VGA-switcheroo audio client\n",
2624 pci_name(chip->pci));
2625 chip->use_vga_switcheroo = 1;
2626 pci_dev_put(p);
2627 }
2628}
2629
2630static const struct vga_switcheroo_client_ops azx_vs_ops = {
2631 .set_gpu_state = azx_vs_set_state,
2632 .can_switch = azx_vs_can_switch,
2633};
2634
2635static int __devinit register_vga_switcheroo(struct azx *chip)
2636{
2637 if (!chip->use_vga_switcheroo)
2638 return 0;
2639 /* FIXME: currently only handling DIS controller
2640 * is there any machine with two switchable HDMI audio controllers?
2641 */
2642 return vga_switcheroo_register_audio_client(chip->pci, &azx_vs_ops,
2643 VGA_SWITCHEROO_DIS,
2644 chip->bus != NULL);
2645}
2646#else
2647#define init_vga_switcheroo(chip) /* NOP */
2648#define register_vga_switcheroo(chip) 0
Steven Newbury8393ec4a2012-06-08 13:06:29 +02002649#define check_hdmi_disabled(pci) false
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002650#endif /* SUPPORT_VGA_SWITCHER */
2651
Takashi Iwai0cbf0092008-10-29 16:18:25 +01002652/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002653 * destructor
2654 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002655static int azx_free(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002656{
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002657 int i;
2658
Takashi Iwai65fcd412012-08-14 17:13:32 +02002659 azx_del_card_list(chip);
2660
Takashi Iwai0cbf0092008-10-29 16:18:25 +01002661 azx_notifier_unregister(chip);
2662
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002663 if (use_vga_switcheroo(chip)) {
2664 if (chip->disabled && chip->bus)
2665 snd_hda_unlock_devices(chip->bus);
2666 vga_switcheroo_unregister_client(chip->pci);
2667 }
2668
Takashi Iwaice43fba2005-05-30 20:33:44 +02002669 if (chip->initialized) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002670 azx_clear_irq_pending(chip);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002671 for (i = 0; i < chip->num_streams; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002672 azx_stream_stop(chip, &chip->azx_dev[i]);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002673 azx_stop_chip(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002674 }
2675
Jeff Garzikf000fd82008-04-22 13:50:34 +02002676 if (chip->irq >= 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002677 free_irq(chip->irq, (void*)chip);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002678 if (chip->msi)
Takashi Iwai30b35392006-10-11 18:52:53 +02002679 pci_disable_msi(chip->pci);
Takashi Iwaif079c252006-06-01 11:42:14 +02002680 if (chip->remap_addr)
2681 iounmap(chip->remap_addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002682
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002683 if (chip->azx_dev) {
2684 for (i = 0; i < chip->num_streams; i++)
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002685 if (chip->azx_dev[i].bdl.area) {
2686 mark_pages_wc(chip, &chip->azx_dev[i].bdl, false);
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002687 snd_dma_free_pages(&chip->azx_dev[i].bdl);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002688 }
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002689 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002690 if (chip->rb.area) {
2691 mark_pages_wc(chip, &chip->rb, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002692 snd_dma_free_pages(&chip->rb);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002693 }
2694 if (chip->posbuf.area) {
2695 mark_pages_wc(chip, &chip->posbuf, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002696 snd_dma_free_pages(&chip->posbuf);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002697 }
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002698 if (chip->region_requested)
2699 pci_release_regions(chip->pci);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002700 pci_disable_device(chip->pci);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002701 kfree(chip->azx_dev);
Takashi Iwai4918cda2012-08-09 12:33:28 +02002702#ifdef CONFIG_SND_HDA_PATCH_LOADER
2703 if (chip->fw)
2704 release_firmware(chip->fw);
2705#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07002706 kfree(chip);
2707
2708 return 0;
2709}
2710
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002711static int azx_dev_free(struct snd_device *device)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002712{
2713 return azx_free(device->device_data);
2714}
2715
Steven Newbury8393ec4a2012-06-08 13:06:29 +02002716#ifdef SUPPORT_VGA_SWITCHEROO
Linus Torvalds1da177e2005-04-16 15:20:36 -07002717/*
Takashi Iwai91219472012-04-26 12:13:25 +02002718 * Check of disabled HDMI controller by vga-switcheroo
2719 */
2720static struct pci_dev __devinit *get_bound_vga(struct pci_dev *pci)
2721{
2722 struct pci_dev *p;
2723
2724 /* check only discrete GPU */
2725 switch (pci->vendor) {
2726 case PCI_VENDOR_ID_ATI:
2727 case PCI_VENDOR_ID_AMD:
2728 case PCI_VENDOR_ID_NVIDIA:
2729 if (pci->devfn == 1) {
2730 p = pci_get_domain_bus_and_slot(pci_domain_nr(pci->bus),
2731 pci->bus->number, 0);
2732 if (p) {
2733 if ((p->class >> 8) == PCI_CLASS_DISPLAY_VGA)
2734 return p;
2735 pci_dev_put(p);
2736 }
2737 }
2738 break;
2739 }
2740 return NULL;
2741}
2742
2743static bool __devinit check_hdmi_disabled(struct pci_dev *pci)
2744{
2745 bool vga_inactive = false;
2746 struct pci_dev *p = get_bound_vga(pci);
2747
2748 if (p) {
Takashi Iwai12b78a72012-06-07 12:15:16 +02002749 if (vga_switcheroo_get_client_state(p) == VGA_SWITCHEROO_OFF)
Takashi Iwai91219472012-04-26 12:13:25 +02002750 vga_inactive = true;
2751 pci_dev_put(p);
2752 }
2753 return vga_inactive;
2754}
Steven Newbury8393ec4a2012-06-08 13:06:29 +02002755#endif /* SUPPORT_VGA_SWITCHEROO */
Takashi Iwai91219472012-04-26 12:13:25 +02002756
2757/*
Takashi Iwai3372a152007-02-01 15:46:50 +01002758 * white/black-listing for position_fix
2759 */
Ralf Baechle623ec042007-03-13 15:29:47 +01002760static struct snd_pci_quirk position_fix_list[] __devinitdata = {
Takashi Iwaid2e1c972008-06-10 17:53:34 +02002761 SND_PCI_QUIRK(0x1028, 0x01cc, "Dell D820", POS_FIX_LPIB),
2762 SND_PCI_QUIRK(0x1028, 0x01de, "Dell Precision 390", POS_FIX_LPIB),
Takashi Iwai2f703e72009-12-01 14:17:37 +01002763 SND_PCI_QUIRK(0x103c, 0x306d, "HP dv3", POS_FIX_LPIB),
Takashi Iwaid2e1c972008-06-10 17:53:34 +02002764 SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB),
Daniel T Chendd37f8e2010-05-30 01:17:03 -04002765 SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS", POS_FIX_LPIB),
Daniel T Chen9f75c1b2010-05-30 13:08:41 -04002766 SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS M2V", POS_FIX_LPIB),
Daniel T Chene96d3122010-05-27 18:32:18 -04002767 SND_PCI_QUIRK(0x104d, 0x9069, "Sony VPCS11V9E", POS_FIX_LPIB),
David Henningssonb01de4f2012-01-12 16:31:14 +01002768 SND_PCI_QUIRK(0x10de, 0xcb89, "Macbook Pro 7,1", POS_FIX_LPIB),
Daniel T Chen61bb42c2010-05-29 11:04:11 -04002769 SND_PCI_QUIRK(0x1297, 0x3166, "Shuttle", POS_FIX_LPIB),
Daniel T Chen9ec8dda2010-03-28 02:34:40 -04002770 SND_PCI_QUIRK(0x1458, 0xa022, "ga-ma770-ud3", POS_FIX_LPIB),
Takashi Iwai45d4ebf2009-11-30 11:58:30 +01002771 SND_PCI_QUIRK(0x1462, 0x1002, "MSI Wind U115", POS_FIX_LPIB),
Takashi Iwai8815cd02010-04-15 09:02:41 +02002772 SND_PCI_QUIRK(0x1565, 0x8218, "Biostar Microtech", POS_FIX_LPIB),
Daniel T Chenb90c0762010-05-30 19:31:41 -04002773 SND_PCI_QUIRK(0x1849, 0x0888, "775Dual-VSTA", POS_FIX_LPIB),
Daniel T Chen0e0280d2010-04-21 19:55:43 -04002774 SND_PCI_QUIRK(0x8086, 0x2503, "DG965OT AAD63733-203", POS_FIX_LPIB),
Takashi Iwai3372a152007-02-01 15:46:50 +01002775 {}
2776};
2777
2778static int __devinit check_position_fix(struct azx *chip, int fix)
2779{
2780 const struct snd_pci_quirk *q;
2781
Takashi Iwaic673ba12009-03-17 07:49:14 +01002782 switch (fix) {
2783 case POS_FIX_LPIB:
2784 case POS_FIX_POSBUF:
David Henningsson4cb36312010-09-30 10:12:50 +02002785 case POS_FIX_VIACOMBO:
Takashi Iwaia6f2fd52012-02-28 11:58:40 +01002786 case POS_FIX_COMBO:
Takashi Iwaic673ba12009-03-17 07:49:14 +01002787 return fix;
2788 }
2789
Takashi Iwaic673ba12009-03-17 07:49:14 +01002790 q = snd_pci_quirk_lookup(chip->pci, position_fix_list);
2791 if (q) {
2792 printk(KERN_INFO
2793 "hda_intel: position_fix set to %d "
2794 "for device %04x:%04x\n",
2795 q->value, q->subvendor, q->subdevice);
2796 return q->value;
Takashi Iwai3372a152007-02-01 15:46:50 +01002797 }
David Henningssonbdd9ef22010-10-04 12:02:14 +02002798
2799 /* Check VIA/ATI HD Audio Controller exist */
Takashi Iwai9477c582011-05-25 09:11:37 +02002800 if (chip->driver_caps & AZX_DCAPS_POSFIX_VIA) {
2801 snd_printd(SFX "Using VIACOMBO position fix\n");
David Henningssonbdd9ef22010-10-04 12:02:14 +02002802 return POS_FIX_VIACOMBO;
2803 }
Takashi Iwai9477c582011-05-25 09:11:37 +02002804 if (chip->driver_caps & AZX_DCAPS_POSFIX_LPIB) {
2805 snd_printd(SFX "Using LPIB position fix\n");
2806 return POS_FIX_LPIB;
2807 }
Seth Heasleyc20c5a82012-06-14 14:23:53 -07002808 if (chip->driver_caps & AZX_DCAPS_POSFIX_COMBO) {
2809 snd_printd(SFX "Using COMBO position fix\n");
2810 return POS_FIX_COMBO;
2811 }
Takashi Iwaic673ba12009-03-17 07:49:14 +01002812 return POS_FIX_AUTO;
Takashi Iwai3372a152007-02-01 15:46:50 +01002813}
2814
2815/*
Takashi Iwai669ba272007-08-17 09:17:36 +02002816 * black-lists for probe_mask
2817 */
2818static struct snd_pci_quirk probe_mask_list[] __devinitdata = {
2819 /* Thinkpad often breaks the controller communication when accessing
2820 * to the non-working (or non-existing) modem codec slot.
2821 */
2822 SND_PCI_QUIRK(0x1014, 0x05b7, "Thinkpad Z60", 0x01),
2823 SND_PCI_QUIRK(0x17aa, 0x2010, "Thinkpad X/T/R60", 0x01),
2824 SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X/T/R61", 0x01),
Takashi Iwai0edb9452008-11-07 14:53:09 +01002825 /* broken BIOS */
2826 SND_PCI_QUIRK(0x1028, 0x20ac, "Dell Studio Desktop", 0x01),
Takashi Iwaief1681d2008-11-24 17:29:28 +01002827 /* including bogus ALC268 in slot#2 that conflicts with ALC888 */
2828 SND_PCI_QUIRK(0x17c0, 0x4085, "Medion MD96630", 0x01),
Takashi Iwai20db7cb2009-02-13 08:18:48 +01002829 /* forced codec slots */
Ozan Çağlayan93574842009-05-23 15:00:04 +03002830 SND_PCI_QUIRK(0x1043, 0x1262, "ASUS W5Fm", 0x103),
Takashi Iwai20db7cb2009-02-13 08:18:48 +01002831 SND_PCI_QUIRK(0x1046, 0x1262, "ASUS W5F", 0x103),
Jaroslav Kyselaf3af9052012-04-26 17:52:35 +02002832 /* WinFast VP200 H (Teradici) user reported broken communication */
2833 SND_PCI_QUIRK(0x3a21, 0x040d, "WinFast VP200 H", 0x101),
Takashi Iwai669ba272007-08-17 09:17:36 +02002834 {}
2835};
2836
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01002837#define AZX_FORCE_CODEC_MASK 0x100
2838
Takashi Iwai5aba4f82008-01-07 15:16:37 +01002839static void __devinit check_probe_mask(struct azx *chip, int dev)
Takashi Iwai669ba272007-08-17 09:17:36 +02002840{
2841 const struct snd_pci_quirk *q;
2842
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01002843 chip->codec_probe_mask = probe_mask[dev];
2844 if (chip->codec_probe_mask == -1) {
Takashi Iwai669ba272007-08-17 09:17:36 +02002845 q = snd_pci_quirk_lookup(chip->pci, probe_mask_list);
2846 if (q) {
2847 printk(KERN_INFO
2848 "hda_intel: probe_mask set to 0x%x "
2849 "for device %04x:%04x\n",
2850 q->value, q->subvendor, q->subdevice);
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01002851 chip->codec_probe_mask = q->value;
Takashi Iwai669ba272007-08-17 09:17:36 +02002852 }
2853 }
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01002854
2855 /* check forced option */
2856 if (chip->codec_probe_mask != -1 &&
2857 (chip->codec_probe_mask & AZX_FORCE_CODEC_MASK)) {
2858 chip->codec_mask = chip->codec_probe_mask & 0xff;
2859 printk(KERN_INFO "hda_intel: codec_mask forced to 0x%x\n",
2860 chip->codec_mask);
2861 }
Takashi Iwai669ba272007-08-17 09:17:36 +02002862}
2863
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02002864/*
Takashi Iwai716238552009-09-28 13:14:04 +02002865 * white/black-list for enable_msi
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02002866 */
Takashi Iwai716238552009-09-28 13:14:04 +02002867static struct snd_pci_quirk msi_black_list[] __devinitdata = {
Takashi Iwai9dc83982009-12-22 08:15:01 +01002868 SND_PCI_QUIRK(0x1043, 0x81f2, "ASUS", 0), /* Athlon64 X2 + nvidia */
Takashi Iwai0a27fcf2010-02-15 17:05:28 +01002869 SND_PCI_QUIRK(0x1043, 0x81f6, "ASUS", 0), /* nvidia */
Ralf Gerbigecd21622010-03-09 18:25:47 +01002870 SND_PCI_QUIRK(0x1043, 0x822d, "ASUS", 0), /* Athlon64 X2 + nvidia MCP55 */
Michele Ballabio4193d132010-03-06 21:06:46 +01002871 SND_PCI_QUIRK(0x1849, 0x0888, "ASRock", 0), /* Athlon64 X2 + nvidia */
Takashi Iwai38155952010-04-04 12:14:03 +02002872 SND_PCI_QUIRK(0xa0a0, 0x0575, "Aopen MZ915-M", 0), /* ICH6 */
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02002873 {}
2874};
2875
2876static void __devinit check_msi(struct azx *chip)
2877{
2878 const struct snd_pci_quirk *q;
2879
Takashi Iwai716238552009-09-28 13:14:04 +02002880 if (enable_msi >= 0) {
2881 chip->msi = !!enable_msi;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02002882 return;
Takashi Iwai716238552009-09-28 13:14:04 +02002883 }
2884 chip->msi = 1; /* enable MSI as default */
2885 q = snd_pci_quirk_lookup(chip->pci, msi_black_list);
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02002886 if (q) {
2887 printk(KERN_INFO
2888 "hda_intel: msi for device %04x:%04x set to %d\n",
2889 q->subvendor, q->subdevice, q->value);
2890 chip->msi = q->value;
Takashi Iwai80c43ed2010-03-15 15:51:53 +01002891 return;
2892 }
2893
2894 /* NVidia chipsets seem to cause troubles with MSI */
Takashi Iwai9477c582011-05-25 09:11:37 +02002895 if (chip->driver_caps & AZX_DCAPS_NO_MSI) {
2896 printk(KERN_INFO "hda_intel: Disabling MSI\n");
Takashi Iwai80c43ed2010-03-15 15:51:53 +01002897 chip->msi = 0;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02002898 }
2899}
2900
Takashi Iwaia1585d72011-12-14 09:27:04 +01002901/* check the snoop mode availability */
2902static void __devinit azx_check_snoop_available(struct azx *chip)
2903{
2904 bool snoop = chip->snoop;
2905
2906 switch (chip->driver_type) {
2907 case AZX_DRIVER_VIA:
2908 /* force to non-snoop mode for a new VIA controller
2909 * when BIOS is set
2910 */
2911 if (snoop) {
2912 u8 val;
2913 pci_read_config_byte(chip->pci, 0x42, &val);
2914 if (!(val & 0x80) && chip->pci->revision == 0x30)
2915 snoop = false;
2916 }
2917 break;
2918 case AZX_DRIVER_ATIHDMI_NS:
2919 /* new ATI HDMI requires non-snoop */
2920 snoop = false;
2921 break;
2922 }
2923
2924 if (snoop != chip->snoop) {
2925 snd_printk(KERN_INFO SFX "Force to %s mode\n",
2926 snoop ? "snoop" : "non-snoop");
2927 chip->snoop = snoop;
2928 }
2929}
Takashi Iwai669ba272007-08-17 09:17:36 +02002930
2931/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002932 * constructor
2933 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002934static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci,
Takashi Iwai9477c582011-05-25 09:11:37 +02002935 int dev, unsigned int driver_caps,
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002936 struct azx **rchip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002937{
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002938 static struct snd_device_ops ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002939 .dev_free = azx_dev_free,
2940 };
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002941 struct azx *chip;
2942 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002943
2944 *rchip = NULL;
Tobin Davisbcd72002008-01-15 11:23:55 +01002945
Pavel Machek927fc862006-08-31 17:03:43 +02002946 err = pci_enable_device(pci);
2947 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002948 return err;
2949
Takashi Iwaie560d8d2005-09-09 14:21:46 +02002950 chip = kzalloc(sizeof(*chip), GFP_KERNEL);
Pavel Machek927fc862006-08-31 17:03:43 +02002951 if (!chip) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002952 snd_printk(KERN_ERR SFX "cannot allocate chip\n");
2953 pci_disable_device(pci);
2954 return -ENOMEM;
2955 }
2956
2957 spin_lock_init(&chip->reg_lock);
Ingo Molnar62932df2006-01-16 16:34:20 +01002958 mutex_init(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002959 chip->card = card;
2960 chip->pci = pci;
2961 chip->irq = -1;
Takashi Iwai9477c582011-05-25 09:11:37 +02002962 chip->driver_caps = driver_caps;
2963 chip->driver_type = driver_caps & 0xff;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02002964 check_msi(chip);
Takashi Iwai555e2192008-06-10 17:53:34 +02002965 chip->dev_index = dev;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002966 INIT_WORK(&chip->irq_pending_work, azx_irq_pending_work);
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002967 INIT_LIST_HEAD(&chip->pcm_list);
Takashi Iwai65fcd412012-08-14 17:13:32 +02002968 INIT_LIST_HEAD(&chip->list);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002969 init_vga_switcheroo(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002970
Shahin Ghazinouribeaffc32010-05-11 08:19:55 +02002971 chip->position_fix[0] = chip->position_fix[1] =
2972 check_position_fix(chip, position_fix[dev]);
Takashi Iwaia6f2fd52012-02-28 11:58:40 +01002973 /* combo mode uses LPIB for playback */
2974 if (chip->position_fix[0] == POS_FIX_COMBO) {
2975 chip->position_fix[0] = POS_FIX_LPIB;
2976 chip->position_fix[1] = POS_FIX_AUTO;
2977 }
2978
Takashi Iwai5aba4f82008-01-07 15:16:37 +01002979 check_probe_mask(chip, dev);
Takashi Iwai3372a152007-02-01 15:46:50 +01002980
Takashi Iwai27346162006-01-12 18:28:44 +01002981 chip->single_cmd = single_cmd;
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002982 chip->snoop = hda_snoop;
Takashi Iwaia1585d72011-12-14 09:27:04 +01002983 azx_check_snoop_available(chip);
Takashi Iwaic74db862005-05-12 14:26:27 +02002984
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02002985 if (bdl_pos_adj[dev] < 0) {
2986 switch (chip->driver_type) {
Takashi Iwai0c6341a2008-06-13 20:50:27 +02002987 case AZX_DRIVER_ICH:
Seth Heasley32679f92010-02-22 17:31:09 -08002988 case AZX_DRIVER_PCH:
Takashi Iwai0c6341a2008-06-13 20:50:27 +02002989 bdl_pos_adj[dev] = 1;
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02002990 break;
2991 default:
Takashi Iwai0c6341a2008-06-13 20:50:27 +02002992 bdl_pos_adj[dev] = 32;
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02002993 break;
2994 }
2995 }
2996
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002997 if (check_hdmi_disabled(pci)) {
2998 snd_printk(KERN_INFO SFX "VGA controller for %s is disabled\n",
2999 pci_name(pci));
3000 if (use_vga_switcheroo(chip)) {
3001 snd_printk(KERN_INFO SFX "Delaying initialization\n");
3002 chip->disabled = true;
3003 goto ok;
3004 }
3005 kfree(chip);
3006 pci_disable_device(pci);
3007 return -ENXIO;
3008 }
3009
3010 err = azx_first_init(chip);
3011 if (err < 0) {
3012 azx_free(chip);
3013 return err;
3014 }
3015
3016 ok:
3017 err = register_vga_switcheroo(chip);
3018 if (err < 0) {
3019 snd_printk(KERN_ERR SFX
3020 "Error registering VGA-switcheroo client\n");
3021 azx_free(chip);
3022 return err;
3023 }
3024
3025 err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
3026 if (err < 0) {
3027 snd_printk(KERN_ERR SFX "Error creating device [card]!\n");
3028 azx_free(chip);
3029 return err;
3030 }
3031
3032 *rchip = chip;
3033 return 0;
3034}
3035
3036static int DELAYED_INIT_MARK azx_first_init(struct azx *chip)
3037{
3038 int dev = chip->dev_index;
3039 struct pci_dev *pci = chip->pci;
3040 struct snd_card *card = chip->card;
3041 int i, err;
3042 unsigned short gcap;
3043
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003044#if BITS_PER_LONG != 64
3045 /* Fix up base address on ULI M5461 */
3046 if (chip->driver_type == AZX_DRIVER_ULI) {
3047 u16 tmp3;
3048 pci_read_config_word(pci, 0x40, &tmp3);
3049 pci_write_config_word(pci, 0x40, tmp3 | 0x10);
3050 pci_write_config_dword(pci, PCI_BASE_ADDRESS_1, 0);
3051 }
3052#endif
3053
Pavel Machek927fc862006-08-31 17:03:43 +02003054 err = pci_request_regions(pci, "ICH HD audio");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003055 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003056 return err;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003057 chip->region_requested = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003058
Pavel Machek927fc862006-08-31 17:03:43 +02003059 chip->addr = pci_resource_start(pci, 0);
Arjan van de Ven2f5ad542008-09-28 16:20:09 -07003060 chip->remap_addr = pci_ioremap_bar(pci, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003061 if (chip->remap_addr == NULL) {
3062 snd_printk(KERN_ERR SFX "ioremap error\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003063 return -ENXIO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003064 }
3065
Takashi Iwai68e7fff2006-10-23 13:40:59 +02003066 if (chip->msi)
3067 if (pci_enable_msi(pci) < 0)
3068 chip->msi = 0;
Stephen Hemminger7376d012006-08-21 19:17:46 +02003069
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003070 if (azx_acquire_irq(chip, 0) < 0)
3071 return -EBUSY;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003072
3073 pci_set_master(pci);
3074 synchronize_irq(chip->irq);
3075
Tobin Davisbcd72002008-01-15 11:23:55 +01003076 gcap = azx_readw(chip, GCAP);
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02003077 snd_printdd(SFX "chipset global capabilities = 0x%x\n", gcap);
Tobin Davisbcd72002008-01-15 11:23:55 +01003078
Andiry Brienzadc4c2e62009-07-08 13:55:31 +08003079 /* disable SB600 64bit support for safety */
Takashi Iwai9477c582011-05-25 09:11:37 +02003080 if (chip->pci->vendor == PCI_VENDOR_ID_ATI) {
Andiry Brienzadc4c2e62009-07-08 13:55:31 +08003081 struct pci_dev *p_smbus;
3082 p_smbus = pci_get_device(PCI_VENDOR_ID_ATI,
3083 PCI_DEVICE_ID_ATI_SBX00_SMBUS,
3084 NULL);
3085 if (p_smbus) {
3086 if (p_smbus->revision < 0x30)
3087 gcap &= ~ICH6_GCAP_64OK;
3088 pci_dev_put(p_smbus);
3089 }
3090 }
Takashi Iwai09240cf2009-03-17 07:47:18 +01003091
Takashi Iwai9477c582011-05-25 09:11:37 +02003092 /* disable 64bit DMA address on some devices */
3093 if (chip->driver_caps & AZX_DCAPS_NO_64BIT) {
3094 snd_printd(SFX "Disabling 64bit DMA\n");
Jaroslav Kysela396087e2009-12-09 10:44:47 +01003095 gcap &= ~ICH6_GCAP_64OK;
Takashi Iwai9477c582011-05-25 09:11:37 +02003096 }
Jaroslav Kysela396087e2009-12-09 10:44:47 +01003097
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003098 /* disable buffer size rounding to 128-byte multiples if supported */
Takashi Iwai7bfe0592012-01-23 17:53:39 +01003099 if (align_buffer_size >= 0)
3100 chip->align_buffer_size = !!align_buffer_size;
3101 else {
3102 if (chip->driver_caps & AZX_DCAPS_BUFSIZE)
3103 chip->align_buffer_size = 0;
3104 else if (chip->driver_caps & AZX_DCAPS_ALIGN_BUFSIZE)
3105 chip->align_buffer_size = 1;
3106 else
3107 chip->align_buffer_size = 1;
3108 }
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003109
Takashi Iwaicf7aaca2008-02-06 15:05:57 +01003110 /* allow 64bit DMA address if supported by H/W */
Takashi Iwaib21fadb2009-05-28 12:26:15 +02003111 if ((gcap & ICH6_GCAP_64OK) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64)))
Yang Hongyange9304382009-04-13 14:40:14 -07003112 pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(64));
Takashi Iwai09240cf2009-03-17 07:47:18 +01003113 else {
Yang Hongyange9304382009-04-13 14:40:14 -07003114 pci_set_dma_mask(pci, DMA_BIT_MASK(32));
3115 pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(32));
Takashi Iwai09240cf2009-03-17 07:47:18 +01003116 }
Takashi Iwaicf7aaca2008-02-06 15:05:57 +01003117
Takashi Iwai8b6ed8e2008-02-19 11:36:35 +01003118 /* read number of streams from GCAP register instead of using
3119 * hardcoded value
3120 */
3121 chip->capture_streams = (gcap >> 8) & 0x0f;
3122 chip->playback_streams = (gcap >> 12) & 0x0f;
3123 if (!chip->playback_streams && !chip->capture_streams) {
Tobin Davisbcd72002008-01-15 11:23:55 +01003124 /* gcap didn't give any info, switching to old method */
3125
3126 switch (chip->driver_type) {
3127 case AZX_DRIVER_ULI:
3128 chip->playback_streams = ULI_NUM_PLAYBACK;
3129 chip->capture_streams = ULI_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01003130 break;
3131 case AZX_DRIVER_ATIHDMI:
Andiry Xu1815b342011-12-14 16:10:27 +08003132 case AZX_DRIVER_ATIHDMI_NS:
Tobin Davisbcd72002008-01-15 11:23:55 +01003133 chip->playback_streams = ATIHDMI_NUM_PLAYBACK;
3134 chip->capture_streams = ATIHDMI_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01003135 break;
Yang, Libinc4da29c2008-11-13 11:07:07 +01003136 case AZX_DRIVER_GENERIC:
Tobin Davisbcd72002008-01-15 11:23:55 +01003137 default:
3138 chip->playback_streams = ICH6_NUM_PLAYBACK;
3139 chip->capture_streams = ICH6_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01003140 break;
3141 }
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003142 }
Takashi Iwai8b6ed8e2008-02-19 11:36:35 +01003143 chip->capture_index_offset = 0;
3144 chip->playback_index_offset = chip->capture_streams;
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003145 chip->num_streams = chip->playback_streams + chip->capture_streams;
Takashi Iwaid01ce992007-07-27 16:52:19 +02003146 chip->azx_dev = kcalloc(chip->num_streams, sizeof(*chip->azx_dev),
3147 GFP_KERNEL);
Pavel Machek927fc862006-08-31 17:03:43 +02003148 if (!chip->azx_dev) {
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02003149 snd_printk(KERN_ERR SFX "cannot malloc azx_dev\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003150 return -ENOMEM;
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003151 }
3152
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003153 for (i = 0; i < chip->num_streams; i++) {
3154 /* allocate memory for the BDL for each stream */
3155 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
3156 snd_dma_pci_data(chip->pci),
3157 BDL_SIZE, &chip->azx_dev[i].bdl);
3158 if (err < 0) {
3159 snd_printk(KERN_ERR SFX "cannot allocate BDL\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003160 return -ENOMEM;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003161 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003162 mark_pages_wc(chip, &chip->azx_dev[i].bdl, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003163 }
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02003164 /* allocate memory for the position buffer */
Takashi Iwaid01ce992007-07-27 16:52:19 +02003165 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
3166 snd_dma_pci_data(chip->pci),
3167 chip->num_streams * 8, &chip->posbuf);
3168 if (err < 0) {
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02003169 snd_printk(KERN_ERR SFX "cannot allocate posbuf\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003170 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003171 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003172 mark_pages_wc(chip, &chip->posbuf, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003173 /* allocate CORB/RIRB */
Takashi Iwai81740862009-05-26 15:22:00 +02003174 err = azx_alloc_cmd_io(chip);
3175 if (err < 0)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003176 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003177
3178 /* initialize streams */
3179 azx_init_stream(chip);
3180
3181 /* initialize chip */
Takashi Iwaicb53c622007-08-10 17:21:45 +02003182 azx_init_pci(chip);
Jaroslav Kysela10e77dd2010-03-26 11:04:38 +01003183 azx_init_chip(chip, (probe_only[dev] & 2) == 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003184
3185 /* codec detection */
Pavel Machek927fc862006-08-31 17:03:43 +02003186 if (!chip->codec_mask) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003187 snd_printk(KERN_ERR SFX "no codecs found!\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003188 return -ENODEV;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003189 }
3190
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003191 strcpy(card->driver, "HDA-Intel");
Takashi Iwai18cb7102009-04-16 10:22:24 +02003192 strlcpy(card->shortname, driver_short_names[chip->driver_type],
3193 sizeof(card->shortname));
3194 snprintf(card->longname, sizeof(card->longname),
3195 "%s at 0x%lx irq %i",
3196 card->shortname, chip->addr, chip->irq);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003197
Linus Torvalds1da177e2005-04-16 15:20:36 -07003198 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003199}
3200
Takashi Iwaicb53c622007-08-10 17:21:45 +02003201static void power_down_all_codecs(struct azx *chip)
3202{
3203#ifdef CONFIG_SND_HDA_POWER_SAVE
3204 /* The codecs were powered up in snd_hda_codec_new().
3205 * Now all initialization done, so turn them down if possible
3206 */
3207 struct hda_codec *codec;
3208 list_for_each_entry(codec, &chip->bus->codec_list, list) {
3209 snd_hda_power_down(codec);
3210 }
3211#endif
3212}
3213
Takashi Iwai97c6a3d2012-08-09 17:40:46 +02003214#ifdef CONFIG_SND_HDA_PATCH_LOADER
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003215/* callback from request_firmware_nowait() */
3216static void azx_firmware_cb(const struct firmware *fw, void *context)
3217{
3218 struct snd_card *card = context;
3219 struct azx *chip = card->private_data;
3220 struct pci_dev *pci = chip->pci;
3221
3222 if (!fw) {
3223 snd_printk(KERN_ERR SFX "Cannot load firmware, aborting\n");
3224 goto error;
3225 }
3226
3227 chip->fw = fw;
3228 if (!chip->disabled) {
3229 /* continue probing */
3230 if (azx_probe_continue(chip))
3231 goto error;
3232 }
3233 return; /* OK */
3234
3235 error:
3236 snd_card_free(card);
3237 pci_set_drvdata(pci, NULL);
3238}
Takashi Iwai97c6a3d2012-08-09 17:40:46 +02003239#endif
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003240
Takashi Iwaid01ce992007-07-27 16:52:19 +02003241static int __devinit azx_probe(struct pci_dev *pci,
3242 const struct pci_device_id *pci_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003243{
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003244 static int dev;
Takashi Iwaia98f90f2005-11-17 14:59:02 +01003245 struct snd_card *card;
3246 struct azx *chip;
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003247 bool probe_now;
Pavel Machek927fc862006-08-31 17:03:43 +02003248 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003249
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003250 if (dev >= SNDRV_CARDS)
3251 return -ENODEV;
3252 if (!enable[dev]) {
3253 dev++;
3254 return -ENOENT;
3255 }
3256
Takashi Iwaie58de7b2008-12-28 16:44:30 +01003257 err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card);
3258 if (err < 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003259 snd_printk(KERN_ERR SFX "Error creating card!\n");
Takashi Iwaie58de7b2008-12-28 16:44:30 +01003260 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003261 }
3262
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003263 snd_card_set_dev(card, &pci->dev);
3264
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003265 err = azx_create(card, pci, dev, pci_id->driver_data, &chip);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003266 if (err < 0)
3267 goto out_free;
Takashi Iwai421a1252005-11-17 16:11:09 +01003268 card->private_data = chip;
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003269 probe_now = !chip->disabled;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003270
Takashi Iwai4918cda2012-08-09 12:33:28 +02003271#ifdef CONFIG_SND_HDA_PATCH_LOADER
3272 if (patch[dev] && *patch[dev]) {
3273 snd_printk(KERN_ERR SFX "Applying patch firmware '%s'\n",
3274 patch[dev]);
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003275 err = request_firmware_nowait(THIS_MODULE, true, patch[dev],
3276 &pci->dev, GFP_KERNEL, card,
3277 azx_firmware_cb);
Takashi Iwai4918cda2012-08-09 12:33:28 +02003278 if (err < 0)
3279 goto out_free;
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003280 probe_now = false; /* continued in azx_firmware_cb() */
Takashi Iwai4918cda2012-08-09 12:33:28 +02003281 }
3282#endif /* CONFIG_SND_HDA_PATCH_LOADER */
3283
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003284 if (probe_now) {
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003285 err = azx_probe_continue(chip);
3286 if (err < 0)
3287 goto out_free;
3288 }
3289
3290 pci_set_drvdata(pci, card);
3291
3292 dev++;
3293 return 0;
3294
3295out_free:
3296 snd_card_free(card);
3297 return err;
3298}
3299
3300static int DELAYED_INIT_MARK azx_probe_continue(struct azx *chip)
3301{
3302 int dev = chip->dev_index;
3303 int err;
3304
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +01003305#ifdef CONFIG_SND_HDA_INPUT_BEEP
3306 chip->beep_mode = beep_mode[dev];
3307#endif
3308
Linus Torvalds1da177e2005-04-16 15:20:36 -07003309 /* create codec instances */
Takashi Iwaia1e21c92009-06-17 09:33:52 +02003310 err = azx_codec_create(chip, model[dev]);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003311 if (err < 0)
3312 goto out_free;
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003313#ifdef CONFIG_SND_HDA_PATCH_LOADER
Takashi Iwai4918cda2012-08-09 12:33:28 +02003314 if (chip->fw) {
3315 err = snd_hda_load_patch(chip->bus, chip->fw->size,
3316 chip->fw->data);
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003317 if (err < 0)
3318 goto out_free;
Takashi Iwai4918cda2012-08-09 12:33:28 +02003319 release_firmware(chip->fw); /* no longer needed */
3320 chip->fw = NULL;
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003321 }
3322#endif
Jaroslav Kysela10e77dd2010-03-26 11:04:38 +01003323 if ((probe_only[dev] & 1) == 0) {
Takashi Iwaia1e21c92009-06-17 09:33:52 +02003324 err = azx_codec_configure(chip);
3325 if (err < 0)
3326 goto out_free;
3327 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003328
3329 /* create PCM streams */
Takashi Iwai176d5332008-07-30 15:01:44 +02003330 err = snd_hda_build_pcms(chip->bus);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003331 if (err < 0)
3332 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003333
3334 /* create mixer controls */
Takashi Iwaid01ce992007-07-27 16:52:19 +02003335 err = azx_mixer_create(chip);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003336 if (err < 0)
3337 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003338
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003339 err = snd_card_register(chip->card);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003340 if (err < 0)
3341 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003342
Takashi Iwaicb53c622007-08-10 17:21:45 +02003343 chip->running = 1;
3344 power_down_all_codecs(chip);
Takashi Iwai0cbf0092008-10-29 16:18:25 +01003345 azx_notifier_register(chip);
Takashi Iwai65fcd412012-08-14 17:13:32 +02003346 azx_add_card_list(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003347
Takashi Iwai91219472012-04-26 12:13:25 +02003348 return 0;
3349
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003350out_free:
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003351 chip->init_failed = 1;
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003352 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003353}
3354
3355static void __devexit azx_remove(struct pci_dev *pci)
3356{
Takashi Iwai91219472012-04-26 12:13:25 +02003357 struct snd_card *card = pci_get_drvdata(pci);
3358 if (card)
3359 snd_card_free(card);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003360 pci_set_drvdata(pci, NULL);
3361}
3362
3363/* PCI IDs */
Alexey Dobriyancebe41d2010-02-06 00:21:03 +02003364static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
Seth Heasleyd2f2fcd2010-01-12 17:03:35 -08003365 /* CPT */
Takashi Iwai9477c582011-05-25 09:11:37 +02003366 { PCI_DEVICE(0x8086, 0x1c20),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003367 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP |
Seth Heasleyc20c5a82012-06-14 14:23:53 -07003368 AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_COMBO },
Seth Heasleycea310e2010-09-10 16:29:56 -07003369 /* PBG */
Takashi Iwai9477c582011-05-25 09:11:37 +02003370 { PCI_DEVICE(0x8086, 0x1d20),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003371 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP |
3372 AZX_DCAPS_BUFSIZE},
Seth Heasleyd2edeb72011-04-20 10:59:57 -07003373 /* Panther Point */
Takashi Iwai9477c582011-05-25 09:11:37 +02003374 { PCI_DEVICE(0x8086, 0x1e20),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003375 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP |
Seth Heasleyc20c5a82012-06-14 14:23:53 -07003376 AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_COMBO },
Seth Heasley8bc039a2012-01-23 16:24:31 -08003377 /* Lynx Point */
3378 { PCI_DEVICE(0x8086, 0x8c20),
3379 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP |
Seth Heasleyc20c5a82012-06-14 14:23:53 -07003380 AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_COMBO },
Wang Xingchaoe926f2c2012-06-13 10:23:51 +08003381 /* Haswell */
3382 { PCI_DEVICE(0x8086, 0x0c0c),
Takashi Iwaibdbe34d2012-07-16 16:17:10 +02003383 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP |
Wang Xingchaoe926f2c2012-06-13 10:23:51 +08003384 AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_COMBO },
Takashi Iwai87218e92008-02-21 08:13:11 +01003385 /* SCH */
Takashi Iwai9477c582011-05-25 09:11:37 +02003386 { PCI_DEVICE(0x8086, 0x811b),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003387 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP |
David Henningsson645e9032011-12-14 15:52:30 +08003388 AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_LPIB }, /* Poulsbo */
Li Peng09904b92011-12-28 15:17:26 +00003389 { PCI_DEVICE(0x8086, 0x080a),
3390 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP |
David Henningsson716e5db2012-01-04 10:12:54 +01003391 AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_LPIB }, /* Oaktrail */
David Henningsson645e9032011-12-14 15:52:30 +08003392 /* ICH */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003393 { PCI_DEVICE(0x8086, 0x2668),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003394 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3395 AZX_DCAPS_BUFSIZE }, /* ICH6 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003396 { PCI_DEVICE(0x8086, 0x27d8),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003397 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3398 AZX_DCAPS_BUFSIZE }, /* ICH7 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003399 { PCI_DEVICE(0x8086, 0x269a),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003400 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3401 AZX_DCAPS_BUFSIZE }, /* ESB2 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003402 { PCI_DEVICE(0x8086, 0x284b),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003403 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3404 AZX_DCAPS_BUFSIZE }, /* ICH8 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003405 { PCI_DEVICE(0x8086, 0x293e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003406 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3407 AZX_DCAPS_BUFSIZE }, /* ICH9 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003408 { PCI_DEVICE(0x8086, 0x293f),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003409 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3410 AZX_DCAPS_BUFSIZE }, /* ICH9 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003411 { PCI_DEVICE(0x8086, 0x3a3e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003412 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3413 AZX_DCAPS_BUFSIZE }, /* ICH10 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003414 { PCI_DEVICE(0x8086, 0x3a6e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003415 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3416 AZX_DCAPS_BUFSIZE }, /* ICH10 */
Takashi Iwaib6864532010-09-15 10:17:26 +02003417 /* Generic Intel */
3418 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_ANY_ID),
3419 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3420 .class_mask = 0xffffff,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003421 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_BUFSIZE },
Takashi Iwai9477c582011-05-25 09:11:37 +02003422 /* ATI SB 450/600/700/800/900 */
3423 { PCI_DEVICE(0x1002, 0x437b),
3424 .driver_data = AZX_DRIVER_ATI | AZX_DCAPS_PRESET_ATI_SB },
3425 { PCI_DEVICE(0x1002, 0x4383),
3426 .driver_data = AZX_DRIVER_ATI | AZX_DCAPS_PRESET_ATI_SB },
3427 /* AMD Hudson */
3428 { PCI_DEVICE(0x1022, 0x780d),
3429 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_SB },
Takashi Iwai87218e92008-02-21 08:13:11 +01003430 /* ATI HDMI */
Takashi Iwai9477c582011-05-25 09:11:37 +02003431 { PCI_DEVICE(0x1002, 0x793b),
3432 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3433 { PCI_DEVICE(0x1002, 0x7919),
3434 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3435 { PCI_DEVICE(0x1002, 0x960f),
3436 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3437 { PCI_DEVICE(0x1002, 0x970f),
3438 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3439 { PCI_DEVICE(0x1002, 0xaa00),
3440 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3441 { PCI_DEVICE(0x1002, 0xaa08),
3442 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3443 { PCI_DEVICE(0x1002, 0xaa10),
3444 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3445 { PCI_DEVICE(0x1002, 0xaa18),
3446 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3447 { PCI_DEVICE(0x1002, 0xaa20),
3448 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3449 { PCI_DEVICE(0x1002, 0xaa28),
3450 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3451 { PCI_DEVICE(0x1002, 0xaa30),
3452 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3453 { PCI_DEVICE(0x1002, 0xaa38),
3454 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3455 { PCI_DEVICE(0x1002, 0xaa40),
3456 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3457 { PCI_DEVICE(0x1002, 0xaa48),
3458 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
Andiry Xu1815b342011-12-14 16:10:27 +08003459 { PCI_DEVICE(0x1002, 0x9902),
3460 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
3461 { PCI_DEVICE(0x1002, 0xaaa0),
3462 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
3463 { PCI_DEVICE(0x1002, 0xaaa8),
3464 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
3465 { PCI_DEVICE(0x1002, 0xaab0),
3466 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
Takashi Iwai87218e92008-02-21 08:13:11 +01003467 /* VIA VT8251/VT8237A */
Takashi Iwai9477c582011-05-25 09:11:37 +02003468 { PCI_DEVICE(0x1106, 0x3288),
3469 .driver_data = AZX_DRIVER_VIA | AZX_DCAPS_POSFIX_VIA },
Annie Liu754fdff2012-06-08 19:18:39 +08003470 /* VIA GFX VT7122/VX900 */
3471 { PCI_DEVICE(0x1106, 0x9170), .driver_data = AZX_DRIVER_GENERIC },
3472 /* VIA GFX VT6122/VX11 */
3473 { PCI_DEVICE(0x1106, 0x9140), .driver_data = AZX_DRIVER_GENERIC },
Takashi Iwai87218e92008-02-21 08:13:11 +01003474 /* SIS966 */
3475 { PCI_DEVICE(0x1039, 0x7502), .driver_data = AZX_DRIVER_SIS },
3476 /* ULI M5461 */
3477 { PCI_DEVICE(0x10b9, 0x5461), .driver_data = AZX_DRIVER_ULI },
3478 /* NVIDIA MCP */
Takashi Iwai0c2fd1bf42009-12-18 16:41:39 +01003479 { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID),
3480 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3481 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02003482 .driver_data = AZX_DRIVER_NVIDIA | AZX_DCAPS_PRESET_NVIDIA },
Kailang Yangf2690022008-05-27 11:44:55 +02003483 /* Teradici */
Takashi Iwai9477c582011-05-25 09:11:37 +02003484 { PCI_DEVICE(0x6549, 0x1200),
3485 .driver_data = AZX_DRIVER_TERA | AZX_DCAPS_NO_64BIT },
Takashi Iwai4e01f542009-04-16 08:53:34 +02003486 /* Creative X-Fi (CA0110-IBG) */
Takashi Iwaif2a8eca2012-06-11 15:51:54 +02003487 /* CTHDA chips */
3488 { PCI_DEVICE(0x1102, 0x0010),
3489 .driver_data = AZX_DRIVER_CTHDA | AZX_DCAPS_PRESET_CTHDA },
3490 { PCI_DEVICE(0x1102, 0x0012),
3491 .driver_data = AZX_DRIVER_CTHDA | AZX_DCAPS_PRESET_CTHDA },
Takashi Iwai313f6e22009-05-18 12:40:52 +02003492#if !defined(CONFIG_SND_CTXFI) && !defined(CONFIG_SND_CTXFI_MODULE)
3493 /* the following entry conflicts with snd-ctxfi driver,
3494 * as ctxfi driver mutates from HD-audio to native mode with
3495 * a special command sequence.
3496 */
Takashi Iwai4e01f542009-04-16 08:53:34 +02003497 { PCI_DEVICE(PCI_VENDOR_ID_CREATIVE, PCI_ANY_ID),
3498 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3499 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02003500 .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
Takashi Iwai69f9ba92011-11-06 13:49:13 +01003501 AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB },
Takashi Iwai313f6e22009-05-18 12:40:52 +02003502#else
3503 /* this entry seems still valid -- i.e. without emu20kx chip */
Takashi Iwai9477c582011-05-25 09:11:37 +02003504 { PCI_DEVICE(0x1102, 0x0009),
3505 .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
Takashi Iwai69f9ba92011-11-06 13:49:13 +01003506 AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB },
Takashi Iwai313f6e22009-05-18 12:40:52 +02003507#endif
Otavio Salvadore35d4b12010-09-26 23:35:06 -03003508 /* Vortex86MX */
3509 { PCI_DEVICE(0x17f3, 0x3010), .driver_data = AZX_DRIVER_GENERIC },
Bankim Bhavsar0f0714c52011-01-17 15:23:21 +01003510 /* VMware HDAudio */
3511 { PCI_DEVICE(0x15ad, 0x1977), .driver_data = AZX_DRIVER_GENERIC },
Andiry Brienza9176b672009-07-17 11:32:32 +08003512 /* AMD/ATI Generic, PCI class code and Vendor ID for HD Audio */
Yang, Libinc4da29c2008-11-13 11:07:07 +01003513 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_ANY_ID),
3514 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3515 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02003516 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_HDMI },
Andiry Brienza9176b672009-07-17 11:32:32 +08003517 { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_ANY_ID),
3518 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3519 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02003520 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_HDMI },
Linus Torvalds1da177e2005-04-16 15:20:36 -07003521 { 0, }
3522};
3523MODULE_DEVICE_TABLE(pci, azx_ids);
3524
3525/* pci_driver definition */
Takashi Iwaie9f66d92012-04-24 12:25:00 +02003526static struct pci_driver azx_driver = {
Takashi Iwai3733e422011-06-10 16:20:20 +02003527 .name = KBUILD_MODNAME,
Linus Torvalds1da177e2005-04-16 15:20:36 -07003528 .id_table = azx_ids,
3529 .probe = azx_probe,
3530 .remove = __devexit_p(azx_remove),
Takashi Iwai68cb2b52012-07-02 15:20:37 +02003531 .driver = {
3532 .pm = AZX_PM_OPS,
3533 },
Linus Torvalds1da177e2005-04-16 15:20:36 -07003534};
3535
Takashi Iwaie9f66d92012-04-24 12:25:00 +02003536module_pci_driver(azx_driver);