1 /* 2 * Copyright (C) 2011 Samsung Electronics Co.Ltd 3 * Authors: 4 * Seung-Woo Kim <sw0312.kim@samsung.com> 5 * Inki Dae <inki.dae@samsung.com> 6 * Joonyoung Shim <jy0922.shim@samsung.com> 7 * 8 * Based on drivers/media/video/s5p-tv/hdmi_drv.c 9 * 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. 14 * 15 */ 16 17 #include <drm/drmP.h> 18 #include <drm/drm_edid.h> 19 #include <drm/drm_crtc_helper.h> 20 #include <drm/drm_atomic_helper.h> 21 22 #include "regs-hdmi.h" 23 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> 35 #include <linux/io.h> 36 #include <linux/of_address.h> 37 #include <linux/of_device.h> 38 #include <linux/of_graph.h> 39 #include <linux/hdmi.h> 40 #include <linux/component.h> 41 #include <linux/mfd/syscon.h> 42 #include <linux/regmap.h> 43 44 #include <drm/exynos_drm.h> 45 46 #include <media/cec-notifier.h> 47 48 #include "exynos_drm_crtc.h" 49 50 #define HOTPLUG_DEBOUNCE_MS 1100 51 52 enum hdmi_type { 53 HDMI_TYPE13, 54 HDMI_TYPE14, 55 HDMI_TYPE_COUNT 56 }; 57 58 #define HDMI_MAPPED_BASE 0xffff0000 59 60 enum hdmi_mapped_regs { 61 HDMI_PHY_STATUS = HDMI_MAPPED_BASE, 62 HDMI_PHY_RSTOUT, 63 HDMI_ACR_CON, 64 HDMI_ACR_MCTS0, 65 HDMI_ACR_CTS0, 66 HDMI_ACR_N0 67 }; 68 69 static const u32 hdmi_reg_map[][HDMI_TYPE_COUNT] = { 70 { HDMI_V13_PHY_STATUS, HDMI_PHY_STATUS_0 }, 71 { HDMI_V13_PHY_RSTOUT, HDMI_V14_PHY_RSTOUT }, 72 { HDMI_V13_ACR_CON, HDMI_V14_ACR_CON }, 73 { HDMI_V13_ACR_MCTS0, HDMI_V14_ACR_MCTS0 }, 74 { HDMI_V13_ACR_CTS0, HDMI_V14_ACR_CTS0 }, 75 { HDMI_V13_ACR_N0, HDMI_V14_ACR_N0 }, 76 }; 77 78 static const char * const supply[] = { 79 "vdd", 80 "vdd_osc", 81 "vdd_pll", 82 }; 83 84 struct hdmiphy_config { 85 int pixel_clock; 86 u8 conf[32]; 87 }; 88 89 struct hdmiphy_configs { 90 int count; 91 const struct hdmiphy_config *data; 92 }; 93 94 struct string_array_spec { 95 int count; 96 const char * const *data; 97 }; 98 99 #define INIT_ARRAY_SPEC(a) { .count = ARRAY_SIZE(a), .data = a } 100 101 struct hdmi_driver_data { 102 unsigned int type; 103 unsigned int is_apb_phy:1; 104 unsigned int has_sysreg:1; 105 struct hdmiphy_configs phy_confs; 106 struct string_array_spec clk_gates; 107 /* 108 * Array of triplets (p_off, p_on, clock), where p_off and p_on are 109 * required parents of clock when HDMI-PHY is respectively off or on. 110 */ 111 struct string_array_spec clk_muxes; 112 }; 113 114 struct hdmi_context { 115 struct drm_encoder encoder; 116 struct device *dev; 117 struct drm_device *drm_dev; 118 struct drm_connector connector; 119 bool powered; 120 bool dvi_mode; 121 struct delayed_work hotplug_work; 122 struct drm_display_mode current_mode; 123 struct cec_notifier *notifier; 124 const struct hdmi_driver_data *drv_data; 125 126 void __iomem *regs; 127 void __iomem *regs_hdmiphy; 128 struct i2c_client *hdmiphy_port; 129 struct i2c_adapter *ddc_adpt; 130 struct gpio_desc *hpd_gpio; 131 int irq; 132 struct regmap *pmureg; 133 struct regmap *sysreg; 134 struct clk **clk_gates; 135 struct clk **clk_muxes; 136 struct regulator_bulk_data regul_bulk[ARRAY_SIZE(supply)]; 137 struct regulator *reg_hdmi_en; 138 struct exynos_drm_clk phy_clk; 139 struct drm_bridge *bridge; 140 }; 141 142 static inline struct hdmi_context *encoder_to_hdmi(struct drm_encoder *e) 143 { 144 return container_of(e, struct hdmi_context, encoder); 145 } 146 147 static inline struct hdmi_context *connector_to_hdmi(struct drm_connector *c) 148 { 149 return container_of(c, struct hdmi_context, connector); 150 } 151 152 static const struct hdmiphy_config hdmiphy_v13_configs[] = { 153 { 154 .pixel_clock = 27000000, 155 .conf = { 156 0x01, 0x05, 0x00, 0xD8, 0x10, 0x1C, 0x30, 0x40, 157 0x6B, 0x10, 0x02, 0x51, 0xDF, 0xF2, 0x54, 0x87, 158 0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0, 159 0x22, 0x40, 0xE3, 0x26, 0x00, 0x00, 0x00, 0x80, 160 }, 161 }, 162 { 163 .pixel_clock = 27027000, 164 .conf = { 165 0x01, 0x05, 0x00, 0xD4, 0x10, 0x9C, 0x09, 0x64, 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, 169 }, 170 }, 171 { 172 .pixel_clock = 74176000, 173 .conf = { 174 0x01, 0x05, 0x00, 0xD8, 0x10, 0x9C, 0xef, 0x5B, 175 0x6D, 0x10, 0x01, 0x51, 0xef, 0xF3, 0x54, 0xb9, 176 0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0, 177 0x22, 0x40, 0xa5, 0x26, 0x01, 0x00, 0x00, 0x80, 178 }, 179 }, 180 { 181 .pixel_clock = 74250000, 182 .conf = { 183 0x01, 0x05, 0x00, 0xd8, 0x10, 0x9c, 0xf8, 0x40, 184 0x6a, 0x10, 0x01, 0x51, 0xff, 0xf1, 0x54, 0xba, 185 0x84, 0x00, 0x10, 0x38, 0x00, 0x08, 0x10, 0xe0, 186 0x22, 0x40, 0xa4, 0x26, 0x01, 0x00, 0x00, 0x80, 187 }, 188 }, 189 { 190 .pixel_clock = 148500000, 191 .conf = { 192 0x01, 0x05, 0x00, 0xD8, 0x10, 0x9C, 0xf8, 0x40, 193 0x6A, 0x18, 0x00, 0x51, 0xff, 0xF1, 0x54, 0xba, 194 0x84, 0x00, 0x10, 0x38, 0x00, 0x08, 0x10, 0xE0, 195 0x22, 0x40, 0xa4, 0x26, 0x02, 0x00, 0x00, 0x80, 196 }, 197 }, 198 }; 199 200 static const struct hdmiphy_config hdmiphy_v14_configs[] = { 201 { 202 .pixel_clock = 25200000, 203 .conf = { 204 0x01, 0x51, 0x2A, 0x75, 0x40, 0x01, 0x00, 0x08, 205 0x82, 0x80, 0xfc, 0xd8, 0x45, 0xa0, 0xac, 0x80, 206 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86, 207 0x54, 0xf4, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80, 208 }, 209 }, 210 { 211 .pixel_clock = 27000000, 212 .conf = { 213 0x01, 0xd1, 0x22, 0x51, 0x40, 0x08, 0xfc, 0x20, 214 0x98, 0xa0, 0xcb, 0xd8, 0x45, 0xa0, 0xac, 0x80, 215 0x06, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86, 216 0x54, 0xe4, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80, 217 }, 218 }, 219 { 220 .pixel_clock = 27027000, 221 .conf = { 222 0x01, 0xd1, 0x2d, 0x72, 0x40, 0x64, 0x12, 0x08, 223 0x43, 0xa0, 0x0e, 0xd9, 0x45, 0xa0, 0xac, 0x80, 224 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86, 225 0x54, 0xe3, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80, 226 }, 227 }, 228 { 229 .pixel_clock = 36000000, 230 .conf = { 231 0x01, 0x51, 0x2d, 0x55, 0x40, 0x01, 0x00, 0x08, 232 0x82, 0x80, 0x0e, 0xd9, 0x45, 0xa0, 0xac, 0x80, 233 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86, 234 0x54, 0xab, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80, 235 }, 236 }, 237 { 238 .pixel_clock = 40000000, 239 .conf = { 240 0x01, 0x51, 0x32, 0x55, 0x40, 0x01, 0x00, 0x08, 241 0x82, 0x80, 0x2c, 0xd9, 0x45, 0xa0, 0xac, 0x80, 242 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86, 243 0x54, 0x9a, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80, 244 }, 245 }, 246 { 247 .pixel_clock = 65000000, 248 .conf = { 249 0x01, 0xd1, 0x36, 0x34, 0x40, 0x1e, 0x0a, 0x08, 250 0x82, 0xa0, 0x45, 0xd9, 0x45, 0xa0, 0xac, 0x80, 251 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86, 252 0x54, 0xbd, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80, 253 }, 254 }, 255 { 256 .pixel_clock = 71000000, 257 .conf = { 258 0x01, 0xd1, 0x3b, 0x35, 0x40, 0x0c, 0x04, 0x08, 259 0x85, 0xa0, 0x63, 0xd9, 0x45, 0xa0, 0xac, 0x80, 260 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86, 261 0x54, 0xad, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80, 262 }, 263 }, 264 { 265 .pixel_clock = 73250000, 266 .conf = { 267 0x01, 0xd1, 0x3d, 0x35, 0x40, 0x18, 0x02, 0x08, 268 0x83, 0xa0, 0x6e, 0xd9, 0x45, 0xa0, 0xac, 0x80, 269 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86, 270 0x54, 0xa8, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80, 271 }, 272 }, 273 { 274 .pixel_clock = 74176000, 275 .conf = { 276 0x01, 0xd1, 0x3e, 0x35, 0x40, 0x5b, 0xde, 0x08, 277 0x82, 0xa0, 0x73, 0xd9, 0x45, 0xa0, 0xac, 0x80, 278 0x56, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86, 279 0x54, 0xa6, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80, 280 }, 281 }, 282 { 283 .pixel_clock = 74250000, 284 .conf = { 285 0x01, 0xd1, 0x1f, 0x10, 0x40, 0x40, 0xf8, 0x08, 286 0x81, 0xa0, 0xba, 0xd8, 0x45, 0xa0, 0xac, 0x80, 287 0x3c, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86, 288 0x54, 0xa5, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80, 289 }, 290 }, 291 { 292 .pixel_clock = 83500000, 293 .conf = { 294 0x01, 0xd1, 0x23, 0x11, 0x40, 0x0c, 0xfb, 0x08, 295 0x85, 0xa0, 0xd1, 0xd8, 0x45, 0xa0, 0xac, 0x80, 296 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86, 297 0x54, 0x93, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80, 298 }, 299 }, 300 { 301 .pixel_clock = 106500000, 302 .conf = { 303 0x01, 0xd1, 0x2c, 0x12, 0x40, 0x0c, 0x09, 0x08, 304 0x84, 0xa0, 0x0a, 0xd9, 0x45, 0xa0, 0xac, 0x80, 305 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86, 306 0x54, 0x73, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80, 307 }, 308 }, 309 { 310 .pixel_clock = 108000000, 311 .conf = { 312 0x01, 0x51, 0x2d, 0x15, 0x40, 0x01, 0x00, 0x08, 313 0x82, 0x80, 0x0e, 0xd9, 0x45, 0xa0, 0xac, 0x80, 314 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86, 315 0x54, 0xc7, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80, 316 }, 317 }, 318 { 319 .pixel_clock = 115500000, 320 .conf = { 321 0x01, 0xd1, 0x30, 0x12, 0x40, 0x40, 0x10, 0x08, 322 0x80, 0x80, 0x21, 0xd9, 0x45, 0xa0, 0xac, 0x80, 323 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86, 324 0x54, 0xaa, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80, 325 }, 326 }, 327 { 328 .pixel_clock = 119000000, 329 .conf = { 330 0x01, 0xd1, 0x32, 0x1a, 0x40, 0x30, 0xd8, 0x08, 331 0x04, 0xa0, 0x2a, 0xd9, 0x45, 0xa0, 0xac, 0x80, 332 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86, 333 0x54, 0x9d, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80, 334 }, 335 }, 336 { 337 .pixel_clock = 146250000, 338 .conf = { 339 0x01, 0xd1, 0x3d, 0x15, 0x40, 0x18, 0xfd, 0x08, 340 0x83, 0xa0, 0x6e, 0xd9, 0x45, 0xa0, 0xac, 0x80, 341 0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86, 342 0x54, 0x50, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80, 343 }, 344 }, 345 { 346 .pixel_clock = 148500000, 347 .conf = { 348 0x01, 0xd1, 0x1f, 0x00, 0x40, 0x40, 0xf8, 0x08, 349 0x81, 0xa0, 0xba, 0xd8, 0x45, 0xa0, 0xac, 0x80, 350 0x3c, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86, 351 0x54, 0x4b, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80, 352 }, 353 }, 354 }; 355 356 static const struct hdmiphy_config hdmiphy_5420_configs[] = { 357 { 358 .pixel_clock = 25200000, 359 .conf = { 360 0x01, 0x52, 0x3F, 0x55, 0x40, 0x01, 0x00, 0xC8, 361 0x82, 0xC8, 0xBD, 0xD8, 0x45, 0xA0, 0xAC, 0x80, 362 0x06, 0x80, 0x01, 0x84, 0x05, 0x02, 0x24, 0x66, 363 0x54, 0xF4, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80, 364 }, 365 }, 366 { 367 .pixel_clock = 27000000, 368 .conf = { 369 0x01, 0xD1, 0x22, 0x51, 0x40, 0x08, 0xFC, 0xE0, 370 0x98, 0xE8, 0xCB, 0xD8, 0x45, 0xA0, 0xAC, 0x80, 371 0x06, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66, 372 0x54, 0xE4, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80, 373 }, 374 }, 375 { 376 .pixel_clock = 27027000, 377 .conf = { 378 0x01, 0xD1, 0x2D, 0x72, 0x40, 0x64, 0x12, 0xC8, 379 0x43, 0xE8, 0x0E, 0xD9, 0x45, 0xA0, 0xAC, 0x80, 380 0x26, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66, 381 0x54, 0xE3, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80, 382 }, 383 }, 384 { 385 .pixel_clock = 36000000, 386 .conf = { 387 0x01, 0x51, 0x2D, 0x55, 0x40, 0x40, 0x00, 0xC8, 388 0x02, 0xC8, 0x0E, 0xD9, 0x45, 0xA0, 0xAC, 0x80, 389 0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66, 390 0x54, 0xAB, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80, 391 }, 392 }, 393 { 394 .pixel_clock = 40000000, 395 .conf = { 396 0x01, 0xD1, 0x21, 0x31, 0x40, 0x3C, 0x28, 0xC8, 397 0x87, 0xE8, 0xC8, 0xD8, 0x45, 0xA0, 0xAC, 0x80, 398 0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66, 399 0x54, 0x9A, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80, 400 }, 401 }, 402 { 403 .pixel_clock = 65000000, 404 .conf = { 405 0x01, 0xD1, 0x36, 0x34, 0x40, 0x0C, 0x04, 0xC8, 406 0x82, 0xE8, 0x45, 0xD9, 0x45, 0xA0, 0xAC, 0x80, 407 0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66, 408 0x54, 0xBD, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80, 409 }, 410 }, 411 { 412 .pixel_clock = 71000000, 413 .conf = { 414 0x01, 0xD1, 0x3B, 0x35, 0x40, 0x0C, 0x04, 0xC8, 415 0x85, 0xE8, 0x63, 0xD9, 0x45, 0xA0, 0xAC, 0x80, 416 0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66, 417 0x54, 0x57, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80, 418 }, 419 }, 420 { 421 .pixel_clock = 73250000, 422 .conf = { 423 0x01, 0xD1, 0x1F, 0x10, 0x40, 0x78, 0x8D, 0xC8, 424 0x81, 0xE8, 0xB7, 0xD8, 0x45, 0xA0, 0xAC, 0x80, 425 0x56, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66, 426 0x54, 0xA8, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80, 427 }, 428 }, 429 { 430 .pixel_clock = 74176000, 431 .conf = { 432 0x01, 0xD1, 0x1F, 0x10, 0x40, 0x5B, 0xEF, 0xC8, 433 0x81, 0xE8, 0xB9, 0xD8, 0x45, 0xA0, 0xAC, 0x80, 434 0x56, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66, 435 0x54, 0xA6, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80, 436 }, 437 }, 438 { 439 .pixel_clock = 74250000, 440 .conf = { 441 0x01, 0xD1, 0x1F, 0x10, 0x40, 0x40, 0xF8, 0x08, 442 0x81, 0xE8, 0xBA, 0xD8, 0x45, 0xA0, 0xAC, 0x80, 443 0x26, 0x80, 0x09, 0x84, 0x05, 0x22, 0x24, 0x66, 444 0x54, 0xA5, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80, 445 }, 446 }, 447 { 448 .pixel_clock = 83500000, 449 .conf = { 450 0x01, 0xD1, 0x23, 0x11, 0x40, 0x0C, 0xFB, 0xC8, 451 0x85, 0xE8, 0xD1, 0xD8, 0x45, 0xA0, 0xAC, 0x80, 452 0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66, 453 0x54, 0x4A, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80, 454 }, 455 }, 456 { 457 .pixel_clock = 88750000, 458 .conf = { 459 0x01, 0xD1, 0x25, 0x11, 0x40, 0x18, 0xFF, 0xC8, 460 0x83, 0xE8, 0xDE, 0xD8, 0x45, 0xA0, 0xAC, 0x80, 461 0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66, 462 0x54, 0x45, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80, 463 }, 464 }, 465 { 466 .pixel_clock = 106500000, 467 .conf = { 468 0x01, 0xD1, 0x2C, 0x12, 0x40, 0x0C, 0x09, 0xC8, 469 0x84, 0xE8, 0x0A, 0xD9, 0x45, 0xA0, 0xAC, 0x80, 470 0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66, 471 0x54, 0x73, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80, 472 }, 473 }, 474 { 475 .pixel_clock = 108000000, 476 .conf = { 477 0x01, 0x51, 0x2D, 0x15, 0x40, 0x01, 0x00, 0xC8, 478 0x82, 0xC8, 0x0E, 0xD9, 0x45, 0xA0, 0xAC, 0x80, 479 0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66, 480 0x54, 0xC7, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80, 481 }, 482 }, 483 { 484 .pixel_clock = 115500000, 485 .conf = { 486 0x01, 0xD1, 0x30, 0x14, 0x40, 0x0C, 0x03, 0xC8, 487 0x88, 0xE8, 0x21, 0xD9, 0x45, 0xA0, 0xAC, 0x80, 488 0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66, 489 0x54, 0x6A, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80, 490 }, 491 }, 492 { 493 .pixel_clock = 146250000, 494 .conf = { 495 0x01, 0xD1, 0x3D, 0x15, 0x40, 0x18, 0xFD, 0xC8, 496 0x83, 0xE8, 0x6E, 0xD9, 0x45, 0xA0, 0xAC, 0x80, 497 0x08, 0x80, 0x09, 0x84, 0x05, 0x02, 0x24, 0x66, 498 0x54, 0x54, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80, 499 }, 500 }, 501 { 502 .pixel_clock = 148500000, 503 .conf = { 504 0x01, 0xD1, 0x1F, 0x00, 0x40, 0x40, 0xF8, 0x08, 505 0x81, 0xE8, 0xBA, 0xD8, 0x45, 0xA0, 0xAC, 0x80, 506 0x26, 0x80, 0x09, 0x84, 0x05, 0x22, 0x24, 0x66, 507 0x54, 0x4B, 0x25, 0x03, 0x00, 0x80, 0x01, 0x80, 508 }, 509 }, 510 }; 511 512 static const struct hdmiphy_config hdmiphy_5433_configs[] = { 513 { 514 .pixel_clock = 27000000, 515 .conf = { 516 0x01, 0x51, 0x2d, 0x75, 0x01, 0x00, 0x88, 0x02, 517 0x72, 0x50, 0x44, 0x8c, 0x27, 0x00, 0x7c, 0xac, 518 0xd6, 0x2b, 0x67, 0x00, 0x00, 0x04, 0x00, 0x30, 519 0x08, 0x10, 0x01, 0x01, 0x48, 0x40, 0x00, 0x40, 520 }, 521 }, 522 { 523 .pixel_clock = 27027000, 524 .conf = { 525 0x01, 0x51, 0x2d, 0x72, 0x64, 0x09, 0x88, 0xc3, 526 0x71, 0x50, 0x44, 0x8c, 0x27, 0x00, 0x7c, 0xac, 527 0xd6, 0x2b, 0x67, 0x00, 0x00, 0x04, 0x00, 0x30, 528 0x08, 0x10, 0x01, 0x01, 0x48, 0x40, 0x00, 0x40, 529 }, 530 }, 531 { 532 .pixel_clock = 40000000, 533 .conf = { 534 0x01, 0x51, 0x32, 0x55, 0x01, 0x00, 0x88, 0x02, 535 0x4d, 0x50, 0x44, 0x8C, 0x27, 0x00, 0x7C, 0xAC, 536 0xD6, 0x2B, 0x67, 0x00, 0x00, 0x04, 0x00, 0x30, 537 0x08, 0x10, 0x01, 0x01, 0x48, 0x40, 0x00, 0x40, 538 }, 539 }, 540 { 541 .pixel_clock = 50000000, 542 .conf = { 543 0x01, 0x51, 0x34, 0x40, 0x64, 0x09, 0x88, 0xc3, 544 0x3d, 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, 547 }, 548 }, 549 { 550 .pixel_clock = 65000000, 551 .conf = { 552 0x01, 0x51, 0x36, 0x31, 0x40, 0x10, 0x04, 0xc6, 553 0x2e, 0xe8, 0x44, 0x8C, 0x27, 0x00, 0x7C, 0xAC, 554 0xD6, 0x2B, 0x67, 0x00, 0x00, 0x04, 0x00, 0x30, 555 0x08, 0x10, 0x01, 0x01, 0x48, 0x40, 0x00, 0x40, 556 }, 557 }, 558 { 559 .pixel_clock = 74176000, 560 .conf = { 561 0x01, 0x51, 0x3E, 0x35, 0x5B, 0xDE, 0x88, 0x42, 562 0x53, 0x51, 0x44, 0x8C, 0x27, 0x00, 0x7C, 0xAC, 563 0xD6, 0x2B, 0x67, 0x00, 0x00, 0x04, 0x00, 0x30, 564 0x08, 0x10, 0x01, 0x01, 0x48, 0x40, 0x00, 0x40, 565 }, 566 }, 567 { 568 .pixel_clock = 74250000, 569 .conf = { 570 0x01, 0x51, 0x3E, 0x35, 0x40, 0xF0, 0x88, 0xC2, 571 0x52, 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, 574 }, 575 }, 576 { 577 .pixel_clock = 108000000, 578 .conf = { 579 0x01, 0x51, 0x2d, 0x15, 0x01, 0x00, 0x88, 0x02, 580 0x72, 0x52, 0x44, 0x8C, 0x27, 0x00, 0x7C, 0xAC, 581 0xD6, 0x2B, 0x67, 0x00, 0x00, 0x04, 0x00, 0x30, 582 0x08, 0x10, 0x01, 0x01, 0x48, 0x40, 0x00, 0x40, 583 }, 584 }, 585 { 586 .pixel_clock = 148500000, 587 .conf = { 588 0x01, 0x51, 0x1f, 0x00, 0x40, 0xf8, 0x88, 0xc1, 589 0x52, 0x52, 0x24, 0x0c, 0x24, 0x0f, 0x7c, 0xa5, 590 0xd4, 0x2b, 0x87, 0x00, 0x00, 0x04, 0x00, 0x30, 591 0x08, 0x10, 0x01, 0x01, 0x48, 0x4a, 0x00, 0x40, 592 }, 593 }, 594 { 595 .pixel_clock = 297000000, 596 .conf = { 597 0x01, 0x51, 0x3E, 0x05, 0x40, 0xF0, 0x88, 0xC2, 598 0x52, 0x53, 0x44, 0x8C, 0x27, 0x00, 0x7C, 0xAC, 599 0xD6, 0x2B, 0x67, 0x00, 0x00, 0x04, 0x00, 0x30, 600 0x08, 0x10, 0x01, 0x01, 0x48, 0x40, 0x00, 0x40, 601 }, 602 }, 603 }; 604 605 static const char * const hdmi_clk_gates4[] = { 606 "hdmi", "sclk_hdmi" 607 }; 608 609 static const char * const hdmi_clk_muxes4[] = { 610 "sclk_pixel", "sclk_hdmiphy", "mout_hdmi" 611 }; 612 613 static const char * const hdmi_clk_gates5433[] = { 614 "hdmi_pclk", "hdmi_i_pclk", "i_tmds_clk", "i_pixel_clk", "i_spdif_clk" 615 }; 616 617 static const char * const hdmi_clk_muxes5433[] = { 618 "oscclk", "tmds_clko", "tmds_clko_user", 619 "oscclk", "pixel_clko", "pixel_clko_user" 620 }; 621 622 static const struct hdmi_driver_data exynos4210_hdmi_driver_data = { 623 .type = HDMI_TYPE13, 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), 627 }; 628 629 static const struct hdmi_driver_data exynos4212_hdmi_driver_data = { 630 .type = HDMI_TYPE14, 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), 634 }; 635 636 static const struct hdmi_driver_data exynos5420_hdmi_driver_data = { 637 .type = HDMI_TYPE14, 638 .is_apb_phy = 1, 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), 642 }; 643 644 static const struct hdmi_driver_data exynos5433_hdmi_driver_data = { 645 .type = HDMI_TYPE14, 646 .is_apb_phy = 1, 647 .has_sysreg = 1, 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), 651 }; 652 653 static inline u32 hdmi_map_reg(struct hdmi_context *hdata, u32 reg_id) 654 { 655 if ((reg_id & 0xffff0000) == HDMI_MAPPED_BASE) 656 return hdmi_reg_map[reg_id & 0xffff][hdata->drv_data->type]; 657 return reg_id; 658 } 659 660 static inline u32 hdmi_reg_read(struct hdmi_context *hdata, u32 reg_id) 661 { 662 return readl(hdata->regs + hdmi_map_reg(hdata, reg_id)); 663 } 664 665 static inline void hdmi_reg_writeb(struct hdmi_context *hdata, 666 u32 reg_id, u8 value) 667 { 668 writel(value, hdata->regs + hdmi_map_reg(hdata, reg_id)); 669 } 670 671 static inline void hdmi_reg_writev(struct hdmi_context *hdata, u32 reg_id, 672 int bytes, u32 val) 673 { 674 reg_id = hdmi_map_reg(hdata, reg_id); 675 676 while (--bytes >= 0) { 677 writel(val & 0xff, hdata->regs + reg_id); 678 val >>= 8; 679 reg_id += 4; 680 } 681 } 682 683 static inline void hdmi_reg_write_buf(struct hdmi_context *hdata, u32 reg_id, 684 u8 *buf, int size) 685 { 686 for (reg_id = hdmi_map_reg(hdata, reg_id); size; --size, reg_id += 4) 687 writel(*buf++, hdata->regs + reg_id); 688 } 689 690 static inline void hdmi_reg_writemask(struct hdmi_context *hdata, 691 u32 reg_id, u32 value, u32 mask) 692 { 693 u32 old; 694 695 reg_id = hdmi_map_reg(hdata, reg_id); 696 old = readl(hdata->regs + reg_id); 697 value = (value & mask) | (old & ~mask); 698 writel(value, hdata->regs + reg_id); 699 } 700 701 static int hdmiphy_reg_write_buf(struct hdmi_context *hdata, 702 u32 reg_offset, const u8 *buf, u32 len) 703 { 704 if ((reg_offset + len) > 32) 705 return -EINVAL; 706 707 if (hdata->hdmiphy_port) { 708 int ret; 709 710 ret = i2c_master_send(hdata->hdmiphy_port, buf, len); 711 if (ret == len) 712 return 0; 713 return ret; 714 } else { 715 int i; 716 for (i = 0; i < len; i++) 717 writel(buf[i], hdata->regs_hdmiphy + 718 ((reg_offset + i)<<2)); 719 return 0; 720 } 721 } 722 723 static int hdmi_clk_enable_gates(struct hdmi_context *hdata) 724 { 725 int i, ret; 726 727 for (i = 0; i < hdata->drv_data->clk_gates.count; ++i) { 728 ret = clk_prepare_enable(hdata->clk_gates[i]); 729 if (!ret) 730 continue; 731 732 dev_err(hdata->dev, "Cannot enable clock '%s', %d\n", 733 hdata->drv_data->clk_gates.data[i], ret); 734 while (i--) 735 clk_disable_unprepare(hdata->clk_gates[i]); 736 return ret; 737 } 738 739 return 0; 740 } 741 742 static void hdmi_clk_disable_gates(struct hdmi_context *hdata) 743 { 744 int i = hdata->drv_data->clk_gates.count; 745 746 while (i--) 747 clk_disable_unprepare(hdata->clk_gates[i]); 748 } 749 750 static int hdmi_clk_set_parents(struct hdmi_context *hdata, bool to_phy) 751 { 752 struct device *dev = hdata->dev; 753 int ret = 0; 754 int i; 755 756 for (i = 0; i < hdata->drv_data->clk_muxes.count; i += 3) { 757 struct clk **c = &hdata->clk_muxes[i]; 758 759 ret = clk_set_parent(c[2], c[to_phy]); 760 if (!ret) 761 continue; 762 763 dev_err(dev, "Cannot set clock parent of '%s' to '%s', %d\n", 764 hdata->drv_data->clk_muxes.data[i + 2], 765 hdata->drv_data->clk_muxes.data[i + to_phy], ret); 766 } 767 768 return ret; 769 } 770 771 static void hdmi_reg_infoframes(struct hdmi_context *hdata) 772 { 773 union hdmi_infoframe frm; 774 u8 buf[25]; 775 int ret; 776 777 if (hdata->dvi_mode) { 778 hdmi_reg_writeb(hdata, HDMI_AVI_CON, 779 HDMI_AVI_CON_DO_NOT_TRANSMIT); 780 hdmi_reg_writeb(hdata, HDMI_VSI_CON, 781 HDMI_VSI_CON_DO_NOT_TRANSMIT); 782 hdmi_reg_writeb(hdata, HDMI_AUI_CON, HDMI_AUI_CON_NO_TRAN); 783 return; 784 } 785 786 ret = drm_hdmi_avi_infoframe_from_display_mode(&frm.avi, 787 &hdata->current_mode, false); 788 if (!ret) 789 ret = hdmi_avi_infoframe_pack(&frm.avi, buf, sizeof(buf)); 790 if (ret > 0) { 791 hdmi_reg_writeb(hdata, HDMI_AVI_CON, HDMI_AVI_CON_EVERY_VSYNC); 792 hdmi_reg_write_buf(hdata, HDMI_AVI_HEADER0, buf, ret); 793 } else { 794 DRM_INFO("%s: invalid AVI infoframe (%d)\n", __func__, ret); 795 } 796 797 ret = drm_hdmi_vendor_infoframe_from_display_mode(&frm.vendor.hdmi, 798 &hdata->current_mode); 799 if (!ret) 800 ret = hdmi_vendor_infoframe_pack(&frm.vendor.hdmi, buf, 801 sizeof(buf)); 802 if (ret > 0) { 803 hdmi_reg_writeb(hdata, HDMI_VSI_CON, HDMI_VSI_CON_EVERY_VSYNC); 804 hdmi_reg_write_buf(hdata, HDMI_VSI_HEADER0, buf, 3); 805 hdmi_reg_write_buf(hdata, HDMI_VSI_DATA(0), buf + 3, ret - 3); 806 } 807 808 ret = hdmi_audio_infoframe_init(&frm.audio); 809 if (!ret) { 810 frm.audio.channels = 2; 811 ret = hdmi_audio_infoframe_pack(&frm.audio, buf, sizeof(buf)); 812 } 813 if (ret > 0) { 814 hdmi_reg_writeb(hdata, HDMI_AUI_CON, HDMI_AUI_CON_EVERY_VSYNC); 815 hdmi_reg_write_buf(hdata, HDMI_AUI_HEADER0, buf, ret); 816 } 817 } 818 819 static enum drm_connector_status hdmi_detect(struct drm_connector *connector, 820 bool force) 821 { 822 struct hdmi_context *hdata = connector_to_hdmi(connector); 823 824 if (gpiod_get_value(hdata->hpd_gpio)) 825 return connector_status_connected; 826 827 cec_notifier_set_phys_addr(hdata->notifier, CEC_PHYS_ADDR_INVALID); 828 return connector_status_disconnected; 829 } 830 831 static void hdmi_connector_destroy(struct drm_connector *connector) 832 { 833 drm_connector_unregister(connector); 834 drm_connector_cleanup(connector); 835 } 836 837 static const struct drm_connector_funcs hdmi_connector_funcs = { 838 .fill_modes = drm_helper_probe_single_connector_modes, 839 .detect = hdmi_detect, 840 .destroy = hdmi_connector_destroy, 841 .reset = drm_atomic_helper_connector_reset, 842 .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, 843 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, 844 }; 845 846 static int hdmi_get_modes(struct drm_connector *connector) 847 { 848 struct hdmi_context *hdata = connector_to_hdmi(connector); 849 struct edid *edid; 850 int ret; 851 852 if (!hdata->ddc_adpt) 853 return -ENODEV; 854 855 edid = drm_get_edid(connector, hdata->ddc_adpt); 856 if (!edid) 857 return -ENODEV; 858 859 hdata->dvi_mode = !drm_detect_hdmi_monitor(edid); 860 DRM_DEBUG_KMS("%s : width[%d] x height[%d]\n", 861 (hdata->dvi_mode ? "dvi monitor" : "hdmi monitor"), 862 edid->width_cm, edid->height_cm); 863 864 drm_mode_connector_update_edid_property(connector, edid); 865 cec_notifier_set_phys_addr_from_edid(hdata->notifier, edid); 866 867 ret = drm_add_edid_modes(connector, edid); 868 869 kfree(edid); 870 871 return ret; 872 } 873 874 static int hdmi_find_phy_conf(struct hdmi_context *hdata, u32 pixel_clock) 875 { 876 const struct hdmiphy_configs *confs = &hdata->drv_data->phy_confs; 877 int i; 878 879 for (i = 0; i < confs->count; i++) 880 if (confs->data[i].pixel_clock == pixel_clock) 881 return i; 882 883 DRM_DEBUG_KMS("Could not find phy config for %d\n", pixel_clock); 884 return -EINVAL; 885 } 886 887 static int hdmi_mode_valid(struct drm_connector *connector, 888 struct drm_display_mode *mode) 889 { 890 struct hdmi_context *hdata = connector_to_hdmi(connector); 891 int ret; 892 893 DRM_DEBUG_KMS("xres=%d, yres=%d, refresh=%d, intl=%d clock=%d\n", 894 mode->hdisplay, mode->vdisplay, mode->vrefresh, 895 (mode->flags & DRM_MODE_FLAG_INTERLACE) ? true : 896 false, mode->clock * 1000); 897 898 ret = hdmi_find_phy_conf(hdata, mode->clock * 1000); 899 if (ret < 0) 900 return MODE_BAD; 901 902 return MODE_OK; 903 } 904 905 static const struct drm_connector_helper_funcs hdmi_connector_helper_funcs = { 906 .get_modes = hdmi_get_modes, 907 .mode_valid = hdmi_mode_valid, 908 }; 909 910 static int hdmi_create_connector(struct drm_encoder *encoder) 911 { 912 struct hdmi_context *hdata = encoder_to_hdmi(encoder); 913 struct drm_connector *connector = &hdata->connector; 914 int ret; 915 916 connector->interlace_allowed = true; 917 connector->polled = DRM_CONNECTOR_POLL_HPD; 918 919 ret = drm_connector_init(hdata->drm_dev, connector, 920 &hdmi_connector_funcs, DRM_MODE_CONNECTOR_HDMIA); 921 if (ret) { 922 DRM_ERROR("Failed to initialize connector with drm\n"); 923 return ret; 924 } 925 926 drm_connector_helper_add(connector, &hdmi_connector_helper_funcs); 927 drm_mode_connector_attach_encoder(connector, encoder); 928 929 if (hdata->bridge) { 930 encoder->bridge = hdata->bridge; 931 hdata->bridge->encoder = encoder; 932 ret = drm_bridge_attach(encoder, hdata->bridge, NULL); 933 if (ret) 934 DRM_ERROR("Failed to attach bridge\n"); 935 } 936 937 return ret; 938 } 939 940 static bool hdmi_mode_fixup(struct drm_encoder *encoder, 941 const struct drm_display_mode *mode, 942 struct drm_display_mode *adjusted_mode) 943 { 944 struct drm_device *dev = encoder->dev; 945 struct drm_connector *connector; 946 struct drm_display_mode *m; 947 struct drm_connector_list_iter conn_iter; 948 int mode_ok; 949 950 drm_mode_set_crtcinfo(adjusted_mode, 0); 951 952 drm_connector_list_iter_begin(dev, &conn_iter); 953 drm_for_each_connector_iter(connector, &conn_iter) { 954 if (connector->encoder == encoder) 955 break; 956 } 957 if (connector) 958 drm_connector_get(connector); 959 drm_connector_list_iter_end(&conn_iter); 960 961 if (!connector) 962 return true; 963 964 mode_ok = hdmi_mode_valid(connector, adjusted_mode); 965 966 if (mode_ok == MODE_OK) 967 goto cleanup; 968 969 /* 970 * Find the most suitable mode and copy it to adjusted_mode. 971 */ 972 list_for_each_entry(m, &connector->modes, head) { 973 mode_ok = hdmi_mode_valid(connector, m); 974 975 if (mode_ok == MODE_OK) { 976 DRM_INFO("desired mode doesn't exist so\n"); 977 DRM_INFO("use the most suitable mode among modes.\n"); 978 979 DRM_DEBUG_KMS("Adjusted Mode: [%d]x[%d] [%d]Hz\n", 980 m->hdisplay, m->vdisplay, m->vrefresh); 981 982 drm_mode_copy(adjusted_mode, m); 983 break; 984 } 985 } 986 987 cleanup: 988 drm_connector_put(connector); 989 990 return true; 991 } 992 993 static void hdmi_reg_acr(struct hdmi_context *hdata, u32 freq) 994 { 995 u32 n, cts; 996 997 cts = (freq % 9) ? 27000 : 30000; 998 n = 128 * freq / (27000000 / cts); 999 1000 hdmi_reg_writev(hdata, HDMI_ACR_N0, 3, n); 1001 hdmi_reg_writev(hdata, HDMI_ACR_MCTS0, 3, cts); 1002 hdmi_reg_writev(hdata, HDMI_ACR_CTS0, 3, cts); 1003 hdmi_reg_writeb(hdata, HDMI_ACR_CON, 4); 1004 } 1005 1006 static void hdmi_audio_init(struct hdmi_context *hdata) 1007 { 1008 u32 sample_rate, bits_per_sample; 1009 u32 data_num, bit_ch, sample_frq; 1010 u32 val; 1011 1012 sample_rate = 44100; 1013 bits_per_sample = 16; 1014 1015 switch (bits_per_sample) { 1016 case 20: 1017 data_num = 2; 1018 bit_ch = 1; 1019 break; 1020 case 24: 1021 data_num = 3; 1022 bit_ch = 1; 1023 break; 1024 default: 1025 data_num = 1; 1026 bit_ch = 0; 1027 break; 1028 } 1029 1030 hdmi_reg_acr(hdata, sample_rate); 1031 1032 hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CON, HDMI_I2S_IN_DISABLE 1033 | HDMI_I2S_AUD_I2S | HDMI_I2S_CUV_I2S_ENABLE 1034 | HDMI_I2S_MUX_ENABLE); 1035 1036 hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CH, HDMI_I2S_CH0_EN 1037 | HDMI_I2S_CH1_EN | HDMI_I2S_CH2_EN); 1038 1039 hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CUV, HDMI_I2S_CUV_RL_EN); 1040 1041 sample_frq = (sample_rate == 44100) ? 0 : 1042 (sample_rate == 48000) ? 2 : 1043 (sample_rate == 32000) ? 3 : 1044 (sample_rate == 96000) ? 0xa : 0x0; 1045 1046 hdmi_reg_writeb(hdata, HDMI_I2S_CLK_CON, HDMI_I2S_CLK_DIS); 1047 hdmi_reg_writeb(hdata, HDMI_I2S_CLK_CON, HDMI_I2S_CLK_EN); 1048 1049 val = hdmi_reg_read(hdata, HDMI_I2S_DSD_CON) | 0x01; 1050 hdmi_reg_writeb(hdata, HDMI_I2S_DSD_CON, val); 1051 1052 /* Configuration I2S input ports. Configure I2S_PIN_SEL_0~4 */ 1053 hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_0, HDMI_I2S_SEL_SCLK(5) 1054 | HDMI_I2S_SEL_LRCK(6)); 1055 hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_1, HDMI_I2S_SEL_SDATA1(1) 1056 | HDMI_I2S_SEL_SDATA2(4)); 1057 hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_2, HDMI_I2S_SEL_SDATA3(1) 1058 | HDMI_I2S_SEL_SDATA2(2)); 1059 hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_3, HDMI_I2S_SEL_DSD(0)); 1060 1061 /* I2S_CON_1 & 2 */ 1062 hdmi_reg_writeb(hdata, HDMI_I2S_CON_1, HDMI_I2S_SCLK_FALLING_EDGE 1063 | HDMI_I2S_L_CH_LOW_POL); 1064 hdmi_reg_writeb(hdata, HDMI_I2S_CON_2, HDMI_I2S_MSB_FIRST_MODE 1065 | HDMI_I2S_SET_BIT_CH(bit_ch) 1066 | HDMI_I2S_SET_SDATA_BIT(data_num) 1067 | HDMI_I2S_BASIC_FORMAT); 1068 1069 /* Configure register related to CUV information */ 1070 hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_0, HDMI_I2S_CH_STATUS_MODE_0 1071 | HDMI_I2S_2AUD_CH_WITHOUT_PREEMPH 1072 | HDMI_I2S_COPYRIGHT 1073 | HDMI_I2S_LINEAR_PCM 1074 | HDMI_I2S_CONSUMER_FORMAT); 1075 hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_1, HDMI_I2S_CD_PLAYER); 1076 hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_2, HDMI_I2S_SET_SOURCE_NUM(0)); 1077 hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_3, HDMI_I2S_CLK_ACCUR_LEVEL_2 1078 | HDMI_I2S_SET_SMP_FREQ(sample_frq)); 1079 hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_4, 1080 HDMI_I2S_ORG_SMP_FREQ_44_1 1081 | HDMI_I2S_WORD_LEN_MAX24_24BITS 1082 | HDMI_I2S_WORD_LEN_MAX_24BITS); 1083 1084 hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_CON, HDMI_I2S_CH_STATUS_RELOAD); 1085 } 1086 1087 static void hdmi_audio_control(struct hdmi_context *hdata, bool onoff) 1088 { 1089 if (hdata->dvi_mode) 1090 return; 1091 1092 hdmi_reg_writeb(hdata, HDMI_AUI_CON, onoff ? 2 : 0); 1093 hdmi_reg_writemask(hdata, HDMI_CON_0, onoff ? 1094 HDMI_ASP_EN : HDMI_ASP_DIS, HDMI_ASP_MASK); 1095 } 1096 1097 static void hdmi_start(struct hdmi_context *hdata, bool start) 1098 { 1099 u32 val = start ? HDMI_TG_EN : 0; 1100 1101 if (hdata->current_mode.flags & DRM_MODE_FLAG_INTERLACE) 1102 val |= HDMI_FIELD_EN; 1103 1104 hdmi_reg_writemask(hdata, HDMI_CON_0, val, HDMI_EN); 1105 hdmi_reg_writemask(hdata, HDMI_TG_CMD, val, HDMI_TG_EN | HDMI_FIELD_EN); 1106 } 1107 1108 static void hdmi_conf_init(struct hdmi_context *hdata) 1109 { 1110 /* disable HPD interrupts from HDMI IP block, use GPIO instead */ 1111 hdmi_reg_writemask(hdata, HDMI_INTC_CON, 0, HDMI_INTC_EN_GLOBAL | 1112 HDMI_INTC_EN_HPD_PLUG | HDMI_INTC_EN_HPD_UNPLUG); 1113 1114 /* choose HDMI mode */ 1115 hdmi_reg_writemask(hdata, HDMI_MODE_SEL, 1116 HDMI_MODE_HDMI_EN, HDMI_MODE_MASK); 1117 /* apply video pre-amble and guard band in HDMI mode only */ 1118 hdmi_reg_writeb(hdata, HDMI_CON_2, 0); 1119 /* disable bluescreen */ 1120 hdmi_reg_writemask(hdata, HDMI_CON_0, 0, HDMI_BLUE_SCR_EN); 1121 1122 if (hdata->dvi_mode) { 1123 hdmi_reg_writemask(hdata, HDMI_MODE_SEL, 1124 HDMI_MODE_DVI_EN, HDMI_MODE_MASK); 1125 hdmi_reg_writeb(hdata, HDMI_CON_2, 1126 HDMI_VID_PREAMBLE_DIS | HDMI_GUARD_BAND_DIS); 1127 } 1128 1129 if (hdata->drv_data->type == HDMI_TYPE13) { 1130 /* choose bluescreen (fecal) color */ 1131 hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_0, 0x12); 1132 hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_1, 0x34); 1133 hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_2, 0x56); 1134 1135 /* enable AVI packet every vsync, fixes purple line problem */ 1136 hdmi_reg_writeb(hdata, HDMI_V13_AVI_CON, 0x02); 1137 /* force RGB, look to CEA-861-D, table 7 for more detail */ 1138 hdmi_reg_writeb(hdata, HDMI_V13_AVI_BYTE(0), 0 << 5); 1139 hdmi_reg_writemask(hdata, HDMI_CON_1, 0x10 << 5, 0x11 << 5); 1140 1141 hdmi_reg_writeb(hdata, HDMI_V13_SPD_CON, 0x02); 1142 hdmi_reg_writeb(hdata, HDMI_V13_AUI_CON, 0x02); 1143 hdmi_reg_writeb(hdata, HDMI_V13_ACR_CON, 0x04); 1144 } else { 1145 hdmi_reg_infoframes(hdata); 1146 1147 /* enable AVI packet every vsync, fixes purple line problem */ 1148 hdmi_reg_writemask(hdata, HDMI_CON_1, 2, 3 << 5); 1149 } 1150 } 1151 1152 static void hdmiphy_wait_for_pll(struct hdmi_context *hdata) 1153 { 1154 int tries; 1155 1156 for (tries = 0; tries < 10; ++tries) { 1157 u32 val = hdmi_reg_read(hdata, HDMI_PHY_STATUS); 1158 1159 if (val & HDMI_PHY_STATUS_READY) { 1160 DRM_DEBUG_KMS("PLL stabilized after %d tries\n", tries); 1161 return; 1162 } 1163 usleep_range(10, 20); 1164 } 1165 1166 DRM_ERROR("PLL could not reach steady state\n"); 1167 } 1168 1169 static void hdmi_v13_mode_apply(struct hdmi_context *hdata) 1170 { 1171 struct drm_display_mode *m = &hdata->current_mode; 1172 unsigned int val; 1173 1174 hdmi_reg_writev(hdata, HDMI_H_BLANK_0, 2, m->htotal - m->hdisplay); 1175 hdmi_reg_writev(hdata, HDMI_V13_H_V_LINE_0, 3, 1176 (m->htotal << 12) | m->vtotal); 1177 1178 val = (m->flags & DRM_MODE_FLAG_NVSYNC) ? 1 : 0; 1179 hdmi_reg_writev(hdata, HDMI_VSYNC_POL, 1, val); 1180 1181 val = (m->flags & DRM_MODE_FLAG_INTERLACE) ? 1 : 0; 1182 hdmi_reg_writev(hdata, HDMI_INT_PRO_MODE, 1, val); 1183 1184 val = (m->hsync_start - m->hdisplay - 2); 1185 val |= ((m->hsync_end - m->hdisplay - 2) << 10); 1186 val |= ((m->flags & DRM_MODE_FLAG_NHSYNC) ? 1 : 0)<<20; 1187 hdmi_reg_writev(hdata, HDMI_V13_H_SYNC_GEN_0, 3, val); 1188 1189 /* 1190 * Quirk requirement for exynos HDMI IP design, 1191 * 2 pixels less than the actual calculation for hsync_start 1192 * and end. 1193 */ 1194 1195 /* Following values & calculations differ for different type of modes */ 1196 if (m->flags & DRM_MODE_FLAG_INTERLACE) { 1197 val = ((m->vsync_end - m->vdisplay) / 2); 1198 val |= ((m->vsync_start - m->vdisplay) / 2) << 12; 1199 hdmi_reg_writev(hdata, HDMI_V13_V_SYNC_GEN_1_0, 3, val); 1200 1201 val = m->vtotal / 2; 1202 val |= ((m->vtotal - m->vdisplay) / 2) << 11; 1203 hdmi_reg_writev(hdata, HDMI_V13_V_BLANK_0, 3, val); 1204 1205 val = (m->vtotal + 1206 ((m->vsync_end - m->vsync_start) * 4) + 5) / 2; 1207 val |= m->vtotal << 11; 1208 hdmi_reg_writev(hdata, HDMI_V13_V_BLANK_F_0, 3, val); 1209 1210 val = ((m->vtotal / 2) + 7); 1211 val |= ((m->vtotal / 2) + 2) << 12; 1212 hdmi_reg_writev(hdata, HDMI_V13_V_SYNC_GEN_2_0, 3, val); 1213 1214 val = ((m->htotal / 2) + (m->hsync_start - m->hdisplay)); 1215 val |= ((m->htotal / 2) + 1216 (m->hsync_start - m->hdisplay)) << 12; 1217 hdmi_reg_writev(hdata, HDMI_V13_V_SYNC_GEN_3_0, 3, val); 1218 1219 hdmi_reg_writev(hdata, HDMI_TG_VACT_ST_L, 2, 1220 (m->vtotal - m->vdisplay) / 2); 1221 hdmi_reg_writev(hdata, HDMI_TG_VACT_SZ_L, 2, m->vdisplay / 2); 1222 1223 hdmi_reg_writev(hdata, HDMI_TG_VACT_ST2_L, 2, 0x249); 1224 } else { 1225 val = m->vtotal; 1226 val |= (m->vtotal - m->vdisplay) << 11; 1227 hdmi_reg_writev(hdata, HDMI_V13_V_BLANK_0, 3, val); 1228 1229 hdmi_reg_writev(hdata, HDMI_V13_V_BLANK_F_0, 3, 0); 1230 1231 val = (m->vsync_end - m->vdisplay); 1232 val |= ((m->vsync_start - m->vdisplay) << 12); 1233 hdmi_reg_writev(hdata, HDMI_V13_V_SYNC_GEN_1_0, 3, val); 1234 1235 hdmi_reg_writev(hdata, HDMI_V13_V_SYNC_GEN_2_0, 3, 0x1001); 1236 hdmi_reg_writev(hdata, HDMI_V13_V_SYNC_GEN_3_0, 3, 0x1001); 1237 hdmi_reg_writev(hdata, HDMI_TG_VACT_ST_L, 2, 1238 m->vtotal - m->vdisplay); 1239 hdmi_reg_writev(hdata, HDMI_TG_VACT_SZ_L, 2, m->vdisplay); 1240 } 1241 1242 hdmi_reg_writev(hdata, HDMI_TG_H_FSZ_L, 2, m->htotal); 1243 hdmi_reg_writev(hdata, HDMI_TG_HACT_ST_L, 2, m->htotal - m->hdisplay); 1244 hdmi_reg_writev(hdata, HDMI_TG_HACT_SZ_L, 2, m->hdisplay); 1245 hdmi_reg_writev(hdata, HDMI_TG_V_FSZ_L, 2, m->vtotal); 1246 } 1247 1248 static void hdmi_v14_mode_apply(struct hdmi_context *hdata) 1249 { 1250 struct drm_display_mode *m = &hdata->current_mode; 1251 1252 hdmi_reg_writev(hdata, HDMI_H_BLANK_0, 2, m->htotal - m->hdisplay); 1253 hdmi_reg_writev(hdata, HDMI_V_LINE_0, 2, m->vtotal); 1254 hdmi_reg_writev(hdata, HDMI_H_LINE_0, 2, m->htotal); 1255 hdmi_reg_writev(hdata, HDMI_HSYNC_POL, 1, 1256 (m->flags & DRM_MODE_FLAG_NHSYNC) ? 1 : 0); 1257 hdmi_reg_writev(hdata, HDMI_VSYNC_POL, 1, 1258 (m->flags & DRM_MODE_FLAG_NVSYNC) ? 1 : 0); 1259 hdmi_reg_writev(hdata, HDMI_INT_PRO_MODE, 1, 1260 (m->flags & DRM_MODE_FLAG_INTERLACE) ? 1 : 0); 1261 1262 /* 1263 * Quirk requirement for exynos 5 HDMI IP design, 1264 * 2 pixels less than the actual calculation for hsync_start 1265 * and end. 1266 */ 1267 1268 /* Following values & calculations differ for different type of modes */ 1269 if (m->flags & DRM_MODE_FLAG_INTERLACE) { 1270 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_BEF_2_0, 2, 1271 (m->vsync_end - m->vdisplay) / 2); 1272 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_BEF_1_0, 2, 1273 (m->vsync_start - m->vdisplay) / 2); 1274 hdmi_reg_writev(hdata, HDMI_V2_BLANK_0, 2, m->vtotal / 2); 1275 hdmi_reg_writev(hdata, HDMI_V1_BLANK_0, 2, 1276 (m->vtotal - m->vdisplay) / 2); 1277 hdmi_reg_writev(hdata, HDMI_V_BLANK_F0_0, 2, 1278 m->vtotal - m->vdisplay / 2); 1279 hdmi_reg_writev(hdata, HDMI_V_BLANK_F1_0, 2, m->vtotal); 1280 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_2_0, 2, 1281 (m->vtotal / 2) + 7); 1282 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_1_0, 2, 1283 (m->vtotal / 2) + 2); 1284 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_2_0, 2, 1285 (m->htotal / 2) + (m->hsync_start - m->hdisplay)); 1286 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_1_0, 2, 1287 (m->htotal / 2) + (m->hsync_start - m->hdisplay)); 1288 hdmi_reg_writev(hdata, HDMI_TG_VACT_ST_L, 2, 1289 (m->vtotal - m->vdisplay) / 2); 1290 hdmi_reg_writev(hdata, HDMI_TG_VACT_SZ_L, 2, m->vdisplay / 2); 1291 hdmi_reg_writev(hdata, HDMI_TG_VACT_ST2_L, 2, 1292 m->vtotal - m->vdisplay / 2); 1293 hdmi_reg_writev(hdata, HDMI_TG_VSYNC2_L, 2, 1294 (m->vtotal / 2) + 1); 1295 hdmi_reg_writev(hdata, HDMI_TG_VSYNC_BOT_HDMI_L, 2, 1296 (m->vtotal / 2) + 1); 1297 hdmi_reg_writev(hdata, HDMI_TG_FIELD_BOT_HDMI_L, 2, 1298 (m->vtotal / 2) + 1); 1299 hdmi_reg_writev(hdata, HDMI_TG_VACT_ST3_L, 2, 0x0); 1300 hdmi_reg_writev(hdata, HDMI_TG_VACT_ST4_L, 2, 0x0); 1301 } else { 1302 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_BEF_2_0, 2, 1303 m->vsync_end - m->vdisplay); 1304 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_BEF_1_0, 2, 1305 m->vsync_start - m->vdisplay); 1306 hdmi_reg_writev(hdata, HDMI_V2_BLANK_0, 2, m->vtotal); 1307 hdmi_reg_writev(hdata, HDMI_V1_BLANK_0, 2, 1308 m->vtotal - m->vdisplay); 1309 hdmi_reg_writev(hdata, HDMI_V_BLANK_F0_0, 2, 0xffff); 1310 hdmi_reg_writev(hdata, HDMI_V_BLANK_F1_0, 2, 0xffff); 1311 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_2_0, 2, 0xffff); 1312 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_1_0, 2, 0xffff); 1313 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_2_0, 2, 0xffff); 1314 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_1_0, 2, 0xffff); 1315 hdmi_reg_writev(hdata, HDMI_TG_VACT_ST_L, 2, 1316 m->vtotal - m->vdisplay); 1317 hdmi_reg_writev(hdata, HDMI_TG_VACT_SZ_L, 2, m->vdisplay); 1318 } 1319 1320 hdmi_reg_writev(hdata, HDMI_H_SYNC_START_0, 2, 1321 m->hsync_start - m->hdisplay - 2); 1322 hdmi_reg_writev(hdata, HDMI_H_SYNC_END_0, 2, 1323 m->hsync_end - m->hdisplay - 2); 1324 hdmi_reg_writev(hdata, HDMI_VACT_SPACE_1_0, 2, 0xffff); 1325 hdmi_reg_writev(hdata, HDMI_VACT_SPACE_2_0, 2, 0xffff); 1326 hdmi_reg_writev(hdata, HDMI_VACT_SPACE_3_0, 2, 0xffff); 1327 hdmi_reg_writev(hdata, HDMI_VACT_SPACE_4_0, 2, 0xffff); 1328 hdmi_reg_writev(hdata, HDMI_VACT_SPACE_5_0, 2, 0xffff); 1329 hdmi_reg_writev(hdata, HDMI_VACT_SPACE_6_0, 2, 0xffff); 1330 hdmi_reg_writev(hdata, HDMI_V_BLANK_F2_0, 2, 0xffff); 1331 hdmi_reg_writev(hdata, HDMI_V_BLANK_F3_0, 2, 0xffff); 1332 hdmi_reg_writev(hdata, HDMI_V_BLANK_F4_0, 2, 0xffff); 1333 hdmi_reg_writev(hdata, HDMI_V_BLANK_F5_0, 2, 0xffff); 1334 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_3_0, 2, 0xffff); 1335 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_4_0, 2, 0xffff); 1336 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_5_0, 2, 0xffff); 1337 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_6_0, 2, 0xffff); 1338 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_3_0, 2, 0xffff); 1339 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_4_0, 2, 0xffff); 1340 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_5_0, 2, 0xffff); 1341 hdmi_reg_writev(hdata, HDMI_V_SYNC_LINE_AFT_PXL_6_0, 2, 0xffff); 1342 1343 hdmi_reg_writev(hdata, HDMI_TG_H_FSZ_L, 2, m->htotal); 1344 hdmi_reg_writev(hdata, HDMI_TG_HACT_ST_L, 2, m->htotal - m->hdisplay); 1345 hdmi_reg_writev(hdata, HDMI_TG_HACT_SZ_L, 2, m->hdisplay); 1346 hdmi_reg_writev(hdata, HDMI_TG_V_FSZ_L, 2, m->vtotal); 1347 if (hdata->drv_data == &exynos5433_hdmi_driver_data) 1348 hdmi_reg_writeb(hdata, HDMI_TG_DECON_EN, 1); 1349 } 1350 1351 static void hdmi_mode_apply(struct hdmi_context *hdata) 1352 { 1353 if (hdata->drv_data->type == HDMI_TYPE13) 1354 hdmi_v13_mode_apply(hdata); 1355 else 1356 hdmi_v14_mode_apply(hdata); 1357 1358 hdmi_start(hdata, true); 1359 } 1360 1361 static void hdmiphy_conf_reset(struct hdmi_context *hdata) 1362 { 1363 hdmi_reg_writemask(hdata, HDMI_CORE_RSTOUT, 0, 1); 1364 usleep_range(10000, 12000); 1365 hdmi_reg_writemask(hdata, HDMI_CORE_RSTOUT, ~0, 1); 1366 usleep_range(10000, 12000); 1367 hdmi_reg_writemask(hdata, HDMI_PHY_RSTOUT, ~0, HDMI_PHY_SW_RSTOUT); 1368 usleep_range(10000, 12000); 1369 hdmi_reg_writemask(hdata, HDMI_PHY_RSTOUT, 0, HDMI_PHY_SW_RSTOUT); 1370 usleep_range(10000, 12000); 1371 } 1372 1373 static void hdmiphy_enable_mode_set(struct hdmi_context *hdata, bool enable) 1374 { 1375 u8 v = enable ? HDMI_PHY_ENABLE_MODE_SET : HDMI_PHY_DISABLE_MODE_SET; 1376 1377 if (hdata->drv_data == &exynos5433_hdmi_driver_data) 1378 writel(v, hdata->regs_hdmiphy + HDMIPHY5433_MODE_SET_DONE); 1379 } 1380 1381 static void hdmiphy_conf_apply(struct hdmi_context *hdata) 1382 { 1383 int ret; 1384 const u8 *phy_conf; 1385 1386 ret = hdmi_find_phy_conf(hdata, hdata->current_mode.clock * 1000); 1387 if (ret < 0) { 1388 DRM_ERROR("failed to find hdmiphy conf\n"); 1389 return; 1390 } 1391 phy_conf = hdata->drv_data->phy_confs.data[ret].conf; 1392 1393 hdmi_clk_set_parents(hdata, false); 1394 1395 hdmiphy_conf_reset(hdata); 1396 1397 hdmiphy_enable_mode_set(hdata, true); 1398 ret = hdmiphy_reg_write_buf(hdata, 0, phy_conf, 32); 1399 if (ret) { 1400 DRM_ERROR("failed to configure hdmiphy\n"); 1401 return; 1402 } 1403 hdmiphy_enable_mode_set(hdata, false); 1404 hdmi_clk_set_parents(hdata, true); 1405 usleep_range(10000, 12000); 1406 hdmiphy_wait_for_pll(hdata); 1407 } 1408 1409 static void hdmi_conf_apply(struct hdmi_context *hdata) 1410 { 1411 hdmi_start(hdata, false); 1412 hdmi_conf_init(hdata); 1413 hdmi_audio_init(hdata); 1414 hdmi_mode_apply(hdata); 1415 hdmi_audio_control(hdata, true); 1416 } 1417 1418 static void hdmi_mode_set(struct drm_encoder *encoder, 1419 struct drm_display_mode *mode, 1420 struct drm_display_mode *adjusted_mode) 1421 { 1422 struct hdmi_context *hdata = encoder_to_hdmi(encoder); 1423 struct drm_display_mode *m = adjusted_mode; 1424 1425 DRM_DEBUG_KMS("xres=%d, yres=%d, refresh=%d, intl=%s\n", 1426 m->hdisplay, m->vdisplay, 1427 m->vrefresh, (m->flags & DRM_MODE_FLAG_INTERLACE) ? 1428 "INTERLACED" : "PROGRESSIVE"); 1429 1430 drm_mode_copy(&hdata->current_mode, m); 1431 } 1432 1433 static void hdmi_set_refclk(struct hdmi_context *hdata, bool on) 1434 { 1435 if (!hdata->sysreg) 1436 return; 1437 1438 regmap_update_bits(hdata->sysreg, EXYNOS5433_SYSREG_DISP_HDMI_PHY, 1439 SYSREG_HDMI_REFCLK_INT_CLK, on ? ~0 : 0); 1440 } 1441 1442 static void hdmiphy_enable(struct hdmi_context *hdata) 1443 { 1444 if (hdata->powered) 1445 return; 1446 1447 pm_runtime_get_sync(hdata->dev); 1448 1449 if (regulator_bulk_enable(ARRAY_SIZE(supply), hdata->regul_bulk)) 1450 DRM_DEBUG_KMS("failed to enable regulator bulk\n"); 1451 1452 regmap_update_bits(hdata->pmureg, PMU_HDMI_PHY_CONTROL, 1453 PMU_HDMI_PHY_ENABLE_BIT, 1); 1454 1455 hdmi_set_refclk(hdata, true); 1456 1457 hdmi_reg_writemask(hdata, HDMI_PHY_CON_0, 0, HDMI_PHY_POWER_OFF_EN); 1458 1459 hdmiphy_conf_apply(hdata); 1460 1461 hdata->powered = true; 1462 } 1463 1464 static void hdmiphy_disable(struct hdmi_context *hdata) 1465 { 1466 if (!hdata->powered) 1467 return; 1468 1469 hdmi_reg_writemask(hdata, HDMI_CON_0, 0, HDMI_EN); 1470 1471 hdmi_reg_writemask(hdata, HDMI_PHY_CON_0, ~0, HDMI_PHY_POWER_OFF_EN); 1472 1473 hdmi_set_refclk(hdata, false); 1474 1475 regmap_update_bits(hdata->pmureg, PMU_HDMI_PHY_CONTROL, 1476 PMU_HDMI_PHY_ENABLE_BIT, 0); 1477 1478 regulator_bulk_disable(ARRAY_SIZE(supply), hdata->regul_bulk); 1479 1480 pm_runtime_put_sync(hdata->dev); 1481 1482 hdata->powered = false; 1483 } 1484 1485 static void hdmi_enable(struct drm_encoder *encoder) 1486 { 1487 struct hdmi_context *hdata = encoder_to_hdmi(encoder); 1488 1489 hdmiphy_enable(hdata); 1490 hdmi_conf_apply(hdata); 1491 } 1492 1493 static void hdmi_disable(struct drm_encoder *encoder) 1494 { 1495 struct hdmi_context *hdata = encoder_to_hdmi(encoder); 1496 1497 if (!hdata->powered) 1498 return; 1499 1500 /* 1501 * The SFRs of VP and Mixer are updated by Vertical Sync of 1502 * Timing generator which is a part of HDMI so the sequence 1503 * to disable TV Subsystem should be as following, 1504 * VP -> Mixer -> HDMI 1505 * 1506 * To achieve such sequence HDMI is disabled together with HDMI PHY, via 1507 * pipe clock callback. 1508 */ 1509 cancel_delayed_work(&hdata->hotplug_work); 1510 cec_notifier_set_phys_addr(hdata->notifier, CEC_PHYS_ADDR_INVALID); 1511 } 1512 1513 static const struct drm_encoder_helper_funcs exynos_hdmi_encoder_helper_funcs = { 1514 .mode_fixup = hdmi_mode_fixup, 1515 .mode_set = hdmi_mode_set, 1516 .enable = hdmi_enable, 1517 .disable = hdmi_disable, 1518 }; 1519 1520 static const struct drm_encoder_funcs exynos_hdmi_encoder_funcs = { 1521 .destroy = drm_encoder_cleanup, 1522 }; 1523 1524 static void hdmi_hotplug_work_func(struct work_struct *work) 1525 { 1526 struct hdmi_context *hdata; 1527 1528 hdata = container_of(work, struct hdmi_context, hotplug_work.work); 1529 1530 if (hdata->drm_dev) 1531 drm_helper_hpd_irq_event(hdata->drm_dev); 1532 } 1533 1534 static irqreturn_t hdmi_irq_thread(int irq, void *arg) 1535 { 1536 struct hdmi_context *hdata = arg; 1537 1538 mod_delayed_work(system_wq, &hdata->hotplug_work, 1539 msecs_to_jiffies(HOTPLUG_DEBOUNCE_MS)); 1540 1541 return IRQ_HANDLED; 1542 } 1543 1544 static int hdmi_clks_get(struct hdmi_context *hdata, 1545 const struct string_array_spec *names, 1546 struct clk **clks) 1547 { 1548 struct device *dev = hdata->dev; 1549 int i; 1550 1551 for (i = 0; i < names->count; ++i) { 1552 struct clk *clk = devm_clk_get(dev, names->data[i]); 1553 1554 if (IS_ERR(clk)) { 1555 int ret = PTR_ERR(clk); 1556 1557 dev_err(dev, "Cannot get clock %s, %d\n", 1558 names->data[i], ret); 1559 1560 return ret; 1561 } 1562 1563 clks[i] = clk; 1564 } 1565 1566 return 0; 1567 } 1568 1569 static int hdmi_clk_init(struct hdmi_context *hdata) 1570 { 1571 const struct hdmi_driver_data *drv_data = hdata->drv_data; 1572 int count = drv_data->clk_gates.count + drv_data->clk_muxes.count; 1573 struct device *dev = hdata->dev; 1574 struct clk **clks; 1575 int ret; 1576 1577 if (!count) 1578 return 0; 1579 1580 clks = devm_kzalloc(dev, sizeof(*clks) * count, GFP_KERNEL); 1581 if (!clks) 1582 return -ENOMEM; 1583 1584 hdata->clk_gates = clks; 1585 hdata->clk_muxes = clks + drv_data->clk_gates.count; 1586 1587 ret = hdmi_clks_get(hdata, &drv_data->clk_gates, hdata->clk_gates); 1588 if (ret) 1589 return ret; 1590 1591 return hdmi_clks_get(hdata, &drv_data->clk_muxes, hdata->clk_muxes); 1592 } 1593 1594 1595 static void hdmiphy_clk_enable(struct exynos_drm_clk *clk, bool enable) 1596 { 1597 struct hdmi_context *hdata = container_of(clk, struct hdmi_context, 1598 phy_clk); 1599 1600 if (enable) 1601 hdmiphy_enable(hdata); 1602 else 1603 hdmiphy_disable(hdata); 1604 } 1605 1606 static int hdmi_bridge_init(struct hdmi_context *hdata) 1607 { 1608 struct device *dev = hdata->dev; 1609 struct device_node *ep, *np; 1610 1611 ep = of_graph_get_endpoint_by_regs(dev->of_node, 1, -1); 1612 if (!ep) 1613 return 0; 1614 1615 np = of_graph_get_remote_port_parent(ep); 1616 of_node_put(ep); 1617 if (!np) { 1618 DRM_ERROR("failed to get remote port parent"); 1619 return -EINVAL; 1620 } 1621 1622 hdata->bridge = of_drm_find_bridge(np); 1623 of_node_put(np); 1624 1625 if (!hdata->bridge) 1626 return -EPROBE_DEFER; 1627 1628 return 0; 1629 } 1630 1631 static int hdmi_resources_init(struct hdmi_context *hdata) 1632 { 1633 struct device *dev = hdata->dev; 1634 int i, ret; 1635 1636 DRM_DEBUG_KMS("HDMI resource init\n"); 1637 1638 hdata->hpd_gpio = devm_gpiod_get(dev, "hpd", GPIOD_IN); 1639 if (IS_ERR(hdata->hpd_gpio)) { 1640 DRM_ERROR("cannot get hpd gpio property\n"); 1641 return PTR_ERR(hdata->hpd_gpio); 1642 } 1643 1644 hdata->irq = gpiod_to_irq(hdata->hpd_gpio); 1645 if (hdata->irq < 0) { 1646 DRM_ERROR("failed to get GPIO irq\n"); 1647 return hdata->irq; 1648 } 1649 1650 ret = hdmi_clk_init(hdata); 1651 if (ret) 1652 return ret; 1653 1654 ret = hdmi_clk_set_parents(hdata, false); 1655 if (ret) 1656 return ret; 1657 1658 for (i = 0; i < ARRAY_SIZE(supply); ++i) 1659 hdata->regul_bulk[i].supply = supply[i]; 1660 1661 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(supply), hdata->regul_bulk); 1662 if (ret) { 1663 if (ret != -EPROBE_DEFER) 1664 DRM_ERROR("failed to get regulators\n"); 1665 return ret; 1666 } 1667 1668 hdata->reg_hdmi_en = devm_regulator_get_optional(dev, "hdmi-en"); 1669 1670 if (PTR_ERR(hdata->reg_hdmi_en) != -ENODEV) { 1671 if (IS_ERR(hdata->reg_hdmi_en)) 1672 return PTR_ERR(hdata->reg_hdmi_en); 1673 1674 ret = regulator_enable(hdata->reg_hdmi_en); 1675 if (ret) { 1676 DRM_ERROR("failed to enable hdmi-en regulator\n"); 1677 return ret; 1678 } 1679 } 1680 1681 return hdmi_bridge_init(hdata); 1682 } 1683 1684 static const struct of_device_id hdmi_match_types[] = { 1685 { 1686 .compatible = "samsung,exynos4210-hdmi", 1687 .data = &exynos4210_hdmi_driver_data, 1688 }, { 1689 .compatible = "samsung,exynos4212-hdmi", 1690 .data = &exynos4212_hdmi_driver_data, 1691 }, { 1692 .compatible = "samsung,exynos5420-hdmi", 1693 .data = &exynos5420_hdmi_driver_data, 1694 }, { 1695 .compatible = "samsung,exynos5433-hdmi", 1696 .data = &exynos5433_hdmi_driver_data, 1697 }, { 1698 /* end node */ 1699 } 1700 }; 1701 MODULE_DEVICE_TABLE (of, hdmi_match_types); 1702 1703 static int hdmi_bind(struct device *dev, struct device *master, void *data) 1704 { 1705 struct drm_device *drm_dev = data; 1706 struct hdmi_context *hdata = dev_get_drvdata(dev); 1707 struct drm_encoder *encoder = &hdata->encoder; 1708 struct exynos_drm_crtc *crtc; 1709 int ret; 1710 1711 hdata->drm_dev = drm_dev; 1712 1713 hdata->phy_clk.enable = hdmiphy_clk_enable; 1714 1715 drm_encoder_init(drm_dev, encoder, &exynos_hdmi_encoder_funcs, 1716 DRM_MODE_ENCODER_TMDS, NULL); 1717 1718 drm_encoder_helper_add(encoder, &exynos_hdmi_encoder_helper_funcs); 1719 1720 ret = exynos_drm_set_possible_crtcs(encoder, EXYNOS_DISPLAY_TYPE_HDMI); 1721 if (ret < 0) 1722 return ret; 1723 1724 crtc = exynos_drm_crtc_get_by_type(drm_dev, EXYNOS_DISPLAY_TYPE_HDMI); 1725 crtc->pipe_clk = &hdata->phy_clk; 1726 1727 ret = hdmi_create_connector(encoder); 1728 if (ret) { 1729 DRM_ERROR("failed to create connector ret = %d\n", ret); 1730 drm_encoder_cleanup(encoder); 1731 return ret; 1732 } 1733 1734 return 0; 1735 } 1736 1737 static void hdmi_unbind(struct device *dev, struct device *master, void *data) 1738 { 1739 } 1740 1741 static const struct component_ops hdmi_component_ops = { 1742 .bind = hdmi_bind, 1743 .unbind = hdmi_unbind, 1744 }; 1745 1746 static int hdmi_get_ddc_adapter(struct hdmi_context *hdata) 1747 { 1748 const char *compatible_str = "samsung,exynos4210-hdmiddc"; 1749 struct device_node *np; 1750 struct i2c_adapter *adpt; 1751 1752 np = of_find_compatible_node(NULL, NULL, compatible_str); 1753 if (np) 1754 np = of_get_next_parent(np); 1755 else 1756 np = of_parse_phandle(hdata->dev->of_node, "ddc", 0); 1757 1758 if (!np) { 1759 DRM_ERROR("Failed to find ddc node in device tree\n"); 1760 return -ENODEV; 1761 } 1762 1763 adpt = of_find_i2c_adapter_by_node(np); 1764 of_node_put(np); 1765 1766 if (!adpt) { 1767 DRM_INFO("Failed to get ddc i2c adapter by node\n"); 1768 return -EPROBE_DEFER; 1769 } 1770 1771 hdata->ddc_adpt = adpt; 1772 1773 return 0; 1774 } 1775 1776 static int hdmi_get_phy_io(struct hdmi_context *hdata) 1777 { 1778 const char *compatible_str = "samsung,exynos4212-hdmiphy"; 1779 struct device_node *np; 1780 int ret = 0; 1781 1782 np = of_find_compatible_node(NULL, NULL, compatible_str); 1783 if (!np) { 1784 np = of_parse_phandle(hdata->dev->of_node, "phy", 0); 1785 if (!np) { 1786 DRM_ERROR("Failed to find hdmiphy node in device tree\n"); 1787 return -ENODEV; 1788 } 1789 } 1790 1791 if (hdata->drv_data->is_apb_phy) { 1792 hdata->regs_hdmiphy = of_iomap(np, 0); 1793 if (!hdata->regs_hdmiphy) { 1794 DRM_ERROR("failed to ioremap hdmi phy\n"); 1795 ret = -ENOMEM; 1796 goto out; 1797 } 1798 } else { 1799 hdata->hdmiphy_port = of_find_i2c_device_by_node(np); 1800 if (!hdata->hdmiphy_port) { 1801 DRM_INFO("Failed to get hdmi phy i2c client\n"); 1802 ret = -EPROBE_DEFER; 1803 goto out; 1804 } 1805 } 1806 1807 out: 1808 of_node_put(np); 1809 return ret; 1810 } 1811 1812 static int hdmi_probe(struct platform_device *pdev) 1813 { 1814 struct device *dev = &pdev->dev; 1815 struct hdmi_context *hdata; 1816 struct resource *res; 1817 int ret; 1818 1819 hdata = devm_kzalloc(dev, sizeof(struct hdmi_context), GFP_KERNEL); 1820 if (!hdata) 1821 return -ENOMEM; 1822 1823 hdata->drv_data = of_device_get_match_data(dev); 1824 1825 platform_set_drvdata(pdev, hdata); 1826 1827 hdata->dev = dev; 1828 1829 ret = hdmi_resources_init(hdata); 1830 if (ret) { 1831 if (ret != -EPROBE_DEFER) 1832 DRM_ERROR("hdmi_resources_init failed\n"); 1833 return ret; 1834 } 1835 1836 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1837 hdata->regs = devm_ioremap_resource(dev, res); 1838 if (IS_ERR(hdata->regs)) { 1839 ret = PTR_ERR(hdata->regs); 1840 return ret; 1841 } 1842 1843 ret = hdmi_get_ddc_adapter(hdata); 1844 if (ret) 1845 return ret; 1846 1847 ret = hdmi_get_phy_io(hdata); 1848 if (ret) 1849 goto err_ddc; 1850 1851 INIT_DELAYED_WORK(&hdata->hotplug_work, hdmi_hotplug_work_func); 1852 1853 ret = devm_request_threaded_irq(dev, hdata->irq, NULL, 1854 hdmi_irq_thread, IRQF_TRIGGER_RISING | 1855 IRQF_TRIGGER_FALLING | IRQF_ONESHOT, 1856 "hdmi", hdata); 1857 if (ret) { 1858 DRM_ERROR("failed to register hdmi interrupt\n"); 1859 goto err_hdmiphy; 1860 } 1861 1862 hdata->pmureg = syscon_regmap_lookup_by_phandle(dev->of_node, 1863 "samsung,syscon-phandle"); 1864 if (IS_ERR(hdata->pmureg)) { 1865 DRM_ERROR("syscon regmap lookup failed.\n"); 1866 ret = -EPROBE_DEFER; 1867 goto err_hdmiphy; 1868 } 1869 1870 if (hdata->drv_data->has_sysreg) { 1871 hdata->sysreg = syscon_regmap_lookup_by_phandle(dev->of_node, 1872 "samsung,sysreg-phandle"); 1873 if (IS_ERR(hdata->sysreg)) { 1874 DRM_ERROR("sysreg regmap lookup failed.\n"); 1875 ret = -EPROBE_DEFER; 1876 goto err_hdmiphy; 1877 } 1878 } 1879 1880 hdata->notifier = cec_notifier_get(&pdev->dev); 1881 if (hdata->notifier == NULL) { 1882 ret = -ENOMEM; 1883 goto err_hdmiphy; 1884 } 1885 1886 pm_runtime_enable(dev); 1887 1888 ret = component_add(&pdev->dev, &hdmi_component_ops); 1889 if (ret) 1890 goto err_notifier_put; 1891 1892 return ret; 1893 1894 err_notifier_put: 1895 cec_notifier_put(hdata->notifier); 1896 pm_runtime_disable(dev); 1897 1898 err_hdmiphy: 1899 if (hdata->hdmiphy_port) 1900 put_device(&hdata->hdmiphy_port->dev); 1901 if (hdata->regs_hdmiphy) 1902 iounmap(hdata->regs_hdmiphy); 1903 err_ddc: 1904 put_device(&hdata->ddc_adpt->dev); 1905 1906 return ret; 1907 } 1908 1909 static int hdmi_remove(struct platform_device *pdev) 1910 { 1911 struct hdmi_context *hdata = platform_get_drvdata(pdev); 1912 1913 cancel_delayed_work_sync(&hdata->hotplug_work); 1914 cec_notifier_set_phys_addr(hdata->notifier, CEC_PHYS_ADDR_INVALID); 1915 1916 component_del(&pdev->dev, &hdmi_component_ops); 1917 1918 cec_notifier_put(hdata->notifier); 1919 pm_runtime_disable(&pdev->dev); 1920 1921 if (!IS_ERR(hdata->reg_hdmi_en)) 1922 regulator_disable(hdata->reg_hdmi_en); 1923 1924 if (hdata->hdmiphy_port) 1925 put_device(&hdata->hdmiphy_port->dev); 1926 1927 if (hdata->regs_hdmiphy) 1928 iounmap(hdata->regs_hdmiphy); 1929 1930 put_device(&hdata->ddc_adpt->dev); 1931 1932 return 0; 1933 } 1934 1935 static int __maybe_unused exynos_hdmi_suspend(struct device *dev) 1936 { 1937 struct hdmi_context *hdata = dev_get_drvdata(dev); 1938 1939 hdmi_clk_disable_gates(hdata); 1940 1941 return 0; 1942 } 1943 1944 static int __maybe_unused exynos_hdmi_resume(struct device *dev) 1945 { 1946 struct hdmi_context *hdata = dev_get_drvdata(dev); 1947 int ret; 1948 1949 ret = hdmi_clk_enable_gates(hdata); 1950 if (ret < 0) 1951 return ret; 1952 1953 return 0; 1954 } 1955 1956 static const struct dev_pm_ops exynos_hdmi_pm_ops = { 1957 SET_RUNTIME_PM_OPS(exynos_hdmi_suspend, exynos_hdmi_resume, NULL) 1958 }; 1959 1960 struct platform_driver hdmi_driver = { 1961 .probe = hdmi_probe, 1962 .remove = hdmi_remove, 1963 .driver = { 1964 .name = "exynos-hdmi", 1965 .owner = THIS_MODULE, 1966 .pm = &exynos_hdmi_pm_ops, 1967 .of_match_table = hdmi_match_types, 1968 }, 1969 }; 1970