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.
- 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.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/backlight.hlinux/kernel.hlinux/pwm.hlinux/string_helpers.hacpi/video.hdrm/drm_file.hdrm/drm_print.hdrm/intel/pci_config.hintel_backlight.hintel_backlight_regs.hintel_connector.hintel_de.hintel_display_regs.hintel_display_rpm.hintel_display_types.hintel_display_utils.hintel_dp_aux_backlight.hintel_dsi_dcs_backlight.hintel_panel.hintel_pps.hintel_quirks.h
Detected Declarations
function scalefunction clamp_user_to_hwfunction scale_hw_to_userfunction intel_backlight_invert_pwm_levelfunction intel_backlight_set_pwm_levelfunction intel_backlight_level_to_pwmfunction intel_backlight_level_from_pwmfunction lpt_get_backlightfunction pch_get_backlightfunction i9xx_get_backlightfunction vlv_get_backlightfunction bxt_get_backlightfunction ext_pwm_get_backlightfunction lpt_set_backlightfunction pch_set_backlightfunction i9xx_set_backlightfunction vlv_set_backlightfunction bxt_set_backlightfunction ext_pwm_set_backlightfunction intel_panel_actually_set_backlightfunction intel_backlight_set_acpifunction lpt_disable_backlightfunction pch_disable_backlightfunction i9xx_disable_backlightfunction i965_disable_backlightfunction vlv_disable_backlightfunction bxt_disable_backlightfunction cnp_disable_backlightfunction ext_pwm_disable_backlightfunction intel_backlight_disablefunction lpt_enable_backlightfunction pch_enable_backlightfunction i9xx_enable_backlightfunction i965_enable_backlightfunction vlv_enable_backlightfunction bxt_enable_backlightfunction cnp_enable_backlightfunction ext_pwm_enable_backlightfunction __intel_backlight_enablefunction intel_backlight_enablefunction intel_panel_get_backlightfunction scale_user_to_hwfunction intel_panel_set_backlightfunction intel_backlight_device_update_statusfunction intel_backlight_device_get_brightnessfunction with_intel_display_rpmfunction intel_backlight_device_registerfunction intel_backlight_device_unregister
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
- Immediate include surface: `linux/backlight.h`, `linux/kernel.h`, `linux/pwm.h`, `linux/string_helpers.h`, `acpi/video.h`, `drm/drm_file.h`, `drm/drm_print.h`, `drm/intel/pci_config.h`.
- Detected declarations: `function scale`, `function clamp_user_to_hw`, `function scale_hw_to_user`, `function intel_backlight_invert_pwm_level`, `function intel_backlight_set_pwm_level`, `function intel_backlight_level_to_pwm`, `function intel_backlight_level_from_pwm`, `function lpt_get_backlight`, `function pch_get_backlight`, `function i9xx_get_backlight`.
- Atlas domain: Driver Families / drivers/gpu.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.