blob: 45718fbb7de446e2d47cc4e7f866b353e10423a3 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 *
Takashi Iwaid01ce992007-07-27 16:52:19 +02003 * hda_intel.c - Implementation of primary alsa driver code base
4 * for Intel HD Audio.
Linus Torvalds1da177e2005-04-16 15:20:36 -07005 *
6 * Copyright(c) 2004 Intel Corporation. All rights reserved.
7 *
8 * Copyright (c) 2004 Takashi Iwai <tiwai@suse.de>
9 * PeiSen Hou <pshou@realtek.com.tw>
10 *
11 * This program is free software; you can redistribute it and/or modify it
12 * under the terms of the GNU General Public License as published by the Free
13 * Software Foundation; either version 2 of the License, or (at your option)
14 * any later version.
15 *
16 * This program is distributed in the hope that it will be useful, but WITHOUT
17 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
19 * more details.
20 *
21 * You should have received a copy of the GNU General Public License along with
22 * this program; if not, write to the Free Software Foundation, Inc., 59
23 * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24 *
25 * CONTACTS:
26 *
27 * Matt Jared matt.jared@intel.com
28 * Andy Kopp andy.kopp@intel.com
29 * Dan Kogan dan.d.kogan@intel.com
30 *
31 * CHANGES:
32 *
33 * 2004.12.01 Major rewrite by tiwai, merged the work of pshou
34 *
35 */
36
Linus Torvalds1da177e2005-04-16 15:20:36 -070037#include <linux/delay.h>
38#include <linux/interrupt.h>
Randy Dunlap362775e2005-11-07 14:43:23 +010039#include <linux/kernel.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070040#include <linux/module.h>
Andrew Morton24982c52008-03-04 10:08:58 +010041#include <linux/dma-mapping.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070042#include <linux/moduleparam.h>
43#include <linux/init.h>
44#include <linux/slab.h>
45#include <linux/pci.h>
Ingo Molnar62932df2006-01-16 16:34:20 +010046#include <linux/mutex.h>
Takashi Iwai0cbf0092008-10-29 16:18:25 +010047#include <linux/reboot.h>
Takashi Iwai27fe48d92011-09-28 17:16:09 +020048#include <linux/io.h>
Mengdong Linb8dfc4622012-08-23 17:32:30 +080049#include <linux/pm_runtime.h>
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -050050#include <linux/clocksource.h>
51#include <linux/time.h>
Takashi Iwaif4c482a2012-12-04 15:09:23 +010052#include <linux/completion.h>
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -050053
Takashi Iwai27fe48d92011-09-28 17:16:09 +020054#ifdef CONFIG_X86
55/* for snoop control */
56#include <asm/pgtable.h>
57#include <asm/cacheflush.h>
58#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070059#include <sound/core.h>
60#include <sound/initval.h>
Takashi Iwai91219472012-04-26 12:13:25 +020061#include <linux/vgaarb.h>
Takashi Iwaia82d51e2012-04-26 12:23:42 +020062#include <linux/vga_switcheroo.h>
Takashi Iwai4918cda2012-08-09 12:33:28 +020063#include <linux/firmware.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070064#include "hda_codec.h"
Wang Xingchao99a20082013-05-30 22:07:10 +080065#include "hda_i915.h"
Dylan Reid2538a4f2014-02-28 15:41:12 -080066#include "hda_priv.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070067
68
Takashi Iwai5aba4f82008-01-07 15:16:37 +010069static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
70static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
Rusty Russella67ff6a2011-12-15 13:49:36 +103071static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
Takashi Iwai5aba4f82008-01-07 15:16:37 +010072static char *model[SNDRV_CARDS];
Takashi Iwai1dac6692012-09-13 14:59:47 +020073static int position_fix[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = -1};
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +020074static int bdl_pos_adj[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = -1};
Takashi Iwai5aba4f82008-01-07 15:16:37 +010075static int probe_mask[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = -1};
Takashi Iwaid4d9cd032008-12-19 15:19:11 +010076static int probe_only[SNDRV_CARDS];
David Henningsson26a6cb62012-10-09 15:04:21 +020077static int jackpoll_ms[SNDRV_CARDS];
Rusty Russella67ff6a2011-12-15 13:49:36 +103078static bool single_cmd;
Takashi Iwai716238552009-09-28 13:14:04 +020079static int enable_msi = -1;
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +020080#ifdef CONFIG_SND_HDA_PATCH_LOADER
81static char *patch[SNDRV_CARDS];
82#endif
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +010083#ifdef CONFIG_SND_HDA_INPUT_BEEP
Takashi Iwai0920c9b2012-07-03 16:58:48 +020084static bool beep_mode[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] =
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +010085 CONFIG_SND_HDA_INPUT_BEEP_MODE};
86#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070087
Takashi Iwai5aba4f82008-01-07 15:16:37 +010088module_param_array(index, int, NULL, 0444);
Linus Torvalds1da177e2005-04-16 15:20:36 -070089MODULE_PARM_DESC(index, "Index value for Intel HD audio interface.");
Takashi Iwai5aba4f82008-01-07 15:16:37 +010090module_param_array(id, charp, NULL, 0444);
Linus Torvalds1da177e2005-04-16 15:20:36 -070091MODULE_PARM_DESC(id, "ID string for Intel HD audio interface.");
Takashi Iwai5aba4f82008-01-07 15:16:37 +010092module_param_array(enable, bool, NULL, 0444);
93MODULE_PARM_DESC(enable, "Enable Intel HD audio interface.");
94module_param_array(model, charp, NULL, 0444);
Linus Torvalds1da177e2005-04-16 15:20:36 -070095MODULE_PARM_DESC(model, "Use the given board model.");
Takashi Iwai5aba4f82008-01-07 15:16:37 +010096module_param_array(position_fix, int, NULL, 0444);
David Henningsson4cb36312010-09-30 10:12:50 +020097MODULE_PARM_DESC(position_fix, "DMA pointer read method."
Takashi Iwai1dac6692012-09-13 14:59:47 +020098 "(-1 = system default, 0 = auto, 1 = LPIB, 2 = POSBUF, 3 = VIACOMBO, 4 = COMBO).");
Takashi Iwai555e2192008-06-10 17:53:34 +020099module_param_array(bdl_pos_adj, int, NULL, 0644);
100MODULE_PARM_DESC(bdl_pos_adj, "BDL position adjustment offset.");
Takashi Iwai5aba4f82008-01-07 15:16:37 +0100101module_param_array(probe_mask, int, NULL, 0444);
Takashi Iwai606ad752005-11-24 16:03:40 +0100102MODULE_PARM_DESC(probe_mask, "Bitmask to probe codecs (default = -1).");
Jaroslav Kysela079e6832010-03-26 11:16:59 +0100103module_param_array(probe_only, int, NULL, 0444);
Takashi Iwaid4d9cd032008-12-19 15:19:11 +0100104MODULE_PARM_DESC(probe_only, "Only probing and no codec initialization.");
David Henningsson26a6cb62012-10-09 15:04:21 +0200105module_param_array(jackpoll_ms, int, NULL, 0444);
106MODULE_PARM_DESC(jackpoll_ms, "Ms between polling for jack events (default = 0, using unsol events only)");
Takashi Iwai27346162006-01-12 18:28:44 +0100107module_param(single_cmd, bool, 0444);
Takashi Iwaid01ce992007-07-27 16:52:19 +0200108MODULE_PARM_DESC(single_cmd, "Use single command to communicate with codecs "
109 "(for debugging only).");
Takashi Iwaiac9ef6c2012-01-20 12:08:44 +0100110module_param(enable_msi, bint, 0444);
Takashi Iwai134a11f2006-11-10 12:08:37 +0100111MODULE_PARM_DESC(enable_msi, "Enable Message Signaled Interrupt (MSI)");
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +0200112#ifdef CONFIG_SND_HDA_PATCH_LOADER
113module_param_array(patch, charp, NULL, 0444);
114MODULE_PARM_DESC(patch, "Patch file for Intel HD audio interface.");
115#endif
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +0100116#ifdef CONFIG_SND_HDA_INPUT_BEEP
Takashi Iwai0920c9b2012-07-03 16:58:48 +0200117module_param_array(beep_mode, bool, NULL, 0444);
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +0100118MODULE_PARM_DESC(beep_mode, "Select HDA Beep registration mode "
Takashi Iwai0920c9b2012-07-03 16:58:48 +0200119 "(0=off, 1=on) (default=1).");
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +0100120#endif
Takashi Iwai606ad752005-11-24 16:03:40 +0100121
Takashi Iwai83012a72012-08-24 18:38:08 +0200122#ifdef CONFIG_PM
Takashi Iwai65fcd412012-08-14 17:13:32 +0200123static int param_set_xint(const char *val, const struct kernel_param *kp);
124static struct kernel_param_ops param_ops_xint = {
125 .set = param_set_xint,
126 .get = param_get_int,
127};
128#define param_check_xint param_check_int
129
Takashi Iwaifee2fba2008-11-27 12:43:28 +0100130static int power_save = CONFIG_SND_HDA_POWER_SAVE_DEFAULT;
Takashi Iwai65fcd412012-08-14 17:13:32 +0200131module_param(power_save, xint, 0644);
Takashi Iwaifee2fba2008-11-27 12:43:28 +0100132MODULE_PARM_DESC(power_save, "Automatic power-saving timeout "
133 "(in second, 0 = disable).");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700134
Takashi Iwaidee1b662007-08-13 16:10:30 +0200135/* reset the HD-audio controller in power save mode.
136 * this may give more power-saving, but will take longer time to
137 * wake up.
138 */
Takashi Iwai8fc24422013-04-04 15:35:24 +0200139static bool power_save_controller = 1;
140module_param(power_save_controller, bool, 0644);
Takashi Iwaidee1b662007-08-13 16:10:30 +0200141MODULE_PARM_DESC(power_save_controller, "Reset controller in power save mode.");
Takashi Iwai83012a72012-08-24 18:38:08 +0200142#endif /* CONFIG_PM */
Takashi Iwaidee1b662007-08-13 16:10:30 +0200143
Takashi Iwai7bfe0592012-01-23 17:53:39 +0100144static int align_buffer_size = -1;
145module_param(align_buffer_size, bint, 0644);
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -0500146MODULE_PARM_DESC(align_buffer_size,
147 "Force buffer and period sizes to be multiple of 128 bytes.");
148
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200149#ifdef CONFIG_X86
150static bool hda_snoop = true;
151module_param_named(snoop, hda_snoop, bool, 0444);
152MODULE_PARM_DESC(snoop, "Enable/disable snooping");
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200153#else
154#define hda_snoop true
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200155#endif
156
157
Linus Torvalds1da177e2005-04-16 15:20:36 -0700158MODULE_LICENSE("GPL");
159MODULE_SUPPORTED_DEVICE("{{Intel, ICH6},"
160 "{Intel, ICH6M},"
Jason Gaston2f1b3812005-05-01 08:58:50 -0700161 "{Intel, ICH7},"
Frederick Lif5d40b32005-05-12 14:55:20 +0200162 "{Intel, ESB2},"
Jason Gastond2981392006-01-10 11:07:37 +0100163 "{Intel, ICH8},"
Jason Gastonf9cc8a82006-11-22 11:53:52 +0100164 "{Intel, ICH9},"
Jason Gastonc34f5a02008-01-29 12:38:49 +0100165 "{Intel, ICH10},"
Seth Heasleyb29c2362008-08-08 15:56:39 -0700166 "{Intel, PCH},"
Seth Heasleyd2f2fcd2010-01-12 17:03:35 -0800167 "{Intel, CPT},"
Seth Heasleyd2edeb72011-04-20 10:59:57 -0700168 "{Intel, PPT},"
Seth Heasley8bc039a2012-01-23 16:24:31 -0800169 "{Intel, LPT},"
James Ralston144dad92012-08-09 09:38:59 -0700170 "{Intel, LPT_LP},"
James Ralston4eeca492013-11-04 09:27:45 -0800171 "{Intel, WPT_LP},"
Wang Xingchaoe926f2c2012-06-13 10:23:51 +0800172 "{Intel, HPT},"
Seth Heasleycea310e2010-09-10 16:29:56 -0700173 "{Intel, PBG},"
Tobin Davis4979bca2008-01-30 08:13:55 +0100174 "{Intel, SCH},"
Takashi Iwaifc20a562005-05-12 15:00:41 +0200175 "{ATI, SB450},"
Felix Kuehling89be83f2006-03-31 12:33:59 +0200176 "{ATI, SB600},"
Felix Kuehling778b6e12006-05-17 11:22:21 +0200177 "{ATI, RS600},"
Felix Kuehling5b15c952006-10-16 12:49:47 +0200178 "{ATI, RS690},"
Wolke Liue6db1112007-04-27 12:20:57 +0200179 "{ATI, RS780},"
180 "{ATI, R600},"
Herton Ronaldo Krzesinski2797f722007-11-05 18:21:56 +0100181 "{ATI, RV630},"
182 "{ATI, RV610},"
Wolke Liu27da1832007-11-16 11:06:30 +0100183 "{ATI, RV670},"
184 "{ATI, RV635},"
185 "{ATI, RV620},"
186 "{ATI, RV770},"
Takashi Iwaifc20a562005-05-12 15:00:41 +0200187 "{VIA, VT8251},"
Takashi Iwai47672312005-08-12 16:44:04 +0200188 "{VIA, VT8237A},"
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200189 "{SiS, SIS966},"
190 "{ULI, M5461}}");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700191MODULE_DESCRIPTION("Intel HDA driver");
192
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200193#if defined(CONFIG_PM) && defined(CONFIG_VGA_SWITCHEROO)
Takashi Iwaif8f1bec2014-02-06 18:14:03 +0100194#if IS_ENABLED(CONFIG_SND_HDA_CODEC_HDMI)
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200195#define SUPPORT_VGA_SWITCHEROO
196#endif
197#endif
198
199
Takashi Iwaicb53c622007-08-10 17:21:45 +0200200/*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700201 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700202
Takashi Iwaieb49faa2013-03-15 09:19:11 +0100203/* DSP lock helpers */
204#ifdef CONFIG_SND_HDA_DSP_LOADER
205#define dsp_lock_init(dev) mutex_init(&(dev)->dsp_mutex)
206#define dsp_lock(dev) mutex_lock(&(dev)->dsp_mutex)
207#define dsp_unlock(dev) mutex_unlock(&(dev)->dsp_mutex)
208#define dsp_is_locked(dev) ((dev)->locked)
209#else
210#define dsp_lock_init(dev) do {} while (0)
211#define dsp_lock(dev) do {} while (0)
212#define dsp_unlock(dev) do {} while (0)
213#define dsp_is_locked(dev) 0
214#endif
215
Takashi Iwai1a8506d2012-10-16 15:10:08 +0200216#define CREATE_TRACE_POINTS
217#include "hda_intel_trace.h"
218
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200219/* driver types */
220enum {
221 AZX_DRIVER_ICH,
Seth Heasley32679f92010-02-22 17:31:09 -0800222 AZX_DRIVER_PCH,
Tobin Davis4979bca2008-01-30 08:13:55 +0100223 AZX_DRIVER_SCH,
Takashi Iwaifab12852013-11-05 17:54:05 +0100224 AZX_DRIVER_HDMI,
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200225 AZX_DRIVER_ATI,
Felix Kuehling778b6e12006-05-17 11:22:21 +0200226 AZX_DRIVER_ATIHDMI,
Andiry Xu1815b342011-12-14 16:10:27 +0800227 AZX_DRIVER_ATIHDMI_NS,
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200228 AZX_DRIVER_VIA,
229 AZX_DRIVER_SIS,
230 AZX_DRIVER_ULI,
Vinod Gda3fca22005-09-13 18:49:12 +0200231 AZX_DRIVER_NVIDIA,
Kailang Yangf2690022008-05-27 11:44:55 +0200232 AZX_DRIVER_TERA,
Takashi Iwai14d34f12010-10-21 09:03:25 +0200233 AZX_DRIVER_CTX,
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200234 AZX_DRIVER_CTHDA,
Yang, Libinc4da29c2008-11-13 11:07:07 +0100235 AZX_DRIVER_GENERIC,
Takashi Iwai2f5983f2008-09-03 16:00:44 +0200236 AZX_NUM_DRIVERS, /* keep this as last entry */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200237};
238
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +0100239/* quirks for Intel PCH */
Takashi Iwaid7dab4d2013-01-08 13:51:30 +0100240#define AZX_DCAPS_INTEL_PCH_NOPM \
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +0100241 (AZX_DCAPS_SCH_SNOOP | AZX_DCAPS_BUFSIZE | \
Takashi Iwaid7dab4d2013-01-08 13:51:30 +0100242 AZX_DCAPS_COUNT_LPIB_DELAY)
243
244#define AZX_DCAPS_INTEL_PCH \
245 (AZX_DCAPS_INTEL_PCH_NOPM | AZX_DCAPS_PM_RUNTIME)
Takashi Iwai9477c582011-05-25 09:11:37 +0200246
Takashi Iwai33499a12013-11-05 17:34:46 +0100247#define AZX_DCAPS_INTEL_HASWELL \
248 (AZX_DCAPS_SCH_SNOOP | AZX_DCAPS_ALIGN_BUFSIZE | \
249 AZX_DCAPS_COUNT_LPIB_DELAY | AZX_DCAPS_PM_RUNTIME | \
250 AZX_DCAPS_I915_POWERWELL)
251
Takashi Iwai9477c582011-05-25 09:11:37 +0200252/* quirks for ATI SB / AMD Hudson */
253#define AZX_DCAPS_PRESET_ATI_SB \
254 (AZX_DCAPS_ATI_SNOOP | AZX_DCAPS_NO_TCSEL | \
255 AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB)
256
257/* quirks for ATI/AMD HDMI */
258#define AZX_DCAPS_PRESET_ATI_HDMI \
259 (AZX_DCAPS_NO_TCSEL | AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB)
260
261/* quirks for Nvidia */
262#define AZX_DCAPS_PRESET_NVIDIA \
Takashi Iwai7bfe0592012-01-23 17:53:39 +0100263 (AZX_DCAPS_NVIDIA_SNOOP | AZX_DCAPS_RIRB_DELAY | AZX_DCAPS_NO_MSI |\
Mike Travis49d9e772013-05-01 14:04:08 -0500264 AZX_DCAPS_ALIGN_BUFSIZE | AZX_DCAPS_NO_64BIT)
Takashi Iwai9477c582011-05-25 09:11:37 +0200265
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200266#define AZX_DCAPS_PRESET_CTHDA \
267 (AZX_DCAPS_NO_MSI | AZX_DCAPS_POSFIX_LPIB | AZX_DCAPS_4K_BDLE_BOUNDARY)
268
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200269/*
270 * VGA-switcher support
271 */
272#ifdef SUPPORT_VGA_SWITCHEROO
Takashi Iwai5cb543d2012-08-09 13:49:23 +0200273#define use_vga_switcheroo(chip) ((chip)->use_vga_switcheroo)
274#else
275#define use_vga_switcheroo(chip) 0
276#endif
277
Takashi Iwai48c8b0e2012-12-07 07:40:35 +0100278static char *driver_short_names[] = {
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200279 [AZX_DRIVER_ICH] = "HDA Intel",
Seth Heasley32679f92010-02-22 17:31:09 -0800280 [AZX_DRIVER_PCH] = "HDA Intel PCH",
Tobin Davis4979bca2008-01-30 08:13:55 +0100281 [AZX_DRIVER_SCH] = "HDA Intel MID",
Takashi Iwaifab12852013-11-05 17:54:05 +0100282 [AZX_DRIVER_HDMI] = "HDA Intel HDMI",
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200283 [AZX_DRIVER_ATI] = "HDA ATI SB",
Felix Kuehling778b6e12006-05-17 11:22:21 +0200284 [AZX_DRIVER_ATIHDMI] = "HDA ATI HDMI",
Andiry Xu1815b342011-12-14 16:10:27 +0800285 [AZX_DRIVER_ATIHDMI_NS] = "HDA ATI HDMI",
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200286 [AZX_DRIVER_VIA] = "HDA VIA VT82xx",
287 [AZX_DRIVER_SIS] = "HDA SIS966",
Vinod Gda3fca22005-09-13 18:49:12 +0200288 [AZX_DRIVER_ULI] = "HDA ULI M5461",
289 [AZX_DRIVER_NVIDIA] = "HDA NVidia",
Kailang Yangf2690022008-05-27 11:44:55 +0200290 [AZX_DRIVER_TERA] = "HDA Teradici",
Takashi Iwai14d34f12010-10-21 09:03:25 +0200291 [AZX_DRIVER_CTX] = "HDA Creative",
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200292 [AZX_DRIVER_CTHDA] = "HDA Creative",
Yang, Libinc4da29c2008-11-13 11:07:07 +0100293 [AZX_DRIVER_GENERIC] = "HD-Audio Generic",
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200294};
295
Linus Torvalds1da177e2005-04-16 15:20:36 -0700296/* for pcm support */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100297#define get_azx_dev(substream) (substream->runtime->private_data)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700298
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200299#ifdef CONFIG_X86
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100300static void __mark_pages_wc(struct azx *chip, struct snd_dma_buffer *dmab, bool on)
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200301{
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100302 int pages;
303
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200304 if (azx_snoop(chip))
305 return;
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100306 if (!dmab || !dmab->area || !dmab->bytes)
307 return;
308
309#ifdef CONFIG_SND_DMA_SGBUF
310 if (dmab->dev.type == SNDRV_DMA_TYPE_DEV_SG) {
311 struct snd_sg_buf *sgbuf = dmab->private_data;
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200312 if (on)
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100313 set_pages_array_wc(sgbuf->page_table, sgbuf->pages);
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200314 else
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100315 set_pages_array_wb(sgbuf->page_table, sgbuf->pages);
316 return;
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200317 }
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100318#endif
319
320 pages = (dmab->bytes + PAGE_SIZE - 1) >> PAGE_SHIFT;
321 if (on)
322 set_memory_wc((unsigned long)dmab->area, pages);
323 else
324 set_memory_wb((unsigned long)dmab->area, pages);
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200325}
326
327static inline void mark_pages_wc(struct azx *chip, struct snd_dma_buffer *buf,
328 bool on)
329{
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100330 __mark_pages_wc(chip, buf, on);
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200331}
332static inline void mark_runtime_wc(struct azx *chip, struct azx_dev *azx_dev,
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100333 struct snd_pcm_substream *substream, bool on)
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200334{
335 if (azx_dev->wc_marked != on) {
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100336 __mark_pages_wc(chip, snd_pcm_get_dma_buf(substream), on);
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200337 azx_dev->wc_marked = on;
338 }
339}
340#else
341/* NOP for other archs */
342static inline void mark_pages_wc(struct azx *chip, struct snd_dma_buffer *buf,
343 bool on)
344{
345}
346static inline void mark_runtime_wc(struct azx *chip, struct azx_dev *azx_dev,
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100347 struct snd_pcm_substream *substream, bool on)
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200348{
349}
350#endif
351
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200352static int azx_acquire_irq(struct azx *chip, int do_disconnect);
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200353static int azx_send_cmd(struct hda_bus *bus, unsigned int val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700354/*
355 * Interface for HD codec
356 */
357
Linus Torvalds1da177e2005-04-16 15:20:36 -0700358/*
359 * CORB / RIRB interface
360 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100361static int azx_alloc_cmd_io(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700362{
363 int err;
364
365 /* single page (at least 4096 bytes) must suffice for both ringbuffes */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200366 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
367 snd_dma_pci_data(chip->pci),
Linus Torvalds1da177e2005-04-16 15:20:36 -0700368 PAGE_SIZE, &chip->rb);
369 if (err < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +0100370 dev_err(chip->card->dev, "cannot allocate CORB/RIRB\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700371 return err;
372 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200373 mark_pages_wc(chip, &chip->rb, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700374 return 0;
375}
376
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100377static void azx_init_cmd_io(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700378{
David Henningssonca460f82014-02-28 07:56:58 +0100379 int timeout;
380
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800381 spin_lock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700382 /* CORB set up */
383 chip->corb.addr = chip->rb.addr;
384 chip->corb.buf = (u32 *)chip->rb.area;
385 azx_writel(chip, CORBLBASE, (u32)chip->corb.addr);
Takashi Iwai766979e2008-06-13 20:53:56 +0200386 azx_writel(chip, CORBUBASE, upper_32_bits(chip->corb.addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700387
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200388 /* set the corb size to 256 entries (ULI requires explicitly) */
389 azx_writeb(chip, CORBSIZE, 0x02);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700390 /* set the corb write pointer to 0 */
391 azx_writew(chip, CORBWP, 0);
David Henningssonca460f82014-02-28 07:56:58 +0100392
Linus Torvalds1da177e2005-04-16 15:20:36 -0700393 /* reset the corb hw read pointer */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200394 azx_writew(chip, CORBRP, ICH6_CORBRP_RST);
David Henningssonca460f82014-02-28 07:56:58 +0100395 for (timeout = 1000; timeout > 0; timeout--) {
396 if ((azx_readw(chip, CORBRP) & ICH6_CORBRP_RST) == ICH6_CORBRP_RST)
397 break;
398 udelay(1);
399 }
400 if (timeout <= 0)
401 dev_err(chip->card->dev, "CORB reset timeout#1, CORBRP = %d\n",
402 azx_readw(chip, CORBRP));
403
404 azx_writew(chip, CORBRP, 0);
405 for (timeout = 1000; timeout > 0; timeout--) {
406 if (azx_readw(chip, CORBRP) == 0)
407 break;
408 udelay(1);
409 }
410 if (timeout <= 0)
411 dev_err(chip->card->dev, "CORB reset timeout#2, CORBRP = %d\n",
412 azx_readw(chip, CORBRP));
413
Linus Torvalds1da177e2005-04-16 15:20:36 -0700414 /* enable corb dma */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200415 azx_writeb(chip, CORBCTL, ICH6_CORBCTL_RUN);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700416
417 /* RIRB set up */
418 chip->rirb.addr = chip->rb.addr + 2048;
419 chip->rirb.buf = (u32 *)(chip->rb.area + 2048);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800420 chip->rirb.wp = chip->rirb.rp = 0;
421 memset(chip->rirb.cmds, 0, sizeof(chip->rirb.cmds));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700422 azx_writel(chip, RIRBLBASE, (u32)chip->rirb.addr);
Takashi Iwai766979e2008-06-13 20:53:56 +0200423 azx_writel(chip, RIRBUBASE, upper_32_bits(chip->rirb.addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700424
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200425 /* set the rirb size to 256 entries (ULI requires explicitly) */
426 azx_writeb(chip, RIRBSIZE, 0x02);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700427 /* reset the rirb hw write pointer */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200428 azx_writew(chip, RIRBWP, ICH6_RIRBWP_RST);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700429 /* set N=1, get RIRB response interrupt for new entry */
Takashi Iwai9477c582011-05-25 09:11:37 +0200430 if (chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND)
Takashi Iwai14d34f12010-10-21 09:03:25 +0200431 azx_writew(chip, RINTCNT, 0xc0);
432 else
433 azx_writew(chip, RINTCNT, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700434 /* enable rirb dma and response irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700435 azx_writeb(chip, RIRBCTL, ICH6_RBCTL_DMA_EN | ICH6_RBCTL_IRQ_EN);
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800436 spin_unlock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700437}
438
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100439static void azx_free_cmd_io(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700440{
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800441 spin_lock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700442 /* disable ringbuffer DMAs */
443 azx_writeb(chip, RIRBCTL, 0);
444 azx_writeb(chip, CORBCTL, 0);
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800445 spin_unlock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700446}
447
Wu Fengguangdeadff12009-08-01 18:45:16 +0800448static unsigned int azx_command_addr(u32 cmd)
449{
450 unsigned int addr = cmd >> 28;
451
452 if (addr >= AZX_MAX_CODECS) {
453 snd_BUG();
454 addr = 0;
455 }
456
457 return addr;
458}
459
Linus Torvalds1da177e2005-04-16 15:20:36 -0700460/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100461static int azx_corb_send_cmd(struct hda_bus *bus, u32 val)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700462{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100463 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800464 unsigned int addr = azx_command_addr(val);
Takashi Iwai3bcce5c2012-12-20 11:17:17 +0100465 unsigned int wp, rp;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700466
Wu Fengguangc32649f2009-08-01 18:48:12 +0800467 spin_lock_irq(&chip->reg_lock);
468
Linus Torvalds1da177e2005-04-16 15:20:36 -0700469 /* add command to corb */
Takashi Iwaicc5ede32012-12-12 11:10:49 +0100470 wp = azx_readw(chip, CORBWP);
471 if (wp == 0xffff) {
472 /* something wrong, controller likely turned to D3 */
473 spin_unlock_irq(&chip->reg_lock);
Takashi Iwai3bcce5c2012-12-20 11:17:17 +0100474 return -EIO;
Takashi Iwaicc5ede32012-12-12 11:10:49 +0100475 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700476 wp++;
477 wp %= ICH6_MAX_CORB_ENTRIES;
478
Takashi Iwai3bcce5c2012-12-20 11:17:17 +0100479 rp = azx_readw(chip, CORBRP);
480 if (wp == rp) {
481 /* oops, it's full */
482 spin_unlock_irq(&chip->reg_lock);
483 return -EAGAIN;
484 }
485
Wu Fengguangdeadff12009-08-01 18:45:16 +0800486 chip->rirb.cmds[addr]++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700487 chip->corb.buf[wp] = cpu_to_le32(val);
David Henningssonca460f82014-02-28 07:56:58 +0100488 azx_writew(chip, CORBWP, wp);
Wu Fengguangc32649f2009-08-01 18:48:12 +0800489
Linus Torvalds1da177e2005-04-16 15:20:36 -0700490 spin_unlock_irq(&chip->reg_lock);
491
492 return 0;
493}
494
495#define ICH6_RIRB_EX_UNSOL_EV (1<<4)
496
497/* retrieve RIRB entry - called from interrupt handler */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100498static void azx_update_rirb(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700499{
500 unsigned int rp, wp;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800501 unsigned int addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700502 u32 res, res_ex;
503
Takashi Iwaicc5ede32012-12-12 11:10:49 +0100504 wp = azx_readw(chip, RIRBWP);
505 if (wp == 0xffff) {
506 /* something wrong, controller likely turned to D3 */
507 return;
508 }
509
Linus Torvalds1da177e2005-04-16 15:20:36 -0700510 if (wp == chip->rirb.wp)
511 return;
512 chip->rirb.wp = wp;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800513
Linus Torvalds1da177e2005-04-16 15:20:36 -0700514 while (chip->rirb.rp != wp) {
515 chip->rirb.rp++;
516 chip->rirb.rp %= ICH6_MAX_RIRB_ENTRIES;
517
518 rp = chip->rirb.rp << 1; /* an RIRB entry is 8-bytes */
519 res_ex = le32_to_cpu(chip->rirb.buf[rp + 1]);
520 res = le32_to_cpu(chip->rirb.buf[rp]);
David Henningsson3d692452014-01-29 13:12:31 +0100521 addr = res_ex & 0xf;
522 if ((addr >= AZX_MAX_CODECS) || !(chip->codec_mask & (1 << addr))) {
Takashi Iwai4e76a882014-02-25 12:21:03 +0100523 dev_err(chip->card->dev, "spurious response %#x:%#x, rp = %d, wp = %d",
524 res, res_ex,
525 chip->rirb.rp, wp);
David Henningsson3d692452014-01-29 13:12:31 +0100526 snd_BUG();
527 }
528 else if (res_ex & ICH6_RIRB_EX_UNSOL_EV)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700529 snd_hda_queue_unsol_event(chip->bus, res, res_ex);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800530 else if (chip->rirb.cmds[addr]) {
531 chip->rirb.res[addr] = res;
Takashi Iwai2add9b92008-03-18 09:47:06 +0100532 smp_wmb();
Wu Fengguangdeadff12009-08-01 18:45:16 +0800533 chip->rirb.cmds[addr]--;
Joe Perches3b70a672013-11-07 11:55:15 -0800534 } else if (printk_ratelimit()) {
Takashi Iwai4e76a882014-02-25 12:21:03 +0100535 dev_err(chip->card->dev, "spurious response %#x:%#x, last cmd=%#08x\n",
536 res, res_ex,
537 chip->last_cmd[addr]);
Joe Perches3b70a672013-11-07 11:55:15 -0800538 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700539 }
540}
541
542/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800543static unsigned int azx_rirb_get_response(struct hda_bus *bus,
544 unsigned int addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700545{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100546 struct azx *chip = bus->private_data;
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200547 unsigned long timeout;
David Henningsson32cf4022012-05-04 11:05:55 +0200548 unsigned long loopcounter;
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200549 int do_poll = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700550
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200551 again:
552 timeout = jiffies + msecs_to_jiffies(1000);
David Henningsson32cf4022012-05-04 11:05:55 +0200553
554 for (loopcounter = 0;; loopcounter++) {
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200555 if (chip->polling_mode || do_poll) {
Takashi Iwaie96224a2006-08-21 17:57:44 +0200556 spin_lock_irq(&chip->reg_lock);
557 azx_update_rirb(chip);
558 spin_unlock_irq(&chip->reg_lock);
559 }
Wu Fengguangdeadff12009-08-01 18:45:16 +0800560 if (!chip->rirb.cmds[addr]) {
Takashi Iwai2add9b92008-03-18 09:47:06 +0100561 smp_rmb();
Takashi Iwaib6132912009-03-24 07:36:09 +0100562 bus->rirb_error = 0;
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200563
564 if (!do_poll)
565 chip->poll_count = 0;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800566 return chip->rirb.res[addr]; /* the last value */
Takashi Iwai2add9b92008-03-18 09:47:06 +0100567 }
Takashi Iwai28a0d9d2008-01-18 15:32:32 +0100568 if (time_after(jiffies, timeout))
569 break;
David Henningsson32cf4022012-05-04 11:05:55 +0200570 if (bus->needs_damn_long_delay || loopcounter > 3000)
Takashi Iwai52987652008-01-16 16:09:47 +0100571 msleep(2); /* temporary workaround */
572 else {
573 udelay(10);
574 cond_resched();
575 }
Takashi Iwai28a0d9d2008-01-18 15:32:32 +0100576 }
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200577
Takashi Iwai63e51fd2013-06-06 14:20:19 +0200578 if (!bus->no_response_fallback)
579 return -1;
580
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200581 if (!chip->polling_mode && chip->poll_count < 2) {
Takashi Iwai4e76a882014-02-25 12:21:03 +0100582 dev_dbg(chip->card->dev,
583 "azx_get_response timeout, polling the codec once: last cmd=0x%08x\n",
584 chip->last_cmd[addr]);
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200585 do_poll = 1;
586 chip->poll_count++;
587 goto again;
588 }
589
590
Takashi Iwai23c4a882009-10-30 13:21:49 +0100591 if (!chip->polling_mode) {
Takashi Iwai4e76a882014-02-25 12:21:03 +0100592 dev_warn(chip->card->dev,
593 "azx_get_response timeout, switching to polling mode: last cmd=0x%08x\n",
594 chip->last_cmd[addr]);
Takashi Iwai23c4a882009-10-30 13:21:49 +0100595 chip->polling_mode = 1;
596 goto again;
597 }
598
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200599 if (chip->msi) {
Takashi Iwai4e76a882014-02-25 12:21:03 +0100600 dev_warn(chip->card->dev,
601 "No response from codec, disabling MSI: last cmd=0x%08x\n",
602 chip->last_cmd[addr]);
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200603 free_irq(chip->irq, chip);
604 chip->irq = -1;
605 pci_disable_msi(chip->pci);
606 chip->msi = 0;
Takashi Iwaib6132912009-03-24 07:36:09 +0100607 if (azx_acquire_irq(chip, 1) < 0) {
608 bus->rirb_error = 1;
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200609 return -1;
Takashi Iwaib6132912009-03-24 07:36:09 +0100610 }
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200611 goto again;
612 }
613
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +0100614 if (chip->probing) {
615 /* If this critical timeout happens during the codec probing
616 * phase, this is likely an access to a non-existing codec
617 * slot. Better to return an error and reset the system.
618 */
619 return -1;
620 }
621
Takashi Iwai8dd78332009-06-02 01:16:07 +0200622 /* a fatal communication error; need either to reset or to fallback
623 * to the single_cmd mode
624 */
Takashi Iwaib6132912009-03-24 07:36:09 +0100625 bus->rirb_error = 1;
Takashi Iwaib20f3b82009-06-02 01:20:22 +0200626 if (bus->allow_bus_reset && !bus->response_reset && !bus->in_reset) {
Takashi Iwai8dd78332009-06-02 01:16:07 +0200627 bus->response_reset = 1;
628 return -1; /* give a chance to retry */
629 }
630
Takashi Iwai4e76a882014-02-25 12:21:03 +0100631 dev_err(chip->card->dev,
632 "azx_get_response timeout, switching to single_cmd mode: last cmd=0x%08x\n",
633 chip->last_cmd[addr]);
Takashi Iwai8dd78332009-06-02 01:16:07 +0200634 chip->single_cmd = 1;
635 bus->response_reset = 0;
Takashi Iwai1a696972009-11-07 09:49:04 +0100636 /* release CORB/RIRB */
Takashi Iwai4fcd3922009-05-25 18:34:52 +0200637 azx_free_cmd_io(chip);
Takashi Iwai1a696972009-11-07 09:49:04 +0100638 /* disable unsolicited responses */
639 azx_writel(chip, GCTL, azx_readl(chip, GCTL) & ~ICH6_GCTL_UNSOL);
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200640 return -1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700641}
642
Linus Torvalds1da177e2005-04-16 15:20:36 -0700643/*
644 * Use the single immediate command instead of CORB/RIRB for simplicity
645 *
646 * Note: according to Intel, this is not preferred use. The command was
647 * intended for the BIOS only, and may get confused with unsolicited
648 * responses. So, we shouldn't use it for normal operation from the
649 * driver.
650 * I left the codes, however, for debugging/testing purposes.
651 */
652
Takashi Iwaib05a7d42009-05-28 11:59:12 +0200653/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800654static int azx_single_wait_for_response(struct azx *chip, unsigned int addr)
Takashi Iwaib05a7d42009-05-28 11:59:12 +0200655{
656 int timeout = 50;
657
658 while (timeout--) {
659 /* check IRV busy bit */
660 if (azx_readw(chip, IRS) & ICH6_IRS_VALID) {
661 /* reuse rirb.res as the response return value */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800662 chip->rirb.res[addr] = azx_readl(chip, IR);
Takashi Iwaib05a7d42009-05-28 11:59:12 +0200663 return 0;
664 }
665 udelay(1);
666 }
667 if (printk_ratelimit())
Takashi Iwai4e76a882014-02-25 12:21:03 +0100668 dev_dbg(chip->card->dev, "get_response timeout: IRS=0x%x\n",
669 azx_readw(chip, IRS));
Wu Fengguangdeadff12009-08-01 18:45:16 +0800670 chip->rirb.res[addr] = -1;
Takashi Iwaib05a7d42009-05-28 11:59:12 +0200671 return -EIO;
672}
673
Linus Torvalds1da177e2005-04-16 15:20:36 -0700674/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100675static int azx_single_send_cmd(struct hda_bus *bus, u32 val)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700676{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100677 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800678 unsigned int addr = azx_command_addr(val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700679 int timeout = 50;
680
Takashi Iwai8dd78332009-06-02 01:16:07 +0200681 bus->rirb_error = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700682 while (timeout--) {
683 /* check ICB busy bit */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200684 if (!((azx_readw(chip, IRS) & ICH6_IRS_BUSY))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700685 /* Clear IRV valid bit */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200686 azx_writew(chip, IRS, azx_readw(chip, IRS) |
687 ICH6_IRS_VALID);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700688 azx_writel(chip, IC, val);
Takashi Iwaid01ce992007-07-27 16:52:19 +0200689 azx_writew(chip, IRS, azx_readw(chip, IRS) |
690 ICH6_IRS_BUSY);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800691 return azx_single_wait_for_response(chip, addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700692 }
693 udelay(1);
694 }
Marc Boucher1cfd52b2008-01-22 15:29:26 +0100695 if (printk_ratelimit())
Takashi Iwai4e76a882014-02-25 12:21:03 +0100696 dev_dbg(chip->card->dev,
697 "send_cmd timeout: IRS=0x%x, val=0x%x\n",
698 azx_readw(chip, IRS), val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700699 return -EIO;
700}
701
702/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800703static unsigned int azx_single_get_response(struct hda_bus *bus,
704 unsigned int addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700705{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100706 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800707 return chip->rirb.res[addr];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700708}
709
Takashi Iwai111d3af2006-02-16 18:17:58 +0100710/*
711 * The below are the main callbacks from hda_codec.
712 *
713 * They are just the skeleton to call sub-callbacks according to the
714 * current setting of chip->single_cmd.
715 */
716
717/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100718static int azx_send_cmd(struct hda_bus *bus, unsigned int val)
Takashi Iwai111d3af2006-02-16 18:17:58 +0100719{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100720 struct azx *chip = bus->private_data;
Takashi Iwai43bbb6c2007-07-06 20:22:05 +0200721
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200722 if (chip->disabled)
723 return 0;
Wu Fengguangfeb27342009-08-01 19:17:14 +0800724 chip->last_cmd[azx_command_addr(val)] = val;
Takashi Iwai111d3af2006-02-16 18:17:58 +0100725 if (chip->single_cmd)
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100726 return azx_single_send_cmd(bus, val);
Takashi Iwai111d3af2006-02-16 18:17:58 +0100727 else
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100728 return azx_corb_send_cmd(bus, val);
Takashi Iwai111d3af2006-02-16 18:17:58 +0100729}
730
731/* get a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800732static unsigned int azx_get_response(struct hda_bus *bus,
733 unsigned int addr)
Takashi Iwai111d3af2006-02-16 18:17:58 +0100734{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100735 struct azx *chip = bus->private_data;
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200736 if (chip->disabled)
737 return 0;
Takashi Iwai111d3af2006-02-16 18:17:58 +0100738 if (chip->single_cmd)
Wu Fengguangdeadff12009-08-01 18:45:16 +0800739 return azx_single_get_response(bus, addr);
Takashi Iwai111d3af2006-02-16 18:17:58 +0100740 else
Wu Fengguangdeadff12009-08-01 18:45:16 +0800741 return azx_rirb_get_response(bus, addr);
Takashi Iwai111d3af2006-02-16 18:17:58 +0100742}
743
Takashi Iwai83012a72012-08-24 18:38:08 +0200744#ifdef CONFIG_PM
Takashi Iwai68467f52012-08-28 09:14:29 -0700745static void azx_power_notify(struct hda_bus *bus, bool power_up);
Takashi Iwaicb53c622007-08-10 17:21:45 +0200746#endif
Takashi Iwai111d3af2006-02-16 18:17:58 +0100747
Takashi Iwai1d1a4562012-09-20 20:29:13 -0700748#ifdef CONFIG_SND_HDA_DSP_LOADER
749static int azx_load_dsp_prepare(struct hda_bus *bus, unsigned int format,
750 unsigned int byte_size,
751 struct snd_dma_buffer *bufp);
752static void azx_load_dsp_trigger(struct hda_bus *bus, bool start);
753static void azx_load_dsp_cleanup(struct hda_bus *bus,
754 struct snd_dma_buffer *dmab);
755#endif
756
Mengdong Lin3af3f352013-06-24 10:18:54 -0400757/* enter link reset */
Mengdong Lin7295b262013-06-25 05:58:49 -0400758static void azx_enter_link_reset(struct azx *chip)
Mengdong Lin3af3f352013-06-24 10:18:54 -0400759{
760 unsigned long timeout;
761
762 /* reset controller */
763 azx_writel(chip, GCTL, azx_readl(chip, GCTL) & ~ICH6_GCTL_RESET);
764
765 timeout = jiffies + msecs_to_jiffies(100);
766 while ((azx_readb(chip, GCTL) & ICH6_GCTL_RESET) &&
767 time_before(jiffies, timeout))
768 usleep_range(500, 1000);
769}
770
Mengdong Lin7295b262013-06-25 05:58:49 -0400771/* exit link reset */
772static void azx_exit_link_reset(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700773{
Mengdong Linfa348da2012-12-12 09:16:15 -0500774 unsigned long timeout;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700775
Mengdong Lin7295b262013-06-25 05:58:49 -0400776 azx_writeb(chip, GCTL, azx_readb(chip, GCTL) | ICH6_GCTL_RESET);
777
778 timeout = jiffies + msecs_to_jiffies(100);
779 while (!azx_readb(chip, GCTL) &&
780 time_before(jiffies, timeout))
781 usleep_range(500, 1000);
782}
783
784/* reset codec link */
785static int azx_reset(struct azx *chip, int full_reset)
786{
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +0100787 if (!full_reset)
788 goto __skip;
789
Danny Tholene8a7f132007-09-11 21:41:56 +0200790 /* clear STATESTS */
Wang Xingchaoda7db6a2013-07-22 03:19:18 -0400791 azx_writew(chip, STATESTS, STATESTS_INT_MASK);
Danny Tholene8a7f132007-09-11 21:41:56 +0200792
Linus Torvalds1da177e2005-04-16 15:20:36 -0700793 /* reset controller */
Mengdong Lin7295b262013-06-25 05:58:49 -0400794 azx_enter_link_reset(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700795
796 /* delay for >= 100us for codec PLL to settle per spec
797 * Rev 0.9 section 5.5.1
798 */
Mengdong Linfa348da2012-12-12 09:16:15 -0500799 usleep_range(500, 1000);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700800
801 /* Bring controller out of reset */
Mengdong Lin7295b262013-06-25 05:58:49 -0400802 azx_exit_link_reset(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700803
Pavel Machek927fc862006-08-31 17:03:43 +0200804 /* Brent Chartrand said to wait >= 540us for codecs to initialize */
Mengdong Linfa348da2012-12-12 09:16:15 -0500805 usleep_range(1000, 1200);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700806
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +0100807 __skip:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700808 /* check to see if controller is ready */
Pavel Machek927fc862006-08-31 17:03:43 +0200809 if (!azx_readb(chip, GCTL)) {
Takashi Iwai4e76a882014-02-25 12:21:03 +0100810 dev_dbg(chip->card->dev, "azx_reset: controller not ready!\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700811 return -EBUSY;
812 }
813
Matt41e2fce2005-07-04 17:49:55 +0200814 /* Accept unsolicited responses */
Takashi Iwai1a696972009-11-07 09:49:04 +0100815 if (!chip->single_cmd)
816 azx_writel(chip, GCTL, azx_readl(chip, GCTL) |
817 ICH6_GCTL_UNSOL);
Matt41e2fce2005-07-04 17:49:55 +0200818
Linus Torvalds1da177e2005-04-16 15:20:36 -0700819 /* detect codecs */
Pavel Machek927fc862006-08-31 17:03:43 +0200820 if (!chip->codec_mask) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700821 chip->codec_mask = azx_readw(chip, STATESTS);
Takashi Iwai4e76a882014-02-25 12:21:03 +0100822 dev_dbg(chip->card->dev, "codec_mask = 0x%x\n",
823 chip->codec_mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700824 }
825
826 return 0;
827}
828
829
830/*
831 * Lowlevel interface
832 */
833
834/* enable interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100835static void azx_int_enable(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700836{
837 /* enable controller CIE and GIE */
838 azx_writel(chip, INTCTL, azx_readl(chip, INTCTL) |
839 ICH6_INT_CTRL_EN | ICH6_INT_GLOBAL_EN);
840}
841
842/* disable interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100843static void azx_int_disable(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700844{
845 int i;
846
847 /* disable interrupts in stream descriptor */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200848 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100849 struct azx_dev *azx_dev = &chip->azx_dev[i];
Dylan Reid40830812014-02-28 15:41:13 -0800850 azx_sd_writeb(chip, azx_dev, SD_CTL,
851 azx_sd_readb(chip, azx_dev, SD_CTL) &
852 ~SD_INT_MASK);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700853 }
854
855 /* disable SIE for all streams */
856 azx_writeb(chip, INTCTL, 0);
857
858 /* disable controller CIE and GIE */
859 azx_writel(chip, INTCTL, azx_readl(chip, INTCTL) &
860 ~(ICH6_INT_CTRL_EN | ICH6_INT_GLOBAL_EN));
861}
862
863/* clear interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100864static void azx_int_clear(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700865{
866 int i;
867
868 /* clear stream status */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200869 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100870 struct azx_dev *azx_dev = &chip->azx_dev[i];
Dylan Reid40830812014-02-28 15:41:13 -0800871 azx_sd_writeb(chip, azx_dev, SD_STS, SD_INT_MASK);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700872 }
873
874 /* clear STATESTS */
Wang Xingchaoda7db6a2013-07-22 03:19:18 -0400875 azx_writew(chip, STATESTS, STATESTS_INT_MASK);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700876
877 /* clear rirb status */
878 azx_writeb(chip, RIRBSTS, RIRB_INT_MASK);
879
880 /* clear int status */
881 azx_writel(chip, INTSTS, ICH6_INT_CTRL_EN | ICH6_INT_ALL_STREAM);
882}
883
884/* start a stream */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100885static void azx_stream_start(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700886{
Joseph Chan0e153472008-08-26 14:38:03 +0200887 /*
888 * Before stream start, initialize parameter
889 */
890 azx_dev->insufficient = 1;
891
Linus Torvalds1da177e2005-04-16 15:20:36 -0700892 /* enable SIE */
Wei Niccc5df02010-01-26 15:59:33 +0800893 azx_writel(chip, INTCTL,
894 azx_readl(chip, INTCTL) | (1 << azx_dev->index));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700895 /* set DMA start and interrupt mask */
Dylan Reid40830812014-02-28 15:41:13 -0800896 azx_sd_writeb(chip, azx_dev, SD_CTL,
897 azx_sd_readb(chip, azx_dev, SD_CTL) |
Linus Torvalds1da177e2005-04-16 15:20:36 -0700898 SD_CTL_DMA_START | SD_INT_MASK);
899}
900
Takashi Iwai1dddab42009-03-18 15:15:37 +0100901/* stop DMA */
902static void azx_stream_clear(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700903{
Dylan Reid40830812014-02-28 15:41:13 -0800904 azx_sd_writeb(chip, azx_dev, SD_CTL,
905 azx_sd_readb(chip, azx_dev, SD_CTL) &
Linus Torvalds1da177e2005-04-16 15:20:36 -0700906 ~(SD_CTL_DMA_START | SD_INT_MASK));
Dylan Reid40830812014-02-28 15:41:13 -0800907 azx_sd_writeb(chip, azx_dev, SD_STS, SD_INT_MASK); /* to be sure */
Takashi Iwai1dddab42009-03-18 15:15:37 +0100908}
909
910/* stop a stream */
911static void azx_stream_stop(struct azx *chip, struct azx_dev *azx_dev)
912{
913 azx_stream_clear(chip, azx_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700914 /* disable SIE */
Wei Niccc5df02010-01-26 15:59:33 +0800915 azx_writel(chip, INTCTL,
916 azx_readl(chip, INTCTL) & ~(1 << azx_dev->index));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700917}
918
919
920/*
Takashi Iwaicb53c622007-08-10 17:21:45 +0200921 * reset and start the controller registers
Linus Torvalds1da177e2005-04-16 15:20:36 -0700922 */
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +0100923static void azx_init_chip(struct azx *chip, int full_reset)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700924{
Takashi Iwaicb53c622007-08-10 17:21:45 +0200925 if (chip->initialized)
926 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700927
928 /* reset controller */
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +0100929 azx_reset(chip, full_reset);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700930
931 /* initialize interrupts */
932 azx_int_clear(chip);
933 azx_int_enable(chip);
934
935 /* initialize the codec command I/O */
Takashi Iwai1a696972009-11-07 09:49:04 +0100936 if (!chip->single_cmd)
937 azx_init_cmd_io(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700938
Takashi Iwai0be3b5d2005-09-05 17:11:40 +0200939 /* program the position buffer */
940 azx_writel(chip, DPLBASE, (u32)chip->posbuf.addr);
Takashi Iwai766979e2008-06-13 20:53:56 +0200941 azx_writel(chip, DPUBASE, upper_32_bits(chip->posbuf.addr));
Frederick Lif5d40b32005-05-12 14:55:20 +0200942
Takashi Iwaicb53c622007-08-10 17:21:45 +0200943 chip->initialized = 1;
944}
945
946/*
947 * initialize the PCI registers
948 */
949/* update bits in a PCI register byte */
950static void update_pci_byte(struct pci_dev *pci, unsigned int reg,
951 unsigned char mask, unsigned char val)
952{
953 unsigned char data;
954
955 pci_read_config_byte(pci, reg, &data);
956 data &= ~mask;
957 data |= (val & mask);
958 pci_write_config_byte(pci, reg, data);
959}
960
961static void azx_init_pci(struct azx *chip)
962{
963 /* Clear bits 0-2 of PCI register TCSEL (at offset 0x44)
964 * TCSEL == Traffic Class Select Register, which sets PCI express QOS
965 * Ensuring these bits are 0 clears playback static on some HD Audio
Adam Lackorzynskia09e89f2011-03-10 17:41:56 +0100966 * codecs.
967 * The PCI register TCSEL is defined in the Intel manuals.
Takashi Iwaicb53c622007-08-10 17:21:45 +0200968 */
Linus Torvalds46f2cc82011-05-27 19:45:28 -0700969 if (!(chip->driver_caps & AZX_DCAPS_NO_TCSEL)) {
Takashi Iwai4e76a882014-02-25 12:21:03 +0100970 dev_dbg(chip->card->dev, "Clearing TCSEL\n");
Adam Lackorzynskia09e89f2011-03-10 17:41:56 +0100971 update_pci_byte(chip->pci, ICH6_PCIREG_TCSEL, 0x07, 0);
Takashi Iwai9477c582011-05-25 09:11:37 +0200972 }
Takashi Iwaicb53c622007-08-10 17:21:45 +0200973
Takashi Iwai9477c582011-05-25 09:11:37 +0200974 /* For ATI SB450/600/700/800/900 and AMD Hudson azalia HD audio,
975 * we need to enable snoop.
976 */
977 if (chip->driver_caps & AZX_DCAPS_ATI_SNOOP) {
Takashi Iwai4e76a882014-02-25 12:21:03 +0100978 dev_dbg(chip->card->dev, "Setting ATI snoop: %d\n",
979 azx_snoop(chip));
Takashi Iwaicb53c622007-08-10 17:21:45 +0200980 update_pci_byte(chip->pci,
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200981 ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR, 0x07,
982 azx_snoop(chip) ? ATI_SB450_HDAUDIO_ENABLE_SNOOP : 0);
Takashi Iwai9477c582011-05-25 09:11:37 +0200983 }
984
985 /* For NVIDIA HDA, enable snoop */
986 if (chip->driver_caps & AZX_DCAPS_NVIDIA_SNOOP) {
Takashi Iwai4e76a882014-02-25 12:21:03 +0100987 dev_dbg(chip->card->dev, "Setting Nvidia snoop: %d\n",
988 azx_snoop(chip));
Takashi Iwaicb53c622007-08-10 17:21:45 +0200989 update_pci_byte(chip->pci,
990 NVIDIA_HDA_TRANSREG_ADDR,
991 0x0f, NVIDIA_HDA_ENABLE_COHBITS);
Peer Chen320dcc32008-08-20 16:43:24 -0700992 update_pci_byte(chip->pci,
993 NVIDIA_HDA_ISTRM_COH,
994 0x01, NVIDIA_HDA_ENABLE_COHBIT);
995 update_pci_byte(chip->pci,
996 NVIDIA_HDA_OSTRM_COH,
997 0x01, NVIDIA_HDA_ENABLE_COHBIT);
Takashi Iwai9477c582011-05-25 09:11:37 +0200998 }
999
1000 /* Enable SCH/PCH snoop if needed */
1001 if (chip->driver_caps & AZX_DCAPS_SCH_SNOOP) {
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001002 unsigned short snoop;
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001003 pci_read_config_word(chip->pci, INTEL_SCH_HDA_DEVC, &snoop);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001004 if ((!azx_snoop(chip) && !(snoop & INTEL_SCH_HDA_DEVC_NOSNOOP)) ||
1005 (azx_snoop(chip) && (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP))) {
1006 snoop &= ~INTEL_SCH_HDA_DEVC_NOSNOOP;
1007 if (!azx_snoop(chip))
1008 snoop |= INTEL_SCH_HDA_DEVC_NOSNOOP;
1009 pci_write_config_word(chip->pci, INTEL_SCH_HDA_DEVC, snoop);
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001010 pci_read_config_word(chip->pci,
1011 INTEL_SCH_HDA_DEVC, &snoop);
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001012 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01001013 dev_dbg(chip->card->dev, "SCH snoop: %s\n",
1014 (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP) ?
1015 "Disabled" : "Enabled");
Vinod Gda3fca22005-09-13 18:49:12 +02001016 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001017}
1018
1019
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001020static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev);
1021
Linus Torvalds1da177e2005-04-16 15:20:36 -07001022/*
1023 * interrupt handler
1024 */
David Howells7d12e782006-10-05 14:55:46 +01001025static irqreturn_t azx_interrupt(int irq, void *dev_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001026{
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001027 struct azx *chip = dev_id;
1028 struct azx_dev *azx_dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001029 u32 status;
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001030 u8 sd_status;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001031 int i, ok;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001032
Mengdong Linb8dfc4622012-08-23 17:32:30 +08001033#ifdef CONFIG_PM_RUNTIME
Dave Airlie246efa42013-07-29 15:19:29 +10001034 if (chip->driver_caps & AZX_DCAPS_PM_RUNTIME)
1035 if (chip->pci->dev.power.runtime_status != RPM_ACTIVE)
1036 return IRQ_NONE;
Mengdong Linb8dfc4622012-08-23 17:32:30 +08001037#endif
1038
Linus Torvalds1da177e2005-04-16 15:20:36 -07001039 spin_lock(&chip->reg_lock);
1040
Dan Carpenter60911062012-05-18 10:36:11 +03001041 if (chip->disabled) {
1042 spin_unlock(&chip->reg_lock);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001043 return IRQ_NONE;
Dan Carpenter60911062012-05-18 10:36:11 +03001044 }
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001045
Linus Torvalds1da177e2005-04-16 15:20:36 -07001046 status = azx_readl(chip, INTSTS);
Dave Airlie246efa42013-07-29 15:19:29 +10001047 if (status == 0 || status == 0xffffffff) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001048 spin_unlock(&chip->reg_lock);
1049 return IRQ_NONE;
1050 }
1051
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001052 for (i = 0; i < chip->num_streams; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001053 azx_dev = &chip->azx_dev[i];
1054 if (status & azx_dev->sd_int_sta_mask) {
Dylan Reid40830812014-02-28 15:41:13 -08001055 sd_status = azx_sd_readb(chip, azx_dev, SD_STS);
1056 azx_sd_writeb(chip, azx_dev, SD_STS, SD_INT_MASK);
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001057 if (!azx_dev->substream || !azx_dev->running ||
1058 !(sd_status & SD_INT_COMPLETE))
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001059 continue;
1060 /* check whether this IRQ is really acceptable */
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001061 ok = azx_position_ok(chip, azx_dev);
1062 if (ok == 1) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001063 azx_dev->irq_pending = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001064 spin_unlock(&chip->reg_lock);
1065 snd_pcm_period_elapsed(azx_dev->substream);
1066 spin_lock(&chip->reg_lock);
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001067 } else if (ok == 0 && chip->bus && chip->bus->workq) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001068 /* bogus IRQ, process it later */
1069 azx_dev->irq_pending = 1;
Takashi Iwai6acaed32009-01-12 10:09:24 +01001070 queue_work(chip->bus->workq,
1071 &chip->irq_pending_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001072 }
1073 }
1074 }
1075
1076 /* clear rirb int */
1077 status = azx_readb(chip, RIRBSTS);
1078 if (status & RIRB_INT_MASK) {
Takashi Iwai14d34f12010-10-21 09:03:25 +02001079 if (status & RIRB_INT_RESPONSE) {
Takashi Iwai9477c582011-05-25 09:11:37 +02001080 if (chip->driver_caps & AZX_DCAPS_RIRB_PRE_DELAY)
Takashi Iwai14d34f12010-10-21 09:03:25 +02001081 udelay(80);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001082 azx_update_rirb(chip);
Takashi Iwai14d34f12010-10-21 09:03:25 +02001083 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001084 azx_writeb(chip, RIRBSTS, RIRB_INT_MASK);
1085 }
1086
1087#if 0
1088 /* clear state status int */
Wang Xingchaoda7db6a2013-07-22 03:19:18 -04001089 if (azx_readw(chip, STATESTS) & 0x04)
1090 azx_writew(chip, STATESTS, 0x04);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001091#endif
1092 spin_unlock(&chip->reg_lock);
1093
1094 return IRQ_HANDLED;
1095}
1096
1097
1098/*
Takashi Iwai675f25d2008-06-10 17:53:20 +02001099 * set up a BDL entry
1100 */
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001101static int setup_bdle(struct azx *chip,
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001102 struct snd_dma_buffer *dmab,
Takashi Iwai675f25d2008-06-10 17:53:20 +02001103 struct azx_dev *azx_dev, u32 **bdlp,
1104 int ofs, int size, int with_ioc)
1105{
Takashi Iwai675f25d2008-06-10 17:53:20 +02001106 u32 *bdl = *bdlp;
1107
1108 while (size > 0) {
1109 dma_addr_t addr;
1110 int chunk;
1111
1112 if (azx_dev->frags >= AZX_MAX_BDL_ENTRIES)
1113 return -EINVAL;
1114
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001115 addr = snd_sgbuf_get_addr(dmab, ofs);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001116 /* program the address field of the BDL entry */
1117 bdl[0] = cpu_to_le32((u32)addr);
Takashi Iwai766979e2008-06-13 20:53:56 +02001118 bdl[1] = cpu_to_le32(upper_32_bits(addr));
Takashi Iwai675f25d2008-06-10 17:53:20 +02001119 /* program the size field of the BDL entry */
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001120 chunk = snd_sgbuf_get_chunk_size(dmab, ofs, size);
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001121 /* one BDLE cannot cross 4K boundary on CTHDA chips */
1122 if (chip->driver_caps & AZX_DCAPS_4K_BDLE_BOUNDARY) {
1123 u32 remain = 0x1000 - (ofs & 0xfff);
1124 if (chunk > remain)
1125 chunk = remain;
1126 }
Takashi Iwai675f25d2008-06-10 17:53:20 +02001127 bdl[2] = cpu_to_le32(chunk);
1128 /* program the IOC to enable interrupt
1129 * only when the whole fragment is processed
1130 */
1131 size -= chunk;
1132 bdl[3] = (size || !with_ioc) ? 0 : cpu_to_le32(0x01);
1133 bdl += 4;
1134 azx_dev->frags++;
1135 ofs += chunk;
1136 }
1137 *bdlp = bdl;
1138 return ofs;
1139}
1140
1141/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001142 * set up BDL entries
1143 */
Takashi Iwai555e2192008-06-10 17:53:34 +02001144static int azx_setup_periods(struct azx *chip,
1145 struct snd_pcm_substream *substream,
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001146 struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001147{
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001148 u32 *bdl;
1149 int i, ofs, periods, period_bytes;
Takashi Iwai555e2192008-06-10 17:53:34 +02001150 int pos_adj;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001151
1152 /* reset BDL address */
Dylan Reid40830812014-02-28 15:41:13 -08001153 azx_sd_writel(chip, azx_dev, SD_BDLPL, 0);
1154 azx_sd_writel(chip, azx_dev, SD_BDLPU, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001155
Takashi Iwai97b71c92009-03-18 15:09:13 +01001156 period_bytes = azx_dev->period_bytes;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001157 periods = azx_dev->bufsize / period_bytes;
1158
Linus Torvalds1da177e2005-04-16 15:20:36 -07001159 /* program the initial BDL entries */
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001160 bdl = (u32 *)azx_dev->bdl.area;
1161 ofs = 0;
1162 azx_dev->frags = 0;
Takashi Iwai555e2192008-06-10 17:53:34 +02001163 pos_adj = bdl_pos_adj[chip->dev_index];
Takashi Iwai915bf292012-09-11 15:19:10 +02001164 if (!azx_dev->no_period_wakeup && pos_adj > 0) {
Takashi Iwai675f25d2008-06-10 17:53:20 +02001165 struct snd_pcm_runtime *runtime = substream->runtime;
Takashi Iwaie785d3d2008-07-15 16:28:43 +02001166 int pos_align = pos_adj;
Takashi Iwai555e2192008-06-10 17:53:34 +02001167 pos_adj = (pos_adj * runtime->rate + 47999) / 48000;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001168 if (!pos_adj)
Takashi Iwaie785d3d2008-07-15 16:28:43 +02001169 pos_adj = pos_align;
1170 else
1171 pos_adj = ((pos_adj + pos_align - 1) / pos_align) *
1172 pos_align;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001173 pos_adj = frames_to_bytes(runtime, pos_adj);
1174 if (pos_adj >= period_bytes) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001175 dev_warn(chip->card->dev,"Too big adjustment %d\n",
1176 bdl_pos_adj[chip->dev_index]);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001177 pos_adj = 0;
1178 } else {
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001179 ofs = setup_bdle(chip, snd_pcm_get_dma_buf(substream),
1180 azx_dev,
Takashi Iwai915bf292012-09-11 15:19:10 +02001181 &bdl, ofs, pos_adj, true);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001182 if (ofs < 0)
1183 goto error;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001184 }
Takashi Iwai555e2192008-06-10 17:53:34 +02001185 } else
1186 pos_adj = 0;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001187 for (i = 0; i < periods; i++) {
1188 if (i == periods - 1 && pos_adj)
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001189 ofs = setup_bdle(chip, snd_pcm_get_dma_buf(substream),
1190 azx_dev, &bdl, ofs,
Takashi Iwai675f25d2008-06-10 17:53:20 +02001191 period_bytes - pos_adj, 0);
1192 else
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001193 ofs = setup_bdle(chip, snd_pcm_get_dma_buf(substream),
1194 azx_dev, &bdl, ofs,
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001195 period_bytes,
Takashi Iwai915bf292012-09-11 15:19:10 +02001196 !azx_dev->no_period_wakeup);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001197 if (ofs < 0)
1198 goto error;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001199 }
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001200 return 0;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001201
1202 error:
Takashi Iwai4e76a882014-02-25 12:21:03 +01001203 dev_err(chip->card->dev, "Too many BDL entries: buffer=%d, period=%d\n",
1204 azx_dev->bufsize, period_bytes);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001205 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001206}
1207
Takashi Iwai1dddab42009-03-18 15:15:37 +01001208/* reset stream */
1209static void azx_stream_reset(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001210{
1211 unsigned char val;
1212 int timeout;
1213
Takashi Iwai1dddab42009-03-18 15:15:37 +01001214 azx_stream_clear(chip, azx_dev);
1215
Dylan Reid40830812014-02-28 15:41:13 -08001216 azx_sd_writeb(chip, azx_dev, SD_CTL,
1217 azx_sd_readb(chip, azx_dev, SD_CTL) |
Takashi Iwaid01ce992007-07-27 16:52:19 +02001218 SD_CTL_STREAM_RESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001219 udelay(3);
1220 timeout = 300;
Dylan Reid40830812014-02-28 15:41:13 -08001221 while (!((val = azx_sd_readb(chip, azx_dev, SD_CTL)) &
1222 SD_CTL_STREAM_RESET) && --timeout)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001223 ;
1224 val &= ~SD_CTL_STREAM_RESET;
Dylan Reid40830812014-02-28 15:41:13 -08001225 azx_sd_writeb(chip, azx_dev, SD_CTL, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001226 udelay(3);
1227
1228 timeout = 300;
1229 /* waiting for hardware to report that the stream is out of reset */
Dylan Reid40830812014-02-28 15:41:13 -08001230 while (((val = azx_sd_readb(chip, azx_dev, SD_CTL)) &
1231 SD_CTL_STREAM_RESET) && --timeout)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001232 ;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001233
1234 /* reset first position - may not be synced with hw at this time */
1235 *azx_dev->posbuf = 0;
Takashi Iwai1dddab42009-03-18 15:15:37 +01001236}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001237
Takashi Iwai1dddab42009-03-18 15:15:37 +01001238/*
1239 * set up the SD for streaming
1240 */
1241static int azx_setup_controller(struct azx *chip, struct azx_dev *azx_dev)
1242{
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001243 unsigned int val;
Takashi Iwai1dddab42009-03-18 15:15:37 +01001244 /* make sure the run bit is zero for SD */
1245 azx_stream_clear(chip, azx_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001246 /* program the stream_tag */
Dylan Reid40830812014-02-28 15:41:13 -08001247 val = azx_sd_readl(chip, azx_dev, SD_CTL);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001248 val = (val & ~SD_CTL_STREAM_TAG_MASK) |
1249 (azx_dev->stream_tag << SD_CTL_STREAM_TAG_SHIFT);
1250 if (!azx_snoop(chip))
1251 val |= SD_CTL_TRAFFIC_PRIO;
Dylan Reid40830812014-02-28 15:41:13 -08001252 azx_sd_writel(chip, azx_dev, SD_CTL, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001253
1254 /* program the length of samples in cyclic buffer */
Dylan Reid40830812014-02-28 15:41:13 -08001255 azx_sd_writel(chip, azx_dev, SD_CBL, azx_dev->bufsize);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001256
1257 /* program the stream format */
1258 /* this value needs to be the same as the one programmed */
Dylan Reid40830812014-02-28 15:41:13 -08001259 azx_sd_writew(chip, azx_dev, SD_FORMAT, azx_dev->format_val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001260
1261 /* program the stream LVI (last valid index) of the BDL */
Dylan Reid40830812014-02-28 15:41:13 -08001262 azx_sd_writew(chip, azx_dev, SD_LVI, azx_dev->frags - 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001263
1264 /* program the BDL address */
1265 /* lower BDL address */
Dylan Reid40830812014-02-28 15:41:13 -08001266 azx_sd_writel(chip, azx_dev, SD_BDLPL, (u32)azx_dev->bdl.addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001267 /* upper BDL address */
Dylan Reid40830812014-02-28 15:41:13 -08001268 azx_sd_writel(chip, azx_dev, SD_BDLPU,
1269 upper_32_bits(azx_dev->bdl.addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001270
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02001271 /* enable the position buffer */
David Henningsson4cb36312010-09-30 10:12:50 +02001272 if (chip->position_fix[0] != POS_FIX_LPIB ||
1273 chip->position_fix[1] != POS_FIX_LPIB) {
Takashi Iwaiee9d6b92008-03-14 15:52:20 +01001274 if (!(azx_readl(chip, DPLBASE) & ICH6_DPLBASE_ENABLE))
1275 azx_writel(chip, DPLBASE,
1276 (u32)chip->posbuf.addr | ICH6_DPLBASE_ENABLE);
1277 }
Takashi Iwaic74db862005-05-12 14:26:27 +02001278
Linus Torvalds1da177e2005-04-16 15:20:36 -07001279 /* set the interrupt enable bits in the descriptor control register */
Dylan Reid40830812014-02-28 15:41:13 -08001280 azx_sd_writel(chip, azx_dev, SD_CTL,
1281 azx_sd_readl(chip, azx_dev, SD_CTL) | SD_INT_MASK);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001282
1283 return 0;
1284}
1285
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001286/*
1287 * Probe the given codec address
1288 */
1289static int probe_codec(struct azx *chip, int addr)
1290{
1291 unsigned int cmd = (addr << 28) | (AC_NODE_ROOT << 20) |
1292 (AC_VERB_PARAMETERS << 8) | AC_PAR_VENDOR_ID;
1293 unsigned int res;
1294
Wu Fengguanga678cde2009-08-01 18:46:46 +08001295 mutex_lock(&chip->bus->cmd_mutex);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001296 chip->probing = 1;
1297 azx_send_cmd(chip->bus, cmd);
Wu Fengguangdeadff12009-08-01 18:45:16 +08001298 res = azx_get_response(chip->bus, addr);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001299 chip->probing = 0;
Wu Fengguanga678cde2009-08-01 18:46:46 +08001300 mutex_unlock(&chip->bus->cmd_mutex);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001301 if (res == -1)
1302 return -EIO;
Takashi Iwai4e76a882014-02-25 12:21:03 +01001303 dev_dbg(chip->card->dev, "codec #%d probed OK\n", addr);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001304 return 0;
1305}
1306
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001307static int azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec,
1308 struct hda_pcm *cpcm);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001309static void azx_stop_chip(struct azx *chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001310
Takashi Iwai8dd78332009-06-02 01:16:07 +02001311static void azx_bus_reset(struct hda_bus *bus)
1312{
1313 struct azx *chip = bus->private_data;
Takashi Iwai8dd78332009-06-02 01:16:07 +02001314
1315 bus->in_reset = 1;
1316 azx_stop_chip(chip);
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001317 azx_init_chip(chip, 1);
Alexander Beregalov65f75982009-06-04 13:46:16 +04001318#ifdef CONFIG_PM
Takashi Iwai8dd78332009-06-02 01:16:07 +02001319 if (chip->initialized) {
Takashi Iwai01b65bf2011-11-24 14:31:46 +01001320 struct azx_pcm *p;
1321 list_for_each_entry(p, &chip->pcm_list, list)
1322 snd_pcm_suspend_all(p->pcm);
Takashi Iwai8dd78332009-06-02 01:16:07 +02001323 snd_hda_suspend(chip->bus);
1324 snd_hda_resume(chip->bus);
1325 }
Alexander Beregalov65f75982009-06-04 13:46:16 +04001326#endif
Takashi Iwai8dd78332009-06-02 01:16:07 +02001327 bus->in_reset = 0;
1328}
1329
David Henningsson26a6cb62012-10-09 15:04:21 +02001330static int get_jackpoll_interval(struct azx *chip)
1331{
1332 int i = jackpoll_ms[chip->dev_index];
1333 unsigned int j;
1334 if (i == 0)
1335 return 0;
1336 if (i < 50 || i > 60000)
1337 j = 0;
1338 else
1339 j = msecs_to_jiffies(i);
1340 if (j == 0)
Takashi Iwai4e76a882014-02-25 12:21:03 +01001341 dev_warn(chip->card->dev,
1342 "jackpoll_ms value out of range: %d\n", i);
David Henningsson26a6cb62012-10-09 15:04:21 +02001343 return j;
1344}
1345
Linus Torvalds1da177e2005-04-16 15:20:36 -07001346/*
1347 * Codec initialization
1348 */
1349
Takashi Iwai2f5983f2008-09-03 16:00:44 +02001350/* number of codec slots for each chipset: 0 = default slots (i.e. 4) */
Takashi Iwai48c8b0e2012-12-07 07:40:35 +01001351static unsigned int azx_max_codecs[AZX_NUM_DRIVERS] = {
Wei Ni7445dfc2010-03-03 15:05:53 +08001352 [AZX_DRIVER_NVIDIA] = 8,
Kailang Yangf2690022008-05-27 11:44:55 +02001353 [AZX_DRIVER_TERA] = 1,
Takashi Iwaia9995a32007-03-12 21:30:46 +01001354};
1355
Takashi Iwai48c8b0e2012-12-07 07:40:35 +01001356static int azx_codec_create(struct azx *chip, const char *model)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001357{
1358 struct hda_bus_template bus_temp;
Takashi Iwai34c25352008-10-28 11:38:58 +01001359 int c, codecs, err;
1360 int max_slots;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001361
1362 memset(&bus_temp, 0, sizeof(bus_temp));
1363 bus_temp.private_data = chip;
1364 bus_temp.modelname = model;
1365 bus_temp.pci = chip->pci;
Takashi Iwai111d3af2006-02-16 18:17:58 +01001366 bus_temp.ops.command = azx_send_cmd;
1367 bus_temp.ops.get_response = azx_get_response;
Takashi Iwai176d5332008-07-30 15:01:44 +02001368 bus_temp.ops.attach_pcm = azx_attach_pcm_stream;
Takashi Iwai8dd78332009-06-02 01:16:07 +02001369 bus_temp.ops.bus_reset = azx_bus_reset;
Takashi Iwai83012a72012-08-24 18:38:08 +02001370#ifdef CONFIG_PM
Takashi Iwai11cd41b2008-11-28 07:22:18 +01001371 bus_temp.power_save = &power_save;
Takashi Iwaicb53c622007-08-10 17:21:45 +02001372 bus_temp.ops.pm_notify = azx_power_notify;
1373#endif
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001374#ifdef CONFIG_SND_HDA_DSP_LOADER
1375 bus_temp.ops.load_dsp_prepare = azx_load_dsp_prepare;
1376 bus_temp.ops.load_dsp_trigger = azx_load_dsp_trigger;
1377 bus_temp.ops.load_dsp_cleanup = azx_load_dsp_cleanup;
1378#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07001379
Takashi Iwaid01ce992007-07-27 16:52:19 +02001380 err = snd_hda_bus_new(chip->card, &bus_temp, &chip->bus);
1381 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001382 return err;
1383
Takashi Iwai9477c582011-05-25 09:11:37 +02001384 if (chip->driver_caps & AZX_DCAPS_RIRB_DELAY) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001385 dev_dbg(chip->card->dev, "Enable delay in RIRB handling\n");
Wei Nidc9c8e22008-09-26 13:55:56 +08001386 chip->bus->needs_damn_long_delay = 1;
Takashi Iwai9477c582011-05-25 09:11:37 +02001387 }
Wei Nidc9c8e22008-09-26 13:55:56 +08001388
Takashi Iwai34c25352008-10-28 11:38:58 +01001389 codecs = 0;
Takashi Iwai2f5983f2008-09-03 16:00:44 +02001390 max_slots = azx_max_codecs[chip->driver_type];
1391 if (!max_slots)
Wei Ni7445dfc2010-03-03 15:05:53 +08001392 max_slots = AZX_DEFAULT_CODECS;
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001393
1394 /* First try to probe all given codec slots */
1395 for (c = 0; c < max_slots; c++) {
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01001396 if ((chip->codec_mask & (1 << c)) & chip->codec_probe_mask) {
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001397 if (probe_codec(chip, c) < 0) {
1398 /* Some BIOSen give you wrong codec addresses
1399 * that don't exist
1400 */
Takashi Iwai4e76a882014-02-25 12:21:03 +01001401 dev_warn(chip->card->dev,
1402 "Codec #%d probe error; disabling it...\n", c);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001403 chip->codec_mask &= ~(1 << c);
1404 /* More badly, accessing to a non-existing
1405 * codec often screws up the controller chip,
Paul Menzel24481582010-02-08 20:37:26 +01001406 * and disturbs the further communications.
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001407 * Thus if an error occurs during probing,
1408 * better to reset the controller chip to
1409 * get back to the sanity state.
1410 */
1411 azx_stop_chip(chip);
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001412 azx_init_chip(chip, 1);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001413 }
1414 }
1415 }
1416
Takashi Iwaid507cd62011-04-26 15:25:02 +02001417 /* AMD chipsets often cause the communication stalls upon certain
1418 * sequence like the pin-detection. It seems that forcing the synced
1419 * access works around the stall. Grrr...
1420 */
Takashi Iwai9477c582011-05-25 09:11:37 +02001421 if (chip->driver_caps & AZX_DCAPS_SYNC_WRITE) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001422 dev_dbg(chip->card->dev, "Enable sync_write for stable communication\n");
Takashi Iwaid507cd62011-04-26 15:25:02 +02001423 chip->bus->sync_write = 1;
1424 chip->bus->allow_bus_reset = 1;
1425 }
1426
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001427 /* Then create codec instances */
Takashi Iwai34c25352008-10-28 11:38:58 +01001428 for (c = 0; c < max_slots; c++) {
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01001429 if ((chip->codec_mask & (1 << c)) & chip->codec_probe_mask) {
Takashi Iwaibccad142007-04-24 12:23:53 +02001430 struct hda_codec *codec;
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001431 err = snd_hda_codec_new(chip->bus, c, &codec);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001432 if (err < 0)
1433 continue;
David Henningsson26a6cb62012-10-09 15:04:21 +02001434 codec->jackpoll_interval = get_jackpoll_interval(chip);
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +01001435 codec->beep_mode = chip->beep_mode;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001436 codecs++;
Takashi Iwai19a982b2007-03-21 15:14:35 +01001437 }
1438 }
1439 if (!codecs) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001440 dev_err(chip->card->dev, "no codecs initialized\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001441 return -ENXIO;
1442 }
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001443 return 0;
1444}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001445
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001446/* configure each codec instance */
Bill Pembertone23e7a12012-12-06 12:35:10 -05001447static int azx_codec_configure(struct azx *chip)
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001448{
1449 struct hda_codec *codec;
1450 list_for_each_entry(codec, &chip->bus->codec_list, list) {
1451 snd_hda_codec_configure(codec);
1452 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001453 return 0;
1454}
1455
1456
1457/*
1458 * PCM support
1459 */
1460
1461/* assign a stream for the PCM */
Wu Fengguangef18bed2009-12-25 13:14:27 +08001462static inline struct azx_dev *
1463azx_assign_device(struct azx *chip, struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001464{
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001465 int dev, i, nums;
Wu Fengguangef18bed2009-12-25 13:14:27 +08001466 struct azx_dev *res = NULL;
Takashi Iwaid5cf9912011-10-06 10:07:58 +02001467 /* make a non-zero unique key for the substream */
1468 int key = (substream->pcm->device << 16) | (substream->number << 2) |
1469 (substream->stream + 1);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001470
1471 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001472 dev = chip->playback_index_offset;
1473 nums = chip->playback_streams;
1474 } else {
1475 dev = chip->capture_index_offset;
1476 nums = chip->capture_streams;
1477 }
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001478 for (i = 0; i < nums; i++, dev++) {
1479 struct azx_dev *azx_dev = &chip->azx_dev[dev];
1480 dsp_lock(azx_dev);
1481 if (!azx_dev->opened && !dsp_is_locked(azx_dev)) {
1482 res = azx_dev;
1483 if (res->assigned_key == key) {
1484 res->opened = 1;
1485 res->assigned_key = key;
1486 dsp_unlock(azx_dev);
1487 return azx_dev;
1488 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001489 }
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001490 dsp_unlock(azx_dev);
1491 }
Wu Fengguangef18bed2009-12-25 13:14:27 +08001492 if (res) {
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001493 dsp_lock(res);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001494 res->opened = 1;
Takashi Iwaid5cf9912011-10-06 10:07:58 +02001495 res->assigned_key = key;
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001496 dsp_unlock(res);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001497 }
1498 return res;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001499}
1500
1501/* release the assigned stream */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001502static inline void azx_release_device(struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001503{
1504 azx_dev->opened = 0;
1505}
1506
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001507static cycle_t azx_cc_read(const struct cyclecounter *cc)
1508{
1509 struct azx_dev *azx_dev = container_of(cc, struct azx_dev, azx_cc);
1510 struct snd_pcm_substream *substream = azx_dev->substream;
1511 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1512 struct azx *chip = apcm->chip;
1513
1514 return azx_readl(chip, WALLCLK);
1515}
1516
1517static void azx_timecounter_init(struct snd_pcm_substream *substream,
1518 bool force, cycle_t last)
1519{
1520 struct azx_dev *azx_dev = get_azx_dev(substream);
1521 struct timecounter *tc = &azx_dev->azx_tc;
1522 struct cyclecounter *cc = &azx_dev->azx_cc;
1523 u64 nsec;
1524
1525 cc->read = azx_cc_read;
1526 cc->mask = CLOCKSOURCE_MASK(32);
1527
1528 /*
1529 * Converting from 24 MHz to ns means applying a 125/3 factor.
1530 * To avoid any saturation issues in intermediate operations,
1531 * the 125 factor is applied first. The division is applied
1532 * last after reading the timecounter value.
1533 * Applying the 1/3 factor as part of the multiplication
1534 * requires at least 20 bits for a decent precision, however
1535 * overflows occur after about 4 hours or less, not a option.
1536 */
1537
1538 cc->mult = 125; /* saturation after 195 years */
1539 cc->shift = 0;
1540
1541 nsec = 0; /* audio time is elapsed time since trigger */
1542 timecounter_init(tc, cc, nsec);
1543 if (force)
1544 /*
1545 * force timecounter to use predefined value,
1546 * used for synchronized starts
1547 */
1548 tc->cycle_last = last;
1549}
1550
Dylan Reidae03bbb2013-04-15 11:57:05 -07001551static u64 azx_adjust_codec_delay(struct snd_pcm_substream *substream,
Dylan Reid78daea22013-04-08 18:20:30 -07001552 u64 nsec)
1553{
1554 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1555 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
1556 u64 codec_frames, codec_nsecs;
1557
1558 if (!hinfo->ops.get_delay)
1559 return nsec;
1560
1561 codec_frames = hinfo->ops.get_delay(hinfo, apcm->codec, substream);
1562 codec_nsecs = div_u64(codec_frames * 1000000000LL,
1563 substream->runtime->rate);
1564
Dylan Reidae03bbb2013-04-15 11:57:05 -07001565 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
1566 return nsec + codec_nsecs;
1567
Dylan Reid78daea22013-04-08 18:20:30 -07001568 return (nsec > codec_nsecs) ? nsec - codec_nsecs : 0;
1569}
1570
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001571static int azx_get_wallclock_tstamp(struct snd_pcm_substream *substream,
1572 struct timespec *ts)
1573{
1574 struct azx_dev *azx_dev = get_azx_dev(substream);
1575 u64 nsec;
1576
1577 nsec = timecounter_read(&azx_dev->azx_tc);
1578 nsec = div_u64(nsec, 3); /* can be optimized */
Dylan Reidae03bbb2013-04-15 11:57:05 -07001579 nsec = azx_adjust_codec_delay(substream, nsec);
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001580
1581 *ts = ns_to_timespec(nsec);
1582
1583 return 0;
1584}
1585
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001586static struct snd_pcm_hardware azx_pcm_hw = {
Takashi Iwaid01ce992007-07-27 16:52:19 +02001587 .info = (SNDRV_PCM_INFO_MMAP |
1588 SNDRV_PCM_INFO_INTERLEAVED |
Linus Torvalds1da177e2005-04-16 15:20:36 -07001589 SNDRV_PCM_INFO_BLOCK_TRANSFER |
1590 SNDRV_PCM_INFO_MMAP_VALID |
Pavel Machek927fc862006-08-31 17:03:43 +02001591 /* No full-resume yet implemented */
1592 /* SNDRV_PCM_INFO_RESUME |*/
Takashi Iwai850f0e52008-03-18 17:11:05 +01001593 SNDRV_PCM_INFO_PAUSE |
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001594 SNDRV_PCM_INFO_SYNC_START |
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001595 SNDRV_PCM_INFO_HAS_WALL_CLOCK |
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001596 SNDRV_PCM_INFO_NO_PERIOD_WAKEUP),
Linus Torvalds1da177e2005-04-16 15:20:36 -07001597 .formats = SNDRV_PCM_FMTBIT_S16_LE,
1598 .rates = SNDRV_PCM_RATE_48000,
1599 .rate_min = 48000,
1600 .rate_max = 48000,
1601 .channels_min = 2,
1602 .channels_max = 2,
1603 .buffer_bytes_max = AZX_MAX_BUF_SIZE,
1604 .period_bytes_min = 128,
1605 .period_bytes_max = AZX_MAX_BUF_SIZE / 2,
1606 .periods_min = 2,
1607 .periods_max = AZX_MAX_FRAG,
1608 .fifo_size = 0,
1609};
1610
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001611static int azx_pcm_open(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001612{
1613 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1614 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001615 struct azx *chip = apcm->chip;
1616 struct azx_dev *azx_dev;
1617 struct snd_pcm_runtime *runtime = substream->runtime;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001618 unsigned long flags;
1619 int err;
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001620 int buff_step;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001621
Ingo Molnar62932df2006-01-16 16:34:20 +01001622 mutex_lock(&chip->open_mutex);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001623 azx_dev = azx_assign_device(chip, substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001624 if (azx_dev == NULL) {
Ingo Molnar62932df2006-01-16 16:34:20 +01001625 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001626 return -EBUSY;
1627 }
1628 runtime->hw = azx_pcm_hw;
1629 runtime->hw.channels_min = hinfo->channels_min;
1630 runtime->hw.channels_max = hinfo->channels_max;
1631 runtime->hw.formats = hinfo->formats;
1632 runtime->hw.rates = hinfo->rates;
1633 snd_pcm_limit_hw_rates(runtime);
1634 snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001635
1636 /* avoid wrap-around with wall-clock */
1637 snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_TIME,
1638 20,
1639 178000000);
1640
Takashi Iwai52409aa2012-01-23 17:10:24 +01001641 if (chip->align_buffer_size)
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001642 /* constrain buffer sizes to be multiple of 128
1643 bytes. This is more efficient in terms of memory
1644 access but isn't required by the HDA spec and
1645 prevents users from specifying exact period/buffer
1646 sizes. For example for 44.1kHz, a period size set
1647 to 20ms will be rounded to 19.59ms. */
1648 buff_step = 128;
1649 else
1650 /* Don't enforce steps on buffer sizes, still need to
1651 be multiple of 4 bytes (HDA spec). Tested on Intel
1652 HDA controllers, may not work on all devices where
1653 option needs to be disabled */
1654 buff_step = 4;
1655
Joachim Deguara5f1545b2007-03-16 15:01:36 +01001656 snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001657 buff_step);
Joachim Deguara5f1545b2007-03-16 15:01:36 +01001658 snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001659 buff_step);
Dylan Reidb4a91cf2012-06-15 19:36:23 -07001660 snd_hda_power_up_d3wait(apcm->codec);
Takashi Iwaid01ce992007-07-27 16:52:19 +02001661 err = hinfo->ops.open(hinfo, apcm->codec, substream);
1662 if (err < 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001663 azx_release_device(azx_dev);
Takashi Iwaicb53c622007-08-10 17:21:45 +02001664 snd_hda_power_down(apcm->codec);
Ingo Molnar62932df2006-01-16 16:34:20 +01001665 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001666 return err;
1667 }
Takashi Iwai70d321e2009-07-03 23:06:45 +02001668 snd_pcm_limit_hw_rates(runtime);
Takashi Iwaiaba66532009-07-05 11:44:46 +02001669 /* sanity check */
1670 if (snd_BUG_ON(!runtime->hw.channels_min) ||
1671 snd_BUG_ON(!runtime->hw.channels_max) ||
1672 snd_BUG_ON(!runtime->hw.formats) ||
1673 snd_BUG_ON(!runtime->hw.rates)) {
1674 azx_release_device(azx_dev);
1675 hinfo->ops.close(hinfo, apcm->codec, substream);
1676 snd_hda_power_down(apcm->codec);
1677 mutex_unlock(&chip->open_mutex);
1678 return -EINVAL;
1679 }
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001680
1681 /* disable WALLCLOCK timestamps for capture streams
1682 until we figure out how to handle digital inputs */
1683 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
1684 runtime->hw.info &= ~SNDRV_PCM_INFO_HAS_WALL_CLOCK;
1685
Linus Torvalds1da177e2005-04-16 15:20:36 -07001686 spin_lock_irqsave(&chip->reg_lock, flags);
1687 azx_dev->substream = substream;
1688 azx_dev->running = 0;
1689 spin_unlock_irqrestore(&chip->reg_lock, flags);
1690
1691 runtime->private_data = azx_dev;
Takashi Iwai850f0e52008-03-18 17:11:05 +01001692 snd_pcm_set_sync(substream);
Ingo Molnar62932df2006-01-16 16:34:20 +01001693 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001694 return 0;
1695}
1696
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001697static int azx_pcm_close(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001698{
1699 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1700 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001701 struct azx *chip = apcm->chip;
1702 struct azx_dev *azx_dev = get_azx_dev(substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001703 unsigned long flags;
1704
Ingo Molnar62932df2006-01-16 16:34:20 +01001705 mutex_lock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001706 spin_lock_irqsave(&chip->reg_lock, flags);
1707 azx_dev->substream = NULL;
1708 azx_dev->running = 0;
1709 spin_unlock_irqrestore(&chip->reg_lock, flags);
1710 azx_release_device(azx_dev);
1711 hinfo->ops.close(hinfo, apcm->codec, substream);
Takashi Iwaicb53c622007-08-10 17:21:45 +02001712 snd_hda_power_down(apcm->codec);
Ingo Molnar62932df2006-01-16 16:34:20 +01001713 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001714 return 0;
1715}
1716
Takashi Iwaid01ce992007-07-27 16:52:19 +02001717static int azx_pcm_hw_params(struct snd_pcm_substream *substream,
1718 struct snd_pcm_hw_params *hw_params)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001719{
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001720 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1721 struct azx *chip = apcm->chip;
Takashi Iwai97b71c92009-03-18 15:09:13 +01001722 struct azx_dev *azx_dev = get_azx_dev(substream);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001723 int ret;
Takashi Iwai97b71c92009-03-18 15:09:13 +01001724
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001725 dsp_lock(azx_dev);
1726 if (dsp_is_locked(azx_dev)) {
1727 ret = -EBUSY;
1728 goto unlock;
1729 }
1730
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +01001731 mark_runtime_wc(chip, azx_dev, substream, false);
Takashi Iwai97b71c92009-03-18 15:09:13 +01001732 azx_dev->bufsize = 0;
1733 azx_dev->period_bytes = 0;
1734 azx_dev->format_val = 0;
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001735 ret = snd_pcm_lib_malloc_pages(substream,
Takashi Iwaid01ce992007-07-27 16:52:19 +02001736 params_buffer_bytes(hw_params));
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001737 if (ret < 0)
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001738 goto unlock;
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +01001739 mark_runtime_wc(chip, azx_dev, substream, true);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001740 unlock:
1741 dsp_unlock(azx_dev);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001742 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001743}
1744
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001745static int azx_pcm_hw_free(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001746{
1747 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001748 struct azx_dev *azx_dev = get_azx_dev(substream);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001749 struct azx *chip = apcm->chip;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001750 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
1751
1752 /* reset BDL address */
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001753 dsp_lock(azx_dev);
1754 if (!dsp_is_locked(azx_dev)) {
Dylan Reid40830812014-02-28 15:41:13 -08001755 azx_sd_writel(chip, azx_dev, SD_BDLPL, 0);
1756 azx_sd_writel(chip, azx_dev, SD_BDLPU, 0);
1757 azx_sd_writel(chip, azx_dev, SD_CTL, 0);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001758 azx_dev->bufsize = 0;
1759 azx_dev->period_bytes = 0;
1760 azx_dev->format_val = 0;
1761 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001762
Takashi Iwaieb541332010-08-06 13:48:11 +02001763 snd_hda_codec_cleanup(apcm->codec, hinfo, substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001764
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +01001765 mark_runtime_wc(chip, azx_dev, substream, false);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001766 azx_dev->prepared = 0;
1767 dsp_unlock(azx_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001768 return snd_pcm_lib_free_pages(substream);
1769}
1770
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001771static int azx_pcm_prepare(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001772{
1773 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001774 struct azx *chip = apcm->chip;
1775 struct azx_dev *azx_dev = get_azx_dev(substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001776 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001777 struct snd_pcm_runtime *runtime = substream->runtime;
Takashi Iwai62b7e5e2010-10-22 17:15:47 +02001778 unsigned int bufsize, period_bytes, format_val, stream_tag;
Takashi Iwai97b71c92009-03-18 15:09:13 +01001779 int err;
Stephen Warren7c9359762011-06-01 11:14:17 -06001780 struct hda_spdif_out *spdif =
1781 snd_hda_spdif_out_of_nid(apcm->codec, hinfo->nid);
1782 unsigned short ctls = spdif ? spdif->ctls : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001783
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001784 dsp_lock(azx_dev);
1785 if (dsp_is_locked(azx_dev)) {
1786 err = -EBUSY;
1787 goto unlock;
1788 }
1789
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001790 azx_stream_reset(chip, azx_dev);
Takashi Iwai97b71c92009-03-18 15:09:13 +01001791 format_val = snd_hda_calc_stream_format(runtime->rate,
1792 runtime->channels,
1793 runtime->format,
Anssi Hannula32c168c2010-08-03 13:28:57 +03001794 hinfo->maxbps,
Stephen Warren7c9359762011-06-01 11:14:17 -06001795 ctls);
Takashi Iwai97b71c92009-03-18 15:09:13 +01001796 if (!format_val) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001797 dev_err(chip->card->dev,
1798 "invalid format_val, rate=%d, ch=%d, format=%d\n",
1799 runtime->rate, runtime->channels, runtime->format);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001800 err = -EINVAL;
1801 goto unlock;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001802 }
1803
Takashi Iwai97b71c92009-03-18 15:09:13 +01001804 bufsize = snd_pcm_lib_buffer_bytes(substream);
1805 period_bytes = snd_pcm_lib_period_bytes(substream);
1806
Takashi Iwai4e76a882014-02-25 12:21:03 +01001807 dev_dbg(chip->card->dev, "azx_pcm_prepare: bufsize=0x%x, format=0x%x\n",
1808 bufsize, format_val);
Takashi Iwai97b71c92009-03-18 15:09:13 +01001809
1810 if (bufsize != azx_dev->bufsize ||
1811 period_bytes != azx_dev->period_bytes ||
Takashi Iwai915bf292012-09-11 15:19:10 +02001812 format_val != azx_dev->format_val ||
1813 runtime->no_period_wakeup != azx_dev->no_period_wakeup) {
Takashi Iwai97b71c92009-03-18 15:09:13 +01001814 azx_dev->bufsize = bufsize;
1815 azx_dev->period_bytes = period_bytes;
1816 azx_dev->format_val = format_val;
Takashi Iwai915bf292012-09-11 15:19:10 +02001817 azx_dev->no_period_wakeup = runtime->no_period_wakeup;
Takashi Iwai97b71c92009-03-18 15:09:13 +01001818 err = azx_setup_periods(chip, substream, azx_dev);
1819 if (err < 0)
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001820 goto unlock;
Takashi Iwai97b71c92009-03-18 15:09:13 +01001821 }
1822
Takashi Iwaie8648e52013-12-06 17:15:01 +01001823 /* when LPIB delay correction gives a small negative value,
1824 * we ignore it; currently set the threshold statically to
1825 * 64 frames
1826 */
1827 if (runtime->period_size > 64)
1828 azx_dev->delay_negative_threshold = -frames_to_bytes(runtime, 64);
1829 else
1830 azx_dev->delay_negative_threshold = 0;
1831
Jaroslav Kyselae5463722010-05-11 10:21:46 +02001832 /* wallclk has 24Mhz clock source */
1833 azx_dev->period_wallclk = (((runtime->period_size * 24000) /
1834 runtime->rate) * 1000);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001835 azx_setup_controller(chip, azx_dev);
1836 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
Dylan Reid40830812014-02-28 15:41:13 -08001837 azx_dev->fifo_size =
1838 azx_sd_readw(chip, azx_dev, SD_FIFOSIZE) + 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001839 else
1840 azx_dev->fifo_size = 0;
1841
Takashi Iwai62b7e5e2010-10-22 17:15:47 +02001842 stream_tag = azx_dev->stream_tag;
1843 /* CA-IBG chips need the playback stream starting from 1 */
Takashi Iwai9477c582011-05-25 09:11:37 +02001844 if ((chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND) &&
Takashi Iwai62b7e5e2010-10-22 17:15:47 +02001845 stream_tag > chip->capture_streams)
1846 stream_tag -= chip->capture_streams;
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001847 err = snd_hda_codec_prepare(apcm->codec, hinfo, stream_tag,
Takashi Iwaieb541332010-08-06 13:48:11 +02001848 azx_dev->format_val, substream);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001849
1850 unlock:
1851 if (!err)
1852 azx_dev->prepared = 1;
1853 dsp_unlock(azx_dev);
1854 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001855}
1856
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001857static int azx_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001858{
1859 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001860 struct azx *chip = apcm->chip;
Takashi Iwai850f0e52008-03-18 17:11:05 +01001861 struct azx_dev *azx_dev;
1862 struct snd_pcm_substream *s;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001863 int rstart = 0, start, nsync = 0, sbits = 0;
Takashi Iwai850f0e52008-03-18 17:11:05 +01001864 int nwait, timeout;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001865
Takashi Iwai1a8506d2012-10-16 15:10:08 +02001866 azx_dev = get_azx_dev(substream);
1867 trace_azx_pcm_trigger(chip, azx_dev, cmd);
1868
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001869 if (dsp_is_locked(azx_dev) || !azx_dev->prepared)
1870 return -EPIPE;
1871
Linus Torvalds1da177e2005-04-16 15:20:36 -07001872 switch (cmd) {
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001873 case SNDRV_PCM_TRIGGER_START:
1874 rstart = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001875 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
1876 case SNDRV_PCM_TRIGGER_RESUME:
Takashi Iwai850f0e52008-03-18 17:11:05 +01001877 start = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001878 break;
1879 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
Jaroslav Kysela47123192005-08-15 20:53:07 +02001880 case SNDRV_PCM_TRIGGER_SUSPEND:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001881 case SNDRV_PCM_TRIGGER_STOP:
Takashi Iwai850f0e52008-03-18 17:11:05 +01001882 start = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001883 break;
1884 default:
Takashi Iwai850f0e52008-03-18 17:11:05 +01001885 return -EINVAL;
1886 }
1887
1888 snd_pcm_group_for_each_entry(s, substream) {
1889 if (s->pcm->card != substream->pcm->card)
1890 continue;
1891 azx_dev = get_azx_dev(s);
1892 sbits |= 1 << azx_dev->index;
1893 nsync++;
1894 snd_pcm_trigger_done(s, substream);
1895 }
1896
1897 spin_lock(&chip->reg_lock);
Pierre-Louis Bossart172d3b22012-09-21 18:39:05 -05001898
1899 /* first, set SYNC bits of corresponding streams */
1900 if (chip->driver_caps & AZX_DCAPS_OLD_SSYNC)
1901 azx_writel(chip, OLD_SSYNC,
1902 azx_readl(chip, OLD_SSYNC) | sbits);
1903 else
1904 azx_writel(chip, SSYNC, azx_readl(chip, SSYNC) | sbits);
1905
Takashi Iwai850f0e52008-03-18 17:11:05 +01001906 snd_pcm_group_for_each_entry(s, substream) {
1907 if (s->pcm->card != substream->pcm->card)
1908 continue;
1909 azx_dev = get_azx_dev(s);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02001910 if (start) {
1911 azx_dev->start_wallclk = azx_readl(chip, WALLCLK);
1912 if (!rstart)
1913 azx_dev->start_wallclk -=
1914 azx_dev->period_wallclk;
Takashi Iwai850f0e52008-03-18 17:11:05 +01001915 azx_stream_start(chip, azx_dev);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02001916 } else {
Takashi Iwai850f0e52008-03-18 17:11:05 +01001917 azx_stream_stop(chip, azx_dev);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02001918 }
Takashi Iwai850f0e52008-03-18 17:11:05 +01001919 azx_dev->running = start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001920 }
1921 spin_unlock(&chip->reg_lock);
Takashi Iwai850f0e52008-03-18 17:11:05 +01001922 if (start) {
Takashi Iwai850f0e52008-03-18 17:11:05 +01001923 /* wait until all FIFOs get ready */
1924 for (timeout = 5000; timeout; timeout--) {
1925 nwait = 0;
1926 snd_pcm_group_for_each_entry(s, substream) {
1927 if (s->pcm->card != substream->pcm->card)
1928 continue;
1929 azx_dev = get_azx_dev(s);
Dylan Reid40830812014-02-28 15:41:13 -08001930 if (!(azx_sd_readb(chip, azx_dev, SD_STS) &
Takashi Iwai850f0e52008-03-18 17:11:05 +01001931 SD_STS_FIFO_READY))
1932 nwait++;
1933 }
1934 if (!nwait)
1935 break;
1936 cpu_relax();
1937 }
1938 } else {
1939 /* wait until all RUN bits are cleared */
1940 for (timeout = 5000; timeout; timeout--) {
1941 nwait = 0;
1942 snd_pcm_group_for_each_entry(s, substream) {
1943 if (s->pcm->card != substream->pcm->card)
1944 continue;
1945 azx_dev = get_azx_dev(s);
Dylan Reid40830812014-02-28 15:41:13 -08001946 if (azx_sd_readb(chip, azx_dev, SD_CTL) &
Takashi Iwai850f0e52008-03-18 17:11:05 +01001947 SD_CTL_DMA_START)
1948 nwait++;
1949 }
1950 if (!nwait)
1951 break;
1952 cpu_relax();
1953 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001954 }
Pierre-Louis Bossart172d3b22012-09-21 18:39:05 -05001955 spin_lock(&chip->reg_lock);
1956 /* reset SYNC bits */
1957 if (chip->driver_caps & AZX_DCAPS_OLD_SSYNC)
1958 azx_writel(chip, OLD_SSYNC,
1959 azx_readl(chip, OLD_SSYNC) & ~sbits);
1960 else
1961 azx_writel(chip, SSYNC, azx_readl(chip, SSYNC) & ~sbits);
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001962 if (start) {
1963 azx_timecounter_init(substream, 0, 0);
1964 if (nsync > 1) {
1965 cycle_t cycle_last;
1966
1967 /* same start cycle for master and group */
1968 azx_dev = get_azx_dev(substream);
1969 cycle_last = azx_dev->azx_tc.cycle_last;
1970
1971 snd_pcm_group_for_each_entry(s, substream) {
1972 if (s->pcm->card != substream->pcm->card)
1973 continue;
1974 azx_timecounter_init(s, 1, cycle_last);
1975 }
1976 }
1977 }
Pierre-Louis Bossart172d3b22012-09-21 18:39:05 -05001978 spin_unlock(&chip->reg_lock);
Takashi Iwai850f0e52008-03-18 17:11:05 +01001979 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001980}
1981
Joseph Chan0e153472008-08-26 14:38:03 +02001982/* get the current DMA position with correction on VIA chips */
1983static unsigned int azx_via_get_position(struct azx *chip,
1984 struct azx_dev *azx_dev)
1985{
1986 unsigned int link_pos, mini_pos, bound_pos;
1987 unsigned int mod_link_pos, mod_dma_pos, mod_mini_pos;
1988 unsigned int fifo_size;
1989
Dylan Reid40830812014-02-28 15:41:13 -08001990 link_pos = azx_sd_readl(chip, azx_dev, SD_LPIB);
Takashi Iwaib4a655e2011-06-07 12:26:56 +02001991 if (azx_dev->substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
Joseph Chan0e153472008-08-26 14:38:03 +02001992 /* Playback, no problem using link position */
1993 return link_pos;
1994 }
1995
1996 /* Capture */
1997 /* For new chipset,
1998 * use mod to get the DMA position just like old chipset
1999 */
2000 mod_dma_pos = le32_to_cpu(*azx_dev->posbuf);
2001 mod_dma_pos %= azx_dev->period_bytes;
2002
2003 /* azx_dev->fifo_size can't get FIFO size of in stream.
2004 * Get from base address + offset.
2005 */
2006 fifo_size = readw(chip->remap_addr + VIA_IN_STREAM0_FIFO_SIZE_OFFSET);
2007
2008 if (azx_dev->insufficient) {
2009 /* Link position never gather than FIFO size */
2010 if (link_pos <= fifo_size)
2011 return 0;
2012
2013 azx_dev->insufficient = 0;
2014 }
2015
2016 if (link_pos <= fifo_size)
2017 mini_pos = azx_dev->bufsize + link_pos - fifo_size;
2018 else
2019 mini_pos = link_pos - fifo_size;
2020
2021 /* Find nearest previous boudary */
2022 mod_mini_pos = mini_pos % azx_dev->period_bytes;
2023 mod_link_pos = link_pos % azx_dev->period_bytes;
2024 if (mod_link_pos >= fifo_size)
2025 bound_pos = link_pos - mod_link_pos;
2026 else if (mod_dma_pos >= mod_mini_pos)
2027 bound_pos = mini_pos - mod_mini_pos;
2028 else {
2029 bound_pos = mini_pos - mod_mini_pos + azx_dev->period_bytes;
2030 if (bound_pos >= azx_dev->bufsize)
2031 bound_pos = 0;
2032 }
2033
2034 /* Calculate real DMA position we want */
2035 return bound_pos + mod_dma_pos;
2036}
2037
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002038static unsigned int azx_get_position(struct azx *chip,
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002039 struct azx_dev *azx_dev,
2040 bool with_check)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002041{
Takashi Iwai21229612013-04-05 07:27:45 +02002042 struct snd_pcm_substream *substream = azx_dev->substream;
2043 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002044 unsigned int pos;
Takashi Iwai21229612013-04-05 07:27:45 +02002045 int stream = substream->stream;
2046 struct hda_pcm_stream *hinfo = apcm->hinfo[stream];
Takashi Iwai1a8506d2012-10-16 15:10:08 +02002047 int delay = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002048
David Henningsson4cb36312010-09-30 10:12:50 +02002049 switch (chip->position_fix[stream]) {
2050 case POS_FIX_LPIB:
2051 /* read LPIB */
Dylan Reid40830812014-02-28 15:41:13 -08002052 pos = azx_sd_readl(chip, azx_dev, SD_LPIB);
David Henningsson4cb36312010-09-30 10:12:50 +02002053 break;
2054 case POS_FIX_VIACOMBO:
Joseph Chan0e153472008-08-26 14:38:03 +02002055 pos = azx_via_get_position(chip, azx_dev);
David Henningsson4cb36312010-09-30 10:12:50 +02002056 break;
2057 default:
2058 /* use the position buffer */
2059 pos = le32_to_cpu(*azx_dev->posbuf);
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002060 if (with_check && chip->position_fix[stream] == POS_FIX_AUTO) {
Takashi Iwaia8103642011-06-07 12:23:23 +02002061 if (!pos || pos == (u32)-1) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002062 dev_info(chip->card->dev,
2063 "Invalid position buffer, using LPIB read method instead.\n");
Takashi Iwaia8103642011-06-07 12:23:23 +02002064 chip->position_fix[stream] = POS_FIX_LPIB;
Dylan Reid40830812014-02-28 15:41:13 -08002065 pos = azx_sd_readl(chip, azx_dev, SD_LPIB);
Takashi Iwaia8103642011-06-07 12:23:23 +02002066 } else
2067 chip->position_fix[stream] = POS_FIX_POSBUF;
2068 }
2069 break;
Takashi Iwaic74db862005-05-12 14:26:27 +02002070 }
David Henningsson4cb36312010-09-30 10:12:50 +02002071
Linus Torvalds1da177e2005-04-16 15:20:36 -07002072 if (pos >= azx_dev->bufsize)
2073 pos = 0;
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002074
2075 /* calculate runtime delay from LPIB */
Takashi Iwai21229612013-04-05 07:27:45 +02002076 if (substream->runtime &&
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002077 chip->position_fix[stream] == POS_FIX_POSBUF &&
2078 (chip->driver_caps & AZX_DCAPS_COUNT_LPIB_DELAY)) {
Dylan Reid40830812014-02-28 15:41:13 -08002079 unsigned int lpib_pos = azx_sd_readl(chip, azx_dev, SD_LPIB);
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002080 if (stream == SNDRV_PCM_STREAM_PLAYBACK)
2081 delay = pos - lpib_pos;
2082 else
2083 delay = lpib_pos - pos;
Takashi Iwaie8648e52013-12-06 17:15:01 +01002084 if (delay < 0) {
2085 if (delay >= azx_dev->delay_negative_threshold)
2086 delay = 0;
2087 else
2088 delay += azx_dev->bufsize;
2089 }
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002090 if (delay >= azx_dev->period_bytes) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002091 dev_info(chip->card->dev,
2092 "Unstable LPIB (%d >= %d); disabling LPIB delay counting\n",
2093 delay, azx_dev->period_bytes);
Takashi Iwai1f046612012-10-16 16:52:26 +02002094 delay = 0;
2095 chip->driver_caps &= ~AZX_DCAPS_COUNT_LPIB_DELAY;
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002096 }
Takashi Iwai21229612013-04-05 07:27:45 +02002097 delay = bytes_to_frames(substream->runtime, delay);
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002098 }
Takashi Iwai21229612013-04-05 07:27:45 +02002099
2100 if (substream->runtime) {
2101 if (hinfo->ops.get_delay)
2102 delay += hinfo->ops.get_delay(hinfo, apcm->codec,
2103 substream);
2104 substream->runtime->delay = delay;
2105 }
2106
Takashi Iwai1a8506d2012-10-16 15:10:08 +02002107 trace_azx_get_position(chip, azx_dev, pos, delay);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002108 return pos;
2109}
2110
2111static snd_pcm_uframes_t azx_pcm_pointer(struct snd_pcm_substream *substream)
2112{
2113 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2114 struct azx *chip = apcm->chip;
2115 struct azx_dev *azx_dev = get_azx_dev(substream);
2116 return bytes_to_frames(substream->runtime,
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002117 azx_get_position(chip, azx_dev, false));
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002118}
2119
2120/*
2121 * Check whether the current DMA position is acceptable for updating
2122 * periods. Returns non-zero if it's OK.
2123 *
2124 * Many HD-audio controllers appear pretty inaccurate about
2125 * the update-IRQ timing. The IRQ is issued before actually the
2126 * data is processed. So, we need to process it afterwords in a
2127 * workqueue.
2128 */
2129static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev)
2130{
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002131 u32 wallclk;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002132 unsigned int pos;
2133
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002134 wallclk = azx_readl(chip, WALLCLK) - azx_dev->start_wallclk;
2135 if (wallclk < (azx_dev->period_wallclk * 2) / 3)
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002136 return -1; /* bogus (too early) interrupt */
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002137
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002138 pos = azx_get_position(chip, azx_dev, true);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002139
Takashi Iwaid6d8bf52010-02-12 18:17:06 +01002140 if (WARN_ONCE(!azx_dev->period_bytes,
2141 "hda-intel: zero azx_dev->period_bytes"))
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002142 return -1; /* this shouldn't happen! */
Jaroslav Kyselaedb39932010-06-02 13:29:17 +02002143 if (wallclk < (azx_dev->period_wallclk * 5) / 4 &&
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002144 pos % azx_dev->period_bytes > azx_dev->period_bytes / 2)
2145 /* NG - it's below the first next period boundary */
2146 return bdl_pos_adj[chip->dev_index] ? 0 : -1;
Jaroslav Kyselaedb39932010-06-02 13:29:17 +02002147 azx_dev->start_wallclk += wallclk;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002148 return 1; /* OK, it's fine */
2149}
2150
2151/*
2152 * The work for pending PCM period updates.
2153 */
2154static void azx_irq_pending_work(struct work_struct *work)
2155{
2156 struct azx *chip = container_of(work, struct azx, irq_pending_work);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002157 int i, pending, ok;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002158
Takashi Iwaia6a950a2008-06-10 17:53:35 +02002159 if (!chip->irq_pending_warned) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002160 dev_info(chip->card->dev,
2161 "IRQ timing workaround is activated for card #%d. Suggest a bigger bdl_pos_adj.\n",
2162 chip->card->number);
Takashi Iwaia6a950a2008-06-10 17:53:35 +02002163 chip->irq_pending_warned = 1;
2164 }
2165
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002166 for (;;) {
2167 pending = 0;
2168 spin_lock_irq(&chip->reg_lock);
2169 for (i = 0; i < chip->num_streams; i++) {
2170 struct azx_dev *azx_dev = &chip->azx_dev[i];
2171 if (!azx_dev->irq_pending ||
2172 !azx_dev->substream ||
2173 !azx_dev->running)
2174 continue;
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002175 ok = azx_position_ok(chip, azx_dev);
2176 if (ok > 0) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002177 azx_dev->irq_pending = 0;
2178 spin_unlock(&chip->reg_lock);
2179 snd_pcm_period_elapsed(azx_dev->substream);
2180 spin_lock(&chip->reg_lock);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002181 } else if (ok < 0) {
2182 pending = 0; /* too early */
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002183 } else
2184 pending++;
2185 }
2186 spin_unlock_irq(&chip->reg_lock);
2187 if (!pending)
2188 return;
Takashi Iwai08af4952010-08-03 14:39:04 +02002189 msleep(1);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002190 }
2191}
2192
2193/* clear irq_pending flags and assure no on-going workq */
2194static void azx_clear_irq_pending(struct azx *chip)
2195{
2196 int i;
2197
2198 spin_lock_irq(&chip->reg_lock);
2199 for (i = 0; i < chip->num_streams; i++)
2200 chip->azx_dev[i].irq_pending = 0;
2201 spin_unlock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002202}
2203
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002204#ifdef CONFIG_X86
2205static int azx_pcm_mmap(struct snd_pcm_substream *substream,
2206 struct vm_area_struct *area)
2207{
2208 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2209 struct azx *chip = apcm->chip;
2210 if (!azx_snoop(chip))
2211 area->vm_page_prot = pgprot_writecombine(area->vm_page_prot);
2212 return snd_pcm_lib_default_mmap(substream, area);
2213}
2214#else
2215#define azx_pcm_mmap NULL
2216#endif
2217
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002218static struct snd_pcm_ops azx_pcm_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002219 .open = azx_pcm_open,
2220 .close = azx_pcm_close,
2221 .ioctl = snd_pcm_lib_ioctl,
2222 .hw_params = azx_pcm_hw_params,
2223 .hw_free = azx_pcm_hw_free,
2224 .prepare = azx_pcm_prepare,
2225 .trigger = azx_pcm_trigger,
2226 .pointer = azx_pcm_pointer,
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05002227 .wall_clock = azx_get_wallclock_tstamp,
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002228 .mmap = azx_pcm_mmap,
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002229 .page = snd_pcm_sgbuf_ops_page,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002230};
2231
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002232static void azx_pcm_free(struct snd_pcm *pcm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002233{
Takashi Iwai176d5332008-07-30 15:01:44 +02002234 struct azx_pcm *apcm = pcm->private_data;
2235 if (apcm) {
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002236 list_del(&apcm->list);
Takashi Iwai176d5332008-07-30 15:01:44 +02002237 kfree(apcm);
2238 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002239}
2240
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002241#define MAX_PREALLOC_SIZE (32 * 1024 * 1024)
2242
Takashi Iwai176d5332008-07-30 15:01:44 +02002243static int
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002244azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec,
2245 struct hda_pcm *cpcm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002246{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002247 struct azx *chip = bus->private_data;
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002248 struct snd_pcm *pcm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002249 struct azx_pcm *apcm;
Takashi Iwai176d5332008-07-30 15:01:44 +02002250 int pcm_dev = cpcm->device;
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002251 unsigned int size;
Takashi Iwai176d5332008-07-30 15:01:44 +02002252 int s, err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002253
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002254 list_for_each_entry(apcm, &chip->pcm_list, list) {
2255 if (apcm->pcm->device == pcm_dev) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002256 dev_err(chip->card->dev, "PCM %d already exists\n",
2257 pcm_dev);
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002258 return -EBUSY;
2259 }
Takashi Iwai176d5332008-07-30 15:01:44 +02002260 }
2261 err = snd_pcm_new(chip->card, cpcm->name, pcm_dev,
2262 cpcm->stream[SNDRV_PCM_STREAM_PLAYBACK].substreams,
2263 cpcm->stream[SNDRV_PCM_STREAM_CAPTURE].substreams,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002264 &pcm);
2265 if (err < 0)
2266 return err;
Takashi Iwai18cb7102009-04-16 10:22:24 +02002267 strlcpy(pcm->name, cpcm->name, sizeof(pcm->name));
Takashi Iwai176d5332008-07-30 15:01:44 +02002268 apcm = kzalloc(sizeof(*apcm), GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002269 if (apcm == NULL)
2270 return -ENOMEM;
2271 apcm->chip = chip;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002272 apcm->pcm = pcm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002273 apcm->codec = codec;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002274 pcm->private_data = apcm;
2275 pcm->private_free = azx_pcm_free;
Takashi Iwai176d5332008-07-30 15:01:44 +02002276 if (cpcm->pcm_type == HDA_PCM_TYPE_MODEM)
2277 pcm->dev_class = SNDRV_PCM_CLASS_MODEM;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002278 list_add_tail(&apcm->list, &chip->pcm_list);
Takashi Iwai176d5332008-07-30 15:01:44 +02002279 cpcm->pcm = pcm;
2280 for (s = 0; s < 2; s++) {
2281 apcm->hinfo[s] = &cpcm->stream[s];
2282 if (cpcm->stream[s].substreams)
2283 snd_pcm_set_ops(pcm, s, &azx_pcm_ops);
2284 }
2285 /* buffer pre-allocation */
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002286 size = CONFIG_SND_HDA_PREALLOC_SIZE * 1024;
2287 if (size > MAX_PREALLOC_SIZE)
2288 size = MAX_PREALLOC_SIZE;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002289 snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV_SG,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002290 snd_dma_pci_data(chip->pci),
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002291 size, MAX_PREALLOC_SIZE);
Takashi Iwai13aeaf62014-02-25 07:53:47 +01002292 /* link to codec */
2293 pcm->dev = &codec->dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002294 return 0;
2295}
2296
2297/*
2298 * mixer creation - all stuff is implemented in hda module
2299 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05002300static int azx_mixer_create(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002301{
2302 return snd_hda_build_controls(chip->bus);
2303}
2304
2305
2306/*
2307 * initialize SD streams
2308 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05002309static int azx_init_stream(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002310{
2311 int i;
2312
2313 /* initialize each stream (aka device)
Takashi Iwaid01ce992007-07-27 16:52:19 +02002314 * assign the starting bdl address to each stream (device)
2315 * and initialize
Linus Torvalds1da177e2005-04-16 15:20:36 -07002316 */
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002317 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002318 struct azx_dev *azx_dev = &chip->azx_dev[i];
Takashi Iwai929861c2006-08-31 16:55:40 +02002319 azx_dev->posbuf = (u32 __iomem *)(chip->posbuf.area + i * 8);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002320 /* offset: SDI0=0x80, SDI1=0xa0, ... SDO3=0x160 */
2321 azx_dev->sd_addr = chip->remap_addr + (0x20 * i + 0x80);
2322 /* int mask: SDI0=0x01, SDI1=0x02, ... SDO3=0x80 */
2323 azx_dev->sd_int_sta_mask = 1 << i;
2324 /* stream tag: must be non-zero and unique */
2325 azx_dev->index = i;
2326 azx_dev->stream_tag = i + 1;
2327 }
2328
2329 return 0;
2330}
2331
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002332static int azx_acquire_irq(struct azx *chip, int do_disconnect)
2333{
Takashi Iwai437a5a42006-11-21 12:14:23 +01002334 if (request_irq(chip->pci->irq, azx_interrupt,
2335 chip->msi ? 0 : IRQF_SHARED,
Takashi Iwai934c2b62011-06-10 16:36:37 +02002336 KBUILD_MODNAME, chip)) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002337 dev_err(chip->card->dev,
2338 "unable to grab IRQ %d, disabling device\n",
2339 chip->pci->irq);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002340 if (do_disconnect)
2341 snd_card_disconnect(chip->card);
2342 return -1;
2343 }
2344 chip->irq = chip->pci->irq;
Takashi Iwai69e13412006-11-21 12:10:55 +01002345 pci_intx(chip->pci, !chip->msi);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002346 return 0;
2347}
2348
Linus Torvalds1da177e2005-04-16 15:20:36 -07002349
Takashi Iwaicb53c622007-08-10 17:21:45 +02002350static void azx_stop_chip(struct azx *chip)
2351{
Takashi Iwai95e99fd2007-08-13 15:29:04 +02002352 if (!chip->initialized)
Takashi Iwaicb53c622007-08-10 17:21:45 +02002353 return;
2354
2355 /* disable interrupts */
2356 azx_int_disable(chip);
2357 azx_int_clear(chip);
2358
2359 /* disable CORB/RIRB */
2360 azx_free_cmd_io(chip);
2361
2362 /* disable position buffer */
2363 azx_writel(chip, DPLBASE, 0);
2364 azx_writel(chip, DPUBASE, 0);
2365
2366 chip->initialized = 0;
2367}
2368
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002369#ifdef CONFIG_SND_HDA_DSP_LOADER
2370/*
2371 * DSP loading code (e.g. for CA0132)
2372 */
2373
2374/* use the first stream for loading DSP */
2375static struct azx_dev *
2376azx_get_dsp_loader_dev(struct azx *chip)
2377{
2378 return &chip->azx_dev[chip->playback_index_offset];
2379}
2380
2381static int azx_load_dsp_prepare(struct hda_bus *bus, unsigned int format,
2382 unsigned int byte_size,
2383 struct snd_dma_buffer *bufp)
2384{
2385 u32 *bdl;
2386 struct azx *chip = bus->private_data;
2387 struct azx_dev *azx_dev;
2388 int err;
2389
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002390 azx_dev = azx_get_dsp_loader_dev(chip);
2391
2392 dsp_lock(azx_dev);
2393 spin_lock_irq(&chip->reg_lock);
2394 if (azx_dev->running || azx_dev->locked) {
2395 spin_unlock_irq(&chip->reg_lock);
2396 err = -EBUSY;
2397 goto unlock;
2398 }
2399 azx_dev->prepared = 0;
2400 chip->saved_azx_dev = *azx_dev;
2401 azx_dev->locked = 1;
2402 spin_unlock_irq(&chip->reg_lock);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002403
2404 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV_SG,
2405 snd_dma_pci_data(chip->pci),
2406 byte_size, bufp);
2407 if (err < 0)
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002408 goto err_alloc;
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002409
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002410 mark_pages_wc(chip, bufp, true);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002411 azx_dev->bufsize = byte_size;
2412 azx_dev->period_bytes = byte_size;
2413 azx_dev->format_val = format;
2414
2415 azx_stream_reset(chip, azx_dev);
2416
2417 /* reset BDL address */
Dylan Reid40830812014-02-28 15:41:13 -08002418 azx_sd_writel(chip, azx_dev, SD_BDLPL, 0);
2419 azx_sd_writel(chip, azx_dev, SD_BDLPU, 0);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002420
2421 azx_dev->frags = 0;
2422 bdl = (u32 *)azx_dev->bdl.area;
2423 err = setup_bdle(chip, bufp, azx_dev, &bdl, 0, byte_size, 0);
2424 if (err < 0)
2425 goto error;
2426
2427 azx_setup_controller(chip, azx_dev);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002428 dsp_unlock(azx_dev);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002429 return azx_dev->stream_tag;
2430
2431 error:
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002432 mark_pages_wc(chip, bufp, false);
2433 snd_dma_free_pages(bufp);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002434 err_alloc:
2435 spin_lock_irq(&chip->reg_lock);
2436 if (azx_dev->opened)
2437 *azx_dev = chip->saved_azx_dev;
2438 azx_dev->locked = 0;
2439 spin_unlock_irq(&chip->reg_lock);
2440 unlock:
2441 dsp_unlock(azx_dev);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002442 return err;
2443}
2444
2445static void azx_load_dsp_trigger(struct hda_bus *bus, bool start)
2446{
2447 struct azx *chip = bus->private_data;
2448 struct azx_dev *azx_dev = azx_get_dsp_loader_dev(chip);
2449
2450 if (start)
2451 azx_stream_start(chip, azx_dev);
2452 else
2453 azx_stream_stop(chip, azx_dev);
2454 azx_dev->running = start;
2455}
2456
2457static void azx_load_dsp_cleanup(struct hda_bus *bus,
2458 struct snd_dma_buffer *dmab)
2459{
2460 struct azx *chip = bus->private_data;
2461 struct azx_dev *azx_dev = azx_get_dsp_loader_dev(chip);
2462
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002463 if (!dmab->area || !azx_dev->locked)
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002464 return;
2465
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002466 dsp_lock(azx_dev);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002467 /* reset BDL address */
Dylan Reid40830812014-02-28 15:41:13 -08002468 azx_sd_writel(chip, azx_dev, SD_BDLPL, 0);
2469 azx_sd_writel(chip, azx_dev, SD_BDLPU, 0);
2470 azx_sd_writel(chip, azx_dev, SD_CTL, 0);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002471 azx_dev->bufsize = 0;
2472 azx_dev->period_bytes = 0;
2473 azx_dev->format_val = 0;
2474
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002475 mark_pages_wc(chip, dmab, false);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002476 snd_dma_free_pages(dmab);
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002477 dmab->area = NULL;
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002478
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002479 spin_lock_irq(&chip->reg_lock);
2480 if (azx_dev->opened)
2481 *azx_dev = chip->saved_azx_dev;
2482 azx_dev->locked = 0;
2483 spin_unlock_irq(&chip->reg_lock);
2484 dsp_unlock(azx_dev);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002485}
2486#endif /* CONFIG_SND_HDA_DSP_LOADER */
2487
Takashi Iwai83012a72012-08-24 18:38:08 +02002488#ifdef CONFIG_PM
Takashi Iwaicb53c622007-08-10 17:21:45 +02002489/* power-up/down the controller */
Takashi Iwai68467f52012-08-28 09:14:29 -07002490static void azx_power_notify(struct hda_bus *bus, bool power_up)
Takashi Iwaicb53c622007-08-10 17:21:45 +02002491{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002492 struct azx *chip = bus->private_data;
Takashi Iwaicb53c622007-08-10 17:21:45 +02002493
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01002494 if (!(chip->driver_caps & AZX_DCAPS_PM_RUNTIME))
2495 return;
2496
Takashi Iwai68467f52012-08-28 09:14:29 -07002497 if (power_up)
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002498 pm_runtime_get_sync(&chip->pci->dev);
2499 else
2500 pm_runtime_put_sync(&chip->pci->dev);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002501}
Takashi Iwai65fcd412012-08-14 17:13:32 +02002502
2503static DEFINE_MUTEX(card_list_lock);
2504static LIST_HEAD(card_list);
2505
2506static void azx_add_card_list(struct azx *chip)
2507{
2508 mutex_lock(&card_list_lock);
2509 list_add(&chip->list, &card_list);
2510 mutex_unlock(&card_list_lock);
2511}
2512
2513static void azx_del_card_list(struct azx *chip)
2514{
2515 mutex_lock(&card_list_lock);
2516 list_del_init(&chip->list);
2517 mutex_unlock(&card_list_lock);
2518}
2519
2520/* trigger power-save check at writing parameter */
2521static int param_set_xint(const char *val, const struct kernel_param *kp)
2522{
2523 struct azx *chip;
2524 struct hda_codec *c;
2525 int prev = power_save;
2526 int ret = param_set_int(val, kp);
2527
2528 if (ret || prev == power_save)
2529 return ret;
2530
2531 mutex_lock(&card_list_lock);
2532 list_for_each_entry(chip, &card_list, list) {
2533 if (!chip->bus || chip->disabled)
2534 continue;
2535 list_for_each_entry(c, &chip->bus->codec_list, list)
2536 snd_hda_power_sync(c);
2537 }
2538 mutex_unlock(&card_list_lock);
2539 return 0;
2540}
2541#else
2542#define azx_add_card_list(chip) /* NOP */
2543#define azx_del_card_list(chip) /* NOP */
Takashi Iwai83012a72012-08-24 18:38:08 +02002544#endif /* CONFIG_PM */
Takashi Iwai5c0b9be2008-12-11 11:47:17 +01002545
Takashi Iwai7ccbde52012-08-14 18:10:09 +02002546#if defined(CONFIG_PM_SLEEP) || defined(SUPPORT_VGA_SWITCHEROO)
Takashi Iwai5c0b9be2008-12-11 11:47:17 +01002547/*
2548 * power management
2549 */
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002550static int azx_suspend(struct device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002551{
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002552 struct pci_dev *pci = to_pci_dev(dev);
2553 struct snd_card *card = dev_get_drvdata(dev);
Takashi Iwai421a1252005-11-17 16:11:09 +01002554 struct azx *chip = card->private_data;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002555 struct azx_pcm *p;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002556
Takashi Iwaic5c21522012-12-04 17:01:25 +01002557 if (chip->disabled)
2558 return 0;
2559
Takashi Iwai421a1252005-11-17 16:11:09 +01002560 snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002561 azx_clear_irq_pending(chip);
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002562 list_for_each_entry(p, &chip->pcm_list, list)
2563 snd_pcm_suspend_all(p->pcm);
Takashi Iwai0b7a2e92007-08-14 15:18:26 +02002564 if (chip->initialized)
Takashi Iwai8dd78332009-06-02 01:16:07 +02002565 snd_hda_suspend(chip->bus);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002566 azx_stop_chip(chip);
Mengdong Lin7295b262013-06-25 05:58:49 -04002567 azx_enter_link_reset(chip);
Takashi Iwai30b35392006-10-11 18:52:53 +02002568 if (chip->irq >= 0) {
Takashi Iwai43001c92006-09-08 12:30:03 +02002569 free_irq(chip->irq, chip);
Takashi Iwai30b35392006-10-11 18:52:53 +02002570 chip->irq = -1;
2571 }
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002572 if (chip->msi)
Takashi Iwai43001c92006-09-08 12:30:03 +02002573 pci_disable_msi(chip->pci);
Takashi Iwai421a1252005-11-17 16:11:09 +01002574 pci_disable_device(pci);
2575 pci_save_state(pci);
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002576 pci_set_power_state(pci, PCI_D3hot);
Wang Xingchao99a20082013-05-30 22:07:10 +08002577 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)
2578 hda_display_power(false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002579 return 0;
2580}
2581
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002582static int azx_resume(struct device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002583{
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002584 struct pci_dev *pci = to_pci_dev(dev);
2585 struct snd_card *card = dev_get_drvdata(dev);
Takashi Iwai421a1252005-11-17 16:11:09 +01002586 struct azx *chip = card->private_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002587
Takashi Iwaic5c21522012-12-04 17:01:25 +01002588 if (chip->disabled)
2589 return 0;
2590
Wang Xingchao99a20082013-05-30 22:07:10 +08002591 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)
2592 hda_display_power(true);
Takashi Iwaid14a7e02009-02-16 10:13:03 +01002593 pci_set_power_state(pci, PCI_D0);
2594 pci_restore_state(pci);
Takashi Iwai30b35392006-10-11 18:52:53 +02002595 if (pci_enable_device(pci) < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002596 dev_err(chip->card->dev,
2597 "pci_enable_device failed, disabling device\n");
Takashi Iwai30b35392006-10-11 18:52:53 +02002598 snd_card_disconnect(card);
2599 return -EIO;
2600 }
2601 pci_set_master(pci);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002602 if (chip->msi)
2603 if (pci_enable_msi(pci) < 0)
2604 chip->msi = 0;
2605 if (azx_acquire_irq(chip, 1) < 0)
Takashi Iwai30b35392006-10-11 18:52:53 +02002606 return -EIO;
Takashi Iwaicb53c622007-08-10 17:21:45 +02002607 azx_init_pci(chip);
Maxim Levitskyd804ad92007-09-03 15:28:04 +02002608
Takashi Iwai7f308302012-05-08 16:52:23 +02002609 azx_init_chip(chip, 1);
Maxim Levitskyd804ad92007-09-03 15:28:04 +02002610
Linus Torvalds1da177e2005-04-16 15:20:36 -07002611 snd_hda_resume(chip->bus);
Takashi Iwai421a1252005-11-17 16:11:09 +01002612 snd_power_change_state(card, SNDRV_CTL_POWER_D0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002613 return 0;
2614}
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002615#endif /* CONFIG_PM_SLEEP || SUPPORT_VGA_SWITCHEROO */
2616
2617#ifdef CONFIG_PM_RUNTIME
2618static int azx_runtime_suspend(struct device *dev)
2619{
2620 struct snd_card *card = dev_get_drvdata(dev);
2621 struct azx *chip = card->private_data;
2622
Dave Airlie246efa42013-07-29 15:19:29 +10002623 if (chip->disabled)
2624 return 0;
2625
2626 if (!(chip->driver_caps & AZX_DCAPS_PM_RUNTIME))
2627 return 0;
2628
Wang Xingchao7d4f6062013-07-25 23:34:46 -04002629 /* enable controller wake up event */
2630 azx_writew(chip, WAKEEN, azx_readw(chip, WAKEEN) |
2631 STATESTS_INT_MASK);
2632
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002633 azx_stop_chip(chip);
Takashi Iwai873ce8a2013-11-26 11:58:40 +01002634 azx_enter_link_reset(chip);
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002635 azx_clear_irq_pending(chip);
Wang Xingchao99a20082013-05-30 22:07:10 +08002636 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)
2637 hda_display_power(false);
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002638 return 0;
2639}
2640
2641static int azx_runtime_resume(struct device *dev)
2642{
2643 struct snd_card *card = dev_get_drvdata(dev);
2644 struct azx *chip = card->private_data;
Wang Xingchao7d4f6062013-07-25 23:34:46 -04002645 struct hda_bus *bus;
2646 struct hda_codec *codec;
2647 int status;
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002648
Dave Airlie246efa42013-07-29 15:19:29 +10002649 if (chip->disabled)
2650 return 0;
2651
2652 if (!(chip->driver_caps & AZX_DCAPS_PM_RUNTIME))
2653 return 0;
2654
Wang Xingchao99a20082013-05-30 22:07:10 +08002655 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)
2656 hda_display_power(true);
Wang Xingchao7d4f6062013-07-25 23:34:46 -04002657
2658 /* Read STATESTS before controller reset */
2659 status = azx_readw(chip, STATESTS);
2660
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002661 azx_init_pci(chip);
2662 azx_init_chip(chip, 1);
Wang Xingchao7d4f6062013-07-25 23:34:46 -04002663
2664 bus = chip->bus;
2665 if (status && bus) {
2666 list_for_each_entry(codec, &bus->codec_list, list)
2667 if (status & (1 << codec->addr))
2668 queue_delayed_work(codec->bus->workq,
2669 &codec->jackpoll_work, codec->jackpoll_interval);
2670 }
2671
2672 /* disable controller Wake Up event*/
2673 azx_writew(chip, WAKEEN, azx_readw(chip, WAKEEN) &
2674 ~STATESTS_INT_MASK);
2675
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002676 return 0;
2677}
Takashi Iwai6eb827d2012-12-12 11:50:12 +01002678
2679static int azx_runtime_idle(struct device *dev)
2680{
2681 struct snd_card *card = dev_get_drvdata(dev);
2682 struct azx *chip = card->private_data;
2683
Dave Airlie246efa42013-07-29 15:19:29 +10002684 if (chip->disabled)
2685 return 0;
2686
Takashi Iwai6eb827d2012-12-12 11:50:12 +01002687 if (!power_save_controller ||
2688 !(chip->driver_caps & AZX_DCAPS_PM_RUNTIME))
2689 return -EBUSY;
2690
2691 return 0;
2692}
2693
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002694#endif /* CONFIG_PM_RUNTIME */
2695
2696#ifdef CONFIG_PM
2697static const struct dev_pm_ops azx_pm = {
2698 SET_SYSTEM_SLEEP_PM_OPS(azx_suspend, azx_resume)
Takashi Iwai6eb827d2012-12-12 11:50:12 +01002699 SET_RUNTIME_PM_OPS(azx_runtime_suspend, azx_runtime_resume, azx_runtime_idle)
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002700};
2701
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002702#define AZX_PM_OPS &azx_pm
2703#else
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002704#define AZX_PM_OPS NULL
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002705#endif /* CONFIG_PM */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002706
2707
2708/*
Takashi Iwai0cbf0092008-10-29 16:18:25 +01002709 * reboot notifier for hang-up problem at power-down
2710 */
2711static int azx_halt(struct notifier_block *nb, unsigned long event, void *buf)
2712{
2713 struct azx *chip = container_of(nb, struct azx, reboot_notifier);
Takashi Iwaifb8d1a32009-11-10 16:02:29 +01002714 snd_hda_bus_reboot_notify(chip->bus);
Takashi Iwai0cbf0092008-10-29 16:18:25 +01002715 azx_stop_chip(chip);
2716 return NOTIFY_OK;
2717}
2718
2719static void azx_notifier_register(struct azx *chip)
2720{
2721 chip->reboot_notifier.notifier_call = azx_halt;
2722 register_reboot_notifier(&chip->reboot_notifier);
2723}
2724
2725static void azx_notifier_unregister(struct azx *chip)
2726{
2727 if (chip->reboot_notifier.notifier_call)
2728 unregister_reboot_notifier(&chip->reboot_notifier);
2729}
2730
Takashi Iwai48c8b0e2012-12-07 07:40:35 +01002731static int azx_probe_continue(struct azx *chip);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002732
Steven Newbury8393ec4a2012-06-08 13:06:29 +02002733#ifdef SUPPORT_VGA_SWITCHEROO
Bill Pembertone23e7a12012-12-06 12:35:10 -05002734static struct pci_dev *get_bound_vga(struct pci_dev *pci);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002735
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002736static void azx_vs_set_state(struct pci_dev *pci,
2737 enum vga_switcheroo_state state)
2738{
2739 struct snd_card *card = pci_get_drvdata(pci);
2740 struct azx *chip = card->private_data;
2741 bool disabled;
2742
Takashi Iwaif4c482a2012-12-04 15:09:23 +01002743 wait_for_completion(&chip->probe_wait);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002744 if (chip->init_failed)
2745 return;
2746
2747 disabled = (state == VGA_SWITCHEROO_OFF);
2748 if (chip->disabled == disabled)
2749 return;
2750
2751 if (!chip->bus) {
2752 chip->disabled = disabled;
2753 if (!disabled) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002754 dev_info(chip->card->dev,
2755 "Start delayed initialization\n");
Takashi Iwai5c906802013-05-30 22:07:09 +08002756 if (azx_probe_continue(chip) < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002757 dev_err(chip->card->dev, "initialization error\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002758 chip->init_failed = true;
2759 }
2760 }
2761 } else {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002762 dev_info(chip->card->dev, "%s via VGA-switcheroo\n",
2763 disabled ? "Disabling" : "Enabling");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002764 if (disabled) {
Dave Airlie246efa42013-07-29 15:19:29 +10002765 pm_runtime_put_sync_suspend(&pci->dev);
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002766 azx_suspend(&pci->dev);
Dave Airlie246efa42013-07-29 15:19:29 +10002767 /* when we get suspended by vga switcheroo we end up in D3cold,
2768 * however we have no ACPI handle, so pci/acpi can't put us there,
2769 * put ourselves there */
2770 pci->current_state = PCI_D3cold;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002771 chip->disabled = true;
Takashi Iwai128960a2012-10-12 17:28:18 +02002772 if (snd_hda_lock_devices(chip->bus))
Takashi Iwai4e76a882014-02-25 12:21:03 +01002773 dev_warn(chip->card->dev,
2774 "Cannot lock devices!\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002775 } else {
2776 snd_hda_unlock_devices(chip->bus);
Dave Airlie246efa42013-07-29 15:19:29 +10002777 pm_runtime_get_noresume(&pci->dev);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002778 chip->disabled = false;
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002779 azx_resume(&pci->dev);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002780 }
2781 }
2782}
2783
2784static bool azx_vs_can_switch(struct pci_dev *pci)
2785{
2786 struct snd_card *card = pci_get_drvdata(pci);
2787 struct azx *chip = card->private_data;
2788
Takashi Iwaif4c482a2012-12-04 15:09:23 +01002789 wait_for_completion(&chip->probe_wait);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002790 if (chip->init_failed)
2791 return false;
2792 if (chip->disabled || !chip->bus)
2793 return true;
2794 if (snd_hda_lock_devices(chip->bus))
2795 return false;
2796 snd_hda_unlock_devices(chip->bus);
2797 return true;
2798}
2799
Bill Pembertone23e7a12012-12-06 12:35:10 -05002800static void init_vga_switcheroo(struct azx *chip)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002801{
2802 struct pci_dev *p = get_bound_vga(chip->pci);
2803 if (p) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002804 dev_info(chip->card->dev,
2805 "Handle VGA-switcheroo audio client\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002806 chip->use_vga_switcheroo = 1;
2807 pci_dev_put(p);
2808 }
2809}
2810
2811static const struct vga_switcheroo_client_ops azx_vs_ops = {
2812 .set_gpu_state = azx_vs_set_state,
2813 .can_switch = azx_vs_can_switch,
2814};
2815
Bill Pembertone23e7a12012-12-06 12:35:10 -05002816static int register_vga_switcheroo(struct azx *chip)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002817{
Takashi Iwai128960a2012-10-12 17:28:18 +02002818 int err;
2819
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002820 if (!chip->use_vga_switcheroo)
2821 return 0;
2822 /* FIXME: currently only handling DIS controller
2823 * is there any machine with two switchable HDMI audio controllers?
2824 */
Takashi Iwai128960a2012-10-12 17:28:18 +02002825 err = vga_switcheroo_register_audio_client(chip->pci, &azx_vs_ops,
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002826 VGA_SWITCHEROO_DIS,
2827 chip->bus != NULL);
Takashi Iwai128960a2012-10-12 17:28:18 +02002828 if (err < 0)
2829 return err;
2830 chip->vga_switcheroo_registered = 1;
Dave Airlie246efa42013-07-29 15:19:29 +10002831
2832 /* register as an optimus hdmi audio power domain */
2833 vga_switcheroo_init_domain_pm_optimus_hdmi_audio(&chip->pci->dev, &chip->hdmi_pm_domain);
Takashi Iwai128960a2012-10-12 17:28:18 +02002834 return 0;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002835}
2836#else
2837#define init_vga_switcheroo(chip) /* NOP */
2838#define register_vga_switcheroo(chip) 0
Steven Newbury8393ec4a2012-06-08 13:06:29 +02002839#define check_hdmi_disabled(pci) false
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002840#endif /* SUPPORT_VGA_SWITCHER */
2841
Takashi Iwai0cbf0092008-10-29 16:18:25 +01002842/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002843 * destructor
2844 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002845static int azx_free(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002846{
Wang Xingchaoc67e2222013-05-30 22:07:08 +08002847 struct pci_dev *pci = chip->pci;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002848 int i;
2849
Wang Xingchaoc67e2222013-05-30 22:07:08 +08002850 if ((chip->driver_caps & AZX_DCAPS_PM_RUNTIME)
2851 && chip->running)
2852 pm_runtime_get_noresume(&pci->dev);
2853
Takashi Iwai65fcd412012-08-14 17:13:32 +02002854 azx_del_card_list(chip);
2855
Takashi Iwai0cbf0092008-10-29 16:18:25 +01002856 azx_notifier_unregister(chip);
2857
Takashi Iwaif4c482a2012-12-04 15:09:23 +01002858 chip->init_failed = 1; /* to be sure */
Daniel J Blueman44728e92012-12-18 23:59:33 +08002859 complete_all(&chip->probe_wait);
Takashi Iwaif4c482a2012-12-04 15:09:23 +01002860
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002861 if (use_vga_switcheroo(chip)) {
2862 if (chip->disabled && chip->bus)
2863 snd_hda_unlock_devices(chip->bus);
Takashi Iwai128960a2012-10-12 17:28:18 +02002864 if (chip->vga_switcheroo_registered)
2865 vga_switcheroo_unregister_client(chip->pci);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002866 }
2867
Takashi Iwaice43fba2005-05-30 20:33:44 +02002868 if (chip->initialized) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002869 azx_clear_irq_pending(chip);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002870 for (i = 0; i < chip->num_streams; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002871 azx_stream_stop(chip, &chip->azx_dev[i]);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002872 azx_stop_chip(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002873 }
2874
Jeff Garzikf000fd82008-04-22 13:50:34 +02002875 if (chip->irq >= 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002876 free_irq(chip->irq, (void*)chip);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002877 if (chip->msi)
Takashi Iwai30b35392006-10-11 18:52:53 +02002878 pci_disable_msi(chip->pci);
Takashi Iwaif079c252006-06-01 11:42:14 +02002879 if (chip->remap_addr)
2880 iounmap(chip->remap_addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002881
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002882 if (chip->azx_dev) {
2883 for (i = 0; i < chip->num_streams; i++)
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002884 if (chip->azx_dev[i].bdl.area) {
2885 mark_pages_wc(chip, &chip->azx_dev[i].bdl, false);
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002886 snd_dma_free_pages(&chip->azx_dev[i].bdl);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002887 }
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002888 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002889 if (chip->rb.area) {
2890 mark_pages_wc(chip, &chip->rb, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002891 snd_dma_free_pages(&chip->rb);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002892 }
2893 if (chip->posbuf.area) {
2894 mark_pages_wc(chip, &chip->posbuf, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002895 snd_dma_free_pages(&chip->posbuf);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002896 }
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002897 if (chip->region_requested)
2898 pci_release_regions(chip->pci);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002899 pci_disable_device(chip->pci);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002900 kfree(chip->azx_dev);
Takashi Iwai4918cda2012-08-09 12:33:28 +02002901#ifdef CONFIG_SND_HDA_PATCH_LOADER
2902 if (chip->fw)
2903 release_firmware(chip->fw);
2904#endif
Wang Xingchao99a20082013-05-30 22:07:10 +08002905 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL) {
2906 hda_display_power(false);
2907 hda_i915_exit();
2908 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002909 kfree(chip);
2910
2911 return 0;
2912}
2913
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002914static int azx_dev_free(struct snd_device *device)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002915{
2916 return azx_free(device->device_data);
2917}
2918
Steven Newbury8393ec4a2012-06-08 13:06:29 +02002919#ifdef SUPPORT_VGA_SWITCHEROO
Linus Torvalds1da177e2005-04-16 15:20:36 -07002920/*
Takashi Iwai91219472012-04-26 12:13:25 +02002921 * Check of disabled HDMI controller by vga-switcheroo
2922 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05002923static struct pci_dev *get_bound_vga(struct pci_dev *pci)
Takashi Iwai91219472012-04-26 12:13:25 +02002924{
2925 struct pci_dev *p;
2926
2927 /* check only discrete GPU */
2928 switch (pci->vendor) {
2929 case PCI_VENDOR_ID_ATI:
2930 case PCI_VENDOR_ID_AMD:
2931 case PCI_VENDOR_ID_NVIDIA:
2932 if (pci->devfn == 1) {
2933 p = pci_get_domain_bus_and_slot(pci_domain_nr(pci->bus),
2934 pci->bus->number, 0);
2935 if (p) {
2936 if ((p->class >> 8) == PCI_CLASS_DISPLAY_VGA)
2937 return p;
2938 pci_dev_put(p);
2939 }
2940 }
2941 break;
2942 }
2943 return NULL;
2944}
2945
Bill Pembertone23e7a12012-12-06 12:35:10 -05002946static bool check_hdmi_disabled(struct pci_dev *pci)
Takashi Iwai91219472012-04-26 12:13:25 +02002947{
2948 bool vga_inactive = false;
2949 struct pci_dev *p = get_bound_vga(pci);
2950
2951 if (p) {
Takashi Iwai12b78a72012-06-07 12:15:16 +02002952 if (vga_switcheroo_get_client_state(p) == VGA_SWITCHEROO_OFF)
Takashi Iwai91219472012-04-26 12:13:25 +02002953 vga_inactive = true;
2954 pci_dev_put(p);
2955 }
2956 return vga_inactive;
2957}
Steven Newbury8393ec4a2012-06-08 13:06:29 +02002958#endif /* SUPPORT_VGA_SWITCHEROO */
Takashi Iwai91219472012-04-26 12:13:25 +02002959
2960/*
Takashi Iwai3372a152007-02-01 15:46:50 +01002961 * white/black-listing for position_fix
2962 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05002963static struct snd_pci_quirk position_fix_list[] = {
Takashi Iwaid2e1c972008-06-10 17:53:34 +02002964 SND_PCI_QUIRK(0x1028, 0x01cc, "Dell D820", POS_FIX_LPIB),
2965 SND_PCI_QUIRK(0x1028, 0x01de, "Dell Precision 390", POS_FIX_LPIB),
Takashi Iwai2f703e72009-12-01 14:17:37 +01002966 SND_PCI_QUIRK(0x103c, 0x306d, "HP dv3", POS_FIX_LPIB),
Takashi Iwaid2e1c972008-06-10 17:53:34 +02002967 SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB),
Daniel T Chendd37f8e2010-05-30 01:17:03 -04002968 SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS", POS_FIX_LPIB),
Daniel T Chen9f75c1b2010-05-30 13:08:41 -04002969 SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS M2V", POS_FIX_LPIB),
Daniel T Chene96d3122010-05-27 18:32:18 -04002970 SND_PCI_QUIRK(0x104d, 0x9069, "Sony VPCS11V9E", POS_FIX_LPIB),
David Henningssonb01de4f2012-01-12 16:31:14 +01002971 SND_PCI_QUIRK(0x10de, 0xcb89, "Macbook Pro 7,1", POS_FIX_LPIB),
Daniel T Chen61bb42c2010-05-29 11:04:11 -04002972 SND_PCI_QUIRK(0x1297, 0x3166, "Shuttle", POS_FIX_LPIB),
Daniel T Chen9ec8dda2010-03-28 02:34:40 -04002973 SND_PCI_QUIRK(0x1458, 0xa022, "ga-ma770-ud3", POS_FIX_LPIB),
Takashi Iwai45d4ebf2009-11-30 11:58:30 +01002974 SND_PCI_QUIRK(0x1462, 0x1002, "MSI Wind U115", POS_FIX_LPIB),
Takashi Iwai8815cd02010-04-15 09:02:41 +02002975 SND_PCI_QUIRK(0x1565, 0x8218, "Biostar Microtech", POS_FIX_LPIB),
Daniel T Chenb90c0762010-05-30 19:31:41 -04002976 SND_PCI_QUIRK(0x1849, 0x0888, "775Dual-VSTA", POS_FIX_LPIB),
Daniel T Chen0e0280d2010-04-21 19:55:43 -04002977 SND_PCI_QUIRK(0x8086, 0x2503, "DG965OT AAD63733-203", POS_FIX_LPIB),
Takashi Iwai3372a152007-02-01 15:46:50 +01002978 {}
2979};
2980
Bill Pembertone23e7a12012-12-06 12:35:10 -05002981static int check_position_fix(struct azx *chip, int fix)
Takashi Iwai3372a152007-02-01 15:46:50 +01002982{
2983 const struct snd_pci_quirk *q;
2984
Takashi Iwaic673ba12009-03-17 07:49:14 +01002985 switch (fix) {
Takashi Iwai1dac6692012-09-13 14:59:47 +02002986 case POS_FIX_AUTO:
Takashi Iwaic673ba12009-03-17 07:49:14 +01002987 case POS_FIX_LPIB:
2988 case POS_FIX_POSBUF:
David Henningsson4cb36312010-09-30 10:12:50 +02002989 case POS_FIX_VIACOMBO:
Takashi Iwaia6f2fd52012-02-28 11:58:40 +01002990 case POS_FIX_COMBO:
Takashi Iwaic673ba12009-03-17 07:49:14 +01002991 return fix;
2992 }
2993
Takashi Iwaic673ba12009-03-17 07:49:14 +01002994 q = snd_pci_quirk_lookup(chip->pci, position_fix_list);
2995 if (q) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002996 dev_info(chip->card->dev,
2997 "position_fix set to %d for device %04x:%04x\n",
2998 q->value, q->subvendor, q->subdevice);
Takashi Iwaic673ba12009-03-17 07:49:14 +01002999 return q->value;
Takashi Iwai3372a152007-02-01 15:46:50 +01003000 }
David Henningssonbdd9ef22010-10-04 12:02:14 +02003001
3002 /* Check VIA/ATI HD Audio Controller exist */
Takashi Iwai9477c582011-05-25 09:11:37 +02003003 if (chip->driver_caps & AZX_DCAPS_POSFIX_VIA) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003004 dev_dbg(chip->card->dev, "Using VIACOMBO position fix\n");
David Henningssonbdd9ef22010-10-04 12:02:14 +02003005 return POS_FIX_VIACOMBO;
3006 }
Takashi Iwai9477c582011-05-25 09:11:37 +02003007 if (chip->driver_caps & AZX_DCAPS_POSFIX_LPIB) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003008 dev_dbg(chip->card->dev, "Using LPIB position fix\n");
Takashi Iwai9477c582011-05-25 09:11:37 +02003009 return POS_FIX_LPIB;
3010 }
Takashi Iwaic673ba12009-03-17 07:49:14 +01003011 return POS_FIX_AUTO;
Takashi Iwai3372a152007-02-01 15:46:50 +01003012}
3013
3014/*
Takashi Iwai669ba272007-08-17 09:17:36 +02003015 * black-lists for probe_mask
3016 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003017static struct snd_pci_quirk probe_mask_list[] = {
Takashi Iwai669ba272007-08-17 09:17:36 +02003018 /* Thinkpad often breaks the controller communication when accessing
3019 * to the non-working (or non-existing) modem codec slot.
3020 */
3021 SND_PCI_QUIRK(0x1014, 0x05b7, "Thinkpad Z60", 0x01),
3022 SND_PCI_QUIRK(0x17aa, 0x2010, "Thinkpad X/T/R60", 0x01),
3023 SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X/T/R61", 0x01),
Takashi Iwai0edb9452008-11-07 14:53:09 +01003024 /* broken BIOS */
3025 SND_PCI_QUIRK(0x1028, 0x20ac, "Dell Studio Desktop", 0x01),
Takashi Iwaief1681d2008-11-24 17:29:28 +01003026 /* including bogus ALC268 in slot#2 that conflicts with ALC888 */
3027 SND_PCI_QUIRK(0x17c0, 0x4085, "Medion MD96630", 0x01),
Takashi Iwai20db7cb2009-02-13 08:18:48 +01003028 /* forced codec slots */
Ozan Çağlayan93574842009-05-23 15:00:04 +03003029 SND_PCI_QUIRK(0x1043, 0x1262, "ASUS W5Fm", 0x103),
Takashi Iwai20db7cb2009-02-13 08:18:48 +01003030 SND_PCI_QUIRK(0x1046, 0x1262, "ASUS W5F", 0x103),
Jaroslav Kyselaf3af9052012-04-26 17:52:35 +02003031 /* WinFast VP200 H (Teradici) user reported broken communication */
3032 SND_PCI_QUIRK(0x3a21, 0x040d, "WinFast VP200 H", 0x101),
Takashi Iwai669ba272007-08-17 09:17:36 +02003033 {}
3034};
3035
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003036#define AZX_FORCE_CODEC_MASK 0x100
3037
Bill Pembertone23e7a12012-12-06 12:35:10 -05003038static void check_probe_mask(struct azx *chip, int dev)
Takashi Iwai669ba272007-08-17 09:17:36 +02003039{
3040 const struct snd_pci_quirk *q;
3041
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003042 chip->codec_probe_mask = probe_mask[dev];
3043 if (chip->codec_probe_mask == -1) {
Takashi Iwai669ba272007-08-17 09:17:36 +02003044 q = snd_pci_quirk_lookup(chip->pci, probe_mask_list);
3045 if (q) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003046 dev_info(chip->card->dev,
3047 "probe_mask set to 0x%x for device %04x:%04x\n",
3048 q->value, q->subvendor, q->subdevice);
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003049 chip->codec_probe_mask = q->value;
Takashi Iwai669ba272007-08-17 09:17:36 +02003050 }
3051 }
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003052
3053 /* check forced option */
3054 if (chip->codec_probe_mask != -1 &&
3055 (chip->codec_probe_mask & AZX_FORCE_CODEC_MASK)) {
3056 chip->codec_mask = chip->codec_probe_mask & 0xff;
Takashi Iwai4e76a882014-02-25 12:21:03 +01003057 dev_info(chip->card->dev, "codec_mask forced to 0x%x\n",
3058 chip->codec_mask);
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003059 }
Takashi Iwai669ba272007-08-17 09:17:36 +02003060}
3061
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003062/*
Takashi Iwai716238552009-09-28 13:14:04 +02003063 * white/black-list for enable_msi
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003064 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003065static struct snd_pci_quirk msi_black_list[] = {
David Henningsson693e0cb2013-12-12 09:52:03 +01003066 SND_PCI_QUIRK(0x103c, 0x2191, "HP", 0), /* AMD Hudson */
3067 SND_PCI_QUIRK(0x103c, 0x2192, "HP", 0), /* AMD Hudson */
3068 SND_PCI_QUIRK(0x103c, 0x21f7, "HP", 0), /* AMD Hudson */
3069 SND_PCI_QUIRK(0x103c, 0x21fa, "HP", 0), /* AMD Hudson */
Takashi Iwai9dc83982009-12-22 08:15:01 +01003070 SND_PCI_QUIRK(0x1043, 0x81f2, "ASUS", 0), /* Athlon64 X2 + nvidia */
Takashi Iwai0a27fcf2010-02-15 17:05:28 +01003071 SND_PCI_QUIRK(0x1043, 0x81f6, "ASUS", 0), /* nvidia */
Ralf Gerbigecd21622010-03-09 18:25:47 +01003072 SND_PCI_QUIRK(0x1043, 0x822d, "ASUS", 0), /* Athlon64 X2 + nvidia MCP55 */
Takashi Iwai83f72152013-09-09 10:20:48 +02003073 SND_PCI_QUIRK(0x1179, 0xfb44, "Toshiba Satellite C870", 0), /* AMD Hudson */
Michele Ballabio4193d132010-03-06 21:06:46 +01003074 SND_PCI_QUIRK(0x1849, 0x0888, "ASRock", 0), /* Athlon64 X2 + nvidia */
Takashi Iwai38155952010-04-04 12:14:03 +02003075 SND_PCI_QUIRK(0xa0a0, 0x0575, "Aopen MZ915-M", 0), /* ICH6 */
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003076 {}
3077};
3078
Bill Pembertone23e7a12012-12-06 12:35:10 -05003079static void check_msi(struct azx *chip)
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003080{
3081 const struct snd_pci_quirk *q;
3082
Takashi Iwai716238552009-09-28 13:14:04 +02003083 if (enable_msi >= 0) {
3084 chip->msi = !!enable_msi;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003085 return;
Takashi Iwai716238552009-09-28 13:14:04 +02003086 }
3087 chip->msi = 1; /* enable MSI as default */
3088 q = snd_pci_quirk_lookup(chip->pci, msi_black_list);
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003089 if (q) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003090 dev_info(chip->card->dev,
3091 "msi for device %04x:%04x set to %d\n",
3092 q->subvendor, q->subdevice, q->value);
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003093 chip->msi = q->value;
Takashi Iwai80c43ed2010-03-15 15:51:53 +01003094 return;
3095 }
3096
3097 /* NVidia chipsets seem to cause troubles with MSI */
Takashi Iwai9477c582011-05-25 09:11:37 +02003098 if (chip->driver_caps & AZX_DCAPS_NO_MSI) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003099 dev_info(chip->card->dev, "Disabling MSI\n");
Takashi Iwai80c43ed2010-03-15 15:51:53 +01003100 chip->msi = 0;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003101 }
3102}
3103
Takashi Iwaia1585d72011-12-14 09:27:04 +01003104/* check the snoop mode availability */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003105static void azx_check_snoop_available(struct azx *chip)
Takashi Iwaia1585d72011-12-14 09:27:04 +01003106{
3107 bool snoop = chip->snoop;
3108
3109 switch (chip->driver_type) {
3110 case AZX_DRIVER_VIA:
3111 /* force to non-snoop mode for a new VIA controller
3112 * when BIOS is set
3113 */
3114 if (snoop) {
3115 u8 val;
3116 pci_read_config_byte(chip->pci, 0x42, &val);
3117 if (!(val & 0x80) && chip->pci->revision == 0x30)
3118 snoop = false;
3119 }
3120 break;
3121 case AZX_DRIVER_ATIHDMI_NS:
3122 /* new ATI HDMI requires non-snoop */
3123 snoop = false;
3124 break;
Takashi Iwaic1279f82013-02-07 17:36:22 +01003125 case AZX_DRIVER_CTHDA:
3126 snoop = false;
3127 break;
Takashi Iwaia1585d72011-12-14 09:27:04 +01003128 }
3129
3130 if (snoop != chip->snoop) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003131 dev_info(chip->card->dev, "Force to %s mode\n",
3132 snoop ? "snoop" : "non-snoop");
Takashi Iwaia1585d72011-12-14 09:27:04 +01003133 chip->snoop = snoop;
3134 }
3135}
Takashi Iwai669ba272007-08-17 09:17:36 +02003136
Wang Xingchao99a20082013-05-30 22:07:10 +08003137static void azx_probe_work(struct work_struct *work)
3138{
3139 azx_probe_continue(container_of(work, struct azx, probe_work));
3140}
Wang Xingchao99a20082013-05-30 22:07:10 +08003141
Takashi Iwai669ba272007-08-17 09:17:36 +02003142/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07003143 * constructor
3144 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003145static int azx_create(struct snd_card *card, struct pci_dev *pci,
3146 int dev, unsigned int driver_caps,
Dylan Reid40830812014-02-28 15:41:13 -08003147 const struct hda_controller_ops *hda_ops,
Bill Pembertone23e7a12012-12-06 12:35:10 -05003148 struct azx **rchip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003149{
Takashi Iwaia98f90f2005-11-17 14:59:02 +01003150 static struct snd_device_ops ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003151 .dev_free = azx_dev_free,
3152 };
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003153 struct azx *chip;
3154 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003155
3156 *rchip = NULL;
Tobin Davisbcd72002008-01-15 11:23:55 +01003157
Pavel Machek927fc862006-08-31 17:03:43 +02003158 err = pci_enable_device(pci);
3159 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003160 return err;
3161
Takashi Iwaie560d8d2005-09-09 14:21:46 +02003162 chip = kzalloc(sizeof(*chip), GFP_KERNEL);
Pavel Machek927fc862006-08-31 17:03:43 +02003163 if (!chip) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003164 dev_err(card->dev, "Cannot allocate chip\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07003165 pci_disable_device(pci);
3166 return -ENOMEM;
3167 }
3168
3169 spin_lock_init(&chip->reg_lock);
Ingo Molnar62932df2006-01-16 16:34:20 +01003170 mutex_init(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003171 chip->card = card;
3172 chip->pci = pci;
Dylan Reid40830812014-02-28 15:41:13 -08003173 chip->ops = hda_ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003174 chip->irq = -1;
Takashi Iwai9477c582011-05-25 09:11:37 +02003175 chip->driver_caps = driver_caps;
3176 chip->driver_type = driver_caps & 0xff;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003177 check_msi(chip);
Takashi Iwai555e2192008-06-10 17:53:34 +02003178 chip->dev_index = dev;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02003179 INIT_WORK(&chip->irq_pending_work, azx_irq_pending_work);
Takashi Iwai01b65bf2011-11-24 14:31:46 +01003180 INIT_LIST_HEAD(&chip->pcm_list);
Takashi Iwai65fcd412012-08-14 17:13:32 +02003181 INIT_LIST_HEAD(&chip->list);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003182 init_vga_switcheroo(chip);
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003183 init_completion(&chip->probe_wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003184
Shahin Ghazinouribeaffc32010-05-11 08:19:55 +02003185 chip->position_fix[0] = chip->position_fix[1] =
3186 check_position_fix(chip, position_fix[dev]);
Takashi Iwaia6f2fd52012-02-28 11:58:40 +01003187 /* combo mode uses LPIB for playback */
3188 if (chip->position_fix[0] == POS_FIX_COMBO) {
3189 chip->position_fix[0] = POS_FIX_LPIB;
3190 chip->position_fix[1] = POS_FIX_AUTO;
3191 }
3192
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003193 check_probe_mask(chip, dev);
Takashi Iwai3372a152007-02-01 15:46:50 +01003194
Takashi Iwai27346162006-01-12 18:28:44 +01003195 chip->single_cmd = single_cmd;
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003196 chip->snoop = hda_snoop;
Takashi Iwaia1585d72011-12-14 09:27:04 +01003197 azx_check_snoop_available(chip);
Takashi Iwaic74db862005-05-12 14:26:27 +02003198
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02003199 if (bdl_pos_adj[dev] < 0) {
3200 switch (chip->driver_type) {
Takashi Iwai0c6341a2008-06-13 20:50:27 +02003201 case AZX_DRIVER_ICH:
Seth Heasley32679f92010-02-22 17:31:09 -08003202 case AZX_DRIVER_PCH:
Takashi Iwai0c6341a2008-06-13 20:50:27 +02003203 bdl_pos_adj[dev] = 1;
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02003204 break;
3205 default:
Takashi Iwai0c6341a2008-06-13 20:50:27 +02003206 bdl_pos_adj[dev] = 32;
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02003207 break;
3208 }
3209 }
3210
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003211 err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
3212 if (err < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003213 dev_err(card->dev, "Error creating device [card]!\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003214 azx_free(chip);
3215 return err;
3216 }
3217
Wang Xingchao99a20082013-05-30 22:07:10 +08003218 /* continue probing in work context as may trigger request module */
3219 INIT_WORK(&chip->probe_work, azx_probe_work);
Wang Xingchao99a20082013-05-30 22:07:10 +08003220
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003221 *rchip = chip;
Wang Xingchao99a20082013-05-30 22:07:10 +08003222
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003223 return 0;
3224}
3225
Takashi Iwai48c8b0e2012-12-07 07:40:35 +01003226static int azx_first_init(struct azx *chip)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003227{
3228 int dev = chip->dev_index;
3229 struct pci_dev *pci = chip->pci;
3230 struct snd_card *card = chip->card;
3231 int i, err;
3232 unsigned short gcap;
3233
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003234#if BITS_PER_LONG != 64
3235 /* Fix up base address on ULI M5461 */
3236 if (chip->driver_type == AZX_DRIVER_ULI) {
3237 u16 tmp3;
3238 pci_read_config_word(pci, 0x40, &tmp3);
3239 pci_write_config_word(pci, 0x40, tmp3 | 0x10);
3240 pci_write_config_dword(pci, PCI_BASE_ADDRESS_1, 0);
3241 }
3242#endif
3243
Pavel Machek927fc862006-08-31 17:03:43 +02003244 err = pci_request_regions(pci, "ICH HD audio");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003245 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003246 return err;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003247 chip->region_requested = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003248
Pavel Machek927fc862006-08-31 17:03:43 +02003249 chip->addr = pci_resource_start(pci, 0);
Arjan van de Ven2f5ad542008-09-28 16:20:09 -07003250 chip->remap_addr = pci_ioremap_bar(pci, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003251 if (chip->remap_addr == NULL) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003252 dev_err(card->dev, "ioremap error\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003253 return -ENXIO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003254 }
3255
Takashi Iwai68e7fff2006-10-23 13:40:59 +02003256 if (chip->msi)
3257 if (pci_enable_msi(pci) < 0)
3258 chip->msi = 0;
Stephen Hemminger7376d012006-08-21 19:17:46 +02003259
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003260 if (azx_acquire_irq(chip, 0) < 0)
3261 return -EBUSY;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003262
3263 pci_set_master(pci);
3264 synchronize_irq(chip->irq);
3265
Tobin Davisbcd72002008-01-15 11:23:55 +01003266 gcap = azx_readw(chip, GCAP);
Takashi Iwai4e76a882014-02-25 12:21:03 +01003267 dev_dbg(card->dev, "chipset global capabilities = 0x%x\n", gcap);
Tobin Davisbcd72002008-01-15 11:23:55 +01003268
Andiry Brienzadc4c2e62009-07-08 13:55:31 +08003269 /* disable SB600 64bit support for safety */
Takashi Iwai9477c582011-05-25 09:11:37 +02003270 if (chip->pci->vendor == PCI_VENDOR_ID_ATI) {
Andiry Brienzadc4c2e62009-07-08 13:55:31 +08003271 struct pci_dev *p_smbus;
3272 p_smbus = pci_get_device(PCI_VENDOR_ID_ATI,
3273 PCI_DEVICE_ID_ATI_SBX00_SMBUS,
3274 NULL);
3275 if (p_smbus) {
3276 if (p_smbus->revision < 0x30)
3277 gcap &= ~ICH6_GCAP_64OK;
3278 pci_dev_put(p_smbus);
3279 }
3280 }
Takashi Iwai09240cf2009-03-17 07:47:18 +01003281
Takashi Iwai9477c582011-05-25 09:11:37 +02003282 /* disable 64bit DMA address on some devices */
3283 if (chip->driver_caps & AZX_DCAPS_NO_64BIT) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003284 dev_dbg(card->dev, "Disabling 64bit DMA\n");
Jaroslav Kysela396087e2009-12-09 10:44:47 +01003285 gcap &= ~ICH6_GCAP_64OK;
Takashi Iwai9477c582011-05-25 09:11:37 +02003286 }
Jaroslav Kysela396087e2009-12-09 10:44:47 +01003287
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003288 /* disable buffer size rounding to 128-byte multiples if supported */
Takashi Iwai7bfe0592012-01-23 17:53:39 +01003289 if (align_buffer_size >= 0)
3290 chip->align_buffer_size = !!align_buffer_size;
3291 else {
3292 if (chip->driver_caps & AZX_DCAPS_BUFSIZE)
3293 chip->align_buffer_size = 0;
3294 else if (chip->driver_caps & AZX_DCAPS_ALIGN_BUFSIZE)
3295 chip->align_buffer_size = 1;
3296 else
3297 chip->align_buffer_size = 1;
3298 }
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003299
Takashi Iwaicf7aaca2008-02-06 15:05:57 +01003300 /* allow 64bit DMA address if supported by H/W */
Takashi Iwaib21fadb2009-05-28 12:26:15 +02003301 if ((gcap & ICH6_GCAP_64OK) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64)))
Yang Hongyange9304382009-04-13 14:40:14 -07003302 pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(64));
Takashi Iwai09240cf2009-03-17 07:47:18 +01003303 else {
Yang Hongyange9304382009-04-13 14:40:14 -07003304 pci_set_dma_mask(pci, DMA_BIT_MASK(32));
3305 pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(32));
Takashi Iwai09240cf2009-03-17 07:47:18 +01003306 }
Takashi Iwaicf7aaca2008-02-06 15:05:57 +01003307
Takashi Iwai8b6ed8e2008-02-19 11:36:35 +01003308 /* read number of streams from GCAP register instead of using
3309 * hardcoded value
3310 */
3311 chip->capture_streams = (gcap >> 8) & 0x0f;
3312 chip->playback_streams = (gcap >> 12) & 0x0f;
3313 if (!chip->playback_streams && !chip->capture_streams) {
Tobin Davisbcd72002008-01-15 11:23:55 +01003314 /* gcap didn't give any info, switching to old method */
3315
3316 switch (chip->driver_type) {
3317 case AZX_DRIVER_ULI:
3318 chip->playback_streams = ULI_NUM_PLAYBACK;
3319 chip->capture_streams = ULI_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01003320 break;
3321 case AZX_DRIVER_ATIHDMI:
Andiry Xu1815b342011-12-14 16:10:27 +08003322 case AZX_DRIVER_ATIHDMI_NS:
Tobin Davisbcd72002008-01-15 11:23:55 +01003323 chip->playback_streams = ATIHDMI_NUM_PLAYBACK;
3324 chip->capture_streams = ATIHDMI_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01003325 break;
Yang, Libinc4da29c2008-11-13 11:07:07 +01003326 case AZX_DRIVER_GENERIC:
Tobin Davisbcd72002008-01-15 11:23:55 +01003327 default:
3328 chip->playback_streams = ICH6_NUM_PLAYBACK;
3329 chip->capture_streams = ICH6_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01003330 break;
3331 }
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003332 }
Takashi Iwai8b6ed8e2008-02-19 11:36:35 +01003333 chip->capture_index_offset = 0;
3334 chip->playback_index_offset = chip->capture_streams;
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003335 chip->num_streams = chip->playback_streams + chip->capture_streams;
Takashi Iwaid01ce992007-07-27 16:52:19 +02003336 chip->azx_dev = kcalloc(chip->num_streams, sizeof(*chip->azx_dev),
3337 GFP_KERNEL);
Pavel Machek927fc862006-08-31 17:03:43 +02003338 if (!chip->azx_dev) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003339 dev_err(card->dev, "cannot malloc azx_dev\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003340 return -ENOMEM;
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003341 }
3342
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003343 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaieb49faa2013-03-15 09:19:11 +01003344 dsp_lock_init(&chip->azx_dev[i]);
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003345 /* allocate memory for the BDL for each stream */
3346 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
3347 snd_dma_pci_data(chip->pci),
3348 BDL_SIZE, &chip->azx_dev[i].bdl);
3349 if (err < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003350 dev_err(card->dev, "cannot allocate BDL\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003351 return -ENOMEM;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003352 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003353 mark_pages_wc(chip, &chip->azx_dev[i].bdl, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003354 }
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02003355 /* allocate memory for the position buffer */
Takashi Iwaid01ce992007-07-27 16:52:19 +02003356 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
3357 snd_dma_pci_data(chip->pci),
3358 chip->num_streams * 8, &chip->posbuf);
3359 if (err < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003360 dev_err(card->dev, "cannot allocate posbuf\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003361 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003362 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003363 mark_pages_wc(chip, &chip->posbuf, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003364 /* allocate CORB/RIRB */
Takashi Iwai81740862009-05-26 15:22:00 +02003365 err = azx_alloc_cmd_io(chip);
3366 if (err < 0)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003367 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003368
3369 /* initialize streams */
3370 azx_init_stream(chip);
3371
3372 /* initialize chip */
Takashi Iwaicb53c622007-08-10 17:21:45 +02003373 azx_init_pci(chip);
Jaroslav Kysela10e77dd2010-03-26 11:04:38 +01003374 azx_init_chip(chip, (probe_only[dev] & 2) == 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003375
3376 /* codec detection */
Pavel Machek927fc862006-08-31 17:03:43 +02003377 if (!chip->codec_mask) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003378 dev_err(card->dev, "no codecs found!\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003379 return -ENODEV;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003380 }
3381
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003382 strcpy(card->driver, "HDA-Intel");
Takashi Iwai18cb7102009-04-16 10:22:24 +02003383 strlcpy(card->shortname, driver_short_names[chip->driver_type],
3384 sizeof(card->shortname));
3385 snprintf(card->longname, sizeof(card->longname),
3386 "%s at 0x%lx irq %i",
3387 card->shortname, chip->addr, chip->irq);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003388
Linus Torvalds1da177e2005-04-16 15:20:36 -07003389 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003390}
3391
Takashi Iwaicb53c622007-08-10 17:21:45 +02003392static void power_down_all_codecs(struct azx *chip)
3393{
Takashi Iwai83012a72012-08-24 18:38:08 +02003394#ifdef CONFIG_PM
Takashi Iwaicb53c622007-08-10 17:21:45 +02003395 /* The codecs were powered up in snd_hda_codec_new().
3396 * Now all initialization done, so turn them down if possible
3397 */
3398 struct hda_codec *codec;
3399 list_for_each_entry(codec, &chip->bus->codec_list, list) {
3400 snd_hda_power_down(codec);
3401 }
3402#endif
3403}
3404
Takashi Iwai97c6a3d2012-08-09 17:40:46 +02003405#ifdef CONFIG_SND_HDA_PATCH_LOADER
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003406/* callback from request_firmware_nowait() */
3407static void azx_firmware_cb(const struct firmware *fw, void *context)
3408{
3409 struct snd_card *card = context;
3410 struct azx *chip = card->private_data;
3411 struct pci_dev *pci = chip->pci;
3412
3413 if (!fw) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003414 dev_err(card->dev, "Cannot load firmware, aborting\n");
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003415 goto error;
3416 }
3417
3418 chip->fw = fw;
3419 if (!chip->disabled) {
3420 /* continue probing */
3421 if (azx_probe_continue(chip))
3422 goto error;
3423 }
3424 return; /* OK */
3425
3426 error:
3427 snd_card_free(card);
3428 pci_set_drvdata(pci, NULL);
3429}
Takashi Iwai97c6a3d2012-08-09 17:40:46 +02003430#endif
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003431
Dylan Reid40830812014-02-28 15:41:13 -08003432/*
3433 * HDA controller ops.
3434 */
3435
3436/* PCI register access. */
3437static void pci_azx_writel(u32 value, u32 *addr)
3438{
3439 writel(value, addr);
3440}
3441
3442static u32 pci_azx_readl(u32 *addr)
3443{
3444 return readl(addr);
3445}
3446
3447static void pci_azx_writew(u16 value, u16 *addr)
3448{
3449 writew(value, addr);
3450}
3451
3452static u16 pci_azx_readw(u16 *addr)
3453{
3454 return readw(addr);
3455}
3456
3457static void pci_azx_writeb(u8 value, u8 *addr)
3458{
3459 writeb(value, addr);
3460}
3461
3462static u8 pci_azx_readb(u8 *addr)
3463{
3464 return readb(addr);
3465}
3466
3467static const struct hda_controller_ops pci_hda_ops = {
3468 .writel = pci_azx_writel,
3469 .readl = pci_azx_readl,
3470 .writew = pci_azx_writew,
3471 .readw = pci_azx_readw,
3472 .writeb = pci_azx_writeb,
3473 .readb = pci_azx_readb,
3474};
3475
Bill Pembertone23e7a12012-12-06 12:35:10 -05003476static int azx_probe(struct pci_dev *pci,
3477 const struct pci_device_id *pci_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003478{
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003479 static int dev;
Takashi Iwaia98f90f2005-11-17 14:59:02 +01003480 struct snd_card *card;
3481 struct azx *chip;
Takashi Iwaiaad730d2013-12-02 13:33:57 +01003482 bool schedule_probe;
Pavel Machek927fc862006-08-31 17:03:43 +02003483 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003484
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003485 if (dev >= SNDRV_CARDS)
3486 return -ENODEV;
3487 if (!enable[dev]) {
3488 dev++;
3489 return -ENOENT;
3490 }
3491
Takashi Iwai60c57722014-01-29 14:20:19 +01003492 err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,
3493 0, &card);
Takashi Iwaie58de7b2008-12-28 16:44:30 +01003494 if (err < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003495 dev_err(&pci->dev, "Error creating card!\n");
Takashi Iwaie58de7b2008-12-28 16:44:30 +01003496 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003497 }
3498
Dylan Reid40830812014-02-28 15:41:13 -08003499 err = azx_create(card, pci, dev, pci_id->driver_data,
3500 &pci_hda_ops, &chip);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003501 if (err < 0)
3502 goto out_free;
Takashi Iwai421a1252005-11-17 16:11:09 +01003503 card->private_data = chip;
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003504
3505 pci_set_drvdata(pci, card);
3506
3507 err = register_vga_switcheroo(chip);
3508 if (err < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003509 dev_err(card->dev, "Error registering VGA-switcheroo client\n");
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003510 goto out_free;
3511 }
3512
3513 if (check_hdmi_disabled(pci)) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003514 dev_info(card->dev, "VGA controller is disabled\n");
3515 dev_info(card->dev, "Delaying initialization\n");
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003516 chip->disabled = true;
3517 }
3518
Takashi Iwaiaad730d2013-12-02 13:33:57 +01003519 schedule_probe = !chip->disabled;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003520
Takashi Iwai4918cda2012-08-09 12:33:28 +02003521#ifdef CONFIG_SND_HDA_PATCH_LOADER
3522 if (patch[dev] && *patch[dev]) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003523 dev_info(card->dev, "Applying patch firmware '%s'\n",
3524 patch[dev]);
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003525 err = request_firmware_nowait(THIS_MODULE, true, patch[dev],
3526 &pci->dev, GFP_KERNEL, card,
3527 azx_firmware_cb);
Takashi Iwai4918cda2012-08-09 12:33:28 +02003528 if (err < 0)
3529 goto out_free;
Takashi Iwaiaad730d2013-12-02 13:33:57 +01003530 schedule_probe = false; /* continued in azx_firmware_cb() */
Takashi Iwai4918cda2012-08-09 12:33:28 +02003531 }
3532#endif /* CONFIG_SND_HDA_PATCH_LOADER */
3533
Takashi Iwaiaad730d2013-12-02 13:33:57 +01003534#ifndef CONFIG_SND_HDA_I915
3535 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)
Takashi Iwai4e76a882014-02-25 12:21:03 +01003536 dev_err(card->dev, "Haswell must build in CONFIG_SND_HDA_I915\n");
Wang Xingchao99a20082013-05-30 22:07:10 +08003537#endif
Wang Xingchao99a20082013-05-30 22:07:10 +08003538
Takashi Iwaiaad730d2013-12-02 13:33:57 +01003539 if (schedule_probe)
3540 schedule_work(&chip->probe_work);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003541
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003542 dev++;
Takashi Iwai88d071f2013-12-02 11:12:28 +01003543 if (chip->disabled)
3544 complete_all(&chip->probe_wait);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003545 return 0;
3546
3547out_free:
3548 snd_card_free(card);
3549 return err;
3550}
3551
Takashi Iwai48c8b0e2012-12-07 07:40:35 +01003552static int azx_probe_continue(struct azx *chip)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003553{
Wang Xingchaoc67e2222013-05-30 22:07:08 +08003554 struct pci_dev *pci = chip->pci;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003555 int dev = chip->dev_index;
3556 int err;
3557
Wang Xingchao99a20082013-05-30 22:07:10 +08003558 /* Request power well for Haswell HDA controller and codec */
3559 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL) {
David Henningssonc841ad22013-08-19 13:32:30 +02003560#ifdef CONFIG_SND_HDA_I915
Wang Xingchao99a20082013-05-30 22:07:10 +08003561 err = hda_i915_init();
3562 if (err < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003563 dev_err(chip->card->dev,
3564 "Error request power-well from i915\n");
Wang Xingchao99a20082013-05-30 22:07:10 +08003565 goto out_free;
3566 }
David Henningssonc841ad22013-08-19 13:32:30 +02003567#endif
Wang Xingchao99a20082013-05-30 22:07:10 +08003568 hda_display_power(true);
3569 }
3570
Takashi Iwai5c906802013-05-30 22:07:09 +08003571 err = azx_first_init(chip);
3572 if (err < 0)
3573 goto out_free;
3574
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +01003575#ifdef CONFIG_SND_HDA_INPUT_BEEP
3576 chip->beep_mode = beep_mode[dev];
3577#endif
3578
Linus Torvalds1da177e2005-04-16 15:20:36 -07003579 /* create codec instances */
Takashi Iwaia1e21c92009-06-17 09:33:52 +02003580 err = azx_codec_create(chip, model[dev]);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003581 if (err < 0)
3582 goto out_free;
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003583#ifdef CONFIG_SND_HDA_PATCH_LOADER
Takashi Iwai4918cda2012-08-09 12:33:28 +02003584 if (chip->fw) {
3585 err = snd_hda_load_patch(chip->bus, chip->fw->size,
3586 chip->fw->data);
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003587 if (err < 0)
3588 goto out_free;
Takashi Iwaie39ae852012-11-22 16:18:13 +01003589#ifndef CONFIG_PM
Takashi Iwai4918cda2012-08-09 12:33:28 +02003590 release_firmware(chip->fw); /* no longer needed */
3591 chip->fw = NULL;
Takashi Iwaie39ae852012-11-22 16:18:13 +01003592#endif
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003593 }
3594#endif
Jaroslav Kysela10e77dd2010-03-26 11:04:38 +01003595 if ((probe_only[dev] & 1) == 0) {
Takashi Iwaia1e21c92009-06-17 09:33:52 +02003596 err = azx_codec_configure(chip);
3597 if (err < 0)
3598 goto out_free;
3599 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003600
3601 /* create PCM streams */
Takashi Iwai176d5332008-07-30 15:01:44 +02003602 err = snd_hda_build_pcms(chip->bus);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003603 if (err < 0)
3604 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003605
3606 /* create mixer controls */
Takashi Iwaid01ce992007-07-27 16:52:19 +02003607 err = azx_mixer_create(chip);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003608 if (err < 0)
3609 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003610
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003611 err = snd_card_register(chip->card);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003612 if (err < 0)
3613 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003614
Takashi Iwaicb53c622007-08-10 17:21:45 +02003615 chip->running = 1;
3616 power_down_all_codecs(chip);
Takashi Iwai0cbf0092008-10-29 16:18:25 +01003617 azx_notifier_register(chip);
Takashi Iwai65fcd412012-08-14 17:13:32 +02003618 azx_add_card_list(chip);
Dave Airlie246efa42013-07-29 15:19:29 +10003619 if ((chip->driver_caps & AZX_DCAPS_PM_RUNTIME) || chip->use_vga_switcheroo)
Wang Xingchaoc67e2222013-05-30 22:07:08 +08003620 pm_runtime_put_noidle(&pci->dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003621
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003622out_free:
Takashi Iwai88d071f2013-12-02 11:12:28 +01003623 if (err < 0)
3624 chip->init_failed = 1;
3625 complete_all(&chip->probe_wait);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003626 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003627}
3628
Bill Pembertone23e7a12012-12-06 12:35:10 -05003629static void azx_remove(struct pci_dev *pci)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003630{
Takashi Iwai91219472012-04-26 12:13:25 +02003631 struct snd_card *card = pci_get_drvdata(pci);
Mengdong Linb8dfc4622012-08-23 17:32:30 +08003632
Takashi Iwai91219472012-04-26 12:13:25 +02003633 if (card)
3634 snd_card_free(card);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003635}
3636
3637/* PCI IDs */
Alexey Dobriyancebe41d2010-02-06 00:21:03 +02003638static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
Seth Heasleyd2f2fcd2010-01-12 17:03:35 -08003639 /* CPT */
Takashi Iwai9477c582011-05-25 09:11:37 +02003640 { PCI_DEVICE(0x8086, 0x1c20),
Takashi Iwaid7dab4d2013-01-08 13:51:30 +01003641 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM },
Seth Heasleycea310e2010-09-10 16:29:56 -07003642 /* PBG */
Takashi Iwai9477c582011-05-25 09:11:37 +02003643 { PCI_DEVICE(0x8086, 0x1d20),
Takashi Iwaid7dab4d2013-01-08 13:51:30 +01003644 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM },
Seth Heasleyd2edeb72011-04-20 10:59:57 -07003645 /* Panther Point */
Takashi Iwai9477c582011-05-25 09:11:37 +02003646 { PCI_DEVICE(0x8086, 0x1e20),
Takashi Iwaib1920c22013-11-22 12:43:25 +01003647 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
Seth Heasley8bc039a2012-01-23 16:24:31 -08003648 /* Lynx Point */
3649 { PCI_DEVICE(0x8086, 0x8c20),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003650 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
James Ralston884b0882013-02-08 17:29:40 -08003651 /* Wellsburg */
3652 { PCI_DEVICE(0x8086, 0x8d20),
3653 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
3654 { PCI_DEVICE(0x8086, 0x8d21),
3655 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
James Ralston144dad92012-08-09 09:38:59 -07003656 /* Lynx Point-LP */
3657 { PCI_DEVICE(0x8086, 0x9c20),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003658 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
James Ralston144dad92012-08-09 09:38:59 -07003659 /* Lynx Point-LP */
3660 { PCI_DEVICE(0x8086, 0x9c21),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003661 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
James Ralston4eeca492013-11-04 09:27:45 -08003662 /* Wildcat Point-LP */
3663 { PCI_DEVICE(0x8086, 0x9ca0),
3664 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
Wang Xingchaoe926f2c2012-06-13 10:23:51 +08003665 /* Haswell */
Wang Xingchao4a7c5162013-02-01 22:42:19 +08003666 { PCI_DEVICE(0x8086, 0x0a0c),
Takashi Iwaifab12852013-11-05 17:54:05 +01003667 .driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL },
Wang Xingchaoe926f2c2012-06-13 10:23:51 +08003668 { PCI_DEVICE(0x8086, 0x0c0c),
Takashi Iwaifab12852013-11-05 17:54:05 +01003669 .driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL },
Wang Xingchaod279fae2012-09-17 13:10:23 +08003670 { PCI_DEVICE(0x8086, 0x0d0c),
Takashi Iwaifab12852013-11-05 17:54:05 +01003671 .driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL },
Mengdong Lin862d7612014-01-08 15:55:14 -05003672 /* Broadwell */
3673 { PCI_DEVICE(0x8086, 0x160c),
3674 .driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL },
Pierre-Louis Bossart99df18b2012-09-21 18:39:07 -05003675 /* 5 Series/3400 */
3676 { PCI_DEVICE(0x8086, 0x3b56),
Takashi Iwai2c1350f2013-02-14 09:44:55 +01003677 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_NOPM },
Takashi Iwaif748abc2013-01-29 10:12:23 +01003678 /* Poulsbo */
Takashi Iwai9477c582011-05-25 09:11:37 +02003679 { PCI_DEVICE(0x8086, 0x811b),
Takashi Iwaif748abc2013-01-29 10:12:23 +01003680 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_NOPM },
3681 /* Oaktrail */
Li Peng09904b92011-12-28 15:17:26 +00003682 { PCI_DEVICE(0x8086, 0x080a),
Takashi Iwaif748abc2013-01-29 10:12:23 +01003683 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_NOPM },
Chew, Chiau Eee44007e2013-05-16 15:36:12 +08003684 /* BayTrail */
3685 { PCI_DEVICE(0x8086, 0x0f04),
3686 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM },
David Henningsson645e9032011-12-14 15:52:30 +08003687 /* ICH */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003688 { PCI_DEVICE(0x8086, 0x2668),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003689 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3690 AZX_DCAPS_BUFSIZE }, /* ICH6 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003691 { PCI_DEVICE(0x8086, 0x27d8),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003692 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3693 AZX_DCAPS_BUFSIZE }, /* ICH7 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003694 { PCI_DEVICE(0x8086, 0x269a),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003695 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3696 AZX_DCAPS_BUFSIZE }, /* ESB2 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003697 { PCI_DEVICE(0x8086, 0x284b),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003698 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3699 AZX_DCAPS_BUFSIZE }, /* ICH8 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003700 { PCI_DEVICE(0x8086, 0x293e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003701 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3702 AZX_DCAPS_BUFSIZE }, /* ICH9 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003703 { PCI_DEVICE(0x8086, 0x293f),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003704 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3705 AZX_DCAPS_BUFSIZE }, /* ICH9 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003706 { PCI_DEVICE(0x8086, 0x3a3e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003707 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3708 AZX_DCAPS_BUFSIZE }, /* ICH10 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003709 { PCI_DEVICE(0x8086, 0x3a6e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003710 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3711 AZX_DCAPS_BUFSIZE }, /* ICH10 */
Takashi Iwaib6864532010-09-15 10:17:26 +02003712 /* Generic Intel */
3713 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_ANY_ID),
3714 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3715 .class_mask = 0xffffff,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003716 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_BUFSIZE },
Takashi Iwai9477c582011-05-25 09:11:37 +02003717 /* ATI SB 450/600/700/800/900 */
3718 { PCI_DEVICE(0x1002, 0x437b),
3719 .driver_data = AZX_DRIVER_ATI | AZX_DCAPS_PRESET_ATI_SB },
3720 { PCI_DEVICE(0x1002, 0x4383),
3721 .driver_data = AZX_DRIVER_ATI | AZX_DCAPS_PRESET_ATI_SB },
3722 /* AMD Hudson */
3723 { PCI_DEVICE(0x1022, 0x780d),
3724 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_SB },
Takashi Iwai87218e92008-02-21 08:13:11 +01003725 /* ATI HDMI */
Takashi Iwai9477c582011-05-25 09:11:37 +02003726 { PCI_DEVICE(0x1002, 0x793b),
3727 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3728 { PCI_DEVICE(0x1002, 0x7919),
3729 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3730 { PCI_DEVICE(0x1002, 0x960f),
3731 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3732 { PCI_DEVICE(0x1002, 0x970f),
3733 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3734 { PCI_DEVICE(0x1002, 0xaa00),
3735 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3736 { PCI_DEVICE(0x1002, 0xaa08),
3737 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3738 { PCI_DEVICE(0x1002, 0xaa10),
3739 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3740 { PCI_DEVICE(0x1002, 0xaa18),
3741 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3742 { PCI_DEVICE(0x1002, 0xaa20),
3743 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3744 { PCI_DEVICE(0x1002, 0xaa28),
3745 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3746 { PCI_DEVICE(0x1002, 0xaa30),
3747 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3748 { PCI_DEVICE(0x1002, 0xaa38),
3749 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3750 { PCI_DEVICE(0x1002, 0xaa40),
3751 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3752 { PCI_DEVICE(0x1002, 0xaa48),
3753 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
Clemens Ladischbbaa0d62013-11-05 09:27:10 +01003754 { PCI_DEVICE(0x1002, 0xaa50),
3755 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3756 { PCI_DEVICE(0x1002, 0xaa58),
3757 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3758 { PCI_DEVICE(0x1002, 0xaa60),
3759 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3760 { PCI_DEVICE(0x1002, 0xaa68),
3761 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3762 { PCI_DEVICE(0x1002, 0xaa80),
3763 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3764 { PCI_DEVICE(0x1002, 0xaa88),
3765 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3766 { PCI_DEVICE(0x1002, 0xaa90),
3767 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3768 { PCI_DEVICE(0x1002, 0xaa98),
3769 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
Andiry Xu1815b342011-12-14 16:10:27 +08003770 { PCI_DEVICE(0x1002, 0x9902),
3771 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
3772 { PCI_DEVICE(0x1002, 0xaaa0),
3773 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
3774 { PCI_DEVICE(0x1002, 0xaaa8),
3775 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
3776 { PCI_DEVICE(0x1002, 0xaab0),
3777 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
Takashi Iwai87218e92008-02-21 08:13:11 +01003778 /* VIA VT8251/VT8237A */
Takashi Iwai9477c582011-05-25 09:11:37 +02003779 { PCI_DEVICE(0x1106, 0x3288),
3780 .driver_data = AZX_DRIVER_VIA | AZX_DCAPS_POSFIX_VIA },
Annie Liu754fdff2012-06-08 19:18:39 +08003781 /* VIA GFX VT7122/VX900 */
3782 { PCI_DEVICE(0x1106, 0x9170), .driver_data = AZX_DRIVER_GENERIC },
3783 /* VIA GFX VT6122/VX11 */
3784 { PCI_DEVICE(0x1106, 0x9140), .driver_data = AZX_DRIVER_GENERIC },
Takashi Iwai87218e92008-02-21 08:13:11 +01003785 /* SIS966 */
3786 { PCI_DEVICE(0x1039, 0x7502), .driver_data = AZX_DRIVER_SIS },
3787 /* ULI M5461 */
3788 { PCI_DEVICE(0x10b9, 0x5461), .driver_data = AZX_DRIVER_ULI },
3789 /* NVIDIA MCP */
Takashi Iwai0c2fd1bf42009-12-18 16:41:39 +01003790 { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID),
3791 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3792 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02003793 .driver_data = AZX_DRIVER_NVIDIA | AZX_DCAPS_PRESET_NVIDIA },
Kailang Yangf2690022008-05-27 11:44:55 +02003794 /* Teradici */
Takashi Iwai9477c582011-05-25 09:11:37 +02003795 { PCI_DEVICE(0x6549, 0x1200),
3796 .driver_data = AZX_DRIVER_TERA | AZX_DCAPS_NO_64BIT },
Lars R. Damerowf0b3da92012-11-02 13:10:39 -07003797 { PCI_DEVICE(0x6549, 0x2200),
3798 .driver_data = AZX_DRIVER_TERA | AZX_DCAPS_NO_64BIT },
Takashi Iwai4e01f542009-04-16 08:53:34 +02003799 /* Creative X-Fi (CA0110-IBG) */
Takashi Iwaif2a8eca2012-06-11 15:51:54 +02003800 /* CTHDA chips */
3801 { PCI_DEVICE(0x1102, 0x0010),
3802 .driver_data = AZX_DRIVER_CTHDA | AZX_DCAPS_PRESET_CTHDA },
3803 { PCI_DEVICE(0x1102, 0x0012),
3804 .driver_data = AZX_DRIVER_CTHDA | AZX_DCAPS_PRESET_CTHDA },
Takashi Iwai8eeaa2f2014-02-10 09:48:47 +01003805#if !IS_ENABLED(CONFIG_SND_CTXFI)
Takashi Iwai313f6e22009-05-18 12:40:52 +02003806 /* the following entry conflicts with snd-ctxfi driver,
3807 * as ctxfi driver mutates from HD-audio to native mode with
3808 * a special command sequence.
3809 */
Takashi Iwai4e01f542009-04-16 08:53:34 +02003810 { PCI_DEVICE(PCI_VENDOR_ID_CREATIVE, PCI_ANY_ID),
3811 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3812 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02003813 .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
Takashi Iwai69f9ba92011-11-06 13:49:13 +01003814 AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB },
Takashi Iwai313f6e22009-05-18 12:40:52 +02003815#else
3816 /* this entry seems still valid -- i.e. without emu20kx chip */
Takashi Iwai9477c582011-05-25 09:11:37 +02003817 { PCI_DEVICE(0x1102, 0x0009),
3818 .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
Takashi Iwai69f9ba92011-11-06 13:49:13 +01003819 AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB },
Takashi Iwai313f6e22009-05-18 12:40:52 +02003820#endif
Otavio Salvadore35d4b12010-09-26 23:35:06 -03003821 /* Vortex86MX */
3822 { PCI_DEVICE(0x17f3, 0x3010), .driver_data = AZX_DRIVER_GENERIC },
Bankim Bhavsar0f0714c52011-01-17 15:23:21 +01003823 /* VMware HDAudio */
3824 { PCI_DEVICE(0x15ad, 0x1977), .driver_data = AZX_DRIVER_GENERIC },
Andiry Brienza9176b672009-07-17 11:32:32 +08003825 /* AMD/ATI Generic, PCI class code and Vendor ID for HD Audio */
Yang, Libinc4da29c2008-11-13 11:07:07 +01003826 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_ANY_ID),
3827 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3828 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02003829 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_HDMI },
Andiry Brienza9176b672009-07-17 11:32:32 +08003830 { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_ANY_ID),
3831 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3832 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02003833 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_HDMI },
Linus Torvalds1da177e2005-04-16 15:20:36 -07003834 { 0, }
3835};
3836MODULE_DEVICE_TABLE(pci, azx_ids);
3837
3838/* pci_driver definition */
Takashi Iwaie9f66d92012-04-24 12:25:00 +02003839static struct pci_driver azx_driver = {
Takashi Iwai3733e422011-06-10 16:20:20 +02003840 .name = KBUILD_MODNAME,
Linus Torvalds1da177e2005-04-16 15:20:36 -07003841 .id_table = azx_ids,
3842 .probe = azx_probe,
Bill Pembertone23e7a12012-12-06 12:35:10 -05003843 .remove = azx_remove,
Takashi Iwai68cb2b52012-07-02 15:20:37 +02003844 .driver = {
3845 .pm = AZX_PM_OPS,
3846 },
Linus Torvalds1da177e2005-04-16 15:20:36 -07003847};
3848
Takashi Iwaie9f66d92012-04-24 12:25:00 +02003849module_pci_driver(azx_driver);