hh.org updates
[hh.org.git] / arch / arm / mach-pxa / eseries / eseries_udc.c
blobad6e2d3fda48379cd7c85b2e3dd5b9b34ffd095a
1 /*
2 * UDC functions for the Toshiba e-series PDAs
4 * Copyright (c) Ian Molton 2003
6 */
8 #include <linux/kernel.h>
9 #include <linux/init.h>
10 #include <asm/mach/arch.h>
11 #include <asm/mach-types.h>
12 #include <asm/arch/hardware.h>
13 #include <asm/mach/map.h>
14 #include <asm/domain.h>
15 #include <asm/arch/pxa-regs.h>
16 #include <asm/arch/eseries-gpio.h>
17 #include <linux/device.h>
18 #include <asm/arch/udc.h>
20 /* local PXA generic code */
21 #include "../generic.h"
23 struct udc_info {
24 int discover;
25 int pullup;
28 /* E740 E750 and E400 all use the same GPIOs */
29 static struct udc_info e7xx_udc = {
30 .discover = GPIO_E7XX_USB_DISC,
31 .pullup = GPIO_E7XX_USB_PULLUP
34 /* E800 is different, just to be awkward */
35 static struct udc_info e800_udc = {
36 .discover = GPIO_E800_USB_DISC,
37 .pullup = GPIO_E800_USB_PULLUP
40 static struct udc_info *udc;
42 static int eseries_udc_is_connected(void) {
43 return (GPLR(udc->discover) & GPIO_bit(udc->discover));
46 static void eseries_udc_command(int cmd) {
47 switch(cmd){
48 case PXA2XX_UDC_CMD_DISCONNECT:
49 GPSR(udc->pullup) = GPIO_bit(udc->pullup);
50 break;
51 case PXA2XX_UDC_CMD_CONNECT:
52 GPCR(udc->pullup) = GPIO_bit(udc->pullup);
53 break;
54 default:
55 printk("eseries_udc_control: unknown command!\n");
56 break;
60 static struct pxa2xx_udc_mach_info eseries_udc_mach_info = {
61 .udc_is_connected = eseries_udc_is_connected,
62 .udc_command = eseries_udc_command,
65 static int __init eseries_udc_init(void) {
66 if(machine_is_e330() || machine_is_e740() || machine_is_e750() ||
67 machine_is_e400())
68 udc = &e7xx_udc;
69 else if(machine_is_e800())
70 udc = &e800_udc;
71 else
72 return -ENODEV;
74 pxa_set_udc_info(&eseries_udc_mach_info);
75 return 0;
78 module_init(eseries_udc_init);