blob: 80c5f14e8ecdf384b164463a7ddf08115cae03c2 [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 Iwai4abc1cc2009-05-19 12:16:46 +0200194#ifdef CONFIG_SND_VERBOSE_PRINTK
195#define SFX /* nop */
196#else
Daniel J Blueman445a51b2012-12-05 23:04:21 +0800197#define SFX "hda-intel "
Takashi Iwai4abc1cc2009-05-19 12:16:46 +0200198#endif
Takashi Iwaicb53c622007-08-10 17:21:45 +0200199
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200200#if defined(CONFIG_PM) && defined(CONFIG_VGA_SWITCHEROO)
201#ifdef CONFIG_SND_HDA_CODEC_HDMI
202#define SUPPORT_VGA_SWITCHEROO
203#endif
204#endif
205
206
Takashi Iwaicb53c622007-08-10 17:21:45 +0200207/*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700208 * registers
209 */
210#define ICH6_REG_GCAP 0x00
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200211#define ICH6_GCAP_64OK (1 << 0) /* 64bit address support */
212#define ICH6_GCAP_NSDO (3 << 1) /* # of serial data out signals */
213#define ICH6_GCAP_BSS (31 << 3) /* # of bidirectional streams */
214#define ICH6_GCAP_ISS (15 << 8) /* # of input streams */
215#define ICH6_GCAP_OSS (15 << 12) /* # of output streams */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700216#define ICH6_REG_VMIN 0x02
217#define ICH6_REG_VMAJ 0x03
218#define ICH6_REG_OUTPAY 0x04
219#define ICH6_REG_INPAY 0x06
220#define ICH6_REG_GCTL 0x08
Takashi Iwai8a933ec2009-05-31 09:28:12 +0200221#define ICH6_GCTL_RESET (1 << 0) /* controller reset */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200222#define ICH6_GCTL_FCNTRL (1 << 1) /* flush control */
223#define ICH6_GCTL_UNSOL (1 << 8) /* accept unsol. response enable */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700224#define ICH6_REG_WAKEEN 0x0c
225#define ICH6_REG_STATESTS 0x0e
226#define ICH6_REG_GSTS 0x10
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200227#define ICH6_GSTS_FSTS (1 << 1) /* flush status */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700228#define ICH6_REG_INTCTL 0x20
229#define ICH6_REG_INTSTS 0x24
Jaroslav Kyselae5463722010-05-11 10:21:46 +0200230#define ICH6_REG_WALLCLK 0x30 /* 24Mhz source */
Takashi Iwai8b0bd222011-06-10 14:56:26 +0200231#define ICH6_REG_OLD_SSYNC 0x34 /* SSYNC for old ICH */
232#define ICH6_REG_SSYNC 0x38
Linus Torvalds1da177e2005-04-16 15:20:36 -0700233#define ICH6_REG_CORBLBASE 0x40
234#define ICH6_REG_CORBUBASE 0x44
235#define ICH6_REG_CORBWP 0x48
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200236#define ICH6_REG_CORBRP 0x4a
237#define ICH6_CORBRP_RST (1 << 15) /* read pointer reset */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700238#define ICH6_REG_CORBCTL 0x4c
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200239#define ICH6_CORBCTL_RUN (1 << 1) /* enable DMA */
240#define ICH6_CORBCTL_CMEIE (1 << 0) /* enable memory error irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700241#define ICH6_REG_CORBSTS 0x4d
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200242#define ICH6_CORBSTS_CMEI (1 << 0) /* memory error indication */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700243#define ICH6_REG_CORBSIZE 0x4e
244
245#define ICH6_REG_RIRBLBASE 0x50
246#define ICH6_REG_RIRBUBASE 0x54
247#define ICH6_REG_RIRBWP 0x58
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200248#define ICH6_RIRBWP_RST (1 << 15) /* write pointer reset */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700249#define ICH6_REG_RINTCNT 0x5a
250#define ICH6_REG_RIRBCTL 0x5c
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200251#define ICH6_RBCTL_IRQ_EN (1 << 0) /* enable IRQ */
252#define ICH6_RBCTL_DMA_EN (1 << 1) /* enable DMA */
253#define ICH6_RBCTL_OVERRUN_EN (1 << 2) /* enable overrun irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700254#define ICH6_REG_RIRBSTS 0x5d
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200255#define ICH6_RBSTS_IRQ (1 << 0) /* response irq */
256#define ICH6_RBSTS_OVERRUN (1 << 2) /* overrun irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700257#define ICH6_REG_RIRBSIZE 0x5e
258
259#define ICH6_REG_IC 0x60
260#define ICH6_REG_IR 0x64
261#define ICH6_REG_IRS 0x68
262#define ICH6_IRS_VALID (1<<1)
263#define ICH6_IRS_BUSY (1<<0)
264
265#define ICH6_REG_DPLBASE 0x70
266#define ICH6_REG_DPUBASE 0x74
267#define ICH6_DPLBASE_ENABLE 0x1 /* Enable position buffer */
268
269/* SD offset: SDI0=0x80, SDI1=0xa0, ... SDO3=0x160 */
270enum { SDI0, SDI1, SDI2, SDI3, SDO0, SDO1, SDO2, SDO3 };
271
272/* stream register offsets from stream base */
273#define ICH6_REG_SD_CTL 0x00
274#define ICH6_REG_SD_STS 0x03
275#define ICH6_REG_SD_LPIB 0x04
276#define ICH6_REG_SD_CBL 0x08
277#define ICH6_REG_SD_LVI 0x0c
278#define ICH6_REG_SD_FIFOW 0x0e
279#define ICH6_REG_SD_FIFOSIZE 0x10
280#define ICH6_REG_SD_FORMAT 0x12
281#define ICH6_REG_SD_BDLPL 0x18
282#define ICH6_REG_SD_BDLPU 0x1c
283
284/* PCI space */
285#define ICH6_PCIREG_TCSEL 0x44
286
287/*
288 * other constants
289 */
290
291/* max number of SDs */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200292/* ICH, ATI and VIA have 4 playback and 4 capture */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200293#define ICH6_NUM_CAPTURE 4
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200294#define ICH6_NUM_PLAYBACK 4
295
296/* ULI has 6 playback and 5 capture */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200297#define ULI_NUM_CAPTURE 5
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200298#define ULI_NUM_PLAYBACK 6
299
Felix Kuehling778b6e12006-05-17 11:22:21 +0200300/* ATI HDMI has 1 playback and 0 capture */
Felix Kuehling778b6e12006-05-17 11:22:21 +0200301#define ATIHDMI_NUM_CAPTURE 0
Felix Kuehling778b6e12006-05-17 11:22:21 +0200302#define ATIHDMI_NUM_PLAYBACK 1
303
Kailang Yangf2690022008-05-27 11:44:55 +0200304/* TERA has 4 playback and 3 capture */
305#define TERA_NUM_CAPTURE 3
306#define TERA_NUM_PLAYBACK 4
307
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200308/* this number is statically defined for simplicity */
309#define MAX_AZX_DEV 16
310
Linus Torvalds1da177e2005-04-16 15:20:36 -0700311/* max number of fragments - we may use more if allocating more pages for BDL */
Takashi Iwai4ce107b2008-02-06 14:50:19 +0100312#define BDL_SIZE 4096
313#define AZX_MAX_BDL_ENTRIES (BDL_SIZE / 16)
314#define AZX_MAX_FRAG 32
Linus Torvalds1da177e2005-04-16 15:20:36 -0700315/* max buffer size - no h/w limit, you can increase as you like */
316#define AZX_MAX_BUF_SIZE (1024*1024*1024)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700317
318/* RIRB int mask: overrun[2], response[0] */
319#define RIRB_INT_RESPONSE 0x01
320#define RIRB_INT_OVERRUN 0x04
321#define RIRB_INT_MASK 0x05
322
Takashi Iwai2f5983f2008-09-03 16:00:44 +0200323/* STATESTS int mask: S3,SD2,SD1,SD0 */
Wei Ni7445dfc2010-03-03 15:05:53 +0800324#define AZX_MAX_CODECS 8
325#define AZX_DEFAULT_CODECS 4
Wu Fengguangdeadff12009-08-01 18:45:16 +0800326#define STATESTS_INT_MASK ((1 << AZX_MAX_CODECS) - 1)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700327
328/* SD_CTL bits */
329#define SD_CTL_STREAM_RESET 0x01 /* stream reset bit */
330#define SD_CTL_DMA_START 0x02 /* stream DMA start bit */
Takashi Iwai850f0e52008-03-18 17:11:05 +0100331#define SD_CTL_STRIPE (3 << 16) /* stripe control */
332#define SD_CTL_TRAFFIC_PRIO (1 << 18) /* traffic priority */
333#define SD_CTL_DIR (1 << 19) /* bi-directional stream */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700334#define SD_CTL_STREAM_TAG_MASK (0xf << 20)
335#define SD_CTL_STREAM_TAG_SHIFT 20
336
337/* SD_CTL and SD_STS */
338#define SD_INT_DESC_ERR 0x10 /* descriptor error interrupt */
339#define SD_INT_FIFO_ERR 0x08 /* FIFO error interrupt */
340#define SD_INT_COMPLETE 0x04 /* completion interrupt */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200341#define SD_INT_MASK (SD_INT_DESC_ERR|SD_INT_FIFO_ERR|\
342 SD_INT_COMPLETE)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700343
344/* SD_STS */
345#define SD_STS_FIFO_READY 0x20 /* FIFO ready */
346
347/* INTCTL and INTSTS */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200348#define ICH6_INT_ALL_STREAM 0xff /* all stream interrupts */
349#define ICH6_INT_CTRL_EN 0x40000000 /* controller interrupt enable bit */
350#define ICH6_INT_GLOBAL_EN 0x80000000 /* global interrupt enable bit */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700351
Linus Torvalds1da177e2005-04-16 15:20:36 -0700352/* below are so far hardcoded - should read registers in future */
353#define ICH6_MAX_CORB_ENTRIES 256
354#define ICH6_MAX_RIRB_ENTRIES 256
355
Takashi Iwaic74db862005-05-12 14:26:27 +0200356/* position fix mode */
357enum {
Takashi Iwai0be3b5d2005-09-05 17:11:40 +0200358 POS_FIX_AUTO,
Takashi Iwaid2e1c972008-06-10 17:53:34 +0200359 POS_FIX_LPIB,
Takashi Iwai0be3b5d2005-09-05 17:11:40 +0200360 POS_FIX_POSBUF,
David Henningsson4cb36312010-09-30 10:12:50 +0200361 POS_FIX_VIACOMBO,
Takashi Iwaia6f2fd52012-02-28 11:58:40 +0100362 POS_FIX_COMBO,
Takashi Iwaic74db862005-05-12 14:26:27 +0200363};
Linus Torvalds1da177e2005-04-16 15:20:36 -0700364
Frederick Lif5d40b32005-05-12 14:55:20 +0200365/* Defines for ATI HD Audio support in SB450 south bridge */
Frederick Lif5d40b32005-05-12 14:55:20 +0200366#define ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR 0x42
367#define ATI_SB450_HDAUDIO_ENABLE_SNOOP 0x02
368
Vinod Gda3fca22005-09-13 18:49:12 +0200369/* Defines for Nvidia HDA support */
370#define NVIDIA_HDA_TRANSREG_ADDR 0x4e
371#define NVIDIA_HDA_ENABLE_COHBITS 0x0f
Peer Chen320dcc32008-08-20 16:43:24 -0700372#define NVIDIA_HDA_ISTRM_COH 0x4d
373#define NVIDIA_HDA_OSTRM_COH 0x4c
374#define NVIDIA_HDA_ENABLE_COHBIT 0x01
Frederick Lif5d40b32005-05-12 14:55:20 +0200375
Takashi Iwai90a5ad52008-02-22 18:36:22 +0100376/* Defines for Intel SCH HDA snoop control */
377#define INTEL_SCH_HDA_DEVC 0x78
378#define INTEL_SCH_HDA_DEVC_NOSNOOP (0x1<<11)
379
Joseph Chan0e153472008-08-26 14:38:03 +0200380/* Define IN stream 0 FIFO size offset in VIA controller */
381#define VIA_IN_STREAM0_FIFO_SIZE_OFFSET 0x90
382/* Define VIA HD Audio Device ID*/
383#define VIA_HDAC_DEVICE_ID 0x3288
384
Yang, Libinc4da29c2008-11-13 11:07:07 +0100385/* HD Audio class code */
386#define PCI_CLASS_MULTIMEDIA_HD_AUDIO 0x0403
Takashi Iwai90a5ad52008-02-22 18:36:22 +0100387
Linus Torvalds1da177e2005-04-16 15:20:36 -0700388/*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700389 */
390
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100391struct azx_dev {
Takashi Iwai4ce107b2008-02-06 14:50:19 +0100392 struct snd_dma_buffer bdl; /* BDL buffer */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200393 u32 *posbuf; /* position buffer pointer */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700394
Takashi Iwaid01ce992007-07-27 16:52:19 +0200395 unsigned int bufsize; /* size of the play buffer in bytes */
Takashi Iwai9ad593f2008-05-16 12:34:47 +0200396 unsigned int period_bytes; /* size of the period in bytes */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200397 unsigned int frags; /* number for period in the play buffer */
398 unsigned int fifo_size; /* FIFO size */
Jaroslav Kyselae5463722010-05-11 10:21:46 +0200399 unsigned long start_wallclk; /* start + minimum wallclk */
400 unsigned long period_wallclk; /* wallclk for period */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700401
Takashi Iwaid01ce992007-07-27 16:52:19 +0200402 void __iomem *sd_addr; /* stream descriptor pointer */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700403
Takashi Iwaid01ce992007-07-27 16:52:19 +0200404 u32 sd_int_sta_mask; /* stream int status mask */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700405
406 /* pcm support */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200407 struct snd_pcm_substream *substream; /* assigned substream,
408 * set in PCM open
409 */
410 unsigned int format_val; /* format value to be set in the
411 * controller and the codec
412 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700413 unsigned char stream_tag; /* assigned stream */
414 unsigned char index; /* stream index */
Takashi Iwaid5cf9912011-10-06 10:07:58 +0200415 int assigned_key; /* last device# key assigned to */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700416
Pavel Machek927fc862006-08-31 17:03:43 +0200417 unsigned int opened :1;
418 unsigned int running :1;
Takashi Iwai675f25d2008-06-10 17:53:20 +0200419 unsigned int irq_pending :1;
Takashi Iwaieb49faa2013-03-15 09:19:11 +0100420 unsigned int prepared:1;
421 unsigned int locked:1;
Joseph Chan0e153472008-08-26 14:38:03 +0200422 /*
423 * For VIA:
424 * A flag to ensure DMA position is 0
425 * when link position is not greater than FIFO size
426 */
427 unsigned int insufficient :1;
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200428 unsigned int wc_marked:1;
Takashi Iwai915bf292012-09-11 15:19:10 +0200429 unsigned int no_period_wakeup:1;
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -0500430
431 struct timecounter azx_tc;
432 struct cyclecounter azx_cc;
Takashi Iwaieb49faa2013-03-15 09:19:11 +0100433
434#ifdef CONFIG_SND_HDA_DSP_LOADER
435 struct mutex dsp_mutex;
436#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700437};
438
Takashi Iwaieb49faa2013-03-15 09:19:11 +0100439/* DSP lock helpers */
440#ifdef CONFIG_SND_HDA_DSP_LOADER
441#define dsp_lock_init(dev) mutex_init(&(dev)->dsp_mutex)
442#define dsp_lock(dev) mutex_lock(&(dev)->dsp_mutex)
443#define dsp_unlock(dev) mutex_unlock(&(dev)->dsp_mutex)
444#define dsp_is_locked(dev) ((dev)->locked)
445#else
446#define dsp_lock_init(dev) do {} while (0)
447#define dsp_lock(dev) do {} while (0)
448#define dsp_unlock(dev) do {} while (0)
449#define dsp_is_locked(dev) 0
450#endif
451
Linus Torvalds1da177e2005-04-16 15:20:36 -0700452/* CORB/RIRB */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100453struct azx_rb {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700454 u32 *buf; /* CORB/RIRB buffer
455 * Each CORB entry is 4byte, RIRB is 8byte
456 */
457 dma_addr_t addr; /* physical address of CORB/RIRB buffer */
458 /* for RIRB */
459 unsigned short rp, wp; /* read/write pointers */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800460 int cmds[AZX_MAX_CODECS]; /* number of pending requests */
461 u32 res[AZX_MAX_CODECS]; /* last read value */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700462};
463
Takashi Iwai01b65bf2011-11-24 14:31:46 +0100464struct azx_pcm {
465 struct azx *chip;
466 struct snd_pcm *pcm;
467 struct hda_codec *codec;
468 struct hda_pcm_stream *hinfo[2];
469 struct list_head list;
470};
471
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100472struct azx {
473 struct snd_card *card;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700474 struct pci_dev *pci;
Takashi Iwai555e2192008-06-10 17:53:34 +0200475 int dev_index;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700476
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200477 /* chip type specific */
478 int driver_type;
Takashi Iwai9477c582011-05-25 09:11:37 +0200479 unsigned int driver_caps;
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200480 int playback_streams;
481 int playback_index_offset;
482 int capture_streams;
483 int capture_index_offset;
484 int num_streams;
485
Linus Torvalds1da177e2005-04-16 15:20:36 -0700486 /* pci resources */
487 unsigned long addr;
488 void __iomem *remap_addr;
489 int irq;
490
491 /* locks */
492 spinlock_t reg_lock;
Ingo Molnar62932df2006-01-16 16:34:20 +0100493 struct mutex open_mutex;
Takashi Iwaif4c482a2012-12-04 15:09:23 +0100494 struct completion probe_wait;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700495
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200496 /* streams (x num_streams) */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100497 struct azx_dev *azx_dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700498
499 /* PCM */
Takashi Iwai01b65bf2011-11-24 14:31:46 +0100500 struct list_head pcm_list; /* azx_pcm list */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700501
502 /* HD codec */
503 unsigned short codec_mask;
Takashi Iwaif1eaaee2009-02-13 08:16:55 +0100504 int codec_probe_mask; /* copied from probe_mask option */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700505 struct hda_bus *bus;
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +0100506 unsigned int beep_mode;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700507
508 /* CORB/RIRB */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100509 struct azx_rb corb;
510 struct azx_rb rirb;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700511
Takashi Iwai4ce107b2008-02-06 14:50:19 +0100512 /* CORB/RIRB and position buffers */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700513 struct snd_dma_buffer rb;
514 struct snd_dma_buffer posbuf;
Takashi Iwaic74db862005-05-12 14:26:27 +0200515
Takashi Iwai4918cda2012-08-09 12:33:28 +0200516#ifdef CONFIG_SND_HDA_PATCH_LOADER
517 const struct firmware *fw;
518#endif
519
Takashi Iwaic74db862005-05-12 14:26:27 +0200520 /* flags */
Shahin Ghazinouribeaffc32010-05-11 08:19:55 +0200521 int position_fix[2]; /* for both playback/capture streams */
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200522 int poll_count;
Takashi Iwaicb53c622007-08-10 17:21:45 +0200523 unsigned int running :1;
Pavel Machek927fc862006-08-31 17:03:43 +0200524 unsigned int initialized :1;
525 unsigned int single_cmd :1;
526 unsigned int polling_mode :1;
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200527 unsigned int msi :1;
Takashi Iwaia6a950a2008-06-10 17:53:35 +0200528 unsigned int irq_pending_warned :1;
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +0100529 unsigned int probing :1; /* codec probing phase */
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200530 unsigned int snoop:1;
Takashi Iwai52409aa2012-01-23 17:10:24 +0100531 unsigned int align_buffer_size:1;
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200532 unsigned int region_requested:1;
533
534 /* VGA-switcheroo setup */
535 unsigned int use_vga_switcheroo:1;
Takashi Iwai128960a2012-10-12 17:28:18 +0200536 unsigned int vga_switcheroo_registered:1;
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200537 unsigned int init_failed:1; /* delayed init failed */
538 unsigned int disabled:1; /* disabled by VGA-switcher */
Takashi Iwai43bbb6c2007-07-06 20:22:05 +0200539
540 /* for debugging */
Wu Fengguangfeb27342009-08-01 19:17:14 +0800541 unsigned int last_cmd[AZX_MAX_CODECS];
Takashi Iwai9ad593f2008-05-16 12:34:47 +0200542
543 /* for pending irqs */
544 struct work_struct irq_pending_work;
Takashi Iwai0cbf0092008-10-29 16:18:25 +0100545
Wang Xingchao99a20082013-05-30 22:07:10 +0800546 struct work_struct probe_work;
Wang Xingchao99a20082013-05-30 22:07:10 +0800547
Takashi Iwai0cbf0092008-10-29 16:18:25 +0100548 /* reboot notifier (for mysterious hangup problem at power-down) */
549 struct notifier_block reboot_notifier;
Takashi Iwai65fcd412012-08-14 17:13:32 +0200550
551 /* card list (for power_save trigger) */
552 struct list_head list;
Takashi Iwaieb49faa2013-03-15 09:19:11 +0100553
554#ifdef CONFIG_SND_HDA_DSP_LOADER
555 struct azx_dev saved_azx_dev;
556#endif
Dave Airlie246efa42013-07-29 15:19:29 +1000557
558 /* secondary power domain for hdmi audio under vga device */
559 struct dev_pm_domain hdmi_pm_domain;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700560};
561
Takashi Iwai1a8506d2012-10-16 15:10:08 +0200562#define CREATE_TRACE_POINTS
563#include "hda_intel_trace.h"
564
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200565/* driver types */
566enum {
567 AZX_DRIVER_ICH,
Seth Heasley32679f92010-02-22 17:31:09 -0800568 AZX_DRIVER_PCH,
Tobin Davis4979bca2008-01-30 08:13:55 +0100569 AZX_DRIVER_SCH,
Takashi Iwaifab12852013-11-05 17:54:05 +0100570 AZX_DRIVER_HDMI,
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200571 AZX_DRIVER_ATI,
Felix Kuehling778b6e12006-05-17 11:22:21 +0200572 AZX_DRIVER_ATIHDMI,
Andiry Xu1815b342011-12-14 16:10:27 +0800573 AZX_DRIVER_ATIHDMI_NS,
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200574 AZX_DRIVER_VIA,
575 AZX_DRIVER_SIS,
576 AZX_DRIVER_ULI,
Vinod Gda3fca22005-09-13 18:49:12 +0200577 AZX_DRIVER_NVIDIA,
Kailang Yangf2690022008-05-27 11:44:55 +0200578 AZX_DRIVER_TERA,
Takashi Iwai14d34f12010-10-21 09:03:25 +0200579 AZX_DRIVER_CTX,
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200580 AZX_DRIVER_CTHDA,
Yang, Libinc4da29c2008-11-13 11:07:07 +0100581 AZX_DRIVER_GENERIC,
Takashi Iwai2f5983f2008-09-03 16:00:44 +0200582 AZX_NUM_DRIVERS, /* keep this as last entry */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200583};
584
Takashi Iwai9477c582011-05-25 09:11:37 +0200585/* driver quirks (capabilities) */
586/* bits 0-7 are used for indicating driver type */
587#define AZX_DCAPS_NO_TCSEL (1 << 8) /* No Intel TCSEL bit */
588#define AZX_DCAPS_NO_MSI (1 << 9) /* No MSI support */
589#define AZX_DCAPS_ATI_SNOOP (1 << 10) /* ATI snoop enable */
590#define AZX_DCAPS_NVIDIA_SNOOP (1 << 11) /* Nvidia snoop enable */
591#define AZX_DCAPS_SCH_SNOOP (1 << 12) /* SCH/PCH snoop enable */
592#define AZX_DCAPS_RIRB_DELAY (1 << 13) /* Long delay in read loop */
593#define AZX_DCAPS_RIRB_PRE_DELAY (1 << 14) /* Put a delay before read */
594#define AZX_DCAPS_CTX_WORKAROUND (1 << 15) /* X-Fi workaround */
595#define AZX_DCAPS_POSFIX_LPIB (1 << 16) /* Use LPIB as default */
596#define AZX_DCAPS_POSFIX_VIA (1 << 17) /* Use VIACOMBO as default */
597#define AZX_DCAPS_NO_64BIT (1 << 18) /* No 64bit address */
598#define AZX_DCAPS_SYNC_WRITE (1 << 19) /* sync each cmd write */
Takashi Iwai8b0bd222011-06-10 14:56:26 +0200599#define AZX_DCAPS_OLD_SSYNC (1 << 20) /* Old SSYNC reg for ICH */
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -0500600#define AZX_DCAPS_BUFSIZE (1 << 21) /* no buffer size alignment */
Takashi Iwai7bfe0592012-01-23 17:53:39 +0100601#define AZX_DCAPS_ALIGN_BUFSIZE (1 << 22) /* buffer size alignment */
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200602#define AZX_DCAPS_4K_BDLE_BOUNDARY (1 << 23) /* BDLE in 4k boundary */
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -0500603#define AZX_DCAPS_COUNT_LPIB_DELAY (1 << 25) /* Take LPIB as delay */
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +0100604#define AZX_DCAPS_PM_RUNTIME (1 << 26) /* runtime PM support */
Wang Xingchao99a20082013-05-30 22:07:10 +0800605#define AZX_DCAPS_I915_POWERWELL (1 << 27) /* HSW i915 power well support */
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +0100606
607/* quirks for Intel PCH */
Takashi Iwaid7dab4d2013-01-08 13:51:30 +0100608#define AZX_DCAPS_INTEL_PCH_NOPM \
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +0100609 (AZX_DCAPS_SCH_SNOOP | AZX_DCAPS_BUFSIZE | \
Takashi Iwaid7dab4d2013-01-08 13:51:30 +0100610 AZX_DCAPS_COUNT_LPIB_DELAY)
611
612#define AZX_DCAPS_INTEL_PCH \
613 (AZX_DCAPS_INTEL_PCH_NOPM | AZX_DCAPS_PM_RUNTIME)
Takashi Iwai9477c582011-05-25 09:11:37 +0200614
Takashi Iwai33499a12013-11-05 17:34:46 +0100615#define AZX_DCAPS_INTEL_HASWELL \
616 (AZX_DCAPS_SCH_SNOOP | AZX_DCAPS_ALIGN_BUFSIZE | \
617 AZX_DCAPS_COUNT_LPIB_DELAY | AZX_DCAPS_PM_RUNTIME | \
618 AZX_DCAPS_I915_POWERWELL)
619
Takashi Iwai9477c582011-05-25 09:11:37 +0200620/* quirks for ATI SB / AMD Hudson */
621#define AZX_DCAPS_PRESET_ATI_SB \
622 (AZX_DCAPS_ATI_SNOOP | AZX_DCAPS_NO_TCSEL | \
623 AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB)
624
625/* quirks for ATI/AMD HDMI */
626#define AZX_DCAPS_PRESET_ATI_HDMI \
627 (AZX_DCAPS_NO_TCSEL | AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB)
628
629/* quirks for Nvidia */
630#define AZX_DCAPS_PRESET_NVIDIA \
Takashi Iwai7bfe0592012-01-23 17:53:39 +0100631 (AZX_DCAPS_NVIDIA_SNOOP | AZX_DCAPS_RIRB_DELAY | AZX_DCAPS_NO_MSI |\
Mike Travis49d9e772013-05-01 14:04:08 -0500632 AZX_DCAPS_ALIGN_BUFSIZE | AZX_DCAPS_NO_64BIT)
Takashi Iwai9477c582011-05-25 09:11:37 +0200633
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200634#define AZX_DCAPS_PRESET_CTHDA \
635 (AZX_DCAPS_NO_MSI | AZX_DCAPS_POSFIX_LPIB | AZX_DCAPS_4K_BDLE_BOUNDARY)
636
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200637/*
638 * VGA-switcher support
639 */
640#ifdef SUPPORT_VGA_SWITCHEROO
Takashi Iwai5cb543d2012-08-09 13:49:23 +0200641#define use_vga_switcheroo(chip) ((chip)->use_vga_switcheroo)
642#else
643#define use_vga_switcheroo(chip) 0
644#endif
645
Takashi Iwai48c8b0e2012-12-07 07:40:35 +0100646static char *driver_short_names[] = {
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200647 [AZX_DRIVER_ICH] = "HDA Intel",
Seth Heasley32679f92010-02-22 17:31:09 -0800648 [AZX_DRIVER_PCH] = "HDA Intel PCH",
Tobin Davis4979bca2008-01-30 08:13:55 +0100649 [AZX_DRIVER_SCH] = "HDA Intel MID",
Takashi Iwaifab12852013-11-05 17:54:05 +0100650 [AZX_DRIVER_HDMI] = "HDA Intel HDMI",
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200651 [AZX_DRIVER_ATI] = "HDA ATI SB",
Felix Kuehling778b6e12006-05-17 11:22:21 +0200652 [AZX_DRIVER_ATIHDMI] = "HDA ATI HDMI",
Andiry Xu1815b342011-12-14 16:10:27 +0800653 [AZX_DRIVER_ATIHDMI_NS] = "HDA ATI HDMI",
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200654 [AZX_DRIVER_VIA] = "HDA VIA VT82xx",
655 [AZX_DRIVER_SIS] = "HDA SIS966",
Vinod Gda3fca22005-09-13 18:49:12 +0200656 [AZX_DRIVER_ULI] = "HDA ULI M5461",
657 [AZX_DRIVER_NVIDIA] = "HDA NVidia",
Kailang Yangf2690022008-05-27 11:44:55 +0200658 [AZX_DRIVER_TERA] = "HDA Teradici",
Takashi Iwai14d34f12010-10-21 09:03:25 +0200659 [AZX_DRIVER_CTX] = "HDA Creative",
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200660 [AZX_DRIVER_CTHDA] = "HDA Creative",
Yang, Libinc4da29c2008-11-13 11:07:07 +0100661 [AZX_DRIVER_GENERIC] = "HD-Audio Generic",
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200662};
663
Linus Torvalds1da177e2005-04-16 15:20:36 -0700664/*
665 * macros for easy use
666 */
667#define azx_writel(chip,reg,value) \
668 writel(value, (chip)->remap_addr + ICH6_REG_##reg)
669#define azx_readl(chip,reg) \
670 readl((chip)->remap_addr + ICH6_REG_##reg)
671#define azx_writew(chip,reg,value) \
672 writew(value, (chip)->remap_addr + ICH6_REG_##reg)
673#define azx_readw(chip,reg) \
674 readw((chip)->remap_addr + ICH6_REG_##reg)
675#define azx_writeb(chip,reg,value) \
676 writeb(value, (chip)->remap_addr + ICH6_REG_##reg)
677#define azx_readb(chip,reg) \
678 readb((chip)->remap_addr + ICH6_REG_##reg)
679
680#define azx_sd_writel(dev,reg,value) \
681 writel(value, (dev)->sd_addr + ICH6_REG_##reg)
682#define azx_sd_readl(dev,reg) \
683 readl((dev)->sd_addr + ICH6_REG_##reg)
684#define azx_sd_writew(dev,reg,value) \
685 writew(value, (dev)->sd_addr + ICH6_REG_##reg)
686#define azx_sd_readw(dev,reg) \
687 readw((dev)->sd_addr + ICH6_REG_##reg)
688#define azx_sd_writeb(dev,reg,value) \
689 writeb(value, (dev)->sd_addr + ICH6_REG_##reg)
690#define azx_sd_readb(dev,reg) \
691 readb((dev)->sd_addr + ICH6_REG_##reg)
692
693/* for pcm support */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100694#define get_azx_dev(substream) (substream->runtime->private_data)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700695
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200696#ifdef CONFIG_X86
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100697static void __mark_pages_wc(struct azx *chip, struct snd_dma_buffer *dmab, bool on)
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200698{
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100699 int pages;
700
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200701 if (azx_snoop(chip))
702 return;
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100703 if (!dmab || !dmab->area || !dmab->bytes)
704 return;
705
706#ifdef CONFIG_SND_DMA_SGBUF
707 if (dmab->dev.type == SNDRV_DMA_TYPE_DEV_SG) {
708 struct snd_sg_buf *sgbuf = dmab->private_data;
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200709 if (on)
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100710 set_pages_array_wc(sgbuf->page_table, sgbuf->pages);
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200711 else
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100712 set_pages_array_wb(sgbuf->page_table, sgbuf->pages);
713 return;
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200714 }
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100715#endif
716
717 pages = (dmab->bytes + PAGE_SIZE - 1) >> PAGE_SHIFT;
718 if (on)
719 set_memory_wc((unsigned long)dmab->area, pages);
720 else
721 set_memory_wb((unsigned long)dmab->area, pages);
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200722}
723
724static inline void mark_pages_wc(struct azx *chip, struct snd_dma_buffer *buf,
725 bool on)
726{
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100727 __mark_pages_wc(chip, buf, on);
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200728}
729static inline void mark_runtime_wc(struct azx *chip, struct azx_dev *azx_dev,
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100730 struct snd_pcm_substream *substream, bool on)
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200731{
732 if (azx_dev->wc_marked != on) {
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100733 __mark_pages_wc(chip, snd_pcm_get_dma_buf(substream), on);
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200734 azx_dev->wc_marked = on;
735 }
736}
737#else
738/* NOP for other archs */
739static inline void mark_pages_wc(struct azx *chip, struct snd_dma_buffer *buf,
740 bool on)
741{
742}
743static inline void mark_runtime_wc(struct azx *chip, struct azx_dev *azx_dev,
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100744 struct snd_pcm_substream *substream, bool on)
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200745{
746}
747#endif
748
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200749static int azx_acquire_irq(struct azx *chip, int do_disconnect);
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200750static int azx_send_cmd(struct hda_bus *bus, unsigned int val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700751/*
752 * Interface for HD codec
753 */
754
Linus Torvalds1da177e2005-04-16 15:20:36 -0700755/*
756 * CORB / RIRB interface
757 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100758static int azx_alloc_cmd_io(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700759{
760 int err;
761
762 /* single page (at least 4096 bytes) must suffice for both ringbuffes */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200763 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
764 snd_dma_pci_data(chip->pci),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700765 PAGE_SIZE, &chip->rb);
766 if (err < 0) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +0800767 snd_printk(KERN_ERR SFX "%s: cannot allocate CORB/RIRB\n", pci_name(chip->pci));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700768 return err;
769 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200770 mark_pages_wc(chip, &chip->rb, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700771 return 0;
772}
773
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100774static void azx_init_cmd_io(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700775{
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800776 spin_lock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700777 /* CORB set up */
778 chip->corb.addr = chip->rb.addr;
779 chip->corb.buf = (u32 *)chip->rb.area;
780 azx_writel(chip, CORBLBASE, (u32)chip->corb.addr);
Takashi Iwai766979e2008-06-13 20:53:56 +0200781 azx_writel(chip, CORBUBASE, upper_32_bits(chip->corb.addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700782
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200783 /* set the corb size to 256 entries (ULI requires explicitly) */
784 azx_writeb(chip, CORBSIZE, 0x02);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700785 /* set the corb write pointer to 0 */
786 azx_writew(chip, CORBWP, 0);
787 /* reset the corb hw read pointer */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200788 azx_writew(chip, CORBRP, ICH6_CORBRP_RST);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700789 /* enable corb dma */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200790 azx_writeb(chip, CORBCTL, ICH6_CORBCTL_RUN);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700791
792 /* RIRB set up */
793 chip->rirb.addr = chip->rb.addr + 2048;
794 chip->rirb.buf = (u32 *)(chip->rb.area + 2048);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800795 chip->rirb.wp = chip->rirb.rp = 0;
796 memset(chip->rirb.cmds, 0, sizeof(chip->rirb.cmds));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700797 azx_writel(chip, RIRBLBASE, (u32)chip->rirb.addr);
Takashi Iwai766979e2008-06-13 20:53:56 +0200798 azx_writel(chip, RIRBUBASE, upper_32_bits(chip->rirb.addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700799
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200800 /* set the rirb size to 256 entries (ULI requires explicitly) */
801 azx_writeb(chip, RIRBSIZE, 0x02);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700802 /* reset the rirb hw write pointer */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200803 azx_writew(chip, RIRBWP, ICH6_RIRBWP_RST);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700804 /* set N=1, get RIRB response interrupt for new entry */
Takashi Iwai9477c582011-05-25 09:11:37 +0200805 if (chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND)
Takashi Iwai14d34f12010-10-21 09:03:25 +0200806 azx_writew(chip, RINTCNT, 0xc0);
807 else
808 azx_writew(chip, RINTCNT, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700809 /* enable rirb dma and response irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700810 azx_writeb(chip, RIRBCTL, ICH6_RBCTL_DMA_EN | ICH6_RBCTL_IRQ_EN);
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800811 spin_unlock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700812}
813
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100814static void azx_free_cmd_io(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700815{
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800816 spin_lock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700817 /* disable ringbuffer DMAs */
818 azx_writeb(chip, RIRBCTL, 0);
819 azx_writeb(chip, CORBCTL, 0);
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800820 spin_unlock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700821}
822
Wu Fengguangdeadff12009-08-01 18:45:16 +0800823static unsigned int azx_command_addr(u32 cmd)
824{
825 unsigned int addr = cmd >> 28;
826
827 if (addr >= AZX_MAX_CODECS) {
828 snd_BUG();
829 addr = 0;
830 }
831
832 return addr;
833}
834
835static unsigned int azx_response_addr(u32 res)
836{
837 unsigned int addr = res & 0xf;
838
839 if (addr >= AZX_MAX_CODECS) {
840 snd_BUG();
841 addr = 0;
842 }
843
844 return addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700845}
846
847/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100848static int azx_corb_send_cmd(struct hda_bus *bus, u32 val)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700849{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100850 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800851 unsigned int addr = azx_command_addr(val);
Takashi Iwai3bcce5c2012-12-20 11:17:17 +0100852 unsigned int wp, rp;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700853
Wu Fengguangc32649f2009-08-01 18:48:12 +0800854 spin_lock_irq(&chip->reg_lock);
855
Linus Torvalds1da177e2005-04-16 15:20:36 -0700856 /* add command to corb */
Takashi Iwaicc5ede32012-12-12 11:10:49 +0100857 wp = azx_readw(chip, CORBWP);
858 if (wp == 0xffff) {
859 /* something wrong, controller likely turned to D3 */
860 spin_unlock_irq(&chip->reg_lock);
Takashi Iwai3bcce5c2012-12-20 11:17:17 +0100861 return -EIO;
Takashi Iwaicc5ede32012-12-12 11:10:49 +0100862 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700863 wp++;
864 wp %= ICH6_MAX_CORB_ENTRIES;
865
Takashi Iwai3bcce5c2012-12-20 11:17:17 +0100866 rp = azx_readw(chip, CORBRP);
867 if (wp == rp) {
868 /* oops, it's full */
869 spin_unlock_irq(&chip->reg_lock);
870 return -EAGAIN;
871 }
872
Wu Fengguangdeadff12009-08-01 18:45:16 +0800873 chip->rirb.cmds[addr]++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700874 chip->corb.buf[wp] = cpu_to_le32(val);
875 azx_writel(chip, CORBWP, wp);
Wu Fengguangc32649f2009-08-01 18:48:12 +0800876
Linus Torvalds1da177e2005-04-16 15:20:36 -0700877 spin_unlock_irq(&chip->reg_lock);
878
879 return 0;
880}
881
882#define ICH6_RIRB_EX_UNSOL_EV (1<<4)
883
884/* retrieve RIRB entry - called from interrupt handler */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100885static void azx_update_rirb(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700886{
887 unsigned int rp, wp;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800888 unsigned int addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700889 u32 res, res_ex;
890
Takashi Iwaicc5ede32012-12-12 11:10:49 +0100891 wp = azx_readw(chip, RIRBWP);
892 if (wp == 0xffff) {
893 /* something wrong, controller likely turned to D3 */
894 return;
895 }
896
Linus Torvalds1da177e2005-04-16 15:20:36 -0700897 if (wp == chip->rirb.wp)
898 return;
899 chip->rirb.wp = wp;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800900
Linus Torvalds1da177e2005-04-16 15:20:36 -0700901 while (chip->rirb.rp != wp) {
902 chip->rirb.rp++;
903 chip->rirb.rp %= ICH6_MAX_RIRB_ENTRIES;
904
905 rp = chip->rirb.rp << 1; /* an RIRB entry is 8-bytes */
906 res_ex = le32_to_cpu(chip->rirb.buf[rp + 1]);
907 res = le32_to_cpu(chip->rirb.buf[rp]);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800908 addr = azx_response_addr(res_ex);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700909 if (res_ex & ICH6_RIRB_EX_UNSOL_EV)
910 snd_hda_queue_unsol_event(chip->bus, res, res_ex);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800911 else if (chip->rirb.cmds[addr]) {
912 chip->rirb.res[addr] = res;
Takashi Iwai2add9b92008-03-18 09:47:06 +0100913 smp_wmb();
Wu Fengguangdeadff12009-08-01 18:45:16 +0800914 chip->rirb.cmds[addr]--;
Joe Perches3b70a672013-11-07 11:55:15 -0800915 } else if (printk_ratelimit()) {
916 snd_printk(KERN_ERR SFX "%s: spurious response %#x:%#x, last cmd=%#08x\n",
Takashi Iwai9e3d3522012-10-17 08:39:37 +0200917 pci_name(chip->pci),
Wu Fengguange310bb02009-08-01 19:18:45 +0800918 res, res_ex,
919 chip->last_cmd[addr]);
Joe Perches3b70a672013-11-07 11:55:15 -0800920 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700921 }
922}
923
924/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800925static unsigned int azx_rirb_get_response(struct hda_bus *bus,
926 unsigned int addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700927{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100928 struct azx *chip = bus->private_data;
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200929 unsigned long timeout;
David Henningsson32cf4022012-05-04 11:05:55 +0200930 unsigned long loopcounter;
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200931 int do_poll = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700932
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200933 again:
934 timeout = jiffies + msecs_to_jiffies(1000);
David Henningsson32cf4022012-05-04 11:05:55 +0200935
936 for (loopcounter = 0;; loopcounter++) {
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200937 if (chip->polling_mode || do_poll) {
Takashi Iwaie96224a2006-08-21 17:57:44 +0200938 spin_lock_irq(&chip->reg_lock);
939 azx_update_rirb(chip);
940 spin_unlock_irq(&chip->reg_lock);
941 }
Wu Fengguangdeadff12009-08-01 18:45:16 +0800942 if (!chip->rirb.cmds[addr]) {
Takashi Iwai2add9b92008-03-18 09:47:06 +0100943 smp_rmb();
Takashi Iwaib6132912009-03-24 07:36:09 +0100944 bus->rirb_error = 0;
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200945
946 if (!do_poll)
947 chip->poll_count = 0;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800948 return chip->rirb.res[addr]; /* the last value */
Takashi Iwai2add9b92008-03-18 09:47:06 +0100949 }
Takashi Iwai28a0d9d2008-01-18 15:32:32 +0100950 if (time_after(jiffies, timeout))
951 break;
David Henningsson32cf4022012-05-04 11:05:55 +0200952 if (bus->needs_damn_long_delay || loopcounter > 3000)
Takashi Iwai52987652008-01-16 16:09:47 +0100953 msleep(2); /* temporary workaround */
954 else {
955 udelay(10);
956 cond_resched();
957 }
Takashi Iwai28a0d9d2008-01-18 15:32:32 +0100958 }
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200959
Takashi Iwai63e51fd2013-06-06 14:20:19 +0200960 if (!bus->no_response_fallback)
961 return -1;
962
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200963 if (!chip->polling_mode && chip->poll_count < 2) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +0800964 snd_printdd(SFX "%s: azx_get_response timeout, "
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200965 "polling the codec once: last cmd=0x%08x\n",
Daniel J Blueman445a51b2012-12-05 23:04:21 +0800966 pci_name(chip->pci), chip->last_cmd[addr]);
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200967 do_poll = 1;
968 chip->poll_count++;
969 goto again;
970 }
971
972
Takashi Iwai23c4a882009-10-30 13:21:49 +0100973 if (!chip->polling_mode) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +0800974 snd_printk(KERN_WARNING SFX "%s: azx_get_response timeout, "
Takashi Iwai23c4a882009-10-30 13:21:49 +0100975 "switching to polling mode: last cmd=0x%08x\n",
Daniel J Blueman445a51b2012-12-05 23:04:21 +0800976 pci_name(chip->pci), chip->last_cmd[addr]);
Takashi Iwai23c4a882009-10-30 13:21:49 +0100977 chip->polling_mode = 1;
978 goto again;
979 }
980
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200981 if (chip->msi) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +0800982 snd_printk(KERN_WARNING SFX "%s: No response from codec, "
Wu Fengguangfeb27342009-08-01 19:17:14 +0800983 "disabling MSI: last cmd=0x%08x\n",
Daniel J Blueman445a51b2012-12-05 23:04:21 +0800984 pci_name(chip->pci), chip->last_cmd[addr]);
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200985 free_irq(chip->irq, chip);
986 chip->irq = -1;
987 pci_disable_msi(chip->pci);
988 chip->msi = 0;
Takashi Iwaib6132912009-03-24 07:36:09 +0100989 if (azx_acquire_irq(chip, 1) < 0) {
990 bus->rirb_error = 1;
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200991 return -1;
Takashi Iwaib6132912009-03-24 07:36:09 +0100992 }
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200993 goto again;
994 }
995
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +0100996 if (chip->probing) {
997 /* If this critical timeout happens during the codec probing
998 * phase, this is likely an access to a non-existing codec
999 * slot. Better to return an error and reset the system.
1000 */
1001 return -1;
1002 }
1003
Takashi Iwai8dd78332009-06-02 01:16:07 +02001004 /* a fatal communication error; need either to reset or to fallback
1005 * to the single_cmd mode
1006 */
Takashi Iwaib6132912009-03-24 07:36:09 +01001007 bus->rirb_error = 1;
Takashi Iwaib20f3b82009-06-02 01:20:22 +02001008 if (bus->allow_bus_reset && !bus->response_reset && !bus->in_reset) {
Takashi Iwai8dd78332009-06-02 01:16:07 +02001009 bus->response_reset = 1;
1010 return -1; /* give a chance to retry */
1011 }
1012
1013 snd_printk(KERN_ERR "hda_intel: azx_get_response timeout, "
1014 "switching to single_cmd mode: last cmd=0x%08x\n",
Wu Fengguangfeb27342009-08-01 19:17:14 +08001015 chip->last_cmd[addr]);
Takashi Iwai8dd78332009-06-02 01:16:07 +02001016 chip->single_cmd = 1;
1017 bus->response_reset = 0;
Takashi Iwai1a696972009-11-07 09:49:04 +01001018 /* release CORB/RIRB */
Takashi Iwai4fcd3922009-05-25 18:34:52 +02001019 azx_free_cmd_io(chip);
Takashi Iwai1a696972009-11-07 09:49:04 +01001020 /* disable unsolicited responses */
1021 azx_writel(chip, GCTL, azx_readl(chip, GCTL) & ~ICH6_GCTL_UNSOL);
Takashi Iwai5c79b1f2006-09-21 13:34:13 +02001022 return -1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001023}
1024
Linus Torvalds1da177e2005-04-16 15:20:36 -07001025/*
1026 * Use the single immediate command instead of CORB/RIRB for simplicity
1027 *
1028 * Note: according to Intel, this is not preferred use. The command was
1029 * intended for the BIOS only, and may get confused with unsolicited
1030 * responses. So, we shouldn't use it for normal operation from the
1031 * driver.
1032 * I left the codes, however, for debugging/testing purposes.
1033 */
1034
Takashi Iwaib05a7d42009-05-28 11:59:12 +02001035/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +08001036static int azx_single_wait_for_response(struct azx *chip, unsigned int addr)
Takashi Iwaib05a7d42009-05-28 11:59:12 +02001037{
1038 int timeout = 50;
1039
1040 while (timeout--) {
1041 /* check IRV busy bit */
1042 if (azx_readw(chip, IRS) & ICH6_IRS_VALID) {
1043 /* reuse rirb.res as the response return value */
Wu Fengguangdeadff12009-08-01 18:45:16 +08001044 chip->rirb.res[addr] = azx_readl(chip, IR);
Takashi Iwaib05a7d42009-05-28 11:59:12 +02001045 return 0;
1046 }
1047 udelay(1);
1048 }
1049 if (printk_ratelimit())
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001050 snd_printd(SFX "%s: get_response timeout: IRS=0x%x\n",
1051 pci_name(chip->pci), azx_readw(chip, IRS));
Wu Fengguangdeadff12009-08-01 18:45:16 +08001052 chip->rirb.res[addr] = -1;
Takashi Iwaib05a7d42009-05-28 11:59:12 +02001053 return -EIO;
1054}
1055
Linus Torvalds1da177e2005-04-16 15:20:36 -07001056/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001057static int azx_single_send_cmd(struct hda_bus *bus, u32 val)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001058{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001059 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +08001060 unsigned int addr = azx_command_addr(val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001061 int timeout = 50;
1062
Takashi Iwai8dd78332009-06-02 01:16:07 +02001063 bus->rirb_error = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001064 while (timeout--) {
1065 /* check ICB busy bit */
Takashi Iwaid01ce992007-07-27 16:52:19 +02001066 if (!((azx_readw(chip, IRS) & ICH6_IRS_BUSY))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001067 /* Clear IRV valid bit */
Takashi Iwaid01ce992007-07-27 16:52:19 +02001068 azx_writew(chip, IRS, azx_readw(chip, IRS) |
1069 ICH6_IRS_VALID);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001070 azx_writel(chip, IC, val);
Takashi Iwaid01ce992007-07-27 16:52:19 +02001071 azx_writew(chip, IRS, azx_readw(chip, IRS) |
1072 ICH6_IRS_BUSY);
Wu Fengguangdeadff12009-08-01 18:45:16 +08001073 return azx_single_wait_for_response(chip, addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001074 }
1075 udelay(1);
1076 }
Marc Boucher1cfd52b2008-01-22 15:29:26 +01001077 if (printk_ratelimit())
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001078 snd_printd(SFX "%s: send_cmd timeout: IRS=0x%x, val=0x%x\n",
1079 pci_name(chip->pci), azx_readw(chip, IRS), val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001080 return -EIO;
1081}
1082
1083/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +08001084static unsigned int azx_single_get_response(struct hda_bus *bus,
1085 unsigned int addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001086{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001087 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +08001088 return chip->rirb.res[addr];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001089}
1090
Takashi Iwai111d3af2006-02-16 18:17:58 +01001091/*
1092 * The below are the main callbacks from hda_codec.
1093 *
1094 * They are just the skeleton to call sub-callbacks according to the
1095 * current setting of chip->single_cmd.
1096 */
1097
1098/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001099static int azx_send_cmd(struct hda_bus *bus, unsigned int val)
Takashi Iwai111d3af2006-02-16 18:17:58 +01001100{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001101 struct azx *chip = bus->private_data;
Takashi Iwai43bbb6c2007-07-06 20:22:05 +02001102
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001103 if (chip->disabled)
1104 return 0;
Wu Fengguangfeb27342009-08-01 19:17:14 +08001105 chip->last_cmd[azx_command_addr(val)] = val;
Takashi Iwai111d3af2006-02-16 18:17:58 +01001106 if (chip->single_cmd)
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001107 return azx_single_send_cmd(bus, val);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001108 else
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001109 return azx_corb_send_cmd(bus, val);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001110}
1111
1112/* get a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +08001113static unsigned int azx_get_response(struct hda_bus *bus,
1114 unsigned int addr)
Takashi Iwai111d3af2006-02-16 18:17:58 +01001115{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001116 struct azx *chip = bus->private_data;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001117 if (chip->disabled)
1118 return 0;
Takashi Iwai111d3af2006-02-16 18:17:58 +01001119 if (chip->single_cmd)
Wu Fengguangdeadff12009-08-01 18:45:16 +08001120 return azx_single_get_response(bus, addr);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001121 else
Wu Fengguangdeadff12009-08-01 18:45:16 +08001122 return azx_rirb_get_response(bus, addr);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001123}
1124
Takashi Iwai83012a72012-08-24 18:38:08 +02001125#ifdef CONFIG_PM
Takashi Iwai68467f52012-08-28 09:14:29 -07001126static void azx_power_notify(struct hda_bus *bus, bool power_up);
Takashi Iwaicb53c622007-08-10 17:21:45 +02001127#endif
Takashi Iwai111d3af2006-02-16 18:17:58 +01001128
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001129#ifdef CONFIG_SND_HDA_DSP_LOADER
1130static int azx_load_dsp_prepare(struct hda_bus *bus, unsigned int format,
1131 unsigned int byte_size,
1132 struct snd_dma_buffer *bufp);
1133static void azx_load_dsp_trigger(struct hda_bus *bus, bool start);
1134static void azx_load_dsp_cleanup(struct hda_bus *bus,
1135 struct snd_dma_buffer *dmab);
1136#endif
1137
Mengdong Lin3af3f352013-06-24 10:18:54 -04001138/* enter link reset */
Mengdong Lin7295b262013-06-25 05:58:49 -04001139static void azx_enter_link_reset(struct azx *chip)
Mengdong Lin3af3f352013-06-24 10:18:54 -04001140{
1141 unsigned long timeout;
1142
1143 /* reset controller */
1144 azx_writel(chip, GCTL, azx_readl(chip, GCTL) & ~ICH6_GCTL_RESET);
1145
1146 timeout = jiffies + msecs_to_jiffies(100);
1147 while ((azx_readb(chip, GCTL) & ICH6_GCTL_RESET) &&
1148 time_before(jiffies, timeout))
1149 usleep_range(500, 1000);
1150}
1151
Mengdong Lin7295b262013-06-25 05:58:49 -04001152/* exit link reset */
1153static void azx_exit_link_reset(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001154{
Mengdong Linfa348da2012-12-12 09:16:15 -05001155 unsigned long timeout;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001156
Mengdong Lin7295b262013-06-25 05:58:49 -04001157 azx_writeb(chip, GCTL, azx_readb(chip, GCTL) | ICH6_GCTL_RESET);
1158
1159 timeout = jiffies + msecs_to_jiffies(100);
1160 while (!azx_readb(chip, GCTL) &&
1161 time_before(jiffies, timeout))
1162 usleep_range(500, 1000);
1163}
1164
1165/* reset codec link */
1166static int azx_reset(struct azx *chip, int full_reset)
1167{
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001168 if (!full_reset)
1169 goto __skip;
1170
Danny Tholene8a7f132007-09-11 21:41:56 +02001171 /* clear STATESTS */
Wang Xingchaoda7db6a2013-07-22 03:19:18 -04001172 azx_writew(chip, STATESTS, STATESTS_INT_MASK);
Danny Tholene8a7f132007-09-11 21:41:56 +02001173
Linus Torvalds1da177e2005-04-16 15:20:36 -07001174 /* reset controller */
Mengdong Lin7295b262013-06-25 05:58:49 -04001175 azx_enter_link_reset(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001176
1177 /* delay for >= 100us for codec PLL to settle per spec
1178 * Rev 0.9 section 5.5.1
1179 */
Mengdong Linfa348da2012-12-12 09:16:15 -05001180 usleep_range(500, 1000);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001181
1182 /* Bring controller out of reset */
Mengdong Lin7295b262013-06-25 05:58:49 -04001183 azx_exit_link_reset(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001184
Pavel Machek927fc862006-08-31 17:03:43 +02001185 /* Brent Chartrand said to wait >= 540us for codecs to initialize */
Mengdong Linfa348da2012-12-12 09:16:15 -05001186 usleep_range(1000, 1200);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001187
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001188 __skip:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001189 /* check to see if controller is ready */
Pavel Machek927fc862006-08-31 17:03:43 +02001190 if (!azx_readb(chip, GCTL)) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001191 snd_printd(SFX "%s: azx_reset: controller not ready!\n", pci_name(chip->pci));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001192 return -EBUSY;
1193 }
1194
Matt41e2fce2005-07-04 17:49:55 +02001195 /* Accept unsolicited responses */
Takashi Iwai1a696972009-11-07 09:49:04 +01001196 if (!chip->single_cmd)
1197 azx_writel(chip, GCTL, azx_readl(chip, GCTL) |
1198 ICH6_GCTL_UNSOL);
Matt41e2fce2005-07-04 17:49:55 +02001199
Linus Torvalds1da177e2005-04-16 15:20:36 -07001200 /* detect codecs */
Pavel Machek927fc862006-08-31 17:03:43 +02001201 if (!chip->codec_mask) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001202 chip->codec_mask = azx_readw(chip, STATESTS);
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001203 snd_printdd(SFX "%s: codec_mask = 0x%x\n", pci_name(chip->pci), chip->codec_mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001204 }
1205
1206 return 0;
1207}
1208
1209
1210/*
1211 * Lowlevel interface
1212 */
1213
1214/* enable interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001215static void azx_int_enable(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001216{
1217 /* enable controller CIE and GIE */
1218 azx_writel(chip, INTCTL, azx_readl(chip, INTCTL) |
1219 ICH6_INT_CTRL_EN | ICH6_INT_GLOBAL_EN);
1220}
1221
1222/* disable interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001223static void azx_int_disable(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001224{
1225 int i;
1226
1227 /* disable interrupts in stream descriptor */
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001228 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001229 struct azx_dev *azx_dev = &chip->azx_dev[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001230 azx_sd_writeb(azx_dev, SD_CTL,
1231 azx_sd_readb(azx_dev, SD_CTL) & ~SD_INT_MASK);
1232 }
1233
1234 /* disable SIE for all streams */
1235 azx_writeb(chip, INTCTL, 0);
1236
1237 /* disable controller CIE and GIE */
1238 azx_writel(chip, INTCTL, azx_readl(chip, INTCTL) &
1239 ~(ICH6_INT_CTRL_EN | ICH6_INT_GLOBAL_EN));
1240}
1241
1242/* clear interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001243static void azx_int_clear(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001244{
1245 int i;
1246
1247 /* clear stream status */
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001248 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001249 struct azx_dev *azx_dev = &chip->azx_dev[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001250 azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK);
1251 }
1252
1253 /* clear STATESTS */
Wang Xingchaoda7db6a2013-07-22 03:19:18 -04001254 azx_writew(chip, STATESTS, STATESTS_INT_MASK);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001255
1256 /* clear rirb status */
1257 azx_writeb(chip, RIRBSTS, RIRB_INT_MASK);
1258
1259 /* clear int status */
1260 azx_writel(chip, INTSTS, ICH6_INT_CTRL_EN | ICH6_INT_ALL_STREAM);
1261}
1262
1263/* start a stream */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001264static void azx_stream_start(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001265{
Joseph Chan0e153472008-08-26 14:38:03 +02001266 /*
1267 * Before stream start, initialize parameter
1268 */
1269 azx_dev->insufficient = 1;
1270
Linus Torvalds1da177e2005-04-16 15:20:36 -07001271 /* enable SIE */
Wei Niccc5df02010-01-26 15:59:33 +08001272 azx_writel(chip, INTCTL,
1273 azx_readl(chip, INTCTL) | (1 << azx_dev->index));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001274 /* set DMA start and interrupt mask */
1275 azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) |
1276 SD_CTL_DMA_START | SD_INT_MASK);
1277}
1278
Takashi Iwai1dddab42009-03-18 15:15:37 +01001279/* stop DMA */
1280static void azx_stream_clear(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001281{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001282 azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) &
1283 ~(SD_CTL_DMA_START | SD_INT_MASK));
1284 azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK); /* to be sure */
Takashi Iwai1dddab42009-03-18 15:15:37 +01001285}
1286
1287/* stop a stream */
1288static void azx_stream_stop(struct azx *chip, struct azx_dev *azx_dev)
1289{
1290 azx_stream_clear(chip, azx_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001291 /* disable SIE */
Wei Niccc5df02010-01-26 15:59:33 +08001292 azx_writel(chip, INTCTL,
1293 azx_readl(chip, INTCTL) & ~(1 << azx_dev->index));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001294}
1295
1296
1297/*
Takashi Iwaicb53c622007-08-10 17:21:45 +02001298 * reset and start the controller registers
Linus Torvalds1da177e2005-04-16 15:20:36 -07001299 */
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001300static void azx_init_chip(struct azx *chip, int full_reset)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001301{
Takashi Iwaicb53c622007-08-10 17:21:45 +02001302 if (chip->initialized)
1303 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001304
1305 /* reset controller */
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001306 azx_reset(chip, full_reset);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001307
1308 /* initialize interrupts */
1309 azx_int_clear(chip);
1310 azx_int_enable(chip);
1311
1312 /* initialize the codec command I/O */
Takashi Iwai1a696972009-11-07 09:49:04 +01001313 if (!chip->single_cmd)
1314 azx_init_cmd_io(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001315
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02001316 /* program the position buffer */
1317 azx_writel(chip, DPLBASE, (u32)chip->posbuf.addr);
Takashi Iwai766979e2008-06-13 20:53:56 +02001318 azx_writel(chip, DPUBASE, upper_32_bits(chip->posbuf.addr));
Frederick Lif5d40b32005-05-12 14:55:20 +02001319
Takashi Iwaicb53c622007-08-10 17:21:45 +02001320 chip->initialized = 1;
1321}
1322
1323/*
1324 * initialize the PCI registers
1325 */
1326/* update bits in a PCI register byte */
1327static void update_pci_byte(struct pci_dev *pci, unsigned int reg,
1328 unsigned char mask, unsigned char val)
1329{
1330 unsigned char data;
1331
1332 pci_read_config_byte(pci, reg, &data);
1333 data &= ~mask;
1334 data |= (val & mask);
1335 pci_write_config_byte(pci, reg, data);
1336}
1337
1338static void azx_init_pci(struct azx *chip)
1339{
1340 /* Clear bits 0-2 of PCI register TCSEL (at offset 0x44)
1341 * TCSEL == Traffic Class Select Register, which sets PCI express QOS
1342 * Ensuring these bits are 0 clears playback static on some HD Audio
Adam Lackorzynskia09e89f2011-03-10 17:41:56 +01001343 * codecs.
1344 * The PCI register TCSEL is defined in the Intel manuals.
Takashi Iwaicb53c622007-08-10 17:21:45 +02001345 */
Linus Torvalds46f2cc82011-05-27 19:45:28 -07001346 if (!(chip->driver_caps & AZX_DCAPS_NO_TCSEL)) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001347 snd_printdd(SFX "%s: Clearing TCSEL\n", pci_name(chip->pci));
Adam Lackorzynskia09e89f2011-03-10 17:41:56 +01001348 update_pci_byte(chip->pci, ICH6_PCIREG_TCSEL, 0x07, 0);
Takashi Iwai9477c582011-05-25 09:11:37 +02001349 }
Takashi Iwaicb53c622007-08-10 17:21:45 +02001350
Takashi Iwai9477c582011-05-25 09:11:37 +02001351 /* For ATI SB450/600/700/800/900 and AMD Hudson azalia HD audio,
1352 * we need to enable snoop.
1353 */
1354 if (chip->driver_caps & AZX_DCAPS_ATI_SNOOP) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001355 snd_printdd(SFX "%s: Setting ATI snoop: %d\n", pci_name(chip->pci), azx_snoop(chip));
Takashi Iwaicb53c622007-08-10 17:21:45 +02001356 update_pci_byte(chip->pci,
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001357 ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR, 0x07,
1358 azx_snoop(chip) ? ATI_SB450_HDAUDIO_ENABLE_SNOOP : 0);
Takashi Iwai9477c582011-05-25 09:11:37 +02001359 }
1360
1361 /* For NVIDIA HDA, enable snoop */
1362 if (chip->driver_caps & AZX_DCAPS_NVIDIA_SNOOP) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001363 snd_printdd(SFX "%s: Setting Nvidia snoop: %d\n", pci_name(chip->pci), azx_snoop(chip));
Takashi Iwaicb53c622007-08-10 17:21:45 +02001364 update_pci_byte(chip->pci,
1365 NVIDIA_HDA_TRANSREG_ADDR,
1366 0x0f, NVIDIA_HDA_ENABLE_COHBITS);
Peer Chen320dcc32008-08-20 16:43:24 -07001367 update_pci_byte(chip->pci,
1368 NVIDIA_HDA_ISTRM_COH,
1369 0x01, NVIDIA_HDA_ENABLE_COHBIT);
1370 update_pci_byte(chip->pci,
1371 NVIDIA_HDA_OSTRM_COH,
1372 0x01, NVIDIA_HDA_ENABLE_COHBIT);
Takashi Iwai9477c582011-05-25 09:11:37 +02001373 }
1374
1375 /* Enable SCH/PCH snoop if needed */
1376 if (chip->driver_caps & AZX_DCAPS_SCH_SNOOP) {
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001377 unsigned short snoop;
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001378 pci_read_config_word(chip->pci, INTEL_SCH_HDA_DEVC, &snoop);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001379 if ((!azx_snoop(chip) && !(snoop & INTEL_SCH_HDA_DEVC_NOSNOOP)) ||
1380 (azx_snoop(chip) && (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP))) {
1381 snoop &= ~INTEL_SCH_HDA_DEVC_NOSNOOP;
1382 if (!azx_snoop(chip))
1383 snoop |= INTEL_SCH_HDA_DEVC_NOSNOOP;
1384 pci_write_config_word(chip->pci, INTEL_SCH_HDA_DEVC, snoop);
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001385 pci_read_config_word(chip->pci,
1386 INTEL_SCH_HDA_DEVC, &snoop);
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001387 }
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001388 snd_printdd(SFX "%s: SCH snoop: %s\n",
1389 pci_name(chip->pci), (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP)
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001390 ? "Disabled" : "Enabled");
Vinod Gda3fca22005-09-13 18:49:12 +02001391 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001392}
1393
1394
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001395static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev);
1396
Linus Torvalds1da177e2005-04-16 15:20:36 -07001397/*
1398 * interrupt handler
1399 */
David Howells7d12e782006-10-05 14:55:46 +01001400static irqreturn_t azx_interrupt(int irq, void *dev_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001401{
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001402 struct azx *chip = dev_id;
1403 struct azx_dev *azx_dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001404 u32 status;
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001405 u8 sd_status;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001406 int i, ok;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001407
Mengdong Linb8dfc4622012-08-23 17:32:30 +08001408#ifdef CONFIG_PM_RUNTIME
Dave Airlie246efa42013-07-29 15:19:29 +10001409 if (chip->driver_caps & AZX_DCAPS_PM_RUNTIME)
1410 if (chip->pci->dev.power.runtime_status != RPM_ACTIVE)
1411 return IRQ_NONE;
Mengdong Linb8dfc4622012-08-23 17:32:30 +08001412#endif
1413
Linus Torvalds1da177e2005-04-16 15:20:36 -07001414 spin_lock(&chip->reg_lock);
1415
Dan Carpenter60911062012-05-18 10:36:11 +03001416 if (chip->disabled) {
1417 spin_unlock(&chip->reg_lock);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001418 return IRQ_NONE;
Dan Carpenter60911062012-05-18 10:36:11 +03001419 }
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001420
Linus Torvalds1da177e2005-04-16 15:20:36 -07001421 status = azx_readl(chip, INTSTS);
Dave Airlie246efa42013-07-29 15:19:29 +10001422 if (status == 0 || status == 0xffffffff) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001423 spin_unlock(&chip->reg_lock);
1424 return IRQ_NONE;
1425 }
1426
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001427 for (i = 0; i < chip->num_streams; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001428 azx_dev = &chip->azx_dev[i];
1429 if (status & azx_dev->sd_int_sta_mask) {
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001430 sd_status = azx_sd_readb(azx_dev, SD_STS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001431 azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK);
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001432 if (!azx_dev->substream || !azx_dev->running ||
1433 !(sd_status & SD_INT_COMPLETE))
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001434 continue;
1435 /* check whether this IRQ is really acceptable */
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001436 ok = azx_position_ok(chip, azx_dev);
1437 if (ok == 1) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001438 azx_dev->irq_pending = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001439 spin_unlock(&chip->reg_lock);
1440 snd_pcm_period_elapsed(azx_dev->substream);
1441 spin_lock(&chip->reg_lock);
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001442 } else if (ok == 0 && chip->bus && chip->bus->workq) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001443 /* bogus IRQ, process it later */
1444 azx_dev->irq_pending = 1;
Takashi Iwai6acaed32009-01-12 10:09:24 +01001445 queue_work(chip->bus->workq,
1446 &chip->irq_pending_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001447 }
1448 }
1449 }
1450
1451 /* clear rirb int */
1452 status = azx_readb(chip, RIRBSTS);
1453 if (status & RIRB_INT_MASK) {
Takashi Iwai14d34f12010-10-21 09:03:25 +02001454 if (status & RIRB_INT_RESPONSE) {
Takashi Iwai9477c582011-05-25 09:11:37 +02001455 if (chip->driver_caps & AZX_DCAPS_RIRB_PRE_DELAY)
Takashi Iwai14d34f12010-10-21 09:03:25 +02001456 udelay(80);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001457 azx_update_rirb(chip);
Takashi Iwai14d34f12010-10-21 09:03:25 +02001458 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001459 azx_writeb(chip, RIRBSTS, RIRB_INT_MASK);
1460 }
1461
1462#if 0
1463 /* clear state status int */
Wang Xingchaoda7db6a2013-07-22 03:19:18 -04001464 if (azx_readw(chip, STATESTS) & 0x04)
1465 azx_writew(chip, STATESTS, 0x04);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001466#endif
1467 spin_unlock(&chip->reg_lock);
1468
1469 return IRQ_HANDLED;
1470}
1471
1472
1473/*
Takashi Iwai675f25d2008-06-10 17:53:20 +02001474 * set up a BDL entry
1475 */
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001476static int setup_bdle(struct azx *chip,
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001477 struct snd_dma_buffer *dmab,
Takashi Iwai675f25d2008-06-10 17:53:20 +02001478 struct azx_dev *azx_dev, u32 **bdlp,
1479 int ofs, int size, int with_ioc)
1480{
Takashi Iwai675f25d2008-06-10 17:53:20 +02001481 u32 *bdl = *bdlp;
1482
1483 while (size > 0) {
1484 dma_addr_t addr;
1485 int chunk;
1486
1487 if (azx_dev->frags >= AZX_MAX_BDL_ENTRIES)
1488 return -EINVAL;
1489
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001490 addr = snd_sgbuf_get_addr(dmab, ofs);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001491 /* program the address field of the BDL entry */
1492 bdl[0] = cpu_to_le32((u32)addr);
Takashi Iwai766979e2008-06-13 20:53:56 +02001493 bdl[1] = cpu_to_le32(upper_32_bits(addr));
Takashi Iwai675f25d2008-06-10 17:53:20 +02001494 /* program the size field of the BDL entry */
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001495 chunk = snd_sgbuf_get_chunk_size(dmab, ofs, size);
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001496 /* one BDLE cannot cross 4K boundary on CTHDA chips */
1497 if (chip->driver_caps & AZX_DCAPS_4K_BDLE_BOUNDARY) {
1498 u32 remain = 0x1000 - (ofs & 0xfff);
1499 if (chunk > remain)
1500 chunk = remain;
1501 }
Takashi Iwai675f25d2008-06-10 17:53:20 +02001502 bdl[2] = cpu_to_le32(chunk);
1503 /* program the IOC to enable interrupt
1504 * only when the whole fragment is processed
1505 */
1506 size -= chunk;
1507 bdl[3] = (size || !with_ioc) ? 0 : cpu_to_le32(0x01);
1508 bdl += 4;
1509 azx_dev->frags++;
1510 ofs += chunk;
1511 }
1512 *bdlp = bdl;
1513 return ofs;
1514}
1515
1516/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001517 * set up BDL entries
1518 */
Takashi Iwai555e2192008-06-10 17:53:34 +02001519static int azx_setup_periods(struct azx *chip,
1520 struct snd_pcm_substream *substream,
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001521 struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001522{
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001523 u32 *bdl;
1524 int i, ofs, periods, period_bytes;
Takashi Iwai555e2192008-06-10 17:53:34 +02001525 int pos_adj;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001526
1527 /* reset BDL address */
1528 azx_sd_writel(azx_dev, SD_BDLPL, 0);
1529 azx_sd_writel(azx_dev, SD_BDLPU, 0);
1530
Takashi Iwai97b71c92009-03-18 15:09:13 +01001531 period_bytes = azx_dev->period_bytes;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001532 periods = azx_dev->bufsize / period_bytes;
1533
Linus Torvalds1da177e2005-04-16 15:20:36 -07001534 /* program the initial BDL entries */
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001535 bdl = (u32 *)azx_dev->bdl.area;
1536 ofs = 0;
1537 azx_dev->frags = 0;
Takashi Iwai555e2192008-06-10 17:53:34 +02001538 pos_adj = bdl_pos_adj[chip->dev_index];
Takashi Iwai915bf292012-09-11 15:19:10 +02001539 if (!azx_dev->no_period_wakeup && pos_adj > 0) {
Takashi Iwai675f25d2008-06-10 17:53:20 +02001540 struct snd_pcm_runtime *runtime = substream->runtime;
Takashi Iwaie785d3d2008-07-15 16:28:43 +02001541 int pos_align = pos_adj;
Takashi Iwai555e2192008-06-10 17:53:34 +02001542 pos_adj = (pos_adj * runtime->rate + 47999) / 48000;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001543 if (!pos_adj)
Takashi Iwaie785d3d2008-07-15 16:28:43 +02001544 pos_adj = pos_align;
1545 else
1546 pos_adj = ((pos_adj + pos_align - 1) / pos_align) *
1547 pos_align;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001548 pos_adj = frames_to_bytes(runtime, pos_adj);
1549 if (pos_adj >= period_bytes) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001550 snd_printk(KERN_WARNING SFX "%s: Too big adjustment %d\n",
1551 pci_name(chip->pci), bdl_pos_adj[chip->dev_index]);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001552 pos_adj = 0;
1553 } else {
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001554 ofs = setup_bdle(chip, snd_pcm_get_dma_buf(substream),
1555 azx_dev,
Takashi Iwai915bf292012-09-11 15:19:10 +02001556 &bdl, ofs, pos_adj, true);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001557 if (ofs < 0)
1558 goto error;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001559 }
Takashi Iwai555e2192008-06-10 17:53:34 +02001560 } else
1561 pos_adj = 0;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001562 for (i = 0; i < periods; i++) {
1563 if (i == periods - 1 && pos_adj)
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001564 ofs = setup_bdle(chip, snd_pcm_get_dma_buf(substream),
1565 azx_dev, &bdl, ofs,
Takashi Iwai675f25d2008-06-10 17:53:20 +02001566 period_bytes - pos_adj, 0);
1567 else
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001568 ofs = setup_bdle(chip, snd_pcm_get_dma_buf(substream),
1569 azx_dev, &bdl, ofs,
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001570 period_bytes,
Takashi Iwai915bf292012-09-11 15:19:10 +02001571 !azx_dev->no_period_wakeup);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001572 if (ofs < 0)
1573 goto error;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001574 }
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001575 return 0;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001576
1577 error:
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001578 snd_printk(KERN_ERR SFX "%s: Too many BDL entries: buffer=%d, period=%d\n",
1579 pci_name(chip->pci), azx_dev->bufsize, period_bytes);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001580 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001581}
1582
Takashi Iwai1dddab42009-03-18 15:15:37 +01001583/* reset stream */
1584static void azx_stream_reset(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001585{
1586 unsigned char val;
1587 int timeout;
1588
Takashi Iwai1dddab42009-03-18 15:15:37 +01001589 azx_stream_clear(chip, azx_dev);
1590
Takashi Iwaid01ce992007-07-27 16:52:19 +02001591 azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) |
1592 SD_CTL_STREAM_RESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001593 udelay(3);
1594 timeout = 300;
1595 while (!((val = azx_sd_readb(azx_dev, SD_CTL)) & SD_CTL_STREAM_RESET) &&
1596 --timeout)
1597 ;
1598 val &= ~SD_CTL_STREAM_RESET;
1599 azx_sd_writeb(azx_dev, SD_CTL, val);
1600 udelay(3);
1601
1602 timeout = 300;
1603 /* waiting for hardware to report that the stream is out of reset */
1604 while (((val = azx_sd_readb(azx_dev, SD_CTL)) & SD_CTL_STREAM_RESET) &&
1605 --timeout)
1606 ;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001607
1608 /* reset first position - may not be synced with hw at this time */
1609 *azx_dev->posbuf = 0;
Takashi Iwai1dddab42009-03-18 15:15:37 +01001610}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001611
Takashi Iwai1dddab42009-03-18 15:15:37 +01001612/*
1613 * set up the SD for streaming
1614 */
1615static int azx_setup_controller(struct azx *chip, struct azx_dev *azx_dev)
1616{
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001617 unsigned int val;
Takashi Iwai1dddab42009-03-18 15:15:37 +01001618 /* make sure the run bit is zero for SD */
1619 azx_stream_clear(chip, azx_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001620 /* program the stream_tag */
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001621 val = azx_sd_readl(azx_dev, SD_CTL);
1622 val = (val & ~SD_CTL_STREAM_TAG_MASK) |
1623 (azx_dev->stream_tag << SD_CTL_STREAM_TAG_SHIFT);
1624 if (!azx_snoop(chip))
1625 val |= SD_CTL_TRAFFIC_PRIO;
1626 azx_sd_writel(azx_dev, SD_CTL, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001627
1628 /* program the length of samples in cyclic buffer */
1629 azx_sd_writel(azx_dev, SD_CBL, azx_dev->bufsize);
1630
1631 /* program the stream format */
1632 /* this value needs to be the same as the one programmed */
1633 azx_sd_writew(azx_dev, SD_FORMAT, azx_dev->format_val);
1634
1635 /* program the stream LVI (last valid index) of the BDL */
1636 azx_sd_writew(azx_dev, SD_LVI, azx_dev->frags - 1);
1637
1638 /* program the BDL address */
1639 /* lower BDL address */
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001640 azx_sd_writel(azx_dev, SD_BDLPL, (u32)azx_dev->bdl.addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001641 /* upper BDL address */
Takashi Iwai766979e2008-06-13 20:53:56 +02001642 azx_sd_writel(azx_dev, SD_BDLPU, upper_32_bits(azx_dev->bdl.addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001643
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02001644 /* enable the position buffer */
David Henningsson4cb36312010-09-30 10:12:50 +02001645 if (chip->position_fix[0] != POS_FIX_LPIB ||
1646 chip->position_fix[1] != POS_FIX_LPIB) {
Takashi Iwaiee9d6b92008-03-14 15:52:20 +01001647 if (!(azx_readl(chip, DPLBASE) & ICH6_DPLBASE_ENABLE))
1648 azx_writel(chip, DPLBASE,
1649 (u32)chip->posbuf.addr | ICH6_DPLBASE_ENABLE);
1650 }
Takashi Iwaic74db862005-05-12 14:26:27 +02001651
Linus Torvalds1da177e2005-04-16 15:20:36 -07001652 /* set the interrupt enable bits in the descriptor control register */
Takashi Iwaid01ce992007-07-27 16:52:19 +02001653 azx_sd_writel(azx_dev, SD_CTL,
1654 azx_sd_readl(azx_dev, SD_CTL) | SD_INT_MASK);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001655
1656 return 0;
1657}
1658
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001659/*
1660 * Probe the given codec address
1661 */
1662static int probe_codec(struct azx *chip, int addr)
1663{
1664 unsigned int cmd = (addr << 28) | (AC_NODE_ROOT << 20) |
1665 (AC_VERB_PARAMETERS << 8) | AC_PAR_VENDOR_ID;
1666 unsigned int res;
1667
Wu Fengguanga678cde2009-08-01 18:46:46 +08001668 mutex_lock(&chip->bus->cmd_mutex);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001669 chip->probing = 1;
1670 azx_send_cmd(chip->bus, cmd);
Wu Fengguangdeadff12009-08-01 18:45:16 +08001671 res = azx_get_response(chip->bus, addr);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001672 chip->probing = 0;
Wu Fengguanga678cde2009-08-01 18:46:46 +08001673 mutex_unlock(&chip->bus->cmd_mutex);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001674 if (res == -1)
1675 return -EIO;
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001676 snd_printdd(SFX "%s: codec #%d probed OK\n", pci_name(chip->pci), addr);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001677 return 0;
1678}
1679
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001680static int azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec,
1681 struct hda_pcm *cpcm);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001682static void azx_stop_chip(struct azx *chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001683
Takashi Iwai8dd78332009-06-02 01:16:07 +02001684static void azx_bus_reset(struct hda_bus *bus)
1685{
1686 struct azx *chip = bus->private_data;
Takashi Iwai8dd78332009-06-02 01:16:07 +02001687
1688 bus->in_reset = 1;
1689 azx_stop_chip(chip);
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001690 azx_init_chip(chip, 1);
Alexander Beregalov65f75982009-06-04 13:46:16 +04001691#ifdef CONFIG_PM
Takashi Iwai8dd78332009-06-02 01:16:07 +02001692 if (chip->initialized) {
Takashi Iwai01b65bf2011-11-24 14:31:46 +01001693 struct azx_pcm *p;
1694 list_for_each_entry(p, &chip->pcm_list, list)
1695 snd_pcm_suspend_all(p->pcm);
Takashi Iwai8dd78332009-06-02 01:16:07 +02001696 snd_hda_suspend(chip->bus);
1697 snd_hda_resume(chip->bus);
1698 }
Alexander Beregalov65f75982009-06-04 13:46:16 +04001699#endif
Takashi Iwai8dd78332009-06-02 01:16:07 +02001700 bus->in_reset = 0;
1701}
1702
David Henningsson26a6cb62012-10-09 15:04:21 +02001703static int get_jackpoll_interval(struct azx *chip)
1704{
1705 int i = jackpoll_ms[chip->dev_index];
1706 unsigned int j;
1707 if (i == 0)
1708 return 0;
1709 if (i < 50 || i > 60000)
1710 j = 0;
1711 else
1712 j = msecs_to_jiffies(i);
1713 if (j == 0)
1714 snd_printk(KERN_WARNING SFX
1715 "jackpoll_ms value out of range: %d\n", i);
1716 return j;
1717}
1718
Linus Torvalds1da177e2005-04-16 15:20:36 -07001719/*
1720 * Codec initialization
1721 */
1722
Takashi Iwai2f5983f2008-09-03 16:00:44 +02001723/* number of codec slots for each chipset: 0 = default slots (i.e. 4) */
Takashi Iwai48c8b0e2012-12-07 07:40:35 +01001724static unsigned int azx_max_codecs[AZX_NUM_DRIVERS] = {
Wei Ni7445dfc2010-03-03 15:05:53 +08001725 [AZX_DRIVER_NVIDIA] = 8,
Kailang Yangf2690022008-05-27 11:44:55 +02001726 [AZX_DRIVER_TERA] = 1,
Takashi Iwaia9995a32007-03-12 21:30:46 +01001727};
1728
Takashi Iwai48c8b0e2012-12-07 07:40:35 +01001729static int azx_codec_create(struct azx *chip, const char *model)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001730{
1731 struct hda_bus_template bus_temp;
Takashi Iwai34c25352008-10-28 11:38:58 +01001732 int c, codecs, err;
1733 int max_slots;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001734
1735 memset(&bus_temp, 0, sizeof(bus_temp));
1736 bus_temp.private_data = chip;
1737 bus_temp.modelname = model;
1738 bus_temp.pci = chip->pci;
Takashi Iwai111d3af2006-02-16 18:17:58 +01001739 bus_temp.ops.command = azx_send_cmd;
1740 bus_temp.ops.get_response = azx_get_response;
Takashi Iwai176d5332008-07-30 15:01:44 +02001741 bus_temp.ops.attach_pcm = azx_attach_pcm_stream;
Takashi Iwai8dd78332009-06-02 01:16:07 +02001742 bus_temp.ops.bus_reset = azx_bus_reset;
Takashi Iwai83012a72012-08-24 18:38:08 +02001743#ifdef CONFIG_PM
Takashi Iwai11cd41b2008-11-28 07:22:18 +01001744 bus_temp.power_save = &power_save;
Takashi Iwaicb53c622007-08-10 17:21:45 +02001745 bus_temp.ops.pm_notify = azx_power_notify;
1746#endif
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001747#ifdef CONFIG_SND_HDA_DSP_LOADER
1748 bus_temp.ops.load_dsp_prepare = azx_load_dsp_prepare;
1749 bus_temp.ops.load_dsp_trigger = azx_load_dsp_trigger;
1750 bus_temp.ops.load_dsp_cleanup = azx_load_dsp_cleanup;
1751#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07001752
Takashi Iwaid01ce992007-07-27 16:52:19 +02001753 err = snd_hda_bus_new(chip->card, &bus_temp, &chip->bus);
1754 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001755 return err;
1756
Takashi Iwai9477c582011-05-25 09:11:37 +02001757 if (chip->driver_caps & AZX_DCAPS_RIRB_DELAY) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001758 snd_printd(SFX "%s: Enable delay in RIRB handling\n", pci_name(chip->pci));
Wei Nidc9c8e22008-09-26 13:55:56 +08001759 chip->bus->needs_damn_long_delay = 1;
Takashi Iwai9477c582011-05-25 09:11:37 +02001760 }
Wei Nidc9c8e22008-09-26 13:55:56 +08001761
Takashi Iwai34c25352008-10-28 11:38:58 +01001762 codecs = 0;
Takashi Iwai2f5983f2008-09-03 16:00:44 +02001763 max_slots = azx_max_codecs[chip->driver_type];
1764 if (!max_slots)
Wei Ni7445dfc2010-03-03 15:05:53 +08001765 max_slots = AZX_DEFAULT_CODECS;
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001766
1767 /* First try to probe all given codec slots */
1768 for (c = 0; c < max_slots; c++) {
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01001769 if ((chip->codec_mask & (1 << c)) & chip->codec_probe_mask) {
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001770 if (probe_codec(chip, c) < 0) {
1771 /* Some BIOSen give you wrong codec addresses
1772 * that don't exist
1773 */
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001774 snd_printk(KERN_WARNING SFX
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001775 "%s: Codec #%d probe error; "
1776 "disabling it...\n", pci_name(chip->pci), c);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001777 chip->codec_mask &= ~(1 << c);
1778 /* More badly, accessing to a non-existing
1779 * codec often screws up the controller chip,
Paul Menzel24481582010-02-08 20:37:26 +01001780 * and disturbs the further communications.
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001781 * Thus if an error occurs during probing,
1782 * better to reset the controller chip to
1783 * get back to the sanity state.
1784 */
1785 azx_stop_chip(chip);
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001786 azx_init_chip(chip, 1);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001787 }
1788 }
1789 }
1790
Takashi Iwaid507cd62011-04-26 15:25:02 +02001791 /* AMD chipsets often cause the communication stalls upon certain
1792 * sequence like the pin-detection. It seems that forcing the synced
1793 * access works around the stall. Grrr...
1794 */
Takashi Iwai9477c582011-05-25 09:11:37 +02001795 if (chip->driver_caps & AZX_DCAPS_SYNC_WRITE) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001796 snd_printd(SFX "%s: Enable sync_write for stable communication\n",
1797 pci_name(chip->pci));
Takashi Iwaid507cd62011-04-26 15:25:02 +02001798 chip->bus->sync_write = 1;
1799 chip->bus->allow_bus_reset = 1;
1800 }
1801
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001802 /* Then create codec instances */
Takashi Iwai34c25352008-10-28 11:38:58 +01001803 for (c = 0; c < max_slots; c++) {
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01001804 if ((chip->codec_mask & (1 << c)) & chip->codec_probe_mask) {
Takashi Iwaibccad142007-04-24 12:23:53 +02001805 struct hda_codec *codec;
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001806 err = snd_hda_codec_new(chip->bus, c, &codec);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001807 if (err < 0)
1808 continue;
David Henningsson26a6cb62012-10-09 15:04:21 +02001809 codec->jackpoll_interval = get_jackpoll_interval(chip);
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +01001810 codec->beep_mode = chip->beep_mode;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001811 codecs++;
Takashi Iwai19a982b2007-03-21 15:14:35 +01001812 }
1813 }
1814 if (!codecs) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08001815 snd_printk(KERN_ERR SFX "%s: no codecs initialized\n", pci_name(chip->pci));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001816 return -ENXIO;
1817 }
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001818 return 0;
1819}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001820
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001821/* configure each codec instance */
Bill Pembertone23e7a12012-12-06 12:35:10 -05001822static int azx_codec_configure(struct azx *chip)
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001823{
1824 struct hda_codec *codec;
1825 list_for_each_entry(codec, &chip->bus->codec_list, list) {
1826 snd_hda_codec_configure(codec);
1827 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001828 return 0;
1829}
1830
1831
1832/*
1833 * PCM support
1834 */
1835
1836/* assign a stream for the PCM */
Wu Fengguangef18bed2009-12-25 13:14:27 +08001837static inline struct azx_dev *
1838azx_assign_device(struct azx *chip, struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001839{
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001840 int dev, i, nums;
Wu Fengguangef18bed2009-12-25 13:14:27 +08001841 struct azx_dev *res = NULL;
Takashi Iwaid5cf9912011-10-06 10:07:58 +02001842 /* make a non-zero unique key for the substream */
1843 int key = (substream->pcm->device << 16) | (substream->number << 2) |
1844 (substream->stream + 1);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001845
1846 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001847 dev = chip->playback_index_offset;
1848 nums = chip->playback_streams;
1849 } else {
1850 dev = chip->capture_index_offset;
1851 nums = chip->capture_streams;
1852 }
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001853 for (i = 0; i < nums; i++, dev++) {
1854 struct azx_dev *azx_dev = &chip->azx_dev[dev];
1855 dsp_lock(azx_dev);
1856 if (!azx_dev->opened && !dsp_is_locked(azx_dev)) {
1857 res = azx_dev;
1858 if (res->assigned_key == key) {
1859 res->opened = 1;
1860 res->assigned_key = key;
1861 dsp_unlock(azx_dev);
1862 return azx_dev;
1863 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001864 }
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001865 dsp_unlock(azx_dev);
1866 }
Wu Fengguangef18bed2009-12-25 13:14:27 +08001867 if (res) {
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001868 dsp_lock(res);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001869 res->opened = 1;
Takashi Iwaid5cf9912011-10-06 10:07:58 +02001870 res->assigned_key = key;
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001871 dsp_unlock(res);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001872 }
1873 return res;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001874}
1875
1876/* release the assigned stream */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001877static inline void azx_release_device(struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001878{
1879 azx_dev->opened = 0;
1880}
1881
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001882static cycle_t azx_cc_read(const struct cyclecounter *cc)
1883{
1884 struct azx_dev *azx_dev = container_of(cc, struct azx_dev, azx_cc);
1885 struct snd_pcm_substream *substream = azx_dev->substream;
1886 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1887 struct azx *chip = apcm->chip;
1888
1889 return azx_readl(chip, WALLCLK);
1890}
1891
1892static void azx_timecounter_init(struct snd_pcm_substream *substream,
1893 bool force, cycle_t last)
1894{
1895 struct azx_dev *azx_dev = get_azx_dev(substream);
1896 struct timecounter *tc = &azx_dev->azx_tc;
1897 struct cyclecounter *cc = &azx_dev->azx_cc;
1898 u64 nsec;
1899
1900 cc->read = azx_cc_read;
1901 cc->mask = CLOCKSOURCE_MASK(32);
1902
1903 /*
1904 * Converting from 24 MHz to ns means applying a 125/3 factor.
1905 * To avoid any saturation issues in intermediate operations,
1906 * the 125 factor is applied first. The division is applied
1907 * last after reading the timecounter value.
1908 * Applying the 1/3 factor as part of the multiplication
1909 * requires at least 20 bits for a decent precision, however
1910 * overflows occur after about 4 hours or less, not a option.
1911 */
1912
1913 cc->mult = 125; /* saturation after 195 years */
1914 cc->shift = 0;
1915
1916 nsec = 0; /* audio time is elapsed time since trigger */
1917 timecounter_init(tc, cc, nsec);
1918 if (force)
1919 /*
1920 * force timecounter to use predefined value,
1921 * used for synchronized starts
1922 */
1923 tc->cycle_last = last;
1924}
1925
Dylan Reidae03bbb2013-04-15 11:57:05 -07001926static u64 azx_adjust_codec_delay(struct snd_pcm_substream *substream,
Dylan Reid78daea22013-04-08 18:20:30 -07001927 u64 nsec)
1928{
1929 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1930 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
1931 u64 codec_frames, codec_nsecs;
1932
1933 if (!hinfo->ops.get_delay)
1934 return nsec;
1935
1936 codec_frames = hinfo->ops.get_delay(hinfo, apcm->codec, substream);
1937 codec_nsecs = div_u64(codec_frames * 1000000000LL,
1938 substream->runtime->rate);
1939
Dylan Reidae03bbb2013-04-15 11:57:05 -07001940 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
1941 return nsec + codec_nsecs;
1942
Dylan Reid78daea22013-04-08 18:20:30 -07001943 return (nsec > codec_nsecs) ? nsec - codec_nsecs : 0;
1944}
1945
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001946static int azx_get_wallclock_tstamp(struct snd_pcm_substream *substream,
1947 struct timespec *ts)
1948{
1949 struct azx_dev *azx_dev = get_azx_dev(substream);
1950 u64 nsec;
1951
1952 nsec = timecounter_read(&azx_dev->azx_tc);
1953 nsec = div_u64(nsec, 3); /* can be optimized */
Dylan Reidae03bbb2013-04-15 11:57:05 -07001954 nsec = azx_adjust_codec_delay(substream, nsec);
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001955
1956 *ts = ns_to_timespec(nsec);
1957
1958 return 0;
1959}
1960
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001961static struct snd_pcm_hardware azx_pcm_hw = {
Takashi Iwaid01ce992007-07-27 16:52:19 +02001962 .info = (SNDRV_PCM_INFO_MMAP |
1963 SNDRV_PCM_INFO_INTERLEAVED |
Linus Torvalds1da177e2005-04-16 15:20:36 -07001964 SNDRV_PCM_INFO_BLOCK_TRANSFER |
1965 SNDRV_PCM_INFO_MMAP_VALID |
Pavel Machek927fc862006-08-31 17:03:43 +02001966 /* No full-resume yet implemented */
1967 /* SNDRV_PCM_INFO_RESUME |*/
Takashi Iwai850f0e52008-03-18 17:11:05 +01001968 SNDRV_PCM_INFO_PAUSE |
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001969 SNDRV_PCM_INFO_SYNC_START |
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001970 SNDRV_PCM_INFO_HAS_WALL_CLOCK |
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001971 SNDRV_PCM_INFO_NO_PERIOD_WAKEUP),
Linus Torvalds1da177e2005-04-16 15:20:36 -07001972 .formats = SNDRV_PCM_FMTBIT_S16_LE,
1973 .rates = SNDRV_PCM_RATE_48000,
1974 .rate_min = 48000,
1975 .rate_max = 48000,
1976 .channels_min = 2,
1977 .channels_max = 2,
1978 .buffer_bytes_max = AZX_MAX_BUF_SIZE,
1979 .period_bytes_min = 128,
1980 .period_bytes_max = AZX_MAX_BUF_SIZE / 2,
1981 .periods_min = 2,
1982 .periods_max = AZX_MAX_FRAG,
1983 .fifo_size = 0,
1984};
1985
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001986static int azx_pcm_open(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001987{
1988 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1989 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001990 struct azx *chip = apcm->chip;
1991 struct azx_dev *azx_dev;
1992 struct snd_pcm_runtime *runtime = substream->runtime;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001993 unsigned long flags;
1994 int err;
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001995 int buff_step;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001996
Ingo Molnar62932df2006-01-16 16:34:20 +01001997 mutex_lock(&chip->open_mutex);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001998 azx_dev = azx_assign_device(chip, substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001999 if (azx_dev == NULL) {
Ingo Molnar62932df2006-01-16 16:34:20 +01002000 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002001 return -EBUSY;
2002 }
2003 runtime->hw = azx_pcm_hw;
2004 runtime->hw.channels_min = hinfo->channels_min;
2005 runtime->hw.channels_max = hinfo->channels_max;
2006 runtime->hw.formats = hinfo->formats;
2007 runtime->hw.rates = hinfo->rates;
2008 snd_pcm_limit_hw_rates(runtime);
2009 snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05002010
2011 /* avoid wrap-around with wall-clock */
2012 snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_TIME,
2013 20,
2014 178000000);
2015
Takashi Iwai52409aa2012-01-23 17:10:24 +01002016 if (chip->align_buffer_size)
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05002017 /* constrain buffer sizes to be multiple of 128
2018 bytes. This is more efficient in terms of memory
2019 access but isn't required by the HDA spec and
2020 prevents users from specifying exact period/buffer
2021 sizes. For example for 44.1kHz, a period size set
2022 to 20ms will be rounded to 19.59ms. */
2023 buff_step = 128;
2024 else
2025 /* Don't enforce steps on buffer sizes, still need to
2026 be multiple of 4 bytes (HDA spec). Tested on Intel
2027 HDA controllers, may not work on all devices where
2028 option needs to be disabled */
2029 buff_step = 4;
2030
Joachim Deguara5f1545b2007-03-16 15:01:36 +01002031 snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05002032 buff_step);
Joachim Deguara5f1545b2007-03-16 15:01:36 +01002033 snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05002034 buff_step);
Dylan Reidb4a91cf2012-06-15 19:36:23 -07002035 snd_hda_power_up_d3wait(apcm->codec);
Takashi Iwaid01ce992007-07-27 16:52:19 +02002036 err = hinfo->ops.open(hinfo, apcm->codec, substream);
2037 if (err < 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002038 azx_release_device(azx_dev);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002039 snd_hda_power_down(apcm->codec);
Ingo Molnar62932df2006-01-16 16:34:20 +01002040 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002041 return err;
2042 }
Takashi Iwai70d321e2009-07-03 23:06:45 +02002043 snd_pcm_limit_hw_rates(runtime);
Takashi Iwaiaba66532009-07-05 11:44:46 +02002044 /* sanity check */
2045 if (snd_BUG_ON(!runtime->hw.channels_min) ||
2046 snd_BUG_ON(!runtime->hw.channels_max) ||
2047 snd_BUG_ON(!runtime->hw.formats) ||
2048 snd_BUG_ON(!runtime->hw.rates)) {
2049 azx_release_device(azx_dev);
2050 hinfo->ops.close(hinfo, apcm->codec, substream);
2051 snd_hda_power_down(apcm->codec);
2052 mutex_unlock(&chip->open_mutex);
2053 return -EINVAL;
2054 }
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05002055
2056 /* disable WALLCLOCK timestamps for capture streams
2057 until we figure out how to handle digital inputs */
2058 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
2059 runtime->hw.info &= ~SNDRV_PCM_INFO_HAS_WALL_CLOCK;
2060
Linus Torvalds1da177e2005-04-16 15:20:36 -07002061 spin_lock_irqsave(&chip->reg_lock, flags);
2062 azx_dev->substream = substream;
2063 azx_dev->running = 0;
2064 spin_unlock_irqrestore(&chip->reg_lock, flags);
2065
2066 runtime->private_data = azx_dev;
Takashi Iwai850f0e52008-03-18 17:11:05 +01002067 snd_pcm_set_sync(substream);
Ingo Molnar62932df2006-01-16 16:34:20 +01002068 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002069 return 0;
2070}
2071
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002072static int azx_pcm_close(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002073{
2074 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2075 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002076 struct azx *chip = apcm->chip;
2077 struct azx_dev *azx_dev = get_azx_dev(substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002078 unsigned long flags;
2079
Ingo Molnar62932df2006-01-16 16:34:20 +01002080 mutex_lock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002081 spin_lock_irqsave(&chip->reg_lock, flags);
2082 azx_dev->substream = NULL;
2083 azx_dev->running = 0;
2084 spin_unlock_irqrestore(&chip->reg_lock, flags);
2085 azx_release_device(azx_dev);
2086 hinfo->ops.close(hinfo, apcm->codec, substream);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002087 snd_hda_power_down(apcm->codec);
Ingo Molnar62932df2006-01-16 16:34:20 +01002088 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002089 return 0;
2090}
2091
Takashi Iwaid01ce992007-07-27 16:52:19 +02002092static int azx_pcm_hw_params(struct snd_pcm_substream *substream,
2093 struct snd_pcm_hw_params *hw_params)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002094{
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002095 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2096 struct azx *chip = apcm->chip;
Takashi Iwai97b71c92009-03-18 15:09:13 +01002097 struct azx_dev *azx_dev = get_azx_dev(substream);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002098 int ret;
Takashi Iwai97b71c92009-03-18 15:09:13 +01002099
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002100 dsp_lock(azx_dev);
2101 if (dsp_is_locked(azx_dev)) {
2102 ret = -EBUSY;
2103 goto unlock;
2104 }
2105
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +01002106 mark_runtime_wc(chip, azx_dev, substream, false);
Takashi Iwai97b71c92009-03-18 15:09:13 +01002107 azx_dev->bufsize = 0;
2108 azx_dev->period_bytes = 0;
2109 azx_dev->format_val = 0;
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002110 ret = snd_pcm_lib_malloc_pages(substream,
Takashi Iwaid01ce992007-07-27 16:52:19 +02002111 params_buffer_bytes(hw_params));
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002112 if (ret < 0)
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002113 goto unlock;
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +01002114 mark_runtime_wc(chip, azx_dev, substream, true);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002115 unlock:
2116 dsp_unlock(azx_dev);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002117 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002118}
2119
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002120static int azx_pcm_hw_free(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002121{
2122 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002123 struct azx_dev *azx_dev = get_azx_dev(substream);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002124 struct azx *chip = apcm->chip;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002125 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
2126
2127 /* reset BDL address */
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002128 dsp_lock(azx_dev);
2129 if (!dsp_is_locked(azx_dev)) {
2130 azx_sd_writel(azx_dev, SD_BDLPL, 0);
2131 azx_sd_writel(azx_dev, SD_BDLPU, 0);
2132 azx_sd_writel(azx_dev, SD_CTL, 0);
2133 azx_dev->bufsize = 0;
2134 azx_dev->period_bytes = 0;
2135 azx_dev->format_val = 0;
2136 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002137
Takashi Iwaieb541332010-08-06 13:48:11 +02002138 snd_hda_codec_cleanup(apcm->codec, hinfo, substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002139
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +01002140 mark_runtime_wc(chip, azx_dev, substream, false);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002141 azx_dev->prepared = 0;
2142 dsp_unlock(azx_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002143 return snd_pcm_lib_free_pages(substream);
2144}
2145
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002146static int azx_pcm_prepare(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002147{
2148 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002149 struct azx *chip = apcm->chip;
2150 struct azx_dev *azx_dev = get_azx_dev(substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002151 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002152 struct snd_pcm_runtime *runtime = substream->runtime;
Takashi Iwai62b7e5e2010-10-22 17:15:47 +02002153 unsigned int bufsize, period_bytes, format_val, stream_tag;
Takashi Iwai97b71c92009-03-18 15:09:13 +01002154 int err;
Stephen Warren7c9359762011-06-01 11:14:17 -06002155 struct hda_spdif_out *spdif =
2156 snd_hda_spdif_out_of_nid(apcm->codec, hinfo->nid);
2157 unsigned short ctls = spdif ? spdif->ctls : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002158
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002159 dsp_lock(azx_dev);
2160 if (dsp_is_locked(azx_dev)) {
2161 err = -EBUSY;
2162 goto unlock;
2163 }
2164
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002165 azx_stream_reset(chip, azx_dev);
Takashi Iwai97b71c92009-03-18 15:09:13 +01002166 format_val = snd_hda_calc_stream_format(runtime->rate,
2167 runtime->channels,
2168 runtime->format,
Anssi Hannula32c168c2010-08-03 13:28:57 +03002169 hinfo->maxbps,
Stephen Warren7c9359762011-06-01 11:14:17 -06002170 ctls);
Takashi Iwai97b71c92009-03-18 15:09:13 +01002171 if (!format_val) {
Takashi Iwaid01ce992007-07-27 16:52:19 +02002172 snd_printk(KERN_ERR SFX
Daniel J Blueman445a51b2012-12-05 23:04:21 +08002173 "%s: invalid format_val, rate=%d, ch=%d, format=%d\n",
2174 pci_name(chip->pci), runtime->rate, runtime->channels, runtime->format);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002175 err = -EINVAL;
2176 goto unlock;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002177 }
2178
Takashi Iwai97b71c92009-03-18 15:09:13 +01002179 bufsize = snd_pcm_lib_buffer_bytes(substream);
2180 period_bytes = snd_pcm_lib_period_bytes(substream);
2181
Daniel J Blueman445a51b2012-12-05 23:04:21 +08002182 snd_printdd(SFX "%s: azx_pcm_prepare: bufsize=0x%x, format=0x%x\n",
2183 pci_name(chip->pci), bufsize, format_val);
Takashi Iwai97b71c92009-03-18 15:09:13 +01002184
2185 if (bufsize != azx_dev->bufsize ||
2186 period_bytes != azx_dev->period_bytes ||
Takashi Iwai915bf292012-09-11 15:19:10 +02002187 format_val != azx_dev->format_val ||
2188 runtime->no_period_wakeup != azx_dev->no_period_wakeup) {
Takashi Iwai97b71c92009-03-18 15:09:13 +01002189 azx_dev->bufsize = bufsize;
2190 azx_dev->period_bytes = period_bytes;
2191 azx_dev->format_val = format_val;
Takashi Iwai915bf292012-09-11 15:19:10 +02002192 azx_dev->no_period_wakeup = runtime->no_period_wakeup;
Takashi Iwai97b71c92009-03-18 15:09:13 +01002193 err = azx_setup_periods(chip, substream, azx_dev);
2194 if (err < 0)
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002195 goto unlock;
Takashi Iwai97b71c92009-03-18 15:09:13 +01002196 }
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) {
2427 printk(KERN_WARNING
2428 "hda-intel: Invalid position buffer, "
2429 "using LPIB read method instead.\n");
2430 chip->position_fix[stream] = POS_FIX_LPIB;
2431 pos = azx_sd_readl(azx_dev, SD_LPIB);
2432 } else
2433 chip->position_fix[stream] = POS_FIX_POSBUF;
2434 }
2435 break;
Takashi Iwaic74db862005-05-12 14:26:27 +02002436 }
David Henningsson4cb36312010-09-30 10:12:50 +02002437
Linus Torvalds1da177e2005-04-16 15:20:36 -07002438 if (pos >= azx_dev->bufsize)
2439 pos = 0;
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002440
2441 /* calculate runtime delay from LPIB */
Takashi Iwai21229612013-04-05 07:27:45 +02002442 if (substream->runtime &&
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002443 chip->position_fix[stream] == POS_FIX_POSBUF &&
2444 (chip->driver_caps & AZX_DCAPS_COUNT_LPIB_DELAY)) {
2445 unsigned int lpib_pos = azx_sd_readl(azx_dev, SD_LPIB);
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002446 if (stream == SNDRV_PCM_STREAM_PLAYBACK)
2447 delay = pos - lpib_pos;
2448 else
2449 delay = lpib_pos - pos;
2450 if (delay < 0)
2451 delay += azx_dev->bufsize;
2452 if (delay >= azx_dev->period_bytes) {
Takashi Iwai1f046612012-10-16 16:52:26 +02002453 snd_printk(KERN_WARNING SFX
Daniel J Blueman445a51b2012-12-05 23:04:21 +08002454 "%s: Unstable LPIB (%d >= %d); "
Takashi Iwai1f046612012-10-16 16:52:26 +02002455 "disabling LPIB delay counting\n",
Daniel J Blueman445a51b2012-12-05 23:04:21 +08002456 pci_name(chip->pci), delay, azx_dev->period_bytes);
Takashi Iwai1f046612012-10-16 16:52:26 +02002457 delay = 0;
2458 chip->driver_caps &= ~AZX_DCAPS_COUNT_LPIB_DELAY;
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002459 }
Takashi Iwai21229612013-04-05 07:27:45 +02002460 delay = bytes_to_frames(substream->runtime, delay);
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002461 }
Takashi Iwai21229612013-04-05 07:27:45 +02002462
2463 if (substream->runtime) {
2464 if (hinfo->ops.get_delay)
2465 delay += hinfo->ops.get_delay(hinfo, apcm->codec,
2466 substream);
2467 substream->runtime->delay = delay;
2468 }
2469
Takashi Iwai1a8506d2012-10-16 15:10:08 +02002470 trace_azx_get_position(chip, azx_dev, pos, delay);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002471 return pos;
2472}
2473
2474static snd_pcm_uframes_t azx_pcm_pointer(struct snd_pcm_substream *substream)
2475{
2476 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2477 struct azx *chip = apcm->chip;
2478 struct azx_dev *azx_dev = get_azx_dev(substream);
2479 return bytes_to_frames(substream->runtime,
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002480 azx_get_position(chip, azx_dev, false));
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002481}
2482
2483/*
2484 * Check whether the current DMA position is acceptable for updating
2485 * periods. Returns non-zero if it's OK.
2486 *
2487 * Many HD-audio controllers appear pretty inaccurate about
2488 * the update-IRQ timing. The IRQ is issued before actually the
2489 * data is processed. So, we need to process it afterwords in a
2490 * workqueue.
2491 */
2492static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev)
2493{
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002494 u32 wallclk;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002495 unsigned int pos;
2496
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002497 wallclk = azx_readl(chip, WALLCLK) - azx_dev->start_wallclk;
2498 if (wallclk < (azx_dev->period_wallclk * 2) / 3)
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002499 return -1; /* bogus (too early) interrupt */
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002500
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002501 pos = azx_get_position(chip, azx_dev, true);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002502
Takashi Iwaid6d8bf52010-02-12 18:17:06 +01002503 if (WARN_ONCE(!azx_dev->period_bytes,
2504 "hda-intel: zero azx_dev->period_bytes"))
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002505 return -1; /* this shouldn't happen! */
Jaroslav Kyselaedb39932010-06-02 13:29:17 +02002506 if (wallclk < (azx_dev->period_wallclk * 5) / 4 &&
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002507 pos % azx_dev->period_bytes > azx_dev->period_bytes / 2)
2508 /* NG - it's below the first next period boundary */
2509 return bdl_pos_adj[chip->dev_index] ? 0 : -1;
Jaroslav Kyselaedb39932010-06-02 13:29:17 +02002510 azx_dev->start_wallclk += wallclk;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002511 return 1; /* OK, it's fine */
2512}
2513
2514/*
2515 * The work for pending PCM period updates.
2516 */
2517static void azx_irq_pending_work(struct work_struct *work)
2518{
2519 struct azx *chip = container_of(work, struct azx, irq_pending_work);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002520 int i, pending, ok;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002521
Takashi Iwaia6a950a2008-06-10 17:53:35 +02002522 if (!chip->irq_pending_warned) {
2523 printk(KERN_WARNING
2524 "hda-intel: IRQ timing workaround is activated "
2525 "for card #%d. Suggest a bigger bdl_pos_adj.\n",
2526 chip->card->number);
2527 chip->irq_pending_warned = 1;
2528 }
2529
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002530 for (;;) {
2531 pending = 0;
2532 spin_lock_irq(&chip->reg_lock);
2533 for (i = 0; i < chip->num_streams; i++) {
2534 struct azx_dev *azx_dev = &chip->azx_dev[i];
2535 if (!azx_dev->irq_pending ||
2536 !azx_dev->substream ||
2537 !azx_dev->running)
2538 continue;
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002539 ok = azx_position_ok(chip, azx_dev);
2540 if (ok > 0) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002541 azx_dev->irq_pending = 0;
2542 spin_unlock(&chip->reg_lock);
2543 snd_pcm_period_elapsed(azx_dev->substream);
2544 spin_lock(&chip->reg_lock);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002545 } else if (ok < 0) {
2546 pending = 0; /* too early */
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002547 } else
2548 pending++;
2549 }
2550 spin_unlock_irq(&chip->reg_lock);
2551 if (!pending)
2552 return;
Takashi Iwai08af4952010-08-03 14:39:04 +02002553 msleep(1);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002554 }
2555}
2556
2557/* clear irq_pending flags and assure no on-going workq */
2558static void azx_clear_irq_pending(struct azx *chip)
2559{
2560 int i;
2561
2562 spin_lock_irq(&chip->reg_lock);
2563 for (i = 0; i < chip->num_streams; i++)
2564 chip->azx_dev[i].irq_pending = 0;
2565 spin_unlock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002566}
2567
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002568#ifdef CONFIG_X86
2569static int azx_pcm_mmap(struct snd_pcm_substream *substream,
2570 struct vm_area_struct *area)
2571{
2572 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2573 struct azx *chip = apcm->chip;
2574 if (!azx_snoop(chip))
2575 area->vm_page_prot = pgprot_writecombine(area->vm_page_prot);
2576 return snd_pcm_lib_default_mmap(substream, area);
2577}
2578#else
2579#define azx_pcm_mmap NULL
2580#endif
2581
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002582static struct snd_pcm_ops azx_pcm_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002583 .open = azx_pcm_open,
2584 .close = azx_pcm_close,
2585 .ioctl = snd_pcm_lib_ioctl,
2586 .hw_params = azx_pcm_hw_params,
2587 .hw_free = azx_pcm_hw_free,
2588 .prepare = azx_pcm_prepare,
2589 .trigger = azx_pcm_trigger,
2590 .pointer = azx_pcm_pointer,
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05002591 .wall_clock = azx_get_wallclock_tstamp,
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002592 .mmap = azx_pcm_mmap,
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002593 .page = snd_pcm_sgbuf_ops_page,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002594};
2595
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002596static void azx_pcm_free(struct snd_pcm *pcm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002597{
Takashi Iwai176d5332008-07-30 15:01:44 +02002598 struct azx_pcm *apcm = pcm->private_data;
2599 if (apcm) {
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002600 list_del(&apcm->list);
Takashi Iwai176d5332008-07-30 15:01:44 +02002601 kfree(apcm);
2602 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002603}
2604
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002605#define MAX_PREALLOC_SIZE (32 * 1024 * 1024)
2606
Takashi Iwai176d5332008-07-30 15:01:44 +02002607static int
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002608azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec,
2609 struct hda_pcm *cpcm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002610{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002611 struct azx *chip = bus->private_data;
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002612 struct snd_pcm *pcm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002613 struct azx_pcm *apcm;
Takashi Iwai176d5332008-07-30 15:01:44 +02002614 int pcm_dev = cpcm->device;
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002615 unsigned int size;
Takashi Iwai176d5332008-07-30 15:01:44 +02002616 int s, err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002617
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002618 list_for_each_entry(apcm, &chip->pcm_list, list) {
2619 if (apcm->pcm->device == pcm_dev) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08002620 snd_printk(KERN_ERR SFX "%s: PCM %d already exists\n",
2621 pci_name(chip->pci), pcm_dev);
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002622 return -EBUSY;
2623 }
Takashi Iwai176d5332008-07-30 15:01:44 +02002624 }
2625 err = snd_pcm_new(chip->card, cpcm->name, pcm_dev,
2626 cpcm->stream[SNDRV_PCM_STREAM_PLAYBACK].substreams,
2627 cpcm->stream[SNDRV_PCM_STREAM_CAPTURE].substreams,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002628 &pcm);
2629 if (err < 0)
2630 return err;
Takashi Iwai18cb7102009-04-16 10:22:24 +02002631 strlcpy(pcm->name, cpcm->name, sizeof(pcm->name));
Takashi Iwai176d5332008-07-30 15:01:44 +02002632 apcm = kzalloc(sizeof(*apcm), GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002633 if (apcm == NULL)
2634 return -ENOMEM;
2635 apcm->chip = chip;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002636 apcm->pcm = pcm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002637 apcm->codec = codec;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002638 pcm->private_data = apcm;
2639 pcm->private_free = azx_pcm_free;
Takashi Iwai176d5332008-07-30 15:01:44 +02002640 if (cpcm->pcm_type == HDA_PCM_TYPE_MODEM)
2641 pcm->dev_class = SNDRV_PCM_CLASS_MODEM;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002642 list_add_tail(&apcm->list, &chip->pcm_list);
Takashi Iwai176d5332008-07-30 15:01:44 +02002643 cpcm->pcm = pcm;
2644 for (s = 0; s < 2; s++) {
2645 apcm->hinfo[s] = &cpcm->stream[s];
2646 if (cpcm->stream[s].substreams)
2647 snd_pcm_set_ops(pcm, s, &azx_pcm_ops);
2648 }
2649 /* buffer pre-allocation */
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002650 size = CONFIG_SND_HDA_PREALLOC_SIZE * 1024;
2651 if (size > MAX_PREALLOC_SIZE)
2652 size = MAX_PREALLOC_SIZE;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002653 snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV_SG,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002654 snd_dma_pci_data(chip->pci),
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002655 size, MAX_PREALLOC_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002656 return 0;
2657}
2658
2659/*
2660 * mixer creation - all stuff is implemented in hda module
2661 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05002662static int azx_mixer_create(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002663{
2664 return snd_hda_build_controls(chip->bus);
2665}
2666
2667
2668/*
2669 * initialize SD streams
2670 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05002671static int azx_init_stream(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002672{
2673 int i;
2674
2675 /* initialize each stream (aka device)
Takashi Iwaid01ce992007-07-27 16:52:19 +02002676 * assign the starting bdl address to each stream (device)
2677 * and initialize
Linus Torvalds1da177e2005-04-16 15:20:36 -07002678 */
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002679 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002680 struct azx_dev *azx_dev = &chip->azx_dev[i];
Takashi Iwai929861c2006-08-31 16:55:40 +02002681 azx_dev->posbuf = (u32 __iomem *)(chip->posbuf.area + i * 8);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002682 /* offset: SDI0=0x80, SDI1=0xa0, ... SDO3=0x160 */
2683 azx_dev->sd_addr = chip->remap_addr + (0x20 * i + 0x80);
2684 /* int mask: SDI0=0x01, SDI1=0x02, ... SDO3=0x80 */
2685 azx_dev->sd_int_sta_mask = 1 << i;
2686 /* stream tag: must be non-zero and unique */
2687 azx_dev->index = i;
2688 azx_dev->stream_tag = i + 1;
2689 }
2690
2691 return 0;
2692}
2693
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002694static int azx_acquire_irq(struct azx *chip, int do_disconnect)
2695{
Takashi Iwai437a5a42006-11-21 12:14:23 +01002696 if (request_irq(chip->pci->irq, azx_interrupt,
2697 chip->msi ? 0 : IRQF_SHARED,
Takashi Iwai934c2b62011-06-10 16:36:37 +02002698 KBUILD_MODNAME, chip)) {
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002699 printk(KERN_ERR "hda-intel: unable to grab IRQ %d, "
2700 "disabling device\n", chip->pci->irq);
2701 if (do_disconnect)
2702 snd_card_disconnect(chip->card);
2703 return -1;
2704 }
2705 chip->irq = chip->pci->irq;
Takashi Iwai69e13412006-11-21 12:10:55 +01002706 pci_intx(chip->pci, !chip->msi);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002707 return 0;
2708}
2709
Linus Torvalds1da177e2005-04-16 15:20:36 -07002710
Takashi Iwaicb53c622007-08-10 17:21:45 +02002711static void azx_stop_chip(struct azx *chip)
2712{
Takashi Iwai95e99fd2007-08-13 15:29:04 +02002713 if (!chip->initialized)
Takashi Iwaicb53c622007-08-10 17:21:45 +02002714 return;
2715
2716 /* disable interrupts */
2717 azx_int_disable(chip);
2718 azx_int_clear(chip);
2719
2720 /* disable CORB/RIRB */
2721 azx_free_cmd_io(chip);
2722
2723 /* disable position buffer */
2724 azx_writel(chip, DPLBASE, 0);
2725 azx_writel(chip, DPUBASE, 0);
2726
2727 chip->initialized = 0;
2728}
2729
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002730#ifdef CONFIG_SND_HDA_DSP_LOADER
2731/*
2732 * DSP loading code (e.g. for CA0132)
2733 */
2734
2735/* use the first stream for loading DSP */
2736static struct azx_dev *
2737azx_get_dsp_loader_dev(struct azx *chip)
2738{
2739 return &chip->azx_dev[chip->playback_index_offset];
2740}
2741
2742static int azx_load_dsp_prepare(struct hda_bus *bus, unsigned int format,
2743 unsigned int byte_size,
2744 struct snd_dma_buffer *bufp)
2745{
2746 u32 *bdl;
2747 struct azx *chip = bus->private_data;
2748 struct azx_dev *azx_dev;
2749 int err;
2750
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002751 azx_dev = azx_get_dsp_loader_dev(chip);
2752
2753 dsp_lock(azx_dev);
2754 spin_lock_irq(&chip->reg_lock);
2755 if (azx_dev->running || azx_dev->locked) {
2756 spin_unlock_irq(&chip->reg_lock);
2757 err = -EBUSY;
2758 goto unlock;
2759 }
2760 azx_dev->prepared = 0;
2761 chip->saved_azx_dev = *azx_dev;
2762 azx_dev->locked = 1;
2763 spin_unlock_irq(&chip->reg_lock);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002764
2765 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV_SG,
2766 snd_dma_pci_data(chip->pci),
2767 byte_size, bufp);
2768 if (err < 0)
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002769 goto err_alloc;
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002770
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002771 mark_pages_wc(chip, bufp, true);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002772 azx_dev->bufsize = byte_size;
2773 azx_dev->period_bytes = byte_size;
2774 azx_dev->format_val = format;
2775
2776 azx_stream_reset(chip, azx_dev);
2777
2778 /* reset BDL address */
2779 azx_sd_writel(azx_dev, SD_BDLPL, 0);
2780 azx_sd_writel(azx_dev, SD_BDLPU, 0);
2781
2782 azx_dev->frags = 0;
2783 bdl = (u32 *)azx_dev->bdl.area;
2784 err = setup_bdle(chip, bufp, azx_dev, &bdl, 0, byte_size, 0);
2785 if (err < 0)
2786 goto error;
2787
2788 azx_setup_controller(chip, azx_dev);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002789 dsp_unlock(azx_dev);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002790 return azx_dev->stream_tag;
2791
2792 error:
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002793 mark_pages_wc(chip, bufp, false);
2794 snd_dma_free_pages(bufp);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002795 err_alloc:
2796 spin_lock_irq(&chip->reg_lock);
2797 if (azx_dev->opened)
2798 *azx_dev = chip->saved_azx_dev;
2799 azx_dev->locked = 0;
2800 spin_unlock_irq(&chip->reg_lock);
2801 unlock:
2802 dsp_unlock(azx_dev);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002803 return err;
2804}
2805
2806static void azx_load_dsp_trigger(struct hda_bus *bus, bool start)
2807{
2808 struct azx *chip = bus->private_data;
2809 struct azx_dev *azx_dev = azx_get_dsp_loader_dev(chip);
2810
2811 if (start)
2812 azx_stream_start(chip, azx_dev);
2813 else
2814 azx_stream_stop(chip, azx_dev);
2815 azx_dev->running = start;
2816}
2817
2818static void azx_load_dsp_cleanup(struct hda_bus *bus,
2819 struct snd_dma_buffer *dmab)
2820{
2821 struct azx *chip = bus->private_data;
2822 struct azx_dev *azx_dev = azx_get_dsp_loader_dev(chip);
2823
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002824 if (!dmab->area || !azx_dev->locked)
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002825 return;
2826
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002827 dsp_lock(azx_dev);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002828 /* reset BDL address */
2829 azx_sd_writel(azx_dev, SD_BDLPL, 0);
2830 azx_sd_writel(azx_dev, SD_BDLPU, 0);
2831 azx_sd_writel(azx_dev, SD_CTL, 0);
2832 azx_dev->bufsize = 0;
2833 azx_dev->period_bytes = 0;
2834 azx_dev->format_val = 0;
2835
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002836 mark_pages_wc(chip, dmab, false);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002837 snd_dma_free_pages(dmab);
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002838 dmab->area = NULL;
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002839
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002840 spin_lock_irq(&chip->reg_lock);
2841 if (azx_dev->opened)
2842 *azx_dev = chip->saved_azx_dev;
2843 azx_dev->locked = 0;
2844 spin_unlock_irq(&chip->reg_lock);
2845 dsp_unlock(azx_dev);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002846}
2847#endif /* CONFIG_SND_HDA_DSP_LOADER */
2848
Takashi Iwai83012a72012-08-24 18:38:08 +02002849#ifdef CONFIG_PM
Takashi Iwaicb53c622007-08-10 17:21:45 +02002850/* power-up/down the controller */
Takashi Iwai68467f52012-08-28 09:14:29 -07002851static void azx_power_notify(struct hda_bus *bus, bool power_up)
Takashi Iwaicb53c622007-08-10 17:21:45 +02002852{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002853 struct azx *chip = bus->private_data;
Takashi Iwaicb53c622007-08-10 17:21:45 +02002854
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01002855 if (!(chip->driver_caps & AZX_DCAPS_PM_RUNTIME))
2856 return;
2857
Takashi Iwai68467f52012-08-28 09:14:29 -07002858 if (power_up)
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002859 pm_runtime_get_sync(&chip->pci->dev);
2860 else
2861 pm_runtime_put_sync(&chip->pci->dev);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002862}
Takashi Iwai65fcd412012-08-14 17:13:32 +02002863
2864static DEFINE_MUTEX(card_list_lock);
2865static LIST_HEAD(card_list);
2866
2867static void azx_add_card_list(struct azx *chip)
2868{
2869 mutex_lock(&card_list_lock);
2870 list_add(&chip->list, &card_list);
2871 mutex_unlock(&card_list_lock);
2872}
2873
2874static void azx_del_card_list(struct azx *chip)
2875{
2876 mutex_lock(&card_list_lock);
2877 list_del_init(&chip->list);
2878 mutex_unlock(&card_list_lock);
2879}
2880
2881/* trigger power-save check at writing parameter */
2882static int param_set_xint(const char *val, const struct kernel_param *kp)
2883{
2884 struct azx *chip;
2885 struct hda_codec *c;
2886 int prev = power_save;
2887 int ret = param_set_int(val, kp);
2888
2889 if (ret || prev == power_save)
2890 return ret;
2891
2892 mutex_lock(&card_list_lock);
2893 list_for_each_entry(chip, &card_list, list) {
2894 if (!chip->bus || chip->disabled)
2895 continue;
2896 list_for_each_entry(c, &chip->bus->codec_list, list)
2897 snd_hda_power_sync(c);
2898 }
2899 mutex_unlock(&card_list_lock);
2900 return 0;
2901}
2902#else
2903#define azx_add_card_list(chip) /* NOP */
2904#define azx_del_card_list(chip) /* NOP */
Takashi Iwai83012a72012-08-24 18:38:08 +02002905#endif /* CONFIG_PM */
Takashi Iwai5c0b9be2008-12-11 11:47:17 +01002906
Takashi Iwai7ccbde52012-08-14 18:10:09 +02002907#if defined(CONFIG_PM_SLEEP) || defined(SUPPORT_VGA_SWITCHEROO)
Takashi Iwai5c0b9be2008-12-11 11:47:17 +01002908/*
2909 * power management
2910 */
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002911static int azx_suspend(struct device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002912{
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002913 struct pci_dev *pci = to_pci_dev(dev);
2914 struct snd_card *card = dev_get_drvdata(dev);
Takashi Iwai421a1252005-11-17 16:11:09 +01002915 struct azx *chip = card->private_data;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002916 struct azx_pcm *p;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002917
Takashi Iwaic5c21522012-12-04 17:01:25 +01002918 if (chip->disabled)
2919 return 0;
2920
Takashi Iwai421a1252005-11-17 16:11:09 +01002921 snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002922 azx_clear_irq_pending(chip);
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002923 list_for_each_entry(p, &chip->pcm_list, list)
2924 snd_pcm_suspend_all(p->pcm);
Takashi Iwai0b7a2e92007-08-14 15:18:26 +02002925 if (chip->initialized)
Takashi Iwai8dd78332009-06-02 01:16:07 +02002926 snd_hda_suspend(chip->bus);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002927 azx_stop_chip(chip);
Mengdong Lin7295b262013-06-25 05:58:49 -04002928 azx_enter_link_reset(chip);
Takashi Iwai30b35392006-10-11 18:52:53 +02002929 if (chip->irq >= 0) {
Takashi Iwai43001c92006-09-08 12:30:03 +02002930 free_irq(chip->irq, chip);
Takashi Iwai30b35392006-10-11 18:52:53 +02002931 chip->irq = -1;
2932 }
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002933 if (chip->msi)
Takashi Iwai43001c92006-09-08 12:30:03 +02002934 pci_disable_msi(chip->pci);
Takashi Iwai421a1252005-11-17 16:11:09 +01002935 pci_disable_device(pci);
2936 pci_save_state(pci);
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002937 pci_set_power_state(pci, PCI_D3hot);
Wang Xingchao99a20082013-05-30 22:07:10 +08002938 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)
2939 hda_display_power(false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002940 return 0;
2941}
2942
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002943static int azx_resume(struct device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002944{
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002945 struct pci_dev *pci = to_pci_dev(dev);
2946 struct snd_card *card = dev_get_drvdata(dev);
Takashi Iwai421a1252005-11-17 16:11:09 +01002947 struct azx *chip = card->private_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002948
Takashi Iwaic5c21522012-12-04 17:01:25 +01002949 if (chip->disabled)
2950 return 0;
2951
Wang Xingchao99a20082013-05-30 22:07:10 +08002952 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)
2953 hda_display_power(true);
Takashi Iwaid14a7e02009-02-16 10:13:03 +01002954 pci_set_power_state(pci, PCI_D0);
2955 pci_restore_state(pci);
Takashi Iwai30b35392006-10-11 18:52:53 +02002956 if (pci_enable_device(pci) < 0) {
2957 printk(KERN_ERR "hda-intel: pci_enable_device failed, "
2958 "disabling device\n");
2959 snd_card_disconnect(card);
2960 return -EIO;
2961 }
2962 pci_set_master(pci);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002963 if (chip->msi)
2964 if (pci_enable_msi(pci) < 0)
2965 chip->msi = 0;
2966 if (azx_acquire_irq(chip, 1) < 0)
Takashi Iwai30b35392006-10-11 18:52:53 +02002967 return -EIO;
Takashi Iwaicb53c622007-08-10 17:21:45 +02002968 azx_init_pci(chip);
Maxim Levitskyd804ad92007-09-03 15:28:04 +02002969
Takashi Iwai7f308302012-05-08 16:52:23 +02002970 azx_init_chip(chip, 1);
Maxim Levitskyd804ad92007-09-03 15:28:04 +02002971
Linus Torvalds1da177e2005-04-16 15:20:36 -07002972 snd_hda_resume(chip->bus);
Takashi Iwai421a1252005-11-17 16:11:09 +01002973 snd_power_change_state(card, SNDRV_CTL_POWER_D0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002974 return 0;
2975}
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002976#endif /* CONFIG_PM_SLEEP || SUPPORT_VGA_SWITCHEROO */
2977
2978#ifdef CONFIG_PM_RUNTIME
2979static int azx_runtime_suspend(struct device *dev)
2980{
2981 struct snd_card *card = dev_get_drvdata(dev);
2982 struct azx *chip = card->private_data;
2983
Dave Airlie246efa42013-07-29 15:19:29 +10002984 if (chip->disabled)
2985 return 0;
2986
2987 if (!(chip->driver_caps & AZX_DCAPS_PM_RUNTIME))
2988 return 0;
2989
Wang Xingchao7d4f6062013-07-25 23:34:46 -04002990 /* enable controller wake up event */
2991 azx_writew(chip, WAKEEN, azx_readw(chip, WAKEEN) |
2992 STATESTS_INT_MASK);
2993
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002994 azx_stop_chip(chip);
Takashi Iwai873ce8a2013-11-26 11:58:40 +01002995 azx_enter_link_reset(chip);
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002996 azx_clear_irq_pending(chip);
Wang Xingchao99a20082013-05-30 22:07:10 +08002997 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)
2998 hda_display_power(false);
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002999 return 0;
3000}
3001
3002static int azx_runtime_resume(struct device *dev)
3003{
3004 struct snd_card *card = dev_get_drvdata(dev);
3005 struct azx *chip = card->private_data;
Wang Xingchao7d4f6062013-07-25 23:34:46 -04003006 struct hda_bus *bus;
3007 struct hda_codec *codec;
3008 int status;
Mengdong Linb8dfc4622012-08-23 17:32:30 +08003009
Dave Airlie246efa42013-07-29 15:19:29 +10003010 if (chip->disabled)
3011 return 0;
3012
3013 if (!(chip->driver_caps & AZX_DCAPS_PM_RUNTIME))
3014 return 0;
3015
Wang Xingchao99a20082013-05-30 22:07:10 +08003016 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)
3017 hda_display_power(true);
Wang Xingchao7d4f6062013-07-25 23:34:46 -04003018
3019 /* Read STATESTS before controller reset */
3020 status = azx_readw(chip, STATESTS);
3021
Mengdong Linb8dfc4622012-08-23 17:32:30 +08003022 azx_init_pci(chip);
3023 azx_init_chip(chip, 1);
Wang Xingchao7d4f6062013-07-25 23:34:46 -04003024
3025 bus = chip->bus;
3026 if (status && bus) {
3027 list_for_each_entry(codec, &bus->codec_list, list)
3028 if (status & (1 << codec->addr))
3029 queue_delayed_work(codec->bus->workq,
3030 &codec->jackpoll_work, codec->jackpoll_interval);
3031 }
3032
3033 /* disable controller Wake Up event*/
3034 azx_writew(chip, WAKEEN, azx_readw(chip, WAKEEN) &
3035 ~STATESTS_INT_MASK);
3036
Mengdong Linb8dfc4622012-08-23 17:32:30 +08003037 return 0;
3038}
Takashi Iwai6eb827d2012-12-12 11:50:12 +01003039
3040static int azx_runtime_idle(struct device *dev)
3041{
3042 struct snd_card *card = dev_get_drvdata(dev);
3043 struct azx *chip = card->private_data;
3044
Dave Airlie246efa42013-07-29 15:19:29 +10003045 if (chip->disabled)
3046 return 0;
3047
Takashi Iwai6eb827d2012-12-12 11:50:12 +01003048 if (!power_save_controller ||
3049 !(chip->driver_caps & AZX_DCAPS_PM_RUNTIME))
3050 return -EBUSY;
3051
3052 return 0;
3053}
3054
Mengdong Linb8dfc4622012-08-23 17:32:30 +08003055#endif /* CONFIG_PM_RUNTIME */
3056
3057#ifdef CONFIG_PM
3058static const struct dev_pm_ops azx_pm = {
3059 SET_SYSTEM_SLEEP_PM_OPS(azx_suspend, azx_resume)
Takashi Iwai6eb827d2012-12-12 11:50:12 +01003060 SET_RUNTIME_PM_OPS(azx_runtime_suspend, azx_runtime_resume, azx_runtime_idle)
Mengdong Linb8dfc4622012-08-23 17:32:30 +08003061};
3062
Takashi Iwai68cb2b52012-07-02 15:20:37 +02003063#define AZX_PM_OPS &azx_pm
3064#else
Takashi Iwai68cb2b52012-07-02 15:20:37 +02003065#define AZX_PM_OPS NULL
Mengdong Linb8dfc4622012-08-23 17:32:30 +08003066#endif /* CONFIG_PM */
Linus Torvalds1da177e2005-04-16 15:20:36 -07003067
3068
3069/*
Takashi Iwai0cbf0092008-10-29 16:18:25 +01003070 * reboot notifier for hang-up problem at power-down
3071 */
3072static int azx_halt(struct notifier_block *nb, unsigned long event, void *buf)
3073{
3074 struct azx *chip = container_of(nb, struct azx, reboot_notifier);
Takashi Iwaifb8d1a32009-11-10 16:02:29 +01003075 snd_hda_bus_reboot_notify(chip->bus);
Takashi Iwai0cbf0092008-10-29 16:18:25 +01003076 azx_stop_chip(chip);
3077 return NOTIFY_OK;
3078}
3079
3080static void azx_notifier_register(struct azx *chip)
3081{
3082 chip->reboot_notifier.notifier_call = azx_halt;
3083 register_reboot_notifier(&chip->reboot_notifier);
3084}
3085
3086static void azx_notifier_unregister(struct azx *chip)
3087{
3088 if (chip->reboot_notifier.notifier_call)
3089 unregister_reboot_notifier(&chip->reboot_notifier);
3090}
3091
Takashi Iwai48c8b0e2012-12-07 07:40:35 +01003092static int azx_probe_continue(struct azx *chip);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003093
Steven Newbury8393ec4a2012-06-08 13:06:29 +02003094#ifdef SUPPORT_VGA_SWITCHEROO
Bill Pembertone23e7a12012-12-06 12:35:10 -05003095static struct pci_dev *get_bound_vga(struct pci_dev *pci);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003096
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003097static void azx_vs_set_state(struct pci_dev *pci,
3098 enum vga_switcheroo_state state)
3099{
3100 struct snd_card *card = pci_get_drvdata(pci);
3101 struct azx *chip = card->private_data;
3102 bool disabled;
3103
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003104 wait_for_completion(&chip->probe_wait);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003105 if (chip->init_failed)
3106 return;
3107
3108 disabled = (state == VGA_SWITCHEROO_OFF);
3109 if (chip->disabled == disabled)
3110 return;
3111
3112 if (!chip->bus) {
3113 chip->disabled = disabled;
3114 if (!disabled) {
3115 snd_printk(KERN_INFO SFX
3116 "%s: Start delayed initialization\n",
3117 pci_name(chip->pci));
Takashi Iwai5c906802013-05-30 22:07:09 +08003118 if (azx_probe_continue(chip) < 0) {
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003119 snd_printk(KERN_ERR SFX
3120 "%s: initialization error\n",
3121 pci_name(chip->pci));
3122 chip->init_failed = true;
3123 }
3124 }
3125 } else {
3126 snd_printk(KERN_INFO SFX
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003127 "%s: %s via VGA-switcheroo\n", pci_name(chip->pci),
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))
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003138 snd_printk(KERN_WARNING SFX "%s: Cannot lock devices!\n",
3139 pci_name(chip->pci));
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) {
3169 snd_printk(KERN_INFO SFX
3170 "%s: Handle VGA-switcheroo audio client\n",
3171 pci_name(chip->pci));
3172 chip->use_vga_switcheroo = 1;
3173 pci_dev_put(p);
3174 }
3175}
3176
3177static const struct vga_switcheroo_client_ops azx_vs_ops = {
3178 .set_gpu_state = azx_vs_set_state,
3179 .can_switch = azx_vs_can_switch,
3180};
3181
Bill Pembertone23e7a12012-12-06 12:35:10 -05003182static int register_vga_switcheroo(struct azx *chip)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003183{
Takashi Iwai128960a2012-10-12 17:28:18 +02003184 int err;
3185
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003186 if (!chip->use_vga_switcheroo)
3187 return 0;
3188 /* FIXME: currently only handling DIS controller
3189 * is there any machine with two switchable HDMI audio controllers?
3190 */
Takashi Iwai128960a2012-10-12 17:28:18 +02003191 err = vga_switcheroo_register_audio_client(chip->pci, &azx_vs_ops,
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003192 VGA_SWITCHEROO_DIS,
3193 chip->bus != NULL);
Takashi Iwai128960a2012-10-12 17:28:18 +02003194 if (err < 0)
3195 return err;
3196 chip->vga_switcheroo_registered = 1;
Dave Airlie246efa42013-07-29 15:19:29 +10003197
3198 /* register as an optimus hdmi audio power domain */
3199 vga_switcheroo_init_domain_pm_optimus_hdmi_audio(&chip->pci->dev, &chip->hdmi_pm_domain);
Takashi Iwai128960a2012-10-12 17:28:18 +02003200 return 0;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003201}
3202#else
3203#define init_vga_switcheroo(chip) /* NOP */
3204#define register_vga_switcheroo(chip) 0
Steven Newbury8393ec4a2012-06-08 13:06:29 +02003205#define check_hdmi_disabled(pci) false
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003206#endif /* SUPPORT_VGA_SWITCHER */
3207
Takashi Iwai0cbf0092008-10-29 16:18:25 +01003208/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07003209 * destructor
3210 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01003211static int azx_free(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003212{
Wang Xingchaoc67e2222013-05-30 22:07:08 +08003213 struct pci_dev *pci = chip->pci;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003214 int i;
3215
Wang Xingchaoc67e2222013-05-30 22:07:08 +08003216 if ((chip->driver_caps & AZX_DCAPS_PM_RUNTIME)
3217 && chip->running)
3218 pm_runtime_get_noresume(&pci->dev);
3219
Takashi Iwai65fcd412012-08-14 17:13:32 +02003220 azx_del_card_list(chip);
3221
Takashi Iwai0cbf0092008-10-29 16:18:25 +01003222 azx_notifier_unregister(chip);
3223
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003224 chip->init_failed = 1; /* to be sure */
Daniel J Blueman44728e92012-12-18 23:59:33 +08003225 complete_all(&chip->probe_wait);
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003226
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003227 if (use_vga_switcheroo(chip)) {
3228 if (chip->disabled && chip->bus)
3229 snd_hda_unlock_devices(chip->bus);
Takashi Iwai128960a2012-10-12 17:28:18 +02003230 if (chip->vga_switcheroo_registered)
3231 vga_switcheroo_unregister_client(chip->pci);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003232 }
3233
Takashi Iwaice43fba2005-05-30 20:33:44 +02003234 if (chip->initialized) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02003235 azx_clear_irq_pending(chip);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003236 for (i = 0; i < chip->num_streams; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003237 azx_stream_stop(chip, &chip->azx_dev[i]);
Takashi Iwaicb53c622007-08-10 17:21:45 +02003238 azx_stop_chip(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003239 }
3240
Jeff Garzikf000fd82008-04-22 13:50:34 +02003241 if (chip->irq >= 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003242 free_irq(chip->irq, (void*)chip);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02003243 if (chip->msi)
Takashi Iwai30b35392006-10-11 18:52:53 +02003244 pci_disable_msi(chip->pci);
Takashi Iwaif079c252006-06-01 11:42:14 +02003245 if (chip->remap_addr)
3246 iounmap(chip->remap_addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003247
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003248 if (chip->azx_dev) {
3249 for (i = 0; i < chip->num_streams; i++)
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003250 if (chip->azx_dev[i].bdl.area) {
3251 mark_pages_wc(chip, &chip->azx_dev[i].bdl, false);
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003252 snd_dma_free_pages(&chip->azx_dev[i].bdl);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003253 }
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003254 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003255 if (chip->rb.area) {
3256 mark_pages_wc(chip, &chip->rb, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003257 snd_dma_free_pages(&chip->rb);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003258 }
3259 if (chip->posbuf.area) {
3260 mark_pages_wc(chip, &chip->posbuf, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003261 snd_dma_free_pages(&chip->posbuf);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003262 }
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003263 if (chip->region_requested)
3264 pci_release_regions(chip->pci);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003265 pci_disable_device(chip->pci);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003266 kfree(chip->azx_dev);
Takashi Iwai4918cda2012-08-09 12:33:28 +02003267#ifdef CONFIG_SND_HDA_PATCH_LOADER
3268 if (chip->fw)
3269 release_firmware(chip->fw);
3270#endif
Wang Xingchao99a20082013-05-30 22:07:10 +08003271 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL) {
3272 hda_display_power(false);
3273 hda_i915_exit();
3274 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003275 kfree(chip);
3276
3277 return 0;
3278}
3279
Takashi Iwaia98f90f2005-11-17 14:59:02 +01003280static int azx_dev_free(struct snd_device *device)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003281{
3282 return azx_free(device->device_data);
3283}
3284
Steven Newbury8393ec4a2012-06-08 13:06:29 +02003285#ifdef SUPPORT_VGA_SWITCHEROO
Linus Torvalds1da177e2005-04-16 15:20:36 -07003286/*
Takashi Iwai91219472012-04-26 12:13:25 +02003287 * Check of disabled HDMI controller by vga-switcheroo
3288 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003289static struct pci_dev *get_bound_vga(struct pci_dev *pci)
Takashi Iwai91219472012-04-26 12:13:25 +02003290{
3291 struct pci_dev *p;
3292
3293 /* check only discrete GPU */
3294 switch (pci->vendor) {
3295 case PCI_VENDOR_ID_ATI:
3296 case PCI_VENDOR_ID_AMD:
3297 case PCI_VENDOR_ID_NVIDIA:
3298 if (pci->devfn == 1) {
3299 p = pci_get_domain_bus_and_slot(pci_domain_nr(pci->bus),
3300 pci->bus->number, 0);
3301 if (p) {
3302 if ((p->class >> 8) == PCI_CLASS_DISPLAY_VGA)
3303 return p;
3304 pci_dev_put(p);
3305 }
3306 }
3307 break;
3308 }
3309 return NULL;
3310}
3311
Bill Pembertone23e7a12012-12-06 12:35:10 -05003312static bool check_hdmi_disabled(struct pci_dev *pci)
Takashi Iwai91219472012-04-26 12:13:25 +02003313{
3314 bool vga_inactive = false;
3315 struct pci_dev *p = get_bound_vga(pci);
3316
3317 if (p) {
Takashi Iwai12b78a72012-06-07 12:15:16 +02003318 if (vga_switcheroo_get_client_state(p) == VGA_SWITCHEROO_OFF)
Takashi Iwai91219472012-04-26 12:13:25 +02003319 vga_inactive = true;
3320 pci_dev_put(p);
3321 }
3322 return vga_inactive;
3323}
Steven Newbury8393ec4a2012-06-08 13:06:29 +02003324#endif /* SUPPORT_VGA_SWITCHEROO */
Takashi Iwai91219472012-04-26 12:13:25 +02003325
3326/*
Takashi Iwai3372a152007-02-01 15:46:50 +01003327 * white/black-listing for position_fix
3328 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003329static struct snd_pci_quirk position_fix_list[] = {
Takashi Iwaid2e1c972008-06-10 17:53:34 +02003330 SND_PCI_QUIRK(0x1028, 0x01cc, "Dell D820", POS_FIX_LPIB),
3331 SND_PCI_QUIRK(0x1028, 0x01de, "Dell Precision 390", POS_FIX_LPIB),
Takashi Iwai2f703e72009-12-01 14:17:37 +01003332 SND_PCI_QUIRK(0x103c, 0x306d, "HP dv3", POS_FIX_LPIB),
Takashi Iwaid2e1c972008-06-10 17:53:34 +02003333 SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB),
Daniel T Chendd37f8e2010-05-30 01:17:03 -04003334 SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS", POS_FIX_LPIB),
Daniel T Chen9f75c1b2010-05-30 13:08:41 -04003335 SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS M2V", POS_FIX_LPIB),
Daniel T Chene96d3122010-05-27 18:32:18 -04003336 SND_PCI_QUIRK(0x104d, 0x9069, "Sony VPCS11V9E", POS_FIX_LPIB),
David Henningssonb01de4f2012-01-12 16:31:14 +01003337 SND_PCI_QUIRK(0x10de, 0xcb89, "Macbook Pro 7,1", POS_FIX_LPIB),
Daniel T Chen61bb42c2010-05-29 11:04:11 -04003338 SND_PCI_QUIRK(0x1297, 0x3166, "Shuttle", POS_FIX_LPIB),
Daniel T Chen9ec8dda2010-03-28 02:34:40 -04003339 SND_PCI_QUIRK(0x1458, 0xa022, "ga-ma770-ud3", POS_FIX_LPIB),
Takashi Iwai45d4ebf2009-11-30 11:58:30 +01003340 SND_PCI_QUIRK(0x1462, 0x1002, "MSI Wind U115", POS_FIX_LPIB),
Takashi Iwai8815cd02010-04-15 09:02:41 +02003341 SND_PCI_QUIRK(0x1565, 0x8218, "Biostar Microtech", POS_FIX_LPIB),
Daniel T Chenb90c0762010-05-30 19:31:41 -04003342 SND_PCI_QUIRK(0x1849, 0x0888, "775Dual-VSTA", POS_FIX_LPIB),
Daniel T Chen0e0280d2010-04-21 19:55:43 -04003343 SND_PCI_QUIRK(0x8086, 0x2503, "DG965OT AAD63733-203", POS_FIX_LPIB),
Takashi Iwai3372a152007-02-01 15:46:50 +01003344 {}
3345};
3346
Bill Pembertone23e7a12012-12-06 12:35:10 -05003347static int check_position_fix(struct azx *chip, int fix)
Takashi Iwai3372a152007-02-01 15:46:50 +01003348{
3349 const struct snd_pci_quirk *q;
3350
Takashi Iwaic673ba12009-03-17 07:49:14 +01003351 switch (fix) {
Takashi Iwai1dac6692012-09-13 14:59:47 +02003352 case POS_FIX_AUTO:
Takashi Iwaic673ba12009-03-17 07:49:14 +01003353 case POS_FIX_LPIB:
3354 case POS_FIX_POSBUF:
David Henningsson4cb36312010-09-30 10:12:50 +02003355 case POS_FIX_VIACOMBO:
Takashi Iwaia6f2fd52012-02-28 11:58:40 +01003356 case POS_FIX_COMBO:
Takashi Iwaic673ba12009-03-17 07:49:14 +01003357 return fix;
3358 }
3359
Takashi Iwaic673ba12009-03-17 07:49:14 +01003360 q = snd_pci_quirk_lookup(chip->pci, position_fix_list);
3361 if (q) {
3362 printk(KERN_INFO
3363 "hda_intel: position_fix set to %d "
3364 "for device %04x:%04x\n",
3365 q->value, q->subvendor, q->subdevice);
3366 return q->value;
Takashi Iwai3372a152007-02-01 15:46:50 +01003367 }
David Henningssonbdd9ef22010-10-04 12:02:14 +02003368
3369 /* Check VIA/ATI HD Audio Controller exist */
Takashi Iwai9477c582011-05-25 09:11:37 +02003370 if (chip->driver_caps & AZX_DCAPS_POSFIX_VIA) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003371 snd_printd(SFX "%s: Using VIACOMBO position fix\n", pci_name(chip->pci));
David Henningssonbdd9ef22010-10-04 12:02:14 +02003372 return POS_FIX_VIACOMBO;
3373 }
Takashi Iwai9477c582011-05-25 09:11:37 +02003374 if (chip->driver_caps & AZX_DCAPS_POSFIX_LPIB) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003375 snd_printd(SFX "%s: Using LPIB position fix\n", pci_name(chip->pci));
Takashi Iwai9477c582011-05-25 09:11:37 +02003376 return POS_FIX_LPIB;
3377 }
Takashi Iwaic673ba12009-03-17 07:49:14 +01003378 return POS_FIX_AUTO;
Takashi Iwai3372a152007-02-01 15:46:50 +01003379}
3380
3381/*
Takashi Iwai669ba272007-08-17 09:17:36 +02003382 * black-lists for probe_mask
3383 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003384static struct snd_pci_quirk probe_mask_list[] = {
Takashi Iwai669ba272007-08-17 09:17:36 +02003385 /* Thinkpad often breaks the controller communication when accessing
3386 * to the non-working (or non-existing) modem codec slot.
3387 */
3388 SND_PCI_QUIRK(0x1014, 0x05b7, "Thinkpad Z60", 0x01),
3389 SND_PCI_QUIRK(0x17aa, 0x2010, "Thinkpad X/T/R60", 0x01),
3390 SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X/T/R61", 0x01),
Takashi Iwai0edb9452008-11-07 14:53:09 +01003391 /* broken BIOS */
3392 SND_PCI_QUIRK(0x1028, 0x20ac, "Dell Studio Desktop", 0x01),
Takashi Iwaief1681d2008-11-24 17:29:28 +01003393 /* including bogus ALC268 in slot#2 that conflicts with ALC888 */
3394 SND_PCI_QUIRK(0x17c0, 0x4085, "Medion MD96630", 0x01),
Takashi Iwai20db7cb2009-02-13 08:18:48 +01003395 /* forced codec slots */
Ozan Çağlayan93574842009-05-23 15:00:04 +03003396 SND_PCI_QUIRK(0x1043, 0x1262, "ASUS W5Fm", 0x103),
Takashi Iwai20db7cb2009-02-13 08:18:48 +01003397 SND_PCI_QUIRK(0x1046, 0x1262, "ASUS W5F", 0x103),
Jaroslav Kyselaf3af9052012-04-26 17:52:35 +02003398 /* WinFast VP200 H (Teradici) user reported broken communication */
3399 SND_PCI_QUIRK(0x3a21, 0x040d, "WinFast VP200 H", 0x101),
Takashi Iwai669ba272007-08-17 09:17:36 +02003400 {}
3401};
3402
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003403#define AZX_FORCE_CODEC_MASK 0x100
3404
Bill Pembertone23e7a12012-12-06 12:35:10 -05003405static void check_probe_mask(struct azx *chip, int dev)
Takashi Iwai669ba272007-08-17 09:17:36 +02003406{
3407 const struct snd_pci_quirk *q;
3408
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003409 chip->codec_probe_mask = probe_mask[dev];
3410 if (chip->codec_probe_mask == -1) {
Takashi Iwai669ba272007-08-17 09:17:36 +02003411 q = snd_pci_quirk_lookup(chip->pci, probe_mask_list);
3412 if (q) {
3413 printk(KERN_INFO
3414 "hda_intel: probe_mask set to 0x%x "
3415 "for device %04x:%04x\n",
3416 q->value, q->subvendor, q->subdevice);
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003417 chip->codec_probe_mask = q->value;
Takashi Iwai669ba272007-08-17 09:17:36 +02003418 }
3419 }
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003420
3421 /* check forced option */
3422 if (chip->codec_probe_mask != -1 &&
3423 (chip->codec_probe_mask & AZX_FORCE_CODEC_MASK)) {
3424 chip->codec_mask = chip->codec_probe_mask & 0xff;
3425 printk(KERN_INFO "hda_intel: codec_mask forced to 0x%x\n",
3426 chip->codec_mask);
3427 }
Takashi Iwai669ba272007-08-17 09:17:36 +02003428}
3429
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003430/*
Takashi Iwai716238552009-09-28 13:14:04 +02003431 * white/black-list for enable_msi
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003432 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003433static struct snd_pci_quirk msi_black_list[] = {
Takashi Iwai9dc83982009-12-22 08:15:01 +01003434 SND_PCI_QUIRK(0x1043, 0x81f2, "ASUS", 0), /* Athlon64 X2 + nvidia */
Takashi Iwai0a27fcf2010-02-15 17:05:28 +01003435 SND_PCI_QUIRK(0x1043, 0x81f6, "ASUS", 0), /* nvidia */
Ralf Gerbigecd21622010-03-09 18:25:47 +01003436 SND_PCI_QUIRK(0x1043, 0x822d, "ASUS", 0), /* Athlon64 X2 + nvidia MCP55 */
Takashi Iwai83f72152013-09-09 10:20:48 +02003437 SND_PCI_QUIRK(0x1179, 0xfb44, "Toshiba Satellite C870", 0), /* AMD Hudson */
Michele Ballabio4193d132010-03-06 21:06:46 +01003438 SND_PCI_QUIRK(0x1849, 0x0888, "ASRock", 0), /* Athlon64 X2 + nvidia */
Takashi Iwai38155952010-04-04 12:14:03 +02003439 SND_PCI_QUIRK(0xa0a0, 0x0575, "Aopen MZ915-M", 0), /* ICH6 */
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003440 {}
3441};
3442
Bill Pembertone23e7a12012-12-06 12:35:10 -05003443static void check_msi(struct azx *chip)
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003444{
3445 const struct snd_pci_quirk *q;
3446
Takashi Iwai716238552009-09-28 13:14:04 +02003447 if (enable_msi >= 0) {
3448 chip->msi = !!enable_msi;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003449 return;
Takashi Iwai716238552009-09-28 13:14:04 +02003450 }
3451 chip->msi = 1; /* enable MSI as default */
3452 q = snd_pci_quirk_lookup(chip->pci, msi_black_list);
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003453 if (q) {
3454 printk(KERN_INFO
3455 "hda_intel: msi for device %04x:%04x set to %d\n",
3456 q->subvendor, q->subdevice, q->value);
3457 chip->msi = q->value;
Takashi Iwai80c43ed2010-03-15 15:51:53 +01003458 return;
3459 }
3460
3461 /* NVidia chipsets seem to cause troubles with MSI */
Takashi Iwai9477c582011-05-25 09:11:37 +02003462 if (chip->driver_caps & AZX_DCAPS_NO_MSI) {
3463 printk(KERN_INFO "hda_intel: Disabling MSI\n");
Takashi Iwai80c43ed2010-03-15 15:51:53 +01003464 chip->msi = 0;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003465 }
3466}
3467
Takashi Iwaia1585d72011-12-14 09:27:04 +01003468/* check the snoop mode availability */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003469static void azx_check_snoop_available(struct azx *chip)
Takashi Iwaia1585d72011-12-14 09:27:04 +01003470{
3471 bool snoop = chip->snoop;
3472
3473 switch (chip->driver_type) {
3474 case AZX_DRIVER_VIA:
3475 /* force to non-snoop mode for a new VIA controller
3476 * when BIOS is set
3477 */
3478 if (snoop) {
3479 u8 val;
3480 pci_read_config_byte(chip->pci, 0x42, &val);
3481 if (!(val & 0x80) && chip->pci->revision == 0x30)
3482 snoop = false;
3483 }
3484 break;
3485 case AZX_DRIVER_ATIHDMI_NS:
3486 /* new ATI HDMI requires non-snoop */
3487 snoop = false;
3488 break;
Takashi Iwaic1279f82013-02-07 17:36:22 +01003489 case AZX_DRIVER_CTHDA:
3490 snoop = false;
3491 break;
Takashi Iwaia1585d72011-12-14 09:27:04 +01003492 }
3493
3494 if (snoop != chip->snoop) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003495 snd_printk(KERN_INFO SFX "%s: Force to %s mode\n",
3496 pci_name(chip->pci), snoop ? "snoop" : "non-snoop");
Takashi Iwaia1585d72011-12-14 09:27:04 +01003497 chip->snoop = snoop;
3498 }
3499}
Takashi Iwai669ba272007-08-17 09:17:36 +02003500
Wang Xingchao99a20082013-05-30 22:07:10 +08003501static void azx_probe_work(struct work_struct *work)
3502{
3503 azx_probe_continue(container_of(work, struct azx, probe_work));
3504}
Wang Xingchao99a20082013-05-30 22:07:10 +08003505
Takashi Iwai669ba272007-08-17 09:17:36 +02003506/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07003507 * constructor
3508 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003509static int azx_create(struct snd_card *card, struct pci_dev *pci,
3510 int dev, unsigned int driver_caps,
3511 struct azx **rchip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003512{
Takashi Iwaia98f90f2005-11-17 14:59:02 +01003513 static struct snd_device_ops ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003514 .dev_free = azx_dev_free,
3515 };
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003516 struct azx *chip;
3517 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003518
3519 *rchip = NULL;
Tobin Davisbcd72002008-01-15 11:23:55 +01003520
Pavel Machek927fc862006-08-31 17:03:43 +02003521 err = pci_enable_device(pci);
3522 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003523 return err;
3524
Takashi Iwaie560d8d2005-09-09 14:21:46 +02003525 chip = kzalloc(sizeof(*chip), GFP_KERNEL);
Pavel Machek927fc862006-08-31 17:03:43 +02003526 if (!chip) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003527 snd_printk(KERN_ERR SFX "%s: Cannot allocate chip\n", pci_name(pci));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003528 pci_disable_device(pci);
3529 return -ENOMEM;
3530 }
3531
3532 spin_lock_init(&chip->reg_lock);
Ingo Molnar62932df2006-01-16 16:34:20 +01003533 mutex_init(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003534 chip->card = card;
3535 chip->pci = pci;
3536 chip->irq = -1;
Takashi Iwai9477c582011-05-25 09:11:37 +02003537 chip->driver_caps = driver_caps;
3538 chip->driver_type = driver_caps & 0xff;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003539 check_msi(chip);
Takashi Iwai555e2192008-06-10 17:53:34 +02003540 chip->dev_index = dev;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02003541 INIT_WORK(&chip->irq_pending_work, azx_irq_pending_work);
Takashi Iwai01b65bf2011-11-24 14:31:46 +01003542 INIT_LIST_HEAD(&chip->pcm_list);
Takashi Iwai65fcd412012-08-14 17:13:32 +02003543 INIT_LIST_HEAD(&chip->list);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003544 init_vga_switcheroo(chip);
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003545 init_completion(&chip->probe_wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003546
Shahin Ghazinouribeaffc32010-05-11 08:19:55 +02003547 chip->position_fix[0] = chip->position_fix[1] =
3548 check_position_fix(chip, position_fix[dev]);
Takashi Iwaia6f2fd52012-02-28 11:58:40 +01003549 /* combo mode uses LPIB for playback */
3550 if (chip->position_fix[0] == POS_FIX_COMBO) {
3551 chip->position_fix[0] = POS_FIX_LPIB;
3552 chip->position_fix[1] = POS_FIX_AUTO;
3553 }
3554
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003555 check_probe_mask(chip, dev);
Takashi Iwai3372a152007-02-01 15:46:50 +01003556
Takashi Iwai27346162006-01-12 18:28:44 +01003557 chip->single_cmd = single_cmd;
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003558 chip->snoop = hda_snoop;
Takashi Iwaia1585d72011-12-14 09:27:04 +01003559 azx_check_snoop_available(chip);
Takashi Iwaic74db862005-05-12 14:26:27 +02003560
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02003561 if (bdl_pos_adj[dev] < 0) {
3562 switch (chip->driver_type) {
Takashi Iwai0c6341a2008-06-13 20:50:27 +02003563 case AZX_DRIVER_ICH:
Seth Heasley32679f92010-02-22 17:31:09 -08003564 case AZX_DRIVER_PCH:
Takashi Iwai0c6341a2008-06-13 20:50:27 +02003565 bdl_pos_adj[dev] = 1;
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02003566 break;
3567 default:
Takashi Iwai0c6341a2008-06-13 20:50:27 +02003568 bdl_pos_adj[dev] = 32;
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02003569 break;
3570 }
3571 }
3572
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003573 err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
3574 if (err < 0) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003575 snd_printk(KERN_ERR SFX "%s: Error creating device [card]!\n",
3576 pci_name(chip->pci));
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) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003615 snd_printk(KERN_ERR SFX "%s: ioremap error\n", pci_name(chip->pci));
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);
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003630 snd_printdd(SFX "%s: chipset global capabilities = 0x%x\n", pci_name(chip->pci), 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) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003647 snd_printd(SFX "%s: Disabling 64bit DMA\n", pci_name(chip->pci));
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) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003702 snd_printk(KERN_ERR SFX "%s: cannot malloc azx_dev\n", pci_name(chip->pci));
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) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003713 snd_printk(KERN_ERR SFX "%s: cannot allocate BDL\n", pci_name(chip->pci));
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) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003723 snd_printk(KERN_ERR SFX "%s: cannot allocate posbuf\n", pci_name(chip->pci));
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) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003741 snd_printk(KERN_ERR SFX "%s: no codecs found!\n", pci_name(chip->pci));
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) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003777 snd_printk(KERN_ERR SFX "%s: Cannot load firmware, aborting\n",
3778 pci_name(chip->pci));
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003779 goto error;
3780 }
3781
3782 chip->fw = fw;
3783 if (!chip->disabled) {
3784 /* continue probing */
3785 if (azx_probe_continue(chip))
3786 goto error;
3787 }
3788 return; /* OK */
3789
3790 error:
3791 snd_card_free(card);
3792 pci_set_drvdata(pci, NULL);
3793}
Takashi Iwai97c6a3d2012-08-09 17:40:46 +02003794#endif
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003795
Bill Pembertone23e7a12012-12-06 12:35:10 -05003796static int azx_probe(struct pci_dev *pci,
3797 const struct pci_device_id *pci_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003798{
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003799 static int dev;
Takashi Iwaia98f90f2005-11-17 14:59:02 +01003800 struct snd_card *card;
3801 struct azx *chip;
Takashi Iwaiaad730d2013-12-02 13:33:57 +01003802 bool schedule_probe;
Pavel Machek927fc862006-08-31 17:03:43 +02003803 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003804
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003805 if (dev >= SNDRV_CARDS)
3806 return -ENODEV;
3807 if (!enable[dev]) {
3808 dev++;
3809 return -ENOENT;
3810 }
3811
Takashi Iwaie58de7b2008-12-28 16:44:30 +01003812 err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card);
3813 if (err < 0) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003814 snd_printk(KERN_ERR "hda-intel: Error creating card!\n");
Takashi Iwaie58de7b2008-12-28 16:44:30 +01003815 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003816 }
3817
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003818 snd_card_set_dev(card, &pci->dev);
3819
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003820 err = azx_create(card, pci, dev, pci_id->driver_data, &chip);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003821 if (err < 0)
3822 goto out_free;
Takashi Iwai421a1252005-11-17 16:11:09 +01003823 card->private_data = chip;
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003824
3825 pci_set_drvdata(pci, card);
3826
3827 err = register_vga_switcheroo(chip);
3828 if (err < 0) {
3829 snd_printk(KERN_ERR SFX
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003830 "%s: Error registering VGA-switcheroo client\n", pci_name(pci));
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003831 goto out_free;
3832 }
3833
3834 if (check_hdmi_disabled(pci)) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003835 snd_printk(KERN_INFO SFX "%s: VGA controller is disabled\n",
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003836 pci_name(pci));
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003837 snd_printk(KERN_INFO SFX "%s: Delaying initialization\n", pci_name(pci));
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003838 chip->disabled = true;
3839 }
3840
Takashi Iwaiaad730d2013-12-02 13:33:57 +01003841 schedule_probe = !chip->disabled;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003842
Takashi Iwai4918cda2012-08-09 12:33:28 +02003843#ifdef CONFIG_SND_HDA_PATCH_LOADER
3844 if (patch[dev] && *patch[dev]) {
Daniel J Blueman445a51b2012-12-05 23:04:21 +08003845 snd_printk(KERN_ERR SFX "%s: Applying patch firmware '%s'\n",
3846 pci_name(pci), patch[dev]);
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003847 err = request_firmware_nowait(THIS_MODULE, true, patch[dev],
3848 &pci->dev, GFP_KERNEL, card,
3849 azx_firmware_cb);
Takashi Iwai4918cda2012-08-09 12:33:28 +02003850 if (err < 0)
3851 goto out_free;
Takashi Iwaiaad730d2013-12-02 13:33:57 +01003852 schedule_probe = false; /* continued in azx_firmware_cb() */
Takashi Iwai4918cda2012-08-09 12:33:28 +02003853 }
3854#endif /* CONFIG_SND_HDA_PATCH_LOADER */
3855
Takashi Iwaiaad730d2013-12-02 13:33:57 +01003856#ifndef CONFIG_SND_HDA_I915
3857 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)
Wang Xingchao99a20082013-05-30 22:07:10 +08003858 snd_printk(KERN_ERR SFX "Haswell must build in CONFIG_SND_HDA_I915\n");
3859#endif
Wang Xingchao99a20082013-05-30 22:07:10 +08003860
Takashi Iwaiaad730d2013-12-02 13:33:57 +01003861 if (schedule_probe)
3862 schedule_work(&chip->probe_work);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003863
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003864 dev++;
Takashi Iwai88d071f2013-12-02 11:12:28 +01003865 if (chip->disabled)
3866 complete_all(&chip->probe_wait);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003867 return 0;
3868
3869out_free:
3870 snd_card_free(card);
3871 return err;
3872}
3873
Takashi Iwai48c8b0e2012-12-07 07:40:35 +01003874static int azx_probe_continue(struct azx *chip)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003875{
Wang Xingchaoc67e2222013-05-30 22:07:08 +08003876 struct pci_dev *pci = chip->pci;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003877 int dev = chip->dev_index;
3878 int err;
3879
Wang Xingchao99a20082013-05-30 22:07:10 +08003880 /* Request power well for Haswell HDA controller and codec */
3881 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL) {
David Henningssonc841ad22013-08-19 13:32:30 +02003882#ifdef CONFIG_SND_HDA_I915
Wang Xingchao99a20082013-05-30 22:07:10 +08003883 err = hda_i915_init();
3884 if (err < 0) {
3885 snd_printk(KERN_ERR SFX "Error request power-well from i915\n");
3886 goto out_free;
3887 }
David Henningssonc841ad22013-08-19 13:32:30 +02003888#endif
Wang Xingchao99a20082013-05-30 22:07:10 +08003889 hda_display_power(true);
3890 }
3891
Takashi Iwai5c906802013-05-30 22:07:09 +08003892 err = azx_first_init(chip);
3893 if (err < 0)
3894 goto out_free;
3895
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +01003896#ifdef CONFIG_SND_HDA_INPUT_BEEP
3897 chip->beep_mode = beep_mode[dev];
3898#endif
3899
Linus Torvalds1da177e2005-04-16 15:20:36 -07003900 /* create codec instances */
Takashi Iwaia1e21c92009-06-17 09:33:52 +02003901 err = azx_codec_create(chip, model[dev]);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003902 if (err < 0)
3903 goto out_free;
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003904#ifdef CONFIG_SND_HDA_PATCH_LOADER
Takashi Iwai4918cda2012-08-09 12:33:28 +02003905 if (chip->fw) {
3906 err = snd_hda_load_patch(chip->bus, chip->fw->size,
3907 chip->fw->data);
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003908 if (err < 0)
3909 goto out_free;
Takashi Iwaie39ae852012-11-22 16:18:13 +01003910#ifndef CONFIG_PM
Takashi Iwai4918cda2012-08-09 12:33:28 +02003911 release_firmware(chip->fw); /* no longer needed */
3912 chip->fw = NULL;
Takashi Iwaie39ae852012-11-22 16:18:13 +01003913#endif
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003914 }
3915#endif
Jaroslav Kysela10e77dd2010-03-26 11:04:38 +01003916 if ((probe_only[dev] & 1) == 0) {
Takashi Iwaia1e21c92009-06-17 09:33:52 +02003917 err = azx_codec_configure(chip);
3918 if (err < 0)
3919 goto out_free;
3920 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003921
3922 /* create PCM streams */
Takashi Iwai176d5332008-07-30 15:01:44 +02003923 err = snd_hda_build_pcms(chip->bus);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003924 if (err < 0)
3925 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003926
3927 /* create mixer controls */
Takashi Iwaid01ce992007-07-27 16:52:19 +02003928 err = azx_mixer_create(chip);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003929 if (err < 0)
3930 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003931
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003932 err = snd_card_register(chip->card);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003933 if (err < 0)
3934 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003935
Takashi Iwaicb53c622007-08-10 17:21:45 +02003936 chip->running = 1;
3937 power_down_all_codecs(chip);
Takashi Iwai0cbf0092008-10-29 16:18:25 +01003938 azx_notifier_register(chip);
Takashi Iwai65fcd412012-08-14 17:13:32 +02003939 azx_add_card_list(chip);
Dave Airlie246efa42013-07-29 15:19:29 +10003940 if ((chip->driver_caps & AZX_DCAPS_PM_RUNTIME) || chip->use_vga_switcheroo)
Wang Xingchaoc67e2222013-05-30 22:07:08 +08003941 pm_runtime_put_noidle(&pci->dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003942
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003943out_free:
Takashi Iwai88d071f2013-12-02 11:12:28 +01003944 if (err < 0)
3945 chip->init_failed = 1;
3946 complete_all(&chip->probe_wait);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003947 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003948}
3949
Bill Pembertone23e7a12012-12-06 12:35:10 -05003950static void azx_remove(struct pci_dev *pci)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003951{
Takashi Iwai91219472012-04-26 12:13:25 +02003952 struct snd_card *card = pci_get_drvdata(pci);
Mengdong Linb8dfc4622012-08-23 17:32:30 +08003953
Takashi Iwai91219472012-04-26 12:13:25 +02003954 if (card)
3955 snd_card_free(card);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003956}
3957
3958/* PCI IDs */
Alexey Dobriyancebe41d2010-02-06 00:21:03 +02003959static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
Seth Heasleyd2f2fcd2010-01-12 17:03:35 -08003960 /* CPT */
Takashi Iwai9477c582011-05-25 09:11:37 +02003961 { PCI_DEVICE(0x8086, 0x1c20),
Takashi Iwaid7dab4d2013-01-08 13:51:30 +01003962 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM },
Seth Heasleycea310e2010-09-10 16:29:56 -07003963 /* PBG */
Takashi Iwai9477c582011-05-25 09:11:37 +02003964 { PCI_DEVICE(0x8086, 0x1d20),
Takashi Iwaid7dab4d2013-01-08 13:51:30 +01003965 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM },
Seth Heasleyd2edeb72011-04-20 10:59:57 -07003966 /* Panther Point */
Takashi Iwai9477c582011-05-25 09:11:37 +02003967 { PCI_DEVICE(0x8086, 0x1e20),
Takashi Iwaib1920c22013-11-22 12:43:25 +01003968 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
Seth Heasley8bc039a2012-01-23 16:24:31 -08003969 /* Lynx Point */
3970 { PCI_DEVICE(0x8086, 0x8c20),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003971 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
James Ralston884b0882013-02-08 17:29:40 -08003972 /* Wellsburg */
3973 { PCI_DEVICE(0x8086, 0x8d20),
3974 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
3975 { PCI_DEVICE(0x8086, 0x8d21),
3976 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
James Ralston144dad92012-08-09 09:38:59 -07003977 /* Lynx Point-LP */
3978 { PCI_DEVICE(0x8086, 0x9c20),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003979 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
James Ralston144dad92012-08-09 09:38:59 -07003980 /* Lynx Point-LP */
3981 { PCI_DEVICE(0x8086, 0x9c21),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003982 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
James Ralston4eeca492013-11-04 09:27:45 -08003983 /* Wildcat Point-LP */
3984 { PCI_DEVICE(0x8086, 0x9ca0),
3985 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
Wang Xingchaoe926f2c2012-06-13 10:23:51 +08003986 /* Haswell */
Wang Xingchao4a7c5162013-02-01 22:42:19 +08003987 { PCI_DEVICE(0x8086, 0x0a0c),
Takashi Iwaifab12852013-11-05 17:54:05 +01003988 .driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL },
Wang Xingchaoe926f2c2012-06-13 10:23:51 +08003989 { PCI_DEVICE(0x8086, 0x0c0c),
Takashi Iwaifab12852013-11-05 17:54:05 +01003990 .driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL },
Wang Xingchaod279fae2012-09-17 13:10:23 +08003991 { PCI_DEVICE(0x8086, 0x0d0c),
Takashi Iwaifab12852013-11-05 17:54:05 +01003992 .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 Iwai313f6e22009-05-18 12:40:52 +02004123#if !defined(CONFIG_SND_CTXFI) && !defined(CONFIG_SND_CTXFI_MODULE)
4124 /* 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);