root/drivers/media/dvb-frontends/m88ds3103_priv.h
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * Montage Technology M88DS3103/M88RS6000 demodulator driver
 *
 * Copyright (C) 2013 Antti Palosaari <crope@iki.fi>
 */

#ifndef M88DS3103_PRIV_H
#define M88DS3103_PRIV_H

#include <media/dvb_frontend.h>
#include "m88ds3103.h"
#include <linux/int_log.h>
#include <linux/firmware.h>
#include <linux/i2c-mux.h>
#include <linux/regmap.h>
#include <linux/math64.h>

#define M88DS3103B_FIRMWARE "dvb-demod-m88ds3103b.fw"
#define M88DS3103C_FIRMWARE "dvb-demod-m88ds3103c.fw"
#define M88DS3103_FIRMWARE  "dvb-demod-m88ds3103.fw"
#define M88RS6000_FIRMWARE  "dvb-demod-m88rs6000.fw"

#define M88DS3103_CHIP_ID  0x70
#define M88RS6000_CHIP_ID  0x74
#define M88DS3103C_CHIP_ID 0x71

#define M88DS3103_CHIPTYPE_3103   0
#define M88DS3103_CHIPTYPE_RS6000 1
#define M88DS3103_CHIPTYPE_3103B  2
#define M88DS3103_CHIPTYPE_3103C  3

struct m88ds3103_dev {
        struct i2c_client *client;
        struct i2c_client *dt_client;
        struct regmap_config regmap_config;
        struct regmap *regmap;
        struct m88ds3103_config config;
        const struct m88ds3103_config *cfg;
        struct dvb_frontend fe;
        enum fe_delivery_system delivery_system;
        enum fe_status fe_status;
        u32 dvbv3_ber; /* for old DVBv3 API read_ber */
        bool warm; /* FW running */
        struct i2c_mux_core *muxc;
        /* auto detect chip id to do different config */
        u8 chip_id;
        /* chip type to differentiate m88rs6000 from m88ds3103b */
        u8 chiptype;
        /* main mclk is calculated for M88RS6000 dynamically */
        s32 mclk;
        u64 post_bit_error;
        u64 post_bit_count;
        u8 dt_addr;
};

struct m88ds3103_reg_val {
        u8 reg;
        u8 val;
};

static const struct m88ds3103_reg_val m88ds3103_dvbs_init_reg_vals[] = {
        {0x23, 0x07},
        {0x08, 0x03},
        {0x0c, 0x02},
        {0x21, 0x54},
        {0x25, 0x8a},
        {0x27, 0x31},
        {0x30, 0x08},
        {0x31, 0x40},
        {0x32, 0x32},
        {0x35, 0xff},
        {0x3a, 0x00},
        {0x37, 0x10},
        {0x38, 0x10},
        {0x39, 0x02},
        {0x42, 0x60},
        {0x4a, 0x80},
        {0x4b, 0x04},
        {0x4d, 0x91},
        {0x5d, 0xc8},
        {0x50, 0x36},
        {0x51, 0x36},
        {0x52, 0x36},
        {0x53, 0x36},
        {0x56, 0x01},
        {0x63, 0x0f},
        {0x64, 0x30},
        {0x65, 0x40},
        {0x68, 0x26},
        {0x69, 0x4c},
        {0x70, 0x20},
        {0x71, 0x70},
        {0x72, 0x04},
        {0x73, 0x00},
        {0x70, 0x40},
        {0x71, 0x70},
        {0x72, 0x04},
        {0x73, 0x00},
        {0x70, 0x60},
        {0x71, 0x70},
        {0x72, 0x04},
        {0x73, 0x00},
        {0x70, 0x80},
        {0x71, 0x70},
        {0x72, 0x04},
        {0x73, 0x00},
        {0x70, 0xa0},
        {0x71, 0x70},
        {0x72, 0x04},
        {0x73, 0x00},
        {0x70, 0x1f},
        {0x76, 0x38},
        {0x77, 0xa6},
        {0x78, 0x0c},
        {0x79, 0x80},
        {0x7f, 0x14},
        {0x7c, 0x00},
        {0xae, 0x82},
        {0x80, 0x64},
        {0x81, 0x66},
        {0x82, 0x44},
        {0x85, 0x04},
        {0xcd, 0xf4},
        {0x90, 0x33},
        {0xa0, 0x44},
        {0xc0, 0x08},
        {0xc3, 0x10},
        {0xc4, 0x08},
        {0xc5, 0xf0},
        {0xc6, 0xff},
        {0xc7, 0x00},
        {0xc8, 0x1a},
        {0xc9, 0x80},
        {0xe0, 0xf8},
        {0xe6, 0x8b},
        {0xd0, 0x40},
        {0xf8, 0x20},
        {0xfa, 0x0f},
        {0x00, 0x00},
        {0xbd, 0x01},
        {0xb8, 0x00},
};

