intel_hdmi_audio.c 50.9 KB
Newer Older
1
// SPDX-License-Identifier: GPL-2.0-only
2 3 4 5 6 7 8 9 10 11 12 13 14 15
/*
 *   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>
 *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * ALSA driver for Intel HDMI audio
 */

16
#include <linux/types.h>
17 18 19 20
#include <linux/platform_device.h>
#include <linux/io.h>
#include <linux/slab.h>
#include <linux/module.h>
21
#include <linux/interrupt.h>
22
#include <linux/pm_runtime.h>
23
#include <linux/dma-mapping.h>
24
#include <linux/delay.h>
25
#include <sound/core.h>
26 27
#include <sound/asoundef.h>
#include <sound/pcm.h>
28 29 30
#include <sound/pcm_params.h>
#include <sound/initval.h>
#include <sound/control.h>
T
Takashi Iwai 已提交
31
#include <sound/jack.h>
32
#include <drm/drm_edid.h>
33
#include <drm/intel_lpe_audio.h>
34 35
#include "intel_hdmi_audio.h"

36 37
#define for_each_pipe(card_ctx, pipe) \
	for ((pipe) = 0; (pipe) < (card_ctx)->num_pipes; (pipe)++)
38 39 40
#define for_each_port(card_ctx, port) \
	for ((port) = 0; (port) < (card_ctx)->num_ports; (port)++)

41 42 43
/*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;
44
static bool single_port;
45 46 47 48 49 50 51

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.");
52 53 54
module_param(single_port, bool, 0444);
MODULE_PARM_DESC(single_port,
		"Single-port mode (for compatibility)");
55 56 57 58

/*
 * ELD SA bits in the CEA Speaker Allocation data block
 */
