[media] stv090x: set status bits when there is no lock
authorGuy Martin <gmsoft@tuxicoman.be>
Wed, 1 Jun 2011 14:25:16 +0000 (11:25 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sun, 25 Sep 2011 11:45:18 +0000 (08:45 -0300)
Currently, the stv090x driver only set the status bits to SCVYL when
there is a lock. This patch set the right bits even if there is no lock.

Signed-off-by: Guy Martin <gmsoft@tuxicoman.be>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/dvb/frontends/stv090x.c

index 52d8712411e5ce1672a75202efc64d499821e8a1..ebda41936b9094b3cc3259231337c507dd474360 100644 (file)
@@ -3463,9 +3463,15 @@ static enum dvbfe_search stv090x_search(struct dvb_frontend *fe, struct dvb_fron
 static int stv090x_read_status(struct dvb_frontend *fe, enum fe_status *status)
 {
        struct stv090x_state *state = fe->demodulator_priv;
-       u32 reg;
+       u32 reg, dstatus;
        u8 search_state;
 
+       *status = 0;
+
+       dstatus = STV090x_READ_DEMOD(state, DSTATUS);
+       if (STV090x_GETFIELD_Px(dstatus, CAR_LOCK_FIELD))
+               *status |= FE_HAS_SIGNAL | FE_HAS_CARRIER;
+
        reg = STV090x_READ_DEMOD(state, DMDSTATE);
        search_state = STV090x_GETFIELD_Px(reg, HEADER_MODE_FIELD);
 
@@ -3474,41 +3480,30 @@ static int stv090x_read_status(struct dvb_frontend *fe, enum fe_status *status)
        case 1: /* first PLH detected */
        default:
                dprintk(FE_DEBUG, 1, "Status: Unlocked (Searching ..)");
-               *status = 0;
                break;
 
        case 2: /* DVB-S2 mode */
                dprintk(FE_DEBUG, 1, "Delivery system: DVB-S2");
-               reg = STV090x_READ_DEMOD(state, DSTATUS);
-               if (STV090x_GETFIELD_Px(reg, LOCK_DEFINITIF_FIELD)) {
+               if (STV090x_GETFIELD_Px(dstatus, LOCK_DEFINITIF_FIELD)) {
                        reg = STV090x_READ_DEMOD(state, PDELSTATUS1);
                        if (STV090x_GETFIELD_Px(reg, PKTDELIN_LOCK_FIELD)) {
+                               *status |= FE_HAS_VITERBI;
                                reg = STV090x_READ_DEMOD(state, TSSTATUS);
-                               if (STV090x_GETFIELD_Px(reg, TSFIFO_LINEOK_FIELD)) {
-                                       *status = FE_HAS_SIGNAL |
-                                                 FE_HAS_CARRIER |
-                                                 FE_HAS_VITERBI |
-                                                 FE_HAS_SYNC |
-                                                 FE_HAS_LOCK;
-                               }
+                               if (STV090x_GETFIELD_Px(reg, TSFIFO_LINEOK_FIELD))
+                                       *status |= FE_HAS_SYNC | FE_HAS_LOCK;
                        }
                }
                break;
 
        case 3: /* DVB-S1/legacy mode */
                dprintk(FE_DEBUG, 1, "Delivery system: DVB-S");
-               reg = STV090x_READ_DEMOD(state, DSTATUS);
-               if (STV090x_GETFIELD_Px(reg, LOCK_DEFINITIF_FIELD)) {
+               if (STV090x_GETFIELD_Px(dstatus, LOCK_DEFINITIF_FIELD)) {
                        reg = STV090x_READ_DEMOD(state, VSTATUSVIT);
                        if (STV090x_GETFIELD_Px(reg, LOCKEDVIT_FIELD)) {
+                               *status |= FE_HAS_VITERBI;
                                reg = STV090x_READ_DEMOD(state, TSSTATUS);
-                               if (STV090x_GETFIELD_Px(reg, TSFIFO_LINEOK_FIELD)) {
-                                       *status = FE_HAS_SIGNAL |
-                                                 FE_HAS_CARRIER |
-                                                 FE_HAS_VITERBI |
-                                                 FE_HAS_SYNC |
-                                                 FE_HAS_LOCK;
-                               }
+                               if (STV090x_GETFIELD_Px(reg, TSFIFO_LINEOK_FIELD))
+                                       *status |= FE_HAS_SYNC | FE_HAS_LOCK;
                        }
                }
                break;