2 * Copyright (C) 2011 Samsung Electronics Co.Ltd
4 * Seung-Woo Kim <sw0312.kim@samsung.com>
5 * Inki Dae <inki.dae@samsung.com>
6 * Joonyoung Shim <jy0922.shim@samsung.com>
8 * Based on drivers/media/video/s5p-tv/hdmi_drv.c
10 * This program is free software; you can redistribute it and/or modify it
11 * under the terms of the GNU General Public License as published by the
12 * Free Software Foundation; either version 2 of the License, or (at your
13 * option) any later version.
18 #include <drm/drm_edid.h>
19 #include <drm/drm_crtc_helper.h>
20 #include <drm/drm_atomic_helper.h>
22 #include "regs-hdmi.h"
24 #include <linux/kernel.h>
25 #include <linux/wait.h>
26 #include <linux/i2c.h>
27 #include <linux/platform_device.h>
28 #include <linux/interrupt.h>
29 #include <linux/irq.h>
30 #include <linux/delay.h>
31 #include <linux/pm_runtime.h>
32 #include <linux/clk.h>
33 #include <linux/gpio/consumer.h>
34 #include <linux/regulator/consumer.h>
36 #include <linux/of_address.h>
37 #include <linux/of_device.h>
38 #include <linux/hdmi.h>
39 #include <linux/component.h>
40 #include <linux/mfd/syscon.h>
41 #include <linux/regmap.h>
43 #include <drm/exynos_drm.h>
45 #include "exynos_drm_drv.h"
46 #include "exynos_drm_crtc.h"
48 #define HOTPLUG_DEBOUNCE_MS 1100
50 /* AVI header and aspect ratio */
51 #define HDMI_AVI_VERSION 0x02
52 #define HDMI_AVI_LENGTH 0x0d
55 #define HDMI_AUI_VERSION 0x01
56 #define HDMI_AUI_LENGTH 0x0a
58 /* AVI active format aspect ratio */
59 #define AVI_SAME_AS_PIC_ASPECT_RATIO 0x08
60 #define AVI_4_3_CENTER_RATIO 0x09
61 #define AVI_16_9_CENTER_RATIO 0x0a
69 #define HDMI_MAPPED_BASE 0xffff0000
71 enum hdmi_mapped_regs {
72 HDMI_PHY_STATUS = HDMI_MAPPED_BASE,
80 static const u32 hdmi_reg_map[][HDMI_TYPE_COUNT] = {
81 { HDMI_V13_PHY_STATUS, HDMI_PHY_STATUS_0 },
82 { HDMI_V13_PHY_RSTOUT, HDMI_V14_PHY_RSTOUT },
83 { HDMI_V13_ACR_CON, HDMI_V14_ACR_CON },
84 { HDMI_V13_ACR_MCTS0, HDMI_V14_ACR_MCTS0 },
85 { HDMI_V13_ACR_CTS0, HDMI_V14_ACR_CTS0 },
86 { HDMI_V13_ACR_N0, HDMI_V14_ACR_N0 },
89 static const char * const supply[] = {
95 struct hdmiphy_config {
100 struct hdmiphy_configs {
102 const struct hdmiphy_config *data;
105 struct string_array_spec {
107 const char * const *data;
110 #define INIT_ARRAY_SPEC(a) { .count = ARRAY_SIZE(a), .data = a }
112 struct hdmi_driver_data {
114 unsigned int is_apb_phy:1;
115 unsigned int has_sysreg:1;
116 struct hdmiphy_configs phy_confs;
117 struct string_array_spec clk_gates;
119 * Array of triplets (p_off, p_on, clock), where p_off and p_on are
120 * required parents of clock when HDMI-PHY is respectively off or on.
122 struct string_array_spec clk_muxes;
125 struct hdmi_context {
126 struct drm_encoder encoder;
128 struct drm_device *drm_dev;
129 struct drm_connector connector;
132 struct delayed_work hotplug_work;
133 struct drm_display_mode current_mode;
135 const struct hdmi_driver_data *drv_data;
138 void __iomem *regs_hdmiphy;
139 struct i2c_client *hdmiphy_port;
140 struct i2c_adapter *ddc_adpt;
141 struct gpio_desc *hpd_gpio;
143 struct regmap *pmureg;
144 struct regmap *sysreg;
145 struct clk **clk_gates;
146 struct clk **clk_muxes;
147 struct regulator_bulk_data regul_bulk[ARRAY_SIZE(supply)];
148 struct regulator *reg_hdmi_en;
151 static inline struct hdmi_context *encoder_to_hdmi(struct drm_encoder *e)
153 return container_of(e, struct hdmi_context, encoder);
156 static inline struct hdmi_context *connector_to_hdmi(struct drm_connector *c)
158 return container_of(c, struct hdmi_context, connector);
161 static const struct hdmiphy_config hdmiphy_v13_configs[] = {
163 .pixel_clock = 27000000,
165 0x01, 0x05, 0x00, 0xD8, 0x10, 0x1C, 0x30, 0x40,
166 0x6B, 0x10, 0x02, 0x51, 0xDF, 0xF2, 0x54, 0x87,
167 0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
168 0x22, 0x40, 0xE3, 0x26, 0x00, 0x00, 0x00, 0x80,
172 .pixel_clock = 27027000,
174 0x01, 0x05, 0x00, 0xD4, 0x10, 0x9C, 0x09, 0x64,
175 0x6B, 0x10, 0x02, 0x51, 0xDF, 0xF2, 0x54, 0x87,
176 0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
177 0x22, 0x40, 0xE3, 0x26, 0x00, 0x00, 0x00, 0x80,
181 .pixel_clock = 74176000,
183 0x01, 0x05, 0x00, 0xD8, 0x10, 0x9C, 0xef, 0x5B,
184 0x6D, 0x10, 0x01, 0x51, 0xef, 0xF3, 0x54, 0xb9,
185 0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
186 0x22, 0x40, 0xa5, 0x26, 0x01, 0x00, 0x00, 0x80,
190 .pixel_clock = 74250000,
192 0x01, 0x05, 0x00, 0xd8, 0x10, 0x9c, 0xf8, 0x40,
193 0x6a, 0x10, 0x01, 0x51, 0xff, 0xf1, 0x54, 0xba,
194 0x84, 0x00, 0x10, 0x38, 0x00, 0x08, 0x10, 0xe0,
195 0x22, 0x40, 0xa4, 0x26, 0x01, 0x00, 0x00, 0x80,
199 .pixel_clock = 148500000,
201 0x01, 0x05, 0x00, 0xD8, 0x10, 0x9C, 0xf8, 0x40,
202 0x6A, 0x18, 0x00, 0x51, 0xff, 0xF1, 0x54, 0xba,
203 0x84, 0x00, 0x10, 0x38, 0x00, 0x08, 0x10, 0xE0,
204 0x22, 0x40, 0xa4, 0x26, 0x02, 0x00, 0x00, 0x80,
209 static const struct hdmiphy_config hdmiphy_v14_configs[] = {
211 .pixel_clock = 25200000,
213 0x01, 0x51, 0x2A, 0x75, 0x40, 0x01, 0x00, 0x08,
214 0x82, 0x80, 0xfc, 0xd8, 0x45, 0xa0, 0xac, 0x80,
215 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
216 0x54, 0xf4, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
220 .pixel_clock = 27000000,
222 0x01, 0xd1, 0x22, 0x51, 0x40, 0x08, 0xfc, 0x20,
223 0x98, 0xa0, 0xcb, 0xd8, 0x45, 0xa0, 0xac, 0x80,
224 0x06, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
225 0x54, 0xe4, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
229 .pixel_clock = 27027000,
231 0x01, 0xd1, 0x2d, 0x72, 0x40, 0x64, 0x12, 0x08,
232 0x43, 0xa0, 0x0e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
233 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
234 0x54, 0xe3, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
238 .pixel_clock = 36000000,
240 0x01, 0x51, 0x2d, 0x55, 0x40, 0x01, 0x00, 0x08,
241 0x82, 0x80, 0x0e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
242 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
243 0x54, 0xab, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
247 .pixel_clock = 40000000,
249 0x01, 0x51, 0x32, 0x55, 0x40, 0x01, 0x00, 0x08,
250 0x82, 0x80, 0x2c, 0xd9, 0x45, 0xa0, 0xac, 0x80,
251 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
252 0x54, 0x9a, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
256 .pixel_clock = 65000000,
258 0x01, 0xd1, 0x36, 0x34, 0x40, 0x1e, 0x0a, 0x08,
259 0x82, 0xa0, 0x45, 0xd9, 0x45, 0xa0, 0xac, 0x80,
260 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
261 0x54, 0xbd, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
265 .pixel_clock = 71000000,
267 0x01, 0xd1, 0x3b, 0x35, 0x40, 0x0c, 0x04, 0x08,
268 0x85, 0xa0, 0x63, 0xd9, 0x45, 0xa0, 0xac, 0x80,
269 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
270 0x54, 0xad, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
274 .pixel_clock = 73250000,
276 0x01, 0xd1, 0x3d, 0x35, 0x40, 0x18, 0x02, 0x08,
277 0x83, 0xa0, 0x6e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
278 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
279 0x54, 0xa8, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
283 .pixel_clock = 74176000,
285 0x01, 0xd1, 0x3e, 0x35, 0x40, 0x5b, 0xde, 0x08,
286 0x82, 0xa0, 0x73, 0xd9, 0x45, 0xa0, 0xac, 0x80,
287 0x56, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
288 0x54, 0xa6, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
292 .pixel_clock = 74250000,
294 0x01, 0xd1, 0x1f, 0x10, 0x40, 0x40, 0xf8, 0x08,
295 0x81, 0xa0, 0xba, 0xd8, 0x45, 0xa0, 0xac, 0x80,
296 0x3c, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
297 0x54, 0xa5, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
301 .pixel_clock = 83500000,
303 0x01, 0xd1, 0x23, 0x11, 0x40, 0x0c, 0xfb, 0x08,
304 0x85, 0xa0, 0xd1, 0xd8, 0x45, 0xa0, 0xac, 0x80,
305 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
306 0x54, 0x93, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
310 .pixel_clock = 106500000,
312 0x01, 0xd1, 0x2c, 0x12, 0x40, 0x0c, 0x09, 0x08,
313 0x84, 0xa0, 0x0a, 0xd9, 0x45, 0xa0, 0xac, 0x80,
314 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
315 0x54, 0x73, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
319 .pixel_clock = 108000000,
321 0x01, 0x51, 0x2d, 0x15, 0x40, 0x01, 0x00, 0x08,
322 0x82, 0x80, 0x0e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
323 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
324 0x54, 0xc7, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80,
328 .pixel_clock = 115500000,
330 0x01, 0xd1, 0x30, 0x12, 0x40, 0x40, 0x10, 0x08,
331 0x80, 0x80, 0x21, 0xd9, 0x45, 0xa0, 0xac, 0x80,
332 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
333 0x54, 0xaa, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80,
337 .pixel_clock = 119000000,
339 0x01, 0xd1, 0x32, 0x1a, 0x40, 0x30, 0xd8, 0x08,
340 0x04, 0xa0, 0x2a, 0xd9, 0x45, 0xa0, 0xac, 0x80,
341 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
342 0x54, 0x9d, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80,
346 .pixel_clock = 146250000,
348 0x01, 0xd1, 0x3d, 0x15, 0x40, 0x18, 0xfd, 0x08,
349 0x83, 0xa0, 0x6e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
350 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
351 0x54, 0x50, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80,
355 .pixel_clock = 148500000,
357 0x01, 0xd1, 0x1f, 0x00, 0x40, 0x40, 0xf8, 0x08,
358 0x81, 0xa0, 0xba, 0xd8, 0x45, 0xa0, 0xac, 0x80,
359 0x3c, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
360 0x54, 0x4b, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80,
365 static const struct hdmiphy_config hdmiphy_5420_configs[] = {
367 .pixel_clock = 25200000,
369 0x01, 0x52, 0x3F, 0x55, 0x40, 0x01, 0x00, 0xC8,
370 0x82, 0xC8, 0xBD, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
371 0x06, 0x80, 0x01, 0x84, 0x05, 0x02, 0x24, 0x66,
372 0x54, 0xF4, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
376 .pixel_clock = 27000000,
378 0x01, 0xD1, 0x22, 0x51, 0x40, 0x08, 0xFC, 0xE0,
379 0x98, 0xE8, 0xCB, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
380 0x06, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
381 0x54, 0xE4, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
385 .pixel_clock = 27027000,
387 0x01, 0xD1, 0x2D, 0x72, 0x40, 0x64, 0x12, 0xC8,
388 0x43, 0xE8, 0x0E, 0xD9, 0x45, 0xA0, 0xAC, 0x80,
389 0x26, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
390 0x54, 0xE3, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
394 .pixel_clock = 36000000,
396 0x01, 0x51, 0x2D, 0x55, 0x40, 0x40, 0x00, 0xC8,
397 0x02, 0xC8, 0x0E, 0xD9, 0x45, 0xA0, 0xAC, 0x80,
398 0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
399 0x54, 0xAB, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
403 .pixel_clock = 40000000,
405 0x01, 0xD1, 0x21, 0x31, 0x40, 0x3C, 0x28, 0xC8,
406 0x87, 0xE8, 0xC8, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
407 0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
408 0x54, 0x9A, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
412 .pixel_clock = 65000000,
414 0x01, 0xD1, 0x36, 0x34, 0x40, 0x0C, 0x04, 0xC8,
415 0x82, 0xE8, 0x45, 0xD9, 0x45, 0xA0, 0xAC, 0x80,
416 0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
417 0x54, 0xBD, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
421 .pixel_clock = 71000000,
423 0x01, 0xD1, 0x3B, 0x35, 0x40, 0x0C, 0x04, 0xC8,
424 0x85, 0xE8, 0x63, 0xD9, 0x45, 0xA0, 0xAC, 0x80,
425 0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
426 0x54, 0x57, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
430 .pixel_clock = 73250000,
432 0x01, 0xD1, 0x1F, 0x10, 0x40, 0x78, 0x8D, 0xC8,
433 0x81, 0xE8, 0xB7, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
434 0x56, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
435 0x54, 0xA8, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
439 .pixel_clock = 74176000,
441 0x01, 0xD1, 0x1F, 0x10, 0x40, 0x5B, 0xEF, 0xC8,
442 0x81, 0xE8, 0xB9, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
443 0x56, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
444 0x54, 0xA6, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
448 .pixel_clock = 74250000,
450 0x01, 0xD1, 0x1F, 0x10, 0x40, 0x40, 0xF8, 0x08,
451 0x81, 0xE8, 0xBA, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
452 0x26, 0x80, 0x09, 0x84, 0x05, 0x22, 0x24, 0x66,
453 0x54, 0xA5, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
457 .pixel_clock = 83500000,
459 0x01, 0xD1, 0x23, 0x11, 0x40, 0x0C, 0xFB, 0xC8,
460 0x85, 0xE8, 0xD1, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
461 0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
462 0x54, 0x4A, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
466 .pixel_clock = 88750000,
468 0x01, 0xD1, 0x25, 0x11, 0x40, 0x18, 0xFF, 0xC8,
469 0x83, 0xE8, 0xDE, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
470 0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
471 0x54, 0x45, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
475 .pixel_clock = 106500000,
477 0x01, 0xD1, 0x2C, 0x12, 0x40, 0x0C, 0x09, 0xC8,
478 0x84, 0xE8, 0x0A, 0xD9, 0x45, 0xA0, 0xAC, 0x80,
479 0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
480 0x54, 0x73, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
484 .pixel_clock = 108000000,
486 0x01, 0x51, 0x2D, 0x15, 0x40, 0x01, 0x00, 0xC8,
487 0x82, 0xC8, 0x0E, 0xD9, 0x45, 0xA0, 0xAC, 0x80,
488 0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
489 0x54, 0xC7, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80,
493 .pixel_clock = 115500000,
495 0x01, 0xD1, 0x30, 0x14, 0x40, 0x0C, 0x03, 0xC8,
496 0x88, 0xE8, 0x21, 0xD9, 0x45, 0xA0, 0xAC, 0x80,
497 0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
498 0x54, 0x6A, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
502 .pixel_clock = 146250000,
504 0x01, 0xD1, 0x3D, 0x15, 0x40, 0x18, 0xFD, 0xC8,
505 0x83, 0xE8, 0x6E, 0xD9, 0x45, 0xA0, 0xAC, 0x80,
506 0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66,
507 0x54, 0x54, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
511 .pixel_clock = 148500000,
513 0x01, 0xD1, 0x1F, 0x00, 0x40, 0x40, 0xF8, 0x08,
514 0x81, 0xE8, 0xBA, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
515 0x26, 0x80, 0x09, 0x84, 0x05, 0x22, 0x24, 0x66,
516 0x54, 0x4B, 0x25, 0x03, 0x00, 0x80, 0x01, 0x80,
521 static const struct hdmiphy_config hdmiphy_5433_configs[] = {
523 .pixel_clock = 27000000,
525 0x01, 0x51, 0x22, 0x51, 0x08, 0xfc, 0x88, 0x46,
526 0x72, 0x50, 0x24, 0x0c, 0x24, 0x0f, 0x7c, 0xa5,
527 0xd4, 0x2b, 0x87, 0x00, 0x00, 0x04, 0x00, 0x30,
528 0x08, 0x10, 0x01, 0x01, 0x48, 0x40, 0x00, 0x40,
532 .pixel_clock = 27027000,
534 0x01, 0x51, 0x2d, 0x72, 0x64, 0x09, 0x88, 0xc3,
535 0x71, 0x50, 0x24, 0x14, 0x24, 0x0f, 0x7c, 0xa5,
536 0xd4, 0x2b, 0x87, 0x00, 0x00, 0x04, 0x00, 0x30,
537 0x28, 0x10, 0x01, 0x01, 0x48, 0x40, 0x00, 0x40,
541 .pixel_clock = 40000000,
543 0x01, 0x51, 0x32, 0x55, 0x01, 0x00, 0x88, 0x02,
544 0x4d, 0x50, 0x44, 0x8C, 0x27, 0x00, 0x7C, 0xAC,
545 0xD6, 0x2B, 0x67, 0x00, 0x00, 0x04, 0x00, 0x30,
546 0x08, 0x10, 0x01, 0x01, 0x48, 0x40, 0x00, 0x40,
550 .pixel_clock = 50000000,
552 0x01, 0x51, 0x34, 0x40, 0x64, 0x09, 0x88, 0xc3,
553 0x3d, 0x50, 0x44, 0x8C, 0x27, 0x00, 0x7C, 0xAC,
554 0xD6, 0x2B, 0x67, 0x00, 0x00, 0x04, 0x00, 0x30,
555 0x08, 0x10, 0x01, 0x01, 0x48, 0x40, 0x00, 0x40,
559 .pixel_clock = 65000000,
561 0x01, 0x51, 0x36, 0x31, 0x40, 0x10, 0x04, 0xc6,
562 0x2e, 0xe8, 0x44, 0x8C, 0x27, 0x00, 0x7C, 0xAC,
563 0xD6, 0x2B, 0x67, 0x00, 0x00, 0x04, 0x00, 0x30,
564 0x08, 0x10, 0x01, 0x01, 0x48, 0x40, 0x00, 0x40,
568 .pixel_clock = 74176000,
570 0x01, 0x51, 0x3E, 0x35, 0x5B, 0xDE, 0x88, 0x42,
571 0x53, 0x51, 0x44, 0x8C, 0x27, 0x00, 0x7C, 0xAC,
572 0xD6, 0x2B, 0x67, 0x00, 0x00, 0x04, 0x00, 0x30,
573 0x08, 0x10, 0x01, 0x01, 0x48, 0x40, 0x00, 0x40,
577 .pixel_clock = 74250000,
579 0x01, 0x51, 0x3E, 0x35, 0x40, 0xF0, 0x88, 0xC2,
580 0x52, 0x51, 0x44, 0x8C, 0x27, 0x00, 0x7C, 0xAC,
581 0xD6, 0x2B, 0x67, 0x00, 0x00, 0x04, 0x00, 0x30,
582 0x08, 0x10, 0x01, 0x01, 0x48, 0x40, 0x00, 0x40,
586 .pixel_clock = 108000000,
588 0x01, 0x51, 0x2d, 0x15, 0x01, 0x00, 0x88, 0x02,
589 0x72, 0x52, 0x44, 0x8C, 0x27, 0x00, 0x7C, 0xAC,
590 0xD6, 0x2B, 0x67, 0x00, 0x00, 0x04, 0x00, 0x30,
591 0x08, 0x10, 0x01, 0x01, 0x48, 0x40, 0x00, 0x40,
595 .pixel_clock = 148500000,
597 0x01, 0x51, 0x1f, 0x00, 0x40, 0xf8, 0x88, 0xc1,
598 0x52, 0x52, 0x24, 0x0c, 0x24, 0x0f, 0x7c, 0xa5,
599 0xd4, 0x2b, 0x87, 0x00, 0x00, 0x04, 0x00, 0x30,
600 0x08, 0x10, 0x01, 0x01, 0x48, 0x4a, 0x00, 0x40,
605 static const char * const hdmi_clk_gates4[] = {
609 static const char * const hdmi_clk_muxes4[] = {
610 "sclk_pixel", "sclk_hdmiphy", "mout_hdmi"
613 static const char * const hdmi_clk_gates5433[] = {
614 "hdmi_pclk", "hdmi_i_pclk", "i_tmds_clk", "i_pixel_clk", "i_spdif_clk"
617 static const char * const hdmi_clk_muxes5433[] = {
618 "oscclk", "tmds_clko", "tmds_clko_user",
619 "oscclk", "pixel_clko", "pixel_clko_user"
622 static const struct hdmi_driver_data exynos4210_hdmi_driver_data = {
624 .phy_confs = INIT_ARRAY_SPEC(hdmiphy_v13_configs),
625 .clk_gates = INIT_ARRAY_SPEC(hdmi_clk_gates4),
626 .clk_muxes = INIT_ARRAY_SPEC(hdmi_clk_muxes4),
629 static const struct hdmi_driver_data exynos4212_hdmi_driver_data = {
631 .phy_confs = INIT_ARRAY_SPEC(hdmiphy_v14_configs),
632 .clk_gates = INIT_ARRAY_SPEC(hdmi_clk_gates4),
633 .clk_muxes = INIT_ARRAY_SPEC(hdmi_clk_muxes4),
636 static const struct hdmi_driver_data exynos5420_hdmi_driver_data = {
639 .phy_confs = INIT_ARRAY_SPEC(hdmiphy_5420_configs),
640 .clk_gates = INIT_ARRAY_SPEC(hdmi_clk_gates4),
641 .clk_muxes = INIT_ARRAY_SPEC(hdmi_clk_muxes4),
644 static const struct hdmi_driver_data exynos5433_hdmi_driver_data = {
648 .phy_confs = INIT_ARRAY_SPEC(hdmiphy_5433_configs),
649 .clk_gates = INIT_ARRAY_SPEC(hdmi_clk_gates5433),
650 .clk_muxes = INIT_ARRAY_SPEC(hdmi_clk_muxes5433),
653 static inline u32 hdmi_map_reg(struct hdmi_context *hdata, u32 reg_id)
655 if ((reg_id & 0xffff0000) == HDMI_MAPPED_BASE)
656 return hdmi_reg_map[reg_id & 0xffff][hdata->drv_data->type];
660 static inline u32 hdmi_reg_read(struct hdmi_context *hdata, u32 reg_id)
662 return readl(hdata->regs + hdmi_map_reg(hdata, reg_id));
665 static inline void hdmi_reg_writeb(struct hdmi_context *hdata,
666 u32 reg_id, u8 value)
668 writel(value, hdata->regs + hdmi_map_reg(hdata, reg_id));
671 static inline void hdmi_reg_writev(struct hdmi_context *hdata, u32 reg_id,
674 reg_id = hdmi_map_reg(hdata, reg_id);
676 while (--bytes >= 0) {
677 writel(val & 0xff, hdata->regs + reg_id);
683 static inline void hdmi_reg_writemask(struct hdmi_context *hdata,
684 u32 reg_id, u32 value, u32 mask)
688 reg_id = hdmi_map_reg(hdata, reg_id);
689 old = readl(hdata->regs + reg_id);
690 value = (value & mask) | (old & ~mask);
691 writel(value, hdata->regs + reg_id);
694 static int hdmiphy_reg_write_buf(struct hdmi_context *hdata,
695 u32 reg_offset, const u8 *buf, u32 len)
697 if ((reg_offset + len) > 32)
700 if (hdata->hdmiphy_port) {
703 ret = i2c_master_send(hdata->hdmiphy_port, buf, len);
709 for (i = 0; i < len; i++)
710 writel(buf[i], hdata->regs_hdmiphy +
711 ((reg_offset + i)<<2));
716 static void hdmi_v13_regs_dump(struct hdmi_context *hdata, char *prefix)
718 #define DUMPREG(reg_id) \
719 DRM_DEBUG_KMS("%s:" #reg_id " = %08x\n", prefix, \
720 readl(hdata->regs + reg_id))
721 DRM_DEBUG_KMS("%s: ---- CONTROL REGISTERS ----\n", prefix);
722 DUMPREG(HDMI_INTC_FLAG);
723 DUMPREG(HDMI_INTC_CON);
724 DUMPREG(HDMI_HPD_STATUS);
725 DUMPREG(HDMI_V13_PHY_RSTOUT);
726 DUMPREG(HDMI_V13_PHY_VPLL);
727 DUMPREG(HDMI_V13_PHY_CMU);
728 DUMPREG(HDMI_V13_CORE_RSTOUT);
730 DRM_DEBUG_KMS("%s: ---- CORE REGISTERS ----\n", prefix);
734 DUMPREG(HDMI_SYS_STATUS);
735 DUMPREG(HDMI_V13_PHY_STATUS);
736 DUMPREG(HDMI_STATUS_EN);
738 DUMPREG(HDMI_MODE_SEL);
739 DUMPREG(HDMI_V13_HPD_GEN);
740 DUMPREG(HDMI_V13_DC_CONTROL);
741 DUMPREG(HDMI_V13_VIDEO_PATTERN_GEN);
743 DRM_DEBUG_KMS("%s: ---- CORE SYNC REGISTERS ----\n", prefix);
744 DUMPREG(HDMI_H_BLANK_0);
745 DUMPREG(HDMI_H_BLANK_1);
746 DUMPREG(HDMI_V13_V_BLANK_0);
747 DUMPREG(HDMI_V13_V_BLANK_1);
748 DUMPREG(HDMI_V13_V_BLANK_2);
749 DUMPREG(HDMI_V13_H_V_LINE_0);
750 DUMPREG(HDMI_V13_H_V_LINE_1);
751 DUMPREG(HDMI_V13_H_V_LINE_2);
752 DUMPREG(HDMI_VSYNC_POL);
753 DUMPREG(HDMI_INT_PRO_MODE);
754 DUMPREG(HDMI_V13_V_BLANK_F_0);
755 DUMPREG(HDMI_V13_V_BLANK_F_1);
756 DUMPREG(HDMI_V13_V_BLANK_F_2);
757 DUMPREG(HDMI_V13_H_SYNC_GEN_0);
758 DUMPREG(HDMI_V13_H_SYNC_GEN_1);
759 DUMPREG(HDMI_V13_H_SYNC_GEN_2);
760 DUMPREG(HDMI_V13_V_SYNC_GEN_1_0);
761 DUMPREG(HDMI_V13_V_SYNC_GEN_1_1);
762 DUMPREG(HDMI_V13_V_SYNC_GEN_1_2);
763 DUMPREG(HDMI_V13_V_SYNC_GEN_2_0);
764 DUMPREG(HDMI_V13_V_SYNC_GEN_2_1);
765 DUMPREG(HDMI_V13_V_SYNC_GEN_2_2);
766 DUMPREG(HDMI_V13_V_SYNC_GEN_3_0);
767 DUMPREG(HDMI_V13_V_SYNC_GEN_3_1);
768 DUMPREG(HDMI_V13_V_SYNC_GEN_3_2);
770 DRM_DEBUG_KMS("%s: ---- TG REGISTERS ----\n", prefix);
771 DUMPREG(HDMI_TG_CMD);
772 DUMPREG(HDMI_TG_H_FSZ_L);
773 DUMPREG(HDMI_TG_H_FSZ_H);
774 DUMPREG(HDMI_TG_HACT_ST_L);
775 DUMPREG(HDMI_TG_HACT_ST_H);
776 DUMPREG(HDMI_TG_HACT_SZ_L);
777 DUMPREG(HDMI_TG_HACT_SZ_H);
778 DUMPREG(HDMI_TG_V_FSZ_L);
779 DUMPREG(HDMI_TG_V_FSZ_H);
780 DUMPREG(HDMI_TG_VSYNC_L);
781 DUMPREG(HDMI_TG_VSYNC_H);
782 DUMPREG(HDMI_TG_VSYNC2_L);
783 DUMPREG(HDMI_TG_VSYNC2_H);
784 DUMPREG(HDMI_TG_VACT_ST_L);
785 DUMPREG(HDMI_TG_VACT_ST_H);
786 DUMPREG(HDMI_TG_VACT_SZ_L);
787 DUMPREG(HDMI_TG_VACT_SZ_H);
788 DUMPREG(HDMI_TG_FIELD_CHG_L);
789 DUMPREG(HDMI_TG_FIELD_CHG_H);
790 DUMPREG(HDMI_TG_VACT_ST2_L);
791 DUMPREG(HDMI_TG_VACT_ST2_H);
792 DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_L);
793 DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_H);
794 DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_L);
795 DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_H);
796 DUMPREG(HDMI_TG_FIELD_TOP_HDMI_L);
797 DUMPREG(HDMI_TG_FIELD_TOP_HDMI_H);
798 DUMPREG(HDMI_TG_FIELD_BOT_HDMI_L);
799 DUMPREG(HDMI_TG_FIELD_BOT_HDMI_H);
803 static void hdmi_v14_regs_dump(struct hdmi_context *hdata, char *prefix)
807 #define DUMPREG(reg_id) \
808 DRM_DEBUG_KMS("%s:" #reg_id " = %08x\n", prefix, \
809 readl(hdata->regs + reg_id))
811 DRM_DEBUG_KMS("%s: ---- CONTROL REGISTERS ----\n", prefix);
812 DUMPREG(HDMI_INTC_CON);
813 DUMPREG(HDMI_INTC_FLAG);
814 DUMPREG(HDMI_HPD_STATUS);
815 DUMPREG(HDMI_INTC_CON_1);
816 DUMPREG(HDMI_INTC_FLAG_1);
817 DUMPREG(HDMI_PHY_STATUS_0);
818 DUMPREG(HDMI_PHY_STATUS_PLL);
819 DUMPREG(HDMI_PHY_CON_0);
820 DUMPREG(HDMI_V14_PHY_RSTOUT);
821 DUMPREG(HDMI_PHY_VPLL);
822 DUMPREG(HDMI_PHY_CMU);
823 DUMPREG(HDMI_CORE_RSTOUT);
825 DRM_DEBUG_KMS("%s: ---- CORE REGISTERS ----\n", prefix);
829 DUMPREG(HDMI_SYS_STATUS);
830 DUMPREG(HDMI_PHY_STATUS_0);
831 DUMPREG(HDMI_STATUS_EN);
833 DUMPREG(HDMI_MODE_SEL);
834 DUMPREG(HDMI_ENC_EN);
835 DUMPREG(HDMI_DC_CONTROL);
836 DUMPREG(HDMI_VIDEO_PATTERN_GEN);
838 DRM_DEBUG_KMS("%s: ---- CORE SYNC REGISTERS ----\n", prefix);
839 DUMPREG(HDMI_H_BLANK_0);
840 DUMPREG(HDMI_H_BLANK_1);
841 DUMPREG(HDMI_V2_BLANK_0);
842 DUMPREG(HDMI_V2_BLANK_1);
843 DUMPREG(HDMI_V1_BLANK_0);
844 DUMPREG(HDMI_V1_BLANK_1);
845 DUMPREG(HDMI_V_LINE_0);
846 DUMPREG(HDMI_V_LINE_1);
847 DUMPREG(HDMI_H_LINE_0);
848 DUMPREG(HDMI_H_LINE_1);
849 DUMPREG(HDMI_HSYNC_POL);
851 DUMPREG(HDMI_VSYNC_POL);
852 DUMPREG(HDMI_INT_PRO_MODE);
853 DUMPREG(HDMI_V_BLANK_F0_0);
854 DUMPREG(HDMI_V_BLANK_F0_1);
855 DUMPREG(HDMI_V_BLANK_F1_0);
856 DUMPREG(HDMI_V_BLANK_F1_1);
858 DUMPREG(HDMI_H_SYNC_START_0);
859 DUMPREG(HDMI_H_SYNC_START_1);
860 DUMPREG(HDMI_H_SYNC_END_0);
861 DUMPREG(HDMI_H_SYNC_END_1);
863 DUMPREG(HDMI_V_SYNC_LINE_BEF_2_0);
864 DUMPREG(HDMI_V_SYNC_LINE_BEF_2_1);
865 DUMPREG(HDMI_V_SYNC_LINE_BEF_1_0);
866 DUMPREG(HDMI_V_SYNC_LINE_BEF_1_1);
868 DUMPREG(HDMI_V_SYNC_LINE_AFT_2_0);
869 DUMPREG(HDMI_V_SYNC_LINE_AFT_2_1);
870 DUMPREG(HDMI_V_SYNC_LINE_AFT_1_0);
871 DUMPREG(HDMI_V_SYNC_LINE_AFT_1_1);
873 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_2_0);
874 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_2_1);
875 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_1_0);
876 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_1_1);
878 DUMPREG(HDMI_V_BLANK_F2_0);
879 DUMPREG(HDMI_V_BLANK_F2_1);
880 DUMPREG(HDMI_V_BLANK_F3_0);
881 DUMPREG(HDMI_V_BLANK_F3_1);
882 DUMPREG(HDMI_V_BLANK_F4_0);
883 DUMPREG(HDMI_V_BLANK_F4_1);
884 DUMPREG(HDMI_V_BLANK_F5_0);
885 DUMPREG(HDMI_V_BLANK_F5_1);
887 DUMPREG(HDMI_V_SYNC_LINE_AFT_3_0);
888 DUMPREG(HDMI_V_SYNC_LINE_AFT_3_1);
889 DUMPREG(HDMI_V_SYNC_LINE_AFT_4_0);
890 DUMPREG(HDMI_V_SYNC_LINE_AFT_4_1);
891 DUMPREG(HDMI_V_SYNC_LINE_AFT_5_0);
892 DUMPREG(HDMI_V_SYNC_LINE_AFT_5_1);
893 DUMPREG(HDMI_V_SYNC_LINE_AFT_6_0);
894 DUMPREG(HDMI_V_SYNC_LINE_AFT_6_1);
896 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_3_0);
897 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_3_1);
898 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_4_0);
899 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_4_1);
900 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_5_0);
901 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_5_1);
902 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_6_0);
903 DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_6_1);
905 DUMPREG(HDMI_VACT_SPACE_1_0);
906 DUMPREG(HDMI_VACT_SPACE_1_1);
907 DUMPREG(HDMI_VACT_SPACE_2_0);
908 DUMPREG(HDMI_VACT_SPACE_2_1);
909 DUMPREG(HDMI_VACT_SPACE_3_0);
910 DUMPREG(HDMI_VACT_SPACE_3_1);
911 DUMPREG(HDMI_VACT_SPACE_4_0);
912 DUMPREG(HDMI_VACT_SPACE_4_1);
913 DUMPREG(HDMI_VACT_SPACE_5_0);
914 DUMPREG(HDMI_VACT_SPACE_5_1);
915 DUMPREG(HDMI_VACT_SPACE_6_0);
916 DUMPREG(HDMI_VACT_SPACE_6_1);
918 DRM_DEBUG_KMS("%s: ---- TG REGISTERS ----\n", prefix);
919 DUMPREG(HDMI_TG_CMD);
920 DUMPREG(HDMI_TG_H_FSZ_L);
921 DUMPREG(HDMI_TG_H_FSZ_H);
922 DUMPREG(HDMI_TG_HACT_ST_L);
923 DUMPREG(HDMI_TG_HACT_ST_H);
924 DUMPREG(HDMI_TG_HACT_SZ_L);
925 DUMPREG(HDMI_TG_HACT_SZ_H);
926 DUMPREG(HDMI_TG_V_FSZ_L);
927 DUMPREG(HDMI_TG_V_FSZ_H);
928 DUMPREG(HDMI_TG_VSYNC_L);
929 DUMPREG(HDMI_TG_VSYNC_H);
930 DUMPREG(HDMI_TG_VSYNC2_L);
931 DUMPREG(HDMI_TG_VSYNC2_H);
932 DUMPREG(HDMI_TG_VACT_ST_L);
933 DUMPREG(HDMI_TG_VACT_ST_H);
934 DUMPREG(HDMI_TG_VACT_SZ_L);
935 DUMPREG(HDMI_TG_VACT_SZ_H);
936 DUMPREG(HDMI_TG_FIELD_CHG_L);
937 DUMPREG(HDMI_TG_FIELD_CHG_H);
938 DUMPREG(HDMI_TG_VACT_ST2_L);
939 DUMPREG(HDMI_TG_VACT_ST2_H);
940 DUMPREG(HDMI_TG_VACT_ST3_L);
941 DUMPREG(HDMI_TG_VACT_ST3_H);
942 DUMPREG(HDMI_TG_VACT_ST4_L);
943 DUMPREG(HDMI_TG_VACT_ST4_H);
944 DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_L);
945 DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_H);
946 DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_L);
947 DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_H);
948 DUMPREG(HDMI_TG_FIELD_TOP_HDMI_L);
949 DUMPREG(HDMI_TG_FIELD_TOP_HDMI_H);
950 DUMPREG(HDMI_TG_FIELD_BOT_HDMI_L);
951 DUMPREG(HDMI_TG_FIELD_BOT_HDMI_H);
954 DRM_DEBUG_KMS("%s: ---- PACKET REGISTERS ----\n", prefix);
955 DUMPREG(HDMI_AVI_CON);
956 DUMPREG(HDMI_AVI_HEADER0);
957 DUMPREG(HDMI_AVI_HEADER1);
958 DUMPREG(HDMI_AVI_HEADER2);
959 DUMPREG(HDMI_AVI_CHECK_SUM);
960 DUMPREG(HDMI_VSI_CON);
961 DUMPREG(HDMI_VSI_HEADER0);
962 DUMPREG(HDMI_VSI_HEADER1);
963 DUMPREG(HDMI_VSI_HEADER2);
964 for (i = 0; i < 7; ++i)
965 DUMPREG(HDMI_VSI_DATA(i));
970 static void hdmi_regs_dump(struct hdmi_context *hdata, char *prefix)
972 if (hdata->drv_data->type == HDMI_TYPE13)
973 hdmi_v13_regs_dump(hdata, prefix);
975 hdmi_v14_regs_dump(hdata, prefix);
978 static int hdmi_clk_enable_gates(struct hdmi_context *hdata)
982 for (i = 0; i < hdata->drv_data->clk_gates.count; ++i) {
983 ret = clk_prepare_enable(hdata->clk_gates[i]);
987 dev_err(hdata->dev, "Cannot enable clock '%s', %d\n",
988 hdata->drv_data->clk_gates.data[i], ret);
990 clk_disable_unprepare(hdata->clk_gates[i]);
997 static void hdmi_clk_disable_gates(struct hdmi_context *hdata)
999 int i = hdata->drv_data->clk_gates.count;
1002 clk_disable_unprepare(hdata->clk_gates[i]);
1005 static int hdmi_clk_set_parents(struct hdmi_context *hdata, bool to_phy)
1007 struct device *dev = hdata->dev;
1011 for (i = 0; i < hdata->drv_data->clk_muxes.count; i += 3) {
1012 struct clk **c = &hdata->clk_muxes[i];
1014 ret = clk_set_parent(c[2], c[to_phy]);
1018 dev_err(dev, "Cannot set clock parent of '%s' to '%s', %d\n",
1019 hdata->drv_data->clk_muxes.data[i + 2],
1020 hdata->drv_data->clk_muxes.data[i + to_phy], ret);
1026 static u8 hdmi_chksum(struct hdmi_context *hdata,
1027 u32 start, u8 len, u32 hdr_sum)
1031 /* hdr_sum : header0 + header1 + header2
1032 * start : start address of packet byte1
1033 * len : packet bytes - 1 */
1034 for (i = 0; i < len; ++i)
1035 hdr_sum += 0xff & hdmi_reg_read(hdata, start + i * 4);
1037 /* return 2's complement of 8 bit hdr_sum */
1038 return (u8)(~(hdr_sum & 0xff) + 1);
1041 static void hdmi_reg_infoframe(struct hdmi_context *hdata,
1042 union hdmi_infoframe *infoframe)
1048 if (hdata->dvi_mode) {
1049 hdmi_reg_writeb(hdata, HDMI_VSI_CON,
1050 HDMI_VSI_CON_DO_NOT_TRANSMIT);
1051 hdmi_reg_writeb(hdata, HDMI_AVI_CON,
1052 HDMI_AVI_CON_DO_NOT_TRANSMIT);
1053 hdmi_reg_writeb(hdata, HDMI_AUI_CON, HDMI_AUI_CON_NO_TRAN);
1057 switch (infoframe->any.type) {
1058 case HDMI_INFOFRAME_TYPE_AVI:
1059 hdmi_reg_writeb(hdata, HDMI_AVI_CON, HDMI_AVI_CON_EVERY_VSYNC);
1060 hdmi_reg_writeb(hdata, HDMI_AVI_HEADER0, infoframe->any.type);
1061 hdmi_reg_writeb(hdata, HDMI_AVI_HEADER1,
1062 infoframe->any.version);
1063 hdmi_reg_writeb(hdata, HDMI_AVI_HEADER2, infoframe->any.length);
1064 hdr_sum = infoframe->any.type + infoframe->any.version +
1065 infoframe->any.length;
1067 /* Output format zero hardcoded ,RGB YBCR selection */
1068 hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(1), 0 << 5 |
1069 AVI_ACTIVE_FORMAT_VALID |
1070 AVI_UNDERSCANNED_DISPLAY_VALID);
1073 * Set the aspect ratio as per the mode, mentioned in
1074 * Table 9 AVI InfoFrame Data Byte 2 of CEA-861-D Standard
1076 ar = hdata->current_mode.picture_aspect_ratio;
1078 case HDMI_PICTURE_ASPECT_4_3:
1079 ar |= AVI_4_3_CENTER_RATIO;
1081 case HDMI_PICTURE_ASPECT_16_9:
1082 ar |= AVI_16_9_CENTER_RATIO;
1084 case HDMI_PICTURE_ASPECT_NONE:
1086 ar |= AVI_SAME_AS_PIC_ASPECT_RATIO;
1089 hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(2), ar);
1091 hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(4), hdata->cea_video_id);
1093 chksum = hdmi_chksum(hdata, HDMI_AVI_BYTE(1),
1094 infoframe->any.length, hdr_sum);
1095 DRM_DEBUG_KMS("AVI checksum = 0x%x\n", chksum);
1096 hdmi_reg_writeb(hdata, HDMI_AVI_CHECK_SUM, chksum);
1098 case HDMI_INFOFRAME_TYPE_AUDIO:
1099 hdmi_reg_writeb(hdata, HDMI_AUI_CON, 0x02);
1100 hdmi_reg_writeb(hdata, HDMI_AUI_HEADER0, infoframe->any.type);
1101 hdmi_reg_writeb(hdata, HDMI_AUI_HEADER1,
1102 infoframe->any.version);
1103 hdmi_reg_writeb(hdata, HDMI_AUI_HEADER2, infoframe->any.length);
1104 hdr_sum = infoframe->any.type + infoframe->any.version +
1105 infoframe->any.length;
1106 chksum = hdmi_chksum(hdata, HDMI_AUI_BYTE(1),
1107 infoframe->any.length, hdr_sum);
1108 DRM_DEBUG_KMS("AUI checksum = 0x%x\n", chksum);
1109 hdmi_reg_writeb(hdata, HDMI_AUI_CHECK_SUM, chksum);
1116 static enum drm_connector_status hdmi_detect(struct drm_connector *connector,
1119 struct hdmi_context *hdata = connector_to_hdmi(connector);
1121 if (gpiod_get_value(hdata->hpd_gpio))
1122 return connector_status_connected;
1124 return connector_status_disconnected;
1127 static void hdmi_connector_destroy(struct drm_connector *connector)
1129 drm_connector_unregister(connector);
1130 drm_connector_cleanup(connector);
1133 static const struct drm_connector_funcs hdmi_connector_funcs = {
1134 .dpms = drm_atomic_helper_connector_dpms,
1135 .fill_modes = drm_helper_probe_single_connector_modes,
1136 .detect = hdmi_detect,
1137 .destroy = hdmi_connector_destroy,
1138 .reset = drm_atomic_helper_connector_reset,
1139 .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
1140 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
1143 static int hdmi_get_modes(struct drm_connector *connector)
1145 struct hdmi_context *hdata = connector_to_hdmi(connector);
1149 if (!hdata->ddc_adpt)
1152 edid = drm_get_edid(connector, hdata->ddc_adpt);
1156 hdata->dvi_mode = !drm_detect_hdmi_monitor(edid);
1157 DRM_DEBUG_KMS("%s : width[%d] x height[%d]\n",
1158 (hdata->dvi_mode ? "dvi monitor" : "hdmi monitor"),
1159 edid->width_cm, edid->height_cm);
1161 drm_mode_connector_update_edid_property(connector, edid);
1163 ret = drm_add_edid_modes(connector, edid);
1170 static int hdmi_find_phy_conf(struct hdmi_context *hdata, u32 pixel_clock)
1172 const struct hdmiphy_configs *confs = &hdata->drv_data->phy_confs;
1175 for (i = 0; i < confs->count; i++)
1176 if (confs->data[i].pixel_clock == pixel_clock)
1179 DRM_DEBUG_KMS("Could not find phy config for %d\n", pixel_clock);
1183 static int hdmi_mode_valid(struct drm_connector *connector,
1184 struct drm_display_mode *mode)
1186 struct hdmi_context *hdata = connector_to_hdmi(connector);
1189 DRM_DEBUG_KMS("xres=%d, yres=%d, refresh=%d, intl=%d clock=%d\n",
1190 mode->hdisplay, mode->vdisplay, mode->vrefresh,
1191 (mode->flags & DRM_MODE_FLAG_INTERLACE) ? true :
1192 false, mode->clock * 1000);
1194 ret = hdmi_find_phy_conf(hdata, mode->clock * 1000);
1201 static struct drm_encoder *hdmi_best_encoder(struct drm_connector *connector)
1203 struct hdmi_context *hdata = connector_to_hdmi(connector);
1205 return &hdata->encoder;
1208 static const struct drm_connector_helper_funcs hdmi_connector_helper_funcs = {
1209 .get_modes = hdmi_get_modes,
1210 .mode_valid = hdmi_mode_valid,
1211 .best_encoder = hdmi_best_encoder,
1214 static int hdmi_create_connector(struct drm_encoder *encoder)
1216 struct hdmi_context *hdata = encoder_to_hdmi(encoder);
1217 struct drm_connector *connector = &hdata->connector;
1220 connector->interlace_allowed = true;
1221 connector->polled = DRM_CONNECTOR_POLL_HPD;
1223 ret = drm_connector_init(hdata->drm_dev, connector,
1224 &hdmi_connector_funcs, DRM_MODE_CONNECTOR_HDMIA);
1226 DRM_ERROR("Failed to initialize connector with drm\n");
1230 drm_connector_helper_add(connector, &hdmi_connector_helper_funcs);
1231 drm_connector_register(connector);
1232 drm_mode_connector_attach_encoder(connector, encoder);
1237 static bool hdmi_mode_fixup(struct drm_encoder *encoder,
1238 const struct drm_display_mode *mode,
1239 struct drm_display_mode *adjusted_mode)
1241 struct drm_device *dev = encoder->dev;
1242 struct drm_connector *connector;
1243 struct drm_display_mode *m;
1246 drm_mode_set_crtcinfo(adjusted_mode, 0);
1248 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
1249 if (connector->encoder == encoder)
1253 if (connector->encoder != encoder)
1256 mode_ok = hdmi_mode_valid(connector, adjusted_mode);
1258 if (mode_ok == MODE_OK)
1262 * Find the most suitable mode and copy it to adjusted_mode.
1264 list_for_each_entry(m, &connector->modes, head) {
1265 mode_ok = hdmi_mode_valid(connector, m);
1267 if (mode_ok == MODE_OK) {
1268 DRM_INFO("desired mode doesn't exist so\n");
1269 DRM_INFO("use the most suitable mode among modes.\n");
1271 DRM_DEBUG_KMS("Adjusted Mode: [%d]x[%d] [%d]Hz\n",
1272 m->hdisplay, m->vdisplay, m->vrefresh);
1274 drm_mode_copy(adjusted_mode, m);
1282 static void hdmi_reg_acr(struct hdmi_context *hdata, u32 freq)
1286 cts = (freq % 9) ? 27000 : 30000;
1287 n = 128 * freq / (27000000 / cts);
1289 hdmi_reg_writev(hdata, HDMI_ACR_N0, 3, n);
1290 hdmi_reg_writev(hdata, HDMI_ACR_MCTS0, 3, cts);
1291 hdmi_reg_writev(hdata, HDMI_ACR_CTS0, 3, cts);
1292 hdmi_reg_writeb(hdata, HDMI_ACR_CON, 4);
1295 static void hdmi_audio_init(struct hdmi_context *hdata)
1297 u32 sample_rate, bits_per_sample;
1298 u32 data_num, bit_ch, sample_frq;
1301 sample_rate = 44100;
1302 bits_per_sample = 16;
1304 switch (bits_per_sample) {
1319 hdmi_reg_acr(hdata, sample_rate);
1321 hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CON, HDMI_I2S_IN_DISABLE
1322 | HDMI_I2S_AUD_I2S | HDMI_I2S_CUV_I2S_ENABLE
1323 | HDMI_I2S_MUX_ENABLE);
1325 hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CH, HDMI_I2S_CH0_EN
1326 | HDMI_I2S_CH1_EN | HDMI_I2S_CH2_EN);
1328 hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CUV, HDMI_I2S_CUV_RL_EN);
1330 sample_frq = (sample_rate == 44100) ? 0 :
1331 (sample_rate == 48000) ? 2 :
1332 (sample_rate == 32000) ? 3 :
1333 (sample_rate == 96000) ? 0xa : 0x0;
1335 hdmi_reg_writeb(hdata, HDMI_I2S_CLK_CON, HDMI_I2S_CLK_DIS);
1336 hdmi_reg_writeb(hdata, HDMI_I2S_CLK_CON, HDMI_I2S_CLK_EN);
1338 val = hdmi_reg_read(hdata, HDMI_I2S_DSD_CON) | 0x01;
1339 hdmi_reg_writeb(hdata, HDMI_I2S_DSD_CON, val);
1341 /* Configuration I2S input ports. Configure I2S_PIN_SEL_0~4 */
1342 hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_0, HDMI_I2S_SEL_SCLK(5)
1343 | HDMI_I2S_SEL_LRCK(6));
1344 hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_1, HDMI_I2S_SEL_SDATA1(1)
1345 | HDMI_I2S_SEL_SDATA2(4));
1346 hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_2, HDMI_I2S_SEL_SDATA3(1)
1347 | HDMI_I2S_SEL_SDATA2(2));
1348 hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_3, HDMI_I2S_SEL_DSD(0));
1351 hdmi_reg_writeb(hdata, HDMI_I2S_CON_1, HDMI_I2S_SCLK_FALLING_EDGE
1352 | HDMI_I2S_L_CH_LOW_POL);
1353 hdmi_reg_writeb(hdata, HDMI_I2S_CON_2, HDMI_I2S_MSB_FIRST_MODE
1354 | HDMI_I2S_SET_BIT_CH(bit_ch)
1355 | HDMI_I2S_SET_SDATA_BIT(data_num)
1356 | HDMI_I2S_BASIC_FORMAT);
1358 /* Configure register related to CUV information */
1359 hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_0, HDMI_I2S_CH_STATUS_MODE_0
1360 | HDMI_I2S_2AUD_CH_WITHOUT_PREEMPH
1361 | HDMI_I2S_COPYRIGHT
1362 | HDMI_I2S_LINEAR_PCM
1363 | HDMI_I2S_CONSUMER_FORMAT);
1364 hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_1, HDMI_I2S_CD_PLAYER);
1365 hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_2, HDMI_I2S_SET_SOURCE_NUM(0));
1366 hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_3, HDMI_I2S_CLK_ACCUR_LEVEL_2
1367 | HDMI_I2S_SET_SMP_FREQ(sample_frq));
1368 hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_4,
1369 HDMI_I2S_ORG_SMP_FREQ_44_1
1370 | HDMI_I2S_WORD_LEN_MAX24_24BITS
1371 | HDMI_I2S_WORD_LEN_MAX_24BITS);
1373 hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_CON, HDMI_I2S_CH_STATUS_RELOAD);
1376 static void hdmi_audio_control(struct hdmi_context *hdata, bool onoff)
1378 if (hdata->dvi_mode)
1381 hdmi_reg_writeb(hdata, HDMI_AUI_CON, onoff ? 2 : 0);
1382 hdmi_reg_writemask(hdata, HDMI_CON_0, onoff ?
1383 HDMI_ASP_EN : HDMI_ASP_DIS, HDMI_ASP_MASK);
1386 static void hdmi_start(struct hdmi_context *hdata, bool start)
1388 u32 val = start ? HDMI_TG_EN : 0;
1390 if (hdata->current_mode.flags & DRM_MODE_FLAG_INTERLACE)
1391 val |= HDMI_FIELD_EN;
1393 hdmi_reg_writemask(hdata, HDMI_CON_0, val, HDMI_EN);
1394 hdmi_reg_writemask(hdata, HDMI_TG_CMD, val, HDMI_TG_EN | HDMI_FIELD_EN);
1397 static void hdmi_conf_init(struct hdmi_context *hdata)
1399 union hdmi_infoframe infoframe;
1401 /* disable HPD interrupts from HDMI IP block, use GPIO instead */
1402 hdmi_reg_writemask(hdata, HDMI_INTC_CON, 0, HDMI_INTC_EN_GLOBAL |
1403 HDMI_INTC_EN_HPD_PLUG | HDMI_INTC_EN_HPD_UNPLUG);
1405 /* choose HDMI mode */
1406 hdmi_reg_writemask(hdata, HDMI_MODE_SEL,
1407 HDMI_MODE_HDMI_EN, HDMI_MODE_MASK);
1408 /* apply video pre-amble and guard band in HDMI mode only */
1409 hdmi_reg_writeb(hdata, HDMI_CON_2, 0);
1410 /* disable bluescreen */
1411 hdmi_reg_writemask(hdata, HDMI_CON_0, 0, HDMI_BLUE_SCR_EN);
1413 if (hdata->dvi_mode) {
1414 hdmi_reg_writemask(hdata, HDMI_MODE_SEL,
1415 HDMI_MODE_DVI_EN, HDMI_MODE_MASK);
1416 hdmi_reg_writeb(hdata, HDMI_CON_2,
1417 HDMI_VID_PREAMBLE_DIS | HDMI_GUARD_BAND_DIS);
1420 if (hdata->drv_data->type == HDMI_TYPE13) {
1421 /* choose bluescreen (fecal) color */
1422 hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_0, 0x12);
1423 hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_1, 0x34);
1424 hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_2, 0x56);
1426 /* enable AVI packet every vsync, fixes purple line problem */
1427 hdmi_reg_writeb(hdata, HDMI_V13_AVI_CON, 0x02);
1428 /* force RGB, look to CEA-861-D, table 7 for more detail */
1429 hdmi_reg_writeb(hdata, HDMI_V13_AVI_BYTE(0), 0 << 5);
1430 hdmi_reg_writemask(hdata, HDMI_CON_1, 0x10 << 5, 0x11 << 5);
1432 hdmi_reg_writeb(hdata, HDMI_V13_SPD_CON, 0x02);
1433 hdmi_reg_writeb(hdata, HDMI_V13_AUI_CON, 0x02);
1434 hdmi_reg_writeb(hdata, HDMI_V13_ACR_CON, 0x04);
1436 infoframe.any.type = HDMI_INFOFRAME_TYPE_AVI;
1437 infoframe.any.version = HDMI_AVI_VERSION;
1438 infoframe.any.length = HDMI_AVI_LENGTH;
1439 hdmi_reg_infoframe(hdata, &infoframe);
1441 infoframe.any.type = HDMI_INFOFRAME_TYPE_AUDIO;
1442 infoframe.any.version = HDMI_AUI_VERSION;
1443 infoframe.any.length = HDMI_AUI_LENGTH;
1444 hdmi_reg_infoframe(hdata, &infoframe);
1446 /* enable AVI packet every vsync, fixes purple line problem */
1447 hdmi_reg_writemask(hdata, HDMI_CON_1, 2, 3 << 5);
1451 static void hdmiphy_wait_for_pll(struct hdmi_context *hdata)
1455 for (tries = 0; tries < 10; ++tries) {
1456 u32 val = hdmi_reg_read(hdata, HDMI_PHY_STATUS);
1458 if (val & HDMI_PHY_STATUS_READY) {
1459 DRM_DEBUG_KMS("PLL stabilized after %d tries\n", tries);
1462 usleep_range(10, 20);
1465 DRM_ERROR("PLL could not reach steady state\n");
1468 static void hdmi_v13_mode_apply(struct hdmi_context *hdata)
1470 struct drm_display_mode *m = &hdata->current_mode;
1473 hdmi_reg_writev(hdata, HDMI_H_BLANK_0, 2, m->htotal - m->hdisplay);
1474 hdmi_reg_writev(hdata, HDMI_V13_H_V_LINE_0, 3,
1475 (m->htotal << 12) | m->vtotal);
1477 val = (m->flags & DRM_MODE_FLAG_NVSYNC) ? 1 : 0;
1478 hdmi_reg_writev(hdata, HDMI_VSYNC_POL, 1, val);
1480 val = (m->flags & DRM_MODE_FLAG_INTERLACE) ? 1 : 0;
1481 hdmi_reg_writev(hdata, HDMI_INT_PRO_MODE, 1, val);
1483 val = (m->hsync_start - m->hdisplay - 2);
1484 val |= ((m->hsync_end - m->hdisplay - 2) << 10);
1485 val |= ((m->flags & DRM_MODE_FLAG_NHSYNC) ? 1 : 0)<<20;
1486 hdmi_reg_writev(hdata, HDMI_V13_H_SYNC_GEN_0, 3, val);
1489 * Quirk requirement for exynos HDMI IP design,
1490 * 2 pixels less than the actual calculation for hsync_start
1494 /* Following values & calculations differ for different type of modes */
1495 if (m->flags & DRM_MODE_FLAG_INTERLACE) {
1496 val = ((m->vsync_end - m->vdisplay) / 2);
1497 val |= ((m->vsync_start - m->vdisplay) / 2) << 12;
1498 hdmi_reg_writev(hdata, HDMI_V13_V_SYNC_GEN_1_0, 3, val);
1500 val = m->vtotal / 2;
1501 val |= ((m->vtotal - m->vdisplay) / 2) << 11;
1502 hdmi_reg_writev(hdata, HDMI_V13_V_BLANK_0, 3, val);
1505 ((m->vsync_end - m->vsync_start) * 4) + 5) / 2;
1506 val |= m->vtotal << 11;
1507 hdmi_reg_writev(hdata, HDMI_V13_V_BLANK_F_0, 3, val);
1509 val = ((m->vtotal / 2) + 7);
1510 val |= ((m->vtotal / 2) + 2) << 12;
1511 hdmi_reg_writev(hdata, HDMI_V13_V_SYNC_GEN_2_0, 3, val);
1513 val = ((m->htotal / 2) + (m->hsync_start - m->hdisplay));
1514 val |= ((m->htotal / 2) +
1515 (m->hsync_start - m->hdisplay)) << 12;
1516 hdmi_reg_writev(hdata, HDMI_V13_V_SYNC_GEN_3_0, 3, val);
1518 hdmi_reg_writev(hdata, HDMI_TG_VACT_ST_L, 2,
1519 (m->vtotal - m->vdisplay) / 2);
1520 hdmi_reg_writev(hdata, HDMI_TG_VACT_SZ_L, 2, m->vdisplay / 2);
1522 hdmi_reg_writev(hdata, HDMI_TG_VACT_ST2_L, 2, 0x249);
1525 val |= (m->vtotal - m->vdisplay) << 11;
1526 hdmi_reg_writev(hdata, HDMI_V13_V_BLANK_0, 3, val);
1528 hdmi_reg_writev(hdata, HDMI_V13_V_BLANK_F_0, 3, 0);
1530 val = (m->vsync_end - m->vdisplay);
1531 val |= ((m->vsync_start - m->vdisplay) << 12);
1532 hdmi_reg_writev(hdata, HDMI_V13_V_SYNC_GEN_1_0, 3, val);
1534 hdmi_reg_writev(hdata, HDMI_V13_V_SYNC_GEN_2_0, 3, 0x1001);
1535 hdmi_reg_writev(hdata, HDMI_V13_V_SYNC_GEN_3_0, 3, 0x1001);
1536 hdmi_reg_writev(hdata, HDMI_TG_VACT_ST_L, 2,
1537 m->vtotal - m->vdisplay);
1538 hdmi_reg_writev(hdata, HDMI_TG_VACT_SZ_L, 2, m->vdisplay);
1541 hdmi_reg_writev(hdata, HDMI_TG_H_FSZ_L, 2, m->htotal);
1542 hdmi_reg_writev(hdata, HDMI_TG_HACT_ST_L, 2, m->htotal - m->hdisplay);
1543 hdmi_reg_writev(hdata, HDMI_TG_HACT_SZ_L, 2, m->hdisplay);
1544 hdmi_reg_writev(hdata, HDMI_TG_V_FSZ_L, 2, m->vtotal);
1547 static void hdmi_v14_mode_apply(struct hdmi_context *hdata)
1549 struct drm_display_mode *m = &hdata->current_mode;
1551 hdmi_reg_writev(hdata, HDMI_H_BLANK_0, 2, m->htotal - m->hdisplay);
1552 hdmi_reg_writev(hdata, HDMI_V_LINE_0, 2, m->vtotal);
1553 hdmi_reg_writev(hdata, HDMI_H_LINE_0, 2, m->htotal);
1554 hdmi_reg_writev(hdata, HDMI_HSYNC_POL, 1,
1555 (m->flags & DRM_MODE_FLAG_NHSYNC) ? 1 : 0);
1556 hdmi_reg_writev(hdata, HDMI_VSYNC_POL, 1,
1557 (m->flags & DRM_MODE_FLAG_NVSYNC) ? 1 : 0);
1558 hdmi_reg_writev(hdata, HDMI_INT_PRO_MODE, 1,
1559 (m->flags & DRM_MODE_FLAG_INTERLACE) ? 1 : 0);
1562 * Quirk requirement for exynos 5 HDMI IP design,
1563 * 2 pixels less than the actual calculation for hsync_start
1567 /* Following values & calculations differ for different type of modes */
1568 if (m->flags & DRM_MODE_FLAG_INTERLACE) {
1569 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_BEF_2_0, 2,
1570 (m->vsync_end - m->vdisplay) / 2);
1571 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_BEF_1_0, 2,
1572 (m->vsync_start - m->vdisplay) / 2);
1573 hdmi_reg_writev(hdata, HDMI_V2_BLANK_0, 2, m->vtotal / 2);
1574 hdmi_reg_writev(hdata, HDMI_V1_BLANK_0, 2,
1575 (m->vtotal - m->vdisplay) / 2);
1576 hdmi_reg_writev(hdata, HDMI_V_BLANK_F0_0, 2,
1577 m->vtotal - m->vdisplay / 2);
1578 hdmi_reg_writev(hdata, HDMI_V_BLANK_F1_0, 2, m->vtotal);
1579 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_2_0, 2,
1580 (m->vtotal / 2) + 7);
1581 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_1_0, 2,
1582 (m->vtotal / 2) + 2);
1583 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_2_0, 2,
1584 (m->htotal / 2) + (m->hsync_start - m->hdisplay));
1585 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_1_0, 2,
1586 (m->htotal / 2) + (m->hsync_start - m->hdisplay));
1587 hdmi_reg_writev(hdata, HDMI_TG_VACT_ST_L, 2,
1588 (m->vtotal - m->vdisplay) / 2);
1589 hdmi_reg_writev(hdata, HDMI_TG_VACT_SZ_L, 2, m->vdisplay / 2);
1590 hdmi_reg_writev(hdata, HDMI_TG_VACT_ST2_L, 2,
1591 m->vtotal - m->vdisplay / 2);
1592 hdmi_reg_writev(hdata, HDMI_TG_VSYNC2_L, 2,
1593 (m->vtotal / 2) + 1);
1594 hdmi_reg_writev(hdata, HDMI_TG_VSYNC_BOT_HDMI_L, 2,
1595 (m->vtotal / 2) + 1);
1596 hdmi_reg_writev(hdata, HDMI_TG_FIELD_BOT_HDMI_L, 2,
1597 (m->vtotal / 2) + 1);
1598 hdmi_reg_writev(hdata, HDMI_TG_VACT_ST3_L, 2, 0x0);
1599 hdmi_reg_writev(hdata, HDMI_TG_VACT_ST4_L, 2, 0x0);
1601 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_BEF_2_0, 2,
1602 m->vsync_end - m->vdisplay);
1603 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_BEF_1_0, 2,
1604 m->vsync_start - m->vdisplay);
1605 hdmi_reg_writev(hdata, HDMI_V2_BLANK_0, 2, m->vtotal);
1606 hdmi_reg_writev(hdata, HDMI_V1_BLANK_0, 2,
1607 m->vtotal - m->vdisplay);
1608 hdmi_reg_writev(hdata, HDMI_V_BLANK_F0_0, 2, 0xffff);
1609 hdmi_reg_writev(hdata, HDMI_V_BLANK_F1_0, 2, 0xffff);
1610 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_2_0, 2, 0xffff);
1611 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_1_0, 2, 0xffff);
1612 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_2_0, 2, 0xffff);
1613 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_1_0, 2, 0xffff);
1614 hdmi_reg_writev(hdata, HDMI_TG_VACT_ST_L, 2,
1615 m->vtotal - m->vdisplay);
1616 hdmi_reg_writev(hdata, HDMI_TG_VACT_SZ_L, 2, m->vdisplay);
1619 hdmi_reg_writev(hdata, HDMI_H_SYNC_START_0, 2,
1620 m->hsync_start - m->hdisplay - 2);
1621 hdmi_reg_writev(hdata, HDMI_H_SYNC_END_0, 2,
1622 m->hsync_end - m->hdisplay - 2);
1623 hdmi_reg_writev(hdata, HDMI_VACT_SPACE_1_0, 2, 0xffff);
1624 hdmi_reg_writev(hdata, HDMI_VACT_SPACE_2_0, 2, 0xffff);
1625 hdmi_reg_writev(hdata, HDMI_VACT_SPACE_3_0, 2, 0xffff);
1626 hdmi_reg_writev(hdata, HDMI_VACT_SPACE_4_0, 2, 0xffff);
1627 hdmi_reg_writev(hdata, HDMI_VACT_SPACE_5_0, 2, 0xffff);
1628 hdmi_reg_writev(hdata, HDMI_VACT_SPACE_6_0, 2, 0xffff);
1629 hdmi_reg_writev(hdata, HDMI_V_BLANK_F2_0, 2, 0xffff);
1630 hdmi_reg_writev(hdata, HDMI_V_BLANK_F3_0, 2, 0xffff);
1631 hdmi_reg_writev(hdata, HDMI_V_BLANK_F4_0, 2, 0xffff);
1632 hdmi_reg_writev(hdata, HDMI_V_BLANK_F5_0, 2, 0xffff);
1633 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_3_0, 2, 0xffff);
1634 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_4_0, 2, 0xffff);
1635 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_5_0, 2, 0xffff);
1636 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_6_0, 2, 0xffff);
1637 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_3_0, 2, 0xffff);
1638 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_4_0, 2, 0xffff);
1639 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_5_0, 2, 0xffff);
1640 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_6_0, 2, 0xffff);
1642 hdmi_reg_writev(hdata, HDMI_TG_H_FSZ_L, 2, m->htotal);
1643 hdmi_reg_writev(hdata, HDMI_TG_HACT_ST_L, 2, m->htotal - m->hdisplay);
1644 hdmi_reg_writev(hdata, HDMI_TG_HACT_SZ_L, 2, m->hdisplay);
1645 hdmi_reg_writev(hdata, HDMI_TG_V_FSZ_L, 2, m->vtotal);
1646 if (hdata->drv_data == &exynos5433_hdmi_driver_data)
1647 hdmi_reg_writeb(hdata, HDMI_TG_DECON_EN, 1);
1650 static void hdmi_mode_apply(struct hdmi_context *hdata)
1652 if (hdata->drv_data->type == HDMI_TYPE13)
1653 hdmi_v13_mode_apply(hdata);
1655 hdmi_v14_mode_apply(hdata);
1657 hdmiphy_wait_for_pll(hdata);
1658 hdmi_clk_set_parents(hdata, true);
1659 hdmi_start(hdata, true);
1662 static void hdmiphy_conf_reset(struct hdmi_context *hdata)
1664 hdmi_clk_set_parents(hdata, false);
1666 hdmi_reg_writemask(hdata, HDMI_PHY_RSTOUT, ~0, HDMI_PHY_SW_RSTOUT);
1667 usleep_range(10000, 12000);
1668 hdmi_reg_writemask(hdata, HDMI_PHY_RSTOUT, 0, HDMI_PHY_SW_RSTOUT);
1669 usleep_range(10000, 12000);
1672 static void hdmiphy_enable_mode_set(struct hdmi_context *hdata, bool enable)
1674 u8 v = enable ? HDMI_PHY_ENABLE_MODE_SET : HDMI_PHY_DISABLE_MODE_SET;
1676 if (hdata->drv_data == &exynos5433_hdmi_driver_data)
1677 writel(v, hdata->regs_hdmiphy + HDMIPHY5433_MODE_SET_DONE);
1680 static void hdmiphy_conf_apply(struct hdmi_context *hdata)
1685 i = hdmi_find_phy_conf(hdata, hdata->current_mode.clock * 1000);
1687 DRM_ERROR("failed to find hdmiphy conf\n");
1691 hdmiphy_enable_mode_set(hdata, true);
1692 ret = hdmiphy_reg_write_buf(hdata, 0,
1693 hdata->drv_data->phy_confs.data[i].conf, 32);
1695 DRM_ERROR("failed to configure hdmiphy\n");
1698 hdmiphy_enable_mode_set(hdata, false);
1700 usleep_range(10000, 12000);
1703 static void hdmi_conf_apply(struct hdmi_context *hdata)
1705 hdmiphy_conf_reset(hdata);
1706 hdmiphy_conf_apply(hdata);
1707 hdmi_start(hdata, false);
1708 hdmi_conf_init(hdata);
1709 hdmi_audio_init(hdata);
1710 hdmi_mode_apply(hdata);
1711 hdmi_audio_control(hdata, true);
1712 hdmi_regs_dump(hdata, "start");
1715 static void hdmi_mode_set(struct drm_encoder *encoder,
1716 struct drm_display_mode *mode,
1717 struct drm_display_mode *adjusted_mode)
1719 struct hdmi_context *hdata = encoder_to_hdmi(encoder);
1720 struct drm_display_mode *m = adjusted_mode;
1722 DRM_DEBUG_KMS("xres=%d, yres=%d, refresh=%d, intl=%s\n",
1723 m->hdisplay, m->vdisplay,
1724 m->vrefresh, (m->flags & DRM_MODE_FLAG_INTERLACE) ?
1725 "INTERLACED" : "PROGRESSIVE");
1727 drm_mode_copy(&hdata->current_mode, m);
1728 hdata->cea_video_id = drm_match_cea_mode(mode);
1731 static void hdmi_set_refclk(struct hdmi_context *hdata, bool on)
1736 regmap_update_bits(hdata->sysreg, EXYNOS5433_SYSREG_DISP_HDMI_PHY,
1737 SYSREG_HDMI_REFCLK_INT_CLK, on ? ~0 : 0);
1740 static void hdmi_enable(struct drm_encoder *encoder)
1742 struct hdmi_context *hdata = encoder_to_hdmi(encoder);
1747 pm_runtime_get_sync(hdata->dev);
1749 if (regulator_bulk_enable(ARRAY_SIZE(supply), hdata->regul_bulk))
1750 DRM_DEBUG_KMS("failed to enable regulator bulk\n");
1752 regmap_update_bits(hdata->pmureg, PMU_HDMI_PHY_CONTROL,
1753 PMU_HDMI_PHY_ENABLE_BIT, 1);
1755 hdmi_set_refclk(hdata, true);
1757 hdmi_conf_apply(hdata);
1759 hdata->powered = true;
1762 static void hdmi_disable(struct drm_encoder *encoder)
1764 struct hdmi_context *hdata = encoder_to_hdmi(encoder);
1765 struct drm_crtc *crtc = encoder->crtc;
1766 const struct drm_crtc_helper_funcs *funcs = NULL;
1768 if (!hdata->powered)
1772 * The SFRs of VP and Mixer are updated by Vertical Sync of
1773 * Timing generator which is a part of HDMI so the sequence
1774 * to disable TV Subsystem should be as following,
1775 * VP -> Mixer -> HDMI
1777 * Below codes will try to disable Mixer and VP(if used)
1778 * prior to disabling HDMI.
1781 funcs = crtc->helper_private;
1782 if (funcs && funcs->disable)
1783 (*funcs->disable)(crtc);
1785 hdmi_reg_writemask(hdata, HDMI_CON_0, 0, HDMI_EN);
1787 cancel_delayed_work(&hdata->hotplug_work);
1789 hdmi_set_refclk(hdata, false);
1791 regmap_update_bits(hdata->pmureg, PMU_HDMI_PHY_CONTROL,
1792 PMU_HDMI_PHY_ENABLE_BIT, 0);
1794 regulator_bulk_disable(ARRAY_SIZE(supply), hdata->regul_bulk);
1796 pm_runtime_put_sync(hdata->dev);
1798 hdata->powered = false;
1801 static const struct drm_encoder_helper_funcs exynos_hdmi_encoder_helper_funcs = {
1802 .mode_fixup = hdmi_mode_fixup,
1803 .mode_set = hdmi_mode_set,
1804 .enable = hdmi_enable,
1805 .disable = hdmi_disable,
1808 static const struct drm_encoder_funcs exynos_hdmi_encoder_funcs = {
1809 .destroy = drm_encoder_cleanup,
1812 static void hdmi_hotplug_work_func(struct work_struct *work)
1814 struct hdmi_context *hdata;
1816 hdata = container_of(work, struct hdmi_context, hotplug_work.work);
1819 drm_helper_hpd_irq_event(hdata->drm_dev);
1822 static irqreturn_t hdmi_irq_thread(int irq, void *arg)
1824 struct hdmi_context *hdata = arg;
1826 mod_delayed_work(system_wq, &hdata->hotplug_work,
1827 msecs_to_jiffies(HOTPLUG_DEBOUNCE_MS));
1832 static int hdmi_clks_get(struct hdmi_context *hdata,
1833 const struct string_array_spec *names,
1836 struct device *dev = hdata->dev;
1839 for (i = 0; i < names->count; ++i) {
1840 struct clk *clk = devm_clk_get(dev, names->data[i]);
1843 int ret = PTR_ERR(clk);
1845 dev_err(dev, "Cannot get clock %s, %d\n",
1846 names->data[i], ret);
1857 static int hdmi_clk_init(struct hdmi_context *hdata)
1859 const struct hdmi_driver_data *drv_data = hdata->drv_data;
1860 int count = drv_data->clk_gates.count + drv_data->clk_muxes.count;
1861 struct device *dev = hdata->dev;
1868 clks = devm_kzalloc(dev, sizeof(*clks) * count, GFP_KERNEL);
1872 hdata->clk_gates = clks;
1873 hdata->clk_muxes = clks + drv_data->clk_gates.count;
1875 ret = hdmi_clks_get(hdata, &drv_data->clk_gates, hdata->clk_gates);
1879 return hdmi_clks_get(hdata, &drv_data->clk_muxes, hdata->clk_muxes);
1883 static int hdmi_resources_init(struct hdmi_context *hdata)
1885 struct device *dev = hdata->dev;
1888 DRM_DEBUG_KMS("HDMI resource init\n");
1890 hdata->hpd_gpio = devm_gpiod_get(dev, "hpd", GPIOD_IN);
1891 if (IS_ERR(hdata->hpd_gpio)) {
1892 DRM_ERROR("cannot get hpd gpio property\n");
1893 return PTR_ERR(hdata->hpd_gpio);
1896 hdata->irq = gpiod_to_irq(hdata->hpd_gpio);
1897 if (hdata->irq < 0) {
1898 DRM_ERROR("failed to get GPIO irq\n");
1902 ret = hdmi_clk_init(hdata);
1906 ret = hdmi_clk_set_parents(hdata, false);
1910 for (i = 0; i < ARRAY_SIZE(supply); ++i) {
1911 hdata->regul_bulk[i].supply = supply[i];
1912 hdata->regul_bulk[i].consumer = NULL;
1914 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(supply), hdata->regul_bulk);
1916 DRM_ERROR("failed to get regulators\n");
1920 hdata->reg_hdmi_en = devm_regulator_get_optional(dev, "hdmi-en");
1922 if (PTR_ERR(hdata->reg_hdmi_en) == -ENODEV)
1925 if (IS_ERR(hdata->reg_hdmi_en))
1926 return PTR_ERR(hdata->reg_hdmi_en);
1928 ret = regulator_enable(hdata->reg_hdmi_en);
1930 DRM_ERROR("failed to enable hdmi-en regulator\n");
1935 static struct of_device_id hdmi_match_types[] = {
1937 .compatible = "samsung,exynos4210-hdmi",
1938 .data = &exynos4210_hdmi_driver_data,
1940 .compatible = "samsung,exynos4212-hdmi",
1941 .data = &exynos4212_hdmi_driver_data,
1943 .compatible = "samsung,exynos5420-hdmi",
1944 .data = &exynos5420_hdmi_driver_data,
1946 .compatible = "samsung,exynos5433-hdmi",
1947 .data = &exynos5433_hdmi_driver_data,
1952 MODULE_DEVICE_TABLE (of, hdmi_match_types);
1954 static int hdmi_bind(struct device *dev, struct device *master, void *data)
1956 struct drm_device *drm_dev = data;
1957 struct hdmi_context *hdata = dev_get_drvdata(dev);
1958 struct drm_encoder *encoder = &hdata->encoder;
1961 hdata->drm_dev = drm_dev;
1963 pipe = exynos_drm_crtc_get_pipe_from_type(drm_dev,
1964 EXYNOS_DISPLAY_TYPE_HDMI);
1968 encoder->possible_crtcs = 1 << pipe;
1970 DRM_DEBUG_KMS("possible_crtcs = 0x%x\n", encoder->possible_crtcs);
1972 drm_encoder_init(drm_dev, encoder, &exynos_hdmi_encoder_funcs,
1973 DRM_MODE_ENCODER_TMDS, NULL);
1975 drm_encoder_helper_add(encoder, &exynos_hdmi_encoder_helper_funcs);
1977 ret = hdmi_create_connector(encoder);
1979 DRM_ERROR("failed to create connector ret = %d\n", ret);
1980 drm_encoder_cleanup(encoder);
1987 static void hdmi_unbind(struct device *dev, struct device *master, void *data)
1991 static const struct component_ops hdmi_component_ops = {
1993 .unbind = hdmi_unbind,
1996 static struct device_node *hdmi_legacy_ddc_dt_binding(struct device *dev)
1998 const char *compatible_str = "samsung,exynos4210-hdmiddc";
1999 struct device_node *np;
2001 np = of_find_compatible_node(NULL, NULL, compatible_str);
2003 return of_get_next_parent(np);
2008 static struct device_node *hdmi_legacy_phy_dt_binding(struct device *dev)
2010 const char *compatible_str = "samsung,exynos4212-hdmiphy";
2012 return of_find_compatible_node(NULL, NULL, compatible_str);
2015 static int hdmi_probe(struct platform_device *pdev)
2017 struct device_node *ddc_node, *phy_node;
2018 const struct of_device_id *match;
2019 struct device *dev = &pdev->dev;
2020 struct hdmi_context *hdata;
2021 struct resource *res;
2024 hdata = devm_kzalloc(dev, sizeof(struct hdmi_context), GFP_KERNEL);
2028 match = of_match_device(hdmi_match_types, dev);
2032 hdata->drv_data = match->data;
2034 platform_set_drvdata(pdev, hdata);
2038 ret = hdmi_resources_init(hdata);
2040 DRM_ERROR("hdmi_resources_init failed\n");
2044 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2045 hdata->regs = devm_ioremap_resource(dev, res);
2046 if (IS_ERR(hdata->regs)) {
2047 ret = PTR_ERR(hdata->regs);
2051 ddc_node = hdmi_legacy_ddc_dt_binding(dev);
2053 goto out_get_ddc_adpt;
2055 ddc_node = of_parse_phandle(dev->of_node, "ddc", 0);
2057 DRM_ERROR("Failed to find ddc node in device tree\n");
2062 hdata->ddc_adpt = of_find_i2c_adapter_by_node(ddc_node);
2063 if (!hdata->ddc_adpt) {
2064 DRM_ERROR("Failed to get ddc i2c adapter by node\n");
2065 return -EPROBE_DEFER;
2068 phy_node = hdmi_legacy_phy_dt_binding(dev);
2070 goto out_get_phy_port;
2072 phy_node = of_parse_phandle(dev->of_node, "phy", 0);
2074 DRM_ERROR("Failed to find hdmiphy node in device tree\n");
2080 if (hdata->drv_data->is_apb_phy) {
2081 hdata->regs_hdmiphy = of_iomap(phy_node, 0);
2082 if (!hdata->regs_hdmiphy) {
2083 DRM_ERROR("failed to ioremap hdmi phy\n");
2088 hdata->hdmiphy_port = of_find_i2c_device_by_node(phy_node);
2089 if (!hdata->hdmiphy_port) {
2090 DRM_ERROR("Failed to get hdmi phy i2c client\n");
2091 ret = -EPROBE_DEFER;
2096 INIT_DELAYED_WORK(&hdata->hotplug_work, hdmi_hotplug_work_func);
2098 ret = devm_request_threaded_irq(dev, hdata->irq, NULL,
2099 hdmi_irq_thread, IRQF_TRIGGER_RISING |
2100 IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
2103 DRM_ERROR("failed to register hdmi interrupt\n");
2107 hdata->pmureg = syscon_regmap_lookup_by_phandle(dev->of_node,
2108 "samsung,syscon-phandle");
2109 if (IS_ERR(hdata->pmureg)) {
2110 DRM_ERROR("syscon regmap lookup failed.\n");
2111 ret = -EPROBE_DEFER;
2115 if (hdata->drv_data->has_sysreg) {
2116 hdata->sysreg = syscon_regmap_lookup_by_phandle(dev->of_node,
2117 "samsung,sysreg-phandle");
2118 if (IS_ERR(hdata->sysreg)) {
2119 DRM_ERROR("sysreg regmap lookup failed.\n");
2120 ret = -EPROBE_DEFER;
2125 pm_runtime_enable(dev);
2127 ret = component_add(&pdev->dev, &hdmi_component_ops);
2129 goto err_disable_pm_runtime;
2133 err_disable_pm_runtime:
2134 pm_runtime_disable(dev);
2137 if (hdata->hdmiphy_port)
2138 put_device(&hdata->hdmiphy_port->dev);
2140 put_device(&hdata->ddc_adpt->dev);
2145 static int hdmi_remove(struct platform_device *pdev)
2147 struct hdmi_context *hdata = platform_get_drvdata(pdev);
2149 cancel_delayed_work_sync(&hdata->hotplug_work);
2151 component_del(&pdev->dev, &hdmi_component_ops);
2153 pm_runtime_disable(&pdev->dev);
2155 if (!IS_ERR(hdata->reg_hdmi_en))
2156 regulator_disable(hdata->reg_hdmi_en);
2158 if (hdata->hdmiphy_port)
2159 put_device(&hdata->hdmiphy_port->dev);
2161 put_device(&hdata->ddc_adpt->dev);
2167 static int exynos_hdmi_suspend(struct device *dev)
2169 struct hdmi_context *hdata = dev_get_drvdata(dev);
2171 hdmi_clk_disable_gates(hdata);
2176 static int exynos_hdmi_resume(struct device *dev)
2178 struct hdmi_context *hdata = dev_get_drvdata(dev);
2181 ret = hdmi_clk_enable_gates(hdata);
2189 static const struct dev_pm_ops exynos_hdmi_pm_ops = {
2190 SET_RUNTIME_PM_OPS(exynos_hdmi_suspend, exynos_hdmi_resume, NULL)
2193 struct platform_driver hdmi_driver = {
2194 .probe = hdmi_probe,
2195 .remove = hdmi_remove,
2197 .name = "exynos-hdmi",
2198 .owner = THIS_MODULE,
2199 .pm = &exynos_hdmi_pm_ops,
2200 .of_match_table = hdmi_match_types,