1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef _AV7110_H_ 3*4882a593Smuzhiyun #define _AV7110_H_ 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <linux/interrupt.h> 6*4882a593Smuzhiyun #include <linux/socket.h> 7*4882a593Smuzhiyun #include <linux/netdevice.h> 8*4882a593Smuzhiyun #include <linux/i2c.h> 9*4882a593Smuzhiyun #include <linux/input.h> 10*4882a593Smuzhiyun #include <linux/time.h> 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #include <linux/dvb/video.h> 13*4882a593Smuzhiyun #include <linux/dvb/audio.h> 14*4882a593Smuzhiyun #include <linux/dvb/dmx.h> 15*4882a593Smuzhiyun #include <linux/dvb/ca.h> 16*4882a593Smuzhiyun #include <linux/dvb/osd.h> 17*4882a593Smuzhiyun #include <linux/dvb/net.h> 18*4882a593Smuzhiyun #include <linux/mutex.h> 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #include <media/dvbdev.h> 21*4882a593Smuzhiyun #include <media/demux.h> 22*4882a593Smuzhiyun #include <media/dvb_demux.h> 23*4882a593Smuzhiyun #include <media/dmxdev.h> 24*4882a593Smuzhiyun #include "dvb_filter.h" 25*4882a593Smuzhiyun #include <media/dvb_net.h> 26*4882a593Smuzhiyun #include <media/dvb_ringbuffer.h> 27*4882a593Smuzhiyun #include <media/dvb_frontend.h> 28*4882a593Smuzhiyun #include "ves1820.h" 29*4882a593Smuzhiyun #include "ves1x93.h" 30*4882a593Smuzhiyun #include "stv0299.h" 31*4882a593Smuzhiyun #include "tda8083.h" 32*4882a593Smuzhiyun #include "sp8870.h" 33*4882a593Smuzhiyun #include "stv0297.h" 34*4882a593Smuzhiyun #include "l64781.h" 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun #include <media/drv-intf/saa7146_vv.h> 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun #define ANALOG_TUNER_VES1820 1 40*4882a593Smuzhiyun #define ANALOG_TUNER_STV0297 2 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun extern int av7110_debug; 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun #define dprintk(level, fmt, arg...) do { \ 45*4882a593Smuzhiyun if (level & av7110_debug) \ 46*4882a593Smuzhiyun printk(KERN_DEBUG KBUILD_MODNAME ": %s(): " fmt, \ 47*4882a593Smuzhiyun __func__, ##arg); \ 48*4882a593Smuzhiyun } while (0) 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun #define MAXFILT 32 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun enum {AV_PES_STREAM, PS_STREAM, TS_STREAM, PES_STREAM}; 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun enum av7110_video_mode { 55*4882a593Smuzhiyun AV7110_VIDEO_MODE_PAL = 0, 56*4882a593Smuzhiyun AV7110_VIDEO_MODE_NTSC = 1 57*4882a593Smuzhiyun }; 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun struct av7110_p2t { 60*4882a593Smuzhiyun u8 pes[TS_SIZE]; 61*4882a593Smuzhiyun u8 counter; 62*4882a593Smuzhiyun long int pos; 63*4882a593Smuzhiyun int frags; 64*4882a593Smuzhiyun struct dvb_demux_feed *feed; 65*4882a593Smuzhiyun }; 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun /* video MPEG decoder events: */ 68*4882a593Smuzhiyun /* (code copied from dvb_frontend.c, should maybe be factored out...) */ 69*4882a593Smuzhiyun #define MAX_VIDEO_EVENT 8 70*4882a593Smuzhiyun struct dvb_video_events { 71*4882a593Smuzhiyun struct video_event events[MAX_VIDEO_EVENT]; 72*4882a593Smuzhiyun int eventw; 73*4882a593Smuzhiyun int eventr; 74*4882a593Smuzhiyun int overflow; 75*4882a593Smuzhiyun wait_queue_head_t wait_queue; 76*4882a593Smuzhiyun spinlock_t lock; 77*4882a593Smuzhiyun }; 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun struct av7110; 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun /* infrared remote control */ 83*4882a593Smuzhiyun struct infrared { 84*4882a593Smuzhiyun struct rc_dev *rcdev; 85*4882a593Smuzhiyun char input_phys[32]; 86*4882a593Smuzhiyun u32 ir_config; 87*4882a593Smuzhiyun }; 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun /* place to store all the necessary device information */ 90*4882a593Smuzhiyun struct av7110 { 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun /* devices */ 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun struct dvb_device dvb_dev; 95*4882a593Smuzhiyun struct dvb_net dvb_net; 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun struct video_device v4l_dev; 98*4882a593Smuzhiyun struct video_device vbi_dev; 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun struct saa7146_dev *dev; 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun struct i2c_adapter i2c_adap; 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun char *card_name; 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun /* support for analog module of dvb-c */ 107*4882a593Smuzhiyun int analog_tuner_flags; 108*4882a593Smuzhiyun int current_input; 109*4882a593Smuzhiyun u32 current_freq; 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun struct tasklet_struct debi_tasklet; 112*4882a593Smuzhiyun struct tasklet_struct gpio_tasklet; 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun int adac_type; /* audio DAC type */ 115*4882a593Smuzhiyun #define DVB_ADAC_TI 0 116*4882a593Smuzhiyun #define DVB_ADAC_CRYSTAL 1 117*4882a593Smuzhiyun #define DVB_ADAC_MSP34x0 2 118*4882a593Smuzhiyun #define DVB_ADAC_MSP34x5 3 119*4882a593Smuzhiyun #define DVB_ADAC_NONE -1 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun /* buffers */ 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun void *iobuf; /* memory for all buffers */ 125*4882a593Smuzhiyun struct dvb_ringbuffer avout; /* buffer for video or A/V mux */ 126*4882a593Smuzhiyun #define AVOUTLEN (128*1024) 127*4882a593Smuzhiyun struct dvb_ringbuffer aout; /* buffer for audio */ 128*4882a593Smuzhiyun #define AOUTLEN (64*1024) 129*4882a593Smuzhiyun void *bmpbuf; 130*4882a593Smuzhiyun #define BMPLEN (8*32768+1024) 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun /* bitmap buffers and states */ 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun int bmpp; 135*4882a593Smuzhiyun int bmplen; 136*4882a593Smuzhiyun volatile int bmp_state; 137*4882a593Smuzhiyun #define BMP_NONE 0 138*4882a593Smuzhiyun #define BMP_LOADING 1 139*4882a593Smuzhiyun #define BMP_LOADED 2 140*4882a593Smuzhiyun wait_queue_head_t bmpq; 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun /* DEBI and polled command interface */ 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun spinlock_t debilock; 146*4882a593Smuzhiyun struct mutex dcomlock; 147*4882a593Smuzhiyun volatile int debitype; 148*4882a593Smuzhiyun volatile int debilen; 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun /* Recording and playback flags */ 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun int rec_mode; 154*4882a593Smuzhiyun int playing; 155*4882a593Smuzhiyun #define RP_NONE 0 156*4882a593Smuzhiyun #define RP_VIDEO 1 157*4882a593Smuzhiyun #define RP_AUDIO 2 158*4882a593Smuzhiyun #define RP_AV 3 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun /* OSD */ 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun int osdwin; /* currently active window */ 164*4882a593Smuzhiyun u16 osdbpp[8]; 165*4882a593Smuzhiyun struct mutex osd_mutex; 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun /* CA */ 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun struct ca_slot_info ci_slot[2]; 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun enum av7110_video_mode vidmode; 172*4882a593Smuzhiyun struct dmxdev dmxdev; 173*4882a593Smuzhiyun struct dvb_demux demux; 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun struct dmx_frontend hw_frontend; 176*4882a593Smuzhiyun struct dmx_frontend mem_frontend; 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun /* for budget mode demux1 */ 179*4882a593Smuzhiyun struct dmxdev dmxdev1; 180*4882a593Smuzhiyun struct dvb_demux demux1; 181*4882a593Smuzhiyun struct dvb_net dvb_net1; 182*4882a593Smuzhiyun spinlock_t feedlock1; 183*4882a593Smuzhiyun int feeding1; 184*4882a593Smuzhiyun u32 ttbp; 185*4882a593Smuzhiyun unsigned char *grabbing; 186*4882a593Smuzhiyun struct saa7146_pgtable pt; 187*4882a593Smuzhiyun struct tasklet_struct vpe_tasklet; 188*4882a593Smuzhiyun bool full_ts; 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun int fe_synced; 191*4882a593Smuzhiyun struct mutex pid_mutex; 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun int video_blank; 194*4882a593Smuzhiyun struct video_status videostate; 195*4882a593Smuzhiyun u16 display_panscan; 196*4882a593Smuzhiyun int display_ar; 197*4882a593Smuzhiyun int trickmode; 198*4882a593Smuzhiyun #define TRICK_NONE 0 199*4882a593Smuzhiyun #define TRICK_FAST 1 200*4882a593Smuzhiyun #define TRICK_SLOW 2 201*4882a593Smuzhiyun #define TRICK_FREEZE 3 202*4882a593Smuzhiyun struct audio_status audiostate; 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun struct dvb_demux_filter *handle2filter[32]; 205*4882a593Smuzhiyun struct av7110_p2t p2t_filter[MAXFILT]; 206*4882a593Smuzhiyun struct dvb_filter_pes2ts p2t[2]; 207*4882a593Smuzhiyun struct ipack ipack[2]; 208*4882a593Smuzhiyun u8 *kbuf[2]; 209*4882a593Smuzhiyun 210*4882a593Smuzhiyun int sinfo; 211*4882a593Smuzhiyun int feeding; 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun int arm_errors; 214*4882a593Smuzhiyun int registered; 215*4882a593Smuzhiyun 216*4882a593Smuzhiyun 217*4882a593Smuzhiyun /* AV711X */ 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun u32 arm_fw; 220*4882a593Smuzhiyun u32 arm_rtsl; 221*4882a593Smuzhiyun u32 arm_vid; 222*4882a593Smuzhiyun u32 arm_app; 223*4882a593Smuzhiyun u32 avtype; 224*4882a593Smuzhiyun int arm_ready; 225*4882a593Smuzhiyun struct task_struct *arm_thread; 226*4882a593Smuzhiyun wait_queue_head_t arm_wait; 227*4882a593Smuzhiyun u16 arm_loops; 228*4882a593Smuzhiyun 229*4882a593Smuzhiyun void *debi_virt; 230*4882a593Smuzhiyun dma_addr_t debi_bus; 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun u16 pids[DMX_PES_OTHER]; 233*4882a593Smuzhiyun 234*4882a593Smuzhiyun struct dvb_ringbuffer ci_rbuffer; 235*4882a593Smuzhiyun struct dvb_ringbuffer ci_wbuffer; 236*4882a593Smuzhiyun 237*4882a593Smuzhiyun struct audio_mixer mixer; 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun struct dvb_adapter dvb_adapter; 240*4882a593Smuzhiyun struct dvb_device *video_dev; 241*4882a593Smuzhiyun struct dvb_device *audio_dev; 242*4882a593Smuzhiyun struct dvb_device *ca_dev; 243*4882a593Smuzhiyun struct dvb_device *osd_dev; 244*4882a593Smuzhiyun 245*4882a593Smuzhiyun struct dvb_video_events video_events; 246*4882a593Smuzhiyun video_size_t video_size; 247*4882a593Smuzhiyun 248*4882a593Smuzhiyun u16 wssMode; 249*4882a593Smuzhiyun u16 wssData; 250*4882a593Smuzhiyun 251*4882a593Smuzhiyun struct infrared ir; 252*4882a593Smuzhiyun 253*4882a593Smuzhiyun /* firmware stuff */ 254*4882a593Smuzhiyun unsigned char *bin_fw; 255*4882a593Smuzhiyun unsigned long size_fw; 256*4882a593Smuzhiyun 257*4882a593Smuzhiyun unsigned char *bin_dpram; 258*4882a593Smuzhiyun unsigned long size_dpram; 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun unsigned char *bin_root; 261*4882a593Smuzhiyun unsigned long size_root; 262*4882a593Smuzhiyun 263*4882a593Smuzhiyun struct dvb_frontend* fe; 264*4882a593Smuzhiyun enum fe_status fe_status; 265*4882a593Smuzhiyun 266*4882a593Smuzhiyun struct mutex ioctl_mutex; 267*4882a593Smuzhiyun 268*4882a593Smuzhiyun /* crash recovery */ 269*4882a593Smuzhiyun void (*recover)(struct av7110* av7110); 270*4882a593Smuzhiyun enum fe_sec_voltage saved_voltage; 271*4882a593Smuzhiyun enum fe_sec_tone_mode saved_tone; 272*4882a593Smuzhiyun struct dvb_diseqc_master_cmd saved_master_cmd; 273*4882a593Smuzhiyun enum fe_sec_mini_cmd saved_minicmd; 274*4882a593Smuzhiyun 275*4882a593Smuzhiyun int (*fe_init)(struct dvb_frontend* fe); 276*4882a593Smuzhiyun int (*fe_read_status)(struct dvb_frontend *fe, enum fe_status *status); 277*4882a593Smuzhiyun int (*fe_diseqc_reset_overload)(struct dvb_frontend *fe); 278*4882a593Smuzhiyun int (*fe_diseqc_send_master_cmd)(struct dvb_frontend *fe, 279*4882a593Smuzhiyun struct dvb_diseqc_master_cmd *cmd); 280*4882a593Smuzhiyun int (*fe_diseqc_send_burst)(struct dvb_frontend *fe, 281*4882a593Smuzhiyun enum fe_sec_mini_cmd minicmd); 282*4882a593Smuzhiyun int (*fe_set_tone)(struct dvb_frontend *fe, 283*4882a593Smuzhiyun enum fe_sec_tone_mode tone); 284*4882a593Smuzhiyun int (*fe_set_voltage)(struct dvb_frontend *fe, 285*4882a593Smuzhiyun enum fe_sec_voltage voltage); 286*4882a593Smuzhiyun int (*fe_dishnetwork_send_legacy_command)(struct dvb_frontend *fe, 287*4882a593Smuzhiyun unsigned long cmd); 288*4882a593Smuzhiyun int (*fe_set_frontend)(struct dvb_frontend *fe); 289*4882a593Smuzhiyun }; 290*4882a593Smuzhiyun 291*4882a593Smuzhiyun 292*4882a593Smuzhiyun extern int ChangePIDs(struct av7110 *av7110, u16 vpid, u16 apid, u16 ttpid, 293*4882a593Smuzhiyun u16 subpid, u16 pcrpid); 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun void av7110_ir_handler(struct av7110 *av7110, u32 ircom); 296*4882a593Smuzhiyun int av7110_set_ir_config(struct av7110 *av7110); 297*4882a593Smuzhiyun int av7110_ir_init(struct av7110 *av7110); 298*4882a593Smuzhiyun void av7110_ir_exit(struct av7110 *av7110); 299*4882a593Smuzhiyun 300*4882a593Smuzhiyun /* msp3400 i2c subaddresses */ 301*4882a593Smuzhiyun #define MSP_WR_DEM 0x10 302*4882a593Smuzhiyun #define MSP_RD_DEM 0x11 303*4882a593Smuzhiyun #define MSP_WR_DSP 0x12 304*4882a593Smuzhiyun #define MSP_RD_DSP 0x13 305*4882a593Smuzhiyun 306*4882a593Smuzhiyun extern int i2c_writereg(struct av7110 *av7110, u8 id, u8 reg, u8 val); 307*4882a593Smuzhiyun extern u8 i2c_readreg(struct av7110 *av7110, u8 id, u8 reg); 308*4882a593Smuzhiyun extern int msp_writereg(struct av7110 *av7110, u8 dev, u16 reg, u16 val); 309*4882a593Smuzhiyun 310*4882a593Smuzhiyun 311*4882a593Smuzhiyun extern int av7110_init_analog_module(struct av7110 *av7110); 312*4882a593Smuzhiyun extern int av7110_init_v4l(struct av7110 *av7110); 313*4882a593Smuzhiyun extern int av7110_exit_v4l(struct av7110 *av7110); 314*4882a593Smuzhiyun 315*4882a593Smuzhiyun #endif /* _AV7110_H_ */ 316