diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-11 19:13:44 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-11 19:13:44 -0700 |
commit | 55982fd184a065b1c69279d29cbc01dbf424d2f4 (patch) | |
tree | 9b309cba341736a0766249ba51972a8ca040e502 /arch/avr32/mach-at32ap/at32ap7000.c | |
parent | 1ef3e36251e4edc77a48967d015a87ca3c4283ea (diff) | |
parent | a7e30b8d91d3291de4543d97849193ebc3ec4c1c (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/hskinnemoen/avr32-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/hskinnemoen/avr32-2.6:
[AVR32] Fix random segfault with preemption
[AVR32] Don't use __builtin_xchg()
[AVR32] ngw100 i2c-gpio tweaks
[AVR32] Ignore a few irrelevant syscalls
[AVR32] SMC configuration in clock cycles
[AVR32] Drop support for redundant "keepinitrd" boot-time parm.
[AVR32] Make dma_sync_*_for_cpu no-ops
[AVR32] Remove unneeded 8K alignment of .text section
[AVR32] Kill a few hardcoded constants in vmlinux.lds
[AVR32] rename vmlinux.lds
[AVR32] fix command line parsing in early_parse_fbmem
[AVR32] checkstack support
[AVR32] Wire up USBA device
[AVR32] add multidrive support for pio driver
[AVR32] /sys/kernel/debug/at32ap_clk
[AVR32] Move AT32_PM_BASE definition into pm.h
Diffstat (limited to 'arch/avr32/mach-at32ap/at32ap7000.c')
-rw-r--r-- | arch/avr32/mach-at32ap/at32ap7000.c | 74 |
1 files changed, 68 insertions, 6 deletions
diff --git a/arch/avr32/mach-at32ap/at32ap7000.c b/arch/avr32/mach-at32ap/at32ap7000.c index 64cc5583ddf..f6d154ca4d2 100644 --- a/arch/avr32/mach-at32ap/at32ap7000.c +++ b/arch/avr32/mach-at32ap/at32ap7000.c @@ -25,12 +25,6 @@ #include "pio.h" #include "pm.h" -/* - * We can reduce the code size a bit by using a constant here. Since - * this file is completely chip-specific, it's safe to not use - * ioremap. Generic drivers should of course never do this. - */ -#define AT32_PM_BASE 0xfff00000 #define PBMEM(base) \ { \ @@ -1168,6 +1162,72 @@ at32_add_device_ssc(unsigned int id, unsigned int flags) } /* -------------------------------------------------------------------- + * USB Device Controller + * -------------------------------------------------------------------- */ +static struct resource usba0_resource[] __initdata = { + { + .start = 0xff300000, + .end = 0xff3fffff, + .flags = IORESOURCE_MEM, + }, { + .start = 0xfff03000, + .end = 0xfff033ff, + .flags = IORESOURCE_MEM, + }, + IRQ(31), +}; +static struct clk usba0_pclk = { + .name = "pclk", + .parent = &pbb_clk, + .mode = pbb_clk_mode, + .get_rate = pbb_clk_get_rate, + .index = 12, +}; +static struct clk usba0_hclk = { + .name = "hclk", + .parent = &hsb_clk, + .mode = hsb_clk_mode, + .get_rate = hsb_clk_get_rate, + .index = 6, +}; + +struct platform_device *__init +at32_add_device_usba(unsigned int id, struct usba_platform_data *data) +{ + struct platform_device *pdev; + + if (id != 0) + return NULL; + + pdev = platform_device_alloc("atmel_usba_udc", 0); + if (!pdev) + return NULL; + + if (platform_device_add_resources(pdev, usba0_resource, + ARRAY_SIZE(usba0_resource))) + goto out_free_pdev; + + if (data) { + if (platform_device_add_data(pdev, data, sizeof(*data))) + goto out_free_pdev; + + if (data->vbus_pin != GPIO_PIN_NONE) + at32_select_gpio(data->vbus_pin, 0); + } + + usba0_pclk.dev = &pdev->dev; + usba0_hclk.dev = &pdev->dev; + + platform_device_add(pdev); + + return pdev; + +out_free_pdev: + platform_device_put(pdev); + return NULL; +} + +/* -------------------------------------------------------------------- * GCLK * -------------------------------------------------------------------- */ static struct clk gclk0 = { @@ -1252,6 +1312,8 @@ struct clk *at32_clock_list[] = { &ssc0_pclk, &ssc1_pclk, &ssc2_pclk, + &usba0_hclk, + &usba0_pclk, &gclk0, &gclk1, &gclk2, |