Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / drivers / media / dvb / ttusb-dec / ttusbdecfe.c
index 1699cc9..a5a4617 100644 (file)
@@ -42,8 +42,39 @@ struct ttusbdecfe_state {
 
 static int ttusbdecfe_read_status(struct dvb_frontend* fe, fe_status_t* status)
 {
-       *status = FE_HAS_SIGNAL | FE_HAS_VITERBI |
-                 FE_HAS_SYNC | FE_HAS_CARRIER | FE_HAS_LOCK;
+       struct ttusbdecfe_state* state = fe->demodulator_priv;
+       u8 b[] = { 0x00, 0x00, 0x00, 0x00,
+                  0x00, 0x00, 0x00, 0x00 };
+       u8 result[4];
+       int len, ret;
+
+       *status=0;
+
+       ret=state->config->send_command(fe, 0x73, sizeof(b), b, &len, result);
+       if(ret)
+               return ret;
+
+       if(len != 4) {
+               printk(KERN_ERR "%s: unexpected reply\n", __FUNCTION__);
+               return -EIO;
+       }
+
+       switch(result[3]) {
+               case 1:  /* not tuned yet */
+               case 2:  /* no signal/no lock*/
+                       break;
+               case 3:  /* signal found and locked*/
+                       *status = FE_HAS_SIGNAL | FE_HAS_VITERBI |
+                       FE_HAS_SYNC | FE_HAS_CARRIER | FE_HAS_LOCK;
+                       break;
+               case 4:
+                       *status = FE_TIMEDOUT;
+                       break;
+               default:
+                       pr_info("%s: returned unknown value: %d\n",
+                               __FUNCTION__, result[3]);
+                       return -EIO;
+       }
 
        return 0;
 }
@@ -64,6 +95,16 @@ static int ttusbdecfe_dvbt_set_frontend(struct dvb_frontend* fe, struct dvb_fron
        return 0;
 }
 
+static int ttusbdecfe_dvbt_get_tune_settings(struct dvb_frontend* fe,
+                                       struct dvb_frontend_tune_settings* fesettings)
+{
+               fesettings->min_delay_ms = 1500;
+               /* Drift compensation makes no sense for DVB-T */
+               fesettings->step_size = 0;
+               fesettings->max_drift = 0;
+               return 0;
+}
+
 static int ttusbdecfe_dvbs_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters *p)
 {
        struct ttusbdecfe_state* state = (struct ttusbdecfe_state*) fe->demodulator_priv;
@@ -157,7 +198,8 @@ struct dvb_frontend* ttusbdecfe_dvbt_attach(const struct ttusbdecfe_config* conf
 
        /* allocate memory for the internal state */
        state = (struct ttusbdecfe_state*) kmalloc(sizeof(struct ttusbdecfe_state), GFP_KERNEL);
-       if (state == NULL) goto error;
+       if (state == NULL)
+               return NULL;
 
        /* setup the state */
        state->config = config;
@@ -167,10 +209,6 @@ struct dvb_frontend* ttusbdecfe_dvbt_attach(const struct ttusbdecfe_config* conf
        state->frontend.ops = &state->ops;
        state->frontend.demodulator_priv = state;
        return &state->frontend;
-
-error:
-       kfree(state);
-       return NULL;
 }
 
 static struct dvb_frontend_ops ttusbdecfe_dvbs_ops;
@@ -181,7 +219,8 @@ struct dvb_frontend* ttusbdecfe_dvbs_attach(const struct ttusbdecfe_config* conf
 
        /* allocate memory for the internal state */
        state = (struct ttusbdecfe_state*) kmalloc(sizeof(struct ttusbdecfe_state), GFP_KERNEL);
-       if (state == NULL) goto error;
+       if (state == NULL)
+               return NULL;
 
        /* setup the state */
        state->config = config;
@@ -193,10 +232,6 @@ struct dvb_frontend* ttusbdecfe_dvbs_attach(const struct ttusbdecfe_config* conf
        state->frontend.ops = &state->ops;
        state->frontend.demodulator_priv = state;
        return &state->frontend;
-
-error:
-       kfree(state);
-       return NULL;
 }
 
 static struct dvb_frontend_ops ttusbdecfe_dvbt_ops = {
@@ -218,6 +253,8 @@ static struct dvb_frontend_ops ttusbdecfe_dvbt_ops = {
 
        .set_frontend = ttusbdecfe_dvbt_set_frontend,
 
+       .get_tune_settings = ttusbdecfe_dvbt_get_tune_settings,
+
        .read_status = ttusbdecfe_read_status,
 };
 
@@ -229,11 +266,11 @@ static struct dvb_frontend_ops ttusbdecfe_dvbs_ops = {
                .frequency_min          = 950000,
                .frequency_max          = 2150000,
                .frequency_stepsize     = 125,
+               .symbol_rate_min        = 1000000,  /* guessed */
+               .symbol_rate_max        = 45000000, /* guessed */
                .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
                        FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
-                       FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
-                       FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO |
-                       FE_CAN_HIERARCHY_AUTO,
+                       FE_CAN_QPSK
        },
 
        .release = ttusbdecfe_release,