dw-hdmi.c 50.4 KB
Newer Older
1 2 3 4 5 6 7 8
/*
 * Copyright (C) 2011-2013 Freescale Semiconductor, Inc.
 *
 * 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; either version 2 of the License, or
 * (at your option) any later version.
 *
9
 * Designware High-Definition Multimedia Interface (HDMI) driver
10 11 12
 *
 * Copyright (C) 2010, Guennadi Liakhovetski <g.liakhovetski@gmx.de>
 */
13
#include <linux/module.h>
14 15 16 17
#include <linux/irq.h>
#include <linux/delay.h>
#include <linux/err.h>
#include <linux/clk.h>
S
Sachin Kamat 已提交
18
#include <linux/hdmi.h>
19
#include <linux/mutex.h>
20
#include <linux/of_device.h>
21
#include <linux/spinlock.h>
22

23
#include <drm/drm_of.h>
24
#include <drm/drmP.h>
25
#include <drm/drm_atomic_helper.h>
26 27 28
#include <drm/drm_crtc_helper.h>
#include <drm/drm_edid.h>
#include <drm/drm_encoder_slave.h>
29
#include <drm/bridge/dw_hdmi.h>
30

31 32
#include "dw-hdmi.h"
#include "dw-hdmi-audio.h"
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 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

#define HDMI_EDID_LEN		512

#define RGB			0
#define YCBCR444		1
#define YCBCR422_16BITS		2
#define YCBCR422_8BITS		3
#define XVYCC444		4

enum hdmi_datamap {
	RGB444_8B = 0x01,
	RGB444_10B = 0x03,
	RGB444_12B = 0x05,
	RGB444_16B = 0x07,
	YCbCr444_8B = 0x09,
	YCbCr444_10B = 0x0B,
	YCbCr444_12B = 0x0D,
	YCbCr444_16B = 0x0F,
	YCbCr422_8B = 0x16,
	YCbCr422_10B = 0x14,
	YCbCr422_12B = 0x12,
};

static const u16 csc_coeff_default[3][4] = {
	{ 0x2000, 0x0000, 0x0000, 0x0000 },
	{ 0x0000, 0x2000, 0x0000, 0x0000 },
	{ 0x0000, 0x0000, 0x2000, 0x0000 }
};

static const u16 csc_coeff_rgb_out_eitu601[3][4] = {
	{ 0x2000, 0x6926, 0x74fd, 0x010e },
	{ 0x2000, 0x2cdd, 0x0000, 0x7e9a },
	{ 0x2000, 0x0000, 0x38b4, 0x7e3b }
};

static const u16 csc_coeff_rgb_out_eitu709[3][4] = {
	{ 0x2000, 0x7106, 0x7a02, 0x00a7 },
	{ 0x2000, 0x3264, 0x0000, 0x7e6d },
	{ 0x2000, 0x0000, 0x3b61, 0x7e25 }
};

static const u16 csc_coeff_rgb_in_eitu601[3][4] = {
	{ 0x2591, 0x1322, 0x074b, 0x0000 },
	{ 0x6535, 0x2000, 0x7acc, 0x0200 },
	{ 0x6acd, 0x7534, 0x2000, 0x0200 }
};

static const u16 csc_coeff_rgb_in_eitu709[3][4] = {
	{ 0x2dc5, 0x0d9b, 0x049e, 0x0000 },
	{ 0x62f0, 0x2000, 0x7d11, 0x0200 },
	{ 0x6756, 0x78ab, 0x2000, 0x0200 }
};

struct hdmi_vmode {
	bool mdataenablepolarity;

	unsigned int mpixelclock;
	unsigned int mpixelrepetitioninput;
	unsigned int mpixelrepetitionoutput;
};

struct hdmi_data_info {
	unsigned int enc_in_format;
	unsigned int enc_out_format;
	unsigned int enc_color_depth;
	unsigned int colorimetry;
	unsigned int pix_repet_factor;
	unsigned int hdcp_enable;
	struct hdmi_vmode video_mode;
};

104
struct dw_hdmi {
105
	struct drm_connector connector;
106 107
	struct drm_encoder *encoder;
	struct drm_bridge *bridge;
108

109
	struct platform_device *audio;
110
	enum dw_hdmi_devtype dev_type;
111 112 113 114 115
	struct device *dev;
	struct clk *isfr_clk;
	struct clk *iahb_clk;

	struct hdmi_data_info hdmi_data;
116 117
	const struct dw_hdmi_plat_data *plat_data;

118 119 120 121 122 123 124 125 126 127
	int vic;

	u8 edid[HDMI_EDID_LEN];
	bool cable_plugin;

	bool phy_enabled;
	struct drm_display_mode previous_mode;

	struct i2c_adapter *ddc;
	void __iomem *regs;
128
	bool sink_is_hdmi;
129
	bool sink_has_audio;
130

131
	struct mutex mutex;		/* for state below and previous_mode */
132
	enum drm_connector_force force;	/* mutex-protected force state */
133
	bool disabled;			/* DRM has disabled our bridge */
134
	bool bridge_is_on;		/* indicates the bridge is on */
135 136
	bool rxsense;			/* rxsense state */
	u8 phy_mask;			/* desired phy int mask settings */
137

138
	spinlock_t audio_lock;
139
	struct mutex audio_mutex;
140
	unsigned int sample_rate;
141 142 143
	unsigned int audio_cts;
	unsigned int audio_n;
	bool audio_enable;
144 145 146

	void (*write)(struct dw_hdmi *hdmi, u8 val, int offset);
	u8 (*read)(struct dw_hdmi *hdmi, int offset);
147 148
};

149 150 151 152 153 154 155 156
#define HDMI_IH_PHY_STAT0_RX_SENSE \
	(HDMI_IH_PHY_STAT0_RX_SENSE0 | HDMI_IH_PHY_STAT0_RX_SENSE1 | \
	 HDMI_IH_PHY_STAT0_RX_SENSE2 | HDMI_IH_PHY_STAT0_RX_SENSE3)

#define HDMI_PHY_RX_SENSE \
	(HDMI_PHY_RX_SENSE0 | HDMI_PHY_RX_SENSE1 | \
	 HDMI_PHY_RX_SENSE2 | HDMI_PHY_RX_SENSE3)

157 158 159 160 161 162 163 164 165 166 167
static void dw_hdmi_writel(struct dw_hdmi *hdmi, u8 val, int offset)
{
	writel(val, hdmi->regs + (offset << 2));
}

static u8 dw_hdmi_readl(struct dw_hdmi *hdmi, int offset)
{
	return readl(hdmi->regs + (offset << 2));
}

static void dw_hdmi_writeb(struct dw_hdmi *hdmi, u8 val, int offset)
168 169 170 171
{
	writeb(val, hdmi->regs + offset);
}

172
static u8 dw_hdmi_readb(struct dw_hdmi *hdmi, int offset)
173 174 175 176
{
	return readb(hdmi->regs + offset);
}

177 178 179 180 181 182 183 184 185 186
static inline void hdmi_writeb(struct dw_hdmi *hdmi, u8 val, int offset)
{
	hdmi->write(hdmi, val, offset);
}

static inline u8 hdmi_readb(struct dw_hdmi *hdmi, int offset)
{
	return hdmi->read(hdmi, offset);
}

187
static void hdmi_modb(struct dw_hdmi *hdmi, u8 data, u8 mask, unsigned reg)
188 189
{
	u8 val = hdmi_readb(hdmi, reg) & ~mask;
F
Fabio Estevam 已提交
190

191 192 193 194
	val |= data & mask;
	hdmi_writeb(hdmi, val, reg);
}

195
static void hdmi_mask_writeb(struct dw_hdmi *hdmi, u8 data, unsigned int reg,
196
			     u8 shift, u8 mask)
197
{
198
	hdmi_modb(hdmi, data << shift, mask, reg);
199 200
}

201 202
static void hdmi_set_cts_n(struct dw_hdmi *hdmi, unsigned int cts,
			   unsigned int n)
203
{
204 205
	/* Must be set/cleared first */
	hdmi_modb(hdmi, 0, HDMI_AUD_CTS3_CTS_MANUAL, HDMI_AUD_CTS3);
206 207

	/* nshift factor = 0 */
208
	hdmi_modb(hdmi, 0, HDMI_AUD_CTS3_N_SHIFT_MASK, HDMI_AUD_CTS3);
209 210 211

	hdmi_writeb(hdmi, ((cts >> 16) & HDMI_AUD_CTS3_AUDCTS19_16_MASK) |
		    HDMI_AUD_CTS3_CTS_MANUAL, HDMI_AUD_CTS3);
212 213 214 215 216 217
	hdmi_writeb(hdmi, (cts >> 8) & 0xff, HDMI_AUD_CTS2);
	hdmi_writeb(hdmi, cts & 0xff, HDMI_AUD_CTS1);

	hdmi_writeb(hdmi, (n >> 16) & 0x0f, HDMI_AUD_N3);
	hdmi_writeb(hdmi, (n >> 8) & 0xff, HDMI_AUD_N2);
	hdmi_writeb(hdmi, n & 0xff, HDMI_AUD_N1);
218 219
}

220
static unsigned int hdmi_compute_n(unsigned int freq, unsigned long pixel_clk)
221 222
{
	unsigned int n = (128 * freq) / 1000;
223 224 225 226 227 228
	unsigned int mult = 1;

	while (freq > 48000) {
		mult *= 2;
		freq /= 2;
	}
229 230 231

	switch (freq) {
	case 32000:
232
		if (pixel_clk == 25175000)
233
			n = 4576;
234
		else if (pixel_clk == 27027000)
235
			n = 4096;
236
		else if (pixel_clk == 74176000 || pixel_clk == 148352000)
237 238 239
			n = 11648;
		else
			n = 4096;
240
		n *= mult;
241 242 243
		break;

	case 44100:
244
		if (pixel_clk == 25175000)
245
			n = 7007;
246
		else if (pixel_clk == 74176000)
247
			n = 17836;
248
		else if (pixel_clk == 148352000)
249
			n = 8918;
250 251
		else
			n = 6272;
252
		n *= mult;
253 254 255
		break;

	case 48000:
256
		if (pixel_clk == 25175000)
257
			n = 6864;
258
		else if (pixel_clk == 27027000)
259
			n = 6144;
260
		else if (pixel_clk == 74176000)
261
			n = 11648;
262
		else if (pixel_clk == 148352000)
263
			n = 5824;
264 265
		else
			n = 6144;
266
		n *= mult;
267 268 269 270 271 272 273 274 275
		break;

	default:
		break;
	}

	return n;
}

276
static void hdmi_set_clk_regenerator(struct dw_hdmi *hdmi,
277
	unsigned long pixel_clk, unsigned int sample_rate)
