diff options
Diffstat (limited to 'drivers/gpu/drm/i915/display/intel_panel.c')
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_panel.c | 57 | 
1 files changed, 41 insertions, 16 deletions
| diff --git a/drivers/gpu/drm/i915/display/intel_panel.c b/drivers/gpu/drm/i915/display/intel_panel.c index 551fcaa77c2c..7d7a60b4d2de 100644 --- a/drivers/gpu/drm/i915/display/intel_panel.c +++ b/drivers/gpu/drm/i915/display/intel_panel.c @@ -35,6 +35,7 @@  #include <linux/pwm.h>  #include "intel_connector.h" +#include "intel_de.h"  #include "intel_display_types.h"  #include "intel_dp_aux_backlight.h"  #include "intel_dsi_dcs_backlight.h" @@ -1372,6 +1373,9 @@ int intel_backlight_device_register(struct intel_connector *connector)  	struct drm_i915_private *i915 = to_i915(connector->base.dev);  	struct intel_panel *panel = &connector->panel;  	struct backlight_properties props; +	struct backlight_device *bd; +	const char *name; +	int ret = 0;  	if (WARN_ON(panel->backlight.device))  		return -ENODEV; @@ -1398,28 +1402,49 @@ int intel_backlight_device_register(struct intel_connector *connector)  	else  		props.power = FB_BLANK_POWERDOWN; +	name = kstrdup("intel_backlight", GFP_KERNEL); +	if (!name) +		return -ENOMEM; + +	bd = backlight_device_register(name, connector->base.kdev, connector, +				       &intel_backlight_device_ops, &props); +  	/* -	 * Note: using the same name independent of the connector prevents -	 * registration of multiple backlight devices in the driver. +	 * Using the same name independent of the drm device or connector +	 * prevents registration of multiple backlight devices in the +	 * driver. However, we need to use the default name for backward +	 * compatibility. Use unique names for subsequent backlight devices as a +	 * fallback when the default name already exists.  	 */ -	panel->backlight.device = -		backlight_device_register("intel_backlight", -					  connector->base.kdev, -					  connector, -					  &intel_backlight_device_ops, &props); - -	if (IS_ERR(panel->backlight.device)) { -		drm_err(&i915->drm, "Failed to register backlight: %ld\n", -			PTR_ERR(panel->backlight.device)); -		panel->backlight.device = NULL; -		return -ENODEV; +	if (IS_ERR(bd) && PTR_ERR(bd) == -EEXIST) { +		kfree(name); +		name = kasprintf(GFP_KERNEL, "card%d-%s-backlight", +				 i915->drm.primary->index, connector->base.name); +		if (!name) +			return -ENOMEM; + +		bd = backlight_device_register(name, connector->base.kdev, connector, +					       &intel_backlight_device_ops, &props);  	} +	if (IS_ERR(bd)) { +		drm_err(&i915->drm, +			"[CONNECTOR:%d:%s] backlight device %s register failed: %ld\n", +			connector->base.base.id, connector->base.name, name, PTR_ERR(bd)); +		ret = PTR_ERR(bd); +		goto out; +	} + +	panel->backlight.device = bd; +  	drm_dbg_kms(&i915->drm, -		    "Connector %s backlight sysfs interface registered\n", -		    connector->base.name); +		    "[CONNECTOR:%d:%s] backlight device %s registered\n", +		    connector->base.base.id, connector->base.name, name); -	return 0; +out: +	kfree(name); + +	return ret;  }  void intel_backlight_device_unregister(struct intel_connector *connector) | 
