diff options
| -rw-r--r-- | arch/arm/configs/at91cap9adk_defconfig | 27 | ||||
| -rw-r--r-- | arch/arm/mach-at91/at91cap9_devices.c | 99 | ||||
| -rw-r--r-- | arch/arm/mach-at91/board-cap9adk.c | 9 | ||||
| -rw-r--r-- | include/asm-arm/arch-at91/at91cap9.h | 2 | ||||
| -rw-r--r-- | include/asm-arm/arch-at91/at91cap9_matrix.h | 5 |
5 files changed, 140 insertions, 2 deletions
diff --git a/arch/arm/configs/at91cap9adk_defconfig b/arch/arm/configs/at91cap9adk_defconfig index e32e73648129..39ca662c0793 100644 --- a/arch/arm/configs/at91cap9adk_defconfig +++ b/arch/arm/configs/at91cap9adk_defconfig | |||
| @@ -907,7 +907,32 @@ CONFIG_USB_MON=y | |||
| 907 | # | 907 | # |
| 908 | # USB Gadget Support | 908 | # USB Gadget Support |
| 909 | # | 909 | # |
| 910 | # CONFIG_USB_GADGET is not set | 910 | CONFIG_USB_GADGET=y |
| 911 | # CONFIG_USB_GADGET_DEBUG is not set | ||
| 912 | # CONFIG_USB_GADGET_DEBUG_FILES is not set | ||
| 913 | CONFIG_USB_GADGET_SELECTED=y | ||
| 914 | # CONFIG_USB_GADGET_AMD5536UDC is not set | ||
| 915 | CONFIG_USB_GADGET_ATMEL_USBA=y | ||
| 916 | CONFIG_USB_ATMEL_USBA=y | ||
| 917 | # CONFIG_USB_GADGET_FSL_USB2 is not set | ||
| 918 | # CONFIG_USB_GADGET_NET2280 is not set | ||
| 919 | # CONFIG_USB_GADGET_PXA2XX is not set | ||
| 920 | # CONFIG_USB_GADGET_M66592 is not set | ||
| 921 | # CONFIG_USB_GADGET_GOKU is not set | ||
| 922 | # CONFIG_USB_GADGET_LH7A40X is not set | ||
| 923 | # CONFIG_USB_GADGET_OMAP is not set | ||
| 924 | # CONFIG_USB_GADGET_S3C2410 is not set | ||
| 925 | # CONFIG_USB_GADGET_AT91 is not set | ||
| 926 | # CONFIG_USB_GADGET_DUMMY_HCD is not set | ||
| 927 | CONFIG_USB_GADGET_DUALSPEED=y | ||
| 928 | # CONFIG_USB_ZERO is not set | ||
| 929 | CONFIG_USB_ETH=m | ||
| 930 | CONFIG_USB_ETH_RNDIS=y | ||
| 931 | # CONFIG_USB_GADGETFS is not set | ||
| 932 | CONFIG_USB_FILE_STORAGE=m | ||
| 933 | # CONFIG_USB_FILE_STORAGE_TEST is not set | ||
| 934 | # CONFIG_USB_G_SERIAL is not set | ||
| 935 | # CONFIG_USB_MIDI_GADGET is not set | ||
| 911 | CONFIG_MMC=y | 936 | CONFIG_MMC=y |
| 912 | # CONFIG_MMC_DEBUG is not set | 937 | # CONFIG_MMC_DEBUG is not set |
| 913 | # CONFIG_MMC_UNSAFE_RESUME is not set | 938 | # CONFIG_MMC_UNSAFE_RESUME is not set |
diff --git a/arch/arm/mach-at91/at91cap9_devices.c b/arch/arm/mach-at91/at91cap9_devices.c index be526746e01e..747b9dedab88 100644 --- a/arch/arm/mach-at91/at91cap9_devices.c +++ b/arch/arm/mach-at91/at91cap9_devices.c | |||
| @@ -84,6 +84,105 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data) {} | |||
| 84 | 84 | ||
| 85 | 85 | ||
| 86 | /* -------------------------------------------------------------------- | 86 | /* -------------------------------------------------------------------- |
| 87 | * USB HS Device (Gadget) | ||
| 88 | * -------------------------------------------------------------------- */ | ||
| 89 | |||
| 90 | #if defined(CONFIG_USB_GADGET_ATMEL_USBA) || defined(CONFIG_USB_GADGET_ATMEL_USBA_MODULE) | ||
| 91 | |||
| 92 | static struct resource usba_udc_resources[] = { | ||
| 93 | [0] = { | ||
| 94 | .start = AT91CAP9_UDPHS_FIFO, | ||
| 95 | .end = AT91CAP9_UDPHS_FIFO + SZ_512K - 1, | ||
| 96 | .flags = IORESOURCE_MEM, | ||
| 97 | }, | ||
| 98 | [1] = { | ||
| 99 | .start = AT91CAP9_BASE_UDPHS, | ||
| 100 | .end = AT91CAP9_BASE_UDPHS + SZ_1K - 1, | ||
| 101 | .flags = IORESOURCE_MEM, | ||
| 102 | }, | ||
| 103 | [2] = { | ||
| 104 | .start = AT91CAP9_ID_UDPHS, | ||
| 105 | .end = AT91CAP9_ID_UDPHS, | ||
| 106 | .flags = IORESOURCE_IRQ, | ||
| 107 | }, | ||
| 108 | }; | ||
| 109 | |||
| 110 | #define EP(nam, idx, maxpkt, maxbk, dma, isoc) \ | ||
| 111 | [idx] = { \ | ||
| 112 | .name = nam, \ | ||
| 113 | .index = idx, \ | ||
| 114 | .fifo_size = maxpkt, \ | ||
| 115 | .nr_banks = maxbk, \ | ||
| 116 | .can_dma = dma, \ | ||
| 117 | .can_isoc = isoc, \ | ||
| 118 | } | ||
| 119 | |||
| 120 | static struct usba_ep_data usba_udc_ep[] = { | ||
| 121 | EP("ep0", 0, 64, 1, 0, 0), | ||
| 122 | EP("ep1", 1, 1024, 3, 1, 1), | ||
| 123 | EP("ep2", 2, 1024, 3, 1, 1), | ||
| 124 | EP("ep3", 3, 1024, 2, 1, 1), | ||
| 125 | EP("ep4", 4, 1024, 2, 1, 1), | ||
| 126 | EP("ep5", 5, 1024, 2, 1, 0), | ||
| 127 | EP("ep6", 6, 1024, 2, 1, 0), | ||
| 128 | EP("ep7", 7, 1024, 2, 0, 0), | ||
| 129 | }; | ||
| 130 | |||
| 131 | #undef EP | ||
| 132 | |||
| 133 | /* | ||
| 134 | * pdata doesn't have room for any endpoints, so we need to | ||
| 135 | * append room for the ones we need right after it. | ||
| 136 | */ | ||
| 137 | static struct { | ||
| 138 | struct usba_platform_data pdata; | ||
| 139 | struct usba_ep_data ep[8]; | ||
| 140 | } usba_udc_data; | ||
| 141 | |||
| 142 | static struct platform_device at91_usba_udc_device = { | ||
| 143 | .name = "atmel_usba_udc", | ||
| 144 | .id = -1, | ||
| 145 | .dev = { | ||
| 146 | .platform_data = &usba_udc_data.pdata, | ||
| 147 | }, | ||
| 148 | .resource = usba_udc_resources, | ||
| 149 | .num_resources = ARRAY_SIZE(usba_udc_resources), | ||
| 150 | }; | ||
| 151 | |||
| 152 | void __init at91_add_device_usba(struct usba_platform_data *data) | ||
| 153 | { | ||
| 154 | at91_sys_write(AT91_MATRIX_UDPHS, AT91_MATRIX_SELECT_UDPHS | | ||
| 155 | AT91_MATRIX_UDPHS_BYPASS_LOCK); | ||
| 156 | |||
| 157 | /* | ||
| 158 | * Invalid pins are 0 on AT91, but the usba driver is shared | ||
| 159 | * with AVR32, which use negative values instead. Once/if | ||
| 160 | * gpio_is_valid() is ported to AT91, revisit this code. | ||
| 161 | */ | ||
| 162 | usba_udc_data.pdata.vbus_pin = -EINVAL; | ||
| 163 | usba_udc_data.pdata.num_ep = ARRAY_SIZE(usba_udc_ep); | ||
| 164 | memcpy(usba_udc_data.ep, usba_udc_ep, sizeof(usba_udc_ep));; | ||
| 165 | |||
| 166 | if (data && data->vbus_pin > 0) { | ||
| 167 | at91_set_gpio_input(data->vbus_pin, 0); | ||
| 168 | at91_set_deglitch(data->vbus_pin, 1); | ||
| 169 | usba_udc_data.pdata.vbus_pin = data->vbus_pin; | ||
| 170 | } | ||
| 171 | |||
| 172 | /* Pullup pin is handled internally by USB device peripheral */ | ||
| 173 | |||
| 174 | /* Clocks */ | ||
| 175 | at91_clock_associate("utmi_clk", &at91_usba_udc_device.dev, "hclk"); | ||
| 176 | at91_clock_associate("udphs_clk", &at91_usba_udc_device.dev, "pclk"); | ||
| 177 | |||
| 178 | platform_device_register(&at91_usba_udc_device); | ||
| 179 | } | ||
| 180 | #else | ||
| 181 | void __init at91_add_device_usba(struct usba_platform_data *data) {} | ||
| 182 | #endif | ||
| 183 | |||
| 184 | |||
| 185 | /* -------------------------------------------------------------------- | ||
| 87 | * Ethernet | 186 | * Ethernet |
| 88 | * -------------------------------------------------------------------- */ | 187 | * -------------------------------------------------------------------- */ |
| 89 | 188 | ||
diff --git a/arch/arm/mach-at91/board-cap9adk.c b/arch/arm/mach-at91/board-cap9adk.c index e5512d1ff217..8a2a958639db 100644 --- a/arch/arm/mach-at91/board-cap9adk.c +++ b/arch/arm/mach-at91/board-cap9adk.c | |||
| @@ -78,6 +78,12 @@ static struct at91_usbh_data __initdata cap9adk_usbh_data = { | |||
| 78 | .ports = 2, | 78 | .ports = 2, |
| 79 | }; | 79 | }; |
| 80 | 80 | ||
| 81 | /* | ||
| 82 | * USB HS Device port | ||
| 83 | */ | ||
| 84 | static struct usba_platform_data __initdata cap9adk_usba_udc_data = { | ||
| 85 | .vbus_pin = AT91_PIN_PB31, | ||
| 86 | }; | ||
| 81 | 87 | ||
| 82 | /* | 88 | /* |
| 83 | * ADS7846 Touchscreen | 89 | * ADS7846 Touchscreen |
| @@ -326,6 +332,9 @@ static void __init cap9adk_board_init(void) | |||
| 326 | /* USB Host */ | 332 | /* USB Host */ |
| 327 | set_irq_type(AT91CAP9_ID_UHP, IRQT_HIGH); | 333 | set_irq_type(AT91CAP9_ID_UHP, IRQT_HIGH); |
| 328 | at91_add_device_usbh(&cap9adk_usbh_data); | 334 | at91_add_device_usbh(&cap9adk_usbh_data); |
| 335 | /* USB HS */ | ||
| 336 | set_irq_type(AT91CAP9_ID_UDPHS, IRQT_HIGH); | ||
| 337 | at91_add_device_usba(&cap9adk_usba_udc_data); | ||
| 329 | /* SPI */ | 338 | /* SPI */ |
| 330 | at91_add_device_spi(cap9adk_spi_devices, ARRAY_SIZE(cap9adk_spi_devices)); | 339 | at91_add_device_spi(cap9adk_spi_devices, ARRAY_SIZE(cap9adk_spi_devices)); |
| 331 | /* Touchscreen */ | 340 | /* Touchscreen */ |
diff --git a/include/asm-arm/arch-at91/at91cap9.h b/include/asm-arm/arch-at91/at91cap9.h index bac83adb5050..6f14d9053ac7 100644 --- a/include/asm-arm/arch-at91/at91cap9.h +++ b/include/asm-arm/arch-at91/at91cap9.h | |||
| @@ -118,7 +118,7 @@ | |||
| 118 | #define AT91CAP9_ROM_SIZE (32 * SZ_1K) /* Internal ROM size (32Kb) */ | 118 | #define AT91CAP9_ROM_SIZE (32 * SZ_1K) /* Internal ROM size (32Kb) */ |
| 119 | 119 | ||
| 120 | #define AT91CAP9_LCDC_BASE 0x00500000 /* LCD Controller */ | 120 | #define AT91CAP9_LCDC_BASE 0x00500000 /* LCD Controller */ |
| 121 | #define AT91CAP9_UDPHS_BASE 0x00600000 /* USB High Speed Device Port */ | 121 | #define AT91CAP9_UDPHS_FIFO 0x00600000 /* USB High Speed Device Port */ |
| 122 | #define AT91CAP9_UHP_BASE 0x00700000 /* USB Host controller */ | 122 | #define AT91CAP9_UHP_BASE 0x00700000 /* USB Host controller */ |
| 123 | 123 | ||
| 124 | #define CONFIG_DRAM_BASE AT91_CHIPSELECT_6 | 124 | #define CONFIG_DRAM_BASE AT91_CHIPSELECT_6 |
diff --git a/include/asm-arm/arch-at91/at91cap9_matrix.h b/include/asm-arm/arch-at91/at91cap9_matrix.h index a641686b6c3d..ddbd4873c842 100644 --- a/include/asm-arm/arch-at91/at91cap9_matrix.h +++ b/include/asm-arm/arch-at91/at91cap9_matrix.h | |||
| @@ -106,6 +106,11 @@ | |||
| 106 | #define AT91_MPBS0_SFR (AT91_MATRIX + 0x114) /* MPBlock Slave 0 Special Function Register */ | 106 | #define AT91_MPBS0_SFR (AT91_MATRIX + 0x114) /* MPBlock Slave 0 Special Function Register */ |
| 107 | #define AT91_MPBS1_SFR (AT91_MATRIX + 0x11C) /* MPBlock Slave 1 Special Function Register */ | 107 | #define AT91_MPBS1_SFR (AT91_MATRIX + 0x11C) /* MPBlock Slave 1 Special Function Register */ |
| 108 | 108 | ||
| 109 | #define AT91_MATRIX_UDPHS (AT91_MATRIX + 0x118) /* USBHS Special Function Register [AT91CAP9 only] */ | ||
| 110 | #define AT91_MATRIX_SELECT_UDPHS (0 << 31) /* select High Speed UDP */ | ||
| 111 | #define AT91_MATRIX_SELECT_UDP (1 << 31) /* select standard UDP */ | ||
| 112 | #define AT91_MATRIX_UDPHS_BYPASS_LOCK (1 << 30) /* bypass lock bit */ | ||
| 113 | |||
| 109 | #define AT91_MATRIX_EBICSA (AT91_MATRIX + 0x120) /* EBI Chip Select Assignment Register */ | 114 | #define AT91_MATRIX_EBICSA (AT91_MATRIX + 0x120) /* EBI Chip Select Assignment Register */ |
| 110 | #define AT91_MATRIX_EBI_CS1A (1 << 1) /* Chip Select 1 Assignment */ | 115 | #define AT91_MATRIX_EBI_CS1A (1 << 1) /* Chip Select 1 Assignment */ |
| 111 | #define AT91_MATRIX_EBI_CS1A_SMC (0 << 1) | 116 | #define AT91_MATRIX_EBI_CS1A_SMC (0 << 1) |