T
Takashi Iwai 已提交
59
static const int eld_speaker_allocation_bits[] = {
60 61 62 63 64 65 66 67 68 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
	[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 已提交
122
static const struct channel_map_table map_tables[] = {
123 124 125 126 127 128 129 130 131 132 133 134
	{ 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 */
135
static const struct snd_pcm_hardware had_pcm_hardware = {
136
	.info =	(SNDRV_PCM_INFO_INTERLEAVED |
137
		SNDRV_PCM_INFO_MMAP |
138 139
		SNDRV_PCM_INFO_MMAP_VALID |
		SNDRV_PCM_INFO_NO_PERIOD_WAKEUP),
T
Takashi Iwai 已提交
140 141
	.formats = (SNDRV_PCM_FMTBIT_S16_LE |
		    SNDRV_PCM_FMTBIT_S24_LE |
T
Takashi Iwai 已提交
142
		    SNDRV_PCM_FMTBIT_S32_LE),
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
	.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,
};

162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
/* 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);
}

192 193 194 195 196 197 198 199 200 201 202 203 204
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;
	}
}

205
/* Register access functions */
206 207
static u32 had_read_register_raw(struct snd_intelhad_card *card_ctx,
				 int pipe, u32 reg)
208
{
209
	return ioread32(card_ctx->mmio_start + had_config_offset(pipe) + reg);
210 211
}

212 213
static void had_write_register_raw(struct snd_intelhad_card *card_ctx,
				   int pipe, u32 reg, u32 val)
214
{
215
	iowrite32(val, card_ctx->mmio_start + had_config_offset(pipe) + reg);
216 217
}

218
static void had_read_register(struct snd_intelhad *ctx, u32 reg, u32 *val)
219
{
220 221 222
	if (!ctx->connected)
		*val = 0;
	else
223
		*val = had_read_register_raw(ctx->card_ctx, ctx->pipe, reg);
224 225
}

226
static void had_write_register(struct snd_intelhad *ctx, u32 reg, u32 val)
227
{
228
	if (ctx->connected)
229
		had_write_register_raw(ctx->card_ctx, ctx->pipe, reg, val);
230 231
}

232
/*
233 234
 * enable / disable audio configuration
 *
235
 * The normal read/modify should not directly be used on VLV2 for
236
 * updating AUD_CONFIG register.
237 238 239 240 241 242 243 244 245 246
 * 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.
 */
247
static void had_enable_audio(struct snd_intelhad *intelhaddata,
248
			     bool enable)
249
{
250 251 252 253
	/* update the cached value */
	intelhaddata->aud_config.regx.aud_en = enable;
	had_write_register(intelhaddata, AUD_CONFIG,
			   intelhaddata->aud_config.regval);
254 255
}

256 257
/* forcibly ACKs to both BUFFER_DONE and BUFFER_UNDERRUN interrupts */
static void had_ack_irqs(struct snd_intelhad *ctx)
258 259 260
{
	u32 status_reg;

261 262
	if (!ctx->connected)
		return;
263 264 265 266
	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);
267 268
}

269 270
/* Reset buffer pointers */
static void had_reset_audio(struct snd_intelhad *intelhaddata)
271
{
T
Takashi Iwai 已提交
272 273
	had_write_register(intelhaddata, AUD_HDMI_STATUS,
			   AUD_HDMI_STATUSG_MASK_FUNCRST);
274
	had_write_register(intelhaddata, AUD_HDMI_STATUS, 0);
275 276
}

T
Takashi Iwai 已提交
277
/*
278 279 280 281 282 283
 * 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)
{
284 285
	union aud_ch_status_0 ch_stat0 = {.regval = 0};
	union aud_ch_status_1 ch_stat1 = {.regval = 0};
286

287
	ch_stat0.regx.lpcm_id = (intelhaddata->aes_bits &
T
Takashi Iwai 已提交
288
					  IEC958_AES0_NONAUDIO) >> 1;
289
	ch_stat0.regx.clk_acc = (intelhaddata->aes_bits &
T
Takashi Iwai 已提交
290
					  IEC958_AES3_CON_CLOCK) >> 4;
291 292 293

	switch (substream->runtime->rate) {
	case AUD_SAMPLE_RATE_32:
294
		ch_stat0.regx.samp_freq = CH_STATUS_MAP_32KHZ;
295 296 297
		break;

	case AUD_SAMPLE_RATE_44_1:
298
		ch_stat0.regx.samp_freq = CH_STATUS_MAP_44KHZ;
299 300
		break;
	case AUD_SAMPLE_RATE_48:
301
		ch_stat0.regx.samp_freq = CH_STATUS_MAP_48KHZ;
302 303
		break;
	case AUD_SAMPLE_RATE_88_2:
304
		ch_stat0.regx.samp_freq = CH_STATUS_MAP_88KHZ;
305 306
		break;
	case AUD_SAMPLE_RATE_96:
307
		ch_stat0.regx.samp_freq = CH_STATUS_MAP_96KHZ;
308 309
		break;
	case AUD_SAMPLE_RATE_176_4:
310
		ch_stat0.regx.samp_freq = CH_STATUS_MAP_176KHZ;
311 312
		break;
	case AUD_SAMPLE_RATE_192:
313
		ch_stat0.regx.samp_freq = CH_STATUS_MAP_192KHZ;
314 315 316 317 318 319
		break;

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

321
	had_write_register(intelhaddata,
322
			   AUD_CH_STATUS_0, ch_stat0.regval);
323

T
Takashi Iwai 已提交
324 325
	switch (substream->runtime->format) {
	case SNDRV_PCM_FORMAT_S16_LE:
326 327
		ch_stat1.regx.max_wrd_len = MAX_SMPL_WIDTH_20;
		ch_stat1.regx.wrd_len = SMPL_WIDTH_16BITS;
T
Takashi Iwai 已提交
328 329 330
		break;
	case SNDRV_PCM_FORMAT_S24_LE:
	case SNDRV_PCM_FORMAT_S32_LE:
331 332
		ch_stat1.regx.max_wrd_len = MAX_SMPL_WIDTH_24;
		ch_stat1.regx.wrd_len = SMPL_WIDTH_24BITS;
T
Takashi Iwai 已提交
333 334 335
		break;
	default:
		return -EINVAL;
336
	}
T
Takashi Iwai 已提交
337

338
	had_write_register(intelhaddata,
339
			   AUD_CH_STATUS_1, ch_stat1.regval);
340 341 342
	return 0;
}

343
/*
344 345 346 347
 * function to initialize audio
 * registers and buffer confgiuration registers
 * This function is called in the prepare callback
 */
348 349
static int had_init_audio_ctrl(struct snd_pcm_substream *substream,
			       struct snd_intelhad *intelhaddata)
350
{
351 352
	union aud_cfg cfg_val = {.regval = 0};
	union aud_buf_config buf_cfg = {.regval = 0};
353 354 355 356
	u8 channels;

	had_prog_status_reg(substream, intelhaddata);

357 358 359 360
	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);
361 362

	channels = substream->runtime->channels;
363
	cfg_val.regx.num_ch = channels - 2;
364
	if (channels <= 2)
365
		cfg_val.regx.layout = LAYOUT0;
366
	else
367
		cfg_val.regx.layout = LAYOUT1;
368

T
Takashi Iwai 已提交
369 370 371
	if (substream->runtime->format == SNDRV_PCM_FORMAT_S16_LE)
		cfg_val.regx.packet_mode = 1;

T
Takashi Iwai 已提交
372 373 374
	if (substream->runtime->format == SNDRV_PCM_FORMAT_S32_LE)
		cfg_val.regx.left_align = 1;

375
	cfg_val.regx.val_bit = 1;
376 377 378 379 380 381 382

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

383
	had_write_register(intelhaddata, AUD_CONFIG, cfg_val.regval);
384
	intelhaddata->aud_config = cfg_val;
385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415
	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.
 */
416 417
static int had_channel_allocation(struct snd_intelhad *intelhaddata,
				  int channels)
418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436
{
	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++) {
437
		if (intelhaddata->eld[DRM_ELD_SPEAKER] & (1 << i))
438 439 440 441 442 443 444 445 446 447 448 449 450
			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;
		}
	}

451
	dev_dbg(intelhaddata->dev, "select CA 0x%x for %d\n", ca, channels);
452 453 454 455 456 457 458

	return ca;
}

/* from speaker bit mask to ALSA API channel position */
static int spk_to_chmap(int spk)
{
T
Takashi Iwai 已提交
459
	const struct channel_map_table *t = map_tables;
460 461 462 463 464 465 466 467

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

468
static void had_build_channel_allocation_map(struct snd_intelhad *intelhaddata)
469
{
T
Takashi Iwai 已提交
470
	int i, c;
471 472 473 474 475
	int spk_mask = 0;
	struct snd_pcm_chmap_elem *chmap;
	u8 eld_high, eld_high_mask = 0xF0;
	u8 high_msb;

476 477 478
	kfree(intelhaddata->chmap->chmap);
	intelhaddata->chmap->chmap = NULL;

479
	chmap = kzalloc(sizeof(*chmap), GFP_KERNEL);
480
	if (!chmap)
481 482
		return;

483 484
	dev_dbg(intelhaddata->dev, "eld speaker = %x\n",
		intelhaddata->eld[DRM_ELD_SPEAKER]);
485 486 487 488 489 490 491 492 493 494

	/* 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 */
495
	eld_high = intelhaddata->eld[DRM_ELD_SPEAKER] & eld_high_mask;
496 497 498 499 500 501
	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) {
502
				intelhaddata->eld[DRM_ELD_SPEAKER] &=
503 504 505 506 507 508 509
					high_msb | 0xF;
				break;
			}
		}
	}

	for (i = 0; i < ARRAY_SIZE(eld_speaker_allocation_bits); i++) {
510
		if (intelhaddata->eld[DRM_ELD_SPEAKER] & (1 << i))
511 512 513 514 515 516 517 518
			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 已提交
519
						(MAX_SPEAKERS - 1) - c]);
520 521 522 523 524 525
			}
			chmap->channels = channel_allocations[i].channels;
			intelhaddata->chmap->chmap = chmap;
			break;
		}
	}
526
	if (i >= ARRAY_SIZE(channel_allocations))
527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547
		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 已提交
548
	int i;
549 550
	const struct snd_pcm_chmap_elem *chmap;

