139d08ab9SHans Verkuil /* SPDX-License-Identifier: GPL-2.0 */ 239d08ab9SHans Verkuil #ifndef __SAA7146_VV__ 339d08ab9SHans Verkuil #define __SAA7146_VV__ 439d08ab9SHans Verkuil 539d08ab9SHans Verkuil #include <media/v4l2-common.h> 639d08ab9SHans Verkuil #include <media/v4l2-ioctl.h> 739d08ab9SHans Verkuil #include <media/v4l2-fh.h> 839d08ab9SHans Verkuil #include <media/drv-intf/saa7146.h> 9*0b6e30bdSHans Verkuil #include <media/videobuf2-dma-sg.h> 1039d08ab9SHans Verkuil 1139d08ab9SHans Verkuil #define MAX_SAA7146_CAPTURE_BUFFERS 32 /* arbitrary */ 1239d08ab9SHans Verkuil #define BUFFER_TIMEOUT (HZ/2) /* 0.5 seconds */ 1339d08ab9SHans Verkuil 1439d08ab9SHans Verkuil #define WRITE_RPS0(x) do { \ 1539d08ab9SHans Verkuil dev->d_rps0.cpu_addr[ count++ ] = cpu_to_le32(x); \ 1639d08ab9SHans Verkuil } while (0); 1739d08ab9SHans Verkuil 1839d08ab9SHans Verkuil #define WRITE_RPS1(x) do { \ 1939d08ab9SHans Verkuil dev->d_rps1.cpu_addr[ count++ ] = cpu_to_le32(x); \ 2039d08ab9SHans Verkuil } while (0); 2139d08ab9SHans Verkuil 2239d08ab9SHans Verkuil struct saa7146_video_dma { 2339d08ab9SHans Verkuil u32 base_odd; 2439d08ab9SHans Verkuil u32 base_even; 2539d08ab9SHans Verkuil u32 prot_addr; 2639d08ab9SHans Verkuil u32 pitch; 2739d08ab9SHans Verkuil u32 base_page; 2839d08ab9SHans Verkuil u32 num_line_byte; 2939d08ab9SHans Verkuil }; 3039d08ab9SHans Verkuil 3139d08ab9SHans Verkuil #define FORMAT_BYTE_SWAP 0x1 3239d08ab9SHans Verkuil #define FORMAT_IS_PLANAR 0x2 3339d08ab9SHans Verkuil 3439d08ab9SHans Verkuil struct saa7146_format { 3539d08ab9SHans Verkuil u32 pixelformat; 3639d08ab9SHans Verkuil u32 trans; 3739d08ab9SHans Verkuil u8 depth; 3839d08ab9SHans Verkuil u8 flags; 3939d08ab9SHans Verkuil u8 swap; 4039d08ab9SHans Verkuil }; 4139d08ab9SHans Verkuil 4239d08ab9SHans Verkuil struct saa7146_standard 4339d08ab9SHans Verkuil { 4439d08ab9SHans Verkuil char *name; 4539d08ab9SHans Verkuil v4l2_std_id id; 4639d08ab9SHans Verkuil 4739d08ab9SHans Verkuil int v_offset; /* number of lines of vertical offset before processing */ 4839d08ab9SHans Verkuil int v_field; /* number of lines in a field for HPS to process */ 4939d08ab9SHans Verkuil 5039d08ab9SHans Verkuil int h_offset; /* horizontal offset of processing window */ 5139d08ab9SHans Verkuil int h_pixels; /* number of horizontal pixels to process */ 5239d08ab9SHans Verkuil 5339d08ab9SHans Verkuil int v_max_out; 5439d08ab9SHans Verkuil int h_max_out; 5539d08ab9SHans Verkuil }; 5639d08ab9SHans Verkuil 5739d08ab9SHans Verkuil /* buffer for one video/vbi frame */ 5839d08ab9SHans Verkuil struct saa7146_buf { 5939d08ab9SHans Verkuil /* common v4l buffer stuff -- must be first */ 60*0b6e30bdSHans Verkuil struct vb2_v4l2_buffer vb; 61*0b6e30bdSHans Verkuil struct list_head list; 6239d08ab9SHans Verkuil 6339d08ab9SHans Verkuil /* saa7146 specific */ 6439d08ab9SHans Verkuil int (*activate)(struct saa7146_dev *dev, 6539d08ab9SHans Verkuil struct saa7146_buf *buf, 6639d08ab9SHans Verkuil struct saa7146_buf *next); 6739d08ab9SHans Verkuil 6839d08ab9SHans Verkuil /* page tables */ 6939d08ab9SHans Verkuil struct saa7146_pgtable pt[3]; 7039d08ab9SHans Verkuil }; 7139d08ab9SHans Verkuil 7239d08ab9SHans Verkuil struct saa7146_dmaqueue { 7339d08ab9SHans Verkuil struct saa7146_dev *dev; 7439d08ab9SHans Verkuil struct saa7146_buf *curr; 7539d08ab9SHans Verkuil struct list_head queue; 7639d08ab9SHans Verkuil struct timer_list timeout; 77*0b6e30bdSHans Verkuil struct vb2_queue q; 7839d08ab9SHans Verkuil }; 7939d08ab9SHans Verkuil 8039d08ab9SHans Verkuil struct saa7146_vv 8139d08ab9SHans Verkuil { 8239d08ab9SHans Verkuil /* vbi capture */ 8339d08ab9SHans Verkuil struct saa7146_dmaqueue vbi_dmaq; 8439d08ab9SHans Verkuil struct v4l2_vbi_format vbi_fmt; 8539d08ab9SHans Verkuil struct timer_list vbi_read_timeout; 8639d08ab9SHans Verkuil /* vbi workaround interrupt queue */ 8739d08ab9SHans Verkuil wait_queue_head_t vbi_wq; 8839d08ab9SHans Verkuil 8939d08ab9SHans Verkuil /* video capture */ 9039d08ab9SHans Verkuil struct saa7146_dmaqueue video_dmaq; 9139d08ab9SHans Verkuil struct v4l2_pix_format video_fmt; 9239d08ab9SHans Verkuil enum v4l2_field last_field; 93*0b6e30bdSHans Verkuil u32 seqnr; 9439d08ab9SHans Verkuil 9539d08ab9SHans Verkuil /* common: fixme? shouldn't this be in saa7146_fh? 9639d08ab9SHans Verkuil (this leads to a more complicated question: shall the driver 9739d08ab9SHans Verkuil store the different settings (for example S_INPUT) for every open 9839d08ab9SHans Verkuil and restore it appropriately, or should all settings be common for 9939d08ab9SHans Verkuil all opens? currently, we do the latter, like all other 10039d08ab9SHans Verkuil drivers do... */ 10139d08ab9SHans Verkuil struct saa7146_standard *standard; 10239d08ab9SHans Verkuil 10339d08ab9SHans Verkuil int vflip; 10439d08ab9SHans Verkuil int hflip; 10539d08ab9SHans Verkuil int current_hps_source; 10639d08ab9SHans Verkuil int current_hps_sync; 10739d08ab9SHans Verkuil 10839d08ab9SHans Verkuil unsigned int resources; /* resource management for device */ 10939d08ab9SHans Verkuil }; 11039d08ab9SHans Verkuil 11139d08ab9SHans Verkuil /* flags */ 11239d08ab9SHans Verkuil #define SAA7146_USE_PORT_B_FOR_VBI 0x2 /* use input port b for vbi hardware bug workaround */ 11339d08ab9SHans Verkuil 11439d08ab9SHans Verkuil struct saa7146_ext_vv 11539d08ab9SHans Verkuil { 11639d08ab9SHans Verkuil /* information about the video capabilities of the device */ 11739d08ab9SHans Verkuil int inputs; 11839d08ab9SHans Verkuil int audios; 11939d08ab9SHans Verkuil u32 capabilities; 12039d08ab9SHans Verkuil int flags; 12139d08ab9SHans Verkuil 12239d08ab9SHans Verkuil /* additionally supported transmission standards */ 12339d08ab9SHans Verkuil struct saa7146_standard *stds; 12439d08ab9SHans Verkuil int num_stds; 12539d08ab9SHans Verkuil int (*std_callback)(struct saa7146_dev*, struct saa7146_standard *); 12639d08ab9SHans Verkuil 12739d08ab9SHans Verkuil /* the extension can override this */ 12839d08ab9SHans Verkuil struct v4l2_ioctl_ops vid_ops; 12939d08ab9SHans Verkuil struct v4l2_ioctl_ops vbi_ops; 13039d08ab9SHans Verkuil /* pointer to the saa7146 core ops */ 13139d08ab9SHans Verkuil const struct v4l2_ioctl_ops *core_ops; 13239d08ab9SHans Verkuil 13339d08ab9SHans Verkuil struct v4l2_file_operations vbi_fops; 13439d08ab9SHans Verkuil }; 13539d08ab9SHans Verkuil 13639d08ab9SHans Verkuil struct saa7146_use_ops { 13739d08ab9SHans Verkuil void (*init)(struct saa7146_dev *, struct saa7146_vv *); 13839d08ab9SHans Verkuil void (*irq_done)(struct saa7146_dev *, unsigned long status); 13939d08ab9SHans Verkuil }; 14039d08ab9SHans Verkuil 14139d08ab9SHans Verkuil /* from saa7146_fops.c */ 14239d08ab9SHans Verkuil int saa7146_register_device(struct video_device *vid, struct saa7146_dev *dev, char *name, int type); 14339d08ab9SHans Verkuil int saa7146_unregister_device(struct video_device *vid, struct saa7146_dev *dev); 14439d08ab9SHans Verkuil void saa7146_buffer_finish(struct saa7146_dev *dev, struct saa7146_dmaqueue *q, int state); 14539d08ab9SHans Verkuil void saa7146_buffer_next(struct saa7146_dev *dev, struct saa7146_dmaqueue *q,int vbi); 14639d08ab9SHans Verkuil int saa7146_buffer_queue(struct saa7146_dev *dev, struct saa7146_dmaqueue *q, struct saa7146_buf *buf); 14739d08ab9SHans Verkuil void saa7146_buffer_timeout(struct timer_list *t); 14839d08ab9SHans Verkuil 14939d08ab9SHans Verkuil int saa7146_vv_init(struct saa7146_dev* dev, struct saa7146_ext_vv *ext_vv); 15039d08ab9SHans Verkuil int saa7146_vv_release(struct saa7146_dev* dev); 15139d08ab9SHans Verkuil 15239d08ab9SHans Verkuil /* from saa7146_hlp.c */ 15339d08ab9SHans Verkuil void saa7146_set_capture(struct saa7146_dev *dev, struct saa7146_buf *buf, struct saa7146_buf *next); 15439d08ab9SHans Verkuil void saa7146_write_out_dma(struct saa7146_dev* dev, int which, struct saa7146_video_dma* vdma) ; 15539d08ab9SHans Verkuil void saa7146_set_hps_source_and_sync(struct saa7146_dev *saa, int source, int sync); 15639d08ab9SHans Verkuil void saa7146_set_gpio(struct saa7146_dev *saa, u8 pin, u8 data); 15739d08ab9SHans Verkuil 15839d08ab9SHans Verkuil /* from saa7146_video.c */ 15939d08ab9SHans Verkuil extern const struct v4l2_ioctl_ops saa7146_video_ioctl_ops; 16039d08ab9SHans Verkuil extern const struct v4l2_ioctl_ops saa7146_vbi_ioctl_ops; 16139d08ab9SHans Verkuil extern const struct saa7146_use_ops saa7146_video_uops; 162*0b6e30bdSHans Verkuil extern const struct vb2_ops video_qops; 16339d08ab9SHans Verkuil long saa7146_video_do_ioctl(struct file *file, unsigned int cmd, void *arg); 16439d08ab9SHans Verkuil int saa7146_s_ctrl(struct v4l2_ctrl *ctrl); 16539d08ab9SHans Verkuil 16639d08ab9SHans Verkuil /* from saa7146_vbi.c */ 16739d08ab9SHans Verkuil extern const struct saa7146_use_ops saa7146_vbi_uops; 168*0b6e30bdSHans Verkuil extern const struct vb2_ops vbi_qops; 16939d08ab9SHans Verkuil 17039d08ab9SHans Verkuil /* resource management functions */ 171acdb1573SHans Verkuil int saa7146_res_get(struct saa7146_dev *dev, unsigned int bit); 172acdb1573SHans Verkuil void saa7146_res_free(struct saa7146_dev *dev, unsigned int bits); 17339d08ab9SHans Verkuil 17439d08ab9SHans Verkuil #define RESOURCE_DMA1_HPS 0x1 17539d08ab9SHans Verkuil #define RESOURCE_DMA2_CLP 0x2 17639d08ab9SHans Verkuil #define RESOURCE_DMA3_BRS 0x4 17739d08ab9SHans Verkuil 17839d08ab9SHans Verkuil /* saa7146 source inputs */ 17939d08ab9SHans Verkuil #define SAA7146_HPS_SOURCE_PORT_A 0x00 18039d08ab9SHans Verkuil #define SAA7146_HPS_SOURCE_PORT_B 0x01 18139d08ab9SHans Verkuil #define SAA7146_HPS_SOURCE_YPB_CPA 0x02 18239d08ab9SHans Verkuil #define SAA7146_HPS_SOURCE_YPA_CPB 0x03 18339d08ab9SHans Verkuil 18439d08ab9SHans Verkuil /* sync inputs */ 18539d08ab9SHans Verkuil #define SAA7146_HPS_SYNC_PORT_A 0x00 18639d08ab9SHans Verkuil #define SAA7146_HPS_SYNC_PORT_B 0x01 18739d08ab9SHans Verkuil 18839d08ab9SHans Verkuil /* some memory sizes */ 18939d08ab9SHans Verkuil /* max. 16 clipping rectangles */ 19039d08ab9SHans Verkuil #define SAA7146_CLIPPING_MEM (16 * 4 * sizeof(u32)) 19139d08ab9SHans Verkuil 19239d08ab9SHans Verkuil /* some defines for the various clipping-modes */ 19339d08ab9SHans Verkuil #define SAA7146_CLIPPING_RECT 0x4 19439d08ab9SHans Verkuil #define SAA7146_CLIPPING_RECT_INVERTED 0x5 19539d08ab9SHans Verkuil #define SAA7146_CLIPPING_MASK 0x6 19639d08ab9SHans Verkuil #define SAA7146_CLIPPING_MASK_INVERTED 0x7 19739d08ab9SHans Verkuil 19839d08ab9SHans Verkuil /* output formats: each entry holds four information */ 19939d08ab9SHans Verkuil #define RGB08_COMPOSED 0x0217 /* composed is used in the sense of "not-planar" */ 20039d08ab9SHans Verkuil /* this means: planar?=0, yuv2rgb-conversation-mode=2, dither=yes(=1), format-mode = 7 */ 20139d08ab9SHans Verkuil #define RGB15_COMPOSED 0x0213 20239d08ab9SHans Verkuil #define RGB16_COMPOSED 0x0210 20339d08ab9SHans Verkuil #define RGB24_COMPOSED 0x0201 20439d08ab9SHans Verkuil #define RGB32_COMPOSED 0x0202 20539d08ab9SHans Verkuil 20639d08ab9SHans Verkuil #define Y8 0x0006 20739d08ab9SHans Verkuil #define YUV411_COMPOSED 0x0003 20839d08ab9SHans Verkuil #define YUV422_COMPOSED 0x0000 20939d08ab9SHans Verkuil /* this means: planar?=1, yuv2rgb-conversion-mode=0, dither=no(=0), format-mode = b */ 21039d08ab9SHans Verkuil #define YUV411_DECOMPOSED 0x100b 21139d08ab9SHans Verkuil #define YUV422_DECOMPOSED 0x1009 21239d08ab9SHans Verkuil #define YUV420_DECOMPOSED 0x100a 21339d08ab9SHans Verkuil 21439d08ab9SHans Verkuil #define IS_PLANAR(x) (x & 0xf000) 21539d08ab9SHans Verkuil 21639d08ab9SHans Verkuil /* misc defines */ 21739d08ab9SHans Verkuil #define SAA7146_NO_SWAP (0x0) 21839d08ab9SHans Verkuil #define SAA7146_TWO_BYTE_SWAP (0x1) 21939d08ab9SHans Verkuil #define SAA7146_FOUR_BYTE_SWAP (0x2) 22039d08ab9SHans Verkuil 22139d08ab9SHans Verkuil #endif 222