drm/vc4: Use phys addresses for slave DMA config
authorPhil Elwell <phil@raspberrypi.com>
Thu, 11 May 2023 15:08:15 +0000 (16:08 +0100)
committerDom Cobley <popcornmix@gmail.com>
Mon, 19 Feb 2024 11:33:35 +0000 (11:33 +0000)
Slave addresses for DMA are meant to be supplied as physical addresses
(contrary to what struct snd_dmaengine_dai_dma_data does).

Signed-off-by: Phil Elwell <phil@raspberrypi.com>
drivers/gpu/drm/vc4/vc4_hdmi.c

index b2c1e63..f1d9c27 100644 (file)
@@ -2689,7 +2689,7 @@ static int vc4_hdmi_audio_init(struct vc4_hdmi *vc4_hdmi)
        struct snd_soc_card *card = &vc4_hdmi->audio.card;
        struct device *dev = &vc4_hdmi->pdev->dev;
        struct platform_device *codec_pdev;
-       const __be32 *addr;
+       struct resource *iomem;
        int index, len;
        int ret;
 
@@ -2725,20 +2725,15 @@ static int vc4_hdmi_audio_init(struct vc4_hdmi *vc4_hdmi)
        }
 
        /*
-        * Get the physical address of VC4_HD_MAI_DATA. We need to retrieve
-        * the bus address specified in the DT, because the physical address
-        * (the one returned by platform_get_resource()) is not appropriate
-        * for DMA transfers.
-        * This VC/MMU should probably be exposed to avoid this kind of hacks.
+        * Get the physical address of VC4_HD_MAI_DATA.
         */
        index = of_property_match_string(dev->of_node, "reg-names", "hd");
        /* Before BCM2711, we don't have a named register range */
        if (index < 0)
                index = 1;
+       iomem = platform_get_resource(vc4_hdmi->pdev, IORESOURCE_MEM, index);
 
-       addr = of_get_address(dev->of_node, index, NULL, NULL);
-
-       vc4_hdmi->audio.dma_data.addr = be32_to_cpup(addr) + mai_data->offset;
+       vc4_hdmi->audio.dma_data.addr = iomem->start + mai_data->offset;
        vc4_hdmi->audio.dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
        vc4_hdmi->audio.dma_data.maxburst = 2;