#include "ast_drv.h"
 MODULE_FIRMWARE("ast_dp501_fw.bin");
 
-int ast_load_dp501_microcode(struct drm_device *dev)
+static int ast_load_dp501_microcode(struct drm_device *dev)
 {
        struct ast_private *ast = dev->dev_private;
-       static char *fw_name = "ast_dp501_fw.bin";
-       int err;
-       err = request_firmware(&ast->dp501_fw, fw_name, dev->dev);
-       if (err)
-               return err;
 
-       return 0;
+       return request_firmware(&ast->dp501_fw, "ast_dp501_fw.bin", dev->dev);
 }
 
 static void send_ack(struct ast_private *ast)
        return false;
 }
 
-bool ast_launch_m68k(struct drm_device *dev)
+static bool ast_launch_m68k(struct drm_device *dev)
 {
        struct ast_private *ast = dev->dev_private;
        u32 i, data, len = 0;
                if (ast->dp501_fw_addr) {
                        fw_addr = ast->dp501_fw_addr;
                        len = 32*1024;
-               } else if (ast->dp501_fw) {
+               } else {
+                       if (!ast->dp501_fw &&
+                           ast_load_dp501_microcode(dev) < 0)
+                               return false;
+
                        fw_addr = (u8 *)ast->dp501_fw->data;
                        len = ast->dp501_fw->size;
                }
                }
        }
 }
+
+void ast_release_firmware(struct drm_device *dev)
+{
+       struct ast_private *ast = dev->dev_private;
+
+       release_firmware(ast->dp501_fw);
+       ast->dp501_fw = NULL;
+}
 
 u32 ast_mindwm(struct ast_private *ast, u32 r);
 void ast_moutdwm(struct ast_private *ast, u32 r, u32 v);
 /* ast dp501 */
-int ast_load_dp501_microcode(struct drm_device *dev);
 void ast_set_dp501_video_output(struct drm_device *dev, u8 mode);
-bool ast_launch_m68k(struct drm_device *dev);
 bool ast_backup_fw(struct drm_device *dev, u8 *addr, u32 size);
 bool ast_dp501_read_edid(struct drm_device *dev, u8 *ediddata);
 u8 ast_get_dp501_max_clk(struct drm_device *dev);
 void ast_init_3rdtx(struct drm_device *dev);
+void ast_release_firmware(struct drm_device *dev);
 #endif