aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb-frontends/dib8000.c
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@osg.samsung.com>2016-02-04 09:58:30 -0500
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>2016-02-04 13:27:30 -0500
commit7e3e68bcfd7713fb1470070c8fa0f108609dd76b (patch)
tree1a7a0ef4f5fe4b31a5f4fc99dcb0c0cd1923e481 /drivers/media/dvb-frontends/dib8000.c
parenta7497049841f04712ad525969e5eb4a42b5a1704 (diff)
[media] dvb_frontend: pass the props cache to get_frontend() as arg
Instead of using the DTV properties cache directly, pass the get frontend data as an argument. For now, everything should remain the same, but the next patch will prevent get_frontend to affect the global cache. This is needed because several drivers don't care enough to only change the properties if locked. Due to that, calling G_PROPERTY before locking on those drivers will make them to never lock. Ok, those drivers are crap and should never be merged like that, but the core should not rely that the drivers would be doing the right thing. Reviewed-by: Michael Ira Krufky <mkrufky@linuxtv.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
Diffstat (limited to 'drivers/media/dvb-frontends/dib8000.c')
-rw-r--r--drivers/media/dvb-frontends/dib8000.c75
1 files changed, 38 insertions, 37 deletions
diff --git a/drivers/media/dvb-frontends/dib8000.c b/drivers/media/dvb-frontends/dib8000.c
index 349d2f1f62ce..ddf9c44877a2 100644
--- a/drivers/media/dvb-frontends/dib8000.c
+++ b/drivers/media/dvb-frontends/dib8000.c
@@ -3382,14 +3382,15 @@ static int dib8000_sleep(struct dvb_frontend *fe)
3382 3382
3383static int dib8000_read_status(struct dvb_frontend *fe, enum fe_status *stat); 3383static int dib8000_read_status(struct dvb_frontend *fe, enum fe_status *stat);
3384 3384
3385static int dib8000_get_frontend(struct dvb_frontend *fe) 3385static int dib8000_get_frontend(struct dvb_frontend *fe,
3386 struct dtv_frontend_properties *c)
3386{ 3387{
3387 struct dib8000_state *state = fe->demodulator_priv; 3388 struct dib8000_state *state = fe->demodulator_priv;
3388 u16 i, val = 0; 3389 u16 i, val = 0;
3389 enum fe_status stat = 0; 3390 enum fe_status stat = 0;
3390 u8 index_frontend, sub_index_frontend; 3391 u8 index_frontend, sub_index_frontend;
3391 3392
3392 fe->dtv_property_cache.bandwidth_hz = 6000000; 3393 c->bandwidth_hz = 6000000;
3393 3394
3394 /* 3395 /*
3395 * If called to early, get_frontend makes dib8000_tune to either 3396 * If called to early, get_frontend makes dib8000_tune to either
@@ -3406,7 +3407,7 @@ static int dib8000_get_frontend(struct dvb_frontend *fe)
3406 if (stat&FE_HAS_SYNC) { 3407 if (stat&FE_HAS_SYNC) {
3407 dprintk("TMCC lock on the slave%i", index_frontend); 3408 dprintk("TMCC lock on the slave%i", index_frontend);
3408 /* synchronize the cache with the other frontends */ 3409 /* synchronize the cache with the other frontends */
3409 state->fe[index_frontend]->ops.get_frontend(state->fe[index_frontend]); 3410 state->fe[index_frontend]->ops.get_frontend(state->fe[index_frontend], c);
3410 for (sub_index_frontend = 0; (sub_index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[sub_index_frontend] != NULL); sub_index_frontend++) { 3411 for (sub_index_frontend = 0; (sub_index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[sub_index_frontend] != NULL); sub_index_frontend++) {
3411 if (sub_index_frontend != index_frontend) { 3412 if (sub_index_frontend != index_frontend) {
3412 state->fe[sub_index_frontend]->dtv_property_cache.isdbt_sb_mode = state->fe[index_frontend]->dtv_property_cache.isdbt_sb_mode; 3413 state->fe[sub_index_frontend]->dtv_property_cache.isdbt_sb_mode = state->fe[index_frontend]->dtv_property_cache.isdbt_sb_mode;
@@ -3426,57 +3427,57 @@ static int dib8000_get_frontend(struct dvb_frontend *fe)
3426 } 3427 }
3427 } 3428 }
3428 3429
3429 fe->dtv_property_cache.isdbt_sb_mode = dib8000_read_word(state, 508) & 0x1; 3430 c->isdbt_sb_mode = dib8000_read_word(state, 508) & 0x1;
3430 3431
3431 if (state->revision == 0x8090) 3432 if (state->revision == 0x8090)
3432 val = dib8000_read_word(state, 572); 3433 val = dib8000_read_word(state, 572);
3433 else 3434 else
3434 val = dib8000_read_word(state, 570); 3435 val = dib8000_read_word(state, 570);
3435 fe->dtv_property_cache.inversion = (val & 0x40) >> 6; 3436 c->inversion = (val & 0x40) >> 6;
3436 switch ((val & 0x30) >> 4) { 3437 switch ((val & 0x30) >> 4) {
3437 case 1: 3438 case 1:
3438 fe->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_2K; 3439 c->transmission_mode = TRANSMISSION_MODE_2K;
3439 dprintk("dib8000_get_frontend: transmission mode 2K"); 3440 dprintk("dib8000_get_frontend: transmission mode 2K");
3440 break; 3441 break;
3441 case 2: 3442 case 2:
3442 fe->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_4K; 3443 c->transmission_mode = TRANSMISSION_MODE_4K;
3443 dprintk("dib8000_get_frontend: transmission mode 4K"); 3444 dprintk("dib8000_get_frontend: transmission mode 4K");
3444 break; 3445 break;
3445 case 3: 3446 case 3:
3446 default: 3447 default:
3447 fe->dtv_property_cache.transmission_mode = TRANSMISSION_MODE_8K; 3448 c->transmission_mode = TRANSMISSION_MODE_8K;
3448 dprintk("dib8000_get_frontend: transmission mode 8K"); 3449 dprintk("dib8000_get_frontend: transmission mode 8K");
3449 break; 3450 break;
3450 } 3451 }
3451 3452
3452 switch (val & 0x3) { 3453 switch (val & 0x3) {
3453 case 0: 3454 case 0:
3454 fe->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_32; 3455 c->guard_interval = GUARD_INTERVAL_1_32;
3455 dprintk("dib8000_get_frontend: Guard Interval = 1/32 "); 3456 dprintk("dib8000_get_frontend: Guard Interval = 1/32 ");
3456 break; 3457 break;
3457 case 1: 3458 case 1:
3458 fe->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_16; 3459 c->guard_interval = GUARD_INTERVAL_1_16;
3459 dprintk("dib8000_get_frontend: Guard Interval = 1/16 "); 3460 dprintk("dib8000_get_frontend: Guard Interval = 1/16 ");
3460 break; 3461 break;
3461 case 2: 3462 case 2:
3462 dprintk("dib8000_get_frontend: Guard Interval = 1/8 "); 3463 dprintk("dib8000_get_frontend: Guard Interval = 1/8 ");
3463 fe->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_8; 3464 c->guard_interval = GUARD_INTERVAL_1_8;
3464 break; 3465 break;
3465 case 3: 3466 case 3:
3466 dprintk("dib8000_get_frontend: Guard Interval = 1/4 "); 3467 dprintk("dib8000_get_frontend: Guard Interval = 1/4 ");
3467 fe->dtv_property_cache.guard_interval = GUARD_INTERVAL_1_4; 3468 c->guard_interval = GUARD_INTERVAL_1_4;
3468 break; 3469 break;
3469 } 3470 }
3470 3471
3471 val = dib8000_read_word(state, 505); 3472 val = dib8000_read_word(state, 505);
3472 fe->dtv_property_cache.isdbt_partial_reception = val & 1; 3473 c->isdbt_partial_reception = val & 1;
3473 dprintk("dib8000_get_frontend: partial_reception = %d ", fe->dtv_property_cache.isdbt_partial_reception); 3474 dprintk("dib8000_get_frontend: partial_reception = %d ", c->isdbt_partial_reception);
3474 3475
3475 for (i = 0; i < 3; i++) { 3476 for (i = 0; i < 3; i++) {
3476 int show; 3477 int show;
3477 3478
3478 val = dib8000_read_word(state, 493 + i) & 0x0f; 3479 val = dib8000_read_word(state, 493 + i) & 0x0f;
3479 fe->dtv_property_cache.layer[i].segment_count = val; 3480 c->layer[i].segment_count = val;
3480 3481
3481 if (val == 0 || val > 13) 3482 if (val == 0 || val > 13)
3482 show = 0; 3483 show = 0;
@@ -3485,41 +3486,41 @@ static int dib8000_get_frontend(struct dvb_frontend *fe)
3485 3486
3486 if (show) 3487 if (show)
3487 dprintk("dib8000_get_frontend: Layer %d segments = %d ", 3488 dprintk("dib8000_get_frontend: Layer %d segments = %d ",
3488 i, fe->dtv_property_cache.layer[i].segment_count); 3489 i, c->layer[i].segment_count);
3489 3490
3490 val = dib8000_read_word(state, 499 + i) & 0x3; 3491 val = dib8000_read_word(state, 499 + i) & 0x3;
3491 /* Interleaving can be 0, 1, 2 or 4 */ 3492 /* Interleaving can be 0, 1, 2 or 4 */
3492 if (val == 3) 3493 if (val == 3)
3493 val = 4; 3494 val = 4;
3494 fe->dtv_property_cache.layer[i].interleaving = val; 3495 c->layer[i].interleaving = val;
3495 if (show) 3496 if (show)
3496 dprintk("dib8000_get_frontend: Layer %d time_intlv = %d ", 3497 dprintk("dib8000_get_frontend: Layer %d time_intlv = %d ",
3497 i, fe->dtv_property_cache.layer[i].interleaving); 3498 i, c->layer[i].interleaving);
3498 3499
3499 val = dib8000_read_word(state, 481 + i); 3500 val = dib8000_read_word(state, 481 + i);
3500 switch (val & 0x7) { 3501 switch (val & 0x7) {
3501 case 1: 3502 case 1:
3502 fe->dtv_property_cache.layer[i].fec = FEC_1_2; 3503 c->layer[i].fec = FEC_1_2;
3503 if (show) 3504 if (show)
3504 dprintk("dib8000_get_frontend: Layer %d Code Rate = 1/2 ", i); 3505 dprintk("dib8000_get_frontend: Layer %d Code Rate = 1/2 ", i);
3505 break; 3506 break;
3506 case 2: 3507 case 2:
3507 fe->dtv_property_cache.layer[i].fec = FEC_2_3; 3508 c->layer[i].fec = FEC_2_3;
3508 if (show) 3509 if (show)
3509 dprintk("dib8000_get_frontend: Layer %d Code Rate = 2/3 ", i); 3510 dprintk("dib8000_get_frontend: Layer %d Code Rate = 2/3 ", i);
3510 break; 3511 break;
3511 case 3: 3512 case 3:
3512 fe->dtv_property_cache.layer[i].fec = FEC_3_4; 3513 c->layer[i].fec = FEC_3_4;
3513 if (show) 3514 if (show)
3514 dprintk("dib8000_get_frontend: Layer %d Code Rate = 3/4 ", i); 3515 dprintk("dib8000_get_frontend: Layer %d Code Rate = 3/4 ", i);
3515 break; 3516 break;
3516 case 5: 3517 case 5:
3517 fe->dtv_property_cache.layer[i].fec = FEC_5_6; 3518 c->layer[i].fec = FEC_5_6;
3518 if (show) 3519 if (show)
3519 dprintk("dib8000_get_frontend: Layer %d Code Rate = 5/6 ", i); 3520 dprintk("dib8000_get_frontend: Layer %d Code Rate = 5/6 ", i);
3520 break; 3521 break;
3521 default: 3522 default:
3522 fe->dtv_property_cache.layer[i].fec = FEC_7_8; 3523 c->layer[i].fec = FEC_7_8;
3523 if (show) 3524 if (show)
3524 dprintk("dib8000_get_frontend: Layer %d Code Rate = 7/8 ", i); 3525 dprintk("dib8000_get_frontend: Layer %d Code Rate = 7/8 ", i);
3525 break; 3526 break;
@@ -3528,23 +3529,23 @@ static int dib8000_get_frontend(struct dvb_frontend *fe)
3528 val = dib8000_read_word(state, 487 + i); 3529 val = dib8000_read_word(state, 487 + i);
3529 switch (val & 0x3) { 3530 switch (val & 0x3) {
3530 case 0: 3531 case 0:
3531 fe->dtv_property_cache.layer[i].modulation = DQPSK; 3532 c->layer[i].modulation = DQPSK;
3532 if (show) 3533 if (show)
3533 dprintk("dib8000_get_frontend: Layer %d DQPSK ", i); 3534 dprintk("dib8000_get_frontend: Layer %d DQPSK ", i);
3534 break; 3535 break;
3535 case 1: 3536 case 1:
3536 fe->dtv_property_cache.layer[i].modulation = QPSK; 3537 c->layer[i].modulation = QPSK;
3537 if (show) 3538 if (show)
3538 dprintk("dib8000_get_frontend: Layer %d QPSK ", i); 3539 dprintk("dib8000_get_frontend: Layer %d QPSK ", i);
3539 break; 3540 break;
3540 case 2: 3541 case 2:
3541 fe->dtv_property_cache.layer[i].modulation = QAM_16; 3542 c->layer[i].modulation = QAM_16;
3542 if (show) 3543 if (show)
3543 dprintk("dib8000_get_frontend: Layer %d QAM16 ", i); 3544 dprintk("dib8000_get_frontend: Layer %d QAM16 ", i);
3544 break; 3545 break;
3545 case 3: 3546 case 3:
3546 default: 3547 default:
3547 fe->dtv_property_cache.layer[i].modulation = QAM_64; 3548 c->layer[i].modulation = QAM_64;
3548 if (show) 3549 if (show)
3549 dprintk("dib8000_get_frontend: Layer %d QAM64 ", i); 3550 dprintk("dib8000_get_frontend: Layer %d QAM64 ", i);
3550 break; 3551 break;
@@ -3553,16 +3554,16 @@ static int dib8000_get_frontend(struct dvb_frontend *fe)
3553 3554
3554 /* synchronize the cache with the other frontends */ 3555 /* synchronize the cache with the other frontends */
3555 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) { 3556 for (index_frontend = 1; (index_frontend < MAX_NUMBER_OF_FRONTENDS) && (state->fe[index_frontend] != NULL); index_frontend++) {
3556 state->fe[index_frontend]->dtv_property_cache.isdbt_sb_mode = fe->dtv_property_cache.isdbt_sb_mode; 3557 state->fe[index_frontend]->dtv_property_cache.isdbt_sb_mode = c->isdbt_sb_mode;
3557 state->fe[index_frontend]->dtv_property_cache.inversion = fe->dtv_property_cache.inversion; 3558 state->fe[index_frontend]->dtv_property_cache.inversion = c->inversion;
3558 state->fe[index_frontend]->dtv_property_cache.transmission_mode = fe->dtv_property_cache.transmission_mode; 3559 state->fe[index_frontend]->dtv_property_cache.transmission_mode = c->transmission_mode;
3559 state->fe[index_frontend]->dtv_property_cache.guard_interval = fe->dtv_property_cache.guard_interval; 3560 state->fe[index_frontend]->dtv_property_cache.guard_interval = c->guard_interval;
3560 state->fe[index_frontend]->dtv_property_cache.isdbt_partial_reception = fe->dtv_property_cache.isdbt_partial_reception; 3561 state->fe[index_frontend]->dtv_property_cache.isdbt_partial_reception = c->isdbt_partial_reception;
3561 for (i = 0; i < 3; i++) { 3562 for (i = 0; i < 3; i++) {
3562 state->fe[index_frontend]->dtv_property_cache.layer[i].segment_count = fe->dtv_property_cache.layer[i].segment_count; 3563 state->fe[index_frontend]->dtv_property_cache.layer[i].segment_count = c->layer[i].segment_count;
3563 state->fe[index_frontend]->dtv_property_cache.layer[i].interleaving = fe->dtv_property_cache.layer[i].interleaving; 3564 state->fe[index_frontend]->dtv_property_cache.layer[i].interleaving = c->layer[i].interleaving;
3564 state->fe[index_frontend]->dtv_property_cache.layer[i].fec = fe->dtv_property_cache.layer[i].fec; 3565 state->fe[index_frontend]->dtv_property_cache.layer[i].fec = c->layer[i].fec;
3565 state->fe[index_frontend]->dtv_property_cache.layer[i].modulation = fe->dtv_property_cache.layer[i].modulation; 3566 state->fe[index_frontend]->dtv_property_cache.layer[i].modulation = c->layer[i].modulation;
3566 } 3567 }
3567 } 3568 }
3568 return 0; 3569 return 0;
@@ -3671,7 +3672,7 @@ static int dib8000_set_frontend(struct dvb_frontend *fe)
3671 if (state->channel_parameters_set == 0) { /* searching */ 3672 if (state->channel_parameters_set == 0) { /* searching */
3672 if ((dib8000_get_status(state->fe[index_frontend]) == FE_STATUS_DEMOD_SUCCESS) || (dib8000_get_status(state->fe[index_frontend]) == FE_STATUS_FFT_SUCCESS)) { 3673 if ((dib8000_get_status(state->fe[index_frontend]) == FE_STATUS_DEMOD_SUCCESS) || (dib8000_get_status(state->fe[index_frontend]) == FE_STATUS_FFT_SUCCESS)) {
3673 dprintk("autosearch succeeded on fe%i", index_frontend); 3674 dprintk("autosearch succeeded on fe%i", index_frontend);
3674 dib8000_get_frontend(state->fe[index_frontend]); /* we read the channel parameters from the frontend which was successful */ 3675 dib8000_get_frontend(state->fe[index_frontend], c); /* we read the channel parameters from the frontend which was successful */
3675 state->channel_parameters_set = 1; 3676 state->channel_parameters_set = 1;
3676 3677
3677 for (l = 0; (l < MAX_NUMBER_OF_FRONTENDS) && (state->fe[l] != NULL); l++) { 3678 for (l = 0; (l < MAX_NUMBER_OF_FRONTENDS) && (state->fe[l] != NULL); l++) {