aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@osg.samsung.com>2014-10-28 09:21:48 -0400
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>2015-03-03 08:34:12 -0500
commitee0133eea0238067dab19587de7d88e4a3ea77e4 (patch)
tree2a69a843c4edafdbdbada87a765971fe63d5015d
parenta132fef816606ebe9d20895b1535582bfede12a4 (diff)
[media] lgdt3306a: properly handle I/O errors
Fixes the following smatch errors: drivers/media/dvb-frontends/lgdt3306a.c: In function 'lgdt3306a_set_if': drivers/media/dvb-frontends/lgdt3306a.c:695:6: warning: variable 'ret' set but not used [-Wunused-but-set-variable] int ret; ^ drivers/media/dvb-frontends/lgdt3306a.c: In function 'lgdt3306a_monitor_vsb': drivers/media/dvb-frontends/lgdt3306a.c:1033:6: warning: variable 'ret' set but not used [-Wunused-but-set-variable] int ret; ^ drivers/media/dvb-frontends/lgdt3306a.c: In function 'lgdt3306a_check_oper_mode': drivers/media/dvb-frontends/lgdt3306a.c:1082:6: warning: variable 'ret' set but not used [-Wunused-but-set-variable] int ret; ^ drivers/media/dvb-frontends/lgdt3306a.c: In function 'lgdt3306a_check_lock_status': drivers/media/dvb-frontends/lgdt3306a.c:1109:6: warning: variable 'ret' set but not used [-Wunused-but-set-variable] int ret; ^ drivers/media/dvb-frontends/lgdt3306a.c: In function 'lgdt3306a_check_neverlock_status': drivers/media/dvb-frontends/lgdt3306a.c:1185:6: warning: variable 'ret' set but not used [-Wunused-but-set-variable] int ret; ^ drivers/media/dvb-frontends/lgdt3306a.c: In function 'lgdt3306a_pre_monitoring': drivers/media/dvb-frontends/lgdt3306a.c:1199:6: warning: variable 'ret' set but not used [-Wunused-but-set-variable] int ret; ^ drivers/media/dvb-frontends/lgdt3306a.c: In function 'lgdt3306a_get_packet_error': drivers/media/dvb-frontends/lgdt3306a.c:1310:6: warning: variable 'ret' set but not used [-Wunused-but-set-variable] int ret; ^ Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
-rw-r--r--drivers/media/dvb-frontends/lgdt3306a.c84
1 files changed, 79 insertions, 5 deletions
diff --git a/drivers/media/dvb-frontends/lgdt3306a.c b/drivers/media/dvb-frontends/lgdt3306a.c
index 92affe124a8d..d1a914de4180 100644
--- a/drivers/media/dvb-frontends/lgdt3306a.c
+++ b/drivers/media/dvb-frontends/lgdt3306a.c
@@ -734,7 +734,11 @@ static int lgdt3306a_set_if(struct lgdt3306a_state *state,
734 break; 734 break;
735 } 735 }
736 ret = lgdt3306a_write_reg(state, 0x0010, nco1); 736 ret = lgdt3306a_write_reg(state, 0x0010, nco1);
737 if (ret)
738 return ret;
737 ret = lgdt3306a_write_reg(state, 0x0011, nco2); 739 ret = lgdt3306a_write_reg(state, 0x0011, nco2);
740 if (ret)
741 return ret;
738 742
739 lg_dbg("if_freq=%d KHz->[%04x]\n", if_freq_khz, nco1<<8 | nco2); 743 lg_dbg("if_freq=%d KHz->[%04x]\n", if_freq_khz, nco1<<8 | nco2);
740 744
@@ -1027,7 +1031,7 @@ static enum dvbfe_algo lgdt3306a_get_frontend_algo(struct dvb_frontend *fe)
1027} 1031}
1028 1032
1029/* ------------------------------------------------------------------------ */ 1033/* ------------------------------------------------------------------------ */
1030static void lgdt3306a_monitor_vsb(struct lgdt3306a_state *state) 1034static int lgdt3306a_monitor_vsb(struct lgdt3306a_state *state)
1031{ 1035{
1032 u8 val; 1036 u8 val;
1033 int ret; 1037 int ret;
@@ -1035,16 +1039,27 @@ static void lgdt3306a_monitor_vsb(struct lgdt3306a_state *state)
1035 u16 fbDlyCir; 1039 u16 fbDlyCir;
1036 1040
1037 ret = lgdt3306a_read_reg(state, 0x21a1, &val); 1041 ret = lgdt3306a_read_reg(state, 0x21a1, &val);
1042 if (ret)
1043 return ret;
1038 snrRef = val & 0x3f; 1044 snrRef = val & 0x3f;
1039 1045
1040 ret = lgdt3306a_read_reg(state, 0x2185, &maxPowerMan); 1046 ret = lgdt3306a_read_reg(state, 0x2185, &maxPowerMan);
1047 if (ret)
1048 return ret;
1041 1049
1042 ret = lgdt3306a_read_reg(state, 0x2191, &val); 1050 ret = lgdt3306a_read_reg(state, 0x2191, &val);
1051 if (ret)
1052 return ret;
1043 nCombDet = (val & 0x80) >> 7; 1053 nCombDet = (val & 0x80) >> 7;
1044 1054
1045 ret = lgdt3306a_read_reg(state, 0x2180, &val); 1055 ret = lgdt3306a_read_reg(state, 0x2180, &val);
1056 if (ret)
1057 return ret;
1046 fbDlyCir = (val & 0x03) << 8; 1058 fbDlyCir = (val & 0x03) << 8;
1059
1047 ret = lgdt3306a_read_reg(state, 0x2181, &val); 1060 ret = lgdt3306a_read_reg(state, 0x2181, &val);
1061 if (ret)
1062 return ret;
1048 fbDlyCir |= val; 1063 fbDlyCir |= val;
1049 1064
1050 lg_dbg("snrRef=%d maxPowerMan=0x%x nCombDet=%d fbDlyCir=0x%x\n", 1065 lg_dbg("snrRef=%d maxPowerMan=0x%x nCombDet=%d fbDlyCir=0x%x\n",
@@ -1052,6 +1067,8 @@ static void lgdt3306a_monitor_vsb(struct lgdt3306a_state *state)
1052 1067
1053 /* Carrier offset sub loop bandwidth */ 1068 /* Carrier offset sub loop bandwidth */
1054 ret = lgdt3306a_read_reg(state, 0x1061, &val); 1069 ret = lgdt3306a_read_reg(state, 0x1061, &val);
1070 if (ret)
1071 return ret;
1055 val &= 0xf8; 1072 val &= 0xf8;
1056 if ((snrRef > 18) && (maxPowerMan > 0x68) && (nCombDet == 0x01) && ((fbDlyCir == 0x03FF) || (fbDlyCir < 0x6C))) { 1073 if ((snrRef > 18) && (maxPowerMan > 0x68) && (nCombDet == 0x01) && ((fbDlyCir == 0x03FF) || (fbDlyCir < 0x6C))) {
1057 /* SNR is over 18dB and no ghosting */ 1074 /* SNR is over 18dB and no ghosting */
@@ -1060,20 +1077,30 @@ static void lgdt3306a_monitor_vsb(struct lgdt3306a_state *state)
1060 val |= 0x04; /* final bandwidth = 4 */ 1077 val |= 0x04; /* final bandwidth = 4 */
1061 } 1078 }
1062 ret = lgdt3306a_write_reg(state, 0x1061, val); 1079 ret = lgdt3306a_write_reg(state, 0x1061, val);
1080 if (ret)
1081 return ret;
1063 1082
1064 /* Adjust Notch Filter */ 1083 /* Adjust Notch Filter */
1065 ret = lgdt3306a_read_reg(state, 0x0024, &val); 1084 ret = lgdt3306a_read_reg(state, 0x0024, &val);
1085 if (ret)
1086 return ret;
1066 val &= 0x0f; 1087 val &= 0x0f;
1067 if (nCombDet == 0) { /* Turn on the Notch Filter */ 1088 if (nCombDet == 0) { /* Turn on the Notch Filter */
1068 val |= 0x50; 1089 val |= 0x50;
1069 } 1090 }
1070 ret = lgdt3306a_write_reg(state, 0x0024, val); 1091 ret = lgdt3306a_write_reg(state, 0x0024, val);
1092 if (ret)
1093 return ret;
1071 1094
1072 /* VSB Timing Recovery output normalization */ 1095 /* VSB Timing Recovery output normalization */
1073 ret = lgdt3306a_read_reg(state, 0x103d, &val); 1096 ret = lgdt3306a_read_reg(state, 0x103d, &val);
1097 if (ret)
1098 return ret;
1074 val &= 0xcf; 1099 val &= 0xcf;
1075 val |= 0x20; 1100 val |= 0x20;
1076 ret = lgdt3306a_write_reg(state, 0x103d, val); 1101 ret = lgdt3306a_write_reg(state, 0x103d, val);
1102
1103 return ret;
1077} 1104}
1078 1105
1079static enum lgdt3306a_modulation lgdt3306a_check_oper_mode(struct lgdt3306a_state *state) 1106static enum lgdt3306a_modulation lgdt3306a_check_oper_mode(struct lgdt3306a_state *state)
@@ -1082,6 +1109,8 @@ static enum lgdt3306a_modulation lgdt3306a_check_oper_mode(struct lgdt3306a_stat
1082 int ret; 1109 int ret;
1083 1110
1084 ret = lgdt3306a_read_reg(state, 0x0081, &val); 1111 ret = lgdt3306a_read_reg(state, 0x0081, &val);
1112 if (ret)
1113 goto err;
1085 1114
1086 if (val & 0x80) { 1115 if (val & 0x80) {
1087 lg_dbg("VSB\n"); 1116 lg_dbg("VSB\n");
@@ -1089,6 +1118,8 @@ static enum lgdt3306a_modulation lgdt3306a_check_oper_mode(struct lgdt3306a_stat
1089 } 1118 }
1090 if (val & 0x08) { 1119 if (val & 0x08) {
1091 ret = lgdt3306a_read_reg(state, 0x00a6, &val); 1120 ret = lgdt3306a_read_reg(state, 0x00a6, &val);
1121 if (ret)
1122 goto err;
1092 val = val >> 2; 1123 val = val >> 2;
1093 if (val & 0x01) { 1124 if (val & 0x01) {
1094 lg_dbg("QAM256\n"); 1125 lg_dbg("QAM256\n");
@@ -1098,6 +1129,7 @@ static enum lgdt3306a_modulation lgdt3306a_check_oper_mode(struct lgdt3306a_stat
1098 return LG3306_QAM64; 1129 return LG3306_QAM64;
1099 } 1130 }
1100 } 1131 }
1132err:
1101 lg_warn("UNKNOWN\n"); 1133 lg_warn("UNKNOWN\n");
1102 return LG3306_UNKNOWN_MODE; 1134 return LG3306_UNKNOWN_MODE;
1103} 1135}
@@ -1116,6 +1148,8 @@ static enum lgdt3306a_lock_status lgdt3306a_check_lock_status(struct lgdt3306a_s
1116 case LG3306_SYNC_LOCK: 1148 case LG3306_SYNC_LOCK:
1117 { 1149 {
1118 ret = lgdt3306a_read_reg(state, 0x00a6, &val); 1150 ret = lgdt3306a_read_reg(state, 0x00a6, &val);
1151 if (ret)
1152 return ret;
1119 1153
1120 if ((val & 0x80) == 0x80) 1154 if ((val & 0x80) == 0x80)
1121 lockStatus = LG3306_LOCK; 1155 lockStatus = LG3306_LOCK;
@@ -1128,6 +1162,8 @@ static enum lgdt3306a_lock_status lgdt3306a_check_lock_status(struct lgdt3306a_s
1128 case LG3306_AGC_LOCK: 1162 case LG3306_AGC_LOCK:
1129 { 1163 {
1130 ret = lgdt3306a_read_reg(state, 0x0080, &val); 1164 ret = lgdt3306a_read_reg(state, 0x0080, &val);
1165 if (ret)
1166 return ret;
1131 1167
1132 if ((val & 0x40) == 0x40) 1168 if ((val & 0x40) == 0x40)
1133 lockStatus = LG3306_LOCK; 1169 lockStatus = LG3306_LOCK;
@@ -1142,6 +1178,8 @@ static enum lgdt3306a_lock_status lgdt3306a_check_lock_status(struct lgdt3306a_s
1142 modeOper = lgdt3306a_check_oper_mode(state); 1178 modeOper = lgdt3306a_check_oper_mode(state);
1143 if ((modeOper == LG3306_QAM64) || (modeOper == LG3306_QAM256)) { 1179 if ((modeOper == LG3306_QAM64) || (modeOper == LG3306_QAM256)) {
1144 ret = lgdt3306a_read_reg(state, 0x1094, &val); 1180 ret = lgdt3306a_read_reg(state, 0x1094, &val);
1181 if (ret)
1182 return ret;
1145 1183
1146 if ((val & 0x80) == 0x80) 1184 if ((val & 0x80) == 0x80)
1147 lockStatus = LG3306_LOCK; 1185 lockStatus = LG3306_LOCK;
@@ -1158,6 +1196,8 @@ static enum lgdt3306a_lock_status lgdt3306a_check_lock_status(struct lgdt3306a_s
1158 modeOper = lgdt3306a_check_oper_mode(state); 1196 modeOper = lgdt3306a_check_oper_mode(state);
1159 if ((modeOper == LG3306_QAM64) || (modeOper == LG3306_QAM256)) { 1197 if ((modeOper == LG3306_QAM64) || (modeOper == LG3306_QAM256)) {
1160 ret = lgdt3306a_read_reg(state, 0x0080, &val); 1198 ret = lgdt3306a_read_reg(state, 0x0080, &val);
1199 if (ret)
1200 return ret;
1161 1201
1162 if ((val & 0x10) == 0x10) 1202 if ((val & 0x10) == 0x10)
1163 lockStatus = LG3306_LOCK; 1203 lockStatus = LG3306_LOCK;
@@ -1186,6 +1226,8 @@ static enum lgdt3306a_neverlock_status lgdt3306a_check_neverlock_status(struct l
1186 enum lgdt3306a_neverlock_status lockStatus; 1226 enum lgdt3306a_neverlock_status lockStatus;
1187 1227
1188 ret = lgdt3306a_read_reg(state, 0x0080, &val); 1228 ret = lgdt3306a_read_reg(state, 0x0080, &val);
1229 if (ret)
1230 return ret;
1189 lockStatus = (enum lgdt3306a_neverlock_status)(val & 0x03); 1231 lockStatus = (enum lgdt3306a_neverlock_status)(val & 0x03);
1190 1232
1191 lg_dbg("NeverLock=%d", lockStatus); 1233 lg_dbg("NeverLock=%d", lockStatus);
@@ -1193,7 +1235,7 @@ static enum lgdt3306a_neverlock_status lgdt3306a_check_neverlock_status(struct l
1193 return lockStatus; 1235 return lockStatus;
1194} 1236}
1195 1237
1196static void lgdt3306a_pre_monitoring(struct lgdt3306a_state *state) 1238static int lgdt3306a_pre_monitoring(struct lgdt3306a_state *state)
1197{ 1239{
1198 u8 val = 0; 1240 u8 val = 0;
1199 int ret; 1241 int ret;
@@ -1201,16 +1243,24 @@ static void lgdt3306a_pre_monitoring(struct lgdt3306a_state *state)
1201 1243
1202 /* Channel variation */ 1244 /* Channel variation */
1203 ret = lgdt3306a_read_reg(state, 0x21bc, &currChDiffACQ); 1245 ret = lgdt3306a_read_reg(state, 0x21bc, &currChDiffACQ);
1246 if (ret)
1247 return ret;
1204 1248
1205 /* SNR of Frame sync */ 1249 /* SNR of Frame sync */
1206 ret = lgdt3306a_read_reg(state, 0x21a1, &val); 1250 ret = lgdt3306a_read_reg(state, 0x21a1, &val);
1251 if (ret)
1252 return ret;
1207 snrRef = val & 0x3f; 1253 snrRef = val & 0x3f;
1208 1254
1209 /* Strong Main CIR */ 1255 /* Strong Main CIR */
1210 ret = lgdt3306a_read_reg(state, 0x2199, &val); 1256 ret = lgdt3306a_read_reg(state, 0x2199, &val);
1257 if (ret)
1258 return ret;
1211 mainStrong = (val & 0x40) >> 6; 1259 mainStrong = (val & 0x40) >> 6;
1212 1260
1213 ret = lgdt3306a_read_reg(state, 0x0090, &val); 1261 ret = lgdt3306a_read_reg(state, 0x0090, &val);
1262 if (ret)
1263 return ret;
1214 aiccrejStatus = (val & 0xf0) >> 4; 1264 aiccrejStatus = (val & 0xf0) >> 4;
1215 1265
1216 lg_dbg("snrRef=%d mainStrong=%d aiccrejStatus=%d currChDiffACQ=0x%x\n", 1266 lg_dbg("snrRef=%d mainStrong=%d aiccrejStatus=%d currChDiffACQ=0x%x\n",
@@ -1221,30 +1271,50 @@ static void lgdt3306a_pre_monitoring(struct lgdt3306a_state *state)
1221#endif 1271#endif
1222 if (mainStrong == 0) { 1272 if (mainStrong == 0) {
1223 ret = lgdt3306a_read_reg(state, 0x2135, &val); 1273 ret = lgdt3306a_read_reg(state, 0x2135, &val);
1274 if (ret)
1275 return ret;
1224 val &= 0x0f; 1276 val &= 0x0f;
1225 val |= 0xa0; 1277 val |= 0xa0;
1226 ret = lgdt3306a_write_reg(state, 0x2135, val); 1278 ret = lgdt3306a_write_reg(state, 0x2135, val);
1279 if (ret)
1280 return ret;
1227 1281
1228 ret = lgdt3306a_read_reg(state, 0x2141, &val); 1282 ret = lgdt3306a_read_reg(state, 0x2141, &val);
1283 if (ret)
1284 return ret;
1229 val &= 0x3f; 1285 val &= 0x3f;
1230 val |= 0x80; 1286 val |= 0x80;
1231 ret = lgdt3306a_write_reg(state, 0x2141, val); 1287 ret = lgdt3306a_write_reg(state, 0x2141, val);
1288 if (ret)
1289 return ret;
1232 1290
1233 ret = lgdt3306a_write_reg(state, 0x2122, 0x70); 1291 ret = lgdt3306a_write_reg(state, 0x2122, 0x70);
1292 if (ret)
1293 return ret;
1234 } else { /* Weak ghost or static channel */ 1294 } else { /* Weak ghost or static channel */
1235 ret = lgdt3306a_read_reg(state, 0x2135, &val); 1295 ret = lgdt3306a_read_reg(state, 0x2135, &val);
1296 if (ret)
1297 return ret;
1236 val &= 0x0f; 1298 val &= 0x0f;
1237 val |= 0x70; 1299 val |= 0x70;
1238 ret = lgdt3306a_write_reg(state, 0x2135, val); 1300 ret = lgdt3306a_write_reg(state, 0x2135, val);
1301 if (ret)
1302 return ret;
1239 1303
1240 ret = lgdt3306a_read_reg(state, 0x2141, &val); 1304 ret = lgdt3306a_read_reg(state, 0x2141, &val);
1305 if (ret)
1306 return ret;
1241 val &= 0x3f; 1307 val &= 0x3f;
1242 val |= 0x40; 1308 val |= 0x40;
1243 ret = lgdt3306a_write_reg(state, 0x2141, val); 1309 ret = lgdt3306a_write_reg(state, 0x2141, val);
1310 if (ret)
1311 return ret;
1244 1312
1245 ret = lgdt3306a_write_reg(state, 0x2122, 0x40); 1313 ret = lgdt3306a_write_reg(state, 0x2122, 0x40);
1314 if (ret)
1315 return ret;
1246 } 1316 }
1247 1317 return 0;
1248} 1318}
1249 1319
1250static enum lgdt3306a_lock_status lgdt3306a_sync_lock_poll(struct lgdt3306a_state *state) 1320static enum lgdt3306a_lock_status lgdt3306a_sync_lock_poll(struct lgdt3306a_state *state)
@@ -1310,6 +1380,8 @@ static u8 lgdt3306a_get_packet_error(struct lgdt3306a_state *state)
1310 int ret; 1380 int ret;
1311 1381
1312 ret = lgdt3306a_read_reg(state, 0x00fa, &val); 1382 ret = lgdt3306a_read_reg(state, 0x00fa, &val);
1383 if (ret)
1384 return ret;
1313 1385
1314 return val; 1386 return val;
1315} 1387}
@@ -1393,7 +1465,9 @@ static enum lgdt3306a_lock_status lgdt3306a_vsb_lock_poll(struct lgdt3306a_state
1393 return LG3306_UNLOCK; 1465 return LG3306_UNLOCK;
1394 } else { 1466 } else {
1395 msleep(20); 1467 msleep(20);
1396 lgdt3306a_pre_monitoring(state); 1468 ret = lgdt3306a_pre_monitoring(state);
1469 if (ret)
1470 return LG3306_UNLOCK;
1397 1471
1398 packet_error = lgdt3306a_get_packet_error(state); 1472 packet_error = lgdt3306a_get_packet_error(state);
1399 snr = lgdt3306a_calculate_snr_x100(state); 1473 snr = lgdt3306a_calculate_snr_x100(state);
@@ -1483,7 +1557,7 @@ static int lgdt3306a_read_status(struct dvb_frontend *fe, fe_status_t *status)
1483 1557
1484 *status |= FE_HAS_LOCK; 1558 *status |= FE_HAS_LOCK;
1485 1559
1486 lgdt3306a_monitor_vsb(state); 1560 ret = lgdt3306a_monitor_vsb(state);
1487 } 1561 }
1488 break; 1562 break;
1489 default: 1563 default: