dmaengine: ti: k3-udma: Add support for BCDMA CSI RX
authorVignesh Raghavendra <vigneshr@ti.com>
Tue, 13 Dec 2022 16:43:04 +0000 (22:13 +0530)
committerVinod Koul <vkoul@kernel.org>
Wed, 28 Dec 2022 06:37:11 +0000 (12:07 +0530)
BCDMA CSI RX present on AM62Ax SoC is a dedicated DMA for servicing
Camera Serial Interface (CSI) IP. Add support for the same.

Signed-off-by: Vignesh Raghavendra <vigneshr@ti.com>
Acked-by: Peter Ujfalusi <peter.ujfalusi@gmail.com>
Link: https://lore.kernel.org/r/20221213164304.1126945-6-vigneshr@ti.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/dma/ti/k3-udma.c

index c1005d17b42ee9c1b2c400856107c2c4bdaab018..1d3d1b387b9622565a0db061fdcad81a06103204 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 {
@@ -4295,6 +4296,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 */
@@ -4344,6 +4364,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 */ },
 };
 
@@ -5274,12 +5298,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)