linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / drivers / media / dvb / frontends / or51211.c
index 2bf124b..7c3aed1 100644 (file)
@@ -54,6 +54,7 @@ static u8 cmd_buf[] = {0x04,0x01,0x50,0x80,0x06}; // ATSC
 struct or51211_state {
 
        struct i2c_adapter* i2c;
+       struct dvb_frontend_ops ops;
 
        /* Configuration settings */
        const struct or51211_config* config;
@@ -437,10 +438,10 @@ static int or51211_init(struct dvb_frontend* fe)
                }
 
                ret = or51211_load_firmware(fe, fw);
-               release_firmware(fw);
                if (ret) {
                        printk(KERN_WARNING "or51211: Writing firmware to "
                               "device failed!\n");
+                       release_firmware(fw);
                        return ret;
                }
                printk(KERN_INFO "or51211: Firmware upload complete.\n");
@@ -584,11 +585,12 @@ struct dvb_frontend* or51211_attach(const struct or51211_config* config,
        /* Setup the state */
        state->config = config;
        state->i2c = i2c;
+       memcpy(&state->ops, &or51211_ops, sizeof(struct dvb_frontend_ops));
        state->initialized = 0;
        state->current_frequency = 0;
 
        /* Create dvb_frontend */
-       memcpy(&state->frontend.ops, &or51211_ops, sizeof(struct dvb_frontend_ops));
+       state->frontend.ops = &state->ops;
        state->frontend.demodulator_priv = state;
        return &state->frontend;