|
@@ -1246,7 +1246,7 @@ static int pxafb_resume(struct platform_device *dev)
|
|
|
* cache. Once this area is remapped, all virtual memory
|
|
|
* access to the video memory should occur at the new region.
|
|
|
*/
|
|
|
-static int __init pxafb_map_video_memory(struct pxafb_info *fbi)
|
|
|
+static int __devinit pxafb_map_video_memory(struct pxafb_info *fbi)
|
|
|
{
|
|
|
/*
|
|
|
* We reserve one page for the palette, plus the size
|
|
@@ -1348,7 +1348,7 @@ decode_mode:
|
|
|
pxafb_decode_mode_info(fbi, inf->modes, inf->num_modes);
|
|
|
}
|
|
|
|
|
|
-static struct pxafb_info * __init pxafb_init_fbinfo(struct device *dev)
|
|
|
+static struct pxafb_info * __devinit pxafb_init_fbinfo(struct device *dev)
|
|
|
{
|
|
|
struct pxafb_info *fbi;
|
|
|
void *addr;
|
|
@@ -1410,7 +1410,7 @@ static struct pxafb_info * __init pxafb_init_fbinfo(struct device *dev)
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_FB_PXA_PARAMETERS
|
|
|
-static int __init parse_opt_mode(struct device *dev, const char *this_opt)
|
|
|
+static int __devinit parse_opt_mode(struct device *dev, const char *this_opt)
|
|
|
{
|
|
|
struct pxafb_mach_info *inf = dev->platform_data;
|
|
|
|
|
@@ -1469,7 +1469,7 @@ done:
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int __init parse_opt(struct device *dev, char *this_opt)
|
|
|
+static int __devinit parse_opt(struct device *dev, char *this_opt)
|
|
|
{
|
|
|
struct pxafb_mach_info *inf = dev->platform_data;
|
|
|
struct pxafb_mode_info *mode = &inf->modes[0];
|
|
@@ -1567,7 +1567,7 @@ static int __init parse_opt(struct device *dev, char *this_opt)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int __init pxafb_parse_options(struct device *dev, char *options)
|
|
|
+static int __devinit pxafb_parse_options(struct device *dev, char *options)
|
|
|
{
|
|
|
char *this_opt;
|
|
|
int ret;
|
|
@@ -1588,8 +1588,8 @@ static int __init pxafb_parse_options(struct device *dev, char *options)
|
|
|
|
|
|
static char g_options[256] __devinitdata = "";
|
|
|
|
|
|
-#ifndef CONFIG_MODULES
|
|
|
-static int __devinit pxafb_setup_options(void)
|
|
|
+#ifndef MODULE
|
|
|
+static int __init pxafb_setup_options(void)
|
|
|
{
|
|
|
char *options = NULL;
|
|
|
|
|
@@ -1613,7 +1613,7 @@ MODULE_PARM_DESC(options, "LCD parameters (see Documentation/fb/pxafb.txt)");
|
|
|
#define pxafb_setup_options() (0)
|
|
|
#endif
|
|
|
|
|
|
-static int __init pxafb_probe(struct platform_device *dev)
|
|
|
+static int __devinit pxafb_probe(struct platform_device *dev)
|
|
|
{
|
|
|
struct pxafb_info *fbi;
|
|
|
struct pxafb_mach_info *inf;
|
|
@@ -1685,14 +1685,14 @@ static int __init pxafb_probe(struct platform_device *dev)
|
|
|
if (r == NULL) {
|
|
|
dev_err(&dev->dev, "no I/O memory resource defined\n");
|
|
|
ret = -ENODEV;
|
|
|
- goto failed;
|
|
|
+ goto failed_fbi;
|
|
|
}
|
|
|
|
|
|
r = request_mem_region(r->start, r->end - r->start + 1, dev->name);
|
|
|
if (r == NULL) {
|
|
|
dev_err(&dev->dev, "failed to request I/O memory\n");
|
|
|
ret = -EBUSY;
|
|
|
- goto failed;
|
|
|
+ goto failed_fbi;
|
|
|
}
|
|
|
|
|
|
fbi->mmio_base = ioremap(r->start, r->end - r->start + 1);
|
|
@@ -1735,8 +1735,17 @@ static int __init pxafb_probe(struct platform_device *dev)
|
|
|
* This makes sure that our colour bitfield
|
|
|
* descriptors are correctly initialised.
|
|
|
*/
|
|
|
- pxafb_check_var(&fbi->fb.var, &fbi->fb);
|
|
|
- pxafb_set_par(&fbi->fb);
|
|
|
+ ret = pxafb_check_var(&fbi->fb.var, &fbi->fb);
|
|
|
+ if (ret) {
|
|
|
+ dev_err(&dev->dev, "failed to get suitable mode\n");
|
|
|
+ goto failed_free_irq;
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = pxafb_set_par(&fbi->fb);
|
|
|
+ if (ret) {
|
|
|
+ dev_err(&dev->dev, "Failed to set parameters\n");
|
|
|
+ goto failed_free_irq;
|
|
|
+ }
|
|
|
|
|
|
platform_set_drvdata(dev, fbi);
|
|
|
|
|
@@ -1744,7 +1753,7 @@ static int __init pxafb_probe(struct platform_device *dev)
|
|
|
if (ret < 0) {
|
|
|
dev_err(&dev->dev,
|
|
|
"Failed to register framebuffer device: %d\n", ret);
|
|
|
- goto failed_free_irq;
|
|
|
+ goto failed_free_cmap;
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_CPU_FREQ
|
|
@@ -1763,18 +1772,23 @@ static int __init pxafb_probe(struct platform_device *dev)
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
+failed_free_cmap:
|
|
|
+ if (fbi->fb.cmap.len)
|
|
|
+ fb_dealloc_cmap(&fbi->fb.cmap);
|
|
|
failed_free_irq:
|
|
|
free_irq(irq, fbi);
|
|
|
-failed_free_res:
|
|
|
- release_mem_region(r->start, r->end - r->start + 1);
|
|
|
-failed_free_io:
|
|
|
- iounmap(fbi->mmio_base);
|
|
|
failed_free_mem:
|
|
|
dma_free_writecombine(&dev->dev, fbi->map_size,
|
|
|
fbi->map_cpu, fbi->map_dma);
|
|
|
-failed:
|
|
|
+failed_free_io:
|
|
|
+ iounmap(fbi->mmio_base);
|
|
|
+failed_free_res:
|
|
|
+ release_mem_region(r->start, r->end - r->start + 1);
|
|
|
+failed_fbi:
|
|
|
+ clk_put(fbi->clk);
|
|
|
platform_set_drvdata(dev, NULL);
|
|
|
kfree(fbi);
|
|
|
+failed:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
@@ -1787,7 +1801,7 @@ static struct platform_driver pxafb_driver = {
|
|
|
},
|
|
|
};
|
|
|
|
|
|
-static int __devinit pxafb_init(void)
|
|
|
+static int __init pxafb_init(void)
|
|
|
{
|
|
|
if (pxafb_setup_options())
|
|
|
return -EINVAL;
|