.. | .. |
---|
1621 | 1621 | struct usb_device *usbdev; |
---|
1622 | 1622 | struct ufx_data *dev; |
---|
1623 | 1623 | struct fb_info *info; |
---|
1624 | | - int retval; |
---|
| 1624 | + int retval = -ENOMEM; |
---|
1625 | 1625 | u32 id_rev, fpga_rev; |
---|
1626 | 1626 | |
---|
1627 | 1627 | /* usb initialization */ |
---|
.. | .. |
---|
1653 | 1653 | |
---|
1654 | 1654 | if (!ufx_alloc_urb_list(dev, WRITES_IN_FLIGHT, MAX_TRANSFER)) { |
---|
1655 | 1655 | dev_err(dev->gdev, "ufx_alloc_urb_list failed\n"); |
---|
1656 | | - goto e_nomem; |
---|
| 1656 | + goto put_ref; |
---|
1657 | 1657 | } |
---|
1658 | 1658 | |
---|
1659 | 1659 | /* We don't register a new USB class. Our client interface is fbdev */ |
---|
1660 | 1660 | |
---|
1661 | 1661 | /* allocates framebuffer driver structure, not framebuffer memory */ |
---|
1662 | 1662 | info = framebuffer_alloc(0, &usbdev->dev); |
---|
1663 | | - if (!info) |
---|
1664 | | - goto e_nomem; |
---|
| 1663 | + if (!info) { |
---|
| 1664 | + dev_err(dev->gdev, "framebuffer_alloc failed\n"); |
---|
| 1665 | + goto free_urb_list; |
---|
| 1666 | + } |
---|
1665 | 1667 | |
---|
1666 | 1668 | dev->info = info; |
---|
1667 | 1669 | info->par = dev; |
---|
.. | .. |
---|
1704 | 1706 | check_warn_goto_error(retval, "unable to find common mode for display and adapter"); |
---|
1705 | 1707 | |
---|
1706 | 1708 | retval = ufx_reg_set_bits(dev, 0x4000, 0x00000001); |
---|
1707 | | - check_warn_goto_error(retval, "error %d enabling graphics engine", retval); |
---|
| 1709 | + if (retval < 0) { |
---|
| 1710 | + dev_err(dev->gdev, "error %d enabling graphics engine", retval); |
---|
| 1711 | + goto setup_modes; |
---|
| 1712 | + } |
---|
1708 | 1713 | |
---|
1709 | 1714 | /* ready to begin using device */ |
---|
1710 | 1715 | atomic_set(&dev->usb_active, 1); |
---|
1711 | 1716 | |
---|
1712 | 1717 | dev_dbg(dev->gdev, "checking var"); |
---|
1713 | 1718 | retval = ufx_ops_check_var(&info->var, info); |
---|
1714 | | - check_warn_goto_error(retval, "error %d ufx_ops_check_var", retval); |
---|
| 1719 | + if (retval < 0) { |
---|
| 1720 | + dev_err(dev->gdev, "error %d ufx_ops_check_var", retval); |
---|
| 1721 | + goto reset_active; |
---|
| 1722 | + } |
---|
1715 | 1723 | |
---|
1716 | 1724 | dev_dbg(dev->gdev, "setting par"); |
---|
1717 | 1725 | retval = ufx_ops_set_par(info); |
---|
1718 | | - check_warn_goto_error(retval, "error %d ufx_ops_set_par", retval); |
---|
| 1726 | + if (retval < 0) { |
---|
| 1727 | + dev_err(dev->gdev, "error %d ufx_ops_set_par", retval); |
---|
| 1728 | + goto reset_active; |
---|
| 1729 | + } |
---|
1719 | 1730 | |
---|
1720 | 1731 | dev_dbg(dev->gdev, "registering framebuffer"); |
---|
1721 | 1732 | retval = register_framebuffer(info); |
---|
1722 | | - check_warn_goto_error(retval, "error %d register_framebuffer", retval); |
---|
| 1733 | + if (retval < 0) { |
---|
| 1734 | + dev_err(dev->gdev, "error %d register_framebuffer", retval); |
---|
| 1735 | + goto reset_active; |
---|
| 1736 | + } |
---|
1723 | 1737 | |
---|
1724 | 1738 | dev_info(dev->gdev, "SMSC UDX USB device /dev/fb%d attached. %dx%d resolution." |
---|
1725 | 1739 | " Using %dK framebuffer memory\n", info->node, |
---|
.. | .. |
---|
1727 | 1741 | |
---|
1728 | 1742 | return 0; |
---|
1729 | 1743 | |
---|
1730 | | -error: |
---|
1731 | | - fb_dealloc_cmap(&info->cmap); |
---|
1732 | | -destroy_modedb: |
---|
| 1744 | +reset_active: |
---|
| 1745 | + atomic_set(&dev->usb_active, 0); |
---|
| 1746 | +setup_modes: |
---|
1733 | 1747 | fb_destroy_modedb(info->monspecs.modedb); |
---|
1734 | 1748 | vfree(info->screen_base); |
---|
1735 | 1749 | fb_destroy_modelist(&info->modelist); |
---|
| 1750 | +error: |
---|
| 1751 | + fb_dealloc_cmap(&info->cmap); |
---|
| 1752 | +destroy_modedb: |
---|
1736 | 1753 | framebuffer_release(info); |
---|
| 1754 | +free_urb_list: |
---|
| 1755 | + if (dev->urbs.count > 0) |
---|
| 1756 | + ufx_free_urb_list(dev); |
---|
1737 | 1757 | put_ref: |
---|
1738 | 1758 | kref_put(&dev->kref, ufx_free); /* ref for framebuffer */ |
---|
1739 | 1759 | kref_put(&dev->kref, ufx_free); /* last ref from kref_init */ |
---|
1740 | 1760 | return retval; |
---|
1741 | | - |
---|
1742 | | -e_nomem: |
---|
1743 | | - retval = -ENOMEM; |
---|
1744 | | - goto put_ref; |
---|
1745 | 1761 | } |
---|
1746 | 1762 | |
---|
1747 | 1763 | static void ufx_usb_disconnect(struct usb_interface *interface) |
---|