blob: f9d870e554d98d2fabe8791e904d7a393c8925e6 [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>
Mengdong Linb8dfc4622012-08-23 17:32:30 +080049#include <linux/pm_runtime.h>
Takashi Iwai27fe48d92011-09-28 17:16:09 +020050#ifdef CONFIG_X86
51/* for snoop control */
52#include <asm/pgtable.h>
53#include <asm/cacheflush.h>
54#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070055#include <sound/core.h>
56#include <sound/initval.h>
Takashi Iwai91219472012-04-26 12:13:25 +020057#include <linux/vgaarb.h>
Takashi Iwaia82d51e2012-04-26 12:23:42 +020058#include <linux/vga_switcheroo.h>
Takashi Iwai4918cda2012-08-09 12:33:28 +020059#include <linux/firmware.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070060#include "hda_codec.h"
61
62
Takashi Iwai5aba4f82008-01-07 15:16:37 +010063static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
64static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
Rusty Russella67ff6a2011-12-15 13:49:36 +103065static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
Takashi Iwai5aba4f82008-01-07 15:16:37 +010066static char *model[SNDRV_CARDS];
Takashi Iwai1dac6692012-09-13 14:59:47 +020067static int position_fix[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = -1};
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +020068static int bdl_pos_adj[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = -1};
Takashi Iwai5aba4f82008-01-07 15:16:37 +010069static int probe_mask[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = -1};
Takashi Iwaid4d9cd032008-12-19 15:19:11 +010070static int probe_only[SNDRV_CARDS];
Rusty Russella67ff6a2011-12-15 13:49:36 +103071static bool single_cmd;
Takashi Iwai716238552009-09-28 13:14:04 +020072static int enable_msi = -1;
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +020073#ifdef CONFIG_SND_HDA_PATCH_LOADER
74static char *patch[SNDRV_CARDS];
75#endif
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +010076#ifdef CONFIG_SND_HDA_INPUT_BEEP
Takashi Iwai0920c9b2012-07-03 16:58:48 +020077static bool beep_mode[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] =
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +010078 CONFIG_SND_HDA_INPUT_BEEP_MODE};
79#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070080
Takashi Iwai5aba4f82008-01-07 15:16:37 +010081module_param_array(index, int, NULL, 0444);
Linus Torvalds1da177e2005-04-16 15:20:36 -070082MODULE_PARM_DESC(index, "Index value for Intel HD audio interface.");
Takashi Iwai5aba4f82008-01-07 15:16:37 +010083module_param_array(id, charp, NULL, 0444);
Linus Torvalds1da177e2005-04-16 15:20:36 -070084MODULE_PARM_DESC(id, "ID string for Intel HD audio interface.");
Takashi Iwai5aba4f82008-01-07 15:16:37 +010085module_param_array(enable, bool, NULL, 0444);
86MODULE_PARM_DESC(enable, "Enable Intel HD audio interface.");
87module_param_array(model, charp, NULL, 0444);
Linus Torvalds1da177e2005-04-16 15:20:36 -070088MODULE_PARM_DESC(model, "Use the given board model.");
Takashi Iwai5aba4f82008-01-07 15:16:37 +010089module_param_array(position_fix, int, NULL, 0444);
David Henningsson4cb36312010-09-30 10:12:50 +020090MODULE_PARM_DESC(position_fix, "DMA pointer read method."
Takashi Iwai1dac6692012-09-13 14:59:47 +020091 "(-1 = system default, 0 = auto, 1 = LPIB, 2 = POSBUF, 3 = VIACOMBO, 4 = COMBO).");
Takashi Iwai555e2192008-06-10 17:53:34 +020092module_param_array(bdl_pos_adj, int, NULL, 0644);
93MODULE_PARM_DESC(bdl_pos_adj, "BDL position adjustment offset.");
Takashi Iwai5aba4f82008-01-07 15:16:37 +010094module_param_array(probe_mask, int, NULL, 0444);
Takashi Iwai606ad752005-11-24 16:03:40 +010095MODULE_PARM_DESC(probe_mask, "Bitmask to probe codecs (default = -1).");
Jaroslav Kysela079e6832010-03-26 11:16:59 +010096module_param_array(probe_only, int, NULL, 0444);
Takashi Iwaid4d9cd032008-12-19 15:19:11 +010097MODULE_PARM_DESC(probe_only, "Only probing and no codec initialization.");
Takashi Iwai27346162006-01-12 18:28:44 +010098module_param(single_cmd, bool, 0444);
Takashi Iwaid01ce992007-07-27 16:52:19 +020099MODULE_PARM_DESC(single_cmd, "Use single command to communicate with codecs "
100 "(for debugging only).");
Takashi Iwaiac9ef6c2012-01-20 12:08:44 +0100101module_param(enable_msi, bint, 0444);
Takashi Iwai134a11f2006-11-10 12:08:37 +0100102MODULE_PARM_DESC(enable_msi, "Enable Message Signaled Interrupt (MSI)");
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +0200103#ifdef CONFIG_SND_HDA_PATCH_LOADER
104module_param_array(patch, charp, NULL, 0444);
105MODULE_PARM_DESC(patch, "Patch file for Intel HD audio interface.");
106#endif
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +0100107#ifdef CONFIG_SND_HDA_INPUT_BEEP
Takashi Iwai0920c9b2012-07-03 16:58:48 +0200108module_param_array(beep_mode, bool, NULL, 0444);
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +0100109MODULE_PARM_DESC(beep_mode, "Select HDA Beep registration mode "
Takashi Iwai0920c9b2012-07-03 16:58:48 +0200110 "(0=off, 1=on) (default=1).");
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +0100111#endif
Takashi Iwai606ad752005-11-24 16:03:40 +0100112
Takashi Iwai83012a72012-08-24 18:38:08 +0200113#ifdef CONFIG_PM
Takashi Iwai65fcd412012-08-14 17:13:32 +0200114static int param_set_xint(const char *val, const struct kernel_param *kp);
115static struct kernel_param_ops param_ops_xint = {
116 .set = param_set_xint,
117 .get = param_get_int,
118};
119#define param_check_xint param_check_int
120
Takashi Iwaifee2fba2008-11-27 12:43:28 +0100121static int power_save = CONFIG_SND_HDA_POWER_SAVE_DEFAULT;
Takashi Iwai65fcd412012-08-14 17:13:32 +0200122module_param(power_save, xint, 0644);
Takashi Iwaifee2fba2008-11-27 12:43:28 +0100123MODULE_PARM_DESC(power_save, "Automatic power-saving timeout "
124 "(in second, 0 = disable).");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700125
Takashi Iwaidee1b662007-08-13 16:10:30 +0200126/* reset the HD-audio controller in power save mode.
127 * this may give more power-saving, but will take longer time to
128 * wake up.
129 */
Rusty Russella67ff6a2011-12-15 13:49:36 +1030130static bool power_save_controller = 1;
Takashi Iwaidee1b662007-08-13 16:10:30 +0200131module_param(power_save_controller, bool, 0644);
132MODULE_PARM_DESC(power_save_controller, "Reset controller in power save mode.");
Takashi Iwai83012a72012-08-24 18:38:08 +0200133#endif /* CONFIG_PM */
Takashi Iwaidee1b662007-08-13 16:10:30 +0200134
Takashi Iwai7bfe0592012-01-23 17:53:39 +0100135static int align_buffer_size = -1;
136module_param(align_buffer_size, bint, 0644);
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -0500137MODULE_PARM_DESC(align_buffer_size,
138 "Force buffer and period sizes to be multiple of 128 bytes.");
139
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200140#ifdef CONFIG_X86
141static bool hda_snoop = true;
142module_param_named(snoop, hda_snoop, bool, 0444);
143MODULE_PARM_DESC(snoop, "Enable/disable snooping");
144#define azx_snoop(chip) (chip)->snoop
145#else
146#define hda_snoop true
147#define azx_snoop(chip) true
148#endif
149
150
Linus Torvalds1da177e2005-04-16 15:20:36 -0700151MODULE_LICENSE("GPL");
152MODULE_SUPPORTED_DEVICE("{{Intel, ICH6},"
153 "{Intel, ICH6M},"
Jason Gaston2f1b3812005-05-01 08:58:50 -0700154 "{Intel, ICH7},"
Frederick Lif5d40b32005-05-12 14:55:20 +0200155 "{Intel, ESB2},"
Jason Gastond2981392006-01-10 11:07:37 +0100156 "{Intel, ICH8},"
Jason Gastonf9cc8a82006-11-22 11:53:52 +0100157 "{Intel, ICH9},"
Jason Gastonc34f5a02008-01-29 12:38:49 +0100158 "{Intel, ICH10},"
Seth Heasleyb29c2362008-08-08 15:56:39 -0700159 "{Intel, PCH},"
Seth Heasleyd2f2fcd2010-01-12 17:03:35 -0800160 "{Intel, CPT},"
Seth Heasleyd2edeb72011-04-20 10:59:57 -0700161 "{Intel, PPT},"
Seth Heasley8bc039a2012-01-23 16:24:31 -0800162 "{Intel, LPT},"
James Ralston144dad92012-08-09 09:38:59 -0700163 "{Intel, LPT_LP},"
Wang Xingchaoe926f2c2012-06-13 10:23:51 +0800164 "{Intel, HPT},"
Seth Heasleycea310e2010-09-10 16:29:56 -0700165 "{Intel, PBG},"
Tobin Davis4979bca2008-01-30 08:13:55 +0100166 "{Intel, SCH},"
Takashi Iwaifc20a562005-05-12 15:00:41 +0200167 "{ATI, SB450},"
Felix Kuehling89be83f2006-03-31 12:33:59 +0200168 "{ATI, SB600},"
Felix Kuehling778b6e12006-05-17 11:22:21 +0200169 "{ATI, RS600},"
Felix Kuehling5b15c952006-10-16 12:49:47 +0200170 "{ATI, RS690},"
Wolke Liue6db1112007-04-27 12:20:57 +0200171 "{ATI, RS780},"
172 "{ATI, R600},"
Herton Ronaldo Krzesinski2797f722007-11-05 18:21:56 +0100173 "{ATI, RV630},"
174 "{ATI, RV610},"
Wolke Liu27da1832007-11-16 11:06:30 +0100175 "{ATI, RV670},"
176 "{ATI, RV635},"
177 "{ATI, RV620},"
178 "{ATI, RV770},"
Takashi Iwaifc20a562005-05-12 15:00:41 +0200179 "{VIA, VT8251},"
Takashi Iwai47672312005-08-12 16:44:04 +0200180 "{VIA, VT8237A},"
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200181 "{SiS, SIS966},"
182 "{ULI, M5461}}");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700183MODULE_DESCRIPTION("Intel HDA driver");
184
Takashi Iwai4abc1cc2009-05-19 12:16:46 +0200185#ifdef CONFIG_SND_VERBOSE_PRINTK
186#define SFX /* nop */
187#else
Linus Torvalds1da177e2005-04-16 15:20:36 -0700188#define SFX "hda-intel: "
Takashi Iwai4abc1cc2009-05-19 12:16:46 +0200189#endif
Takashi Iwaicb53c622007-08-10 17:21:45 +0200190
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200191#if defined(CONFIG_PM) && defined(CONFIG_VGA_SWITCHEROO)
192#ifdef CONFIG_SND_HDA_CODEC_HDMI
193#define SUPPORT_VGA_SWITCHEROO
194#endif
195#endif
196
197
Takashi Iwaicb53c622007-08-10 17:21:45 +0200198/*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700199 * registers
200 */
201#define ICH6_REG_GCAP 0x00
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200202#define ICH6_GCAP_64OK (1 << 0) /* 64bit address support */
203#define ICH6_GCAP_NSDO (3 << 1) /* # of serial data out signals */
204#define ICH6_GCAP_BSS (31 << 3) /* # of bidirectional streams */
205#define ICH6_GCAP_ISS (15 << 8) /* # of input streams */
206#define ICH6_GCAP_OSS (15 << 12) /* # of output streams */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700207#define ICH6_REG_VMIN 0x02
208#define ICH6_REG_VMAJ 0x03
209#define ICH6_REG_OUTPAY 0x04
210#define ICH6_REG_INPAY 0x06
211#define ICH6_REG_GCTL 0x08
Takashi Iwai8a933ec2009-05-31 09:28:12 +0200212#define ICH6_GCTL_RESET (1 << 0) /* controller reset */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200213#define ICH6_GCTL_FCNTRL (1 << 1) /* flush control */
214#define ICH6_GCTL_UNSOL (1 << 8) /* accept unsol. response enable */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700215#define ICH6_REG_WAKEEN 0x0c
216#define ICH6_REG_STATESTS 0x0e
217#define ICH6_REG_GSTS 0x10
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200218#define ICH6_GSTS_FSTS (1 << 1) /* flush status */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700219#define ICH6_REG_INTCTL 0x20
220#define ICH6_REG_INTSTS 0x24
Jaroslav Kyselae5463722010-05-11 10:21:46 +0200221#define ICH6_REG_WALLCLK 0x30 /* 24Mhz source */
Takashi Iwai8b0bd222011-06-10 14:56:26 +0200222#define ICH6_REG_OLD_SSYNC 0x34 /* SSYNC for old ICH */
223#define ICH6_REG_SSYNC 0x38
Linus Torvalds1da177e2005-04-16 15:20:36 -0700224#define ICH6_REG_CORBLBASE 0x40
225#define ICH6_REG_CORBUBASE 0x44
226#define ICH6_REG_CORBWP 0x48
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200227#define ICH6_REG_CORBRP 0x4a
228#define ICH6_CORBRP_RST (1 << 15) /* read pointer reset */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700229#define ICH6_REG_CORBCTL 0x4c
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200230#define ICH6_CORBCTL_RUN (1 << 1) /* enable DMA */
231#define ICH6_CORBCTL_CMEIE (1 << 0) /* enable memory error irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700232#define ICH6_REG_CORBSTS 0x4d
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200233#define ICH6_CORBSTS_CMEI (1 << 0) /* memory error indication */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700234#define ICH6_REG_CORBSIZE 0x4e
235
236#define ICH6_REG_RIRBLBASE 0x50
237#define ICH6_REG_RIRBUBASE 0x54
238#define ICH6_REG_RIRBWP 0x58
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200239#define ICH6_RIRBWP_RST (1 << 15) /* write pointer reset */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700240#define ICH6_REG_RINTCNT 0x5a
241#define ICH6_REG_RIRBCTL 0x5c
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200242#define ICH6_RBCTL_IRQ_EN (1 << 0) /* enable IRQ */
243#define ICH6_RBCTL_DMA_EN (1 << 1) /* enable DMA */
244#define ICH6_RBCTL_OVERRUN_EN (1 << 2) /* enable overrun irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700245#define ICH6_REG_RIRBSTS 0x5d
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200246#define ICH6_RBSTS_IRQ (1 << 0) /* response irq */
247#define ICH6_RBSTS_OVERRUN (1 << 2) /* overrun irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700248#define ICH6_REG_RIRBSIZE 0x5e
249
250#define ICH6_REG_IC 0x60
251#define ICH6_REG_IR 0x64
252#define ICH6_REG_IRS 0x68
253#define ICH6_IRS_VALID (1<<1)
254#define ICH6_IRS_BUSY (1<<0)
255
256#define ICH6_REG_DPLBASE 0x70
257#define ICH6_REG_DPUBASE 0x74
258#define ICH6_DPLBASE_ENABLE 0x1 /* Enable position buffer */
259
260/* SD offset: SDI0=0x80, SDI1=0xa0, ... SDO3=0x160 */
261enum { SDI0, SDI1, SDI2, SDI3, SDO0, SDO1, SDO2, SDO3 };
262
263/* stream register offsets from stream base */
264#define ICH6_REG_SD_CTL 0x00
265#define ICH6_REG_SD_STS 0x03
266#define ICH6_REG_SD_LPIB 0x04
267#define ICH6_REG_SD_CBL 0x08
268#define ICH6_REG_SD_LVI 0x0c
269#define ICH6_REG_SD_FIFOW 0x0e
270#define ICH6_REG_SD_FIFOSIZE 0x10
271#define ICH6_REG_SD_FORMAT 0x12
272#define ICH6_REG_SD_BDLPL 0x18
273#define ICH6_REG_SD_BDLPU 0x1c
274
275/* PCI space */
276#define ICH6_PCIREG_TCSEL 0x44
277
278/*
279 * other constants
280 */
281
282/* max number of SDs */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200283/* ICH, ATI and VIA have 4 playback and 4 capture */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200284#define ICH6_NUM_CAPTURE 4
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200285#define ICH6_NUM_PLAYBACK 4
286
287/* ULI has 6 playback and 5 capture */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200288#define ULI_NUM_CAPTURE 5
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200289#define ULI_NUM_PLAYBACK 6
290
Felix Kuehling778b6e12006-05-17 11:22:21 +0200291/* ATI HDMI has 1 playback and 0 capture */
Felix Kuehling778b6e12006-05-17 11:22:21 +0200292#define ATIHDMI_NUM_CAPTURE 0
Felix Kuehling778b6e12006-05-17 11:22:21 +0200293#define ATIHDMI_NUM_PLAYBACK 1
294
Kailang Yangf2690022008-05-27 11:44:55 +0200295/* TERA has 4 playback and 3 capture */
296#define TERA_NUM_CAPTURE 3
297#define TERA_NUM_PLAYBACK 4
298
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200299/* this number is statically defined for simplicity */
300#define MAX_AZX_DEV 16
301
Linus Torvalds1da177e2005-04-16 15:20:36 -0700302/* max number of fragments - we may use more if allocating more pages for BDL */
Takashi Iwai4ce107b2008-02-06 14:50:19 +0100303#define BDL_SIZE 4096
304#define AZX_MAX_BDL_ENTRIES (BDL_SIZE / 16)
305#define AZX_MAX_FRAG 32
Linus Torvalds1da177e2005-04-16 15:20:36 -0700306/* max buffer size - no h/w limit, you can increase as you like */
307#define AZX_MAX_BUF_SIZE (1024*1024*1024)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700308
309/* RIRB int mask: overrun[2], response[0] */
310#define RIRB_INT_RESPONSE 0x01
311#define RIRB_INT_OVERRUN 0x04
312#define RIRB_INT_MASK 0x05
313
Takashi Iwai2f5983f2008-09-03 16:00:44 +0200314/* STATESTS int mask: S3,SD2,SD1,SD0 */
Wei Ni7445dfc2010-03-03 15:05:53 +0800315#define AZX_MAX_CODECS 8
316#define AZX_DEFAULT_CODECS 4
Wu Fengguangdeadff12009-08-01 18:45:16 +0800317#define STATESTS_INT_MASK ((1 << AZX_MAX_CODECS) - 1)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700318
319/* SD_CTL bits */
320#define SD_CTL_STREAM_RESET 0x01 /* stream reset bit */
321#define SD_CTL_DMA_START 0x02 /* stream DMA start bit */
Takashi Iwai850f0e52008-03-18 17:11:05 +0100322#define SD_CTL_STRIPE (3 << 16) /* stripe control */
323#define SD_CTL_TRAFFIC_PRIO (1 << 18) /* traffic priority */
324#define SD_CTL_DIR (1 << 19) /* bi-directional stream */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700325#define SD_CTL_STREAM_TAG_MASK (0xf << 20)
326#define SD_CTL_STREAM_TAG_SHIFT 20
327
328/* SD_CTL and SD_STS */
329#define SD_INT_DESC_ERR 0x10 /* descriptor error interrupt */
330#define SD_INT_FIFO_ERR 0x08 /* FIFO error interrupt */
331#define SD_INT_COMPLETE 0x04 /* completion interrupt */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200332#define SD_INT_MASK (SD_INT_DESC_ERR|SD_INT_FIFO_ERR|\
333 SD_INT_COMPLETE)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700334
335/* SD_STS */
336#define SD_STS_FIFO_READY 0x20 /* FIFO ready */
337
338/* INTCTL and INTSTS */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200339#define ICH6_INT_ALL_STREAM 0xff /* all stream interrupts */
340#define ICH6_INT_CTRL_EN 0x40000000 /* controller interrupt enable bit */
341#define ICH6_INT_GLOBAL_EN 0x80000000 /* global interrupt enable bit */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700342
Linus Torvalds1da177e2005-04-16 15:20:36 -0700343/* below are so far hardcoded - should read registers in future */
344#define ICH6_MAX_CORB_ENTRIES 256
345#define ICH6_MAX_RIRB_ENTRIES 256
346
Takashi Iwaic74db862005-05-12 14:26:27 +0200347/* position fix mode */
348enum {
Takashi Iwai0be3b5d2005-09-05 17:11:40 +0200349 POS_FIX_AUTO,
Takashi Iwaid2e1c972008-06-10 17:53:34 +0200350 POS_FIX_LPIB,
Takashi Iwai0be3b5d2005-09-05 17:11:40 +0200351 POS_FIX_POSBUF,
David Henningsson4cb36312010-09-30 10:12:50 +0200352 POS_FIX_VIACOMBO,
Takashi Iwaia6f2fd52012-02-28 11:58:40 +0100353 POS_FIX_COMBO,
Takashi Iwaic74db862005-05-12 14:26:27 +0200354};
Linus Torvalds1da177e2005-04-16 15:20:36 -0700355
Frederick Lif5d40b32005-05-12 14:55:20 +0200356/* Defines for ATI HD Audio support in SB450 south bridge */
Frederick Lif5d40b32005-05-12 14:55:20 +0200357#define ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR 0x42
358#define ATI_SB450_HDAUDIO_ENABLE_SNOOP 0x02
359
Vinod Gda3fca22005-09-13 18:49:12 +0200360/* Defines for Nvidia HDA support */
361#define NVIDIA_HDA_TRANSREG_ADDR 0x4e
362#define NVIDIA_HDA_ENABLE_COHBITS 0x0f
Peer Chen320dcc32008-08-20 16:43:24 -0700363#define NVIDIA_HDA_ISTRM_COH 0x4d
364#define NVIDIA_HDA_OSTRM_COH 0x4c
365#define NVIDIA_HDA_ENABLE_COHBIT 0x01
Frederick Lif5d40b32005-05-12 14:55:20 +0200366
Takashi Iwai90a5ad52008-02-22 18:36:22 +0100367/* Defines for Intel SCH HDA snoop control */
368#define INTEL_SCH_HDA_DEVC 0x78
369#define INTEL_SCH_HDA_DEVC_NOSNOOP (0x1<<11)
370
Joseph Chan0e153472008-08-26 14:38:03 +0200371/* Define IN stream 0 FIFO size offset in VIA controller */
372#define VIA_IN_STREAM0_FIFO_SIZE_OFFSET 0x90
373/* Define VIA HD Audio Device ID*/
374#define VIA_HDAC_DEVICE_ID 0x3288
375
Yang, Libinc4da29c2008-11-13 11:07:07 +0100376/* HD Audio class code */
377#define PCI_CLASS_MULTIMEDIA_HD_AUDIO 0x0403
Takashi Iwai90a5ad52008-02-22 18:36:22 +0100378
Linus Torvalds1da177e2005-04-16 15:20:36 -0700379/*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700380 */
381
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100382struct azx_dev {
Takashi Iwai4ce107b2008-02-06 14:50:19 +0100383 struct snd_dma_buffer bdl; /* BDL buffer */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200384 u32 *posbuf; /* position buffer pointer */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700385
Takashi Iwaid01ce992007-07-27 16:52:19 +0200386 unsigned int bufsize; /* size of the play buffer in bytes */
Takashi Iwai9ad593f2008-05-16 12:34:47 +0200387 unsigned int period_bytes; /* size of the period in bytes */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200388 unsigned int frags; /* number for period in the play buffer */
389 unsigned int fifo_size; /* FIFO size */
Jaroslav Kyselae5463722010-05-11 10:21:46 +0200390 unsigned long start_wallclk; /* start + minimum wallclk */
391 unsigned long period_wallclk; /* wallclk for period */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700392
Takashi Iwaid01ce992007-07-27 16:52:19 +0200393 void __iomem *sd_addr; /* stream descriptor pointer */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700394
Takashi Iwaid01ce992007-07-27 16:52:19 +0200395 u32 sd_int_sta_mask; /* stream int status mask */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700396
397 /* pcm support */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200398 struct snd_pcm_substream *substream; /* assigned substream,
399 * set in PCM open
400 */
401 unsigned int format_val; /* format value to be set in the
402 * controller and the codec
403 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700404 unsigned char stream_tag; /* assigned stream */
405 unsigned char index; /* stream index */
Takashi Iwaid5cf9912011-10-06 10:07:58 +0200406 int assigned_key; /* last device# key assigned to */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700407
Pavel Machek927fc862006-08-31 17:03:43 +0200408 unsigned int opened :1;
409 unsigned int running :1;
Takashi Iwai675f25d2008-06-10 17:53:20 +0200410 unsigned int irq_pending :1;
Joseph Chan0e153472008-08-26 14:38:03 +0200411 /*
412 * For VIA:
413 * A flag to ensure DMA position is 0
414 * when link position is not greater than FIFO size
415 */
416 unsigned int insufficient :1;
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200417 unsigned int wc_marked:1;
Takashi Iwai915bf292012-09-11 15:19:10 +0200418 unsigned int no_period_wakeup:1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700419};
420
421/* CORB/RIRB */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100422struct azx_rb {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700423 u32 *buf; /* CORB/RIRB buffer
424 * Each CORB entry is 4byte, RIRB is 8byte
425 */
426 dma_addr_t addr; /* physical address of CORB/RIRB buffer */
427 /* for RIRB */
428 unsigned short rp, wp; /* read/write pointers */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800429 int cmds[AZX_MAX_CODECS]; /* number of pending requests */
430 u32 res[AZX_MAX_CODECS]; /* last read value */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700431};
432
Takashi Iwai01b65bf2011-11-24 14:31:46 +0100433struct azx_pcm {
434 struct azx *chip;
435 struct snd_pcm *pcm;
436 struct hda_codec *codec;
437 struct hda_pcm_stream *hinfo[2];
438 struct list_head list;
439};
440
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100441struct azx {
442 struct snd_card *card;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700443 struct pci_dev *pci;
Takashi Iwai555e2192008-06-10 17:53:34 +0200444 int dev_index;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700445
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200446 /* chip type specific */
447 int driver_type;
Takashi Iwai9477c582011-05-25 09:11:37 +0200448 unsigned int driver_caps;
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200449 int playback_streams;
450 int playback_index_offset;
451 int capture_streams;
452 int capture_index_offset;
453 int num_streams;
454
Linus Torvalds1da177e2005-04-16 15:20:36 -0700455 /* pci resources */
456 unsigned long addr;
457 void __iomem *remap_addr;
458 int irq;
459
460 /* locks */
461 spinlock_t reg_lock;
Ingo Molnar62932df2006-01-16 16:34:20 +0100462 struct mutex open_mutex;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700463
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200464 /* streams (x num_streams) */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100465 struct azx_dev *azx_dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700466
467 /* PCM */
Takashi Iwai01b65bf2011-11-24 14:31:46 +0100468 struct list_head pcm_list; /* azx_pcm list */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700469
470 /* HD codec */
471 unsigned short codec_mask;
Takashi Iwaif1eaaee2009-02-13 08:16:55 +0100472 int codec_probe_mask; /* copied from probe_mask option */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700473 struct hda_bus *bus;
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +0100474 unsigned int beep_mode;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700475
476 /* CORB/RIRB */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100477 struct azx_rb corb;
478 struct azx_rb rirb;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700479
Takashi Iwai4ce107b2008-02-06 14:50:19 +0100480 /* CORB/RIRB and position buffers */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700481 struct snd_dma_buffer rb;
482 struct snd_dma_buffer posbuf;
Takashi Iwaic74db862005-05-12 14:26:27 +0200483
Takashi Iwai4918cda2012-08-09 12:33:28 +0200484#ifdef CONFIG_SND_HDA_PATCH_LOADER
485 const struct firmware *fw;
486#endif
487
Takashi Iwaic74db862005-05-12 14:26:27 +0200488 /* flags */
Shahin Ghazinouribeaffc32010-05-11 08:19:55 +0200489 int position_fix[2]; /* for both playback/capture streams */
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200490 int poll_count;
Takashi Iwaicb53c622007-08-10 17:21:45 +0200491 unsigned int running :1;
Pavel Machek927fc862006-08-31 17:03:43 +0200492 unsigned int initialized :1;
493 unsigned int single_cmd :1;
494 unsigned int polling_mode :1;
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200495 unsigned int msi :1;
Takashi Iwaia6a950a2008-06-10 17:53:35 +0200496 unsigned int irq_pending_warned :1;
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +0100497 unsigned int probing :1; /* codec probing phase */
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200498 unsigned int snoop:1;
Takashi Iwai52409aa2012-01-23 17:10:24 +0100499 unsigned int align_buffer_size:1;
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200500 unsigned int region_requested:1;
501
502 /* VGA-switcheroo setup */
503 unsigned int use_vga_switcheroo:1;
Takashi Iwai128960a2012-10-12 17:28:18 +0200504 unsigned int vga_switcheroo_registered:1;
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200505 unsigned int init_failed:1; /* delayed init failed */
506 unsigned int disabled:1; /* disabled by VGA-switcher */
Takashi Iwai43bbb6c2007-07-06 20:22:05 +0200507
508 /* for debugging */
Wu Fengguangfeb27342009-08-01 19:17:14 +0800509 unsigned int last_cmd[AZX_MAX_CODECS];
Takashi Iwai9ad593f2008-05-16 12:34:47 +0200510
511 /* for pending irqs */
512 struct work_struct irq_pending_work;
Takashi Iwai0cbf0092008-10-29 16:18:25 +0100513
514 /* reboot notifier (for mysterious hangup problem at power-down) */
515 struct notifier_block reboot_notifier;
Takashi Iwai65fcd412012-08-14 17:13:32 +0200516
517 /* card list (for power_save trigger) */
518 struct list_head list;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700519};
520
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200521/* driver types */
522enum {
523 AZX_DRIVER_ICH,
Seth Heasley32679f92010-02-22 17:31:09 -0800524 AZX_DRIVER_PCH,
Tobin Davis4979bca2008-01-30 08:13:55 +0100525 AZX_DRIVER_SCH,
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200526 AZX_DRIVER_ATI,
Felix Kuehling778b6e12006-05-17 11:22:21 +0200527 AZX_DRIVER_ATIHDMI,
Andiry Xu1815b342011-12-14 16:10:27 +0800528 AZX_DRIVER_ATIHDMI_NS,
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200529 AZX_DRIVER_VIA,
530 AZX_DRIVER_SIS,
531 AZX_DRIVER_ULI,
Vinod Gda3fca22005-09-13 18:49:12 +0200532 AZX_DRIVER_NVIDIA,
Kailang Yangf2690022008-05-27 11:44:55 +0200533 AZX_DRIVER_TERA,
Takashi Iwai14d34f12010-10-21 09:03:25 +0200534 AZX_DRIVER_CTX,
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200535 AZX_DRIVER_CTHDA,
Yang, Libinc4da29c2008-11-13 11:07:07 +0100536 AZX_DRIVER_GENERIC,
Takashi Iwai2f5983f2008-09-03 16:00:44 +0200537 AZX_NUM_DRIVERS, /* keep this as last entry */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200538};
539
Takashi Iwai9477c582011-05-25 09:11:37 +0200540/* driver quirks (capabilities) */
541/* bits 0-7 are used for indicating driver type */
542#define AZX_DCAPS_NO_TCSEL (1 << 8) /* No Intel TCSEL bit */
543#define AZX_DCAPS_NO_MSI (1 << 9) /* No MSI support */
544#define AZX_DCAPS_ATI_SNOOP (1 << 10) /* ATI snoop enable */
545#define AZX_DCAPS_NVIDIA_SNOOP (1 << 11) /* Nvidia snoop enable */
546#define AZX_DCAPS_SCH_SNOOP (1 << 12) /* SCH/PCH snoop enable */
547#define AZX_DCAPS_RIRB_DELAY (1 << 13) /* Long delay in read loop */
548#define AZX_DCAPS_RIRB_PRE_DELAY (1 << 14) /* Put a delay before read */
549#define AZX_DCAPS_CTX_WORKAROUND (1 << 15) /* X-Fi workaround */
550#define AZX_DCAPS_POSFIX_LPIB (1 << 16) /* Use LPIB as default */
551#define AZX_DCAPS_POSFIX_VIA (1 << 17) /* Use VIACOMBO as default */
552#define AZX_DCAPS_NO_64BIT (1 << 18) /* No 64bit address */
553#define AZX_DCAPS_SYNC_WRITE (1 << 19) /* sync each cmd write */
Takashi Iwai8b0bd222011-06-10 14:56:26 +0200554#define AZX_DCAPS_OLD_SSYNC (1 << 20) /* Old SSYNC reg for ICH */
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -0500555#define AZX_DCAPS_BUFSIZE (1 << 21) /* no buffer size alignment */
Takashi Iwai7bfe0592012-01-23 17:53:39 +0100556#define AZX_DCAPS_ALIGN_BUFSIZE (1 << 22) /* buffer size alignment */
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200557#define AZX_DCAPS_4K_BDLE_BOUNDARY (1 << 23) /* BDLE in 4k boundary */
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -0500558#define AZX_DCAPS_COUNT_LPIB_DELAY (1 << 25) /* Take LPIB as delay */
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +0100559#define AZX_DCAPS_PM_RUNTIME (1 << 26) /* runtime PM support */
560
561/* quirks for Intel PCH */
562#define AZX_DCAPS_INTEL_PCH \
563 (AZX_DCAPS_SCH_SNOOP | AZX_DCAPS_BUFSIZE | \
564 AZX_DCAPS_COUNT_LPIB_DELAY | AZX_DCAPS_PM_RUNTIME)
Takashi Iwai9477c582011-05-25 09:11:37 +0200565
566/* quirks for ATI SB / AMD Hudson */
567#define AZX_DCAPS_PRESET_ATI_SB \
568 (AZX_DCAPS_ATI_SNOOP | AZX_DCAPS_NO_TCSEL | \
569 AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB)
570
571/* quirks for ATI/AMD HDMI */
572#define AZX_DCAPS_PRESET_ATI_HDMI \
573 (AZX_DCAPS_NO_TCSEL | AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB)
574
575/* quirks for Nvidia */
576#define AZX_DCAPS_PRESET_NVIDIA \
Takashi Iwai7bfe0592012-01-23 17:53:39 +0100577 (AZX_DCAPS_NVIDIA_SNOOP | AZX_DCAPS_RIRB_DELAY | AZX_DCAPS_NO_MSI |\
578 AZX_DCAPS_ALIGN_BUFSIZE)
Takashi Iwai9477c582011-05-25 09:11:37 +0200579
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200580#define AZX_DCAPS_PRESET_CTHDA \
581 (AZX_DCAPS_NO_MSI | AZX_DCAPS_POSFIX_LPIB | AZX_DCAPS_4K_BDLE_BOUNDARY)
582
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200583/*
584 * VGA-switcher support
585 */
586#ifdef SUPPORT_VGA_SWITCHEROO
Takashi Iwai5cb543d2012-08-09 13:49:23 +0200587#define use_vga_switcheroo(chip) ((chip)->use_vga_switcheroo)
588#else
589#define use_vga_switcheroo(chip) 0
590#endif
591
592#if defined(SUPPORT_VGA_SWITCHEROO) || defined(CONFIG_SND_HDA_PATCH_LOADER)
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200593#define DELAYED_INIT_MARK
594#define DELAYED_INITDATA_MARK
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200595#else
596#define DELAYED_INIT_MARK __devinit
597#define DELAYED_INITDATA_MARK __devinitdata
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200598#endif
599
600static char *driver_short_names[] DELAYED_INITDATA_MARK = {
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200601 [AZX_DRIVER_ICH] = "HDA Intel",
Seth Heasley32679f92010-02-22 17:31:09 -0800602 [AZX_DRIVER_PCH] = "HDA Intel PCH",
Tobin Davis4979bca2008-01-30 08:13:55 +0100603 [AZX_DRIVER_SCH] = "HDA Intel MID",
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200604 [AZX_DRIVER_ATI] = "HDA ATI SB",
Felix Kuehling778b6e12006-05-17 11:22:21 +0200605 [AZX_DRIVER_ATIHDMI] = "HDA ATI HDMI",
Andiry Xu1815b342011-12-14 16:10:27 +0800606 [AZX_DRIVER_ATIHDMI_NS] = "HDA ATI HDMI",
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200607 [AZX_DRIVER_VIA] = "HDA VIA VT82xx",
608 [AZX_DRIVER_SIS] = "HDA SIS966",
Vinod Gda3fca22005-09-13 18:49:12 +0200609 [AZX_DRIVER_ULI] = "HDA ULI M5461",
610 [AZX_DRIVER_NVIDIA] = "HDA NVidia",
Kailang Yangf2690022008-05-27 11:44:55 +0200611 [AZX_DRIVER_TERA] = "HDA Teradici",
Takashi Iwai14d34f12010-10-21 09:03:25 +0200612 [AZX_DRIVER_CTX] = "HDA Creative",
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200613 [AZX_DRIVER_CTHDA] = "HDA Creative",
Yang, Libinc4da29c2008-11-13 11:07:07 +0100614 [AZX_DRIVER_GENERIC] = "HD-Audio Generic",
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200615};
616
Linus Torvalds1da177e2005-04-16 15:20:36 -0700617/*
618 * macros for easy use
619 */
620#define azx_writel(chip,reg,value) \
621 writel(value, (chip)->remap_addr + ICH6_REG_##reg)
622#define azx_readl(chip,reg) \
623 readl((chip)->remap_addr + ICH6_REG_##reg)
624#define azx_writew(chip,reg,value) \
625 writew(value, (chip)->remap_addr + ICH6_REG_##reg)
626#define azx_readw(chip,reg) \
627 readw((chip)->remap_addr + ICH6_REG_##reg)
628#define azx_writeb(chip,reg,value) \
629 writeb(value, (chip)->remap_addr + ICH6_REG_##reg)
630#define azx_readb(chip,reg) \
631 readb((chip)->remap_addr + ICH6_REG_##reg)
632
633#define azx_sd_writel(dev,reg,value) \
634 writel(value, (dev)->sd_addr + ICH6_REG_##reg)
635#define azx_sd_readl(dev,reg) \
636 readl((dev)->sd_addr + ICH6_REG_##reg)
637#define azx_sd_writew(dev,reg,value) \
638 writew(value, (dev)->sd_addr + ICH6_REG_##reg)
639#define azx_sd_readw(dev,reg) \
640 readw((dev)->sd_addr + ICH6_REG_##reg)
641#define azx_sd_writeb(dev,reg,value) \
642 writeb(value, (dev)->sd_addr + ICH6_REG_##reg)
643#define azx_sd_readb(dev,reg) \
644 readb((dev)->sd_addr + ICH6_REG_##reg)
645
646/* for pcm support */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100647#define get_azx_dev(substream) (substream->runtime->private_data)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700648
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200649#ifdef CONFIG_X86
650static void __mark_pages_wc(struct azx *chip, void *addr, size_t size, bool on)
651{
652 if (azx_snoop(chip))
653 return;
654 if (addr && size) {
655 int pages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
656 if (on)
657 set_memory_wc((unsigned long)addr, pages);
658 else
659 set_memory_wb((unsigned long)addr, pages);
660 }
661}
662
663static inline void mark_pages_wc(struct azx *chip, struct snd_dma_buffer *buf,
664 bool on)
665{
666 __mark_pages_wc(chip, buf->area, buf->bytes, on);
667}
668static inline void mark_runtime_wc(struct azx *chip, struct azx_dev *azx_dev,
669 struct snd_pcm_runtime *runtime, bool on)
670{
671 if (azx_dev->wc_marked != on) {
672 __mark_pages_wc(chip, runtime->dma_area, runtime->dma_bytes, on);
673 azx_dev->wc_marked = on;
674 }
675}
676#else
677/* NOP for other archs */
678static inline void mark_pages_wc(struct azx *chip, struct snd_dma_buffer *buf,
679 bool on)
680{
681}
682static inline void mark_runtime_wc(struct azx *chip, struct azx_dev *azx_dev,
683 struct snd_pcm_runtime *runtime, bool on)
684{
685}
686#endif
687
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200688static int azx_acquire_irq(struct azx *chip, int do_disconnect);
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200689static int azx_send_cmd(struct hda_bus *bus, unsigned int val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700690/*
691 * Interface for HD codec
692 */
693
Linus Torvalds1da177e2005-04-16 15:20:36 -0700694/*
695 * CORB / RIRB interface
696 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100697static int azx_alloc_cmd_io(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700698{
699 int err;
700
701 /* single page (at least 4096 bytes) must suffice for both ringbuffes */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200702 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
703 snd_dma_pci_data(chip->pci),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700704 PAGE_SIZE, &chip->rb);
705 if (err < 0) {
706 snd_printk(KERN_ERR SFX "cannot allocate CORB/RIRB\n");
707 return err;
708 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200709 mark_pages_wc(chip, &chip->rb, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700710 return 0;
711}
712
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100713static void azx_init_cmd_io(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700714{
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800715 spin_lock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700716 /* CORB set up */
717 chip->corb.addr = chip->rb.addr;
718 chip->corb.buf = (u32 *)chip->rb.area;
719 azx_writel(chip, CORBLBASE, (u32)chip->corb.addr);
Takashi Iwai766979e2008-06-13 20:53:56 +0200720 azx_writel(chip, CORBUBASE, upper_32_bits(chip->corb.addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700721
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200722 /* set the corb size to 256 entries (ULI requires explicitly) */
723 azx_writeb(chip, CORBSIZE, 0x02);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700724 /* set the corb write pointer to 0 */
725 azx_writew(chip, CORBWP, 0);
726 /* reset the corb hw read pointer */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200727 azx_writew(chip, CORBRP, ICH6_CORBRP_RST);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700728 /* enable corb dma */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200729 azx_writeb(chip, CORBCTL, ICH6_CORBCTL_RUN);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700730
731 /* RIRB set up */
732 chip->rirb.addr = chip->rb.addr + 2048;
733 chip->rirb.buf = (u32 *)(chip->rb.area + 2048);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800734 chip->rirb.wp = chip->rirb.rp = 0;
735 memset(chip->rirb.cmds, 0, sizeof(chip->rirb.cmds));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700736 azx_writel(chip, RIRBLBASE, (u32)chip->rirb.addr);
Takashi Iwai766979e2008-06-13 20:53:56 +0200737 azx_writel(chip, RIRBUBASE, upper_32_bits(chip->rirb.addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700738
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200739 /* set the rirb size to 256 entries (ULI requires explicitly) */
740 azx_writeb(chip, RIRBSIZE, 0x02);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700741 /* reset the rirb hw write pointer */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200742 azx_writew(chip, RIRBWP, ICH6_RIRBWP_RST);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700743 /* set N=1, get RIRB response interrupt for new entry */
Takashi Iwai9477c582011-05-25 09:11:37 +0200744 if (chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND)
Takashi Iwai14d34f12010-10-21 09:03:25 +0200745 azx_writew(chip, RINTCNT, 0xc0);
746 else
747 azx_writew(chip, RINTCNT, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700748 /* enable rirb dma and response irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700749 azx_writeb(chip, RIRBCTL, ICH6_RBCTL_DMA_EN | ICH6_RBCTL_IRQ_EN);
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800750 spin_unlock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700751}
752
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100753static void azx_free_cmd_io(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700754{
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800755 spin_lock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700756 /* disable ringbuffer DMAs */
757 azx_writeb(chip, RIRBCTL, 0);
758 azx_writeb(chip, CORBCTL, 0);
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800759 spin_unlock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700760}
761
Wu Fengguangdeadff12009-08-01 18:45:16 +0800762static unsigned int azx_command_addr(u32 cmd)
763{
764 unsigned int addr = cmd >> 28;
765
766 if (addr >= AZX_MAX_CODECS) {
767 snd_BUG();
768 addr = 0;
769 }
770
771 return addr;
772}
773
774static unsigned int azx_response_addr(u32 res)
775{
776 unsigned int addr = res & 0xf;
777
778 if (addr >= AZX_MAX_CODECS) {
779 snd_BUG();
780 addr = 0;
781 }
782
783 return addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700784}
785
786/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100787static int azx_corb_send_cmd(struct hda_bus *bus, u32 val)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700788{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100789 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800790 unsigned int addr = azx_command_addr(val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700791 unsigned int wp;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700792
Wu Fengguangc32649f2009-08-01 18:48:12 +0800793 spin_lock_irq(&chip->reg_lock);
794
Linus Torvalds1da177e2005-04-16 15:20:36 -0700795 /* add command to corb */
796 wp = azx_readb(chip, CORBWP);
797 wp++;
798 wp %= ICH6_MAX_CORB_ENTRIES;
799
Wu Fengguangdeadff12009-08-01 18:45:16 +0800800 chip->rirb.cmds[addr]++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700801 chip->corb.buf[wp] = cpu_to_le32(val);
802 azx_writel(chip, CORBWP, wp);
Wu Fengguangc32649f2009-08-01 18:48:12 +0800803
Linus Torvalds1da177e2005-04-16 15:20:36 -0700804 spin_unlock_irq(&chip->reg_lock);
805
806 return 0;
807}
808
809#define ICH6_RIRB_EX_UNSOL_EV (1<<4)
810
811/* retrieve RIRB entry - called from interrupt handler */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100812static void azx_update_rirb(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700813{
814 unsigned int rp, wp;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800815 unsigned int addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700816 u32 res, res_ex;
817
818 wp = azx_readb(chip, RIRBWP);
819 if (wp == chip->rirb.wp)
820 return;
821 chip->rirb.wp = wp;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800822
Linus Torvalds1da177e2005-04-16 15:20:36 -0700823 while (chip->rirb.rp != wp) {
824 chip->rirb.rp++;
825 chip->rirb.rp %= ICH6_MAX_RIRB_ENTRIES;
826
827 rp = chip->rirb.rp << 1; /* an RIRB entry is 8-bytes */
828 res_ex = le32_to_cpu(chip->rirb.buf[rp + 1]);
829 res = le32_to_cpu(chip->rirb.buf[rp]);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800830 addr = azx_response_addr(res_ex);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700831 if (res_ex & ICH6_RIRB_EX_UNSOL_EV)
832 snd_hda_queue_unsol_event(chip->bus, res, res_ex);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800833 else if (chip->rirb.cmds[addr]) {
834 chip->rirb.res[addr] = res;
Takashi Iwai2add9b92008-03-18 09:47:06 +0100835 smp_wmb();
Wu Fengguangdeadff12009-08-01 18:45:16 +0800836 chip->rirb.cmds[addr]--;
Wu Fengguange310bb02009-08-01 19:18:45 +0800837 } else
838 snd_printk(KERN_ERR SFX "spurious response %#x:%#x, "
839 "last cmd=%#08x\n",
840 res, res_ex,
841 chip->last_cmd[addr]);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700842 }
843}
844
845/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800846static unsigned int azx_rirb_get_response(struct hda_bus *bus,
847 unsigned int addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700848{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100849 struct azx *chip = bus->private_data;
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200850 unsigned long timeout;
David Henningsson32cf4022012-05-04 11:05:55 +0200851 unsigned long loopcounter;
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200852 int do_poll = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700853
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200854 again:
855 timeout = jiffies + msecs_to_jiffies(1000);
David Henningsson32cf4022012-05-04 11:05:55 +0200856
857 for (loopcounter = 0;; loopcounter++) {
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200858 if (chip->polling_mode || do_poll) {
Takashi Iwaie96224a2006-08-21 17:57:44 +0200859 spin_lock_irq(&chip->reg_lock);
860 azx_update_rirb(chip);
861 spin_unlock_irq(&chip->reg_lock);
862 }
Wu Fengguangdeadff12009-08-01 18:45:16 +0800863 if (!chip->rirb.cmds[addr]) {
Takashi Iwai2add9b92008-03-18 09:47:06 +0100864 smp_rmb();
Takashi Iwaib6132912009-03-24 07:36:09 +0100865 bus->rirb_error = 0;
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200866
867 if (!do_poll)
868 chip->poll_count = 0;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800869 return chip->rirb.res[addr]; /* the last value */
Takashi Iwai2add9b92008-03-18 09:47:06 +0100870 }
Takashi Iwai28a0d9d2008-01-18 15:32:32 +0100871 if (time_after(jiffies, timeout))
872 break;
David Henningsson32cf4022012-05-04 11:05:55 +0200873 if (bus->needs_damn_long_delay || loopcounter > 3000)
Takashi Iwai52987652008-01-16 16:09:47 +0100874 msleep(2); /* temporary workaround */
875 else {
876 udelay(10);
877 cond_resched();
878 }
Takashi Iwai28a0d9d2008-01-18 15:32:32 +0100879 }
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200880
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200881 if (!chip->polling_mode && chip->poll_count < 2) {
882 snd_printdd(SFX "azx_get_response timeout, "
883 "polling the codec once: last cmd=0x%08x\n",
884 chip->last_cmd[addr]);
885 do_poll = 1;
886 chip->poll_count++;
887 goto again;
888 }
889
890
Takashi Iwai23c4a882009-10-30 13:21:49 +0100891 if (!chip->polling_mode) {
892 snd_printk(KERN_WARNING SFX "azx_get_response timeout, "
893 "switching to polling mode: last cmd=0x%08x\n",
894 chip->last_cmd[addr]);
895 chip->polling_mode = 1;
896 goto again;
897 }
898
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200899 if (chip->msi) {
Takashi Iwai4abc1cc2009-05-19 12:16:46 +0200900 snd_printk(KERN_WARNING SFX "No response from codec, "
Wu Fengguangfeb27342009-08-01 19:17:14 +0800901 "disabling MSI: last cmd=0x%08x\n",
902 chip->last_cmd[addr]);
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200903 free_irq(chip->irq, chip);
904 chip->irq = -1;
905 pci_disable_msi(chip->pci);
906 chip->msi = 0;
Takashi Iwaib6132912009-03-24 07:36:09 +0100907 if (azx_acquire_irq(chip, 1) < 0) {
908 bus->rirb_error = 1;
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200909 return -1;
Takashi Iwaib6132912009-03-24 07:36:09 +0100910 }
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200911 goto again;
912 }
913
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +0100914 if (chip->probing) {
915 /* If this critical timeout happens during the codec probing
916 * phase, this is likely an access to a non-existing codec
917 * slot. Better to return an error and reset the system.
918 */
919 return -1;
920 }
921
Takashi Iwai8dd78332009-06-02 01:16:07 +0200922 /* a fatal communication error; need either to reset or to fallback
923 * to the single_cmd mode
924 */
Takashi Iwaib6132912009-03-24 07:36:09 +0100925 bus->rirb_error = 1;
Takashi Iwaib20f3b82009-06-02 01:20:22 +0200926 if (bus->allow_bus_reset && !bus->response_reset && !bus->in_reset) {
Takashi Iwai8dd78332009-06-02 01:16:07 +0200927 bus->response_reset = 1;
928 return -1; /* give a chance to retry */
929 }
930
931 snd_printk(KERN_ERR "hda_intel: azx_get_response timeout, "
932 "switching to single_cmd mode: last cmd=0x%08x\n",
Wu Fengguangfeb27342009-08-01 19:17:14 +0800933 chip->last_cmd[addr]);
Takashi Iwai8dd78332009-06-02 01:16:07 +0200934 chip->single_cmd = 1;
935 bus->response_reset = 0;
Takashi Iwai1a696972009-11-07 09:49:04 +0100936 /* release CORB/RIRB */
Takashi Iwai4fcd3922009-05-25 18:34:52 +0200937 azx_free_cmd_io(chip);
Takashi Iwai1a696972009-11-07 09:49:04 +0100938 /* disable unsolicited responses */
939 azx_writel(chip, GCTL, azx_readl(chip, GCTL) & ~ICH6_GCTL_UNSOL);
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200940 return -1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700941}
942
Linus Torvalds1da177e2005-04-16 15:20:36 -0700943/*
944 * Use the single immediate command instead of CORB/RIRB for simplicity
945 *
946 * Note: according to Intel, this is not preferred use. The command was
947 * intended for the BIOS only, and may get confused with unsolicited
948 * responses. So, we shouldn't use it for normal operation from the
949 * driver.
950 * I left the codes, however, for debugging/testing purposes.
951 */
952
Takashi Iwaib05a7d42009-05-28 11:59:12 +0200953/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800954static int azx_single_wait_for_response(struct azx *chip, unsigned int addr)
Takashi Iwaib05a7d42009-05-28 11:59:12 +0200955{
956 int timeout = 50;
957
958 while (timeout--) {
959 /* check IRV busy bit */
960 if (azx_readw(chip, IRS) & ICH6_IRS_VALID) {
961 /* reuse rirb.res as the response return value */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800962 chip->rirb.res[addr] = azx_readl(chip, IR);
Takashi Iwaib05a7d42009-05-28 11:59:12 +0200963 return 0;
964 }
965 udelay(1);
966 }
967 if (printk_ratelimit())
968 snd_printd(SFX "get_response timeout: IRS=0x%x\n",
969 azx_readw(chip, IRS));
Wu Fengguangdeadff12009-08-01 18:45:16 +0800970 chip->rirb.res[addr] = -1;
Takashi Iwaib05a7d42009-05-28 11:59:12 +0200971 return -EIO;
972}
973
Linus Torvalds1da177e2005-04-16 15:20:36 -0700974/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100975static int azx_single_send_cmd(struct hda_bus *bus, u32 val)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700976{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100977 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800978 unsigned int addr = azx_command_addr(val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700979 int timeout = 50;
980
Takashi Iwai8dd78332009-06-02 01:16:07 +0200981 bus->rirb_error = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700982 while (timeout--) {
983 /* check ICB busy bit */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200984 if (!((azx_readw(chip, IRS) & ICH6_IRS_BUSY))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700985 /* Clear IRV valid bit */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200986 azx_writew(chip, IRS, azx_readw(chip, IRS) |
987 ICH6_IRS_VALID);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700988 azx_writel(chip, IC, val);
Takashi Iwaid01ce992007-07-27 16:52:19 +0200989 azx_writew(chip, IRS, azx_readw(chip, IRS) |
990 ICH6_IRS_BUSY);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800991 return azx_single_wait_for_response(chip, addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700992 }
993 udelay(1);
994 }
Marc Boucher1cfd52b2008-01-22 15:29:26 +0100995 if (printk_ratelimit())
996 snd_printd(SFX "send_cmd timeout: IRS=0x%x, val=0x%x\n",
997 azx_readw(chip, IRS), val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700998 return -EIO;
999}
1000
1001/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +08001002static unsigned int azx_single_get_response(struct hda_bus *bus,
1003 unsigned int addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001004{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001005 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +08001006 return chip->rirb.res[addr];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001007}
1008
Takashi Iwai111d3af2006-02-16 18:17:58 +01001009/*
1010 * The below are the main callbacks from hda_codec.
1011 *
1012 * They are just the skeleton to call sub-callbacks according to the
1013 * current setting of chip->single_cmd.
1014 */
1015
1016/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001017static int azx_send_cmd(struct hda_bus *bus, unsigned int val)
Takashi Iwai111d3af2006-02-16 18:17:58 +01001018{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001019 struct azx *chip = bus->private_data;
Takashi Iwai43bbb6c2007-07-06 20:22:05 +02001020
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001021 if (chip->disabled)
1022 return 0;
Wu Fengguangfeb27342009-08-01 19:17:14 +08001023 chip->last_cmd[azx_command_addr(val)] = val;
Takashi Iwai111d3af2006-02-16 18:17:58 +01001024 if (chip->single_cmd)
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001025 return azx_single_send_cmd(bus, val);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001026 else
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001027 return azx_corb_send_cmd(bus, val);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001028}
1029
1030/* get a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +08001031static unsigned int azx_get_response(struct hda_bus *bus,
1032 unsigned int addr)
Takashi Iwai111d3af2006-02-16 18:17:58 +01001033{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001034 struct azx *chip = bus->private_data;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001035 if (chip->disabled)
1036 return 0;
Takashi Iwai111d3af2006-02-16 18:17:58 +01001037 if (chip->single_cmd)
Wu Fengguangdeadff12009-08-01 18:45:16 +08001038 return azx_single_get_response(bus, addr);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001039 else
Wu Fengguangdeadff12009-08-01 18:45:16 +08001040 return azx_rirb_get_response(bus, addr);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001041}
1042
Takashi Iwai83012a72012-08-24 18:38:08 +02001043#ifdef CONFIG_PM
Takashi Iwai68467f52012-08-28 09:14:29 -07001044static void azx_power_notify(struct hda_bus *bus, bool power_up);
Takashi Iwaicb53c622007-08-10 17:21:45 +02001045#endif
Takashi Iwai111d3af2006-02-16 18:17:58 +01001046
Linus Torvalds1da177e2005-04-16 15:20:36 -07001047/* reset codec link */
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001048static int azx_reset(struct azx *chip, int full_reset)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001049{
1050 int count;
1051
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001052 if (!full_reset)
1053 goto __skip;
1054
Danny Tholene8a7f132007-09-11 21:41:56 +02001055 /* clear STATESTS */
1056 azx_writeb(chip, STATESTS, STATESTS_INT_MASK);
1057
Linus Torvalds1da177e2005-04-16 15:20:36 -07001058 /* reset controller */
1059 azx_writel(chip, GCTL, azx_readl(chip, GCTL) & ~ICH6_GCTL_RESET);
1060
1061 count = 50;
1062 while (azx_readb(chip, GCTL) && --count)
1063 msleep(1);
1064
1065 /* delay for >= 100us for codec PLL to settle per spec
1066 * Rev 0.9 section 5.5.1
1067 */
1068 msleep(1);
1069
1070 /* Bring controller out of reset */
1071 azx_writeb(chip, GCTL, azx_readb(chip, GCTL) | ICH6_GCTL_RESET);
1072
1073 count = 50;
Pavel Machek927fc862006-08-31 17:03:43 +02001074 while (!azx_readb(chip, GCTL) && --count)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001075 msleep(1);
1076
Pavel Machek927fc862006-08-31 17:03:43 +02001077 /* Brent Chartrand said to wait >= 540us for codecs to initialize */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001078 msleep(1);
1079
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001080 __skip:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001081 /* check to see if controller is ready */
Pavel Machek927fc862006-08-31 17:03:43 +02001082 if (!azx_readb(chip, GCTL)) {
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001083 snd_printd(SFX "azx_reset: controller not ready!\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001084 return -EBUSY;
1085 }
1086
Matt41e2fce2005-07-04 17:49:55 +02001087 /* Accept unsolicited responses */
Takashi Iwai1a696972009-11-07 09:49:04 +01001088 if (!chip->single_cmd)
1089 azx_writel(chip, GCTL, azx_readl(chip, GCTL) |
1090 ICH6_GCTL_UNSOL);
Matt41e2fce2005-07-04 17:49:55 +02001091
Linus Torvalds1da177e2005-04-16 15:20:36 -07001092 /* detect codecs */
Pavel Machek927fc862006-08-31 17:03:43 +02001093 if (!chip->codec_mask) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001094 chip->codec_mask = azx_readw(chip, STATESTS);
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001095 snd_printdd(SFX "codec_mask = 0x%x\n", chip->codec_mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001096 }
1097
1098 return 0;
1099}
1100
1101
1102/*
1103 * Lowlevel interface
1104 */
1105
1106/* enable interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001107static void azx_int_enable(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001108{
1109 /* enable controller CIE and GIE */
1110 azx_writel(chip, INTCTL, azx_readl(chip, INTCTL) |
1111 ICH6_INT_CTRL_EN | ICH6_INT_GLOBAL_EN);
1112}
1113
1114/* disable interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001115static void azx_int_disable(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001116{
1117 int i;
1118
1119 /* disable interrupts in stream descriptor */
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001120 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001121 struct azx_dev *azx_dev = &chip->azx_dev[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001122 azx_sd_writeb(azx_dev, SD_CTL,
1123 azx_sd_readb(azx_dev, SD_CTL) & ~SD_INT_MASK);
1124 }
1125
1126 /* disable SIE for all streams */
1127 azx_writeb(chip, INTCTL, 0);
1128
1129 /* disable controller CIE and GIE */
1130 azx_writel(chip, INTCTL, azx_readl(chip, INTCTL) &
1131 ~(ICH6_INT_CTRL_EN | ICH6_INT_GLOBAL_EN));
1132}
1133
1134/* clear interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001135static void azx_int_clear(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001136{
1137 int i;
1138
1139 /* clear stream status */
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001140 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001141 struct azx_dev *azx_dev = &chip->azx_dev[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001142 azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK);
1143 }
1144
1145 /* clear STATESTS */
1146 azx_writeb(chip, STATESTS, STATESTS_INT_MASK);
1147
1148 /* clear rirb status */
1149 azx_writeb(chip, RIRBSTS, RIRB_INT_MASK);
1150
1151 /* clear int status */
1152 azx_writel(chip, INTSTS, ICH6_INT_CTRL_EN | ICH6_INT_ALL_STREAM);
1153}
1154
1155/* start a stream */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001156static void azx_stream_start(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001157{
Joseph Chan0e153472008-08-26 14:38:03 +02001158 /*
1159 * Before stream start, initialize parameter
1160 */
1161 azx_dev->insufficient = 1;
1162
Linus Torvalds1da177e2005-04-16 15:20:36 -07001163 /* enable SIE */
Wei Niccc5df02010-01-26 15:59:33 +08001164 azx_writel(chip, INTCTL,
1165 azx_readl(chip, INTCTL) | (1 << azx_dev->index));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001166 /* set DMA start and interrupt mask */
1167 azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) |
1168 SD_CTL_DMA_START | SD_INT_MASK);
1169}
1170
Takashi Iwai1dddab42009-03-18 15:15:37 +01001171/* stop DMA */
1172static void azx_stream_clear(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001173{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001174 azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) &
1175 ~(SD_CTL_DMA_START | SD_INT_MASK));
1176 azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK); /* to be sure */
Takashi Iwai1dddab42009-03-18 15:15:37 +01001177}
1178
1179/* stop a stream */
1180static void azx_stream_stop(struct azx *chip, struct azx_dev *azx_dev)
1181{
1182 azx_stream_clear(chip, azx_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001183 /* disable SIE */
Wei Niccc5df02010-01-26 15:59:33 +08001184 azx_writel(chip, INTCTL,
1185 azx_readl(chip, INTCTL) & ~(1 << azx_dev->index));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001186}
1187
1188
1189/*
Takashi Iwaicb53c622007-08-10 17:21:45 +02001190 * reset and start the controller registers
Linus Torvalds1da177e2005-04-16 15:20:36 -07001191 */
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001192static void azx_init_chip(struct azx *chip, int full_reset)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001193{
Takashi Iwaicb53c622007-08-10 17:21:45 +02001194 if (chip->initialized)
1195 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001196
1197 /* reset controller */
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001198 azx_reset(chip, full_reset);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001199
1200 /* initialize interrupts */
1201 azx_int_clear(chip);
1202 azx_int_enable(chip);
1203
1204 /* initialize the codec command I/O */
Takashi Iwai1a696972009-11-07 09:49:04 +01001205 if (!chip->single_cmd)
1206 azx_init_cmd_io(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001207
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02001208 /* program the position buffer */
1209 azx_writel(chip, DPLBASE, (u32)chip->posbuf.addr);
Takashi Iwai766979e2008-06-13 20:53:56 +02001210 azx_writel(chip, DPUBASE, upper_32_bits(chip->posbuf.addr));
Frederick Lif5d40b32005-05-12 14:55:20 +02001211
Takashi Iwaicb53c622007-08-10 17:21:45 +02001212 chip->initialized = 1;
1213}
1214
1215/*
1216 * initialize the PCI registers
1217 */
1218/* update bits in a PCI register byte */
1219static void update_pci_byte(struct pci_dev *pci, unsigned int reg,
1220 unsigned char mask, unsigned char val)
1221{
1222 unsigned char data;
1223
1224 pci_read_config_byte(pci, reg, &data);
1225 data &= ~mask;
1226 data |= (val & mask);
1227 pci_write_config_byte(pci, reg, data);
1228}
1229
1230static void azx_init_pci(struct azx *chip)
1231{
1232 /* Clear bits 0-2 of PCI register TCSEL (at offset 0x44)
1233 * TCSEL == Traffic Class Select Register, which sets PCI express QOS
1234 * Ensuring these bits are 0 clears playback static on some HD Audio
Adam Lackorzynskia09e89f2011-03-10 17:41:56 +01001235 * codecs.
1236 * The PCI register TCSEL is defined in the Intel manuals.
Takashi Iwaicb53c622007-08-10 17:21:45 +02001237 */
Linus Torvalds46f2cc82011-05-27 19:45:28 -07001238 if (!(chip->driver_caps & AZX_DCAPS_NO_TCSEL)) {
Takashi Iwai9477c582011-05-25 09:11:37 +02001239 snd_printdd(SFX "Clearing TCSEL\n");
Adam Lackorzynskia09e89f2011-03-10 17:41:56 +01001240 update_pci_byte(chip->pci, ICH6_PCIREG_TCSEL, 0x07, 0);
Takashi Iwai9477c582011-05-25 09:11:37 +02001241 }
Takashi Iwaicb53c622007-08-10 17:21:45 +02001242
Takashi Iwai9477c582011-05-25 09:11:37 +02001243 /* For ATI SB450/600/700/800/900 and AMD Hudson azalia HD audio,
1244 * we need to enable snoop.
1245 */
1246 if (chip->driver_caps & AZX_DCAPS_ATI_SNOOP) {
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001247 snd_printdd(SFX "Setting ATI snoop: %d\n", azx_snoop(chip));
Takashi Iwaicb53c622007-08-10 17:21:45 +02001248 update_pci_byte(chip->pci,
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001249 ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR, 0x07,
1250 azx_snoop(chip) ? ATI_SB450_HDAUDIO_ENABLE_SNOOP : 0);
Takashi Iwai9477c582011-05-25 09:11:37 +02001251 }
1252
1253 /* For NVIDIA HDA, enable snoop */
1254 if (chip->driver_caps & AZX_DCAPS_NVIDIA_SNOOP) {
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001255 snd_printdd(SFX "Setting Nvidia snoop: %d\n", azx_snoop(chip));
Takashi Iwaicb53c622007-08-10 17:21:45 +02001256 update_pci_byte(chip->pci,
1257 NVIDIA_HDA_TRANSREG_ADDR,
1258 0x0f, NVIDIA_HDA_ENABLE_COHBITS);
Peer Chen320dcc32008-08-20 16:43:24 -07001259 update_pci_byte(chip->pci,
1260 NVIDIA_HDA_ISTRM_COH,
1261 0x01, NVIDIA_HDA_ENABLE_COHBIT);
1262 update_pci_byte(chip->pci,
1263 NVIDIA_HDA_OSTRM_COH,
1264 0x01, NVIDIA_HDA_ENABLE_COHBIT);
Takashi Iwai9477c582011-05-25 09:11:37 +02001265 }
1266
1267 /* Enable SCH/PCH snoop if needed */
1268 if (chip->driver_caps & AZX_DCAPS_SCH_SNOOP) {
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001269 unsigned short snoop;
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001270 pci_read_config_word(chip->pci, INTEL_SCH_HDA_DEVC, &snoop);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001271 if ((!azx_snoop(chip) && !(snoop & INTEL_SCH_HDA_DEVC_NOSNOOP)) ||
1272 (azx_snoop(chip) && (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP))) {
1273 snoop &= ~INTEL_SCH_HDA_DEVC_NOSNOOP;
1274 if (!azx_snoop(chip))
1275 snoop |= INTEL_SCH_HDA_DEVC_NOSNOOP;
1276 pci_write_config_word(chip->pci, INTEL_SCH_HDA_DEVC, snoop);
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001277 pci_read_config_word(chip->pci,
1278 INTEL_SCH_HDA_DEVC, &snoop);
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001279 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001280 snd_printdd(SFX "SCH snoop: %s\n",
1281 (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP)
1282 ? "Disabled" : "Enabled");
Vinod Gda3fca22005-09-13 18:49:12 +02001283 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001284}
1285
1286
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001287static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev);
1288
Linus Torvalds1da177e2005-04-16 15:20:36 -07001289/*
1290 * interrupt handler
1291 */
David Howells7d12e782006-10-05 14:55:46 +01001292static irqreturn_t azx_interrupt(int irq, void *dev_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001293{
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001294 struct azx *chip = dev_id;
1295 struct azx_dev *azx_dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001296 u32 status;
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001297 u8 sd_status;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001298 int i, ok;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001299
Mengdong Linb8dfc4622012-08-23 17:32:30 +08001300#ifdef CONFIG_PM_RUNTIME
1301 if (chip->pci->dev.power.runtime_status != RPM_ACTIVE)
1302 return IRQ_NONE;
1303#endif
1304
Linus Torvalds1da177e2005-04-16 15:20:36 -07001305 spin_lock(&chip->reg_lock);
1306
Dan Carpenter60911062012-05-18 10:36:11 +03001307 if (chip->disabled) {
1308 spin_unlock(&chip->reg_lock);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001309 return IRQ_NONE;
Dan Carpenter60911062012-05-18 10:36:11 +03001310 }
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001311
Linus Torvalds1da177e2005-04-16 15:20:36 -07001312 status = azx_readl(chip, INTSTS);
1313 if (status == 0) {
1314 spin_unlock(&chip->reg_lock);
1315 return IRQ_NONE;
1316 }
1317
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001318 for (i = 0; i < chip->num_streams; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001319 azx_dev = &chip->azx_dev[i];
1320 if (status & azx_dev->sd_int_sta_mask) {
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001321 sd_status = azx_sd_readb(azx_dev, SD_STS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001322 azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK);
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001323 if (!azx_dev->substream || !azx_dev->running ||
1324 !(sd_status & SD_INT_COMPLETE))
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001325 continue;
1326 /* check whether this IRQ is really acceptable */
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001327 ok = azx_position_ok(chip, azx_dev);
1328 if (ok == 1) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001329 azx_dev->irq_pending = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001330 spin_unlock(&chip->reg_lock);
1331 snd_pcm_period_elapsed(azx_dev->substream);
1332 spin_lock(&chip->reg_lock);
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001333 } else if (ok == 0 && chip->bus && chip->bus->workq) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001334 /* bogus IRQ, process it later */
1335 azx_dev->irq_pending = 1;
Takashi Iwai6acaed32009-01-12 10:09:24 +01001336 queue_work(chip->bus->workq,
1337 &chip->irq_pending_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001338 }
1339 }
1340 }
1341
1342 /* clear rirb int */
1343 status = azx_readb(chip, RIRBSTS);
1344 if (status & RIRB_INT_MASK) {
Takashi Iwai14d34f12010-10-21 09:03:25 +02001345 if (status & RIRB_INT_RESPONSE) {
Takashi Iwai9477c582011-05-25 09:11:37 +02001346 if (chip->driver_caps & AZX_DCAPS_RIRB_PRE_DELAY)
Takashi Iwai14d34f12010-10-21 09:03:25 +02001347 udelay(80);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001348 azx_update_rirb(chip);
Takashi Iwai14d34f12010-10-21 09:03:25 +02001349 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001350 azx_writeb(chip, RIRBSTS, RIRB_INT_MASK);
1351 }
1352
1353#if 0
1354 /* clear state status int */
1355 if (azx_readb(chip, STATESTS) & 0x04)
1356 azx_writeb(chip, STATESTS, 0x04);
1357#endif
1358 spin_unlock(&chip->reg_lock);
1359
1360 return IRQ_HANDLED;
1361}
1362
1363
1364/*
Takashi Iwai675f25d2008-06-10 17:53:20 +02001365 * set up a BDL entry
1366 */
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001367static int setup_bdle(struct azx *chip,
1368 struct snd_pcm_substream *substream,
Takashi Iwai675f25d2008-06-10 17:53:20 +02001369 struct azx_dev *azx_dev, u32 **bdlp,
1370 int ofs, int size, int with_ioc)
1371{
Takashi Iwai675f25d2008-06-10 17:53:20 +02001372 u32 *bdl = *bdlp;
1373
1374 while (size > 0) {
1375 dma_addr_t addr;
1376 int chunk;
1377
1378 if (azx_dev->frags >= AZX_MAX_BDL_ENTRIES)
1379 return -EINVAL;
1380
Takashi Iwai77a23f22008-08-21 13:00:13 +02001381 addr = snd_pcm_sgbuf_get_addr(substream, ofs);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001382 /* program the address field of the BDL entry */
1383 bdl[0] = cpu_to_le32((u32)addr);
Takashi Iwai766979e2008-06-13 20:53:56 +02001384 bdl[1] = cpu_to_le32(upper_32_bits(addr));
Takashi Iwai675f25d2008-06-10 17:53:20 +02001385 /* program the size field of the BDL entry */
Takashi Iwaifc4abee2008-07-30 15:13:34 +02001386 chunk = snd_pcm_sgbuf_get_chunk_size(substream, ofs, size);
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001387 /* one BDLE cannot cross 4K boundary on CTHDA chips */
1388 if (chip->driver_caps & AZX_DCAPS_4K_BDLE_BOUNDARY) {
1389 u32 remain = 0x1000 - (ofs & 0xfff);
1390 if (chunk > remain)
1391 chunk = remain;
1392 }
Takashi Iwai675f25d2008-06-10 17:53:20 +02001393 bdl[2] = cpu_to_le32(chunk);
1394 /* program the IOC to enable interrupt
1395 * only when the whole fragment is processed
1396 */
1397 size -= chunk;
1398 bdl[3] = (size || !with_ioc) ? 0 : cpu_to_le32(0x01);
1399 bdl += 4;
1400 azx_dev->frags++;
1401 ofs += chunk;
1402 }
1403 *bdlp = bdl;
1404 return ofs;
1405}
1406
1407/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001408 * set up BDL entries
1409 */
Takashi Iwai555e2192008-06-10 17:53:34 +02001410static int azx_setup_periods(struct azx *chip,
1411 struct snd_pcm_substream *substream,
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001412 struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001413{
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001414 u32 *bdl;
1415 int i, ofs, periods, period_bytes;
Takashi Iwai555e2192008-06-10 17:53:34 +02001416 int pos_adj;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001417
1418 /* reset BDL address */
1419 azx_sd_writel(azx_dev, SD_BDLPL, 0);
1420 azx_sd_writel(azx_dev, SD_BDLPU, 0);
1421
Takashi Iwai97b71c92009-03-18 15:09:13 +01001422 period_bytes = azx_dev->period_bytes;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001423 periods = azx_dev->bufsize / period_bytes;
1424
Linus Torvalds1da177e2005-04-16 15:20:36 -07001425 /* program the initial BDL entries */
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001426 bdl = (u32 *)azx_dev->bdl.area;
1427 ofs = 0;
1428 azx_dev->frags = 0;
Takashi Iwai555e2192008-06-10 17:53:34 +02001429 pos_adj = bdl_pos_adj[chip->dev_index];
Takashi Iwai915bf292012-09-11 15:19:10 +02001430 if (!azx_dev->no_period_wakeup && pos_adj > 0) {
Takashi Iwai675f25d2008-06-10 17:53:20 +02001431 struct snd_pcm_runtime *runtime = substream->runtime;
Takashi Iwaie785d3d2008-07-15 16:28:43 +02001432 int pos_align = pos_adj;
Takashi Iwai555e2192008-06-10 17:53:34 +02001433 pos_adj = (pos_adj * runtime->rate + 47999) / 48000;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001434 if (!pos_adj)
Takashi Iwaie785d3d2008-07-15 16:28:43 +02001435 pos_adj = pos_align;
1436 else
1437 pos_adj = ((pos_adj + pos_align - 1) / pos_align) *
1438 pos_align;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001439 pos_adj = frames_to_bytes(runtime, pos_adj);
1440 if (pos_adj >= period_bytes) {
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001441 snd_printk(KERN_WARNING SFX "Too big adjustment %d\n",
Takashi Iwai555e2192008-06-10 17:53:34 +02001442 bdl_pos_adj[chip->dev_index]);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001443 pos_adj = 0;
1444 } else {
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001445 ofs = setup_bdle(chip, substream, azx_dev,
Takashi Iwai915bf292012-09-11 15:19:10 +02001446 &bdl, ofs, pos_adj, true);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001447 if (ofs < 0)
1448 goto error;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001449 }
Takashi Iwai555e2192008-06-10 17:53:34 +02001450 } else
1451 pos_adj = 0;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001452 for (i = 0; i < periods; i++) {
1453 if (i == periods - 1 && pos_adj)
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001454 ofs = setup_bdle(chip, substream, azx_dev, &bdl, ofs,
Takashi Iwai675f25d2008-06-10 17:53:20 +02001455 period_bytes - pos_adj, 0);
1456 else
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001457 ofs = setup_bdle(chip, substream, azx_dev, &bdl, ofs,
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001458 period_bytes,
Takashi Iwai915bf292012-09-11 15:19:10 +02001459 !azx_dev->no_period_wakeup);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001460 if (ofs < 0)
1461 goto error;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001462 }
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001463 return 0;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001464
1465 error:
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001466 snd_printk(KERN_ERR SFX "Too many BDL entries: buffer=%d, period=%d\n",
Takashi Iwai675f25d2008-06-10 17:53:20 +02001467 azx_dev->bufsize, period_bytes);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001468 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001469}
1470
Takashi Iwai1dddab42009-03-18 15:15:37 +01001471/* reset stream */
1472static void azx_stream_reset(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001473{
1474 unsigned char val;
1475 int timeout;
1476
Takashi Iwai1dddab42009-03-18 15:15:37 +01001477 azx_stream_clear(chip, azx_dev);
1478
Takashi Iwaid01ce992007-07-27 16:52:19 +02001479 azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) |
1480 SD_CTL_STREAM_RESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001481 udelay(3);
1482 timeout = 300;
1483 while (!((val = azx_sd_readb(azx_dev, SD_CTL)) & SD_CTL_STREAM_RESET) &&
1484 --timeout)
1485 ;
1486 val &= ~SD_CTL_STREAM_RESET;
1487 azx_sd_writeb(azx_dev, SD_CTL, val);
1488 udelay(3);
1489
1490 timeout = 300;
1491 /* waiting for hardware to report that the stream is out of reset */
1492 while (((val = azx_sd_readb(azx_dev, SD_CTL)) & SD_CTL_STREAM_RESET) &&
1493 --timeout)
1494 ;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001495
1496 /* reset first position - may not be synced with hw at this time */
1497 *azx_dev->posbuf = 0;
Takashi Iwai1dddab42009-03-18 15:15:37 +01001498}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001499
Takashi Iwai1dddab42009-03-18 15:15:37 +01001500/*
1501 * set up the SD for streaming
1502 */
1503static int azx_setup_controller(struct azx *chip, struct azx_dev *azx_dev)
1504{
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001505 unsigned int val;
Takashi Iwai1dddab42009-03-18 15:15:37 +01001506 /* make sure the run bit is zero for SD */
1507 azx_stream_clear(chip, azx_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001508 /* program the stream_tag */
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001509 val = azx_sd_readl(azx_dev, SD_CTL);
1510 val = (val & ~SD_CTL_STREAM_TAG_MASK) |
1511 (azx_dev->stream_tag << SD_CTL_STREAM_TAG_SHIFT);
1512 if (!azx_snoop(chip))
1513 val |= SD_CTL_TRAFFIC_PRIO;
1514 azx_sd_writel(azx_dev, SD_CTL, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001515
1516 /* program the length of samples in cyclic buffer */
1517 azx_sd_writel(azx_dev, SD_CBL, azx_dev->bufsize);
1518
1519 /* program the stream format */
1520 /* this value needs to be the same as the one programmed */
1521 azx_sd_writew(azx_dev, SD_FORMAT, azx_dev->format_val);
1522
1523 /* program the stream LVI (last valid index) of the BDL */
1524 azx_sd_writew(azx_dev, SD_LVI, azx_dev->frags - 1);
1525
1526 /* program the BDL address */
1527 /* lower BDL address */
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001528 azx_sd_writel(azx_dev, SD_BDLPL, (u32)azx_dev->bdl.addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001529 /* upper BDL address */
Takashi Iwai766979e2008-06-13 20:53:56 +02001530 azx_sd_writel(azx_dev, SD_BDLPU, upper_32_bits(azx_dev->bdl.addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001531
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02001532 /* enable the position buffer */
David Henningsson4cb36312010-09-30 10:12:50 +02001533 if (chip->position_fix[0] != POS_FIX_LPIB ||
1534 chip->position_fix[1] != POS_FIX_LPIB) {
Takashi Iwaiee9d6b92008-03-14 15:52:20 +01001535 if (!(azx_readl(chip, DPLBASE) & ICH6_DPLBASE_ENABLE))
1536 azx_writel(chip, DPLBASE,
1537 (u32)chip->posbuf.addr | ICH6_DPLBASE_ENABLE);
1538 }
Takashi Iwaic74db862005-05-12 14:26:27 +02001539
Linus Torvalds1da177e2005-04-16 15:20:36 -07001540 /* set the interrupt enable bits in the descriptor control register */
Takashi Iwaid01ce992007-07-27 16:52:19 +02001541 azx_sd_writel(azx_dev, SD_CTL,
1542 azx_sd_readl(azx_dev, SD_CTL) | SD_INT_MASK);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001543
1544 return 0;
1545}
1546
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001547/*
1548 * Probe the given codec address
1549 */
1550static int probe_codec(struct azx *chip, int addr)
1551{
1552 unsigned int cmd = (addr << 28) | (AC_NODE_ROOT << 20) |
1553 (AC_VERB_PARAMETERS << 8) | AC_PAR_VENDOR_ID;
1554 unsigned int res;
1555
Wu Fengguanga678cde2009-08-01 18:46:46 +08001556 mutex_lock(&chip->bus->cmd_mutex);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001557 chip->probing = 1;
1558 azx_send_cmd(chip->bus, cmd);
Wu Fengguangdeadff12009-08-01 18:45:16 +08001559 res = azx_get_response(chip->bus, addr);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001560 chip->probing = 0;
Wu Fengguanga678cde2009-08-01 18:46:46 +08001561 mutex_unlock(&chip->bus->cmd_mutex);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001562 if (res == -1)
1563 return -EIO;
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001564 snd_printdd(SFX "codec #%d probed OK\n", addr);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001565 return 0;
1566}
1567
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001568static int azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec,
1569 struct hda_pcm *cpcm);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001570static void azx_stop_chip(struct azx *chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001571
Takashi Iwai8dd78332009-06-02 01:16:07 +02001572static void azx_bus_reset(struct hda_bus *bus)
1573{
1574 struct azx *chip = bus->private_data;
Takashi Iwai8dd78332009-06-02 01:16:07 +02001575
1576 bus->in_reset = 1;
1577 azx_stop_chip(chip);
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001578 azx_init_chip(chip, 1);
Alexander Beregalov65f75982009-06-04 13:46:16 +04001579#ifdef CONFIG_PM
Takashi Iwai8dd78332009-06-02 01:16:07 +02001580 if (chip->initialized) {
Takashi Iwai01b65bf2011-11-24 14:31:46 +01001581 struct azx_pcm *p;
1582 list_for_each_entry(p, &chip->pcm_list, list)
1583 snd_pcm_suspend_all(p->pcm);
Takashi Iwai8dd78332009-06-02 01:16:07 +02001584 snd_hda_suspend(chip->bus);
1585 snd_hda_resume(chip->bus);
1586 }
Alexander Beregalov65f75982009-06-04 13:46:16 +04001587#endif
Takashi Iwai8dd78332009-06-02 01:16:07 +02001588 bus->in_reset = 0;
1589}
1590
Linus Torvalds1da177e2005-04-16 15:20:36 -07001591/*
1592 * Codec initialization
1593 */
1594
Takashi Iwai2f5983f2008-09-03 16:00:44 +02001595/* number of codec slots for each chipset: 0 = default slots (i.e. 4) */
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001596static unsigned int azx_max_codecs[AZX_NUM_DRIVERS] DELAYED_INITDATA_MARK = {
Wei Ni7445dfc2010-03-03 15:05:53 +08001597 [AZX_DRIVER_NVIDIA] = 8,
Kailang Yangf2690022008-05-27 11:44:55 +02001598 [AZX_DRIVER_TERA] = 1,
Takashi Iwaia9995a32007-03-12 21:30:46 +01001599};
1600
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001601static int DELAYED_INIT_MARK azx_codec_create(struct azx *chip, const char *model)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001602{
1603 struct hda_bus_template bus_temp;
Takashi Iwai34c25352008-10-28 11:38:58 +01001604 int c, codecs, err;
1605 int max_slots;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001606
1607 memset(&bus_temp, 0, sizeof(bus_temp));
1608 bus_temp.private_data = chip;
1609 bus_temp.modelname = model;
1610 bus_temp.pci = chip->pci;
Takashi Iwai111d3af2006-02-16 18:17:58 +01001611 bus_temp.ops.command = azx_send_cmd;
1612 bus_temp.ops.get_response = azx_get_response;
Takashi Iwai176d5332008-07-30 15:01:44 +02001613 bus_temp.ops.attach_pcm = azx_attach_pcm_stream;
Takashi Iwai8dd78332009-06-02 01:16:07 +02001614 bus_temp.ops.bus_reset = azx_bus_reset;
Takashi Iwai83012a72012-08-24 18:38:08 +02001615#ifdef CONFIG_PM
Takashi Iwai11cd41b2008-11-28 07:22:18 +01001616 bus_temp.power_save = &power_save;
Takashi Iwaicb53c622007-08-10 17:21:45 +02001617 bus_temp.ops.pm_notify = azx_power_notify;
1618#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07001619
Takashi Iwaid01ce992007-07-27 16:52:19 +02001620 err = snd_hda_bus_new(chip->card, &bus_temp, &chip->bus);
1621 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001622 return err;
1623
Takashi Iwai9477c582011-05-25 09:11:37 +02001624 if (chip->driver_caps & AZX_DCAPS_RIRB_DELAY) {
1625 snd_printd(SFX "Enable delay in RIRB handling\n");
Wei Nidc9c8e22008-09-26 13:55:56 +08001626 chip->bus->needs_damn_long_delay = 1;
Takashi Iwai9477c582011-05-25 09:11:37 +02001627 }
Wei Nidc9c8e22008-09-26 13:55:56 +08001628
Takashi Iwai34c25352008-10-28 11:38:58 +01001629 codecs = 0;
Takashi Iwai2f5983f2008-09-03 16:00:44 +02001630 max_slots = azx_max_codecs[chip->driver_type];
1631 if (!max_slots)
Wei Ni7445dfc2010-03-03 15:05:53 +08001632 max_slots = AZX_DEFAULT_CODECS;
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001633
1634 /* First try to probe all given codec slots */
1635 for (c = 0; c < max_slots; c++) {
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01001636 if ((chip->codec_mask & (1 << c)) & chip->codec_probe_mask) {
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001637 if (probe_codec(chip, c) < 0) {
1638 /* Some BIOSen give you wrong codec addresses
1639 * that don't exist
1640 */
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001641 snd_printk(KERN_WARNING SFX
1642 "Codec #%d probe error; "
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001643 "disabling it...\n", c);
1644 chip->codec_mask &= ~(1 << c);
1645 /* More badly, accessing to a non-existing
1646 * codec often screws up the controller chip,
Paul Menzel24481582010-02-08 20:37:26 +01001647 * and disturbs the further communications.
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001648 * Thus if an error occurs during probing,
1649 * better to reset the controller chip to
1650 * get back to the sanity state.
1651 */
1652 azx_stop_chip(chip);
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001653 azx_init_chip(chip, 1);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001654 }
1655 }
1656 }
1657
Takashi Iwaid507cd62011-04-26 15:25:02 +02001658 /* AMD chipsets often cause the communication stalls upon certain
1659 * sequence like the pin-detection. It seems that forcing the synced
1660 * access works around the stall. Grrr...
1661 */
Takashi Iwai9477c582011-05-25 09:11:37 +02001662 if (chip->driver_caps & AZX_DCAPS_SYNC_WRITE) {
1663 snd_printd(SFX "Enable sync_write for stable communication\n");
Takashi Iwaid507cd62011-04-26 15:25:02 +02001664 chip->bus->sync_write = 1;
1665 chip->bus->allow_bus_reset = 1;
1666 }
1667
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001668 /* Then create codec instances */
Takashi Iwai34c25352008-10-28 11:38:58 +01001669 for (c = 0; c < max_slots; c++) {
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01001670 if ((chip->codec_mask & (1 << c)) & chip->codec_probe_mask) {
Takashi Iwaibccad142007-04-24 12:23:53 +02001671 struct hda_codec *codec;
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001672 err = snd_hda_codec_new(chip->bus, c, &codec);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001673 if (err < 0)
1674 continue;
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +01001675 codec->beep_mode = chip->beep_mode;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001676 codecs++;
Takashi Iwai19a982b2007-03-21 15:14:35 +01001677 }
1678 }
1679 if (!codecs) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001680 snd_printk(KERN_ERR SFX "no codecs initialized\n");
1681 return -ENXIO;
1682 }
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001683 return 0;
1684}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001685
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001686/* configure each codec instance */
1687static int __devinit azx_codec_configure(struct azx *chip)
1688{
1689 struct hda_codec *codec;
1690 list_for_each_entry(codec, &chip->bus->codec_list, list) {
1691 snd_hda_codec_configure(codec);
1692 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001693 return 0;
1694}
1695
1696
1697/*
1698 * PCM support
1699 */
1700
1701/* assign a stream for the PCM */
Wu Fengguangef18bed2009-12-25 13:14:27 +08001702static inline struct azx_dev *
1703azx_assign_device(struct azx *chip, struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001704{
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001705 int dev, i, nums;
Wu Fengguangef18bed2009-12-25 13:14:27 +08001706 struct azx_dev *res = NULL;
Takashi Iwaid5cf9912011-10-06 10:07:58 +02001707 /* make a non-zero unique key for the substream */
1708 int key = (substream->pcm->device << 16) | (substream->number << 2) |
1709 (substream->stream + 1);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001710
1711 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001712 dev = chip->playback_index_offset;
1713 nums = chip->playback_streams;
1714 } else {
1715 dev = chip->capture_index_offset;
1716 nums = chip->capture_streams;
1717 }
1718 for (i = 0; i < nums; i++, dev++)
Takashi Iwaid01ce992007-07-27 16:52:19 +02001719 if (!chip->azx_dev[dev].opened) {
Wu Fengguangef18bed2009-12-25 13:14:27 +08001720 res = &chip->azx_dev[dev];
Takashi Iwaid5cf9912011-10-06 10:07:58 +02001721 if (res->assigned_key == key)
Wu Fengguangef18bed2009-12-25 13:14:27 +08001722 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001723 }
Wu Fengguangef18bed2009-12-25 13:14:27 +08001724 if (res) {
1725 res->opened = 1;
Takashi Iwaid5cf9912011-10-06 10:07:58 +02001726 res->assigned_key = key;
Wu Fengguangef18bed2009-12-25 13:14:27 +08001727 }
1728 return res;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001729}
1730
1731/* release the assigned stream */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001732static inline void azx_release_device(struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001733{
1734 azx_dev->opened = 0;
1735}
1736
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001737static struct snd_pcm_hardware azx_pcm_hw = {
Takashi Iwaid01ce992007-07-27 16:52:19 +02001738 .info = (SNDRV_PCM_INFO_MMAP |
1739 SNDRV_PCM_INFO_INTERLEAVED |
Linus Torvalds1da177e2005-04-16 15:20:36 -07001740 SNDRV_PCM_INFO_BLOCK_TRANSFER |
1741 SNDRV_PCM_INFO_MMAP_VALID |
Pavel Machek927fc862006-08-31 17:03:43 +02001742 /* No full-resume yet implemented */
1743 /* SNDRV_PCM_INFO_RESUME |*/
Takashi Iwai850f0e52008-03-18 17:11:05 +01001744 SNDRV_PCM_INFO_PAUSE |
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001745 SNDRV_PCM_INFO_SYNC_START |
1746 SNDRV_PCM_INFO_NO_PERIOD_WAKEUP),
Linus Torvalds1da177e2005-04-16 15:20:36 -07001747 .formats = SNDRV_PCM_FMTBIT_S16_LE,
1748 .rates = SNDRV_PCM_RATE_48000,
1749 .rate_min = 48000,
1750 .rate_max = 48000,
1751 .channels_min = 2,
1752 .channels_max = 2,
1753 .buffer_bytes_max = AZX_MAX_BUF_SIZE,
1754 .period_bytes_min = 128,
1755 .period_bytes_max = AZX_MAX_BUF_SIZE / 2,
1756 .periods_min = 2,
1757 .periods_max = AZX_MAX_FRAG,
1758 .fifo_size = 0,
1759};
1760
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001761static int azx_pcm_open(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001762{
1763 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1764 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001765 struct azx *chip = apcm->chip;
1766 struct azx_dev *azx_dev;
1767 struct snd_pcm_runtime *runtime = substream->runtime;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001768 unsigned long flags;
1769 int err;
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001770 int buff_step;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001771
Ingo Molnar62932df2006-01-16 16:34:20 +01001772 mutex_lock(&chip->open_mutex);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001773 azx_dev = azx_assign_device(chip, substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001774 if (azx_dev == NULL) {
Ingo Molnar62932df2006-01-16 16:34:20 +01001775 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001776 return -EBUSY;
1777 }
1778 runtime->hw = azx_pcm_hw;
1779 runtime->hw.channels_min = hinfo->channels_min;
1780 runtime->hw.channels_max = hinfo->channels_max;
1781 runtime->hw.formats = hinfo->formats;
1782 runtime->hw.rates = hinfo->rates;
1783 snd_pcm_limit_hw_rates(runtime);
1784 snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
Takashi Iwai52409aa2012-01-23 17:10:24 +01001785 if (chip->align_buffer_size)
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001786 /* constrain buffer sizes to be multiple of 128
1787 bytes. This is more efficient in terms of memory
1788 access but isn't required by the HDA spec and
1789 prevents users from specifying exact period/buffer
1790 sizes. For example for 44.1kHz, a period size set
1791 to 20ms will be rounded to 19.59ms. */
1792 buff_step = 128;
1793 else
1794 /* Don't enforce steps on buffer sizes, still need to
1795 be multiple of 4 bytes (HDA spec). Tested on Intel
1796 HDA controllers, may not work on all devices where
1797 option needs to be disabled */
1798 buff_step = 4;
1799
Joachim Deguara5f1545b2007-03-16 15:01:36 +01001800 snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001801 buff_step);
Joachim Deguara5f1545b2007-03-16 15:01:36 +01001802 snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001803 buff_step);
Dylan Reidb4a91cf2012-06-15 19:36:23 -07001804 snd_hda_power_up_d3wait(apcm->codec);
Takashi Iwaid01ce992007-07-27 16:52:19 +02001805 err = hinfo->ops.open(hinfo, apcm->codec, substream);
1806 if (err < 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001807 azx_release_device(azx_dev);
Takashi Iwaicb53c622007-08-10 17:21:45 +02001808 snd_hda_power_down(apcm->codec);
Ingo Molnar62932df2006-01-16 16:34:20 +01001809 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001810 return err;
1811 }
Takashi Iwai70d321e2009-07-03 23:06:45 +02001812 snd_pcm_limit_hw_rates(runtime);
Takashi Iwaiaba66532009-07-05 11:44:46 +02001813 /* sanity check */
1814 if (snd_BUG_ON(!runtime->hw.channels_min) ||
1815 snd_BUG_ON(!runtime->hw.channels_max) ||
1816 snd_BUG_ON(!runtime->hw.formats) ||
1817 snd_BUG_ON(!runtime->hw.rates)) {
1818 azx_release_device(azx_dev);
1819 hinfo->ops.close(hinfo, apcm->codec, substream);
1820 snd_hda_power_down(apcm->codec);
1821 mutex_unlock(&chip->open_mutex);
1822 return -EINVAL;
1823 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001824 spin_lock_irqsave(&chip->reg_lock, flags);
1825 azx_dev->substream = substream;
1826 azx_dev->running = 0;
1827 spin_unlock_irqrestore(&chip->reg_lock, flags);
1828
1829 runtime->private_data = azx_dev;
Takashi Iwai850f0e52008-03-18 17:11:05 +01001830 snd_pcm_set_sync(substream);
Ingo Molnar62932df2006-01-16 16:34:20 +01001831 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001832 return 0;
1833}
1834
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001835static int azx_pcm_close(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001836{
1837 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1838 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001839 struct azx *chip = apcm->chip;
1840 struct azx_dev *azx_dev = get_azx_dev(substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001841 unsigned long flags;
1842
Ingo Molnar62932df2006-01-16 16:34:20 +01001843 mutex_lock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001844 spin_lock_irqsave(&chip->reg_lock, flags);
1845 azx_dev->substream = NULL;
1846 azx_dev->running = 0;
1847 spin_unlock_irqrestore(&chip->reg_lock, flags);
1848 azx_release_device(azx_dev);
1849 hinfo->ops.close(hinfo, apcm->codec, substream);
Takashi Iwaicb53c622007-08-10 17:21:45 +02001850 snd_hda_power_down(apcm->codec);
Ingo Molnar62932df2006-01-16 16:34:20 +01001851 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001852 return 0;
1853}
1854
Takashi Iwaid01ce992007-07-27 16:52:19 +02001855static int azx_pcm_hw_params(struct snd_pcm_substream *substream,
1856 struct snd_pcm_hw_params *hw_params)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001857{
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001858 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1859 struct azx *chip = apcm->chip;
1860 struct snd_pcm_runtime *runtime = substream->runtime;
Takashi Iwai97b71c92009-03-18 15:09:13 +01001861 struct azx_dev *azx_dev = get_azx_dev(substream);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001862 int ret;
Takashi Iwai97b71c92009-03-18 15:09:13 +01001863
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001864 mark_runtime_wc(chip, azx_dev, runtime, false);
Takashi Iwai97b71c92009-03-18 15:09:13 +01001865 azx_dev->bufsize = 0;
1866 azx_dev->period_bytes = 0;
1867 azx_dev->format_val = 0;
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001868 ret = snd_pcm_lib_malloc_pages(substream,
Takashi Iwaid01ce992007-07-27 16:52:19 +02001869 params_buffer_bytes(hw_params));
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001870 if (ret < 0)
1871 return ret;
1872 mark_runtime_wc(chip, azx_dev, runtime, true);
1873 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001874}
1875
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001876static int azx_pcm_hw_free(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001877{
1878 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001879 struct azx_dev *azx_dev = get_azx_dev(substream);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001880 struct azx *chip = apcm->chip;
1881 struct snd_pcm_runtime *runtime = substream->runtime;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001882 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
1883
1884 /* reset BDL address */
1885 azx_sd_writel(azx_dev, SD_BDLPL, 0);
1886 azx_sd_writel(azx_dev, SD_BDLPU, 0);
1887 azx_sd_writel(azx_dev, SD_CTL, 0);
Takashi Iwai97b71c92009-03-18 15:09:13 +01001888 azx_dev->bufsize = 0;
1889 azx_dev->period_bytes = 0;
1890 azx_dev->format_val = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001891
Takashi Iwaieb541332010-08-06 13:48:11 +02001892 snd_hda_codec_cleanup(apcm->codec, hinfo, substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001893
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001894 mark_runtime_wc(chip, azx_dev, runtime, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001895 return snd_pcm_lib_free_pages(substream);
1896}
1897
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001898static int azx_pcm_prepare(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001899{
1900 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001901 struct azx *chip = apcm->chip;
1902 struct azx_dev *azx_dev = get_azx_dev(substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001903 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001904 struct snd_pcm_runtime *runtime = substream->runtime;
Takashi Iwai62b7e5e2010-10-22 17:15:47 +02001905 unsigned int bufsize, period_bytes, format_val, stream_tag;
Takashi Iwai97b71c92009-03-18 15:09:13 +01001906 int err;
Stephen Warren7c9359762011-06-01 11:14:17 -06001907 struct hda_spdif_out *spdif =
1908 snd_hda_spdif_out_of_nid(apcm->codec, hinfo->nid);
1909 unsigned short ctls = spdif ? spdif->ctls : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001910
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001911 azx_stream_reset(chip, azx_dev);
Takashi Iwai97b71c92009-03-18 15:09:13 +01001912 format_val = snd_hda_calc_stream_format(runtime->rate,
1913 runtime->channels,
1914 runtime->format,
Anssi Hannula32c168c2010-08-03 13:28:57 +03001915 hinfo->maxbps,
Stephen Warren7c9359762011-06-01 11:14:17 -06001916 ctls);
Takashi Iwai97b71c92009-03-18 15:09:13 +01001917 if (!format_val) {
Takashi Iwaid01ce992007-07-27 16:52:19 +02001918 snd_printk(KERN_ERR SFX
1919 "invalid format_val, rate=%d, ch=%d, format=%d\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001920 runtime->rate, runtime->channels, runtime->format);
1921 return -EINVAL;
1922 }
1923
Takashi Iwai97b71c92009-03-18 15:09:13 +01001924 bufsize = snd_pcm_lib_buffer_bytes(substream);
1925 period_bytes = snd_pcm_lib_period_bytes(substream);
1926
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001927 snd_printdd(SFX "azx_pcm_prepare: bufsize=0x%x, format=0x%x\n",
Takashi Iwai97b71c92009-03-18 15:09:13 +01001928 bufsize, format_val);
1929
1930 if (bufsize != azx_dev->bufsize ||
1931 period_bytes != azx_dev->period_bytes ||
Takashi Iwai915bf292012-09-11 15:19:10 +02001932 format_val != azx_dev->format_val ||
1933 runtime->no_period_wakeup != azx_dev->no_period_wakeup) {
Takashi Iwai97b71c92009-03-18 15:09:13 +01001934 azx_dev->bufsize = bufsize;
1935 azx_dev->period_bytes = period_bytes;
1936 azx_dev->format_val = format_val;
Takashi Iwai915bf292012-09-11 15:19:10 +02001937 azx_dev->no_period_wakeup = runtime->no_period_wakeup;
Takashi Iwai97b71c92009-03-18 15:09:13 +01001938 err = azx_setup_periods(chip, substream, azx_dev);
1939 if (err < 0)
1940 return err;
1941 }
1942
Jaroslav Kyselae5463722010-05-11 10:21:46 +02001943 /* wallclk has 24Mhz clock source */
1944 azx_dev->period_wallclk = (((runtime->period_size * 24000) /
1945 runtime->rate) * 1000);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001946 azx_setup_controller(chip, azx_dev);
1947 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
1948 azx_dev->fifo_size = azx_sd_readw(azx_dev, SD_FIFOSIZE) + 1;
1949 else
1950 azx_dev->fifo_size = 0;
1951
Takashi Iwai62b7e5e2010-10-22 17:15:47 +02001952 stream_tag = azx_dev->stream_tag;
1953 /* CA-IBG chips need the playback stream starting from 1 */
Takashi Iwai9477c582011-05-25 09:11:37 +02001954 if ((chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND) &&
Takashi Iwai62b7e5e2010-10-22 17:15:47 +02001955 stream_tag > chip->capture_streams)
1956 stream_tag -= chip->capture_streams;
1957 return snd_hda_codec_prepare(apcm->codec, hinfo, stream_tag,
Takashi Iwaieb541332010-08-06 13:48:11 +02001958 azx_dev->format_val, substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001959}
1960
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001961static int azx_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001962{
1963 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001964 struct azx *chip = apcm->chip;
Takashi Iwai850f0e52008-03-18 17:11:05 +01001965 struct azx_dev *azx_dev;
1966 struct snd_pcm_substream *s;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001967 int rstart = 0, start, nsync = 0, sbits = 0;
Takashi Iwai850f0e52008-03-18 17:11:05 +01001968 int nwait, timeout;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001969
Linus Torvalds1da177e2005-04-16 15:20:36 -07001970 switch (cmd) {
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001971 case SNDRV_PCM_TRIGGER_START:
1972 rstart = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001973 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
1974 case SNDRV_PCM_TRIGGER_RESUME:
Takashi Iwai850f0e52008-03-18 17:11:05 +01001975 start = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001976 break;
1977 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
Jaroslav Kysela47123192005-08-15 20:53:07 +02001978 case SNDRV_PCM_TRIGGER_SUSPEND:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001979 case SNDRV_PCM_TRIGGER_STOP:
Takashi Iwai850f0e52008-03-18 17:11:05 +01001980 start = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001981 break;
1982 default:
Takashi Iwai850f0e52008-03-18 17:11:05 +01001983 return -EINVAL;
1984 }
1985
1986 snd_pcm_group_for_each_entry(s, substream) {
1987 if (s->pcm->card != substream->pcm->card)
1988 continue;
1989 azx_dev = get_azx_dev(s);
1990 sbits |= 1 << azx_dev->index;
1991 nsync++;
1992 snd_pcm_trigger_done(s, substream);
1993 }
1994
1995 spin_lock(&chip->reg_lock);
Pierre-Louis Bossart172d3b22012-09-21 18:39:05 -05001996
1997 /* first, set SYNC bits of corresponding streams */
1998 if (chip->driver_caps & AZX_DCAPS_OLD_SSYNC)
1999 azx_writel(chip, OLD_SSYNC,
2000 azx_readl(chip, OLD_SSYNC) | sbits);
2001 else
2002 azx_writel(chip, SSYNC, azx_readl(chip, SSYNC) | sbits);
2003
Takashi Iwai850f0e52008-03-18 17:11:05 +01002004 snd_pcm_group_for_each_entry(s, substream) {
2005 if (s->pcm->card != substream->pcm->card)
2006 continue;
2007 azx_dev = get_azx_dev(s);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002008 if (start) {
2009 azx_dev->start_wallclk = azx_readl(chip, WALLCLK);
2010 if (!rstart)
2011 azx_dev->start_wallclk -=
2012 azx_dev->period_wallclk;
Takashi Iwai850f0e52008-03-18 17:11:05 +01002013 azx_stream_start(chip, azx_dev);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002014 } else {
Takashi Iwai850f0e52008-03-18 17:11:05 +01002015 azx_stream_stop(chip, azx_dev);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002016 }
Takashi Iwai850f0e52008-03-18 17:11:05 +01002017 azx_dev->running = start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002018 }
2019 spin_unlock(&chip->reg_lock);
Takashi Iwai850f0e52008-03-18 17:11:05 +01002020 if (start) {
Takashi Iwai850f0e52008-03-18 17:11:05 +01002021 /* wait until all FIFOs get ready */
2022 for (timeout = 5000; timeout; timeout--) {
2023 nwait = 0;
2024 snd_pcm_group_for_each_entry(s, substream) {
2025 if (s->pcm->card != substream->pcm->card)
2026 continue;
2027 azx_dev = get_azx_dev(s);
2028 if (!(azx_sd_readb(azx_dev, SD_STS) &
2029 SD_STS_FIFO_READY))
2030 nwait++;
2031 }
2032 if (!nwait)
2033 break;
2034 cpu_relax();
2035 }
2036 } else {
2037 /* wait until all RUN bits are cleared */
2038 for (timeout = 5000; timeout; timeout--) {
2039 nwait = 0;
2040 snd_pcm_group_for_each_entry(s, substream) {
2041 if (s->pcm->card != substream->pcm->card)
2042 continue;
2043 azx_dev = get_azx_dev(s);
2044 if (azx_sd_readb(azx_dev, SD_CTL) &
2045 SD_CTL_DMA_START)
2046 nwait++;
2047 }
2048 if (!nwait)
2049 break;
2050 cpu_relax();
2051 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002052 }
Pierre-Louis Bossart172d3b22012-09-21 18:39:05 -05002053 spin_lock(&chip->reg_lock);
2054 /* reset SYNC bits */
2055 if (chip->driver_caps & AZX_DCAPS_OLD_SSYNC)
2056 azx_writel(chip, OLD_SSYNC,
2057 azx_readl(chip, OLD_SSYNC) & ~sbits);
2058 else
2059 azx_writel(chip, SSYNC, azx_readl(chip, SSYNC) & ~sbits);
2060 spin_unlock(&chip->reg_lock);
Takashi Iwai850f0e52008-03-18 17:11:05 +01002061 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002062}
2063
Joseph Chan0e153472008-08-26 14:38:03 +02002064/* get the current DMA position with correction on VIA chips */
2065static unsigned int azx_via_get_position(struct azx *chip,
2066 struct azx_dev *azx_dev)
2067{
2068 unsigned int link_pos, mini_pos, bound_pos;
2069 unsigned int mod_link_pos, mod_dma_pos, mod_mini_pos;
2070 unsigned int fifo_size;
2071
2072 link_pos = azx_sd_readl(azx_dev, SD_LPIB);
Takashi Iwaib4a655e2011-06-07 12:26:56 +02002073 if (azx_dev->substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
Joseph Chan0e153472008-08-26 14:38:03 +02002074 /* Playback, no problem using link position */
2075 return link_pos;
2076 }
2077
2078 /* Capture */
2079 /* For new chipset,
2080 * use mod to get the DMA position just like old chipset
2081 */
2082 mod_dma_pos = le32_to_cpu(*azx_dev->posbuf);
2083 mod_dma_pos %= azx_dev->period_bytes;
2084
2085 /* azx_dev->fifo_size can't get FIFO size of in stream.
2086 * Get from base address + offset.
2087 */
2088 fifo_size = readw(chip->remap_addr + VIA_IN_STREAM0_FIFO_SIZE_OFFSET);
2089
2090 if (azx_dev->insufficient) {
2091 /* Link position never gather than FIFO size */
2092 if (link_pos <= fifo_size)
2093 return 0;
2094
2095 azx_dev->insufficient = 0;
2096 }
2097
2098 if (link_pos <= fifo_size)
2099 mini_pos = azx_dev->bufsize + link_pos - fifo_size;
2100 else
2101 mini_pos = link_pos - fifo_size;
2102
2103 /* Find nearest previous boudary */
2104 mod_mini_pos = mini_pos % azx_dev->period_bytes;
2105 mod_link_pos = link_pos % azx_dev->period_bytes;
2106 if (mod_link_pos >= fifo_size)
2107 bound_pos = link_pos - mod_link_pos;
2108 else if (mod_dma_pos >= mod_mini_pos)
2109 bound_pos = mini_pos - mod_mini_pos;
2110 else {
2111 bound_pos = mini_pos - mod_mini_pos + azx_dev->period_bytes;
2112 if (bound_pos >= azx_dev->bufsize)
2113 bound_pos = 0;
2114 }
2115
2116 /* Calculate real DMA position we want */
2117 return bound_pos + mod_dma_pos;
2118}
2119
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002120static unsigned int azx_get_position(struct azx *chip,
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002121 struct azx_dev *azx_dev,
2122 bool with_check)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002123{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002124 unsigned int pos;
David Henningsson4cb36312010-09-30 10:12:50 +02002125 int stream = azx_dev->substream->stream;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002126
David Henningsson4cb36312010-09-30 10:12:50 +02002127 switch (chip->position_fix[stream]) {
2128 case POS_FIX_LPIB:
2129 /* read LPIB */
2130 pos = azx_sd_readl(azx_dev, SD_LPIB);
2131 break;
2132 case POS_FIX_VIACOMBO:
Joseph Chan0e153472008-08-26 14:38:03 +02002133 pos = azx_via_get_position(chip, azx_dev);
David Henningsson4cb36312010-09-30 10:12:50 +02002134 break;
2135 default:
2136 /* use the position buffer */
2137 pos = le32_to_cpu(*azx_dev->posbuf);
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002138 if (with_check && chip->position_fix[stream] == POS_FIX_AUTO) {
Takashi Iwaia8103642011-06-07 12:23:23 +02002139 if (!pos || pos == (u32)-1) {
2140 printk(KERN_WARNING
2141 "hda-intel: Invalid position buffer, "
2142 "using LPIB read method instead.\n");
2143 chip->position_fix[stream] = POS_FIX_LPIB;
2144 pos = azx_sd_readl(azx_dev, SD_LPIB);
2145 } else
2146 chip->position_fix[stream] = POS_FIX_POSBUF;
2147 }
2148 break;
Takashi Iwaic74db862005-05-12 14:26:27 +02002149 }
David Henningsson4cb36312010-09-30 10:12:50 +02002150
Linus Torvalds1da177e2005-04-16 15:20:36 -07002151 if (pos >= azx_dev->bufsize)
2152 pos = 0;
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002153
2154 /* calculate runtime delay from LPIB */
2155 if (azx_dev->substream->runtime &&
2156 chip->position_fix[stream] == POS_FIX_POSBUF &&
2157 (chip->driver_caps & AZX_DCAPS_COUNT_LPIB_DELAY)) {
2158 unsigned int lpib_pos = azx_sd_readl(azx_dev, SD_LPIB);
2159 int delay;
2160 if (stream == SNDRV_PCM_STREAM_PLAYBACK)
2161 delay = pos - lpib_pos;
2162 else
2163 delay = lpib_pos - pos;
2164 if (delay < 0)
2165 delay += azx_dev->bufsize;
2166 if (delay >= azx_dev->period_bytes) {
Takashi Iwai1f046612012-10-16 16:52:26 +02002167 snd_printk(KERN_WARNING SFX
2168 "Unstable LPIB (%d >= %d); "
2169 "disabling LPIB delay counting\n",
2170 delay, azx_dev->period_bytes);
2171 delay = 0;
2172 chip->driver_caps &= ~AZX_DCAPS_COUNT_LPIB_DELAY;
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002173 }
2174 azx_dev->substream->runtime->delay =
2175 bytes_to_frames(azx_dev->substream->runtime, delay);
2176 }
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002177 return pos;
2178}
2179
2180static snd_pcm_uframes_t azx_pcm_pointer(struct snd_pcm_substream *substream)
2181{
2182 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2183 struct azx *chip = apcm->chip;
2184 struct azx_dev *azx_dev = get_azx_dev(substream);
2185 return bytes_to_frames(substream->runtime,
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002186 azx_get_position(chip, azx_dev, false));
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002187}
2188
2189/*
2190 * Check whether the current DMA position is acceptable for updating
2191 * periods. Returns non-zero if it's OK.
2192 *
2193 * Many HD-audio controllers appear pretty inaccurate about
2194 * the update-IRQ timing. The IRQ is issued before actually the
2195 * data is processed. So, we need to process it afterwords in a
2196 * workqueue.
2197 */
2198static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev)
2199{
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002200 u32 wallclk;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002201 unsigned int pos;
Shahin Ghazinouribeaffc32010-05-11 08:19:55 +02002202 int stream;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002203
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002204 wallclk = azx_readl(chip, WALLCLK) - azx_dev->start_wallclk;
2205 if (wallclk < (azx_dev->period_wallclk * 2) / 3)
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002206 return -1; /* bogus (too early) interrupt */
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002207
Shahin Ghazinouribeaffc32010-05-11 08:19:55 +02002208 stream = azx_dev->substream->stream;
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002209 pos = azx_get_position(chip, azx_dev, true);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002210
Takashi Iwaid6d8bf52010-02-12 18:17:06 +01002211 if (WARN_ONCE(!azx_dev->period_bytes,
2212 "hda-intel: zero azx_dev->period_bytes"))
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002213 return -1; /* this shouldn't happen! */
Jaroslav Kyselaedb39932010-06-02 13:29:17 +02002214 if (wallclk < (azx_dev->period_wallclk * 5) / 4 &&
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002215 pos % azx_dev->period_bytes > azx_dev->period_bytes / 2)
2216 /* NG - it's below the first next period boundary */
2217 return bdl_pos_adj[chip->dev_index] ? 0 : -1;
Jaroslav Kyselaedb39932010-06-02 13:29:17 +02002218 azx_dev->start_wallclk += wallclk;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002219 return 1; /* OK, it's fine */
2220}
2221
2222/*
2223 * The work for pending PCM period updates.
2224 */
2225static void azx_irq_pending_work(struct work_struct *work)
2226{
2227 struct azx *chip = container_of(work, struct azx, irq_pending_work);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002228 int i, pending, ok;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002229
Takashi Iwaia6a950a2008-06-10 17:53:35 +02002230 if (!chip->irq_pending_warned) {
2231 printk(KERN_WARNING
2232 "hda-intel: IRQ timing workaround is activated "
2233 "for card #%d. Suggest a bigger bdl_pos_adj.\n",
2234 chip->card->number);
2235 chip->irq_pending_warned = 1;
2236 }
2237
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002238 for (;;) {
2239 pending = 0;
2240 spin_lock_irq(&chip->reg_lock);
2241 for (i = 0; i < chip->num_streams; i++) {
2242 struct azx_dev *azx_dev = &chip->azx_dev[i];
2243 if (!azx_dev->irq_pending ||
2244 !azx_dev->substream ||
2245 !azx_dev->running)
2246 continue;
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002247 ok = azx_position_ok(chip, azx_dev);
2248 if (ok > 0) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002249 azx_dev->irq_pending = 0;
2250 spin_unlock(&chip->reg_lock);
2251 snd_pcm_period_elapsed(azx_dev->substream);
2252 spin_lock(&chip->reg_lock);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002253 } else if (ok < 0) {
2254 pending = 0; /* too early */
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002255 } else
2256 pending++;
2257 }
2258 spin_unlock_irq(&chip->reg_lock);
2259 if (!pending)
2260 return;
Takashi Iwai08af4952010-08-03 14:39:04 +02002261 msleep(1);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002262 }
2263}
2264
2265/* clear irq_pending flags and assure no on-going workq */
2266static void azx_clear_irq_pending(struct azx *chip)
2267{
2268 int i;
2269
2270 spin_lock_irq(&chip->reg_lock);
2271 for (i = 0; i < chip->num_streams; i++)
2272 chip->azx_dev[i].irq_pending = 0;
2273 spin_unlock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002274}
2275
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002276#ifdef CONFIG_X86
2277static int azx_pcm_mmap(struct snd_pcm_substream *substream,
2278 struct vm_area_struct *area)
2279{
2280 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2281 struct azx *chip = apcm->chip;
2282 if (!azx_snoop(chip))
2283 area->vm_page_prot = pgprot_writecombine(area->vm_page_prot);
2284 return snd_pcm_lib_default_mmap(substream, area);
2285}
2286#else
2287#define azx_pcm_mmap NULL
2288#endif
2289
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002290static struct snd_pcm_ops azx_pcm_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002291 .open = azx_pcm_open,
2292 .close = azx_pcm_close,
2293 .ioctl = snd_pcm_lib_ioctl,
2294 .hw_params = azx_pcm_hw_params,
2295 .hw_free = azx_pcm_hw_free,
2296 .prepare = azx_pcm_prepare,
2297 .trigger = azx_pcm_trigger,
2298 .pointer = azx_pcm_pointer,
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002299 .mmap = azx_pcm_mmap,
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002300 .page = snd_pcm_sgbuf_ops_page,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002301};
2302
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002303static void azx_pcm_free(struct snd_pcm *pcm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002304{
Takashi Iwai176d5332008-07-30 15:01:44 +02002305 struct azx_pcm *apcm = pcm->private_data;
2306 if (apcm) {
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002307 list_del(&apcm->list);
Takashi Iwai176d5332008-07-30 15:01:44 +02002308 kfree(apcm);
2309 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002310}
2311
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002312#define MAX_PREALLOC_SIZE (32 * 1024 * 1024)
2313
Takashi Iwai176d5332008-07-30 15:01:44 +02002314static int
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002315azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec,
2316 struct hda_pcm *cpcm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002317{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002318 struct azx *chip = bus->private_data;
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002319 struct snd_pcm *pcm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002320 struct azx_pcm *apcm;
Takashi Iwai176d5332008-07-30 15:01:44 +02002321 int pcm_dev = cpcm->device;
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002322 unsigned int size;
Takashi Iwai176d5332008-07-30 15:01:44 +02002323 int s, err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002324
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002325 list_for_each_entry(apcm, &chip->pcm_list, list) {
2326 if (apcm->pcm->device == pcm_dev) {
2327 snd_printk(KERN_ERR SFX "PCM %d already exists\n", pcm_dev);
2328 return -EBUSY;
2329 }
Takashi Iwai176d5332008-07-30 15:01:44 +02002330 }
2331 err = snd_pcm_new(chip->card, cpcm->name, pcm_dev,
2332 cpcm->stream[SNDRV_PCM_STREAM_PLAYBACK].substreams,
2333 cpcm->stream[SNDRV_PCM_STREAM_CAPTURE].substreams,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002334 &pcm);
2335 if (err < 0)
2336 return err;
Takashi Iwai18cb7102009-04-16 10:22:24 +02002337 strlcpy(pcm->name, cpcm->name, sizeof(pcm->name));
Takashi Iwai176d5332008-07-30 15:01:44 +02002338 apcm = kzalloc(sizeof(*apcm), GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002339 if (apcm == NULL)
2340 return -ENOMEM;
2341 apcm->chip = chip;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002342 apcm->pcm = pcm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002343 apcm->codec = codec;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002344 pcm->private_data = apcm;
2345 pcm->private_free = azx_pcm_free;
Takashi Iwai176d5332008-07-30 15:01:44 +02002346 if (cpcm->pcm_type == HDA_PCM_TYPE_MODEM)
2347 pcm->dev_class = SNDRV_PCM_CLASS_MODEM;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002348 list_add_tail(&apcm->list, &chip->pcm_list);
Takashi Iwai176d5332008-07-30 15:01:44 +02002349 cpcm->pcm = pcm;
2350 for (s = 0; s < 2; s++) {
2351 apcm->hinfo[s] = &cpcm->stream[s];
2352 if (cpcm->stream[s].substreams)
2353 snd_pcm_set_ops(pcm, s, &azx_pcm_ops);
2354 }
2355 /* buffer pre-allocation */
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002356 size = CONFIG_SND_HDA_PREALLOC_SIZE * 1024;
2357 if (size > MAX_PREALLOC_SIZE)
2358 size = MAX_PREALLOC_SIZE;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002359 snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV_SG,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002360 snd_dma_pci_data(chip->pci),
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002361 size, MAX_PREALLOC_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002362 return 0;
2363}
2364
2365/*
2366 * mixer creation - all stuff is implemented in hda module
2367 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002368static int __devinit azx_mixer_create(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002369{
2370 return snd_hda_build_controls(chip->bus);
2371}
2372
2373
2374/*
2375 * initialize SD streams
2376 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002377static int __devinit azx_init_stream(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002378{
2379 int i;
2380
2381 /* initialize each stream (aka device)
Takashi Iwaid01ce992007-07-27 16:52:19 +02002382 * assign the starting bdl address to each stream (device)
2383 * and initialize
Linus Torvalds1da177e2005-04-16 15:20:36 -07002384 */
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002385 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002386 struct azx_dev *azx_dev = &chip->azx_dev[i];
Takashi Iwai929861c2006-08-31 16:55:40 +02002387 azx_dev->posbuf = (u32 __iomem *)(chip->posbuf.area + i * 8);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002388 /* offset: SDI0=0x80, SDI1=0xa0, ... SDO3=0x160 */
2389 azx_dev->sd_addr = chip->remap_addr + (0x20 * i + 0x80);
2390 /* int mask: SDI0=0x01, SDI1=0x02, ... SDO3=0x80 */
2391 azx_dev->sd_int_sta_mask = 1 << i;
2392 /* stream tag: must be non-zero and unique */
2393 azx_dev->index = i;
2394 azx_dev->stream_tag = i + 1;
2395 }
2396
2397 return 0;
2398}
2399
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002400static int azx_acquire_irq(struct azx *chip, int do_disconnect)
2401{
Takashi Iwai437a5a42006-11-21 12:14:23 +01002402 if (request_irq(chip->pci->irq, azx_interrupt,
2403 chip->msi ? 0 : IRQF_SHARED,
Takashi Iwai934c2b62011-06-10 16:36:37 +02002404 KBUILD_MODNAME, chip)) {
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002405 printk(KERN_ERR "hda-intel: unable to grab IRQ %d, "
2406 "disabling device\n", chip->pci->irq);
2407 if (do_disconnect)
2408 snd_card_disconnect(chip->card);
2409 return -1;
2410 }
2411 chip->irq = chip->pci->irq;
Takashi Iwai69e13412006-11-21 12:10:55 +01002412 pci_intx(chip->pci, !chip->msi);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002413 return 0;
2414}
2415
Linus Torvalds1da177e2005-04-16 15:20:36 -07002416
Takashi Iwaicb53c622007-08-10 17:21:45 +02002417static void azx_stop_chip(struct azx *chip)
2418{
Takashi Iwai95e99fd2007-08-13 15:29:04 +02002419 if (!chip->initialized)
Takashi Iwaicb53c622007-08-10 17:21:45 +02002420 return;
2421
2422 /* disable interrupts */
2423 azx_int_disable(chip);
2424 azx_int_clear(chip);
2425
2426 /* disable CORB/RIRB */
2427 azx_free_cmd_io(chip);
2428
2429 /* disable position buffer */
2430 azx_writel(chip, DPLBASE, 0);
2431 azx_writel(chip, DPUBASE, 0);
2432
2433 chip->initialized = 0;
2434}
2435
Takashi Iwai83012a72012-08-24 18:38:08 +02002436#ifdef CONFIG_PM
Takashi Iwaicb53c622007-08-10 17:21:45 +02002437/* power-up/down the controller */
Takashi Iwai68467f52012-08-28 09:14:29 -07002438static void azx_power_notify(struct hda_bus *bus, bool power_up)
Takashi Iwaicb53c622007-08-10 17:21:45 +02002439{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002440 struct azx *chip = bus->private_data;
Takashi Iwaicb53c622007-08-10 17:21:45 +02002441
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01002442 if (!(chip->driver_caps & AZX_DCAPS_PM_RUNTIME))
2443 return;
2444
Takashi Iwai68467f52012-08-28 09:14:29 -07002445 if (power_up)
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002446 pm_runtime_get_sync(&chip->pci->dev);
2447 else
2448 pm_runtime_put_sync(&chip->pci->dev);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002449}
Takashi Iwai65fcd412012-08-14 17:13:32 +02002450
2451static DEFINE_MUTEX(card_list_lock);
2452static LIST_HEAD(card_list);
2453
2454static void azx_add_card_list(struct azx *chip)
2455{
2456 mutex_lock(&card_list_lock);
2457 list_add(&chip->list, &card_list);
2458 mutex_unlock(&card_list_lock);
2459}
2460
2461static void azx_del_card_list(struct azx *chip)
2462{
2463 mutex_lock(&card_list_lock);
2464 list_del_init(&chip->list);
2465 mutex_unlock(&card_list_lock);
2466}
2467
2468/* trigger power-save check at writing parameter */
2469static int param_set_xint(const char *val, const struct kernel_param *kp)
2470{
2471 struct azx *chip;
2472 struct hda_codec *c;
2473 int prev = power_save;
2474 int ret = param_set_int(val, kp);
2475
2476 if (ret || prev == power_save)
2477 return ret;
2478
2479 mutex_lock(&card_list_lock);
2480 list_for_each_entry(chip, &card_list, list) {
2481 if (!chip->bus || chip->disabled)
2482 continue;
2483 list_for_each_entry(c, &chip->bus->codec_list, list)
2484 snd_hda_power_sync(c);
2485 }
2486 mutex_unlock(&card_list_lock);
2487 return 0;
2488}
2489#else
2490#define azx_add_card_list(chip) /* NOP */
2491#define azx_del_card_list(chip) /* NOP */
Takashi Iwai83012a72012-08-24 18:38:08 +02002492#endif /* CONFIG_PM */
Takashi Iwai5c0b9be2008-12-11 11:47:17 +01002493
Takashi Iwai7ccbde52012-08-14 18:10:09 +02002494#if defined(CONFIG_PM_SLEEP) || defined(SUPPORT_VGA_SWITCHEROO)
Takashi Iwai5c0b9be2008-12-11 11:47:17 +01002495/*
2496 * power management
2497 */
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002498static int azx_suspend(struct device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002499{
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002500 struct pci_dev *pci = to_pci_dev(dev);
2501 struct snd_card *card = dev_get_drvdata(dev);
Takashi Iwai421a1252005-11-17 16:11:09 +01002502 struct azx *chip = card->private_data;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002503 struct azx_pcm *p;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002504
Takashi Iwai421a1252005-11-17 16:11:09 +01002505 snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002506 azx_clear_irq_pending(chip);
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002507 list_for_each_entry(p, &chip->pcm_list, list)
2508 snd_pcm_suspend_all(p->pcm);
Takashi Iwai0b7a2e92007-08-14 15:18:26 +02002509 if (chip->initialized)
Takashi Iwai8dd78332009-06-02 01:16:07 +02002510 snd_hda_suspend(chip->bus);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002511 azx_stop_chip(chip);
Takashi Iwai30b35392006-10-11 18:52:53 +02002512 if (chip->irq >= 0) {
Takashi Iwai43001c92006-09-08 12:30:03 +02002513 free_irq(chip->irq, chip);
Takashi Iwai30b35392006-10-11 18:52:53 +02002514 chip->irq = -1;
2515 }
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002516 if (chip->msi)
Takashi Iwai43001c92006-09-08 12:30:03 +02002517 pci_disable_msi(chip->pci);
Takashi Iwai421a1252005-11-17 16:11:09 +01002518 pci_disable_device(pci);
2519 pci_save_state(pci);
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002520 pci_set_power_state(pci, PCI_D3hot);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002521 return 0;
2522}
2523
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002524static int azx_resume(struct device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002525{
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002526 struct pci_dev *pci = to_pci_dev(dev);
2527 struct snd_card *card = dev_get_drvdata(dev);
Takashi Iwai421a1252005-11-17 16:11:09 +01002528 struct azx *chip = card->private_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002529
Takashi Iwaid14a7e02009-02-16 10:13:03 +01002530 pci_set_power_state(pci, PCI_D0);
2531 pci_restore_state(pci);
Takashi Iwai30b35392006-10-11 18:52:53 +02002532 if (pci_enable_device(pci) < 0) {
2533 printk(KERN_ERR "hda-intel: pci_enable_device failed, "
2534 "disabling device\n");
2535 snd_card_disconnect(card);
2536 return -EIO;
2537 }
2538 pci_set_master(pci);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002539 if (chip->msi)
2540 if (pci_enable_msi(pci) < 0)
2541 chip->msi = 0;
2542 if (azx_acquire_irq(chip, 1) < 0)
Takashi Iwai30b35392006-10-11 18:52:53 +02002543 return -EIO;
Takashi Iwaicb53c622007-08-10 17:21:45 +02002544 azx_init_pci(chip);
Maxim Levitskyd804ad92007-09-03 15:28:04 +02002545
Takashi Iwai7f308302012-05-08 16:52:23 +02002546 azx_init_chip(chip, 1);
Maxim Levitskyd804ad92007-09-03 15:28:04 +02002547
Linus Torvalds1da177e2005-04-16 15:20:36 -07002548 snd_hda_resume(chip->bus);
Takashi Iwai421a1252005-11-17 16:11:09 +01002549 snd_power_change_state(card, SNDRV_CTL_POWER_D0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002550 return 0;
2551}
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002552#endif /* CONFIG_PM_SLEEP || SUPPORT_VGA_SWITCHEROO */
2553
2554#ifdef CONFIG_PM_RUNTIME
2555static int azx_runtime_suspend(struct device *dev)
2556{
2557 struct snd_card *card = dev_get_drvdata(dev);
2558 struct azx *chip = card->private_data;
2559
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01002560 if (!power_save_controller ||
2561 !(chip->driver_caps & AZX_DCAPS_PM_RUNTIME))
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002562 return -EAGAIN;
2563
2564 azx_stop_chip(chip);
2565 azx_clear_irq_pending(chip);
2566 return 0;
2567}
2568
2569static int azx_runtime_resume(struct device *dev)
2570{
2571 struct snd_card *card = dev_get_drvdata(dev);
2572 struct azx *chip = card->private_data;
2573
2574 azx_init_pci(chip);
2575 azx_init_chip(chip, 1);
2576 return 0;
2577}
2578#endif /* CONFIG_PM_RUNTIME */
2579
2580#ifdef CONFIG_PM
2581static const struct dev_pm_ops azx_pm = {
2582 SET_SYSTEM_SLEEP_PM_OPS(azx_suspend, azx_resume)
2583 SET_RUNTIME_PM_OPS(azx_runtime_suspend, azx_runtime_resume, NULL)
2584};
2585
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002586#define AZX_PM_OPS &azx_pm
2587#else
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002588#define AZX_PM_OPS NULL
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002589#endif /* CONFIG_PM */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002590
2591
2592/*
Takashi Iwai0cbf0092008-10-29 16:18:25 +01002593 * reboot notifier for hang-up problem at power-down
2594 */
2595static int azx_halt(struct notifier_block *nb, unsigned long event, void *buf)
2596{
2597 struct azx *chip = container_of(nb, struct azx, reboot_notifier);
Takashi Iwaifb8d1a32009-11-10 16:02:29 +01002598 snd_hda_bus_reboot_notify(chip->bus);
Takashi Iwai0cbf0092008-10-29 16:18:25 +01002599 azx_stop_chip(chip);
2600 return NOTIFY_OK;
2601}
2602
2603static void azx_notifier_register(struct azx *chip)
2604{
2605 chip->reboot_notifier.notifier_call = azx_halt;
2606 register_reboot_notifier(&chip->reboot_notifier);
2607}
2608
2609static void azx_notifier_unregister(struct azx *chip)
2610{
2611 if (chip->reboot_notifier.notifier_call)
2612 unregister_reboot_notifier(&chip->reboot_notifier);
2613}
2614
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002615static int DELAYED_INIT_MARK azx_first_init(struct azx *chip);
2616static int DELAYED_INIT_MARK azx_probe_continue(struct azx *chip);
2617
Steven Newbury8393ec4a2012-06-08 13:06:29 +02002618#ifdef SUPPORT_VGA_SWITCHEROO
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002619static struct pci_dev __devinit *get_bound_vga(struct pci_dev *pci);
2620
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002621static void azx_vs_set_state(struct pci_dev *pci,
2622 enum vga_switcheroo_state state)
2623{
2624 struct snd_card *card = pci_get_drvdata(pci);
2625 struct azx *chip = card->private_data;
2626 bool disabled;
2627
2628 if (chip->init_failed)
2629 return;
2630
2631 disabled = (state == VGA_SWITCHEROO_OFF);
2632 if (chip->disabled == disabled)
2633 return;
2634
2635 if (!chip->bus) {
2636 chip->disabled = disabled;
2637 if (!disabled) {
2638 snd_printk(KERN_INFO SFX
2639 "%s: Start delayed initialization\n",
2640 pci_name(chip->pci));
2641 if (azx_first_init(chip) < 0 ||
2642 azx_probe_continue(chip) < 0) {
2643 snd_printk(KERN_ERR SFX
2644 "%s: initialization error\n",
2645 pci_name(chip->pci));
2646 chip->init_failed = true;
2647 }
2648 }
2649 } else {
2650 snd_printk(KERN_INFO SFX
2651 "%s %s via VGA-switcheroo\n",
2652 disabled ? "Disabling" : "Enabling",
2653 pci_name(chip->pci));
2654 if (disabled) {
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002655 azx_suspend(&pci->dev);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002656 chip->disabled = true;
Takashi Iwai128960a2012-10-12 17:28:18 +02002657 if (snd_hda_lock_devices(chip->bus))
2658 snd_printk(KERN_WARNING SFX
2659 "Cannot lock devices!\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002660 } else {
2661 snd_hda_unlock_devices(chip->bus);
2662 chip->disabled = false;
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002663 azx_resume(&pci->dev);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002664 }
2665 }
2666}
2667
2668static bool azx_vs_can_switch(struct pci_dev *pci)
2669{
2670 struct snd_card *card = pci_get_drvdata(pci);
2671 struct azx *chip = card->private_data;
2672
2673 if (chip->init_failed)
2674 return false;
2675 if (chip->disabled || !chip->bus)
2676 return true;
2677 if (snd_hda_lock_devices(chip->bus))
2678 return false;
2679 snd_hda_unlock_devices(chip->bus);
2680 return true;
2681}
2682
2683static void __devinit init_vga_switcheroo(struct azx *chip)
2684{
2685 struct pci_dev *p = get_bound_vga(chip->pci);
2686 if (p) {
2687 snd_printk(KERN_INFO SFX
2688 "%s: Handle VGA-switcheroo audio client\n",
2689 pci_name(chip->pci));
2690 chip->use_vga_switcheroo = 1;
2691 pci_dev_put(p);
2692 }
2693}
2694
2695static const struct vga_switcheroo_client_ops azx_vs_ops = {
2696 .set_gpu_state = azx_vs_set_state,
2697 .can_switch = azx_vs_can_switch,
2698};
2699
2700static int __devinit register_vga_switcheroo(struct azx *chip)
2701{
Takashi Iwai128960a2012-10-12 17:28:18 +02002702 int err;
2703
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002704 if (!chip->use_vga_switcheroo)
2705 return 0;
2706 /* FIXME: currently only handling DIS controller
2707 * is there any machine with two switchable HDMI audio controllers?
2708 */
Takashi Iwai128960a2012-10-12 17:28:18 +02002709 err = vga_switcheroo_register_audio_client(chip->pci, &azx_vs_ops,
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002710 VGA_SWITCHEROO_DIS,
2711 chip->bus != NULL);
Takashi Iwai128960a2012-10-12 17:28:18 +02002712 if (err < 0)
2713 return err;
2714 chip->vga_switcheroo_registered = 1;
2715 return 0;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002716}
2717#else
2718#define init_vga_switcheroo(chip) /* NOP */
2719#define register_vga_switcheroo(chip) 0
Steven Newbury8393ec4a2012-06-08 13:06:29 +02002720#define check_hdmi_disabled(pci) false
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002721#endif /* SUPPORT_VGA_SWITCHER */
2722
Takashi Iwai0cbf0092008-10-29 16:18:25 +01002723/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002724 * destructor
2725 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002726static int azx_free(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002727{
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002728 int i;
2729
Takashi Iwai65fcd412012-08-14 17:13:32 +02002730 azx_del_card_list(chip);
2731
Takashi Iwai0cbf0092008-10-29 16:18:25 +01002732 azx_notifier_unregister(chip);
2733
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002734 if (use_vga_switcheroo(chip)) {
2735 if (chip->disabled && chip->bus)
2736 snd_hda_unlock_devices(chip->bus);
Takashi Iwai128960a2012-10-12 17:28:18 +02002737 if (chip->vga_switcheroo_registered)
2738 vga_switcheroo_unregister_client(chip->pci);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002739 }
2740
Takashi Iwaice43fba2005-05-30 20:33:44 +02002741 if (chip->initialized) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002742 azx_clear_irq_pending(chip);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002743 for (i = 0; i < chip->num_streams; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002744 azx_stream_stop(chip, &chip->azx_dev[i]);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002745 azx_stop_chip(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002746 }
2747
Jeff Garzikf000fd82008-04-22 13:50:34 +02002748 if (chip->irq >= 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002749 free_irq(chip->irq, (void*)chip);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002750 if (chip->msi)
Takashi Iwai30b35392006-10-11 18:52:53 +02002751 pci_disable_msi(chip->pci);
Takashi Iwaif079c252006-06-01 11:42:14 +02002752 if (chip->remap_addr)
2753 iounmap(chip->remap_addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002754
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002755 if (chip->azx_dev) {
2756 for (i = 0; i < chip->num_streams; i++)
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002757 if (chip->azx_dev[i].bdl.area) {
2758 mark_pages_wc(chip, &chip->azx_dev[i].bdl, false);
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002759 snd_dma_free_pages(&chip->azx_dev[i].bdl);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002760 }
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002761 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002762 if (chip->rb.area) {
2763 mark_pages_wc(chip, &chip->rb, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002764 snd_dma_free_pages(&chip->rb);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002765 }
2766 if (chip->posbuf.area) {
2767 mark_pages_wc(chip, &chip->posbuf, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002768 snd_dma_free_pages(&chip->posbuf);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002769 }
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002770 if (chip->region_requested)
2771 pci_release_regions(chip->pci);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002772 pci_disable_device(chip->pci);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002773 kfree(chip->azx_dev);
Takashi Iwai4918cda2012-08-09 12:33:28 +02002774#ifdef CONFIG_SND_HDA_PATCH_LOADER
2775 if (chip->fw)
2776 release_firmware(chip->fw);
2777#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07002778 kfree(chip);
2779
2780 return 0;
2781}
2782
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002783static int azx_dev_free(struct snd_device *device)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002784{
2785 return azx_free(device->device_data);
2786}
2787
Steven Newbury8393ec4a2012-06-08 13:06:29 +02002788#ifdef SUPPORT_VGA_SWITCHEROO
Linus Torvalds1da177e2005-04-16 15:20:36 -07002789/*
Takashi Iwai91219472012-04-26 12:13:25 +02002790 * Check of disabled HDMI controller by vga-switcheroo
2791 */
2792static struct pci_dev __devinit *get_bound_vga(struct pci_dev *pci)
2793{
2794 struct pci_dev *p;
2795
2796 /* check only discrete GPU */
2797 switch (pci->vendor) {
2798 case PCI_VENDOR_ID_ATI:
2799 case PCI_VENDOR_ID_AMD:
2800 case PCI_VENDOR_ID_NVIDIA:
2801 if (pci->devfn == 1) {
2802 p = pci_get_domain_bus_and_slot(pci_domain_nr(pci->bus),
2803 pci->bus->number, 0);
2804 if (p) {
2805 if ((p->class >> 8) == PCI_CLASS_DISPLAY_VGA)
2806 return p;
2807 pci_dev_put(p);
2808 }
2809 }
2810 break;
2811 }
2812 return NULL;
2813}
2814
2815static bool __devinit check_hdmi_disabled(struct pci_dev *pci)
2816{
2817 bool vga_inactive = false;
2818 struct pci_dev *p = get_bound_vga(pci);
2819
2820 if (p) {
Takashi Iwai12b78a72012-06-07 12:15:16 +02002821 if (vga_switcheroo_get_client_state(p) == VGA_SWITCHEROO_OFF)
Takashi Iwai91219472012-04-26 12:13:25 +02002822 vga_inactive = true;
2823 pci_dev_put(p);
2824 }
2825 return vga_inactive;
2826}
Steven Newbury8393ec4a2012-06-08 13:06:29 +02002827#endif /* SUPPORT_VGA_SWITCHEROO */
Takashi Iwai91219472012-04-26 12:13:25 +02002828
2829/*
Takashi Iwai3372a152007-02-01 15:46:50 +01002830 * white/black-listing for position_fix
2831 */
Ralf Baechle623ec042007-03-13 15:29:47 +01002832static struct snd_pci_quirk position_fix_list[] __devinitdata = {
Takashi Iwaid2e1c972008-06-10 17:53:34 +02002833 SND_PCI_QUIRK(0x1028, 0x01cc, "Dell D820", POS_FIX_LPIB),
2834 SND_PCI_QUIRK(0x1028, 0x01de, "Dell Precision 390", POS_FIX_LPIB),
Takashi Iwai2f703e72009-12-01 14:17:37 +01002835 SND_PCI_QUIRK(0x103c, 0x306d, "HP dv3", POS_FIX_LPIB),
Takashi Iwaid2e1c972008-06-10 17:53:34 +02002836 SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB),
Daniel T Chendd37f8e2010-05-30 01:17:03 -04002837 SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS", POS_FIX_LPIB),
Daniel T Chen9f75c1b2010-05-30 13:08:41 -04002838 SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS M2V", POS_FIX_LPIB),
Daniel T Chene96d3122010-05-27 18:32:18 -04002839 SND_PCI_QUIRK(0x104d, 0x9069, "Sony VPCS11V9E", POS_FIX_LPIB),
David Henningssonb01de4f2012-01-12 16:31:14 +01002840 SND_PCI_QUIRK(0x10de, 0xcb89, "Macbook Pro 7,1", POS_FIX_LPIB),
Daniel T Chen61bb42c2010-05-29 11:04:11 -04002841 SND_PCI_QUIRK(0x1297, 0x3166, "Shuttle", POS_FIX_LPIB),
Daniel T Chen9ec8dda2010-03-28 02:34:40 -04002842 SND_PCI_QUIRK(0x1458, 0xa022, "ga-ma770-ud3", POS_FIX_LPIB),
Takashi Iwai45d4ebf2009-11-30 11:58:30 +01002843 SND_PCI_QUIRK(0x1462, 0x1002, "MSI Wind U115", POS_FIX_LPIB),
Takashi Iwai8815cd02010-04-15 09:02:41 +02002844 SND_PCI_QUIRK(0x1565, 0x8218, "Biostar Microtech", POS_FIX_LPIB),
Daniel T Chenb90c0762010-05-30 19:31:41 -04002845 SND_PCI_QUIRK(0x1849, 0x0888, "775Dual-VSTA", POS_FIX_LPIB),
Daniel T Chen0e0280d2010-04-21 19:55:43 -04002846 SND_PCI_QUIRK(0x8086, 0x2503, "DG965OT AAD63733-203", POS_FIX_LPIB),
Takashi Iwai3372a152007-02-01 15:46:50 +01002847 {}
2848};
2849
2850static int __devinit check_position_fix(struct azx *chip, int fix)
2851{
2852 const struct snd_pci_quirk *q;
2853
Takashi Iwaic673ba12009-03-17 07:49:14 +01002854 switch (fix) {
Takashi Iwai1dac6692012-09-13 14:59:47 +02002855 case POS_FIX_AUTO:
Takashi Iwaic673ba12009-03-17 07:49:14 +01002856 case POS_FIX_LPIB:
2857 case POS_FIX_POSBUF:
David Henningsson4cb36312010-09-30 10:12:50 +02002858 case POS_FIX_VIACOMBO:
Takashi Iwaia6f2fd52012-02-28 11:58:40 +01002859 case POS_FIX_COMBO:
Takashi Iwaic673ba12009-03-17 07:49:14 +01002860 return fix;
2861 }
2862
Takashi Iwaic673ba12009-03-17 07:49:14 +01002863 q = snd_pci_quirk_lookup(chip->pci, position_fix_list);
2864 if (q) {
2865 printk(KERN_INFO
2866 "hda_intel: position_fix set to %d "
2867 "for device %04x:%04x\n",
2868 q->value, q->subvendor, q->subdevice);
2869 return q->value;
Takashi Iwai3372a152007-02-01 15:46:50 +01002870 }
David Henningssonbdd9ef22010-10-04 12:02:14 +02002871
2872 /* Check VIA/ATI HD Audio Controller exist */
Takashi Iwai9477c582011-05-25 09:11:37 +02002873 if (chip->driver_caps & AZX_DCAPS_POSFIX_VIA) {
2874 snd_printd(SFX "Using VIACOMBO position fix\n");
David Henningssonbdd9ef22010-10-04 12:02:14 +02002875 return POS_FIX_VIACOMBO;
2876 }
Takashi Iwai9477c582011-05-25 09:11:37 +02002877 if (chip->driver_caps & AZX_DCAPS_POSFIX_LPIB) {
2878 snd_printd(SFX "Using LPIB position fix\n");
2879 return POS_FIX_LPIB;
2880 }
Takashi Iwaic673ba12009-03-17 07:49:14 +01002881 return POS_FIX_AUTO;
Takashi Iwai3372a152007-02-01 15:46:50 +01002882}
2883
2884/*
Takashi Iwai669ba272007-08-17 09:17:36 +02002885 * black-lists for probe_mask
2886 */
2887static struct snd_pci_quirk probe_mask_list[] __devinitdata = {
2888 /* Thinkpad often breaks the controller communication when accessing
2889 * to the non-working (or non-existing) modem codec slot.
2890 */
2891 SND_PCI_QUIRK(0x1014, 0x05b7, "Thinkpad Z60", 0x01),
2892 SND_PCI_QUIRK(0x17aa, 0x2010, "Thinkpad X/T/R60", 0x01),
2893 SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X/T/R61", 0x01),
Takashi Iwai0edb9452008-11-07 14:53:09 +01002894 /* broken BIOS */
2895 SND_PCI_QUIRK(0x1028, 0x20ac, "Dell Studio Desktop", 0x01),
Takashi Iwaief1681d2008-11-24 17:29:28 +01002896 /* including bogus ALC268 in slot#2 that conflicts with ALC888 */
2897 SND_PCI_QUIRK(0x17c0, 0x4085, "Medion MD96630", 0x01),
Takashi Iwai20db7cb2009-02-13 08:18:48 +01002898 /* forced codec slots */
Ozan Çağlayan93574842009-05-23 15:00:04 +03002899 SND_PCI_QUIRK(0x1043, 0x1262, "ASUS W5Fm", 0x103),
Takashi Iwai20db7cb2009-02-13 08:18:48 +01002900 SND_PCI_QUIRK(0x1046, 0x1262, "ASUS W5F", 0x103),
Jaroslav Kyselaf3af9052012-04-26 17:52:35 +02002901 /* WinFast VP200 H (Teradici) user reported broken communication */
2902 SND_PCI_QUIRK(0x3a21, 0x040d, "WinFast VP200 H", 0x101),
Takashi Iwai669ba272007-08-17 09:17:36 +02002903 {}
2904};
2905
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01002906#define AZX_FORCE_CODEC_MASK 0x100
2907
Takashi Iwai5aba4f82008-01-07 15:16:37 +01002908static void __devinit check_probe_mask(struct azx *chip, int dev)
Takashi Iwai669ba272007-08-17 09:17:36 +02002909{
2910 const struct snd_pci_quirk *q;
2911
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01002912 chip->codec_probe_mask = probe_mask[dev];
2913 if (chip->codec_probe_mask == -1) {
Takashi Iwai669ba272007-08-17 09:17:36 +02002914 q = snd_pci_quirk_lookup(chip->pci, probe_mask_list);
2915 if (q) {
2916 printk(KERN_INFO
2917 "hda_intel: probe_mask set to 0x%x "
2918 "for device %04x:%04x\n",
2919 q->value, q->subvendor, q->subdevice);
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01002920 chip->codec_probe_mask = q->value;
Takashi Iwai669ba272007-08-17 09:17:36 +02002921 }
2922 }
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01002923
2924 /* check forced option */
2925 if (chip->codec_probe_mask != -1 &&
2926 (chip->codec_probe_mask & AZX_FORCE_CODEC_MASK)) {
2927 chip->codec_mask = chip->codec_probe_mask & 0xff;
2928 printk(KERN_INFO "hda_intel: codec_mask forced to 0x%x\n",
2929 chip->codec_mask);
2930 }
Takashi Iwai669ba272007-08-17 09:17:36 +02002931}
2932
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02002933/*
Takashi Iwai716238552009-09-28 13:14:04 +02002934 * white/black-list for enable_msi
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02002935 */
Takashi Iwai716238552009-09-28 13:14:04 +02002936static struct snd_pci_quirk msi_black_list[] __devinitdata = {
Takashi Iwai9dc83982009-12-22 08:15:01 +01002937 SND_PCI_QUIRK(0x1043, 0x81f2, "ASUS", 0), /* Athlon64 X2 + nvidia */
Takashi Iwai0a27fcf2010-02-15 17:05:28 +01002938 SND_PCI_QUIRK(0x1043, 0x81f6, "ASUS", 0), /* nvidia */
Ralf Gerbigecd21622010-03-09 18:25:47 +01002939 SND_PCI_QUIRK(0x1043, 0x822d, "ASUS", 0), /* Athlon64 X2 + nvidia MCP55 */
Michele Ballabio4193d132010-03-06 21:06:46 +01002940 SND_PCI_QUIRK(0x1849, 0x0888, "ASRock", 0), /* Athlon64 X2 + nvidia */
Takashi Iwai38155952010-04-04 12:14:03 +02002941 SND_PCI_QUIRK(0xa0a0, 0x0575, "Aopen MZ915-M", 0), /* ICH6 */
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02002942 {}
2943};
2944
2945static void __devinit check_msi(struct azx *chip)
2946{
2947 const struct snd_pci_quirk *q;
2948
Takashi Iwai716238552009-09-28 13:14:04 +02002949 if (enable_msi >= 0) {
2950 chip->msi = !!enable_msi;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02002951 return;
Takashi Iwai716238552009-09-28 13:14:04 +02002952 }
2953 chip->msi = 1; /* enable MSI as default */
2954 q = snd_pci_quirk_lookup(chip->pci, msi_black_list);
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02002955 if (q) {
2956 printk(KERN_INFO
2957 "hda_intel: msi for device %04x:%04x set to %d\n",
2958 q->subvendor, q->subdevice, q->value);
2959 chip->msi = q->value;
Takashi Iwai80c43ed2010-03-15 15:51:53 +01002960 return;
2961 }
2962
2963 /* NVidia chipsets seem to cause troubles with MSI */
Takashi Iwai9477c582011-05-25 09:11:37 +02002964 if (chip->driver_caps & AZX_DCAPS_NO_MSI) {
2965 printk(KERN_INFO "hda_intel: Disabling MSI\n");
Takashi Iwai80c43ed2010-03-15 15:51:53 +01002966 chip->msi = 0;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02002967 }
2968}
2969
Takashi Iwaia1585d72011-12-14 09:27:04 +01002970/* check the snoop mode availability */
2971static void __devinit azx_check_snoop_available(struct azx *chip)
2972{
2973 bool snoop = chip->snoop;
2974
2975 switch (chip->driver_type) {
2976 case AZX_DRIVER_VIA:
2977 /* force to non-snoop mode for a new VIA controller
2978 * when BIOS is set
2979 */
2980 if (snoop) {
2981 u8 val;
2982 pci_read_config_byte(chip->pci, 0x42, &val);
2983 if (!(val & 0x80) && chip->pci->revision == 0x30)
2984 snoop = false;
2985 }
2986 break;
2987 case AZX_DRIVER_ATIHDMI_NS:
2988 /* new ATI HDMI requires non-snoop */
2989 snoop = false;
2990 break;
2991 }
2992
2993 if (snoop != chip->snoop) {
2994 snd_printk(KERN_INFO SFX "Force to %s mode\n",
2995 snoop ? "snoop" : "non-snoop");
2996 chip->snoop = snoop;
2997 }
2998}
Takashi Iwai669ba272007-08-17 09:17:36 +02002999
3000/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07003001 * constructor
3002 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01003003static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci,
Takashi Iwai9477c582011-05-25 09:11:37 +02003004 int dev, unsigned int driver_caps,
Takashi Iwaia98f90f2005-11-17 14:59:02 +01003005 struct azx **rchip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003006{
Takashi Iwaia98f90f2005-11-17 14:59:02 +01003007 static struct snd_device_ops ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003008 .dev_free = azx_dev_free,
3009 };
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003010 struct azx *chip;
3011 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003012
3013 *rchip = NULL;
Tobin Davisbcd72002008-01-15 11:23:55 +01003014
Pavel Machek927fc862006-08-31 17:03:43 +02003015 err = pci_enable_device(pci);
3016 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003017 return err;
3018
Takashi Iwaie560d8d2005-09-09 14:21:46 +02003019 chip = kzalloc(sizeof(*chip), GFP_KERNEL);
Pavel Machek927fc862006-08-31 17:03:43 +02003020 if (!chip) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003021 snd_printk(KERN_ERR SFX "cannot allocate chip\n");
3022 pci_disable_device(pci);
3023 return -ENOMEM;
3024 }
3025
3026 spin_lock_init(&chip->reg_lock);
Ingo Molnar62932df2006-01-16 16:34:20 +01003027 mutex_init(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003028 chip->card = card;
3029 chip->pci = pci;
3030 chip->irq = -1;
Takashi Iwai9477c582011-05-25 09:11:37 +02003031 chip->driver_caps = driver_caps;
3032 chip->driver_type = driver_caps & 0xff;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003033 check_msi(chip);
Takashi Iwai555e2192008-06-10 17:53:34 +02003034 chip->dev_index = dev;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02003035 INIT_WORK(&chip->irq_pending_work, azx_irq_pending_work);
Takashi Iwai01b65bf2011-11-24 14:31:46 +01003036 INIT_LIST_HEAD(&chip->pcm_list);
Takashi Iwai65fcd412012-08-14 17:13:32 +02003037 INIT_LIST_HEAD(&chip->list);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003038 init_vga_switcheroo(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003039
Shahin Ghazinouribeaffc32010-05-11 08:19:55 +02003040 chip->position_fix[0] = chip->position_fix[1] =
3041 check_position_fix(chip, position_fix[dev]);
Takashi Iwaia6f2fd52012-02-28 11:58:40 +01003042 /* combo mode uses LPIB for playback */
3043 if (chip->position_fix[0] == POS_FIX_COMBO) {
3044 chip->position_fix[0] = POS_FIX_LPIB;
3045 chip->position_fix[1] = POS_FIX_AUTO;
3046 }
3047
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003048 check_probe_mask(chip, dev);
Takashi Iwai3372a152007-02-01 15:46:50 +01003049
Takashi Iwai27346162006-01-12 18:28:44 +01003050 chip->single_cmd = single_cmd;
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003051 chip->snoop = hda_snoop;
Takashi Iwaia1585d72011-12-14 09:27:04 +01003052 azx_check_snoop_available(chip);
Takashi Iwaic74db862005-05-12 14:26:27 +02003053
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02003054 if (bdl_pos_adj[dev] < 0) {
3055 switch (chip->driver_type) {
Takashi Iwai0c6341a2008-06-13 20:50:27 +02003056 case AZX_DRIVER_ICH:
Seth Heasley32679f92010-02-22 17:31:09 -08003057 case AZX_DRIVER_PCH:
Takashi Iwai0c6341a2008-06-13 20:50:27 +02003058 bdl_pos_adj[dev] = 1;
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02003059 break;
3060 default:
Takashi Iwai0c6341a2008-06-13 20:50:27 +02003061 bdl_pos_adj[dev] = 32;
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02003062 break;
3063 }
3064 }
3065
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003066 if (check_hdmi_disabled(pci)) {
3067 snd_printk(KERN_INFO SFX "VGA controller for %s is disabled\n",
3068 pci_name(pci));
3069 if (use_vga_switcheroo(chip)) {
3070 snd_printk(KERN_INFO SFX "Delaying initialization\n");
3071 chip->disabled = true;
3072 goto ok;
3073 }
3074 kfree(chip);
3075 pci_disable_device(pci);
3076 return -ENXIO;
3077 }
3078
3079 err = azx_first_init(chip);
3080 if (err < 0) {
3081 azx_free(chip);
3082 return err;
3083 }
3084
3085 ok:
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003086 err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
3087 if (err < 0) {
3088 snd_printk(KERN_ERR SFX "Error creating device [card]!\n");
3089 azx_free(chip);
3090 return err;
3091 }
3092
3093 *rchip = chip;
3094 return 0;
3095}
3096
3097static int DELAYED_INIT_MARK azx_first_init(struct azx *chip)
3098{
3099 int dev = chip->dev_index;
3100 struct pci_dev *pci = chip->pci;
3101 struct snd_card *card = chip->card;
3102 int i, err;
3103 unsigned short gcap;
3104
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003105#if BITS_PER_LONG != 64
3106 /* Fix up base address on ULI M5461 */
3107 if (chip->driver_type == AZX_DRIVER_ULI) {
3108 u16 tmp3;
3109 pci_read_config_word(pci, 0x40, &tmp3);
3110 pci_write_config_word(pci, 0x40, tmp3 | 0x10);
3111 pci_write_config_dword(pci, PCI_BASE_ADDRESS_1, 0);
3112 }
3113#endif
3114
Pavel Machek927fc862006-08-31 17:03:43 +02003115 err = pci_request_regions(pci, "ICH HD audio");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003116 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003117 return err;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003118 chip->region_requested = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003119
Pavel Machek927fc862006-08-31 17:03:43 +02003120 chip->addr = pci_resource_start(pci, 0);
Arjan van de Ven2f5ad542008-09-28 16:20:09 -07003121 chip->remap_addr = pci_ioremap_bar(pci, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003122 if (chip->remap_addr == NULL) {
3123 snd_printk(KERN_ERR SFX "ioremap error\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003124 return -ENXIO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003125 }
3126
Takashi Iwai68e7fff2006-10-23 13:40:59 +02003127 if (chip->msi)
3128 if (pci_enable_msi(pci) < 0)
3129 chip->msi = 0;
Stephen Hemminger7376d012006-08-21 19:17:46 +02003130
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003131 if (azx_acquire_irq(chip, 0) < 0)
3132 return -EBUSY;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003133
3134 pci_set_master(pci);
3135 synchronize_irq(chip->irq);
3136
Tobin Davisbcd72002008-01-15 11:23:55 +01003137 gcap = azx_readw(chip, GCAP);
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02003138 snd_printdd(SFX "chipset global capabilities = 0x%x\n", gcap);
Tobin Davisbcd72002008-01-15 11:23:55 +01003139
Andiry Brienzadc4c2e62009-07-08 13:55:31 +08003140 /* disable SB600 64bit support for safety */
Takashi Iwai9477c582011-05-25 09:11:37 +02003141 if (chip->pci->vendor == PCI_VENDOR_ID_ATI) {
Andiry Brienzadc4c2e62009-07-08 13:55:31 +08003142 struct pci_dev *p_smbus;
3143 p_smbus = pci_get_device(PCI_VENDOR_ID_ATI,
3144 PCI_DEVICE_ID_ATI_SBX00_SMBUS,
3145 NULL);
3146 if (p_smbus) {
3147 if (p_smbus->revision < 0x30)
3148 gcap &= ~ICH6_GCAP_64OK;
3149 pci_dev_put(p_smbus);
3150 }
3151 }
Takashi Iwai09240cf2009-03-17 07:47:18 +01003152
Takashi Iwai9477c582011-05-25 09:11:37 +02003153 /* disable 64bit DMA address on some devices */
3154 if (chip->driver_caps & AZX_DCAPS_NO_64BIT) {
3155 snd_printd(SFX "Disabling 64bit DMA\n");
Jaroslav Kysela396087e2009-12-09 10:44:47 +01003156 gcap &= ~ICH6_GCAP_64OK;
Takashi Iwai9477c582011-05-25 09:11:37 +02003157 }
Jaroslav Kysela396087e2009-12-09 10:44:47 +01003158
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003159 /* disable buffer size rounding to 128-byte multiples if supported */
Takashi Iwai7bfe0592012-01-23 17:53:39 +01003160 if (align_buffer_size >= 0)
3161 chip->align_buffer_size = !!align_buffer_size;
3162 else {
3163 if (chip->driver_caps & AZX_DCAPS_BUFSIZE)
3164 chip->align_buffer_size = 0;
3165 else if (chip->driver_caps & AZX_DCAPS_ALIGN_BUFSIZE)
3166 chip->align_buffer_size = 1;
3167 else
3168 chip->align_buffer_size = 1;
3169 }
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003170
Takashi Iwaicf7aaca2008-02-06 15:05:57 +01003171 /* allow 64bit DMA address if supported by H/W */
Takashi Iwaib21fadb2009-05-28 12:26:15 +02003172 if ((gcap & ICH6_GCAP_64OK) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64)))
Yang Hongyange9304382009-04-13 14:40:14 -07003173 pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(64));
Takashi Iwai09240cf2009-03-17 07:47:18 +01003174 else {
Yang Hongyange9304382009-04-13 14:40:14 -07003175 pci_set_dma_mask(pci, DMA_BIT_MASK(32));
3176 pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(32));
Takashi Iwai09240cf2009-03-17 07:47:18 +01003177 }
Takashi Iwaicf7aaca2008-02-06 15:05:57 +01003178
Takashi Iwai8b6ed8e2008-02-19 11:36:35 +01003179 /* read number of streams from GCAP register instead of using
3180 * hardcoded value
3181 */
3182 chip->capture_streams = (gcap >> 8) & 0x0f;
3183 chip->playback_streams = (gcap >> 12) & 0x0f;
3184 if (!chip->playback_streams && !chip->capture_streams) {
Tobin Davisbcd72002008-01-15 11:23:55 +01003185 /* gcap didn't give any info, switching to old method */
3186
3187 switch (chip->driver_type) {
3188 case AZX_DRIVER_ULI:
3189 chip->playback_streams = ULI_NUM_PLAYBACK;
3190 chip->capture_streams = ULI_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01003191 break;
3192 case AZX_DRIVER_ATIHDMI:
Andiry Xu1815b342011-12-14 16:10:27 +08003193 case AZX_DRIVER_ATIHDMI_NS:
Tobin Davisbcd72002008-01-15 11:23:55 +01003194 chip->playback_streams = ATIHDMI_NUM_PLAYBACK;
3195 chip->capture_streams = ATIHDMI_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01003196 break;
Yang, Libinc4da29c2008-11-13 11:07:07 +01003197 case AZX_DRIVER_GENERIC:
Tobin Davisbcd72002008-01-15 11:23:55 +01003198 default:
3199 chip->playback_streams = ICH6_NUM_PLAYBACK;
3200 chip->capture_streams = ICH6_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01003201 break;
3202 }
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003203 }
Takashi Iwai8b6ed8e2008-02-19 11:36:35 +01003204 chip->capture_index_offset = 0;
3205 chip->playback_index_offset = chip->capture_streams;
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003206 chip->num_streams = chip->playback_streams + chip->capture_streams;
Takashi Iwaid01ce992007-07-27 16:52:19 +02003207 chip->azx_dev = kcalloc(chip->num_streams, sizeof(*chip->azx_dev),
3208 GFP_KERNEL);
Pavel Machek927fc862006-08-31 17:03:43 +02003209 if (!chip->azx_dev) {
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02003210 snd_printk(KERN_ERR SFX "cannot malloc azx_dev\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003211 return -ENOMEM;
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003212 }
3213
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003214 for (i = 0; i < chip->num_streams; i++) {
3215 /* allocate memory for the BDL for each stream */
3216 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
3217 snd_dma_pci_data(chip->pci),
3218 BDL_SIZE, &chip->azx_dev[i].bdl);
3219 if (err < 0) {
3220 snd_printk(KERN_ERR SFX "cannot allocate BDL\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003221 return -ENOMEM;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003222 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003223 mark_pages_wc(chip, &chip->azx_dev[i].bdl, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003224 }
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02003225 /* allocate memory for the position buffer */
Takashi Iwaid01ce992007-07-27 16:52:19 +02003226 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
3227 snd_dma_pci_data(chip->pci),
3228 chip->num_streams * 8, &chip->posbuf);
3229 if (err < 0) {
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02003230 snd_printk(KERN_ERR SFX "cannot allocate posbuf\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003231 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003232 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003233 mark_pages_wc(chip, &chip->posbuf, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003234 /* allocate CORB/RIRB */
Takashi Iwai81740862009-05-26 15:22:00 +02003235 err = azx_alloc_cmd_io(chip);
3236 if (err < 0)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003237 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003238
3239 /* initialize streams */
3240 azx_init_stream(chip);
3241
3242 /* initialize chip */
Takashi Iwaicb53c622007-08-10 17:21:45 +02003243 azx_init_pci(chip);
Jaroslav Kysela10e77dd2010-03-26 11:04:38 +01003244 azx_init_chip(chip, (probe_only[dev] & 2) == 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003245
3246 /* codec detection */
Pavel Machek927fc862006-08-31 17:03:43 +02003247 if (!chip->codec_mask) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003248 snd_printk(KERN_ERR SFX "no codecs found!\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003249 return -ENODEV;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003250 }
3251
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003252 strcpy(card->driver, "HDA-Intel");
Takashi Iwai18cb7102009-04-16 10:22:24 +02003253 strlcpy(card->shortname, driver_short_names[chip->driver_type],
3254 sizeof(card->shortname));
3255 snprintf(card->longname, sizeof(card->longname),
3256 "%s at 0x%lx irq %i",
3257 card->shortname, chip->addr, chip->irq);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003258
Linus Torvalds1da177e2005-04-16 15:20:36 -07003259 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003260}
3261
Takashi Iwaicb53c622007-08-10 17:21:45 +02003262static void power_down_all_codecs(struct azx *chip)
3263{
Takashi Iwai83012a72012-08-24 18:38:08 +02003264#ifdef CONFIG_PM
Takashi Iwaicb53c622007-08-10 17:21:45 +02003265 /* The codecs were powered up in snd_hda_codec_new().
3266 * Now all initialization done, so turn them down if possible
3267 */
3268 struct hda_codec *codec;
3269 list_for_each_entry(codec, &chip->bus->codec_list, list) {
3270 snd_hda_power_down(codec);
3271 }
3272#endif
3273}
3274
Takashi Iwai97c6a3d2012-08-09 17:40:46 +02003275#ifdef CONFIG_SND_HDA_PATCH_LOADER
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003276/* callback from request_firmware_nowait() */
3277static void azx_firmware_cb(const struct firmware *fw, void *context)
3278{
3279 struct snd_card *card = context;
3280 struct azx *chip = card->private_data;
3281 struct pci_dev *pci = chip->pci;
3282
3283 if (!fw) {
3284 snd_printk(KERN_ERR SFX "Cannot load firmware, aborting\n");
3285 goto error;
3286 }
3287
3288 chip->fw = fw;
3289 if (!chip->disabled) {
3290 /* continue probing */
3291 if (azx_probe_continue(chip))
3292 goto error;
3293 }
3294 return; /* OK */
3295
3296 error:
3297 snd_card_free(card);
3298 pci_set_drvdata(pci, NULL);
3299}
Takashi Iwai97c6a3d2012-08-09 17:40:46 +02003300#endif
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003301
Takashi Iwaid01ce992007-07-27 16:52:19 +02003302static int __devinit azx_probe(struct pci_dev *pci,
3303 const struct pci_device_id *pci_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003304{
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003305 static int dev;
Takashi Iwaia98f90f2005-11-17 14:59:02 +01003306 struct snd_card *card;
3307 struct azx *chip;
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003308 bool probe_now;
Pavel Machek927fc862006-08-31 17:03:43 +02003309 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003310
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003311 if (dev >= SNDRV_CARDS)
3312 return -ENODEV;
3313 if (!enable[dev]) {
3314 dev++;
3315 return -ENOENT;
3316 }
3317
Takashi Iwaie58de7b2008-12-28 16:44:30 +01003318 err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card);
3319 if (err < 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003320 snd_printk(KERN_ERR SFX "Error creating card!\n");
Takashi Iwaie58de7b2008-12-28 16:44:30 +01003321 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003322 }
3323
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003324 snd_card_set_dev(card, &pci->dev);
3325
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003326 err = azx_create(card, pci, dev, pci_id->driver_data, &chip);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003327 if (err < 0)
3328 goto out_free;
Takashi Iwai421a1252005-11-17 16:11:09 +01003329 card->private_data = chip;
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003330 probe_now = !chip->disabled;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003331
Takashi Iwai4918cda2012-08-09 12:33:28 +02003332#ifdef CONFIG_SND_HDA_PATCH_LOADER
3333 if (patch[dev] && *patch[dev]) {
3334 snd_printk(KERN_ERR SFX "Applying patch firmware '%s'\n",
3335 patch[dev]);
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003336 err = request_firmware_nowait(THIS_MODULE, true, patch[dev],
3337 &pci->dev, GFP_KERNEL, card,
3338 azx_firmware_cb);
Takashi Iwai4918cda2012-08-09 12:33:28 +02003339 if (err < 0)
3340 goto out_free;
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003341 probe_now = false; /* continued in azx_firmware_cb() */
Takashi Iwai4918cda2012-08-09 12:33:28 +02003342 }
3343#endif /* CONFIG_SND_HDA_PATCH_LOADER */
3344
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003345 if (probe_now) {
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003346 err = azx_probe_continue(chip);
3347 if (err < 0)
3348 goto out_free;
3349 }
3350
3351 pci_set_drvdata(pci, card);
3352
Mengdong Linb8dfc4622012-08-23 17:32:30 +08003353 if (pci_dev_run_wake(pci))
3354 pm_runtime_put_noidle(&pci->dev);
3355
Takashi Iwai128960a2012-10-12 17:28:18 +02003356 err = register_vga_switcheroo(chip);
3357 if (err < 0) {
3358 snd_printk(KERN_ERR SFX
3359 "Error registering VGA-switcheroo client\n");
3360 goto out_free;
3361 }
3362
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003363 dev++;
3364 return 0;
3365
3366out_free:
3367 snd_card_free(card);
3368 return err;
3369}
3370
3371static int DELAYED_INIT_MARK azx_probe_continue(struct azx *chip)
3372{
3373 int dev = chip->dev_index;
3374 int err;
3375
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +01003376#ifdef CONFIG_SND_HDA_INPUT_BEEP
3377 chip->beep_mode = beep_mode[dev];
3378#endif
3379
Linus Torvalds1da177e2005-04-16 15:20:36 -07003380 /* create codec instances */
Takashi Iwaia1e21c92009-06-17 09:33:52 +02003381 err = azx_codec_create(chip, model[dev]);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003382 if (err < 0)
3383 goto out_free;
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003384#ifdef CONFIG_SND_HDA_PATCH_LOADER
Takashi Iwai4918cda2012-08-09 12:33:28 +02003385 if (chip->fw) {
3386 err = snd_hda_load_patch(chip->bus, chip->fw->size,
3387 chip->fw->data);
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003388 if (err < 0)
3389 goto out_free;
Takashi Iwai4918cda2012-08-09 12:33:28 +02003390 release_firmware(chip->fw); /* no longer needed */
3391 chip->fw = NULL;
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003392 }
3393#endif
Jaroslav Kysela10e77dd2010-03-26 11:04:38 +01003394 if ((probe_only[dev] & 1) == 0) {
Takashi Iwaia1e21c92009-06-17 09:33:52 +02003395 err = azx_codec_configure(chip);
3396 if (err < 0)
3397 goto out_free;
3398 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003399
3400 /* create PCM streams */
Takashi Iwai176d5332008-07-30 15:01:44 +02003401 err = snd_hda_build_pcms(chip->bus);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003402 if (err < 0)
3403 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003404
3405 /* create mixer controls */
Takashi Iwaid01ce992007-07-27 16:52:19 +02003406 err = azx_mixer_create(chip);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003407 if (err < 0)
3408 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003409
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003410 err = snd_card_register(chip->card);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003411 if (err < 0)
3412 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003413
Takashi Iwaicb53c622007-08-10 17:21:45 +02003414 chip->running = 1;
3415 power_down_all_codecs(chip);
Takashi Iwai0cbf0092008-10-29 16:18:25 +01003416 azx_notifier_register(chip);
Takashi Iwai65fcd412012-08-14 17:13:32 +02003417 azx_add_card_list(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003418
Takashi Iwai91219472012-04-26 12:13:25 +02003419 return 0;
3420
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003421out_free:
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003422 chip->init_failed = 1;
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003423 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003424}
3425
3426static void __devexit azx_remove(struct pci_dev *pci)
3427{
Takashi Iwai91219472012-04-26 12:13:25 +02003428 struct snd_card *card = pci_get_drvdata(pci);
Mengdong Linb8dfc4622012-08-23 17:32:30 +08003429
3430 if (pci_dev_run_wake(pci))
3431 pm_runtime_get_noresume(&pci->dev);
3432
Takashi Iwai91219472012-04-26 12:13:25 +02003433 if (card)
3434 snd_card_free(card);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003435 pci_set_drvdata(pci, NULL);
3436}
3437
3438/* PCI IDs */
Alexey Dobriyancebe41d2010-02-06 00:21:03 +02003439static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
Seth Heasleyd2f2fcd2010-01-12 17:03:35 -08003440 /* CPT */
Takashi Iwai9477c582011-05-25 09:11:37 +02003441 { PCI_DEVICE(0x8086, 0x1c20),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003442 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
Seth Heasleycea310e2010-09-10 16:29:56 -07003443 /* PBG */
Takashi Iwai9477c582011-05-25 09:11:37 +02003444 { PCI_DEVICE(0x8086, 0x1d20),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003445 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
Seth Heasleyd2edeb72011-04-20 10:59:57 -07003446 /* Panther Point */
Takashi Iwai9477c582011-05-25 09:11:37 +02003447 { PCI_DEVICE(0x8086, 0x1e20),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003448 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
Seth Heasley8bc039a2012-01-23 16:24:31 -08003449 /* Lynx Point */
3450 { PCI_DEVICE(0x8086, 0x8c20),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003451 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
James Ralston144dad92012-08-09 09:38:59 -07003452 /* Lynx Point-LP */
3453 { PCI_DEVICE(0x8086, 0x9c20),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003454 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
James Ralston144dad92012-08-09 09:38:59 -07003455 /* Lynx Point-LP */
3456 { PCI_DEVICE(0x8086, 0x9c21),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003457 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
Wang Xingchaoe926f2c2012-06-13 10:23:51 +08003458 /* Haswell */
3459 { PCI_DEVICE(0x8086, 0x0c0c),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003460 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH },
Wang Xingchaod279fae2012-09-17 13:10:23 +08003461 { PCI_DEVICE(0x8086, 0x0d0c),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003462 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH },
Pierre-Louis Bossart99df18b2012-09-21 18:39:07 -05003463 /* 5 Series/3400 */
3464 { PCI_DEVICE(0x8086, 0x3b56),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003465 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH },
Takashi Iwai87218e92008-02-21 08:13:11 +01003466 /* SCH */
Takashi Iwai9477c582011-05-25 09:11:37 +02003467 { PCI_DEVICE(0x8086, 0x811b),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003468 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP |
David Henningsson645e9032011-12-14 15:52:30 +08003469 AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_LPIB }, /* Poulsbo */
Li Peng09904b92011-12-28 15:17:26 +00003470 { PCI_DEVICE(0x8086, 0x080a),
3471 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP |
David Henningsson716e5db2012-01-04 10:12:54 +01003472 AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_LPIB }, /* Oaktrail */
David Henningsson645e9032011-12-14 15:52:30 +08003473 /* ICH */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003474 { PCI_DEVICE(0x8086, 0x2668),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003475 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3476 AZX_DCAPS_BUFSIZE }, /* ICH6 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003477 { PCI_DEVICE(0x8086, 0x27d8),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003478 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3479 AZX_DCAPS_BUFSIZE }, /* ICH7 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003480 { PCI_DEVICE(0x8086, 0x269a),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003481 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3482 AZX_DCAPS_BUFSIZE }, /* ESB2 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003483 { PCI_DEVICE(0x8086, 0x284b),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003484 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3485 AZX_DCAPS_BUFSIZE }, /* ICH8 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003486 { PCI_DEVICE(0x8086, 0x293e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003487 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3488 AZX_DCAPS_BUFSIZE }, /* ICH9 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003489 { PCI_DEVICE(0x8086, 0x293f),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003490 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3491 AZX_DCAPS_BUFSIZE }, /* ICH9 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003492 { PCI_DEVICE(0x8086, 0x3a3e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003493 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3494 AZX_DCAPS_BUFSIZE }, /* ICH10 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003495 { PCI_DEVICE(0x8086, 0x3a6e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003496 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3497 AZX_DCAPS_BUFSIZE }, /* ICH10 */
Takashi Iwaib6864532010-09-15 10:17:26 +02003498 /* Generic Intel */
3499 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_ANY_ID),
3500 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3501 .class_mask = 0xffffff,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003502 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_BUFSIZE },
Takashi Iwai9477c582011-05-25 09:11:37 +02003503 /* ATI SB 450/600/700/800/900 */
3504 { PCI_DEVICE(0x1002, 0x437b),
3505 .driver_data = AZX_DRIVER_ATI | AZX_DCAPS_PRESET_ATI_SB },
3506 { PCI_DEVICE(0x1002, 0x4383),
3507 .driver_data = AZX_DRIVER_ATI | AZX_DCAPS_PRESET_ATI_SB },
3508 /* AMD Hudson */
3509 { PCI_DEVICE(0x1022, 0x780d),
3510 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_SB },
Takashi Iwai87218e92008-02-21 08:13:11 +01003511 /* ATI HDMI */
Takashi Iwai9477c582011-05-25 09:11:37 +02003512 { PCI_DEVICE(0x1002, 0x793b),
3513 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3514 { PCI_DEVICE(0x1002, 0x7919),
3515 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3516 { PCI_DEVICE(0x1002, 0x960f),
3517 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3518 { PCI_DEVICE(0x1002, 0x970f),
3519 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3520 { PCI_DEVICE(0x1002, 0xaa00),
3521 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3522 { PCI_DEVICE(0x1002, 0xaa08),
3523 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3524 { PCI_DEVICE(0x1002, 0xaa10),
3525 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3526 { PCI_DEVICE(0x1002, 0xaa18),
3527 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3528 { PCI_DEVICE(0x1002, 0xaa20),
3529 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3530 { PCI_DEVICE(0x1002, 0xaa28),
3531 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3532 { PCI_DEVICE(0x1002, 0xaa30),
3533 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3534 { PCI_DEVICE(0x1002, 0xaa38),
3535 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3536 { PCI_DEVICE(0x1002, 0xaa40),
3537 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3538 { PCI_DEVICE(0x1002, 0xaa48),
3539 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
Andiry Xu1815b342011-12-14 16:10:27 +08003540 { PCI_DEVICE(0x1002, 0x9902),
3541 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
3542 { PCI_DEVICE(0x1002, 0xaaa0),
3543 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
3544 { PCI_DEVICE(0x1002, 0xaaa8),
3545 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
3546 { PCI_DEVICE(0x1002, 0xaab0),
3547 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
Takashi Iwai87218e92008-02-21 08:13:11 +01003548 /* VIA VT8251/VT8237A */
Takashi Iwai9477c582011-05-25 09:11:37 +02003549 { PCI_DEVICE(0x1106, 0x3288),
3550 .driver_data = AZX_DRIVER_VIA | AZX_DCAPS_POSFIX_VIA },
Annie Liu754fdff2012-06-08 19:18:39 +08003551 /* VIA GFX VT7122/VX900 */
3552 { PCI_DEVICE(0x1106, 0x9170), .driver_data = AZX_DRIVER_GENERIC },
3553 /* VIA GFX VT6122/VX11 */
3554 { PCI_DEVICE(0x1106, 0x9140), .driver_data = AZX_DRIVER_GENERIC },
Takashi Iwai87218e92008-02-21 08:13:11 +01003555 /* SIS966 */
3556 { PCI_DEVICE(0x1039, 0x7502), .driver_data = AZX_DRIVER_SIS },
3557 /* ULI M5461 */
3558 { PCI_DEVICE(0x10b9, 0x5461), .driver_data = AZX_DRIVER_ULI },
3559 /* NVIDIA MCP */
Takashi Iwai0c2fd1bf42009-12-18 16:41:39 +01003560 { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID),
3561 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3562 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02003563 .driver_data = AZX_DRIVER_NVIDIA | AZX_DCAPS_PRESET_NVIDIA },
Kailang Yangf2690022008-05-27 11:44:55 +02003564 /* Teradici */
Takashi Iwai9477c582011-05-25 09:11:37 +02003565 { PCI_DEVICE(0x6549, 0x1200),
3566 .driver_data = AZX_DRIVER_TERA | AZX_DCAPS_NO_64BIT },
Lars R. Damerowf0b3da92012-11-02 13:10:39 -07003567 { PCI_DEVICE(0x6549, 0x2200),
3568 .driver_data = AZX_DRIVER_TERA | AZX_DCAPS_NO_64BIT },
Takashi Iwai4e01f542009-04-16 08:53:34 +02003569 /* Creative X-Fi (CA0110-IBG) */
Takashi Iwaif2a8eca2012-06-11 15:51:54 +02003570 /* CTHDA chips */
3571 { PCI_DEVICE(0x1102, 0x0010),
3572 .driver_data = AZX_DRIVER_CTHDA | AZX_DCAPS_PRESET_CTHDA },
3573 { PCI_DEVICE(0x1102, 0x0012),
3574 .driver_data = AZX_DRIVER_CTHDA | AZX_DCAPS_PRESET_CTHDA },
Takashi Iwai313f6e22009-05-18 12:40:52 +02003575#if !defined(CONFIG_SND_CTXFI) && !defined(CONFIG_SND_CTXFI_MODULE)
3576 /* the following entry conflicts with snd-ctxfi driver,
3577 * as ctxfi driver mutates from HD-audio to native mode with
3578 * a special command sequence.
3579 */
Takashi Iwai4e01f542009-04-16 08:53:34 +02003580 { PCI_DEVICE(PCI_VENDOR_ID_CREATIVE, PCI_ANY_ID),
3581 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3582 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02003583 .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
Takashi Iwai69f9ba92011-11-06 13:49:13 +01003584 AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB },
Takashi Iwai313f6e22009-05-18 12:40:52 +02003585#else
3586 /* this entry seems still valid -- i.e. without emu20kx chip */
Takashi Iwai9477c582011-05-25 09:11:37 +02003587 { PCI_DEVICE(0x1102, 0x0009),
3588 .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
Takashi Iwai69f9ba92011-11-06 13:49:13 +01003589 AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB },
Takashi Iwai313f6e22009-05-18 12:40:52 +02003590#endif
Otavio Salvadore35d4b12010-09-26 23:35:06 -03003591 /* Vortex86MX */
3592 { PCI_DEVICE(0x17f3, 0x3010), .driver_data = AZX_DRIVER_GENERIC },
Bankim Bhavsar0f0714c52011-01-17 15:23:21 +01003593 /* VMware HDAudio */
3594 { PCI_DEVICE(0x15ad, 0x1977), .driver_data = AZX_DRIVER_GENERIC },
Andiry Brienza9176b672009-07-17 11:32:32 +08003595 /* AMD/ATI Generic, PCI class code and Vendor ID for HD Audio */
Yang, Libinc4da29c2008-11-13 11:07:07 +01003596 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_ANY_ID),
3597 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3598 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02003599 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_HDMI },
Andiry Brienza9176b672009-07-17 11:32:32 +08003600 { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_ANY_ID),
3601 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3602 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02003603 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_HDMI },
Linus Torvalds1da177e2005-04-16 15:20:36 -07003604 { 0, }
3605};
3606MODULE_DEVICE_TABLE(pci, azx_ids);
3607
3608/* pci_driver definition */
Takashi Iwaie9f66d92012-04-24 12:25:00 +02003609static struct pci_driver azx_driver = {
Takashi Iwai3733e422011-06-10 16:20:20 +02003610 .name = KBUILD_MODNAME,
Linus Torvalds1da177e2005-04-16 15:20:36 -07003611 .id_table = azx_ids,
3612 .probe = azx_probe,
3613 .remove = __devexit_p(azx_remove),
Takashi Iwai68cb2b52012-07-02 15:20:37 +02003614 .driver = {
3615 .pm = AZX_PM_OPS,
3616 },
Linus Torvalds1da177e2005-04-16 15:20:36 -07003617};
3618
Takashi Iwaie9f66d92012-04-24 12:25:00 +02003619module_pci_driver(azx_driver);