Merge tag 'dmaengine-6.3-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/vkoul...
[platform/kernel/linux-rpi.git] / drivers / dma / ti / k3-udma.c
index 4c62274..7e23a6f 100644 (file)
@@ -135,6 +135,7 @@ struct udma_match_data {
        u32 flags;
        u32 statictr_z_mask;
        u8 burst_size[3];
+       struct udma_soc_data *soc_data;
 };
 
 struct udma_soc_data {
@@ -4296,6 +4297,25 @@ static struct udma_match_data j721e_mcu_data = {
        },
 };
 
+static struct udma_soc_data am62a_dmss_csi_soc_data = {
+       .oes = {
+               .bcdma_rchan_data = 0xe00,
+               .bcdma_rchan_ring = 0x1000,
+       },
+};
+
+static struct udma_match_data am62a_bcdma_csirx_data = {
+       .type = DMA_TYPE_BCDMA,
+       .psil_base = 0x3100,
+       .enable_memcpy_support = false,
+       .burst_size = {
+               TI_SCI_RM_UDMAP_CHAN_BURST_SIZE_64_BYTES, /* Normal Channels */
+               0, /* No H Channels */
+               0, /* No UH Channels */
+       },
+       .soc_data = &am62a_dmss_csi_soc_data,
+};
+
 static struct udma_match_data am64_bcdma_data = {
        .type = DMA_TYPE_BCDMA,
        .psil_base = 0x2000, /* for tchan and rchan, not applicable to bchan */
@@ -4345,6 +4365,10 @@ static const struct of_device_id udma_of_match[] = {
                .compatible = "ti,am64-dmss-pktdma",
                .data = &am64_pktdma_data,
        },
+       {
+               .compatible = "ti,am62a-dmss-bcdma-csirx",
+               .data = &am62a_bcdma_csirx_data,
+       },
        { /* Sentinel */ },
 };
 
@@ -4387,6 +4411,7 @@ static const struct soc_device_attribute k3_soc_devices[] = {
        { .family = "AM64X", .data = &am64_soc_data },
        { .family = "J721S2", .data = &j721e_soc_data},
        { .family = "AM62X", .data = &am64_soc_data },
+       { .family = "AM62AX", .data = &am64_soc_data },
        { /* sentinel */ }
 };
 
@@ -4775,7 +4800,10 @@ static int bcdma_setup_resources(struct udma_dev *ud)
                                irq_res.desc[i].num = rm_res->desc[i].num;
                        }
                }
+       } else {
+               i = 0;
        }
+
        if (ud->tchan_cnt) {
                rm_res = tisci_rm->rm_ranges[RM_RANGE_TCHAN];
                if (IS_ERR(rm_res)) {
@@ -5271,12 +5299,15 @@ static int udma_probe(struct platform_device *pdev)
        }
        ud->match_data = match->data;
 
-       soc = soc_device_match(k3_soc_devices);
-       if (!soc) {
-               dev_err(dev, "No compatible SoC found\n");
-               return -ENODEV;
+       ud->soc_data = ud->match_data->soc_data;
+       if (!ud->soc_data) {
+               soc = soc_device_match(k3_soc_devices);
+               if (!soc) {
+                       dev_err(dev, "No compatible SoC found\n");
+                       return -ENODEV;
+               }
+               ud->soc_data = soc->data;
        }
-       ud->soc_data = soc->data;
 
        ret = udma_get_mmrs(pdev, ud);
        if (ret)
@@ -5345,7 +5376,6 @@ static int udma_probe(struct platform_device *pdev)
        dev->msi.domain = of_msi_get_domain(dev, dev->of_node,
                                            DOMAIN_BUS_TI_SCI_INTA_MSI);
        if (!dev->msi.domain) {
-               dev_err(dev, "Failed to get MSI domain\n");
                return -EPROBE_DEFER;
        }