Unverified Commit 6cf61bf4 authored by Maxime Ripard's avatar Maxime Ripard
Browse files

drm/vc4: drv: Call component_unbind_all()



While we were using the component framework to deal with all the DRM
subdevices, we were not calling component_unbind_all().

This leads to none of the subdevices freeing up their resources as part of
their unbind() or device managed hooks.

Fixes: c8b75bca ("drm/vc4: Add KMS support for Raspberry Pi.")
Acked-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: default avatarDave Stevenson <dave.stevenson@raspberrypi.com>
Signed-off-by: default avatarMaxime Ripard <maxime@cerno.tech>
Link: https://lore.kernel.org/r/20220711173939.1132294-13-maxime@cerno.tech
parent ae9f1f2c
Loading
Loading
Loading
Loading
+12 −2
Original line number Original line Diff line number Diff line
@@ -267,6 +267,13 @@ static void vc4_match_add_drivers(struct device *dev,
	}
	}
}
}


static void vc4_component_unbind_all(void *ptr)
{
	struct vc4_dev *vc4 = ptr;

	component_unbind_all(vc4->dev, &vc4->base);
}

static const struct of_device_id vc4_dma_range_matches[] = {
static const struct of_device_id vc4_dma_range_matches[] = {
	{ .compatible = "brcm,bcm2711-hvs" },
	{ .compatible = "brcm,bcm2711-hvs" },
	{ .compatible = "brcm,bcm2835-hvs" },
	{ .compatible = "brcm,bcm2835-hvs" },
@@ -310,6 +317,7 @@ static int vc4_drm_bind(struct device *dev)
	if (IS_ERR(vc4))
	if (IS_ERR(vc4))
		return PTR_ERR(vc4);
		return PTR_ERR(vc4);
	vc4->is_vc5 = is_vc5;
	vc4->is_vc5 = is_vc5;
	vc4->dev = dev;


	drm = &vc4->base;
	drm = &vc4->base;
	platform_set_drvdata(pdev, drm);
	platform_set_drvdata(pdev, drm);
@@ -360,6 +368,10 @@ static int vc4_drm_bind(struct device *dev)
	if (ret)
	if (ret)
		return ret;
		return ret;


	ret = devm_add_action_or_reset(dev, vc4_component_unbind_all, vc4);
	if (ret)
		return ret;

	ret = vc4_plane_create_additional_planes(drm);
	ret = vc4_plane_create_additional_planes(drm);
	if (ret)
	if (ret)
		goto unbind_all;
		goto unbind_all;
@@ -380,8 +392,6 @@ static int vc4_drm_bind(struct device *dev)
	return 0;
	return 0;


unbind_all:
unbind_all:
	component_unbind_all(dev, drm);

	return ret;
	return ret;
}
}


+1 −0
Original line number Original line Diff line number Diff line
@@ -76,6 +76,7 @@ struct vc4_perfmon {


struct vc4_dev {
struct vc4_dev {
	struct drm_device base;
	struct drm_device base;
	struct device *dev;


	bool is_vc5;
	bool is_vc5;