diff --git a/drivers/bcma/main.c b/drivers/bcma/main.c
index 7061d3ee836a15..4df97000d7e0a7 100644
--- a/drivers/bcma/main.c
+++ b/drivers/bcma/main.c
@@ -208,6 +208,10 @@ static void bcma_of_fill_device(struct device *parent,
 
 	core->irq = bcma_of_get_irq(parent, core, 0);
 
+	/*
+	 * FIXME: of_dma_configure() should not be called outside
+	 * bus_type.dma_configure
+	 */
 	of_dma_configure(&core->dev, node, false);
 }
 
diff --git a/drivers/dma/qcom/hidma_mgmt.c b/drivers/dma/qcom/hidma_mgmt.c
index 05e96b31d87169..2efd97747d37b3 100644
--- a/drivers/dma/qcom/hidma_mgmt.c
+++ b/drivers/dma/qcom/hidma_mgmt.c
@@ -390,6 +390,10 @@ static int __init hidma_mgmt_of_populate_channels(struct device_node *np)
 			goto out;
 		}
 		new_pdev->dev.of_node = child;
+		/*
+		 * FIXME: of_dma_configure() should not be called outside
+		 * bus_type.dma_configure
+		 */
 		of_dma_configure(&new_pdev->dev, child, true);
 		/*
 		 * It is assumed that calling of_msi_configure is safe on
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.c b/drivers/gpu/drm/etnaviv/etnaviv_drv.c
index 31a7f59ccb49ee..22729c66e39a65 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_drv.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.c
@@ -635,6 +635,10 @@ static int etnaviv_pdev_probe(struct platform_device *pdev)
 	 * device as the GPU we found. This assumes that all Vivante
 	 * GPUs in the system share the same DMA constraints.
 	 */
+	/*
+	 * FIXME: of_dma_configure() should not be called outside
+	 * bus_type.dma_configure
+	 */
 	if (first_node)
 		of_dma_configure(&pdev->dev, first_node, true);
 
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
index 5deb79924897af..509bd8b7ec12ae 100644
--- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
+++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c
@@ -1492,6 +1492,10 @@ int a6xx_gmu_wrapper_init(struct a6xx_gpu *a6xx_gpu, struct device_node *node)
 
 	gmu->dev = &pdev->dev;
 
+	/*
+	 * FIXME: of_dma_configure() should not be called outside
+	 * bus_type.dma_configure
+	 */
 	of_dma_configure(gmu->dev, node, true);
 
 	pm_runtime_enable(gmu->dev);
@@ -1556,6 +1560,10 @@ int a6xx_gmu_init(struct a6xx_gpu *a6xx_gpu, struct device_node *node)
 
 	gmu->dev = &pdev->dev;
 
+	/*
+	 * FIXME: of_dma_configure() should not be called outside
+	 * bus_type.dma_configure
+	 */
 	of_dma_configure(gmu->dev, node, true);
 
 	/* Fow now, don't do anything fancy until we get our feet under us */
