blob: 35e9f8b010a7555e89cd3bac9b70113c795435e0 [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"
Wang Xingchao99a20082013-05-30 22:07:10 +080065#include "hda_i915.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070066
67
Takashi Iwai5aba4f82008-01-07 15:16:37 +010068static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
69static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
Rusty Russella67ff6a2011-12-15 13:49:36 +103070static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
Takashi Iwai5aba4f82008-01-07 15:16:37 +010071static char *model[SNDRV_CARDS];
Takashi Iwai1dac6692012-09-13 14:59:47 +020072static int position_fix[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = -1};
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +020073static int bdl_pos_adj[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = -1};
Takashi Iwai5aba4f82008-01-07 15:16:37 +010074static int probe_mask[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = -1};
Takashi Iwaid4d9cd032008-12-19 15:19:11 +010075static int probe_only[SNDRV_CARDS];
David Henningsson26a6cb62012-10-09 15:04:21 +020076static int jackpoll_ms[SNDRV_CARDS];
Rusty Russella67ff6a2011-12-15 13:49:36 +103077static bool single_cmd;
Takashi Iwai716238552009-09-28 13:14:04 +020078static int enable_msi = -1;
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +020079#ifdef CONFIG_SND_HDA_PATCH_LOADER
80static char *patch[SNDRV_CARDS];
81#endif
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +010082#ifdef CONFIG_SND_HDA_INPUT_BEEP
Takashi Iwai0920c9b2012-07-03 16:58:48 +020083static bool beep_mode[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] =
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +010084 CONFIG_SND_HDA_INPUT_BEEP_MODE};
85#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070086
Takashi Iwai5aba4f82008-01-07 15:16:37 +010087module_param_array(index, int, NULL, 0444);
Linus Torvalds1da177e2005-04-16 15:20:36 -070088MODULE_PARM_DESC(index, "Index value for Intel HD audio interface.");
Takashi Iwai5aba4f82008-01-07 15:16:37 +010089module_param_array(id, charp, NULL, 0444);
Linus Torvalds1da177e2005-04-16 15:20:36 -070090MODULE_PARM_DESC(id, "ID string for Intel HD audio interface.");
Takashi Iwai5aba4f82008-01-07 15:16:37 +010091module_param_array(enable, bool, NULL, 0444);
92MODULE_PARM_DESC(enable, "Enable Intel HD audio interface.");
93module_param_array(model, charp, NULL, 0444);
Linus Torvalds1da177e2005-04-16 15:20:36 -070094MODULE_PARM_DESC(model, "Use the given board model.");
Takashi Iwai5aba4f82008-01-07 15:16:37 +010095module_param_array(position_fix, int, NULL, 0444);
David Henningsson4cb36312010-09-30 10:12:50 +020096MODULE_PARM_DESC(position_fix, "DMA pointer read method."
Takashi Iwai1dac6692012-09-13 14:59:47 +020097 "(-1 = system default, 0 = auto, 1 = LPIB, 2 = POSBUF, 3 = VIACOMBO, 4 = COMBO).");
Takashi Iwai555e2192008-06-10 17:53:34 +020098module_param_array(bdl_pos_adj, int, NULL, 0644);
99MODULE_PARM_DESC(bdl_pos_adj, "BDL position adjustment offset.");
Takashi Iwai5aba4f82008-01-07 15:16:37 +0100100module_param_array(probe_mask, int, NULL, 0444);
Takashi Iwai606ad752005-11-24 16:03:40 +0100101MODULE_PARM_DESC(probe_mask, "Bitmask to probe codecs (default = -1).");
Jaroslav Kysela079e6832010-03-26 11:16:59 +0100102module_param_array(probe_only, int, NULL, 0444);
Takashi Iwaid4d9cd032008-12-19 15:19:11 +0100103MODULE_PARM_DESC(probe_only, "Only probing and no codec initialization.");
David Henningsson26a6cb62012-10-09 15:04:21 +0200104module_param_array(jackpoll_ms, int, NULL, 0444);
105MODULE_PARM_DESC(jackpoll_ms, "Ms between polling for jack events (default = 0, using unsol events only)");
Takashi Iwai27346162006-01-12 18:28:44 +0100106module_param(single_cmd, bool, 0444);
Takashi Iwaid01ce992007-07-27 16:52:19 +0200107MODULE_PARM_DESC(single_cmd, "Use single command to communicate with codecs "
108 "(for debugging only).");
Takashi Iwaiac9ef6c2012-01-20 12:08:44 +0100109module_param(enable_msi, bint, 0444);
Takashi Iwai134a11f2006-11-10 12:08:37 +0100110MODULE_PARM_DESC(enable_msi, "Enable Message Signaled Interrupt (MSI)");
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +0200111#ifdef CONFIG_SND_HDA_PATCH_LOADER
112module_param_array(patch, charp, NULL, 0444);
113MODULE_PARM_DESC(patch, "Patch file for Intel HD audio interface.");
114#endif
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +0100115#ifdef CONFIG_SND_HDA_INPUT_BEEP
Takashi Iwai0920c9b2012-07-03 16:58:48 +0200116module_param_array(beep_mode, bool, NULL, 0444);
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +0100117MODULE_PARM_DESC(beep_mode, "Select HDA Beep registration mode "
Takashi Iwai0920c9b2012-07-03 16:58:48 +0200118 "(0=off, 1=on) (default=1).");
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +0100119#endif
Takashi Iwai606ad752005-11-24 16:03:40 +0100120
Takashi Iwai83012a72012-08-24 18:38:08 +0200121#ifdef CONFIG_PM
Takashi Iwai65fcd412012-08-14 17:13:32 +0200122static int param_set_xint(const char *val, const struct kernel_param *kp);
123static struct kernel_param_ops param_ops_xint = {
124 .set = param_set_xint,
125 .get = param_get_int,
126};
127#define param_check_xint param_check_int
128
Takashi Iwaifee2fba2008-11-27 12:43:28 +0100129static int power_save = CONFIG_SND_HDA_POWER_SAVE_DEFAULT;
Takashi Iwai65fcd412012-08-14 17:13:32 +0200130module_param(power_save, xint, 0644);
Takashi Iwaifee2fba2008-11-27 12:43:28 +0100131MODULE_PARM_DESC(power_save, "Automatic power-saving timeout "
132 "(in second, 0 = disable).");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700133
Takashi Iwaidee1b662007-08-13 16:10:30 +0200134/* reset the HD-audio controller in power save mode.
135 * this may give more power-saving, but will take longer time to
136 * wake up.
137 */
Takashi Iwai8fc24422013-04-04 15:35:24 +0200138static bool power_save_controller = 1;
139module_param(power_save_controller, bool, 0644);
Takashi Iwaidee1b662007-08-13 16:10:30 +0200140MODULE_PARM_DESC(power_save_controller, "Reset controller in power save mode.");
Takashi Iwai83012a72012-08-24 18:38:08 +0200141#endif /* CONFIG_PM */
Takashi Iwaidee1b662007-08-13 16:10:30 +0200142
Takashi Iwai7bfe0592012-01-23 17:53:39 +0100143static int align_buffer_size = -1;
144module_param(align_buffer_size, bint, 0644);
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -0500145MODULE_PARM_DESC(align_buffer_size,
146 "Force buffer and period sizes to be multiple of 128 bytes.");
147
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200148#ifdef CONFIG_X86
149static bool hda_snoop = true;
150module_param_named(snoop, hda_snoop, bool, 0444);
151MODULE_PARM_DESC(snoop, "Enable/disable snooping");
152#define azx_snoop(chip) (chip)->snoop
153#else
154#define hda_snoop true
155#define azx_snoop(chip) true
156#endif
157
158
Linus Torvalds1da177e2005-04-16 15:20:36 -0700159MODULE_LICENSE("GPL");
160MODULE_SUPPORTED_DEVICE("{{Intel, ICH6},"
161 "{Intel, ICH6M},"
Jason Gaston2f1b3812005-05-01 08:58:50 -0700162 "{Intel, ICH7},"
Frederick Lif5d40b32005-05-12 14:55:20 +0200163 "{Intel, ESB2},"
Jason Gastond2981392006-01-10 11:07:37 +0100164 "{Intel, ICH8},"
Jason Gastonf9cc8a82006-11-22 11:53:52 +0100165 "{Intel, ICH9},"
Jason Gastonc34f5a02008-01-29 12:38:49 +0100166 "{Intel, ICH10},"
Seth Heasleyb29c2362008-08-08 15:56:39 -0700167 "{Intel, PCH},"
Seth Heasleyd2f2fcd2010-01-12 17:03:35 -0800168 "{Intel, CPT},"
Seth Heasleyd2edeb72011-04-20 10:59:57 -0700169 "{Intel, PPT},"
Seth Heasley8bc039a2012-01-23 16:24:31 -0800170 "{Intel, LPT},"
James Ralston144dad92012-08-09 09:38:59 -0700171 "{Intel, LPT_LP},"
Wang Xingchaoe926f2c2012-06-13 10:23:51 +0800172 "{Intel, HPT},"
Seth Heasleycea310e2010-09-10 16:29:56 -0700173 "{Intel, PBG},"
Tobin Davis4979bca2008-01-30 08:13:55 +0100174 "{Intel, SCH},"
Takashi Iwaifc20a562005-05-12 15:00:41 +0200175 "{ATI, SB450},"
Felix Kuehling89be83f2006-03-31 12:33:59 +0200176 "{ATI, SB600},"
Felix Kuehling778b6e12006-05-17 11:22:21 +0200177 "{ATI, RS600},"
Felix Kuehling5b15c952006-10-16 12:49:47 +0200178 "{ATI, RS690},"
Wolke Liue6db1112007-04-27 12:20:57 +0200179 "{ATI, RS780},"
180 "{ATI, R600},"
Herton Ronaldo Krzesinski2797f722007-11-05 18:21:56 +0100181 "{ATI, RV630},"
182 "{ATI, RV610},"
Wolke Liu27da1832007-11-16 11:06:30 +0100183 "{ATI, RV670},"
184 "{ATI, RV635},"
185 "{ATI, RV620},"
186 "{ATI, RV770},"
Takashi Iwaifc20a562005-05-12 15:00:41 +0200187 "{VIA, VT8251},"
Takashi Iwai47672312005-08-12 16:44:04 +0200188 "{VIA, VT8237A},"
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200189 "{SiS, SIS966},"
190 "{ULI, M5461}}");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700191MODULE_DESCRIPTION("Intel HDA driver");
192
Takashi Iwai4abc1cc2009-05-19 12:16:46 +0200193#ifdef CONFIG_SND_VERBOSE_PRINTK
194#define SFX /* nop */
195#else
Daniel J Blueman445a51b2012-12-05 23:04:21 +0800196#define SFX "hda-intel "
Takashi Iwai4abc1cc2009-05-19 12:16:46 +0200197#endif
Takashi Iwaicb53c622007-08-10 17:21:45 +0200198
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200199#if defined(CONFIG_PM) && defined(CONFIG_VGA_SWITCHEROO)
200#ifdef CONFIG_SND_HDA_CODEC_HDMI
201#define SUPPORT_VGA_SWITCHEROO
202#endif
203#endif
204
205
Takashi Iwaicb53c622007-08-10 17:21:45 +0200206/*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700207 * registers
208 */
209#define ICH6_REG_GCAP 0x00
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200210#define ICH6_GCAP_64OK (1 << 0) /* 64bit address support */
211#define ICH6_GCAP_NSDO (3 << 1) /* # of serial data out signals */
212#define ICH6_GCAP_BSS (31 << 3) /* # of bidirectional streams */
213#define ICH6_GCAP_ISS (15 << 8) /* # of input streams */
214#define ICH6_GCAP_OSS (15 << 12) /* # of output streams */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700215#define ICH6_REG_VMIN 0x02
216#define ICH6_REG_VMAJ 0x03
217#define ICH6_REG_OUTPAY 0x04
218#define ICH6_REG_INPAY 0x06
219#define ICH6_REG_GCTL 0x08
Takashi Iwai8a933ec2009-05-31 09:28:12 +0200220#define ICH6_GCTL_RESET (1 << 0) /* controller reset */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200221#define ICH6_GCTL_FCNTRL (1 << 1) /* flush control */
222#define ICH6_GCTL_UNSOL (1 << 8) /* accept unsol. response enable */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700223#define ICH6_REG_WAKEEN 0x0c
224#define ICH6_REG_STATESTS 0x0e
225#define ICH6_REG_GSTS 0x10
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200226#define ICH6_GSTS_FSTS (1 << 1) /* flush status */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700227#define ICH6_REG_INTCTL 0x20
228#define ICH6_REG_INTSTS 0x24
Jaroslav Kyselae5463722010-05-11 10:21:46 +0200229#define ICH6_REG_WALLCLK 0x30 /* 24Mhz source */
Takashi Iwai8b0bd222011-06-10 14:56:26 +0200230#define ICH6_REG_OLD_SSYNC 0x34 /* SSYNC for old ICH */
231#define ICH6_REG_SSYNC 0x38
Linus Torvalds1da177e2005-04-16 15:20:36 -0700232#define ICH6_REG_CORBLBASE 0x40
233#define ICH6_REG_CORBUBASE 0x44
234#define ICH6_REG_CORBWP 0x48
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200235#define ICH6_REG_CORBRP 0x4a
236#define ICH6_CORBRP_RST (1 << 15) /* read pointer reset */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700237#define ICH6_REG_CORBCTL 0x4c
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200238#define ICH6_CORBCTL_RUN (1 << 1) /* enable DMA */
239#define ICH6_CORBCTL_CMEIE (1 << 0) /* enable memory error irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700240#define ICH6_REG_CORBSTS 0x4d
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200241#define ICH6_CORBSTS_CMEI (1 << 0) /* memory error indication */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700242#define ICH6_REG_CORBSIZE 0x4e
243
244#define ICH6_REG_RIRBLBASE 0x50
245#define ICH6_REG_RIRBUBASE 0x54
246#define ICH6_REG_RIRBWP 0x58
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200247#define ICH6_RIRBWP_RST (1 << 15) /* write pointer reset */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700248#define ICH6_REG_RINTCNT 0x5a
249#define ICH6_REG_RIRBCTL 0x5c
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200250#define ICH6_RBCTL_IRQ_EN (1 << 0) /* enable IRQ */
251#define ICH6_RBCTL_DMA_EN (1 << 1) /* enable DMA */
252#define ICH6_RBCTL_OVERRUN_EN (1 << 2) /* enable overrun irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700253#define ICH6_REG_RIRBSTS 0x5d
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200254#define ICH6_RBSTS_IRQ (1 << 0) /* response irq */
255#define ICH6_RBSTS_OVERRUN (1 << 2) /* overrun irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700256#define ICH6_REG_RIRBSIZE 0x5e
257
258#define ICH6_REG_IC 0x60
259#define ICH6_REG_IR 0x64
260#define ICH6_REG_IRS 0x68
261#define ICH6_IRS_VALID (1<<1)
262#define ICH6_IRS_BUSY (1<<0)
263
264#define ICH6_REG_DPLBASE 0x70
265#define ICH6_REG_DPUBASE 0x74
266#define ICH6_DPLBASE_ENABLE 0x1 /* Enable position buffer */
267
268/* SD offset: SDI0=0x80, SDI1=0xa0, ... SDO3=0x160 */
269enum { SDI0, SDI1, SDI2, SDI3, SDO0, SDO1, SDO2, SDO3 };
270
271/* stream register offsets from stream base */
272#define ICH6_REG_SD_CTL 0x00
273#define ICH6_REG_SD_STS 0x03
274#define ICH6_REG_SD_LPIB 0x04
275#define ICH6_REG_SD_CBL 0x08
276#define ICH6_REG_SD_LVI 0x0c
277#define ICH6_REG_SD_FIFOW 0x0e
278#define ICH6_REG_SD_FIFOSIZE 0x10
279#define ICH6_REG_SD_FORMAT 0x12
280#define ICH6_REG_SD_BDLPL 0x18
281#define ICH6_REG_SD_BDLPU 0x1c
282
283/* PCI space */
284#define ICH6_PCIREG_TCSEL 0x44
285
286/*
287 * other constants
288 */
289
290/* max number of SDs */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200291/* ICH, ATI and VIA have 4 playback and 4 capture */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200292#define ICH6_NUM_CAPTURE 4
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200293#define ICH6_NUM_PLAYBACK 4
294
295/* ULI has 6 playback and 5 capture */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200296#define ULI_NUM_CAPTURE 5
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200297#define ULI_NUM_PLAYBACK 6
298
Felix Kuehling778b6e12006-05-17 11:22:21 +0200299/* ATI HDMI has 1 playback and 0 capture */
Felix Kuehling778b6e12006-05-17 11:22:21 +0200300#define ATIHDMI_NUM_CAPTURE 0
Felix Kuehling778b6e12006-05-17 11:22:21 +0200301#define ATIHDMI_NUM_PLAYBACK 1
302
Kailang Yangf2690022008-05-27 11:44:55 +0200303/* TERA has 4 playback and 3 capture */
304#define TERA_NUM_CAPTURE 3
305#define TERA_NUM_PLAYBACK 4
306
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200307/* this number is statically defined for simplicity */
308#define MAX_AZX_DEV 16
309
Linus Torvalds1da177e2005-04-16 15:20:36 -0700310/* max number of fragments - we may use more if allocating more pages for BDL */
Takashi Iwai4ce107b2008-02-06 14:50:19 +0100311#define BDL_SIZE 4096
312#define AZX_MAX_BDL_ENTRIES (BDL_SIZE / 16)
313#define AZX_MAX_FRAG 32
Linus Torvalds1da177e2005-04-16 15:20:36 -0700314/* max buffer size - no h/w limit, you can increase as you like */
315#define AZX_MAX_BUF_SIZE (1024*1024*1024)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700316
317/* RIRB int mask: overrun[2], response[0] */
318#define RIRB_INT_RESPONSE 0x01
319#define RIRB_INT_OVERRUN 0x04
320#define RIRB_INT_MASK 0x05
321
Takashi Iwai2f5983f2008-09-03 16:00:44 +0200322/* STATESTS int mask: S3,SD2,SD1,SD0 */
Wei Ni7445dfc2010-03-03 15:05:53 +0800323#define AZX_MAX_CODECS 8
324#define AZX_DEFAULT_CODECS 4
Wu Fengguangdeadff12009-08-01 18:45:16 +0800325#define STATESTS_INT_MASK ((1 << AZX_MAX_CODECS) - 1)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700326
327/* SD_CTL bits */
328#define SD_CTL_STREAM_RESET 0x01 /* stream reset bit */
329#define SD_CTL_DMA_START 0x02 /* stream DMA start bit */
Takashi Iwai850f0e52008-03-18 17:11:05 +0100330#define SD_CTL_STRIPE (3 << 16) /* stripe control */
331#define SD_CTL_TRAFFIC_PRIO (1 << 18) /* traffic priority */
332#define SD_CTL_DIR (1 << 19) /* bi-directional stream */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700333#define SD_CTL_STREAM_TAG_MASK (0xf << 20)
334#define SD_CTL_STREAM_TAG_SHIFT 20
335
336/* SD_CTL and SD_STS */
337#define SD_INT_DESC_ERR 0x10 /* descriptor error interrupt */
338#define SD_INT_FIFO_ERR 0x08 /* FIFO error interrupt */
339#define SD_INT_COMPLETE 0x04 /* completion interrupt */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200340#define SD_INT_MASK (SD_INT_DESC_ERR|SD_INT_FIFO_ERR|\
341 SD_INT_COMPLETE)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700342
343/* SD_STS */
344#define SD_STS_FIFO_READY 0x20 /* FIFO ready */
345
346/* INTCTL and INTSTS */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200347#define ICH6_INT_ALL_STREAM 0xff /* all stream interrupts */
348#define ICH6_INT_CTRL_EN 0x40000000 /* controller interrupt enable bit */
349#define ICH6_INT_GLOBAL_EN 0x80000000 /* global interrupt enable bit */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700350
Linus Torvalds1da177e2005-04-16 15:20:36 -0700351/* below are so far hardcoded - should read registers in future */
352#define ICH6_MAX_CORB_ENTRIES 256
353#define ICH6_MAX_RIRB_ENTRIES 256
354
Takashi Iwaic74db862005-05-12 14:26:27 +0200355/* position fix mode */
356enum {
Takashi Iwai0be3b5d2005-09-05 17:11:40 +0200357 POS_FIX_AUTO,
Takashi Iwaid2e1c972008-06-10 17:53:34 +0200358 POS_FIX_LPIB,
Takashi Iwai0be3b5d2005-09-05 17:11:40 +0200359 POS_FIX_POSBUF,
David Henningsson4cb36312010-09-30 10:12:50 +0200360 POS_FIX_VIACOMBO,
Takashi Iwaia6f2fd52012-02-28 11:58:40 +0100361 POS_FIX_COMBO,
Takashi Iwaic74db862005-05-12 14:26:27 +0200362};
Linus Torvalds1da177e2005-04-16 15:20:36 -0700363
Frederick Lif5d40b32005-05-12 14:55:20 +0200364/* Defines for ATI HD Audio support in SB450 south bridge */
Frederick Lif5d40b32005-05-12 14:55:20 +0200365#define ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR 0x42
366#define ATI_SB450_HDAUDIO_ENABLE_SNOOP 0x02
367
Vinod Gda3fca22005-09-13 18:49:12 +0200368/* Defines for Nvidia HDA support */
369#define NVIDIA_HDA_TRANSREG_ADDR 0x4e
370#define NVIDIA_HDA_ENABLE_COHBITS 0x0f
Peer Chen320dcc32008-08-20 16:43:24 -0700371#define NVIDIA_HDA_ISTRM_COH 0x4d
372#define NVIDIA_HDA_OSTRM_COH 0x4c
373#define NVIDIA_HDA_ENABLE_COHBIT 0x01
Frederick Lif5d40b32005-05-12 14:55:20 +0200374
Takashi Iwai90a5ad52008-02-22 18:36:22 +0100375/* Defines for Intel SCH HDA snoop control */
376#define INTEL_SCH_HDA_DEVC 0x78
377#define INTEL_SCH_HDA_DEVC_NOSNOOP (0x1<<11)
378
Joseph Chan0e153472008-08-26 14:38:03 +0200379/* Define IN stream 0 FIFO size offset in VIA controller */
380#define VIA_IN_STREAM0_FIFO_SIZE_OFFSET 0x90
381/* Define VIA HD Audio Device ID*/
382#define VIA_HDAC_DEVICE_ID 0x3288
383
Yang, Libinc4da29c2008-11-13 11:07:07 +0100384/* HD Audio class code */
385#define PCI_CLASS_MULTIMEDIA_HD_AUDIO 0x0403
Takashi Iwai90a5ad52008-02-22 18:36:22 +0100386
Linus Torvalds1da177e2005-04-16 15:20:36 -0700387/*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700388 */
389
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100390struct azx_dev {
Takashi Iwai4ce107b2008-02-06 14:50:19 +0100391 struct snd_dma_buffer bdl; /* BDL buffer */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200392 u32 *posbuf; /* position buffer pointer */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700393
Takashi Iwaid01ce992007-07-27 16:52:19 +0200394 unsigned int bufsize; /* size of the play buffer in bytes */
Takashi Iwai9ad593f2008-05-16 12:34:47 +0200395 unsigned int period_bytes; /* size of the period in bytes */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200396 unsigned int frags; /* number for period in the play buffer */
397 unsigned int fifo_size; /* FIFO size */
Jaroslav Kyselae5463722010-05-11 10:21:46 +0200398 unsigned long start_wallclk; /* start + minimum wallclk */
399 unsigned long period_wallclk; /* wallclk for period */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700400
Takashi Iwaid01ce992007-07-27 16:52:19 +0200401 void __iomem *sd_addr; /* stream descriptor pointer */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700402
Takashi Iwaid01ce992007-07-27 16:52:19 +0200403 u32 sd_int_sta_mask; /* stream int status mask */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700404
405 /* pcm support */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200406 struct snd_pcm_substream *substream; /* assigned substream,
407 * set in PCM open
408 */
409 unsigned int format_val; /* format value to be set in the
410 * controller and the codec
411 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700412 unsigned char stream_tag; /* assigned stream */
413 unsigned char index; /* stream index */
Takashi Iwaid5cf9912011-10-06 10:07:58 +0200414 int assigned_key; /* last device# key assigned to */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700415
Pavel Machek927fc862006-08-31 17:03:43 +0200416 unsigned int opened :1;
417 unsigned int running :1;
Takashi Iwai675f25d2008-06-10 17:53:20 +0200418 unsigned int irq_pending :1;
Takashi Iwaieb49faa2013-03-15 09:19:11 +0100419 unsigned int prepared:1;
420 unsigned int locked:1;
Joseph Chan0e153472008-08-26 14:38:03 +0200421 /*
422 * For VIA:
423 * A flag to ensure DMA position is 0
424 * when link position is not greater than FIFO size
425 */
426 unsigned int insufficient :1;
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200427 unsigned int wc_marked:1;
Takashi Iwai915bf292012-09-11 15:19:10 +0200428 unsigned int no_period_wakeup:1;
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -0500429
430 struct timecounter azx_tc;
431 struct cyclecounter azx_cc;
Takashi Iwaieb49faa2013-03-15 09:19:11 +0100432
433#ifdef CONFIG_SND_HDA_DSP_LOADER
434 struct mutex dsp_mutex;
435#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700436};
437
Takashi Iwaieb49faa2013-03-15 09:19:11 +0100438/* DSP lock helpers */
439#ifdef CONFIG_SND_HDA_DSP_LOADER
440#define dsp_lock_init(dev) mutex_init(&(dev)->dsp_mutex)
441#define dsp_lock(dev) mutex_lock(&(dev)->dsp_mutex)
442#define dsp_unlock(dev) mutex_unlock(&(dev)->dsp_mutex)
443#define dsp_is_locked(dev) ((dev)->locked)
444#else
445#define dsp_lock_init(dev) do {} while (0)
446#define dsp_lock(dev) do {} while (0)
447#define dsp_unlock(dev) do {} while (0)
448#define dsp_is_locked(dev) 0
449#endif
450
Linus Torvalds1da177e2005-04-16 15:20:36 -0700451/* CORB/RIRB */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100452struct azx_rb {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700453 u32 *buf; /* CORB/RIRB buffer
454 * Each CORB entry is 4byte, RIRB is 8byte
455 */
456 dma_addr_t addr; /* physical address of CORB/RIRB buffer */
457 /* for RIRB */
458 unsigned short rp, wp; /* read/write pointers */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800459 int cmds[AZX_MAX_CODECS]; /* number of pending requests */
460 u32 res[AZX_MAX_CODECS]; /* last read value */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700461};
462
Takashi Iwai01b65bf2011-11-24 14:31:46 +0100463struct azx_pcm {
464 struct azx *chip;
465 struct snd_pcm *pcm;
466 struct hda_codec *codec;
467 struct hda_pcm_stream *hinfo[2];
468 struct list_head list;
469};
470
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100471struct azx {
472 struct snd_card *card;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700473 struct pci_dev *pci;
Takashi Iwai555e2192008-06-10 17:53:34 +0200474 int dev_index;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700475
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200476 /* chip type specific */
477 int driver_type;
Takashi Iwai9477c582011-05-25 09:11:37 +0200478 unsigned int driver_caps;
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200479 int playback_streams;
480 int playback_index_offset;
481 int capture_streams;
482 int capture_index_offset;
483 int num_streams;
484
Linus Torvalds1da177e2005-04-16 15:20:36 -0700485 /* pci resources */
486 unsigned long addr;
487 void __iomem *remap_addr;
488 int irq;
489
490 /* locks */
491 spinlock_t reg_lock;
Ingo Molnar62932df2006-01-16 16:34:20 +0100492 struct mutex open_mutex;
Takashi Iwaif4c482a2012-12-04 15:09:23 +0100493 struct completion probe_wait;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700494
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200495 /* streams (x num_streams) */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100496 struct azx_dev *azx_dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700497
498 /* PCM */
Takashi Iwai01b65bf2011-11-24 14:31:46 +0100499 struct list_head pcm_list; /* azx_pcm list */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700500
501 /* HD codec */
502 unsigned short codec_mask;
Takashi Iwaif1eaaee2009-02-13 08:16:55 +0100503 int codec_probe_mask; /* copied from probe_mask option */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700504 struct hda_bus *bus;
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +0100505 unsigned int beep_mode;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700506
507 /* CORB/RIRB */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100508 struct azx_rb corb;
509 struct azx_rb rirb;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700510
Takashi Iwai4ce107b2008-02-06 14:50:19 +0100511 /* CORB/RIRB and position buffers */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700512 struct snd_dma_buffer rb;
513 struct snd_dma_buffer posbuf;
Takashi Iwaic74db862005-05-12 14:26:27 +0200514
Takashi Iwai4918cda2012-08-09 12:33:28 +0200515#ifdef CONFIG_SND_HDA_PATCH_LOADER
516 const struct firmware *fw;
517#endif
518
Takashi Iwaic74db862005-05-12 14:26:27 +0200519 /* flags */
Shahin Ghazinouribeaffc32010-05-11 08:19:55 +0200520 int position_fix[2]; /* for both playback/capture streams */
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200521 int poll_count;
Takashi Iwaicb53c622007-08-10 17:21:45 +0200522 unsigned int running :1;
Pavel Machek927fc862006-08-31 17:03:43 +0200523 unsigned int initialized :1;
524 unsigned int single_cmd :1;
525 unsigned int polling_mode :1;
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200526 unsigned int msi :1;
Takashi Iwaia6a950a2008-06-10 17:53:35 +0200527 unsigned int irq_pending_warned :1;
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +0100528 unsigned int probing :1; /* codec probing phase */
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200529 unsigned int snoop:1;
Takashi Iwai52409aa2012-01-23 17:10:24 +0100530 unsigned int align_buffer_size:1;
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200531 unsigned int region_requested:1;
532
533 /* VGA-switcheroo setup */
534 unsigned int use_vga_switcheroo:1;
Takashi Iwai128960a2012-10-12 17:28:18 +0200535 unsigned int vga_switcheroo_registered:1;
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200536 unsigned int init_failed:1; /* delayed init failed */
537 unsigned int disabled:1; /* disabled by VGA-switcher */
Takashi Iwai43bbb6c2007-07-06 20:22:05 +0200538
539 /* for debugging */
Wu Fengguangfeb27342009-08-01 19:17:14 +0800540 unsigned int last_cmd[AZX_MAX_CODECS];
Takashi Iwai9ad593f2008-05-16 12:34:47 +0200541
542 /* for pending irqs */
543 struct work_struct irq_pending_work;
Takashi Iwai0cbf0092008-10-29 16:18:25 +0100544
Wang Xingchao99a20082013-05-30 22:07:10 +0800545#ifdef CONFIG_SND_HDA_I915
546 struct work_struct probe_work;
547#endif
548
Takashi Iwai0cbf0092008-10-29 16:18:25 +0100549 /* reboot notifier (for mysterious hangup problem at power-down) */
550 struct notifier_block reboot_notifier;
Takashi Iwai65fcd412012-08-14 17:13:32 +0200551
552 /* card list (for power_save trigger) */
553 struct list_head list;
Takashi Iwaieb49faa2013-03-15 09:19:11 +0100554
555#ifdef CONFIG_SND_HDA_DSP_LOADER
556 struct azx_dev saved_azx_dev;
557#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700558};
559
Takashi Iwai1a8506d2012-10-16 15:10:08 +0200560#define CREATE_TRACE_POINTS
561#include "hda_intel_trace.h"
562
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200563/* driver types */
564enum {
565 AZX_DRIVER_ICH,
Seth Heasley32679f92010-02-22 17:31:09 -0800566 AZX_DRIVER_PCH,
Tobin Davis4979bca2008-01-30 08:13:55 +0100567 AZX_DRIVER_SCH,
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200568 AZX_DRIVER_ATI,
Felix Kuehling778b6e12006-05-17 11:22:21 +0200569 AZX_DRIVER_ATIHDMI,
Andiry Xu1815b342011-12-14 16:10:27 +0800570 AZX_DRIVER_ATIHDMI_NS,
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200571 AZX_DRIVER_VIA,
572 AZX_DRIVER_SIS,
573 AZX_DRIVER_ULI,
Vinod Gda3fca22005-09-13 18:49:12 +0200574 AZX_DRIVER_NVIDIA,
Kailang Yangf2690022008-05-27 11:44:55 +0200575 AZX_DRIVER_TERA,
Takashi Iwai14d34f12010-10-21 09:03:25 +0200576 AZX_DRIVER_CTX,
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200577 AZX_DRIVER_CTHDA,
Yang, Libinc4da29c2008-11-13 11:07:07 +0100578 AZX_DRIVER_GENERIC,
Takashi Iwai2f5983f2008-09-03 16:00:44 +0200579 AZX_NUM_DRIVERS, /* keep this as last entry */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200580};
581
Takashi Iwai9477c582011-05-25 09:11:37 +0200582/* driver quirks (capabilities) */
583/* bits 0-7 are used for indicating driver type */
584#define AZX_DCAPS_NO_TCSEL (1 << 8) /* No Intel TCSEL bit */
585#define AZX_DCAPS_NO_MSI (1 << 9) /* No MSI support */
586#define AZX_DCAPS_ATI_SNOOP (1 << 10) /* ATI snoop enable */
587#define AZX_DCAPS_NVIDIA_SNOOP (1 << 11) /* Nvidia snoop enable */
588#define AZX_DCAPS_SCH_SNOOP (1 << 12) /* SCH/PCH snoop enable */
589#define AZX_DCAPS_RIRB_DELAY (1 << 13) /* Long delay in read loop */
590#define AZX_DCAPS_RIRB_PRE_DELAY (1 << 14) /* Put a delay before read */
591#define AZX_DCAPS_CTX_WORKAROUND (1 << 15) /* X-Fi workaround */
592#define AZX_DCAPS_POSFIX_LPIB (1 << 16) /* Use LPIB as default */
593#define AZX_DCAPS_POSFIX_VIA (1 << 17) /* Use VIACOMBO as default */
594#define AZX_DCAPS_NO_64BIT (1 << 18) /* No 64bit address */
595#define AZX_DCAPS_SYNC_WRITE (1 << 19) /* sync each cmd write */
Takashi Iwai8b0bd222011-06-10 14:56:26 +0200596#define AZX_DCAPS_OLD_SSYNC (1 << 20) /* Old SSYNC reg for ICH */
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -0500597#define AZX_DCAPS_BUFSIZE (1 << 21) /* no buffer size alignment */
Takashi Iwai7bfe0592012-01-23 17:53:39 +0100598#define AZX_DCAPS_ALIGN_BUFSIZE (1 << 22) /* buffer size alignment */
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200599#define AZX_DCAPS_4K_BDLE_BOUNDARY (1 << 23) /* BDLE in 4k boundary */
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -0500600#define AZX_DCAPS_COUNT_LPIB_DELAY (1 << 25) /* Take LPIB as delay */
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +0100601#define AZX_DCAPS_PM_RUNTIME (1 << 26) /* runtime PM support */
Wang Xingchao99a20082013-05-30 22:07:10 +0800602#define AZX_DCAPS_I915_POWERWELL (1 << 27) /* HSW i915 power well support */
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +0100603
604/* quirks for Intel PCH */
Takashi Iwaid7dab4d2013-01-08 13:51:30 +0100605#define AZX_DCAPS_INTEL_PCH_NOPM \
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +0100606 (AZX_DCAPS_SCH_SNOOP | AZX_DCAPS_BUFSIZE | \
Takashi Iwaid7dab4d2013-01-08 13:51:30 +0100607 AZX_DCAPS_COUNT_LPIB_DELAY)
608
609#define AZX_DCAPS_INTEL_PCH \
610 (AZX_DCAPS_INTEL_PCH_NOPM | AZX_DCAPS_PM_RUNTIME)
Takashi Iwai9477c582011-05-25 09:11:37 +0200611
612/* quirks for ATI SB / AMD Hudson */
613#define AZX_DCAPS_PRESET_ATI_SB \
614 (AZX_DCAPS_ATI_SNOOP | AZX_DCAPS_NO_TCSEL | \
615 AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB)
616
617/* quirks for ATI/AMD HDMI */
618#define AZX_DCAPS_PRESET_ATI_HDMI \
619 (AZX_DCAPS_NO_TCSEL | AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB)
620
621/* quirks for Nvidia */
622#define AZX_DCAPS_PRESET_NVIDIA \
Takashi Iwai7bfe0592012-01-23 17:53:39 +0100623 (AZX_DCAPS_NVIDIA_SNOOP | AZX_DCAPS_RIRB_DELAY | AZX_DCAPS_NO_MSI |\
Mike Travis49d9e772013-05-01 14:04:08 -0500624 AZX_DCAPS_ALIGN_BUFSIZE | AZX_DCAPS_NO_64BIT)
Takashi Iwai9477c582011-05-25 09:11:37 +0200625
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200626#define AZX_DCAPS_PRESET_CTHDA \
627 (AZX_DCAPS_NO_MSI | AZX_DCAPS_POSFIX_LPIB | AZX_DCAPS_4K_BDLE_BOUNDARY)
628
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200629/*
630 * VGA-switcher support
631 */
632#ifdef SUPPORT_VGA_SWITCHEROO
Takashi Iwai5cb543d2012-08-09 13:49:23 +0200633#define use_vga_switcheroo(chip) ((chip)->use_vga_switcheroo)
634#else
635#define use_vga_switcheroo(chip) 0
636#endif
637
Takashi Iwai48c8b0e2012-12-07 07:40:35 +0100638static char *driver_short_names[] = {
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200639 [AZX_DRIVER_ICH] = "HDA Intel",
Seth Heasley32679f92010-02-22 17:31:09 -0800640 [AZX_DRIVER_PCH] = "HDA Intel PCH",
Tobin Davis4979bca2008-01-30 08:13:55 +0100641 [AZX_DRIVER_SCH] = "HDA Intel MID",
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200642 [AZX_DRIVER_ATI] = "HDA ATI SB",
Felix Kuehling778b6e12006-05-17 11:22:21 +0200643 [AZX_DRIVER_ATIHDMI] = "HDA ATI HDMI",
Andiry Xu1815b342011-12-14 16:10:27 +0800644 [AZX_DRIVER_ATIHDMI_NS] = "HDA ATI HDMI",
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200645 [AZX_DRIVER_VIA] = "HDA VIA VT82xx",
646 [AZX_DRIVER_SIS] = "HDA SIS966",
Vinod Gda3fca22005-09-13 18:49:12 +0200647 [AZX_DRIVER_ULI] = "HDA ULI M5461",
648 [AZX_DRIVER_NVIDIA] = "HDA NVidia",
Kailang Yangf2690022008-05-27 11:44:55 +0200649 [AZX_DRIVER_TERA] = "HDA Teradici",
Takashi Iwai14d34f12010-10-21 09:03:25 +0200650 [AZX_DRIVER_CTX] = "HDA Creative",
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200651 [AZX_DRIVER_CTHDA] = "HDA Creative",
Yang, Libinc4da29c2008-11-13 11:07:07 +0100652 [AZX_DRIVER_GENERIC] = "HD-Audio Generic",
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200653};
654
Linus Torvalds1da177e2005-04-16 15:20:36 -0700655/*
656 * macros for easy use
657 */
658#define azx_writel(chip,reg,value) \
659 writel(value, (chip)->remap_addr + ICH6_REG_##reg)
660#define azx_readl(chip,reg) \
661 readl((chip)->remap_addr + ICH6_REG_##reg)
662#define azx_writew(chip,reg,value) \
663 writew(value, (chip)->remap_addr + ICH6_REG_##reg)
664#define azx_readw(chip,reg) \
665 readw((chip)->remap_addr + ICH6_REG_##reg)
666#define azx_writeb(chip,reg,value) \
667 writeb(value, (chip)->remap_addr + ICH6_REG_##reg)
668#define azx_readb(chip,reg) \
669 readb((chip)->remap_addr + ICH6_REG_##reg)
670
671#define azx_sd_writel(dev,reg,value) \
672 writel(value, (dev)->sd_addr + ICH6_REG_##reg)
673#define azx_sd_readl(dev,reg) \
674 readl((dev)->sd_addr + ICH6_REG_##reg)
675#define azx_sd_writew(dev,reg,value) \
676 writew(value, (dev)->sd_addr + ICH6_REG_##reg)
677#define azx_sd_readw(dev,reg) \
678 readw((dev)->sd_addr + ICH6_REG_##reg)
679#define azx_sd_writeb(dev,reg,value) \
680 writeb(value, (dev)->sd_addr + ICH6_REG_##reg)
681#define azx_sd_readb(dev,reg) \
682 readb((dev)->sd_addr + ICH6_REG_##reg)
683
684/* for pcm support */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100685#define get_azx_dev(substream) (substream->runtime->private_data)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700686
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200687#ifdef CONFIG_X86
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100688static void __mark_pages_wc(struct azx *chip, struct snd_dma_buffer *dmab, bool on)
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200689{
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100690 int pages;
691
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200692 if (azx_snoop(chip))
693 return;
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100694 if (!dmab || !dmab->area || !dmab->bytes)
695 return;
696
697#ifdef CONFIG_SND_DMA_SGBUF
698 if (dmab->dev.type == SNDRV_DMA_TYPE_DEV_SG) {
699 struct snd_sg_buf *sgbuf = dmab->private_data;
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200700 if (on)
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100701 set_pages_array_wc(sgbuf->page_table, sgbuf->pages);
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200702 else
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100703 set_pages_array_wb(sgbuf->page_table, sgbuf->pages);
704 return;
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200705 }
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100706#endif
707
708 pages = (dmab->bytes + PAGE_SIZE - 1) >> PAGE_SHIFT;
709 if (on)
710 set_memory_wc((unsigned long)dmab->area, pages);
711 else
712 set_memory_wb((unsigned long)dmab->area, pages);
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200713}
714
715static inline void mark_pages_wc(struct azx *chip, struct snd_dma_buffer *buf,
716 bool on)
717{
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100718 __mark_pages_wc(chip, buf, on);
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200719}
720static inline void mark_runtime_wc(struct azx *chip, struct azx_dev *azx_dev,
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100721 struct snd_pcm_substream *substream, bool on)
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200722{
723 if (azx_dev->wc_marked != on) {
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100724 __mark_pages_wc(chip, snd_pcm_get_dma_buf(substream), on);
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200725 azx_dev->wc_marked = on;
726 }
727}
728#else
729/* NOP for other archs */
730static inline void mark_pages_wc(struct azx *chip, struct snd_dma_buffer *buf,
731 bool on)
732{
733}
734static inline void mark_runtime_wc(struct azx *chip, struct azx_dev *azx_dev,
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100735 struct snd_pcm_substream *substream, bool on)
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200736{
737}
738#endif
739
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200740static int azx_acquire_irq(struct azx *chip, int do_disconnect);
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200741static int azx_send_cmd(struct hda_bus *bus, unsigned int val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700742/*
743 * Interface for HD codec
744 */
745
Linus Torvalds1da177e2005-04-16 15:20:36 -0700746/*
747 * CORB / RIRB interface
748 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100749static int azx_alloc_cmd_io(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700750{
751 int err;
752
753 /* single page (at least 4096 bytes) must suffice for both ringbuffes */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200754 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
755 snd_dma_pci_data(chip->pci),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700756 PAGE_SIZE, &chip->rb);
757 if (err < 0) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +0800758 snd_printk(KERN_ERR SFX "%s: cannot allocate CORB/RIRB\n", pci_name(chip->pci));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700759 return err;
760 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200761 mark_pages_wc(chip, &chip->rb, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700762 return 0;
763}
764
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100765static void azx_init_cmd_io(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700766{
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800767 spin_lock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700768 /* CORB set up */
769 chip->corb.addr = chip->rb.addr;
770 chip->corb.buf = (u32 *)chip->rb.area;
771 azx_writel(chip, CORBLBASE, (u32)chip->corb.addr);
Takashi Iwai766979e2008-06-13 20:53:56 +0200772 azx_writel(chip, CORBUBASE, upper_32_bits(chip->corb.addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700773
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200774 /* set the corb size to 256 entries (ULI requires explicitly) */
775 azx_writeb(chip, CORBSIZE, 0x02);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700776 /* set the corb write pointer to 0 */
777 azx_writew(chip, CORBWP, 0);
778 /* reset the corb hw read pointer */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200779 azx_writew(chip, CORBRP, ICH6_CORBRP_RST);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700780 /* enable corb dma */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200781 azx_writeb(chip, CORBCTL, ICH6_CORBCTL_RUN);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700782
783 /* RIRB set up */
784 chip->rirb.addr = chip->rb.addr + 2048;
785 chip->rirb.buf = (u32 *)(chip->rb.area + 2048);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800786 chip->rirb.wp = chip->rirb.rp = 0;
787 memset(chip->rirb.cmds, 0, sizeof(chip->rirb.cmds));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700788 azx_writel(chip, RIRBLBASE, (u32)chip->rirb.addr);
Takashi Iwai766979e2008-06-13 20:53:56 +0200789 azx_writel(chip, RIRBUBASE, upper_32_bits(chip->rirb.addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700790
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200791 /* set the rirb size to 256 entries (ULI requires explicitly) */
792 azx_writeb(chip, RIRBSIZE, 0x02);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700793 /* reset the rirb hw write pointer */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200794 azx_writew(chip, RIRBWP, ICH6_RIRBWP_RST);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700795 /* set N=1, get RIRB response interrupt for new entry */
Takashi Iwai9477c582011-05-25 09:11:37 +0200796 if (chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND)
Takashi Iwai14d34f12010-10-21 09:03:25 +0200797 azx_writew(chip, RINTCNT, 0xc0);
798 else
799 azx_writew(chip, RINTCNT, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700800 /* enable rirb dma and response irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700801 azx_writeb(chip, RIRBCTL, ICH6_RBCTL_DMA_EN | ICH6_RBCTL_IRQ_EN);
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800802 spin_unlock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700803}
804
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100805static void azx_free_cmd_io(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700806{
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800807 spin_lock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700808 /* disable ringbuffer DMAs */
809 azx_writeb(chip, RIRBCTL, 0);
810 azx_writeb(chip, CORBCTL, 0);
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800811 spin_unlock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700812}
813
Wu Fengguangdeadff12009-08-01 18:45:16 +0800814static unsigned int azx_command_addr(u32 cmd)
815{
816 unsigned int addr = cmd >> 28;
817
818 if (addr >= AZX_MAX_CODECS) {
819 snd_BUG();
820 addr = 0;
821 }
822
823 return addr;
824}
825
826static unsigned int azx_response_addr(u32 res)
827{
828 unsigned int addr = res & 0xf;
829
830 if (addr >= AZX_MAX_CODECS) {
831 snd_BUG();
832 addr = 0;
833 }
834
835 return addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700836}
837
838/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100839static int azx_corb_send_cmd(struct hda_bus *bus, u32 val)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700840{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100841 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800842 unsigned int addr = azx_command_addr(val);
Takashi Iwai3bcce5c2012-12-20 11:17:17 +0100843 unsigned int wp, rp;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700844
Wu Fengguangc32649f2009-08-01 18:48:12 +0800845 spin_lock_irq(&chip->reg_lock);
846
Linus Torvalds1da177e2005-04-16 15:20:36 -0700847 /* add command to corb */
Takashi Iwaicc5ede32012-12-12 11:10:49 +0100848 wp = azx_readw(chip, CORBWP);
849 if (wp == 0xffff) {
850 /* something wrong, controller likely turned to D3 */
851 spin_unlock_irq(&chip->reg_lock);
Takashi Iwai3bcce5c2012-12-20 11:17:17 +0100852 return -EIO;
Takashi Iwaicc5ede32012-12-12 11:10:49 +0100853 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700854 wp++;
855 wp %= ICH6_MAX_CORB_ENTRIES;
856
Takashi Iwai3bcce5c2012-12-20 11:17:17 +0100857 rp = azx_readw(chip, CORBRP);
858 if (wp == rp) {
859 /* oops, it's full */
860 spin_unlock_irq(&chip->reg_lock);
861 return -EAGAIN;
862 }
863
Wu Fengguangdeadff12009-08-01 18:45:16 +0800864 chip->rirb.cmds[addr]++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700865 chip->corb.buf[wp] = cpu_to_le32(val);
866 azx_writel(chip, CORBWP, wp);
Wu Fengguangc32649f2009-08-01 18:48:12 +0800867
Linus Torvalds1da177e2005-04-16 15:20:36 -0700868 spin_unlock_irq(&chip->reg_lock);
869
870 return 0;
871}
872
873#define ICH6_RIRB_EX_UNSOL_EV (1<<4)
874
875/* retrieve RIRB entry - called from interrupt handler */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100876static void azx_update_rirb(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700877{
878 unsigned int rp, wp;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800879 unsigned int addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700880 u32 res, res_ex;
881
Takashi Iwaicc5ede32012-12-12 11:10:49 +0100882 wp = azx_readw(chip, RIRBWP);
883 if (wp == 0xffff) {
884 /* something wrong, controller likely turned to D3 */
885 return;
886 }
887
Linus Torvalds1da177e2005-04-16 15:20:36 -0700888 if (wp == chip->rirb.wp)
889 return;
890 chip->rirb.wp = wp;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800891
Linus Torvalds1da177e2005-04-16 15:20:36 -0700892 while (chip->rirb.rp != wp) {
893 chip->rirb.rp++;
894 chip->rirb.rp %= ICH6_MAX_RIRB_ENTRIES;
895
896 rp = chip->rirb.rp << 1; /* an RIRB entry is 8-bytes */
897 res_ex = le32_to_cpu(chip->rirb.buf[rp + 1]);
898 res = le32_to_cpu(chip->rirb.buf[rp]);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800899 addr = azx_response_addr(res_ex);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700900 if (res_ex & ICH6_RIRB_EX_UNSOL_EV)
901 snd_hda_queue_unsol_event(chip->bus, res, res_ex);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800902 else if (chip->rirb.cmds[addr]) {
903 chip->rirb.res[addr] = res;
Takashi Iwai2add9b92008-03-18 09:47:06 +0100904 smp_wmb();
Wu Fengguangdeadff12009-08-01 18:45:16 +0800905 chip->rirb.cmds[addr]--;
Wu Fengguange310bb02009-08-01 19:18:45 +0800906 } else
Takashi Iwai9e3d3522012-10-17 08:39:37 +0200907 snd_printk(KERN_ERR SFX "%s: spurious response %#x:%#x, "
Wu Fengguange310bb02009-08-01 19:18:45 +0800908 "last cmd=%#08x\n",
Takashi Iwai9e3d3522012-10-17 08:39:37 +0200909 pci_name(chip->pci),
Wu Fengguange310bb02009-08-01 19:18:45 +0800910 res, res_ex,
911 chip->last_cmd[addr]);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700912 }
913}
914
915/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800916static unsigned int azx_rirb_get_response(struct hda_bus *bus,
917 unsigned int addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700918{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100919 struct azx *chip = bus->private_data;
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200920 unsigned long timeout;
David Henningsson32cf4022012-05-04 11:05:55 +0200921 unsigned long loopcounter;
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200922 int do_poll = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700923
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200924 again:
925 timeout = jiffies + msecs_to_jiffies(1000);
David Henningsson32cf4022012-05-04 11:05:55 +0200926
927 for (loopcounter = 0;; loopcounter++) {
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200928 if (chip->polling_mode || do_poll) {
Takashi Iwaie96224a2006-08-21 17:57:44 +0200929 spin_lock_irq(&chip->reg_lock);
930 azx_update_rirb(chip);
931 spin_unlock_irq(&chip->reg_lock);
932 }
Wu Fengguangdeadff12009-08-01 18:45:16 +0800933 if (!chip->rirb.cmds[addr]) {
Takashi Iwai2add9b92008-03-18 09:47:06 +0100934 smp_rmb();
Takashi Iwaib6132912009-03-24 07:36:09 +0100935 bus->rirb_error = 0;
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200936
937 if (!do_poll)
938 chip->poll_count = 0;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800939 return chip->rirb.res[addr]; /* the last value */
Takashi Iwai2add9b92008-03-18 09:47:06 +0100940 }
Takashi Iwai28a0d9d2008-01-18 15:32:32 +0100941 if (time_after(jiffies, timeout))
942 break;
David Henningsson32cf4022012-05-04 11:05:55 +0200943 if (bus->needs_damn_long_delay || loopcounter > 3000)
Takashi Iwai52987652008-01-16 16:09:47 +0100944 msleep(2); /* temporary workaround */
945 else {
946 udelay(10);
947 cond_resched();
948 }
Takashi Iwai28a0d9d2008-01-18 15:32:32 +0100949 }
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200950
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200951 if (!chip->polling_mode && chip->poll_count < 2) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +0800952 snd_printdd(SFX "%s: azx_get_response timeout, "
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200953 "polling the codec once: last cmd=0x%08x\n",
Daniel J Blueman445a51b2012-12-05 23:04:21 +0800954 pci_name(chip->pci), chip->last_cmd[addr]);
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200955 do_poll = 1;
956 chip->poll_count++;
957 goto again;
958 }
959
960
Takashi Iwai23c4a882009-10-30 13:21:49 +0100961 if (!chip->polling_mode) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +0800962 snd_printk(KERN_WARNING SFX "%s: azx_get_response timeout, "
Takashi Iwai23c4a882009-10-30 13:21:49 +0100963 "switching to polling mode: last cmd=0x%08x\n",
Daniel J Blueman445a51b2012-12-05 23:04:21 +0800964 pci_name(chip->pci), chip->last_cmd[addr]);
Takashi Iwai23c4a882009-10-30 13:21:49 +0100965 chip->polling_mode = 1;
966 goto again;
967 }
968
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200969 if (chip->msi) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +0800970 snd_printk(KERN_WARNING SFX "%s: No response from codec, "
Wu Fengguangfeb27342009-08-01 19:17:14 +0800971 "disabling MSI: last cmd=0x%08x\n",
Daniel J Blueman445a51b2012-12-05 23:04:21 +0800972 pci_name(chip->pci), chip->last_cmd[addr]);
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200973 free_irq(chip->irq, chip);
974 chip->irq = -1;
975 pci_disable_msi(chip->pci);
976 chip->msi = 0;
Takashi Iwaib6132912009-03-24 07:36:09 +0100977 if (azx_acquire_irq(chip, 1) < 0) {
978 bus->rirb_error = 1;
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200979 return -1;
Takashi Iwaib6132912009-03-24 07:36:09 +0100980 }
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200981 goto again;
982 }
983
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +0100984 if (chip->probing) {
985 /* If this critical timeout happens during the codec probing
986 * phase, this is likely an access to a non-existing codec
987 * slot. Better to return an error and reset the system.
988 */
989 return -1;
990 }
991
Takashi Iwai8dd78332009-06-02 01:16:07 +0200992 /* a fatal communication error; need either to reset or to fallback
993 * to the single_cmd mode
994 */
Takashi Iwaib6132912009-03-24 07:36:09 +0100995 bus->rirb_error = 1;
Takashi Iwaib20f3b82009-06-02 01:20:22 +0200996 if (bus->allow_bus_reset && !bus->response_reset && !bus->in_reset) {
Takashi Iwai8dd78332009-06-02 01:16:07 +0200997 bus->response_reset = 1;
998 return -1; /* give a chance to retry */
999 }
1000
1001 snd_printk(KERN_ERR "hda_intel: azx_get_response timeout, "
1002 "switching to single_cmd mode: last cmd=0x%08x\n",
Wu Fengguangfeb27342009-08-01 19:17:14 +08001003 chip->last_cmd[addr]);
Takashi Iwai8dd78332009-06-02 01:16:07 +02001004 chip->single_cmd = 1;
1005 bus->response_reset = 0;
Takashi Iwai1a696972009-11-07 09:49:04 +01001006 /* release CORB/RIRB */
Takashi Iwai4fcd3922009-05-25 18:34:52 +02001007 azx_free_cmd_io(chip);
Takashi Iwai1a696972009-11-07 09:49:04 +01001008 /* disable unsolicited responses */
1009 azx_writel(chip, GCTL, azx_readl(chip, GCTL) & ~ICH6_GCTL_UNSOL);
Takashi Iwai5c79b1f2006-09-21 13:34:13 +02001010 return -1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001011}
1012
Linus Torvalds1da177e2005-04-16 15:20:36 -07001013/*
1014 * Use the single immediate command instead of CORB/RIRB for simplicity
1015 *
1016 * Note: according to Intel, this is not preferred use. The command was
1017 * intended for the BIOS only, and may get confused with unsolicited
1018 * responses. So, we shouldn't use it for normal operation from the
1019 * driver.
1020 * I left the codes, however, for debugging/testing purposes.
1021 */
1022
Takashi Iwaib05a7d42009-05-28 11:59:12 +02001023/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +08001024static int azx_single_wait_for_response(struct azx *chip, unsigned int addr)
Takashi Iwaib05a7d42009-05-28 11:59:12 +02001025{
1026 int timeout = 50;
1027
1028 while (timeout--) {
1029 /* check IRV busy bit */
1030 if (azx_readw(chip, IRS) & ICH6_IRS_VALID) {
1031 /* reuse rirb.res as the response return value */
Wu Fengguangdeadff12009-08-01 18:45:16 +08001032 chip->rirb.res[addr] = azx_readl(chip, IR);
Takashi Iwaib05a7d42009-05-28 11:59:12 +02001033 return 0;
1034 }
1035 udelay(1);
1036 }
1037 if (printk_ratelimit())
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001038 snd_printd(SFX "%s: get_response timeout: IRS=0x%x\n",
1039 pci_name(chip->pci), azx_readw(chip, IRS));
Wu Fengguangdeadff12009-08-01 18:45:16 +08001040 chip->rirb.res[addr] = -1;
Takashi Iwaib05a7d42009-05-28 11:59:12 +02001041 return -EIO;
1042}
1043
Linus Torvalds1da177e2005-04-16 15:20:36 -07001044/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001045static int azx_single_send_cmd(struct hda_bus *bus, u32 val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001046{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001047 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +08001048 unsigned int addr = azx_command_addr(val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001049 int timeout = 50;
1050
Takashi Iwai8dd78332009-06-02 01:16:07 +02001051 bus->rirb_error = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001052 while (timeout--) {
1053 /* check ICB busy bit */
Takashi Iwaid01ce992007-07-27 16:52:19 +02001054 if (!((azx_readw(chip, IRS) & ICH6_IRS_BUSY))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001055 /* Clear IRV valid bit */
Takashi Iwaid01ce992007-07-27 16:52:19 +02001056 azx_writew(chip, IRS, azx_readw(chip, IRS) |
1057 ICH6_IRS_VALID);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001058 azx_writel(chip, IC, val);
Takashi Iwaid01ce992007-07-27 16:52:19 +02001059 azx_writew(chip, IRS, azx_readw(chip, IRS) |
1060 ICH6_IRS_BUSY);
Wu Fengguangdeadff12009-08-01 18:45:16 +08001061 return azx_single_wait_for_response(chip, addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001062 }
1063 udelay(1);
1064 }
Marc Boucher1cfd52b2008-01-22 15:29:26 +01001065 if (printk_ratelimit())
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001066 snd_printd(SFX "%s: send_cmd timeout: IRS=0x%x, val=0x%x\n",
1067 pci_name(chip->pci), azx_readw(chip, IRS), val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001068 return -EIO;
1069}
1070
1071/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +08001072static unsigned int azx_single_get_response(struct hda_bus *bus,
1073 unsigned int addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001074{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001075 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +08001076 return chip->rirb.res[addr];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001077}
1078
Takashi Iwai111d3af2006-02-16 18:17:58 +01001079/*
1080 * The below are the main callbacks from hda_codec.
1081 *
1082 * They are just the skeleton to call sub-callbacks according to the
1083 * current setting of chip->single_cmd.
1084 */
1085
1086/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001087static int azx_send_cmd(struct hda_bus *bus, unsigned int val)
Takashi Iwai111d3af2006-02-16 18:17:58 +01001088{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001089 struct azx *chip = bus->private_data;
Takashi Iwai43bbb6c2007-07-06 20:22:05 +02001090
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001091 if (chip->disabled)
1092 return 0;
Wu Fengguangfeb27342009-08-01 19:17:14 +08001093 chip->last_cmd[azx_command_addr(val)] = val;
Takashi Iwai111d3af2006-02-16 18:17:58 +01001094 if (chip->single_cmd)
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001095 return azx_single_send_cmd(bus, val);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001096 else
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001097 return azx_corb_send_cmd(bus, val);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001098}
1099
1100/* get a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +08001101static unsigned int azx_get_response(struct hda_bus *bus,
1102 unsigned int addr)
Takashi Iwai111d3af2006-02-16 18:17:58 +01001103{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001104 struct azx *chip = bus->private_data;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001105 if (chip->disabled)
1106 return 0;
Takashi Iwai111d3af2006-02-16 18:17:58 +01001107 if (chip->single_cmd)
Wu Fengguangdeadff12009-08-01 18:45:16 +08001108 return azx_single_get_response(bus, addr);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001109 else
Wu Fengguangdeadff12009-08-01 18:45:16 +08001110 return azx_rirb_get_response(bus, addr);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001111}
1112
Takashi Iwai83012a72012-08-24 18:38:08 +02001113#ifdef CONFIG_PM
Takashi Iwai68467f52012-08-28 09:14:29 -07001114static void azx_power_notify(struct hda_bus *bus, bool power_up);
Takashi Iwaicb53c622007-08-10 17:21:45 +02001115#endif
Takashi Iwai111d3af2006-02-16 18:17:58 +01001116
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001117#ifdef CONFIG_SND_HDA_DSP_LOADER
1118static int azx_load_dsp_prepare(struct hda_bus *bus, unsigned int format,
1119 unsigned int byte_size,
1120 struct snd_dma_buffer *bufp);
1121static void azx_load_dsp_trigger(struct hda_bus *bus, bool start);
1122static void azx_load_dsp_cleanup(struct hda_bus *bus,
1123 struct snd_dma_buffer *dmab);
1124#endif
1125
Linus Torvalds1da177e2005-04-16 15:20:36 -07001126/* reset codec link */
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001127static int azx_reset(struct azx *chip, int full_reset)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001128{
Mengdong Linfa348da2012-12-12 09:16:15 -05001129 unsigned long timeout;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001130
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001131 if (!full_reset)
1132 goto __skip;
1133
Danny Tholene8a7f132007-09-11 21:41:56 +02001134 /* clear STATESTS */
1135 azx_writeb(chip, STATESTS, STATESTS_INT_MASK);
1136
Linus Torvalds1da177e2005-04-16 15:20:36 -07001137 /* reset controller */
1138 azx_writel(chip, GCTL, azx_readl(chip, GCTL) & ~ICH6_GCTL_RESET);
1139
Mengdong Linfa348da2012-12-12 09:16:15 -05001140 timeout = jiffies + msecs_to_jiffies(100);
1141 while (azx_readb(chip, GCTL) &&
1142 time_before(jiffies, timeout))
1143 usleep_range(500, 1000);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001144
1145 /* delay for >= 100us for codec PLL to settle per spec
1146 * Rev 0.9 section 5.5.1
1147 */
Mengdong Linfa348da2012-12-12 09:16:15 -05001148 usleep_range(500, 1000);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001149
1150 /* Bring controller out of reset */
1151 azx_writeb(chip, GCTL, azx_readb(chip, GCTL) | ICH6_GCTL_RESET);
1152
Mengdong Linfa348da2012-12-12 09:16:15 -05001153 timeout = jiffies + msecs_to_jiffies(100);
1154 while (!azx_readb(chip, GCTL) &&
1155 time_before(jiffies, timeout))
1156 usleep_range(500, 1000);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001157
Pavel Machek927fc862006-08-31 17:03:43 +02001158 /* Brent Chartrand said to wait >= 540us for codecs to initialize */
Mengdong Linfa348da2012-12-12 09:16:15 -05001159 usleep_range(1000, 1200);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001160
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001161 __skip:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001162 /* check to see if controller is ready */
Pavel Machek927fc862006-08-31 17:03:43 +02001163 if (!azx_readb(chip, GCTL)) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001164 snd_printd(SFX "%s: azx_reset: controller not ready!\n", pci_name(chip->pci));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001165 return -EBUSY;
1166 }
1167
Matt41e2fce2005-07-04 17:49:55 +02001168 /* Accept unsolicited responses */
Takashi Iwai1a696972009-11-07 09:49:04 +01001169 if (!chip->single_cmd)
1170 azx_writel(chip, GCTL, azx_readl(chip, GCTL) |
1171 ICH6_GCTL_UNSOL);
Matt41e2fce2005-07-04 17:49:55 +02001172
Linus Torvalds1da177e2005-04-16 15:20:36 -07001173 /* detect codecs */
Pavel Machek927fc862006-08-31 17:03:43 +02001174 if (!chip->codec_mask) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001175 chip->codec_mask = azx_readw(chip, STATESTS);
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001176 snd_printdd(SFX "%s: codec_mask = 0x%x\n", pci_name(chip->pci), chip->codec_mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001177 }
1178
1179 return 0;
1180}
1181
1182
1183/*
1184 * Lowlevel interface
1185 */
1186
1187/* enable interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001188static void azx_int_enable(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001189{
1190 /* enable controller CIE and GIE */
1191 azx_writel(chip, INTCTL, azx_readl(chip, INTCTL) |
1192 ICH6_INT_CTRL_EN | ICH6_INT_GLOBAL_EN);
1193}
1194
1195/* disable interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001196static void azx_int_disable(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001197{
1198 int i;
1199
1200 /* disable interrupts in stream descriptor */
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001201 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001202 struct azx_dev *azx_dev = &chip->azx_dev[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001203 azx_sd_writeb(azx_dev, SD_CTL,
1204 azx_sd_readb(azx_dev, SD_CTL) & ~SD_INT_MASK);
1205 }
1206
1207 /* disable SIE for all streams */
1208 azx_writeb(chip, INTCTL, 0);
1209
1210 /* disable controller CIE and GIE */
1211 azx_writel(chip, INTCTL, azx_readl(chip, INTCTL) &
1212 ~(ICH6_INT_CTRL_EN | ICH6_INT_GLOBAL_EN));
1213}
1214
1215/* clear interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001216static void azx_int_clear(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001217{
1218 int i;
1219
1220 /* clear stream status */
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001221 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001222 struct azx_dev *azx_dev = &chip->azx_dev[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001223 azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK);
1224 }
1225
1226 /* clear STATESTS */
1227 azx_writeb(chip, STATESTS, STATESTS_INT_MASK);
1228
1229 /* clear rirb status */
1230 azx_writeb(chip, RIRBSTS, RIRB_INT_MASK);
1231
1232 /* clear int status */
1233 azx_writel(chip, INTSTS, ICH6_INT_CTRL_EN | ICH6_INT_ALL_STREAM);
1234}
1235
1236/* start a stream */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001237static void azx_stream_start(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001238{
Joseph Chan0e153472008-08-26 14:38:03 +02001239 /*
1240 * Before stream start, initialize parameter
1241 */
1242 azx_dev->insufficient = 1;
1243
Linus Torvalds1da177e2005-04-16 15:20:36 -07001244 /* enable SIE */
Wei Niccc5df02010-01-26 15:59:33 +08001245 azx_writel(chip, INTCTL,
1246 azx_readl(chip, INTCTL) | (1 << azx_dev->index));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001247 /* set DMA start and interrupt mask */
1248 azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) |
1249 SD_CTL_DMA_START | SD_INT_MASK);
1250}
1251
Takashi Iwai1dddab42009-03-18 15:15:37 +01001252/* stop DMA */
1253static void azx_stream_clear(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001254{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001255 azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) &
1256 ~(SD_CTL_DMA_START | SD_INT_MASK));
1257 azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK); /* to be sure */
Takashi Iwai1dddab42009-03-18 15:15:37 +01001258}
1259
1260/* stop a stream */
1261static void azx_stream_stop(struct azx *chip, struct azx_dev *azx_dev)
1262{
1263 azx_stream_clear(chip, azx_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001264 /* disable SIE */
Wei Niccc5df02010-01-26 15:59:33 +08001265 azx_writel(chip, INTCTL,
1266 azx_readl(chip, INTCTL) & ~(1 << azx_dev->index));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001267}
1268
1269
1270/*
Takashi Iwaicb53c622007-08-10 17:21:45 +02001271 * reset and start the controller registers
Linus Torvalds1da177e2005-04-16 15:20:36 -07001272 */
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001273static void azx_init_chip(struct azx *chip, int full_reset)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001274{
Takashi Iwaicb53c622007-08-10 17:21:45 +02001275 if (chip->initialized)
1276 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001277
1278 /* reset controller */
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001279 azx_reset(chip, full_reset);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001280
1281 /* initialize interrupts */
1282 azx_int_clear(chip);
1283 azx_int_enable(chip);
1284
1285 /* initialize the codec command I/O */
Takashi Iwai1a696972009-11-07 09:49:04 +01001286 if (!chip->single_cmd)
1287 azx_init_cmd_io(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001288
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02001289 /* program the position buffer */
1290 azx_writel(chip, DPLBASE, (u32)chip->posbuf.addr);
Takashi Iwai766979e2008-06-13 20:53:56 +02001291 azx_writel(chip, DPUBASE, upper_32_bits(chip->posbuf.addr));
Frederick Lif5d40b32005-05-12 14:55:20 +02001292
Takashi Iwaicb53c622007-08-10 17:21:45 +02001293 chip->initialized = 1;
1294}
1295
1296/*
1297 * initialize the PCI registers
1298 */
1299/* update bits in a PCI register byte */
1300static void update_pci_byte(struct pci_dev *pci, unsigned int reg,
1301 unsigned char mask, unsigned char val)
1302{
1303 unsigned char data;
1304
1305 pci_read_config_byte(pci, reg, &data);
1306 data &= ~mask;
1307 data |= (val & mask);
1308 pci_write_config_byte(pci, reg, data);
1309}
1310
1311static void azx_init_pci(struct azx *chip)
1312{
1313 /* Clear bits 0-2 of PCI register TCSEL (at offset 0x44)
1314 * TCSEL == Traffic Class Select Register, which sets PCI express QOS
1315 * Ensuring these bits are 0 clears playback static on some HD Audio
Adam Lackorzynskia09e89f2011-03-10 17:41:56 +01001316 * codecs.
1317 * The PCI register TCSEL is defined in the Intel manuals.
Takashi Iwaicb53c622007-08-10 17:21:45 +02001318 */
Linus Torvalds46f2cc82011-05-27 19:45:28 -07001319 if (!(chip->driver_caps & AZX_DCAPS_NO_TCSEL)) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001320 snd_printdd(SFX "%s: Clearing TCSEL\n", pci_name(chip->pci));
Adam Lackorzynskia09e89f2011-03-10 17:41:56 +01001321 update_pci_byte(chip->pci, ICH6_PCIREG_TCSEL, 0x07, 0);
Takashi Iwai9477c582011-05-25 09:11:37 +02001322 }
Takashi Iwaicb53c622007-08-10 17:21:45 +02001323
Takashi Iwai9477c582011-05-25 09:11:37 +02001324 /* For ATI SB450/600/700/800/900 and AMD Hudson azalia HD audio,
1325 * we need to enable snoop.
1326 */
1327 if (chip->driver_caps & AZX_DCAPS_ATI_SNOOP) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001328 snd_printdd(SFX "%s: Setting ATI snoop: %d\n", pci_name(chip->pci), azx_snoop(chip));
Takashi Iwaicb53c622007-08-10 17:21:45 +02001329 update_pci_byte(chip->pci,
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001330 ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR, 0x07,
1331 azx_snoop(chip) ? ATI_SB450_HDAUDIO_ENABLE_SNOOP : 0);
Takashi Iwai9477c582011-05-25 09:11:37 +02001332 }
1333
1334 /* For NVIDIA HDA, enable snoop */
1335 if (chip->driver_caps & AZX_DCAPS_NVIDIA_SNOOP) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001336 snd_printdd(SFX "%s: Setting Nvidia snoop: %d\n", pci_name(chip->pci), azx_snoop(chip));
Takashi Iwaicb53c622007-08-10 17:21:45 +02001337 update_pci_byte(chip->pci,
1338 NVIDIA_HDA_TRANSREG_ADDR,
1339 0x0f, NVIDIA_HDA_ENABLE_COHBITS);
Peer Chen320dcc32008-08-20 16:43:24 -07001340 update_pci_byte(chip->pci,
1341 NVIDIA_HDA_ISTRM_COH,
1342 0x01, NVIDIA_HDA_ENABLE_COHBIT);
1343 update_pci_byte(chip->pci,
1344 NVIDIA_HDA_OSTRM_COH,
1345 0x01, NVIDIA_HDA_ENABLE_COHBIT);
Takashi Iwai9477c582011-05-25 09:11:37 +02001346 }
1347
1348 /* Enable SCH/PCH snoop if needed */
1349 if (chip->driver_caps & AZX_DCAPS_SCH_SNOOP) {
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001350 unsigned short snoop;
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001351 pci_read_config_word(chip->pci, INTEL_SCH_HDA_DEVC, &snoop);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001352 if ((!azx_snoop(chip) && !(snoop & INTEL_SCH_HDA_DEVC_NOSNOOP)) ||
1353 (azx_snoop(chip) && (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP))) {
1354 snoop &= ~INTEL_SCH_HDA_DEVC_NOSNOOP;
1355 if (!azx_snoop(chip))
1356 snoop |= INTEL_SCH_HDA_DEVC_NOSNOOP;
1357 pci_write_config_word(chip->pci, INTEL_SCH_HDA_DEVC, snoop);
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001358 pci_read_config_word(chip->pci,
1359 INTEL_SCH_HDA_DEVC, &snoop);
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001360 }
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001361 snd_printdd(SFX "%s: SCH snoop: %s\n",
1362 pci_name(chip->pci), (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP)
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001363 ? "Disabled" : "Enabled");
Vinod Gda3fca22005-09-13 18:49:12 +02001364 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001365}
1366
1367
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001368static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev);
1369
Linus Torvalds1da177e2005-04-16 15:20:36 -07001370/*
1371 * interrupt handler
1372 */
David Howells7d12e782006-10-05 14:55:46 +01001373static irqreturn_t azx_interrupt(int irq, void *dev_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001374{
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001375 struct azx *chip = dev_id;
1376 struct azx_dev *azx_dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001377 u32 status;
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001378 u8 sd_status;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001379 int i, ok;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001380
Mengdong Linb8dfc4622012-08-23 17:32:30 +08001381#ifdef CONFIG_PM_RUNTIME
1382 if (chip->pci->dev.power.runtime_status != RPM_ACTIVE)
1383 return IRQ_NONE;
1384#endif
1385
Linus Torvalds1da177e2005-04-16 15:20:36 -07001386 spin_lock(&chip->reg_lock);
1387
Dan Carpenter60911062012-05-18 10:36:11 +03001388 if (chip->disabled) {
1389 spin_unlock(&chip->reg_lock);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001390 return IRQ_NONE;
Dan Carpenter60911062012-05-18 10:36:11 +03001391 }
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001392
Linus Torvalds1da177e2005-04-16 15:20:36 -07001393 status = azx_readl(chip, INTSTS);
1394 if (status == 0) {
1395 spin_unlock(&chip->reg_lock);
1396 return IRQ_NONE;
1397 }
1398
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001399 for (i = 0; i < chip->num_streams; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001400 azx_dev = &chip->azx_dev[i];
1401 if (status & azx_dev->sd_int_sta_mask) {
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001402 sd_status = azx_sd_readb(azx_dev, SD_STS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001403 azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK);
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001404 if (!azx_dev->substream || !azx_dev->running ||
1405 !(sd_status & SD_INT_COMPLETE))
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001406 continue;
1407 /* check whether this IRQ is really acceptable */
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001408 ok = azx_position_ok(chip, azx_dev);
1409 if (ok == 1) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001410 azx_dev->irq_pending = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001411 spin_unlock(&chip->reg_lock);
1412 snd_pcm_period_elapsed(azx_dev->substream);
1413 spin_lock(&chip->reg_lock);
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001414 } else if (ok == 0 && chip->bus && chip->bus->workq) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001415 /* bogus IRQ, process it later */
1416 azx_dev->irq_pending = 1;
Takashi Iwai6acaed32009-01-12 10:09:24 +01001417 queue_work(chip->bus->workq,
1418 &chip->irq_pending_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001419 }
1420 }
1421 }
1422
1423 /* clear rirb int */
1424 status = azx_readb(chip, RIRBSTS);
1425 if (status & RIRB_INT_MASK) {
Takashi Iwai14d34f12010-10-21 09:03:25 +02001426 if (status & RIRB_INT_RESPONSE) {
Takashi Iwai9477c582011-05-25 09:11:37 +02001427 if (chip->driver_caps & AZX_DCAPS_RIRB_PRE_DELAY)
Takashi Iwai14d34f12010-10-21 09:03:25 +02001428 udelay(80);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001429 azx_update_rirb(chip);
Takashi Iwai14d34f12010-10-21 09:03:25 +02001430 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001431 azx_writeb(chip, RIRBSTS, RIRB_INT_MASK);
1432 }
1433
1434#if 0
1435 /* clear state status int */
1436 if (azx_readb(chip, STATESTS) & 0x04)
1437 azx_writeb(chip, STATESTS, 0x04);
1438#endif
1439 spin_unlock(&chip->reg_lock);
1440
1441 return IRQ_HANDLED;
1442}
1443
1444
1445/*
Takashi Iwai675f25d2008-06-10 17:53:20 +02001446 * set up a BDL entry
1447 */
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001448static int setup_bdle(struct azx *chip,
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001449 struct snd_dma_buffer *dmab,
Takashi Iwai675f25d2008-06-10 17:53:20 +02001450 struct azx_dev *azx_dev, u32 **bdlp,
1451 int ofs, int size, int with_ioc)
1452{
Takashi Iwai675f25d2008-06-10 17:53:20 +02001453 u32 *bdl = *bdlp;
1454
1455 while (size > 0) {
1456 dma_addr_t addr;
1457 int chunk;
1458
1459 if (azx_dev->frags >= AZX_MAX_BDL_ENTRIES)
1460 return -EINVAL;
1461
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001462 addr = snd_sgbuf_get_addr(dmab, ofs);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001463 /* program the address field of the BDL entry */
1464 bdl[0] = cpu_to_le32((u32)addr);
Takashi Iwai766979e2008-06-13 20:53:56 +02001465 bdl[1] = cpu_to_le32(upper_32_bits(addr));
Takashi Iwai675f25d2008-06-10 17:53:20 +02001466 /* program the size field of the BDL entry */
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001467 chunk = snd_sgbuf_get_chunk_size(dmab, ofs, size);
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001468 /* one BDLE cannot cross 4K boundary on CTHDA chips */
1469 if (chip->driver_caps & AZX_DCAPS_4K_BDLE_BOUNDARY) {
1470 u32 remain = 0x1000 - (ofs & 0xfff);
1471 if (chunk > remain)
1472 chunk = remain;
1473 }
Takashi Iwai675f25d2008-06-10 17:53:20 +02001474 bdl[2] = cpu_to_le32(chunk);
1475 /* program the IOC to enable interrupt
1476 * only when the whole fragment is processed
1477 */
1478 size -= chunk;
1479 bdl[3] = (size || !with_ioc) ? 0 : cpu_to_le32(0x01);
1480 bdl += 4;
1481 azx_dev->frags++;
1482 ofs += chunk;
1483 }
1484 *bdlp = bdl;
1485 return ofs;
1486}
1487
1488/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001489 * set up BDL entries
1490 */
Takashi Iwai555e2192008-06-10 17:53:34 +02001491static int azx_setup_periods(struct azx *chip,
1492 struct snd_pcm_substream *substream,
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001493 struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001494{
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001495 u32 *bdl;
1496 int i, ofs, periods, period_bytes;
Takashi Iwai555e2192008-06-10 17:53:34 +02001497 int pos_adj;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001498
1499 /* reset BDL address */
1500 azx_sd_writel(azx_dev, SD_BDLPL, 0);
1501 azx_sd_writel(azx_dev, SD_BDLPU, 0);
1502
Takashi Iwai97b71c92009-03-18 15:09:13 +01001503 period_bytes = azx_dev->period_bytes;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001504 periods = azx_dev->bufsize / period_bytes;
1505
Linus Torvalds1da177e2005-04-16 15:20:36 -07001506 /* program the initial BDL entries */
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001507 bdl = (u32 *)azx_dev->bdl.area;
1508 ofs = 0;
1509 azx_dev->frags = 0;
Takashi Iwai555e2192008-06-10 17:53:34 +02001510 pos_adj = bdl_pos_adj[chip->dev_index];
Takashi Iwai915bf292012-09-11 15:19:10 +02001511 if (!azx_dev->no_period_wakeup && pos_adj > 0) {
Takashi Iwai675f25d2008-06-10 17:53:20 +02001512 struct snd_pcm_runtime *runtime = substream->runtime;
Takashi Iwaie785d3d2008-07-15 16:28:43 +02001513 int pos_align = pos_adj;
Takashi Iwai555e2192008-06-10 17:53:34 +02001514 pos_adj = (pos_adj * runtime->rate + 47999) / 48000;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001515 if (!pos_adj)
Takashi Iwaie785d3d2008-07-15 16:28:43 +02001516 pos_adj = pos_align;
1517 else
1518 pos_adj = ((pos_adj + pos_align - 1) / pos_align) *
1519 pos_align;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001520 pos_adj = frames_to_bytes(runtime, pos_adj);
1521 if (pos_adj >= period_bytes) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001522 snd_printk(KERN_WARNING SFX "%s: Too big adjustment %d\n",
1523 pci_name(chip->pci), bdl_pos_adj[chip->dev_index]);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001524 pos_adj = 0;
1525 } else {
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001526 ofs = setup_bdle(chip, snd_pcm_get_dma_buf(substream),
1527 azx_dev,
Takashi Iwai915bf292012-09-11 15:19:10 +02001528 &bdl, ofs, pos_adj, true);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001529 if (ofs < 0)
1530 goto error;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001531 }
Takashi Iwai555e2192008-06-10 17:53:34 +02001532 } else
1533 pos_adj = 0;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001534 for (i = 0; i < periods; i++) {
1535 if (i == periods - 1 && pos_adj)
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001536 ofs = setup_bdle(chip, snd_pcm_get_dma_buf(substream),
1537 azx_dev, &bdl, ofs,
Takashi Iwai675f25d2008-06-10 17:53:20 +02001538 period_bytes - pos_adj, 0);
1539 else
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001540 ofs = setup_bdle(chip, snd_pcm_get_dma_buf(substream),
1541 azx_dev, &bdl, ofs,
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001542 period_bytes,
Takashi Iwai915bf292012-09-11 15:19:10 +02001543 !azx_dev->no_period_wakeup);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001544 if (ofs < 0)
1545 goto error;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001546 }
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001547 return 0;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001548
1549 error:
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001550 snd_printk(KERN_ERR SFX "%s: Too many BDL entries: buffer=%d, period=%d\n",
1551 pci_name(chip->pci), azx_dev->bufsize, period_bytes);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001552 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001553}
1554
Takashi Iwai1dddab42009-03-18 15:15:37 +01001555/* reset stream */
1556static void azx_stream_reset(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001557{
1558 unsigned char val;
1559 int timeout;
1560
Takashi Iwai1dddab42009-03-18 15:15:37 +01001561 azx_stream_clear(chip, azx_dev);
1562
Takashi Iwaid01ce992007-07-27 16:52:19 +02001563 azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) |
1564 SD_CTL_STREAM_RESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001565 udelay(3);
1566 timeout = 300;
1567 while (!((val = azx_sd_readb(azx_dev, SD_CTL)) & SD_CTL_STREAM_RESET) &&
1568 --timeout)
1569 ;
1570 val &= ~SD_CTL_STREAM_RESET;
1571 azx_sd_writeb(azx_dev, SD_CTL, val);
1572 udelay(3);
1573
1574 timeout = 300;
1575 /* waiting for hardware to report that the stream is out of reset */
1576 while (((val = azx_sd_readb(azx_dev, SD_CTL)) & SD_CTL_STREAM_RESET) &&
1577 --timeout)
1578 ;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001579
1580 /* reset first position - may not be synced with hw at this time */
1581 *azx_dev->posbuf = 0;
Takashi Iwai1dddab42009-03-18 15:15:37 +01001582}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001583
Takashi Iwai1dddab42009-03-18 15:15:37 +01001584/*
1585 * set up the SD for streaming
1586 */
1587static int azx_setup_controller(struct azx *chip, struct azx_dev *azx_dev)
1588{
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001589 unsigned int val;
Takashi Iwai1dddab42009-03-18 15:15:37 +01001590 /* make sure the run bit is zero for SD */
1591 azx_stream_clear(chip, azx_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001592 /* program the stream_tag */
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001593 val = azx_sd_readl(azx_dev, SD_CTL);
1594 val = (val & ~SD_CTL_STREAM_TAG_MASK) |
1595 (azx_dev->stream_tag << SD_CTL_STREAM_TAG_SHIFT);
1596 if (!azx_snoop(chip))
1597 val |= SD_CTL_TRAFFIC_PRIO;
1598 azx_sd_writel(azx_dev, SD_CTL, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001599
1600 /* program the length of samples in cyclic buffer */
1601 azx_sd_writel(azx_dev, SD_CBL, azx_dev->bufsize);
1602
1603 /* program the stream format */
1604 /* this value needs to be the same as the one programmed */
1605 azx_sd_writew(azx_dev, SD_FORMAT, azx_dev->format_val);
1606
1607 /* program the stream LVI (last valid index) of the BDL */
1608 azx_sd_writew(azx_dev, SD_LVI, azx_dev->frags - 1);
1609
1610 /* program the BDL address */
1611 /* lower BDL address */
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001612 azx_sd_writel(azx_dev, SD_BDLPL, (u32)azx_dev->bdl.addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001613 /* upper BDL address */
Takashi Iwai766979e2008-06-13 20:53:56 +02001614 azx_sd_writel(azx_dev, SD_BDLPU, upper_32_bits(azx_dev->bdl.addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001615
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02001616 /* enable the position buffer */
David Henningsson4cb36312010-09-30 10:12:50 +02001617 if (chip->position_fix[0] != POS_FIX_LPIB ||
1618 chip->position_fix[1] != POS_FIX_LPIB) {
Takashi Iwaiee9d6b92008-03-14 15:52:20 +01001619 if (!(azx_readl(chip, DPLBASE) & ICH6_DPLBASE_ENABLE))
1620 azx_writel(chip, DPLBASE,
1621 (u32)chip->posbuf.addr | ICH6_DPLBASE_ENABLE);
1622 }
Takashi Iwaic74db862005-05-12 14:26:27 +02001623
Linus Torvalds1da177e2005-04-16 15:20:36 -07001624 /* set the interrupt enable bits in the descriptor control register */
Takashi Iwaid01ce992007-07-27 16:52:19 +02001625 azx_sd_writel(azx_dev, SD_CTL,
1626 azx_sd_readl(azx_dev, SD_CTL) | SD_INT_MASK);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001627
1628 return 0;
1629}
1630
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001631/*
1632 * Probe the given codec address
1633 */
1634static int probe_codec(struct azx *chip, int addr)
1635{
1636 unsigned int cmd = (addr << 28) | (AC_NODE_ROOT << 20) |
1637 (AC_VERB_PARAMETERS << 8) | AC_PAR_VENDOR_ID;
1638 unsigned int res;
1639
Wu Fengguanga678cde2009-08-01 18:46:46 +08001640 mutex_lock(&chip->bus->cmd_mutex);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001641 chip->probing = 1;
1642 azx_send_cmd(chip->bus, cmd);
Wu Fengguangdeadff12009-08-01 18:45:16 +08001643 res = azx_get_response(chip->bus, addr);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001644 chip->probing = 0;
Wu Fengguanga678cde2009-08-01 18:46:46 +08001645 mutex_unlock(&chip->bus->cmd_mutex);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001646 if (res == -1)
1647 return -EIO;
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001648 snd_printdd(SFX "%s: codec #%d probed OK\n", pci_name(chip->pci), addr);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001649 return 0;
1650}
1651
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001652static int azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec,
1653 struct hda_pcm *cpcm);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001654static void azx_stop_chip(struct azx *chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001655
Takashi Iwai8dd78332009-06-02 01:16:07 +02001656static void azx_bus_reset(struct hda_bus *bus)
1657{
1658 struct azx *chip = bus->private_data;
Takashi Iwai8dd78332009-06-02 01:16:07 +02001659
1660 bus->in_reset = 1;
1661 azx_stop_chip(chip);
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001662 azx_init_chip(chip, 1);
Alexander Beregalov65f75982009-06-04 13:46:16 +04001663#ifdef CONFIG_PM
Takashi Iwai8dd78332009-06-02 01:16:07 +02001664 if (chip->initialized) {
Takashi Iwai01b65bf2011-11-24 14:31:46 +01001665 struct azx_pcm *p;
1666 list_for_each_entry(p, &chip->pcm_list, list)
1667 snd_pcm_suspend_all(p->pcm);
Takashi Iwai8dd78332009-06-02 01:16:07 +02001668 snd_hda_suspend(chip->bus);
1669 snd_hda_resume(chip->bus);
1670 }
Alexander Beregalov65f75982009-06-04 13:46:16 +04001671#endif
Takashi Iwai8dd78332009-06-02 01:16:07 +02001672 bus->in_reset = 0;
1673}
1674
David Henningsson26a6cb62012-10-09 15:04:21 +02001675static int get_jackpoll_interval(struct azx *chip)
1676{
1677 int i = jackpoll_ms[chip->dev_index];
1678 unsigned int j;
1679 if (i == 0)
1680 return 0;
1681 if (i < 50 || i > 60000)
1682 j = 0;
1683 else
1684 j = msecs_to_jiffies(i);
1685 if (j == 0)
1686 snd_printk(KERN_WARNING SFX
1687 "jackpoll_ms value out of range: %d\n", i);
1688 return j;
1689}
1690
Linus Torvalds1da177e2005-04-16 15:20:36 -07001691/*
1692 * Codec initialization
1693 */
1694
Takashi Iwai2f5983f2008-09-03 16:00:44 +02001695/* number of codec slots for each chipset: 0 = default slots (i.e. 4) */
Takashi Iwai48c8b0e2012-12-07 07:40:35 +01001696static unsigned int azx_max_codecs[AZX_NUM_DRIVERS] = {
Wei Ni7445dfc2010-03-03 15:05:53 +08001697 [AZX_DRIVER_NVIDIA] = 8,
Kailang Yangf2690022008-05-27 11:44:55 +02001698 [AZX_DRIVER_TERA] = 1,
Takashi Iwaia9995a32007-03-12 21:30:46 +01001699};
1700
Takashi Iwai48c8b0e2012-12-07 07:40:35 +01001701static int azx_codec_create(struct azx *chip, const char *model)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001702{
1703 struct hda_bus_template bus_temp;
Takashi Iwai34c25352008-10-28 11:38:58 +01001704 int c, codecs, err;
1705 int max_slots;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001706
1707 memset(&bus_temp, 0, sizeof(bus_temp));
1708 bus_temp.private_data = chip;
1709 bus_temp.modelname = model;
1710 bus_temp.pci = chip->pci;
Takashi Iwai111d3af2006-02-16 18:17:58 +01001711 bus_temp.ops.command = azx_send_cmd;
1712 bus_temp.ops.get_response = azx_get_response;
Takashi Iwai176d5332008-07-30 15:01:44 +02001713 bus_temp.ops.attach_pcm = azx_attach_pcm_stream;
Takashi Iwai8dd78332009-06-02 01:16:07 +02001714 bus_temp.ops.bus_reset = azx_bus_reset;
Takashi Iwai83012a72012-08-24 18:38:08 +02001715#ifdef CONFIG_PM
Takashi Iwai11cd41b2008-11-28 07:22:18 +01001716 bus_temp.power_save = &power_save;
Takashi Iwaicb53c622007-08-10 17:21:45 +02001717 bus_temp.ops.pm_notify = azx_power_notify;
1718#endif
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001719#ifdef CONFIG_SND_HDA_DSP_LOADER
1720 bus_temp.ops.load_dsp_prepare = azx_load_dsp_prepare;
1721 bus_temp.ops.load_dsp_trigger = azx_load_dsp_trigger;
1722 bus_temp.ops.load_dsp_cleanup = azx_load_dsp_cleanup;
1723#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07001724
Takashi Iwaid01ce992007-07-27 16:52:19 +02001725 err = snd_hda_bus_new(chip->card, &bus_temp, &chip->bus);
1726 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001727 return err;
1728
Takashi Iwai9477c582011-05-25 09:11:37 +02001729 if (chip->driver_caps & AZX_DCAPS_RIRB_DELAY) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001730 snd_printd(SFX "%s: Enable delay in RIRB handling\n", pci_name(chip->pci));
Wei Nidc9c8e22008-09-26 13:55:56 +08001731 chip->bus->needs_damn_long_delay = 1;
Takashi Iwai9477c582011-05-25 09:11:37 +02001732 }
Wei Nidc9c8e22008-09-26 13:55:56 +08001733
Takashi Iwai34c25352008-10-28 11:38:58 +01001734 codecs = 0;
Takashi Iwai2f5983f2008-09-03 16:00:44 +02001735 max_slots = azx_max_codecs[chip->driver_type];
1736 if (!max_slots)
Wei Ni7445dfc2010-03-03 15:05:53 +08001737 max_slots = AZX_DEFAULT_CODECS;
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001738
1739 /* First try to probe all given codec slots */
1740 for (c = 0; c < max_slots; c++) {
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01001741 if ((chip->codec_mask & (1 << c)) & chip->codec_probe_mask) {
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001742 if (probe_codec(chip, c) < 0) {
1743 /* Some BIOSen give you wrong codec addresses
1744 * that don't exist
1745 */
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001746 snd_printk(KERN_WARNING SFX
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001747 "%s: Codec #%d probe error; "
1748 "disabling it...\n", pci_name(chip->pci), c);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001749 chip->codec_mask &= ~(1 << c);
1750 /* More badly, accessing to a non-existing
1751 * codec often screws up the controller chip,
Paul Menzel24481582010-02-08 20:37:26 +01001752 * and disturbs the further communications.
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001753 * Thus if an error occurs during probing,
1754 * better to reset the controller chip to
1755 * get back to the sanity state.
1756 */
1757 azx_stop_chip(chip);
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001758 azx_init_chip(chip, 1);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001759 }
1760 }
1761 }
1762
Takashi Iwaid507cd62011-04-26 15:25:02 +02001763 /* AMD chipsets often cause the communication stalls upon certain
1764 * sequence like the pin-detection. It seems that forcing the synced
1765 * access works around the stall. Grrr...
1766 */
Takashi Iwai9477c582011-05-25 09:11:37 +02001767 if (chip->driver_caps & AZX_DCAPS_SYNC_WRITE) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001768 snd_printd(SFX "%s: Enable sync_write for stable communication\n",
1769 pci_name(chip->pci));
Takashi Iwaid507cd62011-04-26 15:25:02 +02001770 chip->bus->sync_write = 1;
1771 chip->bus->allow_bus_reset = 1;
1772 }
1773
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001774 /* Then create codec instances */
Takashi Iwai34c25352008-10-28 11:38:58 +01001775 for (c = 0; c < max_slots; c++) {
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01001776 if ((chip->codec_mask & (1 << c)) & chip->codec_probe_mask) {
Takashi Iwaibccad142007-04-24 12:23:53 +02001777 struct hda_codec *codec;
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001778 err = snd_hda_codec_new(chip->bus, c, &codec);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001779 if (err < 0)
1780 continue;
David Henningsson26a6cb62012-10-09 15:04:21 +02001781 codec->jackpoll_interval = get_jackpoll_interval(chip);
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +01001782 codec->beep_mode = chip->beep_mode;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001783 codecs++;
Takashi Iwai19a982b2007-03-21 15:14:35 +01001784 }
1785 }
1786 if (!codecs) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001787 snd_printk(KERN_ERR SFX "%s: no codecs initialized\n", pci_name(chip->pci));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001788 return -ENXIO;
1789 }
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001790 return 0;
1791}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001792
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001793/* configure each codec instance */
Bill Pembertone23e7a12012-12-06 12:35:10 -05001794static int azx_codec_configure(struct azx *chip)
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001795{
1796 struct hda_codec *codec;
1797 list_for_each_entry(codec, &chip->bus->codec_list, list) {
1798 snd_hda_codec_configure(codec);
1799 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001800 return 0;
1801}
1802
1803
1804/*
1805 * PCM support
1806 */
1807
1808/* assign a stream for the PCM */
Wu Fengguangef18bed2009-12-25 13:14:27 +08001809static inline struct azx_dev *
1810azx_assign_device(struct azx *chip, struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001811{
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001812 int dev, i, nums;
Wu Fengguangef18bed2009-12-25 13:14:27 +08001813 struct azx_dev *res = NULL;
Takashi Iwaid5cf9912011-10-06 10:07:58 +02001814 /* make a non-zero unique key for the substream */
1815 int key = (substream->pcm->device << 16) | (substream->number << 2) |
1816 (substream->stream + 1);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001817
1818 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001819 dev = chip->playback_index_offset;
1820 nums = chip->playback_streams;
1821 } else {
1822 dev = chip->capture_index_offset;
1823 nums = chip->capture_streams;
1824 }
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001825 for (i = 0; i < nums; i++, dev++) {
1826 struct azx_dev *azx_dev = &chip->azx_dev[dev];
1827 dsp_lock(azx_dev);
1828 if (!azx_dev->opened && !dsp_is_locked(azx_dev)) {
1829 res = azx_dev;
1830 if (res->assigned_key == key) {
1831 res->opened = 1;
1832 res->assigned_key = key;
1833 dsp_unlock(azx_dev);
1834 return azx_dev;
1835 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001836 }
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001837 dsp_unlock(azx_dev);
1838 }
Wu Fengguangef18bed2009-12-25 13:14:27 +08001839 if (res) {
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001840 dsp_lock(res);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001841 res->opened = 1;
Takashi Iwaid5cf9912011-10-06 10:07:58 +02001842 res->assigned_key = key;
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001843 dsp_unlock(res);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001844 }
1845 return res;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001846}
1847
1848/* release the assigned stream */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001849static inline void azx_release_device(struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001850{
1851 azx_dev->opened = 0;
1852}
1853
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001854static cycle_t azx_cc_read(const struct cyclecounter *cc)
1855{
1856 struct azx_dev *azx_dev = container_of(cc, struct azx_dev, azx_cc);
1857 struct snd_pcm_substream *substream = azx_dev->substream;
1858 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1859 struct azx *chip = apcm->chip;
1860
1861 return azx_readl(chip, WALLCLK);
1862}
1863
1864static void azx_timecounter_init(struct snd_pcm_substream *substream,
1865 bool force, cycle_t last)
1866{
1867 struct azx_dev *azx_dev = get_azx_dev(substream);
1868 struct timecounter *tc = &azx_dev->azx_tc;
1869 struct cyclecounter *cc = &azx_dev->azx_cc;
1870 u64 nsec;
1871
1872 cc->read = azx_cc_read;
1873 cc->mask = CLOCKSOURCE_MASK(32);
1874
1875 /*
1876 * Converting from 24 MHz to ns means applying a 125/3 factor.
1877 * To avoid any saturation issues in intermediate operations,
1878 * the 125 factor is applied first. The division is applied
1879 * last after reading the timecounter value.
1880 * Applying the 1/3 factor as part of the multiplication
1881 * requires at least 20 bits for a decent precision, however
1882 * overflows occur after about 4 hours or less, not a option.
1883 */
1884
1885 cc->mult = 125; /* saturation after 195 years */
1886 cc->shift = 0;
1887
1888 nsec = 0; /* audio time is elapsed time since trigger */
1889 timecounter_init(tc, cc, nsec);
1890 if (force)
1891 /*
1892 * force timecounter to use predefined value,
1893 * used for synchronized starts
1894 */
1895 tc->cycle_last = last;
1896}
1897
Dylan Reidae03bbb2013-04-15 11:57:05 -07001898static u64 azx_adjust_codec_delay(struct snd_pcm_substream *substream,
Dylan Reid78daea22013-04-08 18:20:30 -07001899 u64 nsec)
1900{
1901 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1902 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
1903 u64 codec_frames, codec_nsecs;
1904
1905 if (!hinfo->ops.get_delay)
1906 return nsec;
1907
1908 codec_frames = hinfo->ops.get_delay(hinfo, apcm->codec, substream);
1909 codec_nsecs = div_u64(codec_frames * 1000000000LL,
1910 substream->runtime->rate);
1911
Dylan Reidae03bbb2013-04-15 11:57:05 -07001912 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
1913 return nsec + codec_nsecs;
1914
Dylan Reid78daea22013-04-08 18:20:30 -07001915 return (nsec > codec_nsecs) ? nsec - codec_nsecs : 0;
1916}
1917
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001918static int azx_get_wallclock_tstamp(struct snd_pcm_substream *substream,
1919 struct timespec *ts)
1920{
1921 struct azx_dev *azx_dev = get_azx_dev(substream);
1922 u64 nsec;
1923
1924 nsec = timecounter_read(&azx_dev->azx_tc);
1925 nsec = div_u64(nsec, 3); /* can be optimized */
Dylan Reidae03bbb2013-04-15 11:57:05 -07001926 nsec = azx_adjust_codec_delay(substream, nsec);
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001927
1928 *ts = ns_to_timespec(nsec);
1929
1930 return 0;
1931}
1932
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001933static struct snd_pcm_hardware azx_pcm_hw = {
Takashi Iwaid01ce992007-07-27 16:52:19 +02001934 .info = (SNDRV_PCM_INFO_MMAP |
1935 SNDRV_PCM_INFO_INTERLEAVED |
Linus Torvalds1da177e2005-04-16 15:20:36 -07001936 SNDRV_PCM_INFO_BLOCK_TRANSFER |
1937 SNDRV_PCM_INFO_MMAP_VALID |
Pavel Machek927fc862006-08-31 17:03:43 +02001938 /* No full-resume yet implemented */
1939 /* SNDRV_PCM_INFO_RESUME |*/
Takashi Iwai850f0e52008-03-18 17:11:05 +01001940 SNDRV_PCM_INFO_PAUSE |
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001941 SNDRV_PCM_INFO_SYNC_START |
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001942 SNDRV_PCM_INFO_HAS_WALL_CLOCK |
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001943 SNDRV_PCM_INFO_NO_PERIOD_WAKEUP),
Linus Torvalds1da177e2005-04-16 15:20:36 -07001944 .formats = SNDRV_PCM_FMTBIT_S16_LE,
1945 .rates = SNDRV_PCM_RATE_48000,
1946 .rate_min = 48000,
1947 .rate_max = 48000,
1948 .channels_min = 2,
1949 .channels_max = 2,
1950 .buffer_bytes_max = AZX_MAX_BUF_SIZE,
1951 .period_bytes_min = 128,
1952 .period_bytes_max = AZX_MAX_BUF_SIZE / 2,
1953 .periods_min = 2,
1954 .periods_max = AZX_MAX_FRAG,
1955 .fifo_size = 0,
1956};
1957
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001958static int azx_pcm_open(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001959{
1960 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1961 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001962 struct azx *chip = apcm->chip;
1963 struct azx_dev *azx_dev;
1964 struct snd_pcm_runtime *runtime = substream->runtime;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001965 unsigned long flags;
1966 int err;
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001967 int buff_step;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001968
Ingo Molnar62932df2006-01-16 16:34:20 +01001969 mutex_lock(&chip->open_mutex);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001970 azx_dev = azx_assign_device(chip, substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001971 if (azx_dev == NULL) {
Ingo Molnar62932df2006-01-16 16:34:20 +01001972 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001973 return -EBUSY;
1974 }
1975 runtime->hw = azx_pcm_hw;
1976 runtime->hw.channels_min = hinfo->channels_min;
1977 runtime->hw.channels_max = hinfo->channels_max;
1978 runtime->hw.formats = hinfo->formats;
1979 runtime->hw.rates = hinfo->rates;
1980 snd_pcm_limit_hw_rates(runtime);
1981 snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001982
1983 /* avoid wrap-around with wall-clock */
1984 snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_TIME,
1985 20,
1986 178000000);
1987
Takashi Iwai52409aa2012-01-23 17:10:24 +01001988 if (chip->align_buffer_size)
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001989 /* constrain buffer sizes to be multiple of 128
1990 bytes. This is more efficient in terms of memory
1991 access but isn't required by the HDA spec and
1992 prevents users from specifying exact period/buffer
1993 sizes. For example for 44.1kHz, a period size set
1994 to 20ms will be rounded to 19.59ms. */
1995 buff_step = 128;
1996 else
1997 /* Don't enforce steps on buffer sizes, still need to
1998 be multiple of 4 bytes (HDA spec). Tested on Intel
1999 HDA controllers, may not work on all devices where
2000 option needs to be disabled */
2001 buff_step = 4;
2002
Joachim Deguara5f1545b2007-03-16 15:01:36 +01002003 snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05002004 buff_step);
Joachim Deguara5f1545b2007-03-16 15:01:36 +01002005 snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05002006 buff_step);
Dylan Reidb4a91cf2012-06-15 19:36:23 -07002007 snd_hda_power_up_d3wait(apcm->codec);
Takashi Iwaid01ce992007-07-27 16:52:19 +02002008 err = hinfo->ops.open(hinfo, apcm->codec, substream);
2009 if (err < 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002010 azx_release_device(azx_dev);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002011 snd_hda_power_down(apcm->codec);
Ingo Molnar62932df2006-01-16 16:34:20 +01002012 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002013 return err;
2014 }
Takashi Iwai70d321e2009-07-03 23:06:45 +02002015 snd_pcm_limit_hw_rates(runtime);
Takashi Iwaiaba66532009-07-05 11:44:46 +02002016 /* sanity check */
2017 if (snd_BUG_ON(!runtime->hw.channels_min) ||
2018 snd_BUG_ON(!runtime->hw.channels_max) ||
2019 snd_BUG_ON(!runtime->hw.formats) ||
2020 snd_BUG_ON(!runtime->hw.rates)) {
2021 azx_release_device(azx_dev);
2022 hinfo->ops.close(hinfo, apcm->codec, substream);
2023 snd_hda_power_down(apcm->codec);
2024 mutex_unlock(&chip->open_mutex);
2025 return -EINVAL;
2026 }
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05002027
2028 /* disable WALLCLOCK timestamps for capture streams
2029 until we figure out how to handle digital inputs */
2030 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
2031 runtime->hw.info &= ~SNDRV_PCM_INFO_HAS_WALL_CLOCK;
2032
Linus Torvalds1da177e2005-04-16 15:20:36 -07002033 spin_lock_irqsave(&chip->reg_lock, flags);
2034 azx_dev->substream = substream;
2035 azx_dev->running = 0;
2036 spin_unlock_irqrestore(&chip->reg_lock, flags);
2037
2038 runtime->private_data = azx_dev;
Takashi Iwai850f0e52008-03-18 17:11:05 +01002039 snd_pcm_set_sync(substream);
Ingo Molnar62932df2006-01-16 16:34:20 +01002040 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002041 return 0;
2042}
2043
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002044static int azx_pcm_close(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002045{
2046 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2047 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002048 struct azx *chip = apcm->chip;
2049 struct azx_dev *azx_dev = get_azx_dev(substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002050 unsigned long flags;
2051
Ingo Molnar62932df2006-01-16 16:34:20 +01002052 mutex_lock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002053 spin_lock_irqsave(&chip->reg_lock, flags);
2054 azx_dev->substream = NULL;
2055 azx_dev->running = 0;
2056 spin_unlock_irqrestore(&chip->reg_lock, flags);
2057 azx_release_device(azx_dev);
2058 hinfo->ops.close(hinfo, apcm->codec, substream);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002059 snd_hda_power_down(apcm->codec);
Ingo Molnar62932df2006-01-16 16:34:20 +01002060 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002061 return 0;
2062}
2063
Takashi Iwaid01ce992007-07-27 16:52:19 +02002064static int azx_pcm_hw_params(struct snd_pcm_substream *substream,
2065 struct snd_pcm_hw_params *hw_params)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002066{
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002067 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2068 struct azx *chip = apcm->chip;
Takashi Iwai97b71c92009-03-18 15:09:13 +01002069 struct azx_dev *azx_dev = get_azx_dev(substream);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002070 int ret;
Takashi Iwai97b71c92009-03-18 15:09:13 +01002071
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002072 dsp_lock(azx_dev);
2073 if (dsp_is_locked(azx_dev)) {
2074 ret = -EBUSY;
2075 goto unlock;
2076 }
2077
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +01002078 mark_runtime_wc(chip, azx_dev, substream, false);
Takashi Iwai97b71c92009-03-18 15:09:13 +01002079 azx_dev->bufsize = 0;
2080 azx_dev->period_bytes = 0;
2081 azx_dev->format_val = 0;
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002082 ret = snd_pcm_lib_malloc_pages(substream,
Takashi Iwaid01ce992007-07-27 16:52:19 +02002083 params_buffer_bytes(hw_params));
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002084 if (ret < 0)
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002085 goto unlock;
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +01002086 mark_runtime_wc(chip, azx_dev, substream, true);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002087 unlock:
2088 dsp_unlock(azx_dev);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002089 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002090}
2091
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002092static int azx_pcm_hw_free(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002093{
2094 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002095 struct azx_dev *azx_dev = get_azx_dev(substream);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002096 struct azx *chip = apcm->chip;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002097 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
2098
2099 /* reset BDL address */
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002100 dsp_lock(azx_dev);
2101 if (!dsp_is_locked(azx_dev)) {
2102 azx_sd_writel(azx_dev, SD_BDLPL, 0);
2103 azx_sd_writel(azx_dev, SD_BDLPU, 0);
2104 azx_sd_writel(azx_dev, SD_CTL, 0);
2105 azx_dev->bufsize = 0;
2106 azx_dev->period_bytes = 0;
2107 azx_dev->format_val = 0;
2108 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002109
Takashi Iwaieb541332010-08-06 13:48:11 +02002110 snd_hda_codec_cleanup(apcm->codec, hinfo, substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002111
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +01002112 mark_runtime_wc(chip, azx_dev, substream, false);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002113 azx_dev->prepared = 0;
2114 dsp_unlock(azx_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002115 return snd_pcm_lib_free_pages(substream);
2116}
2117
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002118static int azx_pcm_prepare(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002119{
2120 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002121 struct azx *chip = apcm->chip;
2122 struct azx_dev *azx_dev = get_azx_dev(substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002123 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002124 struct snd_pcm_runtime *runtime = substream->runtime;
Takashi Iwai62b7e5e2010-10-22 17:15:47 +02002125 unsigned int bufsize, period_bytes, format_val, stream_tag;
Takashi Iwai97b71c92009-03-18 15:09:13 +01002126 int err;
Stephen Warren7c9359762011-06-01 11:14:17 -06002127 struct hda_spdif_out *spdif =
2128 snd_hda_spdif_out_of_nid(apcm->codec, hinfo->nid);
2129 unsigned short ctls = spdif ? spdif->ctls : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002130
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002131 dsp_lock(azx_dev);
2132 if (dsp_is_locked(azx_dev)) {
2133 err = -EBUSY;
2134 goto unlock;
2135 }
2136
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002137 azx_stream_reset(chip, azx_dev);
Takashi Iwai97b71c92009-03-18 15:09:13 +01002138 format_val = snd_hda_calc_stream_format(runtime->rate,
2139 runtime->channels,
2140 runtime->format,
Anssi Hannula32c168c2010-08-03 13:28:57 +03002141 hinfo->maxbps,
Stephen Warren7c9359762011-06-01 11:14:17 -06002142 ctls);
Takashi Iwai97b71c92009-03-18 15:09:13 +01002143 if (!format_val) {
Takashi Iwaid01ce992007-07-27 16:52:19 +02002144 snd_printk(KERN_ERR SFX
Daniel J Blueman445a51b2012-12-05 23:04:21 +08002145 "%s: invalid format_val, rate=%d, ch=%d, format=%d\n",
2146 pci_name(chip->pci), runtime->rate, runtime->channels, runtime->format);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002147 err = -EINVAL;
2148 goto unlock;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002149 }
2150
Takashi Iwai97b71c92009-03-18 15:09:13 +01002151 bufsize = snd_pcm_lib_buffer_bytes(substream);
2152 period_bytes = snd_pcm_lib_period_bytes(substream);
2153
Daniel J Blueman445a51b2012-12-05 23:04:21 +08002154 snd_printdd(SFX "%s: azx_pcm_prepare: bufsize=0x%x, format=0x%x\n",
2155 pci_name(chip->pci), bufsize, format_val);
Takashi Iwai97b71c92009-03-18 15:09:13 +01002156
2157 if (bufsize != azx_dev->bufsize ||
2158 period_bytes != azx_dev->period_bytes ||
Takashi Iwai915bf292012-09-11 15:19:10 +02002159 format_val != azx_dev->format_val ||
2160 runtime->no_period_wakeup != azx_dev->no_period_wakeup) {
Takashi Iwai97b71c92009-03-18 15:09:13 +01002161 azx_dev->bufsize = bufsize;
2162 azx_dev->period_bytes = period_bytes;
2163 azx_dev->format_val = format_val;
Takashi Iwai915bf292012-09-11 15:19:10 +02002164 azx_dev->no_period_wakeup = runtime->no_period_wakeup;
Takashi Iwai97b71c92009-03-18 15:09:13 +01002165 err = azx_setup_periods(chip, substream, azx_dev);
2166 if (err < 0)
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002167 goto unlock;
Takashi Iwai97b71c92009-03-18 15:09:13 +01002168 }
2169
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002170 /* wallclk has 24Mhz clock source */
2171 azx_dev->period_wallclk = (((runtime->period_size * 24000) /
2172 runtime->rate) * 1000);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002173 azx_setup_controller(chip, azx_dev);
2174 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
2175 azx_dev->fifo_size = azx_sd_readw(azx_dev, SD_FIFOSIZE) + 1;
2176 else
2177 azx_dev->fifo_size = 0;
2178
Takashi Iwai62b7e5e2010-10-22 17:15:47 +02002179 stream_tag = azx_dev->stream_tag;
2180 /* CA-IBG chips need the playback stream starting from 1 */
Takashi Iwai9477c582011-05-25 09:11:37 +02002181 if ((chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND) &&
Takashi Iwai62b7e5e2010-10-22 17:15:47 +02002182 stream_tag > chip->capture_streams)
2183 stream_tag -= chip->capture_streams;
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002184 err = snd_hda_codec_prepare(apcm->codec, hinfo, stream_tag,
Takashi Iwaieb541332010-08-06 13:48:11 +02002185 azx_dev->format_val, substream);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002186
2187 unlock:
2188 if (!err)
2189 azx_dev->prepared = 1;
2190 dsp_unlock(azx_dev);
2191 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002192}
2193
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002194static int azx_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002195{
2196 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002197 struct azx *chip = apcm->chip;
Takashi Iwai850f0e52008-03-18 17:11:05 +01002198 struct azx_dev *azx_dev;
2199 struct snd_pcm_substream *s;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002200 int rstart = 0, start, nsync = 0, sbits = 0;
Takashi Iwai850f0e52008-03-18 17:11:05 +01002201 int nwait, timeout;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002202
Takashi Iwai1a8506d2012-10-16 15:10:08 +02002203 azx_dev = get_azx_dev(substream);
2204 trace_azx_pcm_trigger(chip, azx_dev, cmd);
2205
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002206 if (dsp_is_locked(azx_dev) || !azx_dev->prepared)
2207 return -EPIPE;
2208
Linus Torvalds1da177e2005-04-16 15:20:36 -07002209 switch (cmd) {
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002210 case SNDRV_PCM_TRIGGER_START:
2211 rstart = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002212 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
2213 case SNDRV_PCM_TRIGGER_RESUME:
Takashi Iwai850f0e52008-03-18 17:11:05 +01002214 start = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002215 break;
2216 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
Jaroslav Kysela47123192005-08-15 20:53:07 +02002217 case SNDRV_PCM_TRIGGER_SUSPEND:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002218 case SNDRV_PCM_TRIGGER_STOP:
Takashi Iwai850f0e52008-03-18 17:11:05 +01002219 start = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002220 break;
2221 default:
Takashi Iwai850f0e52008-03-18 17:11:05 +01002222 return -EINVAL;
2223 }
2224
2225 snd_pcm_group_for_each_entry(s, substream) {
2226 if (s->pcm->card != substream->pcm->card)
2227 continue;
2228 azx_dev = get_azx_dev(s);
2229 sbits |= 1 << azx_dev->index;
2230 nsync++;
2231 snd_pcm_trigger_done(s, substream);
2232 }
2233
2234 spin_lock(&chip->reg_lock);
Pierre-Louis Bossart172d3b22012-09-21 18:39:05 -05002235
2236 /* first, set SYNC bits of corresponding streams */
2237 if (chip->driver_caps & AZX_DCAPS_OLD_SSYNC)
2238 azx_writel(chip, OLD_SSYNC,
2239 azx_readl(chip, OLD_SSYNC) | sbits);
2240 else
2241 azx_writel(chip, SSYNC, azx_readl(chip, SSYNC) | sbits);
2242
Takashi Iwai850f0e52008-03-18 17:11:05 +01002243 snd_pcm_group_for_each_entry(s, substream) {
2244 if (s->pcm->card != substream->pcm->card)
2245 continue;
2246 azx_dev = get_azx_dev(s);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002247 if (start) {
2248 azx_dev->start_wallclk = azx_readl(chip, WALLCLK);
2249 if (!rstart)
2250 azx_dev->start_wallclk -=
2251 azx_dev->period_wallclk;
Takashi Iwai850f0e52008-03-18 17:11:05 +01002252 azx_stream_start(chip, azx_dev);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002253 } else {
Takashi Iwai850f0e52008-03-18 17:11:05 +01002254 azx_stream_stop(chip, azx_dev);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002255 }
Takashi Iwai850f0e52008-03-18 17:11:05 +01002256 azx_dev->running = start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002257 }
2258 spin_unlock(&chip->reg_lock);
Takashi Iwai850f0e52008-03-18 17:11:05 +01002259 if (start) {
Takashi Iwai850f0e52008-03-18 17:11:05 +01002260 /* wait until all FIFOs get ready */
2261 for (timeout = 5000; timeout; timeout--) {
2262 nwait = 0;
2263 snd_pcm_group_for_each_entry(s, substream) {
2264 if (s->pcm->card != substream->pcm->card)
2265 continue;
2266 azx_dev = get_azx_dev(s);
2267 if (!(azx_sd_readb(azx_dev, SD_STS) &
2268 SD_STS_FIFO_READY))
2269 nwait++;
2270 }
2271 if (!nwait)
2272 break;
2273 cpu_relax();
2274 }
2275 } else {
2276 /* wait until all RUN bits are cleared */
2277 for (timeout = 5000; timeout; timeout--) {
2278 nwait = 0;
2279 snd_pcm_group_for_each_entry(s, substream) {
2280 if (s->pcm->card != substream->pcm->card)
2281 continue;
2282 azx_dev = get_azx_dev(s);
2283 if (azx_sd_readb(azx_dev, SD_CTL) &
2284 SD_CTL_DMA_START)
2285 nwait++;
2286 }
2287 if (!nwait)
2288 break;
2289 cpu_relax();
2290 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002291 }
Pierre-Louis Bossart172d3b22012-09-21 18:39:05 -05002292 spin_lock(&chip->reg_lock);
2293 /* reset SYNC bits */
2294 if (chip->driver_caps & AZX_DCAPS_OLD_SSYNC)
2295 azx_writel(chip, OLD_SSYNC,
2296 azx_readl(chip, OLD_SSYNC) & ~sbits);
2297 else
2298 azx_writel(chip, SSYNC, azx_readl(chip, SSYNC) & ~sbits);
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05002299 if (start) {
2300 azx_timecounter_init(substream, 0, 0);
2301 if (nsync > 1) {
2302 cycle_t cycle_last;
2303
2304 /* same start cycle for master and group */
2305 azx_dev = get_azx_dev(substream);
2306 cycle_last = azx_dev->azx_tc.cycle_last;
2307
2308 snd_pcm_group_for_each_entry(s, substream) {
2309 if (s->pcm->card != substream->pcm->card)
2310 continue;
2311 azx_timecounter_init(s, 1, cycle_last);
2312 }
2313 }
2314 }
Pierre-Louis Bossart172d3b22012-09-21 18:39:05 -05002315 spin_unlock(&chip->reg_lock);
Takashi Iwai850f0e52008-03-18 17:11:05 +01002316 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002317}
2318
Joseph Chan0e153472008-08-26 14:38:03 +02002319/* get the current DMA position with correction on VIA chips */
2320static unsigned int azx_via_get_position(struct azx *chip,
2321 struct azx_dev *azx_dev)
2322{
2323 unsigned int link_pos, mini_pos, bound_pos;
2324 unsigned int mod_link_pos, mod_dma_pos, mod_mini_pos;
2325 unsigned int fifo_size;
2326
2327 link_pos = azx_sd_readl(azx_dev, SD_LPIB);
Takashi Iwaib4a655e2011-06-07 12:26:56 +02002328 if (azx_dev->substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
Joseph Chan0e153472008-08-26 14:38:03 +02002329 /* Playback, no problem using link position */
2330 return link_pos;
2331 }
2332
2333 /* Capture */
2334 /* For new chipset,
2335 * use mod to get the DMA position just like old chipset
2336 */
2337 mod_dma_pos = le32_to_cpu(*azx_dev->posbuf);
2338 mod_dma_pos %= azx_dev->period_bytes;
2339
2340 /* azx_dev->fifo_size can't get FIFO size of in stream.
2341 * Get from base address + offset.
2342 */
2343 fifo_size = readw(chip->remap_addr + VIA_IN_STREAM0_FIFO_SIZE_OFFSET);
2344
2345 if (azx_dev->insufficient) {
2346 /* Link position never gather than FIFO size */
2347 if (link_pos <= fifo_size)
2348 return 0;
2349
2350 azx_dev->insufficient = 0;
2351 }
2352
2353 if (link_pos <= fifo_size)
2354 mini_pos = azx_dev->bufsize + link_pos - fifo_size;
2355 else
2356 mini_pos = link_pos - fifo_size;
2357
2358 /* Find nearest previous boudary */
2359 mod_mini_pos = mini_pos % azx_dev->period_bytes;
2360 mod_link_pos = link_pos % azx_dev->period_bytes;
2361 if (mod_link_pos >= fifo_size)
2362 bound_pos = link_pos - mod_link_pos;
2363 else if (mod_dma_pos >= mod_mini_pos)
2364 bound_pos = mini_pos - mod_mini_pos;
2365 else {
2366 bound_pos = mini_pos - mod_mini_pos + azx_dev->period_bytes;
2367 if (bound_pos >= azx_dev->bufsize)
2368 bound_pos = 0;
2369 }
2370
2371 /* Calculate real DMA position we want */
2372 return bound_pos + mod_dma_pos;
2373}
2374
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002375static unsigned int azx_get_position(struct azx *chip,
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002376 struct azx_dev *azx_dev,
2377 bool with_check)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002378{
Takashi Iwai21229612013-04-05 07:27:45 +02002379 struct snd_pcm_substream *substream = azx_dev->substream;
2380 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002381 unsigned int pos;
Takashi Iwai21229612013-04-05 07:27:45 +02002382 int stream = substream->stream;
2383 struct hda_pcm_stream *hinfo = apcm->hinfo[stream];
Takashi Iwai1a8506d2012-10-16 15:10:08 +02002384 int delay = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002385
David Henningsson4cb36312010-09-30 10:12:50 +02002386 switch (chip->position_fix[stream]) {
2387 case POS_FIX_LPIB:
2388 /* read LPIB */
2389 pos = azx_sd_readl(azx_dev, SD_LPIB);
2390 break;
2391 case POS_FIX_VIACOMBO:
Joseph Chan0e153472008-08-26 14:38:03 +02002392 pos = azx_via_get_position(chip, azx_dev);
David Henningsson4cb36312010-09-30 10:12:50 +02002393 break;
2394 default:
2395 /* use the position buffer */
2396 pos = le32_to_cpu(*azx_dev->posbuf);
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002397 if (with_check && chip->position_fix[stream] == POS_FIX_AUTO) {
Takashi Iwaia8103642011-06-07 12:23:23 +02002398 if (!pos || pos == (u32)-1) {
2399 printk(KERN_WARNING
2400 "hda-intel: Invalid position buffer, "
2401 "using LPIB read method instead.\n");
2402 chip->position_fix[stream] = POS_FIX_LPIB;
2403 pos = azx_sd_readl(azx_dev, SD_LPIB);
2404 } else
2405 chip->position_fix[stream] = POS_FIX_POSBUF;
2406 }
2407 break;
Takashi Iwaic74db862005-05-12 14:26:27 +02002408 }
David Henningsson4cb36312010-09-30 10:12:50 +02002409
Linus Torvalds1da177e2005-04-16 15:20:36 -07002410 if (pos >= azx_dev->bufsize)
2411 pos = 0;
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002412
2413 /* calculate runtime delay from LPIB */
Takashi Iwai21229612013-04-05 07:27:45 +02002414 if (substream->runtime &&
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002415 chip->position_fix[stream] == POS_FIX_POSBUF &&
2416 (chip->driver_caps & AZX_DCAPS_COUNT_LPIB_DELAY)) {
2417 unsigned int lpib_pos = azx_sd_readl(azx_dev, SD_LPIB);
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002418 if (stream == SNDRV_PCM_STREAM_PLAYBACK)
2419 delay = pos - lpib_pos;
2420 else
2421 delay = lpib_pos - pos;
2422 if (delay < 0)
2423 delay += azx_dev->bufsize;
2424 if (delay >= azx_dev->period_bytes) {
Takashi Iwai1f046612012-10-16 16:52:26 +02002425 snd_printk(KERN_WARNING SFX
Daniel J Blueman445a51b2012-12-05 23:04:21 +08002426 "%s: Unstable LPIB (%d >= %d); "
Takashi Iwai1f046612012-10-16 16:52:26 +02002427 "disabling LPIB delay counting\n",
Daniel J Blueman445a51b2012-12-05 23:04:21 +08002428 pci_name(chip->pci), delay, azx_dev->period_bytes);
Takashi Iwai1f046612012-10-16 16:52:26 +02002429 delay = 0;
2430 chip->driver_caps &= ~AZX_DCAPS_COUNT_LPIB_DELAY;
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002431 }
Takashi Iwai21229612013-04-05 07:27:45 +02002432 delay = bytes_to_frames(substream->runtime, delay);
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002433 }
Takashi Iwai21229612013-04-05 07:27:45 +02002434
2435 if (substream->runtime) {
2436 if (hinfo->ops.get_delay)
2437 delay += hinfo->ops.get_delay(hinfo, apcm->codec,
2438 substream);
2439 substream->runtime->delay = delay;
2440 }
2441
Takashi Iwai1a8506d2012-10-16 15:10:08 +02002442 trace_azx_get_position(chip, azx_dev, pos, delay);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002443 return pos;
2444}
2445
2446static snd_pcm_uframes_t azx_pcm_pointer(struct snd_pcm_substream *substream)
2447{
2448 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2449 struct azx *chip = apcm->chip;
2450 struct azx_dev *azx_dev = get_azx_dev(substream);
2451 return bytes_to_frames(substream->runtime,
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002452 azx_get_position(chip, azx_dev, false));
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002453}
2454
2455/*
2456 * Check whether the current DMA position is acceptable for updating
2457 * periods. Returns non-zero if it's OK.
2458 *
2459 * Many HD-audio controllers appear pretty inaccurate about
2460 * the update-IRQ timing. The IRQ is issued before actually the
2461 * data is processed. So, we need to process it afterwords in a
2462 * workqueue.
2463 */
2464static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev)
2465{
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002466 u32 wallclk;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002467 unsigned int pos;
2468
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002469 wallclk = azx_readl(chip, WALLCLK) - azx_dev->start_wallclk;
2470 if (wallclk < (azx_dev->period_wallclk * 2) / 3)
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002471 return -1; /* bogus (too early) interrupt */
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002472
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002473 pos = azx_get_position(chip, azx_dev, true);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002474
Takashi Iwaid6d8bf52010-02-12 18:17:06 +01002475 if (WARN_ONCE(!azx_dev->period_bytes,
2476 "hda-intel: zero azx_dev->period_bytes"))
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002477 return -1; /* this shouldn't happen! */
Jaroslav Kyselaedb39932010-06-02 13:29:17 +02002478 if (wallclk < (azx_dev->period_wallclk * 5) / 4 &&
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002479 pos % azx_dev->period_bytes > azx_dev->period_bytes / 2)
2480 /* NG - it's below the first next period boundary */
2481 return bdl_pos_adj[chip->dev_index] ? 0 : -1;
Jaroslav Kyselaedb39932010-06-02 13:29:17 +02002482 azx_dev->start_wallclk += wallclk;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002483 return 1; /* OK, it's fine */
2484}
2485
2486/*
2487 * The work for pending PCM period updates.
2488 */
2489static void azx_irq_pending_work(struct work_struct *work)
2490{
2491 struct azx *chip = container_of(work, struct azx, irq_pending_work);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002492 int i, pending, ok;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002493
Takashi Iwaia6a950a2008-06-10 17:53:35 +02002494 if (!chip->irq_pending_warned) {
2495 printk(KERN_WARNING
2496 "hda-intel: IRQ timing workaround is activated "
2497 "for card #%d. Suggest a bigger bdl_pos_adj.\n",
2498 chip->card->number);
2499 chip->irq_pending_warned = 1;
2500 }
2501
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002502 for (;;) {
2503 pending = 0;
2504 spin_lock_irq(&chip->reg_lock);
2505 for (i = 0; i < chip->num_streams; i++) {
2506 struct azx_dev *azx_dev = &chip->azx_dev[i];
2507 if (!azx_dev->irq_pending ||
2508 !azx_dev->substream ||
2509 !azx_dev->running)
2510 continue;
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002511 ok = azx_position_ok(chip, azx_dev);
2512 if (ok > 0) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002513 azx_dev->irq_pending = 0;
2514 spin_unlock(&chip->reg_lock);
2515 snd_pcm_period_elapsed(azx_dev->substream);
2516 spin_lock(&chip->reg_lock);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002517 } else if (ok < 0) {
2518 pending = 0; /* too early */
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002519 } else
2520 pending++;
2521 }
2522 spin_unlock_irq(&chip->reg_lock);
2523 if (!pending)
2524 return;
Takashi Iwai08af4952010-08-03 14:39:04 +02002525 msleep(1);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002526 }
2527}
2528
2529/* clear irq_pending flags and assure no on-going workq */
2530static void azx_clear_irq_pending(struct azx *chip)
2531{
2532 int i;
2533
2534 spin_lock_irq(&chip->reg_lock);
2535 for (i = 0; i < chip->num_streams; i++)
2536 chip->azx_dev[i].irq_pending = 0;
2537 spin_unlock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002538}
2539
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002540#ifdef CONFIG_X86
2541static int azx_pcm_mmap(struct snd_pcm_substream *substream,
2542 struct vm_area_struct *area)
2543{
2544 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2545 struct azx *chip = apcm->chip;
2546 if (!azx_snoop(chip))
2547 area->vm_page_prot = pgprot_writecombine(area->vm_page_prot);
2548 return snd_pcm_lib_default_mmap(substream, area);
2549}
2550#else
2551#define azx_pcm_mmap NULL
2552#endif
2553
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002554static struct snd_pcm_ops azx_pcm_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002555 .open = azx_pcm_open,
2556 .close = azx_pcm_close,
2557 .ioctl = snd_pcm_lib_ioctl,
2558 .hw_params = azx_pcm_hw_params,
2559 .hw_free = azx_pcm_hw_free,
2560 .prepare = azx_pcm_prepare,
2561 .trigger = azx_pcm_trigger,
2562 .pointer = azx_pcm_pointer,
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05002563 .wall_clock = azx_get_wallclock_tstamp,
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002564 .mmap = azx_pcm_mmap,
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002565 .page = snd_pcm_sgbuf_ops_page,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002566};
2567
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002568static void azx_pcm_free(struct snd_pcm *pcm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002569{
Takashi Iwai176d5332008-07-30 15:01:44 +02002570 struct azx_pcm *apcm = pcm->private_data;
2571 if (apcm) {
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002572 list_del(&apcm->list);
Takashi Iwai176d5332008-07-30 15:01:44 +02002573 kfree(apcm);
2574 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002575}
2576
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002577#define MAX_PREALLOC_SIZE (32 * 1024 * 1024)
2578
Takashi Iwai176d5332008-07-30 15:01:44 +02002579static int
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002580azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec,
2581 struct hda_pcm *cpcm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002582{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002583 struct azx *chip = bus->private_data;
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002584 struct snd_pcm *pcm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002585 struct azx_pcm *apcm;
Takashi Iwai176d5332008-07-30 15:01:44 +02002586 int pcm_dev = cpcm->device;
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002587 unsigned int size;
Takashi Iwai176d5332008-07-30 15:01:44 +02002588 int s, err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002589
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002590 list_for_each_entry(apcm, &chip->pcm_list, list) {
2591 if (apcm->pcm->device == pcm_dev) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08002592 snd_printk(KERN_ERR SFX "%s: PCM %d already exists\n",
2593 pci_name(chip->pci), pcm_dev);
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002594 return -EBUSY;
2595 }
Takashi Iwai176d5332008-07-30 15:01:44 +02002596 }
2597 err = snd_pcm_new(chip->card, cpcm->name, pcm_dev,
2598 cpcm->stream[SNDRV_PCM_STREAM_PLAYBACK].substreams,
2599 cpcm->stream[SNDRV_PCM_STREAM_CAPTURE].substreams,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002600 &pcm);
2601 if (err < 0)
2602 return err;
Takashi Iwai18cb7102009-04-16 10:22:24 +02002603 strlcpy(pcm->name, cpcm->name, sizeof(pcm->name));
Takashi Iwai176d5332008-07-30 15:01:44 +02002604 apcm = kzalloc(sizeof(*apcm), GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002605 if (apcm == NULL)
2606 return -ENOMEM;
2607 apcm->chip = chip;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002608 apcm->pcm = pcm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002609 apcm->codec = codec;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002610 pcm->private_data = apcm;
2611 pcm->private_free = azx_pcm_free;
Takashi Iwai176d5332008-07-30 15:01:44 +02002612 if (cpcm->pcm_type == HDA_PCM_TYPE_MODEM)
2613 pcm->dev_class = SNDRV_PCM_CLASS_MODEM;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002614 list_add_tail(&apcm->list, &chip->pcm_list);
Takashi Iwai176d5332008-07-30 15:01:44 +02002615 cpcm->pcm = pcm;
2616 for (s = 0; s < 2; s++) {
2617 apcm->hinfo[s] = &cpcm->stream[s];
2618 if (cpcm->stream[s].substreams)
2619 snd_pcm_set_ops(pcm, s, &azx_pcm_ops);
2620 }
2621 /* buffer pre-allocation */
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002622 size = CONFIG_SND_HDA_PREALLOC_SIZE * 1024;
2623 if (size > MAX_PREALLOC_SIZE)
2624 size = MAX_PREALLOC_SIZE;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002625 snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV_SG,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002626 snd_dma_pci_data(chip->pci),
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002627 size, MAX_PREALLOC_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002628 return 0;
2629}
2630
2631/*
2632 * mixer creation - all stuff is implemented in hda module
2633 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05002634static int azx_mixer_create(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002635{
2636 return snd_hda_build_controls(chip->bus);
2637}
2638
2639
2640/*
2641 * initialize SD streams
2642 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05002643static int azx_init_stream(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002644{
2645 int i;
2646
2647 /* initialize each stream (aka device)
Takashi Iwaid01ce992007-07-27 16:52:19 +02002648 * assign the starting bdl address to each stream (device)
2649 * and initialize
Linus Torvalds1da177e2005-04-16 15:20:36 -07002650 */
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002651 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002652 struct azx_dev *azx_dev = &chip->azx_dev[i];
Takashi Iwai929861c2006-08-31 16:55:40 +02002653 azx_dev->posbuf = (u32 __iomem *)(chip->posbuf.area + i * 8);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002654 /* offset: SDI0=0x80, SDI1=0xa0, ... SDO3=0x160 */
2655 azx_dev->sd_addr = chip->remap_addr + (0x20 * i + 0x80);
2656 /* int mask: SDI0=0x01, SDI1=0x02, ... SDO3=0x80 */
2657 azx_dev->sd_int_sta_mask = 1 << i;
2658 /* stream tag: must be non-zero and unique */
2659 azx_dev->index = i;
2660 azx_dev->stream_tag = i + 1;
2661 }
2662
2663 return 0;
2664}
2665
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002666static int azx_acquire_irq(struct azx *chip, int do_disconnect)
2667{
Takashi Iwai437a5a42006-11-21 12:14:23 +01002668 if (request_irq(chip->pci->irq, azx_interrupt,
2669 chip->msi ? 0 : IRQF_SHARED,
Takashi Iwai934c2b62011-06-10 16:36:37 +02002670 KBUILD_MODNAME, chip)) {
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002671 printk(KERN_ERR "hda-intel: unable to grab IRQ %d, "
2672 "disabling device\n", chip->pci->irq);
2673 if (do_disconnect)
2674 snd_card_disconnect(chip->card);
2675 return -1;
2676 }
2677 chip->irq = chip->pci->irq;
Takashi Iwai69e13412006-11-21 12:10:55 +01002678 pci_intx(chip->pci, !chip->msi);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002679 return 0;
2680}
2681
Linus Torvalds1da177e2005-04-16 15:20:36 -07002682
Takashi Iwaicb53c622007-08-10 17:21:45 +02002683static void azx_stop_chip(struct azx *chip)
2684{
Takashi Iwai95e99fd2007-08-13 15:29:04 +02002685 if (!chip->initialized)
Takashi Iwaicb53c622007-08-10 17:21:45 +02002686 return;
2687
2688 /* disable interrupts */
2689 azx_int_disable(chip);
2690 azx_int_clear(chip);
2691
2692 /* disable CORB/RIRB */
2693 azx_free_cmd_io(chip);
2694
2695 /* disable position buffer */
2696 azx_writel(chip, DPLBASE, 0);
2697 azx_writel(chip, DPUBASE, 0);
2698
2699 chip->initialized = 0;
2700}
2701
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002702#ifdef CONFIG_SND_HDA_DSP_LOADER
2703/*
2704 * DSP loading code (e.g. for CA0132)
2705 */
2706
2707/* use the first stream for loading DSP */
2708static struct azx_dev *
2709azx_get_dsp_loader_dev(struct azx *chip)
2710{
2711 return &chip->azx_dev[chip->playback_index_offset];
2712}
2713
2714static int azx_load_dsp_prepare(struct hda_bus *bus, unsigned int format,
2715 unsigned int byte_size,
2716 struct snd_dma_buffer *bufp)
2717{
2718 u32 *bdl;
2719 struct azx *chip = bus->private_data;
2720 struct azx_dev *azx_dev;
2721 int err;
2722
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002723 azx_dev = azx_get_dsp_loader_dev(chip);
2724
2725 dsp_lock(azx_dev);
2726 spin_lock_irq(&chip->reg_lock);
2727 if (azx_dev->running || azx_dev->locked) {
2728 spin_unlock_irq(&chip->reg_lock);
2729 err = -EBUSY;
2730 goto unlock;
2731 }
2732 azx_dev->prepared = 0;
2733 chip->saved_azx_dev = *azx_dev;
2734 azx_dev->locked = 1;
2735 spin_unlock_irq(&chip->reg_lock);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002736
2737 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV_SG,
2738 snd_dma_pci_data(chip->pci),
2739 byte_size, bufp);
2740 if (err < 0)
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002741 goto err_alloc;
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002742
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002743 mark_pages_wc(chip, bufp, true);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002744 azx_dev->bufsize = byte_size;
2745 azx_dev->period_bytes = byte_size;
2746 azx_dev->format_val = format;
2747
2748 azx_stream_reset(chip, azx_dev);
2749
2750 /* reset BDL address */
2751 azx_sd_writel(azx_dev, SD_BDLPL, 0);
2752 azx_sd_writel(azx_dev, SD_BDLPU, 0);
2753
2754 azx_dev->frags = 0;
2755 bdl = (u32 *)azx_dev->bdl.area;
2756 err = setup_bdle(chip, bufp, azx_dev, &bdl, 0, byte_size, 0);
2757 if (err < 0)
2758 goto error;
2759
2760 azx_setup_controller(chip, azx_dev);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002761 dsp_unlock(azx_dev);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002762 return azx_dev->stream_tag;
2763
2764 error:
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002765 mark_pages_wc(chip, bufp, false);
2766 snd_dma_free_pages(bufp);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002767 err_alloc:
2768 spin_lock_irq(&chip->reg_lock);
2769 if (azx_dev->opened)
2770 *azx_dev = chip->saved_azx_dev;
2771 azx_dev->locked = 0;
2772 spin_unlock_irq(&chip->reg_lock);
2773 unlock:
2774 dsp_unlock(azx_dev);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002775 return err;
2776}
2777
2778static void azx_load_dsp_trigger(struct hda_bus *bus, bool start)
2779{
2780 struct azx *chip = bus->private_data;
2781 struct azx_dev *azx_dev = azx_get_dsp_loader_dev(chip);
2782
2783 if (start)
2784 azx_stream_start(chip, azx_dev);
2785 else
2786 azx_stream_stop(chip, azx_dev);
2787 azx_dev->running = start;
2788}
2789
2790static void azx_load_dsp_cleanup(struct hda_bus *bus,
2791 struct snd_dma_buffer *dmab)
2792{
2793 struct azx *chip = bus->private_data;
2794 struct azx_dev *azx_dev = azx_get_dsp_loader_dev(chip);
2795
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002796 if (!dmab->area || !azx_dev->locked)
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002797 return;
2798
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002799 dsp_lock(azx_dev);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002800 /* reset BDL address */
2801 azx_sd_writel(azx_dev, SD_BDLPL, 0);
2802 azx_sd_writel(azx_dev, SD_BDLPU, 0);
2803 azx_sd_writel(azx_dev, SD_CTL, 0);
2804 azx_dev->bufsize = 0;
2805 azx_dev->period_bytes = 0;
2806 azx_dev->format_val = 0;
2807
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002808 mark_pages_wc(chip, dmab, false);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002809 snd_dma_free_pages(dmab);
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002810 dmab->area = NULL;
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002811
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002812 spin_lock_irq(&chip->reg_lock);
2813 if (azx_dev->opened)
2814 *azx_dev = chip->saved_azx_dev;
2815 azx_dev->locked = 0;
2816 spin_unlock_irq(&chip->reg_lock);
2817 dsp_unlock(azx_dev);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002818}
2819#endif /* CONFIG_SND_HDA_DSP_LOADER */
2820
Takashi Iwai83012a72012-08-24 18:38:08 +02002821#ifdef CONFIG_PM
Takashi Iwaicb53c622007-08-10 17:21:45 +02002822/* power-up/down the controller */
Takashi Iwai68467f52012-08-28 09:14:29 -07002823static void azx_power_notify(struct hda_bus *bus, bool power_up)
Takashi Iwaicb53c622007-08-10 17:21:45 +02002824{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002825 struct azx *chip = bus->private_data;
Takashi Iwaicb53c622007-08-10 17:21:45 +02002826
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01002827 if (!(chip->driver_caps & AZX_DCAPS_PM_RUNTIME))
2828 return;
2829
Takashi Iwai68467f52012-08-28 09:14:29 -07002830 if (power_up)
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002831 pm_runtime_get_sync(&chip->pci->dev);
2832 else
2833 pm_runtime_put_sync(&chip->pci->dev);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002834}
Takashi Iwai65fcd412012-08-14 17:13:32 +02002835
2836static DEFINE_MUTEX(card_list_lock);
2837static LIST_HEAD(card_list);
2838
2839static void azx_add_card_list(struct azx *chip)
2840{
2841 mutex_lock(&card_list_lock);
2842 list_add(&chip->list, &card_list);
2843 mutex_unlock(&card_list_lock);
2844}
2845
2846static void azx_del_card_list(struct azx *chip)
2847{
2848 mutex_lock(&card_list_lock);
2849 list_del_init(&chip->list);
2850 mutex_unlock(&card_list_lock);
2851}
2852
2853/* trigger power-save check at writing parameter */
2854static int param_set_xint(const char *val, const struct kernel_param *kp)
2855{
2856 struct azx *chip;
2857 struct hda_codec *c;
2858 int prev = power_save;
2859 int ret = param_set_int(val, kp);
2860
2861 if (ret || prev == power_save)
2862 return ret;
2863
2864 mutex_lock(&card_list_lock);
2865 list_for_each_entry(chip, &card_list, list) {
2866 if (!chip->bus || chip->disabled)
2867 continue;
2868 list_for_each_entry(c, &chip->bus->codec_list, list)
2869 snd_hda_power_sync(c);
2870 }
2871 mutex_unlock(&card_list_lock);
2872 return 0;
2873}
2874#else
2875#define azx_add_card_list(chip) /* NOP */
2876#define azx_del_card_list(chip) /* NOP */
Takashi Iwai83012a72012-08-24 18:38:08 +02002877#endif /* CONFIG_PM */
Takashi Iwai5c0b9be2008-12-11 11:47:17 +01002878
Takashi Iwai7ccbde52012-08-14 18:10:09 +02002879#if defined(CONFIG_PM_SLEEP) || defined(SUPPORT_VGA_SWITCHEROO)
Takashi Iwai5c0b9be2008-12-11 11:47:17 +01002880/*
2881 * power management
2882 */
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002883static int azx_suspend(struct device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002884{
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002885 struct pci_dev *pci = to_pci_dev(dev);
2886 struct snd_card *card = dev_get_drvdata(dev);
Takashi Iwai421a1252005-11-17 16:11:09 +01002887 struct azx *chip = card->private_data;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002888 struct azx_pcm *p;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002889
Takashi Iwaic5c21522012-12-04 17:01:25 +01002890 if (chip->disabled)
2891 return 0;
2892
Takashi Iwai421a1252005-11-17 16:11:09 +01002893 snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002894 azx_clear_irq_pending(chip);
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002895 list_for_each_entry(p, &chip->pcm_list, list)
2896 snd_pcm_suspend_all(p->pcm);
Takashi Iwai0b7a2e92007-08-14 15:18:26 +02002897 if (chip->initialized)
Takashi Iwai8dd78332009-06-02 01:16:07 +02002898 snd_hda_suspend(chip->bus);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002899 azx_stop_chip(chip);
Takashi Iwai30b35392006-10-11 18:52:53 +02002900 if (chip->irq >= 0) {
Takashi Iwai43001c92006-09-08 12:30:03 +02002901 free_irq(chip->irq, chip);
Takashi Iwai30b35392006-10-11 18:52:53 +02002902 chip->irq = -1;
2903 }
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002904 if (chip->msi)
Takashi Iwai43001c92006-09-08 12:30:03 +02002905 pci_disable_msi(chip->pci);
Takashi Iwai421a1252005-11-17 16:11:09 +01002906 pci_disable_device(pci);
2907 pci_save_state(pci);
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002908 pci_set_power_state(pci, PCI_D3hot);
Wang Xingchao99a20082013-05-30 22:07:10 +08002909 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)
2910 hda_display_power(false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002911 return 0;
2912}
2913
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002914static int azx_resume(struct device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002915{
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002916 struct pci_dev *pci = to_pci_dev(dev);
2917 struct snd_card *card = dev_get_drvdata(dev);
Takashi Iwai421a1252005-11-17 16:11:09 +01002918 struct azx *chip = card->private_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002919
Takashi Iwaic5c21522012-12-04 17:01:25 +01002920 if (chip->disabled)
2921 return 0;
2922
Wang Xingchao99a20082013-05-30 22:07:10 +08002923 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)
2924 hda_display_power(true);
Takashi Iwaid14a7e02009-02-16 10:13:03 +01002925 pci_set_power_state(pci, PCI_D0);
2926 pci_restore_state(pci);
Takashi Iwai30b35392006-10-11 18:52:53 +02002927 if (pci_enable_device(pci) < 0) {
2928 printk(KERN_ERR "hda-intel: pci_enable_device failed, "
2929 "disabling device\n");
2930 snd_card_disconnect(card);
2931 return -EIO;
2932 }
2933 pci_set_master(pci);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002934 if (chip->msi)
2935 if (pci_enable_msi(pci) < 0)
2936 chip->msi = 0;
2937 if (azx_acquire_irq(chip, 1) < 0)
Takashi Iwai30b35392006-10-11 18:52:53 +02002938 return -EIO;
Takashi Iwaicb53c622007-08-10 17:21:45 +02002939 azx_init_pci(chip);
Maxim Levitskyd804ad92007-09-03 15:28:04 +02002940
Takashi Iwai7f308302012-05-08 16:52:23 +02002941 azx_init_chip(chip, 1);
Maxim Levitskyd804ad92007-09-03 15:28:04 +02002942
Linus Torvalds1da177e2005-04-16 15:20:36 -07002943 snd_hda_resume(chip->bus);
Takashi Iwai421a1252005-11-17 16:11:09 +01002944 snd_power_change_state(card, SNDRV_CTL_POWER_D0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002945 return 0;
2946}
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002947#endif /* CONFIG_PM_SLEEP || SUPPORT_VGA_SWITCHEROO */
2948
2949#ifdef CONFIG_PM_RUNTIME
2950static int azx_runtime_suspend(struct device *dev)
2951{
2952 struct snd_card *card = dev_get_drvdata(dev);
2953 struct azx *chip = card->private_data;
2954
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002955 azx_stop_chip(chip);
2956 azx_clear_irq_pending(chip);
Wang Xingchao99a20082013-05-30 22:07:10 +08002957 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)
2958 hda_display_power(false);
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002959 return 0;
2960}
2961
2962static int azx_runtime_resume(struct device *dev)
2963{
2964 struct snd_card *card = dev_get_drvdata(dev);
2965 struct azx *chip = card->private_data;
2966
Wang Xingchao99a20082013-05-30 22:07:10 +08002967 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)
2968 hda_display_power(true);
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002969 azx_init_pci(chip);
2970 azx_init_chip(chip, 1);
2971 return 0;
2972}
Takashi Iwai6eb827d2012-12-12 11:50:12 +01002973
2974static int azx_runtime_idle(struct device *dev)
2975{
2976 struct snd_card *card = dev_get_drvdata(dev);
2977 struct azx *chip = card->private_data;
2978
2979 if (!power_save_controller ||
2980 !(chip->driver_caps & AZX_DCAPS_PM_RUNTIME))
2981 return -EBUSY;
2982
2983 return 0;
2984}
2985
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002986#endif /* CONFIG_PM_RUNTIME */
2987
2988#ifdef CONFIG_PM
2989static const struct dev_pm_ops azx_pm = {
2990 SET_SYSTEM_SLEEP_PM_OPS(azx_suspend, azx_resume)
Takashi Iwai6eb827d2012-12-12 11:50:12 +01002991 SET_RUNTIME_PM_OPS(azx_runtime_suspend, azx_runtime_resume, azx_runtime_idle)
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002992};
2993
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002994#define AZX_PM_OPS &azx_pm
2995#else
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002996#define AZX_PM_OPS NULL
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002997#endif /* CONFIG_PM */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002998
2999
3000/*
Takashi Iwai0cbf0092008-10-29 16:18:25 +01003001 * reboot notifier for hang-up problem at power-down
3002 */
3003static int azx_halt(struct notifier_block *nb, unsigned long event, void *buf)
3004{
3005 struct azx *chip = container_of(nb, struct azx, reboot_notifier);
Takashi Iwaifb8d1a32009-11-10 16:02:29 +01003006 snd_hda_bus_reboot_notify(chip->bus);
Takashi Iwai0cbf0092008-10-29 16:18:25 +01003007 azx_stop_chip(chip);
3008 return NOTIFY_OK;
3009}
3010
3011static void azx_notifier_register(struct azx *chip)
3012{
3013 chip->reboot_notifier.notifier_call = azx_halt;
3014 register_reboot_notifier(&chip->reboot_notifier);
3015}
3016
3017static void azx_notifier_unregister(struct azx *chip)
3018{
3019 if (chip->reboot_notifier.notifier_call)
3020 unregister_reboot_notifier(&chip->reboot_notifier);
3021}
3022
Takashi Iwai48c8b0e2012-12-07 07:40:35 +01003023static int azx_probe_continue(struct azx *chip);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003024
Steven Newbury8393ec4a2012-06-08 13:06:29 +02003025#ifdef SUPPORT_VGA_SWITCHEROO
Bill Pembertone23e7a12012-12-06 12:35:10 -05003026static struct pci_dev *get_bound_vga(struct pci_dev *pci);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003027
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003028static void azx_vs_set_state(struct pci_dev *pci,
3029 enum vga_switcheroo_state state)
3030{
3031 struct snd_card *card = pci_get_drvdata(pci);
3032 struct azx *chip = card->private_data;
3033 bool disabled;
3034
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003035 wait_for_completion(&chip->probe_wait);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003036 if (chip->init_failed)
3037 return;
3038
3039 disabled = (state == VGA_SWITCHEROO_OFF);
3040 if (chip->disabled == disabled)
3041 return;
3042
3043 if (!chip->bus) {
3044 chip->disabled = disabled;
3045 if (!disabled) {
3046 snd_printk(KERN_INFO SFX
3047 "%s: Start delayed initialization\n",
3048 pci_name(chip->pci));
Takashi Iwai5c906802013-05-30 22:07:09 +08003049 if (azx_probe_continue(chip) < 0) {
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003050 snd_printk(KERN_ERR SFX
3051 "%s: initialization error\n",
3052 pci_name(chip->pci));
3053 chip->init_failed = true;
3054 }
3055 }
3056 } else {
3057 snd_printk(KERN_INFO SFX
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003058 "%s: %s via VGA-switcheroo\n", pci_name(chip->pci),
3059 disabled ? "Disabling" : "Enabling");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003060 if (disabled) {
Takashi Iwai68cb2b52012-07-02 15:20:37 +02003061 azx_suspend(&pci->dev);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003062 chip->disabled = true;
Takashi Iwai128960a2012-10-12 17:28:18 +02003063 if (snd_hda_lock_devices(chip->bus))
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003064 snd_printk(KERN_WARNING SFX "%s: Cannot lock devices!\n",
3065 pci_name(chip->pci));
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003066 } else {
3067 snd_hda_unlock_devices(chip->bus);
3068 chip->disabled = false;
Takashi Iwai68cb2b52012-07-02 15:20:37 +02003069 azx_resume(&pci->dev);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003070 }
3071 }
3072}
3073
3074static bool azx_vs_can_switch(struct pci_dev *pci)
3075{
3076 struct snd_card *card = pci_get_drvdata(pci);
3077 struct azx *chip = card->private_data;
3078
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003079 wait_for_completion(&chip->probe_wait);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003080 if (chip->init_failed)
3081 return false;
3082 if (chip->disabled || !chip->bus)
3083 return true;
3084 if (snd_hda_lock_devices(chip->bus))
3085 return false;
3086 snd_hda_unlock_devices(chip->bus);
3087 return true;
3088}
3089
Bill Pembertone23e7a12012-12-06 12:35:10 -05003090static void init_vga_switcheroo(struct azx *chip)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003091{
3092 struct pci_dev *p = get_bound_vga(chip->pci);
3093 if (p) {
3094 snd_printk(KERN_INFO SFX
3095 "%s: Handle VGA-switcheroo audio client\n",
3096 pci_name(chip->pci));
3097 chip->use_vga_switcheroo = 1;
3098 pci_dev_put(p);
3099 }
3100}
3101
3102static const struct vga_switcheroo_client_ops azx_vs_ops = {
3103 .set_gpu_state = azx_vs_set_state,
3104 .can_switch = azx_vs_can_switch,
3105};
3106
Bill Pembertone23e7a12012-12-06 12:35:10 -05003107static int register_vga_switcheroo(struct azx *chip)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003108{
Takashi Iwai128960a2012-10-12 17:28:18 +02003109 int err;
3110
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003111 if (!chip->use_vga_switcheroo)
3112 return 0;
3113 /* FIXME: currently only handling DIS controller
3114 * is there any machine with two switchable HDMI audio controllers?
3115 */
Takashi Iwai128960a2012-10-12 17:28:18 +02003116 err = vga_switcheroo_register_audio_client(chip->pci, &azx_vs_ops,
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003117 VGA_SWITCHEROO_DIS,
3118 chip->bus != NULL);
Takashi Iwai128960a2012-10-12 17:28:18 +02003119 if (err < 0)
3120 return err;
3121 chip->vga_switcheroo_registered = 1;
3122 return 0;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003123}
3124#else
3125#define init_vga_switcheroo(chip) /* NOP */
3126#define register_vga_switcheroo(chip) 0
Steven Newbury8393ec4a2012-06-08 13:06:29 +02003127#define check_hdmi_disabled(pci) false
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003128#endif /* SUPPORT_VGA_SWITCHER */
3129
Takashi Iwai0cbf0092008-10-29 16:18:25 +01003130/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07003131 * destructor
3132 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01003133static int azx_free(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003134{
Wang Xingchaoc67e2222013-05-30 22:07:08 +08003135 struct pci_dev *pci = chip->pci;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003136 int i;
3137
Wang Xingchaoc67e2222013-05-30 22:07:08 +08003138 if ((chip->driver_caps & AZX_DCAPS_PM_RUNTIME)
3139 && chip->running)
3140 pm_runtime_get_noresume(&pci->dev);
3141
Takashi Iwai65fcd412012-08-14 17:13:32 +02003142 azx_del_card_list(chip);
3143
Takashi Iwai0cbf0092008-10-29 16:18:25 +01003144 azx_notifier_unregister(chip);
3145
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003146 chip->init_failed = 1; /* to be sure */
Daniel J Blueman44728e92012-12-18 23:59:33 +08003147 complete_all(&chip->probe_wait);
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003148
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003149 if (use_vga_switcheroo(chip)) {
3150 if (chip->disabled && chip->bus)
3151 snd_hda_unlock_devices(chip->bus);
Takashi Iwai128960a2012-10-12 17:28:18 +02003152 if (chip->vga_switcheroo_registered)
3153 vga_switcheroo_unregister_client(chip->pci);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003154 }
3155
Takashi Iwaice43fba2005-05-30 20:33:44 +02003156 if (chip->initialized) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02003157 azx_clear_irq_pending(chip);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003158 for (i = 0; i < chip->num_streams; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003159 azx_stream_stop(chip, &chip->azx_dev[i]);
Takashi Iwaicb53c622007-08-10 17:21:45 +02003160 azx_stop_chip(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003161 }
3162
Jeff Garzikf000fd82008-04-22 13:50:34 +02003163 if (chip->irq >= 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003164 free_irq(chip->irq, (void*)chip);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02003165 if (chip->msi)
Takashi Iwai30b35392006-10-11 18:52:53 +02003166 pci_disable_msi(chip->pci);
Takashi Iwaif079c252006-06-01 11:42:14 +02003167 if (chip->remap_addr)
3168 iounmap(chip->remap_addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003169
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003170 if (chip->azx_dev) {
3171 for (i = 0; i < chip->num_streams; i++)
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003172 if (chip->azx_dev[i].bdl.area) {
3173 mark_pages_wc(chip, &chip->azx_dev[i].bdl, false);
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003174 snd_dma_free_pages(&chip->azx_dev[i].bdl);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003175 }
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003176 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003177 if (chip->rb.area) {
3178 mark_pages_wc(chip, &chip->rb, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003179 snd_dma_free_pages(&chip->rb);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003180 }
3181 if (chip->posbuf.area) {
3182 mark_pages_wc(chip, &chip->posbuf, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003183 snd_dma_free_pages(&chip->posbuf);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003184 }
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003185 if (chip->region_requested)
3186 pci_release_regions(chip->pci);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003187 pci_disable_device(chip->pci);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003188 kfree(chip->azx_dev);
Takashi Iwai4918cda2012-08-09 12:33:28 +02003189#ifdef CONFIG_SND_HDA_PATCH_LOADER
3190 if (chip->fw)
3191 release_firmware(chip->fw);
3192#endif
Wang Xingchao99a20082013-05-30 22:07:10 +08003193 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL) {
3194 hda_display_power(false);
3195 hda_i915_exit();
3196 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003197 kfree(chip);
3198
3199 return 0;
3200}
3201
Takashi Iwaia98f90f2005-11-17 14:59:02 +01003202static int azx_dev_free(struct snd_device *device)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003203{
3204 return azx_free(device->device_data);
3205}
3206
Steven Newbury8393ec4a2012-06-08 13:06:29 +02003207#ifdef SUPPORT_VGA_SWITCHEROO
Linus Torvalds1da177e2005-04-16 15:20:36 -07003208/*
Takashi Iwai91219472012-04-26 12:13:25 +02003209 * Check of disabled HDMI controller by vga-switcheroo
3210 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003211static struct pci_dev *get_bound_vga(struct pci_dev *pci)
Takashi Iwai91219472012-04-26 12:13:25 +02003212{
3213 struct pci_dev *p;
3214
3215 /* check only discrete GPU */
3216 switch (pci->vendor) {
3217 case PCI_VENDOR_ID_ATI:
3218 case PCI_VENDOR_ID_AMD:
3219 case PCI_VENDOR_ID_NVIDIA:
3220 if (pci->devfn == 1) {
3221 p = pci_get_domain_bus_and_slot(pci_domain_nr(pci->bus),
3222 pci->bus->number, 0);
3223 if (p) {
3224 if ((p->class >> 8) == PCI_CLASS_DISPLAY_VGA)
3225 return p;
3226 pci_dev_put(p);
3227 }
3228 }
3229 break;
3230 }
3231 return NULL;
3232}
3233
Bill Pembertone23e7a12012-12-06 12:35:10 -05003234static bool check_hdmi_disabled(struct pci_dev *pci)
Takashi Iwai91219472012-04-26 12:13:25 +02003235{
3236 bool vga_inactive = false;
3237 struct pci_dev *p = get_bound_vga(pci);
3238
3239 if (p) {
Takashi Iwai12b78a72012-06-07 12:15:16 +02003240 if (vga_switcheroo_get_client_state(p) == VGA_SWITCHEROO_OFF)
Takashi Iwai91219472012-04-26 12:13:25 +02003241 vga_inactive = true;
3242 pci_dev_put(p);
3243 }
3244 return vga_inactive;
3245}
Steven Newbury8393ec4a2012-06-08 13:06:29 +02003246#endif /* SUPPORT_VGA_SWITCHEROO */
Takashi Iwai91219472012-04-26 12:13:25 +02003247
3248/*
Takashi Iwai3372a152007-02-01 15:46:50 +01003249 * white/black-listing for position_fix
3250 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003251static struct snd_pci_quirk position_fix_list[] = {
Takashi Iwaid2e1c972008-06-10 17:53:34 +02003252 SND_PCI_QUIRK(0x1028, 0x01cc, "Dell D820", POS_FIX_LPIB),
3253 SND_PCI_QUIRK(0x1028, 0x01de, "Dell Precision 390", POS_FIX_LPIB),
Takashi Iwai2f703e72009-12-01 14:17:37 +01003254 SND_PCI_QUIRK(0x103c, 0x306d, "HP dv3", POS_FIX_LPIB),
Takashi Iwaid2e1c972008-06-10 17:53:34 +02003255 SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB),
Daniel T Chendd37f8e2010-05-30 01:17:03 -04003256 SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS", POS_FIX_LPIB),
Daniel T Chen9f75c1b2010-05-30 13:08:41 -04003257 SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS M2V", POS_FIX_LPIB),
Daniel T Chene96d3122010-05-27 18:32:18 -04003258 SND_PCI_QUIRK(0x104d, 0x9069, "Sony VPCS11V9E", POS_FIX_LPIB),
David Henningssonb01de4f2012-01-12 16:31:14 +01003259 SND_PCI_QUIRK(0x10de, 0xcb89, "Macbook Pro 7,1", POS_FIX_LPIB),
Daniel T Chen61bb42c2010-05-29 11:04:11 -04003260 SND_PCI_QUIRK(0x1297, 0x3166, "Shuttle", POS_FIX_LPIB),
Daniel T Chen9ec8dda2010-03-28 02:34:40 -04003261 SND_PCI_QUIRK(0x1458, 0xa022, "ga-ma770-ud3", POS_FIX_LPIB),
Takashi Iwai45d4ebf2009-11-30 11:58:30 +01003262 SND_PCI_QUIRK(0x1462, 0x1002, "MSI Wind U115", POS_FIX_LPIB),
Takashi Iwai8815cd02010-04-15 09:02:41 +02003263 SND_PCI_QUIRK(0x1565, 0x8218, "Biostar Microtech", POS_FIX_LPIB),
Daniel T Chenb90c0762010-05-30 19:31:41 -04003264 SND_PCI_QUIRK(0x1849, 0x0888, "775Dual-VSTA", POS_FIX_LPIB),
Daniel T Chen0e0280d2010-04-21 19:55:43 -04003265 SND_PCI_QUIRK(0x8086, 0x2503, "DG965OT AAD63733-203", POS_FIX_LPIB),
Takashi Iwai3372a152007-02-01 15:46:50 +01003266 {}
3267};
3268
Bill Pembertone23e7a12012-12-06 12:35:10 -05003269static int check_position_fix(struct azx *chip, int fix)
Takashi Iwai3372a152007-02-01 15:46:50 +01003270{
3271 const struct snd_pci_quirk *q;
3272
Takashi Iwaic673ba12009-03-17 07:49:14 +01003273 switch (fix) {
Takashi Iwai1dac6692012-09-13 14:59:47 +02003274 case POS_FIX_AUTO:
Takashi Iwaic673ba12009-03-17 07:49:14 +01003275 case POS_FIX_LPIB:
3276 case POS_FIX_POSBUF:
David Henningsson4cb36312010-09-30 10:12:50 +02003277 case POS_FIX_VIACOMBO:
Takashi Iwaia6f2fd52012-02-28 11:58:40 +01003278 case POS_FIX_COMBO:
Takashi Iwaic673ba12009-03-17 07:49:14 +01003279 return fix;
3280 }
3281
Takashi Iwaic673ba12009-03-17 07:49:14 +01003282 q = snd_pci_quirk_lookup(chip->pci, position_fix_list);
3283 if (q) {
3284 printk(KERN_INFO
3285 "hda_intel: position_fix set to %d "
3286 "for device %04x:%04x\n",
3287 q->value, q->subvendor, q->subdevice);
3288 return q->value;
Takashi Iwai3372a152007-02-01 15:46:50 +01003289 }
David Henningssonbdd9ef22010-10-04 12:02:14 +02003290
3291 /* Check VIA/ATI HD Audio Controller exist */
Takashi Iwai9477c582011-05-25 09:11:37 +02003292 if (chip->driver_caps & AZX_DCAPS_POSFIX_VIA) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003293 snd_printd(SFX "%s: Using VIACOMBO position fix\n", pci_name(chip->pci));
David Henningssonbdd9ef22010-10-04 12:02:14 +02003294 return POS_FIX_VIACOMBO;
3295 }
Takashi Iwai9477c582011-05-25 09:11:37 +02003296 if (chip->driver_caps & AZX_DCAPS_POSFIX_LPIB) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003297 snd_printd(SFX "%s: Using LPIB position fix\n", pci_name(chip->pci));
Takashi Iwai9477c582011-05-25 09:11:37 +02003298 return POS_FIX_LPIB;
3299 }
Takashi Iwaic673ba12009-03-17 07:49:14 +01003300 return POS_FIX_AUTO;
Takashi Iwai3372a152007-02-01 15:46:50 +01003301}
3302
3303/*
Takashi Iwai669ba272007-08-17 09:17:36 +02003304 * black-lists for probe_mask
3305 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003306static struct snd_pci_quirk probe_mask_list[] = {
Takashi Iwai669ba272007-08-17 09:17:36 +02003307 /* Thinkpad often breaks the controller communication when accessing
3308 * to the non-working (or non-existing) modem codec slot.
3309 */
3310 SND_PCI_QUIRK(0x1014, 0x05b7, "Thinkpad Z60", 0x01),
3311 SND_PCI_QUIRK(0x17aa, 0x2010, "Thinkpad X/T/R60", 0x01),
3312 SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X/T/R61", 0x01),
Takashi Iwai0edb9452008-11-07 14:53:09 +01003313 /* broken BIOS */
3314 SND_PCI_QUIRK(0x1028, 0x20ac, "Dell Studio Desktop", 0x01),
Takashi Iwaief1681d2008-11-24 17:29:28 +01003315 /* including bogus ALC268 in slot#2 that conflicts with ALC888 */
3316 SND_PCI_QUIRK(0x17c0, 0x4085, "Medion MD96630", 0x01),
Takashi Iwai20db7cb2009-02-13 08:18:48 +01003317 /* forced codec slots */
Ozan Çağlayan93574842009-05-23 15:00:04 +03003318 SND_PCI_QUIRK(0x1043, 0x1262, "ASUS W5Fm", 0x103),
Takashi Iwai20db7cb2009-02-13 08:18:48 +01003319 SND_PCI_QUIRK(0x1046, 0x1262, "ASUS W5F", 0x103),
Jaroslav Kyselaf3af9052012-04-26 17:52:35 +02003320 /* WinFast VP200 H (Teradici) user reported broken communication */
3321 SND_PCI_QUIRK(0x3a21, 0x040d, "WinFast VP200 H", 0x101),
Takashi Iwai669ba272007-08-17 09:17:36 +02003322 {}
3323};
3324
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003325#define AZX_FORCE_CODEC_MASK 0x100
3326
Bill Pembertone23e7a12012-12-06 12:35:10 -05003327static void check_probe_mask(struct azx *chip, int dev)
Takashi Iwai669ba272007-08-17 09:17:36 +02003328{
3329 const struct snd_pci_quirk *q;
3330
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003331 chip->codec_probe_mask = probe_mask[dev];
3332 if (chip->codec_probe_mask == -1) {
Takashi Iwai669ba272007-08-17 09:17:36 +02003333 q = snd_pci_quirk_lookup(chip->pci, probe_mask_list);
3334 if (q) {
3335 printk(KERN_INFO
3336 "hda_intel: probe_mask set to 0x%x "
3337 "for device %04x:%04x\n",
3338 q->value, q->subvendor, q->subdevice);
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003339 chip->codec_probe_mask = q->value;
Takashi Iwai669ba272007-08-17 09:17:36 +02003340 }
3341 }
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003342
3343 /* check forced option */
3344 if (chip->codec_probe_mask != -1 &&
3345 (chip->codec_probe_mask & AZX_FORCE_CODEC_MASK)) {
3346 chip->codec_mask = chip->codec_probe_mask & 0xff;
3347 printk(KERN_INFO "hda_intel: codec_mask forced to 0x%x\n",
3348 chip->codec_mask);
3349 }
Takashi Iwai669ba272007-08-17 09:17:36 +02003350}
3351
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003352/*
Takashi Iwai716238552009-09-28 13:14:04 +02003353 * white/black-list for enable_msi
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003354 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003355static struct snd_pci_quirk msi_black_list[] = {
Takashi Iwai9dc83982009-12-22 08:15:01 +01003356 SND_PCI_QUIRK(0x1043, 0x81f2, "ASUS", 0), /* Athlon64 X2 + nvidia */
Takashi Iwai0a27fcf2010-02-15 17:05:28 +01003357 SND_PCI_QUIRK(0x1043, 0x81f6, "ASUS", 0), /* nvidia */
Ralf Gerbigecd21622010-03-09 18:25:47 +01003358 SND_PCI_QUIRK(0x1043, 0x822d, "ASUS", 0), /* Athlon64 X2 + nvidia MCP55 */
Michele Ballabio4193d132010-03-06 21:06:46 +01003359 SND_PCI_QUIRK(0x1849, 0x0888, "ASRock", 0), /* Athlon64 X2 + nvidia */
Takashi Iwai38155952010-04-04 12:14:03 +02003360 SND_PCI_QUIRK(0xa0a0, 0x0575, "Aopen MZ915-M", 0), /* ICH6 */
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003361 {}
3362};
3363
Bill Pembertone23e7a12012-12-06 12:35:10 -05003364static void check_msi(struct azx *chip)
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003365{
3366 const struct snd_pci_quirk *q;
3367
Takashi Iwai716238552009-09-28 13:14:04 +02003368 if (enable_msi >= 0) {
3369 chip->msi = !!enable_msi;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003370 return;
Takashi Iwai716238552009-09-28 13:14:04 +02003371 }
3372 chip->msi = 1; /* enable MSI as default */
3373 q = snd_pci_quirk_lookup(chip->pci, msi_black_list);
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003374 if (q) {
3375 printk(KERN_INFO
3376 "hda_intel: msi for device %04x:%04x set to %d\n",
3377 q->subvendor, q->subdevice, q->value);
3378 chip->msi = q->value;
Takashi Iwai80c43ed2010-03-15 15:51:53 +01003379 return;
3380 }
3381
3382 /* NVidia chipsets seem to cause troubles with MSI */
Takashi Iwai9477c582011-05-25 09:11:37 +02003383 if (chip->driver_caps & AZX_DCAPS_NO_MSI) {
3384 printk(KERN_INFO "hda_intel: Disabling MSI\n");
Takashi Iwai80c43ed2010-03-15 15:51:53 +01003385 chip->msi = 0;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003386 }
3387}
3388
Takashi Iwaia1585d72011-12-14 09:27:04 +01003389/* check the snoop mode availability */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003390static void azx_check_snoop_available(struct azx *chip)
Takashi Iwaia1585d72011-12-14 09:27:04 +01003391{
3392 bool snoop = chip->snoop;
3393
3394 switch (chip->driver_type) {
3395 case AZX_DRIVER_VIA:
3396 /* force to non-snoop mode for a new VIA controller
3397 * when BIOS is set
3398 */
3399 if (snoop) {
3400 u8 val;
3401 pci_read_config_byte(chip->pci, 0x42, &val);
3402 if (!(val & 0x80) && chip->pci->revision == 0x30)
3403 snoop = false;
3404 }
3405 break;
3406 case AZX_DRIVER_ATIHDMI_NS:
3407 /* new ATI HDMI requires non-snoop */
3408 snoop = false;
3409 break;
Takashi Iwaic1279f82013-02-07 17:36:22 +01003410 case AZX_DRIVER_CTHDA:
3411 snoop = false;
3412 break;
Takashi Iwaia1585d72011-12-14 09:27:04 +01003413 }
3414
3415 if (snoop != chip->snoop) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003416 snd_printk(KERN_INFO SFX "%s: Force to %s mode\n",
3417 pci_name(chip->pci), snoop ? "snoop" : "non-snoop");
Takashi Iwaia1585d72011-12-14 09:27:04 +01003418 chip->snoop = snoop;
3419 }
3420}
Takashi Iwai669ba272007-08-17 09:17:36 +02003421
Wang Xingchao99a20082013-05-30 22:07:10 +08003422#ifdef CONFIG_SND_HDA_I915
3423static void azx_probe_work(struct work_struct *work)
3424{
3425 azx_probe_continue(container_of(work, struct azx, probe_work));
3426}
3427#endif
3428
Takashi Iwai669ba272007-08-17 09:17:36 +02003429/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07003430 * constructor
3431 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003432static int azx_create(struct snd_card *card, struct pci_dev *pci,
3433 int dev, unsigned int driver_caps,
3434 struct azx **rchip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003435{
Takashi Iwaia98f90f2005-11-17 14:59:02 +01003436 static struct snd_device_ops ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003437 .dev_free = azx_dev_free,
3438 };
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003439 struct azx *chip;
3440 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003441
3442 *rchip = NULL;
Tobin Davisbcd72002008-01-15 11:23:55 +01003443
Pavel Machek927fc862006-08-31 17:03:43 +02003444 err = pci_enable_device(pci);
3445 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003446 return err;
3447
Takashi Iwaie560d8d2005-09-09 14:21:46 +02003448 chip = kzalloc(sizeof(*chip), GFP_KERNEL);
Pavel Machek927fc862006-08-31 17:03:43 +02003449 if (!chip) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003450 snd_printk(KERN_ERR SFX "%s: Cannot allocate chip\n", pci_name(pci));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003451 pci_disable_device(pci);
3452 return -ENOMEM;
3453 }
3454
3455 spin_lock_init(&chip->reg_lock);
Ingo Molnar62932df2006-01-16 16:34:20 +01003456 mutex_init(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003457 chip->card = card;
3458 chip->pci = pci;
3459 chip->irq = -1;
Takashi Iwai9477c582011-05-25 09:11:37 +02003460 chip->driver_caps = driver_caps;
3461 chip->driver_type = driver_caps & 0xff;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003462 check_msi(chip);
Takashi Iwai555e2192008-06-10 17:53:34 +02003463 chip->dev_index = dev;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02003464 INIT_WORK(&chip->irq_pending_work, azx_irq_pending_work);
Takashi Iwai01b65bf2011-11-24 14:31:46 +01003465 INIT_LIST_HEAD(&chip->pcm_list);
Takashi Iwai65fcd412012-08-14 17:13:32 +02003466 INIT_LIST_HEAD(&chip->list);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003467 init_vga_switcheroo(chip);
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003468 init_completion(&chip->probe_wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003469
Shahin Ghazinouribeaffc32010-05-11 08:19:55 +02003470 chip->position_fix[0] = chip->position_fix[1] =
3471 check_position_fix(chip, position_fix[dev]);
Takashi Iwaia6f2fd52012-02-28 11:58:40 +01003472 /* combo mode uses LPIB for playback */
3473 if (chip->position_fix[0] == POS_FIX_COMBO) {
3474 chip->position_fix[0] = POS_FIX_LPIB;
3475 chip->position_fix[1] = POS_FIX_AUTO;
3476 }
3477
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003478 check_probe_mask(chip, dev);
Takashi Iwai3372a152007-02-01 15:46:50 +01003479
Takashi Iwai27346162006-01-12 18:28:44 +01003480 chip->single_cmd = single_cmd;
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003481 chip->snoop = hda_snoop;
Takashi Iwaia1585d72011-12-14 09:27:04 +01003482 azx_check_snoop_available(chip);
Takashi Iwaic74db862005-05-12 14:26:27 +02003483
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02003484 if (bdl_pos_adj[dev] < 0) {
3485 switch (chip->driver_type) {
Takashi Iwai0c6341a2008-06-13 20:50:27 +02003486 case AZX_DRIVER_ICH:
Seth Heasley32679f92010-02-22 17:31:09 -08003487 case AZX_DRIVER_PCH:
Takashi Iwai0c6341a2008-06-13 20:50:27 +02003488 bdl_pos_adj[dev] = 1;
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02003489 break;
3490 default:
Takashi Iwai0c6341a2008-06-13 20:50:27 +02003491 bdl_pos_adj[dev] = 32;
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02003492 break;
3493 }
3494 }
3495
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003496 err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
3497 if (err < 0) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003498 snd_printk(KERN_ERR SFX "%s: Error creating device [card]!\n",
3499 pci_name(chip->pci));
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003500 azx_free(chip);
3501 return err;
3502 }
3503
Wang Xingchao99a20082013-05-30 22:07:10 +08003504#ifdef CONFIG_SND_HDA_I915
3505 /* continue probing in work context as may trigger request module */
3506 INIT_WORK(&chip->probe_work, azx_probe_work);
3507#endif
3508
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003509 *rchip = chip;
Wang Xingchao99a20082013-05-30 22:07:10 +08003510
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003511 return 0;
3512}
3513
Takashi Iwai48c8b0e2012-12-07 07:40:35 +01003514static int azx_first_init(struct azx *chip)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003515{
3516 int dev = chip->dev_index;
3517 struct pci_dev *pci = chip->pci;
3518 struct snd_card *card = chip->card;
3519 int i, err;
3520 unsigned short gcap;
3521
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003522#if BITS_PER_LONG != 64
3523 /* Fix up base address on ULI M5461 */
3524 if (chip->driver_type == AZX_DRIVER_ULI) {
3525 u16 tmp3;
3526 pci_read_config_word(pci, 0x40, &tmp3);
3527 pci_write_config_word(pci, 0x40, tmp3 | 0x10);
3528 pci_write_config_dword(pci, PCI_BASE_ADDRESS_1, 0);
3529 }
3530#endif
3531
Pavel Machek927fc862006-08-31 17:03:43 +02003532 err = pci_request_regions(pci, "ICH HD audio");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003533 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003534 return err;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003535 chip->region_requested = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003536
Pavel Machek927fc862006-08-31 17:03:43 +02003537 chip->addr = pci_resource_start(pci, 0);
Arjan van de Ven2f5ad542008-09-28 16:20:09 -07003538 chip->remap_addr = pci_ioremap_bar(pci, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003539 if (chip->remap_addr == NULL) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003540 snd_printk(KERN_ERR SFX "%s: ioremap error\n", pci_name(chip->pci));
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003541 return -ENXIO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003542 }
3543
Takashi Iwai68e7fff2006-10-23 13:40:59 +02003544 if (chip->msi)
3545 if (pci_enable_msi(pci) < 0)
3546 chip->msi = 0;
Stephen Hemminger7376d012006-08-21 19:17:46 +02003547
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003548 if (azx_acquire_irq(chip, 0) < 0)
3549 return -EBUSY;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003550
3551 pci_set_master(pci);
3552 synchronize_irq(chip->irq);
3553
Tobin Davisbcd72002008-01-15 11:23:55 +01003554 gcap = azx_readw(chip, GCAP);
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003555 snd_printdd(SFX "%s: chipset global capabilities = 0x%x\n", pci_name(chip->pci), gcap);
Tobin Davisbcd72002008-01-15 11:23:55 +01003556
Andiry Brienzadc4c2e62009-07-08 13:55:31 +08003557 /* disable SB600 64bit support for safety */
Takashi Iwai9477c582011-05-25 09:11:37 +02003558 if (chip->pci->vendor == PCI_VENDOR_ID_ATI) {
Andiry Brienzadc4c2e62009-07-08 13:55:31 +08003559 struct pci_dev *p_smbus;
3560 p_smbus = pci_get_device(PCI_VENDOR_ID_ATI,
3561 PCI_DEVICE_ID_ATI_SBX00_SMBUS,
3562 NULL);
3563 if (p_smbus) {
3564 if (p_smbus->revision < 0x30)
3565 gcap &= ~ICH6_GCAP_64OK;
3566 pci_dev_put(p_smbus);
3567 }
3568 }
Takashi Iwai09240cf2009-03-17 07:47:18 +01003569
Takashi Iwai9477c582011-05-25 09:11:37 +02003570 /* disable 64bit DMA address on some devices */
3571 if (chip->driver_caps & AZX_DCAPS_NO_64BIT) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003572 snd_printd(SFX "%s: Disabling 64bit DMA\n", pci_name(chip->pci));
Jaroslav Kysela396087e2009-12-09 10:44:47 +01003573 gcap &= ~ICH6_GCAP_64OK;
Takashi Iwai9477c582011-05-25 09:11:37 +02003574 }
Jaroslav Kysela396087e2009-12-09 10:44:47 +01003575
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003576 /* disable buffer size rounding to 128-byte multiples if supported */
Takashi Iwai7bfe0592012-01-23 17:53:39 +01003577 if (align_buffer_size >= 0)
3578 chip->align_buffer_size = !!align_buffer_size;
3579 else {
3580 if (chip->driver_caps & AZX_DCAPS_BUFSIZE)
3581 chip->align_buffer_size = 0;
3582 else if (chip->driver_caps & AZX_DCAPS_ALIGN_BUFSIZE)
3583 chip->align_buffer_size = 1;
3584 else
3585 chip->align_buffer_size = 1;
3586 }
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003587
Takashi Iwaicf7aaca2008-02-06 15:05:57 +01003588 /* allow 64bit DMA address if supported by H/W */
Takashi Iwaib21fadb2009-05-28 12:26:15 +02003589 if ((gcap & ICH6_GCAP_64OK) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64)))
Yang Hongyange9304382009-04-13 14:40:14 -07003590 pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(64));
Takashi Iwai09240cf2009-03-17 07:47:18 +01003591 else {
Yang Hongyange9304382009-04-13 14:40:14 -07003592 pci_set_dma_mask(pci, DMA_BIT_MASK(32));
3593 pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(32));
Takashi Iwai09240cf2009-03-17 07:47:18 +01003594 }
Takashi Iwaicf7aaca2008-02-06 15:05:57 +01003595
Takashi Iwai8b6ed8e2008-02-19 11:36:35 +01003596 /* read number of streams from GCAP register instead of using
3597 * hardcoded value
3598 */
3599 chip->capture_streams = (gcap >> 8) & 0x0f;
3600 chip->playback_streams = (gcap >> 12) & 0x0f;
3601 if (!chip->playback_streams && !chip->capture_streams) {
Tobin Davisbcd72002008-01-15 11:23:55 +01003602 /* gcap didn't give any info, switching to old method */
3603
3604 switch (chip->driver_type) {
3605 case AZX_DRIVER_ULI:
3606 chip->playback_streams = ULI_NUM_PLAYBACK;
3607 chip->capture_streams = ULI_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01003608 break;
3609 case AZX_DRIVER_ATIHDMI:
Andiry Xu1815b342011-12-14 16:10:27 +08003610 case AZX_DRIVER_ATIHDMI_NS:
Tobin Davisbcd72002008-01-15 11:23:55 +01003611 chip->playback_streams = ATIHDMI_NUM_PLAYBACK;
3612 chip->capture_streams = ATIHDMI_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01003613 break;
Yang, Libinc4da29c2008-11-13 11:07:07 +01003614 case AZX_DRIVER_GENERIC:
Tobin Davisbcd72002008-01-15 11:23:55 +01003615 default:
3616 chip->playback_streams = ICH6_NUM_PLAYBACK;
3617 chip->capture_streams = ICH6_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01003618 break;
3619 }
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003620 }
Takashi Iwai8b6ed8e2008-02-19 11:36:35 +01003621 chip->capture_index_offset = 0;
3622 chip->playback_index_offset = chip->capture_streams;
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003623 chip->num_streams = chip->playback_streams + chip->capture_streams;
Takashi Iwaid01ce992007-07-27 16:52:19 +02003624 chip->azx_dev = kcalloc(chip->num_streams, sizeof(*chip->azx_dev),
3625 GFP_KERNEL);
Pavel Machek927fc862006-08-31 17:03:43 +02003626 if (!chip->azx_dev) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003627 snd_printk(KERN_ERR SFX "%s: cannot malloc azx_dev\n", pci_name(chip->pci));
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003628 return -ENOMEM;
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003629 }
3630
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003631 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaieb49faa2013-03-15 09:19:11 +01003632 dsp_lock_init(&chip->azx_dev[i]);
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003633 /* allocate memory for the BDL for each stream */
3634 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
3635 snd_dma_pci_data(chip->pci),
3636 BDL_SIZE, &chip->azx_dev[i].bdl);
3637 if (err < 0) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003638 snd_printk(KERN_ERR SFX "%s: cannot allocate BDL\n", pci_name(chip->pci));
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003639 return -ENOMEM;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003640 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003641 mark_pages_wc(chip, &chip->azx_dev[i].bdl, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003642 }
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02003643 /* allocate memory for the position buffer */
Takashi Iwaid01ce992007-07-27 16:52:19 +02003644 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
3645 snd_dma_pci_data(chip->pci),
3646 chip->num_streams * 8, &chip->posbuf);
3647 if (err < 0) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003648 snd_printk(KERN_ERR SFX "%s: cannot allocate posbuf\n", pci_name(chip->pci));
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003649 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003650 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003651 mark_pages_wc(chip, &chip->posbuf, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003652 /* allocate CORB/RIRB */
Takashi Iwai81740862009-05-26 15:22:00 +02003653 err = azx_alloc_cmd_io(chip);
3654 if (err < 0)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003655 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003656
3657 /* initialize streams */
3658 azx_init_stream(chip);
3659
3660 /* initialize chip */
Takashi Iwaicb53c622007-08-10 17:21:45 +02003661 azx_init_pci(chip);
Jaroslav Kysela10e77dd2010-03-26 11:04:38 +01003662 azx_init_chip(chip, (probe_only[dev] & 2) == 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003663
3664 /* codec detection */
Pavel Machek927fc862006-08-31 17:03:43 +02003665 if (!chip->codec_mask) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003666 snd_printk(KERN_ERR SFX "%s: no codecs found!\n", pci_name(chip->pci));
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003667 return -ENODEV;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003668 }
3669
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003670 strcpy(card->driver, "HDA-Intel");
Takashi Iwai18cb7102009-04-16 10:22:24 +02003671 strlcpy(card->shortname, driver_short_names[chip->driver_type],
3672 sizeof(card->shortname));
3673 snprintf(card->longname, sizeof(card->longname),
3674 "%s at 0x%lx irq %i",
3675 card->shortname, chip->addr, chip->irq);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003676
Linus Torvalds1da177e2005-04-16 15:20:36 -07003677 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003678}
3679
Takashi Iwaicb53c622007-08-10 17:21:45 +02003680static void power_down_all_codecs(struct azx *chip)
3681{
Takashi Iwai83012a72012-08-24 18:38:08 +02003682#ifdef CONFIG_PM
Takashi Iwaicb53c622007-08-10 17:21:45 +02003683 /* The codecs were powered up in snd_hda_codec_new().
3684 * Now all initialization done, so turn them down if possible
3685 */
3686 struct hda_codec *codec;
3687 list_for_each_entry(codec, &chip->bus->codec_list, list) {
3688 snd_hda_power_down(codec);
3689 }
3690#endif
3691}
3692
Takashi Iwai97c6a3d2012-08-09 17:40:46 +02003693#ifdef CONFIG_SND_HDA_PATCH_LOADER
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003694/* callback from request_firmware_nowait() */
3695static void azx_firmware_cb(const struct firmware *fw, void *context)
3696{
3697 struct snd_card *card = context;
3698 struct azx *chip = card->private_data;
3699 struct pci_dev *pci = chip->pci;
3700
3701 if (!fw) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003702 snd_printk(KERN_ERR SFX "%s: Cannot load firmware, aborting\n",
3703 pci_name(chip->pci));
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003704 goto error;
3705 }
3706
3707 chip->fw = fw;
3708 if (!chip->disabled) {
3709 /* continue probing */
3710 if (azx_probe_continue(chip))
3711 goto error;
3712 }
3713 return; /* OK */
3714
3715 error:
3716 snd_card_free(card);
3717 pci_set_drvdata(pci, NULL);
3718}
Takashi Iwai97c6a3d2012-08-09 17:40:46 +02003719#endif
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003720
Bill Pembertone23e7a12012-12-06 12:35:10 -05003721static int azx_probe(struct pci_dev *pci,
3722 const struct pci_device_id *pci_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003723{
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003724 static int dev;
Takashi Iwaia98f90f2005-11-17 14:59:02 +01003725 struct snd_card *card;
3726 struct azx *chip;
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003727 bool probe_now;
Pavel Machek927fc862006-08-31 17:03:43 +02003728 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003729
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003730 if (dev >= SNDRV_CARDS)
3731 return -ENODEV;
3732 if (!enable[dev]) {
3733 dev++;
3734 return -ENOENT;
3735 }
3736
Takashi Iwaie58de7b2008-12-28 16:44:30 +01003737 err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card);
3738 if (err < 0) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003739 snd_printk(KERN_ERR "hda-intel: Error creating card!\n");
Takashi Iwaie58de7b2008-12-28 16:44:30 +01003740 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003741 }
3742
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003743 snd_card_set_dev(card, &pci->dev);
3744
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003745 err = azx_create(card, pci, dev, pci_id->driver_data, &chip);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003746 if (err < 0)
3747 goto out_free;
Takashi Iwai421a1252005-11-17 16:11:09 +01003748 card->private_data = chip;
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003749
3750 pci_set_drvdata(pci, card);
3751
3752 err = register_vga_switcheroo(chip);
3753 if (err < 0) {
3754 snd_printk(KERN_ERR SFX
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003755 "%s: Error registering VGA-switcheroo client\n", pci_name(pci));
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003756 goto out_free;
3757 }
3758
3759 if (check_hdmi_disabled(pci)) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003760 snd_printk(KERN_INFO SFX "%s: VGA controller is disabled\n",
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003761 pci_name(pci));
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003762 snd_printk(KERN_INFO SFX "%s: Delaying initialization\n", pci_name(pci));
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003763 chip->disabled = true;
3764 }
3765
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003766 probe_now = !chip->disabled;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003767
Takashi Iwai4918cda2012-08-09 12:33:28 +02003768#ifdef CONFIG_SND_HDA_PATCH_LOADER
3769 if (patch[dev] && *patch[dev]) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003770 snd_printk(KERN_ERR SFX "%s: Applying patch firmware '%s'\n",
3771 pci_name(pci), patch[dev]);
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003772 err = request_firmware_nowait(THIS_MODULE, true, patch[dev],
3773 &pci->dev, GFP_KERNEL, card,
3774 azx_firmware_cb);
Takashi Iwai4918cda2012-08-09 12:33:28 +02003775 if (err < 0)
3776 goto out_free;
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003777 probe_now = false; /* continued in azx_firmware_cb() */
Takashi Iwai4918cda2012-08-09 12:33:28 +02003778 }
3779#endif /* CONFIG_SND_HDA_PATCH_LOADER */
3780
Wang Xingchao99a20082013-05-30 22:07:10 +08003781 /* continue probing in work context, avoid request_module deadlock */
3782 if (probe_now && (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)) {
3783#ifdef CONFIG_SND_HDA_I915
3784 probe_now = false;
3785 schedule_work(&chip->probe_work);
3786#else
3787 snd_printk(KERN_ERR SFX "Haswell must build in CONFIG_SND_HDA_I915\n");
3788#endif
3789 }
3790
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003791 if (probe_now) {
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003792 err = azx_probe_continue(chip);
3793 if (err < 0)
3794 goto out_free;
3795 }
3796
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003797 dev++;
Daniel J Blueman44728e92012-12-18 23:59:33 +08003798 complete_all(&chip->probe_wait);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003799 return 0;
3800
3801out_free:
3802 snd_card_free(card);
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003803 pci_set_drvdata(pci, NULL);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003804 return err;
3805}
3806
Takashi Iwai48c8b0e2012-12-07 07:40:35 +01003807static int azx_probe_continue(struct azx *chip)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003808{
Wang Xingchaoc67e2222013-05-30 22:07:08 +08003809 struct pci_dev *pci = chip->pci;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003810 int dev = chip->dev_index;
3811 int err;
3812
Wang Xingchao99a20082013-05-30 22:07:10 +08003813 /* Request power well for Haswell HDA controller and codec */
3814 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL) {
3815 err = hda_i915_init();
3816 if (err < 0) {
3817 snd_printk(KERN_ERR SFX "Error request power-well from i915\n");
3818 goto out_free;
3819 }
3820 hda_display_power(true);
3821 }
3822
Takashi Iwai5c906802013-05-30 22:07:09 +08003823 err = azx_first_init(chip);
3824 if (err < 0)
3825 goto out_free;
3826
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +01003827#ifdef CONFIG_SND_HDA_INPUT_BEEP
3828 chip->beep_mode = beep_mode[dev];
3829#endif
3830
Linus Torvalds1da177e2005-04-16 15:20:36 -07003831 /* create codec instances */
Takashi Iwaia1e21c92009-06-17 09:33:52 +02003832 err = azx_codec_create(chip, model[dev]);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003833 if (err < 0)
3834 goto out_free;
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003835#ifdef CONFIG_SND_HDA_PATCH_LOADER
Takashi Iwai4918cda2012-08-09 12:33:28 +02003836 if (chip->fw) {
3837 err = snd_hda_load_patch(chip->bus, chip->fw->size,
3838 chip->fw->data);
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003839 if (err < 0)
3840 goto out_free;
Takashi Iwaie39ae852012-11-22 16:18:13 +01003841#ifndef CONFIG_PM
Takashi Iwai4918cda2012-08-09 12:33:28 +02003842 release_firmware(chip->fw); /* no longer needed */
3843 chip->fw = NULL;
Takashi Iwaie39ae852012-11-22 16:18:13 +01003844#endif
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003845 }
3846#endif
Jaroslav Kysela10e77dd2010-03-26 11:04:38 +01003847 if ((probe_only[dev] & 1) == 0) {
Takashi Iwaia1e21c92009-06-17 09:33:52 +02003848 err = azx_codec_configure(chip);
3849 if (err < 0)
3850 goto out_free;
3851 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003852
3853 /* create PCM streams */
Takashi Iwai176d5332008-07-30 15:01:44 +02003854 err = snd_hda_build_pcms(chip->bus);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003855 if (err < 0)
3856 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003857
3858 /* create mixer controls */
Takashi Iwaid01ce992007-07-27 16:52:19 +02003859 err = azx_mixer_create(chip);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003860 if (err < 0)
3861 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003862
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003863 err = snd_card_register(chip->card);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003864 if (err < 0)
3865 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003866
Takashi Iwaicb53c622007-08-10 17:21:45 +02003867 chip->running = 1;
3868 power_down_all_codecs(chip);
Takashi Iwai0cbf0092008-10-29 16:18:25 +01003869 azx_notifier_register(chip);
Takashi Iwai65fcd412012-08-14 17:13:32 +02003870 azx_add_card_list(chip);
Wang Xingchaoc67e2222013-05-30 22:07:08 +08003871 if (chip->driver_caps & AZX_DCAPS_PM_RUNTIME)
3872 pm_runtime_put_noidle(&pci->dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003873
Takashi Iwai91219472012-04-26 12:13:25 +02003874 return 0;
3875
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003876out_free:
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003877 chip->init_failed = 1;
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003878 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003879}
3880
Bill Pembertone23e7a12012-12-06 12:35:10 -05003881static void azx_remove(struct pci_dev *pci)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003882{
Takashi Iwai91219472012-04-26 12:13:25 +02003883 struct snd_card *card = pci_get_drvdata(pci);
Mengdong Linb8dfc4622012-08-23 17:32:30 +08003884
Takashi Iwai91219472012-04-26 12:13:25 +02003885 if (card)
3886 snd_card_free(card);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003887 pci_set_drvdata(pci, NULL);
3888}
3889
3890/* PCI IDs */
Alexey Dobriyancebe41d2010-02-06 00:21:03 +02003891static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
Seth Heasleyd2f2fcd2010-01-12 17:03:35 -08003892 /* CPT */
Takashi Iwai9477c582011-05-25 09:11:37 +02003893 { PCI_DEVICE(0x8086, 0x1c20),
Takashi Iwaid7dab4d2013-01-08 13:51:30 +01003894 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM },
Seth Heasleycea310e2010-09-10 16:29:56 -07003895 /* PBG */
Takashi Iwai9477c582011-05-25 09:11:37 +02003896 { PCI_DEVICE(0x8086, 0x1d20),
Takashi Iwaid7dab4d2013-01-08 13:51:30 +01003897 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM },
Seth Heasleyd2edeb72011-04-20 10:59:57 -07003898 /* Panther Point */
Takashi Iwai9477c582011-05-25 09:11:37 +02003899 { PCI_DEVICE(0x8086, 0x1e20),
Takashi Iwaid7dab4d2013-01-08 13:51:30 +01003900 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM },
Seth Heasley8bc039a2012-01-23 16:24:31 -08003901 /* Lynx Point */
3902 { PCI_DEVICE(0x8086, 0x8c20),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003903 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
James Ralston884b0882013-02-08 17:29:40 -08003904 /* Wellsburg */
3905 { PCI_DEVICE(0x8086, 0x8d20),
3906 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
3907 { PCI_DEVICE(0x8086, 0x8d21),
3908 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
James Ralston144dad92012-08-09 09:38:59 -07003909 /* Lynx Point-LP */
3910 { PCI_DEVICE(0x8086, 0x9c20),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003911 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
James Ralston144dad92012-08-09 09:38:59 -07003912 /* Lynx Point-LP */
3913 { PCI_DEVICE(0x8086, 0x9c21),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003914 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
Wang Xingchaoe926f2c2012-06-13 10:23:51 +08003915 /* Haswell */
Wang Xingchao4a7c5162013-02-01 22:42:19 +08003916 { PCI_DEVICE(0x8086, 0x0a0c),
Wang Xingchao99a20082013-05-30 22:07:10 +08003917 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH |
3918 AZX_DCAPS_I915_POWERWELL },
Wang Xingchaoe926f2c2012-06-13 10:23:51 +08003919 { PCI_DEVICE(0x8086, 0x0c0c),
Wang Xingchao99a20082013-05-30 22:07:10 +08003920 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH |
3921 AZX_DCAPS_I915_POWERWELL },
Wang Xingchaod279fae2012-09-17 13:10:23 +08003922 { PCI_DEVICE(0x8086, 0x0d0c),
Wang Xingchao99a20082013-05-30 22:07:10 +08003923 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH |
3924 AZX_DCAPS_I915_POWERWELL },
Pierre-Louis Bossart99df18b2012-09-21 18:39:07 -05003925 /* 5 Series/3400 */
3926 { PCI_DEVICE(0x8086, 0x3b56),
Takashi Iwai2c1350f2013-02-14 09:44:55 +01003927 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_NOPM },
Takashi Iwaif748abc2013-01-29 10:12:23 +01003928 /* Poulsbo */
Takashi Iwai9477c582011-05-25 09:11:37 +02003929 { PCI_DEVICE(0x8086, 0x811b),
Takashi Iwaif748abc2013-01-29 10:12:23 +01003930 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_NOPM },
3931 /* Oaktrail */
Li Peng09904b92011-12-28 15:17:26 +00003932 { PCI_DEVICE(0x8086, 0x080a),
Takashi Iwaif748abc2013-01-29 10:12:23 +01003933 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_NOPM },
David Henningsson645e9032011-12-14 15:52:30 +08003934 /* ICH */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003935 { PCI_DEVICE(0x8086, 0x2668),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003936 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3937 AZX_DCAPS_BUFSIZE }, /* ICH6 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003938 { PCI_DEVICE(0x8086, 0x27d8),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003939 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3940 AZX_DCAPS_BUFSIZE }, /* ICH7 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003941 { PCI_DEVICE(0x8086, 0x269a),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003942 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3943 AZX_DCAPS_BUFSIZE }, /* ESB2 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003944 { PCI_DEVICE(0x8086, 0x284b),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003945 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3946 AZX_DCAPS_BUFSIZE }, /* ICH8 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003947 { PCI_DEVICE(0x8086, 0x293e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003948 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3949 AZX_DCAPS_BUFSIZE }, /* ICH9 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003950 { PCI_DEVICE(0x8086, 0x293f),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003951 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3952 AZX_DCAPS_BUFSIZE }, /* ICH9 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003953 { PCI_DEVICE(0x8086, 0x3a3e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003954 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3955 AZX_DCAPS_BUFSIZE }, /* ICH10 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003956 { PCI_DEVICE(0x8086, 0x3a6e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003957 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3958 AZX_DCAPS_BUFSIZE }, /* ICH10 */
Takashi Iwaib6864532010-09-15 10:17:26 +02003959 /* Generic Intel */
3960 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_ANY_ID),
3961 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3962 .class_mask = 0xffffff,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003963 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_BUFSIZE },
Takashi Iwai9477c582011-05-25 09:11:37 +02003964 /* ATI SB 450/600/700/800/900 */
3965 { PCI_DEVICE(0x1002, 0x437b),
3966 .driver_data = AZX_DRIVER_ATI | AZX_DCAPS_PRESET_ATI_SB },
3967 { PCI_DEVICE(0x1002, 0x4383),
3968 .driver_data = AZX_DRIVER_ATI | AZX_DCAPS_PRESET_ATI_SB },
3969 /* AMD Hudson */
3970 { PCI_DEVICE(0x1022, 0x780d),
3971 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_SB },
Takashi Iwai87218e92008-02-21 08:13:11 +01003972 /* ATI HDMI */
Takashi Iwai9477c582011-05-25 09:11:37 +02003973 { PCI_DEVICE(0x1002, 0x793b),
3974 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3975 { PCI_DEVICE(0x1002, 0x7919),
3976 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3977 { PCI_DEVICE(0x1002, 0x960f),
3978 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3979 { PCI_DEVICE(0x1002, 0x970f),
3980 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3981 { PCI_DEVICE(0x1002, 0xaa00),
3982 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3983 { PCI_DEVICE(0x1002, 0xaa08),
3984 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3985 { PCI_DEVICE(0x1002, 0xaa10),
3986 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3987 { PCI_DEVICE(0x1002, 0xaa18),
3988 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3989 { PCI_DEVICE(0x1002, 0xaa20),
3990 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3991 { PCI_DEVICE(0x1002, 0xaa28),
3992 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3993 { PCI_DEVICE(0x1002, 0xaa30),
3994 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3995 { PCI_DEVICE(0x1002, 0xaa38),
3996 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3997 { PCI_DEVICE(0x1002, 0xaa40),
3998 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3999 { PCI_DEVICE(0x1002, 0xaa48),
4000 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
Andiry Xu1815b342011-12-14 16:10:27 +08004001 { PCI_DEVICE(0x1002, 0x9902),
4002 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
4003 { PCI_DEVICE(0x1002, 0xaaa0),
4004 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
4005 { PCI_DEVICE(0x1002, 0xaaa8),
4006 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
4007 { PCI_DEVICE(0x1002, 0xaab0),
4008 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
Takashi Iwai87218e92008-02-21 08:13:11 +01004009 /* VIA VT8251/VT8237A */
Takashi Iwai9477c582011-05-25 09:11:37 +02004010 { PCI_DEVICE(0x1106, 0x3288),
4011 .driver_data = AZX_DRIVER_VIA | AZX_DCAPS_POSFIX_VIA },
Annie Liu754fdff2012-06-08 19:18:39 +08004012 /* VIA GFX VT7122/VX900 */
4013 { PCI_DEVICE(0x1106, 0x9170), .driver_data = AZX_DRIVER_GENERIC },
4014 /* VIA GFX VT6122/VX11 */
4015 { PCI_DEVICE(0x1106, 0x9140), .driver_data = AZX_DRIVER_GENERIC },
Takashi Iwai87218e92008-02-21 08:13:11 +01004016 /* SIS966 */
4017 { PCI_DEVICE(0x1039, 0x7502), .driver_data = AZX_DRIVER_SIS },
4018 /* ULI M5461 */
4019 { PCI_DEVICE(0x10b9, 0x5461), .driver_data = AZX_DRIVER_ULI },
4020 /* NVIDIA MCP */
Takashi Iwai0c2fd1bf42009-12-18 16:41:39 +01004021 { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID),
4022 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
4023 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02004024 .driver_data = AZX_DRIVER_NVIDIA | AZX_DCAPS_PRESET_NVIDIA },
Kailang Yangf2690022008-05-27 11:44:55 +02004025 /* Teradici */
Takashi Iwai9477c582011-05-25 09:11:37 +02004026 { PCI_DEVICE(0x6549, 0x1200),
4027 .driver_data = AZX_DRIVER_TERA | AZX_DCAPS_NO_64BIT },
Lars R. Damerowf0b3da92012-11-02 13:10:39 -07004028 { PCI_DEVICE(0x6549, 0x2200),
4029 .driver_data = AZX_DRIVER_TERA | AZX_DCAPS_NO_64BIT },
Takashi Iwai4e01f542009-04-16 08:53:34 +02004030 /* Creative X-Fi (CA0110-IBG) */
Takashi Iwaif2a8eca2012-06-11 15:51:54 +02004031 /* CTHDA chips */
4032 { PCI_DEVICE(0x1102, 0x0010),
4033 .driver_data = AZX_DRIVER_CTHDA | AZX_DCAPS_PRESET_CTHDA },
4034 { PCI_DEVICE(0x1102, 0x0012),
4035 .driver_data = AZX_DRIVER_CTHDA | AZX_DCAPS_PRESET_CTHDA },
Takashi Iwai313f6e22009-05-18 12:40:52 +02004036#if !defined(CONFIG_SND_CTXFI) && !defined(CONFIG_SND_CTXFI_MODULE)
4037 /* the following entry conflicts with snd-ctxfi driver,
4038 * as ctxfi driver mutates from HD-audio to native mode with
4039 * a special command sequence.
4040 */
Takashi Iwai4e01f542009-04-16 08:53:34 +02004041 { PCI_DEVICE(PCI_VENDOR_ID_CREATIVE, PCI_ANY_ID),
4042 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
4043 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02004044 .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
Takashi Iwai69f9ba92011-11-06 13:49:13 +01004045 AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB },
Takashi Iwai313f6e22009-05-18 12:40:52 +02004046#else
4047 /* this entry seems still valid -- i.e. without emu20kx chip */
Takashi Iwai9477c582011-05-25 09:11:37 +02004048 { PCI_DEVICE(0x1102, 0x0009),
4049 .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
Takashi Iwai69f9ba92011-11-06 13:49:13 +01004050 AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB },
Takashi Iwai313f6e22009-05-18 12:40:52 +02004051#endif
Otavio Salvadore35d4b12010-09-26 23:35:06 -03004052 /* Vortex86MX */
4053 { PCI_DEVICE(0x17f3, 0x3010), .driver_data = AZX_DRIVER_GENERIC },
Bankim Bhavsar0f0714c52011-01-17 15:23:21 +01004054 /* VMware HDAudio */
4055 { PCI_DEVICE(0x15ad, 0x1977), .driver_data = AZX_DRIVER_GENERIC },
Andiry Brienza9176b672009-07-17 11:32:32 +08004056 /* AMD/ATI Generic, PCI class code and Vendor ID for HD Audio */
Yang, Libinc4da29c2008-11-13 11:07:07 +01004057 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_ANY_ID),
4058 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
4059 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02004060 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_HDMI },
Andiry Brienza9176b672009-07-17 11:32:32 +08004061 { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_ANY_ID),
4062 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
4063 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02004064 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_HDMI },
Linus Torvalds1da177e2005-04-16 15:20:36 -07004065 { 0, }
4066};
4067MODULE_DEVICE_TABLE(pci, azx_ids);
4068
4069/* pci_driver definition */
Takashi Iwaie9f66d92012-04-24 12:25:00 +02004070static struct pci_driver azx_driver = {
Takashi Iwai3733e422011-06-10 16:20:20 +02004071 .name = KBUILD_MODNAME,
Linus Torvalds1da177e2005-04-16 15:20:36 -07004072 .id_table = azx_ids,
4073 .probe = azx_probe,
Bill Pembertone23e7a12012-12-06 12:35:10 -05004074 .remove = azx_remove,
Takashi Iwai68cb2b52012-07-02 15:20:37 +02004075 .driver = {
4076 .pm = AZX_PM_OPS,
4077 },
Linus Torvalds1da177e2005-04-16 15:20:36 -07004078};
4079
Takashi Iwaie9f66d92012-04-24 12:25:00 +02004080module_pci_driver(azx_driver);