Rev 1963 | Rev 3120 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1963 | Rev 2997 | ||
---|---|---|---|
Line 21... | Line 21... | ||
21 | * OTHER DEALINGS IN THE SOFTWARE. |
21 | * OTHER DEALINGS IN THE SOFTWARE. |
22 | * |
22 | * |
23 | * Authors: Dave Airlie |
23 | * Authors: Dave Airlie |
24 | * Alex Deucher |
24 | * Alex Deucher |
25 | */ |
25 | */ |
26 | #include "drmP.h" |
26 | #include |
27 | #include "drm_crtc_helper.h" |
27 | #include |
28 | #include "radeon_drm.h" |
28 | #include |
29 | #include "radeon.h" |
29 | #include "radeon.h" |
30 | #include "atom.h" |
30 | #include "atom.h" |
- | 31 | #include |
|
- | 32 | #ifdef CONFIG_PMAC_BACKLIGHT |
|
- | 33 | #include |
|
- | 34 | #endif |
|
Line 31... | Line 35... | ||
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 | { |
34 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
38 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
Line 82... | Line 86... | ||
82 | disp_pwr_man |= RADEON_AUTO_PWRUP_EN; |
86 | disp_pwr_man |= RADEON_AUTO_PWRUP_EN; |
83 | WREG32(RADEON_DISP_PWR_MAN, disp_pwr_man); |
87 | WREG32(RADEON_DISP_PWR_MAN, disp_pwr_man); |
84 | lvds_pll_cntl = RREG32(RADEON_LVDS_PLL_CNTL); |
88 | lvds_pll_cntl = RREG32(RADEON_LVDS_PLL_CNTL); |
85 | lvds_pll_cntl |= RADEON_LVDS_PLL_EN; |
89 | lvds_pll_cntl |= RADEON_LVDS_PLL_EN; |
86 | WREG32(RADEON_LVDS_PLL_CNTL, lvds_pll_cntl); |
90 | WREG32(RADEON_LVDS_PLL_CNTL, lvds_pll_cntl); |
87 | udelay(1000); |
91 | mdelay(1); |
Line 88... | Line 92... | ||
88 | 92 | ||
89 | lvds_pll_cntl = RREG32(RADEON_LVDS_PLL_CNTL); |
93 | lvds_pll_cntl = RREG32(RADEON_LVDS_PLL_CNTL); |
90 | lvds_pll_cntl &= ~RADEON_LVDS_PLL_RESET; |
94 | lvds_pll_cntl &= ~RADEON_LVDS_PLL_RESET; |
Line 95... | Line 99... | ||
95 | lvds_gen_cntl |= (RADEON_LVDS_ON | RADEON_LVDS_EN | |
99 | lvds_gen_cntl |= (RADEON_LVDS_ON | RADEON_LVDS_EN | |
96 | RADEON_LVDS_DIGON | RADEON_LVDS_BLON | |
100 | RADEON_LVDS_DIGON | RADEON_LVDS_BLON | |
97 | (backlight_level << RADEON_LVDS_BL_MOD_LEVEL_SHIFT)); |
101 | (backlight_level << RADEON_LVDS_BL_MOD_LEVEL_SHIFT)); |
98 | if (is_mac) |
102 | if (is_mac) |
99 | lvds_gen_cntl |= RADEON_LVDS_BL_MOD_EN; |
103 | lvds_gen_cntl |= RADEON_LVDS_BL_MOD_EN; |
100 | udelay(panel_pwr_delay * 1000); |
104 | mdelay(panel_pwr_delay); |
101 | WREG32(RADEON_LVDS_GEN_CNTL, lvds_gen_cntl); |
105 | WREG32(RADEON_LVDS_GEN_CNTL, lvds_gen_cntl); |
102 | break; |
106 | break; |
103 | case DRM_MODE_DPMS_STANDBY: |
107 | case DRM_MODE_DPMS_STANDBY: |
104 | case DRM_MODE_DPMS_SUSPEND: |
108 | case DRM_MODE_DPMS_SUSPEND: |
105 | case DRM_MODE_DPMS_OFF: |
109 | case DRM_MODE_DPMS_OFF: |
Line 112... | Line 116... | ||
112 | lvds_gen_cntl &= ~(RADEON_LVDS_ON | RADEON_LVDS_EN); |
116 | lvds_gen_cntl &= ~(RADEON_LVDS_ON | RADEON_LVDS_EN); |
113 | } else { |
117 | } else { |
114 | WREG32(RADEON_LVDS_GEN_CNTL, lvds_gen_cntl); |
118 | WREG32(RADEON_LVDS_GEN_CNTL, lvds_gen_cntl); |
115 | lvds_gen_cntl &= ~(RADEON_LVDS_ON | RADEON_LVDS_BLON | RADEON_LVDS_EN | RADEON_LVDS_DIGON); |
119 | lvds_gen_cntl &= ~(RADEON_LVDS_ON | RADEON_LVDS_BLON | RADEON_LVDS_EN | RADEON_LVDS_DIGON); |
116 | } |
120 | } |
117 | udelay(panel_pwr_delay * 1000); |
121 | mdelay(panel_pwr_delay); |
118 | WREG32(RADEON_LVDS_GEN_CNTL, lvds_gen_cntl); |
122 | WREG32(RADEON_LVDS_GEN_CNTL, lvds_gen_cntl); |
119 | WREG32_PLL(RADEON_PIXCLKS_CNTL, pixclks_cntl); |
123 | WREG32_PLL(RADEON_PIXCLKS_CNTL, pixclks_cntl); |
120 | udelay(panel_pwr_delay * 1000); |
124 | mdelay(panel_pwr_delay); |
121 | break; |
125 | break; |
122 | } |
126 | } |
Line 123... | Line 127... | ||
123 | 127 | ||
124 | if (rdev->is_atom_bios) |
128 | if (rdev->is_atom_bios) |
Line 238... | Line 242... | ||
238 | else |
242 | else |
239 | radeon_combios_encoder_crtc_scratch_regs(encoder, radeon_crtc->crtc_id); |
243 | radeon_combios_encoder_crtc_scratch_regs(encoder, radeon_crtc->crtc_id); |
240 | } |
244 | } |
Line 241... | Line 245... | ||
241 | 245 | ||
242 | static bool radeon_legacy_mode_fixup(struct drm_encoder *encoder, |
246 | static bool radeon_legacy_mode_fixup(struct drm_encoder *encoder, |
243 | struct drm_display_mode *mode, |
247 | const struct drm_display_mode *mode, |
244 | struct drm_display_mode *adjusted_mode) |
248 | struct drm_display_mode *adjusted_mode) |
245 | { |
249 | { |
Line 246... | Line 250... | ||
246 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
250 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
Line 263... | Line 267... | ||
263 | .mode_set = radeon_legacy_lvds_mode_set, |
267 | .mode_set = radeon_legacy_lvds_mode_set, |
264 | .commit = radeon_legacy_lvds_commit, |
268 | .commit = radeon_legacy_lvds_commit, |
265 | .disable = radeon_legacy_encoder_disable, |
269 | .disable = radeon_legacy_encoder_disable, |
266 | }; |
270 | }; |
Line -... | Line 271... | ||
- | 271 | ||
267 | 272 | u8 |
|
- | 273 | radeon_legacy_get_backlight_level(struct radeon_encoder *radeon_encoder) |
|
- | 274 | { |
|
- | 275 | struct drm_device *dev = radeon_encoder->base.dev; |
|
- | 276 | struct radeon_device *rdev = dev->dev_private; |
|
Line -... | Line 277... | ||
- | 277 | u8 backlight_level; |
|
268 | #if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) || defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE) |
278 | |
Line 269... | Line 279... | ||
269 | 279 | backlight_level = (RREG32(RADEON_LVDS_GEN_CNTL) >> |
|
- | 280 | RADEON_LVDS_BL_MOD_LEVEL_SHIFT) & 0xff; |
|
- | 281 | ||
- | 282 | return backlight_level; |
|
- | 283 | } |
|
- | 284 | ||
- | 285 | void |
|
- | 286 | radeon_legacy_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level) |
|
- | 287 | { |
|
- | 288 | struct drm_device *dev = radeon_encoder->base.dev; |
|
270 | #define MAX_RADEON_LEVEL 0xFF |
289 | struct radeon_device *rdev = dev->dev_private; |
271 | 290 | int dpms_mode = DRM_MODE_DPMS_ON; |
|
- | 291 | ||
- | 292 | if (radeon_encoder->enc_priv) { |
|
- | 293 | if (rdev->is_atom_bios) { |
|
- | 294 | struct radeon_encoder_atom_dig *lvds = radeon_encoder->enc_priv; |
|
- | 295 | if (lvds->backlight_level > 0) |
|
- | 296 | dpms_mode = lvds->dpms_mode; |
|
- | 297 | else |
|
- | 298 | dpms_mode = DRM_MODE_DPMS_OFF; |
|
- | 299 | lvds->backlight_level = level; |
|
- | 300 | } else { |
|
- | 301 | struct radeon_encoder_lvds *lvds = radeon_encoder->enc_priv; |
|
- | 302 | if (lvds->backlight_level > 0) |
|
- | 303 | dpms_mode = lvds->dpms_mode; |
|
- | 304 | else |
|
- | 305 | dpms_mode = DRM_MODE_DPMS_OFF; |
|
- | 306 | lvds->backlight_level = level; |
|
- | 307 | } |
|
272 | struct radeon_backlight_privdata { |
308 | } |
- | 309 | ||
- | 310 | radeon_legacy_lvds_update(&radeon_encoder->base, dpms_mode); |
|
Line 273... | Line 311... | ||
273 | struct radeon_encoder *encoder; |
311 | } |
274 | uint8_t negative; |
312 | |
275 | }; |
313 | #if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) || defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE) |
276 | 314 | ||
Line 277... | Line 315... | ||
277 | static uint8_t radeon_legacy_lvds_level(struct backlight_device *bd) |
315 | static uint8_t radeon_legacy_lvds_level(struct backlight_device *bd) |
278 | { |
316 | { |
279 | struct radeon_backlight_privdata *pdata = bl_get_data(bd); |
317 | struct radeon_backlight_privdata *pdata = bl_get_data(bd); |
280 | uint8_t level; |
318 | uint8_t level; |
281 | 319 | ||
282 | /* Convert brightness to hardware level */ |
320 | /* Convert brightness to hardware level */ |
283 | if (bd->props.brightness < 0) |
321 | if (bd->props.brightness < 0) |
Line 284... | Line 322... | ||
284 | level = 0; |
322 | level = 0; |
285 | else if (bd->props.brightness > MAX_RADEON_LEVEL) |
323 | else if (bd->props.brightness > RADEON_MAX_BL_LEVEL) |
Line 286... | Line 324... | ||
286 | level = MAX_RADEON_LEVEL; |
324 | level = RADEON_MAX_BL_LEVEL; |
287 | else |
325 | else |
Line 288... | Line 326... | ||
288 | level = bd->props.brightness; |
326 | level = bd->props.brightness; |
289 | 327 | ||
290 | if (pdata->negative) |
328 | if (pdata->negative) |
291 | level = MAX_RADEON_LEVEL - level; |
329 | level = RADEON_MAX_BL_LEVEL - level; |
292 | - | ||
293 | return level; |
- | |
294 | } |
- | |
Line 295... | Line -... | ||
295 | - | ||
296 | static int radeon_legacy_backlight_update_status(struct backlight_device *bd) |
- | |
297 | { |
- | |
298 | struct radeon_backlight_privdata *pdata = bl_get_data(bd); |
- | |
299 | struct radeon_encoder *radeon_encoder = pdata->encoder; |
330 | |
300 | struct drm_device *dev = radeon_encoder->base.dev; |
- | |
301 | struct radeon_device *rdev = dev->dev_private; |
- | |
302 | int dpms_mode = DRM_MODE_DPMS_ON; |
- | |
303 | 331 | return level; |
|
304 | if (radeon_encoder->enc_priv) { |
- | |
305 | if (rdev->is_atom_bios) { |
- | |
306 | struct radeon_encoder_atom_dig *lvds = radeon_encoder->enc_priv; |
- | |
307 | dpms_mode = lvds->dpms_mode; |
- | |
308 | lvds->backlight_level = radeon_legacy_lvds_level(bd); |
- | |
309 | } else { |
- | |
310 | struct radeon_encoder_lvds *lvds = radeon_encoder->enc_priv; |
- | |
Line 311... | Line 332... | ||
311 | dpms_mode = lvds->dpms_mode; |
332 | } |
312 | lvds->backlight_level = radeon_legacy_lvds_level(bd); |
333 | |
Line 313... | Line 334... | ||
313 | } |
334 | static int radeon_legacy_backlight_update_status(struct backlight_device *bd) |
Line 330... | Line 351... | ||
330 | uint8_t backlight_level; |
351 | uint8_t backlight_level; |
Line 331... | Line 352... | ||
331 | 352 | ||
332 | backlight_level = (RREG32(RADEON_LVDS_GEN_CNTL) >> |
353 | backlight_level = (RREG32(RADEON_LVDS_GEN_CNTL) >> |
Line 333... | Line 354... | ||
333 | RADEON_LVDS_BL_MOD_LEVEL_SHIFT) & 0xff; |
354 | RADEON_LVDS_BL_MOD_LEVEL_SHIFT) & 0xff; |
334 | 355 | ||
Line 335... | Line 356... | ||
335 | return pdata->negative ? MAX_RADEON_LEVEL - backlight_level : backlight_level; |
356 | return pdata->negative ? RADEON_MAX_BL_LEVEL - backlight_level : backlight_level; |
336 | } |
357 | } |
337 | 358 | ||
Line 347... | Line 368... | ||
347 | struct radeon_device *rdev = dev->dev_private; |
368 | struct radeon_device *rdev = dev->dev_private; |
348 | struct backlight_device *bd; |
369 | struct backlight_device *bd; |
349 | struct backlight_properties props; |
370 | struct backlight_properties props; |
350 | struct radeon_backlight_privdata *pdata; |
371 | struct radeon_backlight_privdata *pdata; |
351 | uint8_t backlight_level; |
372 | uint8_t backlight_level; |
- | 373 | char bl_name[16]; |
|
Line 352... | Line 374... | ||
352 | 374 | ||
353 | if (!radeon_encoder->enc_priv) |
375 | if (!radeon_encoder->enc_priv) |
Line 354... | Line 376... | ||
354 | return; |
376 | return; |
Line 363... | Line 385... | ||
363 | if (!pdata) { |
385 | if (!pdata) { |
364 | DRM_ERROR("Memory allocation failed\n"); |
386 | DRM_ERROR("Memory allocation failed\n"); |
365 | goto error; |
387 | goto error; |
366 | } |
388 | } |
Line -... | Line 389... | ||
- | 389 | ||
367 | 390 | memset(&props, 0, sizeof(props)); |
|
368 | props.max_brightness = MAX_RADEON_LEVEL; |
391 | props.max_brightness = RADEON_MAX_BL_LEVEL; |
- | 392 | props.type = BACKLIGHT_RAW; |
|
- | 393 | snprintf(bl_name, sizeof(bl_name), |
|
369 | props.type = BACKLIGHT_RAW; |
394 | "radeon_bl%d", dev->primary->index); |
370 | bd = backlight_device_register("radeon_bl", &drm_connector->kdev, |
395 | bd = backlight_device_register(bl_name, &drm_connector->kdev, |
371 | pdata, &radeon_backlight_ops, &props); |
396 | pdata, &radeon_backlight_ops, &props); |
372 | if (IS_ERR(bd)) { |
397 | if (IS_ERR(bd)) { |
373 | DRM_ERROR("Backlight registration failed\n"); |
398 | DRM_ERROR("Backlight registration failed\n"); |
374 | goto error; |
399 | goto error; |
Line 442... | Line 467... | ||
442 | bd = lvds->bl_dev; |
467 | bd = lvds->bl_dev; |
443 | lvds->bl_dev = NULL; |
468 | lvds->bl_dev = NULL; |
444 | } |
469 | } |
Line 445... | Line 470... | ||
445 | 470 | ||
446 | if (bd) { |
471 | if (bd) { |
Line 447... | Line 472... | ||
447 | struct radeon_legacy_backlight_privdata *pdata; |
472 | struct radeon_backlight_privdata *pdata; |
448 | 473 | ||
449 | pdata = bl_get_data(bd); |
474 | pdata = bl_get_data(bd); |
Line 650... | Line 675... | ||
650 | RADEON_DAC_PDWN_G | |
675 | RADEON_DAC_PDWN_G | |
651 | RADEON_DAC_PDWN_B); |
676 | RADEON_DAC_PDWN_B); |
Line 652... | Line 677... | ||
652 | 677 | ||
Line 653... | Line 678... | ||
653 | WREG32(RADEON_DAC_MACRO_CNTL, tmp); |
678 | WREG32(RADEON_DAC_MACRO_CNTL, tmp); |
Line 654... | Line 679... | ||
654 | 679 | ||
655 | udelay(2000); |
680 | mdelay(2); |
Line 656... | Line 681... | ||
656 | 681 | ||
Line 967... | Line 992... | ||
967 | } |
992 | } |
Line 968... | Line 993... | ||
968 | 993 | ||
969 | static void radeon_ext_tmds_enc_destroy(struct drm_encoder *encoder) |
994 | static void radeon_ext_tmds_enc_destroy(struct drm_encoder *encoder) |
970 | { |
995 | { |
971 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
996 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
972 | struct radeon_encoder_ext_tmds *tmds = radeon_encoder->enc_priv; |
- | |
973 | if (tmds) { |
- | |
974 | if (tmds->i2c_bus) |
- | |
975 | radeon_i2c_destroy(tmds->i2c_bus); |
- | |
976 | } |
997 | /* don't destroy the i2c bus record here, this will be done in radeon_i2c_fini */ |
977 | kfree(radeon_encoder->enc_priv); |
998 | kfree(radeon_encoder->enc_priv); |
978 | drm_encoder_cleanup(encoder); |
999 | drm_encoder_cleanup(encoder); |
979 | kfree(radeon_encoder); |
1000 | kfree(radeon_encoder); |
Line 1493... | Line 1514... | ||
1493 | WREG32(RADEON_DAC_EXT_CNTL, tmp); |
1514 | WREG32(RADEON_DAC_EXT_CNTL, tmp); |
Line 1494... | Line 1515... | ||
1494 | 1515 | ||
1495 | tmp = dac_cntl2 | RADEON_DAC2_DAC2_CLK_SEL | RADEON_DAC2_CMP_EN; |
1516 | tmp = dac_cntl2 | RADEON_DAC2_DAC2_CLK_SEL | RADEON_DAC2_CMP_EN; |
Line 1496... | Line 1517... | ||
1496 | WREG32(RADEON_DAC_CNTL2, tmp); |
1517 | WREG32(RADEON_DAC_CNTL2, tmp); |
Line 1497... | Line 1518... | ||
1497 | 1518 | ||
1498 | udelay(10000); |
1519 | mdelay(10); |
1499 | 1520 | ||
1500 | if (ASIC_IS_R300(rdev)) { |
1521 | if (ASIC_IS_R300(rdev)) { |