usb: host: Add ac5 to EHCI Orion
authorElad Nachman <enachman@marvell.com>
Sun, 14 Jan 2024 17:21:54 +0000 (19:21 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 28 Jan 2024 00:53:51 +0000 (16:53 -0800)
Add support for ac5 to the EHCI Orion platform driver.
The ac5 SOC has DDR starting at offset 0x2_0000_0000,
Hence it requires a larger than 32-bit DMA mask to operate.
Move the dma mask to be pointed by the OF match data, and
use that match data when initializng the DMA mask.

Signed-off-by: Elad Nachman <enachman@marvell.com>
Link: https://lore.kernel.org/r/20240114172154.2622275-3-enachman@marvell.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/ehci-orion.c

index 6c47ab0a491d5133c59539c93b4a33e39c9262ca..ad145a54ca74e4003ceadee7f1defc171ddee124 100644 (file)
@@ -65,6 +65,15 @@ struct orion_ehci_hcd {
 
 static struct hc_driver __read_mostly ehci_orion_hc_driver;
 
+/*
+ * Legacy DMA mask is 32 bit.
+ * AC5 has the DDR starting at 8GB, hence it requires
+ * a larger (34-bit) DMA mask, in order for DMA allocations
+ * to succeed:
+ */
+static const u64 dma_mask_orion =      DMA_BIT_MASK(32);
+static const u64 dma_mask_ac5 =                DMA_BIT_MASK(34);
+
 /*
  * Implement Orion USB controller specification guidelines
  */
@@ -211,6 +220,7 @@ static int ehci_orion_drv_probe(struct platform_device *pdev)
        int irq, err;
        enum orion_ehci_phy_ver phy_version;
        struct orion_ehci_hcd *priv;
+       u64 *dma_mask_ptr;
 
        if (usb_disabled())
                return -ENODEV;
@@ -228,7 +238,8 @@ static int ehci_orion_drv_probe(struct platform_device *pdev)
         * set. Since shared usb code relies on it, set it here for
         * now. Once we have dma capability bindings this can go away.
         */
-       err = dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
+       dma_mask_ptr = (u64 *)of_device_get_match_data(&pdev->dev);
+       err = dma_coerce_mask_and_coherent(&pdev->dev, *dma_mask_ptr);
        if (err)
                goto err;
 
@@ -332,8 +343,9 @@ static void ehci_orion_drv_remove(struct platform_device *pdev)
 }
 
 static const struct of_device_id ehci_orion_dt_ids[] = {
-       { .compatible = "marvell,orion-ehci", },
-       { .compatible = "marvell,armada-3700-ehci", },
+       { .compatible = "marvell,orion-ehci", .data = &dma_mask_orion},
+       { .compatible = "marvell,armada-3700-ehci", .data = &dma_mask_orion},
+       { .compatible = "marvell,ac5-ehci", .data = &dma_mask_ac5},
        {},
 };
 MODULE_DEVICE_TABLE(of, ehci_orion_dt_ids);