diff options
Diffstat (limited to 'drivers/usb/gadget/at91_udc.c')
-rw-r--r-- | drivers/usb/gadget/at91_udc.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/drivers/usb/gadget/at91_udc.c b/drivers/usb/gadget/at91_udc.c index 66450a1abc22..df1bae9b048e 100644 --- a/drivers/usb/gadget/at91_udc.c +++ b/drivers/usb/gadget/at91_udc.c | |||
@@ -892,7 +892,7 @@ static void pullup(struct at91_udc *udc, int is_on) | |||
892 | 892 | ||
893 | txvc |= AT91_UDP_TXVC_PUON; | 893 | txvc |= AT91_UDP_TXVC_PUON; |
894 | at91_udp_write(udc, AT91_UDP_TXVC, txvc); | 894 | at91_udp_write(udc, AT91_UDP_TXVC, txvc); |
895 | } else if (cpu_is_at91sam9261()) { | 895 | } else if (cpu_is_at91sam9261() || cpu_is_at91sam9g10()) { |
896 | u32 usbpucr; | 896 | u32 usbpucr; |
897 | 897 | ||
898 | usbpucr = at91_sys_read(AT91_MATRIX_USBPUCR); | 898 | usbpucr = at91_sys_read(AT91_MATRIX_USBPUCR); |
@@ -910,7 +910,7 @@ static void pullup(struct at91_udc *udc, int is_on) | |||
910 | 910 | ||
911 | txvc &= ~AT91_UDP_TXVC_PUON; | 911 | txvc &= ~AT91_UDP_TXVC_PUON; |
912 | at91_udp_write(udc, AT91_UDP_TXVC, txvc); | 912 | at91_udp_write(udc, AT91_UDP_TXVC, txvc); |
913 | } else if (cpu_is_at91sam9261()) { | 913 | } else if (cpu_is_at91sam9261() || cpu_is_at91sam9g10()) { |
914 | u32 usbpucr; | 914 | u32 usbpucr; |
915 | 915 | ||
916 | usbpucr = at91_sys_read(AT91_MATRIX_USBPUCR); | 916 | usbpucr = at91_sys_read(AT91_MATRIX_USBPUCR); |
@@ -1370,6 +1370,12 @@ static irqreturn_t at91_udc_irq (int irq, void *_udc) | |||
1370 | { | 1370 | { |
1371 | struct at91_udc *udc = _udc; | 1371 | struct at91_udc *udc = _udc; |
1372 | u32 rescans = 5; | 1372 | u32 rescans = 5; |
1373 | int disable_clock = 0; | ||
1374 | |||
1375 | if (!udc->clocked) { | ||
1376 | clk_on(udc); | ||
1377 | disable_clock = 1; | ||
1378 | } | ||
1373 | 1379 | ||
1374 | while (rescans--) { | 1380 | while (rescans--) { |
1375 | u32 status; | 1381 | u32 status; |
@@ -1458,6 +1464,9 @@ static irqreturn_t at91_udc_irq (int irq, void *_udc) | |||
1458 | } | 1464 | } |
1459 | } | 1465 | } |
1460 | 1466 | ||
1467 | if (disable_clock) | ||
1468 | clk_off(udc); | ||
1469 | |||
1461 | return IRQ_HANDLED; | 1470 | return IRQ_HANDLED; |
1462 | } | 1471 | } |
1463 | 1472 | ||
@@ -1656,9 +1665,7 @@ static int __init at91udc_probe(struct platform_device *pdev) | |||
1656 | if (!res) | 1665 | if (!res) |
1657 | return -ENXIO; | 1666 | return -ENXIO; |
1658 | 1667 | ||
1659 | if (!request_mem_region(res->start, | 1668 | if (!request_mem_region(res->start, resource_size(res), driver_name)) { |
1660 | res->end - res->start + 1, | ||
1661 | driver_name)) { | ||
1662 | DBG("someone's using UDC memory\n"); | 1669 | DBG("someone's using UDC memory\n"); |
1663 | return -EBUSY; | 1670 | return -EBUSY; |
1664 | } | 1671 | } |
@@ -1692,14 +1699,14 @@ static int __init at91udc_probe(struct platform_device *pdev) | |||
1692 | udc->ep[3].maxpacket = 64; | 1699 | udc->ep[3].maxpacket = 64; |
1693 | udc->ep[4].maxpacket = 512; | 1700 | udc->ep[4].maxpacket = 512; |
1694 | udc->ep[5].maxpacket = 512; | 1701 | udc->ep[5].maxpacket = 512; |
1695 | } else if (cpu_is_at91sam9261()) { | 1702 | } else if (cpu_is_at91sam9261() || cpu_is_at91sam9g10()) { |
1696 | udc->ep[3].maxpacket = 64; | 1703 | udc->ep[3].maxpacket = 64; |
1697 | } else if (cpu_is_at91sam9263()) { | 1704 | } else if (cpu_is_at91sam9263()) { |
1698 | udc->ep[0].maxpacket = 64; | 1705 | udc->ep[0].maxpacket = 64; |
1699 | udc->ep[3].maxpacket = 64; | 1706 | udc->ep[3].maxpacket = 64; |
1700 | } | 1707 | } |
1701 | 1708 | ||
1702 | udc->udp_baseaddr = ioremap(res->start, res->end - res->start + 1); | 1709 | udc->udp_baseaddr = ioremap(res->start, resource_size(res)); |
1703 | if (!udc->udp_baseaddr) { | 1710 | if (!udc->udp_baseaddr) { |
1704 | retval = -ENOMEM; | 1711 | retval = -ENOMEM; |
1705 | goto fail0a; | 1712 | goto fail0a; |
@@ -1781,7 +1788,7 @@ fail0a: | |||
1781 | if (cpu_is_at91rm9200()) | 1788 | if (cpu_is_at91rm9200()) |
1782 | gpio_free(udc->board.pullup_pin); | 1789 | gpio_free(udc->board.pullup_pin); |
1783 | fail0: | 1790 | fail0: |
1784 | release_mem_region(res->start, res->end - res->start + 1); | 1791 | release_mem_region(res->start, resource_size(res)); |
1785 | DBG("%s probe failed, %d\n", driver_name, retval); | 1792 | DBG("%s probe failed, %d\n", driver_name, retval); |
1786 | return retval; | 1793 | return retval; |
1787 | } | 1794 | } |
@@ -1813,7 +1820,7 @@ static int __exit at91udc_remove(struct platform_device *pdev) | |||
1813 | gpio_free(udc->board.pullup_pin); | 1820 | gpio_free(udc->board.pullup_pin); |
1814 | 1821 | ||
1815 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 1822 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
1816 | release_mem_region(res->start, res->end - res->start + 1); | 1823 | release_mem_region(res->start, resource_size(res)); |
1817 | 1824 | ||
1818 | clk_put(udc->iclk); | 1825 | clk_put(udc->iclk); |
1819 | clk_put(udc->fclk); | 1826 | clk_put(udc->fclk); |