Hi Jyri, Thank you for the patch. On Wednesday 02 Nov 2016 17:57:50 Jyri Sarha wrote: > Stop using struct drm_driver load() and unload() callbacks. The > callbacks should not be used anymore. Instead of using load the > drm_device is allocated with drm_dev_alloc() and registered with > drm_dev_register() only after the driver is completely initialized. > The deinitialization is done directly either in component unbind > callback or in platform driver demove callback. > > Signed-off-by: Jyri Sarha <jsarha@xxxxxx> > --- > drivers/gpu/drm/tilcdc/tilcdc_drv.c | 124 ++++++++++++++++++-------------- > 1 file changed, 70 insertions(+), 54 deletions(-) > > diff --git a/drivers/gpu/drm/tilcdc/tilcdc_drv.c > b/drivers/gpu/drm/tilcdc/tilcdc_drv.c index 5cf534c..11f3262 100644 > --- a/drivers/gpu/drm/tilcdc/tilcdc_drv.c > +++ b/drivers/gpu/drm/tilcdc/tilcdc_drv.c > @@ -194,18 +194,22 @@ static int cpufreq_transition(struct notifier_block > *nb, * DRM operations: > */ > > -static int tilcdc_unload(struct drm_device *dev) > +static void tilcdc_fini(struct drm_device *dev) > { > struct tilcdc_drm_private *priv = dev->dev_private; > > - tilcdc_remove_external_encoders(dev); > + drm_modeset_lock_crtc(priv->crtc, NULL); > + tilcdc_crtc_disable(priv->crtc); > + drm_modeset_unlock_crtc(priv->crtc); > + > + drm_dev_unregister(dev); > > - drm_fbdev_cma_fini(priv->fbdev); > drm_kms_helper_poll_fini(dev); > + drm_fbdev_cma_fini(priv->fbdev); Is there a need to reorder these ? > + drm_irq_uninstall(dev); > drm_mode_config_cleanup(dev); > - drm_vblank_cleanup(dev); > > - drm_irq_uninstall(dev); > + tilcdc_remove_external_encoders(dev); > > #ifdef CONFIG_CPU_FREQ > cpufreq_unregister_notifier(&priv->freq_transition, > @@ -225,28 +229,34 @@ static int tilcdc_unload(struct drm_device *dev) > > pm_runtime_disable(dev->dev); > > - return 0; > + drm_dev_unref(dev); > } > > -static int tilcdc_load(struct drm_device *dev, unsigned long flags) > +static int tilcdc_init(struct drm_driver *ddrv, struct device *dev) > { > - struct platform_device *pdev = dev->platformdev; > - struct device_node *node = pdev->dev.of_node; > + struct drm_device *ddev; > + struct platform_device *pdev = to_platform_device(dev); > + struct device_node *node = dev->of_node; > struct tilcdc_drm_private *priv; > struct resource *res; > u32 bpp = 0; > int ret; > > - priv = devm_kzalloc(dev->dev, sizeof(*priv), GFP_KERNEL); > + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); > if (!priv) { > - dev_err(dev->dev, "failed to allocate private data\n"); > + dev_err(dev, "failed to allocate private data\n"); > return -ENOMEM; > } > > - dev->dev_private = priv; > + ddev = drm_dev_alloc(ddrv, dev); As a follow-up patch you might want to move tilcdc_driver above this function and use it directly to remove the ddrv argument. Apart from that, Reviewed-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx> > + if (IS_ERR(ddev)) > + return PTR_ERR(ddev); > + > + ddev->platformdev = pdev; > + ddev->dev_private = priv; [snip] -- Regards, Laurent Pinchart _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel