18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Afatech AF9035 DVB USB driver 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2009 Antti Palosaari <crope@iki.fi> 68c2ecf20Sopenharmony_ci * Copyright (C) 2012 Antti Palosaari <crope@iki.fi> 78c2ecf20Sopenharmony_ci */ 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#ifndef AF9035_H 108c2ecf20Sopenharmony_ci#define AF9035_H 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 138c2ecf20Sopenharmony_ci#include "dvb_usb.h" 148c2ecf20Sopenharmony_ci#include "af9033.h" 158c2ecf20Sopenharmony_ci#include "tua9001.h" 168c2ecf20Sopenharmony_ci#include "fc0011.h" 178c2ecf20Sopenharmony_ci#include "fc0012.h" 188c2ecf20Sopenharmony_ci#include "mxl5007t.h" 198c2ecf20Sopenharmony_ci#include "tda18218.h" 208c2ecf20Sopenharmony_ci#include "fc2580.h" 218c2ecf20Sopenharmony_ci#include "it913x.h" 228c2ecf20Sopenharmony_ci#include "si2168.h" 238c2ecf20Sopenharmony_ci#include "si2157.h" 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_cistruct reg_val { 268c2ecf20Sopenharmony_ci u32 reg; 278c2ecf20Sopenharmony_ci u8 val; 288c2ecf20Sopenharmony_ci}; 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_cistruct reg_val_mask { 318c2ecf20Sopenharmony_ci u32 reg; 328c2ecf20Sopenharmony_ci u8 val; 338c2ecf20Sopenharmony_ci u8 mask; 348c2ecf20Sopenharmony_ci}; 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_cistruct usb_req { 378c2ecf20Sopenharmony_ci u8 cmd; 388c2ecf20Sopenharmony_ci u8 mbox; 398c2ecf20Sopenharmony_ci u8 wlen; 408c2ecf20Sopenharmony_ci u8 *wbuf; 418c2ecf20Sopenharmony_ci u8 rlen; 428c2ecf20Sopenharmony_ci u8 *rbuf; 438c2ecf20Sopenharmony_ci}; 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_cistruct state { 468c2ecf20Sopenharmony_ci#define BUF_LEN 64 478c2ecf20Sopenharmony_ci u8 buf[BUF_LEN]; 488c2ecf20Sopenharmony_ci u8 seq; /* packet sequence number */ 498c2ecf20Sopenharmony_ci u8 prechip_version; 508c2ecf20Sopenharmony_ci u8 chip_version; 518c2ecf20Sopenharmony_ci u16 chip_type; 528c2ecf20Sopenharmony_ci u8 eeprom[256]; 538c2ecf20Sopenharmony_ci bool no_eeprom; 548c2ecf20Sopenharmony_ci u8 ir_mode; 558c2ecf20Sopenharmony_ci u8 ir_type; 568c2ecf20Sopenharmony_ci u8 dual_mode:1; 578c2ecf20Sopenharmony_ci u8 no_read:1; 588c2ecf20Sopenharmony_ci u8 af9033_i2c_addr[2]; 598c2ecf20Sopenharmony_ci u8 it930x_addresses; 608c2ecf20Sopenharmony_ci struct af9033_config af9033_config[2]; 618c2ecf20Sopenharmony_ci struct af9033_ops ops; 628c2ecf20Sopenharmony_ci #define AF9035_I2C_CLIENT_MAX 4 638c2ecf20Sopenharmony_ci struct i2c_client *i2c_client[AF9035_I2C_CLIENT_MAX]; 648c2ecf20Sopenharmony_ci struct i2c_adapter *i2c_adapter_demod; 658c2ecf20Sopenharmony_ci struct platform_device *platform_device_tuner[2]; 668c2ecf20Sopenharmony_ci}; 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_cistruct address_table { 698c2ecf20Sopenharmony_ci u8 frontend_i2c_addr; 708c2ecf20Sopenharmony_ci u8 tuner_i2c_addr; 718c2ecf20Sopenharmony_ci u8 tuner_if_port; 728c2ecf20Sopenharmony_ci}; 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_cistatic const struct address_table it930x_addresses_table[] = { 758c2ecf20Sopenharmony_ci { 0x67, 0x63, 1 }, 768c2ecf20Sopenharmony_ci { 0x64, 0x60, 0 }, 778c2ecf20Sopenharmony_ci}; 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_cistatic const u32 clock_lut_af9035[] = { 808c2ecf20Sopenharmony_ci 20480000, /* FPGA */ 818c2ecf20Sopenharmony_ci 16384000, /* 16.38 MHz */ 828c2ecf20Sopenharmony_ci 20480000, /* 20.48 MHz */ 838c2ecf20Sopenharmony_ci 36000000, /* 36.00 MHz */ 848c2ecf20Sopenharmony_ci 30000000, /* 30.00 MHz */ 858c2ecf20Sopenharmony_ci 26000000, /* 26.00 MHz */ 868c2ecf20Sopenharmony_ci 28000000, /* 28.00 MHz */ 878c2ecf20Sopenharmony_ci 32000000, /* 32.00 MHz */ 888c2ecf20Sopenharmony_ci 34000000, /* 34.00 MHz */ 898c2ecf20Sopenharmony_ci 24000000, /* 24.00 MHz */ 908c2ecf20Sopenharmony_ci 22000000, /* 22.00 MHz */ 918c2ecf20Sopenharmony_ci 12000000, /* 12.00 MHz */ 928c2ecf20Sopenharmony_ci}; 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_cistatic const u32 clock_lut_it9135[] = { 958c2ecf20Sopenharmony_ci 12000000, /* 12.00 MHz */ 968c2ecf20Sopenharmony_ci 20480000, /* 20.48 MHz */ 978c2ecf20Sopenharmony_ci 36000000, /* 36.00 MHz */ 988c2ecf20Sopenharmony_ci 30000000, /* 30.00 MHz */ 998c2ecf20Sopenharmony_ci 26000000, /* 26.00 MHz */ 1008c2ecf20Sopenharmony_ci 28000000, /* 28.00 MHz */ 1018c2ecf20Sopenharmony_ci 32000000, /* 32.00 MHz */ 1028c2ecf20Sopenharmony_ci 34000000, /* 34.00 MHz */ 1038c2ecf20Sopenharmony_ci 24000000, /* 24.00 MHz */ 1048c2ecf20Sopenharmony_ci 22000000, /* 22.00 MHz */ 1058c2ecf20Sopenharmony_ci}; 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_ci#define AF9035_FIRMWARE_AF9035 "dvb-usb-af9035-02.fw" 1088c2ecf20Sopenharmony_ci#define AF9035_FIRMWARE_IT9135_V1 "dvb-usb-it9135-01.fw" 1098c2ecf20Sopenharmony_ci#define AF9035_FIRMWARE_IT9135_V2 "dvb-usb-it9135-02.fw" 1108c2ecf20Sopenharmony_ci#define AF9035_FIRMWARE_IT9303 "dvb-usb-it9303-01.fw" 1118c2ecf20Sopenharmony_ci 1128c2ecf20Sopenharmony_ci/* 1138c2ecf20Sopenharmony_ci * eeprom is memory mapped as read only. Writing that memory mapped address 1148c2ecf20Sopenharmony_ci * will not corrupt eeprom. 1158c2ecf20Sopenharmony_ci * 1168c2ecf20Sopenharmony_ci * TS mode: 1178c2ecf20Sopenharmony_ci * 0 TS 1188c2ecf20Sopenharmony_ci * 1 DCA + PIP 1198c2ecf20Sopenharmony_ci * 3 PIP 1208c2ecf20Sopenharmony_ci * 5 DCA + PIP (AF9035 only) 1218c2ecf20Sopenharmony_ci * n DCA 1228c2ecf20Sopenharmony_ci * 1238c2ecf20Sopenharmony_ci * Values 0, 3 and 5 are seen to this day. 0 for single TS and 3/5 for dual TS. 1248c2ecf20Sopenharmony_ci */ 1258c2ecf20Sopenharmony_ci 1268c2ecf20Sopenharmony_ci#define EEPROM_BASE_AF9035 0x42f5 1278c2ecf20Sopenharmony_ci#define EEPROM_BASE_IT9135 0x4994 1288c2ecf20Sopenharmony_ci#define EEPROM_SHIFT 0x10 1298c2ecf20Sopenharmony_ci 1308c2ecf20Sopenharmony_ci#define EEPROM_IR_MODE 0x18 1318c2ecf20Sopenharmony_ci#define EEPROM_TS_MODE 0x31 1328c2ecf20Sopenharmony_ci#define EEPROM_2ND_DEMOD_ADDR 0x32 1338c2ecf20Sopenharmony_ci#define EEPROM_IR_TYPE 0x34 1348c2ecf20Sopenharmony_ci#define EEPROM_1_IF_L 0x38 1358c2ecf20Sopenharmony_ci#define EEPROM_1_IF_H 0x39 1368c2ecf20Sopenharmony_ci#define EEPROM_1_TUNER_ID 0x3c 1378c2ecf20Sopenharmony_ci#define EEPROM_2_IF_L 0x48 1388c2ecf20Sopenharmony_ci#define EEPROM_2_IF_H 0x49 1398c2ecf20Sopenharmony_ci#define EEPROM_2_TUNER_ID 0x4c 1408c2ecf20Sopenharmony_ci 1418c2ecf20Sopenharmony_ci/* USB commands */ 1428c2ecf20Sopenharmony_ci#define CMD_MEM_RD 0x00 1438c2ecf20Sopenharmony_ci#define CMD_MEM_WR 0x01 1448c2ecf20Sopenharmony_ci#define CMD_I2C_RD 0x02 1458c2ecf20Sopenharmony_ci#define CMD_I2C_WR 0x03 1468c2ecf20Sopenharmony_ci#define CMD_IR_GET 0x18 1478c2ecf20Sopenharmony_ci#define CMD_FW_DL 0x21 1488c2ecf20Sopenharmony_ci#define CMD_FW_QUERYINFO 0x22 1498c2ecf20Sopenharmony_ci#define CMD_FW_BOOT 0x23 1508c2ecf20Sopenharmony_ci#define CMD_FW_DL_BEGIN 0x24 1518c2ecf20Sopenharmony_ci#define CMD_FW_DL_END 0x25 1528c2ecf20Sopenharmony_ci#define CMD_FW_SCATTER_WR 0x29 1538c2ecf20Sopenharmony_ci#define CMD_GENERIC_I2C_RD 0x2a 1548c2ecf20Sopenharmony_ci#define CMD_GENERIC_I2C_WR 0x2b 1558c2ecf20Sopenharmony_ci 1568c2ecf20Sopenharmony_ci#endif 157