linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / drivers / media / dvb / frontends / tda1004x.c
index b83dafa..8e8df7b 100644 (file)
@@ -52,6 +52,7 @@ struct tda1004x_state {
        struct dvb_frontend frontend;
 
        /* private demod data */
+       u8 initialised;
        enum tda1004x_demod demod_type;
 };
 
@@ -593,6 +594,9 @@ static int tda10045_init(struct dvb_frontend* fe)
 
        dprintk("%s\n", __FUNCTION__);
 
+       if (state->initialised)
+               return 0;
+
        if (tda10045_fwupload(fe)) {
                printk("tda1004x: firmware upload failed\n");
                return -EIO;
@@ -622,6 +626,7 @@ static int tda10045_init(struct dvb_frontend* fe)
 
        tda1004x_write_mask(state, 0x1f, 0x01, state->config->invert_oclk);
 
+       state->initialised = 1;
        return 0;
 }
 
@@ -630,6 +635,9 @@ static int tda10046_init(struct dvb_frontend* fe)
        struct tda1004x_state* state = fe->demodulator_priv;
        dprintk("%s\n", __FUNCTION__);
 
+       if (state->initialised)
+               return 0;
+
        if (tda10046_fwupload(fe)) {
                printk("tda1004x: firmware upload failed\n");
                        return -EIO;
@@ -689,6 +697,7 @@ static int tda10046_init(struct dvb_frontend* fe)
        // tda1004x_write_mask(state, 0x50, 0x80, 0x80);         // handle out of guard echoes
        tda1004x_write_mask(state, 0x3a, 0x80, state->config->invert_oclk << 7);
 
+       state->initialised = 1;
        return 0;
 }
 
@@ -1198,6 +1207,7 @@ static int tda1004x_sleep(struct dvb_frontend* fe)
                tda1004x_write_mask(state, TDA1004X_CONFC4, 1, 1);
                break;
        }
+       state->initialised = 0;
 
        return 0;
 }
@@ -1261,6 +1271,7 @@ struct dvb_frontend* tda10045_attach(const struct tda1004x_config* config,
        state->config = config;
        state->i2c = i2c;
        memcpy(&state->ops, &tda10045_ops, sizeof(struct dvb_frontend_ops));
+       state->initialised = 0;
        state->demod_type = TDA1004X_DEMOD_TDA10045;
 
        /* check if the demod is there */
@@ -1319,6 +1330,7 @@ struct dvb_frontend* tda10046_attach(const struct tda1004x_config* config,
        state->config = config;
        state->i2c = i2c;
        memcpy(&state->ops, &tda10046_ops, sizeof(struct dvb_frontend_ops));
+       state->initialised = 0;
        state->demod_type = TDA1004X_DEMOD_TDA10046;
 
        /* check if the demod is there */