1 /* 2 * cx18 buffer queues 3 * 4 * Derived from ivtv-queue.h 5 * 6 * Copyright (C) 2007 Hans Verkuil <hverkuil@xs4all.nl> 7 * Copyright (C) 2008 Andy Walls <awalls@md.metrocast.net> 8 * 9 * This program is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License as published by 11 * the Free Software Foundation; either version 2 of the License, or 12 * (at your option) any later version. 13 * 14 * This program is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 * GNU General Public License for more details. 18 */ 19 20 #define CX18_DMA_UNMAPPED ((u32) -1) 21 22 /* cx18_buffer utility functions */ 23 24 static inline void cx18_buf_sync_for_cpu(struct cx18_stream *s, 25 struct cx18_buffer *buf) 26 { 27 pci_dma_sync_single_for_cpu(s->cx->pci_dev, buf->dma_handle, 28 s->buf_size, s->dma); 29 } 30 31 static inline void cx18_buf_sync_for_device(struct cx18_stream *s, 32 struct cx18_buffer *buf) 33 { 34 pci_dma_sync_single_for_device(s->cx->pci_dev, buf->dma_handle, 35 s->buf_size, s->dma); 36 } 37 38 void _cx18_mdl_sync_for_device(struct cx18_stream *s, struct cx18_mdl *mdl); 39 40 static inline void cx18_mdl_sync_for_device(struct cx18_stream *s, 41 struct cx18_mdl *mdl) 42 { 43 if (list_is_singular(&mdl->buf_list)) 44 cx18_buf_sync_for_device(s, list_first_entry(&mdl->buf_list, 45 struct cx18_buffer, 46 list)); 47 else 48 _cx18_mdl_sync_for_device(s, mdl); 49 } 50 51 void cx18_buf_swap(struct cx18_buffer *buf); 52 void _cx18_mdl_swap(struct cx18_mdl *mdl); 53 54 static inline void cx18_mdl_swap(struct cx18_mdl *mdl) 55 { 56 if (list_is_singular(&mdl->buf_list)) 57 cx18_buf_swap(list_first_entry(&mdl->buf_list, 58 struct cx18_buffer, list)); 59 else 60 _cx18_mdl_swap(mdl); 61 } 62 63 /* cx18_queue utility functions */ 64 struct cx18_queue *_cx18_enqueue(struct cx18_stream *s, struct cx18_mdl *mdl, 65 struct cx18_queue *q, int to_front); 66 67 static inline 68 struct cx18_queue *cx18_enqueue(struct cx18_stream *s, struct cx18_mdl *mdl, 69 struct cx18_queue *q) 70 { 71 return _cx18_enqueue(s, mdl, q, 0); /* FIFO */ 72 } 73 74 static inline 75 struct cx18_queue *cx18_push(struct cx18_stream *s, struct cx18_mdl *mdl, 76 struct cx18_queue *q) 77 { 78 return _cx18_enqueue(s, mdl, q, 1); /* LIFO */ 79 } 80 81 void cx18_queue_init(struct cx18_queue *q); 82 struct cx18_mdl *cx18_dequeue(struct cx18_stream *s, struct cx18_queue *q); 83 struct cx18_mdl *cx18_queue_get_mdl(struct cx18_stream *s, u32 id, 84 u32 bytesused); 85 void cx18_flush_queues(struct cx18_stream *s); 86 87 /* queue MDL reconfiguration helpers */ 88 void cx18_unload_queues(struct cx18_stream *s); 89 void cx18_load_queues(struct cx18_stream *s); 90 91 /* cx18_stream utility functions */ 92 int cx18_stream_alloc(struct cx18_stream *s); 93 void cx18_stream_free(struct cx18_stream *s); 94