media: zoran: Use DMA coherent for stat_com
Instead of using a fragile virt_to_bus, let's use proper DMA coherent for the stat_com entry. Signed-off-by: Corentin Labbe <clabbe@baylibre.com> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
This commit is contained in:
parent
accd021409
commit
886986804a
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user