diff --git a/drivers/gpu/drm/sun4i/sun4i_backend.c b/drivers/gpu/drm/sun4i/sun4i_backend.c
index b11dbd50d73e98..30cbefb6799e51 100644
--- a/drivers/gpu/drm/sun4i/sun4i_backend.c
+++ b/drivers/gpu/drm/sun4i/sun4i_backend.c
@@ -800,6 +800,10 @@ static int sun4i_backend_bind(struct device *dev, struct device *master,
 		 * for us, and DRM doesn't do per-device allocation either, so
 		 * we would need to fix DRM first...
 		 */
+		/*
+		 * FIXME: of_dma_configure() should not be called outside
+		 * bus_type.dma_configure
+		 */
 		ret = of_dma_configure(drm->dev, dev->of_node, true);
 		if (ret)
 			return ret;
diff --git a/drivers/gpu/drm/sun4i/sun8i_mixer.c b/drivers/gpu/drm/sun4i/sun8i_mixer.c
index 11d5244a5aa5fc..e26bea207599d3 100644
--- a/drivers/gpu/drm/sun4i/sun8i_mixer.c
+++ b/drivers/gpu/drm/sun4i/sun8i_mixer.c
@@ -399,6 +399,10 @@ static int sun8i_mixer_bind(struct device *dev, struct device *master,
 		 * DRM doesn't do per-device allocation either, so we
 		 * would need to fix DRM first...
 		 */
+		/*
+		 * FIXME: of_dma_configure() should not be called outside
+		 * bus_type.dma_configure
+		 */
 		ret = of_dma_configure(drm->dev, dev->of_node, true);
 		if (ret)
 			return ret;
diff --git a/drivers/gpu/drm/vc4/vc4_drv.c b/drivers/gpu/drm/vc4/vc4_drv.c
index 823395c23cc308..82496d8fb50f84 100644
--- a/drivers/gpu/drm/vc4/vc4_drv.c
+++ b/drivers/gpu/drm/vc4/vc4_drv.c
@@ -305,6 +305,10 @@ static int vc4_drm_bind(struct device *dev)
 	node = of_find_matching_node_and_match(NULL, vc4_dma_range_matches,
 					       NULL);
 	if (node) {
+		/*
+		 * FIXME: of_dma_configure() should not be called outside
+		 * bus_type.dma_configure
+		 */
 		ret = of_dma_configure(dev, node, true);
 		of_node_put(node);
 
diff --git a/drivers/gpu/host1x/bus.c b/drivers/gpu/host1x/bus.c
index 4d16a3396c4abf..5c7ef738a7d7d7 100644
--- a/drivers/gpu/host1x/bus.c
+++ b/drivers/gpu/host1x/bus.c
@@ -475,6 +475,10 @@ static int host1x_device_add(struct host1x *host1x,
 	device->dev.bus = &host1x_bus_type;
 	device->dev.parent = host1x->dev;
 
+	/*
+	 * FIXME: of_dma_configure() should not be called outside
+	 * bus_type.dma_configure
+	 */
 	of_dma_configure(&device->dev, host1x->dev->of_node, true);
 
 	device->dev.dma_parms = &device->dma_parms;
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
index 18162049bd2294..eb623a611f571d 100644
--- a/drivers/iommu/iommu.c
+++ b/drivers/iommu/iommu.c
@@ -458,8 +458,15 @@ static int __iommu_probe_device(struct device *dev, struct list_head *group_list
 	 * Allow __iommu_probe_device() to be safely called in parallel,
 	 * both dev->iommu_group and the initial setup of dev->iommu are
 	 * protected this way.
+	 *
+	 * We cannot have the assertion yet because of a number of drivers
+	 * improperly calling of_dma_configure() and expecting to attach
+	 * the iommu outside the bus_type.dma_configure callback. This messes
+	 * up our ownership tracking, does not exclude other drivers from
+	 * binding an operating the device, and is technically mislocked.
+	 *
+	 * device_lock_assert(dev);
 	 */
-	device_lock_assert(dev);
 
 	if (!ops)
 		return -ENODEV;
@@ -527,8 +534,6 @@ int iommu_probe_device_locked(struct device *dev)
 	const struct iommu_ops *ops;
 	int ret;
 
-	device_lock_assert(dev);
-
 	ret = __iommu_probe_device(dev, NULL);
 	if (ret)
 		return ret;
@@ -1202,7 +1207,6 @@ void iommu_group_remove_device(struct device *dev)
 		__iommu_group_remove_device(dev);
 	}
 	device_unlock(dev);
-
 }
 EXPORT_SYMBOL_GPL(iommu_group_remove_device);
 
diff --git a/drivers/media/platform/qcom/venus/firmware.c b/drivers/media/platform/qcom/venus/firmware.c
index cfb11c551167ce..f70360c5534d64 100644
--- a/drivers/media/platform/qcom/venus/firmware.c
+++ b/drivers/media/platform/qcom/venus/firmware.c
@@ -296,6 +296,10 @@ int venus_firmware_init(struct venus_core *core)
 
 	pdev->dev.of_node = np;
 
+	/*
+	 * FIXME: of_dma_configure() should not be called outside
+	 * bus_type.dma_configure
+	 */
 	ret = of_dma_configure(&pdev->dev, np, true);
 	if (ret) {
 		dev_err(core->dev, "dma configure fail\n");
diff --git a/drivers/media/platform/samsung/s5p-mfc/s5p_mfc.c b/drivers/media/platform/samsung/s5p-mfc/s5p_mfc.c
index e30e54935d79a9..40fa7b62545d7a 100644
--- a/drivers/media/platform/samsung/s5p-mfc/s5p_mfc.c
+++ b/drivers/media/platform/samsung/s5p-mfc/s5p_mfc.c
@@ -1114,6 +1114,10 @@ static struct device *s5p_mfc_alloc_memdev(struct device *dev,
 	 * to be treated as valid DMA masters we need a bit of a hack to force
 	 * them to inherit the MFC node's DMA configuration.
 	 */
+	/*
+	 * FIXME: of_dma_configure() should not be called outside
+	 * bus_type.dma_configure
+	 */
 	of_dma_configure(child, dev->of_node, true);
 
 	if (device_add(child) == 0) {
diff --git a/drivers/net/wireless/ath/ath10k/snoc.c b/drivers/net/wireless/ath/ath10k/snoc.c
index 26214c00cd0d7b..977e5c6186b131 100644
--- a/drivers/net/wireless/ath/ath10k/snoc.c
+++ b/drivers/net/wireless/ath/ath10k/snoc.c
@@ -1614,6 +1614,10 @@ static int ath10k_fw_init(struct ath10k *ar)
 
 	pdev->dev.of_node = node;
 
+	/*
+	 * FIXME: of_dma_configure() should not be called outside
+	 * bus_type.dma_configure
+	 */
 	ret = of_dma_configure(&pdev->dev, node, true);
 	if (ret) {
 		ath10k_err(ar, "dma configure fail: %d\n", ret);
diff --git a/drivers/net/wireless/ath/ath11k/ahb.c b/drivers/net/wireless/ath/ath11k/ahb.c
index 139da578831a44..a4d2a89ab96de0 100644
--- a/drivers/net/wireless/ath/ath11k/ahb.c
+++ b/drivers/net/wireless/ath/ath11k/ahb.c
@@ -1012,6 +1012,10 @@ static int ath11k_ahb_fw_resources_init(struct ath11k_base *ab)
 		return PTR_ERR(pdev);
 	}
 
+	/*
+	 * FIXME: of_dma_configure() should not be called outside
+	 * bus_type.dma_configure
+	 */
 	ret = of_dma_configure(&pdev->dev, node, true);
 	if (ret) {
 		ath11k_err(ab, "dma configure fail: %d\n", ret);
diff --git a/drivers/of/device.c b/drivers/of/device.c
index 0f00f1b8070829..bc6f62ebcbd040 100644
--- a/drivers/of/device.c
+++ b/drivers/of/device.c
@@ -108,6 +108,9 @@ of_dma_set_restricted_buffer(struct device *dev, struct device_node *np)
  * If platform code needs to use its own special DMA configuration, it
  * can use a platform bus notifier and handle BUS_NOTIFY_ADD_DEVICE events
  * to fix up DMA configuration.
+ *
+ * This function should only be called from the bus_type.dma_configure callback
+ * and the driver_lock(dev) must be held.
  */
 int of_dma_configure_id(struct device *dev, struct device_node *np,
 			bool force_dma, const u32 *id)
diff --git a/sound/soc/bcm/bcm63xx-pcm-whistler.c b/sound/soc/bcm/bcm63xx-pcm-whistler.c
index 2c600b017524f3..d8e0520ca61155 100644
--- a/sound/soc/bcm/bcm63xx-pcm-whistler.c
+++ b/sound/soc/bcm/bcm63xx-pcm-whistler.c
@@ -354,6 +354,10 @@ static int bcm63xx_soc_pcm_new(struct snd_soc_component *component,
 
 	i2s_priv = dev_get_drvdata(asoc_rtd_to_cpu(rtd, 0)->dev);
 
+	/*
+	 * FIXME: of_dma_configure() should not be called outside
+	 * bus_type.dma_configure
+	 */
 	of_dma_configure(pcm->card->dev, pcm->card->dev->of_node, 1);
 
 	ret = dma_coerce_mask_and_coherent(pcm->card->dev, DMA_BIT_MASK(32));
