blob: c6c98298ac397c024d35cf55e5d85f3fe095decc [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
Takashi Iwai63e51fd2013-06-06 14:20:19 +0200951 if (!bus->no_response_fallback)
952 return -1;
953
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200954 if (!chip->polling_mode && chip->poll_count < 2) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +0800955 snd_printdd(SFX "%s: azx_get_response timeout, "
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200956 "polling the codec once: last cmd=0x%08x\n",
Daniel J Blueman445a51b2012-12-05 23:04:21 +0800957 pci_name(chip->pci), chip->last_cmd[addr]);
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200958 do_poll = 1;
959 chip->poll_count++;
960 goto again;
961 }
962
963
Takashi Iwai23c4a882009-10-30 13:21:49 +0100964 if (!chip->polling_mode) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +0800965 snd_printk(KERN_WARNING SFX "%s: azx_get_response timeout, "
Takashi Iwai23c4a882009-10-30 13:21:49 +0100966 "switching to polling mode: last cmd=0x%08x\n",
Daniel J Blueman445a51b2012-12-05 23:04:21 +0800967 pci_name(chip->pci), chip->last_cmd[addr]);
Takashi Iwai23c4a882009-10-30 13:21:49 +0100968 chip->polling_mode = 1;
969 goto again;
970 }
971
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200972 if (chip->msi) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +0800973 snd_printk(KERN_WARNING SFX "%s: No response from codec, "
Wu Fengguangfeb27342009-08-01 19:17:14 +0800974 "disabling MSI: last cmd=0x%08x\n",
Daniel J Blueman445a51b2012-12-05 23:04:21 +0800975 pci_name(chip->pci), chip->last_cmd[addr]);
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200976 free_irq(chip->irq, chip);
977 chip->irq = -1;
978 pci_disable_msi(chip->pci);
979 chip->msi = 0;
Takashi Iwaib6132912009-03-24 07:36:09 +0100980 if (azx_acquire_irq(chip, 1) < 0) {
981 bus->rirb_error = 1;
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200982 return -1;
Takashi Iwaib6132912009-03-24 07:36:09 +0100983 }
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200984 goto again;
985 }
986
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +0100987 if (chip->probing) {
988 /* If this critical timeout happens during the codec probing
989 * phase, this is likely an access to a non-existing codec
990 * slot. Better to return an error and reset the system.
991 */
992 return -1;
993 }
994
Takashi Iwai8dd78332009-06-02 01:16:07 +0200995 /* a fatal communication error; need either to reset or to fallback
996 * to the single_cmd mode
997 */
Takashi Iwaib6132912009-03-24 07:36:09 +0100998 bus->rirb_error = 1;
Takashi Iwaib20f3b82009-06-02 01:20:22 +0200999 if (bus->allow_bus_reset && !bus->response_reset && !bus->in_reset) {
Takashi Iwai8dd78332009-06-02 01:16:07 +02001000 bus->response_reset = 1;
1001 return -1; /* give a chance to retry */
1002 }
1003
1004 snd_printk(KERN_ERR "hda_intel: azx_get_response timeout, "
1005 "switching to single_cmd mode: last cmd=0x%08x\n",
Wu Fengguangfeb27342009-08-01 19:17:14 +08001006 chip->last_cmd[addr]);
Takashi Iwai8dd78332009-06-02 01:16:07 +02001007 chip->single_cmd = 1;
1008 bus->response_reset = 0;
Takashi Iwai1a696972009-11-07 09:49:04 +01001009 /* release CORB/RIRB */
Takashi Iwai4fcd3922009-05-25 18:34:52 +02001010 azx_free_cmd_io(chip);
Takashi Iwai1a696972009-11-07 09:49:04 +01001011 /* disable unsolicited responses */
1012 azx_writel(chip, GCTL, azx_readl(chip, GCTL) & ~ICH6_GCTL_UNSOL);
Takashi Iwai5c79b1f2006-09-21 13:34:13 +02001013 return -1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001014}
1015
Linus Torvalds1da177e2005-04-16 15:20:36 -07001016/*
1017 * Use the single immediate command instead of CORB/RIRB for simplicity
1018 *
1019 * Note: according to Intel, this is not preferred use. The command was
1020 * intended for the BIOS only, and may get confused with unsolicited
1021 * responses. So, we shouldn't use it for normal operation from the
1022 * driver.
1023 * I left the codes, however, for debugging/testing purposes.
1024 */
1025
Takashi Iwaib05a7d42009-05-28 11:59:12 +02001026/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +08001027static int azx_single_wait_for_response(struct azx *chip, unsigned int addr)
Takashi Iwaib05a7d42009-05-28 11:59:12 +02001028{
1029 int timeout = 50;
1030
1031 while (timeout--) {
1032 /* check IRV busy bit */
1033 if (azx_readw(chip, IRS) & ICH6_IRS_VALID) {
1034 /* reuse rirb.res as the response return value */
Wu Fengguangdeadff12009-08-01 18:45:16 +08001035 chip->rirb.res[addr] = azx_readl(chip, IR);
Takashi Iwaib05a7d42009-05-28 11:59:12 +02001036 return 0;
1037 }
1038 udelay(1);
1039 }
1040 if (printk_ratelimit())
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001041 snd_printd(SFX "%s: get_response timeout: IRS=0x%x\n",
1042 pci_name(chip->pci), azx_readw(chip, IRS));
Wu Fengguangdeadff12009-08-01 18:45:16 +08001043 chip->rirb.res[addr] = -1;
Takashi Iwaib05a7d42009-05-28 11:59:12 +02001044 return -EIO;
1045}
1046
Linus Torvalds1da177e2005-04-16 15:20:36 -07001047/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001048static int azx_single_send_cmd(struct hda_bus *bus, u32 val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001049{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001050 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +08001051 unsigned int addr = azx_command_addr(val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001052 int timeout = 50;
1053
Takashi Iwai8dd78332009-06-02 01:16:07 +02001054 bus->rirb_error = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001055 while (timeout--) {
1056 /* check ICB busy bit */
Takashi Iwaid01ce992007-07-27 16:52:19 +02001057 if (!((azx_readw(chip, IRS) & ICH6_IRS_BUSY))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001058 /* Clear IRV valid bit */
Takashi Iwaid01ce992007-07-27 16:52:19 +02001059 azx_writew(chip, IRS, azx_readw(chip, IRS) |
1060 ICH6_IRS_VALID);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001061 azx_writel(chip, IC, val);
Takashi Iwaid01ce992007-07-27 16:52:19 +02001062 azx_writew(chip, IRS, azx_readw(chip, IRS) |
1063 ICH6_IRS_BUSY);
Wu Fengguangdeadff12009-08-01 18:45:16 +08001064 return azx_single_wait_for_response(chip, addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001065 }
1066 udelay(1);
1067 }
Marc Boucher1cfd52b2008-01-22 15:29:26 +01001068 if (printk_ratelimit())
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001069 snd_printd(SFX "%s: send_cmd timeout: IRS=0x%x, val=0x%x\n",
1070 pci_name(chip->pci), azx_readw(chip, IRS), val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001071 return -EIO;
1072}
1073
1074/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +08001075static unsigned int azx_single_get_response(struct hda_bus *bus,
1076 unsigned int addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001077{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001078 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +08001079 return chip->rirb.res[addr];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001080}
1081
Takashi Iwai111d3af2006-02-16 18:17:58 +01001082/*
1083 * The below are the main callbacks from hda_codec.
1084 *
1085 * They are just the skeleton to call sub-callbacks according to the
1086 * current setting of chip->single_cmd.
1087 */
1088
1089/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001090static int azx_send_cmd(struct hda_bus *bus, unsigned int val)
Takashi Iwai111d3af2006-02-16 18:17:58 +01001091{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001092 struct azx *chip = bus->private_data;
Takashi Iwai43bbb6c2007-07-06 20:22:05 +02001093
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001094 if (chip->disabled)
1095 return 0;
Wu Fengguangfeb27342009-08-01 19:17:14 +08001096 chip->last_cmd[azx_command_addr(val)] = val;
Takashi Iwai111d3af2006-02-16 18:17:58 +01001097 if (chip->single_cmd)
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001098 return azx_single_send_cmd(bus, val);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001099 else
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001100 return azx_corb_send_cmd(bus, val);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001101}
1102
1103/* get a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +08001104static unsigned int azx_get_response(struct hda_bus *bus,
1105 unsigned int addr)
Takashi Iwai111d3af2006-02-16 18:17:58 +01001106{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001107 struct azx *chip = bus->private_data;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001108 if (chip->disabled)
1109 return 0;
Takashi Iwai111d3af2006-02-16 18:17:58 +01001110 if (chip->single_cmd)
Wu Fengguangdeadff12009-08-01 18:45:16 +08001111 return azx_single_get_response(bus, addr);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001112 else
Wu Fengguangdeadff12009-08-01 18:45:16 +08001113 return azx_rirb_get_response(bus, addr);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001114}
1115
Takashi Iwai83012a72012-08-24 18:38:08 +02001116#ifdef CONFIG_PM
Takashi Iwai68467f52012-08-28 09:14:29 -07001117static void azx_power_notify(struct hda_bus *bus, bool power_up);
Takashi Iwaicb53c622007-08-10 17:21:45 +02001118#endif
Takashi Iwai111d3af2006-02-16 18:17:58 +01001119
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001120#ifdef CONFIG_SND_HDA_DSP_LOADER
1121static int azx_load_dsp_prepare(struct hda_bus *bus, unsigned int format,
1122 unsigned int byte_size,
1123 struct snd_dma_buffer *bufp);
1124static void azx_load_dsp_trigger(struct hda_bus *bus, bool start);
1125static void azx_load_dsp_cleanup(struct hda_bus *bus,
1126 struct snd_dma_buffer *dmab);
1127#endif
1128
Mengdong Lin3af3f352013-06-24 10:18:54 -04001129/* enter link reset */
Mengdong Lin7295b262013-06-25 05:58:49 -04001130static void azx_enter_link_reset(struct azx *chip)
Mengdong Lin3af3f352013-06-24 10:18:54 -04001131{
1132 unsigned long timeout;
1133
1134 /* reset controller */
1135 azx_writel(chip, GCTL, azx_readl(chip, GCTL) & ~ICH6_GCTL_RESET);
1136
1137 timeout = jiffies + msecs_to_jiffies(100);
1138 while ((azx_readb(chip, GCTL) & ICH6_GCTL_RESET) &&
1139 time_before(jiffies, timeout))
1140 usleep_range(500, 1000);
1141}
1142
Mengdong Lin7295b262013-06-25 05:58:49 -04001143/* exit link reset */
1144static void azx_exit_link_reset(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001145{
Mengdong Linfa348da2012-12-12 09:16:15 -05001146 unsigned long timeout;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001147
Mengdong Lin7295b262013-06-25 05:58:49 -04001148 azx_writeb(chip, GCTL, azx_readb(chip, GCTL) | ICH6_GCTL_RESET);
1149
1150 timeout = jiffies + msecs_to_jiffies(100);
1151 while (!azx_readb(chip, GCTL) &&
1152 time_before(jiffies, timeout))
1153 usleep_range(500, 1000);
1154}
1155
1156/* reset codec link */
1157static int azx_reset(struct azx *chip, int full_reset)
1158{
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001159 if (!full_reset)
1160 goto __skip;
1161
Danny Tholene8a7f132007-09-11 21:41:56 +02001162 /* clear STATESTS */
Wang Xingchaoda7db6a2013-07-22 03:19:18 -04001163 azx_writew(chip, STATESTS, STATESTS_INT_MASK);
Danny Tholene8a7f132007-09-11 21:41:56 +02001164
Linus Torvalds1da177e2005-04-16 15:20:36 -07001165 /* reset controller */
Mengdong Lin7295b262013-06-25 05:58:49 -04001166 azx_enter_link_reset(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001167
1168 /* delay for >= 100us for codec PLL to settle per spec
1169 * Rev 0.9 section 5.5.1
1170 */
Mengdong Linfa348da2012-12-12 09:16:15 -05001171 usleep_range(500, 1000);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001172
1173 /* Bring controller out of reset */
Mengdong Lin7295b262013-06-25 05:58:49 -04001174 azx_exit_link_reset(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001175
Pavel Machek927fc862006-08-31 17:03:43 +02001176 /* Brent Chartrand said to wait >= 540us for codecs to initialize */
Mengdong Linfa348da2012-12-12 09:16:15 -05001177 usleep_range(1000, 1200);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001178
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001179 __skip:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001180 /* check to see if controller is ready */
Pavel Machek927fc862006-08-31 17:03:43 +02001181 if (!azx_readb(chip, GCTL)) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001182 snd_printd(SFX "%s: azx_reset: controller not ready!\n", pci_name(chip->pci));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001183 return -EBUSY;
1184 }
1185
Matt41e2fce2005-07-04 17:49:55 +02001186 /* Accept unsolicited responses */
Takashi Iwai1a696972009-11-07 09:49:04 +01001187 if (!chip->single_cmd)
1188 azx_writel(chip, GCTL, azx_readl(chip, GCTL) |
1189 ICH6_GCTL_UNSOL);
Matt41e2fce2005-07-04 17:49:55 +02001190
Linus Torvalds1da177e2005-04-16 15:20:36 -07001191 /* detect codecs */
Pavel Machek927fc862006-08-31 17:03:43 +02001192 if (!chip->codec_mask) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001193 chip->codec_mask = azx_readw(chip, STATESTS);
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001194 snd_printdd(SFX "%s: codec_mask = 0x%x\n", pci_name(chip->pci), chip->codec_mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001195 }
1196
1197 return 0;
1198}
1199
1200
1201/*
1202 * Lowlevel interface
1203 */
1204
1205/* enable interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001206static void azx_int_enable(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001207{
1208 /* enable controller CIE and GIE */
1209 azx_writel(chip, INTCTL, azx_readl(chip, INTCTL) |
1210 ICH6_INT_CTRL_EN | ICH6_INT_GLOBAL_EN);
1211}
1212
1213/* disable interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001214static void azx_int_disable(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001215{
1216 int i;
1217
1218 /* disable interrupts in stream descriptor */
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001219 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001220 struct azx_dev *azx_dev = &chip->azx_dev[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001221 azx_sd_writeb(azx_dev, SD_CTL,
1222 azx_sd_readb(azx_dev, SD_CTL) & ~SD_INT_MASK);
1223 }
1224
1225 /* disable SIE for all streams */
1226 azx_writeb(chip, INTCTL, 0);
1227
1228 /* disable controller CIE and GIE */
1229 azx_writel(chip, INTCTL, azx_readl(chip, INTCTL) &
1230 ~(ICH6_INT_CTRL_EN | ICH6_INT_GLOBAL_EN));
1231}
1232
1233/* clear interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001234static void azx_int_clear(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001235{
1236 int i;
1237
1238 /* clear stream status */
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001239 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001240 struct azx_dev *azx_dev = &chip->azx_dev[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001241 azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK);
1242 }
1243
1244 /* clear STATESTS */
Wang Xingchaoda7db6a2013-07-22 03:19:18 -04001245 azx_writew(chip, STATESTS, STATESTS_INT_MASK);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001246
1247 /* clear rirb status */
1248 azx_writeb(chip, RIRBSTS, RIRB_INT_MASK);
1249
1250 /* clear int status */
1251 azx_writel(chip, INTSTS, ICH6_INT_CTRL_EN | ICH6_INT_ALL_STREAM);
1252}
1253
1254/* start a stream */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001255static void azx_stream_start(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001256{
Joseph Chan0e153472008-08-26 14:38:03 +02001257 /*
1258 * Before stream start, initialize parameter
1259 */
1260 azx_dev->insufficient = 1;
1261
Linus Torvalds1da177e2005-04-16 15:20:36 -07001262 /* enable SIE */
Wei Niccc5df02010-01-26 15:59:33 +08001263 azx_writel(chip, INTCTL,
1264 azx_readl(chip, INTCTL) | (1 << azx_dev->index));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001265 /* set DMA start and interrupt mask */
1266 azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) |
1267 SD_CTL_DMA_START | SD_INT_MASK);
1268}
1269
Takashi Iwai1dddab42009-03-18 15:15:37 +01001270/* stop DMA */
1271static void azx_stream_clear(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001272{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001273 azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) &
1274 ~(SD_CTL_DMA_START | SD_INT_MASK));
1275 azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK); /* to be sure */
Takashi Iwai1dddab42009-03-18 15:15:37 +01001276}
1277
1278/* stop a stream */
1279static void azx_stream_stop(struct azx *chip, struct azx_dev *azx_dev)
1280{
1281 azx_stream_clear(chip, azx_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001282 /* disable SIE */
Wei Niccc5df02010-01-26 15:59:33 +08001283 azx_writel(chip, INTCTL,
1284 azx_readl(chip, INTCTL) & ~(1 << azx_dev->index));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001285}
1286
1287
1288/*
Takashi Iwaicb53c622007-08-10 17:21:45 +02001289 * reset and start the controller registers
Linus Torvalds1da177e2005-04-16 15:20:36 -07001290 */
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001291static void azx_init_chip(struct azx *chip, int full_reset)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001292{
Takashi Iwaicb53c622007-08-10 17:21:45 +02001293 if (chip->initialized)
1294 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001295
1296 /* reset controller */
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001297 azx_reset(chip, full_reset);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001298
1299 /* initialize interrupts */
1300 azx_int_clear(chip);
1301 azx_int_enable(chip);
1302
1303 /* initialize the codec command I/O */
Takashi Iwai1a696972009-11-07 09:49:04 +01001304 if (!chip->single_cmd)
1305 azx_init_cmd_io(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001306
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02001307 /* program the position buffer */
1308 azx_writel(chip, DPLBASE, (u32)chip->posbuf.addr);
Takashi Iwai766979e2008-06-13 20:53:56 +02001309 azx_writel(chip, DPUBASE, upper_32_bits(chip->posbuf.addr));
Frederick Lif5d40b32005-05-12 14:55:20 +02001310
Takashi Iwaicb53c622007-08-10 17:21:45 +02001311 chip->initialized = 1;
1312}
1313
1314/*
1315 * initialize the PCI registers
1316 */
1317/* update bits in a PCI register byte */
1318static void update_pci_byte(struct pci_dev *pci, unsigned int reg,
1319 unsigned char mask, unsigned char val)
1320{
1321 unsigned char data;
1322
1323 pci_read_config_byte(pci, reg, &data);
1324 data &= ~mask;
1325 data |= (val & mask);
1326 pci_write_config_byte(pci, reg, data);
1327}
1328
1329static void azx_init_pci(struct azx *chip)
1330{
1331 /* Clear bits 0-2 of PCI register TCSEL (at offset 0x44)
1332 * TCSEL == Traffic Class Select Register, which sets PCI express QOS
1333 * Ensuring these bits are 0 clears playback static on some HD Audio
Adam Lackorzynskia09e89f2011-03-10 17:41:56 +01001334 * codecs.
1335 * The PCI register TCSEL is defined in the Intel manuals.
Takashi Iwaicb53c622007-08-10 17:21:45 +02001336 */
Linus Torvalds46f2cc82011-05-27 19:45:28 -07001337 if (!(chip->driver_caps & AZX_DCAPS_NO_TCSEL)) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001338 snd_printdd(SFX "%s: Clearing TCSEL\n", pci_name(chip->pci));
Adam Lackorzynskia09e89f2011-03-10 17:41:56 +01001339 update_pci_byte(chip->pci, ICH6_PCIREG_TCSEL, 0x07, 0);
Takashi Iwai9477c582011-05-25 09:11:37 +02001340 }
Takashi Iwaicb53c622007-08-10 17:21:45 +02001341
Takashi Iwai9477c582011-05-25 09:11:37 +02001342 /* For ATI SB450/600/700/800/900 and AMD Hudson azalia HD audio,
1343 * we need to enable snoop.
1344 */
1345 if (chip->driver_caps & AZX_DCAPS_ATI_SNOOP) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001346 snd_printdd(SFX "%s: Setting ATI snoop: %d\n", pci_name(chip->pci), azx_snoop(chip));
Takashi Iwaicb53c622007-08-10 17:21:45 +02001347 update_pci_byte(chip->pci,
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001348 ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR, 0x07,
1349 azx_snoop(chip) ? ATI_SB450_HDAUDIO_ENABLE_SNOOP : 0);
Takashi Iwai9477c582011-05-25 09:11:37 +02001350 }
1351
1352 /* For NVIDIA HDA, enable snoop */
1353 if (chip->driver_caps & AZX_DCAPS_NVIDIA_SNOOP) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001354 snd_printdd(SFX "%s: Setting Nvidia snoop: %d\n", pci_name(chip->pci), azx_snoop(chip));
Takashi Iwaicb53c622007-08-10 17:21:45 +02001355 update_pci_byte(chip->pci,
1356 NVIDIA_HDA_TRANSREG_ADDR,
1357 0x0f, NVIDIA_HDA_ENABLE_COHBITS);
Peer Chen320dcc32008-08-20 16:43:24 -07001358 update_pci_byte(chip->pci,
1359 NVIDIA_HDA_ISTRM_COH,
1360 0x01, NVIDIA_HDA_ENABLE_COHBIT);
1361 update_pci_byte(chip->pci,
1362 NVIDIA_HDA_OSTRM_COH,
1363 0x01, NVIDIA_HDA_ENABLE_COHBIT);
Takashi Iwai9477c582011-05-25 09:11:37 +02001364 }
1365
1366 /* Enable SCH/PCH snoop if needed */
1367 if (chip->driver_caps & AZX_DCAPS_SCH_SNOOP) {
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001368 unsigned short snoop;
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001369 pci_read_config_word(chip->pci, INTEL_SCH_HDA_DEVC, &snoop);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001370 if ((!azx_snoop(chip) && !(snoop & INTEL_SCH_HDA_DEVC_NOSNOOP)) ||
1371 (azx_snoop(chip) && (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP))) {
1372 snoop &= ~INTEL_SCH_HDA_DEVC_NOSNOOP;
1373 if (!azx_snoop(chip))
1374 snoop |= INTEL_SCH_HDA_DEVC_NOSNOOP;
1375 pci_write_config_word(chip->pci, INTEL_SCH_HDA_DEVC, snoop);
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001376 pci_read_config_word(chip->pci,
1377 INTEL_SCH_HDA_DEVC, &snoop);
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001378 }
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001379 snd_printdd(SFX "%s: SCH snoop: %s\n",
1380 pci_name(chip->pci), (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP)
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001381 ? "Disabled" : "Enabled");
Vinod Gda3fca22005-09-13 18:49:12 +02001382 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001383}
1384
1385
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001386static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev);
1387
Linus Torvalds1da177e2005-04-16 15:20:36 -07001388/*
1389 * interrupt handler
1390 */
David Howells7d12e782006-10-05 14:55:46 +01001391static irqreturn_t azx_interrupt(int irq, void *dev_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001392{
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001393 struct azx *chip = dev_id;
1394 struct azx_dev *azx_dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001395 u32 status;
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001396 u8 sd_status;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001397 int i, ok;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001398
Mengdong Linb8dfc4622012-08-23 17:32:30 +08001399#ifdef CONFIG_PM_RUNTIME
1400 if (chip->pci->dev.power.runtime_status != RPM_ACTIVE)
1401 return IRQ_NONE;
1402#endif
1403
Linus Torvalds1da177e2005-04-16 15:20:36 -07001404 spin_lock(&chip->reg_lock);
1405
Dan Carpenter60911062012-05-18 10:36:11 +03001406 if (chip->disabled) {
1407 spin_unlock(&chip->reg_lock);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001408 return IRQ_NONE;
Dan Carpenter60911062012-05-18 10:36:11 +03001409 }
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001410
Linus Torvalds1da177e2005-04-16 15:20:36 -07001411 status = azx_readl(chip, INTSTS);
1412 if (status == 0) {
1413 spin_unlock(&chip->reg_lock);
1414 return IRQ_NONE;
1415 }
1416
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001417 for (i = 0; i < chip->num_streams; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001418 azx_dev = &chip->azx_dev[i];
1419 if (status & azx_dev->sd_int_sta_mask) {
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001420 sd_status = azx_sd_readb(azx_dev, SD_STS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001421 azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK);
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001422 if (!azx_dev->substream || !azx_dev->running ||
1423 !(sd_status & SD_INT_COMPLETE))
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001424 continue;
1425 /* check whether this IRQ is really acceptable */
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001426 ok = azx_position_ok(chip, azx_dev);
1427 if (ok == 1) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001428 azx_dev->irq_pending = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001429 spin_unlock(&chip->reg_lock);
1430 snd_pcm_period_elapsed(azx_dev->substream);
1431 spin_lock(&chip->reg_lock);
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001432 } else if (ok == 0 && chip->bus && chip->bus->workq) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001433 /* bogus IRQ, process it later */
1434 azx_dev->irq_pending = 1;
Takashi Iwai6acaed32009-01-12 10:09:24 +01001435 queue_work(chip->bus->workq,
1436 &chip->irq_pending_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001437 }
1438 }
1439 }
1440
1441 /* clear rirb int */
1442 status = azx_readb(chip, RIRBSTS);
1443 if (status & RIRB_INT_MASK) {
Takashi Iwai14d34f12010-10-21 09:03:25 +02001444 if (status & RIRB_INT_RESPONSE) {
Takashi Iwai9477c582011-05-25 09:11:37 +02001445 if (chip->driver_caps & AZX_DCAPS_RIRB_PRE_DELAY)
Takashi Iwai14d34f12010-10-21 09:03:25 +02001446 udelay(80);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001447 azx_update_rirb(chip);
Takashi Iwai14d34f12010-10-21 09:03:25 +02001448 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001449 azx_writeb(chip, RIRBSTS, RIRB_INT_MASK);
1450 }
1451
1452#if 0
1453 /* clear state status int */
Wang Xingchaoda7db6a2013-07-22 03:19:18 -04001454 if (azx_readw(chip, STATESTS) & 0x04)
1455 azx_writew(chip, STATESTS, 0x04);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001456#endif
1457 spin_unlock(&chip->reg_lock);
1458
1459 return IRQ_HANDLED;
1460}
1461
1462
1463/*
Takashi Iwai675f25d2008-06-10 17:53:20 +02001464 * set up a BDL entry
1465 */
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001466static int setup_bdle(struct azx *chip,
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001467 struct snd_dma_buffer *dmab,
Takashi Iwai675f25d2008-06-10 17:53:20 +02001468 struct azx_dev *azx_dev, u32 **bdlp,
1469 int ofs, int size, int with_ioc)
1470{
Takashi Iwai675f25d2008-06-10 17:53:20 +02001471 u32 *bdl = *bdlp;
1472
1473 while (size > 0) {
1474 dma_addr_t addr;
1475 int chunk;
1476
1477 if (azx_dev->frags >= AZX_MAX_BDL_ENTRIES)
1478 return -EINVAL;
1479
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001480 addr = snd_sgbuf_get_addr(dmab, ofs);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001481 /* program the address field of the BDL entry */
1482 bdl[0] = cpu_to_le32((u32)addr);
Takashi Iwai766979e2008-06-13 20:53:56 +02001483 bdl[1] = cpu_to_le32(upper_32_bits(addr));
Takashi Iwai675f25d2008-06-10 17:53:20 +02001484 /* program the size field of the BDL entry */
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001485 chunk = snd_sgbuf_get_chunk_size(dmab, ofs, size);
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001486 /* one BDLE cannot cross 4K boundary on CTHDA chips */
1487 if (chip->driver_caps & AZX_DCAPS_4K_BDLE_BOUNDARY) {
1488 u32 remain = 0x1000 - (ofs & 0xfff);
1489 if (chunk > remain)
1490 chunk = remain;
1491 }
Takashi Iwai675f25d2008-06-10 17:53:20 +02001492 bdl[2] = cpu_to_le32(chunk);
1493 /* program the IOC to enable interrupt
1494 * only when the whole fragment is processed
1495 */
1496 size -= chunk;
1497 bdl[3] = (size || !with_ioc) ? 0 : cpu_to_le32(0x01);
1498 bdl += 4;
1499 azx_dev->frags++;
1500 ofs += chunk;
1501 }
1502 *bdlp = bdl;
1503 return ofs;
1504}
1505
1506/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001507 * set up BDL entries
1508 */
Takashi Iwai555e2192008-06-10 17:53:34 +02001509static int azx_setup_periods(struct azx *chip,
1510 struct snd_pcm_substream *substream,
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001511 struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001512{
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001513 u32 *bdl;
1514 int i, ofs, periods, period_bytes;
Takashi Iwai555e2192008-06-10 17:53:34 +02001515 int pos_adj;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001516
1517 /* reset BDL address */
1518 azx_sd_writel(azx_dev, SD_BDLPL, 0);
1519 azx_sd_writel(azx_dev, SD_BDLPU, 0);
1520
Takashi Iwai97b71c92009-03-18 15:09:13 +01001521 period_bytes = azx_dev->period_bytes;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001522 periods = azx_dev->bufsize / period_bytes;
1523
Linus Torvalds1da177e2005-04-16 15:20:36 -07001524 /* program the initial BDL entries */
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001525 bdl = (u32 *)azx_dev->bdl.area;
1526 ofs = 0;
1527 azx_dev->frags = 0;
Takashi Iwai555e2192008-06-10 17:53:34 +02001528 pos_adj = bdl_pos_adj[chip->dev_index];
Takashi Iwai915bf292012-09-11 15:19:10 +02001529 if (!azx_dev->no_period_wakeup && pos_adj > 0) {
Takashi Iwai675f25d2008-06-10 17:53:20 +02001530 struct snd_pcm_runtime *runtime = substream->runtime;
Takashi Iwaie785d3d2008-07-15 16:28:43 +02001531 int pos_align = pos_adj;
Takashi Iwai555e2192008-06-10 17:53:34 +02001532 pos_adj = (pos_adj * runtime->rate + 47999) / 48000;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001533 if (!pos_adj)
Takashi Iwaie785d3d2008-07-15 16:28:43 +02001534 pos_adj = pos_align;
1535 else
1536 pos_adj = ((pos_adj + pos_align - 1) / pos_align) *
1537 pos_align;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001538 pos_adj = frames_to_bytes(runtime, pos_adj);
1539 if (pos_adj >= period_bytes) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001540 snd_printk(KERN_WARNING SFX "%s: Too big adjustment %d\n",
1541 pci_name(chip->pci), bdl_pos_adj[chip->dev_index]);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001542 pos_adj = 0;
1543 } else {
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001544 ofs = setup_bdle(chip, snd_pcm_get_dma_buf(substream),
1545 azx_dev,
Takashi Iwai915bf292012-09-11 15:19:10 +02001546 &bdl, ofs, pos_adj, true);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001547 if (ofs < 0)
1548 goto error;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001549 }
Takashi Iwai555e2192008-06-10 17:53:34 +02001550 } else
1551 pos_adj = 0;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001552 for (i = 0; i < periods; i++) {
1553 if (i == periods - 1 && pos_adj)
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001554 ofs = setup_bdle(chip, snd_pcm_get_dma_buf(substream),
1555 azx_dev, &bdl, ofs,
Takashi Iwai675f25d2008-06-10 17:53:20 +02001556 period_bytes - pos_adj, 0);
1557 else
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001558 ofs = setup_bdle(chip, snd_pcm_get_dma_buf(substream),
1559 azx_dev, &bdl, ofs,
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001560 period_bytes,
Takashi Iwai915bf292012-09-11 15:19:10 +02001561 !azx_dev->no_period_wakeup);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001562 if (ofs < 0)
1563 goto error;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001564 }
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001565 return 0;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001566
1567 error:
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001568 snd_printk(KERN_ERR SFX "%s: Too many BDL entries: buffer=%d, period=%d\n",
1569 pci_name(chip->pci), azx_dev->bufsize, period_bytes);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001570 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001571}
1572
Takashi Iwai1dddab42009-03-18 15:15:37 +01001573/* reset stream */
1574static void azx_stream_reset(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001575{
1576 unsigned char val;
1577 int timeout;
1578
Takashi Iwai1dddab42009-03-18 15:15:37 +01001579 azx_stream_clear(chip, azx_dev);
1580
Takashi Iwaid01ce992007-07-27 16:52:19 +02001581 azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) |
1582 SD_CTL_STREAM_RESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001583 udelay(3);
1584 timeout = 300;
1585 while (!((val = azx_sd_readb(azx_dev, SD_CTL)) & SD_CTL_STREAM_RESET) &&
1586 --timeout)
1587 ;
1588 val &= ~SD_CTL_STREAM_RESET;
1589 azx_sd_writeb(azx_dev, SD_CTL, val);
1590 udelay(3);
1591
1592 timeout = 300;
1593 /* waiting for hardware to report that the stream is out of reset */
1594 while (((val = azx_sd_readb(azx_dev, SD_CTL)) & SD_CTL_STREAM_RESET) &&
1595 --timeout)
1596 ;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001597
1598 /* reset first position - may not be synced with hw at this time */
1599 *azx_dev->posbuf = 0;
Takashi Iwai1dddab42009-03-18 15:15:37 +01001600}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001601
Takashi Iwai1dddab42009-03-18 15:15:37 +01001602/*
1603 * set up the SD for streaming
1604 */
1605static int azx_setup_controller(struct azx *chip, struct azx_dev *azx_dev)
1606{
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001607 unsigned int val;
Takashi Iwai1dddab42009-03-18 15:15:37 +01001608 /* make sure the run bit is zero for SD */
1609 azx_stream_clear(chip, azx_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001610 /* program the stream_tag */
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001611 val = azx_sd_readl(azx_dev, SD_CTL);
1612 val = (val & ~SD_CTL_STREAM_TAG_MASK) |
1613 (azx_dev->stream_tag << SD_CTL_STREAM_TAG_SHIFT);
1614 if (!azx_snoop(chip))
1615 val |= SD_CTL_TRAFFIC_PRIO;
1616 azx_sd_writel(azx_dev, SD_CTL, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001617
1618 /* program the length of samples in cyclic buffer */
1619 azx_sd_writel(azx_dev, SD_CBL, azx_dev->bufsize);
1620
1621 /* program the stream format */
1622 /* this value needs to be the same as the one programmed */
1623 azx_sd_writew(azx_dev, SD_FORMAT, azx_dev->format_val);
1624
1625 /* program the stream LVI (last valid index) of the BDL */
1626 azx_sd_writew(azx_dev, SD_LVI, azx_dev->frags - 1);
1627
1628 /* program the BDL address */
1629 /* lower BDL address */
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001630 azx_sd_writel(azx_dev, SD_BDLPL, (u32)azx_dev->bdl.addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001631 /* upper BDL address */
Takashi Iwai766979e2008-06-13 20:53:56 +02001632 azx_sd_writel(azx_dev, SD_BDLPU, upper_32_bits(azx_dev->bdl.addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001633
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02001634 /* enable the position buffer */
David Henningsson4cb36312010-09-30 10:12:50 +02001635 if (chip->position_fix[0] != POS_FIX_LPIB ||
1636 chip->position_fix[1] != POS_FIX_LPIB) {
Takashi Iwaiee9d6b92008-03-14 15:52:20 +01001637 if (!(azx_readl(chip, DPLBASE) & ICH6_DPLBASE_ENABLE))
1638 azx_writel(chip, DPLBASE,
1639 (u32)chip->posbuf.addr | ICH6_DPLBASE_ENABLE);
1640 }
Takashi Iwaic74db862005-05-12 14:26:27 +02001641
Linus Torvalds1da177e2005-04-16 15:20:36 -07001642 /* set the interrupt enable bits in the descriptor control register */
Takashi Iwaid01ce992007-07-27 16:52:19 +02001643 azx_sd_writel(azx_dev, SD_CTL,
1644 azx_sd_readl(azx_dev, SD_CTL) | SD_INT_MASK);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001645
1646 return 0;
1647}
1648
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001649/*
1650 * Probe the given codec address
1651 */
1652static int probe_codec(struct azx *chip, int addr)
1653{
1654 unsigned int cmd = (addr << 28) | (AC_NODE_ROOT << 20) |
1655 (AC_VERB_PARAMETERS << 8) | AC_PAR_VENDOR_ID;
1656 unsigned int res;
1657
Wu Fengguanga678cde2009-08-01 18:46:46 +08001658 mutex_lock(&chip->bus->cmd_mutex);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001659 chip->probing = 1;
1660 azx_send_cmd(chip->bus, cmd);
Wu Fengguangdeadff12009-08-01 18:45:16 +08001661 res = azx_get_response(chip->bus, addr);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001662 chip->probing = 0;
Wu Fengguanga678cde2009-08-01 18:46:46 +08001663 mutex_unlock(&chip->bus->cmd_mutex);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001664 if (res == -1)
1665 return -EIO;
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001666 snd_printdd(SFX "%s: codec #%d probed OK\n", pci_name(chip->pci), addr);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001667 return 0;
1668}
1669
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001670static int azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec,
1671 struct hda_pcm *cpcm);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001672static void azx_stop_chip(struct azx *chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001673
Takashi Iwai8dd78332009-06-02 01:16:07 +02001674static void azx_bus_reset(struct hda_bus *bus)
1675{
1676 struct azx *chip = bus->private_data;
Takashi Iwai8dd78332009-06-02 01:16:07 +02001677
1678 bus->in_reset = 1;
1679 azx_stop_chip(chip);
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001680 azx_init_chip(chip, 1);
Alexander Beregalov65f75982009-06-04 13:46:16 +04001681#ifdef CONFIG_PM
Takashi Iwai8dd78332009-06-02 01:16:07 +02001682 if (chip->initialized) {
Takashi Iwai01b65bf2011-11-24 14:31:46 +01001683 struct azx_pcm *p;
1684 list_for_each_entry(p, &chip->pcm_list, list)
1685 snd_pcm_suspend_all(p->pcm);
Takashi Iwai8dd78332009-06-02 01:16:07 +02001686 snd_hda_suspend(chip->bus);
1687 snd_hda_resume(chip->bus);
1688 }
Alexander Beregalov65f75982009-06-04 13:46:16 +04001689#endif
Takashi Iwai8dd78332009-06-02 01:16:07 +02001690 bus->in_reset = 0;
1691}
1692
David Henningsson26a6cb62012-10-09 15:04:21 +02001693static int get_jackpoll_interval(struct azx *chip)
1694{
1695 int i = jackpoll_ms[chip->dev_index];
1696 unsigned int j;
1697 if (i == 0)
1698 return 0;
1699 if (i < 50 || i > 60000)
1700 j = 0;
1701 else
1702 j = msecs_to_jiffies(i);
1703 if (j == 0)
1704 snd_printk(KERN_WARNING SFX
1705 "jackpoll_ms value out of range: %d\n", i);
1706 return j;
1707}
1708
Linus Torvalds1da177e2005-04-16 15:20:36 -07001709/*
1710 * Codec initialization
1711 */
1712
Takashi Iwai2f5983f2008-09-03 16:00:44 +02001713/* number of codec slots for each chipset: 0 = default slots (i.e. 4) */
Takashi Iwai48c8b0e2012-12-07 07:40:35 +01001714static unsigned int azx_max_codecs[AZX_NUM_DRIVERS] = {
Wei Ni7445dfc2010-03-03 15:05:53 +08001715 [AZX_DRIVER_NVIDIA] = 8,
Kailang Yangf2690022008-05-27 11:44:55 +02001716 [AZX_DRIVER_TERA] = 1,
Takashi Iwaia9995a32007-03-12 21:30:46 +01001717};
1718
Takashi Iwai48c8b0e2012-12-07 07:40:35 +01001719static int azx_codec_create(struct azx *chip, const char *model)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001720{
1721 struct hda_bus_template bus_temp;
Takashi Iwai34c25352008-10-28 11:38:58 +01001722 int c, codecs, err;
1723 int max_slots;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001724
1725 memset(&bus_temp, 0, sizeof(bus_temp));
1726 bus_temp.private_data = chip;
1727 bus_temp.modelname = model;
1728 bus_temp.pci = chip->pci;
Takashi Iwai111d3af2006-02-16 18:17:58 +01001729 bus_temp.ops.command = azx_send_cmd;
1730 bus_temp.ops.get_response = azx_get_response;
Takashi Iwai176d5332008-07-30 15:01:44 +02001731 bus_temp.ops.attach_pcm = azx_attach_pcm_stream;
Takashi Iwai8dd78332009-06-02 01:16:07 +02001732 bus_temp.ops.bus_reset = azx_bus_reset;
Takashi Iwai83012a72012-08-24 18:38:08 +02001733#ifdef CONFIG_PM
Takashi Iwai11cd41b2008-11-28 07:22:18 +01001734 bus_temp.power_save = &power_save;
Takashi Iwaicb53c622007-08-10 17:21:45 +02001735 bus_temp.ops.pm_notify = azx_power_notify;
1736#endif
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001737#ifdef CONFIG_SND_HDA_DSP_LOADER
1738 bus_temp.ops.load_dsp_prepare = azx_load_dsp_prepare;
1739 bus_temp.ops.load_dsp_trigger = azx_load_dsp_trigger;
1740 bus_temp.ops.load_dsp_cleanup = azx_load_dsp_cleanup;
1741#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07001742
Takashi Iwaid01ce992007-07-27 16:52:19 +02001743 err = snd_hda_bus_new(chip->card, &bus_temp, &chip->bus);
1744 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001745 return err;
1746
Takashi Iwai9477c582011-05-25 09:11:37 +02001747 if (chip->driver_caps & AZX_DCAPS_RIRB_DELAY) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001748 snd_printd(SFX "%s: Enable delay in RIRB handling\n", pci_name(chip->pci));
Wei Nidc9c8e22008-09-26 13:55:56 +08001749 chip->bus->needs_damn_long_delay = 1;
Takashi Iwai9477c582011-05-25 09:11:37 +02001750 }
Wei Nidc9c8e22008-09-26 13:55:56 +08001751
Takashi Iwai34c25352008-10-28 11:38:58 +01001752 codecs = 0;
Takashi Iwai2f5983f2008-09-03 16:00:44 +02001753 max_slots = azx_max_codecs[chip->driver_type];
1754 if (!max_slots)
Wei Ni7445dfc2010-03-03 15:05:53 +08001755 max_slots = AZX_DEFAULT_CODECS;
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001756
1757 /* First try to probe all given codec slots */
1758 for (c = 0; c < max_slots; c++) {
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01001759 if ((chip->codec_mask & (1 << c)) & chip->codec_probe_mask) {
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001760 if (probe_codec(chip, c) < 0) {
1761 /* Some BIOSen give you wrong codec addresses
1762 * that don't exist
1763 */
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001764 snd_printk(KERN_WARNING SFX
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001765 "%s: Codec #%d probe error; "
1766 "disabling it...\n", pci_name(chip->pci), c);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001767 chip->codec_mask &= ~(1 << c);
1768 /* More badly, accessing to a non-existing
1769 * codec often screws up the controller chip,
Paul Menzel24481582010-02-08 20:37:26 +01001770 * and disturbs the further communications.
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001771 * Thus if an error occurs during probing,
1772 * better to reset the controller chip to
1773 * get back to the sanity state.
1774 */
1775 azx_stop_chip(chip);
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001776 azx_init_chip(chip, 1);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001777 }
1778 }
1779 }
1780
Takashi Iwaid507cd62011-04-26 15:25:02 +02001781 /* AMD chipsets often cause the communication stalls upon certain
1782 * sequence like the pin-detection. It seems that forcing the synced
1783 * access works around the stall. Grrr...
1784 */
Takashi Iwai9477c582011-05-25 09:11:37 +02001785 if (chip->driver_caps & AZX_DCAPS_SYNC_WRITE) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001786 snd_printd(SFX "%s: Enable sync_write for stable communication\n",
1787 pci_name(chip->pci));
Takashi Iwaid507cd62011-04-26 15:25:02 +02001788 chip->bus->sync_write = 1;
1789 chip->bus->allow_bus_reset = 1;
1790 }
1791
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001792 /* Then create codec instances */
Takashi Iwai34c25352008-10-28 11:38:58 +01001793 for (c = 0; c < max_slots; c++) {
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01001794 if ((chip->codec_mask & (1 << c)) & chip->codec_probe_mask) {
Takashi Iwaibccad142007-04-24 12:23:53 +02001795 struct hda_codec *codec;
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001796 err = snd_hda_codec_new(chip->bus, c, &codec);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001797 if (err < 0)
1798 continue;
David Henningsson26a6cb62012-10-09 15:04:21 +02001799 codec->jackpoll_interval = get_jackpoll_interval(chip);
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +01001800 codec->beep_mode = chip->beep_mode;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001801 codecs++;
Takashi Iwai19a982b2007-03-21 15:14:35 +01001802 }
1803 }
1804 if (!codecs) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001805 snd_printk(KERN_ERR SFX "%s: no codecs initialized\n", pci_name(chip->pci));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001806 return -ENXIO;
1807 }
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001808 return 0;
1809}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001810
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001811/* configure each codec instance */
Bill Pembertone23e7a12012-12-06 12:35:10 -05001812static int azx_codec_configure(struct azx *chip)
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001813{
1814 struct hda_codec *codec;
1815 list_for_each_entry(codec, &chip->bus->codec_list, list) {
1816 snd_hda_codec_configure(codec);
1817 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001818 return 0;
1819}
1820
1821
1822/*
1823 * PCM support
1824 */
1825
1826/* assign a stream for the PCM */
Wu Fengguangef18bed2009-12-25 13:14:27 +08001827static inline struct azx_dev *
1828azx_assign_device(struct azx *chip, struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001829{
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001830 int dev, i, nums;
Wu Fengguangef18bed2009-12-25 13:14:27 +08001831 struct azx_dev *res = NULL;
Takashi Iwaid5cf9912011-10-06 10:07:58 +02001832 /* make a non-zero unique key for the substream */
1833 int key = (substream->pcm->device << 16) | (substream->number << 2) |
1834 (substream->stream + 1);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001835
1836 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001837 dev = chip->playback_index_offset;
1838 nums = chip->playback_streams;
1839 } else {
1840 dev = chip->capture_index_offset;
1841 nums = chip->capture_streams;
1842 }
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001843 for (i = 0; i < nums; i++, dev++) {
1844 struct azx_dev *azx_dev = &chip->azx_dev[dev];
1845 dsp_lock(azx_dev);
1846 if (!azx_dev->opened && !dsp_is_locked(azx_dev)) {
1847 res = azx_dev;
1848 if (res->assigned_key == key) {
1849 res->opened = 1;
1850 res->assigned_key = key;
1851 dsp_unlock(azx_dev);
1852 return azx_dev;
1853 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001854 }
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001855 dsp_unlock(azx_dev);
1856 }
Wu Fengguangef18bed2009-12-25 13:14:27 +08001857 if (res) {
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001858 dsp_lock(res);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001859 res->opened = 1;
Takashi Iwaid5cf9912011-10-06 10:07:58 +02001860 res->assigned_key = key;
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001861 dsp_unlock(res);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001862 }
1863 return res;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001864}
1865
1866/* release the assigned stream */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001867static inline void azx_release_device(struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001868{
1869 azx_dev->opened = 0;
1870}
1871
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001872static cycle_t azx_cc_read(const struct cyclecounter *cc)
1873{
1874 struct azx_dev *azx_dev = container_of(cc, struct azx_dev, azx_cc);
1875 struct snd_pcm_substream *substream = azx_dev->substream;
1876 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1877 struct azx *chip = apcm->chip;
1878
1879 return azx_readl(chip, WALLCLK);
1880}
1881
1882static void azx_timecounter_init(struct snd_pcm_substream *substream,
1883 bool force, cycle_t last)
1884{
1885 struct azx_dev *azx_dev = get_azx_dev(substream);
1886 struct timecounter *tc = &azx_dev->azx_tc;
1887 struct cyclecounter *cc = &azx_dev->azx_cc;
1888 u64 nsec;
1889
1890 cc->read = azx_cc_read;
1891 cc->mask = CLOCKSOURCE_MASK(32);
1892
1893 /*
1894 * Converting from 24 MHz to ns means applying a 125/3 factor.
1895 * To avoid any saturation issues in intermediate operations,
1896 * the 125 factor is applied first. The division is applied
1897 * last after reading the timecounter value.
1898 * Applying the 1/3 factor as part of the multiplication
1899 * requires at least 20 bits for a decent precision, however
1900 * overflows occur after about 4 hours or less, not a option.
1901 */
1902
1903 cc->mult = 125; /* saturation after 195 years */
1904 cc->shift = 0;
1905
1906 nsec = 0; /* audio time is elapsed time since trigger */
1907 timecounter_init(tc, cc, nsec);
1908 if (force)
1909 /*
1910 * force timecounter to use predefined value,
1911 * used for synchronized starts
1912 */
1913 tc->cycle_last = last;
1914}
1915
Dylan Reidae03bbb2013-04-15 11:57:05 -07001916static u64 azx_adjust_codec_delay(struct snd_pcm_substream *substream,
Dylan Reid78daea22013-04-08 18:20:30 -07001917 u64 nsec)
1918{
1919 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1920 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
1921 u64 codec_frames, codec_nsecs;
1922
1923 if (!hinfo->ops.get_delay)
1924 return nsec;
1925
1926 codec_frames = hinfo->ops.get_delay(hinfo, apcm->codec, substream);
1927 codec_nsecs = div_u64(codec_frames * 1000000000LL,
1928 substream->runtime->rate);
1929
Dylan Reidae03bbb2013-04-15 11:57:05 -07001930 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
1931 return nsec + codec_nsecs;
1932
Dylan Reid78daea22013-04-08 18:20:30 -07001933 return (nsec > codec_nsecs) ? nsec - codec_nsecs : 0;
1934}
1935
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001936static int azx_get_wallclock_tstamp(struct snd_pcm_substream *substream,
1937 struct timespec *ts)
1938{
1939 struct azx_dev *azx_dev = get_azx_dev(substream);
1940 u64 nsec;
1941
1942 nsec = timecounter_read(&azx_dev->azx_tc);
1943 nsec = div_u64(nsec, 3); /* can be optimized */
Dylan Reidae03bbb2013-04-15 11:57:05 -07001944 nsec = azx_adjust_codec_delay(substream, nsec);
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001945
1946 *ts = ns_to_timespec(nsec);
1947
1948 return 0;
1949}
1950
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001951static struct snd_pcm_hardware azx_pcm_hw = {
Takashi Iwaid01ce992007-07-27 16:52:19 +02001952 .info = (SNDRV_PCM_INFO_MMAP |
1953 SNDRV_PCM_INFO_INTERLEAVED |
Linus Torvalds1da177e2005-04-16 15:20:36 -07001954 SNDRV_PCM_INFO_BLOCK_TRANSFER |
1955 SNDRV_PCM_INFO_MMAP_VALID |
Pavel Machek927fc862006-08-31 17:03:43 +02001956 /* No full-resume yet implemented */
1957 /* SNDRV_PCM_INFO_RESUME |*/
Takashi Iwai850f0e52008-03-18 17:11:05 +01001958 SNDRV_PCM_INFO_PAUSE |
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001959 SNDRV_PCM_INFO_SYNC_START |
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001960 SNDRV_PCM_INFO_HAS_WALL_CLOCK |
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001961 SNDRV_PCM_INFO_NO_PERIOD_WAKEUP),
Linus Torvalds1da177e2005-04-16 15:20:36 -07001962 .formats = SNDRV_PCM_FMTBIT_S16_LE,
1963 .rates = SNDRV_PCM_RATE_48000,
1964 .rate_min = 48000,
1965 .rate_max = 48000,
1966 .channels_min = 2,
1967 .channels_max = 2,
1968 .buffer_bytes_max = AZX_MAX_BUF_SIZE,
1969 .period_bytes_min = 128,
1970 .period_bytes_max = AZX_MAX_BUF_SIZE / 2,
1971 .periods_min = 2,
1972 .periods_max = AZX_MAX_FRAG,
1973 .fifo_size = 0,
1974};
1975
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001976static int azx_pcm_open(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001977{
1978 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1979 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001980 struct azx *chip = apcm->chip;
1981 struct azx_dev *azx_dev;
1982 struct snd_pcm_runtime *runtime = substream->runtime;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001983 unsigned long flags;
1984 int err;
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001985 int buff_step;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001986
Ingo Molnar62932df2006-01-16 16:34:20 +01001987 mutex_lock(&chip->open_mutex);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001988 azx_dev = azx_assign_device(chip, substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001989 if (azx_dev == NULL) {
Ingo Molnar62932df2006-01-16 16:34:20 +01001990 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001991 return -EBUSY;
1992 }
1993 runtime->hw = azx_pcm_hw;
1994 runtime->hw.channels_min = hinfo->channels_min;
1995 runtime->hw.channels_max = hinfo->channels_max;
1996 runtime->hw.formats = hinfo->formats;
1997 runtime->hw.rates = hinfo->rates;
1998 snd_pcm_limit_hw_rates(runtime);
1999 snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05002000
2001 /* avoid wrap-around with wall-clock */
2002 snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_TIME,
2003 20,
2004 178000000);
2005
Takashi Iwai52409aa2012-01-23 17:10:24 +01002006 if (chip->align_buffer_size)
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05002007 /* constrain buffer sizes to be multiple of 128
2008 bytes. This is more efficient in terms of memory
2009 access but isn't required by the HDA spec and
2010 prevents users from specifying exact period/buffer
2011 sizes. For example for 44.1kHz, a period size set
2012 to 20ms will be rounded to 19.59ms. */
2013 buff_step = 128;
2014 else
2015 /* Don't enforce steps on buffer sizes, still need to
2016 be multiple of 4 bytes (HDA spec). Tested on Intel
2017 HDA controllers, may not work on all devices where
2018 option needs to be disabled */
2019 buff_step = 4;
2020
Joachim Deguara5f1545b2007-03-16 15:01:36 +01002021 snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05002022 buff_step);
Joachim Deguara5f1545b2007-03-16 15:01:36 +01002023 snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05002024 buff_step);
Dylan Reidb4a91cf2012-06-15 19:36:23 -07002025 snd_hda_power_up_d3wait(apcm->codec);
Takashi Iwaid01ce992007-07-27 16:52:19 +02002026 err = hinfo->ops.open(hinfo, apcm->codec, substream);
2027 if (err < 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002028 azx_release_device(azx_dev);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002029 snd_hda_power_down(apcm->codec);
Ingo Molnar62932df2006-01-16 16:34:20 +01002030 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002031 return err;
2032 }
Takashi Iwai70d321e2009-07-03 23:06:45 +02002033 snd_pcm_limit_hw_rates(runtime);
Takashi Iwaiaba66532009-07-05 11:44:46 +02002034 /* sanity check */
2035 if (snd_BUG_ON(!runtime->hw.channels_min) ||
2036 snd_BUG_ON(!runtime->hw.channels_max) ||
2037 snd_BUG_ON(!runtime->hw.formats) ||
2038 snd_BUG_ON(!runtime->hw.rates)) {
2039 azx_release_device(azx_dev);
2040 hinfo->ops.close(hinfo, apcm->codec, substream);
2041 snd_hda_power_down(apcm->codec);
2042 mutex_unlock(&chip->open_mutex);
2043 return -EINVAL;
2044 }
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05002045
2046 /* disable WALLCLOCK timestamps for capture streams
2047 until we figure out how to handle digital inputs */
2048 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
2049 runtime->hw.info &= ~SNDRV_PCM_INFO_HAS_WALL_CLOCK;
2050
Linus Torvalds1da177e2005-04-16 15:20:36 -07002051 spin_lock_irqsave(&chip->reg_lock, flags);
2052 azx_dev->substream = substream;
2053 azx_dev->running = 0;
2054 spin_unlock_irqrestore(&chip->reg_lock, flags);
2055
2056 runtime->private_data = azx_dev;
Takashi Iwai850f0e52008-03-18 17:11:05 +01002057 snd_pcm_set_sync(substream);
Ingo Molnar62932df2006-01-16 16:34:20 +01002058 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002059 return 0;
2060}
2061
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002062static int azx_pcm_close(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002063{
2064 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2065 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002066 struct azx *chip = apcm->chip;
2067 struct azx_dev *azx_dev = get_azx_dev(substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002068 unsigned long flags;
2069
Ingo Molnar62932df2006-01-16 16:34:20 +01002070 mutex_lock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002071 spin_lock_irqsave(&chip->reg_lock, flags);
2072 azx_dev->substream = NULL;
2073 azx_dev->running = 0;
2074 spin_unlock_irqrestore(&chip->reg_lock, flags);
2075 azx_release_device(azx_dev);
2076 hinfo->ops.close(hinfo, apcm->codec, substream);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002077 snd_hda_power_down(apcm->codec);
Ingo Molnar62932df2006-01-16 16:34:20 +01002078 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002079 return 0;
2080}
2081
Takashi Iwaid01ce992007-07-27 16:52:19 +02002082static int azx_pcm_hw_params(struct snd_pcm_substream *substream,
2083 struct snd_pcm_hw_params *hw_params)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002084{
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002085 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2086 struct azx *chip = apcm->chip;
Takashi Iwai97b71c92009-03-18 15:09:13 +01002087 struct azx_dev *azx_dev = get_azx_dev(substream);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002088 int ret;
Takashi Iwai97b71c92009-03-18 15:09:13 +01002089
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002090 dsp_lock(azx_dev);
2091 if (dsp_is_locked(azx_dev)) {
2092 ret = -EBUSY;
2093 goto unlock;
2094 }
2095
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +01002096 mark_runtime_wc(chip, azx_dev, substream, false);
Takashi Iwai97b71c92009-03-18 15:09:13 +01002097 azx_dev->bufsize = 0;
2098 azx_dev->period_bytes = 0;
2099 azx_dev->format_val = 0;
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002100 ret = snd_pcm_lib_malloc_pages(substream,
Takashi Iwaid01ce992007-07-27 16:52:19 +02002101 params_buffer_bytes(hw_params));
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002102 if (ret < 0)
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002103 goto unlock;
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +01002104 mark_runtime_wc(chip, azx_dev, substream, true);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002105 unlock:
2106 dsp_unlock(azx_dev);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002107 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002108}
2109
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002110static int azx_pcm_hw_free(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002111{
2112 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002113 struct azx_dev *azx_dev = get_azx_dev(substream);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002114 struct azx *chip = apcm->chip;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002115 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
2116
2117 /* reset BDL address */
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002118 dsp_lock(azx_dev);
2119 if (!dsp_is_locked(azx_dev)) {
2120 azx_sd_writel(azx_dev, SD_BDLPL, 0);
2121 azx_sd_writel(azx_dev, SD_BDLPU, 0);
2122 azx_sd_writel(azx_dev, SD_CTL, 0);
2123 azx_dev->bufsize = 0;
2124 azx_dev->period_bytes = 0;
2125 azx_dev->format_val = 0;
2126 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002127
Takashi Iwaieb541332010-08-06 13:48:11 +02002128 snd_hda_codec_cleanup(apcm->codec, hinfo, substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002129
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +01002130 mark_runtime_wc(chip, azx_dev, substream, false);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002131 azx_dev->prepared = 0;
2132 dsp_unlock(azx_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002133 return snd_pcm_lib_free_pages(substream);
2134}
2135
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002136static int azx_pcm_prepare(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002137{
2138 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002139 struct azx *chip = apcm->chip;
2140 struct azx_dev *azx_dev = get_azx_dev(substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002141 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002142 struct snd_pcm_runtime *runtime = substream->runtime;
Takashi Iwai62b7e5e2010-10-22 17:15:47 +02002143 unsigned int bufsize, period_bytes, format_val, stream_tag;
Takashi Iwai97b71c92009-03-18 15:09:13 +01002144 int err;
Stephen Warren7c9359762011-06-01 11:14:17 -06002145 struct hda_spdif_out *spdif =
2146 snd_hda_spdif_out_of_nid(apcm->codec, hinfo->nid);
2147 unsigned short ctls = spdif ? spdif->ctls : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002148
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002149 dsp_lock(azx_dev);
2150 if (dsp_is_locked(azx_dev)) {
2151 err = -EBUSY;
2152 goto unlock;
2153 }
2154
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002155 azx_stream_reset(chip, azx_dev);
Takashi Iwai97b71c92009-03-18 15:09:13 +01002156 format_val = snd_hda_calc_stream_format(runtime->rate,
2157 runtime->channels,
2158 runtime->format,
Anssi Hannula32c168c2010-08-03 13:28:57 +03002159 hinfo->maxbps,
Stephen Warren7c9359762011-06-01 11:14:17 -06002160 ctls);
Takashi Iwai97b71c92009-03-18 15:09:13 +01002161 if (!format_val) {
Takashi Iwaid01ce992007-07-27 16:52:19 +02002162 snd_printk(KERN_ERR SFX
Daniel J Blueman445a51b2012-12-05 23:04:21 +08002163 "%s: invalid format_val, rate=%d, ch=%d, format=%d\n",
2164 pci_name(chip->pci), runtime->rate, runtime->channels, runtime->format);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002165 err = -EINVAL;
2166 goto unlock;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002167 }
2168
Takashi Iwai97b71c92009-03-18 15:09:13 +01002169 bufsize = snd_pcm_lib_buffer_bytes(substream);
2170 period_bytes = snd_pcm_lib_period_bytes(substream);
2171
Daniel J Blueman445a51b2012-12-05 23:04:21 +08002172 snd_printdd(SFX "%s: azx_pcm_prepare: bufsize=0x%x, format=0x%x\n",
2173 pci_name(chip->pci), bufsize, format_val);
Takashi Iwai97b71c92009-03-18 15:09:13 +01002174
2175 if (bufsize != azx_dev->bufsize ||
2176 period_bytes != azx_dev->period_bytes ||
Takashi Iwai915bf292012-09-11 15:19:10 +02002177 format_val != azx_dev->format_val ||
2178 runtime->no_period_wakeup != azx_dev->no_period_wakeup) {
Takashi Iwai97b71c92009-03-18 15:09:13 +01002179 azx_dev->bufsize = bufsize;
2180 azx_dev->period_bytes = period_bytes;
2181 azx_dev->format_val = format_val;
Takashi Iwai915bf292012-09-11 15:19:10 +02002182 azx_dev->no_period_wakeup = runtime->no_period_wakeup;
Takashi Iwai97b71c92009-03-18 15:09:13 +01002183 err = azx_setup_periods(chip, substream, azx_dev);
2184 if (err < 0)
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002185 goto unlock;
Takashi Iwai97b71c92009-03-18 15:09:13 +01002186 }
2187
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002188 /* wallclk has 24Mhz clock source */
2189 azx_dev->period_wallclk = (((runtime->period_size * 24000) /
2190 runtime->rate) * 1000);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002191 azx_setup_controller(chip, azx_dev);
2192 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
2193 azx_dev->fifo_size = azx_sd_readw(azx_dev, SD_FIFOSIZE) + 1;
2194 else
2195 azx_dev->fifo_size = 0;
2196
Takashi Iwai62b7e5e2010-10-22 17:15:47 +02002197 stream_tag = azx_dev->stream_tag;
2198 /* CA-IBG chips need the playback stream starting from 1 */
Takashi Iwai9477c582011-05-25 09:11:37 +02002199 if ((chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND) &&
Takashi Iwai62b7e5e2010-10-22 17:15:47 +02002200 stream_tag > chip->capture_streams)
2201 stream_tag -= chip->capture_streams;
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002202 err = snd_hda_codec_prepare(apcm->codec, hinfo, stream_tag,
Takashi Iwaieb541332010-08-06 13:48:11 +02002203 azx_dev->format_val, substream);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002204
2205 unlock:
2206 if (!err)
2207 azx_dev->prepared = 1;
2208 dsp_unlock(azx_dev);
2209 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002210}
2211
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002212static int azx_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002213{
2214 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002215 struct azx *chip = apcm->chip;
Takashi Iwai850f0e52008-03-18 17:11:05 +01002216 struct azx_dev *azx_dev;
2217 struct snd_pcm_substream *s;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002218 int rstart = 0, start, nsync = 0, sbits = 0;
Takashi Iwai850f0e52008-03-18 17:11:05 +01002219 int nwait, timeout;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002220
Takashi Iwai1a8506d2012-10-16 15:10:08 +02002221 azx_dev = get_azx_dev(substream);
2222 trace_azx_pcm_trigger(chip, azx_dev, cmd);
2223
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002224 if (dsp_is_locked(azx_dev) || !azx_dev->prepared)
2225 return -EPIPE;
2226
Linus Torvalds1da177e2005-04-16 15:20:36 -07002227 switch (cmd) {
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002228 case SNDRV_PCM_TRIGGER_START:
2229 rstart = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002230 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
2231 case SNDRV_PCM_TRIGGER_RESUME:
Takashi Iwai850f0e52008-03-18 17:11:05 +01002232 start = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002233 break;
2234 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
Jaroslav Kysela47123192005-08-15 20:53:07 +02002235 case SNDRV_PCM_TRIGGER_SUSPEND:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002236 case SNDRV_PCM_TRIGGER_STOP:
Takashi Iwai850f0e52008-03-18 17:11:05 +01002237 start = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002238 break;
2239 default:
Takashi Iwai850f0e52008-03-18 17:11:05 +01002240 return -EINVAL;
2241 }
2242
2243 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);
2247 sbits |= 1 << azx_dev->index;
2248 nsync++;
2249 snd_pcm_trigger_done(s, substream);
2250 }
2251
2252 spin_lock(&chip->reg_lock);
Pierre-Louis Bossart172d3b22012-09-21 18:39:05 -05002253
2254 /* first, set SYNC bits of corresponding streams */
2255 if (chip->driver_caps & AZX_DCAPS_OLD_SSYNC)
2256 azx_writel(chip, OLD_SSYNC,
2257 azx_readl(chip, OLD_SSYNC) | sbits);
2258 else
2259 azx_writel(chip, SSYNC, azx_readl(chip, SSYNC) | sbits);
2260
Takashi Iwai850f0e52008-03-18 17:11:05 +01002261 snd_pcm_group_for_each_entry(s, substream) {
2262 if (s->pcm->card != substream->pcm->card)
2263 continue;
2264 azx_dev = get_azx_dev(s);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002265 if (start) {
2266 azx_dev->start_wallclk = azx_readl(chip, WALLCLK);
2267 if (!rstart)
2268 azx_dev->start_wallclk -=
2269 azx_dev->period_wallclk;
Takashi Iwai850f0e52008-03-18 17:11:05 +01002270 azx_stream_start(chip, azx_dev);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002271 } else {
Takashi Iwai850f0e52008-03-18 17:11:05 +01002272 azx_stream_stop(chip, azx_dev);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002273 }
Takashi Iwai850f0e52008-03-18 17:11:05 +01002274 azx_dev->running = start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002275 }
2276 spin_unlock(&chip->reg_lock);
Takashi Iwai850f0e52008-03-18 17:11:05 +01002277 if (start) {
Takashi Iwai850f0e52008-03-18 17:11:05 +01002278 /* wait until all FIFOs get ready */
2279 for (timeout = 5000; timeout; timeout--) {
2280 nwait = 0;
2281 snd_pcm_group_for_each_entry(s, substream) {
2282 if (s->pcm->card != substream->pcm->card)
2283 continue;
2284 azx_dev = get_azx_dev(s);
2285 if (!(azx_sd_readb(azx_dev, SD_STS) &
2286 SD_STS_FIFO_READY))
2287 nwait++;
2288 }
2289 if (!nwait)
2290 break;
2291 cpu_relax();
2292 }
2293 } else {
2294 /* wait until all RUN bits are cleared */
2295 for (timeout = 5000; timeout; timeout--) {
2296 nwait = 0;
2297 snd_pcm_group_for_each_entry(s, substream) {
2298 if (s->pcm->card != substream->pcm->card)
2299 continue;
2300 azx_dev = get_azx_dev(s);
2301 if (azx_sd_readb(azx_dev, SD_CTL) &
2302 SD_CTL_DMA_START)
2303 nwait++;
2304 }
2305 if (!nwait)
2306 break;
2307 cpu_relax();
2308 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002309 }
Pierre-Louis Bossart172d3b22012-09-21 18:39:05 -05002310 spin_lock(&chip->reg_lock);
2311 /* reset SYNC bits */
2312 if (chip->driver_caps & AZX_DCAPS_OLD_SSYNC)
2313 azx_writel(chip, OLD_SSYNC,
2314 azx_readl(chip, OLD_SSYNC) & ~sbits);
2315 else
2316 azx_writel(chip, SSYNC, azx_readl(chip, SSYNC) & ~sbits);
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05002317 if (start) {
2318 azx_timecounter_init(substream, 0, 0);
2319 if (nsync > 1) {
2320 cycle_t cycle_last;
2321
2322 /* same start cycle for master and group */
2323 azx_dev = get_azx_dev(substream);
2324 cycle_last = azx_dev->azx_tc.cycle_last;
2325
2326 snd_pcm_group_for_each_entry(s, substream) {
2327 if (s->pcm->card != substream->pcm->card)
2328 continue;
2329 azx_timecounter_init(s, 1, cycle_last);
2330 }
2331 }
2332 }
Pierre-Louis Bossart172d3b22012-09-21 18:39:05 -05002333 spin_unlock(&chip->reg_lock);
Takashi Iwai850f0e52008-03-18 17:11:05 +01002334 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002335}
2336
Joseph Chan0e153472008-08-26 14:38:03 +02002337/* get the current DMA position with correction on VIA chips */
2338static unsigned int azx_via_get_position(struct azx *chip,
2339 struct azx_dev *azx_dev)
2340{
2341 unsigned int link_pos, mini_pos, bound_pos;
2342 unsigned int mod_link_pos, mod_dma_pos, mod_mini_pos;
2343 unsigned int fifo_size;
2344
2345 link_pos = azx_sd_readl(azx_dev, SD_LPIB);
Takashi Iwaib4a655e2011-06-07 12:26:56 +02002346 if (azx_dev->substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
Joseph Chan0e153472008-08-26 14:38:03 +02002347 /* Playback, no problem using link position */
2348 return link_pos;
2349 }
2350
2351 /* Capture */
2352 /* For new chipset,
2353 * use mod to get the DMA position just like old chipset
2354 */
2355 mod_dma_pos = le32_to_cpu(*azx_dev->posbuf);
2356 mod_dma_pos %= azx_dev->period_bytes;
2357
2358 /* azx_dev->fifo_size can't get FIFO size of in stream.
2359 * Get from base address + offset.
2360 */
2361 fifo_size = readw(chip->remap_addr + VIA_IN_STREAM0_FIFO_SIZE_OFFSET);
2362
2363 if (azx_dev->insufficient) {
2364 /* Link position never gather than FIFO size */
2365 if (link_pos <= fifo_size)
2366 return 0;
2367
2368 azx_dev->insufficient = 0;
2369 }
2370
2371 if (link_pos <= fifo_size)
2372 mini_pos = azx_dev->bufsize + link_pos - fifo_size;
2373 else
2374 mini_pos = link_pos - fifo_size;
2375
2376 /* Find nearest previous boudary */
2377 mod_mini_pos = mini_pos % azx_dev->period_bytes;
2378 mod_link_pos = link_pos % azx_dev->period_bytes;
2379 if (mod_link_pos >= fifo_size)
2380 bound_pos = link_pos - mod_link_pos;
2381 else if (mod_dma_pos >= mod_mini_pos)
2382 bound_pos = mini_pos - mod_mini_pos;
2383 else {
2384 bound_pos = mini_pos - mod_mini_pos + azx_dev->period_bytes;
2385 if (bound_pos >= azx_dev->bufsize)
2386 bound_pos = 0;
2387 }
2388
2389 /* Calculate real DMA position we want */
2390 return bound_pos + mod_dma_pos;
2391}
2392
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002393static unsigned int azx_get_position(struct azx *chip,
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002394 struct azx_dev *azx_dev,
2395 bool with_check)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002396{
Takashi Iwai21229612013-04-05 07:27:45 +02002397 struct snd_pcm_substream *substream = azx_dev->substream;
2398 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002399 unsigned int pos;
Takashi Iwai21229612013-04-05 07:27:45 +02002400 int stream = substream->stream;
2401 struct hda_pcm_stream *hinfo = apcm->hinfo[stream];
Takashi Iwai1a8506d2012-10-16 15:10:08 +02002402 int delay = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002403
David Henningsson4cb36312010-09-30 10:12:50 +02002404 switch (chip->position_fix[stream]) {
2405 case POS_FIX_LPIB:
2406 /* read LPIB */
2407 pos = azx_sd_readl(azx_dev, SD_LPIB);
2408 break;
2409 case POS_FIX_VIACOMBO:
Joseph Chan0e153472008-08-26 14:38:03 +02002410 pos = azx_via_get_position(chip, azx_dev);
David Henningsson4cb36312010-09-30 10:12:50 +02002411 break;
2412 default:
2413 /* use the position buffer */
2414 pos = le32_to_cpu(*azx_dev->posbuf);
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002415 if (with_check && chip->position_fix[stream] == POS_FIX_AUTO) {
Takashi Iwaia8103642011-06-07 12:23:23 +02002416 if (!pos || pos == (u32)-1) {
2417 printk(KERN_WARNING
2418 "hda-intel: Invalid position buffer, "
2419 "using LPIB read method instead.\n");
2420 chip->position_fix[stream] = POS_FIX_LPIB;
2421 pos = azx_sd_readl(azx_dev, SD_LPIB);
2422 } else
2423 chip->position_fix[stream] = POS_FIX_POSBUF;
2424 }
2425 break;
Takashi Iwaic74db862005-05-12 14:26:27 +02002426 }
David Henningsson4cb36312010-09-30 10:12:50 +02002427
Linus Torvalds1da177e2005-04-16 15:20:36 -07002428 if (pos >= azx_dev->bufsize)
2429 pos = 0;
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002430
2431 /* calculate runtime delay from LPIB */
Takashi Iwai21229612013-04-05 07:27:45 +02002432 if (substream->runtime &&
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002433 chip->position_fix[stream] == POS_FIX_POSBUF &&
2434 (chip->driver_caps & AZX_DCAPS_COUNT_LPIB_DELAY)) {
2435 unsigned int lpib_pos = azx_sd_readl(azx_dev, SD_LPIB);
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002436 if (stream == SNDRV_PCM_STREAM_PLAYBACK)
2437 delay = pos - lpib_pos;
2438 else
2439 delay = lpib_pos - pos;
2440 if (delay < 0)
2441 delay += azx_dev->bufsize;
2442 if (delay >= azx_dev->period_bytes) {
Takashi Iwai1f046612012-10-16 16:52:26 +02002443 snd_printk(KERN_WARNING SFX
Daniel J Blueman445a51b2012-12-05 23:04:21 +08002444 "%s: Unstable LPIB (%d >= %d); "
Takashi Iwai1f046612012-10-16 16:52:26 +02002445 "disabling LPIB delay counting\n",
Daniel J Blueman445a51b2012-12-05 23:04:21 +08002446 pci_name(chip->pci), delay, azx_dev->period_bytes);
Takashi Iwai1f046612012-10-16 16:52:26 +02002447 delay = 0;
2448 chip->driver_caps &= ~AZX_DCAPS_COUNT_LPIB_DELAY;
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002449 }
Takashi Iwai21229612013-04-05 07:27:45 +02002450 delay = bytes_to_frames(substream->runtime, delay);
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002451 }
Takashi Iwai21229612013-04-05 07:27:45 +02002452
2453 if (substream->runtime) {
2454 if (hinfo->ops.get_delay)
2455 delay += hinfo->ops.get_delay(hinfo, apcm->codec,
2456 substream);
2457 substream->runtime->delay = delay;
2458 }
2459
Takashi Iwai1a8506d2012-10-16 15:10:08 +02002460 trace_azx_get_position(chip, azx_dev, pos, delay);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002461 return pos;
2462}
2463
2464static snd_pcm_uframes_t azx_pcm_pointer(struct snd_pcm_substream *substream)
2465{
2466 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2467 struct azx *chip = apcm->chip;
2468 struct azx_dev *azx_dev = get_azx_dev(substream);
2469 return bytes_to_frames(substream->runtime,
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002470 azx_get_position(chip, azx_dev, false));
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002471}
2472
2473/*
2474 * Check whether the current DMA position is acceptable for updating
2475 * periods. Returns non-zero if it's OK.
2476 *
2477 * Many HD-audio controllers appear pretty inaccurate about
2478 * the update-IRQ timing. The IRQ is issued before actually the
2479 * data is processed. So, we need to process it afterwords in a
2480 * workqueue.
2481 */
2482static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev)
2483{
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002484 u32 wallclk;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002485 unsigned int pos;
2486
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002487 wallclk = azx_readl(chip, WALLCLK) - azx_dev->start_wallclk;
2488 if (wallclk < (azx_dev->period_wallclk * 2) / 3)
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002489 return -1; /* bogus (too early) interrupt */
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002490
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002491 pos = azx_get_position(chip, azx_dev, true);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002492
Takashi Iwaid6d8bf52010-02-12 18:17:06 +01002493 if (WARN_ONCE(!azx_dev->period_bytes,
2494 "hda-intel: zero azx_dev->period_bytes"))
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002495 return -1; /* this shouldn't happen! */
Jaroslav Kyselaedb39932010-06-02 13:29:17 +02002496 if (wallclk < (azx_dev->period_wallclk * 5) / 4 &&
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002497 pos % azx_dev->period_bytes > azx_dev->period_bytes / 2)
2498 /* NG - it's below the first next period boundary */
2499 return bdl_pos_adj[chip->dev_index] ? 0 : -1;
Jaroslav Kyselaedb39932010-06-02 13:29:17 +02002500 azx_dev->start_wallclk += wallclk;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002501 return 1; /* OK, it's fine */
2502}
2503
2504/*
2505 * The work for pending PCM period updates.
2506 */
2507static void azx_irq_pending_work(struct work_struct *work)
2508{
2509 struct azx *chip = container_of(work, struct azx, irq_pending_work);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002510 int i, pending, ok;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002511
Takashi Iwaia6a950a2008-06-10 17:53:35 +02002512 if (!chip->irq_pending_warned) {
2513 printk(KERN_WARNING
2514 "hda-intel: IRQ timing workaround is activated "
2515 "for card #%d. Suggest a bigger bdl_pos_adj.\n",
2516 chip->card->number);
2517 chip->irq_pending_warned = 1;
2518 }
2519
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002520 for (;;) {
2521 pending = 0;
2522 spin_lock_irq(&chip->reg_lock);
2523 for (i = 0; i < chip->num_streams; i++) {
2524 struct azx_dev *azx_dev = &chip->azx_dev[i];
2525 if (!azx_dev->irq_pending ||
2526 !azx_dev->substream ||
2527 !azx_dev->running)
2528 continue;
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002529 ok = azx_position_ok(chip, azx_dev);
2530 if (ok > 0) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002531 azx_dev->irq_pending = 0;
2532 spin_unlock(&chip->reg_lock);
2533 snd_pcm_period_elapsed(azx_dev->substream);
2534 spin_lock(&chip->reg_lock);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002535 } else if (ok < 0) {
2536 pending = 0; /* too early */
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002537 } else
2538 pending++;
2539 }
2540 spin_unlock_irq(&chip->reg_lock);
2541 if (!pending)
2542 return;
Takashi Iwai08af4952010-08-03 14:39:04 +02002543 msleep(1);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002544 }
2545}
2546
2547/* clear irq_pending flags and assure no on-going workq */
2548static void azx_clear_irq_pending(struct azx *chip)
2549{
2550 int i;
2551
2552 spin_lock_irq(&chip->reg_lock);
2553 for (i = 0; i < chip->num_streams; i++)
2554 chip->azx_dev[i].irq_pending = 0;
2555 spin_unlock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002556}
2557
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002558#ifdef CONFIG_X86
2559static int azx_pcm_mmap(struct snd_pcm_substream *substream,
2560 struct vm_area_struct *area)
2561{
2562 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2563 struct azx *chip = apcm->chip;
2564 if (!azx_snoop(chip))
2565 area->vm_page_prot = pgprot_writecombine(area->vm_page_prot);
2566 return snd_pcm_lib_default_mmap(substream, area);
2567}
2568#else
2569#define azx_pcm_mmap NULL
2570#endif
2571
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002572static struct snd_pcm_ops azx_pcm_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002573 .open = azx_pcm_open,
2574 .close = azx_pcm_close,
2575 .ioctl = snd_pcm_lib_ioctl,
2576 .hw_params = azx_pcm_hw_params,
2577 .hw_free = azx_pcm_hw_free,
2578 .prepare = azx_pcm_prepare,
2579 .trigger = azx_pcm_trigger,
2580 .pointer = azx_pcm_pointer,
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05002581 .wall_clock = azx_get_wallclock_tstamp,
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002582 .mmap = azx_pcm_mmap,
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002583 .page = snd_pcm_sgbuf_ops_page,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002584};
2585
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002586static void azx_pcm_free(struct snd_pcm *pcm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002587{
Takashi Iwai176d5332008-07-30 15:01:44 +02002588 struct azx_pcm *apcm = pcm->private_data;
2589 if (apcm) {
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002590 list_del(&apcm->list);
Takashi Iwai176d5332008-07-30 15:01:44 +02002591 kfree(apcm);
2592 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002593}
2594
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002595#define MAX_PREALLOC_SIZE (32 * 1024 * 1024)
2596
Takashi Iwai176d5332008-07-30 15:01:44 +02002597static int
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002598azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec,
2599 struct hda_pcm *cpcm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002600{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002601 struct azx *chip = bus->private_data;
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002602 struct snd_pcm *pcm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002603 struct azx_pcm *apcm;
Takashi Iwai176d5332008-07-30 15:01:44 +02002604 int pcm_dev = cpcm->device;
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002605 unsigned int size;
Takashi Iwai176d5332008-07-30 15:01:44 +02002606 int s, err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002607
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002608 list_for_each_entry(apcm, &chip->pcm_list, list) {
2609 if (apcm->pcm->device == pcm_dev) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08002610 snd_printk(KERN_ERR SFX "%s: PCM %d already exists\n",
2611 pci_name(chip->pci), pcm_dev);
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002612 return -EBUSY;
2613 }
Takashi Iwai176d5332008-07-30 15:01:44 +02002614 }
2615 err = snd_pcm_new(chip->card, cpcm->name, pcm_dev,
2616 cpcm->stream[SNDRV_PCM_STREAM_PLAYBACK].substreams,
2617 cpcm->stream[SNDRV_PCM_STREAM_CAPTURE].substreams,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002618 &pcm);
2619 if (err < 0)
2620 return err;
Takashi Iwai18cb7102009-04-16 10:22:24 +02002621 strlcpy(pcm->name, cpcm->name, sizeof(pcm->name));
Takashi Iwai176d5332008-07-30 15:01:44 +02002622 apcm = kzalloc(sizeof(*apcm), GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002623 if (apcm == NULL)
2624 return -ENOMEM;
2625 apcm->chip = chip;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002626 apcm->pcm = pcm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002627 apcm->codec = codec;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002628 pcm->private_data = apcm;
2629 pcm->private_free = azx_pcm_free;
Takashi Iwai176d5332008-07-30 15:01:44 +02002630 if (cpcm->pcm_type == HDA_PCM_TYPE_MODEM)
2631 pcm->dev_class = SNDRV_PCM_CLASS_MODEM;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002632 list_add_tail(&apcm->list, &chip->pcm_list);
Takashi Iwai176d5332008-07-30 15:01:44 +02002633 cpcm->pcm = pcm;
2634 for (s = 0; s < 2; s++) {
2635 apcm->hinfo[s] = &cpcm->stream[s];
2636 if (cpcm->stream[s].substreams)
2637 snd_pcm_set_ops(pcm, s, &azx_pcm_ops);
2638 }
2639 /* buffer pre-allocation */
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002640 size = CONFIG_SND_HDA_PREALLOC_SIZE * 1024;
2641 if (size > MAX_PREALLOC_SIZE)
2642 size = MAX_PREALLOC_SIZE;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002643 snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV_SG,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002644 snd_dma_pci_data(chip->pci),
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002645 size, MAX_PREALLOC_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002646 return 0;
2647}
2648
2649/*
2650 * mixer creation - all stuff is implemented in hda module
2651 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05002652static int azx_mixer_create(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002653{
2654 return snd_hda_build_controls(chip->bus);
2655}
2656
2657
2658/*
2659 * initialize SD streams
2660 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05002661static int azx_init_stream(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002662{
2663 int i;
2664
2665 /* initialize each stream (aka device)
Takashi Iwaid01ce992007-07-27 16:52:19 +02002666 * assign the starting bdl address to each stream (device)
2667 * and initialize
Linus Torvalds1da177e2005-04-16 15:20:36 -07002668 */
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002669 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002670 struct azx_dev *azx_dev = &chip->azx_dev[i];
Takashi Iwai929861c2006-08-31 16:55:40 +02002671 azx_dev->posbuf = (u32 __iomem *)(chip->posbuf.area + i * 8);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002672 /* offset: SDI0=0x80, SDI1=0xa0, ... SDO3=0x160 */
2673 azx_dev->sd_addr = chip->remap_addr + (0x20 * i + 0x80);
2674 /* int mask: SDI0=0x01, SDI1=0x02, ... SDO3=0x80 */
2675 azx_dev->sd_int_sta_mask = 1 << i;
2676 /* stream tag: must be non-zero and unique */
2677 azx_dev->index = i;
2678 azx_dev->stream_tag = i + 1;
2679 }
2680
2681 return 0;
2682}
2683
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002684static int azx_acquire_irq(struct azx *chip, int do_disconnect)
2685{
Takashi Iwai437a5a42006-11-21 12:14:23 +01002686 if (request_irq(chip->pci->irq, azx_interrupt,
2687 chip->msi ? 0 : IRQF_SHARED,
Takashi Iwai934c2b62011-06-10 16:36:37 +02002688 KBUILD_MODNAME, chip)) {
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002689 printk(KERN_ERR "hda-intel: unable to grab IRQ %d, "
2690 "disabling device\n", chip->pci->irq);
2691 if (do_disconnect)
2692 snd_card_disconnect(chip->card);
2693 return -1;
2694 }
2695 chip->irq = chip->pci->irq;
Takashi Iwai69e13412006-11-21 12:10:55 +01002696 pci_intx(chip->pci, !chip->msi);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002697 return 0;
2698}
2699
Linus Torvalds1da177e2005-04-16 15:20:36 -07002700
Takashi Iwaicb53c622007-08-10 17:21:45 +02002701static void azx_stop_chip(struct azx *chip)
2702{
Takashi Iwai95e99fd2007-08-13 15:29:04 +02002703 if (!chip->initialized)
Takashi Iwaicb53c622007-08-10 17:21:45 +02002704 return;
2705
2706 /* disable interrupts */
2707 azx_int_disable(chip);
2708 azx_int_clear(chip);
2709
2710 /* disable CORB/RIRB */
2711 azx_free_cmd_io(chip);
2712
2713 /* disable position buffer */
2714 azx_writel(chip, DPLBASE, 0);
2715 azx_writel(chip, DPUBASE, 0);
2716
2717 chip->initialized = 0;
2718}
2719
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002720#ifdef CONFIG_SND_HDA_DSP_LOADER
2721/*
2722 * DSP loading code (e.g. for CA0132)
2723 */
2724
2725/* use the first stream for loading DSP */
2726static struct azx_dev *
2727azx_get_dsp_loader_dev(struct azx *chip)
2728{
2729 return &chip->azx_dev[chip->playback_index_offset];
2730}
2731
2732static int azx_load_dsp_prepare(struct hda_bus *bus, unsigned int format,
2733 unsigned int byte_size,
2734 struct snd_dma_buffer *bufp)
2735{
2736 u32 *bdl;
2737 struct azx *chip = bus->private_data;
2738 struct azx_dev *azx_dev;
2739 int err;
2740
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002741 azx_dev = azx_get_dsp_loader_dev(chip);
2742
2743 dsp_lock(azx_dev);
2744 spin_lock_irq(&chip->reg_lock);
2745 if (azx_dev->running || azx_dev->locked) {
2746 spin_unlock_irq(&chip->reg_lock);
2747 err = -EBUSY;
2748 goto unlock;
2749 }
2750 azx_dev->prepared = 0;
2751 chip->saved_azx_dev = *azx_dev;
2752 azx_dev->locked = 1;
2753 spin_unlock_irq(&chip->reg_lock);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002754
2755 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV_SG,
2756 snd_dma_pci_data(chip->pci),
2757 byte_size, bufp);
2758 if (err < 0)
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002759 goto err_alloc;
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002760
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002761 mark_pages_wc(chip, bufp, true);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002762 azx_dev->bufsize = byte_size;
2763 azx_dev->period_bytes = byte_size;
2764 azx_dev->format_val = format;
2765
2766 azx_stream_reset(chip, azx_dev);
2767
2768 /* reset BDL address */
2769 azx_sd_writel(azx_dev, SD_BDLPL, 0);
2770 azx_sd_writel(azx_dev, SD_BDLPU, 0);
2771
2772 azx_dev->frags = 0;
2773 bdl = (u32 *)azx_dev->bdl.area;
2774 err = setup_bdle(chip, bufp, azx_dev, &bdl, 0, byte_size, 0);
2775 if (err < 0)
2776 goto error;
2777
2778 azx_setup_controller(chip, azx_dev);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002779 dsp_unlock(azx_dev);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002780 return azx_dev->stream_tag;
2781
2782 error:
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002783 mark_pages_wc(chip, bufp, false);
2784 snd_dma_free_pages(bufp);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002785 err_alloc:
2786 spin_lock_irq(&chip->reg_lock);
2787 if (azx_dev->opened)
2788 *azx_dev = chip->saved_azx_dev;
2789 azx_dev->locked = 0;
2790 spin_unlock_irq(&chip->reg_lock);
2791 unlock:
2792 dsp_unlock(azx_dev);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002793 return err;
2794}
2795
2796static void azx_load_dsp_trigger(struct hda_bus *bus, bool start)
2797{
2798 struct azx *chip = bus->private_data;
2799 struct azx_dev *azx_dev = azx_get_dsp_loader_dev(chip);
2800
2801 if (start)
2802 azx_stream_start(chip, azx_dev);
2803 else
2804 azx_stream_stop(chip, azx_dev);
2805 azx_dev->running = start;
2806}
2807
2808static void azx_load_dsp_cleanup(struct hda_bus *bus,
2809 struct snd_dma_buffer *dmab)
2810{
2811 struct azx *chip = bus->private_data;
2812 struct azx_dev *azx_dev = azx_get_dsp_loader_dev(chip);
2813
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002814 if (!dmab->area || !azx_dev->locked)
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002815 return;
2816
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002817 dsp_lock(azx_dev);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002818 /* reset BDL address */
2819 azx_sd_writel(azx_dev, SD_BDLPL, 0);
2820 azx_sd_writel(azx_dev, SD_BDLPU, 0);
2821 azx_sd_writel(azx_dev, SD_CTL, 0);
2822 azx_dev->bufsize = 0;
2823 azx_dev->period_bytes = 0;
2824 azx_dev->format_val = 0;
2825
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002826 mark_pages_wc(chip, dmab, false);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002827 snd_dma_free_pages(dmab);
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002828 dmab->area = NULL;
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002829
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002830 spin_lock_irq(&chip->reg_lock);
2831 if (azx_dev->opened)
2832 *azx_dev = chip->saved_azx_dev;
2833 azx_dev->locked = 0;
2834 spin_unlock_irq(&chip->reg_lock);
2835 dsp_unlock(azx_dev);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002836}
2837#endif /* CONFIG_SND_HDA_DSP_LOADER */
2838
Takashi Iwai83012a72012-08-24 18:38:08 +02002839#ifdef CONFIG_PM
Takashi Iwaicb53c622007-08-10 17:21:45 +02002840/* power-up/down the controller */
Takashi Iwai68467f52012-08-28 09:14:29 -07002841static void azx_power_notify(struct hda_bus *bus, bool power_up)
Takashi Iwaicb53c622007-08-10 17:21:45 +02002842{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002843 struct azx *chip = bus->private_data;
Takashi Iwaicb53c622007-08-10 17:21:45 +02002844
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01002845 if (!(chip->driver_caps & AZX_DCAPS_PM_RUNTIME))
2846 return;
2847
Takashi Iwai68467f52012-08-28 09:14:29 -07002848 if (power_up)
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002849 pm_runtime_get_sync(&chip->pci->dev);
2850 else
2851 pm_runtime_put_sync(&chip->pci->dev);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002852}
Takashi Iwai65fcd412012-08-14 17:13:32 +02002853
2854static DEFINE_MUTEX(card_list_lock);
2855static LIST_HEAD(card_list);
2856
2857static void azx_add_card_list(struct azx *chip)
2858{
2859 mutex_lock(&card_list_lock);
2860 list_add(&chip->list, &card_list);
2861 mutex_unlock(&card_list_lock);
2862}
2863
2864static void azx_del_card_list(struct azx *chip)
2865{
2866 mutex_lock(&card_list_lock);
2867 list_del_init(&chip->list);
2868 mutex_unlock(&card_list_lock);
2869}
2870
2871/* trigger power-save check at writing parameter */
2872static int param_set_xint(const char *val, const struct kernel_param *kp)
2873{
2874 struct azx *chip;
2875 struct hda_codec *c;
2876 int prev = power_save;
2877 int ret = param_set_int(val, kp);
2878
2879 if (ret || prev == power_save)
2880 return ret;
2881
2882 mutex_lock(&card_list_lock);
2883 list_for_each_entry(chip, &card_list, list) {
2884 if (!chip->bus || chip->disabled)
2885 continue;
2886 list_for_each_entry(c, &chip->bus->codec_list, list)
2887 snd_hda_power_sync(c);
2888 }
2889 mutex_unlock(&card_list_lock);
2890 return 0;
2891}
2892#else
2893#define azx_add_card_list(chip) /* NOP */
2894#define azx_del_card_list(chip) /* NOP */
Takashi Iwai83012a72012-08-24 18:38:08 +02002895#endif /* CONFIG_PM */
Takashi Iwai5c0b9be2008-12-11 11:47:17 +01002896
Takashi Iwai7ccbde52012-08-14 18:10:09 +02002897#if defined(CONFIG_PM_SLEEP) || defined(SUPPORT_VGA_SWITCHEROO)
Takashi Iwai5c0b9be2008-12-11 11:47:17 +01002898/*
2899 * power management
2900 */
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002901static int azx_suspend(struct device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002902{
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002903 struct pci_dev *pci = to_pci_dev(dev);
2904 struct snd_card *card = dev_get_drvdata(dev);
Takashi Iwai421a1252005-11-17 16:11:09 +01002905 struct azx *chip = card->private_data;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002906 struct azx_pcm *p;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002907
Takashi Iwaic5c21522012-12-04 17:01:25 +01002908 if (chip->disabled)
2909 return 0;
2910
Takashi Iwai421a1252005-11-17 16:11:09 +01002911 snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002912 azx_clear_irq_pending(chip);
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002913 list_for_each_entry(p, &chip->pcm_list, list)
2914 snd_pcm_suspend_all(p->pcm);
Takashi Iwai0b7a2e92007-08-14 15:18:26 +02002915 if (chip->initialized)
Takashi Iwai8dd78332009-06-02 01:16:07 +02002916 snd_hda_suspend(chip->bus);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002917 azx_stop_chip(chip);
Mengdong Lin7295b262013-06-25 05:58:49 -04002918 azx_enter_link_reset(chip);
Takashi Iwai30b35392006-10-11 18:52:53 +02002919 if (chip->irq >= 0) {
Takashi Iwai43001c92006-09-08 12:30:03 +02002920 free_irq(chip->irq, chip);
Takashi Iwai30b35392006-10-11 18:52:53 +02002921 chip->irq = -1;
2922 }
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002923 if (chip->msi)
Takashi Iwai43001c92006-09-08 12:30:03 +02002924 pci_disable_msi(chip->pci);
Takashi Iwai421a1252005-11-17 16:11:09 +01002925 pci_disable_device(pci);
2926 pci_save_state(pci);
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002927 pci_set_power_state(pci, PCI_D3hot);
Wang Xingchao99a20082013-05-30 22:07:10 +08002928 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)
2929 hda_display_power(false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002930 return 0;
2931}
2932
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002933static int azx_resume(struct device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002934{
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002935 struct pci_dev *pci = to_pci_dev(dev);
2936 struct snd_card *card = dev_get_drvdata(dev);
Takashi Iwai421a1252005-11-17 16:11:09 +01002937 struct azx *chip = card->private_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002938
Takashi Iwaic5c21522012-12-04 17:01:25 +01002939 if (chip->disabled)
2940 return 0;
2941
Wang Xingchao99a20082013-05-30 22:07:10 +08002942 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)
2943 hda_display_power(true);
Takashi Iwaid14a7e02009-02-16 10:13:03 +01002944 pci_set_power_state(pci, PCI_D0);
2945 pci_restore_state(pci);
Takashi Iwai30b35392006-10-11 18:52:53 +02002946 if (pci_enable_device(pci) < 0) {
2947 printk(KERN_ERR "hda-intel: pci_enable_device failed, "
2948 "disabling device\n");
2949 snd_card_disconnect(card);
2950 return -EIO;
2951 }
2952 pci_set_master(pci);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002953 if (chip->msi)
2954 if (pci_enable_msi(pci) < 0)
2955 chip->msi = 0;
2956 if (azx_acquire_irq(chip, 1) < 0)
Takashi Iwai30b35392006-10-11 18:52:53 +02002957 return -EIO;
Takashi Iwaicb53c622007-08-10 17:21:45 +02002958 azx_init_pci(chip);
Maxim Levitskyd804ad92007-09-03 15:28:04 +02002959
Takashi Iwai7f308302012-05-08 16:52:23 +02002960 azx_init_chip(chip, 1);
Maxim Levitskyd804ad92007-09-03 15:28:04 +02002961
Linus Torvalds1da177e2005-04-16 15:20:36 -07002962 snd_hda_resume(chip->bus);
Takashi Iwai421a1252005-11-17 16:11:09 +01002963 snd_power_change_state(card, SNDRV_CTL_POWER_D0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002964 return 0;
2965}
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002966#endif /* CONFIG_PM_SLEEP || SUPPORT_VGA_SWITCHEROO */
2967
2968#ifdef CONFIG_PM_RUNTIME
2969static int azx_runtime_suspend(struct device *dev)
2970{
2971 struct snd_card *card = dev_get_drvdata(dev);
2972 struct azx *chip = card->private_data;
2973
Wang Xingchao7d4f6062013-07-25 23:34:46 -04002974 /* enable controller wake up event */
2975 azx_writew(chip, WAKEEN, azx_readw(chip, WAKEEN) |
2976 STATESTS_INT_MASK);
2977
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002978 azx_stop_chip(chip);
Mengdong Lin7295b262013-06-25 05:58:49 -04002979 azx_enter_link_reset(chip);
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002980 azx_clear_irq_pending(chip);
Wang Xingchao99a20082013-05-30 22:07:10 +08002981 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)
2982 hda_display_power(false);
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002983 return 0;
2984}
2985
2986static int azx_runtime_resume(struct device *dev)
2987{
2988 struct snd_card *card = dev_get_drvdata(dev);
2989 struct azx *chip = card->private_data;
Wang Xingchao7d4f6062013-07-25 23:34:46 -04002990 struct hda_bus *bus;
2991 struct hda_codec *codec;
2992 int status;
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002993
Wang Xingchao99a20082013-05-30 22:07:10 +08002994 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)
2995 hda_display_power(true);
Wang Xingchao7d4f6062013-07-25 23:34:46 -04002996
2997 /* Read STATESTS before controller reset */
2998 status = azx_readw(chip, STATESTS);
2999
Mengdong Linb8dfc4622012-08-23 17:32:30 +08003000 azx_init_pci(chip);
3001 azx_init_chip(chip, 1);
Wang Xingchao7d4f6062013-07-25 23:34:46 -04003002
3003 bus = chip->bus;
3004 if (status && bus) {
3005 list_for_each_entry(codec, &bus->codec_list, list)
3006 if (status & (1 << codec->addr))
3007 queue_delayed_work(codec->bus->workq,
3008 &codec->jackpoll_work, codec->jackpoll_interval);
3009 }
3010
3011 /* disable controller Wake Up event*/
3012 azx_writew(chip, WAKEEN, azx_readw(chip, WAKEEN) &
3013 ~STATESTS_INT_MASK);
3014
Mengdong Linb8dfc4622012-08-23 17:32:30 +08003015 return 0;
3016}
Takashi Iwai6eb827d2012-12-12 11:50:12 +01003017
3018static int azx_runtime_idle(struct device *dev)
3019{
3020 struct snd_card *card = dev_get_drvdata(dev);
3021 struct azx *chip = card->private_data;
3022
3023 if (!power_save_controller ||
3024 !(chip->driver_caps & AZX_DCAPS_PM_RUNTIME))
3025 return -EBUSY;
3026
3027 return 0;
3028}
3029
Mengdong Linb8dfc4622012-08-23 17:32:30 +08003030#endif /* CONFIG_PM_RUNTIME */
3031
3032#ifdef CONFIG_PM
3033static const struct dev_pm_ops azx_pm = {
3034 SET_SYSTEM_SLEEP_PM_OPS(azx_suspend, azx_resume)
Takashi Iwai6eb827d2012-12-12 11:50:12 +01003035 SET_RUNTIME_PM_OPS(azx_runtime_suspend, azx_runtime_resume, azx_runtime_idle)
Mengdong Linb8dfc4622012-08-23 17:32:30 +08003036};
3037
Takashi Iwai68cb2b52012-07-02 15:20:37 +02003038#define AZX_PM_OPS &azx_pm
3039#else
Takashi Iwai68cb2b52012-07-02 15:20:37 +02003040#define AZX_PM_OPS NULL
Mengdong Linb8dfc4622012-08-23 17:32:30 +08003041#endif /* CONFIG_PM */
Linus Torvalds1da177e2005-04-16 15:20:36 -07003042
3043
3044/*
Takashi Iwai0cbf0092008-10-29 16:18:25 +01003045 * reboot notifier for hang-up problem at power-down
3046 */
3047static int azx_halt(struct notifier_block *nb, unsigned long event, void *buf)
3048{
3049 struct azx *chip = container_of(nb, struct azx, reboot_notifier);
Takashi Iwaifb8d1a32009-11-10 16:02:29 +01003050 snd_hda_bus_reboot_notify(chip->bus);
Takashi Iwai0cbf0092008-10-29 16:18:25 +01003051 azx_stop_chip(chip);
3052 return NOTIFY_OK;
3053}
3054
3055static void azx_notifier_register(struct azx *chip)
3056{
3057 chip->reboot_notifier.notifier_call = azx_halt;
3058 register_reboot_notifier(&chip->reboot_notifier);
3059}
3060
3061static void azx_notifier_unregister(struct azx *chip)
3062{
3063 if (chip->reboot_notifier.notifier_call)
3064 unregister_reboot_notifier(&chip->reboot_notifier);
3065}
3066
Takashi Iwai48c8b0e2012-12-07 07:40:35 +01003067static int azx_probe_continue(struct azx *chip);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003068
Steven Newbury8393ec4a2012-06-08 13:06:29 +02003069#ifdef SUPPORT_VGA_SWITCHEROO
Bill Pembertone23e7a12012-12-06 12:35:10 -05003070static struct pci_dev *get_bound_vga(struct pci_dev *pci);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003071
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003072static void azx_vs_set_state(struct pci_dev *pci,
3073 enum vga_switcheroo_state state)
3074{
3075 struct snd_card *card = pci_get_drvdata(pci);
3076 struct azx *chip = card->private_data;
3077 bool disabled;
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;
3082
3083 disabled = (state == VGA_SWITCHEROO_OFF);
3084 if (chip->disabled == disabled)
3085 return;
3086
3087 if (!chip->bus) {
3088 chip->disabled = disabled;
3089 if (!disabled) {
3090 snd_printk(KERN_INFO SFX
3091 "%s: Start delayed initialization\n",
3092 pci_name(chip->pci));
Takashi Iwai5c906802013-05-30 22:07:09 +08003093 if (azx_probe_continue(chip) < 0) {
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003094 snd_printk(KERN_ERR SFX
3095 "%s: initialization error\n",
3096 pci_name(chip->pci));
3097 chip->init_failed = true;
3098 }
3099 }
3100 } else {
3101 snd_printk(KERN_INFO SFX
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003102 "%s: %s via VGA-switcheroo\n", pci_name(chip->pci),
3103 disabled ? "Disabling" : "Enabling");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003104 if (disabled) {
Takashi Iwai68cb2b52012-07-02 15:20:37 +02003105 azx_suspend(&pci->dev);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003106 chip->disabled = true;
Takashi Iwai128960a2012-10-12 17:28:18 +02003107 if (snd_hda_lock_devices(chip->bus))
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003108 snd_printk(KERN_WARNING SFX "%s: Cannot lock devices!\n",
3109 pci_name(chip->pci));
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003110 } else {
3111 snd_hda_unlock_devices(chip->bus);
3112 chip->disabled = false;
Takashi Iwai68cb2b52012-07-02 15:20:37 +02003113 azx_resume(&pci->dev);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003114 }
3115 }
3116}
3117
3118static bool azx_vs_can_switch(struct pci_dev *pci)
3119{
3120 struct snd_card *card = pci_get_drvdata(pci);
3121 struct azx *chip = card->private_data;
3122
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003123 wait_for_completion(&chip->probe_wait);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003124 if (chip->init_failed)
3125 return false;
3126 if (chip->disabled || !chip->bus)
3127 return true;
3128 if (snd_hda_lock_devices(chip->bus))
3129 return false;
3130 snd_hda_unlock_devices(chip->bus);
3131 return true;
3132}
3133
Bill Pembertone23e7a12012-12-06 12:35:10 -05003134static void init_vga_switcheroo(struct azx *chip)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003135{
3136 struct pci_dev *p = get_bound_vga(chip->pci);
3137 if (p) {
3138 snd_printk(KERN_INFO SFX
3139 "%s: Handle VGA-switcheroo audio client\n",
3140 pci_name(chip->pci));
3141 chip->use_vga_switcheroo = 1;
3142 pci_dev_put(p);
3143 }
3144}
3145
3146static const struct vga_switcheroo_client_ops azx_vs_ops = {
3147 .set_gpu_state = azx_vs_set_state,
3148 .can_switch = azx_vs_can_switch,
3149};
3150
Bill Pembertone23e7a12012-12-06 12:35:10 -05003151static int register_vga_switcheroo(struct azx *chip)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003152{
Takashi Iwai128960a2012-10-12 17:28:18 +02003153 int err;
3154
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003155 if (!chip->use_vga_switcheroo)
3156 return 0;
3157 /* FIXME: currently only handling DIS controller
3158 * is there any machine with two switchable HDMI audio controllers?
3159 */
Takashi Iwai128960a2012-10-12 17:28:18 +02003160 err = vga_switcheroo_register_audio_client(chip->pci, &azx_vs_ops,
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003161 VGA_SWITCHEROO_DIS,
3162 chip->bus != NULL);
Takashi Iwai128960a2012-10-12 17:28:18 +02003163 if (err < 0)
3164 return err;
3165 chip->vga_switcheroo_registered = 1;
3166 return 0;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003167}
3168#else
3169#define init_vga_switcheroo(chip) /* NOP */
3170#define register_vga_switcheroo(chip) 0
Steven Newbury8393ec4a2012-06-08 13:06:29 +02003171#define check_hdmi_disabled(pci) false
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003172#endif /* SUPPORT_VGA_SWITCHER */
3173
Takashi Iwai0cbf0092008-10-29 16:18:25 +01003174/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07003175 * destructor
3176 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01003177static int azx_free(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003178{
Wang Xingchaoc67e2222013-05-30 22:07:08 +08003179 struct pci_dev *pci = chip->pci;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003180 int i;
3181
Wang Xingchaoc67e2222013-05-30 22:07:08 +08003182 if ((chip->driver_caps & AZX_DCAPS_PM_RUNTIME)
3183 && chip->running)
3184 pm_runtime_get_noresume(&pci->dev);
3185
Takashi Iwai65fcd412012-08-14 17:13:32 +02003186 azx_del_card_list(chip);
3187
Takashi Iwai0cbf0092008-10-29 16:18:25 +01003188 azx_notifier_unregister(chip);
3189
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003190 chip->init_failed = 1; /* to be sure */
Daniel J Blueman44728e92012-12-18 23:59:33 +08003191 complete_all(&chip->probe_wait);
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003192
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003193 if (use_vga_switcheroo(chip)) {
3194 if (chip->disabled && chip->bus)
3195 snd_hda_unlock_devices(chip->bus);
Takashi Iwai128960a2012-10-12 17:28:18 +02003196 if (chip->vga_switcheroo_registered)
3197 vga_switcheroo_unregister_client(chip->pci);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003198 }
3199
Takashi Iwaice43fba2005-05-30 20:33:44 +02003200 if (chip->initialized) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02003201 azx_clear_irq_pending(chip);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003202 for (i = 0; i < chip->num_streams; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003203 azx_stream_stop(chip, &chip->azx_dev[i]);
Takashi Iwaicb53c622007-08-10 17:21:45 +02003204 azx_stop_chip(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003205 }
3206
Jeff Garzikf000fd82008-04-22 13:50:34 +02003207 if (chip->irq >= 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003208 free_irq(chip->irq, (void*)chip);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02003209 if (chip->msi)
Takashi Iwai30b35392006-10-11 18:52:53 +02003210 pci_disable_msi(chip->pci);
Takashi Iwaif079c252006-06-01 11:42:14 +02003211 if (chip->remap_addr)
3212 iounmap(chip->remap_addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003213
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003214 if (chip->azx_dev) {
3215 for (i = 0; i < chip->num_streams; i++)
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003216 if (chip->azx_dev[i].bdl.area) {
3217 mark_pages_wc(chip, &chip->azx_dev[i].bdl, false);
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003218 snd_dma_free_pages(&chip->azx_dev[i].bdl);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003219 }
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003220 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003221 if (chip->rb.area) {
3222 mark_pages_wc(chip, &chip->rb, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003223 snd_dma_free_pages(&chip->rb);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003224 }
3225 if (chip->posbuf.area) {
3226 mark_pages_wc(chip, &chip->posbuf, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003227 snd_dma_free_pages(&chip->posbuf);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003228 }
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003229 if (chip->region_requested)
3230 pci_release_regions(chip->pci);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003231 pci_disable_device(chip->pci);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003232 kfree(chip->azx_dev);
Takashi Iwai4918cda2012-08-09 12:33:28 +02003233#ifdef CONFIG_SND_HDA_PATCH_LOADER
3234 if (chip->fw)
3235 release_firmware(chip->fw);
3236#endif
Wang Xingchao99a20082013-05-30 22:07:10 +08003237 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL) {
3238 hda_display_power(false);
3239 hda_i915_exit();
3240 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003241 kfree(chip);
3242
3243 return 0;
3244}
3245
Takashi Iwaia98f90f2005-11-17 14:59:02 +01003246static int azx_dev_free(struct snd_device *device)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003247{
3248 return azx_free(device->device_data);
3249}
3250
Steven Newbury8393ec4a2012-06-08 13:06:29 +02003251#ifdef SUPPORT_VGA_SWITCHEROO
Linus Torvalds1da177e2005-04-16 15:20:36 -07003252/*
Takashi Iwai91219472012-04-26 12:13:25 +02003253 * Check of disabled HDMI controller by vga-switcheroo
3254 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003255static struct pci_dev *get_bound_vga(struct pci_dev *pci)
Takashi Iwai91219472012-04-26 12:13:25 +02003256{
3257 struct pci_dev *p;
3258
3259 /* check only discrete GPU */
3260 switch (pci->vendor) {
3261 case PCI_VENDOR_ID_ATI:
3262 case PCI_VENDOR_ID_AMD:
3263 case PCI_VENDOR_ID_NVIDIA:
3264 if (pci->devfn == 1) {
3265 p = pci_get_domain_bus_and_slot(pci_domain_nr(pci->bus),
3266 pci->bus->number, 0);
3267 if (p) {
3268 if ((p->class >> 8) == PCI_CLASS_DISPLAY_VGA)
3269 return p;
3270 pci_dev_put(p);
3271 }
3272 }
3273 break;
3274 }
3275 return NULL;
3276}
3277
Bill Pembertone23e7a12012-12-06 12:35:10 -05003278static bool check_hdmi_disabled(struct pci_dev *pci)
Takashi Iwai91219472012-04-26 12:13:25 +02003279{
3280 bool vga_inactive = false;
3281 struct pci_dev *p = get_bound_vga(pci);
3282
3283 if (p) {
Takashi Iwai12b78a72012-06-07 12:15:16 +02003284 if (vga_switcheroo_get_client_state(p) == VGA_SWITCHEROO_OFF)
Takashi Iwai91219472012-04-26 12:13:25 +02003285 vga_inactive = true;
3286 pci_dev_put(p);
3287 }
3288 return vga_inactive;
3289}
Steven Newbury8393ec4a2012-06-08 13:06:29 +02003290#endif /* SUPPORT_VGA_SWITCHEROO */
Takashi Iwai91219472012-04-26 12:13:25 +02003291
3292/*
Takashi Iwai3372a152007-02-01 15:46:50 +01003293 * white/black-listing for position_fix
3294 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003295static struct snd_pci_quirk position_fix_list[] = {
Takashi Iwaid2e1c972008-06-10 17:53:34 +02003296 SND_PCI_QUIRK(0x1028, 0x01cc, "Dell D820", POS_FIX_LPIB),
3297 SND_PCI_QUIRK(0x1028, 0x01de, "Dell Precision 390", POS_FIX_LPIB),
Takashi Iwai2f703e72009-12-01 14:17:37 +01003298 SND_PCI_QUIRK(0x103c, 0x306d, "HP dv3", POS_FIX_LPIB),
Takashi Iwaid2e1c972008-06-10 17:53:34 +02003299 SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB),
Daniel T Chendd37f8e2010-05-30 01:17:03 -04003300 SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS", POS_FIX_LPIB),
Daniel T Chen9f75c1b2010-05-30 13:08:41 -04003301 SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS M2V", POS_FIX_LPIB),
Daniel T Chene96d3122010-05-27 18:32:18 -04003302 SND_PCI_QUIRK(0x104d, 0x9069, "Sony VPCS11V9E", POS_FIX_LPIB),
David Henningssonb01de4f2012-01-12 16:31:14 +01003303 SND_PCI_QUIRK(0x10de, 0xcb89, "Macbook Pro 7,1", POS_FIX_LPIB),
Daniel T Chen61bb42c2010-05-29 11:04:11 -04003304 SND_PCI_QUIRK(0x1297, 0x3166, "Shuttle", POS_FIX_LPIB),
Daniel T Chen9ec8dda2010-03-28 02:34:40 -04003305 SND_PCI_QUIRK(0x1458, 0xa022, "ga-ma770-ud3", POS_FIX_LPIB),
Takashi Iwai45d4ebf2009-11-30 11:58:30 +01003306 SND_PCI_QUIRK(0x1462, 0x1002, "MSI Wind U115", POS_FIX_LPIB),
Takashi Iwai8815cd02010-04-15 09:02:41 +02003307 SND_PCI_QUIRK(0x1565, 0x8218, "Biostar Microtech", POS_FIX_LPIB),
Daniel T Chenb90c0762010-05-30 19:31:41 -04003308 SND_PCI_QUIRK(0x1849, 0x0888, "775Dual-VSTA", POS_FIX_LPIB),
Daniel T Chen0e0280d2010-04-21 19:55:43 -04003309 SND_PCI_QUIRK(0x8086, 0x2503, "DG965OT AAD63733-203", POS_FIX_LPIB),
Takashi Iwai3372a152007-02-01 15:46:50 +01003310 {}
3311};
3312
Bill Pembertone23e7a12012-12-06 12:35:10 -05003313static int check_position_fix(struct azx *chip, int fix)
Takashi Iwai3372a152007-02-01 15:46:50 +01003314{
3315 const struct snd_pci_quirk *q;
3316
Takashi Iwaic673ba12009-03-17 07:49:14 +01003317 switch (fix) {
Takashi Iwai1dac6692012-09-13 14:59:47 +02003318 case POS_FIX_AUTO:
Takashi Iwaic673ba12009-03-17 07:49:14 +01003319 case POS_FIX_LPIB:
3320 case POS_FIX_POSBUF:
David Henningsson4cb36312010-09-30 10:12:50 +02003321 case POS_FIX_VIACOMBO:
Takashi Iwaia6f2fd52012-02-28 11:58:40 +01003322 case POS_FIX_COMBO:
Takashi Iwaic673ba12009-03-17 07:49:14 +01003323 return fix;
3324 }
3325
Takashi Iwaic673ba12009-03-17 07:49:14 +01003326 q = snd_pci_quirk_lookup(chip->pci, position_fix_list);
3327 if (q) {
3328 printk(KERN_INFO
3329 "hda_intel: position_fix set to %d "
3330 "for device %04x:%04x\n",
3331 q->value, q->subvendor, q->subdevice);
3332 return q->value;
Takashi Iwai3372a152007-02-01 15:46:50 +01003333 }
David Henningssonbdd9ef22010-10-04 12:02:14 +02003334
3335 /* Check VIA/ATI HD Audio Controller exist */
Takashi Iwai9477c582011-05-25 09:11:37 +02003336 if (chip->driver_caps & AZX_DCAPS_POSFIX_VIA) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003337 snd_printd(SFX "%s: Using VIACOMBO position fix\n", pci_name(chip->pci));
David Henningssonbdd9ef22010-10-04 12:02:14 +02003338 return POS_FIX_VIACOMBO;
3339 }
Takashi Iwai9477c582011-05-25 09:11:37 +02003340 if (chip->driver_caps & AZX_DCAPS_POSFIX_LPIB) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003341 snd_printd(SFX "%s: Using LPIB position fix\n", pci_name(chip->pci));
Takashi Iwai9477c582011-05-25 09:11:37 +02003342 return POS_FIX_LPIB;
3343 }
Takashi Iwaic673ba12009-03-17 07:49:14 +01003344 return POS_FIX_AUTO;
Takashi Iwai3372a152007-02-01 15:46:50 +01003345}
3346
3347/*
Takashi Iwai669ba272007-08-17 09:17:36 +02003348 * black-lists for probe_mask
3349 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003350static struct snd_pci_quirk probe_mask_list[] = {
Takashi Iwai669ba272007-08-17 09:17:36 +02003351 /* Thinkpad often breaks the controller communication when accessing
3352 * to the non-working (or non-existing) modem codec slot.
3353 */
3354 SND_PCI_QUIRK(0x1014, 0x05b7, "Thinkpad Z60", 0x01),
3355 SND_PCI_QUIRK(0x17aa, 0x2010, "Thinkpad X/T/R60", 0x01),
3356 SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X/T/R61", 0x01),
Takashi Iwai0edb9452008-11-07 14:53:09 +01003357 /* broken BIOS */
3358 SND_PCI_QUIRK(0x1028, 0x20ac, "Dell Studio Desktop", 0x01),
Takashi Iwaief1681d2008-11-24 17:29:28 +01003359 /* including bogus ALC268 in slot#2 that conflicts with ALC888 */
3360 SND_PCI_QUIRK(0x17c0, 0x4085, "Medion MD96630", 0x01),
Takashi Iwai20db7cb2009-02-13 08:18:48 +01003361 /* forced codec slots */
Ozan Çağlayan93574842009-05-23 15:00:04 +03003362 SND_PCI_QUIRK(0x1043, 0x1262, "ASUS W5Fm", 0x103),
Takashi Iwai20db7cb2009-02-13 08:18:48 +01003363 SND_PCI_QUIRK(0x1046, 0x1262, "ASUS W5F", 0x103),
Jaroslav Kyselaf3af9052012-04-26 17:52:35 +02003364 /* WinFast VP200 H (Teradici) user reported broken communication */
3365 SND_PCI_QUIRK(0x3a21, 0x040d, "WinFast VP200 H", 0x101),
Takashi Iwai669ba272007-08-17 09:17:36 +02003366 {}
3367};
3368
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003369#define AZX_FORCE_CODEC_MASK 0x100
3370
Bill Pembertone23e7a12012-12-06 12:35:10 -05003371static void check_probe_mask(struct azx *chip, int dev)
Takashi Iwai669ba272007-08-17 09:17:36 +02003372{
3373 const struct snd_pci_quirk *q;
3374
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003375 chip->codec_probe_mask = probe_mask[dev];
3376 if (chip->codec_probe_mask == -1) {
Takashi Iwai669ba272007-08-17 09:17:36 +02003377 q = snd_pci_quirk_lookup(chip->pci, probe_mask_list);
3378 if (q) {
3379 printk(KERN_INFO
3380 "hda_intel: probe_mask set to 0x%x "
3381 "for device %04x:%04x\n",
3382 q->value, q->subvendor, q->subdevice);
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003383 chip->codec_probe_mask = q->value;
Takashi Iwai669ba272007-08-17 09:17:36 +02003384 }
3385 }
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003386
3387 /* check forced option */
3388 if (chip->codec_probe_mask != -1 &&
3389 (chip->codec_probe_mask & AZX_FORCE_CODEC_MASK)) {
3390 chip->codec_mask = chip->codec_probe_mask & 0xff;
3391 printk(KERN_INFO "hda_intel: codec_mask forced to 0x%x\n",
3392 chip->codec_mask);
3393 }
Takashi Iwai669ba272007-08-17 09:17:36 +02003394}
3395
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003396/*
Takashi Iwai716238552009-09-28 13:14:04 +02003397 * white/black-list for enable_msi
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003398 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003399static struct snd_pci_quirk msi_black_list[] = {
Takashi Iwai9dc83982009-12-22 08:15:01 +01003400 SND_PCI_QUIRK(0x1043, 0x81f2, "ASUS", 0), /* Athlon64 X2 + nvidia */
Takashi Iwai0a27fcf2010-02-15 17:05:28 +01003401 SND_PCI_QUIRK(0x1043, 0x81f6, "ASUS", 0), /* nvidia */
Ralf Gerbigecd21622010-03-09 18:25:47 +01003402 SND_PCI_QUIRK(0x1043, 0x822d, "ASUS", 0), /* Athlon64 X2 + nvidia MCP55 */
Michele Ballabio4193d132010-03-06 21:06:46 +01003403 SND_PCI_QUIRK(0x1849, 0x0888, "ASRock", 0), /* Athlon64 X2 + nvidia */
Takashi Iwai38155952010-04-04 12:14:03 +02003404 SND_PCI_QUIRK(0xa0a0, 0x0575, "Aopen MZ915-M", 0), /* ICH6 */
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003405 {}
3406};
3407
Bill Pembertone23e7a12012-12-06 12:35:10 -05003408static void check_msi(struct azx *chip)
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003409{
3410 const struct snd_pci_quirk *q;
3411
Takashi Iwai716238552009-09-28 13:14:04 +02003412 if (enable_msi >= 0) {
3413 chip->msi = !!enable_msi;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003414 return;
Takashi Iwai716238552009-09-28 13:14:04 +02003415 }
3416 chip->msi = 1; /* enable MSI as default */
3417 q = snd_pci_quirk_lookup(chip->pci, msi_black_list);
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003418 if (q) {
3419 printk(KERN_INFO
3420 "hda_intel: msi for device %04x:%04x set to %d\n",
3421 q->subvendor, q->subdevice, q->value);
3422 chip->msi = q->value;
Takashi Iwai80c43ed2010-03-15 15:51:53 +01003423 return;
3424 }
3425
3426 /* NVidia chipsets seem to cause troubles with MSI */
Takashi Iwai9477c582011-05-25 09:11:37 +02003427 if (chip->driver_caps & AZX_DCAPS_NO_MSI) {
3428 printk(KERN_INFO "hda_intel: Disabling MSI\n");
Takashi Iwai80c43ed2010-03-15 15:51:53 +01003429 chip->msi = 0;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003430 }
3431}
3432
Takashi Iwaia1585d72011-12-14 09:27:04 +01003433/* check the snoop mode availability */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003434static void azx_check_snoop_available(struct azx *chip)
Takashi Iwaia1585d72011-12-14 09:27:04 +01003435{
3436 bool snoop = chip->snoop;
3437
3438 switch (chip->driver_type) {
3439 case AZX_DRIVER_VIA:
3440 /* force to non-snoop mode for a new VIA controller
3441 * when BIOS is set
3442 */
3443 if (snoop) {
3444 u8 val;
3445 pci_read_config_byte(chip->pci, 0x42, &val);
3446 if (!(val & 0x80) && chip->pci->revision == 0x30)
3447 snoop = false;
3448 }
3449 break;
3450 case AZX_DRIVER_ATIHDMI_NS:
3451 /* new ATI HDMI requires non-snoop */
3452 snoop = false;
3453 break;
Takashi Iwaic1279f82013-02-07 17:36:22 +01003454 case AZX_DRIVER_CTHDA:
3455 snoop = false;
3456 break;
Takashi Iwaia1585d72011-12-14 09:27:04 +01003457 }
3458
3459 if (snoop != chip->snoop) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003460 snd_printk(KERN_INFO SFX "%s: Force to %s mode\n",
3461 pci_name(chip->pci), snoop ? "snoop" : "non-snoop");
Takashi Iwaia1585d72011-12-14 09:27:04 +01003462 chip->snoop = snoop;
3463 }
3464}
Takashi Iwai669ba272007-08-17 09:17:36 +02003465
Wang Xingchao99a20082013-05-30 22:07:10 +08003466#ifdef CONFIG_SND_HDA_I915
3467static void azx_probe_work(struct work_struct *work)
3468{
3469 azx_probe_continue(container_of(work, struct azx, probe_work));
3470}
3471#endif
3472
Takashi Iwai669ba272007-08-17 09:17:36 +02003473/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07003474 * constructor
3475 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003476static int azx_create(struct snd_card *card, struct pci_dev *pci,
3477 int dev, unsigned int driver_caps,
3478 struct azx **rchip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003479{
Takashi Iwaia98f90f2005-11-17 14:59:02 +01003480 static struct snd_device_ops ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003481 .dev_free = azx_dev_free,
3482 };
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003483 struct azx *chip;
3484 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003485
3486 *rchip = NULL;
Tobin Davisbcd72002008-01-15 11:23:55 +01003487
Pavel Machek927fc862006-08-31 17:03:43 +02003488 err = pci_enable_device(pci);
3489 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003490 return err;
3491
Takashi Iwaie560d8d2005-09-09 14:21:46 +02003492 chip = kzalloc(sizeof(*chip), GFP_KERNEL);
Pavel Machek927fc862006-08-31 17:03:43 +02003493 if (!chip) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003494 snd_printk(KERN_ERR SFX "%s: Cannot allocate chip\n", pci_name(pci));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003495 pci_disable_device(pci);
3496 return -ENOMEM;
3497 }
3498
3499 spin_lock_init(&chip->reg_lock);
Ingo Molnar62932df2006-01-16 16:34:20 +01003500 mutex_init(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003501 chip->card = card;
3502 chip->pci = pci;
3503 chip->irq = -1;
Takashi Iwai9477c582011-05-25 09:11:37 +02003504 chip->driver_caps = driver_caps;
3505 chip->driver_type = driver_caps & 0xff;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003506 check_msi(chip);
Takashi Iwai555e2192008-06-10 17:53:34 +02003507 chip->dev_index = dev;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02003508 INIT_WORK(&chip->irq_pending_work, azx_irq_pending_work);
Takashi Iwai01b65bf2011-11-24 14:31:46 +01003509 INIT_LIST_HEAD(&chip->pcm_list);
Takashi Iwai65fcd412012-08-14 17:13:32 +02003510 INIT_LIST_HEAD(&chip->list);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003511 init_vga_switcheroo(chip);
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003512 init_completion(&chip->probe_wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003513
Shahin Ghazinouribeaffc32010-05-11 08:19:55 +02003514 chip->position_fix[0] = chip->position_fix[1] =
3515 check_position_fix(chip, position_fix[dev]);
Takashi Iwaia6f2fd52012-02-28 11:58:40 +01003516 /* combo mode uses LPIB for playback */
3517 if (chip->position_fix[0] == POS_FIX_COMBO) {
3518 chip->position_fix[0] = POS_FIX_LPIB;
3519 chip->position_fix[1] = POS_FIX_AUTO;
3520 }
3521
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003522 check_probe_mask(chip, dev);
Takashi Iwai3372a152007-02-01 15:46:50 +01003523
Takashi Iwai27346162006-01-12 18:28:44 +01003524 chip->single_cmd = single_cmd;
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003525 chip->snoop = hda_snoop;
Takashi Iwaia1585d72011-12-14 09:27:04 +01003526 azx_check_snoop_available(chip);
Takashi Iwaic74db862005-05-12 14:26:27 +02003527
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02003528 if (bdl_pos_adj[dev] < 0) {
3529 switch (chip->driver_type) {
Takashi Iwai0c6341a2008-06-13 20:50:27 +02003530 case AZX_DRIVER_ICH:
Seth Heasley32679f92010-02-22 17:31:09 -08003531 case AZX_DRIVER_PCH:
Takashi Iwai0c6341a2008-06-13 20:50:27 +02003532 bdl_pos_adj[dev] = 1;
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02003533 break;
3534 default:
Takashi Iwai0c6341a2008-06-13 20:50:27 +02003535 bdl_pos_adj[dev] = 32;
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02003536 break;
3537 }
3538 }
3539
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003540 err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
3541 if (err < 0) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003542 snd_printk(KERN_ERR SFX "%s: Error creating device [card]!\n",
3543 pci_name(chip->pci));
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003544 azx_free(chip);
3545 return err;
3546 }
3547
Wang Xingchao99a20082013-05-30 22:07:10 +08003548#ifdef CONFIG_SND_HDA_I915
3549 /* continue probing in work context as may trigger request module */
3550 INIT_WORK(&chip->probe_work, azx_probe_work);
3551#endif
3552
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003553 *rchip = chip;
Wang Xingchao99a20082013-05-30 22:07:10 +08003554
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003555 return 0;
3556}
3557
Takashi Iwai48c8b0e2012-12-07 07:40:35 +01003558static int azx_first_init(struct azx *chip)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003559{
3560 int dev = chip->dev_index;
3561 struct pci_dev *pci = chip->pci;
3562 struct snd_card *card = chip->card;
3563 int i, err;
3564 unsigned short gcap;
3565
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003566#if BITS_PER_LONG != 64
3567 /* Fix up base address on ULI M5461 */
3568 if (chip->driver_type == AZX_DRIVER_ULI) {
3569 u16 tmp3;
3570 pci_read_config_word(pci, 0x40, &tmp3);
3571 pci_write_config_word(pci, 0x40, tmp3 | 0x10);
3572 pci_write_config_dword(pci, PCI_BASE_ADDRESS_1, 0);
3573 }
3574#endif
3575
Pavel Machek927fc862006-08-31 17:03:43 +02003576 err = pci_request_regions(pci, "ICH HD audio");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003577 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003578 return err;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003579 chip->region_requested = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003580
Pavel Machek927fc862006-08-31 17:03:43 +02003581 chip->addr = pci_resource_start(pci, 0);
Arjan van de Ven2f5ad542008-09-28 16:20:09 -07003582 chip->remap_addr = pci_ioremap_bar(pci, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003583 if (chip->remap_addr == NULL) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003584 snd_printk(KERN_ERR SFX "%s: ioremap error\n", pci_name(chip->pci));
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003585 return -ENXIO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003586 }
3587
Takashi Iwai68e7fff2006-10-23 13:40:59 +02003588 if (chip->msi)
3589 if (pci_enable_msi(pci) < 0)
3590 chip->msi = 0;
Stephen Hemminger7376d012006-08-21 19:17:46 +02003591
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003592 if (azx_acquire_irq(chip, 0) < 0)
3593 return -EBUSY;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003594
3595 pci_set_master(pci);
3596 synchronize_irq(chip->irq);
3597
Tobin Davisbcd72002008-01-15 11:23:55 +01003598 gcap = azx_readw(chip, GCAP);
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003599 snd_printdd(SFX "%s: chipset global capabilities = 0x%x\n", pci_name(chip->pci), gcap);
Tobin Davisbcd72002008-01-15 11:23:55 +01003600
Andiry Brienzadc4c2e62009-07-08 13:55:31 +08003601 /* disable SB600 64bit support for safety */
Takashi Iwai9477c582011-05-25 09:11:37 +02003602 if (chip->pci->vendor == PCI_VENDOR_ID_ATI) {
Andiry Brienzadc4c2e62009-07-08 13:55:31 +08003603 struct pci_dev *p_smbus;
3604 p_smbus = pci_get_device(PCI_VENDOR_ID_ATI,
3605 PCI_DEVICE_ID_ATI_SBX00_SMBUS,
3606 NULL);
3607 if (p_smbus) {
3608 if (p_smbus->revision < 0x30)
3609 gcap &= ~ICH6_GCAP_64OK;
3610 pci_dev_put(p_smbus);
3611 }
3612 }
Takashi Iwai09240cf2009-03-17 07:47:18 +01003613
Takashi Iwai9477c582011-05-25 09:11:37 +02003614 /* disable 64bit DMA address on some devices */
3615 if (chip->driver_caps & AZX_DCAPS_NO_64BIT) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003616 snd_printd(SFX "%s: Disabling 64bit DMA\n", pci_name(chip->pci));
Jaroslav Kysela396087e2009-12-09 10:44:47 +01003617 gcap &= ~ICH6_GCAP_64OK;
Takashi Iwai9477c582011-05-25 09:11:37 +02003618 }
Jaroslav Kysela396087e2009-12-09 10:44:47 +01003619
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003620 /* disable buffer size rounding to 128-byte multiples if supported */
Takashi Iwai7bfe0592012-01-23 17:53:39 +01003621 if (align_buffer_size >= 0)
3622 chip->align_buffer_size = !!align_buffer_size;
3623 else {
3624 if (chip->driver_caps & AZX_DCAPS_BUFSIZE)
3625 chip->align_buffer_size = 0;
3626 else if (chip->driver_caps & AZX_DCAPS_ALIGN_BUFSIZE)
3627 chip->align_buffer_size = 1;
3628 else
3629 chip->align_buffer_size = 1;
3630 }
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003631
Takashi Iwaicf7aaca2008-02-06 15:05:57 +01003632 /* allow 64bit DMA address if supported by H/W */
Takashi Iwaib21fadb2009-05-28 12:26:15 +02003633 if ((gcap & ICH6_GCAP_64OK) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64)))
Yang Hongyange9304382009-04-13 14:40:14 -07003634 pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(64));
Takashi Iwai09240cf2009-03-17 07:47:18 +01003635 else {
Yang Hongyange9304382009-04-13 14:40:14 -07003636 pci_set_dma_mask(pci, DMA_BIT_MASK(32));
3637 pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(32));
Takashi Iwai09240cf2009-03-17 07:47:18 +01003638 }
Takashi Iwaicf7aaca2008-02-06 15:05:57 +01003639
Takashi Iwai8b6ed8e2008-02-19 11:36:35 +01003640 /* read number of streams from GCAP register instead of using
3641 * hardcoded value
3642 */
3643 chip->capture_streams = (gcap >> 8) & 0x0f;
3644 chip->playback_streams = (gcap >> 12) & 0x0f;
3645 if (!chip->playback_streams && !chip->capture_streams) {
Tobin Davisbcd72002008-01-15 11:23:55 +01003646 /* gcap didn't give any info, switching to old method */
3647
3648 switch (chip->driver_type) {
3649 case AZX_DRIVER_ULI:
3650 chip->playback_streams = ULI_NUM_PLAYBACK;
3651 chip->capture_streams = ULI_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01003652 break;
3653 case AZX_DRIVER_ATIHDMI:
Andiry Xu1815b342011-12-14 16:10:27 +08003654 case AZX_DRIVER_ATIHDMI_NS:
Tobin Davisbcd72002008-01-15 11:23:55 +01003655 chip->playback_streams = ATIHDMI_NUM_PLAYBACK;
3656 chip->capture_streams = ATIHDMI_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01003657 break;
Yang, Libinc4da29c2008-11-13 11:07:07 +01003658 case AZX_DRIVER_GENERIC:
Tobin Davisbcd72002008-01-15 11:23:55 +01003659 default:
3660 chip->playback_streams = ICH6_NUM_PLAYBACK;
3661 chip->capture_streams = ICH6_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01003662 break;
3663 }
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003664 }
Takashi Iwai8b6ed8e2008-02-19 11:36:35 +01003665 chip->capture_index_offset = 0;
3666 chip->playback_index_offset = chip->capture_streams;
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003667 chip->num_streams = chip->playback_streams + chip->capture_streams;
Takashi Iwaid01ce992007-07-27 16:52:19 +02003668 chip->azx_dev = kcalloc(chip->num_streams, sizeof(*chip->azx_dev),
3669 GFP_KERNEL);
Pavel Machek927fc862006-08-31 17:03:43 +02003670 if (!chip->azx_dev) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003671 snd_printk(KERN_ERR SFX "%s: cannot malloc azx_dev\n", pci_name(chip->pci));
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003672 return -ENOMEM;
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003673 }
3674
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003675 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaieb49faa2013-03-15 09:19:11 +01003676 dsp_lock_init(&chip->azx_dev[i]);
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003677 /* allocate memory for the BDL for each stream */
3678 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
3679 snd_dma_pci_data(chip->pci),
3680 BDL_SIZE, &chip->azx_dev[i].bdl);
3681 if (err < 0) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003682 snd_printk(KERN_ERR SFX "%s: cannot allocate BDL\n", pci_name(chip->pci));
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003683 return -ENOMEM;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003684 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003685 mark_pages_wc(chip, &chip->azx_dev[i].bdl, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003686 }
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02003687 /* allocate memory for the position buffer */
Takashi Iwaid01ce992007-07-27 16:52:19 +02003688 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
3689 snd_dma_pci_data(chip->pci),
3690 chip->num_streams * 8, &chip->posbuf);
3691 if (err < 0) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003692 snd_printk(KERN_ERR SFX "%s: cannot allocate posbuf\n", pci_name(chip->pci));
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003693 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003694 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003695 mark_pages_wc(chip, &chip->posbuf, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003696 /* allocate CORB/RIRB */
Takashi Iwai81740862009-05-26 15:22:00 +02003697 err = azx_alloc_cmd_io(chip);
3698 if (err < 0)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003699 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003700
3701 /* initialize streams */
3702 azx_init_stream(chip);
3703
3704 /* initialize chip */
Takashi Iwaicb53c622007-08-10 17:21:45 +02003705 azx_init_pci(chip);
Jaroslav Kysela10e77dd2010-03-26 11:04:38 +01003706 azx_init_chip(chip, (probe_only[dev] & 2) == 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003707
3708 /* codec detection */
Pavel Machek927fc862006-08-31 17:03:43 +02003709 if (!chip->codec_mask) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003710 snd_printk(KERN_ERR SFX "%s: no codecs found!\n", pci_name(chip->pci));
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003711 return -ENODEV;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003712 }
3713
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003714 strcpy(card->driver, "HDA-Intel");
Takashi Iwai18cb7102009-04-16 10:22:24 +02003715 strlcpy(card->shortname, driver_short_names[chip->driver_type],
3716 sizeof(card->shortname));
3717 snprintf(card->longname, sizeof(card->longname),
3718 "%s at 0x%lx irq %i",
3719 card->shortname, chip->addr, chip->irq);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003720
Linus Torvalds1da177e2005-04-16 15:20:36 -07003721 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003722}
3723
Takashi Iwaicb53c622007-08-10 17:21:45 +02003724static void power_down_all_codecs(struct azx *chip)
3725{
Takashi Iwai83012a72012-08-24 18:38:08 +02003726#ifdef CONFIG_PM
Takashi Iwaicb53c622007-08-10 17:21:45 +02003727 /* The codecs were powered up in snd_hda_codec_new().
3728 * Now all initialization done, so turn them down if possible
3729 */
3730 struct hda_codec *codec;
3731 list_for_each_entry(codec, &chip->bus->codec_list, list) {
3732 snd_hda_power_down(codec);
3733 }
3734#endif
3735}
3736
Takashi Iwai97c6a3d2012-08-09 17:40:46 +02003737#ifdef CONFIG_SND_HDA_PATCH_LOADER
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003738/* callback from request_firmware_nowait() */
3739static void azx_firmware_cb(const struct firmware *fw, void *context)
3740{
3741 struct snd_card *card = context;
3742 struct azx *chip = card->private_data;
3743 struct pci_dev *pci = chip->pci;
3744
3745 if (!fw) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003746 snd_printk(KERN_ERR SFX "%s: Cannot load firmware, aborting\n",
3747 pci_name(chip->pci));
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003748 goto error;
3749 }
3750
3751 chip->fw = fw;
3752 if (!chip->disabled) {
3753 /* continue probing */
3754 if (azx_probe_continue(chip))
3755 goto error;
3756 }
3757 return; /* OK */
3758
3759 error:
3760 snd_card_free(card);
3761 pci_set_drvdata(pci, NULL);
3762}
Takashi Iwai97c6a3d2012-08-09 17:40:46 +02003763#endif
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003764
Bill Pembertone23e7a12012-12-06 12:35:10 -05003765static int azx_probe(struct pci_dev *pci,
3766 const struct pci_device_id *pci_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003767{
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003768 static int dev;
Takashi Iwaia98f90f2005-11-17 14:59:02 +01003769 struct snd_card *card;
3770 struct azx *chip;
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003771 bool probe_now;
Pavel Machek927fc862006-08-31 17:03:43 +02003772 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003773
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003774 if (dev >= SNDRV_CARDS)
3775 return -ENODEV;
3776 if (!enable[dev]) {
3777 dev++;
3778 return -ENOENT;
3779 }
3780
Takashi Iwaie58de7b2008-12-28 16:44:30 +01003781 err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card);
3782 if (err < 0) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003783 snd_printk(KERN_ERR "hda-intel: Error creating card!\n");
Takashi Iwaie58de7b2008-12-28 16:44:30 +01003784 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003785 }
3786
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003787 snd_card_set_dev(card, &pci->dev);
3788
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003789 err = azx_create(card, pci, dev, pci_id->driver_data, &chip);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003790 if (err < 0)
3791 goto out_free;
Takashi Iwai421a1252005-11-17 16:11:09 +01003792 card->private_data = chip;
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003793
3794 pci_set_drvdata(pci, card);
3795
3796 err = register_vga_switcheroo(chip);
3797 if (err < 0) {
3798 snd_printk(KERN_ERR SFX
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003799 "%s: Error registering VGA-switcheroo client\n", pci_name(pci));
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003800 goto out_free;
3801 }
3802
3803 if (check_hdmi_disabled(pci)) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003804 snd_printk(KERN_INFO SFX "%s: VGA controller is disabled\n",
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003805 pci_name(pci));
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003806 snd_printk(KERN_INFO SFX "%s: Delaying initialization\n", pci_name(pci));
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003807 chip->disabled = true;
3808 }
3809
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003810 probe_now = !chip->disabled;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003811
Takashi Iwai4918cda2012-08-09 12:33:28 +02003812#ifdef CONFIG_SND_HDA_PATCH_LOADER
3813 if (patch[dev] && *patch[dev]) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003814 snd_printk(KERN_ERR SFX "%s: Applying patch firmware '%s'\n",
3815 pci_name(pci), patch[dev]);
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003816 err = request_firmware_nowait(THIS_MODULE, true, patch[dev],
3817 &pci->dev, GFP_KERNEL, card,
3818 azx_firmware_cb);
Takashi Iwai4918cda2012-08-09 12:33:28 +02003819 if (err < 0)
3820 goto out_free;
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003821 probe_now = false; /* continued in azx_firmware_cb() */
Takashi Iwai4918cda2012-08-09 12:33:28 +02003822 }
3823#endif /* CONFIG_SND_HDA_PATCH_LOADER */
3824
Wang Xingchao99a20082013-05-30 22:07:10 +08003825 /* continue probing in work context, avoid request_module deadlock */
3826 if (probe_now && (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)) {
3827#ifdef CONFIG_SND_HDA_I915
3828 probe_now = false;
3829 schedule_work(&chip->probe_work);
3830#else
3831 snd_printk(KERN_ERR SFX "Haswell must build in CONFIG_SND_HDA_I915\n");
3832#endif
3833 }
3834
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003835 if (probe_now) {
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003836 err = azx_probe_continue(chip);
3837 if (err < 0)
3838 goto out_free;
3839 }
3840
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003841 dev++;
Daniel J Blueman44728e92012-12-18 23:59:33 +08003842 complete_all(&chip->probe_wait);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003843 return 0;
3844
3845out_free:
3846 snd_card_free(card);
3847 return err;
3848}
3849
Takashi Iwai48c8b0e2012-12-07 07:40:35 +01003850static int azx_probe_continue(struct azx *chip)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003851{
Wang Xingchaoc67e2222013-05-30 22:07:08 +08003852 struct pci_dev *pci = chip->pci;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003853 int dev = chip->dev_index;
3854 int err;
3855
Wang Xingchao99a20082013-05-30 22:07:10 +08003856 /* Request power well for Haswell HDA controller and codec */
3857 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL) {
David Henningssonc841ad22013-08-19 13:32:30 +02003858#ifdef CONFIG_SND_HDA_I915
Wang Xingchao99a20082013-05-30 22:07:10 +08003859 err = hda_i915_init();
3860 if (err < 0) {
3861 snd_printk(KERN_ERR SFX "Error request power-well from i915\n");
3862 goto out_free;
3863 }
David Henningssonc841ad22013-08-19 13:32:30 +02003864#endif
Wang Xingchao99a20082013-05-30 22:07:10 +08003865 hda_display_power(true);
3866 }
3867
Takashi Iwai5c906802013-05-30 22:07:09 +08003868 err = azx_first_init(chip);
3869 if (err < 0)
3870 goto out_free;
3871
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +01003872#ifdef CONFIG_SND_HDA_INPUT_BEEP
3873 chip->beep_mode = beep_mode[dev];
3874#endif
3875
Linus Torvalds1da177e2005-04-16 15:20:36 -07003876 /* create codec instances */
Takashi Iwaia1e21c92009-06-17 09:33:52 +02003877 err = azx_codec_create(chip, model[dev]);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003878 if (err < 0)
3879 goto out_free;
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003880#ifdef CONFIG_SND_HDA_PATCH_LOADER
Takashi Iwai4918cda2012-08-09 12:33:28 +02003881 if (chip->fw) {
3882 err = snd_hda_load_patch(chip->bus, chip->fw->size,
3883 chip->fw->data);
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003884 if (err < 0)
3885 goto out_free;
Takashi Iwaie39ae852012-11-22 16:18:13 +01003886#ifndef CONFIG_PM
Takashi Iwai4918cda2012-08-09 12:33:28 +02003887 release_firmware(chip->fw); /* no longer needed */
3888 chip->fw = NULL;
Takashi Iwaie39ae852012-11-22 16:18:13 +01003889#endif
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003890 }
3891#endif
Jaroslav Kysela10e77dd2010-03-26 11:04:38 +01003892 if ((probe_only[dev] & 1) == 0) {
Takashi Iwaia1e21c92009-06-17 09:33:52 +02003893 err = azx_codec_configure(chip);
3894 if (err < 0)
3895 goto out_free;
3896 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003897
3898 /* create PCM streams */
Takashi Iwai176d5332008-07-30 15:01:44 +02003899 err = snd_hda_build_pcms(chip->bus);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003900 if (err < 0)
3901 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003902
3903 /* create mixer controls */
Takashi Iwaid01ce992007-07-27 16:52:19 +02003904 err = azx_mixer_create(chip);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003905 if (err < 0)
3906 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003907
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003908 err = snd_card_register(chip->card);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003909 if (err < 0)
3910 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003911
Takashi Iwaicb53c622007-08-10 17:21:45 +02003912 chip->running = 1;
3913 power_down_all_codecs(chip);
Takashi Iwai0cbf0092008-10-29 16:18:25 +01003914 azx_notifier_register(chip);
Takashi Iwai65fcd412012-08-14 17:13:32 +02003915 azx_add_card_list(chip);
Wang Xingchaoc67e2222013-05-30 22:07:08 +08003916 if (chip->driver_caps & AZX_DCAPS_PM_RUNTIME)
3917 pm_runtime_put_noidle(&pci->dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003918
Takashi Iwai91219472012-04-26 12:13:25 +02003919 return 0;
3920
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003921out_free:
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003922 chip->init_failed = 1;
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003923 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003924}
3925
Bill Pembertone23e7a12012-12-06 12:35:10 -05003926static void azx_remove(struct pci_dev *pci)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003927{
Takashi Iwai91219472012-04-26 12:13:25 +02003928 struct snd_card *card = pci_get_drvdata(pci);
Mengdong Linb8dfc4622012-08-23 17:32:30 +08003929
Takashi Iwai91219472012-04-26 12:13:25 +02003930 if (card)
3931 snd_card_free(card);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003932}
3933
3934/* PCI IDs */
Alexey Dobriyancebe41d2010-02-06 00:21:03 +02003935static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
Seth Heasleyd2f2fcd2010-01-12 17:03:35 -08003936 /* CPT */
Takashi Iwai9477c582011-05-25 09:11:37 +02003937 { PCI_DEVICE(0x8086, 0x1c20),
Takashi Iwaid7dab4d2013-01-08 13:51:30 +01003938 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM },
Seth Heasleycea310e2010-09-10 16:29:56 -07003939 /* PBG */
Takashi Iwai9477c582011-05-25 09:11:37 +02003940 { PCI_DEVICE(0x8086, 0x1d20),
Takashi Iwaid7dab4d2013-01-08 13:51:30 +01003941 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM },
Seth Heasleyd2edeb72011-04-20 10:59:57 -07003942 /* Panther Point */
Takashi Iwai9477c582011-05-25 09:11:37 +02003943 { PCI_DEVICE(0x8086, 0x1e20),
Takashi Iwaid7dab4d2013-01-08 13:51:30 +01003944 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM },
Seth Heasley8bc039a2012-01-23 16:24:31 -08003945 /* Lynx Point */
3946 { PCI_DEVICE(0x8086, 0x8c20),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003947 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
James Ralston884b0882013-02-08 17:29:40 -08003948 /* Wellsburg */
3949 { PCI_DEVICE(0x8086, 0x8d20),
3950 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
3951 { PCI_DEVICE(0x8086, 0x8d21),
3952 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
James Ralston144dad92012-08-09 09:38:59 -07003953 /* Lynx Point-LP */
3954 { PCI_DEVICE(0x8086, 0x9c20),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003955 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
James Ralston144dad92012-08-09 09:38:59 -07003956 /* Lynx Point-LP */
3957 { PCI_DEVICE(0x8086, 0x9c21),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003958 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
Wang Xingchaoe926f2c2012-06-13 10:23:51 +08003959 /* Haswell */
Wang Xingchao4a7c5162013-02-01 22:42:19 +08003960 { PCI_DEVICE(0x8086, 0x0a0c),
Wang Xingchao99a20082013-05-30 22:07:10 +08003961 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH |
3962 AZX_DCAPS_I915_POWERWELL },
Wang Xingchaoe926f2c2012-06-13 10:23:51 +08003963 { PCI_DEVICE(0x8086, 0x0c0c),
Wang Xingchao99a20082013-05-30 22:07:10 +08003964 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH |
3965 AZX_DCAPS_I915_POWERWELL },
Wang Xingchaod279fae2012-09-17 13:10:23 +08003966 { PCI_DEVICE(0x8086, 0x0d0c),
Wang Xingchao99a20082013-05-30 22:07:10 +08003967 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH |
3968 AZX_DCAPS_I915_POWERWELL },
Pierre-Louis Bossart99df18b2012-09-21 18:39:07 -05003969 /* 5 Series/3400 */
3970 { PCI_DEVICE(0x8086, 0x3b56),
Takashi Iwai2c1350f2013-02-14 09:44:55 +01003971 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_NOPM },
Takashi Iwaif748abc2013-01-29 10:12:23 +01003972 /* Poulsbo */
Takashi Iwai9477c582011-05-25 09:11:37 +02003973 { PCI_DEVICE(0x8086, 0x811b),
Takashi Iwaif748abc2013-01-29 10:12:23 +01003974 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_NOPM },
3975 /* Oaktrail */
Li Peng09904b92011-12-28 15:17:26 +00003976 { PCI_DEVICE(0x8086, 0x080a),
Takashi Iwaif748abc2013-01-29 10:12:23 +01003977 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_NOPM },
Chew, Chiau Eee44007e2013-05-16 15:36:12 +08003978 /* BayTrail */
3979 { PCI_DEVICE(0x8086, 0x0f04),
3980 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM },
David Henningsson645e9032011-12-14 15:52:30 +08003981 /* ICH */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003982 { PCI_DEVICE(0x8086, 0x2668),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003983 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3984 AZX_DCAPS_BUFSIZE }, /* ICH6 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003985 { PCI_DEVICE(0x8086, 0x27d8),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003986 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3987 AZX_DCAPS_BUFSIZE }, /* ICH7 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003988 { PCI_DEVICE(0x8086, 0x269a),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003989 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3990 AZX_DCAPS_BUFSIZE }, /* ESB2 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003991 { PCI_DEVICE(0x8086, 0x284b),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003992 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3993 AZX_DCAPS_BUFSIZE }, /* ICH8 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003994 { PCI_DEVICE(0x8086, 0x293e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003995 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3996 AZX_DCAPS_BUFSIZE }, /* ICH9 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003997 { PCI_DEVICE(0x8086, 0x293f),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003998 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3999 AZX_DCAPS_BUFSIZE }, /* ICH9 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02004000 { PCI_DEVICE(0x8086, 0x3a3e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05004001 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
4002 AZX_DCAPS_BUFSIZE }, /* ICH10 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02004003 { PCI_DEVICE(0x8086, 0x3a6e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05004004 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
4005 AZX_DCAPS_BUFSIZE }, /* ICH10 */
Takashi Iwaib6864532010-09-15 10:17:26 +02004006 /* Generic Intel */
4007 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_ANY_ID),
4008 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
4009 .class_mask = 0xffffff,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05004010 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_BUFSIZE },
Takashi Iwai9477c582011-05-25 09:11:37 +02004011 /* ATI SB 450/600/700/800/900 */
4012 { PCI_DEVICE(0x1002, 0x437b),
4013 .driver_data = AZX_DRIVER_ATI | AZX_DCAPS_PRESET_ATI_SB },
4014 { PCI_DEVICE(0x1002, 0x4383),
4015 .driver_data = AZX_DRIVER_ATI | AZX_DCAPS_PRESET_ATI_SB },
4016 /* AMD Hudson */
4017 { PCI_DEVICE(0x1022, 0x780d),
4018 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_SB },
Takashi Iwai87218e92008-02-21 08:13:11 +01004019 /* ATI HDMI */
Takashi Iwai9477c582011-05-25 09:11:37 +02004020 { PCI_DEVICE(0x1002, 0x793b),
4021 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
4022 { PCI_DEVICE(0x1002, 0x7919),
4023 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
4024 { PCI_DEVICE(0x1002, 0x960f),
4025 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
4026 { PCI_DEVICE(0x1002, 0x970f),
4027 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
4028 { PCI_DEVICE(0x1002, 0xaa00),
4029 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
4030 { PCI_DEVICE(0x1002, 0xaa08),
4031 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
4032 { PCI_DEVICE(0x1002, 0xaa10),
4033 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
4034 { PCI_DEVICE(0x1002, 0xaa18),
4035 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
4036 { PCI_DEVICE(0x1002, 0xaa20),
4037 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
4038 { PCI_DEVICE(0x1002, 0xaa28),
4039 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
4040 { PCI_DEVICE(0x1002, 0xaa30),
4041 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
4042 { PCI_DEVICE(0x1002, 0xaa38),
4043 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
4044 { PCI_DEVICE(0x1002, 0xaa40),
4045 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
4046 { PCI_DEVICE(0x1002, 0xaa48),
4047 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
Andiry Xu1815b342011-12-14 16:10:27 +08004048 { PCI_DEVICE(0x1002, 0x9902),
4049 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
4050 { PCI_DEVICE(0x1002, 0xaaa0),
4051 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
4052 { PCI_DEVICE(0x1002, 0xaaa8),
4053 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
4054 { PCI_DEVICE(0x1002, 0xaab0),
4055 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
Takashi Iwai87218e92008-02-21 08:13:11 +01004056 /* VIA VT8251/VT8237A */
Takashi Iwai9477c582011-05-25 09:11:37 +02004057 { PCI_DEVICE(0x1106, 0x3288),
4058 .driver_data = AZX_DRIVER_VIA | AZX_DCAPS_POSFIX_VIA },
Annie Liu754fdff2012-06-08 19:18:39 +08004059 /* VIA GFX VT7122/VX900 */
4060 { PCI_DEVICE(0x1106, 0x9170), .driver_data = AZX_DRIVER_GENERIC },
4061 /* VIA GFX VT6122/VX11 */
4062 { PCI_DEVICE(0x1106, 0x9140), .driver_data = AZX_DRIVER_GENERIC },
Takashi Iwai87218e92008-02-21 08:13:11 +01004063 /* SIS966 */
4064 { PCI_DEVICE(0x1039, 0x7502), .driver_data = AZX_DRIVER_SIS },
4065 /* ULI M5461 */
4066 { PCI_DEVICE(0x10b9, 0x5461), .driver_data = AZX_DRIVER_ULI },
4067 /* NVIDIA MCP */
Takashi Iwai0c2fd1bf42009-12-18 16:41:39 +01004068 { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID),
4069 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
4070 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02004071 .driver_data = AZX_DRIVER_NVIDIA | AZX_DCAPS_PRESET_NVIDIA },
Kailang Yangf2690022008-05-27 11:44:55 +02004072 /* Teradici */
Takashi Iwai9477c582011-05-25 09:11:37 +02004073 { PCI_DEVICE(0x6549, 0x1200),
4074 .driver_data = AZX_DRIVER_TERA | AZX_DCAPS_NO_64BIT },
Lars R. Damerowf0b3da92012-11-02 13:10:39 -07004075 { PCI_DEVICE(0x6549, 0x2200),
4076 .driver_data = AZX_DRIVER_TERA | AZX_DCAPS_NO_64BIT },
Takashi Iwai4e01f542009-04-16 08:53:34 +02004077 /* Creative X-Fi (CA0110-IBG) */
Takashi Iwaif2a8eca2012-06-11 15:51:54 +02004078 /* CTHDA chips */
4079 { PCI_DEVICE(0x1102, 0x0010),
4080 .driver_data = AZX_DRIVER_CTHDA | AZX_DCAPS_PRESET_CTHDA },
4081 { PCI_DEVICE(0x1102, 0x0012),
4082 .driver_data = AZX_DRIVER_CTHDA | AZX_DCAPS_PRESET_CTHDA },
Takashi Iwai313f6e22009-05-18 12:40:52 +02004083#if !defined(CONFIG_SND_CTXFI) && !defined(CONFIG_SND_CTXFI_MODULE)
4084 /* the following entry conflicts with snd-ctxfi driver,
4085 * as ctxfi driver mutates from HD-audio to native mode with
4086 * a special command sequence.
4087 */
Takashi Iwai4e01f542009-04-16 08:53:34 +02004088 { PCI_DEVICE(PCI_VENDOR_ID_CREATIVE, PCI_ANY_ID),
4089 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
4090 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02004091 .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
Takashi Iwai69f9ba92011-11-06 13:49:13 +01004092 AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB },
Takashi Iwai313f6e22009-05-18 12:40:52 +02004093#else
4094 /* this entry seems still valid -- i.e. without emu20kx chip */
Takashi Iwai9477c582011-05-25 09:11:37 +02004095 { PCI_DEVICE(0x1102, 0x0009),
4096 .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
Takashi Iwai69f9ba92011-11-06 13:49:13 +01004097 AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB },
Takashi Iwai313f6e22009-05-18 12:40:52 +02004098#endif
Otavio Salvadore35d4b12010-09-26 23:35:06 -03004099 /* Vortex86MX */
4100 { PCI_DEVICE(0x17f3, 0x3010), .driver_data = AZX_DRIVER_GENERIC },
Bankim Bhavsar0f0714c52011-01-17 15:23:21 +01004101 /* VMware HDAudio */
4102 { PCI_DEVICE(0x15ad, 0x1977), .driver_data = AZX_DRIVER_GENERIC },
Andiry Brienza9176b672009-07-17 11:32:32 +08004103 /* AMD/ATI Generic, PCI class code and Vendor ID for HD Audio */
Yang, Libinc4da29c2008-11-13 11:07:07 +01004104 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_ANY_ID),
4105 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
4106 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02004107 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_HDMI },
Andiry Brienza9176b672009-07-17 11:32:32 +08004108 { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_ANY_ID),
4109 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
4110 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02004111 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_HDMI },
Linus Torvalds1da177e2005-04-16 15:20:36 -07004112 { 0, }
4113};
4114MODULE_DEVICE_TABLE(pci, azx_ids);
4115
4116/* pci_driver definition */
Takashi Iwaie9f66d92012-04-24 12:25:00 +02004117static struct pci_driver azx_driver = {
Takashi Iwai3733e422011-06-10 16:20:20 +02004118 .name = KBUILD_MODNAME,
Linus Torvalds1da177e2005-04-16 15:20:36 -07004119 .id_table = azx_ids,
4120 .probe = azx_probe,
Bill Pembertone23e7a12012-12-06 12:35:10 -05004121 .remove = azx_remove,
Takashi Iwai68cb2b52012-07-02 15:20:37 +02004122 .driver = {
4123 .pm = AZX_PM_OPS,
4124 },
Linus Torvalds1da177e2005-04-16 15:20:36 -07004125};
4126
Takashi Iwaie9f66d92012-04-24 12:25:00 +02004127module_pci_driver(azx_driver);