blob: 60882c62f18006a3b2339d354b58550fdcd30718 [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>
49#ifdef CONFIG_X86
50/* for snoop control */
51#include <asm/pgtable.h>
52#include <asm/cacheflush.h>
53#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070054#include <sound/core.h>
55#include <sound/initval.h>
Takashi Iwai91219472012-04-26 12:13:25 +020056#include <linux/vgaarb.h>
Takashi Iwaia82d51e2012-04-26 12:23:42 +020057#include <linux/vga_switcheroo.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070058#include "hda_codec.h"
59
60
Takashi Iwai5aba4f82008-01-07 15:16:37 +010061static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
62static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
Rusty Russella67ff6a2011-12-15 13:49:36 +103063static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
Takashi Iwai5aba4f82008-01-07 15:16:37 +010064static char *model[SNDRV_CARDS];
65static int position_fix[SNDRV_CARDS];
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +020066static int bdl_pos_adj[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = -1};
Takashi Iwai5aba4f82008-01-07 15:16:37 +010067static int probe_mask[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = -1};
Takashi Iwaid4d9cd032008-12-19 15:19:11 +010068static int probe_only[SNDRV_CARDS];
Rusty Russella67ff6a2011-12-15 13:49:36 +103069static bool single_cmd;
Takashi Iwai716238552009-09-28 13:14:04 +020070static int enable_msi = -1;
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +020071#ifdef CONFIG_SND_HDA_PATCH_LOADER
72static char *patch[SNDRV_CARDS];
73#endif
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +010074#ifdef CONFIG_SND_HDA_INPUT_BEEP
Takashi Iwai0920c9b2012-07-03 16:58:48 +020075static bool beep_mode[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] =
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +010076 CONFIG_SND_HDA_INPUT_BEEP_MODE};
77#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070078
Takashi Iwai5aba4f82008-01-07 15:16:37 +010079module_param_array(index, int, NULL, 0444);
Linus Torvalds1da177e2005-04-16 15:20:36 -070080MODULE_PARM_DESC(index, "Index value for Intel HD audio interface.");
Takashi Iwai5aba4f82008-01-07 15:16:37 +010081module_param_array(id, charp, NULL, 0444);
Linus Torvalds1da177e2005-04-16 15:20:36 -070082MODULE_PARM_DESC(id, "ID string for Intel HD audio interface.");
Takashi Iwai5aba4f82008-01-07 15:16:37 +010083module_param_array(enable, bool, NULL, 0444);
84MODULE_PARM_DESC(enable, "Enable Intel HD audio interface.");
85module_param_array(model, charp, NULL, 0444);
Linus Torvalds1da177e2005-04-16 15:20:36 -070086MODULE_PARM_DESC(model, "Use the given board model.");
Takashi Iwai5aba4f82008-01-07 15:16:37 +010087module_param_array(position_fix, int, NULL, 0444);
David Henningsson4cb36312010-09-30 10:12:50 +020088MODULE_PARM_DESC(position_fix, "DMA pointer read method."
Takashi Iwaia6f2fd52012-02-28 11:58:40 +010089 "(0 = auto, 1 = LPIB, 2 = POSBUF, 3 = VIACOMBO, 4 = COMBO).");
Takashi Iwai555e2192008-06-10 17:53:34 +020090module_param_array(bdl_pos_adj, int, NULL, 0644);
91MODULE_PARM_DESC(bdl_pos_adj, "BDL position adjustment offset.");
Takashi Iwai5aba4f82008-01-07 15:16:37 +010092module_param_array(probe_mask, int, NULL, 0444);
Takashi Iwai606ad752005-11-24 16:03:40 +010093MODULE_PARM_DESC(probe_mask, "Bitmask to probe codecs (default = -1).");
Jaroslav Kysela079e6832010-03-26 11:16:59 +010094module_param_array(probe_only, int, NULL, 0444);
Takashi Iwaid4d9cd032008-12-19 15:19:11 +010095MODULE_PARM_DESC(probe_only, "Only probing and no codec initialization.");
Takashi Iwai27346162006-01-12 18:28:44 +010096module_param(single_cmd, bool, 0444);
Takashi Iwaid01ce992007-07-27 16:52:19 +020097MODULE_PARM_DESC(single_cmd, "Use single command to communicate with codecs "
98 "(for debugging only).");
Takashi Iwaiac9ef6c2012-01-20 12:08:44 +010099module_param(enable_msi, bint, 0444);
Takashi Iwai134a11f2006-11-10 12:08:37 +0100100MODULE_PARM_DESC(enable_msi, "Enable Message Signaled Interrupt (MSI)");
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +0200101#ifdef CONFIG_SND_HDA_PATCH_LOADER
102module_param_array(patch, charp, NULL, 0444);
103MODULE_PARM_DESC(patch, "Patch file for Intel HD audio interface.");
104#endif
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +0100105#ifdef CONFIG_SND_HDA_INPUT_BEEP
Takashi Iwai0920c9b2012-07-03 16:58:48 +0200106module_param_array(beep_mode, bool, NULL, 0444);
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +0100107MODULE_PARM_DESC(beep_mode, "Select HDA Beep registration mode "
Takashi Iwai0920c9b2012-07-03 16:58:48 +0200108 "(0=off, 1=on) (default=1).");
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +0100109#endif
Takashi Iwai606ad752005-11-24 16:03:40 +0100110
Takashi Iwaidee1b662007-08-13 16:10:30 +0200111#ifdef CONFIG_SND_HDA_POWER_SAVE
Takashi Iwaifee2fba2008-11-27 12:43:28 +0100112static int power_save = CONFIG_SND_HDA_POWER_SAVE_DEFAULT;
113module_param(power_save, int, 0644);
114MODULE_PARM_DESC(power_save, "Automatic power-saving timeout "
115 "(in second, 0 = disable).");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700116
Takashi Iwaidee1b662007-08-13 16:10:30 +0200117/* reset the HD-audio controller in power save mode.
118 * this may give more power-saving, but will take longer time to
119 * wake up.
120 */
Rusty Russella67ff6a2011-12-15 13:49:36 +1030121static bool power_save_controller = 1;
Takashi Iwaidee1b662007-08-13 16:10:30 +0200122module_param(power_save_controller, bool, 0644);
123MODULE_PARM_DESC(power_save_controller, "Reset controller in power save mode.");
124#endif
125
Takashi Iwai7bfe0592012-01-23 17:53:39 +0100126static int align_buffer_size = -1;
127module_param(align_buffer_size, bint, 0644);
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -0500128MODULE_PARM_DESC(align_buffer_size,
129 "Force buffer and period sizes to be multiple of 128 bytes.");
130
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200131#ifdef CONFIG_X86
132static bool hda_snoop = true;
133module_param_named(snoop, hda_snoop, bool, 0444);
134MODULE_PARM_DESC(snoop, "Enable/disable snooping");
135#define azx_snoop(chip) (chip)->snoop
136#else
137#define hda_snoop true
138#define azx_snoop(chip) true
139#endif
140
141
Linus Torvalds1da177e2005-04-16 15:20:36 -0700142MODULE_LICENSE("GPL");
143MODULE_SUPPORTED_DEVICE("{{Intel, ICH6},"
144 "{Intel, ICH6M},"
Jason Gaston2f1b3812005-05-01 08:58:50 -0700145 "{Intel, ICH7},"
Frederick Lif5d40b32005-05-12 14:55:20 +0200146 "{Intel, ESB2},"
Jason Gastond2981392006-01-10 11:07:37 +0100147 "{Intel, ICH8},"
Jason Gastonf9cc8a82006-11-22 11:53:52 +0100148 "{Intel, ICH9},"
Jason Gastonc34f5a02008-01-29 12:38:49 +0100149 "{Intel, ICH10},"
Seth Heasleyb29c2362008-08-08 15:56:39 -0700150 "{Intel, PCH},"
Seth Heasleyd2f2fcd2010-01-12 17:03:35 -0800151 "{Intel, CPT},"
Seth Heasleyd2edeb72011-04-20 10:59:57 -0700152 "{Intel, PPT},"
Seth Heasley8bc039a2012-01-23 16:24:31 -0800153 "{Intel, LPT},"
James Ralston144dad92012-08-09 09:38:59 -0700154 "{Intel, LPT_LP},"
Wang Xingchaoe926f2c2012-06-13 10:23:51 +0800155 "{Intel, HPT},"
Seth Heasleycea310e2010-09-10 16:29:56 -0700156 "{Intel, PBG},"
Tobin Davis4979bca2008-01-30 08:13:55 +0100157 "{Intel, SCH},"
Takashi Iwaifc20a562005-05-12 15:00:41 +0200158 "{ATI, SB450},"
Felix Kuehling89be83f2006-03-31 12:33:59 +0200159 "{ATI, SB600},"
Felix Kuehling778b6e12006-05-17 11:22:21 +0200160 "{ATI, RS600},"
Felix Kuehling5b15c952006-10-16 12:49:47 +0200161 "{ATI, RS690},"
Wolke Liue6db1112007-04-27 12:20:57 +0200162 "{ATI, RS780},"
163 "{ATI, R600},"
Herton Ronaldo Krzesinski2797f722007-11-05 18:21:56 +0100164 "{ATI, RV630},"
165 "{ATI, RV610},"
Wolke Liu27da1832007-11-16 11:06:30 +0100166 "{ATI, RV670},"
167 "{ATI, RV635},"
168 "{ATI, RV620},"
169 "{ATI, RV770},"
Takashi Iwaifc20a562005-05-12 15:00:41 +0200170 "{VIA, VT8251},"
Takashi Iwai47672312005-08-12 16:44:04 +0200171 "{VIA, VT8237A},"
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200172 "{SiS, SIS966},"
173 "{ULI, M5461}}");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700174MODULE_DESCRIPTION("Intel HDA driver");
175
Takashi Iwai4abc1cc2009-05-19 12:16:46 +0200176#ifdef CONFIG_SND_VERBOSE_PRINTK
177#define SFX /* nop */
178#else
Linus Torvalds1da177e2005-04-16 15:20:36 -0700179#define SFX "hda-intel: "
Takashi Iwai4abc1cc2009-05-19 12:16:46 +0200180#endif
Takashi Iwaicb53c622007-08-10 17:21:45 +0200181
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200182#if defined(CONFIG_PM) && defined(CONFIG_VGA_SWITCHEROO)
183#ifdef CONFIG_SND_HDA_CODEC_HDMI
184#define SUPPORT_VGA_SWITCHEROO
185#endif
186#endif
187
188
Takashi Iwaicb53c622007-08-10 17:21:45 +0200189/*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700190 * registers
191 */
192#define ICH6_REG_GCAP 0x00
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200193#define ICH6_GCAP_64OK (1 << 0) /* 64bit address support */
194#define ICH6_GCAP_NSDO (3 << 1) /* # of serial data out signals */
195#define ICH6_GCAP_BSS (31 << 3) /* # of bidirectional streams */
196#define ICH6_GCAP_ISS (15 << 8) /* # of input streams */
197#define ICH6_GCAP_OSS (15 << 12) /* # of output streams */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700198#define ICH6_REG_VMIN 0x02
199#define ICH6_REG_VMAJ 0x03
200#define ICH6_REG_OUTPAY 0x04
201#define ICH6_REG_INPAY 0x06
202#define ICH6_REG_GCTL 0x08
Takashi Iwai8a933ec2009-05-31 09:28:12 +0200203#define ICH6_GCTL_RESET (1 << 0) /* controller reset */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200204#define ICH6_GCTL_FCNTRL (1 << 1) /* flush control */
205#define ICH6_GCTL_UNSOL (1 << 8) /* accept unsol. response enable */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700206#define ICH6_REG_WAKEEN 0x0c
207#define ICH6_REG_STATESTS 0x0e
208#define ICH6_REG_GSTS 0x10
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200209#define ICH6_GSTS_FSTS (1 << 1) /* flush status */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700210#define ICH6_REG_INTCTL 0x20
211#define ICH6_REG_INTSTS 0x24
Jaroslav Kyselae5463722010-05-11 10:21:46 +0200212#define ICH6_REG_WALLCLK 0x30 /* 24Mhz source */
Takashi Iwai8b0bd222011-06-10 14:56:26 +0200213#define ICH6_REG_OLD_SSYNC 0x34 /* SSYNC for old ICH */
214#define ICH6_REG_SSYNC 0x38
Linus Torvalds1da177e2005-04-16 15:20:36 -0700215#define ICH6_REG_CORBLBASE 0x40
216#define ICH6_REG_CORBUBASE 0x44
217#define ICH6_REG_CORBWP 0x48
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200218#define ICH6_REG_CORBRP 0x4a
219#define ICH6_CORBRP_RST (1 << 15) /* read pointer reset */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700220#define ICH6_REG_CORBCTL 0x4c
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200221#define ICH6_CORBCTL_RUN (1 << 1) /* enable DMA */
222#define ICH6_CORBCTL_CMEIE (1 << 0) /* enable memory error irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700223#define ICH6_REG_CORBSTS 0x4d
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200224#define ICH6_CORBSTS_CMEI (1 << 0) /* memory error indication */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700225#define ICH6_REG_CORBSIZE 0x4e
226
227#define ICH6_REG_RIRBLBASE 0x50
228#define ICH6_REG_RIRBUBASE 0x54
229#define ICH6_REG_RIRBWP 0x58
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200230#define ICH6_RIRBWP_RST (1 << 15) /* write pointer reset */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700231#define ICH6_REG_RINTCNT 0x5a
232#define ICH6_REG_RIRBCTL 0x5c
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200233#define ICH6_RBCTL_IRQ_EN (1 << 0) /* enable IRQ */
234#define ICH6_RBCTL_DMA_EN (1 << 1) /* enable DMA */
235#define ICH6_RBCTL_OVERRUN_EN (1 << 2) /* enable overrun irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700236#define ICH6_REG_RIRBSTS 0x5d
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200237#define ICH6_RBSTS_IRQ (1 << 0) /* response irq */
238#define ICH6_RBSTS_OVERRUN (1 << 2) /* overrun irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700239#define ICH6_REG_RIRBSIZE 0x5e
240
241#define ICH6_REG_IC 0x60
242#define ICH6_REG_IR 0x64
243#define ICH6_REG_IRS 0x68
244#define ICH6_IRS_VALID (1<<1)
245#define ICH6_IRS_BUSY (1<<0)
246
247#define ICH6_REG_DPLBASE 0x70
248#define ICH6_REG_DPUBASE 0x74
249#define ICH6_DPLBASE_ENABLE 0x1 /* Enable position buffer */
250
251/* SD offset: SDI0=0x80, SDI1=0xa0, ... SDO3=0x160 */
252enum { SDI0, SDI1, SDI2, SDI3, SDO0, SDO1, SDO2, SDO3 };
253
254/* stream register offsets from stream base */
255#define ICH6_REG_SD_CTL 0x00
256#define ICH6_REG_SD_STS 0x03
257#define ICH6_REG_SD_LPIB 0x04
258#define ICH6_REG_SD_CBL 0x08
259#define ICH6_REG_SD_LVI 0x0c
260#define ICH6_REG_SD_FIFOW 0x0e
261#define ICH6_REG_SD_FIFOSIZE 0x10
262#define ICH6_REG_SD_FORMAT 0x12
263#define ICH6_REG_SD_BDLPL 0x18
264#define ICH6_REG_SD_BDLPU 0x1c
265
266/* PCI space */
267#define ICH6_PCIREG_TCSEL 0x44
268
269/*
270 * other constants
271 */
272
273/* max number of SDs */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200274/* ICH, ATI and VIA have 4 playback and 4 capture */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200275#define ICH6_NUM_CAPTURE 4
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200276#define ICH6_NUM_PLAYBACK 4
277
278/* ULI has 6 playback and 5 capture */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200279#define ULI_NUM_CAPTURE 5
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200280#define ULI_NUM_PLAYBACK 6
281
Felix Kuehling778b6e12006-05-17 11:22:21 +0200282/* ATI HDMI has 1 playback and 0 capture */
Felix Kuehling778b6e12006-05-17 11:22:21 +0200283#define ATIHDMI_NUM_CAPTURE 0
Felix Kuehling778b6e12006-05-17 11:22:21 +0200284#define ATIHDMI_NUM_PLAYBACK 1
285
Kailang Yangf2690022008-05-27 11:44:55 +0200286/* TERA has 4 playback and 3 capture */
287#define TERA_NUM_CAPTURE 3
288#define TERA_NUM_PLAYBACK 4
289
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200290/* this number is statically defined for simplicity */
291#define MAX_AZX_DEV 16
292
Linus Torvalds1da177e2005-04-16 15:20:36 -0700293/* max number of fragments - we may use more if allocating more pages for BDL */
Takashi Iwai4ce107b2008-02-06 14:50:19 +0100294#define BDL_SIZE 4096
295#define AZX_MAX_BDL_ENTRIES (BDL_SIZE / 16)
296#define AZX_MAX_FRAG 32
Linus Torvalds1da177e2005-04-16 15:20:36 -0700297/* max buffer size - no h/w limit, you can increase as you like */
298#define AZX_MAX_BUF_SIZE (1024*1024*1024)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700299
300/* RIRB int mask: overrun[2], response[0] */
301#define RIRB_INT_RESPONSE 0x01
302#define RIRB_INT_OVERRUN 0x04
303#define RIRB_INT_MASK 0x05
304
Takashi Iwai2f5983f2008-09-03 16:00:44 +0200305/* STATESTS int mask: S3,SD2,SD1,SD0 */
Wei Ni7445dfc2010-03-03 15:05:53 +0800306#define AZX_MAX_CODECS 8
307#define AZX_DEFAULT_CODECS 4
Wu Fengguangdeadff12009-08-01 18:45:16 +0800308#define STATESTS_INT_MASK ((1 << AZX_MAX_CODECS) - 1)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700309
310/* SD_CTL bits */
311#define SD_CTL_STREAM_RESET 0x01 /* stream reset bit */
312#define SD_CTL_DMA_START 0x02 /* stream DMA start bit */
Takashi Iwai850f0e52008-03-18 17:11:05 +0100313#define SD_CTL_STRIPE (3 << 16) /* stripe control */
314#define SD_CTL_TRAFFIC_PRIO (1 << 18) /* traffic priority */
315#define SD_CTL_DIR (1 << 19) /* bi-directional stream */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700316#define SD_CTL_STREAM_TAG_MASK (0xf << 20)
317#define SD_CTL_STREAM_TAG_SHIFT 20
318
319/* SD_CTL and SD_STS */
320#define SD_INT_DESC_ERR 0x10 /* descriptor error interrupt */
321#define SD_INT_FIFO_ERR 0x08 /* FIFO error interrupt */
322#define SD_INT_COMPLETE 0x04 /* completion interrupt */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200323#define SD_INT_MASK (SD_INT_DESC_ERR|SD_INT_FIFO_ERR|\
324 SD_INT_COMPLETE)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700325
326/* SD_STS */
327#define SD_STS_FIFO_READY 0x20 /* FIFO ready */
328
329/* INTCTL and INTSTS */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200330#define ICH6_INT_ALL_STREAM 0xff /* all stream interrupts */
331#define ICH6_INT_CTRL_EN 0x40000000 /* controller interrupt enable bit */
332#define ICH6_INT_GLOBAL_EN 0x80000000 /* global interrupt enable bit */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700333
Linus Torvalds1da177e2005-04-16 15:20:36 -0700334/* below are so far hardcoded - should read registers in future */
335#define ICH6_MAX_CORB_ENTRIES 256
336#define ICH6_MAX_RIRB_ENTRIES 256
337
Takashi Iwaic74db862005-05-12 14:26:27 +0200338/* position fix mode */
339enum {
Takashi Iwai0be3b5d2005-09-05 17:11:40 +0200340 POS_FIX_AUTO,
Takashi Iwaid2e1c972008-06-10 17:53:34 +0200341 POS_FIX_LPIB,
Takashi Iwai0be3b5d2005-09-05 17:11:40 +0200342 POS_FIX_POSBUF,
David Henningsson4cb36312010-09-30 10:12:50 +0200343 POS_FIX_VIACOMBO,
Takashi Iwaia6f2fd52012-02-28 11:58:40 +0100344 POS_FIX_COMBO,
Takashi Iwaic74db862005-05-12 14:26:27 +0200345};
Linus Torvalds1da177e2005-04-16 15:20:36 -0700346
Frederick Lif5d40b32005-05-12 14:55:20 +0200347/* Defines for ATI HD Audio support in SB450 south bridge */
Frederick Lif5d40b32005-05-12 14:55:20 +0200348#define ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR 0x42
349#define ATI_SB450_HDAUDIO_ENABLE_SNOOP 0x02
350
Vinod Gda3fca22005-09-13 18:49:12 +0200351/* Defines for Nvidia HDA support */
352#define NVIDIA_HDA_TRANSREG_ADDR 0x4e
353#define NVIDIA_HDA_ENABLE_COHBITS 0x0f
Peer Chen320dcc32008-08-20 16:43:24 -0700354#define NVIDIA_HDA_ISTRM_COH 0x4d
355#define NVIDIA_HDA_OSTRM_COH 0x4c
356#define NVIDIA_HDA_ENABLE_COHBIT 0x01
Frederick Lif5d40b32005-05-12 14:55:20 +0200357
Takashi Iwai90a5ad52008-02-22 18:36:22 +0100358/* Defines for Intel SCH HDA snoop control */
359#define INTEL_SCH_HDA_DEVC 0x78
360#define INTEL_SCH_HDA_DEVC_NOSNOOP (0x1<<11)
361
Joseph Chan0e153472008-08-26 14:38:03 +0200362/* Define IN stream 0 FIFO size offset in VIA controller */
363#define VIA_IN_STREAM0_FIFO_SIZE_OFFSET 0x90
364/* Define VIA HD Audio Device ID*/
365#define VIA_HDAC_DEVICE_ID 0x3288
366
Yang, Libinc4da29c2008-11-13 11:07:07 +0100367/* HD Audio class code */
368#define PCI_CLASS_MULTIMEDIA_HD_AUDIO 0x0403
Takashi Iwai90a5ad52008-02-22 18:36:22 +0100369
Linus Torvalds1da177e2005-04-16 15:20:36 -0700370/*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700371 */
372
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100373struct azx_dev {
Takashi Iwai4ce107b2008-02-06 14:50:19 +0100374 struct snd_dma_buffer bdl; /* BDL buffer */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200375 u32 *posbuf; /* position buffer pointer */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700376
Takashi Iwaid01ce992007-07-27 16:52:19 +0200377 unsigned int bufsize; /* size of the play buffer in bytes */
Takashi Iwai9ad593f2008-05-16 12:34:47 +0200378 unsigned int period_bytes; /* size of the period in bytes */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200379 unsigned int frags; /* number for period in the play buffer */
380 unsigned int fifo_size; /* FIFO size */
Jaroslav Kyselae5463722010-05-11 10:21:46 +0200381 unsigned long start_wallclk; /* start + minimum wallclk */
382 unsigned long period_wallclk; /* wallclk for period */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700383
Takashi Iwaid01ce992007-07-27 16:52:19 +0200384 void __iomem *sd_addr; /* stream descriptor pointer */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700385
Takashi Iwaid01ce992007-07-27 16:52:19 +0200386 u32 sd_int_sta_mask; /* stream int status mask */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700387
388 /* pcm support */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200389 struct snd_pcm_substream *substream; /* assigned substream,
390 * set in PCM open
391 */
392 unsigned int format_val; /* format value to be set in the
393 * controller and the codec
394 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700395 unsigned char stream_tag; /* assigned stream */
396 unsigned char index; /* stream index */
Takashi Iwaid5cf9912011-10-06 10:07:58 +0200397 int assigned_key; /* last device# key assigned to */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700398
Pavel Machek927fc862006-08-31 17:03:43 +0200399 unsigned int opened :1;
400 unsigned int running :1;
Takashi Iwai675f25d2008-06-10 17:53:20 +0200401 unsigned int irq_pending :1;
Joseph Chan0e153472008-08-26 14:38:03 +0200402 /*
403 * For VIA:
404 * A flag to ensure DMA position is 0
405 * when link position is not greater than FIFO size
406 */
407 unsigned int insufficient :1;
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200408 unsigned int wc_marked:1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700409};
410
411/* CORB/RIRB */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100412struct azx_rb {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700413 u32 *buf; /* CORB/RIRB buffer
414 * Each CORB entry is 4byte, RIRB is 8byte
415 */
416 dma_addr_t addr; /* physical address of CORB/RIRB buffer */
417 /* for RIRB */
418 unsigned short rp, wp; /* read/write pointers */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800419 int cmds[AZX_MAX_CODECS]; /* number of pending requests */
420 u32 res[AZX_MAX_CODECS]; /* last read value */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700421};
422
Takashi Iwai01b65bf2011-11-24 14:31:46 +0100423struct azx_pcm {
424 struct azx *chip;
425 struct snd_pcm *pcm;
426 struct hda_codec *codec;
427 struct hda_pcm_stream *hinfo[2];
428 struct list_head list;
429};
430
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100431struct azx {
432 struct snd_card *card;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700433 struct pci_dev *pci;
Takashi Iwai555e2192008-06-10 17:53:34 +0200434 int dev_index;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700435
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200436 /* chip type specific */
437 int driver_type;
Takashi Iwai9477c582011-05-25 09:11:37 +0200438 unsigned int driver_caps;
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200439 int playback_streams;
440 int playback_index_offset;
441 int capture_streams;
442 int capture_index_offset;
443 int num_streams;
444
Linus Torvalds1da177e2005-04-16 15:20:36 -0700445 /* pci resources */
446 unsigned long addr;
447 void __iomem *remap_addr;
448 int irq;
449
450 /* locks */
451 spinlock_t reg_lock;
Ingo Molnar62932df2006-01-16 16:34:20 +0100452 struct mutex open_mutex;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700453
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200454 /* streams (x num_streams) */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100455 struct azx_dev *azx_dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700456
457 /* PCM */
Takashi Iwai01b65bf2011-11-24 14:31:46 +0100458 struct list_head pcm_list; /* azx_pcm list */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700459
460 /* HD codec */
461 unsigned short codec_mask;
Takashi Iwaif1eaaee2009-02-13 08:16:55 +0100462 int codec_probe_mask; /* copied from probe_mask option */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700463 struct hda_bus *bus;
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +0100464 unsigned int beep_mode;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700465
466 /* CORB/RIRB */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100467 struct azx_rb corb;
468 struct azx_rb rirb;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700469
Takashi Iwai4ce107b2008-02-06 14:50:19 +0100470 /* CORB/RIRB and position buffers */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700471 struct snd_dma_buffer rb;
472 struct snd_dma_buffer posbuf;
Takashi Iwaic74db862005-05-12 14:26:27 +0200473
474 /* flags */
Shahin Ghazinouribeaffc32010-05-11 08:19:55 +0200475 int position_fix[2]; /* for both playback/capture streams */
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200476 int poll_count;
Takashi Iwaicb53c622007-08-10 17:21:45 +0200477 unsigned int running :1;
Pavel Machek927fc862006-08-31 17:03:43 +0200478 unsigned int initialized :1;
479 unsigned int single_cmd :1;
480 unsigned int polling_mode :1;
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200481 unsigned int msi :1;
Takashi Iwaia6a950a2008-06-10 17:53:35 +0200482 unsigned int irq_pending_warned :1;
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +0100483 unsigned int probing :1; /* codec probing phase */
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200484 unsigned int snoop:1;
Takashi Iwai52409aa2012-01-23 17:10:24 +0100485 unsigned int align_buffer_size:1;
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200486 unsigned int region_requested:1;
487
488 /* VGA-switcheroo setup */
489 unsigned int use_vga_switcheroo:1;
490 unsigned int init_failed:1; /* delayed init failed */
491 unsigned int disabled:1; /* disabled by VGA-switcher */
Takashi Iwai43bbb6c2007-07-06 20:22:05 +0200492
493 /* for debugging */
Wu Fengguangfeb27342009-08-01 19:17:14 +0800494 unsigned int last_cmd[AZX_MAX_CODECS];
Takashi Iwai9ad593f2008-05-16 12:34:47 +0200495
496 /* for pending irqs */
497 struct work_struct irq_pending_work;
Takashi Iwai0cbf0092008-10-29 16:18:25 +0100498
499 /* reboot notifier (for mysterious hangup problem at power-down) */
500 struct notifier_block reboot_notifier;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700501};
502
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200503/* driver types */
504enum {
505 AZX_DRIVER_ICH,
Seth Heasley32679f92010-02-22 17:31:09 -0800506 AZX_DRIVER_PCH,
Tobin Davis4979bca2008-01-30 08:13:55 +0100507 AZX_DRIVER_SCH,
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200508 AZX_DRIVER_ATI,
Felix Kuehling778b6e12006-05-17 11:22:21 +0200509 AZX_DRIVER_ATIHDMI,
Andiry Xu1815b342011-12-14 16:10:27 +0800510 AZX_DRIVER_ATIHDMI_NS,
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200511 AZX_DRIVER_VIA,
512 AZX_DRIVER_SIS,
513 AZX_DRIVER_ULI,
Vinod Gda3fca22005-09-13 18:49:12 +0200514 AZX_DRIVER_NVIDIA,
Kailang Yangf2690022008-05-27 11:44:55 +0200515 AZX_DRIVER_TERA,
Takashi Iwai14d34f12010-10-21 09:03:25 +0200516 AZX_DRIVER_CTX,
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200517 AZX_DRIVER_CTHDA,
Yang, Libinc4da29c2008-11-13 11:07:07 +0100518 AZX_DRIVER_GENERIC,
Takashi Iwai2f5983f2008-09-03 16:00:44 +0200519 AZX_NUM_DRIVERS, /* keep this as last entry */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200520};
521
Takashi Iwai9477c582011-05-25 09:11:37 +0200522/* driver quirks (capabilities) */
523/* bits 0-7 are used for indicating driver type */
524#define AZX_DCAPS_NO_TCSEL (1 << 8) /* No Intel TCSEL bit */
525#define AZX_DCAPS_NO_MSI (1 << 9) /* No MSI support */
526#define AZX_DCAPS_ATI_SNOOP (1 << 10) /* ATI snoop enable */
527#define AZX_DCAPS_NVIDIA_SNOOP (1 << 11) /* Nvidia snoop enable */
528#define AZX_DCAPS_SCH_SNOOP (1 << 12) /* SCH/PCH snoop enable */
529#define AZX_DCAPS_RIRB_DELAY (1 << 13) /* Long delay in read loop */
530#define AZX_DCAPS_RIRB_PRE_DELAY (1 << 14) /* Put a delay before read */
531#define AZX_DCAPS_CTX_WORKAROUND (1 << 15) /* X-Fi workaround */
532#define AZX_DCAPS_POSFIX_LPIB (1 << 16) /* Use LPIB as default */
533#define AZX_DCAPS_POSFIX_VIA (1 << 17) /* Use VIACOMBO as default */
534#define AZX_DCAPS_NO_64BIT (1 << 18) /* No 64bit address */
535#define AZX_DCAPS_SYNC_WRITE (1 << 19) /* sync each cmd write */
Takashi Iwai8b0bd222011-06-10 14:56:26 +0200536#define AZX_DCAPS_OLD_SSYNC (1 << 20) /* Old SSYNC reg for ICH */
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -0500537#define AZX_DCAPS_BUFSIZE (1 << 21) /* no buffer size alignment */
Takashi Iwai7bfe0592012-01-23 17:53:39 +0100538#define AZX_DCAPS_ALIGN_BUFSIZE (1 << 22) /* buffer size alignment */
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200539#define AZX_DCAPS_4K_BDLE_BOUNDARY (1 << 23) /* BDLE in 4k boundary */
Seth Heasleyc20c5a82012-06-14 14:23:53 -0700540#define AZX_DCAPS_POSFIX_COMBO (1 << 24) /* Use COMBO as default */
Takashi Iwai9477c582011-05-25 09:11:37 +0200541
542/* quirks for ATI SB / AMD Hudson */
543#define AZX_DCAPS_PRESET_ATI_SB \
544 (AZX_DCAPS_ATI_SNOOP | AZX_DCAPS_NO_TCSEL | \
545 AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB)
546
547/* quirks for ATI/AMD HDMI */
548#define AZX_DCAPS_PRESET_ATI_HDMI \
549 (AZX_DCAPS_NO_TCSEL | AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB)
550
551/* quirks for Nvidia */
552#define AZX_DCAPS_PRESET_NVIDIA \
Takashi Iwai7bfe0592012-01-23 17:53:39 +0100553 (AZX_DCAPS_NVIDIA_SNOOP | AZX_DCAPS_RIRB_DELAY | AZX_DCAPS_NO_MSI |\
554 AZX_DCAPS_ALIGN_BUFSIZE)
Takashi Iwai9477c582011-05-25 09:11:37 +0200555
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200556#define AZX_DCAPS_PRESET_CTHDA \
557 (AZX_DCAPS_NO_MSI | AZX_DCAPS_POSFIX_LPIB | AZX_DCAPS_4K_BDLE_BOUNDARY)
558
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200559/*
560 * VGA-switcher support
561 */
562#ifdef SUPPORT_VGA_SWITCHEROO
563#define DELAYED_INIT_MARK
564#define DELAYED_INITDATA_MARK
565#define use_vga_switcheroo(chip) ((chip)->use_vga_switcheroo)
566#else
567#define DELAYED_INIT_MARK __devinit
568#define DELAYED_INITDATA_MARK __devinitdata
569#define use_vga_switcheroo(chip) 0
570#endif
571
572static char *driver_short_names[] DELAYED_INITDATA_MARK = {
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200573 [AZX_DRIVER_ICH] = "HDA Intel",
Seth Heasley32679f92010-02-22 17:31:09 -0800574 [AZX_DRIVER_PCH] = "HDA Intel PCH",
Tobin Davis4979bca2008-01-30 08:13:55 +0100575 [AZX_DRIVER_SCH] = "HDA Intel MID",
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200576 [AZX_DRIVER_ATI] = "HDA ATI SB",
Felix Kuehling778b6e12006-05-17 11:22:21 +0200577 [AZX_DRIVER_ATIHDMI] = "HDA ATI HDMI",
Andiry Xu1815b342011-12-14 16:10:27 +0800578 [AZX_DRIVER_ATIHDMI_NS] = "HDA ATI HDMI",
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200579 [AZX_DRIVER_VIA] = "HDA VIA VT82xx",
580 [AZX_DRIVER_SIS] = "HDA SIS966",
Vinod Gda3fca22005-09-13 18:49:12 +0200581 [AZX_DRIVER_ULI] = "HDA ULI M5461",
582 [AZX_DRIVER_NVIDIA] = "HDA NVidia",
Kailang Yangf2690022008-05-27 11:44:55 +0200583 [AZX_DRIVER_TERA] = "HDA Teradici",
Takashi Iwai14d34f12010-10-21 09:03:25 +0200584 [AZX_DRIVER_CTX] = "HDA Creative",
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200585 [AZX_DRIVER_CTHDA] = "HDA Creative",
Yang, Libinc4da29c2008-11-13 11:07:07 +0100586 [AZX_DRIVER_GENERIC] = "HD-Audio Generic",
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200587};
588
Linus Torvalds1da177e2005-04-16 15:20:36 -0700589/*
590 * macros for easy use
591 */
592#define azx_writel(chip,reg,value) \
593 writel(value, (chip)->remap_addr + ICH6_REG_##reg)
594#define azx_readl(chip,reg) \
595 readl((chip)->remap_addr + ICH6_REG_##reg)
596#define azx_writew(chip,reg,value) \
597 writew(value, (chip)->remap_addr + ICH6_REG_##reg)
598#define azx_readw(chip,reg) \
599 readw((chip)->remap_addr + ICH6_REG_##reg)
600#define azx_writeb(chip,reg,value) \
601 writeb(value, (chip)->remap_addr + ICH6_REG_##reg)
602#define azx_readb(chip,reg) \
603 readb((chip)->remap_addr + ICH6_REG_##reg)
604
605#define azx_sd_writel(dev,reg,value) \
606 writel(value, (dev)->sd_addr + ICH6_REG_##reg)
607#define azx_sd_readl(dev,reg) \
608 readl((dev)->sd_addr + ICH6_REG_##reg)
609#define azx_sd_writew(dev,reg,value) \
610 writew(value, (dev)->sd_addr + ICH6_REG_##reg)
611#define azx_sd_readw(dev,reg) \
612 readw((dev)->sd_addr + ICH6_REG_##reg)
613#define azx_sd_writeb(dev,reg,value) \
614 writeb(value, (dev)->sd_addr + ICH6_REG_##reg)
615#define azx_sd_readb(dev,reg) \
616 readb((dev)->sd_addr + ICH6_REG_##reg)
617
618/* for pcm support */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100619#define get_azx_dev(substream) (substream->runtime->private_data)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700620
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200621#ifdef CONFIG_X86
622static void __mark_pages_wc(struct azx *chip, void *addr, size_t size, bool on)
623{
624 if (azx_snoop(chip))
625 return;
626 if (addr && size) {
627 int pages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
628 if (on)
629 set_memory_wc((unsigned long)addr, pages);
630 else
631 set_memory_wb((unsigned long)addr, pages);
632 }
633}
634
635static inline void mark_pages_wc(struct azx *chip, struct snd_dma_buffer *buf,
636 bool on)
637{
638 __mark_pages_wc(chip, buf->area, buf->bytes, on);
639}
640static inline void mark_runtime_wc(struct azx *chip, struct azx_dev *azx_dev,
641 struct snd_pcm_runtime *runtime, bool on)
642{
643 if (azx_dev->wc_marked != on) {
644 __mark_pages_wc(chip, runtime->dma_area, runtime->dma_bytes, on);
645 azx_dev->wc_marked = on;
646 }
647}
648#else
649/* NOP for other archs */
650static inline void mark_pages_wc(struct azx *chip, struct snd_dma_buffer *buf,
651 bool on)
652{
653}
654static inline void mark_runtime_wc(struct azx *chip, struct azx_dev *azx_dev,
655 struct snd_pcm_runtime *runtime, bool on)
656{
657}
658#endif
659
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200660static int azx_acquire_irq(struct azx *chip, int do_disconnect);
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200661static int azx_send_cmd(struct hda_bus *bus, unsigned int val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700662/*
663 * Interface for HD codec
664 */
665
Linus Torvalds1da177e2005-04-16 15:20:36 -0700666/*
667 * CORB / RIRB interface
668 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100669static int azx_alloc_cmd_io(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700670{
671 int err;
672
673 /* single page (at least 4096 bytes) must suffice for both ringbuffes */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200674 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
675 snd_dma_pci_data(chip->pci),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700676 PAGE_SIZE, &chip->rb);
677 if (err < 0) {
678 snd_printk(KERN_ERR SFX "cannot allocate CORB/RIRB\n");
679 return err;
680 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200681 mark_pages_wc(chip, &chip->rb, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700682 return 0;
683}
684
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100685static void azx_init_cmd_io(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700686{
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800687 spin_lock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700688 /* CORB set up */
689 chip->corb.addr = chip->rb.addr;
690 chip->corb.buf = (u32 *)chip->rb.area;
691 azx_writel(chip, CORBLBASE, (u32)chip->corb.addr);
Takashi Iwai766979e2008-06-13 20:53:56 +0200692 azx_writel(chip, CORBUBASE, upper_32_bits(chip->corb.addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700693
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200694 /* set the corb size to 256 entries (ULI requires explicitly) */
695 azx_writeb(chip, CORBSIZE, 0x02);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700696 /* set the corb write pointer to 0 */
697 azx_writew(chip, CORBWP, 0);
698 /* reset the corb hw read pointer */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200699 azx_writew(chip, CORBRP, ICH6_CORBRP_RST);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700700 /* enable corb dma */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200701 azx_writeb(chip, CORBCTL, ICH6_CORBCTL_RUN);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700702
703 /* RIRB set up */
704 chip->rirb.addr = chip->rb.addr + 2048;
705 chip->rirb.buf = (u32 *)(chip->rb.area + 2048);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800706 chip->rirb.wp = chip->rirb.rp = 0;
707 memset(chip->rirb.cmds, 0, sizeof(chip->rirb.cmds));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700708 azx_writel(chip, RIRBLBASE, (u32)chip->rirb.addr);
Takashi Iwai766979e2008-06-13 20:53:56 +0200709 azx_writel(chip, RIRBUBASE, upper_32_bits(chip->rirb.addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700710
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200711 /* set the rirb size to 256 entries (ULI requires explicitly) */
712 azx_writeb(chip, RIRBSIZE, 0x02);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700713 /* reset the rirb hw write pointer */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200714 azx_writew(chip, RIRBWP, ICH6_RIRBWP_RST);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700715 /* set N=1, get RIRB response interrupt for new entry */
Takashi Iwai9477c582011-05-25 09:11:37 +0200716 if (chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND)
Takashi Iwai14d34f12010-10-21 09:03:25 +0200717 azx_writew(chip, RINTCNT, 0xc0);
718 else
719 azx_writew(chip, RINTCNT, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700720 /* enable rirb dma and response irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700721 azx_writeb(chip, RIRBCTL, ICH6_RBCTL_DMA_EN | ICH6_RBCTL_IRQ_EN);
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800722 spin_unlock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700723}
724
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100725static void azx_free_cmd_io(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700726{
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800727 spin_lock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700728 /* disable ringbuffer DMAs */
729 azx_writeb(chip, RIRBCTL, 0);
730 azx_writeb(chip, CORBCTL, 0);
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800731 spin_unlock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700732}
733
Wu Fengguangdeadff12009-08-01 18:45:16 +0800734static unsigned int azx_command_addr(u32 cmd)
735{
736 unsigned int addr = cmd >> 28;
737
738 if (addr >= AZX_MAX_CODECS) {
739 snd_BUG();
740 addr = 0;
741 }
742
743 return addr;
744}
745
746static unsigned int azx_response_addr(u32 res)
747{
748 unsigned int addr = res & 0xf;
749
750 if (addr >= AZX_MAX_CODECS) {
751 snd_BUG();
752 addr = 0;
753 }
754
755 return addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700756}
757
758/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100759static int azx_corb_send_cmd(struct hda_bus *bus, u32 val)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700760{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100761 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800762 unsigned int addr = azx_command_addr(val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700763 unsigned int wp;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700764
Wu Fengguangc32649f2009-08-01 18:48:12 +0800765 spin_lock_irq(&chip->reg_lock);
766
Linus Torvalds1da177e2005-04-16 15:20:36 -0700767 /* add command to corb */
768 wp = azx_readb(chip, CORBWP);
769 wp++;
770 wp %= ICH6_MAX_CORB_ENTRIES;
771
Wu Fengguangdeadff12009-08-01 18:45:16 +0800772 chip->rirb.cmds[addr]++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700773 chip->corb.buf[wp] = cpu_to_le32(val);
774 azx_writel(chip, CORBWP, wp);
Wu Fengguangc32649f2009-08-01 18:48:12 +0800775
Linus Torvalds1da177e2005-04-16 15:20:36 -0700776 spin_unlock_irq(&chip->reg_lock);
777
778 return 0;
779}
780
781#define ICH6_RIRB_EX_UNSOL_EV (1<<4)
782
783/* retrieve RIRB entry - called from interrupt handler */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100784static void azx_update_rirb(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700785{
786 unsigned int rp, wp;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800787 unsigned int addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700788 u32 res, res_ex;
789
790 wp = azx_readb(chip, RIRBWP);
791 if (wp == chip->rirb.wp)
792 return;
793 chip->rirb.wp = wp;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800794
Linus Torvalds1da177e2005-04-16 15:20:36 -0700795 while (chip->rirb.rp != wp) {
796 chip->rirb.rp++;
797 chip->rirb.rp %= ICH6_MAX_RIRB_ENTRIES;
798
799 rp = chip->rirb.rp << 1; /* an RIRB entry is 8-bytes */
800 res_ex = le32_to_cpu(chip->rirb.buf[rp + 1]);
801 res = le32_to_cpu(chip->rirb.buf[rp]);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800802 addr = azx_response_addr(res_ex);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700803 if (res_ex & ICH6_RIRB_EX_UNSOL_EV)
804 snd_hda_queue_unsol_event(chip->bus, res, res_ex);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800805 else if (chip->rirb.cmds[addr]) {
806 chip->rirb.res[addr] = res;
Takashi Iwai2add9b92008-03-18 09:47:06 +0100807 smp_wmb();
Wu Fengguangdeadff12009-08-01 18:45:16 +0800808 chip->rirb.cmds[addr]--;
Wu Fengguange310bb02009-08-01 19:18:45 +0800809 } else
810 snd_printk(KERN_ERR SFX "spurious response %#x:%#x, "
811 "last cmd=%#08x\n",
812 res, res_ex,
813 chip->last_cmd[addr]);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700814 }
815}
816
817/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800818static unsigned int azx_rirb_get_response(struct hda_bus *bus,
819 unsigned int addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700820{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100821 struct azx *chip = bus->private_data;
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200822 unsigned long timeout;
David Henningsson32cf4022012-05-04 11:05:55 +0200823 unsigned long loopcounter;
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200824 int do_poll = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700825
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200826 again:
827 timeout = jiffies + msecs_to_jiffies(1000);
David Henningsson32cf4022012-05-04 11:05:55 +0200828
829 for (loopcounter = 0;; loopcounter++) {
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200830 if (chip->polling_mode || do_poll) {
Takashi Iwaie96224a2006-08-21 17:57:44 +0200831 spin_lock_irq(&chip->reg_lock);
832 azx_update_rirb(chip);
833 spin_unlock_irq(&chip->reg_lock);
834 }
Wu Fengguangdeadff12009-08-01 18:45:16 +0800835 if (!chip->rirb.cmds[addr]) {
Takashi Iwai2add9b92008-03-18 09:47:06 +0100836 smp_rmb();
Takashi Iwaib6132912009-03-24 07:36:09 +0100837 bus->rirb_error = 0;
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200838
839 if (!do_poll)
840 chip->poll_count = 0;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800841 return chip->rirb.res[addr]; /* the last value */
Takashi Iwai2add9b92008-03-18 09:47:06 +0100842 }
Takashi Iwai28a0d9d2008-01-18 15:32:32 +0100843 if (time_after(jiffies, timeout))
844 break;
David Henningsson32cf4022012-05-04 11:05:55 +0200845 if (bus->needs_damn_long_delay || loopcounter > 3000)
Takashi Iwai52987652008-01-16 16:09:47 +0100846 msleep(2); /* temporary workaround */
847 else {
848 udelay(10);
849 cond_resched();
850 }
Takashi Iwai28a0d9d2008-01-18 15:32:32 +0100851 }
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200852
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200853 if (!chip->polling_mode && chip->poll_count < 2) {
854 snd_printdd(SFX "azx_get_response timeout, "
855 "polling the codec once: last cmd=0x%08x\n",
856 chip->last_cmd[addr]);
857 do_poll = 1;
858 chip->poll_count++;
859 goto again;
860 }
861
862
Takashi Iwai23c4a882009-10-30 13:21:49 +0100863 if (!chip->polling_mode) {
864 snd_printk(KERN_WARNING SFX "azx_get_response timeout, "
865 "switching to polling mode: last cmd=0x%08x\n",
866 chip->last_cmd[addr]);
867 chip->polling_mode = 1;
868 goto again;
869 }
870
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200871 if (chip->msi) {
Takashi Iwai4abc1cc2009-05-19 12:16:46 +0200872 snd_printk(KERN_WARNING SFX "No response from codec, "
Wu Fengguangfeb27342009-08-01 19:17:14 +0800873 "disabling MSI: last cmd=0x%08x\n",
874 chip->last_cmd[addr]);
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200875 free_irq(chip->irq, chip);
876 chip->irq = -1;
877 pci_disable_msi(chip->pci);
878 chip->msi = 0;
Takashi Iwaib6132912009-03-24 07:36:09 +0100879 if (azx_acquire_irq(chip, 1) < 0) {
880 bus->rirb_error = 1;
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200881 return -1;
Takashi Iwaib6132912009-03-24 07:36:09 +0100882 }
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200883 goto again;
884 }
885
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +0100886 if (chip->probing) {
887 /* If this critical timeout happens during the codec probing
888 * phase, this is likely an access to a non-existing codec
889 * slot. Better to return an error and reset the system.
890 */
891 return -1;
892 }
893
Takashi Iwai8dd78332009-06-02 01:16:07 +0200894 /* a fatal communication error; need either to reset or to fallback
895 * to the single_cmd mode
896 */
Takashi Iwaib6132912009-03-24 07:36:09 +0100897 bus->rirb_error = 1;
Takashi Iwaib20f3b82009-06-02 01:20:22 +0200898 if (bus->allow_bus_reset && !bus->response_reset && !bus->in_reset) {
Takashi Iwai8dd78332009-06-02 01:16:07 +0200899 bus->response_reset = 1;
900 return -1; /* give a chance to retry */
901 }
902
903 snd_printk(KERN_ERR "hda_intel: azx_get_response timeout, "
904 "switching to single_cmd mode: last cmd=0x%08x\n",
Wu Fengguangfeb27342009-08-01 19:17:14 +0800905 chip->last_cmd[addr]);
Takashi Iwai8dd78332009-06-02 01:16:07 +0200906 chip->single_cmd = 1;
907 bus->response_reset = 0;
Takashi Iwai1a696972009-11-07 09:49:04 +0100908 /* release CORB/RIRB */
Takashi Iwai4fcd3922009-05-25 18:34:52 +0200909 azx_free_cmd_io(chip);
Takashi Iwai1a696972009-11-07 09:49:04 +0100910 /* disable unsolicited responses */
911 azx_writel(chip, GCTL, azx_readl(chip, GCTL) & ~ICH6_GCTL_UNSOL);
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200912 return -1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700913}
914
Linus Torvalds1da177e2005-04-16 15:20:36 -0700915/*
916 * Use the single immediate command instead of CORB/RIRB for simplicity
917 *
918 * Note: according to Intel, this is not preferred use. The command was
919 * intended for the BIOS only, and may get confused with unsolicited
920 * responses. So, we shouldn't use it for normal operation from the
921 * driver.
922 * I left the codes, however, for debugging/testing purposes.
923 */
924
Takashi Iwaib05a7d42009-05-28 11:59:12 +0200925/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800926static int azx_single_wait_for_response(struct azx *chip, unsigned int addr)
Takashi Iwaib05a7d42009-05-28 11:59:12 +0200927{
928 int timeout = 50;
929
930 while (timeout--) {
931 /* check IRV busy bit */
932 if (azx_readw(chip, IRS) & ICH6_IRS_VALID) {
933 /* reuse rirb.res as the response return value */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800934 chip->rirb.res[addr] = azx_readl(chip, IR);
Takashi Iwaib05a7d42009-05-28 11:59:12 +0200935 return 0;
936 }
937 udelay(1);
938 }
939 if (printk_ratelimit())
940 snd_printd(SFX "get_response timeout: IRS=0x%x\n",
941 azx_readw(chip, IRS));
Wu Fengguangdeadff12009-08-01 18:45:16 +0800942 chip->rirb.res[addr] = -1;
Takashi Iwaib05a7d42009-05-28 11:59:12 +0200943 return -EIO;
944}
945
Linus Torvalds1da177e2005-04-16 15:20:36 -0700946/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100947static int azx_single_send_cmd(struct hda_bus *bus, u32 val)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700948{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100949 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800950 unsigned int addr = azx_command_addr(val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700951 int timeout = 50;
952
Takashi Iwai8dd78332009-06-02 01:16:07 +0200953 bus->rirb_error = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700954 while (timeout--) {
955 /* check ICB busy bit */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200956 if (!((azx_readw(chip, IRS) & ICH6_IRS_BUSY))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700957 /* Clear IRV valid bit */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200958 azx_writew(chip, IRS, azx_readw(chip, IRS) |
959 ICH6_IRS_VALID);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700960 azx_writel(chip, IC, val);
Takashi Iwaid01ce992007-07-27 16:52:19 +0200961 azx_writew(chip, IRS, azx_readw(chip, IRS) |
962 ICH6_IRS_BUSY);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800963 return azx_single_wait_for_response(chip, addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700964 }
965 udelay(1);
966 }
Marc Boucher1cfd52b2008-01-22 15:29:26 +0100967 if (printk_ratelimit())
968 snd_printd(SFX "send_cmd timeout: IRS=0x%x, val=0x%x\n",
969 azx_readw(chip, IRS), val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700970 return -EIO;
971}
972
973/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800974static unsigned int azx_single_get_response(struct hda_bus *bus,
975 unsigned int addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700976{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100977 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800978 return chip->rirb.res[addr];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700979}
980
Takashi Iwai111d3af2006-02-16 18:17:58 +0100981/*
982 * The below are the main callbacks from hda_codec.
983 *
984 * They are just the skeleton to call sub-callbacks according to the
985 * current setting of chip->single_cmd.
986 */
987
988/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100989static int azx_send_cmd(struct hda_bus *bus, unsigned int val)
Takashi Iwai111d3af2006-02-16 18:17:58 +0100990{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100991 struct azx *chip = bus->private_data;
Takashi Iwai43bbb6c2007-07-06 20:22:05 +0200992
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200993 if (chip->disabled)
994 return 0;
Wu Fengguangfeb27342009-08-01 19:17:14 +0800995 chip->last_cmd[azx_command_addr(val)] = val;
Takashi Iwai111d3af2006-02-16 18:17:58 +0100996 if (chip->single_cmd)
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100997 return azx_single_send_cmd(bus, val);
Takashi Iwai111d3af2006-02-16 18:17:58 +0100998 else
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100999 return azx_corb_send_cmd(bus, val);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001000}
1001
1002/* get a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +08001003static unsigned int azx_get_response(struct hda_bus *bus,
1004 unsigned int addr)
Takashi Iwai111d3af2006-02-16 18:17:58 +01001005{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001006 struct azx *chip = bus->private_data;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001007 if (chip->disabled)
1008 return 0;
Takashi Iwai111d3af2006-02-16 18:17:58 +01001009 if (chip->single_cmd)
Wu Fengguangdeadff12009-08-01 18:45:16 +08001010 return azx_single_get_response(bus, addr);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001011 else
Wu Fengguangdeadff12009-08-01 18:45:16 +08001012 return azx_rirb_get_response(bus, addr);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001013}
1014
Takashi Iwaicb53c622007-08-10 17:21:45 +02001015#ifdef CONFIG_SND_HDA_POWER_SAVE
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001016static void azx_power_notify(struct hda_bus *bus);
Takashi Iwaicb53c622007-08-10 17:21:45 +02001017#endif
Takashi Iwai111d3af2006-02-16 18:17:58 +01001018
Linus Torvalds1da177e2005-04-16 15:20:36 -07001019/* reset codec link */
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001020static int azx_reset(struct azx *chip, int full_reset)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001021{
1022 int count;
1023
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001024 if (!full_reset)
1025 goto __skip;
1026
Danny Tholene8a7f132007-09-11 21:41:56 +02001027 /* clear STATESTS */
1028 azx_writeb(chip, STATESTS, STATESTS_INT_MASK);
1029
Linus Torvalds1da177e2005-04-16 15:20:36 -07001030 /* reset controller */
1031 azx_writel(chip, GCTL, azx_readl(chip, GCTL) & ~ICH6_GCTL_RESET);
1032
1033 count = 50;
1034 while (azx_readb(chip, GCTL) && --count)
1035 msleep(1);
1036
1037 /* delay for >= 100us for codec PLL to settle per spec
1038 * Rev 0.9 section 5.5.1
1039 */
1040 msleep(1);
1041
1042 /* Bring controller out of reset */
1043 azx_writeb(chip, GCTL, azx_readb(chip, GCTL) | ICH6_GCTL_RESET);
1044
1045 count = 50;
Pavel Machek927fc862006-08-31 17:03:43 +02001046 while (!azx_readb(chip, GCTL) && --count)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001047 msleep(1);
1048
Pavel Machek927fc862006-08-31 17:03:43 +02001049 /* Brent Chartrand said to wait >= 540us for codecs to initialize */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001050 msleep(1);
1051
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001052 __skip:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001053 /* check to see if controller is ready */
Pavel Machek927fc862006-08-31 17:03:43 +02001054 if (!azx_readb(chip, GCTL)) {
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001055 snd_printd(SFX "azx_reset: controller not ready!\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001056 return -EBUSY;
1057 }
1058
Matt41e2fce2005-07-04 17:49:55 +02001059 /* Accept unsolicited responses */
Takashi Iwai1a696972009-11-07 09:49:04 +01001060 if (!chip->single_cmd)
1061 azx_writel(chip, GCTL, azx_readl(chip, GCTL) |
1062 ICH6_GCTL_UNSOL);
Matt41e2fce2005-07-04 17:49:55 +02001063
Linus Torvalds1da177e2005-04-16 15:20:36 -07001064 /* detect codecs */
Pavel Machek927fc862006-08-31 17:03:43 +02001065 if (!chip->codec_mask) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001066 chip->codec_mask = azx_readw(chip, STATESTS);
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001067 snd_printdd(SFX "codec_mask = 0x%x\n", chip->codec_mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001068 }
1069
1070 return 0;
1071}
1072
1073
1074/*
1075 * Lowlevel interface
1076 */
1077
1078/* enable interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001079static void azx_int_enable(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001080{
1081 /* enable controller CIE and GIE */
1082 azx_writel(chip, INTCTL, azx_readl(chip, INTCTL) |
1083 ICH6_INT_CTRL_EN | ICH6_INT_GLOBAL_EN);
1084}
1085
1086/* disable interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001087static void azx_int_disable(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001088{
1089 int i;
1090
1091 /* disable interrupts in stream descriptor */
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001092 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001093 struct azx_dev *azx_dev = &chip->azx_dev[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001094 azx_sd_writeb(azx_dev, SD_CTL,
1095 azx_sd_readb(azx_dev, SD_CTL) & ~SD_INT_MASK);
1096 }
1097
1098 /* disable SIE for all streams */
1099 azx_writeb(chip, INTCTL, 0);
1100
1101 /* disable controller CIE and GIE */
1102 azx_writel(chip, INTCTL, azx_readl(chip, INTCTL) &
1103 ~(ICH6_INT_CTRL_EN | ICH6_INT_GLOBAL_EN));
1104}
1105
1106/* clear interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001107static void azx_int_clear(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001108{
1109 int i;
1110
1111 /* clear stream status */
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001112 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001113 struct azx_dev *azx_dev = &chip->azx_dev[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001114 azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK);
1115 }
1116
1117 /* clear STATESTS */
1118 azx_writeb(chip, STATESTS, STATESTS_INT_MASK);
1119
1120 /* clear rirb status */
1121 azx_writeb(chip, RIRBSTS, RIRB_INT_MASK);
1122
1123 /* clear int status */
1124 azx_writel(chip, INTSTS, ICH6_INT_CTRL_EN | ICH6_INT_ALL_STREAM);
1125}
1126
1127/* start a stream */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001128static void azx_stream_start(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001129{
Joseph Chan0e153472008-08-26 14:38:03 +02001130 /*
1131 * Before stream start, initialize parameter
1132 */
1133 azx_dev->insufficient = 1;
1134
Linus Torvalds1da177e2005-04-16 15:20:36 -07001135 /* enable SIE */
Wei Niccc5df02010-01-26 15:59:33 +08001136 azx_writel(chip, INTCTL,
1137 azx_readl(chip, INTCTL) | (1 << azx_dev->index));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001138 /* set DMA start and interrupt mask */
1139 azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) |
1140 SD_CTL_DMA_START | SD_INT_MASK);
1141}
1142
Takashi Iwai1dddab42009-03-18 15:15:37 +01001143/* stop DMA */
1144static void azx_stream_clear(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001145{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001146 azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) &
1147 ~(SD_CTL_DMA_START | SD_INT_MASK));
1148 azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK); /* to be sure */
Takashi Iwai1dddab42009-03-18 15:15:37 +01001149}
1150
1151/* stop a stream */
1152static void azx_stream_stop(struct azx *chip, struct azx_dev *azx_dev)
1153{
1154 azx_stream_clear(chip, azx_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001155 /* disable SIE */
Wei Niccc5df02010-01-26 15:59:33 +08001156 azx_writel(chip, INTCTL,
1157 azx_readl(chip, INTCTL) & ~(1 << azx_dev->index));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001158}
1159
1160
1161/*
Takashi Iwaicb53c622007-08-10 17:21:45 +02001162 * reset and start the controller registers
Linus Torvalds1da177e2005-04-16 15:20:36 -07001163 */
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001164static void azx_init_chip(struct azx *chip, int full_reset)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001165{
Takashi Iwaicb53c622007-08-10 17:21:45 +02001166 if (chip->initialized)
1167 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001168
1169 /* reset controller */
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001170 azx_reset(chip, full_reset);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001171
1172 /* initialize interrupts */
1173 azx_int_clear(chip);
1174 azx_int_enable(chip);
1175
1176 /* initialize the codec command I/O */
Takashi Iwai1a696972009-11-07 09:49:04 +01001177 if (!chip->single_cmd)
1178 azx_init_cmd_io(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001179
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02001180 /* program the position buffer */
1181 azx_writel(chip, DPLBASE, (u32)chip->posbuf.addr);
Takashi Iwai766979e2008-06-13 20:53:56 +02001182 azx_writel(chip, DPUBASE, upper_32_bits(chip->posbuf.addr));
Frederick Lif5d40b32005-05-12 14:55:20 +02001183
Takashi Iwaicb53c622007-08-10 17:21:45 +02001184 chip->initialized = 1;
1185}
1186
1187/*
1188 * initialize the PCI registers
1189 */
1190/* update bits in a PCI register byte */
1191static void update_pci_byte(struct pci_dev *pci, unsigned int reg,
1192 unsigned char mask, unsigned char val)
1193{
1194 unsigned char data;
1195
1196 pci_read_config_byte(pci, reg, &data);
1197 data &= ~mask;
1198 data |= (val & mask);
1199 pci_write_config_byte(pci, reg, data);
1200}
1201
1202static void azx_init_pci(struct azx *chip)
1203{
1204 /* Clear bits 0-2 of PCI register TCSEL (at offset 0x44)
1205 * TCSEL == Traffic Class Select Register, which sets PCI express QOS
1206 * Ensuring these bits are 0 clears playback static on some HD Audio
Adam Lackorzynskia09e89f2011-03-10 17:41:56 +01001207 * codecs.
1208 * The PCI register TCSEL is defined in the Intel manuals.
Takashi Iwaicb53c622007-08-10 17:21:45 +02001209 */
Linus Torvalds46f2cc82011-05-27 19:45:28 -07001210 if (!(chip->driver_caps & AZX_DCAPS_NO_TCSEL)) {
Takashi Iwai9477c582011-05-25 09:11:37 +02001211 snd_printdd(SFX "Clearing TCSEL\n");
Adam Lackorzynskia09e89f2011-03-10 17:41:56 +01001212 update_pci_byte(chip->pci, ICH6_PCIREG_TCSEL, 0x07, 0);
Takashi Iwai9477c582011-05-25 09:11:37 +02001213 }
Takashi Iwaicb53c622007-08-10 17:21:45 +02001214
Takashi Iwai9477c582011-05-25 09:11:37 +02001215 /* For ATI SB450/600/700/800/900 and AMD Hudson azalia HD audio,
1216 * we need to enable snoop.
1217 */
1218 if (chip->driver_caps & AZX_DCAPS_ATI_SNOOP) {
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001219 snd_printdd(SFX "Setting ATI snoop: %d\n", azx_snoop(chip));
Takashi Iwaicb53c622007-08-10 17:21:45 +02001220 update_pci_byte(chip->pci,
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001221 ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR, 0x07,
1222 azx_snoop(chip) ? ATI_SB450_HDAUDIO_ENABLE_SNOOP : 0);
Takashi Iwai9477c582011-05-25 09:11:37 +02001223 }
1224
1225 /* For NVIDIA HDA, enable snoop */
1226 if (chip->driver_caps & AZX_DCAPS_NVIDIA_SNOOP) {
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001227 snd_printdd(SFX "Setting Nvidia snoop: %d\n", azx_snoop(chip));
Takashi Iwaicb53c622007-08-10 17:21:45 +02001228 update_pci_byte(chip->pci,
1229 NVIDIA_HDA_TRANSREG_ADDR,
1230 0x0f, NVIDIA_HDA_ENABLE_COHBITS);
Peer Chen320dcc32008-08-20 16:43:24 -07001231 update_pci_byte(chip->pci,
1232 NVIDIA_HDA_ISTRM_COH,
1233 0x01, NVIDIA_HDA_ENABLE_COHBIT);
1234 update_pci_byte(chip->pci,
1235 NVIDIA_HDA_OSTRM_COH,
1236 0x01, NVIDIA_HDA_ENABLE_COHBIT);
Takashi Iwai9477c582011-05-25 09:11:37 +02001237 }
1238
1239 /* Enable SCH/PCH snoop if needed */
1240 if (chip->driver_caps & AZX_DCAPS_SCH_SNOOP) {
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001241 unsigned short snoop;
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001242 pci_read_config_word(chip->pci, INTEL_SCH_HDA_DEVC, &snoop);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001243 if ((!azx_snoop(chip) && !(snoop & INTEL_SCH_HDA_DEVC_NOSNOOP)) ||
1244 (azx_snoop(chip) && (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP))) {
1245 snoop &= ~INTEL_SCH_HDA_DEVC_NOSNOOP;
1246 if (!azx_snoop(chip))
1247 snoop |= INTEL_SCH_HDA_DEVC_NOSNOOP;
1248 pci_write_config_word(chip->pci, INTEL_SCH_HDA_DEVC, snoop);
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001249 pci_read_config_word(chip->pci,
1250 INTEL_SCH_HDA_DEVC, &snoop);
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001251 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001252 snd_printdd(SFX "SCH snoop: %s\n",
1253 (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP)
1254 ? "Disabled" : "Enabled");
Vinod Gda3fca22005-09-13 18:49:12 +02001255 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001256}
1257
1258
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001259static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev);
1260
Linus Torvalds1da177e2005-04-16 15:20:36 -07001261/*
1262 * interrupt handler
1263 */
David Howells7d12e782006-10-05 14:55:46 +01001264static irqreturn_t azx_interrupt(int irq, void *dev_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001265{
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001266 struct azx *chip = dev_id;
1267 struct azx_dev *azx_dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001268 u32 status;
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001269 u8 sd_status;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001270 int i, ok;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001271
1272 spin_lock(&chip->reg_lock);
1273
Dan Carpenter60911062012-05-18 10:36:11 +03001274 if (chip->disabled) {
1275 spin_unlock(&chip->reg_lock);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001276 return IRQ_NONE;
Dan Carpenter60911062012-05-18 10:36:11 +03001277 }
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001278
Linus Torvalds1da177e2005-04-16 15:20:36 -07001279 status = azx_readl(chip, INTSTS);
1280 if (status == 0) {
1281 spin_unlock(&chip->reg_lock);
1282 return IRQ_NONE;
1283 }
1284
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001285 for (i = 0; i < chip->num_streams; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001286 azx_dev = &chip->azx_dev[i];
1287 if (status & azx_dev->sd_int_sta_mask) {
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001288 sd_status = azx_sd_readb(azx_dev, SD_STS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001289 azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK);
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001290 if (!azx_dev->substream || !azx_dev->running ||
1291 !(sd_status & SD_INT_COMPLETE))
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001292 continue;
1293 /* check whether this IRQ is really acceptable */
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001294 ok = azx_position_ok(chip, azx_dev);
1295 if (ok == 1) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001296 azx_dev->irq_pending = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001297 spin_unlock(&chip->reg_lock);
1298 snd_pcm_period_elapsed(azx_dev->substream);
1299 spin_lock(&chip->reg_lock);
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001300 } else if (ok == 0 && chip->bus && chip->bus->workq) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001301 /* bogus IRQ, process it later */
1302 azx_dev->irq_pending = 1;
Takashi Iwai6acaed32009-01-12 10:09:24 +01001303 queue_work(chip->bus->workq,
1304 &chip->irq_pending_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001305 }
1306 }
1307 }
1308
1309 /* clear rirb int */
1310 status = azx_readb(chip, RIRBSTS);
1311 if (status & RIRB_INT_MASK) {
Takashi Iwai14d34f12010-10-21 09:03:25 +02001312 if (status & RIRB_INT_RESPONSE) {
Takashi Iwai9477c582011-05-25 09:11:37 +02001313 if (chip->driver_caps & AZX_DCAPS_RIRB_PRE_DELAY)
Takashi Iwai14d34f12010-10-21 09:03:25 +02001314 udelay(80);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001315 azx_update_rirb(chip);
Takashi Iwai14d34f12010-10-21 09:03:25 +02001316 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001317 azx_writeb(chip, RIRBSTS, RIRB_INT_MASK);
1318 }
1319
1320#if 0
1321 /* clear state status int */
1322 if (azx_readb(chip, STATESTS) & 0x04)
1323 azx_writeb(chip, STATESTS, 0x04);
1324#endif
1325 spin_unlock(&chip->reg_lock);
1326
1327 return IRQ_HANDLED;
1328}
1329
1330
1331/*
Takashi Iwai675f25d2008-06-10 17:53:20 +02001332 * set up a BDL entry
1333 */
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001334static int setup_bdle(struct azx *chip,
1335 struct snd_pcm_substream *substream,
Takashi Iwai675f25d2008-06-10 17:53:20 +02001336 struct azx_dev *azx_dev, u32 **bdlp,
1337 int ofs, int size, int with_ioc)
1338{
Takashi Iwai675f25d2008-06-10 17:53:20 +02001339 u32 *bdl = *bdlp;
1340
1341 while (size > 0) {
1342 dma_addr_t addr;
1343 int chunk;
1344
1345 if (azx_dev->frags >= AZX_MAX_BDL_ENTRIES)
1346 return -EINVAL;
1347
Takashi Iwai77a23f22008-08-21 13:00:13 +02001348 addr = snd_pcm_sgbuf_get_addr(substream, ofs);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001349 /* program the address field of the BDL entry */
1350 bdl[0] = cpu_to_le32((u32)addr);
Takashi Iwai766979e2008-06-13 20:53:56 +02001351 bdl[1] = cpu_to_le32(upper_32_bits(addr));
Takashi Iwai675f25d2008-06-10 17:53:20 +02001352 /* program the size field of the BDL entry */
Takashi Iwaifc4abee2008-07-30 15:13:34 +02001353 chunk = snd_pcm_sgbuf_get_chunk_size(substream, ofs, size);
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001354 /* one BDLE cannot cross 4K boundary on CTHDA chips */
1355 if (chip->driver_caps & AZX_DCAPS_4K_BDLE_BOUNDARY) {
1356 u32 remain = 0x1000 - (ofs & 0xfff);
1357 if (chunk > remain)
1358 chunk = remain;
1359 }
Takashi Iwai675f25d2008-06-10 17:53:20 +02001360 bdl[2] = cpu_to_le32(chunk);
1361 /* program the IOC to enable interrupt
1362 * only when the whole fragment is processed
1363 */
1364 size -= chunk;
1365 bdl[3] = (size || !with_ioc) ? 0 : cpu_to_le32(0x01);
1366 bdl += 4;
1367 azx_dev->frags++;
1368 ofs += chunk;
1369 }
1370 *bdlp = bdl;
1371 return ofs;
1372}
1373
1374/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001375 * set up BDL entries
1376 */
Takashi Iwai555e2192008-06-10 17:53:34 +02001377static int azx_setup_periods(struct azx *chip,
1378 struct snd_pcm_substream *substream,
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001379 struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001380{
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001381 u32 *bdl;
1382 int i, ofs, periods, period_bytes;
Takashi Iwai555e2192008-06-10 17:53:34 +02001383 int pos_adj;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001384
1385 /* reset BDL address */
1386 azx_sd_writel(azx_dev, SD_BDLPL, 0);
1387 azx_sd_writel(azx_dev, SD_BDLPU, 0);
1388
Takashi Iwai97b71c92009-03-18 15:09:13 +01001389 period_bytes = azx_dev->period_bytes;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001390 periods = azx_dev->bufsize / period_bytes;
1391
Linus Torvalds1da177e2005-04-16 15:20:36 -07001392 /* program the initial BDL entries */
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001393 bdl = (u32 *)azx_dev->bdl.area;
1394 ofs = 0;
1395 azx_dev->frags = 0;
Takashi Iwai555e2192008-06-10 17:53:34 +02001396 pos_adj = bdl_pos_adj[chip->dev_index];
1397 if (pos_adj > 0) {
Takashi Iwai675f25d2008-06-10 17:53:20 +02001398 struct snd_pcm_runtime *runtime = substream->runtime;
Takashi Iwaie785d3d2008-07-15 16:28:43 +02001399 int pos_align = pos_adj;
Takashi Iwai555e2192008-06-10 17:53:34 +02001400 pos_adj = (pos_adj * runtime->rate + 47999) / 48000;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001401 if (!pos_adj)
Takashi Iwaie785d3d2008-07-15 16:28:43 +02001402 pos_adj = pos_align;
1403 else
1404 pos_adj = ((pos_adj + pos_align - 1) / pos_align) *
1405 pos_align;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001406 pos_adj = frames_to_bytes(runtime, pos_adj);
1407 if (pos_adj >= period_bytes) {
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001408 snd_printk(KERN_WARNING SFX "Too big adjustment %d\n",
Takashi Iwai555e2192008-06-10 17:53:34 +02001409 bdl_pos_adj[chip->dev_index]);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001410 pos_adj = 0;
1411 } else {
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001412 ofs = setup_bdle(chip, substream, azx_dev,
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001413 &bdl, ofs, pos_adj,
1414 !substream->runtime->no_period_wakeup);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001415 if (ofs < 0)
1416 goto error;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001417 }
Takashi Iwai555e2192008-06-10 17:53:34 +02001418 } else
1419 pos_adj = 0;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001420 for (i = 0; i < periods; i++) {
1421 if (i == periods - 1 && pos_adj)
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001422 ofs = setup_bdle(chip, substream, azx_dev, &bdl, ofs,
Takashi Iwai675f25d2008-06-10 17:53:20 +02001423 period_bytes - pos_adj, 0);
1424 else
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001425 ofs = setup_bdle(chip, substream, azx_dev, &bdl, ofs,
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001426 period_bytes,
1427 !substream->runtime->no_period_wakeup);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001428 if (ofs < 0)
1429 goto error;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001430 }
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001431 return 0;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001432
1433 error:
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001434 snd_printk(KERN_ERR SFX "Too many BDL entries: buffer=%d, period=%d\n",
Takashi Iwai675f25d2008-06-10 17:53:20 +02001435 azx_dev->bufsize, period_bytes);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001436 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001437}
1438
Takashi Iwai1dddab42009-03-18 15:15:37 +01001439/* reset stream */
1440static void azx_stream_reset(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001441{
1442 unsigned char val;
1443 int timeout;
1444
Takashi Iwai1dddab42009-03-18 15:15:37 +01001445 azx_stream_clear(chip, azx_dev);
1446
Takashi Iwaid01ce992007-07-27 16:52:19 +02001447 azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) |
1448 SD_CTL_STREAM_RESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001449 udelay(3);
1450 timeout = 300;
1451 while (!((val = azx_sd_readb(azx_dev, SD_CTL)) & SD_CTL_STREAM_RESET) &&
1452 --timeout)
1453 ;
1454 val &= ~SD_CTL_STREAM_RESET;
1455 azx_sd_writeb(azx_dev, SD_CTL, val);
1456 udelay(3);
1457
1458 timeout = 300;
1459 /* waiting for hardware to report that the stream is out of reset */
1460 while (((val = azx_sd_readb(azx_dev, SD_CTL)) & SD_CTL_STREAM_RESET) &&
1461 --timeout)
1462 ;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001463
1464 /* reset first position - may not be synced with hw at this time */
1465 *azx_dev->posbuf = 0;
Takashi Iwai1dddab42009-03-18 15:15:37 +01001466}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001467
Takashi Iwai1dddab42009-03-18 15:15:37 +01001468/*
1469 * set up the SD for streaming
1470 */
1471static int azx_setup_controller(struct azx *chip, struct azx_dev *azx_dev)
1472{
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001473 unsigned int val;
Takashi Iwai1dddab42009-03-18 15:15:37 +01001474 /* make sure the run bit is zero for SD */
1475 azx_stream_clear(chip, azx_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001476 /* program the stream_tag */
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001477 val = azx_sd_readl(azx_dev, SD_CTL);
1478 val = (val & ~SD_CTL_STREAM_TAG_MASK) |
1479 (azx_dev->stream_tag << SD_CTL_STREAM_TAG_SHIFT);
1480 if (!azx_snoop(chip))
1481 val |= SD_CTL_TRAFFIC_PRIO;
1482 azx_sd_writel(azx_dev, SD_CTL, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001483
1484 /* program the length of samples in cyclic buffer */
1485 azx_sd_writel(azx_dev, SD_CBL, azx_dev->bufsize);
1486
1487 /* program the stream format */
1488 /* this value needs to be the same as the one programmed */
1489 azx_sd_writew(azx_dev, SD_FORMAT, azx_dev->format_val);
1490
1491 /* program the stream LVI (last valid index) of the BDL */
1492 azx_sd_writew(azx_dev, SD_LVI, azx_dev->frags - 1);
1493
1494 /* program the BDL address */
1495 /* lower BDL address */
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001496 azx_sd_writel(azx_dev, SD_BDLPL, (u32)azx_dev->bdl.addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001497 /* upper BDL address */
Takashi Iwai766979e2008-06-13 20:53:56 +02001498 azx_sd_writel(azx_dev, SD_BDLPU, upper_32_bits(azx_dev->bdl.addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001499
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02001500 /* enable the position buffer */
David Henningsson4cb36312010-09-30 10:12:50 +02001501 if (chip->position_fix[0] != POS_FIX_LPIB ||
1502 chip->position_fix[1] != POS_FIX_LPIB) {
Takashi Iwaiee9d6b92008-03-14 15:52:20 +01001503 if (!(azx_readl(chip, DPLBASE) & ICH6_DPLBASE_ENABLE))
1504 azx_writel(chip, DPLBASE,
1505 (u32)chip->posbuf.addr | ICH6_DPLBASE_ENABLE);
1506 }
Takashi Iwaic74db862005-05-12 14:26:27 +02001507
Linus Torvalds1da177e2005-04-16 15:20:36 -07001508 /* set the interrupt enable bits in the descriptor control register */
Takashi Iwaid01ce992007-07-27 16:52:19 +02001509 azx_sd_writel(azx_dev, SD_CTL,
1510 azx_sd_readl(azx_dev, SD_CTL) | SD_INT_MASK);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001511
1512 return 0;
1513}
1514
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001515/*
1516 * Probe the given codec address
1517 */
1518static int probe_codec(struct azx *chip, int addr)
1519{
1520 unsigned int cmd = (addr << 28) | (AC_NODE_ROOT << 20) |
1521 (AC_VERB_PARAMETERS << 8) | AC_PAR_VENDOR_ID;
1522 unsigned int res;
1523
Wu Fengguanga678cde2009-08-01 18:46:46 +08001524 mutex_lock(&chip->bus->cmd_mutex);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001525 chip->probing = 1;
1526 azx_send_cmd(chip->bus, cmd);
Wu Fengguangdeadff12009-08-01 18:45:16 +08001527 res = azx_get_response(chip->bus, addr);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001528 chip->probing = 0;
Wu Fengguanga678cde2009-08-01 18:46:46 +08001529 mutex_unlock(&chip->bus->cmd_mutex);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001530 if (res == -1)
1531 return -EIO;
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001532 snd_printdd(SFX "codec #%d probed OK\n", addr);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001533 return 0;
1534}
1535
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001536static int azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec,
1537 struct hda_pcm *cpcm);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001538static void azx_stop_chip(struct azx *chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001539
Takashi Iwai8dd78332009-06-02 01:16:07 +02001540static void azx_bus_reset(struct hda_bus *bus)
1541{
1542 struct azx *chip = bus->private_data;
Takashi Iwai8dd78332009-06-02 01:16:07 +02001543
1544 bus->in_reset = 1;
1545 azx_stop_chip(chip);
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001546 azx_init_chip(chip, 1);
Alexander Beregalov65f75982009-06-04 13:46:16 +04001547#ifdef CONFIG_PM
Takashi Iwai8dd78332009-06-02 01:16:07 +02001548 if (chip->initialized) {
Takashi Iwai01b65bf2011-11-24 14:31:46 +01001549 struct azx_pcm *p;
1550 list_for_each_entry(p, &chip->pcm_list, list)
1551 snd_pcm_suspend_all(p->pcm);
Takashi Iwai8dd78332009-06-02 01:16:07 +02001552 snd_hda_suspend(chip->bus);
1553 snd_hda_resume(chip->bus);
1554 }
Alexander Beregalov65f75982009-06-04 13:46:16 +04001555#endif
Takashi Iwai8dd78332009-06-02 01:16:07 +02001556 bus->in_reset = 0;
1557}
1558
Linus Torvalds1da177e2005-04-16 15:20:36 -07001559/*
1560 * Codec initialization
1561 */
1562
Takashi Iwai2f5983f2008-09-03 16:00:44 +02001563/* number of codec slots for each chipset: 0 = default slots (i.e. 4) */
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001564static unsigned int azx_max_codecs[AZX_NUM_DRIVERS] DELAYED_INITDATA_MARK = {
Wei Ni7445dfc2010-03-03 15:05:53 +08001565 [AZX_DRIVER_NVIDIA] = 8,
Kailang Yangf2690022008-05-27 11:44:55 +02001566 [AZX_DRIVER_TERA] = 1,
Takashi Iwaia9995a32007-03-12 21:30:46 +01001567};
1568
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001569static int DELAYED_INIT_MARK azx_codec_create(struct azx *chip, const char *model)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001570{
1571 struct hda_bus_template bus_temp;
Takashi Iwai34c25352008-10-28 11:38:58 +01001572 int c, codecs, err;
1573 int max_slots;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001574
1575 memset(&bus_temp, 0, sizeof(bus_temp));
1576 bus_temp.private_data = chip;
1577 bus_temp.modelname = model;
1578 bus_temp.pci = chip->pci;
Takashi Iwai111d3af2006-02-16 18:17:58 +01001579 bus_temp.ops.command = azx_send_cmd;
1580 bus_temp.ops.get_response = azx_get_response;
Takashi Iwai176d5332008-07-30 15:01:44 +02001581 bus_temp.ops.attach_pcm = azx_attach_pcm_stream;
Takashi Iwai8dd78332009-06-02 01:16:07 +02001582 bus_temp.ops.bus_reset = azx_bus_reset;
Takashi Iwaicb53c622007-08-10 17:21:45 +02001583#ifdef CONFIG_SND_HDA_POWER_SAVE
Takashi Iwai11cd41b2008-11-28 07:22:18 +01001584 bus_temp.power_save = &power_save;
Takashi Iwaicb53c622007-08-10 17:21:45 +02001585 bus_temp.ops.pm_notify = azx_power_notify;
1586#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07001587
Takashi Iwaid01ce992007-07-27 16:52:19 +02001588 err = snd_hda_bus_new(chip->card, &bus_temp, &chip->bus);
1589 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001590 return err;
1591
Takashi Iwai9477c582011-05-25 09:11:37 +02001592 if (chip->driver_caps & AZX_DCAPS_RIRB_DELAY) {
1593 snd_printd(SFX "Enable delay in RIRB handling\n");
Wei Nidc9c8e22008-09-26 13:55:56 +08001594 chip->bus->needs_damn_long_delay = 1;
Takashi Iwai9477c582011-05-25 09:11:37 +02001595 }
Wei Nidc9c8e22008-09-26 13:55:56 +08001596
Takashi Iwai34c25352008-10-28 11:38:58 +01001597 codecs = 0;
Takashi Iwai2f5983f2008-09-03 16:00:44 +02001598 max_slots = azx_max_codecs[chip->driver_type];
1599 if (!max_slots)
Wei Ni7445dfc2010-03-03 15:05:53 +08001600 max_slots = AZX_DEFAULT_CODECS;
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001601
1602 /* First try to probe all given codec slots */
1603 for (c = 0; c < max_slots; c++) {
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01001604 if ((chip->codec_mask & (1 << c)) & chip->codec_probe_mask) {
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001605 if (probe_codec(chip, c) < 0) {
1606 /* Some BIOSen give you wrong codec addresses
1607 * that don't exist
1608 */
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001609 snd_printk(KERN_WARNING SFX
1610 "Codec #%d probe error; "
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001611 "disabling it...\n", c);
1612 chip->codec_mask &= ~(1 << c);
1613 /* More badly, accessing to a non-existing
1614 * codec often screws up the controller chip,
Paul Menzel24481582010-02-08 20:37:26 +01001615 * and disturbs the further communications.
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001616 * Thus if an error occurs during probing,
1617 * better to reset the controller chip to
1618 * get back to the sanity state.
1619 */
1620 azx_stop_chip(chip);
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001621 azx_init_chip(chip, 1);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001622 }
1623 }
1624 }
1625
Takashi Iwaid507cd62011-04-26 15:25:02 +02001626 /* AMD chipsets often cause the communication stalls upon certain
1627 * sequence like the pin-detection. It seems that forcing the synced
1628 * access works around the stall. Grrr...
1629 */
Takashi Iwai9477c582011-05-25 09:11:37 +02001630 if (chip->driver_caps & AZX_DCAPS_SYNC_WRITE) {
1631 snd_printd(SFX "Enable sync_write for stable communication\n");
Takashi Iwaid507cd62011-04-26 15:25:02 +02001632 chip->bus->sync_write = 1;
1633 chip->bus->allow_bus_reset = 1;
1634 }
1635
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001636 /* Then create codec instances */
Takashi Iwai34c25352008-10-28 11:38:58 +01001637 for (c = 0; c < max_slots; c++) {
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01001638 if ((chip->codec_mask & (1 << c)) & chip->codec_probe_mask) {
Takashi Iwaibccad142007-04-24 12:23:53 +02001639 struct hda_codec *codec;
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001640 err = snd_hda_codec_new(chip->bus, c, &codec);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001641 if (err < 0)
1642 continue;
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +01001643 codec->beep_mode = chip->beep_mode;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001644 codecs++;
Takashi Iwai19a982b2007-03-21 15:14:35 +01001645 }
1646 }
1647 if (!codecs) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001648 snd_printk(KERN_ERR SFX "no codecs initialized\n");
1649 return -ENXIO;
1650 }
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001651 return 0;
1652}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001653
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001654/* configure each codec instance */
1655static int __devinit azx_codec_configure(struct azx *chip)
1656{
1657 struct hda_codec *codec;
1658 list_for_each_entry(codec, &chip->bus->codec_list, list) {
1659 snd_hda_codec_configure(codec);
1660 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001661 return 0;
1662}
1663
1664
1665/*
1666 * PCM support
1667 */
1668
1669/* assign a stream for the PCM */
Wu Fengguangef18bed2009-12-25 13:14:27 +08001670static inline struct azx_dev *
1671azx_assign_device(struct azx *chip, struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001672{
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001673 int dev, i, nums;
Wu Fengguangef18bed2009-12-25 13:14:27 +08001674 struct azx_dev *res = NULL;
Takashi Iwaid5cf9912011-10-06 10:07:58 +02001675 /* make a non-zero unique key for the substream */
1676 int key = (substream->pcm->device << 16) | (substream->number << 2) |
1677 (substream->stream + 1);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001678
1679 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001680 dev = chip->playback_index_offset;
1681 nums = chip->playback_streams;
1682 } else {
1683 dev = chip->capture_index_offset;
1684 nums = chip->capture_streams;
1685 }
1686 for (i = 0; i < nums; i++, dev++)
Takashi Iwaid01ce992007-07-27 16:52:19 +02001687 if (!chip->azx_dev[dev].opened) {
Wu Fengguangef18bed2009-12-25 13:14:27 +08001688 res = &chip->azx_dev[dev];
Takashi Iwaid5cf9912011-10-06 10:07:58 +02001689 if (res->assigned_key == key)
Wu Fengguangef18bed2009-12-25 13:14:27 +08001690 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001691 }
Wu Fengguangef18bed2009-12-25 13:14:27 +08001692 if (res) {
1693 res->opened = 1;
Takashi Iwaid5cf9912011-10-06 10:07:58 +02001694 res->assigned_key = key;
Wu Fengguangef18bed2009-12-25 13:14:27 +08001695 }
1696 return res;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001697}
1698
1699/* release the assigned stream */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001700static inline void azx_release_device(struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001701{
1702 azx_dev->opened = 0;
1703}
1704
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001705static struct snd_pcm_hardware azx_pcm_hw = {
Takashi Iwaid01ce992007-07-27 16:52:19 +02001706 .info = (SNDRV_PCM_INFO_MMAP |
1707 SNDRV_PCM_INFO_INTERLEAVED |
Linus Torvalds1da177e2005-04-16 15:20:36 -07001708 SNDRV_PCM_INFO_BLOCK_TRANSFER |
1709 SNDRV_PCM_INFO_MMAP_VALID |
Pavel Machek927fc862006-08-31 17:03:43 +02001710 /* No full-resume yet implemented */
1711 /* SNDRV_PCM_INFO_RESUME |*/
Takashi Iwai850f0e52008-03-18 17:11:05 +01001712 SNDRV_PCM_INFO_PAUSE |
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001713 SNDRV_PCM_INFO_SYNC_START |
1714 SNDRV_PCM_INFO_NO_PERIOD_WAKEUP),
Linus Torvalds1da177e2005-04-16 15:20:36 -07001715 .formats = SNDRV_PCM_FMTBIT_S16_LE,
1716 .rates = SNDRV_PCM_RATE_48000,
1717 .rate_min = 48000,
1718 .rate_max = 48000,
1719 .channels_min = 2,
1720 .channels_max = 2,
1721 .buffer_bytes_max = AZX_MAX_BUF_SIZE,
1722 .period_bytes_min = 128,
1723 .period_bytes_max = AZX_MAX_BUF_SIZE / 2,
1724 .periods_min = 2,
1725 .periods_max = AZX_MAX_FRAG,
1726 .fifo_size = 0,
1727};
1728
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001729static int azx_pcm_open(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001730{
1731 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1732 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001733 struct azx *chip = apcm->chip;
1734 struct azx_dev *azx_dev;
1735 struct snd_pcm_runtime *runtime = substream->runtime;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001736 unsigned long flags;
1737 int err;
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001738 int buff_step;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001739
Ingo Molnar62932df2006-01-16 16:34:20 +01001740 mutex_lock(&chip->open_mutex);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001741 azx_dev = azx_assign_device(chip, substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001742 if (azx_dev == NULL) {
Ingo Molnar62932df2006-01-16 16:34:20 +01001743 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001744 return -EBUSY;
1745 }
1746 runtime->hw = azx_pcm_hw;
1747 runtime->hw.channels_min = hinfo->channels_min;
1748 runtime->hw.channels_max = hinfo->channels_max;
1749 runtime->hw.formats = hinfo->formats;
1750 runtime->hw.rates = hinfo->rates;
1751 snd_pcm_limit_hw_rates(runtime);
1752 snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
Takashi Iwai52409aa2012-01-23 17:10:24 +01001753 if (chip->align_buffer_size)
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001754 /* constrain buffer sizes to be multiple of 128
1755 bytes. This is more efficient in terms of memory
1756 access but isn't required by the HDA spec and
1757 prevents users from specifying exact period/buffer
1758 sizes. For example for 44.1kHz, a period size set
1759 to 20ms will be rounded to 19.59ms. */
1760 buff_step = 128;
1761 else
1762 /* Don't enforce steps on buffer sizes, still need to
1763 be multiple of 4 bytes (HDA spec). Tested on Intel
1764 HDA controllers, may not work on all devices where
1765 option needs to be disabled */
1766 buff_step = 4;
1767
Joachim Deguara5f1545b2007-03-16 15:01:36 +01001768 snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001769 buff_step);
Joachim Deguara5f1545b2007-03-16 15:01:36 +01001770 snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001771 buff_step);
Dylan Reidb4a91cf2012-06-15 19:36:23 -07001772 snd_hda_power_up_d3wait(apcm->codec);
Takashi Iwaid01ce992007-07-27 16:52:19 +02001773 err = hinfo->ops.open(hinfo, apcm->codec, substream);
1774 if (err < 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001775 azx_release_device(azx_dev);
Takashi Iwaicb53c622007-08-10 17:21:45 +02001776 snd_hda_power_down(apcm->codec);
Ingo Molnar62932df2006-01-16 16:34:20 +01001777 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001778 return err;
1779 }
Takashi Iwai70d321e2009-07-03 23:06:45 +02001780 snd_pcm_limit_hw_rates(runtime);
Takashi Iwaiaba66532009-07-05 11:44:46 +02001781 /* sanity check */
1782 if (snd_BUG_ON(!runtime->hw.channels_min) ||
1783 snd_BUG_ON(!runtime->hw.channels_max) ||
1784 snd_BUG_ON(!runtime->hw.formats) ||
1785 snd_BUG_ON(!runtime->hw.rates)) {
1786 azx_release_device(azx_dev);
1787 hinfo->ops.close(hinfo, apcm->codec, substream);
1788 snd_hda_power_down(apcm->codec);
1789 mutex_unlock(&chip->open_mutex);
1790 return -EINVAL;
1791 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001792 spin_lock_irqsave(&chip->reg_lock, flags);
1793 azx_dev->substream = substream;
1794 azx_dev->running = 0;
1795 spin_unlock_irqrestore(&chip->reg_lock, flags);
1796
1797 runtime->private_data = azx_dev;
Takashi Iwai850f0e52008-03-18 17:11:05 +01001798 snd_pcm_set_sync(substream);
Ingo Molnar62932df2006-01-16 16:34:20 +01001799 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001800 return 0;
1801}
1802
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001803static int azx_pcm_close(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001804{
1805 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1806 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001807 struct azx *chip = apcm->chip;
1808 struct azx_dev *azx_dev = get_azx_dev(substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001809 unsigned long flags;
1810
Ingo Molnar62932df2006-01-16 16:34:20 +01001811 mutex_lock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001812 spin_lock_irqsave(&chip->reg_lock, flags);
1813 azx_dev->substream = NULL;
1814 azx_dev->running = 0;
1815 spin_unlock_irqrestore(&chip->reg_lock, flags);
1816 azx_release_device(azx_dev);
1817 hinfo->ops.close(hinfo, apcm->codec, substream);
Takashi Iwaicb53c622007-08-10 17:21:45 +02001818 snd_hda_power_down(apcm->codec);
Ingo Molnar62932df2006-01-16 16:34:20 +01001819 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001820 return 0;
1821}
1822
Takashi Iwaid01ce992007-07-27 16:52:19 +02001823static int azx_pcm_hw_params(struct snd_pcm_substream *substream,
1824 struct snd_pcm_hw_params *hw_params)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001825{
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001826 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1827 struct azx *chip = apcm->chip;
1828 struct snd_pcm_runtime *runtime = substream->runtime;
Takashi Iwai97b71c92009-03-18 15:09:13 +01001829 struct azx_dev *azx_dev = get_azx_dev(substream);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001830 int ret;
Takashi Iwai97b71c92009-03-18 15:09:13 +01001831
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001832 mark_runtime_wc(chip, azx_dev, runtime, false);
Takashi Iwai97b71c92009-03-18 15:09:13 +01001833 azx_dev->bufsize = 0;
1834 azx_dev->period_bytes = 0;
1835 azx_dev->format_val = 0;
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001836 ret = snd_pcm_lib_malloc_pages(substream,
Takashi Iwaid01ce992007-07-27 16:52:19 +02001837 params_buffer_bytes(hw_params));
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001838 if (ret < 0)
1839 return ret;
1840 mark_runtime_wc(chip, azx_dev, runtime, true);
1841 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001842}
1843
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001844static int azx_pcm_hw_free(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001845{
1846 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001847 struct azx_dev *azx_dev = get_azx_dev(substream);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001848 struct azx *chip = apcm->chip;
1849 struct snd_pcm_runtime *runtime = substream->runtime;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001850 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
1851
1852 /* reset BDL address */
1853 azx_sd_writel(azx_dev, SD_BDLPL, 0);
1854 azx_sd_writel(azx_dev, SD_BDLPU, 0);
1855 azx_sd_writel(azx_dev, SD_CTL, 0);
Takashi Iwai97b71c92009-03-18 15:09:13 +01001856 azx_dev->bufsize = 0;
1857 azx_dev->period_bytes = 0;
1858 azx_dev->format_val = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001859
Takashi Iwaieb541332010-08-06 13:48:11 +02001860 snd_hda_codec_cleanup(apcm->codec, hinfo, substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001861
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001862 mark_runtime_wc(chip, azx_dev, runtime, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001863 return snd_pcm_lib_free_pages(substream);
1864}
1865
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001866static int azx_pcm_prepare(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001867{
1868 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001869 struct azx *chip = apcm->chip;
1870 struct azx_dev *azx_dev = get_azx_dev(substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001871 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001872 struct snd_pcm_runtime *runtime = substream->runtime;
Takashi Iwai62b7e5e2010-10-22 17:15:47 +02001873 unsigned int bufsize, period_bytes, format_val, stream_tag;
Takashi Iwai97b71c92009-03-18 15:09:13 +01001874 int err;
Stephen Warren7c9359762011-06-01 11:14:17 -06001875 struct hda_spdif_out *spdif =
1876 snd_hda_spdif_out_of_nid(apcm->codec, hinfo->nid);
1877 unsigned short ctls = spdif ? spdif->ctls : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001878
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001879 azx_stream_reset(chip, azx_dev);
Takashi Iwai97b71c92009-03-18 15:09:13 +01001880 format_val = snd_hda_calc_stream_format(runtime->rate,
1881 runtime->channels,
1882 runtime->format,
Anssi Hannula32c168c2010-08-03 13:28:57 +03001883 hinfo->maxbps,
Stephen Warren7c9359762011-06-01 11:14:17 -06001884 ctls);
Takashi Iwai97b71c92009-03-18 15:09:13 +01001885 if (!format_val) {
Takashi Iwaid01ce992007-07-27 16:52:19 +02001886 snd_printk(KERN_ERR SFX
1887 "invalid format_val, rate=%d, ch=%d, format=%d\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001888 runtime->rate, runtime->channels, runtime->format);
1889 return -EINVAL;
1890 }
1891
Takashi Iwai97b71c92009-03-18 15:09:13 +01001892 bufsize = snd_pcm_lib_buffer_bytes(substream);
1893 period_bytes = snd_pcm_lib_period_bytes(substream);
1894
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001895 snd_printdd(SFX "azx_pcm_prepare: bufsize=0x%x, format=0x%x\n",
Takashi Iwai97b71c92009-03-18 15:09:13 +01001896 bufsize, format_val);
1897
1898 if (bufsize != azx_dev->bufsize ||
1899 period_bytes != azx_dev->period_bytes ||
1900 format_val != azx_dev->format_val) {
1901 azx_dev->bufsize = bufsize;
1902 azx_dev->period_bytes = period_bytes;
1903 azx_dev->format_val = format_val;
1904 err = azx_setup_periods(chip, substream, azx_dev);
1905 if (err < 0)
1906 return err;
1907 }
1908
Jaroslav Kyselae5463722010-05-11 10:21:46 +02001909 /* wallclk has 24Mhz clock source */
1910 azx_dev->period_wallclk = (((runtime->period_size * 24000) /
1911 runtime->rate) * 1000);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001912 azx_setup_controller(chip, azx_dev);
1913 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
1914 azx_dev->fifo_size = azx_sd_readw(azx_dev, SD_FIFOSIZE) + 1;
1915 else
1916 azx_dev->fifo_size = 0;
1917
Takashi Iwai62b7e5e2010-10-22 17:15:47 +02001918 stream_tag = azx_dev->stream_tag;
1919 /* CA-IBG chips need the playback stream starting from 1 */
Takashi Iwai9477c582011-05-25 09:11:37 +02001920 if ((chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND) &&
Takashi Iwai62b7e5e2010-10-22 17:15:47 +02001921 stream_tag > chip->capture_streams)
1922 stream_tag -= chip->capture_streams;
1923 return snd_hda_codec_prepare(apcm->codec, hinfo, stream_tag,
Takashi Iwaieb541332010-08-06 13:48:11 +02001924 azx_dev->format_val, substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001925}
1926
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001927static int azx_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001928{
1929 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001930 struct azx *chip = apcm->chip;
Takashi Iwai850f0e52008-03-18 17:11:05 +01001931 struct azx_dev *azx_dev;
1932 struct snd_pcm_substream *s;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001933 int rstart = 0, start, nsync = 0, sbits = 0;
Takashi Iwai850f0e52008-03-18 17:11:05 +01001934 int nwait, timeout;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001935
Linus Torvalds1da177e2005-04-16 15:20:36 -07001936 switch (cmd) {
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001937 case SNDRV_PCM_TRIGGER_START:
1938 rstart = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001939 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
1940 case SNDRV_PCM_TRIGGER_RESUME:
Takashi Iwai850f0e52008-03-18 17:11:05 +01001941 start = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001942 break;
1943 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
Jaroslav Kysela47123192005-08-15 20:53:07 +02001944 case SNDRV_PCM_TRIGGER_SUSPEND:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001945 case SNDRV_PCM_TRIGGER_STOP:
Takashi Iwai850f0e52008-03-18 17:11:05 +01001946 start = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001947 break;
1948 default:
Takashi Iwai850f0e52008-03-18 17:11:05 +01001949 return -EINVAL;
1950 }
1951
1952 snd_pcm_group_for_each_entry(s, substream) {
1953 if (s->pcm->card != substream->pcm->card)
1954 continue;
1955 azx_dev = get_azx_dev(s);
1956 sbits |= 1 << azx_dev->index;
1957 nsync++;
1958 snd_pcm_trigger_done(s, substream);
1959 }
1960
1961 spin_lock(&chip->reg_lock);
1962 if (nsync > 1) {
1963 /* first, set SYNC bits of corresponding streams */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02001964 if (chip->driver_caps & AZX_DCAPS_OLD_SSYNC)
1965 azx_writel(chip, OLD_SSYNC,
1966 azx_readl(chip, OLD_SSYNC) | sbits);
1967 else
1968 azx_writel(chip, SSYNC, azx_readl(chip, SSYNC) | sbits);
Takashi Iwai850f0e52008-03-18 17:11:05 +01001969 }
1970 snd_pcm_group_for_each_entry(s, substream) {
1971 if (s->pcm->card != substream->pcm->card)
1972 continue;
1973 azx_dev = get_azx_dev(s);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02001974 if (start) {
1975 azx_dev->start_wallclk = azx_readl(chip, WALLCLK);
1976 if (!rstart)
1977 azx_dev->start_wallclk -=
1978 azx_dev->period_wallclk;
Takashi Iwai850f0e52008-03-18 17:11:05 +01001979 azx_stream_start(chip, azx_dev);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02001980 } else {
Takashi Iwai850f0e52008-03-18 17:11:05 +01001981 azx_stream_stop(chip, azx_dev);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02001982 }
Takashi Iwai850f0e52008-03-18 17:11:05 +01001983 azx_dev->running = start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001984 }
1985 spin_unlock(&chip->reg_lock);
Takashi Iwai850f0e52008-03-18 17:11:05 +01001986 if (start) {
1987 if (nsync == 1)
1988 return 0;
1989 /* wait until all FIFOs get ready */
1990 for (timeout = 5000; timeout; timeout--) {
1991 nwait = 0;
1992 snd_pcm_group_for_each_entry(s, substream) {
1993 if (s->pcm->card != substream->pcm->card)
1994 continue;
1995 azx_dev = get_azx_dev(s);
1996 if (!(azx_sd_readb(azx_dev, SD_STS) &
1997 SD_STS_FIFO_READY))
1998 nwait++;
1999 }
2000 if (!nwait)
2001 break;
2002 cpu_relax();
2003 }
2004 } else {
2005 /* wait until all RUN bits are cleared */
2006 for (timeout = 5000; timeout; timeout--) {
2007 nwait = 0;
2008 snd_pcm_group_for_each_entry(s, substream) {
2009 if (s->pcm->card != substream->pcm->card)
2010 continue;
2011 azx_dev = get_azx_dev(s);
2012 if (azx_sd_readb(azx_dev, SD_CTL) &
2013 SD_CTL_DMA_START)
2014 nwait++;
2015 }
2016 if (!nwait)
2017 break;
2018 cpu_relax();
2019 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002020 }
Takashi Iwai850f0e52008-03-18 17:11:05 +01002021 if (nsync > 1) {
2022 spin_lock(&chip->reg_lock);
2023 /* reset SYNC bits */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02002024 if (chip->driver_caps & AZX_DCAPS_OLD_SSYNC)
2025 azx_writel(chip, OLD_SSYNC,
2026 azx_readl(chip, OLD_SSYNC) & ~sbits);
2027 else
2028 azx_writel(chip, SSYNC, azx_readl(chip, SSYNC) & ~sbits);
Takashi Iwai850f0e52008-03-18 17:11:05 +01002029 spin_unlock(&chip->reg_lock);
2030 }
2031 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002032}
2033
Joseph Chan0e153472008-08-26 14:38:03 +02002034/* get the current DMA position with correction on VIA chips */
2035static unsigned int azx_via_get_position(struct azx *chip,
2036 struct azx_dev *azx_dev)
2037{
2038 unsigned int link_pos, mini_pos, bound_pos;
2039 unsigned int mod_link_pos, mod_dma_pos, mod_mini_pos;
2040 unsigned int fifo_size;
2041
2042 link_pos = azx_sd_readl(azx_dev, SD_LPIB);
Takashi Iwaib4a655e2011-06-07 12:26:56 +02002043 if (azx_dev->substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
Joseph Chan0e153472008-08-26 14:38:03 +02002044 /* Playback, no problem using link position */
2045 return link_pos;
2046 }
2047
2048 /* Capture */
2049 /* For new chipset,
2050 * use mod to get the DMA position just like old chipset
2051 */
2052 mod_dma_pos = le32_to_cpu(*azx_dev->posbuf);
2053 mod_dma_pos %= azx_dev->period_bytes;
2054
2055 /* azx_dev->fifo_size can't get FIFO size of in stream.
2056 * Get from base address + offset.
2057 */
2058 fifo_size = readw(chip->remap_addr + VIA_IN_STREAM0_FIFO_SIZE_OFFSET);
2059
2060 if (azx_dev->insufficient) {
2061 /* Link position never gather than FIFO size */
2062 if (link_pos <= fifo_size)
2063 return 0;
2064
2065 azx_dev->insufficient = 0;
2066 }
2067
2068 if (link_pos <= fifo_size)
2069 mini_pos = azx_dev->bufsize + link_pos - fifo_size;
2070 else
2071 mini_pos = link_pos - fifo_size;
2072
2073 /* Find nearest previous boudary */
2074 mod_mini_pos = mini_pos % azx_dev->period_bytes;
2075 mod_link_pos = link_pos % azx_dev->period_bytes;
2076 if (mod_link_pos >= fifo_size)
2077 bound_pos = link_pos - mod_link_pos;
2078 else if (mod_dma_pos >= mod_mini_pos)
2079 bound_pos = mini_pos - mod_mini_pos;
2080 else {
2081 bound_pos = mini_pos - mod_mini_pos + azx_dev->period_bytes;
2082 if (bound_pos >= azx_dev->bufsize)
2083 bound_pos = 0;
2084 }
2085
2086 /* Calculate real DMA position we want */
2087 return bound_pos + mod_dma_pos;
2088}
2089
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002090static unsigned int azx_get_position(struct azx *chip,
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002091 struct azx_dev *azx_dev,
2092 bool with_check)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002093{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002094 unsigned int pos;
David Henningsson4cb36312010-09-30 10:12:50 +02002095 int stream = azx_dev->substream->stream;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002096
David Henningsson4cb36312010-09-30 10:12:50 +02002097 switch (chip->position_fix[stream]) {
2098 case POS_FIX_LPIB:
2099 /* read LPIB */
2100 pos = azx_sd_readl(azx_dev, SD_LPIB);
2101 break;
2102 case POS_FIX_VIACOMBO:
Joseph Chan0e153472008-08-26 14:38:03 +02002103 pos = azx_via_get_position(chip, azx_dev);
David Henningsson4cb36312010-09-30 10:12:50 +02002104 break;
2105 default:
2106 /* use the position buffer */
2107 pos = le32_to_cpu(*azx_dev->posbuf);
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002108 if (with_check && chip->position_fix[stream] == POS_FIX_AUTO) {
Takashi Iwaia8103642011-06-07 12:23:23 +02002109 if (!pos || pos == (u32)-1) {
2110 printk(KERN_WARNING
2111 "hda-intel: Invalid position buffer, "
2112 "using LPIB read method instead.\n");
2113 chip->position_fix[stream] = POS_FIX_LPIB;
2114 pos = azx_sd_readl(azx_dev, SD_LPIB);
2115 } else
2116 chip->position_fix[stream] = POS_FIX_POSBUF;
2117 }
2118 break;
Takashi Iwaic74db862005-05-12 14:26:27 +02002119 }
David Henningsson4cb36312010-09-30 10:12:50 +02002120
Linus Torvalds1da177e2005-04-16 15:20:36 -07002121 if (pos >= azx_dev->bufsize)
2122 pos = 0;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002123 return pos;
2124}
2125
2126static snd_pcm_uframes_t azx_pcm_pointer(struct snd_pcm_substream *substream)
2127{
2128 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2129 struct azx *chip = apcm->chip;
2130 struct azx_dev *azx_dev = get_azx_dev(substream);
2131 return bytes_to_frames(substream->runtime,
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002132 azx_get_position(chip, azx_dev, false));
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002133}
2134
2135/*
2136 * Check whether the current DMA position is acceptable for updating
2137 * periods. Returns non-zero if it's OK.
2138 *
2139 * Many HD-audio controllers appear pretty inaccurate about
2140 * the update-IRQ timing. The IRQ is issued before actually the
2141 * data is processed. So, we need to process it afterwords in a
2142 * workqueue.
2143 */
2144static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev)
2145{
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002146 u32 wallclk;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002147 unsigned int pos;
Shahin Ghazinouribeaffc32010-05-11 08:19:55 +02002148 int stream;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002149
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002150 wallclk = azx_readl(chip, WALLCLK) - azx_dev->start_wallclk;
2151 if (wallclk < (azx_dev->period_wallclk * 2) / 3)
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002152 return -1; /* bogus (too early) interrupt */
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002153
Shahin Ghazinouribeaffc32010-05-11 08:19:55 +02002154 stream = azx_dev->substream->stream;
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002155 pos = azx_get_position(chip, azx_dev, true);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002156
Takashi Iwaid6d8bf52010-02-12 18:17:06 +01002157 if (WARN_ONCE(!azx_dev->period_bytes,
2158 "hda-intel: zero azx_dev->period_bytes"))
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002159 return -1; /* this shouldn't happen! */
Jaroslav Kyselaedb39932010-06-02 13:29:17 +02002160 if (wallclk < (azx_dev->period_wallclk * 5) / 4 &&
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002161 pos % azx_dev->period_bytes > azx_dev->period_bytes / 2)
2162 /* NG - it's below the first next period boundary */
2163 return bdl_pos_adj[chip->dev_index] ? 0 : -1;
Jaroslav Kyselaedb39932010-06-02 13:29:17 +02002164 azx_dev->start_wallclk += wallclk;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002165 return 1; /* OK, it's fine */
2166}
2167
2168/*
2169 * The work for pending PCM period updates.
2170 */
2171static void azx_irq_pending_work(struct work_struct *work)
2172{
2173 struct azx *chip = container_of(work, struct azx, irq_pending_work);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002174 int i, pending, ok;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002175
Takashi Iwaia6a950a2008-06-10 17:53:35 +02002176 if (!chip->irq_pending_warned) {
2177 printk(KERN_WARNING
2178 "hda-intel: IRQ timing workaround is activated "
2179 "for card #%d. Suggest a bigger bdl_pos_adj.\n",
2180 chip->card->number);
2181 chip->irq_pending_warned = 1;
2182 }
2183
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002184 for (;;) {
2185 pending = 0;
2186 spin_lock_irq(&chip->reg_lock);
2187 for (i = 0; i < chip->num_streams; i++) {
2188 struct azx_dev *azx_dev = &chip->azx_dev[i];
2189 if (!azx_dev->irq_pending ||
2190 !azx_dev->substream ||
2191 !azx_dev->running)
2192 continue;
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002193 ok = azx_position_ok(chip, azx_dev);
2194 if (ok > 0) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002195 azx_dev->irq_pending = 0;
2196 spin_unlock(&chip->reg_lock);
2197 snd_pcm_period_elapsed(azx_dev->substream);
2198 spin_lock(&chip->reg_lock);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002199 } else if (ok < 0) {
2200 pending = 0; /* too early */
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002201 } else
2202 pending++;
2203 }
2204 spin_unlock_irq(&chip->reg_lock);
2205 if (!pending)
2206 return;
Takashi Iwai08af4952010-08-03 14:39:04 +02002207 msleep(1);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002208 }
2209}
2210
2211/* clear irq_pending flags and assure no on-going workq */
2212static void azx_clear_irq_pending(struct azx *chip)
2213{
2214 int i;
2215
2216 spin_lock_irq(&chip->reg_lock);
2217 for (i = 0; i < chip->num_streams; i++)
2218 chip->azx_dev[i].irq_pending = 0;
2219 spin_unlock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002220}
2221
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002222#ifdef CONFIG_X86
2223static int azx_pcm_mmap(struct snd_pcm_substream *substream,
2224 struct vm_area_struct *area)
2225{
2226 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2227 struct azx *chip = apcm->chip;
2228 if (!azx_snoop(chip))
2229 area->vm_page_prot = pgprot_writecombine(area->vm_page_prot);
2230 return snd_pcm_lib_default_mmap(substream, area);
2231}
2232#else
2233#define azx_pcm_mmap NULL
2234#endif
2235
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002236static struct snd_pcm_ops azx_pcm_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002237 .open = azx_pcm_open,
2238 .close = azx_pcm_close,
2239 .ioctl = snd_pcm_lib_ioctl,
2240 .hw_params = azx_pcm_hw_params,
2241 .hw_free = azx_pcm_hw_free,
2242 .prepare = azx_pcm_prepare,
2243 .trigger = azx_pcm_trigger,
2244 .pointer = azx_pcm_pointer,
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002245 .mmap = azx_pcm_mmap,
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002246 .page = snd_pcm_sgbuf_ops_page,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002247};
2248
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002249static void azx_pcm_free(struct snd_pcm *pcm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002250{
Takashi Iwai176d5332008-07-30 15:01:44 +02002251 struct azx_pcm *apcm = pcm->private_data;
2252 if (apcm) {
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002253 list_del(&apcm->list);
Takashi Iwai176d5332008-07-30 15:01:44 +02002254 kfree(apcm);
2255 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002256}
2257
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002258#define MAX_PREALLOC_SIZE (32 * 1024 * 1024)
2259
Takashi Iwai176d5332008-07-30 15:01:44 +02002260static int
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002261azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec,
2262 struct hda_pcm *cpcm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002263{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002264 struct azx *chip = bus->private_data;
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002265 struct snd_pcm *pcm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002266 struct azx_pcm *apcm;
Takashi Iwai176d5332008-07-30 15:01:44 +02002267 int pcm_dev = cpcm->device;
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002268 unsigned int size;
Takashi Iwai176d5332008-07-30 15:01:44 +02002269 int s, err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002270
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002271 list_for_each_entry(apcm, &chip->pcm_list, list) {
2272 if (apcm->pcm->device == pcm_dev) {
2273 snd_printk(KERN_ERR SFX "PCM %d already exists\n", pcm_dev);
2274 return -EBUSY;
2275 }
Takashi Iwai176d5332008-07-30 15:01:44 +02002276 }
2277 err = snd_pcm_new(chip->card, cpcm->name, pcm_dev,
2278 cpcm->stream[SNDRV_PCM_STREAM_PLAYBACK].substreams,
2279 cpcm->stream[SNDRV_PCM_STREAM_CAPTURE].substreams,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002280 &pcm);
2281 if (err < 0)
2282 return err;
Takashi Iwai18cb7102009-04-16 10:22:24 +02002283 strlcpy(pcm->name, cpcm->name, sizeof(pcm->name));
Takashi Iwai176d5332008-07-30 15:01:44 +02002284 apcm = kzalloc(sizeof(*apcm), GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002285 if (apcm == NULL)
2286 return -ENOMEM;
2287 apcm->chip = chip;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002288 apcm->pcm = pcm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002289 apcm->codec = codec;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002290 pcm->private_data = apcm;
2291 pcm->private_free = azx_pcm_free;
Takashi Iwai176d5332008-07-30 15:01:44 +02002292 if (cpcm->pcm_type == HDA_PCM_TYPE_MODEM)
2293 pcm->dev_class = SNDRV_PCM_CLASS_MODEM;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002294 list_add_tail(&apcm->list, &chip->pcm_list);
Takashi Iwai176d5332008-07-30 15:01:44 +02002295 cpcm->pcm = pcm;
2296 for (s = 0; s < 2; s++) {
2297 apcm->hinfo[s] = &cpcm->stream[s];
2298 if (cpcm->stream[s].substreams)
2299 snd_pcm_set_ops(pcm, s, &azx_pcm_ops);
2300 }
2301 /* buffer pre-allocation */
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002302 size = CONFIG_SND_HDA_PREALLOC_SIZE * 1024;
2303 if (size > MAX_PREALLOC_SIZE)
2304 size = MAX_PREALLOC_SIZE;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002305 snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV_SG,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002306 snd_dma_pci_data(chip->pci),
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002307 size, MAX_PREALLOC_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002308 return 0;
2309}
2310
2311/*
2312 * mixer creation - all stuff is implemented in hda module
2313 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002314static int __devinit azx_mixer_create(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002315{
2316 return snd_hda_build_controls(chip->bus);
2317}
2318
2319
2320/*
2321 * initialize SD streams
2322 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002323static int __devinit azx_init_stream(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002324{
2325 int i;
2326
2327 /* initialize each stream (aka device)
Takashi Iwaid01ce992007-07-27 16:52:19 +02002328 * assign the starting bdl address to each stream (device)
2329 * and initialize
Linus Torvalds1da177e2005-04-16 15:20:36 -07002330 */
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002331 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002332 struct azx_dev *azx_dev = &chip->azx_dev[i];
Takashi Iwai929861c2006-08-31 16:55:40 +02002333 azx_dev->posbuf = (u32 __iomem *)(chip->posbuf.area + i * 8);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002334 /* offset: SDI0=0x80, SDI1=0xa0, ... SDO3=0x160 */
2335 azx_dev->sd_addr = chip->remap_addr + (0x20 * i + 0x80);
2336 /* int mask: SDI0=0x01, SDI1=0x02, ... SDO3=0x80 */
2337 azx_dev->sd_int_sta_mask = 1 << i;
2338 /* stream tag: must be non-zero and unique */
2339 azx_dev->index = i;
2340 azx_dev->stream_tag = i + 1;
2341 }
2342
2343 return 0;
2344}
2345
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002346static int azx_acquire_irq(struct azx *chip, int do_disconnect)
2347{
Takashi Iwai437a5a42006-11-21 12:14:23 +01002348 if (request_irq(chip->pci->irq, azx_interrupt,
2349 chip->msi ? 0 : IRQF_SHARED,
Takashi Iwai934c2b62011-06-10 16:36:37 +02002350 KBUILD_MODNAME, chip)) {
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002351 printk(KERN_ERR "hda-intel: unable to grab IRQ %d, "
2352 "disabling device\n", chip->pci->irq);
2353 if (do_disconnect)
2354 snd_card_disconnect(chip->card);
2355 return -1;
2356 }
2357 chip->irq = chip->pci->irq;
Takashi Iwai69e13412006-11-21 12:10:55 +01002358 pci_intx(chip->pci, !chip->msi);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002359 return 0;
2360}
2361
Linus Torvalds1da177e2005-04-16 15:20:36 -07002362
Takashi Iwaicb53c622007-08-10 17:21:45 +02002363static void azx_stop_chip(struct azx *chip)
2364{
Takashi Iwai95e99fd2007-08-13 15:29:04 +02002365 if (!chip->initialized)
Takashi Iwaicb53c622007-08-10 17:21:45 +02002366 return;
2367
2368 /* disable interrupts */
2369 azx_int_disable(chip);
2370 azx_int_clear(chip);
2371
2372 /* disable CORB/RIRB */
2373 azx_free_cmd_io(chip);
2374
2375 /* disable position buffer */
2376 azx_writel(chip, DPLBASE, 0);
2377 azx_writel(chip, DPUBASE, 0);
2378
2379 chip->initialized = 0;
2380}
2381
2382#ifdef CONFIG_SND_HDA_POWER_SAVE
2383/* power-up/down the controller */
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002384static void azx_power_notify(struct hda_bus *bus)
Takashi Iwaicb53c622007-08-10 17:21:45 +02002385{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002386 struct azx *chip = bus->private_data;
Takashi Iwaicb53c622007-08-10 17:21:45 +02002387 struct hda_codec *c;
2388 int power_on = 0;
2389
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002390 list_for_each_entry(c, &bus->codec_list, list) {
Takashi Iwaicb53c622007-08-10 17:21:45 +02002391 if (c->power_on) {
2392 power_on = 1;
2393 break;
2394 }
2395 }
2396 if (power_on)
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01002397 azx_init_chip(chip, 1);
Wu Fengguang0287d972009-12-11 20:15:11 +08002398 else if (chip->running && power_save_controller &&
2399 !bus->power_keep_link_on)
Takashi Iwaicb53c622007-08-10 17:21:45 +02002400 azx_stop_chip(chip);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002401}
Takashi Iwai5c0b9be2008-12-11 11:47:17 +01002402#endif /* CONFIG_SND_HDA_POWER_SAVE */
2403
2404#ifdef CONFIG_PM
2405/*
2406 * power management
2407 */
Takashi Iwai986862bd2008-11-27 12:40:13 +01002408
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002409static int azx_suspend(struct device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002410{
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002411 struct pci_dev *pci = to_pci_dev(dev);
2412 struct snd_card *card = dev_get_drvdata(dev);
Takashi Iwai421a1252005-11-17 16:11:09 +01002413 struct azx *chip = card->private_data;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002414 struct azx_pcm *p;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002415
Takashi Iwai421a1252005-11-17 16:11:09 +01002416 snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002417 azx_clear_irq_pending(chip);
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002418 list_for_each_entry(p, &chip->pcm_list, list)
2419 snd_pcm_suspend_all(p->pcm);
Takashi Iwai0b7a2e92007-08-14 15:18:26 +02002420 if (chip->initialized)
Takashi Iwai8dd78332009-06-02 01:16:07 +02002421 snd_hda_suspend(chip->bus);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002422 azx_stop_chip(chip);
Takashi Iwai30b35392006-10-11 18:52:53 +02002423 if (chip->irq >= 0) {
Takashi Iwai43001c92006-09-08 12:30:03 +02002424 free_irq(chip->irq, chip);
Takashi Iwai30b35392006-10-11 18:52:53 +02002425 chip->irq = -1;
2426 }
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002427 if (chip->msi)
Takashi Iwai43001c92006-09-08 12:30:03 +02002428 pci_disable_msi(chip->pci);
Takashi Iwai421a1252005-11-17 16:11:09 +01002429 pci_disable_device(pci);
2430 pci_save_state(pci);
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002431 pci_set_power_state(pci, PCI_D3hot);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002432 return 0;
2433}
2434
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002435static int azx_resume(struct device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002436{
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002437 struct pci_dev *pci = to_pci_dev(dev);
2438 struct snd_card *card = dev_get_drvdata(dev);
Takashi Iwai421a1252005-11-17 16:11:09 +01002439 struct azx *chip = card->private_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002440
Takashi Iwaid14a7e02009-02-16 10:13:03 +01002441 pci_set_power_state(pci, PCI_D0);
2442 pci_restore_state(pci);
Takashi Iwai30b35392006-10-11 18:52:53 +02002443 if (pci_enable_device(pci) < 0) {
2444 printk(KERN_ERR "hda-intel: pci_enable_device failed, "
2445 "disabling device\n");
2446 snd_card_disconnect(card);
2447 return -EIO;
2448 }
2449 pci_set_master(pci);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002450 if (chip->msi)
2451 if (pci_enable_msi(pci) < 0)
2452 chip->msi = 0;
2453 if (azx_acquire_irq(chip, 1) < 0)
Takashi Iwai30b35392006-10-11 18:52:53 +02002454 return -EIO;
Takashi Iwaicb53c622007-08-10 17:21:45 +02002455 azx_init_pci(chip);
Maxim Levitskyd804ad92007-09-03 15:28:04 +02002456
Takashi Iwai7f308302012-05-08 16:52:23 +02002457 azx_init_chip(chip, 1);
Maxim Levitskyd804ad92007-09-03 15:28:04 +02002458
Linus Torvalds1da177e2005-04-16 15:20:36 -07002459 snd_hda_resume(chip->bus);
Takashi Iwai421a1252005-11-17 16:11:09 +01002460 snd_power_change_state(card, SNDRV_CTL_POWER_D0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002461 return 0;
2462}
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002463static SIMPLE_DEV_PM_OPS(azx_pm, azx_suspend, azx_resume);
2464#define AZX_PM_OPS &azx_pm
2465#else
2466#define azx_suspend(dev)
2467#define azx_resume(dev)
2468#define AZX_PM_OPS NULL
Linus Torvalds1da177e2005-04-16 15:20:36 -07002469#endif /* CONFIG_PM */
2470
2471
2472/*
Takashi Iwai0cbf0092008-10-29 16:18:25 +01002473 * reboot notifier for hang-up problem at power-down
2474 */
2475static int azx_halt(struct notifier_block *nb, unsigned long event, void *buf)
2476{
2477 struct azx *chip = container_of(nb, struct azx, reboot_notifier);
Takashi Iwaifb8d1a32009-11-10 16:02:29 +01002478 snd_hda_bus_reboot_notify(chip->bus);
Takashi Iwai0cbf0092008-10-29 16:18:25 +01002479 azx_stop_chip(chip);
2480 return NOTIFY_OK;
2481}
2482
2483static void azx_notifier_register(struct azx *chip)
2484{
2485 chip->reboot_notifier.notifier_call = azx_halt;
2486 register_reboot_notifier(&chip->reboot_notifier);
2487}
2488
2489static void azx_notifier_unregister(struct azx *chip)
2490{
2491 if (chip->reboot_notifier.notifier_call)
2492 unregister_reboot_notifier(&chip->reboot_notifier);
2493}
2494
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002495static int DELAYED_INIT_MARK azx_first_init(struct azx *chip);
2496static int DELAYED_INIT_MARK azx_probe_continue(struct azx *chip);
2497
Steven Newbury8393ec4a2012-06-08 13:06:29 +02002498#ifdef SUPPORT_VGA_SWITCHEROO
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002499static struct pci_dev __devinit *get_bound_vga(struct pci_dev *pci);
2500
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002501static void azx_vs_set_state(struct pci_dev *pci,
2502 enum vga_switcheroo_state state)
2503{
2504 struct snd_card *card = pci_get_drvdata(pci);
2505 struct azx *chip = card->private_data;
2506 bool disabled;
2507
2508 if (chip->init_failed)
2509 return;
2510
2511 disabled = (state == VGA_SWITCHEROO_OFF);
2512 if (chip->disabled == disabled)
2513 return;
2514
2515 if (!chip->bus) {
2516 chip->disabled = disabled;
2517 if (!disabled) {
2518 snd_printk(KERN_INFO SFX
2519 "%s: Start delayed initialization\n",
2520 pci_name(chip->pci));
2521 if (azx_first_init(chip) < 0 ||
2522 azx_probe_continue(chip) < 0) {
2523 snd_printk(KERN_ERR SFX
2524 "%s: initialization error\n",
2525 pci_name(chip->pci));
2526 chip->init_failed = true;
2527 }
2528 }
2529 } else {
2530 snd_printk(KERN_INFO SFX
2531 "%s %s via VGA-switcheroo\n",
2532 disabled ? "Disabling" : "Enabling",
2533 pci_name(chip->pci));
2534 if (disabled) {
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002535 azx_suspend(&pci->dev);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002536 chip->disabled = true;
2537 snd_hda_lock_devices(chip->bus);
2538 } else {
2539 snd_hda_unlock_devices(chip->bus);
2540 chip->disabled = false;
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002541 azx_resume(&pci->dev);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002542 }
2543 }
2544}
2545
2546static bool azx_vs_can_switch(struct pci_dev *pci)
2547{
2548 struct snd_card *card = pci_get_drvdata(pci);
2549 struct azx *chip = card->private_data;
2550
2551 if (chip->init_failed)
2552 return false;
2553 if (chip->disabled || !chip->bus)
2554 return true;
2555 if (snd_hda_lock_devices(chip->bus))
2556 return false;
2557 snd_hda_unlock_devices(chip->bus);
2558 return true;
2559}
2560
2561static void __devinit init_vga_switcheroo(struct azx *chip)
2562{
2563 struct pci_dev *p = get_bound_vga(chip->pci);
2564 if (p) {
2565 snd_printk(KERN_INFO SFX
2566 "%s: Handle VGA-switcheroo audio client\n",
2567 pci_name(chip->pci));
2568 chip->use_vga_switcheroo = 1;
2569 pci_dev_put(p);
2570 }
2571}
2572
2573static const struct vga_switcheroo_client_ops azx_vs_ops = {
2574 .set_gpu_state = azx_vs_set_state,
2575 .can_switch = azx_vs_can_switch,
2576};
2577
2578static int __devinit register_vga_switcheroo(struct azx *chip)
2579{
2580 if (!chip->use_vga_switcheroo)
2581 return 0;
2582 /* FIXME: currently only handling DIS controller
2583 * is there any machine with two switchable HDMI audio controllers?
2584 */
2585 return vga_switcheroo_register_audio_client(chip->pci, &azx_vs_ops,
2586 VGA_SWITCHEROO_DIS,
2587 chip->bus != NULL);
2588}
2589#else
2590#define init_vga_switcheroo(chip) /* NOP */
2591#define register_vga_switcheroo(chip) 0
Steven Newbury8393ec4a2012-06-08 13:06:29 +02002592#define check_hdmi_disabled(pci) false
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002593#endif /* SUPPORT_VGA_SWITCHER */
2594
Takashi Iwai0cbf0092008-10-29 16:18:25 +01002595/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002596 * destructor
2597 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002598static int azx_free(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002599{
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002600 int i;
2601
Takashi Iwai0cbf0092008-10-29 16:18:25 +01002602 azx_notifier_unregister(chip);
2603
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002604 if (use_vga_switcheroo(chip)) {
2605 if (chip->disabled && chip->bus)
2606 snd_hda_unlock_devices(chip->bus);
2607 vga_switcheroo_unregister_client(chip->pci);
2608 }
2609
Takashi Iwaice43fba2005-05-30 20:33:44 +02002610 if (chip->initialized) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002611 azx_clear_irq_pending(chip);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002612 for (i = 0; i < chip->num_streams; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002613 azx_stream_stop(chip, &chip->azx_dev[i]);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002614 azx_stop_chip(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002615 }
2616
Jeff Garzikf000fd82008-04-22 13:50:34 +02002617 if (chip->irq >= 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002618 free_irq(chip->irq, (void*)chip);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002619 if (chip->msi)
Takashi Iwai30b35392006-10-11 18:52:53 +02002620 pci_disable_msi(chip->pci);
Takashi Iwaif079c252006-06-01 11:42:14 +02002621 if (chip->remap_addr)
2622 iounmap(chip->remap_addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002623
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002624 if (chip->azx_dev) {
2625 for (i = 0; i < chip->num_streams; i++)
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002626 if (chip->azx_dev[i].bdl.area) {
2627 mark_pages_wc(chip, &chip->azx_dev[i].bdl, false);
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002628 snd_dma_free_pages(&chip->azx_dev[i].bdl);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002629 }
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002630 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002631 if (chip->rb.area) {
2632 mark_pages_wc(chip, &chip->rb, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002633 snd_dma_free_pages(&chip->rb);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002634 }
2635 if (chip->posbuf.area) {
2636 mark_pages_wc(chip, &chip->posbuf, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002637 snd_dma_free_pages(&chip->posbuf);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002638 }
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002639 if (chip->region_requested)
2640 pci_release_regions(chip->pci);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002641 pci_disable_device(chip->pci);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002642 kfree(chip->azx_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002643 kfree(chip);
2644
2645 return 0;
2646}
2647
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002648static int azx_dev_free(struct snd_device *device)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002649{
2650 return azx_free(device->device_data);
2651}
2652
Steven Newbury8393ec4a2012-06-08 13:06:29 +02002653#ifdef SUPPORT_VGA_SWITCHEROO
Linus Torvalds1da177e2005-04-16 15:20:36 -07002654/*
Takashi Iwai91219472012-04-26 12:13:25 +02002655 * Check of disabled HDMI controller by vga-switcheroo
2656 */
2657static struct pci_dev __devinit *get_bound_vga(struct pci_dev *pci)
2658{
2659 struct pci_dev *p;
2660
2661 /* check only discrete GPU */
2662 switch (pci->vendor) {
2663 case PCI_VENDOR_ID_ATI:
2664 case PCI_VENDOR_ID_AMD:
2665 case PCI_VENDOR_ID_NVIDIA:
2666 if (pci->devfn == 1) {
2667 p = pci_get_domain_bus_and_slot(pci_domain_nr(pci->bus),
2668 pci->bus->number, 0);
2669 if (p) {
2670 if ((p->class >> 8) == PCI_CLASS_DISPLAY_VGA)
2671 return p;
2672 pci_dev_put(p);
2673 }
2674 }
2675 break;
2676 }
2677 return NULL;
2678}
2679
2680static bool __devinit check_hdmi_disabled(struct pci_dev *pci)
2681{
2682 bool vga_inactive = false;
2683 struct pci_dev *p = get_bound_vga(pci);
2684
2685 if (p) {
Takashi Iwai12b78a72012-06-07 12:15:16 +02002686 if (vga_switcheroo_get_client_state(p) == VGA_SWITCHEROO_OFF)
Takashi Iwai91219472012-04-26 12:13:25 +02002687 vga_inactive = true;
2688 pci_dev_put(p);
2689 }
2690 return vga_inactive;
2691}
Steven Newbury8393ec4a2012-06-08 13:06:29 +02002692#endif /* SUPPORT_VGA_SWITCHEROO */
Takashi Iwai91219472012-04-26 12:13:25 +02002693
2694/*
Takashi Iwai3372a152007-02-01 15:46:50 +01002695 * white/black-listing for position_fix
2696 */
Ralf Baechle623ec042007-03-13 15:29:47 +01002697static struct snd_pci_quirk position_fix_list[] __devinitdata = {
Takashi Iwaid2e1c972008-06-10 17:53:34 +02002698 SND_PCI_QUIRK(0x1028, 0x01cc, "Dell D820", POS_FIX_LPIB),
2699 SND_PCI_QUIRK(0x1028, 0x01de, "Dell Precision 390", POS_FIX_LPIB),
Takashi Iwai2f703e72009-12-01 14:17:37 +01002700 SND_PCI_QUIRK(0x103c, 0x306d, "HP dv3", POS_FIX_LPIB),
Takashi Iwaid2e1c972008-06-10 17:53:34 +02002701 SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB),
Daniel T Chendd37f8e2010-05-30 01:17:03 -04002702 SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS", POS_FIX_LPIB),
Daniel T Chen9f75c1b2010-05-30 13:08:41 -04002703 SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS M2V", POS_FIX_LPIB),
Daniel T Chene96d3122010-05-27 18:32:18 -04002704 SND_PCI_QUIRK(0x104d, 0x9069, "Sony VPCS11V9E", POS_FIX_LPIB),
David Henningssonb01de4f2012-01-12 16:31:14 +01002705 SND_PCI_QUIRK(0x10de, 0xcb89, "Macbook Pro 7,1", POS_FIX_LPIB),
Daniel T Chen61bb42c2010-05-29 11:04:11 -04002706 SND_PCI_QUIRK(0x1297, 0x3166, "Shuttle", POS_FIX_LPIB),
Daniel T Chen9ec8dda2010-03-28 02:34:40 -04002707 SND_PCI_QUIRK(0x1458, 0xa022, "ga-ma770-ud3", POS_FIX_LPIB),
Takashi Iwai45d4ebf2009-11-30 11:58:30 +01002708 SND_PCI_QUIRK(0x1462, 0x1002, "MSI Wind U115", POS_FIX_LPIB),
Takashi Iwai8815cd02010-04-15 09:02:41 +02002709 SND_PCI_QUIRK(0x1565, 0x8218, "Biostar Microtech", POS_FIX_LPIB),
Daniel T Chenb90c0762010-05-30 19:31:41 -04002710 SND_PCI_QUIRK(0x1849, 0x0888, "775Dual-VSTA", POS_FIX_LPIB),
Daniel T Chen0e0280d2010-04-21 19:55:43 -04002711 SND_PCI_QUIRK(0x8086, 0x2503, "DG965OT AAD63733-203", POS_FIX_LPIB),
Takashi Iwai3372a152007-02-01 15:46:50 +01002712 {}
2713};
2714
2715static int __devinit check_position_fix(struct azx *chip, int fix)
2716{
2717 const struct snd_pci_quirk *q;
2718
Takashi Iwaic673ba12009-03-17 07:49:14 +01002719 switch (fix) {
2720 case POS_FIX_LPIB:
2721 case POS_FIX_POSBUF:
David Henningsson4cb36312010-09-30 10:12:50 +02002722 case POS_FIX_VIACOMBO:
Takashi Iwaia6f2fd52012-02-28 11:58:40 +01002723 case POS_FIX_COMBO:
Takashi Iwaic673ba12009-03-17 07:49:14 +01002724 return fix;
2725 }
2726
Takashi Iwaic673ba12009-03-17 07:49:14 +01002727 q = snd_pci_quirk_lookup(chip->pci, position_fix_list);
2728 if (q) {
2729 printk(KERN_INFO
2730 "hda_intel: position_fix set to %d "
2731 "for device %04x:%04x\n",
2732 q->value, q->subvendor, q->subdevice);
2733 return q->value;
Takashi Iwai3372a152007-02-01 15:46:50 +01002734 }
David Henningssonbdd9ef22010-10-04 12:02:14 +02002735
2736 /* Check VIA/ATI HD Audio Controller exist */
Takashi Iwai9477c582011-05-25 09:11:37 +02002737 if (chip->driver_caps & AZX_DCAPS_POSFIX_VIA) {
2738 snd_printd(SFX "Using VIACOMBO position fix\n");
David Henningssonbdd9ef22010-10-04 12:02:14 +02002739 return POS_FIX_VIACOMBO;
2740 }
Takashi Iwai9477c582011-05-25 09:11:37 +02002741 if (chip->driver_caps & AZX_DCAPS_POSFIX_LPIB) {
2742 snd_printd(SFX "Using LPIB position fix\n");
2743 return POS_FIX_LPIB;
2744 }
Seth Heasleyc20c5a82012-06-14 14:23:53 -07002745 if (chip->driver_caps & AZX_DCAPS_POSFIX_COMBO) {
2746 snd_printd(SFX "Using COMBO position fix\n");
2747 return POS_FIX_COMBO;
2748 }
Takashi Iwaic673ba12009-03-17 07:49:14 +01002749 return POS_FIX_AUTO;
Takashi Iwai3372a152007-02-01 15:46:50 +01002750}
2751
2752/*
Takashi Iwai669ba272007-08-17 09:17:36 +02002753 * black-lists for probe_mask
2754 */
2755static struct snd_pci_quirk probe_mask_list[] __devinitdata = {
2756 /* Thinkpad often breaks the controller communication when accessing
2757 * to the non-working (or non-existing) modem codec slot.
2758 */
2759 SND_PCI_QUIRK(0x1014, 0x05b7, "Thinkpad Z60", 0x01),
2760 SND_PCI_QUIRK(0x17aa, 0x2010, "Thinkpad X/T/R60", 0x01),
2761 SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X/T/R61", 0x01),
Takashi Iwai0edb9452008-11-07 14:53:09 +01002762 /* broken BIOS */
2763 SND_PCI_QUIRK(0x1028, 0x20ac, "Dell Studio Desktop", 0x01),
Takashi Iwaief1681d2008-11-24 17:29:28 +01002764 /* including bogus ALC268 in slot#2 that conflicts with ALC888 */
2765 SND_PCI_QUIRK(0x17c0, 0x4085, "Medion MD96630", 0x01),
Takashi Iwai20db7cb2009-02-13 08:18:48 +01002766 /* forced codec slots */
Ozan Çağlayan93574842009-05-23 15:00:04 +03002767 SND_PCI_QUIRK(0x1043, 0x1262, "ASUS W5Fm", 0x103),
Takashi Iwai20db7cb2009-02-13 08:18:48 +01002768 SND_PCI_QUIRK(0x1046, 0x1262, "ASUS W5F", 0x103),
Jaroslav Kyselaf3af9052012-04-26 17:52:35 +02002769 /* WinFast VP200 H (Teradici) user reported broken communication */
2770 SND_PCI_QUIRK(0x3a21, 0x040d, "WinFast VP200 H", 0x101),
Takashi Iwai669ba272007-08-17 09:17:36 +02002771 {}
2772};
2773
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01002774#define AZX_FORCE_CODEC_MASK 0x100
2775
Takashi Iwai5aba4f82008-01-07 15:16:37 +01002776static void __devinit check_probe_mask(struct azx *chip, int dev)
Takashi Iwai669ba272007-08-17 09:17:36 +02002777{
2778 const struct snd_pci_quirk *q;
2779
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01002780 chip->codec_probe_mask = probe_mask[dev];
2781 if (chip->codec_probe_mask == -1) {
Takashi Iwai669ba272007-08-17 09:17:36 +02002782 q = snd_pci_quirk_lookup(chip->pci, probe_mask_list);
2783 if (q) {
2784 printk(KERN_INFO
2785 "hda_intel: probe_mask set to 0x%x "
2786 "for device %04x:%04x\n",
2787 q->value, q->subvendor, q->subdevice);
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01002788 chip->codec_probe_mask = q->value;
Takashi Iwai669ba272007-08-17 09:17:36 +02002789 }
2790 }
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01002791
2792 /* check forced option */
2793 if (chip->codec_probe_mask != -1 &&
2794 (chip->codec_probe_mask & AZX_FORCE_CODEC_MASK)) {
2795 chip->codec_mask = chip->codec_probe_mask & 0xff;
2796 printk(KERN_INFO "hda_intel: codec_mask forced to 0x%x\n",
2797 chip->codec_mask);
2798 }
Takashi Iwai669ba272007-08-17 09:17:36 +02002799}
2800
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02002801/*
Takashi Iwai716238552009-09-28 13:14:04 +02002802 * white/black-list for enable_msi
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02002803 */
Takashi Iwai716238552009-09-28 13:14:04 +02002804static struct snd_pci_quirk msi_black_list[] __devinitdata = {
Takashi Iwai9dc83982009-12-22 08:15:01 +01002805 SND_PCI_QUIRK(0x1043, 0x81f2, "ASUS", 0), /* Athlon64 X2 + nvidia */
Takashi Iwai0a27fcf2010-02-15 17:05:28 +01002806 SND_PCI_QUIRK(0x1043, 0x81f6, "ASUS", 0), /* nvidia */
Ralf Gerbigecd21622010-03-09 18:25:47 +01002807 SND_PCI_QUIRK(0x1043, 0x822d, "ASUS", 0), /* Athlon64 X2 + nvidia MCP55 */
Michele Ballabio4193d132010-03-06 21:06:46 +01002808 SND_PCI_QUIRK(0x1849, 0x0888, "ASRock", 0), /* Athlon64 X2 + nvidia */
Takashi Iwai38155952010-04-04 12:14:03 +02002809 SND_PCI_QUIRK(0xa0a0, 0x0575, "Aopen MZ915-M", 0), /* ICH6 */
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02002810 {}
2811};
2812
2813static void __devinit check_msi(struct azx *chip)
2814{
2815 const struct snd_pci_quirk *q;
2816
Takashi Iwai716238552009-09-28 13:14:04 +02002817 if (enable_msi >= 0) {
2818 chip->msi = !!enable_msi;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02002819 return;
Takashi Iwai716238552009-09-28 13:14:04 +02002820 }
2821 chip->msi = 1; /* enable MSI as default */
2822 q = snd_pci_quirk_lookup(chip->pci, msi_black_list);
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02002823 if (q) {
2824 printk(KERN_INFO
2825 "hda_intel: msi for device %04x:%04x set to %d\n",
2826 q->subvendor, q->subdevice, q->value);
2827 chip->msi = q->value;
Takashi Iwai80c43ed2010-03-15 15:51:53 +01002828 return;
2829 }
2830
2831 /* NVidia chipsets seem to cause troubles with MSI */
Takashi Iwai9477c582011-05-25 09:11:37 +02002832 if (chip->driver_caps & AZX_DCAPS_NO_MSI) {
2833 printk(KERN_INFO "hda_intel: Disabling MSI\n");
Takashi Iwai80c43ed2010-03-15 15:51:53 +01002834 chip->msi = 0;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02002835 }
2836}
2837
Takashi Iwaia1585d72011-12-14 09:27:04 +01002838/* check the snoop mode availability */
2839static void __devinit azx_check_snoop_available(struct azx *chip)
2840{
2841 bool snoop = chip->snoop;
2842
2843 switch (chip->driver_type) {
2844 case AZX_DRIVER_VIA:
2845 /* force to non-snoop mode for a new VIA controller
2846 * when BIOS is set
2847 */
2848 if (snoop) {
2849 u8 val;
2850 pci_read_config_byte(chip->pci, 0x42, &val);
2851 if (!(val & 0x80) && chip->pci->revision == 0x30)
2852 snoop = false;
2853 }
2854 break;
2855 case AZX_DRIVER_ATIHDMI_NS:
2856 /* new ATI HDMI requires non-snoop */
2857 snoop = false;
2858 break;
2859 }
2860
2861 if (snoop != chip->snoop) {
2862 snd_printk(KERN_INFO SFX "Force to %s mode\n",
2863 snoop ? "snoop" : "non-snoop");
2864 chip->snoop = snoop;
2865 }
2866}
Takashi Iwai669ba272007-08-17 09:17:36 +02002867
2868/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002869 * constructor
2870 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002871static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci,
Takashi Iwai9477c582011-05-25 09:11:37 +02002872 int dev, unsigned int driver_caps,
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002873 struct azx **rchip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002874{
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002875 static struct snd_device_ops ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002876 .dev_free = azx_dev_free,
2877 };
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002878 struct azx *chip;
2879 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002880
2881 *rchip = NULL;
Tobin Davisbcd72002008-01-15 11:23:55 +01002882
Pavel Machek927fc862006-08-31 17:03:43 +02002883 err = pci_enable_device(pci);
2884 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002885 return err;
2886
Takashi Iwaie560d8d2005-09-09 14:21:46 +02002887 chip = kzalloc(sizeof(*chip), GFP_KERNEL);
Pavel Machek927fc862006-08-31 17:03:43 +02002888 if (!chip) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002889 snd_printk(KERN_ERR SFX "cannot allocate chip\n");
2890 pci_disable_device(pci);
2891 return -ENOMEM;
2892 }
2893
2894 spin_lock_init(&chip->reg_lock);
Ingo Molnar62932df2006-01-16 16:34:20 +01002895 mutex_init(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002896 chip->card = card;
2897 chip->pci = pci;
2898 chip->irq = -1;
Takashi Iwai9477c582011-05-25 09:11:37 +02002899 chip->driver_caps = driver_caps;
2900 chip->driver_type = driver_caps & 0xff;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02002901 check_msi(chip);
Takashi Iwai555e2192008-06-10 17:53:34 +02002902 chip->dev_index = dev;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002903 INIT_WORK(&chip->irq_pending_work, azx_irq_pending_work);
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002904 INIT_LIST_HEAD(&chip->pcm_list);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002905 init_vga_switcheroo(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002906
Shahin Ghazinouribeaffc32010-05-11 08:19:55 +02002907 chip->position_fix[0] = chip->position_fix[1] =
2908 check_position_fix(chip, position_fix[dev]);
Takashi Iwaia6f2fd52012-02-28 11:58:40 +01002909 /* combo mode uses LPIB for playback */
2910 if (chip->position_fix[0] == POS_FIX_COMBO) {
2911 chip->position_fix[0] = POS_FIX_LPIB;
2912 chip->position_fix[1] = POS_FIX_AUTO;
2913 }
2914
Takashi Iwai5aba4f82008-01-07 15:16:37 +01002915 check_probe_mask(chip, dev);
Takashi Iwai3372a152007-02-01 15:46:50 +01002916
Takashi Iwai27346162006-01-12 18:28:44 +01002917 chip->single_cmd = single_cmd;
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002918 chip->snoop = hda_snoop;
Takashi Iwaia1585d72011-12-14 09:27:04 +01002919 azx_check_snoop_available(chip);
Takashi Iwaic74db862005-05-12 14:26:27 +02002920
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02002921 if (bdl_pos_adj[dev] < 0) {
2922 switch (chip->driver_type) {
Takashi Iwai0c6341a2008-06-13 20:50:27 +02002923 case AZX_DRIVER_ICH:
Seth Heasley32679f92010-02-22 17:31:09 -08002924 case AZX_DRIVER_PCH:
Takashi Iwai0c6341a2008-06-13 20:50:27 +02002925 bdl_pos_adj[dev] = 1;
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02002926 break;
2927 default:
Takashi Iwai0c6341a2008-06-13 20:50:27 +02002928 bdl_pos_adj[dev] = 32;
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02002929 break;
2930 }
2931 }
2932
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002933 if (check_hdmi_disabled(pci)) {
2934 snd_printk(KERN_INFO SFX "VGA controller for %s is disabled\n",
2935 pci_name(pci));
2936 if (use_vga_switcheroo(chip)) {
2937 snd_printk(KERN_INFO SFX "Delaying initialization\n");
2938 chip->disabled = true;
2939 goto ok;
2940 }
2941 kfree(chip);
2942 pci_disable_device(pci);
2943 return -ENXIO;
2944 }
2945
2946 err = azx_first_init(chip);
2947 if (err < 0) {
2948 azx_free(chip);
2949 return err;
2950 }
2951
2952 ok:
2953 err = register_vga_switcheroo(chip);
2954 if (err < 0) {
2955 snd_printk(KERN_ERR SFX
2956 "Error registering VGA-switcheroo client\n");
2957 azx_free(chip);
2958 return err;
2959 }
2960
2961 err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
2962 if (err < 0) {
2963 snd_printk(KERN_ERR SFX "Error creating device [card]!\n");
2964 azx_free(chip);
2965 return err;
2966 }
2967
2968 *rchip = chip;
2969 return 0;
2970}
2971
2972static int DELAYED_INIT_MARK azx_first_init(struct azx *chip)
2973{
2974 int dev = chip->dev_index;
2975 struct pci_dev *pci = chip->pci;
2976 struct snd_card *card = chip->card;
2977 int i, err;
2978 unsigned short gcap;
2979
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002980#if BITS_PER_LONG != 64
2981 /* Fix up base address on ULI M5461 */
2982 if (chip->driver_type == AZX_DRIVER_ULI) {
2983 u16 tmp3;
2984 pci_read_config_word(pci, 0x40, &tmp3);
2985 pci_write_config_word(pci, 0x40, tmp3 | 0x10);
2986 pci_write_config_dword(pci, PCI_BASE_ADDRESS_1, 0);
2987 }
2988#endif
2989
Pavel Machek927fc862006-08-31 17:03:43 +02002990 err = pci_request_regions(pci, "ICH HD audio");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002991 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002992 return err;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002993 chip->region_requested = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002994
Pavel Machek927fc862006-08-31 17:03:43 +02002995 chip->addr = pci_resource_start(pci, 0);
Arjan van de Ven2f5ad542008-09-28 16:20:09 -07002996 chip->remap_addr = pci_ioremap_bar(pci, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002997 if (chip->remap_addr == NULL) {
2998 snd_printk(KERN_ERR SFX "ioremap error\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002999 return -ENXIO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003000 }
3001
Takashi Iwai68e7fff2006-10-23 13:40:59 +02003002 if (chip->msi)
3003 if (pci_enable_msi(pci) < 0)
3004 chip->msi = 0;
Stephen Hemminger7376d012006-08-21 19:17:46 +02003005
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003006 if (azx_acquire_irq(chip, 0) < 0)
3007 return -EBUSY;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003008
3009 pci_set_master(pci);
3010 synchronize_irq(chip->irq);
3011
Tobin Davisbcd72002008-01-15 11:23:55 +01003012 gcap = azx_readw(chip, GCAP);
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02003013 snd_printdd(SFX "chipset global capabilities = 0x%x\n", gcap);
Tobin Davisbcd72002008-01-15 11:23:55 +01003014
Andiry Brienzadc4c2e62009-07-08 13:55:31 +08003015 /* disable SB600 64bit support for safety */
Takashi Iwai9477c582011-05-25 09:11:37 +02003016 if (chip->pci->vendor == PCI_VENDOR_ID_ATI) {
Andiry Brienzadc4c2e62009-07-08 13:55:31 +08003017 struct pci_dev *p_smbus;
3018 p_smbus = pci_get_device(PCI_VENDOR_ID_ATI,
3019 PCI_DEVICE_ID_ATI_SBX00_SMBUS,
3020 NULL);
3021 if (p_smbus) {
3022 if (p_smbus->revision < 0x30)
3023 gcap &= ~ICH6_GCAP_64OK;
3024 pci_dev_put(p_smbus);
3025 }
3026 }
Takashi Iwai09240cf2009-03-17 07:47:18 +01003027
Takashi Iwai9477c582011-05-25 09:11:37 +02003028 /* disable 64bit DMA address on some devices */
3029 if (chip->driver_caps & AZX_DCAPS_NO_64BIT) {
3030 snd_printd(SFX "Disabling 64bit DMA\n");
Jaroslav Kysela396087e2009-12-09 10:44:47 +01003031 gcap &= ~ICH6_GCAP_64OK;
Takashi Iwai9477c582011-05-25 09:11:37 +02003032 }
Jaroslav Kysela396087e2009-12-09 10:44:47 +01003033
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003034 /* disable buffer size rounding to 128-byte multiples if supported */
Takashi Iwai7bfe0592012-01-23 17:53:39 +01003035 if (align_buffer_size >= 0)
3036 chip->align_buffer_size = !!align_buffer_size;
3037 else {
3038 if (chip->driver_caps & AZX_DCAPS_BUFSIZE)
3039 chip->align_buffer_size = 0;
3040 else if (chip->driver_caps & AZX_DCAPS_ALIGN_BUFSIZE)
3041 chip->align_buffer_size = 1;
3042 else
3043 chip->align_buffer_size = 1;
3044 }
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003045
Takashi Iwaicf7aaca2008-02-06 15:05:57 +01003046 /* allow 64bit DMA address if supported by H/W */
Takashi Iwaib21fadb2009-05-28 12:26:15 +02003047 if ((gcap & ICH6_GCAP_64OK) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64)))
Yang Hongyange9304382009-04-13 14:40:14 -07003048 pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(64));
Takashi Iwai09240cf2009-03-17 07:47:18 +01003049 else {
Yang Hongyange9304382009-04-13 14:40:14 -07003050 pci_set_dma_mask(pci, DMA_BIT_MASK(32));
3051 pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(32));
Takashi Iwai09240cf2009-03-17 07:47:18 +01003052 }
Takashi Iwaicf7aaca2008-02-06 15:05:57 +01003053
Takashi Iwai8b6ed8e2008-02-19 11:36:35 +01003054 /* read number of streams from GCAP register instead of using
3055 * hardcoded value
3056 */
3057 chip->capture_streams = (gcap >> 8) & 0x0f;
3058 chip->playback_streams = (gcap >> 12) & 0x0f;
3059 if (!chip->playback_streams && !chip->capture_streams) {
Tobin Davisbcd72002008-01-15 11:23:55 +01003060 /* gcap didn't give any info, switching to old method */
3061
3062 switch (chip->driver_type) {
3063 case AZX_DRIVER_ULI:
3064 chip->playback_streams = ULI_NUM_PLAYBACK;
3065 chip->capture_streams = ULI_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01003066 break;
3067 case AZX_DRIVER_ATIHDMI:
Andiry Xu1815b342011-12-14 16:10:27 +08003068 case AZX_DRIVER_ATIHDMI_NS:
Tobin Davisbcd72002008-01-15 11:23:55 +01003069 chip->playback_streams = ATIHDMI_NUM_PLAYBACK;
3070 chip->capture_streams = ATIHDMI_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01003071 break;
Yang, Libinc4da29c2008-11-13 11:07:07 +01003072 case AZX_DRIVER_GENERIC:
Tobin Davisbcd72002008-01-15 11:23:55 +01003073 default:
3074 chip->playback_streams = ICH6_NUM_PLAYBACK;
3075 chip->capture_streams = ICH6_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01003076 break;
3077 }
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003078 }
Takashi Iwai8b6ed8e2008-02-19 11:36:35 +01003079 chip->capture_index_offset = 0;
3080 chip->playback_index_offset = chip->capture_streams;
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003081 chip->num_streams = chip->playback_streams + chip->capture_streams;
Takashi Iwaid01ce992007-07-27 16:52:19 +02003082 chip->azx_dev = kcalloc(chip->num_streams, sizeof(*chip->azx_dev),
3083 GFP_KERNEL);
Pavel Machek927fc862006-08-31 17:03:43 +02003084 if (!chip->azx_dev) {
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02003085 snd_printk(KERN_ERR SFX "cannot malloc azx_dev\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003086 return -ENOMEM;
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003087 }
3088
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003089 for (i = 0; i < chip->num_streams; i++) {
3090 /* allocate memory for the BDL for each stream */
3091 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
3092 snd_dma_pci_data(chip->pci),
3093 BDL_SIZE, &chip->azx_dev[i].bdl);
3094 if (err < 0) {
3095 snd_printk(KERN_ERR SFX "cannot allocate BDL\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003096 return -ENOMEM;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003097 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003098 mark_pages_wc(chip, &chip->azx_dev[i].bdl, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003099 }
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02003100 /* allocate memory for the position buffer */
Takashi Iwaid01ce992007-07-27 16:52:19 +02003101 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
3102 snd_dma_pci_data(chip->pci),
3103 chip->num_streams * 8, &chip->posbuf);
3104 if (err < 0) {
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02003105 snd_printk(KERN_ERR SFX "cannot allocate posbuf\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003106 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003107 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003108 mark_pages_wc(chip, &chip->posbuf, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003109 /* allocate CORB/RIRB */
Takashi Iwai81740862009-05-26 15:22:00 +02003110 err = azx_alloc_cmd_io(chip);
3111 if (err < 0)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003112 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003113
3114 /* initialize streams */
3115 azx_init_stream(chip);
3116
3117 /* initialize chip */
Takashi Iwaicb53c622007-08-10 17:21:45 +02003118 azx_init_pci(chip);
Jaroslav Kysela10e77dd2010-03-26 11:04:38 +01003119 azx_init_chip(chip, (probe_only[dev] & 2) == 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003120
3121 /* codec detection */
Pavel Machek927fc862006-08-31 17:03:43 +02003122 if (!chip->codec_mask) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003123 snd_printk(KERN_ERR SFX "no codecs found!\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003124 return -ENODEV;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003125 }
3126
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003127 strcpy(card->driver, "HDA-Intel");
Takashi Iwai18cb7102009-04-16 10:22:24 +02003128 strlcpy(card->shortname, driver_short_names[chip->driver_type],
3129 sizeof(card->shortname));
3130 snprintf(card->longname, sizeof(card->longname),
3131 "%s at 0x%lx irq %i",
3132 card->shortname, chip->addr, chip->irq);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003133
Linus Torvalds1da177e2005-04-16 15:20:36 -07003134 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003135}
3136
Takashi Iwaicb53c622007-08-10 17:21:45 +02003137static void power_down_all_codecs(struct azx *chip)
3138{
3139#ifdef CONFIG_SND_HDA_POWER_SAVE
3140 /* The codecs were powered up in snd_hda_codec_new().
3141 * Now all initialization done, so turn them down if possible
3142 */
3143 struct hda_codec *codec;
3144 list_for_each_entry(codec, &chip->bus->codec_list, list) {
3145 snd_hda_power_down(codec);
3146 }
3147#endif
3148}
3149
Takashi Iwaid01ce992007-07-27 16:52:19 +02003150static int __devinit azx_probe(struct pci_dev *pci,
3151 const struct pci_device_id *pci_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003152{
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003153 static int dev;
Takashi Iwaia98f90f2005-11-17 14:59:02 +01003154 struct snd_card *card;
3155 struct azx *chip;
Pavel Machek927fc862006-08-31 17:03:43 +02003156 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003157
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003158 if (dev >= SNDRV_CARDS)
3159 return -ENODEV;
3160 if (!enable[dev]) {
3161 dev++;
3162 return -ENOENT;
3163 }
3164
Takashi Iwaie58de7b2008-12-28 16:44:30 +01003165 err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card);
3166 if (err < 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003167 snd_printk(KERN_ERR SFX "Error creating card!\n");
Takashi Iwaie58de7b2008-12-28 16:44:30 +01003168 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003169 }
3170
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003171 /* set this here since it's referred in snd_hda_load_patch() */
3172 snd_card_set_dev(card, &pci->dev);
3173
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003174 err = azx_create(card, pci, dev, pci_id->driver_data, &chip);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003175 if (err < 0)
3176 goto out_free;
Takashi Iwai421a1252005-11-17 16:11:09 +01003177 card->private_data = chip;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003178
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003179 if (!chip->disabled) {
3180 err = azx_probe_continue(chip);
3181 if (err < 0)
3182 goto out_free;
3183 }
3184
3185 pci_set_drvdata(pci, card);
3186
3187 dev++;
3188 return 0;
3189
3190out_free:
3191 snd_card_free(card);
3192 return err;
3193}
3194
3195static int DELAYED_INIT_MARK azx_probe_continue(struct azx *chip)
3196{
3197 int dev = chip->dev_index;
3198 int err;
3199
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +01003200#ifdef CONFIG_SND_HDA_INPUT_BEEP
3201 chip->beep_mode = beep_mode[dev];
3202#endif
3203
Linus Torvalds1da177e2005-04-16 15:20:36 -07003204 /* create codec instances */
Takashi Iwaia1e21c92009-06-17 09:33:52 +02003205 err = azx_codec_create(chip, model[dev]);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003206 if (err < 0)
3207 goto out_free;
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003208#ifdef CONFIG_SND_HDA_PATCH_LOADER
Takashi Iwai41a63f12011-02-10 17:39:20 +01003209 if (patch[dev] && *patch[dev]) {
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003210 snd_printk(KERN_ERR SFX "Applying patch firmware '%s'\n",
3211 patch[dev]);
3212 err = snd_hda_load_patch(chip->bus, patch[dev]);
3213 if (err < 0)
3214 goto out_free;
3215 }
3216#endif
Jaroslav Kysela10e77dd2010-03-26 11:04:38 +01003217 if ((probe_only[dev] & 1) == 0) {
Takashi Iwaia1e21c92009-06-17 09:33:52 +02003218 err = azx_codec_configure(chip);
3219 if (err < 0)
3220 goto out_free;
3221 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003222
3223 /* create PCM streams */
Takashi Iwai176d5332008-07-30 15:01:44 +02003224 err = snd_hda_build_pcms(chip->bus);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003225 if (err < 0)
3226 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003227
3228 /* create mixer controls */
Takashi Iwaid01ce992007-07-27 16:52:19 +02003229 err = azx_mixer_create(chip);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003230 if (err < 0)
3231 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003232
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003233 err = snd_card_register(chip->card);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003234 if (err < 0)
3235 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003236
Takashi Iwaicb53c622007-08-10 17:21:45 +02003237 chip->running = 1;
3238 power_down_all_codecs(chip);
Takashi Iwai0cbf0092008-10-29 16:18:25 +01003239 azx_notifier_register(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003240
Takashi Iwai91219472012-04-26 12:13:25 +02003241 return 0;
3242
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003243out_free:
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003244 chip->init_failed = 1;
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003245 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003246}
3247
3248static void __devexit azx_remove(struct pci_dev *pci)
3249{
Takashi Iwai91219472012-04-26 12:13:25 +02003250 struct snd_card *card = pci_get_drvdata(pci);
3251 if (card)
3252 snd_card_free(card);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003253 pci_set_drvdata(pci, NULL);
3254}
3255
3256/* PCI IDs */
Alexey Dobriyancebe41d2010-02-06 00:21:03 +02003257static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
Seth Heasleyd2f2fcd2010-01-12 17:03:35 -08003258 /* CPT */
Takashi Iwai9477c582011-05-25 09:11:37 +02003259 { PCI_DEVICE(0x8086, 0x1c20),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003260 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP |
Seth Heasleyc20c5a82012-06-14 14:23:53 -07003261 AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_COMBO },
Seth Heasleycea310e2010-09-10 16:29:56 -07003262 /* PBG */
Takashi Iwai9477c582011-05-25 09:11:37 +02003263 { PCI_DEVICE(0x8086, 0x1d20),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003264 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP |
3265 AZX_DCAPS_BUFSIZE},
Seth Heasleyd2edeb72011-04-20 10:59:57 -07003266 /* Panther Point */
Takashi Iwai9477c582011-05-25 09:11:37 +02003267 { PCI_DEVICE(0x8086, 0x1e20),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003268 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP |
Seth Heasleyc20c5a82012-06-14 14:23:53 -07003269 AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_COMBO },
Seth Heasley8bc039a2012-01-23 16:24:31 -08003270 /* Lynx Point */
3271 { PCI_DEVICE(0x8086, 0x8c20),
3272 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP |
Seth Heasleyc20c5a82012-06-14 14:23:53 -07003273 AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_COMBO },
James Ralston144dad92012-08-09 09:38:59 -07003274 /* Lynx Point-LP */
3275 { PCI_DEVICE(0x8086, 0x9c20),
3276 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP |
3277 AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_COMBO },
3278 /* Lynx Point-LP */
3279 { PCI_DEVICE(0x8086, 0x9c21),
3280 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP |
3281 AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_COMBO },
Wang Xingchaoe926f2c2012-06-13 10:23:51 +08003282 /* Haswell */
3283 { PCI_DEVICE(0x8086, 0x0c0c),
Takashi Iwaibdbe34d2012-07-16 16:17:10 +02003284 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP |
Wang Xingchaoe926f2c2012-06-13 10:23:51 +08003285 AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_COMBO },
Takashi Iwai87218e92008-02-21 08:13:11 +01003286 /* SCH */
Takashi Iwai9477c582011-05-25 09:11:37 +02003287 { PCI_DEVICE(0x8086, 0x811b),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003288 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP |
David Henningsson645e9032011-12-14 15:52:30 +08003289 AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_LPIB }, /* Poulsbo */
Li Peng09904b92011-12-28 15:17:26 +00003290 { PCI_DEVICE(0x8086, 0x080a),
3291 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP |
David Henningsson716e5db2012-01-04 10:12:54 +01003292 AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_LPIB }, /* Oaktrail */
David Henningsson645e9032011-12-14 15:52:30 +08003293 /* ICH */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003294 { PCI_DEVICE(0x8086, 0x2668),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003295 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3296 AZX_DCAPS_BUFSIZE }, /* ICH6 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003297 { PCI_DEVICE(0x8086, 0x27d8),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003298 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3299 AZX_DCAPS_BUFSIZE }, /* ICH7 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003300 { PCI_DEVICE(0x8086, 0x269a),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003301 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3302 AZX_DCAPS_BUFSIZE }, /* ESB2 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003303 { PCI_DEVICE(0x8086, 0x284b),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003304 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3305 AZX_DCAPS_BUFSIZE }, /* ICH8 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003306 { PCI_DEVICE(0x8086, 0x293e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003307 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3308 AZX_DCAPS_BUFSIZE }, /* ICH9 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003309 { PCI_DEVICE(0x8086, 0x293f),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003310 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3311 AZX_DCAPS_BUFSIZE }, /* ICH9 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003312 { PCI_DEVICE(0x8086, 0x3a3e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003313 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3314 AZX_DCAPS_BUFSIZE }, /* ICH10 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003315 { PCI_DEVICE(0x8086, 0x3a6e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003316 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3317 AZX_DCAPS_BUFSIZE }, /* ICH10 */
Takashi Iwaib6864532010-09-15 10:17:26 +02003318 /* Generic Intel */
3319 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_ANY_ID),
3320 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3321 .class_mask = 0xffffff,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003322 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_BUFSIZE },
Takashi Iwai9477c582011-05-25 09:11:37 +02003323 /* ATI SB 450/600/700/800/900 */
3324 { PCI_DEVICE(0x1002, 0x437b),
3325 .driver_data = AZX_DRIVER_ATI | AZX_DCAPS_PRESET_ATI_SB },
3326 { PCI_DEVICE(0x1002, 0x4383),
3327 .driver_data = AZX_DRIVER_ATI | AZX_DCAPS_PRESET_ATI_SB },
3328 /* AMD Hudson */
3329 { PCI_DEVICE(0x1022, 0x780d),
3330 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_SB },
Takashi Iwai87218e92008-02-21 08:13:11 +01003331 /* ATI HDMI */
Takashi Iwai9477c582011-05-25 09:11:37 +02003332 { PCI_DEVICE(0x1002, 0x793b),
3333 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3334 { PCI_DEVICE(0x1002, 0x7919),
3335 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3336 { PCI_DEVICE(0x1002, 0x960f),
3337 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3338 { PCI_DEVICE(0x1002, 0x970f),
3339 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3340 { PCI_DEVICE(0x1002, 0xaa00),
3341 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3342 { PCI_DEVICE(0x1002, 0xaa08),
3343 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3344 { PCI_DEVICE(0x1002, 0xaa10),
3345 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3346 { PCI_DEVICE(0x1002, 0xaa18),
3347 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3348 { PCI_DEVICE(0x1002, 0xaa20),
3349 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3350 { PCI_DEVICE(0x1002, 0xaa28),
3351 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3352 { PCI_DEVICE(0x1002, 0xaa30),
3353 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3354 { PCI_DEVICE(0x1002, 0xaa38),
3355 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3356 { PCI_DEVICE(0x1002, 0xaa40),
3357 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3358 { PCI_DEVICE(0x1002, 0xaa48),
3359 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
Andiry Xu1815b342011-12-14 16:10:27 +08003360 { PCI_DEVICE(0x1002, 0x9902),
3361 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
3362 { PCI_DEVICE(0x1002, 0xaaa0),
3363 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
3364 { PCI_DEVICE(0x1002, 0xaaa8),
3365 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
3366 { PCI_DEVICE(0x1002, 0xaab0),
3367 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
Takashi Iwai87218e92008-02-21 08:13:11 +01003368 /* VIA VT8251/VT8237A */
Takashi Iwai9477c582011-05-25 09:11:37 +02003369 { PCI_DEVICE(0x1106, 0x3288),
3370 .driver_data = AZX_DRIVER_VIA | AZX_DCAPS_POSFIX_VIA },
Annie Liu754fdff2012-06-08 19:18:39 +08003371 /* VIA GFX VT7122/VX900 */
3372 { PCI_DEVICE(0x1106, 0x9170), .driver_data = AZX_DRIVER_GENERIC },
3373 /* VIA GFX VT6122/VX11 */
3374 { PCI_DEVICE(0x1106, 0x9140), .driver_data = AZX_DRIVER_GENERIC },
Takashi Iwai87218e92008-02-21 08:13:11 +01003375 /* SIS966 */
3376 { PCI_DEVICE(0x1039, 0x7502), .driver_data = AZX_DRIVER_SIS },
3377 /* ULI M5461 */
3378 { PCI_DEVICE(0x10b9, 0x5461), .driver_data = AZX_DRIVER_ULI },
3379 /* NVIDIA MCP */
Takashi Iwai0c2fd1bf42009-12-18 16:41:39 +01003380 { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID),
3381 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3382 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02003383 .driver_data = AZX_DRIVER_NVIDIA | AZX_DCAPS_PRESET_NVIDIA },
Kailang Yangf2690022008-05-27 11:44:55 +02003384 /* Teradici */
Takashi Iwai9477c582011-05-25 09:11:37 +02003385 { PCI_DEVICE(0x6549, 0x1200),
3386 .driver_data = AZX_DRIVER_TERA | AZX_DCAPS_NO_64BIT },
Takashi Iwai4e01f542009-04-16 08:53:34 +02003387 /* Creative X-Fi (CA0110-IBG) */
Takashi Iwaif2a8eca2012-06-11 15:51:54 +02003388 /* CTHDA chips */
3389 { PCI_DEVICE(0x1102, 0x0010),
3390 .driver_data = AZX_DRIVER_CTHDA | AZX_DCAPS_PRESET_CTHDA },
3391 { PCI_DEVICE(0x1102, 0x0012),
3392 .driver_data = AZX_DRIVER_CTHDA | AZX_DCAPS_PRESET_CTHDA },
Takashi Iwai313f6e22009-05-18 12:40:52 +02003393#if !defined(CONFIG_SND_CTXFI) && !defined(CONFIG_SND_CTXFI_MODULE)
3394 /* the following entry conflicts with snd-ctxfi driver,
3395 * as ctxfi driver mutates from HD-audio to native mode with
3396 * a special command sequence.
3397 */
Takashi Iwai4e01f542009-04-16 08:53:34 +02003398 { PCI_DEVICE(PCI_VENDOR_ID_CREATIVE, PCI_ANY_ID),
3399 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3400 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02003401 .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
Takashi Iwai69f9ba92011-11-06 13:49:13 +01003402 AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB },
Takashi Iwai313f6e22009-05-18 12:40:52 +02003403#else
3404 /* this entry seems still valid -- i.e. without emu20kx chip */
Takashi Iwai9477c582011-05-25 09:11:37 +02003405 { PCI_DEVICE(0x1102, 0x0009),
3406 .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
Takashi Iwai69f9ba92011-11-06 13:49:13 +01003407 AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB },
Takashi Iwai313f6e22009-05-18 12:40:52 +02003408#endif
Otavio Salvadore35d4b12010-09-26 23:35:06 -03003409 /* Vortex86MX */
3410 { PCI_DEVICE(0x17f3, 0x3010), .driver_data = AZX_DRIVER_GENERIC },
Bankim Bhavsar0f0714c52011-01-17 15:23:21 +01003411 /* VMware HDAudio */
3412 { PCI_DEVICE(0x15ad, 0x1977), .driver_data = AZX_DRIVER_GENERIC },
Andiry Brienza9176b672009-07-17 11:32:32 +08003413 /* AMD/ATI Generic, PCI class code and Vendor ID for HD Audio */
Yang, Libinc4da29c2008-11-13 11:07:07 +01003414 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_ANY_ID),
3415 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3416 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02003417 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_HDMI },
Andiry Brienza9176b672009-07-17 11:32:32 +08003418 { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_ANY_ID),
3419 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3420 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02003421 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_HDMI },
Linus Torvalds1da177e2005-04-16 15:20:36 -07003422 { 0, }
3423};
3424MODULE_DEVICE_TABLE(pci, azx_ids);
3425
3426/* pci_driver definition */
Takashi Iwaie9f66d92012-04-24 12:25:00 +02003427static struct pci_driver azx_driver = {
Takashi Iwai3733e422011-06-10 16:20:20 +02003428 .name = KBUILD_MODNAME,
Linus Torvalds1da177e2005-04-16 15:20:36 -07003429 .id_table = azx_ids,
3430 .probe = azx_probe,
3431 .remove = __devexit_p(azx_remove),
Takashi Iwai68cb2b52012-07-02 15:20:37 +02003432 .driver = {
3433 .pm = AZX_PM_OPS,
3434 },
Linus Torvalds1da177e2005-04-16 15:20:36 -07003435};
3436
Takashi Iwaie9f66d92012-04-24 12:25:00 +02003437module_pci_driver(azx_driver);