[PATCH 4/5] drm/imx: drop deprecated load/unload drm_driver ops

2016-06-24 Thread Ying Liu
On Fri, Jun 17, 2016 at 8:48 PM, Daniel Vetter  wrote:
> On Fri, Jun 17, 2016 at 12:13:41PM +0200, Lucas Stach wrote:
>> Drop the load/unload driver ops, as they are deprecated because of their
>> inherent races, with devices being visible to userspace before they are
>> fully initialized.
>>
>> Move this code into the driver bind/unbind routines bracketed by the
>> proper drm_dev_alloc/register and drm_dev_unregister/unref calls.
>>
>> Signed-off-by: Lucas Stach 
>> ---
>>  drivers/gpu/drm/imx/imx-drm-core.c | 247 
>> ++---
>>  1 file changed, 121 insertions(+), 126 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/imx/imx-drm-core.c 
>> b/drivers/gpu/drm/imx/imx-drm-core.c
>> index c63378661e11..799a68976590 100644
>> --- a/drivers/gpu/drm/imx/imx-drm-core.c
>> +++ b/drivers/gpu/drm/imx/imx-drm-core.c
>> @@ -78,25 +78,6 @@ static void imx_drm_driver_lastclose(struct drm_device 
>> *drm)
>>   }
>>  }
>>
>> -static int imx_drm_driver_unload(struct drm_device *drm)
>> -{
>> - struct imx_drm_device *imxdrm = drm->dev_private;
>> -
>> - drm_kms_helper_poll_fini(drm);
>> -
>> - if (imxdrm->fbhelper)
>> - drm_fbdev_cma_fini(imxdrm->fbhelper);
>> -
>> - component_unbind_all(drm->dev, drm);
>> -
>> - drm_vblank_cleanup(drm);
>> - drm_mode_config_cleanup(drm);
>> -
>> - platform_set_drvdata(drm->platformdev, NULL);
>> -
>> - return 0;
>> -}
>> -
>>  static struct imx_drm_crtc *imx_drm_find_crtc(struct drm_crtc *crtc)
>>  {
>>   struct imx_drm_device *imxdrm = crtc->dev->dev_private;
>> @@ -223,109 +204,6 @@ static const struct drm_mode_config_funcs 
>> imx_drm_mode_config_funcs = {
>>  };
>>
>>  /*
>> - * Main DRM initialisation. This binds, initialises and registers
>> - * with DRM the subcomponents of the driver.
>> - */
>> -static int imx_drm_driver_load(struct drm_device *drm, unsigned long flags)
>> -{
>> - struct imx_drm_device *imxdrm;
>> - struct drm_connector *connector;
>> - int ret;
>> -
>> - imxdrm = devm_kzalloc(drm->dev, sizeof(*imxdrm), GFP_KERNEL);
>> - if (!imxdrm)
>> - return -ENOMEM;
>> -
>> - imxdrm->drm = drm;
>> -
>> - drm->dev_private = imxdrm;
>> -
>> - /*
>> -  * enable drm irq mode.
>> -  * - with irq_enabled = true, we can use the vblank feature.
>> -  *
>> -  * P.S. note that we wouldn't use drm irq handler but
>> -  *  just specific driver own one instead because
>> -  *  drm framework supports only one irq handler and
>> -  *  drivers can well take care of their interrupts
>> -  */
>> - drm->irq_enabled = true;
>> -
>> - /*
>> -  * set max width and height as default value(4096x4096).
>> -  * this value would be used to check framebuffer size limitation
>> -  * at drm_mode_addfb().
>> -  */
>> - drm->mode_config.min_width = 64;
>> - drm->mode_config.min_height = 64;
>> - drm->mode_config.max_width = 4096;
>> - drm->mode_config.max_height = 4096;
>> - drm->mode_config.funcs = _drm_mode_config_funcs;
>> -
>> - drm_mode_config_init(drm);
>> -
>> - ret = drm_vblank_init(drm, MAX_CRTC);
>> - if (ret)
>> - goto err_kms;
>> -
>> - platform_set_drvdata(drm->platformdev, drm);
>> -
>> - /* Now try and bind all our sub-components */
>> - ret = component_bind_all(drm->dev, drm);
>> - if (ret)
>> - goto err_vblank;
>> -
>> - /*
>> -  * All components are now added, we can publish the connector sysfs
>> -  * entries to userspace.  This will generate hotplug events and so
>> -  * userspace will expect to be able to access DRM at this point.
>> -  */
>> - list_for_each_entry(connector, >mode_config.connector_list, head) 
>> {
>> - ret = drm_connector_register(connector);
>> - if (ret) {
>> - dev_err(drm->dev,
>> - "[CONNECTOR:%d:%s] drm_connector_register 
>> failed: %d\n",
>> - connector->base.id,
>> - connector->name, ret);
>> - goto err_unbind;
>> - }
>> - }
>> -
>> - /*
>> -  * All components are now initialised, so setup the fb helper.
>> -  * The fb helper takes copies of key hardware information, so the
>> -  * crtcs/connectors/encoders must not change after this point.
>> -  */
>> -#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION)
>> - if (legacyfb_depth != 16 && legacyfb_depth != 32) {
>> - dev_warn(drm->dev, "Invalid legacyfb_depth.  Defaulting to 
>> 16bpp\n");
>> - legacyfb_depth = 16;
>> - }
>> - drm_helper_disable_unused_functions(drm);
>> - imxdrm->fbhelper = drm_fbdev_cma_init(drm, legacyfb_depth,
>> - drm->mode_config.num_crtc, MAX_CRTC);
>> - if (IS_ERR(imxdrm->fbhelper)) {
>> - ret = PTR_ERR(imxdrm->fbhelper);
>> - 

[PATCH 4/5] drm/imx: drop deprecated load/unload drm_driver ops

2016-06-17 Thread Daniel Vetter
On Fri, Jun 17, 2016 at 12:13:41PM +0200, Lucas Stach wrote:
> Drop the load/unload driver ops, as they are deprecated because of their
> inherent races, with devices being visible to userspace before they are
> fully initialized.
> 
> Move this code into the driver bind/unbind routines bracketed by the
> proper drm_dev_alloc/register and drm_dev_unregister/unref calls.
> 
> Signed-off-by: Lucas Stach 
> ---
>  drivers/gpu/drm/imx/imx-drm-core.c | 247 
> ++---
>  1 file changed, 121 insertions(+), 126 deletions(-)
> 
> diff --git a/drivers/gpu/drm/imx/imx-drm-core.c 
> b/drivers/gpu/drm/imx/imx-drm-core.c
> index c63378661e11..799a68976590 100644
> --- a/drivers/gpu/drm/imx/imx-drm-core.c
> +++ b/drivers/gpu/drm/imx/imx-drm-core.c
> @@ -78,25 +78,6 @@ static void imx_drm_driver_lastclose(struct drm_device 
> *drm)
>   }
>  }
>  
> -static int imx_drm_driver_unload(struct drm_device *drm)
> -{
> - struct imx_drm_device *imxdrm = drm->dev_private;
> -
> - drm_kms_helper_poll_fini(drm);
> -
> - if (imxdrm->fbhelper)
> - drm_fbdev_cma_fini(imxdrm->fbhelper);
> -
> - component_unbind_all(drm->dev, drm);
> -
> - drm_vblank_cleanup(drm);
> - drm_mode_config_cleanup(drm);
> -
> - platform_set_drvdata(drm->platformdev, NULL);
> -
> - return 0;
> -}
> -
>  static struct imx_drm_crtc *imx_drm_find_crtc(struct drm_crtc *crtc)
>  {
>   struct imx_drm_device *imxdrm = crtc->dev->dev_private;
> @@ -223,109 +204,6 @@ static const struct drm_mode_config_funcs 
> imx_drm_mode_config_funcs = {
>  };
>  
>  /*
> - * Main DRM initialisation. This binds, initialises and registers
> - * with DRM the subcomponents of the driver.
> - */
> -static int imx_drm_driver_load(struct drm_device *drm, unsigned long flags)
> -{
> - struct imx_drm_device *imxdrm;
> - struct drm_connector *connector;
> - int ret;
> -
> - imxdrm = devm_kzalloc(drm->dev, sizeof(*imxdrm), GFP_KERNEL);
> - if (!imxdrm)
> - return -ENOMEM;
> -
> - imxdrm->drm = drm;
> -
> - drm->dev_private = imxdrm;
> -
> - /*
> -  * enable drm irq mode.
> -  * - with irq_enabled = true, we can use the vblank feature.
> -  *
> -  * P.S. note that we wouldn't use drm irq handler but
> -  *  just specific driver own one instead because
> -  *  drm framework supports only one irq handler and
> -  *  drivers can well take care of their interrupts
> -  */
> - drm->irq_enabled = true;
> -
> - /*
> -  * set max width and height as default value(4096x4096).
> -  * this value would be used to check framebuffer size limitation
> -  * at drm_mode_addfb().
> -  */
> - drm->mode_config.min_width = 64;
> - drm->mode_config.min_height = 64;
> - drm->mode_config.max_width = 4096;
> - drm->mode_config.max_height = 4096;
> - drm->mode_config.funcs = _drm_mode_config_funcs;
> -
> - drm_mode_config_init(drm);
> -
> - ret = drm_vblank_init(drm, MAX_CRTC);
> - if (ret)
> - goto err_kms;
> -
> - platform_set_drvdata(drm->platformdev, drm);
> -
> - /* Now try and bind all our sub-components */
> - ret = component_bind_all(drm->dev, drm);
> - if (ret)
> - goto err_vblank;
> -
> - /*
> -  * All components are now added, we can publish the connector sysfs
> -  * entries to userspace.  This will generate hotplug events and so
> -  * userspace will expect to be able to access DRM at this point.
> -  */
> - list_for_each_entry(connector, >mode_config.connector_list, head) {
> - ret = drm_connector_register(connector);
> - if (ret) {
> - dev_err(drm->dev,
> - "[CONNECTOR:%d:%s] drm_connector_register 
> failed: %d\n",
> - connector->base.id,
> - connector->name, ret);
> - goto err_unbind;
> - }
> - }
> -
> - /*
> -  * All components are now initialised, so setup the fb helper.
> -  * The fb helper takes copies of key hardware information, so the
> -  * crtcs/connectors/encoders must not change after this point.
> -  */
> -#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION)
> - if (legacyfb_depth != 16 && legacyfb_depth != 32) {
> - dev_warn(drm->dev, "Invalid legacyfb_depth.  Defaulting to 
> 16bpp\n");
> - legacyfb_depth = 16;
> - }
> - drm_helper_disable_unused_functions(drm);
> - imxdrm->fbhelper = drm_fbdev_cma_init(drm, legacyfb_depth,
> - drm->mode_config.num_crtc, MAX_CRTC);
> - if (IS_ERR(imxdrm->fbhelper)) {
> - ret = PTR_ERR(imxdrm->fbhelper);
> - imxdrm->fbhelper = NULL;
> - goto err_unbind;
> - }
> -#endif
> -
> - drm_kms_helper_poll_init(drm);
> -
> - return 0;
> -
> -err_unbind:
> - component_unbind_all(drm->dev, 

[PATCH 4/5] drm/imx: drop deprecated load/unload drm_driver ops

2016-06-17 Thread Lucas Stach
Drop the load/unload driver ops, as they are deprecated because of their
inherent races, with devices being visible to userspace before they are
fully initialized.

Move this code into the driver bind/unbind routines bracketed by the
proper drm_dev_alloc/register and drm_dev_unregister/unref calls.

Signed-off-by: Lucas Stach 
---
 drivers/gpu/drm/imx/imx-drm-core.c | 247 ++---
 1 file changed, 121 insertions(+), 126 deletions(-)

diff --git a/drivers/gpu/drm/imx/imx-drm-core.c 
b/drivers/gpu/drm/imx/imx-drm-core.c
index c63378661e11..799a68976590 100644
--- a/drivers/gpu/drm/imx/imx-drm-core.c
+++ b/drivers/gpu/drm/imx/imx-drm-core.c
@@ -78,25 +78,6 @@ static void imx_drm_driver_lastclose(struct drm_device *drm)
}
 }

-static int imx_drm_driver_unload(struct drm_device *drm)
-{
-   struct imx_drm_device *imxdrm = drm->dev_private;
-
-   drm_kms_helper_poll_fini(drm);
-
-   if (imxdrm->fbhelper)
-   drm_fbdev_cma_fini(imxdrm->fbhelper);
-
-   component_unbind_all(drm->dev, drm);
-
-   drm_vblank_cleanup(drm);
-   drm_mode_config_cleanup(drm);
-
-   platform_set_drvdata(drm->platformdev, NULL);
-
-   return 0;
-}
-
 static struct imx_drm_crtc *imx_drm_find_crtc(struct drm_crtc *crtc)
 {
struct imx_drm_device *imxdrm = crtc->dev->dev_private;
@@ -223,109 +204,6 @@ static const struct drm_mode_config_funcs 
imx_drm_mode_config_funcs = {
 };

 /*
- * Main DRM initialisation. This binds, initialises and registers
- * with DRM the subcomponents of the driver.
- */
-static int imx_drm_driver_load(struct drm_device *drm, unsigned long flags)
-{
-   struct imx_drm_device *imxdrm;
-   struct drm_connector *connector;
-   int ret;
-
-   imxdrm = devm_kzalloc(drm->dev, sizeof(*imxdrm), GFP_KERNEL);
-   if (!imxdrm)
-   return -ENOMEM;
-
-   imxdrm->drm = drm;
-
-   drm->dev_private = imxdrm;
-
-   /*
-* enable drm irq mode.
-* - with irq_enabled = true, we can use the vblank feature.
-*
-* P.S. note that we wouldn't use drm irq handler but
-*  just specific driver own one instead because
-*  drm framework supports only one irq handler and
-*  drivers can well take care of their interrupts
-*/
-   drm->irq_enabled = true;
-
-   /*
-* set max width and height as default value(4096x4096).
-* this value would be used to check framebuffer size limitation
-* at drm_mode_addfb().
-*/
-   drm->mode_config.min_width = 64;
-   drm->mode_config.min_height = 64;
-   drm->mode_config.max_width = 4096;
-   drm->mode_config.max_height = 4096;
-   drm->mode_config.funcs = _drm_mode_config_funcs;
-
-   drm_mode_config_init(drm);
-
-   ret = drm_vblank_init(drm, MAX_CRTC);
-   if (ret)
-   goto err_kms;
-
-   platform_set_drvdata(drm->platformdev, drm);
-
-   /* Now try and bind all our sub-components */
-   ret = component_bind_all(drm->dev, drm);
-   if (ret)
-   goto err_vblank;
-
-   /*
-* All components are now added, we can publish the connector sysfs
-* entries to userspace.  This will generate hotplug events and so
-* userspace will expect to be able to access DRM at this point.
-*/
-   list_for_each_entry(connector, >mode_config.connector_list, head) {
-   ret = drm_connector_register(connector);
-   if (ret) {
-   dev_err(drm->dev,
-   "[CONNECTOR:%d:%s] drm_connector_register 
failed: %d\n",
-   connector->base.id,
-   connector->name, ret);
-   goto err_unbind;
-   }
-   }
-
-   /*
-* All components are now initialised, so setup the fb helper.
-* The fb helper takes copies of key hardware information, so the
-* crtcs/connectors/encoders must not change after this point.
-*/
-#if IS_ENABLED(CONFIG_DRM_FBDEV_EMULATION)
-   if (legacyfb_depth != 16 && legacyfb_depth != 32) {
-   dev_warn(drm->dev, "Invalid legacyfb_depth.  Defaulting to 
16bpp\n");
-   legacyfb_depth = 16;
-   }
-   drm_helper_disable_unused_functions(drm);
-   imxdrm->fbhelper = drm_fbdev_cma_init(drm, legacyfb_depth,
-   drm->mode_config.num_crtc, MAX_CRTC);
-   if (IS_ERR(imxdrm->fbhelper)) {
-   ret = PTR_ERR(imxdrm->fbhelper);
-   imxdrm->fbhelper = NULL;
-   goto err_unbind;
-   }
-#endif
-
-   drm_kms_helper_poll_init(drm);
-
-   return 0;
-
-err_unbind:
-   component_unbind_all(drm->dev, drm);
-err_vblank:
-   drm_vblank_cleanup(drm);
-err_kms:
-   drm_mode_config_cleanup(drm);
-
-   return ret;
-}
-
-/*
  * imx_drm_add_crtc - add a new crtc
  */
 int