[PATCHv3 2/4] drm/tilcdc: Stop using struct drm_driver load() callback
Jyri Sarha
jsarha at ti.com
Thu Nov 3 20:11:26 UTC 2016
On 11/03/16 20:15, Laurent Pinchart wrote:
> 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 at ti.com>
>> ---
>> 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 ?
I am not sure actually. When the things did not work properly in the
beginning I just ordered unloading to happen strictly in the reverse
order compared to loading. I did not go back to check what changes were
actually needed when I got things working.
>
>> + 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.
>
Ok, thanks.
> Apart from that,
>
> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
>
>> + if (IS_ERR(ddev))
>> + return PTR_ERR(ddev);
>> +
>> + ddev->platformdev = pdev;
>> + ddev->dev_private = priv;
>
> [snip]
>
More information about the dri-devel
mailing list