551 552
	memset(ucontrol->value.integer.value, 0,
	       sizeof(long) * HAD_MAX_CHANNEL);
553 554 555
	mutex_lock(&intelhaddata->mutex);
	if (!intelhaddata->chmap->chmap) {
		mutex_unlock(&intelhaddata->mutex);
556
		return 0;
557 558
	}

559
	chmap = intelhaddata->chmap->chmap;
560
	for (i = 0; i < chmap->channels; i++)
561
		ucontrol->value.integer.value[i] = chmap->map[i];
562
	mutex_unlock(&intelhaddata->mutex);
563 564 565 566 567 568 569

	return 0;
}

static int had_register_chmap_ctls(struct snd_intelhad *intelhaddata,
						struct snd_pcm *pcm)
{
T
Takashi Iwai 已提交
570
	int err;
571 572 573 574 575 576 577 578

	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;
579 580
	intelhaddata->chmap->kctl->info = had_chmap_ctl_info;
	intelhaddata->chmap->kctl->get = had_chmap_ctl_get;
581 582 583 584
	intelhaddata->chmap->chmap = NULL;
	return 0;
}

585
/*
T
Takashi Iwai 已提交
586
 * Initialize Data Island Packets registers
587 588
 * This function is called in the prepare callback
 */
589 590
static void had_prog_dip(struct snd_pcm_substream *substream,
			 struct snd_intelhad *intelhaddata)
591 592
{
	int i;
593 594 595
	union aud_ctrl_st ctrl_state = {.regval = 0};
	union aud_info_frame2 frame2 = {.regval = 0};
	union aud_info_frame3 frame3 = {.regval = 0};
596
	u8 checksum = 0;
597
	u32 info_frame;
598
	int channels;
599
	int ca;
600 601 602

	channels = substream->runtime->channels;

603
	had_write_register(intelhaddata, AUD_CNTL_ST, ctrl_state.regval);
604

605
	ca = had_channel_allocation(intelhaddata, channels);
606 607
	if (intelhaddata->dp_output) {
		info_frame = DP_INFO_FRAME_WORD1;
608
		frame2.regval = (substream->runtime->channels - 1) | (ca << 24);
609 610
	} else {
		info_frame = HDMI_INFO_FRAME_WORD1;
611
		frame2.regx.chnl_cnt = substream->runtime->channels - 1;
612
		frame3.regx.chnl_alloc = ca;
613

T
Takashi Iwai 已提交
614
		/* Calculte the byte wide checksum for all valid DIP words */
615
		for (i = 0; i < BYTES_PER_WORD; i++)
616
			checksum += (info_frame >> (i * 8)) & 0xff;
617
		for (i = 0; i < BYTES_PER_WORD; i++)
618
			checksum += (frame2.regval >> (i * 8)) & 0xff;
619
		for (i = 0; i < BYTES_PER_WORD; i++)
620
			checksum += (frame3.regval >> (i * 8)) & 0xff;
621

622
		frame2.regx.chksum = -(checksum);
623
	}
624

T
Takashi Iwai 已提交
625
	had_write_register(intelhaddata, AUD_HDMIW_INFOFR, info_frame);
626 627
	had_write_register(intelhaddata, AUD_HDMIW_INFOFR, frame2.regval);
	had_write_register(intelhaddata, AUD_HDMIW_INFOFR, frame3.regval);
628 629 630

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

633 634 635
	ctrl_state.regx.dip_freq = 1;
	ctrl_state.regx.dip_en_sta = 1;
	had_write_register(intelhaddata, AUD_CNTL_ST, ctrl_state.regval);
636 637
}

638 639 640 641
static int had_calculate_maud_value(u32 aud_samp_freq, u32 link_rate)
{
	u32 maud_val;

T
Takashi Iwai 已提交
642
	/* Select maud according to DP 1.2 spec */
643 644 645 646 647 648 649 650 651 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
	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;
}

717
/*
T
Takashi Iwai 已提交
718
 * Program HDMI audio CTS value
719 720 721
 *
 * @aud_samp_freq: sampling frequency of audio data
 * @tmds: sampling frequency of the display data
722
 * @link_rate: DP link rate
723
 * @n_param: N value, depends on aud_samp_freq
724
 * @intelhaddata: substream private data
725 726 727
 *
 * Program CTS register based on the audio and display sampling frequency
 */
728 729
static void had_prog_cts(u32 aud_samp_freq, u32 tmds, u32 link_rate,
			 u32 n_param, struct snd_intelhad *intelhaddata)
730 731 732 733
{
	u32 cts_val;
	u64 dividend, divisor;

734 735 736 737 738 739 740 741 742
	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);
	}
743
	dev_dbg(intelhaddata->dev, "TMDS value=%d, N value=%d, CTS Value=%d\n",
744
		 tmds, n_param, cts_val);
745
	had_write_register(intelhaddata, AUD_HDMI_CTS, (BIT(24) | cts_val));
746 747 748 749
}

static int had_calculate_n_value(u32 aud_samp_freq)
{
T
Takashi Iwai 已提交
750
	int n_val;
751 752 753 754 755

	/* Select N according to HDMI 1.3a spec*/
	switch (aud_samp_freq) {
	case AUD_SAMPLE_RATE_32:
		n_val = 4096;
T
Takashi Iwai 已提交
756
		break;
757 758 759

	case AUD_SAMPLE_RATE_44_1:
		n_val = 6272;
T
Takashi Iwai 已提交
760
		break;
761 762 763

	case AUD_SAMPLE_RATE_48:
		n_val = 6144;
T
Takashi Iwai 已提交
764
		break;
765 766 767

	case AUD_SAMPLE_RATE_88_2:
		n_val = 12544;
T
Takashi Iwai 已提交
768
		break;
769 770 771

	case AUD_SAMPLE_RATE_96:
		n_val = 12288;
T
Takashi Iwai 已提交
772
		break;
773 774 775

	case AUD_SAMPLE_RATE_176_4:
		n_val = 25088;
T
Takashi Iwai 已提交
776
		break;
777 778 779

	case HAD_MAX_RATE:
		n_val = 24576;
T
Takashi Iwai 已提交
780
		break;
781 782 783

	default:
		n_val = -EINVAL;
T
Takashi Iwai 已提交
784
		break;
785 786 787 788
	}
	return n_val;
}

