• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3 	STV0900/0903 Multistandard Broadcast Frontend driver
4 	Copyright (C) Manu Abraham <abraham.manu@gmail.com>
5 
6 	Copyright (C) ST Microelectronics
7 
8 */
9 
10 #ifndef __STV090x_PRIV_H
11 #define __STV090x_PRIV_H
12 
13 #include <media/dvb_frontend.h>
14 
15 #define FE_ERROR				0
16 #define FE_NOTICE				1
17 #define FE_INFO					2
18 #define FE_DEBUG				3
19 #define FE_DEBUGREG				4
20 
21 #define dprintk(__y, __z, format, arg...) do {						\
22 	if (__z) {									\
23 		if	((verbose > FE_ERROR) && (verbose > __y))			\
24 			printk(KERN_ERR "%s: " format "\n", __func__ , ##arg);		\
25 		else if	((verbose > FE_NOTICE) && (verbose > __y))			\
26 			printk(KERN_NOTICE "%s: " format "\n", __func__ , ##arg);	\
27 		else if ((verbose > FE_INFO) && (verbose > __y))			\
28 			printk(KERN_INFO "%s: " format "\n", __func__ , ##arg);		\
29 		else if ((verbose > FE_DEBUG) && (verbose > __y))			\
30 			printk(KERN_DEBUG "%s: " format "\n", __func__ , ##arg);	\
31 	} else {									\
32 		if (verbose > __y)							\
33 			printk(format, ##arg);						\
34 	}										\
35 } while (0)
36 
37 #define STV090x_READ_DEMOD(__state, __reg) ((			\
38 	(__state)->demod == STV090x_DEMODULATOR_1)	?	\
39 	stv090x_read_reg(__state, STV090x_P2_##__reg) :		\
40 	stv090x_read_reg(__state, STV090x_P1_##__reg))
41 
42 #define STV090x_WRITE_DEMOD(__state, __reg, __data) ((		\
43 	(__state)->demod == STV090x_DEMODULATOR_1)	?	\
44 	stv090x_write_reg(__state, STV090x_P2_##__reg, __data) :\
45 	stv090x_write_reg(__state, STV090x_P1_##__reg, __data))
46 
47 #define STV090x_ADDR_OFFST(__state, __x) ((			\
48 	(__state->demod) == STV090x_DEMODULATOR_1)	?	\
49 		STV090x_P1_##__x :				\
50 		STV090x_P2_##__x)
51 
52 
53 #define STV090x_SETFIELD(mask, bitf, val)	(mask = (mask & (~(((1 << STV090x_WIDTH_##bitf) - 1) <<\
54 							 STV090x_OFFST_##bitf))) | \
55 							 (val << STV090x_OFFST_##bitf))
56 
57 #define STV090x_GETFIELD(val, bitf)		((val >> STV090x_OFFST_##bitf) & ((1 << STV090x_WIDTH_##bitf) - 1))
58 
59 
60 #define STV090x_SETFIELD_Px(mask, bitf, val)	(mask = (mask & (~(((1 << STV090x_WIDTH_Px_##bitf) - 1) <<\
61 							 STV090x_OFFST_Px_##bitf))) | \
62 							 (val << STV090x_OFFST_Px_##bitf))
63 
64 #define STV090x_GETFIELD_Px(val, bitf)		((val >> STV090x_OFFST_Px_##bitf) & ((1 << STV090x_WIDTH_Px_##bitf) - 1))
65 
66 #define MAKEWORD16(__a, __b)			(((__a) << 8) | (__b))
67 
68 #define MSB(__x)				((__x >> 8) & 0xff)
69 #define LSB(__x)				(__x & 0xff)
70 
71 
72 #define STV090x_IQPOWER_THRESHOLD	  30
73 #define STV090x_SEARCH_AGC2_TH_CUT20	 700
74 #define STV090x_SEARCH_AGC2_TH_CUT30	1400
75 
76 #define STV090x_SEARCH_AGC2_TH(__ver)	\
77 	((__ver <= 0x20) ?		\
78 	STV090x_SEARCH_AGC2_TH_CUT20 :	\
79 	STV090x_SEARCH_AGC2_TH_CUT30)
80 
81 enum stv090x_signal_state {
82 	STV090x_NOAGC1,
83 	STV090x_NOCARRIER,
84 	STV090x_NODATA,
85 	STV090x_DATAOK,
86 	STV090x_RANGEOK,
87 	STV090x_OUTOFRANGE
88 };
89 
90 enum stv090x_fec {
91 	STV090x_PR12 = 0,
92 	STV090x_PR23,
93 	STV090x_PR34,
94 	STV090x_PR45,
95 	STV090x_PR56,
96 	STV090x_PR67,
97 	STV090x_PR78,
98 	STV090x_PR89,
99 	STV090x_PR910,
100 	STV090x_PRERR
101 };
102 
103 enum stv090x_modulation {
104 	STV090x_QPSK,
105 	STV090x_8PSK,
106 	STV090x_16APSK,
107 	STV090x_32APSK,
108 	STV090x_UNKNOWN
109 };
110 
111 enum stv090x_frame {
112 	STV090x_LONG_FRAME,
113 	STV090x_SHORT_FRAME
114 };
115 
116 enum stv090x_pilot {
117 	STV090x_PILOTS_OFF,
118 	STV090x_PILOTS_ON
119 };
120 
121 enum stv090x_rolloff {
122 	STV090x_RO_35,
123 	STV090x_RO_25,
124 	STV090x_RO_20
125 };
126 
127 enum stv090x_inversion {
128 	STV090x_IQ_AUTO,
129 	STV090x_IQ_NORMAL,
130 	STV090x_IQ_SWAP
131 };
132 
133 enum stv090x_modcod {
134 	STV090x_DUMMY_PLF = 0,
135 	STV090x_QPSK_14,
136 	STV090x_QPSK_13,
137 	STV090x_QPSK_25,
138 	STV090x_QPSK_12,
139 	STV090x_QPSK_35,
140 	STV090x_QPSK_23,
141 	STV090x_QPSK_34,
142 	STV090x_QPSK_45,
143 	STV090x_QPSK_56,
144 	STV090x_QPSK_89,
145 	STV090x_QPSK_910,
146 	STV090x_8PSK_35,
147 	STV090x_8PSK_23,
148 	STV090x_8PSK_34,
149 	STV090x_8PSK_56,
150 	STV090x_8PSK_89,
151 	STV090x_8PSK_910,
152 	STV090x_16APSK_23,
153 	STV090x_16APSK_34,
154 	STV090x_16APSK_45,
155 	STV090x_16APSK_56,
156 	STV090x_16APSK_89,
157 	STV090x_16APSK_910,
158 	STV090x_32APSK_34,
159 	STV090x_32APSK_45,
160 	STV090x_32APSK_56,
161 	STV090x_32APSK_89,
162 	STV090x_32APSK_910,
163 	STV090x_MODCODE_UNKNOWN
164 };
165 
166 enum stv090x_search {
167 	STV090x_SEARCH_DSS = 0,
168 	STV090x_SEARCH_DVBS1,
169 	STV090x_SEARCH_DVBS2,
170 	STV090x_SEARCH_AUTO
171 };
172 
173 enum stv090x_algo {
174 	STV090x_BLIND_SEARCH,
175 	STV090x_COLD_SEARCH,
176 	STV090x_WARM_SEARCH
177 };
178 
179 enum stv090x_delsys {
180 	STV090x_ERROR = 0,
181 	STV090x_DVBS1 = 1,
182 	STV090x_DVBS2,
183 	STV090x_DSS
184 };
185 
186 struct stv090x_long_frame_crloop {
187 	enum stv090x_modcod	modcod;
188 
189 	u8 crl_pilots_on_2;
190 	u8 crl_pilots_off_2;
191 	u8 crl_pilots_on_5;
192 	u8 crl_pilots_off_5;
193 	u8 crl_pilots_on_10;
194 	u8 crl_pilots_off_10;
195 	u8 crl_pilots_on_20;
196 	u8 crl_pilots_off_20;
197 	u8 crl_pilots_on_30;
198 	u8 crl_pilots_off_30;
199 };
200 
201 struct stv090x_short_frame_crloop {
202 	enum stv090x_modulation	modulation;
203 
204 	u8 crl_2;  /*      SR <   3M */
205 	u8 crl_5;  /*  3 < SR <=  7M */
206 	u8 crl_10; /*  7 < SR <= 15M */
207 	u8 crl_20; /* 10 < SR <= 25M */
208 	u8 crl_30; /* 10 < SR <= 45M */
209 };
210 
211 struct stv090x_reg {
212 	u16 addr;
213 	u8  data;
214 };
215 
216 struct stv090x_tab {
217 	s32 real;
218 	s32 read;
219 };
220 
221 struct stv090x_internal {
222 	struct i2c_adapter	*i2c_adap;
223 	u8			i2c_addr;
224 
225 	struct mutex		demod_lock; /* Lock access to shared register */
226 	struct mutex		tuner_lock; /* Lock access to tuners */
227 	s32			mclk; /* Masterclock Divider factor */
228 	u32			dev_ver;
229 
230 	int			num_used;
231 };
232 
233 struct stv090x_state {
234 	enum stv090x_device		device;
235 	enum stv090x_demodulator	demod;
236 	enum stv090x_mode		demod_mode;
237 	struct stv090x_internal		*internal;
238 
239 	struct i2c_adapter		*i2c;
240 	struct stv090x_config	*config;
241 	struct dvb_frontend		frontend;
242 
243 	u32				*verbose; /* Cached module verbosity */
244 
245 	enum stv090x_delsys		delsys;
246 	enum stv090x_fec		fec;
247 	enum stv090x_modulation		modulation;
248 	enum stv090x_modcod		modcod;
249 	enum stv090x_search		search_mode;
250 	enum stv090x_frame		frame_len;
251 	enum stv090x_pilot		pilots;
252 	enum stv090x_rolloff		rolloff;
253 	enum stv090x_inversion		inversion;
254 	enum stv090x_algo		algo;
255 
256 	u32				frequency;
257 	u32				srate;
258 
259 	s32				tuner_bw;
260 
261 	s32				search_range;
262 
263 	s32				DemodTimeout;
264 	s32				FecTimeout;
265 };
266 
267 #endif /* __STV090x_PRIV_H */
268