|
Lines 483-495
static void radeon_legacy_backlight_exit(struct radeon_encoder *radeon_encoder)
Link Here
|
| 483 |
|
483 |
|
| 484 |
#else /* !CONFIG_BACKLIGHT_CLASS_DEVICE */ |
484 |
#else /* !CONFIG_BACKLIGHT_CLASS_DEVICE */ |
| 485 |
|
485 |
|
| 486 |
void radeon_legacy_backlight_init(struct radeon_encoder *encoder, |
486 |
struct backlight_device { |
|
|
487 |
struct backlight_properties { |
| 488 |
int brightness; |
| 489 |
int max_brightness; |
| 490 |
} props; |
| 491 |
struct radeon_backlight_privdata pdata; |
| 492 |
}; |
| 493 |
|
| 494 |
static int radeon_legacy_backlight_get_brightness(struct backlight_device *bd) |
| 495 |
{ |
| 496 |
struct radeon_encoder *radeon_encoder = bd->pdata.encoder; |
| 497 |
struct drm_device *dev = radeon_encoder->base.dev; |
| 498 |
struct radeon_device *rdev = dev->dev_private; |
| 499 |
uint8_t backlight_level; |
| 500 |
|
| 501 |
backlight_level = (RREG32(RADEON_LVDS_GEN_CNTL) >> |
| 502 |
RADEON_LVDS_BL_MOD_LEVEL_SHIFT) & 0xff; |
| 503 |
|
| 504 |
return bd->pdata.negative ? RADEON_MAX_BL_LEVEL - backlight_level : backlight_level; |
| 505 |
} |
| 506 |
|
| 507 |
void radeon_legacy_backlight_init(struct radeon_encoder *radeon_encoder, |
| 487 |
struct drm_connector *drm_connector) |
508 |
struct drm_connector *drm_connector) |
| 488 |
{ |
509 |
{ |
|
|
510 |
struct drm_device *dev = radeon_encoder->base.dev; |
| 511 |
struct radeon_device *rdev = dev->dev_private; |
| 512 |
struct backlight_device *bd; |
| 513 |
uint8_t backlight_level; |
| 514 |
|
| 515 |
if (!radeon_encoder->enc_priv) |
| 516 |
return; |
| 517 |
|
| 518 |
#ifdef CONFIG_PMAC_BACKLIGHT |
| 519 |
if (!pmac_has_backlight_type("ati") && |
| 520 |
!pmac_has_backlight_type("mnca")) |
| 521 |
return; |
| 522 |
#endif |
| 523 |
|
| 524 |
bd = malloc(sizeof(struct backlight_device), DRM_MEM_DRIVER, M_WAITOK); |
| 525 |
if (!bd) { |
| 526 |
DRM_ERROR("Memory allocation failed\n"); |
| 527 |
return; |
| 528 |
} |
| 529 |
bd->pdata.encoder = radeon_encoder; |
| 530 |
|
| 531 |
backlight_level = (RREG32(RADEON_LVDS_GEN_CNTL) >> |
| 532 |
RADEON_LVDS_BL_MOD_LEVEL_SHIFT) & 0xff; |
| 533 |
|
| 534 |
/* First, try to detect backlight level sense based on the assumption |
| 535 |
* that firmware set it up at full brightness |
| 536 |
*/ |
| 537 |
if (backlight_level == 0) |
| 538 |
bd->pdata.negative = true; |
| 539 |
else if (backlight_level == 0xff) |
| 540 |
bd->pdata.negative = false; |
| 541 |
else { |
| 542 |
/* XXX hack... maybe some day we can figure out in what direction |
| 543 |
* backlight should work on a given panel? |
| 544 |
*/ |
| 545 |
bd->pdata.negative = (rdev->family != CHIP_RV200 && |
| 546 |
rdev->family != CHIP_RV250 && |
| 547 |
rdev->family != CHIP_RV280 && |
| 548 |
rdev->family != CHIP_RV350); |
| 549 |
|
| 550 |
#ifdef CONFIG_PMAC_BACKLIGHT |
| 551 |
bd->pdata.negative = (bd->pdata.negative || |
| 552 |
of_machine_is_compatible("PowerBook4,3") || |
| 553 |
of_machine_is_compatible("PowerBook6,3") || |
| 554 |
of_machine_is_compatible("PowerBook6,5")); |
| 555 |
#endif |
| 556 |
} |
| 557 |
|
| 558 |
if (rdev->is_atom_bios) { |
| 559 |
struct radeon_encoder_atom_dig *lvds = radeon_encoder->enc_priv; |
| 560 |
lvds->bl_dev = bd; |
| 561 |
} else { |
| 562 |
struct radeon_encoder_lvds *lvds = radeon_encoder->enc_priv; |
| 563 |
lvds->bl_dev = bd; |
| 564 |
} |
| 565 |
|
| 566 |
bd->props.brightness = radeon_legacy_backlight_get_brightness(bd); |
| 567 |
|
| 568 |
DRM_INFO("radeon legacy LVDS backlight initialized\n"); |
| 569 |
return; |
| 489 |
} |
570 |
} |
| 490 |
|
571 |
|
| 491 |
static void radeon_legacy_backlight_exit(struct radeon_encoder *encoder) |
572 |
static void radeon_legacy_backlight_exit(struct radeon_encoder *radeon_encoder) |
| 492 |
{ |
573 |
{ |
|
|
574 |
struct drm_device *dev = radeon_encoder->base.dev; |
| 575 |
struct radeon_device *rdev = dev->dev_private; |
| 576 |
struct backlight_device *bd = NULL; |
| 577 |
|
| 578 |
if (!radeon_encoder->enc_priv) |
| 579 |
return; |
| 580 |
|
| 581 |
if (rdev->is_atom_bios) { |
| 582 |
struct radeon_encoder_atom_dig *lvds = radeon_encoder->enc_priv; |
| 583 |
bd = lvds->bl_dev; |
| 584 |
lvds->bl_dev = NULL; |
| 585 |
} else { |
| 586 |
struct radeon_encoder_lvds *lvds = radeon_encoder->enc_priv; |
| 587 |
bd = lvds->bl_dev; |
| 588 |
lvds->bl_dev = NULL; |
| 589 |
} |
| 590 |
|
| 591 |
if (bd) { |
| 592 |
free(bd, DRM_MEM_DRIVER); |
| 593 |
DRM_INFO("radeon legacy LVDS backlight unloaded\n"); |
| 594 |
} |
| 493 |
} |
595 |
} |
| 494 |
|
596 |
|
| 495 |
#endif |
597 |
#endif |