162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Elonics E4000 silicon tuner driver 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2012 Antti Palosaari <crope@iki.fi> 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef E4000_PRIV_H 962306a36Sopenharmony_ci#define E4000_PRIV_H 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include "e4000.h" 1262306a36Sopenharmony_ci#include <linux/math64.h> 1362306a36Sopenharmony_ci#include <media/v4l2-ctrls.h> 1462306a36Sopenharmony_ci#include <media/v4l2-subdev.h> 1562306a36Sopenharmony_ci#include <linux/regmap.h> 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_cistruct e4000_dev { 1862306a36Sopenharmony_ci struct i2c_client *client; 1962306a36Sopenharmony_ci struct regmap *regmap; 2062306a36Sopenharmony_ci u32 clk; 2162306a36Sopenharmony_ci struct dvb_frontend *fe; 2262306a36Sopenharmony_ci struct v4l2_subdev sd; 2362306a36Sopenharmony_ci bool active; 2462306a36Sopenharmony_ci unsigned int f_frequency; 2562306a36Sopenharmony_ci unsigned int f_bandwidth; 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci /* Controls */ 2862306a36Sopenharmony_ci struct v4l2_ctrl_handler hdl; 2962306a36Sopenharmony_ci struct v4l2_ctrl *bandwidth_auto; 3062306a36Sopenharmony_ci struct v4l2_ctrl *bandwidth; 3162306a36Sopenharmony_ci struct v4l2_ctrl *lna_gain_auto; 3262306a36Sopenharmony_ci struct v4l2_ctrl *lna_gain; 3362306a36Sopenharmony_ci struct v4l2_ctrl *mixer_gain_auto; 3462306a36Sopenharmony_ci struct v4l2_ctrl *mixer_gain; 3562306a36Sopenharmony_ci struct v4l2_ctrl *if_gain_auto; 3662306a36Sopenharmony_ci struct v4l2_ctrl *if_gain; 3762306a36Sopenharmony_ci struct v4l2_ctrl *pll_lock; 3862306a36Sopenharmony_ci}; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_cistruct e4000_pll { 4162306a36Sopenharmony_ci u32 freq; 4262306a36Sopenharmony_ci u8 div_out_reg; 4362306a36Sopenharmony_ci u8 div_out; 4462306a36Sopenharmony_ci}; 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_cistatic const struct e4000_pll e4000_pll_lut[] = { 4762306a36Sopenharmony_ci/* VCO min VCO max */ 4862306a36Sopenharmony_ci { 72400000, 0x0f, 48 }, /* .......... 3475200000 */ 4962306a36Sopenharmony_ci { 81200000, 0x0e, 40 }, /* 2896000000 3248000000 */ 5062306a36Sopenharmony_ci { 108300000, 0x0d, 32 }, /* 2598400000 3465600000 */ 5162306a36Sopenharmony_ci { 162500000, 0x0c, 24 }, /* 2599200000 3900000000 */ 5262306a36Sopenharmony_ci { 216600000, 0x0b, 16 }, /* 2600000000 3465600000 */ 5362306a36Sopenharmony_ci { 325000000, 0x0a, 12 }, /* 2599200000 3900000000 */ 5462306a36Sopenharmony_ci { 350000000, 0x09, 8 }, /* 2600000000 2800000000 */ 5562306a36Sopenharmony_ci { 432000000, 0x03, 8 }, /* 2800000000 3456000000 */ 5662306a36Sopenharmony_ci { 667000000, 0x02, 6 }, /* 2592000000 4002000000 */ 5762306a36Sopenharmony_ci { 1200000000, 0x01, 4 }, /* 2668000000 4800000000 */ 5862306a36Sopenharmony_ci { 0xffffffff, 0x00, 2 }, /* 2400000000 .......... */ 5962306a36Sopenharmony_ci}; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_cistruct e4000_lna_filter { 6262306a36Sopenharmony_ci u32 freq; 6362306a36Sopenharmony_ci u8 val; 6462306a36Sopenharmony_ci}; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_cistatic const struct e4000_lna_filter e400_lna_filter_lut[] = { 6762306a36Sopenharmony_ci { 370000000, 0 }, 6862306a36Sopenharmony_ci { 392500000, 1 }, 6962306a36Sopenharmony_ci { 415000000, 2 }, 7062306a36Sopenharmony_ci { 437500000, 3 }, 7162306a36Sopenharmony_ci { 462500000, 4 }, 7262306a36Sopenharmony_ci { 490000000, 5 }, 7362306a36Sopenharmony_ci { 522500000, 6 }, 7462306a36Sopenharmony_ci { 557500000, 7 }, 7562306a36Sopenharmony_ci { 595000000, 8 }, 7662306a36Sopenharmony_ci { 642500000, 9 }, 7762306a36Sopenharmony_ci { 695000000, 10 }, 7862306a36Sopenharmony_ci { 740000000, 11 }, 7962306a36Sopenharmony_ci { 800000000, 12 }, 8062306a36Sopenharmony_ci { 865000000, 13 }, 8162306a36Sopenharmony_ci { 930000000, 14 }, 8262306a36Sopenharmony_ci { 1000000000, 15 }, 8362306a36Sopenharmony_ci { 1310000000, 0 }, 8462306a36Sopenharmony_ci { 1340000000, 1 }, 8562306a36Sopenharmony_ci { 1385000000, 2 }, 8662306a36Sopenharmony_ci { 1427500000, 3 }, 8762306a36Sopenharmony_ci { 1452500000, 4 }, 8862306a36Sopenharmony_ci { 1475000000, 5 }, 8962306a36Sopenharmony_ci { 1510000000, 6 }, 9062306a36Sopenharmony_ci { 1545000000, 7 }, 9162306a36Sopenharmony_ci { 1575000000, 8 }, 9262306a36Sopenharmony_ci { 1615000000, 9 }, 9362306a36Sopenharmony_ci { 1650000000, 10 }, 9462306a36Sopenharmony_ci { 1670000000, 11 }, 9562306a36Sopenharmony_ci { 1690000000, 12 }, 9662306a36Sopenharmony_ci { 1710000000, 13 }, 9762306a36Sopenharmony_ci { 1735000000, 14 }, 9862306a36Sopenharmony_ci { 0xffffffff, 15 }, 9962306a36Sopenharmony_ci}; 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_cistruct e4000_band { 10262306a36Sopenharmony_ci u32 freq; 10362306a36Sopenharmony_ci u8 reg07_val; 10462306a36Sopenharmony_ci u8 reg78_val; 10562306a36Sopenharmony_ci}; 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_cistatic const struct e4000_band e4000_band_lut[] = { 10862306a36Sopenharmony_ci { 140000000, 0x01, 0x03 }, 10962306a36Sopenharmony_ci { 350000000, 0x03, 0x03 }, 11062306a36Sopenharmony_ci { 1000000000, 0x05, 0x03 }, 11162306a36Sopenharmony_ci { 0xffffffff, 0x07, 0x00 }, 11262306a36Sopenharmony_ci}; 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_cistruct e4000_if_filter { 11562306a36Sopenharmony_ci u32 freq; 11662306a36Sopenharmony_ci u8 reg11_val; 11762306a36Sopenharmony_ci u8 reg12_val; 11862306a36Sopenharmony_ci}; 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_cistatic const struct e4000_if_filter e4000_if_filter_lut[] = { 12162306a36Sopenharmony_ci { 4300000, 0xfd, 0x1f }, 12262306a36Sopenharmony_ci { 4400000, 0xfd, 0x1e }, 12362306a36Sopenharmony_ci { 4480000, 0xfc, 0x1d }, 12462306a36Sopenharmony_ci { 4560000, 0xfc, 0x1c }, 12562306a36Sopenharmony_ci { 4600000, 0xfc, 0x1b }, 12662306a36Sopenharmony_ci { 4800000, 0xfc, 0x1a }, 12762306a36Sopenharmony_ci { 4900000, 0xfc, 0x19 }, 12862306a36Sopenharmony_ci { 5000000, 0xfc, 0x18 }, 12962306a36Sopenharmony_ci { 5100000, 0xfc, 0x17 }, 13062306a36Sopenharmony_ci { 5200000, 0xfc, 0x16 }, 13162306a36Sopenharmony_ci { 5400000, 0xfc, 0x15 }, 13262306a36Sopenharmony_ci { 5500000, 0xfc, 0x14 }, 13362306a36Sopenharmony_ci { 5600000, 0xfc, 0x13 }, 13462306a36Sopenharmony_ci { 5800000, 0xfb, 0x12 }, 13562306a36Sopenharmony_ci { 5900000, 0xfb, 0x11 }, 13662306a36Sopenharmony_ci { 6000000, 0xfb, 0x10 }, 13762306a36Sopenharmony_ci { 6200000, 0xfb, 0x0f }, 13862306a36Sopenharmony_ci { 6400000, 0xfa, 0x0e }, 13962306a36Sopenharmony_ci { 6600000, 0xfa, 0x0d }, 14062306a36Sopenharmony_ci { 6800000, 0xf9, 0x0c }, 14162306a36Sopenharmony_ci { 7200000, 0xf9, 0x0b }, 14262306a36Sopenharmony_ci { 7400000, 0xf9, 0x0a }, 14362306a36Sopenharmony_ci { 7600000, 0xf8, 0x09 }, 14462306a36Sopenharmony_ci { 7800000, 0xf8, 0x08 }, 14562306a36Sopenharmony_ci { 8200000, 0xf8, 0x07 }, 14662306a36Sopenharmony_ci { 8600000, 0xf7, 0x06 }, 14762306a36Sopenharmony_ci { 8800000, 0xf7, 0x05 }, 14862306a36Sopenharmony_ci { 9200000, 0xf7, 0x04 }, 14962306a36Sopenharmony_ci { 9600000, 0xf6, 0x03 }, 15062306a36Sopenharmony_ci { 10000000, 0xf6, 0x02 }, 15162306a36Sopenharmony_ci { 10600000, 0xf5, 0x01 }, 15262306a36Sopenharmony_ci { 11000000, 0xf5, 0x00 }, 15362306a36Sopenharmony_ci { 0xffffffff, 0x00, 0x20 }, 15462306a36Sopenharmony_ci}; 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_cistruct e4000_if_gain { 15762306a36Sopenharmony_ci u8 reg16_val; 15862306a36Sopenharmony_ci u8 reg17_val; 15962306a36Sopenharmony_ci}; 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_cistatic const struct e4000_if_gain e4000_if_gain_lut[] = { 16262306a36Sopenharmony_ci {0x00, 0x00}, 16362306a36Sopenharmony_ci {0x20, 0x00}, 16462306a36Sopenharmony_ci {0x40, 0x00}, 16562306a36Sopenharmony_ci {0x02, 0x00}, 16662306a36Sopenharmony_ci {0x22, 0x00}, 16762306a36Sopenharmony_ci {0x42, 0x00}, 16862306a36Sopenharmony_ci {0x04, 0x00}, 16962306a36Sopenharmony_ci {0x24, 0x00}, 17062306a36Sopenharmony_ci {0x44, 0x00}, 17162306a36Sopenharmony_ci {0x01, 0x00}, 17262306a36Sopenharmony_ci {0x21, 0x00}, 17362306a36Sopenharmony_ci {0x41, 0x00}, 17462306a36Sopenharmony_ci {0x03, 0x00}, 17562306a36Sopenharmony_ci {0x23, 0x00}, 17662306a36Sopenharmony_ci {0x43, 0x00}, 17762306a36Sopenharmony_ci {0x05, 0x00}, 17862306a36Sopenharmony_ci {0x25, 0x00}, 17962306a36Sopenharmony_ci {0x45, 0x00}, 18062306a36Sopenharmony_ci {0x07, 0x00}, 18162306a36Sopenharmony_ci {0x27, 0x00}, 18262306a36Sopenharmony_ci {0x47, 0x00}, 18362306a36Sopenharmony_ci {0x0f, 0x00}, 18462306a36Sopenharmony_ci {0x2f, 0x00}, 18562306a36Sopenharmony_ci {0x4f, 0x00}, 18662306a36Sopenharmony_ci {0x17, 0x00}, 18762306a36Sopenharmony_ci {0x37, 0x00}, 18862306a36Sopenharmony_ci {0x57, 0x00}, 18962306a36Sopenharmony_ci {0x1f, 0x00}, 19062306a36Sopenharmony_ci {0x3f, 0x00}, 19162306a36Sopenharmony_ci {0x5f, 0x00}, 19262306a36Sopenharmony_ci {0x1f, 0x01}, 19362306a36Sopenharmony_ci {0x3f, 0x01}, 19462306a36Sopenharmony_ci {0x5f, 0x01}, 19562306a36Sopenharmony_ci {0x1f, 0x02}, 19662306a36Sopenharmony_ci {0x3f, 0x02}, 19762306a36Sopenharmony_ci {0x5f, 0x02}, 19862306a36Sopenharmony_ci {0x1f, 0x03}, 19962306a36Sopenharmony_ci {0x3f, 0x03}, 20062306a36Sopenharmony_ci {0x5f, 0x03}, 20162306a36Sopenharmony_ci {0x1f, 0x04}, 20262306a36Sopenharmony_ci {0x3f, 0x04}, 20362306a36Sopenharmony_ci {0x5f, 0x04}, 20462306a36Sopenharmony_ci {0x1f, 0x0c}, 20562306a36Sopenharmony_ci {0x3f, 0x0c}, 20662306a36Sopenharmony_ci {0x5f, 0x0c}, 20762306a36Sopenharmony_ci {0x1f, 0x14}, 20862306a36Sopenharmony_ci {0x3f, 0x14}, 20962306a36Sopenharmony_ci {0x5f, 0x14}, 21062306a36Sopenharmony_ci {0x1f, 0x1c}, 21162306a36Sopenharmony_ci {0x3f, 0x1c}, 21262306a36Sopenharmony_ci {0x5f, 0x1c}, 21362306a36Sopenharmony_ci {0x1f, 0x24}, 21462306a36Sopenharmony_ci {0x3f, 0x24}, 21562306a36Sopenharmony_ci {0x5f, 0x24}, 21662306a36Sopenharmony_ci {0x7f, 0x24}, 21762306a36Sopenharmony_ci}; 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_ci#endif 220