^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-or-later */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Elonics E4000 silicon tuner driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2012 Antti Palosaari <crope@iki.fi>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #ifndef E4000_PRIV_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #define E4000_PRIV_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include "e4000.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/math64.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <media/v4l2-ctrls.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <media/v4l2-subdev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/regmap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) struct e4000_dev {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) struct i2c_client *client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) struct regmap *regmap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) u32 clk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) struct dvb_frontend *fe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) struct v4l2_subdev sd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) bool active;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) unsigned int f_frequency;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) unsigned int f_bandwidth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) /* Controls */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) struct v4l2_ctrl_handler hdl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) struct v4l2_ctrl *bandwidth_auto;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) struct v4l2_ctrl *bandwidth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) struct v4l2_ctrl *lna_gain_auto;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) struct v4l2_ctrl *lna_gain;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) struct v4l2_ctrl *mixer_gain_auto;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) struct v4l2_ctrl *mixer_gain;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) struct v4l2_ctrl *if_gain_auto;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) struct v4l2_ctrl *if_gain;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) struct v4l2_ctrl *pll_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) struct e4000_pll {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) u32 freq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) u8 div_out_reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) u8 div_out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) static const struct e4000_pll e4000_pll_lut[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) /* VCO min VCO max */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) { 72400000, 0x0f, 48 }, /* .......... 3475200000 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) { 81200000, 0x0e, 40 }, /* 2896000000 3248000000 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) { 108300000, 0x0d, 32 }, /* 2598400000 3465600000 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) { 162500000, 0x0c, 24 }, /* 2599200000 3900000000 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) { 216600000, 0x0b, 16 }, /* 2600000000 3465600000 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) { 325000000, 0x0a, 12 }, /* 2599200000 3900000000 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) { 350000000, 0x09, 8 }, /* 2600000000 2800000000 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) { 432000000, 0x03, 8 }, /* 2800000000 3456000000 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) { 667000000, 0x02, 6 }, /* 2592000000 4002000000 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) { 1200000000, 0x01, 4 }, /* 2668000000 4800000000 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) { 0xffffffff, 0x00, 2 }, /* 2400000000 .......... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) struct e4000_lna_filter {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) u32 freq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) u8 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) static const struct e4000_lna_filter e400_lna_filter_lut[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) { 370000000, 0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) { 392500000, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) { 415000000, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) { 437500000, 3 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) { 462500000, 4 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) { 490000000, 5 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) { 522500000, 6 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) { 557500000, 7 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) { 595000000, 8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) { 642500000, 9 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) { 695000000, 10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) { 740000000, 11 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) { 800000000, 12 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) { 865000000, 13 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) { 930000000, 14 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) { 1000000000, 15 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) { 1310000000, 0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) { 1340000000, 1 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) { 1385000000, 2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) { 1427500000, 3 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) { 1452500000, 4 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) { 1475000000, 5 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) { 1510000000, 6 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) { 1545000000, 7 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) { 1575000000, 8 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) { 1615000000, 9 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) { 1650000000, 10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) { 1670000000, 11 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) { 1690000000, 12 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) { 1710000000, 13 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) { 1735000000, 14 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) { 0xffffffff, 15 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) struct e4000_band {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) u32 freq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) u8 reg07_val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) u8 reg78_val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) static const struct e4000_band e4000_band_lut[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) { 140000000, 0x01, 0x03 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) { 350000000, 0x03, 0x03 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) { 1000000000, 0x05, 0x03 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) { 0xffffffff, 0x07, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) struct e4000_if_filter {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) u32 freq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) u8 reg11_val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) u8 reg12_val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) static const struct e4000_if_filter e4000_if_filter_lut[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) { 4300000, 0xfd, 0x1f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) { 4400000, 0xfd, 0x1e },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) { 4480000, 0xfc, 0x1d },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) { 4560000, 0xfc, 0x1c },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) { 4600000, 0xfc, 0x1b },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) { 4800000, 0xfc, 0x1a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) { 4900000, 0xfc, 0x19 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) { 5000000, 0xfc, 0x18 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) { 5100000, 0xfc, 0x17 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) { 5200000, 0xfc, 0x16 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) { 5400000, 0xfc, 0x15 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) { 5500000, 0xfc, 0x14 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) { 5600000, 0xfc, 0x13 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) { 5800000, 0xfb, 0x12 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) { 5900000, 0xfb, 0x11 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) { 6000000, 0xfb, 0x10 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) { 6200000, 0xfb, 0x0f },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) { 6400000, 0xfa, 0x0e },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) { 6600000, 0xfa, 0x0d },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) { 6800000, 0xf9, 0x0c },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) { 7200000, 0xf9, 0x0b },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) { 7400000, 0xf9, 0x0a },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) { 7600000, 0xf8, 0x09 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) { 7800000, 0xf8, 0x08 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) { 8200000, 0xf8, 0x07 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) { 8600000, 0xf7, 0x06 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) { 8800000, 0xf7, 0x05 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) { 9200000, 0xf7, 0x04 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) { 9600000, 0xf6, 0x03 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) { 10000000, 0xf6, 0x02 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) { 10600000, 0xf5, 0x01 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) { 11000000, 0xf5, 0x00 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) { 0xffffffff, 0x00, 0x20 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) struct e4000_if_gain {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) u8 reg16_val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) u8 reg17_val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) static const struct e4000_if_gain e4000_if_gain_lut[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) {0x00, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) {0x20, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) {0x40, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) {0x02, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) {0x22, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) {0x42, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) {0x04, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) {0x24, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) {0x44, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) {0x01, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) {0x21, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) {0x41, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) {0x03, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) {0x23, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) {0x43, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) {0x05, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) {0x25, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) {0x45, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) {0x07, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) {0x27, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) {0x47, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) {0x0f, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) {0x2f, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) {0x4f, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) {0x17, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) {0x37, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) {0x57, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) {0x1f, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) {0x3f, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) {0x5f, 0x00},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) {0x1f, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) {0x3f, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) {0x5f, 0x01},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) {0x1f, 0x02},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) {0x3f, 0x02},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) {0x5f, 0x02},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) {0x1f, 0x03},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) {0x3f, 0x03},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) {0x5f, 0x03},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) {0x1f, 0x04},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) {0x3f, 0x04},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) {0x5f, 0x04},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) {0x1f, 0x0c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) {0x3f, 0x0c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) {0x5f, 0x0c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) {0x1f, 0x14},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) {0x3f, 0x14},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) {0x5f, 0x14},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) {0x1f, 0x1c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) {0x3f, 0x1c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) {0x5f, 0x1c},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) {0x1f, 0x24},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) {0x3f, 0x24},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) {0x5f, 0x24},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) {0x7f, 0x24},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) #endif