drm/arc: Switch to devm_drm_dev_alloc
- Need to embedded the drm_device, but for now we keep the usual pointer chasing. - No more devm_kzalloc, which fixes a lifetime issues on driver remove. - No more drm_dev_put, that's done by devm_ now. Acked-by: Sam Ravnborg <sam@ravnborg.org> Cc: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com> Acked-by: Thomas Zimmermann <tzimmermann@suse.de> Signed-off-by: Daniel Vetter <daniel.vetter@intel.com> Cc: Alexey Brodkin <abrodkin@synopsys.com> Link: https://patchwork.freedesktop.org/patch/msgid/20210112084358.2771527-1-daniel.vetter@ffwll.ch
This commit is contained in:
Родитель
cdea72518a
Коммит
8db0002ab6
|
@ -9,6 +9,7 @@
|
|||
#define _ARCPGU_H_
|
||||
|
||||
struct arcpgu_drm_private {
|
||||
struct drm_device drm;
|
||||
void __iomem *regs;
|
||||
struct clk *clk;
|
||||
struct drm_framebuffer *fb;
|
||||
|
|
|
@ -42,18 +42,14 @@ static void arcpgu_setup_mode_config(struct drm_device *drm)
|
|||
|
||||
DEFINE_DRM_GEM_CMA_FOPS(arcpgu_drm_ops);
|
||||
|
||||
static int arcpgu_load(struct drm_device *drm)
|
||||
static int arcpgu_load(struct arcpgu_drm_private *arcpgu)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(drm->dev);
|
||||
struct arcpgu_drm_private *arcpgu;
|
||||
struct platform_device *pdev = to_platform_device(arcpgu->drm.dev);
|
||||
struct device_node *encoder_node = NULL, *endpoint_node = NULL;
|
||||
struct drm_device *drm = &arcpgu->drm;
|
||||
struct resource *res;
|
||||
int ret;
|
||||
|
||||
arcpgu = devm_kzalloc(&pdev->dev, sizeof(*arcpgu), GFP_KERNEL);
|
||||
if (arcpgu == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
drm->dev_private = arcpgu;
|
||||
|
||||
arcpgu->clk = devm_clk_get(drm->dev, "pxlclk");
|
||||
|
@ -162,30 +158,28 @@ static const struct drm_driver arcpgu_drm_driver = {
|
|||
|
||||
static int arcpgu_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct drm_device *drm;
|
||||
struct arcpgu_drm_private *arcpgu;
|
||||
int ret;
|
||||
|
||||
drm = drm_dev_alloc(&arcpgu_drm_driver, &pdev->dev);
|
||||
if (IS_ERR(drm))
|
||||
return PTR_ERR(drm);
|
||||
arcpgu = devm_drm_dev_alloc(&pdev->dev, &arcpgu_drm_driver,
|
||||
struct arcpgu_drm_private, drm);
|
||||
if (IS_ERR(arcpgu))
|
||||
return PTR_ERR(arcpgu);
|
||||
|
||||
ret = arcpgu_load(drm);
|
||||
ret = arcpgu_load(arcpgu);
|
||||
if (ret)
|
||||
goto err_unref;
|
||||
return ret;
|
||||
|
||||
ret = drm_dev_register(drm, 0);
|
||||
ret = drm_dev_register(&arcpgu->drm, 0);
|
||||
if (ret)
|
||||
goto err_unload;
|
||||
|
||||
drm_fbdev_generic_setup(drm, 16);
|
||||
drm_fbdev_generic_setup(&arcpgu->drm, 16);
|
||||
|
||||
return 0;
|
||||
|
||||
err_unload:
|
||||
arcpgu_unload(drm);
|
||||
|
||||
err_unref:
|
||||
drm_dev_put(drm);
|
||||
arcpgu_unload(&arcpgu->drm);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -196,7 +190,6 @@ static int arcpgu_remove(struct platform_device *pdev)
|
|||
|
||||
drm_dev_unregister(drm);
|
||||
arcpgu_unload(drm);
|
||||
drm_dev_put(drm);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче