diff options
| author | Michel Dänzer <michel@daenzer.net> | 2011-03-22 19:30:23 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-03-22 20:43:59 -0400 |
| commit | 63ec0119d3720034dfd626c9785aefa5a6f972ca (patch) | |
| tree | 58141ebc543324e8111c5fdc5f2ada50418926d6 | |
| parent | bb7ca747f8d6243b3943c5b133048652020f4a50 (diff) | |
radeon: expose backlight class device for legacy LVDS encoder
Allows e.g. power management daemons to control the backlight level. Inspired
by the corresponding code in radeonfb.
[mjg@redhat.com: updated to add backlight type and make the connector the parent device]
Signed-off-by: Michel Dänzer <michel@daenzer.net>
Signed-off-by: Matthew Garrett <mjg@redhat.com>
Cc: Richard Purdie <rpurdie@rpsys.net>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: David Airlie <airlied@linux.ie>
Acked-by: Alex Deucher <alexdeucher@gmail.com>
Cc: Ben Skeggs <bskeggs@redhat.com>
Cc: Zhang Rui <rui.zhang@intel.com>
Cc: Len Brown <lenb@kernel.org>
Cc: Jesse Barnes <jbarnes@virtuousgeek.org>
Tested-by: Sedat Dilek <sedat.dilek@googlemail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
| -rw-r--r-- | drivers/gpu/drm/radeon/Kconfig | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_connectors.c | 15 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_legacy_encoders.c | 257 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_mode.h | 6 |
4 files changed, 273 insertions, 6 deletions
diff --git a/drivers/gpu/drm/radeon/Kconfig b/drivers/gpu/drm/radeon/Kconfig index 1c02d23f6fcc..9746fee59f56 100644 --- a/drivers/gpu/drm/radeon/Kconfig +++ b/drivers/gpu/drm/radeon/Kconfig | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | config DRM_RADEON_KMS | 1 | config DRM_RADEON_KMS |
| 2 | bool "Enable modesetting on radeon by default - NEW DRIVER" | 2 | bool "Enable modesetting on radeon by default - NEW DRIVER" |
| 3 | depends on DRM_RADEON | 3 | depends on DRM_RADEON |
| 4 | select BACKLIGHT_CLASS_DEVICE | ||
| 4 | help | 5 | help |
| 5 | Choose this option if you want kernel modesetting enabled by default. | 6 | Choose this option if you want kernel modesetting enabled by default. |
| 6 | 7 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index 3f3c9aac46cc..28c7961cd19b 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | |||
| @@ -40,6 +40,10 @@ radeon_atombios_connected_scratch_regs(struct drm_connector *connector, | |||
| 40 | struct drm_encoder *encoder, | 40 | struct drm_encoder *encoder, |
| 41 | bool connected); | 41 | bool connected); |
| 42 | 42 | ||
| 43 | extern void | ||
| 44 | radeon_legacy_backlight_init(struct radeon_encoder *radeon_encoder, | ||
| 45 | struct drm_connector *drm_connector); | ||
| 46 | |||
| 43 | void radeon_connector_hotplug(struct drm_connector *connector) | 47 | void radeon_connector_hotplug(struct drm_connector *connector) |
| 44 | { | 48 | { |
| 45 | struct drm_device *dev = connector->dev; | 49 | struct drm_device *dev = connector->dev; |
| @@ -1526,6 +1530,17 @@ radeon_add_legacy_connector(struct drm_device *dev, | |||
| 1526 | connector->polled = DRM_CONNECTOR_POLL_HPD; | 1530 | connector->polled = DRM_CONNECTOR_POLL_HPD; |
| 1527 | connector->display_info.subpixel_order = subpixel_order; | 1531 | connector->display_info.subpixel_order = subpixel_order; |
| 1528 | drm_sysfs_connector_add(connector); | 1532 | drm_sysfs_connector_add(connector); |
| 1533 | if (connector_type == DRM_MODE_CONNECTOR_LVDS) { | ||
| 1534 | struct drm_encoder *drm_encoder; | ||
| 1535 | |||
| 1536 | list_for_each_entry(drm_encoder, &dev->mode_config.encoder_list, head) { | ||
| 1537 | struct radeon_encoder *radeon_encoder; | ||
| 1538 | |||
| 1539 | radeon_encoder = to_radeon_encoder(drm_encoder); | ||
| 1540 | if (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_LVDS) | ||
| 1541 | radeon_legacy_backlight_init(radeon_encoder, connector); | ||
| 1542 | } | ||
| 1543 | } | ||
| 1529 | return; | 1544 | return; |
| 1530 | 1545 | ||
| 1531 | failed: | 1546 | failed: |
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c index 59f834ba283d..5b54268ed6b2 100644 --- a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c | |||
| @@ -28,6 +28,10 @@ | |||
| 28 | #include "radeon_drm.h" | 28 | #include "radeon_drm.h" |
| 29 | #include "radeon.h" | 29 | #include "radeon.h" |
| 30 | #include "atom.h" | 30 | #include "atom.h" |
| 31 | #include <linux/backlight.h> | ||
| 32 | #ifdef CONFIG_PMAC_BACKLIGHT | ||
| 33 | #include <asm/backlight.h> | ||
| 34 | #endif | ||
| 31 | 35 | ||
| 32 | static void radeon_legacy_encoder_disable(struct drm_encoder *encoder) | 36 | static void radeon_legacy_encoder_disable(struct drm_encoder *encoder) |
| 33 | { | 37 | { |
| @@ -39,7 +43,7 @@ static void radeon_legacy_encoder_disable(struct drm_encoder *encoder) | |||
| 39 | radeon_encoder->active_device = 0; | 43 | radeon_encoder->active_device = 0; |
| 40 | } | 44 | } |
| 41 | 45 | ||
| 42 | static void radeon_legacy_lvds_dpms(struct drm_encoder *encoder, int mode) | 46 | static void radeon_legacy_lvds_update(struct drm_encoder *encoder, int mode) |
| 43 | { | 47 | { |
| 44 | struct drm_device *dev = encoder->dev; | 48 | struct drm_device *dev = encoder->dev; |
| 45 | struct radeon_device *rdev = dev->dev_private; | 49 | struct radeon_device *rdev = dev->dev_private; |
| @@ -47,15 +51,23 @@ static void radeon_legacy_lvds_dpms(struct drm_encoder *encoder, int mode) | |||
| 47 | uint32_t lvds_gen_cntl, lvds_pll_cntl, pixclks_cntl, disp_pwr_man; | 51 | uint32_t lvds_gen_cntl, lvds_pll_cntl, pixclks_cntl, disp_pwr_man; |
| 48 | int panel_pwr_delay = 2000; | 52 | int panel_pwr_delay = 2000; |
| 49 | bool is_mac = false; | 53 | bool is_mac = false; |
| 54 | uint8_t backlight_level; | ||
| 50 | DRM_DEBUG_KMS("\n"); | 55 | DRM_DEBUG_KMS("\n"); |
| 51 | 56 | ||
| 57 | lvds_gen_cntl = RREG32(RADEON_LVDS_GEN_CNTL); | ||
| 58 | backlight_level = (lvds_gen_cntl >> RADEON_LVDS_BL_MOD_LEVEL_SHIFT) & 0xff; | ||
| 59 | |||
| 52 | if (radeon_encoder->enc_priv) { | 60 | if (radeon_encoder->enc_priv) { |
| 53 | if (rdev->is_atom_bios) { | 61 | if (rdev->is_atom_bios) { |
| 54 | struct radeon_encoder_atom_dig *lvds = radeon_encoder->enc_priv; | 62 | struct radeon_encoder_atom_dig *lvds = radeon_encoder->enc_priv; |
| 55 | panel_pwr_delay = lvds->panel_pwr_delay; | 63 | panel_pwr_delay = lvds->panel_pwr_delay; |
| 64 | if (lvds->bl_dev) | ||
| 65 | backlight_level = lvds->backlight_level; | ||
| 56 | } else { | 66 | } else { |
| 57 | struct radeon_encoder_lvds *lvds = radeon_encoder->enc_priv; | 67 | struct radeon_encoder_lvds *lvds = radeon_encoder->enc_priv; |
| 58 | panel_pwr_delay = lvds->panel_pwr_delay; | 68 | panel_pwr_delay = lvds->panel_pwr_delay; |
| 69 | if (lvds->bl_dev) | ||
| 70 | backlight_level = lvds->backlight_level; | ||
| 59 | } | 71 | } |
| 60 | } | 72 | } |
| 61 | 73 | ||
| @@ -82,11 +94,13 @@ static void radeon_legacy_lvds_dpms(struct drm_encoder *encoder, int mode) | |||
| 82 | lvds_pll_cntl &= ~RADEON_LVDS_PLL_RESET; | 94 | lvds_pll_cntl &= ~RADEON_LVDS_PLL_RESET; |
| 83 | WREG32(RADEON_LVDS_PLL_CNTL, lvds_pll_cntl); | 95 | WREG32(RADEON_LVDS_PLL_CNTL, lvds_pll_cntl); |
| 84 | 96 | ||
| 85 | lvds_gen_cntl = RREG32(RADEON_LVDS_GEN_CNTL); | 97 | lvds_gen_cntl &= ~(RADEON_LVDS_DISPLAY_DIS | |
| 86 | lvds_gen_cntl |= (RADEON_LVDS_ON | RADEON_LVDS_EN | RADEON_LVDS_DIGON | RADEON_LVDS_BLON); | 98 | RADEON_LVDS_BL_MOD_LEVEL_MASK); |
| 99 | lvds_gen_cntl |= (RADEON_LVDS_ON | RADEON_LVDS_EN | | ||
| 100 | RADEON_LVDS_DIGON | RADEON_LVDS_BLON | | ||
| 101 | (backlight_level << RADEON_LVDS_BL_MOD_LEVEL_SHIFT)); | ||
| 87 | if (is_mac) | 102 | if (is_mac) |
| 88 | lvds_gen_cntl |= RADEON_LVDS_BL_MOD_EN; | 103 | lvds_gen_cntl |= RADEON_LVDS_BL_MOD_EN; |
| 89 | lvds_gen_cntl &= ~(RADEON_LVDS_DISPLAY_DIS); | ||
| 90 | udelay(panel_pwr_delay * 1000); | 104 | udelay(panel_pwr_delay * 1000); |
| 91 | WREG32(RADEON_LVDS_GEN_CNTL, lvds_gen_cntl); | 105 | WREG32(RADEON_LVDS_GEN_CNTL, lvds_gen_cntl); |
| 92 | break; | 106 | break; |
| @@ -95,7 +109,6 @@ static void radeon_legacy_lvds_dpms(struct drm_encoder *encoder, int mode) | |||
| 95 | case DRM_MODE_DPMS_OFF: | 109 | case DRM_MODE_DPMS_OFF: |
| 96 | pixclks_cntl = RREG32_PLL(RADEON_PIXCLKS_CNTL); | 110 | pixclks_cntl = RREG32_PLL(RADEON_PIXCLKS_CNTL); |
| 97 | WREG32_PLL_P(RADEON_PIXCLKS_CNTL, 0, ~RADEON_PIXCLK_LVDS_ALWAYS_ONb); | 111 | WREG32_PLL_P(RADEON_PIXCLKS_CNTL, 0, ~RADEON_PIXCLK_LVDS_ALWAYS_ONb); |
| 98 | lvds_gen_cntl = RREG32(RADEON_LVDS_GEN_CNTL); | ||
| 99 | lvds_gen_cntl |= RADEON_LVDS_DISPLAY_DIS; | 112 | lvds_gen_cntl |= RADEON_LVDS_DISPLAY_DIS; |
| 100 | if (is_mac) { | 113 | if (is_mac) { |
| 101 | lvds_gen_cntl &= ~RADEON_LVDS_BL_MOD_EN; | 114 | lvds_gen_cntl &= ~RADEON_LVDS_BL_MOD_EN; |
| @@ -119,6 +132,25 @@ static void radeon_legacy_lvds_dpms(struct drm_encoder *encoder, int mode) | |||
| 119 | 132 | ||
| 120 | } | 133 | } |
| 121 | 134 | ||
| 135 | static void radeon_legacy_lvds_dpms(struct drm_encoder *encoder, int mode) | ||
| 136 | { | ||
| 137 | struct radeon_device *rdev = encoder->dev->dev_private; | ||
| 138 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | ||
| 139 | DRM_DEBUG("\n"); | ||
| 140 | |||
| 141 | if (radeon_encoder->enc_priv) { | ||
| 142 | if (rdev->is_atom_bios) { | ||
| 143 | struct radeon_encoder_atom_dig *lvds = radeon_encoder->enc_priv; | ||
| 144 | lvds->dpms_mode = mode; | ||
| 145 | } else { | ||
| 146 | struct radeon_encoder_lvds *lvds = radeon_encoder->enc_priv; | ||
| 147 | lvds->dpms_mode = mode; | ||
| 148 | } | ||
| 149 | } | ||
| 150 | |||
| 151 | radeon_legacy_lvds_update(encoder, mode); | ||
| 152 | } | ||
| 153 | |||
| 122 | static void radeon_legacy_lvds_prepare(struct drm_encoder *encoder) | 154 | static void radeon_legacy_lvds_prepare(struct drm_encoder *encoder) |
| 123 | { | 155 | { |
| 124 | struct radeon_device *rdev = encoder->dev->dev_private; | 156 | struct radeon_device *rdev = encoder->dev->dev_private; |
| @@ -237,9 +269,222 @@ static const struct drm_encoder_helper_funcs radeon_legacy_lvds_helper_funcs = { | |||
| 237 | .disable = radeon_legacy_encoder_disable, | 269 | .disable = radeon_legacy_encoder_disable, |
| 238 | }; | 270 | }; |
| 239 | 271 | ||
| 272 | #ifdef CONFIG_BACKLIGHT_CLASS_DEVICE | ||
| 273 | |||
| 274 | #define MAX_RADEON_LEVEL 0xFF | ||
| 275 | |||
| 276 | struct radeon_backlight_privdata { | ||
| 277 | struct radeon_encoder *encoder; | ||
| 278 | uint8_t negative; | ||
| 279 | }; | ||
| 280 | |||
| 281 | static uint8_t radeon_legacy_lvds_level(struct backlight_device *bd) | ||
| 282 | { | ||
| 283 | struct radeon_backlight_privdata *pdata = bl_get_data(bd); | ||
| 284 | uint8_t level; | ||
| 285 | |||
| 286 | /* Convert brightness to hardware level */ | ||
| 287 | if (bd->props.brightness < 0) | ||
| 288 | level = 0; | ||
| 289 | else if (bd->props.brightness > MAX_RADEON_LEVEL) | ||
| 290 | level = MAX_RADEON_LEVEL; | ||
| 291 | else | ||
| 292 | level = bd->props.brightness; | ||
| 293 | |||
| 294 | if (pdata->negative) | ||
| 295 | level = MAX_RADEON_LEVEL - level; | ||
| 296 | |||
| 297 | return level; | ||
| 298 | } | ||
| 299 | |||
| 300 | static int radeon_legacy_backlight_update_status(struct backlight_device *bd) | ||
| 301 | { | ||
| 302 | struct radeon_backlight_privdata *pdata = bl_get_data(bd); | ||
| 303 | struct radeon_encoder *radeon_encoder = pdata->encoder; | ||
| 304 | struct drm_device *dev = radeon_encoder->base.dev; | ||
| 305 | struct radeon_device *rdev = dev->dev_private; | ||
| 306 | int dpms_mode = DRM_MODE_DPMS_ON; | ||
| 307 | |||
| 308 | if (radeon_encoder->enc_priv) { | ||
| 309 | if (rdev->is_atom_bios) { | ||
| 310 | struct radeon_encoder_atom_dig *lvds = radeon_encoder->enc_priv; | ||
| 311 | dpms_mode = lvds->dpms_mode; | ||
| 312 | lvds->backlight_level = radeon_legacy_lvds_level(bd); | ||
| 313 | } else { | ||
| 314 | struct radeon_encoder_lvds *lvds = radeon_encoder->enc_priv; | ||
| 315 | dpms_mode = lvds->dpms_mode; | ||
| 316 | lvds->backlight_level = radeon_legacy_lvds_level(bd); | ||
| 317 | } | ||
| 318 | } | ||
| 319 | |||
| 320 | if (bd->props.brightness > 0) | ||
| 321 | radeon_legacy_lvds_update(&radeon_encoder->base, dpms_mode); | ||
| 322 | else | ||
| 323 | radeon_legacy_lvds_update(&radeon_encoder->base, DRM_MODE_DPMS_OFF); | ||
| 324 | |||
| 325 | return 0; | ||
| 326 | } | ||
| 327 | |||
| 328 | static int radeon_legacy_backlight_get_brightness(struct backlight_device *bd) | ||
| 329 | { | ||
| 330 | struct radeon_backlight_privdata *pdata = bl_get_data(bd); | ||
| 331 | struct radeon_encoder *radeon_encoder = pdata->encoder; | ||
| 332 | struct drm_device *dev = radeon_encoder->base.dev; | ||
| 333 | struct radeon_device *rdev = dev->dev_private; | ||
| 334 | uint8_t backlight_level; | ||
| 335 | |||
| 336 | backlight_level = (RREG32(RADEON_LVDS_GEN_CNTL) >> | ||
| 337 | RADEON_LVDS_BL_MOD_LEVEL_SHIFT) & 0xff; | ||
| 338 | |||
| 339 | return pdata->negative ? MAX_RADEON_LEVEL - backlight_level : backlight_level; | ||
| 340 | } | ||
| 341 | |||
| 342 | static const struct backlight_ops radeon_backlight_ops = { | ||
| 343 | .get_brightness = radeon_legacy_backlight_get_brightness, | ||
| 344 | .update_status = radeon_legacy_backlight_update_status, | ||
| 345 | }; | ||
| 346 | |||
| 347 | void radeon_legacy_backlight_init(struct radeon_encoder *radeon_encoder, | ||
| 348 | struct drm_connector *drm_connector) | ||
| 349 | { | ||
| 350 | struct drm_device *dev = radeon_encoder->base.dev; | ||
| 351 | struct radeon_device *rdev = dev->dev_private; | ||
| 352 | struct backlight_device *bd; | ||
| 353 | struct backlight_properties props; | ||
| 354 | struct radeon_backlight_privdata *pdata; | ||
| 355 | uint8_t backlight_level; | ||
| 356 | |||
| 357 | if (!radeon_encoder->enc_priv) | ||
| 358 | return; | ||
| 359 | |||
| 360 | #ifdef CONFIG_PMAC_BACKLIGHT | ||
| 361 | if (!pmac_has_backlight_type("ati") && | ||
| 362 | !pmac_has_backlight_type("mnca")) | ||
| 363 | return; | ||
| 364 | #endif | ||
| 365 | |||
| 366 | pdata = kmalloc(sizeof(struct radeon_backlight_privdata), GFP_KERNEL); | ||
| 367 | if (!pdata) { | ||
| 368 | DRM_ERROR("Memory allocation failed\n"); | ||
| 369 | goto error; | ||
| 370 | } | ||
| 371 | |||
| 372 | props.max_brightness = MAX_RADEON_LEVEL; | ||
| 373 | props.type = BACKLIGHT_RAW; | ||
| 374 | bd = backlight_device_register("radeon_bl", &drm_connector->kdev, | ||
| 375 | pdata, &radeon_backlight_ops, &props); | ||
| 376 | if (IS_ERR(bd)) { | ||
| 377 | DRM_ERROR("Backlight registration failed\n"); | ||
| 378 | goto error; | ||
| 379 | } | ||
| 380 | |||
| 381 | pdata->encoder = radeon_encoder; | ||
| 382 | |||
| 383 | backlight_level = (RREG32(RADEON_LVDS_GEN_CNTL) >> | ||
| 384 | RADEON_LVDS_BL_MOD_LEVEL_SHIFT) & 0xff; | ||
| 385 | |||
| 386 | /* First, try to detect backlight level sense based on the assumption | ||
| 387 | * that firmware set it up at full brightness | ||
| 388 | */ | ||
| 389 | if (backlight_level == 0) | ||
| 390 | pdata->negative = true; | ||
| 391 | else if (backlight_level == 0xff) | ||
| 392 | pdata->negative = false; | ||
| 393 | else { | ||
| 394 | /* XXX hack... maybe some day we can figure out in what direction | ||
| 395 | * backlight should work on a given panel? | ||
| 396 | */ | ||
| 397 | pdata->negative = (rdev->family != CHIP_RV200 && | ||
| 398 | rdev->family != CHIP_RV250 && | ||
| 399 | rdev->family != CHIP_RV280 && | ||
| 400 | rdev->family != CHIP_RV350); | ||
| 401 | |||
| 402 | #ifdef CONFIG_PMAC_BACKLIGHT | ||
| 403 | pdata->negative = (pdata->negative || | ||
| 404 | of_machine_is_compatible("PowerBook4,3") || | ||
| 405 | of_machine_is_compatible("PowerBook6,3") || | ||
| 406 | of_machine_is_compatible("PowerBook6,5")); | ||
| 407 | #endif | ||
| 408 | } | ||
| 409 | |||
| 410 | if (rdev->is_atom_bios) { | ||
| 411 | struct radeon_encoder_atom_dig *lvds = radeon_encoder->enc_priv; | ||
| 412 | lvds->bl_dev = bd; | ||
| 413 | } else { | ||
| 414 | struct radeon_encoder_lvds *lvds = radeon_encoder->enc_priv; | ||
| 415 | lvds->bl_dev = bd; | ||
| 416 | } | ||
| 417 | |||
| 418 | bd->props.brightness = radeon_legacy_backlight_get_brightness(bd); | ||
| 419 | bd->props.power = FB_BLANK_UNBLANK; | ||
| 420 | backlight_update_status(bd); | ||
| 421 | |||
| 422 | DRM_INFO("radeon legacy LVDS backlight initialized\n"); | ||
| 423 | |||
| 424 | return; | ||
| 425 | |||
| 426 | error: | ||
| 427 | kfree(pdata); | ||
| 428 | return; | ||
| 429 | } | ||
| 430 | |||
| 431 | static void radeon_legacy_backlight_exit(struct radeon_encoder *radeon_encoder) | ||
| 432 | { | ||
| 433 | struct drm_device *dev = radeon_encoder->base.dev; | ||
| 434 | struct radeon_device *rdev = dev->dev_private; | ||
| 435 | struct backlight_device *bd = NULL; | ||
| 436 | |||
| 437 | if (!radeon_encoder->enc_priv) | ||
| 438 | return; | ||
| 439 | |||
| 440 | if (rdev->is_atom_bios) { | ||
| 441 | struct radeon_encoder_atom_dig *lvds = radeon_encoder->enc_priv; | ||
| 442 | bd = lvds->bl_dev; | ||
| 443 | lvds->bl_dev = NULL; | ||
| 444 | } else { | ||
| 445 | struct radeon_encoder_lvds *lvds = radeon_encoder->enc_priv; | ||
| 446 | bd = lvds->bl_dev; | ||
| 447 | lvds->bl_dev = NULL; | ||
| 448 | } | ||
| 449 | |||
| 450 | if (bd) { | ||
| 451 | struct radeon_legacy_backlight_privdata *pdata; | ||
| 452 | |||
| 453 | pdata = bl_get_data(bd); | ||
| 454 | backlight_device_unregister(bd); | ||
| 455 | kfree(pdata); | ||
| 456 | |||
| 457 | DRM_INFO("radeon legacy LVDS backlight unloaded\n"); | ||
| 458 | } | ||
| 459 | } | ||
| 460 | |||
| 461 | #else /* !CONFIG_BACKLIGHT_CLASS_DEVICE */ | ||
| 462 | |||
| 463 | void radeon_legacy_backlight_init(struct radeon_encoder *encoder) | ||
| 464 | { | ||
| 465 | } | ||
| 466 | |||
| 467 | static void radeon_legacy_backlight_exit(struct radeon_encoder *encoder) | ||
| 468 | { | ||
| 469 | } | ||
| 470 | |||
| 471 | #endif | ||
| 472 | |||
| 473 | |||
| 474 | static void radeon_lvds_enc_destroy(struct drm_encoder *encoder) | ||
| 475 | { | ||
| 476 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | ||
| 477 | |||
| 478 | if (radeon_encoder->enc_priv) { | ||
| 479 | radeon_legacy_backlight_exit(radeon_encoder); | ||
| 480 | kfree(radeon_encoder->enc_priv); | ||
| 481 | } | ||
| 482 | drm_encoder_cleanup(encoder); | ||
| 483 | kfree(radeon_encoder); | ||
| 484 | } | ||
| 240 | 485 | ||
| 241 | static const struct drm_encoder_funcs radeon_legacy_lvds_enc_funcs = { | 486 | static const struct drm_encoder_funcs radeon_legacy_lvds_enc_funcs = { |
| 242 | .destroy = radeon_enc_destroy, | 487 | .destroy = radeon_lvds_enc_destroy, |
| 243 | }; | 488 | }; |
| 244 | 489 | ||
| 245 | static void radeon_legacy_primary_dac_dpms(struct drm_encoder *encoder, int mode) | 490 | static void radeon_legacy_primary_dac_dpms(struct drm_encoder *encoder, int mode) |
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h index 5067d18d0009..e4582814bb78 100644 --- a/drivers/gpu/drm/radeon/radeon_mode.h +++ b/drivers/gpu/drm/radeon/radeon_mode.h | |||
| @@ -302,6 +302,9 @@ struct radeon_encoder_lvds { | |||
| 302 | uint32_t lvds_gen_cntl; | 302 | uint32_t lvds_gen_cntl; |
| 303 | /* panel mode */ | 303 | /* panel mode */ |
| 304 | struct drm_display_mode native_mode; | 304 | struct drm_display_mode native_mode; |
| 305 | struct backlight_device *bl_dev; | ||
| 306 | int dpms_mode; | ||
| 307 | uint8_t backlight_level; | ||
| 305 | }; | 308 | }; |
| 306 | 309 | ||
| 307 | struct radeon_encoder_tv_dac { | 310 | struct radeon_encoder_tv_dac { |
| @@ -355,6 +358,9 @@ struct radeon_encoder_atom_dig { | |||
| 355 | uint32_t lcd_ss_id; | 358 | uint32_t lcd_ss_id; |
| 356 | /* panel mode */ | 359 | /* panel mode */ |
| 357 | struct drm_display_mode native_mode; | 360 | struct drm_display_mode native_mode; |
| 361 | struct backlight_device *bl_dev; | ||
| 362 | int dpms_mode; | ||
| 363 | uint8_t backlight_level; | ||
| 358 | }; | 364 | }; |
| 359 | 365 | ||
| 360 | struct radeon_encoder_atom_dac { | 366 | struct radeon_encoder_atom_dac { |
