Hi Dave, Could you please take this patch in your tree for v3.11 ?
On Thursday 25 April 2013 12:14:54 Laurent Pinchart wrote: > This simplifies cleanup paths and fixes a probe time crash in the error > path when trying to cleanup mode setting before it was initialized. > > Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas at ideasonboard.com> > --- > drivers/gpu/drm/shmobile/shmob_drm_drv.c | 28 +++++++++------------------ > drivers/gpu/drm/shmobile/shmob_drm_plane.c | 7 +------ > 2 files changed, 10 insertions(+), 25 deletions(-) > > diff --git a/drivers/gpu/drm/shmobile/shmob_drm_drv.c > b/drivers/gpu/drm/shmobile/shmob_drm_drv.c index f6e0b53..29d15e3 100644 > --- a/drivers/gpu/drm/shmobile/shmob_drm_drv.c > +++ b/drivers/gpu/drm/shmobile/shmob_drm_drv.c > @@ -90,7 +90,7 @@ static int shmob_drm_setup_clocks(struct shmob_drm_device > *sdev, return -EINVAL; > } > > - clk = clk_get(sdev->dev, clkname); > + clk = devm_clk_get(sdev->dev, clkname); > if (IS_ERR(clk)) { > dev_err(sdev->dev, "cannot get dot clock %s\n", clkname); > return PTR_ERR(clk); > @@ -106,21 +106,12 @@ static int shmob_drm_setup_clocks(struct > shmob_drm_device *sdev, > > static int shmob_drm_unload(struct drm_device *dev) > { > - struct shmob_drm_device *sdev = dev->dev_private; > - > drm_kms_helper_poll_fini(dev); > drm_mode_config_cleanup(dev); > drm_vblank_cleanup(dev); > drm_irq_uninstall(dev); > > - if (sdev->clock) > - clk_put(sdev->clock); > - > - if (sdev->mmio) > - iounmap(sdev->mmio); > - > dev->dev_private = NULL; > - kfree(sdev); > > return 0; > } > @@ -139,7 +130,7 @@ static int shmob_drm_load(struct drm_device *dev, > unsigned long flags) return -EINVAL; > } > > - sdev = kzalloc(sizeof(*sdev), GFP_KERNEL); > + sdev = devm_kzalloc(&pdev->dev, sizeof(*sdev), GFP_KERNEL); > if (sdev == NULL) { > dev_err(dev->dev, "failed to allocate private data\n"); > return -ENOMEM; > @@ -156,29 +147,28 @@ static int shmob_drm_load(struct drm_device *dev, > unsigned long flags) res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > if (res == NULL) { > dev_err(&pdev->dev, "failed to get memory resource\n"); > - ret = -EINVAL; > - goto done; > + return -EINVAL; > } > > - sdev->mmio = ioremap_nocache(res->start, resource_size(res)); > + sdev->mmio = devm_ioremap_nocache(&pdev->dev, res->start, > + resource_size(res)); > if (sdev->mmio == NULL) { > dev_err(&pdev->dev, "failed to remap memory resource\n"); > - ret = -ENOMEM; > - goto done; > + return -ENOMEM; > } > > ret = shmob_drm_setup_clocks(sdev, pdata->clk_source); > if (ret < 0) > - goto done; > + return ret; > > ret = shmob_drm_init_interface(sdev); > if (ret < 0) > - goto done; > + return ret; > > ret = shmob_drm_modeset_init(sdev); > if (ret < 0) { > dev_err(&pdev->dev, "failed to initialize mode setting\n"); > - goto done; > + return ret; > } > > for (i = 0; i < 4; ++i) { > diff --git a/drivers/gpu/drm/shmobile/shmob_drm_plane.c > b/drivers/gpu/drm/shmobile/shmob_drm_plane.c index e1eb899..6898f6f 100644 > --- a/drivers/gpu/drm/shmobile/shmob_drm_plane.c > +++ b/drivers/gpu/drm/shmobile/shmob_drm_plane.c > @@ -221,11 +221,8 @@ static int shmob_drm_plane_disable(struct drm_plane > *plane) > > static void shmob_drm_plane_destroy(struct drm_plane *plane) > { > - struct shmob_drm_plane *splane = to_shmob_plane(plane); > - > shmob_drm_plane_disable(plane); > drm_plane_cleanup(plane); > - kfree(splane); > } > > static const struct drm_plane_funcs shmob_drm_plane_funcs = { > @@ -251,7 +248,7 @@ int shmob_drm_plane_create(struct shmob_drm_device > *sdev, unsigned int index) struct shmob_drm_plane *splane; > int ret; > > - splane = kzalloc(sizeof(*splane), GFP_KERNEL); > + splane = devm_kzalloc(sdev->dev, sizeof(*splane), GFP_KERNEL); > if (splane == NULL) > return -ENOMEM; > > @@ -261,8 +258,6 @@ int shmob_drm_plane_create(struct shmob_drm_device > *sdev, unsigned int index) ret = drm_plane_init(sdev->ddev, &splane->plane, > 1, > &shmob_drm_plane_funcs, formats, > ARRAY_SIZE(formats), false); > - if (ret < 0) > - kfree(splane); > > return ret; > } -- Regards, Laurent Pinchart