162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * zoran - Iomega Buz driver 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 1999 Rainer Johanni <Rainer@Johanni.de> 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * based on 862306a36Sopenharmony_ci * 962306a36Sopenharmony_ci * zoran.0.0.3 Copyright (C) 1998 Dave Perks <dperks@ibm.net> 1062306a36Sopenharmony_ci * 1162306a36Sopenharmony_ci * and 1262306a36Sopenharmony_ci * 1362306a36Sopenharmony_ci * bttv - Bt848 frame grabber driver 1462306a36Sopenharmony_ci * Copyright (C) 1996,97,98 Ralph Metzler (rjkm@thp.uni-koeln.de) 1562306a36Sopenharmony_ci * & Marcus Metzler (mocm@thp.uni-koeln.de) 1662306a36Sopenharmony_ci */ 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#ifndef _BUZ_H_ 1962306a36Sopenharmony_ci#define _BUZ_H_ 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#include <linux/debugfs.h> 2262306a36Sopenharmony_ci#include <linux/pci.h> 2362306a36Sopenharmony_ci#include <linux/i2c-algo-bit.h> 2462306a36Sopenharmony_ci#include <media/v4l2-device.h> 2562306a36Sopenharmony_ci#include <media/v4l2-ctrls.h> 2662306a36Sopenharmony_ci#include <media/videobuf2-core.h> 2762306a36Sopenharmony_ci#include <media/videobuf2-v4l2.h> 2862306a36Sopenharmony_ci#include <media/videobuf2-dma-contig.h> 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci#define ZR_NORM_PAL 0 3162306a36Sopenharmony_ci#define ZR_NORM_NTSC 1 3262306a36Sopenharmony_ci#define ZR_NORM_SECAM 2 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_cistruct zr_buffer { 3562306a36Sopenharmony_ci /* common v4l buffer stuff -- must be first */ 3662306a36Sopenharmony_ci struct vb2_v4l2_buffer vbuf; 3762306a36Sopenharmony_ci struct list_head queue; 3862306a36Sopenharmony_ci}; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_cistatic inline struct zr_buffer *vb2_to_zr_buffer(struct vb2_buffer *vb) 4162306a36Sopenharmony_ci{ 4262306a36Sopenharmony_ci struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb); 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci return container_of(vbuf, struct zr_buffer, vbuf); 4562306a36Sopenharmony_ci} 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci#define ZORAN_NAME "ZORAN" /* name of the device */ 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci#define ZR_DEVNAME(zr) ((zr)->name) 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci#define BUZ_MAX_WIDTH (zr->timing->wa) 5262306a36Sopenharmony_ci#define BUZ_MAX_HEIGHT (zr->timing->ha) 5362306a36Sopenharmony_ci#define BUZ_MIN_WIDTH 32 /* never display less than 32 pixels */ 5462306a36Sopenharmony_ci#define BUZ_MIN_HEIGHT 24 /* never display less than 24 rows */ 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci#define BUZ_NUM_STAT_COM 4 5762306a36Sopenharmony_ci#define BUZ_MASK_STAT_COM 3 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci#define BUZ_MAX_INPUT 16 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci#include "zr36057.h" 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_cienum card_type { 6462306a36Sopenharmony_ci UNKNOWN = -1, 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci /* Pinnacle/Miro */ 6762306a36Sopenharmony_ci DC10_OLD, /* DC30 like */ 6862306a36Sopenharmony_ci DC10_NEW, /* DC10_PLUS like */ 6962306a36Sopenharmony_ci DC10_PLUS, 7062306a36Sopenharmony_ci DC30, 7162306a36Sopenharmony_ci DC30_PLUS, 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci /* Linux Media Labs */ 7462306a36Sopenharmony_ci LML33, 7562306a36Sopenharmony_ci LML33R10, 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci /* Iomega */ 7862306a36Sopenharmony_ci BUZ, 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci /* AverMedia */ 8162306a36Sopenharmony_ci AVS6EYES, 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci /* total number of cards */ 8462306a36Sopenharmony_ci NUM_CARDS 8562306a36Sopenharmony_ci}; 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_cienum zoran_codec_mode { 8862306a36Sopenharmony_ci BUZ_MODE_IDLE, /* nothing going on */ 8962306a36Sopenharmony_ci BUZ_MODE_MOTION_COMPRESS, /* grabbing frames */ 9062306a36Sopenharmony_ci BUZ_MODE_MOTION_DECOMPRESS, /* playing frames */ 9162306a36Sopenharmony_ci BUZ_MODE_STILL_COMPRESS, /* still frame conversion */ 9262306a36Sopenharmony_ci BUZ_MODE_STILL_DECOMPRESS /* still frame conversion */ 9362306a36Sopenharmony_ci}; 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_cienum zoran_map_mode { 9662306a36Sopenharmony_ci ZORAN_MAP_MODE_NONE, 9762306a36Sopenharmony_ci ZORAN_MAP_MODE_RAW, 9862306a36Sopenharmony_ci ZORAN_MAP_MODE_JPG_REC, 9962306a36Sopenharmony_ci ZORAN_MAP_MODE_JPG_PLAY, 10062306a36Sopenharmony_ci}; 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_cienum gpio_type { 10362306a36Sopenharmony_ci ZR_GPIO_JPEG_SLEEP = 0, 10462306a36Sopenharmony_ci ZR_GPIO_JPEG_RESET, 10562306a36Sopenharmony_ci ZR_GPIO_JPEG_FRAME, 10662306a36Sopenharmony_ci ZR_GPIO_VID_DIR, 10762306a36Sopenharmony_ci ZR_GPIO_VID_EN, 10862306a36Sopenharmony_ci ZR_GPIO_VID_RESET, 10962306a36Sopenharmony_ci ZR_GPIO_CLK_SEL1, 11062306a36Sopenharmony_ci ZR_GPIO_CLK_SEL2, 11162306a36Sopenharmony_ci ZR_GPIO_MAX, 11262306a36Sopenharmony_ci}; 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_cienum gpcs_type { 11562306a36Sopenharmony_ci GPCS_JPEG_RESET = 0, 11662306a36Sopenharmony_ci GPCS_JPEG_START, 11762306a36Sopenharmony_ci GPCS_MAX, 11862306a36Sopenharmony_ci}; 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_cistruct zoran_format { 12162306a36Sopenharmony_ci char *name; 12262306a36Sopenharmony_ci __u32 fourcc; 12362306a36Sopenharmony_ci int colorspace; 12462306a36Sopenharmony_ci int depth; 12562306a36Sopenharmony_ci __u32 flags; 12662306a36Sopenharmony_ci __u32 vfespfr; 12762306a36Sopenharmony_ci}; 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci/* flags */ 13062306a36Sopenharmony_ci#define ZORAN_FORMAT_COMPRESSED BIT(0) 13162306a36Sopenharmony_ci#define ZORAN_FORMAT_OVERLAY BIT(1) 13262306a36Sopenharmony_ci#define ZORAN_FORMAT_CAPTURE BIT(2) 13362306a36Sopenharmony_ci#define ZORAN_FORMAT_PLAYBACK BIT(3) 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci/* v4l-capture settings */ 13662306a36Sopenharmony_cistruct zoran_v4l_settings { 13762306a36Sopenharmony_ci int width, height, bytesperline; /* capture size */ 13862306a36Sopenharmony_ci const struct zoran_format *format; /* capture format */ 13962306a36Sopenharmony_ci}; 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci/* jpg-capture/-playback settings */ 14262306a36Sopenharmony_cistruct zoran_jpg_settings { 14362306a36Sopenharmony_ci /* this bit is used to set everything to default */ 14462306a36Sopenharmony_ci int decimation; 14562306a36Sopenharmony_ci /* capture decimation settings (tmp_dcm=1 means both fields) */ 14662306a36Sopenharmony_ci int hor_dcm, ver_dcm, tmp_dcm; 14762306a36Sopenharmony_ci /* field-settings (odd_even=1 (+tmp_dcm=1) means top-field-first) */ 14862306a36Sopenharmony_ci int field_per_buff, odd_even; 14962306a36Sopenharmony_ci /* crop settings (subframe capture) */ 15062306a36Sopenharmony_ci int img_x, img_y, img_width, img_height; 15162306a36Sopenharmony_ci /* JPEG-specific capture settings */ 15262306a36Sopenharmony_ci struct v4l2_jpegcompression jpg_comp; 15362306a36Sopenharmony_ci}; 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_cistruct zoran; 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_ci/* zoran_fh contains per-open() settings */ 15862306a36Sopenharmony_cistruct zoran_fh { 15962306a36Sopenharmony_ci struct v4l2_fh fh; 16062306a36Sopenharmony_ci struct zoran *zr; 16162306a36Sopenharmony_ci}; 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_cistruct card_info { 16462306a36Sopenharmony_ci enum card_type type; 16562306a36Sopenharmony_ci char name[32]; 16662306a36Sopenharmony_ci const char *i2c_decoder; /* i2c decoder device */ 16762306a36Sopenharmony_ci const unsigned short *addrs_decoder; 16862306a36Sopenharmony_ci const char *i2c_encoder; /* i2c encoder device */ 16962306a36Sopenharmony_ci const unsigned short *addrs_encoder; 17062306a36Sopenharmony_ci u16 video_vfe, video_codec; /* videocodec types */ 17162306a36Sopenharmony_ci u16 audio_chip; /* audio type */ 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci int inputs; /* number of video inputs */ 17462306a36Sopenharmony_ci struct input { 17562306a36Sopenharmony_ci int muxsel; 17662306a36Sopenharmony_ci char name[32]; 17762306a36Sopenharmony_ci } input[BUZ_MAX_INPUT]; 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_ci v4l2_std_id norms; 18062306a36Sopenharmony_ci const struct tvnorm *tvn[3]; /* supported TV norms */ 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci u32 jpeg_int; /* JPEG interrupt */ 18362306a36Sopenharmony_ci u32 vsync_int; /* VSYNC interrupt */ 18462306a36Sopenharmony_ci s8 gpio[ZR_GPIO_MAX]; 18562306a36Sopenharmony_ci u8 gpcs[GPCS_MAX]; 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ci struct vfe_polarity vfe_pol; 18862306a36Sopenharmony_ci u8 gpio_pol[ZR_GPIO_MAX]; 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_ci /* is the /GWS line connected? */ 19162306a36Sopenharmony_ci u8 gws_not_connected; 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci /* avs6eyes mux setting */ 19462306a36Sopenharmony_ci u8 input_mux; 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci void (*init)(struct zoran *zr); 19762306a36Sopenharmony_ci}; 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_cistruct zoran { 20062306a36Sopenharmony_ci struct v4l2_device v4l2_dev; 20162306a36Sopenharmony_ci struct v4l2_ctrl_handler hdl; 20262306a36Sopenharmony_ci struct video_device *video_dev; 20362306a36Sopenharmony_ci struct vb2_queue vq; 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_ci struct i2c_adapter i2c_adapter; /* */ 20662306a36Sopenharmony_ci struct i2c_algo_bit_data i2c_algo; /* */ 20762306a36Sopenharmony_ci u32 i2cbr; 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci struct v4l2_subdev *decoder; /* video decoder sub-device */ 21062306a36Sopenharmony_ci struct v4l2_subdev *encoder; /* video encoder sub-device */ 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ci struct videocodec *codec; /* video codec */ 21362306a36Sopenharmony_ci struct videocodec *vfe; /* video front end */ 21462306a36Sopenharmony_ci 21562306a36Sopenharmony_ci struct mutex lock; /* file ops serialize lock */ 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ci u8 initialized; /* flag if zoran has been correctly initialized */ 21862306a36Sopenharmony_ci struct card_info card; 21962306a36Sopenharmony_ci const struct tvnorm *timing; 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci unsigned short id; /* number of this device */ 22262306a36Sopenharmony_ci char name[32]; /* name of this device */ 22362306a36Sopenharmony_ci struct pci_dev *pci_dev; /* PCI device */ 22462306a36Sopenharmony_ci unsigned char revision; /* revision of zr36057 */ 22562306a36Sopenharmony_ci unsigned char __iomem *zr36057_mem;/* pointer to mapped IO memory */ 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci spinlock_t spinlock; /* Spinlock */ 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ci /* Video for Linux parameters */ 23062306a36Sopenharmony_ci int input; /* card's norm and input */ 23162306a36Sopenharmony_ci v4l2_std_id norm; 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_ci /* Current buffer params */ 23462306a36Sopenharmony_ci unsigned int buffer_size; 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_ci struct zoran_v4l_settings v4l_settings; /* structure with a lot of things to play with */ 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_ci /* Buz MJPEG parameters */ 23962306a36Sopenharmony_ci enum zoran_codec_mode codec_mode; /* status of codec */ 24062306a36Sopenharmony_ci struct zoran_jpg_settings jpg_settings; /* structure with a lot of things to play with */ 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ci /* grab queue counts/indices, mask with BUZ_MASK_STAT_COM before using as index */ 24362306a36Sopenharmony_ci /* (dma_head - dma_tail) is number active in DMA, must be <= BUZ_NUM_STAT_COM */ 24462306a36Sopenharmony_ci /* (value & BUZ_MASK_STAT_COM) corresponds to index in stat_com table */ 24562306a36Sopenharmony_ci unsigned long jpg_que_head; /* Index where to put next buffer which is queued */ 24662306a36Sopenharmony_ci unsigned long jpg_dma_head; /* Index of next buffer which goes into stat_com */ 24762306a36Sopenharmony_ci unsigned long jpg_dma_tail; /* Index of last buffer in stat_com */ 24862306a36Sopenharmony_ci unsigned long jpg_que_tail; /* Index of last buffer in queue */ 24962306a36Sopenharmony_ci unsigned long jpg_seq_num; /* count of frames since grab/play started */ 25062306a36Sopenharmony_ci unsigned long jpg_err_seq; /* last seq_num before error */ 25162306a36Sopenharmony_ci unsigned long jpg_err_shift; 25262306a36Sopenharmony_ci unsigned long jpg_queued_num; /* count of frames queued since grab/play started */ 25362306a36Sopenharmony_ci unsigned long vbseq; 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_ci /* zr36057's code buffer table */ 25662306a36Sopenharmony_ci /* stat_com[i] is indexed by dma_head/tail & BUZ_MASK_STAT_COM */ 25762306a36Sopenharmony_ci __le32 *stat_com; 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_ci /* Additional stuff for testing */ 26062306a36Sopenharmony_ci unsigned int ghost_int; 26162306a36Sopenharmony_ci int intr_counter_GIRQ1; 26262306a36Sopenharmony_ci int intr_counter_GIRQ0; 26362306a36Sopenharmony_ci int intr_counter_cod_rep_irq; 26462306a36Sopenharmony_ci int intr_counter_jpeg_rep_irq; 26562306a36Sopenharmony_ci int field_counter; 26662306a36Sopenharmony_ci int irq1_in; 26762306a36Sopenharmony_ci int irq1_out; 26862306a36Sopenharmony_ci int jpeg_in; 26962306a36Sopenharmony_ci int jpeg_out; 27062306a36Sopenharmony_ci int JPEG_0; 27162306a36Sopenharmony_ci int JPEG_1; 27262306a36Sopenharmony_ci int end_event_missed; 27362306a36Sopenharmony_ci int jpeg_missed; 27462306a36Sopenharmony_ci int jpeg_error; 27562306a36Sopenharmony_ci int num_errors; 27662306a36Sopenharmony_ci int jpeg_max_missed; 27762306a36Sopenharmony_ci int jpeg_min_missed; 27862306a36Sopenharmony_ci unsigned int prepared; 27962306a36Sopenharmony_ci unsigned int queued; 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_ci u32 last_isr; 28262306a36Sopenharmony_ci unsigned long frame_num; 28362306a36Sopenharmony_ci int running; 28462306a36Sopenharmony_ci int buf_in_reserve; 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_ci dma_addr_t p_sc; 28762306a36Sopenharmony_ci __le32 *stat_comb; 28862306a36Sopenharmony_ci dma_addr_t p_scb; 28962306a36Sopenharmony_ci enum zoran_map_mode map_mode; 29062306a36Sopenharmony_ci struct list_head queued_bufs; 29162306a36Sopenharmony_ci spinlock_t queued_bufs_lock; /* Protects queued_bufs */ 29262306a36Sopenharmony_ci struct zr_buffer *inuse[BUZ_NUM_STAT_COM * 2]; 29362306a36Sopenharmony_ci struct dentry *dbgfs_dir; 29462306a36Sopenharmony_ci}; 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_cistatic inline struct zoran *to_zoran(struct v4l2_device *v4l2_dev) 29762306a36Sopenharmony_ci{ 29862306a36Sopenharmony_ci return container_of(v4l2_dev, struct zoran, v4l2_dev); 29962306a36Sopenharmony_ci} 30062306a36Sopenharmony_ci 30162306a36Sopenharmony_ci/* 30262306a36Sopenharmony_ci * There was something called _ALPHA_BUZ that used the PCI address instead of 30362306a36Sopenharmony_ci * the kernel iomapped address for btread/btwrite. 30462306a36Sopenharmony_ci */ 30562306a36Sopenharmony_ci#define btwrite(dat, adr) writel((dat), zr->zr36057_mem + (adr)) 30662306a36Sopenharmony_ci#define btread(adr) readl(zr->zr36057_mem + (adr)) 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_ci#define btand(dat, adr) btwrite((dat) & btread(adr), (adr)) 30962306a36Sopenharmony_ci#define btor(dat, adr) btwrite((dat) | btread(adr), (adr)) 31062306a36Sopenharmony_ci#define btaor(dat, mask, adr) btwrite((dat) | ((mask) & btread(adr)), (adr)) 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_ci#endif 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_ci/* 31562306a36Sopenharmony_ci * Debugging macros 31662306a36Sopenharmony_ci */ 31762306a36Sopenharmony_ci#define zrdev_dbg(zr, format, args...) \ 31862306a36Sopenharmony_ci pci_dbg((zr)->pci_dev, format, ##args) \ 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_ci#define zrdev_err(zr, format, args...) \ 32162306a36Sopenharmony_ci pci_err((zr)->pci_dev, format, ##args) \ 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_ci#define zrdev_info(zr, format, args...) \ 32462306a36Sopenharmony_ci pci_info((zr)->pci_dev, format, ##args) \ 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_ciint zoran_queue_init(struct zoran *zr, struct vb2_queue *vq, int dir); 32762306a36Sopenharmony_civoid zoran_queue_exit(struct zoran *zr); 32862306a36Sopenharmony_ciint zr_set_buf(struct zoran *zr); 329