linux/drivers/media/dvb/frontends/it913x-fe-priv.h
Malcolm Priestley 3dbbf82f49 [media] it913x_fe: frontend and tuner driver v1.05
Fronted and Tuner Driver for ITE IT913x Series with inital support for
IT9137 integrated demodulator and tuner device.

The driver is loosely based on AF9035 series. However, support is not intended for
this device specificity.

The IT9137 tuner has been tested on UHF bands, but VHF has only been simulated.

Possible TODO the tuner sections may be separated from the main driver. All future devices
should use the it913x_fe_script_loader for other tuner devices.

Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
[mchehab@redhat.com: Fix an issue at the Kconfig help]
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2011-08-27 10:29:20 -03:00

343 lines
12 KiB
C

struct it913xset { u32 pro;
u32 address;
u8 reg[15];
u8 count;
};
struct adctable { u32 adcFrequency;
u32 bandwidth;
u32 coeff_1_2048;
u32 coeff_1_4096;
u32 coeff_1_8191;
u32 coeff_1_8192;
u32 coeff_1_8193;
u32 coeff_2_2k;
u32 coeff_2_4k;
u32 coeff_2_8k;
u16 bfsfcw_fftinx_ratio;
u16 fftinx_bfsfcw_ratio;
};
/* clock and coeff tables only table 3 is used with IT9137*/
/* TODO other tables relate AF9035 may be removed */
static struct adctable tab1[] = {
{ 20156250, BANDWIDTH_6_MHZ,
0x02b8ba6e, 0x015c5d37, 0x00ae340d, 0x00ae2e9b, 0x00ae292a,
0x015c5d37, 0x00ae2e9b, 0x0057174e, 0x02f1, 0x015c },
{ 20156250, BANDWIDTH_7_MHZ,
0x032cd980, 0x01966cc0, 0x00cb3cba, 0x00cb3660, 0x00cb3007,
0x01966cc0, 0x00cb3660, 0x00659b30, 0x0285, 0x0196 },
{ 20156250, BANDWIDTH_8_MHZ,
0x03a0f893, 0x01d07c49, 0x00e84567, 0x00e83e25, 0x00e836e3,
0x01d07c49, 0x00e83e25, 0x00741f12, 0x0234, 0x01d0 },
{ 20156250, BANDWIDTH_5_MHZ,
0x02449b5c, 0x01224dae, 0x00912b60, 0x009126d7, 0x0091224e,
0x01224dae, 0x009126d7, 0x0048936b, 0x0387, 0x0122 }
};
static struct adctable tab2[] = {
{ 20187500, BANDWIDTH_6_MHZ,
0x02b7a654, 0x015bd32a, 0x00adef04, 0x00ade995, 0x00ade426,
0x015bd32a, 0x00ade995, 0x0056f4ca, 0x02f2, 0x015c },
{ 20187500, BANDWIDTH_7_MHZ,
0x032b9761, 0x0195cbb1, 0x00caec30, 0x00cae5d8, 0x00cadf81,
0x0195cbb1, 0x00cae5d8, 0x006572ec, 0x0286, 0x0196 },
{ 20187500, BANDWIDTH_8_MHZ,
0x039f886f, 0x01cfc438, 0x00e7e95b, 0x00e7e21c, 0x00e7dadd,
0x01cfc438, 0x00e7e21c, 0x0073f10e, 0x0235, 0x01d0 },
{ 20187500, BANDWIDTH_5_MHZ,
0x0243b546, 0x0121daa3, 0x0090f1d9, 0x0090ed51, 0x0090e8ca,
0x0121daa3, 0x0090ed51, 0x004876a9, 0x0388, 0x0122 }
};
static struct adctable tab3[] = {
{ 20250000, BANDWIDTH_6_MHZ,
0x02b580ad, 0x015ac057, 0x00ad6597, 0x00ad602b, 0x00ad5ac1,
0x015ac057, 0x00ad602b, 0x0056b016, 0x02f4, 0x015b },
{ 20250000, BANDWIDTH_7_MHZ,
0x03291620, 0x01948b10, 0x00ca4bda, 0x00ca4588, 0x00ca3f36,
0x01948b10, 0x00ca4588, 0x006522c4, 0x0288, 0x0195 },
{ 20250000, BANDWIDTH_8_MHZ,
0x039cab92, 0x01ce55c9, 0x00e7321e, 0x00e72ae4, 0x00e723ab,
0x01ce55c9, 0x00e72ae4, 0x00739572, 0x0237, 0x01ce },
{ 20250000, BANDWIDTH_5_MHZ,
0x0241eb3b, 0x0120f59e, 0x00907f53, 0x00907acf, 0x0090764b,
0x0120f59e, 0x00907acf, 0x00483d67, 0x038b, 0x0121 }
};
static struct adctable tab4[] = {
{ 20583333, BANDWIDTH_6_MHZ,
0x02aa4598, 0x015522cc, 0x00aa96bb, 0x00aa9166, 0x00aa8c12,
0x015522cc, 0x00aa9166, 0x005548b3, 0x0300, 0x0155 },
{ 20583333, BANDWIDTH_7_MHZ,
0x031bfbdc, 0x018dfdee, 0x00c7052f, 0x00c6fef7, 0x00c6f8bf,
0x018dfdee, 0x00c6fef7, 0x00637f7b, 0x0293, 0x018e },
{ 20583333, BANDWIDTH_8_MHZ,
0x038db21f, 0x01c6d910, 0x00e373a3, 0x00e36c88, 0x00e3656d,
0x01c6d910, 0x00e36c88, 0x0071b644, 0x0240, 0x01c7 },
{ 20583333, BANDWIDTH_5_MHZ,
0x02388f54, 0x011c47aa, 0x008e2846, 0x008e23d5, 0x008e1f64,
0x011c47aa, 0x008e23d5, 0x004711ea, 0x039a, 0x011c }
};
static struct adctable tab5[] = {
{ 20416667, BANDWIDTH_6_MHZ,
0x02afd765, 0x0157ebb3, 0x00abfb39, 0x00abf5d9, 0x00abf07a,
0x0157ebb3, 0x00abf5d9, 0x0055faed, 0x02fa, 0x0158 },
{ 20416667, BANDWIDTH_7_MHZ,
0x03227b4b, 0x01913da6, 0x00c8a518, 0x00c89ed3, 0x00c8988e,
0x01913da6, 0x00c89ed3, 0x00644f69, 0x028d, 0x0191 },
{ 20416667, BANDWIDTH_8_MHZ,
0x03951f32, 0x01ca8f99, 0x00e54ef7, 0x00e547cc, 0x00e540a2,
0x01ca8f99, 0x00e547cc, 0x0072a3e6, 0x023c, 0x01cb },
{ 20416667, BANDWIDTH_5_MHZ,
0x023d337f, 0x011e99c0, 0x008f515a, 0x008f4ce0, 0x008f4865,
0x011e99c0, 0x008f4ce0, 0x0047a670, 0x0393, 0x011f }
};
static struct adctable tab6[] = {
{ 20480000, BANDWIDTH_6_MHZ,
0x02adb6db, 0x0156db6e, 0x00ab7312, 0x00ab6db7, 0x00ab685c,
0x0156db6e, 0x00ab6db7, 0x0055b6db, 0x02fd, 0x0157 },
{ 20480000, BANDWIDTH_7_MHZ,
0x03200000, 0x01900000, 0x00c80640, 0x00c80000, 0x00c7f9c0,
0x01900000, 0x00c80000, 0x00640000, 0x028f, 0x0190 },
{ 20480000, BANDWIDTH_8_MHZ,
0x03924925, 0x01c92492, 0x00e4996e, 0x00e49249, 0x00e48b25,
0x01c92492, 0x00e49249, 0x00724925, 0x023d, 0x01c9 },
{ 20480000, BANDWIDTH_5_MHZ,
0x023b6db7, 0x011db6db, 0x008edfe5, 0x008edb6e, 0x008ed6f7,
0x011db6db, 0x008edb6e, 0x00476db7, 0x0396, 0x011e }
};
static struct adctable tab7[] = {
{ 20500000, BANDWIDTH_6_MHZ,
0x02ad0b99, 0x015685cc, 0x00ab4840, 0x00ab42e6, 0x00ab3d8c,
0x015685cc, 0x00ab42e6, 0x0055a173, 0x02fd, 0x0157 },
{ 20500000, BANDWIDTH_7_MHZ,
0x031f3832, 0x018f9c19, 0x00c7d44b, 0x00c7ce0c, 0x00c7c7ce,
0x018f9c19, 0x00c7ce0c, 0x0063e706, 0x0290, 0x0190 },
{ 20500000, BANDWIDTH_8_MHZ,
0x039164cb, 0x01c8b266, 0x00e46056, 0x00e45933, 0x00e45210,
0x01c8b266, 0x00e45933, 0x00722c99, 0x023e, 0x01c9 },
{ 20500000, BANDWIDTH_5_MHZ,
0x023adeff, 0x011d6f80, 0x008ebc36, 0x008eb7c0, 0x008eb34a,
0x011d6f80, 0x008eb7c0, 0x00475be0, 0x0396, 0x011d }
};
static struct adctable tab8[] = {
{ 20625000, BANDWIDTH_6_MHZ,
0x02a8e4bd, 0x0154725e, 0x00aa3e81, 0x00aa392f, 0x00aa33de,
0x0154725e, 0x00aa392f, 0x00551c98, 0x0302, 0x0154 },
{ 20625000, BANDWIDTH_7_MHZ,
0x031a6032, 0x018d3019, 0x00c69e41, 0x00c6980c, 0x00c691d8,
0x018d3019, 0x00c6980c, 0x00634c06, 0x0294, 0x018d },
{ 20625000, BANDWIDTH_8_MHZ,
0x038bdba6, 0x01c5edd3, 0x00e2fe02, 0x00e2f6ea, 0x00e2efd2,
0x01c5edd3, 0x00e2f6ea, 0x00717b75, 0x0242, 0x01c6 },
{ 20625000, BANDWIDTH_5_MHZ,
0x02376948, 0x011bb4a4, 0x008ddec1, 0x008dda52, 0x008dd5e3,
0x011bb4a4, 0x008dda52, 0x0046ed29, 0x039c, 0x011c }
};
struct table {
u32 xtal;
struct adctable *table;
};
static struct table fe_clockTable[] = {
{12000000, tab3}, /* FPGA */
{16384000, tab6}, /* 16.38MHz */
{20480000, tab6}, /* 20.48MHz */
{36000000, tab3}, /* 36.00MHz */
{30000000, tab1}, /* 30.00MHz */
{26000000, tab4}, /* 26.00MHz */
{28000000, tab5}, /* 28.00MHz */
{32000000, tab7}, /* 32.00MHz */
{34000000, tab2}, /* 34.00MHz */
{24000000, tab1}, /* 24.00MHz */
{22000000, tab8}, /* 22.00MHz */
{12000000, tab3} /* 12.00MHz */
};
/* fe get */
fe_code_rate_t fe_code[] = {
FEC_1_2,
FEC_2_3,
FEC_3_4,
FEC_5_6,
FEC_7_8,
FEC_NONE,
};
fe_guard_interval_t fe_gi[] = {
GUARD_INTERVAL_1_32,
GUARD_INTERVAL_1_16,
GUARD_INTERVAL_1_8,
GUARD_INTERVAL_1_4,
};
fe_hierarchy_t fe_hi[] = {
HIERARCHY_NONE,
HIERARCHY_1,
HIERARCHY_2,
HIERARCHY_4,
};
fe_transmit_mode_t fe_mode[] = {
TRANSMISSION_MODE_2K,
TRANSMISSION_MODE_8K,
TRANSMISSION_MODE_4K,
};
fe_modulation_t fe_con[] = {
QPSK,
QAM_16,
QAM_64,
};
/* Standard demodulator functions */
static struct it913xset set_solo_fe[] = {
{PRO_LINK, DVBT_INTEN, {0x04}, 0x01},
{PRO_LINK, DVBT_ENABLE, {0x05}, 0x01},
{PRO_DMOD, MP2IF_MPEG_PAR_MODE, {0x00}, 0x01},
{PRO_LINK, HOSTB_MPEG_SER_MODE, {0x00}, 0x01},
{PRO_LINK, HOSTB_MPEG_PAR_MODE, {0x00}, 0x01},
{PRO_DMOD, DCA_UPPER_CHIP, {0x00}, 0x01},
{PRO_LINK, HOSTB_DCA_UPPER, {0x00}, 0x01},
{PRO_DMOD, DCA_LOWER_CHIP, {0x00}, 0x01},
{PRO_LINK, HOSTB_DCA_LOWER, {0x00}, 0x01},
{PRO_DMOD, DCA_PLATCH, {0x00}, 0x01},
{PRO_DMOD, DCA_FPGA_LATCH, {0x00}, 0x01},
{PRO_DMOD, DCA_STAND_ALONE, {0x01}, 0x01},
{PRO_DMOD, DCA_ENABLE, {0x00}, 0x01},
{PRO_DMOD, MP2IF_MPEG_PAR_MODE, {0x00}, 0x01},
{PRO_DMOD, BFS_FCW, {0x00, 0x00, 0x00}, 0x03},
{0xff, 0x0000, {0x00}, 0x00}, /* Terminating Entry */
};
static struct it913xset init_1[] = {
{PRO_LINK, LOCK3_OUT, {0x01}, 0x01},
{PRO_LINK, PADMISCDRSR, {0x01}, 0x01},
{PRO_LINK, PADMISCDR2, {0x00}, 0x01},
{PRO_LINK, PADMISCDR4, {0x00}, 0x01}, /* Power up */
{PRO_LINK, PADMISCDR8, {0x00}, 0x01},
{0xff, 0x0000, {0x00}, 0x00} /* Terminating Entry */
};
/* ---------IT9137 0x38 tuner init---------- */
static struct it913xset it9137_set[] = {
{PRO_DMOD, 0x0043, {0x00}, 0x01},
{PRO_DMOD, 0x0046, {0x38}, 0x01},
{PRO_DMOD, 0x0051, {0x01}, 0x01},
{PRO_DMOD, 0x005f, {0x00, 0x00}, 0x02},
{PRO_DMOD, 0x0068, {0x0a}, 0x01},
{PRO_DMOD, 0x0070, {0x0a, 0x05, 0x02}, 0x03},
{PRO_DMOD, 0x0075, {0x8c, 0x8c, 0x8c, 0xc8, 0x01}, 0x05},
{PRO_DMOD, 0x007e, {0x04, 0x00}, 0x02},
{PRO_DMOD, 0x0081, { 0x0a, 0x12, 0x02, 0x0a, 0x03, 0xc8, 0xb8,
0xd0, 0xc3, 0x01 }, 0x0a},
{PRO_DMOD, 0x008e, {0x01}, 0x01},
{PRO_DMOD, 0x0092, {0x06, 0x00, 0x00, 0x00, 0x00}, 0x05},
{PRO_DMOD, 0x0099, {0x01}, 0x01},
{PRO_DMOD, 0x009b, {0x3c, 0x28}, 0x02},
{PRO_DMOD, 0x009f, {0xe1, 0xcf}, 0x02},
{PRO_DMOD, 0x00a3, {0x01, 0x5a, 0x01, 0x01}, 0x04},
{PRO_DMOD, 0x00a9, {0x00, 0x01}, 0x02},
{PRO_DMOD, 0x00b0, {0x01}, 0x01},
{PRO_DMOD, 0x00b3, {0x02, 0x32}, 0x02},
{PRO_DMOD, 0x00b6, {0x14}, 0x01},
{PRO_DMOD, 0x00c0, {0x11, 0x00, 0x05}, 0x03},
{PRO_DMOD, 0x00c4, {0x00}, 0x01},
{PRO_DMOD, 0x00c6, {0x19, 0x00}, 0x02},
{PRO_DMOD, 0x00cc, {0x2e, 0x51, 0x33}, 0x03},
{PRO_DMOD, 0x00f3, {0x05, 0x8c, 0x8c}, 0x03},
{PRO_DMOD, 0x00f8, {0x03, 0x06, 0x06}, 0x03},
{PRO_DMOD, 0x00fc, { 0x02, 0x02, 0x02, 0x09, 0x50, 0x7b, 0x77,
0x00, 0x02, 0xc8, 0x05, 0x7b }, 0x0c},
{PRO_DMOD, 0x0109, {0x02}, 0x01},
{PRO_DMOD, 0x0115, {0x0a, 0x03}, 0x02},
{PRO_DMOD, 0x011a, {0xc8, 0x7b, 0xbc, 0xa0}, 0x04},
{PRO_DMOD, 0x0122, {0x02, 0x18, 0xc3}, 0x03},
{PRO_DMOD, 0x0127, {0x00, 0x07}, 0x02},
{PRO_DMOD, 0x012a, {0x53, 0x51, 0x4e, 0x43}, 0x04},
{PRO_DMOD, 0x0137, {0x01, 0x00, 0x07, 0x00, 0x06}, 0x05},
{PRO_DMOD, 0x013d, {0x00, 0x01, 0x5b, 0xc8}, 0x04},
{PRO_DMOD, 0xf130, {0x04}, 0x01},
{PRO_DMOD, 0xf132, {0x04}, 0x01},
{PRO_DMOD, 0xf144, {0x1a}, 0x01},
{PRO_DMOD, 0xf146, {0x00}, 0x01},
{PRO_DMOD, 0xf14a, {0x01}, 0x01},
{PRO_DMOD, 0xf14c, {0x00, 0x00}, 0x02},
{PRO_DMOD, 0xf14f, {0x04}, 0x01},
{PRO_DMOD, 0xf158, {0x7f}, 0x01},
{PRO_DMOD, 0xf15a, {0x00, 0x08}, 0x02},
{PRO_DMOD, 0xf15d, {0x03, 0x05}, 0x02},
{PRO_DMOD, 0xf163, {0x05}, 0x01},
{PRO_DMOD, 0xf166, {0x01, 0x40, 0x0f}, 0x03},
{PRO_DMOD, 0xf17a, {0x00, 0x00}, 0x02},
{PRO_DMOD, 0xf183, {0x01}, 0x01},
{PRO_DMOD, 0xf19d, {0x40}, 0x01},
{PRO_DMOD, 0xf1bc, {0x36, 0x00}, 0x02},
{PRO_DMOD, 0xf1cb, {0xa0, 0x01}, 0x02},
{PRO_DMOD, 0xf204, {0x10}, 0x01},
{PRO_DMOD, 0xf214, {0x00}, 0x01},
{PRO_DMOD, 0xf24c, {0x88, 0x95, 0x9a, 0x90}, 0x04},
{PRO_DMOD, 0xf25a, {0x07, 0xe8, 0x03, 0xb0, 0x04}, 0x05},
{PRO_DMOD, 0xf270, {0x01, 0x02, 0x01, 0x02}, 0x04},
{PRO_DMOD, 0xf40e, {0x0a, 0x40, 0x08}, 0x03},
{PRO_DMOD, 0xf55f, {0x0a}, 0x01},
{PRO_DMOD, 0xf561, {0x15, 0x20}, 0x02},
{PRO_DMOD, 0xf5df, {0xfb, 0x00}, 0x02},
{PRO_DMOD, 0xf5e3, {0x09, 0x01, 0x01}, 0x03},
{PRO_DMOD, 0xf5f8, {0x01}, 0x01},
{PRO_DMOD, 0xf5fd, {0x01}, 0x01},
{PRO_DMOD, 0xf600, { 0x05, 0x08, 0x0b, 0x0e, 0x11, 0x14, 0x17,
0x1f }, 0x08},
{PRO_DMOD, 0xf60e, {0x00, 0x04, 0x32, 0x10}, 0x04},
{PRO_DMOD, 0xf707, {0xfc, 0x00, 0x37, 0x00}, 0x04},
{PRO_DMOD, 0xf78b, {0x01}, 0x01},
{PRO_DMOD, 0xf80f, {0x40, 0x54, 0x5a}, 0x03},
{PRO_DMOD, 0xf905, {0x01}, 0x01},
{PRO_DMOD, 0xfb06, {0x03}, 0x01},
{PRO_DMOD, 0xfd8b, {0x00}, 0x01},
{PRO_LINK, GPIOH5_EN, {0x01}, 0x01},
{PRO_LINK, GPIOH5_ON, {0x01}, 0x01},
{PRO_LINK, GPIOH5_O, {0x00}, 0x01},
{PRO_LINK, GPIOH5_O, {0x01}, 0x01},/* ?, but enable */
{0xff, 0x0000, {0x00}, 0x00}, /* Terminating Entry */
};
static struct it913xset it9137_tuner[] = {
{PRO_DMOD, 0xec57, {0x00}, 0x01},
{PRO_DMOD, 0xec58, {0x00}, 0x01},
{PRO_DMOD, 0xec40, {0x00}, 0x01},
{PRO_DMOD, 0xec02, { 0x00, 0x0c, 0x00, 0x40, 0x00, 0x80, 0x80,
0x00, 0x00, 0x00, 0x00 }, 0x0b},
{PRO_DMOD, 0xec0d, { 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00 }, 0x0b},
{PRO_DMOD, 0xec19, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00}, 0x08},
{PRO_DMOD, 0xec22, { 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00 }, 0x0a},
{PRO_DMOD, 0xec3f, {0x01}, 0x01},
/* Clear any existing tune */
{PRO_DMOD, 0xec4c, {0xa8, 0x00, 0x00, 0x00, 0x00}, 0x05},
{0xff, 0x0000, {0x00}, 0x00}, /* Terminating Entry */
};
static struct it913xset set_it9137_template[] = {
{PRO_DMOD, 0xee06, {0x00}, 0x01},
{PRO_DMOD, 0xec56, {0x00}, 0x01},
{PRO_DMOD, 0xec4c, {0x00, 0x00, 0x00, 0x00, 0x00}, 0x05},
{0xff, 0x0000, {0x00}, 0x00}, /* Terminating Entry */
};