0001
0002 #ifndef __SAA7146_VV__
0003 #define __SAA7146_VV__
0004
0005 #include <media/v4l2-common.h>
0006 #include <media/v4l2-ioctl.h>
0007 #include <media/v4l2-fh.h>
0008 #include <media/drv-intf/saa7146.h>
0009 #include <media/videobuf-dma-sg.h>
0010
0011 #define MAX_SAA7146_CAPTURE_BUFFERS 32
0012 #define BUFFER_TIMEOUT (HZ/2)
0013
0014 #define WRITE_RPS0(x) do { \
0015 dev->d_rps0.cpu_addr[ count++ ] = cpu_to_le32(x); \
0016 } while (0);
0017
0018 #define WRITE_RPS1(x) do { \
0019 dev->d_rps1.cpu_addr[ count++ ] = cpu_to_le32(x); \
0020 } while (0);
0021
0022 struct saa7146_video_dma {
0023 u32 base_odd;
0024 u32 base_even;
0025 u32 prot_addr;
0026 u32 pitch;
0027 u32 base_page;
0028 u32 num_line_byte;
0029 };
0030
0031 #define FORMAT_BYTE_SWAP 0x1
0032 #define FORMAT_IS_PLANAR 0x2
0033
0034 struct saa7146_format {
0035 u32 pixelformat;
0036 u32 trans;
0037 u8 depth;
0038 u8 flags;
0039 u8 swap;
0040 };
0041
0042 struct saa7146_standard
0043 {
0044 char *name;
0045 v4l2_std_id id;
0046
0047 int v_offset;
0048 int v_field;
0049
0050 int h_offset;
0051 int h_pixels;
0052
0053 int v_max_out;
0054 int h_max_out;
0055 };
0056
0057
0058 struct saa7146_buf {
0059
0060 struct videobuf_buffer vb;
0061
0062
0063 struct v4l2_pix_format *fmt;
0064 int (*activate)(struct saa7146_dev *dev,
0065 struct saa7146_buf *buf,
0066 struct saa7146_buf *next);
0067
0068
0069 struct saa7146_pgtable pt[3];
0070 };
0071
0072 struct saa7146_dmaqueue {
0073 struct saa7146_dev *dev;
0074 struct saa7146_buf *curr;
0075 struct list_head queue;
0076 struct timer_list timeout;
0077 };
0078
0079 struct saa7146_overlay {
0080 struct saa7146_fh *fh;
0081 struct v4l2_window win;
0082 struct v4l2_clip clips[16];
0083 int nclips;
0084 };
0085
0086
0087 struct saa7146_fh {
0088
0089 struct v4l2_fh fh;
0090 struct saa7146_dev *dev;
0091
0092
0093 struct videobuf_queue video_q;
0094
0095
0096 struct videobuf_queue vbi_q;
0097
0098 unsigned int resources;
0099 };
0100
0101 #define STATUS_OVERLAY 0x01
0102 #define STATUS_CAPTURE 0x02
0103
0104 struct saa7146_vv
0105 {
0106
0107 struct saa7146_dmaqueue vbi_dmaq;
0108 struct v4l2_vbi_format vbi_fmt;
0109 struct timer_list vbi_read_timeout;
0110 struct file *vbi_read_timeout_file;
0111
0112 wait_queue_head_t vbi_wq;
0113 int vbi_fieldcount;
0114 struct saa7146_fh *vbi_streaming;
0115
0116 int video_status;
0117 struct saa7146_fh *video_fh;
0118
0119
0120 struct saa7146_overlay ov;
0121 struct v4l2_framebuffer ov_fb;
0122 struct saa7146_format *ov_fmt;
0123 struct saa7146_fh *ov_suspend;
0124
0125
0126 struct saa7146_dmaqueue video_dmaq;
0127 struct v4l2_pix_format video_fmt;
0128 enum v4l2_field last_field;
0129
0130
0131
0132
0133
0134
0135
0136 struct saa7146_standard *standard;
0137
0138 int vflip;
0139 int hflip;
0140 int current_hps_source;
0141 int current_hps_sync;
0142
0143 struct saa7146_dma d_clipping;
0144
0145 unsigned int resources;
0146 };
0147
0148
0149 #define SAA7146_USE_PORT_B_FOR_VBI 0x2
0150
0151 struct saa7146_ext_vv
0152 {
0153
0154 int inputs;
0155 int audios;
0156 u32 capabilities;
0157 int flags;
0158
0159
0160 struct saa7146_standard *stds;
0161 int num_stds;
0162 int (*std_callback)(struct saa7146_dev*, struct saa7146_standard *);
0163
0164
0165 struct v4l2_ioctl_ops vid_ops;
0166 struct v4l2_ioctl_ops vbi_ops;
0167
0168 const struct v4l2_ioctl_ops *core_ops;
0169
0170 struct v4l2_file_operations vbi_fops;
0171 };
0172
0173 struct saa7146_use_ops {
0174 void (*init)(struct saa7146_dev *, struct saa7146_vv *);
0175 int(*open)(struct saa7146_dev *, struct file *);
0176 void (*release)(struct saa7146_dev *, struct file *);
0177 void (*irq_done)(struct saa7146_dev *, unsigned long status);
0178 ssize_t (*read)(struct file *, char __user *, size_t, loff_t *);
0179 };
0180
0181
0182 int saa7146_register_device(struct video_device *vid, struct saa7146_dev *dev, char *name, int type);
0183 int saa7146_unregister_device(struct video_device *vid, struct saa7146_dev *dev);
0184 void saa7146_buffer_finish(struct saa7146_dev *dev, struct saa7146_dmaqueue *q, int state);
0185 void saa7146_buffer_next(struct saa7146_dev *dev, struct saa7146_dmaqueue *q,int vbi);
0186 int saa7146_buffer_queue(struct saa7146_dev *dev, struct saa7146_dmaqueue *q, struct saa7146_buf *buf);
0187 void saa7146_buffer_timeout(struct timer_list *t);
0188 void saa7146_dma_free(struct saa7146_dev* dev,struct videobuf_queue *q,
0189 struct saa7146_buf *buf);
0190
0191 int saa7146_vv_init(struct saa7146_dev* dev, struct saa7146_ext_vv *ext_vv);
0192 int saa7146_vv_release(struct saa7146_dev* dev);
0193
0194
0195 int saa7146_enable_overlay(struct saa7146_fh *fh);
0196 void saa7146_disable_overlay(struct saa7146_fh *fh);
0197
0198 void saa7146_set_capture(struct saa7146_dev *dev, struct saa7146_buf *buf, struct saa7146_buf *next);
0199 void saa7146_write_out_dma(struct saa7146_dev* dev, int which, struct saa7146_video_dma* vdma) ;
0200 void saa7146_set_hps_source_and_sync(struct saa7146_dev *saa, int source, int sync);
0201 void saa7146_set_gpio(struct saa7146_dev *saa, u8 pin, u8 data);
0202
0203
0204 extern const struct v4l2_ioctl_ops saa7146_video_ioctl_ops;
0205 extern const struct v4l2_ioctl_ops saa7146_vbi_ioctl_ops;
0206 extern const struct saa7146_use_ops saa7146_video_uops;
0207 int saa7146_start_preview(struct saa7146_fh *fh);
0208 int saa7146_stop_preview(struct saa7146_fh *fh);
0209 long saa7146_video_do_ioctl(struct file *file, unsigned int cmd, void *arg);
0210 int saa7146_s_ctrl(struct v4l2_ctrl *ctrl);
0211
0212
0213 extern const struct saa7146_use_ops saa7146_vbi_uops;
0214
0215
0216 int saa7146_res_get(struct saa7146_fh *fh, unsigned int bit);
0217 void saa7146_res_free(struct saa7146_fh *fh, unsigned int bits);
0218
0219 #define RESOURCE_DMA1_HPS 0x1
0220 #define RESOURCE_DMA2_CLP 0x2
0221 #define RESOURCE_DMA3_BRS 0x4
0222
0223
0224 #define SAA7146_HPS_SOURCE_PORT_A 0x00
0225 #define SAA7146_HPS_SOURCE_PORT_B 0x01
0226 #define SAA7146_HPS_SOURCE_YPB_CPA 0x02
0227 #define SAA7146_HPS_SOURCE_YPA_CPB 0x03
0228
0229
0230 #define SAA7146_HPS_SYNC_PORT_A 0x00
0231 #define SAA7146_HPS_SYNC_PORT_B 0x01
0232
0233
0234
0235 #define SAA7146_CLIPPING_MEM (16 * 4 * sizeof(u32))
0236
0237
0238 #define SAA7146_CLIPPING_RECT 0x4
0239 #define SAA7146_CLIPPING_RECT_INVERTED 0x5
0240 #define SAA7146_CLIPPING_MASK 0x6
0241 #define SAA7146_CLIPPING_MASK_INVERTED 0x7
0242
0243
0244 #define RGB08_COMPOSED 0x0217
0245
0246 #define RGB15_COMPOSED 0x0213
0247 #define RGB16_COMPOSED 0x0210
0248 #define RGB24_COMPOSED 0x0201
0249 #define RGB32_COMPOSED 0x0202
0250
0251 #define Y8 0x0006
0252 #define YUV411_COMPOSED 0x0003
0253 #define YUV422_COMPOSED 0x0000
0254
0255 #define YUV411_DECOMPOSED 0x100b
0256 #define YUV422_DECOMPOSED 0x1009
0257 #define YUV420_DECOMPOSED 0x100a
0258
0259 #define IS_PLANAR(x) (x & 0xf000)
0260
0261
0262 #define SAA7146_NO_SWAP (0x0)
0263 #define SAA7146_TWO_BYTE_SWAP (0x1)
0264 #define SAA7146_FOUR_BYTE_SWAP (0x2)
0265
0266 #endif