Subversion Repositories Kolibri OS

Rev

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)) {