blob: f089fa0aa03dcc9c228c36f44f09615cf084efb5 [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>
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -050050#include <linux/clocksource.h>
51#include <linux/time.h>
Takashi Iwaif4c482a2012-12-04 15:09:23 +010052#include <linux/completion.h>
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -050053
Takashi Iwai27fe48d92011-09-28 17:16:09 +020054#ifdef CONFIG_X86
55/* for snoop control */
56#include <asm/pgtable.h>
57#include <asm/cacheflush.h>
58#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070059#include <sound/core.h>
60#include <sound/initval.h>
Takashi Iwai91219472012-04-26 12:13:25 +020061#include <linux/vgaarb.h>
Takashi Iwaia82d51e2012-04-26 12:23:42 +020062#include <linux/vga_switcheroo.h>
Takashi Iwai4918cda2012-08-09 12:33:28 +020063#include <linux/firmware.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070064#include "hda_codec.h"
65
66
Takashi Iwai5aba4f82008-01-07 15:16:37 +010067static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
68static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
Rusty Russella67ff6a2011-12-15 13:49:36 +103069static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
Takashi Iwai5aba4f82008-01-07 15:16:37 +010070static char *model[SNDRV_CARDS];
Takashi Iwai1dac6692012-09-13 14:59:47 +020071static int position_fix[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = -1};
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +020072static int bdl_pos_adj[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = -1};
Takashi Iwai5aba4f82008-01-07 15:16:37 +010073static int probe_mask[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = -1};
Takashi Iwaid4d9cd032008-12-19 15:19:11 +010074static int probe_only[SNDRV_CARDS];
David Henningsson26a6cb62012-10-09 15:04:21 +020075static int jackpoll_ms[SNDRV_CARDS];
Rusty Russella67ff6a2011-12-15 13:49:36 +103076static bool single_cmd;
Takashi Iwai716238552009-09-28 13:14:04 +020077static int enable_msi = -1;
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +020078#ifdef CONFIG_SND_HDA_PATCH_LOADER
79static char *patch[SNDRV_CARDS];
80#endif
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +010081#ifdef CONFIG_SND_HDA_INPUT_BEEP
Takashi Iwai0920c9b2012-07-03 16:58:48 +020082static bool beep_mode[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] =
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +010083 CONFIG_SND_HDA_INPUT_BEEP_MODE};
84#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070085
Takashi Iwai5aba4f82008-01-07 15:16:37 +010086module_param_array(index, int, NULL, 0444);
Linus Torvalds1da177e2005-04-16 15:20:36 -070087MODULE_PARM_DESC(index, "Index value for Intel HD audio interface.");
Takashi Iwai5aba4f82008-01-07 15:16:37 +010088module_param_array(id, charp, NULL, 0444);
Linus Torvalds1da177e2005-04-16 15:20:36 -070089MODULE_PARM_DESC(id, "ID string for Intel HD audio interface.");
Takashi Iwai5aba4f82008-01-07 15:16:37 +010090module_param_array(enable, bool, NULL, 0444);
91MODULE_PARM_DESC(enable, "Enable Intel HD audio interface.");
92module_param_array(model, charp, NULL, 0444);
Linus Torvalds1da177e2005-04-16 15:20:36 -070093MODULE_PARM_DESC(model, "Use the given board model.");
Takashi Iwai5aba4f82008-01-07 15:16:37 +010094module_param_array(position_fix, int, NULL, 0444);
David Henningsson4cb36312010-09-30 10:12:50 +020095MODULE_PARM_DESC(position_fix, "DMA pointer read method."
Takashi Iwai1dac6692012-09-13 14:59:47 +020096 "(-1 = system default, 0 = auto, 1 = LPIB, 2 = POSBUF, 3 = VIACOMBO, 4 = COMBO).");
Takashi Iwai555e2192008-06-10 17:53:34 +020097module_param_array(bdl_pos_adj, int, NULL, 0644);
98MODULE_PARM_DESC(bdl_pos_adj, "BDL position adjustment offset.");
Takashi Iwai5aba4f82008-01-07 15:16:37 +010099module_param_array(probe_mask, int, NULL, 0444);
Takashi Iwai606ad752005-11-24 16:03:40 +0100100MODULE_PARM_DESC(probe_mask, "Bitmask to probe codecs (default = -1).");
Jaroslav Kysela079e6832010-03-26 11:16:59 +0100101module_param_array(probe_only, int, NULL, 0444);
Takashi Iwaid4d9cd032008-12-19 15:19:11 +0100102MODULE_PARM_DESC(probe_only, "Only probing and no codec initialization.");
David Henningsson26a6cb62012-10-09 15:04:21 +0200103module_param_array(jackpoll_ms, int, NULL, 0444);
104MODULE_PARM_DESC(jackpoll_ms, "Ms between polling for jack events (default = 0, using unsol events only)");
Takashi Iwai27346162006-01-12 18:28:44 +0100105module_param(single_cmd, bool, 0444);
Takashi Iwaid01ce992007-07-27 16:52:19 +0200106MODULE_PARM_DESC(single_cmd, "Use single command to communicate with codecs "
107 "(for debugging only).");
Takashi Iwaiac9ef6c2012-01-20 12:08:44 +0100108module_param(enable_msi, bint, 0444);
Takashi Iwai134a11f2006-11-10 12:08:37 +0100109MODULE_PARM_DESC(enable_msi, "Enable Message Signaled Interrupt (MSI)");
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +0200110#ifdef CONFIG_SND_HDA_PATCH_LOADER
111module_param_array(patch, charp, NULL, 0444);
112MODULE_PARM_DESC(patch, "Patch file for Intel HD audio interface.");
113#endif
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +0100114#ifdef CONFIG_SND_HDA_INPUT_BEEP
Takashi Iwai0920c9b2012-07-03 16:58:48 +0200115module_param_array(beep_mode, bool, NULL, 0444);
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +0100116MODULE_PARM_DESC(beep_mode, "Select HDA Beep registration mode "
Takashi Iwai0920c9b2012-07-03 16:58:48 +0200117 "(0=off, 1=on) (default=1).");
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +0100118#endif
Takashi Iwai606ad752005-11-24 16:03:40 +0100119
Takashi Iwai83012a72012-08-24 18:38:08 +0200120#ifdef CONFIG_PM
Takashi Iwai65fcd412012-08-14 17:13:32 +0200121static int param_set_xint(const char *val, const struct kernel_param *kp);
122static struct kernel_param_ops param_ops_xint = {
123 .set = param_set_xint,
124 .get = param_get_int,
125};
126#define param_check_xint param_check_int
127
Takashi Iwaifee2fba2008-11-27 12:43:28 +0100128static int power_save = CONFIG_SND_HDA_POWER_SAVE_DEFAULT;
Takashi Iwai65fcd412012-08-14 17:13:32 +0200129module_param(power_save, xint, 0644);
Takashi Iwaifee2fba2008-11-27 12:43:28 +0100130MODULE_PARM_DESC(power_save, "Automatic power-saving timeout "
131 "(in second, 0 = disable).");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700132
Takashi Iwaidee1b662007-08-13 16:10:30 +0200133/* reset the HD-audio controller in power save mode.
134 * this may give more power-saving, but will take longer time to
135 * wake up.
136 */
Takashi Iwai8fc24422013-04-04 15:35:24 +0200137static bool power_save_controller = 1;
138module_param(power_save_controller, bool, 0644);
Takashi Iwaidee1b662007-08-13 16:10:30 +0200139MODULE_PARM_DESC(power_save_controller, "Reset controller in power save mode.");
Takashi Iwai83012a72012-08-24 18:38:08 +0200140#endif /* CONFIG_PM */
Takashi Iwaidee1b662007-08-13 16:10:30 +0200141
Takashi Iwai7bfe0592012-01-23 17:53:39 +0100142static int align_buffer_size = -1;
143module_param(align_buffer_size, bint, 0644);
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -0500144MODULE_PARM_DESC(align_buffer_size,
145 "Force buffer and period sizes to be multiple of 128 bytes.");
146
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200147#ifdef CONFIG_X86
148static bool hda_snoop = true;
149module_param_named(snoop, hda_snoop, bool, 0444);
150MODULE_PARM_DESC(snoop, "Enable/disable snooping");
151#define azx_snoop(chip) (chip)->snoop
152#else
153#define hda_snoop true
154#define azx_snoop(chip) true
155#endif
156
157
Linus Torvalds1da177e2005-04-16 15:20:36 -0700158MODULE_LICENSE("GPL");
159MODULE_SUPPORTED_DEVICE("{{Intel, ICH6},"
160 "{Intel, ICH6M},"
Jason Gaston2f1b3812005-05-01 08:58:50 -0700161 "{Intel, ICH7},"
Frederick Lif5d40b32005-05-12 14:55:20 +0200162 "{Intel, ESB2},"
Jason Gastond2981392006-01-10 11:07:37 +0100163 "{Intel, ICH8},"
Jason Gastonf9cc8a82006-11-22 11:53:52 +0100164 "{Intel, ICH9},"
Jason Gastonc34f5a02008-01-29 12:38:49 +0100165 "{Intel, ICH10},"
Seth Heasleyb29c2362008-08-08 15:56:39 -0700166 "{Intel, PCH},"
Seth Heasleyd2f2fcd2010-01-12 17:03:35 -0800167 "{Intel, CPT},"
Seth Heasleyd2edeb72011-04-20 10:59:57 -0700168 "{Intel, PPT},"
Seth Heasley8bc039a2012-01-23 16:24:31 -0800169 "{Intel, LPT},"
James Ralston144dad92012-08-09 09:38:59 -0700170 "{Intel, LPT_LP},"
Wang Xingchaoe926f2c2012-06-13 10:23:51 +0800171 "{Intel, HPT},"
Seth Heasleycea310e2010-09-10 16:29:56 -0700172 "{Intel, PBG},"
Tobin Davis4979bca2008-01-30 08:13:55 +0100173 "{Intel, SCH},"
Takashi Iwaifc20a562005-05-12 15:00:41 +0200174 "{ATI, SB450},"
Felix Kuehling89be83f2006-03-31 12:33:59 +0200175 "{ATI, SB600},"
Felix Kuehling778b6e12006-05-17 11:22:21 +0200176 "{ATI, RS600},"
Felix Kuehling5b15c952006-10-16 12:49:47 +0200177 "{ATI, RS690},"
Wolke Liue6db1112007-04-27 12:20:57 +0200178 "{ATI, RS780},"
179 "{ATI, R600},"
Herton Ronaldo Krzesinski2797f722007-11-05 18:21:56 +0100180 "{ATI, RV630},"
181 "{ATI, RV610},"
Wolke Liu27da1832007-11-16 11:06:30 +0100182 "{ATI, RV670},"
183 "{ATI, RV635},"
184 "{ATI, RV620},"
185 "{ATI, RV770},"
Takashi Iwaifc20a562005-05-12 15:00:41 +0200186 "{VIA, VT8251},"
Takashi Iwai47672312005-08-12 16:44:04 +0200187 "{VIA, VT8237A},"
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200188 "{SiS, SIS966},"
189 "{ULI, M5461}}");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700190MODULE_DESCRIPTION("Intel HDA driver");
191
Takashi Iwai4abc1cc2009-05-19 12:16:46 +0200192#ifdef CONFIG_SND_VERBOSE_PRINTK
193#define SFX /* nop */
194#else
Daniel J Blueman445a51b2012-12-05 23:04:21 +0800195#define SFX "hda-intel "
Takashi Iwai4abc1cc2009-05-19 12:16:46 +0200196#endif
Takashi Iwaicb53c622007-08-10 17:21:45 +0200197
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200198#if defined(CONFIG_PM) && defined(CONFIG_VGA_SWITCHEROO)
199#ifdef CONFIG_SND_HDA_CODEC_HDMI
200#define SUPPORT_VGA_SWITCHEROO
201#endif
202#endif
203
204
Takashi Iwaicb53c622007-08-10 17:21:45 +0200205/*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700206 * registers
207 */
208#define ICH6_REG_GCAP 0x00
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200209#define ICH6_GCAP_64OK (1 << 0) /* 64bit address support */
210#define ICH6_GCAP_NSDO (3 << 1) /* # of serial data out signals */
211#define ICH6_GCAP_BSS (31 << 3) /* # of bidirectional streams */
212#define ICH6_GCAP_ISS (15 << 8) /* # of input streams */
213#define ICH6_GCAP_OSS (15 << 12) /* # of output streams */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700214#define ICH6_REG_VMIN 0x02
215#define ICH6_REG_VMAJ 0x03
216#define ICH6_REG_OUTPAY 0x04
217#define ICH6_REG_INPAY 0x06
218#define ICH6_REG_GCTL 0x08
Takashi Iwai8a933ec2009-05-31 09:28:12 +0200219#define ICH6_GCTL_RESET (1 << 0) /* controller reset */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200220#define ICH6_GCTL_FCNTRL (1 << 1) /* flush control */
221#define ICH6_GCTL_UNSOL (1 << 8) /* accept unsol. response enable */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700222#define ICH6_REG_WAKEEN 0x0c
223#define ICH6_REG_STATESTS 0x0e
224#define ICH6_REG_GSTS 0x10
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200225#define ICH6_GSTS_FSTS (1 << 1) /* flush status */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700226#define ICH6_REG_INTCTL 0x20
227#define ICH6_REG_INTSTS 0x24
Jaroslav Kyselae5463722010-05-11 10:21:46 +0200228#define ICH6_REG_WALLCLK 0x30 /* 24Mhz source */
Takashi Iwai8b0bd222011-06-10 14:56:26 +0200229#define ICH6_REG_OLD_SSYNC 0x34 /* SSYNC for old ICH */
230#define ICH6_REG_SSYNC 0x38
Linus Torvalds1da177e2005-04-16 15:20:36 -0700231#define ICH6_REG_CORBLBASE 0x40
232#define ICH6_REG_CORBUBASE 0x44
233#define ICH6_REG_CORBWP 0x48
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200234#define ICH6_REG_CORBRP 0x4a
235#define ICH6_CORBRP_RST (1 << 15) /* read pointer reset */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700236#define ICH6_REG_CORBCTL 0x4c
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200237#define ICH6_CORBCTL_RUN (1 << 1) /* enable DMA */
238#define ICH6_CORBCTL_CMEIE (1 << 0) /* enable memory error irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700239#define ICH6_REG_CORBSTS 0x4d
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200240#define ICH6_CORBSTS_CMEI (1 << 0) /* memory error indication */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700241#define ICH6_REG_CORBSIZE 0x4e
242
243#define ICH6_REG_RIRBLBASE 0x50
244#define ICH6_REG_RIRBUBASE 0x54
245#define ICH6_REG_RIRBWP 0x58
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200246#define ICH6_RIRBWP_RST (1 << 15) /* write pointer reset */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700247#define ICH6_REG_RINTCNT 0x5a
248#define ICH6_REG_RIRBCTL 0x5c
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200249#define ICH6_RBCTL_IRQ_EN (1 << 0) /* enable IRQ */
250#define ICH6_RBCTL_DMA_EN (1 << 1) /* enable DMA */
251#define ICH6_RBCTL_OVERRUN_EN (1 << 2) /* enable overrun irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700252#define ICH6_REG_RIRBSTS 0x5d
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200253#define ICH6_RBSTS_IRQ (1 << 0) /* response irq */
254#define ICH6_RBSTS_OVERRUN (1 << 2) /* overrun irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700255#define ICH6_REG_RIRBSIZE 0x5e
256
257#define ICH6_REG_IC 0x60
258#define ICH6_REG_IR 0x64
259#define ICH6_REG_IRS 0x68
260#define ICH6_IRS_VALID (1<<1)
261#define ICH6_IRS_BUSY (1<<0)
262
263#define ICH6_REG_DPLBASE 0x70
264#define ICH6_REG_DPUBASE 0x74
265#define ICH6_DPLBASE_ENABLE 0x1 /* Enable position buffer */
266
267/* SD offset: SDI0=0x80, SDI1=0xa0, ... SDO3=0x160 */
268enum { SDI0, SDI1, SDI2, SDI3, SDO0, SDO1, SDO2, SDO3 };
269
270/* stream register offsets from stream base */
271#define ICH6_REG_SD_CTL 0x00
272#define ICH6_REG_SD_STS 0x03
273#define ICH6_REG_SD_LPIB 0x04
274#define ICH6_REG_SD_CBL 0x08
275#define ICH6_REG_SD_LVI 0x0c
276#define ICH6_REG_SD_FIFOW 0x0e
277#define ICH6_REG_SD_FIFOSIZE 0x10
278#define ICH6_REG_SD_FORMAT 0x12
279#define ICH6_REG_SD_BDLPL 0x18
280#define ICH6_REG_SD_BDLPU 0x1c
281
282/* PCI space */
283#define ICH6_PCIREG_TCSEL 0x44
284
285/*
286 * other constants
287 */
288
289/* max number of SDs */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200290/* ICH, ATI and VIA have 4 playback and 4 capture */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200291#define ICH6_NUM_CAPTURE 4
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200292#define ICH6_NUM_PLAYBACK 4
293
294/* ULI has 6 playback and 5 capture */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200295#define ULI_NUM_CAPTURE 5
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200296#define ULI_NUM_PLAYBACK 6
297
Felix Kuehling778b6e12006-05-17 11:22:21 +0200298/* ATI HDMI has 1 playback and 0 capture */
Felix Kuehling778b6e12006-05-17 11:22:21 +0200299#define ATIHDMI_NUM_CAPTURE 0
Felix Kuehling778b6e12006-05-17 11:22:21 +0200300#define ATIHDMI_NUM_PLAYBACK 1
301
Kailang Yangf2690022008-05-27 11:44:55 +0200302/* TERA has 4 playback and 3 capture */
303#define TERA_NUM_CAPTURE 3
304#define TERA_NUM_PLAYBACK 4
305
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200306/* this number is statically defined for simplicity */
307#define MAX_AZX_DEV 16
308
Linus Torvalds1da177e2005-04-16 15:20:36 -0700309/* max number of fragments - we may use more if allocating more pages for BDL */
Takashi Iwai4ce107b2008-02-06 14:50:19 +0100310#define BDL_SIZE 4096
311#define AZX_MAX_BDL_ENTRIES (BDL_SIZE / 16)
312#define AZX_MAX_FRAG 32
Linus Torvalds1da177e2005-04-16 15:20:36 -0700313/* max buffer size - no h/w limit, you can increase as you like */
314#define AZX_MAX_BUF_SIZE (1024*1024*1024)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700315
316/* RIRB int mask: overrun[2], response[0] */
317#define RIRB_INT_RESPONSE 0x01
318#define RIRB_INT_OVERRUN 0x04
319#define RIRB_INT_MASK 0x05
320
Takashi Iwai2f5983f2008-09-03 16:00:44 +0200321/* STATESTS int mask: S3,SD2,SD1,SD0 */
Wei Ni7445dfc2010-03-03 15:05:53 +0800322#define AZX_MAX_CODECS 8
323#define AZX_DEFAULT_CODECS 4
Wu Fengguangdeadff12009-08-01 18:45:16 +0800324#define STATESTS_INT_MASK ((1 << AZX_MAX_CODECS) - 1)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700325
326/* SD_CTL bits */
327#define SD_CTL_STREAM_RESET 0x01 /* stream reset bit */
328#define SD_CTL_DMA_START 0x02 /* stream DMA start bit */
Takashi Iwai850f0e52008-03-18 17:11:05 +0100329#define SD_CTL_STRIPE (3 << 16) /* stripe control */
330#define SD_CTL_TRAFFIC_PRIO (1 << 18) /* traffic priority */
331#define SD_CTL_DIR (1 << 19) /* bi-directional stream */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700332#define SD_CTL_STREAM_TAG_MASK (0xf << 20)
333#define SD_CTL_STREAM_TAG_SHIFT 20
334
335/* SD_CTL and SD_STS */
336#define SD_INT_DESC_ERR 0x10 /* descriptor error interrupt */
337#define SD_INT_FIFO_ERR 0x08 /* FIFO error interrupt */
338#define SD_INT_COMPLETE 0x04 /* completion interrupt */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200339#define SD_INT_MASK (SD_INT_DESC_ERR|SD_INT_FIFO_ERR|\
340 SD_INT_COMPLETE)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700341
342/* SD_STS */
343#define SD_STS_FIFO_READY 0x20 /* FIFO ready */
344
345/* INTCTL and INTSTS */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200346#define ICH6_INT_ALL_STREAM 0xff /* all stream interrupts */
347#define ICH6_INT_CTRL_EN 0x40000000 /* controller interrupt enable bit */
348#define ICH6_INT_GLOBAL_EN 0x80000000 /* global interrupt enable bit */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700349
Linus Torvalds1da177e2005-04-16 15:20:36 -0700350/* below are so far hardcoded - should read registers in future */
351#define ICH6_MAX_CORB_ENTRIES 256
352#define ICH6_MAX_RIRB_ENTRIES 256
353
Takashi Iwaic74db862005-05-12 14:26:27 +0200354/* position fix mode */
355enum {
Takashi Iwai0be3b5d2005-09-05 17:11:40 +0200356 POS_FIX_AUTO,
Takashi Iwaid2e1c972008-06-10 17:53:34 +0200357 POS_FIX_LPIB,
Takashi Iwai0be3b5d2005-09-05 17:11:40 +0200358 POS_FIX_POSBUF,
David Henningsson4cb36312010-09-30 10:12:50 +0200359 POS_FIX_VIACOMBO,
Takashi Iwaia6f2fd52012-02-28 11:58:40 +0100360 POS_FIX_COMBO,
Takashi Iwaic74db862005-05-12 14:26:27 +0200361};
Linus Torvalds1da177e2005-04-16 15:20:36 -0700362
Frederick Lif5d40b32005-05-12 14:55:20 +0200363/* Defines for ATI HD Audio support in SB450 south bridge */
Frederick Lif5d40b32005-05-12 14:55:20 +0200364#define ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR 0x42
365#define ATI_SB450_HDAUDIO_ENABLE_SNOOP 0x02
366
Vinod Gda3fca22005-09-13 18:49:12 +0200367/* Defines for Nvidia HDA support */
368#define NVIDIA_HDA_TRANSREG_ADDR 0x4e
369#define NVIDIA_HDA_ENABLE_COHBITS 0x0f
Peer Chen320dcc32008-08-20 16:43:24 -0700370#define NVIDIA_HDA_ISTRM_COH 0x4d
371#define NVIDIA_HDA_OSTRM_COH 0x4c
372#define NVIDIA_HDA_ENABLE_COHBIT 0x01
Frederick Lif5d40b32005-05-12 14:55:20 +0200373
Takashi Iwai90a5ad52008-02-22 18:36:22 +0100374/* Defines for Intel SCH HDA snoop control */
375#define INTEL_SCH_HDA_DEVC 0x78
376#define INTEL_SCH_HDA_DEVC_NOSNOOP (0x1<<11)
377
Joseph Chan0e153472008-08-26 14:38:03 +0200378/* Define IN stream 0 FIFO size offset in VIA controller */
379#define VIA_IN_STREAM0_FIFO_SIZE_OFFSET 0x90
380/* Define VIA HD Audio Device ID*/
381#define VIA_HDAC_DEVICE_ID 0x3288
382
Yang, Libinc4da29c2008-11-13 11:07:07 +0100383/* HD Audio class code */
384#define PCI_CLASS_MULTIMEDIA_HD_AUDIO 0x0403
Takashi Iwai90a5ad52008-02-22 18:36:22 +0100385
Linus Torvalds1da177e2005-04-16 15:20:36 -0700386/*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700387 */
388
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100389struct azx_dev {
Takashi Iwai4ce107b2008-02-06 14:50:19 +0100390 struct snd_dma_buffer bdl; /* BDL buffer */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200391 u32 *posbuf; /* position buffer pointer */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700392
Takashi Iwaid01ce992007-07-27 16:52:19 +0200393 unsigned int bufsize; /* size of the play buffer in bytes */
Takashi Iwai9ad593f2008-05-16 12:34:47 +0200394 unsigned int period_bytes; /* size of the period in bytes */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200395 unsigned int frags; /* number for period in the play buffer */
396 unsigned int fifo_size; /* FIFO size */
Jaroslav Kyselae5463722010-05-11 10:21:46 +0200397 unsigned long start_wallclk; /* start + minimum wallclk */
398 unsigned long period_wallclk; /* wallclk for period */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700399
Takashi Iwaid01ce992007-07-27 16:52:19 +0200400 void __iomem *sd_addr; /* stream descriptor pointer */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700401
Takashi Iwaid01ce992007-07-27 16:52:19 +0200402 u32 sd_int_sta_mask; /* stream int status mask */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700403
404 /* pcm support */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200405 struct snd_pcm_substream *substream; /* assigned substream,
406 * set in PCM open
407 */
408 unsigned int format_val; /* format value to be set in the
409 * controller and the codec
410 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700411 unsigned char stream_tag; /* assigned stream */
412 unsigned char index; /* stream index */
Takashi Iwaid5cf9912011-10-06 10:07:58 +0200413 int assigned_key; /* last device# key assigned to */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700414
Pavel Machek927fc862006-08-31 17:03:43 +0200415 unsigned int opened :1;
416 unsigned int running :1;
Takashi Iwai675f25d2008-06-10 17:53:20 +0200417 unsigned int irq_pending :1;
Takashi Iwaieb49faa2013-03-15 09:19:11 +0100418 unsigned int prepared:1;
419 unsigned int locked:1;
Joseph Chan0e153472008-08-26 14:38:03 +0200420 /*
421 * For VIA:
422 * A flag to ensure DMA position is 0
423 * when link position is not greater than FIFO size
424 */
425 unsigned int insufficient :1;
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200426 unsigned int wc_marked:1;
Takashi Iwai915bf292012-09-11 15:19:10 +0200427 unsigned int no_period_wakeup:1;
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -0500428
429 struct timecounter azx_tc;
430 struct cyclecounter azx_cc;
Takashi Iwaieb49faa2013-03-15 09:19:11 +0100431
432#ifdef CONFIG_SND_HDA_DSP_LOADER
433 struct mutex dsp_mutex;
434#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700435};
436
Takashi Iwaieb49faa2013-03-15 09:19:11 +0100437/* DSP lock helpers */
438#ifdef CONFIG_SND_HDA_DSP_LOADER
439#define dsp_lock_init(dev) mutex_init(&(dev)->dsp_mutex)
440#define dsp_lock(dev) mutex_lock(&(dev)->dsp_mutex)
441#define dsp_unlock(dev) mutex_unlock(&(dev)->dsp_mutex)
442#define dsp_is_locked(dev) ((dev)->locked)
443#else
444#define dsp_lock_init(dev) do {} while (0)
445#define dsp_lock(dev) do {} while (0)
446#define dsp_unlock(dev) do {} while (0)
447#define dsp_is_locked(dev) 0
448#endif
449
Linus Torvalds1da177e2005-04-16 15:20:36 -0700450/* CORB/RIRB */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100451struct azx_rb {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700452 u32 *buf; /* CORB/RIRB buffer
453 * Each CORB entry is 4byte, RIRB is 8byte
454 */
455 dma_addr_t addr; /* physical address of CORB/RIRB buffer */
456 /* for RIRB */
457 unsigned short rp, wp; /* read/write pointers */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800458 int cmds[AZX_MAX_CODECS]; /* number of pending requests */
459 u32 res[AZX_MAX_CODECS]; /* last read value */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700460};
461
Takashi Iwai01b65bf2011-11-24 14:31:46 +0100462struct azx_pcm {
463 struct azx *chip;
464 struct snd_pcm *pcm;
465 struct hda_codec *codec;
466 struct hda_pcm_stream *hinfo[2];
467 struct list_head list;
468};
469
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100470struct azx {
471 struct snd_card *card;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700472 struct pci_dev *pci;
Takashi Iwai555e2192008-06-10 17:53:34 +0200473 int dev_index;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700474
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200475 /* chip type specific */
476 int driver_type;
Takashi Iwai9477c582011-05-25 09:11:37 +0200477 unsigned int driver_caps;
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200478 int playback_streams;
479 int playback_index_offset;
480 int capture_streams;
481 int capture_index_offset;
482 int num_streams;
483
Linus Torvalds1da177e2005-04-16 15:20:36 -0700484 /* pci resources */
485 unsigned long addr;
486 void __iomem *remap_addr;
487 int irq;
488
489 /* locks */
490 spinlock_t reg_lock;
Ingo Molnar62932df2006-01-16 16:34:20 +0100491 struct mutex open_mutex;
Takashi Iwaif4c482a2012-12-04 15:09:23 +0100492 struct completion probe_wait;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700493
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200494 /* streams (x num_streams) */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100495 struct azx_dev *azx_dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700496
497 /* PCM */
Takashi Iwai01b65bf2011-11-24 14:31:46 +0100498 struct list_head pcm_list; /* azx_pcm list */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700499
500 /* HD codec */
501 unsigned short codec_mask;
Takashi Iwaif1eaaee2009-02-13 08:16:55 +0100502 int codec_probe_mask; /* copied from probe_mask option */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700503 struct hda_bus *bus;
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +0100504 unsigned int beep_mode;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700505
506 /* CORB/RIRB */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100507 struct azx_rb corb;
508 struct azx_rb rirb;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700509
Takashi Iwai4ce107b2008-02-06 14:50:19 +0100510 /* CORB/RIRB and position buffers */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700511 struct snd_dma_buffer rb;
512 struct snd_dma_buffer posbuf;
Takashi Iwaic74db862005-05-12 14:26:27 +0200513
Takashi Iwai4918cda2012-08-09 12:33:28 +0200514#ifdef CONFIG_SND_HDA_PATCH_LOADER
515 const struct firmware *fw;
516#endif
517
Takashi Iwaic74db862005-05-12 14:26:27 +0200518 /* flags */
Shahin Ghazinouribeaffc32010-05-11 08:19:55 +0200519 int position_fix[2]; /* for both playback/capture streams */
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200520 int poll_count;
Takashi Iwaicb53c622007-08-10 17:21:45 +0200521 unsigned int running :1;
Pavel Machek927fc862006-08-31 17:03:43 +0200522 unsigned int initialized :1;
523 unsigned int single_cmd :1;
524 unsigned int polling_mode :1;
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200525 unsigned int msi :1;
Takashi Iwaia6a950a2008-06-10 17:53:35 +0200526 unsigned int irq_pending_warned :1;
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +0100527 unsigned int probing :1; /* codec probing phase */
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200528 unsigned int snoop:1;
Takashi Iwai52409aa2012-01-23 17:10:24 +0100529 unsigned int align_buffer_size:1;
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200530 unsigned int region_requested:1;
531
532 /* VGA-switcheroo setup */
533 unsigned int use_vga_switcheroo:1;
Takashi Iwai128960a2012-10-12 17:28:18 +0200534 unsigned int vga_switcheroo_registered:1;
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200535 unsigned int init_failed:1; /* delayed init failed */
536 unsigned int disabled:1; /* disabled by VGA-switcher */
Takashi Iwai43bbb6c2007-07-06 20:22:05 +0200537
538 /* for debugging */
Wu Fengguangfeb27342009-08-01 19:17:14 +0800539 unsigned int last_cmd[AZX_MAX_CODECS];
Takashi Iwai9ad593f2008-05-16 12:34:47 +0200540
541 /* for pending irqs */
542 struct work_struct irq_pending_work;
Takashi Iwai0cbf0092008-10-29 16:18:25 +0100543
544 /* reboot notifier (for mysterious hangup problem at power-down) */
545 struct notifier_block reboot_notifier;
Takashi Iwai65fcd412012-08-14 17:13:32 +0200546
547 /* card list (for power_save trigger) */
548 struct list_head list;
Takashi Iwaieb49faa2013-03-15 09:19:11 +0100549
550#ifdef CONFIG_SND_HDA_DSP_LOADER
551 struct azx_dev saved_azx_dev;
552#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700553};
554
Takashi Iwai1a8506d2012-10-16 15:10:08 +0200555#define CREATE_TRACE_POINTS
556#include "hda_intel_trace.h"
557
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200558/* driver types */
559enum {
560 AZX_DRIVER_ICH,
Seth Heasley32679f92010-02-22 17:31:09 -0800561 AZX_DRIVER_PCH,
Tobin Davis4979bca2008-01-30 08:13:55 +0100562 AZX_DRIVER_SCH,
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200563 AZX_DRIVER_ATI,
Felix Kuehling778b6e12006-05-17 11:22:21 +0200564 AZX_DRIVER_ATIHDMI,
Andiry Xu1815b342011-12-14 16:10:27 +0800565 AZX_DRIVER_ATIHDMI_NS,
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200566 AZX_DRIVER_VIA,
567 AZX_DRIVER_SIS,
568 AZX_DRIVER_ULI,
Vinod Gda3fca22005-09-13 18:49:12 +0200569 AZX_DRIVER_NVIDIA,
Kailang Yangf2690022008-05-27 11:44:55 +0200570 AZX_DRIVER_TERA,
Takashi Iwai14d34f12010-10-21 09:03:25 +0200571 AZX_DRIVER_CTX,
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200572 AZX_DRIVER_CTHDA,
Yang, Libinc4da29c2008-11-13 11:07:07 +0100573 AZX_DRIVER_GENERIC,
Takashi Iwai2f5983f2008-09-03 16:00:44 +0200574 AZX_NUM_DRIVERS, /* keep this as last entry */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200575};
576
Takashi Iwai9477c582011-05-25 09:11:37 +0200577/* driver quirks (capabilities) */
578/* bits 0-7 are used for indicating driver type */
579#define AZX_DCAPS_NO_TCSEL (1 << 8) /* No Intel TCSEL bit */
580#define AZX_DCAPS_NO_MSI (1 << 9) /* No MSI support */
581#define AZX_DCAPS_ATI_SNOOP (1 << 10) /* ATI snoop enable */
582#define AZX_DCAPS_NVIDIA_SNOOP (1 << 11) /* Nvidia snoop enable */
583#define AZX_DCAPS_SCH_SNOOP (1 << 12) /* SCH/PCH snoop enable */
584#define AZX_DCAPS_RIRB_DELAY (1 << 13) /* Long delay in read loop */
585#define AZX_DCAPS_RIRB_PRE_DELAY (1 << 14) /* Put a delay before read */
586#define AZX_DCAPS_CTX_WORKAROUND (1 << 15) /* X-Fi workaround */
587#define AZX_DCAPS_POSFIX_LPIB (1 << 16) /* Use LPIB as default */
588#define AZX_DCAPS_POSFIX_VIA (1 << 17) /* Use VIACOMBO as default */
589#define AZX_DCAPS_NO_64BIT (1 << 18) /* No 64bit address */
590#define AZX_DCAPS_SYNC_WRITE (1 << 19) /* sync each cmd write */
Takashi Iwai8b0bd222011-06-10 14:56:26 +0200591#define AZX_DCAPS_OLD_SSYNC (1 << 20) /* Old SSYNC reg for ICH */
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -0500592#define AZX_DCAPS_BUFSIZE (1 << 21) /* no buffer size alignment */
Takashi Iwai7bfe0592012-01-23 17:53:39 +0100593#define AZX_DCAPS_ALIGN_BUFSIZE (1 << 22) /* buffer size alignment */
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200594#define AZX_DCAPS_4K_BDLE_BOUNDARY (1 << 23) /* BDLE in 4k boundary */
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -0500595#define AZX_DCAPS_COUNT_LPIB_DELAY (1 << 25) /* Take LPIB as delay */
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +0100596#define AZX_DCAPS_PM_RUNTIME (1 << 26) /* runtime PM support */
597
598/* quirks for Intel PCH */
Takashi Iwaid7dab4d2013-01-08 13:51:30 +0100599#define AZX_DCAPS_INTEL_PCH_NOPM \
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +0100600 (AZX_DCAPS_SCH_SNOOP | AZX_DCAPS_BUFSIZE | \
Takashi Iwaid7dab4d2013-01-08 13:51:30 +0100601 AZX_DCAPS_COUNT_LPIB_DELAY)
602
603#define AZX_DCAPS_INTEL_PCH \
604 (AZX_DCAPS_INTEL_PCH_NOPM | AZX_DCAPS_PM_RUNTIME)
Takashi Iwai9477c582011-05-25 09:11:37 +0200605
606/* quirks for ATI SB / AMD Hudson */
607#define AZX_DCAPS_PRESET_ATI_SB \
608 (AZX_DCAPS_ATI_SNOOP | AZX_DCAPS_NO_TCSEL | \
609 AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB)
610
611/* quirks for ATI/AMD HDMI */
612#define AZX_DCAPS_PRESET_ATI_HDMI \
613 (AZX_DCAPS_NO_TCSEL | AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB)
614
615/* quirks for Nvidia */
616#define AZX_DCAPS_PRESET_NVIDIA \
Takashi Iwai7bfe0592012-01-23 17:53:39 +0100617 (AZX_DCAPS_NVIDIA_SNOOP | AZX_DCAPS_RIRB_DELAY | AZX_DCAPS_NO_MSI |\
Mike Travis49d9e772013-05-01 14:04:08 -0500618 AZX_DCAPS_ALIGN_BUFSIZE | AZX_DCAPS_NO_64BIT)
Takashi Iwai9477c582011-05-25 09:11:37 +0200619
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200620#define AZX_DCAPS_PRESET_CTHDA \
621 (AZX_DCAPS_NO_MSI | AZX_DCAPS_POSFIX_LPIB | AZX_DCAPS_4K_BDLE_BOUNDARY)
622
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200623/*
624 * VGA-switcher support
625 */
626#ifdef SUPPORT_VGA_SWITCHEROO
Takashi Iwai5cb543d2012-08-09 13:49:23 +0200627#define use_vga_switcheroo(chip) ((chip)->use_vga_switcheroo)
628#else
629#define use_vga_switcheroo(chip) 0
630#endif
631
Takashi Iwai48c8b0e2012-12-07 07:40:35 +0100632static char *driver_short_names[] = {
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200633 [AZX_DRIVER_ICH] = "HDA Intel",
Seth Heasley32679f92010-02-22 17:31:09 -0800634 [AZX_DRIVER_PCH] = "HDA Intel PCH",
Tobin Davis4979bca2008-01-30 08:13:55 +0100635 [AZX_DRIVER_SCH] = "HDA Intel MID",
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200636 [AZX_DRIVER_ATI] = "HDA ATI SB",
Felix Kuehling778b6e12006-05-17 11:22:21 +0200637 [AZX_DRIVER_ATIHDMI] = "HDA ATI HDMI",
Andiry Xu1815b342011-12-14 16:10:27 +0800638 [AZX_DRIVER_ATIHDMI_NS] = "HDA ATI HDMI",
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200639 [AZX_DRIVER_VIA] = "HDA VIA VT82xx",
640 [AZX_DRIVER_SIS] = "HDA SIS966",
Vinod Gda3fca22005-09-13 18:49:12 +0200641 [AZX_DRIVER_ULI] = "HDA ULI M5461",
642 [AZX_DRIVER_NVIDIA] = "HDA NVidia",
Kailang Yangf2690022008-05-27 11:44:55 +0200643 [AZX_DRIVER_TERA] = "HDA Teradici",
Takashi Iwai14d34f12010-10-21 09:03:25 +0200644 [AZX_DRIVER_CTX] = "HDA Creative",
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200645 [AZX_DRIVER_CTHDA] = "HDA Creative",
Yang, Libinc4da29c2008-11-13 11:07:07 +0100646 [AZX_DRIVER_GENERIC] = "HD-Audio Generic",
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200647};
648
Linus Torvalds1da177e2005-04-16 15:20:36 -0700649/*
650 * macros for easy use
651 */
652#define azx_writel(chip,reg,value) \
653 writel(value, (chip)->remap_addr + ICH6_REG_##reg)
654#define azx_readl(chip,reg) \
655 readl((chip)->remap_addr + ICH6_REG_##reg)
656#define azx_writew(chip,reg,value) \
657 writew(value, (chip)->remap_addr + ICH6_REG_##reg)
658#define azx_readw(chip,reg) \
659 readw((chip)->remap_addr + ICH6_REG_##reg)
660#define azx_writeb(chip,reg,value) \
661 writeb(value, (chip)->remap_addr + ICH6_REG_##reg)
662#define azx_readb(chip,reg) \
663 readb((chip)->remap_addr + ICH6_REG_##reg)
664
665#define azx_sd_writel(dev,reg,value) \
666 writel(value, (dev)->sd_addr + ICH6_REG_##reg)
667#define azx_sd_readl(dev,reg) \
668 readl((dev)->sd_addr + ICH6_REG_##reg)
669#define azx_sd_writew(dev,reg,value) \
670 writew(value, (dev)->sd_addr + ICH6_REG_##reg)
671#define azx_sd_readw(dev,reg) \
672 readw((dev)->sd_addr + ICH6_REG_##reg)
673#define azx_sd_writeb(dev,reg,value) \
674 writeb(value, (dev)->sd_addr + ICH6_REG_##reg)
675#define azx_sd_readb(dev,reg) \
676 readb((dev)->sd_addr + ICH6_REG_##reg)
677
678/* for pcm support */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100679#define get_azx_dev(substream) (substream->runtime->private_data)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700680
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200681#ifdef CONFIG_X86
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100682static void __mark_pages_wc(struct azx *chip, struct snd_dma_buffer *dmab, bool on)
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200683{
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100684 int pages;
685
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200686 if (azx_snoop(chip))
687 return;
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100688 if (!dmab || !dmab->area || !dmab->bytes)
689 return;
690
691#ifdef CONFIG_SND_DMA_SGBUF
692 if (dmab->dev.type == SNDRV_DMA_TYPE_DEV_SG) {
693 struct snd_sg_buf *sgbuf = dmab->private_data;
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200694 if (on)
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100695 set_pages_array_wc(sgbuf->page_table, sgbuf->pages);
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200696 else
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100697 set_pages_array_wb(sgbuf->page_table, sgbuf->pages);
698 return;
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200699 }
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100700#endif
701
702 pages = (dmab->bytes + PAGE_SIZE - 1) >> PAGE_SHIFT;
703 if (on)
704 set_memory_wc((unsigned long)dmab->area, pages);
705 else
706 set_memory_wb((unsigned long)dmab->area, pages);
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200707}
708
709static inline void mark_pages_wc(struct azx *chip, struct snd_dma_buffer *buf,
710 bool on)
711{
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100712 __mark_pages_wc(chip, buf, on);
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200713}
714static inline void mark_runtime_wc(struct azx *chip, struct azx_dev *azx_dev,
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100715 struct snd_pcm_substream *substream, bool on)
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200716{
717 if (azx_dev->wc_marked != on) {
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100718 __mark_pages_wc(chip, snd_pcm_get_dma_buf(substream), on);
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200719 azx_dev->wc_marked = on;
720 }
721}
722#else
723/* NOP for other archs */
724static inline void mark_pages_wc(struct azx *chip, struct snd_dma_buffer *buf,
725 bool on)
726{
727}
728static inline void mark_runtime_wc(struct azx *chip, struct azx_dev *azx_dev,
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100729 struct snd_pcm_substream *substream, bool on)
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200730{
731}
732#endif
733
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200734static int azx_acquire_irq(struct azx *chip, int do_disconnect);
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200735static int azx_send_cmd(struct hda_bus *bus, unsigned int val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700736/*
737 * Interface for HD codec
738 */
739
Linus Torvalds1da177e2005-04-16 15:20:36 -0700740/*
741 * CORB / RIRB interface
742 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100743static int azx_alloc_cmd_io(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700744{
745 int err;
746
747 /* single page (at least 4096 bytes) must suffice for both ringbuffes */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200748 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
749 snd_dma_pci_data(chip->pci),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700750 PAGE_SIZE, &chip->rb);
751 if (err < 0) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +0800752 snd_printk(KERN_ERR SFX "%s: cannot allocate CORB/RIRB\n", pci_name(chip->pci));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700753 return err;
754 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200755 mark_pages_wc(chip, &chip->rb, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700756 return 0;
757}
758
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100759static void azx_init_cmd_io(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700760{
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800761 spin_lock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700762 /* CORB set up */
763 chip->corb.addr = chip->rb.addr;
764 chip->corb.buf = (u32 *)chip->rb.area;
765 azx_writel(chip, CORBLBASE, (u32)chip->corb.addr);
Takashi Iwai766979e2008-06-13 20:53:56 +0200766 azx_writel(chip, CORBUBASE, upper_32_bits(chip->corb.addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700767
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200768 /* set the corb size to 256 entries (ULI requires explicitly) */
769 azx_writeb(chip, CORBSIZE, 0x02);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700770 /* set the corb write pointer to 0 */
771 azx_writew(chip, CORBWP, 0);
772 /* reset the corb hw read pointer */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200773 azx_writew(chip, CORBRP, ICH6_CORBRP_RST);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700774 /* enable corb dma */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200775 azx_writeb(chip, CORBCTL, ICH6_CORBCTL_RUN);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700776
777 /* RIRB set up */
778 chip->rirb.addr = chip->rb.addr + 2048;
779 chip->rirb.buf = (u32 *)(chip->rb.area + 2048);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800780 chip->rirb.wp = chip->rirb.rp = 0;
781 memset(chip->rirb.cmds, 0, sizeof(chip->rirb.cmds));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700782 azx_writel(chip, RIRBLBASE, (u32)chip->rirb.addr);
Takashi Iwai766979e2008-06-13 20:53:56 +0200783 azx_writel(chip, RIRBUBASE, upper_32_bits(chip->rirb.addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700784
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200785 /* set the rirb size to 256 entries (ULI requires explicitly) */
786 azx_writeb(chip, RIRBSIZE, 0x02);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700787 /* reset the rirb hw write pointer */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200788 azx_writew(chip, RIRBWP, ICH6_RIRBWP_RST);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700789 /* set N=1, get RIRB response interrupt for new entry */
Takashi Iwai9477c582011-05-25 09:11:37 +0200790 if (chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND)
Takashi Iwai14d34f12010-10-21 09:03:25 +0200791 azx_writew(chip, RINTCNT, 0xc0);
792 else
793 azx_writew(chip, RINTCNT, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700794 /* enable rirb dma and response irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700795 azx_writeb(chip, RIRBCTL, ICH6_RBCTL_DMA_EN | ICH6_RBCTL_IRQ_EN);
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800796 spin_unlock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700797}
798
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100799static void azx_free_cmd_io(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700800{
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800801 spin_lock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700802 /* disable ringbuffer DMAs */
803 azx_writeb(chip, RIRBCTL, 0);
804 azx_writeb(chip, CORBCTL, 0);
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800805 spin_unlock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700806}
807
Wu Fengguangdeadff12009-08-01 18:45:16 +0800808static unsigned int azx_command_addr(u32 cmd)
809{
810 unsigned int addr = cmd >> 28;
811
812 if (addr >= AZX_MAX_CODECS) {
813 snd_BUG();
814 addr = 0;
815 }
816
817 return addr;
818}
819
820static unsigned int azx_response_addr(u32 res)
821{
822 unsigned int addr = res & 0xf;
823
824 if (addr >= AZX_MAX_CODECS) {
825 snd_BUG();
826 addr = 0;
827 }
828
829 return addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700830}
831
832/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100833static int azx_corb_send_cmd(struct hda_bus *bus, u32 val)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700834{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100835 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800836 unsigned int addr = azx_command_addr(val);
Takashi Iwai3bcce5c2012-12-20 11:17:17 +0100837 unsigned int wp, rp;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700838
Wu Fengguangc32649f2009-08-01 18:48:12 +0800839 spin_lock_irq(&chip->reg_lock);
840
Linus Torvalds1da177e2005-04-16 15:20:36 -0700841 /* add command to corb */
Takashi Iwaicc5ede32012-12-12 11:10:49 +0100842 wp = azx_readw(chip, CORBWP);
843 if (wp == 0xffff) {
844 /* something wrong, controller likely turned to D3 */
845 spin_unlock_irq(&chip->reg_lock);
Takashi Iwai3bcce5c2012-12-20 11:17:17 +0100846 return -EIO;
Takashi Iwaicc5ede32012-12-12 11:10:49 +0100847 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700848 wp++;
849 wp %= ICH6_MAX_CORB_ENTRIES;
850
Takashi Iwai3bcce5c2012-12-20 11:17:17 +0100851 rp = azx_readw(chip, CORBRP);
852 if (wp == rp) {
853 /* oops, it's full */
854 spin_unlock_irq(&chip->reg_lock);
855 return -EAGAIN;
856 }
857
Wu Fengguangdeadff12009-08-01 18:45:16 +0800858 chip->rirb.cmds[addr]++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700859 chip->corb.buf[wp] = cpu_to_le32(val);
860 azx_writel(chip, CORBWP, wp);
Wu Fengguangc32649f2009-08-01 18:48:12 +0800861
Linus Torvalds1da177e2005-04-16 15:20:36 -0700862 spin_unlock_irq(&chip->reg_lock);
863
864 return 0;
865}
866
867#define ICH6_RIRB_EX_UNSOL_EV (1<<4)
868
869/* retrieve RIRB entry - called from interrupt handler */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100870static void azx_update_rirb(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700871{
872 unsigned int rp, wp;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800873 unsigned int addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700874 u32 res, res_ex;
875
Takashi Iwaicc5ede32012-12-12 11:10:49 +0100876 wp = azx_readw(chip, RIRBWP);
877 if (wp == 0xffff) {
878 /* something wrong, controller likely turned to D3 */
879 return;
880 }
881
Linus Torvalds1da177e2005-04-16 15:20:36 -0700882 if (wp == chip->rirb.wp)
883 return;
884 chip->rirb.wp = wp;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800885
Linus Torvalds1da177e2005-04-16 15:20:36 -0700886 while (chip->rirb.rp != wp) {
887 chip->rirb.rp++;
888 chip->rirb.rp %= ICH6_MAX_RIRB_ENTRIES;
889
890 rp = chip->rirb.rp << 1; /* an RIRB entry is 8-bytes */
891 res_ex = le32_to_cpu(chip->rirb.buf[rp + 1]);
892 res = le32_to_cpu(chip->rirb.buf[rp]);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800893 addr = azx_response_addr(res_ex);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700894 if (res_ex & ICH6_RIRB_EX_UNSOL_EV)
895 snd_hda_queue_unsol_event(chip->bus, res, res_ex);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800896 else if (chip->rirb.cmds[addr]) {
897 chip->rirb.res[addr] = res;
Takashi Iwai2add9b92008-03-18 09:47:06 +0100898 smp_wmb();
Wu Fengguangdeadff12009-08-01 18:45:16 +0800899 chip->rirb.cmds[addr]--;
Wu Fengguange310bb02009-08-01 19:18:45 +0800900 } else
Takashi Iwai9e3d3522012-10-17 08:39:37 +0200901 snd_printk(KERN_ERR SFX "%s: spurious response %#x:%#x, "
Wu Fengguange310bb02009-08-01 19:18:45 +0800902 "last cmd=%#08x\n",
Takashi Iwai9e3d3522012-10-17 08:39:37 +0200903 pci_name(chip->pci),
Wu Fengguange310bb02009-08-01 19:18:45 +0800904 res, res_ex,
905 chip->last_cmd[addr]);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700906 }
907}
908
909/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800910static unsigned int azx_rirb_get_response(struct hda_bus *bus,
911 unsigned int addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700912{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100913 struct azx *chip = bus->private_data;
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200914 unsigned long timeout;
David Henningsson32cf4022012-05-04 11:05:55 +0200915 unsigned long loopcounter;
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200916 int do_poll = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700917
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200918 again:
919 timeout = jiffies + msecs_to_jiffies(1000);
David Henningsson32cf4022012-05-04 11:05:55 +0200920
921 for (loopcounter = 0;; loopcounter++) {
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200922 if (chip->polling_mode || do_poll) {
Takashi Iwaie96224a2006-08-21 17:57:44 +0200923 spin_lock_irq(&chip->reg_lock);
924 azx_update_rirb(chip);
925 spin_unlock_irq(&chip->reg_lock);
926 }
Wu Fengguangdeadff12009-08-01 18:45:16 +0800927 if (!chip->rirb.cmds[addr]) {
Takashi Iwai2add9b92008-03-18 09:47:06 +0100928 smp_rmb();
Takashi Iwaib6132912009-03-24 07:36:09 +0100929 bus->rirb_error = 0;
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200930
931 if (!do_poll)
932 chip->poll_count = 0;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800933 return chip->rirb.res[addr]; /* the last value */
Takashi Iwai2add9b92008-03-18 09:47:06 +0100934 }
Takashi Iwai28a0d9d2008-01-18 15:32:32 +0100935 if (time_after(jiffies, timeout))
936 break;
David Henningsson32cf4022012-05-04 11:05:55 +0200937 if (bus->needs_damn_long_delay || loopcounter > 3000)
Takashi Iwai52987652008-01-16 16:09:47 +0100938 msleep(2); /* temporary workaround */
939 else {
940 udelay(10);
941 cond_resched();
942 }
Takashi Iwai28a0d9d2008-01-18 15:32:32 +0100943 }
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200944
Takashi Iwai63e51fd2013-06-06 14:20:19 +0200945 if (!bus->no_response_fallback)
946 return -1;
947
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200948 if (!chip->polling_mode && chip->poll_count < 2) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +0800949 snd_printdd(SFX "%s: azx_get_response timeout, "
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200950 "polling the codec once: last cmd=0x%08x\n",
Daniel J Blueman445a51b2012-12-05 23:04:21 +0800951 pci_name(chip->pci), chip->last_cmd[addr]);
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200952 do_poll = 1;
953 chip->poll_count++;
954 goto again;
955 }
956
957
Takashi Iwai23c4a882009-10-30 13:21:49 +0100958 if (!chip->polling_mode) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +0800959 snd_printk(KERN_WARNING SFX "%s: azx_get_response timeout, "
Takashi Iwai23c4a882009-10-30 13:21:49 +0100960 "switching to polling mode: last cmd=0x%08x\n",
Daniel J Blueman445a51b2012-12-05 23:04:21 +0800961 pci_name(chip->pci), chip->last_cmd[addr]);
Takashi Iwai23c4a882009-10-30 13:21:49 +0100962 chip->polling_mode = 1;
963 goto again;
964 }
965
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200966 if (chip->msi) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +0800967 snd_printk(KERN_WARNING SFX "%s: No response from codec, "
Wu Fengguangfeb27342009-08-01 19:17:14 +0800968 "disabling MSI: last cmd=0x%08x\n",
Daniel J Blueman445a51b2012-12-05 23:04:21 +0800969 pci_name(chip->pci), chip->last_cmd[addr]);
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200970 free_irq(chip->irq, chip);
971 chip->irq = -1;
972 pci_disable_msi(chip->pci);
973 chip->msi = 0;
Takashi Iwaib6132912009-03-24 07:36:09 +0100974 if (azx_acquire_irq(chip, 1) < 0) {
975 bus->rirb_error = 1;
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200976 return -1;
Takashi Iwaib6132912009-03-24 07:36:09 +0100977 }
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200978 goto again;
979 }
980
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +0100981 if (chip->probing) {
982 /* If this critical timeout happens during the codec probing
983 * phase, this is likely an access to a non-existing codec
984 * slot. Better to return an error and reset the system.
985 */
986 return -1;
987 }
988
Takashi Iwai8dd78332009-06-02 01:16:07 +0200989 /* a fatal communication error; need either to reset or to fallback
990 * to the single_cmd mode
991 */
Takashi Iwaib6132912009-03-24 07:36:09 +0100992 bus->rirb_error = 1;
Takashi Iwaib20f3b82009-06-02 01:20:22 +0200993 if (bus->allow_bus_reset && !bus->response_reset && !bus->in_reset) {
Takashi Iwai8dd78332009-06-02 01:16:07 +0200994 bus->response_reset = 1;
995 return -1; /* give a chance to retry */
996 }
997
998 snd_printk(KERN_ERR "hda_intel: azx_get_response timeout, "
999 "switching to single_cmd mode: last cmd=0x%08x\n",
Wu Fengguangfeb27342009-08-01 19:17:14 +08001000 chip->last_cmd[addr]);
Takashi Iwai8dd78332009-06-02 01:16:07 +02001001 chip->single_cmd = 1;
1002 bus->response_reset = 0;
Takashi Iwai1a696972009-11-07 09:49:04 +01001003 /* release CORB/RIRB */
Takashi Iwai4fcd3922009-05-25 18:34:52 +02001004 azx_free_cmd_io(chip);
Takashi Iwai1a696972009-11-07 09:49:04 +01001005 /* disable unsolicited responses */
1006 azx_writel(chip, GCTL, azx_readl(chip, GCTL) & ~ICH6_GCTL_UNSOL);
Takashi Iwai5c79b1f2006-09-21 13:34:13 +02001007 return -1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001008}
1009
Linus Torvalds1da177e2005-04-16 15:20:36 -07001010/*
1011 * Use the single immediate command instead of CORB/RIRB for simplicity
1012 *
1013 * Note: according to Intel, this is not preferred use. The command was
1014 * intended for the BIOS only, and may get confused with unsolicited
1015 * responses. So, we shouldn't use it for normal operation from the
1016 * driver.
1017 * I left the codes, however, for debugging/testing purposes.
1018 */
1019
Takashi Iwaib05a7d42009-05-28 11:59:12 +02001020/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +08001021static int azx_single_wait_for_response(struct azx *chip, unsigned int addr)
Takashi Iwaib05a7d42009-05-28 11:59:12 +02001022{
1023 int timeout = 50;
1024
1025 while (timeout--) {
1026 /* check IRV busy bit */
1027 if (azx_readw(chip, IRS) & ICH6_IRS_VALID) {
1028 /* reuse rirb.res as the response return value */
Wu Fengguangdeadff12009-08-01 18:45:16 +08001029 chip->rirb.res[addr] = azx_readl(chip, IR);
Takashi Iwaib05a7d42009-05-28 11:59:12 +02001030 return 0;
1031 }
1032 udelay(1);
1033 }
1034 if (printk_ratelimit())
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001035 snd_printd(SFX "%s: get_response timeout: IRS=0x%x\n",
1036 pci_name(chip->pci), azx_readw(chip, IRS));
Wu Fengguangdeadff12009-08-01 18:45:16 +08001037 chip->rirb.res[addr] = -1;
Takashi Iwaib05a7d42009-05-28 11:59:12 +02001038 return -EIO;
1039}
1040
Linus Torvalds1da177e2005-04-16 15:20:36 -07001041/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001042static int azx_single_send_cmd(struct hda_bus *bus, u32 val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001043{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001044 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +08001045 unsigned int addr = azx_command_addr(val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001046 int timeout = 50;
1047
Takashi Iwai8dd78332009-06-02 01:16:07 +02001048 bus->rirb_error = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001049 while (timeout--) {
1050 /* check ICB busy bit */
Takashi Iwaid01ce992007-07-27 16:52:19 +02001051 if (!((azx_readw(chip, IRS) & ICH6_IRS_BUSY))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001052 /* Clear IRV valid bit */
Takashi Iwaid01ce992007-07-27 16:52:19 +02001053 azx_writew(chip, IRS, azx_readw(chip, IRS) |
1054 ICH6_IRS_VALID);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001055 azx_writel(chip, IC, val);
Takashi Iwaid01ce992007-07-27 16:52:19 +02001056 azx_writew(chip, IRS, azx_readw(chip, IRS) |
1057 ICH6_IRS_BUSY);
Wu Fengguangdeadff12009-08-01 18:45:16 +08001058 return azx_single_wait_for_response(chip, addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001059 }
1060 udelay(1);
1061 }
Marc Boucher1cfd52b2008-01-22 15:29:26 +01001062 if (printk_ratelimit())
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001063 snd_printd(SFX "%s: send_cmd timeout: IRS=0x%x, val=0x%x\n",
1064 pci_name(chip->pci), azx_readw(chip, IRS), val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001065 return -EIO;
1066}
1067
1068/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +08001069static unsigned int azx_single_get_response(struct hda_bus *bus,
1070 unsigned int addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001071{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001072 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +08001073 return chip->rirb.res[addr];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001074}
1075
Takashi Iwai111d3af2006-02-16 18:17:58 +01001076/*
1077 * The below are the main callbacks from hda_codec.
1078 *
1079 * They are just the skeleton to call sub-callbacks according to the
1080 * current setting of chip->single_cmd.
1081 */
1082
1083/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001084static int azx_send_cmd(struct hda_bus *bus, unsigned int val)
Takashi Iwai111d3af2006-02-16 18:17:58 +01001085{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001086 struct azx *chip = bus->private_data;
Takashi Iwai43bbb6c2007-07-06 20:22:05 +02001087
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001088 if (chip->disabled)
1089 return 0;
Wu Fengguangfeb27342009-08-01 19:17:14 +08001090 chip->last_cmd[azx_command_addr(val)] = val;
Takashi Iwai111d3af2006-02-16 18:17:58 +01001091 if (chip->single_cmd)
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001092 return azx_single_send_cmd(bus, val);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001093 else
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001094 return azx_corb_send_cmd(bus, val);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001095}
1096
1097/* get a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +08001098static unsigned int azx_get_response(struct hda_bus *bus,
1099 unsigned int addr)
Takashi Iwai111d3af2006-02-16 18:17:58 +01001100{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001101 struct azx *chip = bus->private_data;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001102 if (chip->disabled)
1103 return 0;
Takashi Iwai111d3af2006-02-16 18:17:58 +01001104 if (chip->single_cmd)
Wu Fengguangdeadff12009-08-01 18:45:16 +08001105 return azx_single_get_response(bus, addr);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001106 else
Wu Fengguangdeadff12009-08-01 18:45:16 +08001107 return azx_rirb_get_response(bus, addr);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001108}
1109
Takashi Iwai83012a72012-08-24 18:38:08 +02001110#ifdef CONFIG_PM
Takashi Iwai68467f52012-08-28 09:14:29 -07001111static void azx_power_notify(struct hda_bus *bus, bool power_up);
Takashi Iwaicb53c622007-08-10 17:21:45 +02001112#endif
Takashi Iwai111d3af2006-02-16 18:17:58 +01001113
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001114#ifdef CONFIG_SND_HDA_DSP_LOADER
1115static int azx_load_dsp_prepare(struct hda_bus *bus, unsigned int format,
1116 unsigned int byte_size,
1117 struct snd_dma_buffer *bufp);
1118static void azx_load_dsp_trigger(struct hda_bus *bus, bool start);
1119static void azx_load_dsp_cleanup(struct hda_bus *bus,
1120 struct snd_dma_buffer *dmab);
1121#endif
1122
Linus Torvalds1da177e2005-04-16 15:20:36 -07001123/* reset codec link */
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001124static int azx_reset(struct azx *chip, int full_reset)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001125{
Mengdong Linfa348da2012-12-12 09:16:15 -05001126 unsigned long timeout;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001127
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001128 if (!full_reset)
1129 goto __skip;
1130
Danny Tholene8a7f132007-09-11 21:41:56 +02001131 /* clear STATESTS */
1132 azx_writeb(chip, STATESTS, STATESTS_INT_MASK);
1133
Linus Torvalds1da177e2005-04-16 15:20:36 -07001134 /* reset controller */
1135 azx_writel(chip, GCTL, azx_readl(chip, GCTL) & ~ICH6_GCTL_RESET);
1136
Mengdong Linfa348da2012-12-12 09:16:15 -05001137 timeout = jiffies + msecs_to_jiffies(100);
1138 while (azx_readb(chip, GCTL) &&
1139 time_before(jiffies, timeout))
1140 usleep_range(500, 1000);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001141
1142 /* delay for >= 100us for codec PLL to settle per spec
1143 * Rev 0.9 section 5.5.1
1144 */
Mengdong Linfa348da2012-12-12 09:16:15 -05001145 usleep_range(500, 1000);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001146
1147 /* Bring controller out of reset */
1148 azx_writeb(chip, GCTL, azx_readb(chip, GCTL) | ICH6_GCTL_RESET);
1149
Mengdong Linfa348da2012-12-12 09:16:15 -05001150 timeout = jiffies + msecs_to_jiffies(100);
1151 while (!azx_readb(chip, GCTL) &&
1152 time_before(jiffies, timeout))
1153 usleep_range(500, 1000);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001154
Pavel Machek927fc862006-08-31 17:03:43 +02001155 /* Brent Chartrand said to wait >= 540us for codecs to initialize */
Mengdong Linfa348da2012-12-12 09:16:15 -05001156 usleep_range(1000, 1200);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001157
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001158 __skip:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001159 /* check to see if controller is ready */
Pavel Machek927fc862006-08-31 17:03:43 +02001160 if (!azx_readb(chip, GCTL)) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001161 snd_printd(SFX "%s: azx_reset: controller not ready!\n", pci_name(chip->pci));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001162 return -EBUSY;
1163 }
1164
Matt41e2fce2005-07-04 17:49:55 +02001165 /* Accept unsolicited responses */
Takashi Iwai1a696972009-11-07 09:49:04 +01001166 if (!chip->single_cmd)
1167 azx_writel(chip, GCTL, azx_readl(chip, GCTL) |
1168 ICH6_GCTL_UNSOL);
Matt41e2fce2005-07-04 17:49:55 +02001169
Linus Torvalds1da177e2005-04-16 15:20:36 -07001170 /* detect codecs */
Pavel Machek927fc862006-08-31 17:03:43 +02001171 if (!chip->codec_mask) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001172 chip->codec_mask = azx_readw(chip, STATESTS);
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001173 snd_printdd(SFX "%s: codec_mask = 0x%x\n", pci_name(chip->pci), chip->codec_mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001174 }
1175
1176 return 0;
1177}
1178
1179
1180/*
1181 * Lowlevel interface
1182 */
1183
1184/* enable interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001185static void azx_int_enable(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001186{
1187 /* enable controller CIE and GIE */
1188 azx_writel(chip, INTCTL, azx_readl(chip, INTCTL) |
1189 ICH6_INT_CTRL_EN | ICH6_INT_GLOBAL_EN);
1190}
1191
1192/* disable interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001193static void azx_int_disable(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001194{
1195 int i;
1196
1197 /* disable interrupts in stream descriptor */
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001198 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001199 struct azx_dev *azx_dev = &chip->azx_dev[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001200 azx_sd_writeb(azx_dev, SD_CTL,
1201 azx_sd_readb(azx_dev, SD_CTL) & ~SD_INT_MASK);
1202 }
1203
1204 /* disable SIE for all streams */
1205 azx_writeb(chip, INTCTL, 0);
1206
1207 /* disable controller CIE and GIE */
1208 azx_writel(chip, INTCTL, azx_readl(chip, INTCTL) &
1209 ~(ICH6_INT_CTRL_EN | ICH6_INT_GLOBAL_EN));
1210}
1211
1212/* clear interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001213static void azx_int_clear(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001214{
1215 int i;
1216
1217 /* clear stream status */
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001218 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001219 struct azx_dev *azx_dev = &chip->azx_dev[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001220 azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK);
1221 }
1222
1223 /* clear STATESTS */
1224 azx_writeb(chip, STATESTS, STATESTS_INT_MASK);
1225
1226 /* clear rirb status */
1227 azx_writeb(chip, RIRBSTS, RIRB_INT_MASK);
1228
1229 /* clear int status */
1230 azx_writel(chip, INTSTS, ICH6_INT_CTRL_EN | ICH6_INT_ALL_STREAM);
1231}
1232
1233/* start a stream */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001234static void azx_stream_start(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001235{
Joseph Chan0e153472008-08-26 14:38:03 +02001236 /*
1237 * Before stream start, initialize parameter
1238 */
1239 azx_dev->insufficient = 1;
1240
Linus Torvalds1da177e2005-04-16 15:20:36 -07001241 /* enable SIE */
Wei Niccc5df02010-01-26 15:59:33 +08001242 azx_writel(chip, INTCTL,
1243 azx_readl(chip, INTCTL) | (1 << azx_dev->index));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001244 /* set DMA start and interrupt mask */
1245 azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) |
1246 SD_CTL_DMA_START | SD_INT_MASK);
1247}
1248
Takashi Iwai1dddab42009-03-18 15:15:37 +01001249/* stop DMA */
1250static void azx_stream_clear(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001251{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001252 azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) &
1253 ~(SD_CTL_DMA_START | SD_INT_MASK));
1254 azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK); /* to be sure */
Takashi Iwai1dddab42009-03-18 15:15:37 +01001255}
1256
1257/* stop a stream */
1258static void azx_stream_stop(struct azx *chip, struct azx_dev *azx_dev)
1259{
1260 azx_stream_clear(chip, azx_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001261 /* disable SIE */
Wei Niccc5df02010-01-26 15:59:33 +08001262 azx_writel(chip, INTCTL,
1263 azx_readl(chip, INTCTL) & ~(1 << azx_dev->index));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001264}
1265
1266
1267/*
Takashi Iwaicb53c622007-08-10 17:21:45 +02001268 * reset and start the controller registers
Linus Torvalds1da177e2005-04-16 15:20:36 -07001269 */
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001270static void azx_init_chip(struct azx *chip, int full_reset)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001271{
Takashi Iwaicb53c622007-08-10 17:21:45 +02001272 if (chip->initialized)
1273 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001274
1275 /* reset controller */
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001276 azx_reset(chip, full_reset);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001277
1278 /* initialize interrupts */
1279 azx_int_clear(chip);
1280 azx_int_enable(chip);
1281
1282 /* initialize the codec command I/O */
Takashi Iwai1a696972009-11-07 09:49:04 +01001283 if (!chip->single_cmd)
1284 azx_init_cmd_io(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001285
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02001286 /* program the position buffer */
1287 azx_writel(chip, DPLBASE, (u32)chip->posbuf.addr);
Takashi Iwai766979e2008-06-13 20:53:56 +02001288 azx_writel(chip, DPUBASE, upper_32_bits(chip->posbuf.addr));
Frederick Lif5d40b32005-05-12 14:55:20 +02001289
Takashi Iwaicb53c622007-08-10 17:21:45 +02001290 chip->initialized = 1;
1291}
1292
1293/*
1294 * initialize the PCI registers
1295 */
1296/* update bits in a PCI register byte */
1297static void update_pci_byte(struct pci_dev *pci, unsigned int reg,
1298 unsigned char mask, unsigned char val)
1299{
1300 unsigned char data;
1301
1302 pci_read_config_byte(pci, reg, &data);
1303 data &= ~mask;
1304 data |= (val & mask);
1305 pci_write_config_byte(pci, reg, data);
1306}
1307
1308static void azx_init_pci(struct azx *chip)
1309{
1310 /* Clear bits 0-2 of PCI register TCSEL (at offset 0x44)
1311 * TCSEL == Traffic Class Select Register, which sets PCI express QOS
1312 * Ensuring these bits are 0 clears playback static on some HD Audio
Adam Lackorzynskia09e89f2011-03-10 17:41:56 +01001313 * codecs.
1314 * The PCI register TCSEL is defined in the Intel manuals.
Takashi Iwaicb53c622007-08-10 17:21:45 +02001315 */
Linus Torvalds46f2cc82011-05-27 19:45:28 -07001316 if (!(chip->driver_caps & AZX_DCAPS_NO_TCSEL)) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001317 snd_printdd(SFX "%s: Clearing TCSEL\n", pci_name(chip->pci));
Adam Lackorzynskia09e89f2011-03-10 17:41:56 +01001318 update_pci_byte(chip->pci, ICH6_PCIREG_TCSEL, 0x07, 0);
Takashi Iwai9477c582011-05-25 09:11:37 +02001319 }
Takashi Iwaicb53c622007-08-10 17:21:45 +02001320
Takashi Iwai9477c582011-05-25 09:11:37 +02001321 /* For ATI SB450/600/700/800/900 and AMD Hudson azalia HD audio,
1322 * we need to enable snoop.
1323 */
1324 if (chip->driver_caps & AZX_DCAPS_ATI_SNOOP) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001325 snd_printdd(SFX "%s: Setting ATI snoop: %d\n", pci_name(chip->pci), azx_snoop(chip));
Takashi Iwaicb53c622007-08-10 17:21:45 +02001326 update_pci_byte(chip->pci,
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001327 ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR, 0x07,
1328 azx_snoop(chip) ? ATI_SB450_HDAUDIO_ENABLE_SNOOP : 0);
Takashi Iwai9477c582011-05-25 09:11:37 +02001329 }
1330
1331 /* For NVIDIA HDA, enable snoop */
1332 if (chip->driver_caps & AZX_DCAPS_NVIDIA_SNOOP) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001333 snd_printdd(SFX "%s: Setting Nvidia snoop: %d\n", pci_name(chip->pci), azx_snoop(chip));
Takashi Iwaicb53c622007-08-10 17:21:45 +02001334 update_pci_byte(chip->pci,
1335 NVIDIA_HDA_TRANSREG_ADDR,
1336 0x0f, NVIDIA_HDA_ENABLE_COHBITS);
Peer Chen320dcc32008-08-20 16:43:24 -07001337 update_pci_byte(chip->pci,
1338 NVIDIA_HDA_ISTRM_COH,
1339 0x01, NVIDIA_HDA_ENABLE_COHBIT);
1340 update_pci_byte(chip->pci,
1341 NVIDIA_HDA_OSTRM_COH,
1342 0x01, NVIDIA_HDA_ENABLE_COHBIT);
Takashi Iwai9477c582011-05-25 09:11:37 +02001343 }
1344
1345 /* Enable SCH/PCH snoop if needed */
1346 if (chip->driver_caps & AZX_DCAPS_SCH_SNOOP) {
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001347 unsigned short snoop;
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001348 pci_read_config_word(chip->pci, INTEL_SCH_HDA_DEVC, &snoop);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001349 if ((!azx_snoop(chip) && !(snoop & INTEL_SCH_HDA_DEVC_NOSNOOP)) ||
1350 (azx_snoop(chip) && (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP))) {
1351 snoop &= ~INTEL_SCH_HDA_DEVC_NOSNOOP;
1352 if (!azx_snoop(chip))
1353 snoop |= INTEL_SCH_HDA_DEVC_NOSNOOP;
1354 pci_write_config_word(chip->pci, INTEL_SCH_HDA_DEVC, snoop);
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001355 pci_read_config_word(chip->pci,
1356 INTEL_SCH_HDA_DEVC, &snoop);
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001357 }
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001358 snd_printdd(SFX "%s: SCH snoop: %s\n",
1359 pci_name(chip->pci), (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP)
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001360 ? "Disabled" : "Enabled");
Vinod Gda3fca22005-09-13 18:49:12 +02001361 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001362}
1363
1364
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001365static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev);
1366
Linus Torvalds1da177e2005-04-16 15:20:36 -07001367/*
1368 * interrupt handler
1369 */
David Howells7d12e782006-10-05 14:55:46 +01001370static irqreturn_t azx_interrupt(int irq, void *dev_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001371{
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001372 struct azx *chip = dev_id;
1373 struct azx_dev *azx_dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001374 u32 status;
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001375 u8 sd_status;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001376 int i, ok;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001377
Mengdong Linb8dfc4622012-08-23 17:32:30 +08001378#ifdef CONFIG_PM_RUNTIME
1379 if (chip->pci->dev.power.runtime_status != RPM_ACTIVE)
1380 return IRQ_NONE;
1381#endif
1382
Linus Torvalds1da177e2005-04-16 15:20:36 -07001383 spin_lock(&chip->reg_lock);
1384
Dan Carpenter60911062012-05-18 10:36:11 +03001385 if (chip->disabled) {
1386 spin_unlock(&chip->reg_lock);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001387 return IRQ_NONE;
Dan Carpenter60911062012-05-18 10:36:11 +03001388 }
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001389
Linus Torvalds1da177e2005-04-16 15:20:36 -07001390 status = azx_readl(chip, INTSTS);
1391 if (status == 0) {
1392 spin_unlock(&chip->reg_lock);
1393 return IRQ_NONE;
1394 }
1395
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001396 for (i = 0; i < chip->num_streams; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001397 azx_dev = &chip->azx_dev[i];
1398 if (status & azx_dev->sd_int_sta_mask) {
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001399 sd_status = azx_sd_readb(azx_dev, SD_STS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001400 azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK);
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001401 if (!azx_dev->substream || !azx_dev->running ||
1402 !(sd_status & SD_INT_COMPLETE))
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001403 continue;
1404 /* check whether this IRQ is really acceptable */
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001405 ok = azx_position_ok(chip, azx_dev);
1406 if (ok == 1) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001407 azx_dev->irq_pending = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001408 spin_unlock(&chip->reg_lock);
1409 snd_pcm_period_elapsed(azx_dev->substream);
1410 spin_lock(&chip->reg_lock);
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001411 } else if (ok == 0 && chip->bus && chip->bus->workq) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001412 /* bogus IRQ, process it later */
1413 azx_dev->irq_pending = 1;
Takashi Iwai6acaed32009-01-12 10:09:24 +01001414 queue_work(chip->bus->workq,
1415 &chip->irq_pending_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001416 }
1417 }
1418 }
1419
1420 /* clear rirb int */
1421 status = azx_readb(chip, RIRBSTS);
1422 if (status & RIRB_INT_MASK) {
Takashi Iwai14d34f12010-10-21 09:03:25 +02001423 if (status & RIRB_INT_RESPONSE) {
Takashi Iwai9477c582011-05-25 09:11:37 +02001424 if (chip->driver_caps & AZX_DCAPS_RIRB_PRE_DELAY)
Takashi Iwai14d34f12010-10-21 09:03:25 +02001425 udelay(80);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001426 azx_update_rirb(chip);
Takashi Iwai14d34f12010-10-21 09:03:25 +02001427 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001428 azx_writeb(chip, RIRBSTS, RIRB_INT_MASK);
1429 }
1430
1431#if 0
1432 /* clear state status int */
1433 if (azx_readb(chip, STATESTS) & 0x04)
1434 azx_writeb(chip, STATESTS, 0x04);
1435#endif
1436 spin_unlock(&chip->reg_lock);
1437
1438 return IRQ_HANDLED;
1439}
1440
1441
1442/*
Takashi Iwai675f25d2008-06-10 17:53:20 +02001443 * set up a BDL entry
1444 */
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001445static int setup_bdle(struct azx *chip,
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001446 struct snd_dma_buffer *dmab,
Takashi Iwai675f25d2008-06-10 17:53:20 +02001447 struct azx_dev *azx_dev, u32 **bdlp,
1448 int ofs, int size, int with_ioc)
1449{
Takashi Iwai675f25d2008-06-10 17:53:20 +02001450 u32 *bdl = *bdlp;
1451
1452 while (size > 0) {
1453 dma_addr_t addr;
1454 int chunk;
1455
1456 if (azx_dev->frags >= AZX_MAX_BDL_ENTRIES)
1457 return -EINVAL;
1458
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001459 addr = snd_sgbuf_get_addr(dmab, ofs);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001460 /* program the address field of the BDL entry */
1461 bdl[0] = cpu_to_le32((u32)addr);
Takashi Iwai766979e2008-06-13 20:53:56 +02001462 bdl[1] = cpu_to_le32(upper_32_bits(addr));
Takashi Iwai675f25d2008-06-10 17:53:20 +02001463 /* program the size field of the BDL entry */
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001464 chunk = snd_sgbuf_get_chunk_size(dmab, ofs, size);
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001465 /* one BDLE cannot cross 4K boundary on CTHDA chips */
1466 if (chip->driver_caps & AZX_DCAPS_4K_BDLE_BOUNDARY) {
1467 u32 remain = 0x1000 - (ofs & 0xfff);
1468 if (chunk > remain)
1469 chunk = remain;
1470 }
Takashi Iwai675f25d2008-06-10 17:53:20 +02001471 bdl[2] = cpu_to_le32(chunk);
1472 /* program the IOC to enable interrupt
1473 * only when the whole fragment is processed
1474 */
1475 size -= chunk;
1476 bdl[3] = (size || !with_ioc) ? 0 : cpu_to_le32(0x01);
1477 bdl += 4;
1478 azx_dev->frags++;
1479 ofs += chunk;
1480 }
1481 *bdlp = bdl;
1482 return ofs;
1483}
1484
1485/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001486 * set up BDL entries
1487 */
Takashi Iwai555e2192008-06-10 17:53:34 +02001488static int azx_setup_periods(struct azx *chip,
1489 struct snd_pcm_substream *substream,
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001490 struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001491{
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001492 u32 *bdl;
1493 int i, ofs, periods, period_bytes;
Takashi Iwai555e2192008-06-10 17:53:34 +02001494 int pos_adj;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001495
1496 /* reset BDL address */
1497 azx_sd_writel(azx_dev, SD_BDLPL, 0);
1498 azx_sd_writel(azx_dev, SD_BDLPU, 0);
1499
Takashi Iwai97b71c92009-03-18 15:09:13 +01001500 period_bytes = azx_dev->period_bytes;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001501 periods = azx_dev->bufsize / period_bytes;
1502
Linus Torvalds1da177e2005-04-16 15:20:36 -07001503 /* program the initial BDL entries */
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001504 bdl = (u32 *)azx_dev->bdl.area;
1505 ofs = 0;
1506 azx_dev->frags = 0;
Takashi Iwai555e2192008-06-10 17:53:34 +02001507 pos_adj = bdl_pos_adj[chip->dev_index];
Takashi Iwai915bf292012-09-11 15:19:10 +02001508 if (!azx_dev->no_period_wakeup && pos_adj > 0) {
Takashi Iwai675f25d2008-06-10 17:53:20 +02001509 struct snd_pcm_runtime *runtime = substream->runtime;
Takashi Iwaie785d3d2008-07-15 16:28:43 +02001510 int pos_align = pos_adj;
Takashi Iwai555e2192008-06-10 17:53:34 +02001511 pos_adj = (pos_adj * runtime->rate + 47999) / 48000;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001512 if (!pos_adj)
Takashi Iwaie785d3d2008-07-15 16:28:43 +02001513 pos_adj = pos_align;
1514 else
1515 pos_adj = ((pos_adj + pos_align - 1) / pos_align) *
1516 pos_align;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001517 pos_adj = frames_to_bytes(runtime, pos_adj);
1518 if (pos_adj >= period_bytes) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001519 snd_printk(KERN_WARNING SFX "%s: Too big adjustment %d\n",
1520 pci_name(chip->pci), bdl_pos_adj[chip->dev_index]);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001521 pos_adj = 0;
1522 } else {
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001523 ofs = setup_bdle(chip, snd_pcm_get_dma_buf(substream),
1524 azx_dev,
Takashi Iwai915bf292012-09-11 15:19:10 +02001525 &bdl, ofs, pos_adj, true);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001526 if (ofs < 0)
1527 goto error;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001528 }
Takashi Iwai555e2192008-06-10 17:53:34 +02001529 } else
1530 pos_adj = 0;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001531 for (i = 0; i < periods; i++) {
1532 if (i == periods - 1 && pos_adj)
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001533 ofs = setup_bdle(chip, snd_pcm_get_dma_buf(substream),
1534 azx_dev, &bdl, ofs,
Takashi Iwai675f25d2008-06-10 17:53:20 +02001535 period_bytes - pos_adj, 0);
1536 else
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001537 ofs = setup_bdle(chip, snd_pcm_get_dma_buf(substream),
1538 azx_dev, &bdl, ofs,
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001539 period_bytes,
Takashi Iwai915bf292012-09-11 15:19:10 +02001540 !azx_dev->no_period_wakeup);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001541 if (ofs < 0)
1542 goto error;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001543 }
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001544 return 0;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001545
1546 error:
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001547 snd_printk(KERN_ERR SFX "%s: Too many BDL entries: buffer=%d, period=%d\n",
1548 pci_name(chip->pci), azx_dev->bufsize, period_bytes);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001549 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001550}
1551
Takashi Iwai1dddab42009-03-18 15:15:37 +01001552/* reset stream */
1553static void azx_stream_reset(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001554{
1555 unsigned char val;
1556 int timeout;
1557
Takashi Iwai1dddab42009-03-18 15:15:37 +01001558 azx_stream_clear(chip, azx_dev);
1559
Takashi Iwaid01ce992007-07-27 16:52:19 +02001560 azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) |
1561 SD_CTL_STREAM_RESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001562 udelay(3);
1563 timeout = 300;
1564 while (!((val = azx_sd_readb(azx_dev, SD_CTL)) & SD_CTL_STREAM_RESET) &&
1565 --timeout)
1566 ;
1567 val &= ~SD_CTL_STREAM_RESET;
1568 azx_sd_writeb(azx_dev, SD_CTL, val);
1569 udelay(3);
1570
1571 timeout = 300;
1572 /* waiting for hardware to report that the stream is out of reset */
1573 while (((val = azx_sd_readb(azx_dev, SD_CTL)) & SD_CTL_STREAM_RESET) &&
1574 --timeout)
1575 ;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001576
1577 /* reset first position - may not be synced with hw at this time */
1578 *azx_dev->posbuf = 0;
Takashi Iwai1dddab42009-03-18 15:15:37 +01001579}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001580
Takashi Iwai1dddab42009-03-18 15:15:37 +01001581/*
1582 * set up the SD for streaming
1583 */
1584static int azx_setup_controller(struct azx *chip, struct azx_dev *azx_dev)
1585{
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001586 unsigned int val;
Takashi Iwai1dddab42009-03-18 15:15:37 +01001587 /* make sure the run bit is zero for SD */
1588 azx_stream_clear(chip, azx_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001589 /* program the stream_tag */
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001590 val = azx_sd_readl(azx_dev, SD_CTL);
1591 val = (val & ~SD_CTL_STREAM_TAG_MASK) |
1592 (azx_dev->stream_tag << SD_CTL_STREAM_TAG_SHIFT);
1593 if (!azx_snoop(chip))
1594 val |= SD_CTL_TRAFFIC_PRIO;
1595 azx_sd_writel(azx_dev, SD_CTL, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001596
1597 /* program the length of samples in cyclic buffer */
1598 azx_sd_writel(azx_dev, SD_CBL, azx_dev->bufsize);
1599
1600 /* program the stream format */
1601 /* this value needs to be the same as the one programmed */
1602 azx_sd_writew(azx_dev, SD_FORMAT, azx_dev->format_val);
1603
1604 /* program the stream LVI (last valid index) of the BDL */
1605 azx_sd_writew(azx_dev, SD_LVI, azx_dev->frags - 1);
1606
1607 /* program the BDL address */
1608 /* lower BDL address */
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001609 azx_sd_writel(azx_dev, SD_BDLPL, (u32)azx_dev->bdl.addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001610 /* upper BDL address */
Takashi Iwai766979e2008-06-13 20:53:56 +02001611 azx_sd_writel(azx_dev, SD_BDLPU, upper_32_bits(azx_dev->bdl.addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001612
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02001613 /* enable the position buffer */
David Henningsson4cb36312010-09-30 10:12:50 +02001614 if (chip->position_fix[0] != POS_FIX_LPIB ||
1615 chip->position_fix[1] != POS_FIX_LPIB) {
Takashi Iwaiee9d6b92008-03-14 15:52:20 +01001616 if (!(azx_readl(chip, DPLBASE) & ICH6_DPLBASE_ENABLE))
1617 azx_writel(chip, DPLBASE,
1618 (u32)chip->posbuf.addr | ICH6_DPLBASE_ENABLE);
1619 }
Takashi Iwaic74db862005-05-12 14:26:27 +02001620
Linus Torvalds1da177e2005-04-16 15:20:36 -07001621 /* set the interrupt enable bits in the descriptor control register */
Takashi Iwaid01ce992007-07-27 16:52:19 +02001622 azx_sd_writel(azx_dev, SD_CTL,
1623 azx_sd_readl(azx_dev, SD_CTL) | SD_INT_MASK);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001624
1625 return 0;
1626}
1627
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001628/*
1629 * Probe the given codec address
1630 */
1631static int probe_codec(struct azx *chip, int addr)
1632{
1633 unsigned int cmd = (addr << 28) | (AC_NODE_ROOT << 20) |
1634 (AC_VERB_PARAMETERS << 8) | AC_PAR_VENDOR_ID;
1635 unsigned int res;
1636
Wu Fengguanga678cde2009-08-01 18:46:46 +08001637 mutex_lock(&chip->bus->cmd_mutex);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001638 chip->probing = 1;
1639 azx_send_cmd(chip->bus, cmd);
Wu Fengguangdeadff12009-08-01 18:45:16 +08001640 res = azx_get_response(chip->bus, addr);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001641 chip->probing = 0;
Wu Fengguanga678cde2009-08-01 18:46:46 +08001642 mutex_unlock(&chip->bus->cmd_mutex);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001643 if (res == -1)
1644 return -EIO;
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001645 snd_printdd(SFX "%s: codec #%d probed OK\n", pci_name(chip->pci), addr);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001646 return 0;
1647}
1648
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001649static int azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec,
1650 struct hda_pcm *cpcm);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001651static void azx_stop_chip(struct azx *chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001652
Takashi Iwai8dd78332009-06-02 01:16:07 +02001653static void azx_bus_reset(struct hda_bus *bus)
1654{
1655 struct azx *chip = bus->private_data;
Takashi Iwai8dd78332009-06-02 01:16:07 +02001656
1657 bus->in_reset = 1;
1658 azx_stop_chip(chip);
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001659 azx_init_chip(chip, 1);
Alexander Beregalov65f75982009-06-04 13:46:16 +04001660#ifdef CONFIG_PM
Takashi Iwai8dd78332009-06-02 01:16:07 +02001661 if (chip->initialized) {
Takashi Iwai01b65bf2011-11-24 14:31:46 +01001662 struct azx_pcm *p;
1663 list_for_each_entry(p, &chip->pcm_list, list)
1664 snd_pcm_suspend_all(p->pcm);
Takashi Iwai8dd78332009-06-02 01:16:07 +02001665 snd_hda_suspend(chip->bus);
1666 snd_hda_resume(chip->bus);
1667 }
Alexander Beregalov65f75982009-06-04 13:46:16 +04001668#endif
Takashi Iwai8dd78332009-06-02 01:16:07 +02001669 bus->in_reset = 0;
1670}
1671
David Henningsson26a6cb62012-10-09 15:04:21 +02001672static int get_jackpoll_interval(struct azx *chip)
1673{
1674 int i = jackpoll_ms[chip->dev_index];
1675 unsigned int j;
1676 if (i == 0)
1677 return 0;
1678 if (i < 50 || i > 60000)
1679 j = 0;
1680 else
1681 j = msecs_to_jiffies(i);
1682 if (j == 0)
1683 snd_printk(KERN_WARNING SFX
1684 "jackpoll_ms value out of range: %d\n", i);
1685 return j;
1686}
1687
Linus Torvalds1da177e2005-04-16 15:20:36 -07001688/*
1689 * Codec initialization
1690 */
1691
Takashi Iwai2f5983f2008-09-03 16:00:44 +02001692/* number of codec slots for each chipset: 0 = default slots (i.e. 4) */
Takashi Iwai48c8b0e2012-12-07 07:40:35 +01001693static unsigned int azx_max_codecs[AZX_NUM_DRIVERS] = {
Wei Ni7445dfc2010-03-03 15:05:53 +08001694 [AZX_DRIVER_NVIDIA] = 8,
Kailang Yangf2690022008-05-27 11:44:55 +02001695 [AZX_DRIVER_TERA] = 1,
Takashi Iwaia9995a32007-03-12 21:30:46 +01001696};
1697
Takashi Iwai48c8b0e2012-12-07 07:40:35 +01001698static int azx_codec_create(struct azx *chip, const char *model)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001699{
1700 struct hda_bus_template bus_temp;
Takashi Iwai34c25352008-10-28 11:38:58 +01001701 int c, codecs, err;
1702 int max_slots;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001703
1704 memset(&bus_temp, 0, sizeof(bus_temp));
1705 bus_temp.private_data = chip;
1706 bus_temp.modelname = model;
1707 bus_temp.pci = chip->pci;
Takashi Iwai111d3af2006-02-16 18:17:58 +01001708 bus_temp.ops.command = azx_send_cmd;
1709 bus_temp.ops.get_response = azx_get_response;
Takashi Iwai176d5332008-07-30 15:01:44 +02001710 bus_temp.ops.attach_pcm = azx_attach_pcm_stream;
Takashi Iwai8dd78332009-06-02 01:16:07 +02001711 bus_temp.ops.bus_reset = azx_bus_reset;
Takashi Iwai83012a72012-08-24 18:38:08 +02001712#ifdef CONFIG_PM
Takashi Iwai11cd41b2008-11-28 07:22:18 +01001713 bus_temp.power_save = &power_save;
Takashi Iwaicb53c622007-08-10 17:21:45 +02001714 bus_temp.ops.pm_notify = azx_power_notify;
1715#endif
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001716#ifdef CONFIG_SND_HDA_DSP_LOADER
1717 bus_temp.ops.load_dsp_prepare = azx_load_dsp_prepare;
1718 bus_temp.ops.load_dsp_trigger = azx_load_dsp_trigger;
1719 bus_temp.ops.load_dsp_cleanup = azx_load_dsp_cleanup;
1720#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07001721
Takashi Iwaid01ce992007-07-27 16:52:19 +02001722 err = snd_hda_bus_new(chip->card, &bus_temp, &chip->bus);
1723 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001724 return err;
1725
Takashi Iwai9477c582011-05-25 09:11:37 +02001726 if (chip->driver_caps & AZX_DCAPS_RIRB_DELAY) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001727 snd_printd(SFX "%s: Enable delay in RIRB handling\n", pci_name(chip->pci));
Wei Nidc9c8e22008-09-26 13:55:56 +08001728 chip->bus->needs_damn_long_delay = 1;
Takashi Iwai9477c582011-05-25 09:11:37 +02001729 }
Wei Nidc9c8e22008-09-26 13:55:56 +08001730
Takashi Iwai34c25352008-10-28 11:38:58 +01001731 codecs = 0;
Takashi Iwai2f5983f2008-09-03 16:00:44 +02001732 max_slots = azx_max_codecs[chip->driver_type];
1733 if (!max_slots)
Wei Ni7445dfc2010-03-03 15:05:53 +08001734 max_slots = AZX_DEFAULT_CODECS;
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001735
1736 /* First try to probe all given codec slots */
1737 for (c = 0; c < max_slots; c++) {
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01001738 if ((chip->codec_mask & (1 << c)) & chip->codec_probe_mask) {
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001739 if (probe_codec(chip, c) < 0) {
1740 /* Some BIOSen give you wrong codec addresses
1741 * that don't exist
1742 */
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001743 snd_printk(KERN_WARNING SFX
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001744 "%s: Codec #%d probe error; "
1745 "disabling it...\n", pci_name(chip->pci), c);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001746 chip->codec_mask &= ~(1 << c);
1747 /* More badly, accessing to a non-existing
1748 * codec often screws up the controller chip,
Paul Menzel24481582010-02-08 20:37:26 +01001749 * and disturbs the further communications.
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001750 * Thus if an error occurs during probing,
1751 * better to reset the controller chip to
1752 * get back to the sanity state.
1753 */
1754 azx_stop_chip(chip);
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001755 azx_init_chip(chip, 1);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001756 }
1757 }
1758 }
1759
Takashi Iwaid507cd62011-04-26 15:25:02 +02001760 /* AMD chipsets often cause the communication stalls upon certain
1761 * sequence like the pin-detection. It seems that forcing the synced
1762 * access works around the stall. Grrr...
1763 */
Takashi Iwai9477c582011-05-25 09:11:37 +02001764 if (chip->driver_caps & AZX_DCAPS_SYNC_WRITE) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001765 snd_printd(SFX "%s: Enable sync_write for stable communication\n",
1766 pci_name(chip->pci));
Takashi Iwaid507cd62011-04-26 15:25:02 +02001767 chip->bus->sync_write = 1;
1768 chip->bus->allow_bus_reset = 1;
1769 }
1770
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001771 /* Then create codec instances */
Takashi Iwai34c25352008-10-28 11:38:58 +01001772 for (c = 0; c < max_slots; c++) {
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01001773 if ((chip->codec_mask & (1 << c)) & chip->codec_probe_mask) {
Takashi Iwaibccad142007-04-24 12:23:53 +02001774 struct hda_codec *codec;
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001775 err = snd_hda_codec_new(chip->bus, c, &codec);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001776 if (err < 0)
1777 continue;
David Henningsson26a6cb62012-10-09 15:04:21 +02001778 codec->jackpoll_interval = get_jackpoll_interval(chip);
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +01001779 codec->beep_mode = chip->beep_mode;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001780 codecs++;
Takashi Iwai19a982b2007-03-21 15:14:35 +01001781 }
1782 }
1783 if (!codecs) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001784 snd_printk(KERN_ERR SFX "%s: no codecs initialized\n", pci_name(chip->pci));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001785 return -ENXIO;
1786 }
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001787 return 0;
1788}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001789
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001790/* configure each codec instance */
Bill Pembertone23e7a12012-12-06 12:35:10 -05001791static int azx_codec_configure(struct azx *chip)
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001792{
1793 struct hda_codec *codec;
1794 list_for_each_entry(codec, &chip->bus->codec_list, list) {
1795 snd_hda_codec_configure(codec);
1796 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001797 return 0;
1798}
1799
1800
1801/*
1802 * PCM support
1803 */
1804
1805/* assign a stream for the PCM */
Wu Fengguangef18bed2009-12-25 13:14:27 +08001806static inline struct azx_dev *
1807azx_assign_device(struct azx *chip, struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001808{
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001809 int dev, i, nums;
Wu Fengguangef18bed2009-12-25 13:14:27 +08001810 struct azx_dev *res = NULL;
Takashi Iwaid5cf9912011-10-06 10:07:58 +02001811 /* make a non-zero unique key for the substream */
1812 int key = (substream->pcm->device << 16) | (substream->number << 2) |
1813 (substream->stream + 1);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001814
1815 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001816 dev = chip->playback_index_offset;
1817 nums = chip->playback_streams;
1818 } else {
1819 dev = chip->capture_index_offset;
1820 nums = chip->capture_streams;
1821 }
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001822 for (i = 0; i < nums; i++, dev++) {
1823 struct azx_dev *azx_dev = &chip->azx_dev[dev];
1824 dsp_lock(azx_dev);
1825 if (!azx_dev->opened && !dsp_is_locked(azx_dev)) {
1826 res = azx_dev;
1827 if (res->assigned_key == key) {
1828 res->opened = 1;
1829 res->assigned_key = key;
1830 dsp_unlock(azx_dev);
1831 return azx_dev;
1832 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001833 }
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001834 dsp_unlock(azx_dev);
1835 }
Wu Fengguangef18bed2009-12-25 13:14:27 +08001836 if (res) {
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001837 dsp_lock(res);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001838 res->opened = 1;
Takashi Iwaid5cf9912011-10-06 10:07:58 +02001839 res->assigned_key = key;
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001840 dsp_unlock(res);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001841 }
1842 return res;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001843}
1844
1845/* release the assigned stream */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001846static inline void azx_release_device(struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001847{
1848 azx_dev->opened = 0;
1849}
1850
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001851static cycle_t azx_cc_read(const struct cyclecounter *cc)
1852{
1853 struct azx_dev *azx_dev = container_of(cc, struct azx_dev, azx_cc);
1854 struct snd_pcm_substream *substream = azx_dev->substream;
1855 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1856 struct azx *chip = apcm->chip;
1857
1858 return azx_readl(chip, WALLCLK);
1859}
1860
1861static void azx_timecounter_init(struct snd_pcm_substream *substream,
1862 bool force, cycle_t last)
1863{
1864 struct azx_dev *azx_dev = get_azx_dev(substream);
1865 struct timecounter *tc = &azx_dev->azx_tc;
1866 struct cyclecounter *cc = &azx_dev->azx_cc;
1867 u64 nsec;
1868
1869 cc->read = azx_cc_read;
1870 cc->mask = CLOCKSOURCE_MASK(32);
1871
1872 /*
1873 * Converting from 24 MHz to ns means applying a 125/3 factor.
1874 * To avoid any saturation issues in intermediate operations,
1875 * the 125 factor is applied first. The division is applied
1876 * last after reading the timecounter value.
1877 * Applying the 1/3 factor as part of the multiplication
1878 * requires at least 20 bits for a decent precision, however
1879 * overflows occur after about 4 hours or less, not a option.
1880 */
1881
1882 cc->mult = 125; /* saturation after 195 years */
1883 cc->shift = 0;
1884
1885 nsec = 0; /* audio time is elapsed time since trigger */
1886 timecounter_init(tc, cc, nsec);
1887 if (force)
1888 /*
1889 * force timecounter to use predefined value,
1890 * used for synchronized starts
1891 */
1892 tc->cycle_last = last;
1893}
1894
Dylan Reidae03bbb2013-04-15 11:57:05 -07001895static u64 azx_adjust_codec_delay(struct snd_pcm_substream *substream,
Dylan Reid78daea22013-04-08 18:20:30 -07001896 u64 nsec)
1897{
1898 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1899 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
1900 u64 codec_frames, codec_nsecs;
1901
1902 if (!hinfo->ops.get_delay)
1903 return nsec;
1904
1905 codec_frames = hinfo->ops.get_delay(hinfo, apcm->codec, substream);
1906 codec_nsecs = div_u64(codec_frames * 1000000000LL,
1907 substream->runtime->rate);
1908
Dylan Reidae03bbb2013-04-15 11:57:05 -07001909 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
1910 return nsec + codec_nsecs;
1911
Dylan Reid78daea22013-04-08 18:20:30 -07001912 return (nsec > codec_nsecs) ? nsec - codec_nsecs : 0;
1913}
1914
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001915static int azx_get_wallclock_tstamp(struct snd_pcm_substream *substream,
1916 struct timespec *ts)
1917{
1918 struct azx_dev *azx_dev = get_azx_dev(substream);
1919 u64 nsec;
1920
1921 nsec = timecounter_read(&azx_dev->azx_tc);
1922 nsec = div_u64(nsec, 3); /* can be optimized */
Dylan Reidae03bbb2013-04-15 11:57:05 -07001923 nsec = azx_adjust_codec_delay(substream, nsec);
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001924
1925 *ts = ns_to_timespec(nsec);
1926
1927 return 0;
1928}
1929
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001930static struct snd_pcm_hardware azx_pcm_hw = {
Takashi Iwaid01ce992007-07-27 16:52:19 +02001931 .info = (SNDRV_PCM_INFO_MMAP |
1932 SNDRV_PCM_INFO_INTERLEAVED |
Linus Torvalds1da177e2005-04-16 15:20:36 -07001933 SNDRV_PCM_INFO_BLOCK_TRANSFER |
1934 SNDRV_PCM_INFO_MMAP_VALID |
Pavel Machek927fc862006-08-31 17:03:43 +02001935 /* No full-resume yet implemented */
1936 /* SNDRV_PCM_INFO_RESUME |*/
Takashi Iwai850f0e52008-03-18 17:11:05 +01001937 SNDRV_PCM_INFO_PAUSE |
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001938 SNDRV_PCM_INFO_SYNC_START |
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001939 SNDRV_PCM_INFO_HAS_WALL_CLOCK |
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001940 SNDRV_PCM_INFO_NO_PERIOD_WAKEUP),
Linus Torvalds1da177e2005-04-16 15:20:36 -07001941 .formats = SNDRV_PCM_FMTBIT_S16_LE,
1942 .rates = SNDRV_PCM_RATE_48000,
1943 .rate_min = 48000,
1944 .rate_max = 48000,
1945 .channels_min = 2,
1946 .channels_max = 2,
1947 .buffer_bytes_max = AZX_MAX_BUF_SIZE,
1948 .period_bytes_min = 128,
1949 .period_bytes_max = AZX_MAX_BUF_SIZE / 2,
1950 .periods_min = 2,
1951 .periods_max = AZX_MAX_FRAG,
1952 .fifo_size = 0,
1953};
1954
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001955static int azx_pcm_open(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001956{
1957 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1958 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001959 struct azx *chip = apcm->chip;
1960 struct azx_dev *azx_dev;
1961 struct snd_pcm_runtime *runtime = substream->runtime;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001962 unsigned long flags;
1963 int err;
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001964 int buff_step;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001965
Ingo Molnar62932df2006-01-16 16:34:20 +01001966 mutex_lock(&chip->open_mutex);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001967 azx_dev = azx_assign_device(chip, substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001968 if (azx_dev == NULL) {
Ingo Molnar62932df2006-01-16 16:34:20 +01001969 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001970 return -EBUSY;
1971 }
1972 runtime->hw = azx_pcm_hw;
1973 runtime->hw.channels_min = hinfo->channels_min;
1974 runtime->hw.channels_max = hinfo->channels_max;
1975 runtime->hw.formats = hinfo->formats;
1976 runtime->hw.rates = hinfo->rates;
1977 snd_pcm_limit_hw_rates(runtime);
1978 snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001979
1980 /* avoid wrap-around with wall-clock */
1981 snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_TIME,
1982 20,
1983 178000000);
1984
Takashi Iwai52409aa2012-01-23 17:10:24 +01001985 if (chip->align_buffer_size)
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001986 /* constrain buffer sizes to be multiple of 128
1987 bytes. This is more efficient in terms of memory
1988 access but isn't required by the HDA spec and
1989 prevents users from specifying exact period/buffer
1990 sizes. For example for 44.1kHz, a period size set
1991 to 20ms will be rounded to 19.59ms. */
1992 buff_step = 128;
1993 else
1994 /* Don't enforce steps on buffer sizes, still need to
1995 be multiple of 4 bytes (HDA spec). Tested on Intel
1996 HDA controllers, may not work on all devices where
1997 option needs to be disabled */
1998 buff_step = 4;
1999
Joachim Deguara5f1545b2007-03-16 15:01:36 +01002000 snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05002001 buff_step);
Joachim Deguara5f1545b2007-03-16 15:01:36 +01002002 snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05002003 buff_step);
Dylan Reidb4a91cf2012-06-15 19:36:23 -07002004 snd_hda_power_up_d3wait(apcm->codec);
Takashi Iwaid01ce992007-07-27 16:52:19 +02002005 err = hinfo->ops.open(hinfo, apcm->codec, substream);
2006 if (err < 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002007 azx_release_device(azx_dev);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002008 snd_hda_power_down(apcm->codec);
Ingo Molnar62932df2006-01-16 16:34:20 +01002009 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002010 return err;
2011 }
Takashi Iwai70d321e2009-07-03 23:06:45 +02002012 snd_pcm_limit_hw_rates(runtime);
Takashi Iwaiaba66532009-07-05 11:44:46 +02002013 /* sanity check */
2014 if (snd_BUG_ON(!runtime->hw.channels_min) ||
2015 snd_BUG_ON(!runtime->hw.channels_max) ||
2016 snd_BUG_ON(!runtime->hw.formats) ||
2017 snd_BUG_ON(!runtime->hw.rates)) {
2018 azx_release_device(azx_dev);
2019 hinfo->ops.close(hinfo, apcm->codec, substream);
2020 snd_hda_power_down(apcm->codec);
2021 mutex_unlock(&chip->open_mutex);
2022 return -EINVAL;
2023 }
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05002024
2025 /* disable WALLCLOCK timestamps for capture streams
2026 until we figure out how to handle digital inputs */
2027 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
2028 runtime->hw.info &= ~SNDRV_PCM_INFO_HAS_WALL_CLOCK;
2029
Linus Torvalds1da177e2005-04-16 15:20:36 -07002030 spin_lock_irqsave(&chip->reg_lock, flags);
2031 azx_dev->substream = substream;
2032 azx_dev->running = 0;
2033 spin_unlock_irqrestore(&chip->reg_lock, flags);
2034
2035 runtime->private_data = azx_dev;
Takashi Iwai850f0e52008-03-18 17:11:05 +01002036 snd_pcm_set_sync(substream);
Ingo Molnar62932df2006-01-16 16:34:20 +01002037 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002038 return 0;
2039}
2040
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002041static int azx_pcm_close(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002042{
2043 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2044 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002045 struct azx *chip = apcm->chip;
2046 struct azx_dev *azx_dev = get_azx_dev(substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002047 unsigned long flags;
2048
Ingo Molnar62932df2006-01-16 16:34:20 +01002049 mutex_lock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002050 spin_lock_irqsave(&chip->reg_lock, flags);
2051 azx_dev->substream = NULL;
2052 azx_dev->running = 0;
2053 spin_unlock_irqrestore(&chip->reg_lock, flags);
2054 azx_release_device(azx_dev);
2055 hinfo->ops.close(hinfo, apcm->codec, substream);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002056 snd_hda_power_down(apcm->codec);
Ingo Molnar62932df2006-01-16 16:34:20 +01002057 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002058 return 0;
2059}
2060
Takashi Iwaid01ce992007-07-27 16:52:19 +02002061static int azx_pcm_hw_params(struct snd_pcm_substream *substream,
2062 struct snd_pcm_hw_params *hw_params)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002063{
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002064 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2065 struct azx *chip = apcm->chip;
Takashi Iwai97b71c92009-03-18 15:09:13 +01002066 struct azx_dev *azx_dev = get_azx_dev(substream);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002067 int ret;
Takashi Iwai97b71c92009-03-18 15:09:13 +01002068
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002069 dsp_lock(azx_dev);
2070 if (dsp_is_locked(azx_dev)) {
2071 ret = -EBUSY;
2072 goto unlock;
2073 }
2074
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +01002075 mark_runtime_wc(chip, azx_dev, substream, false);
Takashi Iwai97b71c92009-03-18 15:09:13 +01002076 azx_dev->bufsize = 0;
2077 azx_dev->period_bytes = 0;
2078 azx_dev->format_val = 0;
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002079 ret = snd_pcm_lib_malloc_pages(substream,
Takashi Iwaid01ce992007-07-27 16:52:19 +02002080 params_buffer_bytes(hw_params));
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002081 if (ret < 0)
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002082 goto unlock;
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +01002083 mark_runtime_wc(chip, azx_dev, substream, true);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002084 unlock:
2085 dsp_unlock(azx_dev);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002086 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002087}
2088
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002089static int azx_pcm_hw_free(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002090{
2091 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002092 struct azx_dev *azx_dev = get_azx_dev(substream);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002093 struct azx *chip = apcm->chip;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002094 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
2095
2096 /* reset BDL address */
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002097 dsp_lock(azx_dev);
2098 if (!dsp_is_locked(azx_dev)) {
2099 azx_sd_writel(azx_dev, SD_BDLPL, 0);
2100 azx_sd_writel(azx_dev, SD_BDLPU, 0);
2101 azx_sd_writel(azx_dev, SD_CTL, 0);
2102 azx_dev->bufsize = 0;
2103 azx_dev->period_bytes = 0;
2104 azx_dev->format_val = 0;
2105 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002106
Takashi Iwaieb541332010-08-06 13:48:11 +02002107 snd_hda_codec_cleanup(apcm->codec, hinfo, substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002108
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +01002109 mark_runtime_wc(chip, azx_dev, substream, false);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002110 azx_dev->prepared = 0;
2111 dsp_unlock(azx_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002112 return snd_pcm_lib_free_pages(substream);
2113}
2114
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002115static int azx_pcm_prepare(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002116{
2117 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002118 struct azx *chip = apcm->chip;
2119 struct azx_dev *azx_dev = get_azx_dev(substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002120 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002121 struct snd_pcm_runtime *runtime = substream->runtime;
Takashi Iwai62b7e5e2010-10-22 17:15:47 +02002122 unsigned int bufsize, period_bytes, format_val, stream_tag;
Takashi Iwai97b71c92009-03-18 15:09:13 +01002123 int err;
Stephen Warren7c935972011-06-01 11:14:17 -06002124 struct hda_spdif_out *spdif =
2125 snd_hda_spdif_out_of_nid(apcm->codec, hinfo->nid);
2126 unsigned short ctls = spdif ? spdif->ctls : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002127
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002128 dsp_lock(azx_dev);
2129 if (dsp_is_locked(azx_dev)) {
2130 err = -EBUSY;
2131 goto unlock;
2132 }
2133
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002134 azx_stream_reset(chip, azx_dev);
Takashi Iwai97b71c92009-03-18 15:09:13 +01002135 format_val = snd_hda_calc_stream_format(runtime->rate,
2136 runtime->channels,
2137 runtime->format,
Anssi Hannula32c168c2010-08-03 13:28:57 +03002138 hinfo->maxbps,
Stephen Warren7c935972011-06-01 11:14:17 -06002139 ctls);
Takashi Iwai97b71c92009-03-18 15:09:13 +01002140 if (!format_val) {
Takashi Iwaid01ce992007-07-27 16:52:19 +02002141 snd_printk(KERN_ERR SFX
Daniel J Blueman445a51b2012-12-05 23:04:21 +08002142 "%s: invalid format_val, rate=%d, ch=%d, format=%d\n",
2143 pci_name(chip->pci), runtime->rate, runtime->channels, runtime->format);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002144 err = -EINVAL;
2145 goto unlock;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002146 }
2147
Takashi Iwai97b71c92009-03-18 15:09:13 +01002148 bufsize = snd_pcm_lib_buffer_bytes(substream);
2149 period_bytes = snd_pcm_lib_period_bytes(substream);
2150
Daniel J Blueman445a51b2012-12-05 23:04:21 +08002151 snd_printdd(SFX "%s: azx_pcm_prepare: bufsize=0x%x, format=0x%x\n",
2152 pci_name(chip->pci), bufsize, format_val);
Takashi Iwai97b71c92009-03-18 15:09:13 +01002153
2154 if (bufsize != azx_dev->bufsize ||
2155 period_bytes != azx_dev->period_bytes ||
Takashi Iwai915bf292012-09-11 15:19:10 +02002156 format_val != azx_dev->format_val ||
2157 runtime->no_period_wakeup != azx_dev->no_period_wakeup) {
Takashi Iwai97b71c92009-03-18 15:09:13 +01002158 azx_dev->bufsize = bufsize;
2159 azx_dev->period_bytes = period_bytes;
2160 azx_dev->format_val = format_val;
Takashi Iwai915bf292012-09-11 15:19:10 +02002161 azx_dev->no_period_wakeup = runtime->no_period_wakeup;
Takashi Iwai97b71c92009-03-18 15:09:13 +01002162 err = azx_setup_periods(chip, substream, azx_dev);
2163 if (err < 0)
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002164 goto unlock;
Takashi Iwai97b71c92009-03-18 15:09:13 +01002165 }
2166
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002167 /* wallclk has 24Mhz clock source */
2168 azx_dev->period_wallclk = (((runtime->period_size * 24000) /
2169 runtime->rate) * 1000);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002170 azx_setup_controller(chip, azx_dev);
2171 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
2172 azx_dev->fifo_size = azx_sd_readw(azx_dev, SD_FIFOSIZE) + 1;
2173 else
2174 azx_dev->fifo_size = 0;
2175
Takashi Iwai62b7e5e2010-10-22 17:15:47 +02002176 stream_tag = azx_dev->stream_tag;
2177 /* CA-IBG chips need the playback stream starting from 1 */
Takashi Iwai9477c582011-05-25 09:11:37 +02002178 if ((chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND) &&
Takashi Iwai62b7e5e2010-10-22 17:15:47 +02002179 stream_tag > chip->capture_streams)
2180 stream_tag -= chip->capture_streams;
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002181 err = snd_hda_codec_prepare(apcm->codec, hinfo, stream_tag,
Takashi Iwaieb541332010-08-06 13:48:11 +02002182 azx_dev->format_val, substream);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002183
2184 unlock:
2185 if (!err)
2186 azx_dev->prepared = 1;
2187 dsp_unlock(azx_dev);
2188 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002189}
2190
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002191static int azx_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002192{
2193 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002194 struct azx *chip = apcm->chip;
Takashi Iwai850f0e52008-03-18 17:11:05 +01002195 struct azx_dev *azx_dev;
2196 struct snd_pcm_substream *s;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002197 int rstart = 0, start, nsync = 0, sbits = 0;
Takashi Iwai850f0e52008-03-18 17:11:05 +01002198 int nwait, timeout;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002199
Takashi Iwai1a8506d2012-10-16 15:10:08 +02002200 azx_dev = get_azx_dev(substream);
2201 trace_azx_pcm_trigger(chip, azx_dev, cmd);
2202
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002203 if (dsp_is_locked(azx_dev) || !azx_dev->prepared)
2204 return -EPIPE;
2205
Linus Torvalds1da177e2005-04-16 15:20:36 -07002206 switch (cmd) {
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002207 case SNDRV_PCM_TRIGGER_START:
2208 rstart = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002209 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
2210 case SNDRV_PCM_TRIGGER_RESUME:
Takashi Iwai850f0e52008-03-18 17:11:05 +01002211 start = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002212 break;
2213 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
Jaroslav Kysela47123192005-08-15 20:53:07 +02002214 case SNDRV_PCM_TRIGGER_SUSPEND:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002215 case SNDRV_PCM_TRIGGER_STOP:
Takashi Iwai850f0e52008-03-18 17:11:05 +01002216 start = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002217 break;
2218 default:
Takashi Iwai850f0e52008-03-18 17:11:05 +01002219 return -EINVAL;
2220 }
2221
2222 snd_pcm_group_for_each_entry(s, substream) {
2223 if (s->pcm->card != substream->pcm->card)
2224 continue;
2225 azx_dev = get_azx_dev(s);
2226 sbits |= 1 << azx_dev->index;
2227 nsync++;
2228 snd_pcm_trigger_done(s, substream);
2229 }
2230
2231 spin_lock(&chip->reg_lock);
Pierre-Louis Bossart172d3b22012-09-21 18:39:05 -05002232
2233 /* first, set SYNC bits of corresponding streams */
2234 if (chip->driver_caps & AZX_DCAPS_OLD_SSYNC)
2235 azx_writel(chip, OLD_SSYNC,
2236 azx_readl(chip, OLD_SSYNC) | sbits);
2237 else
2238 azx_writel(chip, SSYNC, azx_readl(chip, SSYNC) | sbits);
2239
Takashi Iwai850f0e52008-03-18 17:11:05 +01002240 snd_pcm_group_for_each_entry(s, substream) {
2241 if (s->pcm->card != substream->pcm->card)
2242 continue;
2243 azx_dev = get_azx_dev(s);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002244 if (start) {
2245 azx_dev->start_wallclk = azx_readl(chip, WALLCLK);
2246 if (!rstart)
2247 azx_dev->start_wallclk -=
2248 azx_dev->period_wallclk;
Takashi Iwai850f0e52008-03-18 17:11:05 +01002249 azx_stream_start(chip, azx_dev);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002250 } else {
Takashi Iwai850f0e52008-03-18 17:11:05 +01002251 azx_stream_stop(chip, azx_dev);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002252 }
Takashi Iwai850f0e52008-03-18 17:11:05 +01002253 azx_dev->running = start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002254 }
2255 spin_unlock(&chip->reg_lock);
Takashi Iwai850f0e52008-03-18 17:11:05 +01002256 if (start) {
Takashi Iwai850f0e52008-03-18 17:11:05 +01002257 /* wait until all FIFOs get ready */
2258 for (timeout = 5000; timeout; timeout--) {
2259 nwait = 0;
2260 snd_pcm_group_for_each_entry(s, substream) {
2261 if (s->pcm->card != substream->pcm->card)
2262 continue;
2263 azx_dev = get_azx_dev(s);
2264 if (!(azx_sd_readb(azx_dev, SD_STS) &
2265 SD_STS_FIFO_READY))
2266 nwait++;
2267 }
2268 if (!nwait)
2269 break;
2270 cpu_relax();
2271 }
2272 } else {
2273 /* wait until all RUN bits are cleared */
2274 for (timeout = 5000; timeout; timeout--) {
2275 nwait = 0;
2276 snd_pcm_group_for_each_entry(s, substream) {
2277 if (s->pcm->card != substream->pcm->card)
2278 continue;
2279 azx_dev = get_azx_dev(s);
2280 if (azx_sd_readb(azx_dev, SD_CTL) &
2281 SD_CTL_DMA_START)
2282 nwait++;
2283 }
2284 if (!nwait)
2285 break;
2286 cpu_relax();
2287 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002288 }
Pierre-Louis Bossart172d3b22012-09-21 18:39:05 -05002289 spin_lock(&chip->reg_lock);
2290 /* reset SYNC bits */
2291 if (chip->driver_caps & AZX_DCAPS_OLD_SSYNC)
2292 azx_writel(chip, OLD_SSYNC,
2293 azx_readl(chip, OLD_SSYNC) & ~sbits);
2294 else
2295 azx_writel(chip, SSYNC, azx_readl(chip, SSYNC) & ~sbits);
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05002296 if (start) {
2297 azx_timecounter_init(substream, 0, 0);
2298 if (nsync > 1) {
2299 cycle_t cycle_last;
2300
2301 /* same start cycle for master and group */
2302 azx_dev = get_azx_dev(substream);
2303 cycle_last = azx_dev->azx_tc.cycle_last;
2304
2305 snd_pcm_group_for_each_entry(s, substream) {
2306 if (s->pcm->card != substream->pcm->card)
2307 continue;
2308 azx_timecounter_init(s, 1, cycle_last);
2309 }
2310 }
2311 }
Pierre-Louis Bossart172d3b22012-09-21 18:39:05 -05002312 spin_unlock(&chip->reg_lock);
Takashi Iwai850f0e52008-03-18 17:11:05 +01002313 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002314}
2315
Joseph Chan0e153472008-08-26 14:38:03 +02002316/* get the current DMA position with correction on VIA chips */
2317static unsigned int azx_via_get_position(struct azx *chip,
2318 struct azx_dev *azx_dev)
2319{
2320 unsigned int link_pos, mini_pos, bound_pos;
2321 unsigned int mod_link_pos, mod_dma_pos, mod_mini_pos;
2322 unsigned int fifo_size;
2323
2324 link_pos = azx_sd_readl(azx_dev, SD_LPIB);
Takashi Iwaib4a655e2011-06-07 12:26:56 +02002325 if (azx_dev->substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
Joseph Chan0e153472008-08-26 14:38:03 +02002326 /* Playback, no problem using link position */
2327 return link_pos;
2328 }
2329
2330 /* Capture */
2331 /* For new chipset,
2332 * use mod to get the DMA position just like old chipset
2333 */
2334 mod_dma_pos = le32_to_cpu(*azx_dev->posbuf);
2335 mod_dma_pos %= azx_dev->period_bytes;
2336
2337 /* azx_dev->fifo_size can't get FIFO size of in stream.
2338 * Get from base address + offset.
2339 */
2340 fifo_size = readw(chip->remap_addr + VIA_IN_STREAM0_FIFO_SIZE_OFFSET);
2341
2342 if (azx_dev->insufficient) {
2343 /* Link position never gather than FIFO size */
2344 if (link_pos <= fifo_size)
2345 return 0;
2346
2347 azx_dev->insufficient = 0;
2348 }
2349
2350 if (link_pos <= fifo_size)
2351 mini_pos = azx_dev->bufsize + link_pos - fifo_size;
2352 else
2353 mini_pos = link_pos - fifo_size;
2354
2355 /* Find nearest previous boudary */
2356 mod_mini_pos = mini_pos % azx_dev->period_bytes;
2357 mod_link_pos = link_pos % azx_dev->period_bytes;
2358 if (mod_link_pos >= fifo_size)
2359 bound_pos = link_pos - mod_link_pos;
2360 else if (mod_dma_pos >= mod_mini_pos)
2361 bound_pos = mini_pos - mod_mini_pos;
2362 else {
2363 bound_pos = mini_pos - mod_mini_pos + azx_dev->period_bytes;
2364 if (bound_pos >= azx_dev->bufsize)
2365 bound_pos = 0;
2366 }
2367
2368 /* Calculate real DMA position we want */
2369 return bound_pos + mod_dma_pos;
2370}
2371
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002372static unsigned int azx_get_position(struct azx *chip,
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002373 struct azx_dev *azx_dev,
2374 bool with_check)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002375{
Takashi Iwai21229612013-04-05 07:27:45 +02002376 struct snd_pcm_substream *substream = azx_dev->substream;
2377 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002378 unsigned int pos;
Takashi Iwai21229612013-04-05 07:27:45 +02002379 int stream = substream->stream;
2380 struct hda_pcm_stream *hinfo = apcm->hinfo[stream];
Takashi Iwai1a8506d2012-10-16 15:10:08 +02002381 int delay = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002382
David Henningsson4cb36312010-09-30 10:12:50 +02002383 switch (chip->position_fix[stream]) {
2384 case POS_FIX_LPIB:
2385 /* read LPIB */
2386 pos = azx_sd_readl(azx_dev, SD_LPIB);
2387 break;
2388 case POS_FIX_VIACOMBO:
Joseph Chan0e153472008-08-26 14:38:03 +02002389 pos = azx_via_get_position(chip, azx_dev);
David Henningsson4cb36312010-09-30 10:12:50 +02002390 break;
2391 default:
2392 /* use the position buffer */
2393 pos = le32_to_cpu(*azx_dev->posbuf);
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002394 if (with_check && chip->position_fix[stream] == POS_FIX_AUTO) {
Takashi Iwaia8103642011-06-07 12:23:23 +02002395 if (!pos || pos == (u32)-1) {
2396 printk(KERN_WARNING
2397 "hda-intel: Invalid position buffer, "
2398 "using LPIB read method instead.\n");
2399 chip->position_fix[stream] = POS_FIX_LPIB;
2400 pos = azx_sd_readl(azx_dev, SD_LPIB);
2401 } else
2402 chip->position_fix[stream] = POS_FIX_POSBUF;
2403 }
2404 break;
Takashi Iwaic74db862005-05-12 14:26:27 +02002405 }
David Henningsson4cb36312010-09-30 10:12:50 +02002406
Linus Torvalds1da177e2005-04-16 15:20:36 -07002407 if (pos >= azx_dev->bufsize)
2408 pos = 0;
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002409
2410 /* calculate runtime delay from LPIB */
Takashi Iwai21229612013-04-05 07:27:45 +02002411 if (substream->runtime &&
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002412 chip->position_fix[stream] == POS_FIX_POSBUF &&
2413 (chip->driver_caps & AZX_DCAPS_COUNT_LPIB_DELAY)) {
2414 unsigned int lpib_pos = azx_sd_readl(azx_dev, SD_LPIB);
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002415 if (stream == SNDRV_PCM_STREAM_PLAYBACK)
2416 delay = pos - lpib_pos;
2417 else
2418 delay = lpib_pos - pos;
2419 if (delay < 0)
2420 delay += azx_dev->bufsize;
2421 if (delay >= azx_dev->period_bytes) {
Takashi Iwai1f046612012-10-16 16:52:26 +02002422 snd_printk(KERN_WARNING SFX
Daniel J Blueman445a51b2012-12-05 23:04:21 +08002423 "%s: Unstable LPIB (%d >= %d); "
Takashi Iwai1f046612012-10-16 16:52:26 +02002424 "disabling LPIB delay counting\n",
Daniel J Blueman445a51b2012-12-05 23:04:21 +08002425 pci_name(chip->pci), delay, azx_dev->period_bytes);
Takashi Iwai1f046612012-10-16 16:52:26 +02002426 delay = 0;
2427 chip->driver_caps &= ~AZX_DCAPS_COUNT_LPIB_DELAY;
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002428 }
Takashi Iwai21229612013-04-05 07:27:45 +02002429 delay = bytes_to_frames(substream->runtime, delay);
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002430 }
Takashi Iwai21229612013-04-05 07:27:45 +02002431
2432 if (substream->runtime) {
2433 if (hinfo->ops.get_delay)
2434 delay += hinfo->ops.get_delay(hinfo, apcm->codec,
2435 substream);
2436 substream->runtime->delay = delay;
2437 }
2438
Takashi Iwai1a8506d2012-10-16 15:10:08 +02002439 trace_azx_get_position(chip, azx_dev, pos, delay);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002440 return pos;
2441}
2442
2443static snd_pcm_uframes_t azx_pcm_pointer(struct snd_pcm_substream *substream)
2444{
2445 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2446 struct azx *chip = apcm->chip;
2447 struct azx_dev *azx_dev = get_azx_dev(substream);
2448 return bytes_to_frames(substream->runtime,
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002449 azx_get_position(chip, azx_dev, false));
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002450}
2451
2452/*
2453 * Check whether the current DMA position is acceptable for updating
2454 * periods. Returns non-zero if it's OK.
2455 *
2456 * Many HD-audio controllers appear pretty inaccurate about
2457 * the update-IRQ timing. The IRQ is issued before actually the
2458 * data is processed. So, we need to process it afterwords in a
2459 * workqueue.
2460 */
2461static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev)
2462{
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002463 u32 wallclk;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002464 unsigned int pos;
2465
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002466 wallclk = azx_readl(chip, WALLCLK) - azx_dev->start_wallclk;
2467 if (wallclk < (azx_dev->period_wallclk * 2) / 3)
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002468 return -1; /* bogus (too early) interrupt */
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002469
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002470 pos = azx_get_position(chip, azx_dev, true);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002471
Takashi Iwaid6d8bf52010-02-12 18:17:06 +01002472 if (WARN_ONCE(!azx_dev->period_bytes,
2473 "hda-intel: zero azx_dev->period_bytes"))
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002474 return -1; /* this shouldn't happen! */
Jaroslav Kyselaedb39932010-06-02 13:29:17 +02002475 if (wallclk < (azx_dev->period_wallclk * 5) / 4 &&
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002476 pos % azx_dev->period_bytes > azx_dev->period_bytes / 2)
2477 /* NG - it's below the first next period boundary */
2478 return bdl_pos_adj[chip->dev_index] ? 0 : -1;
Jaroslav Kyselaedb39932010-06-02 13:29:17 +02002479 azx_dev->start_wallclk += wallclk;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002480 return 1; /* OK, it's fine */
2481}
2482
2483/*
2484 * The work for pending PCM period updates.
2485 */
2486static void azx_irq_pending_work(struct work_struct *work)
2487{
2488 struct azx *chip = container_of(work, struct azx, irq_pending_work);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002489 int i, pending, ok;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002490
Takashi Iwaia6a950a2008-06-10 17:53:35 +02002491 if (!chip->irq_pending_warned) {
2492 printk(KERN_WARNING
2493 "hda-intel: IRQ timing workaround is activated "
2494 "for card #%d. Suggest a bigger bdl_pos_adj.\n",
2495 chip->card->number);
2496 chip->irq_pending_warned = 1;
2497 }
2498
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002499 for (;;) {
2500 pending = 0;
2501 spin_lock_irq(&chip->reg_lock);
2502 for (i = 0; i < chip->num_streams; i++) {
2503 struct azx_dev *azx_dev = &chip->azx_dev[i];
2504 if (!azx_dev->irq_pending ||
2505 !azx_dev->substream ||
2506 !azx_dev->running)
2507 continue;
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002508 ok = azx_position_ok(chip, azx_dev);
2509 if (ok > 0) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002510 azx_dev->irq_pending = 0;
2511 spin_unlock(&chip->reg_lock);
2512 snd_pcm_period_elapsed(azx_dev->substream);
2513 spin_lock(&chip->reg_lock);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002514 } else if (ok < 0) {
2515 pending = 0; /* too early */
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002516 } else
2517 pending++;
2518 }
2519 spin_unlock_irq(&chip->reg_lock);
2520 if (!pending)
2521 return;
Takashi Iwai08af4952010-08-03 14:39:04 +02002522 msleep(1);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002523 }
2524}
2525
2526/* clear irq_pending flags and assure no on-going workq */
2527static void azx_clear_irq_pending(struct azx *chip)
2528{
2529 int i;
2530
2531 spin_lock_irq(&chip->reg_lock);
2532 for (i = 0; i < chip->num_streams; i++)
2533 chip->azx_dev[i].irq_pending = 0;
2534 spin_unlock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002535}
2536
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002537#ifdef CONFIG_X86
2538static int azx_pcm_mmap(struct snd_pcm_substream *substream,
2539 struct vm_area_struct *area)
2540{
2541 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2542 struct azx *chip = apcm->chip;
2543 if (!azx_snoop(chip))
2544 area->vm_page_prot = pgprot_writecombine(area->vm_page_prot);
2545 return snd_pcm_lib_default_mmap(substream, area);
2546}
2547#else
2548#define azx_pcm_mmap NULL
2549#endif
2550
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002551static struct snd_pcm_ops azx_pcm_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002552 .open = azx_pcm_open,
2553 .close = azx_pcm_close,
2554 .ioctl = snd_pcm_lib_ioctl,
2555 .hw_params = azx_pcm_hw_params,
2556 .hw_free = azx_pcm_hw_free,
2557 .prepare = azx_pcm_prepare,
2558 .trigger = azx_pcm_trigger,
2559 .pointer = azx_pcm_pointer,
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05002560 .wall_clock = azx_get_wallclock_tstamp,
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002561 .mmap = azx_pcm_mmap,
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002562 .page = snd_pcm_sgbuf_ops_page,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002563};
2564
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002565static void azx_pcm_free(struct snd_pcm *pcm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002566{
Takashi Iwai176d5332008-07-30 15:01:44 +02002567 struct azx_pcm *apcm = pcm->private_data;
2568 if (apcm) {
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002569 list_del(&apcm->list);
Takashi Iwai176d5332008-07-30 15:01:44 +02002570 kfree(apcm);
2571 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002572}
2573
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002574#define MAX_PREALLOC_SIZE (32 * 1024 * 1024)
2575
Takashi Iwai176d5332008-07-30 15:01:44 +02002576static int
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002577azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec,
2578 struct hda_pcm *cpcm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002579{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002580 struct azx *chip = bus->private_data;
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002581 struct snd_pcm *pcm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002582 struct azx_pcm *apcm;
Takashi Iwai176d5332008-07-30 15:01:44 +02002583 int pcm_dev = cpcm->device;
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002584 unsigned int size;
Takashi Iwai176d5332008-07-30 15:01:44 +02002585 int s, err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002586
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002587 list_for_each_entry(apcm, &chip->pcm_list, list) {
2588 if (apcm->pcm->device == pcm_dev) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08002589 snd_printk(KERN_ERR SFX "%s: PCM %d already exists\n",
2590 pci_name(chip->pci), pcm_dev);
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002591 return -EBUSY;
2592 }
Takashi Iwai176d5332008-07-30 15:01:44 +02002593 }
2594 err = snd_pcm_new(chip->card, cpcm->name, pcm_dev,
2595 cpcm->stream[SNDRV_PCM_STREAM_PLAYBACK].substreams,
2596 cpcm->stream[SNDRV_PCM_STREAM_CAPTURE].substreams,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002597 &pcm);
2598 if (err < 0)
2599 return err;
Takashi Iwai18cb7102009-04-16 10:22:24 +02002600 strlcpy(pcm->name, cpcm->name, sizeof(pcm->name));
Takashi Iwai176d5332008-07-30 15:01:44 +02002601 apcm = kzalloc(sizeof(*apcm), GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002602 if (apcm == NULL)
2603 return -ENOMEM;
2604 apcm->chip = chip;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002605 apcm->pcm = pcm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002606 apcm->codec = codec;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002607 pcm->private_data = apcm;
2608 pcm->private_free = azx_pcm_free;
Takashi Iwai176d5332008-07-30 15:01:44 +02002609 if (cpcm->pcm_type == HDA_PCM_TYPE_MODEM)
2610 pcm->dev_class = SNDRV_PCM_CLASS_MODEM;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002611 list_add_tail(&apcm->list, &chip->pcm_list);
Takashi Iwai176d5332008-07-30 15:01:44 +02002612 cpcm->pcm = pcm;
2613 for (s = 0; s < 2; s++) {
2614 apcm->hinfo[s] = &cpcm->stream[s];
2615 if (cpcm->stream[s].substreams)
2616 snd_pcm_set_ops(pcm, s, &azx_pcm_ops);
2617 }
2618 /* buffer pre-allocation */
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002619 size = CONFIG_SND_HDA_PREALLOC_SIZE * 1024;
2620 if (size > MAX_PREALLOC_SIZE)
2621 size = MAX_PREALLOC_SIZE;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002622 snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV_SG,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002623 snd_dma_pci_data(chip->pci),
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002624 size, MAX_PREALLOC_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002625 return 0;
2626}
2627
2628/*
2629 * mixer creation - all stuff is implemented in hda module
2630 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05002631static int azx_mixer_create(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002632{
2633 return snd_hda_build_controls(chip->bus);
2634}
2635
2636
2637/*
2638 * initialize SD streams
2639 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05002640static int azx_init_stream(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002641{
2642 int i;
2643
2644 /* initialize each stream (aka device)
Takashi Iwaid01ce992007-07-27 16:52:19 +02002645 * assign the starting bdl address to each stream (device)
2646 * and initialize
Linus Torvalds1da177e2005-04-16 15:20:36 -07002647 */
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002648 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002649 struct azx_dev *azx_dev = &chip->azx_dev[i];
Takashi Iwai929861c2006-08-31 16:55:40 +02002650 azx_dev->posbuf = (u32 __iomem *)(chip->posbuf.area + i * 8);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002651 /* offset: SDI0=0x80, SDI1=0xa0, ... SDO3=0x160 */
2652 azx_dev->sd_addr = chip->remap_addr + (0x20 * i + 0x80);
2653 /* int mask: SDI0=0x01, SDI1=0x02, ... SDO3=0x80 */
2654 azx_dev->sd_int_sta_mask = 1 << i;
2655 /* stream tag: must be non-zero and unique */
2656 azx_dev->index = i;
2657 azx_dev->stream_tag = i + 1;
2658 }
2659
2660 return 0;
2661}
2662
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002663static int azx_acquire_irq(struct azx *chip, int do_disconnect)
2664{
Takashi Iwai437a5a42006-11-21 12:14:23 +01002665 if (request_irq(chip->pci->irq, azx_interrupt,
2666 chip->msi ? 0 : IRQF_SHARED,
Takashi Iwai934c2b62011-06-10 16:36:37 +02002667 KBUILD_MODNAME, chip)) {
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002668 printk(KERN_ERR "hda-intel: unable to grab IRQ %d, "
2669 "disabling device\n", chip->pci->irq);
2670 if (do_disconnect)
2671 snd_card_disconnect(chip->card);
2672 return -1;
2673 }
2674 chip->irq = chip->pci->irq;
Takashi Iwai69e13412006-11-21 12:10:55 +01002675 pci_intx(chip->pci, !chip->msi);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002676 return 0;
2677}
2678
Linus Torvalds1da177e2005-04-16 15:20:36 -07002679
Takashi Iwaicb53c622007-08-10 17:21:45 +02002680static void azx_stop_chip(struct azx *chip)
2681{
Takashi Iwai95e99fd2007-08-13 15:29:04 +02002682 if (!chip->initialized)
Takashi Iwaicb53c622007-08-10 17:21:45 +02002683 return;
2684
2685 /* disable interrupts */
2686 azx_int_disable(chip);
2687 azx_int_clear(chip);
2688
2689 /* disable CORB/RIRB */
2690 azx_free_cmd_io(chip);
2691
2692 /* disable position buffer */
2693 azx_writel(chip, DPLBASE, 0);
2694 azx_writel(chip, DPUBASE, 0);
2695
2696 chip->initialized = 0;
2697}
2698
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002699#ifdef CONFIG_SND_HDA_DSP_LOADER
2700/*
2701 * DSP loading code (e.g. for CA0132)
2702 */
2703
2704/* use the first stream for loading DSP */
2705static struct azx_dev *
2706azx_get_dsp_loader_dev(struct azx *chip)
2707{
2708 return &chip->azx_dev[chip->playback_index_offset];
2709}
2710
2711static int azx_load_dsp_prepare(struct hda_bus *bus, unsigned int format,
2712 unsigned int byte_size,
2713 struct snd_dma_buffer *bufp)
2714{
2715 u32 *bdl;
2716 struct azx *chip = bus->private_data;
2717 struct azx_dev *azx_dev;
2718 int err;
2719
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002720 azx_dev = azx_get_dsp_loader_dev(chip);
2721
2722 dsp_lock(azx_dev);
2723 spin_lock_irq(&chip->reg_lock);
2724 if (azx_dev->running || azx_dev->locked) {
2725 spin_unlock_irq(&chip->reg_lock);
2726 err = -EBUSY;
2727 goto unlock;
2728 }
2729 azx_dev->prepared = 0;
2730 chip->saved_azx_dev = *azx_dev;
2731 azx_dev->locked = 1;
2732 spin_unlock_irq(&chip->reg_lock);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002733
2734 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV_SG,
2735 snd_dma_pci_data(chip->pci),
2736 byte_size, bufp);
2737 if (err < 0)
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002738 goto err_alloc;
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002739
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002740 mark_pages_wc(chip, bufp, true);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002741 azx_dev->bufsize = byte_size;
2742 azx_dev->period_bytes = byte_size;
2743 azx_dev->format_val = format;
2744
2745 azx_stream_reset(chip, azx_dev);
2746
2747 /* reset BDL address */
2748 azx_sd_writel(azx_dev, SD_BDLPL, 0);
2749 azx_sd_writel(azx_dev, SD_BDLPU, 0);
2750
2751 azx_dev->frags = 0;
2752 bdl = (u32 *)azx_dev->bdl.area;
2753 err = setup_bdle(chip, bufp, azx_dev, &bdl, 0, byte_size, 0);
2754 if (err < 0)
2755 goto error;
2756
2757 azx_setup_controller(chip, azx_dev);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002758 dsp_unlock(azx_dev);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002759 return azx_dev->stream_tag;
2760
2761 error:
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002762 mark_pages_wc(chip, bufp, false);
2763 snd_dma_free_pages(bufp);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002764 err_alloc:
2765 spin_lock_irq(&chip->reg_lock);
2766 if (azx_dev->opened)
2767 *azx_dev = chip->saved_azx_dev;
2768 azx_dev->locked = 0;
2769 spin_unlock_irq(&chip->reg_lock);
2770 unlock:
2771 dsp_unlock(azx_dev);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002772 return err;
2773}
2774
2775static void azx_load_dsp_trigger(struct hda_bus *bus, bool start)
2776{
2777 struct azx *chip = bus->private_data;
2778 struct azx_dev *azx_dev = azx_get_dsp_loader_dev(chip);
2779
2780 if (start)
2781 azx_stream_start(chip, azx_dev);
2782 else
2783 azx_stream_stop(chip, azx_dev);
2784 azx_dev->running = start;
2785}
2786
2787static void azx_load_dsp_cleanup(struct hda_bus *bus,
2788 struct snd_dma_buffer *dmab)
2789{
2790 struct azx *chip = bus->private_data;
2791 struct azx_dev *azx_dev = azx_get_dsp_loader_dev(chip);
2792
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002793 if (!dmab->area || !azx_dev->locked)
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002794 return;
2795
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002796 dsp_lock(azx_dev);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002797 /* reset BDL address */
2798 azx_sd_writel(azx_dev, SD_BDLPL, 0);
2799 azx_sd_writel(azx_dev, SD_BDLPU, 0);
2800 azx_sd_writel(azx_dev, SD_CTL, 0);
2801 azx_dev->bufsize = 0;
2802 azx_dev->period_bytes = 0;
2803 azx_dev->format_val = 0;
2804
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002805 mark_pages_wc(chip, dmab, false);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002806 snd_dma_free_pages(dmab);
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002807 dmab->area = NULL;
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002808
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002809 spin_lock_irq(&chip->reg_lock);
2810 if (azx_dev->opened)
2811 *azx_dev = chip->saved_azx_dev;
2812 azx_dev->locked = 0;
2813 spin_unlock_irq(&chip->reg_lock);
2814 dsp_unlock(azx_dev);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002815}
2816#endif /* CONFIG_SND_HDA_DSP_LOADER */
2817
Takashi Iwai83012a72012-08-24 18:38:08 +02002818#ifdef CONFIG_PM
Takashi Iwaicb53c622007-08-10 17:21:45 +02002819/* power-up/down the controller */
Takashi Iwai68467f52012-08-28 09:14:29 -07002820static void azx_power_notify(struct hda_bus *bus, bool power_up)
Takashi Iwaicb53c622007-08-10 17:21:45 +02002821{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002822 struct azx *chip = bus->private_data;
Takashi Iwaicb53c622007-08-10 17:21:45 +02002823
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01002824 if (!(chip->driver_caps & AZX_DCAPS_PM_RUNTIME))
2825 return;
2826
Takashi Iwai68467f52012-08-28 09:14:29 -07002827 if (power_up)
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002828 pm_runtime_get_sync(&chip->pci->dev);
2829 else
2830 pm_runtime_put_sync(&chip->pci->dev);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002831}
Takashi Iwai65fcd412012-08-14 17:13:32 +02002832
2833static DEFINE_MUTEX(card_list_lock);
2834static LIST_HEAD(card_list);
2835
2836static void azx_add_card_list(struct azx *chip)
2837{
2838 mutex_lock(&card_list_lock);
2839 list_add(&chip->list, &card_list);
2840 mutex_unlock(&card_list_lock);
2841}
2842
2843static void azx_del_card_list(struct azx *chip)
2844{
2845 mutex_lock(&card_list_lock);
2846 list_del_init(&chip->list);
2847 mutex_unlock(&card_list_lock);
2848}
2849
2850/* trigger power-save check at writing parameter */
2851static int param_set_xint(const char *val, const struct kernel_param *kp)
2852{
2853 struct azx *chip;
2854 struct hda_codec *c;
2855 int prev = power_save;
2856 int ret = param_set_int(val, kp);
2857
2858 if (ret || prev == power_save)
2859 return ret;
2860
2861 mutex_lock(&card_list_lock);
2862 list_for_each_entry(chip, &card_list, list) {
2863 if (!chip->bus || chip->disabled)
2864 continue;
2865 list_for_each_entry(c, &chip->bus->codec_list, list)
2866 snd_hda_power_sync(c);
2867 }
2868 mutex_unlock(&card_list_lock);
2869 return 0;
2870}
2871#else
2872#define azx_add_card_list(chip) /* NOP */
2873#define azx_del_card_list(chip) /* NOP */
Takashi Iwai83012a72012-08-24 18:38:08 +02002874#endif /* CONFIG_PM */
Takashi Iwai5c0b9be2008-12-11 11:47:17 +01002875
Takashi Iwai7ccbde52012-08-14 18:10:09 +02002876#if defined(CONFIG_PM_SLEEP) || defined(SUPPORT_VGA_SWITCHEROO)
Takashi Iwai5c0b9be2008-12-11 11:47:17 +01002877/*
2878 * power management
2879 */
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002880static int azx_suspend(struct device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002881{
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002882 struct pci_dev *pci = to_pci_dev(dev);
2883 struct snd_card *card = dev_get_drvdata(dev);
Takashi Iwai421a1252005-11-17 16:11:09 +01002884 struct azx *chip = card->private_data;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002885 struct azx_pcm *p;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002886
Takashi Iwaic5c21522012-12-04 17:01:25 +01002887 if (chip->disabled)
2888 return 0;
2889
Takashi Iwai421a1252005-11-17 16:11:09 +01002890 snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002891 azx_clear_irq_pending(chip);
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002892 list_for_each_entry(p, &chip->pcm_list, list)
2893 snd_pcm_suspend_all(p->pcm);
Takashi Iwai0b7a2e92007-08-14 15:18:26 +02002894 if (chip->initialized)
Takashi Iwai8dd78332009-06-02 01:16:07 +02002895 snd_hda_suspend(chip->bus);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002896 azx_stop_chip(chip);
Takashi Iwai30b35392006-10-11 18:52:53 +02002897 if (chip->irq >= 0) {
Takashi Iwai43001c92006-09-08 12:30:03 +02002898 free_irq(chip->irq, chip);
Takashi Iwai30b35392006-10-11 18:52:53 +02002899 chip->irq = -1;
2900 }
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002901 if (chip->msi)
Takashi Iwai43001c92006-09-08 12:30:03 +02002902 pci_disable_msi(chip->pci);
Takashi Iwai421a1252005-11-17 16:11:09 +01002903 pci_disable_device(pci);
2904 pci_save_state(pci);
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002905 pci_set_power_state(pci, PCI_D3hot);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002906 return 0;
2907}
2908
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002909static int azx_resume(struct device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002910{
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002911 struct pci_dev *pci = to_pci_dev(dev);
2912 struct snd_card *card = dev_get_drvdata(dev);
Takashi Iwai421a1252005-11-17 16:11:09 +01002913 struct azx *chip = card->private_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002914
Takashi Iwaic5c21522012-12-04 17:01:25 +01002915 if (chip->disabled)
2916 return 0;
2917
Takashi Iwaid14a7e02009-02-16 10:13:03 +01002918 pci_set_power_state(pci, PCI_D0);
2919 pci_restore_state(pci);
Takashi Iwai30b35392006-10-11 18:52:53 +02002920 if (pci_enable_device(pci) < 0) {
2921 printk(KERN_ERR "hda-intel: pci_enable_device failed, "
2922 "disabling device\n");
2923 snd_card_disconnect(card);
2924 return -EIO;
2925 }
2926 pci_set_master(pci);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002927 if (chip->msi)
2928 if (pci_enable_msi(pci) < 0)
2929 chip->msi = 0;
2930 if (azx_acquire_irq(chip, 1) < 0)
Takashi Iwai30b35392006-10-11 18:52:53 +02002931 return -EIO;
Takashi Iwaicb53c622007-08-10 17:21:45 +02002932 azx_init_pci(chip);
Maxim Levitskyd804ad92007-09-03 15:28:04 +02002933
Takashi Iwai7f308302012-05-08 16:52:23 +02002934 azx_init_chip(chip, 1);
Maxim Levitskyd804ad92007-09-03 15:28:04 +02002935
Linus Torvalds1da177e2005-04-16 15:20:36 -07002936 snd_hda_resume(chip->bus);
Takashi Iwai421a1252005-11-17 16:11:09 +01002937 snd_power_change_state(card, SNDRV_CTL_POWER_D0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002938 return 0;
2939}
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002940#endif /* CONFIG_PM_SLEEP || SUPPORT_VGA_SWITCHEROO */
2941
2942#ifdef CONFIG_PM_RUNTIME
2943static int azx_runtime_suspend(struct device *dev)
2944{
2945 struct snd_card *card = dev_get_drvdata(dev);
2946 struct azx *chip = card->private_data;
2947
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002948 azx_stop_chip(chip);
2949 azx_clear_irq_pending(chip);
2950 return 0;
2951}
2952
2953static int azx_runtime_resume(struct device *dev)
2954{
2955 struct snd_card *card = dev_get_drvdata(dev);
2956 struct azx *chip = card->private_data;
2957
2958 azx_init_pci(chip);
2959 azx_init_chip(chip, 1);
2960 return 0;
2961}
Takashi Iwai6eb827d2012-12-12 11:50:12 +01002962
2963static int azx_runtime_idle(struct device *dev)
2964{
2965 struct snd_card *card = dev_get_drvdata(dev);
2966 struct azx *chip = card->private_data;
2967
2968 if (!power_save_controller ||
2969 !(chip->driver_caps & AZX_DCAPS_PM_RUNTIME))
2970 return -EBUSY;
2971
2972 return 0;
2973}
2974
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002975#endif /* CONFIG_PM_RUNTIME */
2976
2977#ifdef CONFIG_PM
2978static const struct dev_pm_ops azx_pm = {
2979 SET_SYSTEM_SLEEP_PM_OPS(azx_suspend, azx_resume)
Takashi Iwai6eb827d2012-12-12 11:50:12 +01002980 SET_RUNTIME_PM_OPS(azx_runtime_suspend, azx_runtime_resume, azx_runtime_idle)
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002981};
2982
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002983#define AZX_PM_OPS &azx_pm
2984#else
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002985#define AZX_PM_OPS NULL
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002986#endif /* CONFIG_PM */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002987
2988
2989/*
Takashi Iwai0cbf0092008-10-29 16:18:25 +01002990 * reboot notifier for hang-up problem at power-down
2991 */
2992static int azx_halt(struct notifier_block *nb, unsigned long event, void *buf)
2993{
2994 struct azx *chip = container_of(nb, struct azx, reboot_notifier);
Takashi Iwaifb8d1a32009-11-10 16:02:29 +01002995 snd_hda_bus_reboot_notify(chip->bus);
Takashi Iwai0cbf0092008-10-29 16:18:25 +01002996 azx_stop_chip(chip);
2997 return NOTIFY_OK;
2998}
2999
3000static void azx_notifier_register(struct azx *chip)
3001{
3002 chip->reboot_notifier.notifier_call = azx_halt;
3003 register_reboot_notifier(&chip->reboot_notifier);
3004}
3005
3006static void azx_notifier_unregister(struct azx *chip)
3007{
3008 if (chip->reboot_notifier.notifier_call)
3009 unregister_reboot_notifier(&chip->reboot_notifier);
3010}
3011
Takashi Iwai48c8b0e2012-12-07 07:40:35 +01003012static int azx_first_init(struct azx *chip);
3013static int azx_probe_continue(struct azx *chip);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003014
Steven Newbury8393ec4a2012-06-08 13:06:29 +02003015#ifdef SUPPORT_VGA_SWITCHEROO
Bill Pembertone23e7a12012-12-06 12:35:10 -05003016static struct pci_dev *get_bound_vga(struct pci_dev *pci);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003017
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003018static void azx_vs_set_state(struct pci_dev *pci,
3019 enum vga_switcheroo_state state)
3020{
3021 struct snd_card *card = pci_get_drvdata(pci);
3022 struct azx *chip = card->private_data;
3023 bool disabled;
3024
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003025 wait_for_completion(&chip->probe_wait);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003026 if (chip->init_failed)
3027 return;
3028
3029 disabled = (state == VGA_SWITCHEROO_OFF);
3030 if (chip->disabled == disabled)
3031 return;
3032
3033 if (!chip->bus) {
3034 chip->disabled = disabled;
3035 if (!disabled) {
3036 snd_printk(KERN_INFO SFX
3037 "%s: Start delayed initialization\n",
3038 pci_name(chip->pci));
3039 if (azx_first_init(chip) < 0 ||
3040 azx_probe_continue(chip) < 0) {
3041 snd_printk(KERN_ERR SFX
3042 "%s: initialization error\n",
3043 pci_name(chip->pci));
3044 chip->init_failed = true;
3045 }
3046 }
3047 } else {
3048 snd_printk(KERN_INFO SFX
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003049 "%s: %s via VGA-switcheroo\n", pci_name(chip->pci),
3050 disabled ? "Disabling" : "Enabling");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003051 if (disabled) {
Takashi Iwai68cb2b52012-07-02 15:20:37 +02003052 azx_suspend(&pci->dev);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003053 chip->disabled = true;
Takashi Iwai128960a2012-10-12 17:28:18 +02003054 if (snd_hda_lock_devices(chip->bus))
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003055 snd_printk(KERN_WARNING SFX "%s: Cannot lock devices!\n",
3056 pci_name(chip->pci));
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003057 } else {
3058 snd_hda_unlock_devices(chip->bus);
3059 chip->disabled = false;
Takashi Iwai68cb2b52012-07-02 15:20:37 +02003060 azx_resume(&pci->dev);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003061 }
3062 }
3063}
3064
3065static bool azx_vs_can_switch(struct pci_dev *pci)
3066{
3067 struct snd_card *card = pci_get_drvdata(pci);
3068 struct azx *chip = card->private_data;
3069
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003070 wait_for_completion(&chip->probe_wait);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003071 if (chip->init_failed)
3072 return false;
3073 if (chip->disabled || !chip->bus)
3074 return true;
3075 if (snd_hda_lock_devices(chip->bus))
3076 return false;
3077 snd_hda_unlock_devices(chip->bus);
3078 return true;
3079}
3080
Bill Pembertone23e7a12012-12-06 12:35:10 -05003081static void init_vga_switcheroo(struct azx *chip)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003082{
3083 struct pci_dev *p = get_bound_vga(chip->pci);
3084 if (p) {
3085 snd_printk(KERN_INFO SFX
3086 "%s: Handle VGA-switcheroo audio client\n",
3087 pci_name(chip->pci));
3088 chip->use_vga_switcheroo = 1;
3089 pci_dev_put(p);
3090 }
3091}
3092
3093static const struct vga_switcheroo_client_ops azx_vs_ops = {
3094 .set_gpu_state = azx_vs_set_state,
3095 .can_switch = azx_vs_can_switch,
3096};
3097
Bill Pembertone23e7a12012-12-06 12:35:10 -05003098static int register_vga_switcheroo(struct azx *chip)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003099{
Takashi Iwai128960a2012-10-12 17:28:18 +02003100 int err;
3101
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003102 if (!chip->use_vga_switcheroo)
3103 return 0;
3104 /* FIXME: currently only handling DIS controller
3105 * is there any machine with two switchable HDMI audio controllers?
3106 */
Takashi Iwai128960a2012-10-12 17:28:18 +02003107 err = vga_switcheroo_register_audio_client(chip->pci, &azx_vs_ops,
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003108 VGA_SWITCHEROO_DIS,
3109 chip->bus != NULL);
Takashi Iwai128960a2012-10-12 17:28:18 +02003110 if (err < 0)
3111 return err;
3112 chip->vga_switcheroo_registered = 1;
3113 return 0;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003114}
3115#else
3116#define init_vga_switcheroo(chip) /* NOP */
3117#define register_vga_switcheroo(chip) 0
Steven Newbury8393ec4a2012-06-08 13:06:29 +02003118#define check_hdmi_disabled(pci) false
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003119#endif /* SUPPORT_VGA_SWITCHER */
3120
Takashi Iwai0cbf0092008-10-29 16:18:25 +01003121/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07003122 * destructor
3123 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01003124static int azx_free(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003125{
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003126 int i;
3127
Takashi Iwai65fcd412012-08-14 17:13:32 +02003128 azx_del_card_list(chip);
3129
Takashi Iwai0cbf0092008-10-29 16:18:25 +01003130 azx_notifier_unregister(chip);
3131
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003132 chip->init_failed = 1; /* to be sure */
Daniel J Blueman44728e92012-12-18 23:59:33 +08003133 complete_all(&chip->probe_wait);
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003134
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003135 if (use_vga_switcheroo(chip)) {
3136 if (chip->disabled && chip->bus)
3137 snd_hda_unlock_devices(chip->bus);
Takashi Iwai128960a2012-10-12 17:28:18 +02003138 if (chip->vga_switcheroo_registered)
3139 vga_switcheroo_unregister_client(chip->pci);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003140 }
3141
Takashi Iwaice43fba2005-05-30 20:33:44 +02003142 if (chip->initialized) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02003143 azx_clear_irq_pending(chip);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003144 for (i = 0; i < chip->num_streams; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003145 azx_stream_stop(chip, &chip->azx_dev[i]);
Takashi Iwaicb53c622007-08-10 17:21:45 +02003146 azx_stop_chip(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003147 }
3148
Jeff Garzikf000fd82008-04-22 13:50:34 +02003149 if (chip->irq >= 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003150 free_irq(chip->irq, (void*)chip);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02003151 if (chip->msi)
Takashi Iwai30b35392006-10-11 18:52:53 +02003152 pci_disable_msi(chip->pci);
Takashi Iwaif079c252006-06-01 11:42:14 +02003153 if (chip->remap_addr)
3154 iounmap(chip->remap_addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003155
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003156 if (chip->azx_dev) {
3157 for (i = 0; i < chip->num_streams; i++)
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003158 if (chip->azx_dev[i].bdl.area) {
3159 mark_pages_wc(chip, &chip->azx_dev[i].bdl, false);
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003160 snd_dma_free_pages(&chip->azx_dev[i].bdl);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003161 }
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003162 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003163 if (chip->rb.area) {
3164 mark_pages_wc(chip, &chip->rb, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003165 snd_dma_free_pages(&chip->rb);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003166 }
3167 if (chip->posbuf.area) {
3168 mark_pages_wc(chip, &chip->posbuf, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003169 snd_dma_free_pages(&chip->posbuf);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003170 }
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003171 if (chip->region_requested)
3172 pci_release_regions(chip->pci);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003173 pci_disable_device(chip->pci);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003174 kfree(chip->azx_dev);
Takashi Iwai4918cda2012-08-09 12:33:28 +02003175#ifdef CONFIG_SND_HDA_PATCH_LOADER
3176 if (chip->fw)
3177 release_firmware(chip->fw);
3178#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07003179 kfree(chip);
3180
3181 return 0;
3182}
3183
Takashi Iwaia98f90f2005-11-17 14:59:02 +01003184static int azx_dev_free(struct snd_device *device)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003185{
3186 return azx_free(device->device_data);
3187}
3188
Steven Newbury8393ec4a2012-06-08 13:06:29 +02003189#ifdef SUPPORT_VGA_SWITCHEROO
Linus Torvalds1da177e2005-04-16 15:20:36 -07003190/*
Takashi Iwai91219472012-04-26 12:13:25 +02003191 * Check of disabled HDMI controller by vga-switcheroo
3192 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003193static struct pci_dev *get_bound_vga(struct pci_dev *pci)
Takashi Iwai91219472012-04-26 12:13:25 +02003194{
3195 struct pci_dev *p;
3196
3197 /* check only discrete GPU */
3198 switch (pci->vendor) {
3199 case PCI_VENDOR_ID_ATI:
3200 case PCI_VENDOR_ID_AMD:
3201 case PCI_VENDOR_ID_NVIDIA:
3202 if (pci->devfn == 1) {
3203 p = pci_get_domain_bus_and_slot(pci_domain_nr(pci->bus),
3204 pci->bus->number, 0);
3205 if (p) {
3206 if ((p->class >> 8) == PCI_CLASS_DISPLAY_VGA)
3207 return p;
3208 pci_dev_put(p);
3209 }
3210 }
3211 break;
3212 }
3213 return NULL;
3214}
3215
Bill Pembertone23e7a12012-12-06 12:35:10 -05003216static bool check_hdmi_disabled(struct pci_dev *pci)
Takashi Iwai91219472012-04-26 12:13:25 +02003217{
3218 bool vga_inactive = false;
3219 struct pci_dev *p = get_bound_vga(pci);
3220
3221 if (p) {
Takashi Iwai12b78a72012-06-07 12:15:16 +02003222 if (vga_switcheroo_get_client_state(p) == VGA_SWITCHEROO_OFF)
Takashi Iwai91219472012-04-26 12:13:25 +02003223 vga_inactive = true;
3224 pci_dev_put(p);
3225 }
3226 return vga_inactive;
3227}
Steven Newbury8393ec4a2012-06-08 13:06:29 +02003228#endif /* SUPPORT_VGA_SWITCHEROO */
Takashi Iwai91219472012-04-26 12:13:25 +02003229
3230/*
Takashi Iwai3372a152007-02-01 15:46:50 +01003231 * white/black-listing for position_fix
3232 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003233static struct snd_pci_quirk position_fix_list[] = {
Takashi Iwaid2e1c972008-06-10 17:53:34 +02003234 SND_PCI_QUIRK(0x1028, 0x01cc, "Dell D820", POS_FIX_LPIB),
3235 SND_PCI_QUIRK(0x1028, 0x01de, "Dell Precision 390", POS_FIX_LPIB),
Takashi Iwai2f703e72009-12-01 14:17:37 +01003236 SND_PCI_QUIRK(0x103c, 0x306d, "HP dv3", POS_FIX_LPIB),
Takashi Iwaid2e1c972008-06-10 17:53:34 +02003237 SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB),
Daniel T Chendd37f8e2010-05-30 01:17:03 -04003238 SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS", POS_FIX_LPIB),
Daniel T Chen9f75c1b2010-05-30 13:08:41 -04003239 SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS M2V", POS_FIX_LPIB),
Daniel T Chene96d3122010-05-27 18:32:18 -04003240 SND_PCI_QUIRK(0x104d, 0x9069, "Sony VPCS11V9E", POS_FIX_LPIB),
David Henningssonb01de4f2012-01-12 16:31:14 +01003241 SND_PCI_QUIRK(0x10de, 0xcb89, "Macbook Pro 7,1", POS_FIX_LPIB),
Daniel T Chen61bb42c2010-05-29 11:04:11 -04003242 SND_PCI_QUIRK(0x1297, 0x3166, "Shuttle", POS_FIX_LPIB),
Daniel T Chen9ec8dda2010-03-28 02:34:40 -04003243 SND_PCI_QUIRK(0x1458, 0xa022, "ga-ma770-ud3", POS_FIX_LPIB),
Takashi Iwai45d4ebf2009-11-30 11:58:30 +01003244 SND_PCI_QUIRK(0x1462, 0x1002, "MSI Wind U115", POS_FIX_LPIB),
Takashi Iwai8815cd02010-04-15 09:02:41 +02003245 SND_PCI_QUIRK(0x1565, 0x8218, "Biostar Microtech", POS_FIX_LPIB),
Daniel T Chenb90c0762010-05-30 19:31:41 -04003246 SND_PCI_QUIRK(0x1849, 0x0888, "775Dual-VSTA", POS_FIX_LPIB),
Daniel T Chen0e0280d2010-04-21 19:55:43 -04003247 SND_PCI_QUIRK(0x8086, 0x2503, "DG965OT AAD63733-203", POS_FIX_LPIB),
Takashi Iwai3372a152007-02-01 15:46:50 +01003248 {}
3249};
3250
Bill Pembertone23e7a12012-12-06 12:35:10 -05003251static int check_position_fix(struct azx *chip, int fix)
Takashi Iwai3372a152007-02-01 15:46:50 +01003252{
3253 const struct snd_pci_quirk *q;
3254
Takashi Iwaic673ba12009-03-17 07:49:14 +01003255 switch (fix) {
Takashi Iwai1dac6692012-09-13 14:59:47 +02003256 case POS_FIX_AUTO:
Takashi Iwaic673ba12009-03-17 07:49:14 +01003257 case POS_FIX_LPIB:
3258 case POS_FIX_POSBUF:
David Henningsson4cb36312010-09-30 10:12:50 +02003259 case POS_FIX_VIACOMBO:
Takashi Iwaia6f2fd52012-02-28 11:58:40 +01003260 case POS_FIX_COMBO:
Takashi Iwaic673ba12009-03-17 07:49:14 +01003261 return fix;
3262 }
3263
Takashi Iwaic673ba12009-03-17 07:49:14 +01003264 q = snd_pci_quirk_lookup(chip->pci, position_fix_list);
3265 if (q) {
3266 printk(KERN_INFO
3267 "hda_intel: position_fix set to %d "
3268 "for device %04x:%04x\n",
3269 q->value, q->subvendor, q->subdevice);
3270 return q->value;
Takashi Iwai3372a152007-02-01 15:46:50 +01003271 }
David Henningssonbdd9ef22010-10-04 12:02:14 +02003272
3273 /* Check VIA/ATI HD Audio Controller exist */
Takashi Iwai9477c582011-05-25 09:11:37 +02003274 if (chip->driver_caps & AZX_DCAPS_POSFIX_VIA) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003275 snd_printd(SFX "%s: Using VIACOMBO position fix\n", pci_name(chip->pci));
David Henningssonbdd9ef22010-10-04 12:02:14 +02003276 return POS_FIX_VIACOMBO;
3277 }
Takashi Iwai9477c582011-05-25 09:11:37 +02003278 if (chip->driver_caps & AZX_DCAPS_POSFIX_LPIB) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003279 snd_printd(SFX "%s: Using LPIB position fix\n", pci_name(chip->pci));
Takashi Iwai9477c582011-05-25 09:11:37 +02003280 return POS_FIX_LPIB;
3281 }
Takashi Iwaic673ba12009-03-17 07:49:14 +01003282 return POS_FIX_AUTO;
Takashi Iwai3372a152007-02-01 15:46:50 +01003283}
3284
3285/*
Takashi Iwai669ba272007-08-17 09:17:36 +02003286 * black-lists for probe_mask
3287 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003288static struct snd_pci_quirk probe_mask_list[] = {
Takashi Iwai669ba272007-08-17 09:17:36 +02003289 /* Thinkpad often breaks the controller communication when accessing
3290 * to the non-working (or non-existing) modem codec slot.
3291 */
3292 SND_PCI_QUIRK(0x1014, 0x05b7, "Thinkpad Z60", 0x01),
3293 SND_PCI_QUIRK(0x17aa, 0x2010, "Thinkpad X/T/R60", 0x01),
3294 SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X/T/R61", 0x01),
Takashi Iwai0edb9452008-11-07 14:53:09 +01003295 /* broken BIOS */
3296 SND_PCI_QUIRK(0x1028, 0x20ac, "Dell Studio Desktop", 0x01),
Takashi Iwaief1681d2008-11-24 17:29:28 +01003297 /* including bogus ALC268 in slot#2 that conflicts with ALC888 */
3298 SND_PCI_QUIRK(0x17c0, 0x4085, "Medion MD96630", 0x01),
Takashi Iwai20db7cb2009-02-13 08:18:48 +01003299 /* forced codec slots */
Ozan Çağlayan93574842009-05-23 15:00:04 +03003300 SND_PCI_QUIRK(0x1043, 0x1262, "ASUS W5Fm", 0x103),
Takashi Iwai20db7cb2009-02-13 08:18:48 +01003301 SND_PCI_QUIRK(0x1046, 0x1262, "ASUS W5F", 0x103),
Jaroslav Kyselaf3af9052012-04-26 17:52:35 +02003302 /* WinFast VP200 H (Teradici) user reported broken communication */
3303 SND_PCI_QUIRK(0x3a21, 0x040d, "WinFast VP200 H", 0x101),
Takashi Iwai669ba272007-08-17 09:17:36 +02003304 {}
3305};
3306
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003307#define AZX_FORCE_CODEC_MASK 0x100
3308
Bill Pembertone23e7a12012-12-06 12:35:10 -05003309static void check_probe_mask(struct azx *chip, int dev)
Takashi Iwai669ba272007-08-17 09:17:36 +02003310{
3311 const struct snd_pci_quirk *q;
3312
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003313 chip->codec_probe_mask = probe_mask[dev];
3314 if (chip->codec_probe_mask == -1) {
Takashi Iwai669ba272007-08-17 09:17:36 +02003315 q = snd_pci_quirk_lookup(chip->pci, probe_mask_list);
3316 if (q) {
3317 printk(KERN_INFO
3318 "hda_intel: probe_mask set to 0x%x "
3319 "for device %04x:%04x\n",
3320 q->value, q->subvendor, q->subdevice);
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003321 chip->codec_probe_mask = q->value;
Takashi Iwai669ba272007-08-17 09:17:36 +02003322 }
3323 }
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003324
3325 /* check forced option */
3326 if (chip->codec_probe_mask != -1 &&
3327 (chip->codec_probe_mask & AZX_FORCE_CODEC_MASK)) {
3328 chip->codec_mask = chip->codec_probe_mask & 0xff;
3329 printk(KERN_INFO "hda_intel: codec_mask forced to 0x%x\n",
3330 chip->codec_mask);
3331 }
Takashi Iwai669ba272007-08-17 09:17:36 +02003332}
3333
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003334/*
Takashi Iwai716238552009-09-28 13:14:04 +02003335 * white/black-list for enable_msi
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003336 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003337static struct snd_pci_quirk msi_black_list[] = {
Takashi Iwai9dc83982009-12-22 08:15:01 +01003338 SND_PCI_QUIRK(0x1043, 0x81f2, "ASUS", 0), /* Athlon64 X2 + nvidia */
Takashi Iwai0a27fcf2010-02-15 17:05:28 +01003339 SND_PCI_QUIRK(0x1043, 0x81f6, "ASUS", 0), /* nvidia */
Ralf Gerbigecd21622010-03-09 18:25:47 +01003340 SND_PCI_QUIRK(0x1043, 0x822d, "ASUS", 0), /* Athlon64 X2 + nvidia MCP55 */
Michele Ballabio4193d132010-03-06 21:06:46 +01003341 SND_PCI_QUIRK(0x1849, 0x0888, "ASRock", 0), /* Athlon64 X2 + nvidia */
Takashi Iwai38155952010-04-04 12:14:03 +02003342 SND_PCI_QUIRK(0xa0a0, 0x0575, "Aopen MZ915-M", 0), /* ICH6 */
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003343 {}
3344};
3345
Bill Pembertone23e7a12012-12-06 12:35:10 -05003346static void check_msi(struct azx *chip)
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003347{
3348 const struct snd_pci_quirk *q;
3349
Takashi Iwai716238552009-09-28 13:14:04 +02003350 if (enable_msi >= 0) {
3351 chip->msi = !!enable_msi;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003352 return;
Takashi Iwai716238552009-09-28 13:14:04 +02003353 }
3354 chip->msi = 1; /* enable MSI as default */
3355 q = snd_pci_quirk_lookup(chip->pci, msi_black_list);
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003356 if (q) {
3357 printk(KERN_INFO
3358 "hda_intel: msi for device %04x:%04x set to %d\n",
3359 q->subvendor, q->subdevice, q->value);
3360 chip->msi = q->value;
Takashi Iwai80c43ed2010-03-15 15:51:53 +01003361 return;
3362 }
3363
3364 /* NVidia chipsets seem to cause troubles with MSI */
Takashi Iwai9477c582011-05-25 09:11:37 +02003365 if (chip->driver_caps & AZX_DCAPS_NO_MSI) {
3366 printk(KERN_INFO "hda_intel: Disabling MSI\n");
Takashi Iwai80c43ed2010-03-15 15:51:53 +01003367 chip->msi = 0;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003368 }
3369}
3370
Takashi Iwaia1585d72011-12-14 09:27:04 +01003371/* check the snoop mode availability */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003372static void azx_check_snoop_available(struct azx *chip)
Takashi Iwaia1585d72011-12-14 09:27:04 +01003373{
3374 bool snoop = chip->snoop;
3375
3376 switch (chip->driver_type) {
3377 case AZX_DRIVER_VIA:
3378 /* force to non-snoop mode for a new VIA controller
3379 * when BIOS is set
3380 */
3381 if (snoop) {
3382 u8 val;
3383 pci_read_config_byte(chip->pci, 0x42, &val);
3384 if (!(val & 0x80) && chip->pci->revision == 0x30)
3385 snoop = false;
3386 }
3387 break;
3388 case AZX_DRIVER_ATIHDMI_NS:
3389 /* new ATI HDMI requires non-snoop */
3390 snoop = false;
3391 break;
Takashi Iwaic1279f82013-02-07 17:36:22 +01003392 case AZX_DRIVER_CTHDA:
3393 snoop = false;
3394 break;
Takashi Iwaia1585d72011-12-14 09:27:04 +01003395 }
3396
3397 if (snoop != chip->snoop) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003398 snd_printk(KERN_INFO SFX "%s: Force to %s mode\n",
3399 pci_name(chip->pci), snoop ? "snoop" : "non-snoop");
Takashi Iwaia1585d72011-12-14 09:27:04 +01003400 chip->snoop = snoop;
3401 }
3402}
Takashi Iwai669ba272007-08-17 09:17:36 +02003403
3404/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07003405 * constructor
3406 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003407static int azx_create(struct snd_card *card, struct pci_dev *pci,
3408 int dev, unsigned int driver_caps,
3409 struct azx **rchip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003410{
Takashi Iwaia98f90f2005-11-17 14:59:02 +01003411 static struct snd_device_ops ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003412 .dev_free = azx_dev_free,
3413 };
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003414 struct azx *chip;
3415 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003416
3417 *rchip = NULL;
Tobin Davisbcd72002008-01-15 11:23:55 +01003418
Pavel Machek927fc862006-08-31 17:03:43 +02003419 err = pci_enable_device(pci);
3420 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003421 return err;
3422
Takashi Iwaie560d8d2005-09-09 14:21:46 +02003423 chip = kzalloc(sizeof(*chip), GFP_KERNEL);
Pavel Machek927fc862006-08-31 17:03:43 +02003424 if (!chip) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003425 snd_printk(KERN_ERR SFX "%s: Cannot allocate chip\n", pci_name(pci));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003426 pci_disable_device(pci);
3427 return -ENOMEM;
3428 }
3429
3430 spin_lock_init(&chip->reg_lock);
Ingo Molnar62932df2006-01-16 16:34:20 +01003431 mutex_init(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003432 chip->card = card;
3433 chip->pci = pci;
3434 chip->irq = -1;
Takashi Iwai9477c582011-05-25 09:11:37 +02003435 chip->driver_caps = driver_caps;
3436 chip->driver_type = driver_caps & 0xff;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003437 check_msi(chip);
Takashi Iwai555e2192008-06-10 17:53:34 +02003438 chip->dev_index = dev;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02003439 INIT_WORK(&chip->irq_pending_work, azx_irq_pending_work);
Takashi Iwai01b65bf2011-11-24 14:31:46 +01003440 INIT_LIST_HEAD(&chip->pcm_list);
Takashi Iwai65fcd412012-08-14 17:13:32 +02003441 INIT_LIST_HEAD(&chip->list);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003442 init_vga_switcheroo(chip);
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003443 init_completion(&chip->probe_wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003444
Shahin Ghazinouribeaffc32010-05-11 08:19:55 +02003445 chip->position_fix[0] = chip->position_fix[1] =
3446 check_position_fix(chip, position_fix[dev]);
Takashi Iwaia6f2fd52012-02-28 11:58:40 +01003447 /* combo mode uses LPIB for playback */
3448 if (chip->position_fix[0] == POS_FIX_COMBO) {
3449 chip->position_fix[0] = POS_FIX_LPIB;
3450 chip->position_fix[1] = POS_FIX_AUTO;
3451 }
3452
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003453 check_probe_mask(chip, dev);
Takashi Iwai3372a152007-02-01 15:46:50 +01003454
Takashi Iwai27346162006-01-12 18:28:44 +01003455 chip->single_cmd = single_cmd;
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003456 chip->snoop = hda_snoop;
Takashi Iwaia1585d72011-12-14 09:27:04 +01003457 azx_check_snoop_available(chip);
Takashi Iwaic74db862005-05-12 14:26:27 +02003458
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02003459 if (bdl_pos_adj[dev] < 0) {
3460 switch (chip->driver_type) {
Takashi Iwai0c6341a2008-06-13 20:50:27 +02003461 case AZX_DRIVER_ICH:
Seth Heasley32679f92010-02-22 17:31:09 -08003462 case AZX_DRIVER_PCH:
Takashi Iwai0c6341a2008-06-13 20:50:27 +02003463 bdl_pos_adj[dev] = 1;
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02003464 break;
3465 default:
Takashi Iwai0c6341a2008-06-13 20:50:27 +02003466 bdl_pos_adj[dev] = 32;
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02003467 break;
3468 }
3469 }
3470
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003471 err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
3472 if (err < 0) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003473 snd_printk(KERN_ERR SFX "%s: Error creating device [card]!\n",
3474 pci_name(chip->pci));
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003475 azx_free(chip);
3476 return err;
3477 }
3478
3479 *rchip = chip;
3480 return 0;
3481}
3482
Takashi Iwai48c8b0e2012-12-07 07:40:35 +01003483static int azx_first_init(struct azx *chip)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003484{
3485 int dev = chip->dev_index;
3486 struct pci_dev *pci = chip->pci;
3487 struct snd_card *card = chip->card;
3488 int i, err;
3489 unsigned short gcap;
3490
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003491#if BITS_PER_LONG != 64
3492 /* Fix up base address on ULI M5461 */
3493 if (chip->driver_type == AZX_DRIVER_ULI) {
3494 u16 tmp3;
3495 pci_read_config_word(pci, 0x40, &tmp3);
3496 pci_write_config_word(pci, 0x40, tmp3 | 0x10);
3497 pci_write_config_dword(pci, PCI_BASE_ADDRESS_1, 0);
3498 }
3499#endif
3500
Pavel Machek927fc862006-08-31 17:03:43 +02003501 err = pci_request_regions(pci, "ICH HD audio");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003502 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003503 return err;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003504 chip->region_requested = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003505
Pavel Machek927fc862006-08-31 17:03:43 +02003506 chip->addr = pci_resource_start(pci, 0);
Arjan van de Ven2f5ad542008-09-28 16:20:09 -07003507 chip->remap_addr = pci_ioremap_bar(pci, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003508 if (chip->remap_addr == NULL) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003509 snd_printk(KERN_ERR SFX "%s: ioremap error\n", pci_name(chip->pci));
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003510 return -ENXIO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003511 }
3512
Takashi Iwai68e7fff2006-10-23 13:40:59 +02003513 if (chip->msi)
3514 if (pci_enable_msi(pci) < 0)
3515 chip->msi = 0;
Stephen Hemminger7376d012006-08-21 19:17:46 +02003516
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003517 if (azx_acquire_irq(chip, 0) < 0)
3518 return -EBUSY;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003519
3520 pci_set_master(pci);
3521 synchronize_irq(chip->irq);
3522
Tobin Davisbcd72002008-01-15 11:23:55 +01003523 gcap = azx_readw(chip, GCAP);
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003524 snd_printdd(SFX "%s: chipset global capabilities = 0x%x\n", pci_name(chip->pci), gcap);
Tobin Davisbcd72002008-01-15 11:23:55 +01003525
Andiry Brienzadc4c2e62009-07-08 13:55:31 +08003526 /* disable SB600 64bit support for safety */
Takashi Iwai9477c582011-05-25 09:11:37 +02003527 if (chip->pci->vendor == PCI_VENDOR_ID_ATI) {
Andiry Brienzadc4c2e62009-07-08 13:55:31 +08003528 struct pci_dev *p_smbus;
3529 p_smbus = pci_get_device(PCI_VENDOR_ID_ATI,
3530 PCI_DEVICE_ID_ATI_SBX00_SMBUS,
3531 NULL);
3532 if (p_smbus) {
3533 if (p_smbus->revision < 0x30)
3534 gcap &= ~ICH6_GCAP_64OK;
3535 pci_dev_put(p_smbus);
3536 }
3537 }
Takashi Iwai09240cf2009-03-17 07:47:18 +01003538
Takashi Iwai9477c582011-05-25 09:11:37 +02003539 /* disable 64bit DMA address on some devices */
3540 if (chip->driver_caps & AZX_DCAPS_NO_64BIT) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003541 snd_printd(SFX "%s: Disabling 64bit DMA\n", pci_name(chip->pci));
Jaroslav Kysela396087e2009-12-09 10:44:47 +01003542 gcap &= ~ICH6_GCAP_64OK;
Takashi Iwai9477c582011-05-25 09:11:37 +02003543 }
Jaroslav Kysela396087e2009-12-09 10:44:47 +01003544
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003545 /* disable buffer size rounding to 128-byte multiples if supported */
Takashi Iwai7bfe0592012-01-23 17:53:39 +01003546 if (align_buffer_size >= 0)
3547 chip->align_buffer_size = !!align_buffer_size;
3548 else {
3549 if (chip->driver_caps & AZX_DCAPS_BUFSIZE)
3550 chip->align_buffer_size = 0;
3551 else if (chip->driver_caps & AZX_DCAPS_ALIGN_BUFSIZE)
3552 chip->align_buffer_size = 1;
3553 else
3554 chip->align_buffer_size = 1;
3555 }
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003556
Takashi Iwaicf7aaca2008-02-06 15:05:57 +01003557 /* allow 64bit DMA address if supported by H/W */
Takashi Iwaib21fadb2009-05-28 12:26:15 +02003558 if ((gcap & ICH6_GCAP_64OK) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64)))
Yang Hongyange9304382009-04-13 14:40:14 -07003559 pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(64));
Takashi Iwai09240cf2009-03-17 07:47:18 +01003560 else {
Yang Hongyange9304382009-04-13 14:40:14 -07003561 pci_set_dma_mask(pci, DMA_BIT_MASK(32));
3562 pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(32));
Takashi Iwai09240cf2009-03-17 07:47:18 +01003563 }
Takashi Iwaicf7aaca2008-02-06 15:05:57 +01003564
Takashi Iwai8b6ed8e2008-02-19 11:36:35 +01003565 /* read number of streams from GCAP register instead of using
3566 * hardcoded value
3567 */
3568 chip->capture_streams = (gcap >> 8) & 0x0f;
3569 chip->playback_streams = (gcap >> 12) & 0x0f;
3570 if (!chip->playback_streams && !chip->capture_streams) {
Tobin Davisbcd72002008-01-15 11:23:55 +01003571 /* gcap didn't give any info, switching to old method */
3572
3573 switch (chip->driver_type) {
3574 case AZX_DRIVER_ULI:
3575 chip->playback_streams = ULI_NUM_PLAYBACK;
3576 chip->capture_streams = ULI_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01003577 break;
3578 case AZX_DRIVER_ATIHDMI:
Andiry Xu1815b342011-12-14 16:10:27 +08003579 case AZX_DRIVER_ATIHDMI_NS:
Tobin Davisbcd72002008-01-15 11:23:55 +01003580 chip->playback_streams = ATIHDMI_NUM_PLAYBACK;
3581 chip->capture_streams = ATIHDMI_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01003582 break;
Yang, Libinc4da29c2008-11-13 11:07:07 +01003583 case AZX_DRIVER_GENERIC:
Tobin Davisbcd72002008-01-15 11:23:55 +01003584 default:
3585 chip->playback_streams = ICH6_NUM_PLAYBACK;
3586 chip->capture_streams = ICH6_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01003587 break;
3588 }
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003589 }
Takashi Iwai8b6ed8e2008-02-19 11:36:35 +01003590 chip->capture_index_offset = 0;
3591 chip->playback_index_offset = chip->capture_streams;
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003592 chip->num_streams = chip->playback_streams + chip->capture_streams;
Takashi Iwaid01ce992007-07-27 16:52:19 +02003593 chip->azx_dev = kcalloc(chip->num_streams, sizeof(*chip->azx_dev),
3594 GFP_KERNEL);
Pavel Machek927fc862006-08-31 17:03:43 +02003595 if (!chip->azx_dev) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003596 snd_printk(KERN_ERR SFX "%s: cannot malloc azx_dev\n", pci_name(chip->pci));
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003597 return -ENOMEM;
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003598 }
3599
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003600 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaieb49faa2013-03-15 09:19:11 +01003601 dsp_lock_init(&chip->azx_dev[i]);
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003602 /* allocate memory for the BDL for each stream */
3603 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
3604 snd_dma_pci_data(chip->pci),
3605 BDL_SIZE, &chip->azx_dev[i].bdl);
3606 if (err < 0) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003607 snd_printk(KERN_ERR SFX "%s: cannot allocate BDL\n", pci_name(chip->pci));
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003608 return -ENOMEM;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003609 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003610 mark_pages_wc(chip, &chip->azx_dev[i].bdl, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003611 }
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02003612 /* allocate memory for the position buffer */
Takashi Iwaid01ce992007-07-27 16:52:19 +02003613 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
3614 snd_dma_pci_data(chip->pci),
3615 chip->num_streams * 8, &chip->posbuf);
3616 if (err < 0) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003617 snd_printk(KERN_ERR SFX "%s: cannot allocate posbuf\n", pci_name(chip->pci));
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003618 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003619 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003620 mark_pages_wc(chip, &chip->posbuf, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003621 /* allocate CORB/RIRB */
Takashi Iwai817408612009-05-26 15:22:00 +02003622 err = azx_alloc_cmd_io(chip);
3623 if (err < 0)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003624 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003625
3626 /* initialize streams */
3627 azx_init_stream(chip);
3628
3629 /* initialize chip */
Takashi Iwaicb53c622007-08-10 17:21:45 +02003630 azx_init_pci(chip);
Jaroslav Kysela10e77dd2010-03-26 11:04:38 +01003631 azx_init_chip(chip, (probe_only[dev] & 2) == 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003632
3633 /* codec detection */
Pavel Machek927fc862006-08-31 17:03:43 +02003634 if (!chip->codec_mask) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003635 snd_printk(KERN_ERR SFX "%s: no codecs found!\n", pci_name(chip->pci));
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003636 return -ENODEV;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003637 }
3638
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003639 strcpy(card->driver, "HDA-Intel");
Takashi Iwai18cb7102009-04-16 10:22:24 +02003640 strlcpy(card->shortname, driver_short_names[chip->driver_type],
3641 sizeof(card->shortname));
3642 snprintf(card->longname, sizeof(card->longname),
3643 "%s at 0x%lx irq %i",
3644 card->shortname, chip->addr, chip->irq);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003645
Linus Torvalds1da177e2005-04-16 15:20:36 -07003646 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003647}
3648
Takashi Iwaicb53c622007-08-10 17:21:45 +02003649static void power_down_all_codecs(struct azx *chip)
3650{
Takashi Iwai83012a72012-08-24 18:38:08 +02003651#ifdef CONFIG_PM
Takashi Iwaicb53c622007-08-10 17:21:45 +02003652 /* The codecs were powered up in snd_hda_codec_new().
3653 * Now all initialization done, so turn them down if possible
3654 */
3655 struct hda_codec *codec;
3656 list_for_each_entry(codec, &chip->bus->codec_list, list) {
3657 snd_hda_power_down(codec);
3658 }
3659#endif
3660}
3661
Takashi Iwai97c6a3d2012-08-09 17:40:46 +02003662#ifdef CONFIG_SND_HDA_PATCH_LOADER
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003663/* callback from request_firmware_nowait() */
3664static void azx_firmware_cb(const struct firmware *fw, void *context)
3665{
3666 struct snd_card *card = context;
3667 struct azx *chip = card->private_data;
3668 struct pci_dev *pci = chip->pci;
3669
3670 if (!fw) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003671 snd_printk(KERN_ERR SFX "%s: Cannot load firmware, aborting\n",
3672 pci_name(chip->pci));
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003673 goto error;
3674 }
3675
3676 chip->fw = fw;
3677 if (!chip->disabled) {
3678 /* continue probing */
3679 if (azx_probe_continue(chip))
3680 goto error;
3681 }
3682 return; /* OK */
3683
3684 error:
3685 snd_card_free(card);
3686 pci_set_drvdata(pci, NULL);
3687}
Takashi Iwai97c6a3d2012-08-09 17:40:46 +02003688#endif
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003689
Bill Pembertone23e7a12012-12-06 12:35:10 -05003690static int azx_probe(struct pci_dev *pci,
3691 const struct pci_device_id *pci_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003692{
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003693 static int dev;
Takashi Iwaia98f90f2005-11-17 14:59:02 +01003694 struct snd_card *card;
3695 struct azx *chip;
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003696 bool probe_now;
Pavel Machek927fc862006-08-31 17:03:43 +02003697 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003698
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003699 if (dev >= SNDRV_CARDS)
3700 return -ENODEV;
3701 if (!enable[dev]) {
3702 dev++;
3703 return -ENOENT;
3704 }
3705
Takashi Iwaie58de7b2008-12-28 16:44:30 +01003706 err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card);
3707 if (err < 0) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003708 snd_printk(KERN_ERR "hda-intel: Error creating card!\n");
Takashi Iwaie58de7b2008-12-28 16:44:30 +01003709 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003710 }
3711
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003712 snd_card_set_dev(card, &pci->dev);
3713
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003714 err = azx_create(card, pci, dev, pci_id->driver_data, &chip);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003715 if (err < 0)
3716 goto out_free;
Takashi Iwai421a1252005-11-17 16:11:09 +01003717 card->private_data = chip;
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003718
3719 pci_set_drvdata(pci, card);
3720
3721 err = register_vga_switcheroo(chip);
3722 if (err < 0) {
3723 snd_printk(KERN_ERR SFX
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003724 "%s: Error registering VGA-switcheroo client\n", pci_name(pci));
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003725 goto out_free;
3726 }
3727
3728 if (check_hdmi_disabled(pci)) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003729 snd_printk(KERN_INFO SFX "%s: VGA controller is disabled\n",
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003730 pci_name(pci));
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003731 snd_printk(KERN_INFO SFX "%s: Delaying initialization\n", pci_name(pci));
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003732 chip->disabled = true;
3733 }
3734
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003735 probe_now = !chip->disabled;
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003736 if (probe_now) {
3737 err = azx_first_init(chip);
3738 if (err < 0)
3739 goto out_free;
3740 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003741
Takashi Iwai4918cda2012-08-09 12:33:28 +02003742#ifdef CONFIG_SND_HDA_PATCH_LOADER
3743 if (patch[dev] && *patch[dev]) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003744 snd_printk(KERN_ERR SFX "%s: Applying patch firmware '%s'\n",
3745 pci_name(pci), patch[dev]);
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003746 err = request_firmware_nowait(THIS_MODULE, true, patch[dev],
3747 &pci->dev, GFP_KERNEL, card,
3748 azx_firmware_cb);
Takashi Iwai4918cda2012-08-09 12:33:28 +02003749 if (err < 0)
3750 goto out_free;
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003751 probe_now = false; /* continued in azx_firmware_cb() */
Takashi Iwai4918cda2012-08-09 12:33:28 +02003752 }
3753#endif /* CONFIG_SND_HDA_PATCH_LOADER */
3754
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003755 if (probe_now) {
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003756 err = azx_probe_continue(chip);
3757 if (err < 0)
3758 goto out_free;
3759 }
3760
Mengdong Linb8dfc4622012-08-23 17:32:30 +08003761 if (pci_dev_run_wake(pci))
3762 pm_runtime_put_noidle(&pci->dev);
3763
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003764 dev++;
Daniel J Blueman44728e92012-12-18 23:59:33 +08003765 complete_all(&chip->probe_wait);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003766 return 0;
3767
3768out_free:
3769 snd_card_free(card);
3770 return err;
3771}
3772
Takashi Iwai48c8b0e2012-12-07 07:40:35 +01003773static int azx_probe_continue(struct azx *chip)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003774{
3775 int dev = chip->dev_index;
3776 int err;
3777
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +01003778#ifdef CONFIG_SND_HDA_INPUT_BEEP
3779 chip->beep_mode = beep_mode[dev];
3780#endif
3781
Linus Torvalds1da177e2005-04-16 15:20:36 -07003782 /* create codec instances */
Takashi Iwaia1e21c92009-06-17 09:33:52 +02003783 err = azx_codec_create(chip, model[dev]);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003784 if (err < 0)
3785 goto out_free;
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003786#ifdef CONFIG_SND_HDA_PATCH_LOADER
Takashi Iwai4918cda2012-08-09 12:33:28 +02003787 if (chip->fw) {
3788 err = snd_hda_load_patch(chip->bus, chip->fw->size,
3789 chip->fw->data);
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003790 if (err < 0)
3791 goto out_free;
Takashi Iwaie39ae852012-11-22 16:18:13 +01003792#ifndef CONFIG_PM
Takashi Iwai4918cda2012-08-09 12:33:28 +02003793 release_firmware(chip->fw); /* no longer needed */
3794 chip->fw = NULL;
Takashi Iwaie39ae852012-11-22 16:18:13 +01003795#endif
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003796 }
3797#endif
Jaroslav Kysela10e77dd2010-03-26 11:04:38 +01003798 if ((probe_only[dev] & 1) == 0) {
Takashi Iwaia1e21c92009-06-17 09:33:52 +02003799 err = azx_codec_configure(chip);
3800 if (err < 0)
3801 goto out_free;
3802 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003803
3804 /* create PCM streams */
Takashi Iwai176d5332008-07-30 15:01:44 +02003805 err = snd_hda_build_pcms(chip->bus);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003806 if (err < 0)
3807 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003808
3809 /* create mixer controls */
Takashi Iwaid01ce992007-07-27 16:52:19 +02003810 err = azx_mixer_create(chip);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003811 if (err < 0)
3812 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003813
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003814 err = snd_card_register(chip->card);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003815 if (err < 0)
3816 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003817
Takashi Iwaicb53c622007-08-10 17:21:45 +02003818 chip->running = 1;
3819 power_down_all_codecs(chip);
Takashi Iwai0cbf0092008-10-29 16:18:25 +01003820 azx_notifier_register(chip);
Takashi Iwai65fcd412012-08-14 17:13:32 +02003821 azx_add_card_list(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003822
Takashi Iwai91219472012-04-26 12:13:25 +02003823 return 0;
3824
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003825out_free:
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003826 chip->init_failed = 1;
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003827 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003828}
3829
Bill Pembertone23e7a12012-12-06 12:35:10 -05003830static void azx_remove(struct pci_dev *pci)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003831{
Takashi Iwai91219472012-04-26 12:13:25 +02003832 struct snd_card *card = pci_get_drvdata(pci);
Mengdong Linb8dfc4622012-08-23 17:32:30 +08003833
3834 if (pci_dev_run_wake(pci))
3835 pm_runtime_get_noresume(&pci->dev);
3836
Takashi Iwai91219472012-04-26 12:13:25 +02003837 if (card)
3838 snd_card_free(card);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003839}
3840
3841/* PCI IDs */
Alexey Dobriyancebe41d2010-02-06 00:21:03 +02003842static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
Seth Heasleyd2f2fcd2010-01-12 17:03:35 -08003843 /* CPT */
Takashi Iwai9477c582011-05-25 09:11:37 +02003844 { PCI_DEVICE(0x8086, 0x1c20),
Takashi Iwaid7dab4d2013-01-08 13:51:30 +01003845 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM },
Seth Heasleycea310e2010-09-10 16:29:56 -07003846 /* PBG */
Takashi Iwai9477c582011-05-25 09:11:37 +02003847 { PCI_DEVICE(0x8086, 0x1d20),
Takashi Iwaid7dab4d2013-01-08 13:51:30 +01003848 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM },
Seth Heasleyd2edeb72011-04-20 10:59:57 -07003849 /* Panther Point */
Takashi Iwai9477c582011-05-25 09:11:37 +02003850 { PCI_DEVICE(0x8086, 0x1e20),
Takashi Iwaid7dab4d2013-01-08 13:51:30 +01003851 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM },
Seth Heasley8bc039a2012-01-23 16:24:31 -08003852 /* Lynx Point */
3853 { PCI_DEVICE(0x8086, 0x8c20),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003854 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
James Ralston884b0882013-02-08 17:29:40 -08003855 /* Wellsburg */
3856 { PCI_DEVICE(0x8086, 0x8d20),
3857 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
3858 { PCI_DEVICE(0x8086, 0x8d21),
3859 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
James Ralston144dad92012-08-09 09:38:59 -07003860 /* Lynx Point-LP */
3861 { PCI_DEVICE(0x8086, 0x9c20),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003862 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
James Ralston144dad92012-08-09 09:38:59 -07003863 /* Lynx Point-LP */
3864 { PCI_DEVICE(0x8086, 0x9c21),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003865 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
Wang Xingchaoe926f2c2012-06-13 10:23:51 +08003866 /* Haswell */
Wang Xingchao4a7c5162013-02-01 22:42:19 +08003867 { PCI_DEVICE(0x8086, 0x0a0c),
3868 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH },
Wang Xingchaoe926f2c2012-06-13 10:23:51 +08003869 { PCI_DEVICE(0x8086, 0x0c0c),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003870 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH },
Wang Xingchaod279fae2012-09-17 13:10:23 +08003871 { PCI_DEVICE(0x8086, 0x0d0c),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003872 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH },
Pierre-Louis Bossart99df18b2012-09-21 18:39:07 -05003873 /* 5 Series/3400 */
3874 { PCI_DEVICE(0x8086, 0x3b56),
Takashi Iwai2c1350f2013-02-14 09:44:55 +01003875 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_NOPM },
Takashi Iwaif748abc2013-01-29 10:12:23 +01003876 /* Poulsbo */
Takashi Iwai9477c582011-05-25 09:11:37 +02003877 { PCI_DEVICE(0x8086, 0x811b),
Takashi Iwaif748abc2013-01-29 10:12:23 +01003878 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_NOPM },
3879 /* Oaktrail */
Li Peng09904b92011-12-28 15:17:26 +00003880 { PCI_DEVICE(0x8086, 0x080a),
Takashi Iwaif748abc2013-01-29 10:12:23 +01003881 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_NOPM },
Chew, Chiau Eee44007e2013-05-16 15:36:12 +08003882 /* BayTrail */
3883 { PCI_DEVICE(0x8086, 0x0f04),
3884 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM },
David Henningsson645e9032011-12-14 15:52:30 +08003885 /* ICH */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003886 { PCI_DEVICE(0x8086, 0x2668),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003887 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3888 AZX_DCAPS_BUFSIZE }, /* ICH6 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003889 { PCI_DEVICE(0x8086, 0x27d8),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003890 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3891 AZX_DCAPS_BUFSIZE }, /* ICH7 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003892 { PCI_DEVICE(0x8086, 0x269a),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003893 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3894 AZX_DCAPS_BUFSIZE }, /* ESB2 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003895 { PCI_DEVICE(0x8086, 0x284b),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003896 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3897 AZX_DCAPS_BUFSIZE }, /* ICH8 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003898 { PCI_DEVICE(0x8086, 0x293e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003899 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3900 AZX_DCAPS_BUFSIZE }, /* ICH9 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003901 { PCI_DEVICE(0x8086, 0x293f),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003902 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3903 AZX_DCAPS_BUFSIZE }, /* ICH9 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003904 { PCI_DEVICE(0x8086, 0x3a3e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003905 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3906 AZX_DCAPS_BUFSIZE }, /* ICH10 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003907 { PCI_DEVICE(0x8086, 0x3a6e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003908 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3909 AZX_DCAPS_BUFSIZE }, /* ICH10 */
Takashi Iwaib6864532010-09-15 10:17:26 +02003910 /* Generic Intel */
3911 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_ANY_ID),
3912 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3913 .class_mask = 0xffffff,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003914 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_BUFSIZE },
Takashi Iwai9477c582011-05-25 09:11:37 +02003915 /* ATI SB 450/600/700/800/900 */
3916 { PCI_DEVICE(0x1002, 0x437b),
3917 .driver_data = AZX_DRIVER_ATI | AZX_DCAPS_PRESET_ATI_SB },
3918 { PCI_DEVICE(0x1002, 0x4383),
3919 .driver_data = AZX_DRIVER_ATI | AZX_DCAPS_PRESET_ATI_SB },
3920 /* AMD Hudson */
3921 { PCI_DEVICE(0x1022, 0x780d),
3922 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_SB },
Takashi Iwai87218e92008-02-21 08:13:11 +01003923 /* ATI HDMI */
Takashi Iwai9477c582011-05-25 09:11:37 +02003924 { PCI_DEVICE(0x1002, 0x793b),
3925 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3926 { PCI_DEVICE(0x1002, 0x7919),
3927 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3928 { PCI_DEVICE(0x1002, 0x960f),
3929 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3930 { PCI_DEVICE(0x1002, 0x970f),
3931 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3932 { PCI_DEVICE(0x1002, 0xaa00),
3933 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3934 { PCI_DEVICE(0x1002, 0xaa08),
3935 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3936 { PCI_DEVICE(0x1002, 0xaa10),
3937 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3938 { PCI_DEVICE(0x1002, 0xaa18),
3939 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3940 { PCI_DEVICE(0x1002, 0xaa20),
3941 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3942 { PCI_DEVICE(0x1002, 0xaa28),
3943 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3944 { PCI_DEVICE(0x1002, 0xaa30),
3945 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3946 { PCI_DEVICE(0x1002, 0xaa38),
3947 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3948 { PCI_DEVICE(0x1002, 0xaa40),
3949 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3950 { PCI_DEVICE(0x1002, 0xaa48),
3951 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
Andiry Xu1815b342011-12-14 16:10:27 +08003952 { PCI_DEVICE(0x1002, 0x9902),
3953 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
3954 { PCI_DEVICE(0x1002, 0xaaa0),
3955 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
3956 { PCI_DEVICE(0x1002, 0xaaa8),
3957 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
3958 { PCI_DEVICE(0x1002, 0xaab0),
3959 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
Takashi Iwai87218e92008-02-21 08:13:11 +01003960 /* VIA VT8251/VT8237A */
Takashi Iwai9477c582011-05-25 09:11:37 +02003961 { PCI_DEVICE(0x1106, 0x3288),
3962 .driver_data = AZX_DRIVER_VIA | AZX_DCAPS_POSFIX_VIA },
Annie Liu754fdff2012-06-08 19:18:39 +08003963 /* VIA GFX VT7122/VX900 */
3964 { PCI_DEVICE(0x1106, 0x9170), .driver_data = AZX_DRIVER_GENERIC },
3965 /* VIA GFX VT6122/VX11 */
3966 { PCI_DEVICE(0x1106, 0x9140), .driver_data = AZX_DRIVER_GENERIC },
Takashi Iwai87218e92008-02-21 08:13:11 +01003967 /* SIS966 */
3968 { PCI_DEVICE(0x1039, 0x7502), .driver_data = AZX_DRIVER_SIS },
3969 /* ULI M5461 */
3970 { PCI_DEVICE(0x10b9, 0x5461), .driver_data = AZX_DRIVER_ULI },
3971 /* NVIDIA MCP */
Takashi Iwai0c2fd1bf42009-12-18 16:41:39 +01003972 { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID),
3973 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3974 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02003975 .driver_data = AZX_DRIVER_NVIDIA | AZX_DCAPS_PRESET_NVIDIA },
Kailang Yangf2690022008-05-27 11:44:55 +02003976 /* Teradici */
Takashi Iwai9477c582011-05-25 09:11:37 +02003977 { PCI_DEVICE(0x6549, 0x1200),
3978 .driver_data = AZX_DRIVER_TERA | AZX_DCAPS_NO_64BIT },
Lars R. Damerowf0b3da92012-11-02 13:10:39 -07003979 { PCI_DEVICE(0x6549, 0x2200),
3980 .driver_data = AZX_DRIVER_TERA | AZX_DCAPS_NO_64BIT },
Takashi Iwai4e01f542009-04-16 08:53:34 +02003981 /* Creative X-Fi (CA0110-IBG) */
Takashi Iwaif2a8eca2012-06-11 15:51:54 +02003982 /* CTHDA chips */
3983 { PCI_DEVICE(0x1102, 0x0010),
3984 .driver_data = AZX_DRIVER_CTHDA | AZX_DCAPS_PRESET_CTHDA },
3985 { PCI_DEVICE(0x1102, 0x0012),
3986 .driver_data = AZX_DRIVER_CTHDA | AZX_DCAPS_PRESET_CTHDA },
Takashi Iwai313f6e22009-05-18 12:40:52 +02003987#if !defined(CONFIG_SND_CTXFI) && !defined(CONFIG_SND_CTXFI_MODULE)
3988 /* the following entry conflicts with snd-ctxfi driver,
3989 * as ctxfi driver mutates from HD-audio to native mode with
3990 * a special command sequence.
3991 */
Takashi Iwai4e01f542009-04-16 08:53:34 +02003992 { PCI_DEVICE(PCI_VENDOR_ID_CREATIVE, PCI_ANY_ID),
3993 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3994 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02003995 .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
Takashi Iwai69f9ba92011-11-06 13:49:13 +01003996 AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB },
Takashi Iwai313f6e22009-05-18 12:40:52 +02003997#else
3998 /* this entry seems still valid -- i.e. without emu20kx chip */
Takashi Iwai9477c582011-05-25 09:11:37 +02003999 { PCI_DEVICE(0x1102, 0x0009),
4000 .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
Takashi Iwai69f9ba92011-11-06 13:49:13 +01004001 AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB },
Takashi Iwai313f6e22009-05-18 12:40:52 +02004002#endif
Otavio Salvadore35d4b12010-09-26 23:35:06 -03004003 /* Vortex86MX */
4004 { PCI_DEVICE(0x17f3, 0x3010), .driver_data = AZX_DRIVER_GENERIC },
Bankim Bhavsar0f0714c52011-01-17 15:23:21 +01004005 /* VMware HDAudio */
4006 { PCI_DEVICE(0x15ad, 0x1977), .driver_data = AZX_DRIVER_GENERIC },
Andiry Brienza9176b672009-07-17 11:32:32 +08004007 /* AMD/ATI Generic, PCI class code and Vendor ID for HD Audio */
Yang, Libinc4da29c2008-11-13 11:07:07 +01004008 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_ANY_ID),
4009 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
4010 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02004011 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_HDMI },
Andiry Brienza9176b672009-07-17 11:32:32 +08004012 { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_ANY_ID),
4013 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
4014 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02004015 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_HDMI },
Linus Torvalds1da177e2005-04-16 15:20:36 -07004016 { 0, }
4017};
4018MODULE_DEVICE_TABLE(pci, azx_ids);
4019
4020/* pci_driver definition */
Takashi Iwaie9f66d92012-04-24 12:25:00 +02004021static struct pci_driver azx_driver = {
Takashi Iwai3733e422011-06-10 16:20:20 +02004022 .name = KBUILD_MODNAME,
Linus Torvalds1da177e2005-04-16 15:20:36 -07004023 .id_table = azx_ids,
4024 .probe = azx_probe,
Bill Pembertone23e7a12012-12-06 12:35:10 -05004025 .remove = azx_remove,
Takashi Iwai68cb2b52012-07-02 15:20:37 +02004026 .driver = {
4027 .pm = AZX_PM_OPS,
4028 },
Linus Torvalds1da177e2005-04-16 15:20:36 -07004029};
4030
Takashi Iwaie9f66d92012-04-24 12:25:00 +02004031module_pci_driver(azx_driver);