dmaengine: ti: k3-udma: Add support for BCDMA CSI RX

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>
This commit is contained in:
Vignesh Raghavendra 2022-12-13 22:13:04 +05:30 committed by Vinod Koul
parent c1475ad338
commit 3f58e10615

View file

@ -135,6 +135,7 @@ struct udma_match_data {
u32 flags; u32 flags;
u32 statictr_z_mask; u32 statictr_z_mask;
u8 burst_size[3]; u8 burst_size[3];
struct udma_soc_data *soc_data;
}; };
struct udma_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 = { static struct udma_match_data am64_bcdma_data = {
.type = DMA_TYPE_BCDMA, .type = DMA_TYPE_BCDMA,
.psil_base = 0x2000, /* for tchan and rchan, not applicable to bchan */ .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", .compatible = "ti,am64-dmss-pktdma",
.data = &am64_pktdma_data, .data = &am64_pktdma_data,
}, },
{
.compatible = "ti,am62a-dmss-bcdma-csirx",
.data = &am62a_bcdma_csirx_data,
},
{ /* Sentinel */ }, { /* Sentinel */ },
}; };
@ -5274,12 +5298,15 @@ static int udma_probe(struct platform_device *pdev)
} }
ud->match_data = match->data; ud->match_data = match->data;
ud->soc_data = ud->match_data->soc_data;
if (!ud->soc_data) {
soc = soc_device_match(k3_soc_devices); soc = soc_device_match(k3_soc_devices);
if (!soc) { if (!soc) {
dev_err(dev, "No compatible SoC found\n"); dev_err(dev, "No compatible SoC found\n");
return -ENODEV; return -ENODEV;
} }
ud->soc_data = soc->data; ud->soc_data = soc->data;
}
ret = udma_get_mmrs(pdev, ud); ret = udma_get_mmrs(pdev, ud);
if (ret) if (ret)