278
{
279
	unsigned long ftdms = pixel_clk;
280
	unsigned int n, cts;
281
	u64 tmp;
282

283
	n = hdmi_compute_n(sample_rate, pixel_clk);
284

285 286 287 288 289 290 291 292 293 294 295 296 297 298
	/*
	 * Compute the CTS value from the N value.  Note that CTS and N
	 * can be up to 20 bits in total, so we need 64-bit math.  Also
	 * note that our TDMS clock is not fully accurate; it is accurate
	 * to kHz.  This can introduce an unnecessary remainder in the
	 * calculation below, so we don't try to warn about that.
	 */
	tmp = (u64)ftdms * n;
	do_div(tmp, 128 * sample_rate);
	cts = tmp;

	dev_dbg(hdmi->dev, "%s: fs=%uHz ftdms=%lu.%03luMHz N=%d cts=%d\n",
		__func__, sample_rate, ftdms / 1000000, (ftdms / 1000) % 1000,
		n, cts);
299

300 301 302 303 304
	spin_lock_irq(&hdmi->audio_lock);
	hdmi->audio_n = n;
	hdmi->audio_cts = cts;
	hdmi_set_cts_n(hdmi, cts, hdmi->audio_enable ? n : 0);
	spin_unlock_irq(&hdmi->audio_lock);
305 306
}

307
static void hdmi_init_clk_regenerator(struct dw_hdmi *hdmi)
308
{
309
	mutex_lock(&hdmi->audio_mutex);
310
	hdmi_set_clk_regenerator(hdmi, 74250000, hdmi->sample_rate);
311
	mutex_unlock(&hdmi->audio_mutex);
312 313
}

314
static void hdmi_clk_regenerator_update_pixel_clock(struct dw_hdmi *hdmi)
315
{
316
	mutex_lock(&hdmi->audio_mutex);
317
	hdmi_set_clk_regenerator(hdmi, hdmi->hdmi_data.video_mode.mpixelclock,
318
				 hdmi->sample_rate);
319
	mutex_unlock(&hdmi->audio_mutex);
320 321
}

322 323 324 325 326
void dw_hdmi_set_sample_rate(struct dw_hdmi *hdmi, unsigned int rate)
{
	mutex_lock(&hdmi->audio_mutex);
	hdmi->sample_rate = rate;
	hdmi_set_clk_regenerator(hdmi, hdmi->hdmi_data.video_mode.mpixelclock,
327
				 hdmi->sample_rate);
328 329 330 331
	mutex_unlock(&hdmi->audio_mutex);
}
EXPORT_SYMBOL_GPL(dw_hdmi_set_sample_rate);

332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353
void dw_hdmi_audio_enable(struct dw_hdmi *hdmi)
{
	unsigned long flags;

	spin_lock_irqsave(&hdmi->audio_lock, flags);
	hdmi->audio_enable = true;
	hdmi_set_cts_n(hdmi, hdmi->audio_cts, hdmi->audio_n);
	spin_unlock_irqrestore(&hdmi->audio_lock, flags);
}
EXPORT_SYMBOL_GPL(dw_hdmi_audio_enable);

void dw_hdmi_audio_disable(struct dw_hdmi *hdmi)
{
	unsigned long flags;

	spin_lock_irqsave(&hdmi->audio_lock, flags);
	hdmi->audio_enable = false;
	hdmi_set_cts_n(hdmi, hdmi->audio_cts, 0);
	spin_unlock_irqrestore(&hdmi->audio_lock, flags);
}
EXPORT_SYMBOL_GPL(dw_hdmi_audio_disable);

354 355 356 357 358 359 360
/*
 * this submodule is responsible for the video data synchronization.
 * for example, for RGB 4:4:4 input, the data map is defined as
 *			pin{47~40} <==> R[7:0]
 *			pin{31~24} <==> G[7:0]
 *			pin{15~8}  <==> B[7:0]
 */
361
static void hdmi_video_sample(struct dw_hdmi *hdmi)
362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 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 416
{
	int color_format = 0;
	u8 val;

	if (hdmi->hdmi_data.enc_in_format == RGB) {
		if (hdmi->hdmi_data.enc_color_depth == 8)
			color_format = 0x01;
		else if (hdmi->hdmi_data.enc_color_depth == 10)
			color_format = 0x03;
		else if (hdmi->hdmi_data.enc_color_depth == 12)
			color_format = 0x05;
		else if (hdmi->hdmi_data.enc_color_depth == 16)
			color_format = 0x07;
		else
			return;
	} else if (hdmi->hdmi_data.enc_in_format == YCBCR444) {
		if (hdmi->hdmi_data.enc_color_depth == 8)
			color_format = 0x09;
		else if (hdmi->hdmi_data.enc_color_depth == 10)
			color_format = 0x0B;
		else if (hdmi->hdmi_data.enc_color_depth == 12)
			color_format = 0x0D;
		else if (hdmi->hdmi_data.enc_color_depth == 16)
			color_format = 0x0F;
		else
			return;
	} else if (hdmi->hdmi_data.enc_in_format == YCBCR422_8BITS) {
		if (hdmi->hdmi_data.enc_color_depth == 8)
			color_format = 0x16;
		else if (hdmi->hdmi_data.enc_color_depth == 10)
			color_format = 0x14;
		else if (hdmi->hdmi_data.enc_color_depth == 12)
			color_format = 0x12;
		else
			return;
	}

	val = HDMI_TX_INVID0_INTERNAL_DE_GENERATOR_DISABLE |
		((color_format << HDMI_TX_INVID0_VIDEO_MAPPING_OFFSET) &
		HDMI_TX_INVID0_VIDEO_MAPPING_MASK);
	hdmi_writeb(hdmi, val, HDMI_TX_INVID0);

	/* Enable TX stuffing: When DE is inactive, fix the output data to 0 */
	val = HDMI_TX_INSTUFFING_BDBDATA_STUFFING_ENABLE |
		HDMI_TX_INSTUFFING_RCRDATA_STUFFING_ENABLE |
		HDMI_TX_INSTUFFING_GYDATA_STUFFING_ENABLE;
	hdmi_writeb(hdmi, val, HDMI_TX_INSTUFFING);
	hdmi_writeb(hdmi, 0x0, HDMI_TX_GYDATA0);
	hdmi_writeb(hdmi, 0x0, HDMI_TX_GYDATA1);
	hdmi_writeb(hdmi, 0x0, HDMI_TX_RCRDATA0);
	hdmi_writeb(hdmi, 0x0, HDMI_TX_RCRDATA1);
	hdmi_writeb(hdmi, 0x0, HDMI_TX_BCBDATA0);
	hdmi_writeb(hdmi, 0x0, HDMI_TX_BCBDATA1);
}

417
static int is_color_space_conversion(struct dw_hdmi *hdmi)
418
{
419
	return hdmi->hdmi_data.enc_in_format != hdmi->hdmi_data.enc_out_format;
420 421
}

422
static int is_color_space_decimation(struct dw_hdmi *hdmi)
423
{
424 425 426 427 428 429
	if (hdmi->hdmi_data.enc_out_format != YCBCR422_8BITS)
		return 0;
	if (hdmi->hdmi_data.enc_in_format == RGB ||
	    hdmi->hdmi_data.enc_in_format == YCBCR444)
		return 1;
	return 0;
430 431
}

432
static int is_color_space_interpolation(struct dw_hdmi *hdmi)
433
{
434 435 436 437 438 439
	if (hdmi->hdmi_data.enc_in_format != YCBCR422_8BITS)
		return 0;
	if (hdmi->hdmi_data.enc_out_format == RGB ||
	    hdmi->hdmi_data.enc_out_format == YCBCR444)
		return 1;
	return 0;
440 441
}

442
static void dw_hdmi_update_csc_coeffs(struct dw_hdmi *hdmi)
443 444
{
	const u16 (*csc_coeff)[3][4] = &csc_coeff_default;
445
	unsigned i;
446 447 448 449
	u32 csc_scale = 1;

	if (is_color_space_conversion(hdmi)) {
		if (hdmi->hdmi_data.enc_out_format == RGB) {
450 451
			if (hdmi->hdmi_data.colorimetry ==
					HDMI_COLORIMETRY_ITU_601)
452 453 454 455
				csc_coeff = &csc_coeff_rgb_out_eitu601;
			else
				csc_coeff = &csc_coeff_rgb_out_eitu709;
		} else if (hdmi->hdmi_data.enc_in_format == RGB) {
456 457
			if (hdmi->hdmi_data.colorimetry ==
					HDMI_COLORIMETRY_ITU_601)
458 459 460 461 462 463 464
				csc_coeff = &csc_coeff_rgb_in_eitu601;
			else
				csc_coeff = &csc_coeff_rgb_in_eitu709;
			csc_scale = 0;
		}
	}

465 466 467 468 469 470
	/* The CSC registers are sequential, alternating MSB then LSB */
	for (i = 0; i < ARRAY_SIZE(csc_coeff_default[0]); i++) {
		u16 coeff_a = (*csc_coeff)[0][i];
		u16 coeff_b = (*csc_coeff)[1][i];
		u16 coeff_c = (*csc_coeff)[2][i];

471
		hdmi_writeb(hdmi, coeff_a & 0xff, HDMI_CSC_COEF_A1_LSB + i * 2);
472 473 474
		hdmi_writeb(hdmi, coeff_a >> 8, HDMI_CSC_COEF_A1_MSB + i * 2);
		hdmi_writeb(hdmi, coeff_b & 0xff, HDMI_CSC_COEF_B1_LSB + i * 2);
		hdmi_writeb(hdmi, coeff_b >> 8, HDMI_CSC_COEF_B1_MSB + i * 2);
475
		hdmi_writeb(hdmi, coeff_c & 0xff, HDMI_CSC_COEF_C1_LSB + i * 2);
476 477
		hdmi_writeb(hdmi, coeff_c >> 8, HDMI_CSC_COEF_C1_MSB + i * 2);
	}
478

479 480
	hdmi_modb(hdmi, csc_scale, HDMI_CSC_SCALE_CSCSCALE_MASK,
		  HDMI_CSC_SCALE);
481 482
}

483
static void hdmi_video_csc(struct dw_hdmi *hdmi)
484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507
{
	int color_depth = 0;
	int interpolation = HDMI_CSC_CFG_INTMODE_DISABLE;
	int decimation = 0;

	/* YCC422 interpolation to 444 mode */
	if (is_color_space_interpolation(hdmi))
		interpolation = HDMI_CSC_CFG_INTMODE_CHROMA_INT_FORMULA1;
	else if (is_color_space_decimation(hdmi))
		decimation = HDMI_CSC_CFG_DECMODE_CHROMA_INT_FORMULA3;

	if (hdmi->hdmi_data.enc_color_depth == 8)
		color_depth = HDMI_CSC_SCALE_CSC_COLORDE_PTH_24BPP;
	else if (hdmi->hdmi_data.enc_color_depth == 10)
		color_depth = HDMI_CSC_SCALE_CSC_COLORDE_PTH_30BPP;
	else if (hdmi->hdmi_data.enc_color_depth == 12)
		color_depth = HDMI_CSC_SCALE_CSC_COLORDE_PTH_36BPP;
	else if (hdmi->hdmi_data.enc_color_depth == 16)
		color_depth = HDMI_CSC_SCALE_CSC_COLORDE_PTH_48BPP;
	else
		return;

	/* Configure the CSC registers */
	hdmi_writeb(hdmi, interpolation | decimation, HDMI_CSC_CFG);
508 509
	hdmi_modb(hdmi, color_depth, HDMI_CSC_SCALE_CSC_COLORDE_PTH_MASK,
		  HDMI_CSC_SCALE);
510

511
	dw_hdmi_update_csc_coeffs(hdmi);
512 513 514 515 516 517 518
}

