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 #include <media/v4l2-ctrls.h> 14 15 #include "dvb_frontend.h" 16 #include "dvbdev.h" 17 #include "dvb_demux.h" 18 #include "dmxdev.h" 19 20 #define SBUF_NUM 8 21 #define MAX_BUFFER_NUM 6 22 #define PK_PER_URB 32 23 #define ISO_PKT_SIZE 3072 24 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_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 (45000000U) 39 #define TUNER_FREQ_MAX (862000000U) 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 struct v4l2_ctrl_handler ctrl_handler; 67 68 /* the working context */ 69 struct running_context context; 70 71 /* for data copy */ 72 int field_count; 73 74 char *dst; 75 int lines_copied; 76 int prev_left; 77 78 int lines_per_field; 79 int lines_size; 80 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; 87 88 int is_streaming; 89 int users; 90 91 /* for bubble handler */ 92 struct work_struct bubble_work; 93 }; 94 95 enum pcm_stream_state { 96 STREAM_OFF, 97 STREAM_ON, 98 STREAM_SUSPEND, 99 }; 100 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; 107 108 unsigned int rcv_position; 109 struct snd_card *card; 110 int card_close; 111 112 int users; 113 int pm_state; 114 enum pcm_stream_state capture_stream; 115 }; 116 117 struct radio_data { 118 __u32 fm_freq; 119 unsigned int is_radio_streaming; 120 int pre_emphasis; 121 struct video_device fm_dev; 122 struct v4l2_ctrl_handler ctrl_handler; 123 }; 124 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; 132 133 atomic_t users; 134 atomic_t active_feed; 135 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]; 142 143 /* data for power resume*/ 144 struct dtv_frontend_properties fe_param; 145 146 /* for channel scanning */ 147 int prev_freq; 148 int bandwidth; 149 unsigned long last_jiffies; 150 }; 151 152 struct front_face { 153 /* use this field to distinguish VIDEO and VBI */ 154 enum v4l2_buf_type type; 155 156 /* for host */ 157 struct videobuf_queue q; 158 159 /* the bridge for host and device */ 160 struct videobuf_buffer *curr_frame; 161 162 /* for device */ 163 spinlock_t queue_lock; 164 struct list_head active; 165 struct poseidon *pd; 166 }; 167 168 struct poseidon { 169 struct list_head device_list; 170 171 struct mutex lock; 172 struct kref kref; 173 174 /* for V4L2 */ 175 struct v4l2_device v4l2_dev; 176 177 /* hardware info */ 178 struct usb_device *udev; 179 struct usb_interface *interface; 180 int cur_transfer_mode; 181 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 */ 187 188 u32 state; 189 struct file *file_for_stream; /* the active stream*/ 190 191 #ifdef CONFIG_PM 192 int (*pm_suspend)(struct poseidon *); 193 int (*pm_resume)(struct poseidon *); 194 pm_message_t msg; 195 196 struct work_struct pm_work; 197 u8 portnum; 198 #endif 199 }; 200 201 struct poseidon_format { 202 char *name; 203 int fourcc; /* video4linux 2 */ 204 int depth; /* bit/pixel */ 205 int flags; 206 }; 207 208 struct poseidon_tvnorm { 209 v4l2_std_id v4l2_id; 210 char name[12]; 211 u32 tlg_tvnorm; 212 }; 213 214 /* video */ 215 int pd_video_init(struct poseidon *); 216 void pd_video_exit(struct poseidon *); 217 int stop_all_video_stream(struct poseidon *); 218 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 226 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 *); 233 234 /* FM */ 235 int poseidon_fm_init(struct poseidon *); 236 int poseidon_fm_exit(struct poseidon *); 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 extern int debug_mode; 253 void set_debug_mode(struct video_device *vfd, int debug_mode); 254 255 #ifdef CONFIG_PM 256 #define in_hibernation(pd) (pd->msg.event == PM_EVENT_FREEZE) 257 #else 258 #define in_hibernation(pd) (0) 259 #endif 260 #define get_pm_count(p) (atomic_read(&(p)->interface->pm_usage_cnt)) 261 262 #define log(a, ...) printk(KERN_DEBUG "\t[ %s : %.3d ] "a"\n", \ 263 __func__, __LINE__, ## __VA_ARGS__) 264 265 /* for power management */ 266 #define logpm(pd) do {\ 267 if (debug_mode & 0x10)\ 268 log();\ 269 } while (0) 270 271 #endif 272