intel_hdmi_audio.c 52.7 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/*
 *   intel_hdmi_audio.c - Intel HDMI audio driver
 *
 *  Copyright (C) 2016 Intel Corp
 *  Authors:	Sailaja Bandarupalli <sailaja.bandarupalli@intel.com>
 *		Ramesh Babu K V	<ramesh.babu@intel.com>
 *		Vaibhav Agarwal <vaibhav.agarwal@intel.com>
 *		Jerome Anand <jerome.anand@intel.com>
 *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; version 2 of the License.
 *
 *  This program is distributed in the hope that it will be useful, but
 *  WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  General Public License for more details.
 *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * ALSA driver for Intel HDMI audio
 */

24
#include <linux/types.h>
25 26 27 28
#include <linux/platform_device.h>
#include <linux/io.h>
#include <linux/slab.h>
#include <linux/module.h>
29
#include <linux/interrupt.h>
30
#include <linux/pm_runtime.h>
31
#include <linux/dma-mapping.h>
32
#include <linux/delay.h>
L
Laura Abbott 已提交
33
#include <asm/set_memory.h>
34
#include <sound/core.h>
35 36
#include <sound/asoundef.h>
#include <sound/pcm.h>
37 38 39
#include <sound/pcm_params.h>
#include <sound/initval.h>
#include <sound/control.h>
T
Takashi Iwai 已提交
40
#include <sound/jack.h>
41
#include <drm/drm_edid.h>
42
#include <drm/intel_lpe_audio.h>
43 44
#include "intel_hdmi_audio.h"

45 46
#define for_each_pipe(card_ctx, pipe) \
	for ((pipe) = 0; (pipe) < (card_ctx)->num_pipes; (pipe)++)
47 48 49
#define for_each_port(card_ctx, port) \
	for ((port) = 0; (port) < (card_ctx)->num_ports; (port)++)

50 51 52
/*standard module options for ALSA. This module supports only one card*/
static int hdmi_card_index = SNDRV_DEFAULT_IDX1;
static char *hdmi_card_id = SNDRV_DEFAULT_STR1;
53
static bool single_port;
54 55 56 57 58 59 60

module_param_named(index, hdmi_card_index, int, 0444);
MODULE_PARM_DESC(index,
		"Index value for INTEL Intel HDMI Audio controller.");
module_param_named(id, hdmi_card_id, charp, 0444);
MODULE_PARM_DESC(id,
		"ID string for INTEL Intel HDMI Audio controller.");
61 62 63
module_param(single_port, bool, 0444);
MODULE_PARM_DESC(single_port,
		"Single-port mode (for compatibility)");
64 65 66 67

/*
 * ELD SA bits in the CEA Speaker Allocation data block
 */
T
Takashi Iwai 已提交
68
static const int eld_speaker_allocation_bits[] = {
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
	[0] = FL | FR,
	[1] = LFE,
	[2] = FC,
	[3] = RL | RR,
	[4] = RC,
	[5] = FLC | FRC,
	[6] = RLC | RRC,
	/* the following are not defined in ELD yet */
	[7] = 0,
};

/*
 * This is an ordered list!
 *
 * The preceding ones have better chances to be selected by
 * hdmi_channel_allocation().
 */
static struct cea_channel_speaker_allocation channel_allocations[] = {
/*                        channel:   7     6    5    4    3     2    1    0  */
{ .ca_index = 0x00,  .speakers = {   0,    0,   0,   0,   0,    0,  FR,  FL } },
				/* 2.1 */
{ .ca_index = 0x01,  .speakers = {   0,    0,   0,   0,   0,  LFE,  FR,  FL } },
				/* Dolby Surround */
{ .ca_index = 0x02,  .speakers = {   0,    0,   0,   0,  FC,    0,  FR,  FL } },
				/* surround40 */
{ .ca_index = 0x08,  .speakers = {   0,    0,  RR,  RL,   0,    0,  FR,  FL } },
				/* surround41 */
{ .ca_index = 0x09,  .speakers = {   0,    0,  RR,  RL,   0,  LFE,  FR,  FL } },
				/* surround50 */
{ .ca_index = 0x0a,  .speakers = {   0,    0,  RR,  RL,  FC,    0,  FR,  FL } },
				/* surround51 */
{ .ca_index = 0x0b,  .speakers = {   0,    0,  RR,  RL,  FC,  LFE,  FR,  FL } },
				/* 6.1 */
{ .ca_index = 0x0f,  .speakers = {   0,   RC,  RR,  RL,  FC,  LFE,  FR,  FL } },
				/* surround71 */
{ .ca_index = 0x13,  .speakers = { RRC,  RLC,  RR,  RL,  FC,  LFE,  FR,  FL } },

{ .ca_index = 0x03,  .speakers = {   0,    0,   0,   0,  FC,  LFE,  FR,  FL } },
{ .ca_index = 0x04,  .speakers = {   0,    0,   0,  RC,   0,    0,  FR,  FL } },
{ .ca_index = 0x05,  .speakers = {   0,    0,   0,  RC,   0,  LFE,  FR,  FL } },
{ .ca_index = 0x06,  .speakers = {   0,    0,   0,  RC,  FC,    0,  FR,  FL } },
{ .ca_index = 0x07,  .speakers = {   0,    0,   0,  RC,  FC,  LFE,  FR,  FL } },
{ .ca_index = 0x0c,  .speakers = {   0,   RC,  RR,  RL,   0,    0,  FR,  FL } },
{ .ca_index = 0x0d,  .speakers = {   0,   RC,  RR,  RL,   0,  LFE,  FR,  FL } },
{ .ca_index = 0x0e,  .speakers = {   0,   RC,  RR,  RL,  FC,    0,  FR,  FL } },
{ .ca_index = 0x10,  .speakers = { RRC,  RLC,  RR,  RL,   0,    0,  FR,  FL } },
{ .ca_index = 0x11,  .speakers = { RRC,  RLC,  RR,  RL,   0,  LFE,  FR,  FL } },
{ .ca_index = 0x12,  .speakers = { RRC,  RLC,  RR,  RL,  FC,    0,  FR,  FL } },
{ .ca_index = 0x14,  .speakers = { FRC,  FLC,   0,   0,   0,    0,  FR,  FL } },
{ .ca_index = 0x15,  .speakers = { FRC,  FLC,   0,   0,   0,  LFE,  FR,  FL } },
{ .ca_index = 0x16,  .speakers = { FRC,  FLC,   0,   0,  FC,    0,  FR,  FL } },
{ .ca_index = 0x17,  .speakers = { FRC,  FLC,   0,   0,  FC,  LFE,  FR,  FL } },
{ .ca_index = 0x18,  .speakers = { FRC,  FLC,   0,  RC,   0,    0,  FR,  FL } },
{ .ca_index = 0x19,  .speakers = { FRC,  FLC,   0,  RC,   0,  LFE,  FR,  FL } },
{ .ca_index = 0x1a,  .speakers = { FRC,  FLC,   0,  RC,  FC,    0,  FR,  FL } },
{ .ca_index = 0x1b,  .speakers = { FRC,  FLC,   0,  RC,  FC,  LFE,  FR,  FL } },
{ .ca_index = 0x1c,  .speakers = { FRC,  FLC,  RR,  RL,   0,    0,  FR,  FL } },
{ .ca_index = 0x1d,  .speakers = { FRC,  FLC,  RR,  RL,   0,  LFE,  FR,  FL } },
{ .ca_index = 0x1e,  .speakers = { FRC,  FLC,  RR,  RL,  FC,    0,  FR,  FL } },
{ .ca_index = 0x1f,  .speakers = { FRC,  FLC,  RR,  RL,  FC,  LFE,  FR,  FL } },
};

T
Takashi Iwai 已提交
131
static const struct channel_map_table map_tables[] = {
132 133 134 135 136 137 138 139 140 141 142 143
	{ SNDRV_CHMAP_FL,       0x00,   FL },
	{ SNDRV_CHMAP_FR,       0x01,   FR },
	{ SNDRV_CHMAP_RL,       0x04,   RL },
	{ SNDRV_CHMAP_RR,       0x05,   RR },
	{ SNDRV_CHMAP_LFE,      0x02,   LFE },
	{ SNDRV_CHMAP_FC,       0x03,   FC },
	{ SNDRV_CHMAP_RLC,      0x06,   RLC },
	{ SNDRV_CHMAP_RRC,      0x07,   RRC },
	{} /* terminator */
};

/* hardware capability structure */
144
static const struct snd_pcm_hardware had_pcm_hardware = {
145
	.info =	(SNDRV_PCM_INFO_INTERLEAVED |
146
		SNDRV_PCM_INFO_MMAP |
147 148
		SNDRV_PCM_INFO_MMAP_VALID |
		SNDRV_PCM_INFO_NO_PERIOD_WAKEUP),
T
Takashi Iwai 已提交
149 150
	.formats = (SNDRV_PCM_FMTBIT_S16_LE |
		    SNDRV_PCM_FMTBIT_S24_LE |
T
Takashi Iwai 已提交
151
		    SNDRV_PCM_FMTBIT_S32_LE),
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
	.rates = SNDRV_PCM_RATE_32000 |
		SNDRV_PCM_RATE_44100 |
		SNDRV_PCM_RATE_48000 |
		SNDRV_PCM_RATE_88200 |
		SNDRV_PCM_RATE_96000 |
		SNDRV_PCM_RATE_176400 |
		SNDRV_PCM_RATE_192000,
	.rate_min = HAD_MIN_RATE,
	.rate_max = HAD_MAX_RATE,
	.channels_min = HAD_MIN_CHANNEL,
	.channels_max = HAD_MAX_CHANNEL,
	.buffer_bytes_max = HAD_MAX_BUFFER,
	.period_bytes_min = HAD_MIN_PERIOD_BYTES,
	.period_bytes_max = HAD_MAX_PERIOD_BYTES,
	.periods_min = HAD_MIN_PERIODS,
	.periods_max = HAD_MAX_PERIODS,
	.fifo_size = HAD_FIFO_SIZE,
};

171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
/* Get the active PCM substream;
 * Call had_substream_put() for unreferecing.
 * Don't call this inside had_spinlock, as it takes by itself
 */
static struct snd_pcm_substream *
had_substream_get(struct snd_intelhad *intelhaddata)
{
	struct snd_pcm_substream *substream;
	unsigned long flags;

	spin_lock_irqsave(&intelhaddata->had_spinlock, flags);
	substream = intelhaddata->stream_info.substream;
	if (substream)
		intelhaddata->stream_info.substream_refcount++;
	spin_unlock_irqrestore(&intelhaddata->had_spinlock, flags);
	return substream;
}

