FRV: Use generic show_interrupts()
[cris-mirror.git] / drivers / media / video / tlg2300 / pd-common.h
blob46066bdc73f9a967eeb97508de0d67b1c62cae8c
1 #ifndef PD_COMMON_H
2 #define PD_COMMON_H
4 #include <linux/version.h>
5 #include <linux/fs.h>
6 #include <linux/wait.h>
7 #include <linux/list.h>
8 #include <linux/videodev2.h>
9 #include <linux/semaphore.h>
10 #include <linux/usb.h>
11 #include <linux/poll.h>
12 #include <media/videobuf-vmalloc.h>
13 #include <media/v4l2-device.h>
15 #include "dvb_frontend.h"
16 #include "dvbdev.h"
17 #include "dvb_demux.h"
18 #include "dmxdev.h"
20 #define SBUF_NUM 8
21 #define MAX_BUFFER_NUM 6
22 #define PK_PER_URB 32
23 #define ISO_PKT_SIZE 3072
25 #define POSEIDON_STATE_NONE (0x0000)
26 #define POSEIDON_STATE_ANALOG (0x0001)
27 #define POSEIDON_STATE_FM (0x0002)
28 #define POSEIDON_STATE_DVBT (0x0004)
29 #define POSEIDON_STATE_VBI (0x0008)
30 #define POSEIDON_STATE_DISCONNECT (0x0080)
32 #define PM_SUSPEND_DELAY 3
34 #define V4L_PAL_VBI_LINES 18
35 #define V4L_NTSC_VBI_LINES 12
36 #define V4L_PAL_VBI_FRAMESIZE (V4L_PAL_VBI_LINES * 1440 * 2)
37 #define V4L_NTSC_VBI_FRAMESIZE (V4L_NTSC_VBI_LINES * 1440 * 2)
39 #define TUNER_FREQ_MIN (45000000)
40 #define TUNER_FREQ_MAX (862000000)
42 struct vbi_data {
43 struct video_device *v_dev;
44 struct video_data *video;
45 struct front_face *front;
47 unsigned int copied;
48 unsigned int vbi_size; /* the whole size of two fields */
49 int users;
53 * This is the running context of the video, it is useful for
54 * resume()
56 struct running_context {
57 u32 freq; /* VIDIOC_S_FREQUENCY */
58 int audio_idx; /* VIDIOC_S_TUNER */
59 v4l2_std_id tvnormid; /* VIDIOC_S_STD */
60 int sig_index; /* VIDIOC_S_INPUT */
61 struct v4l2_pix_format pix; /* VIDIOC_S_FMT */
64 struct video_data {
65 /* v4l2 video device */
66 struct video_device *v_dev;
68 /* the working context */
69 struct running_context context;
71 /* for data copy */
72 int field_count;
74 char *dst;
75 int lines_copied;
76 int prev_left;
78 int lines_per_field;
79 int lines_size;
81 /* for communication */
82 u8 endpoint_addr;
83 struct urb *urb_array[SBUF_NUM];
84 struct vbi_data *vbi;
85 struct poseidon *pd;
86 struct front_face *front;
88 int is_streaming;
89 int users;
91 /* for bubble handler */
92 struct work_struct bubble_work;
95 enum pcm_stream_state {
96 STREAM_OFF,
97 STREAM_ON,
98 STREAM_SUSPEND,
101 #define AUDIO_BUFS (3)
102 #define CAPTURE_STREAM_EN 1
103 struct poseidon_audio {
104 struct urb *urb_array[AUDIO_BUFS];
105 unsigned int copied_position;
106 struct snd_pcm_substream *capture_pcm_substream;
108 unsigned int rcv_position;
109 struct snd_card *card;
110 int card_close;
112 int users;
113 int pm_state;
114 enum pcm_stream_state capture_stream;
117 struct radio_data {
118 __u32 fm_freq;
119 int users;
120 unsigned int is_radio_streaming;
121 int pre_emphasis;
122 struct video_device *fm_dev;
125 #define DVB_SBUF_NUM 4
126 #define DVB_URB_BUF_SIZE 0x2000
127 struct pd_dvb_adapter {
128 struct dvb_adapter dvb_adap;
129 struct dvb_frontend dvb_fe;
130 struct dmxdev dmxdev;
131 struct dvb_demux demux;
133 atomic_t users;
134 atomic_t active_feed;
136 /* data transfer */
137 s32 is_streaming;
138 struct urb *urb_array[DVB_SBUF_NUM];
139 struct poseidon *pd_device;
140 u8 ep_addr;
141 u8 reserved[3];
143 /* data for power resume*/
144 struct dvb_frontend_parameters fe_param;
146 /* for channel scanning */
147 int prev_freq;
148 int bandwidth;
149 unsigned long last_jiffies;
152 struct front_face {
153 /* use this field to distinguish VIDEO and VBI */
154 enum v4l2_buf_type type;
156 /* for host */
157 struct videobuf_queue q;
159 /* the bridge for host and device */
160 struct videobuf_buffer *curr_frame;
162 /* for device */
163 spinlock_t queue_lock;
164 struct list_head active;
165 struct poseidon *pd;
168 struct poseidon {
169 struct list_head device_list;
171 struct mutex lock;
172 struct kref kref;
174 /* for V4L2 */
175 struct v4l2_device v4l2_dev;
177 /* hardware info */
178 struct usb_device *udev;
179 struct usb_interface *interface;
180 int cur_transfer_mode;
182 struct video_data video_data; /* video */
183 struct vbi_data vbi_data; /* vbi */
184 struct poseidon_audio audio; /* audio (alsa) */
185 struct radio_data radio_data; /* FM */
186 struct pd_dvb_adapter dvb_data; /* DVB */
188 u32 state;
189 struct file *file_for_stream; /* the active stream*/
191 #ifdef CONFIG_PM
192 int (*pm_suspend)(struct poseidon *);
193 int (*pm_resume)(struct poseidon *);
194 pm_message_t msg;
196 struct work_struct pm_work;
197 u8 portnum;
198 #endif
201 struct poseidon_format {
202 char *name;
203 int fourcc; /* video4linux 2 */
204 int depth; /* bit/pixel */
205 int flags;
208 struct poseidon_tvnorm {
209 v4l2_std_id v4l2_id;
210 char name[12];
211 u32 tlg_tvnorm;
214 /* video */
215 int pd_video_init(struct poseidon *);
216 void pd_video_exit(struct poseidon *);
217 int stop_all_video_stream(struct poseidon *);
219 /* alsa audio */
220 int poseidon_audio_init(struct poseidon *);
221 int poseidon_audio_free(struct poseidon *);
222 #ifdef CONFIG_PM
223 int pm_alsa_suspend(struct poseidon *);
224 int pm_alsa_resume(struct poseidon *);
225 #endif
227 /* dvb */
228 int pd_dvb_usb_device_init(struct poseidon *);
229 void pd_dvb_usb_device_exit(struct poseidon *);
230 void pd_dvb_usb_device_cleanup(struct poseidon *);
231 int pd_dvb_get_adapter_num(struct pd_dvb_adapter *);
232 void dvb_stop_streaming(struct pd_dvb_adapter *);
234 /* FM */
235 int poseidon_fm_init(struct poseidon *);
236 int poseidon_fm_exit(struct poseidon *);
237 struct video_device *vdev_init(struct poseidon *, struct video_device *);
239 /* vendor command ops */
240 int send_set_req(struct poseidon*, u8, s32, s32*);
241 int send_get_req(struct poseidon*, u8, s32, void*, s32*, s32);
242 s32 set_tuner_mode(struct poseidon*, unsigned char);
244 /* bulk urb alloc/free */
245 int alloc_bulk_urbs_generic(struct urb **urb_array, int num,
246 struct usb_device *udev, u8 ep_addr,
247 int buf_size, gfp_t gfp_flags,
248 usb_complete_t complete_fn, void *context);
249 void free_all_urb_generic(struct urb **urb_array, int num);
251 /* misc */
252 void poseidon_delete(struct kref *kref);
253 void destroy_video_device(struct video_device **v_dev);
254 extern int debug_mode;
255 void set_debug_mode(struct video_device *vfd, int debug_mode);
257 #ifdef CONFIG_PM
258 #define in_hibernation(pd) (pd->msg.event == PM_EVENT_FREEZE)
259 #else
260 #define in_hibernation(pd) (0)
261 #endif
262 #define get_pm_count(p) (atomic_read(&(p)->interface->pm_usage_cnt))
264 #define log(a, ...) printk(KERN_DEBUG "\t[ %s : %.3d ] "a"\n", \
265 __func__, __LINE__, ## __VA_ARGS__)
267 /* for power management */
268 #define logpm(pd) do {\
269 if (debug_mode & 0x10)\
270 log();\
271 } while (0)
273 #define logs(f) do { \
274 if ((debug_mode & 0x4) && \
275 (f)->type == V4L2_BUF_TYPE_VBI_CAPTURE) \
276 log("type : VBI");\
278 if ((debug_mode & 0x8) && \
279 (f)->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) \
280 log("type : VIDEO");\
281 } while (0)
282 #endif