/*
 * HDMI video packetizer is used to packetize the data.
 * for example, if input is YCC422 mode or repeater is used,
 * data should be repacked this module can be bypassed.
 */
519
static void hdmi_video_packetize(struct dw_hdmi *hdmi)
520 521 522 523 524
{
	unsigned int color_depth = 0;
	unsigned int remap_size = HDMI_VP_REMAP_YCC422_16bit;
	unsigned int output_select = HDMI_VP_CONF_OUTPUT_SELECTOR_PP;
	struct hdmi_data_info *hdmi_data = &hdmi->hdmi_data;
525
	u8 val, vp_conf;
526

527 528 529
	if (hdmi_data->enc_out_format == RGB ||
	    hdmi_data->enc_out_format == YCBCR444) {
		if (!hdmi_data->enc_color_depth) {
530
			output_select = HDMI_VP_CONF_OUTPUT_SELECTOR_BYPASS;
531
		} else if (hdmi_data->enc_color_depth == 8) {
532 533
			color_depth = 4;
			output_select = HDMI_VP_CONF_OUTPUT_SELECTOR_BYPASS;
534
		} else if (hdmi_data->enc_color_depth == 10) {
535
			color_depth = 5;
536
		} else if (hdmi_data->enc_color_depth == 12) {
537
			color_depth = 6;
538
		} else if (hdmi_data->enc_color_depth == 16) {
539
			color_depth = 7;
540
		} else {
541
			return;
542
		}
543 544 545 546 547 548 549 550 551 552 553
	} else if (hdmi_data->enc_out_format == YCBCR422_8BITS) {
		if (!hdmi_data->enc_color_depth ||
		    hdmi_data->enc_color_depth == 8)
			remap_size = HDMI_VP_REMAP_YCC422_16bit;
		else if (hdmi_data->enc_color_depth == 10)
			remap_size = HDMI_VP_REMAP_YCC422_20bit;
		else if (hdmi_data->enc_color_depth == 12)
			remap_size = HDMI_VP_REMAP_YCC422_24bit;
		else
			return;
		output_select = HDMI_VP_CONF_OUTPUT_SELECTOR_YCC422;
554
	} else {
555
		return;
556
	}
557 558 559 560 561 562 563 564 565

	/* set the packetizer registers */
	val = ((color_depth << HDMI_VP_PR_CD_COLOR_DEPTH_OFFSET) &
		HDMI_VP_PR_CD_COLOR_DEPTH_MASK) |
		((hdmi_data->pix_repet_factor <<
		HDMI_VP_PR_CD_DESIRED_PR_FACTOR_OFFSET) &
		HDMI_VP_PR_CD_DESIRED_PR_FACTOR_MASK);
	hdmi_writeb(hdmi, val, HDMI_VP_PR_CD);

566 567
	hdmi_modb(hdmi, HDMI_VP_STUFF_PR_STUFFING_STUFFING_MODE,
		  HDMI_VP_STUFF_PR_STUFFING_MASK, HDMI_VP_STUFF);
568 569 570

	/* Data from pixel repeater block */
	if (hdmi_data->pix_repet_factor > 1) {
571 572
		vp_conf = HDMI_VP_CONF_PR_EN_ENABLE |
			  HDMI_VP_CONF_BYPASS_SELECT_PIX_REPEATER;
573
	} else { /* data from packetizer block */
574 575
		vp_conf = HDMI_VP_CONF_PR_EN_DISABLE |
			  HDMI_VP_CONF_BYPASS_SELECT_VID_PACKETIZER;
576 577
	}

578 579 580 581
	hdmi_modb(hdmi, vp_conf,
		  HDMI_VP_CONF_PR_EN_MASK |
		  HDMI_VP_CONF_BYPASS_SELECT_MASK, HDMI_VP_CONF);

582 583
	hdmi_modb(hdmi, 1 << HDMI_VP_STUFF_IDEFAULT_PHASE_OFFSET,
		  HDMI_VP_STUFF_IDEFAULT_PHASE_MASK, HDMI_VP_STUFF);
584 585 586 587

	hdmi_writeb(hdmi, remap_size, HDMI_VP_REMAP);

	if (output_select == HDMI_VP_CONF_OUTPUT_SELECTOR_PP) {
588 589 590
		vp_conf = HDMI_VP_CONF_BYPASS_EN_DISABLE |
			  HDMI_VP_CONF_PP_EN_ENABLE |
			  HDMI_VP_CONF_YCC422_EN_DISABLE;
591
	} else if (output_select == HDMI_VP_CONF_OUTPUT_SELECTOR_YCC422) {
592 593 594
		vp_conf = HDMI_VP_CONF_BYPASS_EN_DISABLE |
			  HDMI_VP_CONF_PP_EN_DISABLE |
			  HDMI_VP_CONF_YCC422_EN_ENABLE;
595
	} else if (output_select == HDMI_VP_CONF_OUTPUT_SELECTOR_BYPASS) {
596 597 598
		vp_conf = HDMI_VP_CONF_BYPASS_EN_ENABLE |
			  HDMI_VP_CONF_PP_EN_DISABLE |
			  HDMI_VP_CONF_YCC422_EN_DISABLE;
599 600 601 602
	} else {
		return;
	}

603 604 605 606
	hdmi_modb(hdmi, vp_conf,
		  HDMI_VP_CONF_BYPASS_EN_MASK | HDMI_VP_CONF_PP_EN_ENMASK |
		  HDMI_VP_CONF_YCC422_EN_MASK, HDMI_VP_CONF);

607 608 609 610
	hdmi_modb(hdmi, HDMI_VP_STUFF_PP_STUFFING_STUFFING_MODE |
			HDMI_VP_STUFF_YCC422_STUFFING_STUFFING_MODE,
		  HDMI_VP_STUFF_PP_STUFFING_MASK |
		  HDMI_VP_STUFF_YCC422_STUFFING_MASK, HDMI_VP_STUFF);
611

612 613
	hdmi_modb(hdmi, output_select, HDMI_VP_CONF_OUTPUT_SELECTOR_MASK,
		  HDMI_VP_CONF);
614 615
}

616
static inline void hdmi_phy_test_clear(struct dw_hdmi *hdmi,
617
				       unsigned char bit)
618
{
619 620
	hdmi_modb(hdmi, bit << HDMI_PHY_TST0_TSTCLR_OFFSET,
		  HDMI_PHY_TST0_TSTCLR_MASK, HDMI_PHY_TST0);
621 622
}

623
static inline void hdmi_phy_test_enable(struct dw_hdmi *hdmi,
624
					unsigned char bit)
625
{
626 627
	hdmi_modb(hdmi, bit << HDMI_PHY_TST0_TSTEN_OFFSET,
		  HDMI_PHY_TST0_TSTEN_MASK, HDMI_PHY_TST0);
628 629
}

630
static inline void hdmi_phy_test_clock(struct dw_hdmi *hdmi,
631
				       unsigned char bit)
632
{
633 634
	hdmi_modb(hdmi, bit << HDMI_PHY_TST0_TSTCLK_OFFSET,
		  HDMI_PHY_TST0_TSTCLK_MASK, HDMI_PHY_TST0);
635 636
}

637
static inline void hdmi_phy_test_din(struct dw_hdmi *hdmi,
638
				     unsigned char bit)
639 640 641 642
{
	hdmi_writeb(hdmi, bit, HDMI_PHY_TST1);
}

643
static inline void hdmi_phy_test_dout(struct dw_hdmi *hdmi,
644
				      unsigned char bit)
645 646 647 648
{
	hdmi_writeb(hdmi, bit, HDMI_PHY_TST2);
}

649
static bool hdmi_phy_wait_i2c_done(struct dw_hdmi *hdmi, int msec)
650
{
651 652 653
	u32 val;

	while ((val = hdmi_readb(hdmi, HDMI_IH_I2CMPHY_STAT0) & 0x3) == 0) {
654 655
		if (msec-- == 0)
			return false;
656
		udelay(1000);
657
	}
658 659
	hdmi_writeb(hdmi, val, HDMI_IH_I2CMPHY_STAT0);

660 661 662
	return true;
}

663
static void __hdmi_phy_i2c_write(struct dw_hdmi *hdmi, unsigned short data,
664
				 unsigned char addr)
665 666 667 668
{
	hdmi_writeb(hdmi, 0xFF, HDMI_IH_I2CMPHY_STAT0);
	hdmi_writeb(hdmi, addr, HDMI_PHY_I2CM_ADDRESS_ADDR);
	hdmi_writeb(hdmi, (unsigned char)(data >> 8),
669
		    HDMI_PHY_I2CM_DATAO_1_ADDR);
670
	hdmi_writeb(hdmi, (unsigned char)(data >> 0),
671
		    HDMI_PHY_I2CM_DATAO_0_ADDR);
672
	hdmi_writeb(hdmi, HDMI_PHY_I2CM_OPERATION_ADDR_WRITE,
673
		    HDMI_PHY_I2CM_OPERATION_ADDR);
674 675 676
	hdmi_phy_wait_i2c_done(hdmi, 1000);
}

677
static int hdmi_phy_i2c_write(struct dw_hdmi *hdmi, unsigned short data,
678
			      unsigned char addr)
679 680 681 682 683
{
	__hdmi_phy_i2c_write(hdmi, data, addr);
	return 0;
}

684
static void dw_hdmi_phy_enable_powerdown(struct dw_hdmi *hdmi, bool enable)
685
{
686
	hdmi_mask_writeb(hdmi, !enable, HDMI_PHY_CONF0,
687 688 689 690
			 HDMI_PHY_CONF0_PDZ_OFFSET,
			 HDMI_PHY_CONF0_PDZ_MASK);
}

691
static void dw_hdmi_phy_enable_tmds(struct dw_hdmi *hdmi, u8 enable)
692 693 694 695 696 697
{
	hdmi_mask_writeb(hdmi, enable, HDMI_PHY_CONF0,
			 HDMI_PHY_CONF0_ENTMDS_OFFSET,
			 HDMI_PHY_CONF0_ENTMDS_MASK);
}

698 699 700 701 702 703 704
static void dw_hdmi_phy_enable_spare(struct dw_hdmi *hdmi, u8 enable)
{
	hdmi_mask_writeb(hdmi, enable, HDMI_PHY_CONF0,
			 HDMI_PHY_CONF0_SPARECTRL_OFFSET,
			 HDMI_PHY_CONF0_SPARECTRL_MASK);
}

705
static void dw_hdmi_phy_gen2_pddq(struct dw_hdmi *hdmi, u8 enable)
706 707 708 709 710 711
{
	hdmi_mask_writeb(hdmi, enable, HDMI_PHY_CONF0,
			 HDMI_PHY_CONF0_GEN2_PDDQ_OFFSET,
			 HDMI_PHY_CONF0_GEN2_PDDQ_MASK);
}

