23,11 → 23,15 |
* Authors: Dave Airlie |
* Alex Deucher |
*/ |
#include "drmP.h" |
#include "drm_crtc_helper.h" |
#include "radeon_drm.h" |
#include <drm/drmP.h> |
#include <drm/drm_crtc_helper.h> |
#include <drm/radeon_drm.h> |
#include "radeon.h" |
#include "atom.h" |
#include <linux/backlight.h> |
#ifdef CONFIG_PMAC_BACKLIGHT |
#include <asm/backlight.h> |
#endif |
|
static void radeon_legacy_encoder_disable(struct drm_encoder *encoder) |
{ |
84,7 → 88,7 |
lvds_pll_cntl = RREG32(RADEON_LVDS_PLL_CNTL); |
lvds_pll_cntl |= RADEON_LVDS_PLL_EN; |
WREG32(RADEON_LVDS_PLL_CNTL, lvds_pll_cntl); |
udelay(1000); |
mdelay(1); |
|
lvds_pll_cntl = RREG32(RADEON_LVDS_PLL_CNTL); |
lvds_pll_cntl &= ~RADEON_LVDS_PLL_RESET; |
97,7 → 101,7 |
(backlight_level << RADEON_LVDS_BL_MOD_LEVEL_SHIFT)); |
if (is_mac) |
lvds_gen_cntl |= RADEON_LVDS_BL_MOD_EN; |
udelay(panel_pwr_delay * 1000); |
mdelay(panel_pwr_delay); |
WREG32(RADEON_LVDS_GEN_CNTL, lvds_gen_cntl); |
break; |
case DRM_MODE_DPMS_STANDBY: |
114,10 → 118,10 |
WREG32(RADEON_LVDS_GEN_CNTL, lvds_gen_cntl); |
lvds_gen_cntl &= ~(RADEON_LVDS_ON | RADEON_LVDS_BLON | RADEON_LVDS_EN | RADEON_LVDS_DIGON); |
} |
udelay(panel_pwr_delay * 1000); |
mdelay(panel_pwr_delay); |
WREG32(RADEON_LVDS_GEN_CNTL, lvds_gen_cntl); |
WREG32_PLL(RADEON_PIXCLKS_CNTL, pixclks_cntl); |
udelay(panel_pwr_delay * 1000); |
mdelay(panel_pwr_delay); |
break; |
} |
|
240,7 → 244,7 |
} |
|
static bool radeon_legacy_mode_fixup(struct drm_encoder *encoder, |
struct drm_display_mode *mode, |
const struct drm_display_mode *mode, |
struct drm_display_mode *adjusted_mode) |
{ |
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
265,15 → 269,49 |
.disable = radeon_legacy_encoder_disable, |
}; |
|
#if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) || defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE) |
u8 |
radeon_legacy_get_backlight_level(struct radeon_encoder *radeon_encoder) |
{ |
struct drm_device *dev = radeon_encoder->base.dev; |
struct radeon_device *rdev = dev->dev_private; |
u8 backlight_level; |
|
#define MAX_RADEON_LEVEL 0xFF |
backlight_level = (RREG32(RADEON_LVDS_GEN_CNTL) >> |
RADEON_LVDS_BL_MOD_LEVEL_SHIFT) & 0xff; |
|
struct radeon_backlight_privdata { |
struct radeon_encoder *encoder; |
uint8_t negative; |
}; |
return backlight_level; |
} |
|
void |
radeon_legacy_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level) |
{ |
struct drm_device *dev = radeon_encoder->base.dev; |
struct radeon_device *rdev = dev->dev_private; |
int dpms_mode = DRM_MODE_DPMS_ON; |
|
if (radeon_encoder->enc_priv) { |
if (rdev->is_atom_bios) { |
struct radeon_encoder_atom_dig *lvds = radeon_encoder->enc_priv; |
if (lvds->backlight_level > 0) |
dpms_mode = lvds->dpms_mode; |
else |
dpms_mode = DRM_MODE_DPMS_OFF; |
lvds->backlight_level = level; |
} else { |
struct radeon_encoder_lvds *lvds = radeon_encoder->enc_priv; |
if (lvds->backlight_level > 0) |
dpms_mode = lvds->dpms_mode; |
else |
dpms_mode = DRM_MODE_DPMS_OFF; |
lvds->backlight_level = level; |
} |
} |
|
radeon_legacy_lvds_update(&radeon_encoder->base, dpms_mode); |
} |
|
#if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) || defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE) |
|
static uint8_t radeon_legacy_lvds_level(struct backlight_device *bd) |
{ |
struct radeon_backlight_privdata *pdata = bl_get_data(bd); |
282,13 → 320,13 |
/* Convert brightness to hardware level */ |
if (bd->props.brightness < 0) |
level = 0; |
else if (bd->props.brightness > MAX_RADEON_LEVEL) |
level = MAX_RADEON_LEVEL; |
else if (bd->props.brightness > RADEON_MAX_BL_LEVEL) |
level = RADEON_MAX_BL_LEVEL; |
else |
level = bd->props.brightness; |
|
if (pdata->negative) |
level = MAX_RADEON_LEVEL - level; |
level = RADEON_MAX_BL_LEVEL - level; |
|
return level; |
} |
297,27 → 335,10 |
{ |
struct radeon_backlight_privdata *pdata = bl_get_data(bd); |
struct radeon_encoder *radeon_encoder = pdata->encoder; |
struct drm_device *dev = radeon_encoder->base.dev; |
struct radeon_device *rdev = dev->dev_private; |
int dpms_mode = DRM_MODE_DPMS_ON; |
|
if (radeon_encoder->enc_priv) { |
if (rdev->is_atom_bios) { |
struct radeon_encoder_atom_dig *lvds = radeon_encoder->enc_priv; |
dpms_mode = lvds->dpms_mode; |
lvds->backlight_level = radeon_legacy_lvds_level(bd); |
} else { |
struct radeon_encoder_lvds *lvds = radeon_encoder->enc_priv; |
dpms_mode = lvds->dpms_mode; |
lvds->backlight_level = radeon_legacy_lvds_level(bd); |
} |
} |
radeon_legacy_set_backlight_level(radeon_encoder, |
radeon_legacy_lvds_level(bd)); |
|
if (bd->props.brightness > 0) |
radeon_legacy_lvds_update(&radeon_encoder->base, dpms_mode); |
else |
radeon_legacy_lvds_update(&radeon_encoder->base, DRM_MODE_DPMS_OFF); |
|
return 0; |
} |
|
332,7 → 353,7 |
backlight_level = (RREG32(RADEON_LVDS_GEN_CNTL) >> |
RADEON_LVDS_BL_MOD_LEVEL_SHIFT) & 0xff; |
|
return pdata->negative ? MAX_RADEON_LEVEL - backlight_level : backlight_level; |
return pdata->negative ? RADEON_MAX_BL_LEVEL - backlight_level : backlight_level; |
} |
|
static const struct backlight_ops radeon_backlight_ops = { |
349,6 → 370,7 |
struct backlight_properties props; |
struct radeon_backlight_privdata *pdata; |
uint8_t backlight_level; |
char bl_name[16]; |
|
if (!radeon_encoder->enc_priv) |
return; |
365,9 → 387,12 |
goto error; |
} |
|
props.max_brightness = MAX_RADEON_LEVEL; |
memset(&props, 0, sizeof(props)); |
props.max_brightness = RADEON_MAX_BL_LEVEL; |
props.type = BACKLIGHT_RAW; |
bd = backlight_device_register("radeon_bl", &drm_connector->kdev, |
snprintf(bl_name, sizeof(bl_name), |
"radeon_bl%d", dev->primary->index); |
bd = backlight_device_register(bl_name, &drm_connector->kdev, |
pdata, &radeon_backlight_ops, &props); |
if (IS_ERR(bd)) { |
DRM_ERROR("Backlight registration failed\n"); |
444,7 → 469,7 |
} |
|
if (bd) { |
struct radeon_legacy_backlight_privdata *pdata; |
struct radeon_backlight_privdata *pdata; |
|
pdata = bl_get_data(bd); |
backlight_device_unregister(bd); |
652,7 → 677,7 |
|
WREG32(RADEON_DAC_MACRO_CNTL, tmp); |
|
udelay(2000); |
mdelay(2); |
|
if (RREG32(RADEON_DAC_CNTL) & RADEON_DAC_CMP_OUTPUT) |
found = connector_status_connected; |
969,11 → 994,7 |
static void radeon_ext_tmds_enc_destroy(struct drm_encoder *encoder) |
{ |
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
struct radeon_encoder_ext_tmds *tmds = radeon_encoder->enc_priv; |
if (tmds) { |
if (tmds->i2c_bus) |
radeon_i2c_destroy(tmds->i2c_bus); |
} |
/* don't destroy the i2c bus record here, this will be done in radeon_i2c_fini */ |
kfree(radeon_encoder->enc_priv); |
drm_encoder_cleanup(encoder); |
kfree(radeon_encoder); |
1495,7 → 1516,7 |
tmp = dac_cntl2 | RADEON_DAC2_DAC2_CLK_SEL | RADEON_DAC2_CMP_EN; |
WREG32(RADEON_DAC_CNTL2, tmp); |
|
udelay(10000); |
mdelay(10); |
|
if (ASIC_IS_R300(rdev)) { |
if (RREG32(RADEON_DAC_CNTL2) & RADEON_DAC2_CMP_OUT_B) |