18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci#ifndef _AV7110_H_ 38c2ecf20Sopenharmony_ci#define _AV7110_H_ 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci#include <linux/interrupt.h> 68c2ecf20Sopenharmony_ci#include <linux/socket.h> 78c2ecf20Sopenharmony_ci#include <linux/netdevice.h> 88c2ecf20Sopenharmony_ci#include <linux/i2c.h> 98c2ecf20Sopenharmony_ci#include <linux/input.h> 108c2ecf20Sopenharmony_ci#include <linux/time.h> 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#include <linux/dvb/video.h> 138c2ecf20Sopenharmony_ci#include <linux/dvb/audio.h> 148c2ecf20Sopenharmony_ci#include <linux/dvb/dmx.h> 158c2ecf20Sopenharmony_ci#include <linux/dvb/ca.h> 168c2ecf20Sopenharmony_ci#include <linux/dvb/osd.h> 178c2ecf20Sopenharmony_ci#include <linux/dvb/net.h> 188c2ecf20Sopenharmony_ci#include <linux/mutex.h> 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci#include <media/dvbdev.h> 218c2ecf20Sopenharmony_ci#include <media/demux.h> 228c2ecf20Sopenharmony_ci#include <media/dvb_demux.h> 238c2ecf20Sopenharmony_ci#include <media/dmxdev.h> 248c2ecf20Sopenharmony_ci#include "dvb_filter.h" 258c2ecf20Sopenharmony_ci#include <media/dvb_net.h> 268c2ecf20Sopenharmony_ci#include <media/dvb_ringbuffer.h> 278c2ecf20Sopenharmony_ci#include <media/dvb_frontend.h> 288c2ecf20Sopenharmony_ci#include "ves1820.h" 298c2ecf20Sopenharmony_ci#include "ves1x93.h" 308c2ecf20Sopenharmony_ci#include "stv0299.h" 318c2ecf20Sopenharmony_ci#include "tda8083.h" 328c2ecf20Sopenharmony_ci#include "sp8870.h" 338c2ecf20Sopenharmony_ci#include "stv0297.h" 348c2ecf20Sopenharmony_ci#include "l64781.h" 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci#include <media/drv-intf/saa7146_vv.h> 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci#define ANALOG_TUNER_VES1820 1 408c2ecf20Sopenharmony_ci#define ANALOG_TUNER_STV0297 2 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ciextern int av7110_debug; 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci#define dprintk(level, fmt, arg...) do { \ 458c2ecf20Sopenharmony_ci if (level & av7110_debug) \ 468c2ecf20Sopenharmony_ci printk(KERN_DEBUG KBUILD_MODNAME ": %s(): " fmt, \ 478c2ecf20Sopenharmony_ci __func__, ##arg); \ 488c2ecf20Sopenharmony_ci} while (0) 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci#define MAXFILT 32 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_cienum {AV_PES_STREAM, PS_STREAM, TS_STREAM, PES_STREAM}; 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_cienum av7110_video_mode { 558c2ecf20Sopenharmony_ci AV7110_VIDEO_MODE_PAL = 0, 568c2ecf20Sopenharmony_ci AV7110_VIDEO_MODE_NTSC = 1 578c2ecf20Sopenharmony_ci}; 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_cistruct av7110_p2t { 608c2ecf20Sopenharmony_ci u8 pes[TS_SIZE]; 618c2ecf20Sopenharmony_ci u8 counter; 628c2ecf20Sopenharmony_ci long int pos; 638c2ecf20Sopenharmony_ci int frags; 648c2ecf20Sopenharmony_ci struct dvb_demux_feed *feed; 658c2ecf20Sopenharmony_ci}; 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ci/* video MPEG decoder events: */ 688c2ecf20Sopenharmony_ci/* (code copied from dvb_frontend.c, should maybe be factored out...) */ 698c2ecf20Sopenharmony_ci#define MAX_VIDEO_EVENT 8 708c2ecf20Sopenharmony_cistruct dvb_video_events { 718c2ecf20Sopenharmony_ci struct video_event events[MAX_VIDEO_EVENT]; 728c2ecf20Sopenharmony_ci int eventw; 738c2ecf20Sopenharmony_ci int eventr; 748c2ecf20Sopenharmony_ci int overflow; 758c2ecf20Sopenharmony_ci wait_queue_head_t wait_queue; 768c2ecf20Sopenharmony_ci spinlock_t lock; 778c2ecf20Sopenharmony_ci}; 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_cistruct av7110; 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_ci/* infrared remote control */ 838c2ecf20Sopenharmony_cistruct infrared { 848c2ecf20Sopenharmony_ci struct rc_dev *rcdev; 858c2ecf20Sopenharmony_ci char input_phys[32]; 868c2ecf20Sopenharmony_ci u32 ir_config; 878c2ecf20Sopenharmony_ci}; 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_ci/* place to store all the necessary device information */ 908c2ecf20Sopenharmony_cistruct av7110 { 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_ci /* devices */ 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_ci struct dvb_device dvb_dev; 958c2ecf20Sopenharmony_ci struct dvb_net dvb_net; 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci struct video_device v4l_dev; 988c2ecf20Sopenharmony_ci struct video_device vbi_dev; 998c2ecf20Sopenharmony_ci 1008c2ecf20Sopenharmony_ci struct saa7146_dev *dev; 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci struct i2c_adapter i2c_adap; 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_ci char *card_name; 1058c2ecf20Sopenharmony_ci 1068c2ecf20Sopenharmony_ci /* support for analog module of dvb-c */ 1078c2ecf20Sopenharmony_ci int analog_tuner_flags; 1088c2ecf20Sopenharmony_ci int current_input; 1098c2ecf20Sopenharmony_ci u32 current_freq; 1108c2ecf20Sopenharmony_ci 1118c2ecf20Sopenharmony_ci struct tasklet_struct debi_tasklet; 1128c2ecf20Sopenharmony_ci struct tasklet_struct gpio_tasklet; 1138c2ecf20Sopenharmony_ci 1148c2ecf20Sopenharmony_ci int adac_type; /* audio DAC type */ 1158c2ecf20Sopenharmony_ci#define DVB_ADAC_TI 0 1168c2ecf20Sopenharmony_ci#define DVB_ADAC_CRYSTAL 1 1178c2ecf20Sopenharmony_ci#define DVB_ADAC_MSP34x0 2 1188c2ecf20Sopenharmony_ci#define DVB_ADAC_MSP34x5 3 1198c2ecf20Sopenharmony_ci#define DVB_ADAC_NONE -1 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_ci 1228c2ecf20Sopenharmony_ci /* buffers */ 1238c2ecf20Sopenharmony_ci 1248c2ecf20Sopenharmony_ci void *iobuf; /* memory for all buffers */ 1258c2ecf20Sopenharmony_ci struct dvb_ringbuffer avout; /* buffer for video or A/V mux */ 1268c2ecf20Sopenharmony_ci#define AVOUTLEN (128*1024) 1278c2ecf20Sopenharmony_ci struct dvb_ringbuffer aout; /* buffer for audio */ 1288c2ecf20Sopenharmony_ci#define AOUTLEN (64*1024) 1298c2ecf20Sopenharmony_ci void *bmpbuf; 1308c2ecf20Sopenharmony_ci#define BMPLEN (8*32768+1024) 1318c2ecf20Sopenharmony_ci 1328c2ecf20Sopenharmony_ci /* bitmap buffers and states */ 1338c2ecf20Sopenharmony_ci 1348c2ecf20Sopenharmony_ci int bmpp; 1358c2ecf20Sopenharmony_ci int bmplen; 1368c2ecf20Sopenharmony_ci volatile int bmp_state; 1378c2ecf20Sopenharmony_ci#define BMP_NONE 0 1388c2ecf20Sopenharmony_ci#define BMP_LOADING 1 1398c2ecf20Sopenharmony_ci#define BMP_LOADED 2 1408c2ecf20Sopenharmony_ci wait_queue_head_t bmpq; 1418c2ecf20Sopenharmony_ci 1428c2ecf20Sopenharmony_ci 1438c2ecf20Sopenharmony_ci /* DEBI and polled command interface */ 1448c2ecf20Sopenharmony_ci 1458c2ecf20Sopenharmony_ci spinlock_t debilock; 1468c2ecf20Sopenharmony_ci struct mutex dcomlock; 1478c2ecf20Sopenharmony_ci volatile int debitype; 1488c2ecf20Sopenharmony_ci volatile int debilen; 1498c2ecf20Sopenharmony_ci 1508c2ecf20Sopenharmony_ci 1518c2ecf20Sopenharmony_ci /* Recording and playback flags */ 1528c2ecf20Sopenharmony_ci 1538c2ecf20Sopenharmony_ci int rec_mode; 1548c2ecf20Sopenharmony_ci int playing; 1558c2ecf20Sopenharmony_ci#define RP_NONE 0 1568c2ecf20Sopenharmony_ci#define RP_VIDEO 1 1578c2ecf20Sopenharmony_ci#define RP_AUDIO 2 1588c2ecf20Sopenharmony_ci#define RP_AV 3 1598c2ecf20Sopenharmony_ci 1608c2ecf20Sopenharmony_ci 1618c2ecf20Sopenharmony_ci /* OSD */ 1628c2ecf20Sopenharmony_ci 1638c2ecf20Sopenharmony_ci int osdwin; /* currently active window */ 1648c2ecf20Sopenharmony_ci u16 osdbpp[8]; 1658c2ecf20Sopenharmony_ci struct mutex osd_mutex; 1668c2ecf20Sopenharmony_ci 1678c2ecf20Sopenharmony_ci /* CA */ 1688c2ecf20Sopenharmony_ci 1698c2ecf20Sopenharmony_ci struct ca_slot_info ci_slot[2]; 1708c2ecf20Sopenharmony_ci 1718c2ecf20Sopenharmony_ci enum av7110_video_mode vidmode; 1728c2ecf20Sopenharmony_ci struct dmxdev dmxdev; 1738c2ecf20Sopenharmony_ci struct dvb_demux demux; 1748c2ecf20Sopenharmony_ci 1758c2ecf20Sopenharmony_ci struct dmx_frontend hw_frontend; 1768c2ecf20Sopenharmony_ci struct dmx_frontend mem_frontend; 1778c2ecf20Sopenharmony_ci 1788c2ecf20Sopenharmony_ci /* for budget mode demux1 */ 1798c2ecf20Sopenharmony_ci struct dmxdev dmxdev1; 1808c2ecf20Sopenharmony_ci struct dvb_demux demux1; 1818c2ecf20Sopenharmony_ci struct dvb_net dvb_net1; 1828c2ecf20Sopenharmony_ci spinlock_t feedlock1; 1838c2ecf20Sopenharmony_ci int feeding1; 1848c2ecf20Sopenharmony_ci u32 ttbp; 1858c2ecf20Sopenharmony_ci unsigned char *grabbing; 1868c2ecf20Sopenharmony_ci struct saa7146_pgtable pt; 1878c2ecf20Sopenharmony_ci struct tasklet_struct vpe_tasklet; 1888c2ecf20Sopenharmony_ci bool full_ts; 1898c2ecf20Sopenharmony_ci 1908c2ecf20Sopenharmony_ci int fe_synced; 1918c2ecf20Sopenharmony_ci struct mutex pid_mutex; 1928c2ecf20Sopenharmony_ci 1938c2ecf20Sopenharmony_ci int video_blank; 1948c2ecf20Sopenharmony_ci struct video_status videostate; 1958c2ecf20Sopenharmony_ci u16 display_panscan; 1968c2ecf20Sopenharmony_ci int display_ar; 1978c2ecf20Sopenharmony_ci int trickmode; 1988c2ecf20Sopenharmony_ci#define TRICK_NONE 0 1998c2ecf20Sopenharmony_ci#define TRICK_FAST 1 2008c2ecf20Sopenharmony_ci#define TRICK_SLOW 2 2018c2ecf20Sopenharmony_ci#define TRICK_FREEZE 3 2028c2ecf20Sopenharmony_ci struct audio_status audiostate; 2038c2ecf20Sopenharmony_ci 2048c2ecf20Sopenharmony_ci struct dvb_demux_filter *handle2filter[32]; 2058c2ecf20Sopenharmony_ci struct av7110_p2t p2t_filter[MAXFILT]; 2068c2ecf20Sopenharmony_ci struct dvb_filter_pes2ts p2t[2]; 2078c2ecf20Sopenharmony_ci struct ipack ipack[2]; 2088c2ecf20Sopenharmony_ci u8 *kbuf[2]; 2098c2ecf20Sopenharmony_ci 2108c2ecf20Sopenharmony_ci int sinfo; 2118c2ecf20Sopenharmony_ci int feeding; 2128c2ecf20Sopenharmony_ci 2138c2ecf20Sopenharmony_ci int arm_errors; 2148c2ecf20Sopenharmony_ci int registered; 2158c2ecf20Sopenharmony_ci 2168c2ecf20Sopenharmony_ci 2178c2ecf20Sopenharmony_ci /* AV711X */ 2188c2ecf20Sopenharmony_ci 2198c2ecf20Sopenharmony_ci u32 arm_fw; 2208c2ecf20Sopenharmony_ci u32 arm_rtsl; 2218c2ecf20Sopenharmony_ci u32 arm_vid; 2228c2ecf20Sopenharmony_ci u32 arm_app; 2238c2ecf20Sopenharmony_ci u32 avtype; 2248c2ecf20Sopenharmony_ci int arm_ready; 2258c2ecf20Sopenharmony_ci struct task_struct *arm_thread; 2268c2ecf20Sopenharmony_ci wait_queue_head_t arm_wait; 2278c2ecf20Sopenharmony_ci u16 arm_loops; 2288c2ecf20Sopenharmony_ci 2298c2ecf20Sopenharmony_ci void *debi_virt; 2308c2ecf20Sopenharmony_ci dma_addr_t debi_bus; 2318c2ecf20Sopenharmony_ci 2328c2ecf20Sopenharmony_ci u16 pids[DMX_PES_OTHER]; 2338c2ecf20Sopenharmony_ci 2348c2ecf20Sopenharmony_ci struct dvb_ringbuffer ci_rbuffer; 2358c2ecf20Sopenharmony_ci struct dvb_ringbuffer ci_wbuffer; 2368c2ecf20Sopenharmony_ci 2378c2ecf20Sopenharmony_ci struct audio_mixer mixer; 2388c2ecf20Sopenharmony_ci 2398c2ecf20Sopenharmony_ci struct dvb_adapter dvb_adapter; 2408c2ecf20Sopenharmony_ci struct dvb_device *video_dev; 2418c2ecf20Sopenharmony_ci struct dvb_device *audio_dev; 2428c2ecf20Sopenharmony_ci struct dvb_device *ca_dev; 2438c2ecf20Sopenharmony_ci struct dvb_device *osd_dev; 2448c2ecf20Sopenharmony_ci 2458c2ecf20Sopenharmony_ci struct dvb_video_events video_events; 2468c2ecf20Sopenharmony_ci video_size_t video_size; 2478c2ecf20Sopenharmony_ci 2488c2ecf20Sopenharmony_ci u16 wssMode; 2498c2ecf20Sopenharmony_ci u16 wssData; 2508c2ecf20Sopenharmony_ci 2518c2ecf20Sopenharmony_ci struct infrared ir; 2528c2ecf20Sopenharmony_ci 2538c2ecf20Sopenharmony_ci /* firmware stuff */ 2548c2ecf20Sopenharmony_ci unsigned char *bin_fw; 2558c2ecf20Sopenharmony_ci unsigned long size_fw; 2568c2ecf20Sopenharmony_ci 2578c2ecf20Sopenharmony_ci unsigned char *bin_dpram; 2588c2ecf20Sopenharmony_ci unsigned long size_dpram; 2598c2ecf20Sopenharmony_ci 2608c2ecf20Sopenharmony_ci unsigned char *bin_root; 2618c2ecf20Sopenharmony_ci unsigned long size_root; 2628c2ecf20Sopenharmony_ci 2638c2ecf20Sopenharmony_ci struct dvb_frontend* fe; 2648c2ecf20Sopenharmony_ci enum fe_status fe_status; 2658c2ecf20Sopenharmony_ci 2668c2ecf20Sopenharmony_ci struct mutex ioctl_mutex; 2678c2ecf20Sopenharmony_ci 2688c2ecf20Sopenharmony_ci /* crash recovery */ 2698c2ecf20Sopenharmony_ci void (*recover)(struct av7110* av7110); 2708c2ecf20Sopenharmony_ci enum fe_sec_voltage saved_voltage; 2718c2ecf20Sopenharmony_ci enum fe_sec_tone_mode saved_tone; 2728c2ecf20Sopenharmony_ci struct dvb_diseqc_master_cmd saved_master_cmd; 2738c2ecf20Sopenharmony_ci enum fe_sec_mini_cmd saved_minicmd; 2748c2ecf20Sopenharmony_ci 2758c2ecf20Sopenharmony_ci int (*fe_init)(struct dvb_frontend* fe); 2768c2ecf20Sopenharmony_ci int (*fe_read_status)(struct dvb_frontend *fe, enum fe_status *status); 2778c2ecf20Sopenharmony_ci int (*fe_diseqc_reset_overload)(struct dvb_frontend *fe); 2788c2ecf20Sopenharmony_ci int (*fe_diseqc_send_master_cmd)(struct dvb_frontend *fe, 2798c2ecf20Sopenharmony_ci struct dvb_diseqc_master_cmd *cmd); 2808c2ecf20Sopenharmony_ci int (*fe_diseqc_send_burst)(struct dvb_frontend *fe, 2818c2ecf20Sopenharmony_ci enum fe_sec_mini_cmd minicmd); 2828c2ecf20Sopenharmony_ci int (*fe_set_tone)(struct dvb_frontend *fe, 2838c2ecf20Sopenharmony_ci enum fe_sec_tone_mode tone); 2848c2ecf20Sopenharmony_ci int (*fe_set_voltage)(struct dvb_frontend *fe, 2858c2ecf20Sopenharmony_ci enum fe_sec_voltage voltage); 2868c2ecf20Sopenharmony_ci int (*fe_dishnetwork_send_legacy_command)(struct dvb_frontend *fe, 2878c2ecf20Sopenharmony_ci unsigned long cmd); 2888c2ecf20Sopenharmony_ci int (*fe_set_frontend)(struct dvb_frontend *fe); 2898c2ecf20Sopenharmony_ci}; 2908c2ecf20Sopenharmony_ci 2918c2ecf20Sopenharmony_ci 2928c2ecf20Sopenharmony_ciextern int ChangePIDs(struct av7110 *av7110, u16 vpid, u16 apid, u16 ttpid, 2938c2ecf20Sopenharmony_ci u16 subpid, u16 pcrpid); 2948c2ecf20Sopenharmony_ci 2958c2ecf20Sopenharmony_civoid av7110_ir_handler(struct av7110 *av7110, u32 ircom); 2968c2ecf20Sopenharmony_ciint av7110_set_ir_config(struct av7110 *av7110); 2978c2ecf20Sopenharmony_ciint av7110_ir_init(struct av7110 *av7110); 2988c2ecf20Sopenharmony_civoid av7110_ir_exit(struct av7110 *av7110); 2998c2ecf20Sopenharmony_ci 3008c2ecf20Sopenharmony_ci/* msp3400 i2c subaddresses */ 3018c2ecf20Sopenharmony_ci#define MSP_WR_DEM 0x10 3028c2ecf20Sopenharmony_ci#define MSP_RD_DEM 0x11 3038c2ecf20Sopenharmony_ci#define MSP_WR_DSP 0x12 3048c2ecf20Sopenharmony_ci#define MSP_RD_DSP 0x13 3058c2ecf20Sopenharmony_ci 3068c2ecf20Sopenharmony_ciextern int i2c_writereg(struct av7110 *av7110, u8 id, u8 reg, u8 val); 3078c2ecf20Sopenharmony_ciextern u8 i2c_readreg(struct av7110 *av7110, u8 id, u8 reg); 3088c2ecf20Sopenharmony_ciextern int msp_writereg(struct av7110 *av7110, u8 dev, u16 reg, u16 val); 3098c2ecf20Sopenharmony_ci 3108c2ecf20Sopenharmony_ci 3118c2ecf20Sopenharmony_ciextern int av7110_init_analog_module(struct av7110 *av7110); 3128c2ecf20Sopenharmony_ciextern int av7110_init_v4l(struct av7110 *av7110); 3138c2ecf20Sopenharmony_ciextern int av7110_exit_v4l(struct av7110 *av7110); 3148c2ecf20Sopenharmony_ci 3158c2ecf20Sopenharmony_ci#endif /* _AV7110_H_ */ 316