diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-22 10:38:37 -0500 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-22 10:38:37 -0500 |
commit | fcc9d2e5a6c89d22b8b773a64fb4ad21ac318446 (patch) | |
tree | a57612d1888735a2ec7972891b68c1ac5ec8faea /arch/mips | |
parent | 8dea78da5cee153b8af9c07a2745f6c55057fe12 (diff) |
Diffstat (limited to 'arch/mips')
153 files changed, 16270 insertions, 0 deletions
diff --git a/arch/mips/alchemy/common/gpiolib-au1000.c b/arch/mips/alchemy/common/gpiolib-au1000.c new file mode 100644 index 00000000000..c8e1a94d4a9 --- /dev/null +++ b/arch/mips/alchemy/common/gpiolib-au1000.c | |||
@@ -0,0 +1,126 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2007-2009, OpenWrt.org, Florian Fainelli <florian@openwrt.org> | ||
3 | * GPIOLIB support for Au1000, Au1500, Au1100, Au1550 and Au12x0. | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms of the GNU General Public License as published by the | ||
7 | * Free Software Foundation; either version 2 of the License, or (at your | ||
8 | * option) any later version. | ||
9 | * | ||
10 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
11 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
12 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
13 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
14 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
15 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
16 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
17 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
18 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
19 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
20 | * | ||
21 | * You should have received a copy of the GNU General Public License along | ||
22 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
23 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
24 | * | ||
25 | * Notes : | ||
26 | * au1000 SoC have only one GPIO block : GPIO1 | ||
27 | * Au1100, Au15x0, Au12x0 have a second one : GPIO2 | ||
28 | */ | ||
29 | |||
30 | #include <linux/kernel.h> | ||
31 | #include <linux/module.h> | ||
32 | #include <linux/types.h> | ||
33 | #include <linux/platform_device.h> | ||
34 | #include <linux/gpio.h> | ||
35 | |||
36 | #include <asm/mach-au1x00/au1000.h> | ||
37 | #include <asm/mach-au1x00/gpio.h> | ||
38 | |||
39 | static int gpio2_get(struct gpio_chip *chip, unsigned offset) | ||
40 | { | ||
41 | return alchemy_gpio2_get_value(offset + ALCHEMY_GPIO2_BASE); | ||
42 | } | ||
43 | |||
44 | static void gpio2_set(struct gpio_chip *chip, unsigned offset, int value) | ||
45 | { | ||
46 | alchemy_gpio2_set_value(offset + ALCHEMY_GPIO2_BASE, value); | ||
47 | } | ||
48 | |||
49 | static int gpio2_direction_input(struct gpio_chip *chip, unsigned offset) | ||
50 | { | ||
51 | return alchemy_gpio2_direction_input(offset + ALCHEMY_GPIO2_BASE); | ||
52 | } | ||
53 | |||
54 | static int gpio2_direction_output(struct gpio_chip *chip, unsigned offset, | ||
55 | int value) | ||
56 | { | ||
57 | return alchemy_gpio2_direction_output(offset + ALCHEMY_GPIO2_BASE, | ||
58 | value); | ||
59 | } | ||
60 | |||
61 | static int gpio2_to_irq(struct gpio_chip *chip, unsigned offset) | ||
62 | { | ||
63 | return alchemy_gpio2_to_irq(offset + ALCHEMY_GPIO2_BASE); | ||
64 | } | ||
65 | |||
66 | |||
67 | static int gpio1_get(struct gpio_chip *chip, unsigned offset) | ||
68 | { | ||
69 | return alchemy_gpio1_get_value(offset + ALCHEMY_GPIO1_BASE); | ||
70 | } | ||
71 | |||
72 | static void gpio1_set(struct gpio_chip *chip, | ||
73 | unsigned offset, int value) | ||
74 | { | ||
75 | alchemy_gpio1_set_value(offset + ALCHEMY_GPIO1_BASE, value); | ||
76 | } | ||
77 | |||
78 | static int gpio1_direction_input(struct gpio_chip *chip, unsigned offset) | ||
79 | { | ||
80 | return alchemy_gpio1_direction_input(offset + ALCHEMY_GPIO1_BASE); | ||
81 | } | ||
82 | |||
83 | static int gpio1_direction_output(struct gpio_chip *chip, | ||
84 | unsigned offset, int value) | ||
85 | { | ||
86 | return alchemy_gpio1_direction_output(offset + ALCHEMY_GPIO1_BASE, | ||
87 | value); | ||
88 | } | ||
89 | |||
90 | static int gpio1_to_irq(struct gpio_chip *chip, unsigned offset) | ||
91 | { | ||
92 | return alchemy_gpio1_to_irq(offset + ALCHEMY_GPIO1_BASE); | ||
93 | } | ||
94 | |||
95 | struct gpio_chip alchemy_gpio_chip[] = { | ||
96 | [0] = { | ||
97 | .label = "alchemy-gpio1", | ||
98 | .direction_input = gpio1_direction_input, | ||
99 | .direction_output = gpio1_direction_output, | ||
100 | .get = gpio1_get, | ||
101 | .set = gpio1_set, | ||
102 | .to_irq = gpio1_to_irq, | ||
103 | .base = ALCHEMY_GPIO1_BASE, | ||
104 | .ngpio = ALCHEMY_GPIO1_NUM, | ||
105 | }, | ||
106 | [1] = { | ||
107 | .label = "alchemy-gpio2", | ||
108 | .direction_input = gpio2_direction_input, | ||
109 | .direction_output = gpio2_direction_output, | ||
110 | .get = gpio2_get, | ||
111 | .set = gpio2_set, | ||
112 | .to_irq = gpio2_to_irq, | ||
113 | .base = ALCHEMY_GPIO2_BASE, | ||
114 | .ngpio = ALCHEMY_GPIO2_NUM, | ||
115 | }, | ||
116 | }; | ||
117 | |||
118 | static int __init alchemy_gpiolib_init(void) | ||
119 | { | ||
120 | gpiochip_add(&alchemy_gpio_chip[0]); | ||
121 | if (alchemy_get_cputype() != ALCHEMY_CPU_AU1000) | ||
122 | gpiochip_add(&alchemy_gpio_chip[1]); | ||
123 | |||
124 | return 0; | ||
125 | } | ||
126 | arch_initcall(alchemy_gpiolib_init); | ||
diff --git a/arch/mips/alchemy/common/pci.c b/arch/mips/alchemy/common/pci.c new file mode 100644 index 00000000000..7866cf50cf9 --- /dev/null +++ b/arch/mips/alchemy/common/pci.c | |||
@@ -0,0 +1,104 @@ | |||
1 | /* | ||
2 | * BRIEF MODULE DESCRIPTION | ||
3 | * Alchemy/AMD Au1x00 PCI support. | ||
4 | * | ||
5 | * Copyright 2001-2003, 2007-2008 MontaVista Software Inc. | ||
6 | * Author: MontaVista Software, Inc. <source@mvista.com> | ||
7 | * | ||
8 | * Copyright (C) 2004 by Ralf Baechle (ralf@linux-mips.org) | ||
9 | * | ||
10 | * Support for all devices (greater than 16) added by David Gathright. | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or modify it | ||
13 | * under the terms of the GNU General Public License as published by the | ||
14 | * Free Software Foundation; either version 2 of the License, or (at your | ||
15 | * option) any later version. | ||
16 | * | ||
17 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
18 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
19 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
20 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
21 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
22 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
23 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
24 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
25 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
26 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
27 | * | ||
28 | * You should have received a copy of the GNU General Public License along | ||
29 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
30 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
31 | */ | ||
32 | |||
33 | #include <linux/pci.h> | ||
34 | #include <linux/kernel.h> | ||
35 | #include <linux/init.h> | ||
36 | |||
37 | #include <asm/mach-au1x00/au1000.h> | ||
38 | |||
39 | /* TBD */ | ||
40 | static struct resource pci_io_resource = { | ||
41 | .start = PCI_IO_START, | ||
42 | .end = PCI_IO_END, | ||
43 | .name = "PCI IO space", | ||
44 | .flags = IORESOURCE_IO | ||
45 | }; | ||
46 | |||
47 | static struct resource pci_mem_resource = { | ||
48 | .start = PCI_MEM_START, | ||
49 | .end = PCI_MEM_END, | ||
50 | .name = "PCI memory space", | ||
51 | .flags = IORESOURCE_MEM | ||
52 | }; | ||
53 | |||
54 | extern struct pci_ops au1x_pci_ops; | ||
55 | |||
56 | static struct pci_controller au1x_controller = { | ||
57 | .pci_ops = &au1x_pci_ops, | ||
58 | .io_resource = &pci_io_resource, | ||
59 | .mem_resource = &pci_mem_resource, | ||
60 | }; | ||
61 | |||
62 | #if defined(CONFIG_SOC_AU1500) || defined(CONFIG_SOC_AU1550) | ||
63 | static unsigned long virt_io_addr; | ||
64 | #endif | ||
65 | |||
66 | static int __init au1x_pci_setup(void) | ||
67 | { | ||
68 | extern void au1x_pci_cfg_init(void); | ||
69 | |||
70 | #if defined(CONFIG_SOC_AU1500) || defined(CONFIG_SOC_AU1550) | ||
71 | virt_io_addr = (unsigned long)ioremap(Au1500_PCI_IO_START, | ||
72 | Au1500_PCI_IO_END - Au1500_PCI_IO_START + 1); | ||
73 | |||
74 | if (!virt_io_addr) { | ||
75 | printk(KERN_ERR "Unable to ioremap pci space\n"); | ||
76 | return 1; | ||
77 | } | ||
78 | au1x_controller.io_map_base = virt_io_addr; | ||
79 | |||
80 | #ifdef CONFIG_DMA_NONCOHERENT | ||
81 | { | ||
82 | /* | ||
83 | * Set the NC bit in controller for Au1500 pre-AC silicon | ||
84 | */ | ||
85 | u32 prid = read_c0_prid(); | ||
86 | |||
87 | if ((prid & 0xFF000000) == 0x01000000 && prid < 0x01030202) { | ||
88 | au_writel((1 << 16) | au_readl(Au1500_PCI_CFG), | ||
89 | Au1500_PCI_CFG); | ||
90 | printk(KERN_INFO "Non-coherent PCI accesses enabled\n"); | ||
91 | } | ||
92 | } | ||
93 | #endif | ||
94 | |||
95 | set_io_port_base(virt_io_addr); | ||
96 | #endif | ||
97 | |||
98 | au1x_pci_cfg_init(); | ||
99 | |||
100 | register_pci_controller(&au1x_controller); | ||
101 | return 0; | ||
102 | } | ||
103 | |||
104 | arch_initcall(au1x_pci_setup); | ||
diff --git a/arch/mips/alchemy/devboards/db1200/Makefile b/arch/mips/alchemy/devboards/db1200/Makefile new file mode 100644 index 00000000000..17840a5e273 --- /dev/null +++ b/arch/mips/alchemy/devboards/db1200/Makefile | |||
@@ -0,0 +1 @@ | |||
obj-y += setup.o platform.o | |||
diff --git a/arch/mips/alchemy/devboards/db1200/platform.c b/arch/mips/alchemy/devboards/db1200/platform.c new file mode 100644 index 00000000000..fbb55935b99 --- /dev/null +++ b/arch/mips/alchemy/devboards/db1200/platform.c | |||
@@ -0,0 +1,567 @@ | |||
1 | /* | ||
2 | * DBAu1200 board platform device registration | ||
3 | * | ||
4 | * Copyright (C) 2008-2009 Manuel Lauss | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
19 | */ | ||
20 | |||
21 | #include <linux/dma-mapping.h> | ||
22 | #include <linux/gpio.h> | ||
23 | #include <linux/i2c.h> | ||
24 | #include <linux/init.h> | ||
25 | #include <linux/io.h> | ||
26 | #include <linux/leds.h> | ||
27 | #include <linux/mmc/host.h> | ||
28 | #include <linux/mtd/mtd.h> | ||
29 | #include <linux/mtd/nand.h> | ||
30 | #include <linux/mtd/partitions.h> | ||
31 | #include <linux/platform_device.h> | ||
32 | #include <linux/serial_8250.h> | ||
33 | #include <linux/spi/spi.h> | ||
34 | #include <linux/spi/flash.h> | ||
35 | #include <linux/smc91x.h> | ||
36 | |||
37 | #include <asm/mach-au1x00/au1100_mmc.h> | ||
38 | #include <asm/mach-au1x00/au1xxx_dbdma.h> | ||
39 | #include <asm/mach-au1x00/au1550_spi.h> | ||
40 | #include <asm/mach-db1x00/bcsr.h> | ||
41 | #include <asm/mach-db1x00/db1200.h> | ||
42 | |||
43 | #include "../platform.h" | ||
44 | |||
45 | static struct mtd_partition db1200_spiflash_parts[] = { | ||
46 | { | ||
47 | .name = "DB1200 SPI flash", | ||
48 | .offset = 0, | ||
49 | .size = MTDPART_SIZ_FULL, | ||
50 | }, | ||
51 | }; | ||
52 | |||
53 | static struct flash_platform_data db1200_spiflash_data = { | ||
54 | .name = "s25fl001", | ||
55 | .parts = db1200_spiflash_parts, | ||
56 | .nr_parts = ARRAY_SIZE(db1200_spiflash_parts), | ||
57 | .type = "m25p10", | ||
58 | }; | ||
59 | |||
60 | static struct spi_board_info db1200_spi_devs[] __initdata = { | ||
61 | { | ||
62 | /* TI TMP121AIDBVR temp sensor */ | ||
63 | .modalias = "tmp121", | ||
64 | .max_speed_hz = 2000000, | ||
65 | .bus_num = 0, | ||
66 | .chip_select = 0, | ||
67 | .mode = 0, | ||
68 | }, | ||
69 | { | ||
70 | /* Spansion S25FL001D0FMA SPI flash */ | ||
71 | .modalias = "m25p80", | ||
72 | .max_speed_hz = 50000000, | ||
73 | .bus_num = 0, | ||
74 | .chip_select = 1, | ||
75 | .mode = 0, | ||
76 | .platform_data = &db1200_spiflash_data, | ||
77 | }, | ||
78 | }; | ||
79 | |||
80 | static struct i2c_board_info db1200_i2c_devs[] __initdata = { | ||
81 | { | ||
82 | /* AT24C04-10 I2C eeprom */ | ||
83 | I2C_BOARD_INFO("24c04", 0x52), | ||
84 | }, | ||
85 | { | ||
86 | /* Philips NE1619 temp/voltage sensor (adm1025 drv) */ | ||
87 | I2C_BOARD_INFO("ne1619", 0x2d), | ||
88 | }, | ||
89 | { | ||
90 | /* I2S audio codec WM8731 */ | ||
91 | I2C_BOARD_INFO("wm8731", 0x1b), | ||
92 | }, | ||
93 | }; | ||
94 | |||
95 | /**********************************************************************/ | ||
96 | |||
97 | static void au1200_nand_cmd_ctrl(struct mtd_info *mtd, int cmd, | ||
98 | unsigned int ctrl) | ||
99 | { | ||
100 | struct nand_chip *this = mtd->priv; | ||
101 | unsigned long ioaddr = (unsigned long)this->IO_ADDR_W; | ||
102 | |||
103 | ioaddr &= 0xffffff00; | ||
104 | |||
105 | if (ctrl & NAND_CLE) { | ||
106 | ioaddr += MEM_STNAND_CMD; | ||
107 | } else if (ctrl & NAND_ALE) { | ||
108 | ioaddr += MEM_STNAND_ADDR; | ||
109 | } else { | ||
110 | /* assume we want to r/w real data by default */ | ||
111 | ioaddr += MEM_STNAND_DATA; | ||
112 | } | ||
113 | this->IO_ADDR_R = this->IO_ADDR_W = (void __iomem *)ioaddr; | ||
114 | if (cmd != NAND_CMD_NONE) { | ||
115 | __raw_writeb(cmd, this->IO_ADDR_W); | ||
116 | wmb(); | ||
117 | } | ||
118 | } | ||
119 | |||
120 | static int au1200_nand_device_ready(struct mtd_info *mtd) | ||
121 | { | ||
122 | return __raw_readl((void __iomem *)MEM_STSTAT) & 1; | ||
123 | } | ||
124 | |||
125 | static const char *db1200_part_probes[] = { "cmdlinepart", NULL }; | ||
126 | |||
127 | static struct mtd_partition db1200_nand_parts[] = { | ||
128 | { | ||
129 | .name = "NAND FS 0", | ||
130 | .offset = 0, | ||
131 | .size = 8 * 1024 * 1024, | ||
132 | }, | ||
133 | { | ||
134 | .name = "NAND FS 1", | ||
135 | .offset = MTDPART_OFS_APPEND, | ||
136 | .size = MTDPART_SIZ_FULL | ||
137 | }, | ||
138 | }; | ||
139 | |||
140 | struct platform_nand_data db1200_nand_platdata = { | ||
141 | .chip = { | ||
142 | .nr_chips = 1, | ||
143 | .chip_offset = 0, | ||
144 | .nr_partitions = ARRAY_SIZE(db1200_nand_parts), | ||
145 | .partitions = db1200_nand_parts, | ||
146 | .chip_delay = 20, | ||
147 | .part_probe_types = db1200_part_probes, | ||
148 | }, | ||
149 | .ctrl = { | ||
150 | .dev_ready = au1200_nand_device_ready, | ||
151 | .cmd_ctrl = au1200_nand_cmd_ctrl, | ||
152 | }, | ||
153 | }; | ||
154 | |||
155 | static struct resource db1200_nand_res[] = { | ||
156 | [0] = { | ||
157 | .start = DB1200_NAND_PHYS_ADDR, | ||
158 | .end = DB1200_NAND_PHYS_ADDR + 0xff, | ||
159 | .flags = IORESOURCE_MEM, | ||
160 | }, | ||
161 | }; | ||
162 | |||
163 | static struct platform_device db1200_nand_dev = { | ||
164 | .name = "gen_nand", | ||
165 | .num_resources = ARRAY_SIZE(db1200_nand_res), | ||
166 | .resource = db1200_nand_res, | ||
167 | .id = -1, | ||
168 | .dev = { | ||
169 | .platform_data = &db1200_nand_platdata, | ||
170 | } | ||
171 | }; | ||
172 | |||
173 | /**********************************************************************/ | ||
174 | |||
175 | static struct smc91x_platdata db1200_eth_data = { | ||
176 | .flags = SMC91X_NOWAIT | SMC91X_USE_16BIT, | ||
177 | .leda = RPC_LED_100_10, | ||
178 | .ledb = RPC_LED_TX_RX, | ||
179 | }; | ||
180 | |||
181 | static struct resource db1200_eth_res[] = { | ||
182 | [0] = { | ||
183 | .start = DB1200_ETH_PHYS_ADDR, | ||
184 | .end = DB1200_ETH_PHYS_ADDR + 0xf, | ||
185 | .flags = IORESOURCE_MEM, | ||
186 | }, | ||
187 | [1] = { | ||
188 | .start = DB1200_ETH_INT, | ||
189 | .end = DB1200_ETH_INT, | ||
190 | .flags = IORESOURCE_IRQ, | ||
191 | }, | ||
192 | }; | ||
193 | |||
194 | static struct platform_device db1200_eth_dev = { | ||
195 | .dev = { | ||
196 | .platform_data = &db1200_eth_data, | ||
197 | }, | ||
198 | .name = "smc91x", | ||
199 | .id = -1, | ||
200 | .num_resources = ARRAY_SIZE(db1200_eth_res), | ||
201 | .resource = db1200_eth_res, | ||
202 | }; | ||
203 | |||
204 | /**********************************************************************/ | ||
205 | |||
206 | static struct resource db1200_ide_res[] = { | ||
207 | [0] = { | ||
208 | .start = DB1200_IDE_PHYS_ADDR, | ||
209 | .end = DB1200_IDE_PHYS_ADDR + DB1200_IDE_PHYS_LEN - 1, | ||
210 | .flags = IORESOURCE_MEM, | ||
211 | }, | ||
212 | [1] = { | ||
213 | .start = DB1200_IDE_INT, | ||
214 | .end = DB1200_IDE_INT, | ||
215 | .flags = IORESOURCE_IRQ, | ||
216 | } | ||
217 | }; | ||
218 | |||
219 | static u64 ide_dmamask = DMA_BIT_MASK(32); | ||
220 | |||
221 | static struct platform_device db1200_ide_dev = { | ||
222 | .name = "au1200-ide", | ||
223 | .id = 0, | ||
224 | .dev = { | ||
225 | .dma_mask = &ide_dmamask, | ||
226 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
227 | }, | ||
228 | .num_resources = ARRAY_SIZE(db1200_ide_res), | ||
229 | .resource = db1200_ide_res, | ||
230 | }; | ||
231 | |||
232 | /**********************************************************************/ | ||
233 | |||
234 | static struct platform_device db1200_rtc_dev = { | ||
235 | .name = "rtc-au1xxx", | ||
236 | .id = -1, | ||
237 | }; | ||
238 | |||
239 | /**********************************************************************/ | ||
240 | |||
241 | /* SD carddetects: they're supposed to be edge-triggered, but ack | ||
242 | * doesn't seem to work (CPLD Rev 2). Instead, the screaming one | ||
243 | * is disabled and its counterpart enabled. The 500ms timeout is | ||
244 | * because the carddetect isn't debounced in hardware. | ||
245 | */ | ||
246 | static irqreturn_t db1200_mmc_cd(int irq, void *ptr) | ||
247 | { | ||
248 | void(*mmc_cd)(struct mmc_host *, unsigned long); | ||
249 | |||
250 | if (irq == DB1200_SD0_INSERT_INT) { | ||
251 | disable_irq_nosync(DB1200_SD0_INSERT_INT); | ||
252 | enable_irq(DB1200_SD0_EJECT_INT); | ||
253 | } else { | ||
254 | disable_irq_nosync(DB1200_SD0_EJECT_INT); | ||
255 | enable_irq(DB1200_SD0_INSERT_INT); | ||
256 | } | ||
257 | |||
258 | /* link against CONFIG_MMC=m */ | ||
259 | mmc_cd = symbol_get(mmc_detect_change); | ||
260 | if (mmc_cd) { | ||
261 | mmc_cd(ptr, msecs_to_jiffies(500)); | ||
262 | symbol_put(mmc_detect_change); | ||
263 | } | ||
264 | |||
265 | return IRQ_HANDLED; | ||
266 | } | ||
267 | |||
268 | static int db1200_mmc_cd_setup(void *mmc_host, int en) | ||
269 | { | ||
270 | int ret; | ||
271 | |||
272 | if (en) { | ||
273 | ret = request_irq(DB1200_SD0_INSERT_INT, db1200_mmc_cd, | ||
274 | IRQF_DISABLED, "sd_insert", mmc_host); | ||
275 | if (ret) | ||
276 | goto out; | ||
277 | |||
278 | ret = request_irq(DB1200_SD0_EJECT_INT, db1200_mmc_cd, | ||
279 | IRQF_DISABLED, "sd_eject", mmc_host); | ||
280 | if (ret) { | ||
281 | free_irq(DB1200_SD0_INSERT_INT, mmc_host); | ||
282 | goto out; | ||
283 | } | ||
284 | |||
285 | if (bcsr_read(BCSR_SIGSTAT) & BCSR_INT_SD0INSERT) | ||
286 | enable_irq(DB1200_SD0_EJECT_INT); | ||
287 | else | ||
288 | enable_irq(DB1200_SD0_INSERT_INT); | ||
289 | |||
290 | } else { | ||
291 | free_irq(DB1200_SD0_INSERT_INT, mmc_host); | ||
292 | free_irq(DB1200_SD0_EJECT_INT, mmc_host); | ||
293 | } | ||
294 | ret = 0; | ||
295 | out: | ||
296 | return ret; | ||
297 | } | ||
298 | |||
299 | static void db1200_mmc_set_power(void *mmc_host, int state) | ||
300 | { | ||
301 | if (state) { | ||
302 | bcsr_mod(BCSR_BOARD, 0, BCSR_BOARD_SD0PWR); | ||
303 | msleep(400); /* stabilization time */ | ||
304 | } else | ||
305 | bcsr_mod(BCSR_BOARD, BCSR_BOARD_SD0PWR, 0); | ||
306 | } | ||
307 | |||
308 | static int db1200_mmc_card_readonly(void *mmc_host) | ||
309 | { | ||
310 | return (bcsr_read(BCSR_STATUS) & BCSR_STATUS_SD0WP) ? 1 : 0; | ||
311 | } | ||
312 | |||
313 | static int db1200_mmc_card_inserted(void *mmc_host) | ||
314 | { | ||
315 | return (bcsr_read(BCSR_SIGSTAT) & BCSR_INT_SD0INSERT) ? 1 : 0; | ||
316 | } | ||
317 | |||
318 | static void db1200_mmcled_set(struct led_classdev *led, | ||
319 | enum led_brightness brightness) | ||
320 | { | ||
321 | if (brightness != LED_OFF) | ||
322 | bcsr_mod(BCSR_LEDS, BCSR_LEDS_LED0, 0); | ||
323 | else | ||
324 | bcsr_mod(BCSR_LEDS, 0, BCSR_LEDS_LED0); | ||
325 | } | ||
326 | |||
327 | static struct led_classdev db1200_mmc_led = { | ||
328 | .brightness_set = db1200_mmcled_set, | ||
329 | }; | ||
330 | |||
331 | /* needed by arch/mips/alchemy/common/platform.c */ | ||
332 | struct au1xmmc_platform_data au1xmmc_platdata[] = { | ||
333 | [0] = { | ||
334 | .cd_setup = db1200_mmc_cd_setup, | ||
335 | .set_power = db1200_mmc_set_power, | ||
336 | .card_inserted = db1200_mmc_card_inserted, | ||
337 | .card_readonly = db1200_mmc_card_readonly, | ||
338 | .led = &db1200_mmc_led, | ||
339 | }, | ||
340 | }; | ||
341 | |||
342 | /**********************************************************************/ | ||
343 | |||
344 | static struct resource au1200_psc0_res[] = { | ||
345 | [0] = { | ||
346 | .start = PSC0_PHYS_ADDR, | ||
347 | .end = PSC0_PHYS_ADDR + 0x000fffff, | ||
348 | .flags = IORESOURCE_MEM, | ||
349 | }, | ||
350 | [1] = { | ||
351 | .start = AU1200_PSC0_INT, | ||
352 | .end = AU1200_PSC0_INT, | ||
353 | .flags = IORESOURCE_IRQ, | ||
354 | }, | ||
355 | [2] = { | ||
356 | .start = DSCR_CMD0_PSC0_TX, | ||
357 | .end = DSCR_CMD0_PSC0_TX, | ||
358 | .flags = IORESOURCE_DMA, | ||
359 | }, | ||
360 | [3] = { | ||
361 | .start = DSCR_CMD0_PSC0_RX, | ||
362 | .end = DSCR_CMD0_PSC0_RX, | ||
363 | .flags = IORESOURCE_DMA, | ||
364 | }, | ||
365 | }; | ||
366 | |||
367 | static struct platform_device db1200_i2c_dev = { | ||
368 | .name = "au1xpsc_smbus", | ||
369 | .id = 0, /* bus number */ | ||
370 | .num_resources = ARRAY_SIZE(au1200_psc0_res), | ||
371 | .resource = au1200_psc0_res, | ||
372 | }; | ||
373 | |||
374 | static void db1200_spi_cs_en(struct au1550_spi_info *spi, int cs, int pol) | ||
375 | { | ||
376 | if (cs) | ||
377 | bcsr_mod(BCSR_RESETS, 0, BCSR_RESETS_SPISEL); | ||
378 | else | ||
379 | bcsr_mod(BCSR_RESETS, BCSR_RESETS_SPISEL, 0); | ||
380 | } | ||
381 | |||
382 | static struct au1550_spi_info db1200_spi_platdata = { | ||
383 | .mainclk_hz = 50000000, /* PSC0 clock */ | ||
384 | .num_chipselect = 2, | ||
385 | .activate_cs = db1200_spi_cs_en, | ||
386 | }; | ||
387 | |||
388 | static u64 spi_dmamask = DMA_BIT_MASK(32); | ||
389 | |||
390 | static struct platform_device db1200_spi_dev = { | ||
391 | .dev = { | ||
392 | .dma_mask = &spi_dmamask, | ||
393 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
394 | .platform_data = &db1200_spi_platdata, | ||
395 | }, | ||
396 | .name = "au1550-spi", | ||
397 | .id = 0, /* bus number */ | ||
398 | .num_resources = ARRAY_SIZE(au1200_psc0_res), | ||
399 | .resource = au1200_psc0_res, | ||
400 | }; | ||
401 | |||
402 | static struct resource au1200_psc1_res[] = { | ||
403 | [0] = { | ||
404 | .start = PSC1_PHYS_ADDR, | ||
405 | .end = PSC1_PHYS_ADDR + 0x000fffff, | ||
406 | .flags = IORESOURCE_MEM, | ||
407 | }, | ||
408 | [1] = { | ||
409 | .start = AU1200_PSC1_INT, | ||
410 | .end = AU1200_PSC1_INT, | ||
411 | .flags = IORESOURCE_IRQ, | ||
412 | }, | ||
413 | [2] = { | ||
414 | .start = DSCR_CMD0_PSC1_TX, | ||
415 | .end = DSCR_CMD0_PSC1_TX, | ||
416 | .flags = IORESOURCE_DMA, | ||
417 | }, | ||
418 | [3] = { | ||
419 | .start = DSCR_CMD0_PSC1_RX, | ||
420 | .end = DSCR_CMD0_PSC1_RX, | ||
421 | .flags = IORESOURCE_DMA, | ||
422 | }, | ||
423 | }; | ||
424 | |||
425 | static struct platform_device db1200_audio_dev = { | ||
426 | /* name assigned later based on switch setting */ | ||
427 | .id = 1, /* PSC ID */ | ||
428 | .num_resources = ARRAY_SIZE(au1200_psc1_res), | ||
429 | .resource = au1200_psc1_res, | ||
430 | }; | ||
431 | |||
432 | static struct platform_device db1200_stac_dev = { | ||
433 | .name = "ac97-codec", | ||
434 | .id = 1, /* on PSC1 */ | ||
435 | }; | ||
436 | |||
437 | static struct platform_device *db1200_devs[] __initdata = { | ||
438 | NULL, /* PSC0, selected by S6.8 */ | ||
439 | &db1200_ide_dev, | ||
440 | &db1200_eth_dev, | ||
441 | &db1200_rtc_dev, | ||
442 | &db1200_nand_dev, | ||
443 | &db1200_audio_dev, | ||
444 | &db1200_stac_dev, | ||
445 | }; | ||
446 | |||
447 | static int __init db1200_dev_init(void) | ||
448 | { | ||
449 | unsigned long pfc; | ||
450 | unsigned short sw; | ||
451 | int swapped; | ||
452 | |||
453 | i2c_register_board_info(0, db1200_i2c_devs, | ||
454 | ARRAY_SIZE(db1200_i2c_devs)); | ||
455 | spi_register_board_info(db1200_spi_devs, | ||
456 | ARRAY_SIZE(db1200_i2c_devs)); | ||
457 | |||
458 | /* SWITCHES: S6.8 I2C/SPI selector (OFF=I2C ON=SPI) | ||
459 | * S6.7 AC97/I2S selector (OFF=AC97 ON=I2S) | ||
460 | */ | ||
461 | |||
462 | /* NOTE: GPIO215 controls OTG VBUS supply. In SPI mode however | ||
463 | * this pin is claimed by PSC0 (unused though, but pinmux doesn't | ||
464 | * allow to free it without crippling the SPI interface). | ||
465 | * As a result, in SPI mode, OTG simply won't work (PSC0 uses | ||
466 | * it as an input pin which is pulled high on the boards). | ||
467 | */ | ||
468 | pfc = __raw_readl((void __iomem *)SYS_PINFUNC) & ~SYS_PINFUNC_P0A; | ||
469 | |||
470 | /* switch off OTG VBUS supply */ | ||
471 | gpio_request(215, "otg-vbus"); | ||
472 | gpio_direction_output(215, 1); | ||
473 | |||
474 | printk(KERN_INFO "DB1200 device configuration:\n"); | ||
475 | |||
476 | sw = bcsr_read(BCSR_SWITCHES); | ||
477 | if (sw & BCSR_SWITCHES_DIP_8) { | ||
478 | db1200_devs[0] = &db1200_i2c_dev; | ||
479 | bcsr_mod(BCSR_RESETS, BCSR_RESETS_PSC0MUX, 0); | ||
480 | |||
481 | pfc |= (2 << 17); /* GPIO2 block owns GPIO215 */ | ||
482 | |||
483 | printk(KERN_INFO " S6.8 OFF: PSC0 mode I2C\n"); | ||
484 | printk(KERN_INFO " OTG port VBUS supply available!\n"); | ||
485 | } else { | ||
486 | db1200_devs[0] = &db1200_spi_dev; | ||
487 | bcsr_mod(BCSR_RESETS, 0, BCSR_RESETS_PSC0MUX); | ||
488 | |||
489 | pfc |= (1 << 17); /* PSC0 owns GPIO215 */ | ||
490 | |||
491 | printk(KERN_INFO " S6.8 ON : PSC0 mode SPI\n"); | ||
492 | printk(KERN_INFO " OTG port VBUS supply disabled\n"); | ||
493 | } | ||
494 | __raw_writel(pfc, (void __iomem *)SYS_PINFUNC); | ||
495 | wmb(); | ||
496 | |||
497 | /* Audio: DIP7 selects I2S(0)/AC97(1), but need I2C for I2S! | ||
498 | * so: DIP7=1 || DIP8=0 => AC97, DIP7=0 && DIP8=1 => I2S | ||
499 | */ | ||
500 | sw &= BCSR_SWITCHES_DIP_8 | BCSR_SWITCHES_DIP_7; | ||
501 | if (sw == BCSR_SWITCHES_DIP_8) { | ||
502 | bcsr_mod(BCSR_RESETS, 0, BCSR_RESETS_PSC1MUX); | ||
503 | db1200_audio_dev.name = "au1xpsc_i2s"; | ||
504 | printk(KERN_INFO " S6.7 ON : PSC1 mode I2S\n"); | ||
505 | } else { | ||
506 | bcsr_mod(BCSR_RESETS, BCSR_RESETS_PSC1MUX, 0); | ||
507 | db1200_audio_dev.name = "au1xpsc_ac97"; | ||
508 | printk(KERN_INFO " S6.7 OFF: PSC1 mode AC97\n"); | ||
509 | } | ||
510 | |||
511 | /* Audio PSC clock is supplied externally. (FIXME: platdata!!) */ | ||
512 | __raw_writel(PSC_SEL_CLK_SERCLK, | ||
513 | (void __iomem *)KSEG1ADDR(PSC1_PHYS_ADDR) + PSC_SEL_OFFSET); | ||
514 | wmb(); | ||
515 | |||
516 | db1x_register_pcmcia_socket(PCMCIA_ATTR_PHYS_ADDR, | ||
517 | PCMCIA_ATTR_PHYS_ADDR + 0x000400000 - 1, | ||
518 | PCMCIA_MEM_PHYS_ADDR, | ||
519 | PCMCIA_MEM_PHYS_ADDR + 0x000400000 - 1, | ||
520 | PCMCIA_IO_PHYS_ADDR, | ||
521 | PCMCIA_IO_PHYS_ADDR + 0x000010000 - 1, | ||
522 | DB1200_PC0_INT, | ||
523 | DB1200_PC0_INSERT_INT, | ||
524 | /*DB1200_PC0_STSCHG_INT*/0, | ||
525 | DB1200_PC0_EJECT_INT, | ||
526 | 0); | ||
527 | |||
528 | db1x_register_pcmcia_socket(PCMCIA_ATTR_PHYS_ADDR + 0x004000000, | ||
529 | PCMCIA_ATTR_PHYS_ADDR + 0x004400000 - 1, | ||
530 | PCMCIA_MEM_PHYS_ADDR + 0x004000000, | ||
531 | PCMCIA_MEM_PHYS_ADDR + 0x004400000 - 1, | ||
532 | PCMCIA_IO_PHYS_ADDR + 0x004000000, | ||
533 | PCMCIA_IO_PHYS_ADDR + 0x004010000 - 1, | ||
534 | DB1200_PC1_INT, | ||
535 | DB1200_PC1_INSERT_INT, | ||
536 | /*DB1200_PC1_STSCHG_INT*/0, | ||
537 | DB1200_PC1_EJECT_INT, | ||
538 | 1); | ||
539 | |||
540 | swapped = bcsr_read(BCSR_STATUS) & BCSR_STATUS_DB1200_SWAPBOOT; | ||
541 | db1x_register_norflash(64 << 20, 2, swapped); | ||
542 | |||
543 | return platform_add_devices(db1200_devs, ARRAY_SIZE(db1200_devs)); | ||
544 | } | ||
545 | device_initcall(db1200_dev_init); | ||
546 | |||
547 | /* au1200fb calls these: STERBT EINEN TRAGISCHEN TOD!!! */ | ||
548 | int board_au1200fb_panel(void) | ||
549 | { | ||
550 | return (bcsr_read(BCSR_SWITCHES) >> 8) & 0x0f; | ||
551 | } | ||
552 | |||
553 | int board_au1200fb_panel_init(void) | ||
554 | { | ||
555 | /* Apply power */ | ||
556 | bcsr_mod(BCSR_BOARD, 0, BCSR_BOARD_LCDVEE | BCSR_BOARD_LCDVDD | | ||
557 | BCSR_BOARD_LCDBL); | ||
558 | return 0; | ||
559 | } | ||
560 | |||
561 | int board_au1200fb_panel_shutdown(void) | ||
562 | { | ||
563 | /* Remove power */ | ||
564 | bcsr_mod(BCSR_BOARD, BCSR_BOARD_LCDVEE | BCSR_BOARD_LCDVDD | | ||
565 | BCSR_BOARD_LCDBL, 0); | ||
566 | return 0; | ||
567 | } | ||
diff --git a/arch/mips/alchemy/devboards/db1200/setup.c b/arch/mips/alchemy/devboards/db1200/setup.c new file mode 100644 index 00000000000..4a8980027ec --- /dev/null +++ b/arch/mips/alchemy/devboards/db1200/setup.c | |||
@@ -0,0 +1,81 @@ | |||
1 | /* | ||
2 | * Alchemy/AMD/RMI DB1200 board setup. | ||
3 | * | ||
4 | * Licensed under the terms outlined in the file COPYING in the root of | ||
5 | * this source archive. | ||
6 | */ | ||
7 | |||
8 | #include <linux/init.h> | ||
9 | #include <linux/interrupt.h> | ||
10 | #include <linux/io.h> | ||
11 | #include <linux/kernel.h> | ||
12 | #include <asm/mach-au1x00/au1000.h> | ||
13 | #include <asm/mach-db1x00/bcsr.h> | ||
14 | #include <asm/mach-db1x00/db1200.h> | ||
15 | |||
16 | const char *get_system_type(void) | ||
17 | { | ||
18 | return "Alchemy Db1200"; | ||
19 | } | ||
20 | |||
21 | void __init board_setup(void) | ||
22 | { | ||
23 | unsigned long freq0, clksrc, div, pfc; | ||
24 | unsigned short whoami; | ||
25 | |||
26 | bcsr_init(DB1200_BCSR_PHYS_ADDR, | ||
27 | DB1200_BCSR_PHYS_ADDR + DB1200_BCSR_HEXLED_OFS); | ||
28 | |||
29 | whoami = bcsr_read(BCSR_WHOAMI); | ||
30 | printk(KERN_INFO "Alchemy/AMD/RMI DB1200 Board, CPLD Rev %d" | ||
31 | " Board-ID %d Daughtercard ID %d\n", | ||
32 | (whoami >> 4) & 0xf, (whoami >> 8) & 0xf, whoami & 0xf); | ||
33 | |||
34 | /* SMBus/SPI on PSC0, Audio on PSC1 */ | ||
35 | pfc = __raw_readl((void __iomem *)SYS_PINFUNC); | ||
36 | pfc &= ~(SYS_PINFUNC_P0A | SYS_PINFUNC_P0B); | ||
37 | pfc &= ~(SYS_PINFUNC_P1A | SYS_PINFUNC_P1B | SYS_PINFUNC_FS3); | ||
38 | pfc |= SYS_PINFUNC_P1C; /* SPI is configured later */ | ||
39 | __raw_writel(pfc, (void __iomem *)SYS_PINFUNC); | ||
40 | wmb(); | ||
41 | |||
42 | /* Clock configurations: PSC0: ~50MHz via Clkgen0, derived from | ||
43 | * CPU clock; all other clock generators off/unused. | ||
44 | */ | ||
45 | div = (get_au1x00_speed() + 25000000) / 50000000; | ||
46 | if (div & 1) | ||
47 | div++; | ||
48 | div = ((div >> 1) - 1) & 0xff; | ||
49 | |||
50 | freq0 = div << SYS_FC_FRDIV0_BIT; | ||
51 | __raw_writel(freq0, (void __iomem *)SYS_FREQCTRL0); | ||
52 | wmb(); | ||
53 | freq0 |= SYS_FC_FE0; /* enable F0 */ | ||
54 | __raw_writel(freq0, (void __iomem *)SYS_FREQCTRL0); | ||
55 | wmb(); | ||
56 | |||
57 | /* psc0_intclk comes 1:1 from F0 */ | ||
58 | clksrc = SYS_CS_MUX_FQ0 << SYS_CS_ME0_BIT; | ||
59 | __raw_writel(clksrc, (void __iomem *)SYS_CLKSRC); | ||
60 | wmb(); | ||
61 | } | ||
62 | |||
63 | static int __init db1200_arch_init(void) | ||
64 | { | ||
65 | /* GPIO7 is low-level triggered CPLD cascade */ | ||
66 | irq_set_irq_type(AU1200_GPIO7_INT, IRQF_TRIGGER_LOW); | ||
67 | bcsr_init_irq(DB1200_INT_BEGIN, DB1200_INT_END, AU1200_GPIO7_INT); | ||
68 | |||
69 | /* insert/eject pairs: one of both is always screaming. To avoid | ||
70 | * issues they must not be automatically enabled when initially | ||
71 | * requested. | ||
72 | */ | ||
73 | irq_set_status_flags(DB1200_SD0_INSERT_INT, IRQ_NOAUTOEN); | ||
74 | irq_set_status_flags(DB1200_SD0_EJECT_INT, IRQ_NOAUTOEN); | ||
75 | irq_set_status_flags(DB1200_PC0_INSERT_INT, IRQ_NOAUTOEN); | ||
76 | irq_set_status_flags(DB1200_PC0_EJECT_INT, IRQ_NOAUTOEN); | ||
77 | irq_set_status_flags(DB1200_PC1_INSERT_INT, IRQ_NOAUTOEN); | ||
78 | irq_set_status_flags(DB1200_PC1_EJECT_INT, IRQ_NOAUTOEN); | ||
79 | return 0; | ||
80 | } | ||
81 | arch_initcall(db1200_arch_init); | ||
diff --git a/arch/mips/alchemy/devboards/db1x00/Makefile b/arch/mips/alchemy/devboards/db1x00/Makefile new file mode 100644 index 00000000000..613c0c0c8be --- /dev/null +++ b/arch/mips/alchemy/devboards/db1x00/Makefile | |||
@@ -0,0 +1,8 @@ | |||
1 | # | ||
2 | # Copyright 2000, 2008 MontaVista Software Inc. | ||
3 | # Author: MontaVista Software, Inc. <source@mvista.com> | ||
4 | # | ||
5 | # Makefile for the Alchemy Semiconductor DBAu1xx0 boards. | ||
6 | # | ||
7 | |||
8 | obj-y := board_setup.o platform.o | ||
diff --git a/arch/mips/alchemy/devboards/db1x00/board_setup.c b/arch/mips/alchemy/devboards/db1x00/board_setup.c new file mode 100644 index 00000000000..5c956fe8760 --- /dev/null +++ b/arch/mips/alchemy/devboards/db1x00/board_setup.c | |||
@@ -0,0 +1,255 @@ | |||
1 | /* | ||
2 | * | ||
3 | * BRIEF MODULE DESCRIPTION | ||
4 | * Alchemy Db1x00 board setup. | ||
5 | * | ||
6 | * Copyright 2000, 2008 MontaVista Software Inc. | ||
7 | * Author: MontaVista Software, Inc. <source@mvista.com> | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify it | ||
10 | * under the terms of the GNU General Public License as published by the | ||
11 | * Free Software Foundation; either version 2 of the License, or (at your | ||
12 | * option) any later version. | ||
13 | * | ||
14 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
15 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
16 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
17 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
18 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
19 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
20 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
21 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
22 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
23 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
24 | * | ||
25 | * You should have received a copy of the GNU General Public License along | ||
26 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
27 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
28 | */ | ||
29 | |||
30 | #include <linux/gpio.h> | ||
31 | #include <linux/init.h> | ||
32 | #include <linux/interrupt.h> | ||
33 | #include <linux/pm.h> | ||
34 | |||
35 | #include <asm/mach-au1x00/au1000.h> | ||
36 | #include <asm/mach-au1x00/au1xxx_eth.h> | ||
37 | #include <asm/mach-db1x00/db1x00.h> | ||
38 | #include <asm/mach-db1x00/bcsr.h> | ||
39 | #include <asm/reboot.h> | ||
40 | |||
41 | #include <prom.h> | ||
42 | |||
43 | #ifdef CONFIG_MIPS_DB1500 | ||
44 | char irq_tab_alchemy[][5] __initdata = { | ||
45 | [12] = { -1, AU1500_PCI_INTA, 0xff, 0xff, 0xff }, /* IDSEL 12 - HPT371 */ | ||
46 | [13] = { -1, AU1500_PCI_INTA, AU1500_PCI_INTB, AU1500_PCI_INTC, AU1500_PCI_INTD }, /* IDSEL 13 - PCI slot */ | ||
47 | }; | ||
48 | |||
49 | #endif | ||
50 | |||
51 | |||
52 | #ifdef CONFIG_MIPS_DB1550 | ||
53 | char irq_tab_alchemy[][5] __initdata = { | ||
54 | [11] = { -1, AU1550_PCI_INTC, 0xff, 0xff, 0xff }, /* IDSEL 11 - on-board HPT371 */ | ||
55 | [12] = { -1, AU1550_PCI_INTB, AU1550_PCI_INTC, AU1550_PCI_INTD, AU1550_PCI_INTA }, /* IDSEL 12 - PCI slot 2 (left) */ | ||
56 | [13] = { -1, AU1550_PCI_INTA, AU1550_PCI_INTB, AU1550_PCI_INTC, AU1550_PCI_INTD }, /* IDSEL 13 - PCI slot 1 (right) */ | ||
57 | }; | ||
58 | #endif | ||
59 | |||
60 | |||
61 | #ifdef CONFIG_MIPS_BOSPORUS | ||
62 | char irq_tab_alchemy[][5] __initdata = { | ||
63 | [11] = { -1, AU1500_PCI_INTA, AU1500_PCI_INTB, 0xff, 0xff }, /* IDSEL 11 - miniPCI */ | ||
64 | [12] = { -1, AU1500_PCI_INTA, 0xff, 0xff, 0xff }, /* IDSEL 12 - SN1741 */ | ||
65 | [13] = { -1, AU1500_PCI_INTA, AU1500_PCI_INTB, AU1500_PCI_INTC, AU1500_PCI_INTD }, /* IDSEL 13 - PCI slot */ | ||
66 | }; | ||
67 | |||
68 | /* | ||
69 | * Micrel/Kendin 5 port switch attached to MAC0, | ||
70 | * MAC0 is associated with PHY address 5 (== WAN port) | ||
71 | * MAC1 is not associated with any PHY, since it's connected directly | ||
72 | * to the switch. | ||
73 | * no interrupts are used | ||
74 | */ | ||
75 | static struct au1000_eth_platform_data eth0_pdata = { | ||
76 | .phy_static_config = 1, | ||
77 | .phy_addr = 5, | ||
78 | }; | ||
79 | |||
80 | static void bosporus_power_off(void) | ||
81 | { | ||
82 | while (1) | ||
83 | asm volatile (".set mips3 ; wait ; .set mips0"); | ||
84 | } | ||
85 | |||
86 | const char *get_system_type(void) | ||
87 | { | ||
88 | return "Alchemy Bosporus Gateway Reference"; | ||
89 | } | ||
90 | #endif | ||
91 | |||
92 | |||
93 | #ifdef CONFIG_MIPS_MIRAGE | ||
94 | char irq_tab_alchemy[][5] __initdata = { | ||
95 | [11] = { -1, AU1500_PCI_INTD, 0xff, 0xff, 0xff }, /* IDSEL 11 - SMI VGX */ | ||
96 | [12] = { -1, 0xff, 0xff, AU1500_PCI_INTC, 0xff }, /* IDSEL 12 - PNX1300 */ | ||
97 | [13] = { -1, AU1500_PCI_INTA, AU1500_PCI_INTB, 0xff, 0xff }, /* IDSEL 13 - miniPCI */ | ||
98 | }; | ||
99 | |||
100 | static void mirage_power_off(void) | ||
101 | { | ||
102 | alchemy_gpio_direction_output(210, 1); | ||
103 | } | ||
104 | |||
105 | const char *get_system_type(void) | ||
106 | { | ||
107 | return "Alchemy Mirage"; | ||
108 | } | ||
109 | #endif | ||
110 | |||
111 | |||
112 | #if defined(CONFIG_MIPS_BOSPORUS) || defined(CONFIG_MIPS_MIRAGE) | ||
113 | static void mips_softreset(void) | ||
114 | { | ||
115 | asm volatile ("jr\t%0" : : "r"(0xbfc00000)); | ||
116 | } | ||
117 | |||
118 | #else | ||
119 | |||
120 | const char *get_system_type(void) | ||
121 | { | ||
122 | return "Alchemy Db1x00"; | ||
123 | } | ||
124 | #endif | ||
125 | |||
126 | |||
127 | void __init board_setup(void) | ||
128 | { | ||
129 | unsigned long bcsr1, bcsr2; | ||
130 | |||
131 | bcsr1 = DB1000_BCSR_PHYS_ADDR; | ||
132 | bcsr2 = DB1000_BCSR_PHYS_ADDR + DB1000_BCSR_HEXLED_OFS; | ||
133 | |||
134 | #ifdef CONFIG_MIPS_DB1000 | ||
135 | printk(KERN_INFO "AMD Alchemy Au1000/Db1000 Board\n"); | ||
136 | #endif | ||
137 | #ifdef CONFIG_MIPS_DB1500 | ||
138 | printk(KERN_INFO "AMD Alchemy Au1500/Db1500 Board\n"); | ||
139 | #endif | ||
140 | #ifdef CONFIG_MIPS_DB1100 | ||
141 | printk(KERN_INFO "AMD Alchemy Au1100/Db1100 Board\n"); | ||
142 | #endif | ||
143 | #ifdef CONFIG_MIPS_BOSPORUS | ||
144 | au1xxx_override_eth_cfg(0, ð0_pdata); | ||
145 | |||
146 | printk(KERN_INFO "AMD Alchemy Bosporus Board\n"); | ||
147 | #endif | ||
148 | #ifdef CONFIG_MIPS_MIRAGE | ||
149 | printk(KERN_INFO "AMD Alchemy Mirage Board\n"); | ||
150 | #endif | ||
151 | #ifdef CONFIG_MIPS_DB1550 | ||
152 | printk(KERN_INFO "AMD Alchemy Au1550/Db1550 Board\n"); | ||
153 | |||
154 | bcsr1 = DB1550_BCSR_PHYS_ADDR; | ||
155 | bcsr2 = DB1550_BCSR_PHYS_ADDR + DB1550_BCSR_HEXLED_OFS; | ||
156 | #endif | ||
157 | |||
158 | /* initialize board register space */ | ||
159 | bcsr_init(bcsr1, bcsr2); | ||
160 | |||
161 | /* Not valid for Au1550 */ | ||
162 | #if defined(CONFIG_IRDA) && \ | ||
163 | (defined(CONFIG_SOC_AU1000) || defined(CONFIG_SOC_AU1100)) | ||
164 | { | ||
165 | u32 pin_func; | ||
166 | |||
167 | /* Set IRFIRSEL instead of GPIO15 */ | ||
168 | pin_func = au_readl(SYS_PINFUNC) | SYS_PF_IRF; | ||
169 | au_writel(pin_func, SYS_PINFUNC); | ||
170 | /* Power off until the driver is in use */ | ||
171 | bcsr_mod(BCSR_RESETS, BCSR_RESETS_IRDA_MODE_MASK, | ||
172 | BCSR_RESETS_IRDA_MODE_OFF); | ||
173 | } | ||
174 | #endif | ||
175 | bcsr_write(BCSR_PCMCIA, 0); /* turn off PCMCIA power */ | ||
176 | |||
177 | /* Enable GPIO[31:0] inputs */ | ||
178 | alchemy_gpio1_input_enable(); | ||
179 | |||
180 | #ifdef CONFIG_MIPS_MIRAGE | ||
181 | { | ||
182 | u32 pin_func; | ||
183 | |||
184 | /* GPIO[20] is output */ | ||
185 | alchemy_gpio_direction_output(20, 0); | ||
186 | |||
187 | /* Set GPIO[210:208] instead of SSI_0 */ | ||
188 | pin_func = au_readl(SYS_PINFUNC) | SYS_PF_S0; | ||
189 | |||
190 | /* Set GPIO[215:211] for LEDs */ | ||
191 | pin_func |= 5 << 2; | ||
192 | |||
193 | /* Set GPIO[214:213] for more LEDs */ | ||
194 | pin_func |= 5 << 12; | ||
195 | |||
196 | /* Set GPIO[207:200] instead of PCMCIA/LCD */ | ||
197 | pin_func |= SYS_PF_LCD | SYS_PF_PC; | ||
198 | au_writel(pin_func, SYS_PINFUNC); | ||
199 | |||
200 | /* | ||
201 | * Enable speaker amplifier. This should | ||
202 | * be part of the audio driver. | ||
203 | */ | ||
204 | alchemy_gpio_direction_output(209, 1); | ||
205 | |||
206 | pm_power_off = mirage_power_off; | ||
207 | _machine_halt = mirage_power_off; | ||
208 | _machine_restart = (void(*)(char *))mips_softreset; | ||
209 | } | ||
210 | #endif | ||
211 | |||
212 | #ifdef CONFIG_MIPS_BOSPORUS | ||
213 | pm_power_off = bosporus_power_off; | ||
214 | _machine_halt = bosporus_power_off; | ||
215 | _machine_restart = (void(*)(char *))mips_softreset; | ||
216 | #endif | ||
217 | au_sync(); | ||
218 | } | ||
219 | |||
220 | static int __init db1x00_init_irq(void) | ||
221 | { | ||
222 | #if defined(CONFIG_MIPS_MIRAGE) | ||
223 | irq_set_irq_type(AU1500_GPIO7_INT, IRQF_TRIGGER_RISING); /* TS pendown */ | ||
224 | #elif defined(CONFIG_MIPS_DB1550) | ||
225 | irq_set_irq_type(AU1550_GPIO0_INT, IRQF_TRIGGER_LOW); /* CD0# */ | ||
226 | irq_set_irq_type(AU1550_GPIO1_INT, IRQF_TRIGGER_LOW); /* CD1# */ | ||
227 | irq_set_irq_type(AU1550_GPIO3_INT, IRQF_TRIGGER_LOW); /* CARD0# */ | ||
228 | irq_set_irq_type(AU1550_GPIO5_INT, IRQF_TRIGGER_LOW); /* CARD1# */ | ||
229 | irq_set_irq_type(AU1550_GPIO21_INT, IRQF_TRIGGER_LOW); /* STSCHG0# */ | ||
230 | irq_set_irq_type(AU1550_GPIO22_INT, IRQF_TRIGGER_LOW); /* STSCHG1# */ | ||
231 | #elif defined(CONFIG_MIPS_DB1500) | ||
232 | irq_set_irq_type(AU1500_GPIO0_INT, IRQF_TRIGGER_LOW); /* CD0# */ | ||
233 | irq_set_irq_type(AU1500_GPIO3_INT, IRQF_TRIGGER_LOW); /* CD1# */ | ||
234 | irq_set_irq_type(AU1500_GPIO2_INT, IRQF_TRIGGER_LOW); /* CARD0# */ | ||
235 | irq_set_irq_type(AU1500_GPIO5_INT, IRQF_TRIGGER_LOW); /* CARD1# */ | ||
236 | irq_set_irq_type(AU1500_GPIO1_INT, IRQF_TRIGGER_LOW); /* STSCHG0# */ | ||
237 | irq_set_irq_type(AU1500_GPIO4_INT, IRQF_TRIGGER_LOW); /* STSCHG1# */ | ||
238 | #elif defined(CONFIG_MIPS_DB1100) | ||
239 | irq_set_irq_type(AU1100_GPIO0_INT, IRQF_TRIGGER_LOW); /* CD0# */ | ||
240 | irq_set_irq_type(AU1100_GPIO3_INT, IRQF_TRIGGER_LOW); /* CD1# */ | ||
241 | irq_set_irq_type(AU1100_GPIO2_INT, IRQF_TRIGGER_LOW); /* CARD0# */ | ||
242 | irq_set_irq_type(AU1100_GPIO5_INT, IRQF_TRIGGER_LOW); /* CARD1# */ | ||
243 | irq_set_irq_type(AU1100_GPIO1_INT, IRQF_TRIGGER_LOW); /* STSCHG0# */ | ||
244 | irq_set_irq_type(AU1100_GPIO4_INT, IRQF_TRIGGER_LOW); /* STSCHG1# */ | ||
245 | #elif defined(CONFIG_MIPS_DB1000) | ||
246 | irq_set_irq_type(AU1000_GPIO0_INT, IRQF_TRIGGER_LOW); /* CD0# */ | ||
247 | irq_set_irq_type(AU1000_GPIO3_INT, IRQF_TRIGGER_LOW); /* CD1# */ | ||
248 | irq_set_irq_type(AU1000_GPIO2_INT, IRQF_TRIGGER_LOW); /* CARD0# */ | ||
249 | irq_set_irq_type(AU1000_GPIO5_INT, IRQF_TRIGGER_LOW); /* CARD1# */ | ||
250 | irq_set_irq_type(AU1000_GPIO1_INT, IRQF_TRIGGER_LOW); /* STSCHG0# */ | ||
251 | irq_set_irq_type(AU1000_GPIO4_INT, IRQF_TRIGGER_LOW); /* STSCHG1# */ | ||
252 | #endif | ||
253 | return 0; | ||
254 | } | ||
255 | arch_initcall(db1x00_init_irq); | ||
diff --git a/arch/mips/alchemy/devboards/db1x00/platform.c b/arch/mips/alchemy/devboards/db1x00/platform.c new file mode 100644 index 00000000000..978d5ab3d67 --- /dev/null +++ b/arch/mips/alchemy/devboards/db1x00/platform.c | |||
@@ -0,0 +1,118 @@ | |||
1 | /* | ||
2 | * DBAu1xxx board platform device registration | ||
3 | * | ||
4 | * Copyright (C) 2009 Manuel Lauss | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
19 | */ | ||
20 | |||
21 | #include <linux/init.h> | ||
22 | #include <linux/platform_device.h> | ||
23 | |||
24 | #include <asm/mach-au1x00/au1xxx.h> | ||
25 | #include <asm/mach-db1x00/bcsr.h> | ||
26 | #include "../platform.h" | ||
27 | |||
28 | /* DB1xxx PCMCIA interrupt sources: | ||
29 | * CD0/1 GPIO0/3 | ||
30 | * STSCHG0/1 GPIO1/4 | ||
31 | * CARD0/1 GPIO2/5 | ||
32 | * Db1550: 0/1, 21/22, 3/5 | ||
33 | */ | ||
34 | |||
35 | #define DB1XXX_HAS_PCMCIA | ||
36 | #define F_SWAPPED (bcsr_read(BCSR_STATUS) & BCSR_STATUS_DB1000_SWAPBOOT) | ||
37 | |||
38 | #if defined(CONFIG_MIPS_DB1000) | ||
39 | #define DB1XXX_PCMCIA_CD0 AU1000_GPIO0_INT | ||
40 | #define DB1XXX_PCMCIA_STSCHG0 AU1000_GPIO1_INT | ||
41 | #define DB1XXX_PCMCIA_CARD0 AU1000_GPIO2_INT | ||
42 | #define DB1XXX_PCMCIA_CD1 AU1000_GPIO3_INT | ||
43 | #define DB1XXX_PCMCIA_STSCHG1 AU1000_GPIO4_INT | ||
44 | #define DB1XXX_PCMCIA_CARD1 AU1000_GPIO5_INT | ||
45 | #define BOARD_FLASH_SIZE 0x02000000 /* 32MB */ | ||
46 | #define BOARD_FLASH_WIDTH 4 /* 32-bits */ | ||
47 | #elif defined(CONFIG_MIPS_DB1100) | ||
48 | #define DB1XXX_PCMCIA_CD0 AU1100_GPIO0_INT | ||
49 | #define DB1XXX_PCMCIA_STSCHG0 AU1100_GPIO1_INT | ||
50 | #define DB1XXX_PCMCIA_CARD0 AU1100_GPIO2_INT | ||
51 | #define DB1XXX_PCMCIA_CD1 AU1100_GPIO3_INT | ||
52 | #define DB1XXX_PCMCIA_STSCHG1 AU1100_GPIO4_INT | ||
53 | #define DB1XXX_PCMCIA_CARD1 AU1100_GPIO5_INT | ||
54 | #define BOARD_FLASH_SIZE 0x02000000 /* 32MB */ | ||
55 | #define BOARD_FLASH_WIDTH 4 /* 32-bits */ | ||
56 | #elif defined(CONFIG_MIPS_DB1500) | ||
57 | #define DB1XXX_PCMCIA_CD0 AU1500_GPIO0_INT | ||
58 | #define DB1XXX_PCMCIA_STSCHG0 AU1500_GPIO1_INT | ||
59 | #define DB1XXX_PCMCIA_CARD0 AU1500_GPIO2_INT | ||
60 | #define DB1XXX_PCMCIA_CD1 AU1500_GPIO3_INT | ||
61 | #define DB1XXX_PCMCIA_STSCHG1 AU1500_GPIO4_INT | ||
62 | #define DB1XXX_PCMCIA_CARD1 AU1500_GPIO5_INT | ||
63 | #define BOARD_FLASH_SIZE 0x02000000 /* 32MB */ | ||
64 | #define BOARD_FLASH_WIDTH 4 /* 32-bits */ | ||
65 | #elif defined(CONFIG_MIPS_DB1550) | ||
66 | #define DB1XXX_PCMCIA_CD0 AU1550_GPIO0_INT | ||
67 | #define DB1XXX_PCMCIA_STSCHG0 AU1550_GPIO21_INT | ||
68 | #define DB1XXX_PCMCIA_CARD0 AU1550_GPIO3_INT | ||
69 | #define DB1XXX_PCMCIA_CD1 AU1550_GPIO1_INT | ||
70 | #define DB1XXX_PCMCIA_STSCHG1 AU1550_GPIO22_INT | ||
71 | #define DB1XXX_PCMCIA_CARD1 AU1550_GPIO5_INT | ||
72 | #define BOARD_FLASH_SIZE 0x08000000 /* 128MB */ | ||
73 | #define BOARD_FLASH_WIDTH 4 /* 32-bits */ | ||
74 | #else | ||
75 | /* other board: no PCMCIA */ | ||
76 | #undef DB1XXX_HAS_PCMCIA | ||
77 | #undef F_SWAPPED | ||
78 | #define F_SWAPPED 0 | ||
79 | #if defined(CONFIG_MIPS_BOSPORUS) | ||
80 | #define BOARD_FLASH_SIZE 0x01000000 /* 16MB */ | ||
81 | #define BOARD_FLASH_WIDTH 2 /* 16-bits */ | ||
82 | #elif defined(CONFIG_MIPS_MIRAGE) | ||
83 | #define BOARD_FLASH_SIZE 0x04000000 /* 64MB */ | ||
84 | #define BOARD_FLASH_WIDTH 4 /* 32-bits */ | ||
85 | #endif | ||
86 | #endif | ||
87 | |||
88 | static int __init db1xxx_dev_init(void) | ||
89 | { | ||
90 | #ifdef DB1XXX_HAS_PCMCIA | ||
91 | db1x_register_pcmcia_socket(PCMCIA_ATTR_PHYS_ADDR, | ||
92 | PCMCIA_ATTR_PHYS_ADDR + 0x000400000 - 1, | ||
93 | PCMCIA_MEM_PHYS_ADDR, | ||
94 | PCMCIA_MEM_PHYS_ADDR + 0x000400000 - 1, | ||
95 | PCMCIA_IO_PHYS_ADDR, | ||
96 | PCMCIA_IO_PHYS_ADDR + 0x000010000 - 1, | ||
97 | DB1XXX_PCMCIA_CARD0, | ||
98 | DB1XXX_PCMCIA_CD0, | ||
99 | /*DB1XXX_PCMCIA_STSCHG0*/0, | ||
100 | 0, | ||
101 | 0); | ||
102 | |||
103 | db1x_register_pcmcia_socket(PCMCIA_ATTR_PHYS_ADDR + 0x004000000, | ||
104 | PCMCIA_ATTR_PHYS_ADDR + 0x004400000 - 1, | ||
105 | PCMCIA_MEM_PHYS_ADDR + 0x004000000, | ||
106 | PCMCIA_MEM_PHYS_ADDR + 0x004400000 - 1, | ||
107 | PCMCIA_IO_PHYS_ADDR + 0x004000000, | ||
108 | PCMCIA_IO_PHYS_ADDR + 0x004010000 - 1, | ||
109 | DB1XXX_PCMCIA_CARD1, | ||
110 | DB1XXX_PCMCIA_CD1, | ||
111 | /*DB1XXX_PCMCIA_STSCHG1*/0, | ||
112 | 0, | ||
113 | 1); | ||
114 | #endif | ||
115 | db1x_register_norflash(BOARD_FLASH_SIZE, BOARD_FLASH_WIDTH, F_SWAPPED); | ||
116 | return 0; | ||
117 | } | ||
118 | device_initcall(db1xxx_dev_init); | ||
diff --git a/arch/mips/alchemy/devboards/pb1000/Makefile b/arch/mips/alchemy/devboards/pb1000/Makefile new file mode 100644 index 00000000000..97c6615ba2b --- /dev/null +++ b/arch/mips/alchemy/devboards/pb1000/Makefile | |||
@@ -0,0 +1,8 @@ | |||
1 | # | ||
2 | # Copyright 2000, 2008 MontaVista Software Inc. | ||
3 | # Author: MontaVista Software, Inc. <source@mvista.com> | ||
4 | # | ||
5 | # Makefile for the Alchemy Semiconductor Pb1000 board. | ||
6 | # | ||
7 | |||
8 | obj-y := board_setup.o | ||
diff --git a/arch/mips/alchemy/devboards/pb1000/board_setup.c b/arch/mips/alchemy/devboards/pb1000/board_setup.c new file mode 100644 index 00000000000..e64fdcbf75d --- /dev/null +++ b/arch/mips/alchemy/devboards/pb1000/board_setup.c | |||
@@ -0,0 +1,209 @@ | |||
1 | /* | ||
2 | * Copyright 2000, 2008 MontaVista Software Inc. | ||
3 | * Author: MontaVista Software, Inc. <source@mvista.com> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms of the GNU General Public License as published by the | ||
7 | * Free Software Foundation; either version 2 of the License, or (at your | ||
8 | * option) any later version. | ||
9 | * | ||
10 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
11 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
12 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
13 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
14 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
15 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
16 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
17 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
18 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
19 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
20 | * | ||
21 | * You should have received a copy of the GNU General Public License along | ||
22 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
23 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
24 | */ | ||
25 | |||
26 | #include <linux/delay.h> | ||
27 | #include <linux/gpio.h> | ||
28 | #include <linux/init.h> | ||
29 | #include <linux/interrupt.h> | ||
30 | #include <linux/pm.h> | ||
31 | #include <asm/mach-au1x00/au1000.h> | ||
32 | #include <asm/mach-pb1x00/pb1000.h> | ||
33 | #include <asm/reboot.h> | ||
34 | #include <prom.h> | ||
35 | |||
36 | #include "../platform.h" | ||
37 | |||
38 | const char *get_system_type(void) | ||
39 | { | ||
40 | return "Alchemy Pb1000"; | ||
41 | } | ||
42 | |||
43 | static void board_reset(char *c) | ||
44 | { | ||
45 | asm volatile ("jr %0" : : "r" (0xbfc00000)); | ||
46 | } | ||
47 | |||
48 | static void board_power_off(void) | ||
49 | { | ||
50 | while (1) | ||
51 | asm volatile ( | ||
52 | " .set mips32 \n" | ||
53 | " wait \n" | ||
54 | " .set mips0 \n"); | ||
55 | } | ||
56 | |||
57 | void __init board_setup(void) | ||
58 | { | ||
59 | u32 pin_func, static_cfg0; | ||
60 | u32 sys_freqctrl, sys_clksrc; | ||
61 | u32 prid = read_c0_prid(); | ||
62 | |||
63 | sys_freqctrl = 0; | ||
64 | sys_clksrc = 0; | ||
65 | |||
66 | /* Set AUX clock to 12 MHz * 8 = 96 MHz */ | ||
67 | au_writel(8, SYS_AUXPLL); | ||
68 | alchemy_gpio1_input_enable(); | ||
69 | udelay(100); | ||
70 | |||
71 | #if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) | ||
72 | /* Zero and disable FREQ2 */ | ||
73 | sys_freqctrl = au_readl(SYS_FREQCTRL0); | ||
74 | sys_freqctrl &= ~0xFFF00000; | ||
75 | au_writel(sys_freqctrl, SYS_FREQCTRL0); | ||
76 | |||
77 | /* Zero and disable USBH/USBD clocks */ | ||
78 | sys_clksrc = au_readl(SYS_CLKSRC); | ||
79 | sys_clksrc &= ~(SYS_CS_CUD | SYS_CS_DUD | SYS_CS_MUD_MASK | | ||
80 | SYS_CS_CUH | SYS_CS_DUH | SYS_CS_MUH_MASK); | ||
81 | au_writel(sys_clksrc, SYS_CLKSRC); | ||
82 | |||
83 | sys_freqctrl = au_readl(SYS_FREQCTRL0); | ||
84 | sys_freqctrl &= ~0xFFF00000; | ||
85 | |||
86 | sys_clksrc = au_readl(SYS_CLKSRC); | ||
87 | sys_clksrc &= ~(SYS_CS_CUD | SYS_CS_DUD | SYS_CS_MUD_MASK | | ||
88 | SYS_CS_CUH | SYS_CS_DUH | SYS_CS_MUH_MASK); | ||
89 | |||
90 | switch (prid & 0x000000FF) { | ||
91 | case 0x00: /* DA */ | ||
92 | case 0x01: /* HA */ | ||
93 | case 0x02: /* HB */ | ||
94 | /* CPU core freq to 48 MHz to slow it way down... */ | ||
95 | au_writel(4, SYS_CPUPLL); | ||
96 | |||
97 | /* | ||
98 | * Setup 48 MHz FREQ2 from CPUPLL for USB Host | ||
99 | * FRDIV2 = 3 -> div by 8 of 384 MHz -> 48 MHz | ||
100 | */ | ||
101 | sys_freqctrl |= (3 << SYS_FC_FRDIV2_BIT) | SYS_FC_FE2; | ||
102 | au_writel(sys_freqctrl, SYS_FREQCTRL0); | ||
103 | |||
104 | /* CPU core freq to 384 MHz */ | ||
105 | au_writel(0x20, SYS_CPUPLL); | ||
106 | |||
107 | printk(KERN_INFO "Au1000: 48 MHz OHCI workaround enabled\n"); | ||
108 | break; | ||
109 | |||
110 | default: /* HC and newer */ | ||
111 | /* FREQ2 = aux / 2 = 48 MHz */ | ||
112 | sys_freqctrl |= (0 << SYS_FC_FRDIV2_BIT) | | ||
113 | SYS_FC_FE2 | SYS_FC_FS2; | ||
114 | au_writel(sys_freqctrl, SYS_FREQCTRL0); | ||
115 | break; | ||
116 | } | ||
117 | |||
118 | /* | ||
119 | * Route 48 MHz FREQ2 into USB Host and/or Device | ||
120 | */ | ||
121 | sys_clksrc |= SYS_CS_MUX_FQ2 << SYS_CS_MUH_BIT; | ||
122 | au_writel(sys_clksrc, SYS_CLKSRC); | ||
123 | |||
124 | /* Configure pins GPIO[14:9] as GPIO */ | ||
125 | pin_func = au_readl(SYS_PINFUNC) & ~(SYS_PF_UR3 | SYS_PF_USB); | ||
126 | |||
127 | /* 2nd USB port is USB host */ | ||
128 | pin_func |= SYS_PF_USB; | ||
129 | |||
130 | au_writel(pin_func, SYS_PINFUNC); | ||
131 | |||
132 | alchemy_gpio_direction_input(11); | ||
133 | alchemy_gpio_direction_input(13); | ||
134 | alchemy_gpio_direction_output(4, 0); | ||
135 | alchemy_gpio_direction_output(5, 0); | ||
136 | #endif /* defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) */ | ||
137 | |||
138 | /* Make GPIO 15 an input (for interrupt line) */ | ||
139 | pin_func = au_readl(SYS_PINFUNC) & ~SYS_PF_IRF; | ||
140 | /* We don't need I2S, so make it available for GPIO[31:29] */ | ||
141 | pin_func |= SYS_PF_I2S; | ||
142 | au_writel(pin_func, SYS_PINFUNC); | ||
143 | |||
144 | alchemy_gpio_direction_input(15); | ||
145 | |||
146 | static_cfg0 = au_readl(MEM_STCFG0) & ~0xc00; | ||
147 | au_writel(static_cfg0, MEM_STCFG0); | ||
148 | |||
149 | /* configure RCE2* for LCD */ | ||
150 | au_writel(0x00000004, MEM_STCFG2); | ||
151 | |||
152 | /* MEM_STTIME2 */ | ||
153 | au_writel(0x09000000, MEM_STTIME2); | ||
154 | |||
155 | /* Set 32-bit base address decoding for RCE2* */ | ||
156 | au_writel(0x10003ff0, MEM_STADDR2); | ||
157 | |||
158 | /* | ||
159 | * PCI CPLD setup | ||
160 | * Expand CE0 to cover PCI | ||
161 | */ | ||
162 | au_writel(0x11803e40, MEM_STADDR1); | ||
163 | |||
164 | /* Burst visibility on */ | ||
165 | au_writel(au_readl(MEM_STCFG0) | 0x1000, MEM_STCFG0); | ||
166 | |||
167 | au_writel(0x83, MEM_STCFG1); /* ewait enabled, flash timing */ | ||
168 | au_writel(0x33030a10, MEM_STTIME1); /* slower timing for FPGA */ | ||
169 | |||
170 | /* Setup the static bus controller */ | ||
171 | au_writel(0x00000002, MEM_STCFG3); /* type = PCMCIA */ | ||
172 | au_writel(0x280E3D07, MEM_STTIME3); /* 250ns cycle time */ | ||
173 | au_writel(0x10000000, MEM_STADDR3); /* any PCMCIA select */ | ||
174 | |||
175 | /* | ||
176 | * Enable Au1000 BCLK switching - note: sed1356 must not use | ||
177 | * its BCLK (Au1000 LCLK) for any timings | ||
178 | */ | ||
179 | switch (prid & 0x000000FF) { | ||
180 | case 0x00: /* DA */ | ||
181 | case 0x01: /* HA */ | ||
182 | case 0x02: /* HB */ | ||
183 | break; | ||
184 | default: /* HC and newer */ | ||
185 | /* | ||
186 | * Enable sys bus clock divider when IDLE state or no bus | ||
187 | * activity. | ||
188 | */ | ||
189 | au_writel(au_readl(SYS_POWERCTRL) | (0x3 << 5), SYS_POWERCTRL); | ||
190 | break; | ||
191 | } | ||
192 | |||
193 | pm_power_off = board_power_off; | ||
194 | _machine_halt = board_power_off; | ||
195 | _machine_restart = board_reset; | ||
196 | } | ||
197 | |||
198 | static int __init pb1000_init_irq(void) | ||
199 | { | ||
200 | irq_set_irq_type(AU1000_GPIO15_INT, IRQF_TRIGGER_LOW); | ||
201 | return 0; | ||
202 | } | ||
203 | arch_initcall(pb1000_init_irq); | ||
204 | |||
205 | static int __init pb1000_device_init(void) | ||
206 | { | ||
207 | return db1x_register_norflash(8 * 1024 * 1024, 4, 0); | ||
208 | } | ||
209 | device_initcall(pb1000_device_init); | ||
diff --git a/arch/mips/alchemy/devboards/pb1100/Makefile b/arch/mips/alchemy/devboards/pb1100/Makefile new file mode 100644 index 00000000000..7e3756c83fe --- /dev/null +++ b/arch/mips/alchemy/devboards/pb1100/Makefile | |||
@@ -0,0 +1,8 @@ | |||
1 | # | ||
2 | # Copyright 2000, 2001, 2008 MontaVista Software Inc. | ||
3 | # Author: MontaVista Software, Inc. <source@mvista.com> | ||
4 | # | ||
5 | # Makefile for the Alchemy Semiconductor Pb1100 board. | ||
6 | # | ||
7 | |||
8 | obj-y := board_setup.o platform.o | ||
diff --git a/arch/mips/alchemy/devboards/pb1100/board_setup.c b/arch/mips/alchemy/devboards/pb1100/board_setup.c new file mode 100644 index 00000000000..d108fd573aa --- /dev/null +++ b/arch/mips/alchemy/devboards/pb1100/board_setup.c | |||
@@ -0,0 +1,127 @@ | |||
1 | /* | ||
2 | * Copyright 2002, 2008 MontaVista Software Inc. | ||
3 | * Author: MontaVista Software, Inc. <source@mvista.com> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms of the GNU General Public License as published by the | ||
7 | * Free Software Foundation; either version 2 of the License, or (at your | ||
8 | * option) any later version. | ||
9 | * | ||
10 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
11 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
12 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
13 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
14 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
15 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
16 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
17 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
18 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
19 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
20 | * | ||
21 | * You should have received a copy of the GNU General Public License along | ||
22 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
23 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
24 | */ | ||
25 | |||
26 | #include <linux/gpio.h> | ||
27 | #include <linux/init.h> | ||
28 | #include <linux/delay.h> | ||
29 | #include <linux/interrupt.h> | ||
30 | |||
31 | #include <asm/mach-au1x00/au1000.h> | ||
32 | #include <asm/mach-db1x00/bcsr.h> | ||
33 | |||
34 | #include <prom.h> | ||
35 | |||
36 | |||
37 | const char *get_system_type(void) | ||
38 | { | ||
39 | return "Alchemy Pb1100"; | ||
40 | } | ||
41 | |||
42 | void __init board_setup(void) | ||
43 | { | ||
44 | volatile void __iomem *base = (volatile void __iomem *)0xac000000UL; | ||
45 | |||
46 | bcsr_init(DB1000_BCSR_PHYS_ADDR, | ||
47 | DB1000_BCSR_PHYS_ADDR + DB1000_BCSR_HEXLED_OFS); | ||
48 | |||
49 | /* Set AUX clock to 12 MHz * 8 = 96 MHz */ | ||
50 | au_writel(8, SYS_AUXPLL); | ||
51 | alchemy_gpio1_input_enable(); | ||
52 | udelay(100); | ||
53 | |||
54 | #if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) | ||
55 | { | ||
56 | u32 pin_func, sys_freqctrl, sys_clksrc; | ||
57 | |||
58 | /* Configure pins GPIO[14:9] as GPIO */ | ||
59 | pin_func = au_readl(SYS_PINFUNC) & ~SYS_PF_UR3; | ||
60 | |||
61 | /* Zero and disable FREQ2 */ | ||
62 | sys_freqctrl = au_readl(SYS_FREQCTRL0); | ||
63 | sys_freqctrl &= ~0xFFF00000; | ||
64 | au_writel(sys_freqctrl, SYS_FREQCTRL0); | ||
65 | |||
66 | /* Zero and disable USBH/USBD/IrDA clock */ | ||
67 | sys_clksrc = au_readl(SYS_CLKSRC); | ||
68 | sys_clksrc &= ~(SYS_CS_CIR | SYS_CS_DIR | SYS_CS_MIR_MASK); | ||
69 | au_writel(sys_clksrc, SYS_CLKSRC); | ||
70 | |||
71 | sys_freqctrl = au_readl(SYS_FREQCTRL0); | ||
72 | sys_freqctrl &= ~0xFFF00000; | ||
73 | |||
74 | sys_clksrc = au_readl(SYS_CLKSRC); | ||
75 | sys_clksrc &= ~(SYS_CS_CIR | SYS_CS_DIR | SYS_CS_MIR_MASK); | ||
76 | |||
77 | /* FREQ2 = aux / 2 = 48 MHz */ | ||
78 | sys_freqctrl |= (0 << SYS_FC_FRDIV2_BIT) | | ||
79 | SYS_FC_FE2 | SYS_FC_FS2; | ||
80 | au_writel(sys_freqctrl, SYS_FREQCTRL0); | ||
81 | |||
82 | /* | ||
83 | * Route 48 MHz FREQ2 into USBH/USBD/IrDA | ||
84 | */ | ||
85 | sys_clksrc |= SYS_CS_MUX_FQ2 << SYS_CS_MIR_BIT; | ||
86 | au_writel(sys_clksrc, SYS_CLKSRC); | ||
87 | |||
88 | /* Setup the static bus controller */ | ||
89 | au_writel(0x00000002, MEM_STCFG3); /* type = PCMCIA */ | ||
90 | au_writel(0x280E3D07, MEM_STTIME3); /* 250ns cycle time */ | ||
91 | au_writel(0x10000000, MEM_STADDR3); /* any PCMCIA select */ | ||
92 | |||
93 | /* | ||
94 | * Get USB Functionality pin state (device vs host drive pins). | ||
95 | */ | ||
96 | pin_func = au_readl(SYS_PINFUNC) & ~SYS_PF_USB; | ||
97 | /* 2nd USB port is USB host. */ | ||
98 | pin_func |= SYS_PF_USB; | ||
99 | au_writel(pin_func, SYS_PINFUNC); | ||
100 | } | ||
101 | #endif /* defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) */ | ||
102 | |||
103 | /* Enable sys bus clock divider when IDLE state or no bus activity. */ | ||
104 | au_writel(au_readl(SYS_POWERCTRL) | (0x3 << 5), SYS_POWERCTRL); | ||
105 | |||
106 | /* Enable the RTC if not already enabled. */ | ||
107 | if (!(readb(base + 0x28) & 0x20)) { | ||
108 | writeb(readb(base + 0x28) | 0x20, base + 0x28); | ||
109 | au_sync(); | ||
110 | } | ||
111 | /* Put the clock in BCD mode. */ | ||
112 | if (readb(base + 0x2C) & 0x4) { /* reg B */ | ||
113 | writeb(readb(base + 0x2c) & ~0x4, base + 0x2c); | ||
114 | au_sync(); | ||
115 | } | ||
116 | } | ||
117 | |||
118 | static int __init pb1100_init_irq(void) | ||
119 | { | ||
120 | irq_set_irq_type(AU1100_GPIO9_INT, IRQF_TRIGGER_LOW); /* PCCD# */ | ||
121 | irq_set_irq_type(AU1100_GPIO10_INT, IRQF_TRIGGER_LOW); /* PCSTSCHG# */ | ||
122 | irq_set_irq_type(AU1100_GPIO11_INT, IRQF_TRIGGER_LOW); /* PCCard# */ | ||
123 | irq_set_irq_type(AU1100_GPIO13_INT, IRQF_TRIGGER_LOW); /* DC_IRQ# */ | ||
124 | |||
125 | return 0; | ||
126 | } | ||
127 | arch_initcall(pb1100_init_irq); | ||
diff --git a/arch/mips/alchemy/devboards/pb1100/platform.c b/arch/mips/alchemy/devboards/pb1100/platform.c new file mode 100644 index 00000000000..2c8dc29759f --- /dev/null +++ b/arch/mips/alchemy/devboards/pb1100/platform.c | |||
@@ -0,0 +1,50 @@ | |||
1 | /* | ||
2 | * Pb1100 board platform device registration | ||
3 | * | ||
4 | * Copyright (C) 2009 Manuel Lauss | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
19 | */ | ||
20 | |||
21 | #include <linux/init.h> | ||
22 | |||
23 | #include <asm/mach-au1x00/au1000.h> | ||
24 | #include <asm/mach-db1x00/bcsr.h> | ||
25 | |||
26 | #include "../platform.h" | ||
27 | |||
28 | static int __init pb1100_dev_init(void) | ||
29 | { | ||
30 | int swapped; | ||
31 | |||
32 | /* PCMCIA. single socket, identical to Pb1500 */ | ||
33 | db1x_register_pcmcia_socket(PCMCIA_ATTR_PHYS_ADDR, | ||
34 | PCMCIA_ATTR_PHYS_ADDR + 0x000400000 - 1, | ||
35 | PCMCIA_MEM_PHYS_ADDR, | ||
36 | PCMCIA_MEM_PHYS_ADDR + 0x000400000 - 1, | ||
37 | PCMCIA_IO_PHYS_ADDR, | ||
38 | PCMCIA_IO_PHYS_ADDR + 0x000010000 - 1, | ||
39 | AU1100_GPIO11_INT, /* card */ | ||
40 | AU1100_GPIO9_INT, /* insert */ | ||
41 | /*AU1100_GPIO10_INT*/0, /* stschg */ | ||
42 | 0, /* eject */ | ||
43 | 0); /* id */ | ||
44 | |||
45 | swapped = bcsr_read(BCSR_STATUS) & BCSR_STATUS_DB1000_SWAPBOOT; | ||
46 | db1x_register_norflash(64 * 1024 * 1024, 4, swapped); | ||
47 | |||
48 | return 0; | ||
49 | } | ||
50 | device_initcall(pb1100_dev_init); | ||
diff --git a/arch/mips/alchemy/devboards/pb1200/Makefile b/arch/mips/alchemy/devboards/pb1200/Makefile new file mode 100644 index 00000000000..18c1bd53e4c --- /dev/null +++ b/arch/mips/alchemy/devboards/pb1200/Makefile | |||
@@ -0,0 +1,5 @@ | |||
1 | # | ||
2 | # Makefile for the Alchemy Semiconductor Pb1200/DBAu1200 boards. | ||
3 | # | ||
4 | |||
5 | obj-y := board_setup.o platform.o | ||
diff --git a/arch/mips/alchemy/devboards/pb1200/board_setup.c b/arch/mips/alchemy/devboards/pb1200/board_setup.c new file mode 100644 index 00000000000..6d06b07c238 --- /dev/null +++ b/arch/mips/alchemy/devboards/pb1200/board_setup.c | |||
@@ -0,0 +1,174 @@ | |||
1 | /* | ||
2 | * | ||
3 | * BRIEF MODULE DESCRIPTION | ||
4 | * Alchemy Pb1200/Db1200 board setup. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License as published by the | ||
8 | * Free Software Foundation; either version 2 of the License, or (at your | ||
9 | * option) any later version. | ||
10 | * | ||
11 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
12 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
13 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
14 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
15 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
16 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
17 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
18 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
19 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
20 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
21 | * | ||
22 | * You should have received a copy of the GNU General Public License along | ||
23 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
24 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
25 | */ | ||
26 | |||
27 | #include <linux/init.h> | ||
28 | #include <linux/interrupt.h> | ||
29 | #include <linux/sched.h> | ||
30 | |||
31 | #include <asm/mach-au1x00/au1000.h> | ||
32 | #include <asm/mach-db1x00/bcsr.h> | ||
33 | |||
34 | #ifdef CONFIG_MIPS_PB1200 | ||
35 | #include <asm/mach-pb1x00/pb1200.h> | ||
36 | #endif | ||
37 | |||
38 | #ifdef CONFIG_MIPS_DB1200 | ||
39 | #include <asm/mach-db1x00/db1200.h> | ||
40 | #define PB1200_INT_BEGIN DB1200_INT_BEGIN | ||
41 | #define PB1200_INT_END DB1200_INT_END | ||
42 | #endif | ||
43 | |||
44 | #include <prom.h> | ||
45 | |||
46 | const char *get_system_type(void) | ||
47 | { | ||
48 | return "Alchemy Pb1200"; | ||
49 | } | ||
50 | |||
51 | void __init board_setup(void) | ||
52 | { | ||
53 | printk(KERN_INFO "AMD Alchemy Pb1200 Board\n"); | ||
54 | bcsr_init(PB1200_BCSR_PHYS_ADDR, | ||
55 | PB1200_BCSR_PHYS_ADDR + PB1200_BCSR_HEXLED_OFS); | ||
56 | |||
57 | #if 0 | ||
58 | { | ||
59 | u32 pin_func; | ||
60 | |||
61 | /* | ||
62 | * Enable PSC1 SYNC for AC97. Normaly done in audio driver, | ||
63 | * but it is board specific code, so put it here. | ||
64 | */ | ||
65 | pin_func = au_readl(SYS_PINFUNC); | ||
66 | au_sync(); | ||
67 | pin_func |= SYS_PF_MUST_BE_SET | SYS_PF_PSC1_S1; | ||
68 | au_writel(pin_func, SYS_PINFUNC); | ||
69 | |||
70 | au_writel(0, (u32)bcsr | 0x10); /* turn off PCMCIA power */ | ||
71 | au_sync(); | ||
72 | } | ||
73 | #endif | ||
74 | |||
75 | #if defined(CONFIG_I2C_AU1550) | ||
76 | { | ||
77 | u32 freq0, clksrc; | ||
78 | u32 pin_func; | ||
79 | |||
80 | /* Select SMBus in CPLD */ | ||
81 | bcsr_mod(BCSR_RESETS, BCSR_RESETS_PSC0MUX, 0); | ||
82 | |||
83 | pin_func = au_readl(SYS_PINFUNC); | ||
84 | au_sync(); | ||
85 | pin_func &= ~(SYS_PINFUNC_P0A | SYS_PINFUNC_P0B); | ||
86 | /* Set GPIOs correctly */ | ||
87 | pin_func |= 2 << 17; | ||
88 | au_writel(pin_func, SYS_PINFUNC); | ||
89 | au_sync(); | ||
90 | |||
91 | /* The I2C driver depends on 50 MHz clock */ | ||
92 | freq0 = au_readl(SYS_FREQCTRL0); | ||
93 | au_sync(); | ||
94 | freq0 &= ~(SYS_FC_FRDIV1_MASK | SYS_FC_FS1 | SYS_FC_FE1); | ||
95 | freq0 |= 3 << SYS_FC_FRDIV1_BIT; | ||
96 | /* 396 MHz / (3 + 1) * 2 == 49.5 MHz */ | ||
97 | au_writel(freq0, SYS_FREQCTRL0); | ||
98 | au_sync(); | ||
99 | freq0 |= SYS_FC_FE1; | ||
100 | au_writel(freq0, SYS_FREQCTRL0); | ||
101 | au_sync(); | ||
102 | |||
103 | clksrc = au_readl(SYS_CLKSRC); | ||
104 | au_sync(); | ||
105 | clksrc &= ~(SYS_CS_CE0 | SYS_CS_DE0 | SYS_CS_ME0_MASK); | ||
106 | /* Bit 22 is EXTCLK0 for PSC0 */ | ||
107 | clksrc |= SYS_CS_MUX_FQ1 << SYS_CS_ME0_BIT; | ||
108 | au_writel(clksrc, SYS_CLKSRC); | ||
109 | au_sync(); | ||
110 | } | ||
111 | #endif | ||
112 | |||
113 | /* | ||
114 | * The Pb1200 development board uses external MUX for PSC0 to | ||
115 | * support SMB/SPI. bcsr_resets bit 12: 0=SMB 1=SPI | ||
116 | */ | ||
117 | #ifdef CONFIG_I2C_AU1550 | ||
118 | bcsr_mod(BCSR_RESETS, BCSR_RESETS_PSC0MUX, 0); | ||
119 | #endif | ||
120 | au_sync(); | ||
121 | } | ||
122 | |||
123 | static int __init pb1200_init_irq(void) | ||
124 | { | ||
125 | /* We have a problem with CPLD rev 3. */ | ||
126 | if (BCSR_WHOAMI_CPLD(bcsr_read(BCSR_WHOAMI)) <= 3) { | ||
127 | printk(KERN_ERR "WARNING!!!\n"); | ||
128 | printk(KERN_ERR "WARNING!!!\n"); | ||
129 | printk(KERN_ERR "WARNING!!!\n"); | ||
130 | printk(KERN_ERR "WARNING!!!\n"); | ||
131 | printk(KERN_ERR "WARNING!!!\n"); | ||
132 | printk(KERN_ERR "WARNING!!!\n"); | ||
133 | printk(KERN_ERR "Pb1200 must be at CPLD rev 4. Please have Pb1200\n"); | ||
134 | printk(KERN_ERR "updated to latest revision. This software will\n"); | ||
135 | printk(KERN_ERR "not work on anything less than CPLD rev 4.\n"); | ||
136 | printk(KERN_ERR "WARNING!!!\n"); | ||
137 | printk(KERN_ERR "WARNING!!!\n"); | ||
138 | printk(KERN_ERR "WARNING!!!\n"); | ||
139 | printk(KERN_ERR "WARNING!!!\n"); | ||
140 | printk(KERN_ERR "WARNING!!!\n"); | ||
141 | printk(KERN_ERR "WARNING!!!\n"); | ||
142 | panic("Game over. Your score is 0."); | ||
143 | } | ||
144 | |||
145 | irq_set_irq_type(AU1200_GPIO7_INT, IRQF_TRIGGER_LOW); | ||
146 | bcsr_init_irq(PB1200_INT_BEGIN, PB1200_INT_END, AU1200_GPIO7_INT); | ||
147 | |||
148 | return 0; | ||
149 | } | ||
150 | arch_initcall(pb1200_init_irq); | ||
151 | |||
152 | |||
153 | int board_au1200fb_panel(void) | ||
154 | { | ||
155 | return (bcsr_read(BCSR_SWITCHES) >> 8) & 0x0f; | ||
156 | } | ||
157 | |||
158 | int board_au1200fb_panel_init(void) | ||
159 | { | ||
160 | /* Apply power */ | ||
161 | bcsr_mod(BCSR_BOARD, 0, BCSR_BOARD_LCDVEE | BCSR_BOARD_LCDVDD | | ||
162 | BCSR_BOARD_LCDBL); | ||
163 | /* printk(KERN_DEBUG "board_au1200fb_panel_init()\n"); */ | ||
164 | return 0; | ||
165 | } | ||
166 | |||
167 | int board_au1200fb_panel_shutdown(void) | ||
168 | { | ||
169 | /* Remove power */ | ||
170 | bcsr_mod(BCSR_BOARD, BCSR_BOARD_LCDVEE | BCSR_BOARD_LCDVDD | | ||
171 | BCSR_BOARD_LCDBL, 0); | ||
172 | /* printk(KERN_DEBUG "board_au1200fb_panel_shutdown()\n"); */ | ||
173 | return 0; | ||
174 | } | ||
diff --git a/arch/mips/alchemy/devboards/pb1200/platform.c b/arch/mips/alchemy/devboards/pb1200/platform.c new file mode 100644 index 00000000000..3ef2dceeb79 --- /dev/null +++ b/arch/mips/alchemy/devboards/pb1200/platform.c | |||
@@ -0,0 +1,203 @@ | |||
1 | /* | ||
2 | * Pb1200/DBAu1200 board platform device registration | ||
3 | * | ||
4 | * Copyright (C) 2008 MontaVista Software Inc. <source@mvista.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
19 | */ | ||
20 | |||
21 | #include <linux/dma-mapping.h> | ||
22 | #include <linux/init.h> | ||
23 | #include <linux/leds.h> | ||
24 | #include <linux/platform_device.h> | ||
25 | #include <linux/smc91x.h> | ||
26 | |||
27 | #include <asm/mach-au1x00/au1xxx.h> | ||
28 | #include <asm/mach-au1x00/au1100_mmc.h> | ||
29 | #include <asm/mach-db1x00/bcsr.h> | ||
30 | |||
31 | #include "../platform.h" | ||
32 | |||
33 | static int mmc_activity; | ||
34 | |||
35 | static void pb1200mmc0_set_power(void *mmc_host, int state) | ||
36 | { | ||
37 | if (state) | ||
38 | bcsr_mod(BCSR_BOARD, 0, BCSR_BOARD_SD0PWR); | ||
39 | else | ||
40 | bcsr_mod(BCSR_BOARD, BCSR_BOARD_SD0PWR, 0); | ||
41 | |||
42 | msleep(1); | ||
43 | } | ||
44 | |||
45 | static int pb1200mmc0_card_readonly(void *mmc_host) | ||
46 | { | ||
47 | return (bcsr_read(BCSR_STATUS) & BCSR_STATUS_SD0WP) ? 1 : 0; | ||
48 | } | ||
49 | |||
50 | static int pb1200mmc0_card_inserted(void *mmc_host) | ||
51 | { | ||
52 | return (bcsr_read(BCSR_SIGSTAT) & BCSR_INT_SD0INSERT) ? 1 : 0; | ||
53 | } | ||
54 | |||
55 | static void pb1200_mmcled_set(struct led_classdev *led, | ||
56 | enum led_brightness brightness) | ||
57 | { | ||
58 | if (brightness != LED_OFF) { | ||
59 | if (++mmc_activity == 1) | ||
60 | bcsr_mod(BCSR_LEDS, BCSR_LEDS_LED0, 0); | ||
61 | } else { | ||
62 | if (--mmc_activity == 0) | ||
63 | bcsr_mod(BCSR_LEDS, 0, BCSR_LEDS_LED0); | ||
64 | } | ||
65 | } | ||
66 | |||
67 | static struct led_classdev pb1200mmc_led = { | ||
68 | .brightness_set = pb1200_mmcled_set, | ||
69 | }; | ||
70 | |||
71 | static void pb1200mmc1_set_power(void *mmc_host, int state) | ||
72 | { | ||
73 | if (state) | ||
74 | bcsr_mod(BCSR_BOARD, 0, BCSR_BOARD_SD1PWR); | ||
75 | else | ||
76 | bcsr_mod(BCSR_BOARD, BCSR_BOARD_SD1PWR, 0); | ||
77 | |||
78 | msleep(1); | ||
79 | } | ||
80 | |||
81 | static int pb1200mmc1_card_readonly(void *mmc_host) | ||
82 | { | ||
83 | return (bcsr_read(BCSR_STATUS) & BCSR_STATUS_SD1WP) ? 1 : 0; | ||
84 | } | ||
85 | |||
86 | static int pb1200mmc1_card_inserted(void *mmc_host) | ||
87 | { | ||
88 | return (bcsr_read(BCSR_SIGSTAT) & BCSR_INT_SD1INSERT) ? 1 : 0; | ||
89 | } | ||
90 | |||
91 | const struct au1xmmc_platform_data au1xmmc_platdata[2] = { | ||
92 | [0] = { | ||
93 | .set_power = pb1200mmc0_set_power, | ||
94 | .card_inserted = pb1200mmc0_card_inserted, | ||
95 | .card_readonly = pb1200mmc0_card_readonly, | ||
96 | .cd_setup = NULL, /* use poll-timer in driver */ | ||
97 | .led = &pb1200mmc_led, | ||
98 | }, | ||
99 | [1] = { | ||
100 | .set_power = pb1200mmc1_set_power, | ||
101 | .card_inserted = pb1200mmc1_card_inserted, | ||
102 | .card_readonly = pb1200mmc1_card_readonly, | ||
103 | .cd_setup = NULL, /* use poll-timer in driver */ | ||
104 | .led = &pb1200mmc_led, | ||
105 | }, | ||
106 | }; | ||
107 | |||
108 | static struct resource ide_resources[] = { | ||
109 | [0] = { | ||
110 | .start = IDE_PHYS_ADDR, | ||
111 | .end = IDE_PHYS_ADDR + IDE_PHYS_LEN - 1, | ||
112 | .flags = IORESOURCE_MEM | ||
113 | }, | ||
114 | [1] = { | ||
115 | .start = IDE_INT, | ||
116 | .end = IDE_INT, | ||
117 | .flags = IORESOURCE_IRQ | ||
118 | } | ||
119 | }; | ||
120 | |||
121 | static u64 ide_dmamask = DMA_BIT_MASK(32); | ||
122 | |||
123 | static struct platform_device ide_device = { | ||
124 | .name = "au1200-ide", | ||
125 | .id = 0, | ||
126 | .dev = { | ||
127 | .dma_mask = &ide_dmamask, | ||
128 | .coherent_dma_mask = DMA_BIT_MASK(32), | ||
129 | }, | ||
130 | .num_resources = ARRAY_SIZE(ide_resources), | ||
131 | .resource = ide_resources | ||
132 | }; | ||
133 | |||
134 | static struct smc91x_platdata smc_data = { | ||
135 | .flags = SMC91X_NOWAIT | SMC91X_USE_16BIT, | ||
136 | .leda = RPC_LED_100_10, | ||
137 | .ledb = RPC_LED_TX_RX, | ||
138 | }; | ||
139 | |||
140 | static struct resource smc91c111_resources[] = { | ||
141 | [0] = { | ||
142 | .name = "smc91x-regs", | ||
143 | .start = SMC91C111_PHYS_ADDR, | ||
144 | .end = SMC91C111_PHYS_ADDR + 0xf, | ||
145 | .flags = IORESOURCE_MEM | ||
146 | }, | ||
147 | [1] = { | ||
148 | .start = SMC91C111_INT, | ||
149 | .end = SMC91C111_INT, | ||
150 | .flags = IORESOURCE_IRQ | ||
151 | }, | ||
152 | }; | ||
153 | |||
154 | static struct platform_device smc91c111_device = { | ||
155 | .dev = { | ||
156 | .platform_data = &smc_data, | ||
157 | }, | ||
158 | .name = "smc91x", | ||
159 | .id = -1, | ||
160 | .num_resources = ARRAY_SIZE(smc91c111_resources), | ||
161 | .resource = smc91c111_resources | ||
162 | }; | ||
163 | |||
164 | static struct platform_device *board_platform_devices[] __initdata = { | ||
165 | &ide_device, | ||
166 | &smc91c111_device | ||
167 | }; | ||
168 | |||
169 | static int __init board_register_devices(void) | ||
170 | { | ||
171 | int swapped; | ||
172 | |||
173 | db1x_register_pcmcia_socket(PCMCIA_ATTR_PHYS_ADDR, | ||
174 | PCMCIA_ATTR_PHYS_ADDR + 0x000400000 - 1, | ||
175 | PCMCIA_MEM_PHYS_ADDR, | ||
176 | PCMCIA_MEM_PHYS_ADDR + 0x000400000 - 1, | ||
177 | PCMCIA_IO_PHYS_ADDR, | ||
178 | PCMCIA_IO_PHYS_ADDR + 0x000010000 - 1, | ||
179 | PB1200_PC0_INT, | ||
180 | PB1200_PC0_INSERT_INT, | ||
181 | /*PB1200_PC0_STSCHG_INT*/0, | ||
182 | PB1200_PC0_EJECT_INT, | ||
183 | 0); | ||
184 | |||
185 | db1x_register_pcmcia_socket(PCMCIA_ATTR_PHYS_ADDR + 0x008000000, | ||
186 | PCMCIA_ATTR_PHYS_ADDR + 0x008400000 - 1, | ||
187 | PCMCIA_MEM_PHYS_ADDR + 0x008000000, | ||
188 | PCMCIA_MEM_PHYS_ADDR + 0x008400000 - 1, | ||
189 | PCMCIA_IO_PHYS_ADDR + 0x008000000, | ||
190 | PCMCIA_IO_PHYS_ADDR + 0x008010000 - 1, | ||
191 | PB1200_PC1_INT, | ||
192 | PB1200_PC1_INSERT_INT, | ||
193 | /*PB1200_PC1_STSCHG_INT*/0, | ||
194 | PB1200_PC1_EJECT_INT, | ||
195 | 1); | ||
196 | |||
197 | swapped = bcsr_read(BCSR_STATUS) & BCSR_STATUS_DB1200_SWAPBOOT; | ||
198 | db1x_register_norflash(128 * 1024 * 1024, 2, swapped); | ||
199 | |||
200 | return platform_add_devices(board_platform_devices, | ||
201 | ARRAY_SIZE(board_platform_devices)); | ||
202 | } | ||
203 | device_initcall(board_register_devices); | ||
diff --git a/arch/mips/alchemy/devboards/pb1500/Makefile b/arch/mips/alchemy/devboards/pb1500/Makefile new file mode 100644 index 00000000000..e83b151b5b6 --- /dev/null +++ b/arch/mips/alchemy/devboards/pb1500/Makefile | |||
@@ -0,0 +1,8 @@ | |||
1 | # | ||
2 | # Copyright 2000, 2001, 2008 MontaVista Software Inc. | ||
3 | # Author: MontaVista Software, Inc. <source@mvista.com> | ||
4 | # | ||
5 | # Makefile for the Alchemy Semiconductor Pb1500 board. | ||
6 | # | ||
7 | |||
8 | obj-y := board_setup.o platform.o | ||
diff --git a/arch/mips/alchemy/devboards/pb1500/board_setup.c b/arch/mips/alchemy/devboards/pb1500/board_setup.c new file mode 100644 index 00000000000..3b4fa320696 --- /dev/null +++ b/arch/mips/alchemy/devboards/pb1500/board_setup.c | |||
@@ -0,0 +1,148 @@ | |||
1 | /* | ||
2 | * Copyright 2000, 2008 MontaVista Software Inc. | ||
3 | * Author: MontaVista Software, Inc. <source@mvista.com> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms of the GNU General Public License as published by the | ||
7 | * Free Software Foundation; either version 2 of the License, or (at your | ||
8 | * option) any later version. | ||
9 | * | ||
10 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
11 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
12 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
13 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
14 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
15 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
16 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
17 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
18 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
19 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
20 | * | ||
21 | * You should have received a copy of the GNU General Public License along | ||
22 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
23 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
24 | */ | ||
25 | |||
26 | #include <linux/delay.h> | ||
27 | #include <linux/gpio.h> | ||
28 | #include <linux/init.h> | ||
29 | #include <linux/interrupt.h> | ||
30 | |||
31 | #include <asm/mach-au1x00/au1000.h> | ||
32 | #include <asm/mach-db1x00/bcsr.h> | ||
33 | |||
34 | #include <prom.h> | ||
35 | |||
36 | |||
37 | char irq_tab_alchemy[][5] __initdata = { | ||
38 | [12] = { -1, AU1500_PCI_INTA, 0xff, 0xff, 0xff }, /* IDSEL 12 - HPT370 */ | ||
39 | [13] = { -1, AU1500_PCI_INTA, AU1500_PCI_INTB, AU1500_PCI_INTC, AU1500_PCI_INTD }, /* IDSEL 13 - PCI slot */ | ||
40 | }; | ||
41 | |||
42 | |||
43 | const char *get_system_type(void) | ||
44 | { | ||
45 | return "Alchemy Pb1500"; | ||
46 | } | ||
47 | |||
48 | void __init board_setup(void) | ||
49 | { | ||
50 | u32 pin_func; | ||
51 | u32 sys_freqctrl, sys_clksrc; | ||
52 | |||
53 | bcsr_init(DB1000_BCSR_PHYS_ADDR, | ||
54 | DB1000_BCSR_PHYS_ADDR + DB1000_BCSR_HEXLED_OFS); | ||
55 | |||
56 | sys_clksrc = sys_freqctrl = pin_func = 0; | ||
57 | /* Set AUX clock to 12 MHz * 8 = 96 MHz */ | ||
58 | au_writel(8, SYS_AUXPLL); | ||
59 | alchemy_gpio1_input_enable(); | ||
60 | udelay(100); | ||
61 | |||
62 | /* GPIO201 is input for PCMCIA card detect */ | ||
63 | /* GPIO203 is input for PCMCIA interrupt request */ | ||
64 | alchemy_gpio_direction_input(201); | ||
65 | alchemy_gpio_direction_input(203); | ||
66 | |||
67 | #if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) | ||
68 | |||
69 | /* Zero and disable FREQ2 */ | ||
70 | sys_freqctrl = au_readl(SYS_FREQCTRL0); | ||
71 | sys_freqctrl &= ~0xFFF00000; | ||
72 | au_writel(sys_freqctrl, SYS_FREQCTRL0); | ||
73 | |||
74 | /* zero and disable USBH/USBD clocks */ | ||
75 | sys_clksrc = au_readl(SYS_CLKSRC); | ||
76 | sys_clksrc &= ~(SYS_CS_CUD | SYS_CS_DUD | SYS_CS_MUD_MASK | | ||
77 | SYS_CS_CUH | SYS_CS_DUH | SYS_CS_MUH_MASK); | ||
78 | au_writel(sys_clksrc, SYS_CLKSRC); | ||
79 | |||
80 | sys_freqctrl = au_readl(SYS_FREQCTRL0); | ||
81 | sys_freqctrl &= ~0xFFF00000; | ||
82 | |||
83 | sys_clksrc = au_readl(SYS_CLKSRC); | ||
84 | sys_clksrc &= ~(SYS_CS_CUD | SYS_CS_DUD | SYS_CS_MUD_MASK | | ||
85 | SYS_CS_CUH | SYS_CS_DUH | SYS_CS_MUH_MASK); | ||
86 | |||
87 | /* FREQ2 = aux/2 = 48 MHz */ | ||
88 | sys_freqctrl |= (0 << SYS_FC_FRDIV2_BIT) | SYS_FC_FE2 | SYS_FC_FS2; | ||
89 | au_writel(sys_freqctrl, SYS_FREQCTRL0); | ||
90 | |||
91 | /* | ||
92 | * Route 48MHz FREQ2 into USB Host and/or Device | ||
93 | */ | ||
94 | sys_clksrc |= SYS_CS_MUX_FQ2 << SYS_CS_MUH_BIT; | ||
95 | au_writel(sys_clksrc, SYS_CLKSRC); | ||
96 | |||
97 | pin_func = au_readl(SYS_PINFUNC) & ~SYS_PF_USB; | ||
98 | /* 2nd USB port is USB host */ | ||
99 | pin_func |= SYS_PF_USB; | ||
100 | au_writel(pin_func, SYS_PINFUNC); | ||
101 | #endif /* defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) */ | ||
102 | |||
103 | #ifdef CONFIG_PCI | ||
104 | /* Setup PCI bus controller */ | ||
105 | au_writel(0, Au1500_PCI_CMEM); | ||
106 | au_writel(0x00003fff, Au1500_CFG_BASE); | ||
107 | #if defined(__MIPSEB__) | ||
108 | au_writel(0xf | (2 << 6) | (1 << 4), Au1500_PCI_CFG); | ||
109 | #else | ||
110 | au_writel(0xf, Au1500_PCI_CFG); | ||
111 | #endif | ||
112 | au_writel(0xf0000000, Au1500_PCI_MWMASK_DEV); | ||
113 | au_writel(0, Au1500_PCI_MWBASE_REV_CCL); | ||
114 | au_writel(0x02a00356, Au1500_PCI_STATCMD); | ||
115 | au_writel(0x00003c04, Au1500_PCI_HDRTYPE); | ||
116 | au_writel(0x00000008, Au1500_PCI_MBAR); | ||
117 | au_sync(); | ||
118 | #endif | ||
119 | |||
120 | /* Enable sys bus clock divider when IDLE state or no bus activity. */ | ||
121 | au_writel(au_readl(SYS_POWERCTRL) | (0x3 << 5), SYS_POWERCTRL); | ||
122 | |||
123 | /* Enable the RTC if not already enabled */ | ||
124 | if (!(au_readl(0xac000028) & 0x20)) { | ||
125 | printk(KERN_INFO "enabling clock ...\n"); | ||
126 | au_writel((au_readl(0xac000028) | 0x20), 0xac000028); | ||
127 | } | ||
128 | /* Put the clock in BCD mode */ | ||
129 | if (au_readl(0xac00002c) & 0x4) { /* reg B */ | ||
130 | au_writel(au_readl(0xac00002c) & ~0x4, 0xac00002c); | ||
131 | au_sync(); | ||
132 | } | ||
133 | } | ||
134 | |||
135 | static int __init pb1500_init_irq(void) | ||
136 | { | ||
137 | irq_set_irq_type(AU1500_GPIO9_INT, IRQF_TRIGGER_LOW); /* CD0# */ | ||
138 | irq_set_irq_type(AU1500_GPIO10_INT, IRQF_TRIGGER_LOW); /* CARD0 */ | ||
139 | irq_set_irq_type(AU1500_GPIO11_INT, IRQF_TRIGGER_LOW); /* STSCHG0# */ | ||
140 | irq_set_irq_type(AU1500_GPIO204_INT, IRQF_TRIGGER_HIGH); | ||
141 | irq_set_irq_type(AU1500_GPIO201_INT, IRQF_TRIGGER_LOW); | ||
142 | irq_set_irq_type(AU1500_GPIO202_INT, IRQF_TRIGGER_LOW); | ||
143 | irq_set_irq_type(AU1500_GPIO203_INT, IRQF_TRIGGER_LOW); | ||
144 | irq_set_irq_type(AU1500_GPIO205_INT, IRQF_TRIGGER_LOW); | ||
145 | |||
146 | return 0; | ||
147 | } | ||
148 | arch_initcall(pb1500_init_irq); | ||
diff --git a/arch/mips/alchemy/devboards/pb1500/platform.c b/arch/mips/alchemy/devboards/pb1500/platform.c new file mode 100644 index 00000000000..d443bc7aa76 --- /dev/null +++ b/arch/mips/alchemy/devboards/pb1500/platform.c | |||
@@ -0,0 +1,49 @@ | |||
1 | /* | ||
2 | * Pb1500 board platform device registration | ||
3 | * | ||
4 | * Copyright (C) 2009 Manuel Lauss | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
19 | */ | ||
20 | |||
21 | #include <linux/init.h> | ||
22 | #include <asm/mach-au1x00/au1000.h> | ||
23 | #include <asm/mach-db1x00/bcsr.h> | ||
24 | |||
25 | #include "../platform.h" | ||
26 | |||
27 | static int __init pb1500_dev_init(void) | ||
28 | { | ||
29 | int swapped; | ||
30 | |||
31 | /* PCMCIA. single socket, identical to Pb1500 */ | ||
32 | db1x_register_pcmcia_socket(PCMCIA_ATTR_PHYS_ADDR, | ||
33 | PCMCIA_ATTR_PHYS_ADDR + 0x000400000 - 1, | ||
34 | PCMCIA_MEM_PHYS_ADDR, | ||
35 | PCMCIA_MEM_PHYS_ADDR + 0x000400000 - 1, | ||
36 | PCMCIA_IO_PHYS_ADDR, | ||
37 | PCMCIA_IO_PHYS_ADDR + 0x000010000 - 1, | ||
38 | AU1500_GPIO11_INT, /* card */ | ||
39 | AU1500_GPIO9_INT, /* insert */ | ||
40 | /*AU1500_GPIO10_INT*/0, /* stschg */ | ||
41 | 0, /* eject */ | ||
42 | 0); /* id */ | ||
43 | |||
44 | swapped = bcsr_read(BCSR_STATUS) & BCSR_STATUS_DB1000_SWAPBOOT; | ||
45 | db1x_register_norflash(64 * 1024 * 1024, 4, swapped); | ||
46 | |||
47 | return 0; | ||
48 | } | ||
49 | device_initcall(pb1500_dev_init); | ||
diff --git a/arch/mips/alchemy/devboards/pb1550/Makefile b/arch/mips/alchemy/devboards/pb1550/Makefile new file mode 100644 index 00000000000..9661b6ec5dd --- /dev/null +++ b/arch/mips/alchemy/devboards/pb1550/Makefile | |||
@@ -0,0 +1,8 @@ | |||
1 | # | ||
2 | # Copyright 2000, 2008 MontaVista Software Inc. | ||
3 | # Author: MontaVista Software, Inc. <source@mvista.com> | ||
4 | # | ||
5 | # Makefile for the Alchemy Semiconductor Pb1550 board. | ||
6 | # | ||
7 | |||
8 | obj-y := board_setup.o platform.o | ||
diff --git a/arch/mips/alchemy/devboards/pb1550/board_setup.c b/arch/mips/alchemy/devboards/pb1550/board_setup.c new file mode 100644 index 00000000000..b790213848b --- /dev/null +++ b/arch/mips/alchemy/devboards/pb1550/board_setup.c | |||
@@ -0,0 +1,86 @@ | |||
1 | /* | ||
2 | * | ||
3 | * BRIEF MODULE DESCRIPTION | ||
4 | * Alchemy Pb1550 board setup. | ||
5 | * | ||
6 | * Copyright 2000, 2008 MontaVista Software Inc. | ||
7 | * Author: MontaVista Software, Inc. <source@mvista.com> | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify it | ||
10 | * under the terms of the GNU General Public License as published by the | ||
11 | * Free Software Foundation; either version 2 of the License, or (at your | ||
12 | * option) any later version. | ||
13 | * | ||
14 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
15 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
16 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
17 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
18 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
19 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
20 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
21 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
22 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
23 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
24 | * | ||
25 | * You should have received a copy of the GNU General Public License along | ||
26 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
27 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
28 | */ | ||
29 | |||
30 | #include <linux/init.h> | ||
31 | #include <linux/interrupt.h> | ||
32 | |||
33 | #include <asm/mach-au1x00/au1000.h> | ||
34 | #include <asm/mach-pb1x00/pb1550.h> | ||
35 | #include <asm/mach-db1x00/bcsr.h> | ||
36 | #include <asm/mach-au1x00/gpio.h> | ||
37 | |||
38 | #include <prom.h> | ||
39 | |||
40 | |||
41 | char irq_tab_alchemy[][5] __initdata = { | ||
42 | [12] = { -1, AU1550_PCI_INTB, AU1550_PCI_INTC, AU1550_PCI_INTD, AU1550_PCI_INTA }, /* IDSEL 12 - PCI slot 2 (left) */ | ||
43 | [13] = { -1, AU1550_PCI_INTA, AU1550_PCI_INTB, AU1550_PCI_INTC, AU1550_PCI_INTD }, /* IDSEL 13 - PCI slot 1 (right) */ | ||
44 | }; | ||
45 | |||
46 | const char *get_system_type(void) | ||
47 | { | ||
48 | return "Alchemy Pb1550"; | ||
49 | } | ||
50 | |||
51 | void __init board_setup(void) | ||
52 | { | ||
53 | u32 pin_func; | ||
54 | |||
55 | bcsr_init(PB1550_BCSR_PHYS_ADDR, | ||
56 | PB1550_BCSR_PHYS_ADDR + PB1550_BCSR_HEXLED_OFS); | ||
57 | |||
58 | alchemy_gpio2_enable(); | ||
59 | |||
60 | /* | ||
61 | * Enable PSC1 SYNC for AC'97. Normaly done in audio driver, | ||
62 | * but it is board specific code, so put it here. | ||
63 | */ | ||
64 | pin_func = au_readl(SYS_PINFUNC); | ||
65 | au_sync(); | ||
66 | pin_func |= SYS_PF_MUST_BE_SET | SYS_PF_PSC1_S1; | ||
67 | au_writel(pin_func, SYS_PINFUNC); | ||
68 | |||
69 | bcsr_write(BCSR_PCMCIA, 0); /* turn off PCMCIA power */ | ||
70 | |||
71 | printk(KERN_INFO "AMD Alchemy Pb1550 Board\n"); | ||
72 | } | ||
73 | |||
74 | static int __init pb1550_init_irq(void) | ||
75 | { | ||
76 | irq_set_irq_type(AU1550_GPIO0_INT, IRQF_TRIGGER_LOW); | ||
77 | irq_set_irq_type(AU1550_GPIO1_INT, IRQF_TRIGGER_LOW); | ||
78 | irq_set_irq_type(AU1550_GPIO201_205_INT, IRQF_TRIGGER_HIGH); | ||
79 | |||
80 | /* enable both PCMCIA card irqs in the shared line */ | ||
81 | alchemy_gpio2_enable_int(201); | ||
82 | alchemy_gpio2_enable_int(202); | ||
83 | |||
84 | return 0; | ||
85 | } | ||
86 | arch_initcall(pb1550_init_irq); | ||
diff --git a/arch/mips/alchemy/devboards/pb1550/platform.c b/arch/mips/alchemy/devboards/pb1550/platform.c new file mode 100644 index 00000000000..d7150d0f49c --- /dev/null +++ b/arch/mips/alchemy/devboards/pb1550/platform.c | |||
@@ -0,0 +1,69 @@ | |||
1 | /* | ||
2 | * Pb1550 board platform device registration | ||
3 | * | ||
4 | * Copyright (C) 2009 Manuel Lauss | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
19 | */ | ||
20 | |||
21 | #include <linux/init.h> | ||
22 | |||
23 | #include <asm/mach-au1x00/au1000.h> | ||
24 | #include <asm/mach-pb1x00/pb1550.h> | ||
25 | #include <asm/mach-db1x00/bcsr.h> | ||
26 | |||
27 | #include "../platform.h" | ||
28 | |||
29 | static int __init pb1550_dev_init(void) | ||
30 | { | ||
31 | int swapped; | ||
32 | |||
33 | /* Pb1550, like all others, also has statuschange irqs; however they're | ||
34 | * wired up on one of the Au1550's shared GPIO201_205 line, which also | ||
35 | * services the PCMCIA card interrupts. So we ignore statuschange and | ||
36 | * use the GPIO201_205 exclusively for card interrupts, since a) pcmcia | ||
37 | * drivers are used to shared irqs and b) statuschange isn't really use- | ||
38 | * ful anyway. | ||
39 | */ | ||
40 | db1x_register_pcmcia_socket(PCMCIA_ATTR_PHYS_ADDR, | ||
41 | PCMCIA_ATTR_PHYS_ADDR + 0x000400000 - 1, | ||
42 | PCMCIA_MEM_PHYS_ADDR, | ||
43 | PCMCIA_MEM_PHYS_ADDR + 0x000400000 - 1, | ||
44 | PCMCIA_IO_PHYS_ADDR, | ||
45 | PCMCIA_IO_PHYS_ADDR + 0x000010000 - 1, | ||
46 | AU1550_GPIO201_205_INT, | ||
47 | AU1550_GPIO0_INT, | ||
48 | 0, | ||
49 | 0, | ||
50 | 0); | ||
51 | |||
52 | db1x_register_pcmcia_socket(PCMCIA_ATTR_PHYS_ADDR + 0x008000000, | ||
53 | PCMCIA_ATTR_PHYS_ADDR + 0x008400000 - 1, | ||
54 | PCMCIA_MEM_PHYS_ADDR + 0x008000000, | ||
55 | PCMCIA_MEM_PHYS_ADDR + 0x008400000 - 1, | ||
56 | PCMCIA_IO_PHYS_ADDR + 0x008000000, | ||
57 | PCMCIA_IO_PHYS_ADDR + 0x008010000 - 1, | ||
58 | AU1550_GPIO201_205_INT, | ||
59 | AU1550_GPIO1_INT, | ||
60 | 0, | ||
61 | 0, | ||
62 | 1); | ||
63 | |||
64 | swapped = bcsr_read(BCSR_STATUS) & BCSR_STATUS_PB1550_SWAPBOOT; | ||
65 | db1x_register_norflash(128 * 1024 * 1024, 4, swapped); | ||
66 | |||
67 | return 0; | ||
68 | } | ||
69 | device_initcall(pb1550_dev_init); | ||
diff --git a/arch/mips/alchemy/devboards/prom.c b/arch/mips/alchemy/devboards/prom.c new file mode 100644 index 00000000000..e5306b56da6 --- /dev/null +++ b/arch/mips/alchemy/devboards/prom.c | |||
@@ -0,0 +1,66 @@ | |||
1 | /* | ||
2 | * Common code used by all Alchemy develboards. | ||
3 | * | ||
4 | * Extracted from files which had this to say: | ||
5 | * | ||
6 | * Copyright 2000, 2008 MontaVista Software Inc. | ||
7 | * Author: MontaVista Software, Inc. <source@mvista.com> | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify it | ||
10 | * under the terms of the GNU General Public License as published by the | ||
11 | * Free Software Foundation; either version 2 of the License, or (at your | ||
12 | * option) any later version. | ||
13 | * | ||
14 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
15 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
16 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
17 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
18 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
19 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
20 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
21 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
22 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
23 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
24 | * | ||
25 | * You should have received a copy of the GNU General Public License along | ||
26 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
27 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
28 | */ | ||
29 | |||
30 | #include <linux/init.h> | ||
31 | #include <linux/kernel.h> | ||
32 | #include <asm/bootinfo.h> | ||
33 | #include <asm/mach-au1x00/au1000.h> | ||
34 | #include <prom.h> | ||
35 | |||
36 | #if defined(CONFIG_MIPS_PB1000) || defined(CONFIG_MIPS_DB1000) || \ | ||
37 | defined(CONFIG_MIPS_PB1100) || defined(CONFIG_MIPS_DB1100) || \ | ||
38 | defined(CONFIG_MIPS_PB1500) || defined(CONFIG_MIPS_DB1500) || \ | ||
39 | defined(CONFIG_MIPS_BOSPORUS) || defined(CONFIG_MIPS_MIRAGE) | ||
40 | #define ALCHEMY_BOARD_DEFAULT_MEMSIZE 0x04000000 | ||
41 | |||
42 | #else /* Au1550/Au1200-based develboards */ | ||
43 | #define ALCHEMY_BOARD_DEFAULT_MEMSIZE 0x08000000 | ||
44 | #endif | ||
45 | |||
46 | void __init prom_init(void) | ||
47 | { | ||
48 | unsigned char *memsize_str; | ||
49 | unsigned long memsize; | ||
50 | |||
51 | prom_argc = (int)fw_arg0; | ||
52 | prom_argv = (char **)fw_arg1; | ||
53 | prom_envp = (char **)fw_arg2; | ||
54 | |||
55 | prom_init_cmdline(); | ||
56 | memsize_str = prom_getenv("memsize"); | ||
57 | if (!memsize_str || strict_strtoul(memsize_str, 0, &memsize)) | ||
58 | memsize = ALCHEMY_BOARD_DEFAULT_MEMSIZE; | ||
59 | |||
60 | add_memory_region(0, memsize, BOOT_MEM_RAM); | ||
61 | } | ||
62 | |||
63 | void prom_putchar(unsigned char c) | ||
64 | { | ||
65 | alchemy_uart_putchar(AU1000_UART0_PHYS_ADDR, c); | ||
66 | } | ||
diff --git a/arch/mips/alchemy/gpr/Makefile b/arch/mips/alchemy/gpr/Makefile new file mode 100644 index 00000000000..cb73fe256dc --- /dev/null +++ b/arch/mips/alchemy/gpr/Makefile | |||
@@ -0,0 +1,8 @@ | |||
1 | # | ||
2 | # Copyright 2003 MontaVista Software Inc. | ||
3 | # Author: MontaVista Software, Inc. <source@mvista.com> | ||
4 | # | ||
5 | # Makefile for Trapeze ITS GPR board. | ||
6 | # | ||
7 | |||
8 | obj-y += board_setup.o init.o platform.o | ||
diff --git a/arch/mips/alchemy/gpr/board_setup.c b/arch/mips/alchemy/gpr/board_setup.c new file mode 100644 index 00000000000..5f8f0691ed2 --- /dev/null +++ b/arch/mips/alchemy/gpr/board_setup.c | |||
@@ -0,0 +1,87 @@ | |||
1 | /* | ||
2 | * Copyright 2010 Wolfgang Grandegger <wg@denx.de> | ||
3 | * | ||
4 | * Copyright 2000-2003, 2008 MontaVista Software Inc. | ||
5 | * Author: MontaVista Software, Inc. <source@mvista.com> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify it | ||
8 | * under the terms of the GNU General Public License as published by the | ||
9 | * Free Software Foundation; either version 2 of the License, or (at your | ||
10 | * option) any later version. | ||
11 | * | ||
12 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
13 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
14 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
15 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
16 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
17 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
18 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
19 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
20 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
21 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
22 | * | ||
23 | * You should have received a copy of the GNU General Public License along | ||
24 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
25 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
26 | */ | ||
27 | |||
28 | #include <linux/gpio.h> | ||
29 | #include <linux/init.h> | ||
30 | #include <linux/interrupt.h> | ||
31 | #include <linux/delay.h> | ||
32 | #include <linux/pm.h> | ||
33 | |||
34 | #include <asm/reboot.h> | ||
35 | #include <asm/mach-au1x00/au1000.h> | ||
36 | |||
37 | #include <prom.h> | ||
38 | |||
39 | char irq_tab_alchemy[][5] __initdata = { | ||
40 | [0] = { -1, AU1500_PCI_INTA, AU1500_PCI_INTB, 0xff, 0xff }, | ||
41 | }; | ||
42 | |||
43 | static void gpr_reset(char *c) | ||
44 | { | ||
45 | /* switch System-LED to orange (red# and green# on) */ | ||
46 | alchemy_gpio_direction_output(4, 0); | ||
47 | alchemy_gpio_direction_output(5, 0); | ||
48 | |||
49 | /* trigger watchdog to reset board in 200ms */ | ||
50 | printk(KERN_EMERG "Triggering watchdog soft reset...\n"); | ||
51 | raw_local_irq_disable(); | ||
52 | alchemy_gpio_direction_output(1, 0); | ||
53 | udelay(1); | ||
54 | alchemy_gpio_set_value(1, 1); | ||
55 | while (1) | ||
56 | cpu_wait(); | ||
57 | } | ||
58 | |||
59 | static void gpr_power_off(void) | ||
60 | { | ||
61 | while (1) | ||
62 | cpu_wait(); | ||
63 | } | ||
64 | |||
65 | void __init board_setup(void) | ||
66 | { | ||
67 | printk(KERN_INFO "Trapeze ITS GPR board\n"); | ||
68 | |||
69 | pm_power_off = gpr_power_off; | ||
70 | _machine_halt = gpr_power_off; | ||
71 | _machine_restart = gpr_reset; | ||
72 | |||
73 | /* Enable UART1/3 */ | ||
74 | alchemy_uart_enable(AU1000_UART3_PHYS_ADDR); | ||
75 | alchemy_uart_enable(AU1000_UART1_PHYS_ADDR); | ||
76 | |||
77 | /* Take away Reset of UMTS-card */ | ||
78 | alchemy_gpio_direction_output(215, 1); | ||
79 | |||
80 | #ifdef CONFIG_PCI | ||
81 | #if defined(__MIPSEB__) | ||
82 | au_writel(0xf | (2 << 6) | (1 << 4), Au1500_PCI_CFG); | ||
83 | #else | ||
84 | au_writel(0xf, Au1500_PCI_CFG); | ||
85 | #endif | ||
86 | #endif | ||
87 | } | ||
diff --git a/arch/mips/alchemy/gpr/init.c b/arch/mips/alchemy/gpr/init.c new file mode 100644 index 00000000000..229aafae680 --- /dev/null +++ b/arch/mips/alchemy/gpr/init.c | |||
@@ -0,0 +1,63 @@ | |||
1 | /* | ||
2 | * Copyright 2010 Wolfgang Grandegger <wg@denx.de> | ||
3 | * | ||
4 | * Copyright 2003, 2008 MontaVista Software Inc. | ||
5 | * Author: MontaVista Software, Inc. <source@mvista.com> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify it | ||
8 | * under the terms of the GNU General Public License as published by the | ||
9 | * Free Software Foundation; either version 2 of the License, or (at your | ||
10 | * option) any later version. | ||
11 | * | ||
12 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
13 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
14 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
15 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
16 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
17 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
18 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
19 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
20 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
21 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
22 | * | ||
23 | * You should have received a copy of the GNU General Public License along | ||
24 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
25 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
26 | */ | ||
27 | |||
28 | #include <linux/init.h> | ||
29 | #include <linux/kernel.h> | ||
30 | |||
31 | #include <asm/bootinfo.h> | ||
32 | #include <asm/mach-au1x00/au1000.h> | ||
33 | |||
34 | #include <prom.h> | ||
35 | |||
36 | const char *get_system_type(void) | ||
37 | { | ||
38 | return "GPR"; | ||
39 | } | ||
40 | |||
41 | void __init prom_init(void) | ||
42 | { | ||
43 | unsigned char *memsize_str; | ||
44 | unsigned long memsize; | ||
45 | |||
46 | prom_argc = fw_arg0; | ||
47 | prom_argv = (char **)fw_arg1; | ||
48 | prom_envp = (char **)fw_arg2; | ||
49 | |||
50 | prom_init_cmdline(); | ||
51 | |||
52 | memsize_str = prom_getenv("memsize"); | ||
53 | if (!memsize_str) | ||
54 | memsize = 0x04000000; | ||
55 | else | ||
56 | strict_strtoul(memsize_str, 0, &memsize); | ||
57 | add_memory_region(0, memsize, BOOT_MEM_RAM); | ||
58 | } | ||
59 | |||
60 | void prom_putchar(unsigned char c) | ||
61 | { | ||
62 | alchemy_uart_putchar(AU1000_UART0_PHYS_ADDR, c); | ||
63 | } | ||
diff --git a/arch/mips/alchemy/gpr/platform.c b/arch/mips/alchemy/gpr/platform.c new file mode 100644 index 00000000000..14b46629cfc --- /dev/null +++ b/arch/mips/alchemy/gpr/platform.c | |||
@@ -0,0 +1,183 @@ | |||
1 | /* | ||
2 | * GPR board platform device registration | ||
3 | * | ||
4 | * Copyright (C) 2010 Wolfgang Grandegger <wg@denx.de> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
19 | */ | ||
20 | |||
21 | #include <linux/init.h> | ||
22 | #include <linux/platform_device.h> | ||
23 | #include <linux/mtd/partitions.h> | ||
24 | #include <linux/mtd/physmap.h> | ||
25 | #include <linux/leds.h> | ||
26 | #include <linux/gpio.h> | ||
27 | #include <linux/i2c.h> | ||
28 | #include <linux/i2c-gpio.h> | ||
29 | |||
30 | #include <asm/mach-au1x00/au1000.h> | ||
31 | |||
32 | /* | ||
33 | * Watchdog | ||
34 | */ | ||
35 | static struct resource gpr_wdt_resource[] = { | ||
36 | [0] = { | ||
37 | .start = 1, | ||
38 | .end = 1, | ||
39 | .name = "gpr-adm6320-wdt", | ||
40 | .flags = IORESOURCE_IRQ, | ||
41 | } | ||
42 | }; | ||
43 | |||
44 | static struct platform_device gpr_wdt_device = { | ||
45 | .name = "adm6320-wdt", | ||
46 | .id = 0, | ||
47 | .num_resources = ARRAY_SIZE(gpr_wdt_resource), | ||
48 | .resource = gpr_wdt_resource, | ||
49 | }; | ||
50 | |||
51 | /* | ||
52 | * FLASH | ||
53 | * | ||
54 | * 0x00000000-0x00200000 : "kernel" | ||
55 | * 0x00200000-0x00a00000 : "rootfs" | ||
56 | * 0x01d00000-0x01f00000 : "config" | ||
57 | * 0x01c00000-0x01d00000 : "yamon" | ||
58 | * 0x01d00000-0x01d40000 : "yamon env vars" | ||
59 | * 0x00000000-0x00a00000 : "kernel+rootfs" | ||
60 | */ | ||
61 | static struct mtd_partition gpr_mtd_partitions[] = { | ||
62 | { | ||
63 | .name = "kernel", | ||
64 | .size = 0x00200000, | ||
65 | .offset = 0, | ||
66 | }, | ||
67 | { | ||
68 | .name = "rootfs", | ||
69 | .size = 0x00800000, | ||
70 | .offset = MTDPART_OFS_APPEND, | ||
71 | .mask_flags = MTD_WRITEABLE, | ||
72 | }, | ||
73 | { | ||
74 | .name = "config", | ||
75 | .size = 0x00200000, | ||
76 | .offset = 0x01d00000, | ||
77 | }, | ||
78 | { | ||
79 | .name = "yamon", | ||
80 | .size = 0x00100000, | ||
81 | .offset = 0x01c00000, | ||
82 | }, | ||
83 | { | ||
84 | .name = "yamon env vars", | ||
85 | .size = 0x00040000, | ||
86 | .offset = MTDPART_OFS_APPEND, | ||
87 | }, | ||
88 | { | ||
89 | .name = "kernel+rootfs", | ||
90 | .size = 0x00a00000, | ||
91 | .offset = 0, | ||
92 | }, | ||
93 | }; | ||
94 | |||
95 | static struct physmap_flash_data gpr_flash_data = { | ||
96 | .width = 4, | ||
97 | .nr_parts = ARRAY_SIZE(gpr_mtd_partitions), | ||
98 | .parts = gpr_mtd_partitions, | ||
99 | }; | ||
100 | |||
101 | static struct resource gpr_mtd_resource = { | ||
102 | .start = 0x1e000000, | ||
103 | .end = 0x1fffffff, | ||
104 | .flags = IORESOURCE_MEM, | ||
105 | }; | ||
106 | |||
107 | static struct platform_device gpr_mtd_device = { | ||
108 | .name = "physmap-flash", | ||
109 | .dev = { | ||
110 | .platform_data = &gpr_flash_data, | ||
111 | }, | ||
112 | .num_resources = 1, | ||
113 | .resource = &gpr_mtd_resource, | ||
114 | }; | ||
115 | |||
116 | /* | ||
117 | * LEDs | ||
118 | */ | ||
119 | static struct gpio_led gpr_gpio_leds[] = { | ||
120 | { /* green */ | ||
121 | .name = "gpr:green", | ||
122 | .gpio = 4, | ||
123 | .active_low = 1, | ||
124 | }, | ||
125 | { /* red */ | ||
126 | .name = "gpr:red", | ||
127 | .gpio = 5, | ||
128 | .active_low = 1, | ||
129 | } | ||
130 | }; | ||
131 | |||
132 | static struct gpio_led_platform_data gpr_led_data = { | ||
133 | .num_leds = ARRAY_SIZE(gpr_gpio_leds), | ||
134 | .leds = gpr_gpio_leds, | ||
135 | }; | ||
136 | |||
137 | static struct platform_device gpr_led_devices = { | ||
138 | .name = "leds-gpio", | ||
139 | .id = -1, | ||
140 | .dev = { | ||
141 | .platform_data = &gpr_led_data, | ||
142 | } | ||
143 | }; | ||
144 | |||
145 | /* | ||
146 | * I2C | ||
147 | */ | ||
148 | static struct i2c_gpio_platform_data gpr_i2c_data = { | ||
149 | .sda_pin = 209, | ||
150 | .sda_is_open_drain = 1, | ||
151 | .scl_pin = 210, | ||
152 | .scl_is_open_drain = 1, | ||
153 | .udelay = 2, /* ~100 kHz */ | ||
154 | .timeout = HZ, | ||
155 | }; | ||
156 | |||
157 | static struct platform_device gpr_i2c_device = { | ||
158 | .name = "i2c-gpio", | ||
159 | .id = -1, | ||
160 | .dev.platform_data = &gpr_i2c_data, | ||
161 | }; | ||
162 | |||
163 | static struct i2c_board_info gpr_i2c_info[] __initdata = { | ||
164 | { | ||
165 | I2C_BOARD_INFO("lm83", 0x18), | ||
166 | .type = "lm83" | ||
167 | } | ||
168 | }; | ||
169 | |||
170 | static struct platform_device *gpr_devices[] __initdata = { | ||
171 | &gpr_wdt_device, | ||
172 | &gpr_mtd_device, | ||
173 | &gpr_i2c_device, | ||
174 | &gpr_led_devices, | ||
175 | }; | ||
176 | |||
177 | static int __init gpr_dev_init(void) | ||
178 | { | ||
179 | i2c_register_board_info(0, gpr_i2c_info, ARRAY_SIZE(gpr_i2c_info)); | ||
180 | |||
181 | return platform_add_devices(gpr_devices, ARRAY_SIZE(gpr_devices)); | ||
182 | } | ||
183 | device_initcall(gpr_dev_init); | ||
diff --git a/arch/mips/alchemy/mtx-1/Makefile b/arch/mips/alchemy/mtx-1/Makefile new file mode 100644 index 00000000000..81b540ceaf8 --- /dev/null +++ b/arch/mips/alchemy/mtx-1/Makefile | |||
@@ -0,0 +1,9 @@ | |||
1 | # | ||
2 | # Copyright 2003 MontaVista Software Inc. | ||
3 | # Author: MontaVista Software, Inc. <source@mvista.com> | ||
4 | # Bruno Randolf <bruno.randolf@4g-systems.biz> | ||
5 | # | ||
6 | # Makefile for 4G Systems MTX-1 board. | ||
7 | # | ||
8 | |||
9 | obj-y += init.o board_setup.o platform.o | ||
diff --git a/arch/mips/alchemy/mtx-1/board_setup.c b/arch/mips/alchemy/mtx-1/board_setup.c new file mode 100644 index 00000000000..3ae984cf98c --- /dev/null +++ b/arch/mips/alchemy/mtx-1/board_setup.c | |||
@@ -0,0 +1,134 @@ | |||
1 | /* | ||
2 | * | ||
3 | * BRIEF MODULE DESCRIPTION | ||
4 | * 4G Systems MTX-1 board setup. | ||
5 | * | ||
6 | * Copyright 2003, 2008 MontaVista Software Inc. | ||
7 | * Author: MontaVista Software, Inc. <source@mvista.com> | ||
8 | * Bruno Randolf <bruno.randolf@4g-systems.biz> | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify it | ||
11 | * under the terms of the GNU General Public License as published by the | ||
12 | * Free Software Foundation; either version 2 of the License, or (at your | ||
13 | * option) any later version. | ||
14 | * | ||
15 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
16 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
17 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
18 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
19 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
20 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
21 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
22 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
23 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
24 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
25 | * | ||
26 | * You should have received a copy of the GNU General Public License along | ||
27 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
28 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
29 | */ | ||
30 | |||
31 | #include <linux/gpio.h> | ||
32 | #include <linux/init.h> | ||
33 | #include <linux/interrupt.h> | ||
34 | #include <linux/pm.h> | ||
35 | |||
36 | #include <asm/reboot.h> | ||
37 | #include <asm/mach-au1x00/au1000.h> | ||
38 | |||
39 | #include <prom.h> | ||
40 | |||
41 | char irq_tab_alchemy[][5] __initdata = { | ||
42 | [0] = { -1, AU1500_PCI_INTA, AU1500_PCI_INTA, 0xff, 0xff }, /* IDSEL 00 - AdapterA-Slot0 (top) */ | ||
43 | [1] = { -1, AU1500_PCI_INTB, AU1500_PCI_INTA, 0xff, 0xff }, /* IDSEL 01 - AdapterA-Slot1 (bottom) */ | ||
44 | [2] = { -1, AU1500_PCI_INTC, AU1500_PCI_INTD, 0xff, 0xff }, /* IDSEL 02 - AdapterB-Slot0 (top) */ | ||
45 | [3] = { -1, AU1500_PCI_INTD, AU1500_PCI_INTC, 0xff, 0xff }, /* IDSEL 03 - AdapterB-Slot1 (bottom) */ | ||
46 | [4] = { -1, AU1500_PCI_INTA, AU1500_PCI_INTB, 0xff, 0xff }, /* IDSEL 04 - AdapterC-Slot0 (top) */ | ||
47 | [5] = { -1, AU1500_PCI_INTB, AU1500_PCI_INTA, 0xff, 0xff }, /* IDSEL 05 - AdapterC-Slot1 (bottom) */ | ||
48 | [6] = { -1, AU1500_PCI_INTC, AU1500_PCI_INTD, 0xff, 0xff }, /* IDSEL 06 - AdapterD-Slot0 (top) */ | ||
49 | [7] = { -1, AU1500_PCI_INTD, AU1500_PCI_INTC, 0xff, 0xff }, /* IDSEL 07 - AdapterD-Slot1 (bottom) */ | ||
50 | }; | ||
51 | |||
52 | extern int (*board_pci_idsel)(unsigned int devsel, int assert); | ||
53 | int mtx1_pci_idsel(unsigned int devsel, int assert); | ||
54 | |||
55 | static void mtx1_reset(char *c) | ||
56 | { | ||
57 | /* Jump to the reset vector */ | ||
58 | __asm__ __volatile__("jr\t%0"::"r"(0xbfc00000)); | ||
59 | } | ||
60 | |||
61 | static void mtx1_power_off(void) | ||
62 | { | ||
63 | while (1) | ||
64 | asm volatile ( | ||
65 | " .set mips32 \n" | ||
66 | " wait \n" | ||
67 | " .set mips0 \n"); | ||
68 | } | ||
69 | |||
70 | void __init board_setup(void) | ||
71 | { | ||
72 | #if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) | ||
73 | /* Enable USB power switch */ | ||
74 | alchemy_gpio_direction_output(204, 0); | ||
75 | #endif /* defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) */ | ||
76 | |||
77 | #ifdef CONFIG_PCI | ||
78 | #if defined(__MIPSEB__) | ||
79 | au_writel(0xf | (2 << 6) | (1 << 4), Au1500_PCI_CFG); | ||
80 | #else | ||
81 | au_writel(0xf, Au1500_PCI_CFG); | ||
82 | #endif | ||
83 | board_pci_idsel = mtx1_pci_idsel; | ||
84 | #endif | ||
85 | |||
86 | /* Initialize sys_pinfunc */ | ||
87 | au_writel(SYS_PF_NI2, SYS_PINFUNC); | ||
88 | |||
89 | /* Initialize GPIO */ | ||
90 | au_writel(~0, KSEG1ADDR(AU1000_SYS_PHYS_ADDR) + SYS_TRIOUTCLR); | ||
91 | alchemy_gpio_direction_output(0, 0); /* Disable M66EN (PCI 66MHz) */ | ||
92 | alchemy_gpio_direction_output(3, 1); /* Disable PCI CLKRUN# */ | ||
93 | alchemy_gpio_direction_output(1, 1); /* Enable EXT_IO3 */ | ||
94 | alchemy_gpio_direction_output(5, 0); /* Disable eth PHY TX_ER */ | ||
95 | |||
96 | /* Enable LED and set it to green */ | ||
97 | alchemy_gpio_direction_output(211, 1); /* green on */ | ||
98 | alchemy_gpio_direction_output(212, 0); /* red off */ | ||
99 | |||
100 | pm_power_off = mtx1_power_off; | ||
101 | _machine_halt = mtx1_power_off; | ||
102 | _machine_restart = mtx1_reset; | ||
103 | |||
104 | printk(KERN_INFO "4G Systems MTX-1 Board\n"); | ||
105 | } | ||
106 | |||
107 | int | ||
108 | mtx1_pci_idsel(unsigned int devsel, int assert) | ||
109 | { | ||
110 | /* This function is only necessary to support a proprietary Cardbus | ||
111 | * adapter on the mtx-1 "singleboard" variant. It triggers a custom | ||
112 | * logic chip connected to EXT_IO3 (GPIO1) to suppress IDSEL signals. | ||
113 | */ | ||
114 | if (assert && devsel != 0) | ||
115 | /* Suppress signal to Cardbus */ | ||
116 | alchemy_gpio_set_value(1, 0); /* set EXT_IO3 OFF */ | ||
117 | else | ||
118 | alchemy_gpio_set_value(1, 1); /* set EXT_IO3 ON */ | ||
119 | |||
120 | udelay(1); | ||
121 | return 1; | ||
122 | } | ||
123 | |||
124 | static int __init mtx1_init_irq(void) | ||
125 | { | ||
126 | irq_set_irq_type(AU1500_GPIO204_INT, IRQF_TRIGGER_HIGH); | ||
127 | irq_set_irq_type(AU1500_GPIO201_INT, IRQF_TRIGGER_LOW); | ||
128 | irq_set_irq_type(AU1500_GPIO202_INT, IRQF_TRIGGER_LOW); | ||
129 | irq_set_irq_type(AU1500_GPIO203_INT, IRQF_TRIGGER_LOW); | ||
130 | irq_set_irq_type(AU1500_GPIO205_INT, IRQF_TRIGGER_LOW); | ||
131 | |||
132 | return 0; | ||
133 | } | ||
134 | arch_initcall(mtx1_init_irq); | ||
diff --git a/arch/mips/alchemy/mtx-1/init.c b/arch/mips/alchemy/mtx-1/init.c new file mode 100644 index 00000000000..2e81cc7f342 --- /dev/null +++ b/arch/mips/alchemy/mtx-1/init.c | |||
@@ -0,0 +1,66 @@ | |||
1 | /* | ||
2 | * | ||
3 | * BRIEF MODULE DESCRIPTION | ||
4 | * 4G Systems MTX-1 board setup | ||
5 | * | ||
6 | * Copyright 2003, 2008 MontaVista Software Inc. | ||
7 | * Author: MontaVista Software, Inc. <source@mvista.com> | ||
8 | * Bruno Randolf <bruno.randolf@4g-systems.biz> | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify it | ||
11 | * under the terms of the GNU General Public License as published by the | ||
12 | * Free Software Foundation; either version 2 of the License, or (at your | ||
13 | * option) any later version. | ||
14 | * | ||
15 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
16 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
17 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
18 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
19 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
20 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
21 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
22 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
23 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
24 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
25 | * | ||
26 | * You should have received a copy of the GNU General Public License along | ||
27 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
28 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
29 | */ | ||
30 | |||
31 | #include <linux/kernel.h> | ||
32 | #include <linux/init.h> | ||
33 | |||
34 | #include <asm/bootinfo.h> | ||
35 | #include <asm/mach-au1x00/au1000.h> | ||
36 | |||
37 | #include <prom.h> | ||
38 | |||
39 | const char *get_system_type(void) | ||
40 | { | ||
41 | return "MTX-1"; | ||
42 | } | ||
43 | |||
44 | void __init prom_init(void) | ||
45 | { | ||
46 | unsigned char *memsize_str; | ||
47 | unsigned long memsize; | ||
48 | |||
49 | prom_argc = fw_arg0; | ||
50 | prom_argv = (char **)fw_arg1; | ||
51 | prom_envp = (char **)fw_arg2; | ||
52 | |||
53 | prom_init_cmdline(); | ||
54 | |||
55 | memsize_str = prom_getenv("memsize"); | ||
56 | if (!memsize_str) | ||
57 | memsize = 0x04000000; | ||
58 | else | ||
59 | strict_strtoul(memsize_str, 0, &memsize); | ||
60 | add_memory_region(0, memsize, BOOT_MEM_RAM); | ||
61 | } | ||
62 | |||
63 | void prom_putchar(unsigned char c) | ||
64 | { | ||
65 | alchemy_uart_putchar(AU1000_UART0_PHYS_ADDR, c); | ||
66 | } | ||
diff --git a/arch/mips/alchemy/mtx-1/platform.c b/arch/mips/alchemy/mtx-1/platform.c new file mode 100644 index 00000000000..55628e390fd --- /dev/null +++ b/arch/mips/alchemy/mtx-1/platform.c | |||
@@ -0,0 +1,168 @@ | |||
1 | /* | ||
2 | * MTX-1 platform devices registration | ||
3 | * | ||
4 | * Copyright (C) 2007-2009, Florian Fainelli <florian@openwrt.org> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
19 | */ | ||
20 | |||
21 | #include <linux/init.h> | ||
22 | #include <linux/platform_device.h> | ||
23 | #include <linux/leds.h> | ||
24 | #include <linux/gpio.h> | ||
25 | #include <linux/gpio_keys.h> | ||
26 | #include <linux/input.h> | ||
27 | #include <linux/mtd/partitions.h> | ||
28 | #include <linux/mtd/physmap.h> | ||
29 | #include <mtd/mtd-abi.h> | ||
30 | |||
31 | #include <asm/mach-au1x00/au1xxx_eth.h> | ||
32 | |||
33 | static struct gpio_keys_button mtx1_gpio_button[] = { | ||
34 | { | ||
35 | .gpio = 207, | ||
36 | .code = BTN_0, | ||
37 | .desc = "System button", | ||
38 | } | ||
39 | }; | ||
40 | |||
41 | static struct gpio_keys_platform_data mtx1_buttons_data = { | ||
42 | .buttons = mtx1_gpio_button, | ||
43 | .nbuttons = ARRAY_SIZE(mtx1_gpio_button), | ||
44 | }; | ||
45 | |||
46 | static struct platform_device mtx1_button = { | ||
47 | .name = "gpio-keys", | ||
48 | .id = -1, | ||
49 | .dev = { | ||
50 | .platform_data = &mtx1_buttons_data, | ||
51 | } | ||
52 | }; | ||
53 | |||
54 | static struct resource mtx1_wdt_res[] = { | ||
55 | [0] = { | ||
56 | .start = 215, | ||
57 | .end = 215, | ||
58 | .name = "mtx1-wdt-gpio", | ||
59 | .flags = IORESOURCE_IRQ, | ||
60 | } | ||
61 | }; | ||
62 | |||
63 | static struct platform_device mtx1_wdt = { | ||
64 | .name = "mtx1-wdt", | ||
65 | .id = 0, | ||
66 | .num_resources = ARRAY_SIZE(mtx1_wdt_res), | ||
67 | .resource = mtx1_wdt_res, | ||
68 | }; | ||
69 | |||
70 | static struct gpio_led default_leds[] = { | ||
71 | { | ||
72 | .name = "mtx1:green", | ||
73 | .gpio = 211, | ||
74 | }, { | ||
75 | .name = "mtx1:red", | ||
76 | .gpio = 212, | ||
77 | }, | ||
78 | }; | ||
79 | |||
80 | static struct gpio_led_platform_data mtx1_led_data = { | ||
81 | .num_leds = ARRAY_SIZE(default_leds), | ||
82 | .leds = default_leds, | ||
83 | }; | ||
84 | |||
85 | static struct platform_device mtx1_gpio_leds = { | ||
86 | .name = "leds-gpio", | ||
87 | .id = -1, | ||
88 | .dev = { | ||
89 | .platform_data = &mtx1_led_data, | ||
90 | } | ||
91 | }; | ||
92 | |||
93 | static struct mtd_partition mtx1_mtd_partitions[] = { | ||
94 | { | ||
95 | .name = "filesystem", | ||
96 | .size = 0x01C00000, | ||
97 | .offset = 0, | ||
98 | }, | ||
99 | { | ||
100 | .name = "yamon", | ||
101 | .size = 0x00100000, | ||
102 | .offset = MTDPART_OFS_APPEND, | ||
103 | .mask_flags = MTD_WRITEABLE, | ||
104 | }, | ||
105 | { | ||
106 | .name = "kernel", | ||
107 | .size = 0x002c0000, | ||
108 | .offset = MTDPART_OFS_APPEND, | ||
109 | }, | ||
110 | { | ||
111 | .name = "yamon env", | ||
112 | .size = 0x00040000, | ||
113 | .offset = MTDPART_OFS_APPEND, | ||
114 | }, | ||
115 | }; | ||
116 | |||
117 | static struct physmap_flash_data mtx1_flash_data = { | ||
118 | .width = 4, | ||
119 | .nr_parts = 4, | ||
120 | .parts = mtx1_mtd_partitions, | ||
121 | }; | ||
122 | |||
123 | static struct resource mtx1_mtd_resource = { | ||
124 | .start = 0x1e000000, | ||
125 | .end = 0x1fffffff, | ||
126 | .flags = IORESOURCE_MEM, | ||
127 | }; | ||
128 | |||
129 | static struct platform_device mtx1_mtd = { | ||
130 | .name = "physmap-flash", | ||
131 | .dev = { | ||
132 | .platform_data = &mtx1_flash_data, | ||
133 | }, | ||
134 | .num_resources = 1, | ||
135 | .resource = &mtx1_mtd_resource, | ||
136 | }; | ||
137 | |||
138 | static struct __initdata platform_device * mtx1_devs[] = { | ||
139 | &mtx1_gpio_leds, | ||
140 | &mtx1_wdt, | ||
141 | &mtx1_button, | ||
142 | &mtx1_mtd, | ||
143 | }; | ||
144 | |||
145 | static struct au1000_eth_platform_data mtx1_au1000_eth0_pdata = { | ||
146 | .phy_search_highest_addr = 1, | ||
147 | .phy1_search_mac0 = 1, | ||
148 | }; | ||
149 | |||
150 | static int __init mtx1_register_devices(void) | ||
151 | { | ||
152 | int rc; | ||
153 | |||
154 | au1xxx_override_eth_cfg(0, &mtx1_au1000_eth0_pdata); | ||
155 | |||
156 | rc = gpio_request(mtx1_gpio_button[0].gpio, | ||
157 | mtx1_gpio_button[0].desc); | ||
158 | if (rc < 0) { | ||
159 | printk(KERN_INFO "mtx1: failed to request %d\n", | ||
160 | mtx1_gpio_button[0].gpio); | ||
161 | goto out; | ||
162 | } | ||
163 | gpio_direction_input(mtx1_gpio_button[0].gpio); | ||
164 | out: | ||
165 | return platform_add_devices(mtx1_devs, ARRAY_SIZE(mtx1_devs)); | ||
166 | } | ||
167 | |||
168 | arch_initcall(mtx1_register_devices); | ||
diff --git a/arch/mips/alchemy/xxs1500/Makefile b/arch/mips/alchemy/xxs1500/Makefile new file mode 100644 index 00000000000..91defcf4f33 --- /dev/null +++ b/arch/mips/alchemy/xxs1500/Makefile | |||
@@ -0,0 +1,8 @@ | |||
1 | # | ||
2 | # Copyright 2003 MontaVista Software Inc. | ||
3 | # Author: MontaVista Software, Inc. <source@mvista.com> | ||
4 | # | ||
5 | # Makefile for MyCable XXS1500 board. | ||
6 | # | ||
7 | |||
8 | obj-y += init.o board_setup.o platform.o | ||
diff --git a/arch/mips/alchemy/xxs1500/board_setup.c b/arch/mips/alchemy/xxs1500/board_setup.c new file mode 100644 index 00000000000..81e57fad07a --- /dev/null +++ b/arch/mips/alchemy/xxs1500/board_setup.c | |||
@@ -0,0 +1,101 @@ | |||
1 | /* | ||
2 | * Copyright 2000-2003, 2008 MontaVista Software Inc. | ||
3 | * Author: MontaVista Software, Inc. <source@mvista.com> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms of the GNU General Public License as published by the | ||
7 | * Free Software Foundation; either version 2 of the License, or (at your | ||
8 | * option) any later version. | ||
9 | * | ||
10 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
11 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
12 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
13 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
14 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
15 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
16 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
17 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
18 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
19 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
20 | * | ||
21 | * You should have received a copy of the GNU General Public License along | ||
22 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
23 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
24 | */ | ||
25 | |||
26 | #include <linux/gpio.h> | ||
27 | #include <linux/init.h> | ||
28 | #include <linux/interrupt.h> | ||
29 | #include <linux/delay.h> | ||
30 | #include <linux/pm.h> | ||
31 | |||
32 | #include <asm/reboot.h> | ||
33 | #include <asm/mach-au1x00/au1000.h> | ||
34 | |||
35 | #include <prom.h> | ||
36 | |||
37 | static void xxs1500_reset(char *c) | ||
38 | { | ||
39 | /* Jump to the reset vector */ | ||
40 | __asm__ __volatile__("jr\t%0"::"r"(0xbfc00000)); | ||
41 | } | ||
42 | |||
43 | static void xxs1500_power_off(void) | ||
44 | { | ||
45 | while (1) | ||
46 | asm volatile ( | ||
47 | " .set mips32 \n" | ||
48 | " wait \n" | ||
49 | " .set mips0 \n"); | ||
50 | } | ||
51 | |||
52 | void __init board_setup(void) | ||
53 | { | ||
54 | u32 pin_func; | ||
55 | |||
56 | pm_power_off = xxs1500_power_off; | ||
57 | _machine_halt = xxs1500_power_off; | ||
58 | _machine_restart = xxs1500_reset; | ||
59 | |||
60 | alchemy_gpio1_input_enable(); | ||
61 | alchemy_gpio2_enable(); | ||
62 | |||
63 | /* Set multiple use pins (UART3/GPIO) to UART (it's used as UART too) */ | ||
64 | pin_func = au_readl(SYS_PINFUNC) & ~SYS_PF_UR3; | ||
65 | pin_func |= SYS_PF_UR3; | ||
66 | au_writel(pin_func, SYS_PINFUNC); | ||
67 | |||
68 | /* Enable UART */ | ||
69 | alchemy_uart_enable(AU1000_UART3_PHYS_ADDR); | ||
70 | /* Enable DTR (MCR bit 0) = USB power up */ | ||
71 | __raw_writel(1, (void __iomem *)KSEG1ADDR(AU1000_UART3_PHYS_ADDR + 0x18)); | ||
72 | wmb(); | ||
73 | |||
74 | #ifdef CONFIG_PCI | ||
75 | #if defined(__MIPSEB__) | ||
76 | au_writel(0xf | (2 << 6) | (1 << 4), Au1500_PCI_CFG); | ||
77 | #else | ||
78 | au_writel(0xf, Au1500_PCI_CFG); | ||
79 | #endif | ||
80 | #endif | ||
81 | } | ||
82 | |||
83 | static int __init xxs1500_init_irq(void) | ||
84 | { | ||
85 | irq_set_irq_type(AU1500_GPIO204_INT, IRQF_TRIGGER_HIGH); | ||
86 | irq_set_irq_type(AU1500_GPIO201_INT, IRQF_TRIGGER_LOW); | ||
87 | irq_set_irq_type(AU1500_GPIO202_INT, IRQF_TRIGGER_LOW); | ||
88 | irq_set_irq_type(AU1500_GPIO203_INT, IRQF_TRIGGER_LOW); | ||
89 | irq_set_irq_type(AU1500_GPIO205_INT, IRQF_TRIGGER_LOW); | ||
90 | irq_set_irq_type(AU1500_GPIO207_INT, IRQF_TRIGGER_LOW); | ||
91 | |||
92 | irq_set_irq_type(AU1500_GPIO0_INT, IRQF_TRIGGER_LOW); | ||
93 | irq_set_irq_type(AU1500_GPIO1_INT, IRQF_TRIGGER_LOW); | ||
94 | irq_set_irq_type(AU1500_GPIO2_INT, IRQF_TRIGGER_LOW); | ||
95 | irq_set_irq_type(AU1500_GPIO3_INT, IRQF_TRIGGER_LOW); | ||
96 | irq_set_irq_type(AU1500_GPIO4_INT, IRQF_TRIGGER_LOW); /* CF irq */ | ||
97 | irq_set_irq_type(AU1500_GPIO5_INT, IRQF_TRIGGER_LOW); | ||
98 | |||
99 | return 0; | ||
100 | } | ||
101 | arch_initcall(xxs1500_init_irq); | ||
diff --git a/arch/mips/alchemy/xxs1500/init.c b/arch/mips/alchemy/xxs1500/init.c new file mode 100644 index 00000000000..0ee02cfa989 --- /dev/null +++ b/arch/mips/alchemy/xxs1500/init.c | |||
@@ -0,0 +1,63 @@ | |||
1 | /* | ||
2 | * BRIEF MODULE DESCRIPTION | ||
3 | * XXS1500 board setup | ||
4 | * | ||
5 | * Copyright 2003, 2008 MontaVista Software Inc. | ||
6 | * Author: MontaVista Software, Inc. <source@mvista.com> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License as published by the | ||
10 | * Free Software Foundation; either version 2 of the License, or (at your | ||
11 | * option) any later version. | ||
12 | * | ||
13 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
14 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
15 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
16 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
17 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
18 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
19 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
20 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
21 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
22 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
23 | * | ||
24 | * You should have received a copy of the GNU General Public License along | ||
25 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
26 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
27 | */ | ||
28 | |||
29 | #include <linux/init.h> | ||
30 | #include <linux/kernel.h> | ||
31 | |||
32 | #include <asm/bootinfo.h> | ||
33 | #include <asm/mach-au1x00/au1000.h> | ||
34 | |||
35 | #include <prom.h> | ||
36 | |||
37 | const char *get_system_type(void) | ||
38 | { | ||
39 | return "XXS1500"; | ||
40 | } | ||
41 | |||
42 | void __init prom_init(void) | ||
43 | { | ||
44 | unsigned char *memsize_str; | ||
45 | unsigned long memsize; | ||
46 | |||
47 | prom_argc = fw_arg0; | ||
48 | prom_argv = (char **)fw_arg1; | ||
49 | prom_envp = (char **)fw_arg2; | ||
50 | |||
51 | prom_init_cmdline(); | ||
52 | |||
53 | memsize_str = prom_getenv("memsize"); | ||
54 | if (!memsize_str || strict_strtoul(memsize_str, 0, &memsize)) | ||
55 | memsize = 0x04000000; | ||
56 | |||
57 | add_memory_region(0, memsize, BOOT_MEM_RAM); | ||
58 | } | ||
59 | |||
60 | void prom_putchar(unsigned char c) | ||
61 | { | ||
62 | alchemy_uart_putchar(AU1000_UART0_PHYS_ADDR, c); | ||
63 | } | ||
diff --git a/arch/mips/alchemy/xxs1500/platform.c b/arch/mips/alchemy/xxs1500/platform.c new file mode 100644 index 00000000000..e87c45cde61 --- /dev/null +++ b/arch/mips/alchemy/xxs1500/platform.c | |||
@@ -0,0 +1,63 @@ | |||
1 | /* | ||
2 | * XXS1500 board platform device registration | ||
3 | * | ||
4 | * Copyright (C) 2009 Manuel Lauss | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
19 | */ | ||
20 | |||
21 | #include <linux/init.h> | ||
22 | #include <linux/platform_device.h> | ||
23 | |||
24 | #include <asm/mach-au1x00/au1000.h> | ||
25 | |||
26 | static struct resource xxs1500_pcmcia_res[] = { | ||
27 | { | ||
28 | .name = "pcmcia-io", | ||
29 | .flags = IORESOURCE_MEM, | ||
30 | .start = PCMCIA_IO_PHYS_ADDR, | ||
31 | .end = PCMCIA_IO_PHYS_ADDR + 0x000400000 - 1, | ||
32 | }, | ||
33 | { | ||
34 | .name = "pcmcia-attr", | ||
35 | .flags = IORESOURCE_MEM, | ||
36 | .start = PCMCIA_ATTR_PHYS_ADDR, | ||
37 | .end = PCMCIA_ATTR_PHYS_ADDR + 0x000400000 - 1, | ||
38 | }, | ||
39 | { | ||
40 | .name = "pcmcia-mem", | ||
41 | .flags = IORESOURCE_MEM, | ||
42 | .start = PCMCIA_MEM_PHYS_ADDR, | ||
43 | .end = PCMCIA_MEM_PHYS_ADDR + 0x000400000 - 1, | ||
44 | }, | ||
45 | }; | ||
46 | |||
47 | static struct platform_device xxs1500_pcmcia_dev = { | ||
48 | .name = "xxs1500_pcmcia", | ||
49 | .id = -1, | ||
50 | .num_resources = ARRAY_SIZE(xxs1500_pcmcia_res), | ||
51 | .resource = xxs1500_pcmcia_res, | ||
52 | }; | ||
53 | |||
54 | static struct platform_device *xxs1500_devs[] __initdata = { | ||
55 | &xxs1500_pcmcia_dev, | ||
56 | }; | ||
57 | |||
58 | static int __init xxs1500_dev_init(void) | ||
59 | { | ||
60 | return platform_add_devices(xxs1500_devs, | ||
61 | ARRAY_SIZE(xxs1500_devs)); | ||
62 | } | ||
63 | device_initcall(xxs1500_dev_init); | ||
diff --git a/arch/mips/ath79/dev-ar913x-wmac.c b/arch/mips/ath79/dev-ar913x-wmac.c new file mode 100644 index 00000000000..48f425a5ba2 --- /dev/null +++ b/arch/mips/ath79/dev-ar913x-wmac.c | |||
@@ -0,0 +1,60 @@ | |||
1 | /* | ||
2 | * Atheros AR913X SoC built-in WMAC device support | ||
3 | * | ||
4 | * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> | ||
5 | * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify it | ||
8 | * under the terms of the GNU General Public License version 2 as published | ||
9 | * by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #include <linux/init.h> | ||
13 | #include <linux/delay.h> | ||
14 | #include <linux/irq.h> | ||
15 | #include <linux/platform_device.h> | ||
16 | #include <linux/ath9k_platform.h> | ||
17 | |||
18 | #include <asm/mach-ath79/ath79.h> | ||
19 | #include <asm/mach-ath79/ar71xx_regs.h> | ||
20 | #include "dev-ar913x-wmac.h" | ||
21 | |||
22 | static struct ath9k_platform_data ar913x_wmac_data; | ||
23 | |||
24 | static struct resource ar913x_wmac_resources[] = { | ||
25 | { | ||
26 | .start = AR913X_WMAC_BASE, | ||
27 | .end = AR913X_WMAC_BASE + AR913X_WMAC_SIZE - 1, | ||
28 | .flags = IORESOURCE_MEM, | ||
29 | }, { | ||
30 | .start = ATH79_CPU_IRQ_IP2, | ||
31 | .end = ATH79_CPU_IRQ_IP2, | ||
32 | .flags = IORESOURCE_IRQ, | ||
33 | }, | ||
34 | }; | ||
35 | |||
36 | static struct platform_device ar913x_wmac_device = { | ||
37 | .name = "ath9k", | ||
38 | .id = -1, | ||
39 | .resource = ar913x_wmac_resources, | ||
40 | .num_resources = ARRAY_SIZE(ar913x_wmac_resources), | ||
41 | .dev = { | ||
42 | .platform_data = &ar913x_wmac_data, | ||
43 | }, | ||
44 | }; | ||
45 | |||
46 | void __init ath79_register_ar913x_wmac(u8 *cal_data) | ||
47 | { | ||
48 | if (cal_data) | ||
49 | memcpy(ar913x_wmac_data.eeprom_data, cal_data, | ||
50 | sizeof(ar913x_wmac_data.eeprom_data)); | ||
51 | |||
52 | /* reset the WMAC */ | ||
53 | ath79_device_reset_set(AR913X_RESET_AMBA2WMAC); | ||
54 | mdelay(10); | ||
55 | |||
56 | ath79_device_reset_clear(AR913X_RESET_AMBA2WMAC); | ||
57 | mdelay(10); | ||
58 | |||
59 | platform_device_register(&ar913x_wmac_device); | ||
60 | } | ||
diff --git a/arch/mips/ath79/dev-ar913x-wmac.h b/arch/mips/ath79/dev-ar913x-wmac.h new file mode 100644 index 00000000000..579d562bbda --- /dev/null +++ b/arch/mips/ath79/dev-ar913x-wmac.h | |||
@@ -0,0 +1,17 @@ | |||
1 | /* | ||
2 | * Atheros AR913X SoC built-in WMAC device support | ||
3 | * | ||
4 | * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org> | ||
5 | * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify it | ||
8 | * under the terms of the GNU General Public License version 2 as published | ||
9 | * by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #ifndef _ATH79_DEV_AR913X_WMAC_H | ||
13 | #define _ATH79_DEV_AR913X_WMAC_H | ||
14 | |||
15 | void ath79_register_ar913x_wmac(u8 *cal_data); | ||
16 | |||
17 | #endif /* _ATH79_DEV_AR913X_WMAC_H */ | ||
diff --git a/arch/mips/bcm47xx/gpio.c b/arch/mips/bcm47xx/gpio.c new file mode 100644 index 00000000000..e4a5ee9c972 --- /dev/null +++ b/arch/mips/bcm47xx/gpio.c | |||
@@ -0,0 +1,61 @@ | |||
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 Aurelien Jarno <aurelien@aurel32.net> | ||
7 | */ | ||
8 | |||
9 | #include <linux/ssb/ssb.h> | ||
10 | #include <linux/ssb/ssb_driver_chipcommon.h> | ||
11 | #include <linux/ssb/ssb_driver_extif.h> | ||
12 | #include <asm/mach-bcm47xx/bcm47xx.h> | ||
13 | #include <asm/mach-bcm47xx/gpio.h> | ||
14 | |||
15 | #if (BCM47XX_CHIPCO_GPIO_LINES > BCM47XX_EXTIF_GPIO_LINES) | ||
16 | static DECLARE_BITMAP(gpio_in_use, BCM47XX_CHIPCO_GPIO_LINES); | ||
17 | #else | ||
18 | static DECLARE_BITMAP(gpio_in_use, BCM47XX_EXTIF_GPIO_LINES); | ||
19 | #endif | ||
20 | |||
21 | int gpio_request(unsigned gpio, const char *tag) | ||
22 | { | ||
23 | if (ssb_chipco_available(&ssb_bcm47xx.chipco) && | ||
24 | ((unsigned)gpio >= BCM47XX_CHIPCO_GPIO_LINES)) | ||
25 | return -EINVAL; | ||
26 | |||
27 | if (ssb_extif_available(&ssb_bcm47xx.extif) && | ||
28 | ((unsigned)gpio >= BCM47XX_EXTIF_GPIO_LINES)) | ||
29 | return -EINVAL; | ||
30 | |||
31 | if (test_and_set_bit(gpio, gpio_in_use)) | ||
32 | return -EBUSY; | ||
33 | |||
34 | return 0; | ||
35 | } | ||
36 | EXPORT_SYMBOL(gpio_request); | ||
37 | |||
38 | void gpio_free(unsigned gpio) | ||
39 | { | ||
40 | if (ssb_chipco_available(&ssb_bcm47xx.chipco) && | ||
41 | ((unsigned)gpio >= BCM47XX_CHIPCO_GPIO_LINES)) | ||
42 | return; | ||
43 | |||
44 | if (ssb_extif_available(&ssb_bcm47xx.extif) && | ||
45 | ((unsigned)gpio >= BCM47XX_EXTIF_GPIO_LINES)) | ||
46 | return; | ||
47 | |||
48 | clear_bit(gpio, gpio_in_use); | ||
49 | } | ||
50 | EXPORT_SYMBOL(gpio_free); | ||
51 | |||
52 | int gpio_to_irq(unsigned gpio) | ||
53 | { | ||
54 | if (ssb_chipco_available(&ssb_bcm47xx.chipco)) | ||
55 | return ssb_mips_irq(ssb_bcm47xx.chipco.dev) + 2; | ||
56 | else if (ssb_extif_available(&ssb_bcm47xx.extif)) | ||
57 | return ssb_mips_irq(ssb_bcm47xx.extif.dev) + 2; | ||
58 | else | ||
59 | return -EINVAL; | ||
60 | } | ||
61 | EXPORT_SYMBOL_GPL(gpio_to_irq); | ||
diff --git a/arch/mips/configs/cavium-octeon_defconfig b/arch/mips/configs/cavium-octeon_defconfig new file mode 100644 index 00000000000..75165dfa60c --- /dev/null +++ b/arch/mips/configs/cavium-octeon_defconfig | |||
@@ -0,0 +1,93 @@ | |||
1 | CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD=y | ||
2 | CONFIG_CAVIUM_OCTEON_CVMSEG_SIZE=2 | ||
3 | CONFIG_SPARSEMEM_MANUAL=y | ||
4 | CONFIG_SMP=y | ||
5 | CONFIG_PREEMPT=y | ||
6 | CONFIG_EXPERIMENTAL=y | ||
7 | CONFIG_SYSVIPC=y | ||
8 | CONFIG_POSIX_MQUEUE=y | ||
9 | CONFIG_BSD_PROCESS_ACCT=y | ||
10 | CONFIG_BSD_PROCESS_ACCT_V3=y | ||
11 | CONFIG_IKCONFIG=y | ||
12 | CONFIG_IKCONFIG_PROC=y | ||
13 | CONFIG_LOG_BUF_SHIFT=14 | ||
14 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
15 | CONFIG_RELAY=y | ||
16 | CONFIG_BLK_DEV_INITRD=y | ||
17 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
18 | CONFIG_EXPERT=y | ||
19 | # CONFIG_PCSPKR_PLATFORM is not set | ||
20 | CONFIG_SLAB=y | ||
21 | CONFIG_MODULES=y | ||
22 | CONFIG_MODULE_UNLOAD=y | ||
23 | # CONFIG_BLK_DEV_BSG is not set | ||
24 | CONFIG_MIPS32_COMPAT=y | ||
25 | CONFIG_MIPS32_O32=y | ||
26 | CONFIG_MIPS32_N32=y | ||
27 | CONFIG_NET=y | ||
28 | CONFIG_PACKET=y | ||
29 | CONFIG_UNIX=y | ||
30 | CONFIG_INET=y | ||
31 | CONFIG_IP_MULTICAST=y | ||
32 | CONFIG_IP_ADVANCED_ROUTER=y | ||
33 | CONFIG_IP_MULTIPLE_TABLES=y | ||
34 | CONFIG_IP_ROUTE_MULTIPATH=y | ||
35 | CONFIG_IP_ROUTE_VERBOSE=y | ||
36 | CONFIG_IP_PNP=y | ||
37 | CONFIG_IP_PNP_DHCP=y | ||
38 | CONFIG_IP_PNP_BOOTP=y | ||
39 | CONFIG_IP_PNP_RARP=y | ||
40 | CONFIG_IP_MROUTE=y | ||
41 | CONFIG_IP_PIMSM_V1=y | ||
42 | CONFIG_IP_PIMSM_V2=y | ||
43 | CONFIG_SYN_COOKIES=y | ||
44 | # CONFIG_INET_LRO is not set | ||
45 | # CONFIG_IPV6 is not set | ||
46 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
47 | # CONFIG_FW_LOADER is not set | ||
48 | CONFIG_MTD=y | ||
49 | CONFIG_MTD_PARTITIONS=y | ||
50 | CONFIG_MTD_CHAR=y | ||
51 | CONFIG_MTD_BLOCK=y | ||
52 | CONFIG_MTD_CFI=y | ||
53 | CONFIG_MTD_CFI_AMDSTD=y | ||
54 | CONFIG_MTD_PHYSMAP=y | ||
55 | CONFIG_BLK_DEV_LOOP=y | ||
56 | # CONFIG_MISC_DEVICES is not set | ||
57 | CONFIG_NETDEVICES=y | ||
58 | CONFIG_NET_ETHERNET=y | ||
59 | CONFIG_MII=y | ||
60 | # CONFIG_NETDEV_10000 is not set | ||
61 | # CONFIG_INPUT is not set | ||
62 | # CONFIG_SERIO is not set | ||
63 | # CONFIG_VT is not set | ||
64 | CONFIG_SERIAL_8250=y | ||
65 | CONFIG_SERIAL_8250_CONSOLE=y | ||
66 | CONFIG_SERIAL_8250_NR_UARTS=2 | ||
67 | CONFIG_SERIAL_8250_RUNTIME_UARTS=2 | ||
68 | # CONFIG_HW_RANDOM is not set | ||
69 | # CONFIG_HWMON is not set | ||
70 | CONFIG_WATCHDOG=y | ||
71 | # CONFIG_USB_SUPPORT is not set | ||
72 | CONFIG_PROC_KCORE=y | ||
73 | CONFIG_TMPFS=y | ||
74 | # CONFIG_NETWORK_FILESYSTEMS is not set | ||
75 | CONFIG_NLS=y | ||
76 | CONFIG_NLS_CODEPAGE_437=y | ||
77 | CONFIG_NLS_ISO8859_1=y | ||
78 | CONFIG_MAGIC_SYSRQ=y | ||
79 | CONFIG_DEBUG_FS=y | ||
80 | CONFIG_DEBUG_KERNEL=y | ||
81 | CONFIG_DEBUG_SPINLOCK=y | ||
82 | CONFIG_DEBUG_SPINLOCK_SLEEP=y | ||
83 | CONFIG_DEBUG_INFO=y | ||
84 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
85 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
86 | # CONFIG_EARLY_PRINTK is not set | ||
87 | CONFIG_SECURITY=y | ||
88 | CONFIG_SECURITY_NETWORK=y | ||
89 | CONFIG_CRYPTO_CBC=y | ||
90 | CONFIG_CRYPTO_HMAC=y | ||
91 | CONFIG_CRYPTO_MD5=y | ||
92 | CONFIG_CRYPTO_DES=y | ||
93 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | ||
diff --git a/arch/mips/configs/db1100_defconfig b/arch/mips/configs/db1100_defconfig new file mode 100644 index 00000000000..c6b49938ee8 --- /dev/null +++ b/arch/mips/configs/db1100_defconfig | |||
@@ -0,0 +1,122 @@ | |||
1 | CONFIG_MIPS_ALCHEMY=y | ||
2 | CONFIG_MIPS_DB1100=y | ||
3 | CONFIG_NO_HZ=y | ||
4 | CONFIG_HIGH_RES_TIMERS=y | ||
5 | CONFIG_HZ_100=y | ||
6 | # CONFIG_SECCOMP is not set | ||
7 | CONFIG_EXPERIMENTAL=y | ||
8 | CONFIG_LOCALVERSION="-db1100" | ||
9 | CONFIG_KERNEL_LZMA=y | ||
10 | CONFIG_SYSVIPC=y | ||
11 | CONFIG_POSIX_MQUEUE=y | ||
12 | CONFIG_TINY_RCU=y | ||
13 | CONFIG_LOG_BUF_SHIFT=14 | ||
14 | CONFIG_EXPERT=y | ||
15 | # CONFIG_SYSCTL_SYSCALL is not set | ||
16 | # CONFIG_KALLSYMS is not set | ||
17 | # CONFIG_PCSPKR_PLATFORM is not set | ||
18 | # CONFIG_COMPAT_BRK is not set | ||
19 | CONFIG_SLAB=y | ||
20 | CONFIG_MODULES=y | ||
21 | CONFIG_MODULE_UNLOAD=y | ||
22 | # CONFIG_LBDAF is not set | ||
23 | # CONFIG_BLK_DEV_BSG is not set | ||
24 | # CONFIG_IOSCHED_DEADLINE is not set | ||
25 | # CONFIG_IOSCHED_CFQ is not set | ||
26 | CONFIG_PCCARD=y | ||
27 | CONFIG_PCMCIA_ALCHEMY_DEVBOARD=y | ||
28 | CONFIG_PM=y | ||
29 | CONFIG_PM_RUNTIME=y | ||
30 | CONFIG_NET=y | ||
31 | CONFIG_PACKET=y | ||
32 | CONFIG_UNIX=y | ||
33 | CONFIG_INET=y | ||
34 | CONFIG_IP_MULTICAST=y | ||
35 | CONFIG_IP_PNP=y | ||
36 | CONFIG_IP_PNP_DHCP=y | ||
37 | CONFIG_IP_PNP_BOOTP=y | ||
38 | CONFIG_IP_PNP_RARP=y | ||
39 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set | ||
40 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set | ||
41 | # CONFIG_INET_XFRM_MODE_BEET is not set | ||
42 | # CONFIG_INET_DIAG is not set | ||
43 | # CONFIG_IPV6 is not set | ||
44 | # CONFIG_WIRELESS is not set | ||
45 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
46 | CONFIG_MTD=y | ||
47 | CONFIG_MTD_PARTITIONS=y | ||
48 | CONFIG_MTD_CHAR=y | ||
49 | CONFIG_MTD_BLOCK=y | ||
50 | CONFIG_MTD_CFI=y | ||
51 | CONFIG_MTD_CFI_AMDSTD=y | ||
52 | CONFIG_MTD_PHYSMAP=y | ||
53 | # CONFIG_BLK_DEV is not set | ||
54 | # CONFIG_MISC_DEVICES is not set | ||
55 | CONFIG_IDE=y | ||
56 | CONFIG_IDE_TASK_IOCTL=y | ||
57 | CONFIG_NETDEVICES=y | ||
58 | CONFIG_MARVELL_PHY=y | ||
59 | CONFIG_DAVICOM_PHY=y | ||
60 | CONFIG_QSEMI_PHY=y | ||
61 | CONFIG_LXT_PHY=y | ||
62 | CONFIG_CICADA_PHY=y | ||
63 | CONFIG_VITESSE_PHY=y | ||
64 | CONFIG_SMSC_PHY=y | ||
65 | CONFIG_BROADCOM_PHY=y | ||
66 | CONFIG_ICPLUS_PHY=y | ||
67 | CONFIG_REALTEK_PHY=y | ||
68 | CONFIG_NATIONAL_PHY=y | ||
69 | CONFIG_STE10XP=y | ||
70 | CONFIG_LSI_ET1011C_PHY=y | ||
71 | CONFIG_NET_ETHERNET=y | ||
72 | CONFIG_MII=y | ||
73 | CONFIG_MIPS_AU1X00_ENET=y | ||
74 | # CONFIG_NETDEV_1000 is not set | ||
75 | # CONFIG_NETDEV_10000 is not set | ||
76 | # CONFIG_WLAN is not set | ||
77 | # CONFIG_INPUT_MOUSEDEV is not set | ||
78 | CONFIG_INPUT_EVDEV=y | ||
79 | # CONFIG_INPUT_KEYBOARD is not set | ||
80 | # CONFIG_INPUT_MOUSE is not set | ||
81 | # CONFIG_SERIO is not set | ||
82 | CONFIG_VT_HW_CONSOLE_BINDING=y | ||
83 | CONFIG_SERIAL_8250=y | ||
84 | CONFIG_SERIAL_8250_CONSOLE=y | ||
85 | # CONFIG_LEGACY_PTYS is not set | ||
86 | # CONFIG_HW_RANDOM is not set | ||
87 | # CONFIG_HWMON is not set | ||
88 | CONFIG_FB=y | ||
89 | CONFIG_FB_AU1100=y | ||
90 | # CONFIG_VGA_CONSOLE is not set | ||
91 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
92 | CONFIG_FONTS=y | ||
93 | CONFIG_FONT_8x16=y | ||
94 | # CONFIG_HID_SUPPORT is not set | ||
95 | CONFIG_USB=y | ||
96 | # CONFIG_USB_DEVICE_CLASS is not set | ||
97 | CONFIG_USB_DYNAMIC_MINORS=y | ||
98 | CONFIG_USB_SUSPEND=y | ||
99 | CONFIG_USB_OHCI_HCD=y | ||
100 | CONFIG_RTC_CLASS=y | ||
101 | CONFIG_RTC_DRV_AU1XXX=y | ||
102 | CONFIG_EXT2_FS=y | ||
103 | # CONFIG_PROC_PAGE_MONITOR is not set | ||
104 | CONFIG_TMPFS=y | ||
105 | CONFIG_JFFS2_FS=y | ||
106 | CONFIG_JFFS2_SUMMARY=y | ||
107 | CONFIG_JFFS2_FS_XATTR=y | ||
108 | CONFIG_JFFS2_COMPRESSION_OPTIONS=y | ||
109 | CONFIG_JFFS2_LZO=y | ||
110 | CONFIG_JFFS2_RUBIN=y | ||
111 | CONFIG_SQUASHFS=y | ||
112 | CONFIG_NFS_FS=y | ||
113 | CONFIG_NFS_V3=y | ||
114 | CONFIG_ROOT_NFS=y | ||
115 | CONFIG_STRIP_ASM_SYMS=y | ||
116 | CONFIG_DEBUG_KERNEL=y | ||
117 | # CONFIG_SCHED_DEBUG is not set | ||
118 | # CONFIG_FTRACE is not set | ||
119 | CONFIG_DEBUG_ZBOOT=y | ||
120 | CONFIG_KEYS=y | ||
121 | CONFIG_KEYS_DEBUG_PROC_KEYS=y | ||
122 | CONFIG_SECURITYFS=y | ||
diff --git a/arch/mips/configs/db1200_defconfig b/arch/mips/configs/db1200_defconfig new file mode 100644 index 00000000000..1f69249b839 --- /dev/null +++ b/arch/mips/configs/db1200_defconfig | |||
@@ -0,0 +1,170 @@ | |||
1 | CONFIG_MIPS_ALCHEMY=y | ||
2 | CONFIG_MIPS_DB1200=y | ||
3 | CONFIG_KSM=y | ||
4 | CONFIG_NO_HZ=y | ||
5 | CONFIG_HIGH_RES_TIMERS=y | ||
6 | CONFIG_HZ_100=y | ||
7 | # CONFIG_SECCOMP is not set | ||
8 | CONFIG_EXPERIMENTAL=y | ||
9 | CONFIG_LOCALVERSION="-db1200" | ||
10 | CONFIG_KERNEL_LZMA=y | ||
11 | CONFIG_SYSVIPC=y | ||
12 | CONFIG_POSIX_MQUEUE=y | ||
13 | CONFIG_TINY_RCU=y | ||
14 | CONFIG_LOG_BUF_SHIFT=14 | ||
15 | CONFIG_EXPERT=y | ||
16 | # CONFIG_SYSCTL_SYSCALL is not set | ||
17 | # CONFIG_KALLSYMS is not set | ||
18 | # CONFIG_PCSPKR_PLATFORM is not set | ||
19 | # CONFIG_VM_EVENT_COUNTERS is not set | ||
20 | # CONFIG_COMPAT_BRK is not set | ||
21 | CONFIG_SLAB=y | ||
22 | CONFIG_MODULES=y | ||
23 | CONFIG_MODULE_UNLOAD=y | ||
24 | # CONFIG_LBDAF is not set | ||
25 | # CONFIG_BLK_DEV_BSG is not set | ||
26 | # CONFIG_IOSCHED_DEADLINE is not set | ||
27 | # CONFIG_IOSCHED_CFQ is not set | ||
28 | CONFIG_PCCARD=y | ||
29 | CONFIG_PCMCIA_ALCHEMY_DEVBOARD=y | ||
30 | CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y | ||
31 | CONFIG_BINFMT_MISC=y | ||
32 | CONFIG_NET=y | ||
33 | CONFIG_PACKET=y | ||
34 | CONFIG_UNIX=y | ||
35 | CONFIG_INET=y | ||
36 | CONFIG_IP_MULTICAST=y | ||
37 | CONFIG_IP_PNP=y | ||
38 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set | ||
39 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set | ||
40 | # CONFIG_INET_XFRM_MODE_BEET is not set | ||
41 | # CONFIG_INET_DIAG is not set | ||
42 | # CONFIG_IPV6 is not set | ||
43 | # CONFIG_WIRELESS is not set | ||
44 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
45 | CONFIG_MTD=y | ||
46 | CONFIG_MTD_PARTITIONS=y | ||
47 | CONFIG_MTD_CMDLINE_PARTS=y | ||
48 | CONFIG_MTD_CHAR=y | ||
49 | CONFIG_MTD_BLOCK=y | ||
50 | CONFIG_MTD_CFI=y | ||
51 | CONFIG_MTD_CFI_AMDSTD=y | ||
52 | CONFIG_MTD_PHYSMAP=y | ||
53 | CONFIG_MTD_NAND=y | ||
54 | CONFIG_MTD_NAND_PLATFORM=y | ||
55 | CONFIG_BLK_DEV_LOOP=y | ||
56 | CONFIG_BLK_DEV_UB=y | ||
57 | # CONFIG_MISC_DEVICES is not set | ||
58 | CONFIG_IDE=y | ||
59 | CONFIG_BLK_DEV_IDECS=y | ||
60 | CONFIG_BLK_DEV_IDECD=y | ||
61 | CONFIG_IDE_TASK_IOCTL=y | ||
62 | # CONFIG_IDE_PROC_FS is not set | ||
63 | CONFIG_BLK_DEV_IDE_AU1XXX=y | ||
64 | CONFIG_NETDEVICES=y | ||
65 | CONFIG_NET_ETHERNET=y | ||
66 | CONFIG_SMC91X=y | ||
67 | # CONFIG_NETDEV_1000 is not set | ||
68 | # CONFIG_NETDEV_10000 is not set | ||
69 | # CONFIG_WLAN is not set | ||
70 | # CONFIG_INPUT_MOUSEDEV is not set | ||
71 | CONFIG_INPUT_EVDEV=y | ||
72 | # CONFIG_INPUT_KEYBOARD is not set | ||
73 | # CONFIG_INPUT_MOUSE is not set | ||
74 | # CONFIG_SERIO is not set | ||
75 | CONFIG_VT_HW_CONSOLE_BINDING=y | ||
76 | CONFIG_SERIAL_8250=y | ||
77 | CONFIG_SERIAL_8250_CONSOLE=y | ||
78 | CONFIG_SERIAL_8250_NR_UARTS=2 | ||
79 | CONFIG_SERIAL_8250_RUNTIME_UARTS=2 | ||
80 | # CONFIG_LEGACY_PTYS is not set | ||
81 | # CONFIG_HW_RANDOM is not set | ||
82 | CONFIG_I2C=y | ||
83 | # CONFIG_I2C_COMPAT is not set | ||
84 | CONFIG_I2C_CHARDEV=y | ||
85 | # CONFIG_I2C_HELPER_AUTO is not set | ||
86 | CONFIG_I2C_AU1550=y | ||
87 | CONFIG_SPI=y | ||
88 | CONFIG_SPI_AU1550=y | ||
89 | CONFIG_GPIOLIB=y | ||
90 | CONFIG_GPIO_SYSFS=y | ||
91 | CONFIG_SENSORS_ADM1025=y | ||
92 | CONFIG_SENSORS_LM70=y | ||
93 | CONFIG_FB=y | ||
94 | CONFIG_FB_AU1200=y | ||
95 | # CONFIG_VGA_CONSOLE is not set | ||
96 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
97 | CONFIG_FONTS=y | ||
98 | CONFIG_FONT_8x16=y | ||
99 | CONFIG_SOUND=y | ||
100 | CONFIG_SND=y | ||
101 | CONFIG_SND_DYNAMIC_MINORS=y | ||
102 | # CONFIG_SND_SUPPORT_OLD_API is not set | ||
103 | # CONFIG_SND_VERBOSE_PROCFS is not set | ||
104 | # CONFIG_SND_DRIVERS is not set | ||
105 | # CONFIG_SND_SPI is not set | ||
106 | # CONFIG_SND_MIPS is not set | ||
107 | # CONFIG_SND_USB is not set | ||
108 | # CONFIG_SND_PCMCIA is not set | ||
109 | CONFIG_SND_SOC=y | ||
110 | CONFIG_SND_SOC_AU1XPSC=y | ||
111 | CONFIG_SND_SOC_DB1200=y | ||
112 | CONFIG_HIDRAW=y | ||
113 | CONFIG_USB_HIDDEV=y | ||
114 | CONFIG_USB=y | ||
115 | CONFIG_USB_DEBUG=y | ||
116 | CONFIG_USB_ANNOUNCE_NEW_DEVICES=y | ||
117 | # CONFIG_USB_DEVICE_CLASS is not set | ||
118 | CONFIG_USB_DYNAMIC_MINORS=y | ||
119 | CONFIG_USB_EHCI_HCD=y | ||
120 | CONFIG_USB_EHCI_ROOT_HUB_TT=y | ||
121 | CONFIG_USB_OHCI_HCD=y | ||
122 | CONFIG_MMC=y | ||
123 | # CONFIG_MMC_BLOCK_BOUNCE is not set | ||
124 | CONFIG_MMC_AU1X=y | ||
125 | CONFIG_NEW_LEDS=y | ||
126 | CONFIG_LEDS_CLASS=y | ||
127 | CONFIG_LEDS_TRIGGERS=y | ||
128 | CONFIG_RTC_CLASS=y | ||
129 | CONFIG_RTC_DRV_AU1XXX=y | ||
130 | CONFIG_EXT2_FS=y | ||
131 | CONFIG_ISO9660_FS=y | ||
132 | CONFIG_JOLIET=y | ||
133 | CONFIG_ZISOFS=y | ||
134 | CONFIG_UDF_FS=y | ||
135 | CONFIG_VFAT_FS=y | ||
136 | # CONFIG_PROC_PAGE_MONITOR is not set | ||
137 | CONFIG_TMPFS=y | ||
138 | CONFIG_JFFS2_FS=y | ||
139 | CONFIG_JFFS2_SUMMARY=y | ||
140 | CONFIG_JFFS2_COMPRESSION_OPTIONS=y | ||
141 | CONFIG_JFFS2_LZO=y | ||
142 | CONFIG_JFFS2_RUBIN=y | ||
143 | CONFIG_SQUASHFS=y | ||
144 | CONFIG_NFS_FS=y | ||
145 | CONFIG_NFS_V3=y | ||
146 | CONFIG_ROOT_NFS=y | ||
147 | CONFIG_PARTITION_ADVANCED=y | ||
148 | CONFIG_EFI_PARTITION=y | ||
149 | CONFIG_NLS_CODEPAGE_437=y | ||
150 | CONFIG_NLS_CODEPAGE_850=y | ||
151 | CONFIG_NLS_CODEPAGE_852=y | ||
152 | CONFIG_NLS_CODEPAGE_1250=y | ||
153 | CONFIG_NLS_ASCII=y | ||
154 | CONFIG_NLS_ISO8859_1=y | ||
155 | CONFIG_NLS_ISO8859_2=y | ||
156 | CONFIG_NLS_ISO8859_15=y | ||
157 | CONFIG_NLS_UTF8=y | ||
158 | # CONFIG_ENABLE_WARN_DEPRECATED is not set | ||
159 | # CONFIG_ENABLE_MUST_CHECK is not set | ||
160 | CONFIG_MAGIC_SYSRQ=y | ||
161 | CONFIG_STRIP_ASM_SYMS=y | ||
162 | CONFIG_DEBUG_KERNEL=y | ||
163 | # CONFIG_SCHED_DEBUG is not set | ||
164 | # CONFIG_FTRACE is not set | ||
165 | CONFIG_CMDLINE_BOOL=y | ||
166 | CONFIG_CMDLINE="console=ttyS0,115200" | ||
167 | CONFIG_DEBUG_ZBOOT=y | ||
168 | CONFIG_KEYS=y | ||
169 | CONFIG_KEYS_DEBUG_PROC_KEYS=y | ||
170 | CONFIG_SECURITYFS=y | ||
diff --git a/arch/mips/configs/db1500_defconfig b/arch/mips/configs/db1500_defconfig new file mode 100644 index 00000000000..b6e21c7cb6b --- /dev/null +++ b/arch/mips/configs/db1500_defconfig | |||
@@ -0,0 +1,128 @@ | |||
1 | CONFIG_MIPS_ALCHEMY=y | ||
2 | CONFIG_MIPS_DB1500=y | ||
3 | CONFIG_CPU_LITTLE_ENDIAN=y | ||
4 | CONFIG_NO_HZ=y | ||
5 | CONFIG_HIGH_RES_TIMERS=y | ||
6 | CONFIG_HZ_100=y | ||
7 | # CONFIG_SECCOMP is not set | ||
8 | CONFIG_EXPERIMENTAL=y | ||
9 | CONFIG_LOCALVERSION="-db1500" | ||
10 | CONFIG_KERNEL_LZMA=y | ||
11 | CONFIG_SYSVIPC=y | ||
12 | CONFIG_LOG_BUF_SHIFT=14 | ||
13 | CONFIG_EXPERT=y | ||
14 | # CONFIG_KALLSYMS is not set | ||
15 | # CONFIG_PCSPKR_PLATFORM is not set | ||
16 | # CONFIG_VM_EVENT_COUNTERS is not set | ||
17 | # CONFIG_COMPAT_BRK is not set | ||
18 | CONFIG_SLAB=y | ||
19 | CONFIG_MODULES=y | ||
20 | CONFIG_MODULE_UNLOAD=y | ||
21 | # CONFIG_IOSCHED_DEADLINE is not set | ||
22 | # CONFIG_IOSCHED_CFQ is not set | ||
23 | CONFIG_PCI=y | ||
24 | CONFIG_PCCARD=y | ||
25 | # CONFIG_CARDBUS is not set | ||
26 | CONFIG_PCMCIA_ALCHEMY_DEVBOARD=y | ||
27 | CONFIG_PM=y | ||
28 | CONFIG_PM_RUNTIME=y | ||
29 | CONFIG_NET=y | ||
30 | CONFIG_PACKET=y | ||
31 | CONFIG_UNIX=y | ||
32 | CONFIG_INET=y | ||
33 | CONFIG_IP_MULTICAST=y | ||
34 | CONFIG_IP_PNP=y | ||
35 | CONFIG_IP_PNP_DHCP=y | ||
36 | CONFIG_IP_PNP_BOOTP=y | ||
37 | CONFIG_IP_PNP_RARP=y | ||
38 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set | ||
39 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set | ||
40 | # CONFIG_INET_XFRM_MODE_BEET is not set | ||
41 | # CONFIG_INET_DIAG is not set | ||
42 | # CONFIG_IPV6 is not set | ||
43 | # CONFIG_WIRELESS is not set | ||
44 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
45 | CONFIG_MTD=y | ||
46 | CONFIG_MTD_PARTITIONS=y | ||
47 | CONFIG_MTD_CMDLINE_PARTS=y | ||
48 | CONFIG_MTD_CHAR=y | ||
49 | CONFIG_MTD_BLOCK=y | ||
50 | CONFIG_MTD_CFI=y | ||
51 | CONFIG_MTD_CFI_INTELEXT=y | ||
52 | CONFIG_MTD_CFI_AMDSTD=y | ||
53 | CONFIG_MTD_PHYSMAP=y | ||
54 | # CONFIG_MISC_DEVICES is not set | ||
55 | CONFIG_IDE=y | ||
56 | CONFIG_BLK_DEV_IDECS=y | ||
57 | # CONFIG_IDEPCI_PCIBUS_ORDER is not set | ||
58 | CONFIG_BLK_DEV_HPT366=y | ||
59 | CONFIG_NETDEVICES=y | ||
60 | CONFIG_MARVELL_PHY=y | ||
61 | CONFIG_DAVICOM_PHY=y | ||
62 | CONFIG_QSEMI_PHY=y | ||
63 | CONFIG_LXT_PHY=y | ||
64 | CONFIG_CICADA_PHY=y | ||
65 | CONFIG_VITESSE_PHY=y | ||
66 | CONFIG_SMSC_PHY=y | ||
67 | CONFIG_BROADCOM_PHY=y | ||
68 | CONFIG_ICPLUS_PHY=y | ||
69 | CONFIG_REALTEK_PHY=y | ||
70 | CONFIG_NATIONAL_PHY=y | ||
71 | CONFIG_STE10XP=y | ||
72 | CONFIG_LSI_ET1011C_PHY=y | ||
73 | CONFIG_NET_ETHERNET=y | ||
74 | CONFIG_MII=y | ||
75 | CONFIG_MIPS_AU1X00_ENET=y | ||
76 | # CONFIG_NETDEV_1000 is not set | ||
77 | # CONFIG_NETDEV_10000 is not set | ||
78 | # CONFIG_WLAN is not set | ||
79 | # CONFIG_INPUT_MOUSEDEV is not set | ||
80 | CONFIG_INPUT_EVDEV=y | ||
81 | # CONFIG_INPUT_KEYBOARD is not set | ||
82 | # CONFIG_INPUT_MOUSE is not set | ||
83 | # CONFIG_SERIO is not set | ||
84 | CONFIG_SERIAL_8250=y | ||
85 | CONFIG_SERIAL_8250_CONSOLE=y | ||
86 | # CONFIG_SERIAL_8250_PCI is not set | ||
87 | # CONFIG_LEGACY_PTYS is not set | ||
88 | # CONFIG_HW_RANDOM is not set | ||
89 | # CONFIG_HWMON is not set | ||
90 | # CONFIG_VGA_ARB is not set | ||
91 | # CONFIG_VGA_CONSOLE is not set | ||
92 | # CONFIG_HID_SUPPORT is not set | ||
93 | CONFIG_USB=y | ||
94 | # CONFIG_USB_DEVICE_CLASS is not set | ||
95 | CONFIG_USB_DYNAMIC_MINORS=y | ||
96 | CONFIG_USB_SUSPEND=y | ||
97 | CONFIG_USB_OHCI_HCD=y | ||
98 | CONFIG_RTC_CLASS=y | ||
99 | CONFIG_RTC_DRV_AU1XXX=y | ||
100 | CONFIG_EXT2_FS=y | ||
101 | # CONFIG_PROC_PAGE_MONITOR is not set | ||
102 | CONFIG_TMPFS=y | ||
103 | CONFIG_JFFS2_FS=y | ||
104 | CONFIG_JFFS2_SUMMARY=y | ||
105 | CONFIG_JFFS2_FS_XATTR=y | ||
106 | CONFIG_JFFS2_COMPRESSION_OPTIONS=y | ||
107 | CONFIG_JFFS2_LZO=y | ||
108 | CONFIG_JFFS2_RUBIN=y | ||
109 | CONFIG_SQUASHFS=y | ||
110 | CONFIG_NFS_FS=y | ||
111 | CONFIG_NFS_V3=y | ||
112 | CONFIG_ROOT_NFS=y | ||
113 | CONFIG_NLS_CODEPAGE_437=y | ||
114 | CONFIG_NLS_CODEPAGE_850=y | ||
115 | CONFIG_NLS_CODEPAGE_1250=y | ||
116 | CONFIG_NLS_ASCII=y | ||
117 | CONFIG_NLS_ISO8859_1=y | ||
118 | CONFIG_NLS_ISO8859_15=y | ||
119 | CONFIG_NLS_UTF8=y | ||
120 | CONFIG_STRIP_ASM_SYMS=y | ||
121 | CONFIG_DEBUG_KERNEL=y | ||
122 | # CONFIG_SCHED_DEBUG is not set | ||
123 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
124 | # CONFIG_FTRACE is not set | ||
125 | CONFIG_DEBUG_ZBOOT=y | ||
126 | CONFIG_KEYS=y | ||
127 | CONFIG_KEYS_DEBUG_PROC_KEYS=y | ||
128 | CONFIG_SECURITYFS=y | ||
diff --git a/arch/mips/configs/db1550_defconfig b/arch/mips/configs/db1550_defconfig new file mode 100644 index 00000000000..798a553c9e8 --- /dev/null +++ b/arch/mips/configs/db1550_defconfig | |||
@@ -0,0 +1,157 @@ | |||
1 | CONFIG_MIPS_ALCHEMY=y | ||
2 | CONFIG_MIPS_DB1550=y | ||
3 | CONFIG_NO_HZ=y | ||
4 | CONFIG_HIGH_RES_TIMERS=y | ||
5 | CONFIG_HZ_100=y | ||
6 | # CONFIG_SECCOMP is not set | ||
7 | CONFIG_EXPERIMENTAL=y | ||
8 | CONFIG_LOCALVERSION="-db1550" | ||
9 | CONFIG_KERNEL_LZMA=y | ||
10 | CONFIG_SYSVIPC=y | ||
11 | CONFIG_POSIX_MQUEUE=y | ||
12 | CONFIG_TINY_RCU=y | ||
13 | CONFIG_LOG_BUF_SHIFT=14 | ||
14 | CONFIG_EXPERT=y | ||
15 | # CONFIG_SYSCTL_SYSCALL is not set | ||
16 | # CONFIG_KALLSYMS is not set | ||
17 | # CONFIG_PCSPKR_PLATFORM is not set | ||
18 | # CONFIG_VM_EVENT_COUNTERS is not set | ||
19 | # CONFIG_COMPAT_BRK is not set | ||
20 | CONFIG_SLAB=y | ||
21 | CONFIG_MODULES=y | ||
22 | CONFIG_MODULE_UNLOAD=y | ||
23 | # CONFIG_IOSCHED_DEADLINE is not set | ||
24 | # CONFIG_IOSCHED_CFQ is not set | ||
25 | CONFIG_PCI=y | ||
26 | CONFIG_PCCARD=y | ||
27 | # CONFIG_CARDBUS is not set | ||
28 | CONFIG_PCMCIA_ALCHEMY_DEVBOARD=y | ||
29 | CONFIG_PM=y | ||
30 | CONFIG_PM_RUNTIME=y | ||
31 | CONFIG_NET=y | ||
32 | CONFIG_PACKET=y | ||
33 | CONFIG_UNIX=y | ||
34 | CONFIG_INET=y | ||
35 | CONFIG_IP_MULTICAST=y | ||
36 | CONFIG_IP_PNP=y | ||
37 | CONFIG_IP_PNP_DHCP=y | ||
38 | CONFIG_IP_PNP_BOOTP=y | ||
39 | CONFIG_IP_PNP_RARP=y | ||
40 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set | ||
41 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set | ||
42 | # CONFIG_INET_XFRM_MODE_BEET is not set | ||
43 | # CONFIG_INET_DIAG is not set | ||
44 | # CONFIG_IPV6 is not set | ||
45 | # CONFIG_WIRELESS is not set | ||
46 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
47 | CONFIG_MTD=y | ||
48 | CONFIG_MTD_PARTITIONS=y | ||
49 | CONFIG_MTD_CHAR=y | ||
50 | CONFIG_MTD_BLOCK=y | ||
51 | CONFIG_MTD_CFI=y | ||
52 | CONFIG_MTD_CFI_AMDSTD=y | ||
53 | CONFIG_MTD_PHYSMAP=y | ||
54 | CONFIG_MTD_NAND=y | ||
55 | CONFIG_MTD_NAND_AU1550=y | ||
56 | CONFIG_BLK_DEV_UB=y | ||
57 | # CONFIG_MISC_DEVICES is not set | ||
58 | CONFIG_IDE=y | ||
59 | CONFIG_BLK_DEV_IDECS=y | ||
60 | CONFIG_BLK_DEV_IDECD=y | ||
61 | # CONFIG_BLK_DEV_IDECD_VERBOSE_ERRORS is not set | ||
62 | CONFIG_IDE_TASK_IOCTL=y | ||
63 | # CONFIG_IDEPCI_PCIBUS_ORDER is not set | ||
64 | CONFIG_BLK_DEV_HPT366=y | ||
65 | CONFIG_NETDEVICES=y | ||
66 | CONFIG_MARVELL_PHY=y | ||
67 | CONFIG_DAVICOM_PHY=y | ||
68 | CONFIG_QSEMI_PHY=y | ||
69 | CONFIG_LXT_PHY=y | ||
70 | CONFIG_CICADA_PHY=y | ||
71 | CONFIG_VITESSE_PHY=y | ||
72 | CONFIG_SMSC_PHY=y | ||
73 | CONFIG_BROADCOM_PHY=y | ||
74 | CONFIG_ICPLUS_PHY=y | ||
75 | CONFIG_REALTEK_PHY=y | ||
76 | CONFIG_NATIONAL_PHY=y | ||
77 | CONFIG_STE10XP=y | ||
78 | CONFIG_LSI_ET1011C_PHY=y | ||
79 | CONFIG_NET_ETHERNET=y | ||
80 | CONFIG_MII=y | ||
81 | CONFIG_MIPS_AU1X00_ENET=y | ||
82 | # CONFIG_NETDEV_1000 is not set | ||
83 | # CONFIG_NETDEV_10000 is not set | ||
84 | # CONFIG_WLAN is not set | ||
85 | # CONFIG_INPUT_MOUSEDEV is not set | ||
86 | CONFIG_INPUT_EVDEV=y | ||
87 | # CONFIG_INPUT_KEYBOARD is not set | ||
88 | # CONFIG_INPUT_MOUSE is not set | ||
89 | # CONFIG_SERIO is not set | ||
90 | CONFIG_SERIAL_8250=y | ||
91 | CONFIG_SERIAL_8250_CONSOLE=y | ||
92 | # CONFIG_LEGACY_PTYS is not set | ||
93 | # CONFIG_HW_RANDOM is not set | ||
94 | CONFIG_I2C=y | ||
95 | # CONFIG_I2C_COMPAT is not set | ||
96 | CONFIG_I2C_CHARDEV=y | ||
97 | # CONFIG_I2C_HELPER_AUTO is not set | ||
98 | CONFIG_I2C_AU1550=y | ||
99 | CONFIG_SPI=y | ||
100 | CONFIG_SPI_AU1550=y | ||
101 | # CONFIG_HWMON is not set | ||
102 | # CONFIG_VGA_ARB is not set | ||
103 | # CONFIG_VGA_CONSOLE is not set | ||
104 | CONFIG_SOUND=y | ||
105 | CONFIG_SND=y | ||
106 | CONFIG_SND_HRTIMER=y | ||
107 | CONFIG_SND_DYNAMIC_MINORS=y | ||
108 | # CONFIG_SND_SUPPORT_OLD_API is not set | ||
109 | # CONFIG_SND_VERBOSE_PROCFS is not set | ||
110 | # CONFIG_SND_DRIVERS is not set | ||
111 | # CONFIG_SND_PCI is not set | ||
112 | # CONFIG_SND_SPI is not set | ||
113 | # CONFIG_SND_MIPS is not set | ||
114 | # CONFIG_SND_PCMCIA is not set | ||
115 | CONFIG_SND_SOC=y | ||
116 | CONFIG_SND_SOC_AU1XPSC=y | ||
117 | # CONFIG_HID_SUPPORT is not set | ||
118 | CONFIG_USB=y | ||
119 | # CONFIG_USB_DEVICE_CLASS is not set | ||
120 | CONFIG_USB_DYNAMIC_MINORS=y | ||
121 | CONFIG_USB_SUSPEND=y | ||
122 | CONFIG_USB_EHCI_HCD=y | ||
123 | CONFIG_USB_EHCI_ROOT_HUB_TT=y | ||
124 | CONFIG_USB_OHCI_HCD=y | ||
125 | CONFIG_RTC_CLASS=y | ||
126 | CONFIG_RTC_DRV_AU1XXX=y | ||
127 | CONFIG_EXT2_FS=y | ||
128 | # CONFIG_PROC_PAGE_MONITOR is not set | ||
129 | CONFIG_TMPFS=y | ||
130 | CONFIG_CONFIGFS_FS=y | ||
131 | CONFIG_JFFS2_FS=y | ||
132 | CONFIG_JFFS2_SUMMARY=y | ||
133 | CONFIG_JFFS2_FS_XATTR=y | ||
134 | # CONFIG_JFFS2_FS_POSIX_ACL is not set | ||
135 | # CONFIG_JFFS2_FS_SECURITY is not set | ||
136 | CONFIG_JFFS2_COMPRESSION_OPTIONS=y | ||
137 | CONFIG_JFFS2_LZO=y | ||
138 | CONFIG_JFFS2_RUBIN=y | ||
139 | CONFIG_SQUASHFS=y | ||
140 | CONFIG_NFS_FS=y | ||
141 | CONFIG_NFS_V3=y | ||
142 | CONFIG_ROOT_NFS=y | ||
143 | CONFIG_NLS_CODEPAGE_437=y | ||
144 | CONFIG_NLS_CODEPAGE_850=y | ||
145 | CONFIG_NLS_CODEPAGE_852=y | ||
146 | CONFIG_NLS_CODEPAGE_1250=y | ||
147 | CONFIG_NLS_ASCII=y | ||
148 | CONFIG_NLS_ISO8859_1=y | ||
149 | CONFIG_NLS_ISO8859_15=y | ||
150 | CONFIG_NLS_UTF8=y | ||
151 | CONFIG_DEBUG_KERNEL=y | ||
152 | # CONFIG_SCHED_DEBUG is not set | ||
153 | # CONFIG_FTRACE is not set | ||
154 | CONFIG_DEBUG_ZBOOT=y | ||
155 | CONFIG_KEYS=y | ||
156 | CONFIG_KEYS_DEBUG_PROC_KEYS=y | ||
157 | CONFIG_SECURITYFS=y | ||
diff --git a/arch/mips/configs/mipssim_defconfig b/arch/mips/configs/mipssim_defconfig new file mode 100644 index 00000000000..b5ad7387bbb --- /dev/null +++ b/arch/mips/configs/mipssim_defconfig | |||
@@ -0,0 +1,64 @@ | |||
1 | CONFIG_MIPS_SIM=y | ||
2 | CONFIG_CPU_LITTLE_ENDIAN=y | ||
3 | CONFIG_HZ_100=y | ||
4 | # CONFIG_SECCOMP is not set | ||
5 | CONFIG_EXPERIMENTAL=y | ||
6 | # CONFIG_SWAP is not set | ||
7 | CONFIG_SYSVIPC=y | ||
8 | CONFIG_LOG_BUF_SHIFT=14 | ||
9 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
10 | CONFIG_EXPERT=y | ||
11 | CONFIG_SLAB=y | ||
12 | CONFIG_MODULES=y | ||
13 | CONFIG_MODULE_UNLOAD=y | ||
14 | CONFIG_MODVERSIONS=y | ||
15 | CONFIG_MODULE_SRCVERSION_ALL=y | ||
16 | # CONFIG_BLK_DEV_BSG is not set | ||
17 | CONFIG_NET=y | ||
18 | CONFIG_PACKET=y | ||
19 | CONFIG_UNIX=y | ||
20 | CONFIG_INET=y | ||
21 | CONFIG_IP_MULTICAST=y | ||
22 | CONFIG_IP_ADVANCED_ROUTER=y | ||
23 | CONFIG_IP_PNP=y | ||
24 | CONFIG_IP_PNP_DHCP=y | ||
25 | CONFIG_IP_PNP_BOOTP=y | ||
26 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set | ||
27 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set | ||
28 | # CONFIG_INET_XFRM_MODE_BEET is not set | ||
29 | # CONFIG_INET_LRO is not set | ||
30 | # CONFIG_IPV6 is not set | ||
31 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
32 | # CONFIG_STANDALONE is not set | ||
33 | # CONFIG_PREVENT_FIRMWARE_BUILD is not set | ||
34 | # CONFIG_FW_LOADER is not set | ||
35 | CONFIG_BLK_DEV_LOOP=y | ||
36 | CONFIG_BLK_DEV_NBD=y | ||
37 | # CONFIG_MISC_DEVICES is not set | ||
38 | CONFIG_NETDEVICES=y | ||
39 | CONFIG_NET_ETHERNET=y | ||
40 | CONFIG_MIPS_SIM_NET=y | ||
41 | # CONFIG_NETDEV_1000 is not set | ||
42 | # CONFIG_NETDEV_10000 is not set | ||
43 | # CONFIG_INPUT is not set | ||
44 | # CONFIG_SERIO is not set | ||
45 | # CONFIG_VT is not set | ||
46 | CONFIG_SERIAL_8250=y | ||
47 | CONFIG_SERIAL_8250_CONSOLE=y | ||
48 | CONFIG_SERIAL_8250_NR_UARTS=1 | ||
49 | CONFIG_SERIAL_8250_RUNTIME_UARTS=1 | ||
50 | # CONFIG_HW_RANDOM is not set | ||
51 | # CONFIG_HWMON is not set | ||
52 | # CONFIG_USB_SUPPORT is not set | ||
53 | # CONFIG_DNOTIFY is not set | ||
54 | CONFIG_TMPFS=y | ||
55 | CONFIG_ROMFS_FS=y | ||
56 | CONFIG_NFS_FS=y | ||
57 | CONFIG_NFS_V3=y | ||
58 | CONFIG_ROOT_NFS=y | ||
59 | CONFIG_DEBUG_KERNEL=y | ||
60 | # CONFIG_SCHED_DEBUG is not set | ||
61 | CONFIG_DEBUG_INFO=y | ||
62 | CONFIG_CMDLINE_BOOL=y | ||
63 | CONFIG_CMDLINE="nfsroot=192.168.192.169:/u1/mipsel,timeo=20 ip=dhcp" | ||
64 | # CONFIG_CRC32 is not set | ||
diff --git a/arch/mips/configs/pb1100_defconfig b/arch/mips/configs/pb1100_defconfig new file mode 100644 index 00000000000..75eb1b1f316 --- /dev/null +++ b/arch/mips/configs/pb1100_defconfig | |||
@@ -0,0 +1,124 @@ | |||
1 | CONFIG_MIPS_ALCHEMY=y | ||
2 | CONFIG_MIPS_PB1100=y | ||
3 | CONFIG_NO_HZ=y | ||
4 | CONFIG_HIGH_RES_TIMERS=y | ||
5 | CONFIG_HZ_100=y | ||
6 | # CONFIG_SECCOMP is not set | ||
7 | CONFIG_EXPERIMENTAL=y | ||
8 | CONFIG_LOCALVERSION="-pb1100" | ||
9 | CONFIG_KERNEL_LZMA=y | ||
10 | CONFIG_SYSVIPC=y | ||
11 | CONFIG_POSIX_MQUEUE=y | ||
12 | CONFIG_TINY_RCU=y | ||
13 | CONFIG_LOG_BUF_SHIFT=14 | ||
14 | CONFIG_EXPERT=y | ||
15 | # CONFIG_SYSCTL_SYSCALL is not set | ||
16 | # CONFIG_KALLSYMS is not set | ||
17 | # CONFIG_PCSPKR_PLATFORM is not set | ||
18 | # CONFIG_VM_EVENT_COUNTERS is not set | ||
19 | # CONFIG_COMPAT_BRK is not set | ||
20 | CONFIG_SLAB=y | ||
21 | CONFIG_MODULES=y | ||
22 | CONFIG_MODULE_UNLOAD=y | ||
23 | # CONFIG_LBDAF is not set | ||
24 | # CONFIG_BLK_DEV_BSG is not set | ||
25 | # CONFIG_IOSCHED_DEADLINE is not set | ||
26 | # CONFIG_IOSCHED_CFQ is not set | ||
27 | CONFIG_PCCARD=y | ||
28 | CONFIG_PCMCIA_ALCHEMY_DEVBOARD=y | ||
29 | CONFIG_PM=y | ||
30 | CONFIG_PM_RUNTIME=y | ||
31 | CONFIG_NET=y | ||
32 | CONFIG_PACKET=y | ||
33 | CONFIG_UNIX=y | ||
34 | CONFIG_INET=y | ||
35 | CONFIG_IP_MULTICAST=y | ||
36 | CONFIG_IP_PNP=y | ||
37 | CONFIG_IP_PNP_DHCP=y | ||
38 | CONFIG_IP_PNP_BOOTP=y | ||
39 | CONFIG_IP_PNP_RARP=y | ||
40 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set | ||
41 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set | ||
42 | # CONFIG_INET_XFRM_MODE_BEET is not set | ||
43 | # CONFIG_INET_DIAG is not set | ||
44 | # CONFIG_IPV6 is not set | ||
45 | # CONFIG_WIRELESS is not set | ||
46 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
47 | CONFIG_MTD=y | ||
48 | CONFIG_MTD_PARTITIONS=y | ||
49 | CONFIG_MTD_CHAR=y | ||
50 | CONFIG_MTD_BLOCK=y | ||
51 | CONFIG_MTD_CFI=y | ||
52 | CONFIG_MTD_CFI_AMDSTD=y | ||
53 | CONFIG_MTD_PHYSMAP=y | ||
54 | CONFIG_BLK_DEV_LOOP=y | ||
55 | CONFIG_BLK_DEV_UB=y | ||
56 | # CONFIG_MISC_DEVICES is not set | ||
57 | CONFIG_IDE=y | ||
58 | CONFIG_BLK_DEV_IDECS=y | ||
59 | CONFIG_IDE_TASK_IOCTL=y | ||
60 | # CONFIG_IDE_PROC_FS is not set | ||
61 | CONFIG_NETDEVICES=y | ||
62 | CONFIG_MARVELL_PHY=y | ||
63 | CONFIG_DAVICOM_PHY=y | ||
64 | CONFIG_QSEMI_PHY=y | ||
65 | CONFIG_LXT_PHY=y | ||
66 | CONFIG_CICADA_PHY=y | ||
67 | CONFIG_VITESSE_PHY=y | ||
68 | CONFIG_SMSC_PHY=y | ||
69 | CONFIG_BROADCOM_PHY=y | ||
70 | CONFIG_ICPLUS_PHY=y | ||
71 | CONFIG_REALTEK_PHY=y | ||
72 | CONFIG_NATIONAL_PHY=y | ||
73 | CONFIG_STE10XP=y | ||
74 | CONFIG_LSI_ET1011C_PHY=y | ||
75 | CONFIG_NET_ETHERNET=y | ||
76 | CONFIG_MII=y | ||
77 | CONFIG_MIPS_AU1X00_ENET=y | ||
78 | # CONFIG_NETDEV_1000 is not set | ||
79 | # CONFIG_NETDEV_10000 is not set | ||
80 | # CONFIG_WLAN is not set | ||
81 | # CONFIG_INPUT_MOUSEDEV is not set | ||
82 | CONFIG_INPUT_EVDEV=y | ||
83 | # CONFIG_INPUT_KEYBOARD is not set | ||
84 | # CONFIG_INPUT_MOUSE is not set | ||
85 | # CONFIG_SERIO is not set | ||
86 | CONFIG_VT_HW_CONSOLE_BINDING=y | ||
87 | CONFIG_SERIAL_8250=y | ||
88 | CONFIG_SERIAL_8250_CONSOLE=y | ||
89 | # CONFIG_LEGACY_PTYS is not set | ||
90 | # CONFIG_HW_RANDOM is not set | ||
91 | # CONFIG_HWMON is not set | ||
92 | # CONFIG_VGA_CONSOLE is not set | ||
93 | CONFIG_HIDRAW=y | ||
94 | CONFIG_USB_HIDDEV=y | ||
95 | CONFIG_USB=y | ||
96 | # CONFIG_USB_DEVICE_CLASS is not set | ||
97 | CONFIG_USB_DYNAMIC_MINORS=y | ||
98 | CONFIG_USB_SUSPEND=y | ||
99 | CONFIG_USB_OHCI_HCD=y | ||
100 | CONFIG_RTC_CLASS=y | ||
101 | CONFIG_RTC_DRV_AU1XXX=y | ||
102 | CONFIG_EXT2_FS=y | ||
103 | # CONFIG_PROC_PAGE_MONITOR is not set | ||
104 | CONFIG_TMPFS=y | ||
105 | CONFIG_JFFS2_FS=y | ||
106 | CONFIG_JFFS2_SUMMARY=y | ||
107 | CONFIG_JFFS2_FS_XATTR=y | ||
108 | # CONFIG_JFFS2_FS_POSIX_ACL is not set | ||
109 | # CONFIG_JFFS2_FS_SECURITY is not set | ||
110 | CONFIG_JFFS2_COMPRESSION_OPTIONS=y | ||
111 | CONFIG_JFFS2_LZO=y | ||
112 | CONFIG_JFFS2_RUBIN=y | ||
113 | CONFIG_SQUASHFS=y | ||
114 | CONFIG_NFS_FS=y | ||
115 | CONFIG_NFS_V3=y | ||
116 | CONFIG_ROOT_NFS=y | ||
117 | CONFIG_STRIP_ASM_SYMS=y | ||
118 | CONFIG_DEBUG_KERNEL=y | ||
119 | # CONFIG_SCHED_DEBUG is not set | ||
120 | # CONFIG_FTRACE is not set | ||
121 | CONFIG_DEBUG_ZBOOT=y | ||
122 | CONFIG_KEYS=y | ||
123 | CONFIG_KEYS_DEBUG_PROC_KEYS=y | ||
124 | CONFIG_SECURITYFS=y | ||
diff --git a/arch/mips/configs/pb1200_defconfig b/arch/mips/configs/pb1200_defconfig new file mode 100644 index 00000000000..dcbe2704e5e --- /dev/null +++ b/arch/mips/configs/pb1200_defconfig | |||
@@ -0,0 +1,170 @@ | |||
1 | CONFIG_MIPS_ALCHEMY=y | ||
2 | CONFIG_MIPS_PB1200=y | ||
3 | CONFIG_KSM=y | ||
4 | CONFIG_NO_HZ=y | ||
5 | CONFIG_HIGH_RES_TIMERS=y | ||
6 | CONFIG_HZ_100=y | ||
7 | # CONFIG_SECCOMP is not set | ||
8 | CONFIG_EXPERIMENTAL=y | ||
9 | CONFIG_LOCALVERSION="-pb1200" | ||
10 | CONFIG_KERNEL_LZMA=y | ||
11 | CONFIG_SYSVIPC=y | ||
12 | CONFIG_POSIX_MQUEUE=y | ||
13 | CONFIG_TINY_RCU=y | ||
14 | CONFIG_LOG_BUF_SHIFT=14 | ||
15 | CONFIG_EXPERT=y | ||
16 | # CONFIG_SYSCTL_SYSCALL is not set | ||
17 | # CONFIG_KALLSYMS is not set | ||
18 | # CONFIG_PCSPKR_PLATFORM is not set | ||
19 | # CONFIG_VM_EVENT_COUNTERS is not set | ||
20 | # CONFIG_COMPAT_BRK is not set | ||
21 | CONFIG_SLAB=y | ||
22 | CONFIG_MODULES=y | ||
23 | CONFIG_MODULE_UNLOAD=y | ||
24 | # CONFIG_LBDAF is not set | ||
25 | # CONFIG_BLK_DEV_BSG is not set | ||
26 | # CONFIG_IOSCHED_DEADLINE is not set | ||
27 | # CONFIG_IOSCHED_CFQ is not set | ||
28 | CONFIG_PCCARD=y | ||
29 | CONFIG_PCMCIA_ALCHEMY_DEVBOARD=y | ||
30 | CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y | ||
31 | CONFIG_BINFMT_MISC=y | ||
32 | CONFIG_NET=y | ||
33 | CONFIG_PACKET=y | ||
34 | CONFIG_UNIX=y | ||
35 | CONFIG_INET=y | ||
36 | CONFIG_IP_MULTICAST=y | ||
37 | CONFIG_IP_PNP=y | ||
38 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set | ||
39 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set | ||
40 | # CONFIG_INET_XFRM_MODE_BEET is not set | ||
41 | # CONFIG_INET_DIAG is not set | ||
42 | # CONFIG_IPV6 is not set | ||
43 | # CONFIG_WIRELESS is not set | ||
44 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
45 | CONFIG_MTD=y | ||
46 | CONFIG_MTD_PARTITIONS=y | ||
47 | CONFIG_MTD_CMDLINE_PARTS=y | ||
48 | CONFIG_MTD_CHAR=y | ||
49 | CONFIG_MTD_BLOCK=y | ||
50 | CONFIG_MTD_CFI=y | ||
51 | CONFIG_MTD_CFI_AMDSTD=y | ||
52 | CONFIG_MTD_PHYSMAP=y | ||
53 | CONFIG_MTD_NAND=y | ||
54 | CONFIG_MTD_NAND_PLATFORM=y | ||
55 | CONFIG_BLK_DEV_LOOP=y | ||
56 | CONFIG_BLK_DEV_UB=y | ||
57 | # CONFIG_MISC_DEVICES is not set | ||
58 | CONFIG_IDE=y | ||
59 | CONFIG_BLK_DEV_IDECS=y | ||
60 | CONFIG_BLK_DEV_IDECD=y | ||
61 | CONFIG_IDE_TASK_IOCTL=y | ||
62 | # CONFIG_IDE_PROC_FS is not set | ||
63 | CONFIG_BLK_DEV_IDE_AU1XXX=y | ||
64 | CONFIG_NETDEVICES=y | ||
65 | CONFIG_NET_ETHERNET=y | ||
66 | CONFIG_SMC91X=y | ||
67 | # CONFIG_NETDEV_1000 is not set | ||
68 | # CONFIG_NETDEV_10000 is not set | ||
69 | # CONFIG_WLAN is not set | ||
70 | # CONFIG_INPUT_MOUSEDEV is not set | ||
71 | CONFIG_INPUT_EVDEV=y | ||
72 | # CONFIG_INPUT_KEYBOARD is not set | ||
73 | # CONFIG_INPUT_MOUSE is not set | ||
74 | # CONFIG_SERIO is not set | ||
75 | CONFIG_VT_HW_CONSOLE_BINDING=y | ||
76 | CONFIG_SERIAL_8250=y | ||
77 | CONFIG_SERIAL_8250_CONSOLE=y | ||
78 | CONFIG_SERIAL_8250_NR_UARTS=2 | ||
79 | CONFIG_SERIAL_8250_RUNTIME_UARTS=2 | ||
80 | # CONFIG_LEGACY_PTYS is not set | ||
81 | # CONFIG_HW_RANDOM is not set | ||
82 | CONFIG_I2C=y | ||
83 | # CONFIG_I2C_COMPAT is not set | ||
84 | CONFIG_I2C_CHARDEV=y | ||
85 | # CONFIG_I2C_HELPER_AUTO is not set | ||
86 | CONFIG_I2C_AU1550=y | ||
87 | CONFIG_SPI=y | ||
88 | CONFIG_SPI_AU1550=y | ||
89 | CONFIG_GPIOLIB=y | ||
90 | CONFIG_GPIO_SYSFS=y | ||
91 | CONFIG_SENSORS_ADM1025=y | ||
92 | CONFIG_SENSORS_LM70=y | ||
93 | CONFIG_FB=y | ||
94 | CONFIG_FB_AU1200=y | ||
95 | # CONFIG_VGA_CONSOLE is not set | ||
96 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
97 | CONFIG_FONTS=y | ||
98 | CONFIG_FONT_8x16=y | ||
99 | CONFIG_SOUND=y | ||
100 | CONFIG_SND=y | ||
101 | CONFIG_SND_DYNAMIC_MINORS=y | ||
102 | # CONFIG_SND_SUPPORT_OLD_API is not set | ||
103 | # CONFIG_SND_VERBOSE_PROCFS is not set | ||
104 | # CONFIG_SND_DRIVERS is not set | ||
105 | # CONFIG_SND_SPI is not set | ||
106 | # CONFIG_SND_MIPS is not set | ||
107 | # CONFIG_SND_USB is not set | ||
108 | # CONFIG_SND_PCMCIA is not set | ||
109 | CONFIG_SND_SOC=y | ||
110 | CONFIG_SND_SOC_AU1XPSC=y | ||
111 | CONFIG_SND_SOC_DB1200=y | ||
112 | CONFIG_HIDRAW=y | ||
113 | CONFIG_USB_HIDDEV=y | ||
114 | CONFIG_USB=y | ||
115 | CONFIG_USB_DEBUG=y | ||
116 | CONFIG_USB_ANNOUNCE_NEW_DEVICES=y | ||
117 | # CONFIG_USB_DEVICE_CLASS is not set | ||
118 | CONFIG_USB_DYNAMIC_MINORS=y | ||
119 | CONFIG_USB_EHCI_HCD=y | ||
120 | CONFIG_USB_EHCI_ROOT_HUB_TT=y | ||
121 | CONFIG_USB_OHCI_HCD=y | ||
122 | CONFIG_MMC=y | ||
123 | # CONFIG_MMC_BLOCK_BOUNCE is not set | ||
124 | CONFIG_MMC_AU1X=y | ||
125 | CONFIG_NEW_LEDS=y | ||
126 | CONFIG_LEDS_CLASS=y | ||
127 | CONFIG_LEDS_TRIGGERS=y | ||
128 | CONFIG_RTC_CLASS=y | ||
129 | CONFIG_RTC_DRV_AU1XXX=y | ||
130 | CONFIG_EXT2_FS=y | ||
131 | CONFIG_ISO9660_FS=y | ||
132 | CONFIG_JOLIET=y | ||
133 | CONFIG_ZISOFS=y | ||
134 | CONFIG_UDF_FS=y | ||
135 | CONFIG_VFAT_FS=y | ||
136 | # CONFIG_PROC_PAGE_MONITOR is not set | ||
137 | CONFIG_TMPFS=y | ||
138 | CONFIG_JFFS2_FS=y | ||
139 | CONFIG_JFFS2_SUMMARY=y | ||
140 | CONFIG_JFFS2_COMPRESSION_OPTIONS=y | ||
141 | CONFIG_JFFS2_LZO=y | ||
142 | CONFIG_JFFS2_RUBIN=y | ||
143 | CONFIG_SQUASHFS=y | ||
144 | CONFIG_NFS_FS=y | ||
145 | CONFIG_NFS_V3=y | ||
146 | CONFIG_ROOT_NFS=y | ||
147 | CONFIG_PARTITION_ADVANCED=y | ||
148 | CONFIG_EFI_PARTITION=y | ||
149 | CONFIG_NLS_CODEPAGE_437=y | ||
150 | CONFIG_NLS_CODEPAGE_850=y | ||
151 | CONFIG_NLS_CODEPAGE_852=y | ||
152 | CONFIG_NLS_CODEPAGE_1250=y | ||
153 | CONFIG_NLS_ASCII=y | ||
154 | CONFIG_NLS_ISO8859_1=y | ||
155 | CONFIG_NLS_ISO8859_2=y | ||
156 | CONFIG_NLS_ISO8859_15=y | ||
157 | CONFIG_NLS_UTF8=y | ||
158 | # CONFIG_ENABLE_WARN_DEPRECATED is not set | ||
159 | # CONFIG_ENABLE_MUST_CHECK is not set | ||
160 | CONFIG_MAGIC_SYSRQ=y | ||
161 | CONFIG_STRIP_ASM_SYMS=y | ||
162 | CONFIG_DEBUG_KERNEL=y | ||
163 | # CONFIG_SCHED_DEBUG is not set | ||
164 | # CONFIG_FTRACE is not set | ||
165 | CONFIG_CMDLINE_BOOL=y | ||
166 | CONFIG_CMDLINE="console=ttyS0,115200" | ||
167 | CONFIG_DEBUG_ZBOOT=y | ||
168 | CONFIG_KEYS=y | ||
169 | CONFIG_KEYS_DEBUG_PROC_KEYS=y | ||
170 | CONFIG_SECURITYFS=y | ||
diff --git a/arch/mips/configs/pb1500_defconfig b/arch/mips/configs/pb1500_defconfig new file mode 100644 index 00000000000..fa00487146f --- /dev/null +++ b/arch/mips/configs/pb1500_defconfig | |||
@@ -0,0 +1,141 @@ | |||
1 | CONFIG_MIPS_ALCHEMY=y | ||
2 | CONFIG_MIPS_PB1500=y | ||
3 | CONFIG_NO_HZ=y | ||
4 | CONFIG_HIGH_RES_TIMERS=y | ||
5 | CONFIG_HZ_100=y | ||
6 | # CONFIG_SECCOMP is not set | ||
7 | CONFIG_EXPERIMENTAL=y | ||
8 | CONFIG_LOCALVERSION="-pb1500" | ||
9 | CONFIG_KERNEL_LZMA=y | ||
10 | CONFIG_SYSVIPC=y | ||
11 | CONFIG_POSIX_MQUEUE=y | ||
12 | CONFIG_TINY_RCU=y | ||
13 | CONFIG_LOG_BUF_SHIFT=14 | ||
14 | CONFIG_EXPERT=y | ||
15 | # CONFIG_SYSCTL_SYSCALL is not set | ||
16 | # CONFIG_KALLSYMS is not set | ||
17 | # CONFIG_PCSPKR_PLATFORM is not set | ||
18 | # CONFIG_VM_EVENT_COUNTERS is not set | ||
19 | # CONFIG_COMPAT_BRK is not set | ||
20 | CONFIG_SLAB=y | ||
21 | CONFIG_MODULES=y | ||
22 | CONFIG_MODULE_UNLOAD=y | ||
23 | # CONFIG_IOSCHED_DEADLINE is not set | ||
24 | # CONFIG_IOSCHED_CFQ is not set | ||
25 | CONFIG_PCI=y | ||
26 | CONFIG_PCCARD=y | ||
27 | # CONFIG_CARDBUS is not set | ||
28 | CONFIG_PCMCIA_ALCHEMY_DEVBOARD=y | ||
29 | CONFIG_PM=y | ||
30 | CONFIG_PM_RUNTIME=y | ||
31 | CONFIG_NET=y | ||
32 | CONFIG_PACKET=y | ||
33 | CONFIG_UNIX=y | ||
34 | CONFIG_INET=y | ||
35 | CONFIG_IP_MULTICAST=y | ||
36 | CONFIG_IP_PNP=y | ||
37 | CONFIG_IP_PNP_DHCP=y | ||
38 | CONFIG_IP_PNP_BOOTP=y | ||
39 | CONFIG_IP_PNP_RARP=y | ||
40 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set | ||
41 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set | ||
42 | # CONFIG_INET_XFRM_MODE_BEET is not set | ||
43 | # CONFIG_INET_DIAG is not set | ||
44 | # CONFIG_IPV6 is not set | ||
45 | # CONFIG_WIRELESS is not set | ||
46 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
47 | CONFIG_MTD=y | ||
48 | CONFIG_MTD_PARTITIONS=y | ||
49 | CONFIG_MTD_CHAR=y | ||
50 | CONFIG_MTD_BLOCK=y | ||
51 | CONFIG_MTD_CFI=y | ||
52 | CONFIG_MTD_CFI_AMDSTD=y | ||
53 | CONFIG_MTD_PHYSMAP=y | ||
54 | CONFIG_BLK_DEV_LOOP=y | ||
55 | CONFIG_BLK_DEV_UB=y | ||
56 | # CONFIG_MISC_DEVICES is not set | ||
57 | CONFIG_IDE=y | ||
58 | CONFIG_BLK_DEV_IDECS=y | ||
59 | CONFIG_BLK_DEV_IDECD=y | ||
60 | CONFIG_IDE_TASK_IOCTL=y | ||
61 | # CONFIG_IDEPCI_PCIBUS_ORDER is not set | ||
62 | CONFIG_BLK_DEV_HPT366=y | ||
63 | CONFIG_NETDEVICES=y | ||
64 | CONFIG_MARVELL_PHY=y | ||
65 | CONFIG_DAVICOM_PHY=y | ||
66 | CONFIG_QSEMI_PHY=y | ||
67 | CONFIG_LXT_PHY=y | ||
68 | CONFIG_CICADA_PHY=y | ||
69 | CONFIG_VITESSE_PHY=y | ||
70 | CONFIG_SMSC_PHY=y | ||
71 | CONFIG_BROADCOM_PHY=y | ||
72 | CONFIG_ICPLUS_PHY=y | ||
73 | CONFIG_REALTEK_PHY=y | ||
74 | CONFIG_NATIONAL_PHY=y | ||
75 | CONFIG_STE10XP=y | ||
76 | CONFIG_LSI_ET1011C_PHY=y | ||
77 | CONFIG_NET_ETHERNET=y | ||
78 | CONFIG_MII=y | ||
79 | CONFIG_MIPS_AU1X00_ENET=y | ||
80 | # CONFIG_NETDEV_1000 is not set | ||
81 | # CONFIG_NETDEV_10000 is not set | ||
82 | # CONFIG_WLAN is not set | ||
83 | # CONFIG_INPUT_MOUSEDEV is not set | ||
84 | CONFIG_INPUT_EVDEV=y | ||
85 | # CONFIG_INPUT_KEYBOARD is not set | ||
86 | # CONFIG_INPUT_MOUSE is not set | ||
87 | # CONFIG_SERIO is not set | ||
88 | CONFIG_VT_HW_CONSOLE_BINDING=y | ||
89 | CONFIG_SERIAL_8250=y | ||
90 | CONFIG_SERIAL_8250_CONSOLE=y | ||
91 | # CONFIG_SERIAL_8250_PCI is not set | ||
92 | # CONFIG_LEGACY_PTYS is not set | ||
93 | # CONFIG_HW_RANDOM is not set | ||
94 | # CONFIG_HWMON is not set | ||
95 | # CONFIG_VGA_ARB is not set | ||
96 | CONFIG_FB=y | ||
97 | CONFIG_FIRMWARE_EDID=y | ||
98 | CONFIG_FB_MODE_HELPERS=y | ||
99 | CONFIG_FB_TILEBLITTING=y | ||
100 | CONFIG_FB_S1D13XXX=y | ||
101 | CONFIG_USB_HIDDEV=y | ||
102 | CONFIG_USB=y | ||
103 | # CONFIG_USB_DEVICE_CLASS is not set | ||
104 | CONFIG_USB_DYNAMIC_MINORS=y | ||
105 | CONFIG_USB_OTG_WHITELIST=y | ||
106 | CONFIG_USB_OHCI_HCD=y | ||
107 | CONFIG_RTC_CLASS=y | ||
108 | CONFIG_RTC_DRV_AU1XXX=y | ||
109 | CONFIG_EXT2_FS=y | ||
110 | CONFIG_ISO9660_FS=y | ||
111 | CONFIG_JOLIET=y | ||
112 | CONFIG_ZISOFS=y | ||
113 | CONFIG_UDF_FS=y | ||
114 | CONFIG_VFAT_FS=y | ||
115 | # CONFIG_PROC_PAGE_MONITOR is not set | ||
116 | CONFIG_TMPFS=y | ||
117 | CONFIG_JFFS2_FS=y | ||
118 | CONFIG_JFFS2_SUMMARY=y | ||
119 | CONFIG_JFFS2_COMPRESSION_OPTIONS=y | ||
120 | CONFIG_JFFS2_LZO=y | ||
121 | CONFIG_JFFS2_RUBIN=y | ||
122 | CONFIG_SQUASHFS=y | ||
123 | CONFIG_NFS_FS=y | ||
124 | CONFIG_NFS_V3=y | ||
125 | CONFIG_ROOT_NFS=y | ||
126 | CONFIG_NLS_CODEPAGE_437=y | ||
127 | CONFIG_NLS_CODEPAGE_850=y | ||
128 | CONFIG_NLS_CODEPAGE_852=y | ||
129 | CONFIG_NLS_CODEPAGE_1250=y | ||
130 | CONFIG_NLS_ASCII=y | ||
131 | CONFIG_NLS_ISO8859_1=y | ||
132 | CONFIG_NLS_ISO8859_15=y | ||
133 | CONFIG_NLS_UTF8=y | ||
134 | CONFIG_STRIP_ASM_SYMS=y | ||
135 | CONFIG_DEBUG_KERNEL=y | ||
136 | # CONFIG_SCHED_DEBUG is not set | ||
137 | # CONFIG_FTRACE is not set | ||
138 | CONFIG_DEBUG_ZBOOT=y | ||
139 | CONFIG_KEYS=y | ||
140 | CONFIG_KEYS_DEBUG_PROC_KEYS=y | ||
141 | CONFIG_SECURITYFS=y | ||
diff --git a/arch/mips/configs/pb1550_defconfig b/arch/mips/configs/pb1550_defconfig new file mode 100644 index 00000000000..e83d6497e8b --- /dev/null +++ b/arch/mips/configs/pb1550_defconfig | |||
@@ -0,0 +1,145 @@ | |||
1 | CONFIG_MIPS_ALCHEMY=y | ||
2 | CONFIG_MIPS_PB1550=y | ||
3 | CONFIG_NO_HZ=y | ||
4 | CONFIG_HIGH_RES_TIMERS=y | ||
5 | CONFIG_HZ_100=y | ||
6 | # CONFIG_SECCOMP is not set | ||
7 | CONFIG_EXPERIMENTAL=y | ||
8 | CONFIG_LOCALVERSION="-pb1550" | ||
9 | CONFIG_KERNEL_LZMA=y | ||
10 | CONFIG_SYSVIPC=y | ||
11 | CONFIG_POSIX_MQUEUE=y | ||
12 | CONFIG_TINY_RCU=y | ||
13 | CONFIG_LOG_BUF_SHIFT=14 | ||
14 | CONFIG_EXPERT=y | ||
15 | # CONFIG_SYSCTL_SYSCALL is not set | ||
16 | # CONFIG_KALLSYMS is not set | ||
17 | # CONFIG_PCSPKR_PLATFORM is not set | ||
18 | # CONFIG_VM_EVENT_COUNTERS is not set | ||
19 | # CONFIG_COMPAT_BRK is not set | ||
20 | CONFIG_SLAB=y | ||
21 | CONFIG_MODULES=y | ||
22 | CONFIG_MODULE_UNLOAD=y | ||
23 | # CONFIG_IOSCHED_DEADLINE is not set | ||
24 | # CONFIG_IOSCHED_CFQ is not set | ||
25 | CONFIG_PCI=y | ||
26 | CONFIG_PCCARD=y | ||
27 | # CONFIG_CARDBUS is not set | ||
28 | CONFIG_PCMCIA_ALCHEMY_DEVBOARD=y | ||
29 | CONFIG_PM=y | ||
30 | CONFIG_PM_RUNTIME=y | ||
31 | CONFIG_NET=y | ||
32 | CONFIG_PACKET=y | ||
33 | CONFIG_UNIX=y | ||
34 | CONFIG_INET=y | ||
35 | CONFIG_IP_MULTICAST=y | ||
36 | CONFIG_IP_PNP=y | ||
37 | CONFIG_IP_PNP_DHCP=y | ||
38 | CONFIG_IP_PNP_BOOTP=y | ||
39 | CONFIG_IP_PNP_RARP=y | ||
40 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set | ||
41 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set | ||
42 | # CONFIG_INET_XFRM_MODE_BEET is not set | ||
43 | # CONFIG_INET_DIAG is not set | ||
44 | # CONFIG_IPV6 is not set | ||
45 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
46 | CONFIG_MTD=y | ||
47 | CONFIG_MTD_PARTITIONS=y | ||
48 | CONFIG_MTD_CHAR=y | ||
49 | CONFIG_MTD_BLOCK=y | ||
50 | CONFIG_MTD_CFI=y | ||
51 | CONFIG_MTD_CFI_AMDSTD=y | ||
52 | CONFIG_MTD_PHYSMAP=y | ||
53 | CONFIG_MTD_NAND=y | ||
54 | CONFIG_MTD_NAND_AU1550=y | ||
55 | CONFIG_BLK_DEV_LOOP=y | ||
56 | CONFIG_BLK_DEV_UB=y | ||
57 | # CONFIG_MISC_DEVICES is not set | ||
58 | CONFIG_IDE=y | ||
59 | CONFIG_BLK_DEV_IDECS=y | ||
60 | CONFIG_BLK_DEV_IDECD=y | ||
61 | # CONFIG_BLK_DEV_IDECD_VERBOSE_ERRORS is not set | ||
62 | # CONFIG_IDEPCI_PCIBUS_ORDER is not set | ||
63 | CONFIG_BLK_DEV_HPT366=y | ||
64 | CONFIG_NETDEVICES=y | ||
65 | CONFIG_MARVELL_PHY=y | ||
66 | CONFIG_DAVICOM_PHY=y | ||
67 | CONFIG_QSEMI_PHY=y | ||
68 | CONFIG_LXT_PHY=y | ||
69 | CONFIG_CICADA_PHY=y | ||
70 | CONFIG_VITESSE_PHY=y | ||
71 | CONFIG_SMSC_PHY=y | ||
72 | CONFIG_BROADCOM_PHY=y | ||
73 | CONFIG_ICPLUS_PHY=y | ||
74 | CONFIG_REALTEK_PHY=y | ||
75 | CONFIG_NATIONAL_PHY=y | ||
76 | CONFIG_STE10XP=y | ||
77 | CONFIG_LSI_ET1011C_PHY=y | ||
78 | CONFIG_NET_ETHERNET=y | ||
79 | CONFIG_MII=y | ||
80 | CONFIG_MIPS_AU1X00_ENET=y | ||
81 | # CONFIG_NETDEV_1000 is not set | ||
82 | # CONFIG_NETDEV_10000 is not set | ||
83 | # CONFIG_WLAN is not set | ||
84 | # CONFIG_INPUT_MOUSEDEV is not set | ||
85 | CONFIG_INPUT_EVDEV=y | ||
86 | # CONFIG_INPUT_KEYBOARD is not set | ||
87 | # CONFIG_INPUT_MOUSE is not set | ||
88 | # CONFIG_SERIO is not set | ||
89 | CONFIG_VT_HW_CONSOLE_BINDING=y | ||
90 | CONFIG_SERIAL_8250=y | ||
91 | CONFIG_SERIAL_8250_CONSOLE=y | ||
92 | # CONFIG_SERIAL_8250_PCI is not set | ||
93 | # CONFIG_LEGACY_PTYS is not set | ||
94 | # CONFIG_HW_RANDOM is not set | ||
95 | CONFIG_I2C=y | ||
96 | # CONFIG_I2C_COMPAT is not set | ||
97 | CONFIG_I2C_CHARDEV=y | ||
98 | # CONFIG_I2C_HELPER_AUTO is not set | ||
99 | CONFIG_I2C_AU1550=y | ||
100 | # CONFIG_HWMON is not set | ||
101 | # CONFIG_VGA_ARB is not set | ||
102 | CONFIG_HIDRAW=y | ||
103 | CONFIG_USB_HIDDEV=y | ||
104 | CONFIG_USB=y | ||
105 | CONFIG_USB_DEVICEFS=y | ||
106 | CONFIG_USB_DYNAMIC_MINORS=y | ||
107 | CONFIG_USB_SUSPEND=y | ||
108 | CONFIG_USB_EHCI_HCD=y | ||
109 | CONFIG_USB_EHCI_ROOT_HUB_TT=y | ||
110 | CONFIG_USB_OHCI_HCD=y | ||
111 | CONFIG_RTC_CLASS=y | ||
112 | CONFIG_RTC_DRV_AU1XXX=y | ||
113 | CONFIG_EXT2_FS=y | ||
114 | CONFIG_ISO9660_FS=y | ||
115 | CONFIG_JOLIET=y | ||
116 | CONFIG_ZISOFS=y | ||
117 | CONFIG_UDF_FS=y | ||
118 | CONFIG_VFAT_FS=y | ||
119 | # CONFIG_PROC_PAGE_MONITOR is not set | ||
120 | CONFIG_TMPFS=y | ||
121 | CONFIG_JFFS2_FS=y | ||
122 | CONFIG_JFFS2_SUMMARY=y | ||
123 | CONFIG_JFFS2_COMPRESSION_OPTIONS=y | ||
124 | CONFIG_JFFS2_LZO=y | ||
125 | CONFIG_JFFS2_RUBIN=y | ||
126 | CONFIG_SQUASHFS=y | ||
127 | CONFIG_NFS_FS=y | ||
128 | CONFIG_NFS_V3=y | ||
129 | CONFIG_ROOT_NFS=y | ||
130 | CONFIG_NLS_CODEPAGE_437=y | ||
131 | CONFIG_NLS_CODEPAGE_850=y | ||
132 | CONFIG_NLS_CODEPAGE_852=y | ||
133 | CONFIG_NLS_CODEPAGE_1250=y | ||
134 | CONFIG_NLS_ASCII=y | ||
135 | CONFIG_NLS_ISO8859_1=y | ||
136 | CONFIG_NLS_ISO8859_15=y | ||
137 | CONFIG_NLS_UTF8=y | ||
138 | CONFIG_STRIP_ASM_SYMS=y | ||
139 | CONFIG_DEBUG_KERNEL=y | ||
140 | # CONFIG_SCHED_DEBUG is not set | ||
141 | # CONFIG_FTRACE is not set | ||
142 | CONFIG_DEBUG_ZBOOT=y | ||
143 | CONFIG_KEYS=y | ||
144 | CONFIG_KEYS_DEBUG_PROC_KEYS=y | ||
145 | CONFIG_SECURITYFS=y | ||
diff --git a/arch/mips/configs/pnx8335-stb225_defconfig b/arch/mips/configs/pnx8335-stb225_defconfig new file mode 100644 index 00000000000..f2925769dfa --- /dev/null +++ b/arch/mips/configs/pnx8335-stb225_defconfig | |||
@@ -0,0 +1,98 @@ | |||
1 | CONFIG_NXP_STB225=y | ||
2 | CONFIG_CPU_LITTLE_ENDIAN=y | ||
3 | CONFIG_NO_HZ=y | ||
4 | CONFIG_HIGH_RES_TIMERS=y | ||
5 | CONFIG_HZ_128=y | ||
6 | CONFIG_PREEMPT_VOLUNTARY=y | ||
7 | # CONFIG_SECCOMP is not set | ||
8 | CONFIG_EXPERIMENTAL=y | ||
9 | # CONFIG_LOCALVERSION_AUTO is not set | ||
10 | # CONFIG_SWAP is not set | ||
11 | CONFIG_SYSVIPC=y | ||
12 | CONFIG_LOG_BUF_SHIFT=14 | ||
13 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
14 | CONFIG_EXPERT=y | ||
15 | CONFIG_SLAB=y | ||
16 | CONFIG_MODULES=y | ||
17 | CONFIG_MODULE_UNLOAD=y | ||
18 | # CONFIG_BLK_DEV_BSG is not set | ||
19 | # CONFIG_IOSCHED_DEADLINE is not set | ||
20 | # CONFIG_IOSCHED_CFQ is not set | ||
21 | CONFIG_PM=y | ||
22 | CONFIG_NET=y | ||
23 | CONFIG_PACKET=y | ||
24 | CONFIG_UNIX=y | ||
25 | CONFIG_INET=y | ||
26 | CONFIG_IP_MULTICAST=y | ||
27 | CONFIG_IP_PNP=y | ||
28 | CONFIG_IP_PNP_DHCP=y | ||
29 | CONFIG_INET_AH=y | ||
30 | # CONFIG_INET_LRO is not set | ||
31 | # CONFIG_IPV6 is not set | ||
32 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
33 | CONFIG_MTD=y | ||
34 | CONFIG_MTD_PARTITIONS=y | ||
35 | CONFIG_MTD_CMDLINE_PARTS=y | ||
36 | CONFIG_MTD_CHAR=y | ||
37 | CONFIG_MTD_BLOCK=y | ||
38 | CONFIG_MTD_CFI=y | ||
39 | CONFIG_MTD_CFI_ADV_OPTIONS=y | ||
40 | CONFIG_MTD_CFI_LE_BYTE_SWAP=y | ||
41 | CONFIG_MTD_CFI_GEOMETRY=y | ||
42 | CONFIG_MTD_CFI_AMDSTD=y | ||
43 | CONFIG_MTD_PHYSMAP=y | ||
44 | CONFIG_BLK_DEV_LOOP=y | ||
45 | # CONFIG_MISC_DEVICES is not set | ||
46 | CONFIG_BLK_DEV_SD=y | ||
47 | # CONFIG_SCSI_LOWLEVEL is not set | ||
48 | CONFIG_ATA=y | ||
49 | CONFIG_NETDEVICES=y | ||
50 | CONFIG_NET_ETHERNET=y | ||
51 | CONFIG_MII=y | ||
52 | # CONFIG_NETDEV_1000 is not set | ||
53 | # CONFIG_NETDEV_10000 is not set | ||
54 | # CONFIG_INPUT_MOUSEDEV is not set | ||
55 | CONFIG_INPUT_EVDEV=m | ||
56 | CONFIG_INPUT_EVBUG=m | ||
57 | # CONFIG_INPUT_KEYBOARD is not set | ||
58 | # CONFIG_INPUT_MOUSE is not set | ||
59 | # CONFIG_SERIO_I8042 is not set | ||
60 | # CONFIG_VT_CONSOLE is not set | ||
61 | CONFIG_SERIAL_PNX8XXX=y | ||
62 | CONFIG_SERIAL_PNX8XXX_CONSOLE=y | ||
63 | # CONFIG_LEGACY_PTYS is not set | ||
64 | CONFIG_HW_RANDOM=y | ||
65 | CONFIG_I2C=y | ||
66 | CONFIG_I2C_CHARDEV=y | ||
67 | # CONFIG_HWMON is not set | ||
68 | CONFIG_FB=y | ||
69 | # CONFIG_VGA_CONSOLE is not set | ||
70 | CONFIG_SOUND=m | ||
71 | CONFIG_SND=m | ||
72 | CONFIG_SND_SEQUENCER=m | ||
73 | CONFIG_SND_MIXER_OSS=m | ||
74 | CONFIG_SND_PCM_OSS=m | ||
75 | CONFIG_SND_SEQUENCER_OSS=y | ||
76 | CONFIG_SND_VERBOSE_PRINTK=y | ||
77 | CONFIG_SND_DEBUG=y | ||
78 | CONFIG_EXT2_FS=m | ||
79 | # CONFIG_DNOTIFY is not set | ||
80 | CONFIG_MSDOS_FS=m | ||
81 | CONFIG_VFAT_FS=m | ||
82 | CONFIG_TMPFS=y | ||
83 | CONFIG_JFFS2_FS=y | ||
84 | CONFIG_CRAMFS=y | ||
85 | CONFIG_NFS_FS=y | ||
86 | CONFIG_NFS_V3=y | ||
87 | CONFIG_ROOT_NFS=y | ||
88 | CONFIG_NFSD=m | ||
89 | CONFIG_NFSD_V3=y | ||
90 | CONFIG_NLS=y | ||
91 | CONFIG_NLS_CODEPAGE_437=m | ||
92 | CONFIG_NLS_CODEPAGE_850=m | ||
93 | CONFIG_NLS_CODEPAGE_932=m | ||
94 | CONFIG_NLS_ASCII=m | ||
95 | CONFIG_NLS_ISO8859_1=m | ||
96 | CONFIG_NLS_ISO8859_15=m | ||
97 | CONFIG_NLS_UTF8=m | ||
98 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
diff --git a/arch/mips/configs/pnx8550-jbs_defconfig b/arch/mips/configs/pnx8550-jbs_defconfig new file mode 100644 index 00000000000..1d1f2067f3e --- /dev/null +++ b/arch/mips/configs/pnx8550-jbs_defconfig | |||
@@ -0,0 +1,98 @@ | |||
1 | CONFIG_PNX8550_JBS=y | ||
2 | CONFIG_EXPERIMENTAL=y | ||
3 | CONFIG_SYSVIPC=y | ||
4 | CONFIG_IKCONFIG=y | ||
5 | CONFIG_IKCONFIG_PROC=y | ||
6 | CONFIG_LOG_BUF_SHIFT=14 | ||
7 | CONFIG_BLK_DEV_INITRD=y | ||
8 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
9 | CONFIG_EXPERT=y | ||
10 | # CONFIG_SYSCTL_SYSCALL is not set | ||
11 | CONFIG_SLAB=y | ||
12 | CONFIG_MODULES=y | ||
13 | CONFIG_PCI=y | ||
14 | CONFIG_PM=y | ||
15 | CONFIG_PACKET=y | ||
16 | CONFIG_UNIX=y | ||
17 | CONFIG_XFRM_MIGRATE=y | ||
18 | CONFIG_INET=y | ||
19 | CONFIG_IP_PNP=y | ||
20 | CONFIG_IP_PNP_DHCP=y | ||
21 | CONFIG_IP_PNP_BOOTP=y | ||
22 | CONFIG_TCP_MD5SIG=y | ||
23 | # CONFIG_IPV6 is not set | ||
24 | CONFIG_BLK_DEV_LOOP=y | ||
25 | CONFIG_BLK_DEV_RAM=y | ||
26 | CONFIG_BLK_DEV_RAM_SIZE=8192 | ||
27 | CONFIG_SGI_IOC4=m | ||
28 | CONFIG_IDE=y | ||
29 | CONFIG_BLK_DEV_IDECD=m | ||
30 | CONFIG_IDE_GENERIC=y | ||
31 | CONFIG_BLK_DEV_OFFBOARD=y | ||
32 | CONFIG_BLK_DEV_GENERIC=y | ||
33 | CONFIG_BLK_DEV_HPT366=y | ||
34 | CONFIG_BLK_DEV_IT8213=m | ||
35 | CONFIG_BLK_DEV_TC86C001=m | ||
36 | CONFIG_SCSI=y | ||
37 | CONFIG_SCSI_TGT=m | ||
38 | CONFIG_BLK_DEV_SD=y | ||
39 | CONFIG_SCSI_CONSTANTS=y | ||
40 | CONFIG_SCSI_SCAN_ASYNC=y | ||
41 | CONFIG_SCSI_FC_ATTRS=y | ||
42 | CONFIG_ISCSI_TCP=m | ||
43 | CONFIG_NETDEVICES=y | ||
44 | CONFIG_NET_ETHERNET=y | ||
45 | CONFIG_NET_PCI=y | ||
46 | CONFIG_8139TOO=y | ||
47 | # CONFIG_8139TOO_PIO is not set | ||
48 | CONFIG_8139TOO_TUNE_TWISTER=y | ||
49 | CONFIG_8139TOO_8129=y | ||
50 | CONFIG_CHELSIO_T3=m | ||
51 | CONFIG_NETXEN_NIC=m | ||
52 | # CONFIG_INPUT_MOUSEDEV is not set | ||
53 | # CONFIG_INPUT_KEYBOARD is not set | ||
54 | # CONFIG_INPUT_MOUSE is not set | ||
55 | # CONFIG_SERIO_I8042 is not set | ||
56 | # CONFIG_SERIO_SERPORT is not set | ||
57 | CONFIG_SERIO_LIBPS2=y | ||
58 | CONFIG_SERIAL_PNX8XXX=y | ||
59 | CONFIG_SERIAL_PNX8XXX_CONSOLE=y | ||
60 | CONFIG_HW_RANDOM=y | ||
61 | # CONFIG_VGA_CONSOLE is not set | ||
62 | # CONFIG_HID is not set | ||
63 | # CONFIG_USB_HID is not set | ||
64 | CONFIG_USB=y | ||
65 | CONFIG_USB_MON=y | ||
66 | CONFIG_USB_OHCI_HCD=y | ||
67 | CONFIG_USB_STORAGE=y | ||
68 | CONFIG_USB_STORAGE_DATAFAB=y | ||
69 | CONFIG_USB_STORAGE_FREECOM=y | ||
70 | CONFIG_USB_STORAGE_ISD200=y | ||
71 | CONFIG_USB_STORAGE_USBAT=y | ||
72 | CONFIG_USB_STORAGE_SDDR09=y | ||
73 | CONFIG_USB_STORAGE_SDDR55=y | ||
74 | CONFIG_USB_STORAGE_JUMPSHOT=y | ||
75 | CONFIG_EXT2_FS=y | ||
76 | # CONFIG_DNOTIFY is not set | ||
77 | CONFIG_MSDOS_FS=y | ||
78 | CONFIG_VFAT_FS=y | ||
79 | CONFIG_TMPFS=y | ||
80 | CONFIG_NFS_FS=y | ||
81 | CONFIG_NFS_V3=y | ||
82 | CONFIG_ROOT_NFS=y | ||
83 | CONFIG_NFSD=m | ||
84 | CONFIG_DLM=m | ||
85 | CONFIG_MAGIC_SYSRQ=y | ||
86 | CONFIG_DEBUG_KERNEL=y | ||
87 | CONFIG_DEBUG_SLAB=y | ||
88 | CONFIG_DEBUG_MUTEXES=y | ||
89 | CONFIG_CMDLINE_BOOL=y | ||
90 | CONFIG_CMDLINE="console=ttyS1,38400n8 root=/dev/nfs ip=bootp" | ||
91 | CONFIG_CRYPTO_CBC=m | ||
92 | CONFIG_CRYPTO_ECB=m | ||
93 | CONFIG_CRYPTO_LRW=m | ||
94 | CONFIG_CRYPTO_PCBC=m | ||
95 | CONFIG_CRYPTO_XCBC=m | ||
96 | CONFIG_CRYPTO_CAMELLIA=m | ||
97 | CONFIG_CRYPTO_FCRYPT=m | ||
98 | CONFIG_CRC_CCITT=m | ||
diff --git a/arch/mips/configs/pnx8550-stb810_defconfig b/arch/mips/configs/pnx8550-stb810_defconfig new file mode 100644 index 00000000000..15c66a571f9 --- /dev/null +++ b/arch/mips/configs/pnx8550-stb810_defconfig | |||
@@ -0,0 +1,92 @@ | |||
1 | CONFIG_PNX8550_STB810=y | ||
2 | CONFIG_EXPERIMENTAL=y | ||
3 | CONFIG_SYSVIPC=y | ||
4 | CONFIG_IKCONFIG=y | ||
5 | CONFIG_IKCONFIG_PROC=y | ||
6 | CONFIG_LOG_BUF_SHIFT=14 | ||
7 | CONFIG_BLK_DEV_INITRD=y | ||
8 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
9 | CONFIG_EXPERT=y | ||
10 | # CONFIG_SYSCTL_SYSCALL is not set | ||
11 | # CONFIG_HOTPLUG is not set | ||
12 | CONFIG_SLAB=y | ||
13 | CONFIG_MODULES=y | ||
14 | CONFIG_PCI=y | ||
15 | CONFIG_PM=y | ||
16 | CONFIG_NET=y | ||
17 | CONFIG_PACKET=y | ||
18 | CONFIG_UNIX=y | ||
19 | CONFIG_XFRM_MIGRATE=y | ||
20 | CONFIG_INET=y | ||
21 | CONFIG_IP_PNP=y | ||
22 | CONFIG_IP_PNP_DHCP=y | ||
23 | CONFIG_IP_PNP_BOOTP=y | ||
24 | # CONFIG_IPV6 is not set | ||
25 | CONFIG_BLK_DEV_LOOP=y | ||
26 | CONFIG_BLK_DEV_RAM=y | ||
27 | CONFIG_BLK_DEV_RAM_SIZE=8192 | ||
28 | CONFIG_IDE=y | ||
29 | CONFIG_BLK_DEV_IDECD=m | ||
30 | CONFIG_IDE_GENERIC=y | ||
31 | CONFIG_BLK_DEV_OFFBOARD=y | ||
32 | CONFIG_BLK_DEV_GENERIC=y | ||
33 | CONFIG_BLK_DEV_HPT366=y | ||
34 | CONFIG_BLK_DEV_IT8213=m | ||
35 | CONFIG_BLK_DEV_TC86C001=m | ||
36 | CONFIG_SCSI=y | ||
37 | CONFIG_SCSI_TGT=m | ||
38 | CONFIG_BLK_DEV_SD=y | ||
39 | CONFIG_SCSI_CONSTANTS=y | ||
40 | CONFIG_SCSI_SCAN_ASYNC=y | ||
41 | CONFIG_ISCSI_TCP=m | ||
42 | CONFIG_NETDEVICES=y | ||
43 | CONFIG_NET_ETHERNET=y | ||
44 | CONFIG_MII=y | ||
45 | CONFIG_NET_PCI=y | ||
46 | CONFIG_NATSEMI=y | ||
47 | CONFIG_CHELSIO_T3=m | ||
48 | # CONFIG_INPUT_MOUSEDEV is not set | ||
49 | # CONFIG_INPUT_KEYBOARD is not set | ||
50 | # CONFIG_INPUT_MOUSE is not set | ||
51 | # CONFIG_SERIO_I8042 is not set | ||
52 | # CONFIG_SERIO_SERPORT is not set | ||
53 | CONFIG_SERIO_LIBPS2=y | ||
54 | CONFIG_HW_RANDOM=y | ||
55 | # CONFIG_VGA_CONSOLE is not set | ||
56 | # CONFIG_HID is not set | ||
57 | # CONFIG_USB_HID is not set | ||
58 | CONFIG_USB=y | ||
59 | CONFIG_USB_MON=y | ||
60 | CONFIG_USB_OHCI_HCD=y | ||
61 | CONFIG_USB_STORAGE=y | ||
62 | CONFIG_USB_STORAGE_DATAFAB=y | ||
63 | CONFIG_USB_STORAGE_FREECOM=y | ||
64 | CONFIG_USB_STORAGE_ISD200=y | ||
65 | CONFIG_USB_STORAGE_USBAT=y | ||
66 | CONFIG_USB_STORAGE_SDDR09=y | ||
67 | CONFIG_USB_STORAGE_SDDR55=y | ||
68 | CONFIG_USB_STORAGE_JUMPSHOT=y | ||
69 | CONFIG_EXT2_FS=y | ||
70 | # CONFIG_DNOTIFY is not set | ||
71 | CONFIG_MSDOS_FS=y | ||
72 | CONFIG_VFAT_FS=y | ||
73 | CONFIG_TMPFS=y | ||
74 | CONFIG_NFS_FS=y | ||
75 | CONFIG_NFS_V3=y | ||
76 | CONFIG_ROOT_NFS=y | ||
77 | CONFIG_NFSD=m | ||
78 | CONFIG_DLM=m | ||
79 | CONFIG_MAGIC_SYSRQ=y | ||
80 | CONFIG_HEADERS_CHECK=y | ||
81 | CONFIG_DEBUG_KERNEL=y | ||
82 | CONFIG_DEBUG_SLAB=y | ||
83 | CONFIG_CMDLINE_BOOL=y | ||
84 | CONFIG_CMDLINE="console=ttyS1,38400n8 root=/dev/nfs ip=bootp" | ||
85 | CONFIG_CRYPTO_CBC=m | ||
86 | CONFIG_CRYPTO_ECB=m | ||
87 | CONFIG_CRYPTO_LRW=m | ||
88 | CONFIG_CRYPTO_PCBC=m | ||
89 | CONFIG_CRYPTO_XCBC=m | ||
90 | CONFIG_CRYPTO_CAMELLIA=m | ||
91 | CONFIG_CRYPTO_FCRYPT=m | ||
92 | CONFIG_CRC_CCITT=m | ||
diff --git a/arch/mips/configs/sb1250-swarm_defconfig b/arch/mips/configs/sb1250-swarm_defconfig new file mode 100644 index 00000000000..5b0463ef938 --- /dev/null +++ b/arch/mips/configs/sb1250-swarm_defconfig | |||
@@ -0,0 +1,125 @@ | |||
1 | CONFIG_SIBYTE_SWARM=y | ||
2 | CONFIG_CPU_SB1_PASS_2_2=y | ||
3 | CONFIG_64BIT=y | ||
4 | CONFIG_SMP=y | ||
5 | CONFIG_HIGH_RES_TIMERS=y | ||
6 | CONFIG_HZ_1000=y | ||
7 | CONFIG_EXPERIMENTAL=y | ||
8 | CONFIG_SYSVIPC=y | ||
9 | CONFIG_LOG_BUF_SHIFT=15 | ||
10 | CONFIG_CGROUPS=y | ||
11 | CONFIG_CPUSETS=y | ||
12 | # CONFIG_PROC_PID_CPUSET is not set | ||
13 | CONFIG_CGROUP_CPUACCT=y | ||
14 | CONFIG_RELAY=y | ||
15 | CONFIG_NAMESPACES=y | ||
16 | CONFIG_BLK_DEV_INITRD=y | ||
17 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
18 | CONFIG_EXPERT=y | ||
19 | # CONFIG_COMPAT_BRK is not set | ||
20 | CONFIG_SLAB=y | ||
21 | CONFIG_MODULES=y | ||
22 | CONFIG_MODULE_UNLOAD=y | ||
23 | CONFIG_MODVERSIONS=y | ||
24 | CONFIG_MODULE_SRCVERSION_ALL=y | ||
25 | CONFIG_PCI=y | ||
26 | CONFIG_MIPS32_COMPAT=y | ||
27 | CONFIG_MIPS32_O32=y | ||
28 | CONFIG_PM=y | ||
29 | CONFIG_NET=y | ||
30 | CONFIG_PACKET=y | ||
31 | CONFIG_UNIX=y | ||
32 | CONFIG_XFRM_USER=m | ||
33 | CONFIG_NET_KEY=y | ||
34 | CONFIG_NET_KEY_MIGRATE=y | ||
35 | CONFIG_INET=y | ||
36 | CONFIG_IP_PNP=y | ||
37 | CONFIG_IP_PNP_DHCP=y | ||
38 | CONFIG_IP_PNP_BOOTP=y | ||
39 | CONFIG_INET_XFRM_MODE_TRANSPORT=m | ||
40 | CONFIG_INET_XFRM_MODE_TUNNEL=m | ||
41 | CONFIG_INET_XFRM_MODE_BEET=m | ||
42 | CONFIG_TCP_MD5SIG=y | ||
43 | # CONFIG_IPV6 is not set | ||
44 | CONFIG_NETWORK_SECMARK=y | ||
45 | CONFIG_CFG80211=m | ||
46 | CONFIG_MAC80211=m | ||
47 | CONFIG_MAC80211_RC_PID=y | ||
48 | CONFIG_MAC80211_RC_DEFAULT_PID=y | ||
49 | CONFIG_RFKILL=m | ||
50 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
51 | CONFIG_FW_LOADER=m | ||
52 | CONFIG_CONNECTOR=m | ||
53 | CONFIG_BLK_DEV_RAM=y | ||
54 | CONFIG_BLK_DEV_RAM_SIZE=9220 | ||
55 | CONFIG_CDROM_PKTCDVD=m | ||
56 | CONFIG_ATA_OVER_ETH=m | ||
57 | CONFIG_SGI_IOC4=m | ||
58 | CONFIG_IDE=y | ||
59 | CONFIG_BLK_DEV_IDECD=y | ||
60 | CONFIG_BLK_DEV_IDETAPE=y | ||
61 | CONFIG_RAID_ATTRS=m | ||
62 | CONFIG_NETDEVICES=y | ||
63 | CONFIG_MACVLAN=m | ||
64 | CONFIG_BROADCOM_PHY=y | ||
65 | CONFIG_NET_ETHERNET=y | ||
66 | CONFIG_MII=y | ||
67 | CONFIG_SB1250_MAC=y | ||
68 | # CONFIG_INPUT is not set | ||
69 | # CONFIG_SERIO_I8042 is not set | ||
70 | CONFIG_SERIO_RAW=m | ||
71 | # CONFIG_VT is not set | ||
72 | # CONFIG_HW_RANDOM is not set | ||
73 | # CONFIG_HWMON is not set | ||
74 | CONFIG_USB=y | ||
75 | CONFIG_USB_DEVICEFS=y | ||
76 | CONFIG_USB_MON=y | ||
77 | CONFIG_USB_OHCI_HCD=y | ||
78 | CONFIG_EXT2_FS=y | ||
79 | CONFIG_EXT2_FS_XATTR=y | ||
80 | CONFIG_EXT2_FS_POSIX_ACL=y | ||
81 | CONFIG_EXT2_FS_SECURITY=y | ||
82 | CONFIG_FUSE_FS=m | ||
83 | CONFIG_PROC_KCORE=y | ||
84 | CONFIG_TMPFS=y | ||
85 | CONFIG_TMPFS_POSIX_ACL=y | ||
86 | CONFIG_NFS_FS=y | ||
87 | CONFIG_NFS_V3=y | ||
88 | CONFIG_ROOT_NFS=y | ||
89 | CONFIG_DLM=m | ||
90 | CONFIG_KEYS=y | ||
91 | CONFIG_KEYS_DEBUG_PROC_KEYS=y | ||
92 | CONFIG_CRYPTO_NULL=m | ||
93 | CONFIG_CRYPTO_CRYPTD=m | ||
94 | CONFIG_CRYPTO_AUTHENC=m | ||
95 | CONFIG_CRYPTO_CCM=m | ||
96 | CONFIG_CRYPTO_GCM=m | ||
97 | CONFIG_CRYPTO_CBC=m | ||
98 | CONFIG_CRYPTO_LRW=m | ||
99 | CONFIG_CRYPTO_PCBC=m | ||
100 | CONFIG_CRYPTO_XTS=m | ||
101 | CONFIG_CRYPTO_HMAC=y | ||
102 | CONFIG_CRYPTO_XCBC=m | ||
103 | CONFIG_CRYPTO_MD4=m | ||
104 | CONFIG_CRYPTO_MICHAEL_MIC=m | ||
105 | CONFIG_CRYPTO_SHA256=m | ||
106 | CONFIG_CRYPTO_SHA512=m | ||
107 | CONFIG_CRYPTO_TGR192=m | ||
108 | CONFIG_CRYPTO_WP512=m | ||
109 | CONFIG_CRYPTO_ANUBIS=m | ||
110 | CONFIG_CRYPTO_BLOWFISH=m | ||
111 | CONFIG_CRYPTO_CAMELLIA=m | ||
112 | CONFIG_CRYPTO_CAST5=m | ||
113 | CONFIG_CRYPTO_CAST6=m | ||
114 | CONFIG_CRYPTO_DES=m | ||
115 | CONFIG_CRYPTO_FCRYPT=m | ||
116 | CONFIG_CRYPTO_KHAZAD=m | ||
117 | CONFIG_CRYPTO_SALSA20=m | ||
118 | CONFIG_CRYPTO_SEED=m | ||
119 | CONFIG_CRYPTO_SERPENT=m | ||
120 | CONFIG_CRYPTO_TEA=m | ||
121 | CONFIG_CRYPTO_TWOFISH=m | ||
122 | CONFIG_CRYPTO_DEFLATE=m | ||
123 | CONFIG_CRYPTO_LZO=m | ||
124 | # CONFIG_CRYPTO_HW is not set | ||
125 | CONFIG_CRC16=m | ||
diff --git a/arch/mips/configs/yosemite_defconfig b/arch/mips/configs/yosemite_defconfig new file mode 100644 index 00000000000..f72d305a3f0 --- /dev/null +++ b/arch/mips/configs/yosemite_defconfig | |||
@@ -0,0 +1,94 @@ | |||
1 | CONFIG_PMC_YOSEMITE=y | ||
2 | CONFIG_HIGHMEM=y | ||
3 | CONFIG_SMP=y | ||
4 | CONFIG_NR_CPUS=2 | ||
5 | CONFIG_HZ_1000=y | ||
6 | CONFIG_SYSVIPC=y | ||
7 | CONFIG_IKCONFIG=y | ||
8 | CONFIG_IKCONFIG_PROC=y | ||
9 | CONFIG_LOG_BUF_SHIFT=14 | ||
10 | CONFIG_RELAY=y | ||
11 | CONFIG_EXPERT=y | ||
12 | CONFIG_SLAB=y | ||
13 | CONFIG_MODULES=y | ||
14 | CONFIG_MODULE_UNLOAD=y | ||
15 | CONFIG_PCI=y | ||
16 | CONFIG_PM=y | ||
17 | CONFIG_NET=y | ||
18 | CONFIG_PACKET=m | ||
19 | CONFIG_UNIX=y | ||
20 | CONFIG_XFRM_USER=m | ||
21 | CONFIG_INET=y | ||
22 | CONFIG_IP_PNP=y | ||
23 | CONFIG_IP_PNP_BOOTP=y | ||
24 | CONFIG_INET_XFRM_MODE_TRANSPORT=m | ||
25 | CONFIG_INET_XFRM_MODE_TUNNEL=m | ||
26 | CONFIG_INET_XFRM_MODE_BEET=m | ||
27 | CONFIG_IPV6_PRIVACY=y | ||
28 | CONFIG_IPV6_ROUTER_PREF=y | ||
29 | CONFIG_INET6_AH=m | ||
30 | CONFIG_INET6_ESP=m | ||
31 | CONFIG_INET6_IPCOMP=m | ||
32 | CONFIG_IPV6_TUNNEL=m | ||
33 | CONFIG_NETWORK_SECMARK=y | ||
34 | CONFIG_FW_LOADER=m | ||
35 | CONFIG_CONNECTOR=m | ||
36 | CONFIG_CDROM_PKTCDVD=m | ||
37 | CONFIG_ATA_OVER_ETH=m | ||
38 | CONFIG_SGI_IOC4=m | ||
39 | CONFIG_RAID_ATTRS=m | ||
40 | CONFIG_NETDEVICES=y | ||
41 | CONFIG_PHYLIB=m | ||
42 | CONFIG_MARVELL_PHY=m | ||
43 | CONFIG_DAVICOM_PHY=m | ||
44 | CONFIG_QSEMI_PHY=m | ||
45 | CONFIG_LXT_PHY=m | ||
46 | CONFIG_CICADA_PHY=m | ||
47 | CONFIG_VITESSE_PHY=m | ||
48 | CONFIG_SMSC_PHY=m | ||
49 | CONFIG_NET_ETHERNET=y | ||
50 | CONFIG_MII=y | ||
51 | CONFIG_QLA3XXX=m | ||
52 | CONFIG_CHELSIO_T3=m | ||
53 | CONFIG_NETXEN_NIC=m | ||
54 | # CONFIG_INPUT is not set | ||
55 | # CONFIG_SERIO is not set | ||
56 | # CONFIG_VT is not set | ||
57 | CONFIG_SERIAL_8250=y | ||
58 | CONFIG_SERIAL_8250_CONSOLE=y | ||
59 | # CONFIG_HW_RANDOM is not set | ||
60 | # CONFIG_HWMON is not set | ||
61 | CONFIG_FUSE_FS=m | ||
62 | CONFIG_PROC_KCORE=y | ||
63 | CONFIG_TMPFS=y | ||
64 | CONFIG_TMPFS_POSIX_ACL=y | ||
65 | CONFIG_NFS_FS=y | ||
66 | CONFIG_ROOT_NFS=y | ||
67 | CONFIG_DEBUG_KERNEL=y | ||
68 | CONFIG_DEBUG_MUTEXES=y | ||
69 | CONFIG_KEYS=y | ||
70 | CONFIG_KEYS_DEBUG_PROC_KEYS=y | ||
71 | CONFIG_CRYPTO_NULL=m | ||
72 | CONFIG_CRYPTO_ECB=m | ||
73 | CONFIG_CRYPTO_PCBC=m | ||
74 | CONFIG_CRYPTO_HMAC=y | ||
75 | CONFIG_CRYPTO_MD4=m | ||
76 | CONFIG_CRYPTO_MICHAEL_MIC=m | ||
77 | CONFIG_CRYPTO_SHA256=m | ||
78 | CONFIG_CRYPTO_SHA512=m | ||
79 | CONFIG_CRYPTO_TGR192=m | ||
80 | CONFIG_CRYPTO_WP512=m | ||
81 | CONFIG_CRYPTO_ANUBIS=m | ||
82 | CONFIG_CRYPTO_ARC4=m | ||
83 | CONFIG_CRYPTO_BLOWFISH=m | ||
84 | CONFIG_CRYPTO_CAMELLIA=m | ||
85 | CONFIG_CRYPTO_CAST5=m | ||
86 | CONFIG_CRYPTO_CAST6=m | ||
87 | CONFIG_CRYPTO_FCRYPT=m | ||
88 | CONFIG_CRYPTO_KHAZAD=m | ||
89 | CONFIG_CRYPTO_SERPENT=m | ||
90 | CONFIG_CRYPTO_TEA=m | ||
91 | CONFIG_CRYPTO_TWOFISH=m | ||
92 | CONFIG_CRC16=m | ||
93 | CONFIG_CRC32=m | ||
94 | CONFIG_LIBCRC32C=m | ||
diff --git a/arch/mips/include/asm/auxvec.h b/arch/mips/include/asm/auxvec.h new file mode 100644 index 00000000000..7cf7f2d2194 --- /dev/null +++ b/arch/mips/include/asm/auxvec.h | |||
@@ -0,0 +1,4 @@ | |||
1 | #ifndef _ASM_AUXVEC_H | ||
2 | #define _ASM_AUXVEC_H | ||
3 | |||
4 | #endif /* _ASM_AUXVEC_H */ | ||
diff --git a/arch/mips/include/asm/bitsperlong.h b/arch/mips/include/asm/bitsperlong.h new file mode 100644 index 00000000000..3e4c10a8e78 --- /dev/null +++ b/arch/mips/include/asm/bitsperlong.h | |||
@@ -0,0 +1,8 @@ | |||
1 | #ifndef __ASM_MIPS_BITSPERLONG_H | ||
2 | #define __ASM_MIPS_BITSPERLONG_H | ||
3 | |||
4 | #define __BITS_PER_LONG _MIPS_SZLONG | ||
5 | |||
6 | #include <asm-generic/bitsperlong.h> | ||
7 | |||
8 | #endif /* __ASM_MIPS_BITSPERLONG_H */ | ||
diff --git a/arch/mips/include/asm/byteorder.h b/arch/mips/include/asm/byteorder.h new file mode 100644 index 00000000000..9579051ff1c --- /dev/null +++ b/arch/mips/include/asm/byteorder.h | |||
@@ -0,0 +1,19 @@ | |||
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) 1996, 99, 2003 by Ralf Baechle | ||
7 | */ | ||
8 | #ifndef _ASM_BYTEORDER_H | ||
9 | #define _ASM_BYTEORDER_H | ||
10 | |||
11 | #if defined(__MIPSEB__) | ||
12 | #include <linux/byteorder/big_endian.h> | ||
13 | #elif defined(__MIPSEL__) | ||
14 | #include <linux/byteorder/little_endian.h> | ||
15 | #else | ||
16 | # error "MIPS, but neither __MIPSEB__, nor __MIPSEL__???" | ||
17 | #endif | ||
18 | |||
19 | #endif /* _ASM_BYTEORDER_H */ | ||
diff --git a/arch/mips/include/asm/cachectl.h b/arch/mips/include/asm/cachectl.h new file mode 100644 index 00000000000..f3ce721861d --- /dev/null +++ b/arch/mips/include/asm/cachectl.h | |||
@@ -0,0 +1,26 @@ | |||
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) 1994, 1995, 1996 by Ralf Baechle | ||
7 | */ | ||
8 | #ifndef _ASM_CACHECTL | ||
9 | #define _ASM_CACHECTL | ||
10 | |||
11 | /* | ||
12 | * Options for cacheflush system call | ||
13 | */ | ||
14 | #define ICACHE (1<<0) /* flush instruction cache */ | ||
15 | #define DCACHE (1<<1) /* writeback and flush data cache */ | ||
16 | #define BCACHE (ICACHE|DCACHE) /* flush both caches */ | ||
17 | |||
18 | /* | ||
19 | * Caching modes for the cachectl(2) call | ||
20 | * | ||
21 | * cachectl(2) is currently not supported and returns ENOSYS. | ||
22 | */ | ||
23 | #define CACHEABLE 0 /* make pages cacheable */ | ||
24 | #define UNCACHEABLE 1 /* make pages uncacheable */ | ||
25 | |||
26 | #endif /* _ASM_CACHECTL */ | ||
diff --git a/arch/mips/include/asm/fcntl.h b/arch/mips/include/asm/fcntl.h new file mode 100644 index 00000000000..75eddedcfc3 --- /dev/null +++ b/arch/mips/include/asm/fcntl.h | |||
@@ -0,0 +1,77 @@ | |||
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) 1995, 96, 97, 98, 99, 2003, 05 Ralf Baechle | ||
7 | */ | ||
8 | #ifndef _ASM_FCNTL_H | ||
9 | #define _ASM_FCNTL_H | ||
10 | |||
11 | |||
12 | #define O_APPEND 0x0008 | ||
13 | #define O_DSYNC 0x0010 /* used to be O_SYNC, see below */ | ||
14 | #define O_NONBLOCK 0x0080 | ||
15 | #define O_CREAT 0x0100 /* not fcntl */ | ||
16 | #define O_TRUNC 0x0200 /* not fcntl */ | ||
17 | #define O_EXCL 0x0400 /* not fcntl */ | ||
18 | #define O_NOCTTY 0x0800 /* not fcntl */ | ||
19 | #define FASYNC 0x1000 /* fcntl, for BSD compatibility */ | ||
20 | #define O_LARGEFILE 0x2000 /* allow large file opens */ | ||
21 | /* | ||
22 | * Before Linux 2.6.33 only O_DSYNC semantics were implemented, but using | ||
23 | * the O_SYNC flag. We continue to use the existing numerical value | ||
24 | * for O_DSYNC semantics now, but using the correct symbolic name for it. | ||
25 | * This new value is used to request true Posix O_SYNC semantics. It is | ||
26 | * defined in this strange way to make sure applications compiled against | ||
27 | * new headers get at least O_DSYNC semantics on older kernels. | ||
28 | * | ||
29 | * This has the nice side-effect that we can simply test for O_DSYNC | ||
30 | * wherever we do not care if O_DSYNC or O_SYNC is used. | ||
31 | * | ||
32 | * Note: __O_SYNC must never be used directly. | ||
33 | */ | ||
34 | #define __O_SYNC 0x4000 | ||
35 | #define O_SYNC (__O_SYNC|O_DSYNC) | ||
36 | #define O_DIRECT 0x8000 /* direct disk access hint */ | ||
37 | |||
38 | #define F_GETLK 14 | ||
39 | #define F_SETLK 6 | ||
40 | #define F_SETLKW 7 | ||
41 | |||
42 | #define F_SETOWN 24 /* for sockets. */ | ||
43 | #define F_GETOWN 23 /* for sockets. */ | ||
44 | |||
45 | #ifndef __mips64 | ||
46 | #define F_GETLK64 33 /* using 'struct flock64' */ | ||
47 | #define F_SETLK64 34 | ||
48 | #define F_SETLKW64 35 | ||
49 | #endif | ||
50 | |||
51 | /* | ||
52 | * The flavours of struct flock. "struct flock" is the ABI compliant | ||
53 | * variant. Finally struct flock64 is the LFS variant of struct flock. As | ||
54 | * a historic accident and inconsistence with the ABI definition it doesn't | ||
55 | * contain all the same fields as struct flock. | ||
56 | */ | ||
57 | |||
58 | #ifdef CONFIG_32BIT | ||
59 | #include <linux/types.h> | ||
60 | |||
61 | struct flock { | ||
62 | short l_type; | ||
63 | short l_whence; | ||
64 | off_t l_start; | ||
65 | off_t l_len; | ||
66 | long l_sysid; | ||
67 | __kernel_pid_t l_pid; | ||
68 | long pad[4]; | ||
69 | }; | ||
70 | |||
71 | #define HAVE_ARCH_STRUCT_FLOCK | ||
72 | |||
73 | #endif /* CONFIG_32BIT */ | ||
74 | |||
75 | #include <asm-generic/fcntl.h> | ||
76 | |||
77 | #endif /* _ASM_FCNTL_H */ | ||
diff --git a/arch/mips/include/asm/ioctl.h b/arch/mips/include/asm/ioctl.h new file mode 100644 index 00000000000..c515a1a4c47 --- /dev/null +++ b/arch/mips/include/asm/ioctl.h | |||
@@ -0,0 +1,27 @@ | |||
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) 1995, 96, 99, 2001 Ralf Baechle <ralf@linux-mips.org> | ||
7 | * Copyright (C) 2009 Wind River Systems | ||
8 | * Written by Ralf Baechle <ralf@linux-mips.org> | ||
9 | */ | ||
10 | #ifndef __ASM_IOCTL_H | ||
11 | #define __ASM_IOCTL_H | ||
12 | |||
13 | #define _IOC_SIZEBITS 13 | ||
14 | #define _IOC_DIRBITS 3 | ||
15 | |||
16 | /* | ||
17 | * Direction bits _IOC_NONE could be 0, but OSF/1 gives it a bit. | ||
18 | * And this turns out useful to catch old ioctl numbers in header | ||
19 | * files for us. | ||
20 | */ | ||
21 | #define _IOC_NONE 1U | ||
22 | #define _IOC_READ 2U | ||
23 | #define _IOC_WRITE 4U | ||
24 | |||
25 | #include <asm-generic/ioctl.h> | ||
26 | |||
27 | #endif /* __ASM_IOCTL_H */ | ||
diff --git a/arch/mips/include/asm/ioctls.h b/arch/mips/include/asm/ioctls.h new file mode 100644 index 00000000000..92403c3d600 --- /dev/null +++ b/arch/mips/include/asm/ioctls.h | |||
@@ -0,0 +1,110 @@ | |||
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) 1995, 1996, 2001 Ralf Baechle | ||
7 | * Copyright (C) 2001 MIPS Technologies, Inc. | ||
8 | */ | ||
9 | #ifndef __ASM_IOCTLS_H | ||
10 | #define __ASM_IOCTLS_H | ||
11 | |||
12 | #include <asm/ioctl.h> | ||
13 | |||
14 | #define TCGETA 0x5401 | ||
15 | #define TCSETA 0x5402 /* Clashes with SNDCTL_TMR_START sound ioctl */ | ||
16 | #define TCSETAW 0x5403 | ||
17 | #define TCSETAF 0x5404 | ||
18 | |||
19 | #define TCSBRK 0x5405 | ||
20 | #define TCXONC 0x5406 | ||
21 | #define TCFLSH 0x5407 | ||
22 | |||
23 | #define TCGETS 0x540d | ||
24 | #define TCSETS 0x540e | ||
25 | #define TCSETSW 0x540f | ||
26 | #define TCSETSF 0x5410 | ||
27 | |||
28 | #define TIOCEXCL 0x740d /* set exclusive use of tty */ | ||
29 | #define TIOCNXCL 0x740e /* reset exclusive use of tty */ | ||
30 | #define TIOCOUTQ 0x7472 /* output queue size */ | ||
31 | #define TIOCSTI 0x5472 /* simulate terminal input */ | ||
32 | #define TIOCMGET 0x741d /* get all modem bits */ | ||
33 | #define TIOCMBIS 0x741b /* bis modem bits */ | ||
34 | #define TIOCMBIC 0x741c /* bic modem bits */ | ||
35 | #define TIOCMSET 0x741a /* set all modem bits */ | ||
36 | #define TIOCPKT 0x5470 /* pty: set/clear packet mode */ | ||
37 | #define TIOCPKT_DATA 0x00 /* data packet */ | ||
38 | #define TIOCPKT_FLUSHREAD 0x01 /* flush packet */ | ||
39 | #define TIOCPKT_FLUSHWRITE 0x02 /* flush packet */ | ||
40 | #define TIOCPKT_STOP 0x04 /* stop output */ | ||
41 | #define TIOCPKT_START 0x08 /* start output */ | ||
42 | #define TIOCPKT_NOSTOP 0x10 /* no more ^S, ^Q */ | ||
43 | #define TIOCPKT_DOSTOP 0x20 /* now do ^S ^Q */ | ||
44 | #define TIOCPKT_IOCTL 0x40 /* state change of pty driver */ | ||
45 | #define TIOCSWINSZ _IOW('t', 103, struct winsize) /* set window size */ | ||
46 | #define TIOCGWINSZ _IOR('t', 104, struct winsize) /* get window size */ | ||
47 | #define TIOCNOTTY 0x5471 /* void tty association */ | ||
48 | #define TIOCSETD 0x7401 | ||
49 | #define TIOCGETD 0x7400 | ||
50 | |||
51 | #define FIOCLEX 0x6601 | ||
52 | #define FIONCLEX 0x6602 | ||
53 | #define FIOASYNC 0x667d | ||
54 | #define FIONBIO 0x667e | ||
55 | #define FIOQSIZE 0x667f | ||
56 | |||
57 | #define TIOCGLTC 0x7474 /* get special local chars */ | ||
58 | #define TIOCSLTC 0x7475 /* set special local chars */ | ||
59 | #define TIOCSPGRP _IOW('t', 118, int) /* set pgrp of tty */ | ||
60 | #define TIOCGPGRP _IOR('t', 119, int) /* get pgrp of tty */ | ||
61 | #define TIOCCONS _IOW('t', 120, int) /* become virtual console */ | ||
62 | |||
63 | #define FIONREAD 0x467f | ||
64 | #define TIOCINQ FIONREAD | ||
65 | |||
66 | #define TIOCGETP 0x7408 | ||
67 | #define TIOCSETP 0x7409 | ||
68 | #define TIOCSETN 0x740a /* TIOCSETP wo flush */ | ||
69 | |||
70 | /* #define TIOCSETA _IOW('t', 20, struct termios) set termios struct */ | ||
71 | /* #define TIOCSETAW _IOW('t', 21, struct termios) drain output, set */ | ||
72 | /* #define TIOCSETAF _IOW('t', 22, struct termios) drn out, fls in, set */ | ||
73 | /* #define TIOCGETD _IOR('t', 26, int) get line discipline */ | ||
74 | /* #define TIOCSETD _IOW('t', 27, int) set line discipline */ | ||
75 | /* 127-124 compat */ | ||
76 | |||
77 | #define TIOCSBRK 0x5427 /* BSD compatibility */ | ||
78 | #define TIOCCBRK 0x5428 /* BSD compatibility */ | ||
79 | #define TIOCGSID 0x7416 /* Return the session ID of FD */ | ||
80 | #define TCGETS2 _IOR('T', 0x2A, struct termios2) | ||
81 | #define TCSETS2 _IOW('T', 0x2B, struct termios2) | ||
82 | #define TCSETSW2 _IOW('T', 0x2C, struct termios2) | ||
83 | #define TCSETSF2 _IOW('T', 0x2D, struct termios2) | ||
84 | #define TIOCGPTN _IOR('T', 0x30, unsigned int) /* Get Pty Number (of pty-mux device) */ | ||
85 | #define TIOCSPTLCK _IOW('T', 0x31, int) /* Lock/unlock Pty */ | ||
86 | #define TIOCGDEV _IOR('T', 0x32, unsigned int) /* Get primary device node of /dev/console */ | ||
87 | #define TIOCSIG _IOW('T', 0x36, int) /* Generate signal on Pty slave */ | ||
88 | #define TIOCVHANGUP 0x5437 | ||
89 | |||
90 | /* I hope the range from 0x5480 on is free ... */ | ||
91 | #define TIOCSCTTY 0x5480 /* become controlling tty */ | ||
92 | #define TIOCGSOFTCAR 0x5481 | ||
93 | #define TIOCSSOFTCAR 0x5482 | ||
94 | #define TIOCLINUX 0x5483 | ||
95 | #define TIOCGSERIAL 0x5484 | ||
96 | #define TIOCSSERIAL 0x5485 | ||
97 | #define TCSBRKP 0x5486 /* Needed for POSIX tcsendbreak() */ | ||
98 | #define TIOCSERCONFIG 0x5488 | ||
99 | #define TIOCSERGWILD 0x5489 | ||
100 | #define TIOCSERSWILD 0x548a | ||
101 | #define TIOCGLCKTRMIOS 0x548b | ||
102 | #define TIOCSLCKTRMIOS 0x548c | ||
103 | #define TIOCSERGSTRUCT 0x548d /* For debugging only */ | ||
104 | #define TIOCSERGETLSR 0x548e /* Get line status register */ | ||
105 | #define TIOCSERGETMULTI 0x548f /* Get multiport config */ | ||
106 | #define TIOCSERSETMULTI 0x5490 /* Set multiport config */ | ||
107 | #define TIOCMIWAIT 0x5491 /* wait for a change on serial input line(s) */ | ||
108 | #define TIOCGICOUNT 0x5492 /* read serial port inline interrupt counts */ | ||
109 | |||
110 | #endif /* __ASM_IOCTLS_H */ | ||
diff --git a/arch/mips/include/asm/ipcbuf.h b/arch/mips/include/asm/ipcbuf.h new file mode 100644 index 00000000000..d47d08f264e --- /dev/null +++ b/arch/mips/include/asm/ipcbuf.h | |||
@@ -0,0 +1,28 @@ | |||
1 | #ifndef _ASM_IPCBUF_H | ||
2 | #define _ASM_IPCBUF_H | ||
3 | |||
4 | /* | ||
5 | * The ipc64_perm structure for alpha architecture. | ||
6 | * Note extra padding because this structure is passed back and forth | ||
7 | * between kernel and user space. | ||
8 | * | ||
9 | * Pad space is left for: | ||
10 | * - 32-bit seq | ||
11 | * - 2 miscellaneous 64-bit values | ||
12 | */ | ||
13 | |||
14 | struct ipc64_perm | ||
15 | { | ||
16 | __kernel_key_t key; | ||
17 | __kernel_uid_t uid; | ||
18 | __kernel_gid_t gid; | ||
19 | __kernel_uid_t cuid; | ||
20 | __kernel_gid_t cgid; | ||
21 | __kernel_mode_t mode; | ||
22 | unsigned short seq; | ||
23 | unsigned short __pad1; | ||
24 | unsigned long __unused1; | ||
25 | unsigned long __unused2; | ||
26 | }; | ||
27 | |||
28 | #endif /* _ASM_IPCBUF_H */ | ||
diff --git a/arch/mips/include/asm/mach-au1x00/au1xxx.h b/arch/mips/include/asm/mach-au1x00/au1xxx.h new file mode 100644 index 00000000000..1b3655090ed --- /dev/null +++ b/arch/mips/include/asm/mach-au1x00/au1xxx.h | |||
@@ -0,0 +1,43 @@ | |||
1 | /* | ||
2 | * This program is free software; you can redistribute it and/or modify it | ||
3 | * under the terms of the GNU General Public License as published by the | ||
4 | * Free Software Foundation; either version 2 of the License, or (at your | ||
5 | * option) any later version. | ||
6 | * | ||
7 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
8 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
9 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
10 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
11 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
12 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
13 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
14 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
15 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
16 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
17 | * | ||
18 | * You should have received a copy of the GNU General Public License along | ||
19 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
20 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
21 | */ | ||
22 | |||
23 | #ifndef _AU1XXX_H_ | ||
24 | #define _AU1XXX_H_ | ||
25 | |||
26 | #include <asm/mach-au1x00/au1000.h> | ||
27 | |||
28 | #if defined(CONFIG_MIPS_DB1000) || defined(CONFIG_MIPS_DB1100) || \ | ||
29 | defined(CONFIG_MIPS_DB1500) || defined(CONFIG_MIPS_DB1550) | ||
30 | #include <asm/mach-db1x00/db1x00.h> | ||
31 | |||
32 | #elif defined(CONFIG_MIPS_PB1550) | ||
33 | #include <asm/mach-pb1x00/pb1550.h> | ||
34 | |||
35 | #elif defined(CONFIG_MIPS_PB1200) | ||
36 | #include <asm/mach-pb1x00/pb1200.h> | ||
37 | |||
38 | #elif defined(CONFIG_MIPS_DB1200) | ||
39 | #include <asm/mach-db1x00/db1200.h> | ||
40 | |||
41 | #endif | ||
42 | |||
43 | #endif /* _AU1XXX_H_ */ | ||
diff --git a/arch/mips/include/asm/mach-db1x00/db1x00.h b/arch/mips/include/asm/mach-db1x00/db1x00.h new file mode 100644 index 00000000000..a919dac525a --- /dev/null +++ b/arch/mips/include/asm/mach-db1x00/db1x00.h | |||
@@ -0,0 +1,79 @@ | |||
1 | /* | ||
2 | * AMD Alchemy DBAu1x00 Reference Boards | ||
3 | * | ||
4 | * Copyright 2001, 2008 MontaVista Software Inc. | ||
5 | * Author: MontaVista Software, Inc. <source@mvista.com> | ||
6 | * Copyright (C) 2005 Ralf Baechle (ralf@linux-mips.org) | ||
7 | * | ||
8 | * ######################################################################## | ||
9 | * | ||
10 | * This program is free software; you can distribute it and/or modify it | ||
11 | * under the terms of the GNU General Public License (Version 2) as | ||
12 | * published by the Free Software Foundation. | ||
13 | * | ||
14 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
15 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
16 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | ||
17 | * for more details. | ||
18 | * | ||
19 | * You should have received a copy of the GNU General Public License along | ||
20 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
21 | * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. | ||
22 | * | ||
23 | * ######################################################################## | ||
24 | * | ||
25 | * | ||
26 | */ | ||
27 | #ifndef __ASM_DB1X00_H | ||
28 | #define __ASM_DB1X00_H | ||
29 | |||
30 | #include <asm/mach-au1x00/au1xxx_psc.h> | ||
31 | |||
32 | #ifdef CONFIG_MIPS_DB1550 | ||
33 | |||
34 | #define DBDMA_AC97_TX_CHAN DSCR_CMD0_PSC1_TX | ||
35 | #define DBDMA_AC97_RX_CHAN DSCR_CMD0_PSC1_RX | ||
36 | #define DBDMA_I2S_TX_CHAN DSCR_CMD0_PSC3_TX | ||
37 | #define DBDMA_I2S_RX_CHAN DSCR_CMD0_PSC3_RX | ||
38 | |||
39 | #define SPI_PSC_BASE PSC0_BASE_ADDR | ||
40 | #define AC97_PSC_BASE PSC1_BASE_ADDR | ||
41 | #define SMBUS_PSC_BASE PSC2_BASE_ADDR | ||
42 | #define I2S_PSC_BASE PSC3_BASE_ADDR | ||
43 | |||
44 | #define NAND_PHYS_ADDR 0x20000000 | ||
45 | |||
46 | #endif | ||
47 | |||
48 | /* | ||
49 | * NAND defines | ||
50 | * | ||
51 | * Timing values as described in databook, * ns value stripped of the | ||
52 | * lower 2 bits. | ||
53 | * These defines are here rather than an Au1550 generic file because | ||
54 | * the parts chosen on another board may be different and may require | ||
55 | * different timings. | ||
56 | */ | ||
57 | #define NAND_T_H (18 >> 2) | ||
58 | #define NAND_T_PUL (30 >> 2) | ||
59 | #define NAND_T_SU (30 >> 2) | ||
60 | #define NAND_T_WH (30 >> 2) | ||
61 | |||
62 | /* Bitfield shift amounts */ | ||
63 | #define NAND_T_H_SHIFT 0 | ||
64 | #define NAND_T_PUL_SHIFT 4 | ||
65 | #define NAND_T_SU_SHIFT 8 | ||
66 | #define NAND_T_WH_SHIFT 12 | ||
67 | |||
68 | #define NAND_TIMING (((NAND_T_H & 0xF) << NAND_T_H_SHIFT) | \ | ||
69 | ((NAND_T_PUL & 0xF) << NAND_T_PUL_SHIFT) | \ | ||
70 | ((NAND_T_SU & 0xF) << NAND_T_SU_SHIFT) | \ | ||
71 | ((NAND_T_WH & 0xF) << NAND_T_WH_SHIFT)) | ||
72 | #define NAND_CS 1 | ||
73 | |||
74 | /* Should be done by YAMON */ | ||
75 | #define NAND_STCFG 0x00400005 /* 8-bit NAND */ | ||
76 | #define NAND_STTIME 0x00007774 /* valid for 396 MHz SD=2 only */ | ||
77 | #define NAND_STADDR 0x12000FFF /* physical address 0x20000000 */ | ||
78 | |||
79 | #endif /* __ASM_DB1X00_H */ | ||
diff --git a/arch/mips/include/asm/mach-mipssim/cpu-feature-overrides.h b/arch/mips/include/asm/mach-mipssim/cpu-feature-overrides.h new file mode 100644 index 00000000000..27aaaa5d925 --- /dev/null +++ b/arch/mips/include/asm/mach-mipssim/cpu-feature-overrides.h | |||
@@ -0,0 +1,67 @@ | |||
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) 2003, 2004 Chris Dearman | ||
7 | */ | ||
8 | #ifndef __ASM_MACH_SIM_CPU_FEATURE_OVERRIDES_H | ||
9 | #define __ASM_MACH_SIM_CPU_FEATURE_OVERRIDES_H | ||
10 | |||
11 | |||
12 | /* | ||
13 | * CPU feature overrides for MIPS boards | ||
14 | */ | ||
15 | #ifdef CONFIG_CPU_MIPS32 | ||
16 | #define cpu_has_tlb 1 | ||
17 | #define cpu_has_4kex 1 | ||
18 | #define cpu_has_4k_cache 1 | ||
19 | #define cpu_has_fpu 0 | ||
20 | /* #define cpu_has_32fpr ? */ | ||
21 | #define cpu_has_counter 1 | ||
22 | /* #define cpu_has_watch ? */ | ||
23 | #define cpu_has_divec 1 | ||
24 | #define cpu_has_vce 0 | ||
25 | /* #define cpu_has_cache_cdex_p ? */ | ||
26 | /* #define cpu_has_cache_cdex_s ? */ | ||
27 | /* #define cpu_has_prefetch ? */ | ||
28 | #define cpu_has_mcheck 1 | ||
29 | /* #define cpu_has_ejtag ? */ | ||
30 | #define cpu_has_llsc 1 | ||
31 | /* #define cpu_has_vtag_icache ? */ | ||
32 | /* #define cpu_has_dc_aliases ? */ | ||
33 | /* #define cpu_has_ic_fills_f_dc ? */ | ||
34 | #define cpu_has_clo_clz 1 | ||
35 | #define cpu_has_nofpuex 0 | ||
36 | /* #define cpu_has_64bits ? */ | ||
37 | /* #define cpu_has_64bit_zero_reg ? */ | ||
38 | /* #define cpu_has_inclusive_pcaches ? */ | ||
39 | #endif | ||
40 | |||
41 | #ifdef CONFIG_CPU_MIPS64 | ||
42 | #define cpu_has_tlb 1 | ||
43 | #define cpu_has_4kex 1 | ||
44 | #define cpu_has_4k_cache 1 | ||
45 | /* #define cpu_has_fpu ? */ | ||
46 | /* #define cpu_has_32fpr ? */ | ||
47 | #define cpu_has_counter 1 | ||
48 | /* #define cpu_has_watch ? */ | ||
49 | #define cpu_has_divec 1 | ||
50 | #define cpu_has_vce 0 | ||
51 | /* #define cpu_has_cache_cdex_p ? */ | ||
52 | /* #define cpu_has_cache_cdex_s ? */ | ||
53 | /* #define cpu_has_prefetch ? */ | ||
54 | #define cpu_has_mcheck 1 | ||
55 | /* #define cpu_has_ejtag ? */ | ||
56 | #define cpu_has_llsc 1 | ||
57 | /* #define cpu_has_vtag_icache ? */ | ||
58 | /* #define cpu_has_dc_aliases ? */ | ||
59 | /* #define cpu_has_ic_fills_f_dc ? */ | ||
60 | #define cpu_has_clo_clz 1 | ||
61 | #define cpu_has_nofpuex 0 | ||
62 | /* #define cpu_has_64bits ? */ | ||
63 | /* #define cpu_has_64bit_zero_reg ? */ | ||
64 | /* #define cpu_has_inclusive_pcaches ? */ | ||
65 | #endif | ||
66 | |||
67 | #endif /* __ASM_MACH_MIPS_CPU_FEATURE_OVERRIDES_H */ | ||
diff --git a/arch/mips/include/asm/mach-mipssim/war.h b/arch/mips/include/asm/mach-mipssim/war.h new file mode 100644 index 00000000000..c8a74a3515e --- /dev/null +++ b/arch/mips/include/asm/mach-mipssim/war.h | |||
@@ -0,0 +1,25 @@ | |||
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) 2002, 2004, 2007 by Ralf Baechle <ralf@linux-mips.org> | ||
7 | */ | ||
8 | #ifndef __ASM_MIPS_MACH_MIPSSIM_WAR_H | ||
9 | #define __ASM_MIPS_MACH_MIPSSIM_WAR_H | ||
10 | |||
11 | #define R4600_V1_INDEX_ICACHEOP_WAR 0 | ||
12 | #define R4600_V1_HIT_CACHEOP_WAR 0 | ||
13 | #define R4600_V2_HIT_CACHEOP_WAR 0 | ||
14 | #define R5432_CP0_INTERRUPT_WAR 0 | ||
15 | #define BCM1250_M3_WAR 0 | ||
16 | #define SIBYTE_1956_WAR 0 | ||
17 | #define MIPS4K_ICACHE_REFILL_WAR 0 | ||
18 | #define MIPS_CACHE_SYNC_WAR 0 | ||
19 | #define TX49XX_ICACHE_INDEX_INV_WAR 0 | ||
20 | #define RM9000_CDEX_SMP_WAR 0 | ||
21 | #define ICACHE_REFILLS_WORKAROUND_WAR 0 | ||
22 | #define R10000_LLSC_WAR 0 | ||
23 | #define MIPS34K_MISSED_ITLB_WAR 0 | ||
24 | |||
25 | #endif /* __ASM_MIPS_MACH_MIPSSIM_WAR_H */ | ||
diff --git a/arch/mips/include/asm/mach-pb1x00/mc146818rtc.h b/arch/mips/include/asm/mach-pb1x00/mc146818rtc.h new file mode 100644 index 00000000000..622c58710e5 --- /dev/null +++ b/arch/mips/include/asm/mach-pb1x00/mc146818rtc.h | |||
@@ -0,0 +1,34 @@ | |||
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) 1998, 2001, 03 by Ralf Baechle | ||
7 | * | ||
8 | * RTC routines for PC style attached Dallas chip. | ||
9 | */ | ||
10 | #ifndef __ASM_MACH_AU1XX_MC146818RTC_H | ||
11 | #define __ASM_MACH_AU1XX_MC146818RTC_H | ||
12 | |||
13 | #include <asm/io.h> | ||
14 | #include <asm/mach-au1x00/au1000.h> | ||
15 | |||
16 | #define RTC_PORT(x) (0x0c000000 + (x)) | ||
17 | #define RTC_IRQ 8 | ||
18 | #define PB1500_RTC_ADDR 0x0c000000 | ||
19 | |||
20 | static inline unsigned char CMOS_READ(unsigned long offset) | ||
21 | { | ||
22 | offset <<= 2; | ||
23 | return (u8)(au_readl(offset + PB1500_RTC_ADDR) & 0xff); | ||
24 | } | ||
25 | |||
26 | static inline void CMOS_WRITE(unsigned char data, unsigned long offset) | ||
27 | { | ||
28 | offset <<= 2; | ||
29 | au_writel(data, offset + PB1500_RTC_ADDR); | ||
30 | } | ||
31 | |||
32 | #define RTC_ALWAYS_BCD 1 | ||
33 | |||
34 | #endif /* __ASM_MACH_AU1XX_MC146818RTC_H */ | ||
diff --git a/arch/mips/include/asm/mach-pb1x00/pb1000.h b/arch/mips/include/asm/mach-pb1x00/pb1000.h new file mode 100644 index 00000000000..65059255dc1 --- /dev/null +++ b/arch/mips/include/asm/mach-pb1x00/pb1000.h | |||
@@ -0,0 +1,87 @@ | |||
1 | /* | ||
2 | * Alchemy Semi Pb1000 Reference Board | ||
3 | * | ||
4 | * Copyright 2001, 2008 MontaVista Software Inc. | ||
5 | * Author: MontaVista Software, Inc. <source@mvista.com> | ||
6 | * | ||
7 | * ######################################################################## | ||
8 | * | ||
9 | * This program is free software; you can distribute it and/or modify it | ||
10 | * under the terms of the GNU General Public License (Version 2) as | ||
11 | * published by the Free Software Foundation. | ||
12 | * | ||
13 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
14 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
15 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | ||
16 | * for more details. | ||
17 | * | ||
18 | * You should have received a copy of the GNU General Public License along | ||
19 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
20 | * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. | ||
21 | * | ||
22 | * ######################################################################## | ||
23 | * | ||
24 | * | ||
25 | */ | ||
26 | #ifndef __ASM_PB1000_H | ||
27 | #define __ASM_PB1000_H | ||
28 | |||
29 | /* PCMCIA PB1000 specific defines */ | ||
30 | #define PCMCIA_MAX_SOCK 1 | ||
31 | #define PCMCIA_NUM_SOCKS (PCMCIA_MAX_SOCK + 1) | ||
32 | |||
33 | #define PB1000_PCR 0xBE000000 | ||
34 | # define PCR_SLOT_0_VPP0 (1 << 0) | ||
35 | # define PCR_SLOT_0_VPP1 (1 << 1) | ||
36 | # define PCR_SLOT_0_VCC0 (1 << 2) | ||
37 | # define PCR_SLOT_0_VCC1 (1 << 3) | ||
38 | # define PCR_SLOT_0_RST (1 << 4) | ||
39 | # define PCR_SLOT_1_VPP0 (1 << 8) | ||
40 | # define PCR_SLOT_1_VPP1 (1 << 9) | ||
41 | # define PCR_SLOT_1_VCC0 (1 << 10) | ||
42 | # define PCR_SLOT_1_VCC1 (1 << 11) | ||
43 | # define PCR_SLOT_1_RST (1 << 12) | ||
44 | |||
45 | #define PB1000_MDR 0xBE000004 | ||
46 | # define MDR_PI (1 << 5) /* PCMCIA int latch */ | ||
47 | # define MDR_EPI (1 << 14) /* enable PCMCIA int */ | ||
48 | # define MDR_CPI (1 << 15) /* clear PCMCIA int */ | ||
49 | |||
50 | #define PB1000_ACR1 0xBE000008 | ||
51 | # define ACR1_SLOT_0_CD1 (1 << 0) /* card detect 1 */ | ||
52 | # define ACR1_SLOT_0_CD2 (1 << 1) /* card detect 2 */ | ||
53 | # define ACR1_SLOT_0_READY (1 << 2) /* ready */ | ||
54 | # define ACR1_SLOT_0_STATUS (1 << 3) /* status change */ | ||
55 | # define ACR1_SLOT_0_VS1 (1 << 4) /* voltage sense 1 */ | ||
56 | # define ACR1_SLOT_0_VS2 (1 << 5) /* voltage sense 2 */ | ||
57 | # define ACR1_SLOT_0_INPACK (1 << 6) /* inpack pin status */ | ||
58 | # define ACR1_SLOT_1_CD1 (1 << 8) /* card detect 1 */ | ||
59 | # define ACR1_SLOT_1_CD2 (1 << 9) /* card detect 2 */ | ||
60 | # define ACR1_SLOT_1_READY (1 << 10) /* ready */ | ||
61 | # define ACR1_SLOT_1_STATUS (1 << 11) /* status change */ | ||
62 | # define ACR1_SLOT_1_VS1 (1 << 12) /* voltage sense 1 */ | ||
63 | # define ACR1_SLOT_1_VS2 (1 << 13) /* voltage sense 2 */ | ||
64 | # define ACR1_SLOT_1_INPACK (1 << 14) /* inpack pin status */ | ||
65 | |||
66 | #define CPLD_AUX0 0xBE00000C | ||
67 | #define CPLD_AUX1 0xBE000010 | ||
68 | #define CPLD_AUX2 0xBE000014 | ||
69 | |||
70 | /* Voltage levels */ | ||
71 | |||
72 | /* VPPEN1 - VPPEN0 */ | ||
73 | #define VPP_GND ((0 << 1) | (0 << 0)) | ||
74 | #define VPP_5V ((1 << 1) | (0 << 0)) | ||
75 | #define VPP_3V ((0 << 1) | (1 << 0)) | ||
76 | #define VPP_12V ((0 << 1) | (1 << 0)) | ||
77 | #define VPP_HIZ ((1 << 1) | (1 << 0)) | ||
78 | |||
79 | /* VCCEN1 - VCCEN0 */ | ||
80 | #define VCC_3V ((0 << 1) | (1 << 0)) | ||
81 | #define VCC_5V ((1 << 1) | (0 << 0)) | ||
82 | #define VCC_HIZ ((0 << 1) | (0 << 0)) | ||
83 | |||
84 | /* VPP/VCC */ | ||
85 | #define SET_VCC_VPP(VCC, VPP, SLOT) \ | ||
86 | ((((VCC) << 2) | ((VPP) << 0)) << ((SLOT) * 8)) | ||
87 | #endif /* __ASM_PB1000_H */ | ||
diff --git a/arch/mips/include/asm/mach-pb1x00/pb1200.h b/arch/mips/include/asm/mach-pb1x00/pb1200.h new file mode 100644 index 00000000000..fce4332ebb7 --- /dev/null +++ b/arch/mips/include/asm/mach-pb1x00/pb1200.h | |||
@@ -0,0 +1,141 @@ | |||
1 | /* | ||
2 | * AMD Alchemy Pb1200 Reference Board | ||
3 | * Board Registers defines. | ||
4 | * | ||
5 | * ######################################################################## | ||
6 | * | ||
7 | * This program is free software; you can distribute it and/or modify it | ||
8 | * under the terms of the GNU General Public License (Version 2) as | ||
9 | * published by the Free Software Foundation. | ||
10 | * | ||
11 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
12 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
13 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | ||
14 | * for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License along | ||
17 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
18 | * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. | ||
19 | * | ||
20 | * ######################################################################## | ||
21 | * | ||
22 | * | ||
23 | */ | ||
24 | #ifndef __ASM_PB1200_H | ||
25 | #define __ASM_PB1200_H | ||
26 | |||
27 | #include <linux/types.h> | ||
28 | #include <asm/mach-au1x00/au1000.h> | ||
29 | #include <asm/mach-au1x00/au1xxx_psc.h> | ||
30 | |||
31 | #define DBDMA_AC97_TX_CHAN DSCR_CMD0_PSC1_TX | ||
32 | #define DBDMA_AC97_RX_CHAN DSCR_CMD0_PSC1_RX | ||
33 | #define DBDMA_I2S_TX_CHAN DSCR_CMD0_PSC1_TX | ||
34 | #define DBDMA_I2S_RX_CHAN DSCR_CMD0_PSC1_RX | ||
35 | |||
36 | /* | ||
37 | * SPI and SMB are muxed on the Pb1200 board. | ||
38 | * Refer to board documentation. | ||
39 | */ | ||
40 | #define SPI_PSC_BASE PSC0_BASE_ADDR | ||
41 | #define SMBUS_PSC_BASE PSC0_BASE_ADDR | ||
42 | /* | ||
43 | * AC97 and I2S are muxed on the Pb1200 board. | ||
44 | * Refer to board documentation. | ||
45 | */ | ||
46 | #define AC97_PSC_BASE PSC1_BASE_ADDR | ||
47 | #define I2S_PSC_BASE PSC1_BASE_ADDR | ||
48 | |||
49 | |||
50 | #define BCSR_SYSTEM_VDDI 0x001F | ||
51 | #define BCSR_SYSTEM_POWEROFF 0x4000 | ||
52 | #define BCSR_SYSTEM_RESET 0x8000 | ||
53 | |||
54 | /* Bit positions for the different interrupt sources */ | ||
55 | #define BCSR_INT_IDE 0x0001 | ||
56 | #define BCSR_INT_ETH 0x0002 | ||
57 | #define BCSR_INT_PC0 0x0004 | ||
58 | #define BCSR_INT_PC0STSCHG 0x0008 | ||
59 | #define BCSR_INT_PC1 0x0010 | ||
60 | #define BCSR_INT_PC1STSCHG 0x0020 | ||
61 | #define BCSR_INT_DC 0x0040 | ||
62 | #define BCSR_INT_FLASHBUSY 0x0080 | ||
63 | #define BCSR_INT_PC0INSERT 0x0100 | ||
64 | #define BCSR_INT_PC0EJECT 0x0200 | ||
65 | #define BCSR_INT_PC1INSERT 0x0400 | ||
66 | #define BCSR_INT_PC1EJECT 0x0800 | ||
67 | #define BCSR_INT_SD0INSERT 0x1000 | ||
68 | #define BCSR_INT_SD0EJECT 0x2000 | ||
69 | #define BCSR_INT_SD1INSERT 0x4000 | ||
70 | #define BCSR_INT_SD1EJECT 0x8000 | ||
71 | |||
72 | #define SMC91C111_PHYS_ADDR 0x0D000300 | ||
73 | #define SMC91C111_INT PB1200_ETH_INT | ||
74 | |||
75 | #define IDE_PHYS_ADDR 0x0C800000 | ||
76 | #define IDE_REG_SHIFT 5 | ||
77 | #define IDE_PHYS_LEN (16 << IDE_REG_SHIFT) | ||
78 | #define IDE_INT PB1200_IDE_INT | ||
79 | #define IDE_DDMA_REQ DSCR_CMD0_DMA_REQ1 | ||
80 | #define IDE_RQSIZE 128 | ||
81 | |||
82 | #define NAND_PHYS_ADDR 0x1C000000 | ||
83 | |||
84 | /* | ||
85 | * Timing values as described in databook, * ns value stripped of | ||
86 | * lower 2 bits. | ||
87 | * These defines are here rather than an Au1200 generic file because | ||
88 | * the parts chosen on another board may be different and may require | ||
89 | * different timings. | ||
90 | */ | ||
91 | #define NAND_T_H (18 >> 2) | ||
92 | #define NAND_T_PUL (30 >> 2) | ||
93 | #define NAND_T_SU (30 >> 2) | ||
94 | #define NAND_T_WH (30 >> 2) | ||
95 | |||
96 | /* Bitfield shift amounts */ | ||
97 | #define NAND_T_H_SHIFT 0 | ||
98 | #define NAND_T_PUL_SHIFT 4 | ||
99 | #define NAND_T_SU_SHIFT 8 | ||
100 | #define NAND_T_WH_SHIFT 12 | ||
101 | |||
102 | #define NAND_TIMING (((NAND_T_H & 0xF) << NAND_T_H_SHIFT) | \ | ||
103 | ((NAND_T_PUL & 0xF) << NAND_T_PUL_SHIFT) | \ | ||
104 | ((NAND_T_SU & 0xF) << NAND_T_SU_SHIFT) | \ | ||
105 | ((NAND_T_WH & 0xF) << NAND_T_WH_SHIFT)) | ||
106 | |||
107 | /* | ||
108 | * External Interrupts for Pb1200 as of 8/6/2004. | ||
109 | * Bit positions in the CPLD registers can be calculated by taking | ||
110 | * the interrupt define and subtracting the PB1200_INT_BEGIN value. | ||
111 | * | ||
112 | * Example: IDE bis pos is = 64 - 64 | ||
113 | * ETH bit pos is = 65 - 64 | ||
114 | */ | ||
115 | enum external_pb1200_ints { | ||
116 | PB1200_INT_BEGIN = AU1000_MAX_INTR + 1, | ||
117 | |||
118 | PB1200_IDE_INT = PB1200_INT_BEGIN, | ||
119 | PB1200_ETH_INT, | ||
120 | PB1200_PC0_INT, | ||
121 | PB1200_PC0_STSCHG_INT, | ||
122 | PB1200_PC1_INT, | ||
123 | PB1200_PC1_STSCHG_INT, | ||
124 | PB1200_DC_INT, | ||
125 | PB1200_FLASHBUSY_INT, | ||
126 | PB1200_PC0_INSERT_INT, | ||
127 | PB1200_PC0_EJECT_INT, | ||
128 | PB1200_PC1_INSERT_INT, | ||
129 | PB1200_PC1_EJECT_INT, | ||
130 | PB1200_SD0_INSERT_INT, | ||
131 | PB1200_SD0_EJECT_INT, | ||
132 | PB1200_SD1_INSERT_INT, | ||
133 | PB1200_SD1_EJECT_INT, | ||
134 | |||
135 | PB1200_INT_END = PB1200_INT_BEGIN + 15 | ||
136 | }; | ||
137 | |||
138 | /* NAND chip select */ | ||
139 | #define NAND_CS 1 | ||
140 | |||
141 | #endif /* __ASM_PB1200_H */ | ||
diff --git a/arch/mips/include/asm/mach-pb1x00/pb1550.h b/arch/mips/include/asm/mach-pb1x00/pb1550.h new file mode 100644 index 00000000000..f835c88e959 --- /dev/null +++ b/arch/mips/include/asm/mach-pb1x00/pb1550.h | |||
@@ -0,0 +1,73 @@ | |||
1 | /* | ||
2 | * AMD Alchemy Semi PB1550 Reference Board | ||
3 | * Board Registers defines. | ||
4 | * | ||
5 | * Copyright 2004 Embedded Edge LLC. | ||
6 | * Copyright 2005 Ralf Baechle (ralf@linux-mips.org) | ||
7 | * | ||
8 | * ######################################################################## | ||
9 | * | ||
10 | * This program is free software; you can distribute it and/or modify it | ||
11 | * under the terms of the GNU General Public License (Version 2) as | ||
12 | * published by the Free Software Foundation. | ||
13 | * | ||
14 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
15 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
16 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | ||
17 | * for more details. | ||
18 | * | ||
19 | * You should have received a copy of the GNU General Public License along | ||
20 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
21 | * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. | ||
22 | * | ||
23 | * ######################################################################## | ||
24 | * | ||
25 | * | ||
26 | */ | ||
27 | #ifndef __ASM_PB1550_H | ||
28 | #define __ASM_PB1550_H | ||
29 | |||
30 | #include <linux/types.h> | ||
31 | #include <asm/mach-au1x00/au1xxx_psc.h> | ||
32 | |||
33 | #define DBDMA_AC97_TX_CHAN DSCR_CMD0_PSC1_TX | ||
34 | #define DBDMA_AC97_RX_CHAN DSCR_CMD0_PSC1_RX | ||
35 | #define DBDMA_I2S_TX_CHAN DSCR_CMD0_PSC3_TX | ||
36 | #define DBDMA_I2S_RX_CHAN DSCR_CMD0_PSC3_RX | ||
37 | |||
38 | #define SPI_PSC_BASE PSC0_BASE_ADDR | ||
39 | #define AC97_PSC_BASE PSC1_BASE_ADDR | ||
40 | #define SMBUS_PSC_BASE PSC2_BASE_ADDR | ||
41 | #define I2S_PSC_BASE PSC3_BASE_ADDR | ||
42 | |||
43 | /* | ||
44 | * Timing values as described in databook, * ns value stripped of | ||
45 | * lower 2 bits. | ||
46 | * These defines are here rather than an SOC1550 generic file because | ||
47 | * the parts chosen on another board may be different and may require | ||
48 | * different timings. | ||
49 | */ | ||
50 | #define NAND_T_H (18 >> 2) | ||
51 | #define NAND_T_PUL (30 >> 2) | ||
52 | #define NAND_T_SU (30 >> 2) | ||
53 | #define NAND_T_WH (30 >> 2) | ||
54 | |||
55 | /* Bitfield shift amounts */ | ||
56 | #define NAND_T_H_SHIFT 0 | ||
57 | #define NAND_T_PUL_SHIFT 4 | ||
58 | #define NAND_T_SU_SHIFT 8 | ||
59 | #define NAND_T_WH_SHIFT 12 | ||
60 | |||
61 | #define NAND_TIMING (((NAND_T_H & 0xF) << NAND_T_H_SHIFT) | \ | ||
62 | ((NAND_T_PUL & 0xF) << NAND_T_PUL_SHIFT) | \ | ||
63 | ((NAND_T_SU & 0xF) << NAND_T_SU_SHIFT) | \ | ||
64 | ((NAND_T_WH & 0xF) << NAND_T_WH_SHIFT)) | ||
65 | |||
66 | #define NAND_CS 1 | ||
67 | |||
68 | /* Should be done by YAMON */ | ||
69 | #define NAND_STCFG 0x00400005 /* 8-bit NAND */ | ||
70 | #define NAND_STTIME 0x00007774 /* valid for 396 MHz SD=2 only */ | ||
71 | #define NAND_STADDR 0x12000FFF /* physical address 0x20000000 */ | ||
72 | |||
73 | #endif /* __ASM_PB1550_H */ | ||
diff --git a/arch/mips/include/asm/mach-yosemite/cpu-feature-overrides.h b/arch/mips/include/asm/mach-yosemite/cpu-feature-overrides.h new file mode 100644 index 00000000000..470e5e9e10d --- /dev/null +++ b/arch/mips/include/asm/mach-yosemite/cpu-feature-overrides.h | |||
@@ -0,0 +1,47 @@ | |||
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) 2003, 04, 07 Ralf Baechle (ralf@linux-mips.org) | ||
7 | */ | ||
8 | #ifndef __ASM_MACH_YOSEMITE_CPU_FEATURE_OVERRIDES_H | ||
9 | #define __ASM_MACH_YOSEMITE_CPU_FEATURE_OVERRIDES_H | ||
10 | |||
11 | /* | ||
12 | * Momentum Jaguar ATX always has the RM9000 processor. | ||
13 | */ | ||
14 | #define cpu_has_watch 1 | ||
15 | #define cpu_has_mips16 0 | ||
16 | #define cpu_has_divec 0 | ||
17 | #define cpu_has_vce 0 | ||
18 | #define cpu_has_cache_cdex_p 0 | ||
19 | #define cpu_has_cache_cdex_s 0 | ||
20 | #define cpu_has_prefetch 1 | ||
21 | #define cpu_has_mcheck 0 | ||
22 | #define cpu_has_ejtag 0 | ||
23 | |||
24 | #define cpu_has_llsc 1 | ||
25 | #define cpu_has_vtag_icache 0 | ||
26 | #define cpu_has_dc_aliases 0 | ||
27 | #define cpu_has_ic_fills_f_dc 0 | ||
28 | #define cpu_has_dsp 0 | ||
29 | #define cpu_has_mipsmt 0 | ||
30 | #define cpu_has_userlocal 0 | ||
31 | #define cpu_icache_snoops_remote_store 0 | ||
32 | |||
33 | #define cpu_has_nofpuex 0 | ||
34 | #define cpu_has_64bits 1 | ||
35 | |||
36 | #define cpu_has_inclusive_pcaches 0 | ||
37 | |||
38 | #define cpu_dcache_line_size() 32 | ||
39 | #define cpu_icache_line_size() 32 | ||
40 | #define cpu_scache_line_size() 32 | ||
41 | |||
42 | #define cpu_has_mips32r1 0 | ||
43 | #define cpu_has_mips32r2 0 | ||
44 | #define cpu_has_mips64r1 0 | ||
45 | #define cpu_has_mips64r2 0 | ||
46 | |||
47 | #endif /* __ASM_MACH_YOSEMITE_CPU_FEATURE_OVERRIDES_H */ | ||
diff --git a/arch/mips/include/asm/mach-yosemite/war.h b/arch/mips/include/asm/mach-yosemite/war.h new file mode 100644 index 00000000000..e5c6d53efc8 --- /dev/null +++ b/arch/mips/include/asm/mach-yosemite/war.h | |||
@@ -0,0 +1,25 @@ | |||
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) 2002, 2004, 2007 by Ralf Baechle <ralf@linux-mips.org> | ||
7 | */ | ||
8 | #ifndef __ASM_MIPS_MACH_YOSEMITE_WAR_H | ||
9 | #define __ASM_MIPS_MACH_YOSEMITE_WAR_H | ||
10 | |||
11 | #define R4600_V1_INDEX_ICACHEOP_WAR 0 | ||
12 | #define R4600_V1_HIT_CACHEOP_WAR 0 | ||
13 | #define R4600_V2_HIT_CACHEOP_WAR 0 | ||
14 | #define R5432_CP0_INTERRUPT_WAR 0 | ||
15 | #define BCM1250_M3_WAR 0 | ||
16 | #define SIBYTE_1956_WAR 0 | ||
17 | #define MIPS4K_ICACHE_REFILL_WAR 0 | ||
18 | #define MIPS_CACHE_SYNC_WAR 0 | ||
19 | #define TX49XX_ICACHE_INDEX_INV_WAR 0 | ||
20 | #define RM9000_CDEX_SMP_WAR 1 | ||
21 | #define ICACHE_REFILLS_WORKAROUND_WAR 1 | ||
22 | #define R10000_LLSC_WAR 0 | ||
23 | #define MIPS34K_MISSED_ITLB_WAR 0 | ||
24 | |||
25 | #endif /* __ASM_MIPS_MACH_YOSEMITE_WAR_H */ | ||
diff --git a/arch/mips/include/asm/mips-boards/simint.h b/arch/mips/include/asm/mips-boards/simint.h new file mode 100644 index 00000000000..8ef6db76d5c --- /dev/null +++ b/arch/mips/include/asm/mips-boards/simint.h | |||
@@ -0,0 +1,31 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2005 MIPS Technologies, Inc. All rights reserved. | ||
3 | * | ||
4 | * This program is free software; you can distribute it and/or modify it | ||
5 | * under the terms of the GNU General Public License (Version 2) as | ||
6 | * published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | ||
11 | * for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License along | ||
14 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
15 | * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. | ||
16 | */ | ||
17 | #ifndef _MIPS_SIMINT_H | ||
18 | #define _MIPS_SIMINT_H | ||
19 | |||
20 | #include <irq.h> | ||
21 | |||
22 | #define SIM_INT_BASE 0 | ||
23 | #define MIPSCPU_INT_MB0 2 | ||
24 | #define MIPS_CPU_TIMER_IRQ 7 | ||
25 | |||
26 | |||
27 | #define MSC01E_INT_BASE 64 | ||
28 | |||
29 | #define MSC01E_INT_CPUCTR 11 | ||
30 | |||
31 | #endif | ||
diff --git a/arch/mips/include/asm/mman.h b/arch/mips/include/asm/mman.h new file mode 100644 index 00000000000..785b4ea4ec3 --- /dev/null +++ b/arch/mips/include/asm/mman.h | |||
@@ -0,0 +1,86 @@ | |||
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) 1995, 1999, 2002 by Ralf Baechle | ||
7 | */ | ||
8 | #ifndef _ASM_MMAN_H | ||
9 | #define _ASM_MMAN_H | ||
10 | |||
11 | /* | ||
12 | * Protections are chosen from these bits, OR'd together. The | ||
13 | * implementation does not necessarily support PROT_EXEC or PROT_WRITE | ||
14 | * without PROT_READ. The only guarantees are that no writing will be | ||
15 | * allowed without PROT_WRITE and no access will be allowed for PROT_NONE. | ||
16 | */ | ||
17 | #define PROT_NONE 0x00 /* page can not be accessed */ | ||
18 | #define PROT_READ 0x01 /* page can be read */ | ||
19 | #define PROT_WRITE 0x02 /* page can be written */ | ||
20 | #define PROT_EXEC 0x04 /* page can be executed */ | ||
21 | /* 0x08 reserved for PROT_EXEC_NOFLUSH */ | ||
22 | #define PROT_SEM 0x10 /* page may be used for atomic ops */ | ||
23 | #define PROT_GROWSDOWN 0x01000000 /* mprotect flag: extend change to start of growsdown vma */ | ||
24 | #define PROT_GROWSUP 0x02000000 /* mprotect flag: extend change to end of growsup vma */ | ||
25 | |||
26 | /* | ||
27 | * Flags for mmap | ||
28 | */ | ||
29 | #define MAP_SHARED 0x001 /* Share changes */ | ||
30 | #define MAP_PRIVATE 0x002 /* Changes are private */ | ||
31 | #define MAP_TYPE 0x00f /* Mask for type of mapping */ | ||
32 | #define MAP_FIXED 0x010 /* Interpret addr exactly */ | ||
33 | |||
34 | /* not used by linux, but here to make sure we don't clash with ABI defines */ | ||
35 | #define MAP_RENAME 0x020 /* Assign page to file */ | ||
36 | #define MAP_AUTOGROW 0x040 /* File may grow by writing */ | ||
37 | #define MAP_LOCAL 0x080 /* Copy on fork/sproc */ | ||
38 | #define MAP_AUTORSRV 0x100 /* Logical swap reserved on demand */ | ||
39 | |||
40 | /* These are linux-specific */ | ||
41 | #define MAP_NORESERVE 0x0400 /* don't check for reservations */ | ||
42 | #define MAP_ANONYMOUS 0x0800 /* don't use a file */ | ||
43 | #define MAP_GROWSDOWN 0x1000 /* stack-like segment */ | ||
44 | #define MAP_DENYWRITE 0x2000 /* ETXTBSY */ | ||
45 | #define MAP_EXECUTABLE 0x4000 /* mark it as an executable */ | ||
46 | #define MAP_LOCKED 0x8000 /* pages are locked */ | ||
47 | #define MAP_POPULATE 0x10000 /* populate (prefault) pagetables */ | ||
48 | #define MAP_NONBLOCK 0x20000 /* do not block on IO */ | ||
49 | #define MAP_STACK 0x40000 /* give out an address that is best suited for process/thread stacks */ | ||
50 | #define MAP_HUGETLB 0x80000 /* create a huge page mapping */ | ||
51 | |||
52 | /* | ||
53 | * Flags for msync | ||
54 | */ | ||
55 | #define MS_ASYNC 0x0001 /* sync memory asynchronously */ | ||
56 | #define MS_INVALIDATE 0x0002 /* invalidate mappings & caches */ | ||
57 | #define MS_SYNC 0x0004 /* synchronous memory sync */ | ||
58 | |||
59 | /* | ||
60 | * Flags for mlockall | ||
61 | */ | ||
62 | #define MCL_CURRENT 1 /* lock all current mappings */ | ||
63 | #define MCL_FUTURE 2 /* lock all future mappings */ | ||
64 | |||
65 | #define MADV_NORMAL 0 /* no further special treatment */ | ||
66 | #define MADV_RANDOM 1 /* expect random page references */ | ||
67 | #define MADV_SEQUENTIAL 2 /* expect sequential page references */ | ||
68 | #define MADV_WILLNEED 3 /* will need these pages */ | ||
69 | #define MADV_DONTNEED 4 /* don't need these pages */ | ||
70 | |||
71 | /* common parameters: try to keep these consistent across architectures */ | ||
72 | #define MADV_REMOVE 9 /* remove these pages & resources */ | ||
73 | #define MADV_DONTFORK 10 /* don't inherit across fork */ | ||
74 | #define MADV_DOFORK 11 /* do inherit across fork */ | ||
75 | |||
76 | #define MADV_MERGEABLE 12 /* KSM may merge identical pages */ | ||
77 | #define MADV_UNMERGEABLE 13 /* KSM may not merge identical pages */ | ||
78 | #define MADV_HWPOISON 100 /* poison a page for testing */ | ||
79 | |||
80 | #define MADV_HUGEPAGE 14 /* Worth backing with hugepages */ | ||
81 | #define MADV_NOHUGEPAGE 15 /* Not worth backing with hugepages */ | ||
82 | |||
83 | /* compatibility flags */ | ||
84 | #define MAP_FILE 0 | ||
85 | |||
86 | #endif /* _ASM_MMAN_H */ | ||
diff --git a/arch/mips/include/asm/msgbuf.h b/arch/mips/include/asm/msgbuf.h new file mode 100644 index 00000000000..0d6c7f14de3 --- /dev/null +++ b/arch/mips/include/asm/msgbuf.h | |||
@@ -0,0 +1,47 @@ | |||
1 | #ifndef _ASM_MSGBUF_H | ||
2 | #define _ASM_MSGBUF_H | ||
3 | |||
4 | |||
5 | /* | ||
6 | * The msqid64_ds structure for the MIPS architecture. | ||
7 | * Note extra padding because this structure is passed back and forth | ||
8 | * between kernel and user space. | ||
9 | * | ||
10 | * Pad space is left for: | ||
11 | * - extension of time_t to 64-bit on 32-bitsystem to solve the y2038 problem | ||
12 | * - 2 miscellaneous unsigned long values | ||
13 | */ | ||
14 | |||
15 | struct msqid64_ds { | ||
16 | struct ipc64_perm msg_perm; | ||
17 | #if defined(CONFIG_32BIT) && !defined(CONFIG_CPU_LITTLE_ENDIAN) | ||
18 | unsigned long __unused1; | ||
19 | #endif | ||
20 | __kernel_time_t msg_stime; /* last msgsnd time */ | ||
21 | #if defined(CONFIG_32BIT) && defined(CONFIG_CPU_LITTLE_ENDIAN) | ||
22 | unsigned long __unused1; | ||
23 | #endif | ||
24 | #if defined(CONFIG_32BIT) && !defined(CONFIG_CPU_LITTLE_ENDIAN) | ||
25 | unsigned long __unused2; | ||
26 | #endif | ||
27 | __kernel_time_t msg_rtime; /* last msgrcv time */ | ||
28 | #if defined(CONFIG_32BIT) && defined(CONFIG_CPU_LITTLE_ENDIAN) | ||
29 | unsigned long __unused2; | ||
30 | #endif | ||
31 | #if defined(CONFIG_32BIT) && !defined(CONFIG_CPU_LITTLE_ENDIAN) | ||
32 | unsigned long __unused3; | ||
33 | #endif | ||
34 | __kernel_time_t msg_ctime; /* last change time */ | ||
35 | #if defined(CONFIG_32BIT) && defined(CONFIG_CPU_LITTLE_ENDIAN) | ||
36 | unsigned long __unused3; | ||
37 | #endif | ||
38 | unsigned long msg_cbytes; /* current number of bytes on queue */ | ||
39 | unsigned long msg_qnum; /* number of messages in queue */ | ||
40 | unsigned long msg_qbytes; /* max number of bytes on queue */ | ||
41 | __kernel_pid_t msg_lspid; /* pid of last msgsnd */ | ||
42 | __kernel_pid_t msg_lrpid; /* last receive pid */ | ||
43 | unsigned long __unused4; | ||
44 | unsigned long __unused5; | ||
45 | }; | ||
46 | |||
47 | #endif /* _ASM_MSGBUF_H */ | ||
diff --git a/arch/mips/include/asm/octeon/cvmx-pcieep-defs.h b/arch/mips/include/asm/octeon/cvmx-pcieep-defs.h new file mode 100644 index 00000000000..d553f8e88df --- /dev/null +++ b/arch/mips/include/asm/octeon/cvmx-pcieep-defs.h | |||
@@ -0,0 +1,1365 @@ | |||
1 | /***********************license start*************** | ||
2 | * Author: Cavium Networks | ||
3 | * | ||
4 | * Contact: support@caviumnetworks.com | ||
5 | * This file is part of the OCTEON SDK | ||
6 | * | ||
7 | * Copyright (c) 2003-2008 Cavium Networks | ||
8 | * | ||
9 | * This file is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License, Version 2, as | ||
11 | * published by the Free Software Foundation. | ||
12 | * | ||
13 | * This file is distributed in the hope that it will be useful, but | ||
14 | * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty | ||
15 | * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or | ||
16 | * NONINFRINGEMENT. See the GNU General Public License for more | ||
17 | * details. | ||
18 | * | ||
19 | * You should have received a copy of the GNU General Public License | ||
20 | * along with this file; if not, write to the Free Software | ||
21 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
22 | * or visit http://www.gnu.org/licenses/. | ||
23 | * | ||
24 | * This file may also be available under a different license from Cavium. | ||
25 | * Contact Cavium Networks for more information | ||
26 | ***********************license end**************************************/ | ||
27 | |||
28 | #ifndef __CVMX_PCIEEP_DEFS_H__ | ||
29 | #define __CVMX_PCIEEP_DEFS_H__ | ||
30 | |||
31 | #define CVMX_PCIEEP_CFG000 \ | ||
32 | (0x0000000000000000ull) | ||
33 | #define CVMX_PCIEEP_CFG001 \ | ||
34 | (0x0000000000000004ull) | ||
35 | #define CVMX_PCIEEP_CFG002 \ | ||
36 | (0x0000000000000008ull) | ||
37 | #define CVMX_PCIEEP_CFG003 \ | ||
38 | (0x000000000000000Cull) | ||
39 | #define CVMX_PCIEEP_CFG004 \ | ||
40 | (0x0000000000000010ull) | ||
41 | #define CVMX_PCIEEP_CFG004_MASK \ | ||
42 | (0x0000000080000010ull) | ||
43 | #define CVMX_PCIEEP_CFG005 \ | ||
44 | (0x0000000000000014ull) | ||
45 | #define CVMX_PCIEEP_CFG005_MASK \ | ||
46 | (0x0000000080000014ull) | ||
47 | #define CVMX_PCIEEP_CFG006 \ | ||
48 | (0x0000000000000018ull) | ||
49 | #define CVMX_PCIEEP_CFG006_MASK \ | ||
50 | (0x0000000080000018ull) | ||
51 | #define CVMX_PCIEEP_CFG007 \ | ||
52 | (0x000000000000001Cull) | ||
53 | #define CVMX_PCIEEP_CFG007_MASK \ | ||
54 | (0x000000008000001Cull) | ||
55 | #define CVMX_PCIEEP_CFG008 \ | ||
56 | (0x0000000000000020ull) | ||
57 | #define CVMX_PCIEEP_CFG008_MASK \ | ||
58 | (0x0000000080000020ull) | ||
59 | #define CVMX_PCIEEP_CFG009 \ | ||
60 | (0x0000000000000024ull) | ||
61 | #define CVMX_PCIEEP_CFG009_MASK \ | ||
62 | (0x0000000080000024ull) | ||
63 | #define CVMX_PCIEEP_CFG010 \ | ||
64 | (0x0000000000000028ull) | ||
65 | #define CVMX_PCIEEP_CFG011 \ | ||
66 | (0x000000000000002Cull) | ||
67 | #define CVMX_PCIEEP_CFG012 \ | ||
68 | (0x0000000000000030ull) | ||
69 | #define CVMX_PCIEEP_CFG012_MASK \ | ||
70 | (0x0000000080000030ull) | ||
71 | #define CVMX_PCIEEP_CFG013 \ | ||
72 | (0x0000000000000034ull) | ||
73 | #define CVMX_PCIEEP_CFG015 \ | ||
74 | (0x000000000000003Cull) | ||
75 | #define CVMX_PCIEEP_CFG016 \ | ||
76 | (0x0000000000000040ull) | ||
77 | #define CVMX_PCIEEP_CFG017 \ | ||
78 | (0x0000000000000044ull) | ||
79 | #define CVMX_PCIEEP_CFG020 \ | ||
80 | (0x0000000000000050ull) | ||
81 | #define CVMX_PCIEEP_CFG021 \ | ||
82 | (0x0000000000000054ull) | ||
83 | #define CVMX_PCIEEP_CFG022 \ | ||
84 | (0x0000000000000058ull) | ||
85 | #define CVMX_PCIEEP_CFG023 \ | ||
86 | (0x000000000000005Cull) | ||
87 | #define CVMX_PCIEEP_CFG028 \ | ||
88 | (0x0000000000000070ull) | ||
89 | #define CVMX_PCIEEP_CFG029 \ | ||
90 | (0x0000000000000074ull) | ||
91 | #define CVMX_PCIEEP_CFG030 \ | ||
92 | (0x0000000000000078ull) | ||
93 | #define CVMX_PCIEEP_CFG031 \ | ||
94 | (0x000000000000007Cull) | ||
95 | #define CVMX_PCIEEP_CFG032 \ | ||
96 | (0x0000000000000080ull) | ||
97 | #define CVMX_PCIEEP_CFG033 \ | ||
98 | (0x0000000000000084ull) | ||
99 | #define CVMX_PCIEEP_CFG034 \ | ||
100 | (0x0000000000000088ull) | ||
101 | #define CVMX_PCIEEP_CFG037 \ | ||
102 | (0x0000000000000094ull) | ||
103 | #define CVMX_PCIEEP_CFG038 \ | ||
104 | (0x0000000000000098ull) | ||
105 | #define CVMX_PCIEEP_CFG039 \ | ||
106 | (0x000000000000009Cull) | ||
107 | #define CVMX_PCIEEP_CFG040 \ | ||
108 | (0x00000000000000A0ull) | ||
109 | #define CVMX_PCIEEP_CFG041 \ | ||
110 | (0x00000000000000A4ull) | ||
111 | #define CVMX_PCIEEP_CFG042 \ | ||
112 | (0x00000000000000A8ull) | ||
113 | #define CVMX_PCIEEP_CFG064 \ | ||
114 | (0x0000000000000100ull) | ||
115 | #define CVMX_PCIEEP_CFG065 \ | ||
116 | (0x0000000000000104ull) | ||
117 | #define CVMX_PCIEEP_CFG066 \ | ||
118 | (0x0000000000000108ull) | ||
119 | #define CVMX_PCIEEP_CFG067 \ | ||
120 | (0x000000000000010Cull) | ||
121 | #define CVMX_PCIEEP_CFG068 \ | ||
122 | (0x0000000000000110ull) | ||
123 | #define CVMX_PCIEEP_CFG069 \ | ||
124 | (0x0000000000000114ull) | ||
125 | #define CVMX_PCIEEP_CFG070 \ | ||
126 | (0x0000000000000118ull) | ||
127 | #define CVMX_PCIEEP_CFG071 \ | ||
128 | (0x000000000000011Cull) | ||
129 | #define CVMX_PCIEEP_CFG072 \ | ||
130 | (0x0000000000000120ull) | ||
131 | #define CVMX_PCIEEP_CFG073 \ | ||
132 | (0x0000000000000124ull) | ||
133 | #define CVMX_PCIEEP_CFG074 \ | ||
134 | (0x0000000000000128ull) | ||
135 | #define CVMX_PCIEEP_CFG448 \ | ||
136 | (0x0000000000000700ull) | ||
137 | #define CVMX_PCIEEP_CFG449 \ | ||
138 | (0x0000000000000704ull) | ||
139 | #define CVMX_PCIEEP_CFG450 \ | ||
140 | (0x0000000000000708ull) | ||
141 | #define CVMX_PCIEEP_CFG451 \ | ||
142 | (0x000000000000070Cull) | ||
143 | #define CVMX_PCIEEP_CFG452 \ | ||
144 | (0x0000000000000710ull) | ||
145 | #define CVMX_PCIEEP_CFG453 \ | ||
146 | (0x0000000000000714ull) | ||
147 | #define CVMX_PCIEEP_CFG454 \ | ||
148 | (0x0000000000000718ull) | ||
149 | #define CVMX_PCIEEP_CFG455 \ | ||
150 | (0x000000000000071Cull) | ||
151 | #define CVMX_PCIEEP_CFG456 \ | ||
152 | (0x0000000000000720ull) | ||
153 | #define CVMX_PCIEEP_CFG458 \ | ||
154 | (0x0000000000000728ull) | ||
155 | #define CVMX_PCIEEP_CFG459 \ | ||
156 | (0x000000000000072Cull) | ||
157 | #define CVMX_PCIEEP_CFG460 \ | ||
158 | (0x0000000000000730ull) | ||
159 | #define CVMX_PCIEEP_CFG461 \ | ||
160 | (0x0000000000000734ull) | ||
161 | #define CVMX_PCIEEP_CFG462 \ | ||
162 | (0x0000000000000738ull) | ||
163 | #define CVMX_PCIEEP_CFG463 \ | ||
164 | (0x000000000000073Cull) | ||
165 | #define CVMX_PCIEEP_CFG464 \ | ||
166 | (0x0000000000000740ull) | ||
167 | #define CVMX_PCIEEP_CFG465 \ | ||
168 | (0x0000000000000744ull) | ||
169 | #define CVMX_PCIEEP_CFG466 \ | ||
170 | (0x0000000000000748ull) | ||
171 | #define CVMX_PCIEEP_CFG467 \ | ||
172 | (0x000000000000074Cull) | ||
173 | #define CVMX_PCIEEP_CFG468 \ | ||
174 | (0x0000000000000750ull) | ||
175 | #define CVMX_PCIEEP_CFG490 \ | ||
176 | (0x00000000000007A8ull) | ||
177 | #define CVMX_PCIEEP_CFG491 \ | ||
178 | (0x00000000000007ACull) | ||
179 | #define CVMX_PCIEEP_CFG492 \ | ||
180 | (0x00000000000007B0ull) | ||
181 | #define CVMX_PCIEEP_CFG516 \ | ||
182 | (0x0000000000000810ull) | ||
183 | #define CVMX_PCIEEP_CFG517 \ | ||
184 | (0x0000000000000814ull) | ||
185 | |||
186 | union cvmx_pcieep_cfg000 { | ||
187 | uint32_t u32; | ||
188 | struct cvmx_pcieep_cfg000_s { | ||
189 | uint32_t devid:16; | ||
190 | uint32_t vendid:16; | ||
191 | } s; | ||
192 | struct cvmx_pcieep_cfg000_s cn52xx; | ||
193 | struct cvmx_pcieep_cfg000_s cn52xxp1; | ||
194 | struct cvmx_pcieep_cfg000_s cn56xx; | ||
195 | struct cvmx_pcieep_cfg000_s cn56xxp1; | ||
196 | }; | ||
197 | |||
198 | union cvmx_pcieep_cfg001 { | ||
199 | uint32_t u32; | ||
200 | struct cvmx_pcieep_cfg001_s { | ||
201 | uint32_t dpe:1; | ||
202 | uint32_t sse:1; | ||
203 | uint32_t rma:1; | ||
204 | uint32_t rta:1; | ||
205 | uint32_t sta:1; | ||
206 | uint32_t devt:2; | ||
207 | uint32_t mdpe:1; | ||
208 | uint32_t fbb:1; | ||
209 | uint32_t reserved_22_22:1; | ||
210 | uint32_t m66:1; | ||
211 | uint32_t cl:1; | ||
212 | uint32_t i_stat:1; | ||
213 | uint32_t reserved_11_18:8; | ||
214 | uint32_t i_dis:1; | ||
215 | uint32_t fbbe:1; | ||
216 | uint32_t see:1; | ||
217 | uint32_t ids_wcc:1; | ||
218 | uint32_t per:1; | ||
219 | uint32_t vps:1; | ||
220 | uint32_t mwice:1; | ||
221 | uint32_t scse:1; | ||
222 | uint32_t me:1; | ||
223 | uint32_t msae:1; | ||
224 | uint32_t isae:1; | ||
225 | } s; | ||
226 | struct cvmx_pcieep_cfg001_s cn52xx; | ||
227 | struct cvmx_pcieep_cfg001_s cn52xxp1; | ||
228 | struct cvmx_pcieep_cfg001_s cn56xx; | ||
229 | struct cvmx_pcieep_cfg001_s cn56xxp1; | ||
230 | }; | ||
231 | |||
232 | union cvmx_pcieep_cfg002 { | ||
233 | uint32_t u32; | ||
234 | struct cvmx_pcieep_cfg002_s { | ||
235 | uint32_t bcc:8; | ||
236 | uint32_t sc:8; | ||
237 | uint32_t pi:8; | ||
238 | uint32_t rid:8; | ||
239 | } s; | ||
240 | struct cvmx_pcieep_cfg002_s cn52xx; | ||
241 | struct cvmx_pcieep_cfg002_s cn52xxp1; | ||
242 | struct cvmx_pcieep_cfg002_s cn56xx; | ||
243 | struct cvmx_pcieep_cfg002_s cn56xxp1; | ||
244 | }; | ||
245 | |||
246 | union cvmx_pcieep_cfg003 { | ||
247 | uint32_t u32; | ||
248 | struct cvmx_pcieep_cfg003_s { | ||
249 | uint32_t bist:8; | ||
250 | uint32_t mfd:1; | ||
251 | uint32_t chf:7; | ||
252 | uint32_t lt:8; | ||
253 | uint32_t cls:8; | ||
254 | } s; | ||
255 | struct cvmx_pcieep_cfg003_s cn52xx; | ||
256 | struct cvmx_pcieep_cfg003_s cn52xxp1; | ||
257 | struct cvmx_pcieep_cfg003_s cn56xx; | ||
258 | struct cvmx_pcieep_cfg003_s cn56xxp1; | ||
259 | }; | ||
260 | |||
261 | union cvmx_pcieep_cfg004 { | ||
262 | uint32_t u32; | ||
263 | struct cvmx_pcieep_cfg004_s { | ||
264 | uint32_t lbab:18; | ||
265 | uint32_t reserved_4_13:10; | ||
266 | uint32_t pf:1; | ||
267 | uint32_t typ:2; | ||
268 | uint32_t mspc:1; | ||
269 | } s; | ||
270 | struct cvmx_pcieep_cfg004_s cn52xx; | ||
271 | struct cvmx_pcieep_cfg004_s cn52xxp1; | ||
272 | struct cvmx_pcieep_cfg004_s cn56xx; | ||
273 | struct cvmx_pcieep_cfg004_s cn56xxp1; | ||
274 | }; | ||
275 | |||
276 | union cvmx_pcieep_cfg004_mask { | ||
277 | uint32_t u32; | ||
278 | struct cvmx_pcieep_cfg004_mask_s { | ||
279 | uint32_t lmask:31; | ||
280 | uint32_t enb:1; | ||
281 | } s; | ||
282 | struct cvmx_pcieep_cfg004_mask_s cn52xx; | ||
283 | struct cvmx_pcieep_cfg004_mask_s cn52xxp1; | ||
284 | struct cvmx_pcieep_cfg004_mask_s cn56xx; | ||
285 | struct cvmx_pcieep_cfg004_mask_s cn56xxp1; | ||
286 | }; | ||
287 | |||
288 | union cvmx_pcieep_cfg005 { | ||
289 | uint32_t u32; | ||
290 | struct cvmx_pcieep_cfg005_s { | ||
291 | uint32_t ubab:32; | ||
292 | } s; | ||
293 | struct cvmx_pcieep_cfg005_s cn52xx; | ||
294 | struct cvmx_pcieep_cfg005_s cn52xxp1; | ||
295 | struct cvmx_pcieep_cfg005_s cn56xx; | ||
296 | struct cvmx_pcieep_cfg005_s cn56xxp1; | ||
297 | }; | ||
298 | |||
299 | union cvmx_pcieep_cfg005_mask { | ||
300 | uint32_t u32; | ||
301 | struct cvmx_pcieep_cfg005_mask_s { | ||
302 | uint32_t umask:32; | ||
303 | } s; | ||
304 | struct cvmx_pcieep_cfg005_mask_s cn52xx; | ||
305 | struct cvmx_pcieep_cfg005_mask_s cn52xxp1; | ||
306 | struct cvmx_pcieep_cfg005_mask_s cn56xx; | ||
307 | struct cvmx_pcieep_cfg005_mask_s cn56xxp1; | ||
308 | }; | ||
309 | |||
310 | union cvmx_pcieep_cfg006 { | ||
311 | uint32_t u32; | ||
312 | struct cvmx_pcieep_cfg006_s { | ||
313 | uint32_t lbab:6; | ||
314 | uint32_t reserved_4_25:22; | ||
315 | uint32_t pf:1; | ||
316 | uint32_t typ:2; | ||
317 | uint32_t mspc:1; | ||
318 | } s; | ||
319 | struct cvmx_pcieep_cfg006_s cn52xx; | ||
320 | struct cvmx_pcieep_cfg006_s cn52xxp1; | ||
321 | struct cvmx_pcieep_cfg006_s cn56xx; | ||
322 | struct cvmx_pcieep_cfg006_s cn56xxp1; | ||
323 | }; | ||
324 | |||
325 | union cvmx_pcieep_cfg006_mask { | ||
326 | uint32_t u32; | ||
327 | struct cvmx_pcieep_cfg006_mask_s { | ||
328 | uint32_t lmask:31; | ||
329 | uint32_t enb:1; | ||
330 | } s; | ||
331 | struct cvmx_pcieep_cfg006_mask_s cn52xx; | ||
332 | struct cvmx_pcieep_cfg006_mask_s cn52xxp1; | ||
333 | struct cvmx_pcieep_cfg006_mask_s cn56xx; | ||
334 | struct cvmx_pcieep_cfg006_mask_s cn56xxp1; | ||
335 | }; | ||
336 | |||
337 | union cvmx_pcieep_cfg007 { | ||
338 | uint32_t u32; | ||
339 | struct cvmx_pcieep_cfg007_s { | ||
340 | uint32_t ubab:32; | ||
341 | } s; | ||
342 | struct cvmx_pcieep_cfg007_s cn52xx; | ||
343 | struct cvmx_pcieep_cfg007_s cn52xxp1; | ||
344 | struct cvmx_pcieep_cfg007_s cn56xx; | ||
345 | struct cvmx_pcieep_cfg007_s cn56xxp1; | ||
346 | }; | ||
347 | |||
348 | union cvmx_pcieep_cfg007_mask { | ||
349 | uint32_t u32; | ||
350 | struct cvmx_pcieep_cfg007_mask_s { | ||
351 | uint32_t umask:32; | ||
352 | } s; | ||
353 | struct cvmx_pcieep_cfg007_mask_s cn52xx; | ||
354 | struct cvmx_pcieep_cfg007_mask_s cn52xxp1; | ||
355 | struct cvmx_pcieep_cfg007_mask_s cn56xx; | ||
356 | struct cvmx_pcieep_cfg007_mask_s cn56xxp1; | ||
357 | }; | ||
358 | |||
359 | union cvmx_pcieep_cfg008 { | ||
360 | uint32_t u32; | ||
361 | struct cvmx_pcieep_cfg008_s { | ||
362 | uint32_t reserved_4_31:28; | ||
363 | uint32_t pf:1; | ||
364 | uint32_t typ:2; | ||
365 | uint32_t mspc:1; | ||
366 | } s; | ||
367 | struct cvmx_pcieep_cfg008_s cn52xx; | ||
368 | struct cvmx_pcieep_cfg008_s cn52xxp1; | ||
369 | struct cvmx_pcieep_cfg008_s cn56xx; | ||
370 | struct cvmx_pcieep_cfg008_s cn56xxp1; | ||
371 | }; | ||
372 | |||
373 | union cvmx_pcieep_cfg008_mask { | ||
374 | uint32_t u32; | ||
375 | struct cvmx_pcieep_cfg008_mask_s { | ||
376 | uint32_t lmask:31; | ||
377 | uint32_t enb:1; | ||
378 | } s; | ||
379 | struct cvmx_pcieep_cfg008_mask_s cn52xx; | ||
380 | struct cvmx_pcieep_cfg008_mask_s cn52xxp1; | ||
381 | struct cvmx_pcieep_cfg008_mask_s cn56xx; | ||
382 | struct cvmx_pcieep_cfg008_mask_s cn56xxp1; | ||
383 | }; | ||
384 | |||
385 | union cvmx_pcieep_cfg009 { | ||
386 | uint32_t u32; | ||
387 | struct cvmx_pcieep_cfg009_s { | ||
388 | uint32_t ubab:25; | ||
389 | uint32_t reserved_0_6:7; | ||
390 | } s; | ||
391 | struct cvmx_pcieep_cfg009_s cn52xx; | ||
392 | struct cvmx_pcieep_cfg009_s cn52xxp1; | ||
393 | struct cvmx_pcieep_cfg009_s cn56xx; | ||
394 | struct cvmx_pcieep_cfg009_s cn56xxp1; | ||
395 | }; | ||
396 | |||
397 | union cvmx_pcieep_cfg009_mask { | ||
398 | uint32_t u32; | ||
399 | struct cvmx_pcieep_cfg009_mask_s { | ||
400 | uint32_t umask:32; | ||
401 | } s; | ||
402 | struct cvmx_pcieep_cfg009_mask_s cn52xx; | ||
403 | struct cvmx_pcieep_cfg009_mask_s cn52xxp1; | ||
404 | struct cvmx_pcieep_cfg009_mask_s cn56xx; | ||
405 | struct cvmx_pcieep_cfg009_mask_s cn56xxp1; | ||
406 | }; | ||
407 | |||
408 | union cvmx_pcieep_cfg010 { | ||
409 | uint32_t u32; | ||
410 | struct cvmx_pcieep_cfg010_s { | ||
411 | uint32_t cisp:32; | ||
412 | } s; | ||
413 | struct cvmx_pcieep_cfg010_s cn52xx; | ||
414 | struct cvmx_pcieep_cfg010_s cn52xxp1; | ||
415 | struct cvmx_pcieep_cfg010_s cn56xx; | ||
416 | struct cvmx_pcieep_cfg010_s cn56xxp1; | ||
417 | }; | ||
418 | |||
419 | union cvmx_pcieep_cfg011 { | ||
420 | uint32_t u32; | ||
421 | struct cvmx_pcieep_cfg011_s { | ||
422 | uint32_t ssid:16; | ||
423 | uint32_t ssvid:16; | ||
424 | } s; | ||
425 | struct cvmx_pcieep_cfg011_s cn52xx; | ||
426 | struct cvmx_pcieep_cfg011_s cn52xxp1; | ||
427 | struct cvmx_pcieep_cfg011_s cn56xx; | ||
428 | struct cvmx_pcieep_cfg011_s cn56xxp1; | ||
429 | }; | ||
430 | |||
431 | union cvmx_pcieep_cfg012 { | ||
432 | uint32_t u32; | ||
433 | struct cvmx_pcieep_cfg012_s { | ||
434 | uint32_t eraddr:16; | ||
435 | uint32_t reserved_1_15:15; | ||
436 | uint32_t er_en:1; | ||
437 | } s; | ||
438 | struct cvmx_pcieep_cfg012_s cn52xx; | ||
439 | struct cvmx_pcieep_cfg012_s cn52xxp1; | ||
440 | struct cvmx_pcieep_cfg012_s cn56xx; | ||
441 | struct cvmx_pcieep_cfg012_s cn56xxp1; | ||
442 | }; | ||
443 | |||
444 | union cvmx_pcieep_cfg012_mask { | ||
445 | uint32_t u32; | ||
446 | struct cvmx_pcieep_cfg012_mask_s { | ||
447 | uint32_t mask:31; | ||
448 | uint32_t enb:1; | ||
449 | } s; | ||
450 | struct cvmx_pcieep_cfg012_mask_s cn52xx; | ||
451 | struct cvmx_pcieep_cfg012_mask_s cn52xxp1; | ||
452 | struct cvmx_pcieep_cfg012_mask_s cn56xx; | ||
453 | struct cvmx_pcieep_cfg012_mask_s cn56xxp1; | ||
454 | }; | ||
455 | |||
456 | union cvmx_pcieep_cfg013 { | ||
457 | uint32_t u32; | ||
458 | struct cvmx_pcieep_cfg013_s { | ||
459 | uint32_t reserved_8_31:24; | ||
460 | uint32_t cp:8; | ||
461 | } s; | ||
462 | struct cvmx_pcieep_cfg013_s cn52xx; | ||
463 | struct cvmx_pcieep_cfg013_s cn52xxp1; | ||
464 | struct cvmx_pcieep_cfg013_s cn56xx; | ||
465 | struct cvmx_pcieep_cfg013_s cn56xxp1; | ||
466 | }; | ||
467 | |||
468 | union cvmx_pcieep_cfg015 { | ||
469 | uint32_t u32; | ||
470 | struct cvmx_pcieep_cfg015_s { | ||
471 | uint32_t ml:8; | ||
472 | uint32_t mg:8; | ||
473 | uint32_t inta:8; | ||
474 | uint32_t il:8; | ||
475 | } s; | ||
476 | struct cvmx_pcieep_cfg015_s cn52xx; | ||
477 | struct cvmx_pcieep_cfg015_s cn52xxp1; | ||
478 | struct cvmx_pcieep_cfg015_s cn56xx; | ||
479 | struct cvmx_pcieep_cfg015_s cn56xxp1; | ||
480 | }; | ||
481 | |||
482 | union cvmx_pcieep_cfg016 { | ||
483 | uint32_t u32; | ||
484 | struct cvmx_pcieep_cfg016_s { | ||
485 | uint32_t pmes:5; | ||
486 | uint32_t d2s:1; | ||
487 | uint32_t d1s:1; | ||
488 | uint32_t auxc:3; | ||
489 | uint32_t dsi:1; | ||
490 | uint32_t reserved_20_20:1; | ||
491 | uint32_t pme_clock:1; | ||
492 | uint32_t pmsv:3; | ||
493 | uint32_t ncp:8; | ||
494 | uint32_t pmcid:8; | ||
495 | } s; | ||
496 | struct cvmx_pcieep_cfg016_s cn52xx; | ||
497 | struct cvmx_pcieep_cfg016_s cn52xxp1; | ||
498 | struct cvmx_pcieep_cfg016_s cn56xx; | ||
499 | struct cvmx_pcieep_cfg016_s cn56xxp1; | ||
500 | }; | ||
501 | |||
502 | union cvmx_pcieep_cfg017 { | ||
503 | uint32_t u32; | ||
504 | struct cvmx_pcieep_cfg017_s { | ||
505 | uint32_t pmdia:8; | ||
506 | uint32_t bpccee:1; | ||
507 | uint32_t bd3h:1; | ||
508 | uint32_t reserved_16_21:6; | ||
509 | uint32_t pmess:1; | ||
510 | uint32_t pmedsia:2; | ||
511 | uint32_t pmds:4; | ||
512 | uint32_t pmeens:1; | ||
513 | uint32_t reserved_4_7:4; | ||
514 | uint32_t nsr:1; | ||
515 | uint32_t reserved_2_2:1; | ||
516 | uint32_t ps:2; | ||
517 | } s; | ||
518 | struct cvmx_pcieep_cfg017_s cn52xx; | ||
519 | struct cvmx_pcieep_cfg017_s cn52xxp1; | ||
520 | struct cvmx_pcieep_cfg017_s cn56xx; | ||
521 | struct cvmx_pcieep_cfg017_s cn56xxp1; | ||
522 | }; | ||
523 | |||
524 | union cvmx_pcieep_cfg020 { | ||
525 | uint32_t u32; | ||
526 | struct cvmx_pcieep_cfg020_s { | ||
527 | uint32_t reserved_24_31:8; | ||
528 | uint32_t m64:1; | ||
529 | uint32_t mme:3; | ||
530 | uint32_t mmc:3; | ||
531 | uint32_t msien:1; | ||
532 | uint32_t ncp:8; | ||
533 | uint32_t msicid:8; | ||
534 | } s; | ||
535 | struct cvmx_pcieep_cfg020_s cn52xx; | ||
536 | struct cvmx_pcieep_cfg020_s cn52xxp1; | ||
537 | struct cvmx_pcieep_cfg020_s cn56xx; | ||
538 | struct cvmx_pcieep_cfg020_s cn56xxp1; | ||
539 | }; | ||
540 | |||
541 | union cvmx_pcieep_cfg021 { | ||
542 | uint32_t u32; | ||
543 | struct cvmx_pcieep_cfg021_s { | ||
544 | uint32_t lmsi:30; | ||
545 | uint32_t reserved_0_1:2; | ||
546 | } s; | ||
547 | struct cvmx_pcieep_cfg021_s cn52xx; | ||
548 | struct cvmx_pcieep_cfg021_s cn52xxp1; | ||
549 | struct cvmx_pcieep_cfg021_s cn56xx; | ||
550 | struct cvmx_pcieep_cfg021_s cn56xxp1; | ||
551 | }; | ||
552 | |||
553 | union cvmx_pcieep_cfg022 { | ||
554 | uint32_t u32; | ||
555 | struct cvmx_pcieep_cfg022_s { | ||
556 | uint32_t umsi:32; | ||
557 | } s; | ||
558 | struct cvmx_pcieep_cfg022_s cn52xx; | ||
559 | struct cvmx_pcieep_cfg022_s cn52xxp1; | ||
560 | struct cvmx_pcieep_cfg022_s cn56xx; | ||
561 | struct cvmx_pcieep_cfg022_s cn56xxp1; | ||
562 | }; | ||
563 | |||
564 | union cvmx_pcieep_cfg023 { | ||
565 | uint32_t u32; | ||
566 | struct cvmx_pcieep_cfg023_s { | ||
567 | uint32_t reserved_16_31:16; | ||
568 | uint32_t msimd:16; | ||
569 | } s; | ||
570 | struct cvmx_pcieep_cfg023_s cn52xx; | ||
571 | struct cvmx_pcieep_cfg023_s cn52xxp1; | ||
572 | struct cvmx_pcieep_cfg023_s cn56xx; | ||
573 | struct cvmx_pcieep_cfg023_s cn56xxp1; | ||
574 | }; | ||
575 | |||
576 | union cvmx_pcieep_cfg028 { | ||
577 | uint32_t u32; | ||
578 | struct cvmx_pcieep_cfg028_s { | ||
579 | uint32_t reserved_30_31:2; | ||
580 | uint32_t imn:5; | ||
581 | uint32_t si:1; | ||
582 | uint32_t dpt:4; | ||
583 | uint32_t pciecv:4; | ||
584 | uint32_t ncp:8; | ||
585 | uint32_t pcieid:8; | ||
586 | } s; | ||
587 | struct cvmx_pcieep_cfg028_s cn52xx; | ||
588 | struct cvmx_pcieep_cfg028_s cn52xxp1; | ||
589 | struct cvmx_pcieep_cfg028_s cn56xx; | ||
590 | struct cvmx_pcieep_cfg028_s cn56xxp1; | ||
591 | }; | ||
592 | |||
593 | union cvmx_pcieep_cfg029 { | ||
594 | uint32_t u32; | ||
595 | struct cvmx_pcieep_cfg029_s { | ||
596 | uint32_t reserved_28_31:4; | ||
597 | uint32_t cspls:2; | ||
598 | uint32_t csplv:8; | ||
599 | uint32_t reserved_16_17:2; | ||
600 | uint32_t rber:1; | ||
601 | uint32_t reserved_12_14:3; | ||
602 | uint32_t el1al:3; | ||
603 | uint32_t el0al:3; | ||
604 | uint32_t etfs:1; | ||
605 | uint32_t pfs:2; | ||
606 | uint32_t mpss:3; | ||
607 | } s; | ||
608 | struct cvmx_pcieep_cfg029_s cn52xx; | ||
609 | struct cvmx_pcieep_cfg029_s cn52xxp1; | ||
610 | struct cvmx_pcieep_cfg029_s cn56xx; | ||
611 | struct cvmx_pcieep_cfg029_s cn56xxp1; | ||
612 | }; | ||
613 | |||
614 | union cvmx_pcieep_cfg030 { | ||
615 | uint32_t u32; | ||
616 | struct cvmx_pcieep_cfg030_s { | ||
617 | uint32_t reserved_22_31:10; | ||
618 | uint32_t tp:1; | ||
619 | uint32_t ap_d:1; | ||
620 | uint32_t ur_d:1; | ||
621 | uint32_t fe_d:1; | ||
622 | uint32_t nfe_d:1; | ||
623 | uint32_t ce_d:1; | ||
624 | uint32_t reserved_15_15:1; | ||
625 | uint32_t mrrs:3; | ||
626 | uint32_t ns_en:1; | ||
627 | uint32_t ap_en:1; | ||
628 | uint32_t pf_en:1; | ||
629 | uint32_t etf_en:1; | ||
630 | uint32_t mps:3; | ||
631 | uint32_t ro_en:1; | ||
632 | uint32_t ur_en:1; | ||
633 | uint32_t fe_en:1; | ||
634 | uint32_t nfe_en:1; | ||
635 | uint32_t ce_en:1; | ||
636 | } s; | ||
637 | struct cvmx_pcieep_cfg030_s cn52xx; | ||
638 | struct cvmx_pcieep_cfg030_s cn52xxp1; | ||
639 | struct cvmx_pcieep_cfg030_s cn56xx; | ||
640 | struct cvmx_pcieep_cfg030_s cn56xxp1; | ||
641 | }; | ||
642 | |||
643 | union cvmx_pcieep_cfg031 { | ||
644 | uint32_t u32; | ||
645 | struct cvmx_pcieep_cfg031_s { | ||
646 | uint32_t pnum:8; | ||
647 | uint32_t reserved_22_23:2; | ||
648 | uint32_t lbnc:1; | ||
649 | uint32_t dllarc:1; | ||
650 | uint32_t sderc:1; | ||
651 | uint32_t cpm:1; | ||
652 | uint32_t l1el:3; | ||
653 | uint32_t l0el:3; | ||
654 | uint32_t aslpms:2; | ||
655 | uint32_t mlw:6; | ||
656 | uint32_t mls:4; | ||
657 | } s; | ||
658 | struct cvmx_pcieep_cfg031_s cn52xx; | ||
659 | struct cvmx_pcieep_cfg031_s cn52xxp1; | ||
660 | struct cvmx_pcieep_cfg031_s cn56xx; | ||
661 | struct cvmx_pcieep_cfg031_s cn56xxp1; | ||
662 | }; | ||
663 | |||
664 | union cvmx_pcieep_cfg032 { | ||
665 | uint32_t u32; | ||
666 | struct cvmx_pcieep_cfg032_s { | ||
667 | uint32_t reserved_30_31:2; | ||
668 | uint32_t dlla:1; | ||
669 | uint32_t scc:1; | ||
670 | uint32_t lt:1; | ||
671 | uint32_t reserved_26_26:1; | ||
672 | uint32_t nlw:6; | ||
673 | uint32_t ls:4; | ||
674 | uint32_t reserved_10_15:6; | ||
675 | uint32_t hawd:1; | ||
676 | uint32_t ecpm:1; | ||
677 | uint32_t es:1; | ||
678 | uint32_t ccc:1; | ||
679 | uint32_t rl:1; | ||
680 | uint32_t ld:1; | ||
681 | uint32_t rcb:1; | ||
682 | uint32_t reserved_2_2:1; | ||
683 | uint32_t aslpc:2; | ||
684 | } s; | ||
685 | struct cvmx_pcieep_cfg032_s cn52xx; | ||
686 | struct cvmx_pcieep_cfg032_s cn52xxp1; | ||
687 | struct cvmx_pcieep_cfg032_s cn56xx; | ||
688 | struct cvmx_pcieep_cfg032_s cn56xxp1; | ||
689 | }; | ||
690 | |||
691 | union cvmx_pcieep_cfg033 { | ||
692 | uint32_t u32; | ||
693 | struct cvmx_pcieep_cfg033_s { | ||
694 | uint32_t ps_num:13; | ||
695 | uint32_t nccs:1; | ||
696 | uint32_t emip:1; | ||
697 | uint32_t sp_ls:2; | ||
698 | uint32_t sp_lv:8; | ||
699 | uint32_t hp_c:1; | ||
700 | uint32_t hp_s:1; | ||
701 | uint32_t pip:1; | ||
702 | uint32_t aip:1; | ||
703 | uint32_t mrlsp:1; | ||
704 | uint32_t pcp:1; | ||
705 | uint32_t abp:1; | ||
706 | } s; | ||
707 | struct cvmx_pcieep_cfg033_s cn52xx; | ||
708 | struct cvmx_pcieep_cfg033_s cn52xxp1; | ||
709 | struct cvmx_pcieep_cfg033_s cn56xx; | ||
710 | struct cvmx_pcieep_cfg033_s cn56xxp1; | ||
711 | }; | ||
712 | |||
713 | union cvmx_pcieep_cfg034 { | ||
714 | uint32_t u32; | ||
715 | struct cvmx_pcieep_cfg034_s { | ||
716 | uint32_t reserved_25_31:7; | ||
717 | uint32_t dlls_c:1; | ||
718 | uint32_t emis:1; | ||
719 | uint32_t pds:1; | ||
720 | uint32_t mrlss:1; | ||
721 | uint32_t ccint_d:1; | ||
722 | uint32_t pd_c:1; | ||
723 | uint32_t mrls_c:1; | ||
724 | uint32_t pf_d:1; | ||
725 | uint32_t abp_d:1; | ||
726 | uint32_t reserved_13_15:3; | ||
727 | uint32_t dlls_en:1; | ||
728 | uint32_t emic:1; | ||
729 | uint32_t pcc:1; | ||
730 | uint32_t pic:2; | ||
731 | uint32_t aic:2; | ||
732 | uint32_t hpint_en:1; | ||
733 | uint32_t ccint_en:1; | ||
734 | uint32_t pd_en:1; | ||
735 | uint32_t mrls_en:1; | ||
736 | uint32_t pf_en:1; | ||
737 | uint32_t abp_en:1; | ||
738 | } s; | ||
739 | struct cvmx_pcieep_cfg034_s cn52xx; | ||
740 | struct cvmx_pcieep_cfg034_s cn52xxp1; | ||
741 | struct cvmx_pcieep_cfg034_s cn56xx; | ||
742 | struct cvmx_pcieep_cfg034_s cn56xxp1; | ||
743 | }; | ||
744 | |||
745 | union cvmx_pcieep_cfg037 { | ||
746 | uint32_t u32; | ||
747 | struct cvmx_pcieep_cfg037_s { | ||
748 | uint32_t reserved_5_31:27; | ||
749 | uint32_t ctds:1; | ||
750 | uint32_t ctrs:4; | ||
751 | } s; | ||
752 | struct cvmx_pcieep_cfg037_s cn52xx; | ||
753 | struct cvmx_pcieep_cfg037_s cn52xxp1; | ||
754 | struct cvmx_pcieep_cfg037_s cn56xx; | ||
755 | struct cvmx_pcieep_cfg037_s cn56xxp1; | ||
756 | }; | ||
757 | |||
758 | union cvmx_pcieep_cfg038 { | ||
759 | uint32_t u32; | ||
760 | struct cvmx_pcieep_cfg038_s { | ||
761 | uint32_t reserved_5_31:27; | ||
762 | uint32_t ctd:1; | ||
763 | uint32_t ctv:4; | ||
764 | } s; | ||
765 | struct cvmx_pcieep_cfg038_s cn52xx; | ||
766 | struct cvmx_pcieep_cfg038_s cn52xxp1; | ||
767 | struct cvmx_pcieep_cfg038_s cn56xx; | ||
768 | struct cvmx_pcieep_cfg038_s cn56xxp1; | ||
769 | }; | ||
770 | |||
771 | union cvmx_pcieep_cfg039 { | ||
772 | uint32_t u32; | ||
773 | struct cvmx_pcieep_cfg039_s { | ||
774 | uint32_t reserved_0_31:32; | ||
775 | } s; | ||
776 | struct cvmx_pcieep_cfg039_s cn52xx; | ||
777 | struct cvmx_pcieep_cfg039_s cn52xxp1; | ||
778 | struct cvmx_pcieep_cfg039_s cn56xx; | ||
779 | struct cvmx_pcieep_cfg039_s cn56xxp1; | ||
780 | }; | ||
781 | |||
782 | union cvmx_pcieep_cfg040 { | ||
783 | uint32_t u32; | ||
784 | struct cvmx_pcieep_cfg040_s { | ||
785 | uint32_t reserved_0_31:32; | ||
786 | } s; | ||
787 | struct cvmx_pcieep_cfg040_s cn52xx; | ||
788 | struct cvmx_pcieep_cfg040_s cn52xxp1; | ||
789 | struct cvmx_pcieep_cfg040_s cn56xx; | ||
790 | struct cvmx_pcieep_cfg040_s cn56xxp1; | ||
791 | }; | ||
792 | |||
793 | union cvmx_pcieep_cfg041 { | ||
794 | uint32_t u32; | ||
795 | struct cvmx_pcieep_cfg041_s { | ||
796 | uint32_t reserved_0_31:32; | ||
797 | } s; | ||
798 | struct cvmx_pcieep_cfg041_s cn52xx; | ||
799 | struct cvmx_pcieep_cfg041_s cn52xxp1; | ||
800 | struct cvmx_pcieep_cfg041_s cn56xx; | ||
801 | struct cvmx_pcieep_cfg041_s cn56xxp1; | ||
802 | }; | ||
803 | |||
804 | union cvmx_pcieep_cfg042 { | ||
805 | uint32_t u32; | ||
806 | struct cvmx_pcieep_cfg042_s { | ||
807 | uint32_t reserved_0_31:32; | ||
808 | } s; | ||
809 | struct cvmx_pcieep_cfg042_s cn52xx; | ||
810 | struct cvmx_pcieep_cfg042_s cn52xxp1; | ||
811 | struct cvmx_pcieep_cfg042_s cn56xx; | ||
812 | struct cvmx_pcieep_cfg042_s cn56xxp1; | ||
813 | }; | ||
814 | |||
815 | union cvmx_pcieep_cfg064 { | ||
816 | uint32_t u32; | ||
817 | struct cvmx_pcieep_cfg064_s { | ||
818 | uint32_t nco:12; | ||
819 | uint32_t cv:4; | ||
820 | uint32_t pcieec:16; | ||
821 | } s; | ||
822 | struct cvmx_pcieep_cfg064_s cn52xx; | ||
823 | struct cvmx_pcieep_cfg064_s cn52xxp1; | ||
824 | struct cvmx_pcieep_cfg064_s cn56xx; | ||
825 | struct cvmx_pcieep_cfg064_s cn56xxp1; | ||
826 | }; | ||
827 | |||
828 | union cvmx_pcieep_cfg065 { | ||
829 | uint32_t u32; | ||
830 | struct cvmx_pcieep_cfg065_s { | ||
831 | uint32_t reserved_21_31:11; | ||
832 | uint32_t ures:1; | ||
833 | uint32_t ecrces:1; | ||
834 | uint32_t mtlps:1; | ||
835 | uint32_t ros:1; | ||
836 | uint32_t ucs:1; | ||
837 | uint32_t cas:1; | ||
838 | uint32_t cts:1; | ||
839 | uint32_t fcpes:1; | ||
840 | uint32_t ptlps:1; | ||
841 | uint32_t reserved_6_11:6; | ||
842 | uint32_t sdes:1; | ||
843 | uint32_t dlpes:1; | ||
844 | uint32_t reserved_0_3:4; | ||
845 | } s; | ||
846 | struct cvmx_pcieep_cfg065_s cn52xx; | ||
847 | struct cvmx_pcieep_cfg065_s cn52xxp1; | ||
848 | struct cvmx_pcieep_cfg065_s cn56xx; | ||
849 | struct cvmx_pcieep_cfg065_s cn56xxp1; | ||
850 | }; | ||
851 | |||
852 | union cvmx_pcieep_cfg066 { | ||
853 | uint32_t u32; | ||
854 | struct cvmx_pcieep_cfg066_s { | ||
855 | uint32_t reserved_21_31:11; | ||
856 | uint32_t urem:1; | ||
857 | uint32_t ecrcem:1; | ||
858 | uint32_t mtlpm:1; | ||
859 | uint32_t rom:1; | ||
860 | uint32_t ucm:1; | ||
861 | uint32_t cam:1; | ||
862 | uint32_t ctm:1; | ||
863 | uint32_t fcpem:1; | ||
864 | uint32_t ptlpm:1; | ||
865 | uint32_t reserved_6_11:6; | ||
866 | uint32_t sdem:1; | ||
867 | uint32_t dlpem:1; | ||
868 | uint32_t reserved_0_3:4; | ||
869 | } s; | ||
870 | struct cvmx_pcieep_cfg066_s cn52xx; | ||
871 | struct cvmx_pcieep_cfg066_s cn52xxp1; | ||
872 | struct cvmx_pcieep_cfg066_s cn56xx; | ||
873 | struct cvmx_pcieep_cfg066_s cn56xxp1; | ||
874 | }; | ||
875 | |||
876 | union cvmx_pcieep_cfg067 { | ||
877 | uint32_t u32; | ||
878 | struct cvmx_pcieep_cfg067_s { | ||
879 | uint32_t reserved_21_31:11; | ||
880 | uint32_t ures:1; | ||
881 | uint32_t ecrces:1; | ||
882 | uint32_t mtlps:1; | ||
883 | uint32_t ros:1; | ||
884 | uint32_t ucs:1; | ||
885 | uint32_t cas:1; | ||
886 | uint32_t cts:1; | ||
887 | uint32_t fcpes:1; | ||
888 | uint32_t ptlps:1; | ||
889 | uint32_t reserved_6_11:6; | ||
890 | uint32_t sdes:1; | ||
891 | uint32_t dlpes:1; | ||
892 | uint32_t reserved_0_3:4; | ||
893 | } s; | ||
894 | struct cvmx_pcieep_cfg067_s cn52xx; | ||
895 | struct cvmx_pcieep_cfg067_s cn52xxp1; | ||
896 | struct cvmx_pcieep_cfg067_s cn56xx; | ||
897 | struct cvmx_pcieep_cfg067_s cn56xxp1; | ||
898 | }; | ||
899 | |||
900 | union cvmx_pcieep_cfg068 { | ||
901 | uint32_t u32; | ||
902 | struct cvmx_pcieep_cfg068_s { | ||
903 | uint32_t reserved_14_31:18; | ||
904 | uint32_t anfes:1; | ||
905 | uint32_t rtts:1; | ||
906 | uint32_t reserved_9_11:3; | ||
907 | uint32_t rnrs:1; | ||
908 | uint32_t bdllps:1; | ||
909 | uint32_t btlps:1; | ||
910 | uint32_t reserved_1_5:5; | ||
911 | uint32_t res:1; | ||
912 | } s; | ||
913 | struct cvmx_pcieep_cfg068_s cn52xx; | ||
914 | struct cvmx_pcieep_cfg068_s cn52xxp1; | ||
915 | struct cvmx_pcieep_cfg068_s cn56xx; | ||
916 | struct cvmx_pcieep_cfg068_s cn56xxp1; | ||
917 | }; | ||
918 | |||
919 | union cvmx_pcieep_cfg069 { | ||
920 | uint32_t u32; | ||
921 | struct cvmx_pcieep_cfg069_s { | ||
922 | uint32_t reserved_14_31:18; | ||
923 | uint32_t anfem:1; | ||
924 | uint32_t rttm:1; | ||
925 | uint32_t reserved_9_11:3; | ||
926 | uint32_t rnrm:1; | ||
927 | uint32_t bdllpm:1; | ||
928 | uint32_t btlpm:1; | ||
929 | uint32_t reserved_1_5:5; | ||
930 | uint32_t rem:1; | ||
931 | } s; | ||
932 | struct cvmx_pcieep_cfg069_s cn52xx; | ||
933 | struct cvmx_pcieep_cfg069_s cn52xxp1; | ||
934 | struct cvmx_pcieep_cfg069_s cn56xx; | ||
935 | struct cvmx_pcieep_cfg069_s cn56xxp1; | ||
936 | }; | ||
937 | |||
938 | union cvmx_pcieep_cfg070 { | ||
939 | uint32_t u32; | ||
940 | struct cvmx_pcieep_cfg070_s { | ||
941 | uint32_t reserved_9_31:23; | ||
942 | uint32_t ce:1; | ||
943 | uint32_t cc:1; | ||
944 | uint32_t ge:1; | ||
945 | uint32_t gc:1; | ||
946 | uint32_t fep:5; | ||
947 | } s; | ||
948 | struct cvmx_pcieep_cfg070_s cn52xx; | ||
949 | struct cvmx_pcieep_cfg070_s cn52xxp1; | ||
950 | struct cvmx_pcieep_cfg070_s cn56xx; | ||
951 | struct cvmx_pcieep_cfg070_s cn56xxp1; | ||
952 | }; | ||
953 | |||
954 | union cvmx_pcieep_cfg071 { | ||
955 | uint32_t u32; | ||
956 | struct cvmx_pcieep_cfg071_s { | ||
957 | uint32_t dword1:32; | ||
958 | } s; | ||
959 | struct cvmx_pcieep_cfg071_s cn52xx; | ||
960 | struct cvmx_pcieep_cfg071_s cn52xxp1; | ||
961 | struct cvmx_pcieep_cfg071_s cn56xx; | ||
962 | struct cvmx_pcieep_cfg071_s cn56xxp1; | ||
963 | }; | ||
964 | |||
965 | union cvmx_pcieep_cfg072 { | ||
966 | uint32_t u32; | ||
967 | struct cvmx_pcieep_cfg072_s { | ||
968 | uint32_t dword2:32; | ||
969 | } s; | ||
970 | struct cvmx_pcieep_cfg072_s cn52xx; | ||
971 | struct cvmx_pcieep_cfg072_s cn52xxp1; | ||
972 | struct cvmx_pcieep_cfg072_s cn56xx; | ||
973 | struct cvmx_pcieep_cfg072_s cn56xxp1; | ||
974 | }; | ||
975 | |||
976 | union cvmx_pcieep_cfg073 { | ||
977 | uint32_t u32; | ||
978 | struct cvmx_pcieep_cfg073_s { | ||
979 | uint32_t dword3:32; | ||
980 | } s; | ||
981 | struct cvmx_pcieep_cfg073_s cn52xx; | ||
982 | struct cvmx_pcieep_cfg073_s cn52xxp1; | ||
983 | struct cvmx_pcieep_cfg073_s cn56xx; | ||
984 | struct cvmx_pcieep_cfg073_s cn56xxp1; | ||
985 | }; | ||
986 | |||
987 | union cvmx_pcieep_cfg074 { | ||
988 | uint32_t u32; | ||
989 | struct cvmx_pcieep_cfg074_s { | ||
990 | uint32_t dword4:32; | ||
991 | } s; | ||
992 | struct cvmx_pcieep_cfg074_s cn52xx; | ||
993 | struct cvmx_pcieep_cfg074_s cn52xxp1; | ||
994 | struct cvmx_pcieep_cfg074_s cn56xx; | ||
995 | struct cvmx_pcieep_cfg074_s cn56xxp1; | ||
996 | }; | ||
997 | |||
998 | union cvmx_pcieep_cfg448 { | ||
999 | uint32_t u32; | ||
1000 | struct cvmx_pcieep_cfg448_s { | ||
1001 | uint32_t rtl:16; | ||
1002 | uint32_t rtltl:16; | ||
1003 | } s; | ||
1004 | struct cvmx_pcieep_cfg448_s cn52xx; | ||
1005 | struct cvmx_pcieep_cfg448_s cn52xxp1; | ||
1006 | struct cvmx_pcieep_cfg448_s cn56xx; | ||
1007 | struct cvmx_pcieep_cfg448_s cn56xxp1; | ||
1008 | }; | ||
1009 | |||
1010 | union cvmx_pcieep_cfg449 { | ||
1011 | uint32_t u32; | ||
1012 | struct cvmx_pcieep_cfg449_s { | ||
1013 | uint32_t omr:32; | ||
1014 | } s; | ||
1015 | struct cvmx_pcieep_cfg449_s cn52xx; | ||
1016 | struct cvmx_pcieep_cfg449_s cn52xxp1; | ||
1017 | struct cvmx_pcieep_cfg449_s cn56xx; | ||
1018 | struct cvmx_pcieep_cfg449_s cn56xxp1; | ||
1019 | }; | ||
1020 | |||
1021 | union cvmx_pcieep_cfg450 { | ||
1022 | uint32_t u32; | ||
1023 | struct cvmx_pcieep_cfg450_s { | ||
1024 | uint32_t lpec:8; | ||
1025 | uint32_t reserved_22_23:2; | ||
1026 | uint32_t link_state:6; | ||
1027 | uint32_t force_link:1; | ||
1028 | uint32_t reserved_8_14:7; | ||
1029 | uint32_t link_num:8; | ||
1030 | } s; | ||
1031 | struct cvmx_pcieep_cfg450_s cn52xx; | ||
1032 | struct cvmx_pcieep_cfg450_s cn52xxp1; | ||
1033 | struct cvmx_pcieep_cfg450_s cn56xx; | ||
1034 | struct cvmx_pcieep_cfg450_s cn56xxp1; | ||
1035 | }; | ||
1036 | |||
1037 | union cvmx_pcieep_cfg451 { | ||
1038 | uint32_t u32; | ||
1039 | struct cvmx_pcieep_cfg451_s { | ||
1040 | uint32_t reserved_30_31:2; | ||
1041 | uint32_t l1el:3; | ||
1042 | uint32_t l0el:3; | ||
1043 | uint32_t n_fts_cc:8; | ||
1044 | uint32_t n_fts:8; | ||
1045 | uint32_t ack_freq:8; | ||
1046 | } s; | ||
1047 | struct cvmx_pcieep_cfg451_s cn52xx; | ||
1048 | struct cvmx_pcieep_cfg451_s cn52xxp1; | ||
1049 | struct cvmx_pcieep_cfg451_s cn56xx; | ||
1050 | struct cvmx_pcieep_cfg451_s cn56xxp1; | ||
1051 | }; | ||
1052 | |||
1053 | union cvmx_pcieep_cfg452 { | ||
1054 | uint32_t u32; | ||
1055 | struct cvmx_pcieep_cfg452_s { | ||
1056 | uint32_t reserved_26_31:6; | ||
1057 | uint32_t eccrc:1; | ||
1058 | uint32_t reserved_22_24:3; | ||
1059 | uint32_t lme:6; | ||
1060 | uint32_t reserved_8_15:8; | ||
1061 | uint32_t flm:1; | ||
1062 | uint32_t reserved_6_6:1; | ||
1063 | uint32_t dllle:1; | ||
1064 | uint32_t reserved_4_4:1; | ||
1065 | uint32_t ra:1; | ||
1066 | uint32_t le:1; | ||
1067 | uint32_t sd:1; | ||
1068 | uint32_t omr:1; | ||
1069 | } s; | ||
1070 | struct cvmx_pcieep_cfg452_s cn52xx; | ||
1071 | struct cvmx_pcieep_cfg452_s cn52xxp1; | ||
1072 | struct cvmx_pcieep_cfg452_s cn56xx; | ||
1073 | struct cvmx_pcieep_cfg452_s cn56xxp1; | ||
1074 | }; | ||
1075 | |||
1076 | union cvmx_pcieep_cfg453 { | ||
1077 | uint32_t u32; | ||
1078 | struct cvmx_pcieep_cfg453_s { | ||
1079 | uint32_t dlld:1; | ||
1080 | uint32_t reserved_26_30:5; | ||
1081 | uint32_t ack_nak:1; | ||
1082 | uint32_t fcd:1; | ||
1083 | uint32_t ilst:24; | ||
1084 | } s; | ||
1085 | struct cvmx_pcieep_cfg453_s cn52xx; | ||
1086 | struct cvmx_pcieep_cfg453_s cn52xxp1; | ||
1087 | struct cvmx_pcieep_cfg453_s cn56xx; | ||
1088 | struct cvmx_pcieep_cfg453_s cn56xxp1; | ||
1089 | }; | ||
1090 | |||
1091 | union cvmx_pcieep_cfg454 { | ||
1092 | uint32_t u32; | ||
1093 | struct cvmx_pcieep_cfg454_s { | ||
1094 | uint32_t reserved_29_31:3; | ||
1095 | uint32_t tmfcwt:5; | ||
1096 | uint32_t tmanlt:5; | ||
1097 | uint32_t tmrt:5; | ||
1098 | uint32_t reserved_11_13:3; | ||
1099 | uint32_t nskps:3; | ||
1100 | uint32_t reserved_4_7:4; | ||
1101 | uint32_t ntss:4; | ||
1102 | } s; | ||
1103 | struct cvmx_pcieep_cfg454_s cn52xx; | ||
1104 | struct cvmx_pcieep_cfg454_s cn52xxp1; | ||
1105 | struct cvmx_pcieep_cfg454_s cn56xx; | ||
1106 | struct cvmx_pcieep_cfg454_s cn56xxp1; | ||
1107 | }; | ||
1108 | |||
1109 | union cvmx_pcieep_cfg455 { | ||
1110 | uint32_t u32; | ||
1111 | struct cvmx_pcieep_cfg455_s { | ||
1112 | uint32_t m_cfg0_filt:1; | ||
1113 | uint32_t m_io_filt:1; | ||
1114 | uint32_t msg_ctrl:1; | ||
1115 | uint32_t m_cpl_ecrc_filt:1; | ||
1116 | uint32_t m_ecrc_filt:1; | ||
1117 | uint32_t m_cpl_len_err:1; | ||
1118 | uint32_t m_cpl_attr_err:1; | ||
1119 | uint32_t m_cpl_tc_err:1; | ||
1120 | uint32_t m_cpl_fun_err:1; | ||
1121 | uint32_t m_cpl_rid_err:1; | ||
1122 | uint32_t m_cpl_tag_err:1; | ||
1123 | uint32_t m_lk_filt:1; | ||
1124 | uint32_t m_cfg1_filt:1; | ||
1125 | uint32_t m_bar_match:1; | ||
1126 | uint32_t m_pois_filt:1; | ||
1127 | uint32_t m_fun:1; | ||
1128 | uint32_t dfcwt:1; | ||
1129 | uint32_t reserved_11_14:4; | ||
1130 | uint32_t skpiv:11; | ||
1131 | } s; | ||
1132 | struct cvmx_pcieep_cfg455_s cn52xx; | ||
1133 | struct cvmx_pcieep_cfg455_s cn52xxp1; | ||
1134 | struct cvmx_pcieep_cfg455_s cn56xx; | ||
1135 | struct cvmx_pcieep_cfg455_s cn56xxp1; | ||
1136 | }; | ||
1137 | |||
1138 | union cvmx_pcieep_cfg456 { | ||
1139 | uint32_t u32; | ||
1140 | struct cvmx_pcieep_cfg456_s { | ||
1141 | uint32_t reserved_2_31:30; | ||
1142 | uint32_t m_vend1_drp:1; | ||
1143 | uint32_t m_vend0_drp:1; | ||
1144 | } s; | ||
1145 | struct cvmx_pcieep_cfg456_s cn52xx; | ||
1146 | struct cvmx_pcieep_cfg456_s cn52xxp1; | ||
1147 | struct cvmx_pcieep_cfg456_s cn56xx; | ||
1148 | struct cvmx_pcieep_cfg456_s cn56xxp1; | ||
1149 | }; | ||
1150 | |||
1151 | union cvmx_pcieep_cfg458 { | ||
1152 | uint32_t u32; | ||
1153 | struct cvmx_pcieep_cfg458_s { | ||
1154 | uint32_t dbg_info_l32:32; | ||
1155 | } s; | ||
1156 | struct cvmx_pcieep_cfg458_s cn52xx; | ||
1157 | struct cvmx_pcieep_cfg458_s cn52xxp1; | ||
1158 | struct cvmx_pcieep_cfg458_s cn56xx; | ||
1159 | struct cvmx_pcieep_cfg458_s cn56xxp1; | ||
1160 | }; | ||
1161 | |||
1162 | union cvmx_pcieep_cfg459 { | ||
1163 | uint32_t u32; | ||
1164 | struct cvmx_pcieep_cfg459_s { | ||
1165 | uint32_t dbg_info_u32:32; | ||
1166 | } s; | ||
1167 | struct cvmx_pcieep_cfg459_s cn52xx; | ||
1168 | struct cvmx_pcieep_cfg459_s cn52xxp1; | ||
1169 | struct cvmx_pcieep_cfg459_s cn56xx; | ||
1170 | struct cvmx_pcieep_cfg459_s cn56xxp1; | ||
1171 | }; | ||
1172 | |||
1173 | union cvmx_pcieep_cfg460 { | ||
1174 | uint32_t u32; | ||
1175 | struct cvmx_pcieep_cfg460_s { | ||
1176 | uint32_t reserved_20_31:12; | ||
1177 | uint32_t tphfcc:8; | ||
1178 | uint32_t tpdfcc:12; | ||
1179 | } s; | ||
1180 | struct cvmx_pcieep_cfg460_s cn52xx; | ||
1181 | struct cvmx_pcieep_cfg460_s cn52xxp1; | ||
1182 | struct cvmx_pcieep_cfg460_s cn56xx; | ||
1183 | struct cvmx_pcieep_cfg460_s cn56xxp1; | ||
1184 | }; | ||
1185 | |||
1186 | union cvmx_pcieep_cfg461 { | ||
1187 | uint32_t u32; | ||
1188 | struct cvmx_pcieep_cfg461_s { | ||
1189 | uint32_t reserved_20_31:12; | ||
1190 | uint32_t tchfcc:8; | ||
1191 | uint32_t tcdfcc:12; | ||
1192 | } s; | ||
1193 | struct cvmx_pcieep_cfg461_s cn52xx; | ||
1194 | struct cvmx_pcieep_cfg461_s cn52xxp1; | ||
1195 | struct cvmx_pcieep_cfg461_s cn56xx; | ||
1196 | struct cvmx_pcieep_cfg461_s cn56xxp1; | ||
1197 | }; | ||
1198 | |||
1199 | union cvmx_pcieep_cfg462 { | ||
1200 | uint32_t u32; | ||
1201 | struct cvmx_pcieep_cfg462_s { | ||
1202 | uint32_t reserved_20_31:12; | ||
1203 | uint32_t tchfcc:8; | ||
1204 | uint32_t tcdfcc:12; | ||
1205 | } s; | ||
1206 | struct cvmx_pcieep_cfg462_s cn52xx; | ||
1207 | struct cvmx_pcieep_cfg462_s cn52xxp1; | ||
1208 | struct cvmx_pcieep_cfg462_s cn56xx; | ||
1209 | struct cvmx_pcieep_cfg462_s cn56xxp1; | ||
1210 | }; | ||
1211 | |||
1212 | union cvmx_pcieep_cfg463 { | ||
1213 | uint32_t u32; | ||
1214 | struct cvmx_pcieep_cfg463_s { | ||
1215 | uint32_t reserved_3_31:29; | ||
1216 | uint32_t rqne:1; | ||
1217 | uint32_t trbne:1; | ||
1218 | uint32_t rtlpfccnr:1; | ||
1219 | } s; | ||
1220 | struct cvmx_pcieep_cfg463_s cn52xx; | ||
1221 | struct cvmx_pcieep_cfg463_s cn52xxp1; | ||
1222 | struct cvmx_pcieep_cfg463_s cn56xx; | ||
1223 | struct cvmx_pcieep_cfg463_s cn56xxp1; | ||
1224 | }; | ||
1225 | |||
1226 | union cvmx_pcieep_cfg464 { | ||
1227 | uint32_t u32; | ||
1228 | struct cvmx_pcieep_cfg464_s { | ||
1229 | uint32_t wrr_vc3:8; | ||
1230 | uint32_t wrr_vc2:8; | ||
1231 | uint32_t wrr_vc1:8; | ||
1232 | uint32_t wrr_vc0:8; | ||
1233 | } s; | ||
1234 | struct cvmx_pcieep_cfg464_s cn52xx; | ||
1235 | struct cvmx_pcieep_cfg464_s cn52xxp1; | ||
1236 | struct cvmx_pcieep_cfg464_s cn56xx; | ||
1237 | struct cvmx_pcieep_cfg464_s cn56xxp1; | ||
1238 | }; | ||
1239 | |||
1240 | union cvmx_pcieep_cfg465 { | ||
1241 | uint32_t u32; | ||
1242 | struct cvmx_pcieep_cfg465_s { | ||
1243 | uint32_t wrr_vc7:8; | ||
1244 | uint32_t wrr_vc6:8; | ||
1245 | uint32_t wrr_vc5:8; | ||
1246 | uint32_t wrr_vc4:8; | ||
1247 | } s; | ||
1248 | struct cvmx_pcieep_cfg465_s cn52xx; | ||
1249 | struct cvmx_pcieep_cfg465_s cn52xxp1; | ||
1250 | struct cvmx_pcieep_cfg465_s cn56xx; | ||
1251 | struct cvmx_pcieep_cfg465_s cn56xxp1; | ||
1252 | }; | ||
1253 | |||
1254 | union cvmx_pcieep_cfg466 { | ||
1255 | uint32_t u32; | ||
1256 | struct cvmx_pcieep_cfg466_s { | ||
1257 | uint32_t rx_queue_order:1; | ||
1258 | uint32_t type_ordering:1; | ||
1259 | uint32_t reserved_24_29:6; | ||
1260 | uint32_t queue_mode:3; | ||
1261 | uint32_t reserved_20_20:1; | ||
1262 | uint32_t header_credits:8; | ||
1263 | uint32_t data_credits:12; | ||
1264 | } s; | ||
1265 | struct cvmx_pcieep_cfg466_s cn52xx; | ||
1266 | struct cvmx_pcieep_cfg466_s cn52xxp1; | ||
1267 | struct cvmx_pcieep_cfg466_s cn56xx; | ||
1268 | struct cvmx_pcieep_cfg466_s cn56xxp1; | ||
1269 | }; | ||
1270 | |||
1271 | union cvmx_pcieep_cfg467 { | ||
1272 | uint32_t u32; | ||
1273 | struct cvmx_pcieep_cfg467_s { | ||
1274 | uint32_t reserved_24_31:8; | ||
1275 | uint32_t queue_mode:3; | ||
1276 | uint32_t reserved_20_20:1; | ||
1277 | uint32_t header_credits:8; | ||
1278 | uint32_t data_credits:12; | ||
1279 | } s; | ||
1280 | struct cvmx_pcieep_cfg467_s cn52xx; | ||
1281 | struct cvmx_pcieep_cfg467_s cn52xxp1; | ||
1282 | struct cvmx_pcieep_cfg467_s cn56xx; | ||
1283 | struct cvmx_pcieep_cfg467_s cn56xxp1; | ||
1284 | }; | ||
1285 | |||
1286 | union cvmx_pcieep_cfg468 { | ||
1287 | uint32_t u32; | ||
1288 | struct cvmx_pcieep_cfg468_s { | ||
1289 | uint32_t reserved_24_31:8; | ||
1290 | uint32_t queue_mode:3; | ||
1291 | uint32_t reserved_20_20:1; | ||
1292 | uint32_t header_credits:8; | ||
1293 | uint32_t data_credits:12; | ||
1294 | } s; | ||
1295 | struct cvmx_pcieep_cfg468_s cn52xx; | ||
1296 | struct cvmx_pcieep_cfg468_s cn52xxp1; | ||
1297 | struct cvmx_pcieep_cfg468_s cn56xx; | ||
1298 | struct cvmx_pcieep_cfg468_s cn56xxp1; | ||
1299 | }; | ||
1300 | |||
1301 | union cvmx_pcieep_cfg490 { | ||
1302 | uint32_t u32; | ||
1303 | struct cvmx_pcieep_cfg490_s { | ||
1304 | uint32_t reserved_26_31:6; | ||
1305 | uint32_t header_depth:10; | ||
1306 | uint32_t reserved_14_15:2; | ||
1307 | uint32_t data_depth:14; | ||
1308 | } s; | ||
1309 | struct cvmx_pcieep_cfg490_s cn52xx; | ||
1310 | struct cvmx_pcieep_cfg490_s cn52xxp1; | ||
1311 | struct cvmx_pcieep_cfg490_s cn56xx; | ||
1312 | struct cvmx_pcieep_cfg490_s cn56xxp1; | ||
1313 | }; | ||
1314 | |||
1315 | union cvmx_pcieep_cfg491 { | ||
1316 | uint32_t u32; | ||
1317 | struct cvmx_pcieep_cfg491_s { | ||
1318 | uint32_t reserved_26_31:6; | ||
1319 | uint32_t header_depth:10; | ||
1320 | uint32_t reserved_14_15:2; | ||
1321 | uint32_t data_depth:14; | ||
1322 | } s; | ||
1323 | struct cvmx_pcieep_cfg491_s cn52xx; | ||
1324 | struct cvmx_pcieep_cfg491_s cn52xxp1; | ||
1325 | struct cvmx_pcieep_cfg491_s cn56xx; | ||
1326 | struct cvmx_pcieep_cfg491_s cn56xxp1; | ||
1327 | }; | ||
1328 | |||
1329 | union cvmx_pcieep_cfg492 { | ||
1330 | uint32_t u32; | ||
1331 | struct cvmx_pcieep_cfg492_s { | ||
1332 | uint32_t reserved_26_31:6; | ||
1333 | uint32_t header_depth:10; | ||
1334 | uint32_t reserved_14_15:2; | ||
1335 | uint32_t data_depth:14; | ||
1336 | } s; | ||
1337 | struct cvmx_pcieep_cfg492_s cn52xx; | ||
1338 | struct cvmx_pcieep_cfg492_s cn52xxp1; | ||
1339 | struct cvmx_pcieep_cfg492_s cn56xx; | ||
1340 | struct cvmx_pcieep_cfg492_s cn56xxp1; | ||
1341 | }; | ||
1342 | |||
1343 | union cvmx_pcieep_cfg516 { | ||
1344 | uint32_t u32; | ||
1345 | struct cvmx_pcieep_cfg516_s { | ||
1346 | uint32_t phy_stat:32; | ||
1347 | } s; | ||
1348 | struct cvmx_pcieep_cfg516_s cn52xx; | ||
1349 | struct cvmx_pcieep_cfg516_s cn52xxp1; | ||
1350 | struct cvmx_pcieep_cfg516_s cn56xx; | ||
1351 | struct cvmx_pcieep_cfg516_s cn56xxp1; | ||
1352 | }; | ||
1353 | |||
1354 | union cvmx_pcieep_cfg517 { | ||
1355 | uint32_t u32; | ||
1356 | struct cvmx_pcieep_cfg517_s { | ||
1357 | uint32_t phy_ctrl:32; | ||
1358 | } s; | ||
1359 | struct cvmx_pcieep_cfg517_s cn52xx; | ||
1360 | struct cvmx_pcieep_cfg517_s cn52xxp1; | ||
1361 | struct cvmx_pcieep_cfg517_s cn56xx; | ||
1362 | struct cvmx_pcieep_cfg517_s cn56xxp1; | ||
1363 | }; | ||
1364 | |||
1365 | #endif | ||
diff --git a/arch/mips/include/asm/param.h b/arch/mips/include/asm/param.h new file mode 100644 index 00000000000..da3920fce9a --- /dev/null +++ b/arch/mips/include/asm/param.h | |||
@@ -0,0 +1,16 @@ | |||
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 1994 - 2000, 2002 Ralf Baechle (ralf@gnu.org) | ||
7 | * Copyright 2000 Silicon Graphics, Inc. | ||
8 | */ | ||
9 | #ifndef _ASM_PARAM_H | ||
10 | #define _ASM_PARAM_H | ||
11 | |||
12 | #define EXEC_PAGESIZE 65536 | ||
13 | |||
14 | #include <asm-generic/param.h> | ||
15 | |||
16 | #endif /* _ASM_PARAM_H */ | ||
diff --git a/arch/mips/include/asm/poll.h b/arch/mips/include/asm/poll.h new file mode 100644 index 00000000000..47b95208043 --- /dev/null +++ b/arch/mips/include/asm/poll.h | |||
@@ -0,0 +1,9 @@ | |||
1 | #ifndef __ASM_POLL_H | ||
2 | #define __ASM_POLL_H | ||
3 | |||
4 | #define POLLWRNORM POLLOUT | ||
5 | #define POLLWRBAND 0x0100 | ||
6 | |||
7 | #include <asm-generic/poll.h> | ||
8 | |||
9 | #endif /* __ASM_POLL_H */ | ||
diff --git a/arch/mips/include/asm/posix_types.h b/arch/mips/include/asm/posix_types.h new file mode 100644 index 00000000000..c200102c858 --- /dev/null +++ b/arch/mips/include/asm/posix_types.h | |||
@@ -0,0 +1,144 @@ | |||
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) 1996, 97, 98, 99, 2000 by Ralf Baechle | ||
7 | * Copyright (C) 1999, 2000 Silicon Graphics, Inc. | ||
8 | */ | ||
9 | #ifndef _ASM_POSIX_TYPES_H | ||
10 | #define _ASM_POSIX_TYPES_H | ||
11 | |||
12 | #include <asm/sgidefs.h> | ||
13 | |||
14 | /* | ||
15 | * This file is generally used by user-level software, so you need to | ||
16 | * be a little careful about namespace pollution etc. Also, we cannot | ||
17 | * assume GCC is being used. | ||
18 | */ | ||
19 | |||
20 | typedef unsigned long __kernel_ino_t; | ||
21 | typedef unsigned int __kernel_mode_t; | ||
22 | #if (_MIPS_SZLONG == 32) | ||
23 | typedef unsigned long __kernel_nlink_t; | ||
24 | #endif | ||
25 | #if (_MIPS_SZLONG == 64) | ||
26 | typedef unsigned int __kernel_nlink_t; | ||
27 | #endif | ||
28 | typedef long __kernel_off_t; | ||
29 | typedef int __kernel_pid_t; | ||
30 | typedef int __kernel_ipc_pid_t; | ||
31 | typedef unsigned int __kernel_uid_t; | ||
32 | typedef unsigned int __kernel_gid_t; | ||
33 | #if (_MIPS_SZLONG == 32) | ||
34 | typedef unsigned int __kernel_size_t; | ||
35 | typedef int __kernel_ssize_t; | ||
36 | typedef int __kernel_ptrdiff_t; | ||
37 | #endif | ||
38 | #if (_MIPS_SZLONG == 64) | ||
39 | typedef unsigned long __kernel_size_t; | ||
40 | typedef long __kernel_ssize_t; | ||
41 | typedef long __kernel_ptrdiff_t; | ||
42 | #endif | ||
43 | typedef long __kernel_time_t; | ||
44 | typedef long __kernel_suseconds_t; | ||
45 | typedef long __kernel_clock_t; | ||
46 | typedef int __kernel_timer_t; | ||
47 | typedef int __kernel_clockid_t; | ||
48 | typedef long __kernel_daddr_t; | ||
49 | typedef char * __kernel_caddr_t; | ||
50 | |||
51 | typedef unsigned short __kernel_uid16_t; | ||
52 | typedef unsigned short __kernel_gid16_t; | ||
53 | typedef unsigned int __kernel_uid32_t; | ||
54 | typedef unsigned int __kernel_gid32_t; | ||
55 | typedef __kernel_uid_t __kernel_old_uid_t; | ||
56 | typedef __kernel_gid_t __kernel_old_gid_t; | ||
57 | typedef unsigned int __kernel_old_dev_t; | ||
58 | |||
59 | #ifdef __GNUC__ | ||
60 | typedef long long __kernel_loff_t; | ||
61 | #endif | ||
62 | |||
63 | typedef struct { | ||
64 | #if (_MIPS_SZLONG == 32) | ||
65 | long val[2]; | ||
66 | #endif | ||
67 | #if (_MIPS_SZLONG == 64) | ||
68 | int val[2]; | ||
69 | #endif | ||
70 | } __kernel_fsid_t; | ||
71 | |||
72 | #if defined(__KERNEL__) | ||
73 | |||
74 | #undef __FD_SET | ||
75 | static __inline__ void __FD_SET(unsigned long __fd, __kernel_fd_set *__fdsetp) | ||
76 | { | ||
77 | unsigned long __tmp = __fd / __NFDBITS; | ||
78 | unsigned long __rem = __fd % __NFDBITS; | ||
79 | __fdsetp->fds_bits[__tmp] |= (1UL<<__rem); | ||
80 | } | ||
81 | |||
82 | #undef __FD_CLR | ||
83 | static __inline__ void __FD_CLR(unsigned long __fd, __kernel_fd_set *__fdsetp) | ||
84 | { | ||
85 | unsigned long __tmp = __fd / __NFDBITS; | ||
86 | unsigned long __rem = __fd % __NFDBITS; | ||
87 | __fdsetp->fds_bits[__tmp] &= ~(1UL<<__rem); | ||
88 | } | ||
89 | |||
90 | #undef __FD_ISSET | ||
91 | static __inline__ int __FD_ISSET(unsigned long __fd, const __kernel_fd_set *__p) | ||
92 | { | ||
93 | unsigned long __tmp = __fd / __NFDBITS; | ||
94 | unsigned long __rem = __fd % __NFDBITS; | ||
95 | return (__p->fds_bits[__tmp] & (1UL<<__rem)) != 0; | ||
96 | } | ||
97 | |||
98 | /* | ||
99 | * This will unroll the loop for the normal constant case (8 ints, | ||
100 | * for a 256-bit fd_set) | ||
101 | */ | ||
102 | #undef __FD_ZERO | ||
103 | static __inline__ void __FD_ZERO(__kernel_fd_set *__p) | ||
104 | { | ||
105 | unsigned long *__tmp = __p->fds_bits; | ||
106 | int __i; | ||
107 | |||
108 | if (__builtin_constant_p(__FDSET_LONGS)) { | ||
109 | switch (__FDSET_LONGS) { | ||
110 | case 16: | ||
111 | __tmp[ 0] = 0; __tmp[ 1] = 0; | ||
112 | __tmp[ 2] = 0; __tmp[ 3] = 0; | ||
113 | __tmp[ 4] = 0; __tmp[ 5] = 0; | ||
114 | __tmp[ 6] = 0; __tmp[ 7] = 0; | ||
115 | __tmp[ 8] = 0; __tmp[ 9] = 0; | ||
116 | __tmp[10] = 0; __tmp[11] = 0; | ||
117 | __tmp[12] = 0; __tmp[13] = 0; | ||
118 | __tmp[14] = 0; __tmp[15] = 0; | ||
119 | return; | ||
120 | |||
121 | case 8: | ||
122 | __tmp[ 0] = 0; __tmp[ 1] = 0; | ||
123 | __tmp[ 2] = 0; __tmp[ 3] = 0; | ||
124 | __tmp[ 4] = 0; __tmp[ 5] = 0; | ||
125 | __tmp[ 6] = 0; __tmp[ 7] = 0; | ||
126 | return; | ||
127 | |||
128 | case 4: | ||
129 | __tmp[ 0] = 0; __tmp[ 1] = 0; | ||
130 | __tmp[ 2] = 0; __tmp[ 3] = 0; | ||
131 | return; | ||
132 | } | ||
133 | } | ||
134 | __i = __FDSET_LONGS; | ||
135 | while (__i) { | ||
136 | __i--; | ||
137 | *__tmp = 0; | ||
138 | __tmp++; | ||
139 | } | ||
140 | } | ||
141 | |||
142 | #endif /* defined(__KERNEL__) */ | ||
143 | |||
144 | #endif /* _ASM_POSIX_TYPES_H */ | ||
diff --git a/arch/mips/include/asm/resource.h b/arch/mips/include/asm/resource.h new file mode 100644 index 00000000000..87cb3085269 --- /dev/null +++ b/arch/mips/include/asm/resource.h | |||
@@ -0,0 +1,35 @@ | |||
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) 1995, 96, 98, 99, 2000 by Ralf Baechle | ||
7 | * Copyright (C) 1999 Silicon Graphics, Inc. | ||
8 | */ | ||
9 | #ifndef _ASM_RESOURCE_H | ||
10 | #define _ASM_RESOURCE_H | ||
11 | |||
12 | |||
13 | /* | ||
14 | * These five resource limit IDs have a MIPS/Linux-specific ordering, | ||
15 | * the rest comes from the generic header: | ||
16 | */ | ||
17 | #define RLIMIT_NOFILE 5 /* max number of open files */ | ||
18 | #define RLIMIT_AS 6 /* address space limit */ | ||
19 | #define RLIMIT_RSS 7 /* max resident set size */ | ||
20 | #define RLIMIT_NPROC 8 /* max number of processes */ | ||
21 | #define RLIMIT_MEMLOCK 9 /* max locked-in-memory address space */ | ||
22 | |||
23 | /* | ||
24 | * SuS says limits have to be unsigned. | ||
25 | * Which makes a ton more sense anyway, | ||
26 | * but we keep the old value on MIPS32, | ||
27 | * for compatibility: | ||
28 | */ | ||
29 | #ifdef CONFIG_32BIT | ||
30 | # define RLIM_INFINITY 0x7fffffffUL | ||
31 | #endif | ||
32 | |||
33 | #include <asm-generic/resource.h> | ||
34 | |||
35 | #endif /* _ASM_RESOURCE_H */ | ||
diff --git a/arch/mips/include/asm/sembuf.h b/arch/mips/include/asm/sembuf.h new file mode 100644 index 00000000000..7281a4decaa --- /dev/null +++ b/arch/mips/include/asm/sembuf.h | |||
@@ -0,0 +1,22 @@ | |||
1 | #ifndef _ASM_SEMBUF_H | ||
2 | #define _ASM_SEMBUF_H | ||
3 | |||
4 | /* | ||
5 | * The semid64_ds structure for the MIPS architecture. | ||
6 | * Note extra padding because this structure is passed back and forth | ||
7 | * between kernel and user space. | ||
8 | * | ||
9 | * Pad space is left for: | ||
10 | * - 2 miscellaneous 64-bit values | ||
11 | */ | ||
12 | |||
13 | struct semid64_ds { | ||
14 | struct ipc64_perm sem_perm; /* permissions .. see ipc.h */ | ||
15 | __kernel_time_t sem_otime; /* last semop time */ | ||
16 | __kernel_time_t sem_ctime; /* last change time */ | ||
17 | unsigned long sem_nsems; /* no. of semaphores in array */ | ||
18 | unsigned long __unused1; | ||
19 | unsigned long __unused2; | ||
20 | }; | ||
21 | |||
22 | #endif /* _ASM_SEMBUF_H */ | ||
diff --git a/arch/mips/include/asm/sgidefs.h b/arch/mips/include/asm/sgidefs.h new file mode 100644 index 00000000000..876442fcfb3 --- /dev/null +++ b/arch/mips/include/asm/sgidefs.h | |||
@@ -0,0 +1,44 @@ | |||
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) 1996, 1999, 2001 Ralf Baechle | ||
7 | * Copyright (C) 1999 Silicon Graphics, Inc. | ||
8 | * Copyright (C) 2001 MIPS Technologies, Inc. | ||
9 | */ | ||
10 | #ifndef __ASM_SGIDEFS_H | ||
11 | #define __ASM_SGIDEFS_H | ||
12 | |||
13 | /* | ||
14 | * Using a Linux compiler for building Linux seems logic but not to | ||
15 | * everybody. | ||
16 | */ | ||
17 | #ifndef __linux__ | ||
18 | #error Use a Linux compiler or give up. | ||
19 | #endif | ||
20 | |||
21 | /* | ||
22 | * Definitions for the ISA levels | ||
23 | * | ||
24 | * With the introduction of MIPS32 / MIPS64 instruction sets definitions | ||
25 | * MIPS ISAs are no longer subsets of each other. Therefore comparisons | ||
26 | * on these symbols except with == may result in unexpected results and | ||
27 | * are forbidden! | ||
28 | */ | ||
29 | #define _MIPS_ISA_MIPS1 1 | ||
30 | #define _MIPS_ISA_MIPS2 2 | ||
31 | #define _MIPS_ISA_MIPS3 3 | ||
32 | #define _MIPS_ISA_MIPS4 4 | ||
33 | #define _MIPS_ISA_MIPS5 5 | ||
34 | #define _MIPS_ISA_MIPS32 6 | ||
35 | #define _MIPS_ISA_MIPS64 7 | ||
36 | |||
37 | /* | ||
38 | * Subprogram calling convention | ||
39 | */ | ||
40 | #define _MIPS_SIM_ABI32 1 | ||
41 | #define _MIPS_SIM_NABI32 2 | ||
42 | #define _MIPS_SIM_ABI64 3 | ||
43 | |||
44 | #endif /* __ASM_SGIDEFS_H */ | ||
diff --git a/arch/mips/include/asm/shmbuf.h b/arch/mips/include/asm/shmbuf.h new file mode 100644 index 00000000000..f994438277b --- /dev/null +++ b/arch/mips/include/asm/shmbuf.h | |||
@@ -0,0 +1,38 @@ | |||
1 | #ifndef _ASM_SHMBUF_H | ||
2 | #define _ASM_SHMBUF_H | ||
3 | |||
4 | /* | ||
5 | * The shmid64_ds structure for the MIPS architecture. | ||
6 | * Note extra padding because this structure is passed back and forth | ||
7 | * between kernel and user space. | ||
8 | * | ||
9 | * Pad space is left for: | ||
10 | * - 2 miscellaneous 32-bit rsp. 64-bit values | ||
11 | */ | ||
12 | |||
13 | struct shmid64_ds { | ||
14 | struct ipc64_perm shm_perm; /* operation perms */ | ||
15 | size_t shm_segsz; /* size of segment (bytes) */ | ||
16 | __kernel_time_t shm_atime; /* last attach time */ | ||
17 | __kernel_time_t shm_dtime; /* last detach time */ | ||
18 | __kernel_time_t shm_ctime; /* last change time */ | ||
19 | __kernel_pid_t shm_cpid; /* pid of creator */ | ||
20 | __kernel_pid_t shm_lpid; /* pid of last operator */ | ||
21 | unsigned long shm_nattch; /* no. of current attaches */ | ||
22 | unsigned long __unused1; | ||
23 | unsigned long __unused2; | ||
24 | }; | ||
25 | |||
26 | struct shminfo64 { | ||
27 | unsigned long shmmax; | ||
28 | unsigned long shmmin; | ||
29 | unsigned long shmmni; | ||
30 | unsigned long shmseg; | ||
31 | unsigned long shmall; | ||
32 | unsigned long __unused1; | ||
33 | unsigned long __unused2; | ||
34 | unsigned long __unused3; | ||
35 | unsigned long __unused4; | ||
36 | }; | ||
37 | |||
38 | #endif /* _ASM_SHMBUF_H */ | ||
diff --git a/arch/mips/include/asm/smvp.h b/arch/mips/include/asm/smvp.h new file mode 100644 index 00000000000..0d0e80a39e8 --- /dev/null +++ b/arch/mips/include/asm/smvp.h | |||
@@ -0,0 +1,19 @@ | |||
1 | #ifndef _ASM_SMVP_H | ||
2 | #define _ASM_SMVP_H | ||
3 | |||
4 | /* | ||
5 | * Definitions for SMVP multitasking on MIPS MT cores | ||
6 | */ | ||
7 | struct task_struct; | ||
8 | |||
9 | extern void smvp_smp_setup(void); | ||
10 | extern void smvp_smp_finish(void); | ||
11 | extern void smvp_boot_secondary(int cpu, struct task_struct *t); | ||
12 | extern void smvp_init_secondary(void); | ||
13 | extern void smvp_smp_finish(void); | ||
14 | extern void smvp_cpus_done(void); | ||
15 | extern void smvp_prepare_cpus(unsigned int max_cpus); | ||
16 | |||
17 | /* This is platform specific */ | ||
18 | extern void smvp_send_ipi(int cpu, unsigned int action); | ||
19 | #endif /* _ASM_SMVP_H */ | ||
diff --git a/arch/mips/include/asm/sockios.h b/arch/mips/include/asm/sockios.h new file mode 100644 index 00000000000..ed1a5f78d22 --- /dev/null +++ b/arch/mips/include/asm/sockios.h | |||
@@ -0,0 +1,26 @@ | |||
1 | /* | ||
2 | * Socket-level I/O control calls. | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 1995 by Ralf Baechle | ||
9 | */ | ||
10 | #ifndef _ASM_SOCKIOS_H | ||
11 | #define _ASM_SOCKIOS_H | ||
12 | |||
13 | #include <asm/ioctl.h> | ||
14 | |||
15 | /* Socket-level I/O control calls. */ | ||
16 | #define FIOGETOWN _IOR('f', 123, int) | ||
17 | #define FIOSETOWN _IOW('f', 124, int) | ||
18 | |||
19 | #define SIOCATMARK _IOR('s', 7, int) | ||
20 | #define SIOCSPGRP _IOW('s', 8, pid_t) | ||
21 | #define SIOCGPGRP _IOR('s', 9, pid_t) | ||
22 | |||
23 | #define SIOCGSTAMP 0x8906 /* Get stamp (timeval) */ | ||
24 | #define SIOCGSTAMPNS 0x8907 /* Get stamp (timespec) */ | ||
25 | |||
26 | #endif /* _ASM_SOCKIOS_H */ | ||
diff --git a/arch/mips/include/asm/stat.h b/arch/mips/include/asm/stat.h new file mode 100644 index 00000000000..6e00f751ab6 --- /dev/null +++ b/arch/mips/include/asm/stat.h | |||
@@ -0,0 +1,132 @@ | |||
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) 1995, 1999, 2000 Ralf Baechle | ||
7 | * Copyright (C) 2000 Silicon Graphics, Inc. | ||
8 | */ | ||
9 | #ifndef _ASM_STAT_H | ||
10 | #define _ASM_STAT_H | ||
11 | |||
12 | #include <linux/types.h> | ||
13 | |||
14 | #include <asm/sgidefs.h> | ||
15 | |||
16 | #if (_MIPS_SIM == _MIPS_SIM_ABI32) || (_MIPS_SIM == _MIPS_SIM_NABI32) | ||
17 | |||
18 | struct stat { | ||
19 | unsigned st_dev; | ||
20 | long st_pad1[3]; /* Reserved for network id */ | ||
21 | ino_t st_ino; | ||
22 | mode_t st_mode; | ||
23 | nlink_t st_nlink; | ||
24 | uid_t st_uid; | ||
25 | gid_t st_gid; | ||
26 | unsigned st_rdev; | ||
27 | long st_pad2[2]; | ||
28 | off_t st_size; | ||
29 | long st_pad3; | ||
30 | /* | ||
31 | * Actually this should be timestruc_t st_atime, st_mtime and st_ctime | ||
32 | * but we don't have it under Linux. | ||
33 | */ | ||
34 | time_t st_atime; | ||
35 | long st_atime_nsec; | ||
36 | time_t st_mtime; | ||
37 | long st_mtime_nsec; | ||
38 | time_t st_ctime; | ||
39 | long st_ctime_nsec; | ||
40 | long st_blksize; | ||
41 | long st_blocks; | ||
42 | long st_pad4[14]; | ||
43 | }; | ||
44 | |||
45 | /* | ||
46 | * This matches struct stat64 in glibc2.1, hence the absolutely insane | ||
47 | * amounts of padding around dev_t's. The memory layout is the same as of | ||
48 | * struct stat of the 64-bit kernel. | ||
49 | */ | ||
50 | |||
51 | struct stat64 { | ||
52 | unsigned long st_dev; | ||
53 | unsigned long st_pad0[3]; /* Reserved for st_dev expansion */ | ||
54 | |||
55 | unsigned long long st_ino; | ||
56 | |||
57 | mode_t st_mode; | ||
58 | nlink_t st_nlink; | ||
59 | |||
60 | uid_t st_uid; | ||
61 | gid_t st_gid; | ||
62 | |||
63 | unsigned long st_rdev; | ||
64 | unsigned long st_pad1[3]; /* Reserved for st_rdev expansion */ | ||
65 | |||
66 | long long st_size; | ||
67 | |||
68 | /* | ||
69 | * Actually this should be timestruc_t st_atime, st_mtime and st_ctime | ||
70 | * but we don't have it under Linux. | ||
71 | */ | ||
72 | time_t st_atime; | ||
73 | unsigned long st_atime_nsec; /* Reserved for st_atime expansion */ | ||
74 | |||
75 | time_t st_mtime; | ||
76 | unsigned long st_mtime_nsec; /* Reserved for st_mtime expansion */ | ||
77 | |||
78 | time_t st_ctime; | ||
79 | unsigned long st_ctime_nsec; /* Reserved for st_ctime expansion */ | ||
80 | |||
81 | unsigned long st_blksize; | ||
82 | unsigned long st_pad2; | ||
83 | |||
84 | long long st_blocks; | ||
85 | }; | ||
86 | |||
87 | #endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */ | ||
88 | |||
89 | #if _MIPS_SIM == _MIPS_SIM_ABI64 | ||
90 | |||
91 | /* The memory layout is the same as of struct stat64 of the 32-bit kernel. */ | ||
92 | struct stat { | ||
93 | unsigned int st_dev; | ||
94 | unsigned int st_pad0[3]; /* Reserved for st_dev expansion */ | ||
95 | |||
96 | unsigned long st_ino; | ||
97 | |||
98 | mode_t st_mode; | ||
99 | nlink_t st_nlink; | ||
100 | |||
101 | uid_t st_uid; | ||
102 | gid_t st_gid; | ||
103 | |||
104 | unsigned int st_rdev; | ||
105 | unsigned int st_pad1[3]; /* Reserved for st_rdev expansion */ | ||
106 | |||
107 | off_t st_size; | ||
108 | |||
109 | /* | ||
110 | * Actually this should be timestruc_t st_atime, st_mtime and st_ctime | ||
111 | * but we don't have it under Linux. | ||
112 | */ | ||
113 | unsigned int st_atime; | ||
114 | unsigned int st_atime_nsec; | ||
115 | |||
116 | unsigned int st_mtime; | ||
117 | unsigned int st_mtime_nsec; | ||
118 | |||
119 | unsigned int st_ctime; | ||
120 | unsigned int st_ctime_nsec; | ||
121 | |||
122 | unsigned int st_blksize; | ||
123 | unsigned int st_pad2; | ||
124 | |||
125 | unsigned long st_blocks; | ||
126 | }; | ||
127 | |||
128 | #endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */ | ||
129 | |||
130 | #define STAT_HAVE_NSEC 1 | ||
131 | |||
132 | #endif /* _ASM_STAT_H */ | ||
diff --git a/arch/mips/include/asm/statfs.h b/arch/mips/include/asm/statfs.h new file mode 100644 index 00000000000..0f805c7a42a --- /dev/null +++ b/arch/mips/include/asm/statfs.h | |||
@@ -0,0 +1,100 @@ | |||
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) 1995, 1999 by Ralf Baechle | ||
7 | */ | ||
8 | #ifndef _ASM_STATFS_H | ||
9 | #define _ASM_STATFS_H | ||
10 | |||
11 | #include <linux/posix_types.h> | ||
12 | #include <asm/sgidefs.h> | ||
13 | |||
14 | #ifndef __KERNEL_STRICT_NAMES | ||
15 | |||
16 | #include <linux/types.h> | ||
17 | |||
18 | typedef __kernel_fsid_t fsid_t; | ||
19 | |||
20 | #endif | ||
21 | |||
22 | struct statfs { | ||
23 | long f_type; | ||
24 | #define f_fstyp f_type | ||
25 | long f_bsize; | ||
26 | long f_frsize; /* Fragment size - unsupported */ | ||
27 | long f_blocks; | ||
28 | long f_bfree; | ||
29 | long f_files; | ||
30 | long f_ffree; | ||
31 | long f_bavail; | ||
32 | |||
33 | /* Linux specials */ | ||
34 | __kernel_fsid_t f_fsid; | ||
35 | long f_namelen; | ||
36 | long f_flags; | ||
37 | long f_spare[5]; | ||
38 | }; | ||
39 | |||
40 | #if (_MIPS_SIM == _MIPS_SIM_ABI32) || (_MIPS_SIM == _MIPS_SIM_NABI32) | ||
41 | |||
42 | /* | ||
43 | * Unlike the traditional version the LFAPI version has none of the ABI junk | ||
44 | */ | ||
45 | struct statfs64 { | ||
46 | __u32 f_type; | ||
47 | __u32 f_bsize; | ||
48 | __u32 f_frsize; /* Fragment size - unsupported */ | ||
49 | __u32 __pad; | ||
50 | __u64 f_blocks; | ||
51 | __u64 f_bfree; | ||
52 | __u64 f_files; | ||
53 | __u64 f_ffree; | ||
54 | __u64 f_bavail; | ||
55 | __kernel_fsid_t f_fsid; | ||
56 | __u32 f_namelen; | ||
57 | __u32 f_flags; | ||
58 | __u32 f_spare[5]; | ||
59 | }; | ||
60 | |||
61 | #endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */ | ||
62 | |||
63 | #if _MIPS_SIM == _MIPS_SIM_ABI64 | ||
64 | |||
65 | struct statfs64 { /* Same as struct statfs */ | ||
66 | long f_type; | ||
67 | long f_bsize; | ||
68 | long f_frsize; /* Fragment size - unsupported */ | ||
69 | long f_blocks; | ||
70 | long f_bfree; | ||
71 | long f_files; | ||
72 | long f_ffree; | ||
73 | long f_bavail; | ||
74 | |||
75 | /* Linux specials */ | ||
76 | __kernel_fsid_t f_fsid; | ||
77 | long f_namelen; | ||
78 | long f_flags; | ||
79 | long f_spare[5]; | ||
80 | }; | ||
81 | |||
82 | struct compat_statfs64 { | ||
83 | __u32 f_type; | ||
84 | __u32 f_bsize; | ||
85 | __u32 f_frsize; /* Fragment size - unsupported */ | ||
86 | __u32 __pad; | ||
87 | __u64 f_blocks; | ||
88 | __u64 f_bfree; | ||
89 | __u64 f_files; | ||
90 | __u64 f_ffree; | ||
91 | __u64 f_bavail; | ||
92 | __kernel_fsid_t f_fsid; | ||
93 | __u32 f_namelen; | ||
94 | __u32 f_flags; | ||
95 | __u32 f_spare[5]; | ||
96 | }; | ||
97 | |||
98 | #endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */ | ||
99 | |||
100 | #endif /* _ASM_STATFS_H */ | ||
diff --git a/arch/mips/include/asm/swab.h b/arch/mips/include/asm/swab.h new file mode 100644 index 00000000000..97c2f81b4b4 --- /dev/null +++ b/arch/mips/include/asm/swab.h | |||
@@ -0,0 +1,59 @@ | |||
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) 1996, 99, 2003 by Ralf Baechle | ||
7 | */ | ||
8 | #ifndef _ASM_SWAB_H | ||
9 | #define _ASM_SWAB_H | ||
10 | |||
11 | #include <linux/compiler.h> | ||
12 | #include <linux/types.h> | ||
13 | |||
14 | #define __SWAB_64_THRU_32__ | ||
15 | |||
16 | #ifdef CONFIG_CPU_MIPSR2 | ||
17 | |||
18 | static inline __attribute_const__ __u16 __arch_swab16(__u16 x) | ||
19 | { | ||
20 | __asm__( | ||
21 | " wsbh %0, %1 \n" | ||
22 | : "=r" (x) | ||
23 | : "r" (x)); | ||
24 | |||
25 | return x; | ||
26 | } | ||
27 | #define __arch_swab16 __arch_swab16 | ||
28 | |||
29 | static inline __attribute_const__ __u32 __arch_swab32(__u32 x) | ||
30 | { | ||
31 | __asm__( | ||
32 | " wsbh %0, %1 \n" | ||
33 | " rotr %0, %0, 16 \n" | ||
34 | : "=r" (x) | ||
35 | : "r" (x)); | ||
36 | |||
37 | return x; | ||
38 | } | ||
39 | #define __arch_swab32 __arch_swab32 | ||
40 | |||
41 | /* | ||
42 | * Having already checked for CONFIG_CPU_MIPSR2, enable the | ||
43 | * optimized version for 64-bit kernel on r2 CPUs. | ||
44 | */ | ||
45 | #ifdef CONFIG_64BIT | ||
46 | static inline __attribute_const__ __u64 __arch_swab64(__u64 x) | ||
47 | { | ||
48 | __asm__( | ||
49 | " dsbh %0, %1\n" | ||
50 | " dshd %0, %0" | ||
51 | : "=r" (x) | ||
52 | : "r" (x)); | ||
53 | |||
54 | return x; | ||
55 | } | ||
56 | #define __arch_swab64 __arch_swab64 | ||
57 | #endif /* CONFIG_64BIT */ | ||
58 | #endif /* CONFIG_CPU_MIPSR2 */ | ||
59 | #endif /* _ASM_SWAB_H */ | ||
diff --git a/arch/mips/include/asm/sysmips.h b/arch/mips/include/asm/sysmips.h new file mode 100644 index 00000000000..4f47b7d6a5f --- /dev/null +++ b/arch/mips/include/asm/sysmips.h | |||
@@ -0,0 +1,25 @@ | |||
1 | /* | ||
2 | * Definitions for the MIPS sysmips(2) call | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 1995 by Ralf Baechle | ||
9 | */ | ||
10 | #ifndef _ASM_SYSMIPS_H | ||
11 | #define _ASM_SYSMIPS_H | ||
12 | |||
13 | /* | ||
14 | * Commands for the sysmips(2) call | ||
15 | * | ||
16 | * sysmips(2) is deprecated - though some existing software uses it. | ||
17 | * We only support the following commands. | ||
18 | */ | ||
19 | #define SETNAME 1 /* set hostname */ | ||
20 | #define FLUSH_CACHE 3 /* writeback and invalidate caches */ | ||
21 | #define MIPS_FIXADE 7 /* control address error fixing */ | ||
22 | #define MIPS_RDNVRAM 10 /* read NVRAM */ | ||
23 | #define MIPS_ATOMIC_SET 2001 /* atomically set variable */ | ||
24 | |||
25 | #endif /* _ASM_SYSMIPS_H */ | ||
diff --git a/arch/mips/include/asm/system.h b/arch/mips/include/asm/system.h new file mode 100644 index 00000000000..6018c80ce37 --- /dev/null +++ b/arch/mips/include/asm/system.h | |||
@@ -0,0 +1,235 @@ | |||
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) 1994, 95, 96, 97, 98, 99, 2003, 06 by Ralf Baechle | ||
7 | * Copyright (C) 1996 by Paul M. Antoine | ||
8 | * Copyright (C) 1999 Silicon Graphics | ||
9 | * Kevin D. Kissell, kevink@mips.org and Carsten Langgaard, carstenl@mips.com | ||
10 | * Copyright (C) 2000 MIPS Technologies, Inc. | ||
11 | */ | ||
12 | #ifndef _ASM_SYSTEM_H | ||
13 | #define _ASM_SYSTEM_H | ||
14 | |||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/types.h> | ||
17 | #include <linux/irqflags.h> | ||
18 | |||
19 | #include <asm/addrspace.h> | ||
20 | #include <asm/barrier.h> | ||
21 | #include <asm/cmpxchg.h> | ||
22 | #include <asm/cpu-features.h> | ||
23 | #include <asm/dsp.h> | ||
24 | #include <asm/watch.h> | ||
25 | #include <asm/war.h> | ||
26 | |||
27 | |||
28 | /* | ||
29 | * switch_to(n) should switch tasks to task nr n, first | ||
30 | * checking that n isn't the current task, in which case it does nothing. | ||
31 | */ | ||
32 | extern asmlinkage void *resume(void *last, void *next, void *next_ti); | ||
33 | |||
34 | struct task_struct; | ||
35 | |||
36 | extern unsigned int ll_bit; | ||
37 | extern struct task_struct *ll_task; | ||
38 | |||
39 | #ifdef CONFIG_MIPS_MT_FPAFF | ||
40 | |||
41 | /* | ||
42 | * Handle the scheduler resume end of FPU affinity management. We do this | ||
43 | * inline to try to keep the overhead down. If we have been forced to run on | ||
44 | * a "CPU" with an FPU because of a previous high level of FP computation, | ||
45 | * but did not actually use the FPU during the most recent time-slice (CU1 | ||
46 | * isn't set), we undo the restriction on cpus_allowed. | ||
47 | * | ||
48 | * We're not calling set_cpus_allowed() here, because we have no need to | ||
49 | * force prompt migration - we're already switching the current CPU to a | ||
50 | * different thread. | ||
51 | */ | ||
52 | |||
53 | #define __mips_mt_fpaff_switch_to(prev) \ | ||
54 | do { \ | ||
55 | struct thread_info *__prev_ti = task_thread_info(prev); \ | ||
56 | \ | ||
57 | if (cpu_has_fpu && \ | ||
58 | test_ti_thread_flag(__prev_ti, TIF_FPUBOUND) && \ | ||
59 | (!(KSTK_STATUS(prev) & ST0_CU1))) { \ | ||
60 | clear_ti_thread_flag(__prev_ti, TIF_FPUBOUND); \ | ||
61 | prev->cpus_allowed = prev->thread.user_cpus_allowed; \ | ||
62 | } \ | ||
63 | next->thread.emulated_fp = 0; \ | ||
64 | } while(0) | ||
65 | |||
66 | #else | ||
67 | #define __mips_mt_fpaff_switch_to(prev) do { (void) (prev); } while (0) | ||
68 | #endif | ||
69 | |||
70 | #define __clear_software_ll_bit() \ | ||
71 | do { \ | ||
72 | if (!__builtin_constant_p(cpu_has_llsc) || !cpu_has_llsc) \ | ||
73 | ll_bit = 0; \ | ||
74 | } while (0) | ||
75 | |||
76 | #define switch_to(prev, next, last) \ | ||
77 | do { \ | ||
78 | __mips_mt_fpaff_switch_to(prev); \ | ||
79 | if (cpu_has_dsp) \ | ||
80 | __save_dsp(prev); \ | ||
81 | __clear_software_ll_bit(); \ | ||
82 | (last) = resume(prev, next, task_thread_info(next)); \ | ||
83 | } while (0) | ||
84 | |||
85 | #define finish_arch_switch(prev) \ | ||
86 | do { \ | ||
87 | if (cpu_has_dsp) \ | ||
88 | __restore_dsp(current); \ | ||
89 | if (cpu_has_userlocal) \ | ||
90 | write_c0_userlocal(current_thread_info()->tp_value); \ | ||
91 | __restore_watch(); \ | ||
92 | } while (0) | ||
93 | |||
94 | static inline unsigned long __xchg_u32(volatile int * m, unsigned int val) | ||
95 | { | ||
96 | __u32 retval; | ||
97 | |||
98 | smp_mb__before_llsc(); | ||
99 | |||
100 | if (kernel_uses_llsc && R10000_LLSC_WAR) { | ||
101 | unsigned long dummy; | ||
102 | |||
103 | __asm__ __volatile__( | ||
104 | " .set mips3 \n" | ||
105 | "1: ll %0, %3 # xchg_u32 \n" | ||
106 | " .set mips0 \n" | ||
107 | " move %2, %z4 \n" | ||
108 | " .set mips3 \n" | ||
109 | " sc %2, %1 \n" | ||
110 | " beqzl %2, 1b \n" | ||
111 | " .set mips0 \n" | ||
112 | : "=&r" (retval), "=m" (*m), "=&r" (dummy) | ||
113 | : "R" (*m), "Jr" (val) | ||
114 | : "memory"); | ||
115 | } else if (kernel_uses_llsc) { | ||
116 | unsigned long dummy; | ||
117 | |||
118 | do { | ||
119 | __asm__ __volatile__( | ||
120 | " .set mips3 \n" | ||
121 | " ll %0, %3 # xchg_u32 \n" | ||
122 | " .set mips0 \n" | ||
123 | " move %2, %z4 \n" | ||
124 | " .set mips3 \n" | ||
125 | " sc %2, %1 \n" | ||
126 | " .set mips0 \n" | ||
127 | : "=&r" (retval), "=m" (*m), "=&r" (dummy) | ||
128 | : "R" (*m), "Jr" (val) | ||
129 | : "memory"); | ||
130 | } while (unlikely(!dummy)); | ||
131 | } else { | ||
132 | unsigned long flags; | ||
133 | |||
134 | raw_local_irq_save(flags); | ||
135 | retval = *m; | ||
136 | *m = val; | ||
137 | raw_local_irq_restore(flags); /* implies memory barrier */ | ||
138 | } | ||
139 | |||
140 | smp_llsc_mb(); | ||
141 | |||
142 | return retval; | ||
143 | } | ||
144 | |||
145 | #ifdef CONFIG_64BIT | ||
146 | static inline __u64 __xchg_u64(volatile __u64 * m, __u64 val) | ||
147 | { | ||
148 | __u64 retval; | ||
149 | |||
150 | smp_mb__before_llsc(); | ||
151 | |||
152 | if (kernel_uses_llsc && R10000_LLSC_WAR) { | ||
153 | unsigned long dummy; | ||
154 | |||
155 | __asm__ __volatile__( | ||
156 | " .set mips3 \n" | ||
157 | "1: lld %0, %3 # xchg_u64 \n" | ||
158 | " move %2, %z4 \n" | ||
159 | " scd %2, %1 \n" | ||
160 | " beqzl %2, 1b \n" | ||
161 | " .set mips0 \n" | ||
162 | : "=&r" (retval), "=m" (*m), "=&r" (dummy) | ||
163 | : "R" (*m), "Jr" (val) | ||
164 | : "memory"); | ||
165 | } else if (kernel_uses_llsc) { | ||
166 | unsigned long dummy; | ||
167 | |||
168 | do { | ||
169 | __asm__ __volatile__( | ||
170 | " .set mips3 \n" | ||
171 | " lld %0, %3 # xchg_u64 \n" | ||
172 | " move %2, %z4 \n" | ||
173 | " scd %2, %1 \n" | ||
174 | " .set mips0 \n" | ||
175 | : "=&r" (retval), "=m" (*m), "=&r" (dummy) | ||
176 | : "R" (*m), "Jr" (val) | ||
177 | : "memory"); | ||
178 | } while (unlikely(!dummy)); | ||
179 | } else { | ||
180 | unsigned long flags; | ||
181 | |||
182 | raw_local_irq_save(flags); | ||
183 | retval = *m; | ||
184 | *m = val; | ||
185 | raw_local_irq_restore(flags); /* implies memory barrier */ | ||
186 | } | ||
187 | |||
188 | smp_llsc_mb(); | ||
189 | |||
190 | return retval; | ||
191 | } | ||
192 | #else | ||
193 | extern __u64 __xchg_u64_unsupported_on_32bit_kernels(volatile __u64 * m, __u64 val); | ||
194 | #define __xchg_u64 __xchg_u64_unsupported_on_32bit_kernels | ||
195 | #endif | ||
196 | |||
197 | static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size) | ||
198 | { | ||
199 | switch (size) { | ||
200 | case 4: | ||
201 | return __xchg_u32(ptr, x); | ||
202 | case 8: | ||
203 | return __xchg_u64(ptr, x); | ||
204 | } | ||
205 | |||
206 | return x; | ||
207 | } | ||
208 | |||
209 | #define xchg(ptr, x) \ | ||
210 | ({ \ | ||
211 | BUILD_BUG_ON(sizeof(*(ptr)) & ~0xc); \ | ||
212 | \ | ||
213 | ((__typeof__(*(ptr))) \ | ||
214 | __xchg((unsigned long)(x), (ptr), sizeof(*(ptr)))); \ | ||
215 | }) | ||
216 | |||
217 | extern void set_handler(unsigned long offset, void *addr, unsigned long len); | ||
218 | extern void set_uncached_handler(unsigned long offset, void *addr, unsigned long len); | ||
219 | |||
220 | typedef void (*vi_handler_t)(void); | ||
221 | extern void *set_vi_handler(int n, vi_handler_t addr); | ||
222 | |||
223 | extern void *set_except_vector(int n, void *addr); | ||
224 | extern unsigned long ebase; | ||
225 | extern void per_cpu_trap_init(void); | ||
226 | |||
227 | /* | ||
228 | * See include/asm-ia64/system.h; prevents deadlock on SMP | ||
229 | * systems. | ||
230 | */ | ||
231 | #define __ARCH_WANT_UNLOCKED_CTXSW | ||
232 | |||
233 | extern unsigned long arch_align_stack(unsigned long sp); | ||
234 | |||
235 | #endif /* _ASM_SYSTEM_H */ | ||
diff --git a/arch/mips/include/asm/termbits.h b/arch/mips/include/asm/termbits.h new file mode 100644 index 00000000000..76630b396fa --- /dev/null +++ b/arch/mips/include/asm/termbits.h | |||
@@ -0,0 +1,227 @@ | |||
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) 1995, 96, 99, 2001, 06 Ralf Baechle | ||
7 | * Copyright (C) 1999 Silicon Graphics, Inc. | ||
8 | * Copyright (C) 2001 MIPS Technologies, Inc. | ||
9 | */ | ||
10 | #ifndef _ASM_TERMBITS_H | ||
11 | #define _ASM_TERMBITS_H | ||
12 | |||
13 | #include <linux/posix_types.h> | ||
14 | |||
15 | typedef unsigned char cc_t; | ||
16 | typedef unsigned int speed_t; | ||
17 | typedef unsigned int tcflag_t; | ||
18 | |||
19 | /* | ||
20 | * The ABI says nothing about NCC but seems to use NCCS as | ||
21 | * replacement for it in struct termio | ||
22 | */ | ||
23 | #define NCCS 23 | ||
24 | struct termios { | ||
25 | tcflag_t c_iflag; /* input mode flags */ | ||
26 | tcflag_t c_oflag; /* output mode flags */ | ||
27 | tcflag_t c_cflag; /* control mode flags */ | ||
28 | tcflag_t c_lflag; /* local mode flags */ | ||
29 | cc_t c_line; /* line discipline */ | ||
30 | cc_t c_cc[NCCS]; /* control characters */ | ||
31 | }; | ||
32 | |||
33 | struct termios2 { | ||
34 | tcflag_t c_iflag; /* input mode flags */ | ||
35 | tcflag_t c_oflag; /* output mode flags */ | ||
36 | tcflag_t c_cflag; /* control mode flags */ | ||
37 | tcflag_t c_lflag; /* local mode flags */ | ||
38 | cc_t c_line; /* line discipline */ | ||
39 | cc_t c_cc[NCCS]; /* control characters */ | ||
40 | speed_t c_ispeed; /* input speed */ | ||
41 | speed_t c_ospeed; /* output speed */ | ||
42 | }; | ||
43 | |||
44 | struct ktermios { | ||
45 | tcflag_t c_iflag; /* input mode flags */ | ||
46 | tcflag_t c_oflag; /* output mode flags */ | ||
47 | tcflag_t c_cflag; /* control mode flags */ | ||
48 | tcflag_t c_lflag; /* local mode flags */ | ||
49 | cc_t c_line; /* line discipline */ | ||
50 | cc_t c_cc[NCCS]; /* control characters */ | ||
51 | speed_t c_ispeed; /* input speed */ | ||
52 | speed_t c_ospeed; /* output speed */ | ||
53 | }; | ||
54 | |||
55 | /* c_cc characters */ | ||
56 | #define VINTR 0 /* Interrupt character [ISIG]. */ | ||
57 | #define VQUIT 1 /* Quit character [ISIG]. */ | ||
58 | #define VERASE 2 /* Erase character [ICANON]. */ | ||
59 | #define VKILL 3 /* Kill-line character [ICANON]. */ | ||
60 | #define VMIN 4 /* Minimum number of bytes read at once [!ICANON]. */ | ||
61 | #define VTIME 5 /* Time-out value (tenths of a second) [!ICANON]. */ | ||
62 | #define VEOL2 6 /* Second EOL character [ICANON]. */ | ||
63 | #define VSWTC 7 /* ??? */ | ||
64 | #define VSWTCH VSWTC | ||
65 | #define VSTART 8 /* Start (X-ON) character [IXON, IXOFF]. */ | ||
66 | #define VSTOP 9 /* Stop (X-OFF) character [IXON, IXOFF]. */ | ||
67 | #define VSUSP 10 /* Suspend character [ISIG]. */ | ||
68 | #if 0 | ||
69 | /* | ||
70 | * VDSUSP is not supported | ||
71 | */ | ||
72 | #define VDSUSP 11 /* Delayed suspend character [ISIG]. */ | ||
73 | #endif | ||
74 | #define VREPRINT 12 /* Reprint-line character [ICANON]. */ | ||
75 | #define VDISCARD 13 /* Discard character [IEXTEN]. */ | ||
76 | #define VWERASE 14 /* Word-erase character [ICANON]. */ | ||
77 | #define VLNEXT 15 /* Literal-next character [IEXTEN]. */ | ||
78 | #define VEOF 16 /* End-of-file character [ICANON]. */ | ||
79 | #define VEOL 17 /* End-of-line character [ICANON]. */ | ||
80 | |||
81 | /* c_iflag bits */ | ||
82 | #define IGNBRK 0000001 /* Ignore break condition. */ | ||
83 | #define BRKINT 0000002 /* Signal interrupt on break. */ | ||
84 | #define IGNPAR 0000004 /* Ignore characters with parity errors. */ | ||
85 | #define PARMRK 0000010 /* Mark parity and framing errors. */ | ||
86 | #define INPCK 0000020 /* Enable input parity check. */ | ||
87 | #define ISTRIP 0000040 /* Strip 8th bit off characters. */ | ||
88 | #define INLCR 0000100 /* Map NL to CR on input. */ | ||
89 | #define IGNCR 0000200 /* Ignore CR. */ | ||
90 | #define ICRNL 0000400 /* Map CR to NL on input. */ | ||
91 | #define IUCLC 0001000 /* Map upper case to lower case on input. */ | ||
92 | #define IXON 0002000 /* Enable start/stop output control. */ | ||
93 | #define IXANY 0004000 /* Any character will restart after stop. */ | ||
94 | #define IXOFF 0010000 /* Enable start/stop input control. */ | ||
95 | #define IMAXBEL 0020000 /* Ring bell when input queue is full. */ | ||
96 | #define IUTF8 0040000 /* Input is UTF-8 */ | ||
97 | |||
98 | /* c_oflag bits */ | ||
99 | #define OPOST 0000001 /* Perform output processing. */ | ||
100 | #define OLCUC 0000002 /* Map lower case to upper case on output. */ | ||
101 | #define ONLCR 0000004 /* Map NL to CR-NL on output. */ | ||
102 | #define OCRNL 0000010 | ||
103 | #define ONOCR 0000020 | ||
104 | #define ONLRET 0000040 | ||
105 | #define OFILL 0000100 | ||
106 | #define OFDEL 0000200 | ||
107 | #define NLDLY 0000400 | ||
108 | #define NL0 0000000 | ||
109 | #define NL1 0000400 | ||
110 | #define CRDLY 0003000 | ||
111 | #define CR0 0000000 | ||
112 | #define CR1 0001000 | ||
113 | #define CR2 0002000 | ||
114 | #define CR3 0003000 | ||
115 | #define TABDLY 0014000 | ||
116 | #define TAB0 0000000 | ||
117 | #define TAB1 0004000 | ||
118 | #define TAB2 0010000 | ||
119 | #define TAB3 0014000 | ||
120 | #define XTABS 0014000 | ||
121 | #define BSDLY 0020000 | ||
122 | #define BS0 0000000 | ||
123 | #define BS1 0020000 | ||
124 | #define VTDLY 0040000 | ||
125 | #define VT0 0000000 | ||
126 | #define VT1 0040000 | ||
127 | #define FFDLY 0100000 | ||
128 | #define FF0 0000000 | ||
129 | #define FF1 0100000 | ||
130 | /* | ||
131 | #define PAGEOUT ??? | ||
132 | #define WRAP ??? | ||
133 | */ | ||
134 | |||
135 | /* c_cflag bit meaning */ | ||
136 | #define CBAUD 0010017 | ||
137 | #define B0 0000000 /* hang up */ | ||
138 | #define B50 0000001 | ||
139 | #define B75 0000002 | ||
140 | #define B110 0000003 | ||
141 | #define B134 0000004 | ||
142 | #define B150 0000005 | ||
143 | #define B200 0000006 | ||
144 | #define B300 0000007 | ||
145 | #define B600 0000010 | ||
146 | #define B1200 0000011 | ||
147 | #define B1800 0000012 | ||
148 | #define B2400 0000013 | ||
149 | #define B4800 0000014 | ||
150 | #define B9600 0000015 | ||
151 | #define B19200 0000016 | ||
152 | #define B38400 0000017 | ||
153 | #define EXTA B19200 | ||
154 | #define EXTB B38400 | ||
155 | #define CSIZE 0000060 /* Number of bits per byte (mask). */ | ||
156 | #define CS5 0000000 /* 5 bits per byte. */ | ||
157 | #define CS6 0000020 /* 6 bits per byte. */ | ||
158 | #define CS7 0000040 /* 7 bits per byte. */ | ||
159 | #define CS8 0000060 /* 8 bits per byte. */ | ||
160 | #define CSTOPB 0000100 /* Two stop bits instead of one. */ | ||
161 | #define CREAD 0000200 /* Enable receiver. */ | ||
162 | #define PARENB 0000400 /* Parity enable. */ | ||
163 | #define PARODD 0001000 /* Odd parity instead of even. */ | ||
164 | #define HUPCL 0002000 /* Hang up on last close. */ | ||
165 | #define CLOCAL 0004000 /* Ignore modem status lines. */ | ||
166 | #define CBAUDEX 0010000 | ||
167 | #define BOTHER 0010000 | ||
168 | #define B57600 0010001 | ||
169 | #define B115200 0010002 | ||
170 | #define B230400 0010003 | ||
171 | #define B460800 0010004 | ||
172 | #define B500000 0010005 | ||
173 | #define B576000 0010006 | ||
174 | #define B921600 0010007 | ||
175 | #define B1000000 0010010 | ||
176 | #define B1152000 0010011 | ||
177 | #define B1500000 0010012 | ||
178 | #define B2000000 0010013 | ||
179 | #define B2500000 0010014 | ||
180 | #define B3000000 0010015 | ||
181 | #define B3500000 0010016 | ||
182 | #define B4000000 0010017 | ||
183 | #define CIBAUD 002003600000 /* input baud rate */ | ||
184 | #define CMSPAR 010000000000 /* mark or space (stick) parity */ | ||
185 | #define CRTSCTS 020000000000 /* flow control */ | ||
186 | |||
187 | #define IBSHIFT 16 /* Shift from CBAUD to CIBAUD */ | ||
188 | |||
189 | /* c_lflag bits */ | ||
190 | #define ISIG 0000001 /* Enable signals. */ | ||
191 | #define ICANON 0000002 /* Do erase and kill processing. */ | ||
192 | #define XCASE 0000004 | ||
193 | #define ECHO 0000010 /* Enable echo. */ | ||
194 | #define ECHOE 0000020 /* Visual erase for ERASE. */ | ||
195 | #define ECHOK 0000040 /* Echo NL after KILL. */ | ||
196 | #define ECHONL 0000100 /* Echo NL even if ECHO is off. */ | ||
197 | #define NOFLSH 0000200 /* Disable flush after interrupt. */ | ||
198 | #define IEXTEN 0000400 /* Enable DISCARD and LNEXT. */ | ||
199 | #define ECHOCTL 0001000 /* Echo control characters as ^X. */ | ||
200 | #define ECHOPRT 0002000 /* Hardcopy visual erase. */ | ||
201 | #define ECHOKE 0004000 /* Visual erase for KILL. */ | ||
202 | #define FLUSHO 0020000 | ||
203 | #define PENDIN 0040000 /* Retype pending input (state). */ | ||
204 | #define TOSTOP 0100000 /* Send SIGTTOU for background output. */ | ||
205 | #define ITOSTOP TOSTOP | ||
206 | #define EXTPROC 0200000 /* External processing on pty */ | ||
207 | |||
208 | /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */ | ||
209 | #define TIOCSER_TEMT 0x01 /* Transmitter physically empty */ | ||
210 | |||
211 | /* tcflow() and TCXONC use these */ | ||
212 | #define TCOOFF 0 /* Suspend output. */ | ||
213 | #define TCOON 1 /* Restart suspended output. */ | ||
214 | #define TCIOFF 2 /* Send a STOP character. */ | ||
215 | #define TCION 3 /* Send a START character. */ | ||
216 | |||
217 | /* tcflush() and TCFLSH use these */ | ||
218 | #define TCIFLUSH 0 /* Discard data received but not yet read. */ | ||
219 | #define TCOFLUSH 1 /* Discard data written but not yet sent. */ | ||
220 | #define TCIOFLUSH 2 /* Discard all pending data. */ | ||
221 | |||
222 | /* tcsetattr uses these */ | ||
223 | #define TCSANOW TCSETS /* Change immediately. */ | ||
224 | #define TCSADRAIN TCSETSW /* Change when pending output is written. */ | ||
225 | #define TCSAFLUSH TCSETSF /* Flush pending input before changing. */ | ||
226 | |||
227 | #endif /* _ASM_TERMBITS_H */ | ||
diff --git a/arch/mips/include/asm/titan_dep.h b/arch/mips/include/asm/titan_dep.h new file mode 100644 index 00000000000..fee1908c65d --- /dev/null +++ b/arch/mips/include/asm/titan_dep.h | |||
@@ -0,0 +1,231 @@ | |||
1 | /* | ||
2 | * Copyright 2003 PMC-Sierra | ||
3 | * Author: Manish Lachwani (lachwani@pmc-sierra.com) | ||
4 | * | ||
5 | * Board specific definititions for the PMC-Sierra Yosemite | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify it | ||
8 | * under the terms of the GNU General Public License as published by the | ||
9 | * Free Software Foundation; either version 2 of the License, or (at your | ||
10 | * option) any later version. | ||
11 | */ | ||
12 | |||
13 | #ifndef __TITAN_DEP_H__ | ||
14 | #define __TITAN_DEP_H__ | ||
15 | |||
16 | #include <asm/addrspace.h> /* for KSEG1ADDR() */ | ||
17 | #include <asm/byteorder.h> /* for cpu_to_le32() */ | ||
18 | |||
19 | #define TITAN_READ(ofs) \ | ||
20 | (*(volatile u32 *)(ocd_base+(ofs))) | ||
21 | #define TITAN_READ_16(ofs) \ | ||
22 | (*(volatile u16 *)(ocd_base+(ofs))) | ||
23 | #define TITAN_READ_8(ofs) \ | ||
24 | (*(volatile u8 *)(ocd_base+(ofs))) | ||
25 | |||
26 | #define TITAN_WRITE(ofs, data) \ | ||
27 | do { *(volatile u32 *)(ocd_base+(ofs)) = (data); } while (0) | ||
28 | #define TITAN_WRITE_16(ofs, data) \ | ||
29 | do { *(volatile u16 *)(ocd_base+(ofs)) = (data); } while (0) | ||
30 | #define TITAN_WRITE_8(ofs, data) \ | ||
31 | do { *(volatile u8 *)(ocd_base+(ofs)) = (data); } while (0) | ||
32 | |||
33 | /* | ||
34 | * PCI specific defines | ||
35 | */ | ||
36 | #define TITAN_PCI_0_CONFIG_ADDRESS 0x780 | ||
37 | #define TITAN_PCI_0_CONFIG_DATA 0x784 | ||
38 | |||
39 | /* | ||
40 | * HT specific defines | ||
41 | */ | ||
42 | #define RM9000x2_HTLINK_REG 0xbb000644 | ||
43 | #define RM9000x2_BASE_ADDR 0xbb000000 | ||
44 | |||
45 | #define OCD_BASE 0xfb000000UL | ||
46 | #define OCD_SIZE 0x3000UL | ||
47 | |||
48 | extern unsigned long ocd_base; | ||
49 | |||
50 | /* | ||
51 | * OCD Registers | ||
52 | */ | ||
53 | #define RM9000x2_OCD_LKB5 0x0128 /* Ethernet */ | ||
54 | #define RM9000x2_OCD_LKM5 0x012c | ||
55 | |||
56 | #define RM9000x2_OCD_LKB7 0x0138 /* HT Region 0 */ | ||
57 | #define RM9000x2_OCD_LKM7 0x013c | ||
58 | #define RM9000x2_OCD_LKB8 0x0140 /* HT Region 1 */ | ||
59 | #define RM9000x2_OCD_LKM8 0x0144 | ||
60 | |||
61 | #define RM9000x2_OCD_LKB9 0x0148 /* Local Bus */ | ||
62 | #define RM9000x2_OCD_LKM9 0x014c | ||
63 | #define RM9000x2_OCD_LKB10 0x0150 | ||
64 | #define RM9000x2_OCD_LKM10 0x0154 | ||
65 | #define RM9000x2_OCD_LKB11 0x0158 | ||
66 | #define RM9000x2_OCD_LKM11 0x015c | ||
67 | #define RM9000x2_OCD_LKB12 0x0160 | ||
68 | #define RM9000x2_OCD_LKM12 0x0164 | ||
69 | |||
70 | #define RM9000x2_OCD_LKB13 0x0168 /* Scratch RAM */ | ||
71 | #define RM9000x2_OCD_LKM13 0x016c | ||
72 | |||
73 | #define RM9000x2_OCD_LPD0 0x0200 /* Local Bus */ | ||
74 | #define RM9000x2_OCD_LPD1 0x0210 | ||
75 | #define RM9000x2_OCD_LPD2 0x0220 | ||
76 | #define RM9000x2_OCD_LPD3 0x0230 | ||
77 | |||
78 | #define RM9000x2_OCD_HTDVID 0x0600 /* HT Device Header */ | ||
79 | #define RM9000x2_OCD_HTSC 0x0604 | ||
80 | #define RM9000x2_OCD_HTCCR 0x0608 | ||
81 | #define RM9000x2_OCD_HTBHL 0x060c | ||
82 | #define RM9000x2_OCD_HTBAR0 0x0610 | ||
83 | #define RM9000x2_OCD_HTBAR1 0x0614 | ||
84 | #define RM9000x2_OCD_HTBAR2 0x0618 | ||
85 | #define RM9000x2_OCD_HTBAR3 0x061c | ||
86 | #define RM9000x2_OCD_HTBAR4 0x0620 | ||
87 | #define RM9000x2_OCD_HTBAR5 0x0624 | ||
88 | #define RM9000x2_OCD_HTCBCPT 0x0628 | ||
89 | #define RM9000x2_OCD_HTSDVID 0x062c | ||
90 | #define RM9000x2_OCD_HTXRA 0x0630 | ||
91 | #define RM9000x2_OCD_HTCAP1 0x0634 | ||
92 | #define RM9000x2_OCD_HTIL 0x063c | ||
93 | |||
94 | #define RM9000x2_OCD_HTLCC 0x0640 /* HT Capability Block */ | ||
95 | #define RM9000x2_OCD_HTLINK 0x0644 | ||
96 | #define RM9000x2_OCD_HTFQREV 0x0648 | ||
97 | |||
98 | #define RM9000x2_OCD_HTERCTL 0x0668 /* HT Controller */ | ||
99 | #define RM9000x2_OCD_HTRXDB 0x066c | ||
100 | #define RM9000x2_OCD_HTIMPED 0x0670 | ||
101 | #define RM9000x2_OCD_HTSWIMP 0x0674 | ||
102 | #define RM9000x2_OCD_HTCAL 0x0678 | ||
103 | |||
104 | #define RM9000x2_OCD_HTBAA30 0x0680 | ||
105 | #define RM9000x2_OCD_HTBAA54 0x0684 | ||
106 | #define RM9000x2_OCD_HTMASK0 0x0688 | ||
107 | #define RM9000x2_OCD_HTMASK1 0x068c | ||
108 | #define RM9000x2_OCD_HTMASK2 0x0690 | ||
109 | #define RM9000x2_OCD_HTMASK3 0x0694 | ||
110 | #define RM9000x2_OCD_HTMASK4 0x0698 | ||
111 | #define RM9000x2_OCD_HTMASK5 0x069c | ||
112 | |||
113 | #define RM9000x2_OCD_HTIFCTL 0x06a0 | ||
114 | #define RM9000x2_OCD_HTPLL 0x06a4 | ||
115 | |||
116 | #define RM9000x2_OCD_HTSRI 0x06b0 | ||
117 | #define RM9000x2_OCD_HTRXNUM 0x06b4 | ||
118 | #define RM9000x2_OCD_HTTXNUM 0x06b8 | ||
119 | |||
120 | #define RM9000x2_OCD_HTTXCNT 0x06c8 | ||
121 | |||
122 | #define RM9000x2_OCD_HTERROR 0x06d8 | ||
123 | #define RM9000x2_OCD_HTRCRCE 0x06dc | ||
124 | #define RM9000x2_OCD_HTEOI 0x06e0 | ||
125 | |||
126 | #define RM9000x2_OCD_CRCR 0x06f0 | ||
127 | |||
128 | #define RM9000x2_OCD_HTCFGA 0x06f8 | ||
129 | #define RM9000x2_OCD_HTCFGD 0x06fc | ||
130 | |||
131 | #define RM9000x2_OCD_INTMSG 0x0a00 | ||
132 | |||
133 | #define RM9000x2_OCD_INTPIN0 0x0a40 | ||
134 | #define RM9000x2_OCD_INTPIN1 0x0a44 | ||
135 | #define RM9000x2_OCD_INTPIN2 0x0a48 | ||
136 | #define RM9000x2_OCD_INTPIN3 0x0a4c | ||
137 | #define RM9000x2_OCD_INTPIN4 0x0a50 | ||
138 | #define RM9000x2_OCD_INTPIN5 0x0a54 | ||
139 | #define RM9000x2_OCD_INTPIN6 0x0a58 | ||
140 | #define RM9000x2_OCD_INTPIN7 0x0a5c | ||
141 | #define RM9000x2_OCD_SEM 0x0a60 | ||
142 | #define RM9000x2_OCD_SEMSET 0x0a64 | ||
143 | #define RM9000x2_OCD_SEMCLR 0x0a68 | ||
144 | |||
145 | #define RM9000x2_OCD_TKT 0x0a70 | ||
146 | #define RM9000x2_OCD_TKTINC 0x0a74 | ||
147 | |||
148 | #define RM9000x2_OCD_NMICONFIG 0x0ac0 /* Interrupts */ | ||
149 | #define RM9000x2_OCD_INTP0PRI 0x1a80 | ||
150 | #define RM9000x2_OCD_INTP1PRI 0x1a80 | ||
151 | #define RM9000x2_OCD_INTP0STATUS0 0x1b00 | ||
152 | #define RM9000x2_OCD_INTP0MASK0 0x1b04 | ||
153 | #define RM9000x2_OCD_INTP0SET0 0x1b08 | ||
154 | #define RM9000x2_OCD_INTP0CLEAR0 0x1b0c | ||
155 | #define RM9000x2_OCD_INTP0STATUS1 0x1b10 | ||
156 | #define RM9000x2_OCD_INTP0MASK1 0x1b14 | ||
157 | #define RM9000x2_OCD_INTP0SET1 0x1b18 | ||
158 | #define RM9000x2_OCD_INTP0CLEAR1 0x1b1c | ||
159 | #define RM9000x2_OCD_INTP0STATUS2 0x1b20 | ||
160 | #define RM9000x2_OCD_INTP0MASK2 0x1b24 | ||
161 | #define RM9000x2_OCD_INTP0SET2 0x1b28 | ||
162 | #define RM9000x2_OCD_INTP0CLEAR2 0x1b2c | ||
163 | #define RM9000x2_OCD_INTP0STATUS3 0x1b30 | ||
164 | #define RM9000x2_OCD_INTP0MASK3 0x1b34 | ||
165 | #define RM9000x2_OCD_INTP0SET3 0x1b38 | ||
166 | #define RM9000x2_OCD_INTP0CLEAR3 0x1b3c | ||
167 | #define RM9000x2_OCD_INTP0STATUS4 0x1b40 | ||
168 | #define RM9000x2_OCD_INTP0MASK4 0x1b44 | ||
169 | #define RM9000x2_OCD_INTP0SET4 0x1b48 | ||
170 | #define RM9000x2_OCD_INTP0CLEAR4 0x1b4c | ||
171 | #define RM9000x2_OCD_INTP0STATUS5 0x1b50 | ||
172 | #define RM9000x2_OCD_INTP0MASK5 0x1b54 | ||
173 | #define RM9000x2_OCD_INTP0SET5 0x1b58 | ||
174 | #define RM9000x2_OCD_INTP0CLEAR5 0x1b5c | ||
175 | #define RM9000x2_OCD_INTP0STATUS6 0x1b60 | ||
176 | #define RM9000x2_OCD_INTP0MASK6 0x1b64 | ||
177 | #define RM9000x2_OCD_INTP0SET6 0x1b68 | ||
178 | #define RM9000x2_OCD_INTP0CLEAR6 0x1b6c | ||
179 | #define RM9000x2_OCD_INTP0STATUS7 0x1b70 | ||
180 | #define RM9000x2_OCD_INTP0MASK7 0x1b74 | ||
181 | #define RM9000x2_OCD_INTP0SET7 0x1b78 | ||
182 | #define RM9000x2_OCD_INTP0CLEAR7 0x1b7c | ||
183 | #define RM9000x2_OCD_INTP1STATUS0 0x2b00 | ||
184 | #define RM9000x2_OCD_INTP1MASK0 0x2b04 | ||
185 | #define RM9000x2_OCD_INTP1SET0 0x2b08 | ||
186 | #define RM9000x2_OCD_INTP1CLEAR0 0x2b0c | ||
187 | #define RM9000x2_OCD_INTP1STATUS1 0x2b10 | ||
188 | #define RM9000x2_OCD_INTP1MASK1 0x2b14 | ||
189 | #define RM9000x2_OCD_INTP1SET1 0x2b18 | ||
190 | #define RM9000x2_OCD_INTP1CLEAR1 0x2b1c | ||
191 | #define RM9000x2_OCD_INTP1STATUS2 0x2b20 | ||
192 | #define RM9000x2_OCD_INTP1MASK2 0x2b24 | ||
193 | #define RM9000x2_OCD_INTP1SET2 0x2b28 | ||
194 | #define RM9000x2_OCD_INTP1CLEAR2 0x2b2c | ||
195 | #define RM9000x2_OCD_INTP1STATUS3 0x2b30 | ||
196 | #define RM9000x2_OCD_INTP1MASK3 0x2b34 | ||
197 | #define RM9000x2_OCD_INTP1SET3 0x2b38 | ||
198 | #define RM9000x2_OCD_INTP1CLEAR3 0x2b3c | ||
199 | #define RM9000x2_OCD_INTP1STATUS4 0x2b40 | ||
200 | #define RM9000x2_OCD_INTP1MASK4 0x2b44 | ||
201 | #define RM9000x2_OCD_INTP1SET4 0x2b48 | ||
202 | #define RM9000x2_OCD_INTP1CLEAR4 0x2b4c | ||
203 | #define RM9000x2_OCD_INTP1STATUS5 0x2b50 | ||
204 | #define RM9000x2_OCD_INTP1MASK5 0x2b54 | ||
205 | #define RM9000x2_OCD_INTP1SET5 0x2b58 | ||
206 | #define RM9000x2_OCD_INTP1CLEAR5 0x2b5c | ||
207 | #define RM9000x2_OCD_INTP1STATUS6 0x2b60 | ||
208 | #define RM9000x2_OCD_INTP1MASK6 0x2b64 | ||
209 | #define RM9000x2_OCD_INTP1SET6 0x2b68 | ||
210 | #define RM9000x2_OCD_INTP1CLEAR6 0x2b6c | ||
211 | #define RM9000x2_OCD_INTP1STATUS7 0x2b70 | ||
212 | #define RM9000x2_OCD_INTP1MASK7 0x2b74 | ||
213 | #define RM9000x2_OCD_INTP1SET7 0x2b78 | ||
214 | #define RM9000x2_OCD_INTP1CLEAR7 0x2b7c | ||
215 | |||
216 | #define OCD_READ(reg) (*(volatile unsigned int *)(ocd_base + (reg))) | ||
217 | #define OCD_WRITE(reg, val) \ | ||
218 | do { *(volatile unsigned int *)(ocd_base + (reg)) = (val); } while (0) | ||
219 | |||
220 | /* | ||
221 | * Hypertransport specific macros | ||
222 | */ | ||
223 | #define RM9K_WRITE(ofs, data) *(volatile u_int32_t *)(RM9000x2_BASE_ADDR+ofs) = data | ||
224 | #define RM9K_WRITE_8(ofs, data) *(volatile u8 *)(RM9000x2_BASE_ADDR+ofs) = data | ||
225 | #define RM9K_WRITE_16(ofs, data) *(volatile u16 *)(RM9000x2_BASE_ADDR+ofs) = data | ||
226 | |||
227 | #define RM9K_READ(ofs, val) *(val) = *(volatile u_int32_t *)(RM9000x2_BASE_ADDR+ofs) | ||
228 | #define RM9K_READ_8(ofs, val) *(val) = *(volatile u8 *)(RM9000x2_BASE_ADDR+ofs) | ||
229 | #define RM9K_READ_16(ofs, val) *(val) = *(volatile u16 *)(RM9000x2_BASE_ADDR+ofs) | ||
230 | |||
231 | #endif | ||
diff --git a/arch/mips/jz4740/pwm.c b/arch/mips/jz4740/pwm.c new file mode 100644 index 00000000000..a26a6faec9a --- /dev/null +++ b/arch/mips/jz4740/pwm.c | |||
@@ -0,0 +1,177 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2010, Lars-Peter Clausen <lars@metafoo.de> | ||
3 | * JZ4740 platform PWM support | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms of the GNU General Public License as published by the | ||
7 | * Free Software Foundation; either version 2 of the License, or (at your | ||
8 | * option) any later version. | ||
9 | * | ||
10 | * You should have received a copy of the GNU General Public License along | ||
11 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
12 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
13 | * | ||
14 | */ | ||
15 | |||
16 | #include <linux/kernel.h> | ||
17 | |||
18 | #include <linux/clk.h> | ||
19 | #include <linux/err.h> | ||
20 | #include <linux/pwm.h> | ||
21 | #include <linux/gpio.h> | ||
22 | |||
23 | #include <asm/mach-jz4740/gpio.h> | ||
24 | #include "timer.h" | ||
25 | |||
26 | static struct clk *jz4740_pwm_clk; | ||
27 | |||
28 | DEFINE_MUTEX(jz4740_pwm_mutex); | ||
29 | |||
30 | struct pwm_device { | ||
31 | unsigned int id; | ||
32 | unsigned int gpio; | ||
33 | bool used; | ||
34 | }; | ||
35 | |||
36 | static struct pwm_device jz4740_pwm_list[] = { | ||
37 | { 2, JZ_GPIO_PWM2, false }, | ||
38 | { 3, JZ_GPIO_PWM3, false }, | ||
39 | { 4, JZ_GPIO_PWM4, false }, | ||
40 | { 5, JZ_GPIO_PWM5, false }, | ||
41 | { 6, JZ_GPIO_PWM6, false }, | ||
42 | { 7, JZ_GPIO_PWM7, false }, | ||
43 | }; | ||
44 | |||
45 | struct pwm_device *pwm_request(int id, const char *label) | ||
46 | { | ||
47 | int ret = 0; | ||
48 | struct pwm_device *pwm; | ||
49 | |||
50 | if (id < 2 || id > 7 || !jz4740_pwm_clk) | ||
51 | return ERR_PTR(-ENODEV); | ||
52 | |||
53 | mutex_lock(&jz4740_pwm_mutex); | ||
54 | |||
55 | pwm = &jz4740_pwm_list[id - 2]; | ||
56 | if (pwm->used) | ||
57 | ret = -EBUSY; | ||
58 | else | ||
59 | pwm->used = true; | ||
60 | |||
61 | mutex_unlock(&jz4740_pwm_mutex); | ||
62 | |||
63 | if (ret) | ||
64 | return ERR_PTR(ret); | ||
65 | |||
66 | ret = gpio_request(pwm->gpio, label); | ||
67 | |||
68 | if (ret) { | ||
69 | printk(KERN_ERR "Failed to request pwm gpio: %d\n", ret); | ||
70 | pwm->used = false; | ||
71 | return ERR_PTR(ret); | ||
72 | } | ||
73 | |||
74 | jz_gpio_set_function(pwm->gpio, JZ_GPIO_FUNC_PWM); | ||
75 | |||
76 | jz4740_timer_start(id); | ||
77 | |||
78 | return pwm; | ||
79 | } | ||
80 | |||
81 | void pwm_free(struct pwm_device *pwm) | ||
82 | { | ||
83 | pwm_disable(pwm); | ||
84 | jz4740_timer_set_ctrl(pwm->id, 0); | ||
85 | |||
86 | jz_gpio_set_function(pwm->gpio, JZ_GPIO_FUNC_NONE); | ||
87 | gpio_free(pwm->gpio); | ||
88 | |||
89 | jz4740_timer_stop(pwm->id); | ||
90 | |||
91 | pwm->used = false; | ||
92 | } | ||
93 | |||
94 | int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns) | ||
95 | { | ||
96 | unsigned long long tmp; | ||
97 | unsigned long period, duty; | ||
98 | unsigned int prescaler = 0; | ||
99 | unsigned int id = pwm->id; | ||
100 | uint16_t ctrl; | ||
101 | bool is_enabled; | ||
102 | |||
103 | if (duty_ns < 0 || duty_ns > period_ns) | ||
104 | return -EINVAL; | ||
105 | |||
106 | tmp = (unsigned long long)clk_get_rate(jz4740_pwm_clk) * period_ns; | ||
107 | do_div(tmp, 1000000000); | ||
108 | period = tmp; | ||
109 | |||
110 | while (period > 0xffff && prescaler < 6) { | ||
111 | period >>= 2; | ||
112 | ++prescaler; | ||
113 | } | ||
114 | |||
115 | if (prescaler == 6) | ||
116 | return -EINVAL; | ||
117 | |||
118 | tmp = (unsigned long long)period * duty_ns; | ||
119 | do_div(tmp, period_ns); | ||
120 | duty = period - tmp; | ||
121 | |||
122 | if (duty >= period) | ||
123 | duty = period - 1; | ||
124 | |||
125 | is_enabled = jz4740_timer_is_enabled(id); | ||
126 | if (is_enabled) | ||
127 | pwm_disable(pwm); | ||
128 | |||
129 | jz4740_timer_set_count(id, 0); | ||
130 | jz4740_timer_set_duty(id, duty); | ||
131 | jz4740_timer_set_period(id, period); | ||
132 | |||
133 | ctrl = JZ_TIMER_CTRL_PRESCALER(prescaler) | JZ_TIMER_CTRL_SRC_EXT | | ||
134 | JZ_TIMER_CTRL_PWM_ABBRUPT_SHUTDOWN; | ||
135 | |||
136 | jz4740_timer_set_ctrl(id, ctrl); | ||
137 | |||
138 | if (is_enabled) | ||
139 | pwm_enable(pwm); | ||
140 | |||
141 | return 0; | ||
142 | } | ||
143 | |||
144 | int pwm_enable(struct pwm_device *pwm) | ||
145 | { | ||
146 | uint32_t ctrl = jz4740_timer_get_ctrl(pwm->id); | ||
147 | |||
148 | ctrl |= JZ_TIMER_CTRL_PWM_ENABLE; | ||
149 | jz4740_timer_set_ctrl(pwm->id, ctrl); | ||
150 | jz4740_timer_enable(pwm->id); | ||
151 | |||
152 | return 0; | ||
153 | } | ||
154 | |||
155 | void pwm_disable(struct pwm_device *pwm) | ||
156 | { | ||
157 | uint32_t ctrl = jz4740_timer_get_ctrl(pwm->id); | ||
158 | |||
159 | ctrl &= ~JZ_TIMER_CTRL_PWM_ENABLE; | ||
160 | jz4740_timer_disable(pwm->id); | ||
161 | jz4740_timer_set_ctrl(pwm->id, ctrl); | ||
162 | } | ||
163 | |||
164 | static int __init jz4740_pwm_init(void) | ||
165 | { | ||
166 | int ret = 0; | ||
167 | |||
168 | jz4740_pwm_clk = clk_get(NULL, "ext"); | ||
169 | |||
170 | if (IS_ERR(jz4740_pwm_clk)) { | ||
171 | ret = PTR_ERR(jz4740_pwm_clk); | ||
172 | jz4740_pwm_clk = NULL; | ||
173 | } | ||
174 | |||
175 | return ret; | ||
176 | } | ||
177 | subsys_initcall(jz4740_pwm_init); | ||
diff --git a/arch/mips/jz4740/timer.h b/arch/mips/jz4740/timer.h new file mode 100644 index 00000000000..fca3994f2e6 --- /dev/null +++ b/arch/mips/jz4740/timer.h | |||
@@ -0,0 +1,136 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2010, Lars-Peter Clausen <lars@metafoo.de> | ||
3 | * JZ4740 platform timer support | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms of the GNU General Public License as published by the | ||
7 | * Free Software Foundation; either version 2 of the License, or (at your | ||
8 | * option) any later version. | ||
9 | * | ||
10 | * You should have received a copy of the GNU General Public License along | ||
11 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
12 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
13 | * | ||
14 | */ | ||
15 | |||
16 | #ifndef __MIPS_JZ4740_TIMER_H__ | ||
17 | #define __MIPS_JZ4740_TIMER_H__ | ||
18 | |||
19 | #include <linux/module.h> | ||
20 | #include <linux/io.h> | ||
21 | |||
22 | #define JZ_REG_TIMER_STOP 0x0C | ||
23 | #define JZ_REG_TIMER_STOP_SET 0x1C | ||
24 | #define JZ_REG_TIMER_STOP_CLEAR 0x2C | ||
25 | #define JZ_REG_TIMER_ENABLE 0x00 | ||
26 | #define JZ_REG_TIMER_ENABLE_SET 0x04 | ||
27 | #define JZ_REG_TIMER_ENABLE_CLEAR 0x08 | ||
28 | #define JZ_REG_TIMER_FLAG 0x10 | ||
29 | #define JZ_REG_TIMER_FLAG_SET 0x14 | ||
30 | #define JZ_REG_TIMER_FLAG_CLEAR 0x18 | ||
31 | #define JZ_REG_TIMER_MASK 0x20 | ||
32 | #define JZ_REG_TIMER_MASK_SET 0x24 | ||
33 | #define JZ_REG_TIMER_MASK_CLEAR 0x28 | ||
34 | |||
35 | #define JZ_REG_TIMER_DFR(x) (((x) * 0x10) + 0x30) | ||
36 | #define JZ_REG_TIMER_DHR(x) (((x) * 0x10) + 0x34) | ||
37 | #define JZ_REG_TIMER_CNT(x) (((x) * 0x10) + 0x38) | ||
38 | #define JZ_REG_TIMER_CTRL(x) (((x) * 0x10) + 0x3C) | ||
39 | |||
40 | #define JZ_TIMER_IRQ_HALF(x) BIT((x) + 0x10) | ||
41 | #define JZ_TIMER_IRQ_FULL(x) BIT(x) | ||
42 | |||
43 | #define JZ_TIMER_CTRL_PWM_ABBRUPT_SHUTDOWN BIT(9) | ||
44 | #define JZ_TIMER_CTRL_PWM_ACTIVE_LOW BIT(8) | ||
45 | #define JZ_TIMER_CTRL_PWM_ENABLE BIT(7) | ||
46 | #define JZ_TIMER_CTRL_PRESCALE_MASK 0x1c | ||
47 | #define JZ_TIMER_CTRL_PRESCALE_OFFSET 0x3 | ||
48 | #define JZ_TIMER_CTRL_PRESCALE_1 (0 << 3) | ||
49 | #define JZ_TIMER_CTRL_PRESCALE_4 (1 << 3) | ||
50 | #define JZ_TIMER_CTRL_PRESCALE_16 (2 << 3) | ||
51 | #define JZ_TIMER_CTRL_PRESCALE_64 (3 << 3) | ||
52 | #define JZ_TIMER_CTRL_PRESCALE_256 (4 << 3) | ||
53 | #define JZ_TIMER_CTRL_PRESCALE_1024 (5 << 3) | ||
54 | |||
55 | #define JZ_TIMER_CTRL_PRESCALER(x) ((x) << JZ_TIMER_CTRL_PRESCALE_OFFSET) | ||
56 | |||
57 | #define JZ_TIMER_CTRL_SRC_EXT BIT(2) | ||
58 | #define JZ_TIMER_CTRL_SRC_RTC BIT(1) | ||
59 | #define JZ_TIMER_CTRL_SRC_PCLK BIT(0) | ||
60 | |||
61 | extern void __iomem *jz4740_timer_base; | ||
62 | void __init jz4740_timer_init(void); | ||
63 | |||
64 | static inline void jz4740_timer_stop(unsigned int timer) | ||
65 | { | ||
66 | writel(BIT(timer), jz4740_timer_base + JZ_REG_TIMER_STOP_SET); | ||
67 | } | ||
68 | |||
69 | static inline void jz4740_timer_start(unsigned int timer) | ||
70 | { | ||
71 | writel(BIT(timer), jz4740_timer_base + JZ_REG_TIMER_STOP_CLEAR); | ||
72 | } | ||
73 | |||
74 | static inline bool jz4740_timer_is_enabled(unsigned int timer) | ||
75 | { | ||
76 | return readb(jz4740_timer_base + JZ_REG_TIMER_ENABLE) & BIT(timer); | ||
77 | } | ||
78 | |||
79 | static inline void jz4740_timer_enable(unsigned int timer) | ||
80 | { | ||
81 | writeb(BIT(timer), jz4740_timer_base + JZ_REG_TIMER_ENABLE_SET); | ||
82 | } | ||
83 | |||
84 | static inline void jz4740_timer_disable(unsigned int timer) | ||
85 | { | ||
86 | writeb(BIT(timer), jz4740_timer_base + JZ_REG_TIMER_ENABLE_CLEAR); | ||
87 | } | ||
88 | |||
89 | |||
90 | static inline void jz4740_timer_set_period(unsigned int timer, uint16_t period) | ||
91 | { | ||
92 | writew(period, jz4740_timer_base + JZ_REG_TIMER_DFR(timer)); | ||
93 | } | ||
94 | |||
95 | static inline void jz4740_timer_set_duty(unsigned int timer, uint16_t duty) | ||
96 | { | ||
97 | writew(duty, jz4740_timer_base + JZ_REG_TIMER_DHR(timer)); | ||
98 | } | ||
99 | |||
100 | static inline void jz4740_timer_set_count(unsigned int timer, uint16_t count) | ||
101 | { | ||
102 | writew(count, jz4740_timer_base + JZ_REG_TIMER_CNT(timer)); | ||
103 | } | ||
104 | |||
105 | static inline uint16_t jz4740_timer_get_count(unsigned int timer) | ||
106 | { | ||
107 | return readw(jz4740_timer_base + JZ_REG_TIMER_CNT(timer)); | ||
108 | } | ||
109 | |||
110 | static inline void jz4740_timer_ack_full(unsigned int timer) | ||
111 | { | ||
112 | writel(JZ_TIMER_IRQ_FULL(timer), jz4740_timer_base + JZ_REG_TIMER_FLAG_CLEAR); | ||
113 | } | ||
114 | |||
115 | static inline void jz4740_timer_irq_full_enable(unsigned int timer) | ||
116 | { | ||
117 | writel(JZ_TIMER_IRQ_FULL(timer), jz4740_timer_base + JZ_REG_TIMER_FLAG_CLEAR); | ||
118 | writel(JZ_TIMER_IRQ_FULL(timer), jz4740_timer_base + JZ_REG_TIMER_MASK_CLEAR); | ||
119 | } | ||
120 | |||
121 | static inline void jz4740_timer_irq_full_disable(unsigned int timer) | ||
122 | { | ||
123 | writel(JZ_TIMER_IRQ_FULL(timer), jz4740_timer_base + JZ_REG_TIMER_MASK_SET); | ||
124 | } | ||
125 | |||
126 | static inline void jz4740_timer_set_ctrl(unsigned int timer, uint16_t ctrl) | ||
127 | { | ||
128 | writew(ctrl, jz4740_timer_base + JZ_REG_TIMER_CTRL(timer)); | ||
129 | } | ||
130 | |||
131 | static inline uint16_t jz4740_timer_get_ctrl(unsigned int timer) | ||
132 | { | ||
133 | return readw(jz4740_timer_base + JZ_REG_TIMER_CTRL(timer)); | ||
134 | } | ||
135 | |||
136 | #endif | ||
diff --git a/arch/mips/kernel/cpufreq/loongson2_clock.c b/arch/mips/kernel/cpufreq/loongson2_clock.c new file mode 100644 index 00000000000..cefc6e259ba --- /dev/null +++ b/arch/mips/kernel/cpufreq/loongson2_clock.c | |||
@@ -0,0 +1,170 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2006 - 2008 Lemote Inc. & Insititute of Computing Technology | ||
3 | * Author: Yanhua, yanh@lemote.com | ||
4 | * | ||
5 | * This file is subject to the terms and conditions of the GNU General Public | ||
6 | * License. See the file "COPYING" in the main directory of this archive | ||
7 | * for more details. | ||
8 | */ | ||
9 | |||
10 | #include <linux/cpufreq.h> | ||
11 | #include <linux/platform_device.h> | ||
12 | |||
13 | #include <asm/clock.h> | ||
14 | |||
15 | #include <loongson.h> | ||
16 | |||
17 | static LIST_HEAD(clock_list); | ||
18 | static DEFINE_SPINLOCK(clock_lock); | ||
19 | static DEFINE_MUTEX(clock_list_sem); | ||
20 | |||
21 | /* Minimum CLK support */ | ||
22 | enum { | ||
23 | DC_ZERO, DC_25PT = 2, DC_37PT, DC_50PT, DC_62PT, DC_75PT, | ||
24 | DC_87PT, DC_DISABLE, DC_RESV | ||
25 | }; | ||
26 | |||
27 | struct cpufreq_frequency_table loongson2_clockmod_table[] = { | ||
28 | {DC_RESV, CPUFREQ_ENTRY_INVALID}, | ||
29 | {DC_ZERO, CPUFREQ_ENTRY_INVALID}, | ||
30 | {DC_25PT, 0}, | ||
31 | {DC_37PT, 0}, | ||
32 | {DC_50PT, 0}, | ||
33 | {DC_62PT, 0}, | ||
34 | {DC_75PT, 0}, | ||
35 | {DC_87PT, 0}, | ||
36 | {DC_DISABLE, 0}, | ||
37 | {DC_RESV, CPUFREQ_TABLE_END}, | ||
38 | }; | ||
39 | EXPORT_SYMBOL_GPL(loongson2_clockmod_table); | ||
40 | |||
41 | static struct clk cpu_clk = { | ||
42 | .name = "cpu_clk", | ||
43 | .flags = CLK_ALWAYS_ENABLED | CLK_RATE_PROPAGATES, | ||
44 | .rate = 800000000, | ||
45 | }; | ||
46 | |||
47 | struct clk *clk_get(struct device *dev, const char *id) | ||
48 | { | ||
49 | return &cpu_clk; | ||
50 | } | ||
51 | EXPORT_SYMBOL(clk_get); | ||
52 | |||
53 | static void propagate_rate(struct clk *clk) | ||
54 | { | ||
55 | struct clk *clkp; | ||
56 | |||
57 | list_for_each_entry(clkp, &clock_list, node) { | ||
58 | if (likely(clkp->parent != clk)) | ||
59 | continue; | ||
60 | if (likely(clkp->ops && clkp->ops->recalc)) | ||
61 | clkp->ops->recalc(clkp); | ||
62 | if (unlikely(clkp->flags & CLK_RATE_PROPAGATES)) | ||
63 | propagate_rate(clkp); | ||
64 | } | ||
65 | } | ||
66 | |||
67 | int clk_enable(struct clk *clk) | ||
68 | { | ||
69 | return 0; | ||
70 | } | ||
71 | EXPORT_SYMBOL(clk_enable); | ||
72 | |||
73 | void clk_disable(struct clk *clk) | ||
74 | { | ||
75 | } | ||
76 | EXPORT_SYMBOL(clk_disable); | ||
77 | |||
78 | unsigned long clk_get_rate(struct clk *clk) | ||
79 | { | ||
80 | return (unsigned long)clk->rate; | ||
81 | } | ||
82 | EXPORT_SYMBOL(clk_get_rate); | ||
83 | |||
84 | void clk_put(struct clk *clk) | ||
85 | { | ||
86 | } | ||
87 | EXPORT_SYMBOL(clk_put); | ||
88 | |||
89 | int clk_set_rate(struct clk *clk, unsigned long rate) | ||
90 | { | ||
91 | return clk_set_rate_ex(clk, rate, 0); | ||
92 | } | ||
93 | EXPORT_SYMBOL_GPL(clk_set_rate); | ||
94 | |||
95 | int clk_set_rate_ex(struct clk *clk, unsigned long rate, int algo_id) | ||
96 | { | ||
97 | int ret = 0; | ||
98 | int regval; | ||
99 | int i; | ||
100 | |||
101 | if (likely(clk->ops && clk->ops->set_rate)) { | ||
102 | unsigned long flags; | ||
103 | |||
104 | spin_lock_irqsave(&clock_lock, flags); | ||
105 | ret = clk->ops->set_rate(clk, rate, algo_id); | ||
106 | spin_unlock_irqrestore(&clock_lock, flags); | ||
107 | } | ||
108 | |||
109 | if (unlikely(clk->flags & CLK_RATE_PROPAGATES)) | ||
110 | propagate_rate(clk); | ||
111 | |||
112 | for (i = 0; loongson2_clockmod_table[i].frequency != CPUFREQ_TABLE_END; | ||
113 | i++) { | ||
114 | if (loongson2_clockmod_table[i].frequency == | ||
115 | CPUFREQ_ENTRY_INVALID) | ||
116 | continue; | ||
117 | if (rate == loongson2_clockmod_table[i].frequency) | ||
118 | break; | ||
119 | } | ||
120 | if (rate != loongson2_clockmod_table[i].frequency) | ||
121 | return -ENOTSUPP; | ||
122 | |||
123 | clk->rate = rate; | ||
124 | |||
125 | regval = LOONGSON_CHIPCFG0; | ||
126 | regval = (regval & ~0x7) | (loongson2_clockmod_table[i].index - 1); | ||
127 | LOONGSON_CHIPCFG0 = regval; | ||
128 | |||
129 | return ret; | ||
130 | } | ||
131 | EXPORT_SYMBOL_GPL(clk_set_rate_ex); | ||
132 | |||
133 | long clk_round_rate(struct clk *clk, unsigned long rate) | ||
134 | { | ||
135 | if (likely(clk->ops && clk->ops->round_rate)) { | ||
136 | unsigned long flags, rounded; | ||
137 | |||
138 | spin_lock_irqsave(&clock_lock, flags); | ||
139 | rounded = clk->ops->round_rate(clk, rate); | ||
140 | spin_unlock_irqrestore(&clock_lock, flags); | ||
141 | |||
142 | return rounded; | ||
143 | } | ||
144 | |||
145 | return rate; | ||
146 | } | ||
147 | EXPORT_SYMBOL_GPL(clk_round_rate); | ||
148 | |||
149 | /* | ||
150 | * This is the simple version of Loongson-2 wait, Maybe we need do this in | ||
151 | * interrupt disabled content | ||
152 | */ | ||
153 | |||
154 | DEFINE_SPINLOCK(loongson2_wait_lock); | ||
155 | void loongson2_cpu_wait(void) | ||
156 | { | ||
157 | u32 cpu_freq; | ||
158 | unsigned long flags; | ||
159 | |||
160 | spin_lock_irqsave(&loongson2_wait_lock, flags); | ||
161 | cpu_freq = LOONGSON_CHIPCFG0; | ||
162 | LOONGSON_CHIPCFG0 &= ~0x7; /* Put CPU into wait mode */ | ||
163 | LOONGSON_CHIPCFG0 = cpu_freq; /* Restore CPU state */ | ||
164 | spin_unlock_irqrestore(&loongson2_wait_lock, flags); | ||
165 | } | ||
166 | EXPORT_SYMBOL_GPL(loongson2_cpu_wait); | ||
167 | |||
168 | MODULE_AUTHOR("Yanhua <yanh@lemote.com>"); | ||
169 | MODULE_DESCRIPTION("cpufreq driver for Loongson 2F"); | ||
170 | MODULE_LICENSE("GPL"); | ||
diff --git a/arch/mips/kernel/init_task.c b/arch/mips/kernel/init_task.c new file mode 100644 index 00000000000..6d6ca530589 --- /dev/null +++ b/arch/mips/kernel/init_task.c | |||
@@ -0,0 +1,35 @@ | |||
1 | #include <linux/mm.h> | ||
2 | #include <linux/module.h> | ||
3 | #include <linux/sched.h> | ||
4 | #include <linux/init_task.h> | ||
5 | #include <linux/fs.h> | ||
6 | #include <linux/mqueue.h> | ||
7 | |||
8 | #include <asm/thread_info.h> | ||
9 | #include <asm/uaccess.h> | ||
10 | #include <asm/pgtable.h> | ||
11 | |||
12 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); | ||
13 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); | ||
14 | /* | ||
15 | * Initial thread structure. | ||
16 | * | ||
17 | * We need to make sure that this is 8192-byte aligned due to the | ||
18 | * way process stacks are handled. This is done by making sure | ||
19 | * the linker maps this in the .text segment right after head.S, | ||
20 | * and making head.S ensure the proper alignment. | ||
21 | * | ||
22 | * The things we do for performance.. | ||
23 | */ | ||
24 | union thread_union init_thread_union __init_task_data | ||
25 | __attribute__((__aligned__(THREAD_SIZE))) = | ||
26 | { INIT_THREAD_INFO(init_task) }; | ||
27 | |||
28 | /* | ||
29 | * Initial task structure. | ||
30 | * | ||
31 | * All other task structs will be allocated on slabs in fork.c | ||
32 | */ | ||
33 | struct task_struct init_task = INIT_TASK(init_task); | ||
34 | |||
35 | EXPORT_SYMBOL(init_task); | ||
diff --git a/arch/mips/kernel/irq-rm9000.c b/arch/mips/kernel/irq-rm9000.c new file mode 100644 index 00000000000..38874a4b925 --- /dev/null +++ b/arch/mips/kernel/irq-rm9000.c | |||
@@ -0,0 +1,107 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2003 Ralf Baechle | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify it | ||
5 | * under the terms of the GNU General Public License as published by the | ||
6 | * Free Software Foundation; either version 2 of the License, or (at your | ||
7 | * option) any later version. | ||
8 | * | ||
9 | * Handler for RM9000 extended interrupts. These are a non-standard | ||
10 | * feature so we handle them separately from standard interrupts. | ||
11 | */ | ||
12 | #include <linux/init.h> | ||
13 | #include <linux/interrupt.h> | ||
14 | #include <linux/irq.h> | ||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/module.h> | ||
17 | |||
18 | #include <asm/irq_cpu.h> | ||
19 | #include <asm/mipsregs.h> | ||
20 | #include <asm/system.h> | ||
21 | |||
22 | static inline void unmask_rm9k_irq(struct irq_data *d) | ||
23 | { | ||
24 | set_c0_intcontrol(0x1000 << (d->irq - RM9K_CPU_IRQ_BASE)); | ||
25 | } | ||
26 | |||
27 | static inline void mask_rm9k_irq(struct irq_data *d) | ||
28 | { | ||
29 | clear_c0_intcontrol(0x1000 << (d->irq - RM9K_CPU_IRQ_BASE)); | ||
30 | } | ||
31 | |||
32 | static inline void rm9k_cpu_irq_enable(struct irq_data *d) | ||
33 | { | ||
34 | unsigned long flags; | ||
35 | |||
36 | local_irq_save(flags); | ||
37 | unmask_rm9k_irq(d); | ||
38 | local_irq_restore(flags); | ||
39 | } | ||
40 | |||
41 | /* | ||
42 | * Performance counter interrupts are global on all processors. | ||
43 | */ | ||
44 | static void local_rm9k_perfcounter_irq_startup(void *args) | ||
45 | { | ||
46 | rm9k_cpu_irq_enable(args); | ||
47 | } | ||
48 | |||
49 | static unsigned int rm9k_perfcounter_irq_startup(struct irq_data *d) | ||
50 | { | ||
51 | on_each_cpu(local_rm9k_perfcounter_irq_startup, d, 1); | ||
52 | |||
53 | return 0; | ||
54 | } | ||
55 | |||
56 | static void local_rm9k_perfcounter_irq_shutdown(void *args) | ||
57 | { | ||
58 | unsigned long flags; | ||
59 | |||
60 | local_irq_save(flags); | ||
61 | mask_rm9k_irq(args); | ||
62 | local_irq_restore(flags); | ||
63 | } | ||
64 | |||
65 | static void rm9k_perfcounter_irq_shutdown(struct irq_data *d) | ||
66 | { | ||
67 | on_each_cpu(local_rm9k_perfcounter_irq_shutdown, d, 1); | ||
68 | } | ||
69 | |||
70 | static struct irq_chip rm9k_irq_controller = { | ||
71 | .name = "RM9000", | ||
72 | .irq_ack = mask_rm9k_irq, | ||
73 | .irq_mask = mask_rm9k_irq, | ||
74 | .irq_mask_ack = mask_rm9k_irq, | ||
75 | .irq_unmask = unmask_rm9k_irq, | ||
76 | .irq_eoi = unmask_rm9k_irq | ||
77 | }; | ||
78 | |||
79 | static struct irq_chip rm9k_perfcounter_irq = { | ||
80 | .name = "RM9000", | ||
81 | .irq_startup = rm9k_perfcounter_irq_startup, | ||
82 | .irq_shutdown = rm9k_perfcounter_irq_shutdown, | ||
83 | .irq_ack = mask_rm9k_irq, | ||
84 | .irq_mask = mask_rm9k_irq, | ||
85 | .irq_mask_ack = mask_rm9k_irq, | ||
86 | .irq_unmask = unmask_rm9k_irq, | ||
87 | }; | ||
88 | |||
89 | unsigned int rm9000_perfcount_irq; | ||
90 | |||
91 | EXPORT_SYMBOL(rm9000_perfcount_irq); | ||
92 | |||
93 | void __init rm9k_cpu_irq_init(void) | ||
94 | { | ||
95 | int base = RM9K_CPU_IRQ_BASE; | ||
96 | int i; | ||
97 | |||
98 | clear_c0_intcontrol(0x0000f000); /* Mask all */ | ||
99 | |||
100 | for (i = base; i < base + 4; i++) | ||
101 | irq_set_chip_and_handler(i, &rm9k_irq_controller, | ||
102 | handle_level_irq); | ||
103 | |||
104 | rm9000_perfcount_irq = base + 1; | ||
105 | irq_set_chip_and_handler(rm9000_perfcount_irq, &rm9k_perfcounter_irq, | ||
106 | handle_percpu_irq); | ||
107 | } | ||
diff --git a/arch/mips/kernel/kspd.c b/arch/mips/kernel/kspd.c new file mode 100644 index 00000000000..29811f04339 --- /dev/null +++ b/arch/mips/kernel/kspd.c | |||
@@ -0,0 +1,423 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2005 MIPS Technologies, Inc. All rights reserved. | ||
3 | * | ||
4 | * This program is free software; you can distribute it and/or modify it | ||
5 | * under the terms of the GNU General Public License (Version 2) as | ||
6 | * published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | ||
11 | * for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License along | ||
14 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
15 | * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. | ||
16 | * | ||
17 | */ | ||
18 | #include <linux/kernel.h> | ||
19 | #include <linux/module.h> | ||
20 | #include <linux/sched.h> | ||
21 | #include <linux/unistd.h> | ||
22 | #include <linux/file.h> | ||
23 | #include <linux/fdtable.h> | ||
24 | #include <linux/fs.h> | ||
25 | #include <linux/syscalls.h> | ||
26 | #include <linux/workqueue.h> | ||
27 | #include <linux/errno.h> | ||
28 | #include <linux/list.h> | ||
29 | |||
30 | #include <asm/vpe.h> | ||
31 | #include <asm/rtlx.h> | ||
32 | #include <asm/kspd.h> | ||
33 | |||
34 | static struct workqueue_struct *workqueue; | ||
35 | static struct work_struct work; | ||
36 | |||
37 | extern unsigned long cpu_khz; | ||
38 | |||
39 | struct mtsp_syscall { | ||
40 | int cmd; | ||
41 | unsigned char abi; | ||
42 | unsigned char size; | ||
43 | }; | ||
44 | |||
45 | struct mtsp_syscall_ret { | ||
46 | int retval; | ||
47 | int errno; | ||
48 | }; | ||
49 | |||
50 | struct mtsp_syscall_generic { | ||
51 | int arg0; | ||
52 | int arg1; | ||
53 | int arg2; | ||
54 | int arg3; | ||
55 | int arg4; | ||
56 | int arg5; | ||
57 | int arg6; | ||
58 | }; | ||
59 | |||
60 | static struct list_head kspd_notifylist; | ||
61 | static int sp_stopping; | ||
62 | |||
63 | /* these should match with those in the SDE kit */ | ||
64 | #define MTSP_SYSCALL_BASE 0 | ||
65 | #define MTSP_SYSCALL_EXIT (MTSP_SYSCALL_BASE + 0) | ||
66 | #define MTSP_SYSCALL_OPEN (MTSP_SYSCALL_BASE + 1) | ||
67 | #define MTSP_SYSCALL_READ (MTSP_SYSCALL_BASE + 2) | ||
68 | #define MTSP_SYSCALL_WRITE (MTSP_SYSCALL_BASE + 3) | ||
69 | #define MTSP_SYSCALL_CLOSE (MTSP_SYSCALL_BASE + 4) | ||
70 | #define MTSP_SYSCALL_LSEEK32 (MTSP_SYSCALL_BASE + 5) | ||
71 | #define MTSP_SYSCALL_ISATTY (MTSP_SYSCALL_BASE + 6) | ||
72 | #define MTSP_SYSCALL_GETTIME (MTSP_SYSCALL_BASE + 7) | ||
73 | #define MTSP_SYSCALL_PIPEFREQ (MTSP_SYSCALL_BASE + 8) | ||
74 | #define MTSP_SYSCALL_GETTOD (MTSP_SYSCALL_BASE + 9) | ||
75 | #define MTSP_SYSCALL_IOCTL (MTSP_SYSCALL_BASE + 10) | ||
76 | |||
77 | #define MTSP_O_RDONLY 0x0000 | ||
78 | #define MTSP_O_WRONLY 0x0001 | ||
79 | #define MTSP_O_RDWR 0x0002 | ||
80 | #define MTSP_O_NONBLOCK 0x0004 | ||
81 | #define MTSP_O_APPEND 0x0008 | ||
82 | #define MTSP_O_SHLOCK 0x0010 | ||
83 | #define MTSP_O_EXLOCK 0x0020 | ||
84 | #define MTSP_O_ASYNC 0x0040 | ||
85 | /* XXX: check which of these is actually O_SYNC vs O_DSYNC */ | ||
86 | #define MTSP_O_FSYNC O_SYNC | ||
87 | #define MTSP_O_NOFOLLOW 0x0100 | ||
88 | #define MTSP_O_SYNC 0x0080 | ||
89 | #define MTSP_O_CREAT 0x0200 | ||
90 | #define MTSP_O_TRUNC 0x0400 | ||
91 | #define MTSP_O_EXCL 0x0800 | ||
92 | #define MTSP_O_BINARY 0x8000 | ||
93 | |||
94 | extern int tclimit; | ||
95 | |||
96 | struct apsp_table { | ||
97 | int sp; | ||
98 | int ap; | ||
99 | }; | ||
100 | |||
101 | /* we might want to do the mode flags too */ | ||
102 | struct apsp_table open_flags_table[] = { | ||
103 | { MTSP_O_RDWR, O_RDWR }, | ||
104 | { MTSP_O_WRONLY, O_WRONLY }, | ||
105 | { MTSP_O_CREAT, O_CREAT }, | ||
106 | { MTSP_O_TRUNC, O_TRUNC }, | ||
107 | { MTSP_O_NONBLOCK, O_NONBLOCK }, | ||
108 | { MTSP_O_APPEND, O_APPEND }, | ||
109 | { MTSP_O_NOFOLLOW, O_NOFOLLOW } | ||
110 | }; | ||
111 | |||
112 | struct apsp_table syscall_command_table[] = { | ||
113 | { MTSP_SYSCALL_OPEN, __NR_open }, | ||
114 | { MTSP_SYSCALL_CLOSE, __NR_close }, | ||
115 | { MTSP_SYSCALL_READ, __NR_read }, | ||
116 | { MTSP_SYSCALL_WRITE, __NR_write }, | ||
117 | { MTSP_SYSCALL_LSEEK32, __NR_lseek }, | ||
118 | { MTSP_SYSCALL_IOCTL, __NR_ioctl } | ||
119 | }; | ||
120 | |||
121 | static int sp_syscall(int num, int arg0, int arg1, int arg2, int arg3) | ||
122 | { | ||
123 | register long int _num __asm__("$2") = num; | ||
124 | register long int _arg0 __asm__("$4") = arg0; | ||
125 | register long int _arg1 __asm__("$5") = arg1; | ||
126 | register long int _arg2 __asm__("$6") = arg2; | ||
127 | register long int _arg3 __asm__("$7") = arg3; | ||
128 | |||
129 | mm_segment_t old_fs; | ||
130 | |||
131 | old_fs = get_fs(); | ||
132 | set_fs(KERNEL_DS); | ||
133 | |||
134 | __asm__ __volatile__ ( | ||
135 | " syscall \n" | ||
136 | : "=r" (_num), "=r" (_arg3) | ||
137 | : "r" (_num), "r" (_arg0), "r" (_arg1), "r" (_arg2), "r" (_arg3)); | ||
138 | |||
139 | set_fs(old_fs); | ||
140 | |||
141 | /* $a3 is error flag */ | ||
142 | if (_arg3) | ||
143 | return -_num; | ||
144 | |||
145 | return _num; | ||
146 | } | ||
147 | |||
148 | static int translate_syscall_command(int cmd) | ||
149 | { | ||
150 | int i; | ||
151 | int ret = -1; | ||
152 | |||
153 | for (i = 0; i < ARRAY_SIZE(syscall_command_table); i++) { | ||
154 | if ((cmd == syscall_command_table[i].sp)) | ||
155 | return syscall_command_table[i].ap; | ||
156 | } | ||
157 | |||
158 | return ret; | ||
159 | } | ||
160 | |||
161 | static unsigned int translate_open_flags(int flags) | ||
162 | { | ||
163 | int i; | ||
164 | unsigned int ret = 0; | ||
165 | |||
166 | for (i = 0; i < ARRAY_SIZE(open_flags_table); i++) { | ||
167 | if( (flags & open_flags_table[i].sp) ) { | ||
168 | ret |= open_flags_table[i].ap; | ||
169 | } | ||
170 | } | ||
171 | |||
172 | return ret; | ||
173 | } | ||
174 | |||
175 | |||
176 | static int sp_setfsuidgid(uid_t uid, gid_t gid) | ||
177 | { | ||
178 | struct cred *new; | ||
179 | |||
180 | new = prepare_creds(); | ||
181 | if (!new) | ||
182 | return -ENOMEM; | ||
183 | |||
184 | new->fsuid = uid; | ||
185 | new->fsgid = gid; | ||
186 | |||
187 | commit_creds(new); | ||
188 | |||
189 | return 0; | ||
190 | } | ||
191 | |||
192 | /* | ||
193 | * Expects a request to be on the sysio channel. Reads it. Decides whether | ||
194 | * its a linux syscall and runs it, or whatever. Puts the return code back | ||
195 | * into the request and sends the whole thing back. | ||
196 | */ | ||
197 | void sp_work_handle_request(void) | ||
198 | { | ||
199 | struct mtsp_syscall sc; | ||
200 | struct mtsp_syscall_generic generic; | ||
201 | struct mtsp_syscall_ret ret; | ||
202 | struct kspd_notifications *n; | ||
203 | unsigned long written; | ||
204 | mm_segment_t old_fs; | ||
205 | struct timeval tv; | ||
206 | struct timezone tz; | ||
207 | int err, cmd; | ||
208 | |||
209 | char *vcwd; | ||
210 | int size; | ||
211 | |||
212 | ret.retval = -1; | ||
213 | |||
214 | old_fs = get_fs(); | ||
215 | set_fs(KERNEL_DS); | ||
216 | |||
217 | if (!rtlx_read(RTLX_CHANNEL_SYSIO, &sc, sizeof(struct mtsp_syscall))) { | ||
218 | set_fs(old_fs); | ||
219 | printk(KERN_ERR "Expected request but nothing to read\n"); | ||
220 | return; | ||
221 | } | ||
222 | |||
223 | size = sc.size; | ||
224 | |||
225 | if (size) { | ||
226 | if (!rtlx_read(RTLX_CHANNEL_SYSIO, &generic, size)) { | ||
227 | set_fs(old_fs); | ||
228 | printk(KERN_ERR "Expected request but nothing to read\n"); | ||
229 | return; | ||
230 | } | ||
231 | } | ||
232 | |||
233 | /* Run the syscall at the privilege of the user who loaded the | ||
234 | SP program */ | ||
235 | |||
236 | if (vpe_getuid(tclimit)) { | ||
237 | err = sp_setfsuidgid(vpe_getuid(tclimit), vpe_getgid(tclimit)); | ||
238 | if (!err) | ||
239 | pr_err("Change of creds failed\n"); | ||
240 | } | ||
241 | |||
242 | switch (sc.cmd) { | ||
243 | /* needs the flags argument translating from SDE kit to | ||
244 | linux */ | ||
245 | case MTSP_SYSCALL_PIPEFREQ: | ||
246 | ret.retval = cpu_khz * 1000; | ||
247 | ret.errno = 0; | ||
248 | break; | ||
249 | |||
250 | case MTSP_SYSCALL_GETTOD: | ||
251 | memset(&tz, 0, sizeof(tz)); | ||
252 | if ((ret.retval = sp_syscall(__NR_gettimeofday, (int)&tv, | ||
253 | (int)&tz, 0, 0)) == 0) | ||
254 | ret.retval = tv.tv_sec; | ||
255 | break; | ||
256 | |||
257 | case MTSP_SYSCALL_EXIT: | ||
258 | list_for_each_entry(n, &kspd_notifylist, list) | ||
259 | n->kspd_sp_exit(tclimit); | ||
260 | sp_stopping = 1; | ||
261 | |||
262 | printk(KERN_DEBUG "KSPD got exit syscall from SP exitcode %d\n", | ||
263 | generic.arg0); | ||
264 | break; | ||
265 | |||
266 | case MTSP_SYSCALL_OPEN: | ||
267 | generic.arg1 = translate_open_flags(generic.arg1); | ||
268 | |||
269 | vcwd = vpe_getcwd(tclimit); | ||
270 | |||
271 | /* change to cwd of the process that loaded the SP program */ | ||
272 | old_fs = get_fs(); | ||
273 | set_fs(KERNEL_DS); | ||
274 | sys_chdir(vcwd); | ||
275 | set_fs(old_fs); | ||
276 | |||
277 | sc.cmd = __NR_open; | ||
278 | |||
279 | /* fall through */ | ||
280 | |||
281 | default: | ||
282 | if ((sc.cmd >= __NR_Linux) && | ||
283 | (sc.cmd <= (__NR_Linux + __NR_Linux_syscalls)) ) | ||
284 | cmd = sc.cmd; | ||
285 | else | ||
286 | cmd = translate_syscall_command(sc.cmd); | ||
287 | |||
288 | if (cmd >= 0) { | ||
289 | ret.retval = sp_syscall(cmd, generic.arg0, generic.arg1, | ||
290 | generic.arg2, generic.arg3); | ||
291 | } else | ||
292 | printk(KERN_WARNING | ||
293 | "KSPD: Unknown SP syscall number %d\n", sc.cmd); | ||
294 | break; | ||
295 | } /* switch */ | ||
296 | |||
297 | if (vpe_getuid(tclimit)) { | ||
298 | err = sp_setfsuidgid(0, 0); | ||
299 | if (!err) | ||
300 | pr_err("restoring old creds failed\n"); | ||
301 | } | ||
302 | |||
303 | old_fs = get_fs(); | ||
304 | set_fs(KERNEL_DS); | ||
305 | written = rtlx_write(RTLX_CHANNEL_SYSIO, &ret, sizeof(ret)); | ||
306 | set_fs(old_fs); | ||
307 | if (written < sizeof(ret)) | ||
308 | printk("KSPD: sp_work_handle_request failed to send to SP\n"); | ||
309 | } | ||
310 | |||
311 | static void sp_cleanup(void) | ||
312 | { | ||
313 | struct files_struct *files = current->files; | ||
314 | int i, j; | ||
315 | struct fdtable *fdt; | ||
316 | |||
317 | j = 0; | ||
318 | |||
319 | /* | ||
320 | * It is safe to dereference the fd table without RCU or | ||
321 | * ->file_lock | ||
322 | */ | ||
323 | fdt = files_fdtable(files); | ||
324 | for (;;) { | ||
325 | unsigned long set; | ||
326 | i = j * __NFDBITS; | ||
327 | if (i >= fdt->max_fds) | ||
328 | break; | ||
329 | set = fdt->open_fds->fds_bits[j++]; | ||
330 | while (set) { | ||
331 | if (set & 1) { | ||
332 | struct file * file = xchg(&fdt->fd[i], NULL); | ||
333 | if (file) | ||
334 | filp_close(file, files); | ||
335 | } | ||
336 | i++; | ||
337 | set >>= 1; | ||
338 | } | ||
339 | } | ||
340 | |||
341 | /* Put daemon cwd back to root to avoid umount problems */ | ||
342 | sys_chdir("/"); | ||
343 | } | ||
344 | |||
345 | static int channel_open; | ||
346 | |||
347 | /* the work handler */ | ||
348 | static void sp_work(struct work_struct *unused) | ||
349 | { | ||
350 | if (!channel_open) { | ||
351 | if( rtlx_open(RTLX_CHANNEL_SYSIO, 1) != 0) { | ||
352 | printk("KSPD: unable to open sp channel\n"); | ||
353 | sp_stopping = 1; | ||
354 | } else { | ||
355 | channel_open++; | ||
356 | printk(KERN_DEBUG "KSPD: SP channel opened\n"); | ||
357 | } | ||
358 | } else { | ||
359 | /* wait for some data, allow it to sleep */ | ||
360 | rtlx_read_poll(RTLX_CHANNEL_SYSIO, 1); | ||
361 | |||
362 | /* Check we haven't been woken because we are stopping */ | ||
363 | if (!sp_stopping) | ||
364 | sp_work_handle_request(); | ||
365 | } | ||
366 | |||
367 | if (!sp_stopping) | ||
368 | queue_work(workqueue, &work); | ||
369 | else | ||
370 | sp_cleanup(); | ||
371 | } | ||
372 | |||
373 | static void startwork(int vpe) | ||
374 | { | ||
375 | sp_stopping = channel_open = 0; | ||
376 | |||
377 | if (workqueue == NULL) { | ||
378 | if ((workqueue = create_singlethread_workqueue("kspd")) == NULL) { | ||
379 | printk(KERN_ERR "unable to start kspd\n"); | ||
380 | return; | ||
381 | } | ||
382 | |||
383 | INIT_WORK(&work, sp_work); | ||
384 | } | ||
385 | |||
386 | queue_work(workqueue, &work); | ||
387 | } | ||
388 | |||
389 | static void stopwork(int vpe) | ||
390 | { | ||
391 | sp_stopping = 1; | ||
392 | |||
393 | printk(KERN_DEBUG "KSPD: SP stopping\n"); | ||
394 | } | ||
395 | |||
396 | void kspd_notify(struct kspd_notifications *notify) | ||
397 | { | ||
398 | list_add(¬ify->list, &kspd_notifylist); | ||
399 | } | ||
400 | |||
401 | static struct vpe_notifications notify; | ||
402 | static int kspd_module_init(void) | ||
403 | { | ||
404 | INIT_LIST_HEAD(&kspd_notifylist); | ||
405 | |||
406 | notify.start = startwork; | ||
407 | notify.stop = stopwork; | ||
408 | vpe_notify(tclimit, ¬ify); | ||
409 | |||
410 | return 0; | ||
411 | } | ||
412 | |||
413 | static void kspd_module_exit(void) | ||
414 | { | ||
415 | |||
416 | } | ||
417 | |||
418 | module_init(kspd_module_init); | ||
419 | module_exit(kspd_module_exit); | ||
420 | |||
421 | MODULE_DESCRIPTION("MIPS KSPD"); | ||
422 | MODULE_AUTHOR("Elizabeth Oldham, MIPS Technologies, Inc."); | ||
423 | MODULE_LICENSE("GPL"); | ||
diff --git a/arch/mips/lantiq/devices.c b/arch/mips/lantiq/devices.c new file mode 100644 index 00000000000..44a36771c81 --- /dev/null +++ b/arch/mips/lantiq/devices.c | |||
@@ -0,0 +1,120 @@ | |||
1 | /* | ||
2 | * This program is free software; you can redistribute it and/or modify it | ||
3 | * under the terms of the GNU General Public License version 2 as published | ||
4 | * by the Free Software Foundation. | ||
5 | * | ||
6 | * Copyright (C) 2010 John Crispin <blogic@openwrt.org> | ||
7 | */ | ||
8 | |||
9 | #include <linux/init.h> | ||
10 | #include <linux/module.h> | ||
11 | #include <linux/types.h> | ||
12 | #include <linux/string.h> | ||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/reboot.h> | ||
15 | #include <linux/platform_device.h> | ||
16 | #include <linux/leds.h> | ||
17 | #include <linux/etherdevice.h> | ||
18 | #include <linux/time.h> | ||
19 | #include <linux/io.h> | ||
20 | #include <linux/gpio.h> | ||
21 | |||
22 | #include <asm/bootinfo.h> | ||
23 | #include <asm/irq.h> | ||
24 | |||
25 | #include <lantiq_soc.h> | ||
26 | |||
27 | #include "devices.h" | ||
28 | |||
29 | /* nor flash */ | ||
30 | static struct resource ltq_nor_resource = { | ||
31 | .name = "nor", | ||
32 | .start = LTQ_FLASH_START, | ||
33 | .end = LTQ_FLASH_START + LTQ_FLASH_MAX - 1, | ||
34 | .flags = IORESOURCE_MEM, | ||
35 | }; | ||
36 | |||
37 | static struct platform_device ltq_nor = { | ||
38 | .name = "ltq_nor", | ||
39 | .resource = <q_nor_resource, | ||
40 | .num_resources = 1, | ||
41 | }; | ||
42 | |||
43 | void __init ltq_register_nor(struct physmap_flash_data *data) | ||
44 | { | ||
45 | ltq_nor.dev.platform_data = data; | ||
46 | platform_device_register(<q_nor); | ||
47 | } | ||
48 | |||
49 | /* watchdog */ | ||
50 | static struct resource ltq_wdt_resource = { | ||
51 | .name = "watchdog", | ||
52 | .start = LTQ_WDT_BASE_ADDR, | ||
53 | .end = LTQ_WDT_BASE_ADDR + LTQ_WDT_SIZE - 1, | ||
54 | .flags = IORESOURCE_MEM, | ||
55 | }; | ||
56 | |||
57 | void __init ltq_register_wdt(void) | ||
58 | { | ||
59 | platform_device_register_simple("ltq_wdt", 0, <q_wdt_resource, 1); | ||
60 | } | ||
61 | |||
62 | /* asc ports */ | ||
63 | static struct resource ltq_asc0_resources[] = { | ||
64 | { | ||
65 | .name = "asc0", | ||
66 | .start = LTQ_ASC0_BASE_ADDR, | ||
67 | .end = LTQ_ASC0_BASE_ADDR + LTQ_ASC_SIZE - 1, | ||
68 | .flags = IORESOURCE_MEM, | ||
69 | }, | ||
70 | IRQ_RES(tx, LTQ_ASC_TIR(0)), | ||
71 | IRQ_RES(rx, LTQ_ASC_RIR(0)), | ||
72 | IRQ_RES(err, LTQ_ASC_EIR(0)), | ||
73 | }; | ||
74 | |||
75 | static struct resource ltq_asc1_resources[] = { | ||
76 | { | ||
77 | .name = "asc1", | ||
78 | .start = LTQ_ASC1_BASE_ADDR, | ||
79 | .end = LTQ_ASC1_BASE_ADDR + LTQ_ASC_SIZE - 1, | ||
80 | .flags = IORESOURCE_MEM, | ||
81 | }, | ||
82 | IRQ_RES(tx, LTQ_ASC_TIR(1)), | ||
83 | IRQ_RES(rx, LTQ_ASC_RIR(1)), | ||
84 | IRQ_RES(err, LTQ_ASC_EIR(1)), | ||
85 | }; | ||
86 | |||
87 | void __init ltq_register_asc(int port) | ||
88 | { | ||
89 | switch (port) { | ||
90 | case 0: | ||
91 | platform_device_register_simple("ltq_asc", 0, | ||
92 | ltq_asc0_resources, ARRAY_SIZE(ltq_asc0_resources)); | ||
93 | break; | ||
94 | case 1: | ||
95 | platform_device_register_simple("ltq_asc", 1, | ||
96 | ltq_asc1_resources, ARRAY_SIZE(ltq_asc1_resources)); | ||
97 | break; | ||
98 | default: | ||
99 | break; | ||
100 | } | ||
101 | } | ||
102 | |||
103 | #ifdef CONFIG_PCI | ||
104 | /* pci */ | ||
105 | static struct platform_device ltq_pci = { | ||
106 | .name = "ltq_pci", | ||
107 | .num_resources = 0, | ||
108 | }; | ||
109 | |||
110 | void __init ltq_register_pci(struct ltq_pci_data *data) | ||
111 | { | ||
112 | ltq_pci.dev.platform_data = data; | ||
113 | platform_device_register(<q_pci); | ||
114 | } | ||
115 | #else | ||
116 | void __init ltq_register_pci(struct ltq_pci_data *data) | ||
117 | { | ||
118 | pr_err("kernel is compiled without PCI support\n"); | ||
119 | } | ||
120 | #endif | ||
diff --git a/arch/mips/lantiq/devices.h b/arch/mips/lantiq/devices.h new file mode 100644 index 00000000000..2947bb19a52 --- /dev/null +++ b/arch/mips/lantiq/devices.h | |||
@@ -0,0 +1,23 @@ | |||
1 | /* | ||
2 | * This program is free software; you can redistribute it and/or modify it | ||
3 | * under the terms of the GNU General Public License version 2 as published | ||
4 | * by the Free Software Foundation. | ||
5 | * | ||
6 | * Copyright (C) 2010 John Crispin <blogic@openwrt.org> | ||
7 | */ | ||
8 | |||
9 | #ifndef _LTQ_DEVICES_H__ | ||
10 | #define _LTQ_DEVICES_H__ | ||
11 | |||
12 | #include <lantiq_platform.h> | ||
13 | #include <linux/mtd/physmap.h> | ||
14 | |||
15 | #define IRQ_RES(resname, irq) \ | ||
16 | {.name = #resname, .start = (irq), .flags = IORESOURCE_IRQ} | ||
17 | |||
18 | extern void ltq_register_nor(struct physmap_flash_data *data); | ||
19 | extern void ltq_register_wdt(void); | ||
20 | extern void ltq_register_asc(int port); | ||
21 | extern void ltq_register_pci(struct ltq_pci_data *data); | ||
22 | |||
23 | #endif | ||
diff --git a/arch/mips/lantiq/machtypes.h b/arch/mips/lantiq/machtypes.h new file mode 100644 index 00000000000..7e01b8c484e --- /dev/null +++ b/arch/mips/lantiq/machtypes.h | |||
@@ -0,0 +1,20 @@ | |||
1 | /* | ||
2 | * This program is free software; you can redistribute it and/or modify it | ||
3 | * under the terms of the GNU General Public License version 2 as published | ||
4 | * by the Free Software Foundation. | ||
5 | * | ||
6 | * Copyright (C) 2010 John Crispin <blogic@openwrt.org> | ||
7 | */ | ||
8 | |||
9 | #ifndef _LANTIQ_MACH_H__ | ||
10 | #define _LANTIQ_MACH_H__ | ||
11 | |||
12 | #include <asm/mips_machine.h> | ||
13 | |||
14 | enum lantiq_mach_type { | ||
15 | LTQ_MACH_GENERIC = 0, | ||
16 | LTQ_MACH_EASY50712, /* Danube evaluation board */ | ||
17 | LTQ_MACH_EASY50601, /* Amazon SE evaluation board */ | ||
18 | }; | ||
19 | |||
20 | #endif | ||
diff --git a/arch/mips/lantiq/setup.c b/arch/mips/lantiq/setup.c new file mode 100644 index 00000000000..9b8af77ed0f --- /dev/null +++ b/arch/mips/lantiq/setup.c | |||
@@ -0,0 +1,66 @@ | |||
1 | /* | ||
2 | * This program is free software; you can redistribute it and/or modify it | ||
3 | * under the terms of the GNU General Public License version 2 as published | ||
4 | * by the Free Software Foundation. | ||
5 | * | ||
6 | * Copyright (C) 2010 John Crispin <blogic@openwrt.org> | ||
7 | */ | ||
8 | |||
9 | #include <linux/kernel.h> | ||
10 | #include <linux/module.h> | ||
11 | #include <linux/io.h> | ||
12 | #include <linux/ioport.h> | ||
13 | #include <asm/bootinfo.h> | ||
14 | |||
15 | #include <lantiq_soc.h> | ||
16 | |||
17 | #include "machtypes.h" | ||
18 | #include "devices.h" | ||
19 | #include "prom.h" | ||
20 | |||
21 | void __init plat_mem_setup(void) | ||
22 | { | ||
23 | /* assume 16M as default incase uboot fails to pass proper ramsize */ | ||
24 | unsigned long memsize = 16; | ||
25 | char **envp = (char **) KSEG1ADDR(fw_arg2); | ||
26 | |||
27 | ioport_resource.start = IOPORT_RESOURCE_START; | ||
28 | ioport_resource.end = IOPORT_RESOURCE_END; | ||
29 | iomem_resource.start = IOMEM_RESOURCE_START; | ||
30 | iomem_resource.end = IOMEM_RESOURCE_END; | ||
31 | |||
32 | set_io_port_base((unsigned long) KSEG1); | ||
33 | |||
34 | while (*envp) { | ||
35 | char *e = (char *)KSEG1ADDR(*envp); | ||
36 | if (!strncmp(e, "memsize=", 8)) { | ||
37 | e += 8; | ||
38 | if (strict_strtoul(e, 0, &memsize)) | ||
39 | pr_warn("bad memsize specified\n"); | ||
40 | } | ||
41 | envp++; | ||
42 | } | ||
43 | memsize *= 1024 * 1024; | ||
44 | add_memory_region(0x00000000, memsize, BOOT_MEM_RAM); | ||
45 | } | ||
46 | |||
47 | static int __init | ||
48 | lantiq_setup(void) | ||
49 | { | ||
50 | ltq_soc_setup(); | ||
51 | mips_machine_setup(); | ||
52 | return 0; | ||
53 | } | ||
54 | |||
55 | arch_initcall(lantiq_setup); | ||
56 | |||
57 | static void __init | ||
58 | lantiq_generic_init(void) | ||
59 | { | ||
60 | /* Nothing to do */ | ||
61 | } | ||
62 | |||
63 | MIPS_MACHINE(LTQ_MACH_GENERIC, | ||
64 | "Generic", | ||
65 | "Generic Lantiq based board", | ||
66 | lantiq_generic_init); | ||
diff --git a/arch/mips/lantiq/xway/Kconfig b/arch/mips/lantiq/xway/Kconfig new file mode 100644 index 00000000000..2b857de3662 --- /dev/null +++ b/arch/mips/lantiq/xway/Kconfig | |||
@@ -0,0 +1,23 @@ | |||
1 | if SOC_XWAY | ||
2 | |||
3 | menu "MIPS Machine" | ||
4 | |||
5 | config LANTIQ_MACH_EASY50712 | ||
6 | bool "Easy50712 - Danube" | ||
7 | default y | ||
8 | |||
9 | endmenu | ||
10 | |||
11 | endif | ||
12 | |||
13 | if SOC_AMAZON_SE | ||
14 | |||
15 | menu "MIPS Machine" | ||
16 | |||
17 | config LANTIQ_MACH_EASY50601 | ||
18 | bool "Easy50601 - Amazon SE" | ||
19 | default y | ||
20 | |||
21 | endmenu | ||
22 | |||
23 | endif | ||
diff --git a/arch/mips/lantiq/xway/clk-ase.c b/arch/mips/lantiq/xway/clk-ase.c new file mode 100644 index 00000000000..22d823acd53 --- /dev/null +++ b/arch/mips/lantiq/xway/clk-ase.c | |||
@@ -0,0 +1,48 @@ | |||
1 | /* | ||
2 | * This program is free software; you can redistribute it and/or modify it | ||
3 | * under the terms of the GNU General Public License version 2 as published | ||
4 | * by the Free Software Foundation. | ||
5 | * | ||
6 | * Copyright (C) 2011 John Crispin <blogic@openwrt.org> | ||
7 | */ | ||
8 | |||
9 | #include <linux/io.h> | ||
10 | #include <linux/module.h> | ||
11 | #include <linux/init.h> | ||
12 | #include <linux/clk.h> | ||
13 | |||
14 | #include <asm/time.h> | ||
15 | #include <asm/irq.h> | ||
16 | #include <asm/div64.h> | ||
17 | |||
18 | #include <lantiq_soc.h> | ||
19 | |||
20 | /* cgu registers */ | ||
21 | #define LTQ_CGU_SYS 0x0010 | ||
22 | |||
23 | unsigned int ltq_get_io_region_clock(void) | ||
24 | { | ||
25 | return CLOCK_133M; | ||
26 | } | ||
27 | EXPORT_SYMBOL(ltq_get_io_region_clock); | ||
28 | |||
29 | unsigned int ltq_get_fpi_bus_clock(int fpi) | ||
30 | { | ||
31 | return CLOCK_133M; | ||
32 | } | ||
33 | EXPORT_SYMBOL(ltq_get_fpi_bus_clock); | ||
34 | |||
35 | unsigned int ltq_get_cpu_hz(void) | ||
36 | { | ||
37 | if (ltq_cgu_r32(LTQ_CGU_SYS) & (1 << 5)) | ||
38 | return CLOCK_266M; | ||
39 | else | ||
40 | return CLOCK_133M; | ||
41 | } | ||
42 | EXPORT_SYMBOL(ltq_get_cpu_hz); | ||
43 | |||
44 | unsigned int ltq_get_fpi_hz(void) | ||
45 | { | ||
46 | return CLOCK_133M; | ||
47 | } | ||
48 | EXPORT_SYMBOL(ltq_get_fpi_hz); | ||
diff --git a/arch/mips/lantiq/xway/clk-xway.c b/arch/mips/lantiq/xway/clk-xway.c new file mode 100644 index 00000000000..ddd39593c58 --- /dev/null +++ b/arch/mips/lantiq/xway/clk-xway.c | |||
@@ -0,0 +1,223 @@ | |||
1 | /* | ||
2 | * This program is free software; you can redistribute it and/or modify it | ||
3 | * under the terms of the GNU General Public License version 2 as published | ||
4 | * by the Free Software Foundation. | ||
5 | * | ||
6 | * Copyright (C) 2010 John Crispin <blogic@openwrt.org> | ||
7 | */ | ||
8 | |||
9 | #include <linux/io.h> | ||
10 | #include <linux/module.h> | ||
11 | #include <linux/init.h> | ||
12 | #include <linux/clk.h> | ||
13 | |||
14 | #include <asm/time.h> | ||
15 | #include <asm/irq.h> | ||
16 | #include <asm/div64.h> | ||
17 | |||
18 | #include <lantiq_soc.h> | ||
19 | |||
20 | static unsigned int ltq_ram_clocks[] = { | ||
21 | CLOCK_167M, CLOCK_133M, CLOCK_111M, CLOCK_83M }; | ||
22 | #define DDR_HZ ltq_ram_clocks[ltq_cgu_r32(LTQ_CGU_SYS) & 0x3] | ||
23 | |||
24 | #define BASIC_FREQUENCY_1 35328000 | ||
25 | #define BASIC_FREQUENCY_2 36000000 | ||
26 | #define BASIS_REQUENCY_USB 12000000 | ||
27 | |||
28 | #define GET_BITS(x, msb, lsb) \ | ||
29 | (((x) & ((1 << ((msb) + 1)) - 1)) >> (lsb)) | ||
30 | |||
31 | #define LTQ_CGU_PLL0_CFG 0x0004 | ||
32 | #define LTQ_CGU_PLL1_CFG 0x0008 | ||
33 | #define LTQ_CGU_PLL2_CFG 0x000C | ||
34 | #define LTQ_CGU_SYS 0x0010 | ||
35 | #define LTQ_CGU_UPDATE 0x0014 | ||
36 | #define LTQ_CGU_IF_CLK 0x0018 | ||
37 | #define LTQ_CGU_OSC_CON 0x001C | ||
38 | #define LTQ_CGU_SMD 0x0020 | ||
39 | #define LTQ_CGU_CT1SR 0x0028 | ||
40 | #define LTQ_CGU_CT2SR 0x002C | ||
41 | #define LTQ_CGU_PCMCR 0x0030 | ||
42 | #define LTQ_CGU_PCI_CR 0x0034 | ||
43 | #define LTQ_CGU_PD_PC 0x0038 | ||
44 | #define LTQ_CGU_FMR 0x003C | ||
45 | |||
46 | #define CGU_PLL0_PHASE_DIVIDER_ENABLE \ | ||
47 | (ltq_cgu_r32(LTQ_CGU_PLL0_CFG) & (1 << 31)) | ||
48 | #define CGU_PLL0_BYPASS \ | ||
49 | (ltq_cgu_r32(LTQ_CGU_PLL0_CFG) & (1 << 30)) | ||
50 | #define CGU_PLL0_CFG_DSMSEL \ | ||
51 | (ltq_cgu_r32(LTQ_CGU_PLL0_CFG) & (1 << 28)) | ||
52 | #define CGU_PLL0_CFG_FRAC_EN \ | ||
53 | (ltq_cgu_r32(LTQ_CGU_PLL0_CFG) & (1 << 27)) | ||
54 | #define CGU_PLL1_SRC \ | ||
55 | (ltq_cgu_r32(LTQ_CGU_PLL1_CFG) & (1 << 31)) | ||
56 | #define CGU_PLL2_PHASE_DIVIDER_ENABLE \ | ||
57 | (ltq_cgu_r32(LTQ_CGU_PLL2_CFG) & (1 << 20)) | ||
58 | #define CGU_SYS_FPI_SEL (1 << 6) | ||
59 | #define CGU_SYS_DDR_SEL 0x3 | ||
60 | #define CGU_PLL0_SRC (1 << 29) | ||
61 | |||
62 | #define CGU_PLL0_CFG_PLLK GET_BITS(ltq_cgu_r32(LTQ_CGU_PLL0_CFG), 26, 17) | ||
63 | #define CGU_PLL0_CFG_PLLN GET_BITS(ltq_cgu_r32(LTQ_CGU_PLL0_CFG), 12, 6) | ||
64 | #define CGU_PLL0_CFG_PLLM GET_BITS(ltq_cgu_r32(LTQ_CGU_PLL0_CFG), 5, 2) | ||
65 | #define CGU_PLL2_SRC GET_BITS(ltq_cgu_r32(LTQ_CGU_PLL2_CFG), 18, 17) | ||
66 | #define CGU_PLL2_CFG_INPUT_DIV GET_BITS(ltq_cgu_r32(LTQ_CGU_PLL2_CFG), 16, 13) | ||
67 | |||
68 | static unsigned int ltq_get_pll0_fdiv(void); | ||
69 | |||
70 | static inline unsigned int get_input_clock(int pll) | ||
71 | { | ||
72 | switch (pll) { | ||
73 | case 0: | ||
74 | if (ltq_cgu_r32(LTQ_CGU_PLL0_CFG) & CGU_PLL0_SRC) | ||
75 | return BASIS_REQUENCY_USB; | ||
76 | else if (CGU_PLL0_PHASE_DIVIDER_ENABLE) | ||
77 | return BASIC_FREQUENCY_1; | ||
78 | else | ||
79 | return BASIC_FREQUENCY_2; | ||
80 | case 1: | ||
81 | if (CGU_PLL1_SRC) | ||
82 | return BASIS_REQUENCY_USB; | ||
83 | else if (CGU_PLL0_PHASE_DIVIDER_ENABLE) | ||
84 | return BASIC_FREQUENCY_1; | ||
85 | else | ||
86 | return BASIC_FREQUENCY_2; | ||
87 | case 2: | ||
88 | switch (CGU_PLL2_SRC) { | ||
89 | case 0: | ||
90 | return ltq_get_pll0_fdiv(); | ||
91 | case 1: | ||
92 | return CGU_PLL2_PHASE_DIVIDER_ENABLE ? | ||
93 | BASIC_FREQUENCY_1 : | ||
94 | BASIC_FREQUENCY_2; | ||
95 | case 2: | ||
96 | return BASIS_REQUENCY_USB; | ||
97 | } | ||
98 | default: | ||
99 | return 0; | ||
100 | } | ||
101 | } | ||
102 | |||
103 | static inline unsigned int cal_dsm(int pll, unsigned int num, unsigned int den) | ||
104 | { | ||
105 | u64 res, clock = get_input_clock(pll); | ||
106 | |||
107 | res = num * clock; | ||
108 | do_div(res, den); | ||
109 | return res; | ||
110 | } | ||
111 | |||
112 | static inline unsigned int mash_dsm(int pll, unsigned int M, unsigned int N, | ||
113 | unsigned int K) | ||
114 | { | ||
115 | unsigned int num = ((N + 1) << 10) + K; | ||
116 | unsigned int den = (M + 1) << 10; | ||
117 | |||
118 | return cal_dsm(pll, num, den); | ||
119 | } | ||
120 | |||
121 | static inline unsigned int ssff_dsm_1(int pll, unsigned int M, unsigned int N, | ||
122 | unsigned int K) | ||
123 | { | ||
124 | unsigned int num = ((N + 1) << 11) + K + 512; | ||
125 | unsigned int den = (M + 1) << 11; | ||
126 | |||
127 | return cal_dsm(pll, num, den); | ||
128 | } | ||
129 | |||
130 | static inline unsigned int ssff_dsm_2(int pll, unsigned int M, unsigned int N, | ||
131 | unsigned int K) | ||
132 | { | ||
133 | unsigned int num = K >= 512 ? | ||
134 | ((N + 1) << 12) + K - 512 : ((N + 1) << 12) + K + 3584; | ||
135 | unsigned int den = (M + 1) << 12; | ||
136 | |||
137 | return cal_dsm(pll, num, den); | ||
138 | } | ||
139 | |||
140 | static inline unsigned int dsm(int pll, unsigned int M, unsigned int N, | ||
141 | unsigned int K, unsigned int dsmsel, unsigned int phase_div_en) | ||
142 | { | ||
143 | if (!dsmsel) | ||
144 | return mash_dsm(pll, M, N, K); | ||
145 | else if (!phase_div_en) | ||
146 | return mash_dsm(pll, M, N, K); | ||
147 | else | ||
148 | return ssff_dsm_2(pll, M, N, K); | ||
149 | } | ||
150 | |||
151 | static inline unsigned int ltq_get_pll0_fosc(void) | ||
152 | { | ||
153 | if (CGU_PLL0_BYPASS) | ||
154 | return get_input_clock(0); | ||
155 | else | ||
156 | return !CGU_PLL0_CFG_FRAC_EN | ||
157 | ? dsm(0, CGU_PLL0_CFG_PLLM, CGU_PLL0_CFG_PLLN, 0, | ||
158 | CGU_PLL0_CFG_DSMSEL, | ||
159 | CGU_PLL0_PHASE_DIVIDER_ENABLE) | ||
160 | : dsm(0, CGU_PLL0_CFG_PLLM, CGU_PLL0_CFG_PLLN, | ||
161 | CGU_PLL0_CFG_PLLK, CGU_PLL0_CFG_DSMSEL, | ||
162 | CGU_PLL0_PHASE_DIVIDER_ENABLE); | ||
163 | } | ||
164 | |||
165 | static unsigned int ltq_get_pll0_fdiv(void) | ||
166 | { | ||
167 | unsigned int div = CGU_PLL2_CFG_INPUT_DIV + 1; | ||
168 | |||
169 | return (ltq_get_pll0_fosc() + (div >> 1)) / div; | ||
170 | } | ||
171 | |||
172 | unsigned int ltq_get_io_region_clock(void) | ||
173 | { | ||
174 | unsigned int ret = ltq_get_pll0_fosc(); | ||
175 | |||
176 | switch (ltq_cgu_r32(LTQ_CGU_PLL2_CFG) & CGU_SYS_DDR_SEL) { | ||
177 | default: | ||
178 | case 0: | ||
179 | return (ret + 1) / 2; | ||
180 | case 1: | ||
181 | return (ret * 2 + 2) / 5; | ||
182 | case 2: | ||
183 | return (ret + 1) / 3; | ||
184 | case 3: | ||
185 | return (ret + 2) / 4; | ||
186 | } | ||
187 | } | ||
188 | EXPORT_SYMBOL(ltq_get_io_region_clock); | ||
189 | |||
190 | unsigned int ltq_get_fpi_bus_clock(int fpi) | ||
191 | { | ||
192 | unsigned int ret = ltq_get_io_region_clock(); | ||
193 | |||
194 | if ((fpi == 2) && (ltq_cgu_r32(LTQ_CGU_SYS) & CGU_SYS_FPI_SEL)) | ||
195 | ret >>= 1; | ||
196 | return ret; | ||
197 | } | ||
198 | EXPORT_SYMBOL(ltq_get_fpi_bus_clock); | ||
199 | |||
200 | unsigned int ltq_get_cpu_hz(void) | ||
201 | { | ||
202 | switch (ltq_cgu_r32(LTQ_CGU_SYS) & 0xc) { | ||
203 | case 0: | ||
204 | return CLOCK_333M; | ||
205 | case 4: | ||
206 | return DDR_HZ; | ||
207 | case 8: | ||
208 | return DDR_HZ << 1; | ||
209 | default: | ||
210 | return DDR_HZ >> 1; | ||
211 | } | ||
212 | } | ||
213 | EXPORT_SYMBOL(ltq_get_cpu_hz); | ||
214 | |||
215 | unsigned int ltq_get_fpi_hz(void) | ||
216 | { | ||
217 | unsigned int ddr_clock = DDR_HZ; | ||
218 | |||
219 | if (ltq_cgu_r32(LTQ_CGU_SYS) & 0x40) | ||
220 | return ddr_clock >> 1; | ||
221 | return ddr_clock; | ||
222 | } | ||
223 | EXPORT_SYMBOL(ltq_get_fpi_hz); | ||
diff --git a/arch/mips/lantiq/xway/devices.c b/arch/mips/lantiq/xway/devices.c new file mode 100644 index 00000000000..d0e32ab2ea0 --- /dev/null +++ b/arch/mips/lantiq/xway/devices.c | |||
@@ -0,0 +1,119 @@ | |||
1 | /* | ||
2 | * This program is free software; you can redistribute it and/or modify it | ||
3 | * under the terms of the GNU General Public License version 2 as published | ||
4 | * by the Free Software Foundation. | ||
5 | * | ||
6 | * Copyright (C) 2010 John Crispin <blogic@openwrt.org> | ||
7 | */ | ||
8 | |||
9 | #include <linux/init.h> | ||
10 | #include <linux/module.h> | ||
11 | #include <linux/types.h> | ||
12 | #include <linux/string.h> | ||
13 | #include <linux/mtd/physmap.h> | ||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/reboot.h> | ||
16 | #include <linux/platform_device.h> | ||
17 | #include <linux/leds.h> | ||
18 | #include <linux/etherdevice.h> | ||
19 | #include <linux/time.h> | ||
20 | #include <linux/io.h> | ||
21 | #include <linux/gpio.h> | ||
22 | |||
23 | #include <asm/bootinfo.h> | ||
24 | #include <asm/irq.h> | ||
25 | |||
26 | #include <lantiq_soc.h> | ||
27 | #include <lantiq_irq.h> | ||
28 | #include <lantiq_platform.h> | ||
29 | |||
30 | #include "devices.h" | ||
31 | |||
32 | /* gpio */ | ||
33 | static struct resource ltq_gpio_resource[] = { | ||
34 | { | ||
35 | .name = "gpio0", | ||
36 | .start = LTQ_GPIO0_BASE_ADDR, | ||
37 | .end = LTQ_GPIO0_BASE_ADDR + LTQ_GPIO_SIZE - 1, | ||
38 | .flags = IORESOURCE_MEM, | ||
39 | }, { | ||
40 | .name = "gpio1", | ||
41 | .start = LTQ_GPIO1_BASE_ADDR, | ||
42 | .end = LTQ_GPIO1_BASE_ADDR + LTQ_GPIO_SIZE - 1, | ||
43 | .flags = IORESOURCE_MEM, | ||
44 | }, { | ||
45 | .name = "gpio2", | ||
46 | .start = LTQ_GPIO2_BASE_ADDR, | ||
47 | .end = LTQ_GPIO2_BASE_ADDR + LTQ_GPIO_SIZE - 1, | ||
48 | .flags = IORESOURCE_MEM, | ||
49 | } | ||
50 | }; | ||
51 | |||
52 | void __init ltq_register_gpio(void) | ||
53 | { | ||
54 | platform_device_register_simple("ltq_gpio", 0, | ||
55 | <q_gpio_resource[0], 1); | ||
56 | platform_device_register_simple("ltq_gpio", 1, | ||
57 | <q_gpio_resource[1], 1); | ||
58 | |||
59 | /* AR9 and VR9 have an extra gpio block */ | ||
60 | if (ltq_is_ar9() || ltq_is_vr9()) { | ||
61 | platform_device_register_simple("ltq_gpio", 2, | ||
62 | <q_gpio_resource[2], 1); | ||
63 | } | ||
64 | } | ||
65 | |||
66 | /* serial to parallel conversion */ | ||
67 | static struct resource ltq_stp_resource = { | ||
68 | .name = "stp", | ||
69 | .start = LTQ_STP_BASE_ADDR, | ||
70 | .end = LTQ_STP_BASE_ADDR + LTQ_STP_SIZE - 1, | ||
71 | .flags = IORESOURCE_MEM, | ||
72 | }; | ||
73 | |||
74 | void __init ltq_register_gpio_stp(void) | ||
75 | { | ||
76 | platform_device_register_simple("ltq_stp", 0, <q_stp_resource, 1); | ||
77 | } | ||
78 | |||
79 | /* asc ports - amazon se has its own serial mapping */ | ||
80 | static struct resource ltq_ase_asc_resources[] = { | ||
81 | { | ||
82 | .name = "asc0", | ||
83 | .start = LTQ_ASC1_BASE_ADDR, | ||
84 | .end = LTQ_ASC1_BASE_ADDR + LTQ_ASC_SIZE - 1, | ||
85 | .flags = IORESOURCE_MEM, | ||
86 | }, | ||
87 | IRQ_RES(tx, LTQ_ASC_ASE_TIR), | ||
88 | IRQ_RES(rx, LTQ_ASC_ASE_RIR), | ||
89 | IRQ_RES(err, LTQ_ASC_ASE_EIR), | ||
90 | }; | ||
91 | |||
92 | void __init ltq_register_ase_asc(void) | ||
93 | { | ||
94 | platform_device_register_simple("ltq_asc", 0, | ||
95 | ltq_ase_asc_resources, ARRAY_SIZE(ltq_ase_asc_resources)); | ||
96 | } | ||
97 | |||
98 | /* ethernet */ | ||
99 | static struct resource ltq_etop_resources = { | ||
100 | .name = "etop", | ||
101 | .start = LTQ_ETOP_BASE_ADDR, | ||
102 | .end = LTQ_ETOP_BASE_ADDR + LTQ_ETOP_SIZE - 1, | ||
103 | .flags = IORESOURCE_MEM, | ||
104 | }; | ||
105 | |||
106 | static struct platform_device ltq_etop = { | ||
107 | .name = "ltq_etop", | ||
108 | .resource = <q_etop_resources, | ||
109 | .num_resources = 1, | ||
110 | }; | ||
111 | |||
112 | void __init | ||
113 | ltq_register_etop(struct ltq_eth_data *eth) | ||
114 | { | ||
115 | if (eth) { | ||
116 | ltq_etop.dev.platform_data = eth; | ||
117 | platform_device_register(<q_etop); | ||
118 | } | ||
119 | } | ||
diff --git a/arch/mips/lantiq/xway/devices.h b/arch/mips/lantiq/xway/devices.h new file mode 100644 index 00000000000..e90493471bc --- /dev/null +++ b/arch/mips/lantiq/xway/devices.h | |||
@@ -0,0 +1,20 @@ | |||
1 | /* | ||
2 | * This program is free software; you can redistribute it and/or modify it | ||
3 | * under the terms of the GNU General Public License version 2 as published | ||
4 | * by the Free Software Foundation. | ||
5 | * | ||
6 | * Copyright (C) 2010 John Crispin <blogic@openwrt.org> | ||
7 | */ | ||
8 | |||
9 | #ifndef _LTQ_DEVICES_XWAY_H__ | ||
10 | #define _LTQ_DEVICES_XWAY_H__ | ||
11 | |||
12 | #include "../devices.h" | ||
13 | #include <linux/phy.h> | ||
14 | |||
15 | extern void ltq_register_gpio(void); | ||
16 | extern void ltq_register_gpio_stp(void); | ||
17 | extern void ltq_register_ase_asc(void); | ||
18 | extern void ltq_register_etop(struct ltq_eth_data *eth); | ||
19 | |||
20 | #endif | ||
diff --git a/arch/mips/lantiq/xway/ebu.c b/arch/mips/lantiq/xway/ebu.c new file mode 100644 index 00000000000..033b3184c7a --- /dev/null +++ b/arch/mips/lantiq/xway/ebu.c | |||
@@ -0,0 +1,52 @@ | |||
1 | /* | ||
2 | * This program is free software; you can redistribute it and/or modify it | ||
3 | * under the terms of the GNU General Public License version 2 as published | ||
4 | * by the Free Software Foundation. | ||
5 | * | ||
6 | * EBU - the external bus unit attaches PCI, NOR and NAND | ||
7 | * | ||
8 | * Copyright (C) 2010 John Crispin <blogic@openwrt.org> | ||
9 | */ | ||
10 | |||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/module.h> | ||
13 | #include <linux/ioport.h> | ||
14 | |||
15 | #include <lantiq_soc.h> | ||
16 | |||
17 | /* all access to the ebu must be locked */ | ||
18 | DEFINE_SPINLOCK(ebu_lock); | ||
19 | EXPORT_SYMBOL_GPL(ebu_lock); | ||
20 | |||
21 | static struct resource ltq_ebu_resource = { | ||
22 | .name = "ebu", | ||
23 | .start = LTQ_EBU_BASE_ADDR, | ||
24 | .end = LTQ_EBU_BASE_ADDR + LTQ_EBU_SIZE - 1, | ||
25 | .flags = IORESOURCE_MEM, | ||
26 | }; | ||
27 | |||
28 | /* remapped base addr of the clock unit and external bus unit */ | ||
29 | void __iomem *ltq_ebu_membase; | ||
30 | |||
31 | static int __init lantiq_ebu_init(void) | ||
32 | { | ||
33 | /* insert and request the memory region */ | ||
34 | if (insert_resource(&iomem_resource, <q_ebu_resource) < 0) | ||
35 | panic("Failed to insert ebu memory\n"); | ||
36 | |||
37 | if (request_mem_region(ltq_ebu_resource.start, | ||
38 | resource_size(<q_ebu_resource), "ebu") < 0) | ||
39 | panic("Failed to request ebu memory\n"); | ||
40 | |||
41 | /* remap ebu register range */ | ||
42 | ltq_ebu_membase = ioremap_nocache(ltq_ebu_resource.start, | ||
43 | resource_size(<q_ebu_resource)); | ||
44 | if (!ltq_ebu_membase) | ||
45 | panic("Failed to remap ebu memory\n"); | ||
46 | |||
47 | /* make sure to unprotect the memory region where flash is located */ | ||
48 | ltq_ebu_w32(ltq_ebu_r32(LTQ_EBU_BUSCON0) & ~EBU_WRDIS, LTQ_EBU_BUSCON0); | ||
49 | return 0; | ||
50 | } | ||
51 | |||
52 | postcore_initcall(lantiq_ebu_init); | ||
diff --git a/arch/mips/lantiq/xway/gpio.c b/arch/mips/lantiq/xway/gpio.c new file mode 100644 index 00000000000..a321451a545 --- /dev/null +++ b/arch/mips/lantiq/xway/gpio.c | |||
@@ -0,0 +1,195 @@ | |||
1 | /* | ||
2 | * This program is free software; you can redistribute it and/or modify it | ||
3 | * under the terms of the GNU General Public License version 2 as published | ||
4 | * by the Free Software Foundation. | ||
5 | * | ||
6 | * Copyright (C) 2010 John Crispin <blogic@openwrt.org> | ||
7 | */ | ||
8 | |||
9 | #include <linux/slab.h> | ||
10 | #include <linux/module.h> | ||
11 | #include <linux/platform_device.h> | ||
12 | #include <linux/gpio.h> | ||
13 | #include <linux/ioport.h> | ||
14 | #include <linux/io.h> | ||
15 | |||
16 | #include <lantiq_soc.h> | ||
17 | |||
18 | #define LTQ_GPIO_OUT 0x00 | ||
19 | #define LTQ_GPIO_IN 0x04 | ||
20 | #define LTQ_GPIO_DIR 0x08 | ||
21 | #define LTQ_GPIO_ALTSEL0 0x0C | ||
22 | #define LTQ_GPIO_ALTSEL1 0x10 | ||
23 | #define LTQ_GPIO_OD 0x14 | ||
24 | |||
25 | #define PINS_PER_PORT 16 | ||
26 | #define MAX_PORTS 3 | ||
27 | |||
28 | #define ltq_gpio_getbit(m, r, p) (!!(ltq_r32(m + r) & (1 << p))) | ||
29 | #define ltq_gpio_setbit(m, r, p) ltq_w32_mask(0, (1 << p), m + r) | ||
30 | #define ltq_gpio_clearbit(m, r, p) ltq_w32_mask((1 << p), 0, m + r) | ||
31 | |||
32 | struct ltq_gpio { | ||
33 | void __iomem *membase; | ||
34 | struct gpio_chip chip; | ||
35 | }; | ||
36 | |||
37 | static struct ltq_gpio ltq_gpio_port[MAX_PORTS]; | ||
38 | |||
39 | int gpio_to_irq(unsigned int gpio) | ||
40 | { | ||
41 | return -EINVAL; | ||
42 | } | ||
43 | EXPORT_SYMBOL(gpio_to_irq); | ||
44 | |||
45 | int irq_to_gpio(unsigned int gpio) | ||
46 | { | ||
47 | return -EINVAL; | ||
48 | } | ||
49 | EXPORT_SYMBOL(irq_to_gpio); | ||
50 | |||
51 | int ltq_gpio_request(unsigned int pin, unsigned int alt0, | ||
52 | unsigned int alt1, unsigned int dir, const char *name) | ||
53 | { | ||
54 | int id = 0; | ||
55 | |||
56 | if (pin >= (MAX_PORTS * PINS_PER_PORT)) | ||
57 | return -EINVAL; | ||
58 | if (gpio_request(pin, name)) { | ||
59 | pr_err("failed to setup lantiq gpio: %s\n", name); | ||
60 | return -EBUSY; | ||
61 | } | ||
62 | if (dir) | ||
63 | gpio_direction_output(pin, 1); | ||
64 | else | ||
65 | gpio_direction_input(pin); | ||
66 | while (pin >= PINS_PER_PORT) { | ||
67 | pin -= PINS_PER_PORT; | ||
68 | id++; | ||
69 | } | ||
70 | if (alt0) | ||
71 | ltq_gpio_setbit(ltq_gpio_port[id].membase, | ||
72 | LTQ_GPIO_ALTSEL0, pin); | ||
73 | else | ||
74 | ltq_gpio_clearbit(ltq_gpio_port[id].membase, | ||
75 | LTQ_GPIO_ALTSEL0, pin); | ||
76 | if (alt1) | ||
77 | ltq_gpio_setbit(ltq_gpio_port[id].membase, | ||
78 | LTQ_GPIO_ALTSEL1, pin); | ||
79 | else | ||
80 | ltq_gpio_clearbit(ltq_gpio_port[id].membase, | ||
81 | LTQ_GPIO_ALTSEL1, pin); | ||
82 | return 0; | ||
83 | } | ||
84 | EXPORT_SYMBOL(ltq_gpio_request); | ||
85 | |||
86 | static void ltq_gpio_set(struct gpio_chip *chip, unsigned int offset, int value) | ||
87 | { | ||
88 | struct ltq_gpio *ltq_gpio = container_of(chip, struct ltq_gpio, chip); | ||
89 | |||
90 | if (value) | ||
91 | ltq_gpio_setbit(ltq_gpio->membase, LTQ_GPIO_OUT, offset); | ||
92 | else | ||
93 | ltq_gpio_clearbit(ltq_gpio->membase, LTQ_GPIO_OUT, offset); | ||
94 | } | ||
95 | |||
96 | static int ltq_gpio_get(struct gpio_chip *chip, unsigned int offset) | ||
97 | { | ||
98 | struct ltq_gpio *ltq_gpio = container_of(chip, struct ltq_gpio, chip); | ||
99 | |||
100 | return ltq_gpio_getbit(ltq_gpio->membase, LTQ_GPIO_IN, offset); | ||
101 | } | ||
102 | |||
103 | static int ltq_gpio_direction_input(struct gpio_chip *chip, unsigned int offset) | ||
104 | { | ||
105 | struct ltq_gpio *ltq_gpio = container_of(chip, struct ltq_gpio, chip); | ||
106 | |||
107 | ltq_gpio_clearbit(ltq_gpio->membase, LTQ_GPIO_OD, offset); | ||
108 | ltq_gpio_clearbit(ltq_gpio->membase, LTQ_GPIO_DIR, offset); | ||
109 | |||
110 | return 0; | ||
111 | } | ||
112 | |||
113 | static int ltq_gpio_direction_output(struct gpio_chip *chip, | ||
114 | unsigned int offset, int value) | ||
115 | { | ||
116 | struct ltq_gpio *ltq_gpio = container_of(chip, struct ltq_gpio, chip); | ||
117 | |||
118 | ltq_gpio_setbit(ltq_gpio->membase, LTQ_GPIO_OD, offset); | ||
119 | ltq_gpio_setbit(ltq_gpio->membase, LTQ_GPIO_DIR, offset); | ||
120 | ltq_gpio_set(chip, offset, value); | ||
121 | |||
122 | return 0; | ||
123 | } | ||
124 | |||
125 | static int ltq_gpio_req(struct gpio_chip *chip, unsigned offset) | ||
126 | { | ||
127 | struct ltq_gpio *ltq_gpio = container_of(chip, struct ltq_gpio, chip); | ||
128 | |||
129 | ltq_gpio_clearbit(ltq_gpio->membase, LTQ_GPIO_ALTSEL0, offset); | ||
130 | ltq_gpio_clearbit(ltq_gpio->membase, LTQ_GPIO_ALTSEL1, offset); | ||
131 | return 0; | ||
132 | } | ||
133 | |||
134 | static int ltq_gpio_probe(struct platform_device *pdev) | ||
135 | { | ||
136 | struct resource *res; | ||
137 | |||
138 | if (pdev->id >= MAX_PORTS) { | ||
139 | dev_err(&pdev->dev, "invalid gpio port %d\n", | ||
140 | pdev->id); | ||
141 | return -EINVAL; | ||
142 | } | ||
143 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
144 | if (!res) { | ||
145 | dev_err(&pdev->dev, "failed to get memory for gpio port %d\n", | ||
146 | pdev->id); | ||
147 | return -ENOENT; | ||
148 | } | ||
149 | res = devm_request_mem_region(&pdev->dev, res->start, | ||
150 | resource_size(res), dev_name(&pdev->dev)); | ||
151 | if (!res) { | ||
152 | dev_err(&pdev->dev, | ||
153 | "failed to request memory for gpio port %d\n", | ||
154 | pdev->id); | ||
155 | return -EBUSY; | ||
156 | } | ||
157 | ltq_gpio_port[pdev->id].membase = devm_ioremap_nocache(&pdev->dev, | ||
158 | res->start, resource_size(res)); | ||
159 | if (!ltq_gpio_port[pdev->id].membase) { | ||
160 | dev_err(&pdev->dev, "failed to remap memory for gpio port %d\n", | ||
161 | pdev->id); | ||
162 | return -ENOMEM; | ||
163 | } | ||
164 | ltq_gpio_port[pdev->id].chip.label = "ltq_gpio"; | ||
165 | ltq_gpio_port[pdev->id].chip.direction_input = ltq_gpio_direction_input; | ||
166 | ltq_gpio_port[pdev->id].chip.direction_output = | ||
167 | ltq_gpio_direction_output; | ||
168 | ltq_gpio_port[pdev->id].chip.get = ltq_gpio_get; | ||
169 | ltq_gpio_port[pdev->id].chip.set = ltq_gpio_set; | ||
170 | ltq_gpio_port[pdev->id].chip.request = ltq_gpio_req; | ||
171 | ltq_gpio_port[pdev->id].chip.base = PINS_PER_PORT * pdev->id; | ||
172 | ltq_gpio_port[pdev->id].chip.ngpio = PINS_PER_PORT; | ||
173 | platform_set_drvdata(pdev, <q_gpio_port[pdev->id]); | ||
174 | return gpiochip_add(<q_gpio_port[pdev->id].chip); | ||
175 | } | ||
176 | |||
177 | static struct platform_driver | ||
178 | ltq_gpio_driver = { | ||
179 | .probe = ltq_gpio_probe, | ||
180 | .driver = { | ||
181 | .name = "ltq_gpio", | ||
182 | .owner = THIS_MODULE, | ||
183 | }, | ||
184 | }; | ||
185 | |||
186 | int __init ltq_gpio_init(void) | ||
187 | { | ||
188 | int ret = platform_driver_register(<q_gpio_driver); | ||
189 | |||
190 | if (ret) | ||
191 | pr_info("ltq_gpio : Error registering platfom driver!"); | ||
192 | return ret; | ||
193 | } | ||
194 | |||
195 | postcore_initcall(ltq_gpio_init); | ||
diff --git a/arch/mips/lantiq/xway/gpio_ebu.c b/arch/mips/lantiq/xway/gpio_ebu.c new file mode 100644 index 00000000000..a479355abdb --- /dev/null +++ b/arch/mips/lantiq/xway/gpio_ebu.c | |||
@@ -0,0 +1,126 @@ | |||
1 | /* | ||
2 | * This program is free software; you can redistribute it and/or modify it | ||
3 | * under the terms of the GNU General Public License version 2 as published | ||
4 | * by the Free Software Foundation. | ||
5 | * | ||
6 | * Copyright (C) 2010 John Crispin <blogic@openwrt.org> | ||
7 | */ | ||
8 | |||
9 | #include <linux/init.h> | ||
10 | #include <linux/module.h> | ||
11 | #include <linux/types.h> | ||
12 | #include <linux/platform_device.h> | ||
13 | #include <linux/mutex.h> | ||
14 | #include <linux/gpio.h> | ||
15 | #include <linux/io.h> | ||
16 | |||
17 | #include <lantiq_soc.h> | ||
18 | |||
19 | /* | ||
20 | * By attaching hardware latches to the EBU it is possible to create output | ||
21 | * only gpios. This driver configures a special memory address, which when | ||
22 | * written to outputs 16 bit to the latches. | ||
23 | */ | ||
24 | |||
25 | #define LTQ_EBU_BUSCON 0x1e7ff /* 16 bit access, slowest timing */ | ||
26 | #define LTQ_EBU_WP 0x80000000 /* write protect bit */ | ||
27 | |||
28 | /* we keep a shadow value of the last value written to the ebu */ | ||
29 | static int ltq_ebu_gpio_shadow = 0x0; | ||
30 | static void __iomem *ltq_ebu_gpio_membase; | ||
31 | |||
32 | static void ltq_ebu_apply(void) | ||
33 | { | ||
34 | unsigned long flags; | ||
35 | |||
36 | spin_lock_irqsave(&ebu_lock, flags); | ||
37 | ltq_ebu_w32(LTQ_EBU_BUSCON, LTQ_EBU_BUSCON1); | ||
38 | *((__u16 *)ltq_ebu_gpio_membase) = ltq_ebu_gpio_shadow; | ||
39 | ltq_ebu_w32(LTQ_EBU_BUSCON | LTQ_EBU_WP, LTQ_EBU_BUSCON1); | ||
40 | spin_unlock_irqrestore(&ebu_lock, flags); | ||
41 | } | ||
42 | |||
43 | static void ltq_ebu_set(struct gpio_chip *chip, unsigned offset, int value) | ||
44 | { | ||
45 | if (value) | ||
46 | ltq_ebu_gpio_shadow |= (1 << offset); | ||
47 | else | ||
48 | ltq_ebu_gpio_shadow &= ~(1 << offset); | ||
49 | ltq_ebu_apply(); | ||
50 | } | ||
51 | |||
52 | static int ltq_ebu_direction_output(struct gpio_chip *chip, unsigned offset, | ||
53 | int value) | ||
54 | { | ||
55 | ltq_ebu_set(chip, offset, value); | ||
56 | |||
57 | return 0; | ||
58 | } | ||
59 | |||
60 | static struct gpio_chip ltq_ebu_chip = { | ||
61 | .label = "ltq_ebu", | ||
62 | .direction_output = ltq_ebu_direction_output, | ||
63 | .set = ltq_ebu_set, | ||
64 | .base = 72, | ||
65 | .ngpio = 16, | ||
66 | .can_sleep = 1, | ||
67 | .owner = THIS_MODULE, | ||
68 | }; | ||
69 | |||
70 | static int ltq_ebu_probe(struct platform_device *pdev) | ||
71 | { | ||
72 | int ret = 0; | ||
73 | struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
74 | |||
75 | if (!res) { | ||
76 | dev_err(&pdev->dev, "failed to get memory resource\n"); | ||
77 | return -ENOENT; | ||
78 | } | ||
79 | |||
80 | res = devm_request_mem_region(&pdev->dev, res->start, | ||
81 | resource_size(res), dev_name(&pdev->dev)); | ||
82 | if (!res) { | ||
83 | dev_err(&pdev->dev, "failed to request memory resource\n"); | ||
84 | return -EBUSY; | ||
85 | } | ||
86 | |||
87 | ltq_ebu_gpio_membase = devm_ioremap_nocache(&pdev->dev, res->start, | ||
88 | resource_size(res)); | ||
89 | if (!ltq_ebu_gpio_membase) { | ||
90 | dev_err(&pdev->dev, "Failed to ioremap mem region\n"); | ||
91 | return -ENOMEM; | ||
92 | } | ||
93 | |||
94 | /* grab the default shadow value passed form the platform code */ | ||
95 | ltq_ebu_gpio_shadow = (unsigned int) pdev->dev.platform_data; | ||
96 | |||
97 | /* tell the ebu controller which memory address we will be using */ | ||
98 | ltq_ebu_w32(pdev->resource->start | 0x1, LTQ_EBU_ADDRSEL1); | ||
99 | |||
100 | /* write protect the region */ | ||
101 | ltq_ebu_w32(LTQ_EBU_BUSCON | LTQ_EBU_WP, LTQ_EBU_BUSCON1); | ||
102 | |||
103 | ret = gpiochip_add(<q_ebu_chip); | ||
104 | if (!ret) | ||
105 | ltq_ebu_apply(); | ||
106 | return ret; | ||
107 | } | ||
108 | |||
109 | static struct platform_driver ltq_ebu_driver = { | ||
110 | .probe = ltq_ebu_probe, | ||
111 | .driver = { | ||
112 | .name = "ltq_ebu", | ||
113 | .owner = THIS_MODULE, | ||
114 | }, | ||
115 | }; | ||
116 | |||
117 | static int __init ltq_ebu_init(void) | ||
118 | { | ||
119 | int ret = platform_driver_register(<q_ebu_driver); | ||
120 | |||
121 | if (ret) | ||
122 | pr_info("ltq_ebu : Error registering platfom driver!"); | ||
123 | return ret; | ||
124 | } | ||
125 | |||
126 | postcore_initcall(ltq_ebu_init); | ||
diff --git a/arch/mips/lantiq/xway/gpio_stp.c b/arch/mips/lantiq/xway/gpio_stp.c new file mode 100644 index 00000000000..67d59d69034 --- /dev/null +++ b/arch/mips/lantiq/xway/gpio_stp.c | |||
@@ -0,0 +1,157 @@ | |||
1 | /* | ||
2 | * This program is free software; you can redistribute it and/or modify it | ||
3 | * under the terms of the GNU General Public License version 2 as published | ||
4 | * by the Free Software Foundation. | ||
5 | * | ||
6 | * Copyright (C) 2007 John Crispin <blogic@openwrt.org> | ||
7 | * | ||
8 | */ | ||
9 | |||
10 | #include <linux/slab.h> | ||
11 | #include <linux/init.h> | ||
12 | #include <linux/module.h> | ||
13 | #include <linux/types.h> | ||
14 | #include <linux/platform_device.h> | ||
15 | #include <linux/mutex.h> | ||
16 | #include <linux/io.h> | ||
17 | #include <linux/gpio.h> | ||
18 | |||
19 | #include <lantiq_soc.h> | ||
20 | |||
21 | #define LTQ_STP_CON0 0x00 | ||
22 | #define LTQ_STP_CON1 0x04 | ||
23 | #define LTQ_STP_CPU0 0x08 | ||
24 | #define LTQ_STP_CPU1 0x0C | ||
25 | #define LTQ_STP_AR 0x10 | ||
26 | |||
27 | #define LTQ_STP_CON_SWU (1 << 31) | ||
28 | #define LTQ_STP_2HZ 0 | ||
29 | #define LTQ_STP_4HZ (1 << 23) | ||
30 | #define LTQ_STP_8HZ (2 << 23) | ||
31 | #define LTQ_STP_10HZ (3 << 23) | ||
32 | #define LTQ_STP_SPEED_MASK (0xf << 23) | ||
33 | #define LTQ_STP_UPD_FPI (1 << 31) | ||
34 | #define LTQ_STP_UPD_MASK (3 << 30) | ||
35 | #define LTQ_STP_ADSL_SRC (3 << 24) | ||
36 | |||
37 | #define LTQ_STP_GROUP0 (1 << 0) | ||
38 | |||
39 | #define LTQ_STP_RISING 0 | ||
40 | #define LTQ_STP_FALLING (1 << 26) | ||
41 | #define LTQ_STP_EDGE_MASK (1 << 26) | ||
42 | |||
43 | #define ltq_stp_r32(reg) __raw_readl(ltq_stp_membase + reg) | ||
44 | #define ltq_stp_w32(val, reg) __raw_writel(val, ltq_stp_membase + reg) | ||
45 | #define ltq_stp_w32_mask(clear, set, reg) \ | ||
46 | ltq_w32((ltq_r32(ltq_stp_membase + reg) & ~(clear)) | (set), \ | ||
47 | ltq_stp_membase + (reg)) | ||
48 | |||
49 | static int ltq_stp_shadow = 0xffff; | ||
50 | static void __iomem *ltq_stp_membase; | ||
51 | |||
52 | static void ltq_stp_set(struct gpio_chip *chip, unsigned offset, int value) | ||
53 | { | ||
54 | if (value) | ||
55 | ltq_stp_shadow |= (1 << offset); | ||
56 | else | ||
57 | ltq_stp_shadow &= ~(1 << offset); | ||
58 | ltq_stp_w32(ltq_stp_shadow, LTQ_STP_CPU0); | ||
59 | } | ||
60 | |||
61 | static int ltq_stp_direction_output(struct gpio_chip *chip, unsigned offset, | ||
62 | int value) | ||
63 | { | ||
64 | ltq_stp_set(chip, offset, value); | ||
65 | |||
66 | return 0; | ||
67 | } | ||
68 | |||
69 | static struct gpio_chip ltq_stp_chip = { | ||
70 | .label = "ltq_stp", | ||
71 | .direction_output = ltq_stp_direction_output, | ||
72 | .set = ltq_stp_set, | ||
73 | .base = 48, | ||
74 | .ngpio = 24, | ||
75 | .can_sleep = 1, | ||
76 | .owner = THIS_MODULE, | ||
77 | }; | ||
78 | |||
79 | static int ltq_stp_hw_init(void) | ||
80 | { | ||
81 | /* the 3 pins used to control the external stp */ | ||
82 | ltq_gpio_request(4, 1, 0, 1, "stp-st"); | ||
83 | ltq_gpio_request(5, 1, 0, 1, "stp-d"); | ||
84 | ltq_gpio_request(6, 1, 0, 1, "stp-sh"); | ||
85 | |||
86 | /* sane defaults */ | ||
87 | ltq_stp_w32(0, LTQ_STP_AR); | ||
88 | ltq_stp_w32(0, LTQ_STP_CPU0); | ||
89 | ltq_stp_w32(0, LTQ_STP_CPU1); | ||
90 | ltq_stp_w32(LTQ_STP_CON_SWU, LTQ_STP_CON0); | ||
91 | ltq_stp_w32(0, LTQ_STP_CON1); | ||
92 | |||
93 | /* rising or falling edge */ | ||
94 | ltq_stp_w32_mask(LTQ_STP_EDGE_MASK, LTQ_STP_FALLING, LTQ_STP_CON0); | ||
95 | |||
96 | /* per default stp 15-0 are set */ | ||
97 | ltq_stp_w32_mask(0, LTQ_STP_GROUP0, LTQ_STP_CON1); | ||
98 | |||
99 | /* stp are update periodically by the FPI bus */ | ||
100 | ltq_stp_w32_mask(LTQ_STP_UPD_MASK, LTQ_STP_UPD_FPI, LTQ_STP_CON1); | ||
101 | |||
102 | /* set stp update speed */ | ||
103 | ltq_stp_w32_mask(LTQ_STP_SPEED_MASK, LTQ_STP_8HZ, LTQ_STP_CON1); | ||
104 | |||
105 | /* tell the hardware that pin (led) 0 and 1 are controlled | ||
106 | * by the dsl arc | ||
107 | */ | ||
108 | ltq_stp_w32_mask(0, LTQ_STP_ADSL_SRC, LTQ_STP_CON0); | ||
109 | |||
110 | ltq_pmu_enable(PMU_LED); | ||
111 | return 0; | ||
112 | } | ||
113 | |||
114 | static int __devinit ltq_stp_probe(struct platform_device *pdev) | ||
115 | { | ||
116 | struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
117 | int ret = 0; | ||
118 | |||
119 | if (!res) | ||
120 | return -ENOENT; | ||
121 | res = devm_request_mem_region(&pdev->dev, res->start, | ||
122 | resource_size(res), dev_name(&pdev->dev)); | ||
123 | if (!res) { | ||
124 | dev_err(&pdev->dev, "failed to request STP memory\n"); | ||
125 | return -EBUSY; | ||
126 | } | ||
127 | ltq_stp_membase = devm_ioremap_nocache(&pdev->dev, res->start, | ||
128 | resource_size(res)); | ||
129 | if (!ltq_stp_membase) { | ||
130 | dev_err(&pdev->dev, "failed to remap STP memory\n"); | ||
131 | return -ENOMEM; | ||
132 | } | ||
133 | ret = gpiochip_add(<q_stp_chip); | ||
134 | if (!ret) | ||
135 | ret = ltq_stp_hw_init(); | ||
136 | |||
137 | return ret; | ||
138 | } | ||
139 | |||
140 | static struct platform_driver ltq_stp_driver = { | ||
141 | .probe = ltq_stp_probe, | ||
142 | .driver = { | ||
143 | .name = "ltq_stp", | ||
144 | .owner = THIS_MODULE, | ||
145 | }, | ||
146 | }; | ||
147 | |||
148 | int __init ltq_stp_init(void) | ||
149 | { | ||
150 | int ret = platform_driver_register(<q_stp_driver); | ||
151 | |||
152 | if (ret) | ||
153 | pr_info("ltq_stp: error registering platfom driver"); | ||
154 | return ret; | ||
155 | } | ||
156 | |||
157 | postcore_initcall(ltq_stp_init); | ||
diff --git a/arch/mips/lantiq/xway/mach-easy50601.c b/arch/mips/lantiq/xway/mach-easy50601.c new file mode 100644 index 00000000000..d5aaf637ab1 --- /dev/null +++ b/arch/mips/lantiq/xway/mach-easy50601.c | |||
@@ -0,0 +1,57 @@ | |||
1 | /* | ||
2 | * This program is free software; you can redistribute it and/or modify it | ||
3 | * under the terms of the GNU General Public License version 2 as published | ||
4 | * by the Free Software Foundation. | ||
5 | * | ||
6 | * Copyright (C) 2010 John Crispin <blogic@openwrt.org> | ||
7 | */ | ||
8 | |||
9 | #include <linux/init.h> | ||
10 | #include <linux/platform_device.h> | ||
11 | #include <linux/mtd/mtd.h> | ||
12 | #include <linux/mtd/partitions.h> | ||
13 | #include <linux/mtd/physmap.h> | ||
14 | #include <linux/input.h> | ||
15 | |||
16 | #include <lantiq.h> | ||
17 | |||
18 | #include "../machtypes.h" | ||
19 | #include "devices.h" | ||
20 | |||
21 | static struct mtd_partition easy50601_partitions[] = { | ||
22 | { | ||
23 | .name = "uboot", | ||
24 | .offset = 0x0, | ||
25 | .size = 0x10000, | ||
26 | }, | ||
27 | { | ||
28 | .name = "uboot_env", | ||
29 | .offset = 0x10000, | ||
30 | .size = 0x10000, | ||
31 | }, | ||
32 | { | ||
33 | .name = "linux", | ||
34 | .offset = 0x20000, | ||
35 | .size = 0xE0000, | ||
36 | }, | ||
37 | { | ||
38 | .name = "rootfs", | ||
39 | .offset = 0x100000, | ||
40 | .size = 0x300000, | ||
41 | }, | ||
42 | }; | ||
43 | |||
44 | static struct physmap_flash_data easy50601_flash_data = { | ||
45 | .nr_parts = ARRAY_SIZE(easy50601_partitions), | ||
46 | .parts = easy50601_partitions, | ||
47 | }; | ||
48 | |||
49 | static void __init easy50601_init(void) | ||
50 | { | ||
51 | ltq_register_nor(&easy50601_flash_data); | ||
52 | } | ||
53 | |||
54 | MIPS_MACHINE(LTQ_MACH_EASY50601, | ||
55 | "EASY50601", | ||
56 | "EASY50601 Eval Board", | ||
57 | easy50601_init); | ||
diff --git a/arch/mips/lantiq/xway/mach-easy50712.c b/arch/mips/lantiq/xway/mach-easy50712.c new file mode 100644 index 00000000000..ea5027b3239 --- /dev/null +++ b/arch/mips/lantiq/xway/mach-easy50712.c | |||
@@ -0,0 +1,74 @@ | |||
1 | /* | ||
2 | * This program is free software; you can redistribute it and/or modify it | ||
3 | * under the terms of the GNU General Public License version 2 as published | ||
4 | * by the Free Software Foundation. | ||
5 | * | ||
6 | * Copyright (C) 2010 John Crispin <blogic@openwrt.org> | ||
7 | */ | ||
8 | |||
9 | #include <linux/init.h> | ||
10 | #include <linux/platform_device.h> | ||
11 | #include <linux/mtd/mtd.h> | ||
12 | #include <linux/mtd/partitions.h> | ||
13 | #include <linux/mtd/physmap.h> | ||
14 | #include <linux/input.h> | ||
15 | #include <linux/phy.h> | ||
16 | |||
17 | #include <lantiq_soc.h> | ||
18 | #include <irq.h> | ||
19 | |||
20 | #include "../machtypes.h" | ||
21 | #include "devices.h" | ||
22 | |||
23 | static struct mtd_partition easy50712_partitions[] = { | ||
24 | { | ||
25 | .name = "uboot", | ||
26 | .offset = 0x0, | ||
27 | .size = 0x10000, | ||
28 | }, | ||
29 | { | ||
30 | .name = "uboot_env", | ||
31 | .offset = 0x10000, | ||
32 | .size = 0x10000, | ||
33 | }, | ||
34 | { | ||
35 | .name = "linux", | ||
36 | .offset = 0x20000, | ||
37 | .size = 0xe0000, | ||
38 | }, | ||
39 | { | ||
40 | .name = "rootfs", | ||
41 | .offset = 0x100000, | ||
42 | .size = 0x300000, | ||
43 | }, | ||
44 | }; | ||
45 | |||
46 | static struct physmap_flash_data easy50712_flash_data = { | ||
47 | .nr_parts = ARRAY_SIZE(easy50712_partitions), | ||
48 | .parts = easy50712_partitions, | ||
49 | }; | ||
50 | |||
51 | static struct ltq_pci_data ltq_pci_data = { | ||
52 | .clock = PCI_CLOCK_INT, | ||
53 | .gpio = PCI_GNT1 | PCI_REQ1, | ||
54 | .irq = { | ||
55 | [14] = INT_NUM_IM0_IRL0 + 22, | ||
56 | }, | ||
57 | }; | ||
58 | |||
59 | static struct ltq_eth_data ltq_eth_data = { | ||
60 | .mii_mode = PHY_INTERFACE_MODE_MII, | ||
61 | }; | ||
62 | |||
63 | static void __init easy50712_init(void) | ||
64 | { | ||
65 | ltq_register_gpio_stp(); | ||
66 | ltq_register_nor(&easy50712_flash_data); | ||
67 | ltq_register_pci(<q_pci_data); | ||
68 | ltq_register_etop(<q_eth_data); | ||
69 | } | ||
70 | |||
71 | MIPS_MACHINE(LTQ_MACH_EASY50712, | ||
72 | "EASY50712", | ||
73 | "EASY50712 Eval Board", | ||
74 | easy50712_init); | ||
diff --git a/arch/mips/lantiq/xway/pmu.c b/arch/mips/lantiq/xway/pmu.c new file mode 100644 index 00000000000..39f0d2641cb --- /dev/null +++ b/arch/mips/lantiq/xway/pmu.c | |||
@@ -0,0 +1,69 @@ | |||
1 | /* | ||
2 | * This program is free software; you can redistribute it and/or modify it | ||
3 | * under the terms of the GNU General Public License version 2 as published | ||
4 | * by the Free Software Foundation. | ||
5 | * | ||
6 | * Copyright (C) 2010 John Crispin <blogic@openwrt.org> | ||
7 | */ | ||
8 | |||
9 | #include <linux/kernel.h> | ||
10 | #include <linux/module.h> | ||
11 | #include <linux/ioport.h> | ||
12 | |||
13 | #include <lantiq_soc.h> | ||
14 | |||
15 | /* PMU - the power management unit allows us to turn part of the core | ||
16 | * on and off | ||
17 | */ | ||
18 | |||
19 | /* the enable / disable registers */ | ||
20 | #define LTQ_PMU_PWDCR 0x1C | ||
21 | #define LTQ_PMU_PWDSR 0x20 | ||
22 | |||
23 | #define ltq_pmu_w32(x, y) ltq_w32((x), ltq_pmu_membase + (y)) | ||
24 | #define ltq_pmu_r32(x) ltq_r32(ltq_pmu_membase + (x)) | ||
25 | |||
26 | static struct resource ltq_pmu_resource = { | ||
27 | .name = "pmu", | ||
28 | .start = LTQ_PMU_BASE_ADDR, | ||
29 | .end = LTQ_PMU_BASE_ADDR + LTQ_PMU_SIZE - 1, | ||
30 | .flags = IORESOURCE_MEM, | ||
31 | }; | ||
32 | |||
33 | static void __iomem *ltq_pmu_membase; | ||
34 | |||
35 | void ltq_pmu_enable(unsigned int module) | ||
36 | { | ||
37 | int err = 1000000; | ||
38 | |||
39 | ltq_pmu_w32(ltq_pmu_r32(LTQ_PMU_PWDCR) & ~module, LTQ_PMU_PWDCR); | ||
40 | do {} while (--err && (ltq_pmu_r32(LTQ_PMU_PWDSR) & module)); | ||
41 | |||
42 | if (!err) | ||
43 | panic("activating PMU module failed!\n"); | ||
44 | } | ||
45 | EXPORT_SYMBOL(ltq_pmu_enable); | ||
46 | |||
47 | void ltq_pmu_disable(unsigned int module) | ||
48 | { | ||
49 | ltq_pmu_w32(ltq_pmu_r32(LTQ_PMU_PWDCR) | module, LTQ_PMU_PWDCR); | ||
50 | } | ||
51 | EXPORT_SYMBOL(ltq_pmu_disable); | ||
52 | |||
53 | int __init ltq_pmu_init(void) | ||
54 | { | ||
55 | if (insert_resource(&iomem_resource, <q_pmu_resource) < 0) | ||
56 | panic("Failed to insert pmu memory\n"); | ||
57 | |||
58 | if (request_mem_region(ltq_pmu_resource.start, | ||
59 | resource_size(<q_pmu_resource), "pmu") < 0) | ||
60 | panic("Failed to request pmu memory\n"); | ||
61 | |||
62 | ltq_pmu_membase = ioremap_nocache(ltq_pmu_resource.start, | ||
63 | resource_size(<q_pmu_resource)); | ||
64 | if (!ltq_pmu_membase) | ||
65 | panic("Failed to remap pmu memory\n"); | ||
66 | return 0; | ||
67 | } | ||
68 | |||
69 | core_initcall(ltq_pmu_init); | ||
diff --git a/arch/mips/lantiq/xway/prom-ase.c b/arch/mips/lantiq/xway/prom-ase.c new file mode 100644 index 00000000000..abe49f4db57 --- /dev/null +++ b/arch/mips/lantiq/xway/prom-ase.c | |||
@@ -0,0 +1,39 @@ | |||
1 | /* | ||
2 | * This program is free software; you can redistribute it and/or modify it | ||
3 | * under the terms of the GNU General Public License version 2 as published | ||
4 | * by the Free Software Foundation. | ||
5 | * | ||
6 | * Copyright (C) 2010 John Crispin <blogic@openwrt.org> | ||
7 | */ | ||
8 | |||
9 | #include <linux/module.h> | ||
10 | #include <linux/clk.h> | ||
11 | #include <asm/bootinfo.h> | ||
12 | #include <asm/time.h> | ||
13 | |||
14 | #include <lantiq_soc.h> | ||
15 | |||
16 | #include "../prom.h" | ||
17 | |||
18 | #define SOC_AMAZON_SE "Amazon_SE" | ||
19 | |||
20 | #define PART_SHIFT 12 | ||
21 | #define PART_MASK 0x0FFFFFFF | ||
22 | #define REV_SHIFT 28 | ||
23 | #define REV_MASK 0xF0000000 | ||
24 | |||
25 | void __init ltq_soc_detect(struct ltq_soc_info *i) | ||
26 | { | ||
27 | i->partnum = (ltq_r32(LTQ_MPS_CHIPID) & PART_MASK) >> PART_SHIFT; | ||
28 | i->rev = (ltq_r32(LTQ_MPS_CHIPID) & REV_MASK) >> REV_SHIFT; | ||
29 | switch (i->partnum) { | ||
30 | case SOC_ID_AMAZON_SE: | ||
31 | i->name = SOC_AMAZON_SE; | ||
32 | i->type = SOC_TYPE_AMAZON_SE; | ||
33 | break; | ||
34 | |||
35 | default: | ||
36 | unreachable(); | ||
37 | break; | ||
38 | } | ||
39 | } | ||
diff --git a/arch/mips/lantiq/xway/prom-xway.c b/arch/mips/lantiq/xway/prom-xway.c new file mode 100644 index 00000000000..1686692ac24 --- /dev/null +++ b/arch/mips/lantiq/xway/prom-xway.c | |||
@@ -0,0 +1,54 @@ | |||
1 | /* | ||
2 | * This program is free software; you can redistribute it and/or modify it | ||
3 | * under the terms of the GNU General Public License version 2 as published | ||
4 | * by the Free Software Foundation. | ||
5 | * | ||
6 | * Copyright (C) 2010 John Crispin <blogic@openwrt.org> | ||
7 | */ | ||
8 | |||
9 | #include <linux/module.h> | ||
10 | #include <linux/clk.h> | ||
11 | #include <asm/bootinfo.h> | ||
12 | #include <asm/time.h> | ||
13 | |||
14 | #include <lantiq_soc.h> | ||
15 | |||
16 | #include "../prom.h" | ||
17 | |||
18 | #define SOC_DANUBE "Danube" | ||
19 | #define SOC_TWINPASS "Twinpass" | ||
20 | #define SOC_AR9 "AR9" | ||
21 | |||
22 | #define PART_SHIFT 12 | ||
23 | #define PART_MASK 0x0FFFFFFF | ||
24 | #define REV_SHIFT 28 | ||
25 | #define REV_MASK 0xF0000000 | ||
26 | |||
27 | void __init ltq_soc_detect(struct ltq_soc_info *i) | ||
28 | { | ||
29 | i->partnum = (ltq_r32(LTQ_MPS_CHIPID) & PART_MASK) >> PART_SHIFT; | ||
30 | i->rev = (ltq_r32(LTQ_MPS_CHIPID) & REV_MASK) >> REV_SHIFT; | ||
31 | switch (i->partnum) { | ||
32 | case SOC_ID_DANUBE1: | ||
33 | case SOC_ID_DANUBE2: | ||
34 | i->name = SOC_DANUBE; | ||
35 | i->type = SOC_TYPE_DANUBE; | ||
36 | break; | ||
37 | |||
38 | case SOC_ID_TWINPASS: | ||
39 | i->name = SOC_TWINPASS; | ||
40 | i->type = SOC_TYPE_DANUBE; | ||
41 | break; | ||
42 | |||
43 | case SOC_ID_ARX188: | ||
44 | case SOC_ID_ARX168: | ||
45 | case SOC_ID_ARX182: | ||
46 | i->name = SOC_AR9; | ||
47 | i->type = SOC_TYPE_AR9; | ||
48 | break; | ||
49 | |||
50 | default: | ||
51 | unreachable(); | ||
52 | break; | ||
53 | } | ||
54 | } | ||
diff --git a/arch/mips/lantiq/xway/setup-ase.c b/arch/mips/lantiq/xway/setup-ase.c new file mode 100644 index 00000000000..f6f326798a3 --- /dev/null +++ b/arch/mips/lantiq/xway/setup-ase.c | |||
@@ -0,0 +1,19 @@ | |||
1 | /* | ||
2 | * This program is free software; you can redistribute it and/or modify it | ||
3 | * under the terms of the GNU General Public License version 2 as published | ||
4 | * by the Free Software Foundation. | ||
5 | * | ||
6 | * Copyright (C) 2011 John Crispin <blogic@openwrt.org> | ||
7 | */ | ||
8 | |||
9 | #include <lantiq_soc.h> | ||
10 | |||
11 | #include "../prom.h" | ||
12 | #include "devices.h" | ||
13 | |||
14 | void __init ltq_soc_setup(void) | ||
15 | { | ||
16 | ltq_register_ase_asc(); | ||
17 | ltq_register_gpio(); | ||
18 | ltq_register_wdt(); | ||
19 | } | ||
diff --git a/arch/mips/lantiq/xway/setup-xway.c b/arch/mips/lantiq/xway/setup-xway.c new file mode 100644 index 00000000000..c292f643a85 --- /dev/null +++ b/arch/mips/lantiq/xway/setup-xway.c | |||
@@ -0,0 +1,20 @@ | |||
1 | /* | ||
2 | * This program is free software; you can redistribute it and/or modify it | ||
3 | * under the terms of the GNU General Public License version 2 as published | ||
4 | * by the Free Software Foundation. | ||
5 | * | ||
6 | * Copyright (C) 2011 John Crispin <blogic@openwrt.org> | ||
7 | */ | ||
8 | |||
9 | #include <lantiq_soc.h> | ||
10 | |||
11 | #include "../prom.h" | ||
12 | #include "devices.h" | ||
13 | |||
14 | void __init ltq_soc_setup(void) | ||
15 | { | ||
16 | ltq_register_asc(0); | ||
17 | ltq_register_asc(1); | ||
18 | ltq_register_gpio(); | ||
19 | ltq_register_wdt(); | ||
20 | } | ||
diff --git a/arch/mips/lib/memcpy-inatomic.S b/arch/mips/lib/memcpy-inatomic.S new file mode 100644 index 00000000000..68853a038d3 --- /dev/null +++ b/arch/mips/lib/memcpy-inatomic.S | |||
@@ -0,0 +1,451 @@ | |||
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 | * Unified implementation of memcpy, memmove and the __copy_user backend. | ||
7 | * | ||
8 | * Copyright (C) 1998, 99, 2000, 01, 2002 Ralf Baechle (ralf@gnu.org) | ||
9 | * Copyright (C) 1999, 2000, 01, 2002 Silicon Graphics, Inc. | ||
10 | * Copyright (C) 2002 Broadcom, Inc. | ||
11 | * memcpy/copy_user author: Mark Vandevoorde | ||
12 | * Copyright (C) 2007 Maciej W. Rozycki | ||
13 | * | ||
14 | * Mnemonic names for arguments to memcpy/__copy_user | ||
15 | */ | ||
16 | |||
17 | /* | ||
18 | * Hack to resolve longstanding prefetch issue | ||
19 | * | ||
20 | * Prefetching may be fatal on some systems if we're prefetching beyond the | ||
21 | * end of memory on some systems. It's also a seriously bad idea on non | ||
22 | * dma-coherent systems. | ||
23 | */ | ||
24 | #ifdef CONFIG_DMA_NONCOHERENT | ||
25 | #undef CONFIG_CPU_HAS_PREFETCH | ||
26 | #endif | ||
27 | #ifdef CONFIG_MIPS_MALTA | ||
28 | #undef CONFIG_CPU_HAS_PREFETCH | ||
29 | #endif | ||
30 | |||
31 | #include <asm/asm.h> | ||
32 | #include <asm/asm-offsets.h> | ||
33 | #include <asm/regdef.h> | ||
34 | |||
35 | #define dst a0 | ||
36 | #define src a1 | ||
37 | #define len a2 | ||
38 | |||
39 | /* | ||
40 | * Spec | ||
41 | * | ||
42 | * memcpy copies len bytes from src to dst and sets v0 to dst. | ||
43 | * It assumes that | ||
44 | * - src and dst don't overlap | ||
45 | * - src is readable | ||
46 | * - dst is writable | ||
47 | * memcpy uses the standard calling convention | ||
48 | * | ||
49 | * __copy_user copies up to len bytes from src to dst and sets a2 (len) to | ||
50 | * the number of uncopied bytes due to an exception caused by a read or write. | ||
51 | * __copy_user assumes that src and dst don't overlap, and that the call is | ||
52 | * implementing one of the following: | ||
53 | * copy_to_user | ||
54 | * - src is readable (no exceptions when reading src) | ||
55 | * copy_from_user | ||
56 | * - dst is writable (no exceptions when writing dst) | ||
57 | * __copy_user uses a non-standard calling convention; see | ||
58 | * include/asm-mips/uaccess.h | ||
59 | * | ||
60 | * When an exception happens on a load, the handler must | ||
61 | # ensure that all of the destination buffer is overwritten to prevent | ||
62 | * leaking information to user mode programs. | ||
63 | */ | ||
64 | |||
65 | /* | ||
66 | * Implementation | ||
67 | */ | ||
68 | |||
69 | /* | ||
70 | * The exception handler for loads requires that: | ||
71 | * 1- AT contain the address of the byte just past the end of the source | ||
72 | * of the copy, | ||
73 | * 2- src_entry <= src < AT, and | ||
74 | * 3- (dst - src) == (dst_entry - src_entry), | ||
75 | * The _entry suffix denotes values when __copy_user was called. | ||
76 | * | ||
77 | * (1) is set up up by uaccess.h and maintained by not writing AT in copy_user | ||
78 | * (2) is met by incrementing src by the number of bytes copied | ||
79 | * (3) is met by not doing loads between a pair of increments of dst and src | ||
80 | * | ||
81 | * The exception handlers for stores adjust len (if necessary) and return. | ||
82 | * These handlers do not need to overwrite any data. | ||
83 | * | ||
84 | * For __rmemcpy and memmove an exception is always a kernel bug, therefore | ||
85 | * they're not protected. | ||
86 | */ | ||
87 | |||
88 | #define EXC(inst_reg,addr,handler) \ | ||
89 | 9: inst_reg, addr; \ | ||
90 | .section __ex_table,"a"; \ | ||
91 | PTR 9b, handler; \ | ||
92 | .previous | ||
93 | |||
94 | /* | ||
95 | * Only on the 64-bit kernel we can made use of 64-bit registers. | ||
96 | */ | ||
97 | #ifdef CONFIG_64BIT | ||
98 | #define USE_DOUBLE | ||
99 | #endif | ||
100 | |||
101 | #ifdef USE_DOUBLE | ||
102 | |||
103 | #define LOAD ld | ||
104 | #define LOADL ldl | ||
105 | #define LOADR ldr | ||
106 | #define STOREL sdl | ||
107 | #define STORER sdr | ||
108 | #define STORE sd | ||
109 | #define ADD daddu | ||
110 | #define SUB dsubu | ||
111 | #define SRL dsrl | ||
112 | #define SRA dsra | ||
113 | #define SLL dsll | ||
114 | #define SLLV dsllv | ||
115 | #define SRLV dsrlv | ||
116 | #define NBYTES 8 | ||
117 | #define LOG_NBYTES 3 | ||
118 | |||
119 | /* | ||
120 | * As we are sharing code base with the mips32 tree (which use the o32 ABI | ||
121 | * register definitions). We need to redefine the register definitions from | ||
122 | * the n64 ABI register naming to the o32 ABI register naming. | ||
123 | */ | ||
124 | #undef t0 | ||
125 | #undef t1 | ||
126 | #undef t2 | ||
127 | #undef t3 | ||
128 | #define t0 $8 | ||
129 | #define t1 $9 | ||
130 | #define t2 $10 | ||
131 | #define t3 $11 | ||
132 | #define t4 $12 | ||
133 | #define t5 $13 | ||
134 | #define t6 $14 | ||
135 | #define t7 $15 | ||
136 | |||
137 | #else | ||
138 | |||
139 | #define LOAD lw | ||
140 | #define LOADL lwl | ||
141 | #define LOADR lwr | ||
142 | #define STOREL swl | ||
143 | #define STORER swr | ||
144 | #define STORE sw | ||
145 | #define ADD addu | ||
146 | #define SUB subu | ||
147 | #define SRL srl | ||
148 | #define SLL sll | ||
149 | #define SRA sra | ||
150 | #define SLLV sllv | ||
151 | #define SRLV srlv | ||
152 | #define NBYTES 4 | ||
153 | #define LOG_NBYTES 2 | ||
154 | |||
155 | #endif /* USE_DOUBLE */ | ||
156 | |||
157 | #ifdef CONFIG_CPU_LITTLE_ENDIAN | ||
158 | #define LDFIRST LOADR | ||
159 | #define LDREST LOADL | ||
160 | #define STFIRST STORER | ||
161 | #define STREST STOREL | ||
162 | #define SHIFT_DISCARD SLLV | ||
163 | #else | ||
164 | #define LDFIRST LOADL | ||
165 | #define LDREST LOADR | ||
166 | #define STFIRST STOREL | ||
167 | #define STREST STORER | ||
168 | #define SHIFT_DISCARD SRLV | ||
169 | #endif | ||
170 | |||
171 | #define FIRST(unit) ((unit)*NBYTES) | ||
172 | #define REST(unit) (FIRST(unit)+NBYTES-1) | ||
173 | #define UNIT(unit) FIRST(unit) | ||
174 | |||
175 | #define ADDRMASK (NBYTES-1) | ||
176 | |||
177 | .text | ||
178 | .set noreorder | ||
179 | #ifndef CONFIG_CPU_DADDI_WORKAROUNDS | ||
180 | .set noat | ||
181 | #else | ||
182 | .set at=v1 | ||
183 | #endif | ||
184 | |||
185 | /* | ||
186 | * A combined memcpy/__copy_user | ||
187 | * __copy_user sets len to 0 for success; else to an upper bound of | ||
188 | * the number of uncopied bytes. | ||
189 | * memcpy sets v0 to dst. | ||
190 | */ | ||
191 | .align 5 | ||
192 | LEAF(__copy_user_inatomic) | ||
193 | /* | ||
194 | * Note: dst & src may be unaligned, len may be 0 | ||
195 | * Temps | ||
196 | */ | ||
197 | #define rem t8 | ||
198 | |||
199 | /* | ||
200 | * The "issue break"s below are very approximate. | ||
201 | * Issue delays for dcache fills will perturb the schedule, as will | ||
202 | * load queue full replay traps, etc. | ||
203 | * | ||
204 | * If len < NBYTES use byte operations. | ||
205 | */ | ||
206 | PREF( 0, 0(src) ) | ||
207 | PREF( 1, 0(dst) ) | ||
208 | sltu t2, len, NBYTES | ||
209 | and t1, dst, ADDRMASK | ||
210 | PREF( 0, 1*32(src) ) | ||
211 | PREF( 1, 1*32(dst) ) | ||
212 | bnez t2, .Lcopy_bytes_checklen | ||
213 | and t0, src, ADDRMASK | ||
214 | PREF( 0, 2*32(src) ) | ||
215 | PREF( 1, 2*32(dst) ) | ||
216 | bnez t1, .Ldst_unaligned | ||
217 | nop | ||
218 | bnez t0, .Lsrc_unaligned_dst_aligned | ||
219 | /* | ||
220 | * use delay slot for fall-through | ||
221 | * src and dst are aligned; need to compute rem | ||
222 | */ | ||
223 | .Lboth_aligned: | ||
224 | SRL t0, len, LOG_NBYTES+3 # +3 for 8 units/iter | ||
225 | beqz t0, .Lcleanup_both_aligned # len < 8*NBYTES | ||
226 | and rem, len, (8*NBYTES-1) # rem = len % (8*NBYTES) | ||
227 | PREF( 0, 3*32(src) ) | ||
228 | PREF( 1, 3*32(dst) ) | ||
229 | .align 4 | ||
230 | 1: | ||
231 | EXC( LOAD t0, UNIT(0)(src), .Ll_exc) | ||
232 | EXC( LOAD t1, UNIT(1)(src), .Ll_exc_copy) | ||
233 | EXC( LOAD t2, UNIT(2)(src), .Ll_exc_copy) | ||
234 | EXC( LOAD t3, UNIT(3)(src), .Ll_exc_copy) | ||
235 | SUB len, len, 8*NBYTES | ||
236 | EXC( LOAD t4, UNIT(4)(src), .Ll_exc_copy) | ||
237 | EXC( LOAD t7, UNIT(5)(src), .Ll_exc_copy) | ||
238 | STORE t0, UNIT(0)(dst) | ||
239 | STORE t1, UNIT(1)(dst) | ||
240 | EXC( LOAD t0, UNIT(6)(src), .Ll_exc_copy) | ||
241 | EXC( LOAD t1, UNIT(7)(src), .Ll_exc_copy) | ||
242 | ADD src, src, 8*NBYTES | ||
243 | ADD dst, dst, 8*NBYTES | ||
244 | STORE t2, UNIT(-6)(dst) | ||
245 | STORE t3, UNIT(-5)(dst) | ||
246 | STORE t4, UNIT(-4)(dst) | ||
247 | STORE t7, UNIT(-3)(dst) | ||
248 | STORE t0, UNIT(-2)(dst) | ||
249 | STORE t1, UNIT(-1)(dst) | ||
250 | PREF( 0, 8*32(src) ) | ||
251 | PREF( 1, 8*32(dst) ) | ||
252 | bne len, rem, 1b | ||
253 | nop | ||
254 | |||
255 | /* | ||
256 | * len == rem == the number of bytes left to copy < 8*NBYTES | ||
257 | */ | ||
258 | .Lcleanup_both_aligned: | ||
259 | beqz len, .Ldone | ||
260 | sltu t0, len, 4*NBYTES | ||
261 | bnez t0, .Lless_than_4units | ||
262 | and rem, len, (NBYTES-1) # rem = len % NBYTES | ||
263 | /* | ||
264 | * len >= 4*NBYTES | ||
265 | */ | ||
266 | EXC( LOAD t0, UNIT(0)(src), .Ll_exc) | ||
267 | EXC( LOAD t1, UNIT(1)(src), .Ll_exc_copy) | ||
268 | EXC( LOAD t2, UNIT(2)(src), .Ll_exc_copy) | ||
269 | EXC( LOAD t3, UNIT(3)(src), .Ll_exc_copy) | ||
270 | SUB len, len, 4*NBYTES | ||
271 | ADD src, src, 4*NBYTES | ||
272 | STORE t0, UNIT(0)(dst) | ||
273 | STORE t1, UNIT(1)(dst) | ||
274 | STORE t2, UNIT(2)(dst) | ||
275 | STORE t3, UNIT(3)(dst) | ||
276 | .set reorder /* DADDI_WAR */ | ||
277 | ADD dst, dst, 4*NBYTES | ||
278 | beqz len, .Ldone | ||
279 | .set noreorder | ||
280 | .Lless_than_4units: | ||
281 | /* | ||
282 | * rem = len % NBYTES | ||
283 | */ | ||
284 | beq rem, len, .Lcopy_bytes | ||
285 | nop | ||
286 | 1: | ||
287 | EXC( LOAD t0, 0(src), .Ll_exc) | ||
288 | ADD src, src, NBYTES | ||
289 | SUB len, len, NBYTES | ||
290 | STORE t0, 0(dst) | ||
291 | .set reorder /* DADDI_WAR */ | ||
292 | ADD dst, dst, NBYTES | ||
293 | bne rem, len, 1b | ||
294 | .set noreorder | ||
295 | |||
296 | /* | ||
297 | * src and dst are aligned, need to copy rem bytes (rem < NBYTES) | ||
298 | * A loop would do only a byte at a time with possible branch | ||
299 | * mispredicts. Can't do an explicit LOAD dst,mask,or,STORE | ||
300 | * because can't assume read-access to dst. Instead, use | ||
301 | * STREST dst, which doesn't require read access to dst. | ||
302 | * | ||
303 | * This code should perform better than a simple loop on modern, | ||
304 | * wide-issue mips processors because the code has fewer branches and | ||
305 | * more instruction-level parallelism. | ||
306 | */ | ||
307 | #define bits t2 | ||
308 | beqz len, .Ldone | ||
309 | ADD t1, dst, len # t1 is just past last byte of dst | ||
310 | li bits, 8*NBYTES | ||
311 | SLL rem, len, 3 # rem = number of bits to keep | ||
312 | EXC( LOAD t0, 0(src), .Ll_exc) | ||
313 | SUB bits, bits, rem # bits = number of bits to discard | ||
314 | SHIFT_DISCARD t0, t0, bits | ||
315 | STREST t0, -1(t1) | ||
316 | jr ra | ||
317 | move len, zero | ||
318 | .Ldst_unaligned: | ||
319 | /* | ||
320 | * dst is unaligned | ||
321 | * t0 = src & ADDRMASK | ||
322 | * t1 = dst & ADDRMASK; T1 > 0 | ||
323 | * len >= NBYTES | ||
324 | * | ||
325 | * Copy enough bytes to align dst | ||
326 | * Set match = (src and dst have same alignment) | ||
327 | */ | ||
328 | #define match rem | ||
329 | EXC( LDFIRST t3, FIRST(0)(src), .Ll_exc) | ||
330 | ADD t2, zero, NBYTES | ||
331 | EXC( LDREST t3, REST(0)(src), .Ll_exc_copy) | ||
332 | SUB t2, t2, t1 # t2 = number of bytes copied | ||
333 | xor match, t0, t1 | ||
334 | STFIRST t3, FIRST(0)(dst) | ||
335 | beq len, t2, .Ldone | ||
336 | SUB len, len, t2 | ||
337 | ADD dst, dst, t2 | ||
338 | beqz match, .Lboth_aligned | ||
339 | ADD src, src, t2 | ||
340 | |||
341 | .Lsrc_unaligned_dst_aligned: | ||
342 | SRL t0, len, LOG_NBYTES+2 # +2 for 4 units/iter | ||
343 | PREF( 0, 3*32(src) ) | ||
344 | beqz t0, .Lcleanup_src_unaligned | ||
345 | and rem, len, (4*NBYTES-1) # rem = len % 4*NBYTES | ||
346 | PREF( 1, 3*32(dst) ) | ||
347 | 1: | ||
348 | /* | ||
349 | * Avoid consecutive LD*'s to the same register since some mips | ||
350 | * implementations can't issue them in the same cycle. | ||
351 | * It's OK to load FIRST(N+1) before REST(N) because the two addresses | ||
352 | * are to the same unit (unless src is aligned, but it's not). | ||
353 | */ | ||
354 | EXC( LDFIRST t0, FIRST(0)(src), .Ll_exc) | ||
355 | EXC( LDFIRST t1, FIRST(1)(src), .Ll_exc_copy) | ||
356 | SUB len, len, 4*NBYTES | ||
357 | EXC( LDREST t0, REST(0)(src), .Ll_exc_copy) | ||
358 | EXC( LDREST t1, REST(1)(src), .Ll_exc_copy) | ||
359 | EXC( LDFIRST t2, FIRST(2)(src), .Ll_exc_copy) | ||
360 | EXC( LDFIRST t3, FIRST(3)(src), .Ll_exc_copy) | ||
361 | EXC( LDREST t2, REST(2)(src), .Ll_exc_copy) | ||
362 | EXC( LDREST t3, REST(3)(src), .Ll_exc_copy) | ||
363 | PREF( 0, 9*32(src) ) # 0 is PREF_LOAD (not streamed) | ||
364 | ADD src, src, 4*NBYTES | ||
365 | #ifdef CONFIG_CPU_SB1 | ||
366 | nop # improves slotting | ||
367 | #endif | ||
368 | STORE t0, UNIT(0)(dst) | ||
369 | STORE t1, UNIT(1)(dst) | ||
370 | STORE t2, UNIT(2)(dst) | ||
371 | STORE t3, UNIT(3)(dst) | ||
372 | PREF( 1, 9*32(dst) ) # 1 is PREF_STORE (not streamed) | ||
373 | .set reorder /* DADDI_WAR */ | ||
374 | ADD dst, dst, 4*NBYTES | ||
375 | bne len, rem, 1b | ||
376 | .set noreorder | ||
377 | |||
378 | .Lcleanup_src_unaligned: | ||
379 | beqz len, .Ldone | ||
380 | and rem, len, NBYTES-1 # rem = len % NBYTES | ||
381 | beq rem, len, .Lcopy_bytes | ||
382 | nop | ||
383 | 1: | ||
384 | EXC( LDFIRST t0, FIRST(0)(src), .Ll_exc) | ||
385 | EXC( LDREST t0, REST(0)(src), .Ll_exc_copy) | ||
386 | ADD src, src, NBYTES | ||
387 | SUB len, len, NBYTES | ||
388 | STORE t0, 0(dst) | ||
389 | .set reorder /* DADDI_WAR */ | ||
390 | ADD dst, dst, NBYTES | ||
391 | bne len, rem, 1b | ||
392 | .set noreorder | ||
393 | |||
394 | .Lcopy_bytes_checklen: | ||
395 | beqz len, .Ldone | ||
396 | nop | ||
397 | .Lcopy_bytes: | ||
398 | /* 0 < len < NBYTES */ | ||
399 | #define COPY_BYTE(N) \ | ||
400 | EXC( lb t0, N(src), .Ll_exc); \ | ||
401 | SUB len, len, 1; \ | ||
402 | beqz len, .Ldone; \ | ||
403 | sb t0, N(dst) | ||
404 | |||
405 | COPY_BYTE(0) | ||
406 | COPY_BYTE(1) | ||
407 | #ifdef USE_DOUBLE | ||
408 | COPY_BYTE(2) | ||
409 | COPY_BYTE(3) | ||
410 | COPY_BYTE(4) | ||
411 | COPY_BYTE(5) | ||
412 | #endif | ||
413 | EXC( lb t0, NBYTES-2(src), .Ll_exc) | ||
414 | SUB len, len, 1 | ||
415 | jr ra | ||
416 | sb t0, NBYTES-2(dst) | ||
417 | .Ldone: | ||
418 | jr ra | ||
419 | nop | ||
420 | END(__copy_user_inatomic) | ||
421 | |||
422 | .Ll_exc_copy: | ||
423 | /* | ||
424 | * Copy bytes from src until faulting load address (or until a | ||
425 | * lb faults) | ||
426 | * | ||
427 | * When reached by a faulting LDFIRST/LDREST, THREAD_BUADDR($28) | ||
428 | * may be more than a byte beyond the last address. | ||
429 | * Hence, the lb below may get an exception. | ||
430 | * | ||
431 | * Assumes src < THREAD_BUADDR($28) | ||
432 | */ | ||
433 | LOAD t0, TI_TASK($28) | ||
434 | nop | ||
435 | LOAD t0, THREAD_BUADDR(t0) | ||
436 | 1: | ||
437 | EXC( lb t1, 0(src), .Ll_exc) | ||
438 | ADD src, src, 1 | ||
439 | sb t1, 0(dst) # can't fault -- we're copy_from_user | ||
440 | .set reorder /* DADDI_WAR */ | ||
441 | ADD dst, dst, 1 | ||
442 | bne src, t0, 1b | ||
443 | .set noreorder | ||
444 | .Ll_exc: | ||
445 | LOAD t0, TI_TASK($28) | ||
446 | nop | ||
447 | LOAD t0, THREAD_BUADDR(t0) # t0 is just past last good address | ||
448 | nop | ||
449 | SUB len, AT, t0 # len number of uncopied bytes | ||
450 | jr ra | ||
451 | nop | ||
diff --git a/arch/mips/mipssim/Makefile b/arch/mips/mipssim/Makefile new file mode 100644 index 00000000000..01410a3f172 --- /dev/null +++ b/arch/mips/mipssim/Makefile | |||
@@ -0,0 +1,23 @@ | |||
1 | # | ||
2 | # Copyright (C) 2005 MIPS Technologies, Inc. All rights reserved. | ||
3 | # Copyright (C) 2007 MIPS Technologies, Inc. | ||
4 | # written by Ralf Baechle (ralf@linux-mips.org) | ||
5 | # | ||
6 | # This program is free software; you can distribute it and/or modify it | ||
7 | # under the terms of the GNU General Public License (Version 2) as | ||
8 | # published by the Free Software Foundation. | ||
9 | # | ||
10 | # This program is distributed in the hope it will be useful, but WITHOUT | ||
11 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
12 | # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | ||
13 | # for more details. | ||
14 | # | ||
15 | # You should have received a copy of the GNU General Public License along | ||
16 | # with this program; if not, write to the Free Software Foundation, Inc., | ||
17 | # 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. | ||
18 | # | ||
19 | |||
20 | obj-y := sim_platform.o sim_setup.o sim_mem.o sim_time.o sim_int.o | ||
21 | |||
22 | obj-$(CONFIG_EARLY_PRINTK) += sim_console.o | ||
23 | obj-$(CONFIG_MIPS_MT_SMTC) += sim_smtc.o | ||
diff --git a/arch/mips/mipssim/Platform b/arch/mips/mipssim/Platform new file mode 100644 index 00000000000..3df60b8a12e --- /dev/null +++ b/arch/mips/mipssim/Platform | |||
@@ -0,0 +1,6 @@ | |||
1 | # | ||
2 | # MIPS SIM | ||
3 | # | ||
4 | platform-$(CONFIG_MIPS_SIM) += mipssim/ | ||
5 | cflags-$(CONFIG_MIPS_SIM) += -I$(srctree)/arch/mips/include/asm/mach-mipssim | ||
6 | load-$(CONFIG_MIPS_SIM) += 0x80100000 | ||
diff --git a/arch/mips/mipssim/sim_console.c b/arch/mips/mipssim/sim_console.c new file mode 100644 index 00000000000..a2f41672cd5 --- /dev/null +++ b/arch/mips/mipssim/sim_console.c | |||
@@ -0,0 +1,40 @@ | |||
1 | /* | ||
2 | * This program is free software; you can distribute it and/or modify it | ||
3 | * under the terms of the GNU General Public License (Version 2) as | ||
4 | * published by the Free Software Foundation. | ||
5 | * | ||
6 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
7 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
8 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | ||
9 | * for more details. | ||
10 | * | ||
11 | * You should have received a copy of the GNU General Public License along | ||
12 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
13 | * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. | ||
14 | * | ||
15 | * Carsten Langgaard, carstenl@mips.com | ||
16 | * Copyright (C) 1999,2000 MIPS Technologies, Inc. All rights reserved. | ||
17 | * Copyright (C) 2007 MIPS Technologies, Inc. | ||
18 | * written by Ralf Baechle | ||
19 | */ | ||
20 | #include <linux/init.h> | ||
21 | #include <linux/io.h> | ||
22 | #include <linux/serial_reg.h> | ||
23 | |||
24 | static inline unsigned int serial_in(int offset) | ||
25 | { | ||
26 | return inb(0x3f8 + offset); | ||
27 | } | ||
28 | |||
29 | static inline void serial_out(int offset, int value) | ||
30 | { | ||
31 | outb(value, 0x3f8 + offset); | ||
32 | } | ||
33 | |||
34 | void __init prom_putchar(char c) | ||
35 | { | ||
36 | while ((serial_in(UART_LSR) & UART_LSR_THRE) == 0) | ||
37 | ; | ||
38 | |||
39 | serial_out(UART_TX, c); | ||
40 | } | ||
diff --git a/arch/mips/mipssim/sim_int.c b/arch/mips/mipssim/sim_int.c new file mode 100644 index 00000000000..5c779be6f08 --- /dev/null +++ b/arch/mips/mipssim/sim_int.c | |||
@@ -0,0 +1,87 @@ | |||
1 | /* | ||
2 | * Copyright (C) 1999, 2005 MIPS Technologies, Inc. All rights reserved. | ||
3 | * | ||
4 | * This program is free software; you can distribute it and/or modify it | ||
5 | * under the terms of the GNU General Public License (Version 2) as | ||
6 | * published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | ||
11 | * for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License along | ||
14 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
15 | * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. | ||
16 | * | ||
17 | */ | ||
18 | #include <linux/init.h> | ||
19 | #include <linux/sched.h> | ||
20 | #include <linux/interrupt.h> | ||
21 | #include <linux/kernel_stat.h> | ||
22 | #include <asm/mips-boards/simint.h> | ||
23 | #include <asm/irq_cpu.h> | ||
24 | |||
25 | static inline int clz(unsigned long x) | ||
26 | { | ||
27 | __asm__( | ||
28 | " .set push \n" | ||
29 | " .set mips32 \n" | ||
30 | " clz %0, %1 \n" | ||
31 | " .set pop \n" | ||
32 | : "=r" (x) | ||
33 | : "r" (x)); | ||
34 | |||
35 | return x; | ||
36 | } | ||
37 | |||
38 | /* | ||
39 | * Version of ffs that only looks at bits 12..15. | ||
40 | */ | ||
41 | static inline unsigned int irq_ffs(unsigned int pending) | ||
42 | { | ||
43 | #if defined(CONFIG_CPU_MIPS32) || defined(CONFIG_CPU_MIPS64) | ||
44 | return -clz(pending) + 31 - CAUSEB_IP; | ||
45 | #else | ||
46 | unsigned int a0 = 7; | ||
47 | unsigned int t0; | ||
48 | |||
49 | t0 = s0 & 0xf000; | ||
50 | t0 = t0 < 1; | ||
51 | t0 = t0 << 2; | ||
52 | a0 = a0 - t0; | ||
53 | s0 = s0 << t0; | ||
54 | |||
55 | t0 = s0 & 0xc000; | ||
56 | t0 = t0 < 1; | ||
57 | t0 = t0 << 1; | ||
58 | a0 = a0 - t0; | ||
59 | s0 = s0 << t0; | ||
60 | |||
61 | t0 = s0 & 0x8000; | ||
62 | t0 = t0 < 1; | ||
63 | /* t0 = t0 << 2; */ | ||
64 | a0 = a0 - t0; | ||
65 | /* s0 = s0 << t0; */ | ||
66 | |||
67 | return a0; | ||
68 | #endif | ||
69 | } | ||
70 | |||
71 | asmlinkage void plat_irq_dispatch(void) | ||
72 | { | ||
73 | unsigned int pending = read_c0_cause() & read_c0_status() & ST0_IM; | ||
74 | int irq; | ||
75 | |||
76 | irq = irq_ffs(pending); | ||
77 | |||
78 | if (irq > 0) | ||
79 | do_IRQ(MIPS_CPU_IRQ_BASE + irq); | ||
80 | else | ||
81 | spurious_interrupt(); | ||
82 | } | ||
83 | |||
84 | void __init arch_init_irq(void) | ||
85 | { | ||
86 | mips_cpu_irq_init(); | ||
87 | } | ||
diff --git a/arch/mips/mipssim/sim_mem.c b/arch/mips/mipssim/sim_mem.c new file mode 100644 index 00000000000..953d836a771 --- /dev/null +++ b/arch/mips/mipssim/sim_mem.c | |||
@@ -0,0 +1,115 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2005 MIPS Technologies, Inc. All rights reserved. | ||
3 | * | ||
4 | * This program is free software; you can distribute it and/or modify it | ||
5 | * under the terms of the GNU General Public License (Version 2) as | ||
6 | * published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | ||
11 | * for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License along | ||
14 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
15 | * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. | ||
16 | * | ||
17 | */ | ||
18 | #include <linux/init.h> | ||
19 | #include <linux/mm.h> | ||
20 | #include <linux/bootmem.h> | ||
21 | #include <linux/pfn.h> | ||
22 | |||
23 | #include <asm/bootinfo.h> | ||
24 | #include <asm/page.h> | ||
25 | #include <asm/sections.h> | ||
26 | |||
27 | #include <asm/mips-boards/prom.h> | ||
28 | |||
29 | /*#define DEBUG*/ | ||
30 | |||
31 | enum simmem_memtypes { | ||
32 | simmem_reserved = 0, | ||
33 | simmem_free, | ||
34 | }; | ||
35 | struct prom_pmemblock mdesc[PROM_MAX_PMEMBLOCKS]; | ||
36 | |||
37 | #ifdef DEBUG | ||
38 | static char *mtypes[3] = { | ||
39 | "SIM reserved memory", | ||
40 | "SIM free memory", | ||
41 | }; | ||
42 | #endif | ||
43 | |||
44 | struct prom_pmemblock * __init prom_getmdesc(void) | ||
45 | { | ||
46 | unsigned int memsize; | ||
47 | |||
48 | memsize = 0x02000000; | ||
49 | pr_info("Setting default memory size 0x%08x\n", memsize); | ||
50 | |||
51 | memset(mdesc, 0, sizeof(mdesc)); | ||
52 | |||
53 | mdesc[0].type = simmem_reserved; | ||
54 | mdesc[0].base = 0x00000000; | ||
55 | mdesc[0].size = 0x00001000; | ||
56 | |||
57 | mdesc[1].type = simmem_free; | ||
58 | mdesc[1].base = 0x00001000; | ||
59 | mdesc[1].size = 0x000ff000; | ||
60 | |||
61 | mdesc[2].type = simmem_reserved; | ||
62 | mdesc[2].base = 0x00100000; | ||
63 | mdesc[2].size = CPHYSADDR(PFN_ALIGN(&_end)) - mdesc[2].base; | ||
64 | |||
65 | mdesc[3].type = simmem_free; | ||
66 | mdesc[3].base = CPHYSADDR(PFN_ALIGN(&_end)); | ||
67 | mdesc[3].size = memsize - mdesc[3].base; | ||
68 | |||
69 | return &mdesc[0]; | ||
70 | } | ||
71 | |||
72 | static int __init prom_memtype_classify(unsigned int type) | ||
73 | { | ||
74 | switch (type) { | ||
75 | case simmem_free: | ||
76 | return BOOT_MEM_RAM; | ||
77 | case simmem_reserved: | ||
78 | default: | ||
79 | return BOOT_MEM_RESERVED; | ||
80 | } | ||
81 | } | ||
82 | |||
83 | void __init prom_meminit(void) | ||
84 | { | ||
85 | struct prom_pmemblock *p; | ||
86 | |||
87 | p = prom_getmdesc(); | ||
88 | |||
89 | while (p->size) { | ||
90 | long type; | ||
91 | unsigned long base, size; | ||
92 | |||
93 | type = prom_memtype_classify(p->type); | ||
94 | base = p->base; | ||
95 | size = p->size; | ||
96 | |||
97 | add_memory_region(base, size, type); | ||
98 | p++; | ||
99 | } | ||
100 | } | ||
101 | |||
102 | void __init prom_free_prom_memory(void) | ||
103 | { | ||
104 | int i; | ||
105 | unsigned long addr; | ||
106 | |||
107 | for (i = 0; i < boot_mem_map.nr_map; i++) { | ||
108 | if (boot_mem_map.map[i].type != BOOT_MEM_ROM_DATA) | ||
109 | continue; | ||
110 | |||
111 | addr = boot_mem_map.map[i].addr; | ||
112 | free_init_pages("prom memory", | ||
113 | addr, addr + boot_mem_map.map[i].size); | ||
114 | } | ||
115 | } | ||
diff --git a/arch/mips/mipssim/sim_platform.c b/arch/mips/mipssim/sim_platform.c new file mode 100644 index 00000000000..53210a8c5de --- /dev/null +++ b/arch/mips/mipssim/sim_platform.c | |||
@@ -0,0 +1,35 @@ | |||
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 by Ralf Baechle (ralf@linux-mips.org) | ||
7 | */ | ||
8 | #include <linux/init.h> | ||
9 | #include <linux/if_ether.h> | ||
10 | #include <linux/kernel.h> | ||
11 | #include <linux/platform_device.h> | ||
12 | |||
13 | static char mipsnet_string[] = "mipsnet"; | ||
14 | |||
15 | static struct platform_device eth1_device = { | ||
16 | .name = mipsnet_string, | ||
17 | .id = 0, | ||
18 | }; | ||
19 | |||
20 | /* | ||
21 | * Create a platform device for the GPI port that receives the | ||
22 | * image data from the embedded camera. | ||
23 | */ | ||
24 | static int __init mipsnet_devinit(void) | ||
25 | { | ||
26 | int err; | ||
27 | |||
28 | err = platform_device_register(ð1_device); | ||
29 | if (err) | ||
30 | printk(KERN_ERR "%s: registration failed\n", mipsnet_string); | ||
31 | |||
32 | return err; | ||
33 | } | ||
34 | |||
35 | device_initcall(mipsnet_devinit); | ||
diff --git a/arch/mips/mipssim/sim_setup.c b/arch/mips/mipssim/sim_setup.c new file mode 100644 index 00000000000..256e0cdaa49 --- /dev/null +++ b/arch/mips/mipssim/sim_setup.c | |||
@@ -0,0 +1,99 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2005 MIPS Technologies, Inc. All rights reserved. | ||
3 | * | ||
4 | * This program is free software; you can distribute it and/or modify it | ||
5 | * under the terms of the GNU General Public License (Version 2) as | ||
6 | * published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | ||
11 | * for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License along | ||
14 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
15 | * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. | ||
16 | * | ||
17 | */ | ||
18 | |||
19 | #include <linux/init.h> | ||
20 | #include <linux/string.h> | ||
21 | #include <linux/kernel.h> | ||
22 | #include <linux/io.h> | ||
23 | #include <linux/irq.h> | ||
24 | #include <linux/ioport.h> | ||
25 | #include <linux/tty.h> | ||
26 | #include <linux/serial.h> | ||
27 | #include <linux/serial_core.h> | ||
28 | #include <linux/serial_8250.h> | ||
29 | |||
30 | #include <asm/cpu.h> | ||
31 | #include <asm/bootinfo.h> | ||
32 | #include <asm/mips-boards/generic.h> | ||
33 | #include <asm/mips-boards/prom.h> | ||
34 | #include <asm/time.h> | ||
35 | #include <asm/mips-boards/sim.h> | ||
36 | #include <asm/mips-boards/simint.h> | ||
37 | #include <asm/smp-ops.h> | ||
38 | |||
39 | |||
40 | static void __init serial_init(void); | ||
41 | unsigned int _isbonito; | ||
42 | |||
43 | const char *get_system_type(void) | ||
44 | { | ||
45 | return "MIPSsim"; | ||
46 | } | ||
47 | |||
48 | void __init plat_mem_setup(void) | ||
49 | { | ||
50 | set_io_port_base(0xbfd00000); | ||
51 | |||
52 | serial_init(); | ||
53 | } | ||
54 | |||
55 | extern struct plat_smp_ops ssmtc_smp_ops; | ||
56 | |||
57 | void __init prom_init(void) | ||
58 | { | ||
59 | set_io_port_base(0xbfd00000); | ||
60 | |||
61 | prom_meminit(); | ||
62 | |||
63 | if (cpu_has_mipsmt) { | ||
64 | if (!register_vsmp_smp_ops()) | ||
65 | return; | ||
66 | |||
67 | #ifdef CONFIG_MIPS_MT_SMTC | ||
68 | register_smp_ops(&ssmtc_smp_ops); | ||
69 | return; | ||
70 | #endif | ||
71 | } | ||
72 | |||
73 | register_up_smp_ops(); | ||
74 | } | ||
75 | |||
76 | static void __init serial_init(void) | ||
77 | { | ||
78 | #ifdef CONFIG_SERIAL_8250 | ||
79 | struct uart_port s; | ||
80 | |||
81 | memset(&s, 0, sizeof(s)); | ||
82 | |||
83 | s.iobase = 0x3f8; | ||
84 | |||
85 | /* hardware int 4 - the serial int, is CPU int 6 | ||
86 | but poll for now */ | ||
87 | s.irq = 0; | ||
88 | s.uartclk = 1843200; | ||
89 | s.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST; | ||
90 | s.iotype = UPIO_PORT; | ||
91 | s.regshift = 0; | ||
92 | s.timeout = 4; | ||
93 | |||
94 | if (early_serial_setup(&s) != 0) { | ||
95 | printk(KERN_ERR "Serial setup failed!\n"); | ||
96 | } | ||
97 | |||
98 | #endif | ||
99 | } | ||
diff --git a/arch/mips/mipssim/sim_smtc.c b/arch/mips/mipssim/sim_smtc.c new file mode 100644 index 00000000000..915063991f6 --- /dev/null +++ b/arch/mips/mipssim/sim_smtc.c | |||
@@ -0,0 +1,117 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2005 MIPS Technologies, Inc. All rights reserved. | ||
3 | * | ||
4 | * This program is free software; you can distribute it and/or modify it | ||
5 | * under the terms of the GNU General Public License (Version 2) as | ||
6 | * published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | ||
11 | * for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License along | ||
14 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
15 | * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. | ||
16 | * | ||
17 | */ | ||
18 | /* | ||
19 | * Simulator Platform-specific hooks for SMTC operation | ||
20 | */ | ||
21 | #include <linux/kernel.h> | ||
22 | #include <linux/sched.h> | ||
23 | #include <linux/cpumask.h> | ||
24 | #include <linux/interrupt.h> | ||
25 | #include <linux/smp.h> | ||
26 | |||
27 | #include <linux/atomic.h> | ||
28 | #include <asm/cpu.h> | ||
29 | #include <asm/processor.h> | ||
30 | #include <asm/smtc.h> | ||
31 | #include <asm/system.h> | ||
32 | #include <asm/mmu_context.h> | ||
33 | #include <asm/smtc_ipi.h> | ||
34 | |||
35 | /* VPE/SMP Prototype implements platform interfaces directly */ | ||
36 | |||
37 | /* | ||
38 | * Cause the specified action to be performed on a targeted "CPU" | ||
39 | */ | ||
40 | |||
41 | static void ssmtc_send_ipi_single(int cpu, unsigned int action) | ||
42 | { | ||
43 | smtc_send_ipi(cpu, LINUX_SMP_IPI, action); | ||
44 | /* "CPU" may be TC of same VPE, VPE of same CPU, or different CPU */ | ||
45 | } | ||
46 | |||
47 | static inline void ssmtc_send_ipi_mask(const struct cpumask *mask, | ||
48 | unsigned int action) | ||
49 | { | ||
50 | unsigned int i; | ||
51 | |||
52 | for_each_cpu(i, mask) | ||
53 | ssmtc_send_ipi_single(i, action); | ||
54 | } | ||
55 | |||
56 | /* | ||
57 | * Post-config but pre-boot cleanup entry point | ||
58 | */ | ||
59 | static void __cpuinit ssmtc_init_secondary(void) | ||
60 | { | ||
61 | smtc_init_secondary(); | ||
62 | } | ||
63 | |||
64 | /* | ||
65 | * SMP initialization finalization entry point | ||
66 | */ | ||
67 | static void __cpuinit ssmtc_smp_finish(void) | ||
68 | { | ||
69 | smtc_smp_finish(); | ||
70 | } | ||
71 | |||
72 | /* | ||
73 | * Hook for after all CPUs are online | ||
74 | */ | ||
75 | static void ssmtc_cpus_done(void) | ||
76 | { | ||
77 | } | ||
78 | |||
79 | /* | ||
80 | * Platform "CPU" startup hook | ||
81 | */ | ||
82 | static void __cpuinit ssmtc_boot_secondary(int cpu, struct task_struct *idle) | ||
83 | { | ||
84 | smtc_boot_secondary(cpu, idle); | ||
85 | } | ||
86 | |||
87 | static void __init ssmtc_smp_setup(void) | ||
88 | { | ||
89 | if (read_c0_config3() & (1 << 2)) | ||
90 | mipsmt_build_cpu_map(0); | ||
91 | } | ||
92 | |||
93 | /* | ||
94 | * Platform SMP pre-initialization | ||
95 | */ | ||
96 | static void ssmtc_prepare_cpus(unsigned int max_cpus) | ||
97 | { | ||
98 | /* | ||
99 | * As noted above, we can assume a single CPU for now | ||
100 | * but it may be multithreaded. | ||
101 | */ | ||
102 | |||
103 | if (read_c0_config3() & (1 << 2)) { | ||
104 | mipsmt_prepare_cpus(); | ||
105 | } | ||
106 | } | ||
107 | |||
108 | struct plat_smp_ops ssmtc_smp_ops = { | ||
109 | .send_ipi_single = ssmtc_send_ipi_single, | ||
110 | .send_ipi_mask = ssmtc_send_ipi_mask, | ||
111 | .init_secondary = ssmtc_init_secondary, | ||
112 | .smp_finish = ssmtc_smp_finish, | ||
113 | .cpus_done = ssmtc_cpus_done, | ||
114 | .boot_secondary = ssmtc_boot_secondary, | ||
115 | .smp_setup = ssmtc_smp_setup, | ||
116 | .prepare_cpus = ssmtc_prepare_cpus, | ||
117 | }; | ||
diff --git a/arch/mips/mipssim/sim_time.c b/arch/mips/mipssim/sim_time.c new file mode 100644 index 00000000000..5492c42f765 --- /dev/null +++ b/arch/mips/mipssim/sim_time.c | |||
@@ -0,0 +1,116 @@ | |||
1 | #include <linux/types.h> | ||
2 | #include <linux/init.h> | ||
3 | #include <linux/kernel_stat.h> | ||
4 | #include <linux/sched.h> | ||
5 | #include <linux/spinlock.h> | ||
6 | #include <linux/interrupt.h> | ||
7 | #include <linux/mc146818rtc.h> | ||
8 | #include <linux/smp.h> | ||
9 | #include <linux/timex.h> | ||
10 | |||
11 | #include <asm/hardirq.h> | ||
12 | #include <asm/div64.h> | ||
13 | #include <asm/cpu.h> | ||
14 | #include <asm/time.h> | ||
15 | #include <asm/irq.h> | ||
16 | #include <asm/mc146818-time.h> | ||
17 | #include <asm/msc01_ic.h> | ||
18 | |||
19 | #include <asm/mips-boards/generic.h> | ||
20 | #include <asm/mips-boards/prom.h> | ||
21 | #include <asm/mips-boards/simint.h> | ||
22 | |||
23 | |||
24 | unsigned long cpu_khz; | ||
25 | |||
26 | /* | ||
27 | * Estimate CPU frequency. Sets mips_hpt_frequency as a side-effect | ||
28 | */ | ||
29 | static unsigned int __init estimate_cpu_frequency(void) | ||
30 | { | ||
31 | unsigned int prid = read_c0_prid() & 0xffff00; | ||
32 | unsigned int count; | ||
33 | |||
34 | #if 1 | ||
35 | /* | ||
36 | * hardwire the board frequency to 12MHz. | ||
37 | */ | ||
38 | |||
39 | if ((prid == (PRID_COMP_MIPS | PRID_IMP_20KC)) || | ||
40 | (prid == (PRID_COMP_MIPS | PRID_IMP_25KF))) | ||
41 | count = 12000000; | ||
42 | else | ||
43 | count = 6000000; | ||
44 | #else | ||
45 | unsigned int flags; | ||
46 | |||
47 | local_irq_save(flags); | ||
48 | |||
49 | /* Start counter exactly on falling edge of update flag */ | ||
50 | while (CMOS_READ(RTC_REG_A) & RTC_UIP); | ||
51 | while (!(CMOS_READ(RTC_REG_A) & RTC_UIP)); | ||
52 | |||
53 | /* Start r4k counter. */ | ||
54 | write_c0_count(0); | ||
55 | |||
56 | /* Read counter exactly on falling edge of update flag */ | ||
57 | while (CMOS_READ(RTC_REG_A) & RTC_UIP); | ||
58 | while (!(CMOS_READ(RTC_REG_A) & RTC_UIP)); | ||
59 | |||
60 | count = read_c0_count(); | ||
61 | |||
62 | /* restore interrupts */ | ||
63 | local_irq_restore(flags); | ||
64 | #endif | ||
65 | |||
66 | mips_hpt_frequency = count; | ||
67 | |||
68 | if ((prid != (PRID_COMP_MIPS | PRID_IMP_20KC)) && | ||
69 | (prid != (PRID_COMP_MIPS | PRID_IMP_25KF))) | ||
70 | count *= 2; | ||
71 | |||
72 | count += 5000; /* round */ | ||
73 | count -= count%10000; | ||
74 | |||
75 | return count; | ||
76 | } | ||
77 | |||
78 | static int mips_cpu_timer_irq; | ||
79 | |||
80 | static void mips_timer_dispatch(void) | ||
81 | { | ||
82 | do_IRQ(mips_cpu_timer_irq); | ||
83 | } | ||
84 | |||
85 | |||
86 | unsigned __cpuinit get_c0_compare_int(void) | ||
87 | { | ||
88 | #ifdef MSC01E_INT_BASE | ||
89 | if (cpu_has_veic) { | ||
90 | set_vi_handler(MSC01E_INT_CPUCTR, mips_timer_dispatch); | ||
91 | mips_cpu_timer_irq = MSC01E_INT_BASE + MSC01E_INT_CPUCTR; | ||
92 | |||
93 | return mips_cpu_timer_irq; | ||
94 | } | ||
95 | #endif | ||
96 | if (cpu_has_vint) | ||
97 | set_vi_handler(cp0_compare_irq, mips_timer_dispatch); | ||
98 | mips_cpu_timer_irq = MIPS_CPU_IRQ_BASE + cp0_compare_irq; | ||
99 | |||
100 | return mips_cpu_timer_irq; | ||
101 | } | ||
102 | |||
103 | void __init plat_time_init(void) | ||
104 | { | ||
105 | unsigned int est_freq; | ||
106 | |||
107 | /* Set Data mode - binary. */ | ||
108 | CMOS_WRITE(CMOS_READ(RTC_CONTROL) | RTC_DM_BINARY, RTC_CONTROL); | ||
109 | |||
110 | est_freq = estimate_cpu_frequency(); | ||
111 | |||
112 | printk(KERN_INFO "CPU frequency %d.%02d MHz\n", est_freq / 1000000, | ||
113 | (est_freq % 1000000) * 100 / 1000000); | ||
114 | |||
115 | cpu_khz = est_freq / 1000; | ||
116 | } | ||
diff --git a/arch/mips/netlogic/xlr/irq.c b/arch/mips/netlogic/xlr/irq.c new file mode 100644 index 00000000000..521bb7377eb --- /dev/null +++ b/arch/mips/netlogic/xlr/irq.c | |||
@@ -0,0 +1,300 @@ | |||
1 | /* | ||
2 | * Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights | ||
3 | * reserved. | ||
4 | * | ||
5 | * This software is available to you under a choice of one of two | ||
6 | * licenses. You may choose to be licensed under the terms of the GNU | ||
7 | * General Public License (GPL) Version 2, available from the file | ||
8 | * COPYING in the main directory of this source tree, or the NetLogic | ||
9 | * license below: | ||
10 | * | ||
11 | * Redistribution and use in source and binary forms, with or without | ||
12 | * modification, are permitted provided that the following conditions | ||
13 | * are met: | ||
14 | * | ||
15 | * 1. Redistributions of source code must retain the above copyright | ||
16 | * notice, this list of conditions and the following disclaimer. | ||
17 | * 2. Redistributions in binary form must reproduce the above copyright | ||
18 | * notice, this list of conditions and the following disclaimer in | ||
19 | * the documentation and/or other materials provided with the | ||
20 | * distribution. | ||
21 | * | ||
22 | * THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR | ||
23 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
24 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||
25 | * ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE | ||
26 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||
27 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||
28 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR | ||
29 | * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | ||
30 | * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE | ||
31 | * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN | ||
32 | * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
33 | */ | ||
34 | |||
35 | #include <linux/kernel.h> | ||
36 | #include <linux/init.h> | ||
37 | #include <linux/linkage.h> | ||
38 | #include <linux/interrupt.h> | ||
39 | #include <linux/spinlock.h> | ||
40 | #include <linux/mm.h> | ||
41 | |||
42 | #include <asm/mipsregs.h> | ||
43 | |||
44 | #include <asm/netlogic/xlr/iomap.h> | ||
45 | #include <asm/netlogic/xlr/pic.h> | ||
46 | #include <asm/netlogic/xlr/xlr.h> | ||
47 | |||
48 | #include <asm/netlogic/interrupt.h> | ||
49 | #include <asm/netlogic/mips-extns.h> | ||
50 | |||
51 | static u64 nlm_irq_mask; | ||
52 | static DEFINE_SPINLOCK(nlm_pic_lock); | ||
53 | |||
54 | static void xlr_pic_enable(struct irq_data *d) | ||
55 | { | ||
56 | nlm_reg_t *mmio = netlogic_io_mmio(NETLOGIC_IO_PIC_OFFSET); | ||
57 | unsigned long flags; | ||
58 | nlm_reg_t reg; | ||
59 | int irq = d->irq; | ||
60 | |||
61 | WARN(!PIC_IRQ_IS_IRT(irq), "Bad irq %d", irq); | ||
62 | |||
63 | spin_lock_irqsave(&nlm_pic_lock, flags); | ||
64 | reg = netlogic_read_reg(mmio, PIC_IRT_1_BASE + irq - PIC_IRQ_BASE); | ||
65 | netlogic_write_reg(mmio, PIC_IRT_1_BASE + irq - PIC_IRQ_BASE, | ||
66 | reg | (1 << 6) | (1 << 30) | (1 << 31)); | ||
67 | spin_unlock_irqrestore(&nlm_pic_lock, flags); | ||
68 | } | ||
69 | |||
70 | static void xlr_pic_mask(struct irq_data *d) | ||
71 | { | ||
72 | nlm_reg_t *mmio = netlogic_io_mmio(NETLOGIC_IO_PIC_OFFSET); | ||
73 | unsigned long flags; | ||
74 | nlm_reg_t reg; | ||
75 | int irq = d->irq; | ||
76 | |||
77 | WARN(!PIC_IRQ_IS_IRT(irq), "Bad irq %d", irq); | ||
78 | |||
79 | spin_lock_irqsave(&nlm_pic_lock, flags); | ||
80 | reg = netlogic_read_reg(mmio, PIC_IRT_1_BASE + irq - PIC_IRQ_BASE); | ||
81 | netlogic_write_reg(mmio, PIC_IRT_1_BASE + irq - PIC_IRQ_BASE, | ||
82 | reg | (1 << 6) | (1 << 30) | (0 << 31)); | ||
83 | spin_unlock_irqrestore(&nlm_pic_lock, flags); | ||
84 | } | ||
85 | |||
86 | #ifdef CONFIG_PCI | ||
87 | /* Extra ACK needed for XLR on chip PCI controller */ | ||
88 | static void xlr_pci_ack(struct irq_data *d) | ||
89 | { | ||
90 | nlm_reg_t *pci_mmio = netlogic_io_mmio(NETLOGIC_IO_PCIX_OFFSET); | ||
91 | |||
92 | netlogic_read_reg(pci_mmio, (0x140 >> 2)); | ||
93 | } | ||
94 | |||
95 | /* Extra ACK needed for XLS on chip PCIe controller */ | ||
96 | static void xls_pcie_ack(struct irq_data *d) | ||
97 | { | ||
98 | nlm_reg_t *pcie_mmio_le = netlogic_io_mmio(NETLOGIC_IO_PCIE_1_OFFSET); | ||
99 | |||
100 | switch (d->irq) { | ||
101 | case PIC_PCIE_LINK0_IRQ: | ||
102 | netlogic_write_reg(pcie_mmio_le, (0x90 >> 2), 0xffffffff); | ||
103 | break; | ||
104 | case PIC_PCIE_LINK1_IRQ: | ||
105 | netlogic_write_reg(pcie_mmio_le, (0x94 >> 2), 0xffffffff); | ||
106 | break; | ||
107 | case PIC_PCIE_LINK2_IRQ: | ||
108 | netlogic_write_reg(pcie_mmio_le, (0x190 >> 2), 0xffffffff); | ||
109 | break; | ||
110 | case PIC_PCIE_LINK3_IRQ: | ||
111 | netlogic_write_reg(pcie_mmio_le, (0x194 >> 2), 0xffffffff); | ||
112 | break; | ||
113 | } | ||
114 | } | ||
115 | |||
116 | /* For XLS B silicon, the 3,4 PCI interrupts are different */ | ||
117 | static void xls_pcie_ack_b(struct irq_data *d) | ||
118 | { | ||
119 | nlm_reg_t *pcie_mmio_le = netlogic_io_mmio(NETLOGIC_IO_PCIE_1_OFFSET); | ||
120 | |||
121 | switch (d->irq) { | ||
122 | case PIC_PCIE_LINK0_IRQ: | ||
123 | netlogic_write_reg(pcie_mmio_le, (0x90 >> 2), 0xffffffff); | ||
124 | break; | ||
125 | case PIC_PCIE_LINK1_IRQ: | ||
126 | netlogic_write_reg(pcie_mmio_le, (0x94 >> 2), 0xffffffff); | ||
127 | break; | ||
128 | case PIC_PCIE_XLSB0_LINK2_IRQ: | ||
129 | netlogic_write_reg(pcie_mmio_le, (0x190 >> 2), 0xffffffff); | ||
130 | break; | ||
131 | case PIC_PCIE_XLSB0_LINK3_IRQ: | ||
132 | netlogic_write_reg(pcie_mmio_le, (0x194 >> 2), 0xffffffff); | ||
133 | break; | ||
134 | } | ||
135 | } | ||
136 | #endif | ||
137 | |||
138 | static void xlr_pic_ack(struct irq_data *d) | ||
139 | { | ||
140 | unsigned long flags; | ||
141 | nlm_reg_t *mmio; | ||
142 | int irq = d->irq; | ||
143 | void *hd = irq_data_get_irq_handler_data(d); | ||
144 | |||
145 | WARN(!PIC_IRQ_IS_IRT(irq), "Bad irq %d", irq); | ||
146 | |||
147 | if (hd) { | ||
148 | void (*extra_ack)(void *) = hd; | ||
149 | extra_ack(d); | ||
150 | } | ||
151 | mmio = netlogic_io_mmio(NETLOGIC_IO_PIC_OFFSET); | ||
152 | spin_lock_irqsave(&nlm_pic_lock, flags); | ||
153 | netlogic_write_reg(mmio, PIC_INT_ACK, (1 << (irq - PIC_IRQ_BASE))); | ||
154 | spin_unlock_irqrestore(&nlm_pic_lock, flags); | ||
155 | } | ||
156 | |||
157 | /* | ||
158 | * This chip definition handles interrupts routed thru the XLR | ||
159 | * hardware PIC, currently IRQs 8-39 are mapped to hardware intr | ||
160 | * 0-31 wired the XLR PIC | ||
161 | */ | ||
162 | static struct irq_chip xlr_pic = { | ||
163 | .name = "XLR-PIC", | ||
164 | .irq_enable = xlr_pic_enable, | ||
165 | .irq_mask = xlr_pic_mask, | ||
166 | .irq_ack = xlr_pic_ack, | ||
167 | }; | ||
168 | |||
169 | static void rsvd_irq_handler(struct irq_data *d) | ||
170 | { | ||
171 | WARN(d->irq >= PIC_IRQ_BASE, "Bad irq %d", d->irq); | ||
172 | } | ||
173 | |||
174 | /* | ||
175 | * Chip definition for CPU originated interrupts(timer, msg) and | ||
176 | * IPIs | ||
177 | */ | ||
178 | struct irq_chip nlm_cpu_intr = { | ||
179 | .name = "XLR-CPU-INTR", | ||
180 | .irq_enable = rsvd_irq_handler, | ||
181 | .irq_mask = rsvd_irq_handler, | ||
182 | .irq_ack = rsvd_irq_handler, | ||
183 | }; | ||
184 | |||
185 | void __init init_xlr_irqs(void) | ||
186 | { | ||
187 | nlm_reg_t *mmio = netlogic_io_mmio(NETLOGIC_IO_PIC_OFFSET); | ||
188 | uint32_t thread_mask = 1; | ||
189 | int level, i; | ||
190 | |||
191 | pr_info("Interrupt thread mask [%x]\n", thread_mask); | ||
192 | for (i = 0; i < PIC_NUM_IRTS; i++) { | ||
193 | level = PIC_IRQ_IS_EDGE_TRIGGERED(i); | ||
194 | |||
195 | /* Bind all PIC irqs to boot cpu */ | ||
196 | netlogic_write_reg(mmio, PIC_IRT_0_BASE + i, thread_mask); | ||
197 | |||
198 | /* | ||
199 | * Use local scheduling and high polarity for all IRTs | ||
200 | * Invalidate all IRTs, by default | ||
201 | */ | ||
202 | netlogic_write_reg(mmio, PIC_IRT_1_BASE + i, | ||
203 | (level << 30) | (1 << 6) | (PIC_IRQ_BASE + i)); | ||
204 | } | ||
205 | |||
206 | /* Make all IRQs as level triggered by default */ | ||
207 | for (i = 0; i < NR_IRQS; i++) { | ||
208 | if (PIC_IRQ_IS_IRT(i)) | ||
209 | irq_set_chip_and_handler(i, &xlr_pic, handle_level_irq); | ||
210 | else | ||
211 | irq_set_chip_and_handler(i, &nlm_cpu_intr, | ||
212 | handle_percpu_irq); | ||
213 | } | ||
214 | #ifdef CONFIG_SMP | ||
215 | irq_set_chip_and_handler(IRQ_IPI_SMP_FUNCTION, &nlm_cpu_intr, | ||
216 | nlm_smp_function_ipi_handler); | ||
217 | irq_set_chip_and_handler(IRQ_IPI_SMP_RESCHEDULE, &nlm_cpu_intr, | ||
218 | nlm_smp_resched_ipi_handler); | ||
219 | nlm_irq_mask |= | ||
220 | ((1ULL << IRQ_IPI_SMP_FUNCTION) | (1ULL << IRQ_IPI_SMP_RESCHEDULE)); | ||
221 | #endif | ||
222 | |||
223 | #ifdef CONFIG_PCI | ||
224 | /* | ||
225 | * For PCI interrupts, we need to ack the PIC controller too, overload | ||
226 | * irq handler data to do this | ||
227 | */ | ||
228 | if (nlm_chip_is_xls()) { | ||
229 | if (nlm_chip_is_xls_b()) { | ||
230 | irq_set_handler_data(PIC_PCIE_LINK0_IRQ, | ||
231 | xls_pcie_ack_b); | ||
232 | irq_set_handler_data(PIC_PCIE_LINK1_IRQ, | ||
233 | xls_pcie_ack_b); | ||
234 | irq_set_handler_data(PIC_PCIE_XLSB0_LINK2_IRQ, | ||
235 | xls_pcie_ack_b); | ||
236 | irq_set_handler_data(PIC_PCIE_XLSB0_LINK3_IRQ, | ||
237 | xls_pcie_ack_b); | ||
238 | } else { | ||
239 | irq_set_handler_data(PIC_PCIE_LINK0_IRQ, xls_pcie_ack); | ||
240 | irq_set_handler_data(PIC_PCIE_LINK1_IRQ, xls_pcie_ack); | ||
241 | irq_set_handler_data(PIC_PCIE_LINK2_IRQ, xls_pcie_ack); | ||
242 | irq_set_handler_data(PIC_PCIE_LINK3_IRQ, xls_pcie_ack); | ||
243 | } | ||
244 | } else { | ||
245 | /* XLR PCI controller ACK */ | ||
246 | irq_set_handler_data(PIC_PCIE_XLSB0_LINK3_IRQ, xlr_pci_ack); | ||
247 | } | ||
248 | #endif | ||
249 | /* unmask all PIC related interrupts. If no handler is installed by the | ||
250 | * drivers, it'll just ack the interrupt and return | ||
251 | */ | ||
252 | for (i = PIC_IRT_FIRST_IRQ; i <= PIC_IRT_LAST_IRQ; i++) | ||
253 | nlm_irq_mask |= (1ULL << i); | ||
254 | |||
255 | nlm_irq_mask |= (1ULL << IRQ_TIMER); | ||
256 | } | ||
257 | |||
258 | void __init arch_init_irq(void) | ||
259 | { | ||
260 | /* Initialize the irq descriptors */ | ||
261 | init_xlr_irqs(); | ||
262 | write_c0_eimr(nlm_irq_mask); | ||
263 | } | ||
264 | |||
265 | void __cpuinit nlm_smp_irq_init(void) | ||
266 | { | ||
267 | /* set interrupt mask for non-zero cpus */ | ||
268 | write_c0_eimr(nlm_irq_mask); | ||
269 | } | ||
270 | |||
271 | asmlinkage void plat_irq_dispatch(void) | ||
272 | { | ||
273 | uint64_t eirr; | ||
274 | int i; | ||
275 | |||
276 | eirr = read_c0_eirr() & read_c0_eimr(); | ||
277 | if (!eirr) | ||
278 | return; | ||
279 | |||
280 | /* no need of EIRR here, writing compare clears interrupt */ | ||
281 | if (eirr & (1 << IRQ_TIMER)) { | ||
282 | do_IRQ(IRQ_TIMER); | ||
283 | return; | ||
284 | } | ||
285 | |||
286 | /* use dcltz: optimize below code */ | ||
287 | for (i = 63; i != -1; i--) { | ||
288 | if (eirr & (1ULL << i)) | ||
289 | break; | ||
290 | } | ||
291 | if (i == -1) { | ||
292 | pr_err("no interrupt !!\n"); | ||
293 | return; | ||
294 | } | ||
295 | |||
296 | /* Ack eirr */ | ||
297 | write_c0_eirr(1ULL << i); | ||
298 | |||
299 | do_IRQ(i); | ||
300 | } | ||
diff --git a/arch/mips/netlogic/xlr/smp.c b/arch/mips/netlogic/xlr/smp.c new file mode 100644 index 00000000000..d842bce5c94 --- /dev/null +++ b/arch/mips/netlogic/xlr/smp.c | |||
@@ -0,0 +1,216 @@ | |||
1 | /* | ||
2 | * Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights | ||
3 | * reserved. | ||
4 | * | ||
5 | * This software is available to you under a choice of one of two | ||
6 | * licenses. You may choose to be licensed under the terms of the GNU | ||
7 | * General Public License (GPL) Version 2, available from the file | ||
8 | * COPYING in the main directory of this source tree, or the NetLogic | ||
9 | * license below: | ||
10 | * | ||
11 | * Redistribution and use in source and binary forms, with or without | ||
12 | * modification, are permitted provided that the following conditions | ||
13 | * are met: | ||
14 | * | ||
15 | * 1. Redistributions of source code must retain the above copyright | ||
16 | * notice, this list of conditions and the following disclaimer. | ||
17 | * 2. Redistributions in binary form must reproduce the above copyright | ||
18 | * notice, this list of conditions and the following disclaimer in | ||
19 | * the documentation and/or other materials provided with the | ||
20 | * distribution. | ||
21 | * | ||
22 | * THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR | ||
23 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
24 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||
25 | * ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE | ||
26 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||
27 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||
28 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR | ||
29 | * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | ||
30 | * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE | ||
31 | * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN | ||
32 | * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
33 | */ | ||
34 | |||
35 | #include <linux/kernel.h> | ||
36 | #include <linux/delay.h> | ||
37 | #include <linux/init.h> | ||
38 | #include <linux/smp.h> | ||
39 | #include <linux/irq.h> | ||
40 | |||
41 | #include <asm/mmu_context.h> | ||
42 | |||
43 | #include <asm/netlogic/interrupt.h> | ||
44 | #include <asm/netlogic/mips-extns.h> | ||
45 | |||
46 | #include <asm/netlogic/xlr/iomap.h> | ||
47 | #include <asm/netlogic/xlr/pic.h> | ||
48 | #include <asm/netlogic/xlr/xlr.h> | ||
49 | |||
50 | void core_send_ipi(int logical_cpu, unsigned int action) | ||
51 | { | ||
52 | int cpu = cpu_logical_map(logical_cpu); | ||
53 | u32 tid = cpu & 0x3; | ||
54 | u32 pid = (cpu >> 2) & 0x07; | ||
55 | u32 ipi = (tid << 16) | (pid << 20); | ||
56 | |||
57 | if (action & SMP_CALL_FUNCTION) | ||
58 | ipi |= IRQ_IPI_SMP_FUNCTION; | ||
59 | else if (action & SMP_RESCHEDULE_YOURSELF) | ||
60 | ipi |= IRQ_IPI_SMP_RESCHEDULE; | ||
61 | else | ||
62 | return; | ||
63 | |||
64 | pic_send_ipi(ipi); | ||
65 | } | ||
66 | |||
67 | void nlm_send_ipi_single(int cpu, unsigned int action) | ||
68 | { | ||
69 | core_send_ipi(cpu, action); | ||
70 | } | ||
71 | |||
72 | void nlm_send_ipi_mask(const struct cpumask *mask, unsigned int action) | ||
73 | { | ||
74 | int cpu; | ||
75 | |||
76 | for_each_cpu(cpu, mask) { | ||
77 | core_send_ipi(cpu, action); | ||
78 | } | ||
79 | } | ||
80 | |||
81 | /* IRQ_IPI_SMP_FUNCTION Handler */ | ||
82 | void nlm_smp_function_ipi_handler(unsigned int irq, struct irq_desc *desc) | ||
83 | { | ||
84 | smp_call_function_interrupt(); | ||
85 | } | ||
86 | |||
87 | /* IRQ_IPI_SMP_RESCHEDULE handler */ | ||
88 | void nlm_smp_resched_ipi_handler(unsigned int irq, struct irq_desc *desc) | ||
89 | { | ||
90 | scheduler_ipi(); | ||
91 | } | ||
92 | |||
93 | /* | ||
94 | * Called before going into mips code, early cpu init | ||
95 | */ | ||
96 | void nlm_early_init_secondary(void) | ||
97 | { | ||
98 | write_c0_ebase((uint32_t)nlm_common_ebase); | ||
99 | /* TLB partition here later */ | ||
100 | } | ||
101 | |||
102 | /* | ||
103 | * Code to run on secondary just after probing the CPU | ||
104 | */ | ||
105 | static void __cpuinit nlm_init_secondary(void) | ||
106 | { | ||
107 | nlm_smp_irq_init(); | ||
108 | } | ||
109 | |||
110 | void nlm_smp_finish(void) | ||
111 | { | ||
112 | #ifdef notyet | ||
113 | nlm_common_msgring_cpu_init(); | ||
114 | #endif | ||
115 | local_irq_enable(); | ||
116 | } | ||
117 | |||
118 | void nlm_cpus_done(void) | ||
119 | { | ||
120 | } | ||
121 | |||
122 | /* | ||
123 | * Boot all other cpus in the system, initialize them, and bring them into | ||
124 | * the boot function | ||
125 | */ | ||
126 | int nlm_cpu_unblock[NR_CPUS]; | ||
127 | int nlm_cpu_ready[NR_CPUS]; | ||
128 | unsigned long nlm_next_gp; | ||
129 | unsigned long nlm_next_sp; | ||
130 | cpumask_t phys_cpu_present_map; | ||
131 | |||
132 | void nlm_boot_secondary(int logical_cpu, struct task_struct *idle) | ||
133 | { | ||
134 | unsigned long gp = (unsigned long)task_thread_info(idle); | ||
135 | unsigned long sp = (unsigned long)__KSTK_TOS(idle); | ||
136 | int cpu = cpu_logical_map(logical_cpu); | ||
137 | |||
138 | nlm_next_sp = sp; | ||
139 | nlm_next_gp = gp; | ||
140 | |||
141 | /* barrier */ | ||
142 | __sync(); | ||
143 | nlm_cpu_unblock[cpu] = 1; | ||
144 | } | ||
145 | |||
146 | void __init nlm_smp_setup(void) | ||
147 | { | ||
148 | unsigned int boot_cpu; | ||
149 | int num_cpus, i; | ||
150 | |||
151 | boot_cpu = hard_smp_processor_id(); | ||
152 | cpus_clear(phys_cpu_present_map); | ||
153 | |||
154 | cpu_set(boot_cpu, phys_cpu_present_map); | ||
155 | __cpu_number_map[boot_cpu] = 0; | ||
156 | __cpu_logical_map[0] = boot_cpu; | ||
157 | cpu_set(0, cpu_possible_map); | ||
158 | |||
159 | num_cpus = 1; | ||
160 | for (i = 0; i < NR_CPUS; i++) { | ||
161 | if (nlm_cpu_ready[i]) { | ||
162 | cpu_set(i, phys_cpu_present_map); | ||
163 | __cpu_number_map[i] = num_cpus; | ||
164 | __cpu_logical_map[num_cpus] = i; | ||
165 | cpu_set(num_cpus, cpu_possible_map); | ||
166 | ++num_cpus; | ||
167 | } | ||
168 | } | ||
169 | |||
170 | pr_info("Phys CPU present map: %lx, possible map %lx\n", | ||
171 | (unsigned long)phys_cpu_present_map.bits[0], | ||
172 | (unsigned long)cpu_possible_map.bits[0]); | ||
173 | |||
174 | pr_info("Detected %i Slave CPU(s)\n", num_cpus); | ||
175 | } | ||
176 | |||
177 | void nlm_prepare_cpus(unsigned int max_cpus) | ||
178 | { | ||
179 | } | ||
180 | |||
181 | struct plat_smp_ops nlm_smp_ops = { | ||
182 | .send_ipi_single = nlm_send_ipi_single, | ||
183 | .send_ipi_mask = nlm_send_ipi_mask, | ||
184 | .init_secondary = nlm_init_secondary, | ||
185 | .smp_finish = nlm_smp_finish, | ||
186 | .cpus_done = nlm_cpus_done, | ||
187 | .boot_secondary = nlm_boot_secondary, | ||
188 | .smp_setup = nlm_smp_setup, | ||
189 | .prepare_cpus = nlm_prepare_cpus, | ||
190 | }; | ||
191 | |||
192 | unsigned long secondary_entry_point; | ||
193 | |||
194 | int nlm_wakeup_secondary_cpus(u32 wakeup_mask) | ||
195 | { | ||
196 | unsigned int tid, pid, ipi, i, boot_cpu; | ||
197 | void *reset_vec; | ||
198 | |||
199 | secondary_entry_point = (unsigned long)prom_pre_boot_secondary_cpus; | ||
200 | reset_vec = (void *)CKSEG1ADDR(0x1fc00000); | ||
201 | memcpy(reset_vec, nlm_boot_smp_nmi, 0x80); | ||
202 | boot_cpu = hard_smp_processor_id(); | ||
203 | |||
204 | for (i = 0; i < NR_CPUS; i++) { | ||
205 | if (i == boot_cpu) | ||
206 | continue; | ||
207 | if (wakeup_mask & (1u << i)) { | ||
208 | tid = i & 0x3; | ||
209 | pid = (i >> 2) & 0x7; | ||
210 | ipi = (tid << 16) | (pid << 20) | (1 << 8); | ||
211 | pic_send_ipi(ipi); | ||
212 | } | ||
213 | } | ||
214 | |||
215 | return 0; | ||
216 | } | ||
diff --git a/arch/mips/netlogic/xlr/smpboot.S b/arch/mips/netlogic/xlr/smpboot.S new file mode 100644 index 00000000000..b8e074402c9 --- /dev/null +++ b/arch/mips/netlogic/xlr/smpboot.S | |||
@@ -0,0 +1,94 @@ | |||
1 | /* | ||
2 | * Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights | ||
3 | * reserved. | ||
4 | * | ||
5 | * This software is available to you under a choice of one of two | ||
6 | * licenses. You may choose to be licensed under the terms of the GNU | ||
7 | * General Public License (GPL) Version 2, available from the file | ||
8 | * COPYING in the main directory of this source tree, or the NetLogic | ||
9 | * license below: | ||
10 | * | ||
11 | * Redistribution and use in source and binary forms, with or without | ||
12 | * modification, are permitted provided that the following conditions | ||
13 | * are met: | ||
14 | * | ||
15 | * 1. Redistributions of source code must retain the above copyright | ||
16 | * notice, this list of conditions and the following disclaimer. | ||
17 | * 2. Redistributions in binary form must reproduce the above copyright | ||
18 | * notice, this list of conditions and the following disclaimer in | ||
19 | * the documentation and/or other materials provided with the | ||
20 | * distribution. | ||
21 | * | ||
22 | * THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR | ||
23 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
24 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||
25 | * ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE | ||
26 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||
27 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||
28 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR | ||
29 | * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | ||
30 | * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE | ||
31 | * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN | ||
32 | * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
33 | */ | ||
34 | |||
35 | #include <asm/asm.h> | ||
36 | #include <asm/asm-offsets.h> | ||
37 | #include <asm/regdef.h> | ||
38 | #include <asm/mipsregs.h> | ||
39 | |||
40 | |||
41 | /* Don't jump to linux function from Bootloader stack. Change it | ||
42 | * here. Kernel might allocate bootloader memory before all the CPUs are | ||
43 | * brought up (eg: Inode cache region) and we better don't overwrite this | ||
44 | * memory | ||
45 | */ | ||
46 | NESTED(prom_pre_boot_secondary_cpus, 16, sp) | ||
47 | .set mips64 | ||
48 | mfc0 t0, $15, 1 # read ebase | ||
49 | andi t0, 0x1f # t0 has the processor_id() | ||
50 | sll t0, 2 # offset in cpu array | ||
51 | |||
52 | PTR_LA t1, nlm_cpu_ready # mark CPU ready | ||
53 | PTR_ADDU t1, t0 | ||
54 | li t2, 1 | ||
55 | sw t2, 0(t1) | ||
56 | |||
57 | PTR_LA t1, nlm_cpu_unblock | ||
58 | PTR_ADDU t1, t0 | ||
59 | 1: lw t2, 0(t1) # wait till unblocked | ||
60 | beqz t2, 1b | ||
61 | nop | ||
62 | |||
63 | PTR_LA t1, nlm_next_sp | ||
64 | PTR_L sp, 0(t1) | ||
65 | PTR_LA t1, nlm_next_gp | ||
66 | PTR_L gp, 0(t1) | ||
67 | |||
68 | PTR_LA t0, nlm_early_init_secondary | ||
69 | jalr t0 | ||
70 | nop | ||
71 | |||
72 | PTR_LA t0, smp_bootstrap | ||
73 | jr t0 | ||
74 | nop | ||
75 | END(prom_pre_boot_secondary_cpus) | ||
76 | |||
77 | NESTED(nlm_boot_smp_nmi, 0, sp) | ||
78 | .set push | ||
79 | .set noat | ||
80 | .set mips64 | ||
81 | .set noreorder | ||
82 | |||
83 | /* Clear the NMI and BEV bits */ | ||
84 | MFC0 k0, CP0_STATUS | ||
85 | li k1, 0xffb7ffff | ||
86 | and k0, k0, k1 | ||
87 | MTC0 k0, CP0_STATUS | ||
88 | |||
89 | PTR_LA k1, secondary_entry_point | ||
90 | PTR_L k0, 0(k1) | ||
91 | jr k0 | ||
92 | nop | ||
93 | .set pop | ||
94 | END(nlm_boot_smp_nmi) | ||
diff --git a/arch/mips/netlogic/xlr/time.c b/arch/mips/netlogic/xlr/time.c new file mode 100644 index 00000000000..0d81b262593 --- /dev/null +++ b/arch/mips/netlogic/xlr/time.c | |||
@@ -0,0 +1,51 @@ | |||
1 | /* | ||
2 | * Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights | ||
3 | * reserved. | ||
4 | * | ||
5 | * This software is available to you under a choice of one of two | ||
6 | * licenses. You may choose to be licensed under the terms of the GNU | ||
7 | * General Public License (GPL) Version 2, available from the file | ||
8 | * COPYING in the main directory of this source tree, or the NetLogic | ||
9 | * license below: | ||
10 | * | ||
11 | * Redistribution and use in source and binary forms, with or without | ||
12 | * modification, are permitted provided that the following conditions | ||
13 | * are met: | ||
14 | * | ||
15 | * 1. Redistributions of source code must retain the above copyright | ||
16 | * notice, this list of conditions and the following disclaimer. | ||
17 | * 2. Redistributions in binary form must reproduce the above copyright | ||
18 | * notice, this list of conditions and the following disclaimer in | ||
19 | * the documentation and/or other materials provided with the | ||
20 | * distribution. | ||
21 | * | ||
22 | * THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR | ||
23 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
24 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||
25 | * ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE | ||
26 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||
27 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||
28 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR | ||
29 | * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | ||
30 | * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE | ||
31 | * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN | ||
32 | * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
33 | */ | ||
34 | |||
35 | #include <linux/init.h> | ||
36 | |||
37 | #include <asm/time.h> | ||
38 | #include <asm/netlogic/interrupt.h> | ||
39 | #include <asm/netlogic/psb-bootinfo.h> | ||
40 | |||
41 | unsigned int __cpuinit get_c0_compare_int(void) | ||
42 | { | ||
43 | return IRQ_TIMER; | ||
44 | } | ||
45 | |||
46 | void __init plat_time_init(void) | ||
47 | { | ||
48 | mips_hpt_frequency = nlm_prom_info.cpu_frequency; | ||
49 | pr_info("MIPS counter frequency [%ld]\n", | ||
50 | (unsigned long)mips_hpt_frequency); | ||
51 | } | ||
diff --git a/arch/mips/netlogic/xlr/xlr_console.c b/arch/mips/netlogic/xlr/xlr_console.c new file mode 100644 index 00000000000..759df069220 --- /dev/null +++ b/arch/mips/netlogic/xlr/xlr_console.c | |||
@@ -0,0 +1,46 @@ | |||
1 | /* | ||
2 | * Copyright 2003-2011 NetLogic Microsystems, Inc. (NetLogic). All rights | ||
3 | * reserved. | ||
4 | * | ||
5 | * This software is available to you under a choice of one of two | ||
6 | * licenses. You may choose to be licensed under the terms of the GNU | ||
7 | * General Public License (GPL) Version 2, available from the file | ||
8 | * COPYING in the main directory of this source tree, or the NetLogic | ||
9 | * license below: | ||
10 | * | ||
11 | * Redistribution and use in source and binary forms, with or without | ||
12 | * modification, are permitted provided that the following conditions | ||
13 | * are met: | ||
14 | * | ||
15 | * 1. Redistributions of source code must retain the above copyright | ||
16 | * notice, this list of conditions and the following disclaimer. | ||
17 | * 2. Redistributions in binary form must reproduce the above copyright | ||
18 | * notice, this list of conditions and the following disclaimer in | ||
19 | * the documentation and/or other materials provided with the | ||
20 | * distribution. | ||
21 | * | ||
22 | * THIS SOFTWARE IS PROVIDED BY NETLOGIC ``AS IS'' AND ANY EXPRESS OR | ||
23 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
24 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||
25 | * ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE LIABLE | ||
26 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||
27 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||
28 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR | ||
29 | * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | ||
30 | * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE | ||
31 | * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN | ||
32 | * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
33 | */ | ||
34 | |||
35 | #include <linux/types.h> | ||
36 | #include <asm/netlogic/xlr/iomap.h> | ||
37 | |||
38 | void prom_putchar(char c) | ||
39 | { | ||
40 | nlm_reg_t *mmio; | ||
41 | |||
42 | mmio = netlogic_io_mmio(NETLOGIC_IO_UART_0_OFFSET); | ||
43 | while (netlogic_read_reg(mmio, 0x5) == 0) | ||
44 | ; | ||
45 | netlogic_write_reg(mmio, 0x0, c); | ||
46 | } | ||
diff --git a/arch/mips/nxp/pnx8550/common/pci.c b/arch/mips/nxp/pnx8550/common/pci.c new file mode 100644 index 00000000000..98e86ddb86c --- /dev/null +++ b/arch/mips/nxp/pnx8550/common/pci.c | |||
@@ -0,0 +1,134 @@ | |||
1 | /* | ||
2 | * | ||
3 | * BRIEF MODULE DESCRIPTION | ||
4 | * | ||
5 | * Author: source@mvista.com | ||
6 | * | ||
7 | * This program is free software; you can distribute it and/or modify it | ||
8 | * under the terms of the GNU General Public License (Version 2) as | ||
9 | * published by the Free Software Foundation. | ||
10 | * | ||
11 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
12 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
13 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | ||
14 | * for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License along | ||
17 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
18 | * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. | ||
19 | */ | ||
20 | #include <linux/types.h> | ||
21 | #include <linux/pci.h> | ||
22 | #include <linux/kernel.h> | ||
23 | #include <linux/init.h> | ||
24 | |||
25 | #include <pci.h> | ||
26 | #include <glb.h> | ||
27 | #include <nand.h> | ||
28 | |||
29 | static struct resource pci_io_resource = { | ||
30 | .start = PNX8550_PCIIO + 0x1000, /* reserve regacy I/O space */ | ||
31 | .end = PNX8550_PCIIO + PNX8550_PCIIO_SIZE, | ||
32 | .name = "pci IO space", | ||
33 | .flags = IORESOURCE_IO | ||
34 | }; | ||
35 | |||
36 | static struct resource pci_mem_resource = { | ||
37 | .start = PNX8550_PCIMEM, | ||
38 | .end = PNX8550_PCIMEM + PNX8550_PCIMEM_SIZE - 1, | ||
39 | .name = "pci memory space", | ||
40 | .flags = IORESOURCE_MEM | ||
41 | }; | ||
42 | |||
43 | extern struct pci_ops pnx8550_pci_ops; | ||
44 | |||
45 | static struct pci_controller pnx8550_controller = { | ||
46 | .pci_ops = &pnx8550_pci_ops, | ||
47 | .io_map_base = PNX8550_PORT_BASE, | ||
48 | .io_resource = &pci_io_resource, | ||
49 | .mem_resource = &pci_mem_resource, | ||
50 | }; | ||
51 | |||
52 | /* Return the total size of DRAM-memory, (RANK0 + RANK1) */ | ||
53 | static inline unsigned long get_system_mem_size(void) | ||
54 | { | ||
55 | /* Read IP2031_RANK0_ADDR_LO */ | ||
56 | unsigned long dram_r0_lo = inl(PCI_BASE | 0x65010); | ||
57 | /* Read IP2031_RANK1_ADDR_HI */ | ||
58 | unsigned long dram_r1_hi = inl(PCI_BASE | 0x65018); | ||
59 | |||
60 | return dram_r1_hi - dram_r0_lo + 1; | ||
61 | } | ||
62 | |||
63 | static int __init pnx8550_pci_setup(void) | ||
64 | { | ||
65 | int pci_mem_code; | ||
66 | int mem_size = get_system_mem_size() >> 20; | ||
67 | |||
68 | /* Clear the Global 2 Register, PCI Inta Output Enable Registers | ||
69 | Bit 1:Enable DAC Powerdown | ||
70 | -> 0:DACs are enabled and are working normally | ||
71 | 1:DACs are powerdown | ||
72 | Bit 0:Enable of PCI inta output | ||
73 | -> 0 = Disable PCI inta output | ||
74 | 1 = Enable PCI inta output | ||
75 | */ | ||
76 | PNX8550_GLB2_ENAB_INTA_O = 0; | ||
77 | |||
78 | /* Calc the PCI mem size code */ | ||
79 | if (mem_size >= 128) | ||
80 | pci_mem_code = SIZE_128M; | ||
81 | else if (mem_size >= 64) | ||
82 | pci_mem_code = SIZE_64M; | ||
83 | else if (mem_size >= 32) | ||
84 | pci_mem_code = SIZE_32M; | ||
85 | else | ||
86 | pci_mem_code = SIZE_16M; | ||
87 | |||
88 | /* Set PCI_XIO registers */ | ||
89 | outl(pci_mem_resource.start, PCI_BASE | PCI_BASE1_LO); | ||
90 | outl(pci_mem_resource.end + 1, PCI_BASE | PCI_BASE1_HI); | ||
91 | outl(pci_io_resource.start, PCI_BASE | PCI_BASE2_LO); | ||
92 | outl(pci_io_resource.end, PCI_BASE | PCI_BASE2_HI); | ||
93 | |||
94 | /* Send memory transaction via PCI_BASE2 */ | ||
95 | outl(0x00000001, PCI_BASE | PCI_IO); | ||
96 | |||
97 | /* Unlock the setup register */ | ||
98 | outl(0xca, PCI_BASE | PCI_UNLOCKREG); | ||
99 | |||
100 | /* | ||
101 | * BAR0 of PNX8550 (pci base 10) must be zero in order for ide | ||
102 | * to work, and in order for bus_to_baddr to work without any | ||
103 | * hacks. | ||
104 | */ | ||
105 | outl(0x00000000, PCI_BASE | PCI_BASE10); | ||
106 | |||
107 | /* | ||
108 | *These two bars are set by default or the boot code. | ||
109 | * However, it's safer to set them here so we're not boot | ||
110 | * code dependent. | ||
111 | */ | ||
112 | outl(0x1be00000, PCI_BASE | PCI_BASE14); /* PNX MMIO */ | ||
113 | outl(PNX8550_NAND_BASE_ADDR, PCI_BASE | PCI_BASE18); /* XIO */ | ||
114 | |||
115 | outl(PCI_EN_TA | | ||
116 | PCI_EN_PCI2MMI | | ||
117 | PCI_EN_XIO | | ||
118 | PCI_SETUP_BASE18_SIZE(SIZE_32M) | | ||
119 | PCI_SETUP_BASE18_EN | | ||
120 | PCI_SETUP_BASE14_EN | | ||
121 | PCI_SETUP_BASE10_PREF | | ||
122 | PCI_SETUP_BASE10_SIZE(pci_mem_code) | | ||
123 | PCI_SETUP_CFGMANAGE_EN | | ||
124 | PCI_SETUP_PCIARB_EN, | ||
125 | PCI_BASE | | ||
126 | PCI_SETUP); /* PCI_SETUP */ | ||
127 | outl(0x00000000, PCI_BASE | PCI_CTRL); /* PCI_CONTROL */ | ||
128 | |||
129 | register_pci_controller(&pnx8550_controller); | ||
130 | |||
131 | return 0; | ||
132 | } | ||
133 | |||
134 | arch_initcall(pnx8550_pci_setup); | ||
diff --git a/arch/mips/nxp/pnx8550/common/setup.c b/arch/mips/nxp/pnx8550/common/setup.c new file mode 100644 index 00000000000..71adac32332 --- /dev/null +++ b/arch/mips/nxp/pnx8550/common/setup.c | |||
@@ -0,0 +1,143 @@ | |||
1 | /* | ||
2 | * | ||
3 | * 2.6 port, Embedded Alley Solutions, Inc | ||
4 | * | ||
5 | * Based on Per Hallsmark, per.hallsmark@mvista.com | ||
6 | * | ||
7 | * This program is free software; you can distribute it and/or modify it | ||
8 | * under the terms of the GNU General Public License (Version 2) as | ||
9 | * published by the Free Software Foundation. | ||
10 | * | ||
11 | * This program is distributed in the hope it will be useful, but WITHOUT | ||
12 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
13 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | ||
14 | * for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License along | ||
17 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
18 | * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. | ||
19 | */ | ||
20 | #include <linux/init.h> | ||
21 | #include <linux/sched.h> | ||
22 | #include <linux/ioport.h> | ||
23 | #include <linux/irq.h> | ||
24 | #include <linux/mm.h> | ||
25 | #include <linux/delay.h> | ||
26 | #include <linux/interrupt.h> | ||
27 | #include <linux/serial_pnx8xxx.h> | ||
28 | #include <linux/pm.h> | ||
29 | |||
30 | #include <asm/cpu.h> | ||
31 | #include <asm/bootinfo.h> | ||
32 | #include <asm/irq.h> | ||
33 | #include <asm/mipsregs.h> | ||
34 | #include <asm/reboot.h> | ||
35 | #include <asm/pgtable.h> | ||
36 | #include <asm/time.h> | ||
37 | |||
38 | #include <glb.h> | ||
39 | #include <int.h> | ||
40 | #include <pci.h> | ||
41 | #include <uart.h> | ||
42 | #include <nand.h> | ||
43 | |||
44 | extern void __init board_setup(void); | ||
45 | extern void pnx8550_machine_restart(char *); | ||
46 | extern void pnx8550_machine_halt(void); | ||
47 | extern void pnx8550_machine_power_off(void); | ||
48 | extern struct resource ioport_resource; | ||
49 | extern struct resource iomem_resource; | ||
50 | extern char *prom_getcmdline(void); | ||
51 | |||
52 | struct resource standard_io_resources[] = { | ||
53 | { | ||
54 | .start = 0x00, | ||
55 | .end = 0x1f, | ||
56 | .name = "dma1", | ||
57 | .flags = IORESOURCE_BUSY | ||
58 | }, { | ||
59 | .start = 0x40, | ||
60 | .end = 0x5f, | ||
61 | .name = "timer", | ||
62 | .flags = IORESOURCE_BUSY | ||
63 | }, { | ||
64 | .start = 0x80, | ||
65 | .end = 0x8f, | ||
66 | .name = "dma page reg", | ||
67 | .flags = IORESOURCE_BUSY | ||
68 | }, { | ||
69 | .start = 0xc0, | ||
70 | .end = 0xdf, | ||
71 | .name = "dma2", | ||
72 | .flags = IORESOURCE_BUSY | ||
73 | }, | ||
74 | }; | ||
75 | |||
76 | #define STANDARD_IO_RESOURCES ARRAY_SIZE(standard_io_resources) | ||
77 | |||
78 | extern struct resource pci_io_resource; | ||
79 | extern struct resource pci_mem_resource; | ||
80 | |||
81 | /* Return the total size of DRAM-memory, (RANK0 + RANK1) */ | ||
82 | unsigned long get_system_mem_size(void) | ||
83 | { | ||
84 | /* Read IP2031_RANK0_ADDR_LO */ | ||
85 | unsigned long dram_r0_lo = inl(PCI_BASE | 0x65010); | ||
86 | /* Read IP2031_RANK1_ADDR_HI */ | ||
87 | unsigned long dram_r1_hi = inl(PCI_BASE | 0x65018); | ||
88 | |||
89 | return dram_r1_hi - dram_r0_lo + 1; | ||
90 | } | ||
91 | |||
92 | int pnx8550_console_port = -1; | ||
93 | |||
94 | void __init plat_mem_setup(void) | ||
95 | { | ||
96 | int i; | ||
97 | char* argptr; | ||
98 | |||
99 | board_setup(); /* board specific setup */ | ||
100 | |||
101 | _machine_restart = pnx8550_machine_restart; | ||
102 | _machine_halt = pnx8550_machine_halt; | ||
103 | pm_power_off = pnx8550_machine_power_off; | ||
104 | |||
105 | /* Clear the Global 2 Register, PCI Inta Output Enable Registers | ||
106 | Bit 1:Enable DAC Powerdown | ||
107 | -> 0:DACs are enabled and are working normally | ||
108 | 1:DACs are powerdown | ||
109 | Bit 0:Enable of PCI inta output | ||
110 | -> 0 = Disable PCI inta output | ||
111 | 1 = Enable PCI inta output | ||
112 | */ | ||
113 | PNX8550_GLB2_ENAB_INTA_O = 0; | ||
114 | |||
115 | /* IO/MEM resources. */ | ||
116 | set_io_port_base(PNX8550_PORT_BASE); | ||
117 | ioport_resource.start = 0; | ||
118 | ioport_resource.end = ~0; | ||
119 | iomem_resource.start = 0; | ||
120 | iomem_resource.end = ~0; | ||
121 | |||
122 | /* Request I/O space for devices on this board */ | ||
123 | for (i = 0; i < STANDARD_IO_RESOURCES; i++) | ||
124 | request_resource(&ioport_resource, standard_io_resources + i); | ||
125 | |||
126 | /* Place the Mode Control bit for GPIO pin 16 in primary function */ | ||
127 | /* Pin 16 is used by UART1, UA1_TX */ | ||
128 | outl((PNX8550_GPIO_MODE_PRIMOP << PNX8550_GPIO_MC_16_BIT) | | ||
129 | (PNX8550_GPIO_MODE_PRIMOP << PNX8550_GPIO_MC_17_BIT), | ||
130 | PNX8550_GPIO_MC1); | ||
131 | |||
132 | argptr = prom_getcmdline(); | ||
133 | if ((argptr = strstr(argptr, "console=ttyS")) != NULL) { | ||
134 | argptr += strlen("console=ttyS"); | ||
135 | pnx8550_console_port = *argptr == '0' ? 0 : 1; | ||
136 | |||
137 | /* We must initialize the UART (console) before early printk */ | ||
138 | /* Set LCR to 8-bit and BAUD to 38400 (no 5) */ | ||
139 | ip3106_lcr(UART_BASE, pnx8550_console_port) = | ||
140 | PNX8XXX_UART_LCR_8BIT; | ||
141 | ip3106_baud(UART_BASE, pnx8550_console_port) = 5; | ||
142 | } | ||
143 | } | ||
diff --git a/arch/mips/oprofile/op_model_rm9000.c b/arch/mips/oprofile/op_model_rm9000.c new file mode 100644 index 00000000000..3aa81384966 --- /dev/null +++ b/arch/mips/oprofile/op_model_rm9000.c | |||
@@ -0,0 +1,138 @@ | |||
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) 2004 by Ralf Baechle | ||
7 | */ | ||
8 | #include <linux/init.h> | ||
9 | #include <linux/oprofile.h> | ||
10 | #include <linux/interrupt.h> | ||
11 | #include <linux/smp.h> | ||
12 | |||
13 | #include "op_impl.h" | ||
14 | |||
15 | #define RM9K_COUNTER1_EVENT(event) ((event) << 0) | ||
16 | #define RM9K_COUNTER1_SUPERVISOR (1ULL << 7) | ||
17 | #define RM9K_COUNTER1_KERNEL (1ULL << 8) | ||
18 | #define RM9K_COUNTER1_USER (1ULL << 9) | ||
19 | #define RM9K_COUNTER1_ENABLE (1ULL << 10) | ||
20 | #define RM9K_COUNTER1_OVERFLOW (1ULL << 15) | ||
21 | |||
22 | #define RM9K_COUNTER2_EVENT(event) ((event) << 16) | ||
23 | #define RM9K_COUNTER2_SUPERVISOR (1ULL << 23) | ||
24 | #define RM9K_COUNTER2_KERNEL (1ULL << 24) | ||
25 | #define RM9K_COUNTER2_USER (1ULL << 25) | ||
26 | #define RM9K_COUNTER2_ENABLE (1ULL << 26) | ||
27 | #define RM9K_COUNTER2_OVERFLOW (1ULL << 31) | ||
28 | |||
29 | extern unsigned int rm9000_perfcount_irq; | ||
30 | |||
31 | static struct rm9k_register_config { | ||
32 | unsigned int control; | ||
33 | unsigned int reset_counter1; | ||
34 | unsigned int reset_counter2; | ||
35 | } reg; | ||
36 | |||
37 | /* Compute all of the registers in preparation for enabling profiling. */ | ||
38 | |||
39 | static void rm9000_reg_setup(struct op_counter_config *ctr) | ||
40 | { | ||
41 | unsigned int control = 0; | ||
42 | |||
43 | /* Compute the performance counter control word. */ | ||
44 | /* For now count kernel and user mode */ | ||
45 | if (ctr[0].enabled) | ||
46 | control |= RM9K_COUNTER1_EVENT(ctr[0].event) | | ||
47 | RM9K_COUNTER1_KERNEL | | ||
48 | RM9K_COUNTER1_USER | | ||
49 | RM9K_COUNTER1_ENABLE; | ||
50 | if (ctr[1].enabled) | ||
51 | control |= RM9K_COUNTER2_EVENT(ctr[1].event) | | ||
52 | RM9K_COUNTER2_KERNEL | | ||
53 | RM9K_COUNTER2_USER | | ||
54 | RM9K_COUNTER2_ENABLE; | ||
55 | reg.control = control; | ||
56 | |||
57 | reg.reset_counter1 = 0x80000000 - ctr[0].count; | ||
58 | reg.reset_counter2 = 0x80000000 - ctr[1].count; | ||
59 | } | ||
60 | |||
61 | /* Program all of the registers in preparation for enabling profiling. */ | ||
62 | |||
63 | static void rm9000_cpu_setup(void *args) | ||
64 | { | ||
65 | uint64_t perfcount; | ||
66 | |||
67 | perfcount = ((uint64_t) reg.reset_counter2 << 32) | reg.reset_counter1; | ||
68 | write_c0_perfcount(perfcount); | ||
69 | } | ||
70 | |||
71 | static void rm9000_cpu_start(void *args) | ||
72 | { | ||
73 | /* Start all counters on current CPU */ | ||
74 | write_c0_perfcontrol(reg.control); | ||
75 | } | ||
76 | |||
77 | static void rm9000_cpu_stop(void *args) | ||
78 | { | ||
79 | /* Stop all counters on current CPU */ | ||
80 | write_c0_perfcontrol(0); | ||
81 | } | ||
82 | |||
83 | static irqreturn_t rm9000_perfcount_handler(int irq, void *dev_id) | ||
84 | { | ||
85 | unsigned int control = read_c0_perfcontrol(); | ||
86 | struct pt_regs *regs = get_irq_regs(); | ||
87 | uint32_t counter1, counter2; | ||
88 | uint64_t counters; | ||
89 | |||
90 | /* | ||
91 | * RM9000 combines two 32-bit performance counters into a single | ||
92 | * 64-bit coprocessor zero register. To avoid a race updating the | ||
93 | * registers we need to stop the counters while we're messing with | ||
94 | * them ... | ||
95 | */ | ||
96 | write_c0_perfcontrol(0); | ||
97 | |||
98 | counters = read_c0_perfcount(); | ||
99 | counter1 = counters; | ||
100 | counter2 = counters >> 32; | ||
101 | |||
102 | if (control & RM9K_COUNTER1_OVERFLOW) { | ||
103 | oprofile_add_sample(regs, 0); | ||
104 | counter1 = reg.reset_counter1; | ||
105 | } | ||
106 | if (control & RM9K_COUNTER2_OVERFLOW) { | ||
107 | oprofile_add_sample(regs, 1); | ||
108 | counter2 = reg.reset_counter2; | ||
109 | } | ||
110 | |||
111 | counters = ((uint64_t)counter2 << 32) | counter1; | ||
112 | write_c0_perfcount(counters); | ||
113 | write_c0_perfcontrol(reg.control); | ||
114 | |||
115 | return IRQ_HANDLED; | ||
116 | } | ||
117 | |||
118 | static int __init rm9000_init(void) | ||
119 | { | ||
120 | return request_irq(rm9000_perfcount_irq, rm9000_perfcount_handler, | ||
121 | 0, "Perfcounter", NULL); | ||
122 | } | ||
123 | |||
124 | static void rm9000_exit(void) | ||
125 | { | ||
126 | free_irq(rm9000_perfcount_irq, NULL); | ||
127 | } | ||
128 | |||
129 | struct op_mips_model op_model_rm9000_ops = { | ||
130 | .reg_setup = rm9000_reg_setup, | ||
131 | .cpu_setup = rm9000_cpu_setup, | ||
132 | .init = rm9000_init, | ||
133 | .exit = rm9000_exit, | ||
134 | .cpu_start = rm9000_cpu_start, | ||
135 | .cpu_stop = rm9000_cpu_stop, | ||
136 | .cpu_type = "mips/rm9000", | ||
137 | .num_counters = 2 | ||
138 | }; | ||
diff --git a/arch/mips/pci/fixup-au1000.c b/arch/mips/pci/fixup-au1000.c new file mode 100644 index 00000000000..e2ddfc49237 --- /dev/null +++ b/arch/mips/pci/fixup-au1000.c | |||
@@ -0,0 +1,43 @@ | |||
1 | /* | ||
2 | * BRIEF MODULE DESCRIPTION | ||
3 | * Board specific PCI fixups. | ||
4 | * | ||
5 | * Copyright 2001-2003, 2008 MontaVista Software Inc. | ||
6 | * Author: MontaVista Software, Inc. <source@mvista.com> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License as published by the | ||
10 | * Free Software Foundation; either version 2 of the License, or (at your | ||
11 | * option) any later version. | ||
12 | * | ||
13 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
14 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
15 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
16 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
17 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
18 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
19 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
20 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
21 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
22 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
23 | * | ||
24 | * You should have received a copy of the GNU General Public License along | ||
25 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
26 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
27 | */ | ||
28 | |||
29 | #include <linux/pci.h> | ||
30 | #include <linux/init.h> | ||
31 | |||
32 | extern char irq_tab_alchemy[][5]; | ||
33 | |||
34 | int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) | ||
35 | { | ||
36 | return irq_tab_alchemy[slot][pin]; | ||
37 | } | ||
38 | |||
39 | /* Do platform specific device initialization at pci_enable_device() time */ | ||
40 | int pcibios_plat_dev_init(struct pci_dev *dev) | ||
41 | { | ||
42 | return 0; | ||
43 | } | ||
diff --git a/arch/mips/pci/fixup-yosemite.c b/arch/mips/pci/fixup-yosemite.c new file mode 100644 index 00000000000..fdafb13a793 --- /dev/null +++ b/arch/mips/pci/fixup-yosemite.c | |||
@@ -0,0 +1,41 @@ | |||
1 | /* | ||
2 | * Copyright 2003 PMC-Sierra | ||
3 | * Author: Manish Lachwani (lachwani@pmc-sierra.com) | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms of the GNU General Public License as published by the | ||
7 | * Free Software Foundation; either version 2 of the License, or (at your | ||
8 | * option) any later version. | ||
9 | * | ||
10 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
11 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
12 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
13 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
14 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
15 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
16 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
17 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
18 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
19 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
20 | * | ||
21 | * You should have received a copy of the GNU General Public License along | ||
22 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
23 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
24 | */ | ||
25 | #include <linux/kernel.h> | ||
26 | #include <linux/init.h> | ||
27 | #include <linux/pci.h> | ||
28 | |||
29 | int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) | ||
30 | { | ||
31 | if (pin == 0) | ||
32 | return -1; | ||
33 | |||
34 | return 3; /* Everything goes to one irq bit */ | ||
35 | } | ||
36 | |||
37 | /* Do platform specific device initialization at pci_enable_device() time */ | ||
38 | int pcibios_plat_dev_init(struct pci_dev *dev) | ||
39 | { | ||
40 | return 0; | ||
41 | } | ||
diff --git a/arch/mips/pci/ops-au1000.c b/arch/mips/pci/ops-au1000.c new file mode 100644 index 00000000000..9a57c5ab91d --- /dev/null +++ b/arch/mips/pci/ops-au1000.c | |||
@@ -0,0 +1,308 @@ | |||
1 | /* | ||
2 | * BRIEF MODULE DESCRIPTION | ||
3 | * Alchemy/AMD Au1xx0 PCI support. | ||
4 | * | ||
5 | * Copyright 2001-2003, 2007-2008 MontaVista Software Inc. | ||
6 | * Author: MontaVista Software, Inc. <source@mvista.com> | ||
7 | * | ||
8 | * Support for all devices (greater than 16) added by David Gathright. | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify it | ||
11 | * under the terms of the GNU General Public License as published by the | ||
12 | * Free Software Foundation; either version 2 of the License, or (at your | ||
13 | * option) any later version. | ||
14 | * | ||
15 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
16 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
17 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
18 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
19 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
20 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
21 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
22 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
23 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
24 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
25 | * | ||
26 | * You should have received a copy of the GNU General Public License along | ||
27 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
28 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
29 | */ | ||
30 | |||
31 | #include <linux/types.h> | ||
32 | #include <linux/pci.h> | ||
33 | #include <linux/kernel.h> | ||
34 | #include <linux/init.h> | ||
35 | #include <linux/vmalloc.h> | ||
36 | |||
37 | #include <asm/mach-au1x00/au1000.h> | ||
38 | |||
39 | #undef DEBUG | ||
40 | #ifdef DEBUG | ||
41 | #define DBG(x...) printk(KERN_DEBUG x) | ||
42 | #else | ||
43 | #define DBG(x...) | ||
44 | #endif | ||
45 | |||
46 | #define PCI_ACCESS_READ 0 | ||
47 | #define PCI_ACCESS_WRITE 1 | ||
48 | |||
49 | int (*board_pci_idsel)(unsigned int devsel, int assert); | ||
50 | |||
51 | void mod_wired_entry(int entry, unsigned long entrylo0, | ||
52 | unsigned long entrylo1, unsigned long entryhi, | ||
53 | unsigned long pagemask) | ||
54 | { | ||
55 | unsigned long old_pagemask; | ||
56 | unsigned long old_ctx; | ||
57 | |||
58 | /* Save old context and create impossible VPN2 value */ | ||
59 | old_ctx = read_c0_entryhi() & 0xff; | ||
60 | old_pagemask = read_c0_pagemask(); | ||
61 | write_c0_index(entry); | ||
62 | write_c0_pagemask(pagemask); | ||
63 | write_c0_entryhi(entryhi); | ||
64 | write_c0_entrylo0(entrylo0); | ||
65 | write_c0_entrylo1(entrylo1); | ||
66 | tlb_write_indexed(); | ||
67 | write_c0_entryhi(old_ctx); | ||
68 | write_c0_pagemask(old_pagemask); | ||
69 | } | ||
70 | |||
71 | static struct vm_struct *pci_cfg_vm; | ||
72 | static int pci_cfg_wired_entry; | ||
73 | static unsigned long last_entryLo0, last_entryLo1; | ||
74 | |||
75 | /* | ||
76 | * We can't ioremap the entire pci config space because it's too large. | ||
77 | * Nor can we call ioremap dynamically because some device drivers use | ||
78 | * the PCI config routines from within interrupt handlers and that | ||
79 | * becomes a problem in get_vm_area(). We use one wired TLB to handle | ||
80 | * all config accesses for all busses. | ||
81 | */ | ||
82 | void __init au1x_pci_cfg_init(void) | ||
83 | { | ||
84 | /* Reserve a wired entry for PCI config accesses */ | ||
85 | pci_cfg_vm = get_vm_area(0x2000, VM_IOREMAP); | ||
86 | if (!pci_cfg_vm) | ||
87 | panic(KERN_ERR "PCI unable to get vm area\n"); | ||
88 | pci_cfg_wired_entry = read_c0_wired(); | ||
89 | add_wired_entry(0, 0, (unsigned long)pci_cfg_vm->addr, PM_4K); | ||
90 | last_entryLo0 = last_entryLo1 = 0xffffffff; | ||
91 | } | ||
92 | |||
93 | static int config_access(unsigned char access_type, struct pci_bus *bus, | ||
94 | unsigned int dev_fn, unsigned char where, u32 *data) | ||
95 | { | ||
96 | #if defined(CONFIG_SOC_AU1500) || defined(CONFIG_SOC_AU1550) | ||
97 | unsigned int device = PCI_SLOT(dev_fn); | ||
98 | unsigned int function = PCI_FUNC(dev_fn); | ||
99 | unsigned long offset, status; | ||
100 | unsigned long cfg_base; | ||
101 | unsigned long flags; | ||
102 | int error = PCIBIOS_SUCCESSFUL; | ||
103 | unsigned long entryLo0, entryLo1; | ||
104 | |||
105 | if (device > 19) { | ||
106 | *data = 0xffffffff; | ||
107 | return -1; | ||
108 | } | ||
109 | |||
110 | local_irq_save(flags); | ||
111 | au_writel(((0x2000 << 16) | (au_readl(Au1500_PCI_STATCMD) & 0xffff)), | ||
112 | Au1500_PCI_STATCMD); | ||
113 | au_sync_udelay(1); | ||
114 | |||
115 | /* | ||
116 | * Allow board vendors to implement their own off-chip IDSEL. | ||
117 | * If it doesn't succeed, may as well bail out at this point. | ||
118 | */ | ||
119 | if (board_pci_idsel && board_pci_idsel(device, 1) == 0) { | ||
120 | *data = 0xffffffff; | ||
121 | local_irq_restore(flags); | ||
122 | return -1; | ||
123 | } | ||
124 | |||
125 | /* Setup the config window */ | ||
126 | if (bus->number == 0) | ||
127 | cfg_base = (1 << device) << 11; | ||
128 | else | ||
129 | cfg_base = 0x80000000 | (bus->number << 16) | (device << 11); | ||
130 | |||
131 | /* Setup the lower bits of the 36-bit address */ | ||
132 | offset = (function << 8) | (where & ~0x3); | ||
133 | /* Pick up any address that falls below the page mask */ | ||
134 | offset |= cfg_base & ~PAGE_MASK; | ||
135 | |||
136 | /* Page boundary */ | ||
137 | cfg_base = cfg_base & PAGE_MASK; | ||
138 | |||
139 | /* | ||
140 | * To improve performance, if the current device is the same as | ||
141 | * the last device accessed, we don't touch the TLB. | ||
142 | */ | ||
143 | entryLo0 = (6 << 26) | (cfg_base >> 6) | (2 << 3) | 7; | ||
144 | entryLo1 = (6 << 26) | (cfg_base >> 6) | (0x1000 >> 6) | (2 << 3) | 7; | ||
145 | if ((entryLo0 != last_entryLo0) || (entryLo1 != last_entryLo1)) { | ||
146 | mod_wired_entry(pci_cfg_wired_entry, entryLo0, entryLo1, | ||
147 | (unsigned long)pci_cfg_vm->addr, PM_4K); | ||
148 | last_entryLo0 = entryLo0; | ||
149 | last_entryLo1 = entryLo1; | ||
150 | } | ||
151 | |||
152 | if (access_type == PCI_ACCESS_WRITE) | ||
153 | au_writel(*data, (int)(pci_cfg_vm->addr + offset)); | ||
154 | else | ||
155 | *data = au_readl((int)(pci_cfg_vm->addr + offset)); | ||
156 | |||
157 | au_sync_udelay(2); | ||
158 | |||
159 | DBG("cfg_access %d bus->number %u dev %u at %x *data %x conf %lx\n", | ||
160 | access_type, bus->number, device, where, *data, offset); | ||
161 | |||
162 | /* Check master abort */ | ||
163 | status = au_readl(Au1500_PCI_STATCMD); | ||
164 | |||
165 | if (status & (1 << 29)) { | ||
166 | *data = 0xffffffff; | ||
167 | error = -1; | ||
168 | DBG("Au1x Master Abort\n"); | ||
169 | } else if ((status >> 28) & 0xf) { | ||
170 | DBG("PCI ERR detected: device %u, status %lx\n", | ||
171 | device, (status >> 28) & 0xf); | ||
172 | |||
173 | /* Clear errors */ | ||
174 | au_writel(status & 0xf000ffff, Au1500_PCI_STATCMD); | ||
175 | |||
176 | *data = 0xffffffff; | ||
177 | error = -1; | ||
178 | } | ||
179 | |||
180 | /* Take away the IDSEL. */ | ||
181 | if (board_pci_idsel) | ||
182 | (void)board_pci_idsel(device, 0); | ||
183 | |||
184 | local_irq_restore(flags); | ||
185 | return error; | ||
186 | #endif | ||
187 | } | ||
188 | |||
189 | static int read_config_byte(struct pci_bus *bus, unsigned int devfn, | ||
190 | int where, u8 *val) | ||
191 | { | ||
192 | u32 data; | ||
193 | int ret; | ||
194 | |||
195 | ret = config_access(PCI_ACCESS_READ, bus, devfn, where, &data); | ||
196 | if (where & 1) | ||
197 | data >>= 8; | ||
198 | if (where & 2) | ||
199 | data >>= 16; | ||
200 | *val = data & 0xff; | ||
201 | return ret; | ||
202 | } | ||
203 | |||
204 | static int read_config_word(struct pci_bus *bus, unsigned int devfn, | ||
205 | int where, u16 *val) | ||
206 | { | ||
207 | u32 data; | ||
208 | int ret; | ||
209 | |||
210 | ret = config_access(PCI_ACCESS_READ, bus, devfn, where, &data); | ||
211 | if (where & 2) | ||
212 | data >>= 16; | ||
213 | *val = data & 0xffff; | ||
214 | return ret; | ||
215 | } | ||
216 | |||
217 | static int read_config_dword(struct pci_bus *bus, unsigned int devfn, | ||
218 | int where, u32 *val) | ||
219 | { | ||
220 | int ret; | ||
221 | |||
222 | ret = config_access(PCI_ACCESS_READ, bus, devfn, where, val); | ||
223 | return ret; | ||
224 | } | ||
225 | |||
226 | static int write_config_byte(struct pci_bus *bus, unsigned int devfn, | ||
227 | int where, u8 val) | ||
228 | { | ||
229 | u32 data = 0; | ||
230 | |||
231 | if (config_access(PCI_ACCESS_READ, bus, devfn, where, &data)) | ||
232 | return -1; | ||
233 | |||
234 | data = (data & ~(0xff << ((where & 3) << 3))) | | ||
235 | (val << ((where & 3) << 3)); | ||
236 | |||
237 | if (config_access(PCI_ACCESS_WRITE, bus, devfn, where, &data)) | ||
238 | return -1; | ||
239 | |||
240 | return PCIBIOS_SUCCESSFUL; | ||
241 | } | ||
242 | |||
243 | static int write_config_word(struct pci_bus *bus, unsigned int devfn, | ||
244 | int where, u16 val) | ||
245 | { | ||
246 | u32 data = 0; | ||
247 | |||
248 | if (config_access(PCI_ACCESS_READ, bus, devfn, where, &data)) | ||
249 | return -1; | ||
250 | |||
251 | data = (data & ~(0xffff << ((where & 3) << 3))) | | ||
252 | (val << ((where & 3) << 3)); | ||
253 | |||
254 | if (config_access(PCI_ACCESS_WRITE, bus, devfn, where, &data)) | ||
255 | return -1; | ||
256 | |||
257 | return PCIBIOS_SUCCESSFUL; | ||
258 | } | ||
259 | |||
260 | static int write_config_dword(struct pci_bus *bus, unsigned int devfn, | ||
261 | int where, u32 val) | ||
262 | { | ||
263 | if (config_access(PCI_ACCESS_WRITE, bus, devfn, where, &val)) | ||
264 | return -1; | ||
265 | |||
266 | return PCIBIOS_SUCCESSFUL; | ||
267 | } | ||
268 | |||
269 | static int config_read(struct pci_bus *bus, unsigned int devfn, | ||
270 | int where, int size, u32 *val) | ||
271 | { | ||
272 | switch (size) { | ||
273 | case 1: { | ||
274 | u8 _val; | ||
275 | int rc = read_config_byte(bus, devfn, where, &_val); | ||
276 | |||
277 | *val = _val; | ||
278 | return rc; | ||
279 | } | ||
280 | case 2: { | ||
281 | u16 _val; | ||
282 | int rc = read_config_word(bus, devfn, where, &_val); | ||
283 | |||
284 | *val = _val; | ||
285 | return rc; | ||
286 | } | ||
287 | default: | ||
288 | return read_config_dword(bus, devfn, where, val); | ||
289 | } | ||
290 | } | ||
291 | |||
292 | static int config_write(struct pci_bus *bus, unsigned int devfn, | ||
293 | int where, int size, u32 val) | ||
294 | { | ||
295 | switch (size) { | ||
296 | case 1: | ||
297 | return write_config_byte(bus, devfn, where, (u8) val); | ||
298 | case 2: | ||
299 | return write_config_word(bus, devfn, where, (u16) val); | ||
300 | default: | ||
301 | return write_config_dword(bus, devfn, where, val); | ||
302 | } | ||
303 | } | ||
304 | |||
305 | struct pci_ops au1x_pci_ops = { | ||
306 | config_read, | ||
307 | config_write | ||
308 | }; | ||
diff --git a/arch/mips/pci/ops-titan-ht.c b/arch/mips/pci/ops-titan-ht.c new file mode 100644 index 00000000000..57d54adc9e2 --- /dev/null +++ b/arch/mips/pci/ops-titan-ht.c | |||
@@ -0,0 +1,124 @@ | |||
1 | /* | ||
2 | * Copyright 2003 PMC-Sierra | ||
3 | * Author: Manish Lachwani (lachwani@pmc-sierra.com) | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms of the GNU General Public License as published by the | ||
7 | * Free Software Foundation; either version 2 of the License, or (at your | ||
8 | * option) any later version. | ||
9 | * | ||
10 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
11 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
12 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
13 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
14 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
15 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
16 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
17 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
18 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
19 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
20 | * | ||
21 | * You should have received a copy of the GNU General Public License along | ||
22 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
23 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
24 | */ | ||
25 | |||
26 | #include <linux/types.h> | ||
27 | #include <linux/pci.h> | ||
28 | #include <linux/kernel.h> | ||
29 | #include <linux/delay.h> | ||
30 | #include <asm/io.h> | ||
31 | |||
32 | #include <asm/titan_dep.h> | ||
33 | |||
34 | static int titan_ht_config_read_dword(struct pci_bus *bus, unsigned int devfn, | ||
35 | int offset, u32 *val) | ||
36 | { | ||
37 | volatile uint32_t address; | ||
38 | int busno; | ||
39 | |||
40 | busno = bus->number; | ||
41 | |||
42 | address = (busno << 16) | (devfn << 8) | (offset & 0xfc) | 0x80000000; | ||
43 | if (busno != 0) | ||
44 | address |= 1; | ||
45 | |||
46 | /* | ||
47 | * RM9000 HT Errata: Issue back to back HT config | ||
48 | * transcations. Issue a BIU sync before and | ||
49 | * after the HT cycle | ||
50 | */ | ||
51 | |||
52 | *(volatile int32_t *) 0xfb0000f0 |= 0x2; | ||
53 | |||
54 | udelay(30); | ||
55 | |||
56 | *(volatile int32_t *) 0xfb0006f8 = address; | ||
57 | *(val) = *(volatile int32_t *) 0xfb0006fc; | ||
58 | |||
59 | udelay(30); | ||
60 | |||
61 | * (volatile int32_t *) 0xfb0000f0 |= 0x2; | ||
62 | |||
63 | return PCIBIOS_SUCCESSFUL; | ||
64 | } | ||
65 | |||
66 | static int titan_ht_config_read(struct pci_bus *bus, unsigned int devfn, | ||
67 | int offset, int size, u32 *val) | ||
68 | { | ||
69 | uint32_t dword; | ||
70 | |||
71 | titan_ht_config_read_dword(bus, devfn, offset, &dword); | ||
72 | |||
73 | dword >>= ((offset & 3) << 3); | ||
74 | dword &= (0xffffffffU >> ((4 - size) << 8)); | ||
75 | |||
76 | return PCIBIOS_SUCCESSFUL; | ||
77 | } | ||
78 | |||
79 | static inline int titan_ht_config_write_dword(struct pci_bus *bus, | ||
80 | unsigned int devfn, int offset, u32 val) | ||
81 | { | ||
82 | volatile uint32_t address; | ||
83 | int busno; | ||
84 | |||
85 | busno = bus->number; | ||
86 | |||
87 | address = (busno << 16) | (devfn << 8) | (offset & 0xfc) | 0x80000000; | ||
88 | if (busno != 0) | ||
89 | address |= 1; | ||
90 | |||
91 | *(volatile int32_t *) 0xfb0000f0 |= 0x2; | ||
92 | |||
93 | udelay(30); | ||
94 | |||
95 | *(volatile int32_t *) 0xfb0006f8 = address; | ||
96 | *(volatile int32_t *) 0xfb0006fc = val; | ||
97 | |||
98 | udelay(30); | ||
99 | |||
100 | *(volatile int32_t *) 0xfb0000f0 |= 0x2; | ||
101 | |||
102 | return PCIBIOS_SUCCESSFUL; | ||
103 | } | ||
104 | |||
105 | static int titan_ht_config_write(struct pci_bus *bus, unsigned int devfn, | ||
106 | int offset, int size, u32 val) | ||
107 | { | ||
108 | uint32_t val1, val2, mask; | ||
109 | |||
110 | titan_ht_config_read_dword(bus, devfn, offset, &val2); | ||
111 | |||
112 | val1 = val << ((offset & 3) << 3); | ||
113 | mask = ~(0xffffffffU >> ((4 - size) << 8)); | ||
114 | val2 &= ~(mask << ((offset & 3) << 8)); | ||
115 | |||
116 | titan_ht_config_write_dword(bus, devfn, offset, val1 | val2); | ||
117 | |||
118 | return PCIBIOS_SUCCESSFUL; | ||
119 | } | ||
120 | |||
121 | struct pci_ops titan_ht_pci_ops = { | ||
122 | .read = titan_ht_config_read, | ||
123 | .write = titan_ht_config_write, | ||
124 | }; | ||
diff --git a/arch/mips/pci/ops-titan.c b/arch/mips/pci/ops-titan.c new file mode 100644 index 00000000000..ebf8fc40e9b --- /dev/null +++ b/arch/mips/pci/ops-titan.c | |||
@@ -0,0 +1,111 @@ | |||
1 | /* | ||
2 | * Copyright 2003 PMC-Sierra | ||
3 | * Author: Manish Lachwani (lachwani@pmc-sierra.com) | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms of the GNU General Public License as published by the | ||
7 | * Free Software Foundation; either version 2 of the License, or (at your | ||
8 | * option) any later version. | ||
9 | * | ||
10 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
11 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
12 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
13 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
14 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
15 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
16 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
17 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
18 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
19 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
20 | * | ||
21 | * You should have received a copy of the GNU General Public License along | ||
22 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
23 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
24 | */ | ||
25 | #include <linux/types.h> | ||
26 | #include <linux/pci.h> | ||
27 | #include <linux/kernel.h> | ||
28 | |||
29 | #include <asm/pci.h> | ||
30 | #include <asm/io.h> | ||
31 | #include <asm/rm9k-ocd.h> | ||
32 | |||
33 | /* | ||
34 | * PCI specific defines | ||
35 | */ | ||
36 | #define TITAN_PCI_0_CONFIG_ADDRESS 0x780 | ||
37 | #define TITAN_PCI_0_CONFIG_DATA 0x784 | ||
38 | |||
39 | /* | ||
40 | * Titan PCI Config Read Byte | ||
41 | */ | ||
42 | static int titan_read_config(struct pci_bus *bus, unsigned int devfn, int reg, | ||
43 | int size, u32 * val) | ||
44 | { | ||
45 | uint32_t address, tmp; | ||
46 | int dev, busno, func; | ||
47 | |||
48 | busno = bus->number; | ||
49 | dev = PCI_SLOT(devfn); | ||
50 | func = PCI_FUNC(devfn); | ||
51 | |||
52 | address = (busno << 16) | (dev << 11) | (func << 8) | | ||
53 | (reg & 0xfc) | 0x80000000; | ||
54 | |||
55 | |||
56 | /* start the configuration cycle */ | ||
57 | ocd_writel(address, TITAN_PCI_0_CONFIG_ADDRESS); | ||
58 | tmp = ocd_readl(TITAN_PCI_0_CONFIG_DATA) >> ((reg & 3) << 3); | ||
59 | |||
60 | switch (size) { | ||
61 | case 1: | ||
62 | tmp &= 0xff; | ||
63 | case 2: | ||
64 | tmp &= 0xffff; | ||
65 | } | ||
66 | *val = tmp; | ||
67 | |||
68 | return PCIBIOS_SUCCESSFUL; | ||
69 | } | ||
70 | |||
71 | static int titan_write_config(struct pci_bus *bus, unsigned int devfn, int reg, | ||
72 | int size, u32 val) | ||
73 | { | ||
74 | uint32_t address; | ||
75 | int dev, busno, func; | ||
76 | |||
77 | busno = bus->number; | ||
78 | dev = PCI_SLOT(devfn); | ||
79 | func = PCI_FUNC(devfn); | ||
80 | |||
81 | address = (busno << 16) | (dev << 11) | (func << 8) | | ||
82 | (reg & 0xfc) | 0x80000000; | ||
83 | |||
84 | /* start the configuration cycle */ | ||
85 | ocd_writel(address, TITAN_PCI_0_CONFIG_ADDRESS); | ||
86 | |||
87 | /* write the data */ | ||
88 | switch (size) { | ||
89 | case 1: | ||
90 | ocd_writeb(val, TITAN_PCI_0_CONFIG_DATA + (~reg & 0x3)); | ||
91 | break; | ||
92 | |||
93 | case 2: | ||
94 | ocd_writew(val, TITAN_PCI_0_CONFIG_DATA + (~reg & 0x2)); | ||
95 | break; | ||
96 | |||
97 | case 4: | ||
98 | ocd_writel(val, TITAN_PCI_0_CONFIG_DATA); | ||
99 | break; | ||
100 | } | ||
101 | |||
102 | return PCIBIOS_SUCCESSFUL; | ||
103 | } | ||
104 | |||
105 | /* | ||
106 | * Titan PCI structure | ||
107 | */ | ||
108 | struct pci_ops titan_pci_ops = { | ||
109 | titan_read_config, | ||
110 | titan_write_config, | ||
111 | }; | ||
diff --git a/arch/mips/pci/pci-yosemite.c b/arch/mips/pci/pci-yosemite.c new file mode 100644 index 00000000000..cf5e1a25cb7 --- /dev/null +++ b/arch/mips/pci/pci-yosemite.c | |||
@@ -0,0 +1,67 @@ | |||
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) 2004 by Ralf Baechle (ralf@linux-mips.org) | ||
7 | */ | ||
8 | #include <linux/init.h> | ||
9 | #include <linux/kernel.h> | ||
10 | #include <linux/types.h> | ||
11 | #include <linux/pci.h> | ||
12 | #include <asm/titan_dep.h> | ||
13 | |||
14 | extern struct pci_ops titan_pci_ops; | ||
15 | |||
16 | static struct resource py_mem_resource = { | ||
17 | .start = 0xe0000000UL, | ||
18 | .end = 0xe3ffffffUL, | ||
19 | .name = "Titan PCI MEM", | ||
20 | .flags = IORESOURCE_MEM | ||
21 | }; | ||
22 | |||
23 | /* | ||
24 | * PMON really reserves 16MB of I/O port space but that's stupid, nothing | ||
25 | * needs that much since allocations are limited to 256 bytes per device | ||
26 | * anyway. So we just claim 64kB here. | ||
27 | */ | ||
28 | #define TITAN_IO_SIZE 0x0000ffffUL | ||
29 | #define TITAN_IO_BASE 0xe8000000UL | ||
30 | |||
31 | static struct resource py_io_resource = { | ||
32 | .start = 0x00001000UL, | ||
33 | .end = TITAN_IO_SIZE - 1, | ||
34 | .name = "Titan IO MEM", | ||
35 | .flags = IORESOURCE_IO, | ||
36 | }; | ||
37 | |||
38 | static struct pci_controller py_controller = { | ||
39 | .pci_ops = &titan_pci_ops, | ||
40 | .mem_resource = &py_mem_resource, | ||
41 | .mem_offset = 0x00000000UL, | ||
42 | .io_resource = &py_io_resource, | ||
43 | .io_offset = 0x00000000UL | ||
44 | }; | ||
45 | |||
46 | static char ioremap_failed[] __initdata = "Could not ioremap I/O port range"; | ||
47 | |||
48 | static int __init pmc_yosemite_setup(void) | ||
49 | { | ||
50 | unsigned long io_v_base; | ||
51 | |||
52 | io_v_base = (unsigned long) ioremap(TITAN_IO_BASE, TITAN_IO_SIZE); | ||
53 | if (!io_v_base) | ||
54 | panic(ioremap_failed); | ||
55 | |||
56 | set_io_port_base(io_v_base); | ||
57 | py_controller.io_map_base = io_v_base; | ||
58 | TITAN_WRITE(RM9000x2_OCD_LKM7, TITAN_READ(RM9000x2_OCD_LKM7) | 1); | ||
59 | |||
60 | ioport_resource.end = TITAN_IO_SIZE - 1; | ||
61 | |||
62 | register_pci_controller(&py_controller); | ||
63 | |||
64 | return 0; | ||
65 | } | ||
66 | |||
67 | arch_initcall(pmc_yosemite_setup); | ||
diff --git a/arch/mips/pmc-sierra/yosemite/Makefile b/arch/mips/pmc-sierra/yosemite/Makefile new file mode 100644 index 00000000000..02f5fb94ea2 --- /dev/null +++ b/arch/mips/pmc-sierra/yosemite/Makefile | |||
@@ -0,0 +1,9 @@ | |||
1 | # | ||
2 | # Makefile for the PMC-Sierra Titan | ||
3 | # | ||
4 | |||
5 | obj-y += irq.o prom.o py-console.o setup.o | ||
6 | |||
7 | obj-$(CONFIG_SMP) += smp.o | ||
8 | |||
9 | ccflags-y := -Werror | ||
diff --git a/arch/mips/pmc-sierra/yosemite/atmel_read_eeprom.c b/arch/mips/pmc-sierra/yosemite/atmel_read_eeprom.c new file mode 100644 index 00000000000..d6f8bdff8cb --- /dev/null +++ b/arch/mips/pmc-sierra/yosemite/atmel_read_eeprom.c | |||
@@ -0,0 +1,169 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2003 PMC-Sierra Inc. | ||
3 | * Author: Manish Lachwani (lachwani@pmc-sierra.com) | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms of the GNU General Public License as published by the | ||
7 | * Free Software Foundation; either version 2 of the License, or (at your | ||
8 | * option) any later version. | ||
9 | * | ||
10 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
11 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
12 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
13 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
14 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
15 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
16 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
17 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
18 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
19 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
20 | * | ||
21 | * You should have received a copy of the GNU General Public License along | ||
22 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
23 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
24 | */ | ||
25 | |||
26 | /* | ||
27 | * Description: | ||
28 | * | ||
29 | * This code reads the ATMEL 24CXX EEPROM. The PMC-Sierra Yosemite board uses the ATMEL | ||
30 | * 24C32/24C64 which uses two byte addressing as compared to 24C16. Note that this program | ||
31 | * uses the serial port like /dev/ttyS0, to communicate with the EEPROM. Hence, you are | ||
32 | * expected to have a connectivity from the EEPROM to the serial port. This program does | ||
33 | * __not__ communicate using the I2C protocol | ||
34 | */ | ||
35 | |||
36 | #include "atmel_read_eeprom.h" | ||
37 | |||
38 | static void delay(int delay) | ||
39 | { | ||
40 | while (delay--); | ||
41 | } | ||
42 | |||
43 | static void send_bit(unsigned char bit) | ||
44 | { | ||
45 | scl_lo; | ||
46 | delay(TXX); | ||
47 | if (bit) | ||
48 | sda_hi; | ||
49 | else | ||
50 | sda_lo; | ||
51 | |||
52 | delay(TXX); | ||
53 | scl_hi; | ||
54 | delay(TXX); | ||
55 | } | ||
56 | |||
57 | static void send_ack(void) | ||
58 | { | ||
59 | send_bit(0); | ||
60 | } | ||
61 | |||
62 | static void send_byte(unsigned char byte) | ||
63 | { | ||
64 | int i = 0; | ||
65 | |||
66 | for (i = 7; i >= 0; i--) | ||
67 | send_bit((byte >> i) & 0x01); | ||
68 | } | ||
69 | |||
70 | static void send_start(void) | ||
71 | { | ||
72 | sda_hi; | ||
73 | delay(TXX); | ||
74 | scl_hi; | ||
75 | delay(TXX); | ||
76 | sda_lo; | ||
77 | delay(TXX); | ||
78 | } | ||
79 | |||
80 | static void send_stop(void) | ||
81 | { | ||
82 | sda_lo; | ||
83 | delay(TXX); | ||
84 | scl_hi; | ||
85 | delay(TXX); | ||
86 | sda_hi; | ||
87 | delay(TXX); | ||
88 | } | ||
89 | |||
90 | static void do_idle(void) | ||
91 | { | ||
92 | sda_hi; | ||
93 | scl_hi; | ||
94 | vcc_off; | ||
95 | } | ||
96 | |||
97 | static int recv_bit(void) | ||
98 | { | ||
99 | int status; | ||
100 | |||
101 | scl_lo; | ||
102 | delay(TXX); | ||
103 | sda_hi; | ||
104 | delay(TXX); | ||
105 | scl_hi; | ||
106 | delay(TXX); | ||
107 | |||
108 | return 1; | ||
109 | } | ||
110 | |||
111 | static unsigned char recv_byte(void) { | ||
112 | int i; | ||
113 | unsigned char byte=0; | ||
114 | |||
115 | for (i=7;i>=0;i--) | ||
116 | byte |= (recv_bit() << i); | ||
117 | |||
118 | return byte; | ||
119 | } | ||
120 | |||
121 | static int recv_ack(void) | ||
122 | { | ||
123 | unsigned int ack; | ||
124 | |||
125 | ack = (unsigned int)recv_bit(); | ||
126 | scl_lo; | ||
127 | |||
128 | if (ack) { | ||
129 | do_idle(); | ||
130 | printk(KERN_ERR "Error reading the Atmel 24C32/24C64 EEPROM\n"); | ||
131 | return -1; | ||
132 | } | ||
133 | |||
134 | return ack; | ||
135 | } | ||
136 | |||
137 | /* | ||
138 | * This function does the actual read of the EEPROM. It needs the buffer into which the | ||
139 | * read data is copied, the size of the EEPROM being read and the buffer size | ||
140 | */ | ||
141 | int read_eeprom(char *buffer, int eeprom_size, int size) | ||
142 | { | ||
143 | int i = 0, err; | ||
144 | |||
145 | send_start(); | ||
146 | send_byte(W_HEADER); | ||
147 | recv_ack(); | ||
148 | |||
149 | /* EEPROM with size of more than 2K need two byte addressing */ | ||
150 | if (eeprom_size > 2048) { | ||
151 | send_byte(0x00); | ||
152 | recv_ack(); | ||
153 | } | ||
154 | |||
155 | send_start(); | ||
156 | send_byte(R_HEADER); | ||
157 | err = recv_ack(); | ||
158 | if (err == -1) | ||
159 | return err; | ||
160 | |||
161 | for (i = 0; i < size; i++) { | ||
162 | *buffer++ = recv_byte(); | ||
163 | send_ack(); | ||
164 | } | ||
165 | |||
166 | /* Note : We should do some check if the buffer contains correct information */ | ||
167 | |||
168 | send_stop(); | ||
169 | } | ||
diff --git a/arch/mips/pmc-sierra/yosemite/atmel_read_eeprom.h b/arch/mips/pmc-sierra/yosemite/atmel_read_eeprom.h new file mode 100644 index 00000000000..d6c7ec469fa --- /dev/null +++ b/arch/mips/pmc-sierra/yosemite/atmel_read_eeprom.h | |||
@@ -0,0 +1,67 @@ | |||
1 | /* | ||
2 | * arch/mips/pmc-sierra/yosemite/atmel_read_eeprom.c | ||
3 | * | ||
4 | * Copyright (C) 2003 PMC-Sierra Inc. | ||
5 | * Author: Manish Lachwani (lachwani@pmc-sierra.com) | ||
6 | * Copyright (C) 2005 Ralf Baechle (ralf@linux-mips.org) | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License as published by the | ||
10 | * Free Software Foundation; either version 2 of the License, or (at your | ||
11 | * option) any later version. | ||
12 | * | ||
13 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
14 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
15 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
16 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
17 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
18 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
19 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
20 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
21 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
22 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
23 | * | ||
24 | * You should have received a copy of the GNU General Public License along | ||
25 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
26 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
27 | */ | ||
28 | |||
29 | /* | ||
30 | * Header file for atmel_read_eeprom.c | ||
31 | */ | ||
32 | |||
33 | #include <linux/types.h> | ||
34 | #include <linux/pci.h> | ||
35 | #include <linux/kernel.h> | ||
36 | #include <linux/slab.h> | ||
37 | #include <asm/pci.h> | ||
38 | #include <asm/io.h> | ||
39 | #include <linux/init.h> | ||
40 | #include <asm/termios.h> | ||
41 | #include <asm/ioctls.h> | ||
42 | #include <linux/ioctl.h> | ||
43 | #include <linux/fcntl.h> | ||
44 | |||
45 | #define DEFAULT_PORT "/dev/ttyS0" /* Port to open */ | ||
46 | #define TXX 0 /* Dummy loop for spinning */ | ||
47 | |||
48 | #define BLOCK_SEL 0x00 | ||
49 | #define SLAVE_ADDR 0xa0 | ||
50 | #define READ_BIT 0x01 | ||
51 | #define WRITE_BIT 0x00 | ||
52 | #define R_HEADER SLAVE_ADDR + BLOCK_SEL + READ_BIT | ||
53 | #define W_HEADER SLAVE_ADDR + BLOCK_SEL + WRITE_BIT | ||
54 | |||
55 | /* | ||
56 | * Clock, Voltages and Data | ||
57 | */ | ||
58 | #define vcc_off (ioctl(fd, TIOCSBRK, 0)) | ||
59 | #define vcc_on (ioctl(fd, TIOCCBRK, 0)) | ||
60 | #define sda_hi (ioctl(fd, TIOCMBIS, &dtr)) | ||
61 | #define sda_lo (ioctl(fd, TIOCMBIC, &dtr)) | ||
62 | #define scl_lo (ioctl(fd, TIOCMBIC, &rts)) | ||
63 | #define scl_hi (ioctl(fd, TIOCMBIS, &rts)) | ||
64 | |||
65 | const char rts = TIOCM_RTS; | ||
66 | const char dtr = TIOCM_DTR; | ||
67 | int fd; | ||
diff --git a/arch/mips/pmc-sierra/yosemite/ht-irq.c b/arch/mips/pmc-sierra/yosemite/ht-irq.c new file mode 100644 index 00000000000..86b98e98fb4 --- /dev/null +++ b/arch/mips/pmc-sierra/yosemite/ht-irq.c | |||
@@ -0,0 +1,51 @@ | |||
1 | /* | ||
2 | * Copyright 2003 PMC-Sierra | ||
3 | * Author: Manish Lachwani (lachwani@pmc-sierra.com) | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms of the GNU General Public License as published by the | ||
7 | * Free Software Foundation; either version 2 of the License, or (at your | ||
8 | * option) any later version. | ||
9 | * | ||
10 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
11 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
12 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
13 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
14 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
15 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
16 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
17 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
18 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
19 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
20 | * | ||
21 | * You should have received a copy of the GNU General Public License along | ||
22 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
23 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
24 | */ | ||
25 | |||
26 | #include <linux/types.h> | ||
27 | #include <linux/pci.h> | ||
28 | #include <linux/kernel.h> | ||
29 | #include <linux/init.h> | ||
30 | #include <asm/pci.h> | ||
31 | |||
32 | /* | ||
33 | * HT Bus fixup for the Titan | ||
34 | * XXX IRQ values need to change based on the board layout | ||
35 | */ | ||
36 | void __init titan_ht_pcibios_fixup_bus(struct pci_bus *bus) | ||
37 | { | ||
38 | struct pci_bus *current_bus = bus; | ||
39 | struct pci_dev *devices; | ||
40 | struct list_head *devices_link; | ||
41 | |||
42 | list_for_each(devices_link, &(current_bus->devices)) { | ||
43 | devices = pci_dev_b(devices_link); | ||
44 | if (devices == NULL) | ||
45 | continue; | ||
46 | } | ||
47 | |||
48 | /* | ||
49 | * PLX and SPKT related changes go here | ||
50 | */ | ||
51 | } | ||
diff --git a/arch/mips/pmc-sierra/yosemite/ht.c b/arch/mips/pmc-sierra/yosemite/ht.c new file mode 100644 index 00000000000..63be40e470d --- /dev/null +++ b/arch/mips/pmc-sierra/yosemite/ht.c | |||
@@ -0,0 +1,415 @@ | |||
1 | /* | ||
2 | * Copyright 2003 PMC-Sierra | ||
3 | * Author: Manish Lachwani (lachwani@pmc-sierra.com) | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms of the GNU General Public License as published by the | ||
7 | * Free Software Foundation; either version 2 of the License, or (at your | ||
8 | * option) any later version. | ||
9 | * | ||
10 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
11 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
12 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
13 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
14 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
15 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
16 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
17 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
18 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
19 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
20 | * | ||
21 | * You should have received a copy of the GNU General Public License along | ||
22 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
23 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
24 | */ | ||
25 | |||
26 | #include <linux/types.h> | ||
27 | #include <linux/pci.h> | ||
28 | #include <linux/kernel.h> | ||
29 | #include <asm/pci.h> | ||
30 | #include <asm/io.h> | ||
31 | |||
32 | #include <linux/init.h> | ||
33 | #include <asm/titan_dep.h> | ||
34 | |||
35 | #ifdef CONFIG_HYPERTRANSPORT | ||
36 | |||
37 | |||
38 | /* | ||
39 | * This function check if the Hypertransport Link Initialization completed. If | ||
40 | * it did, then proceed further with scanning bus #2 | ||
41 | */ | ||
42 | static __inline__ int check_titan_htlink(void) | ||
43 | { | ||
44 | u32 val; | ||
45 | |||
46 | val = *(volatile uint32_t *)(RM9000x2_HTLINK_REG); | ||
47 | if (val & 0x00000020) | ||
48 | /* HT Link Initialization completed */ | ||
49 | return 1; | ||
50 | else | ||
51 | return 0; | ||
52 | } | ||
53 | |||
54 | static int titan_ht_config_read_dword(struct pci_dev *device, | ||
55 | int offset, u32* val) | ||
56 | { | ||
57 | int dev, bus, func; | ||
58 | uint32_t address_reg, data_reg; | ||
59 | uint32_t address; | ||
60 | |||
61 | bus = device->bus->number; | ||
62 | dev = PCI_SLOT(device->devfn); | ||
63 | func = PCI_FUNC(device->devfn); | ||
64 | |||
65 | /* XXX Need to change the Bus # */ | ||
66 | if (bus > 2) | ||
67 | address = (bus << 16) | (dev << 11) | (func << 8) | (offset & 0xfc) | | ||
68 | 0x80000000 | 0x1; | ||
69 | else | ||
70 | address = (dev << 11) | (func << 8) | (offset & 0xfc) | 0x80000000; | ||
71 | |||
72 | address_reg = RM9000x2_OCD_HTCFGA; | ||
73 | data_reg = RM9000x2_OCD_HTCFGD; | ||
74 | |||
75 | RM9K_WRITE(address_reg, address); | ||
76 | RM9K_READ(data_reg, val); | ||
77 | |||
78 | return PCIBIOS_SUCCESSFUL; | ||
79 | } | ||
80 | |||
81 | |||
82 | static int titan_ht_config_read_word(struct pci_dev *device, | ||
83 | int offset, u16* val) | ||
84 | { | ||
85 | int dev, bus, func; | ||
86 | uint32_t address_reg, data_reg; | ||
87 | uint32_t address; | ||
88 | |||
89 | bus = device->bus->number; | ||
90 | dev = PCI_SLOT(device->devfn); | ||
91 | func = PCI_FUNC(device->devfn); | ||
92 | |||
93 | /* XXX Need to change the Bus # */ | ||
94 | if (bus > 2) | ||
95 | address = (bus << 16) | (dev << 11) | (func << 8) | (offset & 0xfc) | | ||
96 | 0x80000000 | 0x1; | ||
97 | else | ||
98 | address = (dev << 11) | (func << 8) | (offset & 0xfc) | 0x80000000; | ||
99 | |||
100 | address_reg = RM9000x2_OCD_HTCFGA; | ||
101 | data_reg = RM9000x2_OCD_HTCFGD; | ||
102 | |||
103 | if ((offset & 0x3) == 0) | ||
104 | offset = 0x2; | ||
105 | else | ||
106 | offset = 0x0; | ||
107 | |||
108 | RM9K_WRITE(address_reg, address); | ||
109 | RM9K_READ_16(data_reg + offset, val); | ||
110 | |||
111 | return PCIBIOS_SUCCESSFUL; | ||
112 | } | ||
113 | |||
114 | |||
115 | u32 longswap(unsigned long l) | ||
116 | { | ||
117 | unsigned char b1, b2, b3, b4; | ||
118 | |||
119 | b1 = l&255; | ||
120 | b2 = (l>>8)&255; | ||
121 | b3 = (l>>16)&255; | ||
122 | b4 = (l>>24)&255; | ||
123 | |||
124 | return ((b1<<24) + (b2<<16) + (b3<<8) + b4); | ||
125 | } | ||
126 | |||
127 | |||
128 | static int titan_ht_config_read_byte(struct pci_dev *device, | ||
129 | int offset, u8* val) | ||
130 | { | ||
131 | int dev, bus, func; | ||
132 | uint32_t address_reg, data_reg; | ||
133 | uint32_t address; | ||
134 | int offset1; | ||
135 | |||
136 | bus = device->bus->number; | ||
137 | dev = PCI_SLOT(device->devfn); | ||
138 | func = PCI_FUNC(device->devfn); | ||
139 | |||
140 | /* XXX Need to change the Bus # */ | ||
141 | if (bus > 2) | ||
142 | address = (bus << 16) | (dev << 11) | (func << 8) | (offset & 0xfc) | | ||
143 | 0x80000000 | 0x1; | ||
144 | else | ||
145 | address = (dev << 11) | (func << 8) | (offset & 0xfc) | 0x80000000; | ||
146 | |||
147 | address_reg = RM9000x2_OCD_HTCFGA; | ||
148 | data_reg = RM9000x2_OCD_HTCFGD; | ||
149 | |||
150 | RM9K_WRITE(address_reg, address); | ||
151 | |||
152 | if ((offset & 0x3) == 0) { | ||
153 | offset1 = 0x3; | ||
154 | } | ||
155 | if ((offset & 0x3) == 1) { | ||
156 | offset1 = 0x2; | ||
157 | } | ||
158 | if ((offset & 0x3) == 2) { | ||
159 | offset1 = 0x1; | ||
160 | } | ||
161 | if ((offset & 0x3) == 3) { | ||
162 | offset1 = 0x0; | ||
163 | } | ||
164 | RM9K_READ_8(data_reg + offset1, val); | ||
165 | |||
166 | return PCIBIOS_SUCCESSFUL; | ||
167 | } | ||
168 | |||
169 | |||
170 | static int titan_ht_config_write_dword(struct pci_dev *device, | ||
171 | int offset, u8 val) | ||
172 | { | ||
173 | int dev, bus, func; | ||
174 | uint32_t address_reg, data_reg; | ||
175 | uint32_t address; | ||
176 | |||
177 | bus = device->bus->number; | ||
178 | dev = PCI_SLOT(device->devfn); | ||
179 | func = PCI_FUNC(device->devfn); | ||
180 | |||
181 | /* XXX Need to change the Bus # */ | ||
182 | if (bus > 2) | ||
183 | address = (bus << 16) | (dev << 11) | (func << 8) | (offset & 0xfc) | | ||
184 | 0x80000000 | 0x1; | ||
185 | else | ||
186 | address = (dev << 11) | (func << 8) | (offset & 0xfc) | 0x80000000; | ||
187 | |||
188 | address_reg = RM9000x2_OCD_HTCFGA; | ||
189 | data_reg = RM9000x2_OCD_HTCFGD; | ||
190 | |||
191 | RM9K_WRITE(address_reg, address); | ||
192 | RM9K_WRITE(data_reg, val); | ||
193 | |||
194 | return PCIBIOS_SUCCESSFUL; | ||
195 | } | ||
196 | |||
197 | static int titan_ht_config_write_word(struct pci_dev *device, | ||
198 | int offset, u8 val) | ||
199 | { | ||
200 | int dev, bus, func; | ||
201 | uint32_t address_reg, data_reg; | ||
202 | uint32_t address; | ||
203 | |||
204 | bus = device->bus->number; | ||
205 | dev = PCI_SLOT(device->devfn); | ||
206 | func = PCI_FUNC(device->devfn); | ||
207 | |||
208 | /* XXX Need to change the Bus # */ | ||
209 | if (bus > 2) | ||
210 | address = (bus << 16) | (dev << 11) | (func << 8) | (offset & 0xfc) | | ||
211 | 0x80000000 | 0x1; | ||
212 | else | ||
213 | address = (dev << 11) | (func << 8) | (offset & 0xfc) | 0x80000000; | ||
214 | |||
215 | address_reg = RM9000x2_OCD_HTCFGA; | ||
216 | data_reg = RM9000x2_OCD_HTCFGD; | ||
217 | |||
218 | if ((offset & 0x3) == 0) | ||
219 | offset = 0x2; | ||
220 | else | ||
221 | offset = 0x0; | ||
222 | |||
223 | RM9K_WRITE(address_reg, address); | ||
224 | RM9K_WRITE_16(data_reg + offset, val); | ||
225 | |||
226 | return PCIBIOS_SUCCESSFUL; | ||
227 | } | ||
228 | |||
229 | static int titan_ht_config_write_byte(struct pci_dev *device, | ||
230 | int offset, u8 val) | ||
231 | { | ||
232 | int dev, bus, func; | ||
233 | uint32_t address_reg, data_reg; | ||
234 | uint32_t address; | ||
235 | int offset1; | ||
236 | |||
237 | bus = device->bus->number; | ||
238 | dev = PCI_SLOT(device->devfn); | ||
239 | func = PCI_FUNC(device->devfn); | ||
240 | |||
241 | /* XXX Need to change the Bus # */ | ||
242 | if (bus > 2) | ||
243 | address = (bus << 16) | (dev << 11) | (func << 8) | (offset & 0xfc) | | ||
244 | 0x80000000 | 0x1; | ||
245 | else | ||
246 | address = (dev << 11) | (func << 8) | (offset & 0xfc) | 0x80000000; | ||
247 | |||
248 | address_reg = RM9000x2_OCD_HTCFGA; | ||
249 | data_reg = RM9000x2_OCD_HTCFGD; | ||
250 | |||
251 | RM9K_WRITE(address_reg, address); | ||
252 | |||
253 | if ((offset & 0x3) == 0) { | ||
254 | offset1 = 0x3; | ||
255 | } | ||
256 | if ((offset & 0x3) == 1) { | ||
257 | offset1 = 0x2; | ||
258 | } | ||
259 | if ((offset & 0x3) == 2) { | ||
260 | offset1 = 0x1; | ||
261 | } | ||
262 | if ((offset & 0x3) == 3) { | ||
263 | offset1 = 0x0; | ||
264 | } | ||
265 | |||
266 | RM9K_WRITE_8(data_reg + offset1, val); | ||
267 | return PCIBIOS_SUCCESSFUL; | ||
268 | } | ||
269 | |||
270 | |||
271 | static void titan_pcibios_set_master(struct pci_dev *dev) | ||
272 | { | ||
273 | u16 cmd; | ||
274 | int bus = dev->bus->number; | ||
275 | |||
276 | if (check_titan_htlink()) | ||
277 | titan_ht_config_read_word(dev, PCI_COMMAND, &cmd); | ||
278 | |||
279 | cmd |= PCI_COMMAND_MASTER; | ||
280 | |||
281 | if (check_titan_htlink()) | ||
282 | titan_ht_config_write_word(dev, PCI_COMMAND, cmd); | ||
283 | } | ||
284 | |||
285 | |||
286 | int pcibios_enable_resources(struct pci_dev *dev) | ||
287 | { | ||
288 | u16 cmd, old_cmd; | ||
289 | u8 tmp1; | ||
290 | int idx; | ||
291 | struct resource *r; | ||
292 | int bus = dev->bus->number; | ||
293 | |||
294 | if (check_titan_htlink()) | ||
295 | titan_ht_config_read_word(dev, PCI_COMMAND, &cmd); | ||
296 | |||
297 | old_cmd = cmd; | ||
298 | for (idx = 0; idx < 6; idx++) { | ||
299 | r = &dev->resource[idx]; | ||
300 | if (!r->start && r->end) { | ||
301 | printk(KERN_ERR | ||
302 | "PCI: Device %s not available because of " | ||
303 | "resource collisions\n", pci_name(dev)); | ||
304 | return -EINVAL; | ||
305 | } | ||
306 | if (r->flags & IORESOURCE_IO) | ||
307 | cmd |= PCI_COMMAND_IO; | ||
308 | if (r->flags & IORESOURCE_MEM) | ||
309 | cmd |= PCI_COMMAND_MEMORY; | ||
310 | } | ||
311 | if (cmd != old_cmd) { | ||
312 | if (check_titan_htlink()) | ||
313 | titan_ht_config_write_word(dev, PCI_COMMAND, cmd); | ||
314 | } | ||
315 | |||
316 | if (check_titan_htlink()) | ||
317 | titan_ht_config_read_byte(dev, PCI_CACHE_LINE_SIZE, &tmp1); | ||
318 | |||
319 | if (tmp1 != 8) { | ||
320 | printk(KERN_WARNING "PCI setting cache line size to 8 from " | ||
321 | "%d\n", tmp1); | ||
322 | } | ||
323 | |||
324 | if (check_titan_htlink()) | ||
325 | titan_ht_config_write_byte(dev, PCI_CACHE_LINE_SIZE, 8); | ||
326 | |||
327 | if (check_titan_htlink()) | ||
328 | titan_ht_config_read_byte(dev, PCI_LATENCY_TIMER, &tmp1); | ||
329 | |||
330 | if (tmp1 < 32 || tmp1 == 0xff) { | ||
331 | printk(KERN_WARNING "PCI setting latency timer to 32 from %d\n", | ||
332 | tmp1); | ||
333 | } | ||
334 | |||
335 | if (check_titan_htlink()) | ||
336 | titan_ht_config_write_byte(dev, PCI_LATENCY_TIMER, 32); | ||
337 | |||
338 | return 0; | ||
339 | } | ||
340 | |||
341 | |||
342 | int pcibios_enable_device(struct pci_dev *dev, int mask) | ||
343 | { | ||
344 | return pcibios_enable_resources(dev); | ||
345 | } | ||
346 | |||
347 | resource_size_t pcibios_align_resource(void *data, const struct resource *res, | ||
348 | resource_size_t size, resource_size_t align) | ||
349 | { | ||
350 | struct pci_dev *dev = data; | ||
351 | resource_size_t start = res->start; | ||
352 | |||
353 | if (res->flags & IORESOURCE_IO) { | ||
354 | /* We need to avoid collisions with `mirrored' VGA ports | ||
355 | and other strange ISA hardware, so we always want the | ||
356 | addresses kilobyte aligned. */ | ||
357 | if (size > 0x100) { | ||
358 | printk(KERN_ERR "PCI: I/O Region %s/%d too large" | ||
359 | " (%ld bytes)\n", pci_name(dev), | ||
360 | dev->resource - res, size); | ||
361 | } | ||
362 | |||
363 | start = (start + 1024 - 1) & ~(1024 - 1); | ||
364 | } | ||
365 | |||
366 | return start; | ||
367 | } | ||
368 | |||
369 | struct pci_ops titan_pci_ops = { | ||
370 | titan_ht_config_read_byte, | ||
371 | titan_ht_config_read_word, | ||
372 | titan_ht_config_read_dword, | ||
373 | titan_ht_config_write_byte, | ||
374 | titan_ht_config_write_word, | ||
375 | titan_ht_config_write_dword | ||
376 | }; | ||
377 | |||
378 | void __init pcibios_fixup_bus(struct pci_bus *c) | ||
379 | { | ||
380 | titan_ht_pcibios_fixup_bus(c); | ||
381 | } | ||
382 | |||
383 | void __init pcibios_init(void) | ||
384 | { | ||
385 | |||
386 | /* Reset PCI I/O and PCI MEM values */ | ||
387 | /* XXX Need to add the proper values here */ | ||
388 | ioport_resource.start = 0xe0000000; | ||
389 | ioport_resource.end = 0xe0000000 + 0x20000000 - 1; | ||
390 | iomem_resource.start = 0xc0000000; | ||
391 | iomem_resource.end = 0xc0000000 + 0x20000000 - 1; | ||
392 | |||
393 | /* XXX Need to add bus values */ | ||
394 | pci_scan_bus(2, &titan_pci_ops, NULL); | ||
395 | pci_scan_bus(3, &titan_pci_ops, NULL); | ||
396 | } | ||
397 | |||
398 | /* | ||
399 | * for parsing "pci=" kernel boot arguments. | ||
400 | */ | ||
401 | char *pcibios_setup(char *str) | ||
402 | { | ||
403 | printk(KERN_INFO "rr: pcibios_setup\n"); | ||
404 | /* Nothing to do for now. */ | ||
405 | |||
406 | return str; | ||
407 | } | ||
408 | |||
409 | unsigned __init int pcibios_assign_all_busses(void) | ||
410 | { | ||
411 | /* We want to use the PCI bus detection done by PMON */ | ||
412 | return 0; | ||
413 | } | ||
414 | |||
415 | #endif /* CONFIG_HYPERTRANSPORT */ | ||
diff --git a/arch/mips/pmc-sierra/yosemite/irq.c b/arch/mips/pmc-sierra/yosemite/irq.c new file mode 100644 index 00000000000..25bbbf428be --- /dev/null +++ b/arch/mips/pmc-sierra/yosemite/irq.c | |||
@@ -0,0 +1,153 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2003 PMC-Sierra Inc. | ||
3 | * Author: Manish Lachwani (lachwani@pmc-sierra.com) | ||
4 | * | ||
5 | * Copyright (C) 2006 Ralf Baechle (ralf@linux-mips.org) | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify it | ||
8 | * under the terms of the GNU General Public License as published by the | ||
9 | * Free Software Foundation; either version 2 of the License, or (at your | ||
10 | * option) any later version. | ||
11 | * | ||
12 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
13 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
14 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
15 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
16 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
17 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
18 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
19 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
20 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
21 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
22 | * | ||
23 | * You should have received a copy of the GNU General Public License along | ||
24 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
25 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
26 | * | ||
27 | * Second level Interrupt handlers for the PMC-Sierra Titan/Yosemite board | ||
28 | */ | ||
29 | #include <linux/errno.h> | ||
30 | #include <linux/init.h> | ||
31 | #include <linux/kernel_stat.h> | ||
32 | #include <linux/module.h> | ||
33 | #include <linux/signal.h> | ||
34 | #include <linux/sched.h> | ||
35 | #include <linux/types.h> | ||
36 | #include <linux/interrupt.h> | ||
37 | #include <linux/ioport.h> | ||
38 | #include <linux/irq.h> | ||
39 | #include <linux/timex.h> | ||
40 | #include <linux/random.h> | ||
41 | #include <linux/bitops.h> | ||
42 | #include <asm/bootinfo.h> | ||
43 | #include <asm/io.h> | ||
44 | #include <asm/irq.h> | ||
45 | #include <asm/irq_cpu.h> | ||
46 | #include <asm/mipsregs.h> | ||
47 | #include <asm/system.h> | ||
48 | #include <asm/titan_dep.h> | ||
49 | |||
50 | /* Hypertransport specific */ | ||
51 | #define IRQ_ACK_BITS 0x00000000 /* Ack bits */ | ||
52 | |||
53 | #define HYPERTRANSPORT_INTA 0x78 /* INTA# */ | ||
54 | #define HYPERTRANSPORT_INTB 0x79 /* INTB# */ | ||
55 | #define HYPERTRANSPORT_INTC 0x7a /* INTC# */ | ||
56 | #define HYPERTRANSPORT_INTD 0x7b /* INTD# */ | ||
57 | |||
58 | extern void titan_mailbox_irq(void); | ||
59 | |||
60 | #ifdef CONFIG_HYPERTRANSPORT | ||
61 | /* | ||
62 | * Handle hypertransport & SMP interrupts. The interrupt lines are scarce. | ||
63 | * For interprocessor interrupts, the best thing to do is to use the INTMSG | ||
64 | * register. We use the same external interrupt line, i.e. INTB3 and monitor | ||
65 | * another status bit | ||
66 | */ | ||
67 | static void ll_ht_smp_irq_handler(int irq) | ||
68 | { | ||
69 | u32 status = OCD_READ(RM9000x2_OCD_INTP0STATUS4); | ||
70 | |||
71 | /* Ack all the bits that correspond to the interrupt sources */ | ||
72 | if (status != 0) | ||
73 | OCD_WRITE(RM9000x2_OCD_INTP0STATUS4, IRQ_ACK_BITS); | ||
74 | |||
75 | status = OCD_READ(RM9000x2_OCD_INTP1STATUS4); | ||
76 | if (status != 0) | ||
77 | OCD_WRITE(RM9000x2_OCD_INTP1STATUS4, IRQ_ACK_BITS); | ||
78 | |||
79 | #ifdef CONFIG_HT_LEVEL_TRIGGER | ||
80 | /* | ||
81 | * Level Trigger Mode only. Send the HT EOI message back to the source. | ||
82 | */ | ||
83 | switch (status) { | ||
84 | case 0x1000000: | ||
85 | OCD_WRITE(RM9000x2_OCD_HTEOI, HYPERTRANSPORT_INTA); | ||
86 | break; | ||
87 | case 0x2000000: | ||
88 | OCD_WRITE(RM9000x2_OCD_HTEOI, HYPERTRANSPORT_INTB); | ||
89 | break; | ||
90 | case 0x4000000: | ||
91 | OCD_WRITE(RM9000x2_OCD_HTEOI, HYPERTRANSPORT_INTC); | ||
92 | break; | ||
93 | case 0x8000000: | ||
94 | OCD_WRITE(RM9000x2_OCD_HTEOI, HYPERTRANSPORT_INTD); | ||
95 | break; | ||
96 | case 0x0000001: | ||
97 | /* PLX */ | ||
98 | OCD_WRITE(RM9000x2_OCD_HTEOI, 0x20); | ||
99 | OCD_WRITE(IRQ_CLEAR_REG, IRQ_ACK_BITS); | ||
100 | break; | ||
101 | case 0xf000000: | ||
102 | OCD_WRITE(RM9000x2_OCD_HTEOI, HYPERTRANSPORT_INTA); | ||
103 | OCD_WRITE(RM9000x2_OCD_HTEOI, HYPERTRANSPORT_INTB); | ||
104 | OCD_WRITE(RM9000x2_OCD_HTEOI, HYPERTRANSPORT_INTC); | ||
105 | OCD_WRITE(RM9000x2_OCD_HTEOI, HYPERTRANSPORT_INTD); | ||
106 | break; | ||
107 | } | ||
108 | #endif /* CONFIG_HT_LEVEL_TRIGGER */ | ||
109 | |||
110 | do_IRQ(irq); | ||
111 | } | ||
112 | #endif | ||
113 | |||
114 | asmlinkage void plat_irq_dispatch(void) | ||
115 | { | ||
116 | unsigned int cause = read_c0_cause(); | ||
117 | unsigned int status = read_c0_status(); | ||
118 | unsigned int pending = cause & status; | ||
119 | |||
120 | if (pending & STATUSF_IP7) { | ||
121 | do_IRQ(7); | ||
122 | } else if (pending & STATUSF_IP2) { | ||
123 | #ifdef CONFIG_HYPERTRANSPORT | ||
124 | ll_ht_smp_irq_handler(2); | ||
125 | #else | ||
126 | do_IRQ(2); | ||
127 | #endif | ||
128 | } else if (pending & STATUSF_IP3) { | ||
129 | do_IRQ(3); | ||
130 | } else if (pending & STATUSF_IP4) { | ||
131 | do_IRQ(4); | ||
132 | } else if (pending & STATUSF_IP5) { | ||
133 | #ifdef CONFIG_SMP | ||
134 | titan_mailbox_irq(); | ||
135 | #else | ||
136 | do_IRQ(5); | ||
137 | #endif | ||
138 | } else if (pending & STATUSF_IP6) { | ||
139 | do_IRQ(4); | ||
140 | } | ||
141 | } | ||
142 | |||
143 | /* | ||
144 | * Initialize the next level interrupt handler | ||
145 | */ | ||
146 | void __init arch_init_irq(void) | ||
147 | { | ||
148 | clear_c0_status(ST0_IM); | ||
149 | |||
150 | mips_cpu_irq_init(); | ||
151 | rm7k_cpu_irq_init(); | ||
152 | rm9k_cpu_irq_init(); | ||
153 | } | ||
diff --git a/arch/mips/pmc-sierra/yosemite/prom.c b/arch/mips/pmc-sierra/yosemite/prom.c new file mode 100644 index 00000000000..cf4c868715a --- /dev/null +++ b/arch/mips/pmc-sierra/yosemite/prom.c | |||
@@ -0,0 +1,143 @@ | |||
1 | /* | ||
2 | * This program is free software; you can redistribute it and/or modify it | ||
3 | * under the terms of the GNU General Public License as published by the | ||
4 | * Free Software Foundation; either version 2 of the License, or (at your | ||
5 | * option) any later version. | ||
6 | * | ||
7 | * Copyright (C) 2003, 2004 PMC-Sierra Inc. | ||
8 | * Author: Manish Lachwani (lachwani@pmc-sierra.com) | ||
9 | * Copyright (C) 2004 Ralf Baechle | ||
10 | */ | ||
11 | #include <linux/init.h> | ||
12 | #include <linux/sched.h> | ||
13 | #include <linux/mm.h> | ||
14 | #include <linux/delay.h> | ||
15 | #include <linux/pm.h> | ||
16 | #include <linux/smp.h> | ||
17 | |||
18 | #include <asm/io.h> | ||
19 | #include <asm/pgtable.h> | ||
20 | #include <asm/processor.h> | ||
21 | #include <asm/reboot.h> | ||
22 | #include <asm/smp-ops.h> | ||
23 | #include <asm/system.h> | ||
24 | #include <asm/bootinfo.h> | ||
25 | #include <asm/pmon.h> | ||
26 | |||
27 | #ifdef CONFIG_SMP | ||
28 | extern void prom_grab_secondary(void); | ||
29 | #else | ||
30 | #define prom_grab_secondary() do { } while (0) | ||
31 | #endif | ||
32 | |||
33 | #include "setup.h" | ||
34 | |||
35 | struct callvectors *debug_vectors; | ||
36 | |||
37 | extern unsigned long yosemite_base; | ||
38 | extern unsigned long cpu_clock_freq; | ||
39 | |||
40 | const char *get_system_type(void) | ||
41 | { | ||
42 | return "PMC-Sierra Yosemite"; | ||
43 | } | ||
44 | |||
45 | static void prom_cpu0_exit(void *arg) | ||
46 | { | ||
47 | void *nvram = (void *) YOSEMITE_RTC_BASE; | ||
48 | |||
49 | /* Ask the NVRAM/RTC/watchdog chip to assert reset in 1/16 second */ | ||
50 | writeb(0x84, nvram + 0xff7); | ||
51 | |||
52 | /* wait for the watchdog to go off */ | ||
53 | mdelay(100 + (1000 / 16)); | ||
54 | |||
55 | /* if the watchdog fails for some reason, let people know */ | ||
56 | printk(KERN_NOTICE "Watchdog reset failed\n"); | ||
57 | } | ||
58 | |||
59 | /* | ||
60 | * Reset the NVRAM over the local bus | ||
61 | */ | ||
62 | static void prom_exit(void) | ||
63 | { | ||
64 | #ifdef CONFIG_SMP | ||
65 | if (smp_processor_id()) | ||
66 | /* CPU 1 */ | ||
67 | smp_call_function(prom_cpu0_exit, NULL, 1); | ||
68 | #endif | ||
69 | prom_cpu0_exit(NULL); | ||
70 | } | ||
71 | |||
72 | /* | ||
73 | * Halt the system | ||
74 | */ | ||
75 | static void prom_halt(void) | ||
76 | { | ||
77 | printk(KERN_NOTICE "\n** You can safely turn off the power\n"); | ||
78 | while (1) | ||
79 | __asm__(".set\tmips3\n\t" "wait\n\t" ".set\tmips0"); | ||
80 | } | ||
81 | |||
82 | extern struct plat_smp_ops yos_smp_ops; | ||
83 | |||
84 | /* | ||
85 | * Init routine which accepts the variables from PMON | ||
86 | */ | ||
87 | void __init prom_init(void) | ||
88 | { | ||
89 | int argc = fw_arg0; | ||
90 | char **arg = (char **) fw_arg1; | ||
91 | char **env = (char **) fw_arg2; | ||
92 | struct callvectors *cv = (struct callvectors *) fw_arg3; | ||
93 | int i = 0; | ||
94 | |||
95 | /* Callbacks for halt, restart */ | ||
96 | _machine_restart = (void (*)(char *)) prom_exit; | ||
97 | _machine_halt = prom_halt; | ||
98 | pm_power_off = prom_halt; | ||
99 | |||
100 | debug_vectors = cv; | ||
101 | arcs_cmdline[0] = '\0'; | ||
102 | |||
103 | /* Get the boot parameters */ | ||
104 | for (i = 1; i < argc; i++) { | ||
105 | if (strlen(arcs_cmdline) + strlen(arg[i] + 1) >= | ||
106 | sizeof(arcs_cmdline)) | ||
107 | break; | ||
108 | |||
109 | strcat(arcs_cmdline, arg[i]); | ||
110 | strcat(arcs_cmdline, " "); | ||
111 | } | ||
112 | |||
113 | #ifdef CONFIG_SERIAL_8250_CONSOLE | ||
114 | if ((strstr(arcs_cmdline, "console=ttyS")) == NULL) | ||
115 | strcat(arcs_cmdline, "console=ttyS0,115200"); | ||
116 | #endif | ||
117 | |||
118 | while (*env) { | ||
119 | if (strncmp("ocd_base", *env, strlen("ocd_base")) == 0) | ||
120 | yosemite_base = | ||
121 | simple_strtol(*env + strlen("ocd_base="), NULL, | ||
122 | 16); | ||
123 | |||
124 | if (strncmp("cpuclock", *env, strlen("cpuclock")) == 0) | ||
125 | cpu_clock_freq = | ||
126 | simple_strtol(*env + strlen("cpuclock="), NULL, | ||
127 | 10); | ||
128 | |||
129 | env++; | ||
130 | } | ||
131 | |||
132 | prom_grab_secondary(); | ||
133 | |||
134 | register_smp_ops(&yos_smp_ops); | ||
135 | } | ||
136 | |||
137 | void __init prom_free_prom_memory(void) | ||
138 | { | ||
139 | } | ||
140 | |||
141 | void __init prom_fixup_mem_map(unsigned long start, unsigned long end) | ||
142 | { | ||
143 | } | ||
diff --git a/arch/mips/pmc-sierra/yosemite/py-console.c b/arch/mips/pmc-sierra/yosemite/py-console.c new file mode 100644 index 00000000000..434d7b1a8c6 --- /dev/null +++ b/arch/mips/pmc-sierra/yosemite/py-console.c | |||
@@ -0,0 +1,117 @@ | |||
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) 2001, 2002, 2004 Ralf Baechle | ||
7 | */ | ||
8 | #include <linux/init.h> | ||
9 | #include <linux/console.h> | ||
10 | #include <linux/kdev_t.h> | ||
11 | #include <linux/major.h> | ||
12 | #include <linux/termios.h> | ||
13 | #include <linux/sched.h> | ||
14 | #include <linux/tty.h> | ||
15 | |||
16 | #include <linux/serial.h> | ||
17 | #include <linux/serial_core.h> | ||
18 | #include <asm/serial.h> | ||
19 | #include <asm/io.h> | ||
20 | |||
21 | /* SUPERIO uart register map */ | ||
22 | struct yo_uartregs { | ||
23 | union { | ||
24 | volatile u8 rbr; /* read only, DLAB == 0 */ | ||
25 | volatile u8 thr; /* write only, DLAB == 0 */ | ||
26 | volatile u8 dll; /* DLAB == 1 */ | ||
27 | } u1; | ||
28 | union { | ||
29 | volatile u8 ier; /* DLAB == 0 */ | ||
30 | volatile u8 dlm; /* DLAB == 1 */ | ||
31 | } u2; | ||
32 | union { | ||
33 | volatile u8 iir; /* read only */ | ||
34 | volatile u8 fcr; /* write only */ | ||
35 | } u3; | ||
36 | volatile u8 iu_lcr; | ||
37 | volatile u8 iu_mcr; | ||
38 | volatile u8 iu_lsr; | ||
39 | volatile u8 iu_msr; | ||
40 | volatile u8 iu_scr; | ||
41 | } yo_uregs_t; | ||
42 | |||
43 | #define iu_rbr u1.rbr | ||
44 | #define iu_thr u1.thr | ||
45 | #define iu_dll u1.dll | ||
46 | #define iu_ier u2.ier | ||
47 | #define iu_dlm u2.dlm | ||
48 | #define iu_iir u3.iir | ||
49 | #define iu_fcr u3.fcr | ||
50 | |||
51 | #define ssnop() __asm__ __volatile__("sll $0, $0, 1\n"); | ||
52 | #define ssnop_4() do { ssnop(); ssnop(); ssnop(); ssnop(); } while (0) | ||
53 | |||
54 | #define IO_BASE_64 0x9000000000000000ULL | ||
55 | |||
56 | static unsigned char readb_outer_space(unsigned long long phys) | ||
57 | { | ||
58 | unsigned long long vaddr = IO_BASE_64 | phys; | ||
59 | unsigned char res; | ||
60 | unsigned int sr; | ||
61 | |||
62 | sr = read_c0_status(); | ||
63 | write_c0_status((sr | ST0_KX) & ~ ST0_IE); | ||
64 | ssnop_4(); | ||
65 | |||
66 | __asm__ __volatile__ ( | ||
67 | " .set mips3 \n" | ||
68 | " .set push \n" | ||
69 | " .set noreorder \n" | ||
70 | " .set nomacro \n" | ||
71 | " ld %0, %1 \n" | ||
72 | " .set pop \n" | ||
73 | " lbu %0, (%0) \n" | ||
74 | " .set mips0 \n" | ||
75 | : "=r" (res) | ||
76 | : "R" (vaddr)); | ||
77 | |||
78 | write_c0_status(sr); | ||
79 | ssnop_4(); | ||
80 | |||
81 | return res; | ||
82 | } | ||
83 | |||
84 | static void writeb_outer_space(unsigned long long phys, unsigned char c) | ||
85 | { | ||
86 | unsigned long long vaddr = IO_BASE_64 | phys; | ||
87 | unsigned long tmp; | ||
88 | unsigned int sr; | ||
89 | |||
90 | sr = read_c0_status(); | ||
91 | write_c0_status((sr | ST0_KX) & ~ ST0_IE); | ||
92 | ssnop_4(); | ||
93 | |||
94 | __asm__ __volatile__ ( | ||
95 | " .set mips3 \n" | ||
96 | " .set push \n" | ||
97 | " .set noreorder \n" | ||
98 | " .set nomacro \n" | ||
99 | " ld %0, %1 \n" | ||
100 | " .set pop \n" | ||
101 | " sb %2, (%0) \n" | ||
102 | " .set mips0 \n" | ||
103 | : "=&r" (tmp) | ||
104 | : "R" (vaddr), "r" (c)); | ||
105 | |||
106 | write_c0_status(sr); | ||
107 | ssnop_4(); | ||
108 | } | ||
109 | |||
110 | void prom_putchar(char c) | ||
111 | { | ||
112 | unsigned long lsr = 0xfd000008ULL + offsetof(struct yo_uartregs, iu_lsr); | ||
113 | unsigned long thr = 0xfd000008ULL + offsetof(struct yo_uartregs, iu_thr); | ||
114 | |||
115 | while ((readb_outer_space(lsr) & 0x20) == 0); | ||
116 | writeb_outer_space(thr, c); | ||
117 | } | ||
diff --git a/arch/mips/pmc-sierra/yosemite/setup.c b/arch/mips/pmc-sierra/yosemite/setup.c new file mode 100644 index 00000000000..3498ac9c35a --- /dev/null +++ b/arch/mips/pmc-sierra/yosemite/setup.c | |||
@@ -0,0 +1,223 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2003 PMC-Sierra Inc. | ||
3 | * Author: Manish Lachwani (lachwani@pmc-sierra.com) | ||
4 | * | ||
5 | * Copyright (C) 2004 by Ralf Baechle (ralf@linux-mips.org) | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify it | ||
8 | * under the terms of the GNU General Public License as published by the | ||
9 | * Free Software Foundation; either version 2 of the License, or (at your | ||
10 | * option) any later version. | ||
11 | * | ||
12 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | ||
13 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
14 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
15 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
16 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
17 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
18 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
19 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
20 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
21 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
22 | * | ||
23 | * You should have received a copy of the GNU General Public License along | ||
24 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
25 | * 675 Mass Ave, Cambridge, MA 02139, USA. | ||
26 | */ | ||
27 | #include <linux/bcd.h> | ||
28 | #include <linux/init.h> | ||
29 | #include <linux/kernel.h> | ||
30 | #include <linux/types.h> | ||
31 | #include <linux/mm.h> | ||
32 | #include <linux/bootmem.h> | ||
33 | #include <linux/swap.h> | ||
34 | #include <linux/ioport.h> | ||
35 | #include <linux/sched.h> | ||
36 | #include <linux/interrupt.h> | ||
37 | #include <linux/timex.h> | ||
38 | #include <linux/termios.h> | ||
39 | #include <linux/tty.h> | ||
40 | #include <linux/serial.h> | ||
41 | #include <linux/serial_core.h> | ||
42 | #include <linux/serial_8250.h> | ||
43 | |||
44 | #include <asm/time.h> | ||
45 | #include <asm/bootinfo.h> | ||
46 | #include <asm/page.h> | ||
47 | #include <asm/io.h> | ||
48 | #include <asm/irq.h> | ||
49 | #include <asm/processor.h> | ||
50 | #include <asm/reboot.h> | ||
51 | #include <asm/serial.h> | ||
52 | #include <asm/titan_dep.h> | ||
53 | #include <asm/m48t37.h> | ||
54 | |||
55 | #include "setup.h" | ||
56 | |||
57 | unsigned char titan_ge_mac_addr_base[6] = { | ||
58 | // 0x00, 0x03, 0xcc, 0x1d, 0x22, 0x00 | ||
59 | 0x00, 0xe0, 0x04, 0x00, 0x00, 0x21 | ||
60 | }; | ||
61 | |||
62 | unsigned long cpu_clock_freq; | ||
63 | unsigned long yosemite_base; | ||
64 | |||
65 | static struct m48t37_rtc *m48t37_base; | ||
66 | |||
67 | void __init bus_error_init(void) | ||
68 | { | ||
69 | /* Do nothing */ | ||
70 | } | ||
71 | |||
72 | |||
73 | void read_persistent_clock(struct timespec *ts) | ||
74 | { | ||
75 | unsigned int year, month, day, hour, min, sec; | ||
76 | unsigned long flags; | ||
77 | |||
78 | spin_lock_irqsave(&rtc_lock, flags); | ||
79 | /* Stop the update to the time */ | ||
80 | m48t37_base->control = 0x40; | ||
81 | |||
82 | year = bcd2bin(m48t37_base->year); | ||
83 | year += bcd2bin(m48t37_base->century) * 100; | ||
84 | |||
85 | month = bcd2bin(m48t37_base->month); | ||
86 | day = bcd2bin(m48t37_base->date); | ||
87 | hour = bcd2bin(m48t37_base->hour); | ||
88 | min = bcd2bin(m48t37_base->min); | ||
89 | sec = bcd2bin(m48t37_base->sec); | ||
90 | |||
91 | /* Start the update to the time again */ | ||
92 | m48t37_base->control = 0x00; | ||
93 | spin_unlock_irqrestore(&rtc_lock, flags); | ||
94 | |||
95 | ts->tv_sec = mktime(year, month, day, hour, min, sec); | ||
96 | ts->tv_nsec = 0; | ||
97 | } | ||
98 | |||
99 | int rtc_mips_set_time(unsigned long tim) | ||
100 | { | ||
101 | struct rtc_time tm; | ||
102 | unsigned long flags; | ||
103 | |||
104 | /* | ||
105 | * Convert to a more useful format -- note months count from 0 | ||
106 | * and years from 1900 | ||
107 | */ | ||
108 | rtc_time_to_tm(tim, &tm); | ||
109 | tm.tm_year += 1900; | ||
110 | tm.tm_mon += 1; | ||
111 | |||
112 | spin_lock_irqsave(&rtc_lock, flags); | ||
113 | /* enable writing */ | ||
114 | m48t37_base->control = 0x80; | ||
115 | |||
116 | /* year */ | ||
117 | m48t37_base->year = bin2bcd(tm.tm_year % 100); | ||
118 | m48t37_base->century = bin2bcd(tm.tm_year / 100); | ||
119 | |||
120 | /* month */ | ||
121 | m48t37_base->month = bin2bcd(tm.tm_mon); | ||
122 | |||
123 | /* day */ | ||
124 | m48t37_base->date = bin2bcd(tm.tm_mday); | ||
125 | |||
126 | /* hour/min/sec */ | ||
127 | m48t37_base->hour = bin2bcd(tm.tm_hour); | ||
128 | m48t37_base->min = bin2bcd(tm.tm_min); | ||
129 | m48t37_base->sec = bin2bcd(tm.tm_sec); | ||
130 | |||
131 | /* day of week -- not really used, but let's keep it up-to-date */ | ||
132 | m48t37_base->day = bin2bcd(tm.tm_wday + 1); | ||
133 | |||
134 | /* disable writing */ | ||
135 | m48t37_base->control = 0x00; | ||
136 | spin_unlock_irqrestore(&rtc_lock, flags); | ||
137 | |||
138 | return 0; | ||
139 | } | ||
140 | |||
141 | void __init plat_time_init(void) | ||
142 | { | ||
143 | mips_hpt_frequency = cpu_clock_freq / 2; | ||
144 | mips_hpt_frequency = 33000000 * 3 * 5; | ||
145 | } | ||
146 | |||
147 | unsigned long ocd_base; | ||
148 | |||
149 | EXPORT_SYMBOL(ocd_base); | ||
150 | |||
151 | /* | ||
152 | * Common setup before any secondaries are started | ||
153 | */ | ||
154 | |||
155 | #define TITAN_UART_CLK 3686400 | ||
156 | #define TITAN_SERIAL_BASE_BAUD (TITAN_UART_CLK / 16) | ||
157 | #define TITAN_SERIAL_IRQ 4 | ||
158 | #define TITAN_SERIAL_BASE 0xfd000008UL | ||
159 | |||
160 | static void __init py_map_ocd(void) | ||
161 | { | ||
162 | ocd_base = (unsigned long) ioremap(OCD_BASE, OCD_SIZE); | ||
163 | if (!ocd_base) | ||
164 | panic("Mapping OCD failed - game over. Your score is 0."); | ||
165 | |||
166 | /* Kludge for PMON bug ... */ | ||
167 | OCD_WRITE(0x0710, 0x0ffff029); | ||
168 | } | ||
169 | |||
170 | static void __init py_uart_setup(void) | ||
171 | { | ||
172 | #ifdef CONFIG_SERIAL_8250 | ||
173 | struct uart_port up; | ||
174 | |||
175 | /* | ||
176 | * Register to interrupt zero because we share the interrupt with | ||
177 | * the serial driver which we don't properly support yet. | ||
178 | */ | ||
179 | memset(&up, 0, sizeof(up)); | ||
180 | up.membase = (unsigned char *) ioremap(TITAN_SERIAL_BASE, 8); | ||
181 | up.irq = TITAN_SERIAL_IRQ; | ||
182 | up.uartclk = TITAN_UART_CLK; | ||
183 | up.regshift = 0; | ||
184 | up.iotype = UPIO_MEM; | ||
185 | up.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST; | ||
186 | up.line = 0; | ||
187 | |||
188 | if (early_serial_setup(&up)) | ||
189 | printk(KERN_ERR "Early serial init of port 0 failed\n"); | ||
190 | #endif /* CONFIG_SERIAL_8250 */ | ||
191 | } | ||
192 | |||
193 | static void __init py_rtc_setup(void) | ||
194 | { | ||
195 | m48t37_base = ioremap(YOSEMITE_RTC_BASE, YOSEMITE_RTC_SIZE); | ||
196 | if (!m48t37_base) | ||
197 | printk(KERN_ERR "Mapping the RTC failed\n"); | ||
198 | } | ||
199 | |||
200 | /* Not only time init but that's what the hook it's called through is named */ | ||
201 | static void __init py_late_time_init(void) | ||
202 | { | ||
203 | py_map_ocd(); | ||
204 | py_uart_setup(); | ||
205 | py_rtc_setup(); | ||
206 | } | ||
207 | |||
208 | void __init plat_mem_setup(void) | ||
209 | { | ||
210 | late_time_init = py_late_time_init; | ||
211 | |||
212 | /* Add memory regions */ | ||
213 | add_memory_region(0x00000000, 0x10000000, BOOT_MEM_RAM); | ||
214 | |||
215 | #if 0 /* XXX Crash ... */ | ||
216 | OCD_WRITE(RM9000x2_OCD_HTSC, | ||
217 | OCD_READ(RM9000x2_OCD_HTSC) | HYPERTRANSPORT_ENABLE); | ||
218 | |||
219 | /* Set the BAR. Shifted mode */ | ||
220 | OCD_WRITE(RM9000x2_OCD_HTBAR0, HYPERTRANSPORT_BAR0_ADDR); | ||
221 | OCD_WRITE(RM9000x2_OCD_HTMASK0, HYPERTRANSPORT_SIZE0); | ||
222 | #endif | ||
223 | } | ||
diff --git a/arch/mips/pmc-sierra/yosemite/setup.h b/arch/mips/pmc-sierra/yosemite/setup.h new file mode 100644 index 00000000000..1a01abfc7d3 --- /dev/null +++ b/arch/mips/pmc-sierra/yosemite/setup.h | |||
@@ -0,0 +1,32 @@ | |||
1 | /* | ||
2 | * Copyright 2003, 04 PMC-Sierra | ||
3 | * Author: Manish Lachwani (lachwani@pmc-sierra.com) | ||
4 | * Copyright 2004 Ralf Baechle <ralf@linux-mips.org> | ||
5 | * | ||
6 | * Board specific definititions for the PMC-Sierra Yosemite | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify it | ||
9 | * under the terms of the GNU General Public License as published by the | ||
10 | * Free Software Foundation; either version 2 of the License, or (at your | ||
11 | * option) any later version. | ||
12 | */ | ||
13 | #ifndef __SETUP_H__ | ||
14 | #define __SETUP_H__ | ||
15 | |||
16 | /* M48T37 RTC + NVRAM */ | ||
17 | #define YOSEMITE_RTC_BASE 0xfc800000 | ||
18 | #define YOSEMITE_RTC_SIZE 0x00800000 | ||
19 | |||
20 | #define HYPERTRANSPORT_BAR0_ADDR 0x00000006 | ||
21 | #define HYPERTRANSPORT_SIZE0 0x0fffffff | ||
22 | #define HYPERTRANSPORT_BAR0_ATTR 0x00002000 | ||
23 | |||
24 | #define HYPERTRANSPORT_ENABLE 0x6 | ||
25 | |||
26 | /* | ||
27 | * EEPROM Size | ||
28 | */ | ||
29 | #define TITAN_ATMEL_24C32_SIZE 32768 | ||
30 | #define TITAN_ATMEL_24C64_SIZE 65536 | ||
31 | |||
32 | #endif /* __SETUP_H__ */ | ||
diff --git a/arch/mips/pmc-sierra/yosemite/smp.c b/arch/mips/pmc-sierra/yosemite/smp.c new file mode 100644 index 00000000000..2608752898c --- /dev/null +++ b/arch/mips/pmc-sierra/yosemite/smp.c | |||
@@ -0,0 +1,185 @@ | |||
1 | #include <linux/linkage.h> | ||
2 | #include <linux/sched.h> | ||
3 | #include <linux/smp.h> | ||
4 | |||
5 | #include <asm/pmon.h> | ||
6 | #include <asm/titan_dep.h> | ||
7 | #include <asm/time.h> | ||
8 | |||
9 | #define LAUNCHSTACK_SIZE 256 | ||
10 | |||
11 | static __cpuinitdata arch_spinlock_t launch_lock = __ARCH_SPIN_LOCK_UNLOCKED; | ||
12 | |||
13 | static unsigned long secondary_sp __cpuinitdata; | ||
14 | static unsigned long secondary_gp __cpuinitdata; | ||
15 | |||
16 | static unsigned char launchstack[LAUNCHSTACK_SIZE] __initdata | ||
17 | __attribute__((aligned(2 * sizeof(long)))); | ||
18 | |||
19 | static void __init prom_smp_bootstrap(void) | ||
20 | { | ||
21 | local_irq_disable(); | ||
22 | |||
23 | while (arch_spin_is_locked(&launch_lock)); | ||
24 | |||
25 | __asm__ __volatile__( | ||
26 | " move $sp, %0 \n" | ||
27 | " move $gp, %1 \n" | ||
28 | " j smp_bootstrap \n" | ||
29 | : | ||
30 | : "r" (secondary_sp), "r" (secondary_gp)); | ||
31 | } | ||
32 | |||
33 | /* | ||
34 | * PMON is a fragile beast. It'll blow up once the mappings it's littering | ||
35 | * right into the middle of KSEG3 are blown away so we have to grab the slave | ||
36 | * core early and keep it in a waiting loop. | ||
37 | */ | ||
38 | void __init prom_grab_secondary(void) | ||
39 | { | ||
40 | arch_spin_lock(&launch_lock); | ||
41 | |||
42 | pmon_cpustart(1, &prom_smp_bootstrap, | ||
43 | launchstack + LAUNCHSTACK_SIZE, 0); | ||
44 | } | ||
45 | |||
46 | void titan_mailbox_irq(void) | ||
47 | { | ||
48 | int cpu = smp_processor_id(); | ||
49 | unsigned long status; | ||
50 | |||
51 | switch (cpu) { | ||
52 | case 0: | ||
53 | status = OCD_READ(RM9000x2_OCD_INTP0STATUS3); | ||
54 | OCD_WRITE(RM9000x2_OCD_INTP0CLEAR3, status); | ||
55 | |||
56 | if (status & 0x2) | ||
57 | smp_call_function_interrupt(); | ||
58 | if (status & 0x4) | ||
59 | scheduler_ipi(); | ||
60 | break; | ||
61 | |||
62 | case 1: | ||
63 | status = OCD_READ(RM9000x2_OCD_INTP1STATUS3); | ||
64 | OCD_WRITE(RM9000x2_OCD_INTP1CLEAR3, status); | ||
65 | |||
66 | if (status & 0x2) | ||
67 | smp_call_function_interrupt(); | ||
68 | if (status & 0x4) | ||
69 | scheduler_ipi(); | ||
70 | break; | ||
71 | } | ||
72 | } | ||
73 | |||
74 | /* | ||
75 | * Send inter-processor interrupt | ||
76 | */ | ||
77 | static void yos_send_ipi_single(int cpu, unsigned int action) | ||
78 | { | ||
79 | /* | ||
80 | * Generate an INTMSG so that it can be sent over to the | ||
81 | * destination CPU. The INTMSG will put the STATUS bits | ||
82 | * based on the action desired. An alternative strategy | ||
83 | * is to write to the Interrupt Set register, read the | ||
84 | * Interrupt Status register and clear the Interrupt | ||
85 | * Clear register. The latter is preffered. | ||
86 | */ | ||
87 | switch (action) { | ||
88 | case SMP_RESCHEDULE_YOURSELF: | ||
89 | if (cpu == 1) | ||
90 | OCD_WRITE(RM9000x2_OCD_INTP1SET3, 4); | ||
91 | else | ||
92 | OCD_WRITE(RM9000x2_OCD_INTP0SET3, 4); | ||
93 | break; | ||
94 | |||
95 | case SMP_CALL_FUNCTION: | ||
96 | if (cpu == 1) | ||
97 | OCD_WRITE(RM9000x2_OCD_INTP1SET3, 2); | ||
98 | else | ||
99 | OCD_WRITE(RM9000x2_OCD_INTP0SET3, 2); | ||
100 | break; | ||
101 | } | ||
102 | } | ||
103 | |||
104 | static void yos_send_ipi_mask(const struct cpumask *mask, unsigned int action) | ||
105 | { | ||
106 | unsigned int i; | ||
107 | |||
108 | for_each_cpu(i, mask) | ||
109 | yos_send_ipi_single(i, action); | ||
110 | } | ||
111 | |||
112 | /* | ||
113 | * After we've done initial boot, this function is called to allow the | ||
114 | * board code to clean up state, if needed | ||
115 | */ | ||
116 | static void __cpuinit yos_init_secondary(void) | ||
117 | { | ||
118 | set_c0_status(ST0_CO | ST0_IE | ST0_IM); | ||
119 | } | ||
120 | |||
121 | static void __cpuinit yos_smp_finish(void) | ||
122 | { | ||
123 | } | ||
124 | |||
125 | /* Hook for after all CPUs are online */ | ||
126 | static void yos_cpus_done(void) | ||
127 | { | ||
128 | } | ||
129 | |||
130 | /* | ||
131 | * Firmware CPU startup hook | ||
132 | * Complicated by PMON's weird interface which tries to minimic the UNIX fork. | ||
133 | * It launches the next * available CPU and copies some information on the | ||
134 | * stack so the first thing we do is throw away that stuff and load useful | ||
135 | * values into the registers ... | ||
136 | */ | ||
137 | static void __cpuinit yos_boot_secondary(int cpu, struct task_struct *idle) | ||
138 | { | ||
139 | unsigned long gp = (unsigned long) task_thread_info(idle); | ||
140 | unsigned long sp = __KSTK_TOS(idle); | ||
141 | |||
142 | secondary_sp = sp; | ||
143 | secondary_gp = gp; | ||
144 | |||
145 | arch_spin_unlock(&launch_lock); | ||
146 | } | ||
147 | |||
148 | /* | ||
149 | * Detect available CPUs, populate cpu_possible_map before smp_init | ||
150 | * | ||
151 | * We don't want to start the secondary CPU yet nor do we have a nice probing | ||
152 | * feature in PMON so we just assume presence of the secondary core. | ||
153 | */ | ||
154 | static void __init yos_smp_setup(void) | ||
155 | { | ||
156 | int i; | ||
157 | |||
158 | cpus_clear(cpu_possible_map); | ||
159 | |||
160 | for (i = 0; i < 2; i++) { | ||
161 | cpu_set(i, cpu_possible_map); | ||
162 | __cpu_number_map[i] = i; | ||
163 | __cpu_logical_map[i] = i; | ||
164 | } | ||
165 | } | ||
166 | |||
167 | static void __init yos_prepare_cpus(unsigned int max_cpus) | ||
168 | { | ||
169 | /* | ||
170 | * Be paranoid. Enable the IPI only if we're really about to go SMP. | ||
171 | */ | ||
172 | if (cpus_weight(cpu_possible_map)) | ||
173 | set_c0_status(STATUSF_IP5); | ||
174 | } | ||
175 | |||
176 | struct plat_smp_ops yos_smp_ops = { | ||
177 | .send_ipi_single = yos_send_ipi_single, | ||
178 | .send_ipi_mask = yos_send_ipi_mask, | ||
179 | .init_secondary = yos_init_secondary, | ||
180 | .smp_finish = yos_smp_finish, | ||
181 | .cpus_done = yos_cpus_done, | ||
182 | .boot_secondary = yos_boot_secondary, | ||
183 | .smp_setup = yos_smp_setup, | ||
184 | .prepare_cpus = yos_prepare_cpus, | ||
185 | }; | ||
diff --git a/arch/mips/powertv/asic/Kconfig b/arch/mips/powertv/asic/Kconfig new file mode 100644 index 00000000000..2016bfe94d6 --- /dev/null +++ b/arch/mips/powertv/asic/Kconfig | |||
@@ -0,0 +1,28 @@ | |||
1 | config MIN_RUNTIME_RESOURCES | ||
2 | bool "Support for minimum runtime resources" | ||
3 | default n | ||
4 | depends on POWERTV | ||
5 | help | ||
6 | Enables support for minimizing the number of (SA asic) runtime | ||
7 | resources that are preallocated by the kernel. | ||
8 | |||
9 | config MIN_RUNTIME_DOCSIS | ||
10 | bool "Support for minimum DOCSIS resource" | ||
11 | default y | ||
12 | depends on MIN_RUNTIME_RESOURCES | ||
13 | help | ||
14 | Enables support for the preallocated DOCSIS resource. | ||
15 | |||
16 | config MIN_RUNTIME_PMEM | ||
17 | bool "Support for minimum PMEM resource" | ||
18 | default y | ||
19 | depends on MIN_RUNTIME_RESOURCES | ||
20 | help | ||
21 | Enables support for the preallocated Memory resource. | ||
22 | |||
23 | config MIN_RUNTIME_TFTP | ||
24 | bool "Support for minimum TFTP resource" | ||
25 | default y | ||
26 | depends on MIN_RUNTIME_RESOURCES | ||
27 | help | ||
28 | Enables support for the preallocated TFTP resource. | ||