imxfb: add platform specific init/exit functions
authorSascha Hauer <s.hauer@pengutronix.de>
Thu, 15 Jan 2009 14:37:22 +0000 (15:37 +0100)
committerSascha Hauer <s.hauer@pengutronix.de>
Fri, 13 Mar 2009 09:34:07 +0000 (10:34 +0100)
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
arch/arm/plat-mxc/include/mach/imxfb.h
drivers/video/imxfb.c

index 870d0d939616111408abf6b2fd32fc280978c328..762a7b0430e2786c6e77582f43afd68c0dbdbb88 100644 (file)
@@ -76,6 +76,9 @@ struct imx_fb_platform_data {
        u_char * fixed_screen_cpu;
        dma_addr_t fixed_screen_dma;
 
+       int (*init)(struct platform_device*);
+       int (*exit)(struct platform_device*);
+
        void (*lcd_power)(int);
        void (*backlight_power)(int);
 };
index d58c68cd456eda0c9aea90c5f566cfab06fc4cdf..629d66f3230023b78861907a191afb087c9e975e 100644 (file)
@@ -650,6 +650,12 @@ static int __init imxfb_probe(struct platform_device *pdev)
                info->fix.smem_start = fbi->screen_dma;
        }
 
+       if (pdata->init) {
+               ret = pdata->init(fbi->pdev);
+               if (ret)
+                       goto failed_platform_init;
+       }
+
        /*
         * This makes sure that our colour bitfield
         * descriptors are correctly initialised.
@@ -674,6 +680,9 @@ static int __init imxfb_probe(struct platform_device *pdev)
 failed_register:
        fb_dealloc_cmap(&info->cmap);
 failed_cmap:
+       if (pdata->exit)
+               pdata->exit(fbi->pdev);
+failed_platform_init:
        if (!pdata->fixed_screen_cpu)
                dma_free_writecombine(&pdev->dev,fbi->map_size,fbi->map_cpu,
                        fbi->map_dma);
@@ -691,6 +700,7 @@ failed_init:
 
 static int __devexit imxfb_remove(struct platform_device *pdev)
 {
+       struct imx_fb_platform_data *pdata;
        struct fb_info *info = platform_get_drvdata(pdev);
        struct imxfb_info *fbi = info->par;
        struct resource *res;
@@ -701,6 +711,10 @@ static int __devexit imxfb_remove(struct platform_device *pdev)
 
        unregister_framebuffer(info);
 
+       pdata = pdev->dev.platform_data;
+       if (pdata->exit)
+               pdata->exit(fbi->pdev);
+
        fb_dealloc_cmap(&info->cmap);
        kfree(info->pseudo_palette);
        framebuffer_release(info);