linux/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c
<<
>>
Prefs
   1/*
   2 * Analog Devices ADV7511 HDMI transmitter driver
   3 *
   4 * Copyright 2012 Analog Devices Inc.
   5 *
   6 * Licensed under the GPL-2.
   7 */
   8
   9#include <linux/device.h>
  10#include <linux/gpio/consumer.h>
  11#include <linux/module.h>
  12#include <linux/of_device.h>
  13#include <linux/slab.h>
  14#include <linux/clk.h>
  15
  16#include <drm/drmP.h>
  17#include <drm/drm_atomic.h>
  18#include <drm/drm_atomic_helper.h>
  19#include <drm/drm_edid.h>
  20
  21#include <media/cec.h>
  22
  23#include "adv7511.h"
  24
  25/* ADI recommended values for proper operation. */
  26static const struct reg_sequence adv7511_fixed_registers[] = {
  27        { 0x98, 0x03 },
  28        { 0x9a, 0xe0 },
  29        { 0x9c, 0x30 },
  30        { 0x9d, 0x61 },
  31        { 0xa2, 0xa4 },
  32        { 0xa3, 0xa4 },
  33        { 0xe0, 0xd0 },
  34        { 0xf9, 0x00 },
  35        { 0x55, 0x02 },
  36};
  37
  38/* -----------------------------------------------------------------------------
  39 * Register access
  40 */
  41
  42static const uint8_t adv7511_register_defaults[] = {
  43        0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 00 */
  44        0x00, 0x00, 0x01, 0x0e, 0xbc, 0x18, 0x01, 0x13,
  45        0x25, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 10 */
  46        0x46, 0x62, 0x04, 0xa8, 0x00, 0x00, 0x1c, 0x84,
  47        0x1c, 0xbf, 0x04, 0xa8, 0x1e, 0x70, 0x02, 0x1e, /* 20 */
  48        0x00, 0x00, 0x04, 0xa8, 0x08, 0x12, 0x1b, 0xac,
  49        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 30 */
  50        0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xb0,
  51        0x00, 0x50, 0x90, 0x7e, 0x79, 0x70, 0x00, 0x00, /* 40 */
  52        0x00, 0xa8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
  53        0x00, 0x00, 0x02, 0x0d, 0x00, 0x00, 0x00, 0x00, /* 50 */
  54        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  55        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 60 */
  56        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  57        0x01, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 70 */
  58        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  59        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 80 */
  60        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  61        0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, /* 90 */
  62        0x0b, 0x02, 0x00, 0x18, 0x5a, 0x60, 0x00, 0x00,
  63        0x00, 0x00, 0x80, 0x80, 0x08, 0x04, 0x00, 0x00, /* a0 */
  64        0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x14,
  65        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* b0 */
  66        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  67        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* c0 */
  68        0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x01, 0x04,
  69        0x30, 0xff, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, /* d0 */
  70        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01,
  71        0x80, 0x75, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, /* e0 */
  72        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  73        0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x11, 0x00, /* f0 */
  74        0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  75};
  76
  77static bool adv7511_register_volatile(struct device *dev, unsigned int reg)
  78{
  79        switch (reg) {
  80        case ADV7511_REG_CHIP_REVISION:
  81        case ADV7511_REG_SPDIF_FREQ:
  82        case ADV7511_REG_CTS_AUTOMATIC1:
  83        case ADV7511_REG_CTS_AUTOMATIC2:
  84        case ADV7511_REG_VIC_DETECTED:
  85        case ADV7511_REG_VIC_SEND:
  86        case ADV7511_REG_AUX_VIC_DETECTED:
  87        case ADV7511_REG_STATUS:
  88        case ADV7511_REG_GC(1):
  89        case ADV7511_REG_INT(0):
  90        case ADV7511_REG_INT(1):
  91        case ADV7511_REG_PLL_STATUS:
  92        case ADV7511_REG_AN(0):
  93        case ADV7511_REG_AN(1):
  94        case ADV7511_REG_AN(2):
  95        case ADV7511_REG_AN(3):
  96        case ADV7511_REG_AN(4):
  97        case ADV7511_REG_AN(5):
  98        case ADV7511_REG_AN(6):
  99        case ADV7511_REG_AN(7):
 100        case ADV7511_REG_HDCP_STATUS:
 101        case ADV7511_REG_BCAPS:
 102        case ADV7511_REG_BKSV(0):
 103        case ADV7511_REG_BKSV(1):
 104        case ADV7511_REG_BKSV(2):
 105        case ADV7511_REG_BKSV(3):
 106        case ADV7511_REG_BKSV(4):
 107        case ADV7511_REG_DDC_STATUS:
 108        case ADV7511_REG_EDID_READ_CTRL:
 109        case ADV7511_REG_BSTATUS(0):
 110        case ADV7511_REG_BSTATUS(1):
 111        case ADV7511_REG_CHIP_ID_HIGH:
 112        case ADV7511_REG_CHIP_ID_LOW:
 113                return true;
 114        }
 115
 116        return false;
 117}
 118
 119static const struct regmap_config adv7511_regmap_config = {
 120        .reg_bits = 8,
 121        .val_bits = 8,
 122
 123        .max_register = 0xff,
 124        .cache_type = REGCACHE_RBTREE,
 125        .reg_defaults_raw = adv7511_register_defaults,
 126        .num_reg_defaults_raw = ARRAY_SIZE(adv7511_register_defaults),
 127
 128        .volatile_reg = adv7511_register_volatile,
 129};
 130
 131/* -----------------------------------------------------------------------------
 132 * Hardware configuration
 133 */
 134
 135static void adv7511_set_colormap(struct adv7511 *adv7511, bool enable,
 136                                 const uint16_t *coeff,
 137                                 unsigned int scaling_factor)
 138{
 139        unsigned int i;
 140
 141        regmap_update_bits(adv7511->regmap, ADV7511_REG_CSC_UPPER(1),
 142                           ADV7511_CSC_UPDATE_MODE, ADV7511_CSC_UPDATE_MODE);
 143
 144        if (enable) {
 145                for (i = 0; i < 12; ++i) {
 146                        regmap_update_bits(adv7511->regmap,
 147                                           ADV7511_REG_CSC_UPPER(i),
 148                                           0x1f, coeff[i] >> 8);
 149                        regmap_write(adv7511->regmap,
 150                                     ADV7511_REG_CSC_LOWER(i),
 151                                     coeff[i] & 0xff);
 152                }
 153        }
 154
 155        if (enable)
 156                regmap_update_bits(adv7511->regmap, ADV7511_REG_CSC_UPPER(0),
 157                                   0xe0, 0x80 | (scaling_factor << 5));
 158        else
 159                regmap_update_bits(adv7511->regmap, ADV7511_REG_CSC_UPPER(0),
 160                                   0x80, 0x00);
 161
 162        regmap_update_bits(adv7511->regmap, ADV7511_REG_CSC_UPPER(1),
 163                           ADV7511_CSC_UPDATE_MODE, 0);
 164}
 165
 166static int adv7511_packet_enable(struct adv7511 *adv7511, unsigned int packet)
 167{
 168        if (packet & 0xff)
 169                regmap_update_bits(adv7511->regmap, ADV7511_REG_PACKET_ENABLE0,
 170                                   packet, 0xff);
 171
 172        if (packet & 0xff00) {
 173                packet >>= 8;
 174                regmap_update_bits(adv7511->regmap, ADV7511_REG_PACKET_ENABLE1,
 175                                   packet, 0xff);
 176        }
 177
 178        return 0;
 179}
 180
 181static int adv7511_packet_disable(struct adv7511 *adv7511, unsigned int packet)
 182{
 183        if (packet & 0xff)
 184                regmap_update_bits(adv7511->regmap, ADV7511_REG_PACKET_ENABLE0,
 185                                   packet, 0x00);
 186
 187        if (packet & 0xff00) {
 188                packet >>= 8;
 189                regmap_update_bits(adv7511->regmap, ADV7511_REG_PACKET_ENABLE1,
 190                                   packet, 0x00);
 191        }
 192
 193        return 0;
 194}
 195
 196/* Coefficients for adv7511 color space conversion */
 197static const uint16_t adv7511_csc_ycbcr_to_rgb[] = {
 198        0x0734, 0x04ad, 0x0000, 0x1c1b,
 199        0x1ddc, 0x04ad, 0x1f24, 0x0135,
 200        0x0000, 0x04ad, 0x087c, 0x1b77,
 201};
 202
 203static void adv7511_set_config_csc(struct adv7511 *adv7511,
 204                                   struct drm_connector *connector,
 205                                   bool rgb, bool hdmi_mode)
 206{
 207        struct adv7511_video_config config;
 208        bool output_format_422, output_format_ycbcr;
 209        unsigned int mode;
 210        uint8_t infoframe[17];
 211
 212        config.hdmi_mode = hdmi_mode;
 213
 214        hdmi_avi_infoframe_init(&config.avi_infoframe);
 215
 216        config.avi_infoframe.scan_mode = HDMI_SCAN_MODE_UNDERSCAN;
 217
 218        if (rgb) {
 219                config.csc_enable = false;
 220                config.avi_infoframe.colorspace = HDMI_COLORSPACE_RGB;
 221        } else {
 222                config.csc_scaling_factor = ADV7511_CSC_SCALING_4;
 223                config.csc_coefficents = adv7511_csc_ycbcr_to_rgb;
 224
 225                if ((connector->display_info.color_formats &
 226                     DRM_COLOR_FORMAT_YCRCB422) &&
 227                    config.hdmi_mode) {
 228                        config.csc_enable = false;
 229                        config.avi_infoframe.colorspace =
 230                                HDMI_COLORSPACE_YUV422;
 231                } else {
 232                        config.csc_enable = true;
 233                        config.avi_infoframe.colorspace = HDMI_COLORSPACE_RGB;
 234                }
 235        }
 236
 237        if (config.hdmi_mode) {
 238                mode = ADV7511_HDMI_CFG_MODE_HDMI;
 239
 240                switch (config.avi_infoframe.colorspace) {
 241                case HDMI_COLORSPACE_YUV444:
 242                        output_format_422 = false;
 243                        output_format_ycbcr = true;
 244                        break;
 245                case HDMI_COLORSPACE_YUV422:
 246                        output_format_422 = true;
 247                        output_format_ycbcr = true;
 248                        break;
 249                default:
 250                        output_format_422 = false;
 251                        output_format_ycbcr = false;
 252                        break;
 253                }
 254        } else {
 255                mode = ADV7511_HDMI_CFG_MODE_DVI;
 256                output_format_422 = false;
 257                output_format_ycbcr = false;
 258        }
 259
 260        adv7511_packet_disable(adv7511, ADV7511_PACKET_ENABLE_AVI_INFOFRAME);
 261
 262        adv7511_set_colormap(adv7511, config.csc_enable,
 263                             config.csc_coefficents,
 264                             config.csc_scaling_factor);
 265
 266        regmap_update_bits(adv7511->regmap, ADV7511_REG_VIDEO_INPUT_CFG1, 0x81,
 267                           (output_format_422 << 7) | output_format_ycbcr);
 268
 269        regmap_update_bits(adv7511->regmap, ADV7511_REG_HDCP_HDMI_CFG,
 270                           ADV7511_HDMI_CFG_MODE_MASK, mode);
 271
 272        hdmi_avi_infoframe_pack(&config.avi_infoframe, infoframe,
 273                                sizeof(infoframe));
 274
 275        /* The AVI infoframe id is not configurable */
 276        regmap_bulk_write(adv7511->regmap, ADV7511_REG_AVI_INFOFRAME_VERSION,
 277                          infoframe + 1, sizeof(infoframe) - 1);
 278
 279        adv7511_packet_enable(adv7511, ADV7511_PACKET_ENABLE_AVI_INFOFRAME);
 280}
 281
 282static void adv7511_set_link_config(struct adv7511 *adv7511,
 283                                    const struct adv7511_link_config *config)
 284{
 285        /*
 286         * The input style values documented in the datasheet don't match the
 287         * hardware register field values :-(
 288         */
 289        static const unsigned int input_styles[4] = { 0, 2, 1, 3 };
 290
 291        unsigned int clock_delay;
 292        unsigned int color_depth;
 293        unsigned int input_id;
 294
 295        clock_delay = (config->clock_delay + 1200) / 400;
 296        color_depth = config->input_color_depth == 8 ? 3
 297                    : (config->input_color_depth == 10 ? 1 : 2);
 298
 299        /* TODO Support input ID 6 */
 300        if (config->input_colorspace != HDMI_COLORSPACE_YUV422)
 301                input_id = config->input_clock == ADV7511_INPUT_CLOCK_DDR
 302                         ? 5 : 0;
 303        else if (config->input_clock == ADV7511_INPUT_CLOCK_DDR)
 304                input_id = config->embedded_sync ? 8 : 7;
 305        else if (config->input_clock == ADV7511_INPUT_CLOCK_2X)
 306                input_id = config->embedded_sync ? 4 : 3;
 307        else
 308                input_id = config->embedded_sync ? 2 : 1;
 309
 310        regmap_update_bits(adv7511->regmap, ADV7511_REG_I2C_FREQ_ID_CFG, 0xf,
 311                           input_id);
 312        regmap_update_bits(adv7511->regmap, ADV7511_REG_VIDEO_INPUT_CFG1, 0x7e,
 313                           (color_depth << 4) |
 314                           (input_styles[config->input_style] << 2));
 315        regmap_write(adv7511->regmap, ADV7511_REG_VIDEO_INPUT_CFG2,
 316                     config->input_justification << 3);
 317        regmap_write(adv7511->regmap, ADV7511_REG_TIMING_GEN_SEQ,
 318                     config->sync_pulse << 2);
 319
 320        regmap_write(adv7511->regmap, 0xba, clock_delay << 5);
 321
 322        adv7511->embedded_sync = config->embedded_sync;
 323        adv7511->hsync_polarity = config->hsync_polarity;
 324        adv7511->vsync_polarity = config->vsync_polarity;
 325        adv7511->rgb = config->input_colorspace == HDMI_COLORSPACE_RGB;
 326}
 327
 328static void __adv7511_power_on(struct adv7511 *adv7511)
 329{
 330        adv7511->current_edid_segment = -1;
 331
 332        regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER,
 333                           ADV7511_POWER_POWER_DOWN, 0);
 334        if (adv7511->i2c_main->irq) {
 335                /*
 336                 * Documentation says the INT_ENABLE registers are reset in
 337                 * POWER_DOWN mode. My 7511w preserved the bits, however.
 338                 * Still, let's be safe and stick to the documentation.
 339                 */
 340                regmap_write(adv7511->regmap, ADV7511_REG_INT_ENABLE(0),
 341                             ADV7511_INT0_EDID_READY | ADV7511_INT0_HPD);
 342                regmap_update_bits(adv7511->regmap,
 343                                   ADV7511_REG_INT_ENABLE(1),
 344                                   ADV7511_INT1_DDC_ERROR,
 345                                   ADV7511_INT1_DDC_ERROR);
 346        }
 347
 348        /*
 349         * Per spec it is allowed to pulse the HPD signal to indicate that the
 350         * EDID information has changed. Some monitors do this when they wakeup
 351         * from standby or are enabled. When the HPD goes low the adv7511 is
 352         * reset and the outputs are disabled which might cause the monitor to
 353         * go to standby again. To avoid this we ignore the HPD pin for the
 354         * first few seconds after enabling the output.
 355         */
 356        regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER2,
 357                           ADV7511_REG_POWER2_HPD_SRC_MASK,
 358                           ADV7511_REG_POWER2_HPD_SRC_NONE);
 359}
 360
 361static void adv7511_power_on(struct adv7511 *adv7511)
 362{
 363        __adv7511_power_on(adv7511);
 364
 365        /*
 366         * Most of the registers are reset during power down or when HPD is low.
 367         */
 368        regcache_sync(adv7511->regmap);
 369
 370        if (adv7511->type == ADV7533)
 371                adv7533_dsi_power_on(adv7511);
 372        adv7511->powered = true;
 373}
 374
 375static void __adv7511_power_off(struct adv7511 *adv7511)
 376{
 377        /* TODO: setup additional power down modes */
 378        regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER,
 379                           ADV7511_POWER_POWER_DOWN,
 380                           ADV7511_POWER_POWER_DOWN);
 381        regmap_update_bits(adv7511->regmap,
 382                           ADV7511_REG_INT_ENABLE(1),
 383                           ADV7511_INT1_DDC_ERROR, 0);
 384        regcache_mark_dirty(adv7511->regmap);
 385}
 386
 387static void adv7511_power_off(struct adv7511 *adv7511)
 388{
 389        __adv7511_power_off(adv7511);
 390        if (adv7511->type == ADV7533)
 391                adv7533_dsi_power_off(adv7511);
 392        adv7511->powered = false;
 393}
 394
 395/* -----------------------------------------------------------------------------
 396 * Interrupt and hotplug detection
 397 */
 398
 399static bool adv7511_hpd(struct adv7511 *adv7511)
 400{
 401        unsigned int irq0;
 402        int ret;
 403
 404        ret = regmap_read(adv7511->regmap, ADV7511_REG_INT(0), &irq0);
 405        if (ret < 0)
 406                return false;
 407
 408        if (irq0 & ADV7511_INT0_HPD) {
 409                regmap_write(adv7511->regmap, ADV7511_REG_INT(0),
 410                             ADV7511_INT0_HPD);
 411                return true;
 412        }
 413
 414        return false;
 415}
 416
 417static void adv7511_hpd_work(struct work_struct *work)
 418{
 419        struct adv7511 *adv7511 = container_of(work, struct adv7511, hpd_work);
 420        enum drm_connector_status status;
 421        unsigned int val;
 422        int ret;
 423
 424        ret = regmap_read(adv7511->regmap, ADV7511_REG_STATUS, &val);
 425        if (ret < 0)
 426                status = connector_status_disconnected;
 427        else if (val & ADV7511_STATUS_HPD)
 428                status = connector_status_connected;
 429        else
 430                status = connector_status_disconnected;
 431
 432        /*
 433         * The bridge resets its registers on unplug. So when we get a plug
 434         * event and we're already supposed to be powered, cycle the bridge to
 435         * restore its state.
 436         */
 437        if (status == connector_status_connected &&
 438            adv7511->connector.status == connector_status_disconnected &&
 439            adv7511->powered) {
 440                regcache_mark_dirty(adv7511->regmap);
 441                adv7511_power_on(adv7511);
 442        }
 443
 444        if (adv7511->connector.status != status) {
 445                adv7511->connector.status = status;
 446                if (status == connector_status_disconnected)
 447                        cec_phys_addr_invalidate(adv7511->cec_adap);
 448                drm_kms_helper_hotplug_event(adv7511->connector.dev);
 449        }
 450}
 451
 452static int adv7511_irq_process(struct adv7511 *adv7511, bool process_hpd)
 453{
 454        unsigned int irq0, irq1;
 455        int ret;
 456
 457        ret = regmap_read(adv7511->regmap, ADV7511_REG_INT(0), &irq0);
 458        if (ret < 0)
 459                return ret;
 460
 461        ret = regmap_read(adv7511->regmap, ADV7511_REG_INT(1), &irq1);
 462        if (ret < 0)
 463                return ret;
 464
 465        regmap_write(adv7511->regmap, ADV7511_REG_INT(0), irq0);
 466        regmap_write(adv7511->regmap, ADV7511_REG_INT(1), irq1);
 467
 468        if (process_hpd && irq0 & ADV7511_INT0_HPD && adv7511->bridge.encoder)
 469                schedule_work(&adv7511->hpd_work);
 470
 471        if (irq0 & ADV7511_INT0_EDID_READY || irq1 & ADV7511_INT1_DDC_ERROR) {
 472                adv7511->edid_read = true;
 473
 474                if (adv7511->i2c_main->irq)
 475                        wake_up_all(&adv7511->wq);
 476        }
 477
 478#ifdef CONFIG_DRM_I2C_ADV7511_CEC
 479        adv7511_cec_irq_process(adv7511, irq1);
 480#endif
 481
 482        return 0;
 483}
 484
 485static irqreturn_t adv7511_irq_handler(int irq, void *devid)
 486{
 487        struct adv7511 *adv7511 = devid;
 488        int ret;
 489
 490        ret = adv7511_irq_process(adv7511, true);
 491        return ret < 0 ? IRQ_NONE : IRQ_HANDLED;
 492}
 493
 494/* -----------------------------------------------------------------------------
 495 * EDID retrieval
 496 */
 497
 498static int adv7511_wait_for_edid(struct adv7511 *adv7511, int timeout)
 499{
 500        int ret;
 501
 502        if (adv7511->i2c_main->irq) {
 503                ret = wait_event_interruptible_timeout(adv7511->wq,
 504                                adv7511->edid_read, msecs_to_jiffies(timeout));
 505        } else {
 506                for (; timeout > 0; timeout -= 25) {
 507                        ret = adv7511_irq_process(adv7511, false);
 508                        if (ret < 0)
 509                                break;
 510
 511                        if (adv7511->edid_read)
 512                                break;
 513
 514                        msleep(25);
 515                }
 516        }
 517
 518        return adv7511->edid_read ? 0 : -EIO;
 519}
 520
 521static int adv7511_get_edid_block(void *data, u8 *buf, unsigned int block,
 522                                  size_t len)
 523{
 524        struct adv7511 *adv7511 = data;
 525        struct i2c_msg xfer[2];
 526        uint8_t offset;
 527        unsigned int i;
 528        int ret;
 529
 530        if (len > 128)
 531                return -EINVAL;
 532
 533        if (adv7511->current_edid_segment != block / 2) {
 534                unsigned int status;
 535
 536                ret = regmap_read(adv7511->regmap, ADV7511_REG_DDC_STATUS,
 537                                  &status);
 538                if (ret < 0)
 539                        return ret;
 540
 541                if (status != 2) {
 542                        adv7511->edid_read = false;
 543                        regmap_write(adv7511->regmap, ADV7511_REG_EDID_SEGMENT,
 544                                     block);
 545                        ret = adv7511_wait_for_edid(adv7511, 200);
 546                        if (ret < 0)
 547                                return ret;
 548                }
 549
 550                /* Break this apart, hopefully more I2C controllers will
 551                 * support 64 byte transfers than 256 byte transfers
 552                 */
 553
 554                xfer[0].addr = adv7511->i2c_edid->addr;
 555                xfer[0].flags = 0;
 556                xfer[0].len = 1;
 557                xfer[0].buf = &offset;
 558                xfer[1].addr = adv7511->i2c_edid->addr;
 559                xfer[1].flags = I2C_M_RD;
 560                xfer[1].len = 64;
 561                xfer[1].buf = adv7511->edid_buf;
 562
 563                offset = 0;
 564
 565                for (i = 0; i < 4; ++i) {
 566                        ret = i2c_transfer(adv7511->i2c_edid->adapter, xfer,
 567                                           ARRAY_SIZE(xfer));
 568                        if (ret < 0)
 569                                return ret;
 570                        else if (ret != 2)
 571                                return -EIO;
 572
 573                        xfer[1].buf += 64;
 574                        offset += 64;
 575                }
 576
 577                adv7511->current_edid_segment = block / 2;
 578        }
 579
 580        if (block % 2 == 0)
 581                memcpy(buf, adv7511->edid_buf, len);
 582        else
 583                memcpy(buf, adv7511->edid_buf + 128, len);
 584
 585        return 0;
 586}
 587
 588/* -----------------------------------------------------------------------------
 589 * ADV75xx helpers
 590 */
 591
 592static int adv7511_get_modes(struct adv7511 *adv7511,
 593                             struct drm_connector *connector)
 594{
 595        struct edid *edid;
 596        unsigned int count;
 597
 598        /* Reading the EDID only works if the device is powered */
 599        if (!adv7511->powered) {
 600                unsigned int edid_i2c_addr =
 601                                        (adv7511->i2c_edid->addr << 1);
 602
 603                __adv7511_power_on(adv7511);
 604
 605                /* Reset the EDID_I2C_ADDR register as it might be cleared */
 606                regmap_write(adv7511->regmap, ADV7511_REG_EDID_I2C_ADDR,
 607                             edid_i2c_addr);
 608        }
 609
 610        edid = drm_do_get_edid(connector, adv7511_get_edid_block, adv7511);
 611
 612        if (!adv7511->powered)
 613                __adv7511_power_off(adv7511);
 614
 615
 616        drm_connector_update_edid_property(connector, edid);
 617        count = drm_add_edid_modes(connector, edid);
 618
 619        adv7511_set_config_csc(adv7511, connector, adv7511->rgb,
 620                               drm_detect_hdmi_monitor(edid));
 621
 622        cec_s_phys_addr_from_edid(adv7511->cec_adap, edid);
 623
 624        kfree(edid);
 625
 626        return count;
 627}
 628
 629static enum drm_connector_status
 630adv7511_detect(struct adv7511 *adv7511, struct drm_connector *connector)
 631{
 632        enum drm_connector_status status;
 633        unsigned int val;
 634        bool hpd;
 635        int ret;
 636
 637        ret = regmap_read(adv7511->regmap, ADV7511_REG_STATUS, &val);
 638        if (ret < 0)
 639                return connector_status_disconnected;
 640
 641        if (val & ADV7511_STATUS_HPD)
 642                status = connector_status_connected;
 643        else
 644                status = connector_status_disconnected;
 645
 646        hpd = adv7511_hpd(adv7511);
 647
 648        /* The chip resets itself when the cable is disconnected, so in case
 649         * there is a pending HPD interrupt and the cable is connected there was
 650         * at least one transition from disconnected to connected and the chip
 651         * has to be reinitialized. */
 652        if (status == connector_status_connected && hpd && adv7511->powered) {
 653                regcache_mark_dirty(adv7511->regmap);
 654                adv7511_power_on(adv7511);
 655                adv7511_get_modes(adv7511, connector);
 656                if (adv7511->status == connector_status_connected)
 657                        status = connector_status_disconnected;
 658        } else {
 659                /* Renable HPD sensing */
 660                regmap_update_bits(adv7511->regmap, ADV7511_REG_POWER2,
 661                                   ADV7511_REG_POWER2_HPD_SRC_MASK,
 662                                   ADV7511_REG_POWER2_HPD_SRC_BOTH);
 663        }
 664
 665        adv7511->status = status;
 666        return status;
 667}
 668
 669static enum drm_mode_status adv7511_mode_valid(struct adv7511 *adv7511,
 670                              struct drm_display_mode *mode)
 671{
 672        if (mode->clock > 165000)
 673                return MODE_CLOCK_HIGH;
 674
 675        return MODE_OK;
 676}
 677
 678static void adv7511_mode_set(struct adv7511 *adv7511,
 679                             struct drm_display_mode *mode,
 680                             struct drm_display_mode *adj_mode)
 681{
 682        unsigned int low_refresh_rate;
 683        unsigned int hsync_polarity = 0;
 684        unsigned int vsync_polarity = 0;
 685
 686        if (adv7511->embedded_sync) {
 687                unsigned int hsync_offset, hsync_len;
 688                unsigned int vsync_offset, vsync_len;
 689
 690                hsync_offset = adj_mode->crtc_hsync_start -
 691                               adj_mode->crtc_hdisplay;
 692                vsync_offset = adj_mode->crtc_vsync_start -
 693                               adj_mode->crtc_vdisplay;
 694                hsync_len = adj_mode->crtc_hsync_end -
 695                            adj_mode->crtc_hsync_start;
 696                vsync_len = adj_mode->crtc_vsync_end -
 697                            adj_mode->crtc_vsync_start;
 698
 699                /* The hardware vsync generator has a off-by-one bug */
 700                vsync_offset += 1;
 701
 702                regmap_write(adv7511->regmap, ADV7511_REG_HSYNC_PLACEMENT_MSB,
 703                             ((hsync_offset >> 10) & 0x7) << 5);
 704                regmap_write(adv7511->regmap, ADV7511_REG_SYNC_DECODER(0),
 705                             (hsync_offset >> 2) & 0xff);
 706                regmap_write(adv7511->regmap, ADV7511_REG_SYNC_DECODER(1),
 707                             ((hsync_offset & 0x3) << 6) |
 708                             ((hsync_len >> 4) & 0x3f));
 709                regmap_write(adv7511->regmap, ADV7511_REG_SYNC_DECODER(2),
 710                             ((hsync_len & 0xf) << 4) |
 711                             ((vsync_offset >> 6) & 0xf));
 712                regmap_write(adv7511->regmap, ADV7511_REG_SYNC_DECODER(3),
 713                             ((vsync_offset & 0x3f) << 2) |
 714                             ((vsync_len >> 8) & 0x3));
 715                regmap_write(adv7511->regmap, ADV7511_REG_SYNC_DECODER(4),
 716                             vsync_len & 0xff);
 717
 718                hsync_polarity = !(adj_mode->flags & DRM_MODE_FLAG_PHSYNC);
 719                vsync_polarity = !(adj_mode->flags & DRM_MODE_FLAG_PVSYNC);
 720        } else {
 721                enum adv7511_sync_polarity mode_hsync_polarity;
 722                enum adv7511_sync_polarity mode_vsync_polarity;
 723
 724                /**
 725                 * If the input signal is always low or always high we want to
 726                 * invert or let it passthrough depending on the polarity of the
 727                 * current mode.
 728                 **/
 729                if (adj_mode->flags & DRM_MODE_FLAG_NHSYNC)
 730                        mode_hsync_polarity = ADV7511_SYNC_POLARITY_LOW;
 731                else
 732                        mode_hsync_polarity = ADV7511_SYNC_POLARITY_HIGH;
 733
 734                if (adj_mode->flags & DRM_MODE_FLAG_NVSYNC)
 735                        mode_vsync_polarity = ADV7511_SYNC_POLARITY_LOW;
 736                else
 737                        mode_vsync_polarity = ADV7511_SYNC_POLARITY_HIGH;
 738
 739                if (adv7511->hsync_polarity != mode_hsync_polarity &&
 740                    adv7511->hsync_polarity !=
 741                    ADV7511_SYNC_POLARITY_PASSTHROUGH)
 742                        hsync_polarity = 1;
 743
 744                if (adv7511->vsync_polarity != mode_vsync_polarity &&
 745                    adv7511->vsync_polarity !=
 746                    ADV7511_SYNC_POLARITY_PASSTHROUGH)
 747                        vsync_polarity = 1;
 748        }
 749
 750        if (mode->vrefresh <= 24000)
 751                low_refresh_rate = ADV7511_LOW_REFRESH_RATE_24HZ;
 752        else if (mode->vrefresh <= 25000)
 753                low_refresh_rate = ADV7511_LOW_REFRESH_RATE_25HZ;
 754        else if (mode->vrefresh <= 30000)
 755                low_refresh_rate = ADV7511_LOW_REFRESH_RATE_30HZ;
 756        else
 757                low_refresh_rate = ADV7511_LOW_REFRESH_RATE_NONE;
 758
 759        regmap_update_bits(adv7511->regmap, 0xfb,
 760                0x6, low_refresh_rate << 1);
 761        regmap_update_bits(adv7511->regmap, 0x17,
 762                0x60, (vsync_polarity << 6) | (hsync_polarity << 5));
 763
 764        if (adv7511->type == ADV7533)
 765                adv7533_mode_set(adv7511, adj_mode);
 766
 767        drm_mode_copy(&adv7511->curr_mode, adj_mode);
 768
 769        /*
 770         * TODO Test first order 4:2:2 to 4:4:4 up conversion method, which is
 771         * supposed to give better results.
 772         */
 773
 774        adv7511->f_tmds = mode->clock;
 775}
 776
 777/* Connector funcs */
 778static struct adv7511 *connector_to_adv7511(struct drm_connector *connector)
 779{
 780        return container_of(connector, struct adv7511, connector);
 781}
 782
 783static int adv7511_connector_get_modes(struct drm_connector *connector)
 784{
 785        struct adv7511 *adv = connector_to_adv7511(connector);
 786
 787        return adv7511_get_modes(adv, connector);
 788}
 789
 790static enum drm_mode_status
 791adv7511_connector_mode_valid(struct drm_connector *connector,
 792                             struct drm_display_mode *mode)
 793{
 794        struct adv7511 *adv = connector_to_adv7511(connector);
 795
 796        return adv7511_mode_valid(adv, mode);
 797}
 798
 799static struct drm_connector_helper_funcs adv7511_connector_helper_funcs = {
 800        .get_modes = adv7511_connector_get_modes,
 801        .mode_valid = adv7511_connector_mode_valid,
 802};
 803
 804static enum drm_connector_status
 805adv7511_connector_detect(struct drm_connector *connector, bool force)
 806{
 807        struct adv7511 *adv = connector_to_adv7511(connector);
 808
 809        return adv7511_detect(adv, connector);
 810}
 811
 812static const struct drm_connector_funcs adv7511_connector_funcs = {
 813        .fill_modes = drm_helper_probe_single_connector_modes,
 814        .detect = adv7511_connector_detect,
 815        .destroy = drm_connector_cleanup,
 816        .reset = drm_atomic_helper_connector_reset,
 817        .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
 818        .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
 819};
 820
 821/* Bridge funcs */
 822static struct adv7511 *bridge_to_adv7511(struct drm_bridge *bridge)
 823{
 824        return container_of(bridge, struct adv7511, bridge);
 825}
 826
 827static void adv7511_bridge_enable(struct drm_bridge *bridge)
 828{
 829        struct adv7511 *adv = bridge_to_adv7511(bridge);
 830
 831        adv7511_power_on(adv);
 832}
 833
 834static void adv7511_bridge_disable(struct drm_bridge *bridge)
 835{
 836        struct adv7511 *adv = bridge_to_adv7511(bridge);
 837
 838        adv7511_power_off(adv);
 839}
 840
 841static void adv7511_bridge_mode_set(struct drm_bridge *bridge,
 842                                    struct drm_display_mode *mode,
 843                                    struct drm_display_mode *adj_mode)
 844{
 845        struct adv7511 *adv = bridge_to_adv7511(bridge);
 846
 847        adv7511_mode_set(adv, mode, adj_mode);
 848}
 849
 850static int adv7511_bridge_attach(struct drm_bridge *bridge)
 851{
 852        struct adv7511 *adv = bridge_to_adv7511(bridge);
 853        int ret;
 854
 855        if (!bridge->encoder) {
 856                DRM_ERROR("Parent encoder object not found");
 857                return -ENODEV;
 858        }
 859
 860        if (adv->i2c_main->irq)
 861                adv->connector.polled = DRM_CONNECTOR_POLL_HPD;
 862        else
 863                adv->connector.polled = DRM_CONNECTOR_POLL_CONNECT |
 864                                DRM_CONNECTOR_POLL_DISCONNECT;
 865
 866        ret = drm_connector_init(bridge->dev, &adv->connector,
 867                                 &adv7511_connector_funcs,
 868                                 DRM_MODE_CONNECTOR_HDMIA);
 869        if (ret) {
 870                DRM_ERROR("Failed to initialize connector with drm\n");
 871                return ret;
 872        }
 873        drm_connector_helper_add(&adv->connector,
 874                                 &adv7511_connector_helper_funcs);
 875        drm_connector_attach_encoder(&adv->connector, bridge->encoder);
 876
 877        if (adv->type == ADV7533)
 878                ret = adv7533_attach_dsi(adv);
 879
 880        if (adv->i2c_main->irq)
 881                regmap_write(adv->regmap, ADV7511_REG_INT_ENABLE(0),
 882                             ADV7511_INT0_HPD);
 883
 884        return ret;
 885}
 886
 887static const struct drm_bridge_funcs adv7511_bridge_funcs = {
 888        .enable = adv7511_bridge_enable,
 889        .disable = adv7511_bridge_disable,
 890        .mode_set = adv7511_bridge_mode_set,
 891        .attach = adv7511_bridge_attach,
 892};
 893
 894/* -----------------------------------------------------------------------------
 895 * Probe & remove
 896 */
 897
 898static const char * const adv7511_supply_names[] = {
 899        "avdd",
 900        "dvdd",
 901        "pvdd",
 902        "bgvdd",
 903        "dvdd-3v",
 904};
 905
 906static const char * const adv7533_supply_names[] = {
 907        "avdd",
 908        "dvdd",
 909        "pvdd",
 910        "a2vdd",
 911        "v3p3",
 912        "v1p2",
 913};
 914
 915static int adv7511_init_regulators(struct adv7511 *adv)
 916{
 917        struct device *dev = &adv->i2c_main->dev;
 918        const char * const *supply_names;
 919        unsigned int i;
 920        int ret;
 921
 922        if (adv->type == ADV7511) {
 923                supply_names = adv7511_supply_names;
 924                adv->num_supplies = ARRAY_SIZE(adv7511_supply_names);
 925        } else {
 926                supply_names = adv7533_supply_names;
 927                adv->num_supplies = ARRAY_SIZE(adv7533_supply_names);
 928        }
 929
 930        adv->supplies = devm_kcalloc(dev, adv->num_supplies,
 931                                     sizeof(*adv->supplies), GFP_KERNEL);
 932        if (!adv->supplies)
 933                return -ENOMEM;
 934
 935        for (i = 0; i < adv->num_supplies; i++)
 936                adv->supplies[i].supply = supply_names[i];
 937
 938        ret = devm_regulator_bulk_get(dev, adv->num_supplies, adv->supplies);
 939        if (ret)
 940                return ret;
 941
 942        return regulator_bulk_enable(adv->num_supplies, adv->supplies);
 943}
 944
 945static void adv7511_uninit_regulators(struct adv7511 *adv)
 946{
 947        regulator_bulk_disable(adv->num_supplies, adv->supplies);
 948}
 949
 950static bool adv7511_cec_register_volatile(struct device *dev, unsigned int reg)
 951{
 952        struct i2c_client *i2c = to_i2c_client(dev);
 953        struct adv7511 *adv7511 = i2c_get_clientdata(i2c);
 954
 955        if (adv7511->type == ADV7533)
 956                reg -= ADV7533_REG_CEC_OFFSET;
 957
 958        switch (reg) {
 959        case ADV7511_REG_CEC_RX_FRAME_HDR:
 960        case ADV7511_REG_CEC_RX_FRAME_DATA0...
 961                ADV7511_REG_CEC_RX_FRAME_DATA0 + 14:
 962        case ADV7511_REG_CEC_RX_FRAME_LEN:
 963        case ADV7511_REG_CEC_RX_BUFFERS:
 964        case ADV7511_REG_CEC_TX_LOW_DRV_CNT:
 965                return true;
 966        }
 967
 968        return false;
 969}
 970
 971static const struct regmap_config adv7511_cec_regmap_config = {
 972        .reg_bits = 8,
 973        .val_bits = 8,
 974
 975        .max_register = 0xff,
 976        .cache_type = REGCACHE_RBTREE,
 977        .volatile_reg = adv7511_cec_register_volatile,
 978};
 979
 980static int adv7511_init_cec_regmap(struct adv7511 *adv)
 981{
 982        int ret;
 983
 984        adv->i2c_cec = i2c_new_secondary_device(adv->i2c_main, "cec",
 985                                                ADV7511_CEC_I2C_ADDR_DEFAULT);
 986        if (!adv->i2c_cec)
 987                return -EINVAL;
 988        i2c_set_clientdata(adv->i2c_cec, adv);
 989
 990        adv->regmap_cec = devm_regmap_init_i2c(adv->i2c_cec,
 991                                        &adv7511_cec_regmap_config);
 992        if (IS_ERR(adv->regmap_cec)) {
 993                ret = PTR_ERR(adv->regmap_cec);
 994                goto err;
 995        }
 996
 997        if (adv->type == ADV7533) {
 998                ret = adv7533_patch_cec_registers(adv);
 999                if (ret)
1000                        goto err;
1001        }
1002
1003        return 0;
1004err:
1005        i2c_unregister_device(adv->i2c_cec);
1006        return ret;
1007}
1008
1009static int adv7511_parse_dt(struct device_node *np,
1010                            struct adv7511_link_config *config)
1011{
1012        const char *str;
1013        int ret;
1014
1015        of_property_read_u32(np, "adi,input-depth", &config->input_color_depth);
1016        if (config->input_color_depth != 8 && config->input_color_depth != 10 &&
1017            config->input_color_depth != 12)
1018                return -EINVAL;
1019
1020        ret = of_property_read_string(np, "adi,input-colorspace", &str);
1021        if (ret < 0)
1022                return ret;
1023
1024        if (!strcmp(str, "rgb"))
1025                config->input_colorspace = HDMI_COLORSPACE_RGB;
1026        else if (!strcmp(str, "yuv422"))
1027                config->input_colorspace = HDMI_COLORSPACE_YUV422;
1028        else if (!strcmp(str, "yuv444"))
1029                config->input_colorspace = HDMI_COLORSPACE_YUV444;
1030        else
1031                return -EINVAL;
1032
1033        ret = of_property_read_string(np, "adi,input-clock", &str);
1034        if (ret < 0)
1035                return ret;
1036
1037        if (!strcmp(str, "1x"))
1038                config->input_clock = ADV7511_INPUT_CLOCK_1X;
1039        else if (!strcmp(str, "2x"))
1040                config->input_clock = ADV7511_INPUT_CLOCK_2X;
1041        else if (!strcmp(str, "ddr"))
1042                config->input_clock = ADV7511_INPUT_CLOCK_DDR;
1043        else
1044                return -EINVAL;
1045
1046        if (config->input_colorspace == HDMI_COLORSPACE_YUV422 ||
1047            config->input_clock != ADV7511_INPUT_CLOCK_1X) {
1048                ret = of_property_read_u32(np, "adi,input-style",
1049                                           &config->input_style);
1050                if (ret)
1051                        return ret;
1052
1053                if (config->input_style < 1 || config->input_style > 3)
1054                        return -EINVAL;
1055
1056                ret = of_property_read_string(np, "adi,input-justification",
1057                                              &str);
1058                if (ret < 0)
1059                        return ret;
1060
1061                if (!strcmp(str, "left"))
1062                        config->input_justification =
1063                                ADV7511_INPUT_JUSTIFICATION_LEFT;
1064                else if (!strcmp(str, "evenly"))
1065                        config->input_justification =
1066                                ADV7511_INPUT_JUSTIFICATION_EVENLY;
1067                else if (!strcmp(str, "right"))
1068                        config->input_justification =
1069                                ADV7511_INPUT_JUSTIFICATION_RIGHT;
1070                else
1071                        return -EINVAL;
1072
1073        } else {
1074                config->input_style = 1;
1075                config->input_justification = ADV7511_INPUT_JUSTIFICATION_LEFT;
1076        }
1077
1078        of_property_read_u32(np, "adi,clock-delay", &config->clock_delay);
1079        if (config->clock_delay < -1200 || config->clock_delay > 1600)
1080                return -EINVAL;
1081
1082        config->embedded_sync = of_property_read_bool(np, "adi,embedded-sync");
1083
1084        /* Hardcode the sync pulse configurations for now. */
1085        config->sync_pulse = ADV7511_INPUT_SYNC_PULSE_NONE;
1086        config->vsync_polarity = ADV7511_SYNC_POLARITY_PASSTHROUGH;
1087        config->hsync_polarity = ADV7511_SYNC_POLARITY_PASSTHROUGH;
1088
1089        return 0;
1090}
1091
1092static int adv7511_probe(struct i2c_client *i2c, const struct i2c_device_id *id)
1093{
1094        struct adv7511_link_config link_config;
1095        struct adv7511 *adv7511;
1096        struct device *dev = &i2c->dev;
1097        unsigned int val;
1098        int ret;
1099
1100        if (!dev->of_node)
1101                return -EINVAL;
1102
1103        adv7511 = devm_kzalloc(dev, sizeof(*adv7511), GFP_KERNEL);
1104        if (!adv7511)
1105                return -ENOMEM;
1106
1107        adv7511->i2c_main = i2c;
1108        adv7511->powered = false;
1109        adv7511->status = connector_status_disconnected;
1110
1111        if (dev->of_node)
1112                adv7511->type = (enum adv7511_type)of_device_get_match_data(dev);
1113        else
1114                adv7511->type = id->driver_data;
1115
1116        memset(&link_config, 0, sizeof(link_config));
1117
1118        if (adv7511->type == ADV7511)
1119                ret = adv7511_parse_dt(dev->of_node, &link_config);
1120        else
1121                ret = adv7533_parse_dt(dev->of_node, adv7511);
1122        if (ret)
1123                return ret;
1124
1125        ret = adv7511_init_regulators(adv7511);
1126        if (ret) {
1127                dev_err(dev, "failed to init regulators\n");
1128                return ret;
1129        }
1130
1131        /*
1132         * The power down GPIO is optional. If present, toggle it from active to
1133         * inactive to wake up the encoder.
1134         */
1135        adv7511->gpio_pd = devm_gpiod_get_optional(dev, "pd", GPIOD_OUT_HIGH);
1136        if (IS_ERR(adv7511->gpio_pd)) {
1137                ret = PTR_ERR(adv7511->gpio_pd);
1138                goto uninit_regulators;
1139        }
1140
1141        if (adv7511->gpio_pd) {
1142                usleep_range(5000, 6000);
1143                gpiod_set_value_cansleep(adv7511->gpio_pd, 0);
1144        }
1145
1146        adv7511->regmap = devm_regmap_init_i2c(i2c, &adv7511_regmap_config);
1147        if (IS_ERR(adv7511->regmap)) {
1148                ret = PTR_ERR(adv7511->regmap);
1149                goto uninit_regulators;
1150        }
1151
1152        ret = regmap_read(adv7511->regmap, ADV7511_REG_CHIP_REVISION, &val);
1153        if (ret)
1154                goto uninit_regulators;
1155        dev_dbg(dev, "Rev. %d\n", val);
1156
1157        if (adv7511->type == ADV7511)
1158                ret = regmap_register_patch(adv7511->regmap,
1159                                            adv7511_fixed_registers,
1160                                            ARRAY_SIZE(adv7511_fixed_registers));
1161        else
1162                ret = adv7533_patch_registers(adv7511);
1163        if (ret)
1164                goto uninit_regulators;
1165
1166        adv7511_packet_disable(adv7511, 0xffff);
1167
1168        adv7511->i2c_edid = i2c_new_secondary_device(i2c, "edid",
1169                                        ADV7511_EDID_I2C_ADDR_DEFAULT);
1170        if (!adv7511->i2c_edid) {
1171                ret = -EINVAL;
1172                goto uninit_regulators;
1173        }
1174
1175        regmap_write(adv7511->regmap, ADV7511_REG_EDID_I2C_ADDR,
1176                     adv7511->i2c_edid->addr << 1);
1177
1178        adv7511->i2c_packet = i2c_new_secondary_device(i2c, "packet",
1179                                        ADV7511_PACKET_I2C_ADDR_DEFAULT);
1180        if (!adv7511->i2c_packet) {
1181                ret = -EINVAL;
1182                goto err_i2c_unregister_edid;
1183        }
1184
1185        regmap_write(adv7511->regmap, ADV7511_REG_PACKET_I2C_ADDR,
1186                     adv7511->i2c_packet->addr << 1);
1187
1188        ret = adv7511_init_cec_regmap(adv7511);
1189        if (ret)
1190                goto err_i2c_unregister_packet;
1191
1192        regmap_write(adv7511->regmap, ADV7511_REG_CEC_I2C_ADDR,
1193                     adv7511->i2c_cec->addr << 1);
1194
1195        INIT_WORK(&adv7511->hpd_work, adv7511_hpd_work);
1196
1197        if (i2c->irq) {
1198                init_waitqueue_head(&adv7511->wq);
1199
1200                ret = devm_request_threaded_irq(dev, i2c->irq, NULL,
1201                                                adv7511_irq_handler,
1202                                                IRQF_ONESHOT, dev_name(dev),
1203                                                adv7511);
1204                if (ret)
1205                        goto err_unregister_cec;
1206        }
1207
1208        adv7511_power_off(adv7511);
1209
1210        i2c_set_clientdata(i2c, adv7511);
1211
1212        if (adv7511->type == ADV7511)
1213                adv7511_set_link_config(adv7511, &link_config);
1214
1215        ret = adv7511_cec_init(dev, adv7511);
1216        if (ret)
1217                goto err_unregister_cec;
1218
1219        adv7511->bridge.funcs = &adv7511_bridge_funcs;
1220        adv7511->bridge.of_node = dev->of_node;
1221
1222        drm_bridge_add(&adv7511->bridge);
1223
1224        adv7511_audio_init(dev, adv7511);
1225        return 0;
1226
1227err_unregister_cec:
1228        i2c_unregister_device(adv7511->i2c_cec);
1229        if (adv7511->cec_clk)
1230                clk_disable_unprepare(adv7511->cec_clk);
1231err_i2c_unregister_packet:
1232        i2c_unregister_device(adv7511->i2c_packet);
1233err_i2c_unregister_edid:
1234        i2c_unregister_device(adv7511->i2c_edid);
1235uninit_regulators:
1236        adv7511_uninit_regulators(adv7511);
1237
1238        return ret;
1239}
1240
1241static int adv7511_remove(struct i2c_client *i2c)
1242{
1243        struct adv7511 *adv7511 = i2c_get_clientdata(i2c);
1244
1245        if (adv7511->type == ADV7533)
1246                adv7533_detach_dsi(adv7511);
1247        i2c_unregister_device(adv7511->i2c_cec);
1248        if (adv7511->cec_clk)
1249                clk_disable_unprepare(adv7511->cec_clk);
1250
1251        adv7511_uninit_regulators(adv7511);
1252
1253        drm_bridge_remove(&adv7511->bridge);
1254
1255        adv7511_audio_exit(adv7511);
1256
1257        cec_unregister_adapter(adv7511->cec_adap);
1258
1259        i2c_unregister_device(adv7511->i2c_packet);
1260        i2c_unregister_device(adv7511->i2c_edid);
1261
1262        return 0;
1263}
1264
1265static const struct i2c_device_id adv7511_i2c_ids[] = {
1266        { "adv7511", ADV7511 },
1267        { "adv7511w", ADV7511 },
1268        { "adv7513", ADV7511 },
1269#ifdef CONFIG_DRM_I2C_ADV7533
1270        { "adv7533", ADV7533 },
1271#endif
1272        { }
1273};
1274MODULE_DEVICE_TABLE(i2c, adv7511_i2c_ids);
1275
1276static const struct of_device_id adv7511_of_ids[] = {
1277        { .compatible = "adi,adv7511", .data = (void *)ADV7511 },
1278        { .compatible = "adi,adv7511w", .data = (void *)ADV7511 },
1279        { .compatible = "adi,adv7513", .data = (void *)ADV7511 },
1280#ifdef CONFIG_DRM_I2C_ADV7533
1281        { .compatible = "adi,adv7533", .data = (void *)ADV7533 },
1282#endif
1283        { }
1284};
1285MODULE_DEVICE_TABLE(of, adv7511_of_ids);
1286
1287static struct mipi_dsi_driver adv7533_dsi_driver = {
1288        .driver.name = "adv7533",
1289};
1290
1291static struct i2c_driver adv7511_driver = {
1292        .driver = {
1293                .name = "adv7511",
1294                .of_match_table = adv7511_of_ids,
1295        },
1296        .id_table = adv7511_i2c_ids,
1297        .probe = adv7511_probe,
1298        .remove = adv7511_remove,
1299};
1300
1301static int __init adv7511_init(void)
1302{
1303        if (IS_ENABLED(CONFIG_DRM_MIPI_DSI))
1304                mipi_dsi_driver_register(&adv7533_dsi_driver);
1305
1306        return i2c_add_driver(&adv7511_driver);
1307}
1308module_init(adv7511_init);
1309
1310static void __exit adv7511_exit(void)
1311{
1312        i2c_del_driver(&adv7511_driver);
1313
1314        if (IS_ENABLED(CONFIG_DRM_MIPI_DSI))
1315                mipi_dsi_driver_unregister(&adv7533_dsi_driver);
1316}
1317module_exit(adv7511_exit);
1318
1319MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
1320MODULE_DESCRIPTION("ADV7511 HDMI transmitter driver");
1321MODULE_LICENSE("GPL");
1322