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: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
committed by
Mauro Carvalho Chehab
parent
952684035a
commit
fecfedeb27
@@ -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 {
|
|||||||
|
|
||||||
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");
|
|||||||
|
|
||||||
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,
|
|||||||
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,
|
|||||||
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->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_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,
|
|||||||
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,
|
|||||||
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 @@
|
|||||||
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 {
|
|||||||
|
|
||||||
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");
|
|||||||
|
|
||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
|
|
||||||
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,
|
|||||||
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;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user