Description:
1. use request_firmware() instead of system calls
2. remove direct access to registered_fb[] in load_56rle_image()
3. check load_565rle_image() return value in msm_fb.c
4. move load_565rle_image() extern to msm_fb.h
change INIT_IMAGE_FILE and add one-line comment
Signed-off-by: Xiaochen Wang <[email protected]>
---
drivers/staging/msm/logo.c | 43 +++++++++++------------------------------
drivers/staging/msm/msm_fb.c | 9 +++----
drivers/staging/msm/msm_fb.h | 5 ++++
3 files changed, 21 insertions(+), 36 deletions(-)
diff --git a/drivers/staging/msm/logo.c b/drivers/staging/msm/logo.c
index 7272765..90eb150 100644
--- a/drivers/staging/msm/logo.c
+++ b/drivers/staging/msm/logo.c
@@ -19,10 +19,11 @@
#include <linux/fb.h>
#include <linux/vt_kern.h>
#include <linux/unistd.h>
-#include <linux/syscalls.h>
#include <linux/irq.h>
#include <asm/system.h>
+#include <linux/firmware.h>
+#include "msm_fb.h"
#define fb_width(fb) ((fb)->var.xres)
#define fb_height(fb) ((fb)->var.yres)
@@ -37,46 +38,29 @@ static void memset16(void *_ptr, unsigned short val,
unsigned count)
}
/* 565RLE image format: [count(2 bytes), rle(2 bytes)] */
-int load_565rle_image(char *filename)
+int load_565rle_image(char *filename, struct msm_fb_data_type *mfd)
{
+ const struct firmware *fw;
struct fb_info *info;
- int fd, err = 0;
unsigned count, max;
- unsigned short *data, *bits, *ptr;
+ unsigned short *bits, *ptr;
- info = registered_fb[0];
+ info = mfd->fbi;
if (!info) {
printk(KERN_WARNING "%s: Can not access framebuffer\n",
__func__);
return -ENODEV;
}
- fd = sys_open(filename, O_RDONLY, 0);
- if (fd < 0) {
- printk(KERN_WARNING "%s: Can not open %s\n",
+ if (request_firmware(&fw, filename, &mfd->pdev->dev)) {
+ printk(KERN_WARNING "%s: Can not load file %s\n",
__func__, filename);
return -ENOENT;
}
- count = (unsigned)sys_lseek(fd, (off_t)0, 2);
- if (count == 0) {
- sys_close(fd);
- err = -EIO;
- goto err_logo_close_file;
- }
- sys_lseek(fd, (off_t)0, 0);
- data = kmalloc(count, GFP_KERNEL);
- if (!data) {
- printk(KERN_WARNING "%s: Can not alloc data\n", __func__);
- err = -ENOMEM;
- goto err_logo_close_file;
- }
- if ((unsigned)sys_read(fd, (char *)data, count) != count) {
- err = -EIO;
- goto err_logo_free_data;
- }
+ count = fw->size;
+ ptr = (unsigned short *)(fw->data);
max = fb_width(info) * fb_height(info);
- ptr = data;
bits = (unsigned short *)(info->screen_base);
while (count > 3) {
unsigned n = ptr[0];
@@ -89,10 +73,7 @@ int load_565rle_image(char *filename)
count -= 4;
}
-err_logo_free_data:
- kfree(data);
-err_logo_close_file:
- sys_close(fd);
- return err;
+ release_firmware(fw);
+ return 0;
}
EXPORT_SYMBOL(load_565rle_image);
diff --git a/drivers/staging/msm/msm_fb.c b/drivers/staging/msm/msm_fb.c
index a2f29d4..b6d8039 100644
--- a/drivers/staging/msm/msm_fb.c
+++ b/drivers/staging/msm/msm_fb.c
@@ -48,10 +48,6 @@
#include "mdp.h"
#include "mdp4.h"
-#ifdef CONFIG_FB_MSM_LOGO
-#define INIT_IMAGE_FILE "/logo.rle"
-extern int load_565rle_image(char *filename);
-#endif
#define pgprot_noncached(prot) \
@@ -975,7 +971,10 @@ static int msm_fb_register(struct msm_fb_data_type *mfd)
mfd->index, fbi->var.xres, fbi->var.yres, fbi->fix.smem_len);
#ifdef CONFIG_FB_MSM_LOGO
- if (!load_565rle_image(INIT_IMAGE_FILE)) ; /* Flip buffer */
+ /* Flip buffer */
+ ret = load_565rle_image(INIT_IMAGE_FILE, mfd);
+ if (ret < 0)
+ printk(KERN_ERR "%s: failed to load image\n", __func__);
#endif
ret = 0;
diff --git a/drivers/staging/msm/msm_fb.h b/drivers/staging/msm/msm_fb.h
index 4bca6d2..b83588f 100644
--- a/drivers/staging/msm/msm_fb.h
+++ b/drivers/staging/msm/msm_fb.h
@@ -155,4 +155,9 @@ int msm_fb_detect_client(const char *name);
void msm_fb_config_backlight(struct msm_fb_data_type *mfd);
#endif
+#ifdef CONFIG_FB_MSM_LOGO
+#define INIT_IMAGE_FILE "logo.rle" /* Image file is used as firmware. */
+extern int load_565rle_image(char *filename, struct msm_fb_data_type *mfd);
+#endif
+
#endif /* MSM_FB_H */
--
1.7.2.3
_______________________________________________
devel mailing list
[email protected]
http://driverdev.linuxdriverproject.org/mailman/listinfo/devel