789
/*
T
Takashi Iwai 已提交
790
 * Program HDMI audio N value
791 792 793
 *
 * @aud_samp_freq: sampling frequency of audio data
 * @n_param: N value, depends on aud_samp_freq
794
 * @intelhaddata: substream private data
795 796 797 798
 *
 * This function is called in the prepare callback.
 * It programs based on the audio and display sampling frequency
 */
799 800
static int had_prog_n(u32 aud_samp_freq, u32 *n_param,
		      struct snd_intelhad *intelhaddata)
801
{
T
Takashi Iwai 已提交
802
	int n_val;
803

804 805 806 807 808 809 810 811 812 813 814 815
	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);
816 817 818 819

	if (n_val < 0)
		return n_val;

820
	had_write_register(intelhaddata, AUD_N_ENABLE, (BIT(24) | n_val));
821 822 823 824
	*n_param = n_val;
	return 0;
}

825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857
/*
 * 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.
858 859 860 861 862
 *
 * 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.
863 864 865 866 867 868 869 870 871 872 873 874 875
 */

#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;

876 877 878
	addr |= AUD_BUF_VALID;
	if (!substream->runtime->no_period_wakeup)
		addr |= AUD_BUF_INTR_EN;
879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906
	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);
907 908
	/* set the minimum 2 BDs for num_periods=1 */
	intelhaddata->num_bds = max(intelhaddata->num_bds, 2U);
909 910 911 912 913 914 915 916 917
	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++) {
918
		if (i < intelhaddata->num_bds)
919 920 921 922 923 924 925 926 927 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
			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 */

991 992 993 994 995
	if (!intelhaddata->connected) {
		snd_pcm_stop_xrun(substream);
		goto out; /* disconnected? - bail out */
	}

996 997 998 999 1000 1001
	/* process or stop the stream */
	if (had_process_ringbuf(substream, intelhaddata) < 0)
		snd_pcm_stop_xrun(substream);
	else
		snd_pcm_period_elapsed(substream);

1002
 out:
1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014
	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;

1015
	for (i = 0; i < 100; i++) {
1016 1017
		/* clear bit30, 31 AUD_HDMI_STATUS */
		had_read_register(intelhaddata, AUD_HDMI_STATUS, &val);
T
Takashi Iwai 已提交
1018
		if (!(val & AUD_HDMI_STATUS_MASK_UNDERRUN))
1019
			return;
1020 1021
		udelay(100);
		cond_resched();
1022 1023 1024 1025 1026
		had_write_register(intelhaddata, AUD_HDMI_STATUS, val);
	}
	dev_err(intelhaddata->dev, "Unable to clear UNDERRUN bits\n");
}

1027 1028 1029 1030 1031
/* 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)
1032
{
1033
	if (!intelhaddata->need_reset || !intelhaddata->connected)
1034
		return;
1035 1036

	/* Reset buffer pointers */
1037
	had_reset_audio(intelhaddata);
1038
	wait_clear_underrun_bit(intelhaddata);
1039 1040
	intelhaddata->need_reset = false;
}
1041

1042 1043 1044 1045
/* called from irq handler */
static void had_process_buffer_underrun(struct snd_intelhad *intelhaddata)
{
	struct snd_pcm_substream *substream;
1046 1047 1048 1049 1050 1051 1052

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

T
Takashi Iwai 已提交
1056
/*
T
Takashi Iwai 已提交
1057
 * ALSA PCM open callback
1058
 */
1059
static int had_pcm_open(struct snd_pcm_substream *substream)
1060 1061 1062 1063 1064 1065 1066 1067
{
	struct snd_intelhad *intelhaddata;
	struct snd_pcm_runtime *runtime;
	int retval;

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

T
Takashi Iwai 已提交
1068
	pm_runtime_get_sync(intelhaddata->dev);
1069 1070

	/* set the runtime hw parameter with local snd_pcm_hardware struct */
1071
	runtime->hw = had_pcm_hardware;
1072 1073 1074 1075

	retval = snd_pcm_hw_constraint_integer(runtime,
			 SNDRV_PCM_HW_PARAM_PERIODS);
	if (retval < 0)
1076
		goto error;
1077 1078 1079 1080 1081 1082

	/* 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);
1083
	if (retval < 0)
1084
		goto error;
1085

T
Takashi Iwai 已提交
1086 1087 1088 1089
	retval = snd_pcm_hw_constraint_msbits(runtime, 0, 32, 24);
	if (retval < 0)
		goto error;

1090
	/* expose PCM substream */
1091 1092 1093 1094 1095
	spin_lock_irq(&intelhaddata->had_spinlock);
	intelhaddata->stream_info.substream = substream;
	intelhaddata->stream_info.substream_refcount++;
	spin_unlock_irq(&intelhaddata->had_spinlock);

1096
	return retval;
1097
 error:
1098 1099
	pm_runtime_mark_last_busy(intelhaddata->dev);
	pm_runtime_put_autosuspend(intelhaddata->dev);
1100 1101 1102
	return retval;
}

T
Takashi Iwai 已提交
1103
/*
T
Takashi Iwai 已提交
1104
 * ALSA PCM close callback
1105
 */
1106
static int had_pcm_close(struct snd_pcm_substream *substream)
1107 1108 1109 1110 1111
{
	struct snd_intelhad *intelhaddata;

	intelhaddata = snd_pcm_substream_chip(substream);

1112
	/* unreference and sync with the pending PCM accesses */
1113 1114 1115 1116 1117 1118 1119 1120 1121
	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);
1122

1123 1124
	pm_runtime_mark_last_busy(intelhaddata->dev);
	pm_runtime_put_autosuspend(intelhaddata->dev);
1125 1126 1127
	return 0;
}

T
Takashi Iwai 已提交
1128
/*
T
Takashi Iwai 已提交
1129
 * ALSA PCM hw_params callback
1130
 */