/* Unref the active PCM substream;
 * Don't call this inside had_spinlock, as it takes by itself
 */
static void had_substream_put(struct snd_intelhad *intelhaddata)
{
	unsigned long flags;

	spin_lock_irqsave(&intelhaddata->had_spinlock, flags);
	intelhaddata->stream_info.substream_refcount--;
	spin_unlock_irqrestore(&intelhaddata->had_spinlock, flags);
}

201 202 203 204 205 206 207 208 209 210 211 212 213
static u32 had_config_offset(int pipe)
{
	switch (pipe) {
	default:
	case 0:
		return AUDIO_HDMI_CONFIG_A;
	case 1:
		return AUDIO_HDMI_CONFIG_B;
	case 2:
		return AUDIO_HDMI_CONFIG_C;
	}
}

214
/* Register access functions */
215 216
static u32 had_read_register_raw(struct snd_intelhad_card *card_ctx,
				 int pipe, u32 reg)
217
{
218
	return ioread32(card_ctx->mmio_start + had_config_offset(pipe) + reg);
219 220
}

221 222
static void had_write_register_raw(struct snd_intelhad_card *card_ctx,
				   int pipe, u32 reg, u32 val)
223
{
224
	iowrite32(val, card_ctx->mmio_start + had_config_offset(pipe) + reg);
225 226
}

227
static void had_read_register(struct snd_intelhad *ctx, u32 reg, u32 *val)
228
{
229 230 231
	if (!ctx->connected)
		*val = 0;
	else
232
		*val = had_read_register_raw(ctx->card_ctx, ctx->pipe, reg);
233 234
}

235
static void had_write_register(struct snd_intelhad *ctx, u32 reg, u32 val)
236
{
237
	if (ctx->connected)
238
		had_write_register_raw(ctx->card_ctx, ctx->pipe, reg, val);
239 240
}

241
/*
242 243
 * enable / disable audio configuration
 *
244
 * The normal read/modify should not directly be used on VLV2 for
245
 * updating AUD_CONFIG register.
246 247 248 249 250 251 252 253 254 255
 * This is because:
 * Bit6 of AUD_CONFIG register is writeonly due to a silicon bug on VLV2
 * HDMI IP. As a result a read-modify of AUD_CONFIG regiter will always
 * clear bit6. AUD_CONFIG[6:4] represents the "channels" field of the
 * register. This field should be 1xy binary for configuration with 6 or
 * more channels. Read-modify of AUD_CONFIG (Eg. for enabling audio)
 * causes the "channels" field to be updated as 0xy binary resulting in
 * bad audio. The fix is to always write the AUD_CONFIG[6:4] with
 * appropriate value when doing read-modify of AUD_CONFIG register.
 */
256
static void had_enable_audio(struct snd_intelhad *intelhaddata,
257
			     bool enable)
258
{
259 260 261 262
	/* update the cached value */
	intelhaddata->aud_config.regx.aud_en = enable;
	had_write_register(intelhaddata, AUD_CONFIG,
			   intelhaddata->aud_config.regval);
263 264
}

265 266
/* forcibly ACKs to both BUFFER_DONE and BUFFER_UNDERRUN interrupts */
static void had_ack_irqs(struct snd_intelhad *ctx)
267 268 269
{
	u32 status_reg;

270 271
	if (!ctx->connected)
		return;
272 273 274 275
	had_read_register(ctx, AUD_HDMI_STATUS, &status_reg);
	status_reg |= HDMI_AUDIO_BUFFER_DONE | HDMI_AUDIO_UNDERRUN;
	had_write_register(ctx, AUD_HDMI_STATUS, status_reg);
	had_read_register(ctx, AUD_HDMI_STATUS, &status_reg);
276 277
}

278 279
/* Reset buffer pointers */
static void had_reset_audio(struct snd_intelhad *intelhaddata)
280
{
T
Takashi Iwai 已提交
281 282
	had_write_register(intelhaddata, AUD_HDMI_STATUS,
			   AUD_HDMI_STATUSG_MASK_FUNCRST);
283
	had_write_register(intelhaddata, AUD_HDMI_STATUS, 0);
284 285
}

T
Takashi Iwai 已提交
286
/*
287 288 289 290 291 292
 * initialize audio channel status registers
 * This function is called in the prepare callback
 */
static int had_prog_status_reg(struct snd_pcm_substream *substream,
			struct snd_intelhad *intelhaddata)
{
293 294
	union aud_ch_status_0 ch_stat0 = {.regval = 0};
	union aud_ch_status_1 ch_stat1 = {.regval = 0};
295

296
	ch_stat0.regx.lpcm_id = (intelhaddata->aes_bits &
T
Takashi Iwai 已提交
297
					  IEC958_AES0_NONAUDIO) >> 1;
298
	ch_stat0.regx.clk_acc = (intelhaddata->aes_bits &
T
Takashi Iwai 已提交
299
					  IEC958_AES3_CON_CLOCK) >> 4;
300 301 302

	switch (substream->runtime->rate) {
	case AUD_SAMPLE_RATE_32:
303
		ch_stat0.regx.samp_freq = CH_STATUS_MAP_32KHZ;
304 305 306
		break;

	case AUD_SAMPLE_RATE_44_1:
307
		ch_stat0.regx.samp_freq = CH_STATUS_MAP_44KHZ;
308 309
		break;
	case AUD_SAMPLE_RATE_48:
310
		ch_stat0.regx.samp_freq = CH_STATUS_MAP_48KHZ;
311 312
		break;
	case AUD_SAMPLE_RATE_88_2:
313
		ch_stat0.regx.samp_freq = CH_STATUS_MAP_88KHZ;
314 315
		break;
	case AUD_SAMPLE_RATE_96:
316
		ch_stat0.regx.samp_freq = CH_STATUS_MAP_96KHZ;
317 318
		break;
	case AUD_SAMPLE_RATE_176_4:
319
		ch_stat0.regx.samp_freq = CH_STATUS_MAP_176KHZ;
320 321
		break;
	case AUD_SAMPLE_RATE_192:
322
		ch_stat0.regx.samp_freq = CH_STATUS_MAP_192KHZ;
323 324 325 326 327 328
		break;

	default:
		/* control should never come here */
		return -EINVAL;
	}
T
Takashi Iwai 已提交
329

330
	had_write_register(intelhaddata,
331
			   AUD_CH_STATUS_0, ch_stat0.regval);
332

T
Takashi Iwai 已提交
333 334
	switch (substream->runtime->format) {
	case SNDRV_PCM_FORMAT_S16_LE:
335 336
		ch_stat1.regx.max_wrd_len = MAX_SMPL_WIDTH_20;
		ch_stat1.regx.wrd_len = SMPL_WIDTH_16BITS;
T
Takashi Iwai 已提交
337 338 339
		break;
	case SNDRV_PCM_FORMAT_S24_LE:
	case SNDRV_PCM_FORMAT_S32_LE:
340 341
		ch_stat1.regx.max_wrd_len = MAX_SMPL_WIDTH_24;
		ch_stat1.regx.wrd_len = SMPL_WIDTH_24BITS;
T
Takashi Iwai 已提交
342 343 344
		break;
	default:
		return -EINVAL;
345
	}
T
Takashi Iwai 已提交
346

347
	had_write_register(intelhaddata,
348
			   AUD_CH_STATUS_1, ch_stat1.regval);
349 350 351
	return 0;
}

352
/*
353 354 355 356
 * function to initialize audio
 * registers and buffer confgiuration registers
 * This function is called in the prepare callback
 */
357 358
static int had_init_audio_ctrl(struct snd_pcm_substream *substream,
			       struct snd_intelhad *intelhaddata)
359
{
360 361
	union aud_cfg cfg_val = {.regval = 0};
	union aud_buf_config buf_cfg = {.regval = 0};
362 363 364 365
	u8 channels;

	had_prog_status_reg(substream, intelhaddata);

366 367 368 369
	buf_cfg.regx.audio_fifo_watermark = FIFO_THRESHOLD;
	buf_cfg.regx.dma_fifo_watermark = DMA_FIFO_THRESHOLD;
	buf_cfg.regx.aud_delay = 0;
	had_write_register(intelhaddata, AUD_BUF_CONFIG, buf_cfg.regval);
370 371

	channels = substream->runtime->channels;
372
	cfg_val.regx.num_ch = channels - 2;
373
	if (channels <= 2)
374
		cfg_val.regx.layout = LAYOUT0;
375
	else
376
		cfg_val.regx.layout = LAYOUT1;
377

T
Takashi Iwai 已提交
378 379 380
	if (substream->runtime->format == SNDRV_PCM_FORMAT_S16_LE)
		cfg_val.regx.packet_mode = 1;

T
Takashi Iwai 已提交
381 382 383
	if (substream->runtime->format == SNDRV_PCM_FORMAT_S32_LE)
		cfg_val.regx.left_align = 1;

384
	cfg_val.regx.val_bit = 1;
385 386 387 388 389 390 391

	/* fix up the DP bits */
	if (intelhaddata->dp_output) {
		cfg_val.regx.dp_modei = 1;
		cfg_val.regx.set = 1;
	}

392
	had_write_register(intelhaddata, AUD_CONFIG, cfg_val.regval);
393
	intelhaddata->aud_config = cfg_val;
394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424
	return 0;
}

/*
 * Compute derived values in channel_allocations[].
 */
static void init_channel_allocations(void)
{
	int i, j;
	struct cea_channel_speaker_allocation *p;

	for (i = 0; i < ARRAY_SIZE(channel_allocations); i++) {
		p = channel_allocations + i;
		p->channels = 0;
		p->spk_mask = 0;
		for (j = 0; j < ARRAY_SIZE(p->speakers); j++)
			if (p->speakers[j]) {
				p->channels++;
				p->spk_mask |= p->speakers[j];
			}
	}
}

/*
 * The transformation takes two steps:
 *
 *      eld->spk_alloc => (eld_speaker_allocation_bits[]) => spk_mask
 *            spk_mask => (channel_allocations[])         => ai->CA
 *
 * TODO: it could select the wrong CA from multiple candidates.
 */
425 426
static int had_channel_allocation(struct snd_intelhad *intelhaddata,
				  int channels)