712
static void dw_hdmi_phy_gen2_txpwron(struct dw_hdmi *hdmi, u8 enable)
713 714 715 716 717 718
{
	hdmi_mask_writeb(hdmi, enable, HDMI_PHY_CONF0,
			 HDMI_PHY_CONF0_GEN2_TXPWRON_OFFSET,
			 HDMI_PHY_CONF0_GEN2_TXPWRON_MASK);
}

719
static void dw_hdmi_phy_sel_data_en_pol(struct dw_hdmi *hdmi, u8 enable)
720 721 722 723 724 725
{
	hdmi_mask_writeb(hdmi, enable, HDMI_PHY_CONF0,
			 HDMI_PHY_CONF0_SELDATAENPOL_OFFSET,
			 HDMI_PHY_CONF0_SELDATAENPOL_MASK);
}

726
static void dw_hdmi_phy_sel_interface_control(struct dw_hdmi *hdmi, u8 enable)
727 728 729 730 731 732
{
	hdmi_mask_writeb(hdmi, enable, HDMI_PHY_CONF0,
			 HDMI_PHY_CONF0_SELDIPIF_OFFSET,
			 HDMI_PHY_CONF0_SELDIPIF_MASK);
}

733
static int hdmi_phy_configure(struct dw_hdmi *hdmi, unsigned char prep,
734 735
			      unsigned char res, int cscon)
{
736
	unsigned res_idx;
737
	u8 val, msec;
738 739 740 741
	const struct dw_hdmi_plat_data *pdata = hdmi->plat_data;
	const struct dw_hdmi_mpll_config *mpll_config = pdata->mpll_cfg;
	const struct dw_hdmi_curr_ctrl *curr_ctrl = pdata->cur_ctr;
	const struct dw_hdmi_phy_config *phy_config = pdata->phy_config;
742 743 744

	if (prep)
		return -EINVAL;
745 746 747 748

	switch (res) {
	case 0:	/* color resolution 0 is 8 bit colour depth */
	case 8:
749
		res_idx = DW_HDMI_RES_8;
750 751
		break;
	case 10:
752
		res_idx = DW_HDMI_RES_10;
753 754
		break;
	case 12:
755
		res_idx = DW_HDMI_RES_12;
756 757
		break;
	default:
758
		return -EINVAL;
759
	}
760

761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784
	/* PLL/MPLL Cfg - always match on final entry */
	for (; mpll_config->mpixelclock != ~0UL; mpll_config++)
		if (hdmi->hdmi_data.video_mode.mpixelclock <=
		    mpll_config->mpixelclock)
			break;

	for (; curr_ctrl->mpixelclock != ~0UL; curr_ctrl++)
		if (hdmi->hdmi_data.video_mode.mpixelclock <=
		    curr_ctrl->mpixelclock)
			break;

	for (; phy_config->mpixelclock != ~0UL; phy_config++)
		if (hdmi->hdmi_data.video_mode.mpixelclock <=
		    phy_config->mpixelclock)
			break;

	if (mpll_config->mpixelclock == ~0UL ||
	    curr_ctrl->mpixelclock == ~0UL ||
	    phy_config->mpixelclock == ~0UL) {
		dev_err(hdmi->dev, "Pixel clock %d - unsupported by HDMI\n",
			hdmi->hdmi_data.video_mode.mpixelclock);
		return -EINVAL;
	}

785 786 787 788 789 790 791 792 793
	/* Enable csc path */
	if (cscon)
		val = HDMI_MC_FLOWCTRL_FEED_THROUGH_OFF_CSC_IN_PATH;
	else
		val = HDMI_MC_FLOWCTRL_FEED_THROUGH_OFF_CSC_BYPASS;

	hdmi_writeb(hdmi, val, HDMI_MC_FLOWCTRL);

	/* gen2 tx power off */
794
	dw_hdmi_phy_gen2_txpwron(hdmi, 0);
795 796

	/* gen2 pddq */
797
	dw_hdmi_phy_gen2_pddq(hdmi, 1);
798 799 800 801 802 803 804 805 806

	/* PHY reset */
	hdmi_writeb(hdmi, HDMI_MC_PHYRSTZ_DEASSERT, HDMI_MC_PHYRSTZ);
	hdmi_writeb(hdmi, HDMI_MC_PHYRSTZ_ASSERT, HDMI_MC_PHYRSTZ);

	hdmi_writeb(hdmi, HDMI_MC_HEACPHY_RST_ASSERT, HDMI_MC_HEACPHY_RST);

	hdmi_phy_test_clear(hdmi, 1);
	hdmi_writeb(hdmi, HDMI_PHY_I2CM_SLAVE_ADDR_PHY_GEN2,
807
		    HDMI_PHY_I2CM_SLAVE_ADDR);
808 809
	hdmi_phy_test_clear(hdmi, 0);

810 811
	hdmi_phy_i2c_write(hdmi, mpll_config->res[res_idx].cpce, 0x06);
	hdmi_phy_i2c_write(hdmi, mpll_config->res[res_idx].gmp, 0x15);
812

813
	/* CURRCTRL */
814
	hdmi_phy_i2c_write(hdmi, curr_ctrl->curr[res_idx], 0x10);
815

816 817
	hdmi_phy_i2c_write(hdmi, 0x0000, 0x13);  /* PLLPHBYCTRL */
	hdmi_phy_i2c_write(hdmi, 0x0006, 0x17);
818

819 820 821
	hdmi_phy_i2c_write(hdmi, phy_config->term, 0x19);  /* TXTERM */
	hdmi_phy_i2c_write(hdmi, phy_config->sym_ctr, 0x09); /* CKSYMTXCTRL */
	hdmi_phy_i2c_write(hdmi, phy_config->vlev_ctr, 0x0E); /* VLEVCTRL */
822

823 824 825
	/* REMOVE CLK TERM */
	hdmi_phy_i2c_write(hdmi, 0x8000, 0x05);  /* CKCALCTRL */

826
	dw_hdmi_phy_enable_powerdown(hdmi, false);
827 828

	/* toggle TMDS enable */
829 830
	dw_hdmi_phy_enable_tmds(hdmi, 0);
	dw_hdmi_phy_enable_tmds(hdmi, 1);
831 832

	/* gen2 tx power on */
833 834
	dw_hdmi_phy_gen2_txpwron(hdmi, 1);
	dw_hdmi_phy_gen2_pddq(hdmi, 0);
835

836 837 838
	if (hdmi->dev_type == RK3288_HDMI)
		dw_hdmi_phy_enable_spare(hdmi, 1);

839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857
	/*Wait for PHY PLL lock */
	msec = 5;
	do {
		val = hdmi_readb(hdmi, HDMI_PHY_STAT0) & HDMI_PHY_TX_PHY_LOCK;
		if (!val)
			break;

		if (msec == 0) {
			dev_err(hdmi->dev, "PHY PLL not locked\n");
			return -ETIMEDOUT;
		}

		udelay(1000);
		msec--;
	} while (1);

	return 0;
}

858
static int dw_hdmi_phy_init(struct dw_hdmi *hdmi)
859 860
{
	int i, ret;
861
	bool cscon;
862 863

	/*check csc whether needed activated in HDMI mode */
864
	cscon = hdmi->sink_is_hdmi && is_color_space_conversion(hdmi);
865 866 867

	/* HDMI Phy spec says to do the phy initialization sequence twice */
	for (i = 0; i < 2; i++) {
868 869 870
		dw_hdmi_phy_sel_data_en_pol(hdmi, 1);
		dw_hdmi_phy_sel_interface_control(hdmi, 0);
		dw_hdmi_phy_enable_tmds(hdmi, 0);
871
		dw_hdmi_phy_enable_powerdown(hdmi, true);
872 873 874 875 876 877 878 879 880 881 882

		/* Enable CSC */
		ret = hdmi_phy_configure(hdmi, 0, 8, cscon);
		if (ret)
			return ret;
	}

	hdmi->phy_enabled = true;
	return 0;
}

883
static void hdmi_tx_hdcp_config(struct dw_hdmi *hdmi)
884
{
885
	u8 de;
886 887 888 889 890 891 892

	if (hdmi->hdmi_data.video_mode.mdataenablepolarity)
		de = HDMI_A_VIDPOLCFG_DATAENPOL_ACTIVE_HIGH;
	else
		de = HDMI_A_VIDPOLCFG_DATAENPOL_ACTIVE_LOW;

	/* disable rx detect */
893 894
	hdmi_modb(hdmi, HDMI_A_HDCPCFG0_RXDETECT_DISABLE,
		  HDMI_A_HDCPCFG0_RXDETECT_MASK, HDMI_A_HDCPCFG0);
895

896
	hdmi_modb(hdmi, de, HDMI_A_VIDPOLCFG_DATAENPOL_MASK, HDMI_A_VIDPOLCFG);
897

898 899
	hdmi_modb(hdmi, HDMI_A_HDCPCFG1_ENCRYPTIONDISABLE_DISABLE,
		  HDMI_A_HDCPCFG1_ENCRYPTIONDISABLE_MASK, HDMI_A_HDCPCFG1);
900 901
}

