View | Details | Raw Unified | Return to bug 207086 | Differences between
and this patch

Collapse All | Expand All

(-)b/sys/dev/drm2/radeon/atombios_encoders.c (-2 / +81 lines)
Lines 134-141 atombios_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level) Link Here
134
	}
134
	}
135
}
135
}
136
136
137
#if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) || defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE)
137
#if !defined(CONFIG_BACKLIGHT_CLASS_DEVICE) && !defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE)
138
struct backlight_device {
139
	struct backlight_properties {
140
		int brightness;
141
		int max_brightness;
142
	} props;
143
	struct radeon_backlight_privdata pdata;
144
};
145
#endif
138
146
147
#if defined(CONFIG_BACKLIGHT_CLASS_DEVICE)
139
static u8 radeon_atom_bl_level(struct backlight_device *bd)
148
static u8 radeon_atom_bl_level(struct backlight_device *bd)
140
{
149
{
141
	u8 level;
150
	u8 level;
Lines 268-280 static void radeon_atom_backlight_exit(struct radeon_encoder *radeon_encoder) Link Here
268
277
269
#else /* !CONFIG_BACKLIGHT_CLASS_DEVICE */
278
#else /* !CONFIG_BACKLIGHT_CLASS_DEVICE */
270
279
280
static int radeon_atom_backlight_get_brightness(struct backlight_device *bd)
281
{
282
	struct radeon_encoder *radeon_encoder = bd->pdata.encoder;
283
	struct drm_device *dev = radeon_encoder->base.dev;
284
	struct radeon_device *rdev = dev->dev_private;
285
286
	return radeon_atom_get_backlight_level_from_reg(rdev);
287
}
288
271
void radeon_atom_backlight_init(struct radeon_encoder *radeon_encoder,
289
void radeon_atom_backlight_init(struct radeon_encoder *radeon_encoder,
272
				struct drm_connector *drm_connector)
290
				struct drm_connector *drm_connector)
273
{
291
{
292
	struct drm_device *dev = radeon_encoder->base.dev;
293
	struct radeon_device *rdev = dev->dev_private;
294
	struct backlight_device *bd;
295
	struct radeon_encoder_atom_dig *dig;
296
	u8 backlight_level;
297
298
	if (!radeon_encoder->enc_priv) {
299
		return;
300
	}
301
302
	if (!rdev->is_atom_bios) {
303
		return;
304
	}
305
306
	if (!(rdev->mode_info.firmware_flags & ATOM_BIOS_INFO_BL_CONTROLLED_BY_GPU)) {
307
		return;
308
	}
309
310
	bd = malloc(sizeof(struct backlight_device), DRM_MEM_DRIVER, M_WAITOK);
311
	if (!bd) {
312
		DRM_ERROR("Backlight memory allocation failed (%zu bytes)\n", sizeof(struct backlight_device));
313
		return;
314
	}
315
316
	memset(&bd->props, 0, sizeof(bd->props));
317
	bd->props.max_brightness = RADEON_MAX_BL_LEVEL;
318
319
	bd->pdata.encoder = radeon_encoder;
320
321
	backlight_level = radeon_atom_get_backlight_level_from_reg(rdev);
322
323
	dig = radeon_encoder->enc_priv;
324
	dig->bl_dev = bd;
325
326
	bd->props.brightness = radeon_atom_backlight_get_brightness(bd);
327
328
	DRM_INFO("radeon atom DIG backlight initialized\n");
329
330
	return;
274
}
331
}
275
332
276
static void radeon_atom_backlight_exit(struct radeon_encoder *encoder)
333
static void radeon_atom_backlight_exit(struct radeon_encoder *radeon_encoder)
277
{
334
{
335
	struct drm_device *dev = radeon_encoder->base.dev;
336
	struct radeon_device *rdev = dev->dev_private;
337
	struct backlight_device *bd = NULL;
338
	struct radeon_encoder_atom_dig *dig;
339
340
	if (!radeon_encoder->enc_priv)
341
		return;
342
343
	if (!rdev->is_atom_bios)
344
		return;
345
346
	if (!(rdev->mode_info.firmware_flags & ATOM_BIOS_INFO_BL_CONTROLLED_BY_GPU))
347
		return;
348
349
	dig = radeon_encoder->enc_priv;
350
	bd = dig->bl_dev;
351
	dig->bl_dev = NULL;
352
353
	if (bd) {
354
		free(bd, DRM_MEM_DRIVER);
355
		DRM_INFO("radeon atom LVDS backlight unloaded\n");
356
	}
278
}
357
}
279
358
280
#endif
359
#endif
(-)b/sys/dev/drm2/radeon/radeon_legacy_encoders.c (-2 / +104 lines)
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
(-)b/sys/dev/drm2/radeon/radeon_mode.h (-4 lines)
Lines 259-273 struct radeon_mode_info { Link Here
259
259
260
#define RADEON_MAX_BL_LEVEL 0xFF
260
#define RADEON_MAX_BL_LEVEL 0xFF
261
261
262
#if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) || defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE)
263
264
struct radeon_backlight_privdata {
262
struct radeon_backlight_privdata {
265
	struct radeon_encoder *encoder;
263
	struct radeon_encoder *encoder;
266
	uint8_t negative;
264
	uint8_t negative;
267
};
265
};
268
266
269
#endif
270
271
#define MAX_H_CODE_TIMING_LEN 32
267
#define MAX_H_CODE_TIMING_LEN 32
272
#define MAX_V_CODE_TIMING_LEN 32
268
#define MAX_V_CODE_TIMING_LEN 32
273
269

Return to bug 207086