1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
2 | /* |
3 | * Montage Technology M88DS3103/M88RS6000 demodulator driver |
4 | * |
5 | * Copyright (C) 2013 Antti Palosaari <crope@iki.fi> |
6 | */ |
7 | |
8 | #ifndef M88DS3103_PRIV_H |
9 | #define M88DS3103_PRIV_H |
10 | |
11 | #include <media/dvb_frontend.h> |
12 | #include "m88ds3103.h" |
13 | #include <linux/int_log.h> |
14 | #include <linux/firmware.h> |
15 | #include <linux/i2c-mux.h> |
16 | #include <linux/regmap.h> |
17 | #include <linux/math64.h> |
18 | |
19 | #define M88DS3103B_FIRMWARE "dvb-demod-m88ds3103b.fw" |
20 | #define M88DS3103_FIRMWARE "dvb-demod-m88ds3103.fw" |
21 | #define M88RS6000_FIRMWARE "dvb-demod-m88rs6000.fw" |
22 | |
23 | #define M88RS6000_CHIP_ID 0x74 |
24 | #define M88DS3103_CHIP_ID 0x70 |
25 | |
26 | #define M88DS3103_CHIPTYPE_3103 0 |
27 | #define M88DS3103_CHIPTYPE_RS6000 1 |
28 | #define M88DS3103_CHIPTYPE_3103B 2 |
29 | |
30 | struct m88ds3103_dev { |
31 | struct i2c_client *client; |
32 | struct i2c_client *dt_client; |
33 | struct regmap_config regmap_config; |
34 | struct regmap *regmap; |
35 | struct m88ds3103_config config; |
36 | const struct m88ds3103_config *cfg; |
37 | struct dvb_frontend fe; |
38 | enum fe_delivery_system delivery_system; |
39 | enum fe_status fe_status; |
40 | u32 dvbv3_ber; /* for old DVBv3 API read_ber */ |
41 | bool warm; /* FW running */ |
42 | struct i2c_mux_core *muxc; |
43 | /* auto detect chip id to do different config */ |
44 | u8 chip_id; |
45 | /* chip type to differentiate m88rs6000 from m88ds3103b */ |
46 | u8 chiptype; |
47 | /* main mclk is calculated for M88RS6000 dynamically */ |
48 | s32 mclk; |
49 | u64 post_bit_error; |
50 | u64 post_bit_count; |
51 | u8 dt_addr; |
52 | }; |
53 | |
54 | struct m88ds3103_reg_val { |
55 | u8 reg; |
56 | u8 val; |
57 | }; |
58 | |
59 | static const struct m88ds3103_reg_val m88ds3103_dvbs_init_reg_vals[] = { |
60 | {0x23, 0x07}, |
61 | {0x08, 0x03}, |
62 | {0x0c, 0x02}, |
63 | {0x21, 0x54}, |
64 | {0x25, 0x8a}, |
65 | {0x27, 0x31}, |
66 | {0x30, 0x08}, |
67 | {0x31, 0x40}, |
68 | {0x32, 0x32}, |
69 | {0x35, 0xff}, |
70 | {0x3a, 0x00}, |
71 | {0x37, 0x10}, |
72 | {0x38, 0x10}, |
73 | {0x39, 0x02}, |
74 | {0x42, 0x60}, |
75 | {0x4a, 0x80}, |
76 | {0x4b, 0x04}, |
77 | {0x4d, 0x91}, |
78 | {0x5d, 0xc8}, |
79 | {0x50, 0x36}, |
80 | {0x51, 0x36}, |
81 | {0x52, 0x36}, |
82 | {0x53, 0x36}, |
83 | {0x56, 0x01}, |
84 | {0x63, 0x0f}, |
85 | {0x64, 0x30}, |
86 | {0x65, 0x40}, |
87 | {0x68, 0x26}, |
88 | {0x69, 0x4c}, |
89 | {0x70, 0x20}, |
90 | {0x71, 0x70}, |
91 | {0x72, 0x04}, |
92 | {0x73, 0x00}, |
93 | {0x70, 0x40}, |
94 | {0x71, 0x70}, |
95 | {0x72, 0x04}, |
96 | {0x73, 0x00}, |
97 | {0x70, 0x60}, |
98 | {0x71, 0x70}, |
99 | {0x72, 0x04}, |
100 | {0x73, 0x00}, |
101 | {0x70, 0x80}, |
102 | {0x71, 0x70}, |
103 | {0x72, 0x04}, |
104 | {0x73, 0x00}, |
105 | {0x70, 0xa0}, |
106 | {0x71, 0x70}, |
107 | {0x72, 0x04}, |
108 | {0x73, 0x00}, |
109 | {0x70, 0x1f}, |
110 | {0x76, 0x38}, |
111 | {0x77, 0xa6}, |
112 | {0x78, 0x0c}, |
113 | {0x79, 0x80}, |
114 | {0x7f, 0x14}, |
115 | {0x7c, 0x00}, |
116 | {0xae, 0x82}, |
117 | {0x80, 0x64}, |
118 | {0x81, 0x66}, |
119 | {0x82, 0x44}, |
120 | {0x85, 0x04}, |
121 | {0xcd, 0xf4}, |
122 | {0x90, 0x33}, |
123 | {0xa0, 0x44}, |
124 | {0xc0, 0x08}, |
125 | {0xc3, 0x10}, |
126 | {0xc4, 0x08}, |
127 | {0xc5, 0xf0}, |
128 | {0xc6, 0xff}, |
129 | {0xc7, 0x00}, |
130 | {0xc8, 0x1a}, |
131 | {0xc9, 0x80}, |
132 | {0xe0, 0xf8}, |
133 | {0xe6, 0x8b}, |
134 | {0xd0, 0x40}, |
135 | {0xf8, 0x20}, |
136 | {0xfa, 0x0f}, |
137 | {0x00, 0x00}, |
138 | {0xbd, 0x01}, |
139 | {0xb8, 0x00}, |
140 | }; |
141 | |
142 | static const struct m88ds3103_reg_val m88ds3103_dvbs2_init_reg_vals[] = { |
143 | {0x23, 0x07}, |
144 | {0x08, 0x07}, |
145 | {0x0c, 0x02}, |
146 | {0x21, 0x54}, |
147 | {0x25, 0x8a}, |
148 | {0x27, 0x31}, |
149 | {0x30, 0x08}, |
150 | {0x32, 0x32}, |
151 | {0x35, 0xff}, |
152 | {0x3a, 0x00}, |
153 | {0x37, 0x10}, |
154 | {0x38, 0x10}, |
155 | {0x39, 0x02}, |
156 | {0x42, 0x60}, |
157 | {0x4a, 0x80}, |
158 | {0x4b, 0x04}, |
159 | {0x4d, 0x91}, |
160 | {0x5d, 0xc8}, |
161 | {0x50, 0x36}, |
162 | {0x51, 0x36}, |
163 | {0x52, 0x36}, |
164 | {0x53, 0x36}, |
165 | {0x56, 0x01}, |
166 | {0x63, 0x0f}, |
167 | {0x64, 0x10}, |
168 | {0x65, 0x20}, |
169 | {0x68, 0x46}, |
170 | {0x69, 0xcd}, |
171 | {0x70, 0x20}, |
172 | {0x71, 0x70}, |
173 | {0x72, 0x04}, |
174 | {0x73, 0x00}, |
175 | {0x70, 0x40}, |
176 | {0x71, 0x70}, |
177 | {0x72, 0x04}, |
178 | {0x73, 0x00}, |
179 | {0x70, 0x60}, |
180 | {0x71, 0x70}, |
181 | {0x72, 0x04}, |
182 | {0x73, 0x00}, |
183 | {0x70, 0x80}, |
184 | {0x71, 0x70}, |
185 | {0x72, 0x04}, |
186 | {0x73, 0x00}, |
187 | {0x70, 0xa0}, |
188 | {0x71, 0x70}, |
189 | {0x72, 0x04}, |
190 | {0x73, 0x00}, |
191 | {0x70, 0x1f}, |
192 | {0x76, 0x38}, |
193 | {0x77, 0xa6}, |
194 | {0x78, 0x0c}, |
195 | {0x79, 0x80}, |
196 | {0x7f, 0x14}, |
197 | {0x85, 0x08}, |
198 | {0xcd, 0xf4}, |
199 | {0x90, 0x33}, |
200 | {0x86, 0x00}, |
201 | {0x87, 0x0f}, |
202 | {0x89, 0x00}, |
203 | {0x8b, 0x44}, |
204 | {0x8c, 0x66}, |
205 | {0x9d, 0xc1}, |
206 | {0x8a, 0x10}, |
207 | {0xad, 0x40}, |
208 | {0xa0, 0x44}, |
209 | {0xc0, 0x08}, |
210 | {0xc1, 0x10}, |
211 | {0xc2, 0x08}, |
212 | {0xc3, 0x10}, |
213 | {0xc4, 0x08}, |
214 | {0xc5, 0xf0}, |
215 | {0xc6, 0xff}, |
216 | {0xc7, 0x00}, |
217 | {0xc8, 0x1a}, |
218 | {0xc9, 0x80}, |
219 | {0xca, 0x23}, |
220 | {0xcb, 0x24}, |
221 | {0xcc, 0xf4}, |
222 | {0xce, 0x74}, |
223 | {0x00, 0x00}, |
224 | {0xbd, 0x01}, |
225 | {0xb8, 0x00}, |
226 | }; |
227 | |
228 | static const struct m88ds3103_reg_val m88rs6000_dvbs_init_reg_vals[] = { |
229 | {0x23, 0x07}, |
230 | {0x08, 0x03}, |
231 | {0x0c, 0x02}, |
232 | {0x20, 0x00}, |
233 | {0x21, 0x54}, |
234 | {0x25, 0x82}, |
235 | {0x27, 0x31}, |
236 | {0x30, 0x08}, |
237 | {0x31, 0x40}, |
238 | {0x32, 0x32}, |
239 | {0x33, 0x35}, |
240 | {0x35, 0xff}, |
241 | {0x3a, 0x00}, |
242 | {0x37, 0x10}, |
243 | {0x38, 0x10}, |
244 | {0x39, 0x02}, |
245 | {0x42, 0x60}, |
246 | {0x4a, 0x80}, |
247 | {0x4b, 0x04}, |
248 | {0x4d, 0x91}, |
249 | {0x5d, 0xc8}, |
250 | {0x50, 0x36}, |
251 | {0x51, 0x36}, |
252 | {0x52, 0x36}, |
253 | {0x53, 0x36}, |
254 | {0x63, 0x0f}, |
255 | {0x64, 0x30}, |
256 | {0x65, 0x40}, |
257 | {0x68, 0x26}, |
258 | {0x69, 0x4c}, |
259 | {0x70, 0x20}, |
260 | {0x71, 0x70}, |
261 | {0x72, 0x04}, |
262 | {0x73, 0x00}, |
263 | {0x70, 0x40}, |
264 | {0x71, 0x70}, |
265 | {0x72, 0x04}, |
266 | {0x73, 0x00}, |
267 | {0x70, 0x60}, |
268 | {0x71, 0x70}, |
269 | {0x72, 0x04}, |
270 | {0x73, 0x00}, |
271 | {0x70, 0x80}, |
272 | {0x71, 0x70}, |
273 | {0x72, 0x04}, |
274 | {0x73, 0x00}, |
275 | {0x70, 0xa0}, |
276 | {0x71, 0x70}, |
277 | {0x72, 0x04}, |
278 | {0x73, 0x00}, |
279 | {0x70, 0x1f}, |
280 | {0x76, 0x38}, |
281 | {0x77, 0xa6}, |
282 | {0x78, 0x0c}, |
283 | {0x79, 0x80}, |
284 | {0x7f, 0x14}, |
285 | {0x7c, 0x00}, |
286 | {0xae, 0x82}, |
287 | {0x80, 0x64}, |
288 | {0x81, 0x66}, |
289 | {0x82, 0x44}, |
290 | {0x85, 0x04}, |
291 | {0xcd, 0xf4}, |
292 | {0x90, 0x33}, |
293 | {0xa0, 0x44}, |
294 | {0xbe, 0x00}, |
295 | {0xc0, 0x08}, |
296 | {0xc3, 0x10}, |
297 | {0xc4, 0x08}, |
298 | {0xc5, 0xf0}, |
299 | {0xc6, 0xff}, |
300 | {0xc7, 0x00}, |
301 | {0xc8, 0x1a}, |
302 | {0xc9, 0x80}, |
303 | {0xe0, 0xf8}, |
304 | {0xe6, 0x8b}, |
305 | {0xd0, 0x40}, |
306 | {0xf8, 0x20}, |
307 | {0xfa, 0x0f}, |
308 | {0x00, 0x00}, |
309 | {0xbd, 0x01}, |
310 | {0xb8, 0x00}, |
311 | {0x29, 0x11}, |
312 | }; |
313 | |
314 | static const struct m88ds3103_reg_val m88rs6000_dvbs2_init_reg_vals[] = { |
315 | {0x23, 0x07}, |
316 | {0x08, 0x07}, |
317 | {0x0c, 0x02}, |
318 | {0x20, 0x00}, |
319 | {0x21, 0x54}, |
320 | {0x25, 0x82}, |
321 | {0x27, 0x31}, |
322 | {0x30, 0x08}, |
323 | {0x32, 0x32}, |
324 | {0x33, 0x35}, |
325 | {0x35, 0xff}, |
326 | {0x3a, 0x00}, |
327 | {0x37, 0x10}, |
328 | {0x38, 0x10}, |
329 | {0x39, 0x02}, |
330 | {0x42, 0x60}, |
331 | {0x4a, 0x80}, |
332 | {0x4b, 0x04}, |
333 | {0x4d, 0x91}, |
334 | {0x5d, 0xc8}, |
335 | {0x50, 0x36}, |
336 | {0x51, 0x36}, |
337 | {0x52, 0x36}, |
338 | {0x53, 0x36}, |
339 | {0x63, 0x0f}, |
340 | {0x64, 0x10}, |
341 | {0x65, 0x20}, |
342 | {0x68, 0x46}, |
343 | {0x69, 0xcd}, |
344 | {0x70, 0x20}, |
345 | {0x71, 0x70}, |
346 | {0x72, 0x04}, |
347 | {0x73, 0x00}, |
348 | {0x70, 0x40}, |
349 | {0x71, 0x70}, |
350 | {0x72, 0x04}, |
351 | {0x73, 0x00}, |
352 | {0x70, 0x60}, |
353 | {0x71, 0x70}, |
354 | {0x72, 0x04}, |
355 | {0x73, 0x00}, |
356 | {0x70, 0x80}, |
357 | {0x71, 0x70}, |
358 | {0x72, 0x04}, |
359 | {0x73, 0x00}, |
360 | {0x70, 0xa0}, |
361 | {0x71, 0x70}, |
362 | {0x72, 0x04}, |
363 | {0x73, 0x00}, |
364 | {0x70, 0x1f}, |
365 | {0x76, 0x38}, |
366 | {0x77, 0xa6}, |
367 | {0x78, 0x0c}, |
368 | {0x79, 0x80}, |
369 | {0x7f, 0x14}, |
370 | {0x85, 0x08}, |
371 | {0xcd, 0xf4}, |
372 | {0x90, 0x33}, |
373 | {0x86, 0x00}, |
374 | {0x87, 0x0f}, |
375 | {0x89, 0x00}, |
376 | {0x8b, 0x44}, |
377 | {0x8c, 0x66}, |
378 | {0x9d, 0xc1}, |
379 | {0x8a, 0x10}, |
380 | {0xad, 0x40}, |
381 | {0xa0, 0x44}, |
382 | {0xbe, 0x00}, |
383 | {0xc0, 0x08}, |
384 | {0xc1, 0x10}, |
385 | {0xc2, 0x08}, |
386 | {0xc3, 0x10}, |
387 | {0xc4, 0x08}, |
388 | {0xc5, 0xf0}, |
389 | {0xc6, 0xff}, |
390 | {0xc7, 0x00}, |
391 | {0xc8, 0x1a}, |
392 | {0xc9, 0x80}, |
393 | {0xca, 0x23}, |
394 | {0xcb, 0x24}, |
395 | {0xcc, 0xf4}, |
396 | {0xce, 0x74}, |
397 | {0x00, 0x00}, |
398 | {0xbd, 0x01}, |
399 | {0xb8, 0x00}, |
400 | {0x29, 0x01}, |
401 | }; |
402 | #endif |
403 | |