Commit f7590205 authored by Sricharan R's avatar Sricharan R Committed by Rob Clark
Browse files

drm/msm/mdp: Detach iommu in mdp4_destroy



attach_dev gets called in mdp4_kms_init, but there is no corresponding
detach_dev called in the error path or in the kms driver unload path.

Detach and destroy mmu in mdp4_destroy.

Signed-off-by: default avatarSricharan R <sricharan@codeaurora.org>
Signed-off-by: default avatarArchit Taneja <architt@codeaurora.org>
Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
parent d72ab599
Loading
Loading
Loading
Loading
+13 −4
Original line number Diff line number Diff line
@@ -179,9 +179,20 @@ static long mdp4_round_pixclk(struct msm_kms *kms, unsigned long rate,
	}
}

static const char * const iommu_ports[] = {
	"mdp_port0_cb0", "mdp_port1_cb0",
};

static void mdp4_destroy(struct msm_kms *kms)
{
	struct mdp4_kms *mdp4_kms = to_mdp4_kms(to_mdp_kms(kms));
	struct msm_mmu *mmu = mdp4_kms->mmu;

	if (mmu) {
		mmu->funcs->detach(mmu, iommu_ports, ARRAY_SIZE(iommu_ports));
		mmu->funcs->destroy(mmu);
	}

	if (mdp4_kms->blank_cursor_iova)
		msm_gem_put_iova(mdp4_kms->blank_cursor_bo, mdp4_kms->id);
	if (mdp4_kms->blank_cursor_bo)
@@ -446,10 +457,6 @@ fail:
	return ret;
}

static const char *iommu_ports[] = {
		"mdp_port0_cb0", "mdp_port1_cb0",
};

struct msm_kms *mdp4_kms_init(struct drm_device *dev)
{
	struct platform_device *pdev = dev->platformdev;
@@ -554,6 +561,8 @@ struct msm_kms *mdp4_kms_init(struct drm_device *dev)
				ARRAY_SIZE(iommu_ports));
		if (ret)
			goto fail;

		mdp4_kms->mmu = mmu;
	} else {
		dev_info(dev->dev, "no iommu, fallback to phys "
				"contig buffers for scanout\n");
+1 −0
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@ struct mdp4_kms {
	struct clk *pclk;
	struct clk *lut_clk;
	struct clk *axi_clk;
	struct msm_mmu *mmu;

	struct mdp_irq error_handler;