提交 fecfedeb 编写于 作者: L Laurent Pinchart 提交者: Mauro Carvalho Chehab

V4L/DVB: Remove videobuf_sg_alloc abuse

The cx88 and cx25821 drivers abuse videobuf_buffer to handle audio data.
Remove the abuse by creating private audio buffer structures with a
videobuf_dmabuf field.
Signed-off-by: NLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: NMauro Carvalho Chehab <mchehab@redhat.com>
上级 95268403
...@@ -54,6 +54,12 @@ ...@@ -54,6 +54,12 @@
Data type declarations - Can be moded to a header file later Data type declarations - Can be moded to a header file later
****************************************************************************/ ****************************************************************************/
struct cx88_audio_buffer {
unsigned int bpl;
struct btcx_riscmem risc;
struct videobuf_dmabuf dma;
};
struct cx88_audio_dev { struct cx88_audio_dev {
struct cx88_core *core; struct cx88_core *core;
struct cx88_dmaqueue q; struct cx88_dmaqueue q;
...@@ -75,7 +81,7 @@ struct cx88_audio_dev { ...@@ -75,7 +81,7 @@ struct cx88_audio_dev {
struct videobuf_dmabuf *dma_risc; struct videobuf_dmabuf *dma_risc;
struct cx88_buffer *buf; struct cx88_audio_buffer *buf;
struct snd_pcm_substream *substream; struct snd_pcm_substream *substream;
}; };
...@@ -123,7 +129,7 @@ MODULE_PARM_DESC(debug,"enable debug messages"); ...@@ -123,7 +129,7 @@ MODULE_PARM_DESC(debug,"enable debug messages");
static int _cx88_start_audio_dma(snd_cx88_card_t *chip) static int _cx88_start_audio_dma(snd_cx88_card_t *chip)
{ {
struct cx88_buffer *buf = chip->buf; struct cx88_audio_buffer *buf = chip->buf;
struct cx88_core *core=chip->core; struct cx88_core *core=chip->core;
struct sram_channel *audio_ch = &cx88_sram_channels[SRAM_CH25]; struct sram_channel *audio_ch = &cx88_sram_channels[SRAM_CH25];
...@@ -376,7 +382,7 @@ static int snd_cx88_hw_params(struct snd_pcm_substream * substream, ...@@ -376,7 +382,7 @@ static int snd_cx88_hw_params(struct snd_pcm_substream * substream,
snd_cx88_card_t *chip = snd_pcm_substream_chip(substream); snd_cx88_card_t *chip = snd_pcm_substream_chip(substream);
struct videobuf_dmabuf *dma; struct videobuf_dmabuf *dma;
struct cx88_buffer *buf; struct cx88_audio_buffer *buf;
int ret; int ret;
if (substream->runtime->dma_area) { if (substream->runtime->dma_area) {
...@@ -391,21 +397,16 @@ static int snd_cx88_hw_params(struct snd_pcm_substream * substream, ...@@ -391,21 +397,16 @@ static int snd_cx88_hw_params(struct snd_pcm_substream * substream,
BUG_ON(!chip->dma_size); BUG_ON(!chip->dma_size);
BUG_ON(chip->num_periods & (chip->num_periods-1)); BUG_ON(chip->num_periods & (chip->num_periods-1));
buf = videobuf_sg_alloc(sizeof(*buf)); buf = kzalloc(sizeof(*buf), GFP_KERNEL);
if (NULL == buf) if (NULL == buf)
return -ENOMEM; return -ENOMEM;
buf->vb.memory = V4L2_MEMORY_MMAP; buf->bpl = chip->period_size;
buf->vb.field = V4L2_FIELD_NONE;
buf->vb.width = chip->period_size;
buf->bpl = chip->period_size;
buf->vb.height = chip->num_periods;
buf->vb.size = chip->dma_size;
dma = videobuf_to_dma(&buf->vb); dma = &buf->dma;
videobuf_dma_init(dma); videobuf_dma_init(dma);
ret = videobuf_dma_init_kernel(dma, PCI_DMA_FROMDEVICE, ret = videobuf_dma_init_kernel(dma, PCI_DMA_FROMDEVICE,
(PAGE_ALIGN(buf->vb.size) >> PAGE_SHIFT)); (PAGE_ALIGN(chip->dma_size) >> PAGE_SHIFT));
if (ret < 0) if (ret < 0)
goto error; goto error;
...@@ -414,7 +415,7 @@ static int snd_cx88_hw_params(struct snd_pcm_substream * substream, ...@@ -414,7 +415,7 @@ static int snd_cx88_hw_params(struct snd_pcm_substream * substream,
goto error; goto error;
ret = cx88_risc_databuffer(chip->pci, &buf->risc, dma->sglist, ret = cx88_risc_databuffer(chip->pci, &buf->risc, dma->sglist,
buf->vb.width, buf->vb.height, 1); chip->period_size, chip->num_periods, 1);
if (ret < 0) if (ret < 0)
goto error; goto error;
...@@ -422,8 +423,6 @@ static int snd_cx88_hw_params(struct snd_pcm_substream * substream, ...@@ -422,8 +423,6 @@ static int snd_cx88_hw_params(struct snd_pcm_substream * substream,
buf->risc.jmp[0] = cpu_to_le32(RISC_JUMP|RISC_IRQ1|RISC_CNT_INC); buf->risc.jmp[0] = cpu_to_le32(RISC_JUMP|RISC_IRQ1|RISC_CNT_INC);
buf->risc.jmp[1] = cpu_to_le32(buf->risc.dma); buf->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
buf->vb.state = VIDEOBUF_PREPARED;
chip->buf = buf; chip->buf = buf;
chip->dma_risc = dma; chip->dma_risc = dma;
......
...@@ -55,6 +55,12 @@ ...@@ -55,6 +55,12 @@
static struct snd_card *snd_cx25821_cards[SNDRV_CARDS]; static struct snd_card *snd_cx25821_cards[SNDRV_CARDS];
static int devno; static int devno;
struct cx25821_audio_buffer {
unsigned int bpl;
struct btcx_riscmem risc;
struct videobuf_dmabuf dma;
};
struct cx25821_audio_dev { struct cx25821_audio_dev {
struct cx25821_dev *dev; struct cx25821_dev *dev;
struct cx25821_dmaqueue q; struct cx25821_dmaqueue q;
...@@ -77,7 +83,7 @@ struct cx25821_audio_dev { ...@@ -77,7 +83,7 @@ struct cx25821_audio_dev {
struct videobuf_dmabuf *dma_risc; struct videobuf_dmabuf *dma_risc;
struct cx25821_buffer *buf; struct cx25821_audio_buffer *buf;
struct snd_pcm_substream *substream; struct snd_pcm_substream *substream;
}; };
...@@ -136,7 +142,7 @@ MODULE_PARM_DESC(debug, "enable debug messages"); ...@@ -136,7 +142,7 @@ MODULE_PARM_DESC(debug, "enable debug messages");
static int _cx25821_start_audio_dma(struct cx25821_audio_dev *chip) static int _cx25821_start_audio_dma(struct cx25821_audio_dev *chip)
{ {
struct cx25821_buffer *buf = chip->buf; struct cx25821_audio_buffer *buf = chip->buf;
struct cx25821_dev *dev = chip->dev; struct cx25821_dev *dev = chip->dev;
struct sram_channel *audio_ch = struct sram_channel *audio_ch =
&cx25821_sram_channels[AUDIO_SRAM_CHANNEL]; &cx25821_sram_channels[AUDIO_SRAM_CHANNEL];
...@@ -432,7 +438,7 @@ static int snd_cx25821_hw_params(struct snd_pcm_substream *substream, ...@@ -432,7 +438,7 @@ static int snd_cx25821_hw_params(struct snd_pcm_substream *substream,
struct cx25821_audio_dev *chip = snd_pcm_substream_chip(substream); struct cx25821_audio_dev *chip = snd_pcm_substream_chip(substream);
struct videobuf_dmabuf *dma; struct videobuf_dmabuf *dma;
struct cx25821_buffer *buf; struct cx25821_audio_buffer *buf;
int ret; int ret;
if (substream->runtime->dma_area) { if (substream->runtime->dma_area) {
...@@ -447,25 +453,19 @@ static int snd_cx25821_hw_params(struct snd_pcm_substream *substream, ...@@ -447,25 +453,19 @@ static int snd_cx25821_hw_params(struct snd_pcm_substream *substream,
BUG_ON(!chip->dma_size); BUG_ON(!chip->dma_size);
BUG_ON(chip->num_periods & (chip->num_periods - 1)); BUG_ON(chip->num_periods & (chip->num_periods - 1));
buf = videobuf_sg_alloc(sizeof(*buf)); buf = kzalloc(sizeof(*buf), GFP_KERNEL);
if (NULL == buf) if (NULL == buf)
return -ENOMEM; return -ENOMEM;
if (chip->period_size > AUDIO_LINE_SIZE) if (chip->period_size > AUDIO_LINE_SIZE)
chip->period_size = AUDIO_LINE_SIZE; chip->period_size = AUDIO_LINE_SIZE;
buf->vb.memory = V4L2_MEMORY_MMAP;
buf->vb.field = V4L2_FIELD_NONE;
buf->vb.width = chip->period_size;
buf->bpl = chip->period_size; buf->bpl = chip->period_size;
buf->vb.height = chip->num_periods;
buf->vb.size = chip->dma_size;
dma = videobuf_to_dma(&buf->vb); dma = &buf->dma;
videobuf_dma_init(dma); videobuf_dma_init(dma);
ret = videobuf_dma_init_kernel(dma, PCI_DMA_FROMDEVICE, ret = videobuf_dma_init_kernel(dma, PCI_DMA_FROMDEVICE,
(PAGE_ALIGN(buf->vb.size) >> (PAGE_ALIGN(chip->dma_size) >>
PAGE_SHIFT)); PAGE_SHIFT));
if (ret < 0) if (ret < 0)
goto error; goto error;
...@@ -476,7 +476,8 @@ static int snd_cx25821_hw_params(struct snd_pcm_substream *substream, ...@@ -476,7 +476,8 @@ static int snd_cx25821_hw_params(struct snd_pcm_substream *substream,
ret = ret =
cx25821_risc_databuffer_audio(chip->pci, &buf->risc, dma->sglist, cx25821_risc_databuffer_audio(chip->pci, &buf->risc, dma->sglist,
buf->vb.width, buf->vb.height, 1); chip->period_size, chip->num_periods,
1);
if (ret < 0) { if (ret < 0) {
printk(KERN_INFO printk(KERN_INFO
"DEBUG: ERROR after cx25821_risc_databuffer_audio()\n"); "DEBUG: ERROR after cx25821_risc_databuffer_audio()\n");
...@@ -488,8 +489,6 @@ static int snd_cx25821_hw_params(struct snd_pcm_substream *substream, ...@@ -488,8 +489,6 @@ static int snd_cx25821_hw_params(struct snd_pcm_substream *substream,
buf->risc.jmp[1] = cpu_to_le32(buf->risc.dma); buf->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
buf->risc.jmp[2] = cpu_to_le32(0); /* bits 63-32 */ buf->risc.jmp[2] = cpu_to_le32(0); /* bits 63-32 */
buf->vb.state = VIDEOBUF_PREPARED;
chip->buf = buf; chip->buf = buf;
chip->dma_risc = dma; chip->dma_risc = dma;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册