1c942fddfSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */ 2786baecfSMauro Carvalho Chehab /* 3786baecfSMauro Carvalho Chehab * DVB USB Linux driver for Afatech AF9015 DVB-T USB2.0 receiver 4786baecfSMauro Carvalho Chehab * 5786baecfSMauro Carvalho Chehab * Copyright (C) 2007 Antti Palosaari <crope@iki.fi> 6786baecfSMauro Carvalho Chehab * 7786baecfSMauro Carvalho Chehab * Thanks to Afatech who kindly provided information. 8786baecfSMauro Carvalho Chehab */ 9786baecfSMauro Carvalho Chehab 10786baecfSMauro Carvalho Chehab #ifndef AF9015_H 11786baecfSMauro Carvalho Chehab #define AF9015_H 12786baecfSMauro Carvalho Chehab 13786baecfSMauro Carvalho Chehab #include <linux/hash.h> 148b79c7abSAntti Palosaari #include <linux/regmap.h> 15786baecfSMauro Carvalho Chehab #include "dvb_usb.h" 16786baecfSMauro Carvalho Chehab #include "af9013.h" 17786baecfSMauro Carvalho Chehab #include "dvb-pll.h" 18786baecfSMauro Carvalho Chehab #include "mt2060.h" 19786baecfSMauro Carvalho Chehab #include "qt1010.h" 20786baecfSMauro Carvalho Chehab #include "tda18271.h" 21786baecfSMauro Carvalho Chehab #include "mxl5005s.h" 22786baecfSMauro Carvalho Chehab #include "mc44s803.h" 23786baecfSMauro Carvalho Chehab #include "tda18218.h" 24786baecfSMauro Carvalho Chehab #include "mxl5007t.h" 25786baecfSMauro Carvalho Chehab 26bab9b4feSAntti Palosaari #define AF9015_FIRMWARE "dvb-usb-af9015.fw" 27bab9b4feSAntti Palosaari 285ded0eb7SAntti Palosaari #define AF9015_I2C_EEPROM 0x50 295ded0eb7SAntti Palosaari #define AF9015_I2C_DEMOD 0x1c 30786baecfSMauro Carvalho Chehab #define AF9015_USB_TIMEOUT 2000 31786baecfSMauro Carvalho Chehab 32786baecfSMauro Carvalho Chehab /* EEPROM locations */ 33786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_IR_MODE 0x18 34786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_IR_REMOTE_TYPE 0x34 35786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_TS_MODE 0x31 36786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_DEMOD2_I2C 0x32 37786baecfSMauro Carvalho Chehab 38786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_SAW_BW1 0x35 39786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_XTAL_TYPE1 0x36 40786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_SPEC_INV1 0x37 41786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_IF1L 0x38 42786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_IF1H 0x39 43786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_MT2060_IF1L 0x3a 44786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_MT2060_IF1H 0x3b 45786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_TUNER_ID1 0x3c 46786baecfSMauro Carvalho Chehab 47786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_SAW_BW2 0x45 48786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_XTAL_TYPE2 0x46 49786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_SPEC_INV2 0x47 50786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_IF2L 0x48 51786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_IF2H 0x49 52786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_MT2060_IF2L 0x4a 53786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_MT2060_IF2H 0x4b 54786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_TUNER_ID2 0x4c 55786baecfSMauro Carvalho Chehab 56786baecfSMauro Carvalho Chehab #define AF9015_EEPROM_OFFSET (AF9015_EEPROM_SAW_BW2 - AF9015_EEPROM_SAW_BW1) 57786baecfSMauro Carvalho Chehab 58786baecfSMauro Carvalho Chehab struct req_t { 59786baecfSMauro Carvalho Chehab u8 cmd; /* [0] */ 60786baecfSMauro Carvalho Chehab /* seq */ /* [1] */ 61786baecfSMauro Carvalho Chehab u8 i2c_addr; /* [2] */ 62786baecfSMauro Carvalho Chehab u16 addr; /* [3|4] */ 63786baecfSMauro Carvalho Chehab u8 mbox; /* [5] */ 64786baecfSMauro Carvalho Chehab u8 addr_len; /* [6] */ 65786baecfSMauro Carvalho Chehab u8 data_len; /* [7] */ 66786baecfSMauro Carvalho Chehab u8 *data; 67786baecfSMauro Carvalho Chehab }; 68786baecfSMauro Carvalho Chehab 69786baecfSMauro Carvalho Chehab enum af9015_cmd { 70786baecfSMauro Carvalho Chehab GET_CONFIG = 0x10, 71786baecfSMauro Carvalho Chehab DOWNLOAD_FIRMWARE = 0x11, 72786baecfSMauro Carvalho Chehab BOOT = 0x13, 73786baecfSMauro Carvalho Chehab READ_MEMORY = 0x20, 74786baecfSMauro Carvalho Chehab WRITE_MEMORY = 0x21, 75786baecfSMauro Carvalho Chehab READ_WRITE_I2C = 0x22, 76786baecfSMauro Carvalho Chehab COPY_FIRMWARE = 0x23, 77786baecfSMauro Carvalho Chehab RECONNECT_USB = 0x5a, 78786baecfSMauro Carvalho Chehab WRITE_VIRTUAL_MEMORY = 0x26, 79786baecfSMauro Carvalho Chehab GET_IR_CODE = 0x27, 80786baecfSMauro Carvalho Chehab READ_I2C, 81786baecfSMauro Carvalho Chehab WRITE_I2C, 82786baecfSMauro Carvalho Chehab }; 83786baecfSMauro Carvalho Chehab 84786baecfSMauro Carvalho Chehab enum af9015_ir_mode { 85786baecfSMauro Carvalho Chehab AF9015_IR_MODE_DISABLED = 0, 86786baecfSMauro Carvalho Chehab AF9015_IR_MODE_HID, 87786baecfSMauro Carvalho Chehab AF9015_IR_MODE_RLC, 88786baecfSMauro Carvalho Chehab AF9015_IR_MODE_RC6, 89786baecfSMauro Carvalho Chehab AF9015_IR_MODE_POLLING, /* just guess */ 90786baecfSMauro Carvalho Chehab }; 91786baecfSMauro Carvalho Chehab 92aff8c2d4SAntti Palosaari #define BUF_LEN 63 93786baecfSMauro Carvalho Chehab struct af9015_state { 948b79c7abSAntti Palosaari struct regmap *regmap; 95aff8c2d4SAntti Palosaari u8 buf[BUF_LEN]; /* bulk USB control message */ 96786baecfSMauro Carvalho Chehab u8 ir_mode; 97786baecfSMauro Carvalho Chehab u8 rc_repeat; 98786baecfSMauro Carvalho Chehab u32 rc_keycode; 99786baecfSMauro Carvalho Chehab u8 rc_last[4]; 100786baecfSMauro Carvalho Chehab bool rc_failed; 101786baecfSMauro Carvalho Chehab u8 dual_mode; 102786baecfSMauro Carvalho Chehab u8 seq; /* packet sequence number */ 103786baecfSMauro Carvalho Chehab u16 mt2060_if1[2]; 104786baecfSMauro Carvalho Chehab u16 firmware_size; 105786baecfSMauro Carvalho Chehab u16 firmware_checksum; 106786baecfSMauro Carvalho Chehab u32 eeprom_sum; 10704c611e3SAntti Palosaari struct af9013_platform_data af9013_pdata[2]; 10804c611e3SAntti Palosaari struct i2c_client *demod_i2c_client[2]; 10904c611e3SAntti Palosaari u8 af9013_i2c_addr[2]; 1107772e380SAntti Palosaari bool usb_ts_if_configured[2]; 111786baecfSMauro Carvalho Chehab 112786baecfSMauro Carvalho Chehab /* for demod callback override */ 113786baecfSMauro Carvalho Chehab int (*set_frontend[2]) (struct dvb_frontend *fe); 1140df289a2SMauro Carvalho Chehab int (*read_status[2]) (struct dvb_frontend *fe, enum fe_status *status); 115786baecfSMauro Carvalho Chehab int (*init[2]) (struct dvb_frontend *fe); 116786baecfSMauro Carvalho Chehab int (*sleep[2]) (struct dvb_frontend *fe); 117786baecfSMauro Carvalho Chehab int (*tuner_init[2]) (struct dvb_frontend *fe); 118786baecfSMauro Carvalho Chehab int (*tuner_sleep[2]) (struct dvb_frontend *fe); 119786baecfSMauro Carvalho Chehab struct mutex fe_mutex; 120786baecfSMauro Carvalho Chehab }; 121786baecfSMauro Carvalho Chehab 122786baecfSMauro Carvalho Chehab enum af9015_remote { 123786baecfSMauro Carvalho Chehab AF9015_REMOTE_NONE = 0, 124786baecfSMauro Carvalho Chehab /* 1 */ AF9015_REMOTE_A_LINK_DTU_M, 125786baecfSMauro Carvalho Chehab AF9015_REMOTE_MSI_DIGIVOX_MINI_II_V3, 126786baecfSMauro Carvalho Chehab AF9015_REMOTE_MYGICTV_U718, 127786baecfSMauro Carvalho Chehab AF9015_REMOTE_DIGITTRADE_DVB_T, 128786baecfSMauro Carvalho Chehab /* 5 */ AF9015_REMOTE_AVERMEDIA_KS, 129786baecfSMauro Carvalho Chehab }; 130786baecfSMauro Carvalho Chehab 131786baecfSMauro Carvalho Chehab #endif 132