diff mbox series

[V3,2/2] Add support for the Avermedia TD310

Message ID A23F77AB-9546-4D74-8B1D-7360221CA6CF@telefonica.net (mailing list archive)
State New, archived
Headers show
Series [V3,1/2] init i2c already in it930x_frontend_attach | expand

Commit Message

Jose Alberto Reguero March 5, 2019, 6:37 p.m. UTC
This patch add support for Avermedia TD310 usb stick. 

V3 add a table for the i2c addresses an other needed options.


Signed-off-by: Jose Alberto Reguero <jose.alberto.reguero@gmail.com>

Comments

Jose Alberto Reguero March 7, 2019, 10:51 p.m. UTC | #1
El 7 de marzo de 2019 23:38:47 CET, kbuild test robot <lkp@intel.com> escribió:
>Hi Jose,
>
>Thank you for the patch! Yet something to improve:
>
>[auto build test ERROR on linuxtv-media/master]
>[also build test ERROR on v5.0 next-20190306]
>[if your patch is applied to the wrong git tree, please drop us a note
>to help improve the system]
>
>url:   
>https://github.com/0day-ci/linux/commits/Jose-Alberto-Reguero/init-i2c-already-in-it930x_frontend_attach/20190308-055354
>base:   git://linuxtv.org/media_tree.git master
>config: nds32-allyesconfig (attached as .config)
>compiler: nds32le-linux-gcc (GCC) 6.4.0
>reproduce:
>wget
>https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross
>-O ~/bin/make.cross
>        chmod +x ~/bin/make.cross
>        # save the attached .config to linux build tree
>        GCC_VERSION=6.4.0 make.cross ARCH=nds32 
>
>All errors (new ones prefixed by >>):
>
>drivers/media/usb/dvb-usb-v2/af9035.c: In function
>'af9035_read_config':
>>> drivers/media/usb/dvb-usb-v2/af9035.c:877:54: error:
>'USB_PID_AVERMEDIA_TD310' undeclared (first use in this function)
>(le16_to_cpu(d->udev->descriptor.idProduct) ==
>USB_PID_AVERMEDIA_TD310)) {
>                                                ^~~~~~~~~~~~~~~~~~~~~~~

I missed a part of the patch. I resend the series.

Jose Alberto

>drivers/media/usb/dvb-usb-v2/af9035.c:877:54: note: each undeclared
>identifier is reported only once for each function it appears in
>   In file included from drivers/media/usb/dvb-usb-v2/af9035.h:26:0,
>                    from drivers/media/usb/dvb-usb-v2/af9035.c:22:
>   drivers/media/usb/dvb-usb-v2/af9035.c: At top level:
>>> drivers/media/usb/dvb-usb-v2/af9035.c:2137:38: error:
>'USB_PID_AVERMEDIA_TD310' undeclared here (not in a function)
>     { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_TD310,
>                                         ^
>drivers/media/usb/dvb-usb-v2/dvb_usb.h:105:16: note: in definition of
>macro 'DVB_USB_DEVICE'
>     .idProduct = (prod), \
>                   ^~~~
>
>vim +/USB_PID_AVERMEDIA_TD310 +877
>drivers/media/usb/dvb-usb-v2/af9035.c
>
>   833	
>   834	static int af9035_read_config(struct dvb_usb_device *d)
>   835	{
>   836		struct usb_interface *intf = d->intf;
>   837		struct state *state = d_to_priv(d);
>   838		int ret, i;
>   839		u8 tmp;
>   840		u16 tmp16;
>   841	
>   842		/* Demod I2C address */
>   843		state->af9033_i2c_addr[0] = 0x1c;
>   844		state->af9033_i2c_addr[1] = 0x1d;
>845		state->af9033_config[0].adc_multiplier = AF9033_ADC_MULTIPLIER_2X;
>846		state->af9033_config[1].adc_multiplier = AF9033_ADC_MULTIPLIER_2X;
>   847		state->af9033_config[0].ts_mode = AF9033_TS_MODE_USB;
>   848		state->af9033_config[1].ts_mode = AF9033_TS_MODE_SERIAL;
>   849		state->it930x_addresses = 0;
>   850	
>   851		if (state->chip_type == 0x9135) {
>   852			/* feed clock for integrated RF tuner */
>   853			state->af9033_config[0].dyn0_clk = true;
>   854			state->af9033_config[1].dyn0_clk = true;
>   855	
>   856			if (state->chip_version == 0x02) {
>   857				state->af9033_config[0].tuner = AF9033_TUNER_IT9135_60;
>   858				state->af9033_config[1].tuner = AF9033_TUNER_IT9135_60;
>   859			} else {
>   860				state->af9033_config[0].tuner = AF9033_TUNER_IT9135_38;
>   861				state->af9033_config[1].tuner = AF9033_TUNER_IT9135_38;
>   862			}
>   863	
>   864			if (state->no_eeprom) {
>   865				/* Remote controller to NEC polling by default */
>   866				state->ir_mode = 0x05;
>   867				state->ir_type = 0x00;
>   868	
>   869				goto skip_eeprom;
>   870			}
>   871		} else if (state->chip_type == 0x9306) {
>   872			/*
>   873			 * IT930x is an USB bridge, only single demod-single tuner
>   874			 * configurations seen so far.
>   875			 */
>876			if ((le16_to_cpu(d->udev->descriptor.idVendor) ==
>USB_VID_AVERMEDIA) &&
>> 877			    (le16_to_cpu(d->udev->descriptor.idProduct) ==
>USB_PID_AVERMEDIA_TD310)) {
>   878				state->it930x_addresses = 1;
>   879			}
>   880			return 0;
>   881		}
>   882	
>   883		/* Remote controller */
>   884		state->ir_mode = state->eeprom[EEPROM_IR_MODE];
>   885		state->ir_type = state->eeprom[EEPROM_IR_TYPE];
>   886	
>   887		if (state->dual_mode) {
>   888			/* Read 2nd demodulator I2C address. 8-bit format on eeprom */
>   889			tmp = state->eeprom[EEPROM_2ND_DEMOD_ADDR];
>   890			if (tmp)
>   891				state->af9033_i2c_addr[1] = tmp >> 1;
>   892	
>   893			dev_dbg(&intf->dev, "2nd demod I2C addr=%02x\n",
>   894				state->af9033_i2c_addr[1]);
>   895		}
>   896	
>   897		for (i = 0; i < state->dual_mode + 1; i++) {
>   898			unsigned int eeprom_offset = 0;
>   899	
>   900			/* tuner */
>   901			tmp = state->eeprom[EEPROM_1_TUNER_ID + eeprom_offset];
>   902			dev_dbg(&intf->dev, "[%d]tuner=%02x\n", i, tmp);
>   903	
>   904			/* tuner sanity check */
>   905			if (state->chip_type == 0x9135) {
>   906				if (state->chip_version == 0x02) {
>   907					/* IT9135 BX (v2) */
>   908					switch (tmp) {
>   909					case AF9033_TUNER_IT9135_60:
>   910					case AF9033_TUNER_IT9135_61:
>   911					case AF9033_TUNER_IT9135_62:
>   912						state->af9033_config[i].tuner = tmp;
>   913						break;
>   914					}
>   915				} else {
>   916					/* IT9135 AX (v1) */
>   917					switch (tmp) {
>   918					case AF9033_TUNER_IT9135_38:
>   919					case AF9033_TUNER_IT9135_51:
>   920					case AF9033_TUNER_IT9135_52:
>   921						state->af9033_config[i].tuner = tmp;
>   922						break;
>   923					}
>   924				}
>   925			} else {
>   926				/* AF9035 */
>   927				state->af9033_config[i].tuner = tmp;
>   928			}
>   929	
>   930			if (state->af9033_config[i].tuner != tmp) {
>931				dev_info(&intf->dev, "[%d] overriding tuner from %02x to
>%02x\n",
>   932					 i, tmp, state->af9033_config[i].tuner);
>   933			}
>   934	
>   935			switch (state->af9033_config[i].tuner) {
>   936			case AF9033_TUNER_TUA9001:
>   937			case AF9033_TUNER_FC0011:
>   938			case AF9033_TUNER_MXL5007T:
>   939			case AF9033_TUNER_TDA18218:
>   940			case AF9033_TUNER_FC2580:
>   941			case AF9033_TUNER_FC0012:
>   942				state->af9033_config[i].spec_inv = 1;
>   943				break;
>   944			case AF9033_TUNER_IT9135_38:
>   945			case AF9033_TUNER_IT9135_51:
>   946			case AF9033_TUNER_IT9135_52:
>   947			case AF9033_TUNER_IT9135_60:
>   948			case AF9033_TUNER_IT9135_61:
>   949			case AF9033_TUNER_IT9135_62:
>   950				break;
>   951			default:
>952				dev_warn(&intf->dev, "tuner id=%02x not supported, please
>report!",
>   953					 tmp);
>   954			}
>   955	
>   956			/* disable dual mode if driver does not support it */
>   957			if (i == 1)
>   958				switch (state->af9033_config[i].tuner) {
>   959				case AF9033_TUNER_FC0012:
>   960				case AF9033_TUNER_IT9135_38:
>   961				case AF9033_TUNER_IT9135_51:
>   962				case AF9033_TUNER_IT9135_52:
>   963				case AF9033_TUNER_IT9135_60:
>   964				case AF9033_TUNER_IT9135_61:
>   965				case AF9033_TUNER_IT9135_62:
>   966				case AF9033_TUNER_MXL5007T:
>   967					break;
>   968				default:
>   969					state->dual_mode = false;
>970					dev_info(&intf->dev, "driver does not support 2nd tuner and
>will disable it");
>   971			}
>   972	
>   973			/* tuner IF frequency */
>   974			tmp = state->eeprom[EEPROM_1_IF_L + eeprom_offset];
>   975			tmp16 = tmp << 0;
>   976			tmp = state->eeprom[EEPROM_1_IF_H + eeprom_offset];
>   977			tmp16 |= tmp << 8;
>   978			dev_dbg(&intf->dev, "[%d]IF=%d\n", i, tmp16);
>   979	
>   980			eeprom_offset += 0x10; /* shift for the 2nd tuner params */
>   981		}
>   982	
>   983	skip_eeprom:
>   984		/* get demod clock */
>   985		ret = af9035_rd_reg(d, 0x00d800, &tmp);
>   986		if (ret < 0)
>   987			goto err;
>   988	
>   989		tmp = (tmp >> 0) & 0x0f;
>   990	
>   991		for (i = 0; i < ARRAY_SIZE(state->af9033_config); i++) {
>   992			if (state->chip_type == 0x9135)
>   993				state->af9033_config[i].clock = clock_lut_it9135[tmp];
>   994			else
>   995				state->af9033_config[i].clock = clock_lut_af9035[tmp];
>   996		}
>   997	
>   998		state->no_read = false;
>999		/* Some MXL5007T devices cannot properly handle tuner I2C read
>ops. */
>  1000		if (state->af9033_config[0].tuner == AF9033_TUNER_MXL5007T &&
> 1001			le16_to_cpu(d->udev->descriptor.idVendor) == USB_VID_AVERMEDIA)
>  1002	
>  1003			switch (le16_to_cpu(d->udev->descriptor.idProduct)) {
>  1004			case USB_PID_AVERMEDIA_A867:
>  1005			case USB_PID_AVERMEDIA_TWINSTAR:
>  1006				dev_info(&intf->dev,
>1007					 "Device may have issues with I2C read operations. Enabling
>fix.\n");
>  1008				state->no_read = true;
>  1009				break;
>  1010			}
>  1011	
>  1012		return 0;
>  1013	
>  1014	err:
>  1015		dev_dbg(&intf->dev, "failed=%d\n", ret);
>  1016	
>  1017		return ret;
>  1018	}
>  1019	
>
>---
>0-DAY kernel test infrastructure                Open Source Technology
>Center
>https://lists.01.org/pipermail/kbuild-all                   Intel
>Corporation
kernel test robot March 7, 2019, 11:04 p.m. UTC | #2
Hi Jose,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on linuxtv-media/master]
[also build test ERROR on v5.0 next-20190306]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Jose-Alberto-Reguero/init-i2c-already-in-it930x_frontend_attach/20190308-055354
base:   git://linuxtv.org/media_tree.git master
config: xtensa-allyesconfig (attached as .config)
compiler: xtensa-linux-gcc (GCC) 8.2.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        GCC_VERSION=8.2.0 make.cross ARCH=xtensa 

All errors (new ones prefixed by >>):

   drivers/media/usb/dvb-usb-v2/af9035.c: In function 'af9035_read_config':
>> drivers/media/usb/dvb-usb-v2/af9035.c:877:54: error: 'USB_PID_AVERMEDIA_TD310' undeclared (first use in this function); did you mean 'USB_PID_AVERMEDIA_TD110'?
          (le16_to_cpu(d->udev->descriptor.idProduct) == USB_PID_AVERMEDIA_TD310)) {
                                                         ^~~~~~~~~~~~~~~~~~~~~~~
                                                         USB_PID_AVERMEDIA_TD110
   drivers/media/usb/dvb-usb-v2/af9035.c:877:54: note: each undeclared identifier is reported only once for each function it appears in
   In file included from drivers/media/usb/dvb-usb-v2/af9035.h:26,
                    from drivers/media/usb/dvb-usb-v2/af9035.c:22:
   drivers/media/usb/dvb-usb-v2/af9035.c: At top level:
>> drivers/media/usb/dvb-usb-v2/af9035.c:2137:38: error: 'USB_PID_AVERMEDIA_TD310' undeclared here (not in a function); did you mean 'USB_PID_AVERMEDIA_TD110'?
     { DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_TD310,
                                         ^~~~~~~~~~~~~~~~~~~~~~~
   drivers/media/usb/dvb-usb-v2/dvb_usb.h:105:16: note: in definition of macro 'DVB_USB_DEVICE'
     .idProduct = (prod), \
                   ^~~~

vim +877 drivers/media/usb/dvb-usb-v2/af9035.c

   833	
   834	static int af9035_read_config(struct dvb_usb_device *d)
   835	{
   836		struct usb_interface *intf = d->intf;
   837		struct state *state = d_to_priv(d);
   838		int ret, i;
   839		u8 tmp;
   840		u16 tmp16;
   841	
   842		/* Demod I2C address */
   843		state->af9033_i2c_addr[0] = 0x1c;
   844		state->af9033_i2c_addr[1] = 0x1d;
   845		state->af9033_config[0].adc_multiplier = AF9033_ADC_MULTIPLIER_2X;
   846		state->af9033_config[1].adc_multiplier = AF9033_ADC_MULTIPLIER_2X;
   847		state->af9033_config[0].ts_mode = AF9033_TS_MODE_USB;
   848		state->af9033_config[1].ts_mode = AF9033_TS_MODE_SERIAL;
   849		state->it930x_addresses = 0;
   850	
   851		if (state->chip_type == 0x9135) {
   852			/* feed clock for integrated RF tuner */
   853			state->af9033_config[0].dyn0_clk = true;
   854			state->af9033_config[1].dyn0_clk = true;
   855	
   856			if (state->chip_version == 0x02) {
   857				state->af9033_config[0].tuner = AF9033_TUNER_IT9135_60;
   858				state->af9033_config[1].tuner = AF9033_TUNER_IT9135_60;
   859			} else {
   860				state->af9033_config[0].tuner = AF9033_TUNER_IT9135_38;
   861				state->af9033_config[1].tuner = AF9033_TUNER_IT9135_38;
   862			}
   863	
   864			if (state->no_eeprom) {
   865				/* Remote controller to NEC polling by default */
   866				state->ir_mode = 0x05;
   867				state->ir_type = 0x00;
   868	
   869				goto skip_eeprom;
   870			}
   871		} else if (state->chip_type == 0x9306) {
   872			/*
   873			 * IT930x is an USB bridge, only single demod-single tuner
   874			 * configurations seen so far.
   875			 */
   876			if ((le16_to_cpu(d->udev->descriptor.idVendor) == USB_VID_AVERMEDIA) &&
 > 877			    (le16_to_cpu(d->udev->descriptor.idProduct) == USB_PID_AVERMEDIA_TD310)) {
   878				state->it930x_addresses = 1;
   879			}
   880			return 0;
   881		}
   882	
   883		/* Remote controller */
   884		state->ir_mode = state->eeprom[EEPROM_IR_MODE];
   885		state->ir_type = state->eeprom[EEPROM_IR_TYPE];
   886	
   887		if (state->dual_mode) {
   888			/* Read 2nd demodulator I2C address. 8-bit format on eeprom */
   889			tmp = state->eeprom[EEPROM_2ND_DEMOD_ADDR];
   890			if (tmp)
   891				state->af9033_i2c_addr[1] = tmp >> 1;
   892	
   893			dev_dbg(&intf->dev, "2nd demod I2C addr=%02x\n",
   894				state->af9033_i2c_addr[1]);
   895		}
   896	
   897		for (i = 0; i < state->dual_mode + 1; i++) {
   898			unsigned int eeprom_offset = 0;
   899	
   900			/* tuner */
   901			tmp = state->eeprom[EEPROM_1_TUNER_ID + eeprom_offset];
   902			dev_dbg(&intf->dev, "[%d]tuner=%02x\n", i, tmp);
   903	
   904			/* tuner sanity check */
   905			if (state->chip_type == 0x9135) {
   906				if (state->chip_version == 0x02) {
   907					/* IT9135 BX (v2) */
   908					switch (tmp) {
   909					case AF9033_TUNER_IT9135_60:
   910					case AF9033_TUNER_IT9135_61:
   911					case AF9033_TUNER_IT9135_62:
   912						state->af9033_config[i].tuner = tmp;
   913						break;
   914					}
   915				} else {
   916					/* IT9135 AX (v1) */
   917					switch (tmp) {
   918					case AF9033_TUNER_IT9135_38:
   919					case AF9033_TUNER_IT9135_51:
   920					case AF9033_TUNER_IT9135_52:
   921						state->af9033_config[i].tuner = tmp;
   922						break;
   923					}
   924				}
   925			} else {
   926				/* AF9035 */
   927				state->af9033_config[i].tuner = tmp;
   928			}
   929	
   930			if (state->af9033_config[i].tuner != tmp) {
   931				dev_info(&intf->dev, "[%d] overriding tuner from %02x to %02x\n",
   932					 i, tmp, state->af9033_config[i].tuner);
   933			}
   934	
   935			switch (state->af9033_config[i].tuner) {
   936			case AF9033_TUNER_TUA9001:
   937			case AF9033_TUNER_FC0011:
   938			case AF9033_TUNER_MXL5007T:
   939			case AF9033_TUNER_TDA18218:
   940			case AF9033_TUNER_FC2580:
   941			case AF9033_TUNER_FC0012:
   942				state->af9033_config[i].spec_inv = 1;
   943				break;
   944			case AF9033_TUNER_IT9135_38:
   945			case AF9033_TUNER_IT9135_51:
   946			case AF9033_TUNER_IT9135_52:
   947			case AF9033_TUNER_IT9135_60:
   948			case AF9033_TUNER_IT9135_61:
   949			case AF9033_TUNER_IT9135_62:
   950				break;
   951			default:
   952				dev_warn(&intf->dev, "tuner id=%02x not supported, please report!",
   953					 tmp);
   954			}
   955	
   956			/* disable dual mode if driver does not support it */
   957			if (i == 1)
   958				switch (state->af9033_config[i].tuner) {
   959				case AF9033_TUNER_FC0012:
   960				case AF9033_TUNER_IT9135_38:
   961				case AF9033_TUNER_IT9135_51:
   962				case AF9033_TUNER_IT9135_52:
   963				case AF9033_TUNER_IT9135_60:
   964				case AF9033_TUNER_IT9135_61:
   965				case AF9033_TUNER_IT9135_62:
   966				case AF9033_TUNER_MXL5007T:
   967					break;
   968				default:
   969					state->dual_mode = false;
   970					dev_info(&intf->dev, "driver does not support 2nd tuner and will disable it");
   971			}
   972	
   973			/* tuner IF frequency */
   974			tmp = state->eeprom[EEPROM_1_IF_L + eeprom_offset];
   975			tmp16 = tmp << 0;
   976			tmp = state->eeprom[EEPROM_1_IF_H + eeprom_offset];
   977			tmp16 |= tmp << 8;
   978			dev_dbg(&intf->dev, "[%d]IF=%d\n", i, tmp16);
   979	
   980			eeprom_offset += 0x10; /* shift for the 2nd tuner params */
   981		}
   982	
   983	skip_eeprom:
   984		/* get demod clock */
   985		ret = af9035_rd_reg(d, 0x00d800, &tmp);
   986		if (ret < 0)
   987			goto err;
   988	
   989		tmp = (tmp >> 0) & 0x0f;
   990	
   991		for (i = 0; i < ARRAY_SIZE(state->af9033_config); i++) {
   992			if (state->chip_type == 0x9135)
   993				state->af9033_config[i].clock = clock_lut_it9135[tmp];
   994			else
   995				state->af9033_config[i].clock = clock_lut_af9035[tmp];
   996		}
   997	
   998		state->no_read = false;
   999		/* Some MXL5007T devices cannot properly handle tuner I2C read ops. */
  1000		if (state->af9033_config[0].tuner == AF9033_TUNER_MXL5007T &&
  1001			le16_to_cpu(d->udev->descriptor.idVendor) == USB_VID_AVERMEDIA)
  1002	
  1003			switch (le16_to_cpu(d->udev->descriptor.idProduct)) {
  1004			case USB_PID_AVERMEDIA_A867:
  1005			case USB_PID_AVERMEDIA_TWINSTAR:
  1006				dev_info(&intf->dev,
  1007					 "Device may have issues with I2C read operations. Enabling fix.\n");
  1008				state->no_read = true;
  1009				break;
  1010			}
  1011	
  1012		return 0;
  1013	
  1014	err:
  1015		dev_dbg(&intf->dev, "failed=%d\n", ret);
  1016	
  1017		return ret;
  1018	}
  1019	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
diff mbox series

Patch

diff -upr linux/drivers/media/usb/dvb-usb-v2/af9035.c linux.new/drivers/media/usb/dvb-usb-v2/af9035.c
--- linux/drivers/media/usb/dvb-usb-v2/af9035.c	2019-03-05 18:44:34.936077251 +0100
+++ linux.new/drivers/media/usb/dvb-usb-v2/af9035.c	2019-03-05 18:43:31.512806221 +0100
@@ -846,6 +846,7 @@  static int af9035_read_config(struct dvb
 	state->af9033_config[1].adc_multiplier = AF9033_ADC_MULTIPLIER_2X;
 	state->af9033_config[0].ts_mode = AF9033_TS_MODE_USB;
 	state->af9033_config[1].ts_mode = AF9033_TS_MODE_SERIAL;
+	state->it930x_addresses = 0;
 
 	if (state->chip_type == 0x9135) {
 		/* feed clock for integrated RF tuner */
@@ -872,6 +873,10 @@  static int af9035_read_config(struct dvb
 		 * IT930x is an USB bridge, only single demod-single tuner
 		 * configurations seen so far.
 		 */
+		if ((le16_to_cpu(d->udev->descriptor.idVendor) == USB_VID_AVERMEDIA) &&
+		    (le16_to_cpu(d->udev->descriptor.idProduct) == USB_PID_AVERMEDIA_TD310)) {
+			state->it930x_addresses = 1;
+		}
 		return 0;
 	}
 
@@ -1267,8 +1272,9 @@  static int it930x_frontend_attach(struct
 
 	state->af9033_config[adap->id].fe = &adap->fe[0];
 	state->af9033_config[adap->id].ops = &state->ops;
-	ret = af9035_add_i2c_dev(d, "si2168", 0x67, &si2168_config,
-				&d->i2c_adap);
+	ret = af9035_add_i2c_dev(d, "si2168",
+				 it930x_addresses_table[state->it930x_addresses].frontend_i2c_addr,
+				 &si2168_config, &d->i2c_adap);
 	if (ret)
 		goto err;
 
@@ -1619,10 +1625,10 @@  static int it930x_tuner_attach(struct dv
 
 	memset(&si2157_config, 0, sizeof(si2157_config));
 	si2157_config.fe = adap->fe[0];
-	si2157_config.if_port = 1;
-	ret = af9035_add_i2c_dev(d, "si2157", 0x63,
-			&si2157_config, state->i2c_adapter_demod);
-
+	si2157_config.if_port = it930x_addresses_table[state->it930x_addresses].tuner_if_port;
+	ret = af9035_add_i2c_dev(d, "si2157",
+				 it930x_addresses_table[state->it930x_addresses].tuner_i2c_addr,
+				 &si2157_config, state->i2c_adapter_demod);
 	if (ret)
 		goto err;
 
@@ -2128,6 +2134,8 @@  static const struct usb_device_id af9035
 	/* IT930x devices */
 	{ DVB_USB_DEVICE(USB_VID_ITETECH, USB_PID_ITETECH_IT9303,
 		&it930x_props, "ITE 9303 Generic", NULL) },
+	{ DVB_USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_TD310,
+		&it930x_props, "AVerMedia TD310 DVB-T2", NULL) },
 	{ }
 };
 MODULE_DEVICE_TABLE(usb, af9035_id_table);
diff -upr linux/drivers/media/usb/dvb-usb-v2/af9035.h linux.new/drivers/media/usb/dvb-usb-v2/af9035.h
--- linux/drivers/media/usb/dvb-usb-v2/af9035.h	2017-02-01 06:41:13.000000000 +0100
+++ linux.new/drivers/media/usb/dvb-usb-v2/af9035.h	2019-03-05 18:19:31.450331996 +0100
@@ -69,6 +69,7 @@  struct state {
 	u8 dual_mode:1;
 	u8 no_read:1;
 	u8 af9033_i2c_addr[2];
+	u8 it930x_addresses;
 	struct af9033_config af9033_config[2];
 	struct af9033_ops ops;
 	#define AF9035_I2C_CLIENT_MAX 4
@@ -77,6 +78,17 @@  struct state {
 	struct platform_device *platform_device_tuner[2];
 };
 
+struct address_table {
+	u8 frontend_i2c_addr;
+	u8 tuner_i2c_addr;
+	u8 tuner_if_port;
+};
+
+static const struct address_table it930x_addresses_table[] = {
+	{ 0x67, 0x63, 1 },
+	{ 0x64, 0x60, 0 },
+};
+
 static const u32 clock_lut_af9035[] = {
 	20480000, /*      FPGA */
 	16384000, /* 16.38 MHz */