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

[media] mn88473: refactor and fix statistics

Remove DVB-T2 BER as it does not work at all and I didn't find
how to fix.

Fix DVB-T and DVB-C BER. It seems to return new some realistic
looking values.

Use (1 << 24) base for CNR calculations to keep it in line with
dvb logarithm functions.

Move all statistic logic to mn88473_read_status() function.

Use regmap_bulk_read() for reading multiple registers as a one go.

Many more and less minor changes.

Cc: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
Signed-off-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>

authored by

Antti Palosaari and committed by
Mauro Carvalho Chehab
69ace6ee 61393b07

+177 -416
+176 -416
drivers/media/dvb-frontends/mn88473.c
··· 234 234 return ret; 235 235 } 236 236 237 - static int mn88473_update_ber_stat_t_c(struct dvb_frontend *fe, 238 - enum fe_status *status) 239 - { 240 - struct i2c_client *client = fe->demodulator_priv; 241 - struct mn88473_dev *dev = i2c_get_clientdata(client); 242 - struct dtv_frontend_properties *c = &fe->dtv_property_cache; 243 - int ret; 244 - u64 total; 245 - unsigned int uitmp, value, errors; 246 - 247 - if (*status & FE_HAS_LOCK) { 248 - ret = regmap_read(dev->regmap[0], 0x5b, &value); 249 - if (ret) 250 - goto err; 251 - 252 - ret = regmap_read(dev->regmap[0], 0xdf, &uitmp); 253 - if (ret) 254 - goto err; 255 - 256 - value &= uitmp; 257 - ret = regmap_write(dev->regmap[0], 0x5b, value); 258 - if (ret) 259 - goto err; 260 - 261 - ret = regmap_read(dev->regmap[0], 0x60, &value); 262 - if (ret) 263 - goto err; 264 - 265 - value &= 0xf0; 266 - value |= 0x5; 267 - ret = regmap_write(dev->regmap[0], 0x60, value); 268 - if (ret) 269 - goto err; 270 - 271 - ret = regmap_read(dev->regmap[0], 0x92, &uitmp); 272 - if (ret) 273 - goto err; 274 - 275 - errors = uitmp << 16; 276 - 277 - ret = regmap_read(dev->regmap[0], 0x93, &uitmp); 278 - if (ret) 279 - goto err; 280 - 281 - errors |= uitmp << 8; 282 - 283 - ret = regmap_read(dev->regmap[0], 0x94, &uitmp); 284 - if (ret) 285 - goto err; 286 - 287 - errors |= uitmp; 288 - 289 - ret = regmap_read(dev->regmap[0], 0x95, &uitmp); 290 - if (ret) 291 - goto err; 292 - 293 - total = uitmp << 8; 294 - 295 - ret = regmap_read(dev->regmap[0], 0x96, &uitmp); 296 - if (ret) 297 - goto err; 298 - 299 - total |= uitmp; 300 - 301 - /* probably: (bytes -> bit) * (sizeof(TS packet) - 1) */ 302 - total *= 8 * 203; 303 - 304 - c->post_bit_error.stat[0].scale = FE_SCALE_COUNTER; 305 - c->post_bit_error.stat[0].uvalue += errors; 306 - c->post_bit_count.stat[0].scale = FE_SCALE_COUNTER; 307 - c->post_bit_count.stat[0].uvalue += total; 308 - } else { 309 - c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 310 - c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 311 - } 312 - 313 - return 0; 314 - 315 - err: 316 - dev_dbg(&client->dev, "%s failed=%d\n", __func__, ret); 317 - return ret; 318 - } 319 - 320 - static int mn88473_update_ber_stat_t2(struct dvb_frontend *fe, 321 - enum fe_status *status) 322 - { 323 - struct i2c_client *client = fe->demodulator_priv; 324 - struct mn88473_dev *dev = i2c_get_clientdata(client); 325 - struct dtv_frontend_properties *c = &fe->dtv_property_cache; 326 - int ret; 327 - u64 total; 328 - unsigned int uitmp, value, berlen, fec_type_m, errors; 329 - static u16 fec_type_m_tbl0[] = { 330 - 32400, 38880, 43200, 48600, 51840, 54000, 0 331 - }; 332 - static u16 fec_type_m_tbl1[] = { 333 - 28800, 38880, 43200, 47520, 50400, 53280, 0 334 - }; 335 - 336 - if (*status & FE_HAS_LOCK) { 337 - ret = regmap_read(dev->regmap[2], 0x82, &value); 338 - if (ret) 339 - goto err; 340 - 341 - value |= 0x20; 342 - value &= 0xef; 343 - ret = regmap_write(dev->regmap[2], 0x82, value); 344 - if (ret) 345 - goto err; 346 - 347 - ret = regmap_read(dev->regmap[2], 0xba, &uitmp); 348 - if (ret) 349 - goto err; 350 - 351 - errors = uitmp << 16; 352 - 353 - ret = regmap_read(dev->regmap[2], 0xbb, &uitmp); 354 - if (ret) 355 - goto err; 356 - 357 - errors |= uitmp << 8; 358 - 359 - ret = regmap_read(dev->regmap[2], 0xbc, &uitmp); 360 - if (ret) 361 - goto err; 362 - 363 - errors |= uitmp; 364 - 365 - ret = regmap_read(dev->regmap[2], 0x83, &berlen); 366 - if (ret) 367 - goto err; 368 - 369 - ret = regmap_write(dev->regmap[2], 0xc0, 0x3); 370 - if (ret) 371 - goto err; 372 - 373 - /* berlen[4:2] are the index in fec_type_m_tbl */ 374 - uitmp = (berlen >> 2) & 0x7; 375 - 376 - if (BIT(0) & berlen) 377 - fec_type_m = fec_type_m_tbl0[uitmp]; 378 - else 379 - fec_type_m = fec_type_m_tbl1[uitmp]; 380 - 381 - total = ((berlen & 0xff) << 1) * fec_type_m; 382 - 383 - c->post_bit_error.stat[0].scale = FE_SCALE_COUNTER; 384 - c->post_bit_error.stat[0].uvalue += errors; 385 - c->post_bit_count.stat[0].scale = FE_SCALE_COUNTER; 386 - c->post_bit_count.stat[0].uvalue += total; 387 - } else { 388 - c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 389 - c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 390 - } 391 - 392 - return 0; 393 - 394 - err: 395 - dev_dbg(&client->dev, "%s failed=%d\n", __func__, ret); 396 - return ret; 397 - } 398 - 399 - static inline u32 log10times1000(u32 value) 400 - { 401 - return (1000L * intlog10(value)) >> 24; 402 - } 403 - 404 - static int mn88473_read_status_t(struct dvb_frontend *fe, 405 - enum fe_status *status) 406 - { 407 - struct i2c_client *client = fe->demodulator_priv; 408 - struct mn88473_dev *dev = i2c_get_clientdata(client); 409 - struct dtv_frontend_properties *c = &fe->dtv_property_cache; 410 - int ret; 411 - s32 cnr; 412 - unsigned int uitmp, tmp_upper, tmp_lower; 413 - 414 - ret = regmap_read(dev->regmap[0], 0x62, &uitmp); 415 - if (ret) 416 - goto err; 417 - 418 - if (!(uitmp & 0xa0)) { 419 - if ((uitmp & 0x0f) >= 0x09) 420 - *status = FE_HAS_SIGNAL | FE_HAS_CARRIER | 421 - FE_HAS_VITERBI | FE_HAS_SYNC | 422 - FE_HAS_LOCK; 423 - else if ((uitmp & 0x0f) >= 0x03) 424 - *status = FE_HAS_SIGNAL | FE_HAS_CARRIER; 425 - } 426 - 427 - /* CNR */ 428 - if (*status & FE_HAS_VITERBI) { 429 - ret = regmap_read(dev->regmap[0], 0x8f, &tmp_upper); 430 - if (ret) 431 - goto err; 432 - 433 - ret = regmap_read(dev->regmap[0], 0x90, &tmp_lower); 434 - if (ret) 435 - goto err; 436 - 437 - uitmp = (tmp_upper << 8) | tmp_lower; 438 - if (uitmp) { 439 - cnr = log10times1000(65536); 440 - cnr -= log10times1000(uitmp); 441 - cnr += 200; 442 - } else 443 - cnr = 0; 444 - 445 - if (cnr < 0) 446 - cnr = 0; 447 - 448 - c->cnr.stat[0].svalue = cnr * 10; 449 - c->cnr.stat[0].scale = FE_SCALE_DECIBEL; 450 - } else { 451 - c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 452 - } 453 - 454 - /* BER */ 455 - ret = mn88473_update_ber_stat_t_c(fe, status); 456 - if (ret) 457 - goto err; 458 - 459 - return 0; 460 - 461 - err: 462 - dev_dbg(&client->dev, "%s failed=%d\n", __func__, ret); 463 - return ret; 464 - } 465 - 466 - static int mn88473_read_status_t2(struct dvb_frontend *fe, 467 - enum fe_status *status) 468 - { 469 - struct i2c_client *client = fe->demodulator_priv; 470 - struct mn88473_dev *dev = i2c_get_clientdata(client); 471 - struct dtv_frontend_properties *c = &fe->dtv_property_cache; 472 - int ret; 473 - s32 cnr; 474 - unsigned int uitmp, tmp_upper, tmp_lower, flag; 475 - 476 - ret = regmap_read(dev->regmap[2], 0x8b, &uitmp); 477 - if (ret) 478 - goto err; 479 - 480 - if (!(uitmp & 0x40)) { 481 - if ((uitmp & 0x0f) >= 0x0d) 482 - *status = FE_HAS_SIGNAL | FE_HAS_CARRIER | 483 - FE_HAS_VITERBI | FE_HAS_SYNC | 484 - FE_HAS_LOCK; 485 - else if ((uitmp & 0x0f) >= 0x0a) 486 - *status = FE_HAS_SIGNAL | FE_HAS_CARRIER | 487 - FE_HAS_VITERBI; 488 - else if ((uitmp & 0x0f) >= 0x07) 489 - *status = FE_HAS_SIGNAL | FE_HAS_CARRIER; 490 - } 491 - 492 - /* CNR */ 493 - if (*status & FE_HAS_VITERBI) { 494 - ret = regmap_read(dev->regmap[2], 0xb7, &flag); 495 - if (ret) 496 - goto err; 497 - 498 - ret = regmap_read(dev->regmap[2], 0xb8, &tmp_upper); 499 - if (ret) 500 - goto err; 501 - 502 - ret = regmap_read(dev->regmap[2], 0xb9, &tmp_lower); 503 - if (ret) 504 - goto err; 505 - 506 - uitmp = (tmp_upper << 8) | tmp_lower; 507 - if (uitmp) { 508 - if (flag & BIT(2)) { 509 - /* MISO */ 510 - cnr = log10times1000(16384); 511 - cnr -= log10times1000(uitmp); 512 - cnr -= 600; 513 - } else { 514 - /* SISO */ 515 - cnr = log10times1000(65536); 516 - cnr -= log10times1000(uitmp); 517 - cnr += 200; 518 - } 519 - } else 520 - cnr = 0; 521 - 522 - if (cnr < 0) 523 - cnr = 0; 524 - 525 - c->cnr.stat[0].svalue = cnr * 10; 526 - c->cnr.stat[0].scale = FE_SCALE_DECIBEL; 527 - } else { 528 - c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 529 - } 530 - 531 - /* BER */ 532 - ret = mn88473_update_ber_stat_t2(fe, status); 533 - if (ret) 534 - goto err; 535 - 536 - return 0; 537 - 538 - err: 539 - dev_dbg(&client->dev, "%s failed=%d\n", __func__, ret); 540 - return ret; 541 - } 542 - 543 - static int mn88473_read_status_c(struct dvb_frontend *fe, 544 - enum fe_status *status) 545 - { 546 - struct i2c_client *client = fe->demodulator_priv; 547 - struct mn88473_dev *dev = i2c_get_clientdata(client); 548 - struct dtv_frontend_properties *c = &fe->dtv_property_cache; 549 - int ret; 550 - unsigned int uitmp, tmp_upper, tmp_lower, signal, noise; 551 - 552 - ret = regmap_read(dev->regmap[1], 0x85, &uitmp); 553 - if (ret) 554 - goto err; 555 - 556 - if (!(uitmp & 0x40)) { 557 - ret = regmap_read(dev->regmap[1], 0x89, &uitmp); 558 - if (ret) 559 - goto err; 560 - 561 - if (uitmp & 0x01) 562 - *status = FE_HAS_SIGNAL | FE_HAS_CARRIER | 563 - FE_HAS_VITERBI | FE_HAS_SYNC | 564 - FE_HAS_LOCK; 565 - } 566 - 567 - /* CNR */ 568 - if (*status & FE_HAS_VITERBI) { 569 - ret = regmap_read(dev->regmap[1], 0xa1, &tmp_upper); 570 - if (ret) 571 - goto err; 572 - 573 - ret = regmap_read(dev->regmap[1], 0xa2, &tmp_lower); 574 - if (ret) 575 - goto err; 576 - 577 - signal = (tmp_upper << 8) | tmp_lower; 578 - 579 - ret = regmap_read(dev->regmap[1], 0xa3, &tmp_upper); 580 - if (ret) 581 - goto err; 582 - 583 - ret = regmap_read(dev->regmap[1], 0xa4, &tmp_lower); 584 - if (ret) 585 - goto err; 586 - 587 - noise = (tmp_upper << 8) | tmp_lower; 588 - if (noise) 589 - uitmp = log10times1000(signal * 8 / noise); 590 - else 591 - uitmp = 0; 592 - 593 - c->cnr.stat[0].svalue = uitmp * 10; 594 - c->cnr.stat[0].scale = FE_SCALE_DECIBEL; 595 - } else { 596 - c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 597 - } 598 - 599 - /* BER */ 600 - ret = mn88473_update_ber_stat_t_c(fe, status); 601 - if (ret) 602 - goto err; 603 - 604 - return 0; 605 - 606 - err: 607 - dev_dbg(&client->dev, "%s failed=%d\n", __func__, ret); 608 - return ret; 609 - } 610 - 611 237 static int mn88473_read_status(struct dvb_frontend *fe, enum fe_status *status) 612 238 { 613 239 struct i2c_client *client = fe->demodulator_priv; 614 240 struct mn88473_dev *dev = i2c_get_clientdata(client); 615 241 struct dtv_frontend_properties *c = &fe->dtv_property_cache; 616 - int ret; 617 - u16 errors, per_len; 618 - unsigned int upper, lower; 242 + int ret, i, stmp; 243 + unsigned int utmp, utmp1, utmp2; 244 + u8 buf[5]; 619 245 620 246 if (!dev->active) { 621 247 ret = -EAGAIN; 622 248 goto err; 623 249 } 624 250 625 - *status = 0; 626 - 251 + /* Lock detection */ 627 252 switch (c->delivery_system) { 628 253 case SYS_DVBT: 629 - ret = mn88473_read_status_t(fe, status); 254 + ret = regmap_read(dev->regmap[0], 0x62, &utmp); 255 + if (ret) 256 + goto err; 257 + 258 + if (!(utmp & 0xa0)) { 259 + if ((utmp & 0x0f) >= 0x09) 260 + *status = FE_HAS_SIGNAL | FE_HAS_CARRIER | 261 + FE_HAS_VITERBI | FE_HAS_SYNC | 262 + FE_HAS_LOCK; 263 + else if ((utmp & 0x0f) >= 0x03) 264 + *status = FE_HAS_SIGNAL | FE_HAS_CARRIER; 265 + } else { 266 + *status = 0; 267 + } 630 268 break; 631 269 case SYS_DVBT2: 632 - ret = mn88473_read_status_t2(fe, status); 270 + ret = regmap_read(dev->regmap[2], 0x8b, &utmp); 271 + if (ret) 272 + goto err; 273 + 274 + if (!(utmp & 0x40)) { 275 + if ((utmp & 0x0f) >= 0x0d) 276 + *status = FE_HAS_SIGNAL | FE_HAS_CARRIER | 277 + FE_HAS_VITERBI | FE_HAS_SYNC | 278 + FE_HAS_LOCK; 279 + else if ((utmp & 0x0f) >= 0x0a) 280 + *status = FE_HAS_SIGNAL | FE_HAS_CARRIER | 281 + FE_HAS_VITERBI; 282 + else if ((utmp & 0x0f) >= 0x07) 283 + *status = FE_HAS_SIGNAL | FE_HAS_CARRIER; 284 + } else { 285 + *status = 0; 286 + } 633 287 break; 634 288 case SYS_DVBC_ANNEX_A: 635 - ret = mn88473_read_status_c(fe, status); 289 + ret = regmap_read(dev->regmap[1], 0x85, &utmp); 290 + if (ret) 291 + goto err; 292 + 293 + if (!(utmp & 0x40)) { 294 + ret = regmap_read(dev->regmap[1], 0x89, &utmp); 295 + if (ret) 296 + goto err; 297 + 298 + if (utmp & 0x01) 299 + *status = FE_HAS_SIGNAL | FE_HAS_CARRIER | 300 + FE_HAS_VITERBI | FE_HAS_SYNC | 301 + FE_HAS_LOCK; 302 + } else { 303 + *status = 0; 304 + } 636 305 break; 637 306 default: 638 307 ret = -EINVAL; 639 - break; 308 + goto err; 640 309 } 641 310 642 - if (ret) 643 - goto err; 644 - 645 - /* signal strength, derived from AGC */ 311 + /* Signal strength */ 646 312 if (*status & FE_HAS_SIGNAL) { 647 - ret = regmap_read(dev->regmap[2], 0x86, &upper); 648 - if (ret) 649 - goto err; 650 - 651 - ret = regmap_read(dev->regmap[2], 0x87, &lower); 652 - if (ret) 653 - goto err; 313 + for (i = 0; i < 2; i++) { 314 + ret = regmap_bulk_read(dev->regmap[2], 0x86 + i, 315 + &buf[i], 1); 316 + if (ret) 317 + goto err; 318 + } 654 319 655 320 /* AGCRD[15:6] gives us a 10bit value ([5:0] are always 0) */ 321 + utmp1 = buf[0] << 8 | buf[1] << 0 | buf[0] >> 2; 322 + dev_dbg(&client->dev, "strength=%u\n", utmp1); 323 + 656 324 c->strength.stat[0].scale = FE_SCALE_RELATIVE; 657 - c->strength.stat[0].uvalue = (upper << 8) | lower; 325 + c->strength.stat[0].uvalue = utmp1; 658 326 } else { 659 327 c->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 660 328 } 661 329 330 + /* CNR */ 331 + if (*status & FE_HAS_VITERBI && c->delivery_system == SYS_DVBT) { 332 + /* DVB-T CNR */ 333 + ret = regmap_bulk_read(dev->regmap[0], 0x8f, buf, 2); 334 + if (ret) 335 + goto err; 336 + 337 + utmp = buf[0] << 8 | buf[1] << 0; 338 + if (utmp) { 339 + /* CNR[dB]: 10 * (log10(65536 / value) + 0.2) */ 340 + /* log10(65536) = 80807124, 0.2 = 3355443 */ 341 + stmp = div_u64(((u64)80807124 - intlog10(utmp) 342 + + 3355443) * 10000, 1 << 24); 343 + dev_dbg(&client->dev, "cnr=%d value=%u\n", stmp, utmp); 344 + } else { 345 + stmp = 0; 346 + } 347 + 348 + c->cnr.stat[0].svalue = stmp; 349 + c->cnr.stat[0].scale = FE_SCALE_DECIBEL; 350 + } else if (*status & FE_HAS_VITERBI && 351 + c->delivery_system == SYS_DVBT2) { 352 + /* DVB-T2 CNR */ 353 + for (i = 0; i < 3; i++) { 354 + ret = regmap_bulk_read(dev->regmap[2], 0xb7 + i, 355 + &buf[i], 1); 356 + if (ret) 357 + goto err; 358 + } 359 + 360 + utmp = buf[1] << 8 | buf[2] << 0; 361 + utmp1 = (buf[0] >> 2) & 0x01; /* 0=SISO, 1=MISO */ 362 + if (utmp) { 363 + if (utmp1) { 364 + /* CNR[dB]: 10 * (log10(16384 / value) - 0.6) */ 365 + /* log10(16384) = 70706234, 0.6 = 10066330 */ 366 + stmp = div_u64(((u64)70706234 - intlog10(utmp) 367 + - 10066330) * 10000, 1 << 24); 368 + dev_dbg(&client->dev, "cnr=%d value=%u MISO\n", 369 + stmp, utmp); 370 + } else { 371 + /* CNR[dB]: 10 * (log10(65536 / value) + 0.2) */ 372 + /* log10(65536) = 80807124, 0.2 = 3355443 */ 373 + stmp = div_u64(((u64)80807124 - intlog10(utmp) 374 + + 3355443) * 10000, 1 << 24); 375 + dev_dbg(&client->dev, "cnr=%d value=%u SISO\n", 376 + stmp, utmp); 377 + } 378 + } else { 379 + stmp = 0; 380 + } 381 + 382 + c->cnr.stat[0].svalue = stmp; 383 + c->cnr.stat[0].scale = FE_SCALE_DECIBEL; 384 + } else if (*status & FE_HAS_VITERBI && 385 + c->delivery_system == SYS_DVBC_ANNEX_A) { 386 + /* DVB-C CNR */ 387 + ret = regmap_bulk_read(dev->regmap[1], 0xa1, buf, 4); 388 + if (ret) 389 + goto err; 390 + 391 + utmp1 = buf[0] << 8 | buf[1] << 0; /* signal */ 392 + utmp2 = buf[2] << 8 | buf[3] << 0; /* noise */ 393 + if (utmp1 && utmp2) { 394 + /* CNR[dB]: 10 * log10(8 * (signal / noise)) */ 395 + /* log10(8) = 15151336 */ 396 + stmp = div_u64(((u64)15151336 + intlog10(utmp1) 397 + - intlog10(utmp2)) * 10000, 1 << 24); 398 + dev_dbg(&client->dev, "cnr=%d signal=%u noise=%u\n", 399 + stmp, utmp1, utmp2); 400 + } else { 401 + stmp = 0; 402 + } 403 + 404 + c->cnr.stat[0].svalue = stmp; 405 + c->cnr.stat[0].scale = FE_SCALE_DECIBEL; 406 + } else { 407 + c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 408 + } 409 + 410 + /* BER */ 411 + if (*status & FE_HAS_LOCK && (c->delivery_system == SYS_DVBT || 412 + c->delivery_system == SYS_DVBC_ANNEX_A)) { 413 + /* DVB-T & DVB-C BER */ 414 + ret = regmap_bulk_read(dev->regmap[0], 0x92, buf, 5); 415 + if (ret) 416 + goto err; 417 + 418 + utmp1 = buf[0] << 16 | buf[1] << 8 | buf[2] << 0; 419 + utmp2 = buf[3] << 8 | buf[4] << 0; 420 + utmp2 = utmp2 * 8 * 204; 421 + dev_dbg(&client->dev, "post_bit_error=%u post_bit_count=%u\n", 422 + utmp1, utmp2); 423 + 424 + c->post_bit_error.stat[0].scale = FE_SCALE_COUNTER; 425 + c->post_bit_error.stat[0].uvalue += utmp1; 426 + c->post_bit_count.stat[0].scale = FE_SCALE_COUNTER; 427 + c->post_bit_count.stat[0].uvalue += utmp2; 428 + } else { 429 + c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 430 + c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 431 + } 432 + 662 433 /* PER */ 663 434 if (*status & FE_HAS_LOCK) { 664 - ret = regmap_read(dev->regmap[0], 0xdd, &upper); 435 + ret = regmap_bulk_read(dev->regmap[0], 0xdd, buf, 4); 665 436 if (ret) 666 437 goto err; 667 438 668 - ret = regmap_read(dev->regmap[0], 0xde, &lower); 669 - if (ret) 670 - goto err; 671 - 672 - errors = (upper << 8) | lower; 673 - 674 - ret = regmap_read(dev->regmap[0], 0xdf, &upper); 675 - if (ret) 676 - goto err; 677 - 678 - ret = regmap_read(dev->regmap[0], 0xe0, &lower); 679 - if (ret) 680 - goto err; 681 - 682 - per_len = (upper << 8) | lower; 439 + utmp1 = buf[0] << 8 | buf[1] << 0; 440 + utmp2 = buf[2] << 8 | buf[3] << 0; 441 + dev_dbg(&client->dev, "block_error=%u block_count=%u\n", 442 + utmp1, utmp2); 683 443 684 444 c->block_error.stat[0].scale = FE_SCALE_COUNTER; 685 - c->block_error.stat[0].uvalue += errors; 445 + c->block_error.stat[0].uvalue += utmp1; 686 446 c->block_count.stat[0].scale = FE_SCALE_COUNTER; 687 - c->block_count.stat[0].uvalue += per_len; 447 + c->block_count.stat[0].uvalue += utmp2; 688 448 } else { 689 - c->block_error.stat[0].scale = FE_SCALE_COUNTER; 690 - c->block_count.stat[0].scale = FE_SCALE_COUNTER; 449 + c->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 450 + c->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; 691 451 } 692 452 693 453 return 0; 694 454 err: 695 - dev_dbg(&client->dev, "%s failed=%d\n", __func__, ret); 455 + dev_dbg(&client->dev, "failed=%d\n", ret); 696 456 return ret; 697 457 } 698 458
+1
drivers/media/dvb-frontends/mn88473_priv.h
··· 20 20 #include "dvb_frontend.h" 21 21 #include "dvb_math.h" 22 22 #include "mn88473.h" 23 + #include <linux/math64.h> 23 24 #include <linux/firmware.h> 24 25 #include <linux/regmap.h> 25 26