aboutsummaryrefslogtreecommitdiffstats
path: root/arch/avr32
diff options
context:
space:
mode:
authorHaavard Skinnemoen <haavard.skinnemoen@atmel.com>2008-04-19 20:38:41 -0400
committerHaavard Skinnemoen <haavard.skinnemoen@atmel.com>2008-04-19 20:38:41 -0400
commite1c25dc638db01600069b3f9167d1b35f8d574b5 (patch)
treef3b25d6a8344f0d9b7d23c8447d4078a36bb30fd /arch/avr32
parent03414e57ad9875d0c8bfa5a4a65813cb2157372e (diff)
parent16a45bc82e61891daec1ffcd057679bdf962aeb8 (diff)
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/hskinnemoen/usba-2.6.26 into base
Diffstat (limited to 'arch/avr32')
-rw-r--r--arch/avr32/mach-at32ap/at32ap700x.c50
1 files changed, 44 insertions, 6 deletions
diff --git a/arch/avr32/mach-at32ap/at32ap700x.c b/arch/avr32/mach-at32ap/at32ap700x.c
index 7678fee9a885..cb47afc9fffc 100644
--- a/arch/avr32/mach-at32ap/at32ap700x.c
+++ b/arch/avr32/mach-at32ap/at32ap700x.c
@@ -11,6 +11,7 @@
11#include <linux/platform_device.h> 11#include <linux/platform_device.h>
12#include <linux/dma-mapping.h> 12#include <linux/dma-mapping.h>
13#include <linux/spi/spi.h> 13#include <linux/spi/spi.h>
14#include <linux/usb/atmel_usba_udc.h>
14 15
15#include <asm/io.h> 16#include <asm/io.h>
16#include <asm/irq.h> 17#include <asm/irq.h>
@@ -1351,9 +1352,39 @@ static struct clk usba0_hclk = {
1351 .index = 6, 1352 .index = 6,
1352}; 1353};
1353 1354
1355#define EP(nam, idx, maxpkt, maxbk, dma, isoc) \
1356 [idx] = { \
1357 .name = nam, \
1358 .index = idx, \
1359 .fifo_size = maxpkt, \
1360 .nr_banks = maxbk, \
1361 .can_dma = dma, \
1362 .can_isoc = isoc, \
1363 }
1364
1365static struct usba_ep_data at32_usba_ep[] __initdata = {
1366 EP("ep0", 0, 64, 1, 0, 0),
1367 EP("ep1", 1, 512, 2, 1, 1),
1368 EP("ep2", 2, 512, 2, 1, 1),
1369 EP("ep3-int", 3, 64, 3, 1, 0),
1370 EP("ep4-int", 4, 64, 3, 1, 0),
1371 EP("ep5", 5, 1024, 3, 1, 1),
1372 EP("ep6", 6, 1024, 3, 1, 1),
1373};
1374
1375#undef EP
1376
1354struct platform_device *__init 1377struct platform_device *__init
1355at32_add_device_usba(unsigned int id, struct usba_platform_data *data) 1378at32_add_device_usba(unsigned int id, struct usba_platform_data *data)
1356{ 1379{
1380 /*
1381 * pdata doesn't have room for any endpoints, so we need to
1382 * append room for the ones we need right after it.
1383 */
1384 struct {
1385 struct usba_platform_data pdata;
1386 struct usba_ep_data ep[7];
1387 } usba_data;
1357 struct platform_device *pdev; 1388 struct platform_device *pdev;
1358 1389
1359 if (id != 0) 1390 if (id != 0)
@@ -1367,13 +1398,20 @@ at32_add_device_usba(unsigned int id, struct usba_platform_data *data)
1367 ARRAY_SIZE(usba0_resource))) 1398 ARRAY_SIZE(usba0_resource)))
1368 goto out_free_pdev; 1399 goto out_free_pdev;
1369 1400
1370 if (data) { 1401 if (data)
1371 if (platform_device_add_data(pdev, data, sizeof(*data))) 1402 usba_data.pdata.vbus_pin = data->vbus_pin;
1372 goto out_free_pdev; 1403 else
1404 usba_data.pdata.vbus_pin = -EINVAL;
1373 1405
1374 if (data->vbus_pin != GPIO_PIN_NONE) 1406 data = &usba_data.pdata;
1375 at32_select_gpio(data->vbus_pin, 0); 1407 data->num_ep = ARRAY_SIZE(at32_usba_ep);
1376 } 1408 memcpy(data->ep, at32_usba_ep, sizeof(at32_usba_ep));
1409
1410 if (platform_device_add_data(pdev, data, sizeof(usba_data)))
1411 goto out_free_pdev;
1412
1413 if (data->vbus_pin >= 0)
1414 at32_select_gpio(data->vbus_pin, 0);
1377 1415
1378 usba0_pclk.dev = &pdev->dev; 1416 usba0_pclk.dev = &pdev->dev;
1379 usba0_hclk.dev = &pdev->dev; 1417 usba0_hclk.dev = &pdev->dev;