Commit c8f96304 authored by Daniel Mack's avatar Daniel Mack Committed by Bartlomiej Zolnierkiewicz

video: fbdev: pxafb: switch to devm_* API

This helps us clean up the probe() and remove() implementations.
Signed-off-by: default avatarDaniel Mack <daniel@zonque.org>
Reviewed-by: default avatarRobert Jarzmik <robert.jarzmik@free.fr>
Signed-off-by: default avatarBartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
parent b951d80a
...@@ -1799,19 +1799,17 @@ static struct pxafb_info *pxafb_init_fbinfo(struct device *dev, ...@@ -1799,19 +1799,17 @@ static struct pxafb_info *pxafb_init_fbinfo(struct device *dev,
void *addr; void *addr;
/* Alloc the pxafb_info and pseudo_palette in one step */ /* Alloc the pxafb_info and pseudo_palette in one step */
fbi = kmalloc(sizeof(struct pxafb_info) + sizeof(u32) * 16, GFP_KERNEL); fbi = devm_kzalloc(dev, sizeof(struct pxafb_info) + sizeof(u32) * 16,
GFP_KERNEL);
if (!fbi) if (!fbi)
return NULL; return NULL;
memset(fbi, 0, sizeof(struct pxafb_info));
fbi->dev = dev; fbi->dev = dev;
fbi->inf = inf; fbi->inf = inf;
fbi->clk = clk_get(dev, NULL); fbi->clk = devm_clk_get(dev, NULL);
if (IS_ERR(fbi->clk)) { if (IS_ERR(fbi->clk))
kfree(fbi);
return NULL; return NULL;
}
strcpy(fbi->fb.fix.id, PXA_NAME); strcpy(fbi->fb.fix.id, PXA_NAME);
...@@ -2128,8 +2126,9 @@ static int of_get_pxafb_display(struct device *dev, struct device_node *disp, ...@@ -2128,8 +2126,9 @@ static int of_get_pxafb_display(struct device *dev, struct device_node *disp,
return -EINVAL; return -EINVAL;
ret = -ENOMEM; ret = -ENOMEM;
info->modes = kcalloc(timings->num_timings, sizeof(info->modes[0]), info->modes = devm_kcalloc(dev, timings->num_timings,
GFP_KERNEL); sizeof(info->modes[0]),
GFP_KERNEL);
if (!info->modes) if (!info->modes)
goto out; goto out;
info->num_modes = timings->num_timings; info->num_modes = timings->num_timings;
...@@ -2305,21 +2304,14 @@ static int pxafb_probe(struct platform_device *dev) ...@@ -2305,21 +2304,14 @@ static int pxafb_probe(struct platform_device *dev)
if (r == NULL) { if (r == NULL) {
dev_err(&dev->dev, "no I/O memory resource defined\n"); dev_err(&dev->dev, "no I/O memory resource defined\n");
ret = -ENODEV; ret = -ENODEV;
goto failed_fbi; goto failed;
}
r = request_mem_region(r->start, resource_size(r), dev->name);
if (r == NULL) {
dev_err(&dev->dev, "failed to request I/O memory\n");
ret = -EBUSY;
goto failed_fbi;
} }
fbi->mmio_base = ioremap(r->start, resource_size(r)); fbi->mmio_base = devm_ioremap_resource(&dev->dev, r);
if (fbi->mmio_base == NULL) { if (IS_ERR(fbi->mmio_base)) {
dev_err(&dev->dev, "failed to map I/O memory\n"); dev_err(&dev->dev, "failed to get I/O memory\n");
ret = -EBUSY; ret = -EBUSY;
goto failed_free_res; goto failed;
} }
fbi->dma_buff_size = PAGE_ALIGN(sizeof(struct pxafb_dma_buff)); fbi->dma_buff_size = PAGE_ALIGN(sizeof(struct pxafb_dma_buff));
...@@ -2328,7 +2320,7 @@ static int pxafb_probe(struct platform_device *dev) ...@@ -2328,7 +2320,7 @@ static int pxafb_probe(struct platform_device *dev)
if (fbi->dma_buff == NULL) { if (fbi->dma_buff == NULL) {
dev_err(&dev->dev, "failed to allocate memory for DMA\n"); dev_err(&dev->dev, "failed to allocate memory for DMA\n");
ret = -ENOMEM; ret = -ENOMEM;
goto failed_free_io; goto failed;
} }
ret = pxafb_init_video_memory(fbi); ret = pxafb_init_video_memory(fbi);
...@@ -2345,7 +2337,7 @@ static int pxafb_probe(struct platform_device *dev) ...@@ -2345,7 +2337,7 @@ static int pxafb_probe(struct platform_device *dev)
goto failed_free_mem; goto failed_free_mem;
} }
ret = request_irq(irq, pxafb_handle_irq, 0, "LCD", fbi); ret = devm_request_irq(&dev->dev, irq, pxafb_handle_irq, 0, "LCD", fbi);
if (ret) { if (ret) {
dev_err(&dev->dev, "request_irq failed: %d\n", ret); dev_err(&dev->dev, "request_irq failed: %d\n", ret);
ret = -EBUSY; ret = -EBUSY;
...@@ -2355,7 +2347,7 @@ static int pxafb_probe(struct platform_device *dev) ...@@ -2355,7 +2347,7 @@ static int pxafb_probe(struct platform_device *dev)
ret = pxafb_smart_init(fbi); ret = pxafb_smart_init(fbi);
if (ret) { if (ret) {
dev_err(&dev->dev, "failed to initialize smartpanel\n"); dev_err(&dev->dev, "failed to initialize smartpanel\n");
goto failed_free_irq; goto failed_free_mem;
} }
/* /*
...@@ -2365,13 +2357,13 @@ static int pxafb_probe(struct platform_device *dev) ...@@ -2365,13 +2357,13 @@ static int pxafb_probe(struct platform_device *dev)
ret = pxafb_check_var(&fbi->fb.var, &fbi->fb); ret = pxafb_check_var(&fbi->fb.var, &fbi->fb);
if (ret) { if (ret) {
dev_err(&dev->dev, "failed to get suitable mode\n"); dev_err(&dev->dev, "failed to get suitable mode\n");
goto failed_free_irq; goto failed_free_mem;
} }
ret = pxafb_set_par(&fbi->fb); ret = pxafb_set_par(&fbi->fb);
if (ret) { if (ret) {
dev_err(&dev->dev, "Failed to set parameters\n"); dev_err(&dev->dev, "Failed to set parameters\n");
goto failed_free_irq; goto failed_free_mem;
} }
platform_set_drvdata(dev, fbi); platform_set_drvdata(dev, fbi);
...@@ -2404,20 +2396,11 @@ static int pxafb_probe(struct platform_device *dev) ...@@ -2404,20 +2396,11 @@ static int pxafb_probe(struct platform_device *dev)
failed_free_cmap: failed_free_cmap:
if (fbi->fb.cmap.len) if (fbi->fb.cmap.len)
fb_dealloc_cmap(&fbi->fb.cmap); fb_dealloc_cmap(&fbi->fb.cmap);
failed_free_irq:
free_irq(irq, fbi);
failed_free_mem: failed_free_mem:
free_pages_exact(fbi->video_mem, fbi->video_mem_size); free_pages_exact(fbi->video_mem, fbi->video_mem_size);
failed_free_dma: failed_free_dma:
dma_free_coherent(&dev->dev, fbi->dma_buff_size, dma_free_coherent(&dev->dev, fbi->dma_buff_size,
fbi->dma_buff, fbi->dma_buff_phys); fbi->dma_buff, fbi->dma_buff_phys);
failed_free_io:
iounmap(fbi->mmio_base);
failed_free_res:
release_mem_region(r->start, resource_size(r));
failed_fbi:
clk_put(fbi->clk);
kfree(fbi);
failed: failed:
return ret; return ret;
} }
...@@ -2425,8 +2408,6 @@ static int pxafb_probe(struct platform_device *dev) ...@@ -2425,8 +2408,6 @@ static int pxafb_probe(struct platform_device *dev)
static int pxafb_remove(struct platform_device *dev) static int pxafb_remove(struct platform_device *dev)
{ {
struct pxafb_info *fbi = platform_get_drvdata(dev); struct pxafb_info *fbi = platform_get_drvdata(dev);
struct resource *r;
int irq;
struct fb_info *info; struct fb_info *info;
if (!fbi) if (!fbi)
...@@ -2442,22 +2423,11 @@ static int pxafb_remove(struct platform_device *dev) ...@@ -2442,22 +2423,11 @@ static int pxafb_remove(struct platform_device *dev)
if (fbi->fb.cmap.len) if (fbi->fb.cmap.len)
fb_dealloc_cmap(&fbi->fb.cmap); fb_dealloc_cmap(&fbi->fb.cmap);
irq = platform_get_irq(dev, 0);
free_irq(irq, fbi);
free_pages_exact(fbi->video_mem, fbi->video_mem_size); free_pages_exact(fbi->video_mem, fbi->video_mem_size);
dma_free_wc(&dev->dev, fbi->dma_buff_size, fbi->dma_buff, dma_free_wc(&dev->dev, fbi->dma_buff_size, fbi->dma_buff,
fbi->dma_buff_phys); fbi->dma_buff_phys);
iounmap(fbi->mmio_base);
r = platform_get_resource(dev, IORESOURCE_MEM, 0);
release_mem_region(r->start, resource_size(r));
clk_put(fbi->clk);
kfree(fbi);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment