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