2008-04-28 20:24:33 -03:00
/*
* cx18 buffer queues
*
* Derived from ivtv - queue . h
*
* Copyright ( C ) 2007 Hans Verkuil < hverkuil @ xs4all . nl >
2010-05-23 18:53:35 -03:00
* Copyright ( C ) 2008 Andy Walls < awalls @ md . metrocast . net >
2008-04-28 20:24:33 -03:00
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA
* 02111 - 1307 USA
*/
# define CX18_DMA_UNMAPPED ((u32) -1)
/* cx18_buffer utility functions */
static inline void cx18_buf_sync_for_cpu ( struct cx18_stream * s ,
struct cx18_buffer * buf )
{
2009-01-10 21:54:39 -03:00
pci_dma_sync_single_for_cpu ( s - > cx - > pci_dev , buf - > dma_handle ,
2008-04-28 20:24:33 -03:00
s - > buf_size , s - > dma ) ;
}
static inline void cx18_buf_sync_for_device ( struct cx18_stream * s ,
struct cx18_buffer * buf )
{
2009-01-10 21:54:39 -03:00
pci_dma_sync_single_for_device ( s - > cx - > pci_dev , buf - > dma_handle ,
2008-04-28 20:24:33 -03:00
s - > buf_size , s - > dma ) ;
}
2009-11-08 23:45:24 -03:00
void _cx18_mdl_sync_for_device ( struct cx18_stream * s , struct cx18_mdl * mdl ) ;
static inline void cx18_mdl_sync_for_device ( struct cx18_stream * s ,
struct cx18_mdl * mdl )
{
if ( list_is_singular ( & mdl - > buf_list ) )
cx18_buf_sync_for_device ( s , list_first_entry ( & mdl - > buf_list ,
struct cx18_buffer ,
list ) ) ;
else
_cx18_mdl_sync_for_device ( s , mdl ) ;
}
2008-04-28 20:24:33 -03:00
void cx18_buf_swap ( struct cx18_buffer * buf ) ;
2009-11-08 23:45:24 -03:00
void _cx18_mdl_swap ( struct cx18_mdl * mdl ) ;
static inline void cx18_mdl_swap ( struct cx18_mdl * mdl )
{
if ( list_is_singular ( & mdl - > buf_list ) )
cx18_buf_swap ( list_first_entry ( & mdl - > buf_list ,
struct cx18_buffer , list ) ) ;
else
_cx18_mdl_swap ( mdl ) ;
}
2008-04-28 20:24:33 -03:00
/* cx18_queue utility functions */
2009-11-08 23:45:24 -03:00
struct cx18_queue * _cx18_enqueue ( struct cx18_stream * s , struct cx18_mdl * mdl ,
2008-12-08 23:02:45 -03:00
struct cx18_queue * q , int to_front ) ;
2008-11-28 00:04:21 -03:00
static inline
2009-11-08 23:45:24 -03:00
struct cx18_queue * cx18_enqueue ( struct cx18_stream * s , struct cx18_mdl * mdl ,
2008-12-08 23:02:45 -03:00
struct cx18_queue * q )
2008-11-28 00:04:21 -03:00
{
2009-11-08 23:45:24 -03:00
return _cx18_enqueue ( s , mdl , q , 0 ) ; /* FIFO */
2008-11-28 00:04:21 -03:00
}
static inline
2009-11-08 23:45:24 -03:00
struct cx18_queue * cx18_push ( struct cx18_stream * s , struct cx18_mdl * mdl ,
2008-12-08 23:02:45 -03:00
struct cx18_queue * q )
2008-11-28 00:04:21 -03:00
{
2009-11-08 23:45:24 -03:00
return _cx18_enqueue ( s , mdl , q , 1 ) ; /* LIFO */
2008-11-28 00:04:21 -03:00
}
void cx18_queue_init ( struct cx18_queue * q ) ;
2009-11-08 23:45:24 -03:00
struct cx18_mdl * cx18_dequeue ( struct cx18_stream * s , struct cx18_queue * q ) ;
struct cx18_mdl * cx18_queue_get_mdl ( struct cx18_stream * s , u32 id ,
2008-04-28 20:24:33 -03:00
u32 bytesused ) ;
void cx18_flush_queues ( struct cx18_stream * s ) ;
2009-11-08 23:45:24 -03:00
/* queue MDL reconfiguration helpers */
void cx18_unload_queues ( struct cx18_stream * s ) ;
void cx18_load_queues ( struct cx18_stream * s ) ;
2008-04-28 20:24:33 -03:00
/* cx18_stream utility functions */
int cx18_stream_alloc ( struct cx18_stream * s ) ;
void cx18_stream_free ( struct cx18_stream * s ) ;