427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445
{
	int i;
	int ca = 0;
	int spk_mask = 0;

	/*
	 * CA defaults to 0 for basic stereo audio
	 */
	if (channels <= 2)
		return 0;

	/*
	 * expand ELD's speaker allocation mask
	 *
	 * ELD tells the speaker mask in a compact(paired) form,
	 * expand ELD's notions to match the ones used by Audio InfoFrame.
	 */

	for (i = 0; i < ARRAY_SIZE(eld_speaker_allocation_bits); i++) {
446
		if (intelhaddata->eld[DRM_ELD_SPEAKER] & (1 << i))
447 448 449 450 451 452 453 454 455 456 457 458 459
			spk_mask |= eld_speaker_allocation_bits[i];
	}

	/* search for the first working match in the CA table */
	for (i = 0; i < ARRAY_SIZE(channel_allocations); i++) {
		if (channels == channel_allocations[i].channels &&
		(spk_mask & channel_allocations[i].spk_mask) ==
				channel_allocations[i].spk_mask) {
			ca = channel_allocations[i].ca_index;
			break;
		}
	}

460
	dev_dbg(intelhaddata->dev, "select CA 0x%x for %d\n", ca, channels);
461 462 463 464 465 466 467

	return ca;
}

/* from speaker bit mask to ALSA API channel position */
static int spk_to_chmap(int spk)
{
T
Takashi Iwai 已提交
468
	const struct channel_map_table *t = map_tables;
469 470 471 472 473 474 475 476

	for (; t->map; t++) {
		if (t->spk_mask == spk)
			return t->map;
	}
	return 0;
}

477
static void had_build_channel_allocation_map(struct snd_intelhad *intelhaddata)
478
{
T
Takashi Iwai 已提交
479
	int i, c;
480 481 482 483 484
	int spk_mask = 0;
	struct snd_pcm_chmap_elem *chmap;
	u8 eld_high, eld_high_mask = 0xF0;
	u8 high_msb;

485 486 487
	kfree(intelhaddata->chmap->chmap);
	intelhaddata->chmap->chmap = NULL;

488
	chmap = kzalloc(sizeof(*chmap), GFP_KERNEL);
489
	if (!chmap)
490 491
		return;

492 493
	dev_dbg(intelhaddata->dev, "eld speaker = %x\n",
		intelhaddata->eld[DRM_ELD_SPEAKER]);
494 495 496 497 498 499 500 501 502 503

	/* WA: Fix the max channel supported to 8 */

	/*
	 * Sink may support more than 8 channels, if eld_high has more than
	 * one bit set. SOC supports max 8 channels.
	 * Refer eld_speaker_allocation_bits, for sink speaker allocation
	 */

	/* if 0x2F < eld < 0x4F fall back to 0x2f, else fall back to 0x4F */
504
	eld_high = intelhaddata->eld[DRM_ELD_SPEAKER] & eld_high_mask;
505 506 507 508 509 510
	if ((eld_high & (eld_high-1)) && (eld_high > 0x1F)) {
		/* eld_high & (eld_high-1): if more than 1 bit set */
		/* 0x1F: 7 channels */
		for (i = 1; i < 4; i++) {
			high_msb = eld_high & (0x80 >> i);
			if (high_msb) {
511
				intelhaddata->eld[DRM_ELD_SPEAKER] &=
512 513 514 515 516 517 518
					high_msb | 0xF;
				break;
			}
		}
	}

	for (i = 0; i < ARRAY_SIZE(eld_speaker_allocation_bits); i++) {
519
		if (intelhaddata->eld[DRM_ELD_SPEAKER] & (1 << i))
520 521 522 523 524 525 526 527
			spk_mask |= eld_speaker_allocation_bits[i];
	}

	for (i = 0; i < ARRAY_SIZE(channel_allocations); i++) {
		if (spk_mask == channel_allocations[i].spk_mask) {
			for (c = 0; c < channel_allocations[i].channels; c++) {
				chmap->map[c] = spk_to_chmap(
					channel_allocations[i].speakers[
T
Takashi Iwai 已提交
528
						(MAX_SPEAKERS - 1) - c]);
529 530 531 532 533 534
			}
			chmap->channels = channel_allocations[i].channels;
			intelhaddata->chmap->chmap = chmap;
			break;
		}
	}
535
	if (i >= ARRAY_SIZE(channel_allocations))
536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556
		kfree(chmap);
}

/*
 * ALSA API channel-map control callbacks
 */
static int had_chmap_ctl_info(struct snd_kcontrol *kcontrol,
				struct snd_ctl_elem_info *uinfo)
{
	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
	uinfo->count = HAD_MAX_CHANNEL;
	uinfo->value.integer.min = 0;
	uinfo->value.integer.max = SNDRV_CHMAP_LAST;
	return 0;
}

static int had_chmap_ctl_get(struct snd_kcontrol *kcontrol,
				struct snd_ctl_elem_value *ucontrol)
{
	struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol);
	struct snd_intelhad *intelhaddata = info->private_data;
T
Takashi Iwai 已提交
557
	int i;
558 559
	const struct snd_pcm_chmap_elem *chmap;

560 561
	memset(ucontrol->value.integer.value, 0,
	       sizeof(long) * HAD_MAX_CHANNEL);
562 563 564
	mutex_lock(&intelhaddata->mutex);
	if (!intelhaddata->chmap->chmap) {
		mutex_unlock(&intelhaddata->mutex);
565
		return 0;
566 567
	}

568
	chmap = intelhaddata->chmap->chmap;
569
	for (i = 0; i < chmap->channels; i++)
570
		ucontrol->value.integer.value[i] = chmap->map[i];
571
	mutex_unlock(&intelhaddata->mutex);
572 573 574 575 576 577 578

	return 0;
}

static int had_register_chmap_ctls(struct snd_intelhad *intelhaddata,
						struct snd_pcm *pcm)
{
T
Takashi Iwai 已提交
579
	int err;
580 581 582 583 584 585 586 587

	err = snd_pcm_add_chmap_ctls(pcm, SNDRV_PCM_STREAM_PLAYBACK,
			NULL, 0, (unsigned long)intelhaddata,
			&intelhaddata->chmap);
	if (err < 0)
		return err;

	intelhaddata->chmap->private_data = intelhaddata;
588 589
	intelhaddata->chmap->kctl->info = had_chmap_ctl_info;
	intelhaddata->chmap->kctl->get = had_chmap_ctl_get;
590 591 592 593
	intelhaddata->chmap->chmap = NULL;
	return 0;
}

594
/*
T
Takashi Iwai 已提交
595
 * Initialize Data Island Packets registers
596 597
 * This function is called in the prepare callback
 */
598 599
static void had_prog_dip(struct snd_pcm_substream *substream,
			 struct snd_intelhad *intelhaddata)
600 601
{
	int i;
602 603 604
	union aud_ctrl_st ctrl_state = {.regval = 0};
	union aud_info_frame2 frame2 = {.regval = 0};
	union aud_info_frame3 frame3 = {.regval = 0};
605
	u8 checksum = 0;
606
	u32 info_frame;
607
	int channels;
608
	int ca;
609 610 611

	channels = substream->runtime->channels;

612
	had_write_register(intelhaddata, AUD_CNTL_ST, ctrl_state.regval);
613

614
	ca = had_channel_allocation(intelhaddata, channels);
615 616
	if (intelhaddata->dp_output) {
		info_frame = DP_INFO_FRAME_WORD1;
617
		frame2.regval = (substream->runtime->channels - 1) | (ca << 24);
618 619
	} else {
		info_frame = HDMI_INFO_FRAME_WORD1;
620
		frame2.regx.chnl_cnt = substream->runtime->channels - 1;
621
		frame3.regx.chnl_alloc = ca;
622

T
Takashi Iwai 已提交
623
		/* Calculte the byte wide checksum for all valid DIP words */
624
		for (i = 0; i < BYTES_PER_WORD; i++)
625
			checksum += (info_frame >> (i * 8)) & 0xff;
626
		for (i = 0; i < BYTES_PER_WORD; i++)
627
			checksum += (frame2.regval >> (i * 8)) & 0xff;
628
		for (i = 0; i < BYTES_PER_WORD; i++)
629
			checksum += (frame3.regval >> (i * 8)) & 0xff;
630

631
		frame2.regx.chksum = -(checksum);
632
	}
633

T
Takashi Iwai 已提交
634
	had_write_register(intelhaddata, AUD_HDMIW_INFOFR, info_frame);
635 636
	had_write_register(intelhaddata, AUD_HDMIW_INFOFR, frame2.regval);
	had_write_register(intelhaddata, AUD_HDMIW_INFOFR, frame3.regval);
637 638 639

	/* program remaining DIP words with zero */
	for (i = 0; i < HAD_MAX_DIP_WORDS-VALID_DIP_WORDS; i++)
T
Takashi Iwai 已提交
640
		had_write_register(intelhaddata, AUD_HDMIW_INFOFR, 0x0);
641

642 643 644
	ctrl_state.regx.dip_freq = 1;
	ctrl_state.regx.dip_en_sta = 1;
	had_write_register(intelhaddata, AUD_CNTL_ST, ctrl_state.regval);
645 646
}