1131 1132
static int had_pcm_hw_params(struct snd_pcm_substream *substream,
			     struct snd_pcm_hw_params *hw_params)
1133
{
1134
	struct snd_intelhad *intelhaddata;
1135
	int buf_size, retval;
1136

1137
	intelhaddata = snd_pcm_substream_chip(substream);
1138 1139 1140 1141
	buf_size = params_buffer_bytes(hw_params);
	retval = snd_pcm_lib_malloc_pages(substream, buf_size);
	if (retval < 0)
		return retval;
1142 1143
	dev_dbg(intelhaddata->dev, "%s:allocated memory = %d\n",
		__func__, buf_size);
1144 1145 1146
	return retval;
}

T
Takashi Iwai 已提交
1147
/*
T
Takashi Iwai 已提交
1148
 * ALSA PCM hw_free callback
1149
 */
1150
static int had_pcm_hw_free(struct snd_pcm_substream *substream)
1151
{
1152
	struct snd_intelhad *intelhaddata;
1153

1154 1155 1156
	intelhaddata = snd_pcm_substream_chip(substream);
	had_do_reset(intelhaddata);

1157
	return snd_pcm_lib_free_pages(substream);
1158 1159
}

T
Takashi Iwai 已提交
1160
/*
T
Takashi Iwai 已提交
1161
 * ALSA PCM trigger callback
1162
 */
1163
static int had_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
1164
{
1165
	int retval = 0;
1166 1167 1168 1169
	struct snd_intelhad *intelhaddata;

	intelhaddata = snd_pcm_substream_chip(substream);

1170
	spin_lock(&intelhaddata->had_spinlock);
1171 1172
	switch (cmd) {
	case SNDRV_PCM_TRIGGER_START:
T
Takashi Iwai 已提交
1173 1174
	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
	case SNDRV_PCM_TRIGGER_RESUME:
1175
		/* Enable Audio */
1176
		had_ack_irqs(intelhaddata); /* FIXME: do we need this? */
1177
		had_enable_audio(intelhaddata, true);
1178 1179 1180
		break;

	case SNDRV_PCM_TRIGGER_STOP:
T
Takashi Iwai 已提交
1181
	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
1182
		/* Disable Audio */
1183
		had_enable_audio(intelhaddata, false);
1184
		intelhaddata->need_reset = true;
1185 1186 1187 1188 1189
		break;

	default:
		retval = -EINVAL;
	}
1190
	spin_unlock(&intelhaddata->had_spinlock);
1191 1192 1193
	return retval;
}

T
Takashi Iwai 已提交
1194
/*
T
Takashi Iwai 已提交
1195
 * ALSA PCM prepare callback
1196
 */
1197
static int had_pcm_prepare(struct snd_pcm_substream *substream)
1198 1199 1200
{
	int retval;
	u32 disp_samp_freq, n_param;
1201
	u32 link_rate = 0;
1202 1203 1204 1205 1206 1207
	struct snd_intelhad *intelhaddata;
	struct snd_pcm_runtime *runtime;

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

1208
	dev_dbg(intelhaddata->dev, "period_size=%d\n",
1209
		(int)frames_to_bytes(runtime, runtime->period_size));
1210 1211 1212 1213 1214
	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);
1215

1216 1217
	had_do_reset(intelhaddata);

1218
	/* Get N value in KHz */
1219
	disp_samp_freq = intelhaddata->tmds_clock_speed;
1220

1221
	retval = had_prog_n(substream->runtime->rate, &n_param, intelhaddata);
1222
	if (retval) {
1223 1224
		dev_err(intelhaddata->dev,
			"programming N value failed %#x\n", retval);
1225 1226
		goto prep_end;
	}
1227 1228

	if (intelhaddata->dp_output)
1229
		link_rate = intelhaddata->link_rate;
1230

1231 1232
	had_prog_cts(substream->runtime->rate, disp_samp_freq, link_rate,
		     n_param, intelhaddata);
1233

1234
	had_prog_dip(substream, intelhaddata);
1235

1236
	retval = had_init_audio_ctrl(substream, intelhaddata);
1237 1238

	/* Prog buffer address */
1239
	had_init_ringbuf(substream, intelhaddata);
1240 1241 1242 1243 1244 1245

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

1246
	had_write_register(intelhaddata, AUD_BUF_CH_SWAP, SWAP_LFE_CENTER);
1247 1248 1249 1250 1251

prep_end:
	return retval;
}

T
Takashi Iwai 已提交
1252
/*
T
Takashi Iwai 已提交
1253
 * ALSA PCM pointer callback
1254
 */
1255
static snd_pcm_uframes_t had_pcm_pointer(struct snd_pcm_substream *substream)
1256 1257
{
	struct snd_intelhad *intelhaddata;
1258
	int len;
1259 1260 1261

	intelhaddata = snd_pcm_substream_chip(substream);

1262
	if (!intelhaddata->connected)
T
Takashi Iwai 已提交
1263 1264
		return SNDRV_PCM_POS_XRUN;

1265 1266 1267
	len = had_process_ringbuf(substream, intelhaddata);
	if (len < 0)
		return SNDRV_PCM_POS_XRUN;
1268 1269 1270 1271
	len = bytes_to_frames(substream->runtime, len);
	/* wrapping may happen when periods=1 */
	len %= substream->runtime->buffer_size;
	return len;
1272 1273
}

T
Takashi Iwai 已提交
1274
/*
T
Takashi Iwai 已提交
1275
 * ALSA PCM mmap callback
1276
 */
1277 1278
static int had_pcm_mmap(struct snd_pcm_substream *substream,
			struct vm_area_struct *vma)
1279 1280 1281 1282 1283 1284 1285
{
	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);
}

1286 1287 1288
/*
 * ALSA PCM ops
 */
1289 1290 1291
static const struct snd_pcm_ops had_pcm_ops = {
	.open =		had_pcm_open,
	.close =	had_pcm_close,
1292
	.ioctl =	snd_pcm_lib_ioctl,
1293 1294 1295 1296 1297 1298
	.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,
1299 1300
};

