403 lines · c
1/* SPDX-License-Identifier: GPL-2.0-or-later */2/*3 * Montage Technology M88DS3103/M88RS6000 demodulator driver4 *5 * Copyright (C) 2013 Antti Palosaari <crope@iki.fi>6 */7 8#ifndef M88DS3103_PRIV_H9#define M88DS3103_PRIV_H10 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 0x7424#define M88DS3103_CHIP_ID 0x7025 26#define M88DS3103_CHIPTYPE_3103 027#define M88DS3103_CHIPTYPE_RS6000 128#define M88DS3103_CHIPTYPE_3103B 229 30struct 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 54struct m88ds3103_reg_val {55 u8 reg;56 u8 val;57};58 59static 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 142static 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 228static 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 314static 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#endif403