video: imsttfb: check for ioremap() failures
commit 13b7c0390a5d3840e1e2cda8f44a310fdbb982de upstream. We should check if ioremap() were to somehow fail in imsttfb_probe() and handle the unwinding of the resources allocated here properly. Ideally if anyone cares about this driver (it's for a PowerMac era PCI display card), they wouldn't even be using fbdev anymore. Or the devm_* apis could be used, but that's just extra work for diminishing returns... Cc: Finn Thain <fthain@telegraphics.com.au> Cc: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> Reviewed-by: Rob Herring <robh@kernel.org> Link: https://lore.kernel.org/r/20210503115736.2104747-68-gregkh@linuxfoundation.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
02fbf62df9
commit
5b813734a0
@ -1469,6 +1469,7 @@ static int imsttfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
struct imstt_par *par;
|
||||
struct fb_info *info;
|
||||
struct device_node *dp;
|
||||
int ret = -ENOMEM;
|
||||
|
||||
dp = pci_device_to_OF_node(pdev);
|
||||
if(dp)
|
||||
@ -1504,23 +1505,37 @@ static int imsttfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
default:
|
||||
printk(KERN_INFO "imsttfb: Device 0x%x unknown, "
|
||||
"contact maintainer.\n", pdev->device);
|
||||
release_mem_region(addr, size);
|
||||
framebuffer_release(info);
|
||||
return -ENODEV;
|
||||
ret = -ENODEV;
|
||||
goto error;
|
||||
}
|
||||
|
||||
info->fix.smem_start = addr;
|
||||
info->screen_base = (__u8 *)ioremap(addr, par->ramdac == IBM ?
|
||||
0x400000 : 0x800000);
|
||||
if (!info->screen_base)
|
||||
goto error;
|
||||
info->fix.mmio_start = addr + 0x800000;
|
||||
par->dc_regs = ioremap(addr + 0x800000, 0x1000);
|
||||
if (!par->dc_regs)
|
||||
goto error;
|
||||
par->cmap_regs_phys = addr + 0x840000;
|
||||
par->cmap_regs = (__u8 *)ioremap(addr + 0x840000, 0x1000);
|
||||
if (!par->cmap_regs)
|
||||
goto error;
|
||||
info->pseudo_palette = par->palette;
|
||||
init_imstt(info);
|
||||
|
||||
pci_set_drvdata(pdev, info);
|
||||
return 0;
|
||||
|
||||
error:
|
||||
if (par->dc_regs)
|
||||
iounmap(par->dc_regs);
|
||||
if (info->screen_base)
|
||||
iounmap(info->screen_base);
|
||||
release_mem_region(addr, size);
|
||||
framebuffer_release(info);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void imsttfb_remove(struct pci_dev *pdev)
|
||||
|
Loading…
Reference in New Issue
Block a user