Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[media] it913x [VER 1.07] Support for single ITE 9135 devices

Support for single ITE 9135 device.

Only single devices have been tested. Dual ITE 9135 devices
should work, but have not been tested.

TODOs
support for ver 2 chip
config for other tuner types.
rework of firmware file.

Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>

authored by

Malcolm Priestley and committed by
Mauro Carvalho Chehab
bc54919f efabaaf3

+82 -29
+2
drivers/media/dvb/dvb-usb/dvb-usb-ids.h
··· 37 37 #define USB_VID_HAUPPAUGE 0x2040 38 38 #define USB_VID_HYPER_PALTEK 0x1025 39 39 #define USB_VID_INTEL 0x8086 40 + #define USB_VID_ITETECH 0x048d 40 41 #define USB_VID_KWORLD 0xeb2a 41 42 #define USB_VID_KWORLD_2 0x1b80 42 43 #define USB_VID_KYE 0x0458 ··· 127 126 #define USB_PID_GRANDTEC_DVBT_USB_COLD 0x0fa0 128 127 #define USB_PID_GRANDTEC_DVBT_USB_WARM 0x0fa1 129 128 #define USB_PID_INTEL_CE9500 0x9500 129 + #define USB_PID_ITETECH_IT9135 0x9135 130 130 #define USB_PID_KWORLD_399U 0xe399 131 131 #define USB_PID_KWORLD_399U_2 0xe400 132 132 #define USB_PID_KWORLD_395U 0xe396
+80 -29
drivers/media/dvb/dvb-usb/it913x.c
··· 60 60 u8 id; 61 61 }; 62 62 63 + struct ite_config { 64 + u8 chip_ver; 65 + u16 chip_type; 66 + u32 firmware; 67 + u8 tuner_id_0; 68 + u8 tuner_id_1; 69 + u8 dual_mode; 70 + }; 71 + 72 + struct ite_config it913x_config; 73 + 63 74 static int it913x_bulk_write(struct usb_device *dev, 64 75 u8 *snd, int len, u8 pipe) 65 76 { ··· 202 191 static u32 it913x_query(struct usb_device *udev, u8 pro) 203 192 { 204 193 int ret; 205 - u32 res = 0; 206 194 u8 data[4]; 207 195 ret = it913x_io(udev, READ_LONG, pro, CMD_DEMOD_READ, 208 - 0x1222, 0, &data[0], 1); 209 - if (data[0] == 0x1) { 210 - ret = it913x_io(udev, READ_SHORT, pro, 211 - CMD_QUERYINFO, 0, 0x1, &data[0], 4); 212 - res = (data[0] << 24) + (data[1] << 16) + 213 - (data[2] << 8) + data[3]; 214 - } 196 + 0x1222, 0, &data[0], 3); 215 197 216 - return (ret < 0) ? 0 : res; 198 + it913x_config.chip_ver = data[0]; 199 + it913x_config.chip_type = (u16)(data[2] << 8) + data[1]; 200 + 201 + info("Chip Version=%02x Chip Type=%04x", it913x_config.chip_ver, 202 + it913x_config.chip_type); 203 + 204 + ret |= it913x_io(udev, READ_SHORT, pro, 205 + CMD_QUERYINFO, 0, 0x1, &data[0], 4); 206 + 207 + it913x_config.firmware = (data[0] << 24) + (data[1] << 16) + 208 + (data[2] << 8) + data[3]; 209 + 210 + return (ret < 0) ? 0 : it913x_config.firmware; 217 211 } 218 212 219 213 static int it913x_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff) ··· 352 336 int *cold) 353 337 { 354 338 int ret = 0, firm_no; 355 - u8 reg, adap, ep, tun0, tun1; 339 + u8 reg, remote; 356 340 357 341 firm_no = it913x_return_status(udev); 358 342 359 - ep = it913x_read_reg(udev, 0x49ac); 360 - adap = it913x_read_reg(udev, 0x49c5); 361 - tun0 = it913x_read_reg(udev, 0x49d0); 362 - info("No. Adapters=%x Endpoints=%x Tuner Type=%x", adap, ep, tun0); 343 + /* checnk for dual mode */ 344 + it913x_config.dual_mode = it913x_read_reg(udev, 0x49c5); 345 + 346 + /* TODO different remotes */ 347 + remote = it913x_read_reg(udev, 0x49ac); /* Remote */ 348 + if (remote == 0) 349 + props->rc.core.rc_codes = NULL; 350 + 351 + /* TODO at the moment tuner_id is always assigned to 0x38 */ 352 + it913x_config.tuner_id_0 = it913x_read_reg(udev, 0x49d0); 353 + 354 + info("Dual mode=%x Remote=%x Tuner Type=%x", it913x_config.dual_mode 355 + , remote, it913x_config.tuner_id_0); 363 356 364 357 if (firm_no > 0) { 365 358 *cold = 0; 366 359 return 0; 367 360 } 368 361 369 - if (adap > 2) { 370 - tun1 = it913x_read_reg(udev, 0x49e0); 362 + if (it913x_config.dual_mode) { 363 + it913x_config.tuner_id_1 = it913x_read_reg(udev, 0x49e0); 371 364 ret = it913x_wr_reg(udev, DEV_0, GPIOH1_EN, 0x1); 372 365 ret |= it913x_wr_reg(udev, DEV_0, GPIOH1_ON, 0x1); 373 366 ret |= it913x_wr_reg(udev, DEV_0, GPIOH1_O, 0x1); 374 - msleep(50); /* Delay noticed reset cycle ? */ 367 + msleep(50); 375 368 ret |= it913x_wr_reg(udev, DEV_0, GPIOH1_O, 0x0); 376 369 msleep(50); 377 370 reg = it913x_read_reg(udev, GPIOH1_O); ··· 391 366 ret = it913x_wr_reg(udev, DEV_0, 392 367 GPIOH1_O, 0x0); 393 368 } 369 + props->num_adapters = 2; 394 370 } else 395 371 props->num_adapters = 1; 396 372 397 373 reg = it913x_read_reg(udev, IO_MUX_POWER_CLK); 398 374 399 - ret |= it913x_wr_reg(udev, DEV_0, 0x4bfb, CHIP2_I2C_ADDR); 400 - 401 - ret |= it913x_wr_reg(udev, DEV_0, CLK_O_EN, 0x1); 375 + if (it913x_config.dual_mode) { 376 + ret |= it913x_wr_reg(udev, DEV_0, 0x4bfb, CHIP2_I2C_ADDR); 377 + ret |= it913x_wr_reg(udev, DEV_0, CLK_O_EN, 0x1); 378 + } else { 379 + ret |= it913x_wr_reg(udev, DEV_0, 0x4bfb, 0x0); 380 + ret |= it913x_wr_reg(udev, DEV_0, CLK_O_EN, 0x0); 381 + } 402 382 403 383 *cold = 1; 404 384 ··· 433 403 const struct firmware *fw) 434 404 { 435 405 int ret = 0, i; 436 - u8 packet_size, dlen, tun1; 406 + u8 packet_size, dlen; 437 407 u8 *fw_data; 438 408 439 409 packet_size = 0x29; 440 - 441 - tun1 = it913x_read_reg(udev, 0x49e0); 442 410 443 411 ret = it913x_wr_reg(udev, DEV_0, I2C_CLK, I2C_CLK_100); 444 412 ··· 472 444 ret |= it913x_wr_reg(udev, DEV_0, I2C_CLK, I2C_CLK_400); 473 445 474 446 /* Tuner function */ 475 - ret |= it913x_wr_reg(udev, DEV_0_DMOD , 0xec4c, 0xa0); 447 + if (it913x_config.dual_mode) 448 + ret |= it913x_wr_reg(udev, DEV_0_DMOD , 0xec4c, 0xa0); 476 449 477 450 ret |= it913x_wr_reg(udev, DEV_0, PADODPU, 0x0); 478 451 ret |= it913x_wr_reg(udev, DEV_0, AGC_O_D, 0x0); 479 - if (tun1 > 0) { 452 + if (it913x_config.dual_mode) { 480 453 ret |= it913x_wr_reg(udev, DEV_1, PADODPU, 0x0); 481 454 ret |= it913x_wr_reg(udev, DEV_1, AGC_O_D, 0x0); 482 455 } ··· 504 475 u8 adf = it913x_read_reg(udev, IO_MUX_POWER_CLK); 505 476 u8 adap_addr = I2C_BASE_ADDR + (adap->id << 5); 506 477 u16 ep_size = adap->props.fe[0].stream.u.bulk.buffersize; 478 + u8 tuner_id, tuner_type; 479 + 480 + if (adap->id == 0) 481 + tuner_id = it913x_config.tuner_id_0; 482 + else 483 + tuner_id = it913x_config.tuner_id_1; 484 + 485 + /* TODO we always use IT9137 possible references here*/ 486 + /* Documentation suggests don't care */ 487 + switch (tuner_id) { 488 + case 0x51: 489 + case 0x52: 490 + case 0x60: 491 + case 0x61: 492 + case 0x62: 493 + default: 494 + case 0x38: 495 + tuner_type = IT9137; 496 + } 507 497 508 498 adap->fe_adap[0].fe = dvb_attach(it913x_fe_attach, 509 - &adap->dev->i2c_adap, adap_addr, adf, IT9137); 499 + &adap->dev->i2c_adap, adap_addr, adf, tuner_type); 510 500 511 501 if (adap->id == 0 && adap->fe_adap[0].fe) { 512 502 ret = it913x_wr_reg(udev, DEV_0_DMOD, MP2_SW_RST, 0x1); ··· 581 533 582 534 static struct usb_device_id it913x_table[] = { 583 535 { USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_UB499_2T_T09) }, 536 + { USB_DEVICE(USB_VID_ITETECH, USB_PID_ITETECH_IT9135) }, 584 537 {} /* Terminating entry */ 585 538 }; 586 539 ··· 657 608 .rc_codes = RC_MAP_KWORLD_315U, 658 609 }, 659 610 .i2c_algo = &it913x_i2c_algo, 660 - .num_device_descs = 1, 611 + .num_device_descs = 2, 661 612 .devices = { 662 613 { "Kworld UB499-2T T09(IT9137)", 663 614 { &it913x_table[0], NULL }, 664 615 }, 665 - 616 + { "ITE 9135 Generic", 617 + { &it913x_table[1], NULL }, 618 + }, 666 619 } 667 620 }; 668 621 ··· 698 647 699 648 MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>"); 700 649 MODULE_DESCRIPTION("it913x USB 2 Driver"); 701 - MODULE_VERSION("1.06"); 650 + MODULE_VERSION("1.07"); 702 651 MODULE_LICENSE("GPL");