dwc3-msm: Use dma mask related APIs after attaching IOMMU
When dwc3-msm driver's probe encounters -EPROBE_DEFER condition
(e.g. extcon phandle access failure case), it detaches IOMMU using
arm_iommu_detach_device() API. This detach API clears device's
dma_ops() when DOMAIN_ATTR_S1_BYPASS is not set. Hence next time
driver's probe is failing as dma_set_mask() API returns -EIO. Fix
this issue by using dma mask related APIs after attaching IOMMU
with USB device.
Change-Id: I7f9e13ed950bcbad27a27bc5ed8ccaa664ca19d7
Signed-off-by: Mayank Rana <mrana@codeaurora.org>
diff --git a/drivers/usb/dwc3/dwc3-msm.c b/drivers/usb/dwc3/dwc3-msm.c
index b6ad39b..4e634e1 100644
--- a/drivers/usb/dwc3/dwc3-msm.c
+++ b/drivers/usb/dwc3/dwc3-msm.c
@@ -3131,14 +3131,6 @@
if (!mdwc)
return -ENOMEM;
- if (dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64))) {
- dev_err(&pdev->dev, "setting DMA mask to 64 failed.\n");
- if (dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32))) {
- dev_err(&pdev->dev, "setting DMA mask to 32 failed.\n");
- return -EOPNOTSUPP;
- }
- }
-
platform_set_drvdata(pdev, mdwc);
mdwc->dev = &pdev->dev;
@@ -3331,6 +3323,15 @@
if (ret)
goto err;
+ if (dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64))) {
+ dev_err(&pdev->dev, "setting DMA mask to 64 failed.\n");
+ if (dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32))) {
+ dev_err(&pdev->dev, "setting DMA mask to 32 failed.\n");
+ ret = -EOPNOTSUPP;
+ goto uninit_iommu;
+ }
+ }
+
/* Assumes dwc3 is the first DT child of dwc3-msm */
dwc3_node = of_get_next_available_child(node, NULL);
if (!dwc3_node) {