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 | |
| 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>
| -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 | ||