647 648 649 650
static int had_calculate_maud_value(u32 aud_samp_freq, u32 link_rate)
{
	u32 maud_val;

T
Takashi Iwai 已提交
651
	/* Select maud according to DP 1.2 spec */
652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725
	if (link_rate == DP_2_7_GHZ) {
		switch (aud_samp_freq) {
		case AUD_SAMPLE_RATE_32:
			maud_val = AUD_SAMPLE_RATE_32_DP_2_7_MAUD_VAL;
			break;

		case AUD_SAMPLE_RATE_44_1:
			maud_val = AUD_SAMPLE_RATE_44_1_DP_2_7_MAUD_VAL;
			break;

		case AUD_SAMPLE_RATE_48:
			maud_val = AUD_SAMPLE_RATE_48_DP_2_7_MAUD_VAL;
			break;

		case AUD_SAMPLE_RATE_88_2:
			maud_val = AUD_SAMPLE_RATE_88_2_DP_2_7_MAUD_VAL;
			break;

		case AUD_SAMPLE_RATE_96:
			maud_val = AUD_SAMPLE_RATE_96_DP_2_7_MAUD_VAL;
			break;

		case AUD_SAMPLE_RATE_176_4:
			maud_val = AUD_SAMPLE_RATE_176_4_DP_2_7_MAUD_VAL;
			break;

		case HAD_MAX_RATE:
			maud_val = HAD_MAX_RATE_DP_2_7_MAUD_VAL;
			break;

		default:
			maud_val = -EINVAL;
			break;
		}
	} else if (link_rate == DP_1_62_GHZ) {
		switch (aud_samp_freq) {
		case AUD_SAMPLE_RATE_32:
			maud_val = AUD_SAMPLE_RATE_32_DP_1_62_MAUD_VAL;
			break;

		case AUD_SAMPLE_RATE_44_1:
			maud_val = AUD_SAMPLE_RATE_44_1_DP_1_62_MAUD_VAL;
			break;

		case AUD_SAMPLE_RATE_48:
			maud_val = AUD_SAMPLE_RATE_48_DP_1_62_MAUD_VAL;
			break;

		case AUD_SAMPLE_RATE_88_2:
			maud_val = AUD_SAMPLE_RATE_88_2_DP_1_62_MAUD_VAL;
			break;

		case AUD_SAMPLE_RATE_96:
			maud_val = AUD_SAMPLE_RATE_96_DP_1_62_MAUD_VAL;
			break;

		case AUD_SAMPLE_RATE_176_4:
			maud_val = AUD_SAMPLE_RATE_176_4_DP_1_62_MAUD_VAL;
			break;

		case HAD_MAX_RATE:
			maud_val = HAD_MAX_RATE_DP_1_62_MAUD_VAL;
			break;

		default:
			maud_val = -EINVAL;
			break;
		}
	} else
		maud_val = -EINVAL;

	return maud_val;
}

726
/*
T
Takashi Iwai 已提交
727
 * Program HDMI audio CTS value
728 729 730
 *
 * @aud_samp_freq: sampling frequency of audio data
 * @tmds: sampling frequency of the display data
731
 * @link_rate: DP link rate
732
 * @n_param: N value, depends on aud_samp_freq
733
 * @intelhaddata: substream private data
734 735 736
 *
 * Program CTS register based on the audio and display sampling frequency
 */
737 738
static void had_prog_cts(u32 aud_samp_freq, u32 tmds, u32 link_rate,
			 u32 n_param, struct snd_intelhad *intelhaddata)
739 740 741 742
{
	u32 cts_val;
	u64 dividend, divisor;

743 744 745 746 747 748 749 750 751
	if (intelhaddata->dp_output) {
		/* Substitute cts_val with Maud according to DP 1.2 spec*/
		cts_val = had_calculate_maud_value(aud_samp_freq, link_rate);
	} else {
		/* Calculate CTS according to HDMI 1.3a spec*/
		dividend = (u64)tmds * n_param*1000;
		divisor = 128 * aud_samp_freq;
		cts_val = div64_u64(dividend, divisor);
	}
752
	dev_dbg(intelhaddata->dev, "TMDS value=%d, N value=%d, CTS Value=%d\n",
753
		 tmds, n_param, cts_val);
754
	had_write_register(intelhaddata, AUD_HDMI_CTS, (BIT(24) | cts_val));
755 756 757 758
}

static int had_calculate_n_value(u32 aud_samp_freq)
{
T
Takashi Iwai 已提交
759
	int n_val;
760 761 762 763 764

	/* Select N according to HDMI 1.3a spec*/
	switch (aud_samp_freq) {
	case AUD_SAMPLE_RATE_32:
		n_val = 4096;
T
Takashi Iwai 已提交
765
		break;
766 767 768

	case AUD_SAMPLE_RATE_44_1:
		n_val = 6272;
T
Takashi Iwai 已提交
769
		break;
770 771 772

	case AUD_SAMPLE_RATE_48:
		n_val = 6144;
T
Takashi Iwai 已提交
773
		break;
774 775 776

	case AUD_SAMPLE_RATE_88_2:
		n_val = 12544;
T
Takashi Iwai 已提交
777
		break;
778 779 780

	case AUD_SAMPLE_RATE_96:
		n_val = 12288;
T
Takashi Iwai 已提交
781
		break;
782 783 784

	case AUD_SAMPLE_RATE_176_4:
		n_val = 25088;
T
Takashi Iwai 已提交
785
		break;
786 787 788

	case HAD_MAX_RATE:
		n_val = 24576;
T
Takashi Iwai 已提交
789
		break;
790 791 792

	default:
		n_val = -EINVAL;
T
Takashi Iwai 已提交
793
		break;
794 795 796 797
	}
	return n_val;
}

798
/*
T
Takashi Iwai 已提交
799
 * Program HDMI audio N value
800 801 802
 *
 * @aud_samp_freq: sampling frequency of audio data
 * @n_param: N value, depends on aud_samp_freq
803
 * @intelhaddata: substream private data
804 805 806 807
 *
 * This function is called in the prepare callback.
 * It programs based on the audio and display sampling frequency
 */
808 809
static int had_prog_n(u32 aud_samp_freq, u32 *n_param,
		      struct snd_intelhad *intelhaddata)
810
{
T
Takashi Iwai 已提交
811
	int n_val;
812

813 814 815 816 817 818 819 820 821 822 823 824
	if (intelhaddata->dp_output) {
		/*
		 * According to DP specs, Maud and Naud values hold
		 * a relationship, which is stated as:
		 * Maud/Naud = 512 * fs / f_LS_Clk
		 * where, fs is the sampling frequency of the audio stream
		 * and Naud is 32768 for Async clock.
		 */

		n_val = DP_NAUD_VAL;
	} else
		n_val =	had_calculate_n_value(aud_samp_freq);
825 826 827 828

	if (n_val < 0)
		return n_val;

829
	had_write_register(intelhaddata, AUD_N_ENABLE, (BIT(24) | n_val));
830 831 832 833
	*n_param = n_val;
	return 0;
}

834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866
/*
 * PCM ring buffer handling
 *
 * The hardware provides a ring buffer with the fixed 4 buffer descriptors
 * (BDs).  The driver maps these 4 BDs onto the PCM ring buffer.  The mapping
 * moves at each period elapsed.  The below illustrates how it works:
 *
 * At time=0
 *  PCM | 0 | 1 | 2 | 3 | 4 | 5 | .... |n-1|
 *  BD  | 0 | 1 | 2 | 3 |
 *
 * At time=1 (period elapsed)
 *  PCM | 0 | 1 | 2 | 3 | 4 | 5 | .... |n-1|
 *  BD      | 1 | 2 | 3 | 0 |
 *
 * At time=2 (second period elapsed)
 *  PCM | 0 | 1 | 2 | 3 | 4 | 5 | .... |n-1|
 *  BD          | 2 | 3 | 0 | 1 |
 *
 * The bd_head field points to the index of the BD to be read.  It's also the
 * position to be filled at next.  The pcm_head and the pcm_filled fields
 * point to the indices of the current position and of the next position to
 * be filled, respectively.  For PCM buffer there are both _head and _filled
 * because they may be difference when nperiods > 4.  For example, in the
 * example above at t=1, bd_head=1 and pcm_head=1 while pcm_filled=5:
 *
 * pcm_head (=1) --v               v-- pcm_filled (=5)
 *       PCM | 0 | 1 | 2 | 3 | 4 | 5 | .... |n-1|
 *       BD      | 1 | 2 | 3 | 0 |
 *  bd_head (=1) --^               ^-- next to fill (= bd_head)
 *
 * For nperiods < 4, the remaining BDs out of 4 are marked as invalid, so that
 * the hardware skips those BDs in the loop.
867 868 869 870 871
 *
 * An exceptional setup is the case with nperiods=1.  Since we have to update
 * BDs after finishing one BD processing, we'd need at least two BDs, where
 * both BDs point to the same content, the same address, the same size of the
 * whole PCM buffer.
872 873 874 875 876 877 878 879 880 881 882 883 884
 */

#define AUD_BUF_ADDR(x)		(AUD_BUF_A_ADDR + (x) * HAD_REG_WIDTH)
#define AUD_BUF_LEN(x)		(AUD_BUF_A_LENGTH + (x) * HAD_REG_WIDTH)

/* Set up a buffer descriptor at the "filled" position */
static void had_prog_bd(struct snd_pcm_substream *substream,
			struct snd_intelhad *intelhaddata)
{
	int idx = intelhaddata->bd_head;
	int ofs = intelhaddata->pcmbuf_filled * intelhaddata->period_bytes;
	u32 addr = substream->runtime->dma_addr + ofs;

885 886 887
	addr |= AUD_BUF_VALID;
	if (!substream->runtime->no_period_wakeup)
		addr |= AUD_BUF_INTR_EN;
888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915
	had_write_register(intelhaddata, AUD_BUF_ADDR(idx), addr);
	had_write_register(intelhaddata, AUD_BUF_LEN(idx),
			   intelhaddata->period_bytes);

	/* advance the indices to the next */
	intelhaddata->bd_head++;
	intelhaddata->bd_head %= intelhaddata->num_bds;
	intelhaddata->pcmbuf_filled++;
	intelhaddata->pcmbuf_filled %= substream->runtime->periods;
}

/* invalidate a buffer descriptor with the given index */
static void had_invalidate_bd(struct snd_intelhad *intelhaddata,
			      int idx)
{
	had_write_register(intelhaddata, AUD_BUF_ADDR(idx), 0);
	had_write_register(intelhaddata, AUD_BUF_LEN(idx), 0);
}

/* Initial programming of ring buffer */
static void had_init_ringbuf(struct snd_pcm_substream *substream,
			     struct snd_intelhad *intelhaddata)
{
	struct snd_pcm_runtime *runtime = substream->runtime;
	int i, num_periods;

	num_periods = runtime->periods;
	intelhaddata->num_bds = min(num_periods, HAD_NUM_OF_RING_BUFS);
916 917
	/* set the minimum 2 BDs for num_periods=1 */
	intelhaddata->num_bds = max(intelhaddata->num_bds, 2U);
918 919 920 921 922 923 924 925 926
	intelhaddata->period_bytes =
		frames_to_bytes(runtime, runtime->period_size);
	WARN_ON(intelhaddata->period_bytes & 0x3f);

	intelhaddata->bd_head = 0;
	intelhaddata->pcmbuf_head = 0;
	intelhaddata->pcmbuf_filled = 0;

	for (i = 0; i < HAD_NUM_OF_RING_BUFS; i++) {
927
		if (i < intelhaddata->num_bds)
928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999
			had_prog_bd(substream, intelhaddata);
		else /* invalidate the rest */
			had_invalidate_bd(intelhaddata, i);
	}

