Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 16ad3b2c authored by Laurent Pinchart's avatar Laurent Pinchart
Browse files

drm/shmobile: Use devm_* managed functions



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: default avatarLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
parent 2e7c9b35
Loading
Loading
Loading
Loading
+9 −19
Original line number Original line Diff line number Diff line
@@ -90,7 +90,7 @@ static int shmob_drm_setup_clocks(struct shmob_drm_device *sdev,
		return -EINVAL;
		return -EINVAL;
	}
	}


	clk = clk_get(sdev->dev, clkname);
	clk = devm_clk_get(sdev->dev, clkname);
	if (IS_ERR(clk)) {
	if (IS_ERR(clk)) {
		dev_err(sdev->dev, "cannot get dot clock %s\n", clkname);
		dev_err(sdev->dev, "cannot get dot clock %s\n", clkname);
		return PTR_ERR(clk);
		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)
static int shmob_drm_unload(struct drm_device *dev)
{
{
	struct shmob_drm_device *sdev = dev->dev_private;

	drm_kms_helper_poll_fini(dev);
	drm_kms_helper_poll_fini(dev);
	drm_mode_config_cleanup(dev);
	drm_mode_config_cleanup(dev);
	drm_vblank_cleanup(dev);
	drm_vblank_cleanup(dev);
	drm_irq_uninstall(dev);
	drm_irq_uninstall(dev);


	if (sdev->clock)
		clk_put(sdev->clock);

	if (sdev->mmio)
		iounmap(sdev->mmio);

	dev->dev_private = NULL;
	dev->dev_private = NULL;
	kfree(sdev);


	return 0;
	return 0;
}
}
@@ -139,7 +130,7 @@ static int shmob_drm_load(struct drm_device *dev, unsigned long flags)
		return -EINVAL;
		return -EINVAL;
	}
	}


	sdev = kzalloc(sizeof(*sdev), GFP_KERNEL);
	sdev = devm_kzalloc(&pdev->dev, sizeof(*sdev), GFP_KERNEL);
	if (sdev == NULL) {
	if (sdev == NULL) {
		dev_err(dev->dev, "failed to allocate private data\n");
		dev_err(dev->dev, "failed to allocate private data\n");
		return -ENOMEM;
		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);
	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (res == NULL) {
	if (res == NULL) {
		dev_err(&pdev->dev, "failed to get memory resource\n");
		dev_err(&pdev->dev, "failed to get memory resource\n");
		ret = -EINVAL;
		return -EINVAL;
		goto done;
	}
	}


	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) {
	if (sdev->mmio == NULL) {
		dev_err(&pdev->dev, "failed to remap memory resource\n");
		dev_err(&pdev->dev, "failed to remap memory resource\n");
		ret = -ENOMEM;
		return -ENOMEM;
		goto done;
	}
	}


	ret = shmob_drm_setup_clocks(sdev, pdata->clk_source);
	ret = shmob_drm_setup_clocks(sdev, pdata->clk_source);
	if (ret < 0)
	if (ret < 0)
		goto done;
		return ret;


	ret = shmob_drm_init_interface(sdev);
	ret = shmob_drm_init_interface(sdev);
	if (ret < 0)
	if (ret < 0)
		goto done;
		return ret;


	ret = shmob_drm_modeset_init(sdev);
	ret = shmob_drm_modeset_init(sdev);
	if (ret < 0) {
	if (ret < 0) {
		dev_err(&pdev->dev, "failed to initialize mode setting\n");
		dev_err(&pdev->dev, "failed to initialize mode setting\n");
		goto done;
		return ret;
	}
	}


	for (i = 0; i < 4; ++i) {
	for (i = 0; i < 4; ++i) {
+1 −6
Original line number Original line Diff line number Diff line
@@ -221,11 +221,8 @@ static int shmob_drm_plane_disable(struct drm_plane *plane)


static void shmob_drm_plane_destroy(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);
	shmob_drm_plane_disable(plane);
	drm_plane_cleanup(plane);
	drm_plane_cleanup(plane);
	kfree(splane);
}
}


static const struct drm_plane_funcs shmob_drm_plane_funcs = {
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;
	struct shmob_drm_plane *splane;
	int ret;
	int ret;


	splane = kzalloc(sizeof(*splane), GFP_KERNEL);
	splane = devm_kzalloc(sdev->dev, sizeof(*splane), GFP_KERNEL);
	if (splane == NULL)
	if (splane == NULL)
		return -ENOMEM;
		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,
	ret = drm_plane_init(sdev->ddev, &splane->plane, 1,
			     &shmob_drm_plane_funcs, formats,
			     &shmob_drm_plane_funcs, formats,
			     ARRAY_SIZE(formats), false);
			     ARRAY_SIZE(formats), false);
	if (ret < 0)
		kfree(splane);


	return ret;
	return ret;
}
}