blob: e354c16165417e9908bbafc39d636138c12ca8cf [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>
56#include "hda_codec.h"
57
58
Takashi Iwai5aba4f82008-01-07 15:16:37 +010059static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
60static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
Rusty Russella67ff6a2011-12-15 13:49:36 +103061static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
Takashi Iwai5aba4f82008-01-07 15:16:37 +010062static char *model[SNDRV_CARDS];
63static int position_fix[SNDRV_CARDS];
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +020064static int bdl_pos_adj[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = -1};
Takashi Iwai5aba4f82008-01-07 15:16:37 +010065static int probe_mask[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = -1};
Takashi Iwaid4d9cd032008-12-19 15:19:11 +010066static int probe_only[SNDRV_CARDS];
Rusty Russella67ff6a2011-12-15 13:49:36 +103067static bool single_cmd;
Takashi Iwai716238552009-09-28 13:14:04 +020068static int enable_msi = -1;
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +020069#ifdef CONFIG_SND_HDA_PATCH_LOADER
70static char *patch[SNDRV_CARDS];
71#endif
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +010072#ifdef CONFIG_SND_HDA_INPUT_BEEP
73static int beep_mode[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] =
74 CONFIG_SND_HDA_INPUT_BEEP_MODE};
75#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070076
Takashi Iwai5aba4f82008-01-07 15:16:37 +010077module_param_array(index, int, NULL, 0444);
Linus Torvalds1da177e2005-04-16 15:20:36 -070078MODULE_PARM_DESC(index, "Index value for Intel HD audio interface.");
Takashi Iwai5aba4f82008-01-07 15:16:37 +010079module_param_array(id, charp, NULL, 0444);
Linus Torvalds1da177e2005-04-16 15:20:36 -070080MODULE_PARM_DESC(id, "ID string for Intel HD audio interface.");
Takashi Iwai5aba4f82008-01-07 15:16:37 +010081module_param_array(enable, bool, NULL, 0444);
82MODULE_PARM_DESC(enable, "Enable Intel HD audio interface.");
83module_param_array(model, charp, NULL, 0444);
Linus Torvalds1da177e2005-04-16 15:20:36 -070084MODULE_PARM_DESC(model, "Use the given board model.");
Takashi Iwai5aba4f82008-01-07 15:16:37 +010085module_param_array(position_fix, int, NULL, 0444);
David Henningsson4cb36312010-09-30 10:12:50 +020086MODULE_PARM_DESC(position_fix, "DMA pointer read method."
87 "(0 = auto, 1 = LPIB, 2 = POSBUF, 3 = VIACOMBO).");
Takashi Iwai555e2192008-06-10 17:53:34 +020088module_param_array(bdl_pos_adj, int, NULL, 0644);
89MODULE_PARM_DESC(bdl_pos_adj, "BDL position adjustment offset.");
Takashi Iwai5aba4f82008-01-07 15:16:37 +010090module_param_array(probe_mask, int, NULL, 0444);
Takashi Iwai606ad752005-11-24 16:03:40 +010091MODULE_PARM_DESC(probe_mask, "Bitmask to probe codecs (default = -1).");
Jaroslav Kysela079e6832010-03-26 11:16:59 +010092module_param_array(probe_only, int, NULL, 0444);
Takashi Iwaid4d9cd032008-12-19 15:19:11 +010093MODULE_PARM_DESC(probe_only, "Only probing and no codec initialization.");
Takashi Iwai27346162006-01-12 18:28:44 +010094module_param(single_cmd, bool, 0444);
Takashi Iwaid01ce992007-07-27 16:52:19 +020095MODULE_PARM_DESC(single_cmd, "Use single command to communicate with codecs "
96 "(for debugging only).");
Takashi Iwaiac9ef6c2012-01-20 12:08:44 +010097module_param(enable_msi, bint, 0444);
Takashi Iwai134a11f2006-11-10 12:08:37 +010098MODULE_PARM_DESC(enable_msi, "Enable Message Signaled Interrupt (MSI)");
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +020099#ifdef CONFIG_SND_HDA_PATCH_LOADER
100module_param_array(patch, charp, NULL, 0444);
101MODULE_PARM_DESC(patch, "Patch file for Intel HD audio interface.");
102#endif
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +0100103#ifdef CONFIG_SND_HDA_INPUT_BEEP
104module_param_array(beep_mode, int, NULL, 0444);
105MODULE_PARM_DESC(beep_mode, "Select HDA Beep registration mode "
106 "(0=off, 1=on, 2=mute switch on/off) (default=1).");
107#endif
Takashi Iwai606ad752005-11-24 16:03:40 +0100108
Takashi Iwaidee1b662007-08-13 16:10:30 +0200109#ifdef CONFIG_SND_HDA_POWER_SAVE
Takashi Iwaifee2fba2008-11-27 12:43:28 +0100110static int power_save = CONFIG_SND_HDA_POWER_SAVE_DEFAULT;
111module_param(power_save, int, 0644);
112MODULE_PARM_DESC(power_save, "Automatic power-saving timeout "
113 "(in second, 0 = disable).");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700114
Takashi Iwaidee1b662007-08-13 16:10:30 +0200115/* reset the HD-audio controller in power save mode.
116 * this may give more power-saving, but will take longer time to
117 * wake up.
118 */
Rusty Russella67ff6a2011-12-15 13:49:36 +1030119static bool power_save_controller = 1;
Takashi Iwaidee1b662007-08-13 16:10:30 +0200120module_param(power_save_controller, bool, 0644);
121MODULE_PARM_DESC(power_save_controller, "Reset controller in power save mode.");
122#endif
123
Takashi Iwai7bfe0592012-01-23 17:53:39 +0100124static int align_buffer_size = -1;
125module_param(align_buffer_size, bint, 0644);
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -0500126MODULE_PARM_DESC(align_buffer_size,
127 "Force buffer and period sizes to be multiple of 128 bytes.");
128
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200129#ifdef CONFIG_X86
130static bool hda_snoop = true;
131module_param_named(snoop, hda_snoop, bool, 0444);
132MODULE_PARM_DESC(snoop, "Enable/disable snooping");
133#define azx_snoop(chip) (chip)->snoop
134#else
135#define hda_snoop true
136#define azx_snoop(chip) true
137#endif
138
139
Linus Torvalds1da177e2005-04-16 15:20:36 -0700140MODULE_LICENSE("GPL");
141MODULE_SUPPORTED_DEVICE("{{Intel, ICH6},"
142 "{Intel, ICH6M},"
Jason Gaston2f1b3812005-05-01 08:58:50 -0700143 "{Intel, ICH7},"
Frederick Lif5d40b32005-05-12 14:55:20 +0200144 "{Intel, ESB2},"
Jason Gastond2981392006-01-10 11:07:37 +0100145 "{Intel, ICH8},"
Jason Gastonf9cc8a82006-11-22 11:53:52 +0100146 "{Intel, ICH9},"
Jason Gastonc34f5a02008-01-29 12:38:49 +0100147 "{Intel, ICH10},"
Seth Heasleyb29c2362008-08-08 15:56:39 -0700148 "{Intel, PCH},"
Seth Heasleyd2f2fcd2010-01-12 17:03:35 -0800149 "{Intel, CPT},"
Seth Heasleyd2edeb72011-04-20 10:59:57 -0700150 "{Intel, PPT},"
Seth Heasley8bc039a2012-01-23 16:24:31 -0800151 "{Intel, LPT},"
Seth Heasleycea310e2010-09-10 16:29:56 -0700152 "{Intel, PBG},"
Tobin Davis4979bca2008-01-30 08:13:55 +0100153 "{Intel, SCH},"
Takashi Iwaifc20a562005-05-12 15:00:41 +0200154 "{ATI, SB450},"
Felix Kuehling89be83f2006-03-31 12:33:59 +0200155 "{ATI, SB600},"
Felix Kuehling778b6e12006-05-17 11:22:21 +0200156 "{ATI, RS600},"
Felix Kuehling5b15c952006-10-16 12:49:47 +0200157 "{ATI, RS690},"
Wolke Liue6db1112007-04-27 12:20:57 +0200158 "{ATI, RS780},"
159 "{ATI, R600},"
Herton Ronaldo Krzesinski2797f722007-11-05 18:21:56 +0100160 "{ATI, RV630},"
161 "{ATI, RV610},"
Wolke Liu27da1832007-11-16 11:06:30 +0100162 "{ATI, RV670},"
163 "{ATI, RV635},"
164 "{ATI, RV620},"
165 "{ATI, RV770},"
Takashi Iwaifc20a562005-05-12 15:00:41 +0200166 "{VIA, VT8251},"
Takashi Iwai47672312005-08-12 16:44:04 +0200167 "{VIA, VT8237A},"
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200168 "{SiS, SIS966},"
169 "{ULI, M5461}}");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700170MODULE_DESCRIPTION("Intel HDA driver");
171
Takashi Iwai4abc1cc2009-05-19 12:16:46 +0200172#ifdef CONFIG_SND_VERBOSE_PRINTK
173#define SFX /* nop */
174#else
Linus Torvalds1da177e2005-04-16 15:20:36 -0700175#define SFX "hda-intel: "
Takashi Iwai4abc1cc2009-05-19 12:16:46 +0200176#endif
Takashi Iwaicb53c622007-08-10 17:21:45 +0200177
178/*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700179 * registers
180 */
181#define ICH6_REG_GCAP 0x00
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200182#define ICH6_GCAP_64OK (1 << 0) /* 64bit address support */
183#define ICH6_GCAP_NSDO (3 << 1) /* # of serial data out signals */
184#define ICH6_GCAP_BSS (31 << 3) /* # of bidirectional streams */
185#define ICH6_GCAP_ISS (15 << 8) /* # of input streams */
186#define ICH6_GCAP_OSS (15 << 12) /* # of output streams */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700187#define ICH6_REG_VMIN 0x02
188#define ICH6_REG_VMAJ 0x03
189#define ICH6_REG_OUTPAY 0x04
190#define ICH6_REG_INPAY 0x06
191#define ICH6_REG_GCTL 0x08
Takashi Iwai8a933ec2009-05-31 09:28:12 +0200192#define ICH6_GCTL_RESET (1 << 0) /* controller reset */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200193#define ICH6_GCTL_FCNTRL (1 << 1) /* flush control */
194#define ICH6_GCTL_UNSOL (1 << 8) /* accept unsol. response enable */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700195#define ICH6_REG_WAKEEN 0x0c
196#define ICH6_REG_STATESTS 0x0e
197#define ICH6_REG_GSTS 0x10
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200198#define ICH6_GSTS_FSTS (1 << 1) /* flush status */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700199#define ICH6_REG_INTCTL 0x20
200#define ICH6_REG_INTSTS 0x24
Jaroslav Kyselae5463722010-05-11 10:21:46 +0200201#define ICH6_REG_WALLCLK 0x30 /* 24Mhz source */
Takashi Iwai8b0bd222011-06-10 14:56:26 +0200202#define ICH6_REG_OLD_SSYNC 0x34 /* SSYNC for old ICH */
203#define ICH6_REG_SSYNC 0x38
Linus Torvalds1da177e2005-04-16 15:20:36 -0700204#define ICH6_REG_CORBLBASE 0x40
205#define ICH6_REG_CORBUBASE 0x44
206#define ICH6_REG_CORBWP 0x48
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200207#define ICH6_REG_CORBRP 0x4a
208#define ICH6_CORBRP_RST (1 << 15) /* read pointer reset */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700209#define ICH6_REG_CORBCTL 0x4c
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200210#define ICH6_CORBCTL_RUN (1 << 1) /* enable DMA */
211#define ICH6_CORBCTL_CMEIE (1 << 0) /* enable memory error irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700212#define ICH6_REG_CORBSTS 0x4d
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200213#define ICH6_CORBSTS_CMEI (1 << 0) /* memory error indication */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700214#define ICH6_REG_CORBSIZE 0x4e
215
216#define ICH6_REG_RIRBLBASE 0x50
217#define ICH6_REG_RIRBUBASE 0x54
218#define ICH6_REG_RIRBWP 0x58
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200219#define ICH6_RIRBWP_RST (1 << 15) /* write pointer reset */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700220#define ICH6_REG_RINTCNT 0x5a
221#define ICH6_REG_RIRBCTL 0x5c
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200222#define ICH6_RBCTL_IRQ_EN (1 << 0) /* enable IRQ */
223#define ICH6_RBCTL_DMA_EN (1 << 1) /* enable DMA */
224#define ICH6_RBCTL_OVERRUN_EN (1 << 2) /* enable overrun irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700225#define ICH6_REG_RIRBSTS 0x5d
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200226#define ICH6_RBSTS_IRQ (1 << 0) /* response irq */
227#define ICH6_RBSTS_OVERRUN (1 << 2) /* overrun irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700228#define ICH6_REG_RIRBSIZE 0x5e
229
230#define ICH6_REG_IC 0x60
231#define ICH6_REG_IR 0x64
232#define ICH6_REG_IRS 0x68
233#define ICH6_IRS_VALID (1<<1)
234#define ICH6_IRS_BUSY (1<<0)
235
236#define ICH6_REG_DPLBASE 0x70
237#define ICH6_REG_DPUBASE 0x74
238#define ICH6_DPLBASE_ENABLE 0x1 /* Enable position buffer */
239
240/* SD offset: SDI0=0x80, SDI1=0xa0, ... SDO3=0x160 */
241enum { SDI0, SDI1, SDI2, SDI3, SDO0, SDO1, SDO2, SDO3 };
242
243/* stream register offsets from stream base */
244#define ICH6_REG_SD_CTL 0x00
245#define ICH6_REG_SD_STS 0x03
246#define ICH6_REG_SD_LPIB 0x04
247#define ICH6_REG_SD_CBL 0x08
248#define ICH6_REG_SD_LVI 0x0c
249#define ICH6_REG_SD_FIFOW 0x0e
250#define ICH6_REG_SD_FIFOSIZE 0x10
251#define ICH6_REG_SD_FORMAT 0x12
252#define ICH6_REG_SD_BDLPL 0x18
253#define ICH6_REG_SD_BDLPU 0x1c
254
255/* PCI space */
256#define ICH6_PCIREG_TCSEL 0x44
257
258/*
259 * other constants
260 */
261
262/* max number of SDs */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200263/* ICH, ATI and VIA have 4 playback and 4 capture */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200264#define ICH6_NUM_CAPTURE 4
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200265#define ICH6_NUM_PLAYBACK 4
266
267/* ULI has 6 playback and 5 capture */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200268#define ULI_NUM_CAPTURE 5
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200269#define ULI_NUM_PLAYBACK 6
270
Felix Kuehling778b6e12006-05-17 11:22:21 +0200271/* ATI HDMI has 1 playback and 0 capture */
Felix Kuehling778b6e12006-05-17 11:22:21 +0200272#define ATIHDMI_NUM_CAPTURE 0
Felix Kuehling778b6e12006-05-17 11:22:21 +0200273#define ATIHDMI_NUM_PLAYBACK 1
274
Kailang Yangf2690022008-05-27 11:44:55 +0200275/* TERA has 4 playback and 3 capture */
276#define TERA_NUM_CAPTURE 3
277#define TERA_NUM_PLAYBACK 4
278
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200279/* this number is statically defined for simplicity */
280#define MAX_AZX_DEV 16
281
Linus Torvalds1da177e2005-04-16 15:20:36 -0700282/* max number of fragments - we may use more if allocating more pages for BDL */
Takashi Iwai4ce107b2008-02-06 14:50:19 +0100283#define BDL_SIZE 4096
284#define AZX_MAX_BDL_ENTRIES (BDL_SIZE / 16)
285#define AZX_MAX_FRAG 32
Linus Torvalds1da177e2005-04-16 15:20:36 -0700286/* max buffer size - no h/w limit, you can increase as you like */
287#define AZX_MAX_BUF_SIZE (1024*1024*1024)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700288
289/* RIRB int mask: overrun[2], response[0] */
290#define RIRB_INT_RESPONSE 0x01
291#define RIRB_INT_OVERRUN 0x04
292#define RIRB_INT_MASK 0x05
293
Takashi Iwai2f5983f2008-09-03 16:00:44 +0200294/* STATESTS int mask: S3,SD2,SD1,SD0 */
Wei Ni7445dfc2010-03-03 15:05:53 +0800295#define AZX_MAX_CODECS 8
296#define AZX_DEFAULT_CODECS 4
Wu Fengguangdeadff12009-08-01 18:45:16 +0800297#define STATESTS_INT_MASK ((1 << AZX_MAX_CODECS) - 1)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700298
299/* SD_CTL bits */
300#define SD_CTL_STREAM_RESET 0x01 /* stream reset bit */
301#define SD_CTL_DMA_START 0x02 /* stream DMA start bit */
Takashi Iwai850f0e52008-03-18 17:11:05 +0100302#define SD_CTL_STRIPE (3 << 16) /* stripe control */
303#define SD_CTL_TRAFFIC_PRIO (1 << 18) /* traffic priority */
304#define SD_CTL_DIR (1 << 19) /* bi-directional stream */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700305#define SD_CTL_STREAM_TAG_MASK (0xf << 20)
306#define SD_CTL_STREAM_TAG_SHIFT 20
307
308/* SD_CTL and SD_STS */
309#define SD_INT_DESC_ERR 0x10 /* descriptor error interrupt */
310#define SD_INT_FIFO_ERR 0x08 /* FIFO error interrupt */
311#define SD_INT_COMPLETE 0x04 /* completion interrupt */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200312#define SD_INT_MASK (SD_INT_DESC_ERR|SD_INT_FIFO_ERR|\
313 SD_INT_COMPLETE)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700314
315/* SD_STS */
316#define SD_STS_FIFO_READY 0x20 /* FIFO ready */
317
318/* INTCTL and INTSTS */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200319#define ICH6_INT_ALL_STREAM 0xff /* all stream interrupts */
320#define ICH6_INT_CTRL_EN 0x40000000 /* controller interrupt enable bit */
321#define ICH6_INT_GLOBAL_EN 0x80000000 /* global interrupt enable bit */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700322
Linus Torvalds1da177e2005-04-16 15:20:36 -0700323/* below are so far hardcoded - should read registers in future */
324#define ICH6_MAX_CORB_ENTRIES 256
325#define ICH6_MAX_RIRB_ENTRIES 256
326
Takashi Iwaic74db862005-05-12 14:26:27 +0200327/* position fix mode */
328enum {
Takashi Iwai0be3b5d2005-09-05 17:11:40 +0200329 POS_FIX_AUTO,
Takashi Iwaid2e1c972008-06-10 17:53:34 +0200330 POS_FIX_LPIB,
Takashi Iwai0be3b5d2005-09-05 17:11:40 +0200331 POS_FIX_POSBUF,
David Henningsson4cb36312010-09-30 10:12:50 +0200332 POS_FIX_VIACOMBO,
Takashi Iwaic74db862005-05-12 14:26:27 +0200333};
Linus Torvalds1da177e2005-04-16 15:20:36 -0700334
Frederick Lif5d40b32005-05-12 14:55:20 +0200335/* Defines for ATI HD Audio support in SB450 south bridge */
Frederick Lif5d40b32005-05-12 14:55:20 +0200336#define ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR 0x42
337#define ATI_SB450_HDAUDIO_ENABLE_SNOOP 0x02
338
Vinod Gda3fca22005-09-13 18:49:12 +0200339/* Defines for Nvidia HDA support */
340#define NVIDIA_HDA_TRANSREG_ADDR 0x4e
341#define NVIDIA_HDA_ENABLE_COHBITS 0x0f
Peer Chen320dcc32008-08-20 16:43:24 -0700342#define NVIDIA_HDA_ISTRM_COH 0x4d
343#define NVIDIA_HDA_OSTRM_COH 0x4c
344#define NVIDIA_HDA_ENABLE_COHBIT 0x01
Frederick Lif5d40b32005-05-12 14:55:20 +0200345
Takashi Iwai90a5ad52008-02-22 18:36:22 +0100346/* Defines for Intel SCH HDA snoop control */
347#define INTEL_SCH_HDA_DEVC 0x78
348#define INTEL_SCH_HDA_DEVC_NOSNOOP (0x1<<11)
349
Joseph Chan0e153472008-08-26 14:38:03 +0200350/* Define IN stream 0 FIFO size offset in VIA controller */
351#define VIA_IN_STREAM0_FIFO_SIZE_OFFSET 0x90
352/* Define VIA HD Audio Device ID*/
353#define VIA_HDAC_DEVICE_ID 0x3288
354
Yang, Libinc4da29c2008-11-13 11:07:07 +0100355/* HD Audio class code */
356#define PCI_CLASS_MULTIMEDIA_HD_AUDIO 0x0403
Takashi Iwai90a5ad52008-02-22 18:36:22 +0100357
Linus Torvalds1da177e2005-04-16 15:20:36 -0700358/*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700359 */
360
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100361struct azx_dev {
Takashi Iwai4ce107b2008-02-06 14:50:19 +0100362 struct snd_dma_buffer bdl; /* BDL buffer */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200363 u32 *posbuf; /* position buffer pointer */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700364
Takashi Iwaid01ce992007-07-27 16:52:19 +0200365 unsigned int bufsize; /* size of the play buffer in bytes */
Takashi Iwai9ad593f2008-05-16 12:34:47 +0200366 unsigned int period_bytes; /* size of the period in bytes */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200367 unsigned int frags; /* number for period in the play buffer */
368 unsigned int fifo_size; /* FIFO size */
Jaroslav Kyselae5463722010-05-11 10:21:46 +0200369 unsigned long start_wallclk; /* start + minimum wallclk */
370 unsigned long period_wallclk; /* wallclk for period */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700371
Takashi Iwaid01ce992007-07-27 16:52:19 +0200372 void __iomem *sd_addr; /* stream descriptor pointer */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700373
Takashi Iwaid01ce992007-07-27 16:52:19 +0200374 u32 sd_int_sta_mask; /* stream int status mask */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700375
376 /* pcm support */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200377 struct snd_pcm_substream *substream; /* assigned substream,
378 * set in PCM open
379 */
380 unsigned int format_val; /* format value to be set in the
381 * controller and the codec
382 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700383 unsigned char stream_tag; /* assigned stream */
384 unsigned char index; /* stream index */
Takashi Iwaid5cf9912011-10-06 10:07:58 +0200385 int assigned_key; /* last device# key assigned to */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700386
Pavel Machek927fc862006-08-31 17:03:43 +0200387 unsigned int opened :1;
388 unsigned int running :1;
Takashi Iwai675f25d2008-06-10 17:53:20 +0200389 unsigned int irq_pending :1;
Joseph Chan0e153472008-08-26 14:38:03 +0200390 /*
391 * For VIA:
392 * A flag to ensure DMA position is 0
393 * when link position is not greater than FIFO size
394 */
395 unsigned int insufficient :1;
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200396 unsigned int wc_marked:1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700397};
398
399/* CORB/RIRB */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100400struct azx_rb {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700401 u32 *buf; /* CORB/RIRB buffer
402 * Each CORB entry is 4byte, RIRB is 8byte
403 */
404 dma_addr_t addr; /* physical address of CORB/RIRB buffer */
405 /* for RIRB */
406 unsigned short rp, wp; /* read/write pointers */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800407 int cmds[AZX_MAX_CODECS]; /* number of pending requests */
408 u32 res[AZX_MAX_CODECS]; /* last read value */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700409};
410
Takashi Iwai01b65bf2011-11-24 14:31:46 +0100411struct azx_pcm {
412 struct azx *chip;
413 struct snd_pcm *pcm;
414 struct hda_codec *codec;
415 struct hda_pcm_stream *hinfo[2];
416 struct list_head list;
417};
418
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100419struct azx {
420 struct snd_card *card;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700421 struct pci_dev *pci;
Takashi Iwai555e2192008-06-10 17:53:34 +0200422 int dev_index;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700423
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200424 /* chip type specific */
425 int driver_type;
Takashi Iwai9477c582011-05-25 09:11:37 +0200426 unsigned int driver_caps;
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200427 int playback_streams;
428 int playback_index_offset;
429 int capture_streams;
430 int capture_index_offset;
431 int num_streams;
432
Linus Torvalds1da177e2005-04-16 15:20:36 -0700433 /* pci resources */
434 unsigned long addr;
435 void __iomem *remap_addr;
436 int irq;
437
438 /* locks */
439 spinlock_t reg_lock;
Ingo Molnar62932df2006-01-16 16:34:20 +0100440 struct mutex open_mutex;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700441
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200442 /* streams (x num_streams) */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100443 struct azx_dev *azx_dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700444
445 /* PCM */
Takashi Iwai01b65bf2011-11-24 14:31:46 +0100446 struct list_head pcm_list; /* azx_pcm list */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700447
448 /* HD codec */
449 unsigned short codec_mask;
Takashi Iwaif1eaaee2009-02-13 08:16:55 +0100450 int codec_probe_mask; /* copied from probe_mask option */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700451 struct hda_bus *bus;
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +0100452 unsigned int beep_mode;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700453
454 /* CORB/RIRB */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100455 struct azx_rb corb;
456 struct azx_rb rirb;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700457
Takashi Iwai4ce107b2008-02-06 14:50:19 +0100458 /* CORB/RIRB and position buffers */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700459 struct snd_dma_buffer rb;
460 struct snd_dma_buffer posbuf;
Takashi Iwaic74db862005-05-12 14:26:27 +0200461
462 /* flags */
Shahin Ghazinouribeaffc32010-05-11 08:19:55 +0200463 int position_fix[2]; /* for both playback/capture streams */
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200464 int poll_count;
Takashi Iwaicb53c622007-08-10 17:21:45 +0200465 unsigned int running :1;
Pavel Machek927fc862006-08-31 17:03:43 +0200466 unsigned int initialized :1;
467 unsigned int single_cmd :1;
468 unsigned int polling_mode :1;
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200469 unsigned int msi :1;
Takashi Iwaia6a950a2008-06-10 17:53:35 +0200470 unsigned int irq_pending_warned :1;
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +0100471 unsigned int probing :1; /* codec probing phase */
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200472 unsigned int snoop:1;
Takashi Iwai52409aa2012-01-23 17:10:24 +0100473 unsigned int align_buffer_size:1;
Takashi Iwai43bbb6c2007-07-06 20:22:05 +0200474
475 /* for debugging */
Wu Fengguangfeb27342009-08-01 19:17:14 +0800476 unsigned int last_cmd[AZX_MAX_CODECS];
Takashi Iwai9ad593f2008-05-16 12:34:47 +0200477
478 /* for pending irqs */
479 struct work_struct irq_pending_work;
Takashi Iwai0cbf0092008-10-29 16:18:25 +0100480
481 /* reboot notifier (for mysterious hangup problem at power-down) */
482 struct notifier_block reboot_notifier;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700483};
484
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200485/* driver types */
486enum {
487 AZX_DRIVER_ICH,
Seth Heasley32679f92010-02-22 17:31:09 -0800488 AZX_DRIVER_PCH,
Tobin Davis4979bca2008-01-30 08:13:55 +0100489 AZX_DRIVER_SCH,
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200490 AZX_DRIVER_ATI,
Felix Kuehling778b6e12006-05-17 11:22:21 +0200491 AZX_DRIVER_ATIHDMI,
Andiry Xu1815b342011-12-14 16:10:27 +0800492 AZX_DRIVER_ATIHDMI_NS,
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200493 AZX_DRIVER_VIA,
494 AZX_DRIVER_SIS,
495 AZX_DRIVER_ULI,
Vinod Gda3fca22005-09-13 18:49:12 +0200496 AZX_DRIVER_NVIDIA,
Kailang Yangf2690022008-05-27 11:44:55 +0200497 AZX_DRIVER_TERA,
Takashi Iwai14d34f12010-10-21 09:03:25 +0200498 AZX_DRIVER_CTX,
Yang, Libinc4da29c2008-11-13 11:07:07 +0100499 AZX_DRIVER_GENERIC,
Takashi Iwai2f5983f2008-09-03 16:00:44 +0200500 AZX_NUM_DRIVERS, /* keep this as last entry */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200501};
502
Takashi Iwai9477c582011-05-25 09:11:37 +0200503/* driver quirks (capabilities) */
504/* bits 0-7 are used for indicating driver type */
505#define AZX_DCAPS_NO_TCSEL (1 << 8) /* No Intel TCSEL bit */
506#define AZX_DCAPS_NO_MSI (1 << 9) /* No MSI support */
507#define AZX_DCAPS_ATI_SNOOP (1 << 10) /* ATI snoop enable */
508#define AZX_DCAPS_NVIDIA_SNOOP (1 << 11) /* Nvidia snoop enable */
509#define AZX_DCAPS_SCH_SNOOP (1 << 12) /* SCH/PCH snoop enable */
510#define AZX_DCAPS_RIRB_DELAY (1 << 13) /* Long delay in read loop */
511#define AZX_DCAPS_RIRB_PRE_DELAY (1 << 14) /* Put a delay before read */
512#define AZX_DCAPS_CTX_WORKAROUND (1 << 15) /* X-Fi workaround */
513#define AZX_DCAPS_POSFIX_LPIB (1 << 16) /* Use LPIB as default */
514#define AZX_DCAPS_POSFIX_VIA (1 << 17) /* Use VIACOMBO as default */
515#define AZX_DCAPS_NO_64BIT (1 << 18) /* No 64bit address */
516#define AZX_DCAPS_SYNC_WRITE (1 << 19) /* sync each cmd write */
Takashi Iwai8b0bd222011-06-10 14:56:26 +0200517#define AZX_DCAPS_OLD_SSYNC (1 << 20) /* Old SSYNC reg for ICH */
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -0500518#define AZX_DCAPS_BUFSIZE (1 << 21) /* no buffer size alignment */
Takashi Iwai7bfe0592012-01-23 17:53:39 +0100519#define AZX_DCAPS_ALIGN_BUFSIZE (1 << 22) /* buffer size alignment */
Takashi Iwai9477c582011-05-25 09:11:37 +0200520
521/* quirks for ATI SB / AMD Hudson */
522#define AZX_DCAPS_PRESET_ATI_SB \
523 (AZX_DCAPS_ATI_SNOOP | AZX_DCAPS_NO_TCSEL | \
524 AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB)
525
526/* quirks for ATI/AMD HDMI */
527#define AZX_DCAPS_PRESET_ATI_HDMI \
528 (AZX_DCAPS_NO_TCSEL | AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB)
529
530/* quirks for Nvidia */
531#define AZX_DCAPS_PRESET_NVIDIA \
Takashi Iwai7bfe0592012-01-23 17:53:39 +0100532 (AZX_DCAPS_NVIDIA_SNOOP | AZX_DCAPS_RIRB_DELAY | AZX_DCAPS_NO_MSI |\
533 AZX_DCAPS_ALIGN_BUFSIZE)
Takashi Iwai9477c582011-05-25 09:11:37 +0200534
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200535static char *driver_short_names[] __devinitdata = {
536 [AZX_DRIVER_ICH] = "HDA Intel",
Seth Heasley32679f92010-02-22 17:31:09 -0800537 [AZX_DRIVER_PCH] = "HDA Intel PCH",
Tobin Davis4979bca2008-01-30 08:13:55 +0100538 [AZX_DRIVER_SCH] = "HDA Intel MID",
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200539 [AZX_DRIVER_ATI] = "HDA ATI SB",
Felix Kuehling778b6e12006-05-17 11:22:21 +0200540 [AZX_DRIVER_ATIHDMI] = "HDA ATI HDMI",
Andiry Xu1815b342011-12-14 16:10:27 +0800541 [AZX_DRIVER_ATIHDMI_NS] = "HDA ATI HDMI",
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200542 [AZX_DRIVER_VIA] = "HDA VIA VT82xx",
543 [AZX_DRIVER_SIS] = "HDA SIS966",
Vinod Gda3fca22005-09-13 18:49:12 +0200544 [AZX_DRIVER_ULI] = "HDA ULI M5461",
545 [AZX_DRIVER_NVIDIA] = "HDA NVidia",
Kailang Yangf2690022008-05-27 11:44:55 +0200546 [AZX_DRIVER_TERA] = "HDA Teradici",
Takashi Iwai14d34f12010-10-21 09:03:25 +0200547 [AZX_DRIVER_CTX] = "HDA Creative",
Yang, Libinc4da29c2008-11-13 11:07:07 +0100548 [AZX_DRIVER_GENERIC] = "HD-Audio Generic",
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200549};
550
Linus Torvalds1da177e2005-04-16 15:20:36 -0700551/*
552 * macros for easy use
553 */
554#define azx_writel(chip,reg,value) \
555 writel(value, (chip)->remap_addr + ICH6_REG_##reg)
556#define azx_readl(chip,reg) \
557 readl((chip)->remap_addr + ICH6_REG_##reg)
558#define azx_writew(chip,reg,value) \
559 writew(value, (chip)->remap_addr + ICH6_REG_##reg)
560#define azx_readw(chip,reg) \
561 readw((chip)->remap_addr + ICH6_REG_##reg)
562#define azx_writeb(chip,reg,value) \
563 writeb(value, (chip)->remap_addr + ICH6_REG_##reg)
564#define azx_readb(chip,reg) \
565 readb((chip)->remap_addr + ICH6_REG_##reg)
566
567#define azx_sd_writel(dev,reg,value) \
568 writel(value, (dev)->sd_addr + ICH6_REG_##reg)
569#define azx_sd_readl(dev,reg) \
570 readl((dev)->sd_addr + ICH6_REG_##reg)
571#define azx_sd_writew(dev,reg,value) \
572 writew(value, (dev)->sd_addr + ICH6_REG_##reg)
573#define azx_sd_readw(dev,reg) \
574 readw((dev)->sd_addr + ICH6_REG_##reg)
575#define azx_sd_writeb(dev,reg,value) \
576 writeb(value, (dev)->sd_addr + ICH6_REG_##reg)
577#define azx_sd_readb(dev,reg) \
578 readb((dev)->sd_addr + ICH6_REG_##reg)
579
580/* for pcm support */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100581#define get_azx_dev(substream) (substream->runtime->private_data)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700582
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200583#ifdef CONFIG_X86
584static void __mark_pages_wc(struct azx *chip, void *addr, size_t size, bool on)
585{
586 if (azx_snoop(chip))
587 return;
588 if (addr && size) {
589 int pages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
590 if (on)
591 set_memory_wc((unsigned long)addr, pages);
592 else
593 set_memory_wb((unsigned long)addr, pages);
594 }
595}
596
597static inline void mark_pages_wc(struct azx *chip, struct snd_dma_buffer *buf,
598 bool on)
599{
600 __mark_pages_wc(chip, buf->area, buf->bytes, on);
601}
602static inline void mark_runtime_wc(struct azx *chip, struct azx_dev *azx_dev,
603 struct snd_pcm_runtime *runtime, bool on)
604{
605 if (azx_dev->wc_marked != on) {
606 __mark_pages_wc(chip, runtime->dma_area, runtime->dma_bytes, on);
607 azx_dev->wc_marked = on;
608 }
609}
610#else
611/* NOP for other archs */
612static inline void mark_pages_wc(struct azx *chip, struct snd_dma_buffer *buf,
613 bool on)
614{
615}
616static inline void mark_runtime_wc(struct azx *chip, struct azx_dev *azx_dev,
617 struct snd_pcm_runtime *runtime, bool on)
618{
619}
620#endif
621
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200622static int azx_acquire_irq(struct azx *chip, int do_disconnect);
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200623static int azx_send_cmd(struct hda_bus *bus, unsigned int val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700624/*
625 * Interface for HD codec
626 */
627
Linus Torvalds1da177e2005-04-16 15:20:36 -0700628/*
629 * CORB / RIRB interface
630 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100631static int azx_alloc_cmd_io(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700632{
633 int err;
634
635 /* single page (at least 4096 bytes) must suffice for both ringbuffes */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200636 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
637 snd_dma_pci_data(chip->pci),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700638 PAGE_SIZE, &chip->rb);
639 if (err < 0) {
640 snd_printk(KERN_ERR SFX "cannot allocate CORB/RIRB\n");
641 return err;
642 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200643 mark_pages_wc(chip, &chip->rb, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700644 return 0;
645}
646
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100647static void azx_init_cmd_io(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700648{
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800649 spin_lock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700650 /* CORB set up */
651 chip->corb.addr = chip->rb.addr;
652 chip->corb.buf = (u32 *)chip->rb.area;
653 azx_writel(chip, CORBLBASE, (u32)chip->corb.addr);
Takashi Iwai766979e2008-06-13 20:53:56 +0200654 azx_writel(chip, CORBUBASE, upper_32_bits(chip->corb.addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700655
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200656 /* set the corb size to 256 entries (ULI requires explicitly) */
657 azx_writeb(chip, CORBSIZE, 0x02);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700658 /* set the corb write pointer to 0 */
659 azx_writew(chip, CORBWP, 0);
660 /* reset the corb hw read pointer */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200661 azx_writew(chip, CORBRP, ICH6_CORBRP_RST);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700662 /* enable corb dma */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200663 azx_writeb(chip, CORBCTL, ICH6_CORBCTL_RUN);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700664
665 /* RIRB set up */
666 chip->rirb.addr = chip->rb.addr + 2048;
667 chip->rirb.buf = (u32 *)(chip->rb.area + 2048);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800668 chip->rirb.wp = chip->rirb.rp = 0;
669 memset(chip->rirb.cmds, 0, sizeof(chip->rirb.cmds));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700670 azx_writel(chip, RIRBLBASE, (u32)chip->rirb.addr);
Takashi Iwai766979e2008-06-13 20:53:56 +0200671 azx_writel(chip, RIRBUBASE, upper_32_bits(chip->rirb.addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700672
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200673 /* set the rirb size to 256 entries (ULI requires explicitly) */
674 azx_writeb(chip, RIRBSIZE, 0x02);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700675 /* reset the rirb hw write pointer */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200676 azx_writew(chip, RIRBWP, ICH6_RIRBWP_RST);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700677 /* set N=1, get RIRB response interrupt for new entry */
Takashi Iwai9477c582011-05-25 09:11:37 +0200678 if (chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND)
Takashi Iwai14d34f12010-10-21 09:03:25 +0200679 azx_writew(chip, RINTCNT, 0xc0);
680 else
681 azx_writew(chip, RINTCNT, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700682 /* enable rirb dma and response irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700683 azx_writeb(chip, RIRBCTL, ICH6_RBCTL_DMA_EN | ICH6_RBCTL_IRQ_EN);
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800684 spin_unlock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700685}
686
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100687static void azx_free_cmd_io(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700688{
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800689 spin_lock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700690 /* disable ringbuffer DMAs */
691 azx_writeb(chip, RIRBCTL, 0);
692 azx_writeb(chip, CORBCTL, 0);
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800693 spin_unlock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700694}
695
Wu Fengguangdeadff12009-08-01 18:45:16 +0800696static unsigned int azx_command_addr(u32 cmd)
697{
698 unsigned int addr = cmd >> 28;
699
700 if (addr >= AZX_MAX_CODECS) {
701 snd_BUG();
702 addr = 0;
703 }
704
705 return addr;
706}
707
708static unsigned int azx_response_addr(u32 res)
709{
710 unsigned int addr = res & 0xf;
711
712 if (addr >= AZX_MAX_CODECS) {
713 snd_BUG();
714 addr = 0;
715 }
716
717 return addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700718}
719
720/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100721static int azx_corb_send_cmd(struct hda_bus *bus, u32 val)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700722{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100723 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800724 unsigned int addr = azx_command_addr(val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700725 unsigned int wp;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700726
Wu Fengguangc32649f2009-08-01 18:48:12 +0800727 spin_lock_irq(&chip->reg_lock);
728
Linus Torvalds1da177e2005-04-16 15:20:36 -0700729 /* add command to corb */
730 wp = azx_readb(chip, CORBWP);
731 wp++;
732 wp %= ICH6_MAX_CORB_ENTRIES;
733
Wu Fengguangdeadff12009-08-01 18:45:16 +0800734 chip->rirb.cmds[addr]++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700735 chip->corb.buf[wp] = cpu_to_le32(val);
736 azx_writel(chip, CORBWP, wp);
Wu Fengguangc32649f2009-08-01 18:48:12 +0800737
Linus Torvalds1da177e2005-04-16 15:20:36 -0700738 spin_unlock_irq(&chip->reg_lock);
739
740 return 0;
741}
742
743#define ICH6_RIRB_EX_UNSOL_EV (1<<4)
744
745/* retrieve RIRB entry - called from interrupt handler */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100746static void azx_update_rirb(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700747{
748 unsigned int rp, wp;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800749 unsigned int addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700750 u32 res, res_ex;
751
752 wp = azx_readb(chip, RIRBWP);
753 if (wp == chip->rirb.wp)
754 return;
755 chip->rirb.wp = wp;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800756
Linus Torvalds1da177e2005-04-16 15:20:36 -0700757 while (chip->rirb.rp != wp) {
758 chip->rirb.rp++;
759 chip->rirb.rp %= ICH6_MAX_RIRB_ENTRIES;
760
761 rp = chip->rirb.rp << 1; /* an RIRB entry is 8-bytes */
762 res_ex = le32_to_cpu(chip->rirb.buf[rp + 1]);
763 res = le32_to_cpu(chip->rirb.buf[rp]);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800764 addr = azx_response_addr(res_ex);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700765 if (res_ex & ICH6_RIRB_EX_UNSOL_EV)
766 snd_hda_queue_unsol_event(chip->bus, res, res_ex);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800767 else if (chip->rirb.cmds[addr]) {
768 chip->rirb.res[addr] = res;
Takashi Iwai2add9b92008-03-18 09:47:06 +0100769 smp_wmb();
Wu Fengguangdeadff12009-08-01 18:45:16 +0800770 chip->rirb.cmds[addr]--;
Wu Fengguange310bb02009-08-01 19:18:45 +0800771 } else
772 snd_printk(KERN_ERR SFX "spurious response %#x:%#x, "
773 "last cmd=%#08x\n",
774 res, res_ex,
775 chip->last_cmd[addr]);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700776 }
777}
778
779/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800780static unsigned int azx_rirb_get_response(struct hda_bus *bus,
781 unsigned int addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700782{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100783 struct azx *chip = bus->private_data;
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200784 unsigned long timeout;
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200785 int do_poll = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700786
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200787 again:
788 timeout = jiffies + msecs_to_jiffies(1000);
Takashi Iwai28a0d9d2008-01-18 15:32:32 +0100789 for (;;) {
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200790 if (chip->polling_mode || do_poll) {
Takashi Iwaie96224a2006-08-21 17:57:44 +0200791 spin_lock_irq(&chip->reg_lock);
792 azx_update_rirb(chip);
793 spin_unlock_irq(&chip->reg_lock);
794 }
Wu Fengguangdeadff12009-08-01 18:45:16 +0800795 if (!chip->rirb.cmds[addr]) {
Takashi Iwai2add9b92008-03-18 09:47:06 +0100796 smp_rmb();
Takashi Iwaib6132912009-03-24 07:36:09 +0100797 bus->rirb_error = 0;
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200798
799 if (!do_poll)
800 chip->poll_count = 0;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800801 return chip->rirb.res[addr]; /* the last value */
Takashi Iwai2add9b92008-03-18 09:47:06 +0100802 }
Takashi Iwai28a0d9d2008-01-18 15:32:32 +0100803 if (time_after(jiffies, timeout))
804 break;
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100805 if (bus->needs_damn_long_delay)
Takashi Iwai52987652008-01-16 16:09:47 +0100806 msleep(2); /* temporary workaround */
807 else {
808 udelay(10);
809 cond_resched();
810 }
Takashi Iwai28a0d9d2008-01-18 15:32:32 +0100811 }
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200812
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200813 if (!chip->polling_mode && chip->poll_count < 2) {
814 snd_printdd(SFX "azx_get_response timeout, "
815 "polling the codec once: last cmd=0x%08x\n",
816 chip->last_cmd[addr]);
817 do_poll = 1;
818 chip->poll_count++;
819 goto again;
820 }
821
822
Takashi Iwai23c4a882009-10-30 13:21:49 +0100823 if (!chip->polling_mode) {
824 snd_printk(KERN_WARNING SFX "azx_get_response timeout, "
825 "switching to polling mode: last cmd=0x%08x\n",
826 chip->last_cmd[addr]);
827 chip->polling_mode = 1;
828 goto again;
829 }
830
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200831 if (chip->msi) {
Takashi Iwai4abc1cc2009-05-19 12:16:46 +0200832 snd_printk(KERN_WARNING SFX "No response from codec, "
Wu Fengguangfeb27342009-08-01 19:17:14 +0800833 "disabling MSI: last cmd=0x%08x\n",
834 chip->last_cmd[addr]);
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200835 free_irq(chip->irq, chip);
836 chip->irq = -1;
837 pci_disable_msi(chip->pci);
838 chip->msi = 0;
Takashi Iwaib6132912009-03-24 07:36:09 +0100839 if (azx_acquire_irq(chip, 1) < 0) {
840 bus->rirb_error = 1;
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200841 return -1;
Takashi Iwaib6132912009-03-24 07:36:09 +0100842 }
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200843 goto again;
844 }
845
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +0100846 if (chip->probing) {
847 /* If this critical timeout happens during the codec probing
848 * phase, this is likely an access to a non-existing codec
849 * slot. Better to return an error and reset the system.
850 */
851 return -1;
852 }
853
Takashi Iwai8dd78332009-06-02 01:16:07 +0200854 /* a fatal communication error; need either to reset or to fallback
855 * to the single_cmd mode
856 */
Takashi Iwaib6132912009-03-24 07:36:09 +0100857 bus->rirb_error = 1;
Takashi Iwaib20f3b82009-06-02 01:20:22 +0200858 if (bus->allow_bus_reset && !bus->response_reset && !bus->in_reset) {
Takashi Iwai8dd78332009-06-02 01:16:07 +0200859 bus->response_reset = 1;
860 return -1; /* give a chance to retry */
861 }
862
863 snd_printk(KERN_ERR "hda_intel: azx_get_response timeout, "
864 "switching to single_cmd mode: last cmd=0x%08x\n",
Wu Fengguangfeb27342009-08-01 19:17:14 +0800865 chip->last_cmd[addr]);
Takashi Iwai8dd78332009-06-02 01:16:07 +0200866 chip->single_cmd = 1;
867 bus->response_reset = 0;
Takashi Iwai1a696972009-11-07 09:49:04 +0100868 /* release CORB/RIRB */
Takashi Iwai4fcd3922009-05-25 18:34:52 +0200869 azx_free_cmd_io(chip);
Takashi Iwai1a696972009-11-07 09:49:04 +0100870 /* disable unsolicited responses */
871 azx_writel(chip, GCTL, azx_readl(chip, GCTL) & ~ICH6_GCTL_UNSOL);
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200872 return -1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700873}
874
Linus Torvalds1da177e2005-04-16 15:20:36 -0700875/*
876 * Use the single immediate command instead of CORB/RIRB for simplicity
877 *
878 * Note: according to Intel, this is not preferred use. The command was
879 * intended for the BIOS only, and may get confused with unsolicited
880 * responses. So, we shouldn't use it for normal operation from the
881 * driver.
882 * I left the codes, however, for debugging/testing purposes.
883 */
884
Takashi Iwaib05a7d42009-05-28 11:59:12 +0200885/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800886static int azx_single_wait_for_response(struct azx *chip, unsigned int addr)
Takashi Iwaib05a7d42009-05-28 11:59:12 +0200887{
888 int timeout = 50;
889
890 while (timeout--) {
891 /* check IRV busy bit */
892 if (azx_readw(chip, IRS) & ICH6_IRS_VALID) {
893 /* reuse rirb.res as the response return value */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800894 chip->rirb.res[addr] = azx_readl(chip, IR);
Takashi Iwaib05a7d42009-05-28 11:59:12 +0200895 return 0;
896 }
897 udelay(1);
898 }
899 if (printk_ratelimit())
900 snd_printd(SFX "get_response timeout: IRS=0x%x\n",
901 azx_readw(chip, IRS));
Wu Fengguangdeadff12009-08-01 18:45:16 +0800902 chip->rirb.res[addr] = -1;
Takashi Iwaib05a7d42009-05-28 11:59:12 +0200903 return -EIO;
904}
905
Linus Torvalds1da177e2005-04-16 15:20:36 -0700906/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100907static int azx_single_send_cmd(struct hda_bus *bus, u32 val)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700908{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100909 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800910 unsigned int addr = azx_command_addr(val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700911 int timeout = 50;
912
Takashi Iwai8dd78332009-06-02 01:16:07 +0200913 bus->rirb_error = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700914 while (timeout--) {
915 /* check ICB busy bit */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200916 if (!((azx_readw(chip, IRS) & ICH6_IRS_BUSY))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700917 /* Clear IRV valid bit */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200918 azx_writew(chip, IRS, azx_readw(chip, IRS) |
919 ICH6_IRS_VALID);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700920 azx_writel(chip, IC, val);
Takashi Iwaid01ce992007-07-27 16:52:19 +0200921 azx_writew(chip, IRS, azx_readw(chip, IRS) |
922 ICH6_IRS_BUSY);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800923 return azx_single_wait_for_response(chip, addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700924 }
925 udelay(1);
926 }
Marc Boucher1cfd52b2008-01-22 15:29:26 +0100927 if (printk_ratelimit())
928 snd_printd(SFX "send_cmd timeout: IRS=0x%x, val=0x%x\n",
929 azx_readw(chip, IRS), val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700930 return -EIO;
931}
932
933/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800934static unsigned int azx_single_get_response(struct hda_bus *bus,
935 unsigned int addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700936{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100937 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800938 return chip->rirb.res[addr];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700939}
940
Takashi Iwai111d3af2006-02-16 18:17:58 +0100941/*
942 * The below are the main callbacks from hda_codec.
943 *
944 * They are just the skeleton to call sub-callbacks according to the
945 * current setting of chip->single_cmd.
946 */
947
948/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100949static int azx_send_cmd(struct hda_bus *bus, unsigned int val)
Takashi Iwai111d3af2006-02-16 18:17:58 +0100950{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100951 struct azx *chip = bus->private_data;
Takashi Iwai43bbb6c2007-07-06 20:22:05 +0200952
Wu Fengguangfeb27342009-08-01 19:17:14 +0800953 chip->last_cmd[azx_command_addr(val)] = val;
Takashi Iwai111d3af2006-02-16 18:17:58 +0100954 if (chip->single_cmd)
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100955 return azx_single_send_cmd(bus, val);
Takashi Iwai111d3af2006-02-16 18:17:58 +0100956 else
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100957 return azx_corb_send_cmd(bus, val);
Takashi Iwai111d3af2006-02-16 18:17:58 +0100958}
959
960/* get a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800961static unsigned int azx_get_response(struct hda_bus *bus,
962 unsigned int addr)
Takashi Iwai111d3af2006-02-16 18:17:58 +0100963{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100964 struct azx *chip = bus->private_data;
Takashi Iwai111d3af2006-02-16 18:17:58 +0100965 if (chip->single_cmd)
Wu Fengguangdeadff12009-08-01 18:45:16 +0800966 return azx_single_get_response(bus, addr);
Takashi Iwai111d3af2006-02-16 18:17:58 +0100967 else
Wu Fengguangdeadff12009-08-01 18:45:16 +0800968 return azx_rirb_get_response(bus, addr);
Takashi Iwai111d3af2006-02-16 18:17:58 +0100969}
970
Takashi Iwaicb53c622007-08-10 17:21:45 +0200971#ifdef CONFIG_SND_HDA_POWER_SAVE
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100972static void azx_power_notify(struct hda_bus *bus);
Takashi Iwaicb53c622007-08-10 17:21:45 +0200973#endif
Takashi Iwai111d3af2006-02-16 18:17:58 +0100974
Linus Torvalds1da177e2005-04-16 15:20:36 -0700975/* reset codec link */
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +0100976static int azx_reset(struct azx *chip, int full_reset)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700977{
978 int count;
979
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +0100980 if (!full_reset)
981 goto __skip;
982
Danny Tholene8a7f132007-09-11 21:41:56 +0200983 /* clear STATESTS */
984 azx_writeb(chip, STATESTS, STATESTS_INT_MASK);
985
Linus Torvalds1da177e2005-04-16 15:20:36 -0700986 /* reset controller */
987 azx_writel(chip, GCTL, azx_readl(chip, GCTL) & ~ICH6_GCTL_RESET);
988
989 count = 50;
990 while (azx_readb(chip, GCTL) && --count)
991 msleep(1);
992
993 /* delay for >= 100us for codec PLL to settle per spec
994 * Rev 0.9 section 5.5.1
995 */
996 msleep(1);
997
998 /* Bring controller out of reset */
999 azx_writeb(chip, GCTL, azx_readb(chip, GCTL) | ICH6_GCTL_RESET);
1000
1001 count = 50;
Pavel Machek927fc862006-08-31 17:03:43 +02001002 while (!azx_readb(chip, GCTL) && --count)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001003 msleep(1);
1004
Pavel Machek927fc862006-08-31 17:03:43 +02001005 /* Brent Chartrand said to wait >= 540us for codecs to initialize */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001006 msleep(1);
1007
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001008 __skip:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001009 /* check to see if controller is ready */
Pavel Machek927fc862006-08-31 17:03:43 +02001010 if (!azx_readb(chip, GCTL)) {
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001011 snd_printd(SFX "azx_reset: controller not ready!\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001012 return -EBUSY;
1013 }
1014
Matt41e2fce2005-07-04 17:49:55 +02001015 /* Accept unsolicited responses */
Takashi Iwai1a696972009-11-07 09:49:04 +01001016 if (!chip->single_cmd)
1017 azx_writel(chip, GCTL, azx_readl(chip, GCTL) |
1018 ICH6_GCTL_UNSOL);
Matt41e2fce2005-07-04 17:49:55 +02001019
Linus Torvalds1da177e2005-04-16 15:20:36 -07001020 /* detect codecs */
Pavel Machek927fc862006-08-31 17:03:43 +02001021 if (!chip->codec_mask) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001022 chip->codec_mask = azx_readw(chip, STATESTS);
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001023 snd_printdd(SFX "codec_mask = 0x%x\n", chip->codec_mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001024 }
1025
1026 return 0;
1027}
1028
1029
1030/*
1031 * Lowlevel interface
1032 */
1033
1034/* enable interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001035static void azx_int_enable(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001036{
1037 /* enable controller CIE and GIE */
1038 azx_writel(chip, INTCTL, azx_readl(chip, INTCTL) |
1039 ICH6_INT_CTRL_EN | ICH6_INT_GLOBAL_EN);
1040}
1041
1042/* disable interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001043static void azx_int_disable(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001044{
1045 int i;
1046
1047 /* disable interrupts in stream descriptor */
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001048 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001049 struct azx_dev *azx_dev = &chip->azx_dev[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001050 azx_sd_writeb(azx_dev, SD_CTL,
1051 azx_sd_readb(azx_dev, SD_CTL) & ~SD_INT_MASK);
1052 }
1053
1054 /* disable SIE for all streams */
1055 azx_writeb(chip, INTCTL, 0);
1056
1057 /* disable controller CIE and GIE */
1058 azx_writel(chip, INTCTL, azx_readl(chip, INTCTL) &
1059 ~(ICH6_INT_CTRL_EN | ICH6_INT_GLOBAL_EN));
1060}
1061
1062/* clear interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001063static void azx_int_clear(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001064{
1065 int i;
1066
1067 /* clear stream status */
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001068 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001069 struct azx_dev *azx_dev = &chip->azx_dev[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07001070 azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK);
1071 }
1072
1073 /* clear STATESTS */
1074 azx_writeb(chip, STATESTS, STATESTS_INT_MASK);
1075
1076 /* clear rirb status */
1077 azx_writeb(chip, RIRBSTS, RIRB_INT_MASK);
1078
1079 /* clear int status */
1080 azx_writel(chip, INTSTS, ICH6_INT_CTRL_EN | ICH6_INT_ALL_STREAM);
1081}
1082
1083/* start a stream */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001084static void azx_stream_start(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001085{
Joseph Chan0e153472008-08-26 14:38:03 +02001086 /*
1087 * Before stream start, initialize parameter
1088 */
1089 azx_dev->insufficient = 1;
1090
Linus Torvalds1da177e2005-04-16 15:20:36 -07001091 /* enable SIE */
Wei Niccc5df02010-01-26 15:59:33 +08001092 azx_writel(chip, INTCTL,
1093 azx_readl(chip, INTCTL) | (1 << azx_dev->index));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001094 /* set DMA start and interrupt mask */
1095 azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) |
1096 SD_CTL_DMA_START | SD_INT_MASK);
1097}
1098
Takashi Iwai1dddab42009-03-18 15:15:37 +01001099/* stop DMA */
1100static void azx_stream_clear(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001101{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001102 azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) &
1103 ~(SD_CTL_DMA_START | SD_INT_MASK));
1104 azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK); /* to be sure */
Takashi Iwai1dddab42009-03-18 15:15:37 +01001105}
1106
1107/* stop a stream */
1108static void azx_stream_stop(struct azx *chip, struct azx_dev *azx_dev)
1109{
1110 azx_stream_clear(chip, azx_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001111 /* disable SIE */
Wei Niccc5df02010-01-26 15:59:33 +08001112 azx_writel(chip, INTCTL,
1113 azx_readl(chip, INTCTL) & ~(1 << azx_dev->index));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001114}
1115
1116
1117/*
Takashi Iwaicb53c622007-08-10 17:21:45 +02001118 * reset and start the controller registers
Linus Torvalds1da177e2005-04-16 15:20:36 -07001119 */
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001120static void azx_init_chip(struct azx *chip, int full_reset)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001121{
Takashi Iwaicb53c622007-08-10 17:21:45 +02001122 if (chip->initialized)
1123 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001124
1125 /* reset controller */
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001126 azx_reset(chip, full_reset);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001127
1128 /* initialize interrupts */
1129 azx_int_clear(chip);
1130 azx_int_enable(chip);
1131
1132 /* initialize the codec command I/O */
Takashi Iwai1a696972009-11-07 09:49:04 +01001133 if (!chip->single_cmd)
1134 azx_init_cmd_io(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001135
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02001136 /* program the position buffer */
1137 azx_writel(chip, DPLBASE, (u32)chip->posbuf.addr);
Takashi Iwai766979e2008-06-13 20:53:56 +02001138 azx_writel(chip, DPUBASE, upper_32_bits(chip->posbuf.addr));
Frederick Lif5d40b32005-05-12 14:55:20 +02001139
Takashi Iwaicb53c622007-08-10 17:21:45 +02001140 chip->initialized = 1;
1141}
1142
1143/*
1144 * initialize the PCI registers
1145 */
1146/* update bits in a PCI register byte */
1147static void update_pci_byte(struct pci_dev *pci, unsigned int reg,
1148 unsigned char mask, unsigned char val)
1149{
1150 unsigned char data;
1151
1152 pci_read_config_byte(pci, reg, &data);
1153 data &= ~mask;
1154 data |= (val & mask);
1155 pci_write_config_byte(pci, reg, data);
1156}
1157
1158static void azx_init_pci(struct azx *chip)
1159{
1160 /* Clear bits 0-2 of PCI register TCSEL (at offset 0x44)
1161 * TCSEL == Traffic Class Select Register, which sets PCI express QOS
1162 * Ensuring these bits are 0 clears playback static on some HD Audio
Adam Lackorzynskia09e89f2011-03-10 17:41:56 +01001163 * codecs.
1164 * The PCI register TCSEL is defined in the Intel manuals.
Takashi Iwaicb53c622007-08-10 17:21:45 +02001165 */
Linus Torvalds46f2cc82011-05-27 19:45:28 -07001166 if (!(chip->driver_caps & AZX_DCAPS_NO_TCSEL)) {
Takashi Iwai9477c582011-05-25 09:11:37 +02001167 snd_printdd(SFX "Clearing TCSEL\n");
Adam Lackorzynskia09e89f2011-03-10 17:41:56 +01001168 update_pci_byte(chip->pci, ICH6_PCIREG_TCSEL, 0x07, 0);
Takashi Iwai9477c582011-05-25 09:11:37 +02001169 }
Takashi Iwaicb53c622007-08-10 17:21:45 +02001170
Takashi Iwai9477c582011-05-25 09:11:37 +02001171 /* For ATI SB450/600/700/800/900 and AMD Hudson azalia HD audio,
1172 * we need to enable snoop.
1173 */
1174 if (chip->driver_caps & AZX_DCAPS_ATI_SNOOP) {
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001175 snd_printdd(SFX "Setting ATI snoop: %d\n", azx_snoop(chip));
Takashi Iwaicb53c622007-08-10 17:21:45 +02001176 update_pci_byte(chip->pci,
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001177 ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR, 0x07,
1178 azx_snoop(chip) ? ATI_SB450_HDAUDIO_ENABLE_SNOOP : 0);
Takashi Iwai9477c582011-05-25 09:11:37 +02001179 }
1180
1181 /* For NVIDIA HDA, enable snoop */
1182 if (chip->driver_caps & AZX_DCAPS_NVIDIA_SNOOP) {
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001183 snd_printdd(SFX "Setting Nvidia snoop: %d\n", azx_snoop(chip));
Takashi Iwaicb53c622007-08-10 17:21:45 +02001184 update_pci_byte(chip->pci,
1185 NVIDIA_HDA_TRANSREG_ADDR,
1186 0x0f, NVIDIA_HDA_ENABLE_COHBITS);
Peer Chen320dcc32008-08-20 16:43:24 -07001187 update_pci_byte(chip->pci,
1188 NVIDIA_HDA_ISTRM_COH,
1189 0x01, NVIDIA_HDA_ENABLE_COHBIT);
1190 update_pci_byte(chip->pci,
1191 NVIDIA_HDA_OSTRM_COH,
1192 0x01, NVIDIA_HDA_ENABLE_COHBIT);
Takashi Iwai9477c582011-05-25 09:11:37 +02001193 }
1194
1195 /* Enable SCH/PCH snoop if needed */
1196 if (chip->driver_caps & AZX_DCAPS_SCH_SNOOP) {
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001197 unsigned short snoop;
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001198 pci_read_config_word(chip->pci, INTEL_SCH_HDA_DEVC, &snoop);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001199 if ((!azx_snoop(chip) && !(snoop & INTEL_SCH_HDA_DEVC_NOSNOOP)) ||
1200 (azx_snoop(chip) && (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP))) {
1201 snoop &= ~INTEL_SCH_HDA_DEVC_NOSNOOP;
1202 if (!azx_snoop(chip))
1203 snoop |= INTEL_SCH_HDA_DEVC_NOSNOOP;
1204 pci_write_config_word(chip->pci, INTEL_SCH_HDA_DEVC, snoop);
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001205 pci_read_config_word(chip->pci,
1206 INTEL_SCH_HDA_DEVC, &snoop);
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001207 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001208 snd_printdd(SFX "SCH snoop: %s\n",
1209 (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP)
1210 ? "Disabled" : "Enabled");
Vinod Gda3fca22005-09-13 18:49:12 +02001211 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001212}
1213
1214
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001215static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev);
1216
Linus Torvalds1da177e2005-04-16 15:20:36 -07001217/*
1218 * interrupt handler
1219 */
David Howells7d12e782006-10-05 14:55:46 +01001220static irqreturn_t azx_interrupt(int irq, void *dev_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001221{
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001222 struct azx *chip = dev_id;
1223 struct azx_dev *azx_dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001224 u32 status;
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001225 u8 sd_status;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001226 int i, ok;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001227
1228 spin_lock(&chip->reg_lock);
1229
1230 status = azx_readl(chip, INTSTS);
1231 if (status == 0) {
1232 spin_unlock(&chip->reg_lock);
1233 return IRQ_NONE;
1234 }
1235
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001236 for (i = 0; i < chip->num_streams; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001237 azx_dev = &chip->azx_dev[i];
1238 if (status & azx_dev->sd_int_sta_mask) {
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001239 sd_status = azx_sd_readb(azx_dev, SD_STS);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001240 azx_sd_writeb(azx_dev, SD_STS, SD_INT_MASK);
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001241 if (!azx_dev->substream || !azx_dev->running ||
1242 !(sd_status & SD_INT_COMPLETE))
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001243 continue;
1244 /* check whether this IRQ is really acceptable */
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001245 ok = azx_position_ok(chip, azx_dev);
1246 if (ok == 1) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001247 azx_dev->irq_pending = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001248 spin_unlock(&chip->reg_lock);
1249 snd_pcm_period_elapsed(azx_dev->substream);
1250 spin_lock(&chip->reg_lock);
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001251 } else if (ok == 0 && chip->bus && chip->bus->workq) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001252 /* bogus IRQ, process it later */
1253 azx_dev->irq_pending = 1;
Takashi Iwai6acaed32009-01-12 10:09:24 +01001254 queue_work(chip->bus->workq,
1255 &chip->irq_pending_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001256 }
1257 }
1258 }
1259
1260 /* clear rirb int */
1261 status = azx_readb(chip, RIRBSTS);
1262 if (status & RIRB_INT_MASK) {
Takashi Iwai14d34f12010-10-21 09:03:25 +02001263 if (status & RIRB_INT_RESPONSE) {
Takashi Iwai9477c582011-05-25 09:11:37 +02001264 if (chip->driver_caps & AZX_DCAPS_RIRB_PRE_DELAY)
Takashi Iwai14d34f12010-10-21 09:03:25 +02001265 udelay(80);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001266 azx_update_rirb(chip);
Takashi Iwai14d34f12010-10-21 09:03:25 +02001267 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001268 azx_writeb(chip, RIRBSTS, RIRB_INT_MASK);
1269 }
1270
1271#if 0
1272 /* clear state status int */
1273 if (azx_readb(chip, STATESTS) & 0x04)
1274 azx_writeb(chip, STATESTS, 0x04);
1275#endif
1276 spin_unlock(&chip->reg_lock);
1277
1278 return IRQ_HANDLED;
1279}
1280
1281
1282/*
Takashi Iwai675f25d2008-06-10 17:53:20 +02001283 * set up a BDL entry
1284 */
1285static int setup_bdle(struct snd_pcm_substream *substream,
1286 struct azx_dev *azx_dev, u32 **bdlp,
1287 int ofs, int size, int with_ioc)
1288{
Takashi Iwai675f25d2008-06-10 17:53:20 +02001289 u32 *bdl = *bdlp;
1290
1291 while (size > 0) {
1292 dma_addr_t addr;
1293 int chunk;
1294
1295 if (azx_dev->frags >= AZX_MAX_BDL_ENTRIES)
1296 return -EINVAL;
1297
Takashi Iwai77a23f22008-08-21 13:00:13 +02001298 addr = snd_pcm_sgbuf_get_addr(substream, ofs);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001299 /* program the address field of the BDL entry */
1300 bdl[0] = cpu_to_le32((u32)addr);
Takashi Iwai766979e2008-06-13 20:53:56 +02001301 bdl[1] = cpu_to_le32(upper_32_bits(addr));
Takashi Iwai675f25d2008-06-10 17:53:20 +02001302 /* program the size field of the BDL entry */
Takashi Iwaifc4abee2008-07-30 15:13:34 +02001303 chunk = snd_pcm_sgbuf_get_chunk_size(substream, ofs, size);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001304 bdl[2] = cpu_to_le32(chunk);
1305 /* program the IOC to enable interrupt
1306 * only when the whole fragment is processed
1307 */
1308 size -= chunk;
1309 bdl[3] = (size || !with_ioc) ? 0 : cpu_to_le32(0x01);
1310 bdl += 4;
1311 azx_dev->frags++;
1312 ofs += chunk;
1313 }
1314 *bdlp = bdl;
1315 return ofs;
1316}
1317
1318/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001319 * set up BDL entries
1320 */
Takashi Iwai555e2192008-06-10 17:53:34 +02001321static int azx_setup_periods(struct azx *chip,
1322 struct snd_pcm_substream *substream,
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001323 struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001324{
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001325 u32 *bdl;
1326 int i, ofs, periods, period_bytes;
Takashi Iwai555e2192008-06-10 17:53:34 +02001327 int pos_adj;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001328
1329 /* reset BDL address */
1330 azx_sd_writel(azx_dev, SD_BDLPL, 0);
1331 azx_sd_writel(azx_dev, SD_BDLPU, 0);
1332
Takashi Iwai97b71c92009-03-18 15:09:13 +01001333 period_bytes = azx_dev->period_bytes;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001334 periods = azx_dev->bufsize / period_bytes;
1335
Linus Torvalds1da177e2005-04-16 15:20:36 -07001336 /* program the initial BDL entries */
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001337 bdl = (u32 *)azx_dev->bdl.area;
1338 ofs = 0;
1339 azx_dev->frags = 0;
Takashi Iwai555e2192008-06-10 17:53:34 +02001340 pos_adj = bdl_pos_adj[chip->dev_index];
1341 if (pos_adj > 0) {
Takashi Iwai675f25d2008-06-10 17:53:20 +02001342 struct snd_pcm_runtime *runtime = substream->runtime;
Takashi Iwaie785d3d2008-07-15 16:28:43 +02001343 int pos_align = pos_adj;
Takashi Iwai555e2192008-06-10 17:53:34 +02001344 pos_adj = (pos_adj * runtime->rate + 47999) / 48000;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001345 if (!pos_adj)
Takashi Iwaie785d3d2008-07-15 16:28:43 +02001346 pos_adj = pos_align;
1347 else
1348 pos_adj = ((pos_adj + pos_align - 1) / pos_align) *
1349 pos_align;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001350 pos_adj = frames_to_bytes(runtime, pos_adj);
1351 if (pos_adj >= period_bytes) {
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001352 snd_printk(KERN_WARNING SFX "Too big adjustment %d\n",
Takashi Iwai555e2192008-06-10 17:53:34 +02001353 bdl_pos_adj[chip->dev_index]);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001354 pos_adj = 0;
1355 } else {
1356 ofs = setup_bdle(substream, azx_dev,
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001357 &bdl, ofs, pos_adj,
1358 !substream->runtime->no_period_wakeup);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001359 if (ofs < 0)
1360 goto error;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001361 }
Takashi Iwai555e2192008-06-10 17:53:34 +02001362 } else
1363 pos_adj = 0;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001364 for (i = 0; i < periods; i++) {
1365 if (i == periods - 1 && pos_adj)
1366 ofs = setup_bdle(substream, azx_dev, &bdl, ofs,
1367 period_bytes - pos_adj, 0);
1368 else
1369 ofs = setup_bdle(substream, azx_dev, &bdl, ofs,
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001370 period_bytes,
1371 !substream->runtime->no_period_wakeup);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001372 if (ofs < 0)
1373 goto error;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001374 }
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001375 return 0;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001376
1377 error:
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001378 snd_printk(KERN_ERR SFX "Too many BDL entries: buffer=%d, period=%d\n",
Takashi Iwai675f25d2008-06-10 17:53:20 +02001379 azx_dev->bufsize, period_bytes);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001380 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001381}
1382
Takashi Iwai1dddab42009-03-18 15:15:37 +01001383/* reset stream */
1384static void azx_stream_reset(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001385{
1386 unsigned char val;
1387 int timeout;
1388
Takashi Iwai1dddab42009-03-18 15:15:37 +01001389 azx_stream_clear(chip, azx_dev);
1390
Takashi Iwaid01ce992007-07-27 16:52:19 +02001391 azx_sd_writeb(azx_dev, SD_CTL, azx_sd_readb(azx_dev, SD_CTL) |
1392 SD_CTL_STREAM_RESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001393 udelay(3);
1394 timeout = 300;
1395 while (!((val = azx_sd_readb(azx_dev, SD_CTL)) & SD_CTL_STREAM_RESET) &&
1396 --timeout)
1397 ;
1398 val &= ~SD_CTL_STREAM_RESET;
1399 azx_sd_writeb(azx_dev, SD_CTL, val);
1400 udelay(3);
1401
1402 timeout = 300;
1403 /* waiting for hardware to report that the stream is out of reset */
1404 while (((val = azx_sd_readb(azx_dev, SD_CTL)) & SD_CTL_STREAM_RESET) &&
1405 --timeout)
1406 ;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001407
1408 /* reset first position - may not be synced with hw at this time */
1409 *azx_dev->posbuf = 0;
Takashi Iwai1dddab42009-03-18 15:15:37 +01001410}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001411
Takashi Iwai1dddab42009-03-18 15:15:37 +01001412/*
1413 * set up the SD for streaming
1414 */
1415static int azx_setup_controller(struct azx *chip, struct azx_dev *azx_dev)
1416{
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001417 unsigned int val;
Takashi Iwai1dddab42009-03-18 15:15:37 +01001418 /* make sure the run bit is zero for SD */
1419 azx_stream_clear(chip, azx_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001420 /* program the stream_tag */
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001421 val = azx_sd_readl(azx_dev, SD_CTL);
1422 val = (val & ~SD_CTL_STREAM_TAG_MASK) |
1423 (azx_dev->stream_tag << SD_CTL_STREAM_TAG_SHIFT);
1424 if (!azx_snoop(chip))
1425 val |= SD_CTL_TRAFFIC_PRIO;
1426 azx_sd_writel(azx_dev, SD_CTL, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001427
1428 /* program the length of samples in cyclic buffer */
1429 azx_sd_writel(azx_dev, SD_CBL, azx_dev->bufsize);
1430
1431 /* program the stream format */
1432 /* this value needs to be the same as the one programmed */
1433 azx_sd_writew(azx_dev, SD_FORMAT, azx_dev->format_val);
1434
1435 /* program the stream LVI (last valid index) of the BDL */
1436 azx_sd_writew(azx_dev, SD_LVI, azx_dev->frags - 1);
1437
1438 /* program the BDL address */
1439 /* lower BDL address */
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001440 azx_sd_writel(azx_dev, SD_BDLPL, (u32)azx_dev->bdl.addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001441 /* upper BDL address */
Takashi Iwai766979e2008-06-13 20:53:56 +02001442 azx_sd_writel(azx_dev, SD_BDLPU, upper_32_bits(azx_dev->bdl.addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001443
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02001444 /* enable the position buffer */
David Henningsson4cb36312010-09-30 10:12:50 +02001445 if (chip->position_fix[0] != POS_FIX_LPIB ||
1446 chip->position_fix[1] != POS_FIX_LPIB) {
Takashi Iwaiee9d6b92008-03-14 15:52:20 +01001447 if (!(azx_readl(chip, DPLBASE) & ICH6_DPLBASE_ENABLE))
1448 azx_writel(chip, DPLBASE,
1449 (u32)chip->posbuf.addr | ICH6_DPLBASE_ENABLE);
1450 }
Takashi Iwaic74db862005-05-12 14:26:27 +02001451
Linus Torvalds1da177e2005-04-16 15:20:36 -07001452 /* set the interrupt enable bits in the descriptor control register */
Takashi Iwaid01ce992007-07-27 16:52:19 +02001453 azx_sd_writel(azx_dev, SD_CTL,
1454 azx_sd_readl(azx_dev, SD_CTL) | SD_INT_MASK);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001455
1456 return 0;
1457}
1458
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001459/*
1460 * Probe the given codec address
1461 */
1462static int probe_codec(struct azx *chip, int addr)
1463{
1464 unsigned int cmd = (addr << 28) | (AC_NODE_ROOT << 20) |
1465 (AC_VERB_PARAMETERS << 8) | AC_PAR_VENDOR_ID;
1466 unsigned int res;
1467
Wu Fengguanga678cde2009-08-01 18:46:46 +08001468 mutex_lock(&chip->bus->cmd_mutex);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001469 chip->probing = 1;
1470 azx_send_cmd(chip->bus, cmd);
Wu Fengguangdeadff12009-08-01 18:45:16 +08001471 res = azx_get_response(chip->bus, addr);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001472 chip->probing = 0;
Wu Fengguanga678cde2009-08-01 18:46:46 +08001473 mutex_unlock(&chip->bus->cmd_mutex);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001474 if (res == -1)
1475 return -EIO;
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001476 snd_printdd(SFX "codec #%d probed OK\n", addr);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001477 return 0;
1478}
1479
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001480static int azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec,
1481 struct hda_pcm *cpcm);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001482static void azx_stop_chip(struct azx *chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001483
Takashi Iwai8dd78332009-06-02 01:16:07 +02001484static void azx_bus_reset(struct hda_bus *bus)
1485{
1486 struct azx *chip = bus->private_data;
Takashi Iwai8dd78332009-06-02 01:16:07 +02001487
1488 bus->in_reset = 1;
1489 azx_stop_chip(chip);
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001490 azx_init_chip(chip, 1);
Alexander Beregalov65f75982009-06-04 13:46:16 +04001491#ifdef CONFIG_PM
Takashi Iwai8dd78332009-06-02 01:16:07 +02001492 if (chip->initialized) {
Takashi Iwai01b65bf2011-11-24 14:31:46 +01001493 struct azx_pcm *p;
1494 list_for_each_entry(p, &chip->pcm_list, list)
1495 snd_pcm_suspend_all(p->pcm);
Takashi Iwai8dd78332009-06-02 01:16:07 +02001496 snd_hda_suspend(chip->bus);
1497 snd_hda_resume(chip->bus);
1498 }
Alexander Beregalov65f75982009-06-04 13:46:16 +04001499#endif
Takashi Iwai8dd78332009-06-02 01:16:07 +02001500 bus->in_reset = 0;
1501}
1502
Linus Torvalds1da177e2005-04-16 15:20:36 -07001503/*
1504 * Codec initialization
1505 */
1506
Takashi Iwai2f5983f2008-09-03 16:00:44 +02001507/* number of codec slots for each chipset: 0 = default slots (i.e. 4) */
1508static unsigned int azx_max_codecs[AZX_NUM_DRIVERS] __devinitdata = {
Wei Ni7445dfc2010-03-03 15:05:53 +08001509 [AZX_DRIVER_NVIDIA] = 8,
Kailang Yangf2690022008-05-27 11:44:55 +02001510 [AZX_DRIVER_TERA] = 1,
Takashi Iwaia9995a32007-03-12 21:30:46 +01001511};
1512
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001513static int __devinit azx_codec_create(struct azx *chip, const char *model)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001514{
1515 struct hda_bus_template bus_temp;
Takashi Iwai34c25352008-10-28 11:38:58 +01001516 int c, codecs, err;
1517 int max_slots;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001518
1519 memset(&bus_temp, 0, sizeof(bus_temp));
1520 bus_temp.private_data = chip;
1521 bus_temp.modelname = model;
1522 bus_temp.pci = chip->pci;
Takashi Iwai111d3af2006-02-16 18:17:58 +01001523 bus_temp.ops.command = azx_send_cmd;
1524 bus_temp.ops.get_response = azx_get_response;
Takashi Iwai176d5332008-07-30 15:01:44 +02001525 bus_temp.ops.attach_pcm = azx_attach_pcm_stream;
Takashi Iwai8dd78332009-06-02 01:16:07 +02001526 bus_temp.ops.bus_reset = azx_bus_reset;
Takashi Iwaicb53c622007-08-10 17:21:45 +02001527#ifdef CONFIG_SND_HDA_POWER_SAVE
Takashi Iwai11cd41b2008-11-28 07:22:18 +01001528 bus_temp.power_save = &power_save;
Takashi Iwaicb53c622007-08-10 17:21:45 +02001529 bus_temp.ops.pm_notify = azx_power_notify;
1530#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07001531
Takashi Iwaid01ce992007-07-27 16:52:19 +02001532 err = snd_hda_bus_new(chip->card, &bus_temp, &chip->bus);
1533 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001534 return err;
1535
Takashi Iwai9477c582011-05-25 09:11:37 +02001536 if (chip->driver_caps & AZX_DCAPS_RIRB_DELAY) {
1537 snd_printd(SFX "Enable delay in RIRB handling\n");
Wei Nidc9c8e22008-09-26 13:55:56 +08001538 chip->bus->needs_damn_long_delay = 1;
Takashi Iwai9477c582011-05-25 09:11:37 +02001539 }
Wei Nidc9c8e22008-09-26 13:55:56 +08001540
Takashi Iwai34c25352008-10-28 11:38:58 +01001541 codecs = 0;
Takashi Iwai2f5983f2008-09-03 16:00:44 +02001542 max_slots = azx_max_codecs[chip->driver_type];
1543 if (!max_slots)
Wei Ni7445dfc2010-03-03 15:05:53 +08001544 max_slots = AZX_DEFAULT_CODECS;
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001545
1546 /* First try to probe all given codec slots */
1547 for (c = 0; c < max_slots; c++) {
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01001548 if ((chip->codec_mask & (1 << c)) & chip->codec_probe_mask) {
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001549 if (probe_codec(chip, c) < 0) {
1550 /* Some BIOSen give you wrong codec addresses
1551 * that don't exist
1552 */
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001553 snd_printk(KERN_WARNING SFX
1554 "Codec #%d probe error; "
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001555 "disabling it...\n", c);
1556 chip->codec_mask &= ~(1 << c);
1557 /* More badly, accessing to a non-existing
1558 * codec often screws up the controller chip,
Paul Menzel24481582010-02-08 20:37:26 +01001559 * and disturbs the further communications.
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001560 * Thus if an error occurs during probing,
1561 * better to reset the controller chip to
1562 * get back to the sanity state.
1563 */
1564 azx_stop_chip(chip);
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001565 azx_init_chip(chip, 1);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001566 }
1567 }
1568 }
1569
Takashi Iwaid507cd62011-04-26 15:25:02 +02001570 /* AMD chipsets often cause the communication stalls upon certain
1571 * sequence like the pin-detection. It seems that forcing the synced
1572 * access works around the stall. Grrr...
1573 */
Takashi Iwai9477c582011-05-25 09:11:37 +02001574 if (chip->driver_caps & AZX_DCAPS_SYNC_WRITE) {
1575 snd_printd(SFX "Enable sync_write for stable communication\n");
Takashi Iwaid507cd62011-04-26 15:25:02 +02001576 chip->bus->sync_write = 1;
1577 chip->bus->allow_bus_reset = 1;
1578 }
1579
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001580 /* Then create codec instances */
Takashi Iwai34c25352008-10-28 11:38:58 +01001581 for (c = 0; c < max_slots; c++) {
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01001582 if ((chip->codec_mask & (1 << c)) & chip->codec_probe_mask) {
Takashi Iwaibccad142007-04-24 12:23:53 +02001583 struct hda_codec *codec;
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001584 err = snd_hda_codec_new(chip->bus, c, &codec);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001585 if (err < 0)
1586 continue;
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +01001587 codec->beep_mode = chip->beep_mode;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001588 codecs++;
Takashi Iwai19a982b2007-03-21 15:14:35 +01001589 }
1590 }
1591 if (!codecs) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001592 snd_printk(KERN_ERR SFX "no codecs initialized\n");
1593 return -ENXIO;
1594 }
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001595 return 0;
1596}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001597
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001598/* configure each codec instance */
1599static int __devinit azx_codec_configure(struct azx *chip)
1600{
1601 struct hda_codec *codec;
1602 list_for_each_entry(codec, &chip->bus->codec_list, list) {
1603 snd_hda_codec_configure(codec);
1604 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001605 return 0;
1606}
1607
1608
1609/*
1610 * PCM support
1611 */
1612
1613/* assign a stream for the PCM */
Wu Fengguangef18bed2009-12-25 13:14:27 +08001614static inline struct azx_dev *
1615azx_assign_device(struct azx *chip, struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001616{
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001617 int dev, i, nums;
Wu Fengguangef18bed2009-12-25 13:14:27 +08001618 struct azx_dev *res = NULL;
Takashi Iwaid5cf9912011-10-06 10:07:58 +02001619 /* make a non-zero unique key for the substream */
1620 int key = (substream->pcm->device << 16) | (substream->number << 2) |
1621 (substream->stream + 1);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001622
1623 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001624 dev = chip->playback_index_offset;
1625 nums = chip->playback_streams;
1626 } else {
1627 dev = chip->capture_index_offset;
1628 nums = chip->capture_streams;
1629 }
1630 for (i = 0; i < nums; i++, dev++)
Takashi Iwaid01ce992007-07-27 16:52:19 +02001631 if (!chip->azx_dev[dev].opened) {
Wu Fengguangef18bed2009-12-25 13:14:27 +08001632 res = &chip->azx_dev[dev];
Takashi Iwaid5cf9912011-10-06 10:07:58 +02001633 if (res->assigned_key == key)
Wu Fengguangef18bed2009-12-25 13:14:27 +08001634 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001635 }
Wu Fengguangef18bed2009-12-25 13:14:27 +08001636 if (res) {
1637 res->opened = 1;
Takashi Iwaid5cf9912011-10-06 10:07:58 +02001638 res->assigned_key = key;
Wu Fengguangef18bed2009-12-25 13:14:27 +08001639 }
1640 return res;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001641}
1642
1643/* release the assigned stream */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001644static inline void azx_release_device(struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001645{
1646 azx_dev->opened = 0;
1647}
1648
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001649static struct snd_pcm_hardware azx_pcm_hw = {
Takashi Iwaid01ce992007-07-27 16:52:19 +02001650 .info = (SNDRV_PCM_INFO_MMAP |
1651 SNDRV_PCM_INFO_INTERLEAVED |
Linus Torvalds1da177e2005-04-16 15:20:36 -07001652 SNDRV_PCM_INFO_BLOCK_TRANSFER |
1653 SNDRV_PCM_INFO_MMAP_VALID |
Pavel Machek927fc862006-08-31 17:03:43 +02001654 /* No full-resume yet implemented */
1655 /* SNDRV_PCM_INFO_RESUME |*/
Takashi Iwai850f0e52008-03-18 17:11:05 +01001656 SNDRV_PCM_INFO_PAUSE |
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001657 SNDRV_PCM_INFO_SYNC_START |
1658 SNDRV_PCM_INFO_NO_PERIOD_WAKEUP),
Linus Torvalds1da177e2005-04-16 15:20:36 -07001659 .formats = SNDRV_PCM_FMTBIT_S16_LE,
1660 .rates = SNDRV_PCM_RATE_48000,
1661 .rate_min = 48000,
1662 .rate_max = 48000,
1663 .channels_min = 2,
1664 .channels_max = 2,
1665 .buffer_bytes_max = AZX_MAX_BUF_SIZE,
1666 .period_bytes_min = 128,
1667 .period_bytes_max = AZX_MAX_BUF_SIZE / 2,
1668 .periods_min = 2,
1669 .periods_max = AZX_MAX_FRAG,
1670 .fifo_size = 0,
1671};
1672
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001673static int azx_pcm_open(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001674{
1675 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1676 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001677 struct azx *chip = apcm->chip;
1678 struct azx_dev *azx_dev;
1679 struct snd_pcm_runtime *runtime = substream->runtime;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001680 unsigned long flags;
1681 int err;
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001682 int buff_step;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001683
Ingo Molnar62932df2006-01-16 16:34:20 +01001684 mutex_lock(&chip->open_mutex);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001685 azx_dev = azx_assign_device(chip, substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001686 if (azx_dev == NULL) {
Ingo Molnar62932df2006-01-16 16:34:20 +01001687 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001688 return -EBUSY;
1689 }
1690 runtime->hw = azx_pcm_hw;
1691 runtime->hw.channels_min = hinfo->channels_min;
1692 runtime->hw.channels_max = hinfo->channels_max;
1693 runtime->hw.formats = hinfo->formats;
1694 runtime->hw.rates = hinfo->rates;
1695 snd_pcm_limit_hw_rates(runtime);
1696 snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
Takashi Iwai52409aa2012-01-23 17:10:24 +01001697 if (chip->align_buffer_size)
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001698 /* constrain buffer sizes to be multiple of 128
1699 bytes. This is more efficient in terms of memory
1700 access but isn't required by the HDA spec and
1701 prevents users from specifying exact period/buffer
1702 sizes. For example for 44.1kHz, a period size set
1703 to 20ms will be rounded to 19.59ms. */
1704 buff_step = 128;
1705 else
1706 /* Don't enforce steps on buffer sizes, still need to
1707 be multiple of 4 bytes (HDA spec). Tested on Intel
1708 HDA controllers, may not work on all devices where
1709 option needs to be disabled */
1710 buff_step = 4;
1711
Joachim Deguara5f1545b2007-03-16 15:01:36 +01001712 snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001713 buff_step);
Joachim Deguara5f1545b2007-03-16 15:01:36 +01001714 snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001715 buff_step);
Takashi Iwaicb53c622007-08-10 17:21:45 +02001716 snd_hda_power_up(apcm->codec);
Takashi Iwaid01ce992007-07-27 16:52:19 +02001717 err = hinfo->ops.open(hinfo, apcm->codec, substream);
1718 if (err < 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001719 azx_release_device(azx_dev);
Takashi Iwaicb53c622007-08-10 17:21:45 +02001720 snd_hda_power_down(apcm->codec);
Ingo Molnar62932df2006-01-16 16:34:20 +01001721 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001722 return err;
1723 }
Takashi Iwai70d321e2009-07-03 23:06:45 +02001724 snd_pcm_limit_hw_rates(runtime);
Takashi Iwaiaba66532009-07-05 11:44:46 +02001725 /* sanity check */
1726 if (snd_BUG_ON(!runtime->hw.channels_min) ||
1727 snd_BUG_ON(!runtime->hw.channels_max) ||
1728 snd_BUG_ON(!runtime->hw.formats) ||
1729 snd_BUG_ON(!runtime->hw.rates)) {
1730 azx_release_device(azx_dev);
1731 hinfo->ops.close(hinfo, apcm->codec, substream);
1732 snd_hda_power_down(apcm->codec);
1733 mutex_unlock(&chip->open_mutex);
1734 return -EINVAL;
1735 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001736 spin_lock_irqsave(&chip->reg_lock, flags);
1737 azx_dev->substream = substream;
1738 azx_dev->running = 0;
1739 spin_unlock_irqrestore(&chip->reg_lock, flags);
1740
1741 runtime->private_data = azx_dev;
Takashi Iwai850f0e52008-03-18 17:11:05 +01001742 snd_pcm_set_sync(substream);
Ingo Molnar62932df2006-01-16 16:34:20 +01001743 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001744 return 0;
1745}
1746
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001747static int azx_pcm_close(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001748{
1749 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1750 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001751 struct azx *chip = apcm->chip;
1752 struct azx_dev *azx_dev = get_azx_dev(substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001753 unsigned long flags;
1754
Ingo Molnar62932df2006-01-16 16:34:20 +01001755 mutex_lock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001756 spin_lock_irqsave(&chip->reg_lock, flags);
1757 azx_dev->substream = NULL;
1758 azx_dev->running = 0;
1759 spin_unlock_irqrestore(&chip->reg_lock, flags);
1760 azx_release_device(azx_dev);
1761 hinfo->ops.close(hinfo, apcm->codec, substream);
Takashi Iwaicb53c622007-08-10 17:21:45 +02001762 snd_hda_power_down(apcm->codec);
Ingo Molnar62932df2006-01-16 16:34:20 +01001763 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001764 return 0;
1765}
1766
Takashi Iwaid01ce992007-07-27 16:52:19 +02001767static int azx_pcm_hw_params(struct snd_pcm_substream *substream,
1768 struct snd_pcm_hw_params *hw_params)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001769{
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001770 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1771 struct azx *chip = apcm->chip;
1772 struct snd_pcm_runtime *runtime = substream->runtime;
Takashi Iwai97b71c92009-03-18 15:09:13 +01001773 struct azx_dev *azx_dev = get_azx_dev(substream);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001774 int ret;
Takashi Iwai97b71c92009-03-18 15:09:13 +01001775
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001776 mark_runtime_wc(chip, azx_dev, runtime, false);
Takashi Iwai97b71c92009-03-18 15:09:13 +01001777 azx_dev->bufsize = 0;
1778 azx_dev->period_bytes = 0;
1779 azx_dev->format_val = 0;
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001780 ret = snd_pcm_lib_malloc_pages(substream,
Takashi Iwaid01ce992007-07-27 16:52:19 +02001781 params_buffer_bytes(hw_params));
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001782 if (ret < 0)
1783 return ret;
1784 mark_runtime_wc(chip, azx_dev, runtime, true);
1785 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001786}
1787
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001788static int azx_pcm_hw_free(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001789{
1790 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001791 struct azx_dev *azx_dev = get_azx_dev(substream);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001792 struct azx *chip = apcm->chip;
1793 struct snd_pcm_runtime *runtime = substream->runtime;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001794 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
1795
1796 /* reset BDL address */
1797 azx_sd_writel(azx_dev, SD_BDLPL, 0);
1798 azx_sd_writel(azx_dev, SD_BDLPU, 0);
1799 azx_sd_writel(azx_dev, SD_CTL, 0);
Takashi Iwai97b71c92009-03-18 15:09:13 +01001800 azx_dev->bufsize = 0;
1801 azx_dev->period_bytes = 0;
1802 azx_dev->format_val = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001803
Takashi Iwaieb541332010-08-06 13:48:11 +02001804 snd_hda_codec_cleanup(apcm->codec, hinfo, substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001805
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001806 mark_runtime_wc(chip, azx_dev, runtime, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001807 return snd_pcm_lib_free_pages(substream);
1808}
1809
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001810static int azx_pcm_prepare(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001811{
1812 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001813 struct azx *chip = apcm->chip;
1814 struct azx_dev *azx_dev = get_azx_dev(substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001815 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001816 struct snd_pcm_runtime *runtime = substream->runtime;
Takashi Iwai62b7e5e2010-10-22 17:15:47 +02001817 unsigned int bufsize, period_bytes, format_val, stream_tag;
Takashi Iwai97b71c92009-03-18 15:09:13 +01001818 int err;
Stephen Warren7c9359762011-06-01 11:14:17 -06001819 struct hda_spdif_out *spdif =
1820 snd_hda_spdif_out_of_nid(apcm->codec, hinfo->nid);
1821 unsigned short ctls = spdif ? spdif->ctls : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001822
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001823 azx_stream_reset(chip, azx_dev);
Takashi Iwai97b71c92009-03-18 15:09:13 +01001824 format_val = snd_hda_calc_stream_format(runtime->rate,
1825 runtime->channels,
1826 runtime->format,
Anssi Hannula32c168c2010-08-03 13:28:57 +03001827 hinfo->maxbps,
Stephen Warren7c9359762011-06-01 11:14:17 -06001828 ctls);
Takashi Iwai97b71c92009-03-18 15:09:13 +01001829 if (!format_val) {
Takashi Iwaid01ce992007-07-27 16:52:19 +02001830 snd_printk(KERN_ERR SFX
1831 "invalid format_val, rate=%d, ch=%d, format=%d\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001832 runtime->rate, runtime->channels, runtime->format);
1833 return -EINVAL;
1834 }
1835
Takashi Iwai97b71c92009-03-18 15:09:13 +01001836 bufsize = snd_pcm_lib_buffer_bytes(substream);
1837 period_bytes = snd_pcm_lib_period_bytes(substream);
1838
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02001839 snd_printdd(SFX "azx_pcm_prepare: bufsize=0x%x, format=0x%x\n",
Takashi Iwai97b71c92009-03-18 15:09:13 +01001840 bufsize, format_val);
1841
1842 if (bufsize != azx_dev->bufsize ||
1843 period_bytes != azx_dev->period_bytes ||
1844 format_val != azx_dev->format_val) {
1845 azx_dev->bufsize = bufsize;
1846 azx_dev->period_bytes = period_bytes;
1847 azx_dev->format_val = format_val;
1848 err = azx_setup_periods(chip, substream, azx_dev);
1849 if (err < 0)
1850 return err;
1851 }
1852
Jaroslav Kyselae5463722010-05-11 10:21:46 +02001853 /* wallclk has 24Mhz clock source */
1854 azx_dev->period_wallclk = (((runtime->period_size * 24000) /
1855 runtime->rate) * 1000);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001856 azx_setup_controller(chip, azx_dev);
1857 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
1858 azx_dev->fifo_size = azx_sd_readw(azx_dev, SD_FIFOSIZE) + 1;
1859 else
1860 azx_dev->fifo_size = 0;
1861
Takashi Iwai62b7e5e2010-10-22 17:15:47 +02001862 stream_tag = azx_dev->stream_tag;
1863 /* CA-IBG chips need the playback stream starting from 1 */
Takashi Iwai9477c582011-05-25 09:11:37 +02001864 if ((chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND) &&
Takashi Iwai62b7e5e2010-10-22 17:15:47 +02001865 stream_tag > chip->capture_streams)
1866 stream_tag -= chip->capture_streams;
1867 return snd_hda_codec_prepare(apcm->codec, hinfo, stream_tag,
Takashi Iwaieb541332010-08-06 13:48:11 +02001868 azx_dev->format_val, substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001869}
1870
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001871static int azx_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001872{
1873 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001874 struct azx *chip = apcm->chip;
Takashi Iwai850f0e52008-03-18 17:11:05 +01001875 struct azx_dev *azx_dev;
1876 struct snd_pcm_substream *s;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001877 int rstart = 0, start, nsync = 0, sbits = 0;
Takashi Iwai850f0e52008-03-18 17:11:05 +01001878 int nwait, timeout;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001879
Linus Torvalds1da177e2005-04-16 15:20:36 -07001880 switch (cmd) {
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001881 case SNDRV_PCM_TRIGGER_START:
1882 rstart = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001883 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
1884 case SNDRV_PCM_TRIGGER_RESUME:
Takashi Iwai850f0e52008-03-18 17:11:05 +01001885 start = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001886 break;
1887 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
Jaroslav Kysela47123192005-08-15 20:53:07 +02001888 case SNDRV_PCM_TRIGGER_SUSPEND:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001889 case SNDRV_PCM_TRIGGER_STOP:
Takashi Iwai850f0e52008-03-18 17:11:05 +01001890 start = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001891 break;
1892 default:
Takashi Iwai850f0e52008-03-18 17:11:05 +01001893 return -EINVAL;
1894 }
1895
1896 snd_pcm_group_for_each_entry(s, substream) {
1897 if (s->pcm->card != substream->pcm->card)
1898 continue;
1899 azx_dev = get_azx_dev(s);
1900 sbits |= 1 << azx_dev->index;
1901 nsync++;
1902 snd_pcm_trigger_done(s, substream);
1903 }
1904
1905 spin_lock(&chip->reg_lock);
1906 if (nsync > 1) {
1907 /* first, set SYNC bits of corresponding streams */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02001908 if (chip->driver_caps & AZX_DCAPS_OLD_SSYNC)
1909 azx_writel(chip, OLD_SSYNC,
1910 azx_readl(chip, OLD_SSYNC) | sbits);
1911 else
1912 azx_writel(chip, SSYNC, azx_readl(chip, SSYNC) | sbits);
Takashi Iwai850f0e52008-03-18 17:11:05 +01001913 }
1914 snd_pcm_group_for_each_entry(s, substream) {
1915 if (s->pcm->card != substream->pcm->card)
1916 continue;
1917 azx_dev = get_azx_dev(s);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02001918 if (start) {
1919 azx_dev->start_wallclk = azx_readl(chip, WALLCLK);
1920 if (!rstart)
1921 azx_dev->start_wallclk -=
1922 azx_dev->period_wallclk;
Takashi Iwai850f0e52008-03-18 17:11:05 +01001923 azx_stream_start(chip, azx_dev);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02001924 } else {
Takashi Iwai850f0e52008-03-18 17:11:05 +01001925 azx_stream_stop(chip, azx_dev);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02001926 }
Takashi Iwai850f0e52008-03-18 17:11:05 +01001927 azx_dev->running = start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001928 }
1929 spin_unlock(&chip->reg_lock);
Takashi Iwai850f0e52008-03-18 17:11:05 +01001930 if (start) {
1931 if (nsync == 1)
1932 return 0;
1933 /* wait until all FIFOs get ready */
1934 for (timeout = 5000; timeout; timeout--) {
1935 nwait = 0;
1936 snd_pcm_group_for_each_entry(s, substream) {
1937 if (s->pcm->card != substream->pcm->card)
1938 continue;
1939 azx_dev = get_azx_dev(s);
1940 if (!(azx_sd_readb(azx_dev, SD_STS) &
1941 SD_STS_FIFO_READY))
1942 nwait++;
1943 }
1944 if (!nwait)
1945 break;
1946 cpu_relax();
1947 }
1948 } else {
1949 /* wait until all RUN bits are cleared */
1950 for (timeout = 5000; timeout; timeout--) {
1951 nwait = 0;
1952 snd_pcm_group_for_each_entry(s, substream) {
1953 if (s->pcm->card != substream->pcm->card)
1954 continue;
1955 azx_dev = get_azx_dev(s);
1956 if (azx_sd_readb(azx_dev, SD_CTL) &
1957 SD_CTL_DMA_START)
1958 nwait++;
1959 }
1960 if (!nwait)
1961 break;
1962 cpu_relax();
1963 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001964 }
Takashi Iwai850f0e52008-03-18 17:11:05 +01001965 if (nsync > 1) {
1966 spin_lock(&chip->reg_lock);
1967 /* reset SYNC bits */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02001968 if (chip->driver_caps & AZX_DCAPS_OLD_SSYNC)
1969 azx_writel(chip, OLD_SSYNC,
1970 azx_readl(chip, OLD_SSYNC) & ~sbits);
1971 else
1972 azx_writel(chip, SSYNC, azx_readl(chip, SSYNC) & ~sbits);
Takashi Iwai850f0e52008-03-18 17:11:05 +01001973 spin_unlock(&chip->reg_lock);
1974 }
1975 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001976}
1977
Joseph Chan0e153472008-08-26 14:38:03 +02001978/* get the current DMA position with correction on VIA chips */
1979static unsigned int azx_via_get_position(struct azx *chip,
1980 struct azx_dev *azx_dev)
1981{
1982 unsigned int link_pos, mini_pos, bound_pos;
1983 unsigned int mod_link_pos, mod_dma_pos, mod_mini_pos;
1984 unsigned int fifo_size;
1985
1986 link_pos = azx_sd_readl(azx_dev, SD_LPIB);
Takashi Iwaib4a655e2011-06-07 12:26:56 +02001987 if (azx_dev->substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
Joseph Chan0e153472008-08-26 14:38:03 +02001988 /* Playback, no problem using link position */
1989 return link_pos;
1990 }
1991
1992 /* Capture */
1993 /* For new chipset,
1994 * use mod to get the DMA position just like old chipset
1995 */
1996 mod_dma_pos = le32_to_cpu(*azx_dev->posbuf);
1997 mod_dma_pos %= azx_dev->period_bytes;
1998
1999 /* azx_dev->fifo_size can't get FIFO size of in stream.
2000 * Get from base address + offset.
2001 */
2002 fifo_size = readw(chip->remap_addr + VIA_IN_STREAM0_FIFO_SIZE_OFFSET);
2003
2004 if (azx_dev->insufficient) {
2005 /* Link position never gather than FIFO size */
2006 if (link_pos <= fifo_size)
2007 return 0;
2008
2009 azx_dev->insufficient = 0;
2010 }
2011
2012 if (link_pos <= fifo_size)
2013 mini_pos = azx_dev->bufsize + link_pos - fifo_size;
2014 else
2015 mini_pos = link_pos - fifo_size;
2016
2017 /* Find nearest previous boudary */
2018 mod_mini_pos = mini_pos % azx_dev->period_bytes;
2019 mod_link_pos = link_pos % azx_dev->period_bytes;
2020 if (mod_link_pos >= fifo_size)
2021 bound_pos = link_pos - mod_link_pos;
2022 else if (mod_dma_pos >= mod_mini_pos)
2023 bound_pos = mini_pos - mod_mini_pos;
2024 else {
2025 bound_pos = mini_pos - mod_mini_pos + azx_dev->period_bytes;
2026 if (bound_pos >= azx_dev->bufsize)
2027 bound_pos = 0;
2028 }
2029
2030 /* Calculate real DMA position we want */
2031 return bound_pos + mod_dma_pos;
2032}
2033
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002034static unsigned int azx_get_position(struct azx *chip,
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002035 struct azx_dev *azx_dev,
2036 bool with_check)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002037{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002038 unsigned int pos;
David Henningsson4cb36312010-09-30 10:12:50 +02002039 int stream = azx_dev->substream->stream;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002040
David Henningsson4cb36312010-09-30 10:12:50 +02002041 switch (chip->position_fix[stream]) {
2042 case POS_FIX_LPIB:
2043 /* read LPIB */
2044 pos = azx_sd_readl(azx_dev, SD_LPIB);
2045 break;
2046 case POS_FIX_VIACOMBO:
Joseph Chan0e153472008-08-26 14:38:03 +02002047 pos = azx_via_get_position(chip, azx_dev);
David Henningsson4cb36312010-09-30 10:12:50 +02002048 break;
2049 default:
2050 /* use the position buffer */
2051 pos = le32_to_cpu(*azx_dev->posbuf);
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002052 if (with_check && chip->position_fix[stream] == POS_FIX_AUTO) {
Takashi Iwaia8103642011-06-07 12:23:23 +02002053 if (!pos || pos == (u32)-1) {
2054 printk(KERN_WARNING
2055 "hda-intel: Invalid position buffer, "
2056 "using LPIB read method instead.\n");
2057 chip->position_fix[stream] = POS_FIX_LPIB;
2058 pos = azx_sd_readl(azx_dev, SD_LPIB);
2059 } else
2060 chip->position_fix[stream] = POS_FIX_POSBUF;
2061 }
2062 break;
Takashi Iwaic74db862005-05-12 14:26:27 +02002063 }
David Henningsson4cb36312010-09-30 10:12:50 +02002064
Linus Torvalds1da177e2005-04-16 15:20:36 -07002065 if (pos >= azx_dev->bufsize)
2066 pos = 0;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002067 return pos;
2068}
2069
2070static snd_pcm_uframes_t azx_pcm_pointer(struct snd_pcm_substream *substream)
2071{
2072 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2073 struct azx *chip = apcm->chip;
2074 struct azx_dev *azx_dev = get_azx_dev(substream);
2075 return bytes_to_frames(substream->runtime,
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002076 azx_get_position(chip, azx_dev, false));
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002077}
2078
2079/*
2080 * Check whether the current DMA position is acceptable for updating
2081 * periods. Returns non-zero if it's OK.
2082 *
2083 * Many HD-audio controllers appear pretty inaccurate about
2084 * the update-IRQ timing. The IRQ is issued before actually the
2085 * data is processed. So, we need to process it afterwords in a
2086 * workqueue.
2087 */
2088static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev)
2089{
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002090 u32 wallclk;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002091 unsigned int pos;
Shahin Ghazinouribeaffc32010-05-11 08:19:55 +02002092 int stream;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002093
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002094 wallclk = azx_readl(chip, WALLCLK) - azx_dev->start_wallclk;
2095 if (wallclk < (azx_dev->period_wallclk * 2) / 3)
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002096 return -1; /* bogus (too early) interrupt */
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002097
Shahin Ghazinouribeaffc32010-05-11 08:19:55 +02002098 stream = azx_dev->substream->stream;
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002099 pos = azx_get_position(chip, azx_dev, true);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002100
Takashi Iwaid6d8bf52010-02-12 18:17:06 +01002101 if (WARN_ONCE(!azx_dev->period_bytes,
2102 "hda-intel: zero azx_dev->period_bytes"))
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002103 return -1; /* this shouldn't happen! */
Jaroslav Kyselaedb39932010-06-02 13:29:17 +02002104 if (wallclk < (azx_dev->period_wallclk * 5) / 4 &&
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002105 pos % azx_dev->period_bytes > azx_dev->period_bytes / 2)
2106 /* NG - it's below the first next period boundary */
2107 return bdl_pos_adj[chip->dev_index] ? 0 : -1;
Jaroslav Kyselaedb39932010-06-02 13:29:17 +02002108 azx_dev->start_wallclk += wallclk;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002109 return 1; /* OK, it's fine */
2110}
2111
2112/*
2113 * The work for pending PCM period updates.
2114 */
2115static void azx_irq_pending_work(struct work_struct *work)
2116{
2117 struct azx *chip = container_of(work, struct azx, irq_pending_work);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002118 int i, pending, ok;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002119
Takashi Iwaia6a950a2008-06-10 17:53:35 +02002120 if (!chip->irq_pending_warned) {
2121 printk(KERN_WARNING
2122 "hda-intel: IRQ timing workaround is activated "
2123 "for card #%d. Suggest a bigger bdl_pos_adj.\n",
2124 chip->card->number);
2125 chip->irq_pending_warned = 1;
2126 }
2127
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002128 for (;;) {
2129 pending = 0;
2130 spin_lock_irq(&chip->reg_lock);
2131 for (i = 0; i < chip->num_streams; i++) {
2132 struct azx_dev *azx_dev = &chip->azx_dev[i];
2133 if (!azx_dev->irq_pending ||
2134 !azx_dev->substream ||
2135 !azx_dev->running)
2136 continue;
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002137 ok = azx_position_ok(chip, azx_dev);
2138 if (ok > 0) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002139 azx_dev->irq_pending = 0;
2140 spin_unlock(&chip->reg_lock);
2141 snd_pcm_period_elapsed(azx_dev->substream);
2142 spin_lock(&chip->reg_lock);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002143 } else if (ok < 0) {
2144 pending = 0; /* too early */
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002145 } else
2146 pending++;
2147 }
2148 spin_unlock_irq(&chip->reg_lock);
2149 if (!pending)
2150 return;
Takashi Iwai08af4952010-08-03 14:39:04 +02002151 msleep(1);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002152 }
2153}
2154
2155/* clear irq_pending flags and assure no on-going workq */
2156static void azx_clear_irq_pending(struct azx *chip)
2157{
2158 int i;
2159
2160 spin_lock_irq(&chip->reg_lock);
2161 for (i = 0; i < chip->num_streams; i++)
2162 chip->azx_dev[i].irq_pending = 0;
2163 spin_unlock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002164}
2165
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002166#ifdef CONFIG_X86
2167static int azx_pcm_mmap(struct snd_pcm_substream *substream,
2168 struct vm_area_struct *area)
2169{
2170 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2171 struct azx *chip = apcm->chip;
2172 if (!azx_snoop(chip))
2173 area->vm_page_prot = pgprot_writecombine(area->vm_page_prot);
2174 return snd_pcm_lib_default_mmap(substream, area);
2175}
2176#else
2177#define azx_pcm_mmap NULL
2178#endif
2179
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002180static struct snd_pcm_ops azx_pcm_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002181 .open = azx_pcm_open,
2182 .close = azx_pcm_close,
2183 .ioctl = snd_pcm_lib_ioctl,
2184 .hw_params = azx_pcm_hw_params,
2185 .hw_free = azx_pcm_hw_free,
2186 .prepare = azx_pcm_prepare,
2187 .trigger = azx_pcm_trigger,
2188 .pointer = azx_pcm_pointer,
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002189 .mmap = azx_pcm_mmap,
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002190 .page = snd_pcm_sgbuf_ops_page,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002191};
2192
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002193static void azx_pcm_free(struct snd_pcm *pcm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002194{
Takashi Iwai176d5332008-07-30 15:01:44 +02002195 struct azx_pcm *apcm = pcm->private_data;
2196 if (apcm) {
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002197 list_del(&apcm->list);
Takashi Iwai176d5332008-07-30 15:01:44 +02002198 kfree(apcm);
2199 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002200}
2201
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002202#define MAX_PREALLOC_SIZE (32 * 1024 * 1024)
2203
Takashi Iwai176d5332008-07-30 15:01:44 +02002204static int
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002205azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec,
2206 struct hda_pcm *cpcm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002207{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002208 struct azx *chip = bus->private_data;
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002209 struct snd_pcm *pcm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002210 struct azx_pcm *apcm;
Takashi Iwai176d5332008-07-30 15:01:44 +02002211 int pcm_dev = cpcm->device;
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002212 unsigned int size;
Takashi Iwai176d5332008-07-30 15:01:44 +02002213 int s, err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002214
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002215 list_for_each_entry(apcm, &chip->pcm_list, list) {
2216 if (apcm->pcm->device == pcm_dev) {
2217 snd_printk(KERN_ERR SFX "PCM %d already exists\n", pcm_dev);
2218 return -EBUSY;
2219 }
Takashi Iwai176d5332008-07-30 15:01:44 +02002220 }
2221 err = snd_pcm_new(chip->card, cpcm->name, pcm_dev,
2222 cpcm->stream[SNDRV_PCM_STREAM_PLAYBACK].substreams,
2223 cpcm->stream[SNDRV_PCM_STREAM_CAPTURE].substreams,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002224 &pcm);
2225 if (err < 0)
2226 return err;
Takashi Iwai18cb7102009-04-16 10:22:24 +02002227 strlcpy(pcm->name, cpcm->name, sizeof(pcm->name));
Takashi Iwai176d5332008-07-30 15:01:44 +02002228 apcm = kzalloc(sizeof(*apcm), GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002229 if (apcm == NULL)
2230 return -ENOMEM;
2231 apcm->chip = chip;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002232 apcm->pcm = pcm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002233 apcm->codec = codec;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002234 pcm->private_data = apcm;
2235 pcm->private_free = azx_pcm_free;
Takashi Iwai176d5332008-07-30 15:01:44 +02002236 if (cpcm->pcm_type == HDA_PCM_TYPE_MODEM)
2237 pcm->dev_class = SNDRV_PCM_CLASS_MODEM;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002238 list_add_tail(&apcm->list, &chip->pcm_list);
Takashi Iwai176d5332008-07-30 15:01:44 +02002239 cpcm->pcm = pcm;
2240 for (s = 0; s < 2; s++) {
2241 apcm->hinfo[s] = &cpcm->stream[s];
2242 if (cpcm->stream[s].substreams)
2243 snd_pcm_set_ops(pcm, s, &azx_pcm_ops);
2244 }
2245 /* buffer pre-allocation */
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002246 size = CONFIG_SND_HDA_PREALLOC_SIZE * 1024;
2247 if (size > MAX_PREALLOC_SIZE)
2248 size = MAX_PREALLOC_SIZE;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002249 snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV_SG,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002250 snd_dma_pci_data(chip->pci),
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002251 size, MAX_PREALLOC_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002252 return 0;
2253}
2254
2255/*
2256 * mixer creation - all stuff is implemented in hda module
2257 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002258static int __devinit azx_mixer_create(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002259{
2260 return snd_hda_build_controls(chip->bus);
2261}
2262
2263
2264/*
2265 * initialize SD streams
2266 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002267static int __devinit azx_init_stream(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002268{
2269 int i;
2270
2271 /* initialize each stream (aka device)
Takashi Iwaid01ce992007-07-27 16:52:19 +02002272 * assign the starting bdl address to each stream (device)
2273 * and initialize
Linus Torvalds1da177e2005-04-16 15:20:36 -07002274 */
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002275 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002276 struct azx_dev *azx_dev = &chip->azx_dev[i];
Takashi Iwai929861c2006-08-31 16:55:40 +02002277 azx_dev->posbuf = (u32 __iomem *)(chip->posbuf.area + i * 8);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002278 /* offset: SDI0=0x80, SDI1=0xa0, ... SDO3=0x160 */
2279 azx_dev->sd_addr = chip->remap_addr + (0x20 * i + 0x80);
2280 /* int mask: SDI0=0x01, SDI1=0x02, ... SDO3=0x80 */
2281 azx_dev->sd_int_sta_mask = 1 << i;
2282 /* stream tag: must be non-zero and unique */
2283 azx_dev->index = i;
2284 azx_dev->stream_tag = i + 1;
2285 }
2286
2287 return 0;
2288}
2289
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002290static int azx_acquire_irq(struct azx *chip, int do_disconnect)
2291{
Takashi Iwai437a5a42006-11-21 12:14:23 +01002292 if (request_irq(chip->pci->irq, azx_interrupt,
2293 chip->msi ? 0 : IRQF_SHARED,
Takashi Iwai934c2b62011-06-10 16:36:37 +02002294 KBUILD_MODNAME, chip)) {
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002295 printk(KERN_ERR "hda-intel: unable to grab IRQ %d, "
2296 "disabling device\n", chip->pci->irq);
2297 if (do_disconnect)
2298 snd_card_disconnect(chip->card);
2299 return -1;
2300 }
2301 chip->irq = chip->pci->irq;
Takashi Iwai69e13412006-11-21 12:10:55 +01002302 pci_intx(chip->pci, !chip->msi);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002303 return 0;
2304}
2305
Linus Torvalds1da177e2005-04-16 15:20:36 -07002306
Takashi Iwaicb53c622007-08-10 17:21:45 +02002307static void azx_stop_chip(struct azx *chip)
2308{
Takashi Iwai95e99fd2007-08-13 15:29:04 +02002309 if (!chip->initialized)
Takashi Iwaicb53c622007-08-10 17:21:45 +02002310 return;
2311
2312 /* disable interrupts */
2313 azx_int_disable(chip);
2314 azx_int_clear(chip);
2315
2316 /* disable CORB/RIRB */
2317 azx_free_cmd_io(chip);
2318
2319 /* disable position buffer */
2320 azx_writel(chip, DPLBASE, 0);
2321 azx_writel(chip, DPUBASE, 0);
2322
2323 chip->initialized = 0;
2324}
2325
2326#ifdef CONFIG_SND_HDA_POWER_SAVE
2327/* power-up/down the controller */
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002328static void azx_power_notify(struct hda_bus *bus)
Takashi Iwaicb53c622007-08-10 17:21:45 +02002329{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002330 struct azx *chip = bus->private_data;
Takashi Iwaicb53c622007-08-10 17:21:45 +02002331 struct hda_codec *c;
2332 int power_on = 0;
2333
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002334 list_for_each_entry(c, &bus->codec_list, list) {
Takashi Iwaicb53c622007-08-10 17:21:45 +02002335 if (c->power_on) {
2336 power_on = 1;
2337 break;
2338 }
2339 }
2340 if (power_on)
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01002341 azx_init_chip(chip, 1);
Wu Fengguang0287d972009-12-11 20:15:11 +08002342 else if (chip->running && power_save_controller &&
2343 !bus->power_keep_link_on)
Takashi Iwaicb53c622007-08-10 17:21:45 +02002344 azx_stop_chip(chip);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002345}
Takashi Iwai5c0b9be2008-12-11 11:47:17 +01002346#endif /* CONFIG_SND_HDA_POWER_SAVE */
2347
2348#ifdef CONFIG_PM
2349/*
2350 * power management
2351 */
Takashi Iwai986862bd2008-11-27 12:40:13 +01002352
2353static int snd_hda_codecs_inuse(struct hda_bus *bus)
2354{
2355 struct hda_codec *codec;
2356
2357 list_for_each_entry(codec, &bus->codec_list, list) {
2358 if (snd_hda_codec_needs_resume(codec))
2359 return 1;
2360 }
2361 return 0;
2362}
Takashi Iwaicb53c622007-08-10 17:21:45 +02002363
Takashi Iwai421a1252005-11-17 16:11:09 +01002364static int azx_suspend(struct pci_dev *pci, pm_message_t state)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002365{
Takashi Iwai421a1252005-11-17 16:11:09 +01002366 struct snd_card *card = pci_get_drvdata(pci);
2367 struct azx *chip = card->private_data;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002368 struct azx_pcm *p;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002369
Takashi Iwai421a1252005-11-17 16:11:09 +01002370 snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002371 azx_clear_irq_pending(chip);
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002372 list_for_each_entry(p, &chip->pcm_list, list)
2373 snd_pcm_suspend_all(p->pcm);
Takashi Iwai0b7a2e92007-08-14 15:18:26 +02002374 if (chip->initialized)
Takashi Iwai8dd78332009-06-02 01:16:07 +02002375 snd_hda_suspend(chip->bus);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002376 azx_stop_chip(chip);
Takashi Iwai30b35392006-10-11 18:52:53 +02002377 if (chip->irq >= 0) {
Takashi Iwai43001c92006-09-08 12:30:03 +02002378 free_irq(chip->irq, chip);
Takashi Iwai30b35392006-10-11 18:52:53 +02002379 chip->irq = -1;
2380 }
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002381 if (chip->msi)
Takashi Iwai43001c92006-09-08 12:30:03 +02002382 pci_disable_msi(chip->pci);
Takashi Iwai421a1252005-11-17 16:11:09 +01002383 pci_disable_device(pci);
2384 pci_save_state(pci);
Takashi Iwai30b35392006-10-11 18:52:53 +02002385 pci_set_power_state(pci, pci_choose_state(pci, state));
Linus Torvalds1da177e2005-04-16 15:20:36 -07002386 return 0;
2387}
2388
Takashi Iwai421a1252005-11-17 16:11:09 +01002389static int azx_resume(struct pci_dev *pci)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002390{
Takashi Iwai421a1252005-11-17 16:11:09 +01002391 struct snd_card *card = pci_get_drvdata(pci);
2392 struct azx *chip = card->private_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002393
Takashi Iwaid14a7e02009-02-16 10:13:03 +01002394 pci_set_power_state(pci, PCI_D0);
2395 pci_restore_state(pci);
Takashi Iwai30b35392006-10-11 18:52:53 +02002396 if (pci_enable_device(pci) < 0) {
2397 printk(KERN_ERR "hda-intel: pci_enable_device failed, "
2398 "disabling device\n");
2399 snd_card_disconnect(card);
2400 return -EIO;
2401 }
2402 pci_set_master(pci);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002403 if (chip->msi)
2404 if (pci_enable_msi(pci) < 0)
2405 chip->msi = 0;
2406 if (azx_acquire_irq(chip, 1) < 0)
Takashi Iwai30b35392006-10-11 18:52:53 +02002407 return -EIO;
Takashi Iwaicb53c622007-08-10 17:21:45 +02002408 azx_init_pci(chip);
Maxim Levitskyd804ad92007-09-03 15:28:04 +02002409
2410 if (snd_hda_codecs_inuse(chip->bus))
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01002411 azx_init_chip(chip, 1);
Maxim Levitskyd804ad92007-09-03 15:28:04 +02002412
Linus Torvalds1da177e2005-04-16 15:20:36 -07002413 snd_hda_resume(chip->bus);
Takashi Iwai421a1252005-11-17 16:11:09 +01002414 snd_power_change_state(card, SNDRV_CTL_POWER_D0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002415 return 0;
2416}
2417#endif /* CONFIG_PM */
2418
2419
2420/*
Takashi Iwai0cbf0092008-10-29 16:18:25 +01002421 * reboot notifier for hang-up problem at power-down
2422 */
2423static int azx_halt(struct notifier_block *nb, unsigned long event, void *buf)
2424{
2425 struct azx *chip = container_of(nb, struct azx, reboot_notifier);
Takashi Iwaifb8d1a32009-11-10 16:02:29 +01002426 snd_hda_bus_reboot_notify(chip->bus);
Takashi Iwai0cbf0092008-10-29 16:18:25 +01002427 azx_stop_chip(chip);
2428 return NOTIFY_OK;
2429}
2430
2431static void azx_notifier_register(struct azx *chip)
2432{
2433 chip->reboot_notifier.notifier_call = azx_halt;
2434 register_reboot_notifier(&chip->reboot_notifier);
2435}
2436
2437static void azx_notifier_unregister(struct azx *chip)
2438{
2439 if (chip->reboot_notifier.notifier_call)
2440 unregister_reboot_notifier(&chip->reboot_notifier);
2441}
2442
2443/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002444 * destructor
2445 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002446static int azx_free(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002447{
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002448 int i;
2449
Takashi Iwai0cbf0092008-10-29 16:18:25 +01002450 azx_notifier_unregister(chip);
2451
Takashi Iwaice43fba2005-05-30 20:33:44 +02002452 if (chip->initialized) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002453 azx_clear_irq_pending(chip);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002454 for (i = 0; i < chip->num_streams; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002455 azx_stream_stop(chip, &chip->azx_dev[i]);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002456 azx_stop_chip(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002457 }
2458
Jeff Garzikf000fd82008-04-22 13:50:34 +02002459 if (chip->irq >= 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002460 free_irq(chip->irq, (void*)chip);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002461 if (chip->msi)
Takashi Iwai30b35392006-10-11 18:52:53 +02002462 pci_disable_msi(chip->pci);
Takashi Iwaif079c252006-06-01 11:42:14 +02002463 if (chip->remap_addr)
2464 iounmap(chip->remap_addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002465
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002466 if (chip->azx_dev) {
2467 for (i = 0; i < chip->num_streams; i++)
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002468 if (chip->azx_dev[i].bdl.area) {
2469 mark_pages_wc(chip, &chip->azx_dev[i].bdl, false);
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002470 snd_dma_free_pages(&chip->azx_dev[i].bdl);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002471 }
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002472 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002473 if (chip->rb.area) {
2474 mark_pages_wc(chip, &chip->rb, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002475 snd_dma_free_pages(&chip->rb);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002476 }
2477 if (chip->posbuf.area) {
2478 mark_pages_wc(chip, &chip->posbuf, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002479 snd_dma_free_pages(&chip->posbuf);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002480 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002481 pci_release_regions(chip->pci);
2482 pci_disable_device(chip->pci);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002483 kfree(chip->azx_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002484 kfree(chip);
2485
2486 return 0;
2487}
2488
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002489static int azx_dev_free(struct snd_device *device)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002490{
2491 return azx_free(device->device_data);
2492}
2493
2494/*
Takashi Iwai3372a152007-02-01 15:46:50 +01002495 * white/black-listing for position_fix
2496 */
Ralf Baechle623ec042007-03-13 15:29:47 +01002497static struct snd_pci_quirk position_fix_list[] __devinitdata = {
Takashi Iwaid2e1c972008-06-10 17:53:34 +02002498 SND_PCI_QUIRK(0x1028, 0x01cc, "Dell D820", POS_FIX_LPIB),
2499 SND_PCI_QUIRK(0x1028, 0x01de, "Dell Precision 390", POS_FIX_LPIB),
Takashi Iwai2f703e72009-12-01 14:17:37 +01002500 SND_PCI_QUIRK(0x103c, 0x306d, "HP dv3", POS_FIX_LPIB),
Takashi Iwaid2e1c972008-06-10 17:53:34 +02002501 SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB),
Daniel T Chendd37f8e2010-05-30 01:17:03 -04002502 SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS", POS_FIX_LPIB),
Daniel T Chen9f75c1b2010-05-30 13:08:41 -04002503 SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS M2V", POS_FIX_LPIB),
Daniel T Chene96d3122010-05-27 18:32:18 -04002504 SND_PCI_QUIRK(0x104d, 0x9069, "Sony VPCS11V9E", POS_FIX_LPIB),
David Henningssonb01de4f2012-01-12 16:31:14 +01002505 SND_PCI_QUIRK(0x10de, 0xcb89, "Macbook Pro 7,1", POS_FIX_LPIB),
Daniel T Chen61bb42c2010-05-29 11:04:11 -04002506 SND_PCI_QUIRK(0x1297, 0x3166, "Shuttle", POS_FIX_LPIB),
Daniel T Chen9ec8dda2010-03-28 02:34:40 -04002507 SND_PCI_QUIRK(0x1458, 0xa022, "ga-ma770-ud3", POS_FIX_LPIB),
Takashi Iwai45d4ebf2009-11-30 11:58:30 +01002508 SND_PCI_QUIRK(0x1462, 0x1002, "MSI Wind U115", POS_FIX_LPIB),
Takashi Iwai8815cd02010-04-15 09:02:41 +02002509 SND_PCI_QUIRK(0x1565, 0x8218, "Biostar Microtech", POS_FIX_LPIB),
Daniel T Chenb90c0762010-05-30 19:31:41 -04002510 SND_PCI_QUIRK(0x1849, 0x0888, "775Dual-VSTA", POS_FIX_LPIB),
Daniel T Chen0e0280d2010-04-21 19:55:43 -04002511 SND_PCI_QUIRK(0x8086, 0x2503, "DG965OT AAD63733-203", POS_FIX_LPIB),
Takashi Iwai3372a152007-02-01 15:46:50 +01002512 {}
2513};
2514
2515static int __devinit check_position_fix(struct azx *chip, int fix)
2516{
2517 const struct snd_pci_quirk *q;
2518
Takashi Iwaic673ba12009-03-17 07:49:14 +01002519 switch (fix) {
2520 case POS_FIX_LPIB:
2521 case POS_FIX_POSBUF:
David Henningsson4cb36312010-09-30 10:12:50 +02002522 case POS_FIX_VIACOMBO:
Takashi Iwaic673ba12009-03-17 07:49:14 +01002523 return fix;
2524 }
2525
Takashi Iwaic673ba12009-03-17 07:49:14 +01002526 q = snd_pci_quirk_lookup(chip->pci, position_fix_list);
2527 if (q) {
2528 printk(KERN_INFO
2529 "hda_intel: position_fix set to %d "
2530 "for device %04x:%04x\n",
2531 q->value, q->subvendor, q->subdevice);
2532 return q->value;
Takashi Iwai3372a152007-02-01 15:46:50 +01002533 }
David Henningssonbdd9ef22010-10-04 12:02:14 +02002534
2535 /* Check VIA/ATI HD Audio Controller exist */
Takashi Iwai9477c582011-05-25 09:11:37 +02002536 if (chip->driver_caps & AZX_DCAPS_POSFIX_VIA) {
2537 snd_printd(SFX "Using VIACOMBO position fix\n");
David Henningssonbdd9ef22010-10-04 12:02:14 +02002538 return POS_FIX_VIACOMBO;
2539 }
Takashi Iwai9477c582011-05-25 09:11:37 +02002540 if (chip->driver_caps & AZX_DCAPS_POSFIX_LPIB) {
2541 snd_printd(SFX "Using LPIB position fix\n");
2542 return POS_FIX_LPIB;
2543 }
Takashi Iwaic673ba12009-03-17 07:49:14 +01002544 return POS_FIX_AUTO;
Takashi Iwai3372a152007-02-01 15:46:50 +01002545}
2546
2547/*
Takashi Iwai669ba272007-08-17 09:17:36 +02002548 * black-lists for probe_mask
2549 */
2550static struct snd_pci_quirk probe_mask_list[] __devinitdata = {
2551 /* Thinkpad often breaks the controller communication when accessing
2552 * to the non-working (or non-existing) modem codec slot.
2553 */
2554 SND_PCI_QUIRK(0x1014, 0x05b7, "Thinkpad Z60", 0x01),
2555 SND_PCI_QUIRK(0x17aa, 0x2010, "Thinkpad X/T/R60", 0x01),
2556 SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X/T/R61", 0x01),
Takashi Iwai0edb9452008-11-07 14:53:09 +01002557 /* broken BIOS */
2558 SND_PCI_QUIRK(0x1028, 0x20ac, "Dell Studio Desktop", 0x01),
Takashi Iwaief1681d2008-11-24 17:29:28 +01002559 /* including bogus ALC268 in slot#2 that conflicts with ALC888 */
2560 SND_PCI_QUIRK(0x17c0, 0x4085, "Medion MD96630", 0x01),
Takashi Iwai20db7cb2009-02-13 08:18:48 +01002561 /* forced codec slots */
Ozan Çağlayan93574842009-05-23 15:00:04 +03002562 SND_PCI_QUIRK(0x1043, 0x1262, "ASUS W5Fm", 0x103),
Takashi Iwai20db7cb2009-02-13 08:18:48 +01002563 SND_PCI_QUIRK(0x1046, 0x1262, "ASUS W5F", 0x103),
Takashi Iwai669ba272007-08-17 09:17:36 +02002564 {}
2565};
2566
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01002567#define AZX_FORCE_CODEC_MASK 0x100
2568
Takashi Iwai5aba4f82008-01-07 15:16:37 +01002569static void __devinit check_probe_mask(struct azx *chip, int dev)
Takashi Iwai669ba272007-08-17 09:17:36 +02002570{
2571 const struct snd_pci_quirk *q;
2572
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01002573 chip->codec_probe_mask = probe_mask[dev];
2574 if (chip->codec_probe_mask == -1) {
Takashi Iwai669ba272007-08-17 09:17:36 +02002575 q = snd_pci_quirk_lookup(chip->pci, probe_mask_list);
2576 if (q) {
2577 printk(KERN_INFO
2578 "hda_intel: probe_mask set to 0x%x "
2579 "for device %04x:%04x\n",
2580 q->value, q->subvendor, q->subdevice);
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01002581 chip->codec_probe_mask = q->value;
Takashi Iwai669ba272007-08-17 09:17:36 +02002582 }
2583 }
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01002584
2585 /* check forced option */
2586 if (chip->codec_probe_mask != -1 &&
2587 (chip->codec_probe_mask & AZX_FORCE_CODEC_MASK)) {
2588 chip->codec_mask = chip->codec_probe_mask & 0xff;
2589 printk(KERN_INFO "hda_intel: codec_mask forced to 0x%x\n",
2590 chip->codec_mask);
2591 }
Takashi Iwai669ba272007-08-17 09:17:36 +02002592}
2593
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02002594/*
Takashi Iwai716238552009-09-28 13:14:04 +02002595 * white/black-list for enable_msi
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02002596 */
Takashi Iwai716238552009-09-28 13:14:04 +02002597static struct snd_pci_quirk msi_black_list[] __devinitdata = {
Takashi Iwai9dc83982009-12-22 08:15:01 +01002598 SND_PCI_QUIRK(0x1043, 0x81f2, "ASUS", 0), /* Athlon64 X2 + nvidia */
Takashi Iwai0a27fcf2010-02-15 17:05:28 +01002599 SND_PCI_QUIRK(0x1043, 0x81f6, "ASUS", 0), /* nvidia */
Ralf Gerbigecd21622010-03-09 18:25:47 +01002600 SND_PCI_QUIRK(0x1043, 0x822d, "ASUS", 0), /* Athlon64 X2 + nvidia MCP55 */
Michele Ballabio4193d132010-03-06 21:06:46 +01002601 SND_PCI_QUIRK(0x1849, 0x0888, "ASRock", 0), /* Athlon64 X2 + nvidia */
Takashi Iwai38155952010-04-04 12:14:03 +02002602 SND_PCI_QUIRK(0xa0a0, 0x0575, "Aopen MZ915-M", 0), /* ICH6 */
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02002603 {}
2604};
2605
2606static void __devinit check_msi(struct azx *chip)
2607{
2608 const struct snd_pci_quirk *q;
2609
Takashi Iwai716238552009-09-28 13:14:04 +02002610 if (enable_msi >= 0) {
2611 chip->msi = !!enable_msi;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02002612 return;
Takashi Iwai716238552009-09-28 13:14:04 +02002613 }
2614 chip->msi = 1; /* enable MSI as default */
2615 q = snd_pci_quirk_lookup(chip->pci, msi_black_list);
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02002616 if (q) {
2617 printk(KERN_INFO
2618 "hda_intel: msi for device %04x:%04x set to %d\n",
2619 q->subvendor, q->subdevice, q->value);
2620 chip->msi = q->value;
Takashi Iwai80c43ed2010-03-15 15:51:53 +01002621 return;
2622 }
2623
2624 /* NVidia chipsets seem to cause troubles with MSI */
Takashi Iwai9477c582011-05-25 09:11:37 +02002625 if (chip->driver_caps & AZX_DCAPS_NO_MSI) {
2626 printk(KERN_INFO "hda_intel: Disabling MSI\n");
Takashi Iwai80c43ed2010-03-15 15:51:53 +01002627 chip->msi = 0;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02002628 }
2629}
2630
Takashi Iwaia1585d72011-12-14 09:27:04 +01002631/* check the snoop mode availability */
2632static void __devinit azx_check_snoop_available(struct azx *chip)
2633{
2634 bool snoop = chip->snoop;
2635
2636 switch (chip->driver_type) {
2637 case AZX_DRIVER_VIA:
2638 /* force to non-snoop mode for a new VIA controller
2639 * when BIOS is set
2640 */
2641 if (snoop) {
2642 u8 val;
2643 pci_read_config_byte(chip->pci, 0x42, &val);
2644 if (!(val & 0x80) && chip->pci->revision == 0x30)
2645 snoop = false;
2646 }
2647 break;
2648 case AZX_DRIVER_ATIHDMI_NS:
2649 /* new ATI HDMI requires non-snoop */
2650 snoop = false;
2651 break;
2652 }
2653
2654 if (snoop != chip->snoop) {
2655 snd_printk(KERN_INFO SFX "Force to %s mode\n",
2656 snoop ? "snoop" : "non-snoop");
2657 chip->snoop = snoop;
2658 }
2659}
Takashi Iwai669ba272007-08-17 09:17:36 +02002660
2661/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002662 * constructor
2663 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002664static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci,
Takashi Iwai9477c582011-05-25 09:11:37 +02002665 int dev, unsigned int driver_caps,
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002666 struct azx **rchip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002667{
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002668 struct azx *chip;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002669 int i, err;
Tobin Davisbcd72002008-01-15 11:23:55 +01002670 unsigned short gcap;
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002671 static struct snd_device_ops ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002672 .dev_free = azx_dev_free,
2673 };
2674
2675 *rchip = NULL;
Tobin Davisbcd72002008-01-15 11:23:55 +01002676
Pavel Machek927fc862006-08-31 17:03:43 +02002677 err = pci_enable_device(pci);
2678 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002679 return err;
2680
Takashi Iwaie560d8d2005-09-09 14:21:46 +02002681 chip = kzalloc(sizeof(*chip), GFP_KERNEL);
Pavel Machek927fc862006-08-31 17:03:43 +02002682 if (!chip) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002683 snd_printk(KERN_ERR SFX "cannot allocate chip\n");
2684 pci_disable_device(pci);
2685 return -ENOMEM;
2686 }
2687
2688 spin_lock_init(&chip->reg_lock);
Ingo Molnar62932df2006-01-16 16:34:20 +01002689 mutex_init(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002690 chip->card = card;
2691 chip->pci = pci;
2692 chip->irq = -1;
Takashi Iwai9477c582011-05-25 09:11:37 +02002693 chip->driver_caps = driver_caps;
2694 chip->driver_type = driver_caps & 0xff;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02002695 check_msi(chip);
Takashi Iwai555e2192008-06-10 17:53:34 +02002696 chip->dev_index = dev;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002697 INIT_WORK(&chip->irq_pending_work, azx_irq_pending_work);
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002698 INIT_LIST_HEAD(&chip->pcm_list);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002699
Shahin Ghazinouribeaffc32010-05-11 08:19:55 +02002700 chip->position_fix[0] = chip->position_fix[1] =
2701 check_position_fix(chip, position_fix[dev]);
Takashi Iwai5aba4f82008-01-07 15:16:37 +01002702 check_probe_mask(chip, dev);
Takashi Iwai3372a152007-02-01 15:46:50 +01002703
Takashi Iwai27346162006-01-12 18:28:44 +01002704 chip->single_cmd = single_cmd;
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002705 chip->snoop = hda_snoop;
Takashi Iwaia1585d72011-12-14 09:27:04 +01002706 azx_check_snoop_available(chip);
Takashi Iwaic74db862005-05-12 14:26:27 +02002707
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02002708 if (bdl_pos_adj[dev] < 0) {
2709 switch (chip->driver_type) {
Takashi Iwai0c6341a2008-06-13 20:50:27 +02002710 case AZX_DRIVER_ICH:
Seth Heasley32679f92010-02-22 17:31:09 -08002711 case AZX_DRIVER_PCH:
Takashi Iwai0c6341a2008-06-13 20:50:27 +02002712 bdl_pos_adj[dev] = 1;
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02002713 break;
2714 default:
Takashi Iwai0c6341a2008-06-13 20:50:27 +02002715 bdl_pos_adj[dev] = 32;
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02002716 break;
2717 }
2718 }
2719
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002720#if BITS_PER_LONG != 64
2721 /* Fix up base address on ULI M5461 */
2722 if (chip->driver_type == AZX_DRIVER_ULI) {
2723 u16 tmp3;
2724 pci_read_config_word(pci, 0x40, &tmp3);
2725 pci_write_config_word(pci, 0x40, tmp3 | 0x10);
2726 pci_write_config_dword(pci, PCI_BASE_ADDRESS_1, 0);
2727 }
2728#endif
2729
Pavel Machek927fc862006-08-31 17:03:43 +02002730 err = pci_request_regions(pci, "ICH HD audio");
2731 if (err < 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002732 kfree(chip);
2733 pci_disable_device(pci);
2734 return err;
2735 }
2736
Pavel Machek927fc862006-08-31 17:03:43 +02002737 chip->addr = pci_resource_start(pci, 0);
Arjan van de Ven2f5ad542008-09-28 16:20:09 -07002738 chip->remap_addr = pci_ioremap_bar(pci, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002739 if (chip->remap_addr == NULL) {
2740 snd_printk(KERN_ERR SFX "ioremap error\n");
2741 err = -ENXIO;
2742 goto errout;
2743 }
2744
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002745 if (chip->msi)
2746 if (pci_enable_msi(pci) < 0)
2747 chip->msi = 0;
Stephen Hemminger7376d012006-08-21 19:17:46 +02002748
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002749 if (azx_acquire_irq(chip, 0) < 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002750 err = -EBUSY;
2751 goto errout;
2752 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002753
2754 pci_set_master(pci);
2755 synchronize_irq(chip->irq);
2756
Tobin Davisbcd72002008-01-15 11:23:55 +01002757 gcap = azx_readw(chip, GCAP);
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02002758 snd_printdd(SFX "chipset global capabilities = 0x%x\n", gcap);
Tobin Davisbcd72002008-01-15 11:23:55 +01002759
Andiry Brienzadc4c2e62009-07-08 13:55:31 +08002760 /* disable SB600 64bit support for safety */
Takashi Iwai9477c582011-05-25 09:11:37 +02002761 if (chip->pci->vendor == PCI_VENDOR_ID_ATI) {
Andiry Brienzadc4c2e62009-07-08 13:55:31 +08002762 struct pci_dev *p_smbus;
2763 p_smbus = pci_get_device(PCI_VENDOR_ID_ATI,
2764 PCI_DEVICE_ID_ATI_SBX00_SMBUS,
2765 NULL);
2766 if (p_smbus) {
2767 if (p_smbus->revision < 0x30)
2768 gcap &= ~ICH6_GCAP_64OK;
2769 pci_dev_put(p_smbus);
2770 }
2771 }
Takashi Iwai09240cf2009-03-17 07:47:18 +01002772
Takashi Iwai9477c582011-05-25 09:11:37 +02002773 /* disable 64bit DMA address on some devices */
2774 if (chip->driver_caps & AZX_DCAPS_NO_64BIT) {
2775 snd_printd(SFX "Disabling 64bit DMA\n");
Jaroslav Kysela396087e2009-12-09 10:44:47 +01002776 gcap &= ~ICH6_GCAP_64OK;
Takashi Iwai9477c582011-05-25 09:11:37 +02002777 }
Jaroslav Kysela396087e2009-12-09 10:44:47 +01002778
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05002779 /* disable buffer size rounding to 128-byte multiples if supported */
Takashi Iwai7bfe0592012-01-23 17:53:39 +01002780 if (align_buffer_size >= 0)
2781 chip->align_buffer_size = !!align_buffer_size;
2782 else {
2783 if (chip->driver_caps & AZX_DCAPS_BUFSIZE)
2784 chip->align_buffer_size = 0;
2785 else if (chip->driver_caps & AZX_DCAPS_ALIGN_BUFSIZE)
2786 chip->align_buffer_size = 1;
2787 else
2788 chip->align_buffer_size = 1;
2789 }
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05002790
Takashi Iwaicf7aaca2008-02-06 15:05:57 +01002791 /* allow 64bit DMA address if supported by H/W */
Takashi Iwaib21fadb2009-05-28 12:26:15 +02002792 if ((gcap & ICH6_GCAP_64OK) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64)))
Yang Hongyange9304382009-04-13 14:40:14 -07002793 pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(64));
Takashi Iwai09240cf2009-03-17 07:47:18 +01002794 else {
Yang Hongyange9304382009-04-13 14:40:14 -07002795 pci_set_dma_mask(pci, DMA_BIT_MASK(32));
2796 pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(32));
Takashi Iwai09240cf2009-03-17 07:47:18 +01002797 }
Takashi Iwaicf7aaca2008-02-06 15:05:57 +01002798
Takashi Iwai8b6ed8e2008-02-19 11:36:35 +01002799 /* read number of streams from GCAP register instead of using
2800 * hardcoded value
2801 */
2802 chip->capture_streams = (gcap >> 8) & 0x0f;
2803 chip->playback_streams = (gcap >> 12) & 0x0f;
2804 if (!chip->playback_streams && !chip->capture_streams) {
Tobin Davisbcd72002008-01-15 11:23:55 +01002805 /* gcap didn't give any info, switching to old method */
2806
2807 switch (chip->driver_type) {
2808 case AZX_DRIVER_ULI:
2809 chip->playback_streams = ULI_NUM_PLAYBACK;
2810 chip->capture_streams = ULI_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01002811 break;
2812 case AZX_DRIVER_ATIHDMI:
Andiry Xu1815b342011-12-14 16:10:27 +08002813 case AZX_DRIVER_ATIHDMI_NS:
Tobin Davisbcd72002008-01-15 11:23:55 +01002814 chip->playback_streams = ATIHDMI_NUM_PLAYBACK;
2815 chip->capture_streams = ATIHDMI_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01002816 break;
Yang, Libinc4da29c2008-11-13 11:07:07 +01002817 case AZX_DRIVER_GENERIC:
Tobin Davisbcd72002008-01-15 11:23:55 +01002818 default:
2819 chip->playback_streams = ICH6_NUM_PLAYBACK;
2820 chip->capture_streams = ICH6_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01002821 break;
2822 }
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002823 }
Takashi Iwai8b6ed8e2008-02-19 11:36:35 +01002824 chip->capture_index_offset = 0;
2825 chip->playback_index_offset = chip->capture_streams;
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002826 chip->num_streams = chip->playback_streams + chip->capture_streams;
Takashi Iwaid01ce992007-07-27 16:52:19 +02002827 chip->azx_dev = kcalloc(chip->num_streams, sizeof(*chip->azx_dev),
2828 GFP_KERNEL);
Pavel Machek927fc862006-08-31 17:03:43 +02002829 if (!chip->azx_dev) {
Takashi Iwai4abc1cc2009-05-19 12:16:46 +02002830 snd_printk(KERN_ERR SFX "cannot malloc azx_dev\n");
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002831 goto errout;
2832 }
2833
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002834 for (i = 0; i < chip->num_streams; i++) {
2835 /* allocate memory for the BDL for each stream */
2836 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
2837 snd_dma_pci_data(chip->pci),
2838 BDL_SIZE, &chip->azx_dev[i].bdl);
2839 if (err < 0) {
2840 snd_printk(KERN_ERR SFX "cannot allocate BDL\n");
2841 goto errout;
2842 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002843 mark_pages_wc(chip, &chip->azx_dev[i].bdl, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002844 }
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02002845 /* allocate memory for the position buffer */
Takashi Iwaid01ce992007-07-27 16:52:19 +02002846 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
2847 snd_dma_pci_data(chip->pci),
2848 chip->num_streams * 8, &chip->posbuf);
2849 if (err < 0) {
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02002850 snd_printk(KERN_ERR SFX "cannot allocate posbuf\n");
2851 goto errout;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002852 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002853 mark_pages_wc(chip, &chip->posbuf, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002854 /* allocate CORB/RIRB */
Takashi Iwai81740862009-05-26 15:22:00 +02002855 err = azx_alloc_cmd_io(chip);
2856 if (err < 0)
2857 goto errout;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002858
2859 /* initialize streams */
2860 azx_init_stream(chip);
2861
2862 /* initialize chip */
Takashi Iwaicb53c622007-08-10 17:21:45 +02002863 azx_init_pci(chip);
Jaroslav Kysela10e77dd2010-03-26 11:04:38 +01002864 azx_init_chip(chip, (probe_only[dev] & 2) == 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002865
2866 /* codec detection */
Pavel Machek927fc862006-08-31 17:03:43 +02002867 if (!chip->codec_mask) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002868 snd_printk(KERN_ERR SFX "no codecs found!\n");
2869 err = -ENODEV;
2870 goto errout;
2871 }
2872
Takashi Iwaid01ce992007-07-27 16:52:19 +02002873 err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
2874 if (err <0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002875 snd_printk(KERN_ERR SFX "Error creating device [card]!\n");
2876 goto errout;
2877 }
2878
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002879 strcpy(card->driver, "HDA-Intel");
Takashi Iwai18cb7102009-04-16 10:22:24 +02002880 strlcpy(card->shortname, driver_short_names[chip->driver_type],
2881 sizeof(card->shortname));
2882 snprintf(card->longname, sizeof(card->longname),
2883 "%s at 0x%lx irq %i",
2884 card->shortname, chip->addr, chip->irq);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002885
Linus Torvalds1da177e2005-04-16 15:20:36 -07002886 *rchip = chip;
2887 return 0;
2888
2889 errout:
2890 azx_free(chip);
2891 return err;
2892}
2893
Takashi Iwaicb53c622007-08-10 17:21:45 +02002894static void power_down_all_codecs(struct azx *chip)
2895{
2896#ifdef CONFIG_SND_HDA_POWER_SAVE
2897 /* The codecs were powered up in snd_hda_codec_new().
2898 * Now all initialization done, so turn them down if possible
2899 */
2900 struct hda_codec *codec;
2901 list_for_each_entry(codec, &chip->bus->codec_list, list) {
2902 snd_hda_power_down(codec);
2903 }
2904#endif
2905}
2906
Takashi Iwaid01ce992007-07-27 16:52:19 +02002907static int __devinit azx_probe(struct pci_dev *pci,
2908 const struct pci_device_id *pci_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002909{
Takashi Iwai5aba4f82008-01-07 15:16:37 +01002910 static int dev;
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002911 struct snd_card *card;
2912 struct azx *chip;
Pavel Machek927fc862006-08-31 17:03:43 +02002913 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002914
Takashi Iwai5aba4f82008-01-07 15:16:37 +01002915 if (dev >= SNDRV_CARDS)
2916 return -ENODEV;
2917 if (!enable[dev]) {
2918 dev++;
2919 return -ENOENT;
2920 }
2921
Takashi Iwaie58de7b2008-12-28 16:44:30 +01002922 err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card);
2923 if (err < 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002924 snd_printk(KERN_ERR SFX "Error creating card!\n");
Takashi Iwaie58de7b2008-12-28 16:44:30 +01002925 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002926 }
2927
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02002928 /* set this here since it's referred in snd_hda_load_patch() */
2929 snd_card_set_dev(card, &pci->dev);
2930
Takashi Iwai5aba4f82008-01-07 15:16:37 +01002931 err = azx_create(card, pci, dev, pci_id->driver_data, &chip);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08002932 if (err < 0)
2933 goto out_free;
Takashi Iwai421a1252005-11-17 16:11:09 +01002934 card->private_data = chip;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002935
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +01002936#ifdef CONFIG_SND_HDA_INPUT_BEEP
2937 chip->beep_mode = beep_mode[dev];
2938#endif
2939
Linus Torvalds1da177e2005-04-16 15:20:36 -07002940 /* create codec instances */
Takashi Iwaia1e21c92009-06-17 09:33:52 +02002941 err = azx_codec_create(chip, model[dev]);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08002942 if (err < 0)
2943 goto out_free;
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02002944#ifdef CONFIG_SND_HDA_PATCH_LOADER
Takashi Iwai41a63f12011-02-10 17:39:20 +01002945 if (patch[dev] && *patch[dev]) {
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02002946 snd_printk(KERN_ERR SFX "Applying patch firmware '%s'\n",
2947 patch[dev]);
2948 err = snd_hda_load_patch(chip->bus, patch[dev]);
2949 if (err < 0)
2950 goto out_free;
2951 }
2952#endif
Jaroslav Kysela10e77dd2010-03-26 11:04:38 +01002953 if ((probe_only[dev] & 1) == 0) {
Takashi Iwaia1e21c92009-06-17 09:33:52 +02002954 err = azx_codec_configure(chip);
2955 if (err < 0)
2956 goto out_free;
2957 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002958
2959 /* create PCM streams */
Takashi Iwai176d5332008-07-30 15:01:44 +02002960 err = snd_hda_build_pcms(chip->bus);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08002961 if (err < 0)
2962 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002963
2964 /* create mixer controls */
Takashi Iwaid01ce992007-07-27 16:52:19 +02002965 err = azx_mixer_create(chip);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08002966 if (err < 0)
2967 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002968
Takashi Iwaid01ce992007-07-27 16:52:19 +02002969 err = snd_card_register(card);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08002970 if (err < 0)
2971 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002972
2973 pci_set_drvdata(pci, card);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002974 chip->running = 1;
2975 power_down_all_codecs(chip);
Takashi Iwai0cbf0092008-10-29 16:18:25 +01002976 azx_notifier_register(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002977
Andrew Paprockie25bcdb2008-01-13 11:57:17 +01002978 dev++;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002979 return err;
Wu Fengguang41dda0f2008-11-20 09:24:52 +08002980out_free:
2981 snd_card_free(card);
2982 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002983}
2984
2985static void __devexit azx_remove(struct pci_dev *pci)
2986{
2987 snd_card_free(pci_get_drvdata(pci));
2988 pci_set_drvdata(pci, NULL);
2989}
2990
2991/* PCI IDs */
Alexey Dobriyancebe41d2010-02-06 00:21:03 +02002992static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
Seth Heasleyd2f2fcd2010-01-12 17:03:35 -08002993 /* CPT */
Takashi Iwai9477c582011-05-25 09:11:37 +02002994 { PCI_DEVICE(0x8086, 0x1c20),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05002995 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP |
2996 AZX_DCAPS_BUFSIZE },
Seth Heasleycea310e2010-09-10 16:29:56 -07002997 /* PBG */
Takashi Iwai9477c582011-05-25 09:11:37 +02002998 { PCI_DEVICE(0x8086, 0x1d20),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05002999 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP |
3000 AZX_DCAPS_BUFSIZE},
Seth Heasleyd2edeb72011-04-20 10:59:57 -07003001 /* Panther Point */
Takashi Iwai9477c582011-05-25 09:11:37 +02003002 { PCI_DEVICE(0x8086, 0x1e20),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003003 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP |
3004 AZX_DCAPS_BUFSIZE},
Seth Heasley8bc039a2012-01-23 16:24:31 -08003005 /* Lynx Point */
3006 { PCI_DEVICE(0x8086, 0x8c20),
3007 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP |
3008 AZX_DCAPS_BUFSIZE},
Takashi Iwai87218e92008-02-21 08:13:11 +01003009 /* SCH */
Takashi Iwai9477c582011-05-25 09:11:37 +02003010 { PCI_DEVICE(0x8086, 0x811b),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003011 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP |
David Henningsson645e9032011-12-14 15:52:30 +08003012 AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_LPIB }, /* Poulsbo */
Li Peng09904b92011-12-28 15:17:26 +00003013 { PCI_DEVICE(0x8086, 0x080a),
3014 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP |
David Henningsson716e5db2012-01-04 10:12:54 +01003015 AZX_DCAPS_BUFSIZE | AZX_DCAPS_POSFIX_LPIB }, /* Oaktrail */
David Henningsson645e9032011-12-14 15:52:30 +08003016 /* ICH */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003017 { PCI_DEVICE(0x8086, 0x2668),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003018 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3019 AZX_DCAPS_BUFSIZE }, /* ICH6 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003020 { PCI_DEVICE(0x8086, 0x27d8),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003021 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3022 AZX_DCAPS_BUFSIZE }, /* ICH7 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003023 { PCI_DEVICE(0x8086, 0x269a),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003024 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3025 AZX_DCAPS_BUFSIZE }, /* ESB2 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003026 { PCI_DEVICE(0x8086, 0x284b),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003027 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3028 AZX_DCAPS_BUFSIZE }, /* ICH8 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003029 { PCI_DEVICE(0x8086, 0x293e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003030 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3031 AZX_DCAPS_BUFSIZE }, /* ICH9 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003032 { PCI_DEVICE(0x8086, 0x293f),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003033 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3034 AZX_DCAPS_BUFSIZE }, /* ICH9 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003035 { PCI_DEVICE(0x8086, 0x3a3e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003036 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3037 AZX_DCAPS_BUFSIZE }, /* ICH10 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003038 { PCI_DEVICE(0x8086, 0x3a6e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003039 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3040 AZX_DCAPS_BUFSIZE }, /* ICH10 */
Takashi Iwaib6864532010-09-15 10:17:26 +02003041 /* Generic Intel */
3042 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_ANY_ID),
3043 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3044 .class_mask = 0xffffff,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003045 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_BUFSIZE },
Takashi Iwai9477c582011-05-25 09:11:37 +02003046 /* ATI SB 450/600/700/800/900 */
3047 { PCI_DEVICE(0x1002, 0x437b),
3048 .driver_data = AZX_DRIVER_ATI | AZX_DCAPS_PRESET_ATI_SB },
3049 { PCI_DEVICE(0x1002, 0x4383),
3050 .driver_data = AZX_DRIVER_ATI | AZX_DCAPS_PRESET_ATI_SB },
3051 /* AMD Hudson */
3052 { PCI_DEVICE(0x1022, 0x780d),
3053 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_SB },
Takashi Iwai87218e92008-02-21 08:13:11 +01003054 /* ATI HDMI */
Takashi Iwai9477c582011-05-25 09:11:37 +02003055 { PCI_DEVICE(0x1002, 0x793b),
3056 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3057 { PCI_DEVICE(0x1002, 0x7919),
3058 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3059 { PCI_DEVICE(0x1002, 0x960f),
3060 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3061 { PCI_DEVICE(0x1002, 0x970f),
3062 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3063 { PCI_DEVICE(0x1002, 0xaa00),
3064 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3065 { PCI_DEVICE(0x1002, 0xaa08),
3066 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3067 { PCI_DEVICE(0x1002, 0xaa10),
3068 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3069 { PCI_DEVICE(0x1002, 0xaa18),
3070 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3071 { PCI_DEVICE(0x1002, 0xaa20),
3072 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3073 { PCI_DEVICE(0x1002, 0xaa28),
3074 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3075 { PCI_DEVICE(0x1002, 0xaa30),
3076 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3077 { PCI_DEVICE(0x1002, 0xaa38),
3078 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3079 { PCI_DEVICE(0x1002, 0xaa40),
3080 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3081 { PCI_DEVICE(0x1002, 0xaa48),
3082 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
Andiry Xu1815b342011-12-14 16:10:27 +08003083 { PCI_DEVICE(0x1002, 0x9902),
3084 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
3085 { PCI_DEVICE(0x1002, 0xaaa0),
3086 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
3087 { PCI_DEVICE(0x1002, 0xaaa8),
3088 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
3089 { PCI_DEVICE(0x1002, 0xaab0),
3090 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
Takashi Iwai87218e92008-02-21 08:13:11 +01003091 /* VIA VT8251/VT8237A */
Takashi Iwai9477c582011-05-25 09:11:37 +02003092 { PCI_DEVICE(0x1106, 0x3288),
3093 .driver_data = AZX_DRIVER_VIA | AZX_DCAPS_POSFIX_VIA },
Takashi Iwai87218e92008-02-21 08:13:11 +01003094 /* SIS966 */
3095 { PCI_DEVICE(0x1039, 0x7502), .driver_data = AZX_DRIVER_SIS },
3096 /* ULI M5461 */
3097 { PCI_DEVICE(0x10b9, 0x5461), .driver_data = AZX_DRIVER_ULI },
3098 /* NVIDIA MCP */
Takashi Iwai0c2fd1bf42009-12-18 16:41:39 +01003099 { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID),
3100 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3101 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02003102 .driver_data = AZX_DRIVER_NVIDIA | AZX_DCAPS_PRESET_NVIDIA },
Kailang Yangf2690022008-05-27 11:44:55 +02003103 /* Teradici */
Takashi Iwai9477c582011-05-25 09:11:37 +02003104 { PCI_DEVICE(0x6549, 0x1200),
3105 .driver_data = AZX_DRIVER_TERA | AZX_DCAPS_NO_64BIT },
Takashi Iwai4e01f542009-04-16 08:53:34 +02003106 /* Creative X-Fi (CA0110-IBG) */
Takashi Iwai313f6e22009-05-18 12:40:52 +02003107#if !defined(CONFIG_SND_CTXFI) && !defined(CONFIG_SND_CTXFI_MODULE)
3108 /* the following entry conflicts with snd-ctxfi driver,
3109 * as ctxfi driver mutates from HD-audio to native mode with
3110 * a special command sequence.
3111 */
Takashi Iwai4e01f542009-04-16 08:53:34 +02003112 { PCI_DEVICE(PCI_VENDOR_ID_CREATIVE, PCI_ANY_ID),
3113 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3114 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02003115 .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
Takashi Iwai69f9ba92011-11-06 13:49:13 +01003116 AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB },
Takashi Iwai313f6e22009-05-18 12:40:52 +02003117#else
3118 /* this entry seems still valid -- i.e. without emu20kx chip */
Takashi Iwai9477c582011-05-25 09:11:37 +02003119 { PCI_DEVICE(0x1102, 0x0009),
3120 .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
Takashi Iwai69f9ba92011-11-06 13:49:13 +01003121 AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB },
Takashi Iwai313f6e22009-05-18 12:40:52 +02003122#endif
Otavio Salvadore35d4b12010-09-26 23:35:06 -03003123 /* Vortex86MX */
3124 { PCI_DEVICE(0x17f3, 0x3010), .driver_data = AZX_DRIVER_GENERIC },
Bankim Bhavsar0f0714c52011-01-17 15:23:21 +01003125 /* VMware HDAudio */
3126 { PCI_DEVICE(0x15ad, 0x1977), .driver_data = AZX_DRIVER_GENERIC },
Andiry Brienza9176b672009-07-17 11:32:32 +08003127 /* AMD/ATI Generic, PCI class code and Vendor ID for HD Audio */
Yang, Libinc4da29c2008-11-13 11:07:07 +01003128 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_ANY_ID),
3129 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3130 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02003131 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_HDMI },
Andiry Brienza9176b672009-07-17 11:32:32 +08003132 { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_ANY_ID),
3133 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3134 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02003135 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_HDMI },
Linus Torvalds1da177e2005-04-16 15:20:36 -07003136 { 0, }
3137};
3138MODULE_DEVICE_TABLE(pci, azx_ids);
3139
3140/* pci_driver definition */
3141static struct pci_driver driver = {
Takashi Iwai3733e422011-06-10 16:20:20 +02003142 .name = KBUILD_MODNAME,
Linus Torvalds1da177e2005-04-16 15:20:36 -07003143 .id_table = azx_ids,
3144 .probe = azx_probe,
3145 .remove = __devexit_p(azx_remove),
Takashi Iwai421a1252005-11-17 16:11:09 +01003146#ifdef CONFIG_PM
3147 .suspend = azx_suspend,
3148 .resume = azx_resume,
3149#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07003150};
3151
3152static int __init alsa_card_azx_init(void)
3153{
Takashi Iwai01d25d42005-04-11 16:58:24 +02003154 return pci_register_driver(&driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003155}
3156
3157static void __exit alsa_card_azx_exit(void)
3158{
3159 pci_unregister_driver(&driver);
3160}
3161
3162module_init(alsa_card_azx_init)
3163module_exit(alsa_card_azx_exit)