	intelhaddata->bd_head = 0; /* reset at head again before starting */
}

/* process a bd, advance to the next */
static void had_advance_ringbuf(struct snd_pcm_substream *substream,
				struct snd_intelhad *intelhaddata)
{
	int num_periods = substream->runtime->periods;

	/* reprogram the next buffer */
	had_prog_bd(substream, intelhaddata);

	/* proceed to next */
	intelhaddata->pcmbuf_head++;
	intelhaddata->pcmbuf_head %= num_periods;
}

/* process the current BD(s);
 * returns the current PCM buffer byte position, or -EPIPE for underrun.
 */
static int had_process_ringbuf(struct snd_pcm_substream *substream,
			       struct snd_intelhad *intelhaddata)
{
	int len, processed;
	unsigned long flags;

	processed = 0;
	spin_lock_irqsave(&intelhaddata->had_spinlock, flags);
	for (;;) {
		/* get the remaining bytes on the buffer */
		had_read_register(intelhaddata,
				  AUD_BUF_LEN(intelhaddata->bd_head),
				  &len);
		if (len < 0 || len > intelhaddata->period_bytes) {
			dev_dbg(intelhaddata->dev, "Invalid buf length %d\n",
				len);
			len = -EPIPE;
			goto out;
		}

		if (len > 0) /* OK, this is the current buffer */
			break;

		/* len=0 => already empty, check the next buffer */
		if (++processed >= intelhaddata->num_bds) {
			len = -EPIPE; /* all empty? - report underrun */
			goto out;
		}
		had_advance_ringbuf(substream, intelhaddata);
	}

	len = intelhaddata->period_bytes - len;
	len += intelhaddata->period_bytes * intelhaddata->pcmbuf_head;
 out:
	spin_unlock_irqrestore(&intelhaddata->had_spinlock, flags);
	return len;
}

/* called from irq handler */
static void had_process_buffer_done(struct snd_intelhad *intelhaddata)
{
	struct snd_pcm_substream *substream;

	substream = had_substream_get(intelhaddata);
	if (!substream)
		return; /* no stream? - bail out */

1000 1001 1002 1003 1004
	if (!intelhaddata->connected) {
		snd_pcm_stop_xrun(substream);
		goto out; /* disconnected? - bail out */
	}

1005 1006 1007 1008 1009 1010
	/* process or stop the stream */
	if (had_process_ringbuf(substream, intelhaddata) < 0)
		snd_pcm_stop_xrun(substream);
	else
		snd_pcm_period_elapsed(substream);

1011
 out:
1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023
	had_substream_put(intelhaddata);
}

/*
 * The interrupt status 'sticky' bits might not be cleared by
 * setting '1' to that bit once...
 */
static void wait_clear_underrun_bit(struct snd_intelhad *intelhaddata)
{
	int i;
	u32 val;

1024
	for (i = 0; i < 100; i++) {
1025 1026
		/* clear bit30, 31 AUD_HDMI_STATUS */
		had_read_register(intelhaddata, AUD_HDMI_STATUS, &val);
T
Takashi Iwai 已提交
1027
		if (!(val & AUD_HDMI_STATUS_MASK_UNDERRUN))
1028
			return;
1029 1030
		udelay(100);
		cond_resched();
1031 1032 1033 1034 1035
		had_write_register(intelhaddata, AUD_HDMI_STATUS, val);
	}
	dev_err(intelhaddata->dev, "Unable to clear UNDERRUN bits\n");
}

1036 1037 1038 1039 1040
/* Perform some reset procedure but only when need_reset is set;
 * this is called from prepare or hw_free callbacks once after trigger STOP
 * or underrun has been processed in order to settle down the h/w state.
 */
static void had_do_reset(struct snd_intelhad *intelhaddata)
1041
{
1042
	if (!intelhaddata->need_reset || !intelhaddata->connected)
1043
		return;
1044 1045

	/* Reset buffer pointers */
1046
	had_reset_audio(intelhaddata);
1047
	wait_clear_underrun_bit(intelhaddata);
1048 1049
	intelhaddata->need_reset = false;
}
1050

1051 1052 1053 1054
/* called from irq handler */
static void had_process_buffer_underrun(struct snd_intelhad *intelhaddata)
{
	struct snd_pcm_substream *substream;
1055 1056 1057 1058 1059 1060 1061

	/* Report UNDERRUN error to above layers */
	substream = had_substream_get(intelhaddata);
	if (substream) {
		snd_pcm_stop_xrun(substream);
		had_substream_put(intelhaddata);
	}
1062
	intelhaddata->need_reset = true;
1063 1064
}

T
Takashi Iwai 已提交
1065
/*
T
Takashi Iwai 已提交
1066
 * ALSA PCM open callback
1067
 */
1068
static int had_pcm_open(struct snd_pcm_substream *substream)
1069 1070 1071 1072 1073 1074 1075 1076
{
	struct snd_intelhad *intelhaddata;
	struct snd_pcm_runtime *runtime;
	int retval;

	intelhaddata = snd_pcm_substream_chip(substream);
	runtime = substream->runtime;

T
Takashi Iwai 已提交
1077
	pm_runtime_get_sync(intelhaddata->dev);
1078 1079

	/* set the runtime hw parameter with local snd_pcm_hardware struct */
1080
	runtime->hw = had_pcm_hardware;
1081 1082 1083 1084

	retval = snd_pcm_hw_constraint_integer(runtime,
			 SNDRV_PCM_HW_PARAM_PERIODS);
	if (retval < 0)
1085
		goto error;
1086 1087 1088 1089 1090 1091

	/* Make sure, that the period size is always aligned
	 * 64byte boundary
	 */
	retval = snd_pcm_hw_constraint_step(substream->runtime, 0,
			SNDRV_PCM_HW_PARAM_PERIOD_BYTES, 64);
1092
	if (retval < 0)
1093
		goto error;
1094

T
Takashi Iwai 已提交
1095 1096 1097 1098
	retval = snd_pcm_hw_constraint_msbits(runtime, 0, 32, 24);
	if (retval < 0)
		goto error;

1099
	/* expose PCM substream */
1100 1101 1102 1103 1104
	spin_lock_irq(&intelhaddata->had_spinlock);
	intelhaddata->stream_info.substream = substream;
	intelhaddata->stream_info.substream_refcount++;
	spin_unlock_irq(&intelhaddata->had_spinlock);

1105
	return retval;
1106
 error:
1107 1108
	pm_runtime_mark_last_busy(intelhaddata->dev);
	pm_runtime_put_autosuspend(intelhaddata->dev);
1109 1110 1111
	return retval;
}

T
Takashi Iwai 已提交
1112
/*
T
Takashi Iwai 已提交
1113
 * ALSA PCM close callback
1114
 */
1115
static int had_pcm_close(struct snd_pcm_substream *substream)
1116 1117 1118 1119 1120
{
	struct snd_intelhad *intelhaddata;

	intelhaddata = snd_pcm_substream_chip(substream);

1121
	/* unreference and sync with the pending PCM accesses */
1122 1123 1124 1125 1126 1127 1128 1129 1130
	spin_lock_irq(&intelhaddata->had_spinlock);
	intelhaddata->stream_info.substream = NULL;
	intelhaddata->stream_info.substream_refcount--;
	while (intelhaddata->stream_info.substream_refcount > 0) {
		spin_unlock_irq(&intelhaddata->had_spinlock);
		cpu_relax();
		spin_lock_irq(&intelhaddata->had_spinlock);
	}
	spin_unlock_irq(&intelhaddata->had_spinlock);
1131

1132 1133
	pm_runtime_mark_last_busy(intelhaddata->dev);
	pm_runtime_put_autosuspend(intelhaddata->dev);
1134 1135 1136
	return 0;
}

T
Takashi Iwai 已提交
1137
/*
T
Takashi Iwai 已提交
1138
 * ALSA PCM hw_params callback
1139
 */
1140 1141
static int had_pcm_hw_params(struct snd_pcm_substream *substream,
			     struct snd_pcm_hw_params *hw_params)
1142
{
1143
	struct snd_intelhad *intelhaddata;
1144 1145 1146
	unsigned long addr;
	int pages, buf_size, retval;

1147
	intelhaddata = snd_pcm_substream_chip(substream);
1148 1149 1150 1151
	buf_size = params_buffer_bytes(hw_params);
	retval = snd_pcm_lib_malloc_pages(substream, buf_size);
	if (retval < 0)
		return retval;
1152 1153
	dev_dbg(intelhaddata->dev, "%s:allocated memory = %d\n",
		__func__, buf_size);
1154 1155 1156 1157 1158
	/* mark the pages as uncached region */
	addr = (unsigned long) substream->runtime->dma_area;
	pages = (substream->runtime->dma_bytes + PAGE_SIZE - 1) / PAGE_SIZE;
	retval = set_memory_uc(addr, pages);
	if (retval) {
1159 1160
		dev_err(intelhaddata->dev, "set_memory_uc failed.Error:%d\n",
			retval);
1161 1162 1163 1164 1165 1166 1167
		return retval;
	}
	memset(substream->runtime->dma_area, 0, buf_size);

	return retval;
}

T
Takashi Iwai 已提交
1168
/*
T
Takashi Iwai 已提交
1169
 * ALSA PCM hw_free callback
1170
 */
1171
static int had_pcm_hw_free(struct snd_pcm_substream *substream)
1172
{
1173
	struct snd_intelhad *intelhaddata;
1174 1175 1176
	unsigned long addr;
	u32 pages;

1177 1178 1179
	intelhaddata = snd_pcm_substream_chip(substream);
	had_do_reset(intelhaddata);

1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190
	/* mark back the pages as cached/writeback region before the free */
	if (substream->runtime->dma_area != NULL) {
		addr = (unsigned long) substream->runtime->dma_area;
		pages = (substream->runtime->dma_bytes + PAGE_SIZE - 1) /
								PAGE_SIZE;
		set_memory_wb(addr, pages);
		return snd_pcm_lib_free_pages(substream);
	}
	return 0;
}

T
Takashi Iwai 已提交
1191
/*
T
Takashi Iwai 已提交
1192
 * ALSA PCM trigger callback
1193
 */