1301
/* process mode change of the running stream; called in mutex */
1302
static int had_process_mode_change(struct snd_intelhad *intelhaddata)
1303
{
1304
	struct snd_pcm_substream *substream;
1305 1306
	int retval = 0;
	u32 disp_samp_freq, n_param;
1307
	u32 link_rate = 0;
1308

1309 1310
	substream = had_substream_get(intelhaddata);
	if (!substream)
1311
		return 0;
1312 1313

	/* Disable Audio */
1314
	had_enable_audio(intelhaddata, false);
1315 1316

	/* Update CTS value */
1317
	disp_samp_freq = intelhaddata->tmds_clock_speed;
1318

1319
	retval = had_prog_n(substream->runtime->rate, &n_param, intelhaddata);
1320
	if (retval) {
1321 1322
		dev_err(intelhaddata->dev,
			"programming N value failed %#x\n", retval);
1323 1324
		goto out;
	}
1325 1326

	if (intelhaddata->dp_output)
1327
		link_rate = intelhaddata->link_rate;
1328

1329 1330
	had_prog_cts(substream->runtime->rate, disp_samp_freq, link_rate,
		     n_param, intelhaddata);
1331 1332

	/* Enable Audio */
1333
	had_enable_audio(intelhaddata, true);
1334 1335

out:
1336
	had_substream_put(intelhaddata);
1337 1338 1339
	return retval;
}

1340
/* process hot plug, called from wq with mutex locked */
1341
static void had_process_hot_plug(struct snd_intelhad *intelhaddata)
1342 1343 1344
{
	struct snd_pcm_substream *substream;

1345
	spin_lock_irq(&intelhaddata->had_spinlock);
1346
	if (intelhaddata->connected) {
1347
		dev_dbg(intelhaddata->dev, "Device already connected\n");
1348
		spin_unlock_irq(&intelhaddata->had_spinlock);
1349
		return;
1350
	}
1351

1352 1353 1354
	/* Disable Audio */
	had_enable_audio(intelhaddata, false);

1355
	intelhaddata->connected = true;
1356 1357
	dev_dbg(intelhaddata->dev,
		"%s @ %d:DEBUG PLUG/UNPLUG : HAD_DRV_CONNECTED\n",
1358
			__func__, __LINE__);
1359
	spin_unlock_irq(&intelhaddata->had_spinlock);
1360

1361 1362 1363
	had_build_channel_allocation_map(intelhaddata);

	/* Report to above ALSA layer */
1364
	substream = had_substream_get(intelhaddata);
1365
	if (substream) {
1366
		snd_pcm_stop_xrun(substream);
1367
		had_substream_put(intelhaddata);
1368 1369
	}

T
Takashi Iwai 已提交
1370
	snd_jack_report(intelhaddata->jack, SND_JACK_AVOUT);
1371 1372
}

1373
/* process hot unplug, called from wq with mutex locked */
1374
static void had_process_hot_unplug(struct snd_intelhad *intelhaddata)
1375
{
1376
	struct snd_pcm_substream *substream;
1377

1378
	spin_lock_irq(&intelhaddata->had_spinlock);
1379
	if (!intelhaddata->connected) {
1380
		dev_dbg(intelhaddata->dev, "Device already disconnected\n");
1381
		spin_unlock_irq(&intelhaddata->had_spinlock);
1382
		return;
1383 1384 1385

	}

1386
	/* Disable Audio */
1387
	had_enable_audio(intelhaddata, false);
1388

1389
	intelhaddata->connected = false;
1390 1391
	dev_dbg(intelhaddata->dev,
		"%s @ %d:DEBUG PLUG/UNPLUG : HAD_DRV_DISCONNECTED\n",
1392
			__func__, __LINE__);
1393
	spin_unlock_irq(&intelhaddata->had_spinlock);
1394

1395 1396 1397
	kfree(intelhaddata->chmap->chmap);
	intelhaddata->chmap->chmap = NULL;

1398
	/* Report to above ALSA layer */
1399 1400
	substream = had_substream_get(intelhaddata);
	if (substream) {
1401
		snd_pcm_stop_xrun(substream);
1402 1403
		had_substream_put(intelhaddata);
	}
1404

T
Takashi Iwai 已提交
1405
	snd_jack_report(intelhaddata->jack, 0);
1406 1407
}

1408 1409 1410
/*
 * ALSA iec958 and ELD controls
 */
1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424

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);

1425
	mutex_lock(&intelhaddata->mutex);
1426 1427 1428 1429 1430 1431
	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;
1432
	mutex_unlock(&intelhaddata->mutex);
1433 1434
	return 0;
}
1435

1436 1437 1438 1439 1440 1441 1442 1443 1444
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;
}
1445

1446 1447 1448 1449 1450
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);
1451
	int changed = 0;
1452 1453 1454 1455 1456

	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);
1457
	mutex_lock(&intelhaddata->mutex);
1458 1459
	if (intelhaddata->aes_bits != val) {
		intelhaddata->aes_bits = val;
1460
		changed = 1;
1461
	}
1462 1463
	mutex_unlock(&intelhaddata->mutex);
	return changed;
1464 1465
}

1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484
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;
}
1485

1486
static const struct snd_kcontrol_new had_controls[] = {
1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508
	{
		.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,
	},
1509 1510
};

1511 1512 1513
/*
 * audio interrupt handler
 */
1514 1515
static irqreturn_t display_pipe_interrupt_handler(int irq, void *dev_id)
{
1516
	struct snd_intelhad_card *card_ctx = dev_id;
1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529
	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]);
	}
1530

1531 1532
	for_each_port(card_ctx, port) {
		struct snd_intelhad *ctx = &card_ctx->pcm_ctx[port];
1533
		int pipe = ctx->pipe;
1534

1535 1536
		if (pipe < 0)
			continue;
1537

1538
		if (audio_stat[pipe] & HDMI_AUDIO_BUFFER_DONE)
1539
			had_process_buffer_done(ctx);
1540 1541
		if (audio_stat[pipe] & HDMI_AUDIO_UNDERRUN)
			had_process_buffer_underrun(ctx);
1542 1543 1544 1545 1546
	}

	return IRQ_HANDLED;
}

