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