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

[media] lmedm04: fix the range for relative measurements

Relative measurements are typically between 0 and 0xffff. However,
for some tuners (TUNER_S7395 and TUNER_S0194), the range were from
0 to 0xff00, with means that 100% is never archived.
Also, TUNER_RS2000 uses a more complex math.

So, create a macro that does the conversion using bit operations
and use it for all conversions.

The code is also easier to read with is a bonus.

While here, remove a bogus comment.

Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>

+8 -11
+8 -11
drivers/media/usb/dvb-usb-v2/lmedm04.c
··· 257 257 return ret; 258 258 } 259 259 260 + /* Convert range from 0x00-0xff to 0x0000-0xffff */ 261 + #define reg_to_16bits(x) ((x) | ((x) << 8)) 262 + 260 263 static void lme2510_update_stats(struct dvb_usb_adapter *adap) 261 264 { 262 265 struct lme2510_state *st = adap_to_priv(adap); ··· 291 288 292 289 switch (st->tuner_config) { 293 290 case TUNER_LG: 294 - s_tmp = 0xff - st->signal_level; 295 - s_tmp |= s_tmp << 8; 296 - 297 - c_tmp = 0xff - st->signal_sn; 298 - c_tmp |= c_tmp << 8; 291 + s_tmp = reg_to_16bits(0xff - st->signal_level); 292 + c_tmp = reg_to_16bits(0xff - st->signal_sn); 299 293 break; 300 - /* fall through */ 301 294 case TUNER_S7395: 302 295 case TUNER_S0194: 303 296 s_tmp = 0xffff - (((st->signal_level * 2) << 8) * 5 / 4); 304 - 305 - c_tmp = ((0xff - st->signal_sn - 0xa1) * 3) << 8; 297 + c_tmp = reg_to_16bits((0xff - st->signal_sn - 0xa1) * 3); 306 298 break; 307 299 case TUNER_RS2000: 308 - s_tmp = st->signal_level * 0xffff / 0xff; 309 - 310 - c_tmp = st->signal_sn * 0xffff / 0x7f; 300 + s_tmp = reg_to_16bits(st->signal_level); 301 + c_tmp = reg_to_16bits(st->signal_sn); 311 302 } 312 303 313 304 c->strength.len = 1;