diff options
Diffstat (limited to 'arch/mips/alchemy/devboards')
-rw-r--r-- | arch/mips/alchemy/devboards/Makefile | 2 | ||||
-rw-r--r-- | arch/mips/alchemy/devboards/bcsr.c | 76 | ||||
-rw-r--r-- | arch/mips/alchemy/devboards/db1x00/board_setup.c | 62 | ||||
-rw-r--r-- | arch/mips/alchemy/devboards/pb1100/board_setup.c | 7 | ||||
-rw-r--r-- | arch/mips/alchemy/devboards/pb1200/board_setup.c | 49 | ||||
-rw-r--r-- | arch/mips/alchemy/devboards/pb1200/irqmap.c | 42 | ||||
-rw-r--r-- | arch/mips/alchemy/devboards/pb1200/platform.c | 25 | ||||
-rw-r--r-- | arch/mips/alchemy/devboards/pb1500/board_setup.c | 7 | ||||
-rw-r--r-- | arch/mips/alchemy/devboards/pb1550/board_setup.c | 11 |
9 files changed, 190 insertions, 91 deletions
diff --git a/arch/mips/alchemy/devboards/Makefile b/arch/mips/alchemy/devboards/Makefile index 730f9f2b30e8..adc6717d7688 100644 --- a/arch/mips/alchemy/devboards/Makefile +++ b/arch/mips/alchemy/devboards/Makefile | |||
@@ -2,7 +2,7 @@ | |||
2 | # Alchemy Develboards | 2 | # Alchemy Develboards |
3 | # | 3 | # |
4 | 4 | ||
5 | obj-y += prom.o | 5 | obj-y += prom.o bcsr.o |
6 | obj-$(CONFIG_PM) += pm.o | 6 | obj-$(CONFIG_PM) += pm.o |
7 | obj-$(CONFIG_MIPS_PB1000) += pb1000/ | 7 | obj-$(CONFIG_MIPS_PB1000) += pb1000/ |
8 | obj-$(CONFIG_MIPS_PB1100) += pb1100/ | 8 | obj-$(CONFIG_MIPS_PB1100) += pb1100/ |
diff --git a/arch/mips/alchemy/devboards/bcsr.c b/arch/mips/alchemy/devboards/bcsr.c new file mode 100644 index 000000000000..85b7715901af --- /dev/null +++ b/arch/mips/alchemy/devboards/bcsr.c | |||
@@ -0,0 +1,76 @@ | |||
1 | /* | ||
2 | * bcsr.h -- Db1xxx/Pb1xxx Devboard CPLD registers ("BCSR") abstraction. | ||
3 | * | ||
4 | * All Alchemy development boards (except, of course, the weird PB1000) | ||
5 | * have a few registers in a CPLD with standardised layout; they mostly | ||
6 | * only differ in base address. | ||
7 | * All registers are 16bits wide with 32bit spacing. | ||
8 | */ | ||
9 | |||
10 | #include <linux/module.h> | ||
11 | #include <linux/spinlock.h> | ||
12 | #include <asm/addrspace.h> | ||
13 | #include <asm/io.h> | ||
14 | #include <asm/mach-db1x00/bcsr.h> | ||
15 | |||
16 | static struct bcsr_reg { | ||
17 | void __iomem *raddr; | ||
18 | spinlock_t lock; | ||
19 | } bcsr_regs[BCSR_CNT]; | ||
20 | |||
21 | void __init bcsr_init(unsigned long bcsr1_phys, unsigned long bcsr2_phys) | ||
22 | { | ||
23 | int i; | ||
24 | |||
25 | bcsr1_phys = KSEG1ADDR(CPHYSADDR(bcsr1_phys)); | ||
26 | bcsr2_phys = KSEG1ADDR(CPHYSADDR(bcsr2_phys)); | ||
27 | |||
28 | for (i = 0; i < BCSR_CNT; i++) { | ||
29 | if (i >= BCSR_HEXLEDS) | ||
30 | bcsr_regs[i].raddr = (void __iomem *)bcsr2_phys + | ||
31 | (0x04 * (i - BCSR_HEXLEDS)); | ||
32 | else | ||
33 | bcsr_regs[i].raddr = (void __iomem *)bcsr1_phys + | ||
34 | (0x04 * i); | ||
35 | |||
36 | spin_lock_init(&bcsr_regs[i].lock); | ||
37 | } | ||
38 | } | ||
39 | |||
40 | unsigned short bcsr_read(enum bcsr_id reg) | ||
41 | { | ||
42 | unsigned short r; | ||
43 | unsigned long flags; | ||
44 | |||
45 | spin_lock_irqsave(&bcsr_regs[reg].lock, flags); | ||
46 | r = __raw_readw(bcsr_regs[reg].raddr); | ||
47 | spin_unlock_irqrestore(&bcsr_regs[reg].lock, flags); | ||
48 | return r; | ||
49 | } | ||
50 | EXPORT_SYMBOL_GPL(bcsr_read); | ||
51 | |||
52 | void bcsr_write(enum bcsr_id reg, unsigned short val) | ||
53 | { | ||
54 | unsigned long flags; | ||
55 | |||
56 | spin_lock_irqsave(&bcsr_regs[reg].lock, flags); | ||
57 | __raw_writew(val, bcsr_regs[reg].raddr); | ||
58 | wmb(); | ||
59 | spin_unlock_irqrestore(&bcsr_regs[reg].lock, flags); | ||
60 | } | ||
61 | EXPORT_SYMBOL_GPL(bcsr_write); | ||
62 | |||
63 | void bcsr_mod(enum bcsr_id reg, unsigned short clr, unsigned short set) | ||
64 | { | ||
65 | unsigned short r; | ||
66 | unsigned long flags; | ||
67 | |||
68 | spin_lock_irqsave(&bcsr_regs[reg].lock, flags); | ||
69 | r = __raw_readw(bcsr_regs[reg].raddr); | ||
70 | r &= ~clr; | ||
71 | r |= set; | ||
72 | __raw_writew(r, bcsr_regs[reg].raddr); | ||
73 | wmb(); | ||
74 | spin_unlock_irqrestore(&bcsr_regs[reg].lock, flags); | ||
75 | } | ||
76 | EXPORT_SYMBOL_GPL(bcsr_mod); | ||
diff --git a/arch/mips/alchemy/devboards/db1x00/board_setup.c b/arch/mips/alchemy/devboards/db1x00/board_setup.c index de30d8ea7176..e713390c69e6 100644 --- a/arch/mips/alchemy/devboards/db1x00/board_setup.c +++ b/arch/mips/alchemy/devboards/db1x00/board_setup.c | |||
@@ -32,12 +32,10 @@ | |||
32 | 32 | ||
33 | #include <asm/mach-au1x00/au1000.h> | 33 | #include <asm/mach-au1x00/au1000.h> |
34 | #include <asm/mach-db1x00/db1x00.h> | 34 | #include <asm/mach-db1x00/db1x00.h> |
35 | #include <asm/mach-db1x00/bcsr.h> | ||
35 | 36 | ||
36 | #include <prom.h> | 37 | #include <prom.h> |
37 | 38 | ||
38 | |||
39 | static BCSR * const bcsr = (BCSR *)BCSR_KSEG1_ADDR; | ||
40 | |||
41 | const char *get_system_type(void) | 39 | const char *get_system_type(void) |
42 | { | 40 | { |
43 | #ifdef CONFIG_MIPS_BOSPORUS | 41 | #ifdef CONFIG_MIPS_BOSPORUS |
@@ -49,15 +47,43 @@ const char *get_system_type(void) | |||
49 | 47 | ||
50 | void board_reset(void) | 48 | void board_reset(void) |
51 | { | 49 | { |
52 | /* Hit BCSR.SW_RESET[RESET] */ | 50 | bcsr_write(BCSR_SYSTEM, 0); |
53 | bcsr->swreset = 0x0000; | ||
54 | } | 51 | } |
55 | 52 | ||
56 | void __init board_setup(void) | 53 | void __init board_setup(void) |
57 | { | 54 | { |
55 | unsigned long bcsr1, bcsr2; | ||
58 | u32 pin_func = 0; | 56 | u32 pin_func = 0; |
59 | char *argptr; | 57 | char *argptr; |
60 | 58 | ||
59 | bcsr1 = DB1000_BCSR_PHYS_ADDR; | ||
60 | bcsr2 = DB1000_BCSR_PHYS_ADDR + DB1000_BCSR_HEXLED_OFS; | ||
61 | |||
62 | #ifdef CONFIG_MIPS_DB1000 | ||
63 | printk(KERN_INFO "AMD Alchemy Au1000/Db1000 Board\n"); | ||
64 | #endif | ||
65 | #ifdef CONFIG_MIPS_DB1500 | ||
66 | printk(KERN_INFO "AMD Alchemy Au1500/Db1500 Board\n"); | ||
67 | #endif | ||
68 | #ifdef CONFIG_MIPS_DB1100 | ||
69 | printk(KERN_INFO "AMD Alchemy Au1100/Db1100 Board\n"); | ||
70 | #endif | ||
71 | #ifdef CONFIG_MIPS_BOSPORUS | ||
72 | printk(KERN_INFO "AMD Alchemy Bosporus Board\n"); | ||
73 | #endif | ||
74 | #ifdef CONFIG_MIPS_MIRAGE | ||
75 | printk(KERN_INFO "AMD Alchemy Mirage Board\n"); | ||
76 | #endif | ||
77 | #ifdef CONFIG_MIPS_DB1550 | ||
78 | printk(KERN_INFO "AMD Alchemy Au1550/Db1550 Board\n"); | ||
79 | |||
80 | bcsr1 = DB1550_BCSR_PHYS_ADDR; | ||
81 | bcsr2 = DB1550_BCSR_PHYS_ADDR + DB1550_BCSR_HEXLED_OFS; | ||
82 | #endif | ||
83 | |||
84 | /* initialize board register space */ | ||
85 | bcsr_init(bcsr1, bcsr2); | ||
86 | |||
61 | argptr = prom_getcmdline(); | 87 | argptr = prom_getcmdline(); |
62 | #ifdef CONFIG_SERIAL_8250_CONSOLE | 88 | #ifdef CONFIG_SERIAL_8250_CONSOLE |
63 | argptr = strstr(argptr, "console="); | 89 | argptr = strstr(argptr, "console="); |
@@ -89,11 +115,10 @@ void __init board_setup(void) | |||
89 | pin_func = au_readl(SYS_PINFUNC) | SYS_PF_IRF; | 115 | pin_func = au_readl(SYS_PINFUNC) | SYS_PF_IRF; |
90 | au_writel(pin_func, SYS_PINFUNC); | 116 | au_writel(pin_func, SYS_PINFUNC); |
91 | /* Power off until the driver is in use */ | 117 | /* Power off until the driver is in use */ |
92 | bcsr->resets &= ~BCSR_RESETS_IRDA_MODE_MASK; | 118 | bcsr_mod(BCSR_RESETS, BCSR_RESETS_IRDA_MODE_MASK, |
93 | bcsr->resets |= BCSR_RESETS_IRDA_MODE_OFF; | 119 | BCSR_RESETS_IRDA_MODE_OFF); |
94 | au_sync(); | ||
95 | #endif | 120 | #endif |
96 | bcsr->pcmcia = 0x0000; /* turn off PCMCIA power */ | 121 | bcsr_write(BCSR_PCMCIA, 0); /* turn off PCMCIA power */ |
97 | 122 | ||
98 | /* Enable GPIO[31:0] inputs */ | 123 | /* Enable GPIO[31:0] inputs */ |
99 | alchemy_gpio1_input_enable(); | 124 | alchemy_gpio1_input_enable(); |
@@ -123,23 +148,4 @@ void __init board_setup(void) | |||
123 | #endif | 148 | #endif |
124 | 149 | ||
125 | au_sync(); | 150 | au_sync(); |
126 | |||
127 | #ifdef CONFIG_MIPS_DB1000 | ||
128 | printk(KERN_INFO "AMD Alchemy Au1000/Db1000 Board\n"); | ||
129 | #endif | ||
130 | #ifdef CONFIG_MIPS_DB1500 | ||
131 | printk(KERN_INFO "AMD Alchemy Au1500/Db1500 Board\n"); | ||
132 | #endif | ||
133 | #ifdef CONFIG_MIPS_DB1100 | ||
134 | printk(KERN_INFO "AMD Alchemy Au1100/Db1100 Board\n"); | ||
135 | #endif | ||
136 | #ifdef CONFIG_MIPS_BOSPORUS | ||
137 | printk(KERN_INFO "AMD Alchemy Bosporus Board\n"); | ||
138 | #endif | ||
139 | #ifdef CONFIG_MIPS_MIRAGE | ||
140 | printk(KERN_INFO "AMD Alchemy Mirage Board\n"); | ||
141 | #endif | ||
142 | #ifdef CONFIG_MIPS_DB1550 | ||
143 | printk(KERN_INFO "AMD Alchemy Au1550/Db1550 Board\n"); | ||
144 | #endif | ||
145 | } | 151 | } |
diff --git a/arch/mips/alchemy/devboards/pb1100/board_setup.c b/arch/mips/alchemy/devboards/pb1100/board_setup.c index 61263081ef58..eb749fb9daa1 100644 --- a/arch/mips/alchemy/devboards/pb1100/board_setup.c +++ b/arch/mips/alchemy/devboards/pb1100/board_setup.c | |||
@@ -30,6 +30,7 @@ | |||
30 | 30 | ||
31 | #include <asm/mach-au1x00/au1000.h> | 31 | #include <asm/mach-au1x00/au1000.h> |
32 | #include <asm/mach-pb1x00/pb1100.h> | 32 | #include <asm/mach-pb1x00/pb1100.h> |
33 | #include <asm/mach-db1x00/bcsr.h> | ||
33 | 34 | ||
34 | #include <prom.h> | 35 | #include <prom.h> |
35 | 36 | ||
@@ -49,8 +50,7 @@ const char *get_system_type(void) | |||
49 | 50 | ||
50 | void board_reset(void) | 51 | void board_reset(void) |
51 | { | 52 | { |
52 | /* Hit BCSR.RST_VDDI[SOFT_RESET] */ | 53 | bcsr_write(BCSR_SYSTEM, 0); |
53 | au_writel(0x00000000, PB1100_RST_VDDI); | ||
54 | } | 54 | } |
55 | 55 | ||
56 | void __init board_init_irq(void) | 56 | void __init board_init_irq(void) |
@@ -63,6 +63,9 @@ void __init board_setup(void) | |||
63 | volatile void __iomem *base = (volatile void __iomem *)0xac000000UL; | 63 | volatile void __iomem *base = (volatile void __iomem *)0xac000000UL; |
64 | char *argptr; | 64 | char *argptr; |
65 | 65 | ||
66 | bcsr_init(DB1000_BCSR_PHYS_ADDR, | ||
67 | DB1000_BCSR_PHYS_ADDR + DB1000_BCSR_HEXLED_OFS); | ||
68 | |||
66 | argptr = prom_getcmdline(); | 69 | argptr = prom_getcmdline(); |
67 | #ifdef CONFIG_SERIAL_8250_CONSOLE | 70 | #ifdef CONFIG_SERIAL_8250_CONSOLE |
68 | argptr = strstr(argptr, "console="); | 71 | argptr = strstr(argptr, "console="); |
diff --git a/arch/mips/alchemy/devboards/pb1200/board_setup.c b/arch/mips/alchemy/devboards/pb1200/board_setup.c index 94e6b7e7753d..db563800c31d 100644 --- a/arch/mips/alchemy/devboards/pb1200/board_setup.c +++ b/arch/mips/alchemy/devboards/pb1200/board_setup.c | |||
@@ -27,6 +27,8 @@ | |||
27 | #include <linux/init.h> | 27 | #include <linux/init.h> |
28 | #include <linux/sched.h> | 28 | #include <linux/sched.h> |
29 | 29 | ||
30 | #include <asm/mach-db1x00/bcsr.h> | ||
31 | |||
30 | #include <prom.h> | 32 | #include <prom.h> |
31 | #include <au1xxx.h> | 33 | #include <au1xxx.h> |
32 | 34 | ||
@@ -38,14 +40,25 @@ const char *get_system_type(void) | |||
38 | 40 | ||
39 | void board_reset(void) | 41 | void board_reset(void) |
40 | { | 42 | { |
41 | bcsr->resets = 0; | 43 | bcsr_write(BCSR_RESETS, 0); |
42 | bcsr->system = 0; | 44 | bcsr_write(BCSR_SYSTEM, 0); |
43 | } | 45 | } |
44 | 46 | ||
45 | void __init board_setup(void) | 47 | void __init board_setup(void) |
46 | { | 48 | { |
47 | char *argptr; | 49 | char *argptr; |
48 | 50 | ||
51 | #ifdef CONFIG_MIPS_PB1200 | ||
52 | printk(KERN_INFO "AMD Alchemy Pb1200 Board\n"); | ||
53 | bcsr_init(PB1200_BCSR_PHYS_ADDR, | ||
54 | PB1200_BCSR_PHYS_ADDR + PB1200_BCSR_HEXLED_OFS); | ||
55 | #endif | ||
56 | #ifdef CONFIG_MIPS_DB1200 | ||
57 | printk(KERN_INFO "AMD Alchemy Db1200 Board\n"); | ||
58 | bcsr_init(DB1200_BCSR_PHYS_ADDR, | ||
59 | DB1200_BCSR_PHYS_ADDR + DB1200_BCSR_HEXLED_OFS); | ||
60 | #endif | ||
61 | |||
49 | argptr = prom_getcmdline(); | 62 | argptr = prom_getcmdline(); |
50 | #ifdef CONFIG_SERIAL_8250_CONSOLE | 63 | #ifdef CONFIG_SERIAL_8250_CONSOLE |
51 | argptr = strstr(argptr, "console="); | 64 | argptr = strstr(argptr, "console="); |
@@ -82,7 +95,7 @@ void __init board_setup(void) | |||
82 | u32 pin_func; | 95 | u32 pin_func; |
83 | 96 | ||
84 | /* Select SMBus in CPLD */ | 97 | /* Select SMBus in CPLD */ |
85 | bcsr->resets &= ~BCSR_RESETS_PCS0MUX; | 98 | bcsr_mod(BCSR_RESETS, BCSR_RESETS_PSC0MUX, 0); |
86 | 99 | ||
87 | pin_func = au_readl(SYS_PINFUNC); | 100 | pin_func = au_readl(SYS_PINFUNC); |
88 | au_sync(); | 101 | au_sync(); |
@@ -116,38 +129,24 @@ void __init board_setup(void) | |||
116 | 129 | ||
117 | /* | 130 | /* |
118 | * The Pb1200 development board uses external MUX for PSC0 to | 131 | * The Pb1200 development board uses external MUX for PSC0 to |
119 | * support SMB/SPI. bcsr->resets bit 12: 0=SMB 1=SPI | 132 | * support SMB/SPI. bcsr_resets bit 12: 0=SMB 1=SPI |
120 | */ | 133 | */ |
121 | #ifdef CONFIG_I2C_AU1550 | 134 | #ifdef CONFIG_I2C_AU1550 |
122 | bcsr->resets &= ~BCSR_RESETS_PCS0MUX; | 135 | bcsr_mod(BCSR_RESETS, BCSR_RESETS_PSC0MUX, 0); |
123 | #endif | 136 | #endif |
124 | au_sync(); | 137 | au_sync(); |
125 | |||
126 | #ifdef CONFIG_MIPS_PB1200 | ||
127 | printk(KERN_INFO "AMD Alchemy Pb1200 Board\n"); | ||
128 | #endif | ||
129 | #ifdef CONFIG_MIPS_DB1200 | ||
130 | printk(KERN_INFO "AMD Alchemy Db1200 Board\n"); | ||
131 | #endif | ||
132 | } | 138 | } |
133 | 139 | ||
134 | int board_au1200fb_panel(void) | 140 | int board_au1200fb_panel(void) |
135 | { | 141 | { |
136 | BCSR *bcsr = (BCSR *)BCSR_KSEG1_ADDR; | 142 | return (bcsr_read(BCSR_SWITCHES) >> 8) & 0x0f; |
137 | int p; | ||
138 | |||
139 | p = bcsr->switches; | ||
140 | p >>= 8; | ||
141 | p &= 0x0F; | ||
142 | return p; | ||
143 | } | 143 | } |
144 | 144 | ||
145 | int board_au1200fb_panel_init(void) | 145 | int board_au1200fb_panel_init(void) |
146 | { | 146 | { |
147 | /* Apply power */ | 147 | /* Apply power */ |
148 | BCSR *bcsr = (BCSR *)BCSR_KSEG1_ADDR; | 148 | bcsr_mod(BCSR_BOARD, 0, BCSR_BOARD_LCDVEE | BCSR_BOARD_LCDVDD | |
149 | 149 | BCSR_BOARD_LCDBL); | |
150 | bcsr->board |= BCSR_BOARD_LCDVEE | BCSR_BOARD_LCDVDD | BCSR_BOARD_LCDBL; | ||
151 | /* printk(KERN_DEBUG "board_au1200fb_panel_init()\n"); */ | 150 | /* printk(KERN_DEBUG "board_au1200fb_panel_init()\n"); */ |
152 | return 0; | 151 | return 0; |
153 | } | 152 | } |
@@ -155,10 +154,8 @@ int board_au1200fb_panel_init(void) | |||
155 | int board_au1200fb_panel_shutdown(void) | 154 | int board_au1200fb_panel_shutdown(void) |
156 | { | 155 | { |
157 | /* Remove power */ | 156 | /* Remove power */ |
158 | BCSR *bcsr = (BCSR *)BCSR_KSEG1_ADDR; | 157 | bcsr_mod(BCSR_BOARD, BCSR_BOARD_LCDVEE | BCSR_BOARD_LCDVDD | |
159 | 158 | BCSR_BOARD_LCDBL, 0); | |
160 | bcsr->board &= ~(BCSR_BOARD_LCDVEE | BCSR_BOARD_LCDVDD | | ||
161 | BCSR_BOARD_LCDBL); | ||
162 | /* printk(KERN_DEBUG "board_au1200fb_panel_shutdown()\n"); */ | 159 | /* printk(KERN_DEBUG "board_au1200fb_panel_shutdown()\n"); */ |
163 | return 0; | 160 | return 0; |
164 | } | 161 | } |
diff --git a/arch/mips/alchemy/devboards/pb1200/irqmap.c b/arch/mips/alchemy/devboards/pb1200/irqmap.c index fe47498da280..f379b02213f1 100644 --- a/arch/mips/alchemy/devboards/pb1200/irqmap.c +++ b/arch/mips/alchemy/devboards/pb1200/irqmap.c | |||
@@ -38,11 +38,14 @@ | |||
38 | #define PB1200_INT_END DB1200_INT_END | 38 | #define PB1200_INT_END DB1200_INT_END |
39 | #endif | 39 | #endif |
40 | 40 | ||
41 | #include <asm/mach-db1x00/bcsr.h> | ||
42 | |||
41 | struct au1xxx_irqmap __initdata au1xxx_irq_map[] = { | 43 | struct au1xxx_irqmap __initdata au1xxx_irq_map[] = { |
42 | /* This is external interrupt cascade */ | 44 | /* This is external interrupt cascade */ |
43 | { AU1000_GPIO_7, IRQF_TRIGGER_LOW, 0 }, | 45 | { AU1000_GPIO_7, IRQF_TRIGGER_LOW, 0 }, |
44 | }; | 46 | }; |
45 | 47 | ||
48 | static void __iomem *bcsr_virt; | ||
46 | 49 | ||
47 | /* | 50 | /* |
48 | * Support for External interrupts on the Pb1200 Development platform. | 51 | * Support for External interrupts on the Pb1200 Development platform. |
@@ -50,7 +53,7 @@ struct au1xxx_irqmap __initdata au1xxx_irq_map[] = { | |||
50 | 53 | ||
51 | static void pb1200_cascade_handler(unsigned int irq, struct irq_desc *d) | 54 | static void pb1200_cascade_handler(unsigned int irq, struct irq_desc *d) |
52 | { | 55 | { |
53 | unsigned short bisr = bcsr->int_status; | 56 | unsigned short bisr = __raw_readw(bcsr_virt + BCSR_REG_INTSTAT); |
54 | 57 | ||
55 | for ( ; bisr; bisr &= bisr - 1) | 58 | for ( ; bisr; bisr &= bisr - 1) |
56 | generic_handle_irq(PB1200_INT_BEGIN + __ffs(bisr)); | 59 | generic_handle_irq(PB1200_INT_BEGIN + __ffs(bisr)); |
@@ -61,24 +64,27 @@ static void pb1200_cascade_handler(unsigned int irq, struct irq_desc *d) | |||
61 | */ | 64 | */ |
62 | static void pb1200_mask_irq(unsigned int irq_nr) | 65 | static void pb1200_mask_irq(unsigned int irq_nr) |
63 | { | 66 | { |
64 | bcsr->intclr_mask = 1 << (irq_nr - PB1200_INT_BEGIN); | 67 | unsigned short v = 1 << (irq_nr - PB1200_INT_BEGIN); |
65 | bcsr->intclr = 1 << (irq_nr - PB1200_INT_BEGIN); | 68 | __raw_writew(v, bcsr_virt + BCSR_REG_INTCLR); |
66 | au_sync(); | 69 | __raw_writew(v, bcsr_virt + BCSR_REG_MASKCLR); |
70 | wmb(); | ||
67 | } | 71 | } |
68 | 72 | ||
69 | static void pb1200_maskack_irq(unsigned int irq_nr) | 73 | static void pb1200_maskack_irq(unsigned int irq_nr) |
70 | { | 74 | { |
71 | bcsr->intclr_mask = 1 << (irq_nr - PB1200_INT_BEGIN); | 75 | unsigned short v = 1 << (irq_nr - PB1200_INT_BEGIN); |
72 | bcsr->intclr = 1 << (irq_nr - PB1200_INT_BEGIN); | 76 | __raw_writew(v, bcsr_virt + BCSR_REG_INTCLR); |
73 | bcsr->int_status = 1 << (irq_nr - PB1200_INT_BEGIN); /* ack */ | 77 | __raw_writew(v, bcsr_virt + BCSR_REG_MASKCLR); |
74 | au_sync(); | 78 | __raw_writew(v, bcsr_virt + BCSR_REG_INTSTAT); /* ack */ |
79 | wmb(); | ||
75 | } | 80 | } |
76 | 81 | ||
77 | static void pb1200_unmask_irq(unsigned int irq_nr) | 82 | static void pb1200_unmask_irq(unsigned int irq_nr) |
78 | { | 83 | { |
79 | bcsr->intset = 1 << (irq_nr - PB1200_INT_BEGIN); | 84 | unsigned short v = 1 << (irq_nr - PB1200_INT_BEGIN); |
80 | bcsr->intset_mask = 1 << (irq_nr - PB1200_INT_BEGIN); | 85 | __raw_writew(v, bcsr_virt + BCSR_REG_INTSET); |
81 | au_sync(); | 86 | __raw_writew(v, bcsr_virt + BCSR_REG_MASKSET); |
87 | wmb(); | ||
82 | } | 88 | } |
83 | 89 | ||
84 | static struct irq_chip pb1200_cpld_irq_type = { | 90 | static struct irq_chip pb1200_cpld_irq_type = { |
@@ -100,8 +106,10 @@ void __init board_init_irq(void) | |||
100 | au1xxx_setup_irqmap(au1xxx_irq_map, ARRAY_SIZE(au1xxx_irq_map)); | 106 | au1xxx_setup_irqmap(au1xxx_irq_map, ARRAY_SIZE(au1xxx_irq_map)); |
101 | 107 | ||
102 | #ifdef CONFIG_MIPS_PB1200 | 108 | #ifdef CONFIG_MIPS_PB1200 |
109 | bcsr_virt = (void __iomem *)KSEG1ADDR(PB1200_BCSR_PHYS_ADDR); | ||
110 | |||
103 | /* We have a problem with CPLD rev 3. */ | 111 | /* We have a problem with CPLD rev 3. */ |
104 | if (((bcsr->whoami & BCSR_WHOAMI_CPLD) >> 4) <= 3) { | 112 | if (BCSR_WHOAMI_CPLD(bcsr_read(BCSR_WHOAMI)) <= 3) { |
105 | printk(KERN_ERR "WARNING!!!\n"); | 113 | printk(KERN_ERR "WARNING!!!\n"); |
106 | printk(KERN_ERR "WARNING!!!\n"); | 114 | printk(KERN_ERR "WARNING!!!\n"); |
107 | printk(KERN_ERR "WARNING!!!\n"); | 115 | printk(KERN_ERR "WARNING!!!\n"); |
@@ -119,12 +127,14 @@ void __init board_init_irq(void) | |||
119 | printk(KERN_ERR "WARNING!!!\n"); | 127 | printk(KERN_ERR "WARNING!!!\n"); |
120 | panic("Game over. Your score is 0."); | 128 | panic("Game over. Your score is 0."); |
121 | } | 129 | } |
130 | #else | ||
131 | bcsr_virt = (void __iomem *)KSEG1ADDR(DB1200_BCSR_PHYS_ADDR); | ||
122 | #endif | 132 | #endif |
133 | |||
123 | /* mask & disable & ack all */ | 134 | /* mask & disable & ack all */ |
124 | bcsr->intclr_mask = 0xffff; | 135 | bcsr_write(BCSR_INTCLR, 0xffff); |
125 | bcsr->intclr = 0xffff; | 136 | bcsr_write(BCSR_MASKCLR, 0xffff); |
126 | bcsr->int_status = 0xffff; | 137 | bcsr_write(BCSR_INTSTAT, 0xffff); |
127 | au_sync(); | ||
128 | 138 | ||
129 | for (irq = PB1200_INT_BEGIN; irq <= PB1200_INT_END; irq++) | 139 | for (irq = PB1200_INT_BEGIN; irq <= PB1200_INT_END; irq++) |
130 | set_irq_chip_and_handler_name(irq, &pb1200_cpld_irq_type, | 140 | set_irq_chip_and_handler_name(irq, &pb1200_cpld_irq_type, |
diff --git a/arch/mips/alchemy/devboards/pb1200/platform.c b/arch/mips/alchemy/devboards/pb1200/platform.c index b93dff4a6789..dfdaabf77909 100644 --- a/arch/mips/alchemy/devboards/pb1200/platform.c +++ b/arch/mips/alchemy/devboards/pb1200/platform.c | |||
@@ -26,27 +26,28 @@ | |||
26 | 26 | ||
27 | #include <asm/mach-au1x00/au1xxx.h> | 27 | #include <asm/mach-au1x00/au1xxx.h> |
28 | #include <asm/mach-au1x00/au1100_mmc.h> | 28 | #include <asm/mach-au1x00/au1100_mmc.h> |
29 | #include <asm/mach-db1x00/bcsr.h> | ||
29 | 30 | ||
30 | static int mmc_activity; | 31 | static int mmc_activity; |
31 | 32 | ||
32 | static void pb1200mmc0_set_power(void *mmc_host, int state) | 33 | static void pb1200mmc0_set_power(void *mmc_host, int state) |
33 | { | 34 | { |
34 | if (state) | 35 | if (state) |
35 | bcsr->board |= BCSR_BOARD_SD0PWR; | 36 | bcsr_mod(BCSR_BOARD, 0, BCSR_BOARD_SD0PWR); |
36 | else | 37 | else |
37 | bcsr->board &= ~BCSR_BOARD_SD0PWR; | 38 | bcsr_mod(BCSR_BOARD, BCSR_BOARD_SD0PWR, 0); |
38 | 39 | ||
39 | au_sync_delay(1); | 40 | msleep(1); |
40 | } | 41 | } |
41 | 42 | ||
42 | static int pb1200mmc0_card_readonly(void *mmc_host) | 43 | static int pb1200mmc0_card_readonly(void *mmc_host) |
43 | { | 44 | { |
44 | return (bcsr->status & BCSR_STATUS_SD0WP) ? 1 : 0; | 45 | return (bcsr_read(BCSR_STATUS) & BCSR_STATUS_SD0WP) ? 1 : 0; |
45 | } | 46 | } |
46 | 47 | ||
47 | static int pb1200mmc0_card_inserted(void *mmc_host) | 48 | static int pb1200mmc0_card_inserted(void *mmc_host) |
48 | { | 49 | { |
49 | return (bcsr->sig_status & BCSR_INT_SD0INSERT) ? 1 : 0; | 50 | return (bcsr_read(BCSR_SIGSTAT) & BCSR_INT_SD0INSERT) ? 1 : 0; |
50 | } | 51 | } |
51 | 52 | ||
52 | static void pb1200_mmcled_set(struct led_classdev *led, | 53 | static void pb1200_mmcled_set(struct led_classdev *led, |
@@ -54,10 +55,10 @@ static void pb1200_mmcled_set(struct led_classdev *led, | |||
54 | { | 55 | { |
55 | if (brightness != LED_OFF) { | 56 | if (brightness != LED_OFF) { |
56 | if (++mmc_activity == 1) | 57 | if (++mmc_activity == 1) |
57 | bcsr->disk_leds &= ~(1 << 8); | 58 | bcsr_mod(BCSR_LEDS, BCSR_LEDS_LED0, 0); |
58 | } else { | 59 | } else { |
59 | if (--mmc_activity == 0) | 60 | if (--mmc_activity == 0) |
60 | bcsr->disk_leds |= (1 << 8); | 61 | bcsr_mod(BCSR_LEDS, 0, BCSR_LEDS_LED0); |
61 | } | 62 | } |
62 | } | 63 | } |
63 | 64 | ||
@@ -69,21 +70,21 @@ static struct led_classdev pb1200mmc_led = { | |||
69 | static void pb1200mmc1_set_power(void *mmc_host, int state) | 70 | static void pb1200mmc1_set_power(void *mmc_host, int state) |
70 | { | 71 | { |
71 | if (state) | 72 | if (state) |
72 | bcsr->board |= BCSR_BOARD_SD1PWR; | 73 | bcsr_mod(BCSR_BOARD, 0, BCSR_BOARD_SD1PWR); |
73 | else | 74 | else |
74 | bcsr->board &= ~BCSR_BOARD_SD1PWR; | 75 | bcsr_mod(BCSR_BOARD, BCSR_BOARD_SD1PWR, 0); |
75 | 76 | ||
76 | au_sync_delay(1); | 77 | msleep(1); |
77 | } | 78 | } |
78 | 79 | ||
79 | static int pb1200mmc1_card_readonly(void *mmc_host) | 80 | static int pb1200mmc1_card_readonly(void *mmc_host) |
80 | { | 81 | { |
81 | return (bcsr->status & BCSR_STATUS_SD1WP) ? 1 : 0; | 82 | return (bcsr_read(BCSR_STATUS) & BCSR_STATUS_SD1WP) ? 1 : 0; |
82 | } | 83 | } |
83 | 84 | ||
84 | static int pb1200mmc1_card_inserted(void *mmc_host) | 85 | static int pb1200mmc1_card_inserted(void *mmc_host) |
85 | { | 86 | { |
86 | return (bcsr->sig_status & BCSR_INT_SD1INSERT) ? 1 : 0; | 87 | return (bcsr_read(BCSR_SIGSTAT) & BCSR_INT_SD1INSERT) ? 1 : 0; |
87 | } | 88 | } |
88 | #endif | 89 | #endif |
89 | 90 | ||
diff --git a/arch/mips/alchemy/devboards/pb1500/board_setup.c b/arch/mips/alchemy/devboards/pb1500/board_setup.c index d7a56569e7ed..c5389e5afb93 100644 --- a/arch/mips/alchemy/devboards/pb1500/board_setup.c +++ b/arch/mips/alchemy/devboards/pb1500/board_setup.c | |||
@@ -30,6 +30,7 @@ | |||
30 | 30 | ||
31 | #include <asm/mach-au1x00/au1000.h> | 31 | #include <asm/mach-au1x00/au1000.h> |
32 | #include <asm/mach-pb1x00/pb1500.h> | 32 | #include <asm/mach-pb1x00/pb1500.h> |
33 | #include <asm/mach-db1x00/bcsr.h> | ||
33 | 34 | ||
34 | #include <prom.h> | 35 | #include <prom.h> |
35 | 36 | ||
@@ -55,8 +56,7 @@ const char *get_system_type(void) | |||
55 | 56 | ||
56 | void board_reset(void) | 57 | void board_reset(void) |
57 | { | 58 | { |
58 | /* Hit BCSR.RST_VDDI[SOFT_RESET] */ | 59 | bcsr_write(BCSR_SYSTEM, 0); |
59 | au_writel(0x00000000, PB1500_RST_VDDI); | ||
60 | } | 60 | } |
61 | 61 | ||
62 | void __init board_init_irq(void) | 62 | void __init board_init_irq(void) |
@@ -70,6 +70,9 @@ void __init board_setup(void) | |||
70 | u32 sys_freqctrl, sys_clksrc; | 70 | u32 sys_freqctrl, sys_clksrc; |
71 | char *argptr; | 71 | char *argptr; |
72 | 72 | ||
73 | bcsr_init(DB1000_BCSR_PHYS_ADDR, | ||
74 | DB1000_BCSR_PHYS_ADDR + DB1000_BCSR_HEXLED_OFS); | ||
75 | |||
73 | argptr = prom_getcmdline(); | 76 | argptr = prom_getcmdline(); |
74 | #ifdef CONFIG_SERIAL_8250_CONSOLE | 77 | #ifdef CONFIG_SERIAL_8250_CONSOLE |
75 | argptr = strstr(argptr, "console="); | 78 | argptr = strstr(argptr, "console="); |
diff --git a/arch/mips/alchemy/devboards/pb1550/board_setup.c b/arch/mips/alchemy/devboards/pb1550/board_setup.c index b6e9e7d247a3..af7a1b5fe7c7 100644 --- a/arch/mips/alchemy/devboards/pb1550/board_setup.c +++ b/arch/mips/alchemy/devboards/pb1550/board_setup.c | |||
@@ -32,6 +32,7 @@ | |||
32 | 32 | ||
33 | #include <asm/mach-au1x00/au1000.h> | 33 | #include <asm/mach-au1x00/au1000.h> |
34 | #include <asm/mach-pb1x00/pb1550.h> | 34 | #include <asm/mach-pb1x00/pb1550.h> |
35 | #include <asm/mach-db1x00/bcsr.h> | ||
35 | 36 | ||
36 | #include <prom.h> | 37 | #include <prom.h> |
37 | 38 | ||
@@ -53,8 +54,7 @@ const char *get_system_type(void) | |||
53 | 54 | ||
54 | void board_reset(void) | 55 | void board_reset(void) |
55 | { | 56 | { |
56 | /* Hit BCSR.SYSTEM[RESET] */ | 57 | bcsr_write(BCSR_SYSTEM, 0); |
57 | au_writew(au_readw(0xAF00001C) & ~BCSR_SYSTEM_RESET, 0xAF00001C); | ||
58 | } | 58 | } |
59 | 59 | ||
60 | void __init board_init_irq(void) | 60 | void __init board_init_irq(void) |
@@ -66,6 +66,10 @@ void __init board_setup(void) | |||
66 | { | 66 | { |
67 | u32 pin_func; | 67 | u32 pin_func; |
68 | 68 | ||
69 | bcsr_init(PB1550_BCSR_PHYS_ADDR, | ||
70 | PB1550_BCSR_PHYS_ADDR + PB1550_BCSR_HEXLED_OFS); | ||
71 | |||
72 | |||
69 | #ifdef CONFIG_SERIAL_8250_CONSOLE | 73 | #ifdef CONFIG_SERIAL_8250_CONSOLE |
70 | char *argptr; | 74 | char *argptr; |
71 | argptr = prom_getcmdline(); | 75 | argptr = prom_getcmdline(); |
@@ -85,8 +89,7 @@ void __init board_setup(void) | |||
85 | pin_func |= SYS_PF_MUST_BE_SET | SYS_PF_PSC1_S1; | 89 | pin_func |= SYS_PF_MUST_BE_SET | SYS_PF_PSC1_S1; |
86 | au_writel(pin_func, SYS_PINFUNC); | 90 | au_writel(pin_func, SYS_PINFUNC); |
87 | 91 | ||
88 | au_writel(0, (u32)bcsr | 0x10); /* turn off PCMCIA power */ | 92 | bcsr_write(BCSR_PCMCIA, 0); /* turn off PCMCIA power */ |
89 | au_sync(); | ||
90 | 93 | ||
91 | printk(KERN_INFO "AMD Alchemy Pb1550 Board\n"); | 94 | printk(KERN_INFO "AMD Alchemy Pb1550 Board\n"); |
92 | } | 95 | } |