blob: ebbeefe203fd9c4a8ac0fb1b4c5ab79b37458732 [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;
Dylan Reide62a42a2014-02-28 15:41:19 -0800131static int *power_save_addr = &power_save;
Takashi Iwai65fcd412012-08-14 17:13:32 +0200132module_param(power_save, xint, 0644);
Takashi Iwaifee2fba2008-11-27 12:43:28 +0100133MODULE_PARM_DESC(power_save, "Automatic power-saving timeout "
134 "(in second, 0 = disable).");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700135
Takashi Iwaidee1b662007-08-13 16:10:30 +0200136/* reset the HD-audio controller in power save mode.
137 * this may give more power-saving, but will take longer time to
138 * wake up.
139 */
Takashi Iwai8fc24422013-04-04 15:35:24 +0200140static bool power_save_controller = 1;
141module_param(power_save_controller, bool, 0644);
Takashi Iwaidee1b662007-08-13 16:10:30 +0200142MODULE_PARM_DESC(power_save_controller, "Reset controller in power save mode.");
Dylan Reide62a42a2014-02-28 15:41:19 -0800143#else
144static int *power_save_addr;
Takashi Iwai83012a72012-08-24 18:38:08 +0200145#endif /* CONFIG_PM */
Takashi Iwaidee1b662007-08-13 16:10:30 +0200146
Takashi Iwai7bfe0592012-01-23 17:53:39 +0100147static int align_buffer_size = -1;
148module_param(align_buffer_size, bint, 0644);
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -0500149MODULE_PARM_DESC(align_buffer_size,
150 "Force buffer and period sizes to be multiple of 128 bytes.");
151
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200152#ifdef CONFIG_X86
153static bool hda_snoop = true;
154module_param_named(snoop, hda_snoop, bool, 0444);
155MODULE_PARM_DESC(snoop, "Enable/disable snooping");
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200156#else
157#define hda_snoop true
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200158#endif
159
160
Linus Torvalds1da177e2005-04-16 15:20:36 -0700161MODULE_LICENSE("GPL");
162MODULE_SUPPORTED_DEVICE("{{Intel, ICH6},"
163 "{Intel, ICH6M},"
Jason Gaston2f1b3812005-05-01 08:58:50 -0700164 "{Intel, ICH7},"
Frederick Lif5d40b32005-05-12 14:55:20 +0200165 "{Intel, ESB2},"
Jason Gastond2981392006-01-10 11:07:37 +0100166 "{Intel, ICH8},"
Jason Gastonf9cc8a82006-11-22 11:53:52 +0100167 "{Intel, ICH9},"
Jason Gastonc34f5a02008-01-29 12:38:49 +0100168 "{Intel, ICH10},"
Seth Heasleyb29c2362008-08-08 15:56:39 -0700169 "{Intel, PCH},"
Seth Heasleyd2f2fcd2010-01-12 17:03:35 -0800170 "{Intel, CPT},"
Seth Heasleyd2edeb72011-04-20 10:59:57 -0700171 "{Intel, PPT},"
Seth Heasley8bc039a2012-01-23 16:24:31 -0800172 "{Intel, LPT},"
James Ralston144dad92012-08-09 09:38:59 -0700173 "{Intel, LPT_LP},"
James Ralston4eeca492013-11-04 09:27:45 -0800174 "{Intel, WPT_LP},"
Wang Xingchaoe926f2c2012-06-13 10:23:51 +0800175 "{Intel, HPT},"
Seth Heasleycea310e2010-09-10 16:29:56 -0700176 "{Intel, PBG},"
Tobin Davis4979bca2008-01-30 08:13:55 +0100177 "{Intel, SCH},"
Takashi Iwaifc20a562005-05-12 15:00:41 +0200178 "{ATI, SB450},"
Felix Kuehling89be83f2006-03-31 12:33:59 +0200179 "{ATI, SB600},"
Felix Kuehling778b6e12006-05-17 11:22:21 +0200180 "{ATI, RS600},"
Felix Kuehling5b15c952006-10-16 12:49:47 +0200181 "{ATI, RS690},"
Wolke Liue6db1112007-04-27 12:20:57 +0200182 "{ATI, RS780},"
183 "{ATI, R600},"
Herton Ronaldo Krzesinski2797f722007-11-05 18:21:56 +0100184 "{ATI, RV630},"
185 "{ATI, RV610},"
Wolke Liu27da1832007-11-16 11:06:30 +0100186 "{ATI, RV670},"
187 "{ATI, RV635},"
188 "{ATI, RV620},"
189 "{ATI, RV770},"
Takashi Iwaifc20a562005-05-12 15:00:41 +0200190 "{VIA, VT8251},"
Takashi Iwai47672312005-08-12 16:44:04 +0200191 "{VIA, VT8237A},"
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200192 "{SiS, SIS966},"
193 "{ULI, M5461}}");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700194MODULE_DESCRIPTION("Intel HDA driver");
195
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200196#if defined(CONFIG_PM) && defined(CONFIG_VGA_SWITCHEROO)
Takashi Iwaif8f1bec2014-02-06 18:14:03 +0100197#if IS_ENABLED(CONFIG_SND_HDA_CODEC_HDMI)
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200198#define SUPPORT_VGA_SWITCHEROO
199#endif
200#endif
201
202
Takashi Iwaicb53c622007-08-10 17:21:45 +0200203/*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700204 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700205
Takashi Iwaieb49faa2013-03-15 09:19:11 +0100206/* DSP lock helpers */
207#ifdef CONFIG_SND_HDA_DSP_LOADER
208#define dsp_lock_init(dev) mutex_init(&(dev)->dsp_mutex)
209#define dsp_lock(dev) mutex_lock(&(dev)->dsp_mutex)
210#define dsp_unlock(dev) mutex_unlock(&(dev)->dsp_mutex)
211#define dsp_is_locked(dev) ((dev)->locked)
212#else
213#define dsp_lock_init(dev) do {} while (0)
214#define dsp_lock(dev) do {} while (0)
215#define dsp_unlock(dev) do {} while (0)
216#define dsp_is_locked(dev) 0
217#endif
218
Takashi Iwai1a8506d2012-10-16 15:10:08 +0200219#define CREATE_TRACE_POINTS
220#include "hda_intel_trace.h"
221
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200222/* driver types */
223enum {
224 AZX_DRIVER_ICH,
Seth Heasley32679f92010-02-22 17:31:09 -0800225 AZX_DRIVER_PCH,
Tobin Davis4979bca2008-01-30 08:13:55 +0100226 AZX_DRIVER_SCH,
Takashi Iwaifab12852013-11-05 17:54:05 +0100227 AZX_DRIVER_HDMI,
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200228 AZX_DRIVER_ATI,
Felix Kuehling778b6e12006-05-17 11:22:21 +0200229 AZX_DRIVER_ATIHDMI,
Andiry Xu1815b342011-12-14 16:10:27 +0800230 AZX_DRIVER_ATIHDMI_NS,
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200231 AZX_DRIVER_VIA,
232 AZX_DRIVER_SIS,
233 AZX_DRIVER_ULI,
Vinod Gda3fca22005-09-13 18:49:12 +0200234 AZX_DRIVER_NVIDIA,
Kailang Yangf2690022008-05-27 11:44:55 +0200235 AZX_DRIVER_TERA,
Takashi Iwai14d34f12010-10-21 09:03:25 +0200236 AZX_DRIVER_CTX,
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200237 AZX_DRIVER_CTHDA,
Yang, Libinc4da29c2008-11-13 11:07:07 +0100238 AZX_DRIVER_GENERIC,
Takashi Iwai2f5983f2008-09-03 16:00:44 +0200239 AZX_NUM_DRIVERS, /* keep this as last entry */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200240};
241
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +0100242/* quirks for Intel PCH */
Takashi Iwaid7dab4d2013-01-08 13:51:30 +0100243#define AZX_DCAPS_INTEL_PCH_NOPM \
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +0100244 (AZX_DCAPS_SCH_SNOOP | AZX_DCAPS_BUFSIZE | \
Takashi Iwaid7dab4d2013-01-08 13:51:30 +0100245 AZX_DCAPS_COUNT_LPIB_DELAY)
246
247#define AZX_DCAPS_INTEL_PCH \
248 (AZX_DCAPS_INTEL_PCH_NOPM | AZX_DCAPS_PM_RUNTIME)
Takashi Iwai9477c582011-05-25 09:11:37 +0200249
Takashi Iwai33499a12013-11-05 17:34:46 +0100250#define AZX_DCAPS_INTEL_HASWELL \
251 (AZX_DCAPS_SCH_SNOOP | AZX_DCAPS_ALIGN_BUFSIZE | \
252 AZX_DCAPS_COUNT_LPIB_DELAY | AZX_DCAPS_PM_RUNTIME | \
253 AZX_DCAPS_I915_POWERWELL)
254
Takashi Iwai9477c582011-05-25 09:11:37 +0200255/* quirks for ATI SB / AMD Hudson */
256#define AZX_DCAPS_PRESET_ATI_SB \
257 (AZX_DCAPS_ATI_SNOOP | AZX_DCAPS_NO_TCSEL | \
258 AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB)
259
260/* quirks for ATI/AMD HDMI */
261#define AZX_DCAPS_PRESET_ATI_HDMI \
262 (AZX_DCAPS_NO_TCSEL | AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB)
263
264/* quirks for Nvidia */
265#define AZX_DCAPS_PRESET_NVIDIA \
Takashi Iwai7bfe0592012-01-23 17:53:39 +0100266 (AZX_DCAPS_NVIDIA_SNOOP | AZX_DCAPS_RIRB_DELAY | AZX_DCAPS_NO_MSI |\
Mike Travis49d9e772013-05-01 14:04:08 -0500267 AZX_DCAPS_ALIGN_BUFSIZE | AZX_DCAPS_NO_64BIT)
Takashi Iwai9477c582011-05-25 09:11:37 +0200268
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200269#define AZX_DCAPS_PRESET_CTHDA \
270 (AZX_DCAPS_NO_MSI | AZX_DCAPS_POSFIX_LPIB | AZX_DCAPS_4K_BDLE_BOUNDARY)
271
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200272/*
273 * VGA-switcher support
274 */
275#ifdef SUPPORT_VGA_SWITCHEROO
Takashi Iwai5cb543d2012-08-09 13:49:23 +0200276#define use_vga_switcheroo(chip) ((chip)->use_vga_switcheroo)
277#else
278#define use_vga_switcheroo(chip) 0
279#endif
280
Takashi Iwai48c8b0e2012-12-07 07:40:35 +0100281static char *driver_short_names[] = {
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200282 [AZX_DRIVER_ICH] = "HDA Intel",
Seth Heasley32679f92010-02-22 17:31:09 -0800283 [AZX_DRIVER_PCH] = "HDA Intel PCH",
Tobin Davis4979bca2008-01-30 08:13:55 +0100284 [AZX_DRIVER_SCH] = "HDA Intel MID",
Takashi Iwaifab12852013-11-05 17:54:05 +0100285 [AZX_DRIVER_HDMI] = "HDA Intel HDMI",
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200286 [AZX_DRIVER_ATI] = "HDA ATI SB",
Felix Kuehling778b6e12006-05-17 11:22:21 +0200287 [AZX_DRIVER_ATIHDMI] = "HDA ATI HDMI",
Andiry Xu1815b342011-12-14 16:10:27 +0800288 [AZX_DRIVER_ATIHDMI_NS] = "HDA ATI HDMI",
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200289 [AZX_DRIVER_VIA] = "HDA VIA VT82xx",
290 [AZX_DRIVER_SIS] = "HDA SIS966",
Vinod Gda3fca22005-09-13 18:49:12 +0200291 [AZX_DRIVER_ULI] = "HDA ULI M5461",
292 [AZX_DRIVER_NVIDIA] = "HDA NVidia",
Kailang Yangf2690022008-05-27 11:44:55 +0200293 [AZX_DRIVER_TERA] = "HDA Teradici",
Takashi Iwai14d34f12010-10-21 09:03:25 +0200294 [AZX_DRIVER_CTX] = "HDA Creative",
Takashi Iwai5ae763b2012-05-08 10:34:08 +0200295 [AZX_DRIVER_CTHDA] = "HDA Creative",
Yang, Libinc4da29c2008-11-13 11:07:07 +0100296 [AZX_DRIVER_GENERIC] = "HD-Audio Generic",
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200297};
298
Linus Torvalds1da177e2005-04-16 15:20:36 -0700299/* for pcm support */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100300#define get_azx_dev(substream) (substream->runtime->private_data)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700301
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200302#ifdef CONFIG_X86
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100303static void __mark_pages_wc(struct azx *chip, struct snd_dma_buffer *dmab, bool on)
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200304{
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100305 int pages;
306
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200307 if (azx_snoop(chip))
308 return;
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100309 if (!dmab || !dmab->area || !dmab->bytes)
310 return;
311
312#ifdef CONFIG_SND_DMA_SGBUF
313 if (dmab->dev.type == SNDRV_DMA_TYPE_DEV_SG) {
314 struct snd_sg_buf *sgbuf = dmab->private_data;
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200315 if (on)
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100316 set_pages_array_wc(sgbuf->page_table, sgbuf->pages);
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200317 else
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100318 set_pages_array_wb(sgbuf->page_table, sgbuf->pages);
319 return;
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200320 }
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100321#endif
322
323 pages = (dmab->bytes + PAGE_SIZE - 1) >> PAGE_SHIFT;
324 if (on)
325 set_memory_wc((unsigned long)dmab->area, pages);
326 else
327 set_memory_wb((unsigned long)dmab->area, pages);
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200328}
329
330static inline void mark_pages_wc(struct azx *chip, struct snd_dma_buffer *buf,
331 bool on)
332{
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100333 __mark_pages_wc(chip, buf, on);
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200334}
335static inline void mark_runtime_wc(struct azx *chip, struct azx_dev *azx_dev,
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100336 struct snd_pcm_substream *substream, bool on)
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200337{
338 if (azx_dev->wc_marked != on) {
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100339 __mark_pages_wc(chip, snd_pcm_get_dma_buf(substream), on);
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200340 azx_dev->wc_marked = on;
341 }
342}
343#else
344/* NOP for other archs */
345static inline void mark_pages_wc(struct azx *chip, struct snd_dma_buffer *buf,
346 bool on)
347{
348}
349static inline void mark_runtime_wc(struct azx *chip, struct azx_dev *azx_dev,
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +0100350 struct snd_pcm_substream *substream, bool on)
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200351{
352}
353#endif
354
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200355static int azx_acquire_irq(struct azx *chip, int do_disconnect);
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200356static int azx_send_cmd(struct hda_bus *bus, unsigned int val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700357/*
358 * Interface for HD codec
359 */
360
Linus Torvalds1da177e2005-04-16 15:20:36 -0700361/*
362 * CORB / RIRB interface
363 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100364static int azx_alloc_cmd_io(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700365{
366 int err;
367
368 /* single page (at least 4096 bytes) must suffice for both ringbuffes */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200369 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
Dylan Reid89287562014-02-28 15:41:15 -0800370 chip->card->dev,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700371 PAGE_SIZE, &chip->rb);
372 if (err < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +0100373 dev_err(chip->card->dev, "cannot allocate CORB/RIRB\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700374 return err;
375 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200376 mark_pages_wc(chip, &chip->rb, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700377 return 0;
378}
379
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100380static void azx_init_cmd_io(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700381{
David Henningssonca460f82014-02-28 07:56:58 +0100382 int timeout;
383
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800384 spin_lock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700385 /* CORB set up */
386 chip->corb.addr = chip->rb.addr;
387 chip->corb.buf = (u32 *)chip->rb.area;
388 azx_writel(chip, CORBLBASE, (u32)chip->corb.addr);
Takashi Iwai766979e2008-06-13 20:53:56 +0200389 azx_writel(chip, CORBUBASE, upper_32_bits(chip->corb.addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700390
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200391 /* set the corb size to 256 entries (ULI requires explicitly) */
392 azx_writeb(chip, CORBSIZE, 0x02);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700393 /* set the corb write pointer to 0 */
394 azx_writew(chip, CORBWP, 0);
David Henningssonca460f82014-02-28 07:56:58 +0100395
Linus Torvalds1da177e2005-04-16 15:20:36 -0700396 /* reset the corb hw read pointer */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200397 azx_writew(chip, CORBRP, ICH6_CORBRP_RST);
David Henningssonca460f82014-02-28 07:56:58 +0100398 for (timeout = 1000; timeout > 0; timeout--) {
399 if ((azx_readw(chip, CORBRP) & ICH6_CORBRP_RST) == ICH6_CORBRP_RST)
400 break;
401 udelay(1);
402 }
403 if (timeout <= 0)
404 dev_err(chip->card->dev, "CORB reset timeout#1, CORBRP = %d\n",
405 azx_readw(chip, CORBRP));
406
407 azx_writew(chip, CORBRP, 0);
408 for (timeout = 1000; timeout > 0; timeout--) {
409 if (azx_readw(chip, CORBRP) == 0)
410 break;
411 udelay(1);
412 }
413 if (timeout <= 0)
414 dev_err(chip->card->dev, "CORB reset timeout#2, CORBRP = %d\n",
415 azx_readw(chip, CORBRP));
416
Linus Torvalds1da177e2005-04-16 15:20:36 -0700417 /* enable corb dma */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200418 azx_writeb(chip, CORBCTL, ICH6_CORBCTL_RUN);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700419
420 /* RIRB set up */
421 chip->rirb.addr = chip->rb.addr + 2048;
422 chip->rirb.buf = (u32 *)(chip->rb.area + 2048);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800423 chip->rirb.wp = chip->rirb.rp = 0;
424 memset(chip->rirb.cmds, 0, sizeof(chip->rirb.cmds));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700425 azx_writel(chip, RIRBLBASE, (u32)chip->rirb.addr);
Takashi Iwai766979e2008-06-13 20:53:56 +0200426 azx_writel(chip, RIRBUBASE, upper_32_bits(chip->rirb.addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700427
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200428 /* set the rirb size to 256 entries (ULI requires explicitly) */
429 azx_writeb(chip, RIRBSIZE, 0x02);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700430 /* reset the rirb hw write pointer */
Takashi Iwaib21fadb2009-05-28 12:26:15 +0200431 azx_writew(chip, RIRBWP, ICH6_RIRBWP_RST);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700432 /* set N=1, get RIRB response interrupt for new entry */
Takashi Iwai9477c582011-05-25 09:11:37 +0200433 if (chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND)
Takashi Iwai14d34f12010-10-21 09:03:25 +0200434 azx_writew(chip, RINTCNT, 0xc0);
435 else
436 azx_writew(chip, RINTCNT, 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700437 /* enable rirb dma and response irq */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700438 azx_writeb(chip, RIRBCTL, ICH6_RBCTL_DMA_EN | ICH6_RBCTL_IRQ_EN);
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800439 spin_unlock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700440}
441
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100442static void azx_free_cmd_io(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700443{
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800444 spin_lock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700445 /* disable ringbuffer DMAs */
446 azx_writeb(chip, RIRBCTL, 0);
447 azx_writeb(chip, CORBCTL, 0);
Wu Fengguangcdb1fbf2009-08-01 18:47:41 +0800448 spin_unlock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700449}
450
Wu Fengguangdeadff12009-08-01 18:45:16 +0800451static unsigned int azx_command_addr(u32 cmd)
452{
453 unsigned int addr = cmd >> 28;
454
455 if (addr >= AZX_MAX_CODECS) {
456 snd_BUG();
457 addr = 0;
458 }
459
460 return addr;
461}
462
Linus Torvalds1da177e2005-04-16 15:20:36 -0700463/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100464static int azx_corb_send_cmd(struct hda_bus *bus, u32 val)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700465{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100466 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800467 unsigned int addr = azx_command_addr(val);
Takashi Iwai3bcce5c2012-12-20 11:17:17 +0100468 unsigned int wp, rp;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700469
Wu Fengguangc32649f2009-08-01 18:48:12 +0800470 spin_lock_irq(&chip->reg_lock);
471
Linus Torvalds1da177e2005-04-16 15:20:36 -0700472 /* add command to corb */
Takashi Iwaicc5ede32012-12-12 11:10:49 +0100473 wp = azx_readw(chip, CORBWP);
474 if (wp == 0xffff) {
475 /* something wrong, controller likely turned to D3 */
476 spin_unlock_irq(&chip->reg_lock);
Takashi Iwai3bcce5c2012-12-20 11:17:17 +0100477 return -EIO;
Takashi Iwaicc5ede32012-12-12 11:10:49 +0100478 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700479 wp++;
480 wp %= ICH6_MAX_CORB_ENTRIES;
481
Takashi Iwai3bcce5c2012-12-20 11:17:17 +0100482 rp = azx_readw(chip, CORBRP);
483 if (wp == rp) {
484 /* oops, it's full */
485 spin_unlock_irq(&chip->reg_lock);
486 return -EAGAIN;
487 }
488
Wu Fengguangdeadff12009-08-01 18:45:16 +0800489 chip->rirb.cmds[addr]++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700490 chip->corb.buf[wp] = cpu_to_le32(val);
David Henningssonca460f82014-02-28 07:56:58 +0100491 azx_writew(chip, CORBWP, wp);
Wu Fengguangc32649f2009-08-01 18:48:12 +0800492
Linus Torvalds1da177e2005-04-16 15:20:36 -0700493 spin_unlock_irq(&chip->reg_lock);
494
495 return 0;
496}
497
498#define ICH6_RIRB_EX_UNSOL_EV (1<<4)
499
500/* retrieve RIRB entry - called from interrupt handler */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100501static void azx_update_rirb(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700502{
503 unsigned int rp, wp;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800504 unsigned int addr;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700505 u32 res, res_ex;
506
Takashi Iwaicc5ede32012-12-12 11:10:49 +0100507 wp = azx_readw(chip, RIRBWP);
508 if (wp == 0xffff) {
509 /* something wrong, controller likely turned to D3 */
510 return;
511 }
512
Linus Torvalds1da177e2005-04-16 15:20:36 -0700513 if (wp == chip->rirb.wp)
514 return;
515 chip->rirb.wp = wp;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800516
Linus Torvalds1da177e2005-04-16 15:20:36 -0700517 while (chip->rirb.rp != wp) {
518 chip->rirb.rp++;
519 chip->rirb.rp %= ICH6_MAX_RIRB_ENTRIES;
520
521 rp = chip->rirb.rp << 1; /* an RIRB entry is 8-bytes */
522 res_ex = le32_to_cpu(chip->rirb.buf[rp + 1]);
523 res = le32_to_cpu(chip->rirb.buf[rp]);
David Henningsson3d692452014-01-29 13:12:31 +0100524 addr = res_ex & 0xf;
525 if ((addr >= AZX_MAX_CODECS) || !(chip->codec_mask & (1 << addr))) {
Takashi Iwai4e76a882014-02-25 12:21:03 +0100526 dev_err(chip->card->dev, "spurious response %#x:%#x, rp = %d, wp = %d",
527 res, res_ex,
528 chip->rirb.rp, wp);
David Henningsson3d692452014-01-29 13:12:31 +0100529 snd_BUG();
530 }
531 else if (res_ex & ICH6_RIRB_EX_UNSOL_EV)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700532 snd_hda_queue_unsol_event(chip->bus, res, res_ex);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800533 else if (chip->rirb.cmds[addr]) {
534 chip->rirb.res[addr] = res;
Takashi Iwai2add9b92008-03-18 09:47:06 +0100535 smp_wmb();
Wu Fengguangdeadff12009-08-01 18:45:16 +0800536 chip->rirb.cmds[addr]--;
Joe Perches3b70a672013-11-07 11:55:15 -0800537 } else if (printk_ratelimit()) {
Takashi Iwai4e76a882014-02-25 12:21:03 +0100538 dev_err(chip->card->dev, "spurious response %#x:%#x, last cmd=%#08x\n",
539 res, res_ex,
540 chip->last_cmd[addr]);
Joe Perches3b70a672013-11-07 11:55:15 -0800541 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700542 }
543}
544
545/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800546static unsigned int azx_rirb_get_response(struct hda_bus *bus,
547 unsigned int addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700548{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100549 struct azx *chip = bus->private_data;
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200550 unsigned long timeout;
David Henningsson32cf4022012-05-04 11:05:55 +0200551 unsigned long loopcounter;
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200552 int do_poll = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700553
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200554 again:
555 timeout = jiffies + msecs_to_jiffies(1000);
David Henningsson32cf4022012-05-04 11:05:55 +0200556
557 for (loopcounter = 0;; loopcounter++) {
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200558 if (chip->polling_mode || do_poll) {
Takashi Iwaie96224a2006-08-21 17:57:44 +0200559 spin_lock_irq(&chip->reg_lock);
560 azx_update_rirb(chip);
561 spin_unlock_irq(&chip->reg_lock);
562 }
Wu Fengguangdeadff12009-08-01 18:45:16 +0800563 if (!chip->rirb.cmds[addr]) {
Takashi Iwai2add9b92008-03-18 09:47:06 +0100564 smp_rmb();
Takashi Iwaib6132912009-03-24 07:36:09 +0100565 bus->rirb_error = 0;
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200566
567 if (!do_poll)
568 chip->poll_count = 0;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800569 return chip->rirb.res[addr]; /* the last value */
Takashi Iwai2add9b92008-03-18 09:47:06 +0100570 }
Takashi Iwai28a0d9d2008-01-18 15:32:32 +0100571 if (time_after(jiffies, timeout))
572 break;
David Henningsson32cf4022012-05-04 11:05:55 +0200573 if (bus->needs_damn_long_delay || loopcounter > 3000)
Takashi Iwai52987652008-01-16 16:09:47 +0100574 msleep(2); /* temporary workaround */
575 else {
576 udelay(10);
577 cond_resched();
578 }
Takashi Iwai28a0d9d2008-01-18 15:32:32 +0100579 }
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200580
Takashi Iwai63e51fd2013-06-06 14:20:19 +0200581 if (!bus->no_response_fallback)
582 return -1;
583
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200584 if (!chip->polling_mode && chip->poll_count < 2) {
Takashi Iwai4e76a882014-02-25 12:21:03 +0100585 dev_dbg(chip->card->dev,
586 "azx_get_response timeout, polling the codec once: last cmd=0x%08x\n",
587 chip->last_cmd[addr]);
Maxim Levitsky1eb6dc72010-02-04 22:21:47 +0200588 do_poll = 1;
589 chip->poll_count++;
590 goto again;
591 }
592
593
Takashi Iwai23c4a882009-10-30 13:21:49 +0100594 if (!chip->polling_mode) {
Takashi Iwai4e76a882014-02-25 12:21:03 +0100595 dev_warn(chip->card->dev,
596 "azx_get_response timeout, switching to polling mode: last cmd=0x%08x\n",
597 chip->last_cmd[addr]);
Takashi Iwai23c4a882009-10-30 13:21:49 +0100598 chip->polling_mode = 1;
599 goto again;
600 }
601
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200602 if (chip->msi) {
Takashi Iwai4e76a882014-02-25 12:21:03 +0100603 dev_warn(chip->card->dev,
604 "No response from codec, disabling MSI: last cmd=0x%08x\n",
605 chip->last_cmd[addr]);
Dylan Reidf46ea602014-02-28 15:41:16 -0800606 if (chip->ops->disable_msi_reset_irq &&
607 chip->ops->disable_msi_reset_irq(chip) < 0) {
Takashi Iwaib6132912009-03-24 07:36:09 +0100608 bus->rirb_error = 1;
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200609 return -1;
Takashi Iwaib6132912009-03-24 07:36:09 +0100610 }
Takashi Iwai68e7fff2006-10-23 13:40:59 +0200611 goto again;
612 }
613
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +0100614 if (chip->probing) {
615 /* If this critical timeout happens during the codec probing
616 * phase, this is likely an access to a non-existing codec
617 * slot. Better to return an error and reset the system.
618 */
619 return -1;
620 }
621
Takashi Iwai8dd78332009-06-02 01:16:07 +0200622 /* a fatal communication error; need either to reset or to fallback
623 * to the single_cmd mode
624 */
Takashi Iwaib6132912009-03-24 07:36:09 +0100625 bus->rirb_error = 1;
Takashi Iwaib20f3b82009-06-02 01:20:22 +0200626 if (bus->allow_bus_reset && !bus->response_reset && !bus->in_reset) {
Takashi Iwai8dd78332009-06-02 01:16:07 +0200627 bus->response_reset = 1;
628 return -1; /* give a chance to retry */
629 }
630
Takashi Iwai4e76a882014-02-25 12:21:03 +0100631 dev_err(chip->card->dev,
632 "azx_get_response timeout, switching to single_cmd mode: last cmd=0x%08x\n",
633 chip->last_cmd[addr]);
Takashi Iwai8dd78332009-06-02 01:16:07 +0200634 chip->single_cmd = 1;
635 bus->response_reset = 0;
Takashi Iwai1a696972009-11-07 09:49:04 +0100636 /* release CORB/RIRB */
Takashi Iwai4fcd3922009-05-25 18:34:52 +0200637 azx_free_cmd_io(chip);
Takashi Iwai1a696972009-11-07 09:49:04 +0100638 /* disable unsolicited responses */
639 azx_writel(chip, GCTL, azx_readl(chip, GCTL) & ~ICH6_GCTL_UNSOL);
Takashi Iwai5c79b1f2006-09-21 13:34:13 +0200640 return -1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700641}
642
Linus Torvalds1da177e2005-04-16 15:20:36 -0700643/*
644 * Use the single immediate command instead of CORB/RIRB for simplicity
645 *
646 * Note: according to Intel, this is not preferred use. The command was
647 * intended for the BIOS only, and may get confused with unsolicited
648 * responses. So, we shouldn't use it for normal operation from the
649 * driver.
650 * I left the codes, however, for debugging/testing purposes.
651 */
652
Takashi Iwaib05a7d42009-05-28 11:59:12 +0200653/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800654static int azx_single_wait_for_response(struct azx *chip, unsigned int addr)
Takashi Iwaib05a7d42009-05-28 11:59:12 +0200655{
656 int timeout = 50;
657
658 while (timeout--) {
659 /* check IRV busy bit */
660 if (azx_readw(chip, IRS) & ICH6_IRS_VALID) {
661 /* reuse rirb.res as the response return value */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800662 chip->rirb.res[addr] = azx_readl(chip, IR);
Takashi Iwaib05a7d42009-05-28 11:59:12 +0200663 return 0;
664 }
665 udelay(1);
666 }
667 if (printk_ratelimit())
Takashi Iwai4e76a882014-02-25 12:21:03 +0100668 dev_dbg(chip->card->dev, "get_response timeout: IRS=0x%x\n",
669 azx_readw(chip, IRS));
Wu Fengguangdeadff12009-08-01 18:45:16 +0800670 chip->rirb.res[addr] = -1;
Takashi Iwaib05a7d42009-05-28 11:59:12 +0200671 return -EIO;
672}
673
Linus Torvalds1da177e2005-04-16 15:20:36 -0700674/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100675static int azx_single_send_cmd(struct hda_bus *bus, u32 val)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700676{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100677 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800678 unsigned int addr = azx_command_addr(val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700679 int timeout = 50;
680
Takashi Iwai8dd78332009-06-02 01:16:07 +0200681 bus->rirb_error = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700682 while (timeout--) {
683 /* check ICB busy bit */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200684 if (!((azx_readw(chip, IRS) & ICH6_IRS_BUSY))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700685 /* Clear IRV valid bit */
Takashi Iwaid01ce992007-07-27 16:52:19 +0200686 azx_writew(chip, IRS, azx_readw(chip, IRS) |
687 ICH6_IRS_VALID);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700688 azx_writel(chip, IC, val);
Takashi Iwaid01ce992007-07-27 16:52:19 +0200689 azx_writew(chip, IRS, azx_readw(chip, IRS) |
690 ICH6_IRS_BUSY);
Wu Fengguangdeadff12009-08-01 18:45:16 +0800691 return azx_single_wait_for_response(chip, addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700692 }
693 udelay(1);
694 }
Marc Boucher1cfd52b2008-01-22 15:29:26 +0100695 if (printk_ratelimit())
Takashi Iwai4e76a882014-02-25 12:21:03 +0100696 dev_dbg(chip->card->dev,
697 "send_cmd timeout: IRS=0x%x, val=0x%x\n",
698 azx_readw(chip, IRS), val);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700699 return -EIO;
700}
701
702/* receive a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800703static unsigned int azx_single_get_response(struct hda_bus *bus,
704 unsigned int addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700705{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100706 struct azx *chip = bus->private_data;
Wu Fengguangdeadff12009-08-01 18:45:16 +0800707 return chip->rirb.res[addr];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700708}
709
Takashi Iwai111d3af2006-02-16 18:17:58 +0100710/*
711 * The below are the main callbacks from hda_codec.
712 *
713 * They are just the skeleton to call sub-callbacks according to the
714 * current setting of chip->single_cmd.
715 */
716
717/* send a command */
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100718static int azx_send_cmd(struct hda_bus *bus, unsigned int val)
Takashi Iwai111d3af2006-02-16 18:17:58 +0100719{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100720 struct azx *chip = bus->private_data;
Takashi Iwai43bbb6c2007-07-06 20:22:05 +0200721
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200722 if (chip->disabled)
723 return 0;
Wu Fengguangfeb27342009-08-01 19:17:14 +0800724 chip->last_cmd[azx_command_addr(val)] = val;
Takashi Iwai111d3af2006-02-16 18:17:58 +0100725 if (chip->single_cmd)
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100726 return azx_single_send_cmd(bus, val);
Takashi Iwai111d3af2006-02-16 18:17:58 +0100727 else
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100728 return azx_corb_send_cmd(bus, val);
Takashi Iwai111d3af2006-02-16 18:17:58 +0100729}
730
731/* get a response */
Wu Fengguangdeadff12009-08-01 18:45:16 +0800732static unsigned int azx_get_response(struct hda_bus *bus,
733 unsigned int addr)
Takashi Iwai111d3af2006-02-16 18:17:58 +0100734{
Takashi Iwai33fa35e2008-11-06 16:50:40 +0100735 struct azx *chip = bus->private_data;
Takashi Iwaia82d51e2012-04-26 12:23:42 +0200736 if (chip->disabled)
737 return 0;
Takashi Iwai111d3af2006-02-16 18:17:58 +0100738 if (chip->single_cmd)
Wu Fengguangdeadff12009-08-01 18:45:16 +0800739 return azx_single_get_response(bus, addr);
Takashi Iwai111d3af2006-02-16 18:17:58 +0100740 else
Wu Fengguangdeadff12009-08-01 18:45:16 +0800741 return azx_rirb_get_response(bus, addr);
Takashi Iwai111d3af2006-02-16 18:17:58 +0100742}
743
Takashi Iwai83012a72012-08-24 18:38:08 +0200744#ifdef CONFIG_PM
Takashi Iwai68467f52012-08-28 09:14:29 -0700745static void azx_power_notify(struct hda_bus *bus, bool power_up);
Takashi Iwaicb53c622007-08-10 17:21:45 +0200746#endif
Takashi Iwai111d3af2006-02-16 18:17:58 +0100747
Takashi Iwai1d1a4562012-09-20 20:29:13 -0700748#ifdef CONFIG_SND_HDA_DSP_LOADER
749static int azx_load_dsp_prepare(struct hda_bus *bus, unsigned int format,
750 unsigned int byte_size,
751 struct snd_dma_buffer *bufp);
752static void azx_load_dsp_trigger(struct hda_bus *bus, bool start);
753static void azx_load_dsp_cleanup(struct hda_bus *bus,
754 struct snd_dma_buffer *dmab);
755#endif
756
Mengdong Lin3af3f352013-06-24 10:18:54 -0400757/* enter link reset */
Mengdong Lin7295b262013-06-25 05:58:49 -0400758static void azx_enter_link_reset(struct azx *chip)
Mengdong Lin3af3f352013-06-24 10:18:54 -0400759{
760 unsigned long timeout;
761
762 /* reset controller */
763 azx_writel(chip, GCTL, azx_readl(chip, GCTL) & ~ICH6_GCTL_RESET);
764
765 timeout = jiffies + msecs_to_jiffies(100);
766 while ((azx_readb(chip, GCTL) & ICH6_GCTL_RESET) &&
767 time_before(jiffies, timeout))
768 usleep_range(500, 1000);
769}
770
Mengdong Lin7295b262013-06-25 05:58:49 -0400771/* exit link reset */
772static void azx_exit_link_reset(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700773{
Mengdong Linfa348da2012-12-12 09:16:15 -0500774 unsigned long timeout;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700775
Mengdong Lin7295b262013-06-25 05:58:49 -0400776 azx_writeb(chip, GCTL, azx_readb(chip, GCTL) | ICH6_GCTL_RESET);
777
778 timeout = jiffies + msecs_to_jiffies(100);
779 while (!azx_readb(chip, GCTL) &&
780 time_before(jiffies, timeout))
781 usleep_range(500, 1000);
782}
783
784/* reset codec link */
785static int azx_reset(struct azx *chip, int full_reset)
786{
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +0100787 if (!full_reset)
788 goto __skip;
789
Danny Tholene8a7f132007-09-11 21:41:56 +0200790 /* clear STATESTS */
Wang Xingchaoda7db6a2013-07-22 03:19:18 -0400791 azx_writew(chip, STATESTS, STATESTS_INT_MASK);
Danny Tholene8a7f132007-09-11 21:41:56 +0200792
Linus Torvalds1da177e2005-04-16 15:20:36 -0700793 /* reset controller */
Mengdong Lin7295b262013-06-25 05:58:49 -0400794 azx_enter_link_reset(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700795
796 /* delay for >= 100us for codec PLL to settle per spec
797 * Rev 0.9 section 5.5.1
798 */
Mengdong Linfa348da2012-12-12 09:16:15 -0500799 usleep_range(500, 1000);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700800
801 /* Bring controller out of reset */
Mengdong Lin7295b262013-06-25 05:58:49 -0400802 azx_exit_link_reset(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700803
Pavel Machek927fc862006-08-31 17:03:43 +0200804 /* Brent Chartrand said to wait >= 540us for codecs to initialize */
Mengdong Linfa348da2012-12-12 09:16:15 -0500805 usleep_range(1000, 1200);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700806
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +0100807 __skip:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700808 /* check to see if controller is ready */
Pavel Machek927fc862006-08-31 17:03:43 +0200809 if (!azx_readb(chip, GCTL)) {
Takashi Iwai4e76a882014-02-25 12:21:03 +0100810 dev_dbg(chip->card->dev, "azx_reset: controller not ready!\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700811 return -EBUSY;
812 }
813
Matt41e2fce2005-07-04 17:49:55 +0200814 /* Accept unsolicited responses */
Takashi Iwai1a696972009-11-07 09:49:04 +0100815 if (!chip->single_cmd)
816 azx_writel(chip, GCTL, azx_readl(chip, GCTL) |
817 ICH6_GCTL_UNSOL);
Matt41e2fce2005-07-04 17:49:55 +0200818
Linus Torvalds1da177e2005-04-16 15:20:36 -0700819 /* detect codecs */
Pavel Machek927fc862006-08-31 17:03:43 +0200820 if (!chip->codec_mask) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700821 chip->codec_mask = azx_readw(chip, STATESTS);
Takashi Iwai4e76a882014-02-25 12:21:03 +0100822 dev_dbg(chip->card->dev, "codec_mask = 0x%x\n",
823 chip->codec_mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700824 }
825
826 return 0;
827}
828
829
830/*
831 * Lowlevel interface
832 */
833
834/* enable interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100835static void azx_int_enable(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700836{
837 /* enable controller CIE and GIE */
838 azx_writel(chip, INTCTL, azx_readl(chip, INTCTL) |
839 ICH6_INT_CTRL_EN | ICH6_INT_GLOBAL_EN);
840}
841
842/* disable interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100843static void azx_int_disable(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700844{
845 int i;
846
847 /* disable interrupts in stream descriptor */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200848 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100849 struct azx_dev *azx_dev = &chip->azx_dev[i];
Dylan Reid40830812014-02-28 15:41:13 -0800850 azx_sd_writeb(chip, azx_dev, SD_CTL,
851 azx_sd_readb(chip, azx_dev, SD_CTL) &
852 ~SD_INT_MASK);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700853 }
854
855 /* disable SIE for all streams */
856 azx_writeb(chip, INTCTL, 0);
857
858 /* disable controller CIE and GIE */
859 azx_writel(chip, INTCTL, azx_readl(chip, INTCTL) &
860 ~(ICH6_INT_CTRL_EN | ICH6_INT_GLOBAL_EN));
861}
862
863/* clear interrupts */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100864static void azx_int_clear(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700865{
866 int i;
867
868 /* clear stream status */
Takashi Iwai07e4ca52005-08-24 14:14:57 +0200869 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100870 struct azx_dev *azx_dev = &chip->azx_dev[i];
Dylan Reid40830812014-02-28 15:41:13 -0800871 azx_sd_writeb(chip, azx_dev, SD_STS, SD_INT_MASK);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700872 }
873
874 /* clear STATESTS */
Wang Xingchaoda7db6a2013-07-22 03:19:18 -0400875 azx_writew(chip, STATESTS, STATESTS_INT_MASK);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700876
877 /* clear rirb status */
878 azx_writeb(chip, RIRBSTS, RIRB_INT_MASK);
879
880 /* clear int status */
881 azx_writel(chip, INTSTS, ICH6_INT_CTRL_EN | ICH6_INT_ALL_STREAM);
882}
883
884/* start a stream */
Takashi Iwaia98f90f2005-11-17 14:59:02 +0100885static void azx_stream_start(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700886{
Joseph Chan0e153472008-08-26 14:38:03 +0200887 /*
888 * Before stream start, initialize parameter
889 */
890 azx_dev->insufficient = 1;
891
Linus Torvalds1da177e2005-04-16 15:20:36 -0700892 /* enable SIE */
Wei Niccc5df02010-01-26 15:59:33 +0800893 azx_writel(chip, INTCTL,
894 azx_readl(chip, INTCTL) | (1 << azx_dev->index));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700895 /* set DMA start and interrupt mask */
Dylan Reid40830812014-02-28 15:41:13 -0800896 azx_sd_writeb(chip, azx_dev, SD_CTL,
897 azx_sd_readb(chip, azx_dev, SD_CTL) |
Linus Torvalds1da177e2005-04-16 15:20:36 -0700898 SD_CTL_DMA_START | SD_INT_MASK);
899}
900
Takashi Iwai1dddab42009-03-18 15:15:37 +0100901/* stop DMA */
902static void azx_stream_clear(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700903{
Dylan Reid40830812014-02-28 15:41:13 -0800904 azx_sd_writeb(chip, azx_dev, SD_CTL,
905 azx_sd_readb(chip, azx_dev, SD_CTL) &
Linus Torvalds1da177e2005-04-16 15:20:36 -0700906 ~(SD_CTL_DMA_START | SD_INT_MASK));
Dylan Reid40830812014-02-28 15:41:13 -0800907 azx_sd_writeb(chip, azx_dev, SD_STS, SD_INT_MASK); /* to be sure */
Takashi Iwai1dddab42009-03-18 15:15:37 +0100908}
909
910/* stop a stream */
911static void azx_stream_stop(struct azx *chip, struct azx_dev *azx_dev)
912{
913 azx_stream_clear(chip, azx_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700914 /* disable SIE */
Wei Niccc5df02010-01-26 15:59:33 +0800915 azx_writel(chip, INTCTL,
916 azx_readl(chip, INTCTL) & ~(1 << azx_dev->index));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700917}
918
919
920/*
Takashi Iwaicb53c622007-08-10 17:21:45 +0200921 * reset and start the controller registers
Linus Torvalds1da177e2005-04-16 15:20:36 -0700922 */
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +0100923static void azx_init_chip(struct azx *chip, int full_reset)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700924{
Takashi Iwaicb53c622007-08-10 17:21:45 +0200925 if (chip->initialized)
926 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700927
928 /* reset controller */
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +0100929 azx_reset(chip, full_reset);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700930
931 /* initialize interrupts */
932 azx_int_clear(chip);
933 azx_int_enable(chip);
934
935 /* initialize the codec command I/O */
Takashi Iwai1a696972009-11-07 09:49:04 +0100936 if (!chip->single_cmd)
937 azx_init_cmd_io(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700938
Takashi Iwai0be3b5d2005-09-05 17:11:40 +0200939 /* program the position buffer */
940 azx_writel(chip, DPLBASE, (u32)chip->posbuf.addr);
Takashi Iwai766979e2008-06-13 20:53:56 +0200941 azx_writel(chip, DPUBASE, upper_32_bits(chip->posbuf.addr));
Frederick Lif5d40b32005-05-12 14:55:20 +0200942
Takashi Iwaicb53c622007-08-10 17:21:45 +0200943 chip->initialized = 1;
944}
945
946/*
947 * initialize the PCI registers
948 */
949/* update bits in a PCI register byte */
950static void update_pci_byte(struct pci_dev *pci, unsigned int reg,
951 unsigned char mask, unsigned char val)
952{
953 unsigned char data;
954
955 pci_read_config_byte(pci, reg, &data);
956 data &= ~mask;
957 data |= (val & mask);
958 pci_write_config_byte(pci, reg, data);
959}
960
961static void azx_init_pci(struct azx *chip)
962{
963 /* Clear bits 0-2 of PCI register TCSEL (at offset 0x44)
964 * TCSEL == Traffic Class Select Register, which sets PCI express QOS
965 * Ensuring these bits are 0 clears playback static on some HD Audio
Adam Lackorzynskia09e89f2011-03-10 17:41:56 +0100966 * codecs.
967 * The PCI register TCSEL is defined in the Intel manuals.
Takashi Iwaicb53c622007-08-10 17:21:45 +0200968 */
Linus Torvalds46f2cc82011-05-27 19:45:28 -0700969 if (!(chip->driver_caps & AZX_DCAPS_NO_TCSEL)) {
Takashi Iwai4e76a882014-02-25 12:21:03 +0100970 dev_dbg(chip->card->dev, "Clearing TCSEL\n");
Adam Lackorzynskia09e89f2011-03-10 17:41:56 +0100971 update_pci_byte(chip->pci, ICH6_PCIREG_TCSEL, 0x07, 0);
Takashi Iwai9477c582011-05-25 09:11:37 +0200972 }
Takashi Iwaicb53c622007-08-10 17:21:45 +0200973
Takashi Iwai9477c582011-05-25 09:11:37 +0200974 /* For ATI SB450/600/700/800/900 and AMD Hudson azalia HD audio,
975 * we need to enable snoop.
976 */
977 if (chip->driver_caps & AZX_DCAPS_ATI_SNOOP) {
Takashi Iwai4e76a882014-02-25 12:21:03 +0100978 dev_dbg(chip->card->dev, "Setting ATI snoop: %d\n",
979 azx_snoop(chip));
Takashi Iwaicb53c622007-08-10 17:21:45 +0200980 update_pci_byte(chip->pci,
Takashi Iwai27fe48d92011-09-28 17:16:09 +0200981 ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR, 0x07,
982 azx_snoop(chip) ? ATI_SB450_HDAUDIO_ENABLE_SNOOP : 0);
Takashi Iwai9477c582011-05-25 09:11:37 +0200983 }
984
985 /* For NVIDIA HDA, enable snoop */
986 if (chip->driver_caps & AZX_DCAPS_NVIDIA_SNOOP) {
Takashi Iwai4e76a882014-02-25 12:21:03 +0100987 dev_dbg(chip->card->dev, "Setting Nvidia snoop: %d\n",
988 azx_snoop(chip));
Takashi Iwaicb53c622007-08-10 17:21:45 +0200989 update_pci_byte(chip->pci,
990 NVIDIA_HDA_TRANSREG_ADDR,
991 0x0f, NVIDIA_HDA_ENABLE_COHBITS);
Peer Chen320dcc32008-08-20 16:43:24 -0700992 update_pci_byte(chip->pci,
993 NVIDIA_HDA_ISTRM_COH,
994 0x01, NVIDIA_HDA_ENABLE_COHBIT);
995 update_pci_byte(chip->pci,
996 NVIDIA_HDA_OSTRM_COH,
997 0x01, NVIDIA_HDA_ENABLE_COHBIT);
Takashi Iwai9477c582011-05-25 09:11:37 +0200998 }
999
1000 /* Enable SCH/PCH snoop if needed */
1001 if (chip->driver_caps & AZX_DCAPS_SCH_SNOOP) {
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001002 unsigned short snoop;
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001003 pci_read_config_word(chip->pci, INTEL_SCH_HDA_DEVC, &snoop);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001004 if ((!azx_snoop(chip) && !(snoop & INTEL_SCH_HDA_DEVC_NOSNOOP)) ||
1005 (azx_snoop(chip) && (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP))) {
1006 snoop &= ~INTEL_SCH_HDA_DEVC_NOSNOOP;
1007 if (!azx_snoop(chip))
1008 snoop |= INTEL_SCH_HDA_DEVC_NOSNOOP;
1009 pci_write_config_word(chip->pci, INTEL_SCH_HDA_DEVC, snoop);
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001010 pci_read_config_word(chip->pci,
1011 INTEL_SCH_HDA_DEVC, &snoop);
Takashi Iwai90a5ad52008-02-22 18:36:22 +01001012 }
Takashi Iwai4e76a882014-02-25 12:21:03 +01001013 dev_dbg(chip->card->dev, "SCH snoop: %s\n",
1014 (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP) ?
1015 "Disabled" : "Enabled");
Vinod Gda3fca22005-09-13 18:49:12 +02001016 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001017}
1018
1019
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001020static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev);
1021
Linus Torvalds1da177e2005-04-16 15:20:36 -07001022/*
1023 * interrupt handler
1024 */
David Howells7d12e782006-10-05 14:55:46 +01001025static irqreturn_t azx_interrupt(int irq, void *dev_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001026{
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001027 struct azx *chip = dev_id;
1028 struct azx_dev *azx_dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001029 u32 status;
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001030 u8 sd_status;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001031 int i, ok;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001032
Mengdong Linb8dfc4622012-08-23 17:32:30 +08001033#ifdef CONFIG_PM_RUNTIME
Dave Airlie246efa42013-07-29 15:19:29 +10001034 if (chip->driver_caps & AZX_DCAPS_PM_RUNTIME)
Dylan Reid89287562014-02-28 15:41:15 -08001035 if (chip->card->dev->power.runtime_status != RPM_ACTIVE)
Dave Airlie246efa42013-07-29 15:19:29 +10001036 return IRQ_NONE;
Mengdong Linb8dfc4622012-08-23 17:32:30 +08001037#endif
1038
Linus Torvalds1da177e2005-04-16 15:20:36 -07001039 spin_lock(&chip->reg_lock);
1040
Dan Carpenter60911062012-05-18 10:36:11 +03001041 if (chip->disabled) {
1042 spin_unlock(&chip->reg_lock);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001043 return IRQ_NONE;
Dan Carpenter60911062012-05-18 10:36:11 +03001044 }
Takashi Iwaia82d51e2012-04-26 12:23:42 +02001045
Linus Torvalds1da177e2005-04-16 15:20:36 -07001046 status = azx_readl(chip, INTSTS);
Dave Airlie246efa42013-07-29 15:19:29 +10001047 if (status == 0 || status == 0xffffffff) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001048 spin_unlock(&chip->reg_lock);
1049 return IRQ_NONE;
1050 }
1051
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001052 for (i = 0; i < chip->num_streams; i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001053 azx_dev = &chip->azx_dev[i];
1054 if (status & azx_dev->sd_int_sta_mask) {
Dylan Reid40830812014-02-28 15:41:13 -08001055 sd_status = azx_sd_readb(chip, azx_dev, SD_STS);
1056 azx_sd_writeb(chip, azx_dev, SD_STS, SD_INT_MASK);
Clemens Ladisch9ef04062010-05-25 09:03:40 +02001057 if (!azx_dev->substream || !azx_dev->running ||
1058 !(sd_status & SD_INT_COMPLETE))
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001059 continue;
1060 /* check whether this IRQ is really acceptable */
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001061 ok = azx_position_ok(chip, azx_dev);
1062 if (ok == 1) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001063 azx_dev->irq_pending = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001064 spin_unlock(&chip->reg_lock);
1065 snd_pcm_period_elapsed(azx_dev->substream);
1066 spin_lock(&chip->reg_lock);
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001067 } else if (ok == 0 && chip->bus && chip->bus->workq) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02001068 /* bogus IRQ, process it later */
1069 azx_dev->irq_pending = 1;
Takashi Iwai6acaed32009-01-12 10:09:24 +01001070 queue_work(chip->bus->workq,
1071 &chip->irq_pending_work);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001072 }
1073 }
1074 }
1075
1076 /* clear rirb int */
1077 status = azx_readb(chip, RIRBSTS);
1078 if (status & RIRB_INT_MASK) {
Takashi Iwai14d34f12010-10-21 09:03:25 +02001079 if (status & RIRB_INT_RESPONSE) {
Takashi Iwai9477c582011-05-25 09:11:37 +02001080 if (chip->driver_caps & AZX_DCAPS_RIRB_PRE_DELAY)
Takashi Iwai14d34f12010-10-21 09:03:25 +02001081 udelay(80);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001082 azx_update_rirb(chip);
Takashi Iwai14d34f12010-10-21 09:03:25 +02001083 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001084 azx_writeb(chip, RIRBSTS, RIRB_INT_MASK);
1085 }
1086
Linus Torvalds1da177e2005-04-16 15:20:36 -07001087 spin_unlock(&chip->reg_lock);
1088
1089 return IRQ_HANDLED;
1090}
1091
1092
1093/*
Takashi Iwai675f25d2008-06-10 17:53:20 +02001094 * set up a BDL entry
1095 */
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001096static int setup_bdle(struct azx *chip,
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001097 struct snd_dma_buffer *dmab,
Takashi Iwai675f25d2008-06-10 17:53:20 +02001098 struct azx_dev *azx_dev, u32 **bdlp,
1099 int ofs, int size, int with_ioc)
1100{
Takashi Iwai675f25d2008-06-10 17:53:20 +02001101 u32 *bdl = *bdlp;
1102
1103 while (size > 0) {
1104 dma_addr_t addr;
1105 int chunk;
1106
1107 if (azx_dev->frags >= AZX_MAX_BDL_ENTRIES)
1108 return -EINVAL;
1109
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001110 addr = snd_sgbuf_get_addr(dmab, ofs);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001111 /* program the address field of the BDL entry */
1112 bdl[0] = cpu_to_le32((u32)addr);
Takashi Iwai766979e2008-06-13 20:53:56 +02001113 bdl[1] = cpu_to_le32(upper_32_bits(addr));
Takashi Iwai675f25d2008-06-10 17:53:20 +02001114 /* program the size field of the BDL entry */
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001115 chunk = snd_sgbuf_get_chunk_size(dmab, ofs, size);
Takashi Iwai5ae763b2012-05-08 10:34:08 +02001116 /* one BDLE cannot cross 4K boundary on CTHDA chips */
1117 if (chip->driver_caps & AZX_DCAPS_4K_BDLE_BOUNDARY) {
1118 u32 remain = 0x1000 - (ofs & 0xfff);
1119 if (chunk > remain)
1120 chunk = remain;
1121 }
Takashi Iwai675f25d2008-06-10 17:53:20 +02001122 bdl[2] = cpu_to_le32(chunk);
1123 /* program the IOC to enable interrupt
1124 * only when the whole fragment is processed
1125 */
1126 size -= chunk;
1127 bdl[3] = (size || !with_ioc) ? 0 : cpu_to_le32(0x01);
1128 bdl += 4;
1129 azx_dev->frags++;
1130 ofs += chunk;
1131 }
1132 *bdlp = bdl;
1133 return ofs;
1134}
1135
1136/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001137 * set up BDL entries
1138 */
Takashi Iwai555e2192008-06-10 17:53:34 +02001139static int azx_setup_periods(struct azx *chip,
1140 struct snd_pcm_substream *substream,
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001141 struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001142{
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001143 u32 *bdl;
1144 int i, ofs, periods, period_bytes;
Dylan Reid9cdc0112014-02-28 15:41:14 -08001145 int pos_adj = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001146
1147 /* reset BDL address */
Dylan Reid40830812014-02-28 15:41:13 -08001148 azx_sd_writel(chip, azx_dev, SD_BDLPL, 0);
1149 azx_sd_writel(chip, azx_dev, SD_BDLPU, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001150
Takashi Iwai97b71c92009-03-18 15:09:13 +01001151 period_bytes = azx_dev->period_bytes;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001152 periods = azx_dev->bufsize / period_bytes;
1153
Linus Torvalds1da177e2005-04-16 15:20:36 -07001154 /* program the initial BDL entries */
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001155 bdl = (u32 *)azx_dev->bdl.area;
1156 ofs = 0;
1157 azx_dev->frags = 0;
Dylan Reid9cdc0112014-02-28 15:41:14 -08001158
1159 if (chip->bdl_pos_adj)
1160 pos_adj = chip->bdl_pos_adj[chip->dev_index];
Takashi Iwai915bf292012-09-11 15:19:10 +02001161 if (!azx_dev->no_period_wakeup && pos_adj > 0) {
Takashi Iwai675f25d2008-06-10 17:53:20 +02001162 struct snd_pcm_runtime *runtime = substream->runtime;
Takashi Iwaie785d3d2008-07-15 16:28:43 +02001163 int pos_align = pos_adj;
Takashi Iwai555e2192008-06-10 17:53:34 +02001164 pos_adj = (pos_adj * runtime->rate + 47999) / 48000;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001165 if (!pos_adj)
Takashi Iwaie785d3d2008-07-15 16:28:43 +02001166 pos_adj = pos_align;
1167 else
1168 pos_adj = ((pos_adj + pos_align - 1) / pos_align) *
1169 pos_align;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001170 pos_adj = frames_to_bytes(runtime, pos_adj);
1171 if (pos_adj >= period_bytes) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001172 dev_warn(chip->card->dev,"Too big adjustment %d\n",
Dylan Reid9cdc0112014-02-28 15:41:14 -08001173 pos_adj);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001174 pos_adj = 0;
1175 } else {
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001176 ofs = setup_bdle(chip, snd_pcm_get_dma_buf(substream),
1177 azx_dev,
Takashi Iwai915bf292012-09-11 15:19:10 +02001178 &bdl, ofs, pos_adj, true);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001179 if (ofs < 0)
1180 goto error;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001181 }
Takashi Iwai555e2192008-06-10 17:53:34 +02001182 } else
1183 pos_adj = 0;
Dylan Reid9cdc0112014-02-28 15:41:14 -08001184
Takashi Iwai675f25d2008-06-10 17:53:20 +02001185 for (i = 0; i < periods; i++) {
1186 if (i == periods - 1 && pos_adj)
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001187 ofs = setup_bdle(chip, snd_pcm_get_dma_buf(substream),
1188 azx_dev, &bdl, ofs,
Takashi Iwai675f25d2008-06-10 17:53:20 +02001189 period_bytes - pos_adj, 0);
1190 else
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001191 ofs = setup_bdle(chip, snd_pcm_get_dma_buf(substream),
1192 azx_dev, &bdl, ofs,
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001193 period_bytes,
Takashi Iwai915bf292012-09-11 15:19:10 +02001194 !azx_dev->no_period_wakeup);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001195 if (ofs < 0)
1196 goto error;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001197 }
Takashi Iwai4ce107b2008-02-06 14:50:19 +01001198 return 0;
Takashi Iwai675f25d2008-06-10 17:53:20 +02001199
1200 error:
Takashi Iwai4e76a882014-02-25 12:21:03 +01001201 dev_err(chip->card->dev, "Too many BDL entries: buffer=%d, period=%d\n",
1202 azx_dev->bufsize, period_bytes);
Takashi Iwai675f25d2008-06-10 17:53:20 +02001203 return -EINVAL;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001204}
1205
Takashi Iwai1dddab42009-03-18 15:15:37 +01001206/* reset stream */
1207static void azx_stream_reset(struct azx *chip, struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001208{
1209 unsigned char val;
1210 int timeout;
1211
Takashi Iwai1dddab42009-03-18 15:15:37 +01001212 azx_stream_clear(chip, azx_dev);
1213
Dylan Reid40830812014-02-28 15:41:13 -08001214 azx_sd_writeb(chip, azx_dev, SD_CTL,
1215 azx_sd_readb(chip, azx_dev, SD_CTL) |
Takashi Iwaid01ce992007-07-27 16:52:19 +02001216 SD_CTL_STREAM_RESET);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001217 udelay(3);
1218 timeout = 300;
Dylan Reid40830812014-02-28 15:41:13 -08001219 while (!((val = azx_sd_readb(chip, azx_dev, SD_CTL)) &
1220 SD_CTL_STREAM_RESET) && --timeout)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001221 ;
1222 val &= ~SD_CTL_STREAM_RESET;
Dylan Reid40830812014-02-28 15:41:13 -08001223 azx_sd_writeb(chip, azx_dev, SD_CTL, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001224 udelay(3);
1225
1226 timeout = 300;
1227 /* waiting for hardware to report that the stream is out of reset */
Dylan Reid40830812014-02-28 15:41:13 -08001228 while (((val = azx_sd_readb(chip, azx_dev, SD_CTL)) &
1229 SD_CTL_STREAM_RESET) && --timeout)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001230 ;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001231
1232 /* reset first position - may not be synced with hw at this time */
1233 *azx_dev->posbuf = 0;
Takashi Iwai1dddab42009-03-18 15:15:37 +01001234}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001235
Takashi Iwai1dddab42009-03-18 15:15:37 +01001236/*
1237 * set up the SD for streaming
1238 */
1239static int azx_setup_controller(struct azx *chip, struct azx_dev *azx_dev)
1240{
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001241 unsigned int val;
Takashi Iwai1dddab42009-03-18 15:15:37 +01001242 /* make sure the run bit is zero for SD */
1243 azx_stream_clear(chip, azx_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001244 /* program the stream_tag */
Dylan Reid40830812014-02-28 15:41:13 -08001245 val = azx_sd_readl(chip, azx_dev, SD_CTL);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001246 val = (val & ~SD_CTL_STREAM_TAG_MASK) |
1247 (azx_dev->stream_tag << SD_CTL_STREAM_TAG_SHIFT);
1248 if (!azx_snoop(chip))
1249 val |= SD_CTL_TRAFFIC_PRIO;
Dylan Reid40830812014-02-28 15:41:13 -08001250 azx_sd_writel(chip, azx_dev, SD_CTL, val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001251
1252 /* program the length of samples in cyclic buffer */
Dylan Reid40830812014-02-28 15:41:13 -08001253 azx_sd_writel(chip, azx_dev, SD_CBL, azx_dev->bufsize);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001254
1255 /* program the stream format */
1256 /* this value needs to be the same as the one programmed */
Dylan Reid40830812014-02-28 15:41:13 -08001257 azx_sd_writew(chip, azx_dev, SD_FORMAT, azx_dev->format_val);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001258
1259 /* program the stream LVI (last valid index) of the BDL */
Dylan Reid40830812014-02-28 15:41:13 -08001260 azx_sd_writew(chip, azx_dev, SD_LVI, azx_dev->frags - 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001261
1262 /* program the BDL address */
1263 /* lower BDL address */
Dylan Reid40830812014-02-28 15:41:13 -08001264 azx_sd_writel(chip, azx_dev, SD_BDLPL, (u32)azx_dev->bdl.addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001265 /* upper BDL address */
Dylan Reid40830812014-02-28 15:41:13 -08001266 azx_sd_writel(chip, azx_dev, SD_BDLPU,
1267 upper_32_bits(azx_dev->bdl.addr));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001268
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02001269 /* enable the position buffer */
David Henningsson4cb36312010-09-30 10:12:50 +02001270 if (chip->position_fix[0] != POS_FIX_LPIB ||
1271 chip->position_fix[1] != POS_FIX_LPIB) {
Takashi Iwaiee9d6b92008-03-14 15:52:20 +01001272 if (!(azx_readl(chip, DPLBASE) & ICH6_DPLBASE_ENABLE))
1273 azx_writel(chip, DPLBASE,
1274 (u32)chip->posbuf.addr | ICH6_DPLBASE_ENABLE);
1275 }
Takashi Iwaic74db862005-05-12 14:26:27 +02001276
Linus Torvalds1da177e2005-04-16 15:20:36 -07001277 /* set the interrupt enable bits in the descriptor control register */
Dylan Reid40830812014-02-28 15:41:13 -08001278 azx_sd_writel(chip, azx_dev, SD_CTL,
1279 azx_sd_readl(chip, azx_dev, SD_CTL) | SD_INT_MASK);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001280
1281 return 0;
1282}
1283
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001284/*
1285 * Probe the given codec address
1286 */
1287static int probe_codec(struct azx *chip, int addr)
1288{
1289 unsigned int cmd = (addr << 28) | (AC_NODE_ROOT << 20) |
1290 (AC_VERB_PARAMETERS << 8) | AC_PAR_VENDOR_ID;
1291 unsigned int res;
1292
Wu Fengguanga678cde2009-08-01 18:46:46 +08001293 mutex_lock(&chip->bus->cmd_mutex);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001294 chip->probing = 1;
1295 azx_send_cmd(chip->bus, cmd);
Wu Fengguangdeadff12009-08-01 18:45:16 +08001296 res = azx_get_response(chip->bus, addr);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001297 chip->probing = 0;
Wu Fengguanga678cde2009-08-01 18:46:46 +08001298 mutex_unlock(&chip->bus->cmd_mutex);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001299 if (res == -1)
1300 return -EIO;
Takashi Iwai4e76a882014-02-25 12:21:03 +01001301 dev_dbg(chip->card->dev, "codec #%d probed OK\n", addr);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001302 return 0;
1303}
1304
Takashi Iwai33fa35e2008-11-06 16:50:40 +01001305static int azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec,
1306 struct hda_pcm *cpcm);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001307static void azx_stop_chip(struct azx *chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001308
Takashi Iwai8dd78332009-06-02 01:16:07 +02001309static void azx_bus_reset(struct hda_bus *bus)
1310{
1311 struct azx *chip = bus->private_data;
Takashi Iwai8dd78332009-06-02 01:16:07 +02001312
1313 bus->in_reset = 1;
1314 azx_stop_chip(chip);
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001315 azx_init_chip(chip, 1);
Alexander Beregalov65f75982009-06-04 13:46:16 +04001316#ifdef CONFIG_PM
Takashi Iwai8dd78332009-06-02 01:16:07 +02001317 if (chip->initialized) {
Takashi Iwai01b65bf2011-11-24 14:31:46 +01001318 struct azx_pcm *p;
1319 list_for_each_entry(p, &chip->pcm_list, list)
1320 snd_pcm_suspend_all(p->pcm);
Takashi Iwai8dd78332009-06-02 01:16:07 +02001321 snd_hda_suspend(chip->bus);
1322 snd_hda_resume(chip->bus);
1323 }
Alexander Beregalov65f75982009-06-04 13:46:16 +04001324#endif
Takashi Iwai8dd78332009-06-02 01:16:07 +02001325 bus->in_reset = 0;
1326}
1327
David Henningsson26a6cb62012-10-09 15:04:21 +02001328static int get_jackpoll_interval(struct azx *chip)
1329{
Dylan Reid749ee282014-02-28 15:41:18 -08001330 int i;
David Henningsson26a6cb62012-10-09 15:04:21 +02001331 unsigned int j;
Dylan Reid749ee282014-02-28 15:41:18 -08001332
1333 if (!chip->jackpoll_ms)
1334 return 0;
1335
1336 i = chip->jackpoll_ms[chip->dev_index];
David Henningsson26a6cb62012-10-09 15:04:21 +02001337 if (i == 0)
1338 return 0;
1339 if (i < 50 || i > 60000)
1340 j = 0;
1341 else
1342 j = msecs_to_jiffies(i);
1343 if (j == 0)
Takashi Iwai4e76a882014-02-25 12:21:03 +01001344 dev_warn(chip->card->dev,
1345 "jackpoll_ms value out of range: %d\n", i);
David Henningsson26a6cb62012-10-09 15:04:21 +02001346 return j;
1347}
1348
Linus Torvalds1da177e2005-04-16 15:20:36 -07001349/*
1350 * Codec initialization
1351 */
1352
Dylan Reide62a42a2014-02-28 15:41:19 -08001353static int azx_codec_create(struct azx *chip, const char *model,
1354 unsigned int max_slots,
1355 int *power_save_to)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001356{
1357 struct hda_bus_template bus_temp;
Takashi Iwai34c25352008-10-28 11:38:58 +01001358 int c, codecs, err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001359
1360 memset(&bus_temp, 0, sizeof(bus_temp));
1361 bus_temp.private_data = chip;
1362 bus_temp.modelname = model;
1363 bus_temp.pci = chip->pci;
Takashi Iwai111d3af2006-02-16 18:17:58 +01001364 bus_temp.ops.command = azx_send_cmd;
1365 bus_temp.ops.get_response = azx_get_response;
Takashi Iwai176d5332008-07-30 15:01:44 +02001366 bus_temp.ops.attach_pcm = azx_attach_pcm_stream;
Takashi Iwai8dd78332009-06-02 01:16:07 +02001367 bus_temp.ops.bus_reset = azx_bus_reset;
Takashi Iwai83012a72012-08-24 18:38:08 +02001368#ifdef CONFIG_PM
Dylan Reide62a42a2014-02-28 15:41:19 -08001369 bus_temp.power_save = power_save_to;
Takashi Iwaicb53c622007-08-10 17:21:45 +02001370 bus_temp.ops.pm_notify = azx_power_notify;
1371#endif
Takashi Iwai1d1a4562012-09-20 20:29:13 -07001372#ifdef CONFIG_SND_HDA_DSP_LOADER
1373 bus_temp.ops.load_dsp_prepare = azx_load_dsp_prepare;
1374 bus_temp.ops.load_dsp_trigger = azx_load_dsp_trigger;
1375 bus_temp.ops.load_dsp_cleanup = azx_load_dsp_cleanup;
1376#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07001377
Takashi Iwaid01ce992007-07-27 16:52:19 +02001378 err = snd_hda_bus_new(chip->card, &bus_temp, &chip->bus);
1379 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001380 return err;
1381
Takashi Iwai9477c582011-05-25 09:11:37 +02001382 if (chip->driver_caps & AZX_DCAPS_RIRB_DELAY) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001383 dev_dbg(chip->card->dev, "Enable delay in RIRB handling\n");
Wei Nidc9c8e22008-09-26 13:55:56 +08001384 chip->bus->needs_damn_long_delay = 1;
Takashi Iwai9477c582011-05-25 09:11:37 +02001385 }
Wei Nidc9c8e22008-09-26 13:55:56 +08001386
Takashi Iwai34c25352008-10-28 11:38:58 +01001387 codecs = 0;
Takashi Iwai2f5983f2008-09-03 16:00:44 +02001388 if (!max_slots)
Wei Ni7445dfc2010-03-03 15:05:53 +08001389 max_slots = AZX_DEFAULT_CODECS;
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001390
1391 /* First try to probe all given codec slots */
1392 for (c = 0; c < max_slots; c++) {
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01001393 if ((chip->codec_mask & (1 << c)) & chip->codec_probe_mask) {
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001394 if (probe_codec(chip, c) < 0) {
1395 /* Some BIOSen give you wrong codec addresses
1396 * that don't exist
1397 */
Takashi Iwai4e76a882014-02-25 12:21:03 +01001398 dev_warn(chip->card->dev,
1399 "Codec #%d probe error; disabling it...\n", c);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001400 chip->codec_mask &= ~(1 << c);
1401 /* More badly, accessing to a non-existing
1402 * codec often screws up the controller chip,
Paul Menzel24481582010-02-08 20:37:26 +01001403 * and disturbs the further communications.
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001404 * Thus if an error occurs during probing,
1405 * better to reset the controller chip to
1406 * get back to the sanity state.
1407 */
1408 azx_stop_chip(chip);
Jaroslav Kyselacd508fe2010-03-26 10:28:46 +01001409 azx_init_chip(chip, 1);
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001410 }
1411 }
1412 }
1413
Takashi Iwaid507cd62011-04-26 15:25:02 +02001414 /* AMD chipsets often cause the communication stalls upon certain
1415 * sequence like the pin-detection. It seems that forcing the synced
1416 * access works around the stall. Grrr...
1417 */
Takashi Iwai9477c582011-05-25 09:11:37 +02001418 if (chip->driver_caps & AZX_DCAPS_SYNC_WRITE) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001419 dev_dbg(chip->card->dev, "Enable sync_write for stable communication\n");
Takashi Iwaid507cd62011-04-26 15:25:02 +02001420 chip->bus->sync_write = 1;
1421 chip->bus->allow_bus_reset = 1;
1422 }
1423
Takashi Iwai6ce4a3b2008-11-06 17:11:10 +01001424 /* Then create codec instances */
Takashi Iwai34c25352008-10-28 11:38:58 +01001425 for (c = 0; c < max_slots; c++) {
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01001426 if ((chip->codec_mask & (1 << c)) & chip->codec_probe_mask) {
Takashi Iwaibccad142007-04-24 12:23:53 +02001427 struct hda_codec *codec;
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001428 err = snd_hda_codec_new(chip->bus, c, &codec);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001429 if (err < 0)
1430 continue;
David Henningsson26a6cb62012-10-09 15:04:21 +02001431 codec->jackpoll_interval = get_jackpoll_interval(chip);
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +01001432 codec->beep_mode = chip->beep_mode;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001433 codecs++;
Takashi Iwai19a982b2007-03-21 15:14:35 +01001434 }
1435 }
1436 if (!codecs) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001437 dev_err(chip->card->dev, "no codecs initialized\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001438 return -ENXIO;
1439 }
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001440 return 0;
1441}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001442
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001443/* configure each codec instance */
Bill Pembertone23e7a12012-12-06 12:35:10 -05001444static int azx_codec_configure(struct azx *chip)
Takashi Iwaia1e21c92009-06-17 09:33:52 +02001445{
1446 struct hda_codec *codec;
1447 list_for_each_entry(codec, &chip->bus->codec_list, list) {
1448 snd_hda_codec_configure(codec);
1449 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001450 return 0;
1451}
1452
1453
1454/*
1455 * PCM support
1456 */
1457
1458/* assign a stream for the PCM */
Wu Fengguangef18bed2009-12-25 13:14:27 +08001459static inline struct azx_dev *
1460azx_assign_device(struct azx *chip, struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001461{
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001462 int dev, i, nums;
Wu Fengguangef18bed2009-12-25 13:14:27 +08001463 struct azx_dev *res = NULL;
Takashi Iwaid5cf9912011-10-06 10:07:58 +02001464 /* make a non-zero unique key for the substream */
1465 int key = (substream->pcm->device << 16) | (substream->number << 2) |
1466 (substream->stream + 1);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001467
1468 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
Takashi Iwai07e4ca52005-08-24 14:14:57 +02001469 dev = chip->playback_index_offset;
1470 nums = chip->playback_streams;
1471 } else {
1472 dev = chip->capture_index_offset;
1473 nums = chip->capture_streams;
1474 }
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001475 for (i = 0; i < nums; i++, dev++) {
1476 struct azx_dev *azx_dev = &chip->azx_dev[dev];
1477 dsp_lock(azx_dev);
1478 if (!azx_dev->opened && !dsp_is_locked(azx_dev)) {
1479 res = azx_dev;
1480 if (res->assigned_key == key) {
1481 res->opened = 1;
1482 res->assigned_key = key;
1483 dsp_unlock(azx_dev);
1484 return azx_dev;
1485 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001486 }
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001487 dsp_unlock(azx_dev);
1488 }
Wu Fengguangef18bed2009-12-25 13:14:27 +08001489 if (res) {
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001490 dsp_lock(res);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001491 res->opened = 1;
Takashi Iwaid5cf9912011-10-06 10:07:58 +02001492 res->assigned_key = key;
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001493 dsp_unlock(res);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001494 }
1495 return res;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001496}
1497
1498/* release the assigned stream */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001499static inline void azx_release_device(struct azx_dev *azx_dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001500{
1501 azx_dev->opened = 0;
1502}
1503
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001504static cycle_t azx_cc_read(const struct cyclecounter *cc)
1505{
1506 struct azx_dev *azx_dev = container_of(cc, struct azx_dev, azx_cc);
1507 struct snd_pcm_substream *substream = azx_dev->substream;
1508 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1509 struct azx *chip = apcm->chip;
1510
1511 return azx_readl(chip, WALLCLK);
1512}
1513
1514static void azx_timecounter_init(struct snd_pcm_substream *substream,
1515 bool force, cycle_t last)
1516{
1517 struct azx_dev *azx_dev = get_azx_dev(substream);
1518 struct timecounter *tc = &azx_dev->azx_tc;
1519 struct cyclecounter *cc = &azx_dev->azx_cc;
1520 u64 nsec;
1521
1522 cc->read = azx_cc_read;
1523 cc->mask = CLOCKSOURCE_MASK(32);
1524
1525 /*
1526 * Converting from 24 MHz to ns means applying a 125/3 factor.
1527 * To avoid any saturation issues in intermediate operations,
1528 * the 125 factor is applied first. The division is applied
1529 * last after reading the timecounter value.
1530 * Applying the 1/3 factor as part of the multiplication
1531 * requires at least 20 bits for a decent precision, however
1532 * overflows occur after about 4 hours or less, not a option.
1533 */
1534
1535 cc->mult = 125; /* saturation after 195 years */
1536 cc->shift = 0;
1537
1538 nsec = 0; /* audio time is elapsed time since trigger */
1539 timecounter_init(tc, cc, nsec);
1540 if (force)
1541 /*
1542 * force timecounter to use predefined value,
1543 * used for synchronized starts
1544 */
1545 tc->cycle_last = last;
1546}
1547
Dylan Reidae03bbb2013-04-15 11:57:05 -07001548static u64 azx_adjust_codec_delay(struct snd_pcm_substream *substream,
Dylan Reid78daea22013-04-08 18:20:30 -07001549 u64 nsec)
1550{
1551 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1552 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
1553 u64 codec_frames, codec_nsecs;
1554
1555 if (!hinfo->ops.get_delay)
1556 return nsec;
1557
1558 codec_frames = hinfo->ops.get_delay(hinfo, apcm->codec, substream);
1559 codec_nsecs = div_u64(codec_frames * 1000000000LL,
1560 substream->runtime->rate);
1561
Dylan Reidae03bbb2013-04-15 11:57:05 -07001562 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
1563 return nsec + codec_nsecs;
1564
Dylan Reid78daea22013-04-08 18:20:30 -07001565 return (nsec > codec_nsecs) ? nsec - codec_nsecs : 0;
1566}
1567
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001568static int azx_get_wallclock_tstamp(struct snd_pcm_substream *substream,
1569 struct timespec *ts)
1570{
1571 struct azx_dev *azx_dev = get_azx_dev(substream);
1572 u64 nsec;
1573
1574 nsec = timecounter_read(&azx_dev->azx_tc);
1575 nsec = div_u64(nsec, 3); /* can be optimized */
Dylan Reidae03bbb2013-04-15 11:57:05 -07001576 nsec = azx_adjust_codec_delay(substream, nsec);
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001577
1578 *ts = ns_to_timespec(nsec);
1579
1580 return 0;
1581}
1582
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001583static struct snd_pcm_hardware azx_pcm_hw = {
Takashi Iwaid01ce992007-07-27 16:52:19 +02001584 .info = (SNDRV_PCM_INFO_MMAP |
1585 SNDRV_PCM_INFO_INTERLEAVED |
Linus Torvalds1da177e2005-04-16 15:20:36 -07001586 SNDRV_PCM_INFO_BLOCK_TRANSFER |
1587 SNDRV_PCM_INFO_MMAP_VALID |
Pavel Machek927fc862006-08-31 17:03:43 +02001588 /* No full-resume yet implemented */
1589 /* SNDRV_PCM_INFO_RESUME |*/
Takashi Iwai850f0e52008-03-18 17:11:05 +01001590 SNDRV_PCM_INFO_PAUSE |
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001591 SNDRV_PCM_INFO_SYNC_START |
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001592 SNDRV_PCM_INFO_HAS_WALL_CLOCK |
Clemens Ladisch7bb8fb72010-11-15 10:49:47 +01001593 SNDRV_PCM_INFO_NO_PERIOD_WAKEUP),
Linus Torvalds1da177e2005-04-16 15:20:36 -07001594 .formats = SNDRV_PCM_FMTBIT_S16_LE,
1595 .rates = SNDRV_PCM_RATE_48000,
1596 .rate_min = 48000,
1597 .rate_max = 48000,
1598 .channels_min = 2,
1599 .channels_max = 2,
1600 .buffer_bytes_max = AZX_MAX_BUF_SIZE,
1601 .period_bytes_min = 128,
1602 .period_bytes_max = AZX_MAX_BUF_SIZE / 2,
1603 .periods_min = 2,
1604 .periods_max = AZX_MAX_FRAG,
1605 .fifo_size = 0,
1606};
1607
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001608static int azx_pcm_open(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001609{
1610 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1611 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001612 struct azx *chip = apcm->chip;
1613 struct azx_dev *azx_dev;
1614 struct snd_pcm_runtime *runtime = substream->runtime;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001615 unsigned long flags;
1616 int err;
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001617 int buff_step;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001618
Ingo Molnar62932df2006-01-16 16:34:20 +01001619 mutex_lock(&chip->open_mutex);
Wu Fengguangef18bed2009-12-25 13:14:27 +08001620 azx_dev = azx_assign_device(chip, substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001621 if (azx_dev == NULL) {
Ingo Molnar62932df2006-01-16 16:34:20 +01001622 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001623 return -EBUSY;
1624 }
1625 runtime->hw = azx_pcm_hw;
1626 runtime->hw.channels_min = hinfo->channels_min;
1627 runtime->hw.channels_max = hinfo->channels_max;
1628 runtime->hw.formats = hinfo->formats;
1629 runtime->hw.rates = hinfo->rates;
1630 snd_pcm_limit_hw_rates(runtime);
1631 snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001632
1633 /* avoid wrap-around with wall-clock */
1634 snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_TIME,
1635 20,
1636 178000000);
1637
Takashi Iwai52409aa2012-01-23 17:10:24 +01001638 if (chip->align_buffer_size)
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001639 /* constrain buffer sizes to be multiple of 128
1640 bytes. This is more efficient in terms of memory
1641 access but isn't required by the HDA spec and
1642 prevents users from specifying exact period/buffer
1643 sizes. For example for 44.1kHz, a period size set
1644 to 20ms will be rounded to 19.59ms. */
1645 buff_step = 128;
1646 else
1647 /* Don't enforce steps on buffer sizes, still need to
1648 be multiple of 4 bytes (HDA spec). Tested on Intel
1649 HDA controllers, may not work on all devices where
1650 option needs to be disabled */
1651 buff_step = 4;
1652
Joachim Deguara5f1545b2007-03-16 15:01:36 +01001653 snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001654 buff_step);
Joachim Deguara5f1545b2007-03-16 15:01:36 +01001655 snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05001656 buff_step);
Dylan Reidb4a91cf2012-06-15 19:36:23 -07001657 snd_hda_power_up_d3wait(apcm->codec);
Takashi Iwaid01ce992007-07-27 16:52:19 +02001658 err = hinfo->ops.open(hinfo, apcm->codec, substream);
1659 if (err < 0) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001660 azx_release_device(azx_dev);
Takashi Iwaicb53c622007-08-10 17:21:45 +02001661 snd_hda_power_down(apcm->codec);
Ingo Molnar62932df2006-01-16 16:34:20 +01001662 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001663 return err;
1664 }
Takashi Iwai70d321e2009-07-03 23:06:45 +02001665 snd_pcm_limit_hw_rates(runtime);
Takashi Iwaiaba66532009-07-05 11:44:46 +02001666 /* sanity check */
1667 if (snd_BUG_ON(!runtime->hw.channels_min) ||
1668 snd_BUG_ON(!runtime->hw.channels_max) ||
1669 snd_BUG_ON(!runtime->hw.formats) ||
1670 snd_BUG_ON(!runtime->hw.rates)) {
1671 azx_release_device(azx_dev);
1672 hinfo->ops.close(hinfo, apcm->codec, substream);
1673 snd_hda_power_down(apcm->codec);
1674 mutex_unlock(&chip->open_mutex);
1675 return -EINVAL;
1676 }
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001677
1678 /* disable WALLCLOCK timestamps for capture streams
1679 until we figure out how to handle digital inputs */
1680 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
1681 runtime->hw.info &= ~SNDRV_PCM_INFO_HAS_WALL_CLOCK;
1682
Linus Torvalds1da177e2005-04-16 15:20:36 -07001683 spin_lock_irqsave(&chip->reg_lock, flags);
1684 azx_dev->substream = substream;
1685 azx_dev->running = 0;
1686 spin_unlock_irqrestore(&chip->reg_lock, flags);
1687
1688 runtime->private_data = azx_dev;
Takashi Iwai850f0e52008-03-18 17:11:05 +01001689 snd_pcm_set_sync(substream);
Ingo Molnar62932df2006-01-16 16:34:20 +01001690 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001691 return 0;
1692}
1693
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001694static int azx_pcm_close(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001695{
1696 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1697 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001698 struct azx *chip = apcm->chip;
1699 struct azx_dev *azx_dev = get_azx_dev(substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001700 unsigned long flags;
1701
Ingo Molnar62932df2006-01-16 16:34:20 +01001702 mutex_lock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001703 spin_lock_irqsave(&chip->reg_lock, flags);
1704 azx_dev->substream = NULL;
1705 azx_dev->running = 0;
1706 spin_unlock_irqrestore(&chip->reg_lock, flags);
1707 azx_release_device(azx_dev);
1708 hinfo->ops.close(hinfo, apcm->codec, substream);
Takashi Iwaicb53c622007-08-10 17:21:45 +02001709 snd_hda_power_down(apcm->codec);
Ingo Molnar62932df2006-01-16 16:34:20 +01001710 mutex_unlock(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001711 return 0;
1712}
1713
Takashi Iwaid01ce992007-07-27 16:52:19 +02001714static int azx_pcm_hw_params(struct snd_pcm_substream *substream,
1715 struct snd_pcm_hw_params *hw_params)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001716{
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001717 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
1718 struct azx *chip = apcm->chip;
Takashi Iwai97b71c92009-03-18 15:09:13 +01001719 struct azx_dev *azx_dev = get_azx_dev(substream);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001720 int ret;
Takashi Iwai97b71c92009-03-18 15:09:13 +01001721
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001722 dsp_lock(azx_dev);
1723 if (dsp_is_locked(azx_dev)) {
1724 ret = -EBUSY;
1725 goto unlock;
1726 }
1727
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +01001728 mark_runtime_wc(chip, azx_dev, substream, false);
Takashi Iwai97b71c92009-03-18 15:09:13 +01001729 azx_dev->bufsize = 0;
1730 azx_dev->period_bytes = 0;
1731 azx_dev->format_val = 0;
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001732 ret = snd_pcm_lib_malloc_pages(substream,
Takashi Iwaid01ce992007-07-27 16:52:19 +02001733 params_buffer_bytes(hw_params));
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001734 if (ret < 0)
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001735 goto unlock;
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +01001736 mark_runtime_wc(chip, azx_dev, substream, true);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001737 unlock:
1738 dsp_unlock(azx_dev);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001739 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001740}
1741
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001742static int azx_pcm_hw_free(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001743{
1744 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001745 struct azx_dev *azx_dev = get_azx_dev(substream);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02001746 struct azx *chip = apcm->chip;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001747 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
1748
1749 /* reset BDL address */
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001750 dsp_lock(azx_dev);
1751 if (!dsp_is_locked(azx_dev)) {
Dylan Reid40830812014-02-28 15:41:13 -08001752 azx_sd_writel(chip, azx_dev, SD_BDLPL, 0);
1753 azx_sd_writel(chip, azx_dev, SD_BDLPU, 0);
1754 azx_sd_writel(chip, azx_dev, SD_CTL, 0);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001755 azx_dev->bufsize = 0;
1756 azx_dev->period_bytes = 0;
1757 azx_dev->format_val = 0;
1758 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001759
Takashi Iwaieb541332010-08-06 13:48:11 +02001760 snd_hda_codec_cleanup(apcm->codec, hinfo, substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001761
Takashi Iwai9ddf1ae2013-01-29 18:07:22 +01001762 mark_runtime_wc(chip, azx_dev, substream, false);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001763 azx_dev->prepared = 0;
1764 dsp_unlock(azx_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001765 return snd_pcm_lib_free_pages(substream);
1766}
1767
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001768static int azx_pcm_prepare(struct snd_pcm_substream *substream)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001769{
1770 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001771 struct azx *chip = apcm->chip;
1772 struct azx_dev *azx_dev = get_azx_dev(substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001773 struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001774 struct snd_pcm_runtime *runtime = substream->runtime;
Takashi Iwai62b7e5e2010-10-22 17:15:47 +02001775 unsigned int bufsize, period_bytes, format_val, stream_tag;
Takashi Iwai97b71c92009-03-18 15:09:13 +01001776 int err;
Stephen Warren7c9359762011-06-01 11:14:17 -06001777 struct hda_spdif_out *spdif =
1778 snd_hda_spdif_out_of_nid(apcm->codec, hinfo->nid);
1779 unsigned short ctls = spdif ? spdif->ctls : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001780
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001781 dsp_lock(azx_dev);
1782 if (dsp_is_locked(azx_dev)) {
1783 err = -EBUSY;
1784 goto unlock;
1785 }
1786
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001787 azx_stream_reset(chip, azx_dev);
Takashi Iwai97b71c92009-03-18 15:09:13 +01001788 format_val = snd_hda_calc_stream_format(runtime->rate,
1789 runtime->channels,
1790 runtime->format,
Anssi Hannula32c168c2010-08-03 13:28:57 +03001791 hinfo->maxbps,
Stephen Warren7c9359762011-06-01 11:14:17 -06001792 ctls);
Takashi Iwai97b71c92009-03-18 15:09:13 +01001793 if (!format_val) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01001794 dev_err(chip->card->dev,
1795 "invalid format_val, rate=%d, ch=%d, format=%d\n",
1796 runtime->rate, runtime->channels, runtime->format);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001797 err = -EINVAL;
1798 goto unlock;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001799 }
1800
Takashi Iwai97b71c92009-03-18 15:09:13 +01001801 bufsize = snd_pcm_lib_buffer_bytes(substream);
1802 period_bytes = snd_pcm_lib_period_bytes(substream);
1803
Takashi Iwai4e76a882014-02-25 12:21:03 +01001804 dev_dbg(chip->card->dev, "azx_pcm_prepare: bufsize=0x%x, format=0x%x\n",
1805 bufsize, format_val);
Takashi Iwai97b71c92009-03-18 15:09:13 +01001806
1807 if (bufsize != azx_dev->bufsize ||
1808 period_bytes != azx_dev->period_bytes ||
Takashi Iwai915bf292012-09-11 15:19:10 +02001809 format_val != azx_dev->format_val ||
1810 runtime->no_period_wakeup != azx_dev->no_period_wakeup) {
Takashi Iwai97b71c92009-03-18 15:09:13 +01001811 azx_dev->bufsize = bufsize;
1812 azx_dev->period_bytes = period_bytes;
1813 azx_dev->format_val = format_val;
Takashi Iwai915bf292012-09-11 15:19:10 +02001814 azx_dev->no_period_wakeup = runtime->no_period_wakeup;
Takashi Iwai97b71c92009-03-18 15:09:13 +01001815 err = azx_setup_periods(chip, substream, azx_dev);
1816 if (err < 0)
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001817 goto unlock;
Takashi Iwai97b71c92009-03-18 15:09:13 +01001818 }
1819
Takashi Iwaie8648e52013-12-06 17:15:01 +01001820 /* when LPIB delay correction gives a small negative value,
1821 * we ignore it; currently set the threshold statically to
1822 * 64 frames
1823 */
1824 if (runtime->period_size > 64)
1825 azx_dev->delay_negative_threshold = -frames_to_bytes(runtime, 64);
1826 else
1827 azx_dev->delay_negative_threshold = 0;
1828
Jaroslav Kyselae5463722010-05-11 10:21:46 +02001829 /* wallclk has 24Mhz clock source */
1830 azx_dev->period_wallclk = (((runtime->period_size * 24000) /
1831 runtime->rate) * 1000);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001832 azx_setup_controller(chip, azx_dev);
1833 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
Dylan Reid40830812014-02-28 15:41:13 -08001834 azx_dev->fifo_size =
1835 azx_sd_readw(chip, azx_dev, SD_FIFOSIZE) + 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001836 else
1837 azx_dev->fifo_size = 0;
1838
Takashi Iwai62b7e5e2010-10-22 17:15:47 +02001839 stream_tag = azx_dev->stream_tag;
1840 /* CA-IBG chips need the playback stream starting from 1 */
Takashi Iwai9477c582011-05-25 09:11:37 +02001841 if ((chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND) &&
Takashi Iwai62b7e5e2010-10-22 17:15:47 +02001842 stream_tag > chip->capture_streams)
1843 stream_tag -= chip->capture_streams;
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001844 err = snd_hda_codec_prepare(apcm->codec, hinfo, stream_tag,
Takashi Iwaieb541332010-08-06 13:48:11 +02001845 azx_dev->format_val, substream);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001846
1847 unlock:
1848 if (!err)
1849 azx_dev->prepared = 1;
1850 dsp_unlock(azx_dev);
1851 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001852}
1853
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001854static int azx_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001855{
1856 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwaia98f90f2005-11-17 14:59:02 +01001857 struct azx *chip = apcm->chip;
Takashi Iwai850f0e52008-03-18 17:11:05 +01001858 struct azx_dev *azx_dev;
1859 struct snd_pcm_substream *s;
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001860 int rstart = 0, start, nsync = 0, sbits = 0;
Takashi Iwai850f0e52008-03-18 17:11:05 +01001861 int nwait, timeout;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001862
Takashi Iwai1a8506d2012-10-16 15:10:08 +02001863 azx_dev = get_azx_dev(substream);
1864 trace_azx_pcm_trigger(chip, azx_dev, cmd);
1865
Takashi Iwaieb49faa2013-03-15 09:19:11 +01001866 if (dsp_is_locked(azx_dev) || !azx_dev->prepared)
1867 return -EPIPE;
1868
Linus Torvalds1da177e2005-04-16 15:20:36 -07001869 switch (cmd) {
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02001870 case SNDRV_PCM_TRIGGER_START:
1871 rstart = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001872 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
1873 case SNDRV_PCM_TRIGGER_RESUME:
Takashi Iwai850f0e52008-03-18 17:11:05 +01001874 start = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001875 break;
1876 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
Jaroslav Kysela47123192005-08-15 20:53:07 +02001877 case SNDRV_PCM_TRIGGER_SUSPEND:
Linus Torvalds1da177e2005-04-16 15:20:36 -07001878 case SNDRV_PCM_TRIGGER_STOP:
Takashi Iwai850f0e52008-03-18 17:11:05 +01001879 start = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001880 break;
1881 default:
Takashi Iwai850f0e52008-03-18 17:11:05 +01001882 return -EINVAL;
1883 }
1884
1885 snd_pcm_group_for_each_entry(s, substream) {
1886 if (s->pcm->card != substream->pcm->card)
1887 continue;
1888 azx_dev = get_azx_dev(s);
1889 sbits |= 1 << azx_dev->index;
1890 nsync++;
1891 snd_pcm_trigger_done(s, substream);
1892 }
1893
1894 spin_lock(&chip->reg_lock);
Pierre-Louis Bossart172d3b22012-09-21 18:39:05 -05001895
1896 /* first, set SYNC bits of corresponding streams */
1897 if (chip->driver_caps & AZX_DCAPS_OLD_SSYNC)
1898 azx_writel(chip, OLD_SSYNC,
1899 azx_readl(chip, OLD_SSYNC) | sbits);
1900 else
1901 azx_writel(chip, SSYNC, azx_readl(chip, SSYNC) | sbits);
1902
Takashi Iwai850f0e52008-03-18 17:11:05 +01001903 snd_pcm_group_for_each_entry(s, substream) {
1904 if (s->pcm->card != substream->pcm->card)
1905 continue;
1906 azx_dev = get_azx_dev(s);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02001907 if (start) {
1908 azx_dev->start_wallclk = azx_readl(chip, WALLCLK);
1909 if (!rstart)
1910 azx_dev->start_wallclk -=
1911 azx_dev->period_wallclk;
Takashi Iwai850f0e52008-03-18 17:11:05 +01001912 azx_stream_start(chip, azx_dev);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02001913 } else {
Takashi Iwai850f0e52008-03-18 17:11:05 +01001914 azx_stream_stop(chip, azx_dev);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02001915 }
Takashi Iwai850f0e52008-03-18 17:11:05 +01001916 azx_dev->running = start;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001917 }
1918 spin_unlock(&chip->reg_lock);
Takashi Iwai850f0e52008-03-18 17:11:05 +01001919 if (start) {
Takashi Iwai850f0e52008-03-18 17:11:05 +01001920 /* wait until all FIFOs get ready */
1921 for (timeout = 5000; timeout; timeout--) {
1922 nwait = 0;
1923 snd_pcm_group_for_each_entry(s, substream) {
1924 if (s->pcm->card != substream->pcm->card)
1925 continue;
1926 azx_dev = get_azx_dev(s);
Dylan Reid40830812014-02-28 15:41:13 -08001927 if (!(azx_sd_readb(chip, azx_dev, SD_STS) &
Takashi Iwai850f0e52008-03-18 17:11:05 +01001928 SD_STS_FIFO_READY))
1929 nwait++;
1930 }
1931 if (!nwait)
1932 break;
1933 cpu_relax();
1934 }
1935 } else {
1936 /* wait until all RUN bits are cleared */
1937 for (timeout = 5000; timeout; timeout--) {
1938 nwait = 0;
1939 snd_pcm_group_for_each_entry(s, substream) {
1940 if (s->pcm->card != substream->pcm->card)
1941 continue;
1942 azx_dev = get_azx_dev(s);
Dylan Reid40830812014-02-28 15:41:13 -08001943 if (azx_sd_readb(chip, azx_dev, SD_CTL) &
Takashi Iwai850f0e52008-03-18 17:11:05 +01001944 SD_CTL_DMA_START)
1945 nwait++;
1946 }
1947 if (!nwait)
1948 break;
1949 cpu_relax();
1950 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001951 }
Pierre-Louis Bossart172d3b22012-09-21 18:39:05 -05001952 spin_lock(&chip->reg_lock);
1953 /* reset SYNC bits */
1954 if (chip->driver_caps & AZX_DCAPS_OLD_SSYNC)
1955 azx_writel(chip, OLD_SSYNC,
1956 azx_readl(chip, OLD_SSYNC) & ~sbits);
1957 else
1958 azx_writel(chip, SSYNC, azx_readl(chip, SSYNC) & ~sbits);
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05001959 if (start) {
1960 azx_timecounter_init(substream, 0, 0);
1961 if (nsync > 1) {
1962 cycle_t cycle_last;
1963
1964 /* same start cycle for master and group */
1965 azx_dev = get_azx_dev(substream);
1966 cycle_last = azx_dev->azx_tc.cycle_last;
1967
1968 snd_pcm_group_for_each_entry(s, substream) {
1969 if (s->pcm->card != substream->pcm->card)
1970 continue;
1971 azx_timecounter_init(s, 1, cycle_last);
1972 }
1973 }
1974 }
Pierre-Louis Bossart172d3b22012-09-21 18:39:05 -05001975 spin_unlock(&chip->reg_lock);
Takashi Iwai850f0e52008-03-18 17:11:05 +01001976 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001977}
1978
Joseph Chan0e153472008-08-26 14:38:03 +02001979/* get the current DMA position with correction on VIA chips */
1980static unsigned int azx_via_get_position(struct azx *chip,
1981 struct azx_dev *azx_dev)
1982{
1983 unsigned int link_pos, mini_pos, bound_pos;
1984 unsigned int mod_link_pos, mod_dma_pos, mod_mini_pos;
1985 unsigned int fifo_size;
1986
Dylan Reid40830812014-02-28 15:41:13 -08001987 link_pos = azx_sd_readl(chip, azx_dev, SD_LPIB);
Takashi Iwaib4a655e2011-06-07 12:26:56 +02001988 if (azx_dev->substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
Joseph Chan0e153472008-08-26 14:38:03 +02001989 /* Playback, no problem using link position */
1990 return link_pos;
1991 }
1992
1993 /* Capture */
1994 /* For new chipset,
1995 * use mod to get the DMA position just like old chipset
1996 */
1997 mod_dma_pos = le32_to_cpu(*azx_dev->posbuf);
1998 mod_dma_pos %= azx_dev->period_bytes;
1999
2000 /* azx_dev->fifo_size can't get FIFO size of in stream.
2001 * Get from base address + offset.
2002 */
2003 fifo_size = readw(chip->remap_addr + VIA_IN_STREAM0_FIFO_SIZE_OFFSET);
2004
2005 if (azx_dev->insufficient) {
2006 /* Link position never gather than FIFO size */
2007 if (link_pos <= fifo_size)
2008 return 0;
2009
2010 azx_dev->insufficient = 0;
2011 }
2012
2013 if (link_pos <= fifo_size)
2014 mini_pos = azx_dev->bufsize + link_pos - fifo_size;
2015 else
2016 mini_pos = link_pos - fifo_size;
2017
2018 /* Find nearest previous boudary */
2019 mod_mini_pos = mini_pos % azx_dev->period_bytes;
2020 mod_link_pos = link_pos % azx_dev->period_bytes;
2021 if (mod_link_pos >= fifo_size)
2022 bound_pos = link_pos - mod_link_pos;
2023 else if (mod_dma_pos >= mod_mini_pos)
2024 bound_pos = mini_pos - mod_mini_pos;
2025 else {
2026 bound_pos = mini_pos - mod_mini_pos + azx_dev->period_bytes;
2027 if (bound_pos >= azx_dev->bufsize)
2028 bound_pos = 0;
2029 }
2030
2031 /* Calculate real DMA position we want */
2032 return bound_pos + mod_dma_pos;
2033}
2034
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002035static unsigned int azx_get_position(struct azx *chip,
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002036 struct azx_dev *azx_dev,
2037 bool with_check)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002038{
Takashi Iwai21229612013-04-05 07:27:45 +02002039 struct snd_pcm_substream *substream = azx_dev->substream;
2040 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002041 unsigned int pos;
Takashi Iwai21229612013-04-05 07:27:45 +02002042 int stream = substream->stream;
2043 struct hda_pcm_stream *hinfo = apcm->hinfo[stream];
Takashi Iwai1a8506d2012-10-16 15:10:08 +02002044 int delay = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002045
David Henningsson4cb36312010-09-30 10:12:50 +02002046 switch (chip->position_fix[stream]) {
2047 case POS_FIX_LPIB:
2048 /* read LPIB */
Dylan Reid40830812014-02-28 15:41:13 -08002049 pos = azx_sd_readl(chip, azx_dev, SD_LPIB);
David Henningsson4cb36312010-09-30 10:12:50 +02002050 break;
2051 case POS_FIX_VIACOMBO:
Joseph Chan0e153472008-08-26 14:38:03 +02002052 pos = azx_via_get_position(chip, azx_dev);
David Henningsson4cb36312010-09-30 10:12:50 +02002053 break;
2054 default:
2055 /* use the position buffer */
2056 pos = le32_to_cpu(*azx_dev->posbuf);
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002057 if (with_check && chip->position_fix[stream] == POS_FIX_AUTO) {
Takashi Iwaia8103642011-06-07 12:23:23 +02002058 if (!pos || pos == (u32)-1) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002059 dev_info(chip->card->dev,
2060 "Invalid position buffer, using LPIB read method instead.\n");
Takashi Iwaia8103642011-06-07 12:23:23 +02002061 chip->position_fix[stream] = POS_FIX_LPIB;
Dylan Reid40830812014-02-28 15:41:13 -08002062 pos = azx_sd_readl(chip, azx_dev, SD_LPIB);
Takashi Iwaia8103642011-06-07 12:23:23 +02002063 } else
2064 chip->position_fix[stream] = POS_FIX_POSBUF;
2065 }
2066 break;
Takashi Iwaic74db862005-05-12 14:26:27 +02002067 }
David Henningsson4cb36312010-09-30 10:12:50 +02002068
Linus Torvalds1da177e2005-04-16 15:20:36 -07002069 if (pos >= azx_dev->bufsize)
2070 pos = 0;
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002071
2072 /* calculate runtime delay from LPIB */
Takashi Iwai21229612013-04-05 07:27:45 +02002073 if (substream->runtime &&
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002074 chip->position_fix[stream] == POS_FIX_POSBUF &&
2075 (chip->driver_caps & AZX_DCAPS_COUNT_LPIB_DELAY)) {
Dylan Reid40830812014-02-28 15:41:13 -08002076 unsigned int lpib_pos = azx_sd_readl(chip, azx_dev, SD_LPIB);
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002077 if (stream == SNDRV_PCM_STREAM_PLAYBACK)
2078 delay = pos - lpib_pos;
2079 else
2080 delay = lpib_pos - pos;
Takashi Iwaie8648e52013-12-06 17:15:01 +01002081 if (delay < 0) {
2082 if (delay >= azx_dev->delay_negative_threshold)
2083 delay = 0;
2084 else
2085 delay += azx_dev->bufsize;
2086 }
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002087 if (delay >= azx_dev->period_bytes) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002088 dev_info(chip->card->dev,
2089 "Unstable LPIB (%d >= %d); disabling LPIB delay counting\n",
2090 delay, azx_dev->period_bytes);
Takashi Iwai1f046612012-10-16 16:52:26 +02002091 delay = 0;
2092 chip->driver_caps &= ~AZX_DCAPS_COUNT_LPIB_DELAY;
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002093 }
Takashi Iwai21229612013-04-05 07:27:45 +02002094 delay = bytes_to_frames(substream->runtime, delay);
Pierre-Louis Bossart90accc52012-09-21 18:39:06 -05002095 }
Takashi Iwai21229612013-04-05 07:27:45 +02002096
2097 if (substream->runtime) {
2098 if (hinfo->ops.get_delay)
2099 delay += hinfo->ops.get_delay(hinfo, apcm->codec,
2100 substream);
2101 substream->runtime->delay = delay;
2102 }
2103
Takashi Iwai1a8506d2012-10-16 15:10:08 +02002104 trace_azx_get_position(chip, azx_dev, pos, delay);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002105 return pos;
2106}
2107
2108static snd_pcm_uframes_t azx_pcm_pointer(struct snd_pcm_substream *substream)
2109{
2110 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2111 struct azx *chip = apcm->chip;
2112 struct azx_dev *azx_dev = get_azx_dev(substream);
2113 return bytes_to_frames(substream->runtime,
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002114 azx_get_position(chip, azx_dev, false));
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002115}
2116
2117/*
2118 * Check whether the current DMA position is acceptable for updating
2119 * periods. Returns non-zero if it's OK.
2120 *
2121 * Many HD-audio controllers appear pretty inaccurate about
2122 * the update-IRQ timing. The IRQ is issued before actually the
2123 * data is processed. So, we need to process it afterwords in a
2124 * workqueue.
2125 */
2126static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev)
2127{
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002128 u32 wallclk;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002129 unsigned int pos;
2130
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002131 wallclk = azx_readl(chip, WALLCLK) - azx_dev->start_wallclk;
2132 if (wallclk < (azx_dev->period_wallclk * 2) / 3)
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002133 return -1; /* bogus (too early) interrupt */
Jaroslav Kyselafa00e042009-04-10 12:20:45 +02002134
Takashi Iwai798cb7e2011-09-30 08:52:26 +02002135 pos = azx_get_position(chip, azx_dev, true);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002136
Takashi Iwaid6d8bf52010-02-12 18:17:06 +01002137 if (WARN_ONCE(!azx_dev->period_bytes,
2138 "hda-intel: zero azx_dev->period_bytes"))
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002139 return -1; /* this shouldn't happen! */
Jaroslav Kyselaedb39932010-06-02 13:29:17 +02002140 if (wallclk < (azx_dev->period_wallclk * 5) / 4 &&
Jaroslav Kyselaf48f6062010-05-11 12:10:47 +02002141 pos % azx_dev->period_bytes > azx_dev->period_bytes / 2)
2142 /* NG - it's below the first next period boundary */
Dylan Reid9cdc0112014-02-28 15:41:14 -08002143 return chip->bdl_pos_adj[chip->dev_index] ? 0 : -1;
Jaroslav Kyselaedb39932010-06-02 13:29:17 +02002144 azx_dev->start_wallclk += wallclk;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002145 return 1; /* OK, it's fine */
2146}
2147
2148/*
2149 * The work for pending PCM period updates.
2150 */
2151static void azx_irq_pending_work(struct work_struct *work)
2152{
2153 struct azx *chip = container_of(work, struct azx, irq_pending_work);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002154 int i, pending, ok;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002155
Takashi Iwaia6a950a2008-06-10 17:53:35 +02002156 if (!chip->irq_pending_warned) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002157 dev_info(chip->card->dev,
2158 "IRQ timing workaround is activated for card #%d. Suggest a bigger bdl_pos_adj.\n",
2159 chip->card->number);
Takashi Iwaia6a950a2008-06-10 17:53:35 +02002160 chip->irq_pending_warned = 1;
2161 }
2162
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002163 for (;;) {
2164 pending = 0;
2165 spin_lock_irq(&chip->reg_lock);
2166 for (i = 0; i < chip->num_streams; i++) {
2167 struct azx_dev *azx_dev = &chip->azx_dev[i];
2168 if (!azx_dev->irq_pending ||
2169 !azx_dev->substream ||
2170 !azx_dev->running)
2171 continue;
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002172 ok = azx_position_ok(chip, azx_dev);
2173 if (ok > 0) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002174 azx_dev->irq_pending = 0;
2175 spin_unlock(&chip->reg_lock);
2176 snd_pcm_period_elapsed(azx_dev->substream);
2177 spin_lock(&chip->reg_lock);
Jaroslav Kyselae5463722010-05-11 10:21:46 +02002178 } else if (ok < 0) {
2179 pending = 0; /* too early */
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002180 } else
2181 pending++;
2182 }
2183 spin_unlock_irq(&chip->reg_lock);
2184 if (!pending)
2185 return;
Takashi Iwai08af4952010-08-03 14:39:04 +02002186 msleep(1);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002187 }
2188}
2189
2190/* clear irq_pending flags and assure no on-going workq */
2191static void azx_clear_irq_pending(struct azx *chip)
2192{
2193 int i;
2194
2195 spin_lock_irq(&chip->reg_lock);
2196 for (i = 0; i < chip->num_streams; i++)
2197 chip->azx_dev[i].irq_pending = 0;
2198 spin_unlock_irq(&chip->reg_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002199}
2200
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002201#ifdef CONFIG_X86
2202static int azx_pcm_mmap(struct snd_pcm_substream *substream,
2203 struct vm_area_struct *area)
2204{
2205 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
2206 struct azx *chip = apcm->chip;
2207 if (!azx_snoop(chip))
2208 area->vm_page_prot = pgprot_writecombine(area->vm_page_prot);
2209 return snd_pcm_lib_default_mmap(substream, area);
2210}
2211#else
2212#define azx_pcm_mmap NULL
2213#endif
2214
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002215static struct snd_pcm_ops azx_pcm_ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002216 .open = azx_pcm_open,
2217 .close = azx_pcm_close,
2218 .ioctl = snd_pcm_lib_ioctl,
2219 .hw_params = azx_pcm_hw_params,
2220 .hw_free = azx_pcm_hw_free,
2221 .prepare = azx_pcm_prepare,
2222 .trigger = azx_pcm_trigger,
2223 .pointer = azx_pcm_pointer,
Pierre-Louis Bossart5d890f52012-10-22 16:42:16 -05002224 .wall_clock = azx_get_wallclock_tstamp,
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002225 .mmap = azx_pcm_mmap,
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002226 .page = snd_pcm_sgbuf_ops_page,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002227};
2228
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002229static void azx_pcm_free(struct snd_pcm *pcm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002230{
Takashi Iwai176d5332008-07-30 15:01:44 +02002231 struct azx_pcm *apcm = pcm->private_data;
2232 if (apcm) {
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002233 list_del(&apcm->list);
Takashi Iwai176d5332008-07-30 15:01:44 +02002234 kfree(apcm);
2235 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002236}
2237
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002238#define MAX_PREALLOC_SIZE (32 * 1024 * 1024)
2239
Takashi Iwai176d5332008-07-30 15:01:44 +02002240static int
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002241azx_attach_pcm_stream(struct hda_bus *bus, struct hda_codec *codec,
2242 struct hda_pcm *cpcm)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002243{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002244 struct azx *chip = bus->private_data;
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002245 struct snd_pcm *pcm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002246 struct azx_pcm *apcm;
Takashi Iwai176d5332008-07-30 15:01:44 +02002247 int pcm_dev = cpcm->device;
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002248 unsigned int size;
Takashi Iwai176d5332008-07-30 15:01:44 +02002249 int s, err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002250
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002251 list_for_each_entry(apcm, &chip->pcm_list, list) {
2252 if (apcm->pcm->device == pcm_dev) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002253 dev_err(chip->card->dev, "PCM %d already exists\n",
2254 pcm_dev);
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002255 return -EBUSY;
2256 }
Takashi Iwai176d5332008-07-30 15:01:44 +02002257 }
2258 err = snd_pcm_new(chip->card, cpcm->name, pcm_dev,
2259 cpcm->stream[SNDRV_PCM_STREAM_PLAYBACK].substreams,
2260 cpcm->stream[SNDRV_PCM_STREAM_CAPTURE].substreams,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002261 &pcm);
2262 if (err < 0)
2263 return err;
Takashi Iwai18cb7102009-04-16 10:22:24 +02002264 strlcpy(pcm->name, cpcm->name, sizeof(pcm->name));
Takashi Iwai176d5332008-07-30 15:01:44 +02002265 apcm = kzalloc(sizeof(*apcm), GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002266 if (apcm == NULL)
2267 return -ENOMEM;
2268 apcm->chip = chip;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002269 apcm->pcm = pcm;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002270 apcm->codec = codec;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002271 pcm->private_data = apcm;
2272 pcm->private_free = azx_pcm_free;
Takashi Iwai176d5332008-07-30 15:01:44 +02002273 if (cpcm->pcm_type == HDA_PCM_TYPE_MODEM)
2274 pcm->dev_class = SNDRV_PCM_CLASS_MODEM;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002275 list_add_tail(&apcm->list, &chip->pcm_list);
Takashi Iwai176d5332008-07-30 15:01:44 +02002276 cpcm->pcm = pcm;
2277 for (s = 0; s < 2; s++) {
2278 apcm->hinfo[s] = &cpcm->stream[s];
2279 if (cpcm->stream[s].substreams)
2280 snd_pcm_set_ops(pcm, s, &azx_pcm_ops);
2281 }
2282 /* buffer pre-allocation */
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002283 size = CONFIG_SND_HDA_PREALLOC_SIZE * 1024;
2284 if (size > MAX_PREALLOC_SIZE)
2285 size = MAX_PREALLOC_SIZE;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002286 snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV_SG,
Dylan Reid89287562014-02-28 15:41:15 -08002287 chip->card->dev,
Takashi Iwaiacfa6342011-07-12 17:27:46 +02002288 size, MAX_PREALLOC_SIZE);
Takashi Iwai13aeaf62014-02-25 07:53:47 +01002289 /* link to codec */
2290 pcm->dev = &codec->dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002291 return 0;
2292}
2293
2294/*
2295 * mixer creation - all stuff is implemented in hda module
2296 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05002297static int azx_mixer_create(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002298{
2299 return snd_hda_build_controls(chip->bus);
2300}
2301
2302
2303/*
2304 * initialize SD streams
2305 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05002306static int azx_init_stream(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002307{
2308 int i;
2309
2310 /* initialize each stream (aka device)
Takashi Iwaid01ce992007-07-27 16:52:19 +02002311 * assign the starting bdl address to each stream (device)
2312 * and initialize
Linus Torvalds1da177e2005-04-16 15:20:36 -07002313 */
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002314 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002315 struct azx_dev *azx_dev = &chip->azx_dev[i];
Takashi Iwai929861c2006-08-31 16:55:40 +02002316 azx_dev->posbuf = (u32 __iomem *)(chip->posbuf.area + i * 8);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002317 /* offset: SDI0=0x80, SDI1=0xa0, ... SDO3=0x160 */
2318 azx_dev->sd_addr = chip->remap_addr + (0x20 * i + 0x80);
2319 /* int mask: SDI0=0x01, SDI1=0x02, ... SDO3=0x80 */
2320 azx_dev->sd_int_sta_mask = 1 << i;
2321 /* stream tag: must be non-zero and unique */
2322 azx_dev->index = i;
2323 azx_dev->stream_tag = i + 1;
2324 }
2325
2326 return 0;
2327}
2328
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002329static int azx_acquire_irq(struct azx *chip, int do_disconnect)
2330{
Takashi Iwai437a5a42006-11-21 12:14:23 +01002331 if (request_irq(chip->pci->irq, azx_interrupt,
2332 chip->msi ? 0 : IRQF_SHARED,
Takashi Iwai934c2b62011-06-10 16:36:37 +02002333 KBUILD_MODNAME, chip)) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002334 dev_err(chip->card->dev,
2335 "unable to grab IRQ %d, disabling device\n",
2336 chip->pci->irq);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002337 if (do_disconnect)
2338 snd_card_disconnect(chip->card);
2339 return -1;
2340 }
2341 chip->irq = chip->pci->irq;
Takashi Iwai69e13412006-11-21 12:10:55 +01002342 pci_intx(chip->pci, !chip->msi);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002343 return 0;
2344}
2345
Linus Torvalds1da177e2005-04-16 15:20:36 -07002346
Takashi Iwaicb53c622007-08-10 17:21:45 +02002347static void azx_stop_chip(struct azx *chip)
2348{
Takashi Iwai95e99fd2007-08-13 15:29:04 +02002349 if (!chip->initialized)
Takashi Iwaicb53c622007-08-10 17:21:45 +02002350 return;
2351
2352 /* disable interrupts */
2353 azx_int_disable(chip);
2354 azx_int_clear(chip);
2355
2356 /* disable CORB/RIRB */
2357 azx_free_cmd_io(chip);
2358
2359 /* disable position buffer */
2360 azx_writel(chip, DPLBASE, 0);
2361 azx_writel(chip, DPUBASE, 0);
2362
2363 chip->initialized = 0;
2364}
2365
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002366#ifdef CONFIG_SND_HDA_DSP_LOADER
2367/*
2368 * DSP loading code (e.g. for CA0132)
2369 */
2370
2371/* use the first stream for loading DSP */
2372static struct azx_dev *
2373azx_get_dsp_loader_dev(struct azx *chip)
2374{
2375 return &chip->azx_dev[chip->playback_index_offset];
2376}
2377
2378static int azx_load_dsp_prepare(struct hda_bus *bus, unsigned int format,
2379 unsigned int byte_size,
2380 struct snd_dma_buffer *bufp)
2381{
2382 u32 *bdl;
2383 struct azx *chip = bus->private_data;
2384 struct azx_dev *azx_dev;
2385 int err;
2386
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002387 azx_dev = azx_get_dsp_loader_dev(chip);
2388
2389 dsp_lock(azx_dev);
2390 spin_lock_irq(&chip->reg_lock);
2391 if (azx_dev->running || azx_dev->locked) {
2392 spin_unlock_irq(&chip->reg_lock);
2393 err = -EBUSY;
2394 goto unlock;
2395 }
2396 azx_dev->prepared = 0;
2397 chip->saved_azx_dev = *azx_dev;
2398 azx_dev->locked = 1;
2399 spin_unlock_irq(&chip->reg_lock);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002400
2401 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV_SG,
Dylan Reid89287562014-02-28 15:41:15 -08002402 chip->card->dev,
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002403 byte_size, bufp);
2404 if (err < 0)
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002405 goto err_alloc;
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002406
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002407 mark_pages_wc(chip, bufp, true);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002408 azx_dev->bufsize = byte_size;
2409 azx_dev->period_bytes = byte_size;
2410 azx_dev->format_val = format;
2411
2412 azx_stream_reset(chip, azx_dev);
2413
2414 /* reset BDL address */
Dylan Reid40830812014-02-28 15:41:13 -08002415 azx_sd_writel(chip, azx_dev, SD_BDLPL, 0);
2416 azx_sd_writel(chip, azx_dev, SD_BDLPU, 0);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002417
2418 azx_dev->frags = 0;
2419 bdl = (u32 *)azx_dev->bdl.area;
2420 err = setup_bdle(chip, bufp, azx_dev, &bdl, 0, byte_size, 0);
2421 if (err < 0)
2422 goto error;
2423
2424 azx_setup_controller(chip, azx_dev);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002425 dsp_unlock(azx_dev);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002426 return azx_dev->stream_tag;
2427
2428 error:
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002429 mark_pages_wc(chip, bufp, false);
2430 snd_dma_free_pages(bufp);
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002431 err_alloc:
2432 spin_lock_irq(&chip->reg_lock);
2433 if (azx_dev->opened)
2434 *azx_dev = chip->saved_azx_dev;
2435 azx_dev->locked = 0;
2436 spin_unlock_irq(&chip->reg_lock);
2437 unlock:
2438 dsp_unlock(azx_dev);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002439 return err;
2440}
2441
2442static void azx_load_dsp_trigger(struct hda_bus *bus, bool start)
2443{
2444 struct azx *chip = bus->private_data;
2445 struct azx_dev *azx_dev = azx_get_dsp_loader_dev(chip);
2446
2447 if (start)
2448 azx_stream_start(chip, azx_dev);
2449 else
2450 azx_stream_stop(chip, azx_dev);
2451 azx_dev->running = start;
2452}
2453
2454static void azx_load_dsp_cleanup(struct hda_bus *bus,
2455 struct snd_dma_buffer *dmab)
2456{
2457 struct azx *chip = bus->private_data;
2458 struct azx_dev *azx_dev = azx_get_dsp_loader_dev(chip);
2459
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002460 if (!dmab->area || !azx_dev->locked)
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002461 return;
2462
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002463 dsp_lock(azx_dev);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002464 /* reset BDL address */
Dylan Reid40830812014-02-28 15:41:13 -08002465 azx_sd_writel(chip, azx_dev, SD_BDLPL, 0);
2466 azx_sd_writel(chip, azx_dev, SD_BDLPU, 0);
2467 azx_sd_writel(chip, azx_dev, SD_CTL, 0);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002468 azx_dev->bufsize = 0;
2469 azx_dev->period_bytes = 0;
2470 azx_dev->format_val = 0;
2471
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002472 mark_pages_wc(chip, dmab, false);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002473 snd_dma_free_pages(dmab);
Takashi Iwaib3667bd2013-02-10 11:58:40 +01002474 dmab->area = NULL;
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002475
Takashi Iwaieb49faa2013-03-15 09:19:11 +01002476 spin_lock_irq(&chip->reg_lock);
2477 if (azx_dev->opened)
2478 *azx_dev = chip->saved_azx_dev;
2479 azx_dev->locked = 0;
2480 spin_unlock_irq(&chip->reg_lock);
2481 dsp_unlock(azx_dev);
Takashi Iwai1d1a4562012-09-20 20:29:13 -07002482}
2483#endif /* CONFIG_SND_HDA_DSP_LOADER */
2484
Takashi Iwai83012a72012-08-24 18:38:08 +02002485#ifdef CONFIG_PM
Takashi Iwaicb53c622007-08-10 17:21:45 +02002486/* power-up/down the controller */
Takashi Iwai68467f52012-08-28 09:14:29 -07002487static void azx_power_notify(struct hda_bus *bus, bool power_up)
Takashi Iwaicb53c622007-08-10 17:21:45 +02002488{
Takashi Iwai33fa35e2008-11-06 16:50:40 +01002489 struct azx *chip = bus->private_data;
Takashi Iwaicb53c622007-08-10 17:21:45 +02002490
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01002491 if (!(chip->driver_caps & AZX_DCAPS_PM_RUNTIME))
2492 return;
2493
Takashi Iwai68467f52012-08-28 09:14:29 -07002494 if (power_up)
Dylan Reid89287562014-02-28 15:41:15 -08002495 pm_runtime_get_sync(chip->card->dev);
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002496 else
Dylan Reid89287562014-02-28 15:41:15 -08002497 pm_runtime_put_sync(chip->card->dev);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002498}
Takashi Iwai65fcd412012-08-14 17:13:32 +02002499
2500static DEFINE_MUTEX(card_list_lock);
2501static LIST_HEAD(card_list);
2502
2503static void azx_add_card_list(struct azx *chip)
2504{
2505 mutex_lock(&card_list_lock);
2506 list_add(&chip->list, &card_list);
2507 mutex_unlock(&card_list_lock);
2508}
2509
2510static void azx_del_card_list(struct azx *chip)
2511{
2512 mutex_lock(&card_list_lock);
2513 list_del_init(&chip->list);
2514 mutex_unlock(&card_list_lock);
2515}
2516
2517/* trigger power-save check at writing parameter */
2518static int param_set_xint(const char *val, const struct kernel_param *kp)
2519{
2520 struct azx *chip;
2521 struct hda_codec *c;
2522 int prev = power_save;
2523 int ret = param_set_int(val, kp);
2524
2525 if (ret || prev == power_save)
2526 return ret;
2527
2528 mutex_lock(&card_list_lock);
2529 list_for_each_entry(chip, &card_list, list) {
2530 if (!chip->bus || chip->disabled)
2531 continue;
2532 list_for_each_entry(c, &chip->bus->codec_list, list)
2533 snd_hda_power_sync(c);
2534 }
2535 mutex_unlock(&card_list_lock);
2536 return 0;
2537}
2538#else
2539#define azx_add_card_list(chip) /* NOP */
2540#define azx_del_card_list(chip) /* NOP */
Takashi Iwai83012a72012-08-24 18:38:08 +02002541#endif /* CONFIG_PM */
Takashi Iwai5c0b9be2008-12-11 11:47:17 +01002542
Takashi Iwai7ccbde52012-08-14 18:10:09 +02002543#if defined(CONFIG_PM_SLEEP) || defined(SUPPORT_VGA_SWITCHEROO)
Takashi Iwai5c0b9be2008-12-11 11:47:17 +01002544/*
2545 * power management
2546 */
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002547static int azx_suspend(struct device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002548{
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002549 struct pci_dev *pci = to_pci_dev(dev);
2550 struct snd_card *card = dev_get_drvdata(dev);
Takashi Iwai421a1252005-11-17 16:11:09 +01002551 struct azx *chip = card->private_data;
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002552 struct azx_pcm *p;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002553
Takashi Iwaic5c21522012-12-04 17:01:25 +01002554 if (chip->disabled)
2555 return 0;
2556
Takashi Iwai421a1252005-11-17 16:11:09 +01002557 snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002558 azx_clear_irq_pending(chip);
Takashi Iwai01b65bf2011-11-24 14:31:46 +01002559 list_for_each_entry(p, &chip->pcm_list, list)
2560 snd_pcm_suspend_all(p->pcm);
Takashi Iwai0b7a2e92007-08-14 15:18:26 +02002561 if (chip->initialized)
Takashi Iwai8dd78332009-06-02 01:16:07 +02002562 snd_hda_suspend(chip->bus);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002563 azx_stop_chip(chip);
Mengdong Lin7295b262013-06-25 05:58:49 -04002564 azx_enter_link_reset(chip);
Takashi Iwai30b35392006-10-11 18:52:53 +02002565 if (chip->irq >= 0) {
Takashi Iwai43001c92006-09-08 12:30:03 +02002566 free_irq(chip->irq, chip);
Takashi Iwai30b35392006-10-11 18:52:53 +02002567 chip->irq = -1;
2568 }
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002569 if (chip->msi)
Takashi Iwai43001c92006-09-08 12:30:03 +02002570 pci_disable_msi(chip->pci);
Takashi Iwai421a1252005-11-17 16:11:09 +01002571 pci_disable_device(pci);
2572 pci_save_state(pci);
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002573 pci_set_power_state(pci, PCI_D3hot);
Wang Xingchao99a20082013-05-30 22:07:10 +08002574 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)
2575 hda_display_power(false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002576 return 0;
2577}
2578
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002579static int azx_resume(struct device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002580{
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002581 struct pci_dev *pci = to_pci_dev(dev);
2582 struct snd_card *card = dev_get_drvdata(dev);
Takashi Iwai421a1252005-11-17 16:11:09 +01002583 struct azx *chip = card->private_data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002584
Takashi Iwaic5c21522012-12-04 17:01:25 +01002585 if (chip->disabled)
2586 return 0;
2587
Wang Xingchao99a20082013-05-30 22:07:10 +08002588 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)
2589 hda_display_power(true);
Takashi Iwaid14a7e02009-02-16 10:13:03 +01002590 pci_set_power_state(pci, PCI_D0);
2591 pci_restore_state(pci);
Takashi Iwai30b35392006-10-11 18:52:53 +02002592 if (pci_enable_device(pci) < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002593 dev_err(chip->card->dev,
2594 "pci_enable_device failed, disabling device\n");
Takashi Iwai30b35392006-10-11 18:52:53 +02002595 snd_card_disconnect(card);
2596 return -EIO;
2597 }
2598 pci_set_master(pci);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002599 if (chip->msi)
2600 if (pci_enable_msi(pci) < 0)
2601 chip->msi = 0;
2602 if (azx_acquire_irq(chip, 1) < 0)
Takashi Iwai30b35392006-10-11 18:52:53 +02002603 return -EIO;
Takashi Iwaicb53c622007-08-10 17:21:45 +02002604 azx_init_pci(chip);
Maxim Levitskyd804ad92007-09-03 15:28:04 +02002605
Takashi Iwai7f308302012-05-08 16:52:23 +02002606 azx_init_chip(chip, 1);
Maxim Levitskyd804ad92007-09-03 15:28:04 +02002607
Linus Torvalds1da177e2005-04-16 15:20:36 -07002608 snd_hda_resume(chip->bus);
Takashi Iwai421a1252005-11-17 16:11:09 +01002609 snd_power_change_state(card, SNDRV_CTL_POWER_D0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002610 return 0;
2611}
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002612#endif /* CONFIG_PM_SLEEP || SUPPORT_VGA_SWITCHEROO */
2613
2614#ifdef CONFIG_PM_RUNTIME
2615static int azx_runtime_suspend(struct device *dev)
2616{
2617 struct snd_card *card = dev_get_drvdata(dev);
2618 struct azx *chip = card->private_data;
2619
Dave Airlie246efa42013-07-29 15:19:29 +10002620 if (chip->disabled)
2621 return 0;
2622
2623 if (!(chip->driver_caps & AZX_DCAPS_PM_RUNTIME))
2624 return 0;
2625
Wang Xingchao7d4f6062013-07-25 23:34:46 -04002626 /* enable controller wake up event */
2627 azx_writew(chip, WAKEEN, azx_readw(chip, WAKEEN) |
2628 STATESTS_INT_MASK);
2629
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002630 azx_stop_chip(chip);
Takashi Iwai873ce8a2013-11-26 11:58:40 +01002631 azx_enter_link_reset(chip);
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002632 azx_clear_irq_pending(chip);
Wang Xingchao99a20082013-05-30 22:07:10 +08002633 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)
2634 hda_display_power(false);
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002635 return 0;
2636}
2637
2638static int azx_runtime_resume(struct device *dev)
2639{
2640 struct snd_card *card = dev_get_drvdata(dev);
2641 struct azx *chip = card->private_data;
Wang Xingchao7d4f6062013-07-25 23:34:46 -04002642 struct hda_bus *bus;
2643 struct hda_codec *codec;
2644 int status;
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002645
Dave Airlie246efa42013-07-29 15:19:29 +10002646 if (chip->disabled)
2647 return 0;
2648
2649 if (!(chip->driver_caps & AZX_DCAPS_PM_RUNTIME))
2650 return 0;
2651
Wang Xingchao99a20082013-05-30 22:07:10 +08002652 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)
2653 hda_display_power(true);
Wang Xingchao7d4f6062013-07-25 23:34:46 -04002654
2655 /* Read STATESTS before controller reset */
2656 status = azx_readw(chip, STATESTS);
2657
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002658 azx_init_pci(chip);
2659 azx_init_chip(chip, 1);
Wang Xingchao7d4f6062013-07-25 23:34:46 -04002660
2661 bus = chip->bus;
2662 if (status && bus) {
2663 list_for_each_entry(codec, &bus->codec_list, list)
2664 if (status & (1 << codec->addr))
2665 queue_delayed_work(codec->bus->workq,
2666 &codec->jackpoll_work, codec->jackpoll_interval);
2667 }
2668
2669 /* disable controller Wake Up event*/
2670 azx_writew(chip, WAKEEN, azx_readw(chip, WAKEEN) &
2671 ~STATESTS_INT_MASK);
2672
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002673 return 0;
2674}
Takashi Iwai6eb827d2012-12-12 11:50:12 +01002675
2676static int azx_runtime_idle(struct device *dev)
2677{
2678 struct snd_card *card = dev_get_drvdata(dev);
2679 struct azx *chip = card->private_data;
2680
Dave Airlie246efa42013-07-29 15:19:29 +10002681 if (chip->disabled)
2682 return 0;
2683
Takashi Iwai6eb827d2012-12-12 11:50:12 +01002684 if (!power_save_controller ||
2685 !(chip->driver_caps & AZX_DCAPS_PM_RUNTIME))
2686 return -EBUSY;
2687
2688 return 0;
2689}
2690
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002691#endif /* CONFIG_PM_RUNTIME */
2692
2693#ifdef CONFIG_PM
2694static const struct dev_pm_ops azx_pm = {
2695 SET_SYSTEM_SLEEP_PM_OPS(azx_suspend, azx_resume)
Takashi Iwai6eb827d2012-12-12 11:50:12 +01002696 SET_RUNTIME_PM_OPS(azx_runtime_suspend, azx_runtime_resume, azx_runtime_idle)
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002697};
2698
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002699#define AZX_PM_OPS &azx_pm
2700#else
Takashi Iwai68cb2b52012-07-02 15:20:37 +02002701#define AZX_PM_OPS NULL
Mengdong Linb8dfc4622012-08-23 17:32:30 +08002702#endif /* CONFIG_PM */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002703
2704
2705/*
Takashi Iwai0cbf0092008-10-29 16:18:25 +01002706 * reboot notifier for hang-up problem at power-down
2707 */
2708static int azx_halt(struct notifier_block *nb, unsigned long event, void *buf)
2709{
2710 struct azx *chip = container_of(nb, struct azx, reboot_notifier);
Takashi Iwaifb8d1a32009-11-10 16:02:29 +01002711 snd_hda_bus_reboot_notify(chip->bus);
Takashi Iwai0cbf0092008-10-29 16:18:25 +01002712 azx_stop_chip(chip);
2713 return NOTIFY_OK;
2714}
2715
2716static void azx_notifier_register(struct azx *chip)
2717{
2718 chip->reboot_notifier.notifier_call = azx_halt;
2719 register_reboot_notifier(&chip->reboot_notifier);
2720}
2721
2722static void azx_notifier_unregister(struct azx *chip)
2723{
2724 if (chip->reboot_notifier.notifier_call)
2725 unregister_reboot_notifier(&chip->reboot_notifier);
2726}
2727
Takashi Iwai48c8b0e2012-12-07 07:40:35 +01002728static int azx_probe_continue(struct azx *chip);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002729
Steven Newbury8393ec4a2012-06-08 13:06:29 +02002730#ifdef SUPPORT_VGA_SWITCHEROO
Bill Pembertone23e7a12012-12-06 12:35:10 -05002731static struct pci_dev *get_bound_vga(struct pci_dev *pci);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002732
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002733static void azx_vs_set_state(struct pci_dev *pci,
2734 enum vga_switcheroo_state state)
2735{
2736 struct snd_card *card = pci_get_drvdata(pci);
2737 struct azx *chip = card->private_data;
2738 bool disabled;
2739
Takashi Iwaif4c482a2012-12-04 15:09:23 +01002740 wait_for_completion(&chip->probe_wait);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002741 if (chip->init_failed)
2742 return;
2743
2744 disabled = (state == VGA_SWITCHEROO_OFF);
2745 if (chip->disabled == disabled)
2746 return;
2747
2748 if (!chip->bus) {
2749 chip->disabled = disabled;
2750 if (!disabled) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002751 dev_info(chip->card->dev,
2752 "Start delayed initialization\n");
Takashi Iwai5c906802013-05-30 22:07:09 +08002753 if (azx_probe_continue(chip) < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002754 dev_err(chip->card->dev, "initialization error\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002755 chip->init_failed = true;
2756 }
2757 }
2758 } else {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002759 dev_info(chip->card->dev, "%s via VGA-switcheroo\n",
2760 disabled ? "Disabling" : "Enabling");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002761 if (disabled) {
Dylan Reid89287562014-02-28 15:41:15 -08002762 pm_runtime_put_sync_suspend(card->dev);
2763 azx_suspend(card->dev);
Dave Airlie246efa42013-07-29 15:19:29 +10002764 /* when we get suspended by vga switcheroo we end up in D3cold,
2765 * however we have no ACPI handle, so pci/acpi can't put us there,
2766 * put ourselves there */
2767 pci->current_state = PCI_D3cold;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002768 chip->disabled = true;
Takashi Iwai128960a2012-10-12 17:28:18 +02002769 if (snd_hda_lock_devices(chip->bus))
Takashi Iwai4e76a882014-02-25 12:21:03 +01002770 dev_warn(chip->card->dev,
2771 "Cannot lock devices!\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002772 } else {
2773 snd_hda_unlock_devices(chip->bus);
Dylan Reid89287562014-02-28 15:41:15 -08002774 pm_runtime_get_noresume(card->dev);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002775 chip->disabled = false;
Dylan Reid89287562014-02-28 15:41:15 -08002776 azx_resume(card->dev);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002777 }
2778 }
2779}
2780
2781static bool azx_vs_can_switch(struct pci_dev *pci)
2782{
2783 struct snd_card *card = pci_get_drvdata(pci);
2784 struct azx *chip = card->private_data;
2785
Takashi Iwaif4c482a2012-12-04 15:09:23 +01002786 wait_for_completion(&chip->probe_wait);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002787 if (chip->init_failed)
2788 return false;
2789 if (chip->disabled || !chip->bus)
2790 return true;
2791 if (snd_hda_lock_devices(chip->bus))
2792 return false;
2793 snd_hda_unlock_devices(chip->bus);
2794 return true;
2795}
2796
Bill Pembertone23e7a12012-12-06 12:35:10 -05002797static void init_vga_switcheroo(struct azx *chip)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002798{
2799 struct pci_dev *p = get_bound_vga(chip->pci);
2800 if (p) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002801 dev_info(chip->card->dev,
2802 "Handle VGA-switcheroo audio client\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002803 chip->use_vga_switcheroo = 1;
2804 pci_dev_put(p);
2805 }
2806}
2807
2808static const struct vga_switcheroo_client_ops azx_vs_ops = {
2809 .set_gpu_state = azx_vs_set_state,
2810 .can_switch = azx_vs_can_switch,
2811};
2812
Bill Pembertone23e7a12012-12-06 12:35:10 -05002813static int register_vga_switcheroo(struct azx *chip)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002814{
Takashi Iwai128960a2012-10-12 17:28:18 +02002815 int err;
2816
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002817 if (!chip->use_vga_switcheroo)
2818 return 0;
2819 /* FIXME: currently only handling DIS controller
2820 * is there any machine with two switchable HDMI audio controllers?
2821 */
Takashi Iwai128960a2012-10-12 17:28:18 +02002822 err = vga_switcheroo_register_audio_client(chip->pci, &azx_vs_ops,
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002823 VGA_SWITCHEROO_DIS,
2824 chip->bus != NULL);
Takashi Iwai128960a2012-10-12 17:28:18 +02002825 if (err < 0)
2826 return err;
2827 chip->vga_switcheroo_registered = 1;
Dave Airlie246efa42013-07-29 15:19:29 +10002828
2829 /* register as an optimus hdmi audio power domain */
Dylan Reid89287562014-02-28 15:41:15 -08002830 vga_switcheroo_init_domain_pm_optimus_hdmi_audio(chip->card->dev,
2831 &chip->hdmi_pm_domain);
Takashi Iwai128960a2012-10-12 17:28:18 +02002832 return 0;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002833}
2834#else
2835#define init_vga_switcheroo(chip) /* NOP */
2836#define register_vga_switcheroo(chip) 0
Steven Newbury8393ec4a2012-06-08 13:06:29 +02002837#define check_hdmi_disabled(pci) false
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002838#endif /* SUPPORT_VGA_SWITCHER */
2839
Takashi Iwai0cbf0092008-10-29 16:18:25 +01002840/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002841 * destructor
2842 */
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002843static int azx_free(struct azx *chip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002844{
Wang Xingchaoc67e2222013-05-30 22:07:08 +08002845 struct pci_dev *pci = chip->pci;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002846 int i;
2847
Wang Xingchaoc67e2222013-05-30 22:07:08 +08002848 if ((chip->driver_caps & AZX_DCAPS_PM_RUNTIME)
2849 && chip->running)
2850 pm_runtime_get_noresume(&pci->dev);
2851
Takashi Iwai65fcd412012-08-14 17:13:32 +02002852 azx_del_card_list(chip);
2853
Takashi Iwai0cbf0092008-10-29 16:18:25 +01002854 azx_notifier_unregister(chip);
2855
Takashi Iwaif4c482a2012-12-04 15:09:23 +01002856 chip->init_failed = 1; /* to be sure */
Daniel J Blueman44728e92012-12-18 23:59:33 +08002857 complete_all(&chip->probe_wait);
Takashi Iwaif4c482a2012-12-04 15:09:23 +01002858
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002859 if (use_vga_switcheroo(chip)) {
2860 if (chip->disabled && chip->bus)
2861 snd_hda_unlock_devices(chip->bus);
Takashi Iwai128960a2012-10-12 17:28:18 +02002862 if (chip->vga_switcheroo_registered)
2863 vga_switcheroo_unregister_client(chip->pci);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002864 }
2865
Takashi Iwaice43fba2005-05-30 20:33:44 +02002866 if (chip->initialized) {
Takashi Iwai9ad593f2008-05-16 12:34:47 +02002867 azx_clear_irq_pending(chip);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002868 for (i = 0; i < chip->num_streams; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002869 azx_stream_stop(chip, &chip->azx_dev[i]);
Takashi Iwaicb53c622007-08-10 17:21:45 +02002870 azx_stop_chip(chip);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002871 }
2872
Jeff Garzikf000fd82008-04-22 13:50:34 +02002873 if (chip->irq >= 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002874 free_irq(chip->irq, (void*)chip);
Takashi Iwai68e7fff2006-10-23 13:40:59 +02002875 if (chip->msi)
Takashi Iwai30b35392006-10-11 18:52:53 +02002876 pci_disable_msi(chip->pci);
Takashi Iwaif079c252006-06-01 11:42:14 +02002877 if (chip->remap_addr)
2878 iounmap(chip->remap_addr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002879
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002880 if (chip->azx_dev) {
2881 for (i = 0; i < chip->num_streams; i++)
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002882 if (chip->azx_dev[i].bdl.area) {
2883 mark_pages_wc(chip, &chip->azx_dev[i].bdl, false);
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002884 snd_dma_free_pages(&chip->azx_dev[i].bdl);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002885 }
Takashi Iwai4ce107b2008-02-06 14:50:19 +01002886 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002887 if (chip->rb.area) {
2888 mark_pages_wc(chip, &chip->rb, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002889 snd_dma_free_pages(&chip->rb);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002890 }
2891 if (chip->posbuf.area) {
2892 mark_pages_wc(chip, &chip->posbuf, false);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002893 snd_dma_free_pages(&chip->posbuf);
Takashi Iwai27fe48d92011-09-28 17:16:09 +02002894 }
Takashi Iwaia82d51e2012-04-26 12:23:42 +02002895 if (chip->region_requested)
2896 pci_release_regions(chip->pci);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002897 pci_disable_device(chip->pci);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02002898 kfree(chip->azx_dev);
Takashi Iwai4918cda2012-08-09 12:33:28 +02002899#ifdef CONFIG_SND_HDA_PATCH_LOADER
2900 if (chip->fw)
2901 release_firmware(chip->fw);
2902#endif
Wang Xingchao99a20082013-05-30 22:07:10 +08002903 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL) {
2904 hda_display_power(false);
2905 hda_i915_exit();
2906 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002907 kfree(chip);
2908
2909 return 0;
2910}
2911
Takashi Iwaia98f90f2005-11-17 14:59:02 +01002912static int azx_dev_free(struct snd_device *device)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002913{
2914 return azx_free(device->device_data);
2915}
2916
Steven Newbury8393ec4a2012-06-08 13:06:29 +02002917#ifdef SUPPORT_VGA_SWITCHEROO
Linus Torvalds1da177e2005-04-16 15:20:36 -07002918/*
Takashi Iwai91219472012-04-26 12:13:25 +02002919 * Check of disabled HDMI controller by vga-switcheroo
2920 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05002921static struct pci_dev *get_bound_vga(struct pci_dev *pci)
Takashi Iwai91219472012-04-26 12:13:25 +02002922{
2923 struct pci_dev *p;
2924
2925 /* check only discrete GPU */
2926 switch (pci->vendor) {
2927 case PCI_VENDOR_ID_ATI:
2928 case PCI_VENDOR_ID_AMD:
2929 case PCI_VENDOR_ID_NVIDIA:
2930 if (pci->devfn == 1) {
2931 p = pci_get_domain_bus_and_slot(pci_domain_nr(pci->bus),
2932 pci->bus->number, 0);
2933 if (p) {
2934 if ((p->class >> 8) == PCI_CLASS_DISPLAY_VGA)
2935 return p;
2936 pci_dev_put(p);
2937 }
2938 }
2939 break;
2940 }
2941 return NULL;
2942}
2943
Bill Pembertone23e7a12012-12-06 12:35:10 -05002944static bool check_hdmi_disabled(struct pci_dev *pci)
Takashi Iwai91219472012-04-26 12:13:25 +02002945{
2946 bool vga_inactive = false;
2947 struct pci_dev *p = get_bound_vga(pci);
2948
2949 if (p) {
Takashi Iwai12b78a72012-06-07 12:15:16 +02002950 if (vga_switcheroo_get_client_state(p) == VGA_SWITCHEROO_OFF)
Takashi Iwai91219472012-04-26 12:13:25 +02002951 vga_inactive = true;
2952 pci_dev_put(p);
2953 }
2954 return vga_inactive;
2955}
Steven Newbury8393ec4a2012-06-08 13:06:29 +02002956#endif /* SUPPORT_VGA_SWITCHEROO */
Takashi Iwai91219472012-04-26 12:13:25 +02002957
2958/*
Takashi Iwai3372a152007-02-01 15:46:50 +01002959 * white/black-listing for position_fix
2960 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05002961static struct snd_pci_quirk position_fix_list[] = {
Takashi Iwaid2e1c972008-06-10 17:53:34 +02002962 SND_PCI_QUIRK(0x1028, 0x01cc, "Dell D820", POS_FIX_LPIB),
2963 SND_PCI_QUIRK(0x1028, 0x01de, "Dell Precision 390", POS_FIX_LPIB),
Takashi Iwai2f703e72009-12-01 14:17:37 +01002964 SND_PCI_QUIRK(0x103c, 0x306d, "HP dv3", POS_FIX_LPIB),
Takashi Iwaid2e1c972008-06-10 17:53:34 +02002965 SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB),
Daniel T Chendd37f8e2010-05-30 01:17:03 -04002966 SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS", POS_FIX_LPIB),
Daniel T Chen9f75c1b2010-05-30 13:08:41 -04002967 SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS M2V", POS_FIX_LPIB),
Daniel T Chene96d3122010-05-27 18:32:18 -04002968 SND_PCI_QUIRK(0x104d, 0x9069, "Sony VPCS11V9E", POS_FIX_LPIB),
David Henningssonb01de4f2012-01-12 16:31:14 +01002969 SND_PCI_QUIRK(0x10de, 0xcb89, "Macbook Pro 7,1", POS_FIX_LPIB),
Daniel T Chen61bb42c2010-05-29 11:04:11 -04002970 SND_PCI_QUIRK(0x1297, 0x3166, "Shuttle", POS_FIX_LPIB),
Daniel T Chen9ec8dda2010-03-28 02:34:40 -04002971 SND_PCI_QUIRK(0x1458, 0xa022, "ga-ma770-ud3", POS_FIX_LPIB),
Takashi Iwai45d4ebf2009-11-30 11:58:30 +01002972 SND_PCI_QUIRK(0x1462, 0x1002, "MSI Wind U115", POS_FIX_LPIB),
Takashi Iwai8815cd02010-04-15 09:02:41 +02002973 SND_PCI_QUIRK(0x1565, 0x8218, "Biostar Microtech", POS_FIX_LPIB),
Daniel T Chenb90c0762010-05-30 19:31:41 -04002974 SND_PCI_QUIRK(0x1849, 0x0888, "775Dual-VSTA", POS_FIX_LPIB),
Daniel T Chen0e0280d2010-04-21 19:55:43 -04002975 SND_PCI_QUIRK(0x8086, 0x2503, "DG965OT AAD63733-203", POS_FIX_LPIB),
Takashi Iwai3372a152007-02-01 15:46:50 +01002976 {}
2977};
2978
Bill Pembertone23e7a12012-12-06 12:35:10 -05002979static int check_position_fix(struct azx *chip, int fix)
Takashi Iwai3372a152007-02-01 15:46:50 +01002980{
2981 const struct snd_pci_quirk *q;
2982
Takashi Iwaic673ba12009-03-17 07:49:14 +01002983 switch (fix) {
Takashi Iwai1dac6692012-09-13 14:59:47 +02002984 case POS_FIX_AUTO:
Takashi Iwaic673ba12009-03-17 07:49:14 +01002985 case POS_FIX_LPIB:
2986 case POS_FIX_POSBUF:
David Henningsson4cb36312010-09-30 10:12:50 +02002987 case POS_FIX_VIACOMBO:
Takashi Iwaia6f2fd52012-02-28 11:58:40 +01002988 case POS_FIX_COMBO:
Takashi Iwaic673ba12009-03-17 07:49:14 +01002989 return fix;
2990 }
2991
Takashi Iwaic673ba12009-03-17 07:49:14 +01002992 q = snd_pci_quirk_lookup(chip->pci, position_fix_list);
2993 if (q) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01002994 dev_info(chip->card->dev,
2995 "position_fix set to %d for device %04x:%04x\n",
2996 q->value, q->subvendor, q->subdevice);
Takashi Iwaic673ba12009-03-17 07:49:14 +01002997 return q->value;
Takashi Iwai3372a152007-02-01 15:46:50 +01002998 }
David Henningssonbdd9ef22010-10-04 12:02:14 +02002999
3000 /* Check VIA/ATI HD Audio Controller exist */
Takashi Iwai9477c582011-05-25 09:11:37 +02003001 if (chip->driver_caps & AZX_DCAPS_POSFIX_VIA) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003002 dev_dbg(chip->card->dev, "Using VIACOMBO position fix\n");
David Henningssonbdd9ef22010-10-04 12:02:14 +02003003 return POS_FIX_VIACOMBO;
3004 }
Takashi Iwai9477c582011-05-25 09:11:37 +02003005 if (chip->driver_caps & AZX_DCAPS_POSFIX_LPIB) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003006 dev_dbg(chip->card->dev, "Using LPIB position fix\n");
Takashi Iwai9477c582011-05-25 09:11:37 +02003007 return POS_FIX_LPIB;
3008 }
Takashi Iwaic673ba12009-03-17 07:49:14 +01003009 return POS_FIX_AUTO;
Takashi Iwai3372a152007-02-01 15:46:50 +01003010}
3011
3012/*
Takashi Iwai669ba272007-08-17 09:17:36 +02003013 * black-lists for probe_mask
3014 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003015static struct snd_pci_quirk probe_mask_list[] = {
Takashi Iwai669ba272007-08-17 09:17:36 +02003016 /* Thinkpad often breaks the controller communication when accessing
3017 * to the non-working (or non-existing) modem codec slot.
3018 */
3019 SND_PCI_QUIRK(0x1014, 0x05b7, "Thinkpad Z60", 0x01),
3020 SND_PCI_QUIRK(0x17aa, 0x2010, "Thinkpad X/T/R60", 0x01),
3021 SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X/T/R61", 0x01),
Takashi Iwai0edb9452008-11-07 14:53:09 +01003022 /* broken BIOS */
3023 SND_PCI_QUIRK(0x1028, 0x20ac, "Dell Studio Desktop", 0x01),
Takashi Iwaief1681d2008-11-24 17:29:28 +01003024 /* including bogus ALC268 in slot#2 that conflicts with ALC888 */
3025 SND_PCI_QUIRK(0x17c0, 0x4085, "Medion MD96630", 0x01),
Takashi Iwai20db7cb2009-02-13 08:18:48 +01003026 /* forced codec slots */
Ozan Çağlayan93574842009-05-23 15:00:04 +03003027 SND_PCI_QUIRK(0x1043, 0x1262, "ASUS W5Fm", 0x103),
Takashi Iwai20db7cb2009-02-13 08:18:48 +01003028 SND_PCI_QUIRK(0x1046, 0x1262, "ASUS W5F", 0x103),
Jaroslav Kyselaf3af9052012-04-26 17:52:35 +02003029 /* WinFast VP200 H (Teradici) user reported broken communication */
3030 SND_PCI_QUIRK(0x3a21, 0x040d, "WinFast VP200 H", 0x101),
Takashi Iwai669ba272007-08-17 09:17:36 +02003031 {}
3032};
3033
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003034#define AZX_FORCE_CODEC_MASK 0x100
3035
Bill Pembertone23e7a12012-12-06 12:35:10 -05003036static void check_probe_mask(struct azx *chip, int dev)
Takashi Iwai669ba272007-08-17 09:17:36 +02003037{
3038 const struct snd_pci_quirk *q;
3039
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003040 chip->codec_probe_mask = probe_mask[dev];
3041 if (chip->codec_probe_mask == -1) {
Takashi Iwai669ba272007-08-17 09:17:36 +02003042 q = snd_pci_quirk_lookup(chip->pci, probe_mask_list);
3043 if (q) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003044 dev_info(chip->card->dev,
3045 "probe_mask set to 0x%x for device %04x:%04x\n",
3046 q->value, q->subvendor, q->subdevice);
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003047 chip->codec_probe_mask = q->value;
Takashi Iwai669ba272007-08-17 09:17:36 +02003048 }
3049 }
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003050
3051 /* check forced option */
3052 if (chip->codec_probe_mask != -1 &&
3053 (chip->codec_probe_mask & AZX_FORCE_CODEC_MASK)) {
3054 chip->codec_mask = chip->codec_probe_mask & 0xff;
Takashi Iwai4e76a882014-02-25 12:21:03 +01003055 dev_info(chip->card->dev, "codec_mask forced to 0x%x\n",
3056 chip->codec_mask);
Takashi Iwaif1eaaee2009-02-13 08:16:55 +01003057 }
Takashi Iwai669ba272007-08-17 09:17:36 +02003058}
3059
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003060/*
Takashi Iwai716238552009-09-28 13:14:04 +02003061 * white/black-list for enable_msi
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003062 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003063static struct snd_pci_quirk msi_black_list[] = {
David Henningsson693e0cb2013-12-12 09:52:03 +01003064 SND_PCI_QUIRK(0x103c, 0x2191, "HP", 0), /* AMD Hudson */
3065 SND_PCI_QUIRK(0x103c, 0x2192, "HP", 0), /* AMD Hudson */
3066 SND_PCI_QUIRK(0x103c, 0x21f7, "HP", 0), /* AMD Hudson */
3067 SND_PCI_QUIRK(0x103c, 0x21fa, "HP", 0), /* AMD Hudson */
Takashi Iwai9dc83982009-12-22 08:15:01 +01003068 SND_PCI_QUIRK(0x1043, 0x81f2, "ASUS", 0), /* Athlon64 X2 + nvidia */
Takashi Iwai0a27fcf2010-02-15 17:05:28 +01003069 SND_PCI_QUIRK(0x1043, 0x81f6, "ASUS", 0), /* nvidia */
Ralf Gerbigecd21622010-03-09 18:25:47 +01003070 SND_PCI_QUIRK(0x1043, 0x822d, "ASUS", 0), /* Athlon64 X2 + nvidia MCP55 */
Takashi Iwai83f72152013-09-09 10:20:48 +02003071 SND_PCI_QUIRK(0x1179, 0xfb44, "Toshiba Satellite C870", 0), /* AMD Hudson */
Michele Ballabio4193d132010-03-06 21:06:46 +01003072 SND_PCI_QUIRK(0x1849, 0x0888, "ASRock", 0), /* Athlon64 X2 + nvidia */
Takashi Iwai38155952010-04-04 12:14:03 +02003073 SND_PCI_QUIRK(0xa0a0, 0x0575, "Aopen MZ915-M", 0), /* ICH6 */
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003074 {}
3075};
3076
Bill Pembertone23e7a12012-12-06 12:35:10 -05003077static void check_msi(struct azx *chip)
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003078{
3079 const struct snd_pci_quirk *q;
3080
Takashi Iwai716238552009-09-28 13:14:04 +02003081 if (enable_msi >= 0) {
3082 chip->msi = !!enable_msi;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003083 return;
Takashi Iwai716238552009-09-28 13:14:04 +02003084 }
3085 chip->msi = 1; /* enable MSI as default */
3086 q = snd_pci_quirk_lookup(chip->pci, msi_black_list);
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003087 if (q) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003088 dev_info(chip->card->dev,
3089 "msi for device %04x:%04x set to %d\n",
3090 q->subvendor, q->subdevice, q->value);
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003091 chip->msi = q->value;
Takashi Iwai80c43ed2010-03-15 15:51:53 +01003092 return;
3093 }
3094
3095 /* NVidia chipsets seem to cause troubles with MSI */
Takashi Iwai9477c582011-05-25 09:11:37 +02003096 if (chip->driver_caps & AZX_DCAPS_NO_MSI) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003097 dev_info(chip->card->dev, "Disabling MSI\n");
Takashi Iwai80c43ed2010-03-15 15:51:53 +01003098 chip->msi = 0;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003099 }
3100}
3101
Takashi Iwaia1585d72011-12-14 09:27:04 +01003102/* check the snoop mode availability */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003103static void azx_check_snoop_available(struct azx *chip)
Takashi Iwaia1585d72011-12-14 09:27:04 +01003104{
3105 bool snoop = chip->snoop;
3106
3107 switch (chip->driver_type) {
3108 case AZX_DRIVER_VIA:
3109 /* force to non-snoop mode for a new VIA controller
3110 * when BIOS is set
3111 */
3112 if (snoop) {
3113 u8 val;
3114 pci_read_config_byte(chip->pci, 0x42, &val);
3115 if (!(val & 0x80) && chip->pci->revision == 0x30)
3116 snoop = false;
3117 }
3118 break;
3119 case AZX_DRIVER_ATIHDMI_NS:
3120 /* new ATI HDMI requires non-snoop */
3121 snoop = false;
3122 break;
Takashi Iwaic1279f82013-02-07 17:36:22 +01003123 case AZX_DRIVER_CTHDA:
3124 snoop = false;
3125 break;
Takashi Iwaia1585d72011-12-14 09:27:04 +01003126 }
3127
3128 if (snoop != chip->snoop) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003129 dev_info(chip->card->dev, "Force to %s mode\n",
3130 snoop ? "snoop" : "non-snoop");
Takashi Iwaia1585d72011-12-14 09:27:04 +01003131 chip->snoop = snoop;
3132 }
3133}
Takashi Iwai669ba272007-08-17 09:17:36 +02003134
Wang Xingchao99a20082013-05-30 22:07:10 +08003135static void azx_probe_work(struct work_struct *work)
3136{
3137 azx_probe_continue(container_of(work, struct azx, probe_work));
3138}
Wang Xingchao99a20082013-05-30 22:07:10 +08003139
Takashi Iwai669ba272007-08-17 09:17:36 +02003140/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07003141 * constructor
3142 */
Bill Pembertone23e7a12012-12-06 12:35:10 -05003143static int azx_create(struct snd_card *card, struct pci_dev *pci,
3144 int dev, unsigned int driver_caps,
Dylan Reid40830812014-02-28 15:41:13 -08003145 const struct hda_controller_ops *hda_ops,
Bill Pembertone23e7a12012-12-06 12:35:10 -05003146 struct azx **rchip)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003147{
Takashi Iwaia98f90f2005-11-17 14:59:02 +01003148 static struct snd_device_ops ops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003149 .dev_free = azx_dev_free,
3150 };
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003151 struct azx *chip;
3152 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003153
3154 *rchip = NULL;
Tobin Davisbcd72002008-01-15 11:23:55 +01003155
Pavel Machek927fc862006-08-31 17:03:43 +02003156 err = pci_enable_device(pci);
3157 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003158 return err;
3159
Takashi Iwaie560d8d2005-09-09 14:21:46 +02003160 chip = kzalloc(sizeof(*chip), GFP_KERNEL);
Pavel Machek927fc862006-08-31 17:03:43 +02003161 if (!chip) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003162 dev_err(card->dev, "Cannot allocate chip\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07003163 pci_disable_device(pci);
3164 return -ENOMEM;
3165 }
3166
3167 spin_lock_init(&chip->reg_lock);
Ingo Molnar62932df2006-01-16 16:34:20 +01003168 mutex_init(&chip->open_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003169 chip->card = card;
3170 chip->pci = pci;
Dylan Reid40830812014-02-28 15:41:13 -08003171 chip->ops = hda_ops;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003172 chip->irq = -1;
Takashi Iwai9477c582011-05-25 09:11:37 +02003173 chip->driver_caps = driver_caps;
3174 chip->driver_type = driver_caps & 0xff;
Takashi Iwai4d8e22e2009-08-11 14:21:26 +02003175 check_msi(chip);
Takashi Iwai555e2192008-06-10 17:53:34 +02003176 chip->dev_index = dev;
Dylan Reid749ee282014-02-28 15:41:18 -08003177 chip->jackpoll_ms = jackpoll_ms;
Takashi Iwai9ad593f2008-05-16 12:34:47 +02003178 INIT_WORK(&chip->irq_pending_work, azx_irq_pending_work);
Takashi Iwai01b65bf2011-11-24 14:31:46 +01003179 INIT_LIST_HEAD(&chip->pcm_list);
Takashi Iwai65fcd412012-08-14 17:13:32 +02003180 INIT_LIST_HEAD(&chip->list);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003181 init_vga_switcheroo(chip);
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003182 init_completion(&chip->probe_wait);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003183
Shahin Ghazinouribeaffc32010-05-11 08:19:55 +02003184 chip->position_fix[0] = chip->position_fix[1] =
3185 check_position_fix(chip, position_fix[dev]);
Takashi Iwaia6f2fd52012-02-28 11:58:40 +01003186 /* combo mode uses LPIB for playback */
3187 if (chip->position_fix[0] == POS_FIX_COMBO) {
3188 chip->position_fix[0] = POS_FIX_LPIB;
3189 chip->position_fix[1] = POS_FIX_AUTO;
3190 }
3191
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003192 check_probe_mask(chip, dev);
Takashi Iwai3372a152007-02-01 15:46:50 +01003193
Takashi Iwai27346162006-01-12 18:28:44 +01003194 chip->single_cmd = single_cmd;
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003195 chip->snoop = hda_snoop;
Takashi Iwaia1585d72011-12-14 09:27:04 +01003196 azx_check_snoop_available(chip);
Takashi Iwaic74db862005-05-12 14:26:27 +02003197
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02003198 if (bdl_pos_adj[dev] < 0) {
3199 switch (chip->driver_type) {
Takashi Iwai0c6341a2008-06-13 20:50:27 +02003200 case AZX_DRIVER_ICH:
Seth Heasley32679f92010-02-22 17:31:09 -08003201 case AZX_DRIVER_PCH:
Takashi Iwai0c6341a2008-06-13 20:50:27 +02003202 bdl_pos_adj[dev] = 1;
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02003203 break;
3204 default:
Takashi Iwai0c6341a2008-06-13 20:50:27 +02003205 bdl_pos_adj[dev] = 32;
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02003206 break;
3207 }
3208 }
Dylan Reid9cdc0112014-02-28 15:41:14 -08003209 chip->bdl_pos_adj = bdl_pos_adj;
Takashi Iwai5c0d7bc2008-06-10 17:53:35 +02003210
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003211 err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
3212 if (err < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003213 dev_err(card->dev, "Error creating device [card]!\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003214 azx_free(chip);
3215 return err;
3216 }
3217
Wang Xingchao99a20082013-05-30 22:07:10 +08003218 /* continue probing in work context as may trigger request module */
3219 INIT_WORK(&chip->probe_work, azx_probe_work);
Wang Xingchao99a20082013-05-30 22:07:10 +08003220
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003221 *rchip = chip;
Wang Xingchao99a20082013-05-30 22:07:10 +08003222
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003223 return 0;
3224}
3225
Takashi Iwai48c8b0e2012-12-07 07:40:35 +01003226static int azx_first_init(struct azx *chip)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003227{
3228 int dev = chip->dev_index;
3229 struct pci_dev *pci = chip->pci;
3230 struct snd_card *card = chip->card;
3231 int i, err;
3232 unsigned short gcap;
3233
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003234#if BITS_PER_LONG != 64
3235 /* Fix up base address on ULI M5461 */
3236 if (chip->driver_type == AZX_DRIVER_ULI) {
3237 u16 tmp3;
3238 pci_read_config_word(pci, 0x40, &tmp3);
3239 pci_write_config_word(pci, 0x40, tmp3 | 0x10);
3240 pci_write_config_dword(pci, PCI_BASE_ADDRESS_1, 0);
3241 }
3242#endif
3243
Pavel Machek927fc862006-08-31 17:03:43 +02003244 err = pci_request_regions(pci, "ICH HD audio");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003245 if (err < 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003246 return err;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003247 chip->region_requested = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003248
Pavel Machek927fc862006-08-31 17:03:43 +02003249 chip->addr = pci_resource_start(pci, 0);
Arjan van de Ven2f5ad542008-09-28 16:20:09 -07003250 chip->remap_addr = pci_ioremap_bar(pci, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003251 if (chip->remap_addr == NULL) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003252 dev_err(card->dev, "ioremap error\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003253 return -ENXIO;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003254 }
3255
Takashi Iwai68e7fff2006-10-23 13:40:59 +02003256 if (chip->msi)
3257 if (pci_enable_msi(pci) < 0)
3258 chip->msi = 0;
Stephen Hemminger7376d012006-08-21 19:17:46 +02003259
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003260 if (azx_acquire_irq(chip, 0) < 0)
3261 return -EBUSY;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003262
3263 pci_set_master(pci);
3264 synchronize_irq(chip->irq);
3265
Tobin Davisbcd72002008-01-15 11:23:55 +01003266 gcap = azx_readw(chip, GCAP);
Takashi Iwai4e76a882014-02-25 12:21:03 +01003267 dev_dbg(card->dev, "chipset global capabilities = 0x%x\n", gcap);
Tobin Davisbcd72002008-01-15 11:23:55 +01003268
Andiry Brienzadc4c2e62009-07-08 13:55:31 +08003269 /* disable SB600 64bit support for safety */
Takashi Iwai9477c582011-05-25 09:11:37 +02003270 if (chip->pci->vendor == PCI_VENDOR_ID_ATI) {
Andiry Brienzadc4c2e62009-07-08 13:55:31 +08003271 struct pci_dev *p_smbus;
3272 p_smbus = pci_get_device(PCI_VENDOR_ID_ATI,
3273 PCI_DEVICE_ID_ATI_SBX00_SMBUS,
3274 NULL);
3275 if (p_smbus) {
3276 if (p_smbus->revision < 0x30)
3277 gcap &= ~ICH6_GCAP_64OK;
3278 pci_dev_put(p_smbus);
3279 }
3280 }
Takashi Iwai09240cf2009-03-17 07:47:18 +01003281
Takashi Iwai9477c582011-05-25 09:11:37 +02003282 /* disable 64bit DMA address on some devices */
3283 if (chip->driver_caps & AZX_DCAPS_NO_64BIT) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003284 dev_dbg(card->dev, "Disabling 64bit DMA\n");
Jaroslav Kysela396087e2009-12-09 10:44:47 +01003285 gcap &= ~ICH6_GCAP_64OK;
Takashi Iwai9477c582011-05-25 09:11:37 +02003286 }
Jaroslav Kysela396087e2009-12-09 10:44:47 +01003287
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003288 /* disable buffer size rounding to 128-byte multiples if supported */
Takashi Iwai7bfe0592012-01-23 17:53:39 +01003289 if (align_buffer_size >= 0)
3290 chip->align_buffer_size = !!align_buffer_size;
3291 else {
3292 if (chip->driver_caps & AZX_DCAPS_BUFSIZE)
3293 chip->align_buffer_size = 0;
3294 else if (chip->driver_caps & AZX_DCAPS_ALIGN_BUFSIZE)
3295 chip->align_buffer_size = 1;
3296 else
3297 chip->align_buffer_size = 1;
3298 }
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003299
Takashi Iwaicf7aaca2008-02-06 15:05:57 +01003300 /* allow 64bit DMA address if supported by H/W */
Takashi Iwaib21fadb2009-05-28 12:26:15 +02003301 if ((gcap & ICH6_GCAP_64OK) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64)))
Yang Hongyange9304382009-04-13 14:40:14 -07003302 pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(64));
Takashi Iwai09240cf2009-03-17 07:47:18 +01003303 else {
Yang Hongyange9304382009-04-13 14:40:14 -07003304 pci_set_dma_mask(pci, DMA_BIT_MASK(32));
3305 pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(32));
Takashi Iwai09240cf2009-03-17 07:47:18 +01003306 }
Takashi Iwaicf7aaca2008-02-06 15:05:57 +01003307
Takashi Iwai8b6ed8e2008-02-19 11:36:35 +01003308 /* read number of streams from GCAP register instead of using
3309 * hardcoded value
3310 */
3311 chip->capture_streams = (gcap >> 8) & 0x0f;
3312 chip->playback_streams = (gcap >> 12) & 0x0f;
3313 if (!chip->playback_streams && !chip->capture_streams) {
Tobin Davisbcd72002008-01-15 11:23:55 +01003314 /* gcap didn't give any info, switching to old method */
3315
3316 switch (chip->driver_type) {
3317 case AZX_DRIVER_ULI:
3318 chip->playback_streams = ULI_NUM_PLAYBACK;
3319 chip->capture_streams = ULI_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01003320 break;
3321 case AZX_DRIVER_ATIHDMI:
Andiry Xu1815b342011-12-14 16:10:27 +08003322 case AZX_DRIVER_ATIHDMI_NS:
Tobin Davisbcd72002008-01-15 11:23:55 +01003323 chip->playback_streams = ATIHDMI_NUM_PLAYBACK;
3324 chip->capture_streams = ATIHDMI_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01003325 break;
Yang, Libinc4da29c2008-11-13 11:07:07 +01003326 case AZX_DRIVER_GENERIC:
Tobin Davisbcd72002008-01-15 11:23:55 +01003327 default:
3328 chip->playback_streams = ICH6_NUM_PLAYBACK;
3329 chip->capture_streams = ICH6_NUM_CAPTURE;
Tobin Davisbcd72002008-01-15 11:23:55 +01003330 break;
3331 }
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003332 }
Takashi Iwai8b6ed8e2008-02-19 11:36:35 +01003333 chip->capture_index_offset = 0;
3334 chip->playback_index_offset = chip->capture_streams;
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003335 chip->num_streams = chip->playback_streams + chip->capture_streams;
Takashi Iwaid01ce992007-07-27 16:52:19 +02003336 chip->azx_dev = kcalloc(chip->num_streams, sizeof(*chip->azx_dev),
3337 GFP_KERNEL);
Pavel Machek927fc862006-08-31 17:03:43 +02003338 if (!chip->azx_dev) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003339 dev_err(card->dev, "cannot malloc azx_dev\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003340 return -ENOMEM;
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003341 }
3342
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003343 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwaieb49faa2013-03-15 09:19:11 +01003344 dsp_lock_init(&chip->azx_dev[i]);
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003345 /* allocate memory for the BDL for each stream */
3346 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
Dylan Reid89287562014-02-28 15:41:15 -08003347 chip->card->dev,
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003348 BDL_SIZE, &chip->azx_dev[i].bdl);
3349 if (err < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003350 dev_err(card->dev, "cannot allocate BDL\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003351 return -ENOMEM;
Takashi Iwai4ce107b2008-02-06 14:50:19 +01003352 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003353 mark_pages_wc(chip, &chip->azx_dev[i].bdl, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003354 }
Takashi Iwai0be3b5d2005-09-05 17:11:40 +02003355 /* allocate memory for the position buffer */
Takashi Iwaid01ce992007-07-27 16:52:19 +02003356 err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV,
Dylan Reid89287562014-02-28 15:41:15 -08003357 chip->card->dev,
Takashi Iwaid01ce992007-07-27 16:52:19 +02003358 chip->num_streams * 8, &chip->posbuf);
3359 if (err < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003360 dev_err(card->dev, "cannot allocate posbuf\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003361 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003362 }
Takashi Iwai27fe48d92011-09-28 17:16:09 +02003363 mark_pages_wc(chip, &chip->posbuf, true);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003364 /* allocate CORB/RIRB */
Takashi Iwai81740862009-05-26 15:22:00 +02003365 err = azx_alloc_cmd_io(chip);
3366 if (err < 0)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003367 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003368
3369 /* initialize streams */
3370 azx_init_stream(chip);
3371
3372 /* initialize chip */
Takashi Iwaicb53c622007-08-10 17:21:45 +02003373 azx_init_pci(chip);
Jaroslav Kysela10e77dd2010-03-26 11:04:38 +01003374 azx_init_chip(chip, (probe_only[dev] & 2) == 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003375
3376 /* codec detection */
Pavel Machek927fc862006-08-31 17:03:43 +02003377 if (!chip->codec_mask) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003378 dev_err(card->dev, "no codecs found!\n");
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003379 return -ENODEV;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003380 }
3381
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003382 strcpy(card->driver, "HDA-Intel");
Takashi Iwai18cb7102009-04-16 10:22:24 +02003383 strlcpy(card->shortname, driver_short_names[chip->driver_type],
3384 sizeof(card->shortname));
3385 snprintf(card->longname, sizeof(card->longname),
3386 "%s at 0x%lx irq %i",
3387 card->shortname, chip->addr, chip->irq);
Takashi Iwai07e4ca52005-08-24 14:14:57 +02003388
Linus Torvalds1da177e2005-04-16 15:20:36 -07003389 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003390}
3391
Takashi Iwaicb53c622007-08-10 17:21:45 +02003392static void power_down_all_codecs(struct azx *chip)
3393{
Takashi Iwai83012a72012-08-24 18:38:08 +02003394#ifdef CONFIG_PM
Takashi Iwaicb53c622007-08-10 17:21:45 +02003395 /* The codecs were powered up in snd_hda_codec_new().
3396 * Now all initialization done, so turn them down if possible
3397 */
3398 struct hda_codec *codec;
3399 list_for_each_entry(codec, &chip->bus->codec_list, list) {
3400 snd_hda_power_down(codec);
3401 }
3402#endif
3403}
3404
Takashi Iwai97c6a3d2012-08-09 17:40:46 +02003405#ifdef CONFIG_SND_HDA_PATCH_LOADER
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003406/* callback from request_firmware_nowait() */
3407static void azx_firmware_cb(const struct firmware *fw, void *context)
3408{
3409 struct snd_card *card = context;
3410 struct azx *chip = card->private_data;
3411 struct pci_dev *pci = chip->pci;
3412
3413 if (!fw) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003414 dev_err(card->dev, "Cannot load firmware, aborting\n");
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003415 goto error;
3416 }
3417
3418 chip->fw = fw;
3419 if (!chip->disabled) {
3420 /* continue probing */
3421 if (azx_probe_continue(chip))
3422 goto error;
3423 }
3424 return; /* OK */
3425
3426 error:
3427 snd_card_free(card);
3428 pci_set_drvdata(pci, NULL);
3429}
Takashi Iwai97c6a3d2012-08-09 17:40:46 +02003430#endif
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003431
Dylan Reid40830812014-02-28 15:41:13 -08003432/*
3433 * HDA controller ops.
3434 */
3435
3436/* PCI register access. */
3437static void pci_azx_writel(u32 value, u32 *addr)
3438{
3439 writel(value, addr);
3440}
3441
3442static u32 pci_azx_readl(u32 *addr)
3443{
3444 return readl(addr);
3445}
3446
3447static void pci_azx_writew(u16 value, u16 *addr)
3448{
3449 writew(value, addr);
3450}
3451
3452static u16 pci_azx_readw(u16 *addr)
3453{
3454 return readw(addr);
3455}
3456
3457static void pci_azx_writeb(u8 value, u8 *addr)
3458{
3459 writeb(value, addr);
3460}
3461
3462static u8 pci_azx_readb(u8 *addr)
3463{
3464 return readb(addr);
3465}
3466
Dylan Reidf46ea602014-02-28 15:41:16 -08003467static int disable_msi_reset_irq(struct azx *chip)
3468{
3469 int err;
3470
3471 free_irq(chip->irq, chip);
3472 chip->irq = -1;
3473 pci_disable_msi(chip->pci);
3474 chip->msi = 0;
3475 err = azx_acquire_irq(chip, 1);
3476 if (err < 0)
3477 return err;
3478
3479 return 0;
3480}
3481
Dylan Reid40830812014-02-28 15:41:13 -08003482static const struct hda_controller_ops pci_hda_ops = {
3483 .writel = pci_azx_writel,
3484 .readl = pci_azx_readl,
3485 .writew = pci_azx_writew,
3486 .readw = pci_azx_readw,
3487 .writeb = pci_azx_writeb,
3488 .readb = pci_azx_readb,
Dylan Reidf46ea602014-02-28 15:41:16 -08003489 .disable_msi_reset_irq = disable_msi_reset_irq,
Dylan Reid40830812014-02-28 15:41:13 -08003490};
3491
Bill Pembertone23e7a12012-12-06 12:35:10 -05003492static int azx_probe(struct pci_dev *pci,
3493 const struct pci_device_id *pci_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003494{
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003495 static int dev;
Takashi Iwaia98f90f2005-11-17 14:59:02 +01003496 struct snd_card *card;
3497 struct azx *chip;
Takashi Iwaiaad730d2013-12-02 13:33:57 +01003498 bool schedule_probe;
Pavel Machek927fc862006-08-31 17:03:43 +02003499 int err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003500
Takashi Iwai5aba4f82008-01-07 15:16:37 +01003501 if (dev >= SNDRV_CARDS)
3502 return -ENODEV;
3503 if (!enable[dev]) {
3504 dev++;
3505 return -ENOENT;
3506 }
3507
Takashi Iwai60c57722014-01-29 14:20:19 +01003508 err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,
3509 0, &card);
Takashi Iwaie58de7b2008-12-28 16:44:30 +01003510 if (err < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003511 dev_err(&pci->dev, "Error creating card!\n");
Takashi Iwaie58de7b2008-12-28 16:44:30 +01003512 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003513 }
3514
Dylan Reid40830812014-02-28 15:41:13 -08003515 err = azx_create(card, pci, dev, pci_id->driver_data,
3516 &pci_hda_ops, &chip);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003517 if (err < 0)
3518 goto out_free;
Takashi Iwai421a1252005-11-17 16:11:09 +01003519 card->private_data = chip;
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003520
3521 pci_set_drvdata(pci, card);
3522
3523 err = register_vga_switcheroo(chip);
3524 if (err < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003525 dev_err(card->dev, "Error registering VGA-switcheroo client\n");
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003526 goto out_free;
3527 }
3528
3529 if (check_hdmi_disabled(pci)) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003530 dev_info(card->dev, "VGA controller is disabled\n");
3531 dev_info(card->dev, "Delaying initialization\n");
Takashi Iwaif4c482a2012-12-04 15:09:23 +01003532 chip->disabled = true;
3533 }
3534
Takashi Iwaiaad730d2013-12-02 13:33:57 +01003535 schedule_probe = !chip->disabled;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003536
Takashi Iwai4918cda2012-08-09 12:33:28 +02003537#ifdef CONFIG_SND_HDA_PATCH_LOADER
3538 if (patch[dev] && *patch[dev]) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003539 dev_info(card->dev, "Applying patch firmware '%s'\n",
3540 patch[dev]);
Takashi Iwai5cb543d2012-08-09 13:49:23 +02003541 err = request_firmware_nowait(THIS_MODULE, true, patch[dev],
3542 &pci->dev, GFP_KERNEL, card,
3543 azx_firmware_cb);
Takashi Iwai4918cda2012-08-09 12:33:28 +02003544 if (err < 0)
3545 goto out_free;
Takashi Iwaiaad730d2013-12-02 13:33:57 +01003546 schedule_probe = false; /* continued in azx_firmware_cb() */
Takashi Iwai4918cda2012-08-09 12:33:28 +02003547 }
3548#endif /* CONFIG_SND_HDA_PATCH_LOADER */
3549
Takashi Iwaiaad730d2013-12-02 13:33:57 +01003550#ifndef CONFIG_SND_HDA_I915
3551 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)
Takashi Iwai4e76a882014-02-25 12:21:03 +01003552 dev_err(card->dev, "Haswell must build in CONFIG_SND_HDA_I915\n");
Wang Xingchao99a20082013-05-30 22:07:10 +08003553#endif
Wang Xingchao99a20082013-05-30 22:07:10 +08003554
Takashi Iwaiaad730d2013-12-02 13:33:57 +01003555 if (schedule_probe)
3556 schedule_work(&chip->probe_work);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003557
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003558 dev++;
Takashi Iwai88d071f2013-12-02 11:12:28 +01003559 if (chip->disabled)
3560 complete_all(&chip->probe_wait);
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003561 return 0;
3562
3563out_free:
3564 snd_card_free(card);
3565 return err;
3566}
3567
Dylan Reide62a42a2014-02-28 15:41:19 -08003568/* number of codec slots for each chipset: 0 = default slots (i.e. 4) */
3569static unsigned int azx_max_codecs[AZX_NUM_DRIVERS] = {
3570 [AZX_DRIVER_NVIDIA] = 8,
3571 [AZX_DRIVER_TERA] = 1,
3572};
3573
Takashi Iwai48c8b0e2012-12-07 07:40:35 +01003574static int azx_probe_continue(struct azx *chip)
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003575{
Wang Xingchaoc67e2222013-05-30 22:07:08 +08003576 struct pci_dev *pci = chip->pci;
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003577 int dev = chip->dev_index;
3578 int err;
3579
Wang Xingchao99a20082013-05-30 22:07:10 +08003580 /* Request power well for Haswell HDA controller and codec */
3581 if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL) {
David Henningssonc841ad22013-08-19 13:32:30 +02003582#ifdef CONFIG_SND_HDA_I915
Wang Xingchao99a20082013-05-30 22:07:10 +08003583 err = hda_i915_init();
3584 if (err < 0) {
Takashi Iwai4e76a882014-02-25 12:21:03 +01003585 dev_err(chip->card->dev,
3586 "Error request power-well from i915\n");
Wang Xingchao99a20082013-05-30 22:07:10 +08003587 goto out_free;
3588 }
David Henningssonc841ad22013-08-19 13:32:30 +02003589#endif
Wang Xingchao99a20082013-05-30 22:07:10 +08003590 hda_display_power(true);
3591 }
3592
Takashi Iwai5c906802013-05-30 22:07:09 +08003593 err = azx_first_init(chip);
3594 if (err < 0)
3595 goto out_free;
3596
Jaroslav Kysela2dca0bb2009-11-13 18:41:52 +01003597#ifdef CONFIG_SND_HDA_INPUT_BEEP
3598 chip->beep_mode = beep_mode[dev];
3599#endif
3600
Linus Torvalds1da177e2005-04-16 15:20:36 -07003601 /* create codec instances */
Dylan Reide62a42a2014-02-28 15:41:19 -08003602 err = azx_codec_create(chip, model[dev],
3603 azx_max_codecs[chip->driver_type],
3604 power_save_addr);
3605
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003606 if (err < 0)
3607 goto out_free;
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003608#ifdef CONFIG_SND_HDA_PATCH_LOADER
Takashi Iwai4918cda2012-08-09 12:33:28 +02003609 if (chip->fw) {
3610 err = snd_hda_load_patch(chip->bus, chip->fw->size,
3611 chip->fw->data);
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003612 if (err < 0)
3613 goto out_free;
Takashi Iwaie39ae852012-11-22 16:18:13 +01003614#ifndef CONFIG_PM
Takashi Iwai4918cda2012-08-09 12:33:28 +02003615 release_firmware(chip->fw); /* no longer needed */
3616 chip->fw = NULL;
Takashi Iwaie39ae852012-11-22 16:18:13 +01003617#endif
Takashi Iwai4ea6fbc2009-06-17 09:52:54 +02003618 }
3619#endif
Jaroslav Kysela10e77dd2010-03-26 11:04:38 +01003620 if ((probe_only[dev] & 1) == 0) {
Takashi Iwaia1e21c92009-06-17 09:33:52 +02003621 err = azx_codec_configure(chip);
3622 if (err < 0)
3623 goto out_free;
3624 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003625
3626 /* create PCM streams */
Takashi Iwai176d5332008-07-30 15:01:44 +02003627 err = snd_hda_build_pcms(chip->bus);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003628 if (err < 0)
3629 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003630
3631 /* create mixer controls */
Takashi Iwaid01ce992007-07-27 16:52:19 +02003632 err = azx_mixer_create(chip);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003633 if (err < 0)
3634 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003635
Takashi Iwaia82d51e2012-04-26 12:23:42 +02003636 err = snd_card_register(chip->card);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003637 if (err < 0)
3638 goto out_free;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003639
Takashi Iwaicb53c622007-08-10 17:21:45 +02003640 chip->running = 1;
3641 power_down_all_codecs(chip);
Takashi Iwai0cbf0092008-10-29 16:18:25 +01003642 azx_notifier_register(chip);
Takashi Iwai65fcd412012-08-14 17:13:32 +02003643 azx_add_card_list(chip);
Dave Airlie246efa42013-07-29 15:19:29 +10003644 if ((chip->driver_caps & AZX_DCAPS_PM_RUNTIME) || chip->use_vga_switcheroo)
Wang Xingchaoc67e2222013-05-30 22:07:08 +08003645 pm_runtime_put_noidle(&pci->dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003646
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003647out_free:
Takashi Iwai88d071f2013-12-02 11:12:28 +01003648 if (err < 0)
3649 chip->init_failed = 1;
3650 complete_all(&chip->probe_wait);
Wu Fengguang41dda0f2008-11-20 09:24:52 +08003651 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003652}
3653
Bill Pembertone23e7a12012-12-06 12:35:10 -05003654static void azx_remove(struct pci_dev *pci)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003655{
Takashi Iwai91219472012-04-26 12:13:25 +02003656 struct snd_card *card = pci_get_drvdata(pci);
Mengdong Linb8dfc4622012-08-23 17:32:30 +08003657
Takashi Iwai91219472012-04-26 12:13:25 +02003658 if (card)
3659 snd_card_free(card);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003660}
3661
3662/* PCI IDs */
Alexey Dobriyancebe41d2010-02-06 00:21:03 +02003663static DEFINE_PCI_DEVICE_TABLE(azx_ids) = {
Seth Heasleyd2f2fcd2010-01-12 17:03:35 -08003664 /* CPT */
Takashi Iwai9477c582011-05-25 09:11:37 +02003665 { PCI_DEVICE(0x8086, 0x1c20),
Takashi Iwaid7dab4d2013-01-08 13:51:30 +01003666 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM },
Seth Heasleycea310e2010-09-10 16:29:56 -07003667 /* PBG */
Takashi Iwai9477c582011-05-25 09:11:37 +02003668 { PCI_DEVICE(0x8086, 0x1d20),
Takashi Iwaid7dab4d2013-01-08 13:51:30 +01003669 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM },
Seth Heasleyd2edeb72011-04-20 10:59:57 -07003670 /* Panther Point */
Takashi Iwai9477c582011-05-25 09:11:37 +02003671 { PCI_DEVICE(0x8086, 0x1e20),
Takashi Iwaib1920c22013-11-22 12:43:25 +01003672 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
Seth Heasley8bc039a2012-01-23 16:24:31 -08003673 /* Lynx Point */
3674 { PCI_DEVICE(0x8086, 0x8c20),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003675 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
James Ralston884b0882013-02-08 17:29:40 -08003676 /* Wellsburg */
3677 { PCI_DEVICE(0x8086, 0x8d20),
3678 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
3679 { PCI_DEVICE(0x8086, 0x8d21),
3680 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
James Ralston144dad92012-08-09 09:38:59 -07003681 /* Lynx Point-LP */
3682 { PCI_DEVICE(0x8086, 0x9c20),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003683 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
James Ralston144dad92012-08-09 09:38:59 -07003684 /* Lynx Point-LP */
3685 { PCI_DEVICE(0x8086, 0x9c21),
Takashi Iwai2ea3c6a2012-11-19 20:03:37 +01003686 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
James Ralston4eeca492013-11-04 09:27:45 -08003687 /* Wildcat Point-LP */
3688 { PCI_DEVICE(0x8086, 0x9ca0),
3689 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
Wang Xingchaoe926f2c2012-06-13 10:23:51 +08003690 /* Haswell */
Wang Xingchao4a7c5162013-02-01 22:42:19 +08003691 { PCI_DEVICE(0x8086, 0x0a0c),
Takashi Iwaifab12852013-11-05 17:54:05 +01003692 .driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL },
Wang Xingchaoe926f2c2012-06-13 10:23:51 +08003693 { PCI_DEVICE(0x8086, 0x0c0c),
Takashi Iwaifab12852013-11-05 17:54:05 +01003694 .driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL },
Wang Xingchaod279fae2012-09-17 13:10:23 +08003695 { PCI_DEVICE(0x8086, 0x0d0c),
Takashi Iwaifab12852013-11-05 17:54:05 +01003696 .driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL },
Mengdong Lin862d7612014-01-08 15:55:14 -05003697 /* Broadwell */
3698 { PCI_DEVICE(0x8086, 0x160c),
3699 .driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL },
Pierre-Louis Bossart99df18b2012-09-21 18:39:07 -05003700 /* 5 Series/3400 */
3701 { PCI_DEVICE(0x8086, 0x3b56),
Takashi Iwai2c1350f2013-02-14 09:44:55 +01003702 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_NOPM },
Takashi Iwaif748abc2013-01-29 10:12:23 +01003703 /* Poulsbo */
Takashi Iwai9477c582011-05-25 09:11:37 +02003704 { PCI_DEVICE(0x8086, 0x811b),
Takashi Iwaif748abc2013-01-29 10:12:23 +01003705 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_NOPM },
3706 /* Oaktrail */
Li Peng09904b92011-12-28 15:17:26 +00003707 { PCI_DEVICE(0x8086, 0x080a),
Takashi Iwaif748abc2013-01-29 10:12:23 +01003708 .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH_NOPM },
Chew, Chiau Eee44007e2013-05-16 15:36:12 +08003709 /* BayTrail */
3710 { PCI_DEVICE(0x8086, 0x0f04),
3711 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM },
David Henningsson645e9032011-12-14 15:52:30 +08003712 /* ICH */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003713 { PCI_DEVICE(0x8086, 0x2668),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003714 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3715 AZX_DCAPS_BUFSIZE }, /* ICH6 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003716 { PCI_DEVICE(0x8086, 0x27d8),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003717 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3718 AZX_DCAPS_BUFSIZE }, /* ICH7 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003719 { PCI_DEVICE(0x8086, 0x269a),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003720 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3721 AZX_DCAPS_BUFSIZE }, /* ESB2 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003722 { PCI_DEVICE(0x8086, 0x284b),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003723 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3724 AZX_DCAPS_BUFSIZE }, /* ICH8 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003725 { PCI_DEVICE(0x8086, 0x293e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003726 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3727 AZX_DCAPS_BUFSIZE }, /* ICH9 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003728 { PCI_DEVICE(0x8086, 0x293f),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003729 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3730 AZX_DCAPS_BUFSIZE }, /* ICH9 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003731 { PCI_DEVICE(0x8086, 0x3a3e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003732 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3733 AZX_DCAPS_BUFSIZE }, /* ICH10 */
Takashi Iwai8b0bd222011-06-10 14:56:26 +02003734 { PCI_DEVICE(0x8086, 0x3a6e),
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003735 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_OLD_SSYNC |
3736 AZX_DCAPS_BUFSIZE }, /* ICH10 */
Takashi Iwaib6864532010-09-15 10:17:26 +02003737 /* Generic Intel */
3738 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_ANY_ID),
3739 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3740 .class_mask = 0xffffff,
Pierre-Louis Bossart2ae66c22011-08-04 10:12:56 -05003741 .driver_data = AZX_DRIVER_ICH | AZX_DCAPS_BUFSIZE },
Takashi Iwai9477c582011-05-25 09:11:37 +02003742 /* ATI SB 450/600/700/800/900 */
3743 { PCI_DEVICE(0x1002, 0x437b),
3744 .driver_data = AZX_DRIVER_ATI | AZX_DCAPS_PRESET_ATI_SB },
3745 { PCI_DEVICE(0x1002, 0x4383),
3746 .driver_data = AZX_DRIVER_ATI | AZX_DCAPS_PRESET_ATI_SB },
3747 /* AMD Hudson */
3748 { PCI_DEVICE(0x1022, 0x780d),
3749 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_SB },
Takashi Iwai87218e92008-02-21 08:13:11 +01003750 /* ATI HDMI */
Takashi Iwai9477c582011-05-25 09:11:37 +02003751 { PCI_DEVICE(0x1002, 0x793b),
3752 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3753 { PCI_DEVICE(0x1002, 0x7919),
3754 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3755 { PCI_DEVICE(0x1002, 0x960f),
3756 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3757 { PCI_DEVICE(0x1002, 0x970f),
3758 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3759 { PCI_DEVICE(0x1002, 0xaa00),
3760 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3761 { PCI_DEVICE(0x1002, 0xaa08),
3762 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3763 { PCI_DEVICE(0x1002, 0xaa10),
3764 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3765 { PCI_DEVICE(0x1002, 0xaa18),
3766 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3767 { PCI_DEVICE(0x1002, 0xaa20),
3768 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3769 { PCI_DEVICE(0x1002, 0xaa28),
3770 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3771 { PCI_DEVICE(0x1002, 0xaa30),
3772 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3773 { PCI_DEVICE(0x1002, 0xaa38),
3774 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3775 { PCI_DEVICE(0x1002, 0xaa40),
3776 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3777 { PCI_DEVICE(0x1002, 0xaa48),
3778 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
Clemens Ladischbbaa0d62013-11-05 09:27:10 +01003779 { PCI_DEVICE(0x1002, 0xaa50),
3780 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3781 { PCI_DEVICE(0x1002, 0xaa58),
3782 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3783 { PCI_DEVICE(0x1002, 0xaa60),
3784 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3785 { PCI_DEVICE(0x1002, 0xaa68),
3786 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3787 { PCI_DEVICE(0x1002, 0xaa80),
3788 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3789 { PCI_DEVICE(0x1002, 0xaa88),
3790 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3791 { PCI_DEVICE(0x1002, 0xaa90),
3792 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
3793 { PCI_DEVICE(0x1002, 0xaa98),
3794 .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
Andiry Xu1815b342011-12-14 16:10:27 +08003795 { PCI_DEVICE(0x1002, 0x9902),
3796 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
3797 { PCI_DEVICE(0x1002, 0xaaa0),
3798 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
3799 { PCI_DEVICE(0x1002, 0xaaa8),
3800 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
3801 { PCI_DEVICE(0x1002, 0xaab0),
3802 .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI },
Takashi Iwai87218e92008-02-21 08:13:11 +01003803 /* VIA VT8251/VT8237A */
Takashi Iwai9477c582011-05-25 09:11:37 +02003804 { PCI_DEVICE(0x1106, 0x3288),
3805 .driver_data = AZX_DRIVER_VIA | AZX_DCAPS_POSFIX_VIA },
Annie Liu754fdff2012-06-08 19:18:39 +08003806 /* VIA GFX VT7122/VX900 */
3807 { PCI_DEVICE(0x1106, 0x9170), .driver_data = AZX_DRIVER_GENERIC },
3808 /* VIA GFX VT6122/VX11 */
3809 { PCI_DEVICE(0x1106, 0x9140), .driver_data = AZX_DRIVER_GENERIC },
Takashi Iwai87218e92008-02-21 08:13:11 +01003810 /* SIS966 */
3811 { PCI_DEVICE(0x1039, 0x7502), .driver_data = AZX_DRIVER_SIS },
3812 /* ULI M5461 */
3813 { PCI_DEVICE(0x10b9, 0x5461), .driver_data = AZX_DRIVER_ULI },
3814 /* NVIDIA MCP */
Takashi Iwai0c2fd1bf42009-12-18 16:41:39 +01003815 { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID),
3816 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3817 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02003818 .driver_data = AZX_DRIVER_NVIDIA | AZX_DCAPS_PRESET_NVIDIA },
Kailang Yangf2690022008-05-27 11:44:55 +02003819 /* Teradici */
Takashi Iwai9477c582011-05-25 09:11:37 +02003820 { PCI_DEVICE(0x6549, 0x1200),
3821 .driver_data = AZX_DRIVER_TERA | AZX_DCAPS_NO_64BIT },
Lars R. Damerowf0b3da92012-11-02 13:10:39 -07003822 { PCI_DEVICE(0x6549, 0x2200),
3823 .driver_data = AZX_DRIVER_TERA | AZX_DCAPS_NO_64BIT },
Takashi Iwai4e01f542009-04-16 08:53:34 +02003824 /* Creative X-Fi (CA0110-IBG) */
Takashi Iwaif2a8eca2012-06-11 15:51:54 +02003825 /* CTHDA chips */
3826 { PCI_DEVICE(0x1102, 0x0010),
3827 .driver_data = AZX_DRIVER_CTHDA | AZX_DCAPS_PRESET_CTHDA },
3828 { PCI_DEVICE(0x1102, 0x0012),
3829 .driver_data = AZX_DRIVER_CTHDA | AZX_DCAPS_PRESET_CTHDA },
Takashi Iwai8eeaa2f2014-02-10 09:48:47 +01003830#if !IS_ENABLED(CONFIG_SND_CTXFI)
Takashi Iwai313f6e22009-05-18 12:40:52 +02003831 /* the following entry conflicts with snd-ctxfi driver,
3832 * as ctxfi driver mutates from HD-audio to native mode with
3833 * a special command sequence.
3834 */
Takashi Iwai4e01f542009-04-16 08:53:34 +02003835 { PCI_DEVICE(PCI_VENDOR_ID_CREATIVE, PCI_ANY_ID),
3836 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3837 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02003838 .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
Takashi Iwai69f9ba92011-11-06 13:49:13 +01003839 AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB },
Takashi Iwai313f6e22009-05-18 12:40:52 +02003840#else
3841 /* this entry seems still valid -- i.e. without emu20kx chip */
Takashi Iwai9477c582011-05-25 09:11:37 +02003842 { PCI_DEVICE(0x1102, 0x0009),
3843 .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND |
Takashi Iwai69f9ba92011-11-06 13:49:13 +01003844 AZX_DCAPS_RIRB_PRE_DELAY | AZX_DCAPS_POSFIX_LPIB },
Takashi Iwai313f6e22009-05-18 12:40:52 +02003845#endif
Otavio Salvadore35d4b12010-09-26 23:35:06 -03003846 /* Vortex86MX */
3847 { PCI_DEVICE(0x17f3, 0x3010), .driver_data = AZX_DRIVER_GENERIC },
Bankim Bhavsar0f0714c52011-01-17 15:23:21 +01003848 /* VMware HDAudio */
3849 { PCI_DEVICE(0x15ad, 0x1977), .driver_data = AZX_DRIVER_GENERIC },
Andiry Brienza9176b672009-07-17 11:32:32 +08003850 /* AMD/ATI Generic, PCI class code and Vendor ID for HD Audio */
Yang, Libinc4da29c2008-11-13 11:07:07 +01003851 { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_ANY_ID),
3852 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3853 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02003854 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_HDMI },
Andiry Brienza9176b672009-07-17 11:32:32 +08003855 { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_ANY_ID),
3856 .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8,
3857 .class_mask = 0xffffff,
Takashi Iwai9477c582011-05-25 09:11:37 +02003858 .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_HDMI },
Linus Torvalds1da177e2005-04-16 15:20:36 -07003859 { 0, }
3860};
3861MODULE_DEVICE_TABLE(pci, azx_ids);
3862
3863/* pci_driver definition */
Takashi Iwaie9f66d92012-04-24 12:25:00 +02003864static struct pci_driver azx_driver = {
Takashi Iwai3733e422011-06-10 16:20:20 +02003865 .name = KBUILD_MODNAME,
Linus Torvalds1da177e2005-04-16 15:20:36 -07003866 .id_table = azx_ids,
3867 .probe = azx_probe,
Bill Pembertone23e7a12012-12-06 12:35:10 -05003868 .remove = azx_remove,
Takashi Iwai68cb2b52012-07-02 15:20:37 +02003869 .driver = {
3870 .pm = AZX_PM_OPS,
3871 },
Linus Torvalds1da177e2005-04-16 15:20:36 -07003872};
3873
Takashi Iwaie9f66d92012-04-24 12:25:00 +02003874module_pci_driver(azx_driver);