aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb/dvb-usb/lmedm04.c
diff options
context:
space:
mode:
authorMalcolm Priestley <tvboxspy@gmail.com>2010-12-07 17:49:24 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2010-12-29 05:17:03 -0500
commit75aecc3af22ae9063c96457d530f281a1e2d3276 (patch)
treed66903b3ecbf4e5012e28da59d5bfd61771dd6ea /drivers/media/dvb/dvb-usb/lmedm04.c
parentc59a9bfabfc2a6359f046652c6bfa0a82fb17a05 (diff)
[media] DM04/QQBOX Frontend attach change
On Fri, 2010-12-03 at 09:32 -0200, Mauro Carvalho Chehab wrote: > Em 27-11-2010 11:13, Malcolm Priestley escreveu: > > Driver Version v1.73 - Frontend attach change. > > To stop double rc registration in multi tuner environment or firmware change. > > > > Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com> > > > > > > +static int lme_name(struct dvb_usb_adapter *adap) > > +{ > > + struct lme2510_state *st = adap->dev->priv; > > + const char *desc = adap->dev->desc->name; > > + char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395"}; > > + char *name = adap->fe->ops.info.name; > > + > > + strcpy(name, desc); > > + strcat(name, fe_name[st->tuner_config]); > > Please use, instead, strlcpy/strlcat, to avoid writing outside the buffer size. > Driver Version v1.74 Amended patch with change to strlcpy/strlcat. Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/dvb/dvb-usb/lmedm04.c')
-rw-r--r--drivers/media/dvb/dvb-usb/lmedm04.c133
1 files changed, 86 insertions, 47 deletions
diff --git a/drivers/media/dvb/dvb-usb/lmedm04.c b/drivers/media/dvb/dvb-usb/lmedm04.c
index 1455c238b01b..9eea4188303b 100644
--- a/drivers/media/dvb/dvb-usb/lmedm04.c
+++ b/drivers/media/dvb/dvb-usb/lmedm04.c
@@ -584,6 +584,7 @@ static int lme2510_int_service(struct dvb_usb_adapter *adap)
584 ret = lme2510_int_read(adap); 584 ret = lme2510_int_read(adap);
585 if (ret < 0) { 585 if (ret < 0) {
586 rc_unregister_device(rc); 586 rc_unregister_device(rc);
587 info("INT Unable to start Interupt Service");
587 return -ENODEV; 588 return -ENODEV;
588 } 589 }
589 590
@@ -674,7 +675,7 @@ static void lme_coldreset(struct usb_device *dev)
674 return; 675 return;
675} 676}
676 677
677static void lme_firmware_switch(struct usb_device *udev, int cold) 678static int lme_firmware_switch(struct usb_device *udev, int cold)
678{ 679{
679 const struct firmware *fw = NULL; 680 const struct firmware *fw = NULL;
680 char lme2510c_s7395[] = "dvb-usb-lme2510c-s7395.fw"; 681 char lme2510c_s7395[] = "dvb-usb-lme2510c-s7395.fw";
@@ -685,7 +686,7 @@ static void lme_firmware_switch(struct usb_device *udev, int cold)
685 cold = (cold > 0) ? (cold & 1) : 0; 686 cold = (cold > 0) ? (cold & 1) : 0;
686 687
687 if (udev->descriptor.idProduct == 0x1122) 688 if (udev->descriptor.idProduct == 0x1122)
688 return; 689 return 0;
689 690
690 switch (dvb_usb_lme2510_firmware) { 691 switch (dvb_usb_lme2510_firmware) {
691 case 0: 692 case 0:
@@ -715,10 +716,12 @@ static void lme_firmware_switch(struct usb_device *udev, int cold)
715 716
716 release_firmware(fw); 717 release_firmware(fw);
717 718
718 if (cold) 719 if (cold) {
719 lme_coldreset(udev); 720 lme_coldreset(udev);
721 return -ENODEV;
722 }
720 723
721 return; 724 return ret;
722} 725}
723 726
724static int lme2510_kill_urb(struct usb_data_stream *stream) 727static int lme2510_kill_urb(struct usb_data_stream *stream)
@@ -786,45 +789,43 @@ static int dm04_lme2510_set_voltage(struct dvb_frontend *fe,
786 return (ret < 0) ? -ENODEV : 0; 789 return (ret < 0) ? -ENODEV : 0;
787} 790}
788 791
792static int lme_name(struct dvb_usb_adapter *adap)
793{
794 struct lme2510_state *st = adap->dev->priv;
795 const char *desc = adap->dev->desc->name;
796 char *fe_name[] = {"", " LG TDQY-P001F", " SHARP:BS2F7HZ7395"};
797 char *name = adap->fe->ops.info.name;
798
799 strlcpy(name, desc, 128);
800 strlcat(name, fe_name[st->tuner_config], 128);
801
802 return 0;
803}
804
789static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap) 805static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap)
790{ 806{
791 int ret = 0;
792 struct lme2510_state *st = adap->dev->priv; 807 struct lme2510_state *st = adap->dev->priv;
793 808
794 /* Interupt Start */ 809 int ret = 0;
795 ret = lme2510_int_service(adap);
796 if (ret < 0) {
797 info("INT Unable to start Interupt Service");
798 return -ENODEV;
799 }
800 810
801 st->i2c_talk_onoff = 1; 811 st->i2c_talk_onoff = 1;
802 st->i2c_gate = 4;
803 812
813 st->i2c_gate = 4;
804 adap->fe = dvb_attach(tda10086_attach, &tda10086_config, 814 adap->fe = dvb_attach(tda10086_attach, &tda10086_config,
805 &adap->dev->i2c_adap); 815 &adap->dev->i2c_adap);
806 816
807 if (adap->fe) { 817 if (adap->fe) {
808 info("TUN Found Frontend TDA10086"); 818 info("TUN Found Frontend TDA10086");
809 memcpy(&adap->fe->ops.info.name,
810 &"DM04_LG_TDQY-P001F DVB-S", 24);
811 adap->fe->ops.set_voltage = dm04_lme2510_set_voltage;
812 st->i2c_tuner_gate_w = 4; 819 st->i2c_tuner_gate_w = 4;
813 st->i2c_tuner_gate_r = 4; 820 st->i2c_tuner_gate_r = 4;
814 st->i2c_tuner_addr = 0xc0; 821 st->i2c_tuner_addr = 0xc0;
815 if (dvb_attach(tda826x_attach, adap->fe, 0xc0, 822 st->tuner_config = TUNER_LG;
816 &adap->dev->i2c_adap, 1)) { 823 if (dvb_usb_lme2510_firmware != 1) {
817 info("TUN TDA8263 Found"); 824 dvb_usb_lme2510_firmware = 1;
818 st->tuner_config = TUNER_LG; 825 ret = lme_firmware_switch(adap->dev->udev, 1);
819 if (dvb_usb_lme2510_firmware != 1) { 826 } else /*stops LG/Sharp multi tuner problems*/
820 dvb_usb_lme2510_firmware = 1; 827 dvb_usb_lme2510_firmware = 0;
821 lme_firmware_switch(adap->dev->udev, 1); 828 goto end;
822 } else /*stops LG/Sharp multi tuner problems*/
823 dvb_usb_lme2510_firmware = 0;
824 return 0;
825 }
826 kfree(adap->fe);
827 adap->fe = NULL;
828 } 829 }
829 830
830 st->i2c_gate = 5; 831 st->i2c_gate = 5;
@@ -833,28 +834,64 @@ static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap)
833 834
834 if (adap->fe) { 835 if (adap->fe) {
835 info("FE Found Stv0288"); 836 info("FE Found Stv0288");
836 memcpy(&adap->fe->ops.info.name,
837 &"DM04_SHARP:BS2F7HZ7395", 22);
838 adap->fe->ops.set_voltage = dm04_lme2510_set_voltage;
839 st->i2c_tuner_gate_w = 4; 837 st->i2c_tuner_gate_w = 4;
840 st->i2c_tuner_gate_r = 5; 838 st->i2c_tuner_gate_r = 5;
841 st->i2c_tuner_addr = 0xc0; 839 st->i2c_tuner_addr = 0xc0;
842 if (dvb_attach(ix2505v_attach , adap->fe, &lme_tuner, 840 st->tuner_config = TUNER_S7395;
843 &adap->dev->i2c_adap)) { 841 if (dvb_usb_lme2510_firmware != 0) {
844 st->tuner_config = TUNER_S7395; 842 dvb_usb_lme2510_firmware = 0;
845 info("TUN Sharp IX2505V silicon tuner"); 843 ret = lme_firmware_switch(adap->dev->udev, 1);
846 if (dvb_usb_lme2510_firmware != 0) {
847 dvb_usb_lme2510_firmware = 0;
848 lme_firmware_switch(adap->dev->udev, 1);
849 }
850 return 0;
851 } 844 }
845 } else {
846 info("DM04 Not Supported");
847 return -ENODEV;
848 }
849
850end: if (ret) {
852 kfree(adap->fe); 851 kfree(adap->fe);
853 adap->fe = NULL; 852 adap->fe = NULL;
853 return -ENODEV;
854 } 854 }
855 855
856 info("DM04 Not Supported"); 856 adap->fe->ops.set_voltage = dm04_lme2510_set_voltage;
857 return -ENODEV; 857 ret = lme_name(adap);
858
859 return ret;
860}
861
862static int dm04_lme2510_tuner(struct dvb_usb_adapter *adap)
863{
864 struct lme2510_state *st = adap->dev->priv;
865 char *tun_msg[] = {"", "TDA8263", "IX2505V"};
866 int ret = 0;
867
868 switch (st->tuner_config) {
869 case TUNER_LG:
870 if (dvb_attach(tda826x_attach, adap->fe, 0xc0,
871 &adap->dev->i2c_adap, 1))
872 ret = st->tuner_config;
873 break;
874 case TUNER_S7395:
875 if (dvb_attach(ix2505v_attach , adap->fe, &lme_tuner,
876 &adap->dev->i2c_adap))
877 ret = st->tuner_config;
878 break;
879 default:
880 break;
881 }
882
883 if (ret)
884 info("TUN Found %s tuner", tun_msg[ret]);
885 else {
886 info("TUN No tuner found --- reseting device");
887 lme_coldreset(adap->dev->udev);
888 return -ENODEV;
889 }
890
891 /* Start the Interupt & Remote*/
892 ret = lme2510_int_service(adap);
893
894 return ret;
858} 895}
859 896
860static int lme2510_powerup(struct dvb_usb_device *d, int onoff) 897static int lme2510_powerup(struct dvb_usb_device *d, int onoff)
@@ -937,6 +974,7 @@ static struct dvb_usb_device_properties lme2510_properties = {
937 { 974 {
938 .streaming_ctrl = lme2510_streaming_ctrl, 975 .streaming_ctrl = lme2510_streaming_ctrl,
939 .frontend_attach = dm04_lme2510_frontend_attach, 976 .frontend_attach = dm04_lme2510_frontend_attach,
977 .tuner_attach = dm04_lme2510_tuner,
940 /* parameter for the MPEG2-data transfer */ 978 /* parameter for the MPEG2-data transfer */
941 .stream = { 979 .stream = {
942 .type = USB_BULK, 980 .type = USB_BULK,
@@ -957,7 +995,7 @@ static struct dvb_usb_device_properties lme2510_properties = {
957 .generic_bulk_ctrl_endpoint = 0, 995 .generic_bulk_ctrl_endpoint = 0,
958 .num_device_descs = 1, 996 .num_device_descs = 1,
959 .devices = { 997 .devices = {
960 { "DM04 LME2510 DVB-S USB 2.0", 998 { "DM04_LME2510_DVB-S",
961 { &lme2510_table[0], NULL }, 999 { &lme2510_table[0], NULL },
962 }, 1000 },
963 1001
@@ -975,6 +1013,7 @@ static struct dvb_usb_device_properties lme2510c_properties = {
975 { 1013 {
976 .streaming_ctrl = lme2510_streaming_ctrl, 1014 .streaming_ctrl = lme2510_streaming_ctrl,
977 .frontend_attach = dm04_lme2510_frontend_attach, 1015 .frontend_attach = dm04_lme2510_frontend_attach,
1016 .tuner_attach = dm04_lme2510_tuner,
978 /* parameter for the MPEG2-data transfer */ 1017 /* parameter for the MPEG2-data transfer */
979 .stream = { 1018 .stream = {
980 .type = USB_BULK, 1019 .type = USB_BULK,
@@ -995,7 +1034,7 @@ static struct dvb_usb_device_properties lme2510c_properties = {
995 .generic_bulk_ctrl_endpoint = 0, 1034 .generic_bulk_ctrl_endpoint = 0,
996 .num_device_descs = 1, 1035 .num_device_descs = 1,
997 .devices = { 1036 .devices = {
998 { "DM04 LME2510C USB2.0", 1037 { "DM04_LME2510C_DVB-S",
999 { &lme2510_table[1], NULL }, 1038 { &lme2510_table[1], NULL },
1000 }, 1039 },
1001 } 1040 }
@@ -1041,7 +1080,7 @@ void lme2510_exit(struct usb_interface *intf)
1041} 1080}
1042 1081
1043static struct usb_driver lme2510_driver = { 1082static struct usb_driver lme2510_driver = {
1044 .name = "LME2510C_DVBS", 1083 .name = "LME2510C_DVB-S",
1045 .probe = lme2510_probe, 1084 .probe = lme2510_probe,
1046 .disconnect = lme2510_exit, 1085 .disconnect = lme2510_exit,
1047 .id_table = lme2510_table, 1086 .id_table = lme2510_table,
@@ -1069,6 +1108,6 @@ module_init(lme2510_module_init);
1069module_exit(lme2510_module_exit); 1108module_exit(lme2510_module_exit);
1070 1109
1071MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>"); 1110MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>");
1072MODULE_DESCRIPTION("LM2510(C) DVB-S USB2.0"); 1111MODULE_DESCRIPTION("LME2510(C) DVB-S USB2.0");
1073MODULE_VERSION("1.71"); 1112MODULE_VERSION("1.74");
1074MODULE_LICENSE("GPL"); 1113MODULE_LICENSE("GPL");