aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRonald Wahl <ronald.wahl@raritan.com>2014-11-19 10:37:27 -0500
committerFelipe Balbi <balbi@ti.com>2014-11-20 14:50:17 -0500
commitb2ba27a5c56ff7204d8a8684893d64d4afe2cee5 (patch)
tree0531ca8bcf629ac59cda80933a3b82c772ea576a
parentcf0b1d1309790fbae27e7276ae4cb30c38ac9fc8 (diff)
usb: gadget: at91_udc: move prepare clk into process context
Commit 7628083227b6bc4a7e33d7c381d7a4e558424b6b (usb: gadget: at91_udc: prepare clk before calling enable) added clock preparation in interrupt context. This is not allowed as it might sleep. Also setting the clock rate is unsafe to call from there for the same reason. Move clock preparation and setting clock rate into process context (at91udc_probe). Signed-off-by: Ronald Wahl <ronald.wahl@raritan.com> Acked-by: Alexandre Belloni <alexandre.belloni@free-electrons.com> Acked-by: Boris Brezillon <boris.brezillon@free-electrons.com> Acked-by: Nicolas Ferre <nicolas.ferre@atmel.com> Cc: Felipe Balbi <balbi@ti.com> Cc: <stable@vger.kernel.org> # v3.17+ Signed-off-by: Felipe Balbi <balbi@ti.com>
-rw-r--r--drivers/usb/gadget/udc/at91_udc.c44
1 files changed, 32 insertions, 12 deletions
diff --git a/drivers/usb/gadget/udc/at91_udc.c b/drivers/usb/gadget/udc/at91_udc.c
index fe0534c0e3d4..eb2999c5d03c 100644
--- a/drivers/usb/gadget/udc/at91_udc.c
+++ b/drivers/usb/gadget/udc/at91_udc.c
@@ -895,12 +895,10 @@ static void clk_on(struct at91_udc *udc)
895 return; 895 return;
896 udc->clocked = 1; 896 udc->clocked = 1;
897 897
898 if (IS_ENABLED(CONFIG_COMMON_CLK)) { 898 if (IS_ENABLED(CONFIG_COMMON_CLK))
899 clk_set_rate(udc->uclk, 48000000); 899 clk_enable(udc->uclk);
900 clk_prepare_enable(udc->uclk); 900 clk_enable(udc->iclk);
901 } 901 clk_enable(udc->fclk);
902 clk_prepare_enable(udc->iclk);
903 clk_prepare_enable(udc->fclk);
904} 902}
905 903
906static void clk_off(struct at91_udc *udc) 904static void clk_off(struct at91_udc *udc)
@@ -909,10 +907,10 @@ static void clk_off(struct at91_udc *udc)
909 return; 907 return;
910 udc->clocked = 0; 908 udc->clocked = 0;
911 udc->gadget.speed = USB_SPEED_UNKNOWN; 909 udc->gadget.speed = USB_SPEED_UNKNOWN;
912 clk_disable_unprepare(udc->fclk); 910 clk_disable(udc->fclk);
913 clk_disable_unprepare(udc->iclk); 911 clk_disable(udc->iclk);
914 if (IS_ENABLED(CONFIG_COMMON_CLK)) 912 if (IS_ENABLED(CONFIG_COMMON_CLK))
915 clk_disable_unprepare(udc->uclk); 913 clk_disable(udc->uclk);
916} 914}
917 915
918/* 916/*
@@ -1793,14 +1791,24 @@ static int at91udc_probe(struct platform_device *pdev)
1793 } 1791 }
1794 1792
1795 /* don't do anything until we have both gadget driver and VBUS */ 1793 /* don't do anything until we have both gadget driver and VBUS */
1794 if (IS_ENABLED(CONFIG_COMMON_CLK)) {
1795 clk_set_rate(udc->uclk, 48000000);
1796 retval = clk_prepare(udc->uclk);
1797 if (retval)
1798 goto fail1;
1799 }
1800 retval = clk_prepare(udc->fclk);
1801 if (retval)
1802 goto fail1a;
1803
1796 retval = clk_prepare_enable(udc->iclk); 1804 retval = clk_prepare_enable(udc->iclk);
1797 if (retval) 1805 if (retval)
1798 goto fail1; 1806 goto fail1b;
1799 at91_udp_write(udc, AT91_UDP_TXVC, AT91_UDP_TXVC_TXVDIS); 1807 at91_udp_write(udc, AT91_UDP_TXVC, AT91_UDP_TXVC_TXVDIS);
1800 at91_udp_write(udc, AT91_UDP_IDR, 0xffffffff); 1808 at91_udp_write(udc, AT91_UDP_IDR, 0xffffffff);
1801 /* Clear all pending interrupts - UDP may be used by bootloader. */ 1809 /* Clear all pending interrupts - UDP may be used by bootloader. */
1802 at91_udp_write(udc, AT91_UDP_ICR, 0xffffffff); 1810 at91_udp_write(udc, AT91_UDP_ICR, 0xffffffff);
1803 clk_disable_unprepare(udc->iclk); 1811 clk_disable(udc->iclk);
1804 1812
1805 /* request UDC and maybe VBUS irqs */ 1813 /* request UDC and maybe VBUS irqs */
1806 udc->udp_irq = platform_get_irq(pdev, 0); 1814 udc->udp_irq = platform_get_irq(pdev, 0);
@@ -1808,7 +1816,7 @@ static int at91udc_probe(struct platform_device *pdev)
1808 0, driver_name, udc); 1816 0, driver_name, udc);
1809 if (retval < 0) { 1817 if (retval < 0) {
1810 DBG("request irq %d failed\n", udc->udp_irq); 1818 DBG("request irq %d failed\n", udc->udp_irq);
1811 goto fail1; 1819 goto fail1c;
1812 } 1820 }
1813 if (gpio_is_valid(udc->board.vbus_pin)) { 1821 if (gpio_is_valid(udc->board.vbus_pin)) {
1814 retval = gpio_request(udc->board.vbus_pin, "udc_vbus"); 1822 retval = gpio_request(udc->board.vbus_pin, "udc_vbus");
@@ -1861,6 +1869,13 @@ fail3:
1861 gpio_free(udc->board.vbus_pin); 1869 gpio_free(udc->board.vbus_pin);
1862fail2: 1870fail2:
1863 free_irq(udc->udp_irq, udc); 1871 free_irq(udc->udp_irq, udc);
1872fail1c:
1873 clk_unprepare(udc->iclk);
1874fail1b:
1875 clk_unprepare(udc->fclk);
1876fail1a:
1877 if (IS_ENABLED(CONFIG_COMMON_CLK))
1878 clk_unprepare(udc->uclk);
1864fail1: 1879fail1:
1865 if (IS_ENABLED(CONFIG_COMMON_CLK) && !IS_ERR(udc->uclk)) 1880 if (IS_ENABLED(CONFIG_COMMON_CLK) && !IS_ERR(udc->uclk))
1866 clk_put(udc->uclk); 1881 clk_put(udc->uclk);
@@ -1909,6 +1924,11 @@ static int __exit at91udc_remove(struct platform_device *pdev)
1909 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1924 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1910 release_mem_region(res->start, resource_size(res)); 1925 release_mem_region(res->start, resource_size(res));
1911 1926
1927 if (IS_ENABLED(CONFIG_COMMON_CLK))
1928 clk_unprepare(udc->uclk);
1929 clk_unprepare(udc->fclk);
1930 clk_unprepare(udc->iclk);
1931
1912 clk_put(udc->iclk); 1932 clk_put(udc->iclk);
1913 clk_put(udc->fclk); 1933 clk_put(udc->fclk);
1914 if (IS_ENABLED(CONFIG_COMMON_CLK)) 1934 if (IS_ENABLED(CONFIG_COMMON_CLK))