static const struct m88ds3103_reg_val m88ds3103_dvbs2_init_reg_vals[] = {
        {0x23, 0x07},
        {0x08, 0x07},
        {0x0c, 0x02},
        {0x21, 0x54},
        {0x25, 0x8a},
        {0x27, 0x31},
        {0x30, 0x08},
        {0x32, 0x32},
        {0x35, 0xff},
        {0x3a, 0x00},
        {0x37, 0x10},
        {0x38, 0x10},
        {0x39, 0x02},
        {0x42, 0x60},
        {0x4a, 0x80},
        {0x4b, 0x04},
        {0x4d, 0x91},
        {0x5d, 0xc8},
        {0x50, 0x36},
        {0x51, 0x36},
        {0x52, 0x36},
        {0x53, 0x36},
        {0x56, 0x01},
        {0x63, 0x0f},
        {0x64, 0x10},
        {0x65, 0x20},
        {0x68, 0x46},
        {0x69, 0xcd},
        {0x70, 0x20},
        {0x71, 0x70},
        {0x72, 0x04},
        {0x73, 0x00},
        {0x70, 0x40},
        {0x71, 0x70},
        {0x72, 0x04},
        {0x73, 0x00},
        {0x70, 0x60},
        {0x71, 0x70},
        {0x72, 0x04},
        {0x73, 0x00},
        {0x70, 0x80},
        {0x71, 0x70},
        {0x72, 0x04},
        {0x73, 0x00},
        {0x70, 0xa0},
        {0x71, 0x70},
        {0x72, 0x04},
        {0x73, 0x00},
        {0x70, 0x1f},
        {0x76, 0x38},
        {0x77, 0xa6},
        {0x78, 0x0c},
        {0x79, 0x80},
        {0x7f, 0x14},
        {0x85, 0x08},
        {0xcd, 0xf4},
        {0x90, 0x33},
        {0x86, 0x00},
        {0x87, 0x0f},
        {0x89, 0x00},
        {0x8b, 0x44},
        {0x8c, 0x66},
        {0x9d, 0xc1},
        {0x8a, 0x10},
        {0xad, 0x40},
        {0xa0, 0x44},
        {0xc0, 0x08},
        {0xc1, 0x10},
        {0xc2, 0x08},
        {0xc3, 0x10},
        {0xc4, 0x08},
        {0xc5, 0xf0},
        {0xc6, 0xff},
        {0xc7, 0x00},
        {0xc8, 0x1a},
        {0xc9, 0x80},
        {0xca, 0x23},
        {0xcb, 0x24},
        {0xcc, 0xf4},
        {0xce, 0x74},
        {0x00, 0x00},
        {0xbd, 0x01},
        {0xb8, 0x00},
};

static const struct m88ds3103_reg_val m88rs6000_dvbs_init_reg_vals[] = {
        {0x23, 0x07},
        {0x08, 0x03},
        {0x0c, 0x02},
        {0x20, 0x00},
        {0x21, 0x54},
        {0x25, 0x82},
        {0x27, 0x31},
        {0x30, 0x08},
        {0x31, 0x40},
        {0x32, 0x32},
        {0x33, 0x35},
        {0x35, 0xff},
        {0x3a, 0x00},
        {0x37, 0x10},
        {0x38, 0x10},
        {0x39, 0x02},
        {0x42, 0x60},
        {0x4a, 0x80},
        {0x4b, 0x04},
        {0x4d, 0x91},
        {0x5d, 0xc8},
        {0x50, 0x36},
        {0x51, 0x36},
        {0x52, 0x36},
        {0x53, 0x36},
        {0x63, 0x0f},
        {0x64, 0x30},
        {0x65, 0x40},
        {0x68, 0x26},
        {0x69, 0x4c},
        {0x70, 0x20},
        {0x71, 0x70},
        {0x72, 0x04},
        {0x73, 0x00},
        {0x70, 0x40},
        {0x71, 0x70},
        {0x72, 0x04},
        {0x73, 0x00},
        {0x70, 0x60},
        {0x71, 0x70},
        {0x72, 0x04},
        {0x73, 0x00},
        {0x70, 0x80},
        {0x71, 0x70},
        {0x72, 0x04},
        {0x73, 0x00},
        {0x70, 0xa0},
        {0x71, 0x70},
        {0x72, 0x04},
        {0x73, 0x00},
        {0x70, 0x1f},
        {0x76, 0x38},
        {0x77, 0xa6},
        {0x78, 0x0c},
        {0x79, 0x80},
        {0x7f, 0x14},
        {0x7c, 0x00},
        {0xae, 0x82},
        {0x80, 0x64},
        {0x81, 0x66},
        {0x82, 0x44},
        {0x85, 0x04},
        {0xcd, 0xf4},
        {0x90, 0x33},
        {0xa0, 0x44},
        {0xbe, 0x00},
        {0xc0, 0x08},
        {0xc3, 0x10},
        {0xc4, 0x08},
        {0xc5, 0xf0},
        {0xc6, 0xff},
        {0xc7, 0x00},
        {0xc8, 0x1a},
        {0xc9, 0x80},
        {0xe0, 0xf8},
        {0xe6, 0x8b},
        {0xd0, 0x40},
        {0xf8, 0x20},
        {0xfa, 0x0f},
        {0x00, 0x00},
        {0xbd, 0x01},
        {0xb8, 0x00},
        {0x29, 0x11},
};

