struct dvb_frontend *fe;
        struct delayed_work timer_sleep;
 
-       const struct firmware   *firmware;
+       bool inited;
 };
 
 /* Misc Defines */
        if (!force && xc5000_is_firmware_loaded(fe) == 0)
                return 0;
 
-       if (!priv->firmware) {
-               ret = request_firmware(&fw, desired_fw->name,
-                                       priv->i2c_props.adap->dev.parent);
-               if (ret) {
-                       pr_err("xc5000: Upload failed. rc %d\n", ret);
-                       return ret;
-               }
-               dprintk(1, "firmware read %zu bytes.\n", fw->size);
+       ret = request_firmware(&fw, desired_fw->name,
+                              priv->i2c_props.adap->dev.parent);
+       if (ret) {
+               pr_err("xc5000: Upload failed. rc %d\n", ret);
+               return ret;
+       }
+       dprintk(1, "firmware read %zu bytes.\n", fw->size);
 
-               if (fw->size != desired_fw->size) {
-                       pr_err("xc5000: Firmware file with incorrect size\n");
-                       release_firmware(fw);
-                       return -EINVAL;
-               }
-               priv->firmware = fw;
-       } else
-               fw = priv->firmware;
+       if (fw->size != desired_fw->size) {
+               pr_err("xc5000: Firmware file with incorrect size\n");
+               release_firmware(fw);
+               return -EINVAL;
+       }
 
        /* Try up to 5 times to load firmware */
        for (i = 0; i < 5; i++) {
        }
 
 err:
+       release_firmware(fw);
        if (!ret)
                printk(KERN_INFO "xc5000: Firmware %s loaded and running.\n",
                       desired_fw->name);
 
        /* suspended before firmware is loaded.
           Avoid firmware load in resume path. */
-       if (!priv->firmware)
+       if (!priv->inited)
                return 0;
 
        return xc5000_set_params(fe);
        if (debug)
                xc_debug_dump(priv);
 
+       priv->inited = true;
+
        return 0;
 }
 
 
        if (priv) {
                cancel_delayed_work(&priv->timer_sleep);
-               if (priv->firmware) {
-                       release_firmware(priv->firmware);
-                       priv->firmware = NULL;
-               }
                hybrid_tuner_release_state(priv);
        }