blob: c4b6447bfc7e77023cab4bd4aa1a61299e964178 [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,
Dylan Reid89287562014-02-28 15:41:15 -0800367 chip->card->dev,
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]);
Dylan Reidf46ea602014-02-28 15:41:16 -0800603 if (chip->ops->disable_msi_reset_irq &&
604 chip->ops->disable_msi_reset_irq(chip) < 0) {
Takashi Iwaib6132912009-03-24 07:36:09 +0100605 bus->rirb_error = 1;
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200606 return -1;
Takashi Iwaib6132912009-03-24 07:36:09 +0100607 }
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200608 goto again;
609 }
610
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +0100611 if (chip->probing) {
612 /* If this critical timeout happens during the codec probing
613 * phase, this is likely an access to a non-existing codec
614 * slot. Better to return an error and reset the system.
615 */
616 return -1;
617 }
618
Takashi Iwai8dd78332009-06-02 01:16:07 +0200619 /* a fatal communication error; need either to reset or to fallback
620 * to the single_cmd mode
621 */
Takashi Iwaib6132912009-03-24 07:36:09 +0100622 bus->rirb_error = 1;
Takashi Iwaib20f3b82009-06-02 01:20:22 +0200623 if (bus->allow_bus_reset && !bus->response_reset && !bus->in_reset) {
Takashi Iwai8dd78332009-06-02 01:16:07 +0200624 bus->response_reset = 1;
625 return -1; /* give a chance to retry */
626 }
627
Takashi Iwai4e76a882014-02-25 12:21:03 +0100628 dev_err(chip->card->dev,
629 "azx_get_response timeout, switching to single_cmd mode: last cmd=0x%08x\n",
630 chip->last_cmd[addr]);
Takashi Iwai8dd78332009-06-02 01:16:07 +0200631 chip->single_cmd = 1;
632 bus->response_reset = 0;
Takashi Iwai1a696972009-11-07 09:49:04 +0100633 /* release CORB/RIRB */
Takashi Iwai4fcd3922009-05-25 18:34:52 +0200634 azx_free_cmd_io(chip);
Takashi Iwai1a696972009-11-07 09:49:04 +0100635 /* disable unsolicited responses */
636 azx_writel(chip, GCTL, azx_readl(chip, GCTL) & ~ICH6_GCTL_UNSOL);
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200637 return -1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700638}
639
Linus Torvalds1da177e2005-04-16 15:20:36 -0700640/*
641 * Use the single immediate command instead of CORB/RIRB for simplicity
642 *
643 * Note: according to Intel, this is not preferred use. The command was
644 * intended for the BIOS only, and may get confused with unsolicited
645 * responses. So, we shouldn't use it for normal operation from the
646 * driver.
647 * I left the codes, however, for debugging/testing purposes.
648 */
649
Takashi Iwaib05a7d42009-05-28 11:59:12 +0200650/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800651static int azx_single_wait_for_response(struct azx *chip, unsigned int addr)
Takashi Iwaib05a7d42009-05-28 11:59:12 +0200652{
653 int timeout = 50;
654
655 while (timeout--) {
656 /* check IRV busy bit */
657 if (azx_readw(chip, IRS) & ICH6_IRS_VALID) {
658 /* reuse rirb.res as the response return value */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800659 chip->rirb.res[addr] = azx_readl(chip, IR);
Takashi Iwaib05a7d42009-05-28 11:59:12 +0200660 return 0;
661 }
662 udelay(1);
663 }
664 if (printk_ratelimit())
Takashi Iwai4e76a882014-02-25 12:21:03 +0100665 dev_dbg(chip->card->dev, "get_response timeout: IRS=0x%x\n",
666 azx_readw(chip, IRS));
Wu Fengguangdeadff12009-08-01 18:45:16 +0800667 chip->rirb.res[addr] = -1;
Takashi Iwaib05a7d42009-05-28 11:59:12 +0200668 return -EIO;
669}
670
Linus Torvalds1da177e2005-04-16 15:20:36 -0700671/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100672static int azx_single_send_cmd(struct hda_bus *bus, u32 val)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700673{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100674 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800675 unsigned int addr = azx_command_addr(val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700676 int timeout = 50;
677
Takashi Iwai8dd78332009-06-02 01:16:07 +0200678 bus->rirb_error = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700679 while (timeout--) {
680 /* check ICB busy bit */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200681 if (!((azx_readw(chip, IRS) & ICH6_IRS_BUSY))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700682 /* Clear IRV valid bit */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200683 azx_writew(chip, IRS, azx_readw(chip, IRS) |
684 ICH6_IRS_VALID);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700685 azx_writel(chip, IC, val);
Takashi Iwaid01ce992007-07-27 16:52:19 +0200686 azx_writew(chip, IRS, azx_readw(chip, IRS) |
687 ICH6_IRS_BUSY);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800688 return azx_single_wait_for_response(chip, addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700689 }
690 udelay(1);
691 }
Marc Boucher1cfd52b2008-01-22 15:29:26 +0100692 if (printk_ratelimit())
Takashi Iwai4e76a882014-02-25 12:21:03 +0100693 dev_dbg(chip->card->dev,
694 "send_cmd timeout: IRS=0x%x, val=0x%x\n",
695 azx_readw(chip, IRS), val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700696 return -EIO;
697}
698
699/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800700static unsigned int azx_single_get_response(struct hda_bus *bus,
701 unsigned int addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700702{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100703 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800704 return chip->rirb.res[addr];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700705}
706
Takashi Iwai111d3af2006-02-16 18:17:58 +0100707/*
708 * The below are the main callbacks from hda_codec.
709 *
710 * They are just the skeleton to call sub-callbacks according to the
711 * current setting of chip->single_cmd.
712 */
713
714/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100715static int azx_send_cmd(struct hda_bus *bus, unsigned int val)
Takashi Iwai111d3af2006-02-16 18:17:58 +0100716{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100717 struct azx *chip = bus->private_data;
Takashi Iwai43bbb6c2007-07-06 20:22:05 +0200718
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200719 if (chip->disabled)
720 return 0;
Wu Fengguangfeb27342009-08-01 19:17:14 +0800721 chip->last_cmd[azx_command_addr(val)] = val;
Takashi Iwai111d3af2006-02-16 18:17:58 +0100722 if (chip->single_cmd)
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100723 return azx_single_send_cmd(bus, val);
Takashi Iwai111d3af2006-02-16 18:17:58 +0100724 else
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100725 return azx_corb_send_cmd(bus, val);
Takashi Iwai111d3af2006-02-16 18:17:58 +0100726}
727
728/* get a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800729static unsigned int azx_get_response(struct hda_bus *bus,
730 unsigned int addr)
Takashi Iwai111d3af2006-02-16 18:17:58 +0100731{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100732 struct azx *chip = bus->private_data;
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200733 if (chip->disabled)
734 return 0;
Takashi Iwai111d3af2006-02-16 18:17:58 +0100735 if (chip->single_cmd)
Wu Fengguangdeadff12009-08-01 18:45:16 +0800736 return azx_single_get_response(bus, addr);
Takashi Iwai111d3af2006-02-16 18:17:58 +0100737 else
Wu Fengguangdeadff12009-08-01 18:45:16 +0800738 return azx_rirb_get_response(bus, addr);
Takashi Iwai111d3af2006-02-16 18:17:58 +0100739}
740
Takashi Iwai83012a72012-08-24 18:38:08 +0200741#ifdef CONFIG_PM
Takashi Iwai68467f52012-08-28 09:14:29 -0700742static void azx_power_notify(struct hda_bus *bus, bool power_up);
Takashi Iwaicb53c622007-08-10 17:21:45 +0200743#endif
Takashi Iwai111d3af2006-02-16 18:17:58 +0100744
Takashi Iwai1d1a4562012-09-20 20:29:13 -0700745#ifdef CONFIG_SND_HDA_DSP_LOADER
746static int azx_load_dsp_prepare(struct hda_bus *bus, unsigned int format,
747 unsigned int byte_size,
748 struct snd_dma_buffer *bufp);
749static void azx_load_dsp_trigger(struct hda_bus *bus, bool start);
750static void azx_load_dsp_cleanup(struct hda_bus *bus,
751 struct snd_dma_buffer *dmab);
752#endif
753
Mengdong Lin3af3f352013-06-24 10:18:54 -0400754/* enter link reset */
Mengdong Lin7295b262013-06-25 05:58:49 -0400755static void azx_enter_link_reset(struct azx *chip)
Mengdong Lin3af3f352013-06-24 10:18:54 -0400756{
757 unsigned long timeout;
758
759 /* reset controller */
760 azx_writel(chip, GCTL, azx_readl(chip, GCTL) & ~ICH6_GCTL_RESET);
761
762 timeout = jiffies + msecs_to_jiffies(100);
763 while ((azx_readb(chip, GCTL) & ICH6_GCTL_RESET) &&
764 time_before(jiffies, timeout))
765 usleep_range(500, 1000);
766}
767
Mengdong Lin7295b262013-06-25 05:58:49 -0400768/* exit link reset */
769static void azx_exit_link_reset(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700770{
Mengdong Linfa348da2012-12-12 09:16:15 -0500771 unsigned long timeout;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700772
Mengdong Lin7295b262013-06-25 05:58:49 -0400773 azx_writeb(chip, GCTL, azx_readb(chip, GCTL) | ICH6_GCTL_RESET);
774
775 timeout = jiffies + msecs_to_jiffies(100);
776 while (!azx_readb(chip, GCTL) &&
777 time_before(jiffies, timeout))
778 usleep_range(500, 1000);
779}
780
781/* reset codec link */
782static int azx_reset(struct azx *chip, int full_reset)
783{
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +0100784 if (!full_reset)
785 goto __skip;
786
Danny Tholene8a7f132007-09-11 21:41:56 +0200787 /* clear STATESTS */
Wang Xingchaoda7db6a2013-07-22 03:19:18 -0400788 azx_writew(chip, STATESTS, STATESTS_INT_MASK);
Danny Tholene8a7f132007-09-11 21:41:56 +0200789
Linus Torvalds1da177e2005-04-16 15:20:36 -0700790 /* reset controller */
Mengdong Lin7295b262013-06-25 05:58:49 -0400791 azx_enter_link_reset(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700792
793 /* delay for >= 100us for codec PLL to settle per spec
794 * Rev 0.9 section 5.5.1
795 */
Mengdong Linfa348da2012-12-12 09:16:15 -0500796 usleep_range(500, 1000);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700797
798 /* Bring controller out of reset */
Mengdong Lin7295b262013-06-25 05:58:49 -0400799 azx_exit_link_reset(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700800
Pavel Machek927fc862006-08-31 17:03:43 +0200801 /* Brent Chartrand said to wait >= 540us for codecs to initialize */
Mengdong Linfa348da2012-12-12 09:16:15 -0500802 usleep_range(1000, 1200);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700803
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +0100804 __skip:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700805 /* check to see if controller is ready */
Pavel Machek927fc862006-08-31 17:03:43 +0200806 if (!azx_readb(chip, GCTL)) {
Takashi Iwai4e76a882014-02-25 12:21:03 +0100807 dev_dbg(chip->card->dev, "azx_reset: controller not ready!\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700808 return -EBUSY;
809 }
810
Matt41e2fce2005-07-04 17:49:55 +0200811 /* Accept unsolicited responses */
Takashi Iwai1a696972009-11-07 09:49:04 +0100812 if (!chip->single_cmd)
813 azx_writel(chip, GCTL, azx_readl(chip, GCTL) |
814 ICH6_GCTL_UNSOL);
Matt41e2fce2005-07-04 17:49:55 +0200815
Linus Torvalds1da177e2005-04-16 15:20:36 -0700816 /* detect codecs */
Pavel Machek927fc862006-08-31 17:03:43 +0200817 if (!chip->codec_mask) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700818 chip->codec_mask = azx_readw(chip, STATESTS);
Takashi Iwai4e76a882014-02-25 12:21:03 +0100819 dev_dbg(chip->card->dev, "codec_mask = 0x%x\n",
820 chip->codec_mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700821 }
822
823 return 0;
824}
825
826
827/*
828 * Lowlevel interface
829 */
830
831/* enable interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100832static void azx_int_enable(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700833{
834 /* enable controller CIE and GIE */
835 azx_writel(chip, INTCTL, azx_readl(chip, INTCTL) |
836 ICH6_INT_CTRL_EN | ICH6_INT_GLOBAL_EN);
837}
838
839/* disable interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100840static void azx_int_disable(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700841{
842 int i;
843
844 /* disable interrupts in stream descriptor */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200845 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100846 struct azx_dev *azx_dev = &chip->azx_dev[i];
Dylan Reid40830812014-02-28 15:41:13 -0800847 azx_sd_writeb(chip, azx_dev, SD_CTL,
848 azx_sd_readb(chip, azx_dev, SD_CTL) &
849 ~SD_INT_MASK);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700850 }
851
852 /* disable SIE for all streams */
853 azx_writeb(chip, INTCTL, 0);
854
855 /* disable controller CIE and GIE */
856 azx_writel(chip, INTCTL, azx_readl(chip, INTCTL) &
857 ~(ICH6_INT_CTRL_EN | ICH6_INT_GLOBAL_EN));
858}
859
860/* clear interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100861static void azx_int_clear(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700862{
863 int i;
864
865 /* clear stream status */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200866 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100867 struct azx_dev *azx_dev = &chip->azx_dev[i];
Dylan Reid40830812014-02-28 15:41:13 -0800868 azx_sd_writeb(chip, azx_dev, SD_STS, SD_INT_MASK);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700869 }
870
871 /* clear STATESTS */
Wang Xingchaoda7db6a2013-07-22 03:19:18 -0400872 azx_writew(chip, STATESTS, STATESTS_INT_MASK);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700873
874 /* clear rirb status */
875 azx_writeb(chip, RIRBSTS, RIRB_INT_MASK);
876
877 /* clear int status */
878 azx_writel(chip, INTSTS, ICH6_INT_CTRL_EN | ICH6_INT_ALL_STREAM);
879}
880
881/* start a stream */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100882static void azx_stream_start(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700883{
Joseph Chan0e153472008-08-26 14:38:03 +0200884 /*
885 * Before stream start, initialize parameter
886 */
887 azx_dev->insufficient = 1;
888
Linus Torvalds1da177e2005-04-16 15:20:36 -0700889 /* enable SIE */
Wei Niccc5df02010-01-26 15:59:33 +0800890 azx_writel(chip, INTCTL,
891 azx_readl(chip, INTCTL) | (1 << azx_dev->index));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700892 /* set DMA start and interrupt mask */
Dylan Reid40830812014-02-28 15:41:13 -0800893 azx_sd_writeb(chip, azx_dev, SD_CTL,
894 azx_sd_readb(chip, azx_dev, SD_CTL) |
Linus Torvalds1da177e2005-04-16 15:20:36 -0700895 SD_CTL_DMA_START | SD_INT_MASK);
896}
897
Takashi Iwai1dddab42009-03-18 15:15:37 +0100898/* stop DMA */
899static void azx_stream_clear(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700900{
Dylan Reid40830812014-02-28 15:41:13 -0800901 azx_sd_writeb(chip, azx_dev, SD_CTL,
902 azx_sd_readb(chip, azx_dev, SD_CTL) &
Linus Torvalds1da177e2005-04-16 15:20:36 -0700903 ~(SD_CTL_DMA_START | SD_INT_MASK));
Dylan Reid40830812014-02-28 15:41:13 -0800904 azx_sd_writeb(chip, azx_dev, SD_STS, SD_INT_MASK); /* to be sure */
Takashi Iwai1dddab42009-03-18 15:15:37 +0100905}
906
907/* stop a stream */
908static void azx_stream_stop(struct azx *chip, struct azx_dev *azx_dev)
909{
910 azx_stream_clear(chip, azx_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700911 /* disable SIE */
Wei Niccc5df02010-01-26 15:59:33 +0800912 azx_writel(chip, INTCTL,
913 azx_readl(chip, INTCTL) & ~(1 << azx_dev->index));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700914}
915
916
917/*
Takashi Iwaicb53c622007-08-10 17:21:45 +0200918 * reset and start the controller registers
Linus Torvalds1da177e2005-04-16 15:20:36 -0700919 */
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +0100920static void azx_init_chip(struct azx *chip, int full_reset)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700921{
Takashi Iwaicb53c622007-08-10 17:21:45 +0200922 if (chip->initialized)
923 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700924
925 /* reset controller */
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +0100926 azx_reset(chip, full_reset);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700927
928 /* initialize interrupts */
929 azx_int_clear(chip);
930 azx_int_enable(chip);
931
932 /* initialize the codec command I/O */
Takashi Iwai1a696972009-11-07 09:49:04 +0100933 if (!chip->single_cmd)
934 azx_init_cmd_io(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700935
Takashi Iwai0be3b5d2005-09-05 17:11:40 +0200936 /* program the position buffer */
937 azx_writel(chip, DPLBASE, (u32)chip->posbuf.addr);
Takashi Iwai766979e2008-06-13 20:53:56 +0200938 azx_writel(chip, DPUBASE, upper_32_bits(chip->posbuf.addr));
Frederick Lif5d40b32005-05-12 14:55:20 +0200939
Takashi Iwaicb53c622007-08-10 17:21:45 +0200940 chip->initialized = 1;
941}
942
943/*
944 * initialize the PCI registers
945 */
946/* update bits in a PCI register byte */
947static void update_pci_byte(struct pci_dev *pci, unsigned int reg,
948 unsigned char mask, unsigned char val)
949{
950 unsigned char data;
951
952 pci_read_config_byte(pci, reg, &data);
953 data &= ~mask;
954 data |= (val & mask);
955 pci_write_config_byte(pci, reg, data);
956}
957
958static void azx_init_pci(struct azx *chip)
959{
960 /* Clear bits 0-2 of PCI register TCSEL (at offset 0x44)
961 * TCSEL == Traffic Class Select Register, which sets PCI express QOS
962 * Ensuring these bits are 0 clears playback static on some HD Audio
Adam Lackorzynskia09e89f2011-03-10 17:41:56 +0100963 * codecs.
964 * The PCI register TCSEL is defined in the Intel manuals.
Takashi Iwaicb53c622007-08-10 17:21:45 +0200965 */
Linus Torvalds46f2cc82011-05-27 19:45:28 -0700966 if (!(chip->driver_caps & AZX_DCAPS_NO_TCSEL)) {
Takashi Iwai4e76a882014-02-25 12:21:03 +0100967 dev_dbg(chip->card->dev, "Clearing TCSEL\n");
Adam Lackorzynskia09e89f2011-03-10 17:41:56 +0100968 update_pci_byte(chip->pci, ICH6_PCIREG_TCSEL, 0x07, 0);
Takashi Iwai9477c582011-05-25 09:11:37 +0200969 }
Takashi Iwaicb53c622007-08-10 17:21:45 +0200970
Takashi Iwai9477c582011-05-25 09:11:37 +0200971 /* For ATI SB450/600/700/800/900 and AMD Hudson azalia HD audio,
972 * we need to enable snoop.
973 */
974 if (chip->driver_caps & AZX_DCAPS_ATI_SNOOP) {
Takashi Iwai4e76a882014-02-25 12:21:03 +0100975 dev_dbg(chip->card->dev, "Setting ATI snoop: %d\n",
976 azx_snoop(chip));
Takashi Iwaicb53c622007-08-10 17:21:45 +0200977 update_pci_byte(chip->pci,
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200978 ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR, 0x07,
979 azx_snoop(chip) ? ATI_SB450_HDAUDIO_ENABLE_SNOOP : 0);
Takashi Iwai9477c582011-05-25 09:11:37 +0200980 }
981
982 /* For NVIDIA HDA, enable snoop */
983 if (chip->driver_caps & AZX_DCAPS_NVIDIA_SNOOP) {
Takashi Iwai4e76a882014-02-25 12:21:03 +0100984 dev_dbg(chip->card->dev, "Setting Nvidia snoop: %d\n",
985 azx_snoop(chip));
Takashi Iwaicb53c622007-08-10 17:21:45 +0200986 update_pci_byte(chip->pci,
987 NVIDIA_HDA_TRANSREG_ADDR,
988 0x0f, NVIDIA_HDA_ENABLE_COHBITS);
Peer Chen320dcc32008-08-20 16:43:24 -0700989 update_pci_byte(chip->pci,
990 NVIDIA_HDA_ISTRM_COH,
991 0x01, NVIDIA_HDA_ENABLE_COHBIT);
992 update_pci_byte(chip->pci,
993 NVIDIA_HDA_OSTRM_COH,
994 0x01, NVIDIA_HDA_ENABLE_COHBIT);
Takashi Iwai9477c582011-05-25 09:11:37 +0200995 }
996
997 /* Enable SCH/PCH snoop if needed */
998 if (chip->driver_caps & AZX_DCAPS_SCH_SNOOP) {
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200999 unsigned short snoop;
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001000 pci_read_config_word(chip->pci, INTEL_SCH_HDA_DEVC, &snoop);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001001 if ((!azx_snoop(chip) && !(snoop & INTEL_SCH_HDA_DEVC_NOSNOOP)) ||
1002 (azx_snoop(chip) && (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP))) {
1003 snoop &= ~INTEL_SCH_HDA_DEVC_NOSNOOP;
1004 if (!azx_snoop(chip))
1005 snoop |= INTEL_SCH_HDA_DEVC_NOSNOOP;
1006 pci_write_config_word(chip->pci, INTEL_SCH_HDA_DEVC, snoop);
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001007 pci_read_config_word(chip->pci,
1008 INTEL_SCH_HDA_DEVC, &snoop);
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001009 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01001010 dev_dbg(chip->card->dev, "SCH snoop: %s\n",
1011 (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP) ?
1012 "Disabled" : "Enabled");
Vinod Gda3fca22005-09-13 18:49:12 +02001013 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001014}
1015
1016
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001017static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev);
1018
Linus Torvalds1da177e2005-04-16 15:20:36 -07001019/*
1020 * interrupt handler
1021 */
David Howells7d12e782006-10-05 14:55:46 +01001022static irqreturn_t azx_interrupt(int irq, void *dev_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001023{
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001024 struct azx *chip = dev_id;
1025 struct azx_dev *azx_dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001026 u32 status;
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001027 u8 sd_status;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001028 int i, ok;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001029
Mengdong Linb8dfc4622012-08-23 17:32:30 +08001030#ifdef CONFIG_PM_RUNTIME
Dave Airlie246efa42013-07-29 15:19:29 +10001031 if (chip->driver_caps & AZX_DCAPS_PM_RUNTIME)
Dylan Reid89287562014-02-28 15:41:15 -08001032 if (chip->card->dev->power.runtime_status != RPM_ACTIVE)
Dave Airlie246efa42013-07-29 15:19:29 +10001033 return IRQ_NONE;
Mengdong Linb8dfc4622012-08-23 17:32:30 +08001034#endif
1035
Linus Torvalds1da177e2005-04-16 15:20:36 -07001036 spin_lock(&chip->reg_lock);
1037
Dan Carpenter60911062012-05-18 10:36:11 +03001038 if (chip->disabled) {
1039 spin_unlock(&chip->reg_lock);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001040 return IRQ_NONE;
Dan Carpenter60911062012-05-18 10:36:11 +03001041 }
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001042
Linus Torvalds1da177e2005-04-16 15:20:36 -07001043 status = azx_readl(chip, INTSTS);
Dave Airlie246efa42013-07-29 15:19:29 +10001044 if (status == 0 || status == 0xffffffff) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001045 spin_unlock(&chip->reg_lock);
1046 return IRQ_NONE;
1047 }
1048
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001049 for (i = 0; i < chip->num_streams; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001050 azx_dev = &chip->azx_dev[i];
1051 if (status & azx_dev->sd_int_sta_mask) {
Dylan Reid40830812014-02-28 15:41:13 -08001052 sd_status = azx_sd_readb(chip, azx_dev, SD_STS);
1053 azx_sd_writeb(chip, azx_dev, SD_STS, SD_INT_MASK);
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001054 if (!azx_dev->substream || !azx_dev->running ||
1055 !(sd_status & SD_INT_COMPLETE))
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001056 continue;
1057 /* check whether this IRQ is really acceptable */
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001058 ok = azx_position_ok(chip, azx_dev);
1059 if (ok == 1) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001060 azx_dev->irq_pending = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001061 spin_unlock(&chip->reg_lock);
1062 snd_pcm_period_elapsed(azx_dev->substream);
1063 spin_lock(&chip->reg_lock);
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001064 } else if (ok == 0 && chip->bus && chip->bus->workq) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001065 /* bogus IRQ, process it later */
1066 azx_dev->irq_pending = 1;
Takashi Iwai6acaed32009-01-12 10:09:24 +01001067 queue_work(chip->bus->workq,
1068 &chip->irq_pending_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001069 }
1070 }
1071 }
1072
1073 /* clear rirb int */
1074 status = azx_readb(chip, RIRBSTS);
1075 if (status & RIRB_INT_MASK) {
Takashi Iwai14d34f12010-10-21 09:03:25 +02001076 if (status & RIRB_INT_RESPONSE) {
Takashi Iwai9477c582011-05-25 09:11:37 +02001077 if (chip->driver_caps & AZX_DCAPS_RIRB_PRE_DELAY)
Takashi Iwai14d34f12010-10-21 09:03:25 +02001078 udelay(80);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001079 azx_update_rirb(chip);
Takashi Iwai14d34f12010-10-21 09:03:25 +02001080 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001081 azx_writeb(chip, RIRBSTS, RIRB_INT_MASK);
1082 }
1083
1084#if 0
1085 /* clear state status int */
Wang Xingchaoda7db6a2013-07-22 03:19:18 -04001086 if (azx_readw(chip, STATESTS) & 0x04)
1087 azx_writew(chip, STATESTS, 0x04);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001088#endif
1089 spin_unlock(&chip->reg_lock);
1090
1091 return IRQ_HANDLED;
1092}
1093
1094
1095/*
Takashi Iwai675f25d2008-06-10 17:53:20 +02001096 * set up a BDL entry
1097 */
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001098static int setup_bdle(struct azx *chip,
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001099 struct snd_dma_buffer *dmab,
Takashi Iwai675f25d2008-06-10 17:53:20 +02001100 struct azx_dev *azx_dev, u32 **bdlp,
1101 int ofs, int size, int with_ioc)
1102{
Takashi Iwai675f25d2008-06-10 17:53:20 +02001103 u32 *bdl = *bdlp;
1104
1105 while (size > 0) {
1106 dma_addr_t addr;
1107 int chunk;
1108
1109 if (azx_dev->frags >= AZX_MAX_BDL_ENTRIES)
1110 return -EINVAL;
1111
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001112 addr = snd_sgbuf_get_addr(dmab, ofs);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001113 /* program the address field of the BDL entry */
1114 bdl[0] = cpu_to_le32((u32)addr);
Takashi Iwai766979e2008-06-13 20:53:56 +02001115 bdl[1] = cpu_to_le32(upper_32_bits(addr));
Takashi Iwai675f25d2008-06-10 17:53:20 +02001116 /* program the size field of the BDL entry */
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001117 chunk = snd_sgbuf_get_chunk_size(dmab, ofs, size);
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001118 /* one BDLE cannot cross 4K boundary on CTHDA chips */
1119 if (chip->driver_caps & AZX_DCAPS_4K_BDLE_BOUNDARY) {
1120 u32 remain = 0x1000 - (ofs & 0xfff);
1121 if (chunk > remain)
1122 chunk = remain;
1123 }
Takashi Iwai675f25d2008-06-10 17:53:20 +02001124 bdl[2] = cpu_to_le32(chunk);
1125 /* program the IOC to enable interrupt
1126 * only when the whole fragment is processed
1127 */
1128 size -= chunk;
1129 bdl[3] = (size || !with_ioc) ? 0 : cpu_to_le32(0x01);
1130 bdl += 4;
1131 azx_dev->frags++;
1132 ofs += chunk;
1133 }
1134 *bdlp = bdl;
1135 return ofs;
1136}
1137
1138/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001139 * set up BDL entries
1140 */
Takashi Iwai555e2192008-06-10 17:53:34 +02001141static int azx_setup_periods(struct azx *chip,
1142 struct snd_pcm_substream *substream,
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001143 struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001144{
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001145 u32 *bdl;
1146 int i, ofs, periods, period_bytes;
Dylan Reid9cdc0112014-02-28 15:41:14 -08001147 int pos_adj = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001148
1149 /* reset BDL address */
Dylan Reid40830812014-02-28 15:41:13 -08001150 azx_sd_writel(chip, azx_dev, SD_BDLPL, 0);
1151 azx_sd_writel(chip, azx_dev, SD_BDLPU, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001152
Takashi Iwai97b71c92009-03-18 15:09:13 +01001153 period_bytes = azx_dev->period_bytes;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001154 periods = azx_dev->bufsize / period_bytes;
1155
Linus Torvalds1da177e2005-04-16 15:20:36 -07001156 /* program the initial BDL entries */
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001157 bdl = (u32 *)azx_dev->bdl.area;
1158 ofs = 0;
1159 azx_dev->frags = 0;
Dylan Reid9cdc0112014-02-28 15:41:14 -08001160
1161 if (chip->bdl_pos_adj)
1162 pos_adj = chip->bdl_pos_adj[chip->dev_index];
Takashi Iwai915bf292012-09-11 15:19:10 +02001163 if (!azx_dev->no_period_wakeup && pos_adj > 0) {
Takashi Iwai675f25d2008-06-10 17:53:20 +02001164 struct snd_pcm_runtime *runtime = substream->runtime;
Takashi Iwaie785d3d2008-07-15 16:28:43 +02001165 int pos_align = pos_adj;
Takashi Iwai555e2192008-06-10 17:53:34 +02001166 pos_adj = (pos_adj * runtime->rate + 47999) / 48000;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001167 if (!pos_adj)
Takashi Iwaie785d3d2008-07-15 16:28:43 +02001168 pos_adj = pos_align;
1169 else
1170 pos_adj = ((pos_adj + pos_align - 1) / pos_align) *
1171 pos_align;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001172 pos_adj = frames_to_bytes(runtime, pos_adj);
1173 if (pos_adj >= period_bytes) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001174 dev_warn(chip->card->dev,"Too big adjustment %d\n",
Dylan Reid9cdc0112014-02-28 15:41:14 -08001175 pos_adj);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001176 pos_adj = 0;
1177 } else {
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001178 ofs = setup_bdle(chip, snd_pcm_get_dma_buf(substream),
1179 azx_dev,
Takashi Iwai915bf292012-09-11 15:19:10 +02001180 &bdl, ofs, pos_adj, true);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001181 if (ofs < 0)
1182 goto error;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001183 }
Takashi Iwai555e2192008-06-10 17:53:34 +02001184 } else
1185 pos_adj = 0;
Dylan Reid9cdc0112014-02-28 15:41:14 -08001186
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 */
Dylan Reid9cdc0112014-02-28 15:41:14 -08002146 return chip->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,
Dylan Reid89287562014-02-28 15:41:15 -08002290 chip->card->dev,
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,
Dylan Reid89287562014-02-28 15:41:15 -08002405 chip->card->dev,
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002406 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)
Dylan Reid89287562014-02-28 15:41:15 -08002498 pm_runtime_get_sync(chip->card->dev);
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002499 else
Dylan Reid89287562014-02-28 15:41:15 -08002500 pm_runtime_put_sync(chip->card->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) {
Dylan Reid89287562014-02-28 15:41:15 -08002765 pm_runtime_put_sync_suspend(card->dev);
2766 azx_suspend(card->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);
Dylan Reid89287562014-02-28 15:41:15 -08002777 pm_runtime_get_noresume(card->dev);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002778 chip->disabled = false;
Dylan Reid89287562014-02-28 15:41:15 -08002779 azx_resume(card->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 */
Dylan Reid89287562014-02-28 15:41:15 -08002833 vga_switcheroo_init_domain_pm_optimus_hdmi_audio(chip->card->dev,
2834 &chip->hdmi_pm_domain);
Takashi Iwai128960a2012-10-12 17:28:18 +02002835 return 0;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002836}
2837#else
2838#define init_vga_switcheroo(chip) /* NOP */
2839#define register_vga_switcheroo(chip) 0
Steven Newbury8393ec4a2012-06-08 13:06:29 +02002840#define check_hdmi_disabled(pci) false
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002841#endif /* SUPPORT_VGA_SWITCHER */
2842
Takashi Iwai0cbf0092008-10-29 16:18:25 +01002843/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002844 * destructor
2845 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002846static int azx_free(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002847{
Wang Xingchaoc67e2222013-05-30 22:07:08 +08002848 struct pci_dev *pci = chip->pci;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002849 int i;
2850
Wang Xingchaoc67e2222013-05-30 22:07:08 +08002851 if ((chip->driver_caps & AZX_DCAPS_PM_RUNTIME)
2852 && chip->running)
2853 pm_runtime_get_noresume(&pci->dev);
2854
Takashi Iwai65fcd412012-08-14 17:13:32 +02002855 azx_del_card_list(chip);
2856
Takashi Iwai0cbf0092008-10-29 16:18:25 +01002857 azx_notifier_unregister(chip);
2858
Takashi Iwaif4c482a2012-12-04 15:09:23 +01002859 chip->init_failed = 1; /* to be sure */
Daniel J Blueman44728e92012-12-18 23:59:33 +08002860 complete_all(&chip->probe_wait);
Takashi Iwaif4c482a2012-12-04 15:09:23 +01002861
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002862 if (use_vga_switcheroo(chip)) {
2863 if (chip->disabled && chip->bus)
2864 snd_hda_unlock_devices(chip->bus);
Takashi Iwai128960a2012-10-12 17:28:18 +02002865 if (chip->vga_switcheroo_registered)
2866 vga_switcheroo_unregister_client(chip->pci);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002867 }
2868
Takashi Iwaice43fba2005-05-30 20:33:44 +02002869 if (chip->initialized) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002870 azx_clear_irq_pending(chip);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002871 for (i = 0; i < chip->num_streams; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002872 azx_stream_stop(chip, &chip->azx_dev[i]);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002873 azx_stop_chip(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002874 }
2875
Jeff Garzikf000fd82008-04-22 13:50:34 +02002876 if (chip->irq >= 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002877 free_irq(chip->irq, (void*)chip);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002878 if (chip->msi)
Takashi Iwai30b35392006-10-11 18:52:53 +02002879 pci_disable_msi(chip->pci);
Takashi Iwaif079c252006-06-01 11:42:14 +02002880 if (chip->remap_addr)
2881 iounmap(chip->remap_addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002882
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002883 if (chip->azx_dev) {
2884 for (i = 0; i < chip->num_streams; i++)
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002885 if (chip->azx_dev[i].bdl.area) {
2886 mark_pages_wc(chip, &chip->azx_dev[i].bdl, false);
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002887 snd_dma_free_pages(&chip->azx_dev[i].bdl);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002888 }
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002889 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002890 if (chip->rb.area) {
2891 mark_pages_wc(chip, &chip->rb, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002892 snd_dma_free_pages(&chip->rb);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002893 }
2894 if (chip->posbuf.area) {
2895 mark_pages_wc(chip, &chip->posbuf, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002896 snd_dma_free_pages(&chip->posbuf);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002897 }
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002898 if (chip->region_requested)
2899 pci_release_regions(chip->pci);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002900 pci_disable_device(chip->pci);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002901 kfree(chip->azx_dev);
Takashi Iwai4918cda2012-08-09 12:33:28 +02002902#ifdef CONFIG_SND_HDA_PATCH_LOADER
2903 if (chip->fw)
2904 release_firmware(chip->fw);
2905#endif
Wang Xingchao99a20082013-05-30 22:07:10 +08002906 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL) {
2907 hda_display_power(false);
2908 hda_i915_exit();
2909 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002910 kfree(chip);
2911
2912 return 0;
2913}
2914
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002915static int azx_dev_free(struct snd_device *device)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002916{
2917 return azx_free(device->device_data);
2918}
2919
Steven Newbury8393ec4a2012-06-08 13:06:29 +02002920#ifdef SUPPORT_VGA_SWITCHEROO
Linus Torvalds1da177e2005-04-16 15:20:36 -07002921/*
Takashi Iwai91219472012-04-26 12:13:25 +02002922 * Check of disabled HDMI controller by vga-switcheroo
2923 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05002924static struct pci_dev *get_bound_vga(struct pci_dev *pci)
Takashi Iwai91219472012-04-26 12:13:25 +02002925{
2926 struct pci_dev *p;
2927
2928 /* check only discrete GPU */
2929 switch (pci->vendor) {
2930 case PCI_VENDOR_ID_ATI:
2931 case PCI_VENDOR_ID_AMD:
2932 case PCI_VENDOR_ID_NVIDIA:
2933 if (pci->devfn == 1) {
2934 p = pci_get_domain_bus_and_slot(pci_domain_nr(pci->bus),
2935 pci->bus->number, 0);
2936 if (p) {
2937 if ((p->class >> 8) == PCI_CLASS_DISPLAY_VGA)
2938 return p;
2939 pci_dev_put(p);
2940 }
2941 }
2942 break;
2943 }
2944 return NULL;
2945}
2946
Bill Pembertone23e7a12012-12-06 12:35:10 -05002947static bool check_hdmi_disabled(struct pci_dev *pci)
Takashi Iwai91219472012-04-26 12:13:25 +02002948{
2949 bool vga_inactive = false;
2950 struct pci_dev *p = get_bound_vga(pci);
2951
2952 if (p) {
Takashi Iwai12b78a72012-06-07 12:15:16 +02002953 if (vga_switcheroo_get_client_state(p) == VGA_SWITCHEROO_OFF)
Takashi Iwai91219472012-04-26 12:13:25 +02002954 vga_inactive = true;
2955 pci_dev_put(p);
2956 }
2957 return vga_inactive;
2958}
Steven Newbury8393ec4a2012-06-08 13:06:29 +02002959#endif /* SUPPORT_VGA_SWITCHEROO */
Takashi Iwai91219472012-04-26 12:13:25 +02002960
2961/*
Takashi Iwai3372a152007-02-01 15:46:50 +01002962 * white/black-listing for position_fix
2963 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05002964static struct snd_pci_quirk position_fix_list[] = {
Takashi Iwaid2e1c972008-06-10 17:53:34 +02002965 SND_PCI_QUIRK(0x1028, 0x01cc, "Dell D820", POS_FIX_LPIB),
2966 SND_PCI_QUIRK(0x1028, 0x01de, "Dell Precision 390", POS_FIX_LPIB),
Takashi Iwai2f703e72009-12-01 14:17:37 +01002967 SND_PCI_QUIRK(0x103c, 0x306d, "HP dv3", POS_FIX_LPIB),
Takashi Iwaid2e1c972008-06-10 17:53:34 +02002968 SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB),
Daniel T Chendd37f8e2010-05-30 01:17:03 -04002969 SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS", POS_FIX_LPIB),
Daniel T Chen9f75c1b2010-05-30 13:08:41 -04002970 SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS M2V", POS_FIX_LPIB),
Daniel T Chene96d3122010-05-27 18:32:18 -04002971 SND_PCI_QUIRK(0x104d, 0x9069, "Sony VPCS11V9E", POS_FIX_LPIB),
David Henningssonb01de4f2012-01-12 16:31:14 +01002972 SND_PCI_QUIRK(0x10de, 0xcb89, "Macbook Pro 7,1", POS_FIX_LPIB),
Daniel T Chen61bb42c2010-05-29 11:04:11 -04002973 SND_PCI_QUIRK(0x1297, 0x3166, "Shuttle", POS_FIX_LPIB),
Daniel T Chen9ec8dda2010-03-28 02:34:40 -04002974 SND_PCI_QUIRK(0x1458, 0xa022, "ga-ma770-ud3", POS_FIX_LPIB),
Takashi Iwai45d4ebf2009-11-30 11:58:30 +01002975 SND_PCI_QUIRK(0x1462, 0x1002, "MSI Wind U115", POS_FIX_LPIB),
Takashi Iwai8815cd02010-04-15 09:02:41 +02002976 SND_PCI_QUIRK(0x1565, 0x8218, "Biostar Microtech", POS_FIX_LPIB),
Daniel T Chenb90c0762010-05-30 19:31:41 -04002977 SND_PCI_QUIRK(0x1849, 0x0888, "775Dual-VSTA", POS_FIX_LPIB),
Daniel T Chen0e0280d2010-04-21 19:55:43 -04002978 SND_PCI_QUIRK(0x8086, 0x2503, "DG965OT AAD63733-203", POS_FIX_LPIB),
Takashi Iwai3372a152007-02-01 15:46:50 +01002979 {}
2980};
2981
Bill Pembertone23e7a12012-12-06 12:35:10 -05002982static int check_position_fix(struct azx *chip, int fix)
Takashi Iwai3372a152007-02-01 15:46:50 +01002983{
2984 const struct snd_pci_quirk *q;
2985
Takashi Iwaic673ba12009-03-17 07:49:14 +01002986 switch (fix) {
Takashi Iwai1dac6692012-09-13 14:59:47 +02002987 case POS_FIX_AUTO:
Takashi Iwaic673ba12009-03-17 07:49:14 +01002988 case POS_FIX_LPIB:
2989 case POS_FIX_POSBUF:
David Henningsson4cb36312010-09-30 10:12:50 +02002990 case POS_FIX_VIACOMBO:
Takashi Iwaia6f2fd52012-02-28 11:58:40 +01002991 case POS_FIX_COMBO:
Takashi Iwaic673ba12009-03-17 07:49:14 +01002992 return fix;
2993 }
2994
Takashi Iwaic673ba12009-03-17 07:49:14 +01002995 q = snd_pci_quirk_lookup(chip->pci, position_fix_list);
2996 if (q) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002997 dev_info(chip->card->dev,
2998 "position_fix set to %d for device %04x:%04x\n",
2999 q->value, q->subvendor, q->subdevice);
Takashi Iwaic673ba12009-03-17 07:49:14 +01003000 return q->value;
Takashi Iwai3372a152007-02-01 15:46:50 +01003001 }
David Henningssonbdd9ef22010-10-04 12:02:14 +02003002
3003 /* Check VIA/ATI HD Audio Controller exist */
Takashi Iwai9477c582011-05-25 09:11:37 +02003004 if (chip->driver_caps & AZX_DCAPS_POSFIX_VIA) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003005 dev_dbg(chip->card->dev, "Using VIACOMBO position fix\n");
David Henningssonbdd9ef22010-10-04 12:02:14 +02003006 return POS_FIX_VIACOMBO;
3007 }
Takashi Iwai9477c582011-05-25 09:11:37 +02003008 if (chip->driver_caps & AZX_DCAPS_POSFIX_LPIB) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003009 dev_dbg(chip->card->dev, "Using LPIB position fix\n");
Takashi Iwai9477c582011-05-25 09:11:37 +02003010 return POS_FIX_LPIB;
3011 }
Takashi Iwaic673ba12009-03-17 07:49:14 +01003012 return POS_FIX_AUTO;
Takashi Iwai3372a152007-02-01 15:46:50 +01003013}
3014
3015/*
Takashi Iwai669ba272007-08-17 09:17:36 +02003016 * black-lists for probe_mask
3017 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003018static struct snd_pci_quirk probe_mask_list[] = {
Takashi Iwai669ba272007-08-17 09:17:36 +02003019 /* Thinkpad often breaks the controller communication when accessing
3020 * to the non-working (or non-existing) modem codec slot.
3021 */
3022 SND_PCI_QUIRK(0x1014, 0x05b7, "Thinkpad Z60", 0x01),
3023 SND_PCI_QUIRK(0x17aa, 0x2010, "Thinkpad X/T/R60", 0x01),
3024 SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X/T/R61", 0x01),
Takashi Iwai0edb9452008-11-07 14:53:09 +01003025 /* broken BIOS */
3026 SND_PCI_QUIRK(0x1028, 0x20ac, "Dell Studio Desktop", 0x01),
Takashi Iwaief1681d2008-11-24 17:29:28 +01003027 /* including bogus ALC268 in slot#2 that conflicts with ALC888 */
3028 SND_PCI_QUIRK(0x17c0, 0x4085, "Medion MD96630", 0x01),
Takashi Iwai20db7cb2009-02-13 08:18:48 +01003029 /* forced codec slots */
Ozan Çağlayan93574842009-05-23 15:00:04 +03003030 SND_PCI_QUIRK(0x1043, 0x1262, "ASUS W5Fm", 0x103),
Takashi Iwai20db7cb2009-02-13 08:18:48 +01003031 SND_PCI_QUIRK(0x1046, 0x1262, "ASUS W5F", 0x103),
Jaroslav Kyselaf3af9052012-04-26 17:52:35 +02003032 /* WinFast VP200 H (Teradici) user reported broken communication */
3033 SND_PCI_QUIRK(0x3a21, 0x040d, "WinFast VP200 H", 0x101),
Takashi Iwai669ba272007-08-17 09:17:36 +02003034 {}
3035};
3036
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003037#define AZX_FORCE_CODEC_MASK 0x100
3038
Bill Pembertone23e7a12012-12-06 12:35:10 -05003039static void check_probe_mask(struct azx *chip, int dev)
Takashi Iwai669ba272007-08-17 09:17:36 +02003040{
3041 const struct snd_pci_quirk *q;
3042
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003043 chip->codec_probe_mask = probe_mask[dev];
3044 if (chip->codec_probe_mask == -1) {
Takashi Iwai669ba272007-08-17 09:17:36 +02003045 q = snd_pci_quirk_lookup(chip->pci, probe_mask_list);
3046 if (q) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003047 dev_info(chip->card->dev,
3048 "probe_mask set to 0x%x for device %04x:%04x\n",
3049 q->value, q->subvendor, q->subdevice);
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003050 chip->codec_probe_mask = q->value;
Takashi Iwai669ba272007-08-17 09:17:36 +02003051 }
3052 }
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003053
3054 /* check forced option */
3055 if (chip->codec_probe_mask != -1 &&
3056 (chip->codec_probe_mask & AZX_FORCE_CODEC_MASK)) {
3057 chip->codec_mask = chip->codec_probe_mask & 0xff;
Takashi Iwai4e76a882014-02-25 12:21:03 +01003058 dev_info(chip->card->dev, "codec_mask forced to 0x%x\n",
3059 chip->codec_mask);
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003060 }
Takashi Iwai669ba272007-08-17 09:17:36 +02003061}
3062
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003063/*
Takashi Iwai716238552009-09-28 13:14:04 +02003064 * white/black-list for enable_msi
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003065 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003066static struct snd_pci_quirk msi_black_list[] = {
David Henningsson693e0cb2013-12-12 09:52:03 +01003067 SND_PCI_QUIRK(0x103c, 0x2191, "HP", 0), /* AMD Hudson */
3068 SND_PCI_QUIRK(0x103c, 0x2192, "HP", 0), /* AMD Hudson */
3069 SND_PCI_QUIRK(0x103c, 0x21f7, "HP", 0), /* AMD Hudson */
3070 SND_PCI_QUIRK(0x103c, 0x21fa, "HP", 0), /* AMD Hudson */
Takashi Iwai9dc83982009-12-22 08:15:01 +01003071 SND_PCI_QUIRK(0x1043, 0x81f2, "ASUS", 0), /* Athlon64 X2 + nvidia */
Takashi Iwai0a27fcf2010-02-15 17:05:28 +01003072 SND_PCI_QUIRK(0x1043, 0x81f6, "ASUS", 0), /* nvidia */
Ralf Gerbigecd21622010-03-09 18:25:47 +01003073 SND_PCI_QUIRK(0x1043, 0x822d, "ASUS", 0), /* Athlon64 X2 + nvidia MCP55 */
Takashi Iwai83f72152013-09-09 10:20:48 +02003074 SND_PCI_QUIRK(0x1179, 0xfb44, "Toshiba Satellite C870", 0), /* AMD Hudson */
Michele Ballabio4193d132010-03-06 21:06:46 +01003075 SND_PCI_QUIRK(0x1849, 0x0888, "ASRock", 0), /* Athlon64 X2 + nvidia */
Takashi Iwai38155952010-04-04 12:14:03 +02003076 SND_PCI_QUIRK(0xa0a0, 0x0575, "Aopen MZ915-M", 0), /* ICH6 */
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003077 {}
3078};
3079
Bill Pembertone23e7a12012-12-06 12:35:10 -05003080static void check_msi(struct azx *chip)
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003081{
3082 const struct snd_pci_quirk *q;
3083
Takashi Iwai716238552009-09-28 13:14:04 +02003084 if (enable_msi >= 0) {
3085 chip->msi = !!enable_msi;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003086 return;
Takashi Iwai716238552009-09-28 13:14:04 +02003087 }
3088 chip->msi = 1; /* enable MSI as default */
3089 q = snd_pci_quirk_lookup(chip->pci, msi_black_list);
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003090 if (q) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003091 dev_info(chip->card->dev,
3092 "msi for device %04x:%04x set to %d\n",
3093 q->subvendor, q->subdevice, q->value);
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003094 chip->msi = q->value;
Takashi Iwai80c43ed2010-03-15 15:51:53 +01003095 return;
3096 }
3097
3098 /* NVidia chipsets seem to cause troubles with MSI */
Takashi Iwai9477c582011-05-25 09:11:37 +02003099 if (chip->driver_caps & AZX_DCAPS_NO_MSI) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003100 dev_info(chip->card->dev, "Disabling MSI\n");
Takashi Iwai80c43ed2010-03-15 15:51:53 +01003101 chip->msi = 0;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003102 }
3103}
3104
Takashi Iwaia1585d72011-12-14 09:27:04 +01003105/* check the snoop mode availability */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003106static void azx_check_snoop_available(struct azx *chip)
Takashi Iwaia1585d72011-12-14 09:27:04 +01003107{
3108 bool snoop = chip->snoop;
3109
3110 switch (chip->driver_type) {
3111 case AZX_DRIVER_VIA:
3112 /* force to non-snoop mode for a new VIA controller
3113 * when BIOS is set
3114 */
3115 if (snoop) {
3116 u8 val;
3117 pci_read_config_byte(chip->pci, 0x42, &val);
3118 if (!(val & 0x80) && chip->pci->revision == 0x30)
3119 snoop = false;
3120 }
3121 break;
3122 case AZX_DRIVER_ATIHDMI_NS:
3123 /* new ATI HDMI requires non-snoop */
3124 snoop = false;
3125 break;
Takashi Iwaic1279f82013-02-07 17:36:22 +01003126 case AZX_DRIVER_CTHDA:
3127 snoop = false;
3128 break;
Takashi Iwaia1585d72011-12-14 09:27:04 +01003129 }
3130
3131 if (snoop != chip->snoop) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003132 dev_info(chip->card->dev, "Force to %s mode\n",
3133 snoop ? "snoop" : "non-snoop");
Takashi Iwaia1585d72011-12-14 09:27:04 +01003134 chip->snoop = snoop;
3135 }
3136}
Takashi Iwai669ba272007-08-17 09:17:36 +02003137
Wang Xingchao99a20082013-05-30 22:07:10 +08003138static void azx_probe_work(struct work_struct *work)
3139{
3140 azx_probe_continue(container_of(work, struct azx, probe_work));
3141}
Wang Xingchao99a20082013-05-30 22:07:10 +08003142
Takashi Iwai669ba272007-08-17 09:17:36 +02003143/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07003144 * constructor
3145 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003146static int azx_create(struct snd_card *card, struct pci_dev *pci,
3147 int dev, unsigned int driver_caps,
Dylan Reid40830812014-02-28 15:41:13 -08003148 const struct hda_controller_ops *hda_ops,
Bill Pembertone23e7a12012-12-06 12:35:10 -05003149 struct azx **rchip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003150{
Takashi Iwaia98f90f2005-11-17 14:59:02 +01003151 static struct snd_device_ops ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003152 .dev_free = azx_dev_free,
3153 };
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003154 struct azx *chip;
3155 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003156
3157 *rchip = NULL;
Tobin Davisbcd72002008-01-15 11:23:55 +01003158
Pavel Machek927fc862006-08-31 17:03:43 +02003159 err = pci_enable_device(pci);
3160 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003161 return err;
3162
Takashi Iwaie560d8d2005-09-09 14:21:46 +02003163 chip = kzalloc(sizeof(*chip), GFP_KERNEL);
Pavel Machek927fc862006-08-31 17:03:43 +02003164 if (!chip) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003165 dev_err(card->dev, "Cannot allocate chip\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07003166 pci_disable_device(pci);
3167 return -ENOMEM;
3168 }
3169
3170 spin_lock_init(&chip->reg_lock);
Ingo Molnar62932df2006-01-16 16:34:20 +01003171 mutex_init(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003172 chip->card = card;
3173 chip->pci = pci;
Dylan Reid40830812014-02-28 15:41:13 -08003174 chip->ops = hda_ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003175 chip->irq = -1;
Takashi Iwai9477c582011-05-25 09:11:37 +02003176 chip->driver_caps = driver_caps;
3177 chip->driver_type = driver_caps & 0xff;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003178 check_msi(chip);
Takashi Iwai555e2192008-06-10 17:53:34 +02003179 chip->dev_index = dev;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02003180 INIT_WORK(&chip->irq_pending_work, azx_irq_pending_work);
Takashi Iwai01b65bf2011-11-24 14:31:46 +01003181 INIT_LIST_HEAD(&chip->pcm_list);
Takashi Iwai65fcd412012-08-14 17:13:32 +02003182 INIT_LIST_HEAD(&chip->list);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003183 init_vga_switcheroo(chip);
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003184 init_completion(&chip->probe_wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003185
Shahin Ghazinouribeaffc32010-05-11 08:19:55 +02003186 chip->position_fix[0] = chip->position_fix[1] =
3187 check_position_fix(chip, position_fix[dev]);
Takashi Iwaia6f2fd52012-02-28 11:58:40 +01003188 /* combo mode uses LPIB for playback */
3189 if (chip->position_fix[0] == POS_FIX_COMBO) {
3190 chip->position_fix[0] = POS_FIX_LPIB;
3191 chip->position_fix[1] = POS_FIX_AUTO;
3192 }
3193
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003194 check_probe_mask(chip, dev);
Takashi Iwai3372a152007-02-01 15:46:50 +01003195
Takashi Iwai27346162006-01-12 18:28:44 +01003196 chip->single_cmd = single_cmd;
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003197 chip->snoop = hda_snoop;
Takashi Iwaia1585d72011-12-14 09:27:04 +01003198 azx_check_snoop_available(chip);
Takashi Iwaic74db862005-05-12 14:26:27 +02003199
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02003200 if (bdl_pos_adj[dev] < 0) {
3201 switch (chip->driver_type) {
Takashi Iwai0c6341a2008-06-13 20:50:27 +02003202 case AZX_DRIVER_ICH:
Seth Heasley32679f92010-02-22 17:31:09 -08003203 case AZX_DRIVER_PCH:
Takashi Iwai0c6341a2008-06-13 20:50:27 +02003204 bdl_pos_adj[dev] = 1;
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02003205 break;
3206 default:
Takashi Iwai0c6341a2008-06-13 20:50:27 +02003207 bdl_pos_adj[dev] = 32;
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02003208 break;
3209 }
3210 }
Dylan Reid9cdc0112014-02-28 15:41:14 -08003211 chip->bdl_pos_adj = bdl_pos_adj;
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02003212
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003213 err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
3214 if (err < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003215 dev_err(card->dev, "Error creating device [card]!\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003216 azx_free(chip);
3217 return err;
3218 }
3219
Wang Xingchao99a20082013-05-30 22:07:10 +08003220 /* continue probing in work context as may trigger request module */
3221 INIT_WORK(&chip->probe_work, azx_probe_work);
Wang Xingchao99a20082013-05-30 22:07:10 +08003222
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003223 *rchip = chip;
Wang Xingchao99a20082013-05-30 22:07:10 +08003224
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003225 return 0;
3226}
3227
Takashi Iwai48c8b0e2012-12-07 07:40:35 +01003228static int azx_first_init(struct azx *chip)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003229{
3230 int dev = chip->dev_index;
3231 struct pci_dev *pci = chip->pci;
3232 struct snd_card *card = chip->card;
3233 int i, err;
3234 unsigned short gcap;
3235
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003236#if BITS_PER_LONG != 64
3237 /* Fix up base address on ULI M5461 */
3238 if (chip->driver_type == AZX_DRIVER_ULI) {
3239 u16 tmp3;
3240 pci_read_config_word(pci, 0x40, &tmp3);
3241 pci_write_config_word(pci, 0x40, tmp3 | 0x10);
3242 pci_write_config_dword(pci, PCI_BASE_ADDRESS_1, 0);
3243 }
3244#endif
3245
Pavel Machek927fc862006-08-31 17:03:43 +02003246 err = pci_request_regions(pci, "ICH HD audio");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003247 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003248 return err;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003249 chip->region_requested = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003250
Pavel Machek927fc862006-08-31 17:03:43 +02003251 chip->addr = pci_resource_start(pci, 0);
Arjan van de Ven2f5ad542008-09-28 16:20:09 -07003252 chip->remap_addr = pci_ioremap_bar(pci, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003253 if (chip->remap_addr == NULL) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003254 dev_err(card->dev, "ioremap error\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003255 return -ENXIO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003256 }
3257
Takashi Iwai68e7fff2006-10-23 13:40:59 +02003258 if (chip->msi)
3259 if (pci_enable_msi(pci) < 0)
3260 chip->msi = 0;
Stephen Hemminger7376d012006-08-21 19:17:46 +02003261
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003262 if (azx_acquire_irq(chip, 0) < 0)
3263 return -EBUSY;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003264
3265 pci_set_master(pci);
3266 synchronize_irq(chip->irq);
3267
Tobin Davisbcd72002008-01-15 11:23:55 +01003268 gcap = azx_readw(chip, GCAP);
Takashi Iwai4e76a882014-02-25 12:21:03 +01003269 dev_dbg(card->dev, "chipset global capabilities = 0x%x\n", gcap);
Tobin Davisbcd72002008-01-15 11:23:55 +01003270
Andiry Brienzadc4c2e62009-07-08 13:55:31 +08003271 /* disable SB600 64bit support for safety */
Takashi Iwai9477c582011-05-25 09:11:37 +02003272 if (chip->pci->vendor == PCI_VENDOR_ID_ATI) {
Andiry Brienzadc4c2e62009-07-08 13:55:31 +08003273 struct pci_dev *p_smbus;
3274 p_smbus = pci_get_device(PCI_VENDOR_ID_ATI,
3275 PCI_DEVICE_ID_ATI_SBX00_SMBUS,
3276 NULL);
3277 if (p_smbus) {
3278 if (p_smbus->revision < 0x30)
3279 gcap &= ~ICH6_GCAP_64OK;
3280 pci_dev_put(p_smbus);
3281 }
3282 }
Takashi Iwai09240cf2009-03-17 07:47:18 +01003283
Takashi Iwai9477c582011-05-25 09:11:37 +02003284 /* disable 64bit DMA address on some devices */
3285 if (chip->driver_caps & AZX_DCAPS_NO_64BIT) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003286 dev_dbg(card->dev, "Disabling 64bit DMA\n");
Jaroslav Kysela396087e2009-12-09 10:44:47 +01003287 gcap &= ~ICH6_GCAP_64OK;
Takashi Iwai9477c582011-05-25 09:11:37 +02003288 }
Jaroslav Kysela396087e2009-12-09 10:44:47 +01003289
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003290 /* disable buffer size rounding to 128-byte multiples if supported */
Takashi Iwai7bfe0592012-01-23 17:53:39 +01003291 if (align_buffer_size >= 0)
3292 chip->align_buffer_size = !!align_buffer_size;
3293 else {
3294 if (chip->driver_caps & AZX_DCAPS_BUFSIZE)
3295 chip->align_buffer_size = 0;
3296 else if (chip->driver_caps & AZX_DCAPS_ALIGN_BUFSIZE)
3297 chip->align_buffer_size = 1;
3298 else
3299 chip->align_buffer_size = 1;
3300 }
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003301
Takashi Iwaicf7aaca2008-02-06 15:05:57 +01003302 /* allow 64bit DMA address if supported by H/W */
Takashi Iwaib21fadb2009-05-28 12:26:15 +02003303 if ((gcap & ICH6_GCAP_64OK) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64)))
Yang Hongyange9304382009-04-13 14:40:14 -07003304 pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(64));
Takashi Iwai09240cf2009-03-17 07:47:18 +01003305 else {
Yang Hongyange9304382009-04-13 14:40:14 -07003306 pci_set_dma_mask(pci, DMA_BIT_MASK(32));
3307 pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(32));
Takashi Iwai09240cf2009-03-17 07:47:18 +01003308 }
Takashi Iwaicf7aaca2008-02-06 15:05:57 +01003309
Takashi Iwai8b6ed8e2008-02-19 11:36:35 +01003310 /* read number of streams from GCAP register instead of using
3311 * hardcoded value
3312 */
3313 chip->capture_streams = (gcap >> 8) & 0x0f;
3314 chip->playback_streams = (gcap >> 12) & 0x0f;
3315 if (!chip->playback_streams && !chip->capture_streams) {
Tobin Davisbcd72002008-01-15 11:23:55 +01003316 /* gcap didn't give any info, switching to old method */
3317
3318 switch (chip->driver_type) {
3319 case AZX_DRIVER_ULI:
3320 chip->playback_streams = ULI_NUM_PLAYBACK;
3321 chip->capture_streams = ULI_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01003322 break;
3323 case AZX_DRIVER_ATIHDMI:
Andiry Xu1815b342011-12-14 16:10:27 +08003324 case AZX_DRIVER_ATIHDMI_NS:
Tobin Davisbcd72002008-01-15 11:23:55 +01003325 chip->playback_streams = ATIHDMI_NUM_PLAYBACK;
3326 chip->capture_streams = ATIHDMI_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01003327 break;
Yang, Libinc4da29c2008-11-13 11:07:07 +01003328 case AZX_DRIVER_GENERIC:
Tobin Davisbcd72002008-01-15 11:23:55 +01003329 default:
3330 chip->playback_streams = ICH6_NUM_PLAYBACK;
3331 chip->capture_streams = ICH6_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01003332 break;
3333 }
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003334 }
Takashi Iwai8b6ed8e2008-02-19 11:36:35 +01003335 chip->capture_index_offset = 0;
3336 chip->playback_index_offset = chip->capture_streams;
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003337 chip->num_streams = chip->playback_streams + chip->capture_streams;
Takashi Iwaid01ce992007-07-27 16:52:19 +02003338 chip->azx_dev = kcalloc(chip->num_streams, sizeof(*chip->azx_dev),
3339 GFP_KERNEL);
Pavel Machek927fc862006-08-31 17:03:43 +02003340 if (!chip->azx_dev) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003341 dev_err(card->dev, "cannot malloc azx_dev\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003342 return -ENOMEM;
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003343 }
3344
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003345 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaieb49faa2013-03-15 09:19:11 +01003346 dsp_lock_init(&chip->azx_dev[i]);
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003347 /* allocate memory for the BDL for each stream */
3348 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
Dylan Reid89287562014-02-28 15:41:15 -08003349 chip->card->dev,
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003350 BDL_SIZE, &chip->azx_dev[i].bdl);
3351 if (err < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003352 dev_err(card->dev, "cannot allocate BDL\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003353 return -ENOMEM;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003354 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003355 mark_pages_wc(chip, &chip->azx_dev[i].bdl, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003356 }
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02003357 /* allocate memory for the position buffer */
Takashi Iwaid01ce992007-07-27 16:52:19 +02003358 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
Dylan Reid89287562014-02-28 15:41:15 -08003359 chip->card->dev,
Takashi Iwaid01ce992007-07-27 16:52:19 +02003360 chip->num_streams * 8, &chip->posbuf);
3361 if (err < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003362 dev_err(card->dev, "cannot allocate posbuf\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003363 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003364 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003365 mark_pages_wc(chip, &chip->posbuf, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003366 /* allocate CORB/RIRB */
Takashi Iwai81740862009-05-26 15:22:00 +02003367 err = azx_alloc_cmd_io(chip);
3368 if (err < 0)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003369 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003370
3371 /* initialize streams */
3372 azx_init_stream(chip);
3373
3374 /* initialize chip */
Takashi Iwaicb53c622007-08-10 17:21:45 +02003375 azx_init_pci(chip);
Jaroslav Kysela10e77dd2010-03-26 11:04:38 +01003376 azx_init_chip(chip, (probe_only[dev] & 2) == 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003377
3378 /* codec detection */
Pavel Machek927fc862006-08-31 17:03:43 +02003379 if (!chip->codec_mask) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003380 dev_err(card->dev, "no codecs found!\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003381 return -ENODEV;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003382 }
3383
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003384 strcpy(card->driver, "HDA-Intel");
Takashi Iwai18cb7102009-04-16 10:22:24 +02003385 strlcpy(card->shortname, driver_short_names[chip->driver_type],
3386 sizeof(card->shortname));
3387 snprintf(card->longname, sizeof(card->longname),
3388 "%s at 0x%lx irq %i",
3389 card->shortname, chip->addr, chip->irq);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003390
Linus Torvalds1da177e2005-04-16 15:20:36 -07003391 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003392}
3393
Takashi Iwaicb53c622007-08-10 17:21:45 +02003394static void power_down_all_codecs(struct azx *chip)
3395{
Takashi Iwai83012a72012-08-24 18:38:08 +02003396#ifdef CONFIG_PM
Takashi Iwaicb53c622007-08-10 17:21:45 +02003397 /* The codecs were powered up in snd_hda_codec_new().
3398 * Now all initialization done, so turn them down if possible
3399 */
3400 struct hda_codec *codec;
3401 list_for_each_entry(codec, &chip->bus->codec_list, list) {
3402 snd_hda_power_down(codec);
3403 }
3404#endif
3405}
3406
Takashi Iwai97c6a3d2012-08-09 17:40:46 +02003407#ifdef CONFIG_SND_HDA_PATCH_LOADER
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003408/* callback from request_firmware_nowait() */
3409static void azx_firmware_cb(const struct firmware *fw, void *context)
3410{
3411 struct snd_card *card = context;
3412 struct azx *chip = card->private_data;
3413 struct pci_dev *pci = chip->pci;
3414
3415 if (!fw) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003416 dev_err(card->dev, "Cannot load firmware, aborting\n");
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003417 goto error;
3418 }
3419
3420 chip->fw = fw;
3421 if (!chip->disabled) {
3422 /* continue probing */
3423 if (azx_probe_continue(chip))
3424 goto error;
3425 }
3426 return; /* OK */
3427
3428 error:
3429 snd_card_free(card);
3430 pci_set_drvdata(pci, NULL);
3431}
Takashi Iwai97c6a3d2012-08-09 17:40:46 +02003432#endif
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003433
Dylan Reid40830812014-02-28 15:41:13 -08003434/*
3435 * HDA controller ops.
3436 */
3437
3438/* PCI register access. */
3439static void pci_azx_writel(u32 value, u32 *addr)
3440{
3441 writel(value, addr);
3442}
3443
3444static u32 pci_azx_readl(u32 *addr)
3445{
3446 return readl(addr);
3447}
3448
3449static void pci_azx_writew(u16 value, u16 *addr)
3450{
3451 writew(value, addr);
3452}
3453
3454static u16 pci_azx_readw(u16 *addr)
3455{
3456 return readw(addr);
3457}
3458
3459static void pci_azx_writeb(u8 value, u8 *addr)
3460{
3461 writeb(value, addr);
3462}
3463
3464static u8 pci_azx_readb(u8 *addr)
3465{
3466 return readb(addr);
3467}
3468
Dylan Reidf46ea602014-02-28 15:41:16 -08003469static int disable_msi_reset_irq(struct azx *chip)
3470{
3471 int err;
3472
3473 free_irq(chip->irq, chip);
3474 chip->irq = -1;
3475 pci_disable_msi(chip->pci);
3476 chip->msi = 0;
3477 err = azx_acquire_irq(chip, 1);
3478 if (err < 0)
3479 return err;
3480
3481 return 0;
3482}
3483
Dylan Reid40830812014-02-28 15:41:13 -08003484static const struct hda_controller_ops pci_hda_ops = {
3485 .writel = pci_azx_writel,
3486 .readl = pci_azx_readl,
3487 .writew = pci_azx_writew,
3488 .readw = pci_azx_readw,
3489 .writeb = pci_azx_writeb,
3490 .readb = pci_azx_readb,
Dylan Reidf46ea602014-02-28 15:41:16 -08003491 .disable_msi_reset_irq = disable_msi_reset_irq,
Dylan Reid40830812014-02-28 15:41:13 -08003492};
3493
Bill Pembertone23e7a12012-12-06 12:35:10 -05003494static int azx_probe(struct pci_dev *pci,
3495 const struct pci_device_id *pci_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003496{
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003497 static int dev;
Takashi Iwaia98f90f2005-11-17 14:59:02 +01003498 struct snd_card *card;
3499 struct azx *chip;
Takashi Iwaiaad730d2013-12-02 13:33:57 +01003500 bool schedule_probe;
Pavel Machek927fc862006-08-31 17:03:43 +02003501 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003502
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003503 if (dev >= SNDRV_CARDS)
3504 return -ENODEV;
3505 if (!enable[dev]) {
3506 dev++;
3507 return -ENOENT;
3508 }
3509
Takashi Iwai60c57722014-01-29 14:20:19 +01003510 err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,
3511 0, &card);
Takashi Iwaie58de7b2008-12-28 16:44:30 +01003512 if (err < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003513 dev_err(&pci->dev, "Error creating card!\n");
Takashi Iwaie58de7b2008-12-28 16:44:30 +01003514 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003515 }
3516
Dylan Reid40830812014-02-28 15:41:13 -08003517 err = azx_create(card, pci, dev, pci_id->driver_data,
3518 &pci_hda_ops, &chip);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003519 if (err < 0)
3520 goto out_free;
Takashi Iwai421a1252005-11-17 16:11:09 +01003521 card->private_data = chip;
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003522
3523 pci_set_drvdata(pci, card);
3524
3525 err = register_vga_switcheroo(chip);
3526 if (err < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003527 dev_err(card->dev, "Error registering VGA-switcheroo client\n");
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003528 goto out_free;
3529 }
3530
3531 if (check_hdmi_disabled(pci)) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003532 dev_info(card->dev, "VGA controller is disabled\n");
3533 dev_info(card->dev, "Delaying initialization\n");
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003534 chip->disabled = true;
3535 }
3536
Takashi Iwaiaad730d2013-12-02 13:33:57 +01003537 schedule_probe = !chip->disabled;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003538
Takashi Iwai4918cda2012-08-09 12:33:28 +02003539#ifdef CONFIG_SND_HDA_PATCH_LOADER
3540 if (patch[dev] && *patch[dev]) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003541 dev_info(card->dev, "Applying patch firmware '%s'\n",
3542 patch[dev]);
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003543 err = request_firmware_nowait(THIS_MODULE, true, patch[dev],
3544 &pci->dev, GFP_KERNEL, card,
3545 azx_firmware_cb);
Takashi Iwai4918cda2012-08-09 12:33:28 +02003546 if (err < 0)
3547 goto out_free;
Takashi Iwaiaad730d2013-12-02 13:33:57 +01003548 schedule_probe = false; /* continued in azx_firmware_cb() */
Takashi Iwai4918cda2012-08-09 12:33:28 +02003549 }
3550#endif /* CONFIG_SND_HDA_PATCH_LOADER */
3551
Takashi Iwaiaad730d2013-12-02 13:33:57 +01003552#ifndef CONFIG_SND_HDA_I915
3553 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)
Takashi Iwai4e76a882014-02-25 12:21:03 +01003554 dev_err(card->dev, "Haswell must build in CONFIG_SND_HDA_I915\n");
Wang Xingchao99a20082013-05-30 22:07:10 +08003555#endif
Wang Xingchao99a20082013-05-30 22:07:10 +08003556
Takashi Iwaiaad730d2013-12-02 13:33:57 +01003557 if (schedule_probe)
3558 schedule_work(&chip->probe_work);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003559
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003560 dev++;
Takashi Iwai88d071f2013-12-02 11:12:28 +01003561 if (chip->disabled)
3562 complete_all(&chip->probe_wait);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003563 return 0;
3564
3565out_free:
3566 snd_card_free(card);
3567 return err;
3568}
3569
Takashi Iwai48c8b0e2012-12-07 07:40:35 +01003570static int azx_probe_continue(struct azx *chip)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003571{
Wang Xingchaoc67e2222013-05-30 22:07:08 +08003572 struct pci_dev *pci = chip->pci;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003573 int dev = chip->dev_index;
3574 int err;
3575
Wang Xingchao99a20082013-05-30 22:07:10 +08003576 /* Request power well for Haswell HDA controller and codec */
3577 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL) {
David Henningssonc841ad22013-08-19 13:32:30 +02003578#ifdef CONFIG_SND_HDA_I915
Wang Xingchao99a20082013-05-30 22:07:10 +08003579 err = hda_i915_init();
3580 if (err < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003581 dev_err(chip->card->dev,
3582 "Error request power-well from i915\n");
Wang Xingchao99a20082013-05-30 22:07:10 +08003583 goto out_free;
3584 }
David Henningssonc841ad22013-08-19 13:32:30 +02003585#endif
Wang Xingchao99a20082013-05-30 22:07:10 +08003586 hda_display_power(true);
3587 }
3588
Takashi Iwai5c906802013-05-30 22:07:09 +08003589 err = azx_first_init(chip);
3590 if (err < 0)
3591 goto out_free;
3592
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +01003593#ifdef CONFIG_SND_HDA_INPUT_BEEP
3594 chip->beep_mode = beep_mode[dev];
3595#endif
3596
Linus Torvalds1da177e2005-04-16 15:20:36 -07003597 /* create codec instances */
Takashi Iwaia1e21c92009-06-17 09:33:52 +02003598 err = azx_codec_create(chip, model[dev]);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003599 if (err < 0)
3600 goto out_free;
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003601#ifdef CONFIG_SND_HDA_PATCH_LOADER
Takashi Iwai4918cda2012-08-09 12:33:28 +02003602 if (chip->fw) {
3603 err = snd_hda_load_patch(chip->bus, chip->fw->size,
3604 chip->fw->data);
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003605 if (err < 0)
3606 goto out_free;
Takashi Iwaie39ae852012-11-22 16:18:13 +01003607#ifndef CONFIG_PM
Takashi Iwai4918cda2012-08-09 12:33:28 +02003608 release_firmware(chip->fw); /* no longer needed */
3609 chip->fw = NULL;
Takashi Iwaie39ae852012-11-22 16:18:13 +01003610#endif
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003611 }
3612#endif
Jaroslav Kysela10e77dd2010-03-26 11:04:38 +01003613 if ((probe_only[dev] & 1) == 0) {
Takashi Iwaia1e21c92009-06-17 09:33:52 +02003614 err = azx_codec_configure(chip);
3615 if (err < 0)
3616 goto out_free;
3617 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003618
3619 /* create PCM streams */
Takashi Iwai176d5332008-07-30 15:01:44 +02003620 err = snd_hda_build_pcms(chip->bus);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003621 if (err < 0)
3622 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003623
3624 /* create mixer controls */
Takashi Iwaid01ce992007-07-27 16:52:19 +02003625 err = azx_mixer_create(chip);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003626 if (err < 0)
3627 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003628
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003629 err = snd_card_register(chip->card);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003630 if (err < 0)
3631 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003632
Takashi Iwaicb53c622007-08-10 17:21:45 +02003633 chip->running = 1;
3634 power_down_all_codecs(chip);
Takashi Iwai0cbf0092008-10-29 16:18:25 +01003635 azx_notifier_register(chip);
Takashi Iwai65fcd412012-08-14 17:13:32 +02003636 azx_add_card_list(chip);
Dave Airlie246efa42013-07-29 15:19:29 +10003637 if ((chip->driver_caps & AZX_DCAPS_PM_RUNTIME) || chip->use_vga_switcheroo)
Wang Xingchaoc67e2222013-05-30 22:07:08 +08003638 pm_runtime_put_noidle(&pci->dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003639
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003640out_free:
Takashi Iwai88d071f2013-12-02 11:12:28 +01003641 if (err < 0)
3642 chip->init_failed = 1;
3643 complete_all(&chip->probe_wait);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003644 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003645}
3646
Bill Pembertone23e7a12012-12-06 12:35:10 -05003647static void azx_remove(struct pci_dev *pci)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003648{
Takashi Iwai91219472012-04-26 12:13:25 +02003649 struct snd_card *card = pci_get_drvdata(pci);
Mengdong Linb8dfc4622012-08-23 17:32:30 +08003650
Takashi Iwai91219472012-04-26 12:13:25 +02003651 if (card)
3652 snd_card_free(card);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003653}
3654
3655/* PCI IDs */
Alexey Dobriyancebe41d2010-02-06 00:21:03 +02003656static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
Seth Heasleyd2f2fcd2010-01-12 17:03:35 -08003657 /* CPT */
Takashi Iwai9477c582011-05-25 09:11:37 +02003658 { PCI_DEVICE(0x8086, 0x1c20),
Takashi Iwaid7dab4d2013-01-08 13:51:30 +01003659 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM },
Seth Heasleycea310e2010-09-10 16:29:56 -07003660 /* PBG */
Takashi Iwai9477c582011-05-25 09:11:37 +02003661 { PCI_DEVICE(0x8086, 0x1d20),
Takashi Iwaid7dab4d2013-01-08 13:51:30 +01003662 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM },
Seth Heasleyd2edeb72011-04-20 10:59:57 -07003663 /* Panther Point */
Takashi Iwai9477c582011-05-25 09:11:37 +02003664 { PCI_DEVICE(0x8086, 0x1e20),
Takashi Iwaib1920c22013-11-22 12:43:25 +01003665 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
Seth Heasley8bc039a2012-01-23 16:24:31 -08003666 /* Lynx Point */
3667 { PCI_DEVICE(0x8086, 0x8c20),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003668 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
James Ralston884b0882013-02-08 17:29:40 -08003669 /* Wellsburg */
3670 { PCI_DEVICE(0x8086, 0x8d20),
3671 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
3672 { PCI_DEVICE(0x8086, 0x8d21),
3673 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
James Ralston144dad92012-08-09 09:38:59 -07003674 /* Lynx Point-LP */
3675 { PCI_DEVICE(0x8086, 0x9c20),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003676 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
James Ralston144dad92012-08-09 09:38:59 -07003677 /* Lynx Point-LP */
3678 { PCI_DEVICE(0x8086, 0x9c21),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003679 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
James Ralston4eeca492013-11-04 09:27:45 -08003680 /* Wildcat Point-LP */
3681 { PCI_DEVICE(0x8086, 0x9ca0),
3682 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
Wang Xingchaoe926f2c2012-06-13 10:23:51 +08003683 /* Haswell */
Wang Xingchao4a7c5162013-02-01 22:42:19 +08003684 { PCI_DEVICE(0x8086, 0x0a0c),
Takashi Iwaifab12852013-11-05 17:54:05 +01003685 .driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL },
Wang Xingchaoe926f2c2012-06-13 10:23:51 +08003686 { PCI_DEVICE(0x8086, 0x0c0c),
Takashi Iwaifab12852013-11-05 17:54:05 +01003687 .driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL },
Wang Xingchaod279fae2012-09-17 13:10:23 +08003688 { PCI_DEVICE(0x8086, 0x0d0c),
Takashi Iwaifab12852013-11-05 17:54:05 +01003689 .driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL },
Mengdong Lin862d7612014-01-08 15:55:14 -05003690 /* Broadwell */
3691 { PCI_DEVICE(0x8086, 0x160c),
3692 .driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL },
Pierre-Louis Bossart99df18b2012-09-21 18:39:07 -05003693 /* 5 Series/3400 */
3694 { PCI_DEVICE(0x8086, 0x3b56),
Takashi Iwai2c1350f2013-02-14 09:44:55 +01003695 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_NOPM },
Takashi Iwaif748abc2013-01-29 10:12:23 +01003696 /* Poulsbo */
Takashi Iwai9477c582011-05-25 09:11:37 +02003697 { PCI_DEVICE(0x8086, 0x811b),
Takashi Iwaif748abc2013-01-29 10:12:23 +01003698 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_NOPM },
3699 /* Oaktrail */
Li Peng09904b92011-12-28 15:17:26 +00003700 { PCI_DEVICE(0x8086, 0x080a),
Takashi Iwaif748abc2013-01-29 10:12:23 +01003701 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_NOPM },
Chew, Chiau Eee44007e2013-05-16 15:36:12 +08003702 /* BayTrail */
3703 { PCI_DEVICE(0x8086, 0x0f04),
3704 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM },
David Henningsson645e9032011-12-14 15:52:30 +08003705 /* ICH */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003706 { PCI_DEVICE(0x8086, 0x2668),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003707 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3708 AZX_DCAPS_BUFSIZE }, /* ICH6 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003709 { PCI_DEVICE(0x8086, 0x27d8),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003710 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3711 AZX_DCAPS_BUFSIZE }, /* ICH7 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003712 { PCI_DEVICE(0x8086, 0x269a),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003713 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3714 AZX_DCAPS_BUFSIZE }, /* ESB2 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003715 { PCI_DEVICE(0x8086, 0x284b),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003716 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3717 AZX_DCAPS_BUFSIZE }, /* ICH8 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003718 { PCI_DEVICE(0x8086, 0x293e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003719 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3720 AZX_DCAPS_BUFSIZE }, /* ICH9 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003721 { PCI_DEVICE(0x8086, 0x293f),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003722 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3723 AZX_DCAPS_BUFSIZE }, /* ICH9 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003724 { PCI_DEVICE(0x8086, 0x3a3e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003725 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3726 AZX_DCAPS_BUFSIZE }, /* ICH10 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003727 { PCI_DEVICE(0x8086, 0x3a6e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003728 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3729 AZX_DCAPS_BUFSIZE }, /* ICH10 */
Takashi Iwaib6864532010-09-15 10:17:26 +02003730 /* Generic Intel */
3731 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_ANY_ID),
3732 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3733 .class_mask = 0xffffff,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003734 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_BUFSIZE },
Takashi Iwai9477c582011-05-25 09:11:37 +02003735 /* ATI SB 450/600/700/800/900 */
3736 { PCI_DEVICE(0x1002, 0x437b),
3737 .driver_data = AZX_DRIVER_ATI | AZX_DCAPS_PRESET_ATI_SB },
3738 { PCI_DEVICE(0x1002, 0x4383),
3739 .driver_data = AZX_DRIVER_ATI | AZX_DCAPS_PRESET_ATI_SB },
3740 /* AMD Hudson */
3741 { PCI_DEVICE(0x1022, 0x780d),
3742 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_SB },
Takashi Iwai87218e92008-02-21 08:13:11 +01003743 /* ATI HDMI */
Takashi Iwai9477c582011-05-25 09:11:37 +02003744 { PCI_DEVICE(0x1002, 0x793b),
3745 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3746 { PCI_DEVICE(0x1002, 0x7919),
3747 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3748 { PCI_DEVICE(0x1002, 0x960f),
3749 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3750 { PCI_DEVICE(0x1002, 0x970f),
3751 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3752 { PCI_DEVICE(0x1002, 0xaa00),
3753 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3754 { PCI_DEVICE(0x1002, 0xaa08),
3755 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3756 { PCI_DEVICE(0x1002, 0xaa10),
3757 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3758 { PCI_DEVICE(0x1002, 0xaa18),
3759 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3760 { PCI_DEVICE(0x1002, 0xaa20),
3761 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3762 { PCI_DEVICE(0x1002, 0xaa28),
3763 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3764 { PCI_DEVICE(0x1002, 0xaa30),
3765 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3766 { PCI_DEVICE(0x1002, 0xaa38),
3767 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3768 { PCI_DEVICE(0x1002, 0xaa40),
3769 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3770 { PCI_DEVICE(0x1002, 0xaa48),
3771 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
Clemens Ladischbbaa0d62013-11-05 09:27:10 +01003772 { PCI_DEVICE(0x1002, 0xaa50),
3773 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3774 { PCI_DEVICE(0x1002, 0xaa58),
3775 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3776 { PCI_DEVICE(0x1002, 0xaa60),
3777 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3778 { PCI_DEVICE(0x1002, 0xaa68),
3779 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3780 { PCI_DEVICE(0x1002, 0xaa80),
3781 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3782 { PCI_DEVICE(0x1002, 0xaa88),
3783 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3784 { PCI_DEVICE(0x1002, 0xaa90),
3785 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3786 { PCI_DEVICE(0x1002, 0xaa98),
3787 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
Andiry Xu1815b342011-12-14 16:10:27 +08003788 { PCI_DEVICE(0x1002, 0x9902),
3789 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
3790 { PCI_DEVICE(0x1002, 0xaaa0),
3791 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
3792 { PCI_DEVICE(0x1002, 0xaaa8),
3793 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
3794 { PCI_DEVICE(0x1002, 0xaab0),
3795 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
Takashi Iwai87218e92008-02-21 08:13:11 +01003796 /* VIA VT8251/VT8237A */
Takashi Iwai9477c582011-05-25 09:11:37 +02003797 { PCI_DEVICE(0x1106, 0x3288),
3798 .driver_data = AZX_DRIVER_VIA | AZX_DCAPS_POSFIX_VIA },
Annie Liu754fdff2012-06-08 19:18:39 +08003799 /* VIA GFX VT7122/VX900 */
3800 { PCI_DEVICE(0x1106, 0x9170), .driver_data = AZX_DRIVER_GENERIC },
3801 /* VIA GFX VT6122/VX11 */
3802 { PCI_DEVICE(0x1106, 0x9140), .driver_data = AZX_DRIVER_GENERIC },
Takashi Iwai87218e92008-02-21 08:13:11 +01003803 /* SIS966 */
3804 { PCI_DEVICE(0x1039, 0x7502), .driver_data = AZX_DRIVER_SIS },
3805 /* ULI M5461 */
3806 { PCI_DEVICE(0x10b9, 0x5461), .driver_data = AZX_DRIVER_ULI },
3807 /* NVIDIA MCP */
Takashi Iwai0c2fd1bf42009-12-18 16:41:39 +01003808 { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID),
3809 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3810 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02003811 .driver_data = AZX_DRIVER_NVIDIA | AZX_DCAPS_PRESET_NVIDIA },
Kailang Yangf2690022008-05-27 11:44:55 +02003812 /* Teradici */
Takashi Iwai9477c582011-05-25 09:11:37 +02003813 { PCI_DEVICE(0x6549, 0x1200),
3814 .driver_data = AZX_DRIVER_TERA | AZX_DCAPS_NO_64BIT },
Lars R. Damerowf0b3da92012-11-02 13:10:39 -07003815 { PCI_DEVICE(0x6549, 0x2200),
3816 .driver_data = AZX_DRIVER_TERA | AZX_DCAPS_NO_64BIT },
Takashi Iwai4e01f542009-04-16 08:53:34 +02003817 /* Creative X-Fi (CA0110-IBG) */
Takashi Iwaif2a8eca2012-06-11 15:51:54 +02003818 /* CTHDA chips */
3819 { PCI_DEVICE(0x1102, 0x0010),
3820 .driver_data = AZX_DRIVER_CTHDA | AZX_DCAPS_PRESET_CTHDA },
3821 { PCI_DEVICE(0x1102, 0x0012),
3822 .driver_data = AZX_DRIVER_CTHDA | AZX_DCAPS_PRESET_CTHDA },
Takashi Iwai8eeaa2f2014-02-10 09:48:47 +01003823#if !IS_ENABLED(CONFIG_SND_CTXFI)
Takashi Iwai313f6e22009-05-18 12:40:52 +02003824 /* the following entry conflicts with snd-ctxfi driver,
3825 * as ctxfi driver mutates from HD-audio to native mode with
3826 * a special command sequence.
3827 */
Takashi Iwai4e01f542009-04-16 08:53:34 +02003828 { PCI_DEVICE(PCI_VENDOR_ID_CREATIVE, PCI_ANY_ID),
3829 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3830 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02003831 .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
Takashi Iwai69f9ba92011-11-06 13:49:13 +01003832 AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB },
Takashi Iwai313f6e22009-05-18 12:40:52 +02003833#else
3834 /* this entry seems still valid -- i.e. without emu20kx chip */
Takashi Iwai9477c582011-05-25 09:11:37 +02003835 { PCI_DEVICE(0x1102, 0x0009),
3836 .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
Takashi Iwai69f9ba92011-11-06 13:49:13 +01003837 AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB },
Takashi Iwai313f6e22009-05-18 12:40:52 +02003838#endif
Otavio Salvadore35d4b12010-09-26 23:35:06 -03003839 /* Vortex86MX */
3840 { PCI_DEVICE(0x17f3, 0x3010), .driver_data = AZX_DRIVER_GENERIC },
Bankim Bhavsar0f0714c52011-01-17 15:23:21 +01003841 /* VMware HDAudio */
3842 { PCI_DEVICE(0x15ad, 0x1977), .driver_data = AZX_DRIVER_GENERIC },
Andiry Brienza9176b672009-07-17 11:32:32 +08003843 /* AMD/ATI Generic, PCI class code and Vendor ID for HD Audio */
Yang, Libinc4da29c2008-11-13 11:07:07 +01003844 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_ANY_ID),
3845 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3846 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02003847 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_HDMI },
Andiry Brienza9176b672009-07-17 11:32:32 +08003848 { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_ANY_ID),
3849 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3850 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02003851 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_HDMI },
Linus Torvalds1da177e2005-04-16 15:20:36 -07003852 { 0, }
3853};
3854MODULE_DEVICE_TABLE(pci, azx_ids);
3855
3856/* pci_driver definition */
Takashi Iwaie9f66d92012-04-24 12:25:00 +02003857static struct pci_driver azx_driver = {
Takashi Iwai3733e422011-06-10 16:20:20 +02003858 .name = KBUILD_MODNAME,
Linus Torvalds1da177e2005-04-16 15:20:36 -07003859 .id_table = azx_ids,
3860 .probe = azx_probe,
Bill Pembertone23e7a12012-12-06 12:35:10 -05003861 .remove = azx_remove,
Takashi Iwai68cb2b52012-07-02 15:20:37 +02003862 .driver = {
3863 .pm = AZX_PM_OPS,
3864 },
Linus Torvalds1da177e2005-04-16 15:20:36 -07003865};
3866
Takashi Iwaie9f66d92012-04-24 12:25:00 +02003867module_pci_driver(azx_driver);