Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6
[pandora-kernel.git] / drivers / media / video / au0828 / au0828.h
index 9d6a116..6ed1a61 100644 (file)
 #include <linux/i2c-algo-bit.h>
 #include <media/tveeprom.h>
 
+/* Analog */
+#include <linux/videodev2.h>
+#include <media/videobuf-vmalloc.h>
+#include <media/v4l2-device.h>
+
 /* DVB */
 #include "demux.h"
 #include "dmxdev.h"
 #define URB_COUNT   16
 #define URB_BUFSIZE (0xe522)
 
+/* Analog constants */
+#define NTSC_STD_W      720
+#define NTSC_STD_H      480
+
+#define AU0828_INTERLACED_DEFAULT       1
+#define V4L2_CID_PRIVATE_SHARPNESS  (V4L2_CID_PRIVATE_BASE + 0)
+
+/* Defination for AU0828 USB transfer */
+#define AU0828_MAX_ISO_BUFS    12  /* maybe resize this value in the future */
+#define AU0828_ISO_PACKETS_PER_URB      10
+
+#define AU0828_MIN_BUF 4
+#define AU0828_DEF_BUF 8
+
+#define AU0828_MAX_INPUT        4
+
+enum au0828_itype {
+       AU0828_VMUX_UNDEFINED = 0,
+       AU0828_VMUX_COMPOSITE,
+       AU0828_VMUX_SVIDEO,
+       AU0828_VMUX_CABLE,
+       AU0828_VMUX_TELEVISION,
+       AU0828_VMUX_DVB,
+       AU0828_VMUX_DEBUG
+};
+
+struct au0828_input {
+       enum au0828_itype type;
+       unsigned int vmux;
+       unsigned int amux;
+       void (*audio_setup) (void *priv, int enable);
+};
+
 struct au0828_board {
        char *name;
+       unsigned int tuner_type;
+       unsigned char tuner_addr;
+       struct au0828_input input[AU0828_MAX_INPUT];
+
 };
 
 struct au0828_dvb {
@@ -55,31 +97,143 @@ struct au0828_dvb {
        int feeding;
 };
 
+enum au0828_stream_state {
+       STREAM_OFF,
+       STREAM_INTERRUPT,
+       STREAM_ON
+};
+
+#define AUVI_INPUT(nr) (dev->board.input[nr])
+
+/* device state */
+enum au0828_dev_state {
+       DEV_INITIALIZED = 0x01,
+       DEV_DISCONNECTED = 0x02,
+       DEV_MISCONFIGURED = 0x04
+};
+
+struct au0828_fh {
+       struct au0828_dev *dev;
+       unsigned int  stream_on:1;      /* Locks streams */
+       struct videobuf_queue        vb_vidq;
+       enum v4l2_buf_type           type;
+};
+
+struct au0828_usb_isoc_ctl {
+               /* max packet size of isoc transaction */
+       int                             max_pkt_size;
+
+               /* number of allocated urbs */
+       int                             num_bufs;
+
+               /* urb for isoc transfers */
+       struct urb                      **urb;
+
+               /* transfer buffers for isoc transfer */
+       char                            **transfer_buffer;
+
+               /* Last buffer command and region */
+       u8                              cmd;
+       int                             pos, size, pktsize;
+
+               /* Last field: ODD or EVEN? */
+       int                             field;
+
+               /* Stores incomplete commands */
+       u32                             tmp_buf;
+       int                             tmp_buf_len;
+
+               /* Stores already requested buffers */
+       struct au0828_buffer            *buf;
+
+               /* Stores the number of received fields */
+       int                             nfields;
+
+               /* isoc urb callback */
+       int (*isoc_copy) (struct au0828_dev *dev, struct urb *urb);
+
+};
+
+/* buffer for one video frame */
+struct au0828_buffer {
+       /* common v4l buffer stuff -- must be first */
+       struct videobuf_buffer vb;
+
+       struct list_head frame;
+       int top_field;
+       int receiving;
+};
+
+struct au0828_dmaqueue {
+       struct list_head       active;
+       struct list_head       queued;
+
+       wait_queue_head_t          wq;
+
+       /* Counters to control buffer fill */
+       int                        pos;
+};
+
 struct au0828_dev {
        struct mutex mutex;
        struct usb_device       *usbdev;
-       int                     board;
+       int                     boardnr;
+       struct au0828_board     board;
        u8                      ctrlmsg[64];
 
        /* I2C */
        struct i2c_adapter              i2c_adap;
-       struct i2c_algo_bit_data        i2c_algo;
+       struct i2c_algorithm            i2c_algo;
        struct i2c_client               i2c_client;
        u32                             i2c_rc;
 
        /* Digital */
        struct au0828_dvb               dvb;
 
+       /* Analog */
+       struct list_head au0828list;
+       struct v4l2_device v4l2_dev;
+       int users;
+       unsigned int stream_on:1;       /* Locks streams */
+       struct video_device *vdev;
+       struct video_device *vbi_dev;
+       int width;
+       int height;
+       u32 field_size;
+       u32 frame_size;
+       u32 bytesperline;
+       int type;
+       u8 ctrl_ainput;
+       __u8 isoc_in_endpointaddr;
+       u8 isoc_init_ok;
+       int greenscreen_detected;
+       unsigned int frame_count;
+       int ctrl_freq;
+       int input_type;
+       unsigned int ctrl_input;
+       enum au0828_dev_state dev_state;
+       enum au0828_stream_state stream_state;
+       wait_queue_head_t open;
+
+       struct mutex lock;
+
+       /* Isoc control struct */
+       struct au0828_dmaqueue vidq;
+       struct au0828_usb_isoc_ctl isoc_ctl;
+       spinlock_t slock;
+
+       /* usb transfer */
+       int alt;                /* alternate */
+       int max_pkt_size;       /* max packet size of isoc transaction */
+       int num_alt;            /* Number of alternative settings */
+       unsigned int *alt_max_pkt_size; /* array of wMaxPacketSize */
+       struct urb *urb[AU0828_MAX_ISO_BUFS];   /* urb for isoc transfers */
+       char *transfer_buffer[AU0828_MAX_ISO_BUFS];/* transfer buffers for isoc
+                                                  transfer */
+
        /* USB / URB Related */
        int             urb_streaming;
        struct urb      *urbs[URB_COUNT];
-
-};
-
-struct au0828_buff {
-       struct au0828_dev       *dev;
-       struct urb              *purb;
-       struct list_head        buff_list;
 };
 
 /* ----------------------------------------------------------- */
@@ -111,8 +265,13 @@ extern void au0828_card_setup(struct au0828_dev *dev);
 /* au0828-i2c.c */
 extern int au0828_i2c_register(struct au0828_dev *dev);
 extern int au0828_i2c_unregister(struct au0828_dev *dev);
-extern void au0828_call_i2c_clients(struct au0828_dev *dev,
-       unsigned int cmd, void *arg);
+
+/* ----------------------------------------------------------- */
+/* au0828-video.c */
+int au0828_analog_register(struct au0828_dev *dev,
+                          struct usb_interface *interface);
+int au0828_analog_stream_disable(struct au0828_dev *d);
+void au0828_analog_unregister(struct au0828_dev *dev);
 
 /* ----------------------------------------------------------- */
 /* au0828-dvb.c */