static const struct m88ds3103_reg_val m88rs6000_dvbs2_init_reg_vals[] = {
        {0x23, 0x07},
        {0x08, 0x07},
        {0x0c, 0x02},
        {0x20, 0x00},
        {0x21, 0x54},
        {0x25, 0x82},
        {0x27, 0x31},
        {0x30, 0x08},
        {0x32, 0x32},
        {0x33, 0x35},
        {0x35, 0xff},
        {0x3a, 0x00},
        {0x37, 0x10},
        {0x38, 0x10},
        {0x39, 0x02},
        {0x42, 0x60},
        {0x4a, 0x80},
        {0x4b, 0x04},
        {0x4d, 0x91},
        {0x5d, 0xc8},
        {0x50, 0x36},
        {0x51, 0x36},
        {0x52, 0x36},
        {0x53, 0x36},
        {0x63, 0x0f},
        {0x64, 0x10},
        {0x65, 0x20},
        {0x68, 0x46},
        {0x69, 0xcd},
        {0x70, 0x20},
        {0x71, 0x70},
        {0x72, 0x04},
        {0x73, 0x00},
        {0x70, 0x40},
        {0x71, 0x70},
        {0x72, 0x04},
        {0x73, 0x00},
        {0x70, 0x60},
        {0x71, 0x70},
        {0x72, 0x04},
        {0x73, 0x00},
        {0x70, 0x80},
        {0x71, 0x70},
        {0x72, 0x04},
        {0x73, 0x00},
        {0x70, 0xa0},
        {0x71, 0x70},
        {0x72, 0x04},
        {0x73, 0x00},
        {0x70, 0x1f},
        {0x76, 0x38},
        {0x77, 0xa6},
        {0x78, 0x0c},
        {0x79, 0x80},
        {0x7f, 0x14},
        {0x85, 0x08},
        {0xcd, 0xf4},
        {0x90, 0x33},
        {0x86, 0x00},
        {0x87, 0x0f},
        {0x89, 0x00},
        {0x8b, 0x44},
        {0x8c, 0x66},
        {0x9d, 0xc1},
        {0x8a, 0x10},
        {0xad, 0x40},
        {0xa0, 0x44},
        {0xbe, 0x00},
        {0xc0, 0x08},
        {0xc1, 0x10},
        {0xc2, 0x08},
        {0xc3, 0x10},
        {0xc4, 0x08},
        {0xc5, 0xf0},
        {0xc6, 0xff},
        {0xc7, 0x00},
        {0xc8, 0x1a},
        {0xc9, 0x80},
        {0xca, 0x23},
        {0xcb, 0x24},
        {0xcc, 0xf4},
        {0xce, 0x74},
        {0x00, 0x00},
        {0xbd, 0x01},
        {0xb8, 0x00},
        {0x29, 0x01},
};

static const struct m88ds3103_reg_val m88ds3103c_dvbs_init_reg_vals[] = {
        {0x04, 0x10},
        {0x8a, 0x01},
        {0x16, 0xa7},
        {0x30, 0x08},
        {0x32, 0x32},
        {0x33, 0x35},
        {0x35, 0xff},
        {0x4a, 0x80},
        {0x4d, 0x93},
        {0xae, 0x09},
        {0x22, 0x01},
        {0x23, 0x00},
        {0x24, 0x00},
        {0x27, 0x07},
        {0x9c, 0x31},
        {0x9d, 0xc1},
        {0xcb, 0xf4},
        {0xca, 0x00},
        {0x7f, 0x04},
        {0x78, 0x0c},
        {0x85, 0x08},
        {0x08, 0x47},
        {0xf0, 0x03},
        {0xfa, 0x01},
        {0xf2, 0x00},
        {0xfa, 0x00},
        {0xe6, 0x00},
        {0xe7, 0xf3},
        {0x08, 0x43},
        {0xe0, 0xf8},
        {0x00, 0x00},
        {0xbd, 0x82},
        {0x80, 0xa8},
        {0x81, 0xea},
        {0xbe, 0xa1}
};

#endif