1547 1548 1549
/*
 * monitor plug/unplug notification from i915; just kick off the work
 */
1550
static void notify_audio_lpe(struct platform_device *pdev, int port)
1551
{
1552
	struct snd_intelhad_card *card_ctx = platform_get_drvdata(pdev);
1553 1554 1555 1556 1557
	struct snd_intelhad *ctx;

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

1559 1560
	schedule_work(&ctx->hdmi_audio_wq);
}
1561

1562
/* the work to handle monitor hot plug/unplug */
1563 1564 1565 1566 1567
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;
1568
	struct intel_hdmi_lpe_audio_port_pdata *ppdata = &pdata->port[ctx->port];
1569

T
Takashi Iwai 已提交
1570
	pm_runtime_get_sync(ctx->dev);
1571
	mutex_lock(&ctx->mutex);
1572
	if (ppdata->pipe < 0) {
1573 1574 1575
		dev_dbg(ctx->dev, "%s: Event: HAD_NOTIFY_HOT_UNPLUG : port = %d\n",
			__func__, ctx->port);

1576
		memset(ctx->eld, 0, sizeof(ctx->eld)); /* clear the old ELD */
1577 1578 1579 1580 1581 1582

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

		/* Shut down the stream */
1583
		had_process_hot_unplug(ctx);
1584

1585
		ctx->pipe = -1;
1586
	} else {
1587
		dev_dbg(ctx->dev, "%s: HAD_NOTIFY_ELD : port = %d, tmds = %d\n",
1588
			__func__, ctx->port, ppdata->ls_clock);
1589

1590
		memcpy(ctx->eld, ppdata->eld, sizeof(ctx->eld));
1591

1592
		ctx->dp_output = ppdata->dp_output;
1593 1594
		if (ctx->dp_output) {
			ctx->tmds_clock_speed = 0;
1595
			ctx->link_rate = ppdata->ls_clock;
1596
		} else {
1597
			ctx->tmds_clock_speed = ppdata->ls_clock;
1598 1599
			ctx->link_rate = 0;
		}
1600

1601 1602 1603 1604
		/*
		 * Shut down the stream before we change
		 * the pipe assignment for this pcm device
		 */
1605
		had_process_hot_plug(ctx);
1606

1607 1608 1609
		ctx->pipe = ppdata->pipe;

		/* Restart the stream if necessary */
1610
		had_process_mode_change(ctx);
1611
	}
1612

1613
	mutex_unlock(&ctx->mutex);
1614 1615
	pm_runtime_mark_last_busy(ctx->dev);
	pm_runtime_put_autosuspend(ctx->dev);
T
Takashi Iwai 已提交
1616 1617
}

T
Takashi Iwai 已提交
1618 1619 1620
/*
 * Jack interface
 */
1621 1622
static int had_create_jack(struct snd_intelhad *ctx,
			   struct snd_pcm *pcm)
T
Takashi Iwai 已提交
1623
{
1624
	char hdmi_str[32];
T
Takashi Iwai 已提交
1625 1626
	int err;

1627 1628 1629
	snprintf(hdmi_str, sizeof(hdmi_str),
		 "HDMI/DP,pcm=%d", pcm->device);

1630 1631
	err = snd_jack_new(ctx->card_ctx->card, hdmi_str,
			   SND_JACK_AVOUT, &ctx->jack,
T
Takashi Iwai 已提交
1632 1633 1634 1635 1636 1637 1638
			   true, false);
	if (err < 0)
		return err;
	ctx->jack->private_data = ctx;
	return 0;
}

T
Takashi Iwai 已提交
1639 1640 1641 1642
/*
 * PM callbacks
 */

1643
static int __maybe_unused hdmi_lpe_audio_suspend(struct device *dev)
T
Takashi Iwai 已提交
1644
{
1645
	struct snd_intelhad_card *card_ctx = dev_get_drvdata(dev);
T
Takashi Iwai 已提交
1646

1647
	snd_power_change_state(card_ctx->card, SNDRV_CTL_POWER_D3hot);
T
Takashi Iwai 已提交
1648

1649 1650 1651
	return 0;
}

1652
static int __maybe_unused hdmi_lpe_audio_resume(struct device *dev)
T
Takashi Iwai 已提交
1653
{
1654
	struct snd_intelhad_card *card_ctx = dev_get_drvdata(dev);
T
Takashi Iwai 已提交
1655

1656 1657
	pm_runtime_mark_last_busy(dev);

1658
	snd_power_change_state(card_ctx->card, SNDRV_CTL_POWER_D0);
1659

T
Takashi Iwai 已提交
1660
	return 0;
1661 1662 1663 1664 1665
}

/* release resources */
static void hdmi_lpe_audio_free(struct snd_card *card)
{
1666 1667 1668
	struct snd_intelhad_card *card_ctx = card->private_data;
	struct intel_hdmi_lpe_audio_pdata *pdata = card_ctx->dev->platform_data;
	int port;
1669

1670 1671 1672
	spin_lock_irq(&pdata->lpe_audio_slock);
	pdata->notify_audio_lpe = NULL;
	spin_unlock_irq(&pdata->lpe_audio_slock);
1673

1674 1675
	for_each_port(card_ctx, port) {
		struct snd_intelhad *ctx = &card_ctx->pcm_ctx[port];
1676

1677 1678
		cancel_work_sync(&ctx->hdmi_audio_wq);
	}
1679

1680 1681 1682 1683
	if (card_ctx->mmio_start)
		iounmap(card_ctx->mmio_start);
	if (card_ctx->irq >= 0)
		free_irq(card_ctx->irq, card_ctx);
1684 1685
}

1686
/*
1687
 * hdmi_lpe_audio_probe - start bridge with i915
1688
 *
1689
 * This function is called when the i915 driver creates the
T
Takashi Iwai 已提交
1690
 * hdmi-lpe-audio platform device.
1691
 */
