1 /*
2 	STB0899 Multistandard 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 __STB0899_PRIV_H
23 #define __STB0899_PRIV_H
24 
25 #include <media/dvb_frontend.h>
26 #include "stb0899_drv.h"
27 
28 #define FE_ERROR				0
29 #define FE_NOTICE				1
30 #define FE_INFO					2
31 #define FE_DEBUG				3
32 #define FE_DEBUGREG				4
33 
34 #define dprintk(x, y, z, format, arg...) do {						\
35 	if (z) {									\
36 		if	((*x > FE_ERROR) && (*x > y))					\
37 			printk(KERN_ERR "%s: " format "\n", __func__ , ##arg);		\
38 		else if	((*x > FE_NOTICE) && (*x > y))					\
39 			printk(KERN_NOTICE "%s: " format "\n", __func__ , ##arg);	\
40 		else if ((*x > FE_INFO) && (*x > y))					\
41 			printk(KERN_INFO "%s: " format "\n", __func__ , ##arg);		\
42 		else if ((*x > FE_DEBUG) && (*x > y))					\
43 			printk(KERN_DEBUG "%s: " format "\n", __func__ , ##arg);	\
44 	} else {									\
45 		if (*x > y)								\
46 			printk(format, ##arg);						\
47 	}										\
48 } while(0)
49 
50 #define INRANGE(val, x, y)			(((x <= val) && (val <= y)) ||		\
51 						 ((y <= val) && (val <= x)) ? 1 : 0)
52 
53 #define BYTE0					0
54 #define BYTE1					8
55 #define BYTE2					16
56 #define BYTE3					24
57 
58 #define GETBYTE(x, y)				(((x) >> (y)) & 0xff)
59 #define MAKEWORD32(a, b, c, d)			(((a) << 24) | ((b) << 16) | ((c) << 8) | (d))
60 #define MAKEWORD16(a, b)			(((a) << 8) | (b))
61 
62 #define LSB(x)					((x & 0xff))
63 #define MSB(y)					((y >> 8) & 0xff)
64 
65 
66 #define STB0899_GETFIELD(bitf, val)		((val >> STB0899_OFFST_##bitf) & ((1 << STB0899_WIDTH_##bitf) - 1))
67 
68 
69 #define STB0899_SETFIELD(mask, val, width, offset)      (mask & (~(((1 << width) - 1) <<	\
70 							 offset))) | ((val &			\
71 							 ((1 << width) - 1)) << offset)
72 
73 #define STB0899_SETFIELD_VAL(bitf, mask, val)	(mask = (mask & (~(((1 << STB0899_WIDTH_##bitf) - 1) <<\
74 							 STB0899_OFFST_##bitf))) | \
75 							 (val << STB0899_OFFST_##bitf))
76 
77 
78 enum stb0899_status {
79 	NOAGC1	= 0,
80 	AGC1OK,
81 	NOTIMING,
82 	ANALOGCARRIER,
83 	TIMINGOK,
84 	NOAGC2,
85 	AGC2OK,
86 	NOCARRIER,
87 	CARRIEROK,
88 	NODATA,
89 	FALSELOCK,
90 	DATAOK,
91 	OUTOFRANGE,
92 	RANGEOK,
93 	DVBS2_DEMOD_LOCK,
94 	DVBS2_DEMOD_NOLOCK,
95 	DVBS2_FEC_LOCK,
96 	DVBS2_FEC_NOLOCK
97 };
98 
99 enum stb0899_modcod {
100 	STB0899_DUMMY_PLF,
101 	STB0899_QPSK_14,
102 	STB0899_QPSK_13,
103 	STB0899_QPSK_25,
104 	STB0899_QPSK_12,
105 	STB0899_QPSK_35,
106 	STB0899_QPSK_23,
107 	STB0899_QPSK_34,
108 	STB0899_QPSK_45,
109 	STB0899_QPSK_56,
110 	STB0899_QPSK_89,
111 	STB0899_QPSK_910,
112 	STB0899_8PSK_35,
113 	STB0899_8PSK_23,
114 	STB0899_8PSK_34,
115 	STB0899_8PSK_56,
116 	STB0899_8PSK_89,
117 	STB0899_8PSK_910,
118 	STB0899_16APSK_23,
119 	STB0899_16APSK_34,
120 	STB0899_16APSK_45,
121 	STB0899_16APSK_56,
122 	STB0899_16APSK_89,
123 	STB0899_16APSK_910,
124 	STB0899_32APSK_34,
125 	STB0899_32APSK_45,
126 	STB0899_32APSK_56,
127 	STB0899_32APSK_89,
128 	STB0899_32APSK_910
129 };
130 
131 enum stb0899_frame {
132 	STB0899_LONG_FRAME,
133 	STB0899_SHORT_FRAME
134 };
135 
136 enum stb0899_alpha {
137 	RRC_20,
138 	RRC_25,
139 	RRC_35
140 };
141 
142 struct stb0899_tab {
143 	s32 real;
144 	s32 read;
145 };
146 
147 enum stb0899_fec {
148 	STB0899_FEC_1_2			= 13,
149 	STB0899_FEC_2_3			= 18,
150 	STB0899_FEC_3_4			= 21,
151 	STB0899_FEC_5_6			= 24,
152 	STB0899_FEC_6_7			= 25,
153 	STB0899_FEC_7_8			= 26
154 };
155 
156 struct stb0899_params {
157 	u32	freq;					/* Frequency	*/
158 	u32	srate;					/* Symbol rate	*/
159 	enum fe_code_rate fecrate;
160 };
161 
162 struct stb0899_internal {
163 	u32			master_clk;
164 	u32			freq;			/* Demod internal Frequency		*/
165 	u32			srate;			/* Demod internal Symbol rate		*/
166 	enum stb0899_fec	fecrate;		/* Demod internal FEC rate		*/
167 	s32			srch_range;		/* Demod internal Search Range		*/
168 	s32			sub_range;		/* Demod current sub range (Hz)		*/
169 	s32			tuner_step;		/* Tuner step (Hz)			*/
170 	s32			tuner_offst;		/* Relative offset to carrier (Hz)	*/
171 	u32			tuner_bw;		/* Current bandwidth of the tuner (Hz)	*/
172 
173 	s32			mclk;			/* Masterclock Divider factor (binary)	*/
174 	s32			rolloff;		/* Current RollOff of the filter (x100)	*/
175 
176 	s16			derot_freq;		/* Current derotator frequency (Hz)	*/
177 	s16			derot_percent;
178 
179 	s16			direction;		/* Current derotator search direction	*/
180 	s16			derot_step;		/* Derotator step (binary value)	*/
181 	s16			t_derot;		/* Derotator time constant (ms)		*/
182 	s16			t_data;			/* Data recovery time constant (ms)	*/
183 	s16			sub_dir;		/* Direction of the next sub range	*/
184 
185 	s16			t_agc1;			/* Agc1 time constant (ms)		*/
186 	s16			t_agc2;			/* Agc2 time constant (ms)		*/
187 
188 	u32			lock;			/* Demod internal lock state		*/
189 	enum stb0899_status	status;			/* Demod internal status		*/
190 
191 	/* DVB-S2 */
192 	s32			agc_gain;		/* RF AGC Gain				*/
193 	s32			center_freq;		/* Nominal carrier frequency		*/
194 	s32			av_frame_coarse;	/* Coarse carrier freq search frames	*/
195 	s32			av_frame_fine;		/* Fine carrier freq search frames	*/
196 
197 	s16			step_size;		/* Carrier frequency search step size	*/
198 
199 	enum stb0899_alpha	rrc_alpha;
200 	enum stb0899_inversion	inversion;
201 	enum stb0899_modcod	modcod;
202 	u8			pilots;			/* Pilots found				*/
203 
204 	enum stb0899_frame	frame_length;
205 	u8			v_status;		/* VSTATUS				*/
206 	u8			err_ctrl;		/* ERRCTRLn				*/
207 };
208 
209 struct stb0899_state {
210 	struct i2c_adapter		*i2c;
211 	struct stb0899_config		*config;
212 	struct dvb_frontend		frontend;
213 
214 	u32				*verbose;	/* Cached module verbosity level	*/
215 
216 	struct stb0899_internal		internal;	/* Device internal parameters		*/
217 
218 	/*	cached params from API	*/
219 	enum fe_delivery_system		delsys;
220 	struct stb0899_params		params;
221 
222 	u32				rx_freq;	/* DiSEqC 2.0 receiver freq		*/
223 	struct mutex			search_lock;
224 };
225 /* stb0899.c		*/
226 extern int stb0899_read_reg(struct stb0899_state *state,
227 			    unsigned int reg);
228 
229 extern u32 _stb0899_read_s2reg(struct stb0899_state *state,
230 			       u32 stb0899_i2cdev,
231 			       u32 stb0899_base_addr,
232 			       u16 stb0899_reg_offset);
233 
234 extern int stb0899_read_regs(struct stb0899_state *state,
235 			     unsigned int reg, u8 *buf,
236 			     u32 count);
237 
238 extern int stb0899_write_regs(struct stb0899_state *state,
239 			      unsigned int reg, u8 *data,
240 			      u32 count);
241 
242 extern int stb0899_write_reg(struct stb0899_state *state,
243 			     unsigned int reg,
244 			     u8 data);
245 
246 extern int stb0899_write_s2reg(struct stb0899_state *state,
247 			       u32 stb0899_i2cdev,
248 			       u32 stb0899_base_addr,
249 			       u16 stb0899_reg_offset,
250 			       u32 stb0899_data);
251 
252 extern int stb0899_i2c_gate_ctrl(struct dvb_frontend *fe, int enable);
253 
254 
255 #define STB0899_READ_S2REG(DEVICE, REG)		(_stb0899_read_s2reg(state, DEVICE, STB0899_BASE_##REG, STB0899_OFF0_##REG))
256 //#define STB0899_WRITE_S2REG(DEVICE, REG, DATA)	(_stb0899_write_s2reg(state, DEVICE, STB0899_BASE_##REG, STB0899_OFF0_##REG, DATA))
257 
258 /* stb0899_algo.c	*/
259 extern enum stb0899_status stb0899_dvbs_algo(struct stb0899_state *state);
260 extern enum stb0899_status stb0899_dvbs2_algo(struct stb0899_state *state);
261 extern long stb0899_carr_width(struct stb0899_state *state);
262 
263 #endif //__STB0899_PRIV_H
264