This patch enables support for DPCD backlight control for DP connectors. The VESA spec defines DPCD backlight control only for eDP but some add-on cards like the Chrontel CH7511B DP-LVDS cards have the display control DPCD registers enabled. This patch registers a backlight device exposed via sysfs that controls the connected panel backlight by writing to DPCD registers on the CH7511B add-on card Signed-off-by: Yetunde Adebisi <yetundex.adebisi@xxxxxxxxx> --- drivers/gpu/drm/i915/intel_dp.c | 25 ++++++++++++++++++++ drivers/gpu/drm/i915/intel_dp_aux_backlight.c | 7 ++++++ drivers/gpu/drm/i915/intel_drv.h | 2 ++ drivers/gpu/drm/i915/intel_panel.c | 33 +++++++++++++++++++-------- 4 files changed, 57 insertions(+), 10 deletions(-) diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 9e9e7f1..8bbfb7f 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c @@ -5631,6 +5631,30 @@ intel_dp_drrs_init(struct intel_connector *intel_connector, return downclock_mode; } +/* + * Called on DP connector initialization to check for aux backlight control + * capability on the sink device and if present, initialize it. + */ +static void intel_dp_init_aux_backlight(struct intel_dp *intel_dp, + struct drm_connector *connector) +{ + struct intel_connector *intel_connector = to_intel_connector(connector); + + if (is_edp(intel_dp)) + return; + + if (i915.enable_dpcd_backlight && + (intel_dp_dpcd_read_wake(&intel_dp->aux, DP_EDP_DPCD_REV, + intel_dp->edp_dpcd, sizeof(intel_dp->edp_dpcd)) == + sizeof(intel_dp->edp_dpcd)) && + intel_dp_aux_init_backlight_funcs(intel_connector) == 0) { + intel_panel_setup_backlight(connector, INVALID_PIPE); + + intel_connector->panel.backlight.power = intel_dp_aux_backlight_power; + intel_connector->panel.backlight.enabled = true; + } +} + static bool intel_edp_init_connector(struct intel_dp *intel_dp, struct intel_connector *intel_connector) { @@ -5868,6 +5892,7 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port, goto fail; } + intel_dp_init_aux_backlight(intel_dp, connector); intel_dp_add_properties(intel_dp, connector); /* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written diff --git a/drivers/gpu/drm/i915/intel_dp_aux_backlight.c b/drivers/gpu/drm/i915/intel_dp_aux_backlight.c index a5361d6..efa657f 100644 --- a/drivers/gpu/drm/i915/intel_dp_aux_backlight.c +++ b/drivers/gpu/drm/i915/intel_dp_aux_backlight.c @@ -168,3 +168,10 @@ int intel_dp_aux_init_backlight_funcs(struct intel_connector *intel_connector) return 0; } + +void intel_dp_aux_backlight_power(struct intel_connector *connector, + bool enable) +{ + set_aux_backlight_enable(enc_to_intel_dp(&connector->encoder->base), + enable); +} diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 782a103..ab92e89 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h @@ -1324,6 +1324,8 @@ ssize_t intel_dp_dpcd_read_wake(struct drm_dp_aux *aux, unsigned int offset, /* intel_dp_aux_backlight.c */ int intel_dp_aux_init_backlight_funcs(struct intel_connector *intel_connector); +void intel_dp_aux_backlight_power(struct intel_connector *connector, + bool enable); /* intel_dp_mst.c */ int intel_dp_mst_encoder_init(struct intel_digital_port *intel_dig_port, int conn_id); diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c index cdfcdad..d678e55 100644 --- a/drivers/gpu/drm/i915/intel_panel.c +++ b/drivers/gpu/drm/i915/intel_panel.c @@ -1193,16 +1193,29 @@ static int intel_backlight_device_register(struct intel_connector *connector) else props.power = FB_BLANK_POWERDOWN; - /* - * Note: using the same name independent of the connector prevents - * registration of multiple backlight devices in the driver. - */ - panel->backlight.device = - backlight_device_register("intel_backlight", - connector->base.kdev, - connector, - &intel_backlight_device_ops, &props); - + if (connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort) { + char *name = kasprintf(GFP_KERNEL, "intel_aux_backlight-%s", + connector->base.name); + if (!name) + return -ENOMEM; + + panel->backlight.device = + backlight_device_register(name, + connector->base.kdev, + connector, + &intel_backlight_device_ops, &props); + kfree(name); + } else { + /* + * Note: using the same name independent of the connector prevents + * registration of multiple backlight devices in the driver. + */ + panel->backlight.device = + backlight_device_register("intel_backlight", + connector->base.kdev, + connector, + &intel_backlight_device_ops, &props); + } if (IS_ERR(panel->backlight.device)) { DRM_ERROR("Failed to register backlight: %ld\n", PTR_ERR(panel->backlight.device)); -- 1.9.3 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx