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

V4L/DVB: pt1: Support Earthsoft PT2

Support Earthsoft PT2.

Signed-off-by: HIRANO Takahito <hiranotaka@zng.info>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>

authored by

HIRANO Takahito and committed by
Mauro Carvalho Chehab
4d1f413e 2f790884

+278 -72
+211 -60
drivers/media/dvb/pt1/pt1.c
··· 1 1 /* 2 - * driver for Earthsoft PT1 2 + * driver for Earthsoft PT1/PT2 3 3 * 4 4 * Copyright (C) 2009 HIRANO Takahito <hiranotaka@zng.info> 5 5 * ··· 77 77 struct pt1_adapter *adaps[PT1_NR_ADAPS]; 78 78 struct pt1_table *tables; 79 79 struct task_struct *kthread; 80 + 81 + struct mutex lock; 82 + int power; 83 + int reset; 80 84 }; 81 85 82 86 struct pt1_adapter { ··· 99 95 struct dvb_frontend *fe; 100 96 int (*orig_set_voltage)(struct dvb_frontend *fe, 101 97 fe_sec_voltage_t voltage); 98 + int (*orig_sleep)(struct dvb_frontend *fe); 99 + int (*orig_init)(struct dvb_frontend *fe); 100 + 101 + fe_sec_voltage_t voltage; 102 + int sleep; 102 103 }; 103 104 104 105 #define pt1_printk(level, pt1, format, arg...) \ ··· 228 219 static int pt1_enable_ram(struct pt1 *pt1) 229 220 { 230 221 int i, ret; 222 + int phase; 231 223 schedule_timeout_uninterruptible((HZ + 999) / 1000); 232 - for (i = 0; i < 10; i++) { 224 + phase = pt1->pdev->device == 0x211a ? 128 : 166; 225 + for (i = 0; i < phase; i++) { 233 226 ret = pt1_do_enable_ram(pt1); 234 227 if (ret < 0) 235 228 return ret; ··· 496 485 } 497 486 498 487 static void 499 - pt1_set_power(struct pt1 *pt1, int power, int lnb, int reset) 488 + pt1_update_power(struct pt1 *pt1) 500 489 { 501 - pt1_write_reg(pt1, 1, power | lnb << 1 | !reset << 3); 490 + int bits; 491 + int i; 492 + struct pt1_adapter *adap; 493 + static const int sleep_bits[] = { 494 + 1 << 4, 495 + 1 << 6 | 1 << 7, 496 + 1 << 5, 497 + 1 << 6 | 1 << 8, 498 + }; 499 + 500 + bits = pt1->power | !pt1->reset << 3; 501 + mutex_lock(&pt1->lock); 502 + for (i = 0; i < PT1_NR_ADAPS; i++) { 503 + adap = pt1->adaps[i]; 504 + switch (adap->voltage) { 505 + case SEC_VOLTAGE_13: /* actually 11V */ 506 + bits |= 1 << 1; 507 + break; 508 + case SEC_VOLTAGE_18: /* actually 15V */ 509 + bits |= 1 << 1 | 1 << 2; 510 + break; 511 + default: 512 + break; 513 + } 514 + 515 + /* XXX: The bits should be changed depending on adap->sleep. */ 516 + bits |= sleep_bits[i]; 517 + } 518 + pt1_write_reg(pt1, 1, bits); 519 + mutex_unlock(&pt1->lock); 502 520 } 503 521 504 522 static int pt1_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage) 505 523 { 506 524 struct pt1_adapter *adap; 507 - int lnb; 508 525 509 526 adap = container_of(fe->dvb, struct pt1_adapter, adap); 510 - 511 - switch (voltage) { 512 - case SEC_VOLTAGE_13: /* actually 11V */ 513 - lnb = 2; 514 - break; 515 - case SEC_VOLTAGE_18: /* actually 15V */ 516 - lnb = 3; 517 - break; 518 - case SEC_VOLTAGE_OFF: 519 - lnb = 0; 520 - break; 521 - default: 522 - return -EINVAL; 523 - } 524 - 525 - pt1_set_power(adap->pt1, 1, lnb, 0); 527 + adap->voltage = voltage; 528 + pt1_update_power(adap->pt1); 526 529 527 530 if (adap->orig_set_voltage) 528 531 return adap->orig_set_voltage(fe, voltage); ··· 544 519 return 0; 545 520 } 546 521 522 + static int pt1_sleep(struct dvb_frontend *fe) 523 + { 524 + struct pt1_adapter *adap; 525 + 526 + adap = container_of(fe->dvb, struct pt1_adapter, adap); 527 + adap->sleep = 1; 528 + pt1_update_power(adap->pt1); 529 + 530 + if (adap->orig_sleep) 531 + return adap->orig_sleep(fe); 532 + else 533 + return 0; 534 + } 535 + 536 + static int pt1_wakeup(struct dvb_frontend *fe) 537 + { 538 + struct pt1_adapter *adap; 539 + 540 + adap = container_of(fe->dvb, struct pt1_adapter, adap); 541 + adap->sleep = 0; 542 + pt1_update_power(adap->pt1); 543 + schedule_timeout_uninterruptible((HZ + 999) / 1000); 544 + 545 + if (adap->orig_init) 546 + return adap->orig_init(fe); 547 + else 548 + return 0; 549 + } 550 + 547 551 static void pt1_free_adapter(struct pt1_adapter *adap) 548 552 { 549 - dvb_unregister_frontend(adap->fe); 550 553 dvb_net_release(&adap->net); 551 554 adap->demux.dmx.close(&adap->demux.dmx); 552 555 dvb_dmxdev_release(&adap->dmxdev); ··· 587 534 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); 588 535 589 536 static struct pt1_adapter * 590 - pt1_alloc_adapter(struct pt1 *pt1, struct dvb_frontend *fe) 537 + pt1_alloc_adapter(struct pt1 *pt1) 591 538 { 592 539 struct pt1_adapter *adap; 593 540 void *buf; ··· 604 551 605 552 adap->pt1 = pt1; 606 553 607 - adap->orig_set_voltage = fe->ops.set_voltage; 608 - fe->ops.set_voltage = pt1_set_voltage; 554 + adap->voltage = SEC_VOLTAGE_OFF; 555 + adap->sleep = 1; 609 556 610 557 buf = (u8 *)__get_free_page(GFP_KERNEL); 611 558 if (!buf) { ··· 646 593 647 594 dvb_net_init(dvb_adap, &adap->net, &demux->dmx); 648 595 649 - ret = dvb_register_frontend(dvb_adap, fe); 650 - if (ret < 0) 651 - goto err_net_release; 652 - adap->fe = fe; 653 - 654 596 return adap; 655 597 656 - err_net_release: 657 - dvb_net_release(&adap->net); 658 - adap->demux.dmx.close(&adap->demux.dmx); 659 - dvb_dmxdev_release(&adap->dmxdev); 660 598 err_dmx_release: 661 599 dvb_dmx_release(demux); 662 600 err_unregister_adapter: ··· 667 623 pt1_free_adapter(pt1->adaps[i]); 668 624 } 669 625 626 + static int pt1_init_adapters(struct pt1 *pt1) 627 + { 628 + int i; 629 + struct pt1_adapter *adap; 630 + int ret; 631 + 632 + for (i = 0; i < PT1_NR_ADAPS; i++) { 633 + adap = pt1_alloc_adapter(pt1); 634 + if (IS_ERR(adap)) { 635 + ret = PTR_ERR(adap); 636 + goto err; 637 + } 638 + 639 + adap->index = i; 640 + pt1->adaps[i] = adap; 641 + } 642 + return 0; 643 + 644 + err: 645 + while (i--) 646 + pt1_free_adapter(pt1->adaps[i]); 647 + 648 + return ret; 649 + } 650 + 651 + static void pt1_cleanup_frontend(struct pt1_adapter *adap) 652 + { 653 + dvb_unregister_frontend(adap->fe); 654 + } 655 + 656 + static int pt1_init_frontend(struct pt1_adapter *adap, struct dvb_frontend *fe) 657 + { 658 + int ret; 659 + 660 + adap->orig_set_voltage = fe->ops.set_voltage; 661 + adap->orig_sleep = fe->ops.sleep; 662 + adap->orig_init = fe->ops.init; 663 + fe->ops.set_voltage = pt1_set_voltage; 664 + fe->ops.sleep = pt1_sleep; 665 + fe->ops.init = pt1_wakeup; 666 + 667 + ret = dvb_register_frontend(&adap->adap, fe); 668 + if (ret < 0) 669 + return ret; 670 + 671 + adap->fe = fe; 672 + return 0; 673 + } 674 + 675 + static void pt1_cleanup_frontends(struct pt1 *pt1) 676 + { 677 + int i; 678 + for (i = 0; i < PT1_NR_ADAPS; i++) 679 + pt1_cleanup_frontend(pt1->adaps[i]); 680 + } 681 + 670 682 struct pt1_config { 671 683 struct va1j5jf8007s_config va1j5jf8007s_config; 672 684 struct va1j5jf8007t_config va1j5jf8007t_config; ··· 730 630 731 631 static const struct pt1_config pt1_configs[2] = { 732 632 { 733 - { .demod_address = 0x1b }, 734 - { .demod_address = 0x1a }, 633 + { 634 + .demod_address = 0x1b, 635 + .frequency = VA1J5JF8007S_20MHZ, 636 + }, 637 + { 638 + .demod_address = 0x1a, 639 + .frequency = VA1J5JF8007T_20MHZ, 640 + }, 735 641 }, { 736 - { .demod_address = 0x19 }, 737 - { .demod_address = 0x18 }, 642 + { 643 + .demod_address = 0x19, 644 + .frequency = VA1J5JF8007S_20MHZ, 645 + }, 646 + { 647 + .demod_address = 0x18, 648 + .frequency = VA1J5JF8007T_20MHZ, 649 + }, 738 650 }, 739 651 }; 740 652 741 - static int pt1_init_adapters(struct pt1 *pt1) 653 + static const struct pt1_config pt2_configs[2] = { 654 + { 655 + { 656 + .demod_address = 0x1b, 657 + .frequency = VA1J5JF8007S_25MHZ, 658 + }, 659 + { 660 + .demod_address = 0x1a, 661 + .frequency = VA1J5JF8007T_25MHZ, 662 + }, 663 + }, { 664 + { 665 + .demod_address = 0x19, 666 + .frequency = VA1J5JF8007S_25MHZ, 667 + }, 668 + { 669 + .demod_address = 0x18, 670 + .frequency = VA1J5JF8007T_25MHZ, 671 + }, 672 + }, 673 + }; 674 + 675 + static int pt1_init_frontends(struct pt1 *pt1) 742 676 { 743 677 int i, j; 744 678 struct i2c_adapter *i2c_adap; 745 - const struct pt1_config *config; 679 + const struct pt1_config *configs, *config; 746 680 struct dvb_frontend *fe[4]; 747 - struct pt1_adapter *adap; 748 681 int ret; 749 682 750 683 i = 0; 751 684 j = 0; 752 685 753 686 i2c_adap = &pt1->i2c_adap; 687 + configs = pt1->pdev->device == 0x211a ? pt1_configs : pt2_configs; 754 688 do { 755 - config = &pt1_configs[i / 2]; 689 + config = &configs[i / 2]; 756 690 757 691 fe[i] = va1j5jf8007s_attach(&config->va1j5jf8007s_config, 758 692 i2c_adap); ··· 815 681 } while (i < 4); 816 682 817 683 do { 818 - adap = pt1_alloc_adapter(pt1, fe[j]); 819 - if (IS_ERR(adap)) 684 + ret = pt1_init_frontend(pt1->adaps[j], fe[j]); 685 + if (ret < 0) 820 686 goto err; 821 - adap->index = j; 822 - pt1->adaps[j] = adap; 823 687 } while (++j < 4); 824 688 825 689 return 0; ··· 827 695 fe[i]->ops.release(fe[i]); 828 696 829 697 while (j--) 830 - pt1_free_adapter(pt1->adaps[j]); 698 + dvb_unregister_frontend(fe[j]); 831 699 832 700 return ret; 833 701 } ··· 1022 890 1023 891 kthread_stop(pt1->kthread); 1024 892 pt1_cleanup_tables(pt1); 1025 - pt1_cleanup_adapters(pt1); 893 + pt1_cleanup_frontends(pt1); 1026 894 pt1_disable_ram(pt1); 1027 - pt1_set_power(pt1, 0, 0, 1); 895 + pt1->power = 0; 896 + pt1->reset = 1; 897 + pt1_update_power(pt1); 898 + pt1_cleanup_adapters(pt1); 1028 899 i2c_del_adapter(&pt1->i2c_adap); 1029 900 pci_set_drvdata(pdev, NULL); 1030 901 kfree(pt1); ··· 1071 936 goto err_pci_iounmap; 1072 937 } 1073 938 939 + mutex_init(&pt1->lock); 1074 940 pt1->pdev = pdev; 1075 941 pt1->regs = regs; 1076 942 pci_set_drvdata(pdev, pt1); 943 + 944 + ret = pt1_init_adapters(pt1); 945 + if (ret < 0) 946 + goto err_kfree; 947 + 948 + mutex_init(&pt1->lock); 949 + 950 + pt1->power = 0; 951 + pt1->reset = 1; 952 + pt1_update_power(pt1); 1077 953 1078 954 i2c_adap = &pt1->i2c_adap; 1079 955 i2c_adap->class = I2C_CLASS_TV_DIGITAL; ··· 1094 948 i2c_set_adapdata(i2c_adap, pt1); 1095 949 ret = i2c_add_adapter(i2c_adap); 1096 950 if (ret < 0) 1097 - goto err_kfree; 1098 - 1099 - pt1_set_power(pt1, 0, 0, 1); 951 + goto err_pt1_cleanup_adapters; 1100 952 1101 953 pt1_i2c_init(pt1); 1102 954 pt1_i2c_wait(pt1); ··· 1123 979 1124 980 pt1_init_streams(pt1); 1125 981 1126 - pt1_set_power(pt1, 1, 0, 1); 982 + pt1->power = 1; 983 + pt1_update_power(pt1); 1127 984 schedule_timeout_uninterruptible((HZ + 49) / 50); 1128 985 1129 - pt1_set_power(pt1, 1, 0, 0); 986 + pt1->reset = 0; 987 + pt1_update_power(pt1); 1130 988 schedule_timeout_uninterruptible((HZ + 999) / 1000); 1131 989 1132 - ret = pt1_init_adapters(pt1); 990 + ret = pt1_init_frontends(pt1); 1133 991 if (ret < 0) 1134 992 goto err_pt1_disable_ram; 1135 993 1136 994 ret = pt1_init_tables(pt1); 1137 995 if (ret < 0) 1138 - goto err_pt1_cleanup_adapters; 996 + goto err_pt1_cleanup_frontends; 1139 997 1140 998 kthread = kthread_run(pt1_thread, pt1, "pt1"); 1141 999 if (IS_ERR(kthread)) { ··· 1150 1004 1151 1005 err_pt1_cleanup_tables: 1152 1006 pt1_cleanup_tables(pt1); 1153 - err_pt1_cleanup_adapters: 1154 - pt1_cleanup_adapters(pt1); 1007 + err_pt1_cleanup_frontends: 1008 + pt1_cleanup_frontends(pt1); 1155 1009 err_pt1_disable_ram: 1156 1010 pt1_disable_ram(pt1); 1157 - pt1_set_power(pt1, 0, 0, 1); 1011 + pt1->power = 0; 1012 + pt1->reset = 1; 1013 + pt1_update_power(pt1); 1014 + err_pt1_cleanup_adapters: 1015 + pt1_cleanup_adapters(pt1); 1158 1016 err_i2c_del_adapter: 1159 1017 i2c_del_adapter(i2c_adap); 1160 1018 err_kfree: ··· 1177 1027 1178 1028 static struct pci_device_id pt1_id_table[] = { 1179 1029 { PCI_DEVICE(0x10ee, 0x211a) }, 1030 + { PCI_DEVICE(0x10ee, 0x222a) }, 1180 1031 { }, 1181 1032 }; 1182 1033 MODULE_DEVICE_TABLE(pci, pt1_id_table); ··· 1205 1054 module_exit(pt1_cleanup); 1206 1055 1207 1056 MODULE_AUTHOR("Takahito HIRANO <hiranotaka@zng.info>"); 1208 - MODULE_DESCRIPTION("Earthsoft PT1 Driver"); 1057 + MODULE_DESCRIPTION("Earthsoft PT1/PT2 Driver"); 1209 1058 MODULE_LICENSE("GPL");
+27 -5
drivers/media/dvb/pt1/va1j5jf8007s.c
··· 1 1 /* 2 - * ISDB-S driver for VA1J5JF8007 2 + * ISDB-S driver for VA1J5JF8007/VA1J5JF8011 3 3 * 4 4 * Copyright (C) 2009 HIRANO Takahito <hiranotaka@zng.info> 5 5 * ··· 580 580 581 581 static struct dvb_frontend_ops va1j5jf8007s_ops = { 582 582 .info = { 583 - .name = "VA1J5JF8007 ISDB-S", 583 + .name = "VA1J5JF8007/VA1J5JF8011 ISDB-S", 584 584 .type = FE_QPSK, 585 585 .frequency_min = 950000, 586 586 .frequency_max = 2150000, ··· 628 628 return 0; 629 629 } 630 630 631 - static const u8 va1j5jf8007s_prepare_bufs[][2] = { 631 + static const u8 va1j5jf8007s_20mhz_prepare_bufs[][2] = { 632 632 {0x04, 0x02}, {0x0d, 0x55}, {0x11, 0x40}, {0x13, 0x80}, {0x17, 0x01}, 633 633 {0x1c, 0x0a}, {0x1d, 0xaa}, {0x1e, 0x20}, {0x1f, 0x88}, {0x51, 0xb0}, 634 634 {0x52, 0x89}, {0x53, 0xb3}, {0x5a, 0x2d}, {0x5b, 0xd3}, {0x85, 0x69}, 635 635 {0x87, 0x04}, {0x8e, 0x02}, {0xa3, 0xf7}, {0xa5, 0xc0}, 636 636 }; 637 637 638 + static const u8 va1j5jf8007s_25mhz_prepare_bufs[][2] = { 639 + {0x04, 0x02}, {0x11, 0x40}, {0x13, 0x80}, {0x17, 0x01}, {0x1c, 0x0a}, 640 + {0x1d, 0xaa}, {0x1e, 0x20}, {0x1f, 0x88}, {0x51, 0xb0}, {0x52, 0x89}, 641 + {0x53, 0xb3}, {0x5a, 0x2d}, {0x5b, 0xd3}, {0x85, 0x69}, {0x87, 0x04}, 642 + {0x8e, 0x26}, {0xa3, 0xf7}, {0xa5, 0xc0}, 643 + }; 644 + 638 645 static int va1j5jf8007s_prepare_2(struct va1j5jf8007s_state *state) 639 646 { 647 + const u8 (*bufs)[2]; 648 + int size; 640 649 u8 addr; 641 650 u8 buf[2]; 642 651 struct i2c_msg msg; 643 652 int i; 653 + 654 + switch (state->config->frequency) { 655 + case VA1J5JF8007S_20MHZ: 656 + bufs = va1j5jf8007s_20mhz_prepare_bufs; 657 + size = ARRAY_SIZE(va1j5jf8007s_20mhz_prepare_bufs); 658 + break; 659 + case VA1J5JF8007S_25MHZ: 660 + bufs = va1j5jf8007s_25mhz_prepare_bufs; 661 + size = ARRAY_SIZE(va1j5jf8007s_25mhz_prepare_bufs); 662 + break; 663 + default: 664 + return -EINVAL; 665 + } 644 666 645 667 addr = state->config->demod_address; 646 668 ··· 670 648 msg.flags = 0; 671 649 msg.len = 2; 672 650 msg.buf = buf; 673 - for (i = 0; i < ARRAY_SIZE(va1j5jf8007s_prepare_bufs); i++) { 674 - memcpy(buf, va1j5jf8007s_prepare_bufs[i], sizeof(buf)); 651 + for (i = 0; i < size; i++) { 652 + memcpy(buf, bufs[i], sizeof(buf)); 675 653 if (i2c_transfer(state->adap, &msg, 1) != 1) 676 654 return -EREMOTEIO; 677 655 }
+7 -1
drivers/media/dvb/pt1/va1j5jf8007s.h
··· 1 1 /* 2 - * ISDB-S driver for VA1J5JF8007 2 + * ISDB-S driver for VA1J5JF8007/VA1J5JF8011 3 3 * 4 4 * Copyright (C) 2009 HIRANO Takahito <hiranotaka@zng.info> 5 5 * ··· 24 24 #ifndef VA1J5JF8007S_H 25 25 #define VA1J5JF8007S_H 26 26 27 + enum va1j5jf8007s_frequency { 28 + VA1J5JF8007S_20MHZ, 29 + VA1J5JF8007S_25MHZ, 30 + }; 31 + 27 32 struct va1j5jf8007s_config { 28 33 u8 demod_address; 34 + enum va1j5jf8007s_frequency frequency; 29 35 }; 30 36 31 37 struct i2c_adapter;
+26 -5
drivers/media/dvb/pt1/va1j5jf8007t.c
··· 1 1 /* 2 - * ISDB-T driver for VA1J5JF8007 2 + * ISDB-T driver for VA1J5JF8007/VA1J5JF8011 3 3 * 4 4 * Copyright (C) 2009 HIRANO Takahito <hiranotaka@zng.info> 5 5 * ··· 429 429 430 430 static struct dvb_frontend_ops va1j5jf8007t_ops = { 431 431 .info = { 432 - .name = "VA1J5JF8007 ISDB-T", 432 + .name = "VA1J5JF8007/VA1J5JF8011 ISDB-T", 433 433 .type = FE_OFDM, 434 434 .frequency_min = 90000000, 435 435 .frequency_max = 770000000, ··· 448 448 .release = va1j5jf8007t_release, 449 449 }; 450 450 451 - static const u8 va1j5jf8007t_prepare_bufs[][2] = { 451 + static const u8 va1j5jf8007t_20mhz_prepare_bufs[][2] = { 452 452 {0x03, 0x90}, {0x14, 0x8f}, {0x1c, 0x2a}, {0x1d, 0xa8}, {0x1e, 0xa2}, 453 453 {0x22, 0x83}, {0x31, 0x0d}, {0x32, 0xe0}, {0x39, 0xd3}, {0x3a, 0x00}, 454 454 {0x5c, 0x40}, {0x5f, 0x80}, {0x75, 0x02}, {0x76, 0x4e}, {0x77, 0x03}, 455 455 {0xef, 0x01} 456 456 }; 457 457 458 + static const u8 va1j5jf8007t_25mhz_prepare_bufs[][2] = { 459 + {0x03, 0x90}, {0x1c, 0x2a}, {0x1d, 0xa8}, {0x1e, 0xa2}, {0x22, 0x83}, 460 + {0x3a, 0x00}, {0x5c, 0x40}, {0x5f, 0x80}, {0x75, 0x0a}, {0x76, 0x4c}, 461 + {0x77, 0x03}, {0xef, 0x01} 462 + }; 463 + 458 464 int va1j5jf8007t_prepare(struct dvb_frontend *fe) 459 465 { 460 466 struct va1j5jf8007t_state *state; 467 + const u8 (*bufs)[2]; 468 + int size; 461 469 u8 buf[2]; 462 470 struct i2c_msg msg; 463 471 int i; 464 472 465 473 state = fe->demodulator_priv; 466 474 475 + switch (state->config->frequency) { 476 + case VA1J5JF8007T_20MHZ: 477 + bufs = va1j5jf8007t_20mhz_prepare_bufs; 478 + size = ARRAY_SIZE(va1j5jf8007t_20mhz_prepare_bufs); 479 + break; 480 + case VA1J5JF8007T_25MHZ: 481 + bufs = va1j5jf8007t_25mhz_prepare_bufs; 482 + size = ARRAY_SIZE(va1j5jf8007t_25mhz_prepare_bufs); 483 + break; 484 + default: 485 + return -EINVAL; 486 + } 487 + 467 488 msg.addr = state->config->demod_address; 468 489 msg.flags = 0; 469 490 msg.len = sizeof(buf); 470 491 msg.buf = buf; 471 492 472 - for (i = 0; i < ARRAY_SIZE(va1j5jf8007t_prepare_bufs); i++) { 473 - memcpy(buf, va1j5jf8007t_prepare_bufs[i], sizeof(buf)); 493 + for (i = 0; i < size; i++) { 494 + memcpy(buf, bufs[i], sizeof(buf)); 474 495 if (i2c_transfer(state->adap, &msg, 1) != 1) 475 496 return -EREMOTEIO; 476 497 }
+7 -1
drivers/media/dvb/pt1/va1j5jf8007t.h
··· 1 1 /* 2 - * ISDB-T driver for VA1J5JF8007 2 + * ISDB-T driver for VA1J5JF8007/VA1J5JF8011 3 3 * 4 4 * Copyright (C) 2009 HIRANO Takahito <hiranotaka@zng.info> 5 5 * ··· 24 24 #ifndef VA1J5JF8007T_H 25 25 #define VA1J5JF8007T_H 26 26 27 + enum va1j5jf8007t_frequency { 28 + VA1J5JF8007T_20MHZ, 29 + VA1J5JF8007T_25MHZ, 30 + }; 31 + 27 32 struct va1j5jf8007t_config { 28 33 u8 demod_address; 34 + enum va1j5jf8007t_frequency frequency; 29 35 }; 30 36 31 37 struct i2c_adapter;