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
93enum stv090x_signal_state {
94	STV090x_NOAGC1,
95	STV090x_NOCARRIER,
96	STV090x_NODATA,
97	STV090x_DATAOK,
98	STV090x_RANGEOK,
99	STV090x_OUTOFRANGE
100};
101
102enum 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
115enum stv090x_modulation {
116	STV090x_QPSK,
117	STV090x_8PSK,
118	STV090x_16APSK,
119	STV090x_32APSK,
120	STV090x_UNKNOWN
121};
122
123enum stv090x_frame {
124	STV090x_LONG_FRAME,
125	STV090x_SHORT_FRAME
126};
127
128enum stv090x_pilot {
129	STV090x_PILOTS_OFF,
130	STV090x_PILOTS_ON
131};
132
133enum stv090x_rolloff {
134	STV090x_RO_35,
135	STV090x_RO_25,
136	STV090x_RO_20
137};
138
139enum stv090x_inversion {
140	STV090x_IQ_AUTO,
141	STV090x_IQ_NORMAL,
142	STV090x_IQ_SWAP
143};
144
145enum 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
178enum stv090x_search {
179	STV090x_SEARCH_DSS = 0,
180	STV090x_SEARCH_DVBS1,
181	STV090x_SEARCH_DVBS2,
182	STV090x_SEARCH_AUTO
183};
184
185enum stv090x_algo {
186	STV090x_BLIND_SEARCH,
187	STV090x_COLD_SEARCH,
188	STV090x_WARM_SEARCH
189};
190
191enum stv090x_delsys {
192	STV090x_ERROR = 0,
193	STV090x_DVBS1 = 1,
194	STV090x_DVBS2,
195	STV090x_DSS
196};
197
198struct 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
213struct 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
223struct stv090x_reg {
224	u16 addr;
225	u8  data;
226};
227
228struct stv090x_tab {
229	s32 real;
230	s32 read;
231};
232
233struct 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
245struct 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