Commit c895305e authored by Emil Goode's avatar Emil Goode Committed by Florian Tobias Schandinat

video: bfin_adv7393fb: Fix cleanup code

This patch fixes the cleanup code of the bfin_adv7393_fb_probe
function.

1) The resources were not freed in the order that we allocated them
   so we call dma_free_coherent() before it was allocated.
2) The labels weren't in the right place which also meant that we
   freed resources that weren't allocated.
3) We should free gpio_free(P_IDENT(P_PPI0_FS3)) before returning.
4) Lets change the label names into something more meaningful.
Signed-off-by: default avatarEmil Goode <emilgoode@gmail.com>
Acked-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: default avatarFlorian Tobias Schandinat <FlorianSchandinat@gmx.de>
parent ddbcb289
...@@ -414,14 +414,14 @@ static int __devinit bfin_adv7393_fb_probe(struct i2c_client *client, ...@@ -414,14 +414,14 @@ static int __devinit bfin_adv7393_fb_probe(struct i2c_client *client,
if (ret) { if (ret) {
dev_err(&client->dev, "PPI0_FS3 GPIO request failed\n"); dev_err(&client->dev, "PPI0_FS3 GPIO request failed\n");
ret = -EBUSY; ret = -EBUSY;
goto out_8; goto free_fbdev;
} }
} }
if (peripheral_request_list(ppi_pins, DRIVER_NAME)) { if (peripheral_request_list(ppi_pins, DRIVER_NAME)) {
dev_err(&client->dev, "requesting PPI peripheral failed\n"); dev_err(&client->dev, "requesting PPI peripheral failed\n");
ret = -EFAULT; ret = -EFAULT;
goto out_8; goto free_gpio;
} }
fbdev->fb_mem = fbdev->fb_mem =
...@@ -432,7 +432,7 @@ static int __devinit bfin_adv7393_fb_probe(struct i2c_client *client, ...@@ -432,7 +432,7 @@ static int __devinit bfin_adv7393_fb_probe(struct i2c_client *client,
dev_err(&client->dev, "couldn't allocate dma buffer (%d bytes)\n", dev_err(&client->dev, "couldn't allocate dma buffer (%d bytes)\n",
(u32) fbdev->fb_len); (u32) fbdev->fb_len);
ret = -ENOMEM; ret = -ENOMEM;
goto out_7; goto free_ppi_pins;
} }
fbdev->info.screen_base = (void *)fbdev->fb_mem; fbdev->info.screen_base = (void *)fbdev->fb_mem;
...@@ -464,27 +464,27 @@ static int __devinit bfin_adv7393_fb_probe(struct i2c_client *client, ...@@ -464,27 +464,27 @@ static int __devinit bfin_adv7393_fb_probe(struct i2c_client *client,
if (!fbdev->info.pseudo_palette) { if (!fbdev->info.pseudo_palette) {
dev_err(&client->dev, "failed to allocate pseudo_palette\n"); dev_err(&client->dev, "failed to allocate pseudo_palette\n");
ret = -ENOMEM; ret = -ENOMEM;
goto out_6; goto free_fb_mem;
} }
if (fb_alloc_cmap(&fbdev->info.cmap, BFIN_LCD_NBR_PALETTE_ENTRIES, 0) < 0) { if (fb_alloc_cmap(&fbdev->info.cmap, BFIN_LCD_NBR_PALETTE_ENTRIES, 0) < 0) {
dev_err(&client->dev, "failed to allocate colormap (%d entries)\n", dev_err(&client->dev, "failed to allocate colormap (%d entries)\n",
BFIN_LCD_NBR_PALETTE_ENTRIES); BFIN_LCD_NBR_PALETTE_ENTRIES);
ret = -EFAULT; ret = -EFAULT;
goto out_5; goto free_palette;
} }
if (request_dma(CH_PPI, "BF5xx_PPI_DMA") < 0) { if (request_dma(CH_PPI, "BF5xx_PPI_DMA") < 0) {
dev_err(&client->dev, "unable to request PPI DMA\n"); dev_err(&client->dev, "unable to request PPI DMA\n");
ret = -EFAULT; ret = -EFAULT;
goto out_4; goto free_cmap;
} }
if (request_irq(IRQ_PPI_ERROR, ppi_irq_error, 0, if (request_irq(IRQ_PPI_ERROR, ppi_irq_error, 0,
"PPI ERROR", fbdev) < 0) { "PPI ERROR", fbdev) < 0) {
dev_err(&client->dev, "unable to request PPI ERROR IRQ\n"); dev_err(&client->dev, "unable to request PPI ERROR IRQ\n");
ret = -EFAULT; ret = -EFAULT;
goto out_3; goto free_ch_ppi;
} }
fbdev->open = 0; fbdev->open = 0;
...@@ -494,14 +494,14 @@ static int __devinit bfin_adv7393_fb_probe(struct i2c_client *client, ...@@ -494,14 +494,14 @@ static int __devinit bfin_adv7393_fb_probe(struct i2c_client *client,
if (ret) { if (ret) {
dev_err(&client->dev, "i2c attach: init error\n"); dev_err(&client->dev, "i2c attach: init error\n");
goto out_1; goto free_irq_ppi;
} }
if (register_framebuffer(&fbdev->info) < 0) { if (register_framebuffer(&fbdev->info) < 0) {
dev_err(&client->dev, "unable to register framebuffer\n"); dev_err(&client->dev, "unable to register framebuffer\n");
ret = -EFAULT; ret = -EFAULT;
goto out_1; goto free_irq_ppi;
} }
dev_info(&client->dev, "fb%d: %s frame buffer device\n", dev_info(&client->dev, "fb%d: %s frame buffer device\n",
...@@ -512,7 +512,7 @@ static int __devinit bfin_adv7393_fb_probe(struct i2c_client *client, ...@@ -512,7 +512,7 @@ static int __devinit bfin_adv7393_fb_probe(struct i2c_client *client,
if (!entry) { if (!entry) {
dev_err(&client->dev, "unable to create /proc entry\n"); dev_err(&client->dev, "unable to create /proc entry\n");
ret = -EFAULT; ret = -EFAULT;
goto out_0; goto free_fb;
} }
entry->read_proc = adv7393_read_proc; entry->read_proc = adv7393_read_proc;
...@@ -521,22 +521,25 @@ static int __devinit bfin_adv7393_fb_probe(struct i2c_client *client, ...@@ -521,22 +521,25 @@ static int __devinit bfin_adv7393_fb_probe(struct i2c_client *client,
return 0; return 0;
out_0: free_fb:
unregister_framebuffer(&fbdev->info); unregister_framebuffer(&fbdev->info);
out_1: free_irq_ppi:
free_irq(IRQ_PPI_ERROR, fbdev); free_irq(IRQ_PPI_ERROR, fbdev);
out_3: free_ch_ppi:
free_dma(CH_PPI); free_dma(CH_PPI);
out_4: free_cmap:
dma_free_coherent(NULL, fbdev->fb_len, fbdev->fb_mem,
fbdev->dma_handle);
out_5:
fb_dealloc_cmap(&fbdev->info.cmap); fb_dealloc_cmap(&fbdev->info.cmap);
out_6: free_palette:
kfree(fbdev->info.pseudo_palette); kfree(fbdev->info.pseudo_palette);
out_7: free_fb_mem:
dma_free_coherent(NULL, fbdev->fb_len, fbdev->fb_mem,
fbdev->dma_handle);
free_ppi_pins:
peripheral_free_list(ppi_pins); peripheral_free_list(ppi_pins);
out_8: free_gpio:
if (ANOMALY_05000400)
gpio_free(P_IDENT(P_PPI0_FS3));
free_fbdev:
kfree(fbdev); kfree(fbdev);
return ret; return ret;
......
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