To compile this driver as a module, choose M here: the
module will be called cx25821
-
+
config VIDEO_CX25821_ALSA
tristate "Conexant 25821 DMA audio support"
depends on VIDEO_CX25821 && SND && EXPERIMENTAL
PCI device.
To compile this driver as a module, choose M here: the
- module will be called cx25821-alsa.
+ module will be called cx25821-alsa.
unsigned long iobase;
spinlock_t reg_lock;
- atomic_t count;
+ atomic_t count;
unsigned int dma_size;
unsigned int period_size;
\r
\r
int cx25821_sram_channel_setup_upstream_audio(struct cx25821_dev *dev,\r
- struct sram_channel *ch,\r
- unsigned int bpl, u32 risc)\r
+ struct sram_channel *ch,\r
+ unsigned int bpl, u32 risc)\r
{\r
unsigned int i, lines;\r
u32 cdt;\r
\r
if (lines > 3) \r
{\r
- lines = 3;\r
+ lines = 3;\r
}\r
\r
BUG_ON(lines < 2);\r
cx_write(ch->cmds_start + 8, cdt); \r
cx_write(ch->cmds_start + 12, AUDIO_CDT_SIZE_QW); \r
cx_write(ch->cmds_start + 16, ch->ctrl_start); \r
- \r
+ \r
//IQ size\r
cx_write(ch->cmds_start + 20, AUDIO_IQ_SIZE_DW); \r
\r
\r
\r
static __le32 *cx25821_risc_field_upstream_audio( struct cx25821_dev *dev, __le32 *rp, \r
- dma_addr_t databuf_phys_addr,\r
- unsigned int bpl, int fifo_enable)\r
+ dma_addr_t databuf_phys_addr,\r
+ unsigned int bpl, int fifo_enable)\r
{\r
unsigned int line;\r
struct sram_channel *sram_ch = &dev->sram_channels[dev->_audio_upstream_channel_select];\r
int offset = 0;\r
- \r
+ \r
\r
/* scan lines */\r
for (line = 0; line < LINES_PER_AUDIO_BUFFER; line++) \r
{ \r
*(rp++) = cpu_to_le32(RISC_READ|RISC_SOL|RISC_EOL|bpl); \r
- *(rp++) = cpu_to_le32(databuf_phys_addr + offset); \r
- *(rp++) = cpu_to_le32(0); /* bits 63-32 */ \r
+ *(rp++) = cpu_to_le32(databuf_phys_addr + offset); \r
+ *(rp++) = cpu_to_le32(0); /* bits 63-32 */ \r
\r
- // Check if we need to enable the FIFO after the first 3 lines \r
- // For the upstream audio channel, the risc engine will enable the FIFO. \r
- if ( fifo_enable && line == 2 )\r
+ // Check if we need to enable the FIFO after the first 3 lines \r
+ // For the upstream audio channel, the risc engine will enable the FIFO. \r
+ if ( fifo_enable && line == 2 )\r
{\r
*(rp++) = RISC_WRITECR;\r
*(rp++) = sram_ch->dma_ctl;\r
*(rp++) = sram_ch->fld_aud_fifo_en;\r
*(rp++) = 0x00000020;\r
- } \r
- \r
- offset += AUDIO_LINE_SIZE;\r
+ } \r
+ \r
+ offset += AUDIO_LINE_SIZE;\r
}\r
- \r
+ \r
return rp;\r
}\r
\r
int cx25821_risc_buffer_upstream_audio( struct cx25821_dev *dev, \r
- struct pci_dev *pci, \r
- unsigned int bpl, unsigned int lines)\r
+ struct pci_dev *pci, \r
+ unsigned int bpl, unsigned int lines)\r
{\r
__le32 *rp;\r
int fifo_enable = 0;\r
int risc_flag = RISC_CNT_INC;\r
dma_addr_t risc_phys_jump_addr;\r
\r
- \r
+ \r
/* Virtual address of Risc buffer program */\r
rp = dev->_risc_virt_addr;\r
\r
\r
for( frame = 0; frame < NUM_AUDIO_FRAMES; frame++ )\r
{ \r
- databuf_offset = frame_size * frame; \r
- \r
- if( frame == 0 )\r
- {\r
- fifo_enable = 1;\r
- risc_flag = RISC_CNT_RESET; \r
- }\r
- else\r
- {\r
- fifo_enable = 0;\r
- risc_flag = RISC_CNT_INC;\r
- }\r
- \r
- //Calculate physical jump address \r
- if( (frame+1) == NUM_AUDIO_FRAMES )\r
- {\r
- risc_phys_jump_addr = dev->_risc_phys_start_addr + RISC_SYNC_INSTRUCTION_SIZE; \r
- }\r
- else\r
- {\r
- risc_phys_jump_addr = dev->_risc_phys_start_addr + RISC_SYNC_INSTRUCTION_SIZE + AUDIO_RISC_DMA_BUF_SIZE*(frame+1); \r
- }\r
- \r
- rp = cx25821_risc_field_upstream_audio(dev, rp, dev->_audiodata_buf_phys_addr+databuf_offset, bpl, fifo_enable); \r
- \r
- \r
- if( USE_RISC_NOOP_AUDIO )\r
- {\r
- for( i = 0; i < NUM_NO_OPS; i++ )\r
- {\r
- *(rp++) = cpu_to_le32(RISC_NOOP);\r
- }\r
- }\r
- \r
-\r
- // Loop to (Nth)FrameRISC or to Start of Risc program & generate IRQ \r
- *(rp++) = cpu_to_le32(RISC_JUMP|RISC_IRQ1|risc_flag); \r
- *(rp++) = cpu_to_le32(risc_phys_jump_addr); \r
- *(rp++) = cpu_to_le32(0); \r
-\r
- //Recalculate virtual address based on frame index \r
- rp = dev->_risc_virt_addr + RISC_SYNC_INSTRUCTION_SIZE/4 + (AUDIO_RISC_DMA_BUF_SIZE*(frame+1)/4 ) ; \r
+ databuf_offset = frame_size * frame; \r
+ \r
+ if( frame == 0 )\r
+ {\r
+ fifo_enable = 1;\r
+ risc_flag = RISC_CNT_RESET; \r
+ }\r
+ else\r
+ {\r
+ fifo_enable = 0;\r
+ risc_flag = RISC_CNT_INC;\r
+ }\r
+ \r
+ //Calculate physical jump address \r
+ if( (frame+1) == NUM_AUDIO_FRAMES )\r
+ {\r
+ risc_phys_jump_addr = dev->_risc_phys_start_addr + RISC_SYNC_INSTRUCTION_SIZE; \r
+ }\r
+ else\r
+ {\r
+ risc_phys_jump_addr = dev->_risc_phys_start_addr + RISC_SYNC_INSTRUCTION_SIZE + AUDIO_RISC_DMA_BUF_SIZE*(frame+1); \r
+ }\r
+ \r
+ rp = cx25821_risc_field_upstream_audio(dev, rp, dev->_audiodata_buf_phys_addr+databuf_offset, bpl, fifo_enable); \r
+ \r
+ \r
+ if( USE_RISC_NOOP_AUDIO )\r
+ {\r
+ for( i = 0; i < NUM_NO_OPS; i++ )\r
+ {\r
+ *(rp++) = cpu_to_le32(RISC_NOOP);\r
+ }\r
+ }\r
+ \r
+\r
+ // Loop to (Nth)FrameRISC or to Start of Risc program & generate IRQ \r
+ *(rp++) = cpu_to_le32(RISC_JUMP|RISC_IRQ1|risc_flag); \r
+ *(rp++) = cpu_to_le32(risc_phys_jump_addr); \r
+ *(rp++) = cpu_to_le32(0); \r
+\r
+ //Recalculate virtual address based on frame index \r
+ rp = dev->_risc_virt_addr + RISC_SYNC_INSTRUCTION_SIZE/4 + (AUDIO_RISC_DMA_BUF_SIZE*(frame+1)/4 ) ; \r
}\r
\r
return 0;\r
\r
if( !dev->_audio_is_running )\r
{\r
- printk("cx25821: No audio file is currently running so return!\n");\r
- return;\r
+ printk("cx25821: No audio file is currently running so return!\n");\r
+ return;\r
}\r
- \r
+ \r
//Disable RISC interrupts\r
cx_write( sram_ch->int_msk, 0 );\r
\r
\r
//Clear data buffer memory\r
if( dev->_audiodata_buf_virt_addr )\r
- memset( dev->_audiodata_buf_virt_addr, 0, dev->_audiodata_buf_size ); \r
- \r
+ memset( dev->_audiodata_buf_virt_addr, 0, dev->_audiodata_buf_size ); \r
+ \r
dev->_audio_is_running = 0;\r
dev->_is_first_audio_frame = 0;\r
dev->_audioframe_count = 0;\r
\r
if( dev->_irq_audio_queues )\r
{\r
- kfree(dev->_irq_audio_queues); \r
- dev->_irq_audio_queues = NULL; \r
+ kfree(dev->_irq_audio_queues); \r
+ dev->_irq_audio_queues = NULL; \r
} \r
\r
if( dev->_audiofilename != NULL )\r
- kfree(dev->_audiofilename); \r
+ kfree(dev->_audiofilename); \r
}\r
\r
\r
{\r
if( dev->_audio_is_running )\r
{\r
- cx25821_stop_upstream_audio(dev);\r
+ cx25821_stop_upstream_audio(dev);\r
}\r
\r
cx25821_free_memory_audio(dev);\r
\r
\r
if( dev->_audiofile_status == END_OF_FILE ) \r
- return 0;\r
- \r
+ return 0;\r
+ \r
myfile = filp_open( dev->_audiofilename, O_RDONLY | O_LARGEFILE, 0 );\r
\r
\r
if (IS_ERR(myfile)) \r
{\r
- const int open_errno = -PTR_ERR(myfile);\r
- printk("%s(): ERROR opening file(%s) with errno = %d! \n", __func__, dev->_audiofilename, open_errno);\r
- return PTR_ERR(myfile);\r
+ const int open_errno = -PTR_ERR(myfile);\r
+ printk("%s(): ERROR opening file(%s) with errno = %d! \n", __func__, dev->_audiofilename, open_errno);\r
+ return PTR_ERR(myfile);\r
} \r
else \r
{ \r
- if( !(myfile->f_op) )\r
- { \r
- printk("%s: File has no file operations registered!\n", __func__);\r
- filp_close(myfile, NULL);\r
- return -EIO;\r
- }\r
- \r
- \r
- if( !myfile->f_op->read ) \r
- { \r
- printk("%s: File has no READ operations registered! \n", __func__);\r
- filp_close(myfile, NULL);\r
- return -EIO;\r
- }\r
- \r
- pos = myfile->f_pos; \r
- old_fs = get_fs(); \r
- set_fs(KERNEL_DS);\r
- \r
- \r
- for( i = 0; i < dev->_audio_lines_count; i++ )\r
- {\r
- pos = file_offset; \r
- \r
- vfs_read_retval = vfs_read(myfile, mybuf, line_size, &pos); \r
- \r
- \r
- if( vfs_read_retval > 0 && vfs_read_retval == line_size && dev->_audiodata_buf_virt_addr != NULL ) \r
- {\r
- memcpy( (void*)(dev->_audiodata_buf_virt_addr+frame_offset/4), mybuf, vfs_read_retval); \r
- } \r
- \r
- file_offset += vfs_read_retval;\r
- frame_offset += vfs_read_retval;\r
-\r
- if( vfs_read_retval < line_size )\r
- { \r
- printk(KERN_INFO "Done: exit %s() since no more bytes to read from Audio file.\n", __func__ );\r
- break;\r
- } \r
- }\r
- \r
- if( i > 0 ) \r
- dev->_audioframe_count++; \r
-\r
- dev->_audiofile_status = (vfs_read_retval == line_size) ? IN_PROGRESS : END_OF_FILE; \r
-\r
- \r
- set_fs(old_fs); \r
- filp_close(myfile, NULL); \r
+ if( !(myfile->f_op) )\r
+ { \r
+ printk("%s: File has no file operations registered!\n", __func__);\r
+ filp_close(myfile, NULL);\r
+ return -EIO;\r
+ }\r
+ \r
+ \r
+ if( !myfile->f_op->read ) \r
+ { \r
+ printk("%s: File has no READ operations registered! \n", __func__);\r
+ filp_close(myfile, NULL);\r
+ return -EIO;\r
+ }\r
+ \r
+ pos = myfile->f_pos; \r
+ old_fs = get_fs(); \r
+ set_fs(KERNEL_DS);\r
+ \r
+ \r
+ for( i = 0; i < dev->_audio_lines_count; i++ )\r
+ {\r
+ pos = file_offset; \r
+ \r
+ vfs_read_retval = vfs_read(myfile, mybuf, line_size, &pos); \r
+ \r
+ \r
+ if( vfs_read_retval > 0 && vfs_read_retval == line_size && dev->_audiodata_buf_virt_addr != NULL ) \r
+ {\r
+ memcpy( (void*)(dev->_audiodata_buf_virt_addr+frame_offset/4), mybuf, vfs_read_retval); \r
+ } \r
+ \r
+ file_offset += vfs_read_retval;\r
+ frame_offset += vfs_read_retval;\r
+\r
+ if( vfs_read_retval < line_size )\r
+ { \r
+ printk(KERN_INFO "Done: exit %s() since no more bytes to read from Audio file.\n", __func__ );\r
+ break;\r
+ } \r
+ }\r
+ \r
+ if( i > 0 ) \r
+ dev->_audioframe_count++; \r
+\r
+ dev->_audiofile_status = (vfs_read_retval == line_size) ? IN_PROGRESS : END_OF_FILE; \r
+\r
+ \r
+ set_fs(old_fs); \r
+ filp_close(myfile, NULL); \r
}\r
\r
return 0;\r
\r
if( !dev )\r
{\r
- printk("ERROR %s(): since container_of(work_struct) FAILED! \n", __func__ );\r
- return;\r
+ printk("ERROR %s(): since container_of(work_struct) FAILED! \n", __func__ );\r
+ return;\r
}\r
\r
cx25821_get_audio_data( dev, &dev->sram_channels[dev->_audio_upstream_channel_select] );\r
loff_t pos;\r
loff_t offset = (unsigned long)0;\r
mm_segment_t old_fs;\r
- \r
+ \r
\r
myfile = filp_open( dev->_audiofilename, O_RDONLY | O_LARGEFILE, 0 );\r
\r
\r
if (IS_ERR(myfile)) \r
{\r
- const int open_errno = -PTR_ERR(myfile);\r
- printk("%s(): ERROR opening file(%s) with errno = %d! \n", __func__, dev->_audiofilename, open_errno);\r
- return PTR_ERR(myfile);\r
+ const int open_errno = -PTR_ERR(myfile);\r
+ printk("%s(): ERROR opening file(%s) with errno = %d! \n", __func__, dev->_audiofilename, open_errno);\r
+ return PTR_ERR(myfile);\r
} \r
else \r
{\r
- if( !(myfile->f_op) )\r
- { \r
- printk("%s: File has no file operations registered! \n", __func__);\r
- filp_close(myfile, NULL);\r
- return -EIO;\r
- }\r
- \r
- \r
- if( !myfile->f_op->read )\r
- { \r
- printk("%s: File has no READ operations registered! \n", __func__);\r
- filp_close(myfile, NULL);\r
- return -EIO;\r
- }\r
- \r
- pos = myfile->f_pos;\r
- old_fs = get_fs(); \r
- set_fs(KERNEL_DS);\r
- \r
- \r
- for( j = 0; j < NUM_AUDIO_FRAMES; j++ ) \r
- { \r
- for( i = 0; i < dev->_audio_lines_count; i++ )\r
- {\r
- pos = offset;\r
-\r
- vfs_read_retval = vfs_read(myfile, mybuf, line_size, &pos); \r
- \r
- \r
- if( vfs_read_retval > 0 && vfs_read_retval == line_size && dev->_audiodata_buf_virt_addr != NULL ) \r
- { \r
- memcpy( (void*)(dev->_audiodata_buf_virt_addr+offset/4), mybuf, vfs_read_retval); \r
- } \r
- \r
- offset += vfs_read_retval;\r
-\r
- if( vfs_read_retval < line_size )\r
- { \r
- printk(KERN_INFO "Done: exit %s() since no more bytes to read from Audio file.\n", __func__ );\r
- break;\r
- } \r
- }\r
- \r
- if( i > 0 ) \r
- {\r
- dev->_audioframe_count++;\r
- } \r
- \r
- if( vfs_read_retval < line_size )\r
- {\r
- break;\r
- } \r
- }\r
- \r
- dev->_audiofile_status = (vfs_read_retval == line_size) ? IN_PROGRESS : END_OF_FILE; \r
- \r
- set_fs(old_fs); \r
- myfile->f_pos = 0;\r
- filp_close(myfile, NULL); \r
+ if( !(myfile->f_op) )\r
+ { \r
+ printk("%s: File has no file operations registered! \n", __func__);\r
+ filp_close(myfile, NULL);\r
+ return -EIO;\r
+ }\r
+ \r
+ \r
+ if( !myfile->f_op->read )\r
+ { \r
+ printk("%s: File has no READ operations registered! \n", __func__);\r
+ filp_close(myfile, NULL);\r
+ return -EIO;\r
+ }\r
+ \r
+ pos = myfile->f_pos;\r
+ old_fs = get_fs(); \r
+ set_fs(KERNEL_DS);\r
+ \r
+ \r
+ for( j = 0; j < NUM_AUDIO_FRAMES; j++ ) \r
+ { \r
+ for( i = 0; i < dev->_audio_lines_count; i++ )\r
+ {\r
+ pos = offset;\r
+\r
+ vfs_read_retval = vfs_read(myfile, mybuf, line_size, &pos); \r
+ \r
+ \r
+ if( vfs_read_retval > 0 && vfs_read_retval == line_size && dev->_audiodata_buf_virt_addr != NULL ) \r
+ { \r
+ memcpy( (void*)(dev->_audiodata_buf_virt_addr+offset/4), mybuf, vfs_read_retval); \r
+ } \r
+ \r
+ offset += vfs_read_retval;\r
+\r
+ if( vfs_read_retval < line_size )\r
+ { \r
+ printk(KERN_INFO "Done: exit %s() since no more bytes to read from Audio file.\n", __func__ );\r
+ break;\r
+ } \r
+ }\r
+ \r
+ if( i > 0 ) \r
+ {\r
+ dev->_audioframe_count++;\r
+ } \r
+ \r
+ if( vfs_read_retval < line_size )\r
+ {\r
+ break;\r
+ } \r
+ }\r
+ \r
+ dev->_audiofile_status = (vfs_read_retval == line_size) ? IN_PROGRESS : END_OF_FILE; \r
+ \r
+ set_fs(old_fs); \r
+ myfile->f_pos = 0;\r
+ filp_close(myfile, NULL); \r
}\r
\r
return 0;\r
}\r
\r
static int cx25821_audio_upstream_buffer_prepare(struct cx25821_dev *dev,\r
- struct sram_channel *sram_ch,\r
- int bpl)\r
+ struct sram_channel *sram_ch,\r
+ int bpl)\r
{\r
int ret = 0;\r
dma_addr_t dma_addr;\r
dma_addr_t data_dma_addr; \r
- \r
+ \r
\r
cx25821_free_memory_audio(dev); \r
\r
\r
if (!dev->_risc_virt_addr)\r
{\r
- printk("cx25821 ERROR: pci_alloc_consistent() FAILED to allocate memory for RISC program! Returning.\n");\r
+ printk("cx25821 ERROR: pci_alloc_consistent() FAILED to allocate memory for RISC program! Returning.\n");\r
return -ENOMEM;\r
}\r
\r
\r
if (!dev->_audiodata_buf_virt_addr)\r
{ \r
- printk("cx25821 ERROR: pci_alloc_consistent() FAILED to allocate memory for data buffer! Returning. \n");\r
+ printk("cx25821 ERROR: pci_alloc_consistent() FAILED to allocate memory for data buffer! Returning. \n");\r
return -ENOMEM;\r
}\r
\r
\r
ret = cx25821_openfile_audio(dev, sram_ch); \r
if( ret < 0 )\r
- return ret;\r
- \r
+ return ret;\r
+ \r
\r
//Creating RISC programs\r
ret = cx25821_risc_buffer_upstream_audio(dev, dev->pci, bpl, dev->_audio_lines_count ); \r
if (status & FLD_AUD_SRC_RISCI1) \r
{\r
//Get interrupt_index of the program that interrupted\r
- u32 prog_cnt = cx_read( channel->gpcnt );\r
+ u32 prog_cnt = cx_read( channel->gpcnt );\r
\r
- //Since we've identified our IRQ, clear our bits from the interrupt mask and interrupt status registers\r
- cx_write(channel->int_msk, 0); \r
- cx_write(channel->int_stat, cx_read(channel->int_stat) );\r
+ //Since we've identified our IRQ, clear our bits from the interrupt mask and interrupt status registers\r
+ cx_write(channel->int_msk, 0); \r
+ cx_write(channel->int_stat, cx_read(channel->int_stat) );\r
\r
spin_lock(&dev->slock); \r
- \r
- \r
- while(prog_cnt != dev->_last_index_irq)\r
- { \r
- //Update _last_index_irq\r
- if(dev->_last_index_irq < (NUMBER_OF_PROGRAMS-1))\r
- {\r
- dev->_last_index_irq++;\r
- }\r
- else\r
- {\r
- dev->_last_index_irq = 0;\r
- }\r
-\r
- dev->_audioframe_index = dev->_last_index_irq;\r
- \r
- queue_work(dev->_irq_audio_queues, &dev->_audio_work_entry); \r
- }\r
-\r
- \r
- if ( dev->_is_first_audio_frame )\r
- {\r
- dev->_is_first_audio_frame = 0; \r
- \r
- if( dev->_risc_virt_start_addr != NULL )\r
- {\r
- risc_phys_jump_addr = dev->_risc_phys_start_addr + RISC_SYNC_INSTRUCTION_SIZE + AUDIO_RISC_DMA_BUF_SIZE; \r
- \r
- rp = cx25821_risc_field_upstream_audio(dev, dev->_risc_virt_start_addr+1, dev->_audiodata_buf_phys_addr, AUDIO_LINE_SIZE, FIFO_DISABLE); \r
-\r
- if( USE_RISC_NOOP_AUDIO )\r
- {\r
- for( i = 0; i < NUM_NO_OPS; i++ )\r
- {\r
- *(rp++) = cpu_to_le32(RISC_NOOP);\r
- }\r
- }\r
- \r
- // Jump to 2nd Audio Frame\r
- *(rp++) = cpu_to_le32(RISC_JUMP | RISC_IRQ1 | RISC_CNT_RESET); \r
- *(rp++) = cpu_to_le32(risc_phys_jump_addr); \r
- *(rp++) = cpu_to_le32(0); \r
- }\r
- }\r
- \r
+ \r
+ \r
+ while(prog_cnt != dev->_last_index_irq)\r
+ { \r
+ //Update _last_index_irq\r
+ if(dev->_last_index_irq < (NUMBER_OF_PROGRAMS-1))\r
+ {\r
+ dev->_last_index_irq++;\r
+ }\r
+ else\r
+ {\r
+ dev->_last_index_irq = 0;\r
+ }\r
+\r
+ dev->_audioframe_index = dev->_last_index_irq;\r
+ \r
+ queue_work(dev->_irq_audio_queues, &dev->_audio_work_entry); \r
+ }\r
+\r
+ \r
+ if ( dev->_is_first_audio_frame )\r
+ {\r
+ dev->_is_first_audio_frame = 0; \r
+ \r
+ if( dev->_risc_virt_start_addr != NULL )\r
+ {\r
+ risc_phys_jump_addr = dev->_risc_phys_start_addr + RISC_SYNC_INSTRUCTION_SIZE + AUDIO_RISC_DMA_BUF_SIZE; \r
+ \r
+ rp = cx25821_risc_field_upstream_audio(dev, dev->_risc_virt_start_addr+1, dev->_audiodata_buf_phys_addr, AUDIO_LINE_SIZE, FIFO_DISABLE); \r
+\r
+ if( USE_RISC_NOOP_AUDIO )\r
+ {\r
+ for( i = 0; i < NUM_NO_OPS; i++ )\r
+ {\r
+ *(rp++) = cpu_to_le32(RISC_NOOP);\r
+ }\r
+ }\r
+ \r
+ // Jump to 2nd Audio Frame\r
+ *(rp++) = cpu_to_le32(RISC_JUMP | RISC_IRQ1 | RISC_CNT_RESET); \r
+ *(rp++) = cpu_to_le32(risc_phys_jump_addr); \r
+ *(rp++) = cpu_to_le32(0); \r
+ }\r
+ }\r
+ \r
spin_unlock(&dev->slock); \r
}\r
else\r
{\r
- if(status & FLD_AUD_SRC_OF)\r
- printk("%s: Audio Received Overflow Error Interrupt!\n", __func__);\r
+ if(status & FLD_AUD_SRC_OF)\r
+ printk("%s: Audio Received Overflow Error Interrupt!\n", __func__);\r
\r
- if(status & FLD_AUD_SRC_SYNC)\r
- printk("%s: Audio Received Sync Error Interrupt!\n", __func__);\r
+ if(status & FLD_AUD_SRC_SYNC)\r
+ printk("%s: Audio Received Sync Error Interrupt!\n", __func__);\r
\r
- if(status & FLD_AUD_SRC_OPC_ERR)\r
- printk("%s: Audio Received OpCode Error Interrupt!\n", __func__); \r
- \r
- // Read and write back the interrupt status register to clear our bits\r
- cx_write(channel->int_stat, cx_read(channel->int_stat) ); \r
+ if(status & FLD_AUD_SRC_OPC_ERR)\r
+ printk("%s: Audio Received OpCode Error Interrupt!\n", __func__); \r
+ \r
+ // Read and write back the interrupt status register to clear our bits\r
+ cx_write(channel->int_stat, cx_read(channel->int_stat) ); \r
}\r
\r
- \r
+ \r
if( dev->_audiofile_status == END_OF_FILE )\r
{ \r
- printk("cx25821: EOF Channel Audio Framecount = %d\n", dev->_audioframe_count );\r
- return -1;\r
+ printk("cx25821: EOF Channel Audio Framecount = %d\n", dev->_audioframe_count );\r
+ return -1;\r
}\r
\r
//ElSE, set the interrupt mask register, re-enable irq. \r
int_msk_tmp = cx_read( channel->int_msk ); \r
cx_write( channel->int_msk, int_msk_tmp |= _intr_msk ); \r
- \r
+ \r
return 0;\r
}\r
\r
\r
\r
if( !dev )\r
- return -1;\r
- \r
+ return -1;\r
+ \r
\r
sram_ch = &dev->sram_channels[dev->_audio_upstream_channel_select]; \r
\r
// Only deal with our interrupt\r
if(audio_status)\r
{\r
- handled = cx25821_audio_upstream_irq(dev, dev->_audio_upstream_channel_select, audio_status);\r
+ handled = cx25821_audio_upstream_irq(dev, dev->_audio_upstream_channel_select, audio_status);\r
}\r
\r
\r
if( handled < 0 )\r
{ \r
- cx25821_stop_upstream_audio(dev);\r
+ cx25821_stop_upstream_audio(dev);\r
}\r
else\r
{\r
- handled += handled; \r
+ handled += handled; \r
} \r
\r
return IRQ_RETVAL(handled);\r
\r
do\r
{\r
- //Wait 10 microsecond before checking to see if the FIFO is turned ON.\r
- udelay(10);\r
-\r
- tmp = cx_read( sram_ch->dma_ctl );\r
- \r
- if(count++ > 1000) //10 millisecond timeout \r
- {\r
- printk("cx25821 ERROR: %s() fifo is NOT turned on. Timeout!\n", __func__);\r
- return;\r
- }\r
- \r
+ //Wait 10 microsecond before checking to see if the FIFO is turned ON.\r
+ udelay(10);\r
+\r
+ tmp = cx_read( sram_ch->dma_ctl );\r
+ \r
+ if(count++ > 1000) //10 millisecond timeout \r
+ {\r
+ printk("cx25821 ERROR: %s() fifo is NOT turned on. Timeout!\n", __func__);\r
+ return;\r
+ }\r
+ \r
} while( !(tmp & sram_ch->fld_aud_fifo_en) );\r
- \r
+ \r
}\r
\r
\r
int cx25821_start_audio_dma_upstream(struct cx25821_dev *dev,\r
- struct sram_channel *sram_ch)\r
+ struct sram_channel *sram_ch)\r
{\r
u32 tmp = 0;\r
int err = 0;\r
\r
if( dev->_audio_is_running )\r
{\r
- printk("Audio Channel is still running so return!\n");\r
- return 0;\r
+ printk("Audio Channel is still running so return!\n");\r
+ return 0;\r
}\r
- \r
+ \r
dev->_audio_upstream_channel_select = channel_select; \r
sram_ch = &dev->sram_channels[channel_select]; \r
\r
\r
if(!dev->_irq_audio_queues)\r
{\r
- printk("cx25821 ERROR: create_singlethread_workqueue() for Audio FAILED!\n");\r
+ printk("cx25821 ERROR: create_singlethread_workqueue() for Audio FAILED!\n");\r
return -ENOMEM;\r
}\r
- \r
+ \r
\r
dev->_last_index_irq = 0; \r
dev->_audio_is_running = 0; \r
dev->_audio_lines_count = LINES_PER_AUDIO_BUFFER; \r
_line_size = AUDIO_LINE_SIZE; \r
\r
- \r
+ \r
if( dev->input_audiofilename )\r
{\r
- str_length = strlen(dev->input_audiofilename);\r
- dev->_audiofilename = (char *) kmalloc(str_length + 1, GFP_KERNEL); \r
- \r
- if( !dev->_audiofilename )\r
- goto error;\r
- \r
- memcpy(dev->_audiofilename, dev->input_audiofilename, str_length + 1); \r
-\r
- //Default if filename is empty string\r
- if( strcmp(dev->input_audiofilename,"") == 0) \r
- {\r
- dev->_audiofilename = "/root/audioGOOD.wav"; \r
- } \r
+ str_length = strlen(dev->input_audiofilename);\r
+ dev->_audiofilename = (char *) kmalloc(str_length + 1, GFP_KERNEL); \r
+ \r
+ if( !dev->_audiofilename )\r
+ goto error;\r
+ \r
+ memcpy(dev->_audiofilename, dev->input_audiofilename, str_length + 1); \r
+\r
+ //Default if filename is empty string\r
+ if( strcmp(dev->input_audiofilename,"") == 0) \r
+ {\r
+ dev->_audiofilename = "/root/audioGOOD.wav"; \r
+ } \r
}\r
else\r
{\r
- str_length = strlen(_defaultAudioName); \r
- dev->_audiofilename = (char *) kmalloc(str_length + 1, GFP_KERNEL); \r
- \r
- if( !dev->_audiofilename )\r
- goto error;\r
- \r
- memcpy(dev->_audiofilename, _defaultAudioName, str_length + 1);\r
+ str_length = strlen(_defaultAudioName); \r
+ dev->_audiofilename = (char *) kmalloc(str_length + 1, GFP_KERNEL); \r
+ \r
+ if( !dev->_audiofilename )\r
+ goto error;\r
+ \r
+ memcpy(dev->_audiofilename, _defaultAudioName, str_length + 1);\r
} \r
\r
\r
\r
return err;\r
}\r
-
/*
* Driver for the Conexant CX25821 PCIe bridge
*
- * Copyright (C) 2009 Conexant Systems Inc.
+ * Copyright (C) 2009 Conexant Systems Inc.
* Authors <shu.lin@conexant.com>, <hiep.huynh@conexant.com>
* Based on Steven Toth <stoth@linuxtv.org> cx23885 driver
*
dprintk(2, "jmp to stopper (0x%x)\n", buf->risc.jmp[1]);
if (!list_empty(&q->queued)) {
- list_add_tail(&buf->vb.queue, &q->queued);
- buf->vb.state = VIDEOBUF_QUEUED;
- dprintk(2, "[%p/%d] buffer_queue - append to queued\n", buf, buf->vb.i);
+ list_add_tail(&buf->vb.queue, &q->queued);
+ buf->vb.state = VIDEOBUF_QUEUED;
+ dprintk(2, "[%p/%d] buffer_queue - append to queued\n", buf, buf->vb.i);
} else if (list_empty(&q->active)) {
- list_add_tail(&buf->vb.queue, &q->active);
- cx25821_start_video_dma(dev, q, buf, &dev->sram_channels[SRAM_CH11]);
- buf->vb.state = VIDEOBUF_ACTIVE;
- buf->count = q->count++;
- mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
- dprintk(2, "[%p/%d] buffer_queue - first active, buf cnt = %d, q->count = %d\n",
- buf, buf->vb. i, buf->count, q->count);
+ list_add_tail(&buf->vb.queue, &q->active);
+ cx25821_start_video_dma(dev, q, buf, &dev->sram_channels[SRAM_CH11]);
+ buf->vb.state = VIDEOBUF_ACTIVE;
+ buf->count = q->count++;
+ mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
+ dprintk(2, "[%p/%d] buffer_queue - first active, buf cnt = %d, q->count = %d\n",
+ buf, buf->vb. i, buf->count, q->count);
} else {
- prev = list_entry(q->active.prev, struct cx25821_buffer, vb.queue);
- if (prev->vb.width == buf->vb.width &&
- prev->vb.height == buf->vb.height &&
- prev->fmt == buf->fmt) {
- list_add_tail(&buf->vb.queue, &q->active);
- buf->vb.state = VIDEOBUF_ACTIVE;
- buf->count = q->count++;
- prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
-
- /* 64 bit bits 63-32 */
- prev->risc.jmp[2] = cpu_to_le32(0);
- dprintk(2, "[%p/%d] buffer_queue - append to active, buf->count=%d\n", buf, buf->vb.i, buf->count);
-
- } else {
- list_add_tail(&buf->vb.queue, &q->queued);
- buf->vb.state = VIDEOBUF_QUEUED;
- dprintk(2, "[%p/%d] buffer_queue - first queued\n", buf, buf->vb.i);
- }
+ prev = list_entry(q->active.prev, struct cx25821_buffer, vb.queue);
+ if (prev->vb.width == buf->vb.width &&
+ prev->vb.height == buf->vb.height &&
+ prev->fmt == buf->fmt) {
+ list_add_tail(&buf->vb.queue, &q->active);
+ buf->vb.state = VIDEOBUF_ACTIVE;
+ buf->count = q->count++;
+ prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
+
+ /* 64 bit bits 63-32 */
+ prev->risc.jmp[2] = cpu_to_le32(0);
+ dprintk(2, "[%p/%d] buffer_queue - append to active, buf->count=%d\n", buf, buf->vb.i, buf->count);
+
+ } else {
+ list_add_tail(&buf->vb.queue, &q->queued);
+ buf->vb.state = VIDEOBUF_QUEUED;
+ dprintk(2, "[%p/%d] buffer_queue - first queued\n", buf, buf->vb.i);
+ }
}
if (list_empty(&q->active))
lock_kernel();
list_for_each(list, &cx25821_devlist)
{
- h = list_entry(list, struct cx25821_dev, devlist);
+ h = list_entry(list, struct cx25821_dev, devlist);
- if (h->video_dev[SRAM_CH11] && h->video_dev[SRAM_CH11]->minor == minor)
- {
- dev = h;
- type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- }
+ if (h->video_dev[SRAM_CH11] && h->video_dev[SRAM_CH11]->minor == minor)
+ {
+ dev = h;
+ type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ }
}
if (NULL == dev) {
- unlock_kernel();
- return -ENODEV;
+ unlock_kernel();
+ return -ENODEV;
}
printk("open minor=%d type=%s\n", minor, v4l2_type_names[type]);
/* allocate + initialize per filehandle data */
fh = kzalloc(sizeof(*fh), GFP_KERNEL);
if (NULL == fh) {
- unlock_kernel();
- return -ENOMEM;
+ unlock_kernel();
+ return -ENOMEM;
}
file->private_data = fh;
fh->width = 720;
if(dev->tvnorm & V4L2_STD_PAL_BG || dev->tvnorm & V4L2_STD_PAL_DK)
- fh->height = 576;
+ fh->height = 576;
else
- fh->height = 480;
-
+ fh->height = 480;
+
dev->channel_opened = 10;
fh->fmt = format_by_fourcc(V4L2_PIX_FMT_YUYV);
v4l2_prio_open(&dev->prio,&fh->prio);
videobuf_queue_sg_init(&fh->vidq, &cx25821_video_qops,
- &dev->pci->dev, &dev->slock,
- V4L2_BUF_TYPE_VIDEO_CAPTURE,
- V4L2_FIELD_INTERLACED,
- sizeof(struct cx25821_buffer),
- fh);
+ &dev->pci->dev, &dev->slock,
+ V4L2_BUF_TYPE_VIDEO_CAPTURE,
+ V4L2_FIELD_INTERLACED,
+ sizeof(struct cx25821_buffer),
+ fh);
dprintk(1, "post videobuf_queue_init()\n");
unlock_kernel();
switch (fh->type)
{
- case V4L2_BUF_TYPE_VIDEO_CAPTURE:
- if (res_locked(fh->dev, RESOURCE_VIDEO11))
- return -EBUSY;
+ case V4L2_BUF_TYPE_VIDEO_CAPTURE:
+ if (res_locked(fh->dev, RESOURCE_VIDEO11))
+ return -EBUSY;
- return videobuf_read_one(&fh->vidq, data, count, ppos, file->f_flags & O_NONBLOCK);
+ return videobuf_read_one(&fh->vidq, data, count, ppos, file->f_flags & O_NONBLOCK);
- default:
- BUG();
- return 0;
+ default:
+ BUG();
+ return 0;
}
}
struct cx25821_buffer *buf;
if (res_check(fh, RESOURCE_VIDEO11)) {
- /* streaming capture */
- if (list_empty(&fh->vidq.stream))
- return POLLERR;
- buf = list_entry(fh->vidq.stream.next,
- struct cx25821_buffer, vb.stream);
+ /* streaming capture */
+ if (list_empty(&fh->vidq.stream))
+ return POLLERR;
+ buf = list_entry(fh->vidq.stream.next,
+ struct cx25821_buffer, vb.stream);
} else {
- /* read() capture */
- buf = (struct cx25821_buffer *)fh->vidq.read_buf;
- if (NULL == buf)
- return POLLERR;
+ /* read() capture */
+ buf = (struct cx25821_buffer *)fh->vidq.read_buf;
+ if (NULL == buf)
+ return POLLERR;
}
poll_wait(file, &buf->vb.done, wait);
if (buf->vb.state == VIDEOBUF_DONE || buf->vb.state == VIDEOBUF_ERROR)
- return POLLIN|POLLRDNORM;
+ return POLLIN|POLLRDNORM;
return 0;
}
struct cx25821_dev *dev = fh->dev;
//stop the risc engine and fifo
- //cx_write(channel11->dma_ctl, 0);
+ //cx_write(channel11->dma_ctl, 0);
/* stop video capture */
if (res_check(fh, RESOURCE_VIDEO11)) {
- videobuf_queue_cancel(&fh->vidq);
- res_free(dev, fh, RESOURCE_VIDEO11);
+ videobuf_queue_cancel(&fh->vidq);
+ res_free(dev, fh, RESOURCE_VIDEO11);
}
if (fh->vidq.read_buf) {
- buffer_release(&fh->vidq, fh->vidq.read_buf);
- kfree(fh->vidq.read_buf);
+ buffer_release(&fh->vidq, fh->vidq.read_buf);
+ kfree(fh->vidq.read_buf);
}
videobuf_mmap_free(&fh->vidq);
if (unlikely(fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE))
{
- return -EINVAL;
+ return -EINVAL;
}
if (unlikely(i != fh->type))
{
- return -EINVAL;
+ return -EINVAL;
}
if (unlikely(!res_get(dev, fh, get_resource(fh, RESOURCE_VIDEO11))))
{
- return -EBUSY;
+ return -EBUSY;
}
return videobuf_streamon(get_queue(fh));
int err, res;
if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
- return -EINVAL;
+ return -EINVAL;
if (i != fh->type)
- return -EINVAL;
+ return -EINVAL;
res = get_resource(fh, RESOURCE_VIDEO11);
err = videobuf_streamoff(get_queue(fh));
if (err < 0)
- return err;
+ return err;
res_free(dev, fh, res);
return 0;
}
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
int err;
- if (fh)
+ if (fh)
{
- err = v4l2_prio_check(&dev->prio, &fh->prio);
- if (0 != err)
- return err;
+ err = v4l2_prio_check(&dev->prio, &fh->prio);
+ if (0 != err)
+ return err;
}
dprintk(2, "%s()\n", __func__);
err = vidioc_try_fmt_vid_cap(file, priv, f);
if (0 != err)
- return err;
+ return err;
fh->fmt = format_by_fourcc(f->fmt.pix.pixelformat);
fh->width = f->fmt.pix.width;
fh->height = f->fmt.pix.height;
return 0;
}
-static long video_ioctl_upstream11(struct file *file, unsigned int cmd, unsigned long arg)
-{
+static long video_ioctl_upstream11(struct file *file, unsigned int cmd, unsigned long arg)
+{
struct cx25821_fh *fh = file->private_data;
struct cx25821_dev *dev = fh->dev;
int command = 0;
struct upstream_user_struct *data_from_user;
-
+
data_from_user = (struct upstream_user_struct *)arg;
-
+
if( !data_from_user )
{
- printk("cx25821 in %s(): Upstream data is INVALID. Returning.\n", __func__);
- return 0;
+ printk("cx25821 in %s(): Upstream data is INVALID. Returning.\n", __func__);
+ return 0;
}
-
+
command = data_from_user->command;
-
+
if( command != UPSTREAM_START_AUDIO && command != UPSTREAM_STOP_AUDIO )
{
- return 0;
+ return 0;
}
-
-
+
+
dev->input_filename = data_from_user->input_filename;
dev->input_audiofilename = data_from_user->input_filename;
dev->vid_stdname = data_from_user->vid_stdname;
dev->channel_select = data_from_user->channel_select;
dev->command = data_from_user->command;
-
+
switch(command)
- {
- case UPSTREAM_START_AUDIO:
- cx25821_start_upstream_audio(dev, data_from_user);
- break;
-
- case UPSTREAM_STOP_AUDIO:
- cx25821_stop_upstream_audio(dev);
- break;
+ {
+ case UPSTREAM_START_AUDIO:
+ cx25821_start_upstream_audio(dev, data_from_user);
+ break;
+
+ case UPSTREAM_STOP_AUDIO:
+ cx25821_stop_upstream_audio(dev);
+ break;
}
-
+
return 0;
}
struct cx25821_dev *dev = fh->dev;
int err;
- if (fh)
+ if (fh)
{
- err = v4l2_prio_check(&dev->prio, &fh->prio);
- if (0 != err)
- return err;
+ err = v4l2_prio_check(&dev->prio, &fh->prio);
+ if (0 != err)
+ return err;
}
return 0;
}
.read = video_read,
.poll = video_poll,
.mmap = video_mmap,
- .ioctl = video_ioctl_upstream11,
+ .ioctl = video_ioctl_upstream11,
};
static const struct v4l2_ioctl_ops video_ioctl_ops = {
#include "cx25821.h"
#include "tuner-xc2028.h"
-// board config info
+// board config info
struct cx25821_board cx25821_boards[] = {
[UNKNOWN_BOARD] = {
.name = "UNKNOWN/GENERIC",
- // Ensure safe default for unknown boards
+ // Ensure safe default for unknown boards
.clk_freq = 0,
},
.name = "CX25821",
.portb = CX25821_RAW,
.portc = CX25821_264,\r
- .input[0].type = CX25821_VMUX_COMPOSITE,
- },
+ .input[0].type = CX25821_VMUX_COMPOSITE,
+ },
};
{
static u8 eeprom[256];
- if (dev->i2c_bus[0].i2c_rc == 0)
+ if (dev->i2c_bus[0].i2c_rc == 0)
{
dev->i2c_bus[0].i2c_client.addr = 0xa0 >> 1;
tveeprom_read(&dev->i2c_bus[0].i2c_client, eeprom, sizeof(eeprom));
/*
* Driver for the Conexant CX25821 PCIe bridge
*
- * Copyright (C) 2009 Conexant Systems Inc.
+ * Copyright (C) 2009 Conexant Systems Inc.
* Authors <shu.lin@conexant.com>, <hiep.huynh@conexant.com>
* Based on Steven Toth <stoth@linuxtv.org> cx23885 driver
*
struct sram_channel cx25821_sram_channels[] = {
[SRAM_CH00] = {
- .i = SRAM_CH00,
- .name = "VID A",
- .cmds_start = VID_A_DOWN_CMDS,
- .ctrl_start = VID_A_IQ,
- .cdt = VID_A_CDT,
- .fifo_start = VID_A_DOWN_CLUSTER_1,
- .fifo_size = (VID_CLUSTER_SIZE<<2),
- .ptr1_reg = DMA1_PTR1,
- .ptr2_reg = DMA1_PTR2,
- .cnt1_reg = DMA1_CNT1,
- .cnt2_reg = DMA1_CNT2,
- .int_msk = VID_A_INT_MSK,
- .int_stat = VID_A_INT_STAT,
- .int_mstat = VID_A_INT_MSTAT,
- .dma_ctl = VID_DST_A_DMA_CTL,
- .gpcnt_ctl = VID_DST_A_GPCNT_CTL,
- .gpcnt = VID_DST_A_GPCNT,
- .vip_ctl = VID_DST_A_VIP_CTL,
- .pix_frmt = VID_DST_A_PIX_FRMT,
+ .i = SRAM_CH00,
+ .name = "VID A",
+ .cmds_start = VID_A_DOWN_CMDS,
+ .ctrl_start = VID_A_IQ,
+ .cdt = VID_A_CDT,
+ .fifo_start = VID_A_DOWN_CLUSTER_1,
+ .fifo_size = (VID_CLUSTER_SIZE<<2),
+ .ptr1_reg = DMA1_PTR1,
+ .ptr2_reg = DMA1_PTR2,
+ .cnt1_reg = DMA1_CNT1,
+ .cnt2_reg = DMA1_CNT2,
+ .int_msk = VID_A_INT_MSK,
+ .int_stat = VID_A_INT_STAT,
+ .int_mstat = VID_A_INT_MSTAT,
+ .dma_ctl = VID_DST_A_DMA_CTL,
+ .gpcnt_ctl = VID_DST_A_GPCNT_CTL,
+ .gpcnt = VID_DST_A_GPCNT,
+ .vip_ctl = VID_DST_A_VIP_CTL,
+ .pix_frmt = VID_DST_A_PIX_FRMT,
},
[SRAM_CH01] = {
- .i = SRAM_CH01,
- .name = "VID B",
- .cmds_start = VID_B_DOWN_CMDS,
- .ctrl_start = VID_B_IQ,
- .cdt = VID_B_CDT,
- .fifo_start = VID_B_DOWN_CLUSTER_1,
- .fifo_size = (VID_CLUSTER_SIZE<<2),
- .ptr1_reg = DMA2_PTR1,
- .ptr2_reg = DMA2_PTR2,
- .cnt1_reg = DMA2_CNT1,
- .cnt2_reg = DMA2_CNT2,
- .int_msk = VID_B_INT_MSK,
- .int_stat = VID_B_INT_STAT,
- .int_mstat = VID_B_INT_MSTAT,
- .dma_ctl = VID_DST_B_DMA_CTL,
- .gpcnt_ctl = VID_DST_B_GPCNT_CTL,
- .gpcnt = VID_DST_B_GPCNT,
- .vip_ctl = VID_DST_B_VIP_CTL,
- .pix_frmt = VID_DST_B_PIX_FRMT,
+ .i = SRAM_CH01,
+ .name = "VID B",
+ .cmds_start = VID_B_DOWN_CMDS,
+ .ctrl_start = VID_B_IQ,
+ .cdt = VID_B_CDT,
+ .fifo_start = VID_B_DOWN_CLUSTER_1,
+ .fifo_size = (VID_CLUSTER_SIZE<<2),
+ .ptr1_reg = DMA2_PTR1,
+ .ptr2_reg = DMA2_PTR2,
+ .cnt1_reg = DMA2_CNT1,
+ .cnt2_reg = DMA2_CNT2,
+ .int_msk = VID_B_INT_MSK,
+ .int_stat = VID_B_INT_STAT,
+ .int_mstat = VID_B_INT_MSTAT,
+ .dma_ctl = VID_DST_B_DMA_CTL,
+ .gpcnt_ctl = VID_DST_B_GPCNT_CTL,
+ .gpcnt = VID_DST_B_GPCNT,
+ .vip_ctl = VID_DST_B_VIP_CTL,
+ .pix_frmt = VID_DST_B_PIX_FRMT,
},
-
+
[SRAM_CH02] = {
- .i = SRAM_CH02,
- .name = "VID C",
- .cmds_start = VID_C_DOWN_CMDS,
- .ctrl_start = VID_C_IQ,
- .cdt = VID_C_CDT,
- .fifo_start = VID_C_DOWN_CLUSTER_1,
- .fifo_size = (VID_CLUSTER_SIZE<<2),
- .ptr1_reg = DMA3_PTR1,
- .ptr2_reg = DMA3_PTR2,
- .cnt1_reg = DMA3_CNT1,
- .cnt2_reg = DMA3_CNT2,
- .int_msk = VID_C_INT_MSK,
- .int_stat = VID_C_INT_STAT,
- .int_mstat = VID_C_INT_MSTAT,
- .dma_ctl = VID_DST_C_DMA_CTL,
- .gpcnt_ctl = VID_DST_C_GPCNT_CTL,
- .gpcnt = VID_DST_C_GPCNT,
- .vip_ctl = VID_DST_C_VIP_CTL,
- .pix_frmt = VID_DST_C_PIX_FRMT,
+ .i = SRAM_CH02,
+ .name = "VID C",
+ .cmds_start = VID_C_DOWN_CMDS,
+ .ctrl_start = VID_C_IQ,
+ .cdt = VID_C_CDT,
+ .fifo_start = VID_C_DOWN_CLUSTER_1,
+ .fifo_size = (VID_CLUSTER_SIZE<<2),
+ .ptr1_reg = DMA3_PTR1,
+ .ptr2_reg = DMA3_PTR2,
+ .cnt1_reg = DMA3_CNT1,
+ .cnt2_reg = DMA3_CNT2,
+ .int_msk = VID_C_INT_MSK,
+ .int_stat = VID_C_INT_STAT,
+ .int_mstat = VID_C_INT_MSTAT,
+ .dma_ctl = VID_DST_C_DMA_CTL,
+ .gpcnt_ctl = VID_DST_C_GPCNT_CTL,
+ .gpcnt = VID_DST_C_GPCNT,
+ .vip_ctl = VID_DST_C_VIP_CTL,
+ .pix_frmt = VID_DST_C_PIX_FRMT,
},
-
+
[SRAM_CH03] = {
- .i = SRAM_CH03,
- .name = "VID D",
- .cmds_start = VID_D_DOWN_CMDS,
- .ctrl_start = VID_D_IQ,
- .cdt = VID_D_CDT,
- .fifo_start = VID_D_DOWN_CLUSTER_1,
- .fifo_size = (VID_CLUSTER_SIZE<<2),
- .ptr1_reg = DMA4_PTR1,
- .ptr2_reg = DMA4_PTR2,
- .cnt1_reg = DMA4_CNT1,
- .cnt2_reg = DMA4_CNT2,
- .int_msk = VID_D_INT_MSK,
- .int_stat = VID_D_INT_STAT,
- .int_mstat = VID_D_INT_MSTAT,
- .dma_ctl = VID_DST_D_DMA_CTL,
- .gpcnt_ctl = VID_DST_D_GPCNT_CTL,
- .gpcnt = VID_DST_D_GPCNT,
- .vip_ctl = VID_DST_D_VIP_CTL,
- .pix_frmt = VID_DST_D_PIX_FRMT,
+ .i = SRAM_CH03,
+ .name = "VID D",
+ .cmds_start = VID_D_DOWN_CMDS,
+ .ctrl_start = VID_D_IQ,
+ .cdt = VID_D_CDT,
+ .fifo_start = VID_D_DOWN_CLUSTER_1,
+ .fifo_size = (VID_CLUSTER_SIZE<<2),
+ .ptr1_reg = DMA4_PTR1,
+ .ptr2_reg = DMA4_PTR2,
+ .cnt1_reg = DMA4_CNT1,
+ .cnt2_reg = DMA4_CNT2,
+ .int_msk = VID_D_INT_MSK,
+ .int_stat = VID_D_INT_STAT,
+ .int_mstat = VID_D_INT_MSTAT,
+ .dma_ctl = VID_DST_D_DMA_CTL,
+ .gpcnt_ctl = VID_DST_D_GPCNT_CTL,
+ .gpcnt = VID_DST_D_GPCNT,
+ .vip_ctl = VID_DST_D_VIP_CTL,
+ .pix_frmt = VID_DST_D_PIX_FRMT,
},
-
+
[SRAM_CH04] = {
- .i = SRAM_CH04,
- .name = "VID E",
- .cmds_start = VID_E_DOWN_CMDS,
- .ctrl_start = VID_E_IQ,
- .cdt = VID_E_CDT,
- .fifo_start = VID_E_DOWN_CLUSTER_1,
- .fifo_size = (VID_CLUSTER_SIZE<<2),
- .ptr1_reg = DMA5_PTR1,
- .ptr2_reg = DMA5_PTR2,
- .cnt1_reg = DMA5_CNT1,
- .cnt2_reg = DMA5_CNT2,
- .int_msk = VID_E_INT_MSK,
- .int_stat = VID_E_INT_STAT,
- .int_mstat = VID_E_INT_MSTAT,
- .dma_ctl = VID_DST_E_DMA_CTL,
- .gpcnt_ctl = VID_DST_E_GPCNT_CTL,
- .gpcnt = VID_DST_E_GPCNT,
- .vip_ctl = VID_DST_E_VIP_CTL,
- .pix_frmt = VID_DST_E_PIX_FRMT,
+ .i = SRAM_CH04,
+ .name = "VID E",
+ .cmds_start = VID_E_DOWN_CMDS,
+ .ctrl_start = VID_E_IQ,
+ .cdt = VID_E_CDT,
+ .fifo_start = VID_E_DOWN_CLUSTER_1,
+ .fifo_size = (VID_CLUSTER_SIZE<<2),
+ .ptr1_reg = DMA5_PTR1,
+ .ptr2_reg = DMA5_PTR2,
+ .cnt1_reg = DMA5_CNT1,
+ .cnt2_reg = DMA5_CNT2,
+ .int_msk = VID_E_INT_MSK,
+ .int_stat = VID_E_INT_STAT,
+ .int_mstat = VID_E_INT_MSTAT,
+ .dma_ctl = VID_DST_E_DMA_CTL,
+ .gpcnt_ctl = VID_DST_E_GPCNT_CTL,
+ .gpcnt = VID_DST_E_GPCNT,
+ .vip_ctl = VID_DST_E_VIP_CTL,
+ .pix_frmt = VID_DST_E_PIX_FRMT,
},
-
+
[SRAM_CH05] = {
- .i = SRAM_CH05,
- .name = "VID F",
- .cmds_start = VID_F_DOWN_CMDS,
- .ctrl_start = VID_F_IQ,
- .cdt = VID_F_CDT,
- .fifo_start = VID_F_DOWN_CLUSTER_1,
- .fifo_size = (VID_CLUSTER_SIZE<<2),
- .ptr1_reg = DMA6_PTR1,
- .ptr2_reg = DMA6_PTR2,
- .cnt1_reg = DMA6_CNT1,
- .cnt2_reg = DMA6_CNT2,
- .int_msk = VID_F_INT_MSK,
- .int_stat = VID_F_INT_STAT,
- .int_mstat = VID_F_INT_MSTAT,
- .dma_ctl = VID_DST_F_DMA_CTL,
- .gpcnt_ctl = VID_DST_F_GPCNT_CTL,
- .gpcnt = VID_DST_F_GPCNT,
- .vip_ctl = VID_DST_F_VIP_CTL,
- .pix_frmt = VID_DST_F_PIX_FRMT,
+ .i = SRAM_CH05,
+ .name = "VID F",
+ .cmds_start = VID_F_DOWN_CMDS,
+ .ctrl_start = VID_F_IQ,
+ .cdt = VID_F_CDT,
+ .fifo_start = VID_F_DOWN_CLUSTER_1,
+ .fifo_size = (VID_CLUSTER_SIZE<<2),
+ .ptr1_reg = DMA6_PTR1,
+ .ptr2_reg = DMA6_PTR2,
+ .cnt1_reg = DMA6_CNT1,
+ .cnt2_reg = DMA6_CNT2,
+ .int_msk = VID_F_INT_MSK,
+ .int_stat = VID_F_INT_STAT,
+ .int_mstat = VID_F_INT_MSTAT,
+ .dma_ctl = VID_DST_F_DMA_CTL,
+ .gpcnt_ctl = VID_DST_F_GPCNT_CTL,
+ .gpcnt = VID_DST_F_GPCNT,
+ .vip_ctl = VID_DST_F_VIP_CTL,
+ .pix_frmt = VID_DST_F_PIX_FRMT,
},
-
+
[SRAM_CH06] = {
- .i = SRAM_CH06,
- .name = "VID G",
- .cmds_start = VID_G_DOWN_CMDS,
- .ctrl_start = VID_G_IQ,
- .cdt = VID_G_CDT,
- .fifo_start = VID_G_DOWN_CLUSTER_1,
- .fifo_size = (VID_CLUSTER_SIZE<<2),
- .ptr1_reg = DMA7_PTR1,
- .ptr2_reg = DMA7_PTR2,
- .cnt1_reg = DMA7_CNT1,
- .cnt2_reg = DMA7_CNT2,
- .int_msk = VID_G_INT_MSK,
- .int_stat = VID_G_INT_STAT,
- .int_mstat = VID_G_INT_MSTAT,
- .dma_ctl = VID_DST_G_DMA_CTL,
- .gpcnt_ctl = VID_DST_G_GPCNT_CTL,
- .gpcnt = VID_DST_G_GPCNT,
- .vip_ctl = VID_DST_G_VIP_CTL,
- .pix_frmt = VID_DST_G_PIX_FRMT,
+ .i = SRAM_CH06,
+ .name = "VID G",
+ .cmds_start = VID_G_DOWN_CMDS,
+ .ctrl_start = VID_G_IQ,
+ .cdt = VID_G_CDT,
+ .fifo_start = VID_G_DOWN_CLUSTER_1,
+ .fifo_size = (VID_CLUSTER_SIZE<<2),
+ .ptr1_reg = DMA7_PTR1,
+ .ptr2_reg = DMA7_PTR2,
+ .cnt1_reg = DMA7_CNT1,
+ .cnt2_reg = DMA7_CNT2,
+ .int_msk = VID_G_INT_MSK,
+ .int_stat = VID_G_INT_STAT,
+ .int_mstat = VID_G_INT_MSTAT,
+ .dma_ctl = VID_DST_G_DMA_CTL,
+ .gpcnt_ctl = VID_DST_G_GPCNT_CTL,
+ .gpcnt = VID_DST_G_GPCNT,
+ .vip_ctl = VID_DST_G_VIP_CTL,
+ .pix_frmt = VID_DST_G_PIX_FRMT,
},
-
+
[SRAM_CH07] = {
- .i = SRAM_CH07,
- .name = "VID H",
- .cmds_start = VID_H_DOWN_CMDS,
- .ctrl_start = VID_H_IQ,
- .cdt = VID_H_CDT,
- .fifo_start = VID_H_DOWN_CLUSTER_1,
- .fifo_size = (VID_CLUSTER_SIZE<<2),
- .ptr1_reg = DMA8_PTR1,
- .ptr2_reg = DMA8_PTR2,
- .cnt1_reg = DMA8_CNT1,
- .cnt2_reg = DMA8_CNT2,
- .int_msk = VID_H_INT_MSK,
- .int_stat = VID_H_INT_STAT,
- .int_mstat = VID_H_INT_MSTAT,
- .dma_ctl = VID_DST_H_DMA_CTL,
- .gpcnt_ctl = VID_DST_H_GPCNT_CTL,
- .gpcnt = VID_DST_H_GPCNT,
- .vip_ctl = VID_DST_H_VIP_CTL,
- .pix_frmt = VID_DST_H_PIX_FRMT,
+ .i = SRAM_CH07,
+ .name = "VID H",
+ .cmds_start = VID_H_DOWN_CMDS,
+ .ctrl_start = VID_H_IQ,
+ .cdt = VID_H_CDT,
+ .fifo_start = VID_H_DOWN_CLUSTER_1,
+ .fifo_size = (VID_CLUSTER_SIZE<<2),
+ .ptr1_reg = DMA8_PTR1,
+ .ptr2_reg = DMA8_PTR2,
+ .cnt1_reg = DMA8_CNT1,
+ .cnt2_reg = DMA8_CNT2,
+ .int_msk = VID_H_INT_MSK,
+ .int_stat = VID_H_INT_STAT,
+ .int_mstat = VID_H_INT_MSTAT,
+ .dma_ctl = VID_DST_H_DMA_CTL,
+ .gpcnt_ctl = VID_DST_H_GPCNT_CTL,
+ .gpcnt = VID_DST_H_GPCNT,
+ .vip_ctl = VID_DST_H_VIP_CTL,
+ .pix_frmt = VID_DST_H_PIX_FRMT,
},
-
+
[SRAM_CH08] = {
- .name = "audio from",
- .cmds_start = AUD_A_DOWN_CMDS,
- .ctrl_start = AUD_A_IQ,
- .cdt = AUD_A_CDT,
- .fifo_start = AUD_A_DOWN_CLUSTER_1,
- .fifo_size = AUDIO_CLUSTER_SIZE * 3,
- .ptr1_reg = DMA17_PTR1,
- .ptr2_reg = DMA17_PTR2,
- .cnt1_reg = DMA17_CNT1,
- .cnt2_reg = DMA17_CNT2,
- },
-
+ .name = "audio from",
+ .cmds_start = AUD_A_DOWN_CMDS,
+ .ctrl_start = AUD_A_IQ,
+ .cdt = AUD_A_CDT,
+ .fifo_start = AUD_A_DOWN_CLUSTER_1,
+ .fifo_size = AUDIO_CLUSTER_SIZE * 3,
+ .ptr1_reg = DMA17_PTR1,
+ .ptr2_reg = DMA17_PTR2,
+ .cnt1_reg = DMA17_CNT1,
+ .cnt2_reg = DMA17_CNT2,
+ },
+
[SRAM_CH09] = {
- .i = SRAM_CH09,
- .name = "VID Upstream I",
- .cmds_start = VID_I_UP_CMDS,
- .ctrl_start = VID_I_IQ,
- .cdt = VID_I_CDT,
- .fifo_start = VID_I_UP_CLUSTER_1,
- .fifo_size = (VID_CLUSTER_SIZE<<2),
- .ptr1_reg = DMA15_PTR1,
- .ptr2_reg = DMA15_PTR2,
- .cnt1_reg = DMA15_CNT1,
- .cnt2_reg = DMA15_CNT2,
- .int_msk = VID_I_INT_MSK,
- .int_stat = VID_I_INT_STAT,
- .int_mstat = VID_I_INT_MSTAT,
- .dma_ctl = VID_SRC_I_DMA_CTL,
- .gpcnt_ctl = VID_SRC_I_GPCNT_CTL,
- .gpcnt = VID_SRC_I_GPCNT,
-
- .vid_fmt_ctl = VID_SRC_I_FMT_CTL,
- .vid_active_ctl1= VID_SRC_I_ACTIVE_CTL1,
- .vid_active_ctl2= VID_SRC_I_ACTIVE_CTL2,
- .vid_cdt_size = VID_SRC_I_CDT_SZ,
- .irq_bit = 8,
- },
+ .i = SRAM_CH09,
+ .name = "VID Upstream I",
+ .cmds_start = VID_I_UP_CMDS,
+ .ctrl_start = VID_I_IQ,
+ .cdt = VID_I_CDT,
+ .fifo_start = VID_I_UP_CLUSTER_1,
+ .fifo_size = (VID_CLUSTER_SIZE<<2),
+ .ptr1_reg = DMA15_PTR1,
+ .ptr2_reg = DMA15_PTR2,
+ .cnt1_reg = DMA15_CNT1,
+ .cnt2_reg = DMA15_CNT2,
+ .int_msk = VID_I_INT_MSK,
+ .int_stat = VID_I_INT_STAT,
+ .int_mstat = VID_I_INT_MSTAT,
+ .dma_ctl = VID_SRC_I_DMA_CTL,
+ .gpcnt_ctl = VID_SRC_I_GPCNT_CTL,
+ .gpcnt = VID_SRC_I_GPCNT,
+
+ .vid_fmt_ctl = VID_SRC_I_FMT_CTL,
+ .vid_active_ctl1= VID_SRC_I_ACTIVE_CTL1,
+ .vid_active_ctl2= VID_SRC_I_ACTIVE_CTL2,
+ .vid_cdt_size = VID_SRC_I_CDT_SZ,
+ .irq_bit = 8,
+ },
[SRAM_CH10] = {
- .i = SRAM_CH10,
- .name = "VID Upstream J",
- .cmds_start = VID_J_UP_CMDS,
- .ctrl_start = VID_J_IQ,
- .cdt = VID_J_CDT,
- .fifo_start = VID_J_UP_CLUSTER_1,
- .fifo_size = (VID_CLUSTER_SIZE<<2),
- .ptr1_reg = DMA16_PTR1,
- .ptr2_reg = DMA16_PTR2,
- .cnt1_reg = DMA16_CNT1,
- .cnt2_reg = DMA16_CNT2,
- .int_msk = VID_J_INT_MSK,
- .int_stat = VID_J_INT_STAT,
- .int_mstat = VID_J_INT_MSTAT,
- .dma_ctl = VID_SRC_J_DMA_CTL,
- .gpcnt_ctl = VID_SRC_J_GPCNT_CTL,
- .gpcnt = VID_SRC_J_GPCNT,
-
- .vid_fmt_ctl = VID_SRC_J_FMT_CTL,
- .vid_active_ctl1= VID_SRC_J_ACTIVE_CTL1,
- .vid_active_ctl2= VID_SRC_J_ACTIVE_CTL2,
- .vid_cdt_size = VID_SRC_J_CDT_SZ,
- .irq_bit = 9,
+ .i = SRAM_CH10,
+ .name = "VID Upstream J",
+ .cmds_start = VID_J_UP_CMDS,
+ .ctrl_start = VID_J_IQ,
+ .cdt = VID_J_CDT,
+ .fifo_start = VID_J_UP_CLUSTER_1,
+ .fifo_size = (VID_CLUSTER_SIZE<<2),
+ .ptr1_reg = DMA16_PTR1,
+ .ptr2_reg = DMA16_PTR2,
+ .cnt1_reg = DMA16_CNT1,
+ .cnt2_reg = DMA16_CNT2,
+ .int_msk = VID_J_INT_MSK,
+ .int_stat = VID_J_INT_STAT,
+ .int_mstat = VID_J_INT_MSTAT,
+ .dma_ctl = VID_SRC_J_DMA_CTL,
+ .gpcnt_ctl = VID_SRC_J_GPCNT_CTL,
+ .gpcnt = VID_SRC_J_GPCNT,
+
+ .vid_fmt_ctl = VID_SRC_J_FMT_CTL,
+ .vid_active_ctl1= VID_SRC_J_ACTIVE_CTL1,
+ .vid_active_ctl2= VID_SRC_J_ACTIVE_CTL2,
+ .vid_cdt_size = VID_SRC_J_CDT_SZ,
+ .irq_bit = 9,
},
[SRAM_CH11] = {
- .i = SRAM_CH11,
- .name = "Audio Upstream Channel B",
- .cmds_start = AUD_B_UP_CMDS,
- .ctrl_start = AUD_B_IQ,
- .cdt = AUD_B_CDT,
- .fifo_start = AUD_B_UP_CLUSTER_1,
- .fifo_size = (AUDIO_CLUSTER_SIZE*3),
- .ptr1_reg = DMA22_PTR1,
- .ptr2_reg = DMA22_PTR2,
- .cnt1_reg = DMA22_CNT1,
- .cnt2_reg = DMA22_CNT2,
- .int_msk = AUD_B_INT_MSK,
- .int_stat = AUD_B_INT_STAT,
- .int_mstat = AUD_B_INT_MSTAT,
- .dma_ctl = AUD_INT_DMA_CTL,
- .gpcnt_ctl = AUD_B_GPCNT_CTL,
- .gpcnt = AUD_B_GPCNT,
- .aud_length = AUD_B_LNGTH,
- .aud_cfg = AUD_B_CFG,
- .fld_aud_fifo_en = FLD_AUD_SRC_B_FIFO_EN,
- .fld_aud_risc_en = FLD_AUD_SRC_B_RISC_EN,
- .irq_bit = 11,
- },
+ .i = SRAM_CH11,
+ .name = "Audio Upstream Channel B",
+ .cmds_start = AUD_B_UP_CMDS,
+ .ctrl_start = AUD_B_IQ,
+ .cdt = AUD_B_CDT,
+ .fifo_start = AUD_B_UP_CLUSTER_1,
+ .fifo_size = (AUDIO_CLUSTER_SIZE*3),
+ .ptr1_reg = DMA22_PTR1,
+ .ptr2_reg = DMA22_PTR2,
+ .cnt1_reg = DMA22_CNT1,
+ .cnt2_reg = DMA22_CNT2,
+ .int_msk = AUD_B_INT_MSK,
+ .int_stat = AUD_B_INT_STAT,
+ .int_mstat = AUD_B_INT_MSTAT,
+ .dma_ctl = AUD_INT_DMA_CTL,
+ .gpcnt_ctl = AUD_B_GPCNT_CTL,
+ .gpcnt = AUD_B_GPCNT,
+ .aud_length = AUD_B_LNGTH,
+ .aud_cfg = AUD_B_CFG,
+ .fld_aud_fifo_en = FLD_AUD_SRC_B_FIFO_EN,
+ .fld_aud_risc_en = FLD_AUD_SRC_B_RISC_EN,
+ .irq_bit = 11,
+ },
};
struct sram_channel *channel5 = &cx25821_sram_channels[SRAM_CH05];
struct sram_channel *channel6 = &cx25821_sram_channels[SRAM_CH06];
struct sram_channel *channel7 = &cx25821_sram_channels[SRAM_CH07];
-struct sram_channel *channel9 = &cx25821_sram_channels[SRAM_CH09];
+struct sram_channel *channel9 = &cx25821_sram_channels[SRAM_CH09];
struct sram_channel *channel10 = &cx25821_sram_channels[SRAM_CH10];
struct sram_channel *channel11 = &cx25821_sram_channels[SRAM_CH11];
static int cx25821_risc_decode(u32 risc)
{
static char *instr[16] = {
- [RISC_SYNC >> 28] = "sync",
- [RISC_WRITE >> 28] = "write",
- [RISC_WRITEC >> 28] = "writec",
- [RISC_READ >> 28] = "read",
- [RISC_READC >> 28] = "readc",
- [RISC_JUMP >> 28] = "jump",
- [RISC_SKIP >> 28] = "skip",
- [RISC_WRITERM >> 28] = "writerm",
- [RISC_WRITECM >> 28] = "writecm",
- [RISC_WRITECR >> 28] = "writecr",
+ [RISC_SYNC >> 28] = "sync",
+ [RISC_WRITE >> 28] = "write",
+ [RISC_WRITEC >> 28] = "writec",
+ [RISC_READ >> 28] = "read",
+ [RISC_READC >> 28] = "readc",
+ [RISC_JUMP >> 28] = "jump",
+ [RISC_SKIP >> 28] = "skip",
+ [RISC_WRITERM >> 28] = "writerm",
+ [RISC_WRITECM >> 28] = "writecm",
+ [RISC_WRITECR >> 28] = "writecr",
};
static int incr[16] = {
- [RISC_WRITE >> 28] = 3,
- [RISC_JUMP >> 28] = 3,
- [RISC_SKIP >> 28] = 1,
- [RISC_SYNC >> 28] = 1,
- [RISC_WRITERM >> 28] = 3,
- [RISC_WRITECM >> 28] = 3,
- [RISC_WRITECR >> 28] = 4,
+ [RISC_WRITE >> 28] = 3,
+ [RISC_JUMP >> 28] = 3,
+ [RISC_SKIP >> 28] = 1,
+ [RISC_SYNC >> 28] = 1,
+ [RISC_WRITERM >> 28] = 3,
+ [RISC_WRITECM >> 28] = 3,
+ [RISC_WRITECR >> 28] = 4,
};
static char *bits[] = {
- "12", "13", "14", "resync",
- "cnt0", "cnt1", "18", "19",
- "20", "21", "22", "23",
- "irq1", "irq2", "eol", "sol",
+ "12", "13", "14", "resync",
+ "cnt0", "cnt1", "18", "19",
+ "20", "21", "22", "23",
+ "irq1", "irq2", "eol", "sol",
};
int i;
printk("0x%08x [ %s", risc, instr[risc >> 28] ? instr[risc >> 28] : "INVALID");
for (i = ARRAY_SIZE(bits) - 1; i >= 0; i--)
- {
- if (risc & (1 << (i + 12)))
- printk(" %s", bits[i]);
- }
+ {
+ if (risc & (1 << (i + 12)))
+ printk(" %s", bits[i]);
+ }
printk(" count=%d ]\n", risc & 0xfff);
return incr[risc >> 28] ? incr[risc >> 28] : 1;
}
{
int tmp = 0;
u32 value = 0;
-
+
value = cx25821_i2c_read(&dev->i2c_bus[0], reg, &tmp);
}
static void cx25821_registers_init(struct cx25821_dev *dev)
{
u32 tmp;
-
+
// enable RUN_RISC in Pecos
cx_write( DEV_CNTRL2, 0x20 );
-
+
// Set the master PCI interrupt masks to enable video, audio, MBIF, and GPIO interrupts
// I2C interrupt masking is handled by the I2C objects themselves.
cx_write( PCI_INT_MSK, 0x2001FFFF );
// PLL_A_POST = 0x1C, PLL_A_OUT_TO_PIN = 0x1
cx_write( PLL_A_POST_STAT_BIST, 0x8000019C);
-
+
// clear reset bit [31]
tmp = cx_read( PLL_A_INT_FRAC );
cx_write( PLL_A_INT_FRAC, tmp & 0x7FFFFFFF);
tmp = cx_read( PLL_D_INT_FRAC );
cx_write( PLL_D_INT_FRAC, tmp & 0x7FFFFFFF);
-
+
// This selects the PLL C clock source for the video upstream channel I and J
tmp = cx_read( VID_CH_CLK_SEL );
cx_write( VID_CH_CLK_SEL, (tmp & 0x00FFFFFF) | 0x24000000);
-
+
// 656/VIP SRC Upstream Channel I & J and 7 - Host Bus Interface for channel A-C
//select 656/VIP DST for downstream Channel A - C
tmp = cx_read( VID_CH_MODE_SEL );
//cx_write( VID_CH_MODE_SEL, tmp | 0x1B0001FF);
cx_write( VID_CH_MODE_SEL, tmp & 0xFFFFFE00);
-
+
// enables 656 port I and J as output
tmp = cx_read( CLK_RST );
tmp |= FLD_USE_ALT_PLL_REF; // use external ALT_PLL_REF pin as its reference clock instead
cx_write( CLK_RST, tmp & ~(FLD_VID_I_CLK_NOE | FLD_VID_J_CLK_NOE) );
-
+
mdelay(100);
}
int cx25821_sram_channel_setup(struct cx25821_dev *dev,
- struct sram_channel *ch,
- unsigned int bpl, u32 risc)
+ struct sram_channel *ch,
+ unsigned int bpl, u32 risc)
{
unsigned int i, lines;
u32 cdt;
if (ch->cmds_start == 0) {
- cx_write(ch->ptr1_reg, 0);
- cx_write(ch->ptr2_reg, 0);
- cx_write(ch->cnt2_reg, 0);
- cx_write(ch->cnt1_reg, 0);
- return 0;
- }
+ cx_write(ch->ptr1_reg, 0);
+ cx_write(ch->ptr2_reg, 0);
+ cx_write(ch->cnt2_reg, 0);
+ cx_write(ch->cnt1_reg, 0);
+ return 0;
+ }
bpl = (bpl + 7) & ~7; /* alignment */
cdt = ch->cdt;
lines = ch->fifo_size / bpl;
-
- if (lines > 4)
+
+ if (lines > 4)
{
- lines = 4;
+ lines = 4;
}
-
+
BUG_ON(lines < 2);
cx_write(8 + 0, RISC_JUMP | RISC_IRQ1 | RISC_CNT_INC);
/* write CDT */
for (i = 0; i < lines; i++) {
- cx_write(cdt + 16*i, ch->fifo_start + bpl*i);
- cx_write(cdt + 16*i + 4, 0);
- cx_write(cdt + 16*i + 8, 0);
- cx_write(cdt + 16*i + 12, 0);
+ cx_write(cdt + 16*i, ch->fifo_start + bpl*i);
+ cx_write(cdt + 16*i + 4, 0);
+ cx_write(cdt + 16*i + 8, 0);
+ cx_write(cdt + 16*i + 12, 0);
}
//init the first cdt buffer
for(i=0; i<128; i++)
- cx_write(ch->fifo_start+4*i, i);
+ cx_write(ch->fifo_start+4*i, i);
/* write CMDS */
if (ch->jumponly)
- {
- cx_write(ch->cmds_start + 0, 8);
+ {
+ cx_write(ch->cmds_start + 0, 8);
}
else
- {
- cx_write(ch->cmds_start + 0, risc);
+ {
+ cx_write(ch->cmds_start + 0, risc);
}
-
+
cx_write(ch->cmds_start + 4, 0); /* 64 bits 63-32 */
- cx_write(ch->cmds_start + 8, cdt);
- cx_write(ch->cmds_start + 12, (lines*16) >> 3);
- cx_write(ch->cmds_start + 16, ch->ctrl_start);
-
+ cx_write(ch->cmds_start + 8, cdt);
+ cx_write(ch->cmds_start + 12, (lines*16) >> 3);
+ cx_write(ch->cmds_start + 16, ch->ctrl_start);
+
if (ch->jumponly)
- cx_write(ch->cmds_start + 20, 0x80000000 | (64 >> 2));
+ cx_write(ch->cmds_start + 20, 0x80000000 | (64 >> 2));
else
- cx_write(ch->cmds_start + 20, 64 >> 2);
+ cx_write(ch->cmds_start + 20, 64 >> 2);
for (i = 24; i < 80; i += 4)
- cx_write(ch->cmds_start + i, 0);
+ cx_write(ch->cmds_start + i, 0);
/* fill registers */
cx_write(ch->ptr1_reg, ch->fifo_start);
cx_write(ch->ptr2_reg, cdt);
cx_write(ch->cnt2_reg, (lines*16) >> 3);
- cx_write(ch->cnt1_reg, (bpl >> 3) - 1);
+ cx_write(ch->cnt1_reg, (bpl >> 3) - 1);
return 0;
}
int cx25821_sram_channel_setup_audio(struct cx25821_dev *dev,
- struct sram_channel *ch,
- unsigned int bpl, u32 risc)
+ struct sram_channel *ch,
+ unsigned int bpl, u32 risc)
{
unsigned int i, lines;
u32 cdt;
if (ch->cmds_start == 0) {
- cx_write(ch->ptr1_reg, 0);
- cx_write(ch->ptr2_reg, 0);
- cx_write(ch->cnt2_reg, 0);
- cx_write(ch->cnt1_reg, 0);
- return 0;
+ cx_write(ch->ptr1_reg, 0);
+ cx_write(ch->ptr2_reg, 0);
+ cx_write(ch->cnt2_reg, 0);
+ cx_write(ch->cnt1_reg, 0);
+ return 0;
}
bpl = (bpl + 7) & ~7; /* alignment */
cdt = ch->cdt;
lines = ch->fifo_size / bpl;
-
- if (lines > 3)
- {
- lines = 3; //for AUDIO
+
+ if (lines > 3)
+ {
+ lines = 3; //for AUDIO
}
-
+
BUG_ON(lines < 2);
-
+
cx_write(8 + 0, RISC_JUMP | RISC_IRQ1 | RISC_CNT_INC);
cx_write(8 + 4, 8);
/* write CDT */
for (i = 0; i < lines; i++) {
- cx_write(cdt + 16*i, ch->fifo_start + bpl*i);
- cx_write(cdt + 16*i + 4, 0);
- cx_write(cdt + 16*i + 8, 0);
- cx_write(cdt + 16*i + 12, 0);
+ cx_write(cdt + 16*i, ch->fifo_start + bpl*i);
+ cx_write(cdt + 16*i + 4, 0);
+ cx_write(cdt + 16*i + 8, 0);
+ cx_write(cdt + 16*i + 12, 0);
}
/* write CMDS */
if (ch->jumponly)
- {
- cx_write(ch->cmds_start + 0, 8);
+ {
+ cx_write(ch->cmds_start + 0, 8);
}
else
- {
- cx_write(ch->cmds_start + 0, risc);
+ {
+ cx_write(ch->cmds_start + 0, risc);
}
-
+
cx_write(ch->cmds_start + 4, 0); /* 64 bits 63-32 */
- cx_write(ch->cmds_start + 8, cdt);
- cx_write(ch->cmds_start + 12, (lines*16) >> 3);
- cx_write(ch->cmds_start + 16, ch->ctrl_start);
+ cx_write(ch->cmds_start + 8, cdt);
+ cx_write(ch->cmds_start + 12, (lines*16) >> 3);
+ cx_write(ch->cmds_start + 16, ch->ctrl_start);
//IQ size
if (ch->jumponly)
- {
- cx_write(ch->cmds_start + 20, 0x80000000 | (64 >> 2));
+ {
+ cx_write(ch->cmds_start + 20, 0x80000000 | (64 >> 2));
}
else
- {
- cx_write(ch->cmds_start + 20, 64 >> 2);
+ {
+ cx_write(ch->cmds_start + 20, 64 >> 2);
}
//zero out
for (i = 24; i < 80; i += 4)
- cx_write(ch->cmds_start + i, 0);
+ cx_write(ch->cmds_start + i, 0);
/* fill registers */
cx_write(ch->ptr1_reg, ch->fifo_start);
- cx_write(ch->ptr2_reg, cdt);
- cx_write(ch->cnt2_reg, (lines*16) >> 3);
- cx_write(ch->cnt1_reg, (bpl >> 3) - 1);
-
+ cx_write(ch->ptr2_reg, cdt);
+ cx_write(ch->cnt2_reg, (lines*16) >> 3);
+ cx_write(ch->cnt1_reg, (bpl >> 3) - 1);
+
return 0;
}
void cx25821_sram_channel_dump(struct cx25821_dev *dev, struct sram_channel *ch)
{
static char *name[] = {
- "init risc lo",
- "init risc hi",
- "cdt base",
- "cdt size",
- "iq base",
- "iq size",
- "risc pc lo",
- "risc pc hi",
- "iq wr ptr",
- "iq rd ptr",
- "cdt current",
- "pci target lo",
- "pci target hi",
- "line / byte",
+ "init risc lo",
+ "init risc hi",
+ "cdt base",
+ "cdt size",
+ "iq base",
+ "iq size",
+ "risc pc lo",
+ "risc pc hi",
+ "iq wr ptr",
+ "iq rd ptr",
+ "cdt current",
+ "pci target lo",
+ "pci target hi",
+ "line / byte",
};
u32 risc;
unsigned int i, j, n;
-
+
printk(KERN_WARNING "%s: %s - dma channel status dump\n", dev->name, ch->name);
for (i = 0; i < ARRAY_SIZE(name); i++)
- printk(KERN_WARNING "cmds + 0x%2x: %-15s: 0x%08x\n", i*4, name[i],
- cx_read(ch->cmds_start + 4*i));
+ printk(KERN_WARNING "cmds + 0x%2x: %-15s: 0x%08x\n", i*4, name[i],
+ cx_read(ch->cmds_start + 4*i));
j=i*4;
for (i = 0; i < 4; ) {
- risc = cx_read(ch->cmds_start + 4 * (i + 14));
- printk(KERN_WARNING "cmds + 0x%2x: risc%d: ", j+i*4, i);
- i +=cx25821_risc_decode(risc);
+ risc = cx_read(ch->cmds_start + 4 * (i + 14));
+ printk(KERN_WARNING "cmds + 0x%2x: risc%d: ", j+i*4, i);
+ i +=cx25821_risc_decode(risc);
}
for (i = 0; i < (64 >> 2); i += n) {
- risc = cx_read(ch->ctrl_start + 4 * i);
- /* No consideration for bits 63-32 */
-
- printk(KERN_WARNING "ctrl + 0x%2x (0x%08x): iq %x: ", i*4, ch->ctrl_start + 4 * i, i);
- n = cx25821_risc_decode(risc);
- for (j = 1; j < n; j++) {
- risc = cx_read(ch->ctrl_start + 4 * (i + j));
- printk(KERN_WARNING "ctrl + 0x%2x : iq %x: 0x%08x [ arg #%d ]\n", 4*(i+j), i+j, risc, j);
- }
+ risc = cx_read(ch->ctrl_start + 4 * i);
+ /* No consideration for bits 63-32 */
+
+ printk(KERN_WARNING "ctrl + 0x%2x (0x%08x): iq %x: ", i*4, ch->ctrl_start + 4 * i, i);
+ n = cx25821_risc_decode(risc);
+ for (j = 1; j < n; j++) {
+ risc = cx_read(ch->ctrl_start + 4 * (i + j));
+ printk(KERN_WARNING "ctrl + 0x%2x : iq %x: 0x%08x [ arg #%d ]\n", 4*(i+j), i+j, risc, j);
+ }
}
printk(KERN_WARNING " : fifo: 0x%08x -> 0x%x\n", ch->fifo_start, ch->fifo_start+ch->fifo_size);
void cx25821_sram_channel_dump_audio(struct cx25821_dev *dev, struct sram_channel *ch)
{
static char *name[] = {
- "init risc lo",
- "init risc hi",
- "cdt base",
- "cdt size",
- "iq base",
- "iq size",
- "risc pc lo",
- "risc pc hi",
- "iq wr ptr",
- "iq rd ptr",
- "cdt current",
- "pci target lo",
- "pci target hi",
- "line / byte",
+ "init risc lo",
+ "init risc hi",
+ "cdt base",
+ "cdt size",
+ "iq base",
+ "iq size",
+ "risc pc lo",
+ "risc pc hi",
+ "iq wr ptr",
+ "iq rd ptr",
+ "cdt current",
+ "pci target lo",
+ "pci target hi",
+ "line / byte",
};
-
- u32 risc, value, tmp;
+
+ u32 risc, value, tmp;
unsigned int i, j, n;
printk(KERN_INFO "\n%s: %s - dma Audio channel status dump\n", dev->name, ch->name);
-
+
for (i = 0; i < ARRAY_SIZE(name); i++)
- printk(KERN_INFO "%s: cmds + 0x%2x: %-15s: 0x%08x\n", dev->name, i*4, name[i], cx_read(ch->cmds_start + 4*i));
+ printk(KERN_INFO "%s: cmds + 0x%2x: %-15s: 0x%08x\n", dev->name, i*4, name[i], cx_read(ch->cmds_start + 4*i));
- j=i*4;
+ j=i*4;
for (i = 0; i < 4; ) {
- risc = cx_read(ch->cmds_start + 4 * (i + 14));
- printk(KERN_WARNING "cmds + 0x%2x: risc%d: ", j+i*4, i);
- i += cx25821_risc_decode(risc);
+ risc = cx_read(ch->cmds_start + 4 * (i + 14));
+ printk(KERN_WARNING "cmds + 0x%2x: risc%d: ", j+i*4, i);
+ i += cx25821_risc_decode(risc);
}
-
+
for (i = 0; i < (64 >> 2); i += n) {
- risc = cx_read(ch->ctrl_start + 4 * i);
- /* No consideration for bits 63-32 */
-
- printk(KERN_WARNING "ctrl + 0x%2x (0x%08x): iq %x: ", i*4, ch->ctrl_start + 4 * i, i);
- n = cx25821_risc_decode(risc);
-
- for (j = 1; j < n; j++) {
- risc = cx_read(ch->ctrl_start + 4 * (i + j));
- printk(KERN_WARNING "ctrl + 0x%2x : iq %x: 0x%08x [ arg #%d ]\n", 4*(i+j), i+j, risc, j);
- }
+ risc = cx_read(ch->ctrl_start + 4 * i);
+ /* No consideration for bits 63-32 */
+
+ printk(KERN_WARNING "ctrl + 0x%2x (0x%08x): iq %x: ", i*4, ch->ctrl_start + 4 * i, i);
+ n = cx25821_risc_decode(risc);
+
+ for (j = 1; j < n; j++) {
+ risc = cx_read(ch->ctrl_start + 4 * (i + j));
+ printk(KERN_WARNING "ctrl + 0x%2x : iq %x: 0x%08x [ arg #%d ]\n", 4*(i+j), i+j, risc, j);
+ }
}
printk(KERN_WARNING " : fifo: 0x%08x -> 0x%x\n", ch->fifo_start, ch->fifo_start+ch->fifo_size);
printk(KERN_WARNING " : ptr2_reg: 0x%08x\n", cx_read(ch->ptr2_reg));
printk(KERN_WARNING " : cnt1_reg: 0x%08x\n", cx_read(ch->cnt1_reg));
printk(KERN_WARNING " : cnt2_reg: 0x%08x\n", cx_read(ch->cnt2_reg));
-
+
for( i=0; i < 4; i++)
{
- risc = cx_read(ch->cmds_start + 56 + (i*4));
- printk(KERN_WARNING "instruction %d = 0x%x\n", i, risc);
+ risc = cx_read(ch->cmds_start + 56 + (i*4));
+ printk(KERN_WARNING "instruction %d = 0x%x\n", i, risc);
}
//read data from the first cdt buffer
- risc = cx_read(AUD_A_CDT);
+ risc = cx_read(AUD_A_CDT);
printk(KERN_WARNING "\nread cdt loc=0x%x\n", risc);
for(i=0; i<8; i++)
{
- n = cx_read(risc+i*4);
- printk(KERN_WARNING "0x%x ", n);
- }
+ n = cx_read(risc+i*4);
+ printk(KERN_WARNING "0x%x ", n);
+ }
printk(KERN_WARNING "\n\n");
-
-
+
+
value = cx_read(CLK_RST);
CX25821_INFO(" CLK_RST = 0x%x \n\n", value);
CX25821_INFO(" PLL_A_POST_STAT_BIST = 0x%x \n\n", value);
value = cx_read(PLL_A_INT_FRAC);
CX25821_INFO(" PLL_A_INT_FRAC = 0x%x \n\n", value);
-
+
value = cx_read(PLL_B_POST_STAT_BIST);
CX25821_INFO(" PLL_B_POST_STAT_BIST = 0x%x \n\n", value);
value = cx_read(PLL_B_INT_FRAC);
CX25821_INFO(" PLL_B_INT_FRAC = 0x%x \n\n", value);
-
+
value = cx_read(PLL_C_POST_STAT_BIST);
CX25821_INFO(" PLL_C_POST_STAT_BIST = 0x%x \n\n", value);
value = cx_read(PLL_C_INT_FRAC);
CX25821_INFO(" PLL_C_INT_FRAC = 0x%x \n\n", value);
-
+
value = cx_read(PLL_D_POST_STAT_BIST);
CX25821_INFO(" PLL_D_POST_STAT_BIST = 0x%x \n\n", value);
value = cx_read(PLL_D_INT_FRAC);
CX25821_INFO(" PLL_D_INT_FRAC = 0x%x \n\n", value);
-
+
value = cx25821_i2c_read(&dev->i2c_bus[0], AFE_AB_DIAG_CTRL, &tmp);
CX25821_INFO(" AFE_AB_DIAG_CTRL (0x10900090) = 0x%x \n\n", value);
}
/* Disable Video A/B activity */
for(i=0; i<VID_CHANNEL_NUM; i++)
{
- cx_write(dev->sram_channels[i].dma_ctl, 0);
- cx_write(dev->sram_channels[i].int_msk, 0);
+ cx_write(dev->sram_channels[i].dma_ctl, 0);
+ cx_write(dev->sram_channels[i].int_msk, 0);
}
- for( i = VID_UPSTREAM_SRAM_CHANNEL_I; i <= VID_UPSTREAM_SRAM_CHANNEL_J; i++)
+ for( i = VID_UPSTREAM_SRAM_CHANNEL_I; i <= VID_UPSTREAM_SRAM_CHANNEL_J; i++)
{
- cx_write(dev->sram_channels[i].dma_ctl, 0);
- cx_write(dev->sram_channels[i].int_msk, 0);
+ cx_write(dev->sram_channels[i].dma_ctl, 0);
+ cx_write(dev->sram_channels[i].int_msk, 0);
}
-
+
/* Disable Audio activity */
cx_write(AUD_INT_DMA_CTL, 0);
}
void cx25821_set_pixel_format(struct cx25821_dev *dev, int channel_select, u32 format)
-{
- struct sram_channel *ch;
-
+{
+ struct sram_channel *ch;
+
if( channel_select <= 7 && channel_select >= 0 )
{
- ch = &cx25821_sram_channels[channel_select];
- cx_write(ch->pix_frmt, format);
- dev->pixel_formats[channel_select] = format;
+ ch = &cx25821_sram_channels[channel_select];
+ cx_write(ch->pix_frmt, format);
+ dev->pixel_formats[channel_select] = format;
}
}
int i;
dprintk(1, "%s()\n", __func__);
-
+
cx25821_shutdown(dev);
cx_write(PCI_INT_STAT, 0xffffffff);
-
+
for(i=0; i<VID_CHANNEL_NUM; i++)
- cx_write(dev->sram_channels[i].int_stat, 0xffffffff);
+ cx_write(dev->sram_channels[i].int_stat, 0xffffffff);
cx_write(AUD_A_INT_STAT, 0xffffffff);
cx_write(AUD_E_INT_STAT, 0xffffffff);
cx_write(CLK_DELAY, cx_read(CLK_DELAY) & 0x80000000);
- cx_write(PAD_CTRL, 0x12); //for I2C
+ cx_write(PAD_CTRL, 0x12); //for I2C
cx25821_registers_init(dev); //init Pecos registers
mdelay(100);
-
-
+
+
for(i=0; i<VID_CHANNEL_NUM; i++)
{
- cx25821_set_vip_mode(dev, &dev->sram_channels[i]);
- cx25821_sram_channel_setup(dev, &dev->sram_channels[i], 1440, 0);
- dev->pixel_formats[i] = PIXEL_FRMT_422;
- dev->use_cif_resolution[i] = FALSE;
+ cx25821_set_vip_mode(dev, &dev->sram_channels[i]);
+ cx25821_sram_channel_setup(dev, &dev->sram_channels[i], 1440, 0);
+ dev->pixel_formats[i] = PIXEL_FRMT_422;
+ dev->use_cif_resolution[i] = FALSE;
}
//Probably only affect Downstream
- for( i = VID_UPSTREAM_SRAM_CHANNEL_I; i <= VID_UPSTREAM_SRAM_CHANNEL_J; i++)
+ for( i = VID_UPSTREAM_SRAM_CHANNEL_I; i <= VID_UPSTREAM_SRAM_CHANNEL_J; i++)
{
- cx25821_set_vip_mode(dev, &dev->sram_channels[i]);
+ cx25821_set_vip_mode(dev, &dev->sram_channels[i]);
}
-
- cx25821_sram_channel_setup_audio(dev, &dev->sram_channels[SRAM_CH08], 128, 0);
+
+ cx25821_sram_channel_setup_audio(dev, &dev->sram_channels[SRAM_CH08], 128, 0);
cx25821_gpio_init(dev);
}
static int get_resources(struct cx25821_dev *dev)
{
if (request_mem_region(pci_resource_start(dev->pci, 0), pci_resource_len(dev->pci, 0), dev->name))
- return 0;
+ return 0;
printk(KERN_ERR "%s: can't get MMIO memory @ 0x%llx\n",
- dev->name, (unsigned long long)pci_resource_start(dev->pci, 0));
+ dev->name, (unsigned long long)pci_resource_start(dev->pci, 0));
return -EBUSY;
}
static void cx25821_dev_checkrevision(struct cx25821_dev *dev)
{
- dev->hwrevision = cx_read(RDR_CFG2) & 0xff;
+ dev->hwrevision = cx_read(RDR_CFG2) & 0xff;
printk(KERN_INFO "%s() Hardware revision = 0x%02x\n", __func__, dev->hwrevision);
}
static void cx25821_iounmap(struct cx25821_dev *dev)
{
if (dev == NULL)
- return;
+ return;
/* Releasing IO memory */
- if (dev->lmmio != NULL)
+ if (dev->lmmio != NULL)
{
- CX25821_INFO("Releasing lmmio.\n");
- iounmap(dev->lmmio);
- dev->lmmio = NULL;
+ CX25821_INFO("Releasing lmmio.\n");
+ iounmap(dev->lmmio);
+ dev->lmmio = NULL;
}
}
static int cx25821_dev_setup(struct cx25821_dev *dev)
-{
+{
int io_size = 0, i;
-
+
struct video_device *video_template[] = {
- &cx25821_video_template0,
- &cx25821_video_template1,
- &cx25821_video_template2,
- &cx25821_video_template3,
- &cx25821_video_template4,
- &cx25821_video_template5,
- &cx25821_video_template6,
- &cx25821_video_template7,
- &cx25821_video_template9,
- &cx25821_video_template10,
- &cx25821_video_template11,
- &cx25821_videoioctl_template,
- };
+ &cx25821_video_template0,
+ &cx25821_video_template1,
+ &cx25821_video_template2,
+ &cx25821_video_template3,
+ &cx25821_video_template4,
+ &cx25821_video_template5,
+ &cx25821_video_template6,
+ &cx25821_video_template7,
+ &cx25821_video_template9,
+ &cx25821_video_template10,
+ &cx25821_video_template11,
+ &cx25821_videoioctl_template,
+ };
printk(KERN_INFO "\n***********************************\n");
printk(KERN_INFO "cx25821 set up\n");
printk(KERN_INFO "***********************************\n\n");
-
+
mutex_init(&dev->lock);
atomic_inc(&dev->refcount);
strcpy(cx25821_boards[UNKNOWN_BOARD].name, "unknown");
strcpy(cx25821_boards[CX25821_BOARD].name, "cx25821");
-
-
+
+
if( dev->pci->device != 0x8210 )
{
- printk(KERN_INFO "%s() Exiting. Incorrect Hardware device = 0x%02x\n",
- __func__, dev->pci->device);
- return -1;
+ printk(KERN_INFO "%s() Exiting. Incorrect Hardware device = 0x%02x\n",
+ __func__, dev->pci->device);
+ return -1;
}
else
- {
- printk(KERN_INFO "Athena Hardware device = 0x%02x\n", dev->pci->device);
+ {
+ printk(KERN_INFO "Athena Hardware device = 0x%02x\n", dev->pci->device);
}
-
+
/* Apply a sensible clock frequency for the PCIe bridge */
dev->clk_freq = 28000000;
dev->sram_channels = cx25821_sram_channels;
if(dev->nr > 1)
{
- CX25821_INFO("dev->nr > 1!");
+ CX25821_INFO("dev->nr > 1!");
}
/* board config */
- dev->board = 1; //card[dev->nr];
+ dev->board = 1; //card[dev->nr];
dev->_max_num_decoders = MAX_DECODERS;
- if (get_resources(dev) < 0)
+ if (get_resources(dev) < 0)
{
- printk(KERN_ERR "%s No more PCIe resources for "
- "subsystem: %04x:%04x\n",
- dev->name, dev->pci->subsystem_vendor,
- dev->pci->subsystem_device);
+ printk(KERN_ERR "%s No more PCIe resources for "
+ "subsystem: %04x:%04x\n",
+ dev->name, dev->pci->subsystem_vendor,
+ dev->pci->subsystem_device);
- cx25821_devcount--;
- return -ENODEV;
+ cx25821_devcount--;
+ return -ENODEV;
}
- /* PCIe stuff */
+ /* PCIe stuff */
dev->base_io_addr = pci_resource_start(dev->pci, 0);
io_size = pci_resource_len(dev->pci, 0);
-
+
if (!dev->base_io_addr) {
- CX25821_ERR("No PCI Memory resources, exiting!\n");
- return -ENODEV;
+ CX25821_ERR("No PCI Memory resources, exiting!\n");
+ return -ENODEV;
}
-
+
dev->lmmio = ioremap(dev->base_io_addr, pci_resource_len(dev->pci, 0));
if (!dev->lmmio) {
- CX25821_ERR("ioremap failed, maybe increasing __VMALLOC_RESERVE in page.h\n");
- cx25821_iounmap(dev);
- return -ENOMEM;
+ CX25821_ERR("ioremap failed, maybe increasing __VMALLOC_RESERVE in page.h\n");
+ cx25821_iounmap(dev);
+ return -ENOMEM;
}
-
+
dev->bmmio = (u8 __iomem *)dev->lmmio;
printk(KERN_INFO "%s: subsystem: %04x:%04x, board: %s [card=%d,%s]\n",
- dev->name, dev->pci->subsystem_vendor,
- dev->pci->subsystem_device, cx25821_boards[dev->board].name,
- dev->board, card[dev->nr] == dev->board ?
- "insmod option" : "autodetected");
+ dev->name, dev->pci->subsystem_vendor,
+ dev->pci->subsystem_device, cx25821_boards[dev->board].name,
+ dev->board, card[dev->nr] == dev->board ?
+ "insmod option" : "autodetected");
/* init hardware */
cx25821_initialize(dev);
-
+
cx25821_i2c_register(&dev->i2c_bus[0]);
// cx25821_i2c_register(&dev->i2c_bus[1]);
// cx25821_i2c_register(&dev->i2c_bus[2]);
CX25821_INFO("i2c register! bus->i2c_rc = %d\n", dev->i2c_bus[0].i2c_rc);
- cx25821_card_setup(dev);
+ cx25821_card_setup(dev);
medusa_video_init(dev);
-
+
for(i = 0; i < VID_CHANNEL_NUM; i++)
{
- if (cx25821_video_register(dev, i, video_template[i]) < 0) {
- printk(KERN_ERR "%s() Failed to register analog video adapters on VID channel %d\n", __func__, i);
- }
+ if (cx25821_video_register(dev, i, video_template[i]) < 0) {
+ printk(KERN_ERR "%s() Failed to register analog video adapters on VID channel %d\n", __func__, i);
+ }
}
-
-
+
+
for(i = VID_UPSTREAM_SRAM_CHANNEL_I; i <= AUDIO_UPSTREAM_SRAM_CHANNEL_B; i++)
{
- //Since we don't have template8 for Audio Downstream
- if (cx25821_video_register(dev, i, video_template[i-1]) < 0) {
- printk(KERN_ERR "%s() Failed to register analog video adapters for Upstream channel %d.\n", __func__, i);
- }
+ //Since we don't have template8 for Audio Downstream
+ if (cx25821_video_register(dev, i, video_template[i-1]) < 0) {
+ printk(KERN_ERR "%s() Failed to register analog video adapters for Upstream channel %d.\n", __func__, i);
+ }
}
-
- // register IOCTL device
+
+ // register IOCTL device
dev->ioctl_dev = cx25821_vdev_init(dev, dev->pci, video_template[VIDEO_IOCTL_CH], "video");
-
+
if( video_register_device(dev->ioctl_dev, VFL_TYPE_GRABBER, VIDEO_IOCTL_CH) < 0 )
- {
- cx25821_videoioctl_unregister(dev);
- printk(KERN_ERR "%s() Failed to register video adapter for IOCTL so releasing.\n", __func__);
+ {
+ cx25821_videoioctl_unregister(dev);
+ printk(KERN_ERR "%s() Failed to register video adapter for IOCTL so releasing.\n", __func__);
}
-
+
cx25821_dev_checkrevision(dev);
CX25821_INFO("cx25821 setup done!\n");
-
+
return 0;
-}
+}
void cx25821_start_upstream_video_ch1(struct cx25821_dev *dev, struct upstream_user_struct *up_data)
{
- dev->_isNTSC = !strcmp(dev->vid_stdname,"NTSC") ? 1 : 0;
-
- dev->tvnorm = !dev->_isNTSC ? V4L2_STD_PAL_BG : V4L2_STD_NTSC_M;
+ dev->_isNTSC = !strcmp(dev->vid_stdname,"NTSC") ? 1 : 0;
+
+ dev->tvnorm = !dev->_isNTSC ? V4L2_STD_PAL_BG : V4L2_STD_NTSC_M;
medusa_set_videostandard(dev);
-
- cx25821_vidupstream_init_ch1(dev, dev->channel_select, dev->pixel_format);
+
+ cx25821_vidupstream_init_ch1(dev, dev->channel_select, dev->pixel_format);
}
void cx25821_start_upstream_video_ch2(struct cx25821_dev *dev, struct upstream_user_struct *up_data)
{
- dev->_isNTSC_ch2 = !strcmp(dev->vid_stdname_ch2,"NTSC") ? 1 : 0;
+ dev->_isNTSC_ch2 = !strcmp(dev->vid_stdname_ch2,"NTSC") ? 1 : 0;
+
+ dev->tvnorm = !dev->_isNTSC_ch2 ? V4L2_STD_PAL_BG : V4L2_STD_NTSC_M;
+ medusa_set_videostandard(dev);
- dev->tvnorm = !dev->_isNTSC_ch2 ? V4L2_STD_PAL_BG : V4L2_STD_NTSC_M;
- medusa_set_videostandard(dev);
-
- cx25821_vidupstream_init_ch2(dev, dev->channel_select_ch2, dev->pixel_format_ch2);
+ cx25821_vidupstream_init_ch2(dev, dev->channel_select_ch2, dev->pixel_format_ch2);
}
void cx25821_start_upstream_audio(struct cx25821_dev *dev, struct upstream_user_struct *up_data)
{
- cx25821_audio_upstream_init(dev, AUDIO_UPSTREAM_SRAM_CHANNEL_B);
+ cx25821_audio_upstream_init(dev, AUDIO_UPSTREAM_SRAM_CHANNEL_B);
}
-
+
void cx25821_dev_unregister(struct cx25821_dev *dev)
{
int i;
- if (!dev->base_io_addr)
- return;
-
+ if (!dev->base_io_addr)
+ return;
+
cx25821_free_mem_upstream_ch1(dev);
- cx25821_free_mem_upstream_ch2(dev);
- cx25821_free_mem_upstream_audio(dev);
-
+ cx25821_free_mem_upstream_ch2(dev);
+ cx25821_free_mem_upstream_audio(dev);
+
release_mem_region(dev->base_io_addr, pci_resource_len(dev->pci, 0));
if (!atomic_dec_and_test(&dev->refcount))
- return;
+ return;
for(i=0; i < VID_CHANNEL_NUM; i++)
- cx25821_video_unregister(dev, i);
+ cx25821_video_unregister(dev, i);
+
-
for(i = VID_UPSTREAM_SRAM_CHANNEL_I; i <= AUDIO_UPSTREAM_SRAM_CHANNEL_B; i++)
{
- cx25821_video_unregister(dev, i);
+ cx25821_video_unregister(dev, i);
}
-
+
cx25821_videoioctl_unregister(dev);
-
+
cx25821_i2c_unregister( &dev->i2c_bus[0] );
cx25821_iounmap(dev);
}
static __le32 *cx25821_risc_field(__le32 *rp, struct scatterlist *sglist,
- unsigned int offset, u32 sync_line,
- unsigned int bpl, unsigned int padding,
- unsigned int lines)
+ unsigned int offset, u32 sync_line,
+ unsigned int bpl, unsigned int padding,
+ unsigned int lines)
{
struct scatterlist *sg;
unsigned int line, todo;
/* sync instruction */
if (sync_line != NO_SYNC_LINE)
{
- *(rp++) = cpu_to_le32(RISC_RESYNC | sync_line);
+ *(rp++) = cpu_to_le32(RISC_RESYNC | sync_line);
}
/* scan lines */
sg = sglist;
for (line = 0; line < lines; line++) {
- while (offset && offset >= sg_dma_len(sg)) {
- offset -= sg_dma_len(sg);
- sg++;
- }
- if (bpl <= sg_dma_len(sg)-offset) {
- /* fits into current chunk */
- *(rp++) = cpu_to_le32(RISC_WRITE|RISC_SOL|RISC_EOL|bpl);
- *(rp++) = cpu_to_le32(sg_dma_address(sg)+offset);
- *(rp++) = cpu_to_le32(0); /* bits 63-32 */
- offset += bpl;
- } else {
- /* scanline needs to be split */
- todo = bpl;
- *(rp++) = cpu_to_le32(RISC_WRITE|RISC_SOL|(sg_dma_len(sg)-offset));
- *(rp++) = cpu_to_le32(sg_dma_address(sg)+offset);
- *(rp++) = cpu_to_le32(0); /* bits 63-32 */
- todo -= (sg_dma_len(sg)-offset);
- offset = 0;
- sg++;
- while (todo > sg_dma_len(sg)) {
- *(rp++) = cpu_to_le32(RISC_WRITE|sg_dma_len(sg));
- *(rp++) = cpu_to_le32(sg_dma_address(sg));
- *(rp++) = cpu_to_le32(0); /* bits 63-32 */
- todo -= sg_dma_len(sg);
- sg++;
- }
- *(rp++) = cpu_to_le32(RISC_WRITE|RISC_EOL|todo);
- *(rp++) = cpu_to_le32(sg_dma_address(sg));
- *(rp++) = cpu_to_le32(0); /* bits 63-32 */
- offset += todo;
- }
-
- offset += padding;
+ while (offset && offset >= sg_dma_len(sg)) {
+ offset -= sg_dma_len(sg);
+ sg++;
+ }
+ if (bpl <= sg_dma_len(sg)-offset) {
+ /* fits into current chunk */
+ *(rp++) = cpu_to_le32(RISC_WRITE|RISC_SOL|RISC_EOL|bpl);
+ *(rp++) = cpu_to_le32(sg_dma_address(sg)+offset);
+ *(rp++) = cpu_to_le32(0); /* bits 63-32 */
+ offset += bpl;
+ } else {
+ /* scanline needs to be split */
+ todo = bpl;
+ *(rp++) = cpu_to_le32(RISC_WRITE|RISC_SOL|(sg_dma_len(sg)-offset));
+ *(rp++) = cpu_to_le32(sg_dma_address(sg)+offset);
+ *(rp++) = cpu_to_le32(0); /* bits 63-32 */
+ todo -= (sg_dma_len(sg)-offset);
+ offset = 0;
+ sg++;
+ while (todo > sg_dma_len(sg)) {
+ *(rp++) = cpu_to_le32(RISC_WRITE|sg_dma_len(sg));
+ *(rp++) = cpu_to_le32(sg_dma_address(sg));
+ *(rp++) = cpu_to_le32(0); /* bits 63-32 */
+ todo -= sg_dma_len(sg);
+ sg++;
+ }
+ *(rp++) = cpu_to_le32(RISC_WRITE|RISC_EOL|todo);
+ *(rp++) = cpu_to_le32(sg_dma_address(sg));
+ *(rp++) = cpu_to_le32(0); /* bits 63-32 */
+ offset += todo;
+ }
+
+ offset += padding;
}
return rp;
}
int cx25821_risc_buffer(struct pci_dev *pci, struct btcx_riscmem *risc,
- struct scatterlist *sglist, unsigned int top_offset,
- unsigned int bottom_offset, unsigned int bpl,
- unsigned int padding, unsigned int lines)
+ struct scatterlist *sglist, unsigned int top_offset,
+ unsigned int bottom_offset, unsigned int bpl,
+ unsigned int padding, unsigned int lines)
{
u32 instructions;
- u32 fields;
+ u32 fields;
__le32 *rp;
int rc;
fields = 0;
if (UNSET != top_offset)
- fields++;
+ fields++;
if (UNSET != bottom_offset)
- fields++;
+ fields++;
/* estimate risc mem: worst case is one write per page border +
one write per scan line + syncs + jump (all 2 dwords). Padding
rc = btcx_riscmem_alloc(pci, risc, instructions*12);
if (rc < 0)
- return rc;
+ return rc;
/* write risc instructions */
rp = risc->cpu;
-
+
if (UNSET != top_offset)
{
- rp = cx25821_risc_field(rp, sglist, top_offset, 0, bpl, padding, lines);
+ rp = cx25821_risc_field(rp, sglist, top_offset, 0, bpl, padding, lines);
}
if (UNSET != bottom_offset)
{
- rp = cx25821_risc_field(rp, sglist, bottom_offset, 0x200, bpl, padding, lines);
+ rp = cx25821_risc_field(rp, sglist, bottom_offset, 0x200, bpl, padding, lines);
}
/* save pointer to jmp instruction address */
static __le32* cx25821_risc_field_audio(__le32 *rp, struct scatterlist *sglist,
- unsigned int offset, u32 sync_line,
- unsigned int bpl, unsigned int padding,
- unsigned int lines, unsigned int lpi)
+ unsigned int offset, u32 sync_line,
+ unsigned int bpl, unsigned int padding,
+ unsigned int lines, unsigned int lpi)
{
struct scatterlist *sg;
unsigned int line, todo, sol;
/* sync instruction */
if (sync_line != NO_SYNC_LINE)
- *(rp++) = cpu_to_le32(RISC_RESYNC | sync_line);
+ *(rp++) = cpu_to_le32(RISC_RESYNC | sync_line);
/* scan lines */
sg = sglist;
for (line = 0; line < lines; line++) {
- while (offset && offset >= sg_dma_len(sg)) {
- offset -= sg_dma_len(sg);
- sg++;
- }
-
- if (lpi && line > 0 && !(line % lpi))
- sol = RISC_SOL | RISC_IRQ1 | RISC_CNT_INC;
- else
- sol = RISC_SOL;
-
- if (bpl <= sg_dma_len(sg)-offset) {
- /* fits into current chunk */
- *(rp++) = cpu_to_le32(RISC_WRITE|sol|RISC_EOL|bpl);
- *(rp++)=cpu_to_le32(sg_dma_address(sg)+offset);
- *(rp++)=cpu_to_le32(0); /* bits 63-32 */
- offset+=bpl;
- } else {
- /* scanline needs to be split */
- todo = bpl;
- *(rp++) = cpu_to_le32(RISC_WRITE|sol|
- (sg_dma_len(sg)-offset));
- *(rp++)=cpu_to_le32(sg_dma_address(sg)+offset);
- *(rp++)=cpu_to_le32(0); /* bits 63-32 */
- todo -= (sg_dma_len(sg)-offset);
- offset = 0;
- sg++;
- while (todo > sg_dma_len(sg)) {
- *(rp++)=cpu_to_le32(RISC_WRITE|
- sg_dma_len(sg));
- *(rp++)=cpu_to_le32(sg_dma_address(sg));
- *(rp++)=cpu_to_le32(0); /* bits 63-32 */
- todo -= sg_dma_len(sg);
- sg++;
- }
- *(rp++)=cpu_to_le32(RISC_WRITE|RISC_EOL|todo);
- *(rp++)=cpu_to_le32(sg_dma_address(sg));
- *(rp++)=cpu_to_le32(0); /* bits 63-32 */
- offset += todo;
- }
- offset += padding;
+ while (offset && offset >= sg_dma_len(sg)) {
+ offset -= sg_dma_len(sg);
+ sg++;
+ }
+
+ if (lpi && line > 0 && !(line % lpi))
+ sol = RISC_SOL | RISC_IRQ1 | RISC_CNT_INC;
+ else
+ sol = RISC_SOL;
+
+ if (bpl <= sg_dma_len(sg)-offset) {
+ /* fits into current chunk */
+ *(rp++) = cpu_to_le32(RISC_WRITE|sol|RISC_EOL|bpl);
+ *(rp++)=cpu_to_le32(sg_dma_address(sg)+offset);
+ *(rp++)=cpu_to_le32(0); /* bits 63-32 */
+ offset+=bpl;
+ } else {
+ /* scanline needs to be split */
+ todo = bpl;
+ *(rp++) = cpu_to_le32(RISC_WRITE|sol|
+ (sg_dma_len(sg)-offset));
+ *(rp++)=cpu_to_le32(sg_dma_address(sg)+offset);
+ *(rp++)=cpu_to_le32(0); /* bits 63-32 */
+ todo -= (sg_dma_len(sg)-offset);
+ offset = 0;
+ sg++;
+ while (todo > sg_dma_len(sg)) {
+ *(rp++)=cpu_to_le32(RISC_WRITE|
+ sg_dma_len(sg));
+ *(rp++)=cpu_to_le32(sg_dma_address(sg));
+ *(rp++)=cpu_to_le32(0); /* bits 63-32 */
+ todo -= sg_dma_len(sg);
+ sg++;
+ }
+ *(rp++)=cpu_to_le32(RISC_WRITE|RISC_EOL|todo);
+ *(rp++)=cpu_to_le32(sg_dma_address(sg));
+ *(rp++)=cpu_to_le32(0); /* bits 63-32 */
+ offset += todo;
+ }
+ offset += padding;
}
return rp;
}
int cx25821_risc_databuffer_audio(struct pci_dev *pci,
- struct btcx_riscmem *risc,
- struct scatterlist *sglist,
- unsigned int bpl,
- unsigned int lines,
- unsigned int lpi)
+ struct btcx_riscmem *risc,
+ struct scatterlist *sglist,
+ unsigned int bpl,
+ unsigned int lines,
+ unsigned int lpi)
{
u32 instructions;
__le32 *rp;
instructions += 1;
if ((rc = btcx_riscmem_alloc(pci,risc,instructions*12)) < 0)
- return rc;
+ return rc;
/* write risc instructions */
rp = risc->cpu;
rp = cx25821_risc_field_audio(rp, sglist, 0, NO_SYNC_LINE, bpl, 0, lines, lpi);
-
+
/* save pointer to jmp instruction address */
risc->jmp = rp;
BUG_ON((risc->jmp - risc->cpu + 2) * sizeof (*risc->cpu) > risc->size);
rc = btcx_riscmem_alloc(pci, risc, 4*16);
if (rc < 0)
- return rc;
+ return rc;
/* write risc instructions */
rp = risc->cpu;
- *(rp++) = cpu_to_le32(RISC_WRITECR | RISC_IRQ1);
- *(rp++) = cpu_to_le32(reg);
- *(rp++) = cpu_to_le32(value);
- *(rp++) = cpu_to_le32(mask);
- *(rp++) = cpu_to_le32(RISC_JUMP);
- *(rp++) = cpu_to_le32(risc->dma);
- *(rp++) = cpu_to_le32(0); /* bits 63-32 */
+ *(rp++) = cpu_to_le32(RISC_WRITECR | RISC_IRQ1);
+ *(rp++) = cpu_to_le32(reg);
+ *(rp++) = cpu_to_le32(value);
+ *(rp++) = cpu_to_le32(mask);
+ *(rp++) = cpu_to_le32(RISC_JUMP);
+ *(rp++) = cpu_to_le32(risc->dma);
+ *(rp++) = cpu_to_le32(0); /* bits 63-32 */
return 0;
}
pci_status = cx_read(PCI_INT_STAT);
pci_mask = cx_read(PCI_INT_MSK);
-
- if (pci_status == 0)
- goto out;
+
+ if (pci_status == 0)
+ goto out;
for(i = 0; i < VID_CHANNEL_NUM; i++)
{
- if(pci_status & mask[i])
- {
- vid_status = cx_read(dev->sram_channels[i].int_stat);
+ if(pci_status & mask[i])
+ {
+ vid_status = cx_read(dev->sram_channels[i].int_stat);
- if(vid_status)
- handled += cx25821_video_irq(dev, i, vid_status);
+ if(vid_status)
+ handled += cx25821_video_irq(dev, i, vid_status);
- cx_write(PCI_INT_STAT, mask[i]);
- }
+ cx_write(PCI_INT_STAT, mask[i]);
+ }
}
-
+
out:
return IRQ_RETVAL(handled);
}
void cx25821_print_irqbits(char *name, char *tag, char **strings,
- int len, u32 bits, u32 mask)
+ int len, u32 bits, u32 mask)
{
unsigned int i;
printk(KERN_DEBUG "%s: %s [0x%x]", name, tag, bits);
-
+
for (i = 0; i < len; i++) {
- if (!(bits & (1 << i)))
- continue;
- if (strings[i])
- printk(" %s", strings[i]);
- else
- printk(" %d", i);
- if (!(mask & (1 << i)))
- continue;
- printk("*");
+ if (!(bits & (1 << i)))
+ continue;
+ if (strings[i])
+ printk(" %s", strings[i]);
+ else
+ printk(" %d", i);
+ if (!(mask & (1 << i)))
+ continue;
+ printk("*");
}
printk("\n");
}
struct cx25821_dev* cx25821_dev_get(struct pci_dev *pci)
{
- struct cx25821_dev *dev = pci_get_drvdata(pci);
+ struct cx25821_dev *dev = pci_get_drvdata(pci);
return dev;
}
static int __devinit cx25821_initdev(struct pci_dev *pci_dev, const struct pci_device_id *pci_id)
{
- struct cx25821_dev *dev;
+ struct cx25821_dev *dev;
int err = 0;
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
if (NULL == dev)
- return -ENOMEM;
-
-
+ return -ENOMEM;
+
+
err = v4l2_device_register(&pci_dev->dev, &dev->v4l2_dev);
if (err < 0)
- goto fail_free;
-
+ goto fail_free;
+
/* pci init */
dev->pci = pci_dev;
- if (pci_enable_device(pci_dev))
+ if (pci_enable_device(pci_dev))
{
- err = -EIO;
+ err = -EIO;
- printk(KERN_INFO "pci enable failed! ");
+ printk(KERN_INFO "pci enable failed! ");
- goto fail_unregister_device;
+ goto fail_unregister_device;
}
printk(KERN_INFO "cx25821 Athena pci enable ! \n");
- if (cx25821_dev_setup(dev) < 0)
+ if (cx25821_dev_setup(dev) < 0)
{
- err = -EINVAL;
- goto fail_unregister_device;
+ err = -EINVAL;
+ goto fail_unregister_device;
}
/* print pci info */
pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &dev->pci_rev);
pci_read_config_byte(pci_dev, PCI_LATENCY_TIMER, &dev->pci_lat);
printk(KERN_INFO "%s/0: found at %s, rev: %d, irq: %d, "
- "latency: %d, mmio: 0x%llx\n", dev->name,
- pci_name(pci_dev), dev->pci_rev, pci_dev->irq,
- dev->pci_lat,
- (unsigned long long)dev->base_io_addr );
-
+ "latency: %d, mmio: 0x%llx\n", dev->name,
+ pci_name(pci_dev), dev->pci_rev, pci_dev->irq,
+ dev->pci_lat,
+ (unsigned long long)dev->base_io_addr );
+
pci_set_master(pci_dev);
- if (!pci_dma_supported(pci_dev, 0xffffffff))
+ if (!pci_dma_supported(pci_dev, 0xffffffff))
{
- printk("%s/0: Oops: no 32bit PCI DMA ???\n", dev->name);
- err = -EIO;
- goto fail_irq;
+ printk("%s/0: Oops: no 32bit PCI DMA ???\n", dev->name);
+ err = -EIO;
+ goto fail_irq;
}
err = request_irq(pci_dev->irq, cx25821_irq, IRQF_SHARED | IRQF_DISABLED, dev->name, dev);
- if (err < 0)
+ if (err < 0)
{
- printk(KERN_ERR "%s: can't get IRQ %d\n", dev->name, pci_dev->irq);
- goto fail_irq;
+ printk(KERN_ERR "%s: can't get IRQ %d\n", dev->name, pci_dev->irq);
+ goto fail_irq;
}
return 0;
fail_irq:
printk(KERN_INFO "cx25821 cx25821_initdev() can't get IRQ ! \n");
cx25821_dev_unregister(dev);
-
-fail_unregister_device:
+
+fail_unregister_device:
v4l2_device_unregister(&dev->v4l2_dev);
-
+
fail_free:
kfree(dev);
return err;
{
struct v4l2_device *v4l2_dev = pci_get_drvdata(pci_dev);
struct cx25821_dev *dev = get_cx25821(v4l2_dev);
-
- cx25821_shutdown(dev);
+
+ cx25821_shutdown(dev);
pci_disable_device(pci_dev);
/* unregister stuff */
- if( pci_dev->irq )
- free_irq(pci_dev->irq, dev);
-
-
+ if( pci_dev->irq )
+ free_irq(pci_dev->irq, dev);
+
+
mutex_lock(&devlist);
list_del(&dev->devlist);
mutex_unlock(&devlist);
cx25821_dev_unregister(dev);
- v4l2_device_unregister(v4l2_dev);
+ v4l2_device_unregister(v4l2_dev);
kfree(dev);
}
static struct pci_device_id cx25821_pci_tbl[] = {
{
- /* CX25821 Athena*/
- .vendor = 0x14f1,
- .device = 0x8210,
- .subvendor = 0x14f1,
- .subdevice = 0x0920,
- },
+ /* CX25821 Athena*/
+ .vendor = 0x14f1,
+ .device = 0x8210,
+ .subvendor = 0x14f1,
+ .subdevice = 0x0920,
+ },
{
- /* --- end of list --- */
+ /* --- end of list --- */
}
};
MODULE_DEVICE_TABLE(pci, cx25821_pci_tbl);
-static struct pci_driver cx25821_pci_driver =
+static struct pci_driver cx25821_pci_driver =
{
.name = "cx25821",
.id_table = cx25821_pci_tbl,
static int cx25821_init(void)
{
- INIT_LIST_HEAD(&cx25821_devlist);
+ INIT_LIST_HEAD(&cx25821_devlist);
printk(KERN_INFO "cx25821 driver version %d.%d.%d loaded\n",
- (CX25821_VERSION_CODE >> 16) & 0xff,
- (CX25821_VERSION_CODE >> 8) & 0xff,
- CX25821_VERSION_CODE & 0xff);
+ (CX25821_VERSION_CODE >> 16) & 0xff,
+ (CX25821_VERSION_CODE >> 8) & 0xff,
+ CX25821_VERSION_CODE & 0xff);
return pci_register_driver(&cx25821_pci_driver);
}
/********************* GPIO stuffs *********************/
void cx25821_set_gpiopin_direction( struct cx25821_dev *dev,
- int pin_number,
- int pin_logic_value)
+ int pin_number,
+ int pin_logic_value)
{
int bit = pin_number;
u32 gpio_oe_reg = GPIO_LO_OE;
u32 gpio_register = 0;
u32 value = 0;
-
+
// Check for valid pinNumber
if ( pin_number >= 47 )
- return;
+ return;
if ( pin_number > 31 )
// Here we will make sure that the GPIOs 0 and 1 are output. keep the rest as is
gpio_register = cx_read( gpio_oe_reg );
-
+
if (pin_logic_value == 1)
{
- value = gpio_register | Set_GPIO_Bit(bit) ;
+ value = gpio_register | Set_GPIO_Bit(bit) ;
}
else
{
- value = gpio_register & Clear_GPIO_Bit(bit) ;
+ value = gpio_register & Clear_GPIO_Bit(bit) ;
}
cx_write( gpio_oe_reg, value );
}
static void cx25821_set_gpiopin_logicvalue( struct cx25821_dev *dev,
- int pin_number,
- int pin_logic_value)
-{
+ int pin_number,
+ int pin_logic_value)
+{
int bit = pin_number;
u32 gpio_reg = GPIO_LO;
u32 value = 0;
-
-
+
+
// Check for valid pinNumber
if (pin_number >= 47)
- return;
-
+ return;
+
cx25821_set_gpiopin_direction(dev, pin_number, 0); // change to output direction
}
value = cx_read( gpio_reg );
-
-
+
+
if (pin_logic_value == 0)
{
- value &= Clear_GPIO_Bit(bit);
+ value &= Clear_GPIO_Bit(bit);
}
else
{
- value |= Set_GPIO_Bit(bit);
+ value |= Set_GPIO_Bit(bit);
}
cx_write( gpio_reg, value);
{
return;
}
-
- switch (dev->board)
+
+ switch (dev->board)
{
- case CX25821_BOARD_CONEXANT_ATHENA10:
- default:
- //set GPIO 5 to select the path for Medusa/Athena
- cx25821_set_gpiopin_logicvalue(dev, 5, 1);
+ case CX25821_BOARD_CONEXANT_ATHENA10:
+ default:
+ //set GPIO 5 to select the path for Medusa/Athena
+ cx25821_set_gpiopin_logicvalue(dev, 5, 1);
mdelay(20);
break;
}
-
+
}
dprintk(1, "%s(msg->len=%d)\n", __func__, msg->len);
/* Deal with i2c probe functions with zero payload */
- if (msg->len == 0)
+ if (msg->len == 0)
{
- cx_write(bus->reg_addr, msg->addr << 25);
+ cx_write(bus->reg_addr, msg->addr << 25);
cx_write(bus->reg_ctrl, bus->i2c_period | (1 << 2));
if (!i2c_wait_done(i2c_adap))
/* dev, reg + first byte */
addr = (msg->addr << 25) | msg->buf[0];
wdata = msg->buf[0];
-
+
ctrl = bus->i2c_period | (1 << 12) | (1 << 2);
if (msg->len > 1)
if (retval == 0)
goto eio;
- if (i2c_debug)
+ if (i2c_debug)
{
if (!(ctrl & I2C_NOSTOP))
printk(" >\n");
if (retval == 0)
goto eio;
- if (i2c_debug)
+ if (i2c_debug)
{
dprintk(1, " %02x", msg->buf[cnt]);
if (!(ctrl & I2C_NOSTOP))
dprintk(1, " >\n");
}
}
-
+
return msg->len;
eio:
dprintk(1, "%s(num = %d)\n", __func__, num);
- for (i = 0 ; i < num; i++)
+ for (i = 0 ; i < num; i++)
{
dprintk(1, "%s(num = %d) addr = 0x%02x len = 0x%x\n",
__func__, num, msgs[i].addr, msgs[i].len);
- if (msgs[i].flags & I2C_M_RD)
+ if (msgs[i].flags & I2C_M_RD)
{
/* read */
retval = i2c_readbytes(i2c_adap, &msgs[i], 0);
- }
+ }
else if (i + 1 < num && (msgs[i + 1].flags & I2C_M_RD) &&
- msgs[i].addr == msgs[i + 1].addr)
+ msgs[i].addr == msgs[i + 1].addr)
{
/* write then read from same address */
retval = i2c_sendbytes(i2c_adap, &msgs[i], msgs[i + 1].len);
goto err;
i++;
retval = i2c_readbytes(i2c_adap, &msgs[i], 1);
- }
- else
+ }
+ else
{
/* write */
retval = i2c_sendbytes(i2c_adap, &msgs[i], 0);
}
-
+
if (retval < 0)
goto err;
}
static u32 cx25821_functionality(struct i2c_adapter *adap)
{
- return I2C_FUNC_SMBUS_EMUL |
+ return I2C_FUNC_SMBUS_EMUL |
I2C_FUNC_I2C |
- I2C_FUNC_SMBUS_WORD_DATA |
+ I2C_FUNC_SMBUS_WORD_DATA |
I2C_FUNC_SMBUS_READ_WORD_DATA |
I2C_FUNC_SMBUS_WRITE_WORD_DATA;
}
//set up the I2c
bus->i2c_client.addr = (0x88>>1);
-
+
return bus->i2c_rc;
}
int v = 0;
u8 addr[2] = {0, 0};
u8 buf[4] = {0,0,0,0};
-
+
struct i2c_msg msgs[2]={
- {
- .addr = client->addr,
- .flags = 0,
- .len = 2,
- .buf = addr,
- }, {
- .addr = client->addr,
- .flags = I2C_M_RD,
- .len = 4,
- .buf = buf,
- }
+ {
+ .addr = client->addr,
+ .flags = 0,
+ .len = 2,
+ .buf = addr,
+ }, {
+ .addr = client->addr,
+ .flags = I2C_M_RD,
+ .len = 4,
+ .buf = buf,
+ }
};
v = (buf[3]<<24) | (buf[2]<<16) | (buf[1]<<8) | buf[0];
*value = v;
- return v;
+ return v;
}
int cx25821_i2c_write(struct cx25821_i2c *bus, u16 reg_addr, int value)
{
struct i2c_client *client = &bus->i2c_client;
- int retval = 0;
+ int retval = 0;
u8 buf[6] = {0, 0, 0, 0, 0, 0};
struct i2c_msg msgs[1]={
- {
- .addr = client->addr,
- .flags = 0,
- .len = 6,
- .buf = buf,
- }
+ {
+ .addr = client->addr,
+ .flags = 0,
+ .len = 6,
+ .buf = buf,
+ }
};
/*
* Driver for the Conexant CX25821 PCIe bridge
*
- * Copyright (C) 2009 Conexant Systems Inc.
+ * Copyright (C) 2009 Conexant Systems Inc.
* Authors <shu.lin@conexant.com>, <hiep.huynh@conexant.com>
*
* This program is free software; you can redistribute it and/or modify
int out_ctrl = OUT_CTRL1;
int out_ctrl_ns = OUT_CTRL_NS;
-
+
switch (channel)
{
- default:
- case VDEC_A:
- break;
- case VDEC_B:
- out_ctrl = VDEC_B_OUT_CTRL1;
- out_ctrl_ns = VDEC_B_OUT_CTRL_NS;
- break;
- case VDEC_C:
- out_ctrl = VDEC_C_OUT_CTRL1;
- out_ctrl_ns = VDEC_C_OUT_CTRL_NS;
- break;
- case VDEC_D:
- out_ctrl = VDEC_D_OUT_CTRL1;
- out_ctrl_ns = VDEC_D_OUT_CTRL_NS;
- break;
- case VDEC_E:
- out_ctrl = VDEC_E_OUT_CTRL1;
- out_ctrl_ns = VDEC_E_OUT_CTRL_NS;
- return;
- case VDEC_F:
- out_ctrl = VDEC_F_OUT_CTRL1;
- out_ctrl_ns = VDEC_F_OUT_CTRL_NS;
- return;
- case VDEC_G:
- out_ctrl = VDEC_G_OUT_CTRL1;
- out_ctrl_ns = VDEC_G_OUT_CTRL_NS;
- return;
- case VDEC_H:
- out_ctrl = VDEC_H_OUT_CTRL1;
- out_ctrl_ns = VDEC_H_OUT_CTRL_NS;
- return;
+ default:
+ case VDEC_A:
+ break;
+ case VDEC_B:
+ out_ctrl = VDEC_B_OUT_CTRL1;
+ out_ctrl_ns = VDEC_B_OUT_CTRL_NS;
+ break;
+ case VDEC_C:
+ out_ctrl = VDEC_C_OUT_CTRL1;
+ out_ctrl_ns = VDEC_C_OUT_CTRL_NS;
+ break;
+ case VDEC_D:
+ out_ctrl = VDEC_D_OUT_CTRL1;
+ out_ctrl_ns = VDEC_D_OUT_CTRL_NS;
+ break;
+ case VDEC_E:
+ out_ctrl = VDEC_E_OUT_CTRL1;
+ out_ctrl_ns = VDEC_E_OUT_CTRL_NS;
+ return;
+ case VDEC_F:
+ out_ctrl = VDEC_F_OUT_CTRL1;
+ out_ctrl_ns = VDEC_F_OUT_CTRL_NS;
+ return;
+ case VDEC_G:
+ out_ctrl = VDEC_G_OUT_CTRL1;
+ out_ctrl_ns = VDEC_G_OUT_CTRL_NS;
+ return;
+ case VDEC_H:
+ out_ctrl = VDEC_H_OUT_CTRL1;
+ out_ctrl_ns = VDEC_H_OUT_CTRL_NS;
+ return;
}
value = cx25821_i2c_read(&dev->i2c_bus[0], out_ctrl, &tmp);
value &= 0xFFFFFF7F; // clear BLUE_FIELD_EN
if (enable)
- value |= 0x00000080; // set BLUE_FIELD_EN
+ value |= 0x00000080; // set BLUE_FIELD_EN
ret_val = cx25821_i2c_write(&dev->i2c_bus[0], out_ctrl, value);
value = cx25821_i2c_read(&dev->i2c_bus[0], out_ctrl_ns, &tmp);
value &= 0xFFFFFF7F;
if (enable)
- value |= 0x00000080; // set BLUE_FIELD_EN
+ value |= 0x00000080; // set BLUE_FIELD_EN
ret_val = cx25821_i2c_write(&dev->i2c_bus[0], out_ctrl_ns, value);
}
mutex_lock(&dev->lock);
-
+
for (i=0; i < MAX_DECODERS; i++)
{
- // set video format NTSC-M
- value = cx25821_i2c_read(&dev->i2c_bus[0], MODE_CTRL+(0x200*i), &tmp);
- value &= 0xFFFFFFF0;
- value |= 0x10001; // enable the fast locking mode bit[16]
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], MODE_CTRL+(0x200*i), value);
-
- // resolution NTSC 720x480
- value = cx25821_i2c_read(&dev->i2c_bus[0], HORIZ_TIM_CTRL+(0x200*i), &tmp);
- value &= 0x00C00C00;
- value |= 0x612D0074;
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], HORIZ_TIM_CTRL+(0x200*i), value);
-
- value = cx25821_i2c_read(&dev->i2c_bus[0], VERT_TIM_CTRL+(0x200*i), &tmp);
- value &= 0x00C00C00;
- value |= 0x1C1E001A; // vblank_cnt + 2 to get camera ID
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], VERT_TIM_CTRL+(0x200*i), value);
-
- // chroma subcarrier step size
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], SC_STEP_SIZE+(0x200*i), 0x43E00000);
-
- // enable VIP optional active
- value = cx25821_i2c_read(&dev->i2c_bus[0], OUT_CTRL_NS+(0x200*i), &tmp);
- value &= 0xFFFBFFFF;
- value |= 0x00040000;
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], OUT_CTRL_NS+(0x200*i), value);
-
- // enable VIP optional active (VIP_OPT_AL) for direct output.
- value = cx25821_i2c_read(&dev->i2c_bus[0], OUT_CTRL1+(0x200*i), &tmp);
- value &= 0xFFFBFFFF;
- value |= 0x00040000;
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], OUT_CTRL1+(0x200*i), value);
-
- // clear VPRES_VERT_EN bit, fixes the chroma run away problem
- // when the input switching rate < 16 fields
- //
- value = cx25821_i2c_read(&dev->i2c_bus[0], MISC_TIM_CTRL+(0x200*i), &tmp);
- value = setBitAtPos(value, 14); // disable special play detection
- value = clearBitAtPos(value, 15);
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], MISC_TIM_CTRL+(0x200*i), value);
-
- // set vbi_gate_en to 0
- value = cx25821_i2c_read(&dev->i2c_bus[0], DFE_CTRL1+(0x200*i), &tmp);
- value = clearBitAtPos(value, 29);
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DFE_CTRL1+(0x200*i), value);
-
- // Enable the generation of blue field output if no video
- medusa_enable_bluefield_output(dev, i, 1);
+ // set video format NTSC-M
+ value = cx25821_i2c_read(&dev->i2c_bus[0], MODE_CTRL+(0x200*i), &tmp);
+ value &= 0xFFFFFFF0;
+ value |= 0x10001; // enable the fast locking mode bit[16]
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], MODE_CTRL+(0x200*i), value);
+
+ // resolution NTSC 720x480
+ value = cx25821_i2c_read(&dev->i2c_bus[0], HORIZ_TIM_CTRL+(0x200*i), &tmp);
+ value &= 0x00C00C00;
+ value |= 0x612D0074;
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], HORIZ_TIM_CTRL+(0x200*i), value);
+
+ value = cx25821_i2c_read(&dev->i2c_bus[0], VERT_TIM_CTRL+(0x200*i), &tmp);
+ value &= 0x00C00C00;
+ value |= 0x1C1E001A; // vblank_cnt + 2 to get camera ID
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], VERT_TIM_CTRL+(0x200*i), value);
+
+ // chroma subcarrier step size
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], SC_STEP_SIZE+(0x200*i), 0x43E00000);
+
+ // enable VIP optional active
+ value = cx25821_i2c_read(&dev->i2c_bus[0], OUT_CTRL_NS+(0x200*i), &tmp);
+ value &= 0xFFFBFFFF;
+ value |= 0x00040000;
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], OUT_CTRL_NS+(0x200*i), value);
+
+ // enable VIP optional active (VIP_OPT_AL) for direct output.
+ value = cx25821_i2c_read(&dev->i2c_bus[0], OUT_CTRL1+(0x200*i), &tmp);
+ value &= 0xFFFBFFFF;
+ value |= 0x00040000;
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], OUT_CTRL1+(0x200*i), value);
+
+ // clear VPRES_VERT_EN bit, fixes the chroma run away problem
+ // when the input switching rate < 16 fields
+ //
+ value = cx25821_i2c_read(&dev->i2c_bus[0], MISC_TIM_CTRL+(0x200*i), &tmp);
+ value = setBitAtPos(value, 14); // disable special play detection
+ value = clearBitAtPos(value, 15);
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], MISC_TIM_CTRL+(0x200*i), value);
+
+ // set vbi_gate_en to 0
+ value = cx25821_i2c_read(&dev->i2c_bus[0], DFE_CTRL1+(0x200*i), &tmp);
+ value = clearBitAtPos(value, 29);
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DFE_CTRL1+(0x200*i), value);
+
+ // Enable the generation of blue field output if no video
+ medusa_enable_bluefield_output(dev, i, 1);
}
for (i=0; i < MAX_ENCODERS; i++)
{
- // NTSC hclock
- value = cx25821_i2c_read(&dev->i2c_bus[0], DENC_A_REG_1+(0x100*i), &tmp);
- value &= 0xF000FC00;
- value |= 0x06B402D0;
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DENC_A_REG_1+(0x100*i), value);
-
- // burst begin and burst end
- value = cx25821_i2c_read(&dev->i2c_bus[0], DENC_A_REG_2+(0x100*i), &tmp);
- value &= 0xFF000000;
- value |= 0x007E9054;
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DENC_A_REG_2+(0x100*i), value);
-
- value = cx25821_i2c_read(&dev->i2c_bus[0], DENC_A_REG_3+(0x100*i), &tmp);
- value &= 0xFC00FE00;
- value |= 0x00EC00F0;
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DENC_A_REG_3+(0x100*i), value);
-
- // set NTSC vblank, no phase alternation, 7.5 IRE pedestal
- value = cx25821_i2c_read(&dev->i2c_bus[0], DENC_A_REG_4+(0x100*i), &tmp);
- value &= 0x00FCFFFF;
- value |= 0x13020000;
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DENC_A_REG_4+(0x100*i), value);
-
- value = cx25821_i2c_read(&dev->i2c_bus[0], DENC_A_REG_5+(0x100*i), &tmp);
- value &= 0xFFFF0000;
- value |= 0x0000E575;
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DENC_A_REG_5+(0x100*i), value);
-
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DENC_A_REG_6+(0x100*i), 0x009A89C1);
-
- // Subcarrier Increment
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DENC_A_REG_7+(0x100*i), 0x21F07C1F);
+ // NTSC hclock
+ value = cx25821_i2c_read(&dev->i2c_bus[0], DENC_A_REG_1+(0x100*i), &tmp);
+ value &= 0xF000FC00;
+ value |= 0x06B402D0;
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DENC_A_REG_1+(0x100*i), value);
+
+ // burst begin and burst end
+ value = cx25821_i2c_read(&dev->i2c_bus[0], DENC_A_REG_2+(0x100*i), &tmp);
+ value &= 0xFF000000;
+ value |= 0x007E9054;
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DENC_A_REG_2+(0x100*i), value);
+
+ value = cx25821_i2c_read(&dev->i2c_bus[0], DENC_A_REG_3+(0x100*i), &tmp);
+ value &= 0xFC00FE00;
+ value |= 0x00EC00F0;
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DENC_A_REG_3+(0x100*i), value);
+
+ // set NTSC vblank, no phase alternation, 7.5 IRE pedestal
+ value = cx25821_i2c_read(&dev->i2c_bus[0], DENC_A_REG_4+(0x100*i), &tmp);
+ value &= 0x00FCFFFF;
+ value |= 0x13020000;
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DENC_A_REG_4+(0x100*i), value);
+
+ value = cx25821_i2c_read(&dev->i2c_bus[0], DENC_A_REG_5+(0x100*i), &tmp);
+ value &= 0xFFFF0000;
+ value |= 0x0000E575;
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DENC_A_REG_5+(0x100*i), value);
+
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DENC_A_REG_6+(0x100*i), 0x009A89C1);
+
+ // Subcarrier Increment
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DENC_A_REG_7+(0x100*i), 0x21F07C1F);
}
{
int ret_val = -1;
u32 value = 0, tmp = 0;
-
+
// Setup for 2D threshold
ret_val = cx25821_i2c_write(&dev->i2c_bus[0], COMB_2D_HFS_CFG+(0x200*dec), 0x20002861);
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], COMB_2D_HFD_CFG+(0x200*dec), 0x20002861);
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], COMB_2D_LF_CFG+(0x200*dec), 0x200A1023);
-
- // Setup flat chroma and luma thresholds
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], COMB_2D_HFD_CFG+(0x200*dec), 0x20002861);
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], COMB_2D_LF_CFG+(0x200*dec), 0x200A1023);
+
+ // Setup flat chroma and luma thresholds
value = cx25821_i2c_read(&dev->i2c_bus[0], COMB_FLAT_THRESH_CTRL+(0x200*dec), &tmp);
- value &= 0x06230000;
+ value &= 0x06230000;
ret_val = cx25821_i2c_write(&dev->i2c_bus[0], COMB_FLAT_THRESH_CTRL+(0x200*dec), value);
-
- // set comb 2D blend
+
+ // set comb 2D blend
ret_val = cx25821_i2c_write(&dev->i2c_bus[0], COMB_2D_BLEND+(0x200*dec), 0x210F0F0F);
-
- // COMB MISC CONTROL
+
+ // COMB MISC CONTROL
ret_val = cx25821_i2c_write(&dev->i2c_bus[0], COMB_MISC_CTRL+(0x200*dec), 0x41120A7F);
-
+
return ret_val;
}
u32 tmp = 0;
mutex_lock(&dev->lock);
-
+
for (i=0; i < MAX_DECODERS; i++)
{
- // set video format PAL-BDGHI
- value = cx25821_i2c_read(&dev->i2c_bus[0], MODE_CTRL+(0x200*i), &tmp);
- value &= 0xFFFFFFF0;
- value |= 0x10004; // enable the fast locking mode bit[16]
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], MODE_CTRL+(0x200*i), value);
-
-
- // resolution PAL 720x576
- value = cx25821_i2c_read(&dev->i2c_bus[0], HORIZ_TIM_CTRL+(0x200*i), &tmp);
- value &= 0x00C00C00;
- value |= 0x632D007D;
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], HORIZ_TIM_CTRL+(0x200*i), value);
-
- // vblank656_cnt=x26, vactive_cnt=240h, vblank_cnt=x24
- value = cx25821_i2c_read(&dev->i2c_bus[0], VERT_TIM_CTRL+(0x200*i), &tmp);
- value &= 0x00C00C00;
- value |= 0x28240026; // vblank_cnt + 2 to get camera ID
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], VERT_TIM_CTRL+(0x200*i), value);
-
- // chroma subcarrier step size
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], SC_STEP_SIZE+(0x200*i), 0x5411E2D0);
-
- // enable VIP optional active
- value = cx25821_i2c_read(&dev->i2c_bus[0], OUT_CTRL_NS+(0x200*i), &tmp);
- value &= 0xFFFBFFFF;
- value |= 0x00040000;
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], OUT_CTRL_NS+(0x200*i), value);
-
- // enable VIP optional active (VIP_OPT_AL) for direct output.
- value = cx25821_i2c_read(&dev->i2c_bus[0], OUT_CTRL1+(0x200*i), &tmp);
- value &= 0xFFFBFFFF;
- value |= 0x00040000;
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], OUT_CTRL1+(0x200*i), value);
-
- // clear VPRES_VERT_EN bit, fixes the chroma run away problem
- // when the input switching rate < 16 fields
- value = cx25821_i2c_read(&dev->i2c_bus[0], MISC_TIM_CTRL+(0x200*i), &tmp);
- value = setBitAtPos(value, 14); // disable special play detection
- value = clearBitAtPos(value, 15);
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], MISC_TIM_CTRL+(0x200*i), value);
-
- // set vbi_gate_en to 0
- value = cx25821_i2c_read(&dev->i2c_bus[0], DFE_CTRL1+(0x200*i), &tmp);
- value = clearBitAtPos(value, 29);
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DFE_CTRL1+(0x200*i), value);
-
- medusa_PALCombInit(dev, i);
-
- // Enable the generation of blue field output if no video
- medusa_enable_bluefield_output(dev, i, 1);
- }
-
-
- for (i=0; i < MAX_ENCODERS; i++)
- {
- // PAL hclock
- value = cx25821_i2c_read(&dev->i2c_bus[0], DENC_A_REG_1+(0x100*i), &tmp);
- value &= 0xF000FC00;
- value |= 0x06C002D0;
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DENC_A_REG_1+(0x100*i), value);
-
- // burst begin and burst end
- value = cx25821_i2c_read(&dev->i2c_bus[0], DENC_A_REG_2+(0x100*i), &tmp);
- value &= 0xFF000000;
- value |= 0x007E9754;
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DENC_A_REG_2+(0x100*i), value);
-
- // hblank and vactive
- value = cx25821_i2c_read(&dev->i2c_bus[0], DENC_A_REG_3+(0x100*i), &tmp);
- value &= 0xFC00FE00;
- value |= 0x00FC0120;
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DENC_A_REG_3+(0x100*i), value);
-
- // set PAL vblank, phase alternation, 0 IRE pedestal
- value = cx25821_i2c_read(&dev->i2c_bus[0], DENC_A_REG_4+(0x100*i), &tmp);
- value &= 0x00FCFFFF;
- value |= 0x14010000;
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DENC_A_REG_4+(0x100*i), value);
-
-
- value = cx25821_i2c_read(&dev->i2c_bus[0], DENC_A_REG_5+(0x100*i), &tmp);
- value &= 0xFFFF0000;
- value |= 0x0000F078;
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DENC_A_REG_5+(0x100*i), value);
-
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DENC_A_REG_6+(0x100*i), 0x00A493CF);
-
- // Subcarrier Increment
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DENC_A_REG_7+(0x100*i), 0x2A098ACB);
- }
-
-
- //set picture resolutions
+ // set video format PAL-BDGHI
+ value = cx25821_i2c_read(&dev->i2c_bus[0], MODE_CTRL+(0x200*i), &tmp);
+ value &= 0xFFFFFFF0;
+ value |= 0x10004; // enable the fast locking mode bit[16]
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], MODE_CTRL+(0x200*i), value);
+
+
+ // resolution PAL 720x576
+ value = cx25821_i2c_read(&dev->i2c_bus[0], HORIZ_TIM_CTRL+(0x200*i), &tmp);
+ value &= 0x00C00C00;
+ value |= 0x632D007D;
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], HORIZ_TIM_CTRL+(0x200*i), value);
+
+ // vblank656_cnt=x26, vactive_cnt=240h, vblank_cnt=x24
+ value = cx25821_i2c_read(&dev->i2c_bus[0], VERT_TIM_CTRL+(0x200*i), &tmp);
+ value &= 0x00C00C00;
+ value |= 0x28240026; // vblank_cnt + 2 to get camera ID
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], VERT_TIM_CTRL+(0x200*i), value);
+
+ // chroma subcarrier step size
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], SC_STEP_SIZE+(0x200*i), 0x5411E2D0);
+
+ // enable VIP optional active
+ value = cx25821_i2c_read(&dev->i2c_bus[0], OUT_CTRL_NS+(0x200*i), &tmp);
+ value &= 0xFFFBFFFF;
+ value |= 0x00040000;
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], OUT_CTRL_NS+(0x200*i), value);
+
+ // enable VIP optional active (VIP_OPT_AL) for direct output.
+ value = cx25821_i2c_read(&dev->i2c_bus[0], OUT_CTRL1+(0x200*i), &tmp);
+ value &= 0xFFFBFFFF;
+ value |= 0x00040000;
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], OUT_CTRL1+(0x200*i), value);
+
+ // clear VPRES_VERT_EN bit, fixes the chroma run away problem
+ // when the input switching rate < 16 fields
+ value = cx25821_i2c_read(&dev->i2c_bus[0], MISC_TIM_CTRL+(0x200*i), &tmp);
+ value = setBitAtPos(value, 14); // disable special play detection
+ value = clearBitAtPos(value, 15);
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], MISC_TIM_CTRL+(0x200*i), value);
+
+ // set vbi_gate_en to 0
+ value = cx25821_i2c_read(&dev->i2c_bus[0], DFE_CTRL1+(0x200*i), &tmp);
+ value = clearBitAtPos(value, 29);
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DFE_CTRL1+(0x200*i), value);
+
+ medusa_PALCombInit(dev, i);
+
+ // Enable the generation of blue field output if no video
+ medusa_enable_bluefield_output(dev, i, 1);
+ }
+
+
+ for (i=0; i < MAX_ENCODERS; i++)
+ {
+ // PAL hclock
+ value = cx25821_i2c_read(&dev->i2c_bus[0], DENC_A_REG_1+(0x100*i), &tmp);
+ value &= 0xF000FC00;
+ value |= 0x06C002D0;
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DENC_A_REG_1+(0x100*i), value);
+
+ // burst begin and burst end
+ value = cx25821_i2c_read(&dev->i2c_bus[0], DENC_A_REG_2+(0x100*i), &tmp);
+ value &= 0xFF000000;
+ value |= 0x007E9754;
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DENC_A_REG_2+(0x100*i), value);
+
+ // hblank and vactive
+ value = cx25821_i2c_read(&dev->i2c_bus[0], DENC_A_REG_3+(0x100*i), &tmp);
+ value &= 0xFC00FE00;
+ value |= 0x00FC0120;
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DENC_A_REG_3+(0x100*i), value);
+
+ // set PAL vblank, phase alternation, 0 IRE pedestal
+ value = cx25821_i2c_read(&dev->i2c_bus[0], DENC_A_REG_4+(0x100*i), &tmp);
+ value &= 0x00FCFFFF;
+ value |= 0x14010000;
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DENC_A_REG_4+(0x100*i), value);
+
+
+ value = cx25821_i2c_read(&dev->i2c_bus[0], DENC_A_REG_5+(0x100*i), &tmp);
+ value &= 0xFFFF0000;
+ value |= 0x0000F078;
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DENC_A_REG_5+(0x100*i), value);
+
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DENC_A_REG_6+(0x100*i), 0x00A493CF);
+
+ // Subcarrier Increment
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DENC_A_REG_7+(0x100*i), 0x2A098ACB);
+ }
+
+
+ //set picture resolutions
ret_val = cx25821_i2c_write(&dev->i2c_bus[0], HSCALE_CTRL, 0x0); //0 - 720
ret_val = cx25821_i2c_write(&dev->i2c_bus[0], VSCALE_CTRL, 0x0); //0 - 576
-
- // set Bypass input format to PAL 625 lines
+
+ // set Bypass input format to PAL 625 lines
value = cx25821_i2c_read(&dev->i2c_bus[0], BYP_AB_CTRL, &tmp);
value &= 0xFFF7FDFF;
ret_val = cx25821_i2c_write(&dev->i2c_bus[0], BYP_AB_CTRL, value);
-
+
mutex_unlock(&dev->lock);
return ret_val;
int status = STATUS_SUCCESS;
u32 value = 0, tmp = 0;
-
+
if(dev->tvnorm & V4L2_STD_PAL_BG || dev->tvnorm & V4L2_STD_PAL_DK)
{
- status = medusa_initialize_pal(dev);
+ status = medusa_initialize_pal(dev);
}
else
{
- status = medusa_initialize_ntsc(dev);
+ status = medusa_initialize_ntsc(dev);
}
-
+
// Enable DENC_A output
value = cx25821_i2c_read(&dev->i2c_bus[0], DENC_A_REG_4, &tmp);
value = setBitAtPos(value, 4);
status = cx25821_i2c_write(&dev->i2c_bus[0], DENC_A_REG_4, value);
-
+
// Enable DENC_B output
value = cx25821_i2c_read(&dev->i2c_bus[0], DENC_B_REG_4, &tmp);
value = setBitAtPos(value, 4);
status = cx25821_i2c_write(&dev->i2c_bus[0], DENC_B_REG_4, value);
-
+
return status;
}
int decoder_count = 0;
int ret_val = 0;
u32 hscale = 0x0;
- u32 vscale = 0x0;
+ u32 vscale = 0x0;
const int MAX_WIDTH = 720;
mutex_lock(&dev->lock);
// validate the width - cannot be negative
if (width > MAX_WIDTH)
{
- printk("cx25821 %s() : width %d > MAX_WIDTH %d ! resetting to MAX_WIDTH \n", __func__, width, MAX_WIDTH);
- width = MAX_WIDTH;
- }
-
+ printk("cx25821 %s() : width %d > MAX_WIDTH %d ! resetting to MAX_WIDTH \n", __func__, width, MAX_WIDTH);
+ width = MAX_WIDTH;
+ }
+
if( decoder_select <= 7 && decoder_select >= 0 )
{
- decoder = decoder_select;
- decoder_count = decoder_select + 1;
+ decoder = decoder_select;
+ decoder_count = decoder_select + 1;
}
else
{
- decoder = 0;
- decoder_count = _num_decoders;
+ decoder = 0;
+ decoder_count = _num_decoders;
}
-
-
- switch( width )
- {
- case 320:
- hscale = 0x13E34B;
- vscale = 0x0;
- break;
-
- case 352:
- hscale = 0x10A273;
- vscale = 0x0;
- break;
-
- case 176:
- hscale = 0x3115B2;
- vscale = 0x1E00;
- break;
- case 160:
- hscale = 0x378D84;
- vscale = 0x1E00;
- break;
- default: //720
- hscale = 0x0;
- vscale = 0x0;
- break;
- }
+ switch( width )
+ {
+ case 320:
+ hscale = 0x13E34B;
+ vscale = 0x0;
+ break;
+
+ case 352:
+ hscale = 0x10A273;
+ vscale = 0x0;
+ break;
+
+ case 176:
+ hscale = 0x3115B2;
+ vscale = 0x1E00;
+ break;
+
+ case 160:
+ hscale = 0x378D84;
+ vscale = 0x1E00;
+ break;
+
+ default: //720
+ hscale = 0x0;
+ vscale = 0x0;
+ break;
+ }
for( ; decoder < decoder_count; decoder++)
{
- // write scaling values for each decoder
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], HSCALE_CTRL+(0x200*decoder), hscale);
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], VSCALE_CTRL+(0x200*decoder), vscale);
+ // write scaling values for each decoder
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], HSCALE_CTRL+(0x200*decoder), hscale);
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], VSCALE_CTRL+(0x200*decoder), vscale);
}
mutex_unlock(&dev->lock);
u32 fld_cnt = 0;
u32 tmp = 0;
u32 disp_cnt_reg = DISP_AB_CNT;
-
+
mutex_lock(&dev->lock);
- // no support
+ // no support
if (decoder < VDEC_A && decoder > VDEC_H)
{
- mutex_unlock(&dev->lock);
- return;
+ mutex_unlock(&dev->lock);
+ return;
}
switch (decoder)
{
- default:
- break;
- case VDEC_C:
- case VDEC_D:
- disp_cnt_reg = DISP_CD_CNT;
- break;
- case VDEC_E:
- case VDEC_F:
- disp_cnt_reg = DISP_EF_CNT;
- break;
- case VDEC_G:
- case VDEC_H:
- disp_cnt_reg = DISP_GH_CNT;
- break;
+ default:
+ break;
+ case VDEC_C:
+ case VDEC_D:
+ disp_cnt_reg = DISP_CD_CNT;
+ break;
+ case VDEC_E:
+ case VDEC_F:
+ disp_cnt_reg = DISP_EF_CNT;
+ break;
+ case VDEC_G:
+ case VDEC_H:
+ disp_cnt_reg = DISP_GH_CNT;
+ break;
}
_display_field_cnt[decoder] = duration;
// update hardware
fld_cnt = cx25821_i2c_read(&dev->i2c_bus[0], disp_cnt_reg, &tmp);
-
+
if (!(decoder % 2)) // EVEN decoder
{
- fld_cnt &= 0xFFFF0000;
- fld_cnt |= duration;
+ fld_cnt &= 0xFFFF0000;
+ fld_cnt |= duration;
}
else
{
- fld_cnt &= 0x0000FFFF;
- fld_cnt |= ((u32)duration) << 16;
+ fld_cnt &= 0x0000FFFF;
+ fld_cnt |= ((u32)duration) << 16;
}
ret_val = cx25821_i2c_write(&dev->i2c_bus[0], disp_cnt_reg, fld_cnt);
-
+
mutex_unlock(&dev->lock);
}
if((srcMin == srcMax) || (srcVal < srcMin) || (srcVal > srcMax))
{
- return -1;
+ return -1;
}
// This is the overall expression used:
if(2 * ( numerator % denominator ) >= denominator)
{
- quotient++;
+ quotient++;
}
*dstVal = quotient + dstMin;
unsigned char temp;
if (numeric >= 0)
- return numeric;
+ return numeric;
else
{
- temp = ~(abs(numeric) & 0xFF);
- temp += 1;
- return temp;
+ temp = ~(abs(numeric) & 0xFF);
+ temp += 1;
+ return temp;
}
}
/////////////////////////////////////////////////////////////////////////////////////////
mutex_lock(&dev->lock);
if((brightness > VIDEO_PROCAMP_MAX) || (brightness < VIDEO_PROCAMP_MIN))
{
- mutex_unlock(&dev->lock);
- return -1;
+ mutex_unlock(&dev->lock);
+ return -1;
}
ret_val = mapM(VIDEO_PROCAMP_MIN, VIDEO_PROCAMP_MAX, brightness, SIGNED_BYTE_MIN, SIGNED_BYTE_MAX, &value);
value = convert_to_twos(value, 8);
u32 val = 0, tmp = 0;
mutex_lock(&dev->lock);
-
+
if((contrast > VIDEO_PROCAMP_MAX) || (contrast < VIDEO_PROCAMP_MIN))
{
- mutex_unlock(&dev->lock);
- return -1;
+ mutex_unlock(&dev->lock);
+ return -1;
}
ret_val = mapM(VIDEO_PROCAMP_MIN, VIDEO_PROCAMP_MAX, contrast, UNSIGNED_BYTE_MIN, UNSIGNED_BYTE_MAX, &value);
u32 val = 0, tmp = 0;
mutex_lock(&dev->lock);
-
+
if((hue > VIDEO_PROCAMP_MAX) || (hue < VIDEO_PROCAMP_MIN))
{
- mutex_unlock(&dev->lock);
- return -1;
+ mutex_unlock(&dev->lock);
+ return -1;
}
ret_val = mapM(VIDEO_PROCAMP_MIN, VIDEO_PROCAMP_MAX, hue, SIGNED_BYTE_MIN, SIGNED_BYTE_MAX, &value);
-
+
value = convert_to_twos(value, 8);
val = cx25821_i2c_read(&dev->i2c_bus[0], VDEC_A_HUE_CTRL+(0x200*decoder), &tmp);
val &= 0xFFFFFF00;
int ret_val = 0;
int value = 0;
u32 val = 0, tmp = 0;
-
+
mutex_lock(&dev->lock);
-
+
if((saturation > VIDEO_PROCAMP_MAX) || (saturation < VIDEO_PROCAMP_MIN))
{
- mutex_unlock(&dev->lock);
- return -1;
+ mutex_unlock(&dev->lock);
+ return -1;
}
ret_val = mapM(VIDEO_PROCAMP_MIN, VIDEO_PROCAMP_MAX, saturation, UNSIGNED_BYTE_MIN, UNSIGNED_BYTE_MAX, &value);
-
+
val = cx25821_i2c_read(&dev->i2c_bus[0], VDEC_A_USAT_CTRL+(0x200*decoder), &tmp);
- val &= 0xFFFFFF00;
+ val &= 0xFFFFFF00;
ret_val |= cx25821_i2c_write(&dev->i2c_bus[0], VDEC_A_USAT_CTRL+(0x200*decoder), val | value);
val = cx25821_i2c_read(&dev->i2c_bus[0], VDEC_A_VSAT_CTRL+(0x200*decoder), &tmp);
- val &= 0xFFFFFF00;
+ val &= 0xFFFFFF00;
ret_val |= cx25821_i2c_write(&dev->i2c_bus[0], VDEC_A_VSAT_CTRL+(0x200*decoder), val | value);
-
+
mutex_unlock(&dev->lock);
return ret_val;
}
u32 value = 0, tmp = 0;
int ret_val = 0;
int i=0;
-
+
mutex_lock(&dev->lock);
-
+
_num_decoders = dev->_max_num_decoders;
-
-
- // disable Auto source selection on all video decoders
+
+
+ // disable Auto source selection on all video decoders
value = cx25821_i2c_read(&dev->i2c_bus[0], MON_A_CTRL, &tmp);
value &= 0xFFFFF0FF;
ret_val = cx25821_i2c_write(&dev->i2c_bus[0], MON_A_CTRL, value);
-
+
if (ret_val < 0)
{
- mutex_unlock(&dev->lock);
- return -EINVAL;
+ mutex_unlock(&dev->lock);
+ return -EINVAL;
}
-
+
// Turn off Master source switch enable
value = cx25821_i2c_read(&dev->i2c_bus[0], MON_A_CTRL, &tmp);
value &= 0xFFFFFFDF;
ret_val = cx25821_i2c_write(&dev->i2c_bus[0], MON_A_CTRL, value);
-
+
if (ret_val < 0)
{
- mutex_unlock(&dev->lock);
- return -EINVAL;
+ mutex_unlock(&dev->lock);
+ return -EINVAL;
}
mutex_unlock(&dev->lock);
for (i=0; i < _num_decoders; i++)
{
- medusa_set_decoderduration(dev, i, _display_field_cnt[i]);
+ medusa_set_decoderduration(dev, i, _display_field_cnt[i]);
}
-
+
mutex_lock(&dev->lock);
- // Select monitor as DENC A input, power up the DAC
+ // Select monitor as DENC A input, power up the DAC
value = cx25821_i2c_read(&dev->i2c_bus[0], DENC_AB_CTRL, &tmp);
value &= 0xFF70FF70;
- value |= 0x00090008; // set en_active
+ value |= 0x00090008; // set en_active
ret_val = cx25821_i2c_write(&dev->i2c_bus[0], DENC_AB_CTRL, value);
-
+
if (ret_val < 0)
{
- mutex_unlock(&dev->lock);
- return -EINVAL;
+ mutex_unlock(&dev->lock);
+ return -EINVAL;
}
// enable input is VIP/656
value = cx25821_i2c_read(&dev->i2c_bus[0], BYP_AB_CTRL, &tmp);
value |= 0x00040100; // enable VIP
ret_val = cx25821_i2c_write(&dev->i2c_bus[0], BYP_AB_CTRL, value);
-
+
if (ret_val < 0)
{
- mutex_unlock(&dev->lock);
- return -EINVAL;
+ mutex_unlock(&dev->lock);
+ return -EINVAL;
}
- // select AFE clock to output mode
+ // select AFE clock to output mode
value = cx25821_i2c_read(&dev->i2c_bus[0], AFE_AB_DIAG_CTRL, &tmp);
value &= 0x83FFFFFF;
- ret_val = cx25821_i2c_write(&dev->i2c_bus[0], AFE_AB_DIAG_CTRL, value | 0x10000000);
-
+ ret_val = cx25821_i2c_write(&dev->i2c_bus[0], AFE_AB_DIAG_CTRL, value | 0x10000000);
+
if (ret_val < 0)
{
- mutex_unlock(&dev->lock);
- return -EINVAL;
+ mutex_unlock(&dev->lock);
+ return -EINVAL;
}
// Turn on all of the data out and control output pins.
value &= 0xFEF0FE00;
if (_num_decoders == MAX_DECODERS)
{
- // Note: The octal board does not support control pins(bit16-19).
- // These bits are ignored in the octal board.
- value |= 0x010001F8; // disable VDEC A-C port, default to Mobilygen Interface
+ // Note: The octal board does not support control pins(bit16-19).
+ // These bits are ignored in the octal board.
+ value |= 0x010001F8; // disable VDEC A-C port, default to Mobilygen Interface
}
else
{
- value |= 0x010F0108; // disable VDEC A-C port, default to Mobilygen Interface
+ value |= 0x010F0108; // disable VDEC A-C port, default to Mobilygen Interface
}
-
+
value |= 7;
ret_val = cx25821_i2c_write(&dev->i2c_bus[0], PIN_OE_CTRL, value);
if (ret_val < 0)
{
- mutex_unlock(&dev->lock);
- return -EINVAL;
+ mutex_unlock(&dev->lock);
+ return -EINVAL;
}
mutex_unlock(&dev->lock);
-
+
ret_val = medusa_set_videostandard(dev);
-
+
if (ret_val < 0)
{
- mutex_unlock(&dev->lock);
- return -EINVAL;
- }
-
+ mutex_unlock(&dev->lock);
+ return -EINVAL;
+ }
+
return 1;
}
#include "cx25821-medusa-defines.h"
-// Color control constants
+// Color control constants
#define VIDEO_PROCAMP_MIN 0
#define VIDEO_PROCAMP_MAX 10000
#define UNSIGNED_BYTE_MIN 0
//*****************************************************************************\r
#define I2C1_ADDR 0x180000 // I2C #1 address\r
#define FLD_I2C_DADDR 0xfe000000 // RW [31:25] I2C Device Address\r
- // RO [24] reserved\r
+ // RO [24] reserved\r
//*****************************************************************************\r
#define FLD_I2C_SADDR 0x00FFFFFF // RW [23:0] I2C Sub-address\r
\r
#define FLD_I2C_PERIOD 0xFF000000 // RW [31:24]\r
#define FLD_I2C_SCL_IN 0x00200000 // RW [21]\r
#define FLD_I2C_SDA_IN 0x00100000 // RW [20]\r
- // RO [19:18] reserved\r
+ // RO [19:18] reserved\r
#define FLD_I2C_SCL_OUT 0x00020000 // RW [17]\r
#define FLD_I2C_SDA_OUT 0x00010000 // RW [16]\r
- // RO [15] reserved\r
+ // RO [15] reserved\r
#define FLD_I2C_DATA_LEN 0x00007000 // RW [14:12]\r
#define FLD_I2C_SADDR_INC 0x00000800 // RW [11]\r
- // RO [10:9] reserved\r
+ // RO [10:9] reserved\r
#define FLD_I2C_SADDR_LEN 0x00000300 // RW [9:8]\r
- // RO [7:6] reserved\r
+ // RO [7:6] reserved\r
#define FLD_I2C_SOFT 0x00000020 // RW [5]\r
#define FLD_I2C_NOSTOP 0x00000010 // RW [4]\r
#define FLD_I2C_EXTEND 0x00000008 // RW [3]\r
\r
//*****************************************************************************\r
// Motion Detection
-#define MD_CH0_GRID_BLOCK_YCNT 0x170014
-#define MD_CH1_GRID_BLOCK_YCNT 0x170094
-#define MD_CH2_GRID_BLOCK_YCNT 0x170114
-#define MD_CH3_GRID_BLOCK_YCNT 0x170194
-#define MD_CH4_GRID_BLOCK_YCNT 0x170214
-#define MD_CH5_GRID_BLOCK_YCNT 0x170294
-#define MD_CH6_GRID_BLOCK_YCNT 0x170314
+#define MD_CH0_GRID_BLOCK_YCNT 0x170014
+#define MD_CH1_GRID_BLOCK_YCNT 0x170094
+#define MD_CH2_GRID_BLOCK_YCNT 0x170114
+#define MD_CH3_GRID_BLOCK_YCNT 0x170194
+#define MD_CH4_GRID_BLOCK_YCNT 0x170214
+#define MD_CH5_GRID_BLOCK_YCNT 0x170294
+#define MD_CH6_GRID_BLOCK_YCNT 0x170314
#define MD_CH7_GRID_BLOCK_YCNT 0x170394
#define PIXEL_FRMT_422 4
\r
\r
static __le32 *cx25821_update_riscprogram_ch2( struct cx25821_dev *dev,\r
- __le32 *rp, unsigned int offset, unsigned int bpl, \r
- u32 sync_line, unsigned int lines, int fifo_enable, int field_type)\r
+ __le32 *rp, unsigned int offset, unsigned int bpl, \r
+ u32 sync_line, unsigned int lines, int fifo_enable, int field_type)\r
{\r
unsigned int line, i;\r
int dist_betwn_starts = bpl * 2; \r
\r
- \r
+ \r
*(rp++) = cpu_to_le32(RISC_RESYNC | sync_line); \r
\r
\r
if( USE_RISC_NOOP_VIDEO )\r
{\r
- for( i = 0; i < NUM_NO_OPS; i++ )\r
- {\r
- *(rp++) = cpu_to_le32(RISC_NOOP);\r
- }\r
+ for( i = 0; i < NUM_NO_OPS; i++ )\r
+ {\r
+ *(rp++) = cpu_to_le32(RISC_NOOP);\r
+ }\r
}\r
\r
/* scan lines */\r
for (line = 0; line < lines; line++) \r
{ \r
- *(rp++) = cpu_to_le32(RISC_READ|RISC_SOL|RISC_EOL|bpl); \r
- *(rp++) = cpu_to_le32(dev->_data_buf_phys_addr_ch2+offset); \r
- *(rp++) = cpu_to_le32(0); /* bits 63-32 */ \r
- \r
- if ( (lines <= NTSC_FIELD_HEIGHT) || (line < (NTSC_FIELD_HEIGHT-1)) || !(dev->_isNTSC_ch2) )\r
- {\r
- offset += dist_betwn_starts; \r
- } \r
+ *(rp++) = cpu_to_le32(RISC_READ|RISC_SOL|RISC_EOL|bpl); \r
+ *(rp++) = cpu_to_le32(dev->_data_buf_phys_addr_ch2+offset); \r
+ *(rp++) = cpu_to_le32(0); /* bits 63-32 */ \r
+ \r
+ if ( (lines <= NTSC_FIELD_HEIGHT) || (line < (NTSC_FIELD_HEIGHT-1)) || !(dev->_isNTSC_ch2) )\r
+ {\r
+ offset += dist_betwn_starts; \r
+ } \r
}\r
\r
return rp;\r
}\r
\r
static __le32 *cx25821_risc_field_upstream_ch2( struct cx25821_dev *dev,\r
- __le32 *rp, \r
- dma_addr_t databuf_phys_addr,\r
- unsigned int offset, u32 sync_line, unsigned int bpl, \r
- unsigned int lines, int fifo_enable, int field_type)\r
+ __le32 *rp, \r
+ dma_addr_t databuf_phys_addr,\r
+ unsigned int offset, u32 sync_line, unsigned int bpl, \r
+ unsigned int lines, int fifo_enable, int field_type)\r
{\r
unsigned int line, i;\r
struct sram_channel *sram_ch = &dev->sram_channels[dev->_channel2_upstream_select];\r
int dist_betwn_starts = bpl * 2; \r
\r
- \r
+ \r
/* sync instruction */\r
if (sync_line != NO_SYNC_LINE)\r
{ \r
- *(rp++) = cpu_to_le32(RISC_RESYNC | sync_line); \r
+ *(rp++) = cpu_to_le32(RISC_RESYNC | sync_line); \r
}\r
\r
\r
if( USE_RISC_NOOP_VIDEO )\r
{\r
- for( i = 0; i < NUM_NO_OPS; i++ )\r
- {\r
- *(rp++) = cpu_to_le32(RISC_NOOP);\r
- }\r
+ for( i = 0; i < NUM_NO_OPS; i++ )\r
+ {\r
+ *(rp++) = cpu_to_le32(RISC_NOOP);\r
+ }\r
}\r
\r
/* scan lines */\r
for (line = 0; line < lines; line++) \r
{ \r
- *(rp++) = cpu_to_le32(RISC_READ|RISC_SOL|RISC_EOL|bpl); \r
- *(rp++) = cpu_to_le32(databuf_phys_addr+offset); \r
- *(rp++) = cpu_to_le32(0); /* bits 63-32 */ \r
- \r
- \r
- if ( (lines <= NTSC_FIELD_HEIGHT) || (line < (NTSC_FIELD_HEIGHT-1)) || !(dev->_isNTSC_ch2) )\r
- {\r
- offset += dist_betwn_starts; \r
- }\r
- \r
-\r
- // check if we need to enable the FIFO after the first 4 lines \r
- // For the upstream video channel, the risc engine will enable the FIFO. \r
- if ( fifo_enable && line == 3 )\r
- {\r
- *(rp++) = RISC_WRITECR;\r
- *(rp++) = sram_ch->dma_ctl;\r
- *(rp++) = FLD_VID_FIFO_EN;\r
- *(rp++) = 0x00000001;\r
- } \r
- }\r
- \r
+ *(rp++) = cpu_to_le32(RISC_READ|RISC_SOL|RISC_EOL|bpl); \r
+ *(rp++) = cpu_to_le32(databuf_phys_addr+offset); \r
+ *(rp++) = cpu_to_le32(0); /* bits 63-32 */ \r
+ \r
+ \r
+ if ( (lines <= NTSC_FIELD_HEIGHT) || (line < (NTSC_FIELD_HEIGHT-1)) || !(dev->_isNTSC_ch2) )\r
+ {\r
+ offset += dist_betwn_starts; \r
+ }\r
+ \r
+\r
+ // check if we need to enable the FIFO after the first 4 lines \r
+ // For the upstream video channel, the risc engine will enable the FIFO. \r
+ if ( fifo_enable && line == 3 )\r
+ {\r
+ *(rp++) = RISC_WRITECR;\r
+ *(rp++) = sram_ch->dma_ctl;\r
+ *(rp++) = FLD_VID_FIFO_EN;\r
+ *(rp++) = 0x00000001;\r
+ } \r
+ }\r
+ \r
return rp;\r
}\r
\r
int cx25821_risc_buffer_upstream_ch2( struct cx25821_dev *dev, struct pci_dev *pci, \r
- unsigned int top_offset, \r
- unsigned int bpl, unsigned int lines)\r
+ unsigned int top_offset, \r
+ unsigned int bpl, unsigned int lines)\r
{\r
__le32 *rp;\r
int fifo_enable = 0;\r
unsigned int bottom_offset = bpl;\r
dma_addr_t risc_phys_jump_addr;\r
\r
- \r
+ \r
if( dev->_isNTSC_ch2 )\r
{\r
- odd_num_lines = singlefield_lines + 1;\r
- risc_program_size = FRAME1_VID_PROG_SIZE;\r
- frame_size = (bpl == Y411_LINE_SZ) ? FRAME_SIZE_NTSC_Y411 : FRAME_SIZE_NTSC_Y422;\r
+ odd_num_lines = singlefield_lines + 1;\r
+ risc_program_size = FRAME1_VID_PROG_SIZE;\r
+ frame_size = (bpl == Y411_LINE_SZ) ? FRAME_SIZE_NTSC_Y411 : FRAME_SIZE_NTSC_Y422;\r
}\r
else\r
{ \r
- risc_program_size = PAL_VID_PROG_SIZE; \r
- frame_size = (bpl == Y411_LINE_SZ) ? FRAME_SIZE_PAL_Y411 : FRAME_SIZE_PAL_Y422; \r
+ risc_program_size = PAL_VID_PROG_SIZE; \r
+ frame_size = (bpl == Y411_LINE_SZ) ? FRAME_SIZE_PAL_Y411 : FRAME_SIZE_PAL_Y422; \r
}\r
\r
- \r
+ \r
/* Virtual address of Risc buffer program */\r
rp = dev->_dma_virt_addr_ch2;\r
\r
for( frame = 0; frame < NUM_FRAMES; frame++ )\r
{ \r
- databuf_offset = frame_size * frame; \r
- \r
- \r
- if (UNSET != top_offset)\r
- {\r
- fifo_enable = (frame == 0) ? FIFO_ENABLE : FIFO_DISABLE; \r
- rp = cx25821_risc_field_upstream_ch2(dev, rp, dev->_data_buf_phys_addr_ch2 + databuf_offset, top_offset, 0, bpl, odd_num_lines, fifo_enable, ODD_FIELD);\r
- }\r
- \r
- fifo_enable = FIFO_DISABLE; \r
- \r
- \r
- //Even field\r
- rp = cx25821_risc_field_upstream_ch2(dev, rp, dev->_data_buf_phys_addr_ch2 + databuf_offset, bottom_offset, 0x200, bpl, singlefield_lines, fifo_enable, EVEN_FIELD); \r
-\r
- \r
- if( frame == 0 )\r
- {\r
- risc_flag = RISC_CNT_RESET; \r
- risc_phys_jump_addr = dev->_dma_phys_start_addr_ch2 + risc_program_size; \r
- }\r
- else\r
- {\r
- risc_flag = RISC_CNT_INC;\r
- risc_phys_jump_addr = dev->_dma_phys_start_addr_ch2;\r
- }\r
- \r
-\r
- // Loop to 2ndFrameRISC or to Start of Risc program & generate IRQ \r
- *(rp++) = cpu_to_le32(RISC_JUMP|RISC_IRQ1|risc_flag); \r
- *(rp++) = cpu_to_le32(risc_phys_jump_addr); \r
- *(rp++) = cpu_to_le32(0); \r
+ databuf_offset = frame_size * frame; \r
+ \r
+ \r
+ if (UNSET != top_offset)\r
+ {\r
+ fifo_enable = (frame == 0) ? FIFO_ENABLE : FIFO_DISABLE; \r
+ rp = cx25821_risc_field_upstream_ch2(dev, rp, dev->_data_buf_phys_addr_ch2 + databuf_offset, top_offset, 0, bpl, odd_num_lines, fifo_enable, ODD_FIELD);\r
+ }\r
+ \r
+ fifo_enable = FIFO_DISABLE; \r
+ \r
+ \r
+ //Even field\r
+ rp = cx25821_risc_field_upstream_ch2(dev, rp, dev->_data_buf_phys_addr_ch2 + databuf_offset, bottom_offset, 0x200, bpl, singlefield_lines, fifo_enable, EVEN_FIELD); \r
+\r
+ \r
+ if( frame == 0 )\r
+ {\r
+ risc_flag = RISC_CNT_RESET; \r
+ risc_phys_jump_addr = dev->_dma_phys_start_addr_ch2 + risc_program_size; \r
+ }\r
+ else\r
+ {\r
+ risc_flag = RISC_CNT_INC;\r
+ risc_phys_jump_addr = dev->_dma_phys_start_addr_ch2;\r
+ }\r
+ \r
+\r
+ // Loop to 2ndFrameRISC or to Start of Risc program & generate IRQ \r
+ *(rp++) = cpu_to_le32(RISC_JUMP|RISC_IRQ1|risc_flag); \r
+ *(rp++) = cpu_to_le32(risc_phys_jump_addr); \r
+ *(rp++) = cpu_to_le32(0); \r
}\r
\r
return 0;\r
\r
if( !dev->_is_running_ch2 )\r
{\r
- printk("cx25821: No video file is currently running so return!\n");\r
- return;\r
+ printk("cx25821: No video file is currently running so return!\n");\r
+ return;\r
}\r
\r
//Disable RISC interrupts \r
\r
//Clear data buffer memory\r
if( dev->_data_buf_virt_addr_ch2 )\r
- memset( dev->_data_buf_virt_addr_ch2, 0, dev->_data_buf_size_ch2 ); \r
- \r
+ memset( dev->_data_buf_virt_addr_ch2, 0, dev->_data_buf_size_ch2 ); \r
+ \r
dev->_is_running_ch2 = 0;\r
dev->_is_first_frame_ch2 = 0;\r
dev->_frame_count_ch2 = 0;\r
\r
if( dev->_irq_queues_ch2 )\r
{\r
- kfree(dev->_irq_queues_ch2); \r
- dev->_irq_queues_ch2 = NULL; \r
+ kfree(dev->_irq_queues_ch2); \r
+ dev->_irq_queues_ch2 = NULL; \r
}\r
\r
if( dev->_filename_ch2 != NULL )\r
- kfree(dev->_filename_ch2); \r
+ kfree(dev->_filename_ch2); \r
\r
tmp = cx_read( VID_CH_MODE_SEL );\r
cx_write( VID_CH_MODE_SEL, tmp & 0xFFFFFE00); \r
{ \r
if( dev->_is_running_ch2 )\r
{\r
- cx25821_stop_upstream_video_ch2(dev);\r
+ cx25821_stop_upstream_video_ch2(dev);\r
}\r
\r
if (dev->_dma_virt_addr_ch2) \r
{\r
- pci_free_consistent(dev->pci, dev->_risc_size_ch2, dev->_dma_virt_addr_ch2, dev->_dma_phys_addr_ch2);\r
- dev->_dma_virt_addr_ch2 = NULL;\r
+ pci_free_consistent(dev->pci, dev->_risc_size_ch2, dev->_dma_virt_addr_ch2, dev->_dma_phys_addr_ch2);\r
+ dev->_dma_virt_addr_ch2 = NULL;\r
}\r
\r
if (dev->_data_buf_virt_addr_ch2) \r
{\r
- pci_free_consistent(dev->pci, dev->_data_buf_size_ch2, dev->_data_buf_virt_addr_ch2, dev->_data_buf_phys_addr_ch2);\r
- dev->_data_buf_virt_addr_ch2 = NULL;\r
+ pci_free_consistent(dev->pci, dev->_data_buf_size_ch2, dev->_data_buf_virt_addr_ch2, dev->_data_buf_phys_addr_ch2);\r
+ dev->_data_buf_virt_addr_ch2 = NULL;\r
}\r
}\r
\r
loff_t file_offset; \r
loff_t pos;\r
mm_segment_t old_fs;\r
- \r
+ \r
\r
if( dev->_file_status_ch2 == END_OF_FILE ) \r
- return 0;\r
- \r
+ return 0;\r
+ \r
if( dev->_isNTSC_ch2 )\r
{\r
- frame_size = (line_size == Y411_LINE_SZ) ? FRAME_SIZE_NTSC_Y411 : FRAME_SIZE_NTSC_Y422;\r
+ frame_size = (line_size == Y411_LINE_SZ) ? FRAME_SIZE_NTSC_Y411 : FRAME_SIZE_NTSC_Y422;\r
}\r
else\r
{ \r
- frame_size = (line_size == Y411_LINE_SZ) ? FRAME_SIZE_PAL_Y411 : FRAME_SIZE_PAL_Y422;\r
+ frame_size = (line_size == Y411_LINE_SZ) ? FRAME_SIZE_PAL_Y411 : FRAME_SIZE_PAL_Y422;\r
}\r
\r
frame_offset = (frame_index_temp > 0) ? frame_size : 0; \r
file_offset = dev->_frame_count_ch2 * frame_size; \r
\r
- \r
+ \r
myfile = filp_open( dev->_filename_ch2, O_RDONLY | O_LARGEFILE, 0 );\r
\r
\r
if (IS_ERR(myfile)) \r
{\r
- const int open_errno = -PTR_ERR(myfile);\r
- printk("%s(): ERROR opening file(%s) with errno = %d! \n", __func__, dev->_filename_ch2, open_errno);\r
- return PTR_ERR(myfile); \r
+ const int open_errno = -PTR_ERR(myfile);\r
+ printk("%s(): ERROR opening file(%s) with errno = %d! \n", __func__, dev->_filename_ch2, open_errno);\r
+ return PTR_ERR(myfile); \r
} \r
else \r
{ \r
- if( !(myfile->f_op) )\r
- { \r
- printk("%s: File has no file operations registered!", __func__);\r
- filp_close(myfile, NULL);\r
- return -EIO;\r
- }\r
- \r
- \r
- if( !myfile->f_op->read )\r
- { \r
- printk("%s: File has no READ operations registered!", __func__);\r
- filp_close(myfile, NULL);\r
- return -EIO;\r
- }\r
- \r
- pos = myfile->f_pos; \r
- old_fs = get_fs(); \r
- set_fs(KERNEL_DS);\r
- \r
- \r
- for( i = 0; i < dev->_lines_count_ch2; i++ )\r
- {\r
- pos = file_offset; \r
- \r
- vfs_read_retval = vfs_read(myfile, mybuf, line_size, &pos); \r
- \r
- if( vfs_read_retval > 0 && vfs_read_retval == line_size && dev->_data_buf_virt_addr_ch2 != NULL ) \r
- {\r
- memcpy( (void*)(dev->_data_buf_virt_addr_ch2+frame_offset/4), mybuf, vfs_read_retval); \r
- } \r
- \r
- file_offset += vfs_read_retval;\r
- frame_offset += vfs_read_retval;\r
-\r
- if( vfs_read_retval < line_size )\r
- { \r
- printk(KERN_INFO "Done: exit %s() since no more bytes to read from Video file.\n", __func__ );\r
- break;\r
- } \r
- }\r
- \r
- if( i > 0 ) \r
- dev->_frame_count_ch2++; \r
- \r
- dev->_file_status_ch2 = (vfs_read_retval == line_size) ? IN_PROGRESS : END_OF_FILE; \r
-\r
- \r
- set_fs(old_fs); \r
- filp_close(myfile, NULL); \r
+ if( !(myfile->f_op) )\r
+ { \r
+ printk("%s: File has no file operations registered!", __func__);\r
+ filp_close(myfile, NULL);\r
+ return -EIO;\r
+ }\r
+ \r
+ \r
+ if( !myfile->f_op->read )\r
+ { \r
+ printk("%s: File has no READ operations registered!", __func__);\r
+ filp_close(myfile, NULL);\r
+ return -EIO;\r
+ }\r
+ \r
+ pos = myfile->f_pos; \r
+ old_fs = get_fs(); \r
+ set_fs(KERNEL_DS);\r
+ \r
+ \r
+ for( i = 0; i < dev->_lines_count_ch2; i++ )\r
+ {\r
+ pos = file_offset; \r
+ \r
+ vfs_read_retval = vfs_read(myfile, mybuf, line_size, &pos); \r
+ \r
+ if( vfs_read_retval > 0 && vfs_read_retval == line_size && dev->_data_buf_virt_addr_ch2 != NULL ) \r
+ {\r
+ memcpy( (void*)(dev->_data_buf_virt_addr_ch2+frame_offset/4), mybuf, vfs_read_retval); \r
+ } \r
+ \r
+ file_offset += vfs_read_retval;\r
+ frame_offset += vfs_read_retval;\r
+\r
+ if( vfs_read_retval < line_size )\r
+ { \r
+ printk(KERN_INFO "Done: exit %s() since no more bytes to read from Video file.\n", __func__ );\r
+ break;\r
+ } \r
+ }\r
+ \r
+ if( i > 0 ) \r
+ dev->_frame_count_ch2++; \r
+ \r
+ dev->_file_status_ch2 = (vfs_read_retval == line_size) ? IN_PROGRESS : END_OF_FILE; \r
+\r
+ \r
+ set_fs(old_fs); \r
+ filp_close(myfile, NULL); \r
}\r
\r
return 0;\r
\r
if( !dev )\r
{\r
- printk("ERROR %s(): since container_of(work_struct) FAILED! \n", __func__ );\r
- return;\r
+ printk("ERROR %s(): since container_of(work_struct) FAILED! \n", __func__ );\r
+ return;\r
}\r
\r
cx25821_get_frame_ch2( dev, &dev->sram_channels[dev->_channel2_upstream_select] );\r
loff_t pos;\r
loff_t offset = (unsigned long)0;\r
mm_segment_t old_fs;\r
- \r
+ \r
\r
myfile = filp_open( dev->_filename_ch2, O_RDONLY | O_LARGEFILE, 0 );\r
\r
\r
if (IS_ERR(myfile)) \r
{\r
- const int open_errno = -PTR_ERR(myfile);\r
- printk("%s(): ERROR opening file(%s) with errno = %d! \n", __func__, dev->_filename_ch2, open_errno);\r
- return PTR_ERR(myfile);\r
+ const int open_errno = -PTR_ERR(myfile);\r
+ printk("%s(): ERROR opening file(%s) with errno = %d! \n", __func__, dev->_filename_ch2, open_errno);\r
+ return PTR_ERR(myfile);\r
} \r
else \r
{\r
- if( !(myfile->f_op) )\r
- { \r
- printk("%s: File has no file operations registered!", __func__);\r
- filp_close(myfile, NULL);\r
- return -EIO;\r
- }\r
- \r
- \r
- if( !myfile->f_op->read )\r
- { \r
- printk("%s: File has no READ operations registered! Returning.", __func__);\r
- filp_close(myfile, NULL);\r
- return -EIO;\r
- }\r
- \r
- pos = myfile->f_pos;\r
- old_fs = get_fs(); \r
- set_fs(KERNEL_DS);\r
- \r
- \r
- for( j = 0; j < NUM_FRAMES; j++ ) \r
- { \r
- for( i = 0; i < dev->_lines_count_ch2; i++ )\r
- {\r
- pos = offset;\r
-\r
- vfs_read_retval = vfs_read(myfile, mybuf, line_size, &pos); \r
- \r
- if( vfs_read_retval > 0 && vfs_read_retval == line_size && dev->_data_buf_virt_addr_ch2 != NULL ) \r
- {\r
- memcpy( (void*)(dev->_data_buf_virt_addr_ch2+offset/4), mybuf, vfs_read_retval); \r
- }\r
- \r
- \r
- offset += vfs_read_retval;\r
-\r
- if( vfs_read_retval < line_size )\r
- { \r
- printk(KERN_INFO "Done: exit %s() since no more bytes to read from Video file.\n", __func__ );\r
- break;\r
- } \r
- }\r
- \r
- if( i > 0 ) \r
- dev->_frame_count_ch2++;\r
- \r
- if( vfs_read_retval < line_size )\r
- {\r
- break;\r
- }\r
- }\r
-\r
- dev->_file_status_ch2 = (vfs_read_retval == line_size) ? IN_PROGRESS : END_OF_FILE; \r
- \r
- set_fs(old_fs); \r
- myfile->f_pos = 0;\r
- filp_close(myfile, NULL); \r
+ if( !(myfile->f_op) )\r
+ { \r
+ printk("%s: File has no file operations registered!", __func__);\r
+ filp_close(myfile, NULL);\r
+ return -EIO;\r
+ }\r
+ \r
+ \r
+ if( !myfile->f_op->read )\r
+ { \r
+ printk("%s: File has no READ operations registered! Returning.", __func__);\r
+ filp_close(myfile, NULL);\r
+ return -EIO;\r
+ }\r
+ \r
+ pos = myfile->f_pos;\r
+ old_fs = get_fs(); \r
+ set_fs(KERNEL_DS);\r
+ \r
+ \r
+ for( j = 0; j < NUM_FRAMES; j++ ) \r
+ { \r
+ for( i = 0; i < dev->_lines_count_ch2; i++ )\r
+ {\r
+ pos = offset;\r
+\r
+ vfs_read_retval = vfs_read(myfile, mybuf, line_size, &pos); \r
+ \r
+ if( vfs_read_retval > 0 && vfs_read_retval == line_size && dev->_data_buf_virt_addr_ch2 != NULL ) \r
+ {\r
+ memcpy( (void*)(dev->_data_buf_virt_addr_ch2+offset/4), mybuf, vfs_read_retval); \r
+ }\r
+ \r
+ \r
+ offset += vfs_read_retval;\r
+\r
+ if( vfs_read_retval < line_size )\r
+ { \r
+ printk(KERN_INFO "Done: exit %s() since no more bytes to read from Video file.\n", __func__ );\r
+ break;\r
+ } \r
+ }\r
+ \r
+ if( i > 0 ) \r
+ dev->_frame_count_ch2++;\r
+ \r
+ if( vfs_read_retval < line_size )\r
+ {\r
+ break;\r
+ }\r
+ }\r
+\r
+ dev->_file_status_ch2 = (vfs_read_retval == line_size) ? IN_PROGRESS : END_OF_FILE; \r
+ \r
+ set_fs(old_fs); \r
+ myfile->f_pos = 0;\r
+ filp_close(myfile, NULL); \r
}\r
\r
return 0;\r
\r
\r
static int cx25821_upstream_buffer_prepare_ch2(struct cx25821_dev *dev,\r
- struct sram_channel *sram_ch,\r
- int bpl)\r
+ struct sram_channel *sram_ch,\r
+ int bpl)\r
{\r
int ret = 0;\r
dma_addr_t dma_addr;\r
dma_addr_t data_dma_addr; \r
- \r
+ \r
\r
if( dev->_dma_virt_addr_ch2 != NULL )\r
{ \r
- pci_free_consistent(dev->pci, dev->upstream_riscbuf_size_ch2, dev->_dma_virt_addr_ch2, dev->_dma_phys_addr_ch2);\r
+ pci_free_consistent(dev->pci, dev->upstream_riscbuf_size_ch2, dev->_dma_virt_addr_ch2, dev->_dma_phys_addr_ch2);\r
}\r
\r
dev->_dma_virt_addr_ch2 = pci_alloc_consistent(dev->pci, dev->upstream_riscbuf_size_ch2, &dma_addr);\r
\r
if (!dev->_dma_virt_addr_ch2)\r
{\r
- printk("cx25821: FAILED to allocate memory for Risc buffer! Returning.\n");\r
- return -ENOMEM;\r
+ printk("cx25821: FAILED to allocate memory for Risc buffer! Returning.\n");\r
+ return -ENOMEM;\r
}\r
\r
\r
\r
if( dev->_data_buf_virt_addr_ch2 != NULL )\r
{ \r
- pci_free_consistent(dev->pci, dev->upstream_databuf_size_ch2, dev->_data_buf_virt_addr_ch2, dev->_data_buf_phys_addr_ch2);\r
+ pci_free_consistent(dev->pci, dev->upstream_databuf_size_ch2, dev->_data_buf_virt_addr_ch2, dev->_data_buf_phys_addr_ch2);\r
}\r
\r
//For Video Data buffer allocation \r
\r
if (!dev->_data_buf_virt_addr_ch2)\r
{\r
- printk("cx25821: FAILED to allocate memory for data buffer! Returning.\n");\r
- return -ENOMEM;\r
+ printk("cx25821: FAILED to allocate memory for data buffer! Returning.\n");\r
+ return -ENOMEM;\r
}\r
\r
\r
\r
ret = cx25821_openfile_ch2(dev, sram_ch); \r
if( ret < 0 )\r
- return ret;\r
- \r
+ return ret;\r
+ \r
\r
//Creating RISC programs\r
ret = cx25821_risc_buffer_upstream_ch2(dev, dev->pci, 0, bpl, dev->_lines_count_ch2 ); \r
if (ret < 0)\r
{\r
- printk(KERN_INFO "cx25821: Failed creating Video Upstream Risc programs! \n");\r
- goto error;\r
+ printk(KERN_INFO "cx25821: Failed creating Video Upstream Risc programs! \n");\r
+ goto error;\r
}\r
\r
return 0;\r
\r
if (status & FLD_VID_SRC_RISC1) \r
{\r
- // We should only process one program per call\r
- u32 prog_cnt = cx_read( channel->gpcnt );\r
- \r
- //Since we've identified our IRQ, clear our bits from the interrupt mask and interrupt status registers\r
- int_msk_tmp = cx_read(channel->int_msk); \r
- cx_write(channel->int_msk, int_msk_tmp & ~_intr_msk); \r
- cx_write( channel->int_stat, _intr_msk ); \r
- \r
- spin_lock(&dev->slock); \r
- \r
- dev->_frame_index_ch2 = prog_cnt;\r
-\r
- queue_work(dev->_irq_queues_ch2, &dev->_irq_work_entry_ch2); \r
- \r
- \r
- if ( dev->_is_first_frame_ch2 )\r
- {\r
- dev->_is_first_frame_ch2 = 0;\r
- \r
- if( dev->_isNTSC_ch2 )\r
- {\r
- singlefield_lines += 1;\r
- odd_risc_prog_size = ODD_FLD_NTSC_PROG_SIZE;\r
- }\r
- else\r
- {\r
- singlefield_lines = PAL_FIELD_HEIGHT; \r
- odd_risc_prog_size = ODD_FLD_PAL_PROG_SIZE; \r
- }\r
-\r
- \r
- if( dev->_dma_virt_start_addr_ch2 != NULL )\r
- {\r
- line_size_in_bytes = (dev->_pixel_format_ch2 == PIXEL_FRMT_411) ? Y411_LINE_SZ : Y422_LINE_SZ;\r
- risc_phys_jump_addr = dev->_dma_phys_start_addr_ch2 + odd_risc_prog_size; \r
- \r
- rp = cx25821_update_riscprogram_ch2(dev, dev->_dma_virt_start_addr_ch2, TOP_OFFSET, line_size_in_bytes, 0x0, singlefield_lines, FIFO_DISABLE, ODD_FIELD); \r
-\r
- // Jump to Even Risc program of 1st Frame \r
- *(rp++) = cpu_to_le32(RISC_JUMP); \r
- *(rp++) = cpu_to_le32(risc_phys_jump_addr); \r
- *(rp++) = cpu_to_le32(0); \r
- }\r
- }\r
- \r
- spin_unlock(&dev->slock); \r
- }\r
-\r
- \r
+ // We should only process one program per call\r
+ u32 prog_cnt = cx_read( channel->gpcnt );\r
+ \r
+ //Since we've identified our IRQ, clear our bits from the interrupt mask and interrupt status registers\r
+ int_msk_tmp = cx_read(channel->int_msk); \r
+ cx_write(channel->int_msk, int_msk_tmp & ~_intr_msk); \r
+ cx_write( channel->int_stat, _intr_msk ); \r
+ \r
+ spin_lock(&dev->slock); \r
+ \r
+ dev->_frame_index_ch2 = prog_cnt;\r
+\r
+ queue_work(dev->_irq_queues_ch2, &dev->_irq_work_entry_ch2); \r
+ \r
+ \r
+ if ( dev->_is_first_frame_ch2 )\r
+ {\r
+ dev->_is_first_frame_ch2 = 0;\r
+ \r
+ if( dev->_isNTSC_ch2 )\r
+ {\r
+ singlefield_lines += 1;\r
+ odd_risc_prog_size = ODD_FLD_NTSC_PROG_SIZE;\r
+ }\r
+ else\r
+ {\r
+ singlefield_lines = PAL_FIELD_HEIGHT; \r
+ odd_risc_prog_size = ODD_FLD_PAL_PROG_SIZE; \r
+ }\r
+\r
+ \r
+ if( dev->_dma_virt_start_addr_ch2 != NULL )\r
+ {\r
+ line_size_in_bytes = (dev->_pixel_format_ch2 == PIXEL_FRMT_411) ? Y411_LINE_SZ : Y422_LINE_SZ;\r
+ risc_phys_jump_addr = dev->_dma_phys_start_addr_ch2 + odd_risc_prog_size; \r
+ \r
+ rp = cx25821_update_riscprogram_ch2(dev, dev->_dma_virt_start_addr_ch2, TOP_OFFSET, line_size_in_bytes, 0x0, singlefield_lines, FIFO_DISABLE, ODD_FIELD); \r
+\r
+ // Jump to Even Risc program of 1st Frame \r
+ *(rp++) = cpu_to_le32(RISC_JUMP); \r
+ *(rp++) = cpu_to_le32(risc_phys_jump_addr); \r
+ *(rp++) = cpu_to_le32(0); \r
+ }\r
+ }\r
+ \r
+ spin_unlock(&dev->slock); \r
+ }\r
+\r
+ \r
if( dev->_file_status_ch2 == END_OF_FILE )\r
{ \r
- printk("cx25821: EOF Channel 2 Framecount = %d\n", dev->_frame_count_ch2 );\r
- return -1;\r
+ printk("cx25821: EOF Channel 2 Framecount = %d\n", dev->_frame_count_ch2 );\r
+ return -1;\r
}\r
\r
//ElSE, set the interrupt mask register, re-enable irq. \r
\r
\r
if( !dev )\r
- return -1;\r
+ return -1;\r
\r
channel_num = VID_UPSTREAM_SRAM_CHANNEL_J;\r
- \r
+ \r
sram_ch = &dev->sram_channels[channel_num]; \r
\r
msk_stat = cx_read(sram_ch->int_mstat); \r
// Only deal with our interrupt\r
if(vid_status)\r
{\r
- handled = cx25821_video_upstream_irq_ch2(dev, channel_num, vid_status); \r
+ handled = cx25821_video_upstream_irq_ch2(dev, channel_num, vid_status); \r
}\r
\r
\r
if( handled < 0 )\r
{ \r
- cx25821_stop_upstream_video_ch2(dev); \r
+ cx25821_stop_upstream_video_ch2(dev); \r
}\r
else\r
{\r
- handled += handled; \r
+ handled += handled; \r
}\r
\r
return IRQ_RETVAL(handled);\r
u32 value;\r
int vip_mode = PIXEL_ENGINE_VIP1;\r
\r
- \r
+ \r
value = ( (pix_format & 0x3) << 12 ) | ( vip_mode & 0x7 );\r
value &= 0xFFFFFFEF;\r
value |= dev->_isNTSC_ch2 ? 0 : 0x10;\r
\r
if(dev->_isNTSC_ch2)\r
{\r
- odd_num_lines += 1; \r
+ odd_num_lines += 1; \r
}\r
\r
value = (num_lines << 16) | odd_num_lines;\r
\r
\r
int cx25821_start_video_dma_upstream_ch2(struct cx25821_dev *dev,\r
- struct sram_channel *sram_ch)\r
+ struct sram_channel *sram_ch)\r
{\r
u32 tmp = 0;\r
int err = 0;\r
err = request_irq(dev->pci->irq, cx25821_upstream_irq_ch2, IRQF_SHARED | IRQF_DISABLED, dev->name, dev);\r
if (err < 0) \r
{\r
- printk(KERN_ERR "%s: can't get upstream IRQ %d\n", dev->name, dev->pci->irq);\r
- goto fail_irq;\r
+ printk(KERN_ERR "%s: can't get upstream IRQ %d\n", dev->name, dev->pci->irq);\r
+ goto fail_irq;\r
} \r
\r
// Start the DMA engine\r
\r
if( dev->_is_running_ch2 ) \r
{\r
- printk("Video Channel is still running so return!\n");\r
- return 0;\r
+ printk("Video Channel is still running so return!\n");\r
+ return 0;\r
}\r
\r
dev->_channel2_upstream_select = channel_select; \r
\r
if(!dev->_irq_queues_ch2)\r
{\r
- printk("cx25821: create_singlethread_workqueue() for Video FAILED!\n");\r
- return -ENOMEM;\r
+ printk("cx25821: create_singlethread_workqueue() for Video FAILED!\n");\r
+ return -ENOMEM;\r
}\r
\r
// 656/VIP SRC Upstream Channel I & J and 7 - Host Bus Interface for channel A-C\r
tmp = cx_read( VID_CH_MODE_SEL );\r
cx_write( VID_CH_MODE_SEL, tmp | 0x1B0001FF); \r
\r
- \r
+ \r
dev->_is_running_ch2 = 0; \r
dev->_frame_count_ch2 = 0;\r
dev->_file_status_ch2 = RESET_STATUS; \r
data_frame_size = dev->_isNTSC_ch2 ? NTSC_DATA_BUF_SZ : PAL_DATA_BUF_SZ; \r
risc_buffer_size = dev->_isNTSC_ch2 ? NTSC_RISC_BUF_SIZE : PAL_RISC_BUF_SIZE;\r
\r
- \r
+ \r
if( dev->input_filename_ch2 )\r
{\r
- str_length = strlen(dev->input_filename_ch2);\r
- dev->_filename_ch2 = (char *) kmalloc(str_length + 1, GFP_KERNEL);\r
- \r
- if( !dev->_filename_ch2 )\r
- goto error;\r
- \r
- memcpy(dev->_filename_ch2, dev->input_filename_ch2, str_length + 1); \r
+ str_length = strlen(dev->input_filename_ch2);\r
+ dev->_filename_ch2 = (char *) kmalloc(str_length + 1, GFP_KERNEL);\r
+ \r
+ if( !dev->_filename_ch2 )\r
+ goto error;\r
+ \r
+ memcpy(dev->_filename_ch2, dev->input_filename_ch2, str_length + 1); \r
}\r
else\r
{\r
- str_length = strlen(dev->_defaultname_ch2); \r
- dev->_filename_ch2 = (char *) kmalloc(str_length + 1, GFP_KERNEL);\r
- \r
- if( !dev->_filename_ch2 )\r
- goto error;\r
- \r
- memcpy(dev->_filename_ch2, dev->_defaultname_ch2, str_length + 1);\r
+ str_length = strlen(dev->_defaultname_ch2); \r
+ dev->_filename_ch2 = (char *) kmalloc(str_length + 1, GFP_KERNEL);\r
+ \r
+ if( !dev->_filename_ch2 )\r
+ goto error;\r
+ \r
+ memcpy(dev->_filename_ch2, dev->_defaultname_ch2, str_length + 1);\r
}\r
- \r
+ \r
\r
//Default if filename is empty string \r
if( strcmp(dev->input_filename_ch2,"") == 0) \r
{\r
- if( dev->_isNTSC_ch2 )\r
- {\r
- dev->_filename_ch2 = (dev->_pixel_format_ch2 == PIXEL_FRMT_411) ? "/root/vid411.yuv" : "/root/vidtest.yuv";\r
- }\r
- else\r
- {\r
- dev->_filename_ch2 = (dev->_pixel_format_ch2 == PIXEL_FRMT_411) ? "/root/pal411.yuv" : "/root/pal422.yuv"; \r
- }\r
- }\r
- \r
- \r
+ if( dev->_isNTSC_ch2 )\r
+ {\r
+ dev->_filename_ch2 = (dev->_pixel_format_ch2 == PIXEL_FRMT_411) ? "/root/vid411.yuv" : "/root/vidtest.yuv";\r
+ }\r
+ else\r
+ {\r
+ dev->_filename_ch2 = (dev->_pixel_format_ch2 == PIXEL_FRMT_411) ? "/root/pal411.yuv" : "/root/pal422.yuv"; \r
+ }\r
+ }\r
+ \r
+ \r
retval = cx25821_sram_channel_setup_upstream(dev, sram_ch, dev->_line_size_ch2, 0); \r
\r
\r
retval = cx25821_upstream_buffer_prepare_ch2(dev, sram_ch, dev->_line_size_ch2);\r
if (retval < 0) \r
{\r
- printk(KERN_ERR "%s: Failed to set up Video upstream buffers!\n", dev->name);\r
- goto error;\r
+ printk(KERN_ERR "%s: Failed to set up Video upstream buffers!\n", dev->name);\r
+ goto error;\r
}\r
\r
\r
\r
#ifdef USE_RISC_NOOP_VIDEO\r
#define PAL_US_VID_PROG_SIZE ((PAL_FIELD_HEIGHT) * 3 * DWORD_SIZE + RISC_WRITECR_INSTRUCTION_SIZE + \\r
- RISC_SYNC_INSTRUCTION_SIZE + NUM_NO_OPS*DWORD_SIZE)\r
- \r
+ RISC_SYNC_INSTRUCTION_SIZE + NUM_NO_OPS*DWORD_SIZE)\r
+ \r
#define PAL_RISC_BUF_SIZE (2 * PAL_US_VID_PROG_SIZE)\r
\r
#define PAL_VID_PROG_SIZE ((PAL_FIELD_HEIGHT*2) * 3 * DWORD_SIZE + 2*RISC_SYNC_INSTRUCTION_SIZE + \\r
- RISC_WRITECR_INSTRUCTION_SIZE + JUMP_INSTRUCTION_SIZE + 2*NUM_NO_OPS*DWORD_SIZE) \r
+ RISC_WRITECR_INSTRUCTION_SIZE + JUMP_INSTRUCTION_SIZE + 2*NUM_NO_OPS*DWORD_SIZE) \r
\r
#define ODD_FLD_PAL_PROG_SIZE ((PAL_FIELD_HEIGHT) * 3 * DWORD_SIZE + RISC_SYNC_INSTRUCTION_SIZE + \\r
- RISC_WRITECR_INSTRUCTION_SIZE + NUM_NO_OPS*DWORD_SIZE) \r
+ RISC_WRITECR_INSTRUCTION_SIZE + NUM_NO_OPS*DWORD_SIZE) \r
\r
#define NTSC_US_VID_PROG_SIZE ((NTSC_ODD_FLD_LINES + 1) * 3 * DWORD_SIZE + RISC_WRITECR_INSTRUCTION_SIZE + \\r
- JUMP_INSTRUCTION_SIZE + NUM_NO_OPS*DWORD_SIZE) \r
- \r
+ JUMP_INSTRUCTION_SIZE + NUM_NO_OPS*DWORD_SIZE) \r
+ \r
#define NTSC_RISC_BUF_SIZE (2 * (RISC_SYNC_INSTRUCTION_SIZE + NTSC_US_VID_PROG_SIZE)) \r
\r
#define FRAME1_VID_PROG_SIZE ((NTSC_ODD_FLD_LINES + NTSC_FIELD_HEIGHT) * 3 * DWORD_SIZE + 2*RISC_SYNC_INSTRUCTION_SIZE + \\r
- RISC_WRITECR_INSTRUCTION_SIZE + JUMP_INSTRUCTION_SIZE + 2*NUM_NO_OPS*DWORD_SIZE) \r
+ RISC_WRITECR_INSTRUCTION_SIZE + JUMP_INSTRUCTION_SIZE + 2*NUM_NO_OPS*DWORD_SIZE) \r
#define ODD_FLD_NTSC_PROG_SIZE ((NTSC_ODD_FLD_LINES) * 3 * DWORD_SIZE + RISC_SYNC_INSTRUCTION_SIZE + \\r
- RISC_WRITECR_INSTRUCTION_SIZE + NUM_NO_OPS*DWORD_SIZE) \r
+ RISC_WRITECR_INSTRUCTION_SIZE + NUM_NO_OPS*DWORD_SIZE) \r
#endif\r
\r
\r
#define PAL_US_VID_PROG_SIZE ((PAL_FIELD_HEIGHT + 1) * 3 * DWORD_SIZE + RISC_WRITECR_INSTRUCTION_SIZE )\r
#define PAL_RISC_BUF_SIZE ( 2 * (RISC_SYNC_INSTRUCTION_SIZE + PAL_US_VID_PROG_SIZE) )\r
#define PAL_VID_PROG_SIZE ((PAL_FIELD_HEIGHT*2) * 3 * DWORD_SIZE + 2*RISC_SYNC_INSTRUCTION_SIZE + \\r
- RISC_WRITECR_INSTRUCTION_SIZE + JUMP_INSTRUCTION_SIZE ) \r
+ RISC_WRITECR_INSTRUCTION_SIZE + JUMP_INSTRUCTION_SIZE ) \r
#define ODD_FLD_PAL_PROG_SIZE ((PAL_FIELD_HEIGHT) * 3 * DWORD_SIZE + RISC_SYNC_INSTRUCTION_SIZE + RISC_WRITECR_INSTRUCTION_SIZE )\r
#define ODD_FLD_NTSC_PROG_SIZE ((NTSC_ODD_FLD_LINES) * 3 * DWORD_SIZE + RISC_SYNC_INSTRUCTION_SIZE + RISC_WRITECR_INSTRUCTION_SIZE )\r
#define NTSC_US_VID_PROG_SIZE ((NTSC_ODD_FLD_LINES + 1) * 3 * DWORD_SIZE + RISC_WRITECR_INSTRUCTION_SIZE + JUMP_INSTRUCTION_SIZE) \r
#define NTSC_RISC_BUF_SIZE (2 * (RISC_SYNC_INSTRUCTION_SIZE + NTSC_US_VID_PROG_SIZE) ) \r
#define FRAME1_VID_PROG_SIZE ((NTSC_ODD_FLD_LINES + NTSC_FIELD_HEIGHT) * 3 * DWORD_SIZE + 2*RISC_SYNC_INSTRUCTION_SIZE + \\r
- RISC_WRITECR_INSTRUCTION_SIZE + JUMP_INSTRUCTION_SIZE )\r
+ RISC_WRITECR_INSTRUCTION_SIZE + JUMP_INSTRUCTION_SIZE )\r
#endif\r
static int _intr_msk = FLD_VID_SRC_RISC1 | FLD_VID_SRC_UF | FLD_VID_SRC_SYNC | FLD_VID_SRC_OPC_ERR;\r
\r
int cx25821_sram_channel_setup_upstream(struct cx25821_dev *dev,\r
- struct sram_channel *ch,\r
- unsigned int bpl, u32 risc)\r
+ struct sram_channel *ch,\r
+ unsigned int bpl, u32 risc)\r
{\r
unsigned int i, lines;\r
u32 cdt;\r
\r
\r
if (ch->cmds_start == 0) {\r
- cx_write(ch->ptr1_reg, 0);\r
- cx_write(ch->ptr2_reg, 0);\r
- cx_write(ch->cnt2_reg, 0);\r
- cx_write(ch->cnt1_reg, 0);\r
- return 0;\r
+ cx_write(ch->ptr1_reg, 0);\r
+ cx_write(ch->ptr2_reg, 0);\r
+ cx_write(ch->cnt2_reg, 0);\r
+ cx_write(ch->cnt1_reg, 0);\r
+ return 0;\r
} \r
\r
bpl = (bpl + 7) & ~7; /* alignment */\r
\r
if (lines > 4) \r
{\r
- lines = 4;\r
+ lines = 4;\r
}\r
\r
BUG_ON(lines < 2);\r
\r
/* write CDT */\r
for (i = 0; i < lines; i++) {\r
- cx_write(cdt + 16*i, ch->fifo_start + bpl*i);\r
- cx_write(cdt + 16*i + 4, 0);\r
- cx_write(cdt + 16*i + 8, 0);\r
- cx_write(cdt + 16*i + 12, 0);\r
+ cx_write(cdt + 16*i, ch->fifo_start + bpl*i);\r
+ cx_write(cdt + 16*i + 4, 0);\r
+ cx_write(cdt + 16*i + 8, 0);\r
+ cx_write(cdt + 16*i + 12, 0);\r
}\r
\r
/* write CMDS */ \r
cx_write(ch->cmds_start + 8, cdt); \r
cx_write(ch->cmds_start + 12, (lines*16) >> 3); \r
cx_write(ch->cmds_start + 16, ch->ctrl_start); \r
- \r
+ \r
\r
cx_write(ch->cmds_start + 20, VID_IQ_SIZE_DW); \r
\r
for (i = 24; i < 80; i += 4)\r
- cx_write(ch->cmds_start + i, 0);\r
+ cx_write(ch->cmds_start + i, 0);\r
\r
/* fill registers */\r
cx_write(ch->ptr1_reg, ch->fifo_start);\r
}\r
\r
static __le32 *cx25821_update_riscprogram( struct cx25821_dev *dev,\r
- __le32 *rp, unsigned int offset, unsigned int bpl, \r
- u32 sync_line, unsigned int lines, int fifo_enable, int field_type)\r
+ __le32 *rp, unsigned int offset, unsigned int bpl, \r
+ u32 sync_line, unsigned int lines, int fifo_enable, int field_type)\r
{\r
unsigned int line, i;\r
int dist_betwn_starts = bpl * 2; \r
\r
if( USE_RISC_NOOP_VIDEO )\r
{\r
- for( i = 0; i < NUM_NO_OPS; i++ )\r
- {\r
- *(rp++) = cpu_to_le32(RISC_NOOP);\r
- }\r
+ for( i = 0; i < NUM_NO_OPS; i++ )\r
+ {\r
+ *(rp++) = cpu_to_le32(RISC_NOOP);\r
+ }\r
}\r
\r
/* scan lines */\r
for (line = 0; line < lines; line++) \r
{ \r
- *(rp++) = cpu_to_le32(RISC_READ|RISC_SOL|RISC_EOL|bpl); \r
- *(rp++) = cpu_to_le32(dev->_data_buf_phys_addr+offset); \r
- *(rp++) = cpu_to_le32(0); /* bits 63-32 */ \r
- \r
- if ( (lines <= NTSC_FIELD_HEIGHT) || (line < (NTSC_FIELD_HEIGHT-1)) || !(dev->_isNTSC) )\r
- {\r
- offset += dist_betwn_starts; \r
- } \r
+ *(rp++) = cpu_to_le32(RISC_READ|RISC_SOL|RISC_EOL|bpl); \r
+ *(rp++) = cpu_to_le32(dev->_data_buf_phys_addr+offset); \r
+ *(rp++) = cpu_to_le32(0); /* bits 63-32 */ \r
+ \r
+ if ( (lines <= NTSC_FIELD_HEIGHT) || (line < (NTSC_FIELD_HEIGHT-1)) || !(dev->_isNTSC) )\r
+ {\r
+ offset += dist_betwn_starts; \r
+ } \r
}\r
\r
return rp;\r
}\r
\r
static __le32 *cx25821_risc_field_upstream( struct cx25821_dev *dev, __le32 *rp, \r
- dma_addr_t databuf_phys_addr,\r
- unsigned int offset, u32 sync_line,\r
- unsigned int bpl, unsigned int lines, int fifo_enable, int field_type)\r
+ dma_addr_t databuf_phys_addr,\r
+ unsigned int offset, u32 sync_line,\r
+ unsigned int bpl, unsigned int lines, int fifo_enable, int field_type)\r
{\r
unsigned int line, i; \r
struct sram_channel *sram_ch = &dev->sram_channels[dev->_channel_upstream_select];\r
int dist_betwn_starts = bpl * 2; \r
\r
- \r
+ \r
/* sync instruction */\r
if (sync_line != NO_SYNC_LINE)\r
{\r
- *(rp++) = cpu_to_le32(RISC_RESYNC | sync_line); \r
+ *(rp++) = cpu_to_le32(RISC_RESYNC | sync_line); \r
}\r
\r
\r
if( USE_RISC_NOOP_VIDEO )\r
{\r
- for( i = 0; i < NUM_NO_OPS; i++ )\r
- {\r
- *(rp++) = cpu_to_le32(RISC_NOOP);\r
- }\r
+ for( i = 0; i < NUM_NO_OPS; i++ )\r
+ {\r
+ *(rp++) = cpu_to_le32(RISC_NOOP);\r
+ }\r
}\r
\r
/* scan lines */\r
for (line = 0; line < lines; line++) \r
{ \r
- *(rp++) = cpu_to_le32(RISC_READ|RISC_SOL|RISC_EOL|bpl); \r
- *(rp++) = cpu_to_le32(databuf_phys_addr+offset); \r
- *(rp++) = cpu_to_le32(0); /* bits 63-32 */ \r
- \r
- \r
- if ( (lines <= NTSC_FIELD_HEIGHT) || (line < (NTSC_FIELD_HEIGHT-1)) || !(dev->_isNTSC) )\r
- {\r
- offset += dist_betwn_starts; //to skip the other field line\r
- }\r
- \r
-\r
- // check if we need to enable the FIFO after the first 4 lines \r
- // For the upstream video channel, the risc engine will enable the FIFO. \r
- if ( fifo_enable && line == 3 )\r
- {\r
- *(rp++) = RISC_WRITECR;\r
- *(rp++) = sram_ch->dma_ctl;\r
- *(rp++) = FLD_VID_FIFO_EN;\r
- *(rp++) = 0x00000001;\r
- } \r
- }\r
- \r
+ *(rp++) = cpu_to_le32(RISC_READ|RISC_SOL|RISC_EOL|bpl); \r
+ *(rp++) = cpu_to_le32(databuf_phys_addr+offset); \r
+ *(rp++) = cpu_to_le32(0); /* bits 63-32 */ \r
+ \r
+ \r
+ if ( (lines <= NTSC_FIELD_HEIGHT) || (line < (NTSC_FIELD_HEIGHT-1)) || !(dev->_isNTSC) )\r
+ {\r
+ offset += dist_betwn_starts; //to skip the other field line\r
+ }\r
+ \r
+\r
+ // check if we need to enable the FIFO after the first 4 lines \r
+ // For the upstream video channel, the risc engine will enable the FIFO. \r
+ if ( fifo_enable && line == 3 )\r
+ {\r
+ *(rp++) = RISC_WRITECR;\r
+ *(rp++) = sram_ch->dma_ctl;\r
+ *(rp++) = FLD_VID_FIFO_EN;\r
+ *(rp++) = 0x00000001;\r
+ } \r
+ }\r
+ \r
return rp;\r
}\r
\r
int cx25821_risc_buffer_upstream( struct cx25821_dev *dev, \r
- struct pci_dev *pci, \r
- unsigned int top_offset, \r
- unsigned int bpl, unsigned int lines)\r
+ struct pci_dev *pci, \r
+ unsigned int top_offset, \r
+ unsigned int bpl, unsigned int lines)\r
{\r
__le32 *rp;\r
int fifo_enable = 0;\r
int risc_flag = RISC_CNT_RESET;\r
unsigned int bottom_offset = bpl;\r
dma_addr_t risc_phys_jump_addr;\r
- \r
+ \r
if( dev->_isNTSC )\r
{\r
- odd_num_lines = singlefield_lines + 1;\r
- risc_program_size = FRAME1_VID_PROG_SIZE;\r
- frame_size = (bpl == Y411_LINE_SZ) ? FRAME_SIZE_NTSC_Y411 : FRAME_SIZE_NTSC_Y422;\r
+ odd_num_lines = singlefield_lines + 1;\r
+ risc_program_size = FRAME1_VID_PROG_SIZE;\r
+ frame_size = (bpl == Y411_LINE_SZ) ? FRAME_SIZE_NTSC_Y411 : FRAME_SIZE_NTSC_Y422;\r
}\r
else\r
{\r
- risc_program_size = PAL_VID_PROG_SIZE; \r
- frame_size = (bpl == Y411_LINE_SZ) ? FRAME_SIZE_PAL_Y411 : FRAME_SIZE_PAL_Y422; \r
+ risc_program_size = PAL_VID_PROG_SIZE; \r
+ frame_size = (bpl == Y411_LINE_SZ) ? FRAME_SIZE_PAL_Y411 : FRAME_SIZE_PAL_Y422; \r
}\r
\r
- \r
+ \r
/* Virtual address of Risc buffer program */\r
rp = dev->_dma_virt_addr;\r
\r
for( frame = 0; frame < NUM_FRAMES; frame++ )\r
{ \r
- databuf_offset = frame_size * frame; \r
- \r
- if (UNSET != top_offset)\r
- {\r
- fifo_enable = (frame == 0) ? FIFO_ENABLE : FIFO_DISABLE; \r
- rp = cx25821_risc_field_upstream(dev, rp, dev->_data_buf_phys_addr+databuf_offset, top_offset, 0, bpl, odd_num_lines, fifo_enable, ODD_FIELD);\r
- }\r
-\r
- \r
- fifo_enable = FIFO_DISABLE; \r
- \r
- \r
- //Even Field\r
- rp = cx25821_risc_field_upstream(dev, rp, dev->_data_buf_phys_addr+databuf_offset, bottom_offset, 0x200, bpl, singlefield_lines, fifo_enable, EVEN_FIELD); \r
-\r
- \r
- if( frame == 0 )\r
- {\r
- risc_flag = RISC_CNT_RESET; \r
- risc_phys_jump_addr = dev->_dma_phys_start_addr + risc_program_size; \r
- }\r
- else\r
- {\r
- risc_phys_jump_addr = dev->_dma_phys_start_addr;\r
- risc_flag = RISC_CNT_INC;\r
- }\r
- \r
-\r
- // Loop to 2ndFrameRISC or to Start of Risc program & generate IRQ \r
- *(rp++) = cpu_to_le32(RISC_JUMP|RISC_IRQ1|risc_flag); \r
- *(rp++) = cpu_to_le32(risc_phys_jump_addr); \r
- *(rp++) = cpu_to_le32(0); \r
+ databuf_offset = frame_size * frame; \r
+ \r
+ if (UNSET != top_offset)\r
+ {\r
+ fifo_enable = (frame == 0) ? FIFO_ENABLE : FIFO_DISABLE; \r
+ rp = cx25821_risc_field_upstream(dev, rp, dev->_data_buf_phys_addr+databuf_offset, top_offset, 0, bpl, odd_num_lines, fifo_enable, ODD_FIELD);\r
+ }\r
+\r
+ \r
+ fifo_enable = FIFO_DISABLE; \r
+ \r
+ \r
+ //Even Field\r
+ rp = cx25821_risc_field_upstream(dev, rp, dev->_data_buf_phys_addr+databuf_offset, bottom_offset, 0x200, bpl, singlefield_lines, fifo_enable, EVEN_FIELD); \r
+\r
+ \r
+ if( frame == 0 )\r
+ {\r
+ risc_flag = RISC_CNT_RESET; \r
+ risc_phys_jump_addr = dev->_dma_phys_start_addr + risc_program_size; \r
+ }\r
+ else\r
+ {\r
+ risc_phys_jump_addr = dev->_dma_phys_start_addr;\r
+ risc_flag = RISC_CNT_INC;\r
+ }\r
+ \r
+\r
+ // Loop to 2ndFrameRISC or to Start of Risc program & generate IRQ \r
+ *(rp++) = cpu_to_le32(RISC_JUMP|RISC_IRQ1|risc_flag); \r
+ *(rp++) = cpu_to_le32(risc_phys_jump_addr); \r
+ *(rp++) = cpu_to_le32(0); \r
}\r
\r
return 0;\r
\r
if( !dev->_is_running )\r
{\r
- printk("cx25821: No video file is currently running so return!\n");\r
- return;\r
+ printk("cx25821: No video file is currently running so return!\n");\r
+ return;\r
}\r
- \r
+ \r
//Disable RISC interrupts \r
tmp = cx_read( sram_ch->int_msk ); \r
cx_write( sram_ch->int_msk, tmp & ~_intr_msk); \r
\r
//Clear data buffer memory\r
if( dev->_data_buf_virt_addr )\r
- memset( dev->_data_buf_virt_addr, 0, dev->_data_buf_size ); \r
- \r
+ memset( dev->_data_buf_virt_addr, 0, dev->_data_buf_size ); \r
+ \r
dev->_is_running = 0;\r
dev->_is_first_frame = 0;\r
dev->_frame_count = 0;\r
\r
if( dev->_irq_queues )\r
{\r
- kfree(dev->_irq_queues); \r
- dev->_irq_queues = NULL; \r
+ kfree(dev->_irq_queues); \r
+ dev->_irq_queues = NULL; \r
}\r
\r
if( dev->_filename != NULL )\r
- kfree(dev->_filename); \r
+ kfree(dev->_filename); \r
\r
tmp = cx_read( VID_CH_MODE_SEL );\r
cx_write( VID_CH_MODE_SEL, tmp & 0xFFFFFE00); \r
{ \r
if( dev->_is_running ) \r
{\r
- cx25821_stop_upstream_video_ch1(dev);\r
+ cx25821_stop_upstream_video_ch1(dev);\r
}\r
\r
if (dev->_dma_virt_addr) \r
{\r
- pci_free_consistent(dev->pci, dev->_risc_size, dev->_dma_virt_addr, dev->_dma_phys_addr);\r
- dev->_dma_virt_addr = NULL;\r
+ pci_free_consistent(dev->pci, dev->_risc_size, dev->_dma_virt_addr, dev->_dma_phys_addr);\r
+ dev->_dma_virt_addr = NULL;\r
}\r
\r
if (dev->_data_buf_virt_addr) \r
{\r
- pci_free_consistent(dev->pci, dev->_data_buf_size, dev->_data_buf_virt_addr, dev->_data_buf_phys_addr);\r
- dev->_data_buf_virt_addr = NULL;\r
+ pci_free_consistent(dev->pci, dev->_data_buf_size, dev->_data_buf_virt_addr, dev->_data_buf_phys_addr);\r
+ dev->_data_buf_virt_addr = NULL;\r
}\r
}\r
\r
loff_t file_offset; \r
loff_t pos;\r
mm_segment_t old_fs;\r
- \r
+ \r
\r
if( dev->_file_status == END_OF_FILE ) \r
- return 0;\r
- \r
+ return 0;\r
+ \r
if( dev->_isNTSC )\r
{\r
- frame_size = (line_size == Y411_LINE_SZ) ? FRAME_SIZE_NTSC_Y411 : FRAME_SIZE_NTSC_Y422;\r
+ frame_size = (line_size == Y411_LINE_SZ) ? FRAME_SIZE_NTSC_Y411 : FRAME_SIZE_NTSC_Y422;\r
}\r
else\r
{ \r
- frame_size = (line_size == Y411_LINE_SZ) ? FRAME_SIZE_PAL_Y411 : FRAME_SIZE_PAL_Y422;\r
+ frame_size = (line_size == Y411_LINE_SZ) ? FRAME_SIZE_PAL_Y411 : FRAME_SIZE_PAL_Y422;\r
}\r
\r
frame_offset = (frame_index_temp > 0) ? frame_size : 0; \r
file_offset = dev->_frame_count * frame_size; \r
\r
- \r
+ \r
myfile = filp_open( dev->_filename, O_RDONLY | O_LARGEFILE, 0 );\r
\r
\r
if (IS_ERR(myfile)) \r
{\r
- const int open_errno = -PTR_ERR(myfile);\r
- printk("%s(): ERROR opening file(%s) with errno = %d! \n", __func__, dev->_filename, open_errno);\r
- return PTR_ERR(myfile);\r
+ const int open_errno = -PTR_ERR(myfile);\r
+ printk("%s(): ERROR opening file(%s) with errno = %d! \n", __func__, dev->_filename, open_errno);\r
+ return PTR_ERR(myfile);\r
} \r
else \r
{ \r
- if( !(myfile->f_op) )\r
- { \r
- printk("%s: File has no file operations registered!", __func__);\r
- filp_close(myfile, NULL);\r
- return -EIO;\r
- }\r
- \r
- \r
- if( !myfile->f_op->read )\r
- { \r
- printk("%s: File has no READ operations registered!", __func__);\r
- filp_close(myfile, NULL);\r
- return -EIO;\r
- }\r
- \r
- pos = myfile->f_pos; \r
- old_fs = get_fs(); \r
- set_fs(KERNEL_DS);\r
- \r
- \r
- for( i = 0; i < dev->_lines_count; i++ )\r
- {\r
- pos = file_offset; \r
- \r
- vfs_read_retval = vfs_read(myfile, mybuf, line_size, &pos); \r
- \r
- if( vfs_read_retval > 0 && vfs_read_retval == line_size && dev->_data_buf_virt_addr != NULL ) \r
- {\r
- memcpy( (void*)(dev->_data_buf_virt_addr+frame_offset/4), mybuf, vfs_read_retval); \r
- } \r
- \r
- file_offset += vfs_read_retval;\r
- frame_offset += vfs_read_retval;\r
-\r
- if( vfs_read_retval < line_size )\r
- { \r
- printk(KERN_INFO "Done: exit %s() since no more bytes to read from Video file.\n", __func__ );\r
- break;\r
- } \r
- }\r
- \r
- if( i > 0 ) \r
- dev->_frame_count++; \r
- \r
- dev->_file_status = (vfs_read_retval == line_size) ? IN_PROGRESS : END_OF_FILE; \r
-\r
- \r
- set_fs(old_fs); \r
- filp_close(myfile, NULL); \r
+ if( !(myfile->f_op) )\r
+ { \r
+ printk("%s: File has no file operations registered!", __func__);\r
+ filp_close(myfile, NULL);\r
+ return -EIO;\r
+ }\r
+ \r
+ \r
+ if( !myfile->f_op->read )\r
+ { \r
+ printk("%s: File has no READ operations registered!", __func__);\r
+ filp_close(myfile, NULL);\r
+ return -EIO;\r
+ }\r
+ \r
+ pos = myfile->f_pos; \r
+ old_fs = get_fs(); \r
+ set_fs(KERNEL_DS);\r
+ \r
+ \r
+ for( i = 0; i < dev->_lines_count; i++ )\r
+ {\r
+ pos = file_offset; \r
+ \r
+ vfs_read_retval = vfs_read(myfile, mybuf, line_size, &pos); \r
+ \r
+ if( vfs_read_retval > 0 && vfs_read_retval == line_size && dev->_data_buf_virt_addr != NULL ) \r
+ {\r
+ memcpy( (void*)(dev->_data_buf_virt_addr+frame_offset/4), mybuf, vfs_read_retval); \r
+ } \r
+ \r
+ file_offset += vfs_read_retval;\r
+ frame_offset += vfs_read_retval;\r
+\r
+ if( vfs_read_retval < line_size )\r
+ { \r
+ printk(KERN_INFO "Done: exit %s() since no more bytes to read from Video file.\n", __func__ );\r
+ break;\r
+ } \r
+ }\r
+ \r
+ if( i > 0 ) \r
+ dev->_frame_count++; \r
+ \r
+ dev->_file_status = (vfs_read_retval == line_size) ? IN_PROGRESS : END_OF_FILE; \r
+\r
+ \r
+ set_fs(old_fs); \r
+ filp_close(myfile, NULL); \r
}\r
\r
return 0;\r
\r
if( !dev )\r
{\r
- printk("ERROR %s(): since container_of(work_struct) FAILED! \n", __func__ );\r
- return;\r
+ printk("ERROR %s(): since container_of(work_struct) FAILED! \n", __func__ );\r
+ return;\r
}\r
\r
cx25821_get_frame( dev, &dev->sram_channels[dev->_channel_upstream_select] );\r
loff_t pos;\r
loff_t offset = (unsigned long)0;\r
mm_segment_t old_fs;\r
- \r
+ \r
\r
myfile = filp_open( dev->_filename, O_RDONLY | O_LARGEFILE, 0 );\r
\r
\r
if (IS_ERR(myfile)) \r
{\r
- const int open_errno = -PTR_ERR(myfile);\r
- printk("%s(): ERROR opening file(%s) with errno = %d! \n", __func__, dev->_filename, open_errno);\r
- return PTR_ERR(myfile);\r
+ const int open_errno = -PTR_ERR(myfile);\r
+ printk("%s(): ERROR opening file(%s) with errno = %d! \n", __func__, dev->_filename, open_errno);\r
+ return PTR_ERR(myfile);\r
} \r
else \r
{ \r
- if( !(myfile->f_op) )\r
- { \r
- printk("%s: File has no file operations registered!", __func__);\r
- filp_close(myfile, NULL);\r
- return -EIO;\r
- }\r
- \r
- \r
- if( !myfile->f_op->read )\r
- { \r
- printk("%s: File has no READ operations registered! Returning.", __func__);\r
- filp_close(myfile, NULL);\r
- return -EIO;\r
- }\r
- \r
- pos = myfile->f_pos;\r
- old_fs = get_fs(); \r
- set_fs(KERNEL_DS);\r
- \r
- \r
- for( j = 0; j < NUM_FRAMES; j++ ) \r
- { \r
- for( i = 0; i < dev->_lines_count; i++ )\r
- {\r
- pos = offset;\r
-\r
- vfs_read_retval = vfs_read(myfile, mybuf, line_size, &pos); \r
- \r
- if( vfs_read_retval > 0 && vfs_read_retval == line_size && dev->_data_buf_virt_addr != NULL ) \r
- { \r
- memcpy( (void*)(dev->_data_buf_virt_addr+offset/4), mybuf, vfs_read_retval); \r
- }\r
- \r
- \r
- offset += vfs_read_retval;\r
-\r
- if( vfs_read_retval < line_size )\r
- { \r
- printk(KERN_INFO "Done: exit %s() since no more bytes to read from Video file.\n", __func__ );\r
- break;\r
- } \r
- }\r
- \r
- if( i > 0 ) \r
- dev->_frame_count++;\r
- \r
- if( vfs_read_retval < line_size )\r
- {\r
- break;\r
- }\r
- }\r
- \r
-\r
- dev->_file_status = (vfs_read_retval == line_size) ? IN_PROGRESS : END_OF_FILE; \r
- \r
- set_fs(old_fs); \r
- myfile->f_pos = 0;\r
- filp_close(myfile, NULL); \r
+ if( !(myfile->f_op) )\r
+ { \r
+ printk("%s: File has no file operations registered!", __func__);\r
+ filp_close(myfile, NULL);\r
+ return -EIO;\r
+ }\r
+ \r
+ \r
+ if( !myfile->f_op->read )\r
+ { \r
+ printk("%s: File has no READ operations registered! Returning.", __func__);\r
+ filp_close(myfile, NULL);\r
+ return -EIO;\r
+ }\r
+ \r
+ pos = myfile->f_pos;\r
+ old_fs = get_fs(); \r
+ set_fs(KERNEL_DS);\r
+ \r
+ \r
+ for( j = 0; j < NUM_FRAMES; j++ ) \r
+ { \r
+ for( i = 0; i < dev->_lines_count; i++ )\r
+ {\r
+ pos = offset;\r
+\r
+ vfs_read_retval = vfs_read(myfile, mybuf, line_size, &pos); \r
+ \r
+ if( vfs_read_retval > 0 && vfs_read_retval == line_size && dev->_data_buf_virt_addr != NULL ) \r
+ { \r
+ memcpy( (void*)(dev->_data_buf_virt_addr+offset/4), mybuf, vfs_read_retval); \r
+ }\r
+ \r
+ \r
+ offset += vfs_read_retval;\r
+\r
+ if( vfs_read_retval < line_size )\r
+ { \r
+ printk(KERN_INFO "Done: exit %s() since no more bytes to read from Video file.\n", __func__ );\r
+ break;\r
+ } \r
+ }\r
+ \r
+ if( i > 0 ) \r
+ dev->_frame_count++;\r
+ \r
+ if( vfs_read_retval < line_size )\r
+ {\r
+ break;\r
+ }\r
+ }\r
+ \r
+\r
+ dev->_file_status = (vfs_read_retval == line_size) ? IN_PROGRESS : END_OF_FILE; \r
+ \r
+ set_fs(old_fs); \r
+ myfile->f_pos = 0;\r
+ filp_close(myfile, NULL); \r
}\r
\r
return 0;\r
\r
\r
int cx25821_upstream_buffer_prepare(struct cx25821_dev *dev,\r
- struct sram_channel *sram_ch,\r
- int bpl)\r
+ struct sram_channel *sram_ch,\r
+ int bpl)\r
{\r
int ret = 0;\r
dma_addr_t dma_addr;\r
\r
if( dev->_dma_virt_addr != NULL )\r
{ \r
- pci_free_consistent(dev->pci, dev->upstream_riscbuf_size, dev->_dma_virt_addr, dev->_dma_phys_addr);\r
+ pci_free_consistent(dev->pci, dev->upstream_riscbuf_size, dev->_dma_virt_addr, dev->_dma_phys_addr);\r
}\r
\r
\r
\r
if (!dev->_dma_virt_addr)\r
{\r
- printk("cx25821: FAILED to allocate memory for Risc buffer! Returning.\n");\r
- return -ENOMEM;\r
+ printk("cx25821: FAILED to allocate memory for Risc buffer! Returning.\n");\r
+ return -ENOMEM;\r
}\r
\r
\r
\r
if( dev->_data_buf_virt_addr != NULL )\r
{ \r
- pci_free_consistent(dev->pci, dev->upstream_databuf_size, dev->_data_buf_virt_addr, dev->_data_buf_phys_addr);\r
+ pci_free_consistent(dev->pci, dev->upstream_databuf_size, dev->_data_buf_virt_addr, dev->_data_buf_phys_addr);\r
}\r
\r
//For Video Data buffer allocation \r
\r
if (!dev->_data_buf_virt_addr)\r
{\r
- printk("cx25821: FAILED to allocate memory for data buffer! Returning.\n");\r
- return -ENOMEM;\r
+ printk("cx25821: FAILED to allocate memory for data buffer! Returning.\n");\r
+ return -ENOMEM;\r
}\r
\r
\r
\r
ret = cx25821_openfile(dev, sram_ch); \r
if( ret < 0 )\r
- return ret;\r
- \r
+ return ret;\r
+ \r
\r
//Create RISC programs\r
ret = cx25821_risc_buffer_upstream(dev, dev->pci, 0, bpl, dev->_lines_count ); \r
if (ret < 0)\r
{\r
- printk(KERN_INFO "cx25821: Failed creating Video Upstream Risc programs! \n");\r
- goto error;\r
+ printk(KERN_INFO "cx25821: Failed creating Video Upstream Risc programs! \n");\r
+ goto error;\r
}\r
\r
return 0;\r
\r
if (status & FLD_VID_SRC_RISC1) \r
{\r
- // We should only process one program per call\r
- u32 prog_cnt = cx_read( channel->gpcnt );\r
- \r
- //Since we've identified our IRQ, clear our bits from the interrupt mask and interrupt status registers\r
- int_msk_tmp = cx_read(channel->int_msk); \r
- cx_write(channel->int_msk, int_msk_tmp & ~_intr_msk); \r
- cx_write( channel->int_stat, _intr_msk ); \r
- \r
- spin_lock(&dev->slock); \r
- \r
- dev->_frame_index = prog_cnt;\r
-\r
- queue_work(dev->_irq_queues, &dev->_irq_work_entry); \r
- \r
- \r
- if ( dev->_is_first_frame )\r
- {\r
- dev->_is_first_frame = 0; \r
- \r
- if( dev->_isNTSC )\r
- {\r
- singlefield_lines += 1;\r
- odd_risc_prog_size = ODD_FLD_NTSC_PROG_SIZE;\r
- }\r
- else\r
- {\r
- singlefield_lines = PAL_FIELD_HEIGHT; \r
- odd_risc_prog_size = ODD_FLD_PAL_PROG_SIZE; \r
- }\r
-\r
-\r
- if( dev->_dma_virt_start_addr != NULL )\r
- {\r
- line_size_in_bytes = (dev->_pixel_format == PIXEL_FRMT_411) ? Y411_LINE_SZ : Y422_LINE_SZ;\r
- risc_phys_jump_addr = dev->_dma_phys_start_addr + odd_risc_prog_size; \r
- \r
- rp = cx25821_update_riscprogram(dev, dev->_dma_virt_start_addr, TOP_OFFSET, line_size_in_bytes, 0x0, singlefield_lines, FIFO_DISABLE, ODD_FIELD); \r
- \r
- // Jump to Even Risc program of 1st Frame \r
- *(rp++) = cpu_to_le32(RISC_JUMP); \r
- *(rp++) = cpu_to_le32(risc_phys_jump_addr); \r
- *(rp++) = cpu_to_le32(0); \r
- }\r
- }\r
- \r
- spin_unlock(&dev->slock); \r
+ // We should only process one program per call\r
+ u32 prog_cnt = cx_read( channel->gpcnt );\r
+ \r
+ //Since we've identified our IRQ, clear our bits from the interrupt mask and interrupt status registers\r
+ int_msk_tmp = cx_read(channel->int_msk); \r
+ cx_write(channel->int_msk, int_msk_tmp & ~_intr_msk); \r
+ cx_write( channel->int_stat, _intr_msk ); \r
+ \r
+ spin_lock(&dev->slock); \r
+ \r
+ dev->_frame_index = prog_cnt;\r
+\r
+ queue_work(dev->_irq_queues, &dev->_irq_work_entry); \r
+ \r
+ \r
+ if ( dev->_is_first_frame )\r
+ {\r
+ dev->_is_first_frame = 0; \r
+ \r
+ if( dev->_isNTSC )\r
+ {\r
+ singlefield_lines += 1;\r
+ odd_risc_prog_size = ODD_FLD_NTSC_PROG_SIZE;\r
+ }\r
+ else\r
+ {\r
+ singlefield_lines = PAL_FIELD_HEIGHT; \r
+ odd_risc_prog_size = ODD_FLD_PAL_PROG_SIZE; \r
+ }\r
+\r
+\r
+ if( dev->_dma_virt_start_addr != NULL )\r
+ {\r
+ line_size_in_bytes = (dev->_pixel_format == PIXEL_FRMT_411) ? Y411_LINE_SZ : Y422_LINE_SZ;\r
+ risc_phys_jump_addr = dev->_dma_phys_start_addr + odd_risc_prog_size; \r
+ \r
+ rp = cx25821_update_riscprogram(dev, dev->_dma_virt_start_addr, TOP_OFFSET, line_size_in_bytes, 0x0, singlefield_lines, FIFO_DISABLE, ODD_FIELD); \r
+ \r
+ // Jump to Even Risc program of 1st Frame \r
+ *(rp++) = cpu_to_le32(RISC_JUMP); \r
+ *(rp++) = cpu_to_le32(risc_phys_jump_addr); \r
+ *(rp++) = cpu_to_le32(0); \r
+ }\r
+ }\r
+ \r
+ spin_unlock(&dev->slock); \r
}\r
else \r
{\r
- if(status & FLD_VID_SRC_UF)\r
- printk("%s: Video Received Underflow Error Interrupt!\n", __func__);\r
+ if(status & FLD_VID_SRC_UF)\r
+ printk("%s: Video Received Underflow Error Interrupt!\n", __func__);\r
\r
- if(status & FLD_VID_SRC_SYNC)\r
- printk("%s: Video Received Sync Error Interrupt!\n", __func__);\r
+ if(status & FLD_VID_SRC_SYNC)\r
+ printk("%s: Video Received Sync Error Interrupt!\n", __func__);\r
\r
- if(status & FLD_VID_SRC_OPC_ERR)\r
- printk("%s: Video Received OpCode Error Interrupt!\n", __func__);\r
+ if(status & FLD_VID_SRC_OPC_ERR)\r
+ printk("%s: Video Received OpCode Error Interrupt!\n", __func__);\r
}\r
- \r
- \r
+ \r
+ \r
if( dev->_file_status == END_OF_FILE )\r
{ \r
- printk("cx25821: EOF Channel 1 Framecount = %d\n", dev->_frame_count );\r
- return -1;\r
+ printk("cx25821: EOF Channel 1 Framecount = %d\n", dev->_frame_count );\r
+ return -1;\r
}\r
\r
//ElSE, set the interrupt mask register, re-enable irq. \r
\r
\r
if( !dev )\r
- return -1;\r
- \r
+ return -1;\r
+ \r
channel_num = VID_UPSTREAM_SRAM_CHANNEL_I;\r
\r
sram_ch = &dev->sram_channels[channel_num]; \r
// Only deal with our interrupt\r
if(vid_status)\r
{\r
- handled = cx25821_video_upstream_irq(dev, channel_num, vid_status); \r
+ handled = cx25821_video_upstream_irq(dev, channel_num, vid_status); \r
} \r
\r
if( handled < 0 )\r
{ \r
- cx25821_stop_upstream_video_ch1(dev);\r
+ cx25821_stop_upstream_video_ch1(dev);\r
}\r
else\r
{\r
- handled += handled; \r
+ handled += handled; \r
}\r
\r
return IRQ_RETVAL(handled);\r
int num_lines, odd_num_lines;\r
u32 value;\r
int vip_mode = OUTPUT_FRMT_656; \r
- \r
+ \r
\r
value = ( (pix_format & 0x3) << 12 ) | ( vip_mode & 0x7 );\r
value &= 0xFFFFFFEF;\r
\r
if(dev->_isNTSC)\r
{\r
- odd_num_lines += 1; \r
+ odd_num_lines += 1; \r
}\r
\r
value = (num_lines << 16) | odd_num_lines;\r
\r
\r
int cx25821_start_video_dma_upstream(struct cx25821_dev *dev,\r
- struct sram_channel *sram_ch)\r
+ struct sram_channel *sram_ch)\r
{\r
u32 tmp = 0;\r
int err = 0;\r
err = request_irq(dev->pci->irq, cx25821_upstream_irq, IRQF_SHARED | IRQF_DISABLED, dev->name, dev);\r
if (err < 0) \r
{\r
- printk(KERN_ERR "%s: can't get upstream IRQ %d\n", dev->name, dev->pci->irq);\r
- goto fail_irq;\r
+ printk(KERN_ERR "%s: can't get upstream IRQ %d\n", dev->name, dev->pci->irq);\r
+ goto fail_irq;\r
} \r
\r
\r
\r
if( dev->_is_running ) \r
{\r
- printk("Video Channel is still running so return!\n");\r
- return 0;\r
+ printk("Video Channel is still running so return!\n");\r
+ return 0;\r
}\r
\r
\r
\r
if(!dev->_irq_queues)\r
{\r
- printk("cx25821: create_singlethread_workqueue() for Video FAILED!\n");\r
- return -ENOMEM;\r
+ printk("cx25821: create_singlethread_workqueue() for Video FAILED!\n");\r
+ return -ENOMEM;\r
}\r
\r
// 656/VIP SRC Upstream Channel I & J and 7 - Host Bus Interface for channel A-C\r
tmp = cx_read( VID_CH_MODE_SEL );\r
cx_write( VID_CH_MODE_SEL, tmp | 0x1B0001FF); \r
\r
- \r
+ \r
dev->_is_running = 0; \r
dev->_frame_count = 0;\r
dev->_file_status = RESET_STATUS; \r
data_frame_size = dev->_isNTSC ? NTSC_DATA_BUF_SZ : PAL_DATA_BUF_SZ; \r
risc_buffer_size = dev->_isNTSC ? NTSC_RISC_BUF_SIZE : PAL_RISC_BUF_SIZE;\r
\r
- \r
+ \r
if( dev->input_filename )\r
{\r
- str_length = strlen(dev->input_filename);\r
- dev->_filename = (char *) kmalloc(str_length + 1, GFP_KERNEL);\r
- \r
- if( !dev->_filename )\r
- goto error;\r
- \r
- memcpy(dev->_filename, dev->input_filename, str_length + 1); \r
+ str_length = strlen(dev->input_filename);\r
+ dev->_filename = (char *) kmalloc(str_length + 1, GFP_KERNEL);\r
+ \r
+ if( !dev->_filename )\r
+ goto error;\r
+ \r
+ memcpy(dev->_filename, dev->input_filename, str_length + 1); \r
}\r
else\r
{\r
- str_length = strlen(dev->_defaultname); \r
- dev->_filename = (char *) kmalloc(str_length + 1, GFP_KERNEL);\r
- \r
- if( !dev->_filename )\r
- goto error;\r
- \r
- memcpy(dev->_filename, dev->_defaultname, str_length + 1);\r
+ str_length = strlen(dev->_defaultname); \r
+ dev->_filename = (char *) kmalloc(str_length + 1, GFP_KERNEL);\r
+ \r
+ if( !dev->_filename )\r
+ goto error;\r
+ \r
+ memcpy(dev->_filename, dev->_defaultname, str_length + 1);\r
}\r
\r
\r
//Default if filename is empty string \r
if( strcmp(dev->input_filename,"") == 0) \r
{\r
- if( dev->_isNTSC )\r
- {\r
- dev->_filename = (dev->_pixel_format == PIXEL_FRMT_411) ? "/root/vid411.yuv" : "/root/vidtest.yuv";\r
- }\r
- else\r
- {\r
- dev->_filename = (dev->_pixel_format == PIXEL_FRMT_411) ? "/root/pal411.yuv" : "/root/pal422.yuv"; \r
- }\r
+ if( dev->_isNTSC )\r
+ {\r
+ dev->_filename = (dev->_pixel_format == PIXEL_FRMT_411) ? "/root/vid411.yuv" : "/root/vidtest.yuv";\r
+ }\r
+ else\r
+ {\r
+ dev->_filename = (dev->_pixel_format == PIXEL_FRMT_411) ? "/root/pal411.yuv" : "/root/pal422.yuv"; \r
+ }\r
}\r
\r
dev->_is_running = 0; \r
retval = cx25821_upstream_buffer_prepare(dev, sram_ch, dev->_line_size);\r
if (retval < 0) \r
{\r
- printk(KERN_ERR "%s: Failed to set up Video upstream buffers!\n", dev->name);\r
- goto error;\r
+ printk(KERN_ERR "%s: Failed to set up Video upstream buffers!\n", dev->name);\r
+ goto error;\r
}\r
\r
\r
\r
#ifdef USE_RISC_NOOP_VIDEO\r
#define PAL_US_VID_PROG_SIZE ((PAL_FIELD_HEIGHT) * 3 * DWORD_SIZE + RISC_WRITECR_INSTRUCTION_SIZE + \\r
- RISC_SYNC_INSTRUCTION_SIZE + NUM_NO_OPS*DWORD_SIZE)\r
- \r
+ RISC_SYNC_INSTRUCTION_SIZE + NUM_NO_OPS*DWORD_SIZE)\r
+ \r
#define PAL_RISC_BUF_SIZE (2 * PAL_US_VID_PROG_SIZE)\r
\r
#define PAL_VID_PROG_SIZE ((PAL_FIELD_HEIGHT*2) * 3 * DWORD_SIZE + 2*RISC_SYNC_INSTRUCTION_SIZE + \\r
- RISC_WRITECR_INSTRUCTION_SIZE + JUMP_INSTRUCTION_SIZE + 2*NUM_NO_OPS*DWORD_SIZE) \r
+ RISC_WRITECR_INSTRUCTION_SIZE + JUMP_INSTRUCTION_SIZE + 2*NUM_NO_OPS*DWORD_SIZE) \r
\r
#define ODD_FLD_PAL_PROG_SIZE ((PAL_FIELD_HEIGHT) * 3 * DWORD_SIZE + RISC_SYNC_INSTRUCTION_SIZE + \\r
- RISC_WRITECR_INSTRUCTION_SIZE + NUM_NO_OPS*DWORD_SIZE) \r
- \r
+ RISC_WRITECR_INSTRUCTION_SIZE + NUM_NO_OPS*DWORD_SIZE) \r
+ \r
#define ODD_FLD_NTSC_PROG_SIZE ((NTSC_ODD_FLD_LINES) * 3 * DWORD_SIZE + RISC_SYNC_INSTRUCTION_SIZE + \\r
- RISC_WRITECR_INSTRUCTION_SIZE + NUM_NO_OPS*DWORD_SIZE) \r
- \r
+ RISC_WRITECR_INSTRUCTION_SIZE + NUM_NO_OPS*DWORD_SIZE) \r
+ \r
#define NTSC_US_VID_PROG_SIZE ((NTSC_ODD_FLD_LINES + 1) * 3 * DWORD_SIZE + RISC_WRITECR_INSTRUCTION_SIZE + \\r
- JUMP_INSTRUCTION_SIZE + NUM_NO_OPS*DWORD_SIZE) \r
- \r
+ JUMP_INSTRUCTION_SIZE + NUM_NO_OPS*DWORD_SIZE) \r
+ \r
#define NTSC_RISC_BUF_SIZE (2 * (RISC_SYNC_INSTRUCTION_SIZE + NTSC_US_VID_PROG_SIZE)) \r
\r
#define FRAME1_VID_PROG_SIZE ((NTSC_ODD_FLD_LINES + NTSC_FIELD_HEIGHT) * 3 * DWORD_SIZE + 2*RISC_SYNC_INSTRUCTION_SIZE + \\r
- RISC_WRITECR_INSTRUCTION_SIZE + JUMP_INSTRUCTION_SIZE + 2*NUM_NO_OPS*DWORD_SIZE) \r
- \r
+ RISC_WRITECR_INSTRUCTION_SIZE + JUMP_INSTRUCTION_SIZE + 2*NUM_NO_OPS*DWORD_SIZE) \r
+ \r
#endif\r
\r
\r
#ifndef USE_RISC_NOOP_VIDEO\r
#define PAL_US_VID_PROG_SIZE ((PAL_FIELD_HEIGHT) * 3 * DWORD_SIZE + RISC_WRITECR_INSTRUCTION_SIZE + \\r
- RISC_SYNC_INSTRUCTION_SIZE + JUMP_INSTRUCTION_SIZE)\r
- \r
+ RISC_SYNC_INSTRUCTION_SIZE + JUMP_INSTRUCTION_SIZE)\r
+ \r
#define PAL_RISC_BUF_SIZE (2 * PAL_US_VID_PROG_SIZE)\r
\r
#define PAL_VID_PROG_SIZE ((PAL_FIELD_HEIGHT*2) * 3 * DWORD_SIZE + 2*RISC_SYNC_INSTRUCTION_SIZE + \\r
- RISC_WRITECR_INSTRUCTION_SIZE + JUMP_INSTRUCTION_SIZE ) \r
+ RISC_WRITECR_INSTRUCTION_SIZE + JUMP_INSTRUCTION_SIZE ) \r
\r
#define ODD_FLD_PAL_PROG_SIZE ((PAL_FIELD_HEIGHT) * 3 * DWORD_SIZE + RISC_SYNC_INSTRUCTION_SIZE + RISC_WRITECR_INSTRUCTION_SIZE )\r
#define ODD_FLD_NTSC_PROG_SIZE ((NTSC_ODD_FLD_LINES) * 3 * DWORD_SIZE + RISC_SYNC_INSTRUCTION_SIZE + RISC_WRITECR_INSTRUCTION_SIZE )\r
#define NTSC_US_VID_PROG_SIZE ((NTSC_ODD_FLD_LINES + 1) * 3 * DWORD_SIZE + RISC_WRITECR_INSTRUCTION_SIZE + JUMP_INSTRUCTION_SIZE) \r
#define NTSC_RISC_BUF_SIZE ( 2 * (RISC_SYNC_INSTRUCTION_SIZE + NTSC_US_VID_PROG_SIZE) ) \r
#define FRAME1_VID_PROG_SIZE ((NTSC_ODD_FLD_LINES + NTSC_FIELD_HEIGHT) * 3 * DWORD_SIZE + 2*RISC_SYNC_INSTRUCTION_SIZE + \\r
- RISC_WRITECR_INSTRUCTION_SIZE + JUMP_INSTRUCTION_SIZE )\r
+ RISC_WRITECR_INSTRUCTION_SIZE + JUMP_INSTRUCTION_SIZE )\r
#endif \r
/*
* Driver for the Conexant CX25821 PCIe bridge
*
- * Copyright (C) 2009 Conexant Systems Inc.
+ * Copyright (C) 2009 Conexant Systems Inc.
* Authors <shu.lin@conexant.com>, <hiep.huynh@conexant.com>
* Based on Steven Toth <stoth@linuxtv.org> cx23885 driver
*
struct cx25821_fmt formats[] = {
{
- .name = "8 bpp, gray",
- .fourcc = V4L2_PIX_FMT_GREY,
- .depth = 8,
- .flags = FORMAT_FLAGS_PACKED,
+ .name = "8 bpp, gray",
+ .fourcc = V4L2_PIX_FMT_GREY,
+ .depth = 8,
+ .flags = FORMAT_FLAGS_PACKED,
}, {
- .name = "4:1:1, packed, Y41P",
- .fourcc = V4L2_PIX_FMT_Y41P,
- .depth = 12,
- .flags = FORMAT_FLAGS_PACKED,
+ .name = "4:1:1, packed, Y41P",
+ .fourcc = V4L2_PIX_FMT_Y41P,
+ .depth = 12,
+ .flags = FORMAT_FLAGS_PACKED,
}, {
- .name = "4:2:2, packed, YUYV",
- .fourcc = V4L2_PIX_FMT_YUYV,
- .depth = 16,
- .flags = FORMAT_FLAGS_PACKED,
+ .name = "4:2:2, packed, YUYV",
+ .fourcc = V4L2_PIX_FMT_YUYV,
+ .depth = 16,
+ .flags = FORMAT_FLAGS_PACKED,
}, {
- .name = "4:2:2, packed, UYVY",
- .fourcc = V4L2_PIX_FMT_UYVY,
- .depth = 16,
- .flags = FORMAT_FLAGS_PACKED,
+ .name = "4:2:2, packed, UYVY",
+ .fourcc = V4L2_PIX_FMT_UYVY,
+ .depth = 16,
+ .flags = FORMAT_FLAGS_PACKED,
},{
- .name = "4:2:0, YUV",
- .fourcc = V4L2_PIX_FMT_YUV420,
- .depth = 12,
- .flags = FORMAT_FLAGS_PACKED,
+ .name = "4:2:0, YUV",
+ .fourcc = V4L2_PIX_FMT_YUV420,
+ .depth = 12,
+ .flags = FORMAT_FLAGS_PACKED,
},
};
if( fourcc == V4L2_PIX_FMT_Y41P || fourcc == V4L2_PIX_FMT_YUV411P )
{
- return formats+1;
+ return formats+1;
}
-
+
for (i = 0; i < ARRAY_SIZE(formats); i++)
- if (formats[i].fourcc == fourcc)
- return formats+i;
+ if (formats[i].fourcc == fourcc)
+ return formats+i;
printk(KERN_ERR "%s(0x%08x) NOT FOUND\n", __func__, fourcc);
return NULL;
dprintk(1, "%s()\n", __func__);
if (!list_empty(&q->active)) {
- list_for_each(item, &q->active)
- buf = list_entry(item, struct cx25821_buffer, vb.queue);
+ list_for_each(item, &q->active)
+ buf = list_entry(item, struct cx25821_buffer, vb.queue);
}
if (!list_empty(&q->queued))
{
- list_for_each(item, &q->queued)
- buf = list_entry(item, struct cx25821_buffer, vb.queue);
+ list_for_each(item, &q->queued)
+ buf = list_entry(item, struct cx25821_buffer, vb.queue);
}
}
int bc;
for (bc = 0;; bc++) {
- if (list_empty(&q->active))
- {
- dprintk(1, "bc=%d (=0: active empty)\n", bc);
- break;
- }
-
- buf = list_entry(q->active.next, struct cx25821_buffer, vb.queue);
-
- /* count comes from the hw and it is 16bit wide --
- * this trick handles wrap-arounds correctly for
- * up to 32767 buffers in flight... */
- if ((s16) (count - buf->count) < 0)
- {
- break;
- }
-
- do_gettimeofday(&buf->vb.ts);
- buf->vb.state = VIDEOBUF_DONE;
- list_del(&buf->vb.queue);
- wake_up(&buf->vb.done);
+ if (list_empty(&q->active))
+ {
+ dprintk(1, "bc=%d (=0: active empty)\n", bc);
+ break;
+ }
+
+ buf = list_entry(q->active.next, struct cx25821_buffer, vb.queue);
+
+ /* count comes from the hw and it is 16bit wide --
+ * this trick handles wrap-arounds correctly for
+ * up to 32767 buffers in flight... */
+ if ((s16) (count - buf->count) < 0)
+ {
+ break;
+ }
+
+ do_gettimeofday(&buf->vb.ts);
+ buf->vb.state = VIDEOBUF_DONE;
+ list_del(&buf->vb.queue);
+ wake_up(&buf->vb.done);
}
if (list_empty(&q->active))
- del_timer(&q->timeout);
+ del_timer(&q->timeout);
else
- mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
+ mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
if (bc != 1)
- printk(KERN_ERR "%s: %d buffers handled (should be 1)\n", __func__, bc);
+ printk(KERN_ERR "%s: %d buffers handled (should be 1)\n", __func__, bc);
}
#ifdef TUNER_FLAG
int cx25821_set_tvnorm(struct cx25821_dev *dev, v4l2_std_id norm)
{
dprintk(1, "%s(norm = 0x%08x) name: [%s]\n", __func__,
- (unsigned int)norm,
- v4l2_norm_to_name(norm));
-
+ (unsigned int)norm,
+ v4l2_norm_to_name(norm));
+
dev->tvnorm = norm;
- /* Tell the internal A/V decoder */
+ /* Tell the internal A/V decoder */
cx25821_call_all(dev, core, s_std, norm);
-
+
return 0;
}
#endif
struct video_device *cx25821_vdev_init(struct cx25821_dev *dev,
- struct pci_dev *pci,
- struct video_device *template,
- char *type)
+ struct pci_dev *pci,
+ struct video_device *template,
+ char *type)
{
struct video_device *vfd;
dprintk(1, "%s()\n", __func__);
vfd = video_device_alloc();
if (NULL == vfd)
- return NULL;
+ return NULL;
*vfd = *template;
vfd->minor = -1;
vfd->v4l2_dev = &dev->v4l2_dev;
int i;
if (qctrl->id < V4L2_CID_BASE || qctrl->id >= V4L2_CID_LASTP1)
- return -EINVAL;
+ return -EINVAL;
for (i = 0; i < CX25821_CTLS; i++)
- if (cx25821_ctls[i].v.id == qctrl->id)
- break;
+ if (cx25821_ctls[i].v.id == qctrl->id)
+ break;
if (i == CX25821_CTLS) {
- *qctrl = no_ctl;
- return 0;
+ *qctrl = no_ctl;
+ return 0;
}
*qctrl = cx25821_ctls[i].v;
return 0;
{
dprintk(1, "%s()\n", __func__);
if (fh->resources & bit)
- /* have it already allocated */
- return 1;
+ /* have it already allocated */
+ return 1;
/* is it free? */
mutex_lock(&dev->lock);
if (dev->resources & bit) {
- /* no, someone else uses it */
- mutex_unlock(&dev->lock);
- return 0;
+ /* no, someone else uses it */
+ mutex_unlock(&dev->lock);
+ return 0;
}
/* it's free, grab it */
fh->resources |= bit;
memset(&route, 0, sizeof(route));
dprintk(1, "%s() video_mux: %d [vmux=%d, gpio=0x%x,0x%x,0x%x,0x%x]\n", __func__,
- input, INPUT(input)->vmux,
- INPUT(input)->gpio0, INPUT(input)->gpio1,
- INPUT(input)->gpio2, INPUT(input)->gpio3);
+ input, INPUT(input)->vmux,
+ INPUT(input)->gpio0, INPUT(input)->gpio1,
+ INPUT(input)->gpio2, INPUT(input)->gpio3);
dev->input = input;
route.input = INPUT(input)->vmux;
-
+
/* Tell the internal A/V decoder */
- cx25821_call_all(dev, video, s_routing, INPUT(input)->vmux, 0, 0);
-
+ cx25821_call_all(dev, video, s_routing, INPUT(input)->vmux, 0, 0);
+
return 0;
}
int cx25821_start_video_dma(struct cx25821_dev *dev,
- struct cx25821_dmaqueue *q,
- struct cx25821_buffer *buf,
- struct sram_channel *channel)
+ struct cx25821_dmaqueue *q,
+ struct cx25821_buffer *buf,
+ struct sram_channel *channel)
{
int tmp = 0;
/* make sure upstream setting if any is reversed */
tmp = cx_read( VID_CH_MODE_SEL );
- cx_write( VID_CH_MODE_SEL, tmp & 0xFFFFFE00);
+ cx_write( VID_CH_MODE_SEL, tmp & 0xFFFFFE00);
return 0;
}
struct list_head *item;
if (!list_empty(&q->active)) {
- buf = list_entry(q->active.next, struct cx25821_buffer, vb.queue);
+ buf = list_entry(q->active.next, struct cx25821_buffer, vb.queue);
- cx25821_start_video_dma(dev, q, buf, channel);
+ cx25821_start_video_dma(dev, q, buf, channel);
- list_for_each(item, &q->active) {
- buf = list_entry(item, struct cx25821_buffer, vb.queue);
- buf->count = q->count++;
- }
+ list_for_each(item, &q->active) {
+ buf = list_entry(item, struct cx25821_buffer, vb.queue);
+ buf->count = q->count++;
+ }
- mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
- return 0;
+ mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
+ return 0;
}
prev = NULL;
for (;;) {
- if (list_empty(&q->queued))
- return 0;
-
- buf = list_entry(q->queued.next, struct cx25821_buffer, vb.queue);
-
- if (NULL == prev) {
- list_move_tail(&buf->vb.queue, &q->active);
- cx25821_start_video_dma(dev, q, buf, channel);
- buf->vb.state = VIDEOBUF_ACTIVE;
- buf->count = q->count++;
- mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
- } else if (prev->vb.width == buf->vb.width &&
- prev->vb.height == buf->vb.height &&
- prev->fmt == buf->fmt) {
- list_move_tail(&buf->vb.queue, &q->active);
- buf->vb.state = VIDEOBUF_ACTIVE;
- buf->count = q->count++;
- prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
- prev->risc.jmp[2] = cpu_to_le32(0); /* Bits 63 - 32 */
- } else {
- return 0;
- }
- prev = buf;
+ if (list_empty(&q->queued))
+ return 0;
+
+ buf = list_entry(q->queued.next, struct cx25821_buffer, vb.queue);
+
+ if (NULL == prev) {
+ list_move_tail(&buf->vb.queue, &q->active);
+ cx25821_start_video_dma(dev, q, buf, channel);
+ buf->vb.state = VIDEOBUF_ACTIVE;
+ buf->count = q->count++;
+ mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
+ } else if (prev->vb.width == buf->vb.width &&
+ prev->vb.height == buf->vb.height &&
+ prev->fmt == buf->fmt) {
+ list_move_tail(&buf->vb.queue, &q->active);
+ buf->vb.state = VIDEOBUF_ACTIVE;
+ buf->count = q->count++;
+ prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
+ prev->risc.jmp[2] = cpu_to_le32(0); /* Bits 63 - 32 */
+ } else {
+ return 0;
+ }
+ prev = buf;
}
}
spin_lock_irqsave(&dev->slock, flags);
while (!list_empty(&q->active)) {
- buf = list_entry(q->active.next, struct cx25821_buffer, vb.queue);
- list_del(&buf->vb.queue);
+ buf = list_entry(q->active.next, struct cx25821_buffer, vb.queue);
+ list_del(&buf->vb.queue);
- buf->vb.state = VIDEOBUF_ERROR;
- wake_up(&buf->vb.done);
+ buf->vb.state = VIDEOBUF_ERROR;
+ wake_up(&buf->vb.done);
}
cx25821_restart_video_queue(dev, q, channel);
mask = cx_read(channel->int_msk);
if (0 == (status & mask))
- return handled;
+ return handled;
cx_write(channel->int_stat, status);
/* risc op code error */
if (status & (1 << 16)) {
- printk(KERN_WARNING "%s, %s: video risc op code error\n", dev->name, channel->name);
- cx_clear(channel->dma_ctl, 0x11);
- cx25821_sram_channel_dump(dev, channel);
+ printk(KERN_WARNING "%s, %s: video risc op code error\n", dev->name, channel->name);
+ cx_clear(channel->dma_ctl, 0x11);
+ cx25821_sram_channel_dump(dev, channel);
}
/* risc1 y */
if (status & FLD_VID_DST_RISC1) {
- spin_lock(&dev->slock);
- count = cx_read(channel->gpcnt);
- cx25821_video_wakeup(dev, &dev->vidq[channel->i], count);
- spin_unlock(&dev->slock);
- handled++;
+ spin_lock(&dev->slock);
+ count = cx_read(channel->gpcnt);
+ cx25821_video_wakeup(dev, &dev->vidq[channel->i], count);
+ spin_unlock(&dev->slock);
+ handled++;
}
/* risc2 y */
if (status & 0x10) {
- dprintk(2, "stopper video\n");
- spin_lock(&dev->slock);
- cx25821_restart_video_queue(dev, &dev->vidq[channel->i], channel);
- spin_unlock(&dev->slock);
- handled++;
+ dprintk(2, "stopper video\n");
+ spin_lock(&dev->slock);
+ cx25821_restart_video_queue(dev, &dev->vidq[channel->i], channel);
+ spin_unlock(&dev->slock);
+ handled++;
}
return handled;
}
{
if( dev->ioctl_dev )
{
- if (dev->ioctl_dev->minor != -1)
- video_unregister_device(dev->ioctl_dev);
- else
- video_device_release(dev->ioctl_dev);
+ if (dev->ioctl_dev->minor != -1)
+ video_unregister_device(dev->ioctl_dev);
+ else
+ video_device_release(dev->ioctl_dev);
- dev->ioctl_dev = NULL;
+ dev->ioctl_dev = NULL;
}
}
-
+
void cx25821_video_unregister(struct cx25821_dev *dev, int chan_num)
{
cx_clear(PCI_INT_MSK, 1);
if (dev->video_dev[chan_num]) {
- if (-1 != dev->video_dev[chan_num]->minor)
- video_unregister_device(dev->video_dev[chan_num]);
- else
- video_device_release(dev->video_dev[chan_num]);
+ if (-1 != dev->video_dev[chan_num]->minor)
+ video_unregister_device(dev->video_dev[chan_num]);
+ else
+ video_device_release(dev->video_dev[chan_num]);
- dev->video_dev[chan_num] = NULL;
+ dev->video_dev[chan_num] = NULL;
- btcx_riscmem_free(dev->pci, &dev->vidq[chan_num].stopper);
+ btcx_riscmem_free(dev->pci, &dev->vidq[chan_num].stopper);
- printk(KERN_WARNING "device %d released!\n", chan_num);
+ printk(KERN_WARNING "device %d released!\n", chan_num);
}
}
init_timer(&dev->vidq[chan_num].timeout);
cx25821_risc_stopper(dev->pci, &dev->vidq[chan_num].stopper, dev->sram_channels[chan_num].dma_ctl, 0x11, 0);
-
+
/* register v4l devices */
dev->video_dev[chan_num] = cx25821_vdev_init(dev, dev->pci, video_template, "video");
err = video_register_device(dev->video_dev[chan_num], VFL_TYPE_GRABBER, video_nr[dev->nr]);
if (err < 0) {
- goto fail_unreg;
+ goto fail_unreg;
}
//set PCI interrupt
if (0 == *count)
- *count = 32;
+ *count = 32;
while (*size * *count > vid_limit * 1024 * 1024)
- (*count)--;
+ (*count)--;
return 0;
}
BUG_ON(NULL == fh->fmt);
if (fh->width < 48 || fh->width > 720 ||
- fh->height < 32 || fh->height > 576)
- return -EINVAL;
+ fh->height < 32 || fh->height > 576)
+ return -EINVAL;
buf->vb.size = (fh->width * fh->height * fh->fmt->depth) >> 3;
if (0 != buf->vb.baddr && buf->vb.bsize < buf->vb.size)
- return -EINVAL;
+ return -EINVAL;
if (buf->fmt != fh->fmt ||
- buf->vb.width != fh->width ||
- buf->vb.height != fh->height ||
- buf->vb.field != field) {
- buf->fmt = fh->fmt;
- buf->vb.width = fh->width;
- buf->vb.height = fh->height;
- buf->vb.field = field;
- init_buffer = 1;
+ buf->vb.width != fh->width ||
+ buf->vb.height != fh->height ||
+ buf->vb.field != field) {
+ buf->fmt = fh->fmt;
+ buf->vb.width = fh->width;
+ buf->vb.height = fh->height;
+ buf->vb.field = field;
+ init_buffer = 1;
}
if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
- init_buffer = 1;
- rc = videobuf_iolock(q, &buf->vb, NULL);
- if (0 != rc)
- {
- printk(KERN_DEBUG "videobuf_iolock failed!\n");
- goto fail;
- }
+ init_buffer = 1;
+ rc = videobuf_iolock(q, &buf->vb, NULL);
+ if (0 != rc)
+ {
+ printk(KERN_DEBUG "videobuf_iolock failed!\n");
+ goto fail;
+ }
}
dprintk(1, "init_buffer=%d\n", init_buffer);
if (init_buffer) {
-
- channel_opened = dev->channel_opened;
- channel_opened = (channel_opened < 0 || channel_opened > 7) ? 7 : channel_opened;
-
- if( dev->pixel_formats[channel_opened] == PIXEL_FRMT_411 )
- buf->bpl = (buf->fmt->depth * buf->vb.width) >> 3;
- else
- buf->bpl = (buf->fmt->depth >> 3) * (buf->vb.width);
-
-
- if( dev->pixel_formats[channel_opened] == PIXEL_FRMT_411 )
- {
- bpl_local = buf->bpl;
- }
- else
- {
- bpl_local = buf->bpl; //Default
-
- if( channel_opened >= 0 && channel_opened <= 7 )
- {
- if( dev->use_cif_resolution[channel_opened] )
- {
- if( dev->tvnorm & V4L2_STD_PAL_BG || dev->tvnorm & V4L2_STD_PAL_DK )
- bpl_local = 352 << 1;
- else
- bpl_local = dev->cif_width[channel_opened] << 1;
- }
- }
- }
-
-
- switch (buf->vb.field) {
- case V4L2_FIELD_TOP:
- cx25821_risc_buffer(dev->pci, &buf->risc,
- dma->sglist, 0, UNSET,
- buf->bpl, 0, buf->vb.height);
- break;
- case V4L2_FIELD_BOTTOM:
- cx25821_risc_buffer(dev->pci, &buf->risc,
- dma->sglist, UNSET, 0,
- buf->bpl, 0, buf->vb.height);
- break;
- case V4L2_FIELD_INTERLACED:
- /* All other formats are top field first */
- line0_offset = 0;
- line1_offset = buf->bpl;
- dprintk(1, "top field first\n");
-
- cx25821_risc_buffer(dev->pci, &buf->risc,
- dma->sglist, line0_offset,
- bpl_local, bpl_local, bpl_local,
- buf->vb.height >> 1);
- break;
- case V4L2_FIELD_SEQ_TB:
- cx25821_risc_buffer(dev->pci, &buf->risc,
- dma->sglist,
- 0, buf->bpl * (buf->vb.height >> 1),
- buf->bpl, 0,
- buf->vb.height >> 1);
- break;
- case V4L2_FIELD_SEQ_BT:
- cx25821_risc_buffer(dev->pci, &buf->risc,
- dma->sglist,
- buf->bpl * (buf->vb.height >> 1), 0,
- buf->bpl, 0,
- buf->vb.height >> 1);
- break;
- default:
- BUG();
- }
+
+ channel_opened = dev->channel_opened;
+ channel_opened = (channel_opened < 0 || channel_opened > 7) ? 7 : channel_opened;
+
+ if( dev->pixel_formats[channel_opened] == PIXEL_FRMT_411 )
+ buf->bpl = (buf->fmt->depth * buf->vb.width) >> 3;
+ else
+ buf->bpl = (buf->fmt->depth >> 3) * (buf->vb.width);
+
+
+ if( dev->pixel_formats[channel_opened] == PIXEL_FRMT_411 )
+ {
+ bpl_local = buf->bpl;
+ }
+ else
+ {
+ bpl_local = buf->bpl; //Default
+
+ if( channel_opened >= 0 && channel_opened <= 7 )
+ {
+ if( dev->use_cif_resolution[channel_opened] )
+ {
+ if( dev->tvnorm & V4L2_STD_PAL_BG || dev->tvnorm & V4L2_STD_PAL_DK )
+ bpl_local = 352 << 1;
+ else
+ bpl_local = dev->cif_width[channel_opened] << 1;
+ }
+ }
+ }
+
+
+ switch (buf->vb.field) {
+ case V4L2_FIELD_TOP:
+ cx25821_risc_buffer(dev->pci, &buf->risc,
+ dma->sglist, 0, UNSET,
+ buf->bpl, 0, buf->vb.height);
+ break;
+ case V4L2_FIELD_BOTTOM:
+ cx25821_risc_buffer(dev->pci, &buf->risc,
+ dma->sglist, UNSET, 0,
+ buf->bpl, 0, buf->vb.height);
+ break;
+ case V4L2_FIELD_INTERLACED:
+ /* All other formats are top field first */
+ line0_offset = 0;
+ line1_offset = buf->bpl;
+ dprintk(1, "top field first\n");
+
+ cx25821_risc_buffer(dev->pci, &buf->risc,
+ dma->sglist, line0_offset,
+ bpl_local, bpl_local, bpl_local,
+ buf->vb.height >> 1);
+ break;
+ case V4L2_FIELD_SEQ_TB:
+ cx25821_risc_buffer(dev->pci, &buf->risc,
+ dma->sglist,
+ 0, buf->bpl * (buf->vb.height >> 1),
+ buf->bpl, 0,
+ buf->vb.height >> 1);
+ break;
+ case V4L2_FIELD_SEQ_BT:
+ cx25821_risc_buffer(dev->pci, &buf->risc,
+ dma->sglist,
+ buf->bpl * (buf->vb.height >> 1), 0,
+ buf->bpl, 0,
+ buf->vb.height >> 1);
+ break;
+ default:
+ BUG();
+ }
}
dprintk(2, "[%p/%d] buffer_prep - %dx%d %dbpp \"%s\" - dma=0x%08lx\n",
- buf, buf->vb.i, fh->width, fh->height, fh->fmt->depth, fh->fmt->name,
- (unsigned long)buf->risc.dma);
+ buf, buf->vb.i, fh->width, fh->height, fh->fmt->depth, fh->fmt->name,
+ (unsigned long)buf->risc.dma);
buf->vb.state = VIDEOBUF_PREPARED;
{
switch (fh->type) {
case V4L2_BUF_TYPE_VIDEO_CAPTURE:
- return &fh->vidq;
+ return &fh->vidq;
default:
- BUG();
- return NULL;
+ BUG();
+ return NULL;
}
}
{
switch (fh->type) {
case V4L2_BUF_TYPE_VIDEO_CAPTURE:
- return resource;
+ return resource;
default:
- BUG();
- return 0;
+ BUG();
+ return 0;
}
}
fmt = format_by_fourcc(f->fmt.pix.pixelformat);
if (NULL == fmt)
- return -EINVAL;
+ return -EINVAL;
field = f->fmt.pix.field;
maxw = 720;
maxh = 576;
if (V4L2_FIELD_ANY == field) {
- field = (f->fmt.pix.height > maxh/2)
- ? V4L2_FIELD_INTERLACED
- : V4L2_FIELD_TOP;
+ field = (f->fmt.pix.height > maxh/2)
+ ? V4L2_FIELD_INTERLACED
+ : V4L2_FIELD_TOP;
}
switch (field) {
case V4L2_FIELD_TOP:
case V4L2_FIELD_BOTTOM:
- maxh = maxh / 2;
- break;
+ maxh = maxh / 2;
+ break;
case V4L2_FIELD_INTERLACED:
- break;
+ break;
default:
- return -EINVAL;
+ return -EINVAL;
}
f->fmt.pix.field = field;
if (f->fmt.pix.height < 32)
- f->fmt.pix.height = 32;
+ f->fmt.pix.height = 32;
if (f->fmt.pix.height > maxh)
- f->fmt.pix.height = maxh;
+ f->fmt.pix.height = maxh;
if (f->fmt.pix.width < 48)
- f->fmt.pix.width = 48;
+ f->fmt.pix.width = 48;
if (f->fmt.pix.width > maxw)
- f->fmt.pix.width = maxw;
+ f->fmt.pix.width = maxw;
f->fmt.pix.width &= ~0x03;
f->fmt.pix.bytesperline = (f->fmt.pix.width * fmt->depth) >> 3;
f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
sprintf(cap->bus_info, "PCIe:%s", pci_name(dev->pci));
cap->version = CX25821_VERSION_CODE;
cap->capabilities =
- V4L2_CAP_VIDEO_CAPTURE |
- V4L2_CAP_READWRITE |
- V4L2_CAP_STREAMING;
+ V4L2_CAP_VIDEO_CAPTURE |
+ V4L2_CAP_READWRITE |
+ V4L2_CAP_STREAMING;
if (UNSET != dev->tuner_type)
- cap->capabilities |= V4L2_CAP_TUNER;
+ cap->capabilities |= V4L2_CAP_TUNER;
return 0;
}
int vidioc_enum_fmt_vid_cap(struct file *file, void *priv, struct v4l2_fmtdesc *f)
{
if (unlikely(f->index >= ARRAY_SIZE(formats)))
- return -EINVAL;
+ return -EINVAL;
strlcpy(f->description, formats[f->index].name, sizeof(f->description));
f->pixelformat = formats[f->index].fourcc;
req.memory = V4L2_MEMORY_MMAP;
err = videobuf_reqbufs(q, &req);
if (err < 0)
- return err;
+ return err;
mbuf->frames = req.count;
mbuf->size = 0;
for (i = 0; i < mbuf->frames; i++) {
- mbuf->offsets[i] = q->bufs[i]->boff;
- mbuf->size += q->bufs[i]->bsize;
+ mbuf->offsets[i] = q->bufs[i]->boff;
+ mbuf->size += q->bufs[i]->bsize;
}
return 0;
}
int err;
dprintk(1, "%s()\n", __func__);
-
- if (fh)
+
+ if (fh)
{
- err = v4l2_prio_check(&dev->prio, &fh->prio);
- if (0 != err)
- return err;
+ err = v4l2_prio_check(&dev->prio, &fh->prio);
+ if (0 != err)
+ return err;
}
if( dev->tvnorm == *tvnorms )
{
- return 0;
+ return 0;
}
mutex_lock(&dev->lock);
int cx25821_enum_input(struct cx25821_dev *dev, struct v4l2_input *i)
{
static const char *iname[] = {
- [CX25821_VMUX_COMPOSITE] = "Composite",
- [CX25821_VMUX_SVIDEO] = "S-Video",
- [CX25821_VMUX_DEBUG] = "for debug only",
+ [CX25821_VMUX_COMPOSITE] = "Composite",
+ [CX25821_VMUX_SVIDEO] = "S-Video",
+ [CX25821_VMUX_DEBUG] = "for debug only",
};
unsigned int n;
dprintk(1, "%s()\n", __func__);
n = i->index;
if (n > 2)
- return -EINVAL;
+ return -EINVAL;
if (0 == INPUT(n)->type)
- return -EINVAL;
+ return -EINVAL;
memset(i, 0, sizeof(*i));
i->index = n;
}
int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
-{
+{
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
-
+
*i = dev->input;
dprintk(1, "%s() returns %d\n", __func__, *i);
return 0;
dprintk(1, "%s(%d)\n", __func__, i);
- if (fh)
+ if (fh)
{
- err = v4l2_prio_check(&dev->prio, &fh->prio);
- if (0 != err)
- return err;
+ err = v4l2_prio_check(&dev->prio, &fh->prio);
+ if (0 != err)
+ return err;
}
if (i > 2) {
- dprintk(1, "%s() -EINVAL\n", __func__);
- return -EINVAL;
+ dprintk(1, "%s() -EINVAL\n", __func__);
+ return -EINVAL;
}
mutex_lock(&dev->lock);
struct cx25821_dev *dev = fh->dev;
int err;
- if (fh)
+ if (fh)
{
- err = v4l2_prio_check(&dev->prio, &fh->prio);
- if (0 != err)
- return err;
+ err = v4l2_prio_check(&dev->prio, &fh->prio);
+ if (0 != err)
+ return err;
}
return cx25821_set_freq(dev, f);
#ifdef CONFIG_VIDEO_ADV_DEBUG
int vidioc_g_register(struct file *file, void *fh,
- struct v4l2_dbg_register *reg)
+ struct v4l2_dbg_register *reg)
{
struct cx25821_dev *dev = ((struct cx25821_fh *)fh)->dev;
if (!v4l2_chip_match_host(®->match))
- return -EINVAL;
+ return -EINVAL;
cx25821_call_all(dev, core, g_register, reg);
}
int vidioc_s_register(struct file *file, void *fh,
- struct v4l2_dbg_register *reg)
+ struct v4l2_dbg_register *reg)
{
struct cx25821_dev *dev = ((struct cx25821_fh *)fh)->dev;
if (!v4l2_chip_match_host(®->match))
- return -EINVAL;
+ return -EINVAL;
cx25821_call_all(dev, core, s_register, reg);
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
if (unlikely(UNSET == dev->tuner_type))
- return -EINVAL;
+ return -EINVAL;
if (0 != t->index)
- return -EINVAL;
+ return -EINVAL;
strcpy(t->name, "Television");
t->type = V4L2_TUNER_ANALOG_TV;
}
int vidioc_s_tuner(struct file *file, void *priv,
- struct v4l2_tuner *t)
+ struct v4l2_tuner *t)
{
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
struct cx25821_fh *fh = priv;
int err;
- if (fh)
+ if (fh)
{
- err = v4l2_prio_check(&dev->prio, &fh->prio);
- if (0 != err)
- return err;
+ err = v4l2_prio_check(&dev->prio, &fh->prio);
+ if (0 != err)
+ return err;
}
dprintk(1, "%s()\n", __func__);
if (UNSET == dev->tuner_type)
- return -EINVAL;
+ return -EINVAL;
if (0 != t->index)
- return -EINVAL;
+ return -EINVAL;
return 0;
}
int vidioc_queryctrl(struct file *file, void *priv,
struct v4l2_queryctrl *qctrl)
-{
+{
return cx25821_ctrl_query(qctrl);
}
return NULL;
}
-int vidioc_g_ctrl(struct file *file,
- void *priv,
+int vidioc_g_ctrl(struct file *file,
+ void *priv,
struct v4l2_control *ctl)
{
- struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
+ struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
- const struct v4l2_queryctrl* ctrl;
+ const struct v4l2_queryctrl* ctrl;
ctrl = ctrl_by_id(ctl->id);
if (NULL == ctrl)
return -EINVAL;
- switch (ctl->id)
- {
+ switch (ctl->id)
+ {
case V4L2_CID_BRIGHTNESS:
ctl->value = dev->ctl_bright;
break;
case V4L2_CID_SATURATION:
ctl->value = dev->ctl_saturation;
break;
- }
+ }
return 0;
}
int cx25821_set_control(struct cx25821_dev *dev,
struct v4l2_control *ctl, int chan_num)
{
- int err;
- const struct v4l2_queryctrl* ctrl;
+ int err;
+ const struct v4l2_queryctrl* ctrl;
- err = -EINVAL;
+ err = -EINVAL;
ctrl = ctrl_by_id(ctl->id);
- if (NULL == ctrl)
+ if (NULL == ctrl)
return err;
- switch (ctrl->type)
- {
+ switch (ctrl->type)
+ {
case V4L2_CTRL_TYPE_BOOLEAN:
case V4L2_CTRL_TYPE_MENU:
case V4L2_CTRL_TYPE_INTEGER:
/* nothing */;
};
- switch (ctl->id)
- {
+ switch (ctl->id)
+ {
case V4L2_CID_BRIGHTNESS:
dev->ctl_bright = ctl->value;
medusa_set_brightness(dev, ctl->value, chan_num);
dev->ctl_saturation = ctl->value;
medusa_set_saturation(dev, ctl->value, chan_num);
break;
- }
+ }
- err = 0;
+ err = 0;
return err;
}
}
}
-int vidioc_cropcap(struct file *file,
- void *priv,
+int vidioc_cropcap(struct file *file,
+ void *priv,
struct v4l2_cropcap *cropcap)
{
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
-
+
if (cropcap->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
return -EINVAL;
cropcap->bounds.top = cropcap->bounds.left = 0;
return 0;
}
-int vidioc_s_crop(struct file *file,
- void *priv,
+int vidioc_s_crop(struct file *file,
+ void *priv,
struct v4l2_crop *crop)
{
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
struct cx25821_fh *fh = priv;
int err;
- if (fh)
+ if (fh)
{
- err = v4l2_prio_check(&dev->prio, &fh->prio);
- if (0 != err)
- return err;
+ err = v4l2_prio_check(&dev->prio, &fh->prio);
+ if (0 != err)
+ return err;
}
// vidioc_s_crop not supported
return -EINVAL;
}
-int vidioc_g_crop(struct file *file,
- void *priv,
+int vidioc_g_crop(struct file *file,
+ void *priv,
struct v4l2_crop *crop)
{
// vidioc_g_crop not supported
return -EINVAL;
}
-int vidioc_querystd(struct file *file,
- void *priv,
+int vidioc_querystd(struct file *file,
+ void *priv,
v4l2_std_id *norm)
{
// medusa does not support video standard sensing of current input
if(tvnorm == V4L2_STD_PAL_BG)
{
if (width == 352 || width == 720)
- return 1;
- else
- return 0;
+ return 1;
+ else
+ return 0;
}
-
+
if(tvnorm == V4L2_STD_NTSC_M)
{
- if (width == 320 || width == 352 || width == 720)
- return 1;
- else
- return 0;
+ if (width == 320 || width == 352 || width == 720)
+ return 1;
+ else
+ return 0;
}
return 0;
}
int is_valid_height(u32 height, v4l2_std_id tvnorm)
{
if(tvnorm == V4L2_STD_PAL_BG)
- {
- if (height == 576 || height == 288)
- return 1;
- else
- return 0;
+ {
+ if (height == 576 || height == 288)
+ return 1;
+ else
+ return 0;
}
if(tvnorm == V4L2_STD_NTSC_M)
{
- if (height == 480 || height == 240)
- return 1;
- else
- return 0;
+ if (height == 480 || height == 240)
+ return 1;
+ else
+ return 0;
}
return 0;
/*
* Driver for the Conexant CX25821 PCIe bridge
*
- * Copyright (C) 2009 Conexant Systems Inc.
+ * Copyright (C) 2009 Conexant Systems Inc.
* Authors <shu.lin@conexant.com>, <hiep.huynh@conexant.com>
* Based on Steven Toth <stoth@linuxtv.org> cx23885 driver
*
#define dprintk(level, fmt, arg...)\
do { if (VIDEO_DEBUG >= level)\
- printk(KERN_DEBUG "%s/0: " fmt, dev->name, ## arg);\
+ printk(KERN_DEBUG "%s/0: " fmt, dev->name, ## arg);\
} while (0)
extern void res_free(struct cx25821_dev *dev, struct cx25821_fh *fh, unsigned int bits);
extern int cx25821_video_mux(struct cx25821_dev *dev, unsigned int input);
extern int cx25821_start_video_dma(struct cx25821_dev *dev,
- struct cx25821_dmaqueue *q,
- struct cx25821_buffer *buf,
- struct sram_channel *channel);
+ struct cx25821_dmaqueue *q,
+ struct cx25821_buffer *buf,
+ struct sram_channel *channel);
extern int cx25821_set_scale(struct cx25821_dev *dev, unsigned int width, unsigned int height, enum v4l2_field field);
extern int cx25821_video_irq(struct cx25821_dev *dev, int chan_num, u32 status);
/*
* Driver for the Conexant CX25821 PCIe bridge
*
- * Copyright (C) 2009 Conexant Systems Inc.
+ * Copyright (C) 2009 Conexant Systems Inc.
* Authors <shu.lin@conexant.com>, <hiep.huynh@conexant.com>
* Based on Steven Toth <stoth@linuxtv.org> cx23885 driver
*
dprintk(2, "jmp to stopper (0x%x)\n", buf->risc.jmp[1]);
if (!list_empty(&q->queued)) {
- list_add_tail(&buf->vb.queue, &q->queued);
- buf->vb.state = VIDEOBUF_QUEUED;
- dprintk(2, "[%p/%d] buffer_queue - append to queued\n", buf, buf->vb.i);
+ list_add_tail(&buf->vb.queue, &q->queued);
+ buf->vb.state = VIDEOBUF_QUEUED;
+ dprintk(2, "[%p/%d] buffer_queue - append to queued\n", buf, buf->vb.i);
} else if (list_empty(&q->active)) {
- list_add_tail(&buf->vb.queue, &q->active);
- cx25821_start_video_dma(dev, q, buf, &dev->sram_channels[SRAM_CH00]);
- buf->vb.state = VIDEOBUF_ACTIVE;
- buf->count = q->count++;
- mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
- dprintk(2, "[%p/%d] buffer_queue - first active, buf cnt = %d, q->count = %d\n",
- buf, buf->vb. i, buf->count, q->count);
+ list_add_tail(&buf->vb.queue, &q->active);
+ cx25821_start_video_dma(dev, q, buf, &dev->sram_channels[SRAM_CH00]);
+ buf->vb.state = VIDEOBUF_ACTIVE;
+ buf->count = q->count++;
+ mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
+ dprintk(2, "[%p/%d] buffer_queue - first active, buf cnt = %d, q->count = %d\n",
+ buf, buf->vb. i, buf->count, q->count);
} else {
- prev = list_entry(q->active.prev, struct cx25821_buffer, vb.queue);
- if (prev->vb.width == buf->vb.width &&
- prev->vb.height == buf->vb.height &&
- prev->fmt == buf->fmt) {
- list_add_tail(&buf->vb.queue, &q->active);
- buf->vb.state = VIDEOBUF_ACTIVE;
- buf->count = q->count++;
- prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
-
- /* 64 bit bits 63-32 */
- prev->risc.jmp[2] = cpu_to_le32(0);
- dprintk(2, "[%p/%d] buffer_queue - append to active, buf->count=%d\n", buf, buf->vb.i, buf->count);
-
- } else {
- list_add_tail(&buf->vb.queue, &q->queued);
- buf->vb.state = VIDEOBUF_QUEUED;
- dprintk(2, "[%p/%d] buffer_queue - first queued\n", buf, buf->vb.i);
- }
+ prev = list_entry(q->active.prev, struct cx25821_buffer, vb.queue);
+ if (prev->vb.width == buf->vb.width &&
+ prev->vb.height == buf->vb.height &&
+ prev->fmt == buf->fmt) {
+ list_add_tail(&buf->vb.queue, &q->active);
+ buf->vb.state = VIDEOBUF_ACTIVE;
+ buf->count = q->count++;
+ prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
+
+ /* 64 bit bits 63-32 */
+ prev->risc.jmp[2] = cpu_to_le32(0);
+ dprintk(2, "[%p/%d] buffer_queue - append to active, buf->count=%d\n", buf, buf->vb.i, buf->count);
+
+ } else {
+ list_add_tail(&buf->vb.queue, &q->queued);
+ buf->vb.state = VIDEOBUF_QUEUED;
+ dprintk(2, "[%p/%d] buffer_queue - first queued\n", buf, buf->vb.i);
+ }
}
if (list_empty(&q->active))
lock_kernel();
list_for_each(list, &cx25821_devlist)
{
- h = list_entry(list, struct cx25821_dev, devlist);
+ h = list_entry(list, struct cx25821_dev, devlist);
- if (h->video_dev[SRAM_CH00] && h->video_dev[SRAM_CH00]->minor == minor)
- {
- dev = h;
- type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- }
+ if (h->video_dev[SRAM_CH00] && h->video_dev[SRAM_CH00]->minor == minor)
+ {
+ dev = h;
+ type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ }
}
if (NULL == dev) {
- unlock_kernel();
- return -ENODEV;
+ unlock_kernel();
+ return -ENODEV;
}
printk("open minor=%d type=%s\n", minor, v4l2_type_names[type]);
/* allocate + initialize per filehandle data */
fh = kzalloc(sizeof(*fh), GFP_KERNEL);
if (NULL == fh) {
- unlock_kernel();
- return -ENOMEM;
+ unlock_kernel();
+ return -ENOMEM;
}
file->private_data = fh;
fh->width = 720;
if(dev->tvnorm & V4L2_STD_PAL_BG || dev->tvnorm & V4L2_STD_PAL_DK)
- fh->height = 576;
+ fh->height = 576;
else
- fh->height = 480;
+ fh->height = 480;
dev->channel_opened = SRAM_CH00;
pix_format = (dev->pixel_formats[dev->channel_opened] == PIXEL_FRMT_411) ? V4L2_PIX_FMT_Y41P : V4L2_PIX_FMT_YUYV;
fh->fmt = format_by_fourcc(pix_format);
-
+
v4l2_prio_open(&dev->prio,&fh->prio);
videobuf_queue_sg_init(&fh->vidq, &cx25821_video_qops,
- &dev->pci->dev, &dev->slock,
- V4L2_BUF_TYPE_VIDEO_CAPTURE,
- V4L2_FIELD_INTERLACED,
- sizeof(struct cx25821_buffer),
- fh);
+ &dev->pci->dev, &dev->slock,
+ V4L2_BUF_TYPE_VIDEO_CAPTURE,
+ V4L2_FIELD_INTERLACED,
+ sizeof(struct cx25821_buffer),
+ fh);
dprintk(1, "post videobuf_queue_init()\n");
unlock_kernel();
switch (fh->type)
{
- case V4L2_BUF_TYPE_VIDEO_CAPTURE:
- if (res_locked(fh->dev, RESOURCE_VIDEO0))
- return -EBUSY;
+ case V4L2_BUF_TYPE_VIDEO_CAPTURE:
+ if (res_locked(fh->dev, RESOURCE_VIDEO0))
+ return -EBUSY;
- return videobuf_read_one(&fh->vidq, data, count, ppos, file->f_flags & O_NONBLOCK);
+ return videobuf_read_one(&fh->vidq, data, count, ppos, file->f_flags & O_NONBLOCK);
- default:
- BUG();
- return 0;
+ default:
+ BUG();
+ return 0;
}
}
struct cx25821_buffer *buf;
if (res_check(fh, RESOURCE_VIDEO0)) {
- /* streaming capture */
- if (list_empty(&fh->vidq.stream))
- return POLLERR;
- buf = list_entry(fh->vidq.stream.next,
- struct cx25821_buffer, vb.stream);
+ /* streaming capture */
+ if (list_empty(&fh->vidq.stream))
+ return POLLERR;
+ buf = list_entry(fh->vidq.stream.next,
+ struct cx25821_buffer, vb.stream);
} else {
- /* read() capture */
- buf = (struct cx25821_buffer *)fh->vidq.read_buf;
- if (NULL == buf)
- return POLLERR;
+ /* read() capture */
+ buf = (struct cx25821_buffer *)fh->vidq.read_buf;
+ if (NULL == buf)
+ return POLLERR;
}
poll_wait(file, &buf->vb.done, wait);
if (buf->vb.state == VIDEOBUF_DONE || buf->vb.state == VIDEOBUF_ERROR)
- {
- if( buf->vb.state == VIDEOBUF_DONE )
- {
- struct cx25821_dev *dev = fh->dev;
-
- if( dev && dev->use_cif_resolution[SRAM_CH00] )
- {
- u8 cam_id = *((char*)buf->vb.baddr+3);
- memcpy((char*)buf->vb.baddr, (char*)buf->vb.baddr + (fh->width * 2), (fh->width * 2));
- *((char*)buf->vb.baddr+3) = cam_id;
- }
- }
-
- return POLLIN|POLLRDNORM;
+ {
+ if( buf->vb.state == VIDEOBUF_DONE )
+ {
+ struct cx25821_dev *dev = fh->dev;
+
+ if( dev && dev->use_cif_resolution[SRAM_CH00] )
+ {
+ u8 cam_id = *((char*)buf->vb.baddr+3);
+ memcpy((char*)buf->vb.baddr, (char*)buf->vb.baddr + (fh->width * 2), (fh->width * 2));
+ *((char*)buf->vb.baddr+3) = cam_id;
+ }
+ }
+
+ return POLLIN|POLLRDNORM;
}
-
+
return 0;
}
/* stop video capture */
if (res_check(fh, RESOURCE_VIDEO0)) {
- videobuf_queue_cancel(&fh->vidq);
- res_free(dev, fh, RESOURCE_VIDEO0);
+ videobuf_queue_cancel(&fh->vidq);
+ res_free(dev, fh, RESOURCE_VIDEO0);
}
if (fh->vidq.read_buf) {
- buffer_release(&fh->vidq, fh->vidq.read_buf);
- kfree(fh->vidq.read_buf);
+ buffer_release(&fh->vidq, fh->vidq.read_buf);
+ kfree(fh->vidq.read_buf);
}
videobuf_mmap_free(&fh->vidq);
if (unlikely(fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE))
{
- return -EINVAL;
+ return -EINVAL;
}
if (unlikely(i != fh->type))
{
- return -EINVAL;
+ return -EINVAL;
}
if (unlikely(!res_get(dev, fh, get_resource(fh, RESOURCE_VIDEO0))))
{
- return -EBUSY;
+ return -EBUSY;
}
return videobuf_streamon(get_queue(fh));
int err, res;
if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
- return -EINVAL;
+ return -EINVAL;
if (i != fh->type)
- return -EINVAL;
+ return -EINVAL;
res = get_resource(fh, RESOURCE_VIDEO0);
err = videobuf_streamoff(get_queue(fh));
if (err < 0)
- return err;
+ return err;
res_free(dev, fh, res);
return 0;
}
{
struct cx25821_fh *fh = priv;
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
- int err;
+ int err;
int pix_format = PIXEL_FRMT_422;
-
- if (fh)
+
+ if (fh)
{
- err = v4l2_prio_check(&dev->prio, &fh->prio);
- if (0 != err)
- return err;
+ err = v4l2_prio_check(&dev->prio, &fh->prio);
+ if (0 != err)
+ return err;
}
dprintk(2, "%s()\n", __func__);
err = vidioc_try_fmt_vid_cap(file, priv, f);
if (0 != err)
- return err;
+ return err;
fh->fmt = format_by_fourcc(f->fmt.pix.pixelformat);
fh->vidq.field = f->fmt.pix.field;
// check if width and height is valid based on set standard
if (is_valid_width(f->fmt.pix.width, dev->tvnorm))
{
- fh->width = f->fmt.pix.width;
+ fh->width = f->fmt.pix.width;
}
if (is_valid_height(f->fmt.pix.height, dev->tvnorm))
{
- fh->height = f->fmt.pix.height;
+ fh->height = f->fmt.pix.height;
}
if (f->fmt.pix.pixelformat == V4L2_PIX_FMT_Y41P)
pix_format = PIXEL_FRMT_411;
else if (f->fmt.pix.pixelformat == V4L2_PIX_FMT_YUYV)
- pix_format = PIXEL_FRMT_422;
+ pix_format = PIXEL_FRMT_422;
else
- return -EINVAL;
+ return -EINVAL;
+
+ cx25821_set_pixel_format( dev, SRAM_CH00, pix_format );
- cx25821_set_pixel_format( dev, SRAM_CH00, pix_format );
-
// check if cif resolution
if (fh->width == 320 || fh->width == 352)
{
- dev->use_cif_resolution[SRAM_CH00] = 1;
+ dev->use_cif_resolution[SRAM_CH00] = 1;
}else
{
- dev->use_cif_resolution[SRAM_CH00] = 0;
+ dev->use_cif_resolution[SRAM_CH00] = 0;
}
dev->cif_width[SRAM_CH00] = fh->width;
- medusa_set_resolution( dev, fh->width, SRAM_CH00 );
+ medusa_set_resolution( dev, fh->width, SRAM_CH00 );
dprintk(2, "%s() width=%d height=%d field=%d\n", __func__, fh->width, fh->height, fh->vidq.field);
cx25821_call_all(dev, video, s_fmt, f);
struct cx25821_fh *fh = priv;
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
- ret_val = videobuf_dqbuf(get_queue(fh), p, file->f_flags & O_NONBLOCK);
+ ret_val = videobuf_dqbuf(get_queue(fh), p, file->f_flags & O_NONBLOCK);
p->sequence = dev->vidq[SRAM_CH00].count;
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
char name[32 + 2];
- struct sram_channel *sram_ch = &dev->sram_channels[SRAM_CH00];
+ struct sram_channel *sram_ch = &dev->sram_channels[SRAM_CH00];
u32 tmp = 0;
snprintf(name, sizeof(name), "%s/2", dev->name);
struct v4l2_control *ctl)
{
struct cx25821_fh *fh = priv;
- struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
- int err;
+ struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
+ int err;
- if (fh) {
+ if (fh) {
err = v4l2_prio_check(&dev->prio, &fh->prio);
if (0 != err)
return err;
.read = video_read,
.poll = video_poll,
.mmap = video_mmap,
- .ioctl = video_ioctl2,
+ .ioctl = video_ioctl2,
};
static const struct v4l2_ioctl_ops video_ioctl_ops = {
/*
* Driver for the Conexant CX25821 PCIe bridge
*
- * Copyright (C) 2009 Conexant Systems Inc.
+ * Copyright (C) 2009 Conexant Systems Inc.
* Authors <shu.lin@conexant.com>, <hiep.huynh@conexant.com>
* Based on Steven Toth <stoth@linuxtv.org> cx23885 driver
*
dprintk(2, "jmp to stopper (0x%x)\n", buf->risc.jmp[1]);
if (!list_empty(&q->queued)) {
- list_add_tail(&buf->vb.queue, &q->queued);
- buf->vb.state = VIDEOBUF_QUEUED;
- dprintk(2, "[%p/%d] buffer_queue - append to queued\n", buf, buf->vb.i);
+ list_add_tail(&buf->vb.queue, &q->queued);
+ buf->vb.state = VIDEOBUF_QUEUED;
+ dprintk(2, "[%p/%d] buffer_queue - append to queued\n", buf, buf->vb.i);
} else if (list_empty(&q->active)) {
- list_add_tail(&buf->vb.queue, &q->active);
- cx25821_start_video_dma(dev, q, buf, &dev->sram_channels[SRAM_CH01]);
- buf->vb.state = VIDEOBUF_ACTIVE;
- buf->count = q->count++;
- mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
- dprintk(2, "[%p/%d] buffer_queue - first active, buf cnt = %d, q->count = %d\n",
- buf, buf->vb. i, buf->count, q->count);
+ list_add_tail(&buf->vb.queue, &q->active);
+ cx25821_start_video_dma(dev, q, buf, &dev->sram_channels[SRAM_CH01]);
+ buf->vb.state = VIDEOBUF_ACTIVE;
+ buf->count = q->count++;
+ mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
+ dprintk(2, "[%p/%d] buffer_queue - first active, buf cnt = %d, q->count = %d\n",
+ buf, buf->vb. i, buf->count, q->count);
} else {
- prev = list_entry(q->active.prev, struct cx25821_buffer, vb.queue);
- if (prev->vb.width == buf->vb.width &&
- prev->vb.height == buf->vb.height &&
- prev->fmt == buf->fmt) {
- list_add_tail(&buf->vb.queue, &q->active);
- buf->vb.state = VIDEOBUF_ACTIVE;
- buf->count = q->count++;
- prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
-
- /* 64 bit bits 63-32 */
- prev->risc.jmp[2] = cpu_to_le32(0);
- dprintk(2, "[%p/%d] buffer_queue - append to active, buf->count=%d\n", buf, buf->vb.i, buf->count);
-
- } else {
- list_add_tail(&buf->vb.queue, &q->queued);
- buf->vb.state = VIDEOBUF_QUEUED;
- dprintk(2, "[%p/%d] buffer_queue - first queued\n", buf, buf->vb.i);
- }
+ prev = list_entry(q->active.prev, struct cx25821_buffer, vb.queue);
+ if (prev->vb.width == buf->vb.width &&
+ prev->vb.height == buf->vb.height &&
+ prev->fmt == buf->fmt) {
+ list_add_tail(&buf->vb.queue, &q->active);
+ buf->vb.state = VIDEOBUF_ACTIVE;
+ buf->count = q->count++;
+ prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
+
+ /* 64 bit bits 63-32 */
+ prev->risc.jmp[2] = cpu_to_le32(0);
+ dprintk(2, "[%p/%d] buffer_queue - append to active, buf->count=%d\n", buf, buf->vb.i, buf->count);
+
+ } else {
+ list_add_tail(&buf->vb.queue, &q->queued);
+ buf->vb.state = VIDEOBUF_QUEUED;
+ dprintk(2, "[%p/%d] buffer_queue - first queued\n", buf, buf->vb.i);
+ }
}
if (list_empty(&q->active))
lock_kernel();
list_for_each(list, &cx25821_devlist)
{
- h = list_entry(list, struct cx25821_dev, devlist);
+ h = list_entry(list, struct cx25821_dev, devlist);
- if (h->video_dev[SRAM_CH01] && h->video_dev[SRAM_CH01]->minor == minor) {
- dev = h;
- type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- }
+ if (h->video_dev[SRAM_CH01] && h->video_dev[SRAM_CH01]->minor == minor) {
+ dev = h;
+ type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ }
}
if (NULL == dev) {
- unlock_kernel();
- return -ENODEV;
+ unlock_kernel();
+ return -ENODEV;
}
printk("open minor=%d type=%s\n", minor, v4l2_type_names[type]);
/* allocate + initialize per filehandle data */
fh = kzalloc(sizeof(*fh), GFP_KERNEL);
if (NULL == fh) {
- unlock_kernel();
- return -ENOMEM;
+ unlock_kernel();
+ return -ENOMEM;
}
file->private_data = fh;
fh->width = 720;
if(dev->tvnorm & V4L2_STD_PAL_BG || dev->tvnorm & V4L2_STD_PAL_DK)
- fh->height = 576;
+ fh->height = 576;
else
- fh->height = 480;
+ fh->height = 480;
dev->channel_opened = SRAM_CH01;
pix_format = (dev->pixel_formats[dev->channel_opened] == PIXEL_FRMT_411) ? V4L2_PIX_FMT_Y41P : V4L2_PIX_FMT_YUYV;
v4l2_prio_open(&dev->prio,&fh->prio);
videobuf_queue_sg_init(&fh->vidq, &cx25821_video_qops,
- &dev->pci->dev, &dev->slock,
- V4L2_BUF_TYPE_VIDEO_CAPTURE,
- V4L2_FIELD_INTERLACED,
- sizeof(struct cx25821_buffer),
- fh);
+ &dev->pci->dev, &dev->slock,
+ V4L2_BUF_TYPE_VIDEO_CAPTURE,
+ V4L2_FIELD_INTERLACED,
+ sizeof(struct cx25821_buffer),
+ fh);
dprintk(1, "post videobuf_queue_init()\n");
unlock_kernel();
switch (fh->type)
{
- case V4L2_BUF_TYPE_VIDEO_CAPTURE:
- if (res_locked(fh->dev, RESOURCE_VIDEO1))
- return -EBUSY;
+ case V4L2_BUF_TYPE_VIDEO_CAPTURE:
+ if (res_locked(fh->dev, RESOURCE_VIDEO1))
+ return -EBUSY;
- return videobuf_read_one(&fh->vidq, data, count, ppos, file->f_flags & O_NONBLOCK);
+ return videobuf_read_one(&fh->vidq, data, count, ppos, file->f_flags & O_NONBLOCK);
- default:
- BUG();
- return 0;
+ default:
+ BUG();
+ return 0;
}
}
struct cx25821_buffer *buf;
if (res_check(fh, RESOURCE_VIDEO1)) {
- /* streaming capture */
- if (list_empty(&fh->vidq.stream))
- return POLLERR;
- buf = list_entry(fh->vidq.stream.next,
- struct cx25821_buffer, vb.stream);
+ /* streaming capture */
+ if (list_empty(&fh->vidq.stream))
+ return POLLERR;
+ buf = list_entry(fh->vidq.stream.next,
+ struct cx25821_buffer, vb.stream);
} else {
- /* read() capture */
- buf = (struct cx25821_buffer *)fh->vidq.read_buf;
- if (NULL == buf)
- return POLLERR;
+ /* read() capture */
+ buf = (struct cx25821_buffer *)fh->vidq.read_buf;
+ if (NULL == buf)
+ return POLLERR;
}
poll_wait(file, &buf->vb.done, wait);
if (buf->vb.state == VIDEOBUF_DONE || buf->vb.state == VIDEOBUF_ERROR)
- {
- if( buf->vb.state == VIDEOBUF_DONE )
- {
- struct cx25821_dev *dev = fh->dev;
-
- if( dev && dev->use_cif_resolution[SRAM_CH01] )
- {
- u8 cam_id = *((char*)buf->vb.baddr+3);
- memcpy((char*)buf->vb.baddr, (char*)buf->vb.baddr + (fh->width * 2), (fh->width * 2));
- *((char*)buf->vb.baddr+3) = cam_id;
- }
- }
-
- return POLLIN|POLLRDNORM;
+ {
+ if( buf->vb.state == VIDEOBUF_DONE )
+ {
+ struct cx25821_dev *dev = fh->dev;
+
+ if( dev && dev->use_cif_resolution[SRAM_CH01] )
+ {
+ u8 cam_id = *((char*)buf->vb.baddr+3);
+ memcpy((char*)buf->vb.baddr, (char*)buf->vb.baddr + (fh->width * 2), (fh->width * 2));
+ *((char*)buf->vb.baddr+3) = cam_id;
+ }
+ }
+
+ return POLLIN|POLLRDNORM;
}
-
+
return 0;
}
/* stop video capture */
if (res_check(fh, RESOURCE_VIDEO1)) {
- videobuf_queue_cancel(&fh->vidq);
- res_free(dev, fh, RESOURCE_VIDEO1);
+ videobuf_queue_cancel(&fh->vidq);
+ res_free(dev, fh, RESOURCE_VIDEO1);
}
if (fh->vidq.read_buf) {
- buffer_release(&fh->vidq, fh->vidq.read_buf);
- kfree(fh->vidq.read_buf);
+ buffer_release(&fh->vidq, fh->vidq.read_buf);
+ kfree(fh->vidq.read_buf);
}
videobuf_mmap_free(&fh->vidq);
if (unlikely(fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE))
{
- return -EINVAL;
+ return -EINVAL;
}
if (unlikely(i != fh->type))
{
- return -EINVAL;
+ return -EINVAL;
}
if (unlikely(!res_get(dev, fh, get_resource(fh, RESOURCE_VIDEO1))))
{
- return -EBUSY;
+ return -EBUSY;
}
return videobuf_streamon(get_queue(fh));
int err, res;
if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
- return -EINVAL;
+ return -EINVAL;
if (i != fh->type)
- return -EINVAL;
+ return -EINVAL;
res = get_resource(fh, RESOURCE_VIDEO1);
err = videobuf_streamoff(get_queue(fh));
if (err < 0)
- return err;
+ return err;
res_free(dev, fh, res);
return 0;
}
{
struct cx25821_fh *fh = priv;
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
- int err;
+ int err;
int pix_format = 0;
-
- if (fh)
+
+ if (fh)
{
- err = v4l2_prio_check(&dev->prio, &fh->prio);
- if (0 != err)
- return err;
+ err = v4l2_prio_check(&dev->prio, &fh->prio);
+ if (0 != err)
+ return err;
}
dprintk(2, "%s()\n", __func__);
err = vidioc_try_fmt_vid_cap(file, priv, f);
if (0 != err)
- return err;
+ return err;
fh->fmt = format_by_fourcc(f->fmt.pix.pixelformat);
fh->vidq.field = f->fmt.pix.field;
// check if width and height is valid based on set standard
if (is_valid_width(f->fmt.pix.width, dev->tvnorm))
{
- fh->width = f->fmt.pix.width;
+ fh->width = f->fmt.pix.width;
}
if (is_valid_height(f->fmt.pix.height, dev->tvnorm))
{
- fh->height = f->fmt.pix.height;
+ fh->height = f->fmt.pix.height;
}
if (f->fmt.pix.pixelformat == V4L2_PIX_FMT_Y41P)
pix_format = PIXEL_FRMT_411;
else if (f->fmt.pix.pixelformat == V4L2_PIX_FMT_YUYV)
- pix_format = PIXEL_FRMT_422;
+ pix_format = PIXEL_FRMT_422;
else
- return -EINVAL;
+ return -EINVAL;
+
+ cx25821_set_pixel_format( dev, SRAM_CH01, pix_format );
- cx25821_set_pixel_format( dev, SRAM_CH01, pix_format );
-
// check if cif resolution
if (fh->width == 320 || fh->width == 352)
{
- dev->use_cif_resolution[SRAM_CH01] = 1;
+ dev->use_cif_resolution[SRAM_CH01] = 1;
}else
{
dev->use_cif_resolution[SRAM_CH01] = 0;
}
dev->cif_width[SRAM_CH01] = fh->width;
- medusa_set_resolution( dev, fh->width, SRAM_CH01 );
+ medusa_set_resolution( dev, fh->width, SRAM_CH01 );
dprintk(2, "%s() width=%d height=%d field=%d\n", __func__, fh->width, fh->height, fh->vidq.field);
cx25821_call_all(dev, video, s_fmt, f);
struct cx25821_fh *fh = priv;
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
- ret_val = videobuf_dqbuf(get_queue(fh), p, file->f_flags & O_NONBLOCK);
+ ret_val = videobuf_dqbuf(get_queue(fh), p, file->f_flags & O_NONBLOCK);
p->sequence = dev->vidq[SRAM_CH01].count;
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
char name[32 + 2];
- struct sram_channel *sram_ch = &dev->sram_channels[SRAM_CH01];
+ struct sram_channel *sram_ch = &dev->sram_channels[SRAM_CH01];
u32 tmp = 0;
snprintf(name, sizeof(name), "%s/2", dev->name);
struct v4l2_control *ctl)
{
struct cx25821_fh *fh = priv;
- struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
- int err;
+ struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
+ int err;
- if (fh) {
+ if (fh) {
err = v4l2_prio_check(&dev->prio, &fh->prio);
if (0 != err)
return err;
.read = video_read,
.poll = video_poll,
.mmap = video_mmap,
- .ioctl = video_ioctl2,
+ .ioctl = video_ioctl2,
};
static const struct v4l2_ioctl_ops video_ioctl_ops = {
/*
* Driver for the Conexant CX25821 PCIe bridge
*
- * Copyright (C) 2009 Conexant Systems Inc.
+ * Copyright (C) 2009 Conexant Systems Inc.
* Authors <shu.lin@conexant.com>, <hiep.huynh@conexant.com>
* Based on Steven Toth <stoth@linuxtv.org> cx23885 driver
*
dprintk(2, "jmp to stopper (0x%x)\n", buf->risc.jmp[1]);
if (!list_empty(&q->queued)) {
- list_add_tail(&buf->vb.queue, &q->queued);
- buf->vb.state = VIDEOBUF_QUEUED;
- dprintk(2, "[%p/%d] buffer_queue - append to queued\n", buf, buf->vb.i);
+ list_add_tail(&buf->vb.queue, &q->queued);
+ buf->vb.state = VIDEOBUF_QUEUED;
+ dprintk(2, "[%p/%d] buffer_queue - append to queued\n", buf, buf->vb.i);
} else if (list_empty(&q->active)) {
- list_add_tail(&buf->vb.queue, &q->active);
- cx25821_start_video_dma(dev, q, buf, &dev->sram_channels[SRAM_CH02]);
- buf->vb.state = VIDEOBUF_ACTIVE;
- buf->count = q->count++;
- mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
- dprintk(2, "[%p/%d] buffer_queue - first active, buf cnt = %d, q->count = %d\n",
- buf, buf->vb. i, buf->count, q->count);
+ list_add_tail(&buf->vb.queue, &q->active);
+ cx25821_start_video_dma(dev, q, buf, &dev->sram_channels[SRAM_CH02]);
+ buf->vb.state = VIDEOBUF_ACTIVE;
+ buf->count = q->count++;
+ mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
+ dprintk(2, "[%p/%d] buffer_queue - first active, buf cnt = %d, q->count = %d\n",
+ buf, buf->vb. i, buf->count, q->count);
} else {
- prev = list_entry(q->active.prev, struct cx25821_buffer, vb.queue);
- if (prev->vb.width == buf->vb.width &&
- prev->vb.height == buf->vb.height &&
- prev->fmt == buf->fmt) {
- list_add_tail(&buf->vb.queue, &q->active);
- buf->vb.state = VIDEOBUF_ACTIVE;
- buf->count = q->count++;
- prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
-
- /* 64 bit bits 63-32 */
- prev->risc.jmp[2] = cpu_to_le32(0);
- dprintk(2, "[%p/%d] buffer_queue - append to active, buf->count=%d\n", buf, buf->vb.i, buf->count);
-
- } else {
- list_add_tail(&buf->vb.queue, &q->queued);
- buf->vb.state = VIDEOBUF_QUEUED;
- dprintk(2, "[%p/%d] buffer_queue - first queued\n", buf, buf->vb.i);
- }
+ prev = list_entry(q->active.prev, struct cx25821_buffer, vb.queue);
+ if (prev->vb.width == buf->vb.width &&
+ prev->vb.height == buf->vb.height &&
+ prev->fmt == buf->fmt) {
+ list_add_tail(&buf->vb.queue, &q->active);
+ buf->vb.state = VIDEOBUF_ACTIVE;
+ buf->count = q->count++;
+ prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
+
+ /* 64 bit bits 63-32 */
+ prev->risc.jmp[2] = cpu_to_le32(0);
+ dprintk(2, "[%p/%d] buffer_queue - append to active, buf->count=%d\n", buf, buf->vb.i, buf->count);
+
+ } else {
+ list_add_tail(&buf->vb.queue, &q->queued);
+ buf->vb.state = VIDEOBUF_QUEUED;
+ dprintk(2, "[%p/%d] buffer_queue - first queued\n", buf, buf->vb.i);
+ }
}
if (list_empty(&q->active))
lock_kernel();
list_for_each(list, &cx25821_devlist)
{
- h = list_entry(list, struct cx25821_dev, devlist);
+ h = list_entry(list, struct cx25821_dev, devlist);
- if (h->video_dev[SRAM_CH02] && h->video_dev[SRAM_CH02]->minor == minor) {
- dev = h;
- type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- }
+ if (h->video_dev[SRAM_CH02] && h->video_dev[SRAM_CH02]->minor == minor) {
+ dev = h;
+ type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ }
}
if (NULL == dev) {
- unlock_kernel();
- return -ENODEV;
+ unlock_kernel();
+ return -ENODEV;
}
printk("open minor=%d type=%s\n", minor, v4l2_type_names[type]);
/* allocate + initialize per filehandle data */
fh = kzalloc(sizeof(*fh), GFP_KERNEL);
if (NULL == fh) {
- unlock_kernel();
- return -ENOMEM;
+ unlock_kernel();
+ return -ENOMEM;
}
file->private_data = fh;
fh->dev = dev;
fh->width = 720;
if(dev->tvnorm & V4L2_STD_PAL_BG || dev->tvnorm & V4L2_STD_PAL_DK)
- fh->height = 576;
+ fh->height = 576;
else
- fh->height = 480;
+ fh->height = 480;
dev->channel_opened = SRAM_CH02;
pix_format = (dev->pixel_formats[dev->channel_opened] == PIXEL_FRMT_411) ? V4L2_PIX_FMT_Y41P : V4L2_PIX_FMT_YUYV;
v4l2_prio_open(&dev->prio,&fh->prio);
videobuf_queue_sg_init(&fh->vidq, &cx25821_video_qops,
- &dev->pci->dev, &dev->slock,
- V4L2_BUF_TYPE_VIDEO_CAPTURE,
- V4L2_FIELD_INTERLACED,
- sizeof(struct cx25821_buffer),
- fh);
+ &dev->pci->dev, &dev->slock,
+ V4L2_BUF_TYPE_VIDEO_CAPTURE,
+ V4L2_FIELD_INTERLACED,
+ sizeof(struct cx25821_buffer),
+ fh);
dprintk(1, "post videobuf_queue_init()\n");
unlock_kernel();
switch (fh->type)
{
- case V4L2_BUF_TYPE_VIDEO_CAPTURE:
- if (res_locked(fh->dev, RESOURCE_VIDEO2))
- return -EBUSY;
+ case V4L2_BUF_TYPE_VIDEO_CAPTURE:
+ if (res_locked(fh->dev, RESOURCE_VIDEO2))
+ return -EBUSY;
- return videobuf_read_one(&fh->vidq, data, count, ppos, file->f_flags & O_NONBLOCK);
+ return videobuf_read_one(&fh->vidq, data, count, ppos, file->f_flags & O_NONBLOCK);
- default:
- BUG();
- return 0;
+ default:
+ BUG();
+ return 0;
}
}
struct cx25821_buffer *buf;
if (res_check(fh, RESOURCE_VIDEO2)) {
- /* streaming capture */
- if (list_empty(&fh->vidq.stream))
- return POLLERR;
- buf = list_entry(fh->vidq.stream.next,
- struct cx25821_buffer, vb.stream);
+ /* streaming capture */
+ if (list_empty(&fh->vidq.stream))
+ return POLLERR;
+ buf = list_entry(fh->vidq.stream.next,
+ struct cx25821_buffer, vb.stream);
} else {
- /* read() capture */
- buf = (struct cx25821_buffer *)fh->vidq.read_buf;
- if (NULL == buf)
- return POLLERR;
+ /* read() capture */
+ buf = (struct cx25821_buffer *)fh->vidq.read_buf;
+ if (NULL == buf)
+ return POLLERR;
}
poll_wait(file, &buf->vb.done, wait);
if (buf->vb.state == VIDEOBUF_DONE || buf->vb.state == VIDEOBUF_ERROR)
- {
- if( buf->vb.state == VIDEOBUF_DONE )
- {
- struct cx25821_dev *dev = fh->dev;
-
- if( dev && dev->use_cif_resolution[SRAM_CH02] )
- {
- u8 cam_id = *((char*)buf->vb.baddr+3);
- memcpy((char*)buf->vb.baddr, (char*)buf->vb.baddr + (fh->width * 2), (fh->width * 2));
- *((char*)buf->vb.baddr+3) = cam_id;
- }
- }
-
- return POLLIN|POLLRDNORM;
+ {
+ if( buf->vb.state == VIDEOBUF_DONE )
+ {
+ struct cx25821_dev *dev = fh->dev;
+
+ if( dev && dev->use_cif_resolution[SRAM_CH02] )
+ {
+ u8 cam_id = *((char*)buf->vb.baddr+3);
+ memcpy((char*)buf->vb.baddr, (char*)buf->vb.baddr + (fh->width * 2), (fh->width * 2));
+ *((char*)buf->vb.baddr+3) = cam_id;
+ }
+ }
+
+ return POLLIN|POLLRDNORM;
}
-
+
return 0;
}
/* stop video capture */
if (res_check(fh, RESOURCE_VIDEO2)) {
- videobuf_queue_cancel(&fh->vidq);
- res_free(dev, fh, RESOURCE_VIDEO2);
+ videobuf_queue_cancel(&fh->vidq);
+ res_free(dev, fh, RESOURCE_VIDEO2);
}
if (fh->vidq.read_buf) {
- buffer_release(&fh->vidq, fh->vidq.read_buf);
- kfree(fh->vidq.read_buf);
+ buffer_release(&fh->vidq, fh->vidq.read_buf);
+ kfree(fh->vidq.read_buf);
}
videobuf_mmap_free(&fh->vidq);
if (unlikely(fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE))
{
- return -EINVAL;
+ return -EINVAL;
}
if (unlikely(i != fh->type))
{
- return -EINVAL;
+ return -EINVAL;
}
if (unlikely(!res_get(dev, fh, get_resource(fh, RESOURCE_VIDEO2))))
{
- return -EBUSY;
+ return -EBUSY;
}
return videobuf_streamon(get_queue(fh));
int err, res;
if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
- return -EINVAL;
+ return -EINVAL;
if (i != fh->type)
- return -EINVAL;
+ return -EINVAL;
res = get_resource(fh, RESOURCE_VIDEO2);
err = videobuf_streamoff(get_queue(fh));
if (err < 0)
- return err;
+ return err;
res_free(dev, fh, res);
return 0;
}
{
struct cx25821_fh *fh = priv;
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
- int err;
+ int err;
int pix_format = 0;
-
- if (fh)
+
+ if (fh)
{
- err = v4l2_prio_check(&dev->prio, &fh->prio);
- if (0 != err)
- return err;
+ err = v4l2_prio_check(&dev->prio, &fh->prio);
+ if (0 != err)
+ return err;
}
dprintk(2, "%s()\n", __func__);
err = vidioc_try_fmt_vid_cap(file, priv, f);
if (0 != err)
- return err;
+ return err;
fh->fmt = format_by_fourcc(f->fmt.pix.pixelformat);
fh->vidq.field = f->fmt.pix.field;
// check if width and height is valid based on set standard
if (is_valid_width(f->fmt.pix.width, dev->tvnorm))
{
- fh->width = f->fmt.pix.width;
+ fh->width = f->fmt.pix.width;
}
if (is_valid_height(f->fmt.pix.height, dev->tvnorm))
{
- fh->height = f->fmt.pix.height;
+ fh->height = f->fmt.pix.height;
}
if (f->fmt.pix.pixelformat == V4L2_PIX_FMT_Y41P)
- pix_format = PIXEL_FRMT_411;
+ pix_format = PIXEL_FRMT_411;
else if (f->fmt.pix.pixelformat == V4L2_PIX_FMT_YUYV)
- pix_format = PIXEL_FRMT_422;
+ pix_format = PIXEL_FRMT_422;
else
- return -EINVAL;
+ return -EINVAL;
+
+ cx25821_set_pixel_format( dev, SRAM_CH02, pix_format );
- cx25821_set_pixel_format( dev, SRAM_CH02, pix_format );
-
// check if cif resolution
if (fh->width == 320 || fh->width == 352)
{
- dev->use_cif_resolution[SRAM_CH02] = 1;
+ dev->use_cif_resolution[SRAM_CH02] = 1;
}else
{
dev->use_cif_resolution[SRAM_CH02] = 0;
}
dev->cif_width[SRAM_CH02] = fh->width;
- medusa_set_resolution( dev, fh->width, SRAM_CH02 );
+ medusa_set_resolution( dev, fh->width, SRAM_CH02 );
dprintk(2, "%s() width=%d height=%d field=%d\n", __func__, fh->width, fh->height, fh->vidq.field);
struct cx25821_fh *fh = priv;
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
- ret_val = videobuf_dqbuf(get_queue(fh), p, file->f_flags & O_NONBLOCK);
+ ret_val = videobuf_dqbuf(get_queue(fh), p, file->f_flags & O_NONBLOCK);
p->sequence = dev->vidq[SRAM_CH02].count;
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
char name[32 + 2];
- struct sram_channel *sram_ch = &dev->sram_channels[SRAM_CH02];
+ struct sram_channel *sram_ch = &dev->sram_channels[SRAM_CH02];
u32 tmp = 0;
snprintf(name, sizeof(name), "%s/2", dev->name);
printk(KERN_INFO "%s/2: ============ START LOG STATUS ============\n",
dev->name);
-
+
cx25821_call_all(dev, core, log_status);
-
+
tmp = cx_read(sram_ch->dma_ctl);
printk(KERN_INFO "Video input 2 is %s\n", (tmp & 0x11)?"streaming" : "stopped");
printk(KERN_INFO "%s/2: ============= END LOG STATUS =============\n",
struct v4l2_control *ctl)
{
struct cx25821_fh *fh = priv;
- struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
- int err;
+ struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
+ int err;
- if (fh) {
+ if (fh) {
err = v4l2_prio_check(&dev->prio, &fh->prio);
if (0 != err)
return err;
/*
* Driver for the Conexant CX25821 PCIe bridge
*
- * Copyright (C) 2009 Conexant Systems Inc.
+ * Copyright (C) 2009 Conexant Systems Inc.
* Authors <shu.lin@conexant.com>, <hiep.huynh@conexant.com>
* Based on Steven Toth <stoth@linuxtv.org> cx23885 driver
*
dprintk(2, "jmp to stopper (0x%x)\n", buf->risc.jmp[1]);
if (!list_empty(&q->queued)) {
- list_add_tail(&buf->vb.queue, &q->queued);
- buf->vb.state = VIDEOBUF_QUEUED;
- dprintk(2, "[%p/%d] buffer_queue - append to queued\n", buf, buf->vb.i);
+ list_add_tail(&buf->vb.queue, &q->queued);
+ buf->vb.state = VIDEOBUF_QUEUED;
+ dprintk(2, "[%p/%d] buffer_queue - append to queued\n", buf, buf->vb.i);
} else if (list_empty(&q->active)) {
- list_add_tail(&buf->vb.queue, &q->active);
- cx25821_start_video_dma(dev, q, buf, &dev->sram_channels[SRAM_CH03]);
- buf->vb.state = VIDEOBUF_ACTIVE;
- buf->count = q->count++;
- mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
- dprintk(2, "[%p/%d] buffer_queue - first active, buf cnt = %d, q->count = %d\n",
- buf, buf->vb. i, buf->count, q->count);
+ list_add_tail(&buf->vb.queue, &q->active);
+ cx25821_start_video_dma(dev, q, buf, &dev->sram_channels[SRAM_CH03]);
+ buf->vb.state = VIDEOBUF_ACTIVE;
+ buf->count = q->count++;
+ mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
+ dprintk(2, "[%p/%d] buffer_queue - first active, buf cnt = %d, q->count = %d\n",
+ buf, buf->vb. i, buf->count, q->count);
} else {
- prev = list_entry(q->active.prev, struct cx25821_buffer, vb.queue);
- if (prev->vb.width == buf->vb.width &&
- prev->vb.height == buf->vb.height &&
- prev->fmt == buf->fmt) {
- list_add_tail(&buf->vb.queue, &q->active);
- buf->vb.state = VIDEOBUF_ACTIVE;
- buf->count = q->count++;
- prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
-
- /* 64 bit bits 63-32 */
- prev->risc.jmp[2] = cpu_to_le32(0);
- dprintk(2, "[%p/%d] buffer_queue - append to active, buf->count=%d\n", buf, buf->vb.i, buf->count);
-
- } else {
- list_add_tail(&buf->vb.queue, &q->queued);
- buf->vb.state = VIDEOBUF_QUEUED;
- dprintk(2, "[%p/%d] buffer_queue - first queued\n", buf, buf->vb.i);
- }
+ prev = list_entry(q->active.prev, struct cx25821_buffer, vb.queue);
+ if (prev->vb.width == buf->vb.width &&
+ prev->vb.height == buf->vb.height &&
+ prev->fmt == buf->fmt) {
+ list_add_tail(&buf->vb.queue, &q->active);
+ buf->vb.state = VIDEOBUF_ACTIVE;
+ buf->count = q->count++;
+ prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
+
+ /* 64 bit bits 63-32 */
+ prev->risc.jmp[2] = cpu_to_le32(0);
+ dprintk(2, "[%p/%d] buffer_queue - append to active, buf->count=%d\n", buf, buf->vb.i, buf->count);
+
+ } else {
+ list_add_tail(&buf->vb.queue, &q->queued);
+ buf->vb.state = VIDEOBUF_QUEUED;
+ dprintk(2, "[%p/%d] buffer_queue - first queued\n", buf, buf->vb.i);
+ }
}
if (list_empty(&q->active))
lock_kernel();
list_for_each(list, &cx25821_devlist)
{
- h = list_entry(list, struct cx25821_dev, devlist);
+ h = list_entry(list, struct cx25821_dev, devlist);
- if (h->video_dev[SRAM_CH03] && h->video_dev[SRAM_CH03]->minor == minor) {
- dev = h;
- type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- }
+ if (h->video_dev[SRAM_CH03] && h->video_dev[SRAM_CH03]->minor == minor) {
+ dev = h;
+ type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ }
}
if (NULL == dev) {
- unlock_kernel();
- return -ENODEV;
+ unlock_kernel();
+ return -ENODEV;
}
printk("open minor=%d type=%s\n", minor, v4l2_type_names[type]);
/* allocate + initialize per filehandle data */
fh = kzalloc(sizeof(*fh), GFP_KERNEL);
if (NULL == fh) {
- unlock_kernel();
- return -ENOMEM;
+ unlock_kernel();
+ return -ENOMEM;
}
file->private_data = fh;
fh->dev = dev;
fh->width = 720;
if(dev->tvnorm & V4L2_STD_PAL_BG || dev->tvnorm & V4L2_STD_PAL_DK)
- fh->height = 576;
+ fh->height = 576;
else
- fh->height = 480;
+ fh->height = 480;
dev->channel_opened = SRAM_CH03;
pix_format = (dev->pixel_formats[dev->channel_opened] == PIXEL_FRMT_411) ? V4L2_PIX_FMT_Y41P : V4L2_PIX_FMT_YUYV;
v4l2_prio_open(&dev->prio,&fh->prio);
videobuf_queue_sg_init(&fh->vidq, &cx25821_video_qops,
- &dev->pci->dev, &dev->slock,
- V4L2_BUF_TYPE_VIDEO_CAPTURE,
- V4L2_FIELD_INTERLACED,
- sizeof(struct cx25821_buffer),
- fh);
+ &dev->pci->dev, &dev->slock,
+ V4L2_BUF_TYPE_VIDEO_CAPTURE,
+ V4L2_FIELD_INTERLACED,
+ sizeof(struct cx25821_buffer),
+ fh);
dprintk(1, "post videobuf_queue_init()\n");
unlock_kernel();
switch (fh->type)
{
- case V4L2_BUF_TYPE_VIDEO_CAPTURE:
- if (res_locked(fh->dev, RESOURCE_VIDEO3))
- return -EBUSY;
+ case V4L2_BUF_TYPE_VIDEO_CAPTURE:
+ if (res_locked(fh->dev, RESOURCE_VIDEO3))
+ return -EBUSY;
- return videobuf_read_one(&fh->vidq, data, count, ppos, file->f_flags & O_NONBLOCK);
+ return videobuf_read_one(&fh->vidq, data, count, ppos, file->f_flags & O_NONBLOCK);
- default:
- BUG();
- return 0;
+ default:
+ BUG();
+ return 0;
}
}
struct cx25821_buffer *buf;
if (res_check(fh, RESOURCE_VIDEO3)) {
- /* streaming capture */
- if (list_empty(&fh->vidq.stream))
- return POLLERR;
- buf = list_entry(fh->vidq.stream.next,
- struct cx25821_buffer, vb.stream);
+ /* streaming capture */
+ if (list_empty(&fh->vidq.stream))
+ return POLLERR;
+ buf = list_entry(fh->vidq.stream.next,
+ struct cx25821_buffer, vb.stream);
} else {
- /* read() capture */
- buf = (struct cx25821_buffer *)fh->vidq.read_buf;
- if (NULL == buf)
- return POLLERR;
+ /* read() capture */
+ buf = (struct cx25821_buffer *)fh->vidq.read_buf;
+ if (NULL == buf)
+ return POLLERR;
}
poll_wait(file, &buf->vb.done, wait);
if (buf->vb.state == VIDEOBUF_DONE || buf->vb.state == VIDEOBUF_ERROR)
- {
- if( buf->vb.state == VIDEOBUF_DONE )
- {
- struct cx25821_dev *dev = fh->dev;
-
- if( dev && dev->use_cif_resolution[SRAM_CH03] )
- {
- u8 cam_id = *((char*)buf->vb.baddr+3);
- memcpy((char*)buf->vb.baddr, (char*)buf->vb.baddr + (fh->width * 2), (fh->width * 2));
- *((char*)buf->vb.baddr+3) = cam_id;
- }
- }
-
- return POLLIN|POLLRDNORM;
+ {
+ if( buf->vb.state == VIDEOBUF_DONE )
+ {
+ struct cx25821_dev *dev = fh->dev;
+
+ if( dev && dev->use_cif_resolution[SRAM_CH03] )
+ {
+ u8 cam_id = *((char*)buf->vb.baddr+3);
+ memcpy((char*)buf->vb.baddr, (char*)buf->vb.baddr + (fh->width * 2), (fh->width * 2));
+ *((char*)buf->vb.baddr+3) = cam_id;
+ }
+ }
+
+ return POLLIN|POLLRDNORM;
}
-
+
return 0;
}
/* stop video capture */
if (res_check(fh, RESOURCE_VIDEO3)) {
- videobuf_queue_cancel(&fh->vidq);
- res_free(dev, fh, RESOURCE_VIDEO3);
+ videobuf_queue_cancel(&fh->vidq);
+ res_free(dev, fh, RESOURCE_VIDEO3);
}
if (fh->vidq.read_buf) {
- buffer_release(&fh->vidq, fh->vidq.read_buf);
- kfree(fh->vidq.read_buf);
+ buffer_release(&fh->vidq, fh->vidq.read_buf);
+ kfree(fh->vidq.read_buf);
}
videobuf_mmap_free(&fh->vidq);
if (unlikely(fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE))
{
- return -EINVAL;
+ return -EINVAL;
}
if (unlikely(i != fh->type))
{
- return -EINVAL;
+ return -EINVAL;
}
if (unlikely(!res_get(dev, fh, get_resource(fh, RESOURCE_VIDEO3))))
{
- return -EBUSY;
+ return -EBUSY;
}
return videobuf_streamon(get_queue(fh));
int err, res;
if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
- return -EINVAL;
+ return -EINVAL;
if (i != fh->type)
- return -EINVAL;
+ return -EINVAL;
res = get_resource(fh, RESOURCE_VIDEO3);
err = videobuf_streamoff(get_queue(fh));
if (err < 0)
- return err;
+ return err;
res_free(dev, fh, res);
return 0;
}
{
struct cx25821_fh *fh = priv;
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
- int err;
+ int err;
int pix_format = 0;
-
- if (fh)
+
+ if (fh)
{
- err = v4l2_prio_check(&dev->prio, &fh->prio);
- if (0 != err)
- return err;
+ err = v4l2_prio_check(&dev->prio, &fh->prio);
+ if (0 != err)
+ return err;
}
dprintk(2, "%s()\n", __func__);
err = vidioc_try_fmt_vid_cap(file, priv, f);
if (0 != err)
- return err;
+ return err;
fh->fmt = format_by_fourcc(f->fmt.pix.pixelformat);
fh->vidq.field = f->fmt.pix.field;
// check if width and height is valid based on set standard
if (is_valid_width(f->fmt.pix.width, dev->tvnorm))
{
- fh->width = f->fmt.pix.width;
+ fh->width = f->fmt.pix.width;
}
if (is_valid_height(f->fmt.pix.height, dev->tvnorm))
{
- fh->height = f->fmt.pix.height;
+ fh->height = f->fmt.pix.height;
}
if (f->fmt.pix.pixelformat == V4L2_PIX_FMT_Y41P)
- pix_format = PIXEL_FRMT_411;
+ pix_format = PIXEL_FRMT_411;
else if (f->fmt.pix.pixelformat == V4L2_PIX_FMT_YUYV)
- pix_format = PIXEL_FRMT_422;
+ pix_format = PIXEL_FRMT_422;
else
- return -EINVAL;
+ return -EINVAL;
+
+ cx25821_set_pixel_format( dev, SRAM_CH03, pix_format );
- cx25821_set_pixel_format( dev, SRAM_CH03, pix_format );
-
// check if cif resolution
if (fh->width == 320 || fh->width == 352)
{
- dev->use_cif_resolution[SRAM_CH03] = 1;
+ dev->use_cif_resolution[SRAM_CH03] = 1;
}else
{
- dev->use_cif_resolution[SRAM_CH03] = 0;
+ dev->use_cif_resolution[SRAM_CH03] = 0;
}
dev->cif_width[SRAM_CH03] = fh->width;
- medusa_set_resolution( dev, fh->width, SRAM_CH03 );
+ medusa_set_resolution( dev, fh->width, SRAM_CH03 );
dprintk(2, "%s() width=%d height=%d field=%d\n", __func__, fh->width, fh->height, fh->vidq.field);
cx25821_call_all(dev, video, s_fmt, f);
struct cx25821_fh *fh = priv;
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
- ret_val = videobuf_dqbuf(get_queue(fh), p, file->f_flags & O_NONBLOCK);
+ ret_val = videobuf_dqbuf(get_queue(fh), p, file->f_flags & O_NONBLOCK);
p->sequence = dev->vidq[SRAM_CH03].count;
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
char name[32 + 2];
- struct sram_channel *sram_ch = &dev->sram_channels[SRAM_CH03];
+ struct sram_channel *sram_ch = &dev->sram_channels[SRAM_CH03];
u32 tmp = 0;
snprintf(name, sizeof(name), "%s/2", dev->name);
struct v4l2_control *ctl)
{
struct cx25821_fh *fh = priv;
- struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
- int err;
+ struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
+ int err;
- if (fh) {
+ if (fh) {
err = v4l2_prio_check(&dev->prio, &fh->prio);
if (0 != err)
return err;
/*
* Driver for the Conexant CX25821 PCIe bridge
*
- * Copyright (C) 2009 Conexant Systems Inc.
+ * Copyright (C) 2009 Conexant Systems Inc.
* Authors <shu.lin@conexant.com>, <hiep.huynh@conexant.com>
* Based on Steven Toth <stoth@linuxtv.org> cx23885 driver
*
dprintk(2, "jmp to stopper (0x%x)\n", buf->risc.jmp[1]);
if (!list_empty(&q->queued)) {
- list_add_tail(&buf->vb.queue, &q->queued);
- buf->vb.state = VIDEOBUF_QUEUED;
- dprintk(2, "[%p/%d] buffer_queue - append to queued\n", buf, buf->vb.i);
+ list_add_tail(&buf->vb.queue, &q->queued);
+ buf->vb.state = VIDEOBUF_QUEUED;
+ dprintk(2, "[%p/%d] buffer_queue - append to queued\n", buf, buf->vb.i);
} else if (list_empty(&q->active)) {
- list_add_tail(&buf->vb.queue, &q->active);
- cx25821_start_video_dma(dev, q, buf, &dev->sram_channels[SRAM_CH04]);
- buf->vb.state = VIDEOBUF_ACTIVE;
- buf->count = q->count++;
- mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
- dprintk(2, "[%p/%d] buffer_queue - first active, buf cnt = %d, q->count = %d\n",
- buf, buf->vb. i, buf->count, q->count);
+ list_add_tail(&buf->vb.queue, &q->active);
+ cx25821_start_video_dma(dev, q, buf, &dev->sram_channels[SRAM_CH04]);
+ buf->vb.state = VIDEOBUF_ACTIVE;
+ buf->count = q->count++;
+ mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
+ dprintk(2, "[%p/%d] buffer_queue - first active, buf cnt = %d, q->count = %d\n",
+ buf, buf->vb. i, buf->count, q->count);
} else {
- prev = list_entry(q->active.prev, struct cx25821_buffer, vb.queue);
- if (prev->vb.width == buf->vb.width &&
- prev->vb.height == buf->vb.height &&
- prev->fmt == buf->fmt) {
- list_add_tail(&buf->vb.queue, &q->active);
- buf->vb.state = VIDEOBUF_ACTIVE;
- buf->count = q->count++;
- prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
-
- /* 64 bit bits 63-32 */
- prev->risc.jmp[2] = cpu_to_le32(0);
- dprintk(2, "[%p/%d] buffer_queue - append to active, buf->count=%d\n", buf, buf->vb.i, buf->count);
-
- } else {
- list_add_tail(&buf->vb.queue, &q->queued);
- buf->vb.state = VIDEOBUF_QUEUED;
- dprintk(2, "[%p/%d] buffer_queue - first queued\n", buf, buf->vb.i);
- }
+ prev = list_entry(q->active.prev, struct cx25821_buffer, vb.queue);
+ if (prev->vb.width == buf->vb.width &&
+ prev->vb.height == buf->vb.height &&
+ prev->fmt == buf->fmt) {
+ list_add_tail(&buf->vb.queue, &q->active);
+ buf->vb.state = VIDEOBUF_ACTIVE;
+ buf->count = q->count++;
+ prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
+
+ /* 64 bit bits 63-32 */
+ prev->risc.jmp[2] = cpu_to_le32(0);
+ dprintk(2, "[%p/%d] buffer_queue - append to active, buf->count=%d\n", buf, buf->vb.i, buf->count);
+
+ } else {
+ list_add_tail(&buf->vb.queue, &q->queued);
+ buf->vb.state = VIDEOBUF_QUEUED;
+ dprintk(2, "[%p/%d] buffer_queue - first queued\n", buf, buf->vb.i);
+ }
}
if (list_empty(&q->active))
lock_kernel();
list_for_each(list, &cx25821_devlist)
{
- h = list_entry(list, struct cx25821_dev, devlist);
+ h = list_entry(list, struct cx25821_dev, devlist);
- if (h->video_dev[SRAM_CH04] && h->video_dev[SRAM_CH04]->minor == minor) {
- dev = h;
- type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- }
+ if (h->video_dev[SRAM_CH04] && h->video_dev[SRAM_CH04]->minor == minor) {
+ dev = h;
+ type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ }
}
if (NULL == dev) {
- unlock_kernel();
- return -ENODEV;
+ unlock_kernel();
+ return -ENODEV;
}
printk("open minor=%d type=%s\n", minor, v4l2_type_names[type]);
/* allocate + initialize per filehandle data */
fh = kzalloc(sizeof(*fh), GFP_KERNEL);
if (NULL == fh) {
- unlock_kernel();
- return -ENOMEM;
+ unlock_kernel();
+ return -ENOMEM;
}
file->private_data = fh;
fh->dev = dev;
fh->width = 720;
if(dev->tvnorm & V4L2_STD_PAL_BG || dev->tvnorm & V4L2_STD_PAL_DK)
- fh->height = 576;
+ fh->height = 576;
else
- fh->height = 480;
+ fh->height = 480;
dev->channel_opened = SRAM_CH04;
pix_format = (dev->pixel_formats[dev->channel_opened] == PIXEL_FRMT_411) ? V4L2_PIX_FMT_Y41P : V4L2_PIX_FMT_YUYV;
v4l2_prio_open(&dev->prio,&fh->prio);
videobuf_queue_sg_init(&fh->vidq, &cx25821_video_qops,
- &dev->pci->dev, &dev->slock,
- V4L2_BUF_TYPE_VIDEO_CAPTURE,
- V4L2_FIELD_INTERLACED,
- sizeof(struct cx25821_buffer),
- fh);
+ &dev->pci->dev, &dev->slock,
+ V4L2_BUF_TYPE_VIDEO_CAPTURE,
+ V4L2_FIELD_INTERLACED,
+ sizeof(struct cx25821_buffer),
+ fh);
dprintk(1, "post videobuf_queue_init()\n");
unlock_kernel();
switch (fh->type)
{
- case V4L2_BUF_TYPE_VIDEO_CAPTURE:
- if (res_locked(fh->dev, RESOURCE_VIDEO4))
- return -EBUSY;
+ case V4L2_BUF_TYPE_VIDEO_CAPTURE:
+ if (res_locked(fh->dev, RESOURCE_VIDEO4))
+ return -EBUSY;
- return videobuf_read_one(&fh->vidq, data, count, ppos, file->f_flags & O_NONBLOCK);
+ return videobuf_read_one(&fh->vidq, data, count, ppos, file->f_flags & O_NONBLOCK);
- default:
- BUG();
- return 0;
+ default:
+ BUG();
+ return 0;
}
}
struct cx25821_buffer *buf;
if (res_check(fh, RESOURCE_VIDEO4)) {
- /* streaming capture */
- if (list_empty(&fh->vidq.stream))
- return POLLERR;
- buf = list_entry(fh->vidq.stream.next,
- struct cx25821_buffer, vb.stream);
+ /* streaming capture */
+ if (list_empty(&fh->vidq.stream))
+ return POLLERR;
+ buf = list_entry(fh->vidq.stream.next,
+ struct cx25821_buffer, vb.stream);
} else {
- /* read() capture */
- buf = (struct cx25821_buffer *)fh->vidq.read_buf;
- if (NULL == buf)
- return POLLERR;
+ /* read() capture */
+ buf = (struct cx25821_buffer *)fh->vidq.read_buf;
+ if (NULL == buf)
+ return POLLERR;
}
poll_wait(file, &buf->vb.done, wait);
if (buf->vb.state == VIDEOBUF_DONE || buf->vb.state == VIDEOBUF_ERROR)
- {
- if( buf->vb.state == VIDEOBUF_DONE )
- {
- struct cx25821_dev *dev = fh->dev;
-
- if( dev && dev->use_cif_resolution[SRAM_CH04] )
- {
- u8 cam_id = *((char*)buf->vb.baddr+3);
- memcpy((char*)buf->vb.baddr, (char*)buf->vb.baddr + (fh->width * 2), (fh->width * 2));
- *((char*)buf->vb.baddr+3) = cam_id;
- }
- }
-
- return POLLIN|POLLRDNORM;
+ {
+ if( buf->vb.state == VIDEOBUF_DONE )
+ {
+ struct cx25821_dev *dev = fh->dev;
+
+ if( dev && dev->use_cif_resolution[SRAM_CH04] )
+ {
+ u8 cam_id = *((char*)buf->vb.baddr+3);
+ memcpy((char*)buf->vb.baddr, (char*)buf->vb.baddr + (fh->width * 2), (fh->width * 2));
+ *((char*)buf->vb.baddr+3) = cam_id;
+ }
+ }
+
+ return POLLIN|POLLRDNORM;
}
-
+
return 0;
}
/* stop video capture */
if (res_check(fh, RESOURCE_VIDEO4)) {
- videobuf_queue_cancel(&fh->vidq);
- res_free(dev, fh, RESOURCE_VIDEO4);
+ videobuf_queue_cancel(&fh->vidq);
+ res_free(dev, fh, RESOURCE_VIDEO4);
}
if (fh->vidq.read_buf) {
- buffer_release(&fh->vidq, fh->vidq.read_buf);
- kfree(fh->vidq.read_buf);
+ buffer_release(&fh->vidq, fh->vidq.read_buf);
+ kfree(fh->vidq.read_buf);
}
videobuf_mmap_free(&fh->vidq);
if (unlikely(fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE))
{
- return -EINVAL;
+ return -EINVAL;
}
if (unlikely(i != fh->type))
{
- return -EINVAL;
+ return -EINVAL;
}
if (unlikely(!res_get(dev, fh, get_resource(fh, RESOURCE_VIDEO4))))
{
- return -EBUSY;
+ return -EBUSY;
}
return videobuf_streamon(get_queue(fh));
int err, res;
if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
- return -EINVAL;
+ return -EINVAL;
if (i != fh->type)
- return -EINVAL;
+ return -EINVAL;
res = get_resource(fh, RESOURCE_VIDEO4);
err = videobuf_streamoff(get_queue(fh));
if (err < 0)
- return err;
+ return err;
res_free(dev, fh, res);
return 0;
}
{
struct cx25821_fh *fh = priv;
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
- int err;
+ int err;
int pix_format = 0;
// check priority
if (fh)
{
- err = v4l2_prio_check(&dev->prio, &fh->prio);
- if (0 != err)
- return err;
+ err = v4l2_prio_check(&dev->prio, &fh->prio);
+ if (0 != err)
+ return err;
}
dprintk(2, "%s()\n", __func__);
err = vidioc_try_fmt_vid_cap(file, priv, f);
if (0 != err)
- return err;
+ return err;
fh->fmt = format_by_fourcc(f->fmt.pix.pixelformat);
fh->vidq.field = f->fmt.pix.field;
// check if width and height is valid based on set standard
if (is_valid_width(f->fmt.pix.width, dev->tvnorm))
{
- fh->width = f->fmt.pix.width;
+ fh->width = f->fmt.pix.width;
}
if (is_valid_height(f->fmt.pix.height, dev->tvnorm))
{
- fh->height = f->fmt.pix.height;
+ fh->height = f->fmt.pix.height;
}
if (f->fmt.pix.pixelformat == V4L2_PIX_FMT_Y41P)
- pix_format = PIXEL_FRMT_411;
+ pix_format = PIXEL_FRMT_411;
else if (f->fmt.pix.pixelformat == V4L2_PIX_FMT_YUYV)
- pix_format = PIXEL_FRMT_422;
+ pix_format = PIXEL_FRMT_422;
else
- return -EINVAL;
+ return -EINVAL;
+
+ cx25821_set_pixel_format( dev, SRAM_CH04, pix_format );
- cx25821_set_pixel_format( dev, SRAM_CH04, pix_format );
-
// check if cif resolution
if (fh->width == 320 || fh->width == 352)
{
- dev->use_cif_resolution[SRAM_CH04] = 1;
+ dev->use_cif_resolution[SRAM_CH04] = 1;
}else
{
dev->use_cif_resolution[SRAM_CH04] = 0;
}
dev->cif_width[SRAM_CH04] = fh->width;
- medusa_set_resolution( dev, fh->width, SRAM_CH04);
+ medusa_set_resolution( dev, fh->width, SRAM_CH04);
dprintk(2, "%s() width=%d height=%d field=%d\n", __func__, fh->width, fh->height, fh->vidq.field);
cx25821_call_all(dev, video, s_fmt, f);
struct cx25821_fh *fh = priv;
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
- ret_val = videobuf_dqbuf(get_queue(fh), p, file->f_flags & O_NONBLOCK);
+ ret_val = videobuf_dqbuf(get_queue(fh), p, file->f_flags & O_NONBLOCK);
p->sequence = dev->vidq[SRAM_CH04].count;
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
char name[32 + 2];
- struct sram_channel *sram_ch = &dev->sram_channels[SRAM_CH04];
+ struct sram_channel *sram_ch = &dev->sram_channels[SRAM_CH04];
u32 tmp = 0;
snprintf(name, sizeof(name), "%s/2", dev->name);
struct v4l2_control *ctl)
{
struct cx25821_fh *fh = priv;
- struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
- int err;
+ struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
+ int err;
- if (fh) {
+ if (fh) {
err = v4l2_prio_check(&dev->prio, &fh->prio);
if (0 != err)
return err;
/*
* Driver for the Conexant CX25821 PCIe bridge
*
- * Copyright (C) 2009 Conexant Systems Inc.
+ * Copyright (C) 2009 Conexant Systems Inc.
* Authors <shu.lin@conexant.com>, <hiep.huynh@conexant.com>
* Based on Steven Toth <stoth@linuxtv.org> cx23885 driver
*
dprintk(2, "jmp to stopper (0x%x)\n", buf->risc.jmp[1]);
if (!list_empty(&q->queued)) {
- list_add_tail(&buf->vb.queue, &q->queued);
- buf->vb.state = VIDEOBUF_QUEUED;
- dprintk(2, "[%p/%d] buffer_queue - append to queued\n", buf, buf->vb.i);
+ list_add_tail(&buf->vb.queue, &q->queued);
+ buf->vb.state = VIDEOBUF_QUEUED;
+ dprintk(2, "[%p/%d] buffer_queue - append to queued\n", buf, buf->vb.i);
} else if (list_empty(&q->active)) {
- list_add_tail(&buf->vb.queue, &q->active);
- cx25821_start_video_dma(dev, q, buf, &dev->sram_channels[SRAM_CH05]);
- buf->vb.state = VIDEOBUF_ACTIVE;
- buf->count = q->count++;
- mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
- dprintk(2, "[%p/%d] buffer_queue - first active, buf cnt = %d, q->count = %d\n",
- buf, buf->vb. i, buf->count, q->count);
+ list_add_tail(&buf->vb.queue, &q->active);
+ cx25821_start_video_dma(dev, q, buf, &dev->sram_channels[SRAM_CH05]);
+ buf->vb.state = VIDEOBUF_ACTIVE;
+ buf->count = q->count++;
+ mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
+ dprintk(2, "[%p/%d] buffer_queue - first active, buf cnt = %d, q->count = %d\n",
+ buf, buf->vb. i, buf->count, q->count);
} else {
- prev = list_entry(q->active.prev, struct cx25821_buffer, vb.queue);
- if (prev->vb.width == buf->vb.width &&
- prev->vb.height == buf->vb.height &&
- prev->fmt == buf->fmt) {
- list_add_tail(&buf->vb.queue, &q->active);
- buf->vb.state = VIDEOBUF_ACTIVE;
- buf->count = q->count++;
- prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
-
- /* 64 bit bits 63-32 */
- prev->risc.jmp[2] = cpu_to_le32(0);
- dprintk(2, "[%p/%d] buffer_queue - append to active, buf->count=%d\n", buf, buf->vb.i, buf->count);
-
- } else {
- list_add_tail(&buf->vb.queue, &q->queued);
- buf->vb.state = VIDEOBUF_QUEUED;
- dprintk(2, "[%p/%d] buffer_queue - first queued\n", buf, buf->vb.i);
- }
+ prev = list_entry(q->active.prev, struct cx25821_buffer, vb.queue);
+ if (prev->vb.width == buf->vb.width &&
+ prev->vb.height == buf->vb.height &&
+ prev->fmt == buf->fmt) {
+ list_add_tail(&buf->vb.queue, &q->active);
+ buf->vb.state = VIDEOBUF_ACTIVE;
+ buf->count = q->count++;
+ prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
+
+ /* 64 bit bits 63-32 */
+ prev->risc.jmp[2] = cpu_to_le32(0);
+ dprintk(2, "[%p/%d] buffer_queue - append to active, buf->count=%d\n", buf, buf->vb.i, buf->count);
+
+ } else {
+ list_add_tail(&buf->vb.queue, &q->queued);
+ buf->vb.state = VIDEOBUF_QUEUED;
+ dprintk(2, "[%p/%d] buffer_queue - first queued\n", buf, buf->vb.i);
+ }
}
if (list_empty(&q->active))
lock_kernel();
list_for_each(list, &cx25821_devlist)
{
- h = list_entry(list, struct cx25821_dev, devlist);
+ h = list_entry(list, struct cx25821_dev, devlist);
- if (h->video_dev[SRAM_CH05] && h->video_dev[SRAM_CH05]->minor == minor) {
- dev = h;
- type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- }
+ if (h->video_dev[SRAM_CH05] && h->video_dev[SRAM_CH05]->minor == minor) {
+ dev = h;
+ type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ }
}
if (NULL == dev) {
- unlock_kernel();
- return -ENODEV;
+ unlock_kernel();
+ return -ENODEV;
}
printk("open minor=%d type=%s\n", minor, v4l2_type_names[type]);
/* allocate + initialize per filehandle data */
fh = kzalloc(sizeof(*fh), GFP_KERNEL);
if (NULL == fh) {
- unlock_kernel();
- return -ENOMEM;
+ unlock_kernel();
+ return -ENOMEM;
}
file->private_data = fh;
fh->dev = dev;
fh->width = 720;
if(dev->tvnorm & V4L2_STD_PAL_BG || dev->tvnorm & V4L2_STD_PAL_DK)
- fh->height = 576;
+ fh->height = 576;
else
- fh->height = 480;
+ fh->height = 480;
dev->channel_opened = SRAM_CH05;
pix_format = (dev->pixel_formats[dev->channel_opened] == PIXEL_FRMT_411) ? V4L2_PIX_FMT_Y41P : V4L2_PIX_FMT_YUYV;
v4l2_prio_open(&dev->prio,&fh->prio);
videobuf_queue_sg_init(&fh->vidq, &cx25821_video_qops,
- &dev->pci->dev, &dev->slock,
- V4L2_BUF_TYPE_VIDEO_CAPTURE,
- V4L2_FIELD_INTERLACED,
- sizeof(struct cx25821_buffer),
- fh);
+ &dev->pci->dev, &dev->slock,
+ V4L2_BUF_TYPE_VIDEO_CAPTURE,
+ V4L2_FIELD_INTERLACED,
+ sizeof(struct cx25821_buffer),
+ fh);
dprintk(1, "post videobuf_queue_init()\n");
unlock_kernel();
switch (fh->type)
{
- case V4L2_BUF_TYPE_VIDEO_CAPTURE:
- if (res_locked(fh->dev, RESOURCE_VIDEO5))
- return -EBUSY;
+ case V4L2_BUF_TYPE_VIDEO_CAPTURE:
+ if (res_locked(fh->dev, RESOURCE_VIDEO5))
+ return -EBUSY;
- return videobuf_read_one(&fh->vidq, data, count, ppos, file->f_flags & O_NONBLOCK);
+ return videobuf_read_one(&fh->vidq, data, count, ppos, file->f_flags & O_NONBLOCK);
- default:
- BUG();
- return 0;
+ default:
+ BUG();
+ return 0;
}
}
struct cx25821_buffer *buf;
if (res_check(fh, RESOURCE_VIDEO5)) {
- /* streaming capture */
- if (list_empty(&fh->vidq.stream))
- return POLLERR;
- buf = list_entry(fh->vidq.stream.next,
- struct cx25821_buffer, vb.stream);
+ /* streaming capture */
+ if (list_empty(&fh->vidq.stream))
+ return POLLERR;
+ buf = list_entry(fh->vidq.stream.next,
+ struct cx25821_buffer, vb.stream);
} else {
- /* read() capture */
- buf = (struct cx25821_buffer *)fh->vidq.read_buf;
- if (NULL == buf)
- return POLLERR;
+ /* read() capture */
+ buf = (struct cx25821_buffer *)fh->vidq.read_buf;
+ if (NULL == buf)
+ return POLLERR;
}
poll_wait(file, &buf->vb.done, wait);
if (buf->vb.state == VIDEOBUF_DONE || buf->vb.state == VIDEOBUF_ERROR)
- {
- if( buf->vb.state == VIDEOBUF_DONE )
- {
- struct cx25821_dev *dev = fh->dev;
-
- if( dev && dev->use_cif_resolution[SRAM_CH05] )
- {
- u8 cam_id = *((char*)buf->vb.baddr+3);
- memcpy((char*)buf->vb.baddr, (char*)buf->vb.baddr + (fh->width * 2), (fh->width * 2));
- *((char*)buf->vb.baddr+3) = cam_id;
- }
- }
-
- return POLLIN|POLLRDNORM;
+ {
+ if( buf->vb.state == VIDEOBUF_DONE )
+ {
+ struct cx25821_dev *dev = fh->dev;
+
+ if( dev && dev->use_cif_resolution[SRAM_CH05] )
+ {
+ u8 cam_id = *((char*)buf->vb.baddr+3);
+ memcpy((char*)buf->vb.baddr, (char*)buf->vb.baddr + (fh->width * 2), (fh->width * 2));
+ *((char*)buf->vb.baddr+3) = cam_id;
+ }
+ }
+
+ return POLLIN|POLLRDNORM;
}
return 0;
/* stop video capture */
if (res_check(fh, RESOURCE_VIDEO5)) {
- videobuf_queue_cancel(&fh->vidq);
- res_free(dev, fh, RESOURCE_VIDEO5);
+ videobuf_queue_cancel(&fh->vidq);
+ res_free(dev, fh, RESOURCE_VIDEO5);
}
if (fh->vidq.read_buf) {
- buffer_release(&fh->vidq, fh->vidq.read_buf);
- kfree(fh->vidq.read_buf);
+ buffer_release(&fh->vidq, fh->vidq.read_buf);
+ kfree(fh->vidq.read_buf);
}
videobuf_mmap_free(&fh->vidq);
if (unlikely(fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE))
{
- return -EINVAL;
+ return -EINVAL;
}
if (unlikely(i != fh->type))
{
- return -EINVAL;
+ return -EINVAL;
}
if (unlikely(!res_get(dev, fh, get_resource(fh, RESOURCE_VIDEO5))))
{
- return -EBUSY;
+ return -EBUSY;
}
return videobuf_streamon(get_queue(fh));
int err, res;
if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
- return -EINVAL;
+ return -EINVAL;
if (i != fh->type)
- return -EINVAL;
+ return -EINVAL;
res = get_resource(fh, RESOURCE_VIDEO5);
err = videobuf_streamoff(get_queue(fh));
if (err < 0)
- return err;
+ return err;
res_free(dev, fh, res);
return 0;
}
{
struct cx25821_fh *fh = priv;
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
- int err;
+ int err;
int pix_format = 0;
-
- if (fh)
+
+ if (fh)
{
- err = v4l2_prio_check(&dev->prio, &fh->prio);
- if (0 != err)
- return err;
+ err = v4l2_prio_check(&dev->prio, &fh->prio);
+ if (0 != err)
+ return err;
}
dprintk(2, "%s()\n", __func__);
err = vidioc_try_fmt_vid_cap(file, priv, f);
if (0 != err)
- return err;
+ return err;
fh->fmt = format_by_fourcc(f->fmt.pix.pixelformat);
fh->vidq.field = f->fmt.pix.field;
// check if width and height is valid based on set standard
if (is_valid_width(f->fmt.pix.width, dev->tvnorm))
{
- fh->width = f->fmt.pix.width;
+ fh->width = f->fmt.pix.width;
}
if (is_valid_height(f->fmt.pix.height, dev->tvnorm))
{
- fh->height = f->fmt.pix.height;
+ fh->height = f->fmt.pix.height;
}
if (f->fmt.pix.pixelformat == V4L2_PIX_FMT_Y41P)
- pix_format = PIXEL_FRMT_411;
+ pix_format = PIXEL_FRMT_411;
else if (f->fmt.pix.pixelformat == V4L2_PIX_FMT_YUYV)
- pix_format = PIXEL_FRMT_422;
+ pix_format = PIXEL_FRMT_422;
else
- return -EINVAL;
+ return -EINVAL;
+
+ cx25821_set_pixel_format( dev, SRAM_CH05, pix_format );
- cx25821_set_pixel_format( dev, SRAM_CH05, pix_format );
-
// check if cif resolution
if (fh->width == 320 || fh->width == 352)
{
- dev->use_cif_resolution[SRAM_CH05] = 1;
+ dev->use_cif_resolution[SRAM_CH05] = 1;
}else
{
dev->use_cif_resolution[SRAM_CH05] = 0;
}
dev->cif_width[SRAM_CH05] = fh->width;
- medusa_set_resolution( dev, fh->width, SRAM_CH05 );
+ medusa_set_resolution( dev, fh->width, SRAM_CH05 );
dprintk(2, "%s() width=%d height=%d field=%d\n", __func__, fh->width, fh->height, fh->vidq.field);
cx25821_call_all(dev, video, s_fmt, f);
struct cx25821_fh *fh = priv;
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
- ret_val = videobuf_dqbuf(get_queue(fh), p, file->f_flags & O_NONBLOCK);
+ ret_val = videobuf_dqbuf(get_queue(fh), p, file->f_flags & O_NONBLOCK);
p->sequence = dev->vidq[SRAM_CH05].count;
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
char name[32 + 2];
- struct sram_channel *sram_ch = &dev->sram_channels[SRAM_CH05];
+ struct sram_channel *sram_ch = &dev->sram_channels[SRAM_CH05];
u32 tmp = 0;
snprintf(name, sizeof(name), "%s/2", dev->name);
printk(KERN_INFO "%s/2: ============ START LOG STATUS ============\n",
dev->name);
cx25821_call_all(dev, core, log_status);
-
+
tmp = cx_read(sram_ch->dma_ctl);
printk(KERN_INFO "Video input 5 is %s\n", (tmp & 0x11)?"streaming" : "stopped");
printk(KERN_INFO "%s/2: ============= END LOG STATUS =============\n",
struct v4l2_control *ctl)
{
struct cx25821_fh *fh = priv;
- struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
- int err;
+ struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
+ int err;
- if (fh) {
+ if (fh) {
err = v4l2_prio_check(&dev->prio, &fh->prio);
if (0 != err)
return err;
/*
* Driver for the Conexant CX25821 PCIe bridge
*
- * Copyright (C) 2009 Conexant Systems Inc.
+ * Copyright (C) 2009 Conexant Systems Inc.
* Authors <shu.lin@conexant.com>, <hiep.huynh@conexant.com>
* Based on Steven Toth <stoth@linuxtv.org> cx23885 driver
*
dprintk(2, "jmp to stopper (0x%x)\n", buf->risc.jmp[1]);
if (!list_empty(&q->queued)) {
- list_add_tail(&buf->vb.queue, &q->queued);
- buf->vb.state = VIDEOBUF_QUEUED;
- dprintk(2, "[%p/%d] buffer_queue - append to queued\n", buf, buf->vb.i);
+ list_add_tail(&buf->vb.queue, &q->queued);
+ buf->vb.state = VIDEOBUF_QUEUED;
+ dprintk(2, "[%p/%d] buffer_queue - append to queued\n", buf, buf->vb.i);
} else if (list_empty(&q->active)) {
- list_add_tail(&buf->vb.queue, &q->active);
- cx25821_start_video_dma(dev, q, buf, &dev->sram_channels[SRAM_CH06]);
- buf->vb.state = VIDEOBUF_ACTIVE;
- buf->count = q->count++;
- mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
- dprintk(2, "[%p/%d] buffer_queue - first active, buf cnt = %d, q->count = %d\n",
- buf, buf->vb. i, buf->count, q->count);
+ list_add_tail(&buf->vb.queue, &q->active);
+ cx25821_start_video_dma(dev, q, buf, &dev->sram_channels[SRAM_CH06]);
+ buf->vb.state = VIDEOBUF_ACTIVE;
+ buf->count = q->count++;
+ mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
+ dprintk(2, "[%p/%d] buffer_queue - first active, buf cnt = %d, q->count = %d\n",
+ buf, buf->vb. i, buf->count, q->count);
} else {
- prev = list_entry(q->active.prev, struct cx25821_buffer, vb.queue);
- if (prev->vb.width == buf->vb.width &&
- prev->vb.height == buf->vb.height &&
- prev->fmt == buf->fmt) {
- list_add_tail(&buf->vb.queue, &q->active);
- buf->vb.state = VIDEOBUF_ACTIVE;
- buf->count = q->count++;
- prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
-
- /* 64 bit bits 63-32 */
- prev->risc.jmp[2] = cpu_to_le32(0);
- dprintk(2, "[%p/%d] buffer_queue - append to active, buf->count=%d\n", buf, buf->vb.i, buf->count);
-
- } else {
- list_add_tail(&buf->vb.queue, &q->queued);
- buf->vb.state = VIDEOBUF_QUEUED;
- dprintk(2, "[%p/%d] buffer_queue - first queued\n", buf, buf->vb.i);
- }
+ prev = list_entry(q->active.prev, struct cx25821_buffer, vb.queue);
+ if (prev->vb.width == buf->vb.width &&
+ prev->vb.height == buf->vb.height &&
+ prev->fmt == buf->fmt) {
+ list_add_tail(&buf->vb.queue, &q->active);
+ buf->vb.state = VIDEOBUF_ACTIVE;
+ buf->count = q->count++;
+ prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
+
+ /* 64 bit bits 63-32 */
+ prev->risc.jmp[2] = cpu_to_le32(0);
+ dprintk(2, "[%p/%d] buffer_queue - append to active, buf->count=%d\n", buf, buf->vb.i, buf->count);
+
+ } else {
+ list_add_tail(&buf->vb.queue, &q->queued);
+ buf->vb.state = VIDEOBUF_QUEUED;
+ dprintk(2, "[%p/%d] buffer_queue - first queued\n", buf, buf->vb.i);
+ }
}
if (list_empty(&q->active))
lock_kernel();
list_for_each(list, &cx25821_devlist)
{
- h = list_entry(list, struct cx25821_dev, devlist);
+ h = list_entry(list, struct cx25821_dev, devlist);
- if (h->video_dev[SRAM_CH06] && h->video_dev[SRAM_CH06]->minor == minor) {
- dev = h;
- type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- }
+ if (h->video_dev[SRAM_CH06] && h->video_dev[SRAM_CH06]->minor == minor) {
+ dev = h;
+ type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ }
}
if (NULL == dev) {
- unlock_kernel();
- return -ENODEV;
+ unlock_kernel();
+ return -ENODEV;
}
printk("open minor=%d type=%s\n", minor, v4l2_type_names[type]);
/* allocate + initialize per filehandle data */
fh = kzalloc(sizeof(*fh), GFP_KERNEL);
if (NULL == fh) {
- unlock_kernel();
- return -ENOMEM;
+ unlock_kernel();
+ return -ENOMEM;
}
file->private_data = fh;
fh->dev = dev;
fh->width = 720;
if(dev->tvnorm & V4L2_STD_PAL_BG || dev->tvnorm & V4L2_STD_PAL_DK)
- fh->height = 576;
+ fh->height = 576;
else
- fh->height = 480;
+ fh->height = 480;
dev->channel_opened = SRAM_CH06;
pix_format = (dev->pixel_formats[dev->channel_opened] == PIXEL_FRMT_411) ? V4L2_PIX_FMT_Y41P : V4L2_PIX_FMT_YUYV;
v4l2_prio_open(&dev->prio,&fh->prio);
videobuf_queue_sg_init(&fh->vidq, &cx25821_video_qops,
- &dev->pci->dev, &dev->slock,
- V4L2_BUF_TYPE_VIDEO_CAPTURE,
- V4L2_FIELD_INTERLACED,
- sizeof(struct cx25821_buffer),
- fh);
+ &dev->pci->dev, &dev->slock,
+ V4L2_BUF_TYPE_VIDEO_CAPTURE,
+ V4L2_FIELD_INTERLACED,
+ sizeof(struct cx25821_buffer),
+ fh);
dprintk(1, "post videobuf_queue_init()\n");
unlock_kernel();
switch (fh->type)
{
- case V4L2_BUF_TYPE_VIDEO_CAPTURE:
- if (res_locked(fh->dev, RESOURCE_VIDEO6))
- return -EBUSY;
+ case V4L2_BUF_TYPE_VIDEO_CAPTURE:
+ if (res_locked(fh->dev, RESOURCE_VIDEO6))
+ return -EBUSY;
- return videobuf_read_one(&fh->vidq, data, count, ppos, file->f_flags & O_NONBLOCK);
+ return videobuf_read_one(&fh->vidq, data, count, ppos, file->f_flags & O_NONBLOCK);
- default:
- BUG();
- return 0;
+ default:
+ BUG();
+ return 0;
}
}
struct cx25821_buffer *buf;
if (res_check(fh, RESOURCE_VIDEO6)) {
- /* streaming capture */
- if (list_empty(&fh->vidq.stream))
- return POLLERR;
- buf = list_entry(fh->vidq.stream.next,
- struct cx25821_buffer, vb.stream);
+ /* streaming capture */
+ if (list_empty(&fh->vidq.stream))
+ return POLLERR;
+ buf = list_entry(fh->vidq.stream.next,
+ struct cx25821_buffer, vb.stream);
} else {
- /* read() capture */
- buf = (struct cx25821_buffer *)fh->vidq.read_buf;
- if (NULL == buf)
- return POLLERR;
+ /* read() capture */
+ buf = (struct cx25821_buffer *)fh->vidq.read_buf;
+ if (NULL == buf)
+ return POLLERR;
}
poll_wait(file, &buf->vb.done, wait);
if (buf->vb.state == VIDEOBUF_DONE || buf->vb.state == VIDEOBUF_ERROR)
- {
- if( buf->vb.state == VIDEOBUF_DONE )
- {
- struct cx25821_dev *dev = fh->dev;
-
- if( dev && dev->use_cif_resolution[SRAM_CH06] )
- {
- u8 cam_id = *((char*)buf->vb.baddr+3);
- memcpy((char*)buf->vb.baddr, (char*)buf->vb.baddr + (fh->width * 2), (fh->width * 2));
- *((char*)buf->vb.baddr+3) = cam_id;
- }
- }
-
- return POLLIN|POLLRDNORM;
+ {
+ if( buf->vb.state == VIDEOBUF_DONE )
+ {
+ struct cx25821_dev *dev = fh->dev;
+
+ if( dev && dev->use_cif_resolution[SRAM_CH06] )
+ {
+ u8 cam_id = *((char*)buf->vb.baddr+3);
+ memcpy((char*)buf->vb.baddr, (char*)buf->vb.baddr + (fh->width * 2), (fh->width * 2));
+ *((char*)buf->vb.baddr+3) = cam_id;
+ }
+ }
+
+ return POLLIN|POLLRDNORM;
}
-
+
return 0;
}
/* stop video capture */
if (res_check(fh, RESOURCE_VIDEO6)) {
- videobuf_queue_cancel(&fh->vidq);
- res_free(dev, fh, RESOURCE_VIDEO6);
+ videobuf_queue_cancel(&fh->vidq);
+ res_free(dev, fh, RESOURCE_VIDEO6);
}
if (fh->vidq.read_buf) {
- buffer_release(&fh->vidq, fh->vidq.read_buf);
- kfree(fh->vidq.read_buf);
+ buffer_release(&fh->vidq, fh->vidq.read_buf);
+ kfree(fh->vidq.read_buf);
}
videobuf_mmap_free(&fh->vidq);
if (unlikely(fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE))
{
- return -EINVAL;
+ return -EINVAL;
}
if (unlikely(i != fh->type))
{
- return -EINVAL;
+ return -EINVAL;
}
if (unlikely(!res_get(dev, fh, get_resource(fh, RESOURCE_VIDEO6))))
{
- return -EBUSY;
+ return -EBUSY;
}
return videobuf_streamon(get_queue(fh));
int err, res;
if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
- return -EINVAL;
+ return -EINVAL;
if (i != fh->type)
- return -EINVAL;
+ return -EINVAL;
res = get_resource(fh, RESOURCE_VIDEO6);
err = videobuf_streamoff(get_queue(fh));
if (err < 0)
- return err;
+ return err;
res_free(dev, fh, res);
return 0;
}
{
struct cx25821_fh *fh = priv;
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
- int err;
+ int err;
int pix_format = 0;
-
- if (fh)
+
+ if (fh)
{
- err = v4l2_prio_check(&dev->prio, &fh->prio);
- if (0 != err)
- return err;
+ err = v4l2_prio_check(&dev->prio, &fh->prio);
+ if (0 != err)
+ return err;
}
dprintk(2, "%s()\n", __func__);
err = vidioc_try_fmt_vid_cap(file, priv, f);
if (0 != err)
- return err;
+ return err;
fh->fmt = format_by_fourcc(f->fmt.pix.pixelformat);
fh->vidq.field = f->fmt.pix.field;
// check if width and height is valid based on set standard
if (is_valid_width(f->fmt.pix.width, dev->tvnorm))
{
- fh->width = f->fmt.pix.width;
+ fh->width = f->fmt.pix.width;
}
if (is_valid_height(f->fmt.pix.height, dev->tvnorm))
{
- fh->height = f->fmt.pix.height;
+ fh->height = f->fmt.pix.height;
}
if (f->fmt.pix.pixelformat == V4L2_PIX_FMT_Y41P)
- pix_format = PIXEL_FRMT_411;
+ pix_format = PIXEL_FRMT_411;
else if (f->fmt.pix.pixelformat == V4L2_PIX_FMT_YUYV)
- pix_format = PIXEL_FRMT_422;
+ pix_format = PIXEL_FRMT_422;
else
- return -EINVAL;
+ return -EINVAL;
+
+ cx25821_set_pixel_format( dev, SRAM_CH06, pix_format );
- cx25821_set_pixel_format( dev, SRAM_CH06, pix_format );
-
// check if cif resolution
if (fh->width == 320 || fh->width == 352)
{
- dev->use_cif_resolution[SRAM_CH06] = 1;
+ dev->use_cif_resolution[SRAM_CH06] = 1;
}else
{
dev->use_cif_resolution[SRAM_CH06] = 0;
}
dev->cif_width[SRAM_CH06] = fh->width;
- medusa_set_resolution( dev, fh->width, SRAM_CH06 );
+ medusa_set_resolution( dev, fh->width, SRAM_CH06 );
dprintk(2, "%s() width=%d height=%d field=%d\n", __func__, fh->width, fh->height, fh->vidq.field);
cx25821_call_all(dev, video, s_fmt, f);
struct cx25821_fh *fh = priv;
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
- ret_val = videobuf_dqbuf(get_queue(fh), p, file->f_flags & O_NONBLOCK);
+ ret_val = videobuf_dqbuf(get_queue(fh), p, file->f_flags & O_NONBLOCK);
p->sequence = dev->vidq[SRAM_CH06].count;
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
char name[32 + 2];
- struct sram_channel *sram_ch = &dev->sram_channels[SRAM_CH06];
+ struct sram_channel *sram_ch = &dev->sram_channels[SRAM_CH06];
u32 tmp = 0;
snprintf(name, sizeof(name), "%s/2", dev->name);
printk(KERN_INFO "%s/2: ============ START LOG STATUS ============\n",
dev->name);
cx25821_call_all(dev, core, log_status);
-
+
tmp = cx_read(sram_ch->dma_ctl);
printk(KERN_INFO "Video input 6 is %s\n", (tmp & 0x11)?"streaming" : "stopped");
printk(KERN_INFO "%s/2: ============= END LOG STATUS =============\n",
struct v4l2_control *ctl)
{
struct cx25821_fh *fh = priv;
- struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
- int err;
+ struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
+ int err;
- if (fh) {
+ if (fh) {
err = v4l2_prio_check(&dev->prio, &fh->prio);
if (0 != err)
return err;
/*
* Driver for the Conexant CX25821 PCIe bridge
*
- * Copyright (C) 2009 Conexant Systems Inc.
+ * Copyright (C) 2009 Conexant Systems Inc.
* Authors <shu.lin@conexant.com>, <hiep.huynh@conexant.com>
* Based on Steven Toth <stoth@linuxtv.org> cx23885 driver
*
buf->risc.jmp[1] = cpu_to_le32(q->stopper.dma);
buf->risc.jmp[2] = cpu_to_le32(0); /* bits 63-32 */
- dprintk(2, "jmp to stopper (0x%x)\n", buf->risc.jmp[1]);
+ dprintk(2, "jmp to stopper (0x%x)\n", buf->risc.jmp[1]);
if (!list_empty(&q->queued)) {
- list_add_tail(&buf->vb.queue, &q->queued);
- buf->vb.state = VIDEOBUF_QUEUED;
- dprintk(2, "[%p/%d] buffer_queue - append to queued\n", buf, buf->vb.i);
+ list_add_tail(&buf->vb.queue, &q->queued);
+ buf->vb.state = VIDEOBUF_QUEUED;
+ dprintk(2, "[%p/%d] buffer_queue - append to queued\n", buf, buf->vb.i);
} else if (list_empty(&q->active)) {
- list_add_tail(&buf->vb.queue, &q->active);
- cx25821_start_video_dma(dev, q, buf, &dev->sram_channels[SRAM_CH07]);
- buf->vb.state = VIDEOBUF_ACTIVE;
- buf->count = q->count++;
- mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
- dprintk(2, "[%p/%d] buffer_queue - first active, buf cnt = %d, q->count = %d\n",
- buf, buf->vb. i, buf->count, q->count);
+ list_add_tail(&buf->vb.queue, &q->active);
+ cx25821_start_video_dma(dev, q, buf, &dev->sram_channels[SRAM_CH07]);
+ buf->vb.state = VIDEOBUF_ACTIVE;
+ buf->count = q->count++;
+ mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
+ dprintk(2, "[%p/%d] buffer_queue - first active, buf cnt = %d, q->count = %d\n",
+ buf, buf->vb. i, buf->count, q->count);
} else {
- prev = list_entry(q->active.prev, struct cx25821_buffer, vb.queue);
- if (prev->vb.width == buf->vb.width &&
- prev->vb.height == buf->vb.height &&
- prev->fmt == buf->fmt) {
- list_add_tail(&buf->vb.queue, &q->active);
- buf->vb.state = VIDEOBUF_ACTIVE;
- buf->count = q->count++;
- prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
-
- /* 64 bit bits 63-32 */
- prev->risc.jmp[2] = cpu_to_le32(0);
- dprintk(2, "[%p/%d] buffer_queue - append to active, buf->count=%d\n", buf, buf->vb.i, buf->count);
-
- } else {
- list_add_tail(&buf->vb.queue, &q->queued);
- buf->vb.state = VIDEOBUF_QUEUED;
- dprintk(2, "[%p/%d] buffer_queue - first queued\n", buf, buf->vb.i);
- }
+ prev = list_entry(q->active.prev, struct cx25821_buffer, vb.queue);
+ if (prev->vb.width == buf->vb.width &&
+ prev->vb.height == buf->vb.height &&
+ prev->fmt == buf->fmt) {
+ list_add_tail(&buf->vb.queue, &q->active);
+ buf->vb.state = VIDEOBUF_ACTIVE;
+ buf->count = q->count++;
+ prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
+
+ /* 64 bit bits 63-32 */
+ prev->risc.jmp[2] = cpu_to_le32(0);
+ dprintk(2, "[%p/%d] buffer_queue - append to active, buf->count=%d\n", buf, buf->vb.i, buf->count);
+
+ } else {
+ list_add_tail(&buf->vb.queue, &q->queued);
+ buf->vb.state = VIDEOBUF_QUEUED;
+ dprintk(2, "[%p/%d] buffer_queue - first queued\n", buf, buf->vb.i);
+ }
}
if (list_empty(&q->active))
lock_kernel();
list_for_each(list, &cx25821_devlist)
{
- h = list_entry(list, struct cx25821_dev, devlist);
+ h = list_entry(list, struct cx25821_dev, devlist);
- if (h->video_dev[SRAM_CH07] && h->video_dev[SRAM_CH07]->minor == minor) {
- dev = h;
- type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- }
+ if (h->video_dev[SRAM_CH07] && h->video_dev[SRAM_CH07]->minor == minor) {
+ dev = h;
+ type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ }
}
if (NULL == dev) {
- unlock_kernel();
- return -ENODEV;
+ unlock_kernel();
+ return -ENODEV;
}
printk("open minor=%d type=%s\n", minor, v4l2_type_names[type]);
/* allocate + initialize per filehandle data */
fh = kzalloc(sizeof(*fh), GFP_KERNEL);
if (NULL == fh) {
- unlock_kernel();
- return -ENOMEM;
+ unlock_kernel();
+ return -ENOMEM;
}
file->private_data = fh;
fh->dev = dev;
fh->width = 720;
if(dev->tvnorm & V4L2_STD_PAL_BG || dev->tvnorm & V4L2_STD_PAL_DK)
- fh->height = 576;
+ fh->height = 576;
else
- fh->height = 480;
+ fh->height = 480;
- dev->channel_opened = SRAM_CH07;
+ dev->channel_opened = SRAM_CH07;
pix_format = (dev->pixel_formats[dev->channel_opened] == PIXEL_FRMT_411) ? V4L2_PIX_FMT_Y41P : V4L2_PIX_FMT_YUYV;
fh->fmt = format_by_fourcc(pix_format);
v4l2_prio_open(&dev->prio,&fh->prio);
videobuf_queue_sg_init(&fh->vidq, &cx25821_video_qops,
- &dev->pci->dev, &dev->slock,
- V4L2_BUF_TYPE_VIDEO_CAPTURE,
- V4L2_FIELD_INTERLACED,
- sizeof(struct cx25821_buffer),
- fh);
+ &dev->pci->dev, &dev->slock,
+ V4L2_BUF_TYPE_VIDEO_CAPTURE,
+ V4L2_FIELD_INTERLACED,
+ sizeof(struct cx25821_buffer),
+ fh);
dprintk(1, "post videobuf_queue_init()\n");
unlock_kernel();
switch (fh->type)
{
- case V4L2_BUF_TYPE_VIDEO_CAPTURE:
- if (res_locked(fh->dev, RESOURCE_VIDEO7))
- return -EBUSY;
+ case V4L2_BUF_TYPE_VIDEO_CAPTURE:
+ if (res_locked(fh->dev, RESOURCE_VIDEO7))
+ return -EBUSY;
- return videobuf_read_one(&fh->vidq, data, count, ppos, file->f_flags & O_NONBLOCK);
+ return videobuf_read_one(&fh->vidq, data, count, ppos, file->f_flags & O_NONBLOCK);
- default:
- BUG();
- return 0;
+ default:
+ BUG();
+ return 0;
}
}
struct cx25821_buffer *buf;
if (res_check(fh, RESOURCE_VIDEO7)) {
- /* streaming capture */
- if (list_empty(&fh->vidq.stream))
- return POLLERR;
- buf = list_entry(fh->vidq.stream.next,
- struct cx25821_buffer, vb.stream);
+ /* streaming capture */
+ if (list_empty(&fh->vidq.stream))
+ return POLLERR;
+ buf = list_entry(fh->vidq.stream.next,
+ struct cx25821_buffer, vb.stream);
} else {
- /* read() capture */
- buf = (struct cx25821_buffer *)fh->vidq.read_buf;
- if (NULL == buf)
- return POLLERR;
+ /* read() capture */
+ buf = (struct cx25821_buffer *)fh->vidq.read_buf;
+ if (NULL == buf)
+ return POLLERR;
}
poll_wait(file, &buf->vb.done, wait);
if (buf->vb.state == VIDEOBUF_DONE || buf->vb.state == VIDEOBUF_ERROR)
{
- if( buf->vb.state == VIDEOBUF_DONE )
- {
- struct cx25821_dev *dev = fh->dev;
-
- if( dev && dev->use_cif_resolution[SRAM_CH07] )
- {
- u8 cam_id = *((char*)buf->vb.baddr+3);
- memcpy((char*)buf->vb.baddr, (char*)buf->vb.baddr + (fh->width * 2), (fh->width * 2));
- *((char*)buf->vb.baddr+3) = cam_id;
- }
- }
-
- return POLLIN|POLLRDNORM;
+ if( buf->vb.state == VIDEOBUF_DONE )
+ {
+ struct cx25821_dev *dev = fh->dev;
+
+ if( dev && dev->use_cif_resolution[SRAM_CH07] )
+ {
+ u8 cam_id = *((char*)buf->vb.baddr+3);
+ memcpy((char*)buf->vb.baddr, (char*)buf->vb.baddr + (fh->width * 2), (fh->width * 2));
+ *((char*)buf->vb.baddr+3) = cam_id;
+ }
+ }
+
+ return POLLIN|POLLRDNORM;
}
return 0;
/* stop video capture */
if (res_check(fh, RESOURCE_VIDEO7)) {
- videobuf_queue_cancel(&fh->vidq);
- res_free(dev, fh, RESOURCE_VIDEO7);
+ videobuf_queue_cancel(&fh->vidq);
+ res_free(dev, fh, RESOURCE_VIDEO7);
}
if (fh->vidq.read_buf) {
- buffer_release(&fh->vidq, fh->vidq.read_buf);
- kfree(fh->vidq.read_buf);
+ buffer_release(&fh->vidq, fh->vidq.read_buf);
+ kfree(fh->vidq.read_buf);
}
videobuf_mmap_free(&fh->vidq);
if (unlikely(fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE))
{
- return -EINVAL;
+ return -EINVAL;
}
if (unlikely(i != fh->type))
{
- return -EINVAL;
+ return -EINVAL;
}
if (unlikely(!res_get(dev, fh, get_resource(fh, RESOURCE_VIDEO7))))
{
- return -EBUSY;
+ return -EBUSY;
}
return videobuf_streamon(get_queue(fh));
int err, res;
if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
- return -EINVAL;
+ return -EINVAL;
if (i != fh->type)
- return -EINVAL;
+ return -EINVAL;
res = get_resource(fh, RESOURCE_VIDEO7);
err = videobuf_streamoff(get_queue(fh));
if (err < 0)
- return err;
+ return err;
res_free(dev, fh, res);
return 0;
}
{
struct cx25821_fh *fh = priv;
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
- int err;
+ int err;
int pix_format = 0;
-
- if (fh)
+
+ if (fh)
{
- err = v4l2_prio_check(&dev->prio, &fh->prio);
- if (0 != err)
+ err = v4l2_prio_check(&dev->prio, &fh->prio);
+ if (0 != err)
return err;
}
err = vidioc_try_fmt_vid_cap(file, priv, f);
if (0 != err)
- return err;
+ return err;
fh->fmt = format_by_fourcc(f->fmt.pix.pixelformat);
fh->vidq.field = f->fmt.pix.field;
// check if width and height is valid based on set standard
if (is_valid_width(f->fmt.pix.width, dev->tvnorm))
{
- fh->width = f->fmt.pix.width;
+ fh->width = f->fmt.pix.width;
}
if (is_valid_height(f->fmt.pix.height, dev->tvnorm))
{
- fh->height = f->fmt.pix.height;
+ fh->height = f->fmt.pix.height;
}
if (f->fmt.pix.pixelformat == V4L2_PIX_FMT_Y41P)
- pix_format = PIXEL_FRMT_411;
+ pix_format = PIXEL_FRMT_411;
else if (f->fmt.pix.pixelformat == V4L2_PIX_FMT_YUYV)
- pix_format = PIXEL_FRMT_422;
+ pix_format = PIXEL_FRMT_422;
else
- return -EINVAL;
+ return -EINVAL;
+
+ cx25821_set_pixel_format( dev, SRAM_CH07, pix_format );
- cx25821_set_pixel_format( dev, SRAM_CH07, pix_format );
-
// check if cif resolution
if (fh->width == 320 || fh->width == 352)
{
- dev->use_cif_resolution[SRAM_CH07] = 1;
+ dev->use_cif_resolution[SRAM_CH07] = 1;
}else
{
dev->use_cif_resolution[SRAM_CH07] = 0;
}
dev->cif_width[SRAM_CH07] = fh->width;
- medusa_set_resolution( dev, fh->width, SRAM_CH07 );
+ medusa_set_resolution( dev, fh->width, SRAM_CH07 );
dprintk(2, "%s() width=%d height=%d field=%d\n", __func__, fh->width, fh->height, fh->vidq.field);
cx25821_call_all(dev, video, s_fmt, f);
struct cx25821_fh *fh = priv;
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
- ret_val = videobuf_dqbuf(get_queue(fh), p, file->f_flags & O_NONBLOCK);
+ ret_val = videobuf_dqbuf(get_queue(fh), p, file->f_flags & O_NONBLOCK);
p->sequence = dev->vidq[SRAM_CH07].count;
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
char name[32 + 2];
- struct sram_channel *sram_ch = &dev->sram_channels[SRAM_CH07];
+ struct sram_channel *sram_ch = &dev->sram_channels[SRAM_CH07];
u32 tmp = 0;
snprintf(name, sizeof(name), "%s/2", dev->name);
printk(KERN_INFO "%s/2: ============ START LOG STATUS ============\n",
dev->name);
cx25821_call_all(dev, core, log_status);
-
+
tmp = cx_read(sram_ch->dma_ctl);
printk(KERN_INFO "Video input 7 is %s\n", (tmp & 0x11)?"streaming" : "stopped");
printk(KERN_INFO "%s/2: ============= END LOG STATUS =============\n",
struct v4l2_control *ctl)
{
struct cx25821_fh *fh = priv;
- struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
- int err;
+ struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
+ int err;
- if (fh) {
+ if (fh) {
err = v4l2_prio_check(&dev->prio, &fh->prio);
if (0 != err)
return err;
/*
* Driver for the Conexant CX25821 PCIe bridge
*
- * Copyright (C) 2009 Conexant Systems Inc.
+ * Copyright (C) 2009 Conexant Systems Inc.
* Authors <shu.lin@conexant.com>, <hiep.huynh@conexant.com>
* Based on Steven Toth <stoth@linuxtv.org> cx23885 driver
*
dprintk(2, "jmp to stopper (0x%x)\n", buf->risc.jmp[1]);
if (!list_empty(&q->queued)) {
- list_add_tail(&buf->vb.queue, &q->queued);
- buf->vb.state = VIDEOBUF_QUEUED;
- dprintk(2, "[%p/%d] buffer_queue - append to queued\n", buf, buf->vb.i);
+ list_add_tail(&buf->vb.queue, &q->queued);
+ buf->vb.state = VIDEOBUF_QUEUED;
+ dprintk(2, "[%p/%d] buffer_queue - append to queued\n", buf, buf->vb.i);
} else if (list_empty(&q->active)) {
- list_add_tail(&buf->vb.queue, &q->active);
- cx25821_start_video_dma(dev, q, buf, &dev->sram_channels[VIDEO_IOCTL_CH]);
- buf->vb.state = VIDEOBUF_ACTIVE;
- buf->count = q->count++;
- mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
- dprintk(2, "[%p/%d] buffer_queue - first active, buf cnt = %d, q->count = %d\n",
- buf, buf->vb. i, buf->count, q->count);
+ list_add_tail(&buf->vb.queue, &q->active);
+ cx25821_start_video_dma(dev, q, buf, &dev->sram_channels[VIDEO_IOCTL_CH]);
+ buf->vb.state = VIDEOBUF_ACTIVE;
+ buf->count = q->count++;
+ mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
+ dprintk(2, "[%p/%d] buffer_queue - first active, buf cnt = %d, q->count = %d\n",
+ buf, buf->vb. i, buf->count, q->count);
} else {
- prev = list_entry(q->active.prev, struct cx25821_buffer, vb.queue);
- if (prev->vb.width == buf->vb.width &&
- prev->vb.height == buf->vb.height &&
- prev->fmt == buf->fmt) {
- list_add_tail(&buf->vb.queue, &q->active);
- buf->vb.state = VIDEOBUF_ACTIVE;
- buf->count = q->count++;
- prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
-
- /* 64 bit bits 63-32 */
- prev->risc.jmp[2] = cpu_to_le32(0);
- dprintk(2, "[%p/%d] buffer_queue - append to active, buf->count=%d\n", buf, buf->vb.i, buf->count);
-
- } else {
- list_add_tail(&buf->vb.queue, &q->queued);
- buf->vb.state = VIDEOBUF_QUEUED;
- dprintk(2, "[%p/%d] buffer_queue - first queued\n", buf, buf->vb.i);
- }
+ prev = list_entry(q->active.prev, struct cx25821_buffer, vb.queue);
+ if (prev->vb.width == buf->vb.width &&
+ prev->vb.height == buf->vb.height &&
+ prev->fmt == buf->fmt) {
+ list_add_tail(&buf->vb.queue, &q->active);
+ buf->vb.state = VIDEOBUF_ACTIVE;
+ buf->count = q->count++;
+ prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
+
+ /* 64 bit bits 63-32 */
+ prev->risc.jmp[2] = cpu_to_le32(0);
+ dprintk(2, "[%p/%d] buffer_queue - append to active, buf->count=%d\n", buf, buf->vb.i, buf->count);
+
+ } else {
+ list_add_tail(&buf->vb.queue, &q->queued);
+ buf->vb.state = VIDEOBUF_QUEUED;
+ dprintk(2, "[%p/%d] buffer_queue - first queued\n", buf, buf->vb.i);
+ }
}
if (list_empty(&q->active))
lock_kernel();
list_for_each(list, &cx25821_devlist)
{
- h = list_entry(list, struct cx25821_dev, devlist);
+ h = list_entry(list, struct cx25821_dev, devlist);
- if (h->ioctl_dev && h->ioctl_dev->minor == minor)
- {
- dev = h;
- type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- }
+ if (h->ioctl_dev && h->ioctl_dev->minor == minor)
+ {
+ dev = h;
+ type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ }
}
if (NULL == dev) {
- unlock_kernel();
- return -ENODEV;
+ unlock_kernel();
+ return -ENODEV;
}
printk("open minor=%d type=%s\n", minor, v4l2_type_names[type]);
/* allocate + initialize per filehandle data */
fh = kzalloc(sizeof(*fh), GFP_KERNEL);
if (NULL == fh) {
- unlock_kernel();
- return -ENOMEM;
+ unlock_kernel();
+ return -ENOMEM;
}
file->private_data = fh;
fh->width = 720;
if(dev->tvnorm & V4L2_STD_PAL_BG || dev->tvnorm & V4L2_STD_PAL_DK)
- fh->height = 576;
+ fh->height = 576;
else
- fh->height = 480;
+ fh->height = 480;
dev->channel_opened = VIDEO_IOCTL_CH;
pix_format = V4L2_PIX_FMT_YUYV;
fh->fmt = format_by_fourcc(pix_format);
-
+
v4l2_prio_open(&dev->prio,&fh->prio);
videobuf_queue_sg_init(&fh->vidq, &cx25821_video_qops,
- &dev->pci->dev, &dev->slock,
- V4L2_BUF_TYPE_VIDEO_CAPTURE,
- V4L2_FIELD_INTERLACED,
- sizeof(struct cx25821_buffer),
- fh);
+ &dev->pci->dev, &dev->slock,
+ V4L2_BUF_TYPE_VIDEO_CAPTURE,
+ V4L2_FIELD_INTERLACED,
+ sizeof(struct cx25821_buffer),
+ fh);
dprintk(1, "post videobuf_queue_init()\n");
unlock_kernel();
switch (fh->type)
{
- case V4L2_BUF_TYPE_VIDEO_CAPTURE:
- if (res_locked(fh->dev, RESOURCE_VIDEO_IOCTL))
- return -EBUSY;
+ case V4L2_BUF_TYPE_VIDEO_CAPTURE:
+ if (res_locked(fh->dev, RESOURCE_VIDEO_IOCTL))
+ return -EBUSY;
- return videobuf_read_one(&fh->vidq, data, count, ppos, file->f_flags & O_NONBLOCK);
+ return videobuf_read_one(&fh->vidq, data, count, ppos, file->f_flags & O_NONBLOCK);
- default:
- BUG();
- return 0;
+ default:
+ BUG();
+ return 0;
}
}
struct cx25821_buffer *buf;
if (res_check(fh, RESOURCE_VIDEO_IOCTL)) {
- /* streaming capture */
- if (list_empty(&fh->vidq.stream))
- return POLLERR;
- buf = list_entry(fh->vidq.stream.next,
- struct cx25821_buffer, vb.stream);
+ /* streaming capture */
+ if (list_empty(&fh->vidq.stream))
+ return POLLERR;
+ buf = list_entry(fh->vidq.stream.next,
+ struct cx25821_buffer, vb.stream);
} else {
- /* read() capture */
- buf = (struct cx25821_buffer *)fh->vidq.read_buf;
- if (NULL == buf)
- return POLLERR;
+ /* read() capture */
+ buf = (struct cx25821_buffer *)fh->vidq.read_buf;
+ if (NULL == buf)
+ return POLLERR;
}
poll_wait(file, &buf->vb.done, wait);
- if (buf->vb.state == VIDEOBUF_DONE || buf->vb.state == VIDEOBUF_ERROR)
- return POLLIN|POLLRDNORM;
-
+ if (buf->vb.state == VIDEOBUF_DONE || buf->vb.state == VIDEOBUF_ERROR)
+ return POLLIN|POLLRDNORM;
+
return 0;
}
static int video_release(struct file *file)
{
struct cx25821_fh *fh = file->private_data;
- struct cx25821_dev *dev = fh->dev;
+ struct cx25821_dev *dev = fh->dev;
/* stop video capture */
if (res_check(fh, RESOURCE_VIDEO_IOCTL)) {
- videobuf_queue_cancel(&fh->vidq);
- res_free(dev, fh, RESOURCE_VIDEO_IOCTL);
+ videobuf_queue_cancel(&fh->vidq);
+ res_free(dev, fh, RESOURCE_VIDEO_IOCTL);
}
if (fh->vidq.read_buf) {
- buffer_release(&fh->vidq, fh->vidq.read_buf);
- kfree(fh->vidq.read_buf);
+ buffer_release(&fh->vidq, fh->vidq.read_buf);
+ kfree(fh->vidq.read_buf);
}
videobuf_mmap_free(&fh->vidq);
if (unlikely(fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE))
{
- return -EINVAL;
+ return -EINVAL;
}
if (unlikely(i != fh->type))
{
- return -EINVAL;
+ return -EINVAL;
}
if (unlikely(!res_get(dev, fh, get_resource(fh, RESOURCE_VIDEO_IOCTL))))
{
- return -EBUSY;
+ return -EBUSY;
}
return videobuf_streamon(get_queue(fh));
int err, res;
if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
- return -EINVAL;
+ return -EINVAL;
if (i != fh->type)
- return -EINVAL;
+ return -EINVAL;
res = get_resource(fh, RESOURCE_VIDEO_IOCTL);
err = videobuf_streamoff(get_queue(fh));
if (err < 0)
- return err;
+ return err;
res_free(dev, fh, res);
return 0;
}
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
int err;
- if (fh)
+ if (fh)
{
- err = v4l2_prio_check(&dev->prio, &fh->prio);
- if (0 != err)
- return err;
+ err = v4l2_prio_check(&dev->prio, &fh->prio);
+ if (0 != err)
+ return err;
}
dprintk(2, "%s()\n", __func__);
err = vidioc_try_fmt_vid_cap(file, priv, f);
if (0 != err)
- return err;
+ return err;
fh->fmt = format_by_fourcc(f->fmt.pix.pixelformat);
fh->width = f->fmt.pix.width;
fh->height = f->fmt.pix.height;
return videobuf_dqbuf(get_queue(fh), p, file->f_flags & O_NONBLOCK);
}
-static long video_ioctl_set(struct file *file, unsigned int cmd, unsigned long arg)
-{
+static long video_ioctl_set(struct file *file, unsigned int cmd, unsigned long arg)
+{
struct cx25821_fh *fh = file->private_data;
struct cx25821_dev *dev = fh->dev;
struct downstream_user_struct *data_from_user;
int cif_enable = 0, cif_width = 0;
u32 value = 0;
-
+
data_from_user = (struct downstream_user_struct *)arg;
-
+
if( !data_from_user )
{
- printk("cx25821 in %s(): User data is INVALID. Returning.\n", __func__);
- return 0;
+ printk("cx25821 in %s(): User data is INVALID. Returning.\n", __func__);
+ return 0;
}
-
+
command = data_from_user->command;
-
- if( command != SET_VIDEO_STD && command != SET_PIXEL_FORMAT && command != ENABLE_CIF_RESOLUTION &&
- command != REG_READ && command != REG_WRITE && command != MEDUSA_READ && command != MEDUSA_WRITE)
+
+ if( command != SET_VIDEO_STD && command != SET_PIXEL_FORMAT && command != ENABLE_CIF_RESOLUTION &&
+ command != REG_READ && command != REG_WRITE && command != MEDUSA_READ && command != MEDUSA_WRITE)
{
- return 0;
+ return 0;
}
-
-
+
+
switch(command)
- {
- case SET_VIDEO_STD:
- dev->tvnorm = !strcmp(data_from_user->vid_stdname,"PAL") ? V4L2_STD_PAL_BG : V4L2_STD_NTSC_M;
- medusa_set_videostandard(dev);
- break;
-
- case SET_PIXEL_FORMAT:
- selected_channel = data_from_user->decoder_select;
- pix_format = data_from_user->pixel_format;
-
- if( !(selected_channel <= 7 && selected_channel >= 0) )
- {
- selected_channel -= 4;
- selected_channel = selected_channel % 8;
- }
-
- if( selected_channel >= 0 )
- cx25821_set_pixel_format( dev, selected_channel, pix_format );
-
- break;
-
- case ENABLE_CIF_RESOLUTION:
- selected_channel = data_from_user->decoder_select;
- cif_enable = data_from_user->cif_resolution_enable;
- cif_width = data_from_user->cif_width;
-
- if( cif_enable )
- {
- if( dev->tvnorm & V4L2_STD_PAL_BG || dev->tvnorm & V4L2_STD_PAL_DK )
- width = 352;
- else
- width = (cif_width == 320 || cif_width == 352) ? cif_width : 320;
- }
-
- if( !(selected_channel <= 7 && selected_channel >= 0) )
- {
- selected_channel -= 4;
- selected_channel = selected_channel % 8;
- }
-
-
- if( selected_channel <= 7 && selected_channel >= 0 )
- {
- dev->use_cif_resolution[selected_channel] = cif_enable;
- dev->cif_width[selected_channel] = width;
- }
- else
- {
- for( i=0; i < VID_CHANNEL_NUM; i++ )
- {
- dev->use_cif_resolution[i] = cif_enable;
- dev->cif_width[i] = width;
- }
- }
-
- medusa_set_resolution( dev, width, selected_channel );
- break;
- case REG_READ:
- data_from_user->reg_data = cx_read(data_from_user->reg_address);
- break;
- case REG_WRITE:
- cx_write(data_from_user->reg_address, data_from_user->reg_data);
- break;
- case MEDUSA_READ:
- value = cx25821_i2c_read(&dev->i2c_bus[0], (u16)data_from_user->reg_address, &data_from_user->reg_data);
- break;
- case MEDUSA_WRITE:
- cx25821_i2c_write(&dev->i2c_bus[0], (u16)data_from_user->reg_address, data_from_user->reg_data);
- break;
+ {
+ case SET_VIDEO_STD:
+ dev->tvnorm = !strcmp(data_from_user->vid_stdname,"PAL") ? V4L2_STD_PAL_BG : V4L2_STD_NTSC_M;
+ medusa_set_videostandard(dev);
+ break;
+
+ case SET_PIXEL_FORMAT:
+ selected_channel = data_from_user->decoder_select;
+ pix_format = data_from_user->pixel_format;
+
+ if( !(selected_channel <= 7 && selected_channel >= 0) )
+ {
+ selected_channel -= 4;
+ selected_channel = selected_channel % 8;
+ }
+
+ if( selected_channel >= 0 )
+ cx25821_set_pixel_format( dev, selected_channel, pix_format );
+
+ break;
+
+ case ENABLE_CIF_RESOLUTION:
+ selected_channel = data_from_user->decoder_select;
+ cif_enable = data_from_user->cif_resolution_enable;
+ cif_width = data_from_user->cif_width;
+
+ if( cif_enable )
+ {
+ if( dev->tvnorm & V4L2_STD_PAL_BG || dev->tvnorm & V4L2_STD_PAL_DK )
+ width = 352;
+ else
+ width = (cif_width == 320 || cif_width == 352) ? cif_width : 320;
+ }
+
+ if( !(selected_channel <= 7 && selected_channel >= 0) )
+ {
+ selected_channel -= 4;
+ selected_channel = selected_channel % 8;
+ }
+
+
+ if( selected_channel <= 7 && selected_channel >= 0 )
+ {
+ dev->use_cif_resolution[selected_channel] = cif_enable;
+ dev->cif_width[selected_channel] = width;
+ }
+ else
+ {
+ for( i=0; i < VID_CHANNEL_NUM; i++ )
+ {
+ dev->use_cif_resolution[i] = cif_enable;
+ dev->cif_width[i] = width;
+ }
+ }
+
+ medusa_set_resolution( dev, width, selected_channel );
+ break;
+ case REG_READ:
+ data_from_user->reg_data = cx_read(data_from_user->reg_address);
+ break;
+ case REG_WRITE:
+ cx_write(data_from_user->reg_address, data_from_user->reg_data);
+ break;
+ case MEDUSA_READ:
+ value = cx25821_i2c_read(&dev->i2c_bus[0], (u16)data_from_user->reg_address, &data_from_user->reg_data);
+ break;
+ case MEDUSA_WRITE:
+ cx25821_i2c_write(&dev->i2c_bus[0], (u16)data_from_user->reg_address, data_from_user->reg_data);
+ break;
}
-
+
return 0;
}
struct cx25821_fh *fh = priv;
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
int err;
-
- if (fh)
+
+ if (fh)
{
- err = v4l2_prio_check(&dev->prio, &fh->prio);
- if (0 != err)
- return err;
+ err = v4l2_prio_check(&dev->prio, &fh->prio);
+ if (0 != err)
+ return err;
}
return 0;
/*
* Driver for the Conexant CX25821 PCIe bridge
*
- * Copyright (C) 2009 Conexant Systems Inc.
+ * Copyright (C) 2009 Conexant Systems Inc.
* Authors <shu.lin@conexant.com>, <hiep.huynh@conexant.com>
* Based on Steven Toth <stoth@linuxtv.org> cx23885 driver
*
dprintk(2, "jmp to stopper (0x%x)\n", buf->risc.jmp[1]);
if (!list_empty(&q->queued)) {
- list_add_tail(&buf->vb.queue, &q->queued);
- buf->vb.state = VIDEOBUF_QUEUED;
- dprintk(2, "[%p/%d] buffer_queue - append to queued\n", buf, buf->vb.i);
+ list_add_tail(&buf->vb.queue, &q->queued);
+ buf->vb.state = VIDEOBUF_QUEUED;
+ dprintk(2, "[%p/%d] buffer_queue - append to queued\n", buf, buf->vb.i);
} else if (list_empty(&q->active)) {
- list_add_tail(&buf->vb.queue, &q->active);
- cx25821_start_video_dma(dev, q, buf, &dev->sram_channels[SRAM_CH10]);
- buf->vb.state = VIDEOBUF_ACTIVE;
- buf->count = q->count++;
- mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
- dprintk(2, "[%p/%d] buffer_queue - first active, buf cnt = %d, q->count = %d\n",
- buf, buf->vb. i, buf->count, q->count);
+ list_add_tail(&buf->vb.queue, &q->active);
+ cx25821_start_video_dma(dev, q, buf, &dev->sram_channels[SRAM_CH10]);
+ buf->vb.state = VIDEOBUF_ACTIVE;
+ buf->count = q->count++;
+ mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
+ dprintk(2, "[%p/%d] buffer_queue - first active, buf cnt = %d, q->count = %d\n",
+ buf, buf->vb. i, buf->count, q->count);
} else {
- prev = list_entry(q->active.prev, struct cx25821_buffer, vb.queue);
- if (prev->vb.width == buf->vb.width &&
- prev->vb.height == buf->vb.height &&
- prev->fmt == buf->fmt) {
- list_add_tail(&buf->vb.queue, &q->active);
- buf->vb.state = VIDEOBUF_ACTIVE;
- buf->count = q->count++;
- prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
-
- /* 64 bit bits 63-32 */
- prev->risc.jmp[2] = cpu_to_le32(0);
- dprintk(2, "[%p/%d] buffer_queue - append to active, buf->count=%d\n", buf, buf->vb.i, buf->count);
-
- } else {
- list_add_tail(&buf->vb.queue, &q->queued);
- buf->vb.state = VIDEOBUF_QUEUED;
- dprintk(2, "[%p/%d] buffer_queue - first queued\n", buf, buf->vb.i);
- }
+ prev = list_entry(q->active.prev, struct cx25821_buffer, vb.queue);
+ if (prev->vb.width == buf->vb.width &&
+ prev->vb.height == buf->vb.height &&
+ prev->fmt == buf->fmt) {
+ list_add_tail(&buf->vb.queue, &q->active);
+ buf->vb.state = VIDEOBUF_ACTIVE;
+ buf->count = q->count++;
+ prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
+
+ /* 64 bit bits 63-32 */
+ prev->risc.jmp[2] = cpu_to_le32(0);
+ dprintk(2, "[%p/%d] buffer_queue - append to active, buf->count=%d\n", buf, buf->vb.i, buf->count);
+
+ } else {
+ list_add_tail(&buf->vb.queue, &q->queued);
+ buf->vb.state = VIDEOBUF_QUEUED;
+ dprintk(2, "[%p/%d] buffer_queue - first queued\n", buf, buf->vb.i);
+ }
}
if (list_empty(&q->active))
lock_kernel();
list_for_each(list, &cx25821_devlist)
{
- h = list_entry(list, struct cx25821_dev, devlist);
+ h = list_entry(list, struct cx25821_dev, devlist);
- if (h->video_dev[SRAM_CH10] && h->video_dev[SRAM_CH10]->minor == minor) {
- dev = h;
- type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- }
+ if (h->video_dev[SRAM_CH10] && h->video_dev[SRAM_CH10]->minor == minor) {
+ dev = h;
+ type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ }
}
if (NULL == dev) {
- unlock_kernel();
- return -ENODEV;
+ unlock_kernel();
+ return -ENODEV;
}
printk("open minor=%d type=%s\n", minor, v4l2_type_names[type]);
/* allocate + initialize per filehandle data */
fh = kzalloc(sizeof(*fh), GFP_KERNEL);
if (NULL == fh) {
- unlock_kernel();
- return -ENOMEM;
+ unlock_kernel();
+ return -ENOMEM;
}
file->private_data = fh;
fh->width = 720;
if(dev->tvnorm & V4L2_STD_PAL_BG || dev->tvnorm & V4L2_STD_PAL_DK)
- fh->height = 576;
+ fh->height = 576;
else
- fh->height = 480;
+ fh->height = 480;
+
-
dev->channel_opened = 9;
fh->fmt = format_by_fourcc(V4L2_PIX_FMT_YUYV);
v4l2_prio_open(&dev->prio,&fh->prio);
videobuf_queue_sg_init(&fh->vidq, &cx25821_video_qops,
- &dev->pci->dev, &dev->slock,
- V4L2_BUF_TYPE_VIDEO_CAPTURE,
- V4L2_FIELD_INTERLACED,
- sizeof(struct cx25821_buffer),
- fh);
+ &dev->pci->dev, &dev->slock,
+ V4L2_BUF_TYPE_VIDEO_CAPTURE,
+ V4L2_FIELD_INTERLACED,
+ sizeof(struct cx25821_buffer),
+ fh);
dprintk(1, "post videobuf_queue_init()\n");
unlock_kernel();
switch (fh->type)
{
- case V4L2_BUF_TYPE_VIDEO_CAPTURE:
- if (res_locked(fh->dev, RESOURCE_VIDEO10))
- return -EBUSY;
+ case V4L2_BUF_TYPE_VIDEO_CAPTURE:
+ if (res_locked(fh->dev, RESOURCE_VIDEO10))
+ return -EBUSY;
- return videobuf_read_one(&fh->vidq, data, count, ppos, file->f_flags & O_NONBLOCK);
+ return videobuf_read_one(&fh->vidq, data, count, ppos, file->f_flags & O_NONBLOCK);
- default:
- BUG();
- return 0;
+ default:
+ BUG();
+ return 0;
}
}
struct cx25821_buffer *buf;
if (res_check(fh, RESOURCE_VIDEO10)) {
- /* streaming capture */
- if (list_empty(&fh->vidq.stream))
- return POLLERR;
- buf = list_entry(fh->vidq.stream.next,
- struct cx25821_buffer, vb.stream);
+ /* streaming capture */
+ if (list_empty(&fh->vidq.stream))
+ return POLLERR;
+ buf = list_entry(fh->vidq.stream.next,
+ struct cx25821_buffer, vb.stream);
} else {
- /* read() capture */
- buf = (struct cx25821_buffer *)fh->vidq.read_buf;
- if (NULL == buf)
- return POLLERR;
+ /* read() capture */
+ buf = (struct cx25821_buffer *)fh->vidq.read_buf;
+ if (NULL == buf)
+ return POLLERR;
}
poll_wait(file, &buf->vb.done, wait);
if (buf->vb.state == VIDEOBUF_DONE || buf->vb.state == VIDEOBUF_ERROR)
- return POLLIN|POLLRDNORM;
+ return POLLIN|POLLRDNORM;
return 0;
}
struct cx25821_dev *dev = fh->dev;
//stop the risc engine and fifo
- //cx_write(channel10->dma_ctl, 0);
+ //cx_write(channel10->dma_ctl, 0);
/* stop video capture */
if (res_check(fh, RESOURCE_VIDEO10)) {
- videobuf_queue_cancel(&fh->vidq);
- res_free(dev, fh, RESOURCE_VIDEO10);
+ videobuf_queue_cancel(&fh->vidq);
+ res_free(dev, fh, RESOURCE_VIDEO10);
}
if (fh->vidq.read_buf) {
- buffer_release(&fh->vidq, fh->vidq.read_buf);
- kfree(fh->vidq.read_buf);
+ buffer_release(&fh->vidq, fh->vidq.read_buf);
+ kfree(fh->vidq.read_buf);
}
videobuf_mmap_free(&fh->vidq);
if (unlikely(fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE))
{
- return -EINVAL;
+ return -EINVAL;
}
if (unlikely(i != fh->type))
{
- return -EINVAL;
+ return -EINVAL;
}
if (unlikely(!res_get(dev, fh, get_resource(fh, RESOURCE_VIDEO10))))
{
- return -EBUSY;
+ return -EBUSY;
}
return videobuf_streamon(get_queue(fh));
int err, res;
if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
- return -EINVAL;
+ return -EINVAL;
if (i != fh->type)
- return -EINVAL;
+ return -EINVAL;
res = get_resource(fh, RESOURCE_VIDEO10);
err = videobuf_streamoff(get_queue(fh));
if (err < 0)
- return err;
+ return err;
res_free(dev, fh, res);
return 0;
}
-static long video_ioctl_upstream10(struct file *file, unsigned int cmd, unsigned long arg)
-{
+static long video_ioctl_upstream10(struct file *file, unsigned int cmd, unsigned long arg)
+{
struct cx25821_fh *fh = file->private_data;
struct cx25821_dev *dev = fh->dev;
int command = 0;
struct upstream_user_struct *data_from_user;
-
- data_from_user = (struct upstream_user_struct *)arg;
-
+
+ data_from_user = (struct upstream_user_struct *)arg;
+
if( !data_from_user )
{
- printk("cx25821 in %s(): Upstream data is INVALID. Returning.\n", __func__);
- return 0;
+ printk("cx25821 in %s(): Upstream data is INVALID. Returning.\n", __func__);
+ return 0;
}
-
+
command = data_from_user->command;
-
+
if( command != UPSTREAM_START_VIDEO && command != UPSTREAM_STOP_VIDEO )
{
- return 0;
+ return 0;
}
-
+
dev->input_filename_ch2 = data_from_user->input_filename;
dev->input_audiofilename = data_from_user->input_filename;
dev->vid_stdname_ch2 = data_from_user->vid_stdname;
dev->pixel_format_ch2 = data_from_user->pixel_format;
dev->channel_select_ch2 = data_from_user->channel_select;
dev->command_ch2 = data_from_user->command;
-
-
+
+
switch(command)
- {
- case UPSTREAM_START_VIDEO:
- cx25821_start_upstream_video_ch2(dev, data_from_user);
- break;
-
- case UPSTREAM_STOP_VIDEO:
- cx25821_stop_upstream_video_ch2(dev);
- break;
+ {
+ case UPSTREAM_START_VIDEO:
+ cx25821_start_upstream_video_ch2(dev, data_from_user);
+ break;
+
+ case UPSTREAM_STOP_VIDEO:
+ cx25821_stop_upstream_video_ch2(dev);
+ break;
}
-
+
return 0;
}
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
int err;
- if (fh)
+ if (fh)
{
- err = v4l2_prio_check(&dev->prio, &fh->prio);
- if (0 != err)
- return err;
+ err = v4l2_prio_check(&dev->prio, &fh->prio);
+ if (0 != err)
+ return err;
}
dprintk(2, "%s()\n", __func__);
err = vidioc_try_fmt_vid_cap(file, priv, f);
if (0 != err)
- return err;
+ return err;
fh->fmt = format_by_fourcc(f->fmt.pix.pixelformat);
fh->width = f->fmt.pix.width;
fh->height = f->fmt.pix.height;
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
int err;
- if (fh)
+ if (fh)
{
- err = v4l2_prio_check(&dev->prio, &fh->prio);
- if (0 != err)
- return err;
+ err = v4l2_prio_check(&dev->prio, &fh->prio);
+ if (0 != err)
+ return err;
}
return 0;
.read = video_read,
.poll = video_poll,
.mmap = video_mmap,
- .ioctl = video_ioctl_upstream10,
+ .ioctl = video_ioctl_upstream10,
};
static const struct v4l2_ioctl_ops video_ioctl_ops = {
/*
* Driver for the Conexant CX25821 PCIe bridge
*
- * Copyright (C) 2009 Conexant Systems Inc.
+ * Copyright (C) 2009 Conexant Systems Inc.
* Authors <shu.lin@conexant.com>, <hiep.huynh@conexant.com>
* Based on Steven Toth <stoth@linuxtv.org> cx23885 driver
*
dprintk(2, "jmp to stopper (0x%x)\n", buf->risc.jmp[1]);
if (!list_empty(&q->queued)) {
- list_add_tail(&buf->vb.queue, &q->queued);
- buf->vb.state = VIDEOBUF_QUEUED;
- dprintk(2, "[%p/%d] buffer_queue - append to queued\n", buf, buf->vb.i);
+ list_add_tail(&buf->vb.queue, &q->queued);
+ buf->vb.state = VIDEOBUF_QUEUED;
+ dprintk(2, "[%p/%d] buffer_queue - append to queued\n", buf, buf->vb.i);
} else if (list_empty(&q->active)) {
- list_add_tail(&buf->vb.queue, &q->active);
- cx25821_start_video_dma(dev, q, buf, &dev->sram_channels[SRAM_CH09]);
- buf->vb.state = VIDEOBUF_ACTIVE;
- buf->count = q->count++;
- mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
- dprintk(2, "[%p/%d] buffer_queue - first active, buf cnt = %d, q->count = %d\n",
- buf, buf->vb. i, buf->count, q->count);
+ list_add_tail(&buf->vb.queue, &q->active);
+ cx25821_start_video_dma(dev, q, buf, &dev->sram_channels[SRAM_CH09]);
+ buf->vb.state = VIDEOBUF_ACTIVE;
+ buf->count = q->count++;
+ mod_timer(&q->timeout, jiffies+BUFFER_TIMEOUT);
+ dprintk(2, "[%p/%d] buffer_queue - first active, buf cnt = %d, q->count = %d\n",
+ buf, buf->vb. i, buf->count, q->count);
} else {
- prev = list_entry(q->active.prev, struct cx25821_buffer, vb.queue);
- if (prev->vb.width == buf->vb.width &&
- prev->vb.height == buf->vb.height &&
- prev->fmt == buf->fmt) {
- list_add_tail(&buf->vb.queue, &q->active);
- buf->vb.state = VIDEOBUF_ACTIVE;
- buf->count = q->count++;
- prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
-
- /* 64 bit bits 63-32 */
- prev->risc.jmp[2] = cpu_to_le32(0);
- dprintk(2, "[%p/%d] buffer_queue - append to active, buf->count=%d\n", buf, buf->vb.i, buf->count);
-
- } else {
- list_add_tail(&buf->vb.queue, &q->queued);
- buf->vb.state = VIDEOBUF_QUEUED;
- dprintk(2, "[%p/%d] buffer_queue - first queued\n", buf, buf->vb.i);
- }
+ prev = list_entry(q->active.prev, struct cx25821_buffer, vb.queue);
+ if (prev->vb.width == buf->vb.width &&
+ prev->vb.height == buf->vb.height &&
+ prev->fmt == buf->fmt) {
+ list_add_tail(&buf->vb.queue, &q->active);
+ buf->vb.state = VIDEOBUF_ACTIVE;
+ buf->count = q->count++;
+ prev->risc.jmp[1] = cpu_to_le32(buf->risc.dma);
+
+ /* 64 bit bits 63-32 */
+ prev->risc.jmp[2] = cpu_to_le32(0);
+ dprintk(2, "[%p/%d] buffer_queue - append to active, buf->count=%d\n", buf, buf->vb.i, buf->count);
+
+ } else {
+ list_add_tail(&buf->vb.queue, &q->queued);
+ buf->vb.state = VIDEOBUF_QUEUED;
+ dprintk(2, "[%p/%d] buffer_queue - first queued\n", buf, buf->vb.i);
+ }
}
if (list_empty(&q->active))
lock_kernel();
list_for_each(list, &cx25821_devlist)
{
- h = list_entry(list, struct cx25821_dev, devlist);
+ h = list_entry(list, struct cx25821_dev, devlist);
- if (h->video_dev[SRAM_CH09] && h->video_dev[SRAM_CH09]->minor == minor)
- {
- dev = h;
- type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- }
+ if (h->video_dev[SRAM_CH09] && h->video_dev[SRAM_CH09]->minor == minor)
+ {
+ dev = h;
+ type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+ }
}
if (NULL == dev) {
- unlock_kernel();
- return -ENODEV;
+ unlock_kernel();
+ return -ENODEV;
}
printk("open minor=%d type=%s\n", minor, v4l2_type_names[type]);
/* allocate + initialize per filehandle data */
fh = kzalloc(sizeof(*fh), GFP_KERNEL);
if (NULL == fh) {
- unlock_kernel();
- return -ENOMEM;
+ unlock_kernel();
+ return -ENOMEM;
}
file->private_data = fh;
fh->width = 720;
if(dev->tvnorm & V4L2_STD_PAL_BG || dev->tvnorm & V4L2_STD_PAL_DK)
- fh->height = 576;
+ fh->height = 576;
else
- fh->height = 480;
+ fh->height = 480;
dev->channel_opened = 8;
fh->fmt = format_by_fourcc(V4L2_PIX_FMT_YUYV);
v4l2_prio_open(&dev->prio,&fh->prio);
videobuf_queue_sg_init(&fh->vidq, &cx25821_video_qops,
- &dev->pci->dev, &dev->slock,
- V4L2_BUF_TYPE_VIDEO_CAPTURE,
- V4L2_FIELD_INTERLACED,
- sizeof(struct cx25821_buffer),
- fh);
+ &dev->pci->dev, &dev->slock,
+ V4L2_BUF_TYPE_VIDEO_CAPTURE,
+ V4L2_FIELD_INTERLACED,
+ sizeof(struct cx25821_buffer),
+ fh);
dprintk(1, "post videobuf_queue_init()\n");
unlock_kernel();
switch (fh->type)
{
- case V4L2_BUF_TYPE_VIDEO_CAPTURE:
- if (res_locked(fh->dev, RESOURCE_VIDEO9))
- return -EBUSY;
+ case V4L2_BUF_TYPE_VIDEO_CAPTURE:
+ if (res_locked(fh->dev, RESOURCE_VIDEO9))
+ return -EBUSY;
- return videobuf_read_one(&fh->vidq, data, count, ppos, file->f_flags & O_NONBLOCK);
+ return videobuf_read_one(&fh->vidq, data, count, ppos, file->f_flags & O_NONBLOCK);
- default:
- BUG();
- return 0;
+ default:
+ BUG();
+ return 0;
}
}
struct cx25821_buffer *buf;
if (res_check(fh, RESOURCE_VIDEO9)) {
- /* streaming capture */
- if (list_empty(&fh->vidq.stream))
- return POLLERR;
- buf = list_entry(fh->vidq.stream.next,
- struct cx25821_buffer, vb.stream);
+ /* streaming capture */
+ if (list_empty(&fh->vidq.stream))
+ return POLLERR;
+ buf = list_entry(fh->vidq.stream.next,
+ struct cx25821_buffer, vb.stream);
} else {
- /* read() capture */
- buf = (struct cx25821_buffer *)fh->vidq.read_buf;
- if (NULL == buf)
- return POLLERR;
+ /* read() capture */
+ buf = (struct cx25821_buffer *)fh->vidq.read_buf;
+ if (NULL == buf)
+ return POLLERR;
}
poll_wait(file, &buf->vb.done, wait);
if (buf->vb.state == VIDEOBUF_DONE || buf->vb.state == VIDEOBUF_ERROR)
- return POLLIN|POLLRDNORM;
+ return POLLIN|POLLRDNORM;
return 0;
}
struct cx25821_dev *dev = fh->dev;
//stop the risc engine and fifo
- //cx_write(channel9->dma_ctl, 0);
+ //cx_write(channel9->dma_ctl, 0);
/* stop video capture */
if (res_check(fh, RESOURCE_VIDEO9)) {
- videobuf_queue_cancel(&fh->vidq);
- res_free(dev, fh, RESOURCE_VIDEO9);
+ videobuf_queue_cancel(&fh->vidq);
+ res_free(dev, fh, RESOURCE_VIDEO9);
}
if (fh->vidq.read_buf) {
- buffer_release(&fh->vidq, fh->vidq.read_buf);
- kfree(fh->vidq.read_buf);
+ buffer_release(&fh->vidq, fh->vidq.read_buf);
+ kfree(fh->vidq.read_buf);
}
videobuf_mmap_free(&fh->vidq);
if (unlikely(fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE))
{
- return -EINVAL;
+ return -EINVAL;
}
if (unlikely(i != fh->type))
{
- return -EINVAL;
+ return -EINVAL;
}
if (unlikely(!res_get(dev, fh, get_resource(fh, RESOURCE_VIDEO9))))
{
- return -EBUSY;
+ return -EBUSY;
}
return videobuf_streamon(get_queue(fh));
int err, res;
if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
- return -EINVAL;
+ return -EINVAL;
if (i != fh->type)
- return -EINVAL;
+ return -EINVAL;
res = get_resource(fh, RESOURCE_VIDEO9);
err = videobuf_streamoff(get_queue(fh));
if (err < 0)
- return err;
+ return err;
res_free(dev, fh, res);
return 0;
}
-
-static long video_ioctl_upstream9(struct file *file, unsigned int cmd, unsigned long arg)
-{
+
+static long video_ioctl_upstream9(struct file *file, unsigned int cmd, unsigned long arg)
+{
struct cx25821_fh *fh = file->private_data;
struct cx25821_dev *dev = fh->dev;
int command = 0;
struct upstream_user_struct *data_from_user;
-
-
+
+
data_from_user = (struct upstream_user_struct *)arg;
-
+
if( !data_from_user )
{
- printk("cx25821 in %s(): Upstream data is INVALID. Returning.\n", __func__);
- return 0;
+ printk("cx25821 in %s(): Upstream data is INVALID. Returning.\n", __func__);
+ return 0;
}
-
- command = data_from_user->command;
-
+
+ command = data_from_user->command;
+
if( command != UPSTREAM_START_VIDEO && command != UPSTREAM_STOP_VIDEO )
{
- return 0;
+ return 0;
}
-
-
+
+
dev->input_filename = data_from_user->input_filename;
dev->input_audiofilename = data_from_user->input_filename;
dev->vid_stdname = data_from_user->vid_stdname;
dev->pixel_format = data_from_user->pixel_format;
dev->channel_select = data_from_user->channel_select;
dev->command = data_from_user->command;
-
-
+
+
switch(command)
- {
- case UPSTREAM_START_VIDEO:
- cx25821_start_upstream_video_ch1(dev, data_from_user);
- break;
-
- case UPSTREAM_STOP_VIDEO:
- cx25821_stop_upstream_video_ch1(dev);
- break;
+ {
+ case UPSTREAM_START_VIDEO:
+ cx25821_start_upstream_video_ch1(dev, data_from_user);
+ break;
+
+ case UPSTREAM_STOP_VIDEO:
+ cx25821_stop_upstream_video_ch1(dev);
+ break;
}
-
+
return 0;
}
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
int err;
- if (fh)
+ if (fh)
{
- err = v4l2_prio_check(&dev->prio, &fh->prio);
- if (0 != err)
- return err;
+ err = v4l2_prio_check(&dev->prio, &fh->prio);
+ if (0 != err)
+ return err;
}
dprintk(2, "%s()\n", __func__);
err = vidioc_try_fmt_vid_cap(file, priv, f);
if (0 != err)
- return err;
+ return err;
fh->fmt = format_by_fourcc(f->fmt.pix.pixelformat);
fh->width = f->fmt.pix.width;
fh->height = f->fmt.pix.height;
struct cx25821_dev *dev = ((struct cx25821_fh *)priv)->dev;
struct cx25821_fh *fh = priv;
int err;
- if (fh)
+ if (fh)
{
- err = v4l2_prio_check(&dev->prio, &fh->prio);
- if (0 != err)
- return err;
+ err = v4l2_prio_check(&dev->prio, &fh->prio);
+ if (0 != err)
+ return err;
}
return 0;
.read = video_read,
.poll = video_poll,
.mmap = video_mmap,
- .ioctl = video_ioctl_upstream9,
+ .ioctl = video_ioctl_upstream9,
};
static const struct v4l2_ioctl_ops video_ioctl_ops = {
/*
* Driver for the Conexant CX25821 PCIe bridge
*
- * Copyright (C) 2009 Conexant Systems Inc.
+ * Copyright (C) 2009 Conexant Systems Inc.
* Authors <shu.lin@conexant.com>, <hiep.huynh@conexant.com>
* Based on Steven Toth <stoth@linuxtv.org> cx23885 driver
*
#include <linux/smp_lock.h>
#include <media/v4l2-common.h>
-#include <media/v4l2-device.h>
+#include <media/v4l2-device.h>
#include <media/tuner.h>
#include <media/tveeprom.h>
#include <media/videobuf-dma-sg.h>
#define FALSE 0
#define LINE_SIZE_D1 1440
-// Number of decoders and encoders
+// Number of decoders and encoders
#define MAX_DECODERS 8
#define MAX_ENCODERS 2
#define QUAD_DECODERS 4
#define UNKNOWN_BOARD 0
#define CX25821_BOARD 1
-/* Currently supported by the driver */
+/* Currently supported by the driver */
#define CX25821_NORMS (\
V4L2_STD_NTSC_M | V4L2_STD_NTSC_M_JP | V4L2_STD_NTSC_M_KR | \
V4L2_STD_PAL_BG | V4L2_STD_PAL_DK | V4L2_STD_PAL_I | \
struct cx25821_data timeout_data[MAX_VID_CHANNEL_NUM];
/* Analog Audio Upstream */
- int _audio_is_running;
+ int _audio_is_running;
int _audiopixel_format;
int _is_first_audio_frame;
int _audiofile_status;
unsigned int _audiodata_buf_size;
__le32 * _audiodata_buf_virt_addr;
dma_addr_t _audiodata_buf_phys_addr;
- char *_audiofilename;
+ char *_audiofilename;
/* V4l */
u32 freq;
struct cx25821_dmaqueue vidq[MAX_VID_CHANNEL_NUM];
spinlock_t slock;
-
+
/* Video Upstream */
int _line_size;
int _prog_cnt;
unsigned int _data_buf_size;
__le32 * _data_buf_virt_addr;
dma_addr_t _data_buf_phys_addr;
- char * _filename;
- char * _defaultname;
+ char * _filename;
+ char * _defaultname;
int _line_size_ch2;
unsigned int _data_buf_size_ch2;
__le32 * _data_buf_virt_addr_ch2;
dma_addr_t _data_buf_phys_addr_ch2;
- char * _filename_ch2;
- char * _defaultname_ch2;
+ char * _filename_ch2;
+ char * _defaultname_ch2;
/* MPEG Encoder ONLY settings */
u32 cx23417_mailbox;
struct video_device *v4l_device;
atomic_t v4l_reader_count;
struct cx25821_tvnorm encodernorm;
-
+
u32 upstream_riscbuf_size;
u32 upstream_databuf_size;
u32 upstream_riscbuf_size_ch2;
u32 upstream_databuf_size_ch2;
u32 audio_upstream_riscbuf_size;
u32 audio_upstream_databuf_size;
- int _isNTSC;
- int _frame_index;
- int _audioframe_index;
- struct workqueue_struct * _irq_queues;
- struct work_struct _irq_work_entry;
- struct workqueue_struct * _irq_queues_ch2;
- struct work_struct _irq_work_entry_ch2;
- struct workqueue_struct * _irq_audio_queues;
- struct work_struct _audio_work_entry;
+ int _isNTSC;
+ int _frame_index;
+ int _audioframe_index;
+ struct workqueue_struct * _irq_queues;
+ struct work_struct _irq_work_entry;
+ struct workqueue_struct * _irq_queues_ch2;
+ struct work_struct _irq_work_entry_ch2;
+ struct workqueue_struct * _irq_audio_queues;
+ struct work_struct _audio_work_entry;
char *input_filename;
char *input_filename_ch2;
- int _frame_index_ch2;
- int _isNTSC_ch2;
+ int _frame_index_ch2;
+ int _isNTSC_ch2;
char *vid_stdname_ch2;
int pixel_format_ch2;
int channel_select_ch2;
#define cx25821_call_all(dev, o, f, args...) \
v4l2_device_call_all(&dev->v4l2_dev, 0, o, f, ##args)
-
+
extern struct list_head cx25821_devlist;
extern struct cx25821_board cx25821_boards[];
extern struct cx25821_subid cx25821_subids[];
u32 aud_cfg;
u32 fld_aud_fifo_en;
u32 fld_aud_risc_en;
-
+
//For Upstream Video
u32 vid_fmt_ctl;
u32 vid_active_ctl1;
u32 vid_active_ctl2;
u32 vid_cdt_size;
-
+
u32 vip_ctl;
u32 pix_frmt;
- u32 jumponly;
+ u32 jumponly;
u32 irq_bit;
};
extern struct sram_channel cx25821_sram_channels[];
extern int cx25821_i2c_unregister(struct cx25821_i2c *bus);
extern void cx25821_gpio_init(struct cx25821_dev *dev);
extern void cx25821_set_gpiopin_direction( struct cx25821_dev *dev,
- int pin_number,
- int pin_logic_value);
-
+ int pin_number,
+ int pin_logic_value);
+
extern int medusa_video_init(struct cx25821_dev *dev);
extern int medusa_set_videostandard(struct cx25821_dev *dev);
extern void medusa_set_resolution(struct cx25821_dev *dev, int width, int decoder_select);
extern int cx25821_sram_channel_setup(struct cx25821_dev *dev, struct sram_channel *ch, unsigned int bpl, u32 risc);
extern int cx25821_risc_buffer(struct pci_dev *pci, struct btcx_riscmem *risc,
- struct scatterlist *sglist,
- unsigned int top_offset,
- unsigned int bottom_offset,
- unsigned int bpl,
- unsigned int padding,
- unsigned int lines);
+ struct scatterlist *sglist,
+ unsigned int top_offset,
+ unsigned int bottom_offset,
+ unsigned int bpl,
+ unsigned int padding,
+ unsigned int lines);
extern int cx25821_risc_databuffer_audio(struct pci_dev *pci,
- struct btcx_riscmem *risc,
- struct scatterlist *sglist,
- unsigned int bpl,
- unsigned int lines,
- unsigned int lpi);
+ struct btcx_riscmem *risc,
+ struct scatterlist *sglist,
+ unsigned int bpl,
+ unsigned int lines,
+ unsigned int lpi);
extern void cx25821_free_buffer(struct videobuf_queue *q, struct cx25821_buffer *buf);
extern int cx25821_risc_stopper(struct pci_dev *pci, struct btcx_riscmem *risc,u32 reg, u32 mask, u32 value);
extern void cx25821_sram_channel_dump(struct cx25821_dev *dev, struct sram_channel *ch);
extern void cx25821_print_irqbits(char *name, char *tag, char **strings, int len, u32 bits, u32 mask);
extern void cx25821_dev_unregister(struct cx25821_dev *dev);
extern int cx25821_sram_channel_setup_audio(struct cx25821_dev *dev,
- struct sram_channel *ch,
- unsigned int bpl, u32 risc);
-
+ struct sram_channel *ch,
+ unsigned int bpl, u32 risc);
+
extern int cx25821_vidupstream_init_ch1(struct cx25821_dev *dev, int channel_select, int pixel_format);
extern int cx25821_vidupstream_init_ch2(struct cx25821_dev *dev, int channel_select, int pixel_format);
extern int cx25821_audio_upstream_init(struct cx25821_dev *dev, int channel_select);
-extern void cx25821_free_mem_upstream_ch1(struct cx25821_dev *dev);
-extern void cx25821_free_mem_upstream_ch2(struct cx25821_dev *dev);
-extern void cx25821_free_mem_upstream_audio(struct cx25821_dev *dev);
-extern void cx25821_start_upstream_video_ch1(struct cx25821_dev *dev, struct upstream_user_struct *up_data);
-extern void cx25821_start_upstream_video_ch2(struct cx25821_dev *dev, struct upstream_user_struct *up_data);
-extern void cx25821_start_upstream_audio(struct cx25821_dev *dev, struct upstream_user_struct *up_data);
-extern void cx25821_stop_upstream_video_ch1(struct cx25821_dev *dev);
-extern void cx25821_stop_upstream_video_ch2(struct cx25821_dev *dev);
-extern void cx25821_stop_upstream_audio(struct cx25821_dev *dev);
+extern void cx25821_free_mem_upstream_ch1(struct cx25821_dev *dev);
+extern void cx25821_free_mem_upstream_ch2(struct cx25821_dev *dev);
+extern void cx25821_free_mem_upstream_audio(struct cx25821_dev *dev);
+extern void cx25821_start_upstream_video_ch1(struct cx25821_dev *dev, struct upstream_user_struct *up_data);
+extern void cx25821_start_upstream_video_ch2(struct cx25821_dev *dev, struct upstream_user_struct *up_data);
+extern void cx25821_start_upstream_audio(struct cx25821_dev *dev, struct upstream_user_struct *up_data);
+extern void cx25821_stop_upstream_video_ch1(struct cx25821_dev *dev);
+extern void cx25821_stop_upstream_video_ch2(struct cx25821_dev *dev);
+extern void cx25821_stop_upstream_audio(struct cx25821_dev *dev);
extern int cx25821_sram_channel_setup_upstream( struct cx25821_dev *dev, struct sram_channel *ch, unsigned int bpl, u32 risc);
extern void cx25821_set_pixel_format(struct cx25821_dev *dev, int channel, u32 format);
extern void cx25821_videoioctl_unregister(struct cx25821_dev *dev);
extern struct video_device *cx25821_vdev_init(struct cx25821_dev *dev,
- struct pci_dev *pci,
- struct video_device *template,
- char *type);
+ struct pci_dev *pci,
+ struct video_device *template,
+ char *type);
#endif