1194
static int had_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
1195
{
1196
	int retval = 0;
1197 1198 1199 1200
	struct snd_intelhad *intelhaddata;

	intelhaddata = snd_pcm_substream_chip(substream);

1201
	spin_lock(&intelhaddata->had_spinlock);
1202 1203
	switch (cmd) {
	case SNDRV_PCM_TRIGGER_START:
T
Takashi Iwai 已提交
1204 1205
	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
	case SNDRV_PCM_TRIGGER_RESUME:
1206
		/* Enable Audio */
1207
		had_ack_irqs(intelhaddata); /* FIXME: do we need this? */
1208
		had_enable_audio(intelhaddata, true);
1209 1210 1211
		break;

	case SNDRV_PCM_TRIGGER_STOP:
T
Takashi Iwai 已提交
1212
	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
1213
		/* Disable Audio */
1214
		had_enable_audio(intelhaddata, false);
1215
		intelhaddata->need_reset = true;
1216 1217 1218 1219 1220
		break;

	default:
		retval = -EINVAL;
	}
1221
	spin_unlock(&intelhaddata->had_spinlock);
1222 1223 1224
	return retval;
}

T
Takashi Iwai 已提交
1225
/*
T
Takashi Iwai 已提交
1226
 * ALSA PCM prepare callback
1227
 */
1228
static int had_pcm_prepare(struct snd_pcm_substream *substream)
1229 1230 1231
{
	int retval;
	u32 disp_samp_freq, n_param;
1232
	u32 link_rate = 0;
1233 1234 1235 1236 1237 1238
	struct snd_intelhad *intelhaddata;
	struct snd_pcm_runtime *runtime;

	intelhaddata = snd_pcm_substream_chip(substream);
	runtime = substream->runtime;

1239
	dev_dbg(intelhaddata->dev, "period_size=%d\n",
1240
		(int)frames_to_bytes(runtime, runtime->period_size));
1241 1242 1243 1244 1245
	dev_dbg(intelhaddata->dev, "periods=%d\n", runtime->periods);
	dev_dbg(intelhaddata->dev, "buffer_size=%d\n",
		(int)snd_pcm_lib_buffer_bytes(substream));
	dev_dbg(intelhaddata->dev, "rate=%d\n", runtime->rate);
	dev_dbg(intelhaddata->dev, "channels=%d\n", runtime->channels);
1246

1247 1248
	had_do_reset(intelhaddata);

1249
	/* Get N value in KHz */
1250
	disp_samp_freq = intelhaddata->tmds_clock_speed;
1251

1252
	retval = had_prog_n(substream->runtime->rate, &n_param, intelhaddata);
1253
	if (retval) {
1254 1255
		dev_err(intelhaddata->dev,
			"programming N value failed %#x\n", retval);
1256 1257
		goto prep_end;
	}
1258 1259

	if (intelhaddata->dp_output)
1260
		link_rate = intelhaddata->link_rate;
1261

1262 1263
	had_prog_cts(substream->runtime->rate, disp_samp_freq, link_rate,
		     n_param, intelhaddata);
1264

1265
	had_prog_dip(substream, intelhaddata);
1266

1267
	retval = had_init_audio_ctrl(substream, intelhaddata);
1268 1269

	/* Prog buffer address */
1270
	had_init_ringbuf(substream, intelhaddata);
1271 1272 1273 1274 1275 1276

	/*
	 * Program channel mapping in following order:
	 * FL, FR, C, LFE, RL, RR
	 */

1277
	had_write_register(intelhaddata, AUD_BUF_CH_SWAP, SWAP_LFE_CENTER);
1278 1279 1280 1281 1282

prep_end:
	return retval;
}

T
Takashi Iwai 已提交
1283
/*
T
Takashi Iwai 已提交
1284
 * ALSA PCM pointer callback
1285
 */
1286
static snd_pcm_uframes_t had_pcm_pointer(struct snd_pcm_substream *substream)
1287 1288
{
	struct snd_intelhad *intelhaddata;
1289
	int len;
1290 1291 1292

	intelhaddata = snd_pcm_substream_chip(substream);

1293
	if (!intelhaddata->connected)
T
Takashi Iwai 已提交
1294 1295
		return SNDRV_PCM_POS_XRUN;

1296 1297 1298
	len = had_process_ringbuf(substream, intelhaddata);
	if (len < 0)
		return SNDRV_PCM_POS_XRUN;
1299 1300 1301 1302
	len = bytes_to_frames(substream->runtime, len);
	/* wrapping may happen when periods=1 */
	len %= substream->runtime->buffer_size;
	return len;
1303 1304
}

T
Takashi Iwai 已提交
1305
/*
T
Takashi Iwai 已提交
1306
 * ALSA PCM mmap callback
1307
 */
1308 1309
static int had_pcm_mmap(struct snd_pcm_substream *substream,
			struct vm_area_struct *vma)
1310 1311 1312 1313 1314 1315 1316
{
	vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
	return remap_pfn_range(vma, vma->vm_start,
			substream->dma_buffer.addr >> PAGE_SHIFT,
			vma->vm_end - vma->vm_start, vma->vm_page_prot);
}

1317 1318 1319
/*
 * ALSA PCM ops
 */
1320 1321 1322
static const struct snd_pcm_ops had_pcm_ops = {
	.open =		had_pcm_open,
	.close =	had_pcm_close,
1323
	.ioctl =	snd_pcm_lib_ioctl,
1324 1325 1326 1327 1328 1329
	.hw_params =	had_pcm_hw_params,
	.hw_free =	had_pcm_hw_free,
	.prepare =	had_pcm_prepare,
	.trigger =	had_pcm_trigger,
	.pointer =	had_pcm_pointer,
	.mmap =		had_pcm_mmap,
1330 1331
};

1332
/* process mode change of the running stream; called in mutex */
1333
static int had_process_mode_change(struct snd_intelhad *intelhaddata)
1334
{
1335
	struct snd_pcm_substream *substream;
1336 1337
	int retval = 0;
	u32 disp_samp_freq, n_param;
1338
	u32 link_rate = 0;
1339

1340 1341
	substream = had_substream_get(intelhaddata);
	if (!substream)
1342
		return 0;
1343 1344

	/* Disable Audio */
1345
	had_enable_audio(intelhaddata, false);
1346 1347

	/* Update CTS value */
1348
	disp_samp_freq = intelhaddata->tmds_clock_speed;
1349

1350
	retval = had_prog_n(substream->runtime->rate, &n_param, intelhaddata);
1351
	if (retval) {
1352 1353
		dev_err(intelhaddata->dev,
			"programming N value failed %#x\n", retval);
1354 1355
		goto out;
	}
1356 1357

	if (intelhaddata->dp_output)
1358
		link_rate = intelhaddata->link_rate;
1359

1360 1361
	had_prog_cts(substream->runtime->rate, disp_samp_freq, link_rate,
		     n_param, intelhaddata);
1362 1363

	/* Enable Audio */
1364
	had_enable_audio(intelhaddata, true);
1365 1366

out:
1367
	had_substream_put(intelhaddata);
1368 1369 1370
	return retval;
}

1371
/* process hot plug, called from wq with mutex locked */
1372
static void had_process_hot_plug(struct snd_intelhad *intelhaddata)
1373 1374 1375
{
	struct snd_pcm_substream *substream;

1376
	spin_lock_irq(&intelhaddata->had_spinlock);
1377
	if (intelhaddata->connected) {
1378
		dev_dbg(intelhaddata->dev, "Device already connected\n");
1379
		spin_unlock_irq(&intelhaddata->had_spinlock);
1380
		return;
1381
	}
1382

1383 1384 1385
	/* Disable Audio */
	had_enable_audio(intelhaddata, false);

1386
	intelhaddata->connected = true;
1387 1388
	dev_dbg(intelhaddata->dev,
		"%s @ %d:DEBUG PLUG/UNPLUG : HAD_DRV_CONNECTED\n",
1389
			__func__, __LINE__);
1390
	spin_unlock_irq(&intelhaddata->had_spinlock);
1391

1392 1393 1394
	had_build_channel_allocation_map(intelhaddata);

	/* Report to above ALSA layer */
1395
	substream = had_substream_get(intelhaddata);
1396
	if (substream) {
1397
		snd_pcm_stop_xrun(substream);
1398
		had_substream_put(intelhaddata);
1399 1400
	}

T
Takashi Iwai 已提交
1401
	snd_jack_report(intelhaddata->jack, SND_JACK_AVOUT);
1402 1403
}

1404
/* process hot unplug, called from wq with mutex locked */
1405
static void had_process_hot_unplug(struct snd_intelhad *intelhaddata)
1406
{
1407
	struct snd_pcm_substream *substream;
1408

1409
	spin_lock_irq(&intelhaddata->had_spinlock);
1410
	if (!intelhaddata->connected) {
1411
		dev_dbg(intelhaddata->dev, "Device already disconnected\n");
1412
		spin_unlock_irq(&intelhaddata->had_spinlock);
1413
		return;
1414 1415 1416

	}

1417
	/* Disable Audio */
1418
	had_enable_audio(intelhaddata, false);
1419

1420
	intelhaddata->connected = false;
1421 1422
	dev_dbg(intelhaddata->dev,
		"%s @ %d:DEBUG PLUG/UNPLUG : HAD_DRV_DISCONNECTED\n",
1423
			__func__, __LINE__);
1424
	spin_unlock_irq(&intelhaddata->had_spinlock);
1425

1426 1427 1428
	kfree(intelhaddata->chmap->chmap);
	intelhaddata->chmap->chmap = NULL;

1429
	/* Report to above ALSA layer */
1430 1431
	substream = had_substream_get(intelhaddata);
	if (substream) {
1432
		snd_pcm_stop_xrun(substream);
1433 1434
		had_substream_put(intelhaddata);
	}
1435

T
Takashi Iwai 已提交
1436
	snd_jack_report(intelhaddata->jack, 0);
1437 1438
}

1439 1440 1441
/*
 * ALSA iec958 and ELD controls
 */
1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455

static int had_iec958_info(struct snd_kcontrol *kcontrol,
				struct snd_ctl_elem_info *uinfo)
{
	uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
	uinfo->count = 1;
	return 0;
}

static int had_iec958_get(struct snd_kcontrol *kcontrol,
				struct snd_ctl_elem_value *ucontrol)
{
	struct snd_intelhad *intelhaddata = snd_kcontrol_chip(kcontrol);

1456
	mutex_lock(&intelhaddata->mutex);
1457 1458 1459 1460 1461 1462
	ucontrol->value.iec958.status[0] = (intelhaddata->aes_bits >> 0) & 0xff;
	ucontrol->value.iec958.status[1] = (intelhaddata->aes_bits >> 8) & 0xff;
	ucontrol->value.iec958.status[2] =
					(intelhaddata->aes_bits >> 16) & 0xff;
	ucontrol->value.iec958.status[3] =
					(intelhaddata->aes_bits >> 24) & 0xff;
1463
	mutex_unlock(&intelhaddata->mutex);
1464 1465
	return 0;
}
1466

