5 #include <linux/wait.h>
6 #include <linux/list.h>
7 #include <linux/videodev2.h>
8 #include <linux/semaphore.h>
10 #include <linux/poll.h>
11 #include <media/videobuf-vmalloc.h>
12 #include <media/v4l2-device.h>
14 #include "dvb_frontend.h"
16 #include "dvb_demux.h"
20 #define MAX_BUFFER_NUM 6
22 #define ISO_PKT_SIZE 3072
24 #define POSEIDON_STATE_NONE (0x0000)
25 #define POSEIDON_STATE_ANALOG (0x0001)
26 #define POSEIDON_STATE_FM (0x0002)
27 #define POSEIDON_STATE_DVBT (0x0004)
28 #define POSEIDON_STATE_VBI (0x0008)
29 #define POSEIDON_STATE_DISCONNECT (0x0080)
31 #define PM_SUSPEND_DELAY 3
33 #define V4L_PAL_VBI_LINES 18
34 #define V4L_NTSC_VBI_LINES 12
35 #define V4L_PAL_VBI_FRAMESIZE (V4L_PAL_VBI_LINES * 1440 * 2)
36 #define V4L_NTSC_VBI_FRAMESIZE (V4L_NTSC_VBI_LINES * 1440 * 2)
38 #define TUNER_FREQ_MIN (45000000)
39 #define TUNER_FREQ_MAX (862000000)
42 struct video_device
*v_dev
;
43 struct video_data
*video
;
44 struct front_face
*front
;
47 unsigned int vbi_size
; /* the whole size of two fields */
52 * This is the running context of the video, it is useful for
55 struct running_context
{
56 u32 freq
; /* VIDIOC_S_FREQUENCY */
57 int audio_idx
; /* VIDIOC_S_TUNER */
58 v4l2_std_id tvnormid
; /* VIDIOC_S_STD */
59 int sig_index
; /* VIDIOC_S_INPUT */
60 struct v4l2_pix_format pix
; /* VIDIOC_S_FMT */
64 /* v4l2 video device */
65 struct video_device
*v_dev
;
67 /* the working context */
68 struct running_context context
;
80 /* for communication */
82 struct urb
*urb_array
[SBUF_NUM
];
85 struct front_face
*front
;
90 /* for bubble handler */
91 struct work_struct bubble_work
;
94 enum pcm_stream_state
{
100 #define AUDIO_BUFS (3)
101 #define CAPTURE_STREAM_EN 1
102 struct poseidon_audio
{
103 struct urb
*urb_array
[AUDIO_BUFS
];
104 unsigned int copied_position
;
105 struct snd_pcm_substream
*capture_pcm_substream
;
107 unsigned int rcv_position
;
108 struct snd_card
*card
;
113 enum pcm_stream_state capture_stream
;
119 unsigned int is_radio_streaming
;
121 struct video_device
*fm_dev
;
124 #define DVB_SBUF_NUM 4
125 #define DVB_URB_BUF_SIZE 0x2000
126 struct pd_dvb_adapter
{
127 struct dvb_adapter dvb_adap
;
128 struct dvb_frontend dvb_fe
;
129 struct dmxdev dmxdev
;
130 struct dvb_demux demux
;
133 atomic_t active_feed
;
137 struct urb
*urb_array
[DVB_SBUF_NUM
];
138 struct poseidon
*pd_device
;
142 /* data for power resume*/
143 struct dtv_frontend_properties fe_param
;
145 /* for channel scanning */
148 unsigned long last_jiffies
;
152 /* use this field to distinguish VIDEO and VBI */
153 enum v4l2_buf_type type
;
156 struct videobuf_queue q
;
158 /* the bridge for host and device */
159 struct videobuf_buffer
*curr_frame
;
162 spinlock_t queue_lock
;
163 struct list_head active
;
168 struct list_head device_list
;
174 struct v4l2_device v4l2_dev
;
177 struct usb_device
*udev
;
178 struct usb_interface
*interface
;
179 int cur_transfer_mode
;
181 struct video_data video_data
; /* video */
182 struct vbi_data vbi_data
; /* vbi */
183 struct poseidon_audio audio
; /* audio (alsa) */
184 struct radio_data radio_data
; /* FM */
185 struct pd_dvb_adapter dvb_data
; /* DVB */
188 struct file
*file_for_stream
; /* the active stream*/
191 int (*pm_suspend
)(struct poseidon
*);
192 int (*pm_resume
)(struct poseidon
*);
195 struct work_struct pm_work
;
200 struct poseidon_format
{
202 int fourcc
; /* video4linux 2 */
203 int depth
; /* bit/pixel */
207 struct poseidon_tvnorm
{
214 int pd_video_init(struct poseidon
*);
215 void pd_video_exit(struct poseidon
*);
216 int stop_all_video_stream(struct poseidon
*);
219 int poseidon_audio_init(struct poseidon
*);
220 int poseidon_audio_free(struct poseidon
*);
222 int pm_alsa_suspend(struct poseidon
*);
223 int pm_alsa_resume(struct poseidon
*);
227 int pd_dvb_usb_device_init(struct poseidon
*);
228 void pd_dvb_usb_device_exit(struct poseidon
*);
229 void pd_dvb_usb_device_cleanup(struct poseidon
*);
230 int pd_dvb_get_adapter_num(struct pd_dvb_adapter
*);
231 void dvb_stop_streaming(struct pd_dvb_adapter
*);
234 int poseidon_fm_init(struct poseidon
*);
235 int poseidon_fm_exit(struct poseidon
*);
236 struct video_device
*vdev_init(struct poseidon
*, struct video_device
*);
238 /* vendor command ops */
239 int send_set_req(struct poseidon
*, u8
, s32
, s32
*);
240 int send_get_req(struct poseidon
*, u8
, s32
, void*, s32
*, s32
);
241 s32
set_tuner_mode(struct poseidon
*, unsigned char);
243 /* bulk urb alloc/free */
244 int alloc_bulk_urbs_generic(struct urb
**urb_array
, int num
,
245 struct usb_device
*udev
, u8 ep_addr
,
246 int buf_size
, gfp_t gfp_flags
,
247 usb_complete_t complete_fn
, void *context
);
248 void free_all_urb_generic(struct urb
**urb_array
, int num
);
251 void poseidon_delete(struct kref
*kref
);
252 void destroy_video_device(struct video_device
**v_dev
);
253 extern int debug_mode
;
254 void set_debug_mode(struct video_device
*vfd
, int debug_mode
);
257 #define in_hibernation(pd) (pd->msg.event == PM_EVENT_FREEZE)
259 #define in_hibernation(pd) (0)
261 #define get_pm_count(p) (atomic_read(&(p)->interface->pm_usage_cnt))
263 #define log(a, ...) printk(KERN_DEBUG "\t[ %s : %.3d ] "a"\n", \
264 __func__, __LINE__, ## __VA_ARGS__)
266 /* for power management */
267 #define logpm(pd) do {\
268 if (debug_mode & 0x10)\
272 #define logs(f) do { \
273 if ((debug_mode & 0x4) && \
274 (f)->type == V4L2_BUF_TYPE_VBI_CAPTURE) \
277 if ((debug_mode & 0x8) && \
278 (f)->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) \
279 log("type : VIDEO");\