drivers/gpu/drm/i915/display/intel_backlight.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/i915/display/intel_backlight.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/i915/display/intel_backlight.c
Extension
.c
Size
59384 bytes
Lines
1857
Domain
Driver Families
Bucket
drivers/gpu
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

intel_has_quirk(display, QUIRK_INVERT_BRIGHTNESS)) {
		return panel->backlight.pwm_level_max - val + panel->backlight.pwm_level_min;
	}

	return val;
}

void intel_backlight_set_pwm_level(const struct drm_connector_state *conn_state, u32 val)
{
	struct intel_connector *connector = to_intel_connector(conn_state->connector);
	struct intel_display *display = to_intel_display(connector);
	struct intel_panel *panel = &connector->panel;

	drm_dbg_kms(display->drm, "[CONNECTOR:%d:%s] set backlight PWM = %d\n",
		    connector->base.base.id, connector->base.name, val);
	panel->backlight.pwm_funcs->set(conn_state, val);
}

u32 intel_backlight_level_to_pwm(struct intel_connector *connector, u32 val)
{
	struct intel_display *display = to_intel_display(connector);
	struct intel_panel *panel = &connector->panel;

	drm_WARN_ON_ONCE(display->drm,
			 panel->backlight.max == 0 || panel->backlight.pwm_level_max == 0);

	val = scale(val, panel->backlight.min, panel->backlight.max,
		    panel->backlight.pwm_level_min, panel->backlight.pwm_level_max);

	return intel_backlight_invert_pwm_level(connector, val);
}

u32 intel_backlight_level_from_pwm(struct intel_connector *connector, u32 val)
{
	struct intel_display *display = to_intel_display(connector);
	struct intel_panel *panel = &connector->panel;

	drm_WARN_ON_ONCE(display->drm,
			 panel->backlight.max == 0 || panel->backlight.pwm_level_max == 0);

	if (display->params.invert_brightness > 0 ||
	    (display->params.invert_brightness == 0 &&
	     intel_has_quirk(display, QUIRK_INVERT_BRIGHTNESS)))
		val = panel->backlight.pwm_level_max - (val - panel->backlight.pwm_level_min);

	return scale(val, panel->backlight.pwm_level_min, panel->backlight.pwm_level_max,
		     panel->backlight.min, panel->backlight.max);
}

static u32 lpt_get_backlight(struct intel_connector *connector, enum pipe unused)
{
	struct intel_display *display = to_intel_display(connector);

	return intel_de_read(display, BLC_PWM_PCH_CTL2) & BACKLIGHT_DUTY_CYCLE_MASK;
}

static u32 pch_get_backlight(struct intel_connector *connector, enum pipe unused)
{
	struct intel_display *display = to_intel_display(connector);

	return intel_de_read(display, BLC_PWM_CPU_CTL) & BACKLIGHT_DUTY_CYCLE_MASK;
}

static u32 i9xx_get_backlight(struct intel_connector *connector, enum pipe unused)
{
	struct intel_display *display = to_intel_display(connector);
	struct intel_panel *panel = &connector->panel;
	u32 val;

	val = intel_de_read(display, BLC_PWM_CTL) & BACKLIGHT_DUTY_CYCLE_MASK;
	if (DISPLAY_VER(display) < 4)
		val >>= 1;

	if (panel->backlight.combination_mode) {
		struct pci_dev *pdev = to_pci_dev(display->drm->dev);
		u8 lbpc;

		pci_read_config_byte(pdev, LBPC, &lbpc);
		val *= lbpc;
	}

	return val;
}

static u32 vlv_get_backlight(struct intel_connector *connector, enum pipe pipe)
{
	struct intel_display *display = to_intel_display(connector);

	if (drm_WARN_ON(display->drm, pipe != PIPE_A && pipe != PIPE_B))
		return 0;

Annotation

Implementation Notes