diff options
author | Boris Brezillon <boris.brezillon@free-electrons.com> | 2015-01-14 11:22:01 -0500 |
---|---|---|
committer | Nicolas Ferre <nicolas.ferre@atmel.com> | 2015-01-15 08:52:06 -0500 |
commit | 422cde259ab62fcddcb3e50f44f761cf26982c1e (patch) | |
tree | 973d5d06cd3f42da1c8de859d84fad77ecdfe11e /drivers/usb/gadget/udc/at91_udc.c | |
parent | 9f00fc1dae4a2c909b970f07d17ef649f72873fe (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.c | 116 |
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; |
1842 | fail4: | 1837 | |
1843 | if (gpio_is_valid(udc->board.vbus_pin) && !udc->board.vbus_polled) | 1838 | err_unprepare_iclk: |
1844 | free_irq(gpio_to_irq(udc->board.vbus_pin), udc); | ||
1845 | fail3: | ||
1846 | if (gpio_is_valid(udc->board.vbus_pin)) | ||
1847 | gpio_free(udc->board.vbus_pin); | ||
1848 | fail2: | ||
1849 | free_irq(udc->udp_irq, udc); | ||
1850 | fail1c: | ||
1851 | clk_unprepare(udc->iclk); | 1839 | clk_unprepare(udc->iclk); |
1852 | fail1b: | 1840 | err_unprepare_fclk: |
1853 | clk_unprepare(udc->fclk); | 1841 | clk_unprepare(udc->fclk); |
1854 | fail1: | 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); | ||
1860 | fail0a: | ||
1861 | if (cpu_is_at91rm9200()) | ||
1862 | gpio_free(udc->board.pullup_pin); | ||
1863 | fail0: | ||
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 | ||
1869 | static int __exit at91udc_remove(struct platform_device *pdev) | 1848 | static 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 | ||