hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/video/fbdev/imsttfb.c
....@@ -1346,7 +1346,7 @@
13461346 .fb_ioctl = imsttfb_ioctl,
13471347 };
13481348
1349
-static void init_imstt(struct fb_info *info)
1349
+static int init_imstt(struct fb_info *info)
13501350 {
13511351 struct imstt_par *par = info->par;
13521352 __u32 i, tmp, *ip, *end;
....@@ -1419,7 +1419,7 @@
14191419 || !(compute_imstt_regvals(par, info->var.xres, info->var.yres))) {
14201420 printk("imsttfb: %ux%ux%u not supported\n", info->var.xres, info->var.yres, info->var.bits_per_pixel);
14211421 framebuffer_release(info);
1422
- return;
1422
+ return -ENODEV;
14231423 }
14241424
14251425 sprintf(info->fix.id, "IMS TT (%s)", par->ramdac == IBM ? "IBM" : "TVP");
....@@ -1455,12 +1455,13 @@
14551455
14561456 if (register_framebuffer(info) < 0) {
14571457 framebuffer_release(info);
1458
- return;
1458
+ return -ENODEV;
14591459 }
14601460
14611461 tmp = (read_reg_le32(par->dc_regs, SSTATUS) & 0x0f00) >> 8;
14621462 fb_info(info, "%s frame buffer; %uMB vram; chip version %u\n",
14631463 info->fix.id, info->fix.smem_len >> 20, tmp);
1464
+ return 0;
14641465 }
14651466
14661467 static int imsttfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
....@@ -1469,6 +1470,7 @@
14691470 struct imstt_par *par;
14701471 struct fb_info *info;
14711472 struct device_node *dp;
1473
+ int ret = -ENOMEM;
14721474
14731475 dp = pci_device_to_OF_node(pdev);
14741476 if(dp)
....@@ -1504,23 +1506,37 @@
15041506 default:
15051507 printk(KERN_INFO "imsttfb: Device 0x%x unknown, "
15061508 "contact maintainer.\n", pdev->device);
1507
- release_mem_region(addr, size);
1508
- framebuffer_release(info);
1509
- return -ENODEV;
1509
+ ret = -ENODEV;
1510
+ goto error;
15101511 }
15111512
15121513 info->fix.smem_start = addr;
15131514 info->screen_base = (__u8 *)ioremap(addr, par->ramdac == IBM ?
15141515 0x400000 : 0x800000);
1516
+ if (!info->screen_base)
1517
+ goto error;
15151518 info->fix.mmio_start = addr + 0x800000;
15161519 par->dc_regs = ioremap(addr + 0x800000, 0x1000);
1520
+ if (!par->dc_regs)
1521
+ goto error;
15171522 par->cmap_regs_phys = addr + 0x840000;
15181523 par->cmap_regs = (__u8 *)ioremap(addr + 0x840000, 0x1000);
1524
+ if (!par->cmap_regs)
1525
+ goto error;
15191526 info->pseudo_palette = par->palette;
1520
- init_imstt(info);
1527
+ ret = init_imstt(info);
1528
+ if (!ret)
1529
+ pci_set_drvdata(pdev, info);
1530
+ return ret;
15211531
1522
- pci_set_drvdata(pdev, info);
1523
- return 0;
1532
+error:
1533
+ if (par->dc_regs)
1534
+ iounmap(par->dc_regs);
1535
+ if (info->screen_base)
1536
+ iounmap(info->screen_base);
1537
+ release_mem_region(addr, size);
1538
+ framebuffer_release(info);
1539
+ return ret;
15241540 }
15251541
15261542 static void imsttfb_remove(struct pci_dev *pdev)