1235783Skib/* 2235783Skib * Copyright �� 2006-2010 Intel Corporation 3235783Skib * Copyright (c) 2006 Dave Airlie <airlied@linux.ie> 4235783Skib * 5235783Skib * Permission is hereby granted, free of charge, to any person obtaining a 6235783Skib * copy of this software and associated documentation files (the "Software"), 7235783Skib * to deal in the Software without restriction, including without limitation 8235783Skib * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9235783Skib * and/or sell copies of the Software, and to permit persons to whom the 10235783Skib * Software is furnished to do so, subject to the following conditions: 11235783Skib * 12235783Skib * The above copyright notice and this permission notice (including the next 13235783Skib * paragraph) shall be included in all copies or substantial portions of the 14235783Skib * Software. 15235783Skib * 16235783Skib * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17235783Skib * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18235783Skib * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19235783Skib * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20235783Skib * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21235783Skib * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22235783Skib * DEALINGS IN THE SOFTWARE. 23235783Skib * 24235783Skib * Authors: 25235783Skib * Eric Anholt <eric@anholt.net> 26235783Skib * Dave Airlie <airlied@linux.ie> 27235783Skib * Jesse Barnes <jesse.barnes@intel.com> 28235783Skib * Chris Wilson <chris@chris-wilson.co.uk> 29235783Skib */ 30235783Skib 31235783Skib#include <sys/cdefs.h> 32235783Skib__FBSDID("$FreeBSD: releng/11.0/sys/dev/drm2/i915/intel_panel.c 296548 2016-03-08 20:33:02Z dumbbell $"); 33235783Skib 34296548Sdumbbell#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 35296548Sdumbbell 36235783Skib#include <dev/drm2/drmP.h> 37235783Skib#include <dev/drm2/i915/intel_drv.h> 38235783Skib 39235783Skib#define PCI_LBPC 0xf4 /* legacy/combination backlight modes */ 40235783Skib 41235783Skibvoid 42235783Skibintel_fixed_panel_mode(struct drm_display_mode *fixed_mode, 43235783Skib struct drm_display_mode *adjusted_mode) 44235783Skib{ 45235783Skib adjusted_mode->hdisplay = fixed_mode->hdisplay; 46235783Skib adjusted_mode->hsync_start = fixed_mode->hsync_start; 47235783Skib adjusted_mode->hsync_end = fixed_mode->hsync_end; 48235783Skib adjusted_mode->htotal = fixed_mode->htotal; 49235783Skib 50235783Skib adjusted_mode->vdisplay = fixed_mode->vdisplay; 51235783Skib adjusted_mode->vsync_start = fixed_mode->vsync_start; 52235783Skib adjusted_mode->vsync_end = fixed_mode->vsync_end; 53235783Skib adjusted_mode->vtotal = fixed_mode->vtotal; 54235783Skib 55235783Skib adjusted_mode->clock = fixed_mode->clock; 56235783Skib} 57235783Skib 58235783Skib/* adjusted_mode has been preset to be the panel's fixed mode */ 59235783Skibvoid 60235783Skibintel_pch_panel_fitting(struct drm_device *dev, 61235783Skib int fitting_mode, 62254797Sdumbbell const struct drm_display_mode *mode, 63235783Skib struct drm_display_mode *adjusted_mode) 64235783Skib{ 65235783Skib struct drm_i915_private *dev_priv = dev->dev_private; 66235783Skib int x, y, width, height; 67235783Skib 68235783Skib x = y = width = height = 0; 69235783Skib 70235783Skib /* Native modes don't need fitting */ 71235783Skib if (adjusted_mode->hdisplay == mode->hdisplay && 72235783Skib adjusted_mode->vdisplay == mode->vdisplay) 73235783Skib goto done; 74235783Skib 75235783Skib switch (fitting_mode) { 76235783Skib case DRM_MODE_SCALE_CENTER: 77235783Skib width = mode->hdisplay; 78235783Skib height = mode->vdisplay; 79235783Skib x = (adjusted_mode->hdisplay - width + 1)/2; 80235783Skib y = (adjusted_mode->vdisplay - height + 1)/2; 81235783Skib break; 82235783Skib 83235783Skib case DRM_MODE_SCALE_ASPECT: 84235783Skib /* Scale but preserve the aspect ratio */ 85235783Skib { 86235783Skib u32 scaled_width = adjusted_mode->hdisplay * mode->vdisplay; 87235783Skib u32 scaled_height = mode->hdisplay * adjusted_mode->vdisplay; 88235783Skib if (scaled_width > scaled_height) { /* pillar */ 89235783Skib width = scaled_height / mode->vdisplay; 90235783Skib if (width & 1) 91235783Skib width++; 92235783Skib x = (adjusted_mode->hdisplay - width + 1) / 2; 93235783Skib y = 0; 94235783Skib height = adjusted_mode->vdisplay; 95235783Skib } else if (scaled_width < scaled_height) { /* letter */ 96235783Skib height = scaled_width / mode->hdisplay; 97235783Skib if (height & 1) 98296548Sdumbbell height++; 99235783Skib y = (adjusted_mode->vdisplay - height + 1) / 2; 100235783Skib x = 0; 101235783Skib width = adjusted_mode->hdisplay; 102235783Skib } else { 103235783Skib x = y = 0; 104235783Skib width = adjusted_mode->hdisplay; 105235783Skib height = adjusted_mode->vdisplay; 106235783Skib } 107235783Skib } 108235783Skib break; 109235783Skib 110235783Skib default: 111235783Skib case DRM_MODE_SCALE_FULLSCREEN: 112235783Skib x = y = 0; 113235783Skib width = adjusted_mode->hdisplay; 114235783Skib height = adjusted_mode->vdisplay; 115235783Skib break; 116235783Skib } 117235783Skib 118235783Skibdone: 119235783Skib dev_priv->pch_pf_pos = (x << 16) | y; 120235783Skib dev_priv->pch_pf_size = (width << 16) | height; 121235783Skib} 122235783Skib 123235783Skibstatic int is_backlight_combination_mode(struct drm_device *dev) 124235783Skib{ 125235783Skib struct drm_i915_private *dev_priv = dev->dev_private; 126235783Skib 127235783Skib if (INTEL_INFO(dev)->gen >= 4) 128235783Skib return I915_READ(BLC_PWM_CTL2) & BLM_COMBINATION_MODE; 129235783Skib 130235783Skib if (IS_GEN2(dev)) 131235783Skib return I915_READ(BLC_PWM_CTL) & BLM_LEGACY_MODE; 132235783Skib 133235783Skib return 0; 134235783Skib} 135235783Skib 136296548Sdumbbellstatic u32 i915_read_blc_pwm_ctl(struct drm_device *dev) 137235783Skib{ 138296548Sdumbbell struct drm_i915_private *dev_priv = dev->dev_private; 139235783Skib u32 val; 140235783Skib 141235783Skib /* Restore the CTL value if it lost, e.g. GPU reset */ 142235783Skib 143235783Skib if (HAS_PCH_SPLIT(dev_priv->dev)) { 144235783Skib val = I915_READ(BLC_PWM_PCH_CTL2); 145296548Sdumbbell if (dev_priv->regfile.saveBLC_PWM_CTL2 == 0) { 146296548Sdumbbell dev_priv->regfile.saveBLC_PWM_CTL2 = val; 147235783Skib } else if (val == 0) { 148296548Sdumbbell val = dev_priv->regfile.saveBLC_PWM_CTL2; 149296548Sdumbbell I915_WRITE(BLC_PWM_PCH_CTL2, val); 150235783Skib } 151235783Skib } else { 152235783Skib val = I915_READ(BLC_PWM_CTL); 153296548Sdumbbell if (dev_priv->regfile.saveBLC_PWM_CTL == 0) { 154296548Sdumbbell dev_priv->regfile.saveBLC_PWM_CTL = val; 155296548Sdumbbell if (INTEL_INFO(dev)->gen >= 4) 156296548Sdumbbell dev_priv->regfile.saveBLC_PWM_CTL2 = 157296548Sdumbbell I915_READ(BLC_PWM_CTL2); 158235783Skib } else if (val == 0) { 159296548Sdumbbell val = dev_priv->regfile.saveBLC_PWM_CTL; 160296548Sdumbbell I915_WRITE(BLC_PWM_CTL, val); 161296548Sdumbbell if (INTEL_INFO(dev)->gen >= 4) 162296548Sdumbbell I915_WRITE(BLC_PWM_CTL2, 163296548Sdumbbell dev_priv->regfile.saveBLC_PWM_CTL2); 164235783Skib } 165235783Skib } 166235783Skib 167235783Skib return val; 168235783Skib} 169235783Skib 170296548Sdumbbellstatic u32 _intel_panel_get_max_backlight(struct drm_device *dev) 171235783Skib{ 172235783Skib u32 max; 173235783Skib 174296548Sdumbbell max = i915_read_blc_pwm_ctl(dev); 175235783Skib 176235783Skib if (HAS_PCH_SPLIT(dev)) { 177235783Skib max >>= 16; 178235783Skib } else { 179235783Skib if (INTEL_INFO(dev)->gen < 4) 180235783Skib max >>= 17; 181235783Skib else 182235783Skib max >>= 16; 183235783Skib 184235783Skib if (is_backlight_combination_mode(dev)) 185235783Skib max *= 0xff; 186235783Skib } 187235783Skib 188235783Skib return max; 189235783Skib} 190235783Skib 191296548Sdumbbellu32 intel_panel_get_max_backlight(struct drm_device *dev) 192296548Sdumbbell{ 193296548Sdumbbell u32 max; 194296548Sdumbbell 195296548Sdumbbell max = _intel_panel_get_max_backlight(dev); 196296548Sdumbbell if (max == 0) { 197296548Sdumbbell /* XXX add code here to query mode clock or hardware clock 198296548Sdumbbell * and program max PWM appropriately. 199296548Sdumbbell */ 200296548Sdumbbell pr_warn_once("fixme: max PWM is zero\n"); 201296548Sdumbbell return 1; 202296548Sdumbbell } 203296548Sdumbbell 204296548Sdumbbell DRM_DEBUG_DRIVER("max backlight PWM = %d\n", max); 205296548Sdumbbell return max; 206296548Sdumbbell} 207296548Sdumbbell 208296548Sdumbbellstatic int i915_panel_invert_brightness; 209296548SdumbbellTUNABLE_INT("drm.i915.invert_brightness", &i915_panel_invert_brightness); 210296548SdumbbellMODULE_PARM_DESC(invert_brightness, "Invert backlight brightness " 211296548Sdumbbell "(-1 force normal, 0 machine defaults, 1 force inversion), please " 212296548Sdumbbell "report PCI device ID, subsystem vendor and subsystem device ID " 213296548Sdumbbell "to dri-devel@lists.freedesktop.org, if your machine needs it. " 214296548Sdumbbell "It will then be included in an upcoming module version."); 215296548Sdumbbellmodule_param_named(invert_brightness, i915_panel_invert_brightness, int, 0600); 216277487Skibstatic u32 intel_panel_compute_brightness(struct drm_device *dev, u32 val) 217277487Skib{ 218277487Skib struct drm_i915_private *dev_priv = dev->dev_private; 219277487Skib 220277487Skib if (i915_panel_invert_brightness < 0) 221277487Skib return val; 222277487Skib 223277487Skib if (i915_panel_invert_brightness > 0 || 224277487Skib dev_priv->quirks & QUIRK_INVERT_BRIGHTNESS) 225277487Skib return intel_panel_get_max_backlight(dev) - val; 226277487Skib 227277487Skib return val; 228277487Skib} 229277487Skib 230296548Sdumbbellstatic u32 intel_panel_get_backlight(struct drm_device *dev) 231235783Skib{ 232235783Skib struct drm_i915_private *dev_priv = dev->dev_private; 233235783Skib u32 val; 234235783Skib 235235783Skib if (HAS_PCH_SPLIT(dev)) { 236235783Skib val = I915_READ(BLC_PWM_CPU_CTL) & BACKLIGHT_DUTY_CYCLE_MASK; 237235783Skib } else { 238235783Skib val = I915_READ(BLC_PWM_CTL) & BACKLIGHT_DUTY_CYCLE_MASK; 239235783Skib if (INTEL_INFO(dev)->gen < 4) 240235783Skib val >>= 1; 241235783Skib 242235783Skib if (is_backlight_combination_mode(dev)) { 243235783Skib u8 lbpc; 244235783Skib 245296548Sdumbbell pci_read_config_byte(dev->dev, PCI_LBPC, &lbpc); 246235783Skib val *= lbpc; 247235783Skib } 248235783Skib } 249235783Skib 250277487Skib val = intel_panel_compute_brightness(dev, val); 251277487Skib DRM_DEBUG_DRIVER("get backlight PWM = %d\n", val); 252235783Skib return val; 253235783Skib} 254235783Skib 255235783Skibstatic void intel_pch_panel_set_backlight(struct drm_device *dev, u32 level) 256235783Skib{ 257235783Skib struct drm_i915_private *dev_priv = dev->dev_private; 258235783Skib u32 val = I915_READ(BLC_PWM_CPU_CTL) & ~BACKLIGHT_DUTY_CYCLE_MASK; 259235783Skib I915_WRITE(BLC_PWM_CPU_CTL, val | level); 260235783Skib} 261235783Skib 262235783Skibstatic void intel_panel_actually_set_backlight(struct drm_device *dev, u32 level) 263235783Skib{ 264235783Skib struct drm_i915_private *dev_priv = dev->dev_private; 265235783Skib u32 tmp; 266235783Skib 267277487Skib DRM_DEBUG_DRIVER("set backlight PWM = %d\n", level); 268277487Skib level = intel_panel_compute_brightness(dev, level); 269235783Skib 270235783Skib if (HAS_PCH_SPLIT(dev)) 271235783Skib return intel_pch_panel_set_backlight(dev, level); 272235783Skib 273235783Skib if (is_backlight_combination_mode(dev)) { 274235783Skib u32 max = intel_panel_get_max_backlight(dev); 275235783Skib u8 lbpc; 276235783Skib 277235783Skib lbpc = level * 0xfe / max + 1; 278235783Skib level /= lbpc; 279296548Sdumbbell pci_write_config_byte(dev->dev, PCI_LBPC, lbpc); 280235783Skib } 281235783Skib 282235783Skib tmp = I915_READ(BLC_PWM_CTL); 283296548Sdumbbell if (INTEL_INFO(dev)->gen < 4) 284235783Skib level <<= 1; 285235783Skib tmp &= ~BACKLIGHT_DUTY_CYCLE_MASK; 286235783Skib I915_WRITE(BLC_PWM_CTL, tmp | level); 287235783Skib} 288235783Skib 289235783Skibvoid intel_panel_set_backlight(struct drm_device *dev, u32 level) 290235783Skib{ 291235783Skib struct drm_i915_private *dev_priv = dev->dev_private; 292235783Skib 293235783Skib dev_priv->backlight_level = level; 294235783Skib if (dev_priv->backlight_enabled) 295235783Skib intel_panel_actually_set_backlight(dev, level); 296235783Skib} 297235783Skib 298235783Skibvoid intel_panel_disable_backlight(struct drm_device *dev) 299235783Skib{ 300235783Skib struct drm_i915_private *dev_priv = dev->dev_private; 301235783Skib 302235783Skib dev_priv->backlight_enabled = false; 303235783Skib intel_panel_actually_set_backlight(dev, 0); 304296548Sdumbbell 305296548Sdumbbell if (INTEL_INFO(dev)->gen >= 4) { 306296548Sdumbbell uint32_t reg, tmp; 307296548Sdumbbell 308296548Sdumbbell reg = HAS_PCH_SPLIT(dev) ? BLC_PWM_CPU_CTL2 : BLC_PWM_CTL2; 309296548Sdumbbell 310296548Sdumbbell I915_WRITE(reg, I915_READ(reg) & ~BLM_PWM_ENABLE); 311296548Sdumbbell 312296548Sdumbbell if (HAS_PCH_SPLIT(dev)) { 313296548Sdumbbell tmp = I915_READ(BLC_PWM_PCH_CTL1); 314296548Sdumbbell tmp &= ~BLM_PCH_PWM_ENABLE; 315296548Sdumbbell I915_WRITE(BLC_PWM_PCH_CTL1, tmp); 316296548Sdumbbell } 317296548Sdumbbell } 318235783Skib} 319235783Skib 320296548Sdumbbellvoid intel_panel_enable_backlight(struct drm_device *dev, 321296548Sdumbbell enum pipe pipe) 322235783Skib{ 323235783Skib struct drm_i915_private *dev_priv = dev->dev_private; 324235783Skib 325235783Skib if (dev_priv->backlight_level == 0) 326235783Skib dev_priv->backlight_level = intel_panel_get_max_backlight(dev); 327235783Skib 328296548Sdumbbell if (INTEL_INFO(dev)->gen >= 4) { 329296548Sdumbbell uint32_t reg, tmp; 330296548Sdumbbell 331296548Sdumbbell reg = HAS_PCH_SPLIT(dev) ? BLC_PWM_CPU_CTL2 : BLC_PWM_CTL2; 332296548Sdumbbell 333296548Sdumbbell 334296548Sdumbbell tmp = I915_READ(reg); 335296548Sdumbbell 336296548Sdumbbell /* Note that this can also get called through dpms changes. And 337296548Sdumbbell * we don't track the backlight dpms state, hence check whether 338296548Sdumbbell * we have to do anything first. */ 339296548Sdumbbell if (tmp & BLM_PWM_ENABLE) 340296548Sdumbbell goto set_level; 341296548Sdumbbell 342296548Sdumbbell if (dev_priv->num_pipe == 3) 343296548Sdumbbell tmp &= ~BLM_PIPE_SELECT_IVB; 344296548Sdumbbell else 345296548Sdumbbell tmp &= ~BLM_PIPE_SELECT; 346296548Sdumbbell 347296548Sdumbbell tmp |= BLM_PIPE(pipe); 348296548Sdumbbell tmp &= ~BLM_PWM_ENABLE; 349296548Sdumbbell 350296548Sdumbbell I915_WRITE(reg, tmp); 351296548Sdumbbell POSTING_READ(reg); 352296548Sdumbbell I915_WRITE(reg, tmp | BLM_PWM_ENABLE); 353296548Sdumbbell 354296548Sdumbbell if (HAS_PCH_SPLIT(dev)) { 355296548Sdumbbell tmp = I915_READ(BLC_PWM_PCH_CTL1); 356296548Sdumbbell tmp |= BLM_PCH_PWM_ENABLE; 357296548Sdumbbell tmp &= ~BLM_PCH_OVERRIDE_ENABLE; 358296548Sdumbbell I915_WRITE(BLC_PWM_PCH_CTL1, tmp); 359296548Sdumbbell } 360296548Sdumbbell } 361296548Sdumbbell 362296548Sdumbbellset_level: 363296548Sdumbbell /* Call below after setting BLC_PWM_CPU_CTL2 and BLC_PWM_PCH_CTL1. 364296548Sdumbbell * BLC_PWM_CPU_CTL may be cleared to zero automatically when these 365296548Sdumbbell * registers are set. 366296548Sdumbbell */ 367235783Skib dev_priv->backlight_enabled = true; 368235783Skib intel_panel_actually_set_backlight(dev, dev_priv->backlight_level); 369235783Skib} 370235783Skib 371235783Skibstatic void intel_panel_init_backlight(struct drm_device *dev) 372235783Skib{ 373235783Skib struct drm_i915_private *dev_priv = dev->dev_private; 374235783Skib 375235783Skib dev_priv->backlight_level = intel_panel_get_backlight(dev); 376235783Skib dev_priv->backlight_enabled = dev_priv->backlight_level != 0; 377235783Skib} 378235783Skib 379235783Skibenum drm_connector_status 380235783Skibintel_panel_detect(struct drm_device *dev) 381235783Skib{ 382235783Skib struct drm_i915_private *dev_priv = dev->dev_private; 383235783Skib 384235783Skib /* Assume that the BIOS does not lie through the OpRegion... */ 385296548Sdumbbell if (!i915_panel_ignore_lid && dev_priv->opregion.lid_state) { 386235783Skib return ioread32(dev_priv->opregion.lid_state) & 0x1 ? 387235783Skib connector_status_connected : 388235783Skib connector_status_disconnected; 389296548Sdumbbell } 390235783Skib 391296548Sdumbbell switch (i915_panel_ignore_lid) { 392296548Sdumbbell case -2: 393296548Sdumbbell return connector_status_connected; 394296548Sdumbbell case -1: 395296548Sdumbbell return connector_status_disconnected; 396296548Sdumbbell default: 397296548Sdumbbell return connector_status_unknown; 398296548Sdumbbell } 399235783Skib} 400235783Skib 401296548Sdumbbell#ifdef CONFIG_BACKLIGHT_CLASS_DEVICE 402296548Sdumbbellstatic int intel_panel_update_status(struct backlight_device *bd) 403235783Skib{ 404296548Sdumbbell struct drm_device *dev = bl_get_data(bd); 405296548Sdumbbell intel_panel_set_backlight(dev, bd->props.brightness); 406296548Sdumbbell return 0; 407296548Sdumbbell} 408296548Sdumbbell 409296548Sdumbbellstatic int intel_panel_get_brightness(struct backlight_device *bd) 410296548Sdumbbell{ 411296548Sdumbbell struct drm_device *dev = bl_get_data(bd); 412296548Sdumbbell struct drm_i915_private *dev_priv = dev->dev_private; 413296548Sdumbbell return dev_priv->backlight_level; 414296548Sdumbbell} 415296548Sdumbbell 416296548Sdumbbellstatic const struct backlight_ops intel_panel_bl_ops = { 417296548Sdumbbell .update_status = intel_panel_update_status, 418296548Sdumbbell .get_brightness = intel_panel_get_brightness, 419296548Sdumbbell}; 420296548Sdumbbell 421296548Sdumbbellint intel_panel_setup_backlight(struct drm_connector *connector) 422296548Sdumbbell{ 423296548Sdumbbell struct drm_device *dev = connector->dev; 424296548Sdumbbell struct drm_i915_private *dev_priv = dev->dev_private; 425296548Sdumbbell struct backlight_properties props; 426296548Sdumbbell 427235783Skib intel_panel_init_backlight(dev); 428296548Sdumbbell 429296548Sdumbbell if (WARN_ON(dev_priv->backlight)) 430296548Sdumbbell return -ENODEV; 431296548Sdumbbell 432296548Sdumbbell memset(&props, 0, sizeof(props)); 433296548Sdumbbell props.type = BACKLIGHT_RAW; 434296548Sdumbbell props.max_brightness = _intel_panel_get_max_backlight(dev); 435296548Sdumbbell if (props.max_brightness == 0) { 436296548Sdumbbell DRM_DEBUG_DRIVER("Failed to get maximum backlight value\n"); 437296548Sdumbbell return -ENODEV; 438296548Sdumbbell } 439296548Sdumbbell dev_priv->backlight = 440296548Sdumbbell backlight_device_register("intel_backlight", 441296548Sdumbbell &connector->kdev, dev, 442296548Sdumbbell &intel_panel_bl_ops, &props); 443296548Sdumbbell 444296548Sdumbbell if (IS_ERR(dev_priv->backlight)) { 445296548Sdumbbell DRM_ERROR("Failed to register backlight: %ld\n", 446296548Sdumbbell PTR_ERR(dev_priv->backlight)); 447296548Sdumbbell dev_priv->backlight = NULL; 448296548Sdumbbell return -ENODEV; 449296548Sdumbbell } 450296548Sdumbbell dev_priv->backlight->props.brightness = intel_panel_get_backlight(dev); 451235783Skib return 0; 452235783Skib} 453235783Skib 454235783Skibvoid intel_panel_destroy_backlight(struct drm_device *dev) 455235783Skib{ 456296548Sdumbbell struct drm_i915_private *dev_priv = dev->dev_private; 457296548Sdumbbell if (dev_priv->backlight) { 458296548Sdumbbell backlight_device_unregister(dev_priv->backlight); 459296548Sdumbbell dev_priv->backlight = NULL; 460296548Sdumbbell } 461296548Sdumbbell} 462296548Sdumbbell#else 463296548Sdumbbellint intel_panel_setup_backlight(struct drm_connector *connector) 464296548Sdumbbell{ 465296548Sdumbbell intel_panel_init_backlight(connector->dev); 466296548Sdumbbell return 0; 467296548Sdumbbell} 468296548Sdumbbell 469296548Sdumbbellvoid intel_panel_destroy_backlight(struct drm_device *dev) 470296548Sdumbbell{ 471235783Skib return; 472235783Skib} 473296548Sdumbbell#endif 474296548Sdumbbell 475296548Sdumbbellint intel_panel_init(struct intel_panel *panel, 476296548Sdumbbell struct drm_display_mode *fixed_mode) 477296548Sdumbbell{ 478296548Sdumbbell panel->fixed_mode = fixed_mode; 479296548Sdumbbell 480296548Sdumbbell return 0; 481296548Sdumbbell} 482296548Sdumbbell 483296548Sdumbbellvoid intel_panel_fini(struct intel_panel *panel) 484296548Sdumbbell{ 485296548Sdumbbell struct intel_connector *intel_connector = 486296548Sdumbbell container_of(panel, struct intel_connector, panel); 487296548Sdumbbell 488296548Sdumbbell if (panel->fixed_mode) 489296548Sdumbbell drm_mode_destroy(intel_connector->base.dev, panel->fixed_mode); 490296548Sdumbbell} 491