blob: 6eb09418d08ef1c86bdc9bc503b6fafb6798bc8c [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},"
James Ralston4eeca492013-11-04 09:27:45 -0800172 "{Intel, WPT_LP},"
Wang Xingchaoe926f2c2012-06-13 10:23:51 +0800173 "{Intel, HPT},"
Seth Heasleycea310e2010-09-10 16:29:56 -0700174 "{Intel, PBG},"
Tobin Davis4979bca2008-01-30 08:13:55 +0100175 "{Intel, SCH},"
Takashi Iwaifc20a562005-05-12 15:00:41 +0200176 "{ATI, SB450},"
Felix Kuehling89be83f2006-03-31 12:33:59 +0200177 "{ATI, SB600},"
Felix Kuehling778b6e12006-05-17 11:22:21 +0200178 "{ATI, RS600},"
Felix Kuehling5b15c952006-10-16 12:49:47 +0200179 "{ATI, RS690},"
Wolke Liue6db1112007-04-27 12:20:57 +0200180 "{ATI, RS780},"
181 "{ATI, R600},"
Herton Ronaldo Krzesinski2797f722007-11-05 18:21:56 +0100182 "{ATI, RV630},"
183 "{ATI, RV610},"
Wolke Liu27da1832007-11-16 11:06:30 +0100184 "{ATI, RV670},"
185 "{ATI, RV635},"
186 "{ATI, RV620},"
187 "{ATI, RV770},"
Takashi Iwaifc20a562005-05-12 15:00:41 +0200188 "{VIA, VT8251},"
Takashi Iwai47672312005-08-12 16:44:04 +0200189 "{VIA, VT8237A},"
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200190 "{SiS, SIS966},"
191 "{ULI, M5461}}");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700192MODULE_DESCRIPTION("Intel HDA driver");
193
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200194#if defined(CONFIG_PM) && defined(CONFIG_VGA_SWITCHEROO)
Takashi Iwaif8f1bec2014-02-06 18:14:03 +0100195#if IS_ENABLED(CONFIG_SND_HDA_CODEC_HDMI)
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200196#define SUPPORT_VGA_SWITCHEROO
197#endif
198#endif
199
200
Takashi Iwaicb53c622007-08-10 17:21:45 +0200201/*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700202 * registers
203 */
204#define ICH6_REG_GCAP 0x00
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200205#define ICH6_GCAP_64OK (1 << 0) /* 64bit address support */
206#define ICH6_GCAP_NSDO (3 << 1) /* # of serial data out signals */
207#define ICH6_GCAP_BSS (31 << 3) /* # of bidirectional streams */
208#define ICH6_GCAP_ISS (15 << 8) /* # of input streams */
209#define ICH6_GCAP_OSS (15 << 12) /* # of output streams */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700210#define ICH6_REG_VMIN 0x02
211#define ICH6_REG_VMAJ 0x03
212#define ICH6_REG_OUTPAY 0x04
213#define ICH6_REG_INPAY 0x06
214#define ICH6_REG_GCTL 0x08
Takashi Iwai8a933ec2009-05-31 09:28:12 +0200215#define ICH6_GCTL_RESET (1 << 0) /* controller reset */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200216#define ICH6_GCTL_FCNTRL (1 << 1) /* flush control */
217#define ICH6_GCTL_UNSOL (1 << 8) /* accept unsol. response enable */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700218#define ICH6_REG_WAKEEN 0x0c
219#define ICH6_REG_STATESTS 0x0e
220#define ICH6_REG_GSTS 0x10
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200221#define ICH6_GSTS_FSTS (1 << 1) /* flush status */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700222#define ICH6_REG_INTCTL 0x20
223#define ICH6_REG_INTSTS 0x24
Jaroslav Kyselae5463722010-05-11 10:21:46 +0200224#define ICH6_REG_WALLCLK 0x30 /* 24Mhz source */
Takashi Iwai8b0bd222011-06-10 14:56:26 +0200225#define ICH6_REG_OLD_SSYNC 0x34 /* SSYNC for old ICH */
226#define ICH6_REG_SSYNC 0x38
Linus Torvalds1da177e2005-04-16 15:20:36 -0700227#define ICH6_REG_CORBLBASE 0x40
228#define ICH6_REG_CORBUBASE 0x44
229#define ICH6_REG_CORBWP 0x48
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200230#define ICH6_REG_CORBRP 0x4a
231#define ICH6_CORBRP_RST (1 << 15) /* read pointer reset */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700232#define ICH6_REG_CORBCTL 0x4c
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200233#define ICH6_CORBCTL_RUN (1 << 1) /* enable DMA */
234#define ICH6_CORBCTL_CMEIE (1 << 0) /* enable memory error irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700235#define ICH6_REG_CORBSTS 0x4d
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200236#define ICH6_CORBSTS_CMEI (1 << 0) /* memory error indication */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700237#define ICH6_REG_CORBSIZE 0x4e
238
239#define ICH6_REG_RIRBLBASE 0x50
240#define ICH6_REG_RIRBUBASE 0x54
241#define ICH6_REG_RIRBWP 0x58
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200242#define ICH6_RIRBWP_RST (1 << 15) /* write pointer reset */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700243#define ICH6_REG_RINTCNT 0x5a
244#define ICH6_REG_RIRBCTL 0x5c
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200245#define ICH6_RBCTL_IRQ_EN (1 << 0) /* enable IRQ */
246#define ICH6_RBCTL_DMA_EN (1 << 1) /* enable DMA */
247#define ICH6_RBCTL_OVERRUN_EN (1 << 2) /* enable overrun irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700248#define ICH6_REG_RIRBSTS 0x5d
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200249#define ICH6_RBSTS_IRQ (1 << 0) /* response irq */
250#define ICH6_RBSTS_OVERRUN (1 << 2) /* overrun irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700251#define ICH6_REG_RIRBSIZE 0x5e
252
253#define ICH6_REG_IC 0x60
254#define ICH6_REG_IR 0x64
255#define ICH6_REG_IRS 0x68
256#define ICH6_IRS_VALID (1<<1)
257#define ICH6_IRS_BUSY (1<<0)
258
259#define ICH6_REG_DPLBASE 0x70
260#define ICH6_REG_DPUBASE 0x74
261#define ICH6_DPLBASE_ENABLE 0x1 /* Enable position buffer */
262
263/* SD offset: SDI0=0x80, SDI1=0xa0, ... SDO3=0x160 */
264enum { SDI0, SDI1, SDI2, SDI3, SDO0, SDO1, SDO2, SDO3 };
265
266/* stream register offsets from stream base */
267#define ICH6_REG_SD_CTL 0x00
268#define ICH6_REG_SD_STS 0x03
269#define ICH6_REG_SD_LPIB 0x04
270#define ICH6_REG_SD_CBL 0x08
271#define ICH6_REG_SD_LVI 0x0c
272#define ICH6_REG_SD_FIFOW 0x0e
273#define ICH6_REG_SD_FIFOSIZE 0x10
274#define ICH6_REG_SD_FORMAT 0x12
275#define ICH6_REG_SD_BDLPL 0x18
276#define ICH6_REG_SD_BDLPU 0x1c
277
278/* PCI space */
279#define ICH6_PCIREG_TCSEL 0x44
280
281/*
282 * other constants
283 */
284
285/* max number of SDs */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200286/* ICH, ATI and VIA have 4 playback and 4 capture */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200287#define ICH6_NUM_CAPTURE 4
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200288#define ICH6_NUM_PLAYBACK 4
289
290/* ULI has 6 playback and 5 capture */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200291#define ULI_NUM_CAPTURE 5
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200292#define ULI_NUM_PLAYBACK 6
293
Takashi Iwai7546abf2013-12-09 10:18:09 +0100294/* ATI HDMI may have up to 8 playbacks and 0 capture */
Felix Kuehling778b6e12006-05-17 11:22:21 +0200295#define ATIHDMI_NUM_CAPTURE 0
Takashi Iwai7546abf2013-12-09 10:18:09 +0100296#define ATIHDMI_NUM_PLAYBACK 8
Felix Kuehling778b6e12006-05-17 11:22:21 +0200297
Kailang Yangf2690022008-05-27 11:44:55 +0200298/* TERA has 4 playback and 3 capture */
299#define TERA_NUM_CAPTURE 3
300#define TERA_NUM_PLAYBACK 4
301
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200302/* this number is statically defined for simplicity */
303#define MAX_AZX_DEV 16
304
Linus Torvalds1da177e2005-04-16 15:20:36 -0700305/* max number of fragments - we may use more if allocating more pages for BDL */
Takashi Iwai4ce107b2008-02-06 14:50:19 +0100306#define BDL_SIZE 4096
307#define AZX_MAX_BDL_ENTRIES (BDL_SIZE / 16)
308#define AZX_MAX_FRAG 32
Linus Torvalds1da177e2005-04-16 15:20:36 -0700309/* max buffer size - no h/w limit, you can increase as you like */
310#define AZX_MAX_BUF_SIZE (1024*1024*1024)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700311
312/* RIRB int mask: overrun[2], response[0] */
313#define RIRB_INT_RESPONSE 0x01
314#define RIRB_INT_OVERRUN 0x04
315#define RIRB_INT_MASK 0x05
316
Takashi Iwai2f5983f2008-09-03 16:00:44 +0200317/* STATESTS int mask: S3,SD2,SD1,SD0 */
Wei Ni7445dfc2010-03-03 15:05:53 +0800318#define AZX_MAX_CODECS 8
319#define AZX_DEFAULT_CODECS 4
Wu Fengguangdeadff12009-08-01 18:45:16 +0800320#define STATESTS_INT_MASK ((1 << AZX_MAX_CODECS) - 1)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700321
322/* SD_CTL bits */
323#define SD_CTL_STREAM_RESET 0x01 /* stream reset bit */
324#define SD_CTL_DMA_START 0x02 /* stream DMA start bit */
Takashi Iwai850f0e52008-03-18 17:11:05 +0100325#define SD_CTL_STRIPE (3 << 16) /* stripe control */
326#define SD_CTL_TRAFFIC_PRIO (1 << 18) /* traffic priority */
327#define SD_CTL_DIR (1 << 19) /* bi-directional stream */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700328#define SD_CTL_STREAM_TAG_MASK (0xf << 20)
329#define SD_CTL_STREAM_TAG_SHIFT 20
330
331/* SD_CTL and SD_STS */
332#define SD_INT_DESC_ERR 0x10 /* descriptor error interrupt */
333#define SD_INT_FIFO_ERR 0x08 /* FIFO error interrupt */
334#define SD_INT_COMPLETE 0x04 /* completion interrupt */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200335#define SD_INT_MASK (SD_INT_DESC_ERR|SD_INT_FIFO_ERR|\
336 SD_INT_COMPLETE)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700337
338/* SD_STS */
339#define SD_STS_FIFO_READY 0x20 /* FIFO ready */
340
341/* INTCTL and INTSTS */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200342#define ICH6_INT_ALL_STREAM 0xff /* all stream interrupts */
343#define ICH6_INT_CTRL_EN 0x40000000 /* controller interrupt enable bit */
344#define ICH6_INT_GLOBAL_EN 0x80000000 /* global interrupt enable bit */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700345
Linus Torvalds1da177e2005-04-16 15:20:36 -0700346/* below are so far hardcoded - should read registers in future */
347#define ICH6_MAX_CORB_ENTRIES 256
348#define ICH6_MAX_RIRB_ENTRIES 256
349
Takashi Iwaic74db862005-05-12 14:26:27 +0200350/* position fix mode */
351enum {
Takashi Iwai0be3b5d2005-09-05 17:11:40 +0200352 POS_FIX_AUTO,
Takashi Iwaid2e1c972008-06-10 17:53:34 +0200353 POS_FIX_LPIB,
Takashi Iwai0be3b5d2005-09-05 17:11:40 +0200354 POS_FIX_POSBUF,
David Henningsson4cb36312010-09-30 10:12:50 +0200355 POS_FIX_VIACOMBO,
Takashi Iwaia6f2fd52012-02-28 11:58:40 +0100356 POS_FIX_COMBO,
Takashi Iwaic74db862005-05-12 14:26:27 +0200357};
Linus Torvalds1da177e2005-04-16 15:20:36 -0700358
Frederick Lif5d40b32005-05-12 14:55:20 +0200359/* Defines for ATI HD Audio support in SB450 south bridge */
Frederick Lif5d40b32005-05-12 14:55:20 +0200360#define ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR 0x42
361#define ATI_SB450_HDAUDIO_ENABLE_SNOOP 0x02
362
Vinod Gda3fca22005-09-13 18:49:12 +0200363/* Defines for Nvidia HDA support */
364#define NVIDIA_HDA_TRANSREG_ADDR 0x4e
365#define NVIDIA_HDA_ENABLE_COHBITS 0x0f
Peer Chen320dcc32008-08-20 16:43:24 -0700366#define NVIDIA_HDA_ISTRM_COH 0x4d
367#define NVIDIA_HDA_OSTRM_COH 0x4c
368#define NVIDIA_HDA_ENABLE_COHBIT 0x01
Frederick Lif5d40b32005-05-12 14:55:20 +0200369
Takashi Iwai90a5ad52008-02-22 18:36:22 +0100370/* Defines for Intel SCH HDA snoop control */
371#define INTEL_SCH_HDA_DEVC 0x78
372#define INTEL_SCH_HDA_DEVC_NOSNOOP (0x1<<11)
373
Joseph Chan0e153472008-08-26 14:38:03 +0200374/* Define IN stream 0 FIFO size offset in VIA controller */
375#define VIA_IN_STREAM0_FIFO_SIZE_OFFSET 0x90
376/* Define VIA HD Audio Device ID*/
377#define VIA_HDAC_DEVICE_ID 0x3288
378
Yang, Libinc4da29c2008-11-13 11:07:07 +0100379/* HD Audio class code */
380#define PCI_CLASS_MULTIMEDIA_HD_AUDIO 0x0403
Takashi Iwai90a5ad52008-02-22 18:36:22 +0100381
Linus Torvalds1da177e2005-04-16 15:20:36 -0700382/*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700383 */
384
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100385struct azx_dev {
Takashi Iwai4ce107b2008-02-06 14:50:19 +0100386 struct snd_dma_buffer bdl; /* BDL buffer */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200387 u32 *posbuf; /* position buffer pointer */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700388
Takashi Iwaid01ce992007-07-27 16:52:19 +0200389 unsigned int bufsize; /* size of the play buffer in bytes */
Takashi Iwai9ad593f2008-05-16 12:34:47 +0200390 unsigned int period_bytes; /* size of the period in bytes */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200391 unsigned int frags; /* number for period in the play buffer */
392 unsigned int fifo_size; /* FIFO size */
Jaroslav Kyselae5463722010-05-11 10:21:46 +0200393 unsigned long start_wallclk; /* start + minimum wallclk */
394 unsigned long period_wallclk; /* wallclk for period */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700395
Takashi Iwaid01ce992007-07-27 16:52:19 +0200396 void __iomem *sd_addr; /* stream descriptor pointer */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700397
Takashi Iwaid01ce992007-07-27 16:52:19 +0200398 u32 sd_int_sta_mask; /* stream int status mask */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700399
400 /* pcm support */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200401 struct snd_pcm_substream *substream; /* assigned substream,
402 * set in PCM open
403 */
404 unsigned int format_val; /* format value to be set in the
405 * controller and the codec
406 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700407 unsigned char stream_tag; /* assigned stream */
408 unsigned char index; /* stream index */
Takashi Iwaid5cf9912011-10-06 10:07:58 +0200409 int assigned_key; /* last device# key assigned to */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700410
Pavel Machek927fc862006-08-31 17:03:43 +0200411 unsigned int opened :1;
412 unsigned int running :1;
Takashi Iwai675f25d2008-06-10 17:53:20 +0200413 unsigned int irq_pending :1;
Takashi Iwaieb49faa2013-03-15 09:19:11 +0100414 unsigned int prepared:1;
415 unsigned int locked:1;
Joseph Chan0e153472008-08-26 14:38:03 +0200416 /*
417 * For VIA:
418 * A flag to ensure DMA position is 0
419 * when link position is not greater than FIFO size
420 */
421 unsigned int insufficient :1;
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200422 unsigned int wc_marked:1;
Takashi Iwai915bf292012-09-11 15:19:10 +0200423 unsigned int no_period_wakeup:1;
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -0500424
425 struct timecounter azx_tc;
426 struct cyclecounter azx_cc;
Takashi Iwaieb49faa2013-03-15 09:19:11 +0100427
Takashi Iwaie8648e52013-12-06 17:15:01 +0100428 int delay_negative_threshold;
429
Takashi Iwaieb49faa2013-03-15 09:19:11 +0100430#ifdef CONFIG_SND_HDA_DSP_LOADER
431 struct mutex dsp_mutex;
432#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700433};
434
Takashi Iwaieb49faa2013-03-15 09:19:11 +0100435/* DSP lock helpers */
436#ifdef CONFIG_SND_HDA_DSP_LOADER
437#define dsp_lock_init(dev) mutex_init(&(dev)->dsp_mutex)
438#define dsp_lock(dev) mutex_lock(&(dev)->dsp_mutex)
439#define dsp_unlock(dev) mutex_unlock(&(dev)->dsp_mutex)
440#define dsp_is_locked(dev) ((dev)->locked)
441#else
442#define dsp_lock_init(dev) do {} while (0)
443#define dsp_lock(dev) do {} while (0)
444#define dsp_unlock(dev) do {} while (0)
445#define dsp_is_locked(dev) 0
446#endif
447
Linus Torvalds1da177e2005-04-16 15:20:36 -0700448/* CORB/RIRB */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100449struct azx_rb {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700450 u32 *buf; /* CORB/RIRB buffer
451 * Each CORB entry is 4byte, RIRB is 8byte
452 */
453 dma_addr_t addr; /* physical address of CORB/RIRB buffer */
454 /* for RIRB */
455 unsigned short rp, wp; /* read/write pointers */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800456 int cmds[AZX_MAX_CODECS]; /* number of pending requests */
457 u32 res[AZX_MAX_CODECS]; /* last read value */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700458};
459
Takashi Iwai01b65bf2011-11-24 14:31:46 +0100460struct azx_pcm {
461 struct azx *chip;
462 struct snd_pcm *pcm;
463 struct hda_codec *codec;
464 struct hda_pcm_stream *hinfo[2];
465 struct list_head list;
466};
467
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100468struct azx {
469 struct snd_card *card;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700470 struct pci_dev *pci;
Takashi Iwai555e2192008-06-10 17:53:34 +0200471 int dev_index;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700472
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200473 /* chip type specific */
474 int driver_type;
Takashi Iwai9477c582011-05-25 09:11:37 +0200475 unsigned int driver_caps;
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200476 int playback_streams;
477 int playback_index_offset;
478 int capture_streams;
479 int capture_index_offset;
480 int num_streams;
481
Linus Torvalds1da177e2005-04-16 15:20:36 -0700482 /* pci resources */
483 unsigned long addr;
484 void __iomem *remap_addr;
485 int irq;
486
487 /* locks */
488 spinlock_t reg_lock;
Ingo Molnar62932df2006-01-16 16:34:20 +0100489 struct mutex open_mutex;
Takashi Iwaif4c482a2012-12-04 15:09:23 +0100490 struct completion probe_wait;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700491
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200492 /* streams (x num_streams) */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100493 struct azx_dev *azx_dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700494
495 /* PCM */
Takashi Iwai01b65bf2011-11-24 14:31:46 +0100496 struct list_head pcm_list; /* azx_pcm list */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700497
498 /* HD codec */
499 unsigned short codec_mask;
Takashi Iwaif1eaaee2009-02-13 08:16:55 +0100500 int codec_probe_mask; /* copied from probe_mask option */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700501 struct hda_bus *bus;
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +0100502 unsigned int beep_mode;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700503
504 /* CORB/RIRB */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100505 struct azx_rb corb;
506 struct azx_rb rirb;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700507
Takashi Iwai4ce107b2008-02-06 14:50:19 +0100508 /* CORB/RIRB and position buffers */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700509 struct snd_dma_buffer rb;
510 struct snd_dma_buffer posbuf;
Takashi Iwaic74db862005-05-12 14:26:27 +0200511
Takashi Iwai4918cda2012-08-09 12:33:28 +0200512#ifdef CONFIG_SND_HDA_PATCH_LOADER
513 const struct firmware *fw;
514#endif
515
Takashi Iwaic74db862005-05-12 14:26:27 +0200516 /* flags */
Shahin Ghazinouribeaffc32010-05-11 08:19:55 +0200517 int position_fix[2]; /* for both playback/capture streams */
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200518 int poll_count;
Takashi Iwaicb53c622007-08-10 17:21:45 +0200519 unsigned int running :1;
Pavel Machek927fc862006-08-31 17:03:43 +0200520 unsigned int initialized :1;
521 unsigned int single_cmd :1;
522 unsigned int polling_mode :1;
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200523 unsigned int msi :1;
Takashi Iwaia6a950a2008-06-10 17:53:35 +0200524 unsigned int irq_pending_warned :1;
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +0100525 unsigned int probing :1; /* codec probing phase */
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200526 unsigned int snoop:1;
Takashi Iwai52409aa2012-01-23 17:10:24 +0100527 unsigned int align_buffer_size:1;
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200528 unsigned int region_requested:1;
529
530 /* VGA-switcheroo setup */
531 unsigned int use_vga_switcheroo:1;
Takashi Iwai128960a2012-10-12 17:28:18 +0200532 unsigned int vga_switcheroo_registered:1;
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200533 unsigned int init_failed:1; /* delayed init failed */
534 unsigned int disabled:1; /* disabled by VGA-switcher */
Takashi Iwai43bbb6c2007-07-06 20:22:05 +0200535
536 /* for debugging */
Wu Fengguangfeb27342009-08-01 19:17:14 +0800537 unsigned int last_cmd[AZX_MAX_CODECS];
Takashi Iwai9ad593f2008-05-16 12:34:47 +0200538
539 /* for pending irqs */
540 struct work_struct irq_pending_work;
Takashi Iwai0cbf0092008-10-29 16:18:25 +0100541
Wang Xingchao99a20082013-05-30 22:07:10 +0800542 struct work_struct probe_work;
Wang Xingchao99a20082013-05-30 22:07:10 +0800543
Takashi Iwai0cbf0092008-10-29 16:18:25 +0100544 /* reboot notifier (for mysterious hangup problem at power-down) */
545 struct notifier_block reboot_notifier;
Takashi Iwai65fcd412012-08-14 17:13:32 +0200546
547 /* card list (for power_save trigger) */
548 struct list_head list;
Takashi Iwaieb49faa2013-03-15 09:19:11 +0100549
550#ifdef CONFIG_SND_HDA_DSP_LOADER
551 struct azx_dev saved_azx_dev;
552#endif
Dave Airlie246efa42013-07-29 15:19:29 +1000553
554 /* secondary power domain for hdmi audio under vga device */
555 struct dev_pm_domain hdmi_pm_domain;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700556};
557
Takashi Iwai1a8506d2012-10-16 15:10:08 +0200558#define CREATE_TRACE_POINTS
559#include "hda_intel_trace.h"
560
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200561/* driver types */
562enum {
563 AZX_DRIVER_ICH,
Seth Heasley32679f92010-02-22 17:31:09 -0800564 AZX_DRIVER_PCH,
Tobin Davis4979bca2008-01-30 08:13:55 +0100565 AZX_DRIVER_SCH,
Takashi Iwaifab12852013-11-05 17:54:05 +0100566 AZX_DRIVER_HDMI,
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200567 AZX_DRIVER_ATI,
Felix Kuehling778b6e12006-05-17 11:22:21 +0200568 AZX_DRIVER_ATIHDMI,
Andiry Xu1815b342011-12-14 16:10:27 +0800569 AZX_DRIVER_ATIHDMI_NS,
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200570 AZX_DRIVER_VIA,
571 AZX_DRIVER_SIS,
572 AZX_DRIVER_ULI,
Vinod Gda3fca22005-09-13 18:49:12 +0200573 AZX_DRIVER_NVIDIA,
Kailang Yangf2690022008-05-27 11:44:55 +0200574 AZX_DRIVER_TERA,
Takashi Iwai14d34f12010-10-21 09:03:25 +0200575 AZX_DRIVER_CTX,
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200576 AZX_DRIVER_CTHDA,
Yang, Libinc4da29c2008-11-13 11:07:07 +0100577 AZX_DRIVER_GENERIC,
Takashi Iwai2f5983f2008-09-03 16:00:44 +0200578 AZX_NUM_DRIVERS, /* keep this as last entry */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200579};
580
Takashi Iwai9477c582011-05-25 09:11:37 +0200581/* driver quirks (capabilities) */
582/* bits 0-7 are used for indicating driver type */
583#define AZX_DCAPS_NO_TCSEL (1 << 8) /* No Intel TCSEL bit */
584#define AZX_DCAPS_NO_MSI (1 << 9) /* No MSI support */
585#define AZX_DCAPS_ATI_SNOOP (1 << 10) /* ATI snoop enable */
586#define AZX_DCAPS_NVIDIA_SNOOP (1 << 11) /* Nvidia snoop enable */
587#define AZX_DCAPS_SCH_SNOOP (1 << 12) /* SCH/PCH snoop enable */
588#define AZX_DCAPS_RIRB_DELAY (1 << 13) /* Long delay in read loop */
589#define AZX_DCAPS_RIRB_PRE_DELAY (1 << 14) /* Put a delay before read */
590#define AZX_DCAPS_CTX_WORKAROUND (1 << 15) /* X-Fi workaround */
591#define AZX_DCAPS_POSFIX_LPIB (1 << 16) /* Use LPIB as default */
592#define AZX_DCAPS_POSFIX_VIA (1 << 17) /* Use VIACOMBO as default */
593#define AZX_DCAPS_NO_64BIT (1 << 18) /* No 64bit address */
594#define AZX_DCAPS_SYNC_WRITE (1 << 19) /* sync each cmd write */
Takashi Iwai8b0bd222011-06-10 14:56:26 +0200595#define AZX_DCAPS_OLD_SSYNC (1 << 20) /* Old SSYNC reg for ICH */
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -0500596#define AZX_DCAPS_BUFSIZE (1 << 21) /* no buffer size alignment */
Takashi Iwai7bfe0592012-01-23 17:53:39 +0100597#define AZX_DCAPS_ALIGN_BUFSIZE (1 << 22) /* buffer size alignment */
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200598#define AZX_DCAPS_4K_BDLE_BOUNDARY (1 << 23) /* BDLE in 4k boundary */
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -0500599#define AZX_DCAPS_COUNT_LPIB_DELAY (1 << 25) /* Take LPIB as delay */
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +0100600#define AZX_DCAPS_PM_RUNTIME (1 << 26) /* runtime PM support */
Wang Xingchao99a20082013-05-30 22:07:10 +0800601#define AZX_DCAPS_I915_POWERWELL (1 << 27) /* HSW i915 power well support */
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +0100602
603/* quirks for Intel PCH */
Takashi Iwaid7dab4d2013-01-08 13:51:30 +0100604#define AZX_DCAPS_INTEL_PCH_NOPM \
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +0100605 (AZX_DCAPS_SCH_SNOOP | AZX_DCAPS_BUFSIZE | \
Takashi Iwaid7dab4d2013-01-08 13:51:30 +0100606 AZX_DCAPS_COUNT_LPIB_DELAY)
607
608#define AZX_DCAPS_INTEL_PCH \
609 (AZX_DCAPS_INTEL_PCH_NOPM | AZX_DCAPS_PM_RUNTIME)
Takashi Iwai9477c582011-05-25 09:11:37 +0200610
Takashi Iwai33499a12013-11-05 17:34:46 +0100611#define AZX_DCAPS_INTEL_HASWELL \
612 (AZX_DCAPS_SCH_SNOOP | AZX_DCAPS_ALIGN_BUFSIZE | \
613 AZX_DCAPS_COUNT_LPIB_DELAY | AZX_DCAPS_PM_RUNTIME | \
614 AZX_DCAPS_I915_POWERWELL)
615
Takashi Iwai9477c582011-05-25 09:11:37 +0200616/* quirks for ATI SB / AMD Hudson */
617#define AZX_DCAPS_PRESET_ATI_SB \
618 (AZX_DCAPS_ATI_SNOOP | AZX_DCAPS_NO_TCSEL | \
619 AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB)
620
621/* quirks for ATI/AMD HDMI */
622#define AZX_DCAPS_PRESET_ATI_HDMI \
623 (AZX_DCAPS_NO_TCSEL | AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB)
624
625/* quirks for Nvidia */
626#define AZX_DCAPS_PRESET_NVIDIA \
Takashi Iwai7bfe0592012-01-23 17:53:39 +0100627 (AZX_DCAPS_NVIDIA_SNOOP | AZX_DCAPS_RIRB_DELAY | AZX_DCAPS_NO_MSI |\
Mike Travis49d9e772013-05-01 14:04:08 -0500628 AZX_DCAPS_ALIGN_BUFSIZE | AZX_DCAPS_NO_64BIT)
Takashi Iwai9477c582011-05-25 09:11:37 +0200629
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200630#define AZX_DCAPS_PRESET_CTHDA \
631 (AZX_DCAPS_NO_MSI | AZX_DCAPS_POSFIX_LPIB | AZX_DCAPS_4K_BDLE_BOUNDARY)
632
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200633/*
634 * VGA-switcher support
635 */
636#ifdef SUPPORT_VGA_SWITCHEROO
Takashi Iwai5cb543d2012-08-09 13:49:23 +0200637#define use_vga_switcheroo(chip) ((chip)->use_vga_switcheroo)
638#else
639#define use_vga_switcheroo(chip) 0
640#endif
641
Takashi Iwai48c8b0e2012-12-07 07:40:35 +0100642static char *driver_short_names[] = {
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200643 [AZX_DRIVER_ICH] = "HDA Intel",
Seth Heasley32679f92010-02-22 17:31:09 -0800644 [AZX_DRIVER_PCH] = "HDA Intel PCH",
Tobin Davis4979bca2008-01-30 08:13:55 +0100645 [AZX_DRIVER_SCH] = "HDA Intel MID",
Takashi Iwaifab12852013-11-05 17:54:05 +0100646 [AZX_DRIVER_HDMI] = "HDA Intel HDMI",
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200647 [AZX_DRIVER_ATI] = "HDA ATI SB",
Felix Kuehling778b6e12006-05-17 11:22:21 +0200648 [AZX_DRIVER_ATIHDMI] = "HDA ATI HDMI",
Andiry Xu1815b342011-12-14 16:10:27 +0800649 [AZX_DRIVER_ATIHDMI_NS] = "HDA ATI HDMI",
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200650 [AZX_DRIVER_VIA] = "HDA VIA VT82xx",
651 [AZX_DRIVER_SIS] = "HDA SIS966",
Vinod Gda3fca22005-09-13 18:49:12 +0200652 [AZX_DRIVER_ULI] = "HDA ULI M5461",
653 [AZX_DRIVER_NVIDIA] = "HDA NVidia",
Kailang Yangf2690022008-05-27 11:44:55 +0200654 [AZX_DRIVER_TERA] = "HDA Teradici",
Takashi Iwai14d34f12010-10-21 09:03:25 +0200655 [AZX_DRIVER_CTX] = "HDA Creative",
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200656 [AZX_DRIVER_CTHDA] = "HDA Creative",
Yang, Libinc4da29c2008-11-13 11:07:07 +0100657 [AZX_DRIVER_GENERIC] = "HD-Audio Generic",
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200658};
659
Linus Torvalds1da177e2005-04-16 15:20:36 -0700660/*
661 * macros for easy use
662 */
663#define azx_writel(chip,reg,value) \
664 writel(value, (chip)->remap_addr + ICH6_REG_##reg)
665#define azx_readl(chip,reg) \
666 readl((chip)->remap_addr + ICH6_REG_##reg)
667#define azx_writew(chip,reg,value) \
668 writew(value, (chip)->remap_addr + ICH6_REG_##reg)
669#define azx_readw(chip,reg) \
670 readw((chip)->remap_addr + ICH6_REG_##reg)
671#define azx_writeb(chip,reg,value) \
672 writeb(value, (chip)->remap_addr + ICH6_REG_##reg)
673#define azx_readb(chip,reg) \
674 readb((chip)->remap_addr + ICH6_REG_##reg)
675
676#define azx_sd_writel(dev,reg,value) \
677 writel(value, (dev)->sd_addr + ICH6_REG_##reg)
678#define azx_sd_readl(dev,reg) \
679 readl((dev)->sd_addr + ICH6_REG_##reg)
680#define azx_sd_writew(dev,reg,value) \
681 writew(value, (dev)->sd_addr + ICH6_REG_##reg)
682#define azx_sd_readw(dev,reg) \
683 readw((dev)->sd_addr + ICH6_REG_##reg)
684#define azx_sd_writeb(dev,reg,value) \
685 writeb(value, (dev)->sd_addr + ICH6_REG_##reg)
686#define azx_sd_readb(dev,reg) \
687 readb((dev)->sd_addr + ICH6_REG_##reg)
688
689/* for pcm support */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100690#define get_azx_dev(substream) (substream->runtime->private_data)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700691
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200692#ifdef CONFIG_X86
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100693static void __mark_pages_wc(struct azx *chip, struct snd_dma_buffer *dmab, bool on)
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200694{
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100695 int pages;
696
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200697 if (azx_snoop(chip))
698 return;
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100699 if (!dmab || !dmab->area || !dmab->bytes)
700 return;
701
702#ifdef CONFIG_SND_DMA_SGBUF
703 if (dmab->dev.type == SNDRV_DMA_TYPE_DEV_SG) {
704 struct snd_sg_buf *sgbuf = dmab->private_data;
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200705 if (on)
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100706 set_pages_array_wc(sgbuf->page_table, sgbuf->pages);
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200707 else
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100708 set_pages_array_wb(sgbuf->page_table, sgbuf->pages);
709 return;
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200710 }
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100711#endif
712
713 pages = (dmab->bytes + PAGE_SIZE - 1) >> PAGE_SHIFT;
714 if (on)
715 set_memory_wc((unsigned long)dmab->area, pages);
716 else
717 set_memory_wb((unsigned long)dmab->area, pages);
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200718}
719
720static inline void mark_pages_wc(struct azx *chip, struct snd_dma_buffer *buf,
721 bool on)
722{
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100723 __mark_pages_wc(chip, buf, on);
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200724}
725static inline void mark_runtime_wc(struct azx *chip, struct azx_dev *azx_dev,
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100726 struct snd_pcm_substream *substream, bool on)
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200727{
728 if (azx_dev->wc_marked != on) {
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100729 __mark_pages_wc(chip, snd_pcm_get_dma_buf(substream), on);
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200730 azx_dev->wc_marked = on;
731 }
732}
733#else
734/* NOP for other archs */
735static inline void mark_pages_wc(struct azx *chip, struct snd_dma_buffer *buf,
736 bool on)
737{
738}
739static inline void mark_runtime_wc(struct azx *chip, struct azx_dev *azx_dev,
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100740 struct snd_pcm_substream *substream, bool on)
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200741{
742}
743#endif
744
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200745static int azx_acquire_irq(struct azx *chip, int do_disconnect);
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200746static int azx_send_cmd(struct hda_bus *bus, unsigned int val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700747/*
748 * Interface for HD codec
749 */
750
Linus Torvalds1da177e2005-04-16 15:20:36 -0700751/*
752 * CORB / RIRB interface
753 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100754static int azx_alloc_cmd_io(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700755{
756 int err;
757
758 /* single page (at least 4096 bytes) must suffice for both ringbuffes */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200759 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
760 snd_dma_pci_data(chip->pci),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700761 PAGE_SIZE, &chip->rb);
762 if (err < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +0100763 dev_err(chip->card->dev, "cannot allocate CORB/RIRB\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700764 return err;
765 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200766 mark_pages_wc(chip, &chip->rb, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700767 return 0;
768}
769
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100770static void azx_init_cmd_io(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700771{
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800772 spin_lock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700773 /* CORB set up */
774 chip->corb.addr = chip->rb.addr;
775 chip->corb.buf = (u32 *)chip->rb.area;
776 azx_writel(chip, CORBLBASE, (u32)chip->corb.addr);
Takashi Iwai766979e2008-06-13 20:53:56 +0200777 azx_writel(chip, CORBUBASE, upper_32_bits(chip->corb.addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700778
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200779 /* set the corb size to 256 entries (ULI requires explicitly) */
780 azx_writeb(chip, CORBSIZE, 0x02);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700781 /* set the corb write pointer to 0 */
782 azx_writew(chip, CORBWP, 0);
783 /* reset the corb hw read pointer */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200784 azx_writew(chip, CORBRP, ICH6_CORBRP_RST);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700785 /* enable corb dma */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200786 azx_writeb(chip, CORBCTL, ICH6_CORBCTL_RUN);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700787
788 /* RIRB set up */
789 chip->rirb.addr = chip->rb.addr + 2048;
790 chip->rirb.buf = (u32 *)(chip->rb.area + 2048);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800791 chip->rirb.wp = chip->rirb.rp = 0;
792 memset(chip->rirb.cmds, 0, sizeof(chip->rirb.cmds));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700793 azx_writel(chip, RIRBLBASE, (u32)chip->rirb.addr);
Takashi Iwai766979e2008-06-13 20:53:56 +0200794 azx_writel(chip, RIRBUBASE, upper_32_bits(chip->rirb.addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700795
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200796 /* set the rirb size to 256 entries (ULI requires explicitly) */
797 azx_writeb(chip, RIRBSIZE, 0x02);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700798 /* reset the rirb hw write pointer */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200799 azx_writew(chip, RIRBWP, ICH6_RIRBWP_RST);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700800 /* set N=1, get RIRB response interrupt for new entry */
Takashi Iwai9477c582011-05-25 09:11:37 +0200801 if (chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND)
Takashi Iwai14d34f12010-10-21 09:03:25 +0200802 azx_writew(chip, RINTCNT, 0xc0);
803 else
804 azx_writew(chip, RINTCNT, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700805 /* enable rirb dma and response irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700806 azx_writeb(chip, RIRBCTL, ICH6_RBCTL_DMA_EN | ICH6_RBCTL_IRQ_EN);
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800807 spin_unlock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700808}
809
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100810static void azx_free_cmd_io(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700811{
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800812 spin_lock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700813 /* disable ringbuffer DMAs */
814 azx_writeb(chip, RIRBCTL, 0);
815 azx_writeb(chip, CORBCTL, 0);
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800816 spin_unlock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700817}
818
Wu Fengguangdeadff12009-08-01 18:45:16 +0800819static unsigned int azx_command_addr(u32 cmd)
820{
821 unsigned int addr = cmd >> 28;
822
823 if (addr >= AZX_MAX_CODECS) {
824 snd_BUG();
825 addr = 0;
826 }
827
828 return addr;
829}
830
Linus Torvalds1da177e2005-04-16 15:20:36 -0700831/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100832static int azx_corb_send_cmd(struct hda_bus *bus, u32 val)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700833{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100834 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800835 unsigned int addr = azx_command_addr(val);
Takashi Iwai3bcce5c2012-12-20 11:17:17 +0100836 unsigned int wp, rp;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700837
Wu Fengguangc32649f2009-08-01 18:48:12 +0800838 spin_lock_irq(&chip->reg_lock);
839
Linus Torvalds1da177e2005-04-16 15:20:36 -0700840 /* add command to corb */
Takashi Iwaicc5ede32012-12-12 11:10:49 +0100841 wp = azx_readw(chip, CORBWP);
842 if (wp == 0xffff) {
843 /* something wrong, controller likely turned to D3 */
844 spin_unlock_irq(&chip->reg_lock);
Takashi Iwai3bcce5c2012-12-20 11:17:17 +0100845 return -EIO;
Takashi Iwaicc5ede32012-12-12 11:10:49 +0100846 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700847 wp++;
848 wp %= ICH6_MAX_CORB_ENTRIES;
849
Takashi Iwai3bcce5c2012-12-20 11:17:17 +0100850 rp = azx_readw(chip, CORBRP);
851 if (wp == rp) {
852 /* oops, it's full */
853 spin_unlock_irq(&chip->reg_lock);
854 return -EAGAIN;
855 }
856
Wu Fengguangdeadff12009-08-01 18:45:16 +0800857 chip->rirb.cmds[addr]++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700858 chip->corb.buf[wp] = cpu_to_le32(val);
859 azx_writel(chip, CORBWP, wp);
Wu Fengguangc32649f2009-08-01 18:48:12 +0800860
Linus Torvalds1da177e2005-04-16 15:20:36 -0700861 spin_unlock_irq(&chip->reg_lock);
862
863 return 0;
864}
865
866#define ICH6_RIRB_EX_UNSOL_EV (1<<4)
867
868/* retrieve RIRB entry - called from interrupt handler */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100869static void azx_update_rirb(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700870{
871 unsigned int rp, wp;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800872 unsigned int addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700873 u32 res, res_ex;
874
Takashi Iwaicc5ede32012-12-12 11:10:49 +0100875 wp = azx_readw(chip, RIRBWP);
876 if (wp == 0xffff) {
877 /* something wrong, controller likely turned to D3 */
878 return;
879 }
880
Linus Torvalds1da177e2005-04-16 15:20:36 -0700881 if (wp == chip->rirb.wp)
882 return;
883 chip->rirb.wp = wp;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800884
Linus Torvalds1da177e2005-04-16 15:20:36 -0700885 while (chip->rirb.rp != wp) {
886 chip->rirb.rp++;
887 chip->rirb.rp %= ICH6_MAX_RIRB_ENTRIES;
888
889 rp = chip->rirb.rp << 1; /* an RIRB entry is 8-bytes */
890 res_ex = le32_to_cpu(chip->rirb.buf[rp + 1]);
891 res = le32_to_cpu(chip->rirb.buf[rp]);
David Henningsson3d692452014-01-29 13:12:31 +0100892 addr = res_ex & 0xf;
893 if ((addr >= AZX_MAX_CODECS) || !(chip->codec_mask & (1 << addr))) {
Takashi Iwai4e76a882014-02-25 12:21:03 +0100894 dev_err(chip->card->dev, "spurious response %#x:%#x, rp = %d, wp = %d",
895 res, res_ex,
896 chip->rirb.rp, wp);
David Henningsson3d692452014-01-29 13:12:31 +0100897 snd_BUG();
898 }
899 else if (res_ex & ICH6_RIRB_EX_UNSOL_EV)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700900 snd_hda_queue_unsol_event(chip->bus, res, res_ex);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800901 else if (chip->rirb.cmds[addr]) {
902 chip->rirb.res[addr] = res;
Takashi Iwai2add9b92008-03-18 09:47:06 +0100903 smp_wmb();
Wu Fengguangdeadff12009-08-01 18:45:16 +0800904 chip->rirb.cmds[addr]--;
Joe Perches3b70a672013-11-07 11:55:15 -0800905 } else if (printk_ratelimit()) {
Takashi Iwai4e76a882014-02-25 12:21:03 +0100906 dev_err(chip->card->dev, "spurious response %#x:%#x, last cmd=%#08x\n",
907 res, res_ex,
908 chip->last_cmd[addr]);
Joe Perches3b70a672013-11-07 11:55:15 -0800909 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700910 }
911}
912
913/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800914static unsigned int azx_rirb_get_response(struct hda_bus *bus,
915 unsigned int addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700916{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100917 struct azx *chip = bus->private_data;
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200918 unsigned long timeout;
David Henningsson32cf4022012-05-04 11:05:55 +0200919 unsigned long loopcounter;
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200920 int do_poll = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700921
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200922 again:
923 timeout = jiffies + msecs_to_jiffies(1000);
David Henningsson32cf4022012-05-04 11:05:55 +0200924
925 for (loopcounter = 0;; loopcounter++) {
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200926 if (chip->polling_mode || do_poll) {
Takashi Iwaie96224a2006-08-21 17:57:44 +0200927 spin_lock_irq(&chip->reg_lock);
928 azx_update_rirb(chip);
929 spin_unlock_irq(&chip->reg_lock);
930 }
Wu Fengguangdeadff12009-08-01 18:45:16 +0800931 if (!chip->rirb.cmds[addr]) {
Takashi Iwai2add9b92008-03-18 09:47:06 +0100932 smp_rmb();
Takashi Iwaib6132912009-03-24 07:36:09 +0100933 bus->rirb_error = 0;
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200934
935 if (!do_poll)
936 chip->poll_count = 0;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800937 return chip->rirb.res[addr]; /* the last value */
Takashi Iwai2add9b92008-03-18 09:47:06 +0100938 }
Takashi Iwai28a0d9d2008-01-18 15:32:32 +0100939 if (time_after(jiffies, timeout))
940 break;
David Henningsson32cf4022012-05-04 11:05:55 +0200941 if (bus->needs_damn_long_delay || loopcounter > 3000)
Takashi Iwai52987652008-01-16 16:09:47 +0100942 msleep(2); /* temporary workaround */
943 else {
944 udelay(10);
945 cond_resched();
946 }
Takashi Iwai28a0d9d2008-01-18 15:32:32 +0100947 }
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200948
Takashi Iwai63e51fd2013-06-06 14:20:19 +0200949 if (!bus->no_response_fallback)
950 return -1;
951
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200952 if (!chip->polling_mode && chip->poll_count < 2) {
Takashi Iwai4e76a882014-02-25 12:21:03 +0100953 dev_dbg(chip->card->dev,
954 "azx_get_response timeout, polling the codec once: last cmd=0x%08x\n",
955 chip->last_cmd[addr]);
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200956 do_poll = 1;
957 chip->poll_count++;
958 goto again;
959 }
960
961
Takashi Iwai23c4a882009-10-30 13:21:49 +0100962 if (!chip->polling_mode) {
Takashi Iwai4e76a882014-02-25 12:21:03 +0100963 dev_warn(chip->card->dev,
964 "azx_get_response timeout, switching to polling mode: last cmd=0x%08x\n",
965 chip->last_cmd[addr]);
Takashi Iwai23c4a882009-10-30 13:21:49 +0100966 chip->polling_mode = 1;
967 goto again;
968 }
969
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200970 if (chip->msi) {
Takashi Iwai4e76a882014-02-25 12:21:03 +0100971 dev_warn(chip->card->dev,
972 "No response from codec, disabling MSI: last cmd=0x%08x\n",
973 chip->last_cmd[addr]);
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200974 free_irq(chip->irq, chip);
975 chip->irq = -1;
976 pci_disable_msi(chip->pci);
977 chip->msi = 0;
Takashi Iwaib6132912009-03-24 07:36:09 +0100978 if (azx_acquire_irq(chip, 1) < 0) {
979 bus->rirb_error = 1;
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200980 return -1;
Takashi Iwaib6132912009-03-24 07:36:09 +0100981 }
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200982 goto again;
983 }
984
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +0100985 if (chip->probing) {
986 /* If this critical timeout happens during the codec probing
987 * phase, this is likely an access to a non-existing codec
988 * slot. Better to return an error and reset the system.
989 */
990 return -1;
991 }
992
Takashi Iwai8dd78332009-06-02 01:16:07 +0200993 /* a fatal communication error; need either to reset or to fallback
994 * to the single_cmd mode
995 */
Takashi Iwaib6132912009-03-24 07:36:09 +0100996 bus->rirb_error = 1;
Takashi Iwaib20f3b82009-06-02 01:20:22 +0200997 if (bus->allow_bus_reset && !bus->response_reset && !bus->in_reset) {
Takashi Iwai8dd78332009-06-02 01:16:07 +0200998 bus->response_reset = 1;
999 return -1; /* give a chance to retry */
1000 }
1001
Takashi Iwai4e76a882014-02-25 12:21:03 +01001002 dev_err(chip->card->dev,
1003 "azx_get_response timeout, switching to single_cmd mode: last cmd=0x%08x\n",
1004 chip->last_cmd[addr]);
Takashi Iwai8dd78332009-06-02 01:16:07 +02001005 chip->single_cmd = 1;
1006 bus->response_reset = 0;
Takashi Iwai1a696972009-11-07 09:49:04 +01001007 /* release CORB/RIRB */
Takashi Iwai4fcd3922009-05-25 18:34:52 +02001008 azx_free_cmd_io(chip);
Takashi Iwai1a696972009-11-07 09:49:04 +01001009 /* disable unsolicited responses */
1010 azx_writel(chip, GCTL, azx_readl(chip, GCTL) & ~ICH6_GCTL_UNSOL);
Takashi Iwai5c79b1f2006-09-21 13:34:13 +02001011 return -1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001012}
1013
Linus Torvalds1da177e2005-04-16 15:20:36 -07001014/*
1015 * Use the single immediate command instead of CORB/RIRB for simplicity
1016 *
1017 * Note: according to Intel, this is not preferred use. The command was
1018 * intended for the BIOS only, and may get confused with unsolicited
1019 * responses. So, we shouldn't use it for normal operation from the
1020 * driver.
1021 * I left the codes, however, for debugging/testing purposes.
1022 */
1023
Takashi Iwaib05a7d42009-05-28 11:59:12 +02001024/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +08001025static int azx_single_wait_for_response(struct azx *chip, unsigned int addr)
Takashi Iwaib05a7d42009-05-28 11:59:12 +02001026{
1027 int timeout = 50;
1028
1029 while (timeout--) {
1030 /* check IRV busy bit */
1031 if (azx_readw(chip, IRS) & ICH6_IRS_VALID) {
1032 /* reuse rirb.res as the response return value */
Wu Fengguangdeadff12009-08-01 18:45:16 +08001033 chip->rirb.res[addr] = azx_readl(chip, IR);
Takashi Iwaib05a7d42009-05-28 11:59:12 +02001034 return 0;
1035 }
1036 udelay(1);
1037 }
1038 if (printk_ratelimit())
Takashi Iwai4e76a882014-02-25 12:21:03 +01001039 dev_dbg(chip->card->dev, "get_response timeout: IRS=0x%x\n",
1040 azx_readw(chip, IRS));
Wu Fengguangdeadff12009-08-01 18:45:16 +08001041 chip->rirb.res[addr] = -1;
Takashi Iwaib05a7d42009-05-28 11:59:12 +02001042 return -EIO;
1043}
1044
Linus Torvalds1da177e2005-04-16 15:20:36 -07001045/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001046static int azx_single_send_cmd(struct hda_bus *bus, u32 val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001047{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001048 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +08001049 unsigned int addr = azx_command_addr(val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001050 int timeout = 50;
1051
Takashi Iwai8dd78332009-06-02 01:16:07 +02001052 bus->rirb_error = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001053 while (timeout--) {
1054 /* check ICB busy bit */
Takashi Iwaid01ce992007-07-27 16:52:19 +02001055 if (!((azx_readw(chip, IRS) & ICH6_IRS_BUSY))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001056 /* Clear IRV valid bit */
Takashi Iwaid01ce992007-07-27 16:52:19 +02001057 azx_writew(chip, IRS, azx_readw(chip, IRS) |
1058 ICH6_IRS_VALID);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001059 azx_writel(chip, IC, val);
Takashi Iwaid01ce992007-07-27 16:52:19 +02001060 azx_writew(chip, IRS, azx_readw(chip, IRS) |
1061 ICH6_IRS_BUSY);
Wu Fengguangdeadff12009-08-01 18:45:16 +08001062 return azx_single_wait_for_response(chip, addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001063 }
1064 udelay(1);
1065 }
Marc Boucher1cfd52b2008-01-22 15:29:26 +01001066 if (printk_ratelimit())
Takashi Iwai4e76a882014-02-25 12:21:03 +01001067 dev_dbg(chip->card->dev,
1068 "send_cmd timeout: IRS=0x%x, val=0x%x\n",
1069 azx_readw(chip, IRS), val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001070 return -EIO;
1071}
1072
1073/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +08001074static unsigned int azx_single_get_response(struct hda_bus *bus,
1075 unsigned int addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001076{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001077 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +08001078 return chip->rirb.res[addr];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001079}
1080
Takashi Iwai111d3af2006-02-16 18:17:58 +01001081/*
1082 * The below are the main callbacks from hda_codec.
1083 *
1084 * They are just the skeleton to call sub-callbacks according to the
1085 * current setting of chip->single_cmd.
1086 */
1087
1088/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001089static int azx_send_cmd(struct hda_bus *bus, unsigned int val)
Takashi Iwai111d3af2006-02-16 18:17:58 +01001090{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001091 struct azx *chip = bus->private_data;
Takashi Iwai43bbb6c2007-07-06 20:22:05 +02001092
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001093 if (chip->disabled)
1094 return 0;
Wu Fengguangfeb27342009-08-01 19:17:14 +08001095 chip->last_cmd[azx_command_addr(val)] = val;
Takashi Iwai111d3af2006-02-16 18:17:58 +01001096 if (chip->single_cmd)
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001097 return azx_single_send_cmd(bus, val);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001098 else
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001099 return azx_corb_send_cmd(bus, val);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001100}
1101
1102/* get a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +08001103static unsigned int azx_get_response(struct hda_bus *bus,
1104 unsigned int addr)
Takashi Iwai111d3af2006-02-16 18:17:58 +01001105{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001106 struct azx *chip = bus->private_data;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001107 if (chip->disabled)
1108 return 0;
Takashi Iwai111d3af2006-02-16 18:17:58 +01001109 if (chip->single_cmd)
Wu Fengguangdeadff12009-08-01 18:45:16 +08001110 return azx_single_get_response(bus, addr);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001111 else
Wu Fengguangdeadff12009-08-01 18:45:16 +08001112 return azx_rirb_get_response(bus, addr);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001113}
1114
Takashi Iwai83012a72012-08-24 18:38:08 +02001115#ifdef CONFIG_PM
Takashi Iwai68467f52012-08-28 09:14:29 -07001116static void azx_power_notify(struct hda_bus *bus, bool power_up);
Takashi Iwaicb53c622007-08-10 17:21:45 +02001117#endif
Takashi Iwai111d3af2006-02-16 18:17:58 +01001118
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001119#ifdef CONFIG_SND_HDA_DSP_LOADER
1120static int azx_load_dsp_prepare(struct hda_bus *bus, unsigned int format,
1121 unsigned int byte_size,
1122 struct snd_dma_buffer *bufp);
1123static void azx_load_dsp_trigger(struct hda_bus *bus, bool start);
1124static void azx_load_dsp_cleanup(struct hda_bus *bus,
1125 struct snd_dma_buffer *dmab);
1126#endif
1127
Mengdong Lin3af3f352013-06-24 10:18:54 -04001128/* enter link reset */
Mengdong Lin7295b262013-06-25 05:58:49 -04001129static void azx_enter_link_reset(struct azx *chip)
Mengdong Lin3af3f352013-06-24 10:18:54 -04001130{
1131 unsigned long timeout;
1132
1133 /* reset controller */
1134 azx_writel(chip, GCTL, azx_readl(chip, GCTL) & ~ICH6_GCTL_RESET);
1135
1136 timeout = jiffies + msecs_to_jiffies(100);
1137 while ((azx_readb(chip, GCTL) & ICH6_GCTL_RESET) &&
1138 time_before(jiffies, timeout))
1139 usleep_range(500, 1000);
1140}
1141
Mengdong Lin7295b262013-06-25 05:58:49 -04001142/* exit link reset */
1143static void azx_exit_link_reset(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001144{
Mengdong Linfa348da2012-12-12 09:16:15 -05001145 unsigned long timeout;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001146
Mengdong Lin7295b262013-06-25 05:58:49 -04001147 azx_writeb(chip, GCTL, azx_readb(chip, GCTL) | ICH6_GCTL_RESET);
1148
1149 timeout = jiffies + msecs_to_jiffies(100);
1150 while (!azx_readb(chip, GCTL) &&
1151 time_before(jiffies, timeout))
1152 usleep_range(500, 1000);
1153}
1154
1155/* reset codec link */
1156static int azx_reset(struct azx *chip, int full_reset)
1157{
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001158 if (!full_reset)
1159 goto __skip;
1160
Danny Tholene8a7f132007-09-11 21:41:56 +02001161 /* clear STATESTS */
Wang Xingchaoda7db6a2013-07-22 03:19:18 -04001162 azx_writew(chip, STATESTS, STATESTS_INT_MASK);
Danny Tholene8a7f132007-09-11 21:41:56 +02001163
Linus Torvalds1da177e2005-04-16 15:20:36 -07001164 /* reset controller */
Mengdong Lin7295b262013-06-25 05:58:49 -04001165 azx_enter_link_reset(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001166
1167 /* delay for >= 100us for codec PLL to settle per spec
1168 * Rev 0.9 section 5.5.1
1169 */
Mengdong Linfa348da2012-12-12 09:16:15 -05001170 usleep_range(500, 1000);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001171
1172 /* Bring controller out of reset */
Mengdong Lin7295b262013-06-25 05:58:49 -04001173 azx_exit_link_reset(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001174
Pavel Machek927fc862006-08-31 17:03:43 +02001175 /* Brent Chartrand said to wait >= 540us for codecs to initialize */
Mengdong Linfa348da2012-12-12 09:16:15 -05001176 usleep_range(1000, 1200);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001177
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001178 __skip:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001179 /* check to see if controller is ready */
Pavel Machek927fc862006-08-31 17:03:43 +02001180 if (!azx_readb(chip, GCTL)) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001181 dev_dbg(chip->card->dev, "azx_reset: controller not ready!\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001182 return -EBUSY;
1183 }
1184
Matt41e2fce2005-07-04 17:49:55 +02001185 /* Accept unsolicited responses */
Takashi Iwai1a696972009-11-07 09:49:04 +01001186 if (!chip->single_cmd)
1187 azx_writel(chip, GCTL, azx_readl(chip, GCTL) |
1188 ICH6_GCTL_UNSOL);
Matt41e2fce2005-07-04 17:49:55 +02001189
Linus Torvalds1da177e2005-04-16 15:20:36 -07001190 /* detect codecs */
Pavel Machek927fc862006-08-31 17:03:43 +02001191 if (!chip->codec_mask) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001192 chip->codec_mask = azx_readw(chip, STATESTS);
Takashi Iwai4e76a882014-02-25 12:21:03 +01001193 dev_dbg(chip->card->dev, "codec_mask = 0x%x\n",
1194 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)) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001338 dev_dbg(chip->card->dev, "Clearing TCSEL\n");
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) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001346 dev_dbg(chip->card->dev, "Setting ATI snoop: %d\n",
1347 azx_snoop(chip));
Takashi Iwaicb53c622007-08-10 17:21:45 +02001348 update_pci_byte(chip->pci,
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001349 ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR, 0x07,
1350 azx_snoop(chip) ? ATI_SB450_HDAUDIO_ENABLE_SNOOP : 0);
Takashi Iwai9477c582011-05-25 09:11:37 +02001351 }
1352
1353 /* For NVIDIA HDA, enable snoop */
1354 if (chip->driver_caps & AZX_DCAPS_NVIDIA_SNOOP) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001355 dev_dbg(chip->card->dev, "Setting Nvidia snoop: %d\n",
1356 azx_snoop(chip));
Takashi Iwaicb53c622007-08-10 17:21:45 +02001357 update_pci_byte(chip->pci,
1358 NVIDIA_HDA_TRANSREG_ADDR,
1359 0x0f, NVIDIA_HDA_ENABLE_COHBITS);
Peer Chen320dcc32008-08-20 16:43:24 -07001360 update_pci_byte(chip->pci,
1361 NVIDIA_HDA_ISTRM_COH,
1362 0x01, NVIDIA_HDA_ENABLE_COHBIT);
1363 update_pci_byte(chip->pci,
1364 NVIDIA_HDA_OSTRM_COH,
1365 0x01, NVIDIA_HDA_ENABLE_COHBIT);
Takashi Iwai9477c582011-05-25 09:11:37 +02001366 }
1367
1368 /* Enable SCH/PCH snoop if needed */
1369 if (chip->driver_caps & AZX_DCAPS_SCH_SNOOP) {
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001370 unsigned short snoop;
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001371 pci_read_config_word(chip->pci, INTEL_SCH_HDA_DEVC, &snoop);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001372 if ((!azx_snoop(chip) && !(snoop & INTEL_SCH_HDA_DEVC_NOSNOOP)) ||
1373 (azx_snoop(chip) && (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP))) {
1374 snoop &= ~INTEL_SCH_HDA_DEVC_NOSNOOP;
1375 if (!azx_snoop(chip))
1376 snoop |= INTEL_SCH_HDA_DEVC_NOSNOOP;
1377 pci_write_config_word(chip->pci, INTEL_SCH_HDA_DEVC, snoop);
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001378 pci_read_config_word(chip->pci,
1379 INTEL_SCH_HDA_DEVC, &snoop);
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001380 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01001381 dev_dbg(chip->card->dev, "SCH snoop: %s\n",
1382 (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP) ?
1383 "Disabled" : "Enabled");
Vinod Gda3fca22005-09-13 18:49:12 +02001384 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001385}
1386
1387
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001388static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev);
1389
Linus Torvalds1da177e2005-04-16 15:20:36 -07001390/*
1391 * interrupt handler
1392 */
David Howells7d12e782006-10-05 14:55:46 +01001393static irqreturn_t azx_interrupt(int irq, void *dev_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001394{
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001395 struct azx *chip = dev_id;
1396 struct azx_dev *azx_dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001397 u32 status;
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001398 u8 sd_status;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001399 int i, ok;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001400
Mengdong Linb8dfc4622012-08-23 17:32:30 +08001401#ifdef CONFIG_PM_RUNTIME
Dave Airlie246efa42013-07-29 15:19:29 +10001402 if (chip->driver_caps & AZX_DCAPS_PM_RUNTIME)
1403 if (chip->pci->dev.power.runtime_status != RPM_ACTIVE)
1404 return IRQ_NONE;
Mengdong Linb8dfc4622012-08-23 17:32:30 +08001405#endif
1406
Linus Torvalds1da177e2005-04-16 15:20:36 -07001407 spin_lock(&chip->reg_lock);
1408
Dan Carpenter60911062012-05-18 10:36:11 +03001409 if (chip->disabled) {
1410 spin_unlock(&chip->reg_lock);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001411 return IRQ_NONE;
Dan Carpenter60911062012-05-18 10:36:11 +03001412 }
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001413
Linus Torvalds1da177e2005-04-16 15:20:36 -07001414 status = azx_readl(chip, INTSTS);
Dave Airlie246efa42013-07-29 15:19:29 +10001415 if (status == 0 || status == 0xffffffff) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001416 spin_unlock(&chip->reg_lock);
1417 return IRQ_NONE;
1418 }
1419
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001420 for (i = 0; i < chip->num_streams; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001421 azx_dev = &chip->azx_dev[i];
1422 if (status & azx_dev->sd_int_sta_mask) {
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001423 sd_status = azx_sd_readb(azx_dev, SD_STS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001424 azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK);
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001425 if (!azx_dev->substream || !azx_dev->running ||
1426 !(sd_status & SD_INT_COMPLETE))
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001427 continue;
1428 /* check whether this IRQ is really acceptable */
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001429 ok = azx_position_ok(chip, azx_dev);
1430 if (ok == 1) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001431 azx_dev->irq_pending = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001432 spin_unlock(&chip->reg_lock);
1433 snd_pcm_period_elapsed(azx_dev->substream);
1434 spin_lock(&chip->reg_lock);
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001435 } else if (ok == 0 && chip->bus && chip->bus->workq) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001436 /* bogus IRQ, process it later */
1437 azx_dev->irq_pending = 1;
Takashi Iwai6acaed32009-01-12 10:09:24 +01001438 queue_work(chip->bus->workq,
1439 &chip->irq_pending_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001440 }
1441 }
1442 }
1443
1444 /* clear rirb int */
1445 status = azx_readb(chip, RIRBSTS);
1446 if (status & RIRB_INT_MASK) {
Takashi Iwai14d34f12010-10-21 09:03:25 +02001447 if (status & RIRB_INT_RESPONSE) {
Takashi Iwai9477c582011-05-25 09:11:37 +02001448 if (chip->driver_caps & AZX_DCAPS_RIRB_PRE_DELAY)
Takashi Iwai14d34f12010-10-21 09:03:25 +02001449 udelay(80);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001450 azx_update_rirb(chip);
Takashi Iwai14d34f12010-10-21 09:03:25 +02001451 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001452 azx_writeb(chip, RIRBSTS, RIRB_INT_MASK);
1453 }
1454
1455#if 0
1456 /* clear state status int */
Wang Xingchaoda7db6a2013-07-22 03:19:18 -04001457 if (azx_readw(chip, STATESTS) & 0x04)
1458 azx_writew(chip, STATESTS, 0x04);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001459#endif
1460 spin_unlock(&chip->reg_lock);
1461
1462 return IRQ_HANDLED;
1463}
1464
1465
1466/*
Takashi Iwai675f25d2008-06-10 17:53:20 +02001467 * set up a BDL entry
1468 */
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001469static int setup_bdle(struct azx *chip,
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001470 struct snd_dma_buffer *dmab,
Takashi Iwai675f25d2008-06-10 17:53:20 +02001471 struct azx_dev *azx_dev, u32 **bdlp,
1472 int ofs, int size, int with_ioc)
1473{
Takashi Iwai675f25d2008-06-10 17:53:20 +02001474 u32 *bdl = *bdlp;
1475
1476 while (size > 0) {
1477 dma_addr_t addr;
1478 int chunk;
1479
1480 if (azx_dev->frags >= AZX_MAX_BDL_ENTRIES)
1481 return -EINVAL;
1482
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001483 addr = snd_sgbuf_get_addr(dmab, ofs);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001484 /* program the address field of the BDL entry */
1485 bdl[0] = cpu_to_le32((u32)addr);
Takashi Iwai766979e2008-06-13 20:53:56 +02001486 bdl[1] = cpu_to_le32(upper_32_bits(addr));
Takashi Iwai675f25d2008-06-10 17:53:20 +02001487 /* program the size field of the BDL entry */
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001488 chunk = snd_sgbuf_get_chunk_size(dmab, ofs, size);
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001489 /* one BDLE cannot cross 4K boundary on CTHDA chips */
1490 if (chip->driver_caps & AZX_DCAPS_4K_BDLE_BOUNDARY) {
1491 u32 remain = 0x1000 - (ofs & 0xfff);
1492 if (chunk > remain)
1493 chunk = remain;
1494 }
Takashi Iwai675f25d2008-06-10 17:53:20 +02001495 bdl[2] = cpu_to_le32(chunk);
1496 /* program the IOC to enable interrupt
1497 * only when the whole fragment is processed
1498 */
1499 size -= chunk;
1500 bdl[3] = (size || !with_ioc) ? 0 : cpu_to_le32(0x01);
1501 bdl += 4;
1502 azx_dev->frags++;
1503 ofs += chunk;
1504 }
1505 *bdlp = bdl;
1506 return ofs;
1507}
1508
1509/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001510 * set up BDL entries
1511 */
Takashi Iwai555e2192008-06-10 17:53:34 +02001512static int azx_setup_periods(struct azx *chip,
1513 struct snd_pcm_substream *substream,
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001514 struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001515{
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001516 u32 *bdl;
1517 int i, ofs, periods, period_bytes;
Takashi Iwai555e2192008-06-10 17:53:34 +02001518 int pos_adj;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001519
1520 /* reset BDL address */
1521 azx_sd_writel(azx_dev, SD_BDLPL, 0);
1522 azx_sd_writel(azx_dev, SD_BDLPU, 0);
1523
Takashi Iwai97b71c92009-03-18 15:09:13 +01001524 period_bytes = azx_dev->period_bytes;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001525 periods = azx_dev->bufsize / period_bytes;
1526
Linus Torvalds1da177e2005-04-16 15:20:36 -07001527 /* program the initial BDL entries */
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001528 bdl = (u32 *)azx_dev->bdl.area;
1529 ofs = 0;
1530 azx_dev->frags = 0;
Takashi Iwai555e2192008-06-10 17:53:34 +02001531 pos_adj = bdl_pos_adj[chip->dev_index];
Takashi Iwai915bf292012-09-11 15:19:10 +02001532 if (!azx_dev->no_period_wakeup && pos_adj > 0) {
Takashi Iwai675f25d2008-06-10 17:53:20 +02001533 struct snd_pcm_runtime *runtime = substream->runtime;
Takashi Iwaie785d3d2008-07-15 16:28:43 +02001534 int pos_align = pos_adj;
Takashi Iwai555e2192008-06-10 17:53:34 +02001535 pos_adj = (pos_adj * runtime->rate + 47999) / 48000;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001536 if (!pos_adj)
Takashi Iwaie785d3d2008-07-15 16:28:43 +02001537 pos_adj = pos_align;
1538 else
1539 pos_adj = ((pos_adj + pos_align - 1) / pos_align) *
1540 pos_align;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001541 pos_adj = frames_to_bytes(runtime, pos_adj);
1542 if (pos_adj >= period_bytes) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001543 dev_warn(chip->card->dev,"Too big adjustment %d\n",
1544 bdl_pos_adj[chip->dev_index]);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001545 pos_adj = 0;
1546 } else {
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001547 ofs = setup_bdle(chip, snd_pcm_get_dma_buf(substream),
1548 azx_dev,
Takashi Iwai915bf292012-09-11 15:19:10 +02001549 &bdl, ofs, pos_adj, true);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001550 if (ofs < 0)
1551 goto error;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001552 }
Takashi Iwai555e2192008-06-10 17:53:34 +02001553 } else
1554 pos_adj = 0;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001555 for (i = 0; i < periods; i++) {
1556 if (i == periods - 1 && pos_adj)
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001557 ofs = setup_bdle(chip, snd_pcm_get_dma_buf(substream),
1558 azx_dev, &bdl, ofs,
Takashi Iwai675f25d2008-06-10 17:53:20 +02001559 period_bytes - pos_adj, 0);
1560 else
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001561 ofs = setup_bdle(chip, snd_pcm_get_dma_buf(substream),
1562 azx_dev, &bdl, ofs,
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001563 period_bytes,
Takashi Iwai915bf292012-09-11 15:19:10 +02001564 !azx_dev->no_period_wakeup);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001565 if (ofs < 0)
1566 goto error;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001567 }
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001568 return 0;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001569
1570 error:
Takashi Iwai4e76a882014-02-25 12:21:03 +01001571 dev_err(chip->card->dev, "Too many BDL entries: buffer=%d, period=%d\n",
1572 azx_dev->bufsize, period_bytes);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001573 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001574}
1575
Takashi Iwai1dddab42009-03-18 15:15:37 +01001576/* reset stream */
1577static void azx_stream_reset(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001578{
1579 unsigned char val;
1580 int timeout;
1581
Takashi Iwai1dddab42009-03-18 15:15:37 +01001582 azx_stream_clear(chip, azx_dev);
1583
Takashi Iwaid01ce992007-07-27 16:52:19 +02001584 azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) |
1585 SD_CTL_STREAM_RESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001586 udelay(3);
1587 timeout = 300;
1588 while (!((val = azx_sd_readb(azx_dev, SD_CTL)) & SD_CTL_STREAM_RESET) &&
1589 --timeout)
1590 ;
1591 val &= ~SD_CTL_STREAM_RESET;
1592 azx_sd_writeb(azx_dev, SD_CTL, val);
1593 udelay(3);
1594
1595 timeout = 300;
1596 /* waiting for hardware to report that the stream is out of reset */
1597 while (((val = azx_sd_readb(azx_dev, SD_CTL)) & SD_CTL_STREAM_RESET) &&
1598 --timeout)
1599 ;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001600
1601 /* reset first position - may not be synced with hw at this time */
1602 *azx_dev->posbuf = 0;
Takashi Iwai1dddab42009-03-18 15:15:37 +01001603}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001604
Takashi Iwai1dddab42009-03-18 15:15:37 +01001605/*
1606 * set up the SD for streaming
1607 */
1608static int azx_setup_controller(struct azx *chip, struct azx_dev *azx_dev)
1609{
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001610 unsigned int val;
Takashi Iwai1dddab42009-03-18 15:15:37 +01001611 /* make sure the run bit is zero for SD */
1612 azx_stream_clear(chip, azx_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001613 /* program the stream_tag */
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001614 val = azx_sd_readl(azx_dev, SD_CTL);
1615 val = (val & ~SD_CTL_STREAM_TAG_MASK) |
1616 (azx_dev->stream_tag << SD_CTL_STREAM_TAG_SHIFT);
1617 if (!azx_snoop(chip))
1618 val |= SD_CTL_TRAFFIC_PRIO;
1619 azx_sd_writel(azx_dev, SD_CTL, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001620
1621 /* program the length of samples in cyclic buffer */
1622 azx_sd_writel(azx_dev, SD_CBL, azx_dev->bufsize);
1623
1624 /* program the stream format */
1625 /* this value needs to be the same as the one programmed */
1626 azx_sd_writew(azx_dev, SD_FORMAT, azx_dev->format_val);
1627
1628 /* program the stream LVI (last valid index) of the BDL */
1629 azx_sd_writew(azx_dev, SD_LVI, azx_dev->frags - 1);
1630
1631 /* program the BDL address */
1632 /* lower BDL address */
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001633 azx_sd_writel(azx_dev, SD_BDLPL, (u32)azx_dev->bdl.addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001634 /* upper BDL address */
Takashi Iwai766979e2008-06-13 20:53:56 +02001635 azx_sd_writel(azx_dev, SD_BDLPU, upper_32_bits(azx_dev->bdl.addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001636
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02001637 /* enable the position buffer */
David Henningsson4cb36312010-09-30 10:12:50 +02001638 if (chip->position_fix[0] != POS_FIX_LPIB ||
1639 chip->position_fix[1] != POS_FIX_LPIB) {
Takashi Iwaiee9d6b92008-03-14 15:52:20 +01001640 if (!(azx_readl(chip, DPLBASE) & ICH6_DPLBASE_ENABLE))
1641 azx_writel(chip, DPLBASE,
1642 (u32)chip->posbuf.addr | ICH6_DPLBASE_ENABLE);
1643 }
Takashi Iwaic74db862005-05-12 14:26:27 +02001644
Linus Torvalds1da177e2005-04-16 15:20:36 -07001645 /* set the interrupt enable bits in the descriptor control register */
Takashi Iwaid01ce992007-07-27 16:52:19 +02001646 azx_sd_writel(azx_dev, SD_CTL,
1647 azx_sd_readl(azx_dev, SD_CTL) | SD_INT_MASK);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001648
1649 return 0;
1650}
1651
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001652/*
1653 * Probe the given codec address
1654 */
1655static int probe_codec(struct azx *chip, int addr)
1656{
1657 unsigned int cmd = (addr << 28) | (AC_NODE_ROOT << 20) |
1658 (AC_VERB_PARAMETERS << 8) | AC_PAR_VENDOR_ID;
1659 unsigned int res;
1660
Wu Fengguanga678cde2009-08-01 18:46:46 +08001661 mutex_lock(&chip->bus->cmd_mutex);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001662 chip->probing = 1;
1663 azx_send_cmd(chip->bus, cmd);
Wu Fengguangdeadff12009-08-01 18:45:16 +08001664 res = azx_get_response(chip->bus, addr);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001665 chip->probing = 0;
Wu Fengguanga678cde2009-08-01 18:46:46 +08001666 mutex_unlock(&chip->bus->cmd_mutex);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001667 if (res == -1)
1668 return -EIO;
Takashi Iwai4e76a882014-02-25 12:21:03 +01001669 dev_dbg(chip->card->dev, "codec #%d probed OK\n", addr);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001670 return 0;
1671}
1672
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001673static int azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec,
1674 struct hda_pcm *cpcm);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001675static void azx_stop_chip(struct azx *chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001676
Takashi Iwai8dd78332009-06-02 01:16:07 +02001677static void azx_bus_reset(struct hda_bus *bus)
1678{
1679 struct azx *chip = bus->private_data;
Takashi Iwai8dd78332009-06-02 01:16:07 +02001680
1681 bus->in_reset = 1;
1682 azx_stop_chip(chip);
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001683 azx_init_chip(chip, 1);
Alexander Beregalov65f75982009-06-04 13:46:16 +04001684#ifdef CONFIG_PM
Takashi Iwai8dd78332009-06-02 01:16:07 +02001685 if (chip->initialized) {
Takashi Iwai01b65bf2011-11-24 14:31:46 +01001686 struct azx_pcm *p;
1687 list_for_each_entry(p, &chip->pcm_list, list)
1688 snd_pcm_suspend_all(p->pcm);
Takashi Iwai8dd78332009-06-02 01:16:07 +02001689 snd_hda_suspend(chip->bus);
1690 snd_hda_resume(chip->bus);
1691 }
Alexander Beregalov65f75982009-06-04 13:46:16 +04001692#endif
Takashi Iwai8dd78332009-06-02 01:16:07 +02001693 bus->in_reset = 0;
1694}
1695
David Henningsson26a6cb62012-10-09 15:04:21 +02001696static int get_jackpoll_interval(struct azx *chip)
1697{
1698 int i = jackpoll_ms[chip->dev_index];
1699 unsigned int j;
1700 if (i == 0)
1701 return 0;
1702 if (i < 50 || i > 60000)
1703 j = 0;
1704 else
1705 j = msecs_to_jiffies(i);
1706 if (j == 0)
Takashi Iwai4e76a882014-02-25 12:21:03 +01001707 dev_warn(chip->card->dev,
1708 "jackpoll_ms value out of range: %d\n", i);
David Henningsson26a6cb62012-10-09 15:04:21 +02001709 return j;
1710}
1711
Linus Torvalds1da177e2005-04-16 15:20:36 -07001712/*
1713 * Codec initialization
1714 */
1715
Takashi Iwai2f5983f2008-09-03 16:00:44 +02001716/* number of codec slots for each chipset: 0 = default slots (i.e. 4) */
Takashi Iwai48c8b0e2012-12-07 07:40:35 +01001717static unsigned int azx_max_codecs[AZX_NUM_DRIVERS] = {
Wei Ni7445dfc2010-03-03 15:05:53 +08001718 [AZX_DRIVER_NVIDIA] = 8,
Kailang Yangf2690022008-05-27 11:44:55 +02001719 [AZX_DRIVER_TERA] = 1,
Takashi Iwaia9995a32007-03-12 21:30:46 +01001720};
1721
Takashi Iwai48c8b0e2012-12-07 07:40:35 +01001722static int azx_codec_create(struct azx *chip, const char *model)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001723{
1724 struct hda_bus_template bus_temp;
Takashi Iwai34c25352008-10-28 11:38:58 +01001725 int c, codecs, err;
1726 int max_slots;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001727
1728 memset(&bus_temp, 0, sizeof(bus_temp));
1729 bus_temp.private_data = chip;
1730 bus_temp.modelname = model;
1731 bus_temp.pci = chip->pci;
Takashi Iwai111d3af2006-02-16 18:17:58 +01001732 bus_temp.ops.command = azx_send_cmd;
1733 bus_temp.ops.get_response = azx_get_response;
Takashi Iwai176d5332008-07-30 15:01:44 +02001734 bus_temp.ops.attach_pcm = azx_attach_pcm_stream;
Takashi Iwai8dd78332009-06-02 01:16:07 +02001735 bus_temp.ops.bus_reset = azx_bus_reset;
Takashi Iwai83012a72012-08-24 18:38:08 +02001736#ifdef CONFIG_PM
Takashi Iwai11cd41b2008-11-28 07:22:18 +01001737 bus_temp.power_save = &power_save;
Takashi Iwaicb53c622007-08-10 17:21:45 +02001738 bus_temp.ops.pm_notify = azx_power_notify;
1739#endif
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001740#ifdef CONFIG_SND_HDA_DSP_LOADER
1741 bus_temp.ops.load_dsp_prepare = azx_load_dsp_prepare;
1742 bus_temp.ops.load_dsp_trigger = azx_load_dsp_trigger;
1743 bus_temp.ops.load_dsp_cleanup = azx_load_dsp_cleanup;
1744#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07001745
Takashi Iwaid01ce992007-07-27 16:52:19 +02001746 err = snd_hda_bus_new(chip->card, &bus_temp, &chip->bus);
1747 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001748 return err;
1749
Takashi Iwai9477c582011-05-25 09:11:37 +02001750 if (chip->driver_caps & AZX_DCAPS_RIRB_DELAY) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001751 dev_dbg(chip->card->dev, "Enable delay in RIRB handling\n");
Wei Nidc9c8e22008-09-26 13:55:56 +08001752 chip->bus->needs_damn_long_delay = 1;
Takashi Iwai9477c582011-05-25 09:11:37 +02001753 }
Wei Nidc9c8e22008-09-26 13:55:56 +08001754
Takashi Iwai34c25352008-10-28 11:38:58 +01001755 codecs = 0;
Takashi Iwai2f5983f2008-09-03 16:00:44 +02001756 max_slots = azx_max_codecs[chip->driver_type];
1757 if (!max_slots)
Wei Ni7445dfc2010-03-03 15:05:53 +08001758 max_slots = AZX_DEFAULT_CODECS;
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001759
1760 /* First try to probe all given codec slots */
1761 for (c = 0; c < max_slots; c++) {
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01001762 if ((chip->codec_mask & (1 << c)) & chip->codec_probe_mask) {
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001763 if (probe_codec(chip, c) < 0) {
1764 /* Some BIOSen give you wrong codec addresses
1765 * that don't exist
1766 */
Takashi Iwai4e76a882014-02-25 12:21:03 +01001767 dev_warn(chip->card->dev,
1768 "Codec #%d probe error; disabling it...\n", c);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001769 chip->codec_mask &= ~(1 << c);
1770 /* More badly, accessing to a non-existing
1771 * codec often screws up the controller chip,
Paul Menzel24481582010-02-08 20:37:26 +01001772 * and disturbs the further communications.
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001773 * Thus if an error occurs during probing,
1774 * better to reset the controller chip to
1775 * get back to the sanity state.
1776 */
1777 azx_stop_chip(chip);
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001778 azx_init_chip(chip, 1);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001779 }
1780 }
1781 }
1782
Takashi Iwaid507cd62011-04-26 15:25:02 +02001783 /* AMD chipsets often cause the communication stalls upon certain
1784 * sequence like the pin-detection. It seems that forcing the synced
1785 * access works around the stall. Grrr...
1786 */
Takashi Iwai9477c582011-05-25 09:11:37 +02001787 if (chip->driver_caps & AZX_DCAPS_SYNC_WRITE) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001788 dev_dbg(chip->card->dev, "Enable sync_write for stable communication\n");
Takashi Iwaid507cd62011-04-26 15:25:02 +02001789 chip->bus->sync_write = 1;
1790 chip->bus->allow_bus_reset = 1;
1791 }
1792
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001793 /* Then create codec instances */
Takashi Iwai34c25352008-10-28 11:38:58 +01001794 for (c = 0; c < max_slots; c++) {
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01001795 if ((chip->codec_mask & (1 << c)) & chip->codec_probe_mask) {
Takashi Iwaibccad142007-04-24 12:23:53 +02001796 struct hda_codec *codec;
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001797 err = snd_hda_codec_new(chip->bus, c, &codec);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001798 if (err < 0)
1799 continue;
David Henningsson26a6cb62012-10-09 15:04:21 +02001800 codec->jackpoll_interval = get_jackpoll_interval(chip);
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +01001801 codec->beep_mode = chip->beep_mode;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001802 codecs++;
Takashi Iwai19a982b2007-03-21 15:14:35 +01001803 }
1804 }
1805 if (!codecs) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001806 dev_err(chip->card->dev, "no codecs initialized\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001807 return -ENXIO;
1808 }
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001809 return 0;
1810}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001811
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001812/* configure each codec instance */
Bill Pembertone23e7a12012-12-06 12:35:10 -05001813static int azx_codec_configure(struct azx *chip)
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001814{
1815 struct hda_codec *codec;
1816 list_for_each_entry(codec, &chip->bus->codec_list, list) {
1817 snd_hda_codec_configure(codec);
1818 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001819 return 0;
1820}
1821
1822
1823/*
1824 * PCM support
1825 */
1826
1827/* assign a stream for the PCM */
Wu Fengguangef18bed2009-12-25 13:14:27 +08001828static inline struct azx_dev *
1829azx_assign_device(struct azx *chip, struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001830{
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001831 int dev, i, nums;
Wu Fengguangef18bed2009-12-25 13:14:27 +08001832 struct azx_dev *res = NULL;
Takashi Iwaid5cf9912011-10-06 10:07:58 +02001833 /* make a non-zero unique key for the substream */
1834 int key = (substream->pcm->device << 16) | (substream->number << 2) |
1835 (substream->stream + 1);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001836
1837 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001838 dev = chip->playback_index_offset;
1839 nums = chip->playback_streams;
1840 } else {
1841 dev = chip->capture_index_offset;
1842 nums = chip->capture_streams;
1843 }
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001844 for (i = 0; i < nums; i++, dev++) {
1845 struct azx_dev *azx_dev = &chip->azx_dev[dev];
1846 dsp_lock(azx_dev);
1847 if (!azx_dev->opened && !dsp_is_locked(azx_dev)) {
1848 res = azx_dev;
1849 if (res->assigned_key == key) {
1850 res->opened = 1;
1851 res->assigned_key = key;
1852 dsp_unlock(azx_dev);
1853 return azx_dev;
1854 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001855 }
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001856 dsp_unlock(azx_dev);
1857 }
Wu Fengguangef18bed2009-12-25 13:14:27 +08001858 if (res) {
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001859 dsp_lock(res);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001860 res->opened = 1;
Takashi Iwaid5cf9912011-10-06 10:07:58 +02001861 res->assigned_key = key;
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001862 dsp_unlock(res);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001863 }
1864 return res;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001865}
1866
1867/* release the assigned stream */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001868static inline void azx_release_device(struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001869{
1870 azx_dev->opened = 0;
1871}
1872
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001873static cycle_t azx_cc_read(const struct cyclecounter *cc)
1874{
1875 struct azx_dev *azx_dev = container_of(cc, struct azx_dev, azx_cc);
1876 struct snd_pcm_substream *substream = azx_dev->substream;
1877 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1878 struct azx *chip = apcm->chip;
1879
1880 return azx_readl(chip, WALLCLK);
1881}
1882
1883static void azx_timecounter_init(struct snd_pcm_substream *substream,
1884 bool force, cycle_t last)
1885{
1886 struct azx_dev *azx_dev = get_azx_dev(substream);
1887 struct timecounter *tc = &azx_dev->azx_tc;
1888 struct cyclecounter *cc = &azx_dev->azx_cc;
1889 u64 nsec;
1890
1891 cc->read = azx_cc_read;
1892 cc->mask = CLOCKSOURCE_MASK(32);
1893
1894 /*
1895 * Converting from 24 MHz to ns means applying a 125/3 factor.
1896 * To avoid any saturation issues in intermediate operations,
1897 * the 125 factor is applied first. The division is applied
1898 * last after reading the timecounter value.
1899 * Applying the 1/3 factor as part of the multiplication
1900 * requires at least 20 bits for a decent precision, however
1901 * overflows occur after about 4 hours or less, not a option.
1902 */
1903
1904 cc->mult = 125; /* saturation after 195 years */
1905 cc->shift = 0;
1906
1907 nsec = 0; /* audio time is elapsed time since trigger */
1908 timecounter_init(tc, cc, nsec);
1909 if (force)
1910 /*
1911 * force timecounter to use predefined value,
1912 * used for synchronized starts
1913 */
1914 tc->cycle_last = last;
1915}
1916
Dylan Reidae03bbb2013-04-15 11:57:05 -07001917static u64 azx_adjust_codec_delay(struct snd_pcm_substream *substream,
Dylan Reid78daea22013-04-08 18:20:30 -07001918 u64 nsec)
1919{
1920 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1921 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
1922 u64 codec_frames, codec_nsecs;
1923
1924 if (!hinfo->ops.get_delay)
1925 return nsec;
1926
1927 codec_frames = hinfo->ops.get_delay(hinfo, apcm->codec, substream);
1928 codec_nsecs = div_u64(codec_frames * 1000000000LL,
1929 substream->runtime->rate);
1930
Dylan Reidae03bbb2013-04-15 11:57:05 -07001931 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
1932 return nsec + codec_nsecs;
1933
Dylan Reid78daea22013-04-08 18:20:30 -07001934 return (nsec > codec_nsecs) ? nsec - codec_nsecs : 0;
1935}
1936
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001937static int azx_get_wallclock_tstamp(struct snd_pcm_substream *substream,
1938 struct timespec *ts)
1939{
1940 struct azx_dev *azx_dev = get_azx_dev(substream);
1941 u64 nsec;
1942
1943 nsec = timecounter_read(&azx_dev->azx_tc);
1944 nsec = div_u64(nsec, 3); /* can be optimized */
Dylan Reidae03bbb2013-04-15 11:57:05 -07001945 nsec = azx_adjust_codec_delay(substream, nsec);
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001946
1947 *ts = ns_to_timespec(nsec);
1948
1949 return 0;
1950}
1951
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001952static struct snd_pcm_hardware azx_pcm_hw = {
Takashi Iwaid01ce992007-07-27 16:52:19 +02001953 .info = (SNDRV_PCM_INFO_MMAP |
1954 SNDRV_PCM_INFO_INTERLEAVED |
Linus Torvalds1da177e2005-04-16 15:20:36 -07001955 SNDRV_PCM_INFO_BLOCK_TRANSFER |
1956 SNDRV_PCM_INFO_MMAP_VALID |
Pavel Machek927fc862006-08-31 17:03:43 +02001957 /* No full-resume yet implemented */
1958 /* SNDRV_PCM_INFO_RESUME |*/
Takashi Iwai850f0e52008-03-18 17:11:05 +01001959 SNDRV_PCM_INFO_PAUSE |
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001960 SNDRV_PCM_INFO_SYNC_START |
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001961 SNDRV_PCM_INFO_HAS_WALL_CLOCK |
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001962 SNDRV_PCM_INFO_NO_PERIOD_WAKEUP),
Linus Torvalds1da177e2005-04-16 15:20:36 -07001963 .formats = SNDRV_PCM_FMTBIT_S16_LE,
1964 .rates = SNDRV_PCM_RATE_48000,
1965 .rate_min = 48000,
1966 .rate_max = 48000,
1967 .channels_min = 2,
1968 .channels_max = 2,
1969 .buffer_bytes_max = AZX_MAX_BUF_SIZE,
1970 .period_bytes_min = 128,
1971 .period_bytes_max = AZX_MAX_BUF_SIZE / 2,
1972 .periods_min = 2,
1973 .periods_max = AZX_MAX_FRAG,
1974 .fifo_size = 0,
1975};
1976
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001977static int azx_pcm_open(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001978{
1979 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1980 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001981 struct azx *chip = apcm->chip;
1982 struct azx_dev *azx_dev;
1983 struct snd_pcm_runtime *runtime = substream->runtime;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001984 unsigned long flags;
1985 int err;
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001986 int buff_step;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001987
Ingo Molnar62932df2006-01-16 16:34:20 +01001988 mutex_lock(&chip->open_mutex);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001989 azx_dev = azx_assign_device(chip, substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001990 if (azx_dev == NULL) {
Ingo Molnar62932df2006-01-16 16:34:20 +01001991 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001992 return -EBUSY;
1993 }
1994 runtime->hw = azx_pcm_hw;
1995 runtime->hw.channels_min = hinfo->channels_min;
1996 runtime->hw.channels_max = hinfo->channels_max;
1997 runtime->hw.formats = hinfo->formats;
1998 runtime->hw.rates = hinfo->rates;
1999 snd_pcm_limit_hw_rates(runtime);
2000 snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05002001
2002 /* avoid wrap-around with wall-clock */
2003 snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_TIME,
2004 20,
2005 178000000);
2006
Takashi Iwai52409aa2012-01-23 17:10:24 +01002007 if (chip->align_buffer_size)
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05002008 /* constrain buffer sizes to be multiple of 128
2009 bytes. This is more efficient in terms of memory
2010 access but isn't required by the HDA spec and
2011 prevents users from specifying exact period/buffer
2012 sizes. For example for 44.1kHz, a period size set
2013 to 20ms will be rounded to 19.59ms. */
2014 buff_step = 128;
2015 else
2016 /* Don't enforce steps on buffer sizes, still need to
2017 be multiple of 4 bytes (HDA spec). Tested on Intel
2018 HDA controllers, may not work on all devices where
2019 option needs to be disabled */
2020 buff_step = 4;
2021
Joachim Deguara5f1545b2007-03-16 15:01:36 +01002022 snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05002023 buff_step);
Joachim Deguara5f1545b2007-03-16 15:01:36 +01002024 snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05002025 buff_step);
Dylan Reidb4a91cf2012-06-15 19:36:23 -07002026 snd_hda_power_up_d3wait(apcm->codec);
Takashi Iwaid01ce992007-07-27 16:52:19 +02002027 err = hinfo->ops.open(hinfo, apcm->codec, substream);
2028 if (err < 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002029 azx_release_device(azx_dev);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002030 snd_hda_power_down(apcm->codec);
Ingo Molnar62932df2006-01-16 16:34:20 +01002031 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002032 return err;
2033 }
Takashi Iwai70d321e2009-07-03 23:06:45 +02002034 snd_pcm_limit_hw_rates(runtime);
Takashi Iwaiaba66532009-07-05 11:44:46 +02002035 /* sanity check */
2036 if (snd_BUG_ON(!runtime->hw.channels_min) ||
2037 snd_BUG_ON(!runtime->hw.channels_max) ||
2038 snd_BUG_ON(!runtime->hw.formats) ||
2039 snd_BUG_ON(!runtime->hw.rates)) {
2040 azx_release_device(azx_dev);
2041 hinfo->ops.close(hinfo, apcm->codec, substream);
2042 snd_hda_power_down(apcm->codec);
2043 mutex_unlock(&chip->open_mutex);
2044 return -EINVAL;
2045 }
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05002046
2047 /* disable WALLCLOCK timestamps for capture streams
2048 until we figure out how to handle digital inputs */
2049 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
2050 runtime->hw.info &= ~SNDRV_PCM_INFO_HAS_WALL_CLOCK;
2051
Linus Torvalds1da177e2005-04-16 15:20:36 -07002052 spin_lock_irqsave(&chip->reg_lock, flags);
2053 azx_dev->substream = substream;
2054 azx_dev->running = 0;
2055 spin_unlock_irqrestore(&chip->reg_lock, flags);
2056
2057 runtime->private_data = azx_dev;
Takashi Iwai850f0e52008-03-18 17:11:05 +01002058 snd_pcm_set_sync(substream);
Ingo Molnar62932df2006-01-16 16:34:20 +01002059 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002060 return 0;
2061}
2062
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002063static int azx_pcm_close(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002064{
2065 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2066 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002067 struct azx *chip = apcm->chip;
2068 struct azx_dev *azx_dev = get_azx_dev(substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002069 unsigned long flags;
2070
Ingo Molnar62932df2006-01-16 16:34:20 +01002071 mutex_lock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002072 spin_lock_irqsave(&chip->reg_lock, flags);
2073 azx_dev->substream = NULL;
2074 azx_dev->running = 0;
2075 spin_unlock_irqrestore(&chip->reg_lock, flags);
2076 azx_release_device(azx_dev);
2077 hinfo->ops.close(hinfo, apcm->codec, substream);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002078 snd_hda_power_down(apcm->codec);
Ingo Molnar62932df2006-01-16 16:34:20 +01002079 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002080 return 0;
2081}
2082
Takashi Iwaid01ce992007-07-27 16:52:19 +02002083static int azx_pcm_hw_params(struct snd_pcm_substream *substream,
2084 struct snd_pcm_hw_params *hw_params)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002085{
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002086 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2087 struct azx *chip = apcm->chip;
Takashi Iwai97b71c92009-03-18 15:09:13 +01002088 struct azx_dev *azx_dev = get_azx_dev(substream);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002089 int ret;
Takashi Iwai97b71c92009-03-18 15:09:13 +01002090
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002091 dsp_lock(azx_dev);
2092 if (dsp_is_locked(azx_dev)) {
2093 ret = -EBUSY;
2094 goto unlock;
2095 }
2096
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +01002097 mark_runtime_wc(chip, azx_dev, substream, false);
Takashi Iwai97b71c92009-03-18 15:09:13 +01002098 azx_dev->bufsize = 0;
2099 azx_dev->period_bytes = 0;
2100 azx_dev->format_val = 0;
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002101 ret = snd_pcm_lib_malloc_pages(substream,
Takashi Iwaid01ce992007-07-27 16:52:19 +02002102 params_buffer_bytes(hw_params));
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002103 if (ret < 0)
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002104 goto unlock;
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +01002105 mark_runtime_wc(chip, azx_dev, substream, true);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002106 unlock:
2107 dsp_unlock(azx_dev);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002108 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002109}
2110
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002111static int azx_pcm_hw_free(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002112{
2113 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002114 struct azx_dev *azx_dev = get_azx_dev(substream);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002115 struct azx *chip = apcm->chip;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002116 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
2117
2118 /* reset BDL address */
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002119 dsp_lock(azx_dev);
2120 if (!dsp_is_locked(azx_dev)) {
2121 azx_sd_writel(azx_dev, SD_BDLPL, 0);
2122 azx_sd_writel(azx_dev, SD_BDLPU, 0);
2123 azx_sd_writel(azx_dev, SD_CTL, 0);
2124 azx_dev->bufsize = 0;
2125 azx_dev->period_bytes = 0;
2126 azx_dev->format_val = 0;
2127 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002128
Takashi Iwaieb541332010-08-06 13:48:11 +02002129 snd_hda_codec_cleanup(apcm->codec, hinfo, substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002130
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +01002131 mark_runtime_wc(chip, azx_dev, substream, false);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002132 azx_dev->prepared = 0;
2133 dsp_unlock(azx_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002134 return snd_pcm_lib_free_pages(substream);
2135}
2136
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002137static int azx_pcm_prepare(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002138{
2139 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002140 struct azx *chip = apcm->chip;
2141 struct azx_dev *azx_dev = get_azx_dev(substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002142 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002143 struct snd_pcm_runtime *runtime = substream->runtime;
Takashi Iwai62b7e5e2010-10-22 17:15:47 +02002144 unsigned int bufsize, period_bytes, format_val, stream_tag;
Takashi Iwai97b71c92009-03-18 15:09:13 +01002145 int err;
Stephen Warren7c9359762011-06-01 11:14:17 -06002146 struct hda_spdif_out *spdif =
2147 snd_hda_spdif_out_of_nid(apcm->codec, hinfo->nid);
2148 unsigned short ctls = spdif ? spdif->ctls : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002149
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002150 dsp_lock(azx_dev);
2151 if (dsp_is_locked(azx_dev)) {
2152 err = -EBUSY;
2153 goto unlock;
2154 }
2155
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002156 azx_stream_reset(chip, azx_dev);
Takashi Iwai97b71c92009-03-18 15:09:13 +01002157 format_val = snd_hda_calc_stream_format(runtime->rate,
2158 runtime->channels,
2159 runtime->format,
Anssi Hannula32c168c2010-08-03 13:28:57 +03002160 hinfo->maxbps,
Stephen Warren7c9359762011-06-01 11:14:17 -06002161 ctls);
Takashi Iwai97b71c92009-03-18 15:09:13 +01002162 if (!format_val) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002163 dev_err(chip->card->dev,
2164 "invalid format_val, rate=%d, ch=%d, format=%d\n",
2165 runtime->rate, runtime->channels, runtime->format);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002166 err = -EINVAL;
2167 goto unlock;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002168 }
2169
Takashi Iwai97b71c92009-03-18 15:09:13 +01002170 bufsize = snd_pcm_lib_buffer_bytes(substream);
2171 period_bytes = snd_pcm_lib_period_bytes(substream);
2172
Takashi Iwai4e76a882014-02-25 12:21:03 +01002173 dev_dbg(chip->card->dev, "azx_pcm_prepare: bufsize=0x%x, format=0x%x\n",
2174 bufsize, format_val);
Takashi Iwai97b71c92009-03-18 15:09:13 +01002175
2176 if (bufsize != azx_dev->bufsize ||
2177 period_bytes != azx_dev->period_bytes ||
Takashi Iwai915bf292012-09-11 15:19:10 +02002178 format_val != azx_dev->format_val ||
2179 runtime->no_period_wakeup != azx_dev->no_period_wakeup) {
Takashi Iwai97b71c92009-03-18 15:09:13 +01002180 azx_dev->bufsize = bufsize;
2181 azx_dev->period_bytes = period_bytes;
2182 azx_dev->format_val = format_val;
Takashi Iwai915bf292012-09-11 15:19:10 +02002183 azx_dev->no_period_wakeup = runtime->no_period_wakeup;
Takashi Iwai97b71c92009-03-18 15:09:13 +01002184 err = azx_setup_periods(chip, substream, azx_dev);
2185 if (err < 0)
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002186 goto unlock;
Takashi Iwai97b71c92009-03-18 15:09:13 +01002187 }
2188
Takashi Iwaie8648e52013-12-06 17:15:01 +01002189 /* when LPIB delay correction gives a small negative value,
2190 * we ignore it; currently set the threshold statically to
2191 * 64 frames
2192 */
2193 if (runtime->period_size > 64)
2194 azx_dev->delay_negative_threshold = -frames_to_bytes(runtime, 64);
2195 else
2196 azx_dev->delay_negative_threshold = 0;
2197
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002198 /* wallclk has 24Mhz clock source */
2199 azx_dev->period_wallclk = (((runtime->period_size * 24000) /
2200 runtime->rate) * 1000);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002201 azx_setup_controller(chip, azx_dev);
2202 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
2203 azx_dev->fifo_size = azx_sd_readw(azx_dev, SD_FIFOSIZE) + 1;
2204 else
2205 azx_dev->fifo_size = 0;
2206
Takashi Iwai62b7e5e2010-10-22 17:15:47 +02002207 stream_tag = azx_dev->stream_tag;
2208 /* CA-IBG chips need the playback stream starting from 1 */
Takashi Iwai9477c582011-05-25 09:11:37 +02002209 if ((chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND) &&
Takashi Iwai62b7e5e2010-10-22 17:15:47 +02002210 stream_tag > chip->capture_streams)
2211 stream_tag -= chip->capture_streams;
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002212 err = snd_hda_codec_prepare(apcm->codec, hinfo, stream_tag,
Takashi Iwaieb541332010-08-06 13:48:11 +02002213 azx_dev->format_val, substream);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002214
2215 unlock:
2216 if (!err)
2217 azx_dev->prepared = 1;
2218 dsp_unlock(azx_dev);
2219 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002220}
2221
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002222static int azx_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002223{
2224 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002225 struct azx *chip = apcm->chip;
Takashi Iwai850f0e52008-03-18 17:11:05 +01002226 struct azx_dev *azx_dev;
2227 struct snd_pcm_substream *s;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002228 int rstart = 0, start, nsync = 0, sbits = 0;
Takashi Iwai850f0e52008-03-18 17:11:05 +01002229 int nwait, timeout;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002230
Takashi Iwai1a8506d2012-10-16 15:10:08 +02002231 azx_dev = get_azx_dev(substream);
2232 trace_azx_pcm_trigger(chip, azx_dev, cmd);
2233
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002234 if (dsp_is_locked(azx_dev) || !azx_dev->prepared)
2235 return -EPIPE;
2236
Linus Torvalds1da177e2005-04-16 15:20:36 -07002237 switch (cmd) {
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002238 case SNDRV_PCM_TRIGGER_START:
2239 rstart = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002240 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
2241 case SNDRV_PCM_TRIGGER_RESUME:
Takashi Iwai850f0e52008-03-18 17:11:05 +01002242 start = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002243 break;
2244 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
Jaroslav Kysela47123192005-08-15 20:53:07 +02002245 case SNDRV_PCM_TRIGGER_SUSPEND:
Linus Torvalds1da177e2005-04-16 15:20:36 -07002246 case SNDRV_PCM_TRIGGER_STOP:
Takashi Iwai850f0e52008-03-18 17:11:05 +01002247 start = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002248 break;
2249 default:
Takashi Iwai850f0e52008-03-18 17:11:05 +01002250 return -EINVAL;
2251 }
2252
2253 snd_pcm_group_for_each_entry(s, substream) {
2254 if (s->pcm->card != substream->pcm->card)
2255 continue;
2256 azx_dev = get_azx_dev(s);
2257 sbits |= 1 << azx_dev->index;
2258 nsync++;
2259 snd_pcm_trigger_done(s, substream);
2260 }
2261
2262 spin_lock(&chip->reg_lock);
Pierre-Louis Bossart172d3b22012-09-21 18:39:05 -05002263
2264 /* first, set SYNC bits of corresponding streams */
2265 if (chip->driver_caps & AZX_DCAPS_OLD_SSYNC)
2266 azx_writel(chip, OLD_SSYNC,
2267 azx_readl(chip, OLD_SSYNC) | sbits);
2268 else
2269 azx_writel(chip, SSYNC, azx_readl(chip, SSYNC) | sbits);
2270
Takashi Iwai850f0e52008-03-18 17:11:05 +01002271 snd_pcm_group_for_each_entry(s, substream) {
2272 if (s->pcm->card != substream->pcm->card)
2273 continue;
2274 azx_dev = get_azx_dev(s);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002275 if (start) {
2276 azx_dev->start_wallclk = azx_readl(chip, WALLCLK);
2277 if (!rstart)
2278 azx_dev->start_wallclk -=
2279 azx_dev->period_wallclk;
Takashi Iwai850f0e52008-03-18 17:11:05 +01002280 azx_stream_start(chip, azx_dev);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002281 } else {
Takashi Iwai850f0e52008-03-18 17:11:05 +01002282 azx_stream_stop(chip, azx_dev);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002283 }
Takashi Iwai850f0e52008-03-18 17:11:05 +01002284 azx_dev->running = start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002285 }
2286 spin_unlock(&chip->reg_lock);
Takashi Iwai850f0e52008-03-18 17:11:05 +01002287 if (start) {
Takashi Iwai850f0e52008-03-18 17:11:05 +01002288 /* wait until all FIFOs get ready */
2289 for (timeout = 5000; timeout; timeout--) {
2290 nwait = 0;
2291 snd_pcm_group_for_each_entry(s, substream) {
2292 if (s->pcm->card != substream->pcm->card)
2293 continue;
2294 azx_dev = get_azx_dev(s);
2295 if (!(azx_sd_readb(azx_dev, SD_STS) &
2296 SD_STS_FIFO_READY))
2297 nwait++;
2298 }
2299 if (!nwait)
2300 break;
2301 cpu_relax();
2302 }
2303 } else {
2304 /* wait until all RUN bits are cleared */
2305 for (timeout = 5000; timeout; timeout--) {
2306 nwait = 0;
2307 snd_pcm_group_for_each_entry(s, substream) {
2308 if (s->pcm->card != substream->pcm->card)
2309 continue;
2310 azx_dev = get_azx_dev(s);
2311 if (azx_sd_readb(azx_dev, SD_CTL) &
2312 SD_CTL_DMA_START)
2313 nwait++;
2314 }
2315 if (!nwait)
2316 break;
2317 cpu_relax();
2318 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002319 }
Pierre-Louis Bossart172d3b22012-09-21 18:39:05 -05002320 spin_lock(&chip->reg_lock);
2321 /* reset SYNC bits */
2322 if (chip->driver_caps & AZX_DCAPS_OLD_SSYNC)
2323 azx_writel(chip, OLD_SSYNC,
2324 azx_readl(chip, OLD_SSYNC) & ~sbits);
2325 else
2326 azx_writel(chip, SSYNC, azx_readl(chip, SSYNC) & ~sbits);
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05002327 if (start) {
2328 azx_timecounter_init(substream, 0, 0);
2329 if (nsync > 1) {
2330 cycle_t cycle_last;
2331
2332 /* same start cycle for master and group */
2333 azx_dev = get_azx_dev(substream);
2334 cycle_last = azx_dev->azx_tc.cycle_last;
2335
2336 snd_pcm_group_for_each_entry(s, substream) {
2337 if (s->pcm->card != substream->pcm->card)
2338 continue;
2339 azx_timecounter_init(s, 1, cycle_last);
2340 }
2341 }
2342 }
Pierre-Louis Bossart172d3b22012-09-21 18:39:05 -05002343 spin_unlock(&chip->reg_lock);
Takashi Iwai850f0e52008-03-18 17:11:05 +01002344 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002345}
2346
Joseph Chan0e153472008-08-26 14:38:03 +02002347/* get the current DMA position with correction on VIA chips */
2348static unsigned int azx_via_get_position(struct azx *chip,
2349 struct azx_dev *azx_dev)
2350{
2351 unsigned int link_pos, mini_pos, bound_pos;
2352 unsigned int mod_link_pos, mod_dma_pos, mod_mini_pos;
2353 unsigned int fifo_size;
2354
2355 link_pos = azx_sd_readl(azx_dev, SD_LPIB);
Takashi Iwaib4a655e2011-06-07 12:26:56 +02002356 if (azx_dev->substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
Joseph Chan0e153472008-08-26 14:38:03 +02002357 /* Playback, no problem using link position */
2358 return link_pos;
2359 }
2360
2361 /* Capture */
2362 /* For new chipset,
2363 * use mod to get the DMA position just like old chipset
2364 */
2365 mod_dma_pos = le32_to_cpu(*azx_dev->posbuf);
2366 mod_dma_pos %= azx_dev->period_bytes;
2367
2368 /* azx_dev->fifo_size can't get FIFO size of in stream.
2369 * Get from base address + offset.
2370 */
2371 fifo_size = readw(chip->remap_addr + VIA_IN_STREAM0_FIFO_SIZE_OFFSET);
2372
2373 if (azx_dev->insufficient) {
2374 /* Link position never gather than FIFO size */
2375 if (link_pos <= fifo_size)
2376 return 0;
2377
2378 azx_dev->insufficient = 0;
2379 }
2380
2381 if (link_pos <= fifo_size)
2382 mini_pos = azx_dev->bufsize + link_pos - fifo_size;
2383 else
2384 mini_pos = link_pos - fifo_size;
2385
2386 /* Find nearest previous boudary */
2387 mod_mini_pos = mini_pos % azx_dev->period_bytes;
2388 mod_link_pos = link_pos % azx_dev->period_bytes;
2389 if (mod_link_pos >= fifo_size)
2390 bound_pos = link_pos - mod_link_pos;
2391 else if (mod_dma_pos >= mod_mini_pos)
2392 bound_pos = mini_pos - mod_mini_pos;
2393 else {
2394 bound_pos = mini_pos - mod_mini_pos + azx_dev->period_bytes;
2395 if (bound_pos >= azx_dev->bufsize)
2396 bound_pos = 0;
2397 }
2398
2399 /* Calculate real DMA position we want */
2400 return bound_pos + mod_dma_pos;
2401}
2402
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002403static unsigned int azx_get_position(struct azx *chip,
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002404 struct azx_dev *azx_dev,
2405 bool with_check)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002406{
Takashi Iwai21229612013-04-05 07:27:45 +02002407 struct snd_pcm_substream *substream = azx_dev->substream;
2408 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002409 unsigned int pos;
Takashi Iwai21229612013-04-05 07:27:45 +02002410 int stream = substream->stream;
2411 struct hda_pcm_stream *hinfo = apcm->hinfo[stream];
Takashi Iwai1a8506d2012-10-16 15:10:08 +02002412 int delay = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002413
David Henningsson4cb36312010-09-30 10:12:50 +02002414 switch (chip->position_fix[stream]) {
2415 case POS_FIX_LPIB:
2416 /* read LPIB */
2417 pos = azx_sd_readl(azx_dev, SD_LPIB);
2418 break;
2419 case POS_FIX_VIACOMBO:
Joseph Chan0e153472008-08-26 14:38:03 +02002420 pos = azx_via_get_position(chip, azx_dev);
David Henningsson4cb36312010-09-30 10:12:50 +02002421 break;
2422 default:
2423 /* use the position buffer */
2424 pos = le32_to_cpu(*azx_dev->posbuf);
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002425 if (with_check && chip->position_fix[stream] == POS_FIX_AUTO) {
Takashi Iwaia8103642011-06-07 12:23:23 +02002426 if (!pos || pos == (u32)-1) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002427 dev_info(chip->card->dev,
2428 "Invalid position buffer, using LPIB read method instead.\n");
Takashi Iwaia8103642011-06-07 12:23:23 +02002429 chip->position_fix[stream] = POS_FIX_LPIB;
2430 pos = azx_sd_readl(azx_dev, SD_LPIB);
2431 } else
2432 chip->position_fix[stream] = POS_FIX_POSBUF;
2433 }
2434 break;
Takashi Iwaic74db862005-05-12 14:26:27 +02002435 }
David Henningsson4cb36312010-09-30 10:12:50 +02002436
Linus Torvalds1da177e2005-04-16 15:20:36 -07002437 if (pos >= azx_dev->bufsize)
2438 pos = 0;
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002439
2440 /* calculate runtime delay from LPIB */
Takashi Iwai21229612013-04-05 07:27:45 +02002441 if (substream->runtime &&
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002442 chip->position_fix[stream] == POS_FIX_POSBUF &&
2443 (chip->driver_caps & AZX_DCAPS_COUNT_LPIB_DELAY)) {
2444 unsigned int lpib_pos = azx_sd_readl(azx_dev, SD_LPIB);
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002445 if (stream == SNDRV_PCM_STREAM_PLAYBACK)
2446 delay = pos - lpib_pos;
2447 else
2448 delay = lpib_pos - pos;
Takashi Iwaie8648e52013-12-06 17:15:01 +01002449 if (delay < 0) {
2450 if (delay >= azx_dev->delay_negative_threshold)
2451 delay = 0;
2452 else
2453 delay += azx_dev->bufsize;
2454 }
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002455 if (delay >= azx_dev->period_bytes) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002456 dev_info(chip->card->dev,
2457 "Unstable LPIB (%d >= %d); disabling LPIB delay counting\n",
2458 delay, azx_dev->period_bytes);
Takashi Iwai1f046612012-10-16 16:52:26 +02002459 delay = 0;
2460 chip->driver_caps &= ~AZX_DCAPS_COUNT_LPIB_DELAY;
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002461 }
Takashi Iwai21229612013-04-05 07:27:45 +02002462 delay = bytes_to_frames(substream->runtime, delay);
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002463 }
Takashi Iwai21229612013-04-05 07:27:45 +02002464
2465 if (substream->runtime) {
2466 if (hinfo->ops.get_delay)
2467 delay += hinfo->ops.get_delay(hinfo, apcm->codec,
2468 substream);
2469 substream->runtime->delay = delay;
2470 }
2471
Takashi Iwai1a8506d2012-10-16 15:10:08 +02002472 trace_azx_get_position(chip, azx_dev, pos, delay);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002473 return pos;
2474}
2475
2476static snd_pcm_uframes_t azx_pcm_pointer(struct snd_pcm_substream *substream)
2477{
2478 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2479 struct azx *chip = apcm->chip;
2480 struct azx_dev *azx_dev = get_azx_dev(substream);
2481 return bytes_to_frames(substream->runtime,
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002482 azx_get_position(chip, azx_dev, false));
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002483}
2484
2485/*
2486 * Check whether the current DMA position is acceptable for updating
2487 * periods. Returns non-zero if it's OK.
2488 *
2489 * Many HD-audio controllers appear pretty inaccurate about
2490 * the update-IRQ timing. The IRQ is issued before actually the
2491 * data is processed. So, we need to process it afterwords in a
2492 * workqueue.
2493 */
2494static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev)
2495{
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002496 u32 wallclk;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002497 unsigned int pos;
2498
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002499 wallclk = azx_readl(chip, WALLCLK) - azx_dev->start_wallclk;
2500 if (wallclk < (azx_dev->period_wallclk * 2) / 3)
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002501 return -1; /* bogus (too early) interrupt */
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002502
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002503 pos = azx_get_position(chip, azx_dev, true);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002504
Takashi Iwaid6d8bf52010-02-12 18:17:06 +01002505 if (WARN_ONCE(!azx_dev->period_bytes,
2506 "hda-intel: zero azx_dev->period_bytes"))
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002507 return -1; /* this shouldn't happen! */
Jaroslav Kyselaedb39932010-06-02 13:29:17 +02002508 if (wallclk < (azx_dev->period_wallclk * 5) / 4 &&
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002509 pos % azx_dev->period_bytes > azx_dev->period_bytes / 2)
2510 /* NG - it's below the first next period boundary */
2511 return bdl_pos_adj[chip->dev_index] ? 0 : -1;
Jaroslav Kyselaedb39932010-06-02 13:29:17 +02002512 azx_dev->start_wallclk += wallclk;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002513 return 1; /* OK, it's fine */
2514}
2515
2516/*
2517 * The work for pending PCM period updates.
2518 */
2519static void azx_irq_pending_work(struct work_struct *work)
2520{
2521 struct azx *chip = container_of(work, struct azx, irq_pending_work);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002522 int i, pending, ok;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002523
Takashi Iwaia6a950a2008-06-10 17:53:35 +02002524 if (!chip->irq_pending_warned) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002525 dev_info(chip->card->dev,
2526 "IRQ timing workaround is activated for card #%d. Suggest a bigger bdl_pos_adj.\n",
2527 chip->card->number);
Takashi Iwaia6a950a2008-06-10 17:53:35 +02002528 chip->irq_pending_warned = 1;
2529 }
2530
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002531 for (;;) {
2532 pending = 0;
2533 spin_lock_irq(&chip->reg_lock);
2534 for (i = 0; i < chip->num_streams; i++) {
2535 struct azx_dev *azx_dev = &chip->azx_dev[i];
2536 if (!azx_dev->irq_pending ||
2537 !azx_dev->substream ||
2538 !azx_dev->running)
2539 continue;
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002540 ok = azx_position_ok(chip, azx_dev);
2541 if (ok > 0) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002542 azx_dev->irq_pending = 0;
2543 spin_unlock(&chip->reg_lock);
2544 snd_pcm_period_elapsed(azx_dev->substream);
2545 spin_lock(&chip->reg_lock);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002546 } else if (ok < 0) {
2547 pending = 0; /* too early */
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002548 } else
2549 pending++;
2550 }
2551 spin_unlock_irq(&chip->reg_lock);
2552 if (!pending)
2553 return;
Takashi Iwai08af4952010-08-03 14:39:04 +02002554 msleep(1);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002555 }
2556}
2557
2558/* clear irq_pending flags and assure no on-going workq */
2559static void azx_clear_irq_pending(struct azx *chip)
2560{
2561 int i;
2562
2563 spin_lock_irq(&chip->reg_lock);
2564 for (i = 0; i < chip->num_streams; i++)
2565 chip->azx_dev[i].irq_pending = 0;
2566 spin_unlock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002567}
2568
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002569#ifdef CONFIG_X86
2570static int azx_pcm_mmap(struct snd_pcm_substream *substream,
2571 struct vm_area_struct *area)
2572{
2573 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2574 struct azx *chip = apcm->chip;
2575 if (!azx_snoop(chip))
2576 area->vm_page_prot = pgprot_writecombine(area->vm_page_prot);
2577 return snd_pcm_lib_default_mmap(substream, area);
2578}
2579#else
2580#define azx_pcm_mmap NULL
2581#endif
2582
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002583static struct snd_pcm_ops azx_pcm_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002584 .open = azx_pcm_open,
2585 .close = azx_pcm_close,
2586 .ioctl = snd_pcm_lib_ioctl,
2587 .hw_params = azx_pcm_hw_params,
2588 .hw_free = azx_pcm_hw_free,
2589 .prepare = azx_pcm_prepare,
2590 .trigger = azx_pcm_trigger,
2591 .pointer = azx_pcm_pointer,
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05002592 .wall_clock = azx_get_wallclock_tstamp,
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002593 .mmap = azx_pcm_mmap,
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002594 .page = snd_pcm_sgbuf_ops_page,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002595};
2596
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002597static void azx_pcm_free(struct snd_pcm *pcm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002598{
Takashi Iwai176d5332008-07-30 15:01:44 +02002599 struct azx_pcm *apcm = pcm->private_data;
2600 if (apcm) {
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002601 list_del(&apcm->list);
Takashi Iwai176d5332008-07-30 15:01:44 +02002602 kfree(apcm);
2603 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002604}
2605
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002606#define MAX_PREALLOC_SIZE (32 * 1024 * 1024)
2607
Takashi Iwai176d5332008-07-30 15:01:44 +02002608static int
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002609azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec,
2610 struct hda_pcm *cpcm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002611{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002612 struct azx *chip = bus->private_data;
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002613 struct snd_pcm *pcm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002614 struct azx_pcm *apcm;
Takashi Iwai176d5332008-07-30 15:01:44 +02002615 int pcm_dev = cpcm->device;
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002616 unsigned int size;
Takashi Iwai176d5332008-07-30 15:01:44 +02002617 int s, err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002618
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002619 list_for_each_entry(apcm, &chip->pcm_list, list) {
2620 if (apcm->pcm->device == pcm_dev) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002621 dev_err(chip->card->dev, "PCM %d already exists\n",
2622 pcm_dev);
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002623 return -EBUSY;
2624 }
Takashi Iwai176d5332008-07-30 15:01:44 +02002625 }
2626 err = snd_pcm_new(chip->card, cpcm->name, pcm_dev,
2627 cpcm->stream[SNDRV_PCM_STREAM_PLAYBACK].substreams,
2628 cpcm->stream[SNDRV_PCM_STREAM_CAPTURE].substreams,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002629 &pcm);
2630 if (err < 0)
2631 return err;
Takashi Iwai18cb7102009-04-16 10:22:24 +02002632 strlcpy(pcm->name, cpcm->name, sizeof(pcm->name));
Takashi Iwai176d5332008-07-30 15:01:44 +02002633 apcm = kzalloc(sizeof(*apcm), GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002634 if (apcm == NULL)
2635 return -ENOMEM;
2636 apcm->chip = chip;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002637 apcm->pcm = pcm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002638 apcm->codec = codec;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002639 pcm->private_data = apcm;
2640 pcm->private_free = azx_pcm_free;
Takashi Iwai176d5332008-07-30 15:01:44 +02002641 if (cpcm->pcm_type == HDA_PCM_TYPE_MODEM)
2642 pcm->dev_class = SNDRV_PCM_CLASS_MODEM;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002643 list_add_tail(&apcm->list, &chip->pcm_list);
Takashi Iwai176d5332008-07-30 15:01:44 +02002644 cpcm->pcm = pcm;
2645 for (s = 0; s < 2; s++) {
2646 apcm->hinfo[s] = &cpcm->stream[s];
2647 if (cpcm->stream[s].substreams)
2648 snd_pcm_set_ops(pcm, s, &azx_pcm_ops);
2649 }
2650 /* buffer pre-allocation */
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002651 size = CONFIG_SND_HDA_PREALLOC_SIZE * 1024;
2652 if (size > MAX_PREALLOC_SIZE)
2653 size = MAX_PREALLOC_SIZE;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002654 snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV_SG,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002655 snd_dma_pci_data(chip->pci),
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002656 size, MAX_PREALLOC_SIZE);
Takashi Iwai13aeaf62014-02-25 07:53:47 +01002657 /* link to codec */
2658 pcm->dev = &codec->dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002659 return 0;
2660}
2661
2662/*
2663 * mixer creation - all stuff is implemented in hda module
2664 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05002665static int azx_mixer_create(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002666{
2667 return snd_hda_build_controls(chip->bus);
2668}
2669
2670
2671/*
2672 * initialize SD streams
2673 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05002674static int azx_init_stream(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002675{
2676 int i;
2677
2678 /* initialize each stream (aka device)
Takashi Iwaid01ce992007-07-27 16:52:19 +02002679 * assign the starting bdl address to each stream (device)
2680 * and initialize
Linus Torvalds1da177e2005-04-16 15:20:36 -07002681 */
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002682 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002683 struct azx_dev *azx_dev = &chip->azx_dev[i];
Takashi Iwai929861c2006-08-31 16:55:40 +02002684 azx_dev->posbuf = (u32 __iomem *)(chip->posbuf.area + i * 8);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002685 /* offset: SDI0=0x80, SDI1=0xa0, ... SDO3=0x160 */
2686 azx_dev->sd_addr = chip->remap_addr + (0x20 * i + 0x80);
2687 /* int mask: SDI0=0x01, SDI1=0x02, ... SDO3=0x80 */
2688 azx_dev->sd_int_sta_mask = 1 << i;
2689 /* stream tag: must be non-zero and unique */
2690 azx_dev->index = i;
2691 azx_dev->stream_tag = i + 1;
2692 }
2693
2694 return 0;
2695}
2696
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002697static int azx_acquire_irq(struct azx *chip, int do_disconnect)
2698{
Takashi Iwai437a5a42006-11-21 12:14:23 +01002699 if (request_irq(chip->pci->irq, azx_interrupt,
2700 chip->msi ? 0 : IRQF_SHARED,
Takashi Iwai934c2b62011-06-10 16:36:37 +02002701 KBUILD_MODNAME, chip)) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002702 dev_err(chip->card->dev,
2703 "unable to grab IRQ %d, disabling device\n",
2704 chip->pci->irq);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002705 if (do_disconnect)
2706 snd_card_disconnect(chip->card);
2707 return -1;
2708 }
2709 chip->irq = chip->pci->irq;
Takashi Iwai69e13412006-11-21 12:10:55 +01002710 pci_intx(chip->pci, !chip->msi);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002711 return 0;
2712}
2713
Linus Torvalds1da177e2005-04-16 15:20:36 -07002714
Takashi Iwaicb53c622007-08-10 17:21:45 +02002715static void azx_stop_chip(struct azx *chip)
2716{
Takashi Iwai95e99fd2007-08-13 15:29:04 +02002717 if (!chip->initialized)
Takashi Iwaicb53c622007-08-10 17:21:45 +02002718 return;
2719
2720 /* disable interrupts */
2721 azx_int_disable(chip);
2722 azx_int_clear(chip);
2723
2724 /* disable CORB/RIRB */
2725 azx_free_cmd_io(chip);
2726
2727 /* disable position buffer */
2728 azx_writel(chip, DPLBASE, 0);
2729 azx_writel(chip, DPUBASE, 0);
2730
2731 chip->initialized = 0;
2732}
2733
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002734#ifdef CONFIG_SND_HDA_DSP_LOADER
2735/*
2736 * DSP loading code (e.g. for CA0132)
2737 */
2738
2739/* use the first stream for loading DSP */
2740static struct azx_dev *
2741azx_get_dsp_loader_dev(struct azx *chip)
2742{
2743 return &chip->azx_dev[chip->playback_index_offset];
2744}
2745
2746static int azx_load_dsp_prepare(struct hda_bus *bus, unsigned int format,
2747 unsigned int byte_size,
2748 struct snd_dma_buffer *bufp)
2749{
2750 u32 *bdl;
2751 struct azx *chip = bus->private_data;
2752 struct azx_dev *azx_dev;
2753 int err;
2754
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002755 azx_dev = azx_get_dsp_loader_dev(chip);
2756
2757 dsp_lock(azx_dev);
2758 spin_lock_irq(&chip->reg_lock);
2759 if (azx_dev->running || azx_dev->locked) {
2760 spin_unlock_irq(&chip->reg_lock);
2761 err = -EBUSY;
2762 goto unlock;
2763 }
2764 azx_dev->prepared = 0;
2765 chip->saved_azx_dev = *azx_dev;
2766 azx_dev->locked = 1;
2767 spin_unlock_irq(&chip->reg_lock);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002768
2769 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV_SG,
2770 snd_dma_pci_data(chip->pci),
2771 byte_size, bufp);
2772 if (err < 0)
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002773 goto err_alloc;
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002774
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002775 mark_pages_wc(chip, bufp, true);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002776 azx_dev->bufsize = byte_size;
2777 azx_dev->period_bytes = byte_size;
2778 azx_dev->format_val = format;
2779
2780 azx_stream_reset(chip, azx_dev);
2781
2782 /* reset BDL address */
2783 azx_sd_writel(azx_dev, SD_BDLPL, 0);
2784 azx_sd_writel(azx_dev, SD_BDLPU, 0);
2785
2786 azx_dev->frags = 0;
2787 bdl = (u32 *)azx_dev->bdl.area;
2788 err = setup_bdle(chip, bufp, azx_dev, &bdl, 0, byte_size, 0);
2789 if (err < 0)
2790 goto error;
2791
2792 azx_setup_controller(chip, azx_dev);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002793 dsp_unlock(azx_dev);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002794 return azx_dev->stream_tag;
2795
2796 error:
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002797 mark_pages_wc(chip, bufp, false);
2798 snd_dma_free_pages(bufp);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002799 err_alloc:
2800 spin_lock_irq(&chip->reg_lock);
2801 if (azx_dev->opened)
2802 *azx_dev = chip->saved_azx_dev;
2803 azx_dev->locked = 0;
2804 spin_unlock_irq(&chip->reg_lock);
2805 unlock:
2806 dsp_unlock(azx_dev);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002807 return err;
2808}
2809
2810static void azx_load_dsp_trigger(struct hda_bus *bus, bool start)
2811{
2812 struct azx *chip = bus->private_data;
2813 struct azx_dev *azx_dev = azx_get_dsp_loader_dev(chip);
2814
2815 if (start)
2816 azx_stream_start(chip, azx_dev);
2817 else
2818 azx_stream_stop(chip, azx_dev);
2819 azx_dev->running = start;
2820}
2821
2822static void azx_load_dsp_cleanup(struct hda_bus *bus,
2823 struct snd_dma_buffer *dmab)
2824{
2825 struct azx *chip = bus->private_data;
2826 struct azx_dev *azx_dev = azx_get_dsp_loader_dev(chip);
2827
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002828 if (!dmab->area || !azx_dev->locked)
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002829 return;
2830
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002831 dsp_lock(azx_dev);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002832 /* reset BDL address */
2833 azx_sd_writel(azx_dev, SD_BDLPL, 0);
2834 azx_sd_writel(azx_dev, SD_BDLPU, 0);
2835 azx_sd_writel(azx_dev, SD_CTL, 0);
2836 azx_dev->bufsize = 0;
2837 azx_dev->period_bytes = 0;
2838 azx_dev->format_val = 0;
2839
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002840 mark_pages_wc(chip, dmab, false);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002841 snd_dma_free_pages(dmab);
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002842 dmab->area = NULL;
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002843
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002844 spin_lock_irq(&chip->reg_lock);
2845 if (azx_dev->opened)
2846 *azx_dev = chip->saved_azx_dev;
2847 azx_dev->locked = 0;
2848 spin_unlock_irq(&chip->reg_lock);
2849 dsp_unlock(azx_dev);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002850}
2851#endif /* CONFIG_SND_HDA_DSP_LOADER */
2852
Takashi Iwai83012a72012-08-24 18:38:08 +02002853#ifdef CONFIG_PM
Takashi Iwaicb53c622007-08-10 17:21:45 +02002854/* power-up/down the controller */
Takashi Iwai68467f52012-08-28 09:14:29 -07002855static void azx_power_notify(struct hda_bus *bus, bool power_up)
Takashi Iwaicb53c622007-08-10 17:21:45 +02002856{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002857 struct azx *chip = bus->private_data;
Takashi Iwaicb53c622007-08-10 17:21:45 +02002858
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01002859 if (!(chip->driver_caps & AZX_DCAPS_PM_RUNTIME))
2860 return;
2861
Takashi Iwai68467f52012-08-28 09:14:29 -07002862 if (power_up)
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002863 pm_runtime_get_sync(&chip->pci->dev);
2864 else
2865 pm_runtime_put_sync(&chip->pci->dev);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002866}
Takashi Iwai65fcd412012-08-14 17:13:32 +02002867
2868static DEFINE_MUTEX(card_list_lock);
2869static LIST_HEAD(card_list);
2870
2871static void azx_add_card_list(struct azx *chip)
2872{
2873 mutex_lock(&card_list_lock);
2874 list_add(&chip->list, &card_list);
2875 mutex_unlock(&card_list_lock);
2876}
2877
2878static void azx_del_card_list(struct azx *chip)
2879{
2880 mutex_lock(&card_list_lock);
2881 list_del_init(&chip->list);
2882 mutex_unlock(&card_list_lock);
2883}
2884
2885/* trigger power-save check at writing parameter */
2886static int param_set_xint(const char *val, const struct kernel_param *kp)
2887{
2888 struct azx *chip;
2889 struct hda_codec *c;
2890 int prev = power_save;
2891 int ret = param_set_int(val, kp);
2892
2893 if (ret || prev == power_save)
2894 return ret;
2895
2896 mutex_lock(&card_list_lock);
2897 list_for_each_entry(chip, &card_list, list) {
2898 if (!chip->bus || chip->disabled)
2899 continue;
2900 list_for_each_entry(c, &chip->bus->codec_list, list)
2901 snd_hda_power_sync(c);
2902 }
2903 mutex_unlock(&card_list_lock);
2904 return 0;
2905}
2906#else
2907#define azx_add_card_list(chip) /* NOP */
2908#define azx_del_card_list(chip) /* NOP */
Takashi Iwai83012a72012-08-24 18:38:08 +02002909#endif /* CONFIG_PM */
Takashi Iwai5c0b9be2008-12-11 11:47:17 +01002910
Takashi Iwai7ccbde52012-08-14 18:10:09 +02002911#if defined(CONFIG_PM_SLEEP) || defined(SUPPORT_VGA_SWITCHEROO)
Takashi Iwai5c0b9be2008-12-11 11:47:17 +01002912/*
2913 * power management
2914 */
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002915static int azx_suspend(struct device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002916{
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002917 struct pci_dev *pci = to_pci_dev(dev);
2918 struct snd_card *card = dev_get_drvdata(dev);
Takashi Iwai421a1252005-11-17 16:11:09 +01002919 struct azx *chip = card->private_data;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002920 struct azx_pcm *p;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002921
Takashi Iwaic5c21522012-12-04 17:01:25 +01002922 if (chip->disabled)
2923 return 0;
2924
Takashi Iwai421a1252005-11-17 16:11:09 +01002925 snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002926 azx_clear_irq_pending(chip);
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002927 list_for_each_entry(p, &chip->pcm_list, list)
2928 snd_pcm_suspend_all(p->pcm);
Takashi Iwai0b7a2e92007-08-14 15:18:26 +02002929 if (chip->initialized)
Takashi Iwai8dd78332009-06-02 01:16:07 +02002930 snd_hda_suspend(chip->bus);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002931 azx_stop_chip(chip);
Mengdong Lin7295b262013-06-25 05:58:49 -04002932 azx_enter_link_reset(chip);
Takashi Iwai30b35392006-10-11 18:52:53 +02002933 if (chip->irq >= 0) {
Takashi Iwai43001c92006-09-08 12:30:03 +02002934 free_irq(chip->irq, chip);
Takashi Iwai30b35392006-10-11 18:52:53 +02002935 chip->irq = -1;
2936 }
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002937 if (chip->msi)
Takashi Iwai43001c92006-09-08 12:30:03 +02002938 pci_disable_msi(chip->pci);
Takashi Iwai421a1252005-11-17 16:11:09 +01002939 pci_disable_device(pci);
2940 pci_save_state(pci);
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002941 pci_set_power_state(pci, PCI_D3hot);
Wang Xingchao99a20082013-05-30 22:07:10 +08002942 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)
2943 hda_display_power(false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002944 return 0;
2945}
2946
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002947static int azx_resume(struct device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002948{
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002949 struct pci_dev *pci = to_pci_dev(dev);
2950 struct snd_card *card = dev_get_drvdata(dev);
Takashi Iwai421a1252005-11-17 16:11:09 +01002951 struct azx *chip = card->private_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002952
Takashi Iwaic5c21522012-12-04 17:01:25 +01002953 if (chip->disabled)
2954 return 0;
2955
Wang Xingchao99a20082013-05-30 22:07:10 +08002956 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)
2957 hda_display_power(true);
Takashi Iwaid14a7e02009-02-16 10:13:03 +01002958 pci_set_power_state(pci, PCI_D0);
2959 pci_restore_state(pci);
Takashi Iwai30b35392006-10-11 18:52:53 +02002960 if (pci_enable_device(pci) < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002961 dev_err(chip->card->dev,
2962 "pci_enable_device failed, disabling device\n");
Takashi Iwai30b35392006-10-11 18:52:53 +02002963 snd_card_disconnect(card);
2964 return -EIO;
2965 }
2966 pci_set_master(pci);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002967 if (chip->msi)
2968 if (pci_enable_msi(pci) < 0)
2969 chip->msi = 0;
2970 if (azx_acquire_irq(chip, 1) < 0)
Takashi Iwai30b35392006-10-11 18:52:53 +02002971 return -EIO;
Takashi Iwaicb53c622007-08-10 17:21:45 +02002972 azx_init_pci(chip);
Maxim Levitskyd804ad92007-09-03 15:28:04 +02002973
Takashi Iwai7f308302012-05-08 16:52:23 +02002974 azx_init_chip(chip, 1);
Maxim Levitskyd804ad92007-09-03 15:28:04 +02002975
Linus Torvalds1da177e2005-04-16 15:20:36 -07002976 snd_hda_resume(chip->bus);
Takashi Iwai421a1252005-11-17 16:11:09 +01002977 snd_power_change_state(card, SNDRV_CTL_POWER_D0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002978 return 0;
2979}
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002980#endif /* CONFIG_PM_SLEEP || SUPPORT_VGA_SWITCHEROO */
2981
2982#ifdef CONFIG_PM_RUNTIME
2983static int azx_runtime_suspend(struct device *dev)
2984{
2985 struct snd_card *card = dev_get_drvdata(dev);
2986 struct azx *chip = card->private_data;
2987
Dave Airlie246efa42013-07-29 15:19:29 +10002988 if (chip->disabled)
2989 return 0;
2990
2991 if (!(chip->driver_caps & AZX_DCAPS_PM_RUNTIME))
2992 return 0;
2993
Wang Xingchao7d4f6062013-07-25 23:34:46 -04002994 /* enable controller wake up event */
2995 azx_writew(chip, WAKEEN, azx_readw(chip, WAKEEN) |
2996 STATESTS_INT_MASK);
2997
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002998 azx_stop_chip(chip);
Takashi Iwai873ce8a2013-11-26 11:58:40 +01002999 azx_enter_link_reset(chip);
Mengdong Linb8dfc4622012-08-23 17:32:30 +08003000 azx_clear_irq_pending(chip);
Wang Xingchao99a20082013-05-30 22:07:10 +08003001 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)
3002 hda_display_power(false);
Mengdong Linb8dfc4622012-08-23 17:32:30 +08003003 return 0;
3004}
3005
3006static int azx_runtime_resume(struct device *dev)
3007{
3008 struct snd_card *card = dev_get_drvdata(dev);
3009 struct azx *chip = card->private_data;
Wang Xingchao7d4f6062013-07-25 23:34:46 -04003010 struct hda_bus *bus;
3011 struct hda_codec *codec;
3012 int status;
Mengdong Linb8dfc4622012-08-23 17:32:30 +08003013
Dave Airlie246efa42013-07-29 15:19:29 +10003014 if (chip->disabled)
3015 return 0;
3016
3017 if (!(chip->driver_caps & AZX_DCAPS_PM_RUNTIME))
3018 return 0;
3019
Wang Xingchao99a20082013-05-30 22:07:10 +08003020 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)
3021 hda_display_power(true);
Wang Xingchao7d4f6062013-07-25 23:34:46 -04003022
3023 /* Read STATESTS before controller reset */
3024 status = azx_readw(chip, STATESTS);
3025
Mengdong Linb8dfc4622012-08-23 17:32:30 +08003026 azx_init_pci(chip);
3027 azx_init_chip(chip, 1);
Wang Xingchao7d4f6062013-07-25 23:34:46 -04003028
3029 bus = chip->bus;
3030 if (status && bus) {
3031 list_for_each_entry(codec, &bus->codec_list, list)
3032 if (status & (1 << codec->addr))
3033 queue_delayed_work(codec->bus->workq,
3034 &codec->jackpoll_work, codec->jackpoll_interval);
3035 }
3036
3037 /* disable controller Wake Up event*/
3038 azx_writew(chip, WAKEEN, azx_readw(chip, WAKEEN) &
3039 ~STATESTS_INT_MASK);
3040
Mengdong Linb8dfc4622012-08-23 17:32:30 +08003041 return 0;
3042}
Takashi Iwai6eb827d2012-12-12 11:50:12 +01003043
3044static int azx_runtime_idle(struct device *dev)
3045{
3046 struct snd_card *card = dev_get_drvdata(dev);
3047 struct azx *chip = card->private_data;
3048
Dave Airlie246efa42013-07-29 15:19:29 +10003049 if (chip->disabled)
3050 return 0;
3051
Takashi Iwai6eb827d2012-12-12 11:50:12 +01003052 if (!power_save_controller ||
3053 !(chip->driver_caps & AZX_DCAPS_PM_RUNTIME))
3054 return -EBUSY;
3055
3056 return 0;
3057}
3058
Mengdong Linb8dfc4622012-08-23 17:32:30 +08003059#endif /* CONFIG_PM_RUNTIME */
3060
3061#ifdef CONFIG_PM
3062static const struct dev_pm_ops azx_pm = {
3063 SET_SYSTEM_SLEEP_PM_OPS(azx_suspend, azx_resume)
Takashi Iwai6eb827d2012-12-12 11:50:12 +01003064 SET_RUNTIME_PM_OPS(azx_runtime_suspend, azx_runtime_resume, azx_runtime_idle)
Mengdong Linb8dfc4622012-08-23 17:32:30 +08003065};
3066
Takashi Iwai68cb2b52012-07-02 15:20:37 +02003067#define AZX_PM_OPS &azx_pm
3068#else
Takashi Iwai68cb2b52012-07-02 15:20:37 +02003069#define AZX_PM_OPS NULL
Mengdong Linb8dfc4622012-08-23 17:32:30 +08003070#endif /* CONFIG_PM */
Linus Torvalds1da177e2005-04-16 15:20:36 -07003071
3072
3073/*
Takashi Iwai0cbf0092008-10-29 16:18:25 +01003074 * reboot notifier for hang-up problem at power-down
3075 */
3076static int azx_halt(struct notifier_block *nb, unsigned long event, void *buf)
3077{
3078 struct azx *chip = container_of(nb, struct azx, reboot_notifier);
Takashi Iwaifb8d1a32009-11-10 16:02:29 +01003079 snd_hda_bus_reboot_notify(chip->bus);
Takashi Iwai0cbf0092008-10-29 16:18:25 +01003080 azx_stop_chip(chip);
3081 return NOTIFY_OK;
3082}
3083
3084static void azx_notifier_register(struct azx *chip)
3085{
3086 chip->reboot_notifier.notifier_call = azx_halt;
3087 register_reboot_notifier(&chip->reboot_notifier);
3088}
3089
3090static void azx_notifier_unregister(struct azx *chip)
3091{
3092 if (chip->reboot_notifier.notifier_call)
3093 unregister_reboot_notifier(&chip->reboot_notifier);
3094}
3095
Takashi Iwai48c8b0e2012-12-07 07:40:35 +01003096static int azx_probe_continue(struct azx *chip);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003097
Steven Newbury8393ec4a2012-06-08 13:06:29 +02003098#ifdef SUPPORT_VGA_SWITCHEROO
Bill Pembertone23e7a12012-12-06 12:35:10 -05003099static struct pci_dev *get_bound_vga(struct pci_dev *pci);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003100
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003101static void azx_vs_set_state(struct pci_dev *pci,
3102 enum vga_switcheroo_state state)
3103{
3104 struct snd_card *card = pci_get_drvdata(pci);
3105 struct azx *chip = card->private_data;
3106 bool disabled;
3107
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003108 wait_for_completion(&chip->probe_wait);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003109 if (chip->init_failed)
3110 return;
3111
3112 disabled = (state == VGA_SWITCHEROO_OFF);
3113 if (chip->disabled == disabled)
3114 return;
3115
3116 if (!chip->bus) {
3117 chip->disabled = disabled;
3118 if (!disabled) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003119 dev_info(chip->card->dev,
3120 "Start delayed initialization\n");
Takashi Iwai5c906802013-05-30 22:07:09 +08003121 if (azx_probe_continue(chip) < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003122 dev_err(chip->card->dev, "initialization error\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003123 chip->init_failed = true;
3124 }
3125 }
3126 } else {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003127 dev_info(chip->card->dev, "%s via VGA-switcheroo\n",
3128 disabled ? "Disabling" : "Enabling");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003129 if (disabled) {
Dave Airlie246efa42013-07-29 15:19:29 +10003130 pm_runtime_put_sync_suspend(&pci->dev);
Takashi Iwai68cb2b52012-07-02 15:20:37 +02003131 azx_suspend(&pci->dev);
Dave Airlie246efa42013-07-29 15:19:29 +10003132 /* when we get suspended by vga switcheroo we end up in D3cold,
3133 * however we have no ACPI handle, so pci/acpi can't put us there,
3134 * put ourselves there */
3135 pci->current_state = PCI_D3cold;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003136 chip->disabled = true;
Takashi Iwai128960a2012-10-12 17:28:18 +02003137 if (snd_hda_lock_devices(chip->bus))
Takashi Iwai4e76a882014-02-25 12:21:03 +01003138 dev_warn(chip->card->dev,
3139 "Cannot lock devices!\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003140 } else {
3141 snd_hda_unlock_devices(chip->bus);
Dave Airlie246efa42013-07-29 15:19:29 +10003142 pm_runtime_get_noresume(&pci->dev);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003143 chip->disabled = false;
Takashi Iwai68cb2b52012-07-02 15:20:37 +02003144 azx_resume(&pci->dev);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003145 }
3146 }
3147}
3148
3149static bool azx_vs_can_switch(struct pci_dev *pci)
3150{
3151 struct snd_card *card = pci_get_drvdata(pci);
3152 struct azx *chip = card->private_data;
3153
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003154 wait_for_completion(&chip->probe_wait);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003155 if (chip->init_failed)
3156 return false;
3157 if (chip->disabled || !chip->bus)
3158 return true;
3159 if (snd_hda_lock_devices(chip->bus))
3160 return false;
3161 snd_hda_unlock_devices(chip->bus);
3162 return true;
3163}
3164
Bill Pembertone23e7a12012-12-06 12:35:10 -05003165static void init_vga_switcheroo(struct azx *chip)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003166{
3167 struct pci_dev *p = get_bound_vga(chip->pci);
3168 if (p) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003169 dev_info(chip->card->dev,
3170 "Handle VGA-switcheroo audio client\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003171 chip->use_vga_switcheroo = 1;
3172 pci_dev_put(p);
3173 }
3174}
3175
3176static const struct vga_switcheroo_client_ops azx_vs_ops = {
3177 .set_gpu_state = azx_vs_set_state,
3178 .can_switch = azx_vs_can_switch,
3179};
3180
Bill Pembertone23e7a12012-12-06 12:35:10 -05003181static int register_vga_switcheroo(struct azx *chip)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003182{
Takashi Iwai128960a2012-10-12 17:28:18 +02003183 int err;
3184
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003185 if (!chip->use_vga_switcheroo)
3186 return 0;
3187 /* FIXME: currently only handling DIS controller
3188 * is there any machine with two switchable HDMI audio controllers?
3189 */
Takashi Iwai128960a2012-10-12 17:28:18 +02003190 err = vga_switcheroo_register_audio_client(chip->pci, &azx_vs_ops,
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003191 VGA_SWITCHEROO_DIS,
3192 chip->bus != NULL);
Takashi Iwai128960a2012-10-12 17:28:18 +02003193 if (err < 0)
3194 return err;
3195 chip->vga_switcheroo_registered = 1;
Dave Airlie246efa42013-07-29 15:19:29 +10003196
3197 /* register as an optimus hdmi audio power domain */
3198 vga_switcheroo_init_domain_pm_optimus_hdmi_audio(&chip->pci->dev, &chip->hdmi_pm_domain);
Takashi Iwai128960a2012-10-12 17:28:18 +02003199 return 0;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003200}
3201#else
3202#define init_vga_switcheroo(chip) /* NOP */
3203#define register_vga_switcheroo(chip) 0
Steven Newbury8393ec4a2012-06-08 13:06:29 +02003204#define check_hdmi_disabled(pci) false
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003205#endif /* SUPPORT_VGA_SWITCHER */
3206
Takashi Iwai0cbf0092008-10-29 16:18:25 +01003207/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07003208 * destructor
3209 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01003210static int azx_free(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003211{
Wang Xingchaoc67e2222013-05-30 22:07:08 +08003212 struct pci_dev *pci = chip->pci;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003213 int i;
3214
Wang Xingchaoc67e2222013-05-30 22:07:08 +08003215 if ((chip->driver_caps & AZX_DCAPS_PM_RUNTIME)
3216 && chip->running)
3217 pm_runtime_get_noresume(&pci->dev);
3218
Takashi Iwai65fcd412012-08-14 17:13:32 +02003219 azx_del_card_list(chip);
3220
Takashi Iwai0cbf0092008-10-29 16:18:25 +01003221 azx_notifier_unregister(chip);
3222
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003223 chip->init_failed = 1; /* to be sure */
Daniel J Blueman44728e92012-12-18 23:59:33 +08003224 complete_all(&chip->probe_wait);
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003225
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003226 if (use_vga_switcheroo(chip)) {
3227 if (chip->disabled && chip->bus)
3228 snd_hda_unlock_devices(chip->bus);
Takashi Iwai128960a2012-10-12 17:28:18 +02003229 if (chip->vga_switcheroo_registered)
3230 vga_switcheroo_unregister_client(chip->pci);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003231 }
3232
Takashi Iwaice43fba2005-05-30 20:33:44 +02003233 if (chip->initialized) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02003234 azx_clear_irq_pending(chip);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003235 for (i = 0; i < chip->num_streams; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003236 azx_stream_stop(chip, &chip->azx_dev[i]);
Takashi Iwaicb53c622007-08-10 17:21:45 +02003237 azx_stop_chip(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003238 }
3239
Jeff Garzikf000fd82008-04-22 13:50:34 +02003240 if (chip->irq >= 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003241 free_irq(chip->irq, (void*)chip);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02003242 if (chip->msi)
Takashi Iwai30b35392006-10-11 18:52:53 +02003243 pci_disable_msi(chip->pci);
Takashi Iwaif079c252006-06-01 11:42:14 +02003244 if (chip->remap_addr)
3245 iounmap(chip->remap_addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003246
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003247 if (chip->azx_dev) {
3248 for (i = 0; i < chip->num_streams; i++)
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003249 if (chip->azx_dev[i].bdl.area) {
3250 mark_pages_wc(chip, &chip->azx_dev[i].bdl, false);
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003251 snd_dma_free_pages(&chip->azx_dev[i].bdl);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003252 }
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003253 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003254 if (chip->rb.area) {
3255 mark_pages_wc(chip, &chip->rb, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003256 snd_dma_free_pages(&chip->rb);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003257 }
3258 if (chip->posbuf.area) {
3259 mark_pages_wc(chip, &chip->posbuf, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003260 snd_dma_free_pages(&chip->posbuf);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003261 }
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003262 if (chip->region_requested)
3263 pci_release_regions(chip->pci);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003264 pci_disable_device(chip->pci);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003265 kfree(chip->azx_dev);
Takashi Iwai4918cda2012-08-09 12:33:28 +02003266#ifdef CONFIG_SND_HDA_PATCH_LOADER
3267 if (chip->fw)
3268 release_firmware(chip->fw);
3269#endif
Wang Xingchao99a20082013-05-30 22:07:10 +08003270 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL) {
3271 hda_display_power(false);
3272 hda_i915_exit();
3273 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003274 kfree(chip);
3275
3276 return 0;
3277}
3278
Takashi Iwaia98f90f2005-11-17 14:59:02 +01003279static int azx_dev_free(struct snd_device *device)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003280{
3281 return azx_free(device->device_data);
3282}
3283
Steven Newbury8393ec4a2012-06-08 13:06:29 +02003284#ifdef SUPPORT_VGA_SWITCHEROO
Linus Torvalds1da177e2005-04-16 15:20:36 -07003285/*
Takashi Iwai91219472012-04-26 12:13:25 +02003286 * Check of disabled HDMI controller by vga-switcheroo
3287 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003288static struct pci_dev *get_bound_vga(struct pci_dev *pci)
Takashi Iwai91219472012-04-26 12:13:25 +02003289{
3290 struct pci_dev *p;
3291
3292 /* check only discrete GPU */
3293 switch (pci->vendor) {
3294 case PCI_VENDOR_ID_ATI:
3295 case PCI_VENDOR_ID_AMD:
3296 case PCI_VENDOR_ID_NVIDIA:
3297 if (pci->devfn == 1) {
3298 p = pci_get_domain_bus_and_slot(pci_domain_nr(pci->bus),
3299 pci->bus->number, 0);
3300 if (p) {
3301 if ((p->class >> 8) == PCI_CLASS_DISPLAY_VGA)
3302 return p;
3303 pci_dev_put(p);
3304 }
3305 }
3306 break;
3307 }
3308 return NULL;
3309}
3310
Bill Pembertone23e7a12012-12-06 12:35:10 -05003311static bool check_hdmi_disabled(struct pci_dev *pci)
Takashi Iwai91219472012-04-26 12:13:25 +02003312{
3313 bool vga_inactive = false;
3314 struct pci_dev *p = get_bound_vga(pci);
3315
3316 if (p) {
Takashi Iwai12b78a72012-06-07 12:15:16 +02003317 if (vga_switcheroo_get_client_state(p) == VGA_SWITCHEROO_OFF)
Takashi Iwai91219472012-04-26 12:13:25 +02003318 vga_inactive = true;
3319 pci_dev_put(p);
3320 }
3321 return vga_inactive;
3322}
Steven Newbury8393ec4a2012-06-08 13:06:29 +02003323#endif /* SUPPORT_VGA_SWITCHEROO */
Takashi Iwai91219472012-04-26 12:13:25 +02003324
3325/*
Takashi Iwai3372a152007-02-01 15:46:50 +01003326 * white/black-listing for position_fix
3327 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003328static struct snd_pci_quirk position_fix_list[] = {
Takashi Iwaid2e1c972008-06-10 17:53:34 +02003329 SND_PCI_QUIRK(0x1028, 0x01cc, "Dell D820", POS_FIX_LPIB),
3330 SND_PCI_QUIRK(0x1028, 0x01de, "Dell Precision 390", POS_FIX_LPIB),
Takashi Iwai2f703e72009-12-01 14:17:37 +01003331 SND_PCI_QUIRK(0x103c, 0x306d, "HP dv3", POS_FIX_LPIB),
Takashi Iwaid2e1c972008-06-10 17:53:34 +02003332 SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB),
Daniel T Chendd37f8e2010-05-30 01:17:03 -04003333 SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS", POS_FIX_LPIB),
Daniel T Chen9f75c1b2010-05-30 13:08:41 -04003334 SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS M2V", POS_FIX_LPIB),
Daniel T Chene96d3122010-05-27 18:32:18 -04003335 SND_PCI_QUIRK(0x104d, 0x9069, "Sony VPCS11V9E", POS_FIX_LPIB),
David Henningssonb01de4f2012-01-12 16:31:14 +01003336 SND_PCI_QUIRK(0x10de, 0xcb89, "Macbook Pro 7,1", POS_FIX_LPIB),
Daniel T Chen61bb42c2010-05-29 11:04:11 -04003337 SND_PCI_QUIRK(0x1297, 0x3166, "Shuttle", POS_FIX_LPIB),
Daniel T Chen9ec8dda2010-03-28 02:34:40 -04003338 SND_PCI_QUIRK(0x1458, 0xa022, "ga-ma770-ud3", POS_FIX_LPIB),
Takashi Iwai45d4ebf2009-11-30 11:58:30 +01003339 SND_PCI_QUIRK(0x1462, 0x1002, "MSI Wind U115", POS_FIX_LPIB),
Takashi Iwai8815cd02010-04-15 09:02:41 +02003340 SND_PCI_QUIRK(0x1565, 0x8218, "Biostar Microtech", POS_FIX_LPIB),
Daniel T Chenb90c0762010-05-30 19:31:41 -04003341 SND_PCI_QUIRK(0x1849, 0x0888, "775Dual-VSTA", POS_FIX_LPIB),
Daniel T Chen0e0280d2010-04-21 19:55:43 -04003342 SND_PCI_QUIRK(0x8086, 0x2503, "DG965OT AAD63733-203", POS_FIX_LPIB),
Takashi Iwai3372a152007-02-01 15:46:50 +01003343 {}
3344};
3345
Bill Pembertone23e7a12012-12-06 12:35:10 -05003346static int check_position_fix(struct azx *chip, int fix)
Takashi Iwai3372a152007-02-01 15:46:50 +01003347{
3348 const struct snd_pci_quirk *q;
3349
Takashi Iwaic673ba12009-03-17 07:49:14 +01003350 switch (fix) {
Takashi Iwai1dac6692012-09-13 14:59:47 +02003351 case POS_FIX_AUTO:
Takashi Iwaic673ba12009-03-17 07:49:14 +01003352 case POS_FIX_LPIB:
3353 case POS_FIX_POSBUF:
David Henningsson4cb36312010-09-30 10:12:50 +02003354 case POS_FIX_VIACOMBO:
Takashi Iwaia6f2fd52012-02-28 11:58:40 +01003355 case POS_FIX_COMBO:
Takashi Iwaic673ba12009-03-17 07:49:14 +01003356 return fix;
3357 }
3358
Takashi Iwaic673ba12009-03-17 07:49:14 +01003359 q = snd_pci_quirk_lookup(chip->pci, position_fix_list);
3360 if (q) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003361 dev_info(chip->card->dev,
3362 "position_fix set to %d for device %04x:%04x\n",
3363 q->value, q->subvendor, q->subdevice);
Takashi Iwaic673ba12009-03-17 07:49:14 +01003364 return q->value;
Takashi Iwai3372a152007-02-01 15:46:50 +01003365 }
David Henningssonbdd9ef22010-10-04 12:02:14 +02003366
3367 /* Check VIA/ATI HD Audio Controller exist */
Takashi Iwai9477c582011-05-25 09:11:37 +02003368 if (chip->driver_caps & AZX_DCAPS_POSFIX_VIA) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003369 dev_dbg(chip->card->dev, "Using VIACOMBO position fix\n");
David Henningssonbdd9ef22010-10-04 12:02:14 +02003370 return POS_FIX_VIACOMBO;
3371 }
Takashi Iwai9477c582011-05-25 09:11:37 +02003372 if (chip->driver_caps & AZX_DCAPS_POSFIX_LPIB) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003373 dev_dbg(chip->card->dev, "Using LPIB position fix\n");
Takashi Iwai9477c582011-05-25 09:11:37 +02003374 return POS_FIX_LPIB;
3375 }
Takashi Iwaic673ba12009-03-17 07:49:14 +01003376 return POS_FIX_AUTO;
Takashi Iwai3372a152007-02-01 15:46:50 +01003377}
3378
3379/*
Takashi Iwai669ba272007-08-17 09:17:36 +02003380 * black-lists for probe_mask
3381 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003382static struct snd_pci_quirk probe_mask_list[] = {
Takashi Iwai669ba272007-08-17 09:17:36 +02003383 /* Thinkpad often breaks the controller communication when accessing
3384 * to the non-working (or non-existing) modem codec slot.
3385 */
3386 SND_PCI_QUIRK(0x1014, 0x05b7, "Thinkpad Z60", 0x01),
3387 SND_PCI_QUIRK(0x17aa, 0x2010, "Thinkpad X/T/R60", 0x01),
3388 SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X/T/R61", 0x01),
Takashi Iwai0edb9452008-11-07 14:53:09 +01003389 /* broken BIOS */
3390 SND_PCI_QUIRK(0x1028, 0x20ac, "Dell Studio Desktop", 0x01),
Takashi Iwaief1681d2008-11-24 17:29:28 +01003391 /* including bogus ALC268 in slot#2 that conflicts with ALC888 */
3392 SND_PCI_QUIRK(0x17c0, 0x4085, "Medion MD96630", 0x01),
Takashi Iwai20db7cb2009-02-13 08:18:48 +01003393 /* forced codec slots */
Ozan Çağlayan93574842009-05-23 15:00:04 +03003394 SND_PCI_QUIRK(0x1043, 0x1262, "ASUS W5Fm", 0x103),
Takashi Iwai20db7cb2009-02-13 08:18:48 +01003395 SND_PCI_QUIRK(0x1046, 0x1262, "ASUS W5F", 0x103),
Jaroslav Kyselaf3af9052012-04-26 17:52:35 +02003396 /* WinFast VP200 H (Teradici) user reported broken communication */
3397 SND_PCI_QUIRK(0x3a21, 0x040d, "WinFast VP200 H", 0x101),
Takashi Iwai669ba272007-08-17 09:17:36 +02003398 {}
3399};
3400
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003401#define AZX_FORCE_CODEC_MASK 0x100
3402
Bill Pembertone23e7a12012-12-06 12:35:10 -05003403static void check_probe_mask(struct azx *chip, int dev)
Takashi Iwai669ba272007-08-17 09:17:36 +02003404{
3405 const struct snd_pci_quirk *q;
3406
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003407 chip->codec_probe_mask = probe_mask[dev];
3408 if (chip->codec_probe_mask == -1) {
Takashi Iwai669ba272007-08-17 09:17:36 +02003409 q = snd_pci_quirk_lookup(chip->pci, probe_mask_list);
3410 if (q) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003411 dev_info(chip->card->dev,
3412 "probe_mask set to 0x%x for device %04x:%04x\n",
3413 q->value, q->subvendor, q->subdevice);
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003414 chip->codec_probe_mask = q->value;
Takashi Iwai669ba272007-08-17 09:17:36 +02003415 }
3416 }
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003417
3418 /* check forced option */
3419 if (chip->codec_probe_mask != -1 &&
3420 (chip->codec_probe_mask & AZX_FORCE_CODEC_MASK)) {
3421 chip->codec_mask = chip->codec_probe_mask & 0xff;
Takashi Iwai4e76a882014-02-25 12:21:03 +01003422 dev_info(chip->card->dev, "codec_mask forced to 0x%x\n",
3423 chip->codec_mask);
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003424 }
Takashi Iwai669ba272007-08-17 09:17:36 +02003425}
3426
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003427/*
Takashi Iwai716238552009-09-28 13:14:04 +02003428 * white/black-list for enable_msi
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003429 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003430static struct snd_pci_quirk msi_black_list[] = {
David Henningsson693e0cb2013-12-12 09:52:03 +01003431 SND_PCI_QUIRK(0x103c, 0x2191, "HP", 0), /* AMD Hudson */
3432 SND_PCI_QUIRK(0x103c, 0x2192, "HP", 0), /* AMD Hudson */
3433 SND_PCI_QUIRK(0x103c, 0x21f7, "HP", 0), /* AMD Hudson */
3434 SND_PCI_QUIRK(0x103c, 0x21fa, "HP", 0), /* AMD Hudson */
Takashi Iwai9dc83982009-12-22 08:15:01 +01003435 SND_PCI_QUIRK(0x1043, 0x81f2, "ASUS", 0), /* Athlon64 X2 + nvidia */
Takashi Iwai0a27fcf2010-02-15 17:05:28 +01003436 SND_PCI_QUIRK(0x1043, 0x81f6, "ASUS", 0), /* nvidia */
Ralf Gerbigecd21622010-03-09 18:25:47 +01003437 SND_PCI_QUIRK(0x1043, 0x822d, "ASUS", 0), /* Athlon64 X2 + nvidia MCP55 */
Takashi Iwai83f72152013-09-09 10:20:48 +02003438 SND_PCI_QUIRK(0x1179, 0xfb44, "Toshiba Satellite C870", 0), /* AMD Hudson */
Michele Ballabio4193d132010-03-06 21:06:46 +01003439 SND_PCI_QUIRK(0x1849, 0x0888, "ASRock", 0), /* Athlon64 X2 + nvidia */
Takashi Iwai38155952010-04-04 12:14:03 +02003440 SND_PCI_QUIRK(0xa0a0, 0x0575, "Aopen MZ915-M", 0), /* ICH6 */
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003441 {}
3442};
3443
Bill Pembertone23e7a12012-12-06 12:35:10 -05003444static void check_msi(struct azx *chip)
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003445{
3446 const struct snd_pci_quirk *q;
3447
Takashi Iwai716238552009-09-28 13:14:04 +02003448 if (enable_msi >= 0) {
3449 chip->msi = !!enable_msi;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003450 return;
Takashi Iwai716238552009-09-28 13:14:04 +02003451 }
3452 chip->msi = 1; /* enable MSI as default */
3453 q = snd_pci_quirk_lookup(chip->pci, msi_black_list);
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003454 if (q) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003455 dev_info(chip->card->dev,
3456 "msi for device %04x:%04x set to %d\n",
3457 q->subvendor, q->subdevice, q->value);
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003458 chip->msi = q->value;
Takashi Iwai80c43ed2010-03-15 15:51:53 +01003459 return;
3460 }
3461
3462 /* NVidia chipsets seem to cause troubles with MSI */
Takashi Iwai9477c582011-05-25 09:11:37 +02003463 if (chip->driver_caps & AZX_DCAPS_NO_MSI) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003464 dev_info(chip->card->dev, "Disabling MSI\n");
Takashi Iwai80c43ed2010-03-15 15:51:53 +01003465 chip->msi = 0;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003466 }
3467}
3468
Takashi Iwaia1585d72011-12-14 09:27:04 +01003469/* check the snoop mode availability */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003470static void azx_check_snoop_available(struct azx *chip)
Takashi Iwaia1585d72011-12-14 09:27:04 +01003471{
3472 bool snoop = chip->snoop;
3473
3474 switch (chip->driver_type) {
3475 case AZX_DRIVER_VIA:
3476 /* force to non-snoop mode for a new VIA controller
3477 * when BIOS is set
3478 */
3479 if (snoop) {
3480 u8 val;
3481 pci_read_config_byte(chip->pci, 0x42, &val);
3482 if (!(val & 0x80) && chip->pci->revision == 0x30)
3483 snoop = false;
3484 }
3485 break;
3486 case AZX_DRIVER_ATIHDMI_NS:
3487 /* new ATI HDMI requires non-snoop */
3488 snoop = false;
3489 break;
Takashi Iwaic1279f82013-02-07 17:36:22 +01003490 case AZX_DRIVER_CTHDA:
3491 snoop = false;
3492 break;
Takashi Iwaia1585d72011-12-14 09:27:04 +01003493 }
3494
3495 if (snoop != chip->snoop) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003496 dev_info(chip->card->dev, "Force to %s mode\n",
3497 snoop ? "snoop" : "non-snoop");
Takashi Iwaia1585d72011-12-14 09:27:04 +01003498 chip->snoop = snoop;
3499 }
3500}
Takashi Iwai669ba272007-08-17 09:17:36 +02003501
Wang Xingchao99a20082013-05-30 22:07:10 +08003502static void azx_probe_work(struct work_struct *work)
3503{
3504 azx_probe_continue(container_of(work, struct azx, probe_work));
3505}
Wang Xingchao99a20082013-05-30 22:07:10 +08003506
Takashi Iwai669ba272007-08-17 09:17:36 +02003507/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07003508 * constructor
3509 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003510static int azx_create(struct snd_card *card, struct pci_dev *pci,
3511 int dev, unsigned int driver_caps,
3512 struct azx **rchip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003513{
Takashi Iwaia98f90f2005-11-17 14:59:02 +01003514 static struct snd_device_ops ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003515 .dev_free = azx_dev_free,
3516 };
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003517 struct azx *chip;
3518 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003519
3520 *rchip = NULL;
Tobin Davisbcd72002008-01-15 11:23:55 +01003521
Pavel Machek927fc862006-08-31 17:03:43 +02003522 err = pci_enable_device(pci);
3523 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003524 return err;
3525
Takashi Iwaie560d8d2005-09-09 14:21:46 +02003526 chip = kzalloc(sizeof(*chip), GFP_KERNEL);
Pavel Machek927fc862006-08-31 17:03:43 +02003527 if (!chip) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003528 dev_err(card->dev, "Cannot allocate chip\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07003529 pci_disable_device(pci);
3530 return -ENOMEM;
3531 }
3532
3533 spin_lock_init(&chip->reg_lock);
Ingo Molnar62932df2006-01-16 16:34:20 +01003534 mutex_init(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003535 chip->card = card;
3536 chip->pci = pci;
3537 chip->irq = -1;
Takashi Iwai9477c582011-05-25 09:11:37 +02003538 chip->driver_caps = driver_caps;
3539 chip->driver_type = driver_caps & 0xff;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003540 check_msi(chip);
Takashi Iwai555e2192008-06-10 17:53:34 +02003541 chip->dev_index = dev;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02003542 INIT_WORK(&chip->irq_pending_work, azx_irq_pending_work);
Takashi Iwai01b65bf2011-11-24 14:31:46 +01003543 INIT_LIST_HEAD(&chip->pcm_list);
Takashi Iwai65fcd412012-08-14 17:13:32 +02003544 INIT_LIST_HEAD(&chip->list);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003545 init_vga_switcheroo(chip);
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003546 init_completion(&chip->probe_wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003547
Shahin Ghazinouribeaffc32010-05-11 08:19:55 +02003548 chip->position_fix[0] = chip->position_fix[1] =
3549 check_position_fix(chip, position_fix[dev]);
Takashi Iwaia6f2fd52012-02-28 11:58:40 +01003550 /* combo mode uses LPIB for playback */
3551 if (chip->position_fix[0] == POS_FIX_COMBO) {
3552 chip->position_fix[0] = POS_FIX_LPIB;
3553 chip->position_fix[1] = POS_FIX_AUTO;
3554 }
3555
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003556 check_probe_mask(chip, dev);
Takashi Iwai3372a152007-02-01 15:46:50 +01003557
Takashi Iwai27346162006-01-12 18:28:44 +01003558 chip->single_cmd = single_cmd;
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003559 chip->snoop = hda_snoop;
Takashi Iwaia1585d72011-12-14 09:27:04 +01003560 azx_check_snoop_available(chip);
Takashi Iwaic74db862005-05-12 14:26:27 +02003561
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02003562 if (bdl_pos_adj[dev] < 0) {
3563 switch (chip->driver_type) {
Takashi Iwai0c6341a2008-06-13 20:50:27 +02003564 case AZX_DRIVER_ICH:
Seth Heasley32679f92010-02-22 17:31:09 -08003565 case AZX_DRIVER_PCH:
Takashi Iwai0c6341a2008-06-13 20:50:27 +02003566 bdl_pos_adj[dev] = 1;
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02003567 break;
3568 default:
Takashi Iwai0c6341a2008-06-13 20:50:27 +02003569 bdl_pos_adj[dev] = 32;
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02003570 break;
3571 }
3572 }
3573
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003574 err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
3575 if (err < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003576 dev_err(card->dev, "Error creating device [card]!\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003577 azx_free(chip);
3578 return err;
3579 }
3580
Wang Xingchao99a20082013-05-30 22:07:10 +08003581 /* continue probing in work context as may trigger request module */
3582 INIT_WORK(&chip->probe_work, azx_probe_work);
Wang Xingchao99a20082013-05-30 22:07:10 +08003583
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003584 *rchip = chip;
Wang Xingchao99a20082013-05-30 22:07:10 +08003585
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003586 return 0;
3587}
3588
Takashi Iwai48c8b0e2012-12-07 07:40:35 +01003589static int azx_first_init(struct azx *chip)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003590{
3591 int dev = chip->dev_index;
3592 struct pci_dev *pci = chip->pci;
3593 struct snd_card *card = chip->card;
3594 int i, err;
3595 unsigned short gcap;
3596
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003597#if BITS_PER_LONG != 64
3598 /* Fix up base address on ULI M5461 */
3599 if (chip->driver_type == AZX_DRIVER_ULI) {
3600 u16 tmp3;
3601 pci_read_config_word(pci, 0x40, &tmp3);
3602 pci_write_config_word(pci, 0x40, tmp3 | 0x10);
3603 pci_write_config_dword(pci, PCI_BASE_ADDRESS_1, 0);
3604 }
3605#endif
3606
Pavel Machek927fc862006-08-31 17:03:43 +02003607 err = pci_request_regions(pci, "ICH HD audio");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003608 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003609 return err;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003610 chip->region_requested = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003611
Pavel Machek927fc862006-08-31 17:03:43 +02003612 chip->addr = pci_resource_start(pci, 0);
Arjan van de Ven2f5ad542008-09-28 16:20:09 -07003613 chip->remap_addr = pci_ioremap_bar(pci, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003614 if (chip->remap_addr == NULL) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003615 dev_err(card->dev, "ioremap error\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003616 return -ENXIO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003617 }
3618
Takashi Iwai68e7fff2006-10-23 13:40:59 +02003619 if (chip->msi)
3620 if (pci_enable_msi(pci) < 0)
3621 chip->msi = 0;
Stephen Hemminger7376d012006-08-21 19:17:46 +02003622
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003623 if (azx_acquire_irq(chip, 0) < 0)
3624 return -EBUSY;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003625
3626 pci_set_master(pci);
3627 synchronize_irq(chip->irq);
3628
Tobin Davisbcd72002008-01-15 11:23:55 +01003629 gcap = azx_readw(chip, GCAP);
Takashi Iwai4e76a882014-02-25 12:21:03 +01003630 dev_dbg(card->dev, "chipset global capabilities = 0x%x\n", gcap);
Tobin Davisbcd72002008-01-15 11:23:55 +01003631
Andiry Brienzadc4c2e62009-07-08 13:55:31 +08003632 /* disable SB600 64bit support for safety */
Takashi Iwai9477c582011-05-25 09:11:37 +02003633 if (chip->pci->vendor == PCI_VENDOR_ID_ATI) {
Andiry Brienzadc4c2e62009-07-08 13:55:31 +08003634 struct pci_dev *p_smbus;
3635 p_smbus = pci_get_device(PCI_VENDOR_ID_ATI,
3636 PCI_DEVICE_ID_ATI_SBX00_SMBUS,
3637 NULL);
3638 if (p_smbus) {
3639 if (p_smbus->revision < 0x30)
3640 gcap &= ~ICH6_GCAP_64OK;
3641 pci_dev_put(p_smbus);
3642 }
3643 }
Takashi Iwai09240cf2009-03-17 07:47:18 +01003644
Takashi Iwai9477c582011-05-25 09:11:37 +02003645 /* disable 64bit DMA address on some devices */
3646 if (chip->driver_caps & AZX_DCAPS_NO_64BIT) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003647 dev_dbg(card->dev, "Disabling 64bit DMA\n");
Jaroslav Kysela396087e2009-12-09 10:44:47 +01003648 gcap &= ~ICH6_GCAP_64OK;
Takashi Iwai9477c582011-05-25 09:11:37 +02003649 }
Jaroslav Kysela396087e2009-12-09 10:44:47 +01003650
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003651 /* disable buffer size rounding to 128-byte multiples if supported */
Takashi Iwai7bfe0592012-01-23 17:53:39 +01003652 if (align_buffer_size >= 0)
3653 chip->align_buffer_size = !!align_buffer_size;
3654 else {
3655 if (chip->driver_caps & AZX_DCAPS_BUFSIZE)
3656 chip->align_buffer_size = 0;
3657 else if (chip->driver_caps & AZX_DCAPS_ALIGN_BUFSIZE)
3658 chip->align_buffer_size = 1;
3659 else
3660 chip->align_buffer_size = 1;
3661 }
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003662
Takashi Iwaicf7aaca2008-02-06 15:05:57 +01003663 /* allow 64bit DMA address if supported by H/W */
Takashi Iwaib21fadb2009-05-28 12:26:15 +02003664 if ((gcap & ICH6_GCAP_64OK) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64)))
Yang Hongyange9304382009-04-13 14:40:14 -07003665 pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(64));
Takashi Iwai09240cf2009-03-17 07:47:18 +01003666 else {
Yang Hongyange9304382009-04-13 14:40:14 -07003667 pci_set_dma_mask(pci, DMA_BIT_MASK(32));
3668 pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(32));
Takashi Iwai09240cf2009-03-17 07:47:18 +01003669 }
Takashi Iwaicf7aaca2008-02-06 15:05:57 +01003670
Takashi Iwai8b6ed8e2008-02-19 11:36:35 +01003671 /* read number of streams from GCAP register instead of using
3672 * hardcoded value
3673 */
3674 chip->capture_streams = (gcap >> 8) & 0x0f;
3675 chip->playback_streams = (gcap >> 12) & 0x0f;
3676 if (!chip->playback_streams && !chip->capture_streams) {
Tobin Davisbcd72002008-01-15 11:23:55 +01003677 /* gcap didn't give any info, switching to old method */
3678
3679 switch (chip->driver_type) {
3680 case AZX_DRIVER_ULI:
3681 chip->playback_streams = ULI_NUM_PLAYBACK;
3682 chip->capture_streams = ULI_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01003683 break;
3684 case AZX_DRIVER_ATIHDMI:
Andiry Xu1815b342011-12-14 16:10:27 +08003685 case AZX_DRIVER_ATIHDMI_NS:
Tobin Davisbcd72002008-01-15 11:23:55 +01003686 chip->playback_streams = ATIHDMI_NUM_PLAYBACK;
3687 chip->capture_streams = ATIHDMI_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01003688 break;
Yang, Libinc4da29c2008-11-13 11:07:07 +01003689 case AZX_DRIVER_GENERIC:
Tobin Davisbcd72002008-01-15 11:23:55 +01003690 default:
3691 chip->playback_streams = ICH6_NUM_PLAYBACK;
3692 chip->capture_streams = ICH6_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01003693 break;
3694 }
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003695 }
Takashi Iwai8b6ed8e2008-02-19 11:36:35 +01003696 chip->capture_index_offset = 0;
3697 chip->playback_index_offset = chip->capture_streams;
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003698 chip->num_streams = chip->playback_streams + chip->capture_streams;
Takashi Iwaid01ce992007-07-27 16:52:19 +02003699 chip->azx_dev = kcalloc(chip->num_streams, sizeof(*chip->azx_dev),
3700 GFP_KERNEL);
Pavel Machek927fc862006-08-31 17:03:43 +02003701 if (!chip->azx_dev) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003702 dev_err(card->dev, "cannot malloc azx_dev\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003703 return -ENOMEM;
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003704 }
3705
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003706 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaieb49faa2013-03-15 09:19:11 +01003707 dsp_lock_init(&chip->azx_dev[i]);
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003708 /* allocate memory for the BDL for each stream */
3709 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
3710 snd_dma_pci_data(chip->pci),
3711 BDL_SIZE, &chip->azx_dev[i].bdl);
3712 if (err < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003713 dev_err(card->dev, "cannot allocate BDL\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003714 return -ENOMEM;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003715 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003716 mark_pages_wc(chip, &chip->azx_dev[i].bdl, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003717 }
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02003718 /* allocate memory for the position buffer */
Takashi Iwaid01ce992007-07-27 16:52:19 +02003719 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
3720 snd_dma_pci_data(chip->pci),
3721 chip->num_streams * 8, &chip->posbuf);
3722 if (err < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003723 dev_err(card->dev, "cannot allocate posbuf\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003724 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003725 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003726 mark_pages_wc(chip, &chip->posbuf, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003727 /* allocate CORB/RIRB */
Takashi Iwai81740862009-05-26 15:22:00 +02003728 err = azx_alloc_cmd_io(chip);
3729 if (err < 0)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003730 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003731
3732 /* initialize streams */
3733 azx_init_stream(chip);
3734
3735 /* initialize chip */
Takashi Iwaicb53c622007-08-10 17:21:45 +02003736 azx_init_pci(chip);
Jaroslav Kysela10e77dd2010-03-26 11:04:38 +01003737 azx_init_chip(chip, (probe_only[dev] & 2) == 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003738
3739 /* codec detection */
Pavel Machek927fc862006-08-31 17:03:43 +02003740 if (!chip->codec_mask) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003741 dev_err(card->dev, "no codecs found!\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003742 return -ENODEV;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003743 }
3744
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003745 strcpy(card->driver, "HDA-Intel");
Takashi Iwai18cb7102009-04-16 10:22:24 +02003746 strlcpy(card->shortname, driver_short_names[chip->driver_type],
3747 sizeof(card->shortname));
3748 snprintf(card->longname, sizeof(card->longname),
3749 "%s at 0x%lx irq %i",
3750 card->shortname, chip->addr, chip->irq);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003751
Linus Torvalds1da177e2005-04-16 15:20:36 -07003752 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003753}
3754
Takashi Iwaicb53c622007-08-10 17:21:45 +02003755static void power_down_all_codecs(struct azx *chip)
3756{
Takashi Iwai83012a72012-08-24 18:38:08 +02003757#ifdef CONFIG_PM
Takashi Iwaicb53c622007-08-10 17:21:45 +02003758 /* The codecs were powered up in snd_hda_codec_new().
3759 * Now all initialization done, so turn them down if possible
3760 */
3761 struct hda_codec *codec;
3762 list_for_each_entry(codec, &chip->bus->codec_list, list) {
3763 snd_hda_power_down(codec);
3764 }
3765#endif
3766}
3767
Takashi Iwai97c6a3d2012-08-09 17:40:46 +02003768#ifdef CONFIG_SND_HDA_PATCH_LOADER
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003769/* callback from request_firmware_nowait() */
3770static void azx_firmware_cb(const struct firmware *fw, void *context)
3771{
3772 struct snd_card *card = context;
3773 struct azx *chip = card->private_data;
3774 struct pci_dev *pci = chip->pci;
3775
3776 if (!fw) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003777 dev_err(card->dev, "Cannot load firmware, aborting\n");
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003778 goto error;
3779 }
3780
3781 chip->fw = fw;
3782 if (!chip->disabled) {
3783 /* continue probing */
3784 if (azx_probe_continue(chip))
3785 goto error;
3786 }
3787 return; /* OK */
3788
3789 error:
3790 snd_card_free(card);
3791 pci_set_drvdata(pci, NULL);
3792}
Takashi Iwai97c6a3d2012-08-09 17:40:46 +02003793#endif
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003794
Bill Pembertone23e7a12012-12-06 12:35:10 -05003795static int azx_probe(struct pci_dev *pci,
3796 const struct pci_device_id *pci_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003797{
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003798 static int dev;
Takashi Iwaia98f90f2005-11-17 14:59:02 +01003799 struct snd_card *card;
3800 struct azx *chip;
Takashi Iwaiaad730d2013-12-02 13:33:57 +01003801 bool schedule_probe;
Pavel Machek927fc862006-08-31 17:03:43 +02003802 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003803
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003804 if (dev >= SNDRV_CARDS)
3805 return -ENODEV;
3806 if (!enable[dev]) {
3807 dev++;
3808 return -ENOENT;
3809 }
3810
Takashi Iwai60c57722014-01-29 14:20:19 +01003811 err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,
3812 0, &card);
Takashi Iwaie58de7b2008-12-28 16:44:30 +01003813 if (err < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003814 dev_err(&pci->dev, "Error creating card!\n");
Takashi Iwaie58de7b2008-12-28 16:44:30 +01003815 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003816 }
3817
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003818 err = azx_create(card, pci, dev, pci_id->driver_data, &chip);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003819 if (err < 0)
3820 goto out_free;
Takashi Iwai421a1252005-11-17 16:11:09 +01003821 card->private_data = chip;
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003822
3823 pci_set_drvdata(pci, card);
3824
3825 err = register_vga_switcheroo(chip);
3826 if (err < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003827 dev_err(card->dev, "Error registering VGA-switcheroo client\n");
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003828 goto out_free;
3829 }
3830
3831 if (check_hdmi_disabled(pci)) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003832 dev_info(card->dev, "VGA controller is disabled\n");
3833 dev_info(card->dev, "Delaying initialization\n");
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003834 chip->disabled = true;
3835 }
3836
Takashi Iwaiaad730d2013-12-02 13:33:57 +01003837 schedule_probe = !chip->disabled;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003838
Takashi Iwai4918cda2012-08-09 12:33:28 +02003839#ifdef CONFIG_SND_HDA_PATCH_LOADER
3840 if (patch[dev] && *patch[dev]) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003841 dev_info(card->dev, "Applying patch firmware '%s'\n",
3842 patch[dev]);
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003843 err = request_firmware_nowait(THIS_MODULE, true, patch[dev],
3844 &pci->dev, GFP_KERNEL, card,
3845 azx_firmware_cb);
Takashi Iwai4918cda2012-08-09 12:33:28 +02003846 if (err < 0)
3847 goto out_free;
Takashi Iwaiaad730d2013-12-02 13:33:57 +01003848 schedule_probe = false; /* continued in azx_firmware_cb() */
Takashi Iwai4918cda2012-08-09 12:33:28 +02003849 }
3850#endif /* CONFIG_SND_HDA_PATCH_LOADER */
3851
Takashi Iwaiaad730d2013-12-02 13:33:57 +01003852#ifndef CONFIG_SND_HDA_I915
3853 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)
Takashi Iwai4e76a882014-02-25 12:21:03 +01003854 dev_err(card->dev, "Haswell must build in CONFIG_SND_HDA_I915\n");
Wang Xingchao99a20082013-05-30 22:07:10 +08003855#endif
Wang Xingchao99a20082013-05-30 22:07:10 +08003856
Takashi Iwaiaad730d2013-12-02 13:33:57 +01003857 if (schedule_probe)
3858 schedule_work(&chip->probe_work);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003859
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003860 dev++;
Takashi Iwai88d071f2013-12-02 11:12:28 +01003861 if (chip->disabled)
3862 complete_all(&chip->probe_wait);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003863 return 0;
3864
3865out_free:
3866 snd_card_free(card);
3867 return err;
3868}
3869
Takashi Iwai48c8b0e2012-12-07 07:40:35 +01003870static int azx_probe_continue(struct azx *chip)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003871{
Wang Xingchaoc67e2222013-05-30 22:07:08 +08003872 struct pci_dev *pci = chip->pci;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003873 int dev = chip->dev_index;
3874 int err;
3875
Wang Xingchao99a20082013-05-30 22:07:10 +08003876 /* Request power well for Haswell HDA controller and codec */
3877 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL) {
David Henningssonc841ad22013-08-19 13:32:30 +02003878#ifdef CONFIG_SND_HDA_I915
Wang Xingchao99a20082013-05-30 22:07:10 +08003879 err = hda_i915_init();
3880 if (err < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003881 dev_err(chip->card->dev,
3882 "Error request power-well from i915\n");
Wang Xingchao99a20082013-05-30 22:07:10 +08003883 goto out_free;
3884 }
David Henningssonc841ad22013-08-19 13:32:30 +02003885#endif
Wang Xingchao99a20082013-05-30 22:07:10 +08003886 hda_display_power(true);
3887 }
3888
Takashi Iwai5c906802013-05-30 22:07:09 +08003889 err = azx_first_init(chip);
3890 if (err < 0)
3891 goto out_free;
3892
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +01003893#ifdef CONFIG_SND_HDA_INPUT_BEEP
3894 chip->beep_mode = beep_mode[dev];
3895#endif
3896
Linus Torvalds1da177e2005-04-16 15:20:36 -07003897 /* create codec instances */
Takashi Iwaia1e21c92009-06-17 09:33:52 +02003898 err = azx_codec_create(chip, model[dev]);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003899 if (err < 0)
3900 goto out_free;
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003901#ifdef CONFIG_SND_HDA_PATCH_LOADER
Takashi Iwai4918cda2012-08-09 12:33:28 +02003902 if (chip->fw) {
3903 err = snd_hda_load_patch(chip->bus, chip->fw->size,
3904 chip->fw->data);
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003905 if (err < 0)
3906 goto out_free;
Takashi Iwaie39ae852012-11-22 16:18:13 +01003907#ifndef CONFIG_PM
Takashi Iwai4918cda2012-08-09 12:33:28 +02003908 release_firmware(chip->fw); /* no longer needed */
3909 chip->fw = NULL;
Takashi Iwaie39ae852012-11-22 16:18:13 +01003910#endif
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003911 }
3912#endif
Jaroslav Kysela10e77dd2010-03-26 11:04:38 +01003913 if ((probe_only[dev] & 1) == 0) {
Takashi Iwaia1e21c92009-06-17 09:33:52 +02003914 err = azx_codec_configure(chip);
3915 if (err < 0)
3916 goto out_free;
3917 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003918
3919 /* create PCM streams */
Takashi Iwai176d5332008-07-30 15:01:44 +02003920 err = snd_hda_build_pcms(chip->bus);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003921 if (err < 0)
3922 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003923
3924 /* create mixer controls */
Takashi Iwaid01ce992007-07-27 16:52:19 +02003925 err = azx_mixer_create(chip);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003926 if (err < 0)
3927 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003928
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003929 err = snd_card_register(chip->card);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003930 if (err < 0)
3931 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003932
Takashi Iwaicb53c622007-08-10 17:21:45 +02003933 chip->running = 1;
3934 power_down_all_codecs(chip);
Takashi Iwai0cbf0092008-10-29 16:18:25 +01003935 azx_notifier_register(chip);
Takashi Iwai65fcd412012-08-14 17:13:32 +02003936 azx_add_card_list(chip);
Dave Airlie246efa42013-07-29 15:19:29 +10003937 if ((chip->driver_caps & AZX_DCAPS_PM_RUNTIME) || chip->use_vga_switcheroo)
Wang Xingchaoc67e2222013-05-30 22:07:08 +08003938 pm_runtime_put_noidle(&pci->dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003939
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003940out_free:
Takashi Iwai88d071f2013-12-02 11:12:28 +01003941 if (err < 0)
3942 chip->init_failed = 1;
3943 complete_all(&chip->probe_wait);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003944 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003945}
3946
Bill Pembertone23e7a12012-12-06 12:35:10 -05003947static void azx_remove(struct pci_dev *pci)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003948{
Takashi Iwai91219472012-04-26 12:13:25 +02003949 struct snd_card *card = pci_get_drvdata(pci);
Mengdong Linb8dfc4622012-08-23 17:32:30 +08003950
Takashi Iwai91219472012-04-26 12:13:25 +02003951 if (card)
3952 snd_card_free(card);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003953}
3954
3955/* PCI IDs */
Alexey Dobriyancebe41d2010-02-06 00:21:03 +02003956static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
Seth Heasleyd2f2fcd2010-01-12 17:03:35 -08003957 /* CPT */
Takashi Iwai9477c582011-05-25 09:11:37 +02003958 { PCI_DEVICE(0x8086, 0x1c20),
Takashi Iwaid7dab4d2013-01-08 13:51:30 +01003959 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM },
Seth Heasleycea310e2010-09-10 16:29:56 -07003960 /* PBG */
Takashi Iwai9477c582011-05-25 09:11:37 +02003961 { PCI_DEVICE(0x8086, 0x1d20),
Takashi Iwaid7dab4d2013-01-08 13:51:30 +01003962 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM },
Seth Heasleyd2edeb72011-04-20 10:59:57 -07003963 /* Panther Point */
Takashi Iwai9477c582011-05-25 09:11:37 +02003964 { PCI_DEVICE(0x8086, 0x1e20),
Takashi Iwaib1920c22013-11-22 12:43:25 +01003965 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
Seth Heasley8bc039a2012-01-23 16:24:31 -08003966 /* Lynx Point */
3967 { PCI_DEVICE(0x8086, 0x8c20),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003968 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
James Ralston884b0882013-02-08 17:29:40 -08003969 /* Wellsburg */
3970 { PCI_DEVICE(0x8086, 0x8d20),
3971 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
3972 { PCI_DEVICE(0x8086, 0x8d21),
3973 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
James Ralston144dad92012-08-09 09:38:59 -07003974 /* Lynx Point-LP */
3975 { PCI_DEVICE(0x8086, 0x9c20),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003976 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
James Ralston144dad92012-08-09 09:38:59 -07003977 /* Lynx Point-LP */
3978 { PCI_DEVICE(0x8086, 0x9c21),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003979 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
James Ralston4eeca492013-11-04 09:27:45 -08003980 /* Wildcat Point-LP */
3981 { PCI_DEVICE(0x8086, 0x9ca0),
3982 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
Wang Xingchaoe926f2c2012-06-13 10:23:51 +08003983 /* Haswell */
Wang Xingchao4a7c5162013-02-01 22:42:19 +08003984 { PCI_DEVICE(0x8086, 0x0a0c),
Takashi Iwaifab12852013-11-05 17:54:05 +01003985 .driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL },
Wang Xingchaoe926f2c2012-06-13 10:23:51 +08003986 { PCI_DEVICE(0x8086, 0x0c0c),
Takashi Iwaifab12852013-11-05 17:54:05 +01003987 .driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL },
Wang Xingchaod279fae2012-09-17 13:10:23 +08003988 { PCI_DEVICE(0x8086, 0x0d0c),
Takashi Iwaifab12852013-11-05 17:54:05 +01003989 .driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL },
Mengdong Lin862d7612014-01-08 15:55:14 -05003990 /* Broadwell */
3991 { PCI_DEVICE(0x8086, 0x160c),
3992 .driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL },
Pierre-Louis Bossart99df18b2012-09-21 18:39:07 -05003993 /* 5 Series/3400 */
3994 { PCI_DEVICE(0x8086, 0x3b56),
Takashi Iwai2c1350f2013-02-14 09:44:55 +01003995 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_NOPM },
Takashi Iwaif748abc2013-01-29 10:12:23 +01003996 /* Poulsbo */
Takashi Iwai9477c582011-05-25 09:11:37 +02003997 { PCI_DEVICE(0x8086, 0x811b),
Takashi Iwaif748abc2013-01-29 10:12:23 +01003998 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_NOPM },
3999 /* Oaktrail */
Li Peng09904b92011-12-28 15:17:26 +00004000 { PCI_DEVICE(0x8086, 0x080a),
Takashi Iwaif748abc2013-01-29 10:12:23 +01004001 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_NOPM },
Chew, Chiau Eee44007e2013-05-16 15:36:12 +08004002 /* BayTrail */
4003 { PCI_DEVICE(0x8086, 0x0f04),
4004 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM },
David Henningsson645e9032011-12-14 15:52:30 +08004005 /* ICH */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02004006 { PCI_DEVICE(0x8086, 0x2668),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05004007 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
4008 AZX_DCAPS_BUFSIZE }, /* ICH6 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02004009 { PCI_DEVICE(0x8086, 0x27d8),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05004010 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
4011 AZX_DCAPS_BUFSIZE }, /* ICH7 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02004012 { PCI_DEVICE(0x8086, 0x269a),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05004013 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
4014 AZX_DCAPS_BUFSIZE }, /* ESB2 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02004015 { PCI_DEVICE(0x8086, 0x284b),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05004016 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
4017 AZX_DCAPS_BUFSIZE }, /* ICH8 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02004018 { PCI_DEVICE(0x8086, 0x293e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05004019 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
4020 AZX_DCAPS_BUFSIZE }, /* ICH9 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02004021 { PCI_DEVICE(0x8086, 0x293f),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05004022 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
4023 AZX_DCAPS_BUFSIZE }, /* ICH9 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02004024 { PCI_DEVICE(0x8086, 0x3a3e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05004025 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
4026 AZX_DCAPS_BUFSIZE }, /* ICH10 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02004027 { PCI_DEVICE(0x8086, 0x3a6e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05004028 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
4029 AZX_DCAPS_BUFSIZE }, /* ICH10 */
Takashi Iwaib6864532010-09-15 10:17:26 +02004030 /* Generic Intel */
4031 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_ANY_ID),
4032 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
4033 .class_mask = 0xffffff,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05004034 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_BUFSIZE },
Takashi Iwai9477c582011-05-25 09:11:37 +02004035 /* ATI SB 450/600/700/800/900 */
4036 { PCI_DEVICE(0x1002, 0x437b),
4037 .driver_data = AZX_DRIVER_ATI | AZX_DCAPS_PRESET_ATI_SB },
4038 { PCI_DEVICE(0x1002, 0x4383),
4039 .driver_data = AZX_DRIVER_ATI | AZX_DCAPS_PRESET_ATI_SB },
4040 /* AMD Hudson */
4041 { PCI_DEVICE(0x1022, 0x780d),
4042 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_SB },
Takashi Iwai87218e92008-02-21 08:13:11 +01004043 /* ATI HDMI */
Takashi Iwai9477c582011-05-25 09:11:37 +02004044 { PCI_DEVICE(0x1002, 0x793b),
4045 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
4046 { PCI_DEVICE(0x1002, 0x7919),
4047 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
4048 { PCI_DEVICE(0x1002, 0x960f),
4049 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
4050 { PCI_DEVICE(0x1002, 0x970f),
4051 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
4052 { PCI_DEVICE(0x1002, 0xaa00),
4053 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
4054 { PCI_DEVICE(0x1002, 0xaa08),
4055 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
4056 { PCI_DEVICE(0x1002, 0xaa10),
4057 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
4058 { PCI_DEVICE(0x1002, 0xaa18),
4059 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
4060 { PCI_DEVICE(0x1002, 0xaa20),
4061 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
4062 { PCI_DEVICE(0x1002, 0xaa28),
4063 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
4064 { PCI_DEVICE(0x1002, 0xaa30),
4065 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
4066 { PCI_DEVICE(0x1002, 0xaa38),
4067 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
4068 { PCI_DEVICE(0x1002, 0xaa40),
4069 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
4070 { PCI_DEVICE(0x1002, 0xaa48),
4071 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
Clemens Ladischbbaa0d62013-11-05 09:27:10 +01004072 { PCI_DEVICE(0x1002, 0xaa50),
4073 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
4074 { PCI_DEVICE(0x1002, 0xaa58),
4075 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
4076 { PCI_DEVICE(0x1002, 0xaa60),
4077 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
4078 { PCI_DEVICE(0x1002, 0xaa68),
4079 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
4080 { PCI_DEVICE(0x1002, 0xaa80),
4081 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
4082 { PCI_DEVICE(0x1002, 0xaa88),
4083 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
4084 { PCI_DEVICE(0x1002, 0xaa90),
4085 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
4086 { PCI_DEVICE(0x1002, 0xaa98),
4087 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
Andiry Xu1815b342011-12-14 16:10:27 +08004088 { PCI_DEVICE(0x1002, 0x9902),
4089 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
4090 { PCI_DEVICE(0x1002, 0xaaa0),
4091 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
4092 { PCI_DEVICE(0x1002, 0xaaa8),
4093 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
4094 { PCI_DEVICE(0x1002, 0xaab0),
4095 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
Takashi Iwai87218e92008-02-21 08:13:11 +01004096 /* VIA VT8251/VT8237A */
Takashi Iwai9477c582011-05-25 09:11:37 +02004097 { PCI_DEVICE(0x1106, 0x3288),
4098 .driver_data = AZX_DRIVER_VIA | AZX_DCAPS_POSFIX_VIA },
Annie Liu754fdff2012-06-08 19:18:39 +08004099 /* VIA GFX VT7122/VX900 */
4100 { PCI_DEVICE(0x1106, 0x9170), .driver_data = AZX_DRIVER_GENERIC },
4101 /* VIA GFX VT6122/VX11 */
4102 { PCI_DEVICE(0x1106, 0x9140), .driver_data = AZX_DRIVER_GENERIC },
Takashi Iwai87218e92008-02-21 08:13:11 +01004103 /* SIS966 */
4104 { PCI_DEVICE(0x1039, 0x7502), .driver_data = AZX_DRIVER_SIS },
4105 /* ULI M5461 */
4106 { PCI_DEVICE(0x10b9, 0x5461), .driver_data = AZX_DRIVER_ULI },
4107 /* NVIDIA MCP */
Takashi Iwai0c2fd1bf42009-12-18 16:41:39 +01004108 { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, 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_NVIDIA | AZX_DCAPS_PRESET_NVIDIA },
Kailang Yangf2690022008-05-27 11:44:55 +02004112 /* Teradici */
Takashi Iwai9477c582011-05-25 09:11:37 +02004113 { PCI_DEVICE(0x6549, 0x1200),
4114 .driver_data = AZX_DRIVER_TERA | AZX_DCAPS_NO_64BIT },
Lars R. Damerowf0b3da92012-11-02 13:10:39 -07004115 { PCI_DEVICE(0x6549, 0x2200),
4116 .driver_data = AZX_DRIVER_TERA | AZX_DCAPS_NO_64BIT },
Takashi Iwai4e01f542009-04-16 08:53:34 +02004117 /* Creative X-Fi (CA0110-IBG) */
Takashi Iwaif2a8eca2012-06-11 15:51:54 +02004118 /* CTHDA chips */
4119 { PCI_DEVICE(0x1102, 0x0010),
4120 .driver_data = AZX_DRIVER_CTHDA | AZX_DCAPS_PRESET_CTHDA },
4121 { PCI_DEVICE(0x1102, 0x0012),
4122 .driver_data = AZX_DRIVER_CTHDA | AZX_DCAPS_PRESET_CTHDA },
Takashi Iwai8eeaa2f2014-02-10 09:48:47 +01004123#if !IS_ENABLED(CONFIG_SND_CTXFI)
Takashi Iwai313f6e22009-05-18 12:40:52 +02004124 /* the following entry conflicts with snd-ctxfi driver,
4125 * as ctxfi driver mutates from HD-audio to native mode with
4126 * a special command sequence.
4127 */
Takashi Iwai4e01f542009-04-16 08:53:34 +02004128 { PCI_DEVICE(PCI_VENDOR_ID_CREATIVE, PCI_ANY_ID),
4129 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
4130 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02004131 .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
Takashi Iwai69f9ba92011-11-06 13:49:13 +01004132 AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB },
Takashi Iwai313f6e22009-05-18 12:40:52 +02004133#else
4134 /* this entry seems still valid -- i.e. without emu20kx chip */
Takashi Iwai9477c582011-05-25 09:11:37 +02004135 { PCI_DEVICE(0x1102, 0x0009),
4136 .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
Takashi Iwai69f9ba92011-11-06 13:49:13 +01004137 AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB },
Takashi Iwai313f6e22009-05-18 12:40:52 +02004138#endif
Otavio Salvadore35d4b12010-09-26 23:35:06 -03004139 /* Vortex86MX */
4140 { PCI_DEVICE(0x17f3, 0x3010), .driver_data = AZX_DRIVER_GENERIC },
Bankim Bhavsar0f0714c52011-01-17 15:23:21 +01004141 /* VMware HDAudio */
4142 { PCI_DEVICE(0x15ad, 0x1977), .driver_data = AZX_DRIVER_GENERIC },
Andiry Brienza9176b672009-07-17 11:32:32 +08004143 /* AMD/ATI Generic, PCI class code and Vendor ID for HD Audio */
Yang, Libinc4da29c2008-11-13 11:07:07 +01004144 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_ANY_ID),
4145 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
4146 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02004147 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_HDMI },
Andiry Brienza9176b672009-07-17 11:32:32 +08004148 { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_ANY_ID),
4149 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
4150 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02004151 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_HDMI },
Linus Torvalds1da177e2005-04-16 15:20:36 -07004152 { 0, }
4153};
4154MODULE_DEVICE_TABLE(pci, azx_ids);
4155
4156/* pci_driver definition */
Takashi Iwaie9f66d92012-04-24 12:25:00 +02004157static struct pci_driver azx_driver = {
Takashi Iwai3733e422011-06-10 16:20:20 +02004158 .name = KBUILD_MODNAME,
Linus Torvalds1da177e2005-04-16 15:20:36 -07004159 .id_table = azx_ids,
4160 .probe = azx_probe,
Bill Pembertone23e7a12012-12-06 12:35:10 -05004161 .remove = azx_remove,
Takashi Iwai68cb2b52012-07-02 15:20:37 +02004162 .driver = {
4163 .pm = AZX_PM_OPS,
4164 },
Linus Torvalds1da177e2005-04-16 15:20:36 -07004165};
4166
Takashi Iwaie9f66d92012-04-24 12:25:00 +02004167module_pci_driver(azx_driver);