linux/drivers/gpu/drm/gma500/cdv_intel_lvds.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Copyright © 2006-2011 Intel Corporation
   4 *
   5 * Authors:
   6 *      Eric Anholt <eric@anholt.net>
   7 *      Dave Airlie <airlied@linux.ie>
   8 *      Jesse Barnes <jesse.barnes@intel.com>
   9 */
  10
  11#include <linux/dmi.h>
  12#include <linux/i2c.h>
  13#include <linux/pm_runtime.h>
  14
  15#include "cdv_device.h"
  16#include "intel_bios.h"
  17#include "power.h"
  18#include "psb_drv.h"
  19#include "psb_intel_drv.h"
  20#include "psb_intel_reg.h"
  21
  22/**
  23 * LVDS I2C backlight control macros
  24 */
  25#define BRIGHTNESS_MAX_LEVEL 100
  26#define BRIGHTNESS_MASK 0xFF
  27#define BLC_I2C_TYPE    0x01
  28#define BLC_PWM_TYPT    0x02
  29
  30#define BLC_POLARITY_NORMAL 0
  31#define BLC_POLARITY_INVERSE 1
  32
  33#define PSB_BLC_MAX_PWM_REG_FREQ       (0xFFFE)
  34#define PSB_BLC_MIN_PWM_REG_FREQ        (0x2)
  35#define PSB_BLC_PWM_PRECISION_FACTOR    (10)
  36#define PSB_BACKLIGHT_PWM_CTL_SHIFT     (16)
  37#define PSB_BACKLIGHT_PWM_POLARITY_BIT_CLEAR (0xFFFE)
  38
  39struct cdv_intel_lvds_priv {
  40        /**
  41         * Saved LVDO output states
  42         */
  43        uint32_t savePP_ON;
  44        uint32_t savePP_OFF;
  45        uint32_t saveLVDS;
  46        uint32_t savePP_CONTROL;
  47        uint32_t savePP_CYCLE;
  48        uint32_t savePFIT_CONTROL;
  49        uint32_t savePFIT_PGM_RATIOS;
  50        uint32_t saveBLC_PWM_CTL;
  51};
  52
  53/*
  54 * Returns the maximum level of the backlight duty cycle field.
  55 */
  56static u32 cdv_intel_lvds_get_max_backlight(struct drm_device *dev)
  57{
  58        struct drm_psb_private *dev_priv = dev->dev_private;
  59        u32 retval;
  60
  61        if (gma_power_begin(dev, false)) {
  62                retval = ((REG_READ(BLC_PWM_CTL) &
  63                          BACKLIGHT_MODULATION_FREQ_MASK) >>
  64                          BACKLIGHT_MODULATION_FREQ_SHIFT) * 2;
  65
  66                gma_power_end(dev);
  67        } else
  68                retval = ((dev_priv->regs.saveBLC_PWM_CTL &
  69                          BACKLIGHT_MODULATION_FREQ_MASK) >>
  70                          BACKLIGHT_MODULATION_FREQ_SHIFT) * 2;
  71
  72        return retval;
  73}
  74
  75#if 0
  76/*
  77 * Set LVDS backlight level by I2C command
  78 */
  79static int cdv_lvds_i2c_set_brightness(struct drm_device *dev,
  80                                        unsigned int level)
  81{
  82        struct drm_psb_private *dev_priv = dev->dev_private;
  83        struct psb_intel_i2c_chan *lvds_i2c_bus = dev_priv->lvds_i2c_bus;
  84        u8 out_buf[2];
  85        unsigned int blc_i2c_brightness;
  86
  87        struct i2c_msg msgs[] = {
  88                {
  89                        .addr = lvds_i2c_bus->slave_addr,
  90                        .flags = 0,
  91                        .len = 2,
  92                        .buf = out_buf,
  93                }
  94        };
  95
  96        blc_i2c_brightness = BRIGHTNESS_MASK & ((unsigned int)level *
  97                             BRIGHTNESS_MASK /
  98                             BRIGHTNESS_MAX_LEVEL);
  99
 100        if (dev_priv->lvds_bl->pol == BLC_POLARITY_INVERSE)
 101                blc_i2c_brightness = BRIGHTNESS_MASK - blc_i2c_brightness;
 102
 103        out_buf[0] = dev_priv->lvds_bl->brightnesscmd;
 104        out_buf[1] = (u8)blc_i2c_brightness;
 105
 106        if (i2c_transfer(&lvds_i2c_bus->adapter, msgs, 1) == 1)
 107                return 0;
 108
 109        DRM_ERROR("I2C transfer error\n");
 110        return -1;
 111}
 112
 113
 114static int cdv_lvds_pwm_set_brightness(struct drm_device *dev, int level)
 115{
 116        struct drm_psb_private *dev_priv = dev->dev_private;
 117
 118        u32 max_pwm_blc;
 119        u32 blc_pwm_duty_cycle;
 120
 121        max_pwm_blc = cdv_intel_lvds_get_max_backlight(dev);
 122
 123        /*BLC_PWM_CTL Should be initiated while backlight device init*/
 124        BUG_ON((max_pwm_blc & PSB_BLC_MAX_PWM_REG_FREQ) == 0);
 125
 126        blc_pwm_duty_cycle = level * max_pwm_blc / BRIGHTNESS_MAX_LEVEL;
 127
 128        if (dev_priv->lvds_bl->pol == BLC_POLARITY_INVERSE)
 129                blc_pwm_duty_cycle = max_pwm_blc - blc_pwm_duty_cycle;
 130
 131        blc_pwm_duty_cycle &= PSB_BACKLIGHT_PWM_POLARITY_BIT_CLEAR;
 132        REG_WRITE(BLC_PWM_CTL,
 133                  (max_pwm_blc << PSB_BACKLIGHT_PWM_CTL_SHIFT) |
 134                  (blc_pwm_duty_cycle));
 135
 136        return 0;
 137}
 138
 139/*
 140 * Set LVDS backlight level either by I2C or PWM
 141 */
 142void cdv_intel_lvds_set_brightness(struct drm_device *dev, int level)
 143{
 144        struct drm_psb_private *dev_priv = dev->dev_private;
 145
 146        if (!dev_priv->lvds_bl) {
 147                DRM_ERROR("NO LVDS Backlight Info\n");
 148                return;
 149        }
 150
 151        if (dev_priv->lvds_bl->type == BLC_I2C_TYPE)
 152                cdv_lvds_i2c_set_brightness(dev, level);
 153        else
 154                cdv_lvds_pwm_set_brightness(dev, level);
 155}
 156#endif
 157
 158/**
 159 * Sets the backlight level.
 160 *
 161 * level backlight level, from 0 to cdv_intel_lvds_get_max_backlight().
 162 */
 163static void cdv_intel_lvds_set_backlight(struct drm_device *dev, int level)
 164{
 165        struct drm_psb_private *dev_priv = dev->dev_private;
 166        u32 blc_pwm_ctl;
 167
 168        if (gma_power_begin(dev, false)) {
 169                blc_pwm_ctl =
 170                        REG_READ(BLC_PWM_CTL) & ~BACKLIGHT_DUTY_CYCLE_MASK;
 171                REG_WRITE(BLC_PWM_CTL,
 172                                (blc_pwm_ctl |
 173                                (level << BACKLIGHT_DUTY_CYCLE_SHIFT)));
 174                gma_power_end(dev);
 175        } else {
 176                blc_pwm_ctl = dev_priv->regs.saveBLC_PWM_CTL &
 177                                ~BACKLIGHT_DUTY_CYCLE_MASK;
 178                dev_priv->regs.saveBLC_PWM_CTL = (blc_pwm_ctl |
 179                                        (level << BACKLIGHT_DUTY_CYCLE_SHIFT));
 180        }
 181}
 182
 183/**
 184 * Sets the power state for the panel.
 185 */
 186static void cdv_intel_lvds_set_power(struct drm_device *dev,
 187                                     struct drm_encoder *encoder, bool on)
 188{
 189        struct drm_psb_private *dev_priv = dev->dev_private;
 190        u32 pp_status;
 191
 192        if (!gma_power_begin(dev, true))
 193                return;
 194
 195        if (on) {
 196                REG_WRITE(PP_CONTROL, REG_READ(PP_CONTROL) |
 197                          POWER_TARGET_ON);
 198                do {
 199                        pp_status = REG_READ(PP_STATUS);
 200                } while ((pp_status & PP_ON) == 0);
 201
 202                cdv_intel_lvds_set_backlight(dev,
 203                                dev_priv->mode_dev.backlight_duty_cycle);
 204        } else {
 205                cdv_intel_lvds_set_backlight(dev, 0);
 206
 207                REG_WRITE(PP_CONTROL, REG_READ(PP_CONTROL) &
 208                          ~POWER_TARGET_ON);
 209                do {
 210                        pp_status = REG_READ(PP_STATUS);
 211                } while (pp_status & PP_ON);
 212        }
 213        gma_power_end(dev);
 214}
 215
 216static void cdv_intel_lvds_encoder_dpms(struct drm_encoder *encoder, int mode)
 217{
 218        struct drm_device *dev = encoder->dev;
 219        if (mode == DRM_MODE_DPMS_ON)
 220                cdv_intel_lvds_set_power(dev, encoder, true);
 221        else
 222                cdv_intel_lvds_set_power(dev, encoder, false);
 223        /* XXX: We never power down the LVDS pairs. */
 224}
 225
 226static void cdv_intel_lvds_save(struct drm_connector *connector)
 227{
 228}
 229
 230static void cdv_intel_lvds_restore(struct drm_connector *connector)
 231{
 232}
 233
 234static enum drm_mode_status cdv_intel_lvds_mode_valid(struct drm_connector *connector,
 235                              struct drm_display_mode *mode)
 236{
 237        struct drm_device *dev = connector->dev;
 238        struct drm_psb_private *dev_priv = dev->dev_private;
 239        struct drm_display_mode *fixed_mode =
 240                                        dev_priv->mode_dev.panel_fixed_mode;
 241
 242        /* just in case */
 243        if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
 244                return MODE_NO_DBLESCAN;
 245
 246        /* just in case */
 247        if (mode->flags & DRM_MODE_FLAG_INTERLACE)
 248                return MODE_NO_INTERLACE;
 249
 250        if (fixed_mode) {
 251                if (mode->hdisplay > fixed_mode->hdisplay)
 252                        return MODE_PANEL;
 253                if (mode->vdisplay > fixed_mode->vdisplay)
 254                        return MODE_PANEL;
 255        }
 256        return MODE_OK;
 257}
 258
 259static bool cdv_intel_lvds_mode_fixup(struct drm_encoder *encoder,
 260                                  const struct drm_display_mode *mode,
 261                                  struct drm_display_mode *adjusted_mode)
 262{
 263        struct drm_device *dev = encoder->dev;
 264        struct drm_psb_private *dev_priv = dev->dev_private;
 265        struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev;
 266        struct drm_encoder *tmp_encoder;
 267        struct drm_display_mode *panel_fixed_mode = mode_dev->panel_fixed_mode;
 268
 269        /* Should never happen!! */
 270        list_for_each_entry(tmp_encoder, &dev->mode_config.encoder_list,
 271                            head) {
 272                if (tmp_encoder != encoder
 273                    && tmp_encoder->crtc == encoder->crtc) {
 274                        pr_err("Can't enable LVDS and another encoder on the same pipe\n");
 275                        return false;
 276                }
 277        }
 278
 279        /*
 280         * If we have timings from the BIOS for the panel, put them in
 281         * to the adjusted mode.  The CRTC will be set up for this mode,
 282         * with the panel scaling set up to source from the H/VDisplay
 283         * of the original mode.
 284         */
 285        if (panel_fixed_mode != NULL) {
 286                adjusted_mode->hdisplay = panel_fixed_mode->hdisplay;
 287                adjusted_mode->hsync_start = panel_fixed_mode->hsync_start;
 288                adjusted_mode->hsync_end = panel_fixed_mode->hsync_end;
 289                adjusted_mode->htotal = panel_fixed_mode->htotal;
 290                adjusted_mode->vdisplay = panel_fixed_mode->vdisplay;
 291                adjusted_mode->vsync_start = panel_fixed_mode->vsync_start;
 292                adjusted_mode->vsync_end = panel_fixed_mode->vsync_end;
 293                adjusted_mode->vtotal = panel_fixed_mode->vtotal;
 294                adjusted_mode->clock = panel_fixed_mode->clock;
 295                drm_mode_set_crtcinfo(adjusted_mode,
 296                                      CRTC_INTERLACE_HALVE_V);
 297        }
 298
 299        /*
 300         * XXX: It would be nice to support lower refresh rates on the
 301         * panels to reduce power consumption, and perhaps match the
 302         * user's requested refresh rate.
 303         */
 304
 305        return true;
 306}
 307
 308static void cdv_intel_lvds_prepare(struct drm_encoder *encoder)
 309{
 310        struct drm_device *dev = encoder->dev;
 311        struct drm_psb_private *dev_priv = dev->dev_private;
 312        struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev;
 313
 314        if (!gma_power_begin(dev, true))
 315                return;
 316
 317        mode_dev->saveBLC_PWM_CTL = REG_READ(BLC_PWM_CTL);
 318        mode_dev->backlight_duty_cycle = (mode_dev->saveBLC_PWM_CTL &
 319                                          BACKLIGHT_DUTY_CYCLE_MASK);
 320
 321        cdv_intel_lvds_set_power(dev, encoder, false);
 322
 323        gma_power_end(dev);
 324}
 325
 326static void cdv_intel_lvds_commit(struct drm_encoder *encoder)
 327{
 328        struct drm_device *dev = encoder->dev;
 329        struct drm_psb_private *dev_priv = dev->dev_private;
 330        struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev;
 331
 332        if (mode_dev->backlight_duty_cycle == 0)
 333                mode_dev->backlight_duty_cycle =
 334                    cdv_intel_lvds_get_max_backlight(dev);
 335
 336        cdv_intel_lvds_set_power(dev, encoder, true);
 337}
 338
 339static void cdv_intel_lvds_mode_set(struct drm_encoder *encoder,
 340                                struct drm_display_mode *mode,
 341                                struct drm_display_mode *adjusted_mode)
 342{
 343        struct drm_device *dev = encoder->dev;
 344        struct drm_psb_private *dev_priv = dev->dev_private;
 345        struct gma_crtc *gma_crtc = to_gma_crtc(encoder->crtc);
 346        u32 pfit_control;
 347
 348        /*
 349         * The LVDS pin pair will already have been turned on in the
 350         * cdv_intel_crtc_mode_set since it has a large impact on the DPLL
 351         * settings.
 352         */
 353
 354        /*
 355         * Enable automatic panel scaling so that non-native modes fill the
 356         * screen.  Should be enabled before the pipe is enabled, according to
 357         * register description and PRM.
 358         */
 359        if (mode->hdisplay != adjusted_mode->hdisplay ||
 360            mode->vdisplay != adjusted_mode->vdisplay)
 361                pfit_control = (PFIT_ENABLE | VERT_AUTO_SCALE |
 362                                HORIZ_AUTO_SCALE | VERT_INTERP_BILINEAR |
 363                                HORIZ_INTERP_BILINEAR);
 364        else
 365                pfit_control = 0;
 366
 367        pfit_control |= gma_crtc->pipe << PFIT_PIPE_SHIFT;
 368
 369        if (dev_priv->lvds_dither)
 370                pfit_control |= PANEL_8TO6_DITHER_ENABLE;
 371
 372        REG_WRITE(PFIT_CONTROL, pfit_control);
 373}
 374
 375/**
 376 * Return the list of DDC modes if available, or the BIOS fixed mode otherwise.
 377 */
 378static int cdv_intel_lvds_get_modes(struct drm_connector *connector)
 379{
 380        struct drm_device *dev = connector->dev;
 381        struct drm_psb_private *dev_priv = dev->dev_private;
 382        struct gma_encoder *gma_encoder = gma_attached_encoder(connector);
 383        struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev;
 384        int ret;
 385
 386        ret = psb_intel_ddc_get_modes(connector, &gma_encoder->i2c_bus->adapter);
 387
 388        if (ret)
 389                return ret;
 390
 391        if (mode_dev->panel_fixed_mode != NULL) {
 392                struct drm_display_mode *mode =
 393                    drm_mode_duplicate(dev, mode_dev->panel_fixed_mode);
 394                drm_mode_probed_add(connector, mode);
 395                return 1;
 396        }
 397
 398        return 0;
 399}
 400
 401/**
 402 * cdv_intel_lvds_destroy - unregister and free LVDS structures
 403 * @connector: connector to free
 404 *
 405 * Unregister the DDC bus for this connector then free the driver private
 406 * structure.
 407 */
 408static void cdv_intel_lvds_destroy(struct drm_connector *connector)
 409{
 410        struct gma_encoder *gma_encoder = gma_attached_encoder(connector);
 411
 412        psb_intel_i2c_destroy(gma_encoder->i2c_bus);
 413        drm_connector_unregister(connector);
 414        drm_connector_cleanup(connector);
 415        kfree(connector);
 416}
 417
 418static int cdv_intel_lvds_set_property(struct drm_connector *connector,
 419                                       struct drm_property *property,
 420                                       uint64_t value)
 421{
 422        struct drm_encoder *encoder = connector->encoder;
 423
 424        if (!strcmp(property->name, "scaling mode") && encoder) {
 425                struct gma_crtc *crtc = to_gma_crtc(encoder->crtc);
 426                uint64_t curValue;
 427
 428                if (!crtc)
 429                        return -1;
 430
 431                switch (value) {
 432                case DRM_MODE_SCALE_FULLSCREEN:
 433                        break;
 434                case DRM_MODE_SCALE_NO_SCALE:
 435                        break;
 436                case DRM_MODE_SCALE_ASPECT:
 437                        break;
 438                default:
 439                        return -1;
 440                }
 441
 442                if (drm_object_property_get_value(&connector->base,
 443                                                     property,
 444                                                     &curValue))
 445                        return -1;
 446
 447                if (curValue == value)
 448                        return 0;
 449
 450                if (drm_object_property_set_value(&connector->base,
 451                                                        property,
 452                                                        value))
 453                        return -1;
 454
 455                if (crtc->saved_mode.hdisplay != 0 &&
 456                    crtc->saved_mode.vdisplay != 0) {
 457                        if (!drm_crtc_helper_set_mode(encoder->crtc,
 458                                                      &crtc->saved_mode,
 459                                                      encoder->crtc->x,
 460                                                      encoder->crtc->y,
 461                                                      encoder->crtc->primary->fb))
 462                                return -1;
 463                }
 464        } else if (!strcmp(property->name, "backlight") && encoder) {
 465                if (drm_object_property_set_value(&connector->base,
 466                                                        property,
 467                                                        value))
 468                        return -1;
 469                else
 470                        gma_backlight_set(encoder->dev, value);
 471        } else if (!strcmp(property->name, "DPMS") && encoder) {
 472                const struct drm_encoder_helper_funcs *helpers =
 473                                        encoder->helper_private;
 474                helpers->dpms(encoder, value);
 475        }
 476        return 0;
 477}
 478
 479static const struct drm_encoder_helper_funcs
 480                                        cdv_intel_lvds_helper_funcs = {
 481        .dpms = cdv_intel_lvds_encoder_dpms,
 482        .mode_fixup = cdv_intel_lvds_mode_fixup,
 483        .prepare = cdv_intel_lvds_prepare,
 484        .mode_set = cdv_intel_lvds_mode_set,
 485        .commit = cdv_intel_lvds_commit,
 486};
 487
 488static const struct drm_connector_helper_funcs
 489                                cdv_intel_lvds_connector_helper_funcs = {
 490        .get_modes = cdv_intel_lvds_get_modes,
 491        .mode_valid = cdv_intel_lvds_mode_valid,
 492        .best_encoder = gma_best_encoder,
 493};
 494
 495static const struct drm_connector_funcs cdv_intel_lvds_connector_funcs = {
 496        .dpms = drm_helper_connector_dpms,
 497        .fill_modes = drm_helper_probe_single_connector_modes,
 498        .set_property = cdv_intel_lvds_set_property,
 499        .destroy = cdv_intel_lvds_destroy,
 500};
 501
 502
 503static void cdv_intel_lvds_enc_destroy(struct drm_encoder *encoder)
 504{
 505        drm_encoder_cleanup(encoder);
 506}
 507
 508static const struct drm_encoder_funcs cdv_intel_lvds_enc_funcs = {
 509        .destroy = cdv_intel_lvds_enc_destroy,
 510};
 511
 512/*
 513 * Enumerate the child dev array parsed from VBT to check whether
 514 * the LVDS is present.
 515 * If it is present, return 1.
 516 * If it is not present, return false.
 517 * If no child dev is parsed from VBT, it assumes that the LVDS is present.
 518 */
 519static bool lvds_is_present_in_vbt(struct drm_device *dev,
 520                                   u8 *i2c_pin)
 521{
 522        struct drm_psb_private *dev_priv = dev->dev_private;
 523        int i;
 524
 525        if (!dev_priv->child_dev_num)
 526                return true;
 527
 528        for (i = 0; i < dev_priv->child_dev_num; i++) {
 529                struct child_device_config *child = dev_priv->child_dev + i;
 530
 531                /* If the device type is not LFP, continue.
 532                 * We have to check both the new identifiers as well as the
 533                 * old for compatibility with some BIOSes.
 534                 */
 535                if (child->device_type != DEVICE_TYPE_INT_LFP &&
 536                    child->device_type != DEVICE_TYPE_LFP)
 537                        continue;
 538
 539                if (child->i2c_pin)
 540                    *i2c_pin = child->i2c_pin;
 541
 542                /* However, we cannot trust the BIOS writers to populate
 543                 * the VBT correctly.  Since LVDS requires additional
 544                 * information from AIM blocks, a non-zero addin offset is
 545                 * a good indicator that the LVDS is actually present.
 546                 */
 547                if (child->addin_offset)
 548                        return true;
 549
 550                /* But even then some BIOS writers perform some black magic
 551                 * and instantiate the device without reference to any
 552                 * additional data.  Trust that if the VBT was written into
 553                 * the OpRegion then they have validated the LVDS's existence.
 554                 */
 555                if (dev_priv->opregion.vbt)
 556                        return true;
 557        }
 558
 559        return false;
 560}
 561
 562/**
 563 * cdv_intel_lvds_init - setup LVDS connectors on this device
 564 * @dev: drm device
 565 *
 566 * Create the connector, register the LVDS DDC bus, and try to figure out what
 567 * modes we can display on the LVDS panel (if present).
 568 */
 569void cdv_intel_lvds_init(struct drm_device *dev,
 570                     struct psb_intel_mode_device *mode_dev)
 571{
 572        struct gma_encoder *gma_encoder;
 573        struct gma_connector *gma_connector;
 574        struct cdv_intel_lvds_priv *lvds_priv;
 575        struct drm_connector *connector;
 576        struct drm_encoder *encoder;
 577        struct drm_display_mode *scan;
 578        struct drm_crtc *crtc;
 579        struct drm_psb_private *dev_priv = dev->dev_private;
 580        u32 lvds;
 581        int pipe;
 582        u8 pin;
 583
 584        if (!dev_priv->lvds_enabled_in_vbt)
 585                return;
 586
 587        pin = GMBUS_PORT_PANEL;
 588        if (!lvds_is_present_in_vbt(dev, &pin)) {
 589                DRM_DEBUG_KMS("LVDS is not present in VBT\n");
 590                return;
 591        }
 592
 593        gma_encoder = kzalloc(sizeof(struct gma_encoder),
 594                                    GFP_KERNEL);
 595        if (!gma_encoder)
 596                return;
 597
 598        gma_connector = kzalloc(sizeof(struct gma_connector),
 599                                      GFP_KERNEL);
 600        if (!gma_connector)
 601                goto failed_connector;
 602
 603        lvds_priv = kzalloc(sizeof(struct cdv_intel_lvds_priv), GFP_KERNEL);
 604        if (!lvds_priv)
 605                goto failed_lvds_priv;
 606
 607        gma_encoder->dev_priv = lvds_priv;
 608
 609        connector = &gma_connector->base;
 610        gma_connector->save = cdv_intel_lvds_save;
 611        gma_connector->restore = cdv_intel_lvds_restore;
 612        encoder = &gma_encoder->base;
 613
 614
 615        drm_connector_init(dev, connector,
 616                           &cdv_intel_lvds_connector_funcs,
 617                           DRM_MODE_CONNECTOR_LVDS);
 618
 619        drm_encoder_init(dev, encoder,
 620                         &cdv_intel_lvds_enc_funcs,
 621                         DRM_MODE_ENCODER_LVDS, NULL);
 622
 623
 624        gma_connector_attach_encoder(gma_connector, gma_encoder);
 625        gma_encoder->type = INTEL_OUTPUT_LVDS;
 626
 627        drm_encoder_helper_add(encoder, &cdv_intel_lvds_helper_funcs);
 628        drm_connector_helper_add(connector,
 629                                 &cdv_intel_lvds_connector_helper_funcs);
 630        connector->display_info.subpixel_order = SubPixelHorizontalRGB;
 631        connector->interlace_allowed = false;
 632        connector->doublescan_allowed = false;
 633
 634        /*Attach connector properties*/
 635        drm_object_attach_property(&connector->base,
 636                                      dev->mode_config.scaling_mode_property,
 637                                      DRM_MODE_SCALE_FULLSCREEN);
 638        drm_object_attach_property(&connector->base,
 639                                      dev_priv->backlight_property,
 640                                      BRIGHTNESS_MAX_LEVEL);
 641
 642        /**
 643         * Set up I2C bus
 644         * FIXME: distroy i2c_bus when exit
 645         */
 646        gma_encoder->i2c_bus = psb_intel_i2c_create(dev,
 647                                                         GPIOB,
 648                                                         "LVDSBLC_B");
 649        if (!gma_encoder->i2c_bus) {
 650                dev_printk(KERN_ERR,
 651                        &dev->pdev->dev, "I2C bus registration failed.\n");
 652                goto failed_blc_i2c;
 653        }
 654        gma_encoder->i2c_bus->slave_addr = 0x2C;
 655        dev_priv->lvds_i2c_bus = gma_encoder->i2c_bus;
 656
 657        /*
 658         * LVDS discovery:
 659         * 1) check for EDID on DDC
 660         * 2) check for VBT data
 661         * 3) check to see if LVDS is already on
 662         *    if none of the above, no panel
 663         * 4) make sure lid is open
 664         *    if closed, act like it's not there for now
 665         */
 666
 667        /* Set up the DDC bus. */
 668        gma_encoder->ddc_bus = psb_intel_i2c_create(dev,
 669                                                         GPIOC,
 670                                                         "LVDSDDC_C");
 671        if (!gma_encoder->ddc_bus) {
 672                dev_printk(KERN_ERR, &dev->pdev->dev,
 673                           "DDC bus registration " "failed.\n");
 674                goto failed_ddc;
 675        }
 676
 677        /*
 678         * Attempt to get the fixed panel mode from DDC.  Assume that the
 679         * preferred mode is the right one.
 680         */
 681        mutex_lock(&dev->mode_config.mutex);
 682        psb_intel_ddc_get_modes(connector,
 683                                &gma_encoder->ddc_bus->adapter);
 684        list_for_each_entry(scan, &connector->probed_modes, head) {
 685                if (scan->type & DRM_MODE_TYPE_PREFERRED) {
 686                        mode_dev->panel_fixed_mode =
 687                            drm_mode_duplicate(dev, scan);
 688                        goto out;       /* FIXME: check for quirks */
 689                }
 690        }
 691
 692        /* Failed to get EDID, what about VBT? do we need this?*/
 693        if (dev_priv->lfp_lvds_vbt_mode) {
 694                mode_dev->panel_fixed_mode =
 695                        drm_mode_duplicate(dev, dev_priv->lfp_lvds_vbt_mode);
 696                if (mode_dev->panel_fixed_mode) {
 697                        mode_dev->panel_fixed_mode->type |=
 698                                DRM_MODE_TYPE_PREFERRED;
 699                        goto out;       /* FIXME: check for quirks */
 700                }
 701        }
 702        /*
 703         * If we didn't get EDID, try checking if the panel is already turned
 704         * on.  If so, assume that whatever is currently programmed is the
 705         * correct mode.
 706         */
 707        lvds = REG_READ(LVDS);
 708        pipe = (lvds & LVDS_PIPEB_SELECT) ? 1 : 0;
 709        crtc = psb_intel_get_crtc_from_pipe(dev, pipe);
 710
 711        if (crtc && (lvds & LVDS_PORT_EN)) {
 712                mode_dev->panel_fixed_mode =
 713                    cdv_intel_crtc_mode_get(dev, crtc);
 714                if (mode_dev->panel_fixed_mode) {
 715                        mode_dev->panel_fixed_mode->type |=
 716                            DRM_MODE_TYPE_PREFERRED;
 717                        goto out;       /* FIXME: check for quirks */
 718                }
 719        }
 720
 721        /* If we still don't have a mode after all that, give up. */
 722        if (!mode_dev->panel_fixed_mode) {
 723                DRM_DEBUG
 724                        ("Found no modes on the lvds, ignoring the LVDS\n");
 725                goto failed_find;
 726        }
 727
 728        /* setup PWM */
 729        {
 730                u32 pwm;
 731
 732                pwm = REG_READ(BLC_PWM_CTL2);
 733                if (pipe == 1)
 734                        pwm |= PWM_PIPE_B;
 735                else
 736                        pwm &= ~PWM_PIPE_B;
 737                pwm |= PWM_ENABLE;
 738                REG_WRITE(BLC_PWM_CTL2, pwm);
 739        }
 740
 741out:
 742        mutex_unlock(&dev->mode_config.mutex);
 743        drm_connector_register(connector);
 744        return;
 745
 746failed_find:
 747        mutex_unlock(&dev->mode_config.mutex);
 748        pr_err("Failed find\n");
 749        psb_intel_i2c_destroy(gma_encoder->ddc_bus);
 750failed_ddc:
 751        pr_err("Failed DDC\n");
 752        psb_intel_i2c_destroy(gma_encoder->i2c_bus);
 753failed_blc_i2c:
 754        pr_err("Failed BLC\n");
 755        drm_encoder_cleanup(encoder);
 756        drm_connector_cleanup(connector);
 757        kfree(lvds_priv);
 758failed_lvds_priv:
 759        kfree(gma_connector);
 760failed_connector:
 761        kfree(gma_encoder);
 762}
 763