diff options
Diffstat (limited to 'drivers/gpu/drm/drm_client.c')
| -rw-r--r-- | drivers/gpu/drm/drm_client.c | 21 | 
1 files changed, 21 insertions, 0 deletions
| diff --git a/drivers/gpu/drm/drm_client.c b/drivers/gpu/drm/drm_client.c index f6292ba0e6fc..037e36f2049c 100644 --- a/drivers/gpu/drm/drm_client.c +++ b/drivers/gpu/drm/drm_client.c @@ -122,13 +122,34 @@ EXPORT_SYMBOL(drm_client_init);   * drm_client_register() it is no longer permissible to call drm_client_release()   * directly (outside the unregister callback), instead cleanup will happen   * automatically on driver unload. + * + * Registering a client generates a hotplug event that allows the client + * to set up its display from pre-existing outputs. The client must have + * initialized its state to able to handle the hotplug event successfully.   */  void drm_client_register(struct drm_client_dev *client)  {  	struct drm_device *dev = client->dev; +	int ret;  	mutex_lock(&dev->clientlist_mutex);  	list_add(&client->list, &dev->clientlist); + +	if (client->funcs && client->funcs->hotplug) { +		/* +		 * Perform an initial hotplug event to pick up the +		 * display configuration for the client. This step +		 * has to be performed *after* registering the client +		 * in the list of clients, or a concurrent hotplug +		 * event might be lost; leaving the display off. +		 * +		 * Hold the clientlist_mutex as for a regular hotplug +		 * event. +		 */ +		ret = client->funcs->hotplug(client); +		if (ret) +			drm_dbg_kms(dev, "client hotplug ret=%d\n", ret); +	}  	mutex_unlock(&dev->clientlist_mutex);  }  EXPORT_SYMBOL(drm_client_register); |