diff options
author | Mauro Carvalho Chehab <mchehab@infradead.org> | 2008-04-30 14:27:55 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2008-05-14 01:53:57 -0400 |
commit | d557dab5de82edfe5bab9a1964dfc5cf2b2b6833 (patch) | |
tree | 77f38043c0dc54811daf791a998513e2e8988a30 /drivers/media/video | |
parent | a1355e530173021099d0401f3294414382189dbd (diff) |
V4L/DVB (7801): saa7134: detach frontend, if tuner or Diseqc attach fails
Before this patch, an error at tuner or diseqc were discarded by the driver.
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers/media/video')
-rw-r--r-- | drivers/media/video/saa7134/saa7134-dvb.c | 141 |
1 files changed, 101 insertions, 40 deletions
diff --git a/drivers/media/video/saa7134/saa7134-dvb.c b/drivers/media/video/saa7134/saa7134-dvb.c index 2d16be2259db..2a9aa726e984 100644 --- a/drivers/media/video/saa7134/saa7134-dvb.c +++ b/drivers/media/video/saa7134/saa7134-dvb.c | |||
@@ -538,19 +538,23 @@ static int philips_tda827x_tuner_sleep(struct dvb_frontend *fe) | |||
538 | return 0; | 538 | return 0; |
539 | } | 539 | } |
540 | 540 | ||
541 | static void configure_tda827x_fe(struct saa7134_dev *dev, struct tda1004x_config *cdec_conf, | 541 | static int configure_tda827x_fe(struct saa7134_dev *dev, |
542 | struct tda827x_config *tuner_conf) | 542 | struct tda1004x_config *cdec_conf, |
543 | struct tda827x_config *tuner_conf) | ||
543 | { | 544 | { |
544 | dev->dvb.frontend = dvb_attach(tda10046_attach, cdec_conf, &dev->i2c_adap); | 545 | dev->dvb.frontend = dvb_attach(tda10046_attach, cdec_conf, &dev->i2c_adap); |
545 | if (dev->dvb.frontend) { | 546 | if (dev->dvb.frontend) { |
546 | if (cdec_conf->i2c_gate) | 547 | if (cdec_conf->i2c_gate) |
547 | dev->dvb.frontend->ops.i2c_gate_ctrl = tda8290_i2c_gate_ctrl; | 548 | dev->dvb.frontend->ops.i2c_gate_ctrl = tda8290_i2c_gate_ctrl; |
548 | if (dvb_attach(tda827x_attach, dev->dvb.frontend, cdec_conf->tuner_address, | 549 | if (dvb_attach(tda827x_attach, dev->dvb.frontend, |
549 | &dev->i2c_adap, tuner_conf) == NULL) { | 550 | cdec_conf->tuner_address, |
550 | wprintk("no tda827x tuner found at addr: %02x\n", | 551 | &dev->i2c_adap, tuner_conf)) |
552 | return 0; | ||
553 | |||
554 | wprintk("no tda827x tuner found at addr: %02x\n", | ||
551 | cdec_conf->tuner_address); | 555 | cdec_conf->tuner_address); |
552 | } | ||
553 | } | 556 | } |
557 | return -EINVAL; | ||
554 | } | 558 | } |
555 | 559 | ||
556 | /* ------------------------------------------------------------------ */ | 560 | /* ------------------------------------------------------------------ */ |
@@ -997,7 +1001,9 @@ static int dvb_init(struct saa7134_dev *dev) | |||
997 | break; | 1001 | break; |
998 | case SAA7134_BOARD_FLYDVBTDUO: | 1002 | case SAA7134_BOARD_FLYDVBTDUO: |
999 | case SAA7134_BOARD_FLYDVBT_DUO_CARDBUS: | 1003 | case SAA7134_BOARD_FLYDVBT_DUO_CARDBUS: |
1000 | configure_tda827x_fe(dev, &tda827x_lifeview_config, &tda827x_cfg_0); | 1004 | if (configure_tda827x_fe(dev, &tda827x_lifeview_config, |
1005 | &tda827x_cfg_0) < 0) | ||
1006 | goto dettach_frontend; | ||
1001 | break; | 1007 | break; |
1002 | case SAA7134_BOARD_PHILIPS_EUROPA: | 1008 | case SAA7134_BOARD_PHILIPS_EUROPA: |
1003 | case SAA7134_BOARD_VIDEOMATE_DVBT_300: | 1009 | case SAA7134_BOARD_VIDEOMATE_DVBT_300: |
@@ -1022,36 +1028,52 @@ static int dvb_init(struct saa7134_dev *dev) | |||
1022 | } | 1028 | } |
1023 | break; | 1029 | break; |
1024 | case SAA7134_BOARD_KWORLD_DVBT_210: | 1030 | case SAA7134_BOARD_KWORLD_DVBT_210: |
1025 | configure_tda827x_fe(dev, &kworld_dvb_t_210_config, &tda827x_cfg_2); | 1031 | if (configure_tda827x_fe(dev, &kworld_dvb_t_210_config, |
1032 | &tda827x_cfg_2) < 0) | ||
1033 | goto dettach_frontend; | ||
1026 | break; | 1034 | break; |
1027 | case SAA7134_BOARD_PHILIPS_TIGER: | 1035 | case SAA7134_BOARD_PHILIPS_TIGER: |
1028 | configure_tda827x_fe(dev, &philips_tiger_config, &tda827x_cfg_0); | 1036 | if (configure_tda827x_fe(dev, &philips_tiger_config, |
1037 | &tda827x_cfg_0) < 0) | ||
1038 | goto dettach_frontend; | ||
1029 | break; | 1039 | break; |
1030 | case SAA7134_BOARD_PINNACLE_PCTV_310i: | 1040 | case SAA7134_BOARD_PINNACLE_PCTV_310i: |
1031 | configure_tda827x_fe(dev, &pinnacle_pctv_310i_config, &tda827x_cfg_1); | 1041 | if (configure_tda827x_fe(dev, &pinnacle_pctv_310i_config, |
1042 | &tda827x_cfg_1) < 0) | ||
1043 | goto dettach_frontend; | ||
1032 | break; | 1044 | break; |
1033 | case SAA7134_BOARD_HAUPPAUGE_HVR1110: | 1045 | case SAA7134_BOARD_HAUPPAUGE_HVR1110: |
1034 | configure_tda827x_fe(dev, &hauppauge_hvr_1110_config, &tda827x_cfg_1); | 1046 | if (configure_tda827x_fe(dev, &hauppauge_hvr_1110_config, |
1047 | &tda827x_cfg_1) < 0) | ||
1048 | goto dettach_frontend; | ||
1035 | break; | 1049 | break; |
1036 | case SAA7134_BOARD_ASUSTeK_P7131_DUAL: | 1050 | case SAA7134_BOARD_ASUSTeK_P7131_DUAL: |
1037 | configure_tda827x_fe(dev, &asus_p7131_dual_config, &tda827x_cfg_0); | 1051 | if (configure_tda827x_fe(dev, &asus_p7131_dual_config, |
1052 | &tda827x_cfg_0) < 0) | ||
1053 | goto dettach_frontend; | ||
1038 | break; | 1054 | break; |
1039 | case SAA7134_BOARD_FLYDVBT_LR301: | 1055 | case SAA7134_BOARD_FLYDVBT_LR301: |
1040 | configure_tda827x_fe(dev, &tda827x_lifeview_config, &tda827x_cfg_0); | 1056 | if (configure_tda827x_fe(dev, &tda827x_lifeview_config, |
1057 | &tda827x_cfg_0) < 0) | ||
1058 | goto dettach_frontend; | ||
1041 | break; | 1059 | break; |
1042 | case SAA7134_BOARD_FLYDVB_TRIO: | 1060 | case SAA7134_BOARD_FLYDVB_TRIO: |
1043 | if(! use_frontend) { /* terrestrial */ | 1061 | if (!use_frontend) { /* terrestrial */ |
1044 | configure_tda827x_fe(dev, &lifeview_trio_config, &tda827x_cfg_0); | 1062 | if (configure_tda827x_fe(dev, &lifeview_trio_config, |
1063 | &tda827x_cfg_0) < 0) | ||
1064 | goto dettach_frontend; | ||
1045 | } else { /* satellite */ | 1065 | } else { /* satellite */ |
1046 | dev->dvb.frontend = dvb_attach(tda10086_attach, &flydvbs, &dev->i2c_adap); | 1066 | dev->dvb.frontend = dvb_attach(tda10086_attach, &flydvbs, &dev->i2c_adap); |
1047 | if (dev->dvb.frontend) { | 1067 | if (dev->dvb.frontend) { |
1048 | if (dvb_attach(tda826x_attach, dev->dvb.frontend, 0x63, | 1068 | if (dvb_attach(tda826x_attach, dev->dvb.frontend, 0x63, |
1049 | &dev->i2c_adap, 0) == NULL) { | 1069 | &dev->i2c_adap, 0) == NULL) { |
1050 | wprintk("%s: Lifeview Trio, No tda826x found!\n", __func__); | 1070 | wprintk("%s: Lifeview Trio, No tda826x found!\n", __func__); |
1071 | goto dettach_frontend; | ||
1051 | } | 1072 | } |
1052 | if (dvb_attach(isl6421_attach, dev->dvb.frontend, &dev->i2c_adap, | 1073 | if (dvb_attach(isl6421_attach, dev->dvb.frontend, &dev->i2c_adap, |
1053 | 0x08, 0, 0) == NULL) { | 1074 | 0x08, 0, 0) == NULL) { |
1054 | wprintk("%s: Lifeview Trio, No ISL6421 found!\n", __func__); | 1075 | wprintk("%s: Lifeview Trio, No ISL6421 found!\n", __func__); |
1076 | goto dettach_frontend; | ||
1055 | } | 1077 | } |
1056 | } | 1078 | } |
1057 | } | 1079 | } |
@@ -1067,15 +1089,20 @@ static int dvb_init(struct saa7134_dev *dev) | |||
1067 | &ads_duo_cfg) == NULL) { | 1089 | &ads_duo_cfg) == NULL) { |
1068 | wprintk("no tda827x tuner found at addr: %02x\n", | 1090 | wprintk("no tda827x tuner found at addr: %02x\n", |
1069 | ads_tech_duo_config.tuner_address); | 1091 | ads_tech_duo_config.tuner_address); |
1092 | goto dettach_frontend; | ||
1070 | } | 1093 | } |
1071 | } | 1094 | } |
1072 | break; | 1095 | break; |
1073 | case SAA7134_BOARD_TEVION_DVBT_220RF: | 1096 | case SAA7134_BOARD_TEVION_DVBT_220RF: |
1074 | configure_tda827x_fe(dev, &tevion_dvbt220rf_config, &tda827x_cfg_0); | 1097 | if (configure_tda827x_fe(dev, &tevion_dvbt220rf_config, |
1098 | &tda827x_cfg_0) < 0) | ||
1099 | goto dettach_frontend; | ||
1075 | break; | 1100 | break; |
1076 | case SAA7134_BOARD_MEDION_MD8800_QUADRO: | 1101 | case SAA7134_BOARD_MEDION_MD8800_QUADRO: |
1077 | if (!use_frontend) { /* terrestrial */ | 1102 | if (!use_frontend) { /* terrestrial */ |
1078 | configure_tda827x_fe(dev, &md8800_dvbt_config, &tda827x_cfg_0); | 1103 | if (configure_tda827x_fe(dev, &md8800_dvbt_config, |
1104 | &tda827x_cfg_0) < 0) | ||
1105 | goto dettach_frontend; | ||
1079 | } else { /* satellite */ | 1106 | } else { /* satellite */ |
1080 | dev->dvb.frontend = dvb_attach(tda10086_attach, | 1107 | dev->dvb.frontend = dvb_attach(tda10086_attach, |
1081 | &flydvbs, &dev->i2c_adap); | 1108 | &flydvbs, &dev->i2c_adap); |
@@ -1086,16 +1113,20 @@ static int dvb_init(struct saa7134_dev *dev) | |||
1086 | struct i2c_msg msg = {.addr = 0x08, .flags = 0, .len = 1}; | 1113 | struct i2c_msg msg = {.addr = 0x08, .flags = 0, .len = 1}; |
1087 | 1114 | ||
1088 | if (dvb_attach(tda826x_attach, dev->dvb.frontend, | 1115 | if (dvb_attach(tda826x_attach, dev->dvb.frontend, |
1089 | 0x60, &dev->i2c_adap, 0) == NULL) | 1116 | 0x60, &dev->i2c_adap, 0) == NULL) { |
1090 | wprintk("%s: Medion Quadro, no tda826x " | 1117 | wprintk("%s: Medion Quadro, no tda826x " |
1091 | "found !\n", __func__); | 1118 | "found !\n", __func__); |
1119 | goto dettach_frontend; | ||
1120 | } | ||
1092 | if (dev_id != 0x08) { | 1121 | if (dev_id != 0x08) { |
1093 | /* we need to open the i2c gate (we know it exists) */ | 1122 | /* we need to open the i2c gate (we know it exists) */ |
1094 | fe->ops.i2c_gate_ctrl(fe, 1); | 1123 | fe->ops.i2c_gate_ctrl(fe, 1); |
1095 | if (dvb_attach(isl6405_attach, fe, | 1124 | if (dvb_attach(isl6405_attach, fe, |
1096 | &dev->i2c_adap, 0x08, 0, 0) == NULL) | 1125 | &dev->i2c_adap, 0x08, 0, 0) == NULL) { |
1097 | wprintk("%s: Medion Quadro, no ISL6405 " | 1126 | wprintk("%s: Medion Quadro, no ISL6405 " |
1098 | "found !\n", __func__); | 1127 | "found !\n", __func__); |
1128 | goto dettach_frontend; | ||
1129 | } | ||
1099 | if (dev_id == 0x07) { | 1130 | if (dev_id == 0x07) { |
1100 | /* fire up the 2nd section of the LNB supply since | 1131 | /* fire up the 2nd section of the LNB supply since |
1101 | we can't do this from the other section */ | 1132 | we can't do this from the other section */ |
@@ -1117,19 +1148,17 @@ static int dvb_init(struct saa7134_dev *dev) | |||
1117 | case SAA7134_BOARD_AVERMEDIA_AVERTVHD_A180: | 1148 | case SAA7134_BOARD_AVERMEDIA_AVERTVHD_A180: |
1118 | dev->dvb.frontend = dvb_attach(nxt200x_attach, &avertvhda180, | 1149 | dev->dvb.frontend = dvb_attach(nxt200x_attach, &avertvhda180, |
1119 | &dev->i2c_adap); | 1150 | &dev->i2c_adap); |
1120 | if (dev->dvb.frontend) { | 1151 | if (dev->dvb.frontend) |
1121 | dvb_attach(dvb_pll_attach, dev->dvb.frontend, 0x61, | 1152 | dvb_attach(dvb_pll_attach, dev->dvb.frontend, 0x61, |
1122 | NULL, DVB_PLL_TDHU2); | 1153 | NULL, DVB_PLL_TDHU2); |
1123 | } | ||
1124 | break; | 1154 | break; |
1125 | case SAA7134_BOARD_KWORLD_ATSC110: | 1155 | case SAA7134_BOARD_KWORLD_ATSC110: |
1126 | dev->dvb.frontend = dvb_attach(nxt200x_attach, &kworldatsc110, | 1156 | dev->dvb.frontend = dvb_attach(nxt200x_attach, &kworldatsc110, |
1127 | &dev->i2c_adap); | 1157 | &dev->i2c_adap); |
1128 | if (dev->dvb.frontend) { | 1158 | if (dev->dvb.frontend) |
1129 | dvb_attach(simple_tuner_attach, dev->dvb.frontend, | 1159 | dvb_attach(simple_tuner_attach, dev->dvb.frontend, |
1130 | &dev->i2c_adap, 0x61, | 1160 | &dev->i2c_adap, 0x61, |
1131 | TUNER_PHILIPS_TUV1236D); | 1161 | TUNER_PHILIPS_TUV1236D); |
1132 | } | ||
1133 | break; | 1162 | break; |
1134 | case SAA7134_BOARD_FLYDVBS_LR300: | 1163 | case SAA7134_BOARD_FLYDVBS_LR300: |
1135 | dev->dvb.frontend = dvb_attach(tda10086_attach, &flydvbs, | 1164 | dev->dvb.frontend = dvb_attach(tda10086_attach, &flydvbs, |
@@ -1138,10 +1167,12 @@ static int dvb_init(struct saa7134_dev *dev) | |||
1138 | if (dvb_attach(tda826x_attach, dev->dvb.frontend, 0x60, | 1167 | if (dvb_attach(tda826x_attach, dev->dvb.frontend, 0x60, |
1139 | &dev->i2c_adap, 0) == NULL) { | 1168 | &dev->i2c_adap, 0) == NULL) { |
1140 | wprintk("%s: No tda826x found!\n", __func__); | 1169 | wprintk("%s: No tda826x found!\n", __func__); |
1170 | goto dettach_frontend; | ||
1141 | } | 1171 | } |
1142 | if (dvb_attach(isl6421_attach, dev->dvb.frontend, | 1172 | if (dvb_attach(isl6421_attach, dev->dvb.frontend, |
1143 | &dev->i2c_adap, 0x08, 0, 0) == NULL) { | 1173 | &dev->i2c_adap, 0x08, 0, 0) == NULL) { |
1144 | wprintk("%s: No ISL6421 found!\n", __func__); | 1174 | wprintk("%s: No ISL6421 found!\n", __func__); |
1175 | goto dettach_frontend; | ||
1145 | } | 1176 | } |
1146 | } | 1177 | } |
1147 | break; | 1178 | break; |
@@ -1168,43 +1199,65 @@ static int dvb_init(struct saa7134_dev *dev) | |||
1168 | } | 1199 | } |
1169 | break; | 1200 | break; |
1170 | case SAA7134_BOARD_CINERGY_HT_PCMCIA: | 1201 | case SAA7134_BOARD_CINERGY_HT_PCMCIA: |
1171 | configure_tda827x_fe(dev, &cinergy_ht_config, &tda827x_cfg_0); | 1202 | if (configure_tda827x_fe(dev, &cinergy_ht_config, |
1203 | &tda827x_cfg_0) < 0) | ||
1204 | goto dettach_frontend; | ||
1172 | break; | 1205 | break; |
1173 | case SAA7134_BOARD_CINERGY_HT_PCI: | 1206 | case SAA7134_BOARD_CINERGY_HT_PCI: |
1174 | configure_tda827x_fe(dev, &cinergy_ht_pci_config, &tda827x_cfg_0); | 1207 | if (configure_tda827x_fe(dev, &cinergy_ht_pci_config, |
1208 | &tda827x_cfg_0) < 0) | ||
1209 | goto dettach_frontend; | ||
1175 | break; | 1210 | break; |
1176 | case SAA7134_BOARD_PHILIPS_TIGER_S: | 1211 | case SAA7134_BOARD_PHILIPS_TIGER_S: |
1177 | configure_tda827x_fe(dev, &philips_tiger_s_config, &tda827x_cfg_2); | 1212 | if (configure_tda827x_fe(dev, &philips_tiger_s_config, |
1213 | &tda827x_cfg_2) < 0) | ||
1214 | goto dettach_frontend; | ||
1178 | break; | 1215 | break; |
1179 | case SAA7134_BOARD_ASUS_P7131_4871: | 1216 | case SAA7134_BOARD_ASUS_P7131_4871: |
1180 | configure_tda827x_fe(dev, &asus_p7131_4871_config, &tda827x_cfg_2); | 1217 | if (configure_tda827x_fe(dev, &asus_p7131_4871_config, |
1218 | &tda827x_cfg_2) < 0) | ||
1219 | goto dettach_frontend; | ||
1181 | break; | 1220 | break; |
1182 | case SAA7134_BOARD_ASUSTeK_P7131_HYBRID_LNA: | 1221 | case SAA7134_BOARD_ASUSTeK_P7131_HYBRID_LNA: |
1183 | configure_tda827x_fe(dev, &asus_p7131_hybrid_lna_config, &tda827x_cfg_2); | 1222 | if (configure_tda827x_fe(dev, &asus_p7131_hybrid_lna_config, |
1223 | &tda827x_cfg_2) < 0) | ||
1224 | goto dettach_frontend; | ||
1184 | break; | 1225 | break; |
1185 | case SAA7134_BOARD_AVERMEDIA_SUPER_007: | 1226 | case SAA7134_BOARD_AVERMEDIA_SUPER_007: |
1186 | configure_tda827x_fe(dev, &avermedia_super_007_config, &tda827x_cfg_0); | 1227 | if (configure_tda827x_fe(dev, &avermedia_super_007_config, |
1228 | &tda827x_cfg_0) < 0) | ||
1229 | goto dettach_frontend; | ||
1187 | break; | 1230 | break; |
1188 | case SAA7134_BOARD_TWINHAN_DTV_DVB_3056: | 1231 | case SAA7134_BOARD_TWINHAN_DTV_DVB_3056: |
1189 | configure_tda827x_fe(dev, &twinhan_dtv_dvb_3056_config, &tda827x_cfg_2_sw42); | 1232 | if (configure_tda827x_fe(dev, &twinhan_dtv_dvb_3056_config, |
1233 | &tda827x_cfg_2_sw42) < 0) | ||
1234 | goto dettach_frontend; | ||
1190 | break; | 1235 | break; |
1191 | case SAA7134_BOARD_PHILIPS_SNAKE: | 1236 | case SAA7134_BOARD_PHILIPS_SNAKE: |
1192 | dev->dvb.frontend = dvb_attach(tda10086_attach, &flydvbs, | 1237 | dev->dvb.frontend = dvb_attach(tda10086_attach, &flydvbs, |
1193 | &dev->i2c_adap); | 1238 | &dev->i2c_adap); |
1194 | if (dev->dvb.frontend) { | 1239 | if (dev->dvb.frontend) { |
1195 | if (dvb_attach(tda826x_attach, dev->dvb.frontend, 0x60, | 1240 | if (dvb_attach(tda826x_attach, dev->dvb.frontend, 0x60, |
1196 | &dev->i2c_adap, 0) == NULL) | 1241 | &dev->i2c_adap, 0) == NULL) { |
1197 | wprintk("%s: No tda826x found!\n", __func__); | 1242 | wprintk("%s: No tda826x found!\n", __func__); |
1243 | goto dettach_frontend; | ||
1244 | } | ||
1198 | if (dvb_attach(lnbp21_attach, dev->dvb.frontend, | 1245 | if (dvb_attach(lnbp21_attach, dev->dvb.frontend, |
1199 | &dev->i2c_adap, 0, 0) == NULL) | 1246 | &dev->i2c_adap, 0, 0) == NULL) { |
1200 | wprintk("%s: No lnbp21 found!\n", __func__); | 1247 | wprintk("%s: No lnbp21 found!\n", __func__); |
1248 | goto dettach_frontend; | ||
1249 | } | ||
1201 | } | 1250 | } |
1202 | break; | 1251 | break; |
1203 | case SAA7134_BOARD_CREATIX_CTX953: | 1252 | case SAA7134_BOARD_CREATIX_CTX953: |
1204 | configure_tda827x_fe(dev, &md8800_dvbt_config, &tda827x_cfg_0); | 1253 | if (configure_tda827x_fe(dev, &md8800_dvbt_config, |
1254 | &tda827x_cfg_0) < 0) | ||
1255 | goto dettach_frontend; | ||
1205 | break; | 1256 | break; |
1206 | case SAA7134_BOARD_MSI_TVANYWHERE_AD11: | 1257 | case SAA7134_BOARD_MSI_TVANYWHERE_AD11: |
1207 | configure_tda827x_fe(dev, &philips_tiger_s_config, &tda827x_cfg_2); | 1258 | if (configure_tda827x_fe(dev, &philips_tiger_s_config, |
1259 | &tda827x_cfg_2) < 0) | ||
1260 | goto dettach_frontend; | ||
1208 | break; | 1261 | break; |
1209 | case SAA7134_BOARD_AVERMEDIA_CARDBUS_506: | 1262 | case SAA7134_BOARD_AVERMEDIA_CARDBUS_506: |
1210 | dev->dvb.frontend = dvb_attach(mt352_attach, | 1263 | dev->dvb.frontend = dvb_attach(mt352_attach, |
@@ -1218,16 +1271,20 @@ static int dvb_init(struct saa7134_dev *dev) | |||
1218 | if (dev->dvb.frontend) { | 1271 | if (dev->dvb.frontend) { |
1219 | struct dvb_frontend *fe; | 1272 | struct dvb_frontend *fe; |
1220 | if (dvb_attach(dvb_pll_attach, dev->dvb.frontend, 0x60, | 1273 | if (dvb_attach(dvb_pll_attach, dev->dvb.frontend, 0x60, |
1221 | &dev->i2c_adap, DVB_PLL_PHILIPS_SD1878_TDA8261) == NULL) | 1274 | &dev->i2c_adap, DVB_PLL_PHILIPS_SD1878_TDA8261) == NULL) { |
1222 | wprintk("%s: MD7134 DVB-S, no SD1878 " | 1275 | wprintk("%s: MD7134 DVB-S, no SD1878 " |
1223 | "found !\n", __func__); | 1276 | "found !\n", __func__); |
1277 | goto dettach_frontend; | ||
1278 | } | ||
1224 | /* we need to open the i2c gate (we know it exists) */ | 1279 | /* we need to open the i2c gate (we know it exists) */ |
1225 | fe = dev->dvb.frontend; | 1280 | fe = dev->dvb.frontend; |
1226 | fe->ops.i2c_gate_ctrl(fe, 1); | 1281 | fe->ops.i2c_gate_ctrl(fe, 1); |
1227 | if (dvb_attach(isl6405_attach, fe, | 1282 | if (dvb_attach(isl6405_attach, fe, |
1228 | &dev->i2c_adap, 0x08, 0, 0) == NULL) | 1283 | &dev->i2c_adap, 0x08, 0, 0) == NULL) { |
1229 | wprintk("%s: MD7134 DVB-S, no ISL6405 " | 1284 | wprintk("%s: MD7134 DVB-S, no ISL6405 " |
1230 | "found !\n", __func__); | 1285 | "found !\n", __func__); |
1286 | goto dettach_frontend; | ||
1287 | } | ||
1231 | fe->ops.i2c_gate_ctrl(fe, 0); | 1288 | fe->ops.i2c_gate_ctrl(fe, 0); |
1232 | dev->original_set_voltage = fe->ops.set_voltage; | 1289 | dev->original_set_voltage = fe->ops.set_voltage; |
1233 | fe->ops.set_voltage = md8800_set_voltage; | 1290 | fe->ops.set_voltage = md8800_set_voltage; |
@@ -1254,10 +1311,7 @@ static int dvb_init(struct saa7134_dev *dev) | |||
1254 | if (!fe) { | 1311 | if (!fe) { |
1255 | printk(KERN_ERR "%s/2: xc3028 attach failed\n", | 1312 | printk(KERN_ERR "%s/2: xc3028 attach failed\n", |
1256 | dev->name); | 1313 | dev->name); |
1257 | dvb_frontend_detach(dev->dvb.frontend); | 1314 | goto dettach_frontend; |
1258 | dvb_unregister_frontend(dev->dvb.frontend); | ||
1259 | dev->dvb.frontend = NULL; | ||
1260 | return -1; | ||
1261 | } | 1315 | } |
1262 | } | 1316 | } |
1263 | 1317 | ||
@@ -1282,6 +1336,13 @@ static int dvb_init(struct saa7134_dev *dev) | |||
1282 | dev->dvb.frontend->ops.tuner_ops.sleep(dev->dvb.frontend); | 1336 | dev->dvb.frontend->ops.tuner_ops.sleep(dev->dvb.frontend); |
1283 | } | 1337 | } |
1284 | return ret; | 1338 | return ret; |
1339 | |||
1340 | dettach_frontend: | ||
1341 | dvb_frontend_detach(dev->dvb.frontend); | ||
1342 | dvb_unregister_frontend(dev->dvb.frontend); | ||
1343 | dev->dvb.frontend = NULL; | ||
1344 | |||
1345 | return -1; | ||
1285 | } | 1346 | } |
1286 | 1347 | ||
1287 | static int dvb_fini(struct saa7134_dev *dev) | 1348 | static int dvb_fini(struct saa7134_dev *dev) |