1 #ifndef PD_COMMON_H 2 #define PD_COMMON_H 3 4 #include <linux/fs.h> 5 #include <linux/wait.h> 6 #include <linux/list.h> 7 #include <linux/videodev2.h> 8 #include <linux/semaphore.h> 9 #include <linux/usb.h> 10 #include <linux/poll.h> 11 #include <media/videobuf-vmalloc.h> 12 #include <media/v4l2-device.h> 13 14 #include "dvb_frontend.h" 15 #include "dvbdev.h" 16 #include "dvb_demux.h" 17 #include "dmxdev.h" 18 19 #define SBUF_NUM 8 20 #define MAX_BUFFER_NUM 6 21 #define PK_PER_URB 32 22 #define ISO_PKT_SIZE 3072 23 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) 30 31 #define PM_SUSPEND_DELAY 3 32 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) 37 38 #define TUNER_FREQ_MIN (45000000) 39 #define TUNER_FREQ_MAX (862000000) 40 41 struct vbi_data { 42 struct video_device *v_dev; 43 struct video_data *video; 44 struct front_face *front; 45 46 unsigned int copied; 47 unsigned int vbi_size; /* the whole size of two fields */ 48 int users; 49 }; 50 51 /* 52 * This is the running context of the video, it is useful for 53 * resume() 54 */ 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 */ 61 }; 62 63 struct video_data { 64 /* v4l2 video device */ 65 struct video_device *v_dev; 66 67 /* the working context */ 68 struct running_context context; 69 70 /* for data copy */ 71 int field_count; 72 73 char *dst; 74 int lines_copied; 75 int prev_left; 76 77 int lines_per_field; 78 int lines_size; 79 80 /* for communication */ 81 u8 endpoint_addr; 82 struct urb *urb_array[SBUF_NUM]; 83 struct vbi_data *vbi; 84 struct poseidon *pd; 85 struct front_face *front; 86 87 int is_streaming; 88 int users; 89 90 /* for bubble handler */ 91 struct work_struct bubble_work; 92 }; 93 94 enum pcm_stream_state { 95 STREAM_OFF, 96 STREAM_ON, 97 STREAM_SUSPEND, 98 }; 99 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; 106 107 unsigned int rcv_position; 108 struct snd_card *card; 109 int card_close; 110 111 int users; 112 int pm_state; 113 enum pcm_stream_state capture_stream; 114 }; 115 116 struct radio_data { 117 __u32 fm_freq; 118 int users; 119 unsigned int is_radio_streaming; 120 int pre_emphasis; 121 struct video_device *fm_dev; 122 }; 123 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; 131 132 atomic_t users; 133 atomic_t active_feed; 134 135 /* data transfer */ 136 s32 is_streaming; 137 struct urb *urb_array[DVB_SBUF_NUM]; 138 struct poseidon *pd_device; 139 u8 ep_addr; 140 u8 reserved[3]; 141 142 /* data for power resume*/ 143 struct dtv_frontend_properties fe_param; 144 145 /* for channel scanning */ 146 int prev_freq; 147 int bandwidth; 148 unsigned long last_jiffies; 149 }; 150 151 struct front_face { 152 /* use this field to distinguish VIDEO and VBI */ 153 enum v4l2_buf_type type; 154 155 /* for host */ 156 struct videobuf_queue q; 157 158 /* the bridge for host and device */ 159 struct videobuf_buffer *curr_frame; 160 161 /* for device */ 162 spinlock_t queue_lock; 163 struct list_head active; 164 struct poseidon *pd; 165 }; 166 167 struct poseidon { 168 struct list_head device_list; 169 170 struct mutex lock; 171 struct kref kref; 172 173 /* for V4L2 */ 174 struct v4l2_device v4l2_dev; 175 176 /* hardware info */ 177 struct usb_device *udev; 178 struct usb_interface *interface; 179 int cur_transfer_mode; 180 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 */ 186 187 u32 state; 188 struct file *file_for_stream; /* the active stream*/ 189 190 #ifdef CONFIG_PM 191 int (*pm_suspend)(struct poseidon *); 192 int (*pm_resume)(struct poseidon *); 193 pm_message_t msg; 194 195 struct work_struct pm_work; 196 u8 portnum; 197 #endif 198 }; 199 200 struct poseidon_format { 201 char *name; 202 int fourcc; /* video4linux 2 */ 203 int depth; /* bit/pixel */ 204 int flags; 205 }; 206 207 struct poseidon_tvnorm { 208 v4l2_std_id v4l2_id; 209 char name[12]; 210 u32 tlg_tvnorm; 211 }; 212 213 /* video */ 214 int pd_video_init(struct poseidon *); 215 void pd_video_exit(struct poseidon *); 216 int stop_all_video_stream(struct poseidon *); 217 218 /* alsa audio */ 219 int poseidon_audio_init(struct poseidon *); 220 int poseidon_audio_free(struct poseidon *); 221 #ifdef CONFIG_PM 222 int pm_alsa_suspend(struct poseidon *); 223 int pm_alsa_resume(struct poseidon *); 224 #endif 225 226 /* dvb */ 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 *); 232 233 /* FM */ 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 *); 237 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); 242 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); 249 250 /* misc */ 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); 255 256 #ifdef CONFIG_PM 257 #define in_hibernation(pd) (pd->msg.event == PM_EVENT_FREEZE) 258 #else 259 #define in_hibernation(pd) (0) 260 #endif 261 #define get_pm_count(p) (atomic_read(&(p)->interface->pm_usage_cnt)) 262 263 #define log(a, ...) printk(KERN_DEBUG "\t[ %s : %.3d ] "a"\n", \ 264 __func__, __LINE__, ## __VA_ARGS__) 265 266 /* for power management */ 267 #define logpm(pd) do {\ 268 if (debug_mode & 0x10)\ 269 log();\ 270 } while (0) 271 272 #define logs(f) do { \ 273 if ((debug_mode & 0x4) && \ 274 (f)->type == V4L2_BUF_TYPE_VBI_CAPTURE) \ 275 log("type : VBI");\ 276 \ 277 if ((debug_mode & 0x8) && \ 278 (f)->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) \ 279 log("type : VIDEO");\ 280 } while (0) 281 #endif 282