linux/drivers/media/video/tlg2300/pd-common.h
<<
>>
Prefs
   1#ifndef PD_COMMON_H
   2#define PD_COMMON_H
   3
   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>
  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_VBI              (0x0008)
  30#define POSEIDON_STATE_DISCONNECT       (0x0080)
  31
  32#define PM_SUSPEND_DELAY        3
  33
  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)
  38
  39#define TUNER_FREQ_MIN          (45000000)
  40#define TUNER_FREQ_MAX          (862000000)
  41
  42struct vbi_data {
  43        struct video_device     *v_dev;
  44        struct video_data       *video;
  45        struct front_face       *front;
  46
  47        unsigned int            copied;
  48        unsigned int            vbi_size; /* the whole size of two fields */
  49        int                     users;
  50};
  51
  52/*
  53 * This is the running context of the video, it is useful for
  54 * resume()
  55 */
  56struct 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   */
  62};
  63
  64struct video_data {
  65        /* v4l2 video device */
  66        struct video_device     *v_dev;
  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
  95enum 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
 103struct 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
 117struct 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;
 123};
 124
 125#define DVB_SBUF_NUM            4
 126#define DVB_URB_BUF_SIZE        0x2000
 127struct 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 dvb_frontend_parameters fe_param;
 145
 146        /* for channel scanning */
 147        int             prev_freq;
 148        int             bandwidth;
 149        unsigned long   last_jiffies;
 150};
 151
 152struct 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
 168struct 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
 201struct poseidon_format {
 202        char    *name;
 203        int     fourcc;          /* video4linux 2         */
 204        int     depth;           /* bit/pixel             */
 205        int     flags;
 206};
 207
 208struct poseidon_tvnorm {
 209        v4l2_std_id     v4l2_id;
 210        char            name[12];
 211        u32             tlg_tvnorm;
 212};
 213
 214/* video */
 215int pd_video_init(struct poseidon *);
 216void pd_video_exit(struct poseidon *);
 217int stop_all_video_stream(struct poseidon *);
 218
 219/* alsa audio */
 220int poseidon_audio_init(struct poseidon *);
 221int poseidon_audio_free(struct poseidon *);
 222#ifdef CONFIG_PM
 223int pm_alsa_suspend(struct poseidon *);
 224int pm_alsa_resume(struct poseidon *);
 225#endif
 226
 227/* dvb */
 228int pd_dvb_usb_device_init(struct poseidon *);
 229void pd_dvb_usb_device_exit(struct poseidon *);
 230void pd_dvb_usb_device_cleanup(struct poseidon *);
 231int pd_dvb_get_adapter_num(struct pd_dvb_adapter *);
 232void dvb_stop_streaming(struct pd_dvb_adapter *);
 233
 234/* FM */
 235int poseidon_fm_init(struct poseidon *);
 236int poseidon_fm_exit(struct poseidon *);
 237struct video_device *vdev_init(struct poseidon *, struct video_device *);
 238
 239/* vendor command ops */
 240int send_set_req(struct poseidon*, u8, s32, s32*);
 241int send_get_req(struct poseidon*, u8, s32, void*, s32*, s32);
 242s32 set_tuner_mode(struct poseidon*, unsigned char);
 243
 244/* bulk urb alloc/free */
 245int 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);
 249void free_all_urb_generic(struct urb **urb_array, int num);
 250
 251/* misc */
 252void poseidon_delete(struct kref *kref);
 253void destroy_video_device(struct video_device **v_dev);
 254extern int debug_mode;
 255void set_debug_mode(struct video_device *vfd, int debug_mode);
 256
 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))
 263
 264#define log(a, ...) printk(KERN_DEBUG "\t[ %s : %.3d ] "a"\n", \
 265                                __func__, __LINE__,  ## __VA_ARGS__)
 266
 267/* for power management */
 268#define logpm(pd) do {\
 269                        if (debug_mode & 0x10)\
 270                                log();\
 271                } while (0)
 272
 273#define logs(f) do { \
 274                        if ((debug_mode & 0x4) && \
 275                                (f)->type == V4L2_BUF_TYPE_VBI_CAPTURE) \
 276                                        log("type : VBI");\
 277                                                                \
 278                        if ((debug_mode & 0x8) && \
 279                                (f)->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) \
 280                                        log("type : VIDEO");\
 281                } while (0)
 282#endif
 283