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