linux/drivers/gpu/drm/exynos/exynos_hdmi.c
<<
>>
Prefs
   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
  21#include "regs-hdmi.h"
  22
  23#include <linux/kernel.h>
  24#include <linux/spinlock.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/regulator/consumer.h>
  34#include <linux/io.h>
  35#include <linux/of.h>
  36#include <linux/of_gpio.h>
  37
  38#include <drm/exynos_drm.h>
  39
  40#include "exynos_drm_drv.h"
  41#include "exynos_drm_hdmi.h"
  42
  43#include "exynos_hdmi.h"
  44
  45#include <linux/gpio.h>
  46#include <media/s5p_hdmi.h>
  47
  48#define MAX_WIDTH               1920
  49#define MAX_HEIGHT              1080
  50#define get_hdmi_context(dev)   platform_get_drvdata(to_platform_device(dev))
  51
  52/* AVI header and aspect ratio */
  53#define HDMI_AVI_VERSION                0x02
  54#define HDMI_AVI_LENGTH         0x0D
  55#define AVI_PIC_ASPECT_RATIO_16_9       (2 << 4)
  56#define AVI_SAME_AS_PIC_ASPECT_RATIO    8
  57
  58/* AUI header info */
  59#define HDMI_AUI_VERSION        0x01
  60#define HDMI_AUI_LENGTH 0x0A
  61
  62/* HDMI infoframe to configure HDMI out packet header, AUI and AVI */
  63enum HDMI_PACKET_TYPE {
  64        /* refer to Table 5-8 Packet Type in HDMI specification v1.4a */
  65        /* InfoFrame packet type */
  66        HDMI_PACKET_TYPE_INFOFRAME = 0x80,
  67        /* Vendor-Specific InfoFrame */
  68        HDMI_PACKET_TYPE_VSI = HDMI_PACKET_TYPE_INFOFRAME + 1,
  69        /* Auxiliary Video information InfoFrame */
  70        HDMI_PACKET_TYPE_AVI = HDMI_PACKET_TYPE_INFOFRAME + 2,
  71        /* Audio information InfoFrame */
  72        HDMI_PACKET_TYPE_AUI = HDMI_PACKET_TYPE_INFOFRAME + 4
  73};
  74
  75enum hdmi_type {
  76        HDMI_TYPE13,
  77        HDMI_TYPE14,
  78};
  79
  80struct hdmi_resources {
  81        struct clk                      *hdmi;
  82        struct clk                      *sclk_hdmi;
  83        struct clk                      *sclk_pixel;
  84        struct clk                      *sclk_hdmiphy;
  85        struct clk                      *hdmiphy;
  86        struct clk                      *mout_hdmi;
  87        struct regulator_bulk_data      *regul_bulk;
  88        int                             regul_count;
  89};
  90
  91struct hdmi_tg_regs {
  92        u8 cmd[1];
  93        u8 h_fsz[2];
  94        u8 hact_st[2];
  95        u8 hact_sz[2];
  96        u8 v_fsz[2];
  97        u8 vsync[2];
  98        u8 vsync2[2];
  99        u8 vact_st[2];
 100        u8 vact_sz[2];
 101        u8 field_chg[2];
 102        u8 vact_st2[2];
 103        u8 vact_st3[2];
 104        u8 vact_st4[2];
 105        u8 vsync_top_hdmi[2];
 106        u8 vsync_bot_hdmi[2];
 107        u8 field_top_hdmi[2];
 108        u8 field_bot_hdmi[2];
 109        u8 tg_3d[1];
 110};
 111
 112struct hdmi_v13_core_regs {
 113        u8 h_blank[2];
 114        u8 v_blank[3];
 115        u8 h_v_line[3];
 116        u8 vsync_pol[1];
 117        u8 int_pro_mode[1];
 118        u8 v_blank_f[3];
 119        u8 h_sync_gen[3];
 120        u8 v_sync_gen1[3];
 121        u8 v_sync_gen2[3];
 122        u8 v_sync_gen3[3];
 123};
 124
 125struct hdmi_v14_core_regs {
 126        u8 h_blank[2];
 127        u8 v2_blank[2];
 128        u8 v1_blank[2];
 129        u8 v_line[2];
 130        u8 h_line[2];
 131        u8 hsync_pol[1];
 132        u8 vsync_pol[1];
 133        u8 int_pro_mode[1];
 134        u8 v_blank_f0[2];
 135        u8 v_blank_f1[2];
 136        u8 h_sync_start[2];
 137        u8 h_sync_end[2];
 138        u8 v_sync_line_bef_2[2];
 139        u8 v_sync_line_bef_1[2];
 140        u8 v_sync_line_aft_2[2];
 141        u8 v_sync_line_aft_1[2];
 142        u8 v_sync_line_aft_pxl_2[2];
 143        u8 v_sync_line_aft_pxl_1[2];
 144        u8 v_blank_f2[2]; /* for 3D mode */
 145        u8 v_blank_f3[2]; /* for 3D mode */
 146        u8 v_blank_f4[2]; /* for 3D mode */
 147        u8 v_blank_f5[2]; /* for 3D mode */
 148        u8 v_sync_line_aft_3[2];
 149        u8 v_sync_line_aft_4[2];
 150        u8 v_sync_line_aft_5[2];
 151        u8 v_sync_line_aft_6[2];
 152        u8 v_sync_line_aft_pxl_3[2];
 153        u8 v_sync_line_aft_pxl_4[2];
 154        u8 v_sync_line_aft_pxl_5[2];
 155        u8 v_sync_line_aft_pxl_6[2];
 156        u8 vact_space_1[2];
 157        u8 vact_space_2[2];
 158        u8 vact_space_3[2];
 159        u8 vact_space_4[2];
 160        u8 vact_space_5[2];
 161        u8 vact_space_6[2];
 162};
 163
 164struct hdmi_v13_conf {
 165        struct hdmi_v13_core_regs core;
 166        struct hdmi_tg_regs tg;
 167};
 168
 169struct hdmi_v14_conf {
 170        struct hdmi_v14_core_regs core;
 171        struct hdmi_tg_regs tg;
 172};
 173
 174struct hdmi_conf_regs {
 175        int pixel_clock;
 176        int cea_video_id;
 177        union {
 178                struct hdmi_v13_conf v13_conf;
 179                struct hdmi_v14_conf v14_conf;
 180        } conf;
 181};
 182
 183struct hdmi_context {
 184        struct device                   *dev;
 185        struct drm_device               *drm_dev;
 186        bool                            hpd;
 187        bool                            powered;
 188        bool                            dvi_mode;
 189        struct mutex                    hdmi_mutex;
 190
 191        void __iomem                    *regs;
 192        void                            *parent_ctx;
 193        int                             irq;
 194
 195        struct i2c_client               *ddc_port;
 196        struct i2c_client               *hdmiphy_port;
 197
 198        /* current hdmiphy conf regs */
 199        struct hdmi_conf_regs           mode_conf;
 200
 201        struct hdmi_resources           res;
 202
 203        int                             hpd_gpio;
 204
 205        enum hdmi_type                  type;
 206};
 207
 208struct hdmiphy_config {
 209        int pixel_clock;
 210        u8 conf[32];
 211};
 212
 213/* list of phy config settings */
 214static const struct hdmiphy_config hdmiphy_v13_configs[] = {
 215        {
 216                .pixel_clock = 27000000,
 217                .conf = {
 218                        0x01, 0x05, 0x00, 0xD8, 0x10, 0x1C, 0x30, 0x40,
 219                        0x6B, 0x10, 0x02, 0x51, 0xDF, 0xF2, 0x54, 0x87,
 220                        0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
 221                        0x22, 0x40, 0xE3, 0x26, 0x00, 0x00, 0x00, 0x00,
 222                },
 223        },
 224        {
 225                .pixel_clock = 27027000,
 226                .conf = {
 227                        0x01, 0x05, 0x00, 0xD4, 0x10, 0x9C, 0x09, 0x64,
 228                        0x6B, 0x10, 0x02, 0x51, 0xDF, 0xF2, 0x54, 0x87,
 229                        0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
 230                        0x22, 0x40, 0xE3, 0x26, 0x00, 0x00, 0x00, 0x00,
 231                },
 232        },
 233        {
 234                .pixel_clock = 74176000,
 235                .conf = {
 236                        0x01, 0x05, 0x00, 0xD8, 0x10, 0x9C, 0xef, 0x5B,
 237                        0x6D, 0x10, 0x01, 0x51, 0xef, 0xF3, 0x54, 0xb9,
 238                        0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
 239                        0x22, 0x40, 0xa5, 0x26, 0x01, 0x00, 0x00, 0x00,
 240                },
 241        },
 242        {
 243                .pixel_clock = 74250000,
 244                .conf = {
 245                        0x01, 0x05, 0x00, 0xd8, 0x10, 0x9c, 0xf8, 0x40,
 246                        0x6a, 0x10, 0x01, 0x51, 0xff, 0xf1, 0x54, 0xba,
 247                        0x84, 0x00, 0x10, 0x38, 0x00, 0x08, 0x10, 0xe0,
 248                        0x22, 0x40, 0xa4, 0x26, 0x01, 0x00, 0x00, 0x00,
 249                },
 250        },
 251        {
 252                .pixel_clock = 148500000,
 253                .conf = {
 254                        0x01, 0x05, 0x00, 0xD8, 0x10, 0x9C, 0xf8, 0x40,
 255                        0x6A, 0x18, 0x00, 0x51, 0xff, 0xF1, 0x54, 0xba,
 256                        0x84, 0x00, 0x10, 0x38, 0x00, 0x08, 0x10, 0xE0,
 257                        0x22, 0x40, 0xa4, 0x26, 0x02, 0x00, 0x00, 0x00,
 258                },
 259        },
 260};
 261
 262static const struct hdmiphy_config hdmiphy_v14_configs[] = {
 263        {
 264                .pixel_clock = 25200000,
 265                .conf = {
 266                        0x01, 0x51, 0x2A, 0x75, 0x40, 0x01, 0x00, 0x08,
 267                        0x82, 0x80, 0xfc, 0xd8, 0x45, 0xa0, 0xac, 0x80,
 268                        0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
 269                        0x54, 0xf4, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
 270                },
 271        },
 272        {
 273                .pixel_clock = 27000000,
 274                .conf = {
 275                        0x01, 0xd1, 0x22, 0x51, 0x40, 0x08, 0xfc, 0x20,
 276                        0x98, 0xa0, 0xcb, 0xd8, 0x45, 0xa0, 0xac, 0x80,
 277                        0x06, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
 278                        0x54, 0xe4, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
 279                },
 280        },
 281        {
 282                .pixel_clock = 27027000,
 283                .conf = {
 284                        0x01, 0xd1, 0x2d, 0x72, 0x40, 0x64, 0x12, 0x08,
 285                        0x43, 0xa0, 0x0e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
 286                        0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
 287                        0x54, 0xe3, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00,
 288                },
 289        },
 290        {
 291                .pixel_clock = 36000000,
 292                .conf = {
 293                        0x01, 0x51, 0x2d, 0x55, 0x40, 0x01, 0x00, 0x08,
 294                        0x82, 0x80, 0x0e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
 295                        0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
 296                        0x54, 0xab, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
 297                },
 298        },
 299        {
 300                .pixel_clock = 40000000,
 301                .conf = {
 302                        0x01, 0x51, 0x32, 0x55, 0x40, 0x01, 0x00, 0x08,
 303                        0x82, 0x80, 0x2c, 0xd9, 0x45, 0xa0, 0xac, 0x80,
 304                        0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
 305                        0x54, 0x9a, 0x24, 0x00, 0x00, 0x00, 0x01, 0x80,
 306                },
 307        },
 308        {
 309                .pixel_clock = 65000000,
 310                .conf = {
 311                        0x01, 0xd1, 0x36, 0x34, 0x40, 0x1e, 0x0a, 0x08,
 312                        0x82, 0xa0, 0x45, 0xd9, 0x45, 0xa0, 0xac, 0x80,
 313                        0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
 314                        0x54, 0xbd, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
 315                },
 316        },
 317        {
 318                .pixel_clock = 74176000,
 319                .conf = {
 320                        0x01, 0xd1, 0x3e, 0x35, 0x40, 0x5b, 0xde, 0x08,
 321                        0x82, 0xa0, 0x73, 0xd9, 0x45, 0xa0, 0xac, 0x80,
 322                        0x56, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
 323                        0x54, 0xa6, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
 324                },
 325        },
 326        {
 327                .pixel_clock = 74250000,
 328                .conf = {
 329                        0x01, 0xd1, 0x1f, 0x10, 0x40, 0x40, 0xf8, 0x08,
 330                        0x81, 0xa0, 0xba, 0xd8, 0x45, 0xa0, 0xac, 0x80,
 331                        0x3c, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
 332                        0x54, 0xa5, 0x24, 0x01, 0x00, 0x00, 0x01, 0x00,
 333                },
 334        },
 335        {
 336                .pixel_clock = 83500000,
 337                .conf = {
 338                        0x01, 0xd1, 0x23, 0x11, 0x40, 0x0c, 0xfb, 0x08,
 339                        0x85, 0xa0, 0xd1, 0xd8, 0x45, 0xa0, 0xac, 0x80,
 340                        0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
 341                        0x54, 0x93, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
 342                },
 343        },
 344        {
 345                .pixel_clock = 106500000,
 346                .conf = {
 347                        0x01, 0xd1, 0x2c, 0x12, 0x40, 0x0c, 0x09, 0x08,
 348                        0x84, 0xa0, 0x0a, 0xd9, 0x45, 0xa0, 0xac, 0x80,
 349                        0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
 350                        0x54, 0x73, 0x24, 0x01, 0x00, 0x00, 0x01, 0x80,
 351                },
 352        },
 353        {
 354                .pixel_clock = 108000000,
 355                .conf = {
 356                        0x01, 0x51, 0x2d, 0x15, 0x40, 0x01, 0x00, 0x08,
 357                        0x82, 0x80, 0x0e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
 358                        0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
 359                        0x54, 0xc7, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80,
 360                },
 361        },
 362        {
 363                .pixel_clock = 146250000,
 364                .conf = {
 365                        0x01, 0xd1, 0x3d, 0x15, 0x40, 0x18, 0xfd, 0x08,
 366                        0x83, 0xa0, 0x6e, 0xd9, 0x45, 0xa0, 0xac, 0x80,
 367                        0x08, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
 368                        0x54, 0x50, 0x25, 0x03, 0x00, 0x00, 0x01, 0x80,
 369                },
 370        },
 371        {
 372                .pixel_clock = 148500000,
 373                .conf = {
 374                        0x01, 0xd1, 0x1f, 0x00, 0x40, 0x40, 0xf8, 0x08,
 375                        0x81, 0xa0, 0xba, 0xd8, 0x45, 0xa0, 0xac, 0x80,
 376                        0x3c, 0x80, 0x11, 0x04, 0x02, 0x22, 0x44, 0x86,
 377                        0x54, 0x4b, 0x25, 0x03, 0x00, 0x00, 0x01, 0x00,
 378                },
 379        },
 380};
 381
 382struct hdmi_infoframe {
 383        enum HDMI_PACKET_TYPE type;
 384        u8 ver;
 385        u8 len;
 386};
 387
 388static inline u32 hdmi_reg_read(struct hdmi_context *hdata, u32 reg_id)
 389{
 390        return readl(hdata->regs + reg_id);
 391}
 392
 393static inline void hdmi_reg_writeb(struct hdmi_context *hdata,
 394                                 u32 reg_id, u8 value)
 395{
 396        writeb(value, hdata->regs + reg_id);
 397}
 398
 399static inline void hdmi_reg_writemask(struct hdmi_context *hdata,
 400                                 u32 reg_id, u32 value, u32 mask)
 401{
 402        u32 old = readl(hdata->regs + reg_id);
 403        value = (value & mask) | (old & ~mask);
 404        writel(value, hdata->regs + reg_id);
 405}
 406
 407static void hdmi_v13_regs_dump(struct hdmi_context *hdata, char *prefix)
 408{
 409#define DUMPREG(reg_id) \
 410        DRM_DEBUG_KMS("%s:" #reg_id " = %08x\n", prefix, \
 411        readl(hdata->regs + reg_id))
 412        DRM_DEBUG_KMS("%s: ---- CONTROL REGISTERS ----\n", prefix);
 413        DUMPREG(HDMI_INTC_FLAG);
 414        DUMPREG(HDMI_INTC_CON);
 415        DUMPREG(HDMI_HPD_STATUS);
 416        DUMPREG(HDMI_V13_PHY_RSTOUT);
 417        DUMPREG(HDMI_V13_PHY_VPLL);
 418        DUMPREG(HDMI_V13_PHY_CMU);
 419        DUMPREG(HDMI_V13_CORE_RSTOUT);
 420
 421        DRM_DEBUG_KMS("%s: ---- CORE REGISTERS ----\n", prefix);
 422        DUMPREG(HDMI_CON_0);
 423        DUMPREG(HDMI_CON_1);
 424        DUMPREG(HDMI_CON_2);
 425        DUMPREG(HDMI_SYS_STATUS);
 426        DUMPREG(HDMI_V13_PHY_STATUS);
 427        DUMPREG(HDMI_STATUS_EN);
 428        DUMPREG(HDMI_HPD);
 429        DUMPREG(HDMI_MODE_SEL);
 430        DUMPREG(HDMI_V13_HPD_GEN);
 431        DUMPREG(HDMI_V13_DC_CONTROL);
 432        DUMPREG(HDMI_V13_VIDEO_PATTERN_GEN);
 433
 434        DRM_DEBUG_KMS("%s: ---- CORE SYNC REGISTERS ----\n", prefix);
 435        DUMPREG(HDMI_H_BLANK_0);
 436        DUMPREG(HDMI_H_BLANK_1);
 437        DUMPREG(HDMI_V13_V_BLANK_0);
 438        DUMPREG(HDMI_V13_V_BLANK_1);
 439        DUMPREG(HDMI_V13_V_BLANK_2);
 440        DUMPREG(HDMI_V13_H_V_LINE_0);
 441        DUMPREG(HDMI_V13_H_V_LINE_1);
 442        DUMPREG(HDMI_V13_H_V_LINE_2);
 443        DUMPREG(HDMI_VSYNC_POL);
 444        DUMPREG(HDMI_INT_PRO_MODE);
 445        DUMPREG(HDMI_V13_V_BLANK_F_0);
 446        DUMPREG(HDMI_V13_V_BLANK_F_1);
 447        DUMPREG(HDMI_V13_V_BLANK_F_2);
 448        DUMPREG(HDMI_V13_H_SYNC_GEN_0);
 449        DUMPREG(HDMI_V13_H_SYNC_GEN_1);
 450        DUMPREG(HDMI_V13_H_SYNC_GEN_2);
 451        DUMPREG(HDMI_V13_V_SYNC_GEN_1_0);
 452        DUMPREG(HDMI_V13_V_SYNC_GEN_1_1);
 453        DUMPREG(HDMI_V13_V_SYNC_GEN_1_2);
 454        DUMPREG(HDMI_V13_V_SYNC_GEN_2_0);
 455        DUMPREG(HDMI_V13_V_SYNC_GEN_2_1);
 456        DUMPREG(HDMI_V13_V_SYNC_GEN_2_2);
 457        DUMPREG(HDMI_V13_V_SYNC_GEN_3_0);
 458        DUMPREG(HDMI_V13_V_SYNC_GEN_3_1);
 459        DUMPREG(HDMI_V13_V_SYNC_GEN_3_2);
 460
 461        DRM_DEBUG_KMS("%s: ---- TG REGISTERS ----\n", prefix);
 462        DUMPREG(HDMI_TG_CMD);
 463        DUMPREG(HDMI_TG_H_FSZ_L);
 464        DUMPREG(HDMI_TG_H_FSZ_H);
 465        DUMPREG(HDMI_TG_HACT_ST_L);
 466        DUMPREG(HDMI_TG_HACT_ST_H);
 467        DUMPREG(HDMI_TG_HACT_SZ_L);
 468        DUMPREG(HDMI_TG_HACT_SZ_H);
 469        DUMPREG(HDMI_TG_V_FSZ_L);
 470        DUMPREG(HDMI_TG_V_FSZ_H);
 471        DUMPREG(HDMI_TG_VSYNC_L);
 472        DUMPREG(HDMI_TG_VSYNC_H);
 473        DUMPREG(HDMI_TG_VSYNC2_L);
 474        DUMPREG(HDMI_TG_VSYNC2_H);
 475        DUMPREG(HDMI_TG_VACT_ST_L);
 476        DUMPREG(HDMI_TG_VACT_ST_H);
 477        DUMPREG(HDMI_TG_VACT_SZ_L);
 478        DUMPREG(HDMI_TG_VACT_SZ_H);
 479        DUMPREG(HDMI_TG_FIELD_CHG_L);
 480        DUMPREG(HDMI_TG_FIELD_CHG_H);
 481        DUMPREG(HDMI_TG_VACT_ST2_L);
 482        DUMPREG(HDMI_TG_VACT_ST2_H);
 483        DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_L);
 484        DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_H);
 485        DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_L);
 486        DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_H);
 487        DUMPREG(HDMI_TG_FIELD_TOP_HDMI_L);
 488        DUMPREG(HDMI_TG_FIELD_TOP_HDMI_H);
 489        DUMPREG(HDMI_TG_FIELD_BOT_HDMI_L);
 490        DUMPREG(HDMI_TG_FIELD_BOT_HDMI_H);
 491#undef DUMPREG
 492}
 493
 494static void hdmi_v14_regs_dump(struct hdmi_context *hdata, char *prefix)
 495{
 496        int i;
 497
 498#define DUMPREG(reg_id) \
 499        DRM_DEBUG_KMS("%s:" #reg_id " = %08x\n", prefix, \
 500        readl(hdata->regs + reg_id))
 501
 502        DRM_DEBUG_KMS("%s: ---- CONTROL REGISTERS ----\n", prefix);
 503        DUMPREG(HDMI_INTC_CON);
 504        DUMPREG(HDMI_INTC_FLAG);
 505        DUMPREG(HDMI_HPD_STATUS);
 506        DUMPREG(HDMI_INTC_CON_1);
 507        DUMPREG(HDMI_INTC_FLAG_1);
 508        DUMPREG(HDMI_PHY_STATUS_0);
 509        DUMPREG(HDMI_PHY_STATUS_PLL);
 510        DUMPREG(HDMI_PHY_CON_0);
 511        DUMPREG(HDMI_PHY_RSTOUT);
 512        DUMPREG(HDMI_PHY_VPLL);
 513        DUMPREG(HDMI_PHY_CMU);
 514        DUMPREG(HDMI_CORE_RSTOUT);
 515
 516        DRM_DEBUG_KMS("%s: ---- CORE REGISTERS ----\n", prefix);
 517        DUMPREG(HDMI_CON_0);
 518        DUMPREG(HDMI_CON_1);
 519        DUMPREG(HDMI_CON_2);
 520        DUMPREG(HDMI_SYS_STATUS);
 521        DUMPREG(HDMI_PHY_STATUS_0);
 522        DUMPREG(HDMI_STATUS_EN);
 523        DUMPREG(HDMI_HPD);
 524        DUMPREG(HDMI_MODE_SEL);
 525        DUMPREG(HDMI_ENC_EN);
 526        DUMPREG(HDMI_DC_CONTROL);
 527        DUMPREG(HDMI_VIDEO_PATTERN_GEN);
 528
 529        DRM_DEBUG_KMS("%s: ---- CORE SYNC REGISTERS ----\n", prefix);
 530        DUMPREG(HDMI_H_BLANK_0);
 531        DUMPREG(HDMI_H_BLANK_1);
 532        DUMPREG(HDMI_V2_BLANK_0);
 533        DUMPREG(HDMI_V2_BLANK_1);
 534        DUMPREG(HDMI_V1_BLANK_0);
 535        DUMPREG(HDMI_V1_BLANK_1);
 536        DUMPREG(HDMI_V_LINE_0);
 537        DUMPREG(HDMI_V_LINE_1);
 538        DUMPREG(HDMI_H_LINE_0);
 539        DUMPREG(HDMI_H_LINE_1);
 540        DUMPREG(HDMI_HSYNC_POL);
 541
 542        DUMPREG(HDMI_VSYNC_POL);
 543        DUMPREG(HDMI_INT_PRO_MODE);
 544        DUMPREG(HDMI_V_BLANK_F0_0);
 545        DUMPREG(HDMI_V_BLANK_F0_1);
 546        DUMPREG(HDMI_V_BLANK_F1_0);
 547        DUMPREG(HDMI_V_BLANK_F1_1);
 548
 549        DUMPREG(HDMI_H_SYNC_START_0);
 550        DUMPREG(HDMI_H_SYNC_START_1);
 551        DUMPREG(HDMI_H_SYNC_END_0);
 552        DUMPREG(HDMI_H_SYNC_END_1);
 553
 554        DUMPREG(HDMI_V_SYNC_LINE_BEF_2_0);
 555        DUMPREG(HDMI_V_SYNC_LINE_BEF_2_1);
 556        DUMPREG(HDMI_V_SYNC_LINE_BEF_1_0);
 557        DUMPREG(HDMI_V_SYNC_LINE_BEF_1_1);
 558
 559        DUMPREG(HDMI_V_SYNC_LINE_AFT_2_0);
 560        DUMPREG(HDMI_V_SYNC_LINE_AFT_2_1);
 561        DUMPREG(HDMI_V_SYNC_LINE_AFT_1_0);
 562        DUMPREG(HDMI_V_SYNC_LINE_AFT_1_1);
 563
 564        DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_2_0);
 565        DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_2_1);
 566        DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_1_0);
 567        DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_1_1);
 568
 569        DUMPREG(HDMI_V_BLANK_F2_0);
 570        DUMPREG(HDMI_V_BLANK_F2_1);
 571        DUMPREG(HDMI_V_BLANK_F3_0);
 572        DUMPREG(HDMI_V_BLANK_F3_1);
 573        DUMPREG(HDMI_V_BLANK_F4_0);
 574        DUMPREG(HDMI_V_BLANK_F4_1);
 575        DUMPREG(HDMI_V_BLANK_F5_0);
 576        DUMPREG(HDMI_V_BLANK_F5_1);
 577
 578        DUMPREG(HDMI_V_SYNC_LINE_AFT_3_0);
 579        DUMPREG(HDMI_V_SYNC_LINE_AFT_3_1);
 580        DUMPREG(HDMI_V_SYNC_LINE_AFT_4_0);
 581        DUMPREG(HDMI_V_SYNC_LINE_AFT_4_1);
 582        DUMPREG(HDMI_V_SYNC_LINE_AFT_5_0);
 583        DUMPREG(HDMI_V_SYNC_LINE_AFT_5_1);
 584        DUMPREG(HDMI_V_SYNC_LINE_AFT_6_0);
 585        DUMPREG(HDMI_V_SYNC_LINE_AFT_6_1);
 586
 587        DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_3_0);
 588        DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_3_1);
 589        DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_4_0);
 590        DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_4_1);
 591        DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_5_0);
 592        DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_5_1);
 593        DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_6_0);
 594        DUMPREG(HDMI_V_SYNC_LINE_AFT_PXL_6_1);
 595
 596        DUMPREG(HDMI_VACT_SPACE_1_0);
 597        DUMPREG(HDMI_VACT_SPACE_1_1);
 598        DUMPREG(HDMI_VACT_SPACE_2_0);
 599        DUMPREG(HDMI_VACT_SPACE_2_1);
 600        DUMPREG(HDMI_VACT_SPACE_3_0);
 601        DUMPREG(HDMI_VACT_SPACE_3_1);
 602        DUMPREG(HDMI_VACT_SPACE_4_0);
 603        DUMPREG(HDMI_VACT_SPACE_4_1);
 604        DUMPREG(HDMI_VACT_SPACE_5_0);
 605        DUMPREG(HDMI_VACT_SPACE_5_1);
 606        DUMPREG(HDMI_VACT_SPACE_6_0);
 607        DUMPREG(HDMI_VACT_SPACE_6_1);
 608
 609        DRM_DEBUG_KMS("%s: ---- TG REGISTERS ----\n", prefix);
 610        DUMPREG(HDMI_TG_CMD);
 611        DUMPREG(HDMI_TG_H_FSZ_L);
 612        DUMPREG(HDMI_TG_H_FSZ_H);
 613        DUMPREG(HDMI_TG_HACT_ST_L);
 614        DUMPREG(HDMI_TG_HACT_ST_H);
 615        DUMPREG(HDMI_TG_HACT_SZ_L);
 616        DUMPREG(HDMI_TG_HACT_SZ_H);
 617        DUMPREG(HDMI_TG_V_FSZ_L);
 618        DUMPREG(HDMI_TG_V_FSZ_H);
 619        DUMPREG(HDMI_TG_VSYNC_L);
 620        DUMPREG(HDMI_TG_VSYNC_H);
 621        DUMPREG(HDMI_TG_VSYNC2_L);
 622        DUMPREG(HDMI_TG_VSYNC2_H);
 623        DUMPREG(HDMI_TG_VACT_ST_L);
 624        DUMPREG(HDMI_TG_VACT_ST_H);
 625        DUMPREG(HDMI_TG_VACT_SZ_L);
 626        DUMPREG(HDMI_TG_VACT_SZ_H);
 627        DUMPREG(HDMI_TG_FIELD_CHG_L);
 628        DUMPREG(HDMI_TG_FIELD_CHG_H);
 629        DUMPREG(HDMI_TG_VACT_ST2_L);
 630        DUMPREG(HDMI_TG_VACT_ST2_H);
 631        DUMPREG(HDMI_TG_VACT_ST3_L);
 632        DUMPREG(HDMI_TG_VACT_ST3_H);
 633        DUMPREG(HDMI_TG_VACT_ST4_L);
 634        DUMPREG(HDMI_TG_VACT_ST4_H);
 635        DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_L);
 636        DUMPREG(HDMI_TG_VSYNC_TOP_HDMI_H);
 637        DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_L);
 638        DUMPREG(HDMI_TG_VSYNC_BOT_HDMI_H);
 639        DUMPREG(HDMI_TG_FIELD_TOP_HDMI_L);
 640        DUMPREG(HDMI_TG_FIELD_TOP_HDMI_H);
 641        DUMPREG(HDMI_TG_FIELD_BOT_HDMI_L);
 642        DUMPREG(HDMI_TG_FIELD_BOT_HDMI_H);
 643        DUMPREG(HDMI_TG_3D);
 644
 645        DRM_DEBUG_KMS("%s: ---- PACKET REGISTERS ----\n", prefix);
 646        DUMPREG(HDMI_AVI_CON);
 647        DUMPREG(HDMI_AVI_HEADER0);
 648        DUMPREG(HDMI_AVI_HEADER1);
 649        DUMPREG(HDMI_AVI_HEADER2);
 650        DUMPREG(HDMI_AVI_CHECK_SUM);
 651        DUMPREG(HDMI_VSI_CON);
 652        DUMPREG(HDMI_VSI_HEADER0);
 653        DUMPREG(HDMI_VSI_HEADER1);
 654        DUMPREG(HDMI_VSI_HEADER2);
 655        for (i = 0; i < 7; ++i)
 656                DUMPREG(HDMI_VSI_DATA(i));
 657
 658#undef DUMPREG
 659}
 660
 661static void hdmi_regs_dump(struct hdmi_context *hdata, char *prefix)
 662{
 663        if (hdata->type == HDMI_TYPE13)
 664                hdmi_v13_regs_dump(hdata, prefix);
 665        else
 666                hdmi_v14_regs_dump(hdata, prefix);
 667}
 668
 669static u8 hdmi_chksum(struct hdmi_context *hdata,
 670                        u32 start, u8 len, u32 hdr_sum)
 671{
 672        int i;
 673
 674        /* hdr_sum : header0 + header1 + header2
 675        * start : start address of packet byte1
 676        * len : packet bytes - 1 */
 677        for (i = 0; i < len; ++i)
 678                hdr_sum += 0xff & hdmi_reg_read(hdata, start + i * 4);
 679
 680        /* return 2's complement of 8 bit hdr_sum */
 681        return (u8)(~(hdr_sum & 0xff) + 1);
 682}
 683
 684static void hdmi_reg_infoframe(struct hdmi_context *hdata,
 685                        struct hdmi_infoframe *infoframe)
 686{
 687        u32 hdr_sum;
 688        u8 chksum;
 689        u32 aspect_ratio;
 690        u32 mod;
 691        u32 vic;
 692
 693        mod = hdmi_reg_read(hdata, HDMI_MODE_SEL);
 694        if (hdata->dvi_mode) {
 695                hdmi_reg_writeb(hdata, HDMI_VSI_CON,
 696                                HDMI_VSI_CON_DO_NOT_TRANSMIT);
 697                hdmi_reg_writeb(hdata, HDMI_AVI_CON,
 698                                HDMI_AVI_CON_DO_NOT_TRANSMIT);
 699                hdmi_reg_writeb(hdata, HDMI_AUI_CON, HDMI_AUI_CON_NO_TRAN);
 700                return;
 701        }
 702
 703        switch (infoframe->type) {
 704        case HDMI_PACKET_TYPE_AVI:
 705                hdmi_reg_writeb(hdata, HDMI_AVI_CON, HDMI_AVI_CON_EVERY_VSYNC);
 706                hdmi_reg_writeb(hdata, HDMI_AVI_HEADER0, infoframe->type);
 707                hdmi_reg_writeb(hdata, HDMI_AVI_HEADER1, infoframe->ver);
 708                hdmi_reg_writeb(hdata, HDMI_AVI_HEADER2, infoframe->len);
 709                hdr_sum = infoframe->type + infoframe->ver + infoframe->len;
 710
 711                /* Output format zero hardcoded ,RGB YBCR selection */
 712                hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(1), 0 << 5 |
 713                        AVI_ACTIVE_FORMAT_VALID |
 714                        AVI_UNDERSCANNED_DISPLAY_VALID);
 715
 716                aspect_ratio = AVI_PIC_ASPECT_RATIO_16_9;
 717
 718                hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(2), aspect_ratio |
 719                                AVI_SAME_AS_PIC_ASPECT_RATIO);
 720
 721                vic = hdata->mode_conf.cea_video_id;
 722                hdmi_reg_writeb(hdata, HDMI_AVI_BYTE(4), vic);
 723
 724                chksum = hdmi_chksum(hdata, HDMI_AVI_BYTE(1),
 725                                        infoframe->len, hdr_sum);
 726                DRM_DEBUG_KMS("AVI checksum = 0x%x\n", chksum);
 727                hdmi_reg_writeb(hdata, HDMI_AVI_CHECK_SUM, chksum);
 728                break;
 729        case HDMI_PACKET_TYPE_AUI:
 730                hdmi_reg_writeb(hdata, HDMI_AUI_CON, 0x02);
 731                hdmi_reg_writeb(hdata, HDMI_AUI_HEADER0, infoframe->type);
 732                hdmi_reg_writeb(hdata, HDMI_AUI_HEADER1, infoframe->ver);
 733                hdmi_reg_writeb(hdata, HDMI_AUI_HEADER2, infoframe->len);
 734                hdr_sum = infoframe->type + infoframe->ver + infoframe->len;
 735                chksum = hdmi_chksum(hdata, HDMI_AUI_BYTE(1),
 736                                        infoframe->len, hdr_sum);
 737                DRM_DEBUG_KMS("AUI checksum = 0x%x\n", chksum);
 738                hdmi_reg_writeb(hdata, HDMI_AUI_CHECK_SUM, chksum);
 739                break;
 740        default:
 741                break;
 742        }
 743}
 744
 745static bool hdmi_is_connected(void *ctx)
 746{
 747        struct hdmi_context *hdata = ctx;
 748
 749        return hdata->hpd;
 750}
 751
 752static struct edid *hdmi_get_edid(void *ctx, struct drm_connector *connector)
 753{
 754        struct edid *raw_edid;
 755        struct hdmi_context *hdata = ctx;
 756
 757        if (!hdata->ddc_port)
 758                return ERR_PTR(-ENODEV);
 759
 760        raw_edid = drm_get_edid(connector, hdata->ddc_port->adapter);
 761        if (!raw_edid)
 762                return ERR_PTR(-ENODEV);
 763
 764        hdata->dvi_mode = !drm_detect_hdmi_monitor(raw_edid);
 765        DRM_DEBUG_KMS("%s : width[%d] x height[%d]\n",
 766                (hdata->dvi_mode ? "dvi monitor" : "hdmi monitor"),
 767                raw_edid->width_cm, raw_edid->height_cm);
 768
 769        return raw_edid;
 770}
 771
 772static int hdmi_find_phy_conf(struct hdmi_context *hdata, u32 pixel_clock)
 773{
 774        const struct hdmiphy_config *confs;
 775        int count, i;
 776
 777        if (hdata->type == HDMI_TYPE13) {
 778                confs = hdmiphy_v13_configs;
 779                count = ARRAY_SIZE(hdmiphy_v13_configs);
 780        } else if (hdata->type == HDMI_TYPE14) {
 781                confs = hdmiphy_v14_configs;
 782                count = ARRAY_SIZE(hdmiphy_v14_configs);
 783        } else
 784                return -EINVAL;
 785
 786        for (i = 0; i < count; i++)
 787                if (confs[i].pixel_clock == pixel_clock)
 788                        return i;
 789
 790        DRM_DEBUG_KMS("Could not find phy config for %d\n", pixel_clock);
 791        return -EINVAL;
 792}
 793
 794static int hdmi_check_mode(void *ctx, struct drm_display_mode *mode)
 795{
 796        struct hdmi_context *hdata = ctx;
 797        int ret;
 798
 799        DRM_DEBUG_KMS("xres=%d, yres=%d, refresh=%d, intl=%d clock=%d\n",
 800                mode->hdisplay, mode->vdisplay, mode->vrefresh,
 801                (mode->flags & DRM_MODE_FLAG_INTERLACE) ? true :
 802                false, mode->clock * 1000);
 803
 804        ret = hdmi_find_phy_conf(hdata, mode->clock * 1000);
 805        if (ret < 0)
 806                return ret;
 807        return 0;
 808}
 809
 810static void hdmi_set_acr(u32 freq, u8 *acr)
 811{
 812        u32 n, cts;
 813
 814        switch (freq) {
 815        case 32000:
 816                n = 4096;
 817                cts = 27000;
 818                break;
 819        case 44100:
 820                n = 6272;
 821                cts = 30000;
 822                break;
 823        case 88200:
 824                n = 12544;
 825                cts = 30000;
 826                break;
 827        case 176400:
 828                n = 25088;
 829                cts = 30000;
 830                break;
 831        case 48000:
 832                n = 6144;
 833                cts = 27000;
 834                break;
 835        case 96000:
 836                n = 12288;
 837                cts = 27000;
 838                break;
 839        case 192000:
 840                n = 24576;
 841                cts = 27000;
 842                break;
 843        default:
 844                n = 0;
 845                cts = 0;
 846                break;
 847        }
 848
 849        acr[1] = cts >> 16;
 850        acr[2] = cts >> 8 & 0xff;
 851        acr[3] = cts & 0xff;
 852
 853        acr[4] = n >> 16;
 854        acr[5] = n >> 8 & 0xff;
 855        acr[6] = n & 0xff;
 856}
 857
 858static void hdmi_reg_acr(struct hdmi_context *hdata, u8 *acr)
 859{
 860        hdmi_reg_writeb(hdata, HDMI_ACR_N0, acr[6]);
 861        hdmi_reg_writeb(hdata, HDMI_ACR_N1, acr[5]);
 862        hdmi_reg_writeb(hdata, HDMI_ACR_N2, acr[4]);
 863        hdmi_reg_writeb(hdata, HDMI_ACR_MCTS0, acr[3]);
 864        hdmi_reg_writeb(hdata, HDMI_ACR_MCTS1, acr[2]);
 865        hdmi_reg_writeb(hdata, HDMI_ACR_MCTS2, acr[1]);
 866        hdmi_reg_writeb(hdata, HDMI_ACR_CTS0, acr[3]);
 867        hdmi_reg_writeb(hdata, HDMI_ACR_CTS1, acr[2]);
 868        hdmi_reg_writeb(hdata, HDMI_ACR_CTS2, acr[1]);
 869
 870        if (hdata->type == HDMI_TYPE13)
 871                hdmi_reg_writeb(hdata, HDMI_V13_ACR_CON, 4);
 872        else
 873                hdmi_reg_writeb(hdata, HDMI_ACR_CON, 4);
 874}
 875
 876static void hdmi_audio_init(struct hdmi_context *hdata)
 877{
 878        u32 sample_rate, bits_per_sample, frame_size_code;
 879        u32 data_num, bit_ch, sample_frq;
 880        u32 val;
 881        u8 acr[7];
 882
 883        sample_rate = 44100;
 884        bits_per_sample = 16;
 885        frame_size_code = 0;
 886
 887        switch (bits_per_sample) {
 888        case 20:
 889                data_num = 2;
 890                bit_ch  = 1;
 891                break;
 892        case 24:
 893                data_num = 3;
 894                bit_ch  = 1;
 895                break;
 896        default:
 897                data_num = 1;
 898                bit_ch  = 0;
 899                break;
 900        }
 901
 902        hdmi_set_acr(sample_rate, acr);
 903        hdmi_reg_acr(hdata, acr);
 904
 905        hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CON, HDMI_I2S_IN_DISABLE
 906                                | HDMI_I2S_AUD_I2S | HDMI_I2S_CUV_I2S_ENABLE
 907                                | HDMI_I2S_MUX_ENABLE);
 908
 909        hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CH, HDMI_I2S_CH0_EN
 910                        | HDMI_I2S_CH1_EN | HDMI_I2S_CH2_EN);
 911
 912        hdmi_reg_writeb(hdata, HDMI_I2S_MUX_CUV, HDMI_I2S_CUV_RL_EN);
 913
 914        sample_frq = (sample_rate == 44100) ? 0 :
 915                        (sample_rate == 48000) ? 2 :
 916                        (sample_rate == 32000) ? 3 :
 917                        (sample_rate == 96000) ? 0xa : 0x0;
 918
 919        hdmi_reg_writeb(hdata, HDMI_I2S_CLK_CON, HDMI_I2S_CLK_DIS);
 920        hdmi_reg_writeb(hdata, HDMI_I2S_CLK_CON, HDMI_I2S_CLK_EN);
 921
 922        val = hdmi_reg_read(hdata, HDMI_I2S_DSD_CON) | 0x01;
 923        hdmi_reg_writeb(hdata, HDMI_I2S_DSD_CON, val);
 924
 925        /* Configuration I2S input ports. Configure I2S_PIN_SEL_0~4 */
 926        hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_0, HDMI_I2S_SEL_SCLK(5)
 927                        | HDMI_I2S_SEL_LRCK(6));
 928        hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_1, HDMI_I2S_SEL_SDATA1(1)
 929                        | HDMI_I2S_SEL_SDATA2(4));
 930        hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_2, HDMI_I2S_SEL_SDATA3(1)
 931                        | HDMI_I2S_SEL_SDATA2(2));
 932        hdmi_reg_writeb(hdata, HDMI_I2S_PIN_SEL_3, HDMI_I2S_SEL_DSD(0));
 933
 934        /* I2S_CON_1 & 2 */
 935        hdmi_reg_writeb(hdata, HDMI_I2S_CON_1, HDMI_I2S_SCLK_FALLING_EDGE
 936                        | HDMI_I2S_L_CH_LOW_POL);
 937        hdmi_reg_writeb(hdata, HDMI_I2S_CON_2, HDMI_I2S_MSB_FIRST_MODE
 938                        | HDMI_I2S_SET_BIT_CH(bit_ch)
 939                        | HDMI_I2S_SET_SDATA_BIT(data_num)
 940                        | HDMI_I2S_BASIC_FORMAT);
 941
 942        /* Configure register related to CUV information */
 943        hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_0, HDMI_I2S_CH_STATUS_MODE_0
 944                        | HDMI_I2S_2AUD_CH_WITHOUT_PREEMPH
 945                        | HDMI_I2S_COPYRIGHT
 946                        | HDMI_I2S_LINEAR_PCM
 947                        | HDMI_I2S_CONSUMER_FORMAT);
 948        hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_1, HDMI_I2S_CD_PLAYER);
 949        hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_2, HDMI_I2S_SET_SOURCE_NUM(0));
 950        hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_3, HDMI_I2S_CLK_ACCUR_LEVEL_2
 951                        | HDMI_I2S_SET_SMP_FREQ(sample_frq));
 952        hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_4,
 953                        HDMI_I2S_ORG_SMP_FREQ_44_1
 954                        | HDMI_I2S_WORD_LEN_MAX24_24BITS
 955                        | HDMI_I2S_WORD_LEN_MAX_24BITS);
 956
 957        hdmi_reg_writeb(hdata, HDMI_I2S_CH_ST_CON, HDMI_I2S_CH_STATUS_RELOAD);
 958}
 959
 960static void hdmi_audio_control(struct hdmi_context *hdata, bool onoff)
 961{
 962        if (hdata->dvi_mode)
 963                return;
 964
 965        hdmi_reg_writeb(hdata, HDMI_AUI_CON, onoff ? 2 : 0);
 966        hdmi_reg_writemask(hdata, HDMI_CON_0, onoff ?
 967                        HDMI_ASP_EN : HDMI_ASP_DIS, HDMI_ASP_MASK);
 968}
 969
 970static void hdmi_conf_reset(struct hdmi_context *hdata)
 971{
 972        u32 reg;
 973
 974        if (hdata->type == HDMI_TYPE13)
 975                reg = HDMI_V13_CORE_RSTOUT;
 976        else
 977                reg = HDMI_CORE_RSTOUT;
 978
 979        /* resetting HDMI core */
 980        hdmi_reg_writemask(hdata, reg,  0, HDMI_CORE_SW_RSTOUT);
 981        usleep_range(10000, 12000);
 982        hdmi_reg_writemask(hdata, reg, ~0, HDMI_CORE_SW_RSTOUT);
 983        usleep_range(10000, 12000);
 984}
 985
 986static void hdmi_conf_init(struct hdmi_context *hdata)
 987{
 988        struct hdmi_infoframe infoframe;
 989
 990        /* disable HPD interrupts from HDMI IP block, use GPIO instead */
 991        hdmi_reg_writemask(hdata, HDMI_INTC_CON, 0, HDMI_INTC_EN_GLOBAL |
 992                HDMI_INTC_EN_HPD_PLUG | HDMI_INTC_EN_HPD_UNPLUG);
 993
 994        /* choose HDMI mode */
 995        hdmi_reg_writemask(hdata, HDMI_MODE_SEL,
 996                HDMI_MODE_HDMI_EN, HDMI_MODE_MASK);
 997        /* disable bluescreen */
 998        hdmi_reg_writemask(hdata, HDMI_CON_0, 0, HDMI_BLUE_SCR_EN);
 999
1000        if (hdata->dvi_mode) {
1001                /* choose DVI mode */
1002                hdmi_reg_writemask(hdata, HDMI_MODE_SEL,
1003                                HDMI_MODE_DVI_EN, HDMI_MODE_MASK);
1004                hdmi_reg_writeb(hdata, HDMI_CON_2,
1005                                HDMI_VID_PREAMBLE_DIS | HDMI_GUARD_BAND_DIS);
1006        }
1007
1008        if (hdata->type == HDMI_TYPE13) {
1009                /* choose bluescreen (fecal) color */
1010                hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_0, 0x12);
1011                hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_1, 0x34);
1012                hdmi_reg_writeb(hdata, HDMI_V13_BLUE_SCREEN_2, 0x56);
1013
1014                /* enable AVI packet every vsync, fixes purple line problem */
1015                hdmi_reg_writeb(hdata, HDMI_V13_AVI_CON, 0x02);
1016                /* force RGB, look to CEA-861-D, table 7 for more detail */
1017                hdmi_reg_writeb(hdata, HDMI_V13_AVI_BYTE(0), 0 << 5);
1018                hdmi_reg_writemask(hdata, HDMI_CON_1, 0x10 << 5, 0x11 << 5);
1019
1020                hdmi_reg_writeb(hdata, HDMI_V13_SPD_CON, 0x02);
1021                hdmi_reg_writeb(hdata, HDMI_V13_AUI_CON, 0x02);
1022                hdmi_reg_writeb(hdata, HDMI_V13_ACR_CON, 0x04);
1023        } else {
1024                infoframe.type = HDMI_PACKET_TYPE_AVI;
1025                infoframe.ver = HDMI_AVI_VERSION;
1026                infoframe.len = HDMI_AVI_LENGTH;
1027                hdmi_reg_infoframe(hdata, &infoframe);
1028
1029                infoframe.type = HDMI_PACKET_TYPE_AUI;
1030                infoframe.ver = HDMI_AUI_VERSION;
1031                infoframe.len = HDMI_AUI_LENGTH;
1032                hdmi_reg_infoframe(hdata, &infoframe);
1033
1034                /* enable AVI packet every vsync, fixes purple line problem */
1035                hdmi_reg_writemask(hdata, HDMI_CON_1, 2, 3 << 5);
1036        }
1037}
1038
1039static void hdmi_v13_mode_apply(struct hdmi_context *hdata)
1040{
1041        const struct hdmi_tg_regs *tg = &hdata->mode_conf.conf.v13_conf.tg;
1042        const struct hdmi_v13_core_regs *core =
1043                &hdata->mode_conf.conf.v13_conf.core;
1044        int tries;
1045
1046        /* setting core registers */
1047        hdmi_reg_writeb(hdata, HDMI_H_BLANK_0, core->h_blank[0]);
1048        hdmi_reg_writeb(hdata, HDMI_H_BLANK_1, core->h_blank[1]);
1049        hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_0, core->v_blank[0]);
1050        hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_1, core->v_blank[1]);
1051        hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_2, core->v_blank[2]);
1052        hdmi_reg_writeb(hdata, HDMI_V13_H_V_LINE_0, core->h_v_line[0]);
1053        hdmi_reg_writeb(hdata, HDMI_V13_H_V_LINE_1, core->h_v_line[1]);
1054        hdmi_reg_writeb(hdata, HDMI_V13_H_V_LINE_2, core->h_v_line[2]);
1055        hdmi_reg_writeb(hdata, HDMI_VSYNC_POL, core->vsync_pol[0]);
1056        hdmi_reg_writeb(hdata, HDMI_INT_PRO_MODE, core->int_pro_mode[0]);
1057        hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_F_0, core->v_blank_f[0]);
1058        hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_F_1, core->v_blank_f[1]);
1059        hdmi_reg_writeb(hdata, HDMI_V13_V_BLANK_F_2, core->v_blank_f[2]);
1060        hdmi_reg_writeb(hdata, HDMI_V13_H_SYNC_GEN_0, core->h_sync_gen[0]);
1061        hdmi_reg_writeb(hdata, HDMI_V13_H_SYNC_GEN_1, core->h_sync_gen[1]);
1062        hdmi_reg_writeb(hdata, HDMI_V13_H_SYNC_GEN_2, core->h_sync_gen[2]);
1063        hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_1_0, core->v_sync_gen1[0]);
1064        hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_1_1, core->v_sync_gen1[1]);
1065        hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_1_2, core->v_sync_gen1[2]);
1066        hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_2_0, core->v_sync_gen2[0]);
1067        hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_2_1, core->v_sync_gen2[1]);
1068        hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_2_2, core->v_sync_gen2[2]);
1069        hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_3_0, core->v_sync_gen3[0]);
1070        hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_3_1, core->v_sync_gen3[1]);
1071        hdmi_reg_writeb(hdata, HDMI_V13_V_SYNC_GEN_3_2, core->v_sync_gen3[2]);
1072        /* Timing generator registers */
1073        hdmi_reg_writeb(hdata, HDMI_TG_H_FSZ_L, tg->h_fsz[0]);
1074        hdmi_reg_writeb(hdata, HDMI_TG_H_FSZ_H, tg->h_fsz[1]);
1075        hdmi_reg_writeb(hdata, HDMI_TG_HACT_ST_L, tg->hact_st[0]);
1076        hdmi_reg_writeb(hdata, HDMI_TG_HACT_ST_H, tg->hact_st[1]);
1077        hdmi_reg_writeb(hdata, HDMI_TG_HACT_SZ_L, tg->hact_sz[0]);
1078        hdmi_reg_writeb(hdata, HDMI_TG_HACT_SZ_H, tg->hact_sz[1]);
1079        hdmi_reg_writeb(hdata, HDMI_TG_V_FSZ_L, tg->v_fsz[0]);
1080        hdmi_reg_writeb(hdata, HDMI_TG_V_FSZ_H, tg->v_fsz[1]);
1081        hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_L, tg->vsync[0]);
1082        hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_H, tg->vsync[1]);
1083        hdmi_reg_writeb(hdata, HDMI_TG_VSYNC2_L, tg->vsync2[0]);
1084        hdmi_reg_writeb(hdata, HDMI_TG_VSYNC2_H, tg->vsync2[1]);
1085        hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST_L, tg->vact_st[0]);
1086        hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST_H, tg->vact_st[1]);
1087        hdmi_reg_writeb(hdata, HDMI_TG_VACT_SZ_L, tg->vact_sz[0]);
1088        hdmi_reg_writeb(hdata, HDMI_TG_VACT_SZ_H, tg->vact_sz[1]);
1089        hdmi_reg_writeb(hdata, HDMI_TG_FIELD_CHG_L, tg->field_chg[0]);
1090        hdmi_reg_writeb(hdata, HDMI_TG_FIELD_CHG_H, tg->field_chg[1]);
1091        hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST2_L, tg->vact_st2[0]);
1092        hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST2_H, tg->vact_st2[1]);
1093        hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_TOP_HDMI_L, tg->vsync_top_hdmi[0]);
1094        hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_TOP_HDMI_H, tg->vsync_top_hdmi[1]);
1095        hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_BOT_HDMI_L, tg->vsync_bot_hdmi[0]);
1096        hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_BOT_HDMI_H, tg->vsync_bot_hdmi[1]);
1097        hdmi_reg_writeb(hdata, HDMI_TG_FIELD_TOP_HDMI_L, tg->field_top_hdmi[0]);
1098        hdmi_reg_writeb(hdata, HDMI_TG_FIELD_TOP_HDMI_H, tg->field_top_hdmi[1]);
1099        hdmi_reg_writeb(hdata, HDMI_TG_FIELD_BOT_HDMI_L, tg->field_bot_hdmi[0]);
1100        hdmi_reg_writeb(hdata, HDMI_TG_FIELD_BOT_HDMI_H, tg->field_bot_hdmi[1]);
1101
1102        /* waiting for HDMIPHY's PLL to get to steady state */
1103        for (tries = 100; tries; --tries) {
1104                u32 val = hdmi_reg_read(hdata, HDMI_V13_PHY_STATUS);
1105                if (val & HDMI_PHY_STATUS_READY)
1106                        break;
1107                usleep_range(1000, 2000);
1108        }
1109        /* steady state not achieved */
1110        if (tries == 0) {
1111                DRM_ERROR("hdmiphy's pll could not reach steady state.\n");
1112                hdmi_regs_dump(hdata, "timing apply");
1113        }
1114
1115        clk_disable_unprepare(hdata->res.sclk_hdmi);
1116        clk_set_parent(hdata->res.mout_hdmi, hdata->res.sclk_hdmiphy);
1117        clk_prepare_enable(hdata->res.sclk_hdmi);
1118
1119        /* enable HDMI and timing generator */
1120        hdmi_reg_writemask(hdata, HDMI_CON_0, ~0, HDMI_EN);
1121        if (core->int_pro_mode[0])
1122                hdmi_reg_writemask(hdata, HDMI_TG_CMD, ~0, HDMI_TG_EN |
1123                                HDMI_FIELD_EN);
1124        else
1125                hdmi_reg_writemask(hdata, HDMI_TG_CMD, ~0, HDMI_TG_EN);
1126}
1127
1128static void hdmi_v14_mode_apply(struct hdmi_context *hdata)
1129{
1130        const struct hdmi_tg_regs *tg = &hdata->mode_conf.conf.v14_conf.tg;
1131        const struct hdmi_v14_core_regs *core =
1132                &hdata->mode_conf.conf.v14_conf.core;
1133        int tries;
1134
1135        /* setting core registers */
1136        hdmi_reg_writeb(hdata, HDMI_H_BLANK_0, core->h_blank[0]);
1137        hdmi_reg_writeb(hdata, HDMI_H_BLANK_1, core->h_blank[1]);
1138        hdmi_reg_writeb(hdata, HDMI_V2_BLANK_0, core->v2_blank[0]);
1139        hdmi_reg_writeb(hdata, HDMI_V2_BLANK_1, core->v2_blank[1]);
1140        hdmi_reg_writeb(hdata, HDMI_V1_BLANK_0, core->v1_blank[0]);
1141        hdmi_reg_writeb(hdata, HDMI_V1_BLANK_1, core->v1_blank[1]);
1142        hdmi_reg_writeb(hdata, HDMI_V_LINE_0, core->v_line[0]);
1143        hdmi_reg_writeb(hdata, HDMI_V_LINE_1, core->v_line[1]);
1144        hdmi_reg_writeb(hdata, HDMI_H_LINE_0, core->h_line[0]);
1145        hdmi_reg_writeb(hdata, HDMI_H_LINE_1, core->h_line[1]);
1146        hdmi_reg_writeb(hdata, HDMI_HSYNC_POL, core->hsync_pol[0]);
1147        hdmi_reg_writeb(hdata, HDMI_VSYNC_POL, core->vsync_pol[0]);
1148        hdmi_reg_writeb(hdata, HDMI_INT_PRO_MODE, core->int_pro_mode[0]);
1149        hdmi_reg_writeb(hdata, HDMI_V_BLANK_F0_0, core->v_blank_f0[0]);
1150        hdmi_reg_writeb(hdata, HDMI_V_BLANK_F0_1, core->v_blank_f0[1]);
1151        hdmi_reg_writeb(hdata, HDMI_V_BLANK_F1_0, core->v_blank_f1[0]);
1152        hdmi_reg_writeb(hdata, HDMI_V_BLANK_F1_1, core->v_blank_f1[1]);
1153        hdmi_reg_writeb(hdata, HDMI_H_SYNC_START_0, core->h_sync_start[0]);
1154        hdmi_reg_writeb(hdata, HDMI_H_SYNC_START_1, core->h_sync_start[1]);
1155        hdmi_reg_writeb(hdata, HDMI_H_SYNC_END_0, core->h_sync_end[0]);
1156        hdmi_reg_writeb(hdata, HDMI_H_SYNC_END_1, core->h_sync_end[1]);
1157        hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_BEF_2_0,
1158                        core->v_sync_line_bef_2[0]);
1159        hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_BEF_2_1,
1160                        core->v_sync_line_bef_2[1]);
1161        hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_BEF_1_0,
1162                        core->v_sync_line_bef_1[0]);
1163        hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_BEF_1_1,
1164                        core->v_sync_line_bef_1[1]);
1165        hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_2_0,
1166                        core->v_sync_line_aft_2[0]);
1167        hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_2_1,
1168                        core->v_sync_line_aft_2[1]);
1169        hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_1_0,
1170                        core->v_sync_line_aft_1[0]);
1171        hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_1_1,
1172                        core->v_sync_line_aft_1[1]);
1173        hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_2_0,
1174                        core->v_sync_line_aft_pxl_2[0]);
1175        hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_2_1,
1176                        core->v_sync_line_aft_pxl_2[1]);
1177        hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_1_0,
1178                        core->v_sync_line_aft_pxl_1[0]);
1179        hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_1_1,
1180                        core->v_sync_line_aft_pxl_1[1]);
1181        hdmi_reg_writeb(hdata, HDMI_V_BLANK_F2_0, core->v_blank_f2[0]);
1182        hdmi_reg_writeb(hdata, HDMI_V_BLANK_F2_1, core->v_blank_f2[1]);
1183        hdmi_reg_writeb(hdata, HDMI_V_BLANK_F3_0, core->v_blank_f3[0]);
1184        hdmi_reg_writeb(hdata, HDMI_V_BLANK_F3_1, core->v_blank_f3[1]);
1185        hdmi_reg_writeb(hdata, HDMI_V_BLANK_F4_0, core->v_blank_f4[0]);
1186        hdmi_reg_writeb(hdata, HDMI_V_BLANK_F4_1, core->v_blank_f4[1]);
1187        hdmi_reg_writeb(hdata, HDMI_V_BLANK_F5_0, core->v_blank_f5[0]);
1188        hdmi_reg_writeb(hdata, HDMI_V_BLANK_F5_1, core->v_blank_f5[1]);
1189        hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_3_0,
1190                        core->v_sync_line_aft_3[0]);
1191        hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_3_1,
1192                        core->v_sync_line_aft_3[1]);
1193        hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_4_0,
1194                        core->v_sync_line_aft_4[0]);
1195        hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_4_1,
1196                        core->v_sync_line_aft_4[1]);
1197        hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_5_0,
1198                        core->v_sync_line_aft_5[0]);
1199        hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_5_1,
1200                        core->v_sync_line_aft_5[1]);
1201        hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_6_0,
1202                        core->v_sync_line_aft_6[0]);
1203        hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_6_1,
1204                        core->v_sync_line_aft_6[1]);
1205        hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_3_0,
1206                        core->v_sync_line_aft_pxl_3[0]);
1207        hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_3_1,
1208                        core->v_sync_line_aft_pxl_3[1]);
1209        hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_4_0,
1210                        core->v_sync_line_aft_pxl_4[0]);
1211        hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_4_1,
1212                        core->v_sync_line_aft_pxl_4[1]);
1213        hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_5_0,
1214                        core->v_sync_line_aft_pxl_5[0]);
1215        hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_5_1,
1216                        core->v_sync_line_aft_pxl_5[1]);
1217        hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_6_0,
1218                        core->v_sync_line_aft_pxl_6[0]);
1219        hdmi_reg_writeb(hdata, HDMI_V_SYNC_LINE_AFT_PXL_6_1,
1220                        core->v_sync_line_aft_pxl_6[1]);
1221        hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_1_0, core->vact_space_1[0]);
1222        hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_1_1, core->vact_space_1[1]);
1223        hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_2_0, core->vact_space_2[0]);
1224        hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_2_1, core->vact_space_2[1]);
1225        hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_3_0, core->vact_space_3[0]);
1226        hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_3_1, core->vact_space_3[1]);
1227        hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_4_0, core->vact_space_4[0]);
1228        hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_4_1, core->vact_space_4[1]);
1229        hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_5_0, core->vact_space_5[0]);
1230        hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_5_1, core->vact_space_5[1]);
1231        hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_6_0, core->vact_space_6[0]);
1232        hdmi_reg_writeb(hdata, HDMI_VACT_SPACE_6_1, core->vact_space_6[1]);
1233
1234        /* Timing generator registers */
1235        hdmi_reg_writeb(hdata, HDMI_TG_H_FSZ_L, tg->h_fsz[0]);
1236        hdmi_reg_writeb(hdata, HDMI_TG_H_FSZ_H, tg->h_fsz[1]);
1237        hdmi_reg_writeb(hdata, HDMI_TG_HACT_ST_L, tg->hact_st[0]);
1238        hdmi_reg_writeb(hdata, HDMI_TG_HACT_ST_H, tg->hact_st[1]);
1239        hdmi_reg_writeb(hdata, HDMI_TG_HACT_SZ_L, tg->hact_sz[0]);
1240        hdmi_reg_writeb(hdata, HDMI_TG_HACT_SZ_H, tg->hact_sz[1]);
1241        hdmi_reg_writeb(hdata, HDMI_TG_V_FSZ_L, tg->v_fsz[0]);
1242        hdmi_reg_writeb(hdata, HDMI_TG_V_FSZ_H, tg->v_fsz[1]);
1243        hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_L, tg->vsync[0]);
1244        hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_H, tg->vsync[1]);
1245        hdmi_reg_writeb(hdata, HDMI_TG_VSYNC2_L, tg->vsync2[0]);
1246        hdmi_reg_writeb(hdata, HDMI_TG_VSYNC2_H, tg->vsync2[1]);
1247        hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST_L, tg->vact_st[0]);
1248        hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST_H, tg->vact_st[1]);
1249        hdmi_reg_writeb(hdata, HDMI_TG_VACT_SZ_L, tg->vact_sz[0]);
1250        hdmi_reg_writeb(hdata, HDMI_TG_VACT_SZ_H, tg->vact_sz[1]);
1251        hdmi_reg_writeb(hdata, HDMI_TG_FIELD_CHG_L, tg->field_chg[0]);
1252        hdmi_reg_writeb(hdata, HDMI_TG_FIELD_CHG_H, tg->field_chg[1]);
1253        hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST2_L, tg->vact_st2[0]);
1254        hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST2_H, tg->vact_st2[1]);
1255        hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST3_L, tg->vact_st3[0]);
1256        hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST3_H, tg->vact_st3[1]);
1257        hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST4_L, tg->vact_st4[0]);
1258        hdmi_reg_writeb(hdata, HDMI_TG_VACT_ST4_H, tg->vact_st4[1]);
1259        hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_TOP_HDMI_L, tg->vsync_top_hdmi[0]);
1260        hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_TOP_HDMI_H, tg->vsync_top_hdmi[1]);
1261        hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_BOT_HDMI_L, tg->vsync_bot_hdmi[0]);
1262        hdmi_reg_writeb(hdata, HDMI_TG_VSYNC_BOT_HDMI_H, tg->vsync_bot_hdmi[1]);
1263        hdmi_reg_writeb(hdata, HDMI_TG_FIELD_TOP_HDMI_L, tg->field_top_hdmi[0]);
1264        hdmi_reg_writeb(hdata, HDMI_TG_FIELD_TOP_HDMI_H, tg->field_top_hdmi[1]);
1265        hdmi_reg_writeb(hdata, HDMI_TG_FIELD_BOT_HDMI_L, tg->field_bot_hdmi[0]);
1266        hdmi_reg_writeb(hdata, HDMI_TG_FIELD_BOT_HDMI_H, tg->field_bot_hdmi[1]);
1267        hdmi_reg_writeb(hdata, HDMI_TG_3D, tg->tg_3d[0]);
1268
1269        /* waiting for HDMIPHY's PLL to get to steady state */
1270        for (tries = 100; tries; --tries) {
1271                u32 val = hdmi_reg_read(hdata, HDMI_PHY_STATUS_0);
1272                if (val & HDMI_PHY_STATUS_READY)
1273                        break;
1274                usleep_range(1000, 2000);
1275        }
1276        /* steady state not achieved */
1277        if (tries == 0) {
1278                DRM_ERROR("hdmiphy's pll could not reach steady state.\n");
1279                hdmi_regs_dump(hdata, "timing apply");
1280        }
1281
1282        clk_disable_unprepare(hdata->res.sclk_hdmi);
1283        clk_set_parent(hdata->res.mout_hdmi, hdata->res.sclk_hdmiphy);
1284        clk_prepare_enable(hdata->res.sclk_hdmi);
1285
1286        /* enable HDMI and timing generator */
1287        hdmi_reg_writemask(hdata, HDMI_CON_0, ~0, HDMI_EN);
1288        if (core->int_pro_mode[0])
1289                hdmi_reg_writemask(hdata, HDMI_TG_CMD, ~0, HDMI_TG_EN |
1290                                HDMI_FIELD_EN);
1291        else
1292                hdmi_reg_writemask(hdata, HDMI_TG_CMD, ~0, HDMI_TG_EN);
1293}
1294
1295static void hdmi_mode_apply(struct hdmi_context *hdata)
1296{
1297        if (hdata->type == HDMI_TYPE13)
1298                hdmi_v13_mode_apply(hdata);
1299        else
1300                hdmi_v14_mode_apply(hdata);
1301}
1302
1303static void hdmiphy_conf_reset(struct hdmi_context *hdata)
1304{
1305        u8 buffer[2];
1306        u32 reg;
1307
1308        clk_disable_unprepare(hdata->res.sclk_hdmi);
1309        clk_set_parent(hdata->res.mout_hdmi, hdata->res.sclk_pixel);
1310        clk_prepare_enable(hdata->res.sclk_hdmi);
1311
1312        /* operation mode */
1313        buffer[0] = 0x1f;
1314        buffer[1] = 0x00;
1315
1316        if (hdata->hdmiphy_port)
1317                i2c_master_send(hdata->hdmiphy_port, buffer, 2);
1318
1319        if (hdata->type == HDMI_TYPE13)
1320                reg = HDMI_V13_PHY_RSTOUT;
1321        else
1322                reg = HDMI_PHY_RSTOUT;
1323
1324        /* reset hdmiphy */
1325        hdmi_reg_writemask(hdata, reg, ~0, HDMI_PHY_SW_RSTOUT);
1326        usleep_range(10000, 12000);
1327        hdmi_reg_writemask(hdata, reg,  0, HDMI_PHY_SW_RSTOUT);
1328        usleep_range(10000, 12000);
1329}
1330
1331static void hdmiphy_poweron(struct hdmi_context *hdata)
1332{
1333        if (hdata->type == HDMI_TYPE14)
1334                hdmi_reg_writemask(hdata, HDMI_PHY_CON_0, 0,
1335                        HDMI_PHY_POWER_OFF_EN);
1336}
1337
1338static void hdmiphy_poweroff(struct hdmi_context *hdata)
1339{
1340        if (hdata->type == HDMI_TYPE14)
1341                hdmi_reg_writemask(hdata, HDMI_PHY_CON_0, ~0,
1342                        HDMI_PHY_POWER_OFF_EN);
1343}
1344
1345static void hdmiphy_conf_apply(struct hdmi_context *hdata)
1346{
1347        const u8 *hdmiphy_data;
1348        u8 buffer[32];
1349        u8 operation[2];
1350        u8 read_buffer[32] = {0, };
1351        int ret;
1352        int i;
1353
1354        if (!hdata->hdmiphy_port) {
1355                DRM_ERROR("hdmiphy is not attached\n");
1356                return;
1357        }
1358
1359        /* pixel clock */
1360        i = hdmi_find_phy_conf(hdata, hdata->mode_conf.pixel_clock);
1361        if (i < 0) {
1362                DRM_ERROR("failed to find hdmiphy conf\n");
1363                return;
1364        }
1365
1366        if (hdata->type == HDMI_TYPE13)
1367                hdmiphy_data = hdmiphy_v13_configs[i].conf;
1368        else
1369                hdmiphy_data = hdmiphy_v14_configs[i].conf;
1370
1371        memcpy(buffer, hdmiphy_data, 32);
1372        ret = i2c_master_send(hdata->hdmiphy_port, buffer, 32);
1373        if (ret != 32) {
1374                DRM_ERROR("failed to configure HDMIPHY via I2C\n");
1375                return;
1376        }
1377
1378        usleep_range(10000, 12000);
1379
1380        /* operation mode */
1381        operation[0] = 0x1f;
1382        operation[1] = 0x80;
1383
1384        ret = i2c_master_send(hdata->hdmiphy_port, operation, 2);
1385        if (ret != 2) {
1386                DRM_ERROR("failed to enable hdmiphy\n");
1387                return;
1388        }
1389
1390        ret = i2c_master_recv(hdata->hdmiphy_port, read_buffer, 32);
1391        if (ret < 0) {
1392                DRM_ERROR("failed to read hdmiphy config\n");
1393                return;
1394        }
1395
1396        for (i = 0; i < ret; i++)
1397                DRM_DEBUG_KMS("hdmiphy[0x%02x] write[0x%02x] - "
1398                        "recv [0x%02x]\n", i, buffer[i], read_buffer[i]);
1399}
1400
1401static void hdmi_conf_apply(struct hdmi_context *hdata)
1402{
1403        hdmiphy_conf_reset(hdata);
1404        hdmiphy_conf_apply(hdata);
1405
1406        mutex_lock(&hdata->hdmi_mutex);
1407        hdmi_conf_reset(hdata);
1408        hdmi_conf_init(hdata);
1409        mutex_unlock(&hdata->hdmi_mutex);
1410
1411        hdmi_audio_init(hdata);
1412
1413        /* setting core registers */
1414        hdmi_mode_apply(hdata);
1415        hdmi_audio_control(hdata, true);
1416
1417        hdmi_regs_dump(hdata, "start");
1418}
1419
1420static void hdmi_set_reg(u8 *reg_pair, int num_bytes, u32 value)
1421{
1422        int i;
1423        BUG_ON(num_bytes > 4);
1424        for (i = 0; i < num_bytes; i++)
1425                reg_pair[i] = (value >> (8 * i)) & 0xff;
1426}
1427
1428static void hdmi_v13_mode_set(struct hdmi_context *hdata,
1429                        struct drm_display_mode *m)
1430{
1431        struct hdmi_v13_core_regs *core = &hdata->mode_conf.conf.v13_conf.core;
1432        struct hdmi_tg_regs *tg = &hdata->mode_conf.conf.v13_conf.tg;
1433        unsigned int val;
1434
1435        hdata->mode_conf.cea_video_id =
1436                drm_match_cea_mode((struct drm_display_mode *)m);
1437        hdata->mode_conf.pixel_clock = m->clock * 1000;
1438
1439        hdmi_set_reg(core->h_blank, 2, m->htotal - m->hdisplay);
1440        hdmi_set_reg(core->h_v_line, 3, (m->htotal << 12) | m->vtotal);
1441
1442        val = (m->flags & DRM_MODE_FLAG_NVSYNC) ? 1 : 0;
1443        hdmi_set_reg(core->vsync_pol, 1, val);
1444
1445        val = (m->flags & DRM_MODE_FLAG_INTERLACE) ? 1 : 0;
1446        hdmi_set_reg(core->int_pro_mode, 1, val);
1447
1448        val = (m->hsync_start - m->hdisplay - 2);
1449        val |= ((m->hsync_end - m->hdisplay - 2) << 10);
1450        val |= ((m->flags & DRM_MODE_FLAG_NHSYNC)  ? 1 : 0)<<20;
1451        hdmi_set_reg(core->h_sync_gen, 3, val);
1452
1453        /*
1454         * Quirk requirement for exynos HDMI IP design,
1455         * 2 pixels less than the actual calculation for hsync_start
1456         * and end.
1457         */
1458
1459        /* Following values & calculations differ for different type of modes */
1460        if (m->flags & DRM_MODE_FLAG_INTERLACE) {
1461                /* Interlaced Mode */
1462                val = ((m->vsync_end - m->vdisplay) / 2);
1463                val |= ((m->vsync_start - m->vdisplay) / 2) << 12;
1464                hdmi_set_reg(core->v_sync_gen1, 3, val);
1465
1466                val = m->vtotal / 2;
1467                val |= ((m->vtotal - m->vdisplay) / 2) << 11;
1468                hdmi_set_reg(core->v_blank, 3, val);
1469
1470                val = (m->vtotal +
1471                        ((m->vsync_end - m->vsync_start) * 4) + 5) / 2;
1472                val |= m->vtotal << 11;
1473                hdmi_set_reg(core->v_blank_f, 3, val);
1474
1475                val = ((m->vtotal / 2) + 7);
1476                val |= ((m->vtotal / 2) + 2) << 12;
1477                hdmi_set_reg(core->v_sync_gen2, 3, val);
1478
1479                val = ((m->htotal / 2) + (m->hsync_start - m->hdisplay));
1480                val |= ((m->htotal / 2) +
1481                        (m->hsync_start - m->hdisplay)) << 12;
1482                hdmi_set_reg(core->v_sync_gen3, 3, val);
1483
1484                hdmi_set_reg(tg->vact_st, 2, (m->vtotal - m->vdisplay) / 2);
1485                hdmi_set_reg(tg->vact_sz, 2, m->vdisplay / 2);
1486
1487                hdmi_set_reg(tg->vact_st2, 2, 0x249);/* Reset value + 1*/
1488        } else {
1489                /* Progressive Mode */
1490
1491                val = m->vtotal;
1492                val |= (m->vtotal - m->vdisplay) << 11;
1493                hdmi_set_reg(core->v_blank, 3, val);
1494
1495                hdmi_set_reg(core->v_blank_f, 3, 0);
1496
1497                val = (m->vsync_end - m->vdisplay);
1498                val |= ((m->vsync_start - m->vdisplay) << 12);
1499                hdmi_set_reg(core->v_sync_gen1, 3, val);
1500
1501                hdmi_set_reg(core->v_sync_gen2, 3, 0x1001);/* Reset value  */
1502                hdmi_set_reg(core->v_sync_gen3, 3, 0x1001);/* Reset value  */
1503                hdmi_set_reg(tg->vact_st, 2, m->vtotal - m->vdisplay);
1504                hdmi_set_reg(tg->vact_sz, 2, m->vdisplay);
1505                hdmi_set_reg(tg->vact_st2, 2, 0x248); /* Reset value */
1506        }
1507
1508        /* Timing generator registers */
1509        hdmi_set_reg(tg->cmd, 1, 0x0);
1510        hdmi_set_reg(tg->h_fsz, 2, m->htotal);
1511        hdmi_set_reg(tg->hact_st, 2, m->htotal - m->hdisplay);
1512        hdmi_set_reg(tg->hact_sz, 2, m->hdisplay);
1513        hdmi_set_reg(tg->v_fsz, 2, m->vtotal);
1514        hdmi_set_reg(tg->vsync, 2, 0x1);
1515        hdmi_set_reg(tg->vsync2, 2, 0x233); /* Reset value */
1516        hdmi_set_reg(tg->field_chg, 2, 0x233); /* Reset value */
1517        hdmi_set_reg(tg->vsync_top_hdmi, 2, 0x1); /* Reset value */
1518        hdmi_set_reg(tg->vsync_bot_hdmi, 2, 0x233); /* Reset value */
1519        hdmi_set_reg(tg->field_top_hdmi, 2, 0x1); /* Reset value */
1520        hdmi_set_reg(tg->field_bot_hdmi, 2, 0x233); /* Reset value */
1521        hdmi_set_reg(tg->tg_3d, 1, 0x0); /* Not used */
1522}
1523
1524static void hdmi_v14_mode_set(struct hdmi_context *hdata,
1525                        struct drm_display_mode *m)
1526{
1527        struct hdmi_tg_regs *tg = &hdata->mode_conf.conf.v14_conf.tg;
1528        struct hdmi_v14_core_regs *core =
1529                &hdata->mode_conf.conf.v14_conf.core;
1530
1531        hdata->mode_conf.cea_video_id =
1532                drm_match_cea_mode((struct drm_display_mode *)m);
1533        hdata->mode_conf.pixel_clock = m->clock * 1000;
1534
1535        hdmi_set_reg(core->h_blank, 2, m->htotal - m->hdisplay);
1536        hdmi_set_reg(core->v_line, 2, m->vtotal);
1537        hdmi_set_reg(core->h_line, 2, m->htotal);
1538        hdmi_set_reg(core->hsync_pol, 1,
1539                        (m->flags & DRM_MODE_FLAG_NHSYNC)  ? 1 : 0);
1540        hdmi_set_reg(core->vsync_pol, 1,
1541                        (m->flags & DRM_MODE_FLAG_NVSYNC) ? 1 : 0);
1542        hdmi_set_reg(core->int_pro_mode, 1,
1543                        (m->flags & DRM_MODE_FLAG_INTERLACE) ? 1 : 0);
1544
1545        /*
1546         * Quirk requirement for exynos 5 HDMI IP design,
1547         * 2 pixels less than the actual calculation for hsync_start
1548         * and end.
1549         */
1550
1551        /* Following values & calculations differ for different type of modes */
1552        if (m->flags & DRM_MODE_FLAG_INTERLACE) {
1553                /* Interlaced Mode */
1554                hdmi_set_reg(core->v_sync_line_bef_2, 2,
1555                        (m->vsync_end - m->vdisplay) / 2);
1556                hdmi_set_reg(core->v_sync_line_bef_1, 2,
1557                        (m->vsync_start - m->vdisplay) / 2);
1558                hdmi_set_reg(core->v2_blank, 2, m->vtotal / 2);
1559                hdmi_set_reg(core->v1_blank, 2, (m->vtotal - m->vdisplay) / 2);
1560                hdmi_set_reg(core->v_blank_f0, 2, m->vtotal - m->vdisplay / 2);
1561                hdmi_set_reg(core->v_blank_f1, 2, m->vtotal);
1562                hdmi_set_reg(core->v_sync_line_aft_2, 2, (m->vtotal / 2) + 7);
1563                hdmi_set_reg(core->v_sync_line_aft_1, 2, (m->vtotal / 2) + 2);
1564                hdmi_set_reg(core->v_sync_line_aft_pxl_2, 2,
1565                        (m->htotal / 2) + (m->hsync_start - m->hdisplay));
1566                hdmi_set_reg(core->v_sync_line_aft_pxl_1, 2,
1567                        (m->htotal / 2) + (m->hsync_start - m->hdisplay));
1568                hdmi_set_reg(tg->vact_st, 2, (m->vtotal - m->vdisplay) / 2);
1569                hdmi_set_reg(tg->vact_sz, 2, m->vdisplay / 2);
1570                hdmi_set_reg(tg->vact_st2, 2, m->vtotal - m->vdisplay / 2);
1571                hdmi_set_reg(tg->vsync2, 2, (m->vtotal / 2) + 1);
1572                hdmi_set_reg(tg->vsync_bot_hdmi, 2, (m->vtotal / 2) + 1);
1573                hdmi_set_reg(tg->field_bot_hdmi, 2, (m->vtotal / 2) + 1);
1574                hdmi_set_reg(tg->vact_st3, 2, 0x0);
1575                hdmi_set_reg(tg->vact_st4, 2, 0x0);
1576        } else {
1577                /* Progressive Mode */
1578                hdmi_set_reg(core->v_sync_line_bef_2, 2,
1579                        m->vsync_end - m->vdisplay);
1580                hdmi_set_reg(core->v_sync_line_bef_1, 2,
1581                        m->vsync_start - m->vdisplay);
1582                hdmi_set_reg(core->v2_blank, 2, m->vtotal);
1583                hdmi_set_reg(core->v1_blank, 2, m->vtotal - m->vdisplay);
1584                hdmi_set_reg(core->v_blank_f0, 2, 0xffff);
1585                hdmi_set_reg(core->v_blank_f1, 2, 0xffff);
1586                hdmi_set_reg(core->v_sync_line_aft_2, 2, 0xffff);
1587                hdmi_set_reg(core->v_sync_line_aft_1, 2, 0xffff);
1588                hdmi_set_reg(core->v_sync_line_aft_pxl_2, 2, 0xffff);
1589                hdmi_set_reg(core->v_sync_line_aft_pxl_1, 2, 0xffff);
1590                hdmi_set_reg(tg->vact_st, 2, m->vtotal - m->vdisplay);
1591                hdmi_set_reg(tg->vact_sz, 2, m->vdisplay);
1592                hdmi_set_reg(tg->vact_st2, 2, 0x248); /* Reset value */
1593                hdmi_set_reg(tg->vact_st3, 2, 0x47b); /* Reset value */
1594                hdmi_set_reg(tg->vact_st4, 2, 0x6ae); /* Reset value */
1595                hdmi_set_reg(tg->vsync2, 2, 0x233); /* Reset value */
1596                hdmi_set_reg(tg->vsync_bot_hdmi, 2, 0x233); /* Reset value */
1597                hdmi_set_reg(tg->field_bot_hdmi, 2, 0x233); /* Reset value */
1598        }
1599
1600        /* Following values & calculations are same irrespective of mode type */
1601        hdmi_set_reg(core->h_sync_start, 2, m->hsync_start - m->hdisplay - 2);
1602        hdmi_set_reg(core->h_sync_end, 2, m->hsync_end - m->hdisplay - 2);
1603        hdmi_set_reg(core->vact_space_1, 2, 0xffff);
1604        hdmi_set_reg(core->vact_space_2, 2, 0xffff);
1605        hdmi_set_reg(core->vact_space_3, 2, 0xffff);
1606        hdmi_set_reg(core->vact_space_4, 2, 0xffff);
1607        hdmi_set_reg(core->vact_space_5, 2, 0xffff);
1608        hdmi_set_reg(core->vact_space_6, 2, 0xffff);
1609        hdmi_set_reg(core->v_blank_f2, 2, 0xffff);
1610        hdmi_set_reg(core->v_blank_f3, 2, 0xffff);
1611        hdmi_set_reg(core->v_blank_f4, 2, 0xffff);
1612        hdmi_set_reg(core->v_blank_f5, 2, 0xffff);
1613        hdmi_set_reg(core->v_sync_line_aft_3, 2, 0xffff);
1614        hdmi_set_reg(core->v_sync_line_aft_4, 2, 0xffff);
1615        hdmi_set_reg(core->v_sync_line_aft_5, 2, 0xffff);
1616        hdmi_set_reg(core->v_sync_line_aft_6, 2, 0xffff);
1617        hdmi_set_reg(core->v_sync_line_aft_pxl_3, 2, 0xffff);
1618        hdmi_set_reg(core->v_sync_line_aft_pxl_4, 2, 0xffff);
1619        hdmi_set_reg(core->v_sync_line_aft_pxl_5, 2, 0xffff);
1620        hdmi_set_reg(core->v_sync_line_aft_pxl_6, 2, 0xffff);
1621
1622        /* Timing generator registers */
1623        hdmi_set_reg(tg->cmd, 1, 0x0);
1624        hdmi_set_reg(tg->h_fsz, 2, m->htotal);
1625        hdmi_set_reg(tg->hact_st, 2, m->htotal - m->hdisplay);
1626        hdmi_set_reg(tg->hact_sz, 2, m->hdisplay);
1627        hdmi_set_reg(tg->v_fsz, 2, m->vtotal);
1628        hdmi_set_reg(tg->vsync, 2, 0x1);
1629        hdmi_set_reg(tg->field_chg, 2, 0x233); /* Reset value */
1630        hdmi_set_reg(tg->vsync_top_hdmi, 2, 0x1); /* Reset value */
1631        hdmi_set_reg(tg->field_top_hdmi, 2, 0x1); /* Reset value */
1632        hdmi_set_reg(tg->tg_3d, 1, 0x0);
1633}
1634
1635static void hdmi_mode_set(void *ctx, struct drm_display_mode *mode)
1636{
1637        struct hdmi_context *hdata = ctx;
1638        struct drm_display_mode *m = mode;
1639
1640        DRM_DEBUG_KMS("xres=%d, yres=%d, refresh=%d, intl=%s\n",
1641                m->hdisplay, m->vdisplay,
1642                m->vrefresh, (m->flags & DRM_MODE_FLAG_INTERLACE) ?
1643                "INTERLACED" : "PROGERESSIVE");
1644
1645        if (hdata->type == HDMI_TYPE13)
1646                hdmi_v13_mode_set(hdata, mode);
1647        else
1648                hdmi_v14_mode_set(hdata, mode);
1649}
1650
1651static void hdmi_get_max_resol(void *ctx, unsigned int *width,
1652                                        unsigned int *height)
1653{
1654        *width = MAX_WIDTH;
1655        *height = MAX_HEIGHT;
1656}
1657
1658static void hdmi_commit(void *ctx)
1659{
1660        struct hdmi_context *hdata = ctx;
1661
1662        mutex_lock(&hdata->hdmi_mutex);
1663        if (!hdata->powered) {
1664                mutex_unlock(&hdata->hdmi_mutex);
1665                return;
1666        }
1667        mutex_unlock(&hdata->hdmi_mutex);
1668
1669        hdmi_conf_apply(hdata);
1670}
1671
1672static void hdmi_poweron(struct hdmi_context *hdata)
1673{
1674        struct hdmi_resources *res = &hdata->res;
1675
1676        mutex_lock(&hdata->hdmi_mutex);
1677        if (hdata->powered) {
1678                mutex_unlock(&hdata->hdmi_mutex);
1679                return;
1680        }
1681
1682        hdata->powered = true;
1683
1684        mutex_unlock(&hdata->hdmi_mutex);
1685
1686        if (regulator_bulk_enable(res->regul_count, res->regul_bulk))
1687                DRM_DEBUG_KMS("failed to enable regulator bulk\n");
1688
1689        clk_prepare_enable(res->hdmiphy);
1690        clk_prepare_enable(res->hdmi);
1691        clk_prepare_enable(res->sclk_hdmi);
1692
1693        hdmiphy_poweron(hdata);
1694}
1695
1696static void hdmi_poweroff(struct hdmi_context *hdata)
1697{
1698        struct hdmi_resources *res = &hdata->res;
1699
1700        mutex_lock(&hdata->hdmi_mutex);
1701        if (!hdata->powered)
1702                goto out;
1703        mutex_unlock(&hdata->hdmi_mutex);
1704
1705        /*
1706         * The TV power domain needs any condition of hdmiphy to turn off and
1707         * its reset state seems to meet the condition.
1708         */
1709        hdmiphy_conf_reset(hdata);
1710        hdmiphy_poweroff(hdata);
1711
1712        clk_disable_unprepare(res->sclk_hdmi);
1713        clk_disable_unprepare(res->hdmi);
1714        clk_disable_unprepare(res->hdmiphy);
1715        regulator_bulk_disable(res->regul_count, res->regul_bulk);
1716
1717        mutex_lock(&hdata->hdmi_mutex);
1718
1719        hdata->powered = false;
1720
1721out:
1722        mutex_unlock(&hdata->hdmi_mutex);
1723}
1724
1725static void hdmi_dpms(void *ctx, int mode)
1726{
1727        struct hdmi_context *hdata = ctx;
1728
1729        DRM_DEBUG_KMS("mode %d\n", mode);
1730
1731        switch (mode) {
1732        case DRM_MODE_DPMS_ON:
1733                if (pm_runtime_suspended(hdata->dev))
1734                        pm_runtime_get_sync(hdata->dev);
1735                break;
1736        case DRM_MODE_DPMS_STANDBY:
1737        case DRM_MODE_DPMS_SUSPEND:
1738        case DRM_MODE_DPMS_OFF:
1739                if (!pm_runtime_suspended(hdata->dev))
1740                        pm_runtime_put_sync(hdata->dev);
1741                break;
1742        default:
1743                DRM_DEBUG_KMS("unknown dpms mode: %d\n", mode);
1744                break;
1745        }
1746}
1747
1748static struct exynos_hdmi_ops hdmi_ops = {
1749        /* display */
1750        .is_connected   = hdmi_is_connected,
1751        .get_edid       = hdmi_get_edid,
1752        .check_mode     = hdmi_check_mode,
1753
1754        /* manager */
1755        .mode_set       = hdmi_mode_set,
1756        .get_max_resol  = hdmi_get_max_resol,
1757        .commit         = hdmi_commit,
1758        .dpms           = hdmi_dpms,
1759};
1760
1761static irqreturn_t hdmi_irq_thread(int irq, void *arg)
1762{
1763        struct exynos_drm_hdmi_context *ctx = arg;
1764        struct hdmi_context *hdata = ctx->ctx;
1765
1766        mutex_lock(&hdata->hdmi_mutex);
1767        hdata->hpd = gpio_get_value(hdata->hpd_gpio);
1768        mutex_unlock(&hdata->hdmi_mutex);
1769
1770        if (ctx->drm_dev)
1771                drm_helper_hpd_irq_event(ctx->drm_dev);
1772
1773        return IRQ_HANDLED;
1774}
1775
1776static int hdmi_resources_init(struct hdmi_context *hdata)
1777{
1778        struct device *dev = hdata->dev;
1779        struct hdmi_resources *res = &hdata->res;
1780        static char *supply[] = {
1781                "hdmi-en",
1782                "vdd",
1783                "vdd_osc",
1784                "vdd_pll",
1785        };
1786        int i, ret;
1787
1788        DRM_DEBUG_KMS("HDMI resource init\n");
1789
1790        memset(res, 0, sizeof(*res));
1791
1792        /* get clocks, power */
1793        res->hdmi = devm_clk_get(dev, "hdmi");
1794        if (IS_ERR(res->hdmi)) {
1795                DRM_ERROR("failed to get clock 'hdmi'\n");
1796                goto fail;
1797        }
1798        res->sclk_hdmi = devm_clk_get(dev, "sclk_hdmi");
1799        if (IS_ERR(res->sclk_hdmi)) {
1800                DRM_ERROR("failed to get clock 'sclk_hdmi'\n");
1801                goto fail;
1802        }
1803        res->sclk_pixel = devm_clk_get(dev, "sclk_pixel");
1804        if (IS_ERR(res->sclk_pixel)) {
1805                DRM_ERROR("failed to get clock 'sclk_pixel'\n");
1806                goto fail;
1807        }
1808        res->sclk_hdmiphy = devm_clk_get(dev, "sclk_hdmiphy");
1809        if (IS_ERR(res->sclk_hdmiphy)) {
1810                DRM_ERROR("failed to get clock 'sclk_hdmiphy'\n");
1811                goto fail;
1812        }
1813        res->hdmiphy = devm_clk_get(dev, "hdmiphy");
1814        if (IS_ERR(res->hdmiphy)) {
1815                DRM_ERROR("failed to get clock 'hdmiphy'\n");
1816                goto fail;
1817        }
1818        res->mout_hdmi = devm_clk_get(dev, "mout_hdmi");
1819        if (IS_ERR(res->mout_hdmi)) {
1820                DRM_ERROR("failed to get clock 'mout_hdmi'\n");
1821                goto fail;
1822        }
1823
1824        clk_set_parent(res->mout_hdmi, res->sclk_pixel);
1825
1826        res->regul_bulk = devm_kzalloc(dev, ARRAY_SIZE(supply) *
1827                sizeof(res->regul_bulk[0]), GFP_KERNEL);
1828        if (!res->regul_bulk)
1829                goto fail;
1830        for (i = 0; i < ARRAY_SIZE(supply); ++i) {
1831                res->regul_bulk[i].supply = supply[i];
1832                res->regul_bulk[i].consumer = NULL;
1833        }
1834        ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(supply), res->regul_bulk);
1835        if (ret) {
1836                DRM_ERROR("failed to get regulators\n");
1837                goto fail;
1838        }
1839        res->regul_count = ARRAY_SIZE(supply);
1840
1841        return 0;
1842fail:
1843        DRM_ERROR("HDMI resource init - failed\n");
1844        return -ENODEV;
1845}
1846
1847static struct i2c_client *hdmi_ddc, *hdmi_hdmiphy;
1848
1849void hdmi_attach_ddc_client(struct i2c_client *ddc)
1850{
1851        if (ddc)
1852                hdmi_ddc = ddc;
1853}
1854
1855void hdmi_attach_hdmiphy_client(struct i2c_client *hdmiphy)
1856{
1857        if (hdmiphy)
1858                hdmi_hdmiphy = hdmiphy;
1859}
1860
1861static struct s5p_hdmi_platform_data *drm_hdmi_dt_parse_pdata
1862                                        (struct device *dev)
1863{
1864        struct device_node *np = dev->of_node;
1865        struct s5p_hdmi_platform_data *pd;
1866        u32 value;
1867
1868        pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL);
1869        if (!pd)
1870                goto err_data;
1871
1872        if (!of_find_property(np, "hpd-gpio", &value)) {
1873                DRM_ERROR("no hpd gpio property found\n");
1874                goto err_data;
1875        }
1876
1877        pd->hpd_gpio = of_get_named_gpio(np, "hpd-gpio", 0);
1878
1879        return pd;
1880
1881err_data:
1882        return NULL;
1883}
1884
1885static struct of_device_id hdmi_match_types[] = {
1886        {
1887                .compatible = "samsung,exynos5-hdmi",
1888                .data   = (void *)HDMI_TYPE14,
1889        }, {
1890                .compatible = "samsung,exynos4212-hdmi",
1891                .data   = (void *)HDMI_TYPE14,
1892        }, {
1893                /* end node */
1894        }
1895};
1896
1897static int hdmi_probe(struct platform_device *pdev)
1898{
1899        struct device *dev = &pdev->dev;
1900        struct exynos_drm_hdmi_context *drm_hdmi_ctx;
1901        struct hdmi_context *hdata;
1902        struct s5p_hdmi_platform_data *pdata;
1903        struct resource *res;
1904        const struct of_device_id *match;
1905        int ret;
1906
1907         if (!dev->of_node)
1908                return -ENODEV;
1909
1910        pdata = drm_hdmi_dt_parse_pdata(dev);
1911        if (!pdata)
1912                return -EINVAL;
1913
1914        drm_hdmi_ctx = devm_kzalloc(dev, sizeof(*drm_hdmi_ctx), GFP_KERNEL);
1915        if (!drm_hdmi_ctx)
1916                return -ENOMEM;
1917
1918        hdata = devm_kzalloc(dev, sizeof(struct hdmi_context), GFP_KERNEL);
1919        if (!hdata)
1920                return -ENOMEM;
1921
1922        mutex_init(&hdata->hdmi_mutex);
1923
1924        drm_hdmi_ctx->ctx = (void *)hdata;
1925        hdata->parent_ctx = (void *)drm_hdmi_ctx;
1926
1927        platform_set_drvdata(pdev, drm_hdmi_ctx);
1928
1929        match = of_match_node(hdmi_match_types, dev->of_node);
1930        if (!match)
1931                return -ENODEV;
1932        hdata->type = (enum hdmi_type)match->data;
1933
1934        hdata->hpd_gpio = pdata->hpd_gpio;
1935        hdata->dev = dev;
1936
1937        ret = hdmi_resources_init(hdata);
1938        if (ret) {
1939                DRM_ERROR("hdmi_resources_init failed\n");
1940                return -EINVAL;
1941        }
1942
1943        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1944        hdata->regs = devm_ioremap_resource(dev, res);
1945        if (IS_ERR(hdata->regs))
1946                return PTR_ERR(hdata->regs);
1947
1948        ret = devm_gpio_request(dev, hdata->hpd_gpio, "HPD");
1949        if (ret) {
1950                DRM_ERROR("failed to request HPD gpio\n");
1951                return ret;
1952        }
1953
1954        /* DDC i2c driver */
1955        if (i2c_add_driver(&ddc_driver)) {
1956                DRM_ERROR("failed to register ddc i2c driver\n");
1957                return -ENOENT;
1958        }
1959
1960        hdata->ddc_port = hdmi_ddc;
1961
1962        /* hdmiphy i2c driver */
1963        if (i2c_add_driver(&hdmiphy_driver)) {
1964                DRM_ERROR("failed to register hdmiphy i2c driver\n");
1965                ret = -ENOENT;
1966                goto err_ddc;
1967        }
1968
1969        hdata->hdmiphy_port = hdmi_hdmiphy;
1970
1971        hdata->irq = gpio_to_irq(hdata->hpd_gpio);
1972        if (hdata->irq < 0) {
1973                DRM_ERROR("failed to get GPIO irq\n");
1974                ret = hdata->irq;
1975                goto err_hdmiphy;
1976        }
1977
1978        hdata->hpd = gpio_get_value(hdata->hpd_gpio);
1979
1980        ret = devm_request_threaded_irq(dev, hdata->irq, NULL,
1981                        hdmi_irq_thread, IRQF_TRIGGER_RISING |
1982                        IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
1983                        "hdmi", drm_hdmi_ctx);
1984        if (ret) {
1985                DRM_ERROR("failed to register hdmi interrupt\n");
1986                goto err_hdmiphy;
1987        }
1988
1989        /* Attach HDMI Driver to common hdmi. */
1990        exynos_hdmi_drv_attach(drm_hdmi_ctx);
1991
1992        /* register specific callbacks to common hdmi. */
1993        exynos_hdmi_ops_register(&hdmi_ops);
1994
1995        pm_runtime_enable(dev);
1996
1997        return 0;
1998
1999err_hdmiphy:
2000        i2c_del_driver(&hdmiphy_driver);
2001err_ddc:
2002        i2c_del_driver(&ddc_driver);
2003        return ret;
2004}
2005
2006static int hdmi_remove(struct platform_device *pdev)
2007{
2008        struct device *dev = &pdev->dev;
2009
2010        pm_runtime_disable(dev);
2011
2012        /* hdmiphy i2c driver */
2013        i2c_del_driver(&hdmiphy_driver);
2014        /* DDC i2c driver */
2015        i2c_del_driver(&ddc_driver);
2016
2017        return 0;
2018}
2019
2020#ifdef CONFIG_PM_SLEEP
2021static int hdmi_suspend(struct device *dev)
2022{
2023        struct exynos_drm_hdmi_context *ctx = get_hdmi_context(dev);
2024        struct hdmi_context *hdata = ctx->ctx;
2025
2026        disable_irq(hdata->irq);
2027
2028        hdata->hpd = false;
2029        if (ctx->drm_dev)
2030                drm_helper_hpd_irq_event(ctx->drm_dev);
2031
2032        if (pm_runtime_suspended(dev)) {
2033                DRM_DEBUG_KMS("Already suspended\n");
2034                return 0;
2035        }
2036
2037        hdmi_poweroff(hdata);
2038
2039        return 0;
2040}
2041
2042static int hdmi_resume(struct device *dev)
2043{
2044        struct exynos_drm_hdmi_context *ctx = get_hdmi_context(dev);
2045        struct hdmi_context *hdata = ctx->ctx;
2046
2047        hdata->hpd = gpio_get_value(hdata->hpd_gpio);
2048
2049        enable_irq(hdata->irq);
2050
2051        if (!pm_runtime_suspended(dev)) {
2052                DRM_DEBUG_KMS("Already resumed\n");
2053                return 0;
2054        }
2055
2056        hdmi_poweron(hdata);
2057
2058        return 0;
2059}
2060#endif
2061
2062#ifdef CONFIG_PM_RUNTIME
2063static int hdmi_runtime_suspend(struct device *dev)
2064{
2065        struct exynos_drm_hdmi_context *ctx = get_hdmi_context(dev);
2066        struct hdmi_context *hdata = ctx->ctx;
2067
2068        hdmi_poweroff(hdata);
2069
2070        return 0;
2071}
2072
2073static int hdmi_runtime_resume(struct device *dev)
2074{
2075        struct exynos_drm_hdmi_context *ctx = get_hdmi_context(dev);
2076        struct hdmi_context *hdata = ctx->ctx;
2077
2078        hdmi_poweron(hdata);
2079
2080        return 0;
2081}
2082#endif
2083
2084static const struct dev_pm_ops hdmi_pm_ops = {
2085        SET_SYSTEM_SLEEP_PM_OPS(hdmi_suspend, hdmi_resume)
2086        SET_RUNTIME_PM_OPS(hdmi_runtime_suspend, hdmi_runtime_resume, NULL)
2087};
2088
2089struct platform_driver hdmi_driver = {
2090        .probe          = hdmi_probe,
2091        .remove         = hdmi_remove,
2092        .driver         = {
2093                .name   = "exynos-hdmi",
2094                .owner  = THIS_MODULE,
2095                .pm     = &hdmi_pm_ops,
2096                .of_match_table = hdmi_match_types,
2097        },
2098};
2099