1467 1468 1469 1470 1471 1472 1473 1474 1475
static int had_iec958_mask_get(struct snd_kcontrol *kcontrol,
				struct snd_ctl_elem_value *ucontrol)
{
	ucontrol->value.iec958.status[0] = 0xff;
	ucontrol->value.iec958.status[1] = 0xff;
	ucontrol->value.iec958.status[2] = 0xff;
	ucontrol->value.iec958.status[3] = 0xff;
	return 0;
}
1476

1477 1478 1479 1480 1481
static int had_iec958_put(struct snd_kcontrol *kcontrol,
				struct snd_ctl_elem_value *ucontrol)
{
	unsigned int val;
	struct snd_intelhad *intelhaddata = snd_kcontrol_chip(kcontrol);
1482
	int changed = 0;
1483 1484 1485 1486 1487

	val = (ucontrol->value.iec958.status[0] << 0) |
		(ucontrol->value.iec958.status[1] << 8) |
		(ucontrol->value.iec958.status[2] << 16) |
		(ucontrol->value.iec958.status[3] << 24);
1488
	mutex_lock(&intelhaddata->mutex);
1489 1490
	if (intelhaddata->aes_bits != val) {
		intelhaddata->aes_bits = val;
1491
		changed = 1;
1492
	}
1493 1494
	mutex_unlock(&intelhaddata->mutex);
	return changed;
1495 1496
}

1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515
static int had_ctl_eld_info(struct snd_kcontrol *kcontrol,
			    struct snd_ctl_elem_info *uinfo)
{
	uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES;
	uinfo->count = HDMI_MAX_ELD_BYTES;
	return 0;
}

static int had_ctl_eld_get(struct snd_kcontrol *kcontrol,
			   struct snd_ctl_elem_value *ucontrol)
{
	struct snd_intelhad *intelhaddata = snd_kcontrol_chip(kcontrol);

	mutex_lock(&intelhaddata->mutex);
	memcpy(ucontrol->value.bytes.data, intelhaddata->eld,
	       HDMI_MAX_ELD_BYTES);
	mutex_unlock(&intelhaddata->mutex);
	return 0;
}
1516

1517
static const struct snd_kcontrol_new had_controls[] = {
1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539
	{
		.access = SNDRV_CTL_ELEM_ACCESS_READ,
		.iface = SNDRV_CTL_ELEM_IFACE_PCM,
		.name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, MASK),
		.info = had_iec958_info, /* shared */
		.get = had_iec958_mask_get,
	},
	{
		.iface = SNDRV_CTL_ELEM_IFACE_PCM,
		.name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, DEFAULT),
		.info = had_iec958_info,
		.get = had_iec958_get,
		.put = had_iec958_put,
	},
	{
		.access = (SNDRV_CTL_ELEM_ACCESS_READ |
			   SNDRV_CTL_ELEM_ACCESS_VOLATILE),
		.iface = SNDRV_CTL_ELEM_IFACE_PCM,
		.name = "ELD",
		.info = had_ctl_eld_info,
		.get = had_ctl_eld_get,
	},
1540 1541
};

1542 1543 1544
/*
 * audio interrupt handler
 */
1545 1546
static irqreturn_t display_pipe_interrupt_handler(int irq, void *dev_id)
{
1547
	struct snd_intelhad_card *card_ctx = dev_id;
1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560
	u32 audio_stat[3] = {};
	int pipe, port;

	for_each_pipe(card_ctx, pipe) {
		/* use raw register access to ack IRQs even while disconnected */
		audio_stat[pipe] = had_read_register_raw(card_ctx, pipe,
							 AUD_HDMI_STATUS) &
			(HDMI_AUDIO_UNDERRUN | HDMI_AUDIO_BUFFER_DONE);

		if (audio_stat[pipe])
			had_write_register_raw(card_ctx, pipe,
					       AUD_HDMI_STATUS, audio_stat[pipe]);
	}
1561

1562 1563
	for_each_port(card_ctx, port) {
		struct snd_intelhad *ctx = &card_ctx->pcm_ctx[port];
1564
		int pipe = ctx->pipe;
1565

1566 1567
		if (pipe < 0)
			continue;
1568

1569
		if (audio_stat[pipe] & HDMI_AUDIO_BUFFER_DONE)
1570
			had_process_buffer_done(ctx);
1571 1572
		if (audio_stat[pipe] & HDMI_AUDIO_UNDERRUN)
			had_process_buffer_underrun(ctx);
1573 1574 1575 1576 1577
	}

	return IRQ_HANDLED;
}

1578 1579 1580
/*
 * monitor plug/unplug notification from i915; just kick off the work
 */
1581
static void notify_audio_lpe(struct platform_device *pdev, int port)
1582
{
1583
	struct snd_intelhad_card *card_ctx = platform_get_drvdata(pdev);
1584 1585 1586 1587 1588
	struct snd_intelhad *ctx;

	ctx = &card_ctx->pcm_ctx[single_port ? 0 : port];
	if (single_port)
		ctx->port = port;
1589

1590 1591
	schedule_work(&ctx->hdmi_audio_wq);
}
1592

1593
/* the work to handle monitor hot plug/unplug */
1594 1595 1596 1597 1598
static void had_audio_wq(struct work_struct *work)
{
	struct snd_intelhad *ctx =
		container_of(work, struct snd_intelhad, hdmi_audio_wq);
	struct intel_hdmi_lpe_audio_pdata *pdata = ctx->dev->platform_data;
1599
	struct intel_hdmi_lpe_audio_port_pdata *ppdata = &pdata->port[ctx->port];
1600

T
Takashi Iwai 已提交
1601
	pm_runtime_get_sync(ctx->dev);
1602
	mutex_lock(&ctx->mutex);
1603
	if (ppdata->pipe < 0) {
1604 1605 1606
		dev_dbg(ctx->dev, "%s: Event: HAD_NOTIFY_HOT_UNPLUG : port = %d\n",
			__func__, ctx->port);

1607
		memset(ctx->eld, 0, sizeof(ctx->eld)); /* clear the old ELD */
1608 1609 1610 1611 1612 1613

		ctx->dp_output = false;
		ctx->tmds_clock_speed = 0;
		ctx->link_rate = 0;

		/* Shut down the stream */
1614
		had_process_hot_unplug(ctx);
1615

1616
		ctx->pipe = -1;
1617
	} else {
1618
		dev_dbg(ctx->dev, "%s: HAD_NOTIFY_ELD : port = %d, tmds = %d\n",
1619
			__func__, ctx->port, ppdata->ls_clock);
1620

1621
		memcpy(ctx->eld, ppdata->eld, sizeof(ctx->eld));
1622

1623
		ctx->dp_output = ppdata->dp_output;
1624 1625
		if (ctx->dp_output) {
			ctx->tmds_clock_speed = 0;
1626
			ctx->link_rate = ppdata->ls_clock;
1627
		} else {
1628
			ctx->tmds_clock_speed = ppdata->ls_clock;
1629 1630
			ctx->link_rate = 0;
		}
1631

1632 1633 1634 1635
		/*
		 * Shut down the stream before we change
		 * the pipe assignment for this pcm device
		 */
1636
		had_process_hot_plug(ctx);
1637

1638 1639 1640
		ctx->pipe = ppdata->pipe;

		/* Restart the stream if necessary */
1641
		had_process_mode_change(ctx);
1642
	}
1643

1644
	mutex_unlock(&ctx->mutex);
1645 1646
	pm_runtime_mark_last_busy(ctx->dev);
	pm_runtime_put_autosuspend(ctx->dev);
T
Takashi Iwai 已提交
1647 1648
}

T
Takashi Iwai 已提交
1649 1650 1651
/*
 * Jack interface
 */
1652 1653
static int had_create_jack(struct snd_intelhad *ctx,
			   struct snd_pcm *pcm)
T
Takashi Iwai 已提交
1654
{
1655
	char hdmi_str[32];
T
Takashi Iwai 已提交
1656 1657
	int err;

1658 1659 1660
	snprintf(hdmi_str, sizeof(hdmi_str),
		 "HDMI/DP,pcm=%d", pcm->device);

1661 1662
	err = snd_jack_new(ctx->card_ctx->card, hdmi_str,
			   SND_JACK_AVOUT, &ctx->jack,
T
Takashi Iwai 已提交
1663 1664 1665 1666 1667 1668 1669
			   true, false);
	if (err < 0)
		return err;
	ctx->jack->private_data = ctx;
	return 0;
}

T
Takashi Iwai 已提交
1670 1671 1672 1673 1674 1675
/*
 * PM callbacks
 */

static int hdmi_lpe_audio_runtime_suspend(struct device *dev)
{
1676 1677
	struct snd_intelhad_card *card_ctx = dev_get_drvdata(dev);
	int port;
T
Takashi Iwai 已提交
1678

1679 1680 1681 1682 1683 1684 1685 1686 1687
	for_each_port(card_ctx, port) {
		struct snd_intelhad *ctx = &card_ctx->pcm_ctx[port];
		struct snd_pcm_substream *substream;

		substream = had_substream_get(ctx);
		if (substream) {
			snd_pcm_suspend(substream);
			had_substream_put(ctx);
		}
T
Takashi Iwai 已提交
1688 1689 1690 1691 1692
	}

	return 0;
}

1693
static int __maybe_unused hdmi_lpe_audio_suspend(struct device *dev)
T
Takashi Iwai 已提交
1694
{
1695
	struct snd_intelhad_card *card_ctx = dev_get_drvdata(dev);
T
Takashi Iwai 已提交
1696 1697 1698 1699
	int err;

	err = hdmi_lpe_audio_runtime_suspend(dev);
	if (!err)
1700
		snd_power_change_state(card_ctx->card, SNDRV_CTL_POWER_D3hot);
T
Takashi Iwai 已提交
1701 1702 1703
	return err;
}

1704 1705 1706 1707 1708 1709
static int hdmi_lpe_audio_runtime_resume(struct device *dev)
{
	pm_runtime_mark_last_busy(dev);
	return 0;
}

