aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEgbert Eich <eich@suse.de>2017-07-18 10:47:40 -0400
committerDave Airlie <airlied@redhat.com>2017-08-01 22:13:16 -0400
commit12f8030e05c6c24b89b38838fe22257a9b5331f9 (patch)
tree28049cf39662718cc26f299f824526aab8667aa4
parentab209c32f5df862d7255640ad61d1d293299f2d7 (diff)
drm/ast: Actually load DP501 firmware when required
The ast driver has a code to load the DP501 firmware, but it's never used. This patch implements its actual usage by requesting the firmware on demand, and release the firmware at exit as well. Also the path contains a few cleanups and makes relevant functions static. Signed-off-by: Egbert Eich <eich@suse.de> Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r--drivers/gpu/drm/ast/ast_dp501.c25
-rw-r--r--drivers/gpu/drm/ast/ast_drv.h3
-rw-r--r--drivers/gpu/drm/ast/ast_main.c1
3 files changed, 18 insertions, 11 deletions
diff --git a/drivers/gpu/drm/ast/ast_dp501.c b/drivers/gpu/drm/ast/ast_dp501.c
index 76f07f38b941..749646ae365f 100644
--- a/drivers/gpu/drm/ast/ast_dp501.c
+++ b/drivers/gpu/drm/ast/ast_dp501.c
@@ -4,16 +4,11 @@
4#include "ast_drv.h" 4#include "ast_drv.h"
5MODULE_FIRMWARE("ast_dp501_fw.bin"); 5MODULE_FIRMWARE("ast_dp501_fw.bin");
6 6
7int ast_load_dp501_microcode(struct drm_device *dev) 7static int ast_load_dp501_microcode(struct drm_device *dev)
8{ 8{
9 struct ast_private *ast = dev->dev_private; 9 struct ast_private *ast = dev->dev_private;
10 static char *fw_name = "ast_dp501_fw.bin";
11 int err;
12 err = request_firmware(&ast->dp501_fw, fw_name, dev->dev);
13 if (err)
14 return err;
15 10
16 return 0; 11 return request_firmware(&ast->dp501_fw, "ast_dp501_fw.bin", dev->dev);
17} 12}
18 13
19static void send_ack(struct ast_private *ast) 14static void send_ack(struct ast_private *ast)
@@ -187,7 +182,7 @@ bool ast_backup_fw(struct drm_device *dev, u8 *addr, u32 size)
187 return false; 182 return false;
188} 183}
189 184
190bool ast_launch_m68k(struct drm_device *dev) 185static bool ast_launch_m68k(struct drm_device *dev)
191{ 186{
192 struct ast_private *ast = dev->dev_private; 187 struct ast_private *ast = dev->dev_private;
193 u32 i, data, len = 0; 188 u32 i, data, len = 0;
@@ -201,7 +196,11 @@ bool ast_launch_m68k(struct drm_device *dev)
201 if (ast->dp501_fw_addr) { 196 if (ast->dp501_fw_addr) {
202 fw_addr = ast->dp501_fw_addr; 197 fw_addr = ast->dp501_fw_addr;
203 len = 32*1024; 198 len = 32*1024;
204 } else if (ast->dp501_fw) { 199 } else {
200 if (!ast->dp501_fw &&
201 ast_load_dp501_microcode(dev) < 0)
202 return false;
203
205 fw_addr = (u8 *)ast->dp501_fw->data; 204 fw_addr = (u8 *)ast->dp501_fw->data;
206 len = ast->dp501_fw->size; 205 len = ast->dp501_fw->size;
207 } 206 }
@@ -432,3 +431,11 @@ void ast_init_3rdtx(struct drm_device *dev)
432 } 431 }
433 } 432 }
434} 433}
434
435void ast_release_firmware(struct drm_device *dev)
436{
437 struct ast_private *ast = dev->dev_private;
438
439 release_firmware(ast->dp501_fw);
440 ast->dp501_fw = NULL;
441}
diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h
index 8880f0b62e9c..7ded3b84237f 100644
--- a/drivers/gpu/drm/ast/ast_drv.h
+++ b/drivers/gpu/drm/ast/ast_drv.h
@@ -401,11 +401,10 @@ void ast_post_gpu(struct drm_device *dev);
401u32 ast_mindwm(struct ast_private *ast, u32 r); 401u32 ast_mindwm(struct ast_private *ast, u32 r);
402void ast_moutdwm(struct ast_private *ast, u32 r, u32 v); 402void ast_moutdwm(struct ast_private *ast, u32 r, u32 v);
403/* ast dp501 */ 403/* ast dp501 */
404int ast_load_dp501_microcode(struct drm_device *dev);
405void ast_set_dp501_video_output(struct drm_device *dev, u8 mode); 404void ast_set_dp501_video_output(struct drm_device *dev, u8 mode);
406bool ast_launch_m68k(struct drm_device *dev);
407bool ast_backup_fw(struct drm_device *dev, u8 *addr, u32 size); 405bool ast_backup_fw(struct drm_device *dev, u8 *addr, u32 size);
408bool ast_dp501_read_edid(struct drm_device *dev, u8 *ediddata); 406bool ast_dp501_read_edid(struct drm_device *dev, u8 *ediddata);
409u8 ast_get_dp501_max_clk(struct drm_device *dev); 407u8 ast_get_dp501_max_clk(struct drm_device *dev);
410void ast_init_3rdtx(struct drm_device *dev); 408void ast_init_3rdtx(struct drm_device *dev);
409void ast_release_firmware(struct drm_device *dev);
411#endif 410#endif
diff --git a/drivers/gpu/drm/ast/ast_main.c b/drivers/gpu/drm/ast/ast_main.c
index 50a8512ea646..9a44cdec3bca 100644
--- a/drivers/gpu/drm/ast/ast_main.c
+++ b/drivers/gpu/drm/ast/ast_main.c
@@ -576,6 +576,7 @@ void ast_driver_unload(struct drm_device *dev)
576{ 576{
577 struct ast_private *ast = dev->dev_private; 577 struct ast_private *ast = dev->dev_private;
578 578
579 ast_release_firmware(dev);
579 kfree(ast->dp501_fw_addr); 580 kfree(ast->dp501_fw_addr);
580 ast_mode_fini(dev); 581 ast_mode_fini(dev);
581 ast_fbdev_fini(dev); 582 ast_fbdev_fini(dev);