Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

usb: gadget: at91_udc: Simplify probe and remove functions

Make use of devm_ functions to simplify probe and remove code.

Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
Acked-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
Acked-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com>

authored by

Boris Brezillon and committed by
Nicolas Ferre
422cde25 9f00fc1d

+39 -77
+39 -77
drivers/usb/gadget/udc/at91_udc.c
··· 1710 1710 int retval; 1711 1711 struct resource *res; 1712 1712 1713 - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1714 - if (!res) 1715 - return -ENXIO; 1716 - 1717 - if (!request_mem_region(res->start, resource_size(res), driver_name)) { 1718 - DBG("someone's using UDC memory\n"); 1719 - return -EBUSY; 1720 - } 1721 - 1722 1713 /* init software state */ 1723 1714 udc = &controller; 1724 1715 udc->gadget.dev.parent = dev; ··· 1722 1731 if (cpu_is_at91rm9200()) { 1723 1732 if (!gpio_is_valid(udc->board.pullup_pin)) { 1724 1733 DBG("no D+ pullup?\n"); 1725 - retval = -ENODEV; 1726 - goto fail0; 1734 + return -ENODEV; 1727 1735 } 1728 - retval = gpio_request(udc->board.pullup_pin, "udc_pullup"); 1736 + retval = devm_gpio_request(dev, udc->board.pullup_pin, 1737 + "udc_pullup"); 1729 1738 if (retval) { 1730 1739 DBG("D+ pullup is busy\n"); 1731 - goto fail0; 1740 + return retval; 1732 1741 } 1733 1742 gpio_direction_output(udc->board.pullup_pin, 1734 1743 udc->board.pullup_active_low); ··· 1747 1756 udc->ep[3].maxpacket = 64; 1748 1757 } 1749 1758 1750 - udc->udp_baseaddr = ioremap(res->start, resource_size(res)); 1751 - if (!udc->udp_baseaddr) { 1752 - retval = -ENOMEM; 1753 - goto fail0a; 1754 - } 1759 + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1760 + udc->udp_baseaddr = devm_ioremap_resource(dev, res); 1761 + if (IS_ERR(udc->udp_baseaddr)) 1762 + return PTR_ERR(udc->udp_baseaddr); 1755 1763 1756 1764 udc_reinit(udc); 1757 1765 1758 1766 /* get interface and function clocks */ 1759 - udc->iclk = clk_get(dev, "pclk"); 1760 - udc->fclk = clk_get(dev, "hclk"); 1761 - if (IS_ERR(udc->iclk) || IS_ERR(udc->fclk)) { 1762 - DBG("clocks missing\n"); 1763 - retval = -ENODEV; 1764 - goto fail1; 1765 - } 1767 + udc->iclk = devm_clk_get(dev, "pclk"); 1768 + if (IS_ERR(udc->iclk)) 1769 + return PTR_ERR(udc->iclk); 1770 + 1771 + udc->fclk = devm_clk_get(dev, "hclk"); 1772 + if (IS_ERR(udc->fclk)) 1773 + return PTR_ERR(udc->fclk); 1766 1774 1767 1775 /* don't do anything until we have both gadget driver and VBUS */ 1768 1776 clk_set_rate(udc->fclk, 48000000); 1769 1777 retval = clk_prepare(udc->fclk); 1770 1778 if (retval) 1771 - goto fail1; 1779 + return retval; 1772 1780 1773 1781 retval = clk_prepare_enable(udc->iclk); 1774 1782 if (retval) 1775 - goto fail1b; 1783 + goto err_unprepare_fclk; 1784 + 1776 1785 at91_udp_write(udc, AT91_UDP_TXVC, AT91_UDP_TXVC_TXVDIS); 1777 1786 at91_udp_write(udc, AT91_UDP_IDR, 0xffffffff); 1778 1787 /* Clear all pending interrupts - UDP may be used by bootloader. */ ··· 1781 1790 1782 1791 /* request UDC and maybe VBUS irqs */ 1783 1792 udc->udp_irq = platform_get_irq(pdev, 0); 1784 - retval = request_irq(udc->udp_irq, at91_udc_irq, 1785 - 0, driver_name, udc); 1786 - if (retval < 0) { 1793 + retval = devm_request_irq(dev, udc->udp_irq, at91_udc_irq, 0, 1794 + driver_name, udc); 1795 + if (retval) { 1787 1796 DBG("request irq %d failed\n", udc->udp_irq); 1788 - goto fail1c; 1797 + goto err_unprepare_iclk; 1789 1798 } 1799 + 1790 1800 if (gpio_is_valid(udc->board.vbus_pin)) { 1791 - retval = gpio_request(udc->board.vbus_pin, "udc_vbus"); 1792 - if (retval < 0) { 1801 + retval = devm_gpio_request(dev, udc->board.vbus_pin, 1802 + "udc_vbus"); 1803 + if (retval) { 1793 1804 DBG("request vbus pin failed\n"); 1794 - goto fail2; 1805 + goto err_unprepare_iclk; 1795 1806 } 1807 + 1796 1808 gpio_direction_input(udc->board.vbus_pin); 1797 1809 1798 1810 /* ··· 1812 1818 mod_timer(&udc->vbus_timer, 1813 1819 jiffies + VBUS_POLL_TIMEOUT); 1814 1820 } else { 1815 - if (request_irq(gpio_to_irq(udc->board.vbus_pin), 1816 - at91_vbus_irq, 0, driver_name, udc)) { 1821 + retval = devm_request_irq(dev, 1822 + gpio_to_irq(udc->board.vbus_pin), 1823 + at91_vbus_irq, 0, driver_name, udc); 1824 + if (retval) { 1817 1825 DBG("request vbus irq %d failed\n", 1818 1826 udc->board.vbus_pin); 1819 - retval = -EBUSY; 1820 - goto fail3; 1827 + goto err_unprepare_iclk; 1821 1828 } 1822 1829 } 1823 1830 } else { ··· 1827 1832 } 1828 1833 retval = usb_add_gadget_udc(dev, &udc->gadget); 1829 1834 if (retval) 1830 - goto fail4; 1835 + goto err_unprepare_iclk; 1831 1836 dev_set_drvdata(dev, udc); 1832 1837 device_init_wakeup(dev, 1); 1833 1838 create_debug_file(udc); 1834 1839 1835 1840 INFO("%s version %s\n", driver_name, DRIVER_VERSION); 1836 1841 return 0; 1837 - fail4: 1838 - if (gpio_is_valid(udc->board.vbus_pin) && !udc->board.vbus_polled) 1839 - free_irq(gpio_to_irq(udc->board.vbus_pin), udc); 1840 - fail3: 1841 - if (gpio_is_valid(udc->board.vbus_pin)) 1842 - gpio_free(udc->board.vbus_pin); 1843 - fail2: 1844 - free_irq(udc->udp_irq, udc); 1845 - fail1c: 1842 + 1843 + err_unprepare_iclk: 1846 1844 clk_unprepare(udc->iclk); 1847 - fail1b: 1845 + err_unprepare_fclk: 1848 1846 clk_unprepare(udc->fclk); 1849 - fail1: 1850 - if (!IS_ERR(udc->fclk)) 1851 - clk_put(udc->fclk); 1852 - if (!IS_ERR(udc->iclk)) 1853 - clk_put(udc->iclk); 1854 - iounmap(udc->udp_baseaddr); 1855 - fail0a: 1856 - if (cpu_is_at91rm9200()) 1857 - gpio_free(udc->board.pullup_pin); 1858 - fail0: 1859 - release_mem_region(res->start, resource_size(res)); 1847 + 1860 1848 DBG("%s probe failed, %d\n", driver_name, retval); 1849 + 1861 1850 return retval; 1862 1851 } 1863 1852 1864 1853 static int __exit at91udc_remove(struct platform_device *pdev) 1865 1854 { 1866 1855 struct at91_udc *udc = platform_get_drvdata(pdev); 1867 - struct resource *res; 1868 1856 unsigned long flags; 1869 1857 1870 1858 DBG("remove\n"); ··· 1862 1884 1863 1885 device_init_wakeup(&pdev->dev, 0); 1864 1886 remove_debug_file(udc); 1865 - if (gpio_is_valid(udc->board.vbus_pin)) { 1866 - free_irq(gpio_to_irq(udc->board.vbus_pin), udc); 1867 - gpio_free(udc->board.vbus_pin); 1868 - } 1869 - free_irq(udc->udp_irq, udc); 1870 - iounmap(udc->udp_baseaddr); 1871 - 1872 - if (cpu_is_at91rm9200()) 1873 - gpio_free(udc->board.pullup_pin); 1874 - 1875 - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1876 - release_mem_region(res->start, resource_size(res)); 1877 - 1878 1887 clk_unprepare(udc->fclk); 1879 1888 clk_unprepare(udc->iclk); 1880 - 1881 - clk_put(udc->iclk); 1882 - clk_put(udc->fclk); 1883 1889 1884 1890 return 0; 1885 1891 }