1710
static int __maybe_unused hdmi_lpe_audio_resume(struct device *dev)
T
Takashi Iwai 已提交
1711
{
1712
	struct snd_intelhad_card *card_ctx = dev_get_drvdata(dev);
T
Takashi Iwai 已提交
1713

1714
	hdmi_lpe_audio_runtime_resume(dev);
1715
	snd_power_change_state(card_ctx->card, SNDRV_CTL_POWER_D0);
T
Takashi Iwai 已提交
1716
	return 0;
1717 1718 1719 1720 1721
}

/* release resources */
static void hdmi_lpe_audio_free(struct snd_card *card)
{
1722 1723 1724
	struct snd_intelhad_card *card_ctx = card->private_data;
	struct intel_hdmi_lpe_audio_pdata *pdata = card_ctx->dev->platform_data;
	int port;
1725

1726 1727 1728
	spin_lock_irq(&pdata->lpe_audio_slock);
	pdata->notify_audio_lpe = NULL;
	spin_unlock_irq(&pdata->lpe_audio_slock);
1729

1730 1731
	for_each_port(card_ctx, port) {
		struct snd_intelhad *ctx = &card_ctx->pcm_ctx[port];
1732

1733 1734
		cancel_work_sync(&ctx->hdmi_audio_wq);
	}
1735

1736 1737 1738 1739
	if (card_ctx->mmio_start)
		iounmap(card_ctx->mmio_start);
	if (card_ctx->irq >= 0)
		free_irq(card_ctx->irq, card_ctx);
1740 1741
}

1742
/*
1743
 * hdmi_lpe_audio_probe - start bridge with i915
1744
 *
1745
 * This function is called when the i915 driver creates the
T
Takashi Iwai 已提交
1746
 * hdmi-lpe-audio platform device.
1747
 */
1748
static int hdmi_lpe_audio_probe(struct platform_device *pdev)
1749 1750
{
	struct snd_card *card;
1751
	struct snd_intelhad_card *card_ctx;
1752
	struct snd_intelhad *ctx;
1753 1754 1755 1756
	struct snd_pcm *pcm;
	struct intel_hdmi_lpe_audio_pdata *pdata;
	int irq;
	struct resource *res_mmio;
1757
	int port, ret;
1758 1759 1760 1761 1762 1763

	pdata = pdev->dev.platform_data;
	if (!pdata) {
		dev_err(&pdev->dev, "%s: quit: pdata not allocated by i915!!\n", __func__);
		return -EINVAL;
	}
1764

1765 1766 1767
	/* get resources */
	irq = platform_get_irq(pdev, 0);
	if (irq < 0) {
1768 1769
		dev_err(&pdev->dev, "Could not get irq resource: %d\n", irq);
		return irq;
1770 1771 1772 1773 1774 1775 1776
	}

	res_mmio = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!res_mmio) {
		dev_err(&pdev->dev, "Could not get IO_MEM resources\n");
		return -ENXIO;
	}
1777

1778
	/* create a card instance with ALSA framework */
1779
	ret = snd_card_new(&pdev->dev, hdmi_card_index, hdmi_card_id,
1780
			   THIS_MODULE, sizeof(*card_ctx), &card);
1781 1782 1783
	if (ret)
		return ret;

1784 1785 1786
	card_ctx = card->private_data;
	card_ctx->dev = &pdev->dev;
	card_ctx->card = card;
1787
	strcpy(card->driver, INTEL_HAD);
1788 1789
	strcpy(card->shortname, "Intel HDMI/DP LPE Audio");
	strcpy(card->longname, "Intel HDMI/DP LPE Audio");
1790

1791
	card_ctx->irq = -1;
1792 1793 1794

	card->private_free = hdmi_lpe_audio_free;

1795
	platform_set_drvdata(pdev, card_ctx);
1796

1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811
	card_ctx->num_pipes = pdata->num_pipes;
	card_ctx->num_ports = single_port ? 1 : pdata->num_ports;

	for_each_port(card_ctx, port) {
		ctx = &card_ctx->pcm_ctx[port];
		ctx->card_ctx = card_ctx;
		ctx->dev = card_ctx->dev;
		ctx->port = single_port ? -1 : port;
		ctx->pipe = -1;

		spin_lock_init(&ctx->had_spinlock);
		mutex_init(&ctx->mutex);
		INIT_WORK(&ctx->hdmi_audio_wq, had_audio_wq);
	}

1812 1813 1814 1815
	dev_dbg(&pdev->dev, "%s: mmio_start = 0x%x, mmio_end = 0x%x\n",
		__func__, (unsigned int)res_mmio->start,
		(unsigned int)res_mmio->end);

1816 1817 1818
	card_ctx->mmio_start = ioremap_nocache(res_mmio->start,
					       (size_t)(resource_size(res_mmio)));
	if (!card_ctx->mmio_start) {
1819 1820 1821 1822
		dev_err(&pdev->dev, "Could not get ioremap\n");
		ret = -EACCES;
		goto err;
	}
1823

1824 1825
	/* setup interrupt handler */
	ret = request_irq(irq, display_pipe_interrupt_handler, 0,
1826
			  pdev->name, card_ctx);
1827 1828 1829 1830
	if (ret < 0) {
		dev_err(&pdev->dev, "request_irq failed\n");
		goto err;
	}
1831

1832
	card_ctx->irq = irq;
1833 1834 1835 1836 1837

	/* only 32bit addressable */
	dma_set_mask(&pdev->dev, DMA_BIT_MASK(32));
	dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32));

1838
	init_channel_allocations();
1839

1840
	card_ctx->num_pipes = pdata->num_pipes;
1841
	card_ctx->num_ports = single_port ? 1 : pdata->num_ports;
1842

1843 1844 1845
	for_each_port(card_ctx, port) {
		int i;

1846
		ctx = &card_ctx->pcm_ctx[port];
1847
		ret = snd_pcm_new(card, INTEL_HAD, port, MAX_PB_STREAMS,
1848 1849
				  MAX_CAP_STREAMS, &pcm);
		if (ret)
1850
			goto err;
1851

1852 1853 1854
		/* setup private data which can be retrieved when required */
		pcm->private_data = ctx;
		pcm->info_flags = 0;
1855
		strlcpy(pcm->name, card->shortname, strlen(card->shortname));
1856 1857
		/* setup the ops for playabck */
		snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &had_pcm_ops);
1858

1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874
		/* allocate dma pages;
		 * try to allocate 600k buffer as default which is large enough
		 */
		snd_pcm_lib_preallocate_pages_for_all(pcm,
						      SNDRV_DMA_TYPE_DEV, NULL,
						      HAD_DEFAULT_BUFFER, HAD_MAX_BUFFER);

		/* create controls */
		for (i = 0; i < ARRAY_SIZE(had_controls); i++) {
			struct snd_kcontrol *kctl;

			kctl = snd_ctl_new1(&had_controls[i], ctx);
			if (!kctl) {
				ret = -ENOMEM;
				goto err;
			}
1875

1876 1877 1878 1879 1880
			kctl->id.device = pcm->device;

			ret = snd_ctl_add(card, kctl);
			if (ret < 0)
				goto err;
1881 1882
		}

1883 1884 1885 1886
		/* Register channel map controls */
		ret = had_register_chmap_ctls(ctx, pcm);
		if (ret < 0)
			goto err;
1887

1888
		ret = had_create_jack(ctx, pcm);
1889 1890 1891
		if (ret < 0)
			goto err;
	}
T
Takashi Iwai 已提交
1892

1893 1894
	ret = snd_card_register(card);
	if (ret)
1895 1896
		goto err;

1897
	spin_lock_irq(&pdata->lpe_audio_slock);
1898
	pdata->notify_audio_lpe = notify_audio_lpe;
1899
	spin_unlock_irq(&pdata->lpe_audio_slock);
1900

1901 1902
	pm_runtime_use_autosuspend(&pdev->dev);
	pm_runtime_mark_last_busy(&pdev->dev);
1903 1904
	pm_runtime_set_active(&pdev->dev);

1905
	dev_dbg(&pdev->dev, "%s: handle pending notification\n", __func__);
1906 1907 1908 1909 1910
	for_each_port(card_ctx, port) {
		struct snd_intelhad *ctx = &card_ctx->pcm_ctx[port];

		schedule_work(&ctx->hdmi_audio_wq);
	}
1911

1912
	return 0;
1913

1914 1915
err:
	snd_card_free(card);
1916
	return ret;
1917 1918
}

1919
/*
1920
 * hdmi_lpe_audio_remove - stop bridge with i915
1921
 *
T
Takashi Iwai 已提交
1922
 * This function is called when the platform device is destroyed.
1923
 */
1924
static int hdmi_lpe_audio_remove(struct platform_device *pdev)
1925
{
1926
	struct snd_intelhad_card *card_ctx = platform_get_drvdata(pdev);
1927

1928
	snd_card_free(card_ctx->card);
1929 1930 1931
	return 0;
}

T
Takashi Iwai 已提交
1932 1933
static const struct dev_pm_ops hdmi_lpe_audio_pm = {
	SET_SYSTEM_SLEEP_PM_OPS(hdmi_lpe_audio_suspend, hdmi_lpe_audio_resume)
1934 1935
	SET_RUNTIME_PM_OPS(hdmi_lpe_audio_runtime_suspend,
			   hdmi_lpe_audio_runtime_resume, NULL)
T
Takashi Iwai 已提交
1936 1937
};

1938 1939 1940
static struct platform_driver hdmi_lpe_audio_driver = {
	.driver		= {
		.name  = "hdmi-lpe-audio",
T
Takashi Iwai 已提交
1941
		.pm = &hdmi_lpe_audio_pm,
1942 1943 1944 1945 1946 1947 1948 1949
	},
	.probe          = hdmi_lpe_audio_probe,
	.remove		= hdmi_lpe_audio_remove,
};

module_platform_driver(hdmi_lpe_audio_driver);
MODULE_ALIAS("platform:hdmi_lpe_audio");

1950 1951 1952 1953 1954 1955 1956
MODULE_AUTHOR("Sailaja Bandarupalli <sailaja.bandarupalli@intel.com>");
MODULE_AUTHOR("Ramesh Babu K V <ramesh.babu@intel.com>");
MODULE_AUTHOR("Vaibhav Agarwal <vaibhav.agarwal@intel.com>");
MODULE_AUTHOR("Jerome Anand <jerome.anand@intel.com>");
MODULE_DESCRIPTION("Intel HDMI Audio driver");
MODULE_LICENSE("GPL v2");
MODULE_SUPPORTED_DEVICE("{Intel,Intel_HAD}");