329 lines · c
1/* SPDX-License-Identifier: GPL-2.0-or-later */2/*3 * zoran - Iomega Buz driver4 *5 * Copyright (C) 1999 Rainer Johanni <Rainer@Johanni.de>6 *7 * based on8 *9 * zoran.0.0.3 Copyright (C) 1998 Dave Perks <dperks@ibm.net>10 *11 * and12 *13 * bttv - Bt848 frame grabber driver14 * Copyright (C) 1996,97,98 Ralph Metzler (rjkm@thp.uni-koeln.de)15 * & Marcus Metzler (mocm@thp.uni-koeln.de)16 */17 18#ifndef _BUZ_H_19#define _BUZ_H_20 21#include <linux/debugfs.h>22#include <linux/pci.h>23#include <linux/i2c-algo-bit.h>24#include <media/v4l2-device.h>25#include <media/v4l2-ctrls.h>26#include <media/videobuf2-core.h>27#include <media/videobuf2-v4l2.h>28#include <media/videobuf2-dma-contig.h>29 30#define ZR_NORM_PAL 031#define ZR_NORM_NTSC 132#define ZR_NORM_SECAM 233 34struct zr_buffer {35 /* common v4l buffer stuff -- must be first */36 struct vb2_v4l2_buffer vbuf;37 struct list_head queue;38};39 40static inline struct zr_buffer *vb2_to_zr_buffer(struct vb2_buffer *vb)41{42 struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);43 44 return container_of(vbuf, struct zr_buffer, vbuf);45}46 47#define ZORAN_NAME "ZORAN" /* name of the device */48 49#define ZR_DEVNAME(zr) ((zr)->name)50 51#define BUZ_MAX_WIDTH (zr->timing->wa)52#define BUZ_MAX_HEIGHT (zr->timing->ha)53#define BUZ_MIN_WIDTH 32 /* never display less than 32 pixels */54#define BUZ_MIN_HEIGHT 24 /* never display less than 24 rows */55 56#define BUZ_NUM_STAT_COM 457#define BUZ_MASK_STAT_COM 358 59#define BUZ_MAX_INPUT 1660 61#include "zr36057.h"62 63enum card_type {64 UNKNOWN = -1,65 66 /* Pinnacle/Miro */67 DC10_OLD, /* DC30 like */68 DC10_NEW, /* DC10_PLUS like */69 DC10_PLUS,70 DC30,71 DC30_PLUS,72 73 /* Linux Media Labs */74 LML33,75 LML33R10,76 77 /* Iomega */78 BUZ,79 80 /* AverMedia */81 AVS6EYES,82 83 /* total number of cards */84 NUM_CARDS85};86 87enum zoran_codec_mode {88 BUZ_MODE_IDLE, /* nothing going on */89 BUZ_MODE_MOTION_COMPRESS, /* grabbing frames */90 BUZ_MODE_MOTION_DECOMPRESS, /* playing frames */91 BUZ_MODE_STILL_COMPRESS, /* still frame conversion */92 BUZ_MODE_STILL_DECOMPRESS /* still frame conversion */93};94 95enum zoran_map_mode {96 ZORAN_MAP_MODE_NONE,97 ZORAN_MAP_MODE_RAW,98 ZORAN_MAP_MODE_JPG_REC,99 ZORAN_MAP_MODE_JPG_PLAY,100};101 102enum gpio_type {103 ZR_GPIO_JPEG_SLEEP = 0,104 ZR_GPIO_JPEG_RESET,105 ZR_GPIO_JPEG_FRAME,106 ZR_GPIO_VID_DIR,107 ZR_GPIO_VID_EN,108 ZR_GPIO_VID_RESET,109 ZR_GPIO_CLK_SEL1,110 ZR_GPIO_CLK_SEL2,111 ZR_GPIO_MAX,112};113 114enum gpcs_type {115 GPCS_JPEG_RESET = 0,116 GPCS_JPEG_START,117 GPCS_MAX,118};119 120struct zoran_format {121 char *name;122 __u32 fourcc;123 int colorspace;124 int depth;125 __u32 flags;126 __u32 vfespfr;127};128 129/* flags */130#define ZORAN_FORMAT_COMPRESSED BIT(0)131#define ZORAN_FORMAT_OVERLAY BIT(1)132#define ZORAN_FORMAT_CAPTURE BIT(2)133#define ZORAN_FORMAT_PLAYBACK BIT(3)134 135/* v4l-capture settings */136struct zoran_v4l_settings {137 int width, height, bytesperline; /* capture size */138 const struct zoran_format *format; /* capture format */139};140 141/* jpg-capture/-playback settings */142struct zoran_jpg_settings {143 /* this bit is used to set everything to default */144 int decimation;145 /* capture decimation settings (tmp_dcm=1 means both fields) */146 int hor_dcm, ver_dcm, tmp_dcm;147 /* field-settings (odd_even=1 (+tmp_dcm=1) means top-field-first) */148 int field_per_buff, odd_even;149 /* crop settings (subframe capture) */150 int img_x, img_y, img_width, img_height;151 /* JPEG-specific capture settings */152 struct v4l2_jpegcompression jpg_comp;153};154 155struct zoran;156 157/* zoran_fh contains per-open() settings */158struct zoran_fh {159 struct v4l2_fh fh;160 struct zoran *zr;161};162 163struct card_info {164 enum card_type type;165 char name[32];166 const char *i2c_decoder; /* i2c decoder device */167 const unsigned short *addrs_decoder;168 const char *i2c_encoder; /* i2c encoder device */169 const unsigned short *addrs_encoder;170 u16 video_vfe, video_codec; /* videocodec types */171 u16 audio_chip; /* audio type */172 173 int inputs; /* number of video inputs */174 struct input {175 int muxsel;176 char name[32];177 } input[BUZ_MAX_INPUT];178 179 v4l2_std_id norms;180 const struct tvnorm *tvn[3]; /* supported TV norms */181 182 u32 jpeg_int; /* JPEG interrupt */183 u32 vsync_int; /* VSYNC interrupt */184 s8 gpio[ZR_GPIO_MAX];185 u8 gpcs[GPCS_MAX];186 187 struct vfe_polarity vfe_pol;188 u8 gpio_pol[ZR_GPIO_MAX];189 190 /* is the /GWS line connected? */191 u8 gws_not_connected;192 193 /* avs6eyes mux setting */194 u8 input_mux;195 196 void (*init)(struct zoran *zr);197};198 199struct zoran {200 struct v4l2_device v4l2_dev;201 struct v4l2_ctrl_handler hdl;202 struct video_device *video_dev;203 struct vb2_queue vq;204 205 struct i2c_adapter i2c_adapter; /* */206 struct i2c_algo_bit_data i2c_algo; /* */207 u32 i2cbr;208 209 struct v4l2_subdev *decoder; /* video decoder sub-device */210 struct v4l2_subdev *encoder; /* video encoder sub-device */211 212 struct videocodec *codec; /* video codec */213 struct videocodec *vfe; /* video front end */214 215 struct mutex lock; /* file ops serialize lock */216 217 u8 initialized; /* flag if zoran has been correctly initialized */218 struct card_info card;219 const struct tvnorm *timing;220 221 unsigned short id; /* number of this device */222 char name[40]; /* name of this device */223 struct pci_dev *pci_dev; /* PCI device */224 unsigned char revision; /* revision of zr36057 */225 unsigned char __iomem *zr36057_mem;/* pointer to mapped IO memory */226 227 spinlock_t spinlock; /* Spinlock */228 229 /* Video for Linux parameters */230 int input; /* card's norm and input */231 v4l2_std_id norm;232 233 /* Current buffer params */234 unsigned int buffer_size;235 236 struct zoran_v4l_settings v4l_settings; /* structure with a lot of things to play with */237 238 /* Buz MJPEG parameters */239 enum zoran_codec_mode codec_mode; /* status of codec */240 struct zoran_jpg_settings jpg_settings; /* structure with a lot of things to play with */241 242 /* grab queue counts/indices, mask with BUZ_MASK_STAT_COM before using as index */243 /* (dma_head - dma_tail) is number active in DMA, must be <= BUZ_NUM_STAT_COM */244 /* (value & BUZ_MASK_STAT_COM) corresponds to index in stat_com table */245 unsigned long jpg_que_head; /* Index where to put next buffer which is queued */246 unsigned long jpg_dma_head; /* Index of next buffer which goes into stat_com */247 unsigned long jpg_dma_tail; /* Index of last buffer in stat_com */248 unsigned long jpg_que_tail; /* Index of last buffer in queue */249 unsigned long jpg_seq_num; /* count of frames since grab/play started */250 unsigned long jpg_err_seq; /* last seq_num before error */251 unsigned long jpg_err_shift;252 unsigned long jpg_queued_num; /* count of frames queued since grab/play started */253 unsigned long vbseq;254 255 /* zr36057's code buffer table */256 /* stat_com[i] is indexed by dma_head/tail & BUZ_MASK_STAT_COM */257 __le32 *stat_com;258 259 /* Additional stuff for testing */260 unsigned int ghost_int;261 int intr_counter_GIRQ1;262 int intr_counter_GIRQ0;263 int intr_counter_cod_rep_irq;264 int intr_counter_jpeg_rep_irq;265 int field_counter;266 int irq1_in;267 int irq1_out;268 int jpeg_in;269 int jpeg_out;270 int JPEG_0;271 int JPEG_1;272 int end_event_missed;273 int jpeg_missed;274 int jpeg_error;275 int num_errors;276 int jpeg_max_missed;277 int jpeg_min_missed;278 unsigned int prepared;279 unsigned int queued;280 281 u32 last_isr;282 unsigned long frame_num;283 int running;284 int buf_in_reserve;285 286 dma_addr_t p_sc;287 __le32 *stat_comb;288 dma_addr_t p_scb;289 enum zoran_map_mode map_mode;290 struct list_head queued_bufs;291 spinlock_t queued_bufs_lock; /* Protects queued_bufs */292 struct zr_buffer *inuse[BUZ_NUM_STAT_COM * 2];293 struct dentry *dbgfs_dir;294};295 296static inline struct zoran *to_zoran(struct v4l2_device *v4l2_dev)297{298 return container_of(v4l2_dev, struct zoran, v4l2_dev);299}300 301/*302 * There was something called _ALPHA_BUZ that used the PCI address instead of303 * the kernel iomapped address for btread/btwrite.304 */305#define btwrite(dat, adr) writel((dat), zr->zr36057_mem + (adr))306#define btread(adr) readl(zr->zr36057_mem + (adr))307 308#define btand(dat, adr) btwrite((dat) & btread(adr), (adr))309#define btor(dat, adr) btwrite((dat) | btread(adr), (adr))310#define btaor(dat, mask, adr) btwrite((dat) | ((mask) & btread(adr)), (adr))311 312#endif313 314/*315 * Debugging macros316 */317#define zrdev_dbg(zr, format, args...) \318 pci_dbg((zr)->pci_dev, format, ##args) \319 320#define zrdev_err(zr, format, args...) \321 pci_err((zr)->pci_dev, format, ##args) \322 323#define zrdev_info(zr, format, args...) \324 pci_info((zr)->pci_dev, format, ##args) \325 326int zoran_queue_init(struct zoran *zr, struct vb2_queue *vq, int dir);327void zoran_queue_exit(struct zoran *zr);328int zr_set_buf(struct zoran *zr);329