Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
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  /* arbitrary */
0012 #define BUFFER_TIMEOUT     (HZ/2)  /* 0.5 seconds */
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;   /* number of lines of vertical offset before processing */
0048     int v_field;    /* number of lines in a field for HPS to process */
0049 
0050     int h_offset;   /* horizontal offset of processing window */
0051     int h_pixels;   /* number of horizontal pixels to process */
0052 
0053     int v_max_out;
0054     int h_max_out;
0055 };
0056 
0057 /* buffer for one video/vbi frame */
0058 struct saa7146_buf {
0059     /* common v4l buffer stuff -- must be first */
0060     struct videobuf_buffer vb;
0061 
0062     /* saa7146 specific */
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     /* page tables */
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 /* per open data */
0087 struct saa7146_fh {
0088     /* Must be the first field! */
0089     struct v4l2_fh      fh;
0090     struct saa7146_dev  *dev;
0091 
0092     /* video capture */
0093     struct videobuf_queue   video_q;
0094 
0095     /* vbi capture */
0096     struct videobuf_queue   vbi_q;
0097 
0098     unsigned int resources; /* resource management for device open */
0099 };
0100 
0101 #define STATUS_OVERLAY  0x01
0102 #define STATUS_CAPTURE  0x02
0103 
0104 struct saa7146_vv
0105 {
0106     /* vbi capture */
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     /* vbi workaround interrupt queue */
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     /* video overlay */
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     /* video capture */
0126     struct saa7146_dmaqueue     video_dmaq;
0127     struct v4l2_pix_format      video_fmt;
0128     enum v4l2_field         last_field;
0129 
0130     /* common: fixme? shouldn't this be in saa7146_fh?
0131        (this leads to a more complicated question: shall the driver
0132        store the different settings (for example S_INPUT) for every open
0133        and restore it appropriately, or should all settings be common for
0134        all opens? currently, we do the latter, like all other
0135        drivers do... */
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; /* pointer to clipping memory */
0144 
0145     unsigned int resources; /* resource management for device */
0146 };
0147 
0148 /* flags */
0149 #define SAA7146_USE_PORT_B_FOR_VBI  0x2     /* use input port b for vbi hardware bug workaround */
0150 
0151 struct saa7146_ext_vv
0152 {
0153     /* information about the video capabilities of the device */
0154     int inputs;
0155     int audios;
0156     u32 capabilities;
0157     int flags;
0158 
0159     /* additionally supported transmission standards */
0160     struct saa7146_standard *stds;
0161     int num_stds;
0162     int (*std_callback)(struct saa7146_dev*, struct saa7146_standard *);
0163 
0164     /* the extension can override this */
0165     struct v4l2_ioctl_ops vid_ops;
0166     struct v4l2_ioctl_ops vbi_ops;
0167     /* pointer to the saa7146 core ops */
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 /* from saa7146_fops.c */
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 /* from saa7146_hlp.c */
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 /* from saa7146_video.c */
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 /* from saa7146_vbi.c */
0213 extern const struct saa7146_use_ops saa7146_vbi_uops;
0214 
0215 /* resource management functions */
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 /* saa7146 source inputs */
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 /* sync inputs */
0230 #define SAA7146_HPS_SYNC_PORT_A     0x00
0231 #define SAA7146_HPS_SYNC_PORT_B     0x01
0232 
0233 /* some memory sizes */
0234 /* max. 16 clipping rectangles */
0235 #define SAA7146_CLIPPING_MEM    (16 * 4 * sizeof(u32))
0236 
0237 /* some defines for the various clipping-modes */
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 /* output formats: each entry holds four information */
0244 #define RGB08_COMPOSED  0x0217 /* composed is used in the sense of "not-planar" */
0245 /* this means: planar?=0, yuv2rgb-conversation-mode=2, dither=yes(=1), format-mode = 7 */
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 /* this means: planar?=1, yuv2rgb-conversion-mode=0, dither=no(=0), format-mode = b */
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 /* misc defines */
0262 #define SAA7146_NO_SWAP     (0x0)
0263 #define SAA7146_TWO_BYTE_SWAP   (0x1)
0264 #define SAA7146_FOUR_BYTE_SWAP  (0x2)
0265 
0266 #endif