blob: 232a1926758aa07a027d9845d8b3ca16efccdc69 [file] [log] [blame]
Thomas Gleixnerc942fdd2019-05-27 08:55:06 +02001// SPDX-License-Identifier: GPL-2.0-or-later
Dylan Reid05e84872014-02-28 15:41:22 -08002/*
3 *
4 * Implementation of primary alsa driver code base for Intel HD Audio.
5 *
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>
Dylan Reid05e84872014-02-28 15:41:22 -080010 */
11
12#include <linux/clocksource.h>
13#include <linux/delay.h>
Dylan Reidf0b1df82014-02-28 15:41:29 -080014#include <linux/interrupt.h>
Dylan Reid05e84872014-02-28 15:41:22 -080015#include <linux/kernel.h>
16#include <linux/module.h>
Dylan Reid154867c2014-02-28 15:41:30 -080017#include <linux/pm_runtime.h>
Dylan Reid05e84872014-02-28 15:41:22 -080018#include <linux/slab.h>
Guneshwor Singhbfcba282016-08-04 15:46:04 +053019
20#ifdef CONFIG_X86
21/* for art-tsc conversion */
22#include <asm/tsc.h>
23#endif
24
Dylan Reid05e84872014-02-28 15:41:22 -080025#include <sound/core.h>
26#include <sound/initval.h>
Dylan Reid05e84872014-02-28 15:41:22 -080027#include "hda_controller.h"
28
Takashi Iwai43db4a52015-04-16 11:44:58 +020029#define CREATE_TRACE_POINTS
Libin Yang18486502015-05-12 09:43:21 +080030#include "hda_controller_trace.h"
Takashi Iwai43db4a52015-04-16 11:44:58 +020031
Dylan Reid2b5fd6c2014-02-28 15:41:24 -080032/* DSP lock helpers */
Takashi Iwai7833c3f2015-04-14 18:13:13 +020033#define dsp_lock(dev) snd_hdac_dsp_lock(azx_stream(dev))
34#define dsp_unlock(dev) snd_hdac_dsp_unlock(azx_stream(dev))
35#define dsp_is_locked(dev) snd_hdac_stream_is_locked(azx_stream(dev))
Dylan Reid2b5fd6c2014-02-28 15:41:24 -080036
Dylan Reid05e84872014-02-28 15:41:22 -080037/* assign a stream for the PCM */
38static inline struct azx_dev *
39azx_assign_device(struct azx *chip, struct snd_pcm_substream *substream)
40{
Takashi Iwai7833c3f2015-04-14 18:13:13 +020041 struct hdac_stream *s;
Dylan Reid05e84872014-02-28 15:41:22 -080042
Takashi Iwai7833c3f2015-04-14 18:13:13 +020043 s = snd_hdac_stream_assign(azx_bus(chip), substream);
44 if (!s)
45 return NULL;
46 return stream_to_azx_dev(s);
Dylan Reid05e84872014-02-28 15:41:22 -080047}
48
49/* release the assigned stream */
50static inline void azx_release_device(struct azx_dev *azx_dev)
51{
Takashi Iwai7833c3f2015-04-14 18:13:13 +020052 snd_hdac_stream_release(azx_stream(azx_dev));
Dylan Reid05e84872014-02-28 15:41:22 -080053}
54
Takashi Iwai820cc6c2015-02-20 12:50:46 +010055static inline struct hda_pcm_stream *
56to_hda_pcm_stream(struct snd_pcm_substream *substream)
57{
58 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
59 return &apcm->info->stream[substream->stream];
60}
61
Dylan Reid05e84872014-02-28 15:41:22 -080062static u64 azx_adjust_codec_delay(struct snd_pcm_substream *substream,
63 u64 nsec)
64{
65 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwai820cc6c2015-02-20 12:50:46 +010066 struct hda_pcm_stream *hinfo = to_hda_pcm_stream(substream);
Dylan Reid05e84872014-02-28 15:41:22 -080067 u64 codec_frames, codec_nsecs;
68
69 if (!hinfo->ops.get_delay)
70 return nsec;
71
72 codec_frames = hinfo->ops.get_delay(hinfo, apcm->codec, substream);
73 codec_nsecs = div_u64(codec_frames * 1000000000LL,
74 substream->runtime->rate);
75
76 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
77 return nsec + codec_nsecs;
78
79 return (nsec > codec_nsecs) ? nsec - codec_nsecs : 0;
80}
81
82/*
Dylan Reid05e84872014-02-28 15:41:22 -080083 * PCM ops
84 */
85
86static int azx_pcm_close(struct snd_pcm_substream *substream)
87{
88 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwai820cc6c2015-02-20 12:50:46 +010089 struct hda_pcm_stream *hinfo = to_hda_pcm_stream(substream);
Dylan Reid05e84872014-02-28 15:41:22 -080090 struct azx *chip = apcm->chip;
91 struct azx_dev *azx_dev = get_azx_dev(substream);
Dylan Reid05e84872014-02-28 15:41:22 -080092
Libin Yang18486502015-05-12 09:43:21 +080093 trace_azx_pcm_close(chip, azx_dev);
Dylan Reid05e84872014-02-28 15:41:22 -080094 mutex_lock(&chip->open_mutex);
Dylan Reid05e84872014-02-28 15:41:22 -080095 azx_release_device(azx_dev);
Takashi Iwai61ca4102015-02-27 17:57:55 +010096 if (hinfo->ops.close)
97 hinfo->ops.close(hinfo, apcm->codec, substream);
Dylan Reid05e84872014-02-28 15:41:22 -080098 snd_hda_power_down(apcm->codec);
99 mutex_unlock(&chip->open_mutex);
Takashi Iwai9a6246f2015-02-27 18:17:28 +0100100 snd_hda_codec_pcm_put(apcm->info);
Dylan Reid05e84872014-02-28 15:41:22 -0800101 return 0;
102}
103
104static int azx_pcm_hw_params(struct snd_pcm_substream *substream,
105 struct snd_pcm_hw_params *hw_params)
106{
107 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
108 struct azx *chip = apcm->chip;
Takashi Iwai602518a22015-04-16 07:53:08 +0200109 struct azx_dev *azx_dev = get_azx_dev(substream);
Dylan Reid05e84872014-02-28 15:41:22 -0800110 int ret;
111
Libin Yang18486502015-05-12 09:43:21 +0800112 trace_azx_pcm_hw_params(chip, azx_dev);
Takashi Iwai602518a22015-04-16 07:53:08 +0200113 dsp_lock(azx_dev);
114 if (dsp_is_locked(azx_dev)) {
Dylan Reid05e84872014-02-28 15:41:22 -0800115 ret = -EBUSY;
116 goto unlock;
117 }
118
Takashi Iwai602518a22015-04-16 07:53:08 +0200119 azx_dev->core.bufsize = 0;
120 azx_dev->core.period_bytes = 0;
121 azx_dev->core.format_val = 0;
Takashi Iwai193c7e12018-08-08 17:12:58 +0200122 ret = snd_pcm_lib_malloc_pages(substream,
123 params_buffer_bytes(hw_params));
124
Dylan Reid05e84872014-02-28 15:41:22 -0800125unlock:
Takashi Iwai602518a22015-04-16 07:53:08 +0200126 dsp_unlock(azx_dev);
Dylan Reid05e84872014-02-28 15:41:22 -0800127 return ret;
128}
129
130static int azx_pcm_hw_free(struct snd_pcm_substream *substream)
131{
132 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
133 struct azx_dev *azx_dev = get_azx_dev(substream);
Takashi Iwai820cc6c2015-02-20 12:50:46 +0100134 struct hda_pcm_stream *hinfo = to_hda_pcm_stream(substream);
Dylan Reid05e84872014-02-28 15:41:22 -0800135 int err;
136
137 /* reset BDL address */
138 dsp_lock(azx_dev);
Takashi Iwaiccc98862015-04-14 22:06:53 +0200139 if (!dsp_is_locked(azx_dev))
140 snd_hdac_stream_cleanup(azx_stream(azx_dev));
Dylan Reid05e84872014-02-28 15:41:22 -0800141
142 snd_hda_codec_cleanup(apcm->codec, hinfo, substream);
143
Takashi Iwai193c7e12018-08-08 17:12:58 +0200144 err = snd_pcm_lib_free_pages(substream);
Takashi Iwai6d23c8f2015-04-17 13:34:30 +0200145 azx_stream(azx_dev)->prepared = 0;
Dylan Reid05e84872014-02-28 15:41:22 -0800146 dsp_unlock(azx_dev);
147 return err;
148}
149
150static int azx_pcm_prepare(struct snd_pcm_substream *substream)
151{
152 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
153 struct azx *chip = apcm->chip;
154 struct azx_dev *azx_dev = get_azx_dev(substream);
Takashi Iwai820cc6c2015-02-20 12:50:46 +0100155 struct hda_pcm_stream *hinfo = to_hda_pcm_stream(substream);
Dylan Reid05e84872014-02-28 15:41:22 -0800156 struct snd_pcm_runtime *runtime = substream->runtime;
Takashi Iwai0dd76f32015-04-18 09:59:38 +0200157 unsigned int format_val, stream_tag;
Dylan Reid05e84872014-02-28 15:41:22 -0800158 int err;
159 struct hda_spdif_out *spdif =
160 snd_hda_spdif_out_of_nid(apcm->codec, hinfo->nid);
161 unsigned short ctls = spdif ? spdif->ctls : 0;
162
Libin Yang18486502015-05-12 09:43:21 +0800163 trace_azx_pcm_prepare(chip, azx_dev);
Dylan Reid05e84872014-02-28 15:41:22 -0800164 dsp_lock(azx_dev);
165 if (dsp_is_locked(azx_dev)) {
166 err = -EBUSY;
167 goto unlock;
168 }
169
Takashi Iwai7833c3f2015-04-14 18:13:13 +0200170 snd_hdac_stream_reset(azx_stream(azx_dev));
Takashi Iwaib7d023e2015-04-16 08:19:06 +0200171 format_val = snd_hdac_calc_stream_format(runtime->rate,
Dylan Reid05e84872014-02-28 15:41:22 -0800172 runtime->channels,
173 runtime->format,
174 hinfo->maxbps,
175 ctls);
176 if (!format_val) {
177 dev_err(chip->card->dev,
178 "invalid format_val, rate=%d, ch=%d, format=%d\n",
179 runtime->rate, runtime->channels, runtime->format);
180 err = -EINVAL;
181 goto unlock;
182 }
183
Takashi Iwai0dd76f32015-04-18 09:59:38 +0200184 err = snd_hdac_stream_set_params(azx_stream(azx_dev), format_val);
185 if (err < 0)
186 goto unlock;
Dylan Reid05e84872014-02-28 15:41:22 -0800187
Takashi Iwaiccc98862015-04-14 22:06:53 +0200188 snd_hdac_stream_setup(azx_stream(azx_dev));
Dylan Reid05e84872014-02-28 15:41:22 -0800189
Takashi Iwai7833c3f2015-04-14 18:13:13 +0200190 stream_tag = azx_dev->core.stream_tag;
Dylan Reid05e84872014-02-28 15:41:22 -0800191 /* CA-IBG chips need the playback stream starting from 1 */
192 if ((chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND) &&
193 stream_tag > chip->capture_streams)
194 stream_tag -= chip->capture_streams;
195 err = snd_hda_codec_prepare(apcm->codec, hinfo, stream_tag,
Takashi Iwai7833c3f2015-04-14 18:13:13 +0200196 azx_dev->core.format_val, substream);
Dylan Reid05e84872014-02-28 15:41:22 -0800197
198 unlock:
199 if (!err)
Takashi Iwai6d23c8f2015-04-17 13:34:30 +0200200 azx_stream(azx_dev)->prepared = 1;
Dylan Reid05e84872014-02-28 15:41:22 -0800201 dsp_unlock(azx_dev);
202 return err;
203}
204
205static int azx_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
206{
207 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
208 struct azx *chip = apcm->chip;
Takashi Iwaia41d1222015-04-14 22:13:18 +0200209 struct hdac_bus *bus = azx_bus(chip);
Dylan Reid05e84872014-02-28 15:41:22 -0800210 struct azx_dev *azx_dev;
211 struct snd_pcm_substream *s;
Takashi Iwaiccc98862015-04-14 22:06:53 +0200212 struct hdac_stream *hstr;
213 bool start;
214 int sbits = 0;
215 int sync_reg;
Dylan Reid05e84872014-02-28 15:41:22 -0800216
217 azx_dev = get_azx_dev(substream);
Takashi Iwai43db4a52015-04-16 11:44:58 +0200218 trace_azx_pcm_trigger(chip, azx_dev, cmd);
219
Takashi Iwaiccc98862015-04-14 22:06:53 +0200220 hstr = azx_stream(azx_dev);
221 if (chip->driver_caps & AZX_DCAPS_OLD_SSYNC)
222 sync_reg = AZX_REG_OLD_SSYNC;
223 else
224 sync_reg = AZX_REG_SSYNC;
Dylan Reid05e84872014-02-28 15:41:22 -0800225
Takashi Iwai6d23c8f2015-04-17 13:34:30 +0200226 if (dsp_is_locked(azx_dev) || !hstr->prepared)
Dylan Reid05e84872014-02-28 15:41:22 -0800227 return -EPIPE;
228
229 switch (cmd) {
230 case SNDRV_PCM_TRIGGER_START:
Dylan Reid05e84872014-02-28 15:41:22 -0800231 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
232 case SNDRV_PCM_TRIGGER_RESUME:
Takashi Iwaiccc98862015-04-14 22:06:53 +0200233 start = true;
Dylan Reid05e84872014-02-28 15:41:22 -0800234 break;
235 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
236 case SNDRV_PCM_TRIGGER_SUSPEND:
237 case SNDRV_PCM_TRIGGER_STOP:
Takashi Iwaiccc98862015-04-14 22:06:53 +0200238 start = false;
Dylan Reid05e84872014-02-28 15:41:22 -0800239 break;
240 default:
241 return -EINVAL;
242 }
243
244 snd_pcm_group_for_each_entry(s, substream) {
245 if (s->pcm->card != substream->pcm->card)
246 continue;
247 azx_dev = get_azx_dev(s);
Takashi Iwai7833c3f2015-04-14 18:13:13 +0200248 sbits |= 1 << azx_dev->core.index;
Dylan Reid05e84872014-02-28 15:41:22 -0800249 snd_pcm_trigger_done(s, substream);
250 }
251
Takashi Iwaia41d1222015-04-14 22:13:18 +0200252 spin_lock(&bus->reg_lock);
Dylan Reid05e84872014-02-28 15:41:22 -0800253
254 /* first, set SYNC bits of corresponding streams */
Takashi Iwaiccc98862015-04-14 22:06:53 +0200255 snd_hdac_stream_sync_trigger(hstr, true, sbits, sync_reg);
Dylan Reid05e84872014-02-28 15:41:22 -0800256
257 snd_pcm_group_for_each_entry(s, substream) {
258 if (s->pcm->card != substream->pcm->card)
259 continue;
260 azx_dev = get_azx_dev(s);
261 if (start) {
Takashi Iwai7833c3f2015-04-14 18:13:13 +0200262 azx_dev->insufficient = 1;
263 snd_hdac_stream_start(azx_stream(azx_dev), true);
Dylan Reid05e84872014-02-28 15:41:22 -0800264 } else {
Takashi Iwai7833c3f2015-04-14 18:13:13 +0200265 snd_hdac_stream_stop(azx_stream(azx_dev));
Dylan Reid05e84872014-02-28 15:41:22 -0800266 }
Dylan Reid05e84872014-02-28 15:41:22 -0800267 }
Takashi Iwaia41d1222015-04-14 22:13:18 +0200268 spin_unlock(&bus->reg_lock);
Takashi Iwaiccc98862015-04-14 22:06:53 +0200269
270 snd_hdac_stream_sync(hstr, start, sbits);
271
Takashi Iwaia41d1222015-04-14 22:13:18 +0200272 spin_lock(&bus->reg_lock);
Dylan Reid05e84872014-02-28 15:41:22 -0800273 /* reset SYNC bits */
Takashi Iwaiccc98862015-04-14 22:06:53 +0200274 snd_hdac_stream_sync_trigger(hstr, false, sbits, sync_reg);
275 if (start)
276 snd_hdac_stream_timecounter_init(hstr, sbits);
Takashi Iwaia41d1222015-04-14 22:13:18 +0200277 spin_unlock(&bus->reg_lock);
Dylan Reid05e84872014-02-28 15:41:22 -0800278 return 0;
279}
280
Takashi Iwaib6050ef2014-06-26 16:50:16 +0200281unsigned int azx_get_pos_lpib(struct azx *chip, struct azx_dev *azx_dev)
Dylan Reid05e84872014-02-28 15:41:22 -0800282{
Takashi Iwai7833c3f2015-04-14 18:13:13 +0200283 return snd_hdac_stream_get_pos_lpib(azx_stream(azx_dev));
Dylan Reid05e84872014-02-28 15:41:22 -0800284}
Takashi Iwaib6050ef2014-06-26 16:50:16 +0200285EXPORT_SYMBOL_GPL(azx_get_pos_lpib);
286
287unsigned int azx_get_pos_posbuf(struct azx *chip, struct azx_dev *azx_dev)
288{
Takashi Iwai7833c3f2015-04-14 18:13:13 +0200289 return snd_hdac_stream_get_pos_posbuf(azx_stream(azx_dev));
Takashi Iwaib6050ef2014-06-26 16:50:16 +0200290}
291EXPORT_SYMBOL_GPL(azx_get_pos_posbuf);
Dylan Reid05e84872014-02-28 15:41:22 -0800292
293unsigned int azx_get_position(struct azx *chip,
Takashi Iwaib6050ef2014-06-26 16:50:16 +0200294 struct azx_dev *azx_dev)
Dylan Reid05e84872014-02-28 15:41:22 -0800295{
Takashi Iwai7833c3f2015-04-14 18:13:13 +0200296 struct snd_pcm_substream *substream = azx_dev->core.substream;
Dylan Reid05e84872014-02-28 15:41:22 -0800297 unsigned int pos;
298 int stream = substream->stream;
Dylan Reid05e84872014-02-28 15:41:22 -0800299 int delay = 0;
300
Takashi Iwaib6050ef2014-06-26 16:50:16 +0200301 if (chip->get_position[stream])
302 pos = chip->get_position[stream](chip, azx_dev);
303 else /* use the position buffer as default */
304 pos = azx_get_pos_posbuf(chip, azx_dev);
Dylan Reid05e84872014-02-28 15:41:22 -0800305
Takashi Iwai7833c3f2015-04-14 18:13:13 +0200306 if (pos >= azx_dev->core.bufsize)
Dylan Reid05e84872014-02-28 15:41:22 -0800307 pos = 0;
308
Dylan Reid05e84872014-02-28 15:41:22 -0800309 if (substream->runtime) {
Takashi Iwaib6050ef2014-06-26 16:50:16 +0200310 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwai820cc6c2015-02-20 12:50:46 +0100311 struct hda_pcm_stream *hinfo = to_hda_pcm_stream(substream);
Takashi Iwaib6050ef2014-06-26 16:50:16 +0200312
313 if (chip->get_delay[stream])
314 delay += chip->get_delay[stream](chip, azx_dev, pos);
Dylan Reid05e84872014-02-28 15:41:22 -0800315 if (hinfo->ops.get_delay)
316 delay += hinfo->ops.get_delay(hinfo, apcm->codec,
317 substream);
318 substream->runtime->delay = delay;
319 }
320
Takashi Iwai43db4a52015-04-16 11:44:58 +0200321 trace_azx_get_position(chip, azx_dev, pos, delay);
Dylan Reid05e84872014-02-28 15:41:22 -0800322 return pos;
323}
324EXPORT_SYMBOL_GPL(azx_get_position);
325
326static snd_pcm_uframes_t azx_pcm_pointer(struct snd_pcm_substream *substream)
327{
328 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
329 struct azx *chip = apcm->chip;
330 struct azx_dev *azx_dev = get_azx_dev(substream);
331 return bytes_to_frames(substream->runtime,
Takashi Iwaib6050ef2014-06-26 16:50:16 +0200332 azx_get_position(chip, azx_dev));
Dylan Reid05e84872014-02-28 15:41:22 -0800333}
334
Guneshwor Singhbfcba282016-08-04 15:46:04 +0530335/*
336 * azx_scale64: Scale base by mult/div while not overflowing sanely
337 *
338 * Derived from scale64_check_overflow in kernel/time/timekeeping.c
339 *
340 * The tmestamps for a 48Khz stream can overflow after (2^64/10^9)/48K which
341 * is about 384307 ie ~4.5 days.
342 *
343 * This scales the calculation so that overflow will happen but after 2^64 /
344 * 48000 secs, which is pretty large!
345 *
346 * In caln below:
347 * base may overflow, but since there isn’t any additional division
348 * performed on base it’s OK
349 * rem can’t overflow because both are 32-bit values
350 */
351
352#ifdef CONFIG_X86
353static u64 azx_scale64(u64 base, u32 num, u32 den)
354{
355 u64 rem;
356
357 rem = do_div(base, den);
358
359 base *= num;
360 rem *= num;
361
362 do_div(rem, den);
363
364 return base + rem;
365}
366
367static int azx_get_sync_time(ktime_t *device,
368 struct system_counterval_t *system, void *ctx)
369{
370 struct snd_pcm_substream *substream = ctx;
371 struct azx_dev *azx_dev = get_azx_dev(substream);
372 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
373 struct azx *chip = apcm->chip;
374 struct snd_pcm_runtime *runtime;
375 u64 ll_counter, ll_counter_l, ll_counter_h;
376 u64 tsc_counter, tsc_counter_l, tsc_counter_h;
377 u32 wallclk_ctr, wallclk_cycles;
378 bool direction;
379 u32 dma_select;
380 u32 timeout = 200;
381 u32 retry_count = 0;
382
383 runtime = substream->runtime;
384
385 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
386 direction = 1;
387 else
388 direction = 0;
389
390 /* 0th stream tag is not used, so DMA ch 0 is for 1st stream tag */
391 do {
392 timeout = 100;
393 dma_select = (direction << GTSCC_CDMAS_DMA_DIR_SHIFT) |
394 (azx_dev->core.stream_tag - 1);
395 snd_hdac_chip_writel(azx_bus(chip), GTSCC, dma_select);
396
397 /* Enable the capture */
398 snd_hdac_chip_updatel(azx_bus(chip), GTSCC, 0, GTSCC_TSCCI_MASK);
399
400 while (timeout) {
401 if (snd_hdac_chip_readl(azx_bus(chip), GTSCC) &
402 GTSCC_TSCCD_MASK)
403 break;
404
405 timeout--;
406 }
407
408 if (!timeout) {
409 dev_err(chip->card->dev, "GTSCC capture Timedout!\n");
410 return -EIO;
411 }
412
413 /* Read wall clock counter */
414 wallclk_ctr = snd_hdac_chip_readl(azx_bus(chip), WALFCC);
415
416 /* Read TSC counter */
417 tsc_counter_l = snd_hdac_chip_readl(azx_bus(chip), TSCCL);
418 tsc_counter_h = snd_hdac_chip_readl(azx_bus(chip), TSCCU);
419
420 /* Read Link counter */
421 ll_counter_l = snd_hdac_chip_readl(azx_bus(chip), LLPCL);
422 ll_counter_h = snd_hdac_chip_readl(azx_bus(chip), LLPCU);
423
424 /* Ack: registers read done */
425 snd_hdac_chip_writel(azx_bus(chip), GTSCC, GTSCC_TSCCD_SHIFT);
426
427 tsc_counter = (tsc_counter_h << TSCCU_CCU_SHIFT) |
428 tsc_counter_l;
429
430 ll_counter = (ll_counter_h << LLPC_CCU_SHIFT) | ll_counter_l;
431 wallclk_cycles = wallclk_ctr & WALFCC_CIF_MASK;
432
433 /*
434 * An error occurs near frame "rollover". The clocks in
435 * frame value indicates whether this error may have
436 * occurred. Here we use the value of 10 i.e.,
437 * HDA_MAX_CYCLE_OFFSET
438 */
439 if (wallclk_cycles < HDA_MAX_CYCLE_VALUE - HDA_MAX_CYCLE_OFFSET
440 && wallclk_cycles > HDA_MAX_CYCLE_OFFSET)
441 break;
442
443 /*
444 * Sleep before we read again, else we may again get
445 * value near to MAX_CYCLE. Try to sleep for different
446 * amount of time so we dont hit the same number again
447 */
448 udelay(retry_count++);
449
450 } while (retry_count != HDA_MAX_CYCLE_READ_RETRY);
451
452 if (retry_count == HDA_MAX_CYCLE_READ_RETRY) {
453 dev_err_ratelimited(chip->card->dev,
454 "Error in WALFCC cycle count\n");
455 return -EIO;
456 }
457
458 *device = ns_to_ktime(azx_scale64(ll_counter,
459 NSEC_PER_SEC, runtime->rate));
460 *device = ktime_add_ns(*device, (wallclk_cycles * NSEC_PER_SEC) /
461 ((HDA_MAX_CYCLE_VALUE + 1) * runtime->rate));
462
463 *system = convert_art_to_tsc(tsc_counter);
464
465 return 0;
466}
467
468#else
469static int azx_get_sync_time(ktime_t *device,
470 struct system_counterval_t *system, void *ctx)
471{
472 return -ENXIO;
473}
474#endif
475
476static int azx_get_crosststamp(struct snd_pcm_substream *substream,
477 struct system_device_crosststamp *xtstamp)
478{
479 return get_device_system_crosststamp(azx_get_sync_time,
480 substream, NULL, xtstamp);
481}
482
483static inline bool is_link_time_supported(struct snd_pcm_runtime *runtime,
484 struct snd_pcm_audio_tstamp_config *ts)
485{
486 if (runtime->hw.info & SNDRV_PCM_INFO_HAS_LINK_SYNCHRONIZED_ATIME)
487 if (ts->type_requested == SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED)
488 return true;
489
490 return false;
491}
492
Pierre-Louis Bossart9e94df32015-02-13 15:14:07 -0600493static int azx_get_time_info(struct snd_pcm_substream *substream,
494 struct timespec *system_ts, struct timespec *audio_ts,
495 struct snd_pcm_audio_tstamp_config *audio_tstamp_config,
496 struct snd_pcm_audio_tstamp_report *audio_tstamp_report)
Dylan Reid05e84872014-02-28 15:41:22 -0800497{
498 struct azx_dev *azx_dev = get_azx_dev(substream);
Guneshwor Singhbfcba282016-08-04 15:46:04 +0530499 struct snd_pcm_runtime *runtime = substream->runtime;
500 struct system_device_crosststamp xtstamp;
501 int ret;
Dylan Reid05e84872014-02-28 15:41:22 -0800502 u64 nsec;
503
Pierre-Louis Bossart9e94df32015-02-13 15:14:07 -0600504 if ((substream->runtime->hw.info & SNDRV_PCM_INFO_HAS_LINK_ATIME) &&
505 (audio_tstamp_config->type_requested == SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK)) {
Dylan Reid05e84872014-02-28 15:41:22 -0800506
Pierre-Louis Bossart9e94df32015-02-13 15:14:07 -0600507 snd_pcm_gettime(substream->runtime, system_ts);
508
Takashi Iwai7833c3f2015-04-14 18:13:13 +0200509 nsec = timecounter_read(&azx_dev->core.tc);
Pierre-Louis Bossart9e94df32015-02-13 15:14:07 -0600510 nsec = div_u64(nsec, 3); /* can be optimized */
511 if (audio_tstamp_config->report_delay)
512 nsec = azx_adjust_codec_delay(substream, nsec);
513
514 *audio_ts = ns_to_timespec(nsec);
515
516 audio_tstamp_report->actual_type = SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK;
517 audio_tstamp_report->accuracy_report = 1; /* rest of structure is valid */
518 audio_tstamp_report->accuracy = 42; /* 24 MHz WallClock == 42ns resolution */
519
Guneshwor Singhbfcba282016-08-04 15:46:04 +0530520 } else if (is_link_time_supported(runtime, audio_tstamp_config)) {
521
522 ret = azx_get_crosststamp(substream, &xtstamp);
523 if (ret)
524 return ret;
525
526 switch (runtime->tstamp_type) {
527 case SNDRV_PCM_TSTAMP_TYPE_MONOTONIC:
528 return -EINVAL;
529
530 case SNDRV_PCM_TSTAMP_TYPE_MONOTONIC_RAW:
531 *system_ts = ktime_to_timespec(xtstamp.sys_monoraw);
532 break;
533
534 default:
535 *system_ts = ktime_to_timespec(xtstamp.sys_realtime);
536 break;
537
538 }
539
540 *audio_ts = ktime_to_timespec(xtstamp.device);
541
542 audio_tstamp_report->actual_type =
543 SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED;
544 audio_tstamp_report->accuracy_report = 1;
545 /* 24 MHz WallClock == 42ns resolution */
546 audio_tstamp_report->accuracy = 42;
547
548 } else {
Pierre-Louis Bossart9e94df32015-02-13 15:14:07 -0600549 audio_tstamp_report->actual_type = SNDRV_PCM_AUDIO_TSTAMP_TYPE_DEFAULT;
Guneshwor Singhbfcba282016-08-04 15:46:04 +0530550 }
Dylan Reid05e84872014-02-28 15:41:22 -0800551
552 return 0;
553}
554
555static struct snd_pcm_hardware azx_pcm_hw = {
556 .info = (SNDRV_PCM_INFO_MMAP |
557 SNDRV_PCM_INFO_INTERLEAVED |
558 SNDRV_PCM_INFO_BLOCK_TRANSFER |
559 SNDRV_PCM_INFO_MMAP_VALID |
560 /* No full-resume yet implemented */
561 /* SNDRV_PCM_INFO_RESUME |*/
562 SNDRV_PCM_INFO_PAUSE |
563 SNDRV_PCM_INFO_SYNC_START |
Pierre-Louis Bossart9e94df32015-02-13 15:14:07 -0600564 SNDRV_PCM_INFO_HAS_WALL_CLOCK | /* legacy */
565 SNDRV_PCM_INFO_HAS_LINK_ATIME |
Dylan Reid05e84872014-02-28 15:41:22 -0800566 SNDRV_PCM_INFO_NO_PERIOD_WAKEUP),
567 .formats = SNDRV_PCM_FMTBIT_S16_LE,
568 .rates = SNDRV_PCM_RATE_48000,
569 .rate_min = 48000,
570 .rate_max = 48000,
571 .channels_min = 2,
572 .channels_max = 2,
573 .buffer_bytes_max = AZX_MAX_BUF_SIZE,
574 .period_bytes_min = 128,
575 .period_bytes_max = AZX_MAX_BUF_SIZE / 2,
576 .periods_min = 2,
577 .periods_max = AZX_MAX_FRAG,
578 .fifo_size = 0,
579};
580
581static int azx_pcm_open(struct snd_pcm_substream *substream)
582{
583 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
Takashi Iwai820cc6c2015-02-20 12:50:46 +0100584 struct hda_pcm_stream *hinfo = to_hda_pcm_stream(substream);
Dylan Reid05e84872014-02-28 15:41:22 -0800585 struct azx *chip = apcm->chip;
586 struct azx_dev *azx_dev;
587 struct snd_pcm_runtime *runtime = substream->runtime;
Dylan Reid05e84872014-02-28 15:41:22 -0800588 int err;
589 int buff_step;
590
Takashi Iwai9a6246f2015-02-27 18:17:28 +0100591 snd_hda_codec_pcm_get(apcm->info);
Dylan Reid05e84872014-02-28 15:41:22 -0800592 mutex_lock(&chip->open_mutex);
593 azx_dev = azx_assign_device(chip, substream);
Libin Yang18486502015-05-12 09:43:21 +0800594 trace_azx_pcm_open(chip, azx_dev);
Dylan Reid05e84872014-02-28 15:41:22 -0800595 if (azx_dev == NULL) {
Takashi Iwai61ca4102015-02-27 17:57:55 +0100596 err = -EBUSY;
597 goto unlock;
Dylan Reid05e84872014-02-28 15:41:22 -0800598 }
Takashi Iwaiccc98862015-04-14 22:06:53 +0200599 runtime->private_data = azx_dev;
Guneshwor Singh50279d92016-08-04 15:46:03 +0530600
601 if (chip->gts_present)
602 azx_pcm_hw.info = azx_pcm_hw.info |
603 SNDRV_PCM_INFO_HAS_LINK_SYNCHRONIZED_ATIME;
604
Dylan Reid05e84872014-02-28 15:41:22 -0800605 runtime->hw = azx_pcm_hw;
606 runtime->hw.channels_min = hinfo->channels_min;
607 runtime->hw.channels_max = hinfo->channels_max;
608 runtime->hw.formats = hinfo->formats;
609 runtime->hw.rates = hinfo->rates;
610 snd_pcm_limit_hw_rates(runtime);
611 snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
612
613 /* avoid wrap-around with wall-clock */
614 snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_BUFFER_TIME,
615 20,
616 178000000);
617
618 if (chip->align_buffer_size)
619 /* constrain buffer sizes to be multiple of 128
620 bytes. This is more efficient in terms of memory
621 access but isn't required by the HDA spec and
622 prevents users from specifying exact period/buffer
623 sizes. For example for 44.1kHz, a period size set
624 to 20ms will be rounded to 19.59ms. */
625 buff_step = 128;
626 else
627 /* Don't enforce steps on buffer sizes, still need to
628 be multiple of 4 bytes (HDA spec). Tested on Intel
629 HDA controllers, may not work on all devices where
630 option needs to be disabled */
631 buff_step = 4;
632
633 snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
634 buff_step);
635 snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES,
636 buff_step);
Takashi Iwaicc72da72015-02-19 16:00:22 +0100637 snd_hda_power_up(apcm->codec);
Takashi Iwai61ca4102015-02-27 17:57:55 +0100638 if (hinfo->ops.open)
639 err = hinfo->ops.open(hinfo, apcm->codec, substream);
640 else
641 err = -ENODEV;
Dylan Reid05e84872014-02-28 15:41:22 -0800642 if (err < 0) {
643 azx_release_device(azx_dev);
Takashi Iwai61ca4102015-02-27 17:57:55 +0100644 goto powerdown;
Dylan Reid05e84872014-02-28 15:41:22 -0800645 }
646 snd_pcm_limit_hw_rates(runtime);
647 /* sanity check */
648 if (snd_BUG_ON(!runtime->hw.channels_min) ||
649 snd_BUG_ON(!runtime->hw.channels_max) ||
650 snd_BUG_ON(!runtime->hw.formats) ||
651 snd_BUG_ON(!runtime->hw.rates)) {
652 azx_release_device(azx_dev);
Takashi Iwai61ca4102015-02-27 17:57:55 +0100653 if (hinfo->ops.close)
654 hinfo->ops.close(hinfo, apcm->codec, substream);
655 err = -EINVAL;
656 goto powerdown;
Dylan Reid05e84872014-02-28 15:41:22 -0800657 }
658
Pierre-Louis Bossart9e94df32015-02-13 15:14:07 -0600659 /* disable LINK_ATIME timestamps for capture streams
Dylan Reid05e84872014-02-28 15:41:22 -0800660 until we figure out how to handle digital inputs */
Pierre-Louis Bossart9e94df32015-02-13 15:14:07 -0600661 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
662 runtime->hw.info &= ~SNDRV_PCM_INFO_HAS_WALL_CLOCK; /* legacy */
663 runtime->hw.info &= ~SNDRV_PCM_INFO_HAS_LINK_ATIME;
664 }
Dylan Reid05e84872014-02-28 15:41:22 -0800665
Dylan Reid05e84872014-02-28 15:41:22 -0800666 snd_pcm_set_sync(substream);
667 mutex_unlock(&chip->open_mutex);
668 return 0;
Takashi Iwai61ca4102015-02-27 17:57:55 +0100669
670 powerdown:
671 snd_hda_power_down(apcm->codec);
672 unlock:
673 mutex_unlock(&chip->open_mutex);
Takashi Iwai9a6246f2015-02-27 18:17:28 +0100674 snd_hda_codec_pcm_put(apcm->info);
Takashi Iwai61ca4102015-02-27 17:57:55 +0100675 return err;
Dylan Reid05e84872014-02-28 15:41:22 -0800676}
677
678static int azx_pcm_mmap(struct snd_pcm_substream *substream,
679 struct vm_area_struct *area)
680{
681 struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
682 struct azx *chip = apcm->chip;
683 if (chip->ops->pcm_mmap_prepare)
684 chip->ops->pcm_mmap_prepare(substream, area);
685 return snd_pcm_lib_default_mmap(substream, area);
686}
687
Julia Lawall6769e9882016-09-02 00:13:10 +0200688static const struct snd_pcm_ops azx_pcm_ops = {
Dylan Reid05e84872014-02-28 15:41:22 -0800689 .open = azx_pcm_open,
690 .close = azx_pcm_close,
691 .ioctl = snd_pcm_lib_ioctl,
692 .hw_params = azx_pcm_hw_params,
693 .hw_free = azx_pcm_hw_free,
694 .prepare = azx_pcm_prepare,
695 .trigger = azx_pcm_trigger,
696 .pointer = azx_pcm_pointer,
Pierre-Louis Bossart9e94df32015-02-13 15:14:07 -0600697 .get_time_info = azx_get_time_info,
Dylan Reid05e84872014-02-28 15:41:22 -0800698 .mmap = azx_pcm_mmap,
699 .page = snd_pcm_sgbuf_ops_page,
700};
701
702static void azx_pcm_free(struct snd_pcm *pcm)
703{
704 struct azx_pcm *apcm = pcm->private_data;
705 if (apcm) {
706 list_del(&apcm->list);
Takashi Iwai820cc6c2015-02-20 12:50:46 +0100707 apcm->info->pcm = NULL;
Dylan Reid05e84872014-02-28 15:41:22 -0800708 kfree(apcm);
709 }
710}
711
712#define MAX_PREALLOC_SIZE (32 * 1024 * 1024)
713
Takashi Iwai0a505752015-04-16 23:25:02 +0200714int snd_hda_attach_pcm_stream(struct hda_bus *_bus, struct hda_codec *codec,
715 struct hda_pcm *cpcm)
Dylan Reid05e84872014-02-28 15:41:22 -0800716{
Takashi Iwaia41d1222015-04-14 22:13:18 +0200717 struct hdac_bus *bus = &_bus->core;
718 struct azx *chip = bus_to_azx(bus);
Dylan Reid05e84872014-02-28 15:41:22 -0800719 struct snd_pcm *pcm;
720 struct azx_pcm *apcm;
721 int pcm_dev = cpcm->device;
722 unsigned int size;
723 int s, err;
Takashi Iwaifc478142018-08-08 22:23:30 +0200724 int type = SNDRV_DMA_TYPE_DEV_SG;
Dylan Reid05e84872014-02-28 15:41:22 -0800725
726 list_for_each_entry(apcm, &chip->pcm_list, list) {
727 if (apcm->pcm->device == pcm_dev) {
728 dev_err(chip->card->dev, "PCM %d already exists\n",
729 pcm_dev);
730 return -EBUSY;
731 }
732 }
733 err = snd_pcm_new(chip->card, cpcm->name, pcm_dev,
734 cpcm->stream[SNDRV_PCM_STREAM_PLAYBACK].substreams,
735 cpcm->stream[SNDRV_PCM_STREAM_CAPTURE].substreams,
736 &pcm);
737 if (err < 0)
738 return err;
739 strlcpy(pcm->name, cpcm->name, sizeof(pcm->name));
740 apcm = kzalloc(sizeof(*apcm), GFP_KERNEL);
Bo Chena3aa60d2018-05-31 15:35:18 -0700741 if (apcm == NULL) {
742 snd_device_free(chip->card, pcm);
Dylan Reid05e84872014-02-28 15:41:22 -0800743 return -ENOMEM;
Bo Chena3aa60d2018-05-31 15:35:18 -0700744 }
Dylan Reid05e84872014-02-28 15:41:22 -0800745 apcm->chip = chip;
746 apcm->pcm = pcm;
747 apcm->codec = codec;
Takashi Iwai820cc6c2015-02-20 12:50:46 +0100748 apcm->info = cpcm;
Dylan Reid05e84872014-02-28 15:41:22 -0800749 pcm->private_data = apcm;
750 pcm->private_free = azx_pcm_free;
751 if (cpcm->pcm_type == HDA_PCM_TYPE_MODEM)
752 pcm->dev_class = SNDRV_PCM_CLASS_MODEM;
753 list_add_tail(&apcm->list, &chip->pcm_list);
754 cpcm->pcm = pcm;
755 for (s = 0; s < 2; s++) {
Dylan Reid05e84872014-02-28 15:41:22 -0800756 if (cpcm->stream[s].substreams)
757 snd_pcm_set_ops(pcm, s, &azx_pcm_ops);
758 }
759 /* buffer pre-allocation */
760 size = CONFIG_SND_HDA_PREALLOC_SIZE * 1024;
761 if (size > MAX_PREALLOC_SIZE)
762 size = MAX_PREALLOC_SIZE;
Takashi Iwaifc478142018-08-08 22:23:30 +0200763 if (chip->uc_buffer)
764 type = SNDRV_DMA_TYPE_DEV_UC_SG;
765 snd_pcm_lib_preallocate_pages_for_all(pcm, type,
Dylan Reid05e84872014-02-28 15:41:22 -0800766 chip->card->dev,
767 size, MAX_PREALLOC_SIZE);
Dylan Reid05e84872014-02-28 15:41:22 -0800768 return 0;
769}
Dylan Reid05e84872014-02-28 15:41:22 -0800770
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800771static unsigned int azx_command_addr(u32 cmd)
772{
773 unsigned int addr = cmd >> 28;
774
775 if (addr >= AZX_MAX_CODECS) {
776 snd_BUG();
777 addr = 0;
778 }
779
780 return addr;
781}
782
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800783/* receive a response */
Takashi Iwaia41d1222015-04-14 22:13:18 +0200784static int azx_rirb_get_response(struct hdac_bus *bus, unsigned int addr,
Takashi Iwaicad372f2015-03-25 17:57:00 +0100785 unsigned int *res)
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800786{
Takashi Iwaia41d1222015-04-14 22:13:18 +0200787 struct azx *chip = bus_to_azx(bus);
788 struct hda_bus *hbus = &chip->bus;
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800789 unsigned long timeout;
790 unsigned long loopcounter;
791 int do_poll = 0;
792
793 again:
794 timeout = jiffies + msecs_to_jiffies(1000);
795
796 for (loopcounter = 0;; loopcounter++) {
Takashi Iwaia41d1222015-04-14 22:13:18 +0200797 spin_lock_irq(&bus->reg_lock);
798 if (chip->polling_mode || do_poll)
799 snd_hdac_bus_update_rirb(bus);
800 if (!bus->rirb.cmds[addr]) {
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800801 if (!do_poll)
802 chip->poll_count = 0;
Takashi Iwaicad372f2015-03-25 17:57:00 +0100803 if (res)
Takashi Iwaia41d1222015-04-14 22:13:18 +0200804 *res = bus->rirb.res[addr]; /* the last value */
805 spin_unlock_irq(&bus->reg_lock);
Takashi Iwaicad372f2015-03-25 17:57:00 +0100806 return 0;
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800807 }
Takashi Iwaia41d1222015-04-14 22:13:18 +0200808 spin_unlock_irq(&bus->reg_lock);
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800809 if (time_after(jiffies, timeout))
810 break;
Takashi Iwaia41d1222015-04-14 22:13:18 +0200811 if (hbus->needs_damn_long_delay || loopcounter > 3000)
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800812 msleep(2); /* temporary workaround */
813 else {
814 udelay(10);
815 cond_resched();
816 }
817 }
818
Takashi Iwaia41d1222015-04-14 22:13:18 +0200819 if (hbus->no_response_fallback)
Takashi Iwaicad372f2015-03-25 17:57:00 +0100820 return -EIO;
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800821
822 if (!chip->polling_mode && chip->poll_count < 2) {
823 dev_dbg(chip->card->dev,
824 "azx_get_response timeout, polling the codec once: last cmd=0x%08x\n",
Takashi Iwaia41d1222015-04-14 22:13:18 +0200825 bus->last_cmd[addr]);
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800826 do_poll = 1;
827 chip->poll_count++;
828 goto again;
829 }
830
831
832 if (!chip->polling_mode) {
833 dev_warn(chip->card->dev,
834 "azx_get_response timeout, switching to polling mode: last cmd=0x%08x\n",
Takashi Iwaia41d1222015-04-14 22:13:18 +0200835 bus->last_cmd[addr]);
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800836 chip->polling_mode = 1;
837 goto again;
838 }
839
840 if (chip->msi) {
841 dev_warn(chip->card->dev,
842 "No response from codec, disabling MSI: last cmd=0x%08x\n",
Takashi Iwaia41d1222015-04-14 22:13:18 +0200843 bus->last_cmd[addr]);
844 if (chip->ops->disable_msi_reset_irq &&
Takashi Iwaicad372f2015-03-25 17:57:00 +0100845 chip->ops->disable_msi_reset_irq(chip) < 0)
846 return -EIO;
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800847 goto again;
848 }
849
850 if (chip->probing) {
851 /* If this critical timeout happens during the codec probing
852 * phase, this is likely an access to a non-existing codec
853 * slot. Better to return an error and reset the system.
854 */
Takashi Iwaicad372f2015-03-25 17:57:00 +0100855 return -EIO;
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800856 }
857
Takashi Iwai41438f12017-01-12 17:13:21 +0100858 /* no fallback mechanism? */
859 if (!chip->fallback_to_single_cmd)
860 return -EIO;
861
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800862 /* a fatal communication error; need either to reset or to fallback
863 * to the single_cmd mode
864 */
Takashi Iwaia41d1222015-04-14 22:13:18 +0200865 if (hbus->allow_bus_reset && !hbus->response_reset && !hbus->in_reset) {
866 hbus->response_reset = 1;
Takashi Iwaicad372f2015-03-25 17:57:00 +0100867 return -EAGAIN; /* give a chance to retry */
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800868 }
869
870 dev_err(chip->card->dev,
871 "azx_get_response timeout, switching to single_cmd mode: last cmd=0x%08x\n",
Takashi Iwaia41d1222015-04-14 22:13:18 +0200872 bus->last_cmd[addr]);
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800873 chip->single_cmd = 1;
Takashi Iwaia41d1222015-04-14 22:13:18 +0200874 hbus->response_reset = 0;
875 snd_hdac_bus_stop_cmd_io(bus);
Takashi Iwaicad372f2015-03-25 17:57:00 +0100876 return -EIO;
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800877}
878
879/*
880 * Use the single immediate command instead of CORB/RIRB for simplicity
881 *
882 * Note: according to Intel, this is not preferred use. The command was
883 * intended for the BIOS only, and may get confused with unsolicited
884 * responses. So, we shouldn't use it for normal operation from the
885 * driver.
886 * I left the codes, however, for debugging/testing purposes.
887 */
888
889/* receive a response */
890static int azx_single_wait_for_response(struct azx *chip, unsigned int addr)
891{
892 int timeout = 50;
893
894 while (timeout--) {
895 /* check IRV busy bit */
Takashi Iwaifb1d8ac2014-06-26 17:54:37 +0200896 if (azx_readw(chip, IRS) & AZX_IRS_VALID) {
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800897 /* reuse rirb.res as the response return value */
Takashi Iwaia41d1222015-04-14 22:13:18 +0200898 azx_bus(chip)->rirb.res[addr] = azx_readl(chip, IR);
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800899 return 0;
900 }
901 udelay(1);
902 }
903 if (printk_ratelimit())
904 dev_dbg(chip->card->dev, "get_response timeout: IRS=0x%x\n",
905 azx_readw(chip, IRS));
Takashi Iwaia41d1222015-04-14 22:13:18 +0200906 azx_bus(chip)->rirb.res[addr] = -1;
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800907 return -EIO;
908}
909
910/* send a command */
Takashi Iwaia41d1222015-04-14 22:13:18 +0200911static int azx_single_send_cmd(struct hdac_bus *bus, u32 val)
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800912{
Takashi Iwaia41d1222015-04-14 22:13:18 +0200913 struct azx *chip = bus_to_azx(bus);
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800914 unsigned int addr = azx_command_addr(val);
915 int timeout = 50;
916
Takashi Iwaia41d1222015-04-14 22:13:18 +0200917 bus->last_cmd[azx_command_addr(val)] = val;
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800918 while (timeout--) {
919 /* check ICB busy bit */
Takashi Iwaifb1d8ac2014-06-26 17:54:37 +0200920 if (!((azx_readw(chip, IRS) & AZX_IRS_BUSY))) {
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800921 /* Clear IRV valid bit */
922 azx_writew(chip, IRS, azx_readw(chip, IRS) |
Takashi Iwaifb1d8ac2014-06-26 17:54:37 +0200923 AZX_IRS_VALID);
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800924 azx_writel(chip, IC, val);
925 azx_writew(chip, IRS, azx_readw(chip, IRS) |
Takashi Iwaifb1d8ac2014-06-26 17:54:37 +0200926 AZX_IRS_BUSY);
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800927 return azx_single_wait_for_response(chip, addr);
928 }
929 udelay(1);
930 }
931 if (printk_ratelimit())
932 dev_dbg(chip->card->dev,
933 "send_cmd timeout: IRS=0x%x, val=0x%x\n",
934 azx_readw(chip, IRS), val);
935 return -EIO;
936}
937
938/* receive a response */
Takashi Iwaia41d1222015-04-14 22:13:18 +0200939static int azx_single_get_response(struct hdac_bus *bus, unsigned int addr,
Takashi Iwaicad372f2015-03-25 17:57:00 +0100940 unsigned int *res)
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800941{
Takashi Iwaicad372f2015-03-25 17:57:00 +0100942 if (res)
Takashi Iwaia41d1222015-04-14 22:13:18 +0200943 *res = bus->rirb.res[addr];
Takashi Iwaicad372f2015-03-25 17:57:00 +0100944 return 0;
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800945}
946
947/*
948 * The below are the main callbacks from hda_codec.
949 *
950 * They are just the skeleton to call sub-callbacks according to the
951 * current setting of chip->single_cmd.
952 */
953
954/* send a command */
Takashi Iwaia41d1222015-04-14 22:13:18 +0200955static int azx_send_cmd(struct hdac_bus *bus, unsigned int val)
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800956{
Takashi Iwaia41d1222015-04-14 22:13:18 +0200957 struct azx *chip = bus_to_azx(bus);
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800958
959 if (chip->disabled)
960 return 0;
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800961 if (chip->single_cmd)
962 return azx_single_send_cmd(bus, val);
963 else
Takashi Iwaia41d1222015-04-14 22:13:18 +0200964 return snd_hdac_bus_send_cmd(bus, val);
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800965}
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800966
967/* get a response */
Takashi Iwaia41d1222015-04-14 22:13:18 +0200968static int azx_get_response(struct hdac_bus *bus, unsigned int addr,
Takashi Iwaicad372f2015-03-25 17:57:00 +0100969 unsigned int *res)
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800970{
Takashi Iwaia41d1222015-04-14 22:13:18 +0200971 struct azx *chip = bus_to_azx(bus);
972
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800973 if (chip->disabled)
974 return 0;
975 if (chip->single_cmd)
Takashi Iwaicad372f2015-03-25 17:57:00 +0100976 return azx_single_get_response(bus, addr, res);
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800977 else
Takashi Iwaicad372f2015-03-25 17:57:00 +0100978 return azx_rirb_get_response(bus, addr, res);
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800979}
Dylan Reid6e85ddd2014-02-28 15:41:25 -0800980
Takashi Iwai7e8be1b2015-04-14 16:55:31 +0200981static const struct hdac_bus_ops bus_core_ops = {
982 .command = azx_send_cmd,
983 .get_response = azx_get_response,
984};
985
Dylan Reid2b5fd6c2014-02-28 15:41:24 -0800986#ifdef CONFIG_SND_HDA_DSP_LOADER
987/*
988 * DSP loading code (e.g. for CA0132)
989 */
990
991/* use the first stream for loading DSP */
992static struct azx_dev *
993azx_get_dsp_loader_dev(struct azx *chip)
994{
Takashi Iwai7833c3f2015-04-14 18:13:13 +0200995 struct hdac_bus *bus = azx_bus(chip);
996 struct hdac_stream *s;
997
998 list_for_each_entry(s, &bus->stream_list, list)
999 if (s->index == chip->playback_index_offset)
1000 return stream_to_azx_dev(s);
1001
1002 return NULL;
Dylan Reid2b5fd6c2014-02-28 15:41:24 -08001003}
1004
Takashi Iwai0a505752015-04-16 23:25:02 +02001005int snd_hda_codec_load_dsp_prepare(struct hda_codec *codec, unsigned int format,
1006 unsigned int byte_size,
1007 struct snd_dma_buffer *bufp)
Dylan Reid2b5fd6c2014-02-28 15:41:24 -08001008{
Takashi Iwai0a505752015-04-16 23:25:02 +02001009 struct hdac_bus *bus = &codec->bus->core;
Takashi Iwaia41d1222015-04-14 22:13:18 +02001010 struct azx *chip = bus_to_azx(bus);
Dylan Reid2b5fd6c2014-02-28 15:41:24 -08001011 struct azx_dev *azx_dev;
Takashi Iwaiccc98862015-04-14 22:06:53 +02001012 struct hdac_stream *hstr;
1013 bool saved = false;
Dylan Reid2b5fd6c2014-02-28 15:41:24 -08001014 int err;
1015
1016 azx_dev = azx_get_dsp_loader_dev(chip);
Takashi Iwaiccc98862015-04-14 22:06:53 +02001017 hstr = azx_stream(azx_dev);
Takashi Iwaia41d1222015-04-14 22:13:18 +02001018 spin_lock_irq(&bus->reg_lock);
Takashi Iwaiccc98862015-04-14 22:06:53 +02001019 if (hstr->opened) {
1020 chip->saved_azx_dev = *azx_dev;
1021 saved = true;
Dylan Reid2b5fd6c2014-02-28 15:41:24 -08001022 }
Takashi Iwaia41d1222015-04-14 22:13:18 +02001023 spin_unlock_irq(&bus->reg_lock);
Takashi Iwaiccc98862015-04-14 22:06:53 +02001024
1025 err = snd_hdac_dsp_prepare(hstr, format, byte_size, bufp);
1026 if (err < 0) {
Takashi Iwaia41d1222015-04-14 22:13:18 +02001027 spin_lock_irq(&bus->reg_lock);
Takashi Iwaiccc98862015-04-14 22:06:53 +02001028 if (saved)
1029 *azx_dev = chip->saved_azx_dev;
Takashi Iwaia41d1222015-04-14 22:13:18 +02001030 spin_unlock_irq(&bus->reg_lock);
Takashi Iwaiccc98862015-04-14 22:06:53 +02001031 return err;
1032 }
1033
Takashi Iwai6d23c8f2015-04-17 13:34:30 +02001034 hstr->prepared = 0;
Dylan Reid2b5fd6c2014-02-28 15:41:24 -08001035 return err;
1036}
Takashi Iwai0a505752015-04-16 23:25:02 +02001037EXPORT_SYMBOL_GPL(snd_hda_codec_load_dsp_prepare);
Dylan Reid2b5fd6c2014-02-28 15:41:24 -08001038
Takashi Iwai0a505752015-04-16 23:25:02 +02001039void snd_hda_codec_load_dsp_trigger(struct hda_codec *codec, bool start)
Dylan Reid2b5fd6c2014-02-28 15:41:24 -08001040{
Takashi Iwai0a505752015-04-16 23:25:02 +02001041 struct hdac_bus *bus = &codec->bus->core;
Takashi Iwaia41d1222015-04-14 22:13:18 +02001042 struct azx *chip = bus_to_azx(bus);
Dylan Reid2b5fd6c2014-02-28 15:41:24 -08001043 struct azx_dev *azx_dev = azx_get_dsp_loader_dev(chip);
1044
Takashi Iwaiccc98862015-04-14 22:06:53 +02001045 snd_hdac_dsp_trigger(azx_stream(azx_dev), start);
Dylan Reid2b5fd6c2014-02-28 15:41:24 -08001046}
Takashi Iwai0a505752015-04-16 23:25:02 +02001047EXPORT_SYMBOL_GPL(snd_hda_codec_load_dsp_trigger);
Dylan Reid2b5fd6c2014-02-28 15:41:24 -08001048
Takashi Iwai0a505752015-04-16 23:25:02 +02001049void snd_hda_codec_load_dsp_cleanup(struct hda_codec *codec,
1050 struct snd_dma_buffer *dmab)
Dylan Reid2b5fd6c2014-02-28 15:41:24 -08001051{
Takashi Iwai0a505752015-04-16 23:25:02 +02001052 struct hdac_bus *bus = &codec->bus->core;
Takashi Iwaia41d1222015-04-14 22:13:18 +02001053 struct azx *chip = bus_to_azx(bus);
Dylan Reid2b5fd6c2014-02-28 15:41:24 -08001054 struct azx_dev *azx_dev = azx_get_dsp_loader_dev(chip);
Takashi Iwaiccc98862015-04-14 22:06:53 +02001055 struct hdac_stream *hstr = azx_stream(azx_dev);
Dylan Reid2b5fd6c2014-02-28 15:41:24 -08001056
Takashi Iwai0a505752015-04-16 23:25:02 +02001057 if (!dmab->area || !hstr->locked)
Dylan Reid2b5fd6c2014-02-28 15:41:24 -08001058 return;
1059
Takashi Iwaiccc98862015-04-14 22:06:53 +02001060 snd_hdac_dsp_cleanup(hstr, dmab);
Takashi Iwaia41d1222015-04-14 22:13:18 +02001061 spin_lock_irq(&bus->reg_lock);
Takashi Iwaiccc98862015-04-14 22:06:53 +02001062 if (hstr->opened)
Dylan Reid2b5fd6c2014-02-28 15:41:24 -08001063 *azx_dev = chip->saved_azx_dev;
Takashi Iwaiccc98862015-04-14 22:06:53 +02001064 hstr->locked = false;
Takashi Iwaia41d1222015-04-14 22:13:18 +02001065 spin_unlock_irq(&bus->reg_lock);
Dylan Reid2b5fd6c2014-02-28 15:41:24 -08001066}
Takashi Iwai0a505752015-04-16 23:25:02 +02001067EXPORT_SYMBOL_GPL(snd_hda_codec_load_dsp_cleanup);
Dylan Reid2b5fd6c2014-02-28 15:41:24 -08001068#endif /* CONFIG_SND_HDA_DSP_LOADER */
1069
Dylan Reidf43923f2014-02-28 15:41:27 -08001070/*
1071 * reset and start the controller registers
1072 */
Thierry Reding17c3ad02014-04-09 12:30:57 +02001073void azx_init_chip(struct azx *chip, bool full_reset)
Dylan Reidf43923f2014-02-28 15:41:27 -08001074{
Takashi Iwaia41d1222015-04-14 22:13:18 +02001075 if (snd_hdac_bus_init_chip(azx_bus(chip), full_reset)) {
1076 /* correct RINTCNT for CXT */
1077 if (chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND)
1078 azx_writew(chip, RINTCNT, 0xc0);
1079 }
Dylan Reidf43923f2014-02-28 15:41:27 -08001080}
1081EXPORT_SYMBOL_GPL(azx_init_chip);
1082
Takashi Iwai7833c3f2015-04-14 18:13:13 +02001083void azx_stop_all_streams(struct azx *chip)
1084{
1085 struct hdac_bus *bus = azx_bus(chip);
1086 struct hdac_stream *s;
1087
1088 list_for_each_entry(s, &bus->stream_list, list)
1089 snd_hdac_stream_stop(s);
1090}
1091EXPORT_SYMBOL_GPL(azx_stop_all_streams);
1092
Dylan Reidf43923f2014-02-28 15:41:27 -08001093void azx_stop_chip(struct azx *chip)
1094{
Takashi Iwaia41d1222015-04-14 22:13:18 +02001095 snd_hdac_bus_stop_chip(azx_bus(chip));
Dylan Reidf43923f2014-02-28 15:41:27 -08001096}
Dylan Reid154867c2014-02-28 15:41:30 -08001097EXPORT_SYMBOL_GPL(azx_stop_chip);
Dylan Reidf43923f2014-02-28 15:41:27 -08001098
Dylan Reidf0b1df82014-02-28 15:41:29 -08001099/*
1100 * interrupt handler
1101 */
Takashi Iwai7833c3f2015-04-14 18:13:13 +02001102static void stream_update(struct hdac_bus *bus, struct hdac_stream *s)
1103{
Takashi Iwaia41d1222015-04-14 22:13:18 +02001104 struct azx *chip = bus_to_azx(bus);
Takashi Iwai7833c3f2015-04-14 18:13:13 +02001105 struct azx_dev *azx_dev = stream_to_azx_dev(s);
1106
1107 /* check whether this IRQ is really acceptable */
1108 if (!chip->ops->position_check ||
1109 chip->ops->position_check(chip, azx_dev)) {
Takashi Iwaia41d1222015-04-14 22:13:18 +02001110 spin_unlock(&bus->reg_lock);
1111 snd_pcm_period_elapsed(azx_stream(azx_dev)->substream);
1112 spin_lock(&bus->reg_lock);
Takashi Iwai7833c3f2015-04-14 18:13:13 +02001113 }
1114}
1115
Dylan Reidf0b1df82014-02-28 15:41:29 -08001116irqreturn_t azx_interrupt(int irq, void *dev_id)
1117{
1118 struct azx *chip = dev_id;
Takashi Iwai7833c3f2015-04-14 18:13:13 +02001119 struct hdac_bus *bus = azx_bus(chip);
Dylan Reidf0b1df82014-02-28 15:41:29 -08001120 u32 status;
Takashi Iwai473f4142016-02-23 15:54:47 +01001121 bool active, handled = false;
1122 int repeat = 0; /* count for avoiding endless loop */
Dylan Reidf0b1df82014-02-28 15:41:29 -08001123
Rafael J. Wysocki641d3342014-12-13 00:42:18 +01001124#ifdef CONFIG_PM
Takashi Iwai364aa712015-02-19 16:51:17 +01001125 if (azx_has_pm_runtime(chip))
Dylan Reid7b0a48f2014-04-08 12:06:18 -07001126 if (!pm_runtime_active(chip->card->dev))
Dylan Reidf0b1df82014-02-28 15:41:29 -08001127 return IRQ_NONE;
1128#endif
1129
Takashi Iwaia41d1222015-04-14 22:13:18 +02001130 spin_lock(&bus->reg_lock);
Dylan Reidf0b1df82014-02-28 15:41:29 -08001131
Takashi Iwai473f4142016-02-23 15:54:47 +01001132 if (chip->disabled)
1133 goto unlock;
Dylan Reidf0b1df82014-02-28 15:41:29 -08001134
Takashi Iwai473f4142016-02-23 15:54:47 +01001135 do {
1136 status = azx_readl(chip, INTSTS);
1137 if (status == 0 || status == 0xffffffff)
1138 break;
Dylan Reidf0b1df82014-02-28 15:41:29 -08001139
Takashi Iwai473f4142016-02-23 15:54:47 +01001140 handled = true;
1141 active = false;
1142 if (snd_hdac_bus_handle_stream_irq(bus, status, stream_update))
1143 active = true;
Dylan Reidf0b1df82014-02-28 15:41:29 -08001144
Takashi Iwai473f4142016-02-23 15:54:47 +01001145 /* clear rirb int */
1146 status = azx_readb(chip, RIRBSTS);
1147 if (status & RIRB_INT_MASK) {
1148 active = true;
1149 if (status & RIRB_INT_RESPONSE) {
1150 if (chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND)
1151 udelay(80);
1152 snd_hdac_bus_update_rirb(bus);
1153 }
1154 azx_writeb(chip, RIRBSTS, RIRB_INT_MASK);
Dylan Reidf0b1df82014-02-28 15:41:29 -08001155 }
Takashi Iwai473f4142016-02-23 15:54:47 +01001156 } while (active && ++repeat < 10);
Dylan Reidf0b1df82014-02-28 15:41:29 -08001157
Takashi Iwai473f4142016-02-23 15:54:47 +01001158 unlock:
Takashi Iwaia41d1222015-04-14 22:13:18 +02001159 spin_unlock(&bus->reg_lock);
Dylan Reidf0b1df82014-02-28 15:41:29 -08001160
Takashi Iwai473f4142016-02-23 15:54:47 +01001161 return IRQ_RETVAL(handled);
Dylan Reidf0b1df82014-02-28 15:41:29 -08001162}
1163EXPORT_SYMBOL_GPL(azx_interrupt);
1164
Dylan Reid154867c2014-02-28 15:41:30 -08001165/*
1166 * Codec initerface
1167 */
1168
1169/*
1170 * Probe the given codec address
1171 */
1172static int probe_codec(struct azx *chip, int addr)
1173{
1174 unsigned int cmd = (addr << 28) | (AC_NODE_ROOT << 20) |
1175 (AC_VERB_PARAMETERS << 8) | AC_PAR_VENDOR_ID;
Takashi Iwai7833c3f2015-04-14 18:13:13 +02001176 struct hdac_bus *bus = azx_bus(chip);
Takashi Iwaicad372f2015-03-25 17:57:00 +01001177 int err;
Takashi Iwaia41d1222015-04-14 22:13:18 +02001178 unsigned int res = -1;
Dylan Reid154867c2014-02-28 15:41:30 -08001179
Takashi Iwai7e8be1b2015-04-14 16:55:31 +02001180 mutex_lock(&bus->cmd_mutex);
Dylan Reid154867c2014-02-28 15:41:30 -08001181 chip->probing = 1;
Takashi Iwai7e8be1b2015-04-14 16:55:31 +02001182 azx_send_cmd(bus, cmd);
1183 err = azx_get_response(bus, addr, &res);
Dylan Reid154867c2014-02-28 15:41:30 -08001184 chip->probing = 0;
Takashi Iwai7e8be1b2015-04-14 16:55:31 +02001185 mutex_unlock(&bus->cmd_mutex);
Takashi Iwaicad372f2015-03-25 17:57:00 +01001186 if (err < 0 || res == -1)
Dylan Reid154867c2014-02-28 15:41:30 -08001187 return -EIO;
1188 dev_dbg(chip->card->dev, "codec #%d probed OK\n", addr);
1189 return 0;
1190}
1191
Takashi Iwai0a505752015-04-16 23:25:02 +02001192void snd_hda_bus_reset(struct hda_bus *bus)
Dylan Reid154867c2014-02-28 15:41:30 -08001193{
Takashi Iwaia41d1222015-04-14 22:13:18 +02001194 struct azx *chip = bus_to_azx(&bus->core);
Dylan Reid154867c2014-02-28 15:41:30 -08001195
1196 bus->in_reset = 1;
1197 azx_stop_chip(chip);
Thierry Reding17c3ad02014-04-09 12:30:57 +02001198 azx_init_chip(chip, true);
Takashi Iwaia41d1222015-04-14 22:13:18 +02001199 if (bus->core.chip_init)
Takashi Iwai0a505752015-04-16 23:25:02 +02001200 snd_hda_bus_reset_codecs(bus);
Dylan Reid154867c2014-02-28 15:41:30 -08001201 bus->in_reset = 0;
1202}
1203
Takashi Iwai96d2bd62015-02-19 18:12:22 +01001204/* HD-audio bus initialization */
Takashi Iwaia41d1222015-04-14 22:13:18 +02001205int azx_bus_init(struct azx *chip, const char *model,
1206 const struct hdac_io_ops *io_ops)
Dylan Reid154867c2014-02-28 15:41:30 -08001207{
Takashi Iwaia41d1222015-04-14 22:13:18 +02001208 struct hda_bus *bus = &chip->bus;
Takashi Iwai96d2bd62015-02-19 18:12:22 +01001209 int err;
Dylan Reid154867c2014-02-28 15:41:30 -08001210
Takashi Iwaia41d1222015-04-14 22:13:18 +02001211 err = snd_hdac_bus_init(&bus->core, chip->card->dev, &bus_core_ops,
1212 io_ops);
Dylan Reid154867c2014-02-28 15:41:30 -08001213 if (err < 0)
1214 return err;
1215
Takashi Iwaia41d1222015-04-14 22:13:18 +02001216 bus->card = chip->card;
1217 mutex_init(&bus->prepare_mutex);
Takashi Iwaief744972015-02-17 13:56:29 +01001218 bus->pci = chip->pci;
1219 bus->modelname = model;
Takashi Iwai2f0eaad2015-10-17 18:25:38 +02001220 bus->mixer_assigned = -1;
Takashi Iwaiccc98862015-04-14 22:06:53 +02001221 bus->core.snoop = azx_snoop(chip);
1222 if (chip->get_position[0] != azx_get_pos_lpib ||
1223 chip->get_position[1] != azx_get_pos_lpib)
1224 bus->core.use_posbuf = true;
Takashi Iwai4f0189b2015-12-10 16:44:08 +01001225 bus->core.bdl_pos_adj = chip->bdl_pos_adj;
Takashi Iwaia41d1222015-04-14 22:13:18 +02001226 if (chip->driver_caps & AZX_DCAPS_CORBRP_SELF_CLEAR)
1227 bus->core.corbrp_self_clear = true;
Takashi Iwaief744972015-02-17 13:56:29 +01001228
Takashi Iwaide1ab6a2015-11-02 17:35:34 +01001229 if (chip->driver_caps & AZX_DCAPS_4K_BDLE_BOUNDARY)
1230 bus->core.align_bdle_4k = true;
1231
Takashi Iwai96d2bd62015-02-19 18:12:22 +01001232 /* AMD chipsets often cause the communication stalls upon certain
1233 * sequence like the pin-detection. It seems that forcing the synced
1234 * access works around the stall. Grrr...
1235 */
1236 if (chip->driver_caps & AZX_DCAPS_SYNC_WRITE) {
1237 dev_dbg(chip->card->dev, "Enable sync_write for stable communication\n");
Takashi Iwaid068ebc2015-03-02 23:22:59 +01001238 bus->core.sync_write = 1;
Takashi Iwai96d2bd62015-02-19 18:12:22 +01001239 bus->allow_bus_reset = 1;
1240 }
1241
1242 return 0;
1243}
Takashi Iwaia41d1222015-04-14 22:13:18 +02001244EXPORT_SYMBOL_GPL(azx_bus_init);
Takashi Iwai96d2bd62015-02-19 18:12:22 +01001245
1246/* Probe codecs */
1247int azx_probe_codecs(struct azx *chip, unsigned int max_slots)
1248{
Takashi Iwaia41d1222015-04-14 22:13:18 +02001249 struct hdac_bus *bus = azx_bus(chip);
Takashi Iwai96d2bd62015-02-19 18:12:22 +01001250 int c, codecs, err;
1251
Dylan Reid154867c2014-02-28 15:41:30 -08001252 codecs = 0;
1253 if (!max_slots)
1254 max_slots = AZX_DEFAULT_CODECS;
1255
1256 /* First try to probe all given codec slots */
1257 for (c = 0; c < max_slots; c++) {
Takashi Iwaia41d1222015-04-14 22:13:18 +02001258 if ((bus->codec_mask & (1 << c)) & chip->codec_probe_mask) {
Dylan Reid154867c2014-02-28 15:41:30 -08001259 if (probe_codec(chip, c) < 0) {
1260 /* Some BIOSen give you wrong codec addresses
1261 * that don't exist
1262 */
1263 dev_warn(chip->card->dev,
1264 "Codec #%d probe error; disabling it...\n", c);
Takashi Iwaia41d1222015-04-14 22:13:18 +02001265 bus->codec_mask &= ~(1 << c);
Dylan Reid154867c2014-02-28 15:41:30 -08001266 /* More badly, accessing to a non-existing
1267 * codec often screws up the controller chip,
1268 * and disturbs the further communications.
1269 * Thus if an error occurs during probing,
1270 * better to reset the controller chip to
1271 * get back to the sanity state.
1272 */
1273 azx_stop_chip(chip);
Thierry Reding17c3ad02014-04-09 12:30:57 +02001274 azx_init_chip(chip, true);
Dylan Reid154867c2014-02-28 15:41:30 -08001275 }
1276 }
1277 }
1278
Dylan Reid154867c2014-02-28 15:41:30 -08001279 /* Then create codec instances */
1280 for (c = 0; c < max_slots; c++) {
Takashi Iwaia41d1222015-04-14 22:13:18 +02001281 if ((bus->codec_mask & (1 << c)) & chip->codec_probe_mask) {
Dylan Reid154867c2014-02-28 15:41:30 -08001282 struct hda_codec *codec;
Takashi Iwaia41d1222015-04-14 22:13:18 +02001283 err = snd_hda_codec_new(&chip->bus, chip->card, c, &codec);
Dylan Reid154867c2014-02-28 15:41:30 -08001284 if (err < 0)
1285 continue;
Takashi Iwai3a182c82018-08-30 07:58:50 +02001286 codec->jackpoll_interval = chip->jackpoll_interval;
Dylan Reid154867c2014-02-28 15:41:30 -08001287 codec->beep_mode = chip->beep_mode;
1288 codecs++;
1289 }
1290 }
1291 if (!codecs) {
1292 dev_err(chip->card->dev, "no codecs initialized\n");
1293 return -ENXIO;
1294 }
1295 return 0;
1296}
Takashi Iwai96d2bd62015-02-19 18:12:22 +01001297EXPORT_SYMBOL_GPL(azx_probe_codecs);
Dylan Reid154867c2014-02-28 15:41:30 -08001298
1299/* configure each codec instance */
1300int azx_codec_configure(struct azx *chip)
1301{
Takashi Iwaid94815f2017-06-28 12:02:02 +02001302 struct hda_codec *codec, *next;
1303
1304 /* use _safe version here since snd_hda_codec_configure() deregisters
1305 * the device upon error and deletes itself from the bus list.
1306 */
1307 list_for_each_codec_safe(codec, next, &chip->bus) {
Dylan Reid154867c2014-02-28 15:41:30 -08001308 snd_hda_codec_configure(codec);
1309 }
Takashi Iwai178908802017-06-28 12:45:34 +02001310
1311 if (!azx_bus(chip)->num_codecs)
1312 return -ENODEV;
Dylan Reid154867c2014-02-28 15:41:30 -08001313 return 0;
1314}
1315EXPORT_SYMBOL_GPL(azx_codec_configure);
1316
Takashi Iwai7833c3f2015-04-14 18:13:13 +02001317static int stream_direction(struct azx *chip, unsigned char index)
Rafal Redzimski93e34232014-12-19 08:44:30 +08001318{
Takashi Iwai7833c3f2015-04-14 18:13:13 +02001319 if (index >= chip->capture_index_offset &&
1320 index < chip->capture_index_offset + chip->capture_streams)
1321 return SNDRV_PCM_STREAM_CAPTURE;
1322 return SNDRV_PCM_STREAM_PLAYBACK;
Rafal Redzimski93e34232014-12-19 08:44:30 +08001323}
1324
Dylan Reid154867c2014-02-28 15:41:30 -08001325/* initialize SD streams */
Takashi Iwaia41d1222015-04-14 22:13:18 +02001326int azx_init_streams(struct azx *chip)
Dylan Reid154867c2014-02-28 15:41:30 -08001327{
1328 int i;
Takashi Iwai7833c3f2015-04-14 18:13:13 +02001329 int stream_tags[2] = { 0, 0 };
Dylan Reid154867c2014-02-28 15:41:30 -08001330
1331 /* initialize each stream (aka device)
1332 * assign the starting bdl address to each stream (device)
1333 * and initialize
1334 */
1335 for (i = 0; i < chip->num_streams; i++) {
Takashi Iwai7833c3f2015-04-14 18:13:13 +02001336 struct azx_dev *azx_dev = kzalloc(sizeof(*azx_dev), GFP_KERNEL);
1337 int dir, tag;
Rafal Redzimski93e34232014-12-19 08:44:30 +08001338
Takashi Iwai7833c3f2015-04-14 18:13:13 +02001339 if (!azx_dev)
1340 return -ENOMEM;
1341
1342 dir = stream_direction(chip, i);
Rafal Redzimski93e34232014-12-19 08:44:30 +08001343 /* stream tag must be unique throughout
1344 * the stream direction group,
1345 * valid values 1...15
1346 * use separate stream tag if the flag
1347 * AZX_DCAPS_SEPARATE_STREAM_TAG is used
1348 */
1349 if (chip->driver_caps & AZX_DCAPS_SEPARATE_STREAM_TAG)
Takashi Iwai7833c3f2015-04-14 18:13:13 +02001350 tag = ++stream_tags[dir];
Rafal Redzimski93e34232014-12-19 08:44:30 +08001351 else
Takashi Iwai7833c3f2015-04-14 18:13:13 +02001352 tag = i + 1;
1353 snd_hdac_stream_init(azx_bus(chip), azx_stream(azx_dev),
1354 i, dir, tag);
Dylan Reid154867c2014-02-28 15:41:30 -08001355 }
1356
1357 return 0;
1358}
Takashi Iwaia41d1222015-04-14 22:13:18 +02001359EXPORT_SYMBOL_GPL(azx_init_streams);
1360
1361void azx_free_streams(struct azx *chip)
1362{
1363 struct hdac_bus *bus = azx_bus(chip);
1364 struct hdac_stream *s;
1365
1366 while (!list_empty(&bus->stream_list)) {
1367 s = list_first_entry(&bus->stream_list, struct hdac_stream, list);
1368 list_del(&s->list);
1369 kfree(stream_to_azx_dev(s));
1370 }
1371}
1372EXPORT_SYMBOL_GPL(azx_free_streams);