diff options
-rw-r--r-- | drivers/usb/gadget/pxa2xx_udc.c | 63 | ||||
-rw-r--r-- | include/asm-arm/arch-ixp4xx/udc.h | 22 | ||||
-rw-r--r-- | include/asm-arm/arch-pxa/udc.h | 33 |
3 files changed, 49 insertions, 69 deletions
diff --git a/drivers/usb/gadget/pxa2xx_udc.c b/drivers/usb/gadget/pxa2xx_udc.c index 84392e835d5f..c9ec0b3e582a 100644 --- a/drivers/usb/gadget/pxa2xx_udc.c +++ b/drivers/usb/gadget/pxa2xx_udc.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #undef DEBUG | 27 | #undef DEBUG |
28 | // #define VERBOSE DBG_VERBOSE | 28 | // #define VERBOSE DBG_VERBOSE |
29 | 29 | ||
30 | #include <linux/device.h> | ||
30 | #include <linux/module.h> | 31 | #include <linux/module.h> |
31 | #include <linux/kernel.h> | 32 | #include <linux/kernel.h> |
32 | #include <linux/ioport.h> | 33 | #include <linux/ioport.h> |
@@ -46,19 +47,17 @@ | |||
46 | 47 | ||
47 | #include <asm/byteorder.h> | 48 | #include <asm/byteorder.h> |
48 | #include <asm/dma.h> | 49 | #include <asm/dma.h> |
50 | #include <asm/gpio.h> | ||
49 | #include <asm/io.h> | 51 | #include <asm/io.h> |
50 | #include <asm/system.h> | 52 | #include <asm/system.h> |
51 | #include <asm/mach-types.h> | 53 | #include <asm/mach-types.h> |
52 | #include <asm/unaligned.h> | 54 | #include <asm/unaligned.h> |
53 | #include <asm/hardware.h> | 55 | #include <asm/hardware.h> |
54 | #ifdef CONFIG_ARCH_PXA | ||
55 | #include <asm/arch/pxa-regs.h> | ||
56 | #endif | ||
57 | 56 | ||
58 | #include <linux/usb/ch9.h> | 57 | #include <linux/usb/ch9.h> |
59 | #include <linux/usb_gadget.h> | 58 | #include <linux/usb_gadget.h> |
60 | 59 | ||
61 | #include <asm/arch/udc.h> | 60 | #include <asm/mach/udc_pxa2xx.h> |
62 | 61 | ||
63 | 62 | ||
64 | /* | 63 | /* |
@@ -155,7 +154,7 @@ static int is_vbus_present(void) | |||
155 | struct pxa2xx_udc_mach_info *mach = the_controller->mach; | 154 | struct pxa2xx_udc_mach_info *mach = the_controller->mach; |
156 | 155 | ||
157 | if (mach->gpio_vbus) | 156 | if (mach->gpio_vbus) |
158 | return udc_gpio_get(mach->gpio_vbus); | 157 | return gpio_get_value(mach->gpio_vbus); |
159 | if (mach->udc_is_connected) | 158 | if (mach->udc_is_connected) |
160 | return mach->udc_is_connected(); | 159 | return mach->udc_is_connected(); |
161 | return 1; | 160 | return 1; |
@@ -167,7 +166,7 @@ static void pullup_off(void) | |||
167 | struct pxa2xx_udc_mach_info *mach = the_controller->mach; | 166 | struct pxa2xx_udc_mach_info *mach = the_controller->mach; |
168 | 167 | ||
169 | if (mach->gpio_pullup) | 168 | if (mach->gpio_pullup) |
170 | udc_gpio_set(mach->gpio_pullup, 0); | 169 | gpio_set_value(mach->gpio_pullup, 0); |
171 | else if (mach->udc_command) | 170 | else if (mach->udc_command) |
172 | mach->udc_command(PXA2XX_UDC_CMD_DISCONNECT); | 171 | mach->udc_command(PXA2XX_UDC_CMD_DISCONNECT); |
173 | } | 172 | } |
@@ -177,7 +176,7 @@ static void pullup_on(void) | |||
177 | struct pxa2xx_udc_mach_info *mach = the_controller->mach; | 176 | struct pxa2xx_udc_mach_info *mach = the_controller->mach; |
178 | 177 | ||
179 | if (mach->gpio_pullup) | 178 | if (mach->gpio_pullup) |
180 | udc_gpio_set(mach->gpio_pullup, 1); | 179 | gpio_set_value(mach->gpio_pullup, 1); |
181 | else if (mach->udc_command) | 180 | else if (mach->udc_command) |
182 | mach->udc_command(PXA2XX_UDC_CMD_CONNECT); | 181 | mach->udc_command(PXA2XX_UDC_CMD_CONNECT); |
183 | } | 182 | } |
@@ -1742,7 +1741,7 @@ lubbock_vbus_irq(int irq, void *_dev) | |||
1742 | static irqreturn_t udc_vbus_irq(int irq, void *_dev) | 1741 | static irqreturn_t udc_vbus_irq(int irq, void *_dev) |
1743 | { | 1742 | { |
1744 | struct pxa2xx_udc *dev = _dev; | 1743 | struct pxa2xx_udc *dev = _dev; |
1745 | int vbus = udc_gpio_get(dev->mach->gpio_vbus); | 1744 | int vbus = gpio_get_value(dev->mach->gpio_vbus); |
1746 | 1745 | ||
1747 | pxa2xx_udc_vbus_session(&dev->gadget, vbus); | 1746 | pxa2xx_udc_vbus_session(&dev->gadget, vbus); |
1748 | return IRQ_HANDLED; | 1747 | return IRQ_HANDLED; |
@@ -2535,14 +2534,33 @@ static int __init pxa2xx_udc_probe(struct platform_device *pdev) | |||
2535 | /* other non-static parts of init */ | 2534 | /* other non-static parts of init */ |
2536 | dev->dev = &pdev->dev; | 2535 | dev->dev = &pdev->dev; |
2537 | dev->mach = pdev->dev.platform_data; | 2536 | dev->mach = pdev->dev.platform_data; |
2537 | |||
2538 | if (dev->mach->gpio_vbus) { | 2538 | if (dev->mach->gpio_vbus) { |
2539 | udc_gpio_init_vbus(dev->mach->gpio_vbus); | 2539 | if ((retval = gpio_request(dev->mach->gpio_vbus, |
2540 | vbus_irq = udc_gpio_to_irq(dev->mach->gpio_vbus); | 2540 | "pxa2xx_udc GPIO VBUS"))) { |
2541 | dev_dbg(&pdev->dev, | ||
2542 | "can't get vbus gpio %d, err: %d\n", | ||
2543 | dev->mach->gpio_vbus, retval); | ||
2544 | return -EBUSY; | ||
2545 | } | ||
2546 | gpio_direction_input(dev->mach->gpio_vbus); | ||
2547 | vbus_irq = gpio_to_irq(dev->mach->gpio_vbus); | ||
2541 | set_irq_type(vbus_irq, IRQT_BOTHEDGE); | 2548 | set_irq_type(vbus_irq, IRQT_BOTHEDGE); |
2542 | } else | 2549 | } else |
2543 | vbus_irq = 0; | 2550 | vbus_irq = 0; |
2544 | if (dev->mach->gpio_pullup) | 2551 | |
2545 | udc_gpio_init_pullup(dev->mach->gpio_pullup); | 2552 | if (dev->mach->gpio_pullup) { |
2553 | if ((retval = gpio_request(dev->mach->gpio_pullup, | ||
2554 | "pca2xx_udc GPIO PULLUP"))) { | ||
2555 | dev_dbg(&pdev->dev, | ||
2556 | "can't get pullup gpio %d, err: %d\n", | ||
2557 | dev->mach->gpio_pullup, retval); | ||
2558 | if (dev->mach->gpio_vbus) | ||
2559 | gpio_free(dev->mach->gpio_vbus); | ||
2560 | return -EBUSY; | ||
2561 | } | ||
2562 | gpio_direction_output(dev->mach->gpio_pullup, 0); | ||
2563 | } | ||
2546 | 2564 | ||
2547 | init_timer(&dev->timer); | 2565 | init_timer(&dev->timer); |
2548 | dev->timer.function = udc_watchdog; | 2566 | dev->timer.function = udc_watchdog; |
@@ -2566,6 +2584,10 @@ static int __init pxa2xx_udc_probe(struct platform_device *pdev) | |||
2566 | if (retval != 0) { | 2584 | if (retval != 0) { |
2567 | printk(KERN_ERR "%s: can't get irq %d, err %d\n", | 2585 | printk(KERN_ERR "%s: can't get irq %d, err %d\n", |
2568 | driver_name, irq, retval); | 2586 | driver_name, irq, retval); |
2587 | if (dev->mach->gpio_pullup) | ||
2588 | gpio_free(dev->mach->gpio_pullup); | ||
2589 | if (dev->mach->gpio_vbus) | ||
2590 | gpio_free(dev->mach->gpio_vbus); | ||
2569 | return -EBUSY; | 2591 | return -EBUSY; |
2570 | } | 2592 | } |
2571 | dev->got_irq = 1; | 2593 | dev->got_irq = 1; |
@@ -2581,6 +2603,10 @@ static int __init pxa2xx_udc_probe(struct platform_device *pdev) | |||
2581 | driver_name, LUBBOCK_USB_DISC_IRQ, retval); | 2603 | driver_name, LUBBOCK_USB_DISC_IRQ, retval); |
2582 | lubbock_fail0: | 2604 | lubbock_fail0: |
2583 | free_irq(irq, dev); | 2605 | free_irq(irq, dev); |
2606 | if (dev->mach->gpio_pullup) | ||
2607 | gpio_free(dev->mach->gpio_pullup); | ||
2608 | if (dev->mach->gpio_vbus) | ||
2609 | gpio_free(dev->mach->gpio_vbus); | ||
2584 | return -EBUSY; | 2610 | return -EBUSY; |
2585 | } | 2611 | } |
2586 | retval = request_irq(LUBBOCK_USB_IRQ, | 2612 | retval = request_irq(LUBBOCK_USB_IRQ, |
@@ -2608,6 +2634,10 @@ lubbock_fail0: | |||
2608 | printk(KERN_ERR "%s: can't get irq %i, err %d\n", | 2634 | printk(KERN_ERR "%s: can't get irq %i, err %d\n", |
2609 | driver_name, vbus_irq, retval); | 2635 | driver_name, vbus_irq, retval); |
2610 | free_irq(irq, dev); | 2636 | free_irq(irq, dev); |
2637 | if (dev->mach->gpio_pullup) | ||
2638 | gpio_free(dev->mach->gpio_pullup); | ||
2639 | if (dev->mach->gpio_vbus) | ||
2640 | gpio_free(dev->mach->gpio_vbus); | ||
2611 | return -EBUSY; | 2641 | return -EBUSY; |
2612 | } | 2642 | } |
2613 | } | 2643 | } |
@@ -2641,8 +2671,13 @@ static int __exit pxa2xx_udc_remove(struct platform_device *pdev) | |||
2641 | free_irq(LUBBOCK_USB_IRQ, dev); | 2671 | free_irq(LUBBOCK_USB_IRQ, dev); |
2642 | } | 2672 | } |
2643 | #endif | 2673 | #endif |
2644 | if (dev->mach->gpio_vbus) | 2674 | if (dev->mach->gpio_vbus) { |
2645 | free_irq(IRQ_GPIO(dev->mach->gpio_vbus), dev); | 2675 | free_irq(gpio_to_irq(dev->mach->gpio_vbus), dev); |
2676 | gpio_free(dev->mach->gpio_vbus); | ||
2677 | } | ||
2678 | if (dev->mach->gpio_pullup) | ||
2679 | gpio_free(dev->mach->gpio_pullup); | ||
2680 | |||
2646 | platform_set_drvdata(pdev, NULL); | 2681 | platform_set_drvdata(pdev, NULL); |
2647 | the_controller = NULL; | 2682 | the_controller = NULL; |
2648 | return 0; | 2683 | return 0; |
diff --git a/include/asm-arm/arch-ixp4xx/udc.h b/include/asm-arm/arch-ixp4xx/udc.h index 79b850a3be47..dbdec36ff0d1 100644 --- a/include/asm-arm/arch-ixp4xx/udc.h +++ b/include/asm-arm/arch-ixp4xx/udc.h | |||
@@ -6,25 +6,3 @@ | |||
6 | 6 | ||
7 | extern void ixp4xx_set_udc_info(struct pxa2xx_udc_mach_info *info); | 7 | extern void ixp4xx_set_udc_info(struct pxa2xx_udc_mach_info *info); |
8 | 8 | ||
9 | static inline int udc_gpio_to_irq(unsigned gpio) | ||
10 | { | ||
11 | return 0; | ||
12 | } | ||
13 | |||
14 | static inline void udc_gpio_init_vbus(unsigned gpio) | ||
15 | { | ||
16 | } | ||
17 | |||
18 | static inline void udc_gpio_init_pullup(unsigned gpio) | ||
19 | { | ||
20 | } | ||
21 | |||
22 | static inline int udc_gpio_get(unsigned gpio) | ||
23 | { | ||
24 | return 0; | ||
25 | } | ||
26 | |||
27 | static inline void udc_gpio_set(unsigned gpio, int is_on) | ||
28 | { | ||
29 | } | ||
30 | |||
diff --git a/include/asm-arm/arch-pxa/udc.h b/include/asm-arm/arch-pxa/udc.h index 8bc6f9c3e3ea..27aa3a91012f 100644 --- a/include/asm-arm/arch-pxa/udc.h +++ b/include/asm-arm/arch-pxa/udc.h | |||
@@ -1,41 +1,8 @@ | |||
1 | /* | 1 | /* |
2 | * linux/include/asm-arm/arch-pxa/udc.h | 2 | * linux/include/asm-arm/arch-pxa/udc.h |
3 | * | 3 | * |
4 | * This supports machine-specific differences in how the PXA2xx | ||
5 | * USB Device Controller (UDC) is wired. | ||
6 | * | ||
7 | */ | 4 | */ |
8 | #include <asm/mach/udc_pxa2xx.h> | 5 | #include <asm/mach/udc_pxa2xx.h> |
9 | 6 | ||
10 | extern void pxa_set_udc_info(struct pxa2xx_udc_mach_info *info); | 7 | extern void pxa_set_udc_info(struct pxa2xx_udc_mach_info *info); |
11 | 8 | ||
12 | static inline int udc_gpio_to_irq(unsigned gpio) | ||
13 | { | ||
14 | return IRQ_GPIO(gpio & GPIO_MD_MASK_NR); | ||
15 | } | ||
16 | |||
17 | static inline void udc_gpio_init_vbus(unsigned gpio) | ||
18 | { | ||
19 | pxa_gpio_mode((gpio & GPIO_MD_MASK_NR) | GPIO_IN); | ||
20 | } | ||
21 | |||
22 | static inline void udc_gpio_init_pullup(unsigned gpio) | ||
23 | { | ||
24 | pxa_gpio_mode((gpio & GPIO_MD_MASK_NR) | GPIO_OUT | GPIO_DFLT_LOW); | ||
25 | } | ||
26 | |||
27 | static inline int udc_gpio_get(unsigned gpio) | ||
28 | { | ||
29 | return (GPLR(gpio) & GPIO_bit(gpio)) != 0; | ||
30 | } | ||
31 | |||
32 | static inline void udc_gpio_set(unsigned gpio, int is_on) | ||
33 | { | ||
34 | int mask = GPIO_bit(gpio); | ||
35 | |||
36 | if (is_on) | ||
37 | GPSR(gpio) = mask; | ||
38 | else | ||
39 | GPCR(gpio) = mask; | ||
40 | } | ||
41 | |||