1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * STK1160 driver 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2012 Ezequiel Garcia 6*4882a593Smuzhiyun * <elezegarcia--a.t--gmail.com> 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * Based on Easycap driver by R.M. Thomas 9*4882a593Smuzhiyun * Copyright (C) 2010 R.M. Thomas 10*4882a593Smuzhiyun * <rmthomas--a.t--sciolus.org> 11*4882a593Smuzhiyun */ 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #include <linux/i2c.h> 14*4882a593Smuzhiyun #include <sound/core.h> 15*4882a593Smuzhiyun #include <sound/ac97_codec.h> 16*4882a593Smuzhiyun #include <media/videobuf2-v4l2.h> 17*4882a593Smuzhiyun #include <media/v4l2-device.h> 18*4882a593Smuzhiyun #include <media/v4l2-ctrls.h> 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #define STK1160_VERSION "0.9.5" 21*4882a593Smuzhiyun #define STK1160_VERSION_NUM 0x000905 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun /* Decide on number of packets for each buffer */ 24*4882a593Smuzhiyun #define STK1160_NUM_PACKETS 64 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun /* Number of buffers for isoc transfers */ 27*4882a593Smuzhiyun #define STK1160_NUM_BUFS 16 28*4882a593Smuzhiyun #define STK1160_MIN_BUFS 1 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun /* TODO: This endpoint address should be retrieved */ 31*4882a593Smuzhiyun #define STK1160_EP_VIDEO 0x82 32*4882a593Smuzhiyun #define STK1160_EP_AUDIO 0x81 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun /* Max and min video buffers */ 35*4882a593Smuzhiyun #define STK1160_MIN_VIDEO_BUFFERS 8 36*4882a593Smuzhiyun #define STK1160_MAX_VIDEO_BUFFERS 32 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun #define STK1160_MIN_PKT_SIZE 3072 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun #define STK1160_MAX_INPUT 4 41*4882a593Smuzhiyun #define STK1160_SVIDEO_INPUT 4 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun #define STK1160_AC97_TIMEOUT 50 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun #define STK1160_I2C_TIMEOUT 100 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun /* TODO: Print helpers 48*4882a593Smuzhiyun * I could use dev_xxx, pr_xxx, v4l2_xxx or printk. 49*4882a593Smuzhiyun * However, there isn't a solid consensus on which 50*4882a593Smuzhiyun * new drivers should use. 51*4882a593Smuzhiyun * 52*4882a593Smuzhiyun */ 53*4882a593Smuzhiyun #ifdef DEBUG 54*4882a593Smuzhiyun #define stk1160_dbg(fmt, args...) \ 55*4882a593Smuzhiyun printk(KERN_DEBUG "stk1160: " fmt, ## args) 56*4882a593Smuzhiyun #else 57*4882a593Smuzhiyun #define stk1160_dbg(fmt, args...) 58*4882a593Smuzhiyun #endif 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun #define stk1160_info(fmt, args...) \ 61*4882a593Smuzhiyun pr_info("stk1160: " fmt, ## args) 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun #define stk1160_warn(fmt, args...) \ 64*4882a593Smuzhiyun pr_warn("stk1160: " fmt, ## args) 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun #define stk1160_err(fmt, args...) \ 67*4882a593Smuzhiyun pr_err("stk1160: " fmt, ## args) 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun /* Buffer for one video frame */ 70*4882a593Smuzhiyun struct stk1160_buffer { 71*4882a593Smuzhiyun /* common v4l buffer stuff -- must be first */ 72*4882a593Smuzhiyun struct vb2_v4l2_buffer vb; 73*4882a593Smuzhiyun struct list_head list; 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun void *mem; 76*4882a593Smuzhiyun unsigned int length; /* buffer length */ 77*4882a593Smuzhiyun unsigned int bytesused; /* bytes written */ 78*4882a593Smuzhiyun int odd; /* current oddity */ 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun /* 81*4882a593Smuzhiyun * Since we interlace two fields per frame, 82*4882a593Smuzhiyun * this is different from bytesused. 83*4882a593Smuzhiyun */ 84*4882a593Smuzhiyun unsigned int pos; /* current pos inside buffer */ 85*4882a593Smuzhiyun }; 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun struct stk1160_isoc_ctl { 88*4882a593Smuzhiyun /* max packet size of isoc transaction */ 89*4882a593Smuzhiyun int max_pkt_size; 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun /* number of allocated urbs */ 92*4882a593Smuzhiyun int num_bufs; 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun /* urb for isoc transfers */ 95*4882a593Smuzhiyun struct urb **urb; 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun /* transfer buffers for isoc transfer */ 98*4882a593Smuzhiyun char **transfer_buffer; 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun /* current buffer */ 101*4882a593Smuzhiyun struct stk1160_buffer *buf; 102*4882a593Smuzhiyun }; 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun struct stk1160_fmt { 105*4882a593Smuzhiyun u32 fourcc; /* v4l2 format id */ 106*4882a593Smuzhiyun int depth; 107*4882a593Smuzhiyun }; 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun struct stk1160 { 110*4882a593Smuzhiyun struct v4l2_device v4l2_dev; 111*4882a593Smuzhiyun struct video_device vdev; 112*4882a593Smuzhiyun struct v4l2_ctrl_handler ctrl_handler; 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun struct device *dev; 115*4882a593Smuzhiyun struct usb_device *udev; 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun /* saa7115 subdev */ 118*4882a593Smuzhiyun struct v4l2_subdev *sd_saa7115; 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun /* isoc control struct */ 121*4882a593Smuzhiyun struct list_head avail_bufs; 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun /* video capture */ 124*4882a593Smuzhiyun struct vb2_queue vb_vidq; 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun /* max packet size of isoc transaction */ 127*4882a593Smuzhiyun int max_pkt_size; 128*4882a593Smuzhiyun /* array of wMaxPacketSize */ 129*4882a593Smuzhiyun unsigned int *alt_max_pkt_size; 130*4882a593Smuzhiyun /* alternate */ 131*4882a593Smuzhiyun int alt; 132*4882a593Smuzhiyun /* Number of alternative settings */ 133*4882a593Smuzhiyun int num_alt; 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun struct stk1160_isoc_ctl isoc_ctl; 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun /* frame properties */ 138*4882a593Smuzhiyun int width; /* current frame width */ 139*4882a593Smuzhiyun int height; /* current frame height */ 140*4882a593Smuzhiyun unsigned int ctl_input; /* selected input */ 141*4882a593Smuzhiyun v4l2_std_id norm; /* current norm */ 142*4882a593Smuzhiyun struct stk1160_fmt *fmt; /* selected format */ 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun unsigned int sequence; 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun /* i2c i/o */ 147*4882a593Smuzhiyun struct i2c_adapter i2c_adap; 148*4882a593Smuzhiyun struct i2c_client i2c_client; 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun struct mutex v4l_lock; 151*4882a593Smuzhiyun struct mutex vb_queue_lock; 152*4882a593Smuzhiyun spinlock_t buf_lock; 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun struct file *fh_owner; /* filehandle ownership */ 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun /* EXPERIMENTAL */ 157*4882a593Smuzhiyun struct snd_card *snd_card; 158*4882a593Smuzhiyun }; 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun struct regval { 161*4882a593Smuzhiyun u16 reg; 162*4882a593Smuzhiyun u16 val; 163*4882a593Smuzhiyun }; 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun /* Provided by stk1160-v4l.c */ 166*4882a593Smuzhiyun int stk1160_vb2_setup(struct stk1160 *dev); 167*4882a593Smuzhiyun int stk1160_video_register(struct stk1160 *dev); 168*4882a593Smuzhiyun void stk1160_video_unregister(struct stk1160 *dev); 169*4882a593Smuzhiyun void stk1160_clear_queue(struct stk1160 *dev, enum vb2_buffer_state vb2_state); 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun /* Provided by stk1160-video.c */ 172*4882a593Smuzhiyun int stk1160_alloc_isoc(struct stk1160 *dev); 173*4882a593Smuzhiyun void stk1160_free_isoc(struct stk1160 *dev); 174*4882a593Smuzhiyun void stk1160_cancel_isoc(struct stk1160 *dev); 175*4882a593Smuzhiyun void stk1160_uninit_isoc(struct stk1160 *dev); 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun /* Provided by stk1160-i2c.c */ 178*4882a593Smuzhiyun int stk1160_i2c_register(struct stk1160 *dev); 179*4882a593Smuzhiyun int stk1160_i2c_unregister(struct stk1160 *dev); 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun /* Provided by stk1160-core.c */ 182*4882a593Smuzhiyun int stk1160_read_reg(struct stk1160 *dev, u16 reg, u8 *value); 183*4882a593Smuzhiyun int stk1160_write_reg(struct stk1160 *dev, u16 reg, u16 value); 184*4882a593Smuzhiyun int stk1160_write_regs_req(struct stk1160 *dev, u8 req, u16 reg, 185*4882a593Smuzhiyun char *buf, int len); 186*4882a593Smuzhiyun int stk1160_read_reg_req_len(struct stk1160 *dev, u8 req, u16 reg, 187*4882a593Smuzhiyun char *buf, int len); 188*4882a593Smuzhiyun void stk1160_select_input(struct stk1160 *dev); 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun /* Provided by stk1160-ac97.c */ 191*4882a593Smuzhiyun void stk1160_ac97_setup(struct stk1160 *dev); 192