902
static void hdmi_config_AVI(struct dw_hdmi *hdmi, struct drm_display_mode *mode)
903
{
904 905
	struct hdmi_avi_infoframe frame;
	u8 val;
906

907 908
	/* Initialise info frame from DRM mode */
	drm_hdmi_avi_infoframe_from_display_mode(&frame, mode);
909 910

	if (hdmi->hdmi_data.enc_out_format == YCBCR444)
911
		frame.colorspace = HDMI_COLORSPACE_YUV444;
912
	else if (hdmi->hdmi_data.enc_out_format == YCBCR422_8BITS)
913
		frame.colorspace = HDMI_COLORSPACE_YUV422;
914
	else
915
		frame.colorspace = HDMI_COLORSPACE_RGB;
916 917 918

	/* Set up colorimetry */
	if (hdmi->hdmi_data.enc_out_format == XVYCC444) {
919
		frame.colorimetry = HDMI_COLORIMETRY_EXTENDED;
S
Sachin Kamat 已提交
920
		if (hdmi->hdmi_data.colorimetry == HDMI_COLORIMETRY_ITU_601)
921 922
			frame.extended_colorimetry =
				HDMI_EXTENDED_COLORIMETRY_XV_YCC_601;
S
Sachin Kamat 已提交
923
		else /*hdmi->hdmi_data.colorimetry == HDMI_COLORIMETRY_ITU_709*/
924 925
			frame.extended_colorimetry =
				HDMI_EXTENDED_COLORIMETRY_XV_YCC_709;
926
	} else if (hdmi->hdmi_data.enc_out_format != RGB) {
927
		frame.colorimetry = hdmi->hdmi_data.colorimetry;
928
		frame.extended_colorimetry = HDMI_EXTENDED_COLORIMETRY_XV_YCC_601;
929
	} else { /* Carries no data */
930 931
		frame.colorimetry = HDMI_COLORIMETRY_NONE;
		frame.extended_colorimetry = HDMI_EXTENDED_COLORIMETRY_XV_YCC_601;
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
	frame.scan_mode = HDMI_SCAN_MODE_NONE;

	/*
	 * The Designware IP uses a different byte format from standard
	 * AVI info frames, though generally the bits are in the correct
	 * bytes.
	 */

	/*
	 * AVI data byte 1 differences: Colorspace in bits 4,5 rather than 5,6,
	 * active aspect present in bit 6 rather than 4.
	 */
	val = (frame.colorspace & 3) << 4 | (frame.scan_mode & 0x3);
	if (frame.active_aspect & 15)
		val |= HDMI_FC_AVICONF0_ACTIVE_FMT_INFO_PRESENT;
	if (frame.top_bar || frame.bottom_bar)
		val |= HDMI_FC_AVICONF0_BAR_DATA_HORIZ_BAR;
	if (frame.left_bar || frame.right_bar)
		val |= HDMI_FC_AVICONF0_BAR_DATA_VERT_BAR;
	hdmi_writeb(hdmi, val, HDMI_FC_AVICONF0);

	/* AVI data byte 2 differences: none */
	val = ((frame.colorimetry & 0x3) << 6) |
	      ((frame.picture_aspect & 0x3) << 4) |
	      (frame.active_aspect & 0xf);
959 960
	hdmi_writeb(hdmi, val, HDMI_FC_AVICONF1);

961 962 963 964 965 966
	/* AVI data byte 3 differences: none */
	val = ((frame.extended_colorimetry & 0x7) << 4) |
	      ((frame.quantization_range & 0x3) << 2) |
	      (frame.nups & 0x3);
	if (frame.itc)
		val |= HDMI_FC_AVICONF2_IT_CONTENT_VALID;
967 968
	hdmi_writeb(hdmi, val, HDMI_FC_AVICONF2);

969 970 971
	/* AVI data byte 4 differences: none */
	val = frame.video_code & 0x7f;
	hdmi_writeb(hdmi, val, HDMI_FC_AVIVID);
972 973 974 975 976 977 978 979 980 981

	/* AVI Data Byte 5- set up input and output pixel repetition */
	val = (((hdmi->hdmi_data.video_mode.mpixelrepetitioninput + 1) <<
		HDMI_FC_PRCONF_INCOMING_PR_FACTOR_OFFSET) &
		HDMI_FC_PRCONF_INCOMING_PR_FACTOR_MASK) |
		((hdmi->hdmi_data.video_mode.mpixelrepetitionoutput <<
		HDMI_FC_PRCONF_OUTPUT_PR_FACTOR_OFFSET) &
		HDMI_FC_PRCONF_OUTPUT_PR_FACTOR_MASK);
	hdmi_writeb(hdmi, val, HDMI_FC_PRCONF);

982 983 984 985 986 987
	/*
	 * AVI data byte 5 differences: content type in 0,1 rather than 4,5,
	 * ycc range in bits 2,3 rather than 6,7
	 */
	val = ((frame.ycc_quantization_range & 0x3) << 2) |
	      (frame.content_type & 0x3);
988 989 990
	hdmi_writeb(hdmi, val, HDMI_FC_AVICONF3);

	/* AVI Data Bytes 6-13 */
991 992 993 994 995 996 997 998
	hdmi_writeb(hdmi, frame.top_bar & 0xff, HDMI_FC_AVIETB0);
	hdmi_writeb(hdmi, (frame.top_bar >> 8) & 0xff, HDMI_FC_AVIETB1);
	hdmi_writeb(hdmi, frame.bottom_bar & 0xff, HDMI_FC_AVISBB0);
	hdmi_writeb(hdmi, (frame.bottom_bar >> 8) & 0xff, HDMI_FC_AVISBB1);
	hdmi_writeb(hdmi, frame.left_bar & 0xff, HDMI_FC_AVIELB0);
	hdmi_writeb(hdmi, (frame.left_bar >> 8) & 0xff, HDMI_FC_AVIELB1);
	hdmi_writeb(hdmi, frame.right_bar & 0xff, HDMI_FC_AVISRB0);
	hdmi_writeb(hdmi, (frame.right_bar >> 8) & 0xff, HDMI_FC_AVISRB1);
999 1000
}

1001
static void hdmi_av_composer(struct dw_hdmi *hdmi,
1002 1003 1004 1005 1006
			     const struct drm_display_mode *mode)
{
	u8 inv_val;
	struct hdmi_vmode *vmode = &hdmi->hdmi_data.video_mode;
	int hblank, vblank, h_de_hs, v_de_vs, hsync_len, vsync_len;
1007
	unsigned int vdisplay;
1008 1009 1010 1011 1012 1013 1014 1015 1016 1017

	vmode->mpixelclock = mode->clock * 1000;

	dev_dbg(hdmi->dev, "final pixclk = %d\n", vmode->mpixelclock);

	/* Set up HDMI_FC_INVIDCONF */
	inv_val = (hdmi->hdmi_data.hdcp_enable ?
		HDMI_FC_INVIDCONF_HDCP_KEEPOUT_ACTIVE :
		HDMI_FC_INVIDCONF_HDCP_KEEPOUT_INACTIVE);

1018
	inv_val |= mode->flags & DRM_MODE_FLAG_PVSYNC ?
1019
		HDMI_FC_INVIDCONF_VSYNC_IN_POLARITY_ACTIVE_HIGH :
1020
		HDMI_FC_INVIDCONF_VSYNC_IN_POLARITY_ACTIVE_LOW;
1021

1022
	inv_val |= mode->flags & DRM_MODE_FLAG_PHSYNC ?
1023
		HDMI_FC_INVIDCONF_HSYNC_IN_POLARITY_ACTIVE_HIGH :
1024
		HDMI_FC_INVIDCONF_HSYNC_IN_POLARITY_ACTIVE_LOW;
1025 1026 1027 1028 1029 1030 1031 1032

	inv_val |= (vmode->mdataenablepolarity ?
		HDMI_FC_INVIDCONF_DE_IN_POLARITY_ACTIVE_HIGH :
		HDMI_FC_INVIDCONF_DE_IN_POLARITY_ACTIVE_LOW);

	if (hdmi->vic == 39)
		inv_val |= HDMI_FC_INVIDCONF_R_V_BLANK_IN_OSC_ACTIVE_HIGH;
	else
1033
		inv_val |= mode->flags & DRM_MODE_FLAG_INTERLACE ?
1034
			HDMI_FC_INVIDCONF_R_V_BLANK_IN_OSC_ACTIVE_HIGH :
1035
			HDMI_FC_INVIDCONF_R_V_BLANK_IN_OSC_ACTIVE_LOW;
1036

1037
	inv_val |= mode->flags & DRM_MODE_FLAG_INTERLACE ?
1038
		HDMI_FC_INVIDCONF_IN_I_P_INTERLACED :
1039
		HDMI_FC_INVIDCONF_IN_I_P_PROGRESSIVE;
1040

1041 1042 1043
	inv_val |= hdmi->sink_is_hdmi ?
		HDMI_FC_INVIDCONF_DVI_MODEZ_HDMI_MODE :
		HDMI_FC_INVIDCONF_DVI_MODEZ_DVI_MODE;
1044 1045 1046

	hdmi_writeb(hdmi, inv_val, HDMI_FC_INVIDCONF);

1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062
	vdisplay = mode->vdisplay;
	vblank = mode->vtotal - mode->vdisplay;
	v_de_vs = mode->vsync_start - mode->vdisplay;
	vsync_len = mode->vsync_end - mode->vsync_start;

	/*
	 * When we're setting an interlaced mode, we need
	 * to adjust the vertical timing to suit.
	 */
	if (mode->flags & DRM_MODE_FLAG_INTERLACE) {
		vdisplay /= 2;
		vblank /= 2;
		v_de_vs /= 2;
		vsync_len /= 2;
	}

1063 1064 1065 1066 1067
	/* Set up horizontal active pixel width */
	hdmi_writeb(hdmi, mode->hdisplay >> 8, HDMI_FC_INHACTV1);
	hdmi_writeb(hdmi, mode->hdisplay, HDMI_FC_INHACTV0);

	/* Set up vertical active lines */
1068 1069
	hdmi_writeb(hdmi, vdisplay >> 8, HDMI_FC_INVACTV1);
	hdmi_writeb(hdmi, vdisplay, HDMI_FC_INVACTV0);
1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095

	/* Set up horizontal blanking pixel region width */
	hblank = mode->htotal - mode->hdisplay;
	hdmi_writeb(hdmi, hblank >> 8, HDMI_FC_INHBLANK1);
	hdmi_writeb(hdmi, hblank, HDMI_FC_INHBLANK0);

	/* Set up vertical blanking pixel region width */
	hdmi_writeb(hdmi, vblank, HDMI_FC_INVBLANK);

	/* Set up HSYNC active edge delay width (in pixel clks) */
	h_de_hs = mode->hsync_start - mode->hdisplay;
	hdmi_writeb(hdmi, h_de_hs >> 8, HDMI_FC_HSYNCINDELAY1);
	hdmi_writeb(hdmi, h_de_hs, HDMI_FC_HSYNCINDELAY0);

	/* Set up VSYNC active edge delay (in lines) */
	hdmi_writeb(hdmi, v_de_vs, HDMI_FC_VSYNCINDELAY);

	/* Set up HSYNC active pulse width (in pixel clks) */
	hsync_len = mode->hsync_end - mode->hsync_start;
	hdmi_writeb(hdmi, hsync_len >> 8, HDMI_FC_HSYNCINWIDTH1);
	hdmi_writeb(hdmi, hsync_len, HDMI_FC_HSYNCINWIDTH0);

	/* Set up VSYNC active edge delay (in lines) */
	hdmi_writeb(hdmi, vsync_len, HDMI_FC_VSYNCINWIDTH);
}

1096
static void dw_hdmi_phy_disable(struct dw_hdmi *hdmi)
1097 1098 1099 1100
{
	if (!hdmi->phy_enabled)
		return;

1101
	dw_hdmi_phy_enable_tmds(hdmi, 0);
1102
	dw_hdmi_phy_enable_powerdown(hdmi, true);
1103 1104 1105 1106 1107

	hdmi->phy_enabled = false;
}

/* HDMI Initialization Step B.4 */
1108
static void dw_hdmi_enable_video_path(struct dw_hdmi *hdmi)
1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136
{
	u8 clkdis;

	/* control period minimum duration */
	hdmi_writeb(hdmi, 12, HDMI_FC_CTRLDUR);
	hdmi_writeb(hdmi, 32, HDMI_FC_EXCTRLDUR);
	hdmi_writeb(hdmi, 1, HDMI_FC_EXCTRLSPAC);

	/* Set to fill TMDS data channels */
	hdmi_writeb(hdmi, 0x0B, HDMI_FC_CH0PREAM);
	hdmi_writeb(hdmi, 0x16, HDMI_FC_CH1PREAM);
	hdmi_writeb(hdmi, 0x21, HDMI_FC_CH2PREAM);

	/* Enable pixel clock and tmds data path */
	clkdis = 0x7F;
	clkdis &= ~HDMI_MC_CLKDIS_PIXELCLK_DISABLE;
	hdmi_writeb(hdmi, clkdis, HDMI_MC_CLKDIS);

	clkdis &= ~HDMI_MC_CLKDIS_TMDSCLK_DISABLE;
	hdmi_writeb(hdmi, clkdis, HDMI_MC_CLKDIS);

	/* Enable csc path */
	if (is_color_space_conversion(hdmi)) {
		clkdis &= ~HDMI_MC_CLKDIS_CSCCLK_DISABLE;
		hdmi_writeb(hdmi, clkdis, HDMI_MC_CLKDIS);
	}
}

1137
static void hdmi_enable_audio_clk(struct dw_hdmi *hdmi)
1138
{
1139
	hdmi_modb(hdmi, 0, HDMI_MC_CLKDIS_AUDCLK_DISABLE, HDMI_MC_CLKDIS);
1140 1141 1142
}

/* Workaround to clear the overflow condition */
1143
static void dw_hdmi_clear_overflow(struct dw_hdmi *hdmi)
1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160
{
	int count;
	u8 val;

	/* TMDS software reset */
	hdmi_writeb(hdmi, (u8)~HDMI_MC_SWRSTZ_TMDSSWRST_REQ, HDMI_MC_SWRSTZ);

	val = hdmi_readb(hdmi, HDMI_FC_INVIDCONF);
	if (hdmi->dev_type == IMX6DL_HDMI) {
		hdmi_writeb(hdmi, val, HDMI_FC_INVIDCONF);
		return;
	}

	for (count = 0; count < 4; count++)
		hdmi_writeb(hdmi, val, HDMI_FC_INVIDCONF);
}

1161
static void hdmi_enable_overflow_interrupts(struct dw_hdmi *hdmi)
1162 1163 1164 1165 1166
{
	hdmi_writeb(hdmi, 0, HDMI_FC_MASK2);
	hdmi_writeb(hdmi, 0, HDMI_IH_MUTE_FC_STAT2);
}

1167
static void hdmi_disable_overflow_interrupts(struct dw_hdmi *hdmi)
1168 1169 1170 1171 1172
{
	hdmi_writeb(hdmi, HDMI_IH_MUTE_FC_STAT2_OVERFLOW_MASK,
		    HDMI_IH_MUTE_FC_STAT2);
}

1173
static int dw_hdmi_setup(struct dw_hdmi *hdmi, struct drm_display_mode *mode)
1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187
{
	int ret;

	hdmi_disable_overflow_interrupts(hdmi);

	hdmi->vic = drm_match_cea_mode(mode);

	if (!hdmi->vic) {
		dev_dbg(hdmi->dev, "Non-CEA mode used in HDMI\n");
	} else {
		dev_dbg(hdmi->dev, "CEA mode used vic=%d\n", hdmi->vic);
	}

	if ((hdmi->vic == 6) || (hdmi->vic == 7) ||
1188 1189 1190
	    (hdmi->vic == 21) || (hdmi->vic == 22) ||
	    (hdmi->vic == 2) || (hdmi->vic == 3) ||
	    (hdmi->vic == 17) || (hdmi->vic == 18))
S
Sachin Kamat 已提交
1191
		hdmi->hdmi_data.colorimetry = HDMI_COLORIMETRY_ITU_601;
1192
	else
S
Sachin Kamat 已提交
1193
		hdmi->hdmi_data.colorimetry = HDMI_COLORIMETRY_ITU_709;
1194

1195
	hdmi->hdmi_data.video_mode.mpixelrepetitionoutput = 0;
1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211
	hdmi->hdmi_data.video_mode.mpixelrepetitioninput = 0;

	/* TODO: Get input format from IPU (via FB driver interface) */
	hdmi->hdmi_data.enc_in_format = RGB;

	hdmi->hdmi_data.enc_out_format = RGB;

	hdmi->hdmi_data.enc_color_depth = 8;
	hdmi->hdmi_data.pix_repet_factor = 0;
	hdmi->hdmi_data.hdcp_enable = 0;
	hdmi->hdmi_data.video_mode.mdataenablepolarity = true;

	/* HDMI Initialization Step B.1 */
	hdmi_av_composer(hdmi, mode);

	/* HDMI Initializateion Step B.2 */
1212
	ret = dw_hdmi_phy_init(hdmi);
1213 1214 1215 1216
	if (ret)
		return ret;

	/* HDMI Initialization Step B.3 */
1217
	dw_hdmi_enable_video_path(hdmi);
1218

1219 1220
	if (hdmi->sink_has_audio) {
		dev_dbg(hdmi->dev, "sink has audio support\n");
1221 1222 1223 1224

		/* HDMI Initialization Step E - Configure audio */
		hdmi_clk_regenerator_update_pixel_clock(hdmi);
		hdmi_enable_audio_clk(hdmi);
1225 1226 1227 1228 1229
	}

	/* not for DVI mode */
	if (hdmi->sink_is_hdmi) {
		dev_dbg(hdmi->dev, "%s HDMI mode\n", __func__);
1230 1231

		/* HDMI Initialization Step F - Configure AVI InfoFrame */
1232
		hdmi_config_AVI(hdmi, mode);
1233 1234
	} else {
		dev_dbg(hdmi->dev, "%s DVI mode\n", __func__);
1235 1236 1237 1238 1239 1240 1241
	}

	hdmi_video_packetize(hdmi);
	hdmi_video_csc(hdmi);
	hdmi_video_sample(hdmi);
	hdmi_tx_hdcp_config(hdmi);

1242
	dw_hdmi_clear_overflow(hdmi);
1243
	if (hdmi->cable_plugin && hdmi->sink_is_hdmi)
1244 1245 1246 1247 1248 1249
		hdmi_enable_overflow_interrupts(hdmi);

	return 0;
}

/* Wait until we are registered to enable interrupts */
1250
static int dw_hdmi_fb_registered(struct dw_hdmi *hdmi)
1251 1252 1253 1254 1255 1256 1257 1258 1259
{
	hdmi_writeb(hdmi, HDMI_PHY_I2CM_INT_ADDR_DONE_POL,
		    HDMI_PHY_I2CM_INT_ADDR);

	hdmi_writeb(hdmi, HDMI_PHY_I2CM_CTLINT_ADDR_NAC_POL |
		    HDMI_PHY_I2CM_CTLINT_ADDR_ARBITRATION_POL,
		    HDMI_PHY_I2CM_CTLINT_ADDR);

	/* enable cable hot plug irq */
1260
	hdmi_writeb(hdmi, hdmi->phy_mask, HDMI_PHY_MASK0);
1261 1262

	/* Clear Hotplug interrupts */
1263 1264
	hdmi_writeb(hdmi, HDMI_IH_PHY_STAT0_HPD | HDMI_IH_PHY_STAT0_RX_SENSE,
		    HDMI_IH_PHY_STAT0);
1265 1266 1267 1268

	return 0;
}

1269
static void initialize_hdmi_ih_mutes(struct dw_hdmi *hdmi)
1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320
{
	u8 ih_mute;

	/*
	 * Boot up defaults are:
	 * HDMI_IH_MUTE   = 0x03 (disabled)
	 * HDMI_IH_MUTE_* = 0x00 (enabled)
	 *
	 * Disable top level interrupt bits in HDMI block
	 */
	ih_mute = hdmi_readb(hdmi, HDMI_IH_MUTE) |
		  HDMI_IH_MUTE_MUTE_WAKEUP_INTERRUPT |
		  HDMI_IH_MUTE_MUTE_ALL_INTERRUPT;

	hdmi_writeb(hdmi, ih_mute, HDMI_IH_MUTE);

	/* by default mask all interrupts */
	hdmi_writeb(hdmi, 0xff, HDMI_VP_MASK);
	hdmi_writeb(hdmi, 0xff, HDMI_FC_MASK0);
	hdmi_writeb(hdmi, 0xff, HDMI_FC_MASK1);
	hdmi_writeb(hdmi, 0xff, HDMI_FC_MASK2);
	hdmi_writeb(hdmi, 0xff, HDMI_PHY_MASK0);
	hdmi_writeb(hdmi, 0xff, HDMI_PHY_I2CM_INT_ADDR);
	hdmi_writeb(hdmi, 0xff, HDMI_PHY_I2CM_CTLINT_ADDR);
	hdmi_writeb(hdmi, 0xff, HDMI_AUD_INT);
	hdmi_writeb(hdmi, 0xff, HDMI_AUD_SPDIFINT);
	hdmi_writeb(hdmi, 0xff, HDMI_AUD_HBR_MASK);
	hdmi_writeb(hdmi, 0xff, HDMI_GP_MASK);
	hdmi_writeb(hdmi, 0xff, HDMI_A_APIINTMSK);
	hdmi_writeb(hdmi, 0xff, HDMI_CEC_MASK);
	hdmi_writeb(hdmi, 0xff, HDMI_I2CM_INT);
	hdmi_writeb(hdmi, 0xff, HDMI_I2CM_CTLINT);

	/* Disable interrupts in the IH_MUTE_* registers */
	hdmi_writeb(hdmi, 0xff, HDMI_IH_MUTE_FC_STAT0);
	hdmi_writeb(hdmi, 0xff, HDMI_IH_MUTE_FC_STAT1);
	hdmi_writeb(hdmi, 0xff, HDMI_IH_MUTE_FC_STAT2);
	hdmi_writeb(hdmi, 0xff, HDMI_IH_MUTE_AS_STAT0);
	hdmi_writeb(hdmi, 0xff, HDMI_IH_MUTE_PHY_STAT0);
	hdmi_writeb(hdmi, 0xff, HDMI_IH_MUTE_I2CM_STAT0);
	hdmi_writeb(hdmi, 0xff, HDMI_IH_MUTE_CEC_STAT0);
	hdmi_writeb(hdmi, 0xff, HDMI_IH_MUTE_VP_STAT0);
	hdmi_writeb(hdmi, 0xff, HDMI_IH_MUTE_I2CMPHY_STAT0);
	hdmi_writeb(hdmi, 0xff, HDMI_IH_MUTE_AHBDMAAUD_STAT0);

	/* Enable top level interrupt bits in HDMI block */
	ih_mute &= ~(HDMI_IH_MUTE_MUTE_WAKEUP_INTERRUPT |
		    HDMI_IH_MUTE_MUTE_ALL_INTERRUPT);
	hdmi_writeb(hdmi, ih_mute, HDMI_IH_MUTE);
}

1321
static void dw_hdmi_poweron(struct dw_hdmi *hdmi)
1322
{
1323
	hdmi->bridge_is_on = true;
1324
	dw_hdmi_setup(hdmi, &hdmi->previous_mode);
1325 1326
}

1327
static void dw_hdmi_poweroff(struct dw_hdmi *hdmi)
1328
{
1329
	dw_hdmi_phy_disable(hdmi);
1330 1331 1332 1333 1334 1335 1336 1337 1338 1339
	hdmi->bridge_is_on = false;
}

static void dw_hdmi_update_power(struct dw_hdmi *hdmi)
{
	int force = hdmi->force;

	if (hdmi->disabled) {
		force = DRM_FORCE_OFF;
	} else if (force == DRM_FORCE_UNSPECIFIED) {
1340
		if (hdmi->rxsense)
1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352
			force = DRM_FORCE_ON;
		else
			force = DRM_FORCE_OFF;
	}

	if (force == DRM_FORCE_OFF) {
		if (hdmi->bridge_is_on)
			dw_hdmi_poweroff(hdmi);
	} else {
		if (!hdmi->bridge_is_on)
			dw_hdmi_poweron(hdmi);
	}
1353 1354
}

1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379
/*
 * Adjust the detection of RXSENSE according to whether we have a forced
 * connection mode enabled, or whether we have been disabled.  There is
 * no point processing RXSENSE interrupts if we have a forced connection
 * state, or DRM has us disabled.
 *
 * We also disable rxsense interrupts when we think we're disconnected
 * to avoid floating TDMS signals giving false rxsense interrupts.
 *
 * Note: we still need to listen for HPD interrupts even when DRM has us
 * disabled so that we can detect a connect event.
 */
static void dw_hdmi_update_phy_mask(struct dw_hdmi *hdmi)
{
	u8 old_mask = hdmi->phy_mask;

	if (hdmi->force || hdmi->disabled || !hdmi->rxsense)
		hdmi->phy_mask |= HDMI_PHY_RX_SENSE;
	else
		hdmi->phy_mask &= ~HDMI_PHY_RX_SENSE;

	if (old_mask != hdmi->phy_mask)
		hdmi_writeb(hdmi, hdmi->phy_mask, HDMI_PHY_MASK0);
}

1380
static void dw_hdmi_bridge_mode_set(struct drm_bridge *bridge,
1381 1382
				    struct drm_display_mode *orig_mode,
				    struct drm_display_mode *mode)
1383
{
1384
	struct dw_hdmi *hdmi = bridge->driver_private;
1385

1386
	mutex_lock(&hdmi->mutex);
1387 1388 1389

	/* Store the display mode for plugin/DKMS poweron events */
	memcpy(&hdmi->previous_mode, mode, sizeof(hdmi->previous_mode));
1390 1391

	mutex_unlock(&hdmi->mutex);
1392 1393
}

1394
static void dw_hdmi_bridge_disable(struct drm_bridge *bridge)
1395
{
1396
	struct dw_hdmi *hdmi = bridge->driver_private;
1397

1398 1399
	mutex_lock(&hdmi->mutex);
	hdmi->disabled = true;
1400
	dw_hdmi_update_power(hdmi);
1401
	dw_hdmi_update_phy_mask(hdmi);
1402
	mutex_unlock(&hdmi->mutex);
1403 1404
}

1405
static void dw_hdmi_bridge_enable(struct drm_bridge *bridge)
1406
{
1407
	struct dw_hdmi *hdmi = bridge->driver_private;
1408

1409 1410
	mutex_lock(&hdmi->mutex);
	hdmi->disabled = false;
1411
	dw_hdmi_update_power(hdmi);
1412
	dw_hdmi_update_phy_mask(hdmi);
1413
	mutex_unlock(&hdmi->mutex);
1414 1415
}

1416 1417
static enum drm_connector_status
dw_hdmi_connector_detect(struct drm_connector *connector, bool force)
1418
{
1419
	struct dw_hdmi *hdmi = container_of(connector, struct dw_hdmi,
1420
					     connector);
1421

1422 1423 1424
	mutex_lock(&hdmi->mutex);
	hdmi->force = DRM_FORCE_UNSPECIFIED;
	dw_hdmi_update_power(hdmi);
1425
	dw_hdmi_update_phy_mask(hdmi);
1426 1427
	mutex_unlock(&hdmi->mutex);

1428 1429
	return hdmi_readb(hdmi, HDMI_PHY_STAT0) & HDMI_PHY_HPD ?
		connector_status_connected : connector_status_disconnected;
1430 1431
}

1432
static int dw_hdmi_connector_get_modes(struct drm_connector *connector)
1433
{
1434
	struct dw_hdmi *hdmi = container_of(connector, struct dw_hdmi,
1435 1436
					     connector);
	struct edid *edid;
1437
	int ret = 0;
1438 1439 1440 1441 1442 1443 1444 1445 1446

	if (!hdmi->ddc)
		return 0;

	edid = drm_get_edid(connector, hdmi->ddc);
	if (edid) {
		dev_dbg(hdmi->dev, "got edid: width[%d] x height[%d]\n",
			edid->width_cm, edid->height_cm);

1447
		hdmi->sink_is_hdmi = drm_detect_hdmi_monitor(edid);
1448
		hdmi->sink_has_audio = drm_detect_monitor_audio(edid);
1449 1450
		drm_mode_connector_update_edid_property(connector, edid);
		ret = drm_add_edid_modes(connector, edid);
1451 1452
		/* Store the ELD */
		drm_edid_to_eld(connector, edid);
1453 1454 1455 1456 1457
		kfree(edid);
	} else {
		dev_dbg(hdmi->dev, "failed to get edid\n");
	}

1458
	return ret;
1459 1460
}

1461 1462 1463 1464 1465 1466 1467 1468
static enum drm_mode_status
dw_hdmi_connector_mode_valid(struct drm_connector *connector,
			     struct drm_display_mode *mode)
{
	struct dw_hdmi *hdmi = container_of(connector,
					   struct dw_hdmi, connector);
	enum drm_mode_status mode_status = MODE_OK;

1469 1470 1471 1472
	/* We don't support double-clocked modes */
	if (mode->flags & DRM_MODE_FLAG_DBLCLK)
		return MODE_BAD;

1473 1474 1475 1476 1477 1478
	if (hdmi->plat_data->mode_valid)
		mode_status = hdmi->plat_data->mode_valid(connector, mode);

	return mode_status;
}

1479
static void dw_hdmi_connector_destroy(struct drm_connector *connector)
1480
{
1481 1482
	drm_connector_unregister(connector);
	drm_connector_cleanup(connector);
1483 1484
}

1485 1486 1487 1488 1489 1490 1491 1492
static void dw_hdmi_connector_force(struct drm_connector *connector)
{
	struct dw_hdmi *hdmi = container_of(connector, struct dw_hdmi,
					     connector);

	mutex_lock(&hdmi->mutex);
	hdmi->force = connector->force;
	dw_hdmi_update_power(hdmi);
1493
	dw_hdmi_update_phy_mask(hdmi);
1494 1495 1496
	mutex_unlock(&hdmi->mutex);
}

1497
static const struct drm_connector_funcs dw_hdmi_connector_funcs = {
1498 1499 1500 1501 1502 1503 1504 1505 1506 1507
	.dpms = drm_atomic_helper_connector_dpms,
	.fill_modes = drm_helper_probe_single_connector_modes,
	.detect = dw_hdmi_connector_detect,
	.destroy = dw_hdmi_connector_destroy,
	.force = dw_hdmi_connector_force,
	.reset = drm_atomic_helper_connector_reset,
	.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
};

1508
static const struct drm_connector_helper_funcs dw_hdmi_connector_helper_funcs = {
1509
	.get_modes = dw_hdmi_connector_get_modes,
1510
	.mode_valid = dw_hdmi_connector_mode_valid,
1511
	.best_encoder = drm_atomic_helper_best_encoder,
1512 1513
};

1514
static const struct drm_bridge_funcs dw_hdmi_bridge_funcs = {
1515 1516 1517
	.enable = dw_hdmi_bridge_enable,
	.disable = dw_hdmi_bridge_disable,
	.mode_set = dw_hdmi_bridge_mode_set,
1518 1519
};

1520
static irqreturn_t dw_hdmi_hardirq(int irq, void *dev_id)
1521
{
1522
	struct dw_hdmi *hdmi = dev_id;
1523 1524 1525 1526 1527 1528 1529 1530 1531
	u8 intr_stat;

	intr_stat = hdmi_readb(hdmi, HDMI_IH_PHY_STAT0);
	if (intr_stat)
		hdmi_writeb(hdmi, ~0, HDMI_IH_MUTE_PHY_STAT0);

	return intr_stat ? IRQ_WAKE_THREAD : IRQ_NONE;
}

1532
static irqreturn_t dw_hdmi_irq(int irq, void *dev_id)
1533
{
1534
	struct dw_hdmi *hdmi = dev_id;
1535
	u8 intr_stat, phy_int_pol, phy_pol_mask, phy_stat;
1536 1537 1538

	intr_stat = hdmi_readb(hdmi, HDMI_IH_PHY_STAT0);
	phy_int_pol = hdmi_readb(hdmi, HDMI_PHY_POL0);
1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554
	phy_stat = hdmi_readb(hdmi, HDMI_PHY_STAT0);

	phy_pol_mask = 0;
	if (intr_stat & HDMI_IH_PHY_STAT0_HPD)
		phy_pol_mask |= HDMI_PHY_HPD;
	if (intr_stat & HDMI_IH_PHY_STAT0_RX_SENSE0)
		phy_pol_mask |= HDMI_PHY_RX_SENSE0;
	if (intr_stat & HDMI_IH_PHY_STAT0_RX_SENSE1)
		phy_pol_mask |= HDMI_PHY_RX_SENSE1;
	if (intr_stat & HDMI_IH_PHY_STAT0_RX_SENSE2)
		phy_pol_mask |= HDMI_PHY_RX_SENSE2;
	if (intr_stat & HDMI_IH_PHY_STAT0_RX_SENSE3)
		phy_pol_mask |= HDMI_PHY_RX_SENSE3;

	if (phy_pol_mask)
		hdmi_modb(hdmi, ~phy_int_pol, phy_pol_mask, HDMI_PHY_POL0);
1555

1556 1557 1558 1559 1560 1561 1562 1563 1564
	/*
	 * RX sense tells us whether the TDMS transmitters are detecting
	 * load - in other words, there's something listening on the
	 * other end of the link.  Use this to decide whether we should
	 * power on the phy as HPD may be toggled by the sink to merely
	 * ask the source to re-read the EDID.
	 */
	if (intr_stat &
	    (HDMI_IH_PHY_STAT0_RX_SENSE | HDMI_IH_PHY_STAT0_HPD)) {
1565
		mutex_lock(&hdmi->mutex);
1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584
		if (!hdmi->disabled && !hdmi->force) {
			/*
			 * If the RX sense status indicates we're disconnected,
			 * clear the software rxsense status.
			 */
			if (!(phy_stat & HDMI_PHY_RX_SENSE))
				hdmi->rxsense = false;

			/*
			 * Only set the software rxsense status when both
			 * rxsense and hpd indicates we're connected.
			 * This avoids what seems to be bad behaviour in
			 * at least iMX6S versions of the phy.
			 */
			if (phy_stat & HDMI_PHY_HPD)
				hdmi->rxsense = true;

			dw_hdmi_update_power(hdmi);
			dw_hdmi_update_phy_mask(hdmi);
1585
		}
1586
		mutex_unlock(&hdmi->mutex);
1587 1588 1589 1590 1591
	}

	if (intr_stat & HDMI_IH_PHY_STAT0_HPD) {
		dev_dbg(hdmi->dev, "EVENT=%s\n",
			phy_int_pol & HDMI_PHY_HPD ? "plugin" : "plugout");
1592
		drm_helper_hpd_irq_event(hdmi->bridge->dev);
1593 1594 1595
	}

	hdmi_writeb(hdmi, intr_stat, HDMI_IH_PHY_STAT0);
1596 1597
	hdmi_writeb(hdmi, ~(HDMI_IH_PHY_STAT0_HPD | HDMI_IH_PHY_STAT0_RX_SENSE),
		    HDMI_IH_MUTE_PHY_STAT0);
1598 1599 1600 1601

	return IRQ_HANDLED;
}

1602
static int dw_hdmi_register(struct drm_device *drm, struct dw_hdmi *hdmi)
1603
{
1604 1605
	struct drm_encoder *encoder = hdmi->encoder;
	struct drm_bridge *bridge;
1606 1607
	int ret;

1608 1609 1610 1611 1612
	bridge = devm_kzalloc(drm->dev, sizeof(*bridge), GFP_KERNEL);
	if (!bridge) {
		DRM_ERROR("Failed to allocate drm bridge\n");
		return -ENOMEM;
	}
1613

1614 1615
	hdmi->bridge = bridge;
	bridge->driver_private = hdmi;
1616 1617
	bridge->funcs = &dw_hdmi_bridge_funcs;
	ret = drm_bridge_attach(drm, bridge);
1618 1619 1620 1621
	if (ret) {
		DRM_ERROR("Failed to initialize bridge with drm\n");
		return -EINVAL;
	}
1622

1623 1624
	encoder->bridge = bridge;
	hdmi->connector.polled = DRM_CONNECTOR_POLL_HPD;
1625 1626

	drm_connector_helper_add(&hdmi->connector,
1627
				 &dw_hdmi_connector_helper_funcs);
1628

1629 1630 1631
	drm_connector_init(drm, &hdmi->connector,
			   &dw_hdmi_connector_funcs,
			   DRM_MODE_CONNECTOR_HDMIA);
1632

1633
	drm_mode_connector_attach_encoder(&hdmi->connector, encoder);
1634 1635 1636 1637

	return 0;
}

1638
int dw_hdmi_bind(struct device *dev, struct device *master,
1639 1640 1641
		 void *data, struct drm_encoder *encoder,
		 struct resource *iores, int irq,
		 const struct dw_hdmi_plat_data *plat_data)
1642
{
1643
	struct drm_device *drm = data;
1644
	struct device_node *np = dev->of_node;
1645
	struct platform_device_info pdevinfo;
1646
	struct device_node *ddc_node;
1647
	struct dw_hdmi_audio_data audio;
1648
	struct dw_hdmi *hdmi;
1649
	int ret;
1650
	u32 val = 1;
1651

1652
	hdmi = devm_kzalloc(dev, sizeof(*hdmi), GFP_KERNEL);
1653 1654 1655
	if (!hdmi)
		return -ENOMEM;

1656 1657
	hdmi->connector.interlace_allowed = 1;

1658
	hdmi->plat_data = plat_data;
1659
	hdmi->dev = dev;
1660
	hdmi->dev_type = plat_data->dev_type;
1661
	hdmi->sample_rate = 48000;
1662
	hdmi->encoder = encoder;
1663
	hdmi->disabled = true;
1664 1665
	hdmi->rxsense = true;
	hdmi->phy_mask = (u8)~(HDMI_PHY_HPD | HDMI_PHY_RX_SENSE);
1666

1667
	mutex_init(&hdmi->mutex);
1668
	mutex_init(&hdmi->audio_mutex);
1669
	spin_lock_init(&hdmi->audio_lock);
1670

1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686
	of_property_read_u32(np, "reg-io-width", &val);

	switch (val) {
	case 4:
		hdmi->write = dw_hdmi_writel;
		hdmi->read = dw_hdmi_readl;
		break;
	case 1:
		hdmi->write = dw_hdmi_writeb;
		hdmi->read = dw_hdmi_readb;
		break;
	default:
		dev_err(dev, "reg-io-width must be 1 or 4\n");
		return -EINVAL;
	}

1687
	ddc_node = of_parse_phandle(np, "ddc-i2c-bus", 0);
1688 1689
	if (ddc_node) {
		hdmi->ddc = of_find_i2c_adapter_by_node(ddc_node);
1690 1691
		of_node_put(ddc_node);
		if (!hdmi->ddc) {
1692
			dev_dbg(hdmi->dev, "failed to read ddc node\n");
1693 1694
			return -EPROBE_DEFER;
		}
1695 1696 1697 1698 1699

	} else {
		dev_dbg(hdmi->dev, "no ddc property found\n");
	}

1700
	hdmi->regs = devm_ioremap_resource(dev, iores);
1701 1702 1703 1704 1705 1706
	if (IS_ERR(hdmi->regs))
		return PTR_ERR(hdmi->regs);

	hdmi->isfr_clk = devm_clk_get(hdmi->dev, "isfr");
	if (IS_ERR(hdmi->isfr_clk)) {
		ret = PTR_ERR(hdmi->isfr_clk);
1707
		dev_err(hdmi->dev, "Unable to get HDMI isfr clk: %d\n", ret);
1708 1709 1710 1711 1712
		return ret;
	}

	ret = clk_prepare_enable(hdmi->isfr_clk);
	if (ret) {
1713
		dev_err(hdmi->dev, "Cannot enable HDMI isfr clock: %d\n", ret);
1714 1715 1716 1717 1718 1719
		return ret;
	}

	hdmi->iahb_clk = devm_clk_get(hdmi->dev, "iahb");
	if (IS_ERR(hdmi->iahb_clk)) {
		ret = PTR_ERR(hdmi->iahb_clk);
1720
		dev_err(hdmi->dev, "Unable to get HDMI iahb clk: %d\n", ret);
1721 1722 1723 1724 1725
		goto err_isfr;
	}

	ret = clk_prepare_enable(hdmi->iahb_clk);
	if (ret) {
1726
		dev_err(hdmi->dev, "Cannot enable HDMI iahb clock: %d\n", ret);
1727 1728 1729 1730
		goto err_isfr;
	}

	/* Product and revision IDs */
1731
	dev_info(dev,
1732 1733 1734 1735 1736
		 "Detected HDMI controller 0x%x:0x%x:0x%x:0x%x\n",
		 hdmi_readb(hdmi, HDMI_DESIGN_ID),
		 hdmi_readb(hdmi, HDMI_REVISION_ID),
		 hdmi_readb(hdmi, HDMI_PRODUCT_ID0),
		 hdmi_readb(hdmi, HDMI_PRODUCT_ID1));
1737 1738 1739

	initialize_hdmi_ih_mutes(hdmi);

1740 1741 1742 1743
	ret = devm_request_threaded_irq(dev, irq, dw_hdmi_hardirq,
					dw_hdmi_irq, IRQF_SHARED,
					dev_name(dev), hdmi);
	if (ret)
1744
		goto err_iahb;
1745

1746 1747 1748 1749 1750 1751 1752 1753 1754 1755
	/*
	 * To prevent overflows in HDMI_IH_FC_STAT2, set the clk regenerator
	 * N and cts values before enabling phy
	 */
	hdmi_init_clk_regenerator(hdmi);

	/*
	 * Configure registers related to HDMI interrupt
	 * generation before registering IRQ.
	 */
1756
	hdmi_writeb(hdmi, HDMI_PHY_HPD | HDMI_PHY_RX_SENSE, HDMI_PHY_POL0);
1757 1758

	/* Clear Hotplug interrupts */
1759 1760
	hdmi_writeb(hdmi, HDMI_IH_PHY_STAT0_HPD | HDMI_IH_PHY_STAT0_RX_SENSE,
		    HDMI_IH_PHY_STAT0);
1761

1762
	ret = dw_hdmi_fb_registered(hdmi);
1763 1764 1765
	if (ret)
		goto err_iahb;

1766
	ret = dw_hdmi_register(drm, hdmi);
1767 1768 1769
	if (ret)
		goto err_iahb;

1770
	/* Unmute interrupts */
1771 1772
	hdmi_writeb(hdmi, ~(HDMI_IH_PHY_STAT0_HPD | HDMI_IH_PHY_STAT0_RX_SENSE),
		    HDMI_IH_MUTE_PHY_STAT0);
1773

1774 1775 1776 1777 1778 1779 1780 1781 1782
	memset(&pdevinfo, 0, sizeof(pdevinfo));
	pdevinfo.parent = dev;
	pdevinfo.id = PLATFORM_DEVID_AUTO;

	if (hdmi_readb(hdmi, HDMI_CONFIG1_ID) & HDMI_CONFIG1_AHB) {
		audio.phys = iores->start;
		audio.base = hdmi->regs;
		audio.irq = irq;
		audio.hdmi = hdmi;
1783
		audio.eld = hdmi->connector.eld;
1784 1785 1786 1787 1788 1789 1790 1791

		pdevinfo.name = "dw-hdmi-ahb-audio";
		pdevinfo.data = &audio;
		pdevinfo.size_data = sizeof(audio);
		pdevinfo.dma_mask = DMA_BIT_MASK(32);
		hdmi->audio = platform_device_register_full(&pdevinfo);
	}

1792
	dev_set_drvdata(dev, hdmi);
1793 1794 1795 1796 1797 1798 1799 1800 1801 1802

	return 0;

err_iahb:
	clk_disable_unprepare(hdmi->iahb_clk);
err_isfr:
	clk_disable_unprepare(hdmi->isfr_clk);

	return ret;
}
1803
EXPORT_SYMBOL_GPL(dw_hdmi_bind);
1804

1805
void dw_hdmi_unbind(struct device *dev, struct device *master, void *data)
1806
{
1807
	struct dw_hdmi *hdmi = dev_get_drvdata(dev);
1808

1809 1810 1811
	if (hdmi->audio && !IS_ERR(hdmi->audio))
		platform_device_unregister(hdmi->audio);

1812 1813 1814
	/* Disable all interrupts */
	hdmi_writeb(hdmi, ~0, HDMI_IH_MUTE_PHY_STAT0);

1815
	hdmi->connector.funcs->destroy(&hdmi->connector);
1816
	hdmi->encoder->funcs->destroy(hdmi->encoder);
1817 1818 1819 1820

	clk_disable_unprepare(hdmi->iahb_clk);
	clk_disable_unprepare(hdmi->isfr_clk);
	i2c_put_adapter(hdmi->ddc);
1821
}
1822
EXPORT_SYMBOL_GPL(dw_hdmi_unbind);
1823 1824

MODULE_AUTHOR("Sascha Hauer <s.hauer@pengutronix.de>");
1825 1826
MODULE_AUTHOR("Andy Yan <andy.yan@rock-chips.com>");
MODULE_AUTHOR("Yakir Yang <ykk@rock-chips.com>");
1827
MODULE_DESCRIPTION("DW HDMI transmitter driver");
1828
MODULE_LICENSE("GPL");
1829
MODULE_ALIAS("platform:dw-hdmi");