aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/gadget/udc/at91_udc.c
diff options
context:
space:
mode:
authorBoris Brezillon <boris.brezillon@free-electrons.com>2015-01-14 11:22:01 -0500
committerNicolas Ferre <nicolas.ferre@atmel.com>2015-01-15 08:52:06 -0500
commit422cde259ab62fcddcb3e50f44f761cf26982c1e (patch)
tree973d5d06cd3f42da1c8de859d84fad77ecdfe11e /drivers/usb/gadget/udc/at91_udc.c
parent9f00fc1dae4a2c909b970f07d17ef649f72873fe (diff)
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>
Diffstat (limited to 'drivers/usb/gadget/udc/at91_udc.c')
-rw-r--r--drivers/usb/gadget/udc/at91_udc.c116
1 files changed, 39 insertions, 77 deletions
diff --git a/drivers/usb/gadget/udc/at91_udc.c b/drivers/usb/gadget/udc/at91_udc.c
index be7e16037ac4..4dba2c65dfd4 100644
--- a/drivers/usb/gadget/udc/at91_udc.c
+++ b/drivers/usb/gadget/udc/at91_udc.c
@@ -1710,15 +1710,6 @@ static int at91udc_probe(struct platform_device *pdev)
1710 int retval; 1710 int retval;
1711 struct resource *res; 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 /* init software state */ 1713 /* init software state */
1723 udc = &controller; 1714 udc = &controller;
1724 udc->gadget.dev.parent = dev; 1715 udc->gadget.dev.parent = dev;
@@ -1731,13 +1722,13 @@ static int at91udc_probe(struct platform_device *pdev)
1731 if (cpu_is_at91rm9200()) { 1722 if (cpu_is_at91rm9200()) {
1732 if (!gpio_is_valid(udc->board.pullup_pin)) { 1723 if (!gpio_is_valid(udc->board.pullup_pin)) {
1733 DBG("no D+ pullup?\n"); 1724 DBG("no D+ pullup?\n");
1734 retval = -ENODEV; 1725 return -ENODEV;
1735 goto fail0;
1736 } 1726 }
1737 retval = gpio_request(udc->board.pullup_pin, "udc_pullup"); 1727 retval = devm_gpio_request(dev, udc->board.pullup_pin,
1728 "udc_pullup");
1738 if (retval) { 1729 if (retval) {
1739 DBG("D+ pullup is busy\n"); 1730 DBG("D+ pullup is busy\n");
1740 goto fail0; 1731 return retval;
1741 } 1732 }
1742 gpio_direction_output(udc->board.pullup_pin, 1733 gpio_direction_output(udc->board.pullup_pin,
1743 udc->board.pullup_active_low); 1734 udc->board.pullup_active_low);
@@ -1756,32 +1747,32 @@ static int at91udc_probe(struct platform_device *pdev)
1756 udc->ep[3].maxpacket = 64; 1747 udc->ep[3].maxpacket = 64;
1757 } 1748 }
1758 1749
1759 udc->udp_baseaddr = ioremap(res->start, resource_size(res)); 1750 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1760 if (!udc->udp_baseaddr) { 1751 udc->udp_baseaddr = devm_ioremap_resource(dev, res);
1761 retval = -ENOMEM; 1752 if (IS_ERR(udc->udp_baseaddr))
1762 goto fail0a; 1753 return PTR_ERR(udc->udp_baseaddr);
1763 }
1764 1754
1765 udc_reinit(udc); 1755 udc_reinit(udc);
1766 1756
1767 /* get interface and function clocks */ 1757 /* get interface and function clocks */
1768 udc->iclk = clk_get(dev, "pclk"); 1758 udc->iclk = devm_clk_get(dev, "pclk");
1769 udc->fclk = clk_get(dev, "hclk"); 1759 if (IS_ERR(udc->iclk))
1770 if (IS_ERR(udc->iclk) || IS_ERR(udc->fclk)) { 1760 return PTR_ERR(udc->iclk);
1771 DBG("clocks missing\n"); 1761
1772 retval = -ENODEV; 1762 udc->fclk = devm_clk_get(dev, "hclk");
1773 goto fail1; 1763 if (IS_ERR(udc->fclk))
1774 } 1764 return PTR_ERR(udc->fclk);
1775 1765
1776 /* don't do anything until we have both gadget driver and VBUS */ 1766 /* don't do anything until we have both gadget driver and VBUS */
1777 clk_set_rate(udc->fclk, 48000000); 1767 clk_set_rate(udc->fclk, 48000000);
1778 retval = clk_prepare(udc->fclk); 1768 retval = clk_prepare(udc->fclk);
1779 if (retval) 1769 if (retval)
1780 goto fail1; 1770 return retval;
1781 1771
1782 retval = clk_prepare_enable(udc->iclk); 1772 retval = clk_prepare_enable(udc->iclk);
1783 if (retval) 1773 if (retval)
1784 goto fail1b; 1774 goto err_unprepare_fclk;
1775
1785 at91_udp_write(udc, AT91_UDP_TXVC, AT91_UDP_TXVC_TXVDIS); 1776 at91_udp_write(udc, AT91_UDP_TXVC, AT91_UDP_TXVC_TXVDIS);
1786 at91_udp_write(udc, AT91_UDP_IDR, 0xffffffff); 1777 at91_udp_write(udc, AT91_UDP_IDR, 0xffffffff);
1787 /* Clear all pending interrupts - UDP may be used by bootloader. */ 1778 /* Clear all pending interrupts - UDP may be used by bootloader. */
@@ -1790,18 +1781,21 @@ static int at91udc_probe(struct platform_device *pdev)
1790 1781
1791 /* request UDC and maybe VBUS irqs */ 1782 /* request UDC and maybe VBUS irqs */
1792 udc->udp_irq = platform_get_irq(pdev, 0); 1783 udc->udp_irq = platform_get_irq(pdev, 0);
1793 retval = request_irq(udc->udp_irq, at91_udc_irq, 1784 retval = devm_request_irq(dev, udc->udp_irq, at91_udc_irq, 0,
1794 0, driver_name, udc); 1785 driver_name, udc);
1795 if (retval < 0) { 1786 if (retval) {
1796 DBG("request irq %d failed\n", udc->udp_irq); 1787 DBG("request irq %d failed\n", udc->udp_irq);
1797 goto fail1c; 1788 goto err_unprepare_iclk;
1798 } 1789 }
1790
1799 if (gpio_is_valid(udc->board.vbus_pin)) { 1791 if (gpio_is_valid(udc->board.vbus_pin)) {
1800 retval = gpio_request(udc->board.vbus_pin, "udc_vbus"); 1792 retval = devm_gpio_request(dev, udc->board.vbus_pin,
1801 if (retval < 0) { 1793 "udc_vbus");
1794 if (retval) {
1802 DBG("request vbus pin failed\n"); 1795 DBG("request vbus pin failed\n");
1803 goto fail2; 1796 goto err_unprepare_iclk;
1804 } 1797 }
1798
1805 gpio_direction_input(udc->board.vbus_pin); 1799 gpio_direction_input(udc->board.vbus_pin);
1806 1800
1807 /* 1801 /*
@@ -1818,12 +1812,13 @@ static int at91udc_probe(struct platform_device *pdev)
1818 mod_timer(&udc->vbus_timer, 1812 mod_timer(&udc->vbus_timer,
1819 jiffies + VBUS_POLL_TIMEOUT); 1813 jiffies + VBUS_POLL_TIMEOUT);
1820 } else { 1814 } else {
1821 if (request_irq(gpio_to_irq(udc->board.vbus_pin), 1815 retval = devm_request_irq(dev,
1822 at91_vbus_irq, 0, driver_name, udc)) { 1816 gpio_to_irq(udc->board.vbus_pin),
1817 at91_vbus_irq, 0, driver_name, udc);
1818 if (retval) {
1823 DBG("request vbus irq %d failed\n", 1819 DBG("request vbus irq %d failed\n",
1824 udc->board.vbus_pin); 1820 udc->board.vbus_pin);
1825 retval = -EBUSY; 1821 goto err_unprepare_iclk;
1826 goto fail3;
1827 } 1822 }
1828 } 1823 }
1829 } else { 1824 } else {
@@ -1832,44 +1827,27 @@ static int at91udc_probe(struct platform_device *pdev)
1832 } 1827 }
1833 retval = usb_add_gadget_udc(dev, &udc->gadget); 1828 retval = usb_add_gadget_udc(dev, &udc->gadget);
1834 if (retval) 1829 if (retval)
1835 goto fail4; 1830 goto err_unprepare_iclk;
1836 dev_set_drvdata(dev, udc); 1831 dev_set_drvdata(dev, udc);
1837 device_init_wakeup(dev, 1); 1832 device_init_wakeup(dev, 1);
1838 create_debug_file(udc); 1833 create_debug_file(udc);
1839 1834
1840 INFO("%s version %s\n", driver_name, DRIVER_VERSION); 1835 INFO("%s version %s\n", driver_name, DRIVER_VERSION);
1841 return 0; 1836 return 0;
1842fail4: 1837
1843 if (gpio_is_valid(udc->board.vbus_pin) && !udc->board.vbus_polled) 1838err_unprepare_iclk:
1844 free_irq(gpio_to_irq(udc->board.vbus_pin), udc);
1845fail3:
1846 if (gpio_is_valid(udc->board.vbus_pin))
1847 gpio_free(udc->board.vbus_pin);
1848fail2:
1849 free_irq(udc->udp_irq, udc);
1850fail1c:
1851 clk_unprepare(udc->iclk); 1839 clk_unprepare(udc->iclk);
1852fail1b: 1840err_unprepare_fclk:
1853 clk_unprepare(udc->fclk); 1841 clk_unprepare(udc->fclk);
1854fail1: 1842
1855 if (!IS_ERR(udc->fclk))
1856 clk_put(udc->fclk);
1857 if (!IS_ERR(udc->iclk))
1858 clk_put(udc->iclk);
1859 iounmap(udc->udp_baseaddr);
1860fail0a:
1861 if (cpu_is_at91rm9200())
1862 gpio_free(udc->board.pullup_pin);
1863fail0:
1864 release_mem_region(res->start, resource_size(res));
1865 DBG("%s probe failed, %d\n", driver_name, retval); 1843 DBG("%s probe failed, %d\n", driver_name, retval);
1844
1866 return retval; 1845 return retval;
1867} 1846}
1868 1847
1869static int __exit at91udc_remove(struct platform_device *pdev) 1848static int __exit at91udc_remove(struct platform_device *pdev)
1870{ 1849{
1871 struct at91_udc *udc = platform_get_drvdata(pdev); 1850 struct at91_udc *udc = platform_get_drvdata(pdev);
1872 struct resource *res;
1873 unsigned long flags; 1851 unsigned long flags;
1874 1852
1875 DBG("remove\n"); 1853 DBG("remove\n");
@@ -1884,25 +1862,9 @@ static int __exit at91udc_remove(struct platform_device *pdev)
1884 1862
1885 device_init_wakeup(&pdev->dev, 0); 1863 device_init_wakeup(&pdev->dev, 0);
1886 remove_debug_file(udc); 1864 remove_debug_file(udc);
1887 if (gpio_is_valid(udc->board.vbus_pin)) {
1888 free_irq(gpio_to_irq(udc->board.vbus_pin), udc);
1889 gpio_free(udc->board.vbus_pin);
1890 }
1891 free_irq(udc->udp_irq, udc);
1892 iounmap(udc->udp_baseaddr);
1893
1894 if (cpu_is_at91rm9200())
1895 gpio_free(udc->board.pullup_pin);
1896
1897 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1898 release_mem_region(res->start, resource_size(res));
1899
1900 clk_unprepare(udc->fclk); 1865 clk_unprepare(udc->fclk);
1901 clk_unprepare(udc->iclk); 1866 clk_unprepare(udc->iclk);
1902 1867
1903 clk_put(udc->iclk);
1904 clk_put(udc->fclk);
1905
1906 return 0; 1868 return 0;
1907} 1869}
1908 1870