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

[media] m88ds3103: use jiffies when polling DiSEqC TX ready

Use jiffies to set timeout for DiSEqC TX ready polling. Using jiffies
is more elegant solution than looping N times with sleep.

Signed-off-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>

authored by

Antti Palosaari and committed by
Mauro Carvalho Chehab
befa0cc1 ce80d713

+34 -19
+34 -19
drivers/media/dvb-frontends/m88ds3103.c
··· 1195 1195 struct dvb_diseqc_master_cmd *diseqc_cmd) 1196 1196 { 1197 1197 struct m88ds3103_priv *priv = fe->demodulator_priv; 1198 - int ret, i; 1198 + int ret; 1199 + unsigned long timeout; 1199 1200 u8 u8tmp; 1200 1201 1201 1202 dev_dbg(&priv->i2c->dev, "%s: msg=%*ph\n", __func__, ··· 1227 1226 if (ret) 1228 1227 goto err; 1229 1228 1230 - /* DiSEqC message typical period is 54 ms */ 1231 - usleep_range(40000, 60000); 1232 - 1233 1229 /* wait DiSEqC TX ready */ 1234 - for (i = 20, u8tmp = 1; i && u8tmp; i--) { 1235 - usleep_range(5000, 10000); 1230 + #define SEND_MASTER_CMD_TIMEOUT 120 1231 + timeout = jiffies + msecs_to_jiffies(SEND_MASTER_CMD_TIMEOUT); 1236 1232 1233 + /* DiSEqC message typical period is 54 ms */ 1234 + usleep_range(50000, 54000); 1235 + 1236 + for (u8tmp = 1; !time_after(jiffies, timeout) && u8tmp;) { 1237 1237 ret = m88ds3103_rd_reg_mask(priv, 0xa1, &u8tmp, 0x40); 1238 1238 if (ret) 1239 1239 goto err; 1240 1240 } 1241 1241 1242 - dev_dbg(&priv->i2c->dev, "%s: loop=%d\n", __func__, i); 1243 - 1244 - if (i == 0) { 1242 + if (u8tmp == 0) { 1243 + dev_dbg(&priv->i2c->dev, "%s: diseqc tx took %u ms\n", __func__, 1244 + jiffies_to_msecs(jiffies) - 1245 + (jiffies_to_msecs(timeout) - SEND_MASTER_CMD_TIMEOUT)); 1246 + } else { 1245 1247 dev_dbg(&priv->i2c->dev, "%s: diseqc tx timeout\n", __func__); 1246 1248 1247 1249 ret = m88ds3103_wr_reg_mask(priv, 0xa1, 0x40, 0xc0); ··· 1256 1252 if (ret) 1257 1253 goto err; 1258 1254 1259 - if (i == 0) { 1255 + if (u8tmp == 1) { 1260 1256 ret = -ETIMEDOUT; 1261 1257 goto err; 1262 1258 } ··· 1271 1267 fe_sec_mini_cmd_t fe_sec_mini_cmd) 1272 1268 { 1273 1269 struct m88ds3103_priv *priv = fe->demodulator_priv; 1274 - int ret, i; 1270 + int ret; 1271 + unsigned long timeout; 1275 1272 u8 u8tmp, burst; 1276 1273 1277 1274 dev_dbg(&priv->i2c->dev, "%s: fe_sec_mini_cmd=%d\n", __func__, ··· 1306 1301 if (ret) 1307 1302 goto err; 1308 1303 1309 - /* DiSEqC ToneBurst period is 12.5 ms */ 1310 - usleep_range(11000, 20000); 1311 - 1312 1304 /* wait DiSEqC TX ready */ 1313 - for (i = 5, u8tmp = 1; i && u8tmp; i--) { 1314 - usleep_range(800, 2000); 1305 + #define SEND_BURST_TIMEOUT 40 1306 + timeout = jiffies + msecs_to_jiffies(SEND_BURST_TIMEOUT); 1315 1307 1308 + /* DiSEqC ToneBurst period is 12.5 ms */ 1309 + usleep_range(8500, 12500); 1310 + 1311 + for (u8tmp = 1; !time_after(jiffies, timeout) && u8tmp;) { 1316 1312 ret = m88ds3103_rd_reg_mask(priv, 0xa1, &u8tmp, 0x40); 1317 1313 if (ret) 1318 1314 goto err; 1319 1315 } 1320 1316 1321 - dev_dbg(&priv->i2c->dev, "%s: loop=%d\n", __func__, i); 1317 + if (u8tmp == 0) { 1318 + dev_dbg(&priv->i2c->dev, "%s: diseqc tx took %u ms\n", __func__, 1319 + jiffies_to_msecs(jiffies) - 1320 + (jiffies_to_msecs(timeout) - SEND_BURST_TIMEOUT)); 1321 + } else { 1322 + dev_dbg(&priv->i2c->dev, "%s: diseqc tx timeout\n", __func__); 1323 + 1324 + ret = m88ds3103_wr_reg_mask(priv, 0xa1, 0x40, 0xc0); 1325 + if (ret) 1326 + goto err; 1327 + } 1322 1328 1323 1329 ret = m88ds3103_wr_reg_mask(priv, 0xa2, 0x80, 0xc0); 1324 1330 if (ret) 1325 1331 goto err; 1326 1332 1327 - if (i == 0) { 1328 - dev_dbg(&priv->i2c->dev, "%s: diseqc tx timeout\n", __func__); 1333 + if (u8tmp == 1) { 1329 1334 ret = -ETIMEDOUT; 1330 1335 goto err; 1331 1336 }