Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
   1/*
   2 * Samsung DP (Display port) register interface driver.
   3 *
   4 * Copyright (C) 2012 Samsung Electronics Co., Ltd.
   5 * Author: Jingoo Han <jg1.han@samsung.com>
   6 *
   7 * This program is free software; you can redistribute it and/or modify it
   8 * under the terms of the GNU General Public License as published by the
   9 * Free Software Foundation; either version 2 of the License, or (at your
  10 * option) any later version.
  11 */
  12
  13#include <linux/device.h>
  14#include <linux/io.h>
  15#include <linux/delay.h>
  16#include <linux/gpio.h>
  17
  18#include "exynos_dp_core.h"
  19#include "exynos_dp_reg.h"
  20
  21#define COMMON_INT_MASK_1	0
  22#define COMMON_INT_MASK_2	0
  23#define COMMON_INT_MASK_3	0
  24#define COMMON_INT_MASK_4	(HOTPLUG_CHG | HPD_LOST | PLUG)
  25#define INT_STA_MASK		INT_HPD
  26
  27void exynos_dp_enable_video_mute(struct exynos_dp_device *dp, bool enable)
  28{
  29	u32 reg;
  30
  31	if (enable) {
  32		reg = readl(dp->reg_base + EXYNOS_DP_VIDEO_CTL_1);
  33		reg |= HDCP_VIDEO_MUTE;
  34		writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_1);
  35	} else {
  36		reg = readl(dp->reg_base + EXYNOS_DP_VIDEO_CTL_1);
  37		reg &= ~HDCP_VIDEO_MUTE;
  38		writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_1);
  39	}
  40}
  41
  42void exynos_dp_stop_video(struct exynos_dp_device *dp)
  43{
  44	u32 reg;
  45
  46	reg = readl(dp->reg_base + EXYNOS_DP_VIDEO_CTL_1);
  47	reg &= ~VIDEO_EN;
  48	writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_1);
  49}
  50
  51void exynos_dp_lane_swap(struct exynos_dp_device *dp, bool enable)
  52{
  53	u32 reg;
  54
  55	if (enable)
  56		reg = LANE3_MAP_LOGIC_LANE_0 | LANE2_MAP_LOGIC_LANE_1 |
  57			LANE1_MAP_LOGIC_LANE_2 | LANE0_MAP_LOGIC_LANE_3;
  58	else
  59		reg = LANE3_MAP_LOGIC_LANE_3 | LANE2_MAP_LOGIC_LANE_2 |
  60			LANE1_MAP_LOGIC_LANE_1 | LANE0_MAP_LOGIC_LANE_0;
  61
  62	writel(reg, dp->reg_base + EXYNOS_DP_LANE_MAP);
  63}
  64
  65void exynos_dp_init_analog_param(struct exynos_dp_device *dp)
  66{
  67	u32 reg;
  68
  69	reg = TX_TERMINAL_CTRL_50_OHM;
  70	writel(reg, dp->reg_base + EXYNOS_DP_ANALOG_CTL_1);
  71
  72	reg = SEL_24M | TX_DVDD_BIT_1_0625V;
  73	writel(reg, dp->reg_base + EXYNOS_DP_ANALOG_CTL_2);
  74
  75	reg = DRIVE_DVDD_BIT_1_0625V | VCO_BIT_600_MICRO;
  76	writel(reg, dp->reg_base + EXYNOS_DP_ANALOG_CTL_3);
  77
  78	reg = PD_RING_OSC | AUX_TERMINAL_CTRL_50_OHM |
  79		TX_CUR1_2X | TX_CUR_16_MA;
  80	writel(reg, dp->reg_base + EXYNOS_DP_PLL_FILTER_CTL_1);
  81
  82	reg = CH3_AMP_400_MV | CH2_AMP_400_MV |
  83		CH1_AMP_400_MV | CH0_AMP_400_MV;
  84	writel(reg, dp->reg_base + EXYNOS_DP_TX_AMP_TUNING_CTL);
  85}
  86
  87void exynos_dp_init_interrupt(struct exynos_dp_device *dp)
  88{
  89	/* Set interrupt pin assertion polarity as high */
  90	writel(INT_POL1 | INT_POL0, dp->reg_base + EXYNOS_DP_INT_CTL);
  91
  92	/* Clear pending regisers */
  93	writel(0xff, dp->reg_base + EXYNOS_DP_COMMON_INT_STA_1);
  94	writel(0x4f, dp->reg_base + EXYNOS_DP_COMMON_INT_STA_2);
  95	writel(0xe0, dp->reg_base + EXYNOS_DP_COMMON_INT_STA_3);
  96	writel(0xe7, dp->reg_base + EXYNOS_DP_COMMON_INT_STA_4);
  97	writel(0x63, dp->reg_base + EXYNOS_DP_INT_STA);
  98
  99	/* 0:mask,1: unmask */
 100	writel(0x00, dp->reg_base + EXYNOS_DP_COMMON_INT_MASK_1);
 101	writel(0x00, dp->reg_base + EXYNOS_DP_COMMON_INT_MASK_2);
 102	writel(0x00, dp->reg_base + EXYNOS_DP_COMMON_INT_MASK_3);
 103	writel(0x00, dp->reg_base + EXYNOS_DP_COMMON_INT_MASK_4);
 104	writel(0x00, dp->reg_base + EXYNOS_DP_INT_STA_MASK);
 105}
 106
 107void exynos_dp_reset(struct exynos_dp_device *dp)
 108{
 109	u32 reg;
 110
 111	exynos_dp_stop_video(dp);
 112	exynos_dp_enable_video_mute(dp, 0);
 113
 114	reg = MASTER_VID_FUNC_EN_N | SLAVE_VID_FUNC_EN_N |
 115		AUD_FIFO_FUNC_EN_N | AUD_FUNC_EN_N |
 116		HDCP_FUNC_EN_N | SW_FUNC_EN_N;
 117	writel(reg, dp->reg_base + EXYNOS_DP_FUNC_EN_1);
 118
 119	reg = SSC_FUNC_EN_N | AUX_FUNC_EN_N |
 120		SERDES_FIFO_FUNC_EN_N |
 121		LS_CLK_DOMAIN_FUNC_EN_N;
 122	writel(reg, dp->reg_base + EXYNOS_DP_FUNC_EN_2);
 123
 124	usleep_range(20, 30);
 125
 126	exynos_dp_lane_swap(dp, 0);
 127
 128	writel(0x0, dp->reg_base + EXYNOS_DP_SYS_CTL_1);
 129	writel(0x40, dp->reg_base + EXYNOS_DP_SYS_CTL_2);
 130	writel(0x0, dp->reg_base + EXYNOS_DP_SYS_CTL_3);
 131	writel(0x0, dp->reg_base + EXYNOS_DP_SYS_CTL_4);
 132
 133	writel(0x0, dp->reg_base + EXYNOS_DP_PKT_SEND_CTL);
 134	writel(0x0, dp->reg_base + EXYNOS_DP_HDCP_CTL);
 135
 136	writel(0x5e, dp->reg_base + EXYNOS_DP_HPD_DEGLITCH_L);
 137	writel(0x1a, dp->reg_base + EXYNOS_DP_HPD_DEGLITCH_H);
 138
 139	writel(0x10, dp->reg_base + EXYNOS_DP_LINK_DEBUG_CTL);
 140
 141	writel(0x0, dp->reg_base + EXYNOS_DP_PHY_TEST);
 142
 143	writel(0x0, dp->reg_base + EXYNOS_DP_VIDEO_FIFO_THRD);
 144	writel(0x20, dp->reg_base + EXYNOS_DP_AUDIO_MARGIN);
 145
 146	writel(0x4, dp->reg_base + EXYNOS_DP_M_VID_GEN_FILTER_TH);
 147	writel(0x2, dp->reg_base + EXYNOS_DP_M_AUD_GEN_FILTER_TH);
 148
 149	writel(0x00000101, dp->reg_base + EXYNOS_DP_SOC_GENERAL_CTL);
 150}
 151
 152void exynos_dp_swreset(struct exynos_dp_device *dp)
 153{
 154	writel(RESET_DP_TX, dp->reg_base + EXYNOS_DP_TX_SW_RESET);
 155}
 156
 157void exynos_dp_config_interrupt(struct exynos_dp_device *dp)
 158{
 159	u32 reg;
 160
 161	/* 0: mask, 1: unmask */
 162	reg = COMMON_INT_MASK_1;
 163	writel(reg, dp->reg_base + EXYNOS_DP_COMMON_INT_MASK_1);
 164
 165	reg = COMMON_INT_MASK_2;
 166	writel(reg, dp->reg_base + EXYNOS_DP_COMMON_INT_MASK_2);
 167
 168	reg = COMMON_INT_MASK_3;
 169	writel(reg, dp->reg_base + EXYNOS_DP_COMMON_INT_MASK_3);
 170
 171	reg = COMMON_INT_MASK_4;
 172	writel(reg, dp->reg_base + EXYNOS_DP_COMMON_INT_MASK_4);
 173
 174	reg = INT_STA_MASK;
 175	writel(reg, dp->reg_base + EXYNOS_DP_INT_STA_MASK);
 176}
 177
 178enum pll_status exynos_dp_get_pll_lock_status(struct exynos_dp_device *dp)
 179{
 180	u32 reg;
 181
 182	reg = readl(dp->reg_base + EXYNOS_DP_DEBUG_CTL);
 183	if (reg & PLL_LOCK)
 184		return PLL_LOCKED;
 185	else
 186		return PLL_UNLOCKED;
 187}
 188
 189void exynos_dp_set_pll_power_down(struct exynos_dp_device *dp, bool enable)
 190{
 191	u32 reg;
 192
 193	if (enable) {
 194		reg = readl(dp->reg_base + EXYNOS_DP_PLL_CTL);
 195		reg |= DP_PLL_PD;
 196		writel(reg, dp->reg_base + EXYNOS_DP_PLL_CTL);
 197	} else {
 198		reg = readl(dp->reg_base + EXYNOS_DP_PLL_CTL);
 199		reg &= ~DP_PLL_PD;
 200		writel(reg, dp->reg_base + EXYNOS_DP_PLL_CTL);
 201	}
 202}
 203
 204void exynos_dp_set_analog_power_down(struct exynos_dp_device *dp,
 205				enum analog_power_block block,
 206				bool enable)
 207{
 208	u32 reg;
 209
 210	switch (block) {
 211	case AUX_BLOCK:
 212		if (enable) {
 213			reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
 214			reg |= AUX_PD;
 215			writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
 216		} else {
 217			reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
 218			reg &= ~AUX_PD;
 219			writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
 220		}
 221		break;
 222	case CH0_BLOCK:
 223		if (enable) {
 224			reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
 225			reg |= CH0_PD;
 226			writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
 227		} else {
 228			reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
 229			reg &= ~CH0_PD;
 230			writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
 231		}
 232		break;
 233	case CH1_BLOCK:
 234		if (enable) {
 235			reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
 236			reg |= CH1_PD;
 237			writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
 238		} else {
 239			reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
 240			reg &= ~CH1_PD;
 241			writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
 242		}
 243		break;
 244	case CH2_BLOCK:
 245		if (enable) {
 246			reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
 247			reg |= CH2_PD;
 248			writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
 249		} else {
 250			reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
 251			reg &= ~CH2_PD;
 252			writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
 253		}
 254		break;
 255	case CH3_BLOCK:
 256		if (enable) {
 257			reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
 258			reg |= CH3_PD;
 259			writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
 260		} else {
 261			reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
 262			reg &= ~CH3_PD;
 263			writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
 264		}
 265		break;
 266	case ANALOG_TOTAL:
 267		if (enable) {
 268			reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
 269			reg |= DP_PHY_PD;
 270			writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
 271		} else {
 272			reg = readl(dp->reg_base + EXYNOS_DP_PHY_PD);
 273			reg &= ~DP_PHY_PD;
 274			writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
 275		}
 276		break;
 277	case POWER_ALL:
 278		if (enable) {
 279			reg = DP_PHY_PD | AUX_PD | CH3_PD | CH2_PD |
 280				CH1_PD | CH0_PD;
 281			writel(reg, dp->reg_base + EXYNOS_DP_PHY_PD);
 282		} else {
 283			writel(0x00, dp->reg_base + EXYNOS_DP_PHY_PD);
 284		}
 285		break;
 286	default:
 287		break;
 288	}
 289}
 290
 291void exynos_dp_init_analog_func(struct exynos_dp_device *dp)
 292{
 293	u32 reg;
 294	int timeout_loop = 0;
 295
 296	exynos_dp_set_analog_power_down(dp, POWER_ALL, 0);
 297
 298	reg = PLL_LOCK_CHG;
 299	writel(reg, dp->reg_base + EXYNOS_DP_COMMON_INT_STA_1);
 300
 301	reg = readl(dp->reg_base + EXYNOS_DP_DEBUG_CTL);
 302	reg &= ~(F_PLL_LOCK | PLL_LOCK_CTRL);
 303	writel(reg, dp->reg_base + EXYNOS_DP_DEBUG_CTL);
 304
 305	/* Power up PLL */
 306	if (exynos_dp_get_pll_lock_status(dp) == PLL_UNLOCKED) {
 307		exynos_dp_set_pll_power_down(dp, 0);
 308
 309		while (exynos_dp_get_pll_lock_status(dp) == PLL_UNLOCKED) {
 310			timeout_loop++;
 311			if (DP_TIMEOUT_LOOP_COUNT < timeout_loop) {
 312				dev_err(dp->dev, "failed to get pll lock status\n");
 313				return;
 314			}
 315			usleep_range(10, 20);
 316		}
 317	}
 318
 319	/* Enable Serdes FIFO function and Link symbol clock domain module */
 320	reg = readl(dp->reg_base + EXYNOS_DP_FUNC_EN_2);
 321	reg &= ~(SERDES_FIFO_FUNC_EN_N | LS_CLK_DOMAIN_FUNC_EN_N
 322		| AUX_FUNC_EN_N);
 323	writel(reg, dp->reg_base + EXYNOS_DP_FUNC_EN_2);
 324}
 325
 326void exynos_dp_clear_hotplug_interrupts(struct exynos_dp_device *dp)
 327{
 328	u32 reg;
 329
 330	if (gpio_is_valid(dp->hpd_gpio))
 331		return;
 332
 333	reg = HOTPLUG_CHG | HPD_LOST | PLUG;
 334	writel(reg, dp->reg_base + EXYNOS_DP_COMMON_INT_STA_4);
 335
 336	reg = INT_HPD;
 337	writel(reg, dp->reg_base + EXYNOS_DP_INT_STA);
 338}
 339
 340void exynos_dp_init_hpd(struct exynos_dp_device *dp)
 341{
 342	u32 reg;
 343
 344	if (gpio_is_valid(dp->hpd_gpio))
 345		return;
 346
 347	exynos_dp_clear_hotplug_interrupts(dp);
 348
 349	reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_3);
 350	reg &= ~(F_HPD | HPD_CTRL);
 351	writel(reg, dp->reg_base + EXYNOS_DP_SYS_CTL_3);
 352}
 353
 354enum dp_irq_type exynos_dp_get_irq_type(struct exynos_dp_device *dp)
 355{
 356	u32 reg;
 357
 358	if (gpio_is_valid(dp->hpd_gpio)) {
 359		reg = gpio_get_value(dp->hpd_gpio);
 360		if (reg)
 361			return DP_IRQ_TYPE_HP_CABLE_IN;
 362		else
 363			return DP_IRQ_TYPE_HP_CABLE_OUT;
 364	} else {
 365		/* Parse hotplug interrupt status register */
 366		reg = readl(dp->reg_base + EXYNOS_DP_COMMON_INT_STA_4);
 367
 368		if (reg & PLUG)
 369			return DP_IRQ_TYPE_HP_CABLE_IN;
 370
 371		if (reg & HPD_LOST)
 372			return DP_IRQ_TYPE_HP_CABLE_OUT;
 373
 374		if (reg & HOTPLUG_CHG)
 375			return DP_IRQ_TYPE_HP_CHANGE;
 376
 377		return DP_IRQ_TYPE_UNKNOWN;
 378	}
 379}
 380
 381void exynos_dp_reset_aux(struct exynos_dp_device *dp)
 382{
 383	u32 reg;
 384
 385	/* Disable AUX channel module */
 386	reg = readl(dp->reg_base + EXYNOS_DP_FUNC_EN_2);
 387	reg |= AUX_FUNC_EN_N;
 388	writel(reg, dp->reg_base + EXYNOS_DP_FUNC_EN_2);
 389}
 390
 391void exynos_dp_init_aux(struct exynos_dp_device *dp)
 392{
 393	u32 reg;
 394
 395	/* Clear inerrupts related to AUX channel */
 396	reg = RPLY_RECEIV | AUX_ERR;
 397	writel(reg, dp->reg_base + EXYNOS_DP_INT_STA);
 398
 399	exynos_dp_reset_aux(dp);
 400
 401	/* Disable AUX transaction H/W retry */
 402	reg = AUX_BIT_PERIOD_EXPECTED_DELAY(3) | AUX_HW_RETRY_COUNT_SEL(0)|
 403		AUX_HW_RETRY_INTERVAL_600_MICROSECONDS;
 404	writel(reg, dp->reg_base + EXYNOS_DP_AUX_HW_RETRY_CTL);
 405
 406	/* Receive AUX Channel DEFER commands equal to DEFFER_COUNT*64 */
 407	reg = DEFER_CTRL_EN | DEFER_COUNT(1);
 408	writel(reg, dp->reg_base + EXYNOS_DP_AUX_CH_DEFER_CTL);
 409
 410	/* Enable AUX channel module */
 411	reg = readl(dp->reg_base + EXYNOS_DP_FUNC_EN_2);
 412	reg &= ~AUX_FUNC_EN_N;
 413	writel(reg, dp->reg_base + EXYNOS_DP_FUNC_EN_2);
 414}
 415
 416int exynos_dp_get_plug_in_status(struct exynos_dp_device *dp)
 417{
 418	u32 reg;
 419
 420	if (gpio_is_valid(dp->hpd_gpio)) {
 421		if (gpio_get_value(dp->hpd_gpio))
 422			return 0;
 423	} else {
 424		reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_3);
 425		if (reg & HPD_STATUS)
 426			return 0;
 427	}
 428
 429	return -EINVAL;
 430}
 431
 432void exynos_dp_enable_sw_function(struct exynos_dp_device *dp)
 433{
 434	u32 reg;
 435
 436	reg = readl(dp->reg_base + EXYNOS_DP_FUNC_EN_1);
 437	reg &= ~SW_FUNC_EN_N;
 438	writel(reg, dp->reg_base + EXYNOS_DP_FUNC_EN_1);
 439}
 440
 441int exynos_dp_start_aux_transaction(struct exynos_dp_device *dp)
 442{
 443	int reg;
 444	int retval = 0;
 445	int timeout_loop = 0;
 446
 447	/* Enable AUX CH operation */
 448	reg = readl(dp->reg_base + EXYNOS_DP_AUX_CH_CTL_2);
 449	reg |= AUX_EN;
 450	writel(reg, dp->reg_base + EXYNOS_DP_AUX_CH_CTL_2);
 451
 452	/* Is AUX CH command reply received? */
 453	reg = readl(dp->reg_base + EXYNOS_DP_INT_STA);
 454	while (!(reg & RPLY_RECEIV)) {
 455		timeout_loop++;
 456		if (DP_TIMEOUT_LOOP_COUNT < timeout_loop) {
 457			dev_err(dp->dev, "AUX CH command reply failed!\n");
 458			return -ETIMEDOUT;
 459		}
 460		reg = readl(dp->reg_base + EXYNOS_DP_INT_STA);
 461		usleep_range(10, 11);
 462	}
 463
 464	/* Clear interrupt source for AUX CH command reply */
 465	writel(RPLY_RECEIV, dp->reg_base + EXYNOS_DP_INT_STA);
 466
 467	/* Clear interrupt source for AUX CH access error */
 468	reg = readl(dp->reg_base + EXYNOS_DP_INT_STA);
 469	if (reg & AUX_ERR) {
 470		writel(AUX_ERR, dp->reg_base + EXYNOS_DP_INT_STA);
 471		return -EREMOTEIO;
 472	}
 473
 474	/* Check AUX CH error access status */
 475	reg = readl(dp->reg_base + EXYNOS_DP_AUX_CH_STA);
 476	if ((reg & AUX_STATUS_MASK) != 0) {
 477		dev_err(dp->dev, "AUX CH error happens: %d\n\n",
 478			reg & AUX_STATUS_MASK);
 479		return -EREMOTEIO;
 480	}
 481
 482	return retval;
 483}
 484
 485int exynos_dp_write_byte_to_dpcd(struct exynos_dp_device *dp,
 486				unsigned int reg_addr,
 487				unsigned char data)
 488{
 489	u32 reg;
 490	int i;
 491	int retval;
 492
 493	for (i = 0; i < 3; i++) {
 494		/* Clear AUX CH data buffer */
 495		reg = BUF_CLR;
 496		writel(reg, dp->reg_base + EXYNOS_DP_BUFFER_DATA_CTL);
 497
 498		/* Select DPCD device address */
 499		reg = AUX_ADDR_7_0(reg_addr);
 500		writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_7_0);
 501		reg = AUX_ADDR_15_8(reg_addr);
 502		writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_15_8);
 503		reg = AUX_ADDR_19_16(reg_addr);
 504		writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_19_16);
 505
 506		/* Write data buffer */
 507		reg = (unsigned int)data;
 508		writel(reg, dp->reg_base + EXYNOS_DP_BUF_DATA_0);
 509
 510		/*
 511		 * Set DisplayPort transaction and write 1 byte
 512		 * If bit 3 is 1, DisplayPort transaction.
 513		 * If Bit 3 is 0, I2C transaction.
 514		 */
 515		reg = AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_WRITE;
 516		writel(reg, dp->reg_base + EXYNOS_DP_AUX_CH_CTL_1);
 517
 518		/* Start AUX transaction */
 519		retval = exynos_dp_start_aux_transaction(dp);
 520		if (retval == 0)
 521			break;
 522		else
 523			dev_dbg(dp->dev, "%s: Aux Transaction fail!\n",
 524				__func__);
 525	}
 526
 527	return retval;
 528}
 529
 530int exynos_dp_read_byte_from_dpcd(struct exynos_dp_device *dp,
 531				unsigned int reg_addr,
 532				unsigned char *data)
 533{
 534	u32 reg;
 535	int i;
 536	int retval;
 537
 538	for (i = 0; i < 3; i++) {
 539		/* Clear AUX CH data buffer */
 540		reg = BUF_CLR;
 541		writel(reg, dp->reg_base + EXYNOS_DP_BUFFER_DATA_CTL);
 542
 543		/* Select DPCD device address */
 544		reg = AUX_ADDR_7_0(reg_addr);
 545		writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_7_0);
 546		reg = AUX_ADDR_15_8(reg_addr);
 547		writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_15_8);
 548		reg = AUX_ADDR_19_16(reg_addr);
 549		writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_19_16);
 550
 551		/*
 552		 * Set DisplayPort transaction and read 1 byte
 553		 * If bit 3 is 1, DisplayPort transaction.
 554		 * If Bit 3 is 0, I2C transaction.
 555		 */
 556		reg = AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_READ;
 557		writel(reg, dp->reg_base + EXYNOS_DP_AUX_CH_CTL_1);
 558
 559		/* Start AUX transaction */
 560		retval = exynos_dp_start_aux_transaction(dp);
 561		if (retval == 0)
 562			break;
 563		else
 564			dev_dbg(dp->dev, "%s: Aux Transaction fail!\n",
 565				__func__);
 566	}
 567
 568	/* Read data buffer */
 569	reg = readl(dp->reg_base + EXYNOS_DP_BUF_DATA_0);
 570	*data = (unsigned char)(reg & 0xff);
 571
 572	return retval;
 573}
 574
 575int exynos_dp_write_bytes_to_dpcd(struct exynos_dp_device *dp,
 576				unsigned int reg_addr,
 577				unsigned int count,
 578				unsigned char data[])
 579{
 580	u32 reg;
 581	unsigned int start_offset;
 582	unsigned int cur_data_count;
 583	unsigned int cur_data_idx;
 584	int i;
 585	int retval = 0;
 586
 587	/* Clear AUX CH data buffer */
 588	reg = BUF_CLR;
 589	writel(reg, dp->reg_base + EXYNOS_DP_BUFFER_DATA_CTL);
 590
 591	start_offset = 0;
 592	while (start_offset < count) {
 593		/* Buffer size of AUX CH is 16 * 4bytes */
 594		if ((count - start_offset) > 16)
 595			cur_data_count = 16;
 596		else
 597			cur_data_count = count - start_offset;
 598
 599		for (i = 0; i < 3; i++) {
 600			/* Select DPCD device address */
 601			reg = AUX_ADDR_7_0(reg_addr + start_offset);
 602			writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_7_0);
 603			reg = AUX_ADDR_15_8(reg_addr + start_offset);
 604			writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_15_8);
 605			reg = AUX_ADDR_19_16(reg_addr + start_offset);
 606			writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_19_16);
 607
 608			for (cur_data_idx = 0; cur_data_idx < cur_data_count;
 609			     cur_data_idx++) {
 610				reg = data[start_offset + cur_data_idx];
 611				writel(reg, dp->reg_base + EXYNOS_DP_BUF_DATA_0
 612							  + 4 * cur_data_idx);
 613			}
 614
 615			/*
 616			 * Set DisplayPort transaction and write
 617			 * If bit 3 is 1, DisplayPort transaction.
 618			 * If Bit 3 is 0, I2C transaction.
 619			 */
 620			reg = AUX_LENGTH(cur_data_count) |
 621				AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_WRITE;
 622			writel(reg, dp->reg_base + EXYNOS_DP_AUX_CH_CTL_1);
 623
 624			/* Start AUX transaction */
 625			retval = exynos_dp_start_aux_transaction(dp);
 626			if (retval == 0)
 627				break;
 628			else
 629				dev_dbg(dp->dev, "%s: Aux Transaction fail!\n",
 630					__func__);
 631		}
 632
 633		start_offset += cur_data_count;
 634	}
 635
 636	return retval;
 637}
 638
 639int exynos_dp_read_bytes_from_dpcd(struct exynos_dp_device *dp,
 640				unsigned int reg_addr,
 641				unsigned int count,
 642				unsigned char data[])
 643{
 644	u32 reg;
 645	unsigned int start_offset;
 646	unsigned int cur_data_count;
 647	unsigned int cur_data_idx;
 648	int i;
 649	int retval = 0;
 650
 651	/* Clear AUX CH data buffer */
 652	reg = BUF_CLR;
 653	writel(reg, dp->reg_base + EXYNOS_DP_BUFFER_DATA_CTL);
 654
 655	start_offset = 0;
 656	while (start_offset < count) {
 657		/* Buffer size of AUX CH is 16 * 4bytes */
 658		if ((count - start_offset) > 16)
 659			cur_data_count = 16;
 660		else
 661			cur_data_count = count - start_offset;
 662
 663		/* AUX CH Request Transaction process */
 664		for (i = 0; i < 3; i++) {
 665			/* Select DPCD device address */
 666			reg = AUX_ADDR_7_0(reg_addr + start_offset);
 667			writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_7_0);
 668			reg = AUX_ADDR_15_8(reg_addr + start_offset);
 669			writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_15_8);
 670			reg = AUX_ADDR_19_16(reg_addr + start_offset);
 671			writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_19_16);
 672
 673			/*
 674			 * Set DisplayPort transaction and read
 675			 * If bit 3 is 1, DisplayPort transaction.
 676			 * If Bit 3 is 0, I2C transaction.
 677			 */
 678			reg = AUX_LENGTH(cur_data_count) |
 679				AUX_TX_COMM_DP_TRANSACTION | AUX_TX_COMM_READ;
 680			writel(reg, dp->reg_base + EXYNOS_DP_AUX_CH_CTL_1);
 681
 682			/* Start AUX transaction */
 683			retval = exynos_dp_start_aux_transaction(dp);
 684			if (retval == 0)
 685				break;
 686			else
 687				dev_dbg(dp->dev, "%s: Aux Transaction fail!\n",
 688					__func__);
 689		}
 690
 691		for (cur_data_idx = 0; cur_data_idx < cur_data_count;
 692		    cur_data_idx++) {
 693			reg = readl(dp->reg_base + EXYNOS_DP_BUF_DATA_0
 694						 + 4 * cur_data_idx);
 695			data[start_offset + cur_data_idx] =
 696				(unsigned char)reg;
 697		}
 698
 699		start_offset += cur_data_count;
 700	}
 701
 702	return retval;
 703}
 704
 705int exynos_dp_select_i2c_device(struct exynos_dp_device *dp,
 706				unsigned int device_addr,
 707				unsigned int reg_addr)
 708{
 709	u32 reg;
 710	int retval;
 711
 712	/* Set EDID device address */
 713	reg = device_addr;
 714	writel(reg, dp->reg_base + EXYNOS_DP_AUX_ADDR_7_0);
 715	writel(0x0, dp->reg_base + EXYNOS_DP_AUX_ADDR_15_8);
 716	writel(0x0, dp->reg_base + EXYNOS_DP_AUX_ADDR_19_16);
 717
 718	/* Set offset from base address of EDID device */
 719	writel(reg_addr, dp->reg_base + EXYNOS_DP_BUF_DATA_0);
 720
 721	/*
 722	 * Set I2C transaction and write address
 723	 * If bit 3 is 1, DisplayPort transaction.
 724	 * If Bit 3 is 0, I2C transaction.
 725	 */
 726	reg = AUX_TX_COMM_I2C_TRANSACTION | AUX_TX_COMM_MOT |
 727		AUX_TX_COMM_WRITE;
 728	writel(reg, dp->reg_base + EXYNOS_DP_AUX_CH_CTL_1);
 729
 730	/* Start AUX transaction */
 731	retval = exynos_dp_start_aux_transaction(dp);
 732	if (retval != 0)
 733		dev_dbg(dp->dev, "%s: Aux Transaction fail!\n", __func__);
 734
 735	return retval;
 736}
 737
 738int exynos_dp_read_byte_from_i2c(struct exynos_dp_device *dp,
 739				unsigned int device_addr,
 740				unsigned int reg_addr,
 741				unsigned int *data)
 742{
 743	u32 reg;
 744	int i;
 745	int retval;
 746
 747	for (i = 0; i < 3; i++) {
 748		/* Clear AUX CH data buffer */
 749		reg = BUF_CLR;
 750		writel(reg, dp->reg_base + EXYNOS_DP_BUFFER_DATA_CTL);
 751
 752		/* Select EDID device */
 753		retval = exynos_dp_select_i2c_device(dp, device_addr, reg_addr);
 754		if (retval != 0)
 755			continue;
 756
 757		/*
 758		 * Set I2C transaction and read data
 759		 * If bit 3 is 1, DisplayPort transaction.
 760		 * If Bit 3 is 0, I2C transaction.
 761		 */
 762		reg = AUX_TX_COMM_I2C_TRANSACTION |
 763			AUX_TX_COMM_READ;
 764		writel(reg, dp->reg_base + EXYNOS_DP_AUX_CH_CTL_1);
 765
 766		/* Start AUX transaction */
 767		retval = exynos_dp_start_aux_transaction(dp);
 768		if (retval == 0)
 769			break;
 770		else
 771			dev_dbg(dp->dev, "%s: Aux Transaction fail!\n",
 772				__func__);
 773	}
 774
 775	/* Read data */
 776	if (retval == 0)
 777		*data = readl(dp->reg_base + EXYNOS_DP_BUF_DATA_0);
 778
 779	return retval;
 780}
 781
 782int exynos_dp_read_bytes_from_i2c(struct exynos_dp_device *dp,
 783				unsigned int device_addr,
 784				unsigned int reg_addr,
 785				unsigned int count,
 786				unsigned char edid[])
 787{
 788	u32 reg;
 789	unsigned int i, j;
 790	unsigned int cur_data_idx;
 791	unsigned int defer = 0;
 792	int retval = 0;
 793
 794	for (i = 0; i < count; i += 16) {
 795		for (j = 0; j < 3; j++) {
 796			/* Clear AUX CH data buffer */
 797			reg = BUF_CLR;
 798			writel(reg, dp->reg_base + EXYNOS_DP_BUFFER_DATA_CTL);
 799
 800			/* Set normal AUX CH command */
 801			reg = readl(dp->reg_base + EXYNOS_DP_AUX_CH_CTL_2);
 802			reg &= ~ADDR_ONLY;
 803			writel(reg, dp->reg_base + EXYNOS_DP_AUX_CH_CTL_2);
 804
 805			/*
 806			 * If Rx sends defer, Tx sends only reads
 807			 * request without sending address
 808			 */
 809			if (!defer)
 810				retval = exynos_dp_select_i2c_device(dp,
 811						device_addr, reg_addr + i);
 812			else
 813				defer = 0;
 814
 815			if (retval == 0) {
 816				/*
 817				 * Set I2C transaction and write data
 818				 * If bit 3 is 1, DisplayPort transaction.
 819				 * If Bit 3 is 0, I2C transaction.
 820				 */
 821				reg = AUX_LENGTH(16) |
 822					AUX_TX_COMM_I2C_TRANSACTION |
 823					AUX_TX_COMM_READ;
 824				writel(reg, dp->reg_base +
 825					EXYNOS_DP_AUX_CH_CTL_1);
 826
 827				/* Start AUX transaction */
 828				retval = exynos_dp_start_aux_transaction(dp);
 829				if (retval == 0)
 830					break;
 831				else
 832					dev_dbg(dp->dev,
 833						"%s: Aux Transaction fail!\n",
 834						__func__);
 835			}
 836			/* Check if Rx sends defer */
 837			reg = readl(dp->reg_base + EXYNOS_DP_AUX_RX_COMM);
 838			if (reg == AUX_RX_COMM_AUX_DEFER ||
 839				reg == AUX_RX_COMM_I2C_DEFER) {
 840				dev_err(dp->dev, "Defer: %d\n\n", reg);
 841				defer = 1;
 842			}
 843		}
 844
 845		for (cur_data_idx = 0; cur_data_idx < 16; cur_data_idx++) {
 846			reg = readl(dp->reg_base + EXYNOS_DP_BUF_DATA_0
 847						 + 4 * cur_data_idx);
 848			edid[i + cur_data_idx] = (unsigned char)reg;
 849		}
 850	}
 851
 852	return retval;
 853}
 854
 855void exynos_dp_set_link_bandwidth(struct exynos_dp_device *dp, u32 bwtype)
 856{
 857	u32 reg;
 858
 859	reg = bwtype;
 860	if ((bwtype == LINK_RATE_2_70GBPS) || (bwtype == LINK_RATE_1_62GBPS))
 861		writel(reg, dp->reg_base + EXYNOS_DP_LINK_BW_SET);
 862}
 863
 864void exynos_dp_get_link_bandwidth(struct exynos_dp_device *dp, u32 *bwtype)
 865{
 866	u32 reg;
 867
 868	reg = readl(dp->reg_base + EXYNOS_DP_LINK_BW_SET);
 869	*bwtype = reg;
 870}
 871
 872void exynos_dp_set_lane_count(struct exynos_dp_device *dp, u32 count)
 873{
 874	u32 reg;
 875
 876	reg = count;
 877	writel(reg, dp->reg_base + EXYNOS_DP_LANE_COUNT_SET);
 878}
 879
 880void exynos_dp_get_lane_count(struct exynos_dp_device *dp, u32 *count)
 881{
 882	u32 reg;
 883
 884	reg = readl(dp->reg_base + EXYNOS_DP_LANE_COUNT_SET);
 885	*count = reg;
 886}
 887
 888void exynos_dp_enable_enhanced_mode(struct exynos_dp_device *dp, bool enable)
 889{
 890	u32 reg;
 891
 892	if (enable) {
 893		reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_4);
 894		reg |= ENHANCED;
 895		writel(reg, dp->reg_base + EXYNOS_DP_SYS_CTL_4);
 896	} else {
 897		reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_4);
 898		reg &= ~ENHANCED;
 899		writel(reg, dp->reg_base + EXYNOS_DP_SYS_CTL_4);
 900	}
 901}
 902
 903void exynos_dp_set_training_pattern(struct exynos_dp_device *dp,
 904				 enum pattern_set pattern)
 905{
 906	u32 reg;
 907
 908	switch (pattern) {
 909	case PRBS7:
 910		reg = SCRAMBLING_ENABLE | LINK_QUAL_PATTERN_SET_PRBS7;
 911		writel(reg, dp->reg_base + EXYNOS_DP_TRAINING_PTN_SET);
 912		break;
 913	case D10_2:
 914		reg = SCRAMBLING_ENABLE | LINK_QUAL_PATTERN_SET_D10_2;
 915		writel(reg, dp->reg_base + EXYNOS_DP_TRAINING_PTN_SET);
 916		break;
 917	case TRAINING_PTN1:
 918		reg = SCRAMBLING_DISABLE | SW_TRAINING_PATTERN_SET_PTN1;
 919		writel(reg, dp->reg_base + EXYNOS_DP_TRAINING_PTN_SET);
 920		break;
 921	case TRAINING_PTN2:
 922		reg = SCRAMBLING_DISABLE | SW_TRAINING_PATTERN_SET_PTN2;
 923		writel(reg, dp->reg_base + EXYNOS_DP_TRAINING_PTN_SET);
 924		break;
 925	case DP_NONE:
 926		reg = SCRAMBLING_ENABLE |
 927			LINK_QUAL_PATTERN_SET_DISABLE |
 928			SW_TRAINING_PATTERN_SET_NORMAL;
 929		writel(reg, dp->reg_base + EXYNOS_DP_TRAINING_PTN_SET);
 930		break;
 931	default:
 932		break;
 933	}
 934}
 935
 936void exynos_dp_set_lane0_pre_emphasis(struct exynos_dp_device *dp, u32 level)
 937{
 938	u32 reg;
 939
 940	reg = readl(dp->reg_base + EXYNOS_DP_LN0_LINK_TRAINING_CTL);
 941	reg &= ~PRE_EMPHASIS_SET_MASK;
 942	reg |= level << PRE_EMPHASIS_SET_SHIFT;
 943	writel(reg, dp->reg_base + EXYNOS_DP_LN0_LINK_TRAINING_CTL);
 944}
 945
 946void exynos_dp_set_lane1_pre_emphasis(struct exynos_dp_device *dp, u32 level)
 947{
 948	u32 reg;
 949
 950	reg = readl(dp->reg_base + EXYNOS_DP_LN1_LINK_TRAINING_CTL);
 951	reg &= ~PRE_EMPHASIS_SET_MASK;
 952	reg |= level << PRE_EMPHASIS_SET_SHIFT;
 953	writel(reg, dp->reg_base + EXYNOS_DP_LN1_LINK_TRAINING_CTL);
 954}
 955
 956void exynos_dp_set_lane2_pre_emphasis(struct exynos_dp_device *dp, u32 level)
 957{
 958	u32 reg;
 959
 960	reg = readl(dp->reg_base + EXYNOS_DP_LN2_LINK_TRAINING_CTL);
 961	reg &= ~PRE_EMPHASIS_SET_MASK;
 962	reg |= level << PRE_EMPHASIS_SET_SHIFT;
 963	writel(reg, dp->reg_base + EXYNOS_DP_LN2_LINK_TRAINING_CTL);
 964}
 965
 966void exynos_dp_set_lane3_pre_emphasis(struct exynos_dp_device *dp, u32 level)
 967{
 968	u32 reg;
 969
 970	reg = readl(dp->reg_base + EXYNOS_DP_LN3_LINK_TRAINING_CTL);
 971	reg &= ~PRE_EMPHASIS_SET_MASK;
 972	reg |= level << PRE_EMPHASIS_SET_SHIFT;
 973	writel(reg, dp->reg_base + EXYNOS_DP_LN3_LINK_TRAINING_CTL);
 974}
 975
 976void exynos_dp_set_lane0_link_training(struct exynos_dp_device *dp,
 977					u32 training_lane)
 978{
 979	u32 reg;
 980
 981	reg = training_lane;
 982	writel(reg, dp->reg_base + EXYNOS_DP_LN0_LINK_TRAINING_CTL);
 983}
 984
 985void exynos_dp_set_lane1_link_training(struct exynos_dp_device *dp,
 986					u32 training_lane)
 987{
 988	u32 reg;
 989
 990	reg = training_lane;
 991	writel(reg, dp->reg_base + EXYNOS_DP_LN1_LINK_TRAINING_CTL);
 992}
 993
 994void exynos_dp_set_lane2_link_training(struct exynos_dp_device *dp,
 995					u32 training_lane)
 996{
 997	u32 reg;
 998
 999	reg = training_lane;
1000	writel(reg, dp->reg_base + EXYNOS_DP_LN2_LINK_TRAINING_CTL);
1001}
1002
1003void exynos_dp_set_lane3_link_training(struct exynos_dp_device *dp,
1004					u32 training_lane)
1005{
1006	u32 reg;
1007
1008	reg = training_lane;
1009	writel(reg, dp->reg_base + EXYNOS_DP_LN3_LINK_TRAINING_CTL);
1010}
1011
1012u32 exynos_dp_get_lane0_link_training(struct exynos_dp_device *dp)
1013{
1014	u32 reg;
1015
1016	reg = readl(dp->reg_base + EXYNOS_DP_LN0_LINK_TRAINING_CTL);
1017	return reg;
1018}
1019
1020u32 exynos_dp_get_lane1_link_training(struct exynos_dp_device *dp)
1021{
1022	u32 reg;
1023
1024	reg = readl(dp->reg_base + EXYNOS_DP_LN1_LINK_TRAINING_CTL);
1025	return reg;
1026}
1027
1028u32 exynos_dp_get_lane2_link_training(struct exynos_dp_device *dp)
1029{
1030	u32 reg;
1031
1032	reg = readl(dp->reg_base + EXYNOS_DP_LN2_LINK_TRAINING_CTL);
1033	return reg;
1034}
1035
1036u32 exynos_dp_get_lane3_link_training(struct exynos_dp_device *dp)
1037{
1038	u32 reg;
1039
1040	reg = readl(dp->reg_base + EXYNOS_DP_LN3_LINK_TRAINING_CTL);
1041	return reg;
1042}
1043
1044void exynos_dp_reset_macro(struct exynos_dp_device *dp)
1045{
1046	u32 reg;
1047
1048	reg = readl(dp->reg_base + EXYNOS_DP_PHY_TEST);
1049	reg |= MACRO_RST;
1050	writel(reg, dp->reg_base + EXYNOS_DP_PHY_TEST);
1051
1052	/* 10 us is the minimum reset time. */
1053	usleep_range(10, 20);
1054
1055	reg &= ~MACRO_RST;
1056	writel(reg, dp->reg_base + EXYNOS_DP_PHY_TEST);
1057}
1058
1059void exynos_dp_init_video(struct exynos_dp_device *dp)
1060{
1061	u32 reg;
1062
1063	reg = VSYNC_DET | VID_FORMAT_CHG | VID_CLK_CHG;
1064	writel(reg, dp->reg_base + EXYNOS_DP_COMMON_INT_STA_1);
1065
1066	reg = 0x0;
1067	writel(reg, dp->reg_base + EXYNOS_DP_SYS_CTL_1);
1068
1069	reg = CHA_CRI(4) | CHA_CTRL;
1070	writel(reg, dp->reg_base + EXYNOS_DP_SYS_CTL_2);
1071
1072	reg = 0x0;
1073	writel(reg, dp->reg_base + EXYNOS_DP_SYS_CTL_3);
1074
1075	reg = VID_HRES_TH(2) | VID_VRES_TH(0);
1076	writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_8);
1077}
1078
1079void exynos_dp_set_video_color_format(struct exynos_dp_device *dp)
1080{
1081	u32 reg;
1082
1083	/* Configure the input color depth, color space, dynamic range */
1084	reg = (dp->video_info->dynamic_range << IN_D_RANGE_SHIFT) |
1085		(dp->video_info->color_depth << IN_BPC_SHIFT) |
1086		(dp->video_info->color_space << IN_COLOR_F_SHIFT);
1087	writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_2);
1088
1089	/* Set Input Color YCbCr Coefficients to ITU601 or ITU709 */
1090	reg = readl(dp->reg_base + EXYNOS_DP_VIDEO_CTL_3);
1091	reg &= ~IN_YC_COEFFI_MASK;
1092	if (dp->video_info->ycbcr_coeff)
1093		reg |= IN_YC_COEFFI_ITU709;
1094	else
1095		reg |= IN_YC_COEFFI_ITU601;
1096	writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_3);
1097}
1098
1099int exynos_dp_is_slave_video_stream_clock_on(struct exynos_dp_device *dp)
1100{
1101	u32 reg;
1102
1103	reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_1);
1104	writel(reg, dp->reg_base + EXYNOS_DP_SYS_CTL_1);
1105
1106	reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_1);
1107
1108	if (!(reg & DET_STA)) {
1109		dev_dbg(dp->dev, "Input stream clock not detected.\n");
1110		return -EINVAL;
1111	}
1112
1113	reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_2);
1114	writel(reg, dp->reg_base + EXYNOS_DP_SYS_CTL_2);
1115
1116	reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_2);
1117	dev_dbg(dp->dev, "wait SYS_CTL_2.\n");
1118
1119	if (reg & CHA_STA) {
1120		dev_dbg(dp->dev, "Input stream clk is changing\n");
1121		return -EINVAL;
1122	}
1123
1124	return 0;
1125}
1126
1127void exynos_dp_set_video_cr_mn(struct exynos_dp_device *dp,
1128		enum clock_recovery_m_value_type type,
1129		u32 m_value,
1130		u32 n_value)
1131{
1132	u32 reg;
1133
1134	if (type == REGISTER_M) {
1135		reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_4);
1136		reg |= FIX_M_VID;
1137		writel(reg, dp->reg_base + EXYNOS_DP_SYS_CTL_4);
1138		reg = m_value & 0xff;
1139		writel(reg, dp->reg_base + EXYNOS_DP_M_VID_0);
1140		reg = (m_value >> 8) & 0xff;
1141		writel(reg, dp->reg_base + EXYNOS_DP_M_VID_1);
1142		reg = (m_value >> 16) & 0xff;
1143		writel(reg, dp->reg_base + EXYNOS_DP_M_VID_2);
1144
1145		reg = n_value & 0xff;
1146		writel(reg, dp->reg_base + EXYNOS_DP_N_VID_0);
1147		reg = (n_value >> 8) & 0xff;
1148		writel(reg, dp->reg_base + EXYNOS_DP_N_VID_1);
1149		reg = (n_value >> 16) & 0xff;
1150		writel(reg, dp->reg_base + EXYNOS_DP_N_VID_2);
1151	} else  {
1152		reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_4);
1153		reg &= ~FIX_M_VID;
1154		writel(reg, dp->reg_base + EXYNOS_DP_SYS_CTL_4);
1155
1156		writel(0x00, dp->reg_base + EXYNOS_DP_N_VID_0);
1157		writel(0x80, dp->reg_base + EXYNOS_DP_N_VID_1);
1158		writel(0x00, dp->reg_base + EXYNOS_DP_N_VID_2);
1159	}
1160}
1161
1162void exynos_dp_set_video_timing_mode(struct exynos_dp_device *dp, u32 type)
1163{
1164	u32 reg;
1165
1166	if (type == VIDEO_TIMING_FROM_CAPTURE) {
1167		reg = readl(dp->reg_base + EXYNOS_DP_VIDEO_CTL_10);
1168		reg &= ~FORMAT_SEL;
1169		writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_10);
1170	} else {
1171		reg = readl(dp->reg_base + EXYNOS_DP_VIDEO_CTL_10);
1172		reg |= FORMAT_SEL;
1173		writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_10);
1174	}
1175}
1176
1177void exynos_dp_enable_video_master(struct exynos_dp_device *dp, bool enable)
1178{
1179	u32 reg;
1180
1181	if (enable) {
1182		reg = readl(dp->reg_base + EXYNOS_DP_SOC_GENERAL_CTL);
1183		reg &= ~VIDEO_MODE_MASK;
1184		reg |= VIDEO_MASTER_MODE_EN | VIDEO_MODE_MASTER_MODE;
1185		writel(reg, dp->reg_base + EXYNOS_DP_SOC_GENERAL_CTL);
1186	} else {
1187		reg = readl(dp->reg_base + EXYNOS_DP_SOC_GENERAL_CTL);
1188		reg &= ~VIDEO_MODE_MASK;
1189		reg |= VIDEO_MODE_SLAVE_MODE;
1190		writel(reg, dp->reg_base + EXYNOS_DP_SOC_GENERAL_CTL);
1191	}
1192}
1193
1194void exynos_dp_start_video(struct exynos_dp_device *dp)
1195{
1196	u32 reg;
1197
1198	reg = readl(dp->reg_base + EXYNOS_DP_VIDEO_CTL_1);
1199	reg |= VIDEO_EN;
1200	writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_1);
1201}
1202
1203int exynos_dp_is_video_stream_on(struct exynos_dp_device *dp)
1204{
1205	u32 reg;
1206
1207	reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_3);
1208	writel(reg, dp->reg_base + EXYNOS_DP_SYS_CTL_3);
1209
1210	reg = readl(dp->reg_base + EXYNOS_DP_SYS_CTL_3);
1211	if (!(reg & STRM_VALID)) {
1212		dev_dbg(dp->dev, "Input video stream is not detected.\n");
1213		return -EINVAL;
1214	}
1215
1216	return 0;
1217}
1218
1219void exynos_dp_config_video_slave_mode(struct exynos_dp_device *dp)
1220{
1221	u32 reg;
1222
1223	reg = readl(dp->reg_base + EXYNOS_DP_FUNC_EN_1);
1224	reg &= ~(MASTER_VID_FUNC_EN_N|SLAVE_VID_FUNC_EN_N);
1225	reg |= MASTER_VID_FUNC_EN_N;
1226	writel(reg, dp->reg_base + EXYNOS_DP_FUNC_EN_1);
1227
1228	reg = readl(dp->reg_base + EXYNOS_DP_VIDEO_CTL_10);
1229	reg &= ~INTERACE_SCAN_CFG;
1230	reg |= (dp->video_info->interlaced << 2);
1231	writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_10);
1232
1233	reg = readl(dp->reg_base + EXYNOS_DP_VIDEO_CTL_10);
1234	reg &= ~VSYNC_POLARITY_CFG;
1235	reg |= (dp->video_info->v_sync_polarity << 1);
1236	writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_10);
1237
1238	reg = readl(dp->reg_base + EXYNOS_DP_VIDEO_CTL_10);
1239	reg &= ~HSYNC_POLARITY_CFG;
1240	reg |= (dp->video_info->h_sync_polarity << 0);
1241	writel(reg, dp->reg_base + EXYNOS_DP_VIDEO_CTL_10);
1242
1243	reg = AUDIO_MODE_SPDIF_MODE | VIDEO_MODE_SLAVE_MODE;
1244	writel(reg, dp->reg_base + EXYNOS_DP_SOC_GENERAL_CTL);
1245}
1246
1247void exynos_dp_enable_scrambling(struct exynos_dp_device *dp)
1248{
1249	u32 reg;
1250
1251	reg = readl(dp->reg_base + EXYNOS_DP_TRAINING_PTN_SET);
1252	reg &= ~SCRAMBLING_DISABLE;
1253	writel(reg, dp->reg_base + EXYNOS_DP_TRAINING_PTN_SET);
1254}
1255
1256void exynos_dp_disable_scrambling(struct exynos_dp_device *dp)
1257{
1258	u32 reg;
1259
1260	reg = readl(dp->reg_base + EXYNOS_DP_TRAINING_PTN_SET);
1261	reg |= SCRAMBLING_DISABLE;
1262	writel(reg, dp->reg_base + EXYNOS_DP_TRAINING_PTN_SET);
1263}