diff options
Diffstat (limited to 'arch/arm/mach-versatile')
-rw-r--r-- | arch/arm/mach-versatile/core.c | 295 | ||||
-rw-r--r-- | arch/arm/mach-versatile/core.h | 2 | ||||
-rw-r--r-- | arch/arm/mach-versatile/include/mach/hardware.h | 2 | ||||
-rw-r--r-- | arch/arm/mach-versatile/versatile_ab.c | 1 | ||||
-rw-r--r-- | arch/arm/mach-versatile/versatile_pb.c | 6 |
5 files changed, 68 insertions, 238 deletions
diff --git a/arch/arm/mach-versatile/core.c b/arch/arm/mach-versatile/core.c index 136c32e7ed8e..eb7ffa0ee8b5 100644 --- a/arch/arm/mach-versatile/core.c +++ b/arch/arm/mach-versatile/core.c | |||
@@ -50,6 +50,8 @@ | |||
50 | #include <mach/platform.h> | 50 | #include <mach/platform.h> |
51 | #include <asm/hardware/timer-sp.h> | 51 | #include <asm/hardware/timer-sp.h> |
52 | 52 | ||
53 | #include <plat/clcd.h> | ||
54 | #include <plat/fpga-irq.h> | ||
53 | #include <plat/sched_clock.h> | 55 | #include <plat/sched_clock.h> |
54 | 56 | ||
55 | #include "core.h" | 57 | #include "core.h" |
@@ -63,47 +65,12 @@ | |||
63 | #define VA_VIC_BASE __io_address(VERSATILE_VIC_BASE) | 65 | #define VA_VIC_BASE __io_address(VERSATILE_VIC_BASE) |
64 | #define VA_SIC_BASE __io_address(VERSATILE_SIC_BASE) | 66 | #define VA_SIC_BASE __io_address(VERSATILE_SIC_BASE) |
65 | 67 | ||
66 | static void sic_mask_irq(struct irq_data *d) | 68 | static struct fpga_irq_data sic_irq = { |
67 | { | 69 | .base = VA_SIC_BASE, |
68 | unsigned int irq = d->irq - IRQ_SIC_START; | 70 | .irq_start = IRQ_SIC_START, |
69 | 71 | .chip.name = "SIC", | |
70 | writel(1 << irq, VA_SIC_BASE + SIC_IRQ_ENABLE_CLEAR); | ||
71 | } | ||
72 | |||
73 | static void sic_unmask_irq(struct irq_data *d) | ||
74 | { | ||
75 | unsigned int irq = d->irq - IRQ_SIC_START; | ||
76 | |||
77 | writel(1 << irq, VA_SIC_BASE + SIC_IRQ_ENABLE_SET); | ||
78 | } | ||
79 | |||
80 | static struct irq_chip sic_chip = { | ||
81 | .name = "SIC", | ||
82 | .irq_ack = sic_mask_irq, | ||
83 | .irq_mask = sic_mask_irq, | ||
84 | .irq_unmask = sic_unmask_irq, | ||
85 | }; | 72 | }; |
86 | 73 | ||
87 | static void | ||
88 | sic_handle_irq(unsigned int irq, struct irq_desc *desc) | ||
89 | { | ||
90 | unsigned long status = readl(VA_SIC_BASE + SIC_IRQ_STATUS); | ||
91 | |||
92 | if (status == 0) { | ||
93 | do_bad_IRQ(irq, desc); | ||
94 | return; | ||
95 | } | ||
96 | |||
97 | do { | ||
98 | irq = ffs(status) - 1; | ||
99 | status &= ~(1 << irq); | ||
100 | |||
101 | irq += IRQ_SIC_START; | ||
102 | |||
103 | generic_handle_irq(irq); | ||
104 | } while (status); | ||
105 | } | ||
106 | |||
107 | #if 1 | 74 | #if 1 |
108 | #define IRQ_MMCI0A IRQ_VICSOURCE22 | 75 | #define IRQ_MMCI0A IRQ_VICSOURCE22 |
109 | #define IRQ_AACI IRQ_VICSOURCE24 | 76 | #define IRQ_AACI IRQ_VICSOURCE24 |
@@ -118,22 +85,11 @@ sic_handle_irq(unsigned int irq, struct irq_desc *desc) | |||
118 | 85 | ||
119 | void __init versatile_init_irq(void) | 86 | void __init versatile_init_irq(void) |
120 | { | 87 | { |
121 | unsigned int i; | ||
122 | |||
123 | vic_init(VA_VIC_BASE, IRQ_VIC_START, ~0, 0); | 88 | vic_init(VA_VIC_BASE, IRQ_VIC_START, ~0, 0); |
124 | 89 | ||
125 | set_irq_chained_handler(IRQ_VICSOURCE31, sic_handle_irq); | ||
126 | |||
127 | /* Do second interrupt controller */ | ||
128 | writel(~0, VA_SIC_BASE + SIC_IRQ_ENABLE_CLEAR); | 90 | writel(~0, VA_SIC_BASE + SIC_IRQ_ENABLE_CLEAR); |
129 | 91 | ||
130 | for (i = IRQ_SIC_START; i <= IRQ_SIC_END; i++) { | 92 | fpga_irq_init(IRQ_VICSOURCE31, ~PIC_MASK, &sic_irq); |
131 | if ((PIC_MASK & (1 << (i - IRQ_SIC_START))) == 0) { | ||
132 | set_irq_chip(i, &sic_chip); | ||
133 | set_irq_handler(i, handle_level_irq); | ||
134 | set_irq_flags(i, IRQF_VALID | IRQF_PROBE); | ||
135 | } | ||
136 | } | ||
137 | 93 | ||
138 | /* | 94 | /* |
139 | * Interrupts on secondary controller from 0 to 8 are routed to | 95 | * Interrupts on secondary controller from 0 to 8 are routed to |
@@ -476,127 +432,7 @@ static struct clk_lookup lookups[] = { | |||
476 | #define SYS_CLCD_ID_SANYO_2_5 (0x07 << 8) | 432 | #define SYS_CLCD_ID_SANYO_2_5 (0x07 << 8) |
477 | #define SYS_CLCD_ID_VGA (0x1f << 8) | 433 | #define SYS_CLCD_ID_VGA (0x1f << 8) |
478 | 434 | ||
479 | static struct clcd_panel vga = { | 435 | static bool is_sanyo_2_5_lcd; |
480 | .mode = { | ||
481 | .name = "VGA", | ||
482 | .refresh = 60, | ||
483 | .xres = 640, | ||
484 | .yres = 480, | ||
485 | .pixclock = 39721, | ||
486 | .left_margin = 40, | ||
487 | .right_margin = 24, | ||
488 | .upper_margin = 32, | ||
489 | .lower_margin = 11, | ||
490 | .hsync_len = 96, | ||
491 | .vsync_len = 2, | ||
492 | .sync = 0, | ||
493 | .vmode = FB_VMODE_NONINTERLACED, | ||
494 | }, | ||
495 | .width = -1, | ||
496 | .height = -1, | ||
497 | .tim2 = TIM2_BCD | TIM2_IPC, | ||
498 | .cntl = CNTL_LCDTFT | CNTL_LCDVCOMP(1), | ||
499 | .bpp = 16, | ||
500 | }; | ||
501 | |||
502 | static struct clcd_panel sanyo_3_8_in = { | ||
503 | .mode = { | ||
504 | .name = "Sanyo QVGA", | ||
505 | .refresh = 116, | ||
506 | .xres = 320, | ||
507 | .yres = 240, | ||
508 | .pixclock = 100000, | ||
509 | .left_margin = 6, | ||
510 | .right_margin = 6, | ||
511 | .upper_margin = 5, | ||
512 | .lower_margin = 5, | ||
513 | .hsync_len = 6, | ||
514 | .vsync_len = 6, | ||
515 | .sync = 0, | ||
516 | .vmode = FB_VMODE_NONINTERLACED, | ||
517 | }, | ||
518 | .width = -1, | ||
519 | .height = -1, | ||
520 | .tim2 = TIM2_BCD, | ||
521 | .cntl = CNTL_LCDTFT | CNTL_LCDVCOMP(1), | ||
522 | .bpp = 16, | ||
523 | }; | ||
524 | |||
525 | static struct clcd_panel sanyo_2_5_in = { | ||
526 | .mode = { | ||
527 | .name = "Sanyo QVGA Portrait", | ||
528 | .refresh = 116, | ||
529 | .xres = 240, | ||
530 | .yres = 320, | ||
531 | .pixclock = 100000, | ||
532 | .left_margin = 20, | ||
533 | .right_margin = 10, | ||
534 | .upper_margin = 2, | ||
535 | .lower_margin = 2, | ||
536 | .hsync_len = 10, | ||
537 | .vsync_len = 2, | ||
538 | .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, | ||
539 | .vmode = FB_VMODE_NONINTERLACED, | ||
540 | }, | ||
541 | .width = -1, | ||
542 | .height = -1, | ||
543 | .tim2 = TIM2_IVS | TIM2_IHS | TIM2_IPC, | ||
544 | .cntl = CNTL_LCDTFT | CNTL_LCDVCOMP(1), | ||
545 | .bpp = 16, | ||
546 | }; | ||
547 | |||
548 | static struct clcd_panel epson_2_2_in = { | ||
549 | .mode = { | ||
550 | .name = "Epson QCIF", | ||
551 | .refresh = 390, | ||
552 | .xres = 176, | ||
553 | .yres = 220, | ||
554 | .pixclock = 62500, | ||
555 | .left_margin = 3, | ||
556 | .right_margin = 2, | ||
557 | .upper_margin = 1, | ||
558 | .lower_margin = 0, | ||
559 | .hsync_len = 3, | ||
560 | .vsync_len = 2, | ||
561 | .sync = 0, | ||
562 | .vmode = FB_VMODE_NONINTERLACED, | ||
563 | }, | ||
564 | .width = -1, | ||
565 | .height = -1, | ||
566 | .tim2 = TIM2_BCD | TIM2_IPC, | ||
567 | .cntl = CNTL_LCDTFT | CNTL_LCDVCOMP(1), | ||
568 | .bpp = 16, | ||
569 | }; | ||
570 | |||
571 | /* | ||
572 | * Detect which LCD panel is connected, and return the appropriate | ||
573 | * clcd_panel structure. Note: we do not have any information on | ||
574 | * the required timings for the 8.4in panel, so we presently assume | ||
575 | * VGA timings. | ||
576 | */ | ||
577 | static struct clcd_panel *versatile_clcd_panel(void) | ||
578 | { | ||
579 | void __iomem *sys_clcd = __io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_CLCD_OFFSET; | ||
580 | struct clcd_panel *panel = &vga; | ||
581 | u32 val; | ||
582 | |||
583 | val = readl(sys_clcd) & SYS_CLCD_ID_MASK; | ||
584 | if (val == SYS_CLCD_ID_SANYO_3_8) | ||
585 | panel = &sanyo_3_8_in; | ||
586 | else if (val == SYS_CLCD_ID_SANYO_2_5) | ||
587 | panel = &sanyo_2_5_in; | ||
588 | else if (val == SYS_CLCD_ID_EPSON_2_2) | ||
589 | panel = &epson_2_2_in; | ||
590 | else if (val == SYS_CLCD_ID_VGA) | ||
591 | panel = &vga; | ||
592 | else { | ||
593 | printk(KERN_ERR "CLCD: unknown LCD panel ID 0x%08x, using VGA\n", | ||
594 | val); | ||
595 | panel = &vga; | ||
596 | } | ||
597 | |||
598 | return panel; | ||
599 | } | ||
600 | 436 | ||
601 | /* | 437 | /* |
602 | * Disable all display connectors on the interface module. | 438 | * Disable all display connectors on the interface module. |
@@ -614,7 +450,7 @@ static void versatile_clcd_disable(struct clcd_fb *fb) | |||
614 | /* | 450 | /* |
615 | * If the LCD is Sanyo 2x5 in on the IB2 board, turn the back-light off | 451 | * If the LCD is Sanyo 2x5 in on the IB2 board, turn the back-light off |
616 | */ | 452 | */ |
617 | if (machine_is_versatile_ab() && fb->panel == &sanyo_2_5_in) { | 453 | if (machine_is_versatile_ab() && is_sanyo_2_5_lcd) { |
618 | void __iomem *versatile_ib2_ctrl = __io_address(VERSATILE_IB2_CTRL); | 454 | void __iomem *versatile_ib2_ctrl = __io_address(VERSATILE_IB2_CTRL); |
619 | unsigned long ctrl; | 455 | unsigned long ctrl; |
620 | 456 | ||
@@ -630,18 +466,22 @@ static void versatile_clcd_disable(struct clcd_fb *fb) | |||
630 | */ | 466 | */ |
631 | static void versatile_clcd_enable(struct clcd_fb *fb) | 467 | static void versatile_clcd_enable(struct clcd_fb *fb) |
632 | { | 468 | { |
469 | struct fb_var_screeninfo *var = &fb->fb.var; | ||
633 | void __iomem *sys_clcd = __io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_CLCD_OFFSET; | 470 | void __iomem *sys_clcd = __io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_CLCD_OFFSET; |
634 | u32 val; | 471 | u32 val; |
635 | 472 | ||
636 | val = readl(sys_clcd); | 473 | val = readl(sys_clcd); |
637 | val &= ~SYS_CLCD_MODE_MASK; | 474 | val &= ~SYS_CLCD_MODE_MASK; |
638 | 475 | ||
639 | switch (fb->fb.var.green.length) { | 476 | switch (var->green.length) { |
640 | case 5: | 477 | case 5: |
641 | val |= SYS_CLCD_MODE_5551; | 478 | val |= SYS_CLCD_MODE_5551; |
642 | break; | 479 | break; |
643 | case 6: | 480 | case 6: |
644 | val |= SYS_CLCD_MODE_565_RLSB; | 481 | if (var->red.offset == 0) |
482 | val |= SYS_CLCD_MODE_565_RLSB; | ||
483 | else | ||
484 | val |= SYS_CLCD_MODE_565_BLSB; | ||
645 | break; | 485 | break; |
646 | case 8: | 486 | case 8: |
647 | val |= SYS_CLCD_MODE_888; | 487 | val |= SYS_CLCD_MODE_888; |
@@ -663,7 +503,7 @@ static void versatile_clcd_enable(struct clcd_fb *fb) | |||
663 | /* | 503 | /* |
664 | * If the LCD is Sanyo 2x5 in on the IB2 board, turn the back-light on | 504 | * If the LCD is Sanyo 2x5 in on the IB2 board, turn the back-light on |
665 | */ | 505 | */ |
666 | if (machine_is_versatile_ab() && fb->panel == &sanyo_2_5_in) { | 506 | if (machine_is_versatile_ab() && is_sanyo_2_5_lcd) { |
667 | void __iomem *versatile_ib2_ctrl = __io_address(VERSATILE_IB2_CTRL); | 507 | void __iomem *versatile_ib2_ctrl = __io_address(VERSATILE_IB2_CTRL); |
668 | unsigned long ctrl; | 508 | unsigned long ctrl; |
669 | 509 | ||
@@ -674,50 +514,62 @@ static void versatile_clcd_enable(struct clcd_fb *fb) | |||
674 | #endif | 514 | #endif |
675 | } | 515 | } |
676 | 516 | ||
677 | static unsigned long framesize = SZ_1M; | 517 | /* |
678 | 518 | * Detect which LCD panel is connected, and return the appropriate | |
519 | * clcd_panel structure. Note: we do not have any information on | ||
520 | * the required timings for the 8.4in panel, so we presently assume | ||
521 | * VGA timings. | ||
522 | */ | ||
679 | static int versatile_clcd_setup(struct clcd_fb *fb) | 523 | static int versatile_clcd_setup(struct clcd_fb *fb) |
680 | { | 524 | { |
681 | dma_addr_t dma; | 525 | void __iomem *sys_clcd = __io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_CLCD_OFFSET; |
526 | const char *panel_name; | ||
527 | u32 val; | ||
682 | 528 | ||
683 | fb->panel = versatile_clcd_panel(); | 529 | is_sanyo_2_5_lcd = false; |
684 | 530 | ||
685 | fb->fb.screen_base = dma_alloc_writecombine(&fb->dev->dev, framesize, | 531 | val = readl(sys_clcd) & SYS_CLCD_ID_MASK; |
686 | &dma, GFP_KERNEL); | 532 | if (val == SYS_CLCD_ID_SANYO_3_8) |
687 | if (!fb->fb.screen_base) { | 533 | panel_name = "Sanyo TM38QV67A02A"; |
688 | printk(KERN_ERR "CLCD: unable to map framebuffer\n"); | 534 | else if (val == SYS_CLCD_ID_SANYO_2_5) { |
689 | return -ENOMEM; | 535 | panel_name = "Sanyo QVGA Portrait"; |
536 | is_sanyo_2_5_lcd = true; | ||
537 | } else if (val == SYS_CLCD_ID_EPSON_2_2) | ||
538 | panel_name = "Epson L2F50113T00"; | ||
539 | else if (val == SYS_CLCD_ID_VGA) | ||
540 | panel_name = "VGA"; | ||
541 | else { | ||
542 | printk(KERN_ERR "CLCD: unknown LCD panel ID 0x%08x, using VGA\n", | ||
543 | val); | ||
544 | panel_name = "VGA"; | ||
690 | } | 545 | } |
691 | 546 | ||
692 | fb->fb.fix.smem_start = dma; | 547 | fb->panel = versatile_clcd_get_panel(panel_name); |
693 | fb->fb.fix.smem_len = framesize; | 548 | if (!fb->panel) |
549 | return -EINVAL; | ||
694 | 550 | ||
695 | return 0; | 551 | return versatile_clcd_setup_dma(fb, SZ_1M); |
696 | } | 552 | } |
697 | 553 | ||
698 | static int versatile_clcd_mmap(struct clcd_fb *fb, struct vm_area_struct *vma) | 554 | static void versatile_clcd_decode(struct clcd_fb *fb, struct clcd_regs *regs) |
699 | { | 555 | { |
700 | return dma_mmap_writecombine(&fb->dev->dev, vma, | 556 | clcdfb_decode(fb, regs); |
701 | fb->fb.screen_base, | ||
702 | fb->fb.fix.smem_start, | ||
703 | fb->fb.fix.smem_len); | ||
704 | } | ||
705 | 557 | ||
706 | static void versatile_clcd_remove(struct clcd_fb *fb) | 558 | /* Always clear BGR for RGB565: we do the routing externally */ |
707 | { | 559 | if (fb->fb.var.green.length == 6) |
708 | dma_free_writecombine(&fb->dev->dev, fb->fb.fix.smem_len, | 560 | regs->cntl &= ~CNTL_BGR; |
709 | fb->fb.screen_base, fb->fb.fix.smem_start); | ||
710 | } | 561 | } |
711 | 562 | ||
712 | static struct clcd_board clcd_plat_data = { | 563 | static struct clcd_board clcd_plat_data = { |
713 | .name = "Versatile", | 564 | .name = "Versatile", |
565 | .caps = CLCD_CAP_5551 | CLCD_CAP_565 | CLCD_CAP_888, | ||
714 | .check = clcdfb_check, | 566 | .check = clcdfb_check, |
715 | .decode = clcdfb_decode, | 567 | .decode = versatile_clcd_decode, |
716 | .disable = versatile_clcd_disable, | 568 | .disable = versatile_clcd_disable, |
717 | .enable = versatile_clcd_enable, | 569 | .enable = versatile_clcd_enable, |
718 | .setup = versatile_clcd_setup, | 570 | .setup = versatile_clcd_setup, |
719 | .mmap = versatile_clcd_mmap, | 571 | .mmap = versatile_clcd_mmap_dma, |
720 | .remove = versatile_clcd_remove, | 572 | .remove = versatile_clcd_remove_dma, |
721 | }; | 573 | }; |
722 | 574 | ||
723 | static struct pl061_platform_data gpio0_plat_data = { | 575 | static struct pl061_platform_data gpio0_plat_data = { |
@@ -737,53 +589,35 @@ static struct pl022_ssp_controller ssp0_plat_data = { | |||
737 | }; | 589 | }; |
738 | 590 | ||
739 | #define AACI_IRQ { IRQ_AACI, NO_IRQ } | 591 | #define AACI_IRQ { IRQ_AACI, NO_IRQ } |
740 | #define AACI_DMA { 0x80, 0x81 } | ||
741 | #define MMCI0_IRQ { IRQ_MMCI0A,IRQ_SIC_MMCI0B } | 592 | #define MMCI0_IRQ { IRQ_MMCI0A,IRQ_SIC_MMCI0B } |
742 | #define MMCI0_DMA { 0x84, 0 } | ||
743 | #define KMI0_IRQ { IRQ_SIC_KMI0, NO_IRQ } | 593 | #define KMI0_IRQ { IRQ_SIC_KMI0, NO_IRQ } |
744 | #define KMI0_DMA { 0, 0 } | ||
745 | #define KMI1_IRQ { IRQ_SIC_KMI1, NO_IRQ } | 594 | #define KMI1_IRQ { IRQ_SIC_KMI1, NO_IRQ } |
746 | #define KMI1_DMA { 0, 0 } | ||
747 | 595 | ||
748 | /* | 596 | /* |
749 | * These devices are connected directly to the multi-layer AHB switch | 597 | * These devices are connected directly to the multi-layer AHB switch |
750 | */ | 598 | */ |
751 | #define SMC_IRQ { NO_IRQ, NO_IRQ } | 599 | #define SMC_IRQ { NO_IRQ, NO_IRQ } |
752 | #define SMC_DMA { 0, 0 } | ||
753 | #define MPMC_IRQ { NO_IRQ, NO_IRQ } | 600 | #define MPMC_IRQ { NO_IRQ, NO_IRQ } |
754 | #define MPMC_DMA { 0, 0 } | ||
755 | #define CLCD_IRQ { IRQ_CLCDINT, NO_IRQ } | 601 | #define CLCD_IRQ { IRQ_CLCDINT, NO_IRQ } |
756 | #define CLCD_DMA { 0, 0 } | ||
757 | #define DMAC_IRQ { IRQ_DMAINT, NO_IRQ } | 602 | #define DMAC_IRQ { IRQ_DMAINT, NO_IRQ } |
758 | #define DMAC_DMA { 0, 0 } | ||
759 | 603 | ||
760 | /* | 604 | /* |
761 | * These devices are connected via the core APB bridge | 605 | * These devices are connected via the core APB bridge |
762 | */ | 606 | */ |
763 | #define SCTL_IRQ { NO_IRQ, NO_IRQ } | 607 | #define SCTL_IRQ { NO_IRQ, NO_IRQ } |
764 | #define SCTL_DMA { 0, 0 } | ||
765 | #define WATCHDOG_IRQ { IRQ_WDOGINT, NO_IRQ } | 608 | #define WATCHDOG_IRQ { IRQ_WDOGINT, NO_IRQ } |
766 | #define WATCHDOG_DMA { 0, 0 } | ||
767 | #define GPIO0_IRQ { IRQ_GPIOINT0, NO_IRQ } | 609 | #define GPIO0_IRQ { IRQ_GPIOINT0, NO_IRQ } |
768 | #define GPIO0_DMA { 0, 0 } | ||
769 | #define GPIO1_IRQ { IRQ_GPIOINT1, NO_IRQ } | 610 | #define GPIO1_IRQ { IRQ_GPIOINT1, NO_IRQ } |
770 | #define GPIO1_DMA { 0, 0 } | ||
771 | #define RTC_IRQ { IRQ_RTCINT, NO_IRQ } | 611 | #define RTC_IRQ { IRQ_RTCINT, NO_IRQ } |
772 | #define RTC_DMA { 0, 0 } | ||
773 | 612 | ||
774 | /* | 613 | /* |
775 | * These devices are connected via the DMA APB bridge | 614 | * These devices are connected via the DMA APB bridge |
776 | */ | 615 | */ |
777 | #define SCI_IRQ { IRQ_SCIINT, NO_IRQ } | 616 | #define SCI_IRQ { IRQ_SCIINT, NO_IRQ } |
778 | #define SCI_DMA { 7, 6 } | ||
779 | #define UART0_IRQ { IRQ_UARTINT0, NO_IRQ } | 617 | #define UART0_IRQ { IRQ_UARTINT0, NO_IRQ } |
780 | #define UART0_DMA { 15, 14 } | ||
781 | #define UART1_IRQ { IRQ_UARTINT1, NO_IRQ } | 618 | #define UART1_IRQ { IRQ_UARTINT1, NO_IRQ } |
782 | #define UART1_DMA { 13, 12 } | ||
783 | #define UART2_IRQ { IRQ_UARTINT2, NO_IRQ } | 619 | #define UART2_IRQ { IRQ_UARTINT2, NO_IRQ } |
784 | #define UART2_DMA { 11, 10 } | ||
785 | #define SSP_IRQ { IRQ_SSPINT, NO_IRQ } | 620 | #define SSP_IRQ { IRQ_SSPINT, NO_IRQ } |
786 | #define SSP_DMA { 9, 8 } | ||
787 | 621 | ||
788 | /* FPGA Primecells */ | 622 | /* FPGA Primecells */ |
789 | AMBA_DEVICE(aaci, "fpga:04", AACI, NULL); | 623 | AMBA_DEVICE(aaci, "fpga:04", AACI, NULL); |
@@ -865,14 +699,21 @@ static void versatile_leds_event(led_event_t ledevt) | |||
865 | } | 699 | } |
866 | #endif /* CONFIG_LEDS */ | 700 | #endif /* CONFIG_LEDS */ |
867 | 701 | ||
868 | void __init versatile_init(void) | 702 | /* Early initializations */ |
703 | void __init versatile_init_early(void) | ||
869 | { | 704 | { |
870 | int i; | 705 | void __iomem *sys = __io_address(VERSATILE_SYS_BASE); |
871 | |||
872 | osc4_clk.vcoreg = __io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_OSCCLCD_OFFSET; | ||
873 | 706 | ||
707 | osc4_clk.vcoreg = sys + VERSATILE_SYS_OSCCLCD_OFFSET; | ||
874 | clkdev_add_table(lookups, ARRAY_SIZE(lookups)); | 708 | clkdev_add_table(lookups, ARRAY_SIZE(lookups)); |
875 | 709 | ||
710 | versatile_sched_clock_init(sys + VERSATILE_SYS_24MHz_OFFSET, 24000000); | ||
711 | } | ||
712 | |||
713 | void __init versatile_init(void) | ||
714 | { | ||
715 | int i; | ||
716 | |||
876 | platform_device_register(&versatile_flash_device); | 717 | platform_device_register(&versatile_flash_device); |
877 | platform_device_register(&versatile_i2c_device); | 718 | platform_device_register(&versatile_i2c_device); |
878 | platform_device_register(&smc91x_device); | 719 | platform_device_register(&smc91x_device); |
@@ -889,12 +730,6 @@ void __init versatile_init(void) | |||
889 | } | 730 | } |
890 | 731 | ||
891 | /* | 732 | /* |
892 | * The sched_clock counter | ||
893 | */ | ||
894 | #define REFCOUNTER (__io_address(VERSATILE_SYS_BASE) + \ | ||
895 | VERSATILE_SYS_24MHz_OFFSET) | ||
896 | |||
897 | /* | ||
898 | * Where is the timer (VA)? | 733 | * Where is the timer (VA)? |
899 | */ | 734 | */ |
900 | #define TIMER0_VA_BASE __io_address(VERSATILE_TIMER0_1_BASE) | 735 | #define TIMER0_VA_BASE __io_address(VERSATILE_TIMER0_1_BASE) |
@@ -909,8 +744,6 @@ static void __init versatile_timer_init(void) | |||
909 | { | 744 | { |
910 | u32 val; | 745 | u32 val; |
911 | 746 | ||
912 | versatile_sched_clock_init(REFCOUNTER, 24000000); | ||
913 | |||
914 | /* | 747 | /* |
915 | * set clock frequency: | 748 | * set clock frequency: |
916 | * VERSATILE_REFCLK is 32KHz | 749 | * VERSATILE_REFCLK is 32KHz |
diff --git a/arch/arm/mach-versatile/core.h b/arch/arm/mach-versatile/core.h index 9d39886a8351..fd6404e5d788 100644 --- a/arch/arm/mach-versatile/core.h +++ b/arch/arm/mach-versatile/core.h | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/amba/bus.h> | 25 | #include <linux/amba/bus.h> |
26 | 26 | ||
27 | extern void __init versatile_init(void); | 27 | extern void __init versatile_init(void); |
28 | extern void __init versatile_init_early(void); | ||
28 | extern void __init versatile_init_irq(void); | 29 | extern void __init versatile_init_irq(void); |
29 | extern void __init versatile_map_io(void); | 30 | extern void __init versatile_map_io(void); |
30 | extern struct sys_timer versatile_timer; | 31 | extern struct sys_timer versatile_timer; |
@@ -44,7 +45,6 @@ static struct amba_device name##_device = { \ | |||
44 | }, \ | 45 | }, \ |
45 | .dma_mask = ~0, \ | 46 | .dma_mask = ~0, \ |
46 | .irq = base##_IRQ, \ | 47 | .irq = base##_IRQ, \ |
47 | /* .dma = base##_DMA,*/ \ | ||
48 | } | 48 | } |
49 | 49 | ||
50 | #endif | 50 | #endif |
diff --git a/arch/arm/mach-versatile/include/mach/hardware.h b/arch/arm/mach-versatile/include/mach/hardware.h index b5e75bb44965..6911e1f5f156 100644 --- a/arch/arm/mach-versatile/include/mach/hardware.h +++ b/arch/arm/mach-versatile/include/mach/hardware.h | |||
@@ -39,6 +39,6 @@ | |||
39 | /* macro to get at IO space when running virtually */ | 39 | /* macro to get at IO space when running virtually */ |
40 | #define IO_ADDRESS(x) (((x) & 0x0fffffff) + (((x) >> 4) & 0x0f000000) + 0xf0000000) | 40 | #define IO_ADDRESS(x) (((x) & 0x0fffffff) + (((x) >> 4) & 0x0f000000) + 0xf0000000) |
41 | 41 | ||
42 | #define __io_address(n) __io(IO_ADDRESS(n)) | 42 | #define __io_address(n) ((void __iomem __force *)IO_ADDRESS(n)) |
43 | 43 | ||
44 | #endif | 44 | #endif |
diff --git a/arch/arm/mach-versatile/versatile_ab.c b/arch/arm/mach-versatile/versatile_ab.c index aa9730fb13bf..f8ae64b3eed0 100644 --- a/arch/arm/mach-versatile/versatile_ab.c +++ b/arch/arm/mach-versatile/versatile_ab.c | |||
@@ -37,6 +37,7 @@ MACHINE_START(VERSATILE_AB, "ARM-Versatile AB") | |||
37 | /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */ | 37 | /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */ |
38 | .boot_params = 0x00000100, | 38 | .boot_params = 0x00000100, |
39 | .map_io = versatile_map_io, | 39 | .map_io = versatile_map_io, |
40 | .init_early = versatile_init_early, | ||
40 | .init_irq = versatile_init_irq, | 41 | .init_irq = versatile_init_irq, |
41 | .timer = &versatile_timer, | 42 | .timer = &versatile_timer, |
42 | .init_machine = versatile_init, | 43 | .init_machine = versatile_init, |
diff --git a/arch/arm/mach-versatile/versatile_pb.c b/arch/arm/mach-versatile/versatile_pb.c index bf469642a3f8..37c23dfeefb7 100644 --- a/arch/arm/mach-versatile/versatile_pb.c +++ b/arch/arm/mach-versatile/versatile_pb.c | |||
@@ -59,19 +59,14 @@ static struct pl061_platform_data gpio3_plat_data = { | |||
59 | }; | 59 | }; |
60 | 60 | ||
61 | #define UART3_IRQ { IRQ_SIC_UART3, NO_IRQ } | 61 | #define UART3_IRQ { IRQ_SIC_UART3, NO_IRQ } |
62 | #define UART3_DMA { 0x86, 0x87 } | ||
63 | #define SCI1_IRQ { IRQ_SIC_SCI3, NO_IRQ } | 62 | #define SCI1_IRQ { IRQ_SIC_SCI3, NO_IRQ } |
64 | #define SCI1_DMA { 0x88, 0x89 } | ||
65 | #define MMCI1_IRQ { IRQ_MMCI1A, IRQ_SIC_MMCI1B } | 63 | #define MMCI1_IRQ { IRQ_MMCI1A, IRQ_SIC_MMCI1B } |
66 | #define MMCI1_DMA { 0x85, 0 } | ||
67 | 64 | ||
68 | /* | 65 | /* |
69 | * These devices are connected via the core APB bridge | 66 | * These devices are connected via the core APB bridge |
70 | */ | 67 | */ |
71 | #define GPIO2_IRQ { IRQ_GPIOINT2, NO_IRQ } | 68 | #define GPIO2_IRQ { IRQ_GPIOINT2, NO_IRQ } |
72 | #define GPIO2_DMA { 0, 0 } | ||
73 | #define GPIO3_IRQ { IRQ_GPIOINT3, NO_IRQ } | 69 | #define GPIO3_IRQ { IRQ_GPIOINT3, NO_IRQ } |
74 | #define GPIO3_DMA { 0, 0 } | ||
75 | 70 | ||
76 | /* | 71 | /* |
77 | * These devices are connected via the DMA APB bridge | 72 | * These devices are connected via the DMA APB bridge |
@@ -110,6 +105,7 @@ MACHINE_START(VERSATILE_PB, "ARM-Versatile PB") | |||
110 | /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */ | 105 | /* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */ |
111 | .boot_params = 0x00000100, | 106 | .boot_params = 0x00000100, |
112 | .map_io = versatile_map_io, | 107 | .map_io = versatile_map_io, |
108 | .init_early = versatile_init_early, | ||
113 | .init_irq = versatile_init_irq, | 109 | .init_irq = versatile_init_irq, |
114 | .timer = &versatile_timer, | 110 | .timer = &versatile_timer, |
115 | .init_machine = versatile_pb_init, | 111 | .init_machine = versatile_pb_init, |