aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/gadget/at91_udc.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/gadget/at91_udc.c')
-rw-r--r--drivers/usb/gadget/at91_udc.c25
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);
1783fail0: 1790fail0:
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);