Merge branch 'fix/misc' into for-linus
[pandora-kernel.git] / drivers / video / hitfb.c
index 020db7f..e7116a6 100644 (file)
@@ -44,9 +44,6 @@ static struct fb_fix_screeninfo hitfb_fix __initdata = {
        .accel          = FB_ACCEL_NONE,
 };
 
-static u32 pseudo_palette[16];
-static struct fb_info fb_info;
-
 static inline void hitfb_accel_wait(void)
 {
        while (fb_readw(HD64461_GRCFGR) & HD64461_GRCFGR_ACCSTATUS) ;
@@ -331,6 +328,8 @@ static struct fb_ops hitfb_ops = {
 static int __init hitfb_probe(struct platform_device *dev)
 {
        unsigned short lcdclor, ldr3, ldvndr;
+       struct fb_info *info;
+       int ret;
 
        if (fb_get_options("hitfb", NULL))
                return -ENODEV;
@@ -384,32 +383,53 @@ static int __init hitfb_probe(struct platform_device *dev)
                break;
        }
 
-       fb_info.fbops = &hitfb_ops;
-       fb_info.var = hitfb_var;
-       fb_info.fix = hitfb_fix;
-       fb_info.pseudo_palette = pseudo_palette;
-       fb_info.flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN |
+       info = framebuffer_alloc(sizeof(u32) * 16, &dev->dev);
+       if (unlikely(!info))
+               return -ENOMEM;
+
+       info->fbops = &hitfb_ops;
+       info->var = hitfb_var;
+       info->fix = hitfb_fix;
+       info->pseudo_palette = info->par;
+       info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN |
                FBINFO_HWACCEL_FILLRECT | FBINFO_HWACCEL_COPYAREA;
 
-       fb_info.screen_base = (void *)hitfb_fix.smem_start;
+       info->screen_base = (void *)hitfb_fix.smem_start;
 
-       fb_alloc_cmap(&fb_info.cmap, 256, 0);
+       ret = fb_alloc_cmap(&info->cmap, 256, 0);
+       if (unlikely(ret < 0))
+               goto err_fb;
 
-       if (register_framebuffer(&fb_info) < 0)
-               return -EINVAL;
+       ret = register_framebuffer(info);
+       if (unlikely(ret < 0))
+               goto err;
+
+       platform_set_drvdata(dev, info);
 
        printk(KERN_INFO "fb%d: %s frame buffer device\n",
-              fb_info.node, fb_info.fix.id);
+              info->node, info->fix.id);
+
        return 0;
+
+err:
+       fb_dealloc_cmap(&info->cmap);
+err_fb:
+       framebuffer_release(info);
+       return ret;
 }
 
 static int __exit hitfb_remove(struct platform_device *dev)
 {
-       return unregister_framebuffer(&fb_info);
+       struct fb_info *info = platform_get_drvdata(dev);
+
+       unregister_framebuffer(info);
+       fb_dealloc_cmap(&info->cmap);
+       framebuffer_release(info);
+
+       return 0;
 }
 
-#ifdef CONFIG_PM
-static int hitfb_suspend(struct platform_device *dev, pm_message_t state)
+static int hitfb_suspend(struct device *dev)
 {
        u16 v;
 
@@ -421,7 +441,7 @@ static int hitfb_suspend(struct platform_device *dev, pm_message_t state)
        return 0;
 }
 
-static int hitfb_resume(struct platform_device *dev)
+static int hitfb_resume(struct device *dev)
 {
        u16 v;
 
@@ -435,17 +455,19 @@ static int hitfb_resume(struct platform_device *dev)
 
        return 0;
 }
-#endif
+
+static struct dev_pm_ops hitfb_dev_pm_ops = {
+       .suspend        = hitfb_suspend,
+       .resume         = hitfb_resume,
+};
 
 static struct platform_driver hitfb_driver = {
        .probe          = hitfb_probe,
        .remove         = __exit_p(hitfb_remove),
-#ifdef CONFIG_PM
-       .suspend        = hitfb_suspend,
-       .resume         = hitfb_resume,
-#endif
        .driver         = {
                .name   = "hitfb",
+               .owner  = THIS_MODULE,
+               .pm     = &hitfb_dev_pm_ops,
        },
 };