diff options
Diffstat (limited to 'arch/mips/jazz')
-rw-r--r-- | arch/mips/jazz/Makefile | 2 | ||||
-rw-r--r-- | arch/mips/jazz/irq.c | 142 | ||||
-rw-r--r-- | arch/mips/jazz/jazz-platform.c | 60 | ||||
-rw-r--r-- | arch/mips/jazz/jazzdma.c | 47 | ||||
-rw-r--r-- | arch/mips/jazz/reset.c | 4 | ||||
-rw-r--r-- | arch/mips/jazz/setup.c | 134 |
6 files changed, 219 insertions, 170 deletions
diff --git a/arch/mips/jazz/Makefile b/arch/mips/jazz/Makefile index 575a9442bc82..5aee0c266d18 100644 --- a/arch/mips/jazz/Makefile +++ b/arch/mips/jazz/Makefile | |||
@@ -2,6 +2,6 @@ | |||
2 | # Makefile for the Jazz family specific parts of the kernel | 2 | # Makefile for the Jazz family specific parts of the kernel |
3 | # | 3 | # |
4 | 4 | ||
5 | obj-y := irq.o jazzdma.o jazz-platform.o reset.o setup.o | 5 | obj-y := irq.o jazzdma.o reset.o setup.o |
6 | 6 | ||
7 | EXTRA_CFLAGS += -Werror | 7 | EXTRA_CFLAGS += -Werror |
diff --git a/arch/mips/jazz/irq.c b/arch/mips/jazz/irq.c index 015cf4bb51dd..835b056cea36 100644 --- a/arch/mips/jazz/irq.c +++ b/arch/mips/jazz/irq.c | |||
@@ -6,20 +6,23 @@ | |||
6 | * Copyright (C) 1992 Linus Torvalds | 6 | * Copyright (C) 1992 Linus Torvalds |
7 | * Copyright (C) 1994 - 2001, 2003 Ralf Baechle | 7 | * Copyright (C) 1994 - 2001, 2003 Ralf Baechle |
8 | */ | 8 | */ |
9 | #include <linux/clockchips.h> | ||
9 | #include <linux/init.h> | 10 | #include <linux/init.h> |
10 | #include <linux/interrupt.h> | 11 | #include <linux/interrupt.h> |
11 | #include <linux/kernel.h> | 12 | #include <linux/kernel.h> |
12 | #include <linux/spinlock.h> | 13 | #include <linux/spinlock.h> |
13 | 14 | ||
15 | #include <asm/irq_cpu.h> | ||
14 | #include <asm/i8259.h> | 16 | #include <asm/i8259.h> |
15 | #include <asm/io.h> | 17 | #include <asm/io.h> |
16 | #include <asm/jazz.h> | 18 | #include <asm/jazz.h> |
19 | #include <asm/pgtable.h> | ||
17 | 20 | ||
18 | static DEFINE_SPINLOCK(r4030_lock); | 21 | static DEFINE_SPINLOCK(r4030_lock); |
19 | 22 | ||
20 | static void enable_r4030_irq(unsigned int irq) | 23 | static void enable_r4030_irq(unsigned int irq) |
21 | { | 24 | { |
22 | unsigned int mask = 1 << (irq - JAZZ_PARALLEL_IRQ); | 25 | unsigned int mask = 1 << (irq - JAZZ_IRQ_START); |
23 | unsigned long flags; | 26 | unsigned long flags; |
24 | 27 | ||
25 | spin_lock_irqsave(&r4030_lock, flags); | 28 | spin_lock_irqsave(&r4030_lock, flags); |
@@ -30,7 +33,7 @@ static void enable_r4030_irq(unsigned int irq) | |||
30 | 33 | ||
31 | void disable_r4030_irq(unsigned int irq) | 34 | void disable_r4030_irq(unsigned int irq) |
32 | { | 35 | { |
33 | unsigned int mask = ~(1 << (irq - JAZZ_PARALLEL_IRQ)); | 36 | unsigned int mask = ~(1 << (irq - JAZZ_IRQ_START)); |
34 | unsigned long flags; | 37 | unsigned long flags; |
35 | 38 | ||
36 | spin_lock_irqsave(&r4030_lock, flags); | 39 | spin_lock_irqsave(&r4030_lock, flags); |
@@ -51,7 +54,7 @@ void __init init_r4030_ints(void) | |||
51 | { | 54 | { |
52 | int i; | 55 | int i; |
53 | 56 | ||
54 | for (i = JAZZ_PARALLEL_IRQ; i <= JAZZ_TIMER_IRQ; i++) | 57 | for (i = JAZZ_IRQ_START; i <= JAZZ_IRQ_END; i++) |
55 | set_irq_chip_and_handler(i, &r4030_irq_type, handle_level_irq); | 58 | set_irq_chip_and_handler(i, &r4030_irq_type, handle_level_irq); |
56 | 59 | ||
57 | r4030_write_reg16(JAZZ_IO_IRQ_ENABLE, 0); | 60 | r4030_write_reg16(JAZZ_IO_IRQ_ENABLE, 0); |
@@ -66,82 +69,87 @@ void __init init_r4030_ints(void) | |||
66 | */ | 69 | */ |
67 | void __init arch_init_irq(void) | 70 | void __init arch_init_irq(void) |
68 | { | 71 | { |
72 | /* | ||
73 | * this is a hack to get back the still needed wired mapping | ||
74 | * killed by init_mm() | ||
75 | */ | ||
76 | |||
77 | /* Map 0xe0000000 -> 0x0:800005C0, 0xe0010000 -> 0x1:30000580 */ | ||
78 | add_wired_entry(0x02000017, 0x03c00017, 0xe0000000, PM_64K); | ||
79 | /* Map 0xe2000000 -> 0x0:900005C0, 0xe3010000 -> 0x0:910005C0 */ | ||
80 | add_wired_entry(0x02400017, 0x02440017, 0xe2000000, PM_16M); | ||
81 | /* Map 0xe4000000 -> 0x0:600005C0, 0xe4100000 -> 400005C0 */ | ||
82 | add_wired_entry(0x01800017, 0x01000017, 0xe4000000, PM_4M); | ||
83 | |||
69 | init_i8259_irqs(); /* Integrated i8259 */ | 84 | init_i8259_irqs(); /* Integrated i8259 */ |
85 | mips_cpu_irq_init(); | ||
70 | init_r4030_ints(); | 86 | init_r4030_ints(); |
71 | 87 | ||
72 | change_c0_status(ST0_IM, IE_IRQ4 | IE_IRQ3 | IE_IRQ2 | IE_IRQ1); | 88 | change_c0_status(ST0_IM, IE_IRQ2 | IE_IRQ1); |
73 | } | ||
74 | |||
75 | static void loc_call(unsigned int irq, unsigned int mask) | ||
76 | { | ||
77 | r4030_write_reg16(JAZZ_IO_IRQ_ENABLE, | ||
78 | r4030_read_reg16(JAZZ_IO_IRQ_ENABLE) & mask); | ||
79 | do_IRQ(irq); | ||
80 | r4030_write_reg16(JAZZ_IO_IRQ_ENABLE, | ||
81 | r4030_read_reg16(JAZZ_IO_IRQ_ENABLE) | mask); | ||
82 | } | ||
83 | |||
84 | static void ll_local_dev(void) | ||
85 | { | ||
86 | switch (r4030_read_reg32(JAZZ_IO_IRQ_SOURCE)) { | ||
87 | case 0: | ||
88 | panic("Unimplemented loc_no_irq handler"); | ||
89 | break; | ||
90 | case 4: | ||
91 | loc_call(JAZZ_PARALLEL_IRQ, JAZZ_IE_PARALLEL); | ||
92 | break; | ||
93 | case 8: | ||
94 | loc_call(JAZZ_PARALLEL_IRQ, JAZZ_IE_FLOPPY); | ||
95 | break; | ||
96 | case 12: | ||
97 | panic("Unimplemented loc_sound handler"); | ||
98 | break; | ||
99 | case 16: | ||
100 | panic("Unimplemented loc_video handler"); | ||
101 | break; | ||
102 | case 20: | ||
103 | loc_call(JAZZ_ETHERNET_IRQ, JAZZ_IE_ETHERNET); | ||
104 | break; | ||
105 | case 24: | ||
106 | loc_call(JAZZ_SCSI_IRQ, JAZZ_IE_SCSI); | ||
107 | break; | ||
108 | case 28: | ||
109 | loc_call(JAZZ_KEYBOARD_IRQ, JAZZ_IE_KEYBOARD); | ||
110 | break; | ||
111 | case 32: | ||
112 | loc_call(JAZZ_MOUSE_IRQ, JAZZ_IE_MOUSE); | ||
113 | break; | ||
114 | case 36: | ||
115 | loc_call(JAZZ_SERIAL1_IRQ, JAZZ_IE_SERIAL1); | ||
116 | break; | ||
117 | case 40: | ||
118 | loc_call(JAZZ_SERIAL2_IRQ, JAZZ_IE_SERIAL2); | ||
119 | break; | ||
120 | } | ||
121 | } | 89 | } |
122 | 90 | ||
123 | asmlinkage void plat_irq_dispatch(void) | 91 | asmlinkage void plat_irq_dispatch(void) |
124 | { | 92 | { |
125 | unsigned int pending = read_c0_cause() & read_c0_status(); | 93 | unsigned int pending = read_c0_cause() & read_c0_status(); |
94 | unsigned int irq; | ||
126 | 95 | ||
127 | if (pending & IE_IRQ5) | 96 | if (pending & IE_IRQ4) { |
128 | write_c0_compare(0); | ||
129 | else if (pending & IE_IRQ4) { | ||
130 | r4030_read_reg32(JAZZ_TIMER_REGISTER); | 97 | r4030_read_reg32(JAZZ_TIMER_REGISTER); |
131 | do_IRQ(JAZZ_TIMER_IRQ); | 98 | do_IRQ(JAZZ_TIMER_IRQ); |
132 | } else if (pending & IE_IRQ3) | 99 | } else if (pending & IE_IRQ2) |
133 | panic("Unimplemented ISA NMI handler"); | ||
134 | else if (pending & IE_IRQ2) | ||
135 | do_IRQ(r4030_read_reg32(JAZZ_EISA_IRQ_ACK)); | 100 | do_IRQ(r4030_read_reg32(JAZZ_EISA_IRQ_ACK)); |
136 | else if (pending & IE_IRQ1) { | 101 | else if (pending & IE_IRQ1) { |
137 | ll_local_dev(); | 102 | irq = *(volatile u8 *)JAZZ_IO_IRQ_SOURCE >> 2; |
138 | } else if (unlikely(pending & IE_IRQ0)) | 103 | if (likely(irq > 0)) |
139 | panic("Unimplemented local_dma handler"); | 104 | do_IRQ(irq + JAZZ_IRQ_START - 1); |
140 | else if (pending & IE_SW1) { | 105 | else |
141 | clear_c0_cause(IE_SW1); | 106 | panic("Unimplemented loc_no_irq handler"); |
142 | panic("Unimplemented sw1 handler"); | ||
143 | } else if (pending & IE_SW0) { | ||
144 | clear_c0_cause(IE_SW0); | ||
145 | panic("Unimplemented sw0 handler"); | ||
146 | } | 107 | } |
147 | } | 108 | } |
109 | |||
110 | static void r4030_set_mode(enum clock_event_mode mode, | ||
111 | struct clock_event_device *evt) | ||
112 | { | ||
113 | /* Nothing to do ... */ | ||
114 | } | ||
115 | |||
116 | struct clock_event_device r4030_clockevent = { | ||
117 | .name = "r4030", | ||
118 | .features = CLOCK_EVT_FEAT_PERIODIC, | ||
119 | .rating = 100, | ||
120 | .irq = JAZZ_TIMER_IRQ, | ||
121 | .cpumask = CPU_MASK_CPU0, | ||
122 | .set_mode = r4030_set_mode, | ||
123 | }; | ||
124 | |||
125 | static irqreturn_t r4030_timer_interrupt(int irq, void *dev_id) | ||
126 | { | ||
127 | r4030_clockevent.event_handler(&r4030_clockevent); | ||
128 | |||
129 | return IRQ_HANDLED; | ||
130 | } | ||
131 | |||
132 | static struct irqaction r4030_timer_irqaction = { | ||
133 | .handler = r4030_timer_interrupt, | ||
134 | .flags = IRQF_DISABLED, | ||
135 | .mask = CPU_MASK_CPU0, | ||
136 | .name = "timer", | ||
137 | }; | ||
138 | |||
139 | void __init plat_timer_setup(struct irqaction *ignored) | ||
140 | { | ||
141 | struct irqaction *irq = &r4030_timer_irqaction; | ||
142 | |||
143 | BUG_ON(HZ != 100); | ||
144 | |||
145 | /* | ||
146 | * Set clock to 100Hz. | ||
147 | * | ||
148 | * The R4030 timer receives an input clock of 1kHz which is divieded by | ||
149 | * a programmable 4-bit divider. This makes it fairly inflexible. | ||
150 | */ | ||
151 | r4030_write_reg32(JAZZ_TIMER_INTERVAL, 9); | ||
152 | setup_irq(JAZZ_TIMER_IRQ, irq); | ||
153 | |||
154 | clockevents_register_device(&r4030_clockevent); | ||
155 | } | ||
diff --git a/arch/mips/jazz/jazz-platform.c b/arch/mips/jazz/jazz-platform.c deleted file mode 100644 index fd736703eef2..000000000000 --- a/arch/mips/jazz/jazz-platform.c +++ /dev/null | |||
@@ -1,60 +0,0 @@ | |||
1 | /* | ||
2 | * This file is subject to the terms and conditions of the GNU General Public | ||
3 | * License. See the file "COPYING" in the main directory of this archive | ||
4 | * for more details. | ||
5 | * | ||
6 | * Copyright (C) 2007 Ralf Baechle (ralf@linux-mips.org) | ||
7 | */ | ||
8 | #include <linux/init.h> | ||
9 | #include <linux/module.h> | ||
10 | #include <linux/serial_8250.h> | ||
11 | |||
12 | #include <asm/jazz.h> | ||
13 | |||
14 | /* | ||
15 | * Confusion ... It seems the original Microsoft Jazz machine used to have a | ||
16 | * 4.096MHz clock for its UART while the MIPS Magnum and Millenium systems | ||
17 | * had 8MHz. The Olivetti M700-10 and the Acer PICA have 1.8432MHz like PCs. | ||
18 | */ | ||
19 | #ifdef CONFIG_OLIVETTI_M700 | ||
20 | #define JAZZ_BASE_BAUD 1843200 | ||
21 | #else | ||
22 | #define JAZZ_BASE_BAUD 8000000 /* 3072000 */ | ||
23 | #endif | ||
24 | |||
25 | #define JAZZ_UART_FLAGS (UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_IOREMAP) | ||
26 | |||
27 | #define JAZZ_PORT(base, int) \ | ||
28 | { \ | ||
29 | .mapbase = base, \ | ||
30 | .irq = int, \ | ||
31 | .uartclk = JAZZ_BASE_BAUD, \ | ||
32 | .iotype = UPIO_MEM, \ | ||
33 | .flags = JAZZ_UART_FLAGS, \ | ||
34 | .regshift = 0, \ | ||
35 | } | ||
36 | |||
37 | static struct plat_serial8250_port uart8250_data[] = { | ||
38 | JAZZ_PORT(JAZZ_SERIAL1_BASE, JAZZ_SERIAL1_IRQ), | ||
39 | JAZZ_PORT(JAZZ_SERIAL2_BASE, JAZZ_SERIAL2_IRQ), | ||
40 | { }, | ||
41 | }; | ||
42 | |||
43 | static struct platform_device uart8250_device = { | ||
44 | .name = "serial8250", | ||
45 | .id = PLAT8250_DEV_PLATFORM, | ||
46 | .dev = { | ||
47 | .platform_data = uart8250_data, | ||
48 | }, | ||
49 | }; | ||
50 | |||
51 | static int __init uart8250_init(void) | ||
52 | { | ||
53 | return platform_device_register(&uart8250_device); | ||
54 | } | ||
55 | |||
56 | module_init(uart8250_init); | ||
57 | |||
58 | MODULE_AUTHOR("Ralf Baechle <ralf@linux-mips.org>"); | ||
59 | MODULE_LICENSE("GPL"); | ||
60 | MODULE_DESCRIPTION("8250 UART probe driver for the Jazz family"); | ||
diff --git a/arch/mips/jazz/jazzdma.c b/arch/mips/jazz/jazzdma.c index e8e0ffb9354d..c672c08d49e5 100644 --- a/arch/mips/jazz/jazzdma.c +++ b/arch/mips/jazz/jazzdma.c | |||
@@ -27,7 +27,7 @@ | |||
27 | */ | 27 | */ |
28 | #define CONF_DEBUG_VDMA 0 | 28 | #define CONF_DEBUG_VDMA 0 |
29 | 29 | ||
30 | static unsigned long vdma_pagetable_start; | 30 | static VDMA_PGTBL_ENTRY *pgtbl; |
31 | 31 | ||
32 | static DEFINE_SPINLOCK(vdma_lock); | 32 | static DEFINE_SPINLOCK(vdma_lock); |
33 | 33 | ||
@@ -46,7 +46,6 @@ static int debuglvl = 3; | |||
46 | */ | 46 | */ |
47 | static inline void vdma_pgtbl_init(void) | 47 | static inline void vdma_pgtbl_init(void) |
48 | { | 48 | { |
49 | VDMA_PGTBL_ENTRY *pgtbl = (VDMA_PGTBL_ENTRY *) vdma_pagetable_start; | ||
50 | unsigned long paddr = 0; | 49 | unsigned long paddr = 0; |
51 | int i; | 50 | int i; |
52 | 51 | ||
@@ -60,31 +59,31 @@ static inline void vdma_pgtbl_init(void) | |||
60 | /* | 59 | /* |
61 | * Initialize the Jazz R4030 dma controller | 60 | * Initialize the Jazz R4030 dma controller |
62 | */ | 61 | */ |
63 | void __init vdma_init(void) | 62 | static int __init vdma_init(void) |
64 | { | 63 | { |
65 | /* | 64 | /* |
66 | * Allocate 32k of memory for DMA page tables. This needs to be page | 65 | * Allocate 32k of memory for DMA page tables. This needs to be page |
67 | * aligned and should be uncached to avoid cache flushing after every | 66 | * aligned and should be uncached to avoid cache flushing after every |
68 | * update. | 67 | * update. |
69 | */ | 68 | */ |
70 | vdma_pagetable_start = | 69 | pgtbl = (VDMA_PGTBL_ENTRY *)__get_free_pages(GFP_KERNEL | GFP_DMA, |
71 | (unsigned long) alloc_bootmem_low_pages(VDMA_PGTBL_SIZE); | 70 | get_order(VDMA_PGTBL_SIZE)); |
72 | if (!vdma_pagetable_start) | 71 | if (!pgtbl) |
73 | BUG(); | 72 | BUG(); |
74 | dma_cache_wback_inv(vdma_pagetable_start, VDMA_PGTBL_SIZE); | 73 | dma_cache_wback_inv((unsigned long)pgtbl, VDMA_PGTBL_SIZE); |
75 | vdma_pagetable_start = KSEG1ADDR(vdma_pagetable_start); | 74 | pgtbl = (VDMA_PGTBL_ENTRY *)KSEG1ADDR(pgtbl); |
76 | 75 | ||
77 | /* | 76 | /* |
78 | * Clear the R4030 translation table | 77 | * Clear the R4030 translation table |
79 | */ | 78 | */ |
80 | vdma_pgtbl_init(); | 79 | vdma_pgtbl_init(); |
81 | 80 | ||
82 | r4030_write_reg32(JAZZ_R4030_TRSTBL_BASE, | 81 | r4030_write_reg32(JAZZ_R4030_TRSTBL_BASE, CPHYSADDR(pgtbl)); |
83 | CPHYSADDR(vdma_pagetable_start)); | ||
84 | r4030_write_reg32(JAZZ_R4030_TRSTBL_LIM, VDMA_PGTBL_SIZE); | 82 | r4030_write_reg32(JAZZ_R4030_TRSTBL_LIM, VDMA_PGTBL_SIZE); |
85 | r4030_write_reg32(JAZZ_R4030_TRSTBL_INV, 0); | 83 | r4030_write_reg32(JAZZ_R4030_TRSTBL_INV, 0); |
86 | 84 | ||
87 | printk("VDMA: R4030 DMA pagetables initialized.\n"); | 85 | printk(KERN_INFO "VDMA: R4030 DMA pagetables initialized.\n"); |
86 | return 0; | ||
88 | } | 87 | } |
89 | 88 | ||
90 | /* | 89 | /* |
@@ -92,7 +91,6 @@ void __init vdma_init(void) | |||
92 | */ | 91 | */ |
93 | unsigned long vdma_alloc(unsigned long paddr, unsigned long size) | 92 | unsigned long vdma_alloc(unsigned long paddr, unsigned long size) |
94 | { | 93 | { |
95 | VDMA_PGTBL_ENTRY *entry = (VDMA_PGTBL_ENTRY *) vdma_pagetable_start; | ||
96 | int first, last, pages, frame, i; | 94 | int first, last, pages, frame, i; |
97 | unsigned long laddr, flags; | 95 | unsigned long laddr, flags; |
98 | 96 | ||
@@ -114,10 +112,10 @@ unsigned long vdma_alloc(unsigned long paddr, unsigned long size) | |||
114 | /* | 112 | /* |
115 | * Find free chunk | 113 | * Find free chunk |
116 | */ | 114 | */ |
117 | pages = (size + 4095) >> 12; /* no. of pages to allocate */ | 115 | pages = VDMA_PAGE(paddr + size) - VDMA_PAGE(paddr) + 1; |
118 | first = 0; | 116 | first = 0; |
119 | while (1) { | 117 | while (1) { |
120 | while (entry[first].owner != VDMA_PAGE_EMPTY && | 118 | while (pgtbl[first].owner != VDMA_PAGE_EMPTY && |
121 | first < VDMA_PGTBL_ENTRIES) first++; | 119 | first < VDMA_PGTBL_ENTRIES) first++; |
122 | if (first + pages > VDMA_PGTBL_ENTRIES) { /* nothing free */ | 120 | if (first + pages > VDMA_PGTBL_ENTRIES) { /* nothing free */ |
123 | spin_unlock_irqrestore(&vdma_lock, flags); | 121 | spin_unlock_irqrestore(&vdma_lock, flags); |
@@ -125,12 +123,13 @@ unsigned long vdma_alloc(unsigned long paddr, unsigned long size) | |||
125 | } | 123 | } |
126 | 124 | ||
127 | last = first + 1; | 125 | last = first + 1; |
128 | while (entry[last].owner == VDMA_PAGE_EMPTY | 126 | while (pgtbl[last].owner == VDMA_PAGE_EMPTY |
129 | && last - first < pages) | 127 | && last - first < pages) |
130 | last++; | 128 | last++; |
131 | 129 | ||
132 | if (last - first == pages) | 130 | if (last - first == pages) |
133 | break; /* found */ | 131 | break; /* found */ |
132 | first = last + 1; | ||
134 | } | 133 | } |
135 | 134 | ||
136 | /* | 135 | /* |
@@ -140,8 +139,8 @@ unsigned long vdma_alloc(unsigned long paddr, unsigned long size) | |||
140 | frame = paddr & ~(VDMA_PAGESIZE - 1); | 139 | frame = paddr & ~(VDMA_PAGESIZE - 1); |
141 | 140 | ||
142 | for (i = first; i < last; i++) { | 141 | for (i = first; i < last; i++) { |
143 | entry[i].frame = frame; | 142 | pgtbl[i].frame = frame; |
144 | entry[i].owner = laddr; | 143 | pgtbl[i].owner = laddr; |
145 | frame += VDMA_PAGESIZE; | 144 | frame += VDMA_PAGESIZE; |
146 | } | 145 | } |
147 | 146 | ||
@@ -160,10 +159,10 @@ unsigned long vdma_alloc(unsigned long paddr, unsigned long size) | |||
160 | printk("%08x ", i << 12); | 159 | printk("%08x ", i << 12); |
161 | printk("\nPADDR: "); | 160 | printk("\nPADDR: "); |
162 | for (i = first; i < last; i++) | 161 | for (i = first; i < last; i++) |
163 | printk("%08x ", entry[i].frame); | 162 | printk("%08x ", pgtbl[i].frame); |
164 | printk("\nOWNER: "); | 163 | printk("\nOWNER: "); |
165 | for (i = first; i < last; i++) | 164 | for (i = first; i < last; i++) |
166 | printk("%08x ", entry[i].owner); | 165 | printk("%08x ", pgtbl[i].owner); |
167 | printk("\n"); | 166 | printk("\n"); |
168 | } | 167 | } |
169 | 168 | ||
@@ -181,7 +180,6 @@ EXPORT_SYMBOL(vdma_alloc); | |||
181 | */ | 180 | */ |
182 | int vdma_free(unsigned long laddr) | 181 | int vdma_free(unsigned long laddr) |
183 | { | 182 | { |
184 | VDMA_PGTBL_ENTRY *pgtbl = (VDMA_PGTBL_ENTRY *) vdma_pagetable_start; | ||
185 | int i; | 183 | int i; |
186 | 184 | ||
187 | i = laddr >> 12; | 185 | i = laddr >> 12; |
@@ -213,8 +211,6 @@ EXPORT_SYMBOL(vdma_free); | |||
213 | */ | 211 | */ |
214 | int vdma_remap(unsigned long laddr, unsigned long paddr, unsigned long size) | 212 | int vdma_remap(unsigned long laddr, unsigned long paddr, unsigned long size) |
215 | { | 213 | { |
216 | VDMA_PGTBL_ENTRY *pgtbl = | ||
217 | (VDMA_PGTBL_ENTRY *) vdma_pagetable_start; | ||
218 | int first, pages, npages; | 214 | int first, pages, npages; |
219 | 215 | ||
220 | if (laddr > 0xffffff) { | 216 | if (laddr > 0xffffff) { |
@@ -289,8 +285,6 @@ unsigned long vdma_phys2log(unsigned long paddr) | |||
289 | { | 285 | { |
290 | int i; | 286 | int i; |
291 | int frame; | 287 | int frame; |
292 | VDMA_PGTBL_ENTRY *pgtbl = | ||
293 | (VDMA_PGTBL_ENTRY *) vdma_pagetable_start; | ||
294 | 288 | ||
295 | frame = paddr & ~(VDMA_PAGESIZE - 1); | 289 | frame = paddr & ~(VDMA_PAGESIZE - 1); |
296 | 290 | ||
@@ -312,9 +306,6 @@ EXPORT_SYMBOL(vdma_phys2log); | |||
312 | */ | 306 | */ |
313 | unsigned long vdma_log2phys(unsigned long laddr) | 307 | unsigned long vdma_log2phys(unsigned long laddr) |
314 | { | 308 | { |
315 | VDMA_PGTBL_ENTRY *pgtbl = | ||
316 | (VDMA_PGTBL_ENTRY *) vdma_pagetable_start; | ||
317 | |||
318 | return pgtbl[laddr >> 12].frame + (laddr & (VDMA_PAGESIZE - 1)); | 309 | return pgtbl[laddr >> 12].frame + (laddr & (VDMA_PAGESIZE - 1)); |
319 | } | 310 | } |
320 | 311 | ||
@@ -564,3 +555,5 @@ int vdma_get_enable(int channel) | |||
564 | 555 | ||
565 | return enable; | 556 | return enable; |
566 | } | 557 | } |
558 | |||
559 | arch_initcall(vdma_init); | ||
diff --git a/arch/mips/jazz/reset.c b/arch/mips/jazz/reset.c index d8ade85060b3..dd889fe86bd1 100644 --- a/arch/mips/jazz/reset.c +++ b/arch/mips/jazz/reset.c | |||
@@ -49,8 +49,8 @@ void jazz_machine_restart(char *command) | |||
49 | { | 49 | { |
50 | while(1) { | 50 | while(1) { |
51 | kb_wait(); | 51 | kb_wait(); |
52 | jazz_write_command (0xd1); | 52 | jazz_write_command(0xd1); |
53 | kb_wait(); | 53 | kb_wait(); |
54 | jazz_write_output (0x00); | 54 | jazz_write_output(0x00); |
55 | } | 55 | } |
56 | } | 56 | } |
diff --git a/arch/mips/jazz/setup.c b/arch/mips/jazz/setup.c index 798279e06691..cfc7dce78dab 100644 --- a/arch/mips/jazz/setup.c +++ b/arch/mips/jazz/setup.c | |||
@@ -7,6 +7,7 @@ | |||
7 | * | 7 | * |
8 | * Copyright (C) 1996, 1997, 1998, 2001 by Ralf Baechle | 8 | * Copyright (C) 1996, 1997, 1998, 2001 by Ralf Baechle |
9 | * Copyright (C) 2001 MIPS Technologies, Inc. | 9 | * Copyright (C) 2001 MIPS Technologies, Inc. |
10 | * Copyright (C) 2007 by Thomas Bogendoerfer | ||
10 | */ | 11 | */ |
11 | #include <linux/eisa.h> | 12 | #include <linux/eisa.h> |
12 | #include <linux/hdreg.h> | 13 | #include <linux/hdreg.h> |
@@ -20,8 +21,11 @@ | |||
20 | #include <linux/ide.h> | 21 | #include <linux/ide.h> |
21 | #include <linux/pm.h> | 22 | #include <linux/pm.h> |
22 | #include <linux/screen_info.h> | 23 | #include <linux/screen_info.h> |
24 | #include <linux/platform_device.h> | ||
25 | #include <linux/serial_8250.h> | ||
23 | 26 | ||
24 | #include <asm/bootinfo.h> | 27 | #include <asm/bootinfo.h> |
28 | #include <asm/i8253.h> | ||
25 | #include <asm/irq.h> | 29 | #include <asm/irq.h> |
26 | #include <asm/jazz.h> | 30 | #include <asm/jazz.h> |
27 | #include <asm/jazzdma.h> | 31 | #include <asm/jazzdma.h> |
@@ -30,18 +34,12 @@ | |||
30 | #include <asm/pgtable.h> | 34 | #include <asm/pgtable.h> |
31 | #include <asm/time.h> | 35 | #include <asm/time.h> |
32 | #include <asm/traps.h> | 36 | #include <asm/traps.h> |
37 | #include <asm/mc146818-time.h> | ||
33 | 38 | ||
34 | extern asmlinkage void jazz_handle_int(void); | 39 | extern asmlinkage void jazz_handle_int(void); |
35 | 40 | ||
36 | extern void jazz_machine_restart(char *command); | 41 | extern void jazz_machine_restart(char *command); |
37 | 42 | ||
38 | void __init plat_timer_setup(struct irqaction *irq) | ||
39 | { | ||
40 | /* set the clock to 100 Hz */ | ||
41 | r4030_write_reg32(JAZZ_TIMER_INTERVAL, 9); | ||
42 | setup_irq(JAZZ_TIMER_IRQ, irq); | ||
43 | } | ||
44 | |||
45 | static struct resource jazz_io_resources[] = { | 43 | static struct resource jazz_io_resources[] = { |
46 | { | 44 | { |
47 | .start = 0x00, | 45 | .start = 0x00, |
@@ -66,18 +64,21 @@ static struct resource jazz_io_resources[] = { | |||
66 | } | 64 | } |
67 | }; | 65 | }; |
68 | 66 | ||
67 | void __init plat_time_init(void) | ||
68 | { | ||
69 | setup_pit_timer(); | ||
70 | } | ||
71 | |||
69 | void __init plat_mem_setup(void) | 72 | void __init plat_mem_setup(void) |
70 | { | 73 | { |
71 | int i; | 74 | int i; |
72 | 75 | ||
73 | /* Map 0xe0000000 -> 0x0:800005C0, 0xe0010000 -> 0x1:30000580 */ | 76 | /* Map 0xe0000000 -> 0x0:800005C0, 0xe0010000 -> 0x1:30000580 */ |
74 | add_wired_entry (0x02000017, 0x03c00017, 0xe0000000, PM_64K); | 77 | add_wired_entry(0x02000017, 0x03c00017, 0xe0000000, PM_64K); |
75 | |||
76 | /* Map 0xe2000000 -> 0x0:900005C0, 0xe3010000 -> 0x0:910005C0 */ | 78 | /* Map 0xe2000000 -> 0x0:900005C0, 0xe3010000 -> 0x0:910005C0 */ |
77 | add_wired_entry (0x02400017, 0x02440017, 0xe2000000, PM_16M); | 79 | add_wired_entry(0x02400017, 0x02440017, 0xe2000000, PM_16M); |
78 | |||
79 | /* Map 0xe4000000 -> 0x0:600005C0, 0xe4100000 -> 400005C0 */ | 80 | /* Map 0xe4000000 -> 0x0:600005C0, 0xe4100000 -> 400005C0 */ |
80 | add_wired_entry (0x01800017, 0x01000017, 0xe4000000, PM_4M); | 81 | add_wired_entry(0x01800017, 0x01000017, 0xe4000000, PM_4M); |
81 | 82 | ||
82 | set_io_port_base(JAZZ_PORT_BASE); | 83 | set_io_port_base(JAZZ_PORT_BASE); |
83 | #ifdef CONFIG_EISA | 84 | #ifdef CONFIG_EISA |
@@ -94,6 +95,7 @@ void __init plat_mem_setup(void) | |||
94 | 95 | ||
95 | _machine_restart = jazz_machine_restart; | 96 | _machine_restart = jazz_machine_restart; |
96 | 97 | ||
98 | #ifdef CONFIG_VT | ||
97 | screen_info = (struct screen_info) { | 99 | screen_info = (struct screen_info) { |
98 | 0, 0, /* orig-x, orig-y */ | 100 | 0, 0, /* orig-x, orig-y */ |
99 | 0, /* unused */ | 101 | 0, /* unused */ |
@@ -105,6 +107,112 @@ void __init plat_mem_setup(void) | |||
105 | 0, /* orig_video_isVGA */ | 107 | 0, /* orig_video_isVGA */ |
106 | 16 /* orig_video_points */ | 108 | 16 /* orig_video_points */ |
107 | }; | 109 | }; |
110 | #endif | ||
108 | 111 | ||
109 | vdma_init(); | 112 | add_preferred_console("ttyS", 0, "9600"); |
110 | } | 113 | } |
114 | |||
115 | #ifdef CONFIG_OLIVETTI_M700 | ||
116 | #define UART_CLK 1843200 | ||
117 | #else | ||
118 | /* Some Jazz machines seem to have an 8MHz crystal clock but I don't know | ||
119 | exactly which ones ... XXX */ | ||
120 | #define UART_CLK (8000000 / 16) /* ( 3072000 / 16) */ | ||
121 | #endif | ||
122 | |||
123 | #define MEMPORT(_base, _irq) \ | ||
124 | { \ | ||
125 | .mapbase = (_base), \ | ||
126 | .membase = (void *)(_base), \ | ||
127 | .irq = (_irq), \ | ||
128 | .uartclk = UART_CLK, \ | ||
129 | .iotype = UPIO_MEM, \ | ||
130 | .flags = UPF_BOOT_AUTOCONF, \ | ||
131 | } | ||
132 | |||
133 | static struct plat_serial8250_port jazz_serial_data[] = { | ||
134 | MEMPORT(JAZZ_SERIAL1_BASE, JAZZ_SERIAL1_IRQ), | ||
135 | MEMPORT(JAZZ_SERIAL2_BASE, JAZZ_SERIAL2_IRQ), | ||
136 | { }, | ||
137 | }; | ||
138 | |||
139 | static struct platform_device jazz_serial8250_device = { | ||
140 | .name = "serial8250", | ||
141 | .id = PLAT8250_DEV_PLATFORM, | ||
142 | .dev = { | ||
143 | .platform_data = jazz_serial_data, | ||
144 | }, | ||
145 | }; | ||
146 | |||
147 | static struct resource jazz_esp_rsrc[] = { | ||
148 | { | ||
149 | .start = JAZZ_SCSI_BASE, | ||
150 | .end = JAZZ_SCSI_BASE + 31, | ||
151 | .flags = IORESOURCE_MEM | ||
152 | }, | ||
153 | { | ||
154 | .start = JAZZ_SCSI_DMA, | ||
155 | .end = JAZZ_SCSI_DMA, | ||
156 | .flags = IORESOURCE_MEM | ||
157 | }, | ||
158 | { | ||
159 | .start = JAZZ_SCSI_IRQ, | ||
160 | .end = JAZZ_SCSI_IRQ, | ||
161 | .flags = IORESOURCE_IRQ | ||
162 | } | ||
163 | }; | ||
164 | |||
165 | static struct platform_device jazz_esp_pdev = { | ||
166 | .name = "jazz_esp", | ||
167 | .num_resources = ARRAY_SIZE(jazz_esp_rsrc), | ||
168 | .resource = jazz_esp_rsrc | ||
169 | }; | ||
170 | |||
171 | static struct resource jazz_sonic_rsrc[] = { | ||
172 | { | ||
173 | .start = JAZZ_ETHERNET_BASE, | ||
174 | .end = JAZZ_ETHERNET_BASE + 0xff, | ||
175 | .flags = IORESOURCE_MEM | ||
176 | }, | ||
177 | { | ||
178 | .start = JAZZ_ETHERNET_IRQ, | ||
179 | .end = JAZZ_ETHERNET_IRQ, | ||
180 | .flags = IORESOURCE_IRQ | ||
181 | } | ||
182 | }; | ||
183 | |||
184 | static struct platform_device jazz_sonic_pdev = { | ||
185 | .name = "jazzsonic", | ||
186 | .num_resources = ARRAY_SIZE(jazz_sonic_rsrc), | ||
187 | .resource = jazz_sonic_rsrc | ||
188 | }; | ||
189 | |||
190 | static struct resource jazz_cmos_rsrc[] = { | ||
191 | { | ||
192 | .start = 0x70, | ||
193 | .end = 0x71, | ||
194 | .flags = IORESOURCE_IO | ||
195 | }, | ||
196 | { | ||
197 | .start = 8, | ||
198 | .end = 8, | ||
199 | .flags = IORESOURCE_IRQ | ||
200 | } | ||
201 | }; | ||
202 | |||
203 | static struct platform_device jazz_cmos_pdev = { | ||
204 | .name = "rtc_cmos", | ||
205 | .num_resources = ARRAY_SIZE(jazz_cmos_rsrc), | ||
206 | .resource = jazz_cmos_rsrc | ||
207 | }; | ||
208 | |||
209 | static int __init jazz_setup_devinit(void) | ||
210 | { | ||
211 | platform_device_register(&jazz_serial8250_device); | ||
212 | platform_device_register(&jazz_esp_pdev); | ||
213 | platform_device_register(&jazz_sonic_pdev); | ||
214 | platform_device_register(&jazz_cmos_pdev); | ||
215 | return 0; | ||
216 | } | ||
217 | |||
218 | device_initcall(jazz_setup_devinit); | ||