Instead of using a fragile virt_to_bus, let's use proper DMA coherent
for the stat_com entry.

Signed-off-by: Corentin Labbe <cla...@baylibre.com>
---
 drivers/staging/media/zoran/zoran.h        |  2 ++
 drivers/staging/media/zoran/zoran_card.c   | 22 +++++++++++++++-------
 drivers/staging/media/zoran/zoran_device.c |  3 +--
 3 files changed, 18 insertions(+), 9 deletions(-)

diff --git a/drivers/staging/media/zoran/zoran.h 
b/drivers/staging/media/zoran/zoran.h
index aa2a8f688a01..8f3faa4eb60f 100644
--- a/drivers/staging/media/zoran/zoran.h
+++ b/drivers/staging/media/zoran/zoran.h
@@ -351,6 +351,8 @@ struct zoran {
        unsigned long frame_num;
 
        wait_queue_head_t test_q;
+
+       dma_addr_t p_sc;
 };
 
 static inline struct zoran *to_zoran(struct v4l2_device *v4l2_dev)
diff --git a/drivers/staging/media/zoran/zoran_card.c 
b/drivers/staging/media/zoran/zoran_card.c
index 5919803a6a5e..9fe2bc2b036a 100644
--- a/drivers/staging/media/zoran/zoran_card.c
+++ b/drivers/staging/media/zoran/zoran_card.c
@@ -936,11 +936,17 @@ static int zr36057_init(struct zoran *zr)
        zoran_open_init_params(zr);
 
        /* allocate memory *before* doing anything to the hardware in case 
allocation fails */
-       zr->stat_com = kzalloc(BUZ_NUM_STAT_COM * 4, GFP_KERNEL);
        zr->video_dev = video_device_alloc();
-       if (!zr->stat_com || !zr->video_dev) {
+       if (!zr->video_dev) {
                err = -ENOMEM;
-               goto exit_free;
+               goto exit;
+       }
+       zr->stat_com = dma_alloc_coherent(&zr->pci_dev->dev,
+                                         BUZ_NUM_STAT_COM * sizeof(u32),
+                                         &zr->p_sc, GFP_KERNEL);
+       if (!zr->stat_com) {
+               err = -ENOMEM;
+               goto exit_video;
        }
        for (j = 0; j < BUZ_NUM_STAT_COM; j++)
                zr->stat_com[j] = cpu_to_le32(1); /* mark as unavailable to 
zr36057 */
@@ -958,7 +964,7 @@ static int zr36057_init(struct zoran *zr)
        zr->video_dev->vfl_dir = VFL_DIR_M2M;
        err = video_register_device(zr->video_dev, VFL_TYPE_VIDEO, 
video_nr[zr->id]);
        if (err < 0)
-               goto exit_free;
+               goto exit_statcom;
        video_set_drvdata(zr->video_dev, zr);
 
        zoran_init_hardware(zr);
@@ -973,9 +979,11 @@ static int zr36057_init(struct zoran *zr)
        zr->initialized = 1;
        return 0;
 
-exit_free:
-       kfree(zr->stat_com);
+exit_statcom:
+       dma_free_coherent(&zr->pci_dev->dev, BUZ_NUM_STAT_COM * sizeof(u32), 
zr->stat_com, zr->p_sc);
+exit_video:
        kfree(zr->video_dev);
+exit:
        return err;
 }
 
@@ -1009,7 +1017,7 @@ static void zoran_remove(struct pci_dev *pdev)
        btwrite(0, ZR36057_SPGPPCR);
        free_irq(zr->pci_dev->irq, zr);
        /* unmap and free memory */
-       kfree(zr->stat_com);
+       dma_free_coherent(&zr->pci_dev->dev, BUZ_NUM_STAT_COM * sizeof(u32), 
zr->stat_com, zr->p_sc);
        iounmap(zr->zr36057_mem);
        pci_disable_device(zr->pci_dev);
        video_unregister_device(zr->video_dev);
diff --git a/drivers/staging/media/zoran/zoran_device.c 
b/drivers/staging/media/zoran/zoran_device.c
index 627ebda33cc8..0ecb044f8e8f 100644
--- a/drivers/staging/media/zoran/zoran_device.c
+++ b/drivers/staging/media/zoran/zoran_device.c
@@ -579,8 +579,7 @@ static void zr36057_set_jpg(struct zoran *zr, enum 
zoran_codec_mode mode)
        //btor(ZR36057_VFESPFR_VCLKPol, ZR36057_VFESPFR);
 
        /* code base address */
-       reg = virt_to_bus(zr->stat_com);
-       btwrite(reg, ZR36057_JCBA);
+       btwrite(zr->p_sc, ZR36057_JCBA);
 
        /* FIFO threshold (FIFO is 160. double words) */
        /* NOTE: decimal values here */
-- 
2.26.2

_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to