diff options
Diffstat (limited to 'arch/arm/mach-ixp4xx/common.c')
-rw-r--r-- | arch/arm/mach-ixp4xx/common.c | 51 |
1 files changed, 47 insertions, 4 deletions
diff --git a/arch/arm/mach-ixp4xx/common.c b/arch/arm/mach-ixp4xx/common.c index fbe288a8da65..2ec9a9e9a04d 100644 --- a/arch/arm/mach-ixp4xx/common.c +++ b/arch/arm/mach-ixp4xx/common.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/timex.h> | 28 | #include <linux/timex.h> |
29 | #include <linux/clocksource.h> | 29 | #include <linux/clocksource.h> |
30 | 30 | ||
31 | #include <asm/arch/udc.h> | ||
31 | #include <asm/hardware.h> | 32 | #include <asm/hardware.h> |
32 | #include <asm/uaccess.h> | 33 | #include <asm/uaccess.h> |
33 | #include <asm/io.h> | 34 | #include <asm/io.h> |
@@ -39,6 +40,8 @@ | |||
39 | #include <asm/mach/irq.h> | 40 | #include <asm/mach/irq.h> |
40 | #include <asm/mach/time.h> | 41 | #include <asm/mach/time.h> |
41 | 42 | ||
43 | static int __init ixp4xx_clocksource_init(void); | ||
44 | |||
42 | /************************************************************************* | 45 | /************************************************************************* |
43 | * IXP4xx chipset I/O mapping | 46 | * IXP4xx chipset I/O mapping |
44 | *************************************************************************/ | 47 | *************************************************************************/ |
@@ -195,7 +198,7 @@ static void ixp4xx_irq_unmask(unsigned int irq) | |||
195 | *IXP4XX_ICMR |= (1 << irq); | 198 | *IXP4XX_ICMR |= (1 << irq); |
196 | } | 199 | } |
197 | 200 | ||
198 | static struct irqchip ixp4xx_irq_chip = { | 201 | static struct irq_chip ixp4xx_irq_chip = { |
199 | .name = "IXP4xx", | 202 | .name = "IXP4xx", |
200 | .ack = ixp4xx_irq_ack, | 203 | .ack = ixp4xx_irq_ack, |
201 | .mask = ixp4xx_irq_mask, | 204 | .mask = ixp4xx_irq_mask, |
@@ -224,7 +227,7 @@ void __init ixp4xx_init_irq(void) | |||
224 | /* Default to all level triggered */ | 227 | /* Default to all level triggered */ |
225 | for(i = 0; i < NR_IRQS; i++) { | 228 | for(i = 0; i < NR_IRQS; i++) { |
226 | set_irq_chip(i, &ixp4xx_irq_chip); | 229 | set_irq_chip(i, &ixp4xx_irq_chip); |
227 | set_irq_handler(i, do_level_IRQ); | 230 | set_irq_handler(i, handle_level_irq); |
228 | set_irq_flags(i, IRQF_VALID); | 231 | set_irq_flags(i, IRQF_VALID); |
229 | } | 232 | } |
230 | } | 233 | } |
@@ -280,12 +283,52 @@ static void __init ixp4xx_timer_init(void) | |||
280 | 283 | ||
281 | /* Connect the interrupt handler and enable the interrupt */ | 284 | /* Connect the interrupt handler and enable the interrupt */ |
282 | setup_irq(IRQ_IXP4XX_TIMER1, &ixp4xx_timer_irq); | 285 | setup_irq(IRQ_IXP4XX_TIMER1, &ixp4xx_timer_irq); |
286 | |||
287 | ixp4xx_clocksource_init(); | ||
283 | } | 288 | } |
284 | 289 | ||
285 | struct sys_timer ixp4xx_timer = { | 290 | struct sys_timer ixp4xx_timer = { |
286 | .init = ixp4xx_timer_init, | 291 | .init = ixp4xx_timer_init, |
287 | }; | 292 | }; |
288 | 293 | ||
294 | static struct pxa2xx_udc_mach_info ixp4xx_udc_info; | ||
295 | |||
296 | void __init ixp4xx_set_udc_info(struct pxa2xx_udc_mach_info *info) | ||
297 | { | ||
298 | memcpy(&ixp4xx_udc_info, info, sizeof *info); | ||
299 | } | ||
300 | |||
301 | static struct resource ixp4xx_udc_resources[] = { | ||
302 | [0] = { | ||
303 | .start = 0xc800b000, | ||
304 | .end = 0xc800bfff, | ||
305 | .flags = IORESOURCE_MEM, | ||
306 | }, | ||
307 | [1] = { | ||
308 | .start = IRQ_IXP4XX_USB, | ||
309 | .end = IRQ_IXP4XX_USB, | ||
310 | .flags = IORESOURCE_IRQ, | ||
311 | }, | ||
312 | }; | ||
313 | |||
314 | /* | ||
315 | * USB device controller. The IXP4xx uses the same controller as PXA2XX, | ||
316 | * so we just use the same device. | ||
317 | */ | ||
318 | static struct platform_device ixp4xx_udc_device = { | ||
319 | .name = "pxa2xx-udc", | ||
320 | .id = -1, | ||
321 | .num_resources = 2, | ||
322 | .resource = ixp4xx_udc_resources, | ||
323 | .dev = { | ||
324 | .platform_data = &ixp4xx_udc_info, | ||
325 | }, | ||
326 | }; | ||
327 | |||
328 | static struct platform_device *ixp4xx_devices[] __initdata = { | ||
329 | &ixp4xx_udc_device, | ||
330 | }; | ||
331 | |||
289 | static struct resource ixp46x_i2c_resources[] = { | 332 | static struct resource ixp46x_i2c_resources[] = { |
290 | [0] = { | 333 | [0] = { |
291 | .start = 0xc8011000, | 334 | .start = 0xc8011000, |
@@ -321,6 +364,8 @@ void __init ixp4xx_sys_init(void) | |||
321 | { | 364 | { |
322 | ixp4xx_exp_bus_size = SZ_16M; | 365 | ixp4xx_exp_bus_size = SZ_16M; |
323 | 366 | ||
367 | platform_add_devices(ixp4xx_devices, ARRAY_SIZE(ixp4xx_devices)); | ||
368 | |||
324 | if (cpu_is_ixp46x()) { | 369 | if (cpu_is_ixp46x()) { |
325 | int region; | 370 | int region; |
326 | 371 | ||
@@ -363,5 +408,3 @@ static int __init ixp4xx_clocksource_init(void) | |||
363 | 408 | ||
364 | return 0; | 409 | return 0; |
365 | } | 410 | } |
366 | |||
367 | device_initcall(ixp4xx_clocksource_init); | ||