xref: /OK3568_Linux_fs/kernel/drivers/media/usb/dvb-usb-v2/af9015.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * DVB USB Linux driver for Afatech AF9015 DVB-T USB2.0 receiver
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2007 Antti Palosaari <crope@iki.fi>
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Thanks to Afatech who kindly provided information.
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #ifndef AF9015_H
11*4882a593Smuzhiyun #define AF9015_H
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #include <linux/hash.h>
14*4882a593Smuzhiyun #include <linux/regmap.h>
15*4882a593Smuzhiyun #include "dvb_usb.h"
16*4882a593Smuzhiyun #include "af9013.h"
17*4882a593Smuzhiyun #include "dvb-pll.h"
18*4882a593Smuzhiyun #include "mt2060.h"
19*4882a593Smuzhiyun #include "qt1010.h"
20*4882a593Smuzhiyun #include "tda18271.h"
21*4882a593Smuzhiyun #include "mxl5005s.h"
22*4882a593Smuzhiyun #include "mc44s803.h"
23*4882a593Smuzhiyun #include "tda18218.h"
24*4882a593Smuzhiyun #include "mxl5007t.h"
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun #define AF9015_FIRMWARE "dvb-usb-af9015.fw"
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun #define AF9015_I2C_EEPROM  0x50
29*4882a593Smuzhiyun #define AF9015_I2C_DEMOD   0x1c
30*4882a593Smuzhiyun #define AF9015_USB_TIMEOUT 2000
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun /* EEPROM locations */
33*4882a593Smuzhiyun #define AF9015_EEPROM_IR_MODE        0x18
34*4882a593Smuzhiyun #define AF9015_EEPROM_IR_REMOTE_TYPE 0x34
35*4882a593Smuzhiyun #define AF9015_EEPROM_TS_MODE        0x31
36*4882a593Smuzhiyun #define AF9015_EEPROM_DEMOD2_I2C     0x32
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun #define AF9015_EEPROM_SAW_BW1        0x35
39*4882a593Smuzhiyun #define AF9015_EEPROM_XTAL_TYPE1     0x36
40*4882a593Smuzhiyun #define AF9015_EEPROM_SPEC_INV1      0x37
41*4882a593Smuzhiyun #define AF9015_EEPROM_IF1L           0x38
42*4882a593Smuzhiyun #define AF9015_EEPROM_IF1H           0x39
43*4882a593Smuzhiyun #define AF9015_EEPROM_MT2060_IF1L    0x3a
44*4882a593Smuzhiyun #define AF9015_EEPROM_MT2060_IF1H    0x3b
45*4882a593Smuzhiyun #define AF9015_EEPROM_TUNER_ID1      0x3c
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun #define AF9015_EEPROM_SAW_BW2        0x45
48*4882a593Smuzhiyun #define AF9015_EEPROM_XTAL_TYPE2     0x46
49*4882a593Smuzhiyun #define AF9015_EEPROM_SPEC_INV2      0x47
50*4882a593Smuzhiyun #define AF9015_EEPROM_IF2L           0x48
51*4882a593Smuzhiyun #define AF9015_EEPROM_IF2H           0x49
52*4882a593Smuzhiyun #define AF9015_EEPROM_MT2060_IF2L    0x4a
53*4882a593Smuzhiyun #define AF9015_EEPROM_MT2060_IF2H    0x4b
54*4882a593Smuzhiyun #define AF9015_EEPROM_TUNER_ID2      0x4c
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun #define AF9015_EEPROM_OFFSET (AF9015_EEPROM_SAW_BW2 - AF9015_EEPROM_SAW_BW1)
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun struct req_t {
59*4882a593Smuzhiyun 	u8  cmd;       /* [0] */
60*4882a593Smuzhiyun 	/*  seq */     /* [1] */
61*4882a593Smuzhiyun 	u8  i2c_addr;  /* [2] */
62*4882a593Smuzhiyun 	u16 addr;      /* [3|4] */
63*4882a593Smuzhiyun 	u8  mbox;      /* [5] */
64*4882a593Smuzhiyun 	u8  addr_len;  /* [6] */
65*4882a593Smuzhiyun 	u8  data_len;  /* [7] */
66*4882a593Smuzhiyun 	u8  *data;
67*4882a593Smuzhiyun };
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun enum af9015_cmd {
70*4882a593Smuzhiyun 	GET_CONFIG           = 0x10,
71*4882a593Smuzhiyun 	DOWNLOAD_FIRMWARE    = 0x11,
72*4882a593Smuzhiyun 	BOOT                 = 0x13,
73*4882a593Smuzhiyun 	READ_MEMORY          = 0x20,
74*4882a593Smuzhiyun 	WRITE_MEMORY         = 0x21,
75*4882a593Smuzhiyun 	READ_WRITE_I2C       = 0x22,
76*4882a593Smuzhiyun 	COPY_FIRMWARE        = 0x23,
77*4882a593Smuzhiyun 	RECONNECT_USB        = 0x5a,
78*4882a593Smuzhiyun 	WRITE_VIRTUAL_MEMORY = 0x26,
79*4882a593Smuzhiyun 	GET_IR_CODE          = 0x27,
80*4882a593Smuzhiyun 	READ_I2C,
81*4882a593Smuzhiyun 	WRITE_I2C,
82*4882a593Smuzhiyun };
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun enum af9015_ir_mode {
85*4882a593Smuzhiyun 	AF9015_IR_MODE_DISABLED = 0,
86*4882a593Smuzhiyun 	AF9015_IR_MODE_HID,
87*4882a593Smuzhiyun 	AF9015_IR_MODE_RLC,
88*4882a593Smuzhiyun 	AF9015_IR_MODE_RC6,
89*4882a593Smuzhiyun 	AF9015_IR_MODE_POLLING, /* just guess */
90*4882a593Smuzhiyun };
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun #define BUF_LEN 63
93*4882a593Smuzhiyun struct af9015_state {
94*4882a593Smuzhiyun 	struct regmap *regmap;
95*4882a593Smuzhiyun 	u8 buf[BUF_LEN]; /* bulk USB control message */
96*4882a593Smuzhiyun 	u8 ir_mode;
97*4882a593Smuzhiyun 	u8 rc_repeat;
98*4882a593Smuzhiyun 	u32 rc_keycode;
99*4882a593Smuzhiyun 	u8 rc_last[4];
100*4882a593Smuzhiyun 	bool rc_failed;
101*4882a593Smuzhiyun 	u8 dual_mode;
102*4882a593Smuzhiyun 	u8 seq; /* packet sequence number */
103*4882a593Smuzhiyun 	u16 mt2060_if1[2];
104*4882a593Smuzhiyun 	u16 firmware_size;
105*4882a593Smuzhiyun 	u16 firmware_checksum;
106*4882a593Smuzhiyun 	u32 eeprom_sum;
107*4882a593Smuzhiyun 	struct af9013_platform_data af9013_pdata[2];
108*4882a593Smuzhiyun 	struct i2c_client *demod_i2c_client[2];
109*4882a593Smuzhiyun 	u8 af9013_i2c_addr[2];
110*4882a593Smuzhiyun 	bool usb_ts_if_configured[2];
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun 	/* for demod callback override */
113*4882a593Smuzhiyun 	int (*set_frontend[2]) (struct dvb_frontend *fe);
114*4882a593Smuzhiyun 	int (*read_status[2]) (struct dvb_frontend *fe, enum fe_status *status);
115*4882a593Smuzhiyun 	int (*init[2]) (struct dvb_frontend *fe);
116*4882a593Smuzhiyun 	int (*sleep[2]) (struct dvb_frontend *fe);
117*4882a593Smuzhiyun 	int (*tuner_init[2]) (struct dvb_frontend *fe);
118*4882a593Smuzhiyun 	int (*tuner_sleep[2]) (struct dvb_frontend *fe);
119*4882a593Smuzhiyun 	struct mutex fe_mutex;
120*4882a593Smuzhiyun };
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun enum af9015_remote {
123*4882a593Smuzhiyun 	AF9015_REMOTE_NONE                    = 0,
124*4882a593Smuzhiyun /* 1 */	AF9015_REMOTE_A_LINK_DTU_M,
125*4882a593Smuzhiyun 	AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3,
126*4882a593Smuzhiyun 	AF9015_REMOTE_MYGICTV_U718,
127*4882a593Smuzhiyun 	AF9015_REMOTE_DIGITTRADE_DVB_T,
128*4882a593Smuzhiyun /* 5 */	AF9015_REMOTE_AVERMEDIA_KS,
129*4882a593Smuzhiyun };
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun #endif
132