.. | .. |
---|
1346 | 1346 | .fb_ioctl = imsttfb_ioctl, |
---|
1347 | 1347 | }; |
---|
1348 | 1348 | |
---|
1349 | | -static void init_imstt(struct fb_info *info) |
---|
| 1349 | +static int init_imstt(struct fb_info *info) |
---|
1350 | 1350 | { |
---|
1351 | 1351 | struct imstt_par *par = info->par; |
---|
1352 | 1352 | __u32 i, tmp, *ip, *end; |
---|
.. | .. |
---|
1419 | 1419 | || !(compute_imstt_regvals(par, info->var.xres, info->var.yres))) { |
---|
1420 | 1420 | printk("imsttfb: %ux%ux%u not supported\n", info->var.xres, info->var.yres, info->var.bits_per_pixel); |
---|
1421 | 1421 | framebuffer_release(info); |
---|
1422 | | - return; |
---|
| 1422 | + return -ENODEV; |
---|
1423 | 1423 | } |
---|
1424 | 1424 | |
---|
1425 | 1425 | sprintf(info->fix.id, "IMS TT (%s)", par->ramdac == IBM ? "IBM" : "TVP"); |
---|
.. | .. |
---|
1455 | 1455 | |
---|
1456 | 1456 | if (register_framebuffer(info) < 0) { |
---|
1457 | 1457 | framebuffer_release(info); |
---|
1458 | | - return; |
---|
| 1458 | + return -ENODEV; |
---|
1459 | 1459 | } |
---|
1460 | 1460 | |
---|
1461 | 1461 | tmp = (read_reg_le32(par->dc_regs, SSTATUS) & 0x0f00) >> 8; |
---|
1462 | 1462 | fb_info(info, "%s frame buffer; %uMB vram; chip version %u\n", |
---|
1463 | 1463 | info->fix.id, info->fix.smem_len >> 20, tmp); |
---|
| 1464 | + return 0; |
---|
1464 | 1465 | } |
---|
1465 | 1466 | |
---|
1466 | 1467 | static int imsttfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent) |
---|
.. | .. |
---|
1469 | 1470 | struct imstt_par *par; |
---|
1470 | 1471 | struct fb_info *info; |
---|
1471 | 1472 | struct device_node *dp; |
---|
| 1473 | + int ret = -ENOMEM; |
---|
1472 | 1474 | |
---|
1473 | 1475 | dp = pci_device_to_OF_node(pdev); |
---|
1474 | 1476 | if(dp) |
---|
.. | .. |
---|
1504 | 1506 | default: |
---|
1505 | 1507 | printk(KERN_INFO "imsttfb: Device 0x%x unknown, " |
---|
1506 | 1508 | "contact maintainer.\n", pdev->device); |
---|
1507 | | - release_mem_region(addr, size); |
---|
1508 | | - framebuffer_release(info); |
---|
1509 | | - return -ENODEV; |
---|
| 1509 | + ret = -ENODEV; |
---|
| 1510 | + goto error; |
---|
1510 | 1511 | } |
---|
1511 | 1512 | |
---|
1512 | 1513 | info->fix.smem_start = addr; |
---|
1513 | 1514 | info->screen_base = (__u8 *)ioremap(addr, par->ramdac == IBM ? |
---|
1514 | 1515 | 0x400000 : 0x800000); |
---|
| 1516 | + if (!info->screen_base) |
---|
| 1517 | + goto error; |
---|
1515 | 1518 | info->fix.mmio_start = addr + 0x800000; |
---|
1516 | 1519 | par->dc_regs = ioremap(addr + 0x800000, 0x1000); |
---|
| 1520 | + if (!par->dc_regs) |
---|
| 1521 | + goto error; |
---|
1517 | 1522 | par->cmap_regs_phys = addr + 0x840000; |
---|
1518 | 1523 | par->cmap_regs = (__u8 *)ioremap(addr + 0x840000, 0x1000); |
---|
| 1524 | + if (!par->cmap_regs) |
---|
| 1525 | + goto error; |
---|
1519 | 1526 | 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; |
---|
1521 | 1531 | |
---|
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; |
---|
1524 | 1540 | } |
---|
1525 | 1541 | |
---|
1526 | 1542 | static void imsttfb_remove(struct pci_dev *pdev) |
---|