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 | |