1692
static int hdmi_lpe_audio_probe(struct platform_device *pdev)
1693 1694
{
	struct snd_card *card;
1695
	struct snd_intelhad_card *card_ctx;
1696
	struct snd_intelhad *ctx;
1697 1698 1699 1700
	struct snd_pcm *pcm;
	struct intel_hdmi_lpe_audio_pdata *pdata;
	int irq;
	struct resource *res_mmio;
1701
	int port, ret;
1702 1703 1704 1705 1706 1707

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

1709 1710
	/* get resources */
	irq = platform_get_irq(pdev, 0);
1711
	if (irq < 0)
1712
		return irq;
1713 1714 1715 1716 1717 1718

	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;
	}
1719

1720
	/* create a card instance with ALSA framework */
1721
	ret = snd_card_new(&pdev->dev, hdmi_card_index, hdmi_card_id,
1722
			   THIS_MODULE, sizeof(*card_ctx), &card);
1723 1724 1725
	if (ret)
		return ret;

1726 1727 1728
	card_ctx = card->private_data;
	card_ctx->dev = &pdev->dev;
	card_ctx->card = card;
1729
	strcpy(card->driver, INTEL_HAD);
1730 1731
	strcpy(card->shortname, "Intel HDMI/DP LPE Audio");
	strcpy(card->longname, "Intel HDMI/DP LPE Audio");
1732

1733
	card_ctx->irq = -1;
1734 1735 1736

	card->private_free = hdmi_lpe_audio_free;

1737
	platform_set_drvdata(pdev, card_ctx);
1738

1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753
	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);
	}

1754 1755 1756 1757
	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);

1758 1759 1760
	card_ctx->mmio_start = ioremap_nocache(res_mmio->start,
					       (size_t)(resource_size(res_mmio)));
	if (!card_ctx->mmio_start) {
1761 1762 1763 1764
		dev_err(&pdev->dev, "Could not get ioremap\n");
		ret = -EACCES;
		goto err;
	}
1765

1766 1767
	/* setup interrupt handler */
	ret = request_irq(irq, display_pipe_interrupt_handler, 0,
1768
			  pdev->name, card_ctx);
1769 1770 1771 1772
	if (ret < 0) {
		dev_err(&pdev->dev, "request_irq failed\n");
		goto err;
	}
1773

1774
	card_ctx->irq = irq;
1775 1776 1777 1778 1779

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

1780
	init_channel_allocations();
1781

1782
	card_ctx->num_pipes = pdata->num_pipes;
1783
	card_ctx->num_ports = single_port ? 1 : pdata->num_ports;
1784

1785 1786 1787
	for_each_port(card_ctx, port) {
		int i;

1788
		ctx = &card_ctx->pcm_ctx[port];
1789
		ret = snd_pcm_new(card, INTEL_HAD, port, MAX_PB_STREAMS,
1790 1791
				  MAX_CAP_STREAMS, &pcm);
		if (ret)
1792
			goto err;
1793

1794 1795 1796
		/* setup private data which can be retrieved when required */
		pcm->private_data = ctx;
		pcm->info_flags = 0;
1797
		strlcpy(pcm->name, card->shortname, strlen(card->shortname));
1798 1799
		/* setup the ops for playabck */
		snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &had_pcm_ops);
1800

1801 1802 1803 1804
		/* allocate dma pages;
		 * try to allocate 600k buffer as default which is large enough
		 */
		snd_pcm_lib_preallocate_pages_for_all(pcm,
1805 1806
						      SNDRV_DMA_TYPE_DEV_UC,
						      card->dev,
1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817
						      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;
			}
1818

1819 1820 1821 1822 1823
			kctl->id.device = pcm->device;

			ret = snd_ctl_add(card, kctl);
			if (ret < 0)
				goto err;
1824 1825
		}

1826 1827 1828 1829
		/* Register channel map controls */
		ret = had_register_chmap_ctls(ctx, pcm);
		if (ret < 0)
			goto err;
1830

1831
		ret = had_create_jack(ctx, pcm);
1832 1833 1834
		if (ret < 0)
			goto err;
	}
T
Takashi Iwai 已提交
1835

1836 1837
	ret = snd_card_register(card);
	if (ret)
1838 1839
		goto err;

1840
	spin_lock_irq(&pdata->lpe_audio_slock);
1841
	pdata->notify_audio_lpe = notify_audio_lpe;
1842
	spin_unlock_irq(&pdata->lpe_audio_slock);
1843

1844 1845
	pm_runtime_use_autosuspend(&pdev->dev);
	pm_runtime_mark_last_busy(&pdev->dev);
1846

1847
	dev_dbg(&pdev->dev, "%s: handle pending notification\n", __func__);
1848 1849 1850 1851 1852
	for_each_port(card_ctx, port) {
		struct snd_intelhad *ctx = &card_ctx->pcm_ctx[port];

		schedule_work(&ctx->hdmi_audio_wq);
	}
1853

1854
	return 0;
1855

1856 1857
err:
	snd_card_free(card);
1858
	return ret;
1859 1860
}

1861
/*
1862
 * hdmi_lpe_audio_remove - stop bridge with i915
1863
 *
T
Takashi Iwai 已提交
1864
 * This function is called when the platform device is destroyed.
1865
 */
1866
static int hdmi_lpe_audio_remove(struct platform_device *pdev)
1867
{
1868
	struct snd_intelhad_card *card_ctx = platform_get_drvdata(pdev);
1869

1870
	snd_card_free(card_ctx->card);
1871 1872 1873
	return 0;
}

T
Takashi Iwai 已提交
1874 1875 1876 1877
static const struct dev_pm_ops hdmi_lpe_audio_pm = {
	SET_SYSTEM_SLEEP_PM_OPS(hdmi_lpe_audio_suspend, hdmi_lpe_audio_resume)
};

1878 1879 1880
static struct platform_driver hdmi_lpe_audio_driver = {
	.driver		= {
		.name  = "hdmi-lpe-audio",
T
Takashi Iwai 已提交
1881
		.pm = &hdmi_lpe_audio_pm,
1882 1883 1884 1885 1886 1887 1888 1889
	},
	.probe          = hdmi_lpe_audio_probe,
	.remove		= hdmi_lpe_audio_remove,
};

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

1890 1891 1892 1893 1894 1895 1896
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}");