blob: 464ea16bdd9ed17992bff67faeb44e752fc14b91 [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>
Takashi Iwai4918cda2012-08-09 12:33:28 +020058#include <linux/firmware.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070059#include "hda_codec.h"
60
61
Takashi Iwai5aba4f82008-01-07 15:16:37 +010062static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
63static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
Rusty Russella67ff6a2011-12-15 13:49:36 +103064static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
Takashi Iwai5aba4f82008-01-07 15:16:37 +010065static char *model[SNDRV_CARDS];
66static int position_fix[SNDRV_CARDS];
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +020067static int bdl_pos_adj[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = -1};
Takashi Iwai5aba4f82008-01-07 15:16:37 +010068static int probe_mask[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = -1};
Takashi Iwaid4d9cd032008-12-19 15:19:11 +010069static int probe_only[SNDRV_CARDS];
Rusty Russella67ff6a2011-12-15 13:49:36 +103070static bool single_cmd;
Takashi Iwai716238552009-09-28 13:14:04 +020071static int enable_msi = -1;
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +020072#ifdef CONFIG_SND_HDA_PATCH_LOADER
73static char *patch[SNDRV_CARDS];
74#endif
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +010075#ifdef CONFIG_SND_HDA_INPUT_BEEP
Takashi Iwai0920c9b2012-07-03 16:58:48 +020076static bool beep_mode[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] =
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +010077 CONFIG_SND_HDA_INPUT_BEEP_MODE};
78#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070079
Takashi Iwai5aba4f82008-01-07 15:16:37 +010080module_param_array(index, int, NULL, 0444);
Linus Torvalds1da177e2005-04-16 15:20:36 -070081MODULE_PARM_DESC(index, "Index value for Intel HD audio interface.");
Takashi Iwai5aba4f82008-01-07 15:16:37 +010082module_param_array(id, charp, NULL, 0444);
Linus Torvalds1da177e2005-04-16 15:20:36 -070083MODULE_PARM_DESC(id, "ID string for Intel HD audio interface.");
Takashi Iwai5aba4f82008-01-07 15:16:37 +010084module_param_array(enable, bool, NULL, 0444);
85MODULE_PARM_DESC(enable, "Enable Intel HD audio interface.");
86module_param_array(model, charp, NULL, 0444);
Linus Torvalds1da177e2005-04-16 15:20:36 -070087MODULE_PARM_DESC(model, "Use the given board model.");
Takashi Iwai5aba4f82008-01-07 15:16:37 +010088module_param_array(position_fix, int, NULL, 0444);
David Henningsson4cb36312010-09-30 10:12:50 +020089MODULE_PARM_DESC(position_fix, "DMA pointer read method."
Takashi Iwaia6f2fd52012-02-28 11:58:40 +010090 "(0 = auto, 1 = LPIB, 2 = POSBUF, 3 = VIACOMBO, 4 = COMBO).");
Takashi Iwai555e2192008-06-10 17:53:34 +020091module_param_array(bdl_pos_adj, int, NULL, 0644);
92MODULE_PARM_DESC(bdl_pos_adj, "BDL position adjustment offset.");
Takashi Iwai5aba4f82008-01-07 15:16:37 +010093module_param_array(probe_mask, int, NULL, 0444);
Takashi Iwai606ad752005-11-24 16:03:40 +010094MODULE_PARM_DESC(probe_mask, "Bitmask to probe codecs (default = -1).");
Jaroslav Kysela079e6832010-03-26 11:16:59 +010095module_param_array(probe_only, int, NULL, 0444);
Takashi Iwaid4d9cd032008-12-19 15:19:11 +010096MODULE_PARM_DESC(probe_only, "Only probing and no codec initialization.");
Takashi Iwai27346162006-01-12 18:28:44 +010097module_param(single_cmd, bool, 0444);
Takashi Iwaid01ce992007-07-27 16:52:19 +020098MODULE_PARM_DESC(single_cmd, "Use single command to communicate with codecs "
99 "(for debugging only).");
Takashi Iwaiac9ef6c2012-01-20 12:08:44 +0100100module_param(enable_msi, bint, 0444);
Takashi Iwai134a11f2006-11-10 12:08:37 +0100101MODULE_PARM_DESC(enable_msi, "Enable Message Signaled Interrupt (MSI)");
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +0200102#ifdef CONFIG_SND_HDA_PATCH_LOADER
103module_param_array(patch, charp, NULL, 0444);
104MODULE_PARM_DESC(patch, "Patch file for Intel HD audio interface.");
105#endif
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +0100106#ifdef CONFIG_SND_HDA_INPUT_BEEP
Takashi Iwai0920c9b2012-07-03 16:58:48 +0200107module_param_array(beep_mode, bool, NULL, 0444);
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +0100108MODULE_PARM_DESC(beep_mode, "Select HDA Beep registration mode "
Takashi Iwai0920c9b2012-07-03 16:58:48 +0200109 "(0=off, 1=on) (default=1).");
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +0100110#endif
Takashi Iwai606ad752005-11-24 16:03:40 +0100111
Takashi Iwaidee1b662007-08-13 16:10:30 +0200112#ifdef CONFIG_SND_HDA_POWER_SAVE
Takashi Iwaifee2fba2008-11-27 12:43:28 +0100113static int power_save = CONFIG_SND_HDA_POWER_SAVE_DEFAULT;
114module_param(power_save, int, 0644);
115MODULE_PARM_DESC(power_save, "Automatic power-saving timeout "
116 "(in second, 0 = disable).");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700117
Takashi Iwaidee1b662007-08-13 16:10:30 +0200118/* reset the HD-audio controller in power save mode.
119 * this may give more power-saving, but will take longer time to
120 * wake up.
121 */
Rusty Russella67ff6a2011-12-15 13:49:36 +1030122static bool power_save_controller = 1;
Takashi Iwaidee1b662007-08-13 16:10:30 +0200123module_param(power_save_controller, bool, 0644);
124MODULE_PARM_DESC(power_save_controller, "Reset controller in power save mode.");
125#endif
126
Takashi Iwai7bfe0592012-01-23 17:53:39 +0100127static int align_buffer_size = -1;
128module_param(align_buffer_size, bint, 0644);
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -0500129MODULE_PARM_DESC(align_buffer_size,
130 "Force buffer and period sizes to be multiple of 128 bytes.");
131
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200132#ifdef CONFIG_X86
133static bool hda_snoop = true;
134module_param_named(snoop, hda_snoop, bool, 0444);
135MODULE_PARM_DESC(snoop, "Enable/disable snooping");
136#define azx_snoop(chip) (chip)->snoop
137#else
138#define hda_snoop true
139#define azx_snoop(chip) true
140#endif
141
142
Linus Torvalds1da177e2005-04-16 15:20:36 -0700143MODULE_LICENSE("GPL");
144MODULE_SUPPORTED_DEVICE("{{Intel, ICH6},"
145 "{Intel, ICH6M},"
Jason Gaston2f1b3812005-05-01 08:58:50 -0700146 "{Intel, ICH7},"
Frederick Lif5d40b32005-05-12 14:55:20 +0200147 "{Intel, ESB2},"
Jason Gastond2981392006-01-10 11:07:37 +0100148 "{Intel, ICH8},"
Jason Gastonf9cc8a82006-11-22 11:53:52 +0100149 "{Intel, ICH9},"
Jason Gastonc34f5a02008-01-29 12:38:49 +0100150 "{Intel, ICH10},"
Seth Heasleyb29c2362008-08-08 15:56:39 -0700151 "{Intel, PCH},"
Seth Heasleyd2f2fcd2010-01-12 17:03:35 -0800152 "{Intel, CPT},"
Seth Heasleyd2edeb72011-04-20 10:59:57 -0700153 "{Intel, PPT},"
Seth Heasley8bc039a2012-01-23 16:24:31 -0800154 "{Intel, LPT},"
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
Takashi Iwai4918cda2012-08-09 12:33:28 +0200474#ifdef CONFIG_SND_HDA_PATCH_LOADER
475 const struct firmware *fw;
476#endif
477
Takashi Iwaic74db862005-05-12 14:26:27 +0200478 /* flags */
Shahin Ghazinouribeaffc32010-05-11 08:19:55 +0200479 int position_fix[2]; /* for both playback/capture streams */
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200480 int poll_count;
Takashi Iwaicb53c622007-08-10 17:21:45 +0200481 unsigned int running :1;
Pavel Machek927fc862006-08-31 17:03:43 +0200482 unsigned int initialized :1;
483 unsigned int single_cmd :1;
484 unsigned int polling_mode :1;
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200485 unsigned int msi :1;
Takashi Iwaia6a950a2008-06-10 17:53:35 +0200486 unsigned int irq_pending_warned :1;
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +0100487 unsigned int probing :1; /* codec probing phase */
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200488 unsigned int snoop:1;
Takashi Iwai52409aa2012-01-23 17:10:24 +0100489 unsigned int align_buffer_size:1;
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200490 unsigned int region_requested:1;
491
492 /* VGA-switcheroo setup */
493 unsigned int use_vga_switcheroo:1;
494 unsigned int init_failed:1; /* delayed init failed */
495 unsigned int disabled:1; /* disabled by VGA-switcher */
Takashi Iwai43bbb6c2007-07-06 20:22:05 +0200496
497 /* for debugging */
Wu Fengguangfeb27342009-08-01 19:17:14 +0800498 unsigned int last_cmd[AZX_MAX_CODECS];
Takashi Iwai9ad593f2008-05-16 12:34:47 +0200499
500 /* for pending irqs */
501 struct work_struct irq_pending_work;
Takashi Iwai0cbf0092008-10-29 16:18:25 +0100502
503 /* reboot notifier (for mysterious hangup problem at power-down) */
504 struct notifier_block reboot_notifier;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700505};
506
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200507/* driver types */
508enum {
509 AZX_DRIVER_ICH,
Seth Heasley32679f92010-02-22 17:31:09 -0800510 AZX_DRIVER_PCH,
Tobin Davis4979bca2008-01-30 08:13:55 +0100511 AZX_DRIVER_SCH,
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200512 AZX_DRIVER_ATI,
Felix Kuehling778b6e12006-05-17 11:22:21 +0200513 AZX_DRIVER_ATIHDMI,
Andiry Xu1815b342011-12-14 16:10:27 +0800514 AZX_DRIVER_ATIHDMI_NS,
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200515 AZX_DRIVER_VIA,
516 AZX_DRIVER_SIS,
517 AZX_DRIVER_ULI,
Vinod Gda3fca22005-09-13 18:49:12 +0200518 AZX_DRIVER_NVIDIA,
Kailang Yangf2690022008-05-27 11:44:55 +0200519 AZX_DRIVER_TERA,
Takashi Iwai14d34f12010-10-21 09:03:25 +0200520 AZX_DRIVER_CTX,
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200521 AZX_DRIVER_CTHDA,
Yang, Libinc4da29c2008-11-13 11:07:07 +0100522 AZX_DRIVER_GENERIC,
Takashi Iwai2f5983f2008-09-03 16:00:44 +0200523 AZX_NUM_DRIVERS, /* keep this as last entry */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200524};
525
Takashi Iwai9477c582011-05-25 09:11:37 +0200526/* driver quirks (capabilities) */
527/* bits 0-7 are used for indicating driver type */
528#define AZX_DCAPS_NO_TCSEL (1 << 8) /* No Intel TCSEL bit */
529#define AZX_DCAPS_NO_MSI (1 << 9) /* No MSI support */
530#define AZX_DCAPS_ATI_SNOOP (1 << 10) /* ATI snoop enable */
531#define AZX_DCAPS_NVIDIA_SNOOP (1 << 11) /* Nvidia snoop enable */
532#define AZX_DCAPS_SCH_SNOOP (1 << 12) /* SCH/PCH snoop enable */
533#define AZX_DCAPS_RIRB_DELAY (1 << 13) /* Long delay in read loop */
534#define AZX_DCAPS_RIRB_PRE_DELAY (1 << 14) /* Put a delay before read */
535#define AZX_DCAPS_CTX_WORKAROUND (1 << 15) /* X-Fi workaround */
536#define AZX_DCAPS_POSFIX_LPIB (1 << 16) /* Use LPIB as default */
537#define AZX_DCAPS_POSFIX_VIA (1 << 17) /* Use VIACOMBO as default */
538#define AZX_DCAPS_NO_64BIT (1 << 18) /* No 64bit address */
539#define AZX_DCAPS_SYNC_WRITE (1 << 19) /* sync each cmd write */
Takashi Iwai8b0bd222011-06-10 14:56:26 +0200540#define AZX_DCAPS_OLD_SSYNC (1 << 20) /* Old SSYNC reg for ICH */
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -0500541#define AZX_DCAPS_BUFSIZE (1 << 21) /* no buffer size alignment */
Takashi Iwai7bfe0592012-01-23 17:53:39 +0100542#define AZX_DCAPS_ALIGN_BUFSIZE (1 << 22) /* buffer size alignment */
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200543#define AZX_DCAPS_4K_BDLE_BOUNDARY (1 << 23) /* BDLE in 4k boundary */
Seth Heasleyc20c5a82012-06-14 14:23:53 -0700544#define AZX_DCAPS_POSFIX_COMBO (1 << 24) /* Use COMBO as default */
Takashi Iwai9477c582011-05-25 09:11:37 +0200545
546/* quirks for ATI SB / AMD Hudson */
547#define AZX_DCAPS_PRESET_ATI_SB \
548 (AZX_DCAPS_ATI_SNOOP | AZX_DCAPS_NO_TCSEL | \
549 AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB)
550
551/* quirks for ATI/AMD HDMI */
552#define AZX_DCAPS_PRESET_ATI_HDMI \
553 (AZX_DCAPS_NO_TCSEL | AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB)
554
555/* quirks for Nvidia */
556#define AZX_DCAPS_PRESET_NVIDIA \
Takashi Iwai7bfe0592012-01-23 17:53:39 +0100557 (AZX_DCAPS_NVIDIA_SNOOP | AZX_DCAPS_RIRB_DELAY | AZX_DCAPS_NO_MSI |\
558 AZX_DCAPS_ALIGN_BUFSIZE)
Takashi Iwai9477c582011-05-25 09:11:37 +0200559
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200560#define AZX_DCAPS_PRESET_CTHDA \
561 (AZX_DCAPS_NO_MSI | AZX_DCAPS_POSFIX_LPIB | AZX_DCAPS_4K_BDLE_BOUNDARY)
562
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200563/*
564 * VGA-switcher support
565 */
566#ifdef SUPPORT_VGA_SWITCHEROO
Takashi Iwai5cb543d2012-08-09 13:49:23 +0200567#define use_vga_switcheroo(chip) ((chip)->use_vga_switcheroo)
568#else
569#define use_vga_switcheroo(chip) 0
570#endif
571
572#if defined(SUPPORT_VGA_SWITCHEROO) || defined(CONFIG_SND_HDA_PATCH_LOADER)
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200573#define DELAYED_INIT_MARK
574#define DELAYED_INITDATA_MARK
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200575#else
576#define DELAYED_INIT_MARK __devinit
577#define DELAYED_INITDATA_MARK __devinitdata
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200578#endif
579
580static char *driver_short_names[] DELAYED_INITDATA_MARK = {
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200581 [AZX_DRIVER_ICH] = "HDA Intel",
Seth Heasley32679f92010-02-22 17:31:09 -0800582 [AZX_DRIVER_PCH] = "HDA Intel PCH",
Tobin Davis4979bca2008-01-30 08:13:55 +0100583 [AZX_DRIVER_SCH] = "HDA Intel MID",
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200584 [AZX_DRIVER_ATI] = "HDA ATI SB",
Felix Kuehling778b6e12006-05-17 11:22:21 +0200585 [AZX_DRIVER_ATIHDMI] = "HDA ATI HDMI",
Andiry Xu1815b342011-12-14 16:10:27 +0800586 [AZX_DRIVER_ATIHDMI_NS] = "HDA ATI HDMI",
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200587 [AZX_DRIVER_VIA] = "HDA VIA VT82xx",
588 [AZX_DRIVER_SIS] = "HDA SIS966",
Vinod Gda3fca22005-09-13 18:49:12 +0200589 [AZX_DRIVER_ULI] = "HDA ULI M5461",
590 [AZX_DRIVER_NVIDIA] = "HDA NVidia",
Kailang Yangf2690022008-05-27 11:44:55 +0200591 [AZX_DRIVER_TERA] = "HDA Teradici",
Takashi Iwai14d34f12010-10-21 09:03:25 +0200592 [AZX_DRIVER_CTX] = "HDA Creative",
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200593 [AZX_DRIVER_CTHDA] = "HDA Creative",
Yang, Libinc4da29c2008-11-13 11:07:07 +0100594 [AZX_DRIVER_GENERIC] = "HD-Audio Generic",
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200595};
596
Linus Torvalds1da177e2005-04-16 15:20:36 -0700597/*
598 * macros for easy use
599 */
600#define azx_writel(chip,reg,value) \
601 writel(value, (chip)->remap_addr + ICH6_REG_##reg)
602#define azx_readl(chip,reg) \
603 readl((chip)->remap_addr + ICH6_REG_##reg)
604#define azx_writew(chip,reg,value) \
605 writew(value, (chip)->remap_addr + ICH6_REG_##reg)
606#define azx_readw(chip,reg) \
607 readw((chip)->remap_addr + ICH6_REG_##reg)
608#define azx_writeb(chip,reg,value) \
609 writeb(value, (chip)->remap_addr + ICH6_REG_##reg)
610#define azx_readb(chip,reg) \
611 readb((chip)->remap_addr + ICH6_REG_##reg)
612
613#define azx_sd_writel(dev,reg,value) \
614 writel(value, (dev)->sd_addr + ICH6_REG_##reg)
615#define azx_sd_readl(dev,reg) \
616 readl((dev)->sd_addr + ICH6_REG_##reg)
617#define azx_sd_writew(dev,reg,value) \
618 writew(value, (dev)->sd_addr + ICH6_REG_##reg)
619#define azx_sd_readw(dev,reg) \
620 readw((dev)->sd_addr + ICH6_REG_##reg)
621#define azx_sd_writeb(dev,reg,value) \
622 writeb(value, (dev)->sd_addr + ICH6_REG_##reg)
623#define azx_sd_readb(dev,reg) \
624 readb((dev)->sd_addr + ICH6_REG_##reg)
625
626/* for pcm support */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100627#define get_azx_dev(substream) (substream->runtime->private_data)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700628
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200629#ifdef CONFIG_X86
630static void __mark_pages_wc(struct azx *chip, void *addr, size_t size, bool on)
631{
632 if (azx_snoop(chip))
633 return;
634 if (addr && size) {
635 int pages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
636 if (on)
637 set_memory_wc((unsigned long)addr, pages);
638 else
639 set_memory_wb((unsigned long)addr, pages);
640 }
641}
642
643static inline void mark_pages_wc(struct azx *chip, struct snd_dma_buffer *buf,
644 bool on)
645{
646 __mark_pages_wc(chip, buf->area, buf->bytes, on);
647}
648static inline void mark_runtime_wc(struct azx *chip, struct azx_dev *azx_dev,
649 struct snd_pcm_runtime *runtime, bool on)
650{
651 if (azx_dev->wc_marked != on) {
652 __mark_pages_wc(chip, runtime->dma_area, runtime->dma_bytes, on);
653 azx_dev->wc_marked = on;
654 }
655}
656#else
657/* NOP for other archs */
658static inline void mark_pages_wc(struct azx *chip, struct snd_dma_buffer *buf,
659 bool on)
660{
661}
662static inline void mark_runtime_wc(struct azx *chip, struct azx_dev *azx_dev,
663 struct snd_pcm_runtime *runtime, bool on)
664{
665}
666#endif
667
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200668static int azx_acquire_irq(struct azx *chip, int do_disconnect);
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200669static int azx_send_cmd(struct hda_bus *bus, unsigned int val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700670/*
671 * Interface for HD codec
672 */
673
Linus Torvalds1da177e2005-04-16 15:20:36 -0700674/*
675 * CORB / RIRB interface
676 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100677static int azx_alloc_cmd_io(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700678{
679 int err;
680
681 /* single page (at least 4096 bytes) must suffice for both ringbuffes */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200682 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
683 snd_dma_pci_data(chip->pci),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700684 PAGE_SIZE, &chip->rb);
685 if (err < 0) {
686 snd_printk(KERN_ERR SFX "cannot allocate CORB/RIRB\n");
687 return err;
688 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200689 mark_pages_wc(chip, &chip->rb, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700690 return 0;
691}
692
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100693static void azx_init_cmd_io(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700694{
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800695 spin_lock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700696 /* CORB set up */
697 chip->corb.addr = chip->rb.addr;
698 chip->corb.buf = (u32 *)chip->rb.area;
699 azx_writel(chip, CORBLBASE, (u32)chip->corb.addr);
Takashi Iwai766979e2008-06-13 20:53:56 +0200700 azx_writel(chip, CORBUBASE, upper_32_bits(chip->corb.addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700701
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200702 /* set the corb size to 256 entries (ULI requires explicitly) */
703 azx_writeb(chip, CORBSIZE, 0x02);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700704 /* set the corb write pointer to 0 */
705 azx_writew(chip, CORBWP, 0);
706 /* reset the corb hw read pointer */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200707 azx_writew(chip, CORBRP, ICH6_CORBRP_RST);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700708 /* enable corb dma */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200709 azx_writeb(chip, CORBCTL, ICH6_CORBCTL_RUN);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700710
711 /* RIRB set up */
712 chip->rirb.addr = chip->rb.addr + 2048;
713 chip->rirb.buf = (u32 *)(chip->rb.area + 2048);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800714 chip->rirb.wp = chip->rirb.rp = 0;
715 memset(chip->rirb.cmds, 0, sizeof(chip->rirb.cmds));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700716 azx_writel(chip, RIRBLBASE, (u32)chip->rirb.addr);
Takashi Iwai766979e2008-06-13 20:53:56 +0200717 azx_writel(chip, RIRBUBASE, upper_32_bits(chip->rirb.addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700718
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200719 /* set the rirb size to 256 entries (ULI requires explicitly) */
720 azx_writeb(chip, RIRBSIZE, 0x02);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700721 /* reset the rirb hw write pointer */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200722 azx_writew(chip, RIRBWP, ICH6_RIRBWP_RST);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700723 /* set N=1, get RIRB response interrupt for new entry */
Takashi Iwai9477c582011-05-25 09:11:37 +0200724 if (chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND)
Takashi Iwai14d34f12010-10-21 09:03:25 +0200725 azx_writew(chip, RINTCNT, 0xc0);
726 else
727 azx_writew(chip, RINTCNT, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700728 /* enable rirb dma and response irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700729 azx_writeb(chip, RIRBCTL, ICH6_RBCTL_DMA_EN | ICH6_RBCTL_IRQ_EN);
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800730 spin_unlock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700731}
732
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100733static void azx_free_cmd_io(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700734{
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800735 spin_lock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700736 /* disable ringbuffer DMAs */
737 azx_writeb(chip, RIRBCTL, 0);
738 azx_writeb(chip, CORBCTL, 0);
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800739 spin_unlock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700740}
741
Wu Fengguangdeadff12009-08-01 18:45:16 +0800742static unsigned int azx_command_addr(u32 cmd)
743{
744 unsigned int addr = cmd >> 28;
745
746 if (addr >= AZX_MAX_CODECS) {
747 snd_BUG();
748 addr = 0;
749 }
750
751 return addr;
752}
753
754static unsigned int azx_response_addr(u32 res)
755{
756 unsigned int addr = res & 0xf;
757
758 if (addr >= AZX_MAX_CODECS) {
759 snd_BUG();
760 addr = 0;
761 }
762
763 return addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700764}
765
766/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100767static int azx_corb_send_cmd(struct hda_bus *bus, u32 val)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700768{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100769 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800770 unsigned int addr = azx_command_addr(val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700771 unsigned int wp;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700772
Wu Fengguangc32649f2009-08-01 18:48:12 +0800773 spin_lock_irq(&chip->reg_lock);
774
Linus Torvalds1da177e2005-04-16 15:20:36 -0700775 /* add command to corb */
776 wp = azx_readb(chip, CORBWP);
777 wp++;
778 wp %= ICH6_MAX_CORB_ENTRIES;
779
Wu Fengguangdeadff12009-08-01 18:45:16 +0800780 chip->rirb.cmds[addr]++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700781 chip->corb.buf[wp] = cpu_to_le32(val);
782 azx_writel(chip, CORBWP, wp);
Wu Fengguangc32649f2009-08-01 18:48:12 +0800783
Linus Torvalds1da177e2005-04-16 15:20:36 -0700784 spin_unlock_irq(&chip->reg_lock);
785
786 return 0;
787}
788
789#define ICH6_RIRB_EX_UNSOL_EV (1<<4)
790
791/* retrieve RIRB entry - called from interrupt handler */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100792static void azx_update_rirb(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700793{
794 unsigned int rp, wp;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800795 unsigned int addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700796 u32 res, res_ex;
797
798 wp = azx_readb(chip, RIRBWP);
799 if (wp == chip->rirb.wp)
800 return;
801 chip->rirb.wp = wp;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800802
Linus Torvalds1da177e2005-04-16 15:20:36 -0700803 while (chip->rirb.rp != wp) {
804 chip->rirb.rp++;
805 chip->rirb.rp %= ICH6_MAX_RIRB_ENTRIES;
806
807 rp = chip->rirb.rp << 1; /* an RIRB entry is 8-bytes */
808 res_ex = le32_to_cpu(chip->rirb.buf[rp + 1]);
809 res = le32_to_cpu(chip->rirb.buf[rp]);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800810 addr = azx_response_addr(res_ex);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700811 if (res_ex & ICH6_RIRB_EX_UNSOL_EV)
812 snd_hda_queue_unsol_event(chip->bus, res, res_ex);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800813 else if (chip->rirb.cmds[addr]) {
814 chip->rirb.res[addr] = res;
Takashi Iwai2add9b92008-03-18 09:47:06 +0100815 smp_wmb();
Wu Fengguangdeadff12009-08-01 18:45:16 +0800816 chip->rirb.cmds[addr]--;
Wu Fengguange310bb02009-08-01 19:18:45 +0800817 } else
818 snd_printk(KERN_ERR SFX "spurious response %#x:%#x, "
819 "last cmd=%#08x\n",
820 res, res_ex,
821 chip->last_cmd[addr]);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700822 }
823}
824
825/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800826static unsigned int azx_rirb_get_response(struct hda_bus *bus,
827 unsigned int addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700828{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100829 struct azx *chip = bus->private_data;
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200830 unsigned long timeout;
David Henningsson32cf4022012-05-04 11:05:55 +0200831 unsigned long loopcounter;
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200832 int do_poll = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700833
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200834 again:
835 timeout = jiffies + msecs_to_jiffies(1000);
David Henningsson32cf4022012-05-04 11:05:55 +0200836
837 for (loopcounter = 0;; loopcounter++) {
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200838 if (chip->polling_mode || do_poll) {
Takashi Iwaie96224a2006-08-21 17:57:44 +0200839 spin_lock_irq(&chip->reg_lock);
840 azx_update_rirb(chip);
841 spin_unlock_irq(&chip->reg_lock);
842 }
Wu Fengguangdeadff12009-08-01 18:45:16 +0800843 if (!chip->rirb.cmds[addr]) {
Takashi Iwai2add9b92008-03-18 09:47:06 +0100844 smp_rmb();
Takashi Iwaib6132912009-03-24 07:36:09 +0100845 bus->rirb_error = 0;
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200846
847 if (!do_poll)
848 chip->poll_count = 0;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800849 return chip->rirb.res[addr]; /* the last value */
Takashi Iwai2add9b92008-03-18 09:47:06 +0100850 }
Takashi Iwai28a0d9d2008-01-18 15:32:32 +0100851 if (time_after(jiffies, timeout))
852 break;
David Henningsson32cf4022012-05-04 11:05:55 +0200853 if (bus->needs_damn_long_delay || loopcounter > 3000)
Takashi Iwai52987652008-01-16 16:09:47 +0100854 msleep(2); /* temporary workaround */
855 else {
856 udelay(10);
857 cond_resched();
858 }
Takashi Iwai28a0d9d2008-01-18 15:32:32 +0100859 }
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200860
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200861 if (!chip->polling_mode && chip->poll_count < 2) {
862 snd_printdd(SFX "azx_get_response timeout, "
863 "polling the codec once: last cmd=0x%08x\n",
864 chip->last_cmd[addr]);
865 do_poll = 1;
866 chip->poll_count++;
867 goto again;
868 }
869
870
Takashi Iwai23c4a882009-10-30 13:21:49 +0100871 if (!chip->polling_mode) {
872 snd_printk(KERN_WARNING SFX "azx_get_response timeout, "
873 "switching to polling mode: last cmd=0x%08x\n",
874 chip->last_cmd[addr]);
875 chip->polling_mode = 1;
876 goto again;
877 }
878
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200879 if (chip->msi) {
Takashi Iwai4abc1cc2009-05-19 12:16:46 +0200880 snd_printk(KERN_WARNING SFX "No response from codec, "
Wu Fengguangfeb27342009-08-01 19:17:14 +0800881 "disabling MSI: last cmd=0x%08x\n",
882 chip->last_cmd[addr]);
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200883 free_irq(chip->irq, chip);
884 chip->irq = -1;
885 pci_disable_msi(chip->pci);
886 chip->msi = 0;
Takashi Iwaib6132912009-03-24 07:36:09 +0100887 if (azx_acquire_irq(chip, 1) < 0) {
888 bus->rirb_error = 1;
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200889 return -1;
Takashi Iwaib6132912009-03-24 07:36:09 +0100890 }
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200891 goto again;
892 }
893
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +0100894 if (chip->probing) {
895 /* If this critical timeout happens during the codec probing
896 * phase, this is likely an access to a non-existing codec
897 * slot. Better to return an error and reset the system.
898 */
899 return -1;
900 }
901
Takashi Iwai8dd78332009-06-02 01:16:07 +0200902 /* a fatal communication error; need either to reset or to fallback
903 * to the single_cmd mode
904 */
Takashi Iwaib6132912009-03-24 07:36:09 +0100905 bus->rirb_error = 1;
Takashi Iwaib20f3b82009-06-02 01:20:22 +0200906 if (bus->allow_bus_reset && !bus->response_reset && !bus->in_reset) {
Takashi Iwai8dd78332009-06-02 01:16:07 +0200907 bus->response_reset = 1;
908 return -1; /* give a chance to retry */
909 }
910
911 snd_printk(KERN_ERR "hda_intel: azx_get_response timeout, "
912 "switching to single_cmd mode: last cmd=0x%08x\n",
Wu Fengguangfeb27342009-08-01 19:17:14 +0800913 chip->last_cmd[addr]);
Takashi Iwai8dd78332009-06-02 01:16:07 +0200914 chip->single_cmd = 1;
915 bus->response_reset = 0;
Takashi Iwai1a696972009-11-07 09:49:04 +0100916 /* release CORB/RIRB */
Takashi Iwai4fcd3922009-05-25 18:34:52 +0200917 azx_free_cmd_io(chip);
Takashi Iwai1a696972009-11-07 09:49:04 +0100918 /* disable unsolicited responses */
919 azx_writel(chip, GCTL, azx_readl(chip, GCTL) & ~ICH6_GCTL_UNSOL);
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200920 return -1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700921}
922
Linus Torvalds1da177e2005-04-16 15:20:36 -0700923/*
924 * Use the single immediate command instead of CORB/RIRB for simplicity
925 *
926 * Note: according to Intel, this is not preferred use. The command was
927 * intended for the BIOS only, and may get confused with unsolicited
928 * responses. So, we shouldn't use it for normal operation from the
929 * driver.
930 * I left the codes, however, for debugging/testing purposes.
931 */
932
Takashi Iwaib05a7d42009-05-28 11:59:12 +0200933/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800934static int azx_single_wait_for_response(struct azx *chip, unsigned int addr)
Takashi Iwaib05a7d42009-05-28 11:59:12 +0200935{
936 int timeout = 50;
937
938 while (timeout--) {
939 /* check IRV busy bit */
940 if (azx_readw(chip, IRS) & ICH6_IRS_VALID) {
941 /* reuse rirb.res as the response return value */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800942 chip->rirb.res[addr] = azx_readl(chip, IR);
Takashi Iwaib05a7d42009-05-28 11:59:12 +0200943 return 0;
944 }
945 udelay(1);
946 }
947 if (printk_ratelimit())
948 snd_printd(SFX "get_response timeout: IRS=0x%x\n",
949 azx_readw(chip, IRS));
Wu Fengguangdeadff12009-08-01 18:45:16 +0800950 chip->rirb.res[addr] = -1;
Takashi Iwaib05a7d42009-05-28 11:59:12 +0200951 return -EIO;
952}
953
Linus Torvalds1da177e2005-04-16 15:20:36 -0700954/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100955static int azx_single_send_cmd(struct hda_bus *bus, u32 val)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700956{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100957 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800958 unsigned int addr = azx_command_addr(val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700959 int timeout = 50;
960
Takashi Iwai8dd78332009-06-02 01:16:07 +0200961 bus->rirb_error = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700962 while (timeout--) {
963 /* check ICB busy bit */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200964 if (!((azx_readw(chip, IRS) & ICH6_IRS_BUSY))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700965 /* Clear IRV valid bit */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200966 azx_writew(chip, IRS, azx_readw(chip, IRS) |
967 ICH6_IRS_VALID);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700968 azx_writel(chip, IC, val);
Takashi Iwaid01ce992007-07-27 16:52:19 +0200969 azx_writew(chip, IRS, azx_readw(chip, IRS) |
970 ICH6_IRS_BUSY);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800971 return azx_single_wait_for_response(chip, addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700972 }
973 udelay(1);
974 }
Marc Boucher1cfd52b2008-01-22 15:29:26 +0100975 if (printk_ratelimit())
976 snd_printd(SFX "send_cmd timeout: IRS=0x%x, val=0x%x\n",
977 azx_readw(chip, IRS), val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700978 return -EIO;
979}
980
981/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800982static unsigned int azx_single_get_response(struct hda_bus *bus,
983 unsigned int addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700984{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100985 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800986 return chip->rirb.res[addr];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700987}
988
Takashi Iwai111d3af2006-02-16 18:17:58 +0100989/*
990 * The below are the main callbacks from hda_codec.
991 *
992 * They are just the skeleton to call sub-callbacks according to the
993 * current setting of chip->single_cmd.
994 */
995
996/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100997static int azx_send_cmd(struct hda_bus *bus, unsigned int val)
Takashi Iwai111d3af2006-02-16 18:17:58 +0100998{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100999 struct azx *chip = bus->private_data;
Takashi Iwai43bbb6c2007-07-06 20:22:05 +02001000
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001001 if (chip->disabled)
1002 return 0;
Wu Fengguangfeb27342009-08-01 19:17:14 +08001003 chip->last_cmd[azx_command_addr(val)] = val;
Takashi Iwai111d3af2006-02-16 18:17:58 +01001004 if (chip->single_cmd)
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001005 return azx_single_send_cmd(bus, val);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001006 else
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001007 return azx_corb_send_cmd(bus, val);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001008}
1009
1010/* get a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +08001011static unsigned int azx_get_response(struct hda_bus *bus,
1012 unsigned int addr)
Takashi Iwai111d3af2006-02-16 18:17:58 +01001013{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001014 struct azx *chip = bus->private_data;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001015 if (chip->disabled)
1016 return 0;
Takashi Iwai111d3af2006-02-16 18:17:58 +01001017 if (chip->single_cmd)
Wu Fengguangdeadff12009-08-01 18:45:16 +08001018 return azx_single_get_response(bus, addr);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001019 else
Wu Fengguangdeadff12009-08-01 18:45:16 +08001020 return azx_rirb_get_response(bus, addr);
Takashi Iwai111d3af2006-02-16 18:17:58 +01001021}
1022
Takashi Iwaicb53c622007-08-10 17:21:45 +02001023#ifdef CONFIG_SND_HDA_POWER_SAVE
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001024static void azx_power_notify(struct hda_bus *bus);
Takashi Iwaicb53c622007-08-10 17:21:45 +02001025#endif
Takashi Iwai111d3af2006-02-16 18:17:58 +01001026
Linus Torvalds1da177e2005-04-16 15:20:36 -07001027/* reset codec link */
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001028static int azx_reset(struct azx *chip, int full_reset)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001029{
1030 int count;
1031
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001032 if (!full_reset)
1033 goto __skip;
1034
Danny Tholene8a7f132007-09-11 21:41:56 +02001035 /* clear STATESTS */
1036 azx_writeb(chip, STATESTS, STATESTS_INT_MASK);
1037
Linus Torvalds1da177e2005-04-16 15:20:36 -07001038 /* reset controller */
1039 azx_writel(chip, GCTL, azx_readl(chip, GCTL) & ~ICH6_GCTL_RESET);
1040
1041 count = 50;
1042 while (azx_readb(chip, GCTL) && --count)
1043 msleep(1);
1044
1045 /* delay for >= 100us for codec PLL to settle per spec
1046 * Rev 0.9 section 5.5.1
1047 */
1048 msleep(1);
1049
1050 /* Bring controller out of reset */
1051 azx_writeb(chip, GCTL, azx_readb(chip, GCTL) | ICH6_GCTL_RESET);
1052
1053 count = 50;
Pavel Machek927fc862006-08-31 17:03:43 +02001054 while (!azx_readb(chip, GCTL) && --count)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001055 msleep(1);
1056
Pavel Machek927fc862006-08-31 17:03:43 +02001057 /* Brent Chartrand said to wait >= 540us for codecs to initialize */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001058 msleep(1);
1059
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001060 __skip:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001061 /* check to see if controller is ready */
Pavel Machek927fc862006-08-31 17:03:43 +02001062 if (!azx_readb(chip, GCTL)) {
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001063 snd_printd(SFX "azx_reset: controller not ready!\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001064 return -EBUSY;
1065 }
1066
Matt41e2fce2005-07-04 17:49:55 +02001067 /* Accept unsolicited responses */
Takashi Iwai1a696972009-11-07 09:49:04 +01001068 if (!chip->single_cmd)
1069 azx_writel(chip, GCTL, azx_readl(chip, GCTL) |
1070 ICH6_GCTL_UNSOL);
Matt41e2fce2005-07-04 17:49:55 +02001071
Linus Torvalds1da177e2005-04-16 15:20:36 -07001072 /* detect codecs */
Pavel Machek927fc862006-08-31 17:03:43 +02001073 if (!chip->codec_mask) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001074 chip->codec_mask = azx_readw(chip, STATESTS);
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001075 snd_printdd(SFX "codec_mask = 0x%x\n", chip->codec_mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001076 }
1077
1078 return 0;
1079}
1080
1081
1082/*
1083 * Lowlevel interface
1084 */
1085
1086/* enable interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001087static void azx_int_enable(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001088{
1089 /* enable controller CIE and GIE */
1090 azx_writel(chip, INTCTL, azx_readl(chip, INTCTL) |
1091 ICH6_INT_CTRL_EN | ICH6_INT_GLOBAL_EN);
1092}
1093
1094/* disable interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001095static void azx_int_disable(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001096{
1097 int i;
1098
1099 /* disable interrupts in stream descriptor */
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001100 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001101 struct azx_dev *azx_dev = &chip->azx_dev[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001102 azx_sd_writeb(azx_dev, SD_CTL,
1103 azx_sd_readb(azx_dev, SD_CTL) & ~SD_INT_MASK);
1104 }
1105
1106 /* disable SIE for all streams */
1107 azx_writeb(chip, INTCTL, 0);
1108
1109 /* disable controller CIE and GIE */
1110 azx_writel(chip, INTCTL, azx_readl(chip, INTCTL) &
1111 ~(ICH6_INT_CTRL_EN | ICH6_INT_GLOBAL_EN));
1112}
1113
1114/* clear interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001115static void azx_int_clear(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001116{
1117 int i;
1118
1119 /* clear stream status */
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001120 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001121 struct azx_dev *azx_dev = &chip->azx_dev[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001122 azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK);
1123 }
1124
1125 /* clear STATESTS */
1126 azx_writeb(chip, STATESTS, STATESTS_INT_MASK);
1127
1128 /* clear rirb status */
1129 azx_writeb(chip, RIRBSTS, RIRB_INT_MASK);
1130
1131 /* clear int status */
1132 azx_writel(chip, INTSTS, ICH6_INT_CTRL_EN | ICH6_INT_ALL_STREAM);
1133}
1134
1135/* start a stream */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001136static void azx_stream_start(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001137{
Joseph Chan0e153472008-08-26 14:38:03 +02001138 /*
1139 * Before stream start, initialize parameter
1140 */
1141 azx_dev->insufficient = 1;
1142
Linus Torvalds1da177e2005-04-16 15:20:36 -07001143 /* enable SIE */
Wei Niccc5df02010-01-26 15:59:33 +08001144 azx_writel(chip, INTCTL,
1145 azx_readl(chip, INTCTL) | (1 << azx_dev->index));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001146 /* set DMA start and interrupt mask */
1147 azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) |
1148 SD_CTL_DMA_START | SD_INT_MASK);
1149}
1150
Takashi Iwai1dddab42009-03-18 15:15:37 +01001151/* stop DMA */
1152static void azx_stream_clear(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001153{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001154 azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) &
1155 ~(SD_CTL_DMA_START | SD_INT_MASK));
1156 azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK); /* to be sure */
Takashi Iwai1dddab42009-03-18 15:15:37 +01001157}
1158
1159/* stop a stream */
1160static void azx_stream_stop(struct azx *chip, struct azx_dev *azx_dev)
1161{
1162 azx_stream_clear(chip, azx_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001163 /* disable SIE */
Wei Niccc5df02010-01-26 15:59:33 +08001164 azx_writel(chip, INTCTL,
1165 azx_readl(chip, INTCTL) & ~(1 << azx_dev->index));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001166}
1167
1168
1169/*
Takashi Iwaicb53c622007-08-10 17:21:45 +02001170 * reset and start the controller registers
Linus Torvalds1da177e2005-04-16 15:20:36 -07001171 */
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001172static void azx_init_chip(struct azx *chip, int full_reset)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001173{
Takashi Iwaicb53c622007-08-10 17:21:45 +02001174 if (chip->initialized)
1175 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001176
1177 /* reset controller */
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001178 azx_reset(chip, full_reset);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001179
1180 /* initialize interrupts */
1181 azx_int_clear(chip);
1182 azx_int_enable(chip);
1183
1184 /* initialize the codec command I/O */
Takashi Iwai1a696972009-11-07 09:49:04 +01001185 if (!chip->single_cmd)
1186 azx_init_cmd_io(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001187
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02001188 /* program the position buffer */
1189 azx_writel(chip, DPLBASE, (u32)chip->posbuf.addr);
Takashi Iwai766979e2008-06-13 20:53:56 +02001190 azx_writel(chip, DPUBASE, upper_32_bits(chip->posbuf.addr));
Frederick Lif5d40b32005-05-12 14:55:20 +02001191
Takashi Iwaicb53c622007-08-10 17:21:45 +02001192 chip->initialized = 1;
1193}
1194
1195/*
1196 * initialize the PCI registers
1197 */
1198/* update bits in a PCI register byte */
1199static void update_pci_byte(struct pci_dev *pci, unsigned int reg,
1200 unsigned char mask, unsigned char val)
1201{
1202 unsigned char data;
1203
1204 pci_read_config_byte(pci, reg, &data);
1205 data &= ~mask;
1206 data |= (val & mask);
1207 pci_write_config_byte(pci, reg, data);
1208}
1209
1210static void azx_init_pci(struct azx *chip)
1211{
1212 /* Clear bits 0-2 of PCI register TCSEL (at offset 0x44)
1213 * TCSEL == Traffic Class Select Register, which sets PCI express QOS
1214 * Ensuring these bits are 0 clears playback static on some HD Audio
Adam Lackorzynskia09e89f2011-03-10 17:41:56 +01001215 * codecs.
1216 * The PCI register TCSEL is defined in the Intel manuals.
Takashi Iwaicb53c622007-08-10 17:21:45 +02001217 */
Linus Torvalds46f2cc82011-05-27 19:45:28 -07001218 if (!(chip->driver_caps & AZX_DCAPS_NO_TCSEL)) {
Takashi Iwai9477c582011-05-25 09:11:37 +02001219 snd_printdd(SFX "Clearing TCSEL\n");
Adam Lackorzynskia09e89f2011-03-10 17:41:56 +01001220 update_pci_byte(chip->pci, ICH6_PCIREG_TCSEL, 0x07, 0);
Takashi Iwai9477c582011-05-25 09:11:37 +02001221 }
Takashi Iwaicb53c622007-08-10 17:21:45 +02001222
Takashi Iwai9477c582011-05-25 09:11:37 +02001223 /* For ATI SB450/600/700/800/900 and AMD Hudson azalia HD audio,
1224 * we need to enable snoop.
1225 */
1226 if (chip->driver_caps & AZX_DCAPS_ATI_SNOOP) {
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001227 snd_printdd(SFX "Setting ATI snoop: %d\n", azx_snoop(chip));
Takashi Iwaicb53c622007-08-10 17:21:45 +02001228 update_pci_byte(chip->pci,
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001229 ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR, 0x07,
1230 azx_snoop(chip) ? ATI_SB450_HDAUDIO_ENABLE_SNOOP : 0);
Takashi Iwai9477c582011-05-25 09:11:37 +02001231 }
1232
1233 /* For NVIDIA HDA, enable snoop */
1234 if (chip->driver_caps & AZX_DCAPS_NVIDIA_SNOOP) {
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001235 snd_printdd(SFX "Setting Nvidia snoop: %d\n", azx_snoop(chip));
Takashi Iwaicb53c622007-08-10 17:21:45 +02001236 update_pci_byte(chip->pci,
1237 NVIDIA_HDA_TRANSREG_ADDR,
1238 0x0f, NVIDIA_HDA_ENABLE_COHBITS);
Peer Chen320dcc32008-08-20 16:43:24 -07001239 update_pci_byte(chip->pci,
1240 NVIDIA_HDA_ISTRM_COH,
1241 0x01, NVIDIA_HDA_ENABLE_COHBIT);
1242 update_pci_byte(chip->pci,
1243 NVIDIA_HDA_OSTRM_COH,
1244 0x01, NVIDIA_HDA_ENABLE_COHBIT);
Takashi Iwai9477c582011-05-25 09:11:37 +02001245 }
1246
1247 /* Enable SCH/PCH snoop if needed */
1248 if (chip->driver_caps & AZX_DCAPS_SCH_SNOOP) {
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001249 unsigned short snoop;
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001250 pci_read_config_word(chip->pci, INTEL_SCH_HDA_DEVC, &snoop);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001251 if ((!azx_snoop(chip) && !(snoop & INTEL_SCH_HDA_DEVC_NOSNOOP)) ||
1252 (azx_snoop(chip) && (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP))) {
1253 snoop &= ~INTEL_SCH_HDA_DEVC_NOSNOOP;
1254 if (!azx_snoop(chip))
1255 snoop |= INTEL_SCH_HDA_DEVC_NOSNOOP;
1256 pci_write_config_word(chip->pci, INTEL_SCH_HDA_DEVC, snoop);
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001257 pci_read_config_word(chip->pci,
1258 INTEL_SCH_HDA_DEVC, &snoop);
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001259 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001260 snd_printdd(SFX "SCH snoop: %s\n",
1261 (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP)
1262 ? "Disabled" : "Enabled");
Vinod Gda3fca22005-09-13 18:49:12 +02001263 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001264}
1265
1266
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001267static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev);
1268
Linus Torvalds1da177e2005-04-16 15:20:36 -07001269/*
1270 * interrupt handler
1271 */
David Howells7d12e782006-10-05 14:55:46 +01001272static irqreturn_t azx_interrupt(int irq, void *dev_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001273{
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001274 struct azx *chip = dev_id;
1275 struct azx_dev *azx_dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001276 u32 status;
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001277 u8 sd_status;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001278 int i, ok;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001279
1280 spin_lock(&chip->reg_lock);
1281
Dan Carpenter60911062012-05-18 10:36:11 +03001282 if (chip->disabled) {
1283 spin_unlock(&chip->reg_lock);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001284 return IRQ_NONE;
Dan Carpenter60911062012-05-18 10:36:11 +03001285 }
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001286
Linus Torvalds1da177e2005-04-16 15:20:36 -07001287 status = azx_readl(chip, INTSTS);
1288 if (status == 0) {
1289 spin_unlock(&chip->reg_lock);
1290 return IRQ_NONE;
1291 }
1292
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001293 for (i = 0; i < chip->num_streams; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001294 azx_dev = &chip->azx_dev[i];
1295 if (status & azx_dev->sd_int_sta_mask) {
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001296 sd_status = azx_sd_readb(azx_dev, SD_STS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001297 azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK);
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001298 if (!azx_dev->substream || !azx_dev->running ||
1299 !(sd_status & SD_INT_COMPLETE))
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001300 continue;
1301 /* check whether this IRQ is really acceptable */
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001302 ok = azx_position_ok(chip, azx_dev);
1303 if (ok == 1) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001304 azx_dev->irq_pending = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001305 spin_unlock(&chip->reg_lock);
1306 snd_pcm_period_elapsed(azx_dev->substream);
1307 spin_lock(&chip->reg_lock);
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001308 } else if (ok == 0 && chip->bus && chip->bus->workq) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001309 /* bogus IRQ, process it later */
1310 azx_dev->irq_pending = 1;
Takashi Iwai6acaed32009-01-12 10:09:24 +01001311 queue_work(chip->bus->workq,
1312 &chip->irq_pending_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001313 }
1314 }
1315 }
1316
1317 /* clear rirb int */
1318 status = azx_readb(chip, RIRBSTS);
1319 if (status & RIRB_INT_MASK) {
Takashi Iwai14d34f12010-10-21 09:03:25 +02001320 if (status & RIRB_INT_RESPONSE) {
Takashi Iwai9477c582011-05-25 09:11:37 +02001321 if (chip->driver_caps & AZX_DCAPS_RIRB_PRE_DELAY)
Takashi Iwai14d34f12010-10-21 09:03:25 +02001322 udelay(80);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001323 azx_update_rirb(chip);
Takashi Iwai14d34f12010-10-21 09:03:25 +02001324 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001325 azx_writeb(chip, RIRBSTS, RIRB_INT_MASK);
1326 }
1327
1328#if 0
1329 /* clear state status int */
1330 if (azx_readb(chip, STATESTS) & 0x04)
1331 azx_writeb(chip, STATESTS, 0x04);
1332#endif
1333 spin_unlock(&chip->reg_lock);
1334
1335 return IRQ_HANDLED;
1336}
1337
1338
1339/*
Takashi Iwai675f25d2008-06-10 17:53:20 +02001340 * set up a BDL entry
1341 */
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001342static int setup_bdle(struct azx *chip,
1343 struct snd_pcm_substream *substream,
Takashi Iwai675f25d2008-06-10 17:53:20 +02001344 struct azx_dev *azx_dev, u32 **bdlp,
1345 int ofs, int size, int with_ioc)
1346{
Takashi Iwai675f25d2008-06-10 17:53:20 +02001347 u32 *bdl = *bdlp;
1348
1349 while (size > 0) {
1350 dma_addr_t addr;
1351 int chunk;
1352
1353 if (azx_dev->frags >= AZX_MAX_BDL_ENTRIES)
1354 return -EINVAL;
1355
Takashi Iwai77a23f22008-08-21 13:00:13 +02001356 addr = snd_pcm_sgbuf_get_addr(substream, ofs);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001357 /* program the address field of the BDL entry */
1358 bdl[0] = cpu_to_le32((u32)addr);
Takashi Iwai766979e2008-06-13 20:53:56 +02001359 bdl[1] = cpu_to_le32(upper_32_bits(addr));
Takashi Iwai675f25d2008-06-10 17:53:20 +02001360 /* program the size field of the BDL entry */
Takashi Iwaifc4abee2008-07-30 15:13:34 +02001361 chunk = snd_pcm_sgbuf_get_chunk_size(substream, ofs, size);
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001362 /* one BDLE cannot cross 4K boundary on CTHDA chips */
1363 if (chip->driver_caps & AZX_DCAPS_4K_BDLE_BOUNDARY) {
1364 u32 remain = 0x1000 - (ofs & 0xfff);
1365 if (chunk > remain)
1366 chunk = remain;
1367 }
Takashi Iwai675f25d2008-06-10 17:53:20 +02001368 bdl[2] = cpu_to_le32(chunk);
1369 /* program the IOC to enable interrupt
1370 * only when the whole fragment is processed
1371 */
1372 size -= chunk;
1373 bdl[3] = (size || !with_ioc) ? 0 : cpu_to_le32(0x01);
1374 bdl += 4;
1375 azx_dev->frags++;
1376 ofs += chunk;
1377 }
1378 *bdlp = bdl;
1379 return ofs;
1380}
1381
1382/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001383 * set up BDL entries
1384 */
Takashi Iwai555e2192008-06-10 17:53:34 +02001385static int azx_setup_periods(struct azx *chip,
1386 struct snd_pcm_substream *substream,
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001387 struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001388{
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001389 u32 *bdl;
1390 int i, ofs, periods, period_bytes;
Takashi Iwai555e2192008-06-10 17:53:34 +02001391 int pos_adj;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001392
1393 /* reset BDL address */
1394 azx_sd_writel(azx_dev, SD_BDLPL, 0);
1395 azx_sd_writel(azx_dev, SD_BDLPU, 0);
1396
Takashi Iwai97b71c92009-03-18 15:09:13 +01001397 period_bytes = azx_dev->period_bytes;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001398 periods = azx_dev->bufsize / period_bytes;
1399
Linus Torvalds1da177e2005-04-16 15:20:36 -07001400 /* program the initial BDL entries */
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001401 bdl = (u32 *)azx_dev->bdl.area;
1402 ofs = 0;
1403 azx_dev->frags = 0;
Takashi Iwai555e2192008-06-10 17:53:34 +02001404 pos_adj = bdl_pos_adj[chip->dev_index];
1405 if (pos_adj > 0) {
Takashi Iwai675f25d2008-06-10 17:53:20 +02001406 struct snd_pcm_runtime *runtime = substream->runtime;
Takashi Iwaie785d3d2008-07-15 16:28:43 +02001407 int pos_align = pos_adj;
Takashi Iwai555e2192008-06-10 17:53:34 +02001408 pos_adj = (pos_adj * runtime->rate + 47999) / 48000;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001409 if (!pos_adj)
Takashi Iwaie785d3d2008-07-15 16:28:43 +02001410 pos_adj = pos_align;
1411 else
1412 pos_adj = ((pos_adj + pos_align - 1) / pos_align) *
1413 pos_align;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001414 pos_adj = frames_to_bytes(runtime, pos_adj);
1415 if (pos_adj >= period_bytes) {
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001416 snd_printk(KERN_WARNING SFX "Too big adjustment %d\n",
Takashi Iwai555e2192008-06-10 17:53:34 +02001417 bdl_pos_adj[chip->dev_index]);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001418 pos_adj = 0;
1419 } else {
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001420 ofs = setup_bdle(chip, substream, azx_dev,
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001421 &bdl, ofs, pos_adj,
1422 !substream->runtime->no_period_wakeup);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001423 if (ofs < 0)
1424 goto error;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001425 }
Takashi Iwai555e2192008-06-10 17:53:34 +02001426 } else
1427 pos_adj = 0;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001428 for (i = 0; i < periods; i++) {
1429 if (i == periods - 1 && pos_adj)
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001430 ofs = setup_bdle(chip, substream, azx_dev, &bdl, ofs,
Takashi Iwai675f25d2008-06-10 17:53:20 +02001431 period_bytes - pos_adj, 0);
1432 else
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001433 ofs = setup_bdle(chip, substream, azx_dev, &bdl, ofs,
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001434 period_bytes,
1435 !substream->runtime->no_period_wakeup);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001436 if (ofs < 0)
1437 goto error;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001438 }
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001439 return 0;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001440
1441 error:
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001442 snd_printk(KERN_ERR SFX "Too many BDL entries: buffer=%d, period=%d\n",
Takashi Iwai675f25d2008-06-10 17:53:20 +02001443 azx_dev->bufsize, period_bytes);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001444 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001445}
1446
Takashi Iwai1dddab42009-03-18 15:15:37 +01001447/* reset stream */
1448static void azx_stream_reset(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001449{
1450 unsigned char val;
1451 int timeout;
1452
Takashi Iwai1dddab42009-03-18 15:15:37 +01001453 azx_stream_clear(chip, azx_dev);
1454
Takashi Iwaid01ce992007-07-27 16:52:19 +02001455 azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) |
1456 SD_CTL_STREAM_RESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001457 udelay(3);
1458 timeout = 300;
1459 while (!((val = azx_sd_readb(azx_dev, SD_CTL)) & SD_CTL_STREAM_RESET) &&
1460 --timeout)
1461 ;
1462 val &= ~SD_CTL_STREAM_RESET;
1463 azx_sd_writeb(azx_dev, SD_CTL, val);
1464 udelay(3);
1465
1466 timeout = 300;
1467 /* waiting for hardware to report that the stream is out of reset */
1468 while (((val = azx_sd_readb(azx_dev, SD_CTL)) & SD_CTL_STREAM_RESET) &&
1469 --timeout)
1470 ;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001471
1472 /* reset first position - may not be synced with hw at this time */
1473 *azx_dev->posbuf = 0;
Takashi Iwai1dddab42009-03-18 15:15:37 +01001474}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001475
Takashi Iwai1dddab42009-03-18 15:15:37 +01001476/*
1477 * set up the SD for streaming
1478 */
1479static int azx_setup_controller(struct azx *chip, struct azx_dev *azx_dev)
1480{
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001481 unsigned int val;
Takashi Iwai1dddab42009-03-18 15:15:37 +01001482 /* make sure the run bit is zero for SD */
1483 azx_stream_clear(chip, azx_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001484 /* program the stream_tag */
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001485 val = azx_sd_readl(azx_dev, SD_CTL);
1486 val = (val & ~SD_CTL_STREAM_TAG_MASK) |
1487 (azx_dev->stream_tag << SD_CTL_STREAM_TAG_SHIFT);
1488 if (!azx_snoop(chip))
1489 val |= SD_CTL_TRAFFIC_PRIO;
1490 azx_sd_writel(azx_dev, SD_CTL, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001491
1492 /* program the length of samples in cyclic buffer */
1493 azx_sd_writel(azx_dev, SD_CBL, azx_dev->bufsize);
1494
1495 /* program the stream format */
1496 /* this value needs to be the same as the one programmed */
1497 azx_sd_writew(azx_dev, SD_FORMAT, azx_dev->format_val);
1498
1499 /* program the stream LVI (last valid index) of the BDL */
1500 azx_sd_writew(azx_dev, SD_LVI, azx_dev->frags - 1);
1501
1502 /* program the BDL address */
1503 /* lower BDL address */
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001504 azx_sd_writel(azx_dev, SD_BDLPL, (u32)azx_dev->bdl.addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001505 /* upper BDL address */
Takashi Iwai766979e2008-06-13 20:53:56 +02001506 azx_sd_writel(azx_dev, SD_BDLPU, upper_32_bits(azx_dev->bdl.addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001507
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02001508 /* enable the position buffer */
David Henningsson4cb36312010-09-30 10:12:50 +02001509 if (chip->position_fix[0] != POS_FIX_LPIB ||
1510 chip->position_fix[1] != POS_FIX_LPIB) {
Takashi Iwaiee9d6b92008-03-14 15:52:20 +01001511 if (!(azx_readl(chip, DPLBASE) & ICH6_DPLBASE_ENABLE))
1512 azx_writel(chip, DPLBASE,
1513 (u32)chip->posbuf.addr | ICH6_DPLBASE_ENABLE);
1514 }
Takashi Iwaic74db862005-05-12 14:26:27 +02001515
Linus Torvalds1da177e2005-04-16 15:20:36 -07001516 /* set the interrupt enable bits in the descriptor control register */
Takashi Iwaid01ce992007-07-27 16:52:19 +02001517 azx_sd_writel(azx_dev, SD_CTL,
1518 azx_sd_readl(azx_dev, SD_CTL) | SD_INT_MASK);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001519
1520 return 0;
1521}
1522
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001523/*
1524 * Probe the given codec address
1525 */
1526static int probe_codec(struct azx *chip, int addr)
1527{
1528 unsigned int cmd = (addr << 28) | (AC_NODE_ROOT << 20) |
1529 (AC_VERB_PARAMETERS << 8) | AC_PAR_VENDOR_ID;
1530 unsigned int res;
1531
Wu Fengguanga678cde2009-08-01 18:46:46 +08001532 mutex_lock(&chip->bus->cmd_mutex);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001533 chip->probing = 1;
1534 azx_send_cmd(chip->bus, cmd);
Wu Fengguangdeadff12009-08-01 18:45:16 +08001535 res = azx_get_response(chip->bus, addr);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001536 chip->probing = 0;
Wu Fengguanga678cde2009-08-01 18:46:46 +08001537 mutex_unlock(&chip->bus->cmd_mutex);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001538 if (res == -1)
1539 return -EIO;
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001540 snd_printdd(SFX "codec #%d probed OK\n", addr);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001541 return 0;
1542}
1543
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001544static int azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec,
1545 struct hda_pcm *cpcm);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001546static void azx_stop_chip(struct azx *chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001547
Takashi Iwai8dd78332009-06-02 01:16:07 +02001548static void azx_bus_reset(struct hda_bus *bus)
1549{
1550 struct azx *chip = bus->private_data;
Takashi Iwai8dd78332009-06-02 01:16:07 +02001551
1552 bus->in_reset = 1;
1553 azx_stop_chip(chip);
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001554 azx_init_chip(chip, 1);
Alexander Beregalov65f75982009-06-04 13:46:16 +04001555#ifdef CONFIG_PM
Takashi Iwai8dd78332009-06-02 01:16:07 +02001556 if (chip->initialized) {
Takashi Iwai01b65bf2011-11-24 14:31:46 +01001557 struct azx_pcm *p;
1558 list_for_each_entry(p, &chip->pcm_list, list)
1559 snd_pcm_suspend_all(p->pcm);
Takashi Iwai8dd78332009-06-02 01:16:07 +02001560 snd_hda_suspend(chip->bus);
1561 snd_hda_resume(chip->bus);
1562 }
Alexander Beregalov65f75982009-06-04 13:46:16 +04001563#endif
Takashi Iwai8dd78332009-06-02 01:16:07 +02001564 bus->in_reset = 0;
1565}
1566
Linus Torvalds1da177e2005-04-16 15:20:36 -07001567/*
1568 * Codec initialization
1569 */
1570
Takashi Iwai2f5983f2008-09-03 16:00:44 +02001571/* number of codec slots for each chipset: 0 = default slots (i.e. 4) */
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001572static unsigned int azx_max_codecs[AZX_NUM_DRIVERS] DELAYED_INITDATA_MARK = {
Wei Ni7445dfc2010-03-03 15:05:53 +08001573 [AZX_DRIVER_NVIDIA] = 8,
Kailang Yangf2690022008-05-27 11:44:55 +02001574 [AZX_DRIVER_TERA] = 1,
Takashi Iwaia9995a32007-03-12 21:30:46 +01001575};
1576
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001577static int DELAYED_INIT_MARK azx_codec_create(struct azx *chip, const char *model)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001578{
1579 struct hda_bus_template bus_temp;
Takashi Iwai34c25352008-10-28 11:38:58 +01001580 int c, codecs, err;
1581 int max_slots;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001582
1583 memset(&bus_temp, 0, sizeof(bus_temp));
1584 bus_temp.private_data = chip;
1585 bus_temp.modelname = model;
1586 bus_temp.pci = chip->pci;
Takashi Iwai111d3af2006-02-16 18:17:58 +01001587 bus_temp.ops.command = azx_send_cmd;
1588 bus_temp.ops.get_response = azx_get_response;
Takashi Iwai176d5332008-07-30 15:01:44 +02001589 bus_temp.ops.attach_pcm = azx_attach_pcm_stream;
Takashi Iwai8dd78332009-06-02 01:16:07 +02001590 bus_temp.ops.bus_reset = azx_bus_reset;
Takashi Iwaicb53c622007-08-10 17:21:45 +02001591#ifdef CONFIG_SND_HDA_POWER_SAVE
Takashi Iwai11cd41b2008-11-28 07:22:18 +01001592 bus_temp.power_save = &power_save;
Takashi Iwaicb53c622007-08-10 17:21:45 +02001593 bus_temp.ops.pm_notify = azx_power_notify;
1594#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07001595
Takashi Iwaid01ce992007-07-27 16:52:19 +02001596 err = snd_hda_bus_new(chip->card, &bus_temp, &chip->bus);
1597 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001598 return err;
1599
Takashi Iwai9477c582011-05-25 09:11:37 +02001600 if (chip->driver_caps & AZX_DCAPS_RIRB_DELAY) {
1601 snd_printd(SFX "Enable delay in RIRB handling\n");
Wei Nidc9c8e22008-09-26 13:55:56 +08001602 chip->bus->needs_damn_long_delay = 1;
Takashi Iwai9477c582011-05-25 09:11:37 +02001603 }
Wei Nidc9c8e22008-09-26 13:55:56 +08001604
Takashi Iwai34c25352008-10-28 11:38:58 +01001605 codecs = 0;
Takashi Iwai2f5983f2008-09-03 16:00:44 +02001606 max_slots = azx_max_codecs[chip->driver_type];
1607 if (!max_slots)
Wei Ni7445dfc2010-03-03 15:05:53 +08001608 max_slots = AZX_DEFAULT_CODECS;
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001609
1610 /* First try to probe all given codec slots */
1611 for (c = 0; c < max_slots; c++) {
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01001612 if ((chip->codec_mask & (1 << c)) & chip->codec_probe_mask) {
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001613 if (probe_codec(chip, c) < 0) {
1614 /* Some BIOSen give you wrong codec addresses
1615 * that don't exist
1616 */
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001617 snd_printk(KERN_WARNING SFX
1618 "Codec #%d probe error; "
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001619 "disabling it...\n", c);
1620 chip->codec_mask &= ~(1 << c);
1621 /* More badly, accessing to a non-existing
1622 * codec often screws up the controller chip,
Paul Menzel24481582010-02-08 20:37:26 +01001623 * and disturbs the further communications.
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001624 * Thus if an error occurs during probing,
1625 * better to reset the controller chip to
1626 * get back to the sanity state.
1627 */
1628 azx_stop_chip(chip);
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001629 azx_init_chip(chip, 1);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001630 }
1631 }
1632 }
1633
Takashi Iwaid507cd62011-04-26 15:25:02 +02001634 /* AMD chipsets often cause the communication stalls upon certain
1635 * sequence like the pin-detection. It seems that forcing the synced
1636 * access works around the stall. Grrr...
1637 */
Takashi Iwai9477c582011-05-25 09:11:37 +02001638 if (chip->driver_caps & AZX_DCAPS_SYNC_WRITE) {
1639 snd_printd(SFX "Enable sync_write for stable communication\n");
Takashi Iwaid507cd62011-04-26 15:25:02 +02001640 chip->bus->sync_write = 1;
1641 chip->bus->allow_bus_reset = 1;
1642 }
1643
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001644 /* Then create codec instances */
Takashi Iwai34c25352008-10-28 11:38:58 +01001645 for (c = 0; c < max_slots; c++) {
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01001646 if ((chip->codec_mask & (1 << c)) & chip->codec_probe_mask) {
Takashi Iwaibccad142007-04-24 12:23:53 +02001647 struct hda_codec *codec;
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001648 err = snd_hda_codec_new(chip->bus, c, &codec);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001649 if (err < 0)
1650 continue;
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +01001651 codec->beep_mode = chip->beep_mode;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001652 codecs++;
Takashi Iwai19a982b2007-03-21 15:14:35 +01001653 }
1654 }
1655 if (!codecs) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001656 snd_printk(KERN_ERR SFX "no codecs initialized\n");
1657 return -ENXIO;
1658 }
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001659 return 0;
1660}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001661
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001662/* configure each codec instance */
1663static int __devinit azx_codec_configure(struct azx *chip)
1664{
1665 struct hda_codec *codec;
1666 list_for_each_entry(codec, &chip->bus->codec_list, list) {
1667 snd_hda_codec_configure(codec);
1668 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001669 return 0;
1670}
1671
1672
1673/*
1674 * PCM support
1675 */
1676
1677/* assign a stream for the PCM */
Wu Fengguangef18bed2009-12-25 13:14:27 +08001678static inline struct azx_dev *
1679azx_assign_device(struct azx *chip, struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001680{
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001681 int dev, i, nums;
Wu Fengguangef18bed2009-12-25 13:14:27 +08001682 struct azx_dev *res = NULL;
Takashi Iwaid5cf9912011-10-06 10:07:58 +02001683 /* make a non-zero unique key for the substream */
1684 int key = (substream->pcm->device << 16) | (substream->number << 2) |
1685 (substream->stream + 1);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001686
1687 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001688 dev = chip->playback_index_offset;
1689 nums = chip->playback_streams;
1690 } else {
1691 dev = chip->capture_index_offset;
1692 nums = chip->capture_streams;
1693 }
1694 for (i = 0; i < nums; i++, dev++)
Takashi Iwaid01ce992007-07-27 16:52:19 +02001695 if (!chip->azx_dev[dev].opened) {
Wu Fengguangef18bed2009-12-25 13:14:27 +08001696 res = &chip->azx_dev[dev];
Takashi Iwaid5cf9912011-10-06 10:07:58 +02001697 if (res->assigned_key == key)
Wu Fengguangef18bed2009-12-25 13:14:27 +08001698 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001699 }
Wu Fengguangef18bed2009-12-25 13:14:27 +08001700 if (res) {
1701 res->opened = 1;
Takashi Iwaid5cf9912011-10-06 10:07:58 +02001702 res->assigned_key = key;
Wu Fengguangef18bed2009-12-25 13:14:27 +08001703 }
1704 return res;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001705}
1706
1707/* release the assigned stream */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001708static inline void azx_release_device(struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001709{
1710 azx_dev->opened = 0;
1711}
1712
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001713static struct snd_pcm_hardware azx_pcm_hw = {
Takashi Iwaid01ce992007-07-27 16:52:19 +02001714 .info = (SNDRV_PCM_INFO_MMAP |
1715 SNDRV_PCM_INFO_INTERLEAVED |
Linus Torvalds1da177e2005-04-16 15:20:36 -07001716 SNDRV_PCM_INFO_BLOCK_TRANSFER |
1717 SNDRV_PCM_INFO_MMAP_VALID |
Pavel Machek927fc862006-08-31 17:03:43 +02001718 /* No full-resume yet implemented */
1719 /* SNDRV_PCM_INFO_RESUME |*/
Takashi Iwai850f0e52008-03-18 17:11:05 +01001720 SNDRV_PCM_INFO_PAUSE |
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001721 SNDRV_PCM_INFO_SYNC_START |
1722 SNDRV_PCM_INFO_NO_PERIOD_WAKEUP),
Linus Torvalds1da177e2005-04-16 15:20:36 -07001723 .formats = SNDRV_PCM_FMTBIT_S16_LE,
1724 .rates = SNDRV_PCM_RATE_48000,
1725 .rate_min = 48000,
1726 .rate_max = 48000,
1727 .channels_min = 2,
1728 .channels_max = 2,
1729 .buffer_bytes_max = AZX_MAX_BUF_SIZE,
1730 .period_bytes_min = 128,
1731 .period_bytes_max = AZX_MAX_BUF_SIZE / 2,
1732 .periods_min = 2,
1733 .periods_max = AZX_MAX_FRAG,
1734 .fifo_size = 0,
1735};
1736
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001737static int azx_pcm_open(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001738{
1739 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1740 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001741 struct azx *chip = apcm->chip;
1742 struct azx_dev *azx_dev;
1743 struct snd_pcm_runtime *runtime = substream->runtime;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001744 unsigned long flags;
1745 int err;
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001746 int buff_step;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001747
Ingo Molnar62932df2006-01-16 16:34:20 +01001748 mutex_lock(&chip->open_mutex);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001749 azx_dev = azx_assign_device(chip, substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001750 if (azx_dev == NULL) {
Ingo Molnar62932df2006-01-16 16:34:20 +01001751 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001752 return -EBUSY;
1753 }
1754 runtime->hw = azx_pcm_hw;
1755 runtime->hw.channels_min = hinfo->channels_min;
1756 runtime->hw.channels_max = hinfo->channels_max;
1757 runtime->hw.formats = hinfo->formats;
1758 runtime->hw.rates = hinfo->rates;
1759 snd_pcm_limit_hw_rates(runtime);
1760 snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
Takashi Iwai52409aa2012-01-23 17:10:24 +01001761 if (chip->align_buffer_size)
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001762 /* constrain buffer sizes to be multiple of 128
1763 bytes. This is more efficient in terms of memory
1764 access but isn't required by the HDA spec and
1765 prevents users from specifying exact period/buffer
1766 sizes. For example for 44.1kHz, a period size set
1767 to 20ms will be rounded to 19.59ms. */
1768 buff_step = 128;
1769 else
1770 /* Don't enforce steps on buffer sizes, still need to
1771 be multiple of 4 bytes (HDA spec). Tested on Intel
1772 HDA controllers, may not work on all devices where
1773 option needs to be disabled */
1774 buff_step = 4;
1775
Joachim Deguara5f1545b2007-03-16 15:01:36 +01001776 snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001777 buff_step);
Joachim Deguara5f1545b2007-03-16 15:01:36 +01001778 snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001779 buff_step);
Dylan Reidb4a91cf2012-06-15 19:36:23 -07001780 snd_hda_power_up_d3wait(apcm->codec);
Takashi Iwaid01ce992007-07-27 16:52:19 +02001781 err = hinfo->ops.open(hinfo, apcm->codec, substream);
1782 if (err < 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001783 azx_release_device(azx_dev);
Takashi Iwaicb53c622007-08-10 17:21:45 +02001784 snd_hda_power_down(apcm->codec);
Ingo Molnar62932df2006-01-16 16:34:20 +01001785 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001786 return err;
1787 }
Takashi Iwai70d321e2009-07-03 23:06:45 +02001788 snd_pcm_limit_hw_rates(runtime);
Takashi Iwaiaba66532009-07-05 11:44:46 +02001789 /* sanity check */
1790 if (snd_BUG_ON(!runtime->hw.channels_min) ||
1791 snd_BUG_ON(!runtime->hw.channels_max) ||
1792 snd_BUG_ON(!runtime->hw.formats) ||
1793 snd_BUG_ON(!runtime->hw.rates)) {
1794 azx_release_device(azx_dev);
1795 hinfo->ops.close(hinfo, apcm->codec, substream);
1796 snd_hda_power_down(apcm->codec);
1797 mutex_unlock(&chip->open_mutex);
1798 return -EINVAL;
1799 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001800 spin_lock_irqsave(&chip->reg_lock, flags);
1801 azx_dev->substream = substream;
1802 azx_dev->running = 0;
1803 spin_unlock_irqrestore(&chip->reg_lock, flags);
1804
1805 runtime->private_data = azx_dev;
Takashi Iwai850f0e52008-03-18 17:11:05 +01001806 snd_pcm_set_sync(substream);
Ingo Molnar62932df2006-01-16 16:34:20 +01001807 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001808 return 0;
1809}
1810
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001811static int azx_pcm_close(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001812{
1813 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1814 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001815 struct azx *chip = apcm->chip;
1816 struct azx_dev *azx_dev = get_azx_dev(substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001817 unsigned long flags;
1818
Ingo Molnar62932df2006-01-16 16:34:20 +01001819 mutex_lock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001820 spin_lock_irqsave(&chip->reg_lock, flags);
1821 azx_dev->substream = NULL;
1822 azx_dev->running = 0;
1823 spin_unlock_irqrestore(&chip->reg_lock, flags);
1824 azx_release_device(azx_dev);
1825 hinfo->ops.close(hinfo, apcm->codec, substream);
Takashi Iwaicb53c622007-08-10 17:21:45 +02001826 snd_hda_power_down(apcm->codec);
Ingo Molnar62932df2006-01-16 16:34:20 +01001827 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001828 return 0;
1829}
1830
Takashi Iwaid01ce992007-07-27 16:52:19 +02001831static int azx_pcm_hw_params(struct snd_pcm_substream *substream,
1832 struct snd_pcm_hw_params *hw_params)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001833{
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001834 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1835 struct azx *chip = apcm->chip;
1836 struct snd_pcm_runtime *runtime = substream->runtime;
Takashi Iwai97b71c92009-03-18 15:09:13 +01001837 struct azx_dev *azx_dev = get_azx_dev(substream);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001838 int ret;
Takashi Iwai97b71c92009-03-18 15:09:13 +01001839
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001840 mark_runtime_wc(chip, azx_dev, runtime, false);
Takashi Iwai97b71c92009-03-18 15:09:13 +01001841 azx_dev->bufsize = 0;
1842 azx_dev->period_bytes = 0;
1843 azx_dev->format_val = 0;
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001844 ret = snd_pcm_lib_malloc_pages(substream,
Takashi Iwaid01ce992007-07-27 16:52:19 +02001845 params_buffer_bytes(hw_params));
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001846 if (ret < 0)
1847 return ret;
1848 mark_runtime_wc(chip, azx_dev, runtime, true);
1849 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001850}
1851
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001852static int azx_pcm_hw_free(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001853{
1854 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001855 struct azx_dev *azx_dev = get_azx_dev(substream);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001856 struct azx *chip = apcm->chip;
1857 struct snd_pcm_runtime *runtime = substream->runtime;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001858 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
1859
1860 /* reset BDL address */
1861 azx_sd_writel(azx_dev, SD_BDLPL, 0);
1862 azx_sd_writel(azx_dev, SD_BDLPU, 0);
1863 azx_sd_writel(azx_dev, SD_CTL, 0);
Takashi Iwai97b71c92009-03-18 15:09:13 +01001864 azx_dev->bufsize = 0;
1865 azx_dev->period_bytes = 0;
1866 azx_dev->format_val = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001867
Takashi Iwaieb541332010-08-06 13:48:11 +02001868 snd_hda_codec_cleanup(apcm->codec, hinfo, substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001869
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001870 mark_runtime_wc(chip, azx_dev, runtime, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001871 return snd_pcm_lib_free_pages(substream);
1872}
1873
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001874static int azx_pcm_prepare(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001875{
1876 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001877 struct azx *chip = apcm->chip;
1878 struct azx_dev *azx_dev = get_azx_dev(substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001879 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001880 struct snd_pcm_runtime *runtime = substream->runtime;
Takashi Iwai62b7e5e2010-10-22 17:15:47 +02001881 unsigned int bufsize, period_bytes, format_val, stream_tag;
Takashi Iwai97b71c92009-03-18 15:09:13 +01001882 int err;
Stephen Warren7c9359762011-06-01 11:14:17 -06001883 struct hda_spdif_out *spdif =
1884 snd_hda_spdif_out_of_nid(apcm->codec, hinfo->nid);
1885 unsigned short ctls = spdif ? spdif->ctls : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001886
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001887 azx_stream_reset(chip, azx_dev);
Takashi Iwai97b71c92009-03-18 15:09:13 +01001888 format_val = snd_hda_calc_stream_format(runtime->rate,
1889 runtime->channels,
1890 runtime->format,
Anssi Hannula32c168c2010-08-03 13:28:57 +03001891 hinfo->maxbps,
Stephen Warren7c9359762011-06-01 11:14:17 -06001892 ctls);
Takashi Iwai97b71c92009-03-18 15:09:13 +01001893 if (!format_val) {
Takashi Iwaid01ce992007-07-27 16:52:19 +02001894 snd_printk(KERN_ERR SFX
1895 "invalid format_val, rate=%d, ch=%d, format=%d\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001896 runtime->rate, runtime->channels, runtime->format);
1897 return -EINVAL;
1898 }
1899
Takashi Iwai97b71c92009-03-18 15:09:13 +01001900 bufsize = snd_pcm_lib_buffer_bytes(substream);
1901 period_bytes = snd_pcm_lib_period_bytes(substream);
1902
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001903 snd_printdd(SFX "azx_pcm_prepare: bufsize=0x%x, format=0x%x\n",
Takashi Iwai97b71c92009-03-18 15:09:13 +01001904 bufsize, format_val);
1905
1906 if (bufsize != azx_dev->bufsize ||
1907 period_bytes != azx_dev->period_bytes ||
1908 format_val != azx_dev->format_val) {
1909 azx_dev->bufsize = bufsize;
1910 azx_dev->period_bytes = period_bytes;
1911 azx_dev->format_val = format_val;
1912 err = azx_setup_periods(chip, substream, azx_dev);
1913 if (err < 0)
1914 return err;
1915 }
1916
Jaroslav Kyselae5463722010-05-11 10:21:46 +02001917 /* wallclk has 24Mhz clock source */
1918 azx_dev->period_wallclk = (((runtime->period_size * 24000) /
1919 runtime->rate) * 1000);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001920 azx_setup_controller(chip, azx_dev);
1921 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
1922 azx_dev->fifo_size = azx_sd_readw(azx_dev, SD_FIFOSIZE) + 1;
1923 else
1924 azx_dev->fifo_size = 0;
1925
Takashi Iwai62b7e5e2010-10-22 17:15:47 +02001926 stream_tag = azx_dev->stream_tag;
1927 /* CA-IBG chips need the playback stream starting from 1 */
Takashi Iwai9477c582011-05-25 09:11:37 +02001928 if ((chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND) &&
Takashi Iwai62b7e5e2010-10-22 17:15:47 +02001929 stream_tag > chip->capture_streams)
1930 stream_tag -= chip->capture_streams;
1931 return snd_hda_codec_prepare(apcm->codec, hinfo, stream_tag,
Takashi Iwaieb541332010-08-06 13:48:11 +02001932 azx_dev->format_val, substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001933}
1934
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001935static int azx_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001936{
1937 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001938 struct azx *chip = apcm->chip;
Takashi Iwai850f0e52008-03-18 17:11:05 +01001939 struct azx_dev *azx_dev;
1940 struct snd_pcm_substream *s;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001941 int rstart = 0, start, nsync = 0, sbits = 0;
Takashi Iwai850f0e52008-03-18 17:11:05 +01001942 int nwait, timeout;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001943
Linus Torvalds1da177e2005-04-16 15:20:36 -07001944 switch (cmd) {
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001945 case SNDRV_PCM_TRIGGER_START:
1946 rstart = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001947 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
1948 case SNDRV_PCM_TRIGGER_RESUME:
Takashi Iwai850f0e52008-03-18 17:11:05 +01001949 start = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001950 break;
1951 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
Jaroslav Kysela47123192005-08-15 20:53:07 +02001952 case SNDRV_PCM_TRIGGER_SUSPEND:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001953 case SNDRV_PCM_TRIGGER_STOP:
Takashi Iwai850f0e52008-03-18 17:11:05 +01001954 start = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001955 break;
1956 default:
Takashi Iwai850f0e52008-03-18 17:11:05 +01001957 return -EINVAL;
1958 }
1959
1960 snd_pcm_group_for_each_entry(s, substream) {
1961 if (s->pcm->card != substream->pcm->card)
1962 continue;
1963 azx_dev = get_azx_dev(s);
1964 sbits |= 1 << azx_dev->index;
1965 nsync++;
1966 snd_pcm_trigger_done(s, substream);
1967 }
1968
1969 spin_lock(&chip->reg_lock);
1970 if (nsync > 1) {
1971 /* first, set SYNC bits of corresponding streams */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02001972 if (chip->driver_caps & AZX_DCAPS_OLD_SSYNC)
1973 azx_writel(chip, OLD_SSYNC,
1974 azx_readl(chip, OLD_SSYNC) | sbits);
1975 else
1976 azx_writel(chip, SSYNC, azx_readl(chip, SSYNC) | sbits);
Takashi Iwai850f0e52008-03-18 17:11:05 +01001977 }
1978 snd_pcm_group_for_each_entry(s, substream) {
1979 if (s->pcm->card != substream->pcm->card)
1980 continue;
1981 azx_dev = get_azx_dev(s);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02001982 if (start) {
1983 azx_dev->start_wallclk = azx_readl(chip, WALLCLK);
1984 if (!rstart)
1985 azx_dev->start_wallclk -=
1986 azx_dev->period_wallclk;
Takashi Iwai850f0e52008-03-18 17:11:05 +01001987 azx_stream_start(chip, azx_dev);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02001988 } else {
Takashi Iwai850f0e52008-03-18 17:11:05 +01001989 azx_stream_stop(chip, azx_dev);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02001990 }
Takashi Iwai850f0e52008-03-18 17:11:05 +01001991 azx_dev->running = start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001992 }
1993 spin_unlock(&chip->reg_lock);
Takashi Iwai850f0e52008-03-18 17:11:05 +01001994 if (start) {
1995 if (nsync == 1)
1996 return 0;
1997 /* wait until all FIFOs get ready */
1998 for (timeout = 5000; timeout; timeout--) {
1999 nwait = 0;
2000 snd_pcm_group_for_each_entry(s, substream) {
2001 if (s->pcm->card != substream->pcm->card)
2002 continue;
2003 azx_dev = get_azx_dev(s);
2004 if (!(azx_sd_readb(azx_dev, SD_STS) &
2005 SD_STS_FIFO_READY))
2006 nwait++;
2007 }
2008 if (!nwait)
2009 break;
2010 cpu_relax();
2011 }
2012 } else {
2013 /* wait until all RUN bits are cleared */
2014 for (timeout = 5000; timeout; timeout--) {
2015 nwait = 0;
2016 snd_pcm_group_for_each_entry(s, substream) {
2017 if (s->pcm->card != substream->pcm->card)
2018 continue;
2019 azx_dev = get_azx_dev(s);
2020 if (azx_sd_readb(azx_dev, SD_CTL) &
2021 SD_CTL_DMA_START)
2022 nwait++;
2023 }
2024 if (!nwait)
2025 break;
2026 cpu_relax();
2027 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002028 }
Takashi Iwai850f0e52008-03-18 17:11:05 +01002029 if (nsync > 1) {
2030 spin_lock(&chip->reg_lock);
2031 /* reset SYNC bits */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02002032 if (chip->driver_caps & AZX_DCAPS_OLD_SSYNC)
2033 azx_writel(chip, OLD_SSYNC,
2034 azx_readl(chip, OLD_SSYNC) & ~sbits);
2035 else
2036 azx_writel(chip, SSYNC, azx_readl(chip, SSYNC) & ~sbits);
Takashi Iwai850f0e52008-03-18 17:11:05 +01002037 spin_unlock(&chip->reg_lock);
2038 }
2039 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002040}
2041
Joseph Chan0e153472008-08-26 14:38:03 +02002042/* get the current DMA position with correction on VIA chips */
2043static unsigned int azx_via_get_position(struct azx *chip,
2044 struct azx_dev *azx_dev)
2045{
2046 unsigned int link_pos, mini_pos, bound_pos;
2047 unsigned int mod_link_pos, mod_dma_pos, mod_mini_pos;
2048 unsigned int fifo_size;
2049
2050 link_pos = azx_sd_readl(azx_dev, SD_LPIB);
Takashi Iwaib4a655e2011-06-07 12:26:56 +02002051 if (azx_dev->substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
Joseph Chan0e153472008-08-26 14:38:03 +02002052 /* Playback, no problem using link position */
2053 return link_pos;
2054 }
2055
2056 /* Capture */
2057 /* For new chipset,
2058 * use mod to get the DMA position just like old chipset
2059 */
2060 mod_dma_pos = le32_to_cpu(*azx_dev->posbuf);
2061 mod_dma_pos %= azx_dev->period_bytes;
2062
2063 /* azx_dev->fifo_size can't get FIFO size of in stream.
2064 * Get from base address + offset.
2065 */
2066 fifo_size = readw(chip->remap_addr + VIA_IN_STREAM0_FIFO_SIZE_OFFSET);
2067
2068 if (azx_dev->insufficient) {
2069 /* Link position never gather than FIFO size */
2070 if (link_pos <= fifo_size)
2071 return 0;
2072
2073 azx_dev->insufficient = 0;
2074 }
2075
2076 if (link_pos <= fifo_size)
2077 mini_pos = azx_dev->bufsize + link_pos - fifo_size;
2078 else
2079 mini_pos = link_pos - fifo_size;
2080
2081 /* Find nearest previous boudary */
2082 mod_mini_pos = mini_pos % azx_dev->period_bytes;
2083 mod_link_pos = link_pos % azx_dev->period_bytes;
2084 if (mod_link_pos >= fifo_size)
2085 bound_pos = link_pos - mod_link_pos;
2086 else if (mod_dma_pos >= mod_mini_pos)
2087 bound_pos = mini_pos - mod_mini_pos;
2088 else {
2089 bound_pos = mini_pos - mod_mini_pos + azx_dev->period_bytes;
2090 if (bound_pos >= azx_dev->bufsize)
2091 bound_pos = 0;
2092 }
2093
2094 /* Calculate real DMA position we want */
2095 return bound_pos + mod_dma_pos;
2096}
2097
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002098static unsigned int azx_get_position(struct azx *chip,
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002099 struct azx_dev *azx_dev,
2100 bool with_check)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002101{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002102 unsigned int pos;
David Henningsson4cb36312010-09-30 10:12:50 +02002103 int stream = azx_dev->substream->stream;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002104
David Henningsson4cb36312010-09-30 10:12:50 +02002105 switch (chip->position_fix[stream]) {
2106 case POS_FIX_LPIB:
2107 /* read LPIB */
2108 pos = azx_sd_readl(azx_dev, SD_LPIB);
2109 break;
2110 case POS_FIX_VIACOMBO:
Joseph Chan0e153472008-08-26 14:38:03 +02002111 pos = azx_via_get_position(chip, azx_dev);
David Henningsson4cb36312010-09-30 10:12:50 +02002112 break;
2113 default:
2114 /* use the position buffer */
2115 pos = le32_to_cpu(*azx_dev->posbuf);
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002116 if (with_check && chip->position_fix[stream] == POS_FIX_AUTO) {
Takashi Iwaia8103642011-06-07 12:23:23 +02002117 if (!pos || pos == (u32)-1) {
2118 printk(KERN_WARNING
2119 "hda-intel: Invalid position buffer, "
2120 "using LPIB read method instead.\n");
2121 chip->position_fix[stream] = POS_FIX_LPIB;
2122 pos = azx_sd_readl(azx_dev, SD_LPIB);
2123 } else
2124 chip->position_fix[stream] = POS_FIX_POSBUF;
2125 }
2126 break;
Takashi Iwaic74db862005-05-12 14:26:27 +02002127 }
David Henningsson4cb36312010-09-30 10:12:50 +02002128
Linus Torvalds1da177e2005-04-16 15:20:36 -07002129 if (pos >= azx_dev->bufsize)
2130 pos = 0;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002131 return pos;
2132}
2133
2134static snd_pcm_uframes_t azx_pcm_pointer(struct snd_pcm_substream *substream)
2135{
2136 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2137 struct azx *chip = apcm->chip;
2138 struct azx_dev *azx_dev = get_azx_dev(substream);
2139 return bytes_to_frames(substream->runtime,
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002140 azx_get_position(chip, azx_dev, false));
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002141}
2142
2143/*
2144 * Check whether the current DMA position is acceptable for updating
2145 * periods. Returns non-zero if it's OK.
2146 *
2147 * Many HD-audio controllers appear pretty inaccurate about
2148 * the update-IRQ timing. The IRQ is issued before actually the
2149 * data is processed. So, we need to process it afterwords in a
2150 * workqueue.
2151 */
2152static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev)
2153{
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002154 u32 wallclk;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002155 unsigned int pos;
Shahin Ghazinouribeaffc32010-05-11 08:19:55 +02002156 int stream;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002157
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002158 wallclk = azx_readl(chip, WALLCLK) - azx_dev->start_wallclk;
2159 if (wallclk < (azx_dev->period_wallclk * 2) / 3)
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002160 return -1; /* bogus (too early) interrupt */
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002161
Shahin Ghazinouribeaffc32010-05-11 08:19:55 +02002162 stream = azx_dev->substream->stream;
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002163 pos = azx_get_position(chip, azx_dev, true);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002164
Takashi Iwaid6d8bf52010-02-12 18:17:06 +01002165 if (WARN_ONCE(!azx_dev->period_bytes,
2166 "hda-intel: zero azx_dev->period_bytes"))
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002167 return -1; /* this shouldn't happen! */
Jaroslav Kyselaedb39932010-06-02 13:29:17 +02002168 if (wallclk < (azx_dev->period_wallclk * 5) / 4 &&
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002169 pos % azx_dev->period_bytes > azx_dev->period_bytes / 2)
2170 /* NG - it's below the first next period boundary */
2171 return bdl_pos_adj[chip->dev_index] ? 0 : -1;
Jaroslav Kyselaedb39932010-06-02 13:29:17 +02002172 azx_dev->start_wallclk += wallclk;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002173 return 1; /* OK, it's fine */
2174}
2175
2176/*
2177 * The work for pending PCM period updates.
2178 */
2179static void azx_irq_pending_work(struct work_struct *work)
2180{
2181 struct azx *chip = container_of(work, struct azx, irq_pending_work);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002182 int i, pending, ok;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002183
Takashi Iwaia6a950a2008-06-10 17:53:35 +02002184 if (!chip->irq_pending_warned) {
2185 printk(KERN_WARNING
2186 "hda-intel: IRQ timing workaround is activated "
2187 "for card #%d. Suggest a bigger bdl_pos_adj.\n",
2188 chip->card->number);
2189 chip->irq_pending_warned = 1;
2190 }
2191
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002192 for (;;) {
2193 pending = 0;
2194 spin_lock_irq(&chip->reg_lock);
2195 for (i = 0; i < chip->num_streams; i++) {
2196 struct azx_dev *azx_dev = &chip->azx_dev[i];
2197 if (!azx_dev->irq_pending ||
2198 !azx_dev->substream ||
2199 !azx_dev->running)
2200 continue;
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002201 ok = azx_position_ok(chip, azx_dev);
2202 if (ok > 0) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002203 azx_dev->irq_pending = 0;
2204 spin_unlock(&chip->reg_lock);
2205 snd_pcm_period_elapsed(azx_dev->substream);
2206 spin_lock(&chip->reg_lock);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002207 } else if (ok < 0) {
2208 pending = 0; /* too early */
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002209 } else
2210 pending++;
2211 }
2212 spin_unlock_irq(&chip->reg_lock);
2213 if (!pending)
2214 return;
Takashi Iwai08af4952010-08-03 14:39:04 +02002215 msleep(1);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002216 }
2217}
2218
2219/* clear irq_pending flags and assure no on-going workq */
2220static void azx_clear_irq_pending(struct azx *chip)
2221{
2222 int i;
2223
2224 spin_lock_irq(&chip->reg_lock);
2225 for (i = 0; i < chip->num_streams; i++)
2226 chip->azx_dev[i].irq_pending = 0;
2227 spin_unlock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002228}
2229
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002230#ifdef CONFIG_X86
2231static int azx_pcm_mmap(struct snd_pcm_substream *substream,
2232 struct vm_area_struct *area)
2233{
2234 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2235 struct azx *chip = apcm->chip;
2236 if (!azx_snoop(chip))
2237 area->vm_page_prot = pgprot_writecombine(area->vm_page_prot);
2238 return snd_pcm_lib_default_mmap(substream, area);
2239}
2240#else
2241#define azx_pcm_mmap NULL
2242#endif
2243
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002244static struct snd_pcm_ops azx_pcm_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002245 .open = azx_pcm_open,
2246 .close = azx_pcm_close,
2247 .ioctl = snd_pcm_lib_ioctl,
2248 .hw_params = azx_pcm_hw_params,
2249 .hw_free = azx_pcm_hw_free,
2250 .prepare = azx_pcm_prepare,
2251 .trigger = azx_pcm_trigger,
2252 .pointer = azx_pcm_pointer,
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002253 .mmap = azx_pcm_mmap,
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002254 .page = snd_pcm_sgbuf_ops_page,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002255};
2256
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002257static void azx_pcm_free(struct snd_pcm *pcm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002258{
Takashi Iwai176d5332008-07-30 15:01:44 +02002259 struct azx_pcm *apcm = pcm->private_data;
2260 if (apcm) {
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002261 list_del(&apcm->list);
Takashi Iwai176d5332008-07-30 15:01:44 +02002262 kfree(apcm);
2263 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002264}
2265
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002266#define MAX_PREALLOC_SIZE (32 * 1024 * 1024)
2267
Takashi Iwai176d5332008-07-30 15:01:44 +02002268static int
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002269azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec,
2270 struct hda_pcm *cpcm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002271{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002272 struct azx *chip = bus->private_data;
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002273 struct snd_pcm *pcm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002274 struct azx_pcm *apcm;
Takashi Iwai176d5332008-07-30 15:01:44 +02002275 int pcm_dev = cpcm->device;
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002276 unsigned int size;
Takashi Iwai176d5332008-07-30 15:01:44 +02002277 int s, err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002278
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002279 list_for_each_entry(apcm, &chip->pcm_list, list) {
2280 if (apcm->pcm->device == pcm_dev) {
2281 snd_printk(KERN_ERR SFX "PCM %d already exists\n", pcm_dev);
2282 return -EBUSY;
2283 }
Takashi Iwai176d5332008-07-30 15:01:44 +02002284 }
2285 err = snd_pcm_new(chip->card, cpcm->name, pcm_dev,
2286 cpcm->stream[SNDRV_PCM_STREAM_PLAYBACK].substreams,
2287 cpcm->stream[SNDRV_PCM_STREAM_CAPTURE].substreams,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002288 &pcm);
2289 if (err < 0)
2290 return err;
Takashi Iwai18cb7102009-04-16 10:22:24 +02002291 strlcpy(pcm->name, cpcm->name, sizeof(pcm->name));
Takashi Iwai176d5332008-07-30 15:01:44 +02002292 apcm = kzalloc(sizeof(*apcm), GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002293 if (apcm == NULL)
2294 return -ENOMEM;
2295 apcm->chip = chip;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002296 apcm->pcm = pcm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002297 apcm->codec = codec;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002298 pcm->private_data = apcm;
2299 pcm->private_free = azx_pcm_free;
Takashi Iwai176d5332008-07-30 15:01:44 +02002300 if (cpcm->pcm_type == HDA_PCM_TYPE_MODEM)
2301 pcm->dev_class = SNDRV_PCM_CLASS_MODEM;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002302 list_add_tail(&apcm->list, &chip->pcm_list);
Takashi Iwai176d5332008-07-30 15:01:44 +02002303 cpcm->pcm = pcm;
2304 for (s = 0; s < 2; s++) {
2305 apcm->hinfo[s] = &cpcm->stream[s];
2306 if (cpcm->stream[s].substreams)
2307 snd_pcm_set_ops(pcm, s, &azx_pcm_ops);
2308 }
2309 /* buffer pre-allocation */
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002310 size = CONFIG_SND_HDA_PREALLOC_SIZE * 1024;
2311 if (size > MAX_PREALLOC_SIZE)
2312 size = MAX_PREALLOC_SIZE;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002313 snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV_SG,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002314 snd_dma_pci_data(chip->pci),
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002315 size, MAX_PREALLOC_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002316 return 0;
2317}
2318
2319/*
2320 * mixer creation - all stuff is implemented in hda module
2321 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002322static int __devinit azx_mixer_create(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002323{
2324 return snd_hda_build_controls(chip->bus);
2325}
2326
2327
2328/*
2329 * initialize SD streams
2330 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002331static int __devinit azx_init_stream(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002332{
2333 int i;
2334
2335 /* initialize each stream (aka device)
Takashi Iwaid01ce992007-07-27 16:52:19 +02002336 * assign the starting bdl address to each stream (device)
2337 * and initialize
Linus Torvalds1da177e2005-04-16 15:20:36 -07002338 */
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002339 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002340 struct azx_dev *azx_dev = &chip->azx_dev[i];
Takashi Iwai929861c2006-08-31 16:55:40 +02002341 azx_dev->posbuf = (u32 __iomem *)(chip->posbuf.area + i * 8);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002342 /* offset: SDI0=0x80, SDI1=0xa0, ... SDO3=0x160 */
2343 azx_dev->sd_addr = chip->remap_addr + (0x20 * i + 0x80);
2344 /* int mask: SDI0=0x01, SDI1=0x02, ... SDO3=0x80 */
2345 azx_dev->sd_int_sta_mask = 1 << i;
2346 /* stream tag: must be non-zero and unique */
2347 azx_dev->index = i;
2348 azx_dev->stream_tag = i + 1;
2349 }
2350
2351 return 0;
2352}
2353
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002354static int azx_acquire_irq(struct azx *chip, int do_disconnect)
2355{
Takashi Iwai437a5a42006-11-21 12:14:23 +01002356 if (request_irq(chip->pci->irq, azx_interrupt,
2357 chip->msi ? 0 : IRQF_SHARED,
Takashi Iwai934c2b62011-06-10 16:36:37 +02002358 KBUILD_MODNAME, chip)) {
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002359 printk(KERN_ERR "hda-intel: unable to grab IRQ %d, "
2360 "disabling device\n", chip->pci->irq);
2361 if (do_disconnect)
2362 snd_card_disconnect(chip->card);
2363 return -1;
2364 }
2365 chip->irq = chip->pci->irq;
Takashi Iwai69e13412006-11-21 12:10:55 +01002366 pci_intx(chip->pci, !chip->msi);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002367 return 0;
2368}
2369
Linus Torvalds1da177e2005-04-16 15:20:36 -07002370
Takashi Iwaicb53c622007-08-10 17:21:45 +02002371static void azx_stop_chip(struct azx *chip)
2372{
Takashi Iwai95e99fd2007-08-13 15:29:04 +02002373 if (!chip->initialized)
Takashi Iwaicb53c622007-08-10 17:21:45 +02002374 return;
2375
2376 /* disable interrupts */
2377 azx_int_disable(chip);
2378 azx_int_clear(chip);
2379
2380 /* disable CORB/RIRB */
2381 azx_free_cmd_io(chip);
2382
2383 /* disable position buffer */
2384 azx_writel(chip, DPLBASE, 0);
2385 azx_writel(chip, DPUBASE, 0);
2386
2387 chip->initialized = 0;
2388}
2389
2390#ifdef CONFIG_SND_HDA_POWER_SAVE
2391/* power-up/down the controller */
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002392static void azx_power_notify(struct hda_bus *bus)
Takashi Iwaicb53c622007-08-10 17:21:45 +02002393{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002394 struct azx *chip = bus->private_data;
Takashi Iwaicb53c622007-08-10 17:21:45 +02002395 struct hda_codec *c;
2396 int power_on = 0;
2397
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002398 list_for_each_entry(c, &bus->codec_list, list) {
Takashi Iwaicb53c622007-08-10 17:21:45 +02002399 if (c->power_on) {
2400 power_on = 1;
2401 break;
2402 }
2403 }
2404 if (power_on)
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01002405 azx_init_chip(chip, 1);
Wu Fengguang0287d972009-12-11 20:15:11 +08002406 else if (chip->running && power_save_controller &&
2407 !bus->power_keep_link_on)
Takashi Iwaicb53c622007-08-10 17:21:45 +02002408 azx_stop_chip(chip);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002409}
Takashi Iwai5c0b9be2008-12-11 11:47:17 +01002410#endif /* CONFIG_SND_HDA_POWER_SAVE */
2411
Takashi Iwai7ccbde52012-08-14 18:10:09 +02002412#if defined(CONFIG_PM_SLEEP) || defined(SUPPORT_VGA_SWITCHEROO)
Takashi Iwai5c0b9be2008-12-11 11:47:17 +01002413/*
2414 * power management
2415 */
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002416static int azx_suspend(struct device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002417{
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002418 struct pci_dev *pci = to_pci_dev(dev);
2419 struct snd_card *card = dev_get_drvdata(dev);
Takashi Iwai421a1252005-11-17 16:11:09 +01002420 struct azx *chip = card->private_data;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002421 struct azx_pcm *p;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002422
Takashi Iwai421a1252005-11-17 16:11:09 +01002423 snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002424 azx_clear_irq_pending(chip);
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002425 list_for_each_entry(p, &chip->pcm_list, list)
2426 snd_pcm_suspend_all(p->pcm);
Takashi Iwai0b7a2e92007-08-14 15:18:26 +02002427 if (chip->initialized)
Takashi Iwai8dd78332009-06-02 01:16:07 +02002428 snd_hda_suspend(chip->bus);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002429 azx_stop_chip(chip);
Takashi Iwai30b35392006-10-11 18:52:53 +02002430 if (chip->irq >= 0) {
Takashi Iwai43001c92006-09-08 12:30:03 +02002431 free_irq(chip->irq, chip);
Takashi Iwai30b35392006-10-11 18:52:53 +02002432 chip->irq = -1;
2433 }
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002434 if (chip->msi)
Takashi Iwai43001c92006-09-08 12:30:03 +02002435 pci_disable_msi(chip->pci);
Takashi Iwai421a1252005-11-17 16:11:09 +01002436 pci_disable_device(pci);
2437 pci_save_state(pci);
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002438 pci_set_power_state(pci, PCI_D3hot);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002439 return 0;
2440}
2441
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002442static int azx_resume(struct device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002443{
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002444 struct pci_dev *pci = to_pci_dev(dev);
2445 struct snd_card *card = dev_get_drvdata(dev);
Takashi Iwai421a1252005-11-17 16:11:09 +01002446 struct azx *chip = card->private_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002447
Takashi Iwaid14a7e02009-02-16 10:13:03 +01002448 pci_set_power_state(pci, PCI_D0);
2449 pci_restore_state(pci);
Takashi Iwai30b35392006-10-11 18:52:53 +02002450 if (pci_enable_device(pci) < 0) {
2451 printk(KERN_ERR "hda-intel: pci_enable_device failed, "
2452 "disabling device\n");
2453 snd_card_disconnect(card);
2454 return -EIO;
2455 }
2456 pci_set_master(pci);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002457 if (chip->msi)
2458 if (pci_enable_msi(pci) < 0)
2459 chip->msi = 0;
2460 if (azx_acquire_irq(chip, 1) < 0)
Takashi Iwai30b35392006-10-11 18:52:53 +02002461 return -EIO;
Takashi Iwaicb53c622007-08-10 17:21:45 +02002462 azx_init_pci(chip);
Maxim Levitskyd804ad92007-09-03 15:28:04 +02002463
Takashi Iwai7f308302012-05-08 16:52:23 +02002464 azx_init_chip(chip, 1);
Maxim Levitskyd804ad92007-09-03 15:28:04 +02002465
Linus Torvalds1da177e2005-04-16 15:20:36 -07002466 snd_hda_resume(chip->bus);
Takashi Iwai421a1252005-11-17 16:11:09 +01002467 snd_power_change_state(card, SNDRV_CTL_POWER_D0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002468 return 0;
2469}
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002470static SIMPLE_DEV_PM_OPS(azx_pm, azx_suspend, azx_resume);
2471#define AZX_PM_OPS &azx_pm
2472#else
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002473#define AZX_PM_OPS NULL
Takashi Iwai7ccbde52012-08-14 18:10:09 +02002474#endif /* CONFIG_PM_SLEEP || SUPPORT_VGA_SWITCHEROO */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002475
2476
2477/*
Takashi Iwai0cbf0092008-10-29 16:18:25 +01002478 * reboot notifier for hang-up problem at power-down
2479 */
2480static int azx_halt(struct notifier_block *nb, unsigned long event, void *buf)
2481{
2482 struct azx *chip = container_of(nb, struct azx, reboot_notifier);
Takashi Iwaifb8d1a32009-11-10 16:02:29 +01002483 snd_hda_bus_reboot_notify(chip->bus);
Takashi Iwai0cbf0092008-10-29 16:18:25 +01002484 azx_stop_chip(chip);
2485 return NOTIFY_OK;
2486}
2487
2488static void azx_notifier_register(struct azx *chip)
2489{
2490 chip->reboot_notifier.notifier_call = azx_halt;
2491 register_reboot_notifier(&chip->reboot_notifier);
2492}
2493
2494static void azx_notifier_unregister(struct azx *chip)
2495{
2496 if (chip->reboot_notifier.notifier_call)
2497 unregister_reboot_notifier(&chip->reboot_notifier);
2498}
2499
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002500static int DELAYED_INIT_MARK azx_first_init(struct azx *chip);
2501static int DELAYED_INIT_MARK azx_probe_continue(struct azx *chip);
2502
Steven Newbury8393ec4a2012-06-08 13:06:29 +02002503#ifdef SUPPORT_VGA_SWITCHEROO
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002504static struct pci_dev __devinit *get_bound_vga(struct pci_dev *pci);
2505
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002506static void azx_vs_set_state(struct pci_dev *pci,
2507 enum vga_switcheroo_state state)
2508{
2509 struct snd_card *card = pci_get_drvdata(pci);
2510 struct azx *chip = card->private_data;
2511 bool disabled;
2512
2513 if (chip->init_failed)
2514 return;
2515
2516 disabled = (state == VGA_SWITCHEROO_OFF);
2517 if (chip->disabled == disabled)
2518 return;
2519
2520 if (!chip->bus) {
2521 chip->disabled = disabled;
2522 if (!disabled) {
2523 snd_printk(KERN_INFO SFX
2524 "%s: Start delayed initialization\n",
2525 pci_name(chip->pci));
2526 if (azx_first_init(chip) < 0 ||
2527 azx_probe_continue(chip) < 0) {
2528 snd_printk(KERN_ERR SFX
2529 "%s: initialization error\n",
2530 pci_name(chip->pci));
2531 chip->init_failed = true;
2532 }
2533 }
2534 } else {
2535 snd_printk(KERN_INFO SFX
2536 "%s %s via VGA-switcheroo\n",
2537 disabled ? "Disabling" : "Enabling",
2538 pci_name(chip->pci));
2539 if (disabled) {
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002540 azx_suspend(&pci->dev);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002541 chip->disabled = true;
2542 snd_hda_lock_devices(chip->bus);
2543 } else {
2544 snd_hda_unlock_devices(chip->bus);
2545 chip->disabled = false;
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002546 azx_resume(&pci->dev);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002547 }
2548 }
2549}
2550
2551static bool azx_vs_can_switch(struct pci_dev *pci)
2552{
2553 struct snd_card *card = pci_get_drvdata(pci);
2554 struct azx *chip = card->private_data;
2555
2556 if (chip->init_failed)
2557 return false;
2558 if (chip->disabled || !chip->bus)
2559 return true;
2560 if (snd_hda_lock_devices(chip->bus))
2561 return false;
2562 snd_hda_unlock_devices(chip->bus);
2563 return true;
2564}
2565
2566static void __devinit init_vga_switcheroo(struct azx *chip)
2567{
2568 struct pci_dev *p = get_bound_vga(chip->pci);
2569 if (p) {
2570 snd_printk(KERN_INFO SFX
2571 "%s: Handle VGA-switcheroo audio client\n",
2572 pci_name(chip->pci));
2573 chip->use_vga_switcheroo = 1;
2574 pci_dev_put(p);
2575 }
2576}
2577
2578static const struct vga_switcheroo_client_ops azx_vs_ops = {
2579 .set_gpu_state = azx_vs_set_state,
2580 .can_switch = azx_vs_can_switch,
2581};
2582
2583static int __devinit register_vga_switcheroo(struct azx *chip)
2584{
2585 if (!chip->use_vga_switcheroo)
2586 return 0;
2587 /* FIXME: currently only handling DIS controller
2588 * is there any machine with two switchable HDMI audio controllers?
2589 */
2590 return vga_switcheroo_register_audio_client(chip->pci, &azx_vs_ops,
2591 VGA_SWITCHEROO_DIS,
2592 chip->bus != NULL);
2593}
2594#else
2595#define init_vga_switcheroo(chip) /* NOP */
2596#define register_vga_switcheroo(chip) 0
Steven Newbury8393ec4a2012-06-08 13:06:29 +02002597#define check_hdmi_disabled(pci) false
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002598#endif /* SUPPORT_VGA_SWITCHER */
2599
Takashi Iwai0cbf0092008-10-29 16:18:25 +01002600/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002601 * destructor
2602 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002603static int azx_free(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002604{
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002605 int i;
2606
Takashi Iwai0cbf0092008-10-29 16:18:25 +01002607 azx_notifier_unregister(chip);
2608
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002609 if (use_vga_switcheroo(chip)) {
2610 if (chip->disabled && chip->bus)
2611 snd_hda_unlock_devices(chip->bus);
2612 vga_switcheroo_unregister_client(chip->pci);
2613 }
2614
Takashi Iwaice43fba2005-05-30 20:33:44 +02002615 if (chip->initialized) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002616 azx_clear_irq_pending(chip);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002617 for (i = 0; i < chip->num_streams; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002618 azx_stream_stop(chip, &chip->azx_dev[i]);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002619 azx_stop_chip(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002620 }
2621
Jeff Garzikf000fd82008-04-22 13:50:34 +02002622 if (chip->irq >= 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002623 free_irq(chip->irq, (void*)chip);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002624 if (chip->msi)
Takashi Iwai30b35392006-10-11 18:52:53 +02002625 pci_disable_msi(chip->pci);
Takashi Iwaif079c252006-06-01 11:42:14 +02002626 if (chip->remap_addr)
2627 iounmap(chip->remap_addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002628
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002629 if (chip->azx_dev) {
2630 for (i = 0; i < chip->num_streams; i++)
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002631 if (chip->azx_dev[i].bdl.area) {
2632 mark_pages_wc(chip, &chip->azx_dev[i].bdl, false);
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002633 snd_dma_free_pages(&chip->azx_dev[i].bdl);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002634 }
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002635 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002636 if (chip->rb.area) {
2637 mark_pages_wc(chip, &chip->rb, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002638 snd_dma_free_pages(&chip->rb);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002639 }
2640 if (chip->posbuf.area) {
2641 mark_pages_wc(chip, &chip->posbuf, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002642 snd_dma_free_pages(&chip->posbuf);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002643 }
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002644 if (chip->region_requested)
2645 pci_release_regions(chip->pci);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002646 pci_disable_device(chip->pci);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002647 kfree(chip->azx_dev);
Takashi Iwai4918cda2012-08-09 12:33:28 +02002648#ifdef CONFIG_SND_HDA_PATCH_LOADER
2649 if (chip->fw)
2650 release_firmware(chip->fw);
2651#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07002652 kfree(chip);
2653
2654 return 0;
2655}
2656
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002657static int azx_dev_free(struct snd_device *device)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002658{
2659 return azx_free(device->device_data);
2660}
2661
Steven Newbury8393ec4a2012-06-08 13:06:29 +02002662#ifdef SUPPORT_VGA_SWITCHEROO
Linus Torvalds1da177e2005-04-16 15:20:36 -07002663/*
Takashi Iwai91219472012-04-26 12:13:25 +02002664 * Check of disabled HDMI controller by vga-switcheroo
2665 */
2666static struct pci_dev __devinit *get_bound_vga(struct pci_dev *pci)
2667{
2668 struct pci_dev *p;
2669
2670 /* check only discrete GPU */
2671 switch (pci->vendor) {
2672 case PCI_VENDOR_ID_ATI:
2673 case PCI_VENDOR_ID_AMD:
2674 case PCI_VENDOR_ID_NVIDIA:
2675 if (pci->devfn == 1) {
2676 p = pci_get_domain_bus_and_slot(pci_domain_nr(pci->bus),
2677 pci->bus->number, 0);
2678 if (p) {
2679 if ((p->class >> 8) == PCI_CLASS_DISPLAY_VGA)
2680 return p;
2681 pci_dev_put(p);
2682 }
2683 }
2684 break;
2685 }
2686 return NULL;
2687}
2688
2689static bool __devinit check_hdmi_disabled(struct pci_dev *pci)
2690{
2691 bool vga_inactive = false;
2692 struct pci_dev *p = get_bound_vga(pci);
2693
2694 if (p) {
Takashi Iwai12b78a72012-06-07 12:15:16 +02002695 if (vga_switcheroo_get_client_state(p) == VGA_SWITCHEROO_OFF)
Takashi Iwai91219472012-04-26 12:13:25 +02002696 vga_inactive = true;
2697 pci_dev_put(p);
2698 }
2699 return vga_inactive;
2700}
Steven Newbury8393ec4a2012-06-08 13:06:29 +02002701#endif /* SUPPORT_VGA_SWITCHEROO */
Takashi Iwai91219472012-04-26 12:13:25 +02002702
2703/*
Takashi Iwai3372a152007-02-01 15:46:50 +01002704 * white/black-listing for position_fix
2705 */
Ralf Baechle623ec042007-03-13 15:29:47 +01002706static struct snd_pci_quirk position_fix_list[] __devinitdata = {
Takashi Iwaid2e1c972008-06-10 17:53:34 +02002707 SND_PCI_QUIRK(0x1028, 0x01cc, "Dell D820", POS_FIX_LPIB),
2708 SND_PCI_QUIRK(0x1028, 0x01de, "Dell Precision 390", POS_FIX_LPIB),
Takashi Iwai2f703e72009-12-01 14:17:37 +01002709 SND_PCI_QUIRK(0x103c, 0x306d, "HP dv3", POS_FIX_LPIB),
Takashi Iwaid2e1c972008-06-10 17:53:34 +02002710 SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB),
Daniel T Chendd37f8e2010-05-30 01:17:03 -04002711 SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS", POS_FIX_LPIB),
Daniel T Chen9f75c1b2010-05-30 13:08:41 -04002712 SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS M2V", POS_FIX_LPIB),
Daniel T Chene96d3122010-05-27 18:32:18 -04002713 SND_PCI_QUIRK(0x104d, 0x9069, "Sony VPCS11V9E", POS_FIX_LPIB),
David Henningssonb01de4f2012-01-12 16:31:14 +01002714 SND_PCI_QUIRK(0x10de, 0xcb89, "Macbook Pro 7,1", POS_FIX_LPIB),
Daniel T Chen61bb42c2010-05-29 11:04:11 -04002715 SND_PCI_QUIRK(0x1297, 0x3166, "Shuttle", POS_FIX_LPIB),
Daniel T Chen9ec8dda2010-03-28 02:34:40 -04002716 SND_PCI_QUIRK(0x1458, 0xa022, "ga-ma770-ud3", POS_FIX_LPIB),
Takashi Iwai45d4ebf2009-11-30 11:58:30 +01002717 SND_PCI_QUIRK(0x1462, 0x1002, "MSI Wind U115", POS_FIX_LPIB),
Takashi Iwai8815cd02010-04-15 09:02:41 +02002718 SND_PCI_QUIRK(0x1565, 0x8218, "Biostar Microtech", POS_FIX_LPIB),
Daniel T Chenb90c0762010-05-30 19:31:41 -04002719 SND_PCI_QUIRK(0x1849, 0x0888, "775Dual-VSTA", POS_FIX_LPIB),
Daniel T Chen0e0280d2010-04-21 19:55:43 -04002720 SND_PCI_QUIRK(0x8086, 0x2503, "DG965OT AAD63733-203", POS_FIX_LPIB),
Takashi Iwai3372a152007-02-01 15:46:50 +01002721 {}
2722};
2723
2724static int __devinit check_position_fix(struct azx *chip, int fix)
2725{
2726 const struct snd_pci_quirk *q;
2727
Takashi Iwaic673ba12009-03-17 07:49:14 +01002728 switch (fix) {
2729 case POS_FIX_LPIB:
2730 case POS_FIX_POSBUF:
David Henningsson4cb36312010-09-30 10:12:50 +02002731 case POS_FIX_VIACOMBO:
Takashi Iwaia6f2fd52012-02-28 11:58:40 +01002732 case POS_FIX_COMBO:
Takashi Iwaic673ba12009-03-17 07:49:14 +01002733 return fix;
2734 }
2735
Takashi Iwaic673ba12009-03-17 07:49:14 +01002736 q = snd_pci_quirk_lookup(chip->pci, position_fix_list);
2737 if (q) {
2738 printk(KERN_INFO
2739 "hda_intel: position_fix set to %d "
2740 "for device %04x:%04x\n",
2741 q->value, q->subvendor, q->subdevice);
2742 return q->value;
Takashi Iwai3372a152007-02-01 15:46:50 +01002743 }
David Henningssonbdd9ef22010-10-04 12:02:14 +02002744
2745 /* Check VIA/ATI HD Audio Controller exist */
Takashi Iwai9477c582011-05-25 09:11:37 +02002746 if (chip->driver_caps & AZX_DCAPS_POSFIX_VIA) {
2747 snd_printd(SFX "Using VIACOMBO position fix\n");
David Henningssonbdd9ef22010-10-04 12:02:14 +02002748 return POS_FIX_VIACOMBO;
2749 }
Takashi Iwai9477c582011-05-25 09:11:37 +02002750 if (chip->driver_caps & AZX_DCAPS_POSFIX_LPIB) {
2751 snd_printd(SFX "Using LPIB position fix\n");
2752 return POS_FIX_LPIB;
2753 }
Seth Heasleyc20c5a82012-06-14 14:23:53 -07002754 if (chip->driver_caps & AZX_DCAPS_POSFIX_COMBO) {
2755 snd_printd(SFX "Using COMBO position fix\n");
2756 return POS_FIX_COMBO;
2757 }
Takashi Iwaic673ba12009-03-17 07:49:14 +01002758 return POS_FIX_AUTO;
Takashi Iwai3372a152007-02-01 15:46:50 +01002759}
2760
2761/*
Takashi Iwai669ba272007-08-17 09:17:36 +02002762 * black-lists for probe_mask
2763 */
2764static struct snd_pci_quirk probe_mask_list[] __devinitdata = {
2765 /* Thinkpad often breaks the controller communication when accessing
2766 * to the non-working (or non-existing) modem codec slot.
2767 */
2768 SND_PCI_QUIRK(0x1014, 0x05b7, "Thinkpad Z60", 0x01),
2769 SND_PCI_QUIRK(0x17aa, 0x2010, "Thinkpad X/T/R60", 0x01),
2770 SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X/T/R61", 0x01),
Takashi Iwai0edb9452008-11-07 14:53:09 +01002771 /* broken BIOS */
2772 SND_PCI_QUIRK(0x1028, 0x20ac, "Dell Studio Desktop", 0x01),
Takashi Iwaief1681d2008-11-24 17:29:28 +01002773 /* including bogus ALC268 in slot#2 that conflicts with ALC888 */
2774 SND_PCI_QUIRK(0x17c0, 0x4085, "Medion MD96630", 0x01),
Takashi Iwai20db7cb2009-02-13 08:18:48 +01002775 /* forced codec slots */
Ozan Çağlayan93574842009-05-23 15:00:04 +03002776 SND_PCI_QUIRK(0x1043, 0x1262, "ASUS W5Fm", 0x103),
Takashi Iwai20db7cb2009-02-13 08:18:48 +01002777 SND_PCI_QUIRK(0x1046, 0x1262, "ASUS W5F", 0x103),
Jaroslav Kyselaf3af9052012-04-26 17:52:35 +02002778 /* WinFast VP200 H (Teradici) user reported broken communication */
2779 SND_PCI_QUIRK(0x3a21, 0x040d, "WinFast VP200 H", 0x101),
Takashi Iwai669ba272007-08-17 09:17:36 +02002780 {}
2781};
2782
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01002783#define AZX_FORCE_CODEC_MASK 0x100
2784
Takashi Iwai5aba4f82008-01-07 15:16:37 +01002785static void __devinit check_probe_mask(struct azx *chip, int dev)
Takashi Iwai669ba272007-08-17 09:17:36 +02002786{
2787 const struct snd_pci_quirk *q;
2788
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01002789 chip->codec_probe_mask = probe_mask[dev];
2790 if (chip->codec_probe_mask == -1) {
Takashi Iwai669ba272007-08-17 09:17:36 +02002791 q = snd_pci_quirk_lookup(chip->pci, probe_mask_list);
2792 if (q) {
2793 printk(KERN_INFO
2794 "hda_intel: probe_mask set to 0x%x "
2795 "for device %04x:%04x\n",
2796 q->value, q->subvendor, q->subdevice);
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01002797 chip->codec_probe_mask = q->value;
Takashi Iwai669ba272007-08-17 09:17:36 +02002798 }
2799 }
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01002800
2801 /* check forced option */
2802 if (chip->codec_probe_mask != -1 &&
2803 (chip->codec_probe_mask & AZX_FORCE_CODEC_MASK)) {
2804 chip->codec_mask = chip->codec_probe_mask & 0xff;
2805 printk(KERN_INFO "hda_intel: codec_mask forced to 0x%x\n",
2806 chip->codec_mask);
2807 }
Takashi Iwai669ba272007-08-17 09:17:36 +02002808}
2809
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02002810/*
Takashi Iwai716238552009-09-28 13:14:04 +02002811 * white/black-list for enable_msi
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02002812 */
Takashi Iwai716238552009-09-28 13:14:04 +02002813static struct snd_pci_quirk msi_black_list[] __devinitdata = {
Takashi Iwai9dc83982009-12-22 08:15:01 +01002814 SND_PCI_QUIRK(0x1043, 0x81f2, "ASUS", 0), /* Athlon64 X2 + nvidia */
Takashi Iwai0a27fcf2010-02-15 17:05:28 +01002815 SND_PCI_QUIRK(0x1043, 0x81f6, "ASUS", 0), /* nvidia */
Ralf Gerbigecd21622010-03-09 18:25:47 +01002816 SND_PCI_QUIRK(0x1043, 0x822d, "ASUS", 0), /* Athlon64 X2 + nvidia MCP55 */
Michele Ballabio4193d132010-03-06 21:06:46 +01002817 SND_PCI_QUIRK(0x1849, 0x0888, "ASRock", 0), /* Athlon64 X2 + nvidia */
Takashi Iwai38155952010-04-04 12:14:03 +02002818 SND_PCI_QUIRK(0xa0a0, 0x0575, "Aopen MZ915-M", 0), /* ICH6 */
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02002819 {}
2820};
2821
2822static void __devinit check_msi(struct azx *chip)
2823{
2824 const struct snd_pci_quirk *q;
2825
Takashi Iwai716238552009-09-28 13:14:04 +02002826 if (enable_msi >= 0) {
2827 chip->msi = !!enable_msi;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02002828 return;
Takashi Iwai716238552009-09-28 13:14:04 +02002829 }
2830 chip->msi = 1; /* enable MSI as default */
2831 q = snd_pci_quirk_lookup(chip->pci, msi_black_list);
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02002832 if (q) {
2833 printk(KERN_INFO
2834 "hda_intel: msi for device %04x:%04x set to %d\n",
2835 q->subvendor, q->subdevice, q->value);
2836 chip->msi = q->value;
Takashi Iwai80c43ed2010-03-15 15:51:53 +01002837 return;
2838 }
2839
2840 /* NVidia chipsets seem to cause troubles with MSI */
Takashi Iwai9477c582011-05-25 09:11:37 +02002841 if (chip->driver_caps & AZX_DCAPS_NO_MSI) {
2842 printk(KERN_INFO "hda_intel: Disabling MSI\n");
Takashi Iwai80c43ed2010-03-15 15:51:53 +01002843 chip->msi = 0;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02002844 }
2845}
2846
Takashi Iwaia1585d72011-12-14 09:27:04 +01002847/* check the snoop mode availability */
2848static void __devinit azx_check_snoop_available(struct azx *chip)
2849{
2850 bool snoop = chip->snoop;
2851
2852 switch (chip->driver_type) {
2853 case AZX_DRIVER_VIA:
2854 /* force to non-snoop mode for a new VIA controller
2855 * when BIOS is set
2856 */
2857 if (snoop) {
2858 u8 val;
2859 pci_read_config_byte(chip->pci, 0x42, &val);
2860 if (!(val & 0x80) && chip->pci->revision == 0x30)
2861 snoop = false;
2862 }
2863 break;
2864 case AZX_DRIVER_ATIHDMI_NS:
2865 /* new ATI HDMI requires non-snoop */
2866 snoop = false;
2867 break;
2868 }
2869
2870 if (snoop != chip->snoop) {
2871 snd_printk(KERN_INFO SFX "Force to %s mode\n",
2872 snoop ? "snoop" : "non-snoop");
2873 chip->snoop = snoop;
2874 }
2875}
Takashi Iwai669ba272007-08-17 09:17:36 +02002876
2877/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002878 * constructor
2879 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002880static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci,
Takashi Iwai9477c582011-05-25 09:11:37 +02002881 int dev, unsigned int driver_caps,
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002882 struct azx **rchip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002883{
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002884 static struct snd_device_ops ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002885 .dev_free = azx_dev_free,
2886 };
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002887 struct azx *chip;
2888 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002889
2890 *rchip = NULL;
Tobin Davisbcd72002008-01-15 11:23:55 +01002891
Pavel Machek927fc862006-08-31 17:03:43 +02002892 err = pci_enable_device(pci);
2893 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002894 return err;
2895
Takashi Iwaie560d8d2005-09-09 14:21:46 +02002896 chip = kzalloc(sizeof(*chip), GFP_KERNEL);
Pavel Machek927fc862006-08-31 17:03:43 +02002897 if (!chip) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002898 snd_printk(KERN_ERR SFX "cannot allocate chip\n");
2899 pci_disable_device(pci);
2900 return -ENOMEM;
2901 }
2902
2903 spin_lock_init(&chip->reg_lock);
Ingo Molnar62932df2006-01-16 16:34:20 +01002904 mutex_init(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002905 chip->card = card;
2906 chip->pci = pci;
2907 chip->irq = -1;
Takashi Iwai9477c582011-05-25 09:11:37 +02002908 chip->driver_caps = driver_caps;
2909 chip->driver_type = driver_caps & 0xff;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02002910 check_msi(chip);
Takashi Iwai555e2192008-06-10 17:53:34 +02002911 chip->dev_index = dev;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002912 INIT_WORK(&chip->irq_pending_work, azx_irq_pending_work);
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002913 INIT_LIST_HEAD(&chip->pcm_list);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002914 init_vga_switcheroo(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002915
Shahin Ghazinouribeaffc32010-05-11 08:19:55 +02002916 chip->position_fix[0] = chip->position_fix[1] =
2917 check_position_fix(chip, position_fix[dev]);
Takashi Iwaia6f2fd52012-02-28 11:58:40 +01002918 /* combo mode uses LPIB for playback */
2919 if (chip->position_fix[0] == POS_FIX_COMBO) {
2920 chip->position_fix[0] = POS_FIX_LPIB;
2921 chip->position_fix[1] = POS_FIX_AUTO;
2922 }
2923
Takashi Iwai5aba4f82008-01-07 15:16:37 +01002924 check_probe_mask(chip, dev);
Takashi Iwai3372a152007-02-01 15:46:50 +01002925
Takashi Iwai27346162006-01-12 18:28:44 +01002926 chip->single_cmd = single_cmd;
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002927 chip->snoop = hda_snoop;
Takashi Iwaia1585d72011-12-14 09:27:04 +01002928 azx_check_snoop_available(chip);
Takashi Iwaic74db862005-05-12 14:26:27 +02002929
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02002930 if (bdl_pos_adj[dev] < 0) {
2931 switch (chip->driver_type) {
Takashi Iwai0c6341a2008-06-13 20:50:27 +02002932 case AZX_DRIVER_ICH:
Seth Heasley32679f92010-02-22 17:31:09 -08002933 case AZX_DRIVER_PCH:
Takashi Iwai0c6341a2008-06-13 20:50:27 +02002934 bdl_pos_adj[dev] = 1;
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02002935 break;
2936 default:
Takashi Iwai0c6341a2008-06-13 20:50:27 +02002937 bdl_pos_adj[dev] = 32;
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02002938 break;
2939 }
2940 }
2941
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002942 if (check_hdmi_disabled(pci)) {
2943 snd_printk(KERN_INFO SFX "VGA controller for %s is disabled\n",
2944 pci_name(pci));
2945 if (use_vga_switcheroo(chip)) {
2946 snd_printk(KERN_INFO SFX "Delaying initialization\n");
2947 chip->disabled = true;
2948 goto ok;
2949 }
2950 kfree(chip);
2951 pci_disable_device(pci);
2952 return -ENXIO;
2953 }
2954
2955 err = azx_first_init(chip);
2956 if (err < 0) {
2957 azx_free(chip);
2958 return err;
2959 }
2960
2961 ok:
2962 err = register_vga_switcheroo(chip);
2963 if (err < 0) {
2964 snd_printk(KERN_ERR SFX
2965 "Error registering VGA-switcheroo client\n");
2966 azx_free(chip);
2967 return err;
2968 }
2969
2970 err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
2971 if (err < 0) {
2972 snd_printk(KERN_ERR SFX "Error creating device [card]!\n");
2973 azx_free(chip);
2974 return err;
2975 }
2976
2977 *rchip = chip;
2978 return 0;
2979}
2980
2981static int DELAYED_INIT_MARK azx_first_init(struct azx *chip)
2982{
2983 int dev = chip->dev_index;
2984 struct pci_dev *pci = chip->pci;
2985 struct snd_card *card = chip->card;
2986 int i, err;
2987 unsigned short gcap;
2988
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002989#if BITS_PER_LONG != 64
2990 /* Fix up base address on ULI M5461 */
2991 if (chip->driver_type == AZX_DRIVER_ULI) {
2992 u16 tmp3;
2993 pci_read_config_word(pci, 0x40, &tmp3);
2994 pci_write_config_word(pci, 0x40, tmp3 | 0x10);
2995 pci_write_config_dword(pci, PCI_BASE_ADDRESS_1, 0);
2996 }
2997#endif
2998
Pavel Machek927fc862006-08-31 17:03:43 +02002999 err = pci_request_regions(pci, "ICH HD audio");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003000 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003001 return err;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003002 chip->region_requested = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003003
Pavel Machek927fc862006-08-31 17:03:43 +02003004 chip->addr = pci_resource_start(pci, 0);
Arjan van de Ven2f5ad542008-09-28 16:20:09 -07003005 chip->remap_addr = pci_ioremap_bar(pci, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003006 if (chip->remap_addr == NULL) {
3007 snd_printk(KERN_ERR SFX "ioremap error\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003008 return -ENXIO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003009 }
3010
Takashi Iwai68e7fff2006-10-23 13:40:59 +02003011 if (chip->msi)
3012 if (pci_enable_msi(pci) < 0)
3013 chip->msi = 0;
Stephen Hemminger7376d012006-08-21 19:17:46 +02003014
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003015 if (azx_acquire_irq(chip, 0) < 0)
3016 return -EBUSY;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003017
3018 pci_set_master(pci);
3019 synchronize_irq(chip->irq);
3020
Tobin Davisbcd72002008-01-15 11:23:55 +01003021 gcap = azx_readw(chip, GCAP);
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02003022 snd_printdd(SFX "chipset global capabilities = 0x%x\n", gcap);
Tobin Davisbcd72002008-01-15 11:23:55 +01003023
Andiry Brienzadc4c2e62009-07-08 13:55:31 +08003024 /* disable SB600 64bit support for safety */
Takashi Iwai9477c582011-05-25 09:11:37 +02003025 if (chip->pci->vendor == PCI_VENDOR_ID_ATI) {
Andiry Brienzadc4c2e62009-07-08 13:55:31 +08003026 struct pci_dev *p_smbus;
3027 p_smbus = pci_get_device(PCI_VENDOR_ID_ATI,
3028 PCI_DEVICE_ID_ATI_SBX00_SMBUS,
3029 NULL);
3030 if (p_smbus) {
3031 if (p_smbus->revision < 0x30)
3032 gcap &= ~ICH6_GCAP_64OK;
3033 pci_dev_put(p_smbus);
3034 }
3035 }
Takashi Iwai09240cf2009-03-17 07:47:18 +01003036
Takashi Iwai9477c582011-05-25 09:11:37 +02003037 /* disable 64bit DMA address on some devices */
3038 if (chip->driver_caps & AZX_DCAPS_NO_64BIT) {
3039 snd_printd(SFX "Disabling 64bit DMA\n");
Jaroslav Kysela396087e2009-12-09 10:44:47 +01003040 gcap &= ~ICH6_GCAP_64OK;
Takashi Iwai9477c582011-05-25 09:11:37 +02003041 }
Jaroslav Kysela396087e2009-12-09 10:44:47 +01003042
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003043 /* disable buffer size rounding to 128-byte multiples if supported */
Takashi Iwai7bfe0592012-01-23 17:53:39 +01003044 if (align_buffer_size >= 0)
3045 chip->align_buffer_size = !!align_buffer_size;
3046 else {
3047 if (chip->driver_caps & AZX_DCAPS_BUFSIZE)
3048 chip->align_buffer_size = 0;
3049 else if (chip->driver_caps & AZX_DCAPS_ALIGN_BUFSIZE)
3050 chip->align_buffer_size = 1;
3051 else
3052 chip->align_buffer_size = 1;
3053 }
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003054
Takashi Iwaicf7aaca2008-02-06 15:05:57 +01003055 /* allow 64bit DMA address if supported by H/W */
Takashi Iwaib21fadb2009-05-28 12:26:15 +02003056 if ((gcap & ICH6_GCAP_64OK) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64)))
Yang Hongyange9304382009-04-13 14:40:14 -07003057 pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(64));
Takashi Iwai09240cf2009-03-17 07:47:18 +01003058 else {
Yang Hongyange9304382009-04-13 14:40:14 -07003059 pci_set_dma_mask(pci, DMA_BIT_MASK(32));
3060 pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(32));
Takashi Iwai09240cf2009-03-17 07:47:18 +01003061 }
Takashi Iwaicf7aaca2008-02-06 15:05:57 +01003062
Takashi Iwai8b6ed8e2008-02-19 11:36:35 +01003063 /* read number of streams from GCAP register instead of using
3064 * hardcoded value
3065 */
3066 chip->capture_streams = (gcap >> 8) & 0x0f;
3067 chip->playback_streams = (gcap >> 12) & 0x0f;
3068 if (!chip->playback_streams && !chip->capture_streams) {
Tobin Davisbcd72002008-01-15 11:23:55 +01003069 /* gcap didn't give any info, switching to old method */
3070
3071 switch (chip->driver_type) {
3072 case AZX_DRIVER_ULI:
3073 chip->playback_streams = ULI_NUM_PLAYBACK;
3074 chip->capture_streams = ULI_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01003075 break;
3076 case AZX_DRIVER_ATIHDMI:
Andiry Xu1815b342011-12-14 16:10:27 +08003077 case AZX_DRIVER_ATIHDMI_NS:
Tobin Davisbcd72002008-01-15 11:23:55 +01003078 chip->playback_streams = ATIHDMI_NUM_PLAYBACK;
3079 chip->capture_streams = ATIHDMI_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01003080 break;
Yang, Libinc4da29c2008-11-13 11:07:07 +01003081 case AZX_DRIVER_GENERIC:
Tobin Davisbcd72002008-01-15 11:23:55 +01003082 default:
3083 chip->playback_streams = ICH6_NUM_PLAYBACK;
3084 chip->capture_streams = ICH6_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01003085 break;
3086 }
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003087 }
Takashi Iwai8b6ed8e2008-02-19 11:36:35 +01003088 chip->capture_index_offset = 0;
3089 chip->playback_index_offset = chip->capture_streams;
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003090 chip->num_streams = chip->playback_streams + chip->capture_streams;
Takashi Iwaid01ce992007-07-27 16:52:19 +02003091 chip->azx_dev = kcalloc(chip->num_streams, sizeof(*chip->azx_dev),
3092 GFP_KERNEL);
Pavel Machek927fc862006-08-31 17:03:43 +02003093 if (!chip->azx_dev) {
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02003094 snd_printk(KERN_ERR SFX "cannot malloc azx_dev\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003095 return -ENOMEM;
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003096 }
3097
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003098 for (i = 0; i < chip->num_streams; i++) {
3099 /* allocate memory for the BDL for each stream */
3100 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
3101 snd_dma_pci_data(chip->pci),
3102 BDL_SIZE, &chip->azx_dev[i].bdl);
3103 if (err < 0) {
3104 snd_printk(KERN_ERR SFX "cannot allocate BDL\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003105 return -ENOMEM;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003106 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003107 mark_pages_wc(chip, &chip->azx_dev[i].bdl, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003108 }
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02003109 /* allocate memory for the position buffer */
Takashi Iwaid01ce992007-07-27 16:52:19 +02003110 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
3111 snd_dma_pci_data(chip->pci),
3112 chip->num_streams * 8, &chip->posbuf);
3113 if (err < 0) {
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02003114 snd_printk(KERN_ERR SFX "cannot allocate posbuf\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003115 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003116 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003117 mark_pages_wc(chip, &chip->posbuf, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003118 /* allocate CORB/RIRB */
Takashi Iwai81740862009-05-26 15:22:00 +02003119 err = azx_alloc_cmd_io(chip);
3120 if (err < 0)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003121 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003122
3123 /* initialize streams */
3124 azx_init_stream(chip);
3125
3126 /* initialize chip */
Takashi Iwaicb53c622007-08-10 17:21:45 +02003127 azx_init_pci(chip);
Jaroslav Kysela10e77dd2010-03-26 11:04:38 +01003128 azx_init_chip(chip, (probe_only[dev] & 2) == 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003129
3130 /* codec detection */
Pavel Machek927fc862006-08-31 17:03:43 +02003131 if (!chip->codec_mask) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003132 snd_printk(KERN_ERR SFX "no codecs found!\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003133 return -ENODEV;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003134 }
3135
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003136 strcpy(card->driver, "HDA-Intel");
Takashi Iwai18cb7102009-04-16 10:22:24 +02003137 strlcpy(card->shortname, driver_short_names[chip->driver_type],
3138 sizeof(card->shortname));
3139 snprintf(card->longname, sizeof(card->longname),
3140 "%s at 0x%lx irq %i",
3141 card->shortname, chip->addr, chip->irq);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003142
Linus Torvalds1da177e2005-04-16 15:20:36 -07003143 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003144}
3145
Takashi Iwaicb53c622007-08-10 17:21:45 +02003146static void power_down_all_codecs(struct azx *chip)
3147{
3148#ifdef CONFIG_SND_HDA_POWER_SAVE
3149 /* The codecs were powered up in snd_hda_codec_new().
3150 * Now all initialization done, so turn them down if possible
3151 */
3152 struct hda_codec *codec;
3153 list_for_each_entry(codec, &chip->bus->codec_list, list) {
3154 snd_hda_power_down(codec);
3155 }
3156#endif
3157}
3158
Takashi Iwai97c6a3d2012-08-09 17:40:46 +02003159#ifdef CONFIG_SND_HDA_PATCH_LOADER
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003160/* callback from request_firmware_nowait() */
3161static void azx_firmware_cb(const struct firmware *fw, void *context)
3162{
3163 struct snd_card *card = context;
3164 struct azx *chip = card->private_data;
3165 struct pci_dev *pci = chip->pci;
3166
3167 if (!fw) {
3168 snd_printk(KERN_ERR SFX "Cannot load firmware, aborting\n");
3169 goto error;
3170 }
3171
3172 chip->fw = fw;
3173 if (!chip->disabled) {
3174 /* continue probing */
3175 if (azx_probe_continue(chip))
3176 goto error;
3177 }
3178 return; /* OK */
3179
3180 error:
3181 snd_card_free(card);
3182 pci_set_drvdata(pci, NULL);
3183}
Takashi Iwai97c6a3d2012-08-09 17:40:46 +02003184#endif
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003185
Takashi Iwaid01ce992007-07-27 16:52:19 +02003186static int __devinit azx_probe(struct pci_dev *pci,
3187 const struct pci_device_id *pci_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003188{
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003189 static int dev;
Takashi Iwaia98f90f2005-11-17 14:59:02 +01003190 struct snd_card *card;
3191 struct azx *chip;
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003192 bool probe_now;
Pavel Machek927fc862006-08-31 17:03:43 +02003193 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003194
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003195 if (dev >= SNDRV_CARDS)
3196 return -ENODEV;
3197 if (!enable[dev]) {
3198 dev++;
3199 return -ENOENT;
3200 }
3201
Takashi Iwaie58de7b2008-12-28 16:44:30 +01003202 err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card);
3203 if (err < 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003204 snd_printk(KERN_ERR SFX "Error creating card!\n");
Takashi Iwaie58de7b2008-12-28 16:44:30 +01003205 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003206 }
3207
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003208 snd_card_set_dev(card, &pci->dev);
3209
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003210 err = azx_create(card, pci, dev, pci_id->driver_data, &chip);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003211 if (err < 0)
3212 goto out_free;
Takashi Iwai421a1252005-11-17 16:11:09 +01003213 card->private_data = chip;
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003214 probe_now = !chip->disabled;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003215
Takashi Iwai4918cda2012-08-09 12:33:28 +02003216#ifdef CONFIG_SND_HDA_PATCH_LOADER
3217 if (patch[dev] && *patch[dev]) {
3218 snd_printk(KERN_ERR SFX "Applying patch firmware '%s'\n",
3219 patch[dev]);
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003220 err = request_firmware_nowait(THIS_MODULE, true, patch[dev],
3221 &pci->dev, GFP_KERNEL, card,
3222 azx_firmware_cb);
Takashi Iwai4918cda2012-08-09 12:33:28 +02003223 if (err < 0)
3224 goto out_free;
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003225 probe_now = false; /* continued in azx_firmware_cb() */
Takashi Iwai4918cda2012-08-09 12:33:28 +02003226 }
3227#endif /* CONFIG_SND_HDA_PATCH_LOADER */
3228
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003229 if (probe_now) {
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003230 err = azx_probe_continue(chip);
3231 if (err < 0)
3232 goto out_free;
3233 }
3234
3235 pci_set_drvdata(pci, card);
3236
3237 dev++;
3238 return 0;
3239
3240out_free:
3241 snd_card_free(card);
3242 return err;
3243}
3244
3245static int DELAYED_INIT_MARK azx_probe_continue(struct azx *chip)
3246{
3247 int dev = chip->dev_index;
3248 int err;
3249
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +01003250#ifdef CONFIG_SND_HDA_INPUT_BEEP
3251 chip->beep_mode = beep_mode[dev];
3252#endif
3253
Linus Torvalds1da177e2005-04-16 15:20:36 -07003254 /* create codec instances */
Takashi Iwaia1e21c92009-06-17 09:33:52 +02003255 err = azx_codec_create(chip, model[dev]);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003256 if (err < 0)
3257 goto out_free;
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003258#ifdef CONFIG_SND_HDA_PATCH_LOADER
Takashi Iwai4918cda2012-08-09 12:33:28 +02003259 if (chip->fw) {
3260 err = snd_hda_load_patch(chip->bus, chip->fw->size,
3261 chip->fw->data);
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003262 if (err < 0)
3263 goto out_free;
Takashi Iwai4918cda2012-08-09 12:33:28 +02003264 release_firmware(chip->fw); /* no longer needed */
3265 chip->fw = NULL;
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003266 }
3267#endif
Jaroslav Kysela10e77dd2010-03-26 11:04:38 +01003268 if ((probe_only[dev] & 1) == 0) {
Takashi Iwaia1e21c92009-06-17 09:33:52 +02003269 err = azx_codec_configure(chip);
3270 if (err < 0)
3271 goto out_free;
3272 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003273
3274 /* create PCM streams */
Takashi Iwai176d5332008-07-30 15:01:44 +02003275 err = snd_hda_build_pcms(chip->bus);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003276 if (err < 0)
3277 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003278
3279 /* create mixer controls */
Takashi Iwaid01ce992007-07-27 16:52:19 +02003280 err = azx_mixer_create(chip);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003281 if (err < 0)
3282 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003283
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003284 err = snd_card_register(chip->card);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003285 if (err < 0)
3286 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003287
Takashi Iwaicb53c622007-08-10 17:21:45 +02003288 chip->running = 1;
3289 power_down_all_codecs(chip);
Takashi Iwai0cbf0092008-10-29 16:18:25 +01003290 azx_notifier_register(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003291
Takashi Iwai91219472012-04-26 12:13:25 +02003292 return 0;
3293
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003294out_free:
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003295 chip->init_failed = 1;
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003296 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003297}
3298
3299static void __devexit azx_remove(struct pci_dev *pci)
3300{
Takashi Iwai91219472012-04-26 12:13:25 +02003301 struct snd_card *card = pci_get_drvdata(pci);
3302 if (card)
3303 snd_card_free(card);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003304 pci_set_drvdata(pci, NULL);
3305}
3306
3307/* PCI IDs */
Alexey Dobriyancebe41d2010-02-06 00:21:03 +02003308static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
Seth Heasleyd2f2fcd2010-01-12 17:03:35 -08003309 /* CPT */
Takashi Iwai9477c582011-05-25 09:11:37 +02003310 { PCI_DEVICE(0x8086, 0x1c20),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003311 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP |
Seth Heasleyc20c5a82012-06-14 14:23:53 -07003312 AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_COMBO },
Seth Heasleycea310e2010-09-10 16:29:56 -07003313 /* PBG */
Takashi Iwai9477c582011-05-25 09:11:37 +02003314 { PCI_DEVICE(0x8086, 0x1d20),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003315 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP |
3316 AZX_DCAPS_BUFSIZE},
Seth Heasleyd2edeb72011-04-20 10:59:57 -07003317 /* Panther Point */
Takashi Iwai9477c582011-05-25 09:11:37 +02003318 { PCI_DEVICE(0x8086, 0x1e20),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003319 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP |
Seth Heasleyc20c5a82012-06-14 14:23:53 -07003320 AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_COMBO },
Seth Heasley8bc039a2012-01-23 16:24:31 -08003321 /* Lynx Point */
3322 { PCI_DEVICE(0x8086, 0x8c20),
3323 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP |
Seth Heasleyc20c5a82012-06-14 14:23:53 -07003324 AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_COMBO },
Wang Xingchaoe926f2c2012-06-13 10:23:51 +08003325 /* Haswell */
3326 { PCI_DEVICE(0x8086, 0x0c0c),
Takashi Iwaibdbe34d2012-07-16 16:17:10 +02003327 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP |
Wang Xingchaoe926f2c2012-06-13 10:23:51 +08003328 AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_COMBO },
Takashi Iwai87218e92008-02-21 08:13:11 +01003329 /* SCH */
Takashi Iwai9477c582011-05-25 09:11:37 +02003330 { PCI_DEVICE(0x8086, 0x811b),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003331 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP |
David Henningsson645e9032011-12-14 15:52:30 +08003332 AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_LPIB }, /* Poulsbo */
Li Peng09904b92011-12-28 15:17:26 +00003333 { PCI_DEVICE(0x8086, 0x080a),
3334 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP |
David Henningsson716e5db2012-01-04 10:12:54 +01003335 AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_LPIB }, /* Oaktrail */
David Henningsson645e9032011-12-14 15:52:30 +08003336 /* ICH */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003337 { PCI_DEVICE(0x8086, 0x2668),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003338 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3339 AZX_DCAPS_BUFSIZE }, /* ICH6 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003340 { PCI_DEVICE(0x8086, 0x27d8),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003341 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3342 AZX_DCAPS_BUFSIZE }, /* ICH7 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003343 { PCI_DEVICE(0x8086, 0x269a),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003344 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3345 AZX_DCAPS_BUFSIZE }, /* ESB2 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003346 { PCI_DEVICE(0x8086, 0x284b),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003347 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3348 AZX_DCAPS_BUFSIZE }, /* ICH8 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003349 { PCI_DEVICE(0x8086, 0x293e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003350 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3351 AZX_DCAPS_BUFSIZE }, /* ICH9 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003352 { PCI_DEVICE(0x8086, 0x293f),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003353 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3354 AZX_DCAPS_BUFSIZE }, /* ICH9 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003355 { PCI_DEVICE(0x8086, 0x3a3e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003356 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3357 AZX_DCAPS_BUFSIZE }, /* ICH10 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003358 { PCI_DEVICE(0x8086, 0x3a6e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003359 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3360 AZX_DCAPS_BUFSIZE }, /* ICH10 */
Takashi Iwaib6864532010-09-15 10:17:26 +02003361 /* Generic Intel */
3362 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_ANY_ID),
3363 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3364 .class_mask = 0xffffff,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003365 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_BUFSIZE },
Takashi Iwai9477c582011-05-25 09:11:37 +02003366 /* ATI SB 450/600/700/800/900 */
3367 { PCI_DEVICE(0x1002, 0x437b),
3368 .driver_data = AZX_DRIVER_ATI | AZX_DCAPS_PRESET_ATI_SB },
3369 { PCI_DEVICE(0x1002, 0x4383),
3370 .driver_data = AZX_DRIVER_ATI | AZX_DCAPS_PRESET_ATI_SB },
3371 /* AMD Hudson */
3372 { PCI_DEVICE(0x1022, 0x780d),
3373 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_SB },
Takashi Iwai87218e92008-02-21 08:13:11 +01003374 /* ATI HDMI */
Takashi Iwai9477c582011-05-25 09:11:37 +02003375 { PCI_DEVICE(0x1002, 0x793b),
3376 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3377 { PCI_DEVICE(0x1002, 0x7919),
3378 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3379 { PCI_DEVICE(0x1002, 0x960f),
3380 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3381 { PCI_DEVICE(0x1002, 0x970f),
3382 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3383 { PCI_DEVICE(0x1002, 0xaa00),
3384 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3385 { PCI_DEVICE(0x1002, 0xaa08),
3386 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3387 { PCI_DEVICE(0x1002, 0xaa10),
3388 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3389 { PCI_DEVICE(0x1002, 0xaa18),
3390 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3391 { PCI_DEVICE(0x1002, 0xaa20),
3392 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3393 { PCI_DEVICE(0x1002, 0xaa28),
3394 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3395 { PCI_DEVICE(0x1002, 0xaa30),
3396 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3397 { PCI_DEVICE(0x1002, 0xaa38),
3398 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3399 { PCI_DEVICE(0x1002, 0xaa40),
3400 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3401 { PCI_DEVICE(0x1002, 0xaa48),
3402 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
Andiry Xu1815b342011-12-14 16:10:27 +08003403 { PCI_DEVICE(0x1002, 0x9902),
3404 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
3405 { PCI_DEVICE(0x1002, 0xaaa0),
3406 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
3407 { PCI_DEVICE(0x1002, 0xaaa8),
3408 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
3409 { PCI_DEVICE(0x1002, 0xaab0),
3410 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
Takashi Iwai87218e92008-02-21 08:13:11 +01003411 /* VIA VT8251/VT8237A */
Takashi Iwai9477c582011-05-25 09:11:37 +02003412 { PCI_DEVICE(0x1106, 0x3288),
3413 .driver_data = AZX_DRIVER_VIA | AZX_DCAPS_POSFIX_VIA },
Annie Liu754fdff2012-06-08 19:18:39 +08003414 /* VIA GFX VT7122/VX900 */
3415 { PCI_DEVICE(0x1106, 0x9170), .driver_data = AZX_DRIVER_GENERIC },
3416 /* VIA GFX VT6122/VX11 */
3417 { PCI_DEVICE(0x1106, 0x9140), .driver_data = AZX_DRIVER_GENERIC },
Takashi Iwai87218e92008-02-21 08:13:11 +01003418 /* SIS966 */
3419 { PCI_DEVICE(0x1039, 0x7502), .driver_data = AZX_DRIVER_SIS },
3420 /* ULI M5461 */
3421 { PCI_DEVICE(0x10b9, 0x5461), .driver_data = AZX_DRIVER_ULI },
3422 /* NVIDIA MCP */
Takashi Iwai0c2fd1bf42009-12-18 16:41:39 +01003423 { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID),
3424 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3425 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02003426 .driver_data = AZX_DRIVER_NVIDIA | AZX_DCAPS_PRESET_NVIDIA },
Kailang Yangf2690022008-05-27 11:44:55 +02003427 /* Teradici */
Takashi Iwai9477c582011-05-25 09:11:37 +02003428 { PCI_DEVICE(0x6549, 0x1200),
3429 .driver_data = AZX_DRIVER_TERA | AZX_DCAPS_NO_64BIT },
Takashi Iwai4e01f542009-04-16 08:53:34 +02003430 /* Creative X-Fi (CA0110-IBG) */
Takashi Iwaif2a8eca2012-06-11 15:51:54 +02003431 /* CTHDA chips */
3432 { PCI_DEVICE(0x1102, 0x0010),
3433 .driver_data = AZX_DRIVER_CTHDA | AZX_DCAPS_PRESET_CTHDA },
3434 { PCI_DEVICE(0x1102, 0x0012),
3435 .driver_data = AZX_DRIVER_CTHDA | AZX_DCAPS_PRESET_CTHDA },
Takashi Iwai313f6e22009-05-18 12:40:52 +02003436#if !defined(CONFIG_SND_CTXFI) && !defined(CONFIG_SND_CTXFI_MODULE)
3437 /* the following entry conflicts with snd-ctxfi driver,
3438 * as ctxfi driver mutates from HD-audio to native mode with
3439 * a special command sequence.
3440 */
Takashi Iwai4e01f542009-04-16 08:53:34 +02003441 { PCI_DEVICE(PCI_VENDOR_ID_CREATIVE, PCI_ANY_ID),
3442 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3443 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02003444 .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
Takashi Iwai69f9ba92011-11-06 13:49:13 +01003445 AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB },
Takashi Iwai313f6e22009-05-18 12:40:52 +02003446#else
3447 /* this entry seems still valid -- i.e. without emu20kx chip */
Takashi Iwai9477c582011-05-25 09:11:37 +02003448 { PCI_DEVICE(0x1102, 0x0009),
3449 .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
Takashi Iwai69f9ba92011-11-06 13:49:13 +01003450 AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB },
Takashi Iwai313f6e22009-05-18 12:40:52 +02003451#endif
Otavio Salvadore35d4b12010-09-26 23:35:06 -03003452 /* Vortex86MX */
3453 { PCI_DEVICE(0x17f3, 0x3010), .driver_data = AZX_DRIVER_GENERIC },
Bankim Bhavsar0f0714c52011-01-17 15:23:21 +01003454 /* VMware HDAudio */
3455 { PCI_DEVICE(0x15ad, 0x1977), .driver_data = AZX_DRIVER_GENERIC },
Andiry Brienza9176b672009-07-17 11:32:32 +08003456 /* AMD/ATI Generic, PCI class code and Vendor ID for HD Audio */
Yang, Libinc4da29c2008-11-13 11:07:07 +01003457 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_ANY_ID),
3458 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3459 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02003460 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_HDMI },
Andiry Brienza9176b672009-07-17 11:32:32 +08003461 { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_ANY_ID),
3462 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3463 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02003464 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_HDMI },
Linus Torvalds1da177e2005-04-16 15:20:36 -07003465 { 0, }
3466};
3467MODULE_DEVICE_TABLE(pci, azx_ids);
3468
3469/* pci_driver definition */
Takashi Iwaie9f66d92012-04-24 12:25:00 +02003470static struct pci_driver azx_driver = {
Takashi Iwai3733e422011-06-10 16:20:20 +02003471 .name = KBUILD_MODNAME,
Linus Torvalds1da177e2005-04-16 15:20:36 -07003472 .id_table = azx_ids,
3473 .probe = azx_probe,
3474 .remove = __devexit_p(azx_remove),
Takashi Iwai68cb2b52012-07-02 15:20:37 +02003475 .driver = {
3476 .pm = AZX_PM_OPS,
3477 },
Linus Torvalds1da177e2005-04-16 15:20:36 -07003478};
3479
Takashi Iwaie9f66d92012-04-24 12:25:00 +02003480module_pci_driver(azx_driver);