diff options
Diffstat (limited to 'arch/powerpc/platforms/85xx')
21 files changed, 778 insertions, 113 deletions
diff --git a/arch/powerpc/platforms/85xx/Kconfig b/arch/powerpc/platforms/85xx/Kconfig index d7946be298b6..f000d81c4e31 100644 --- a/arch/powerpc/platforms/85xx/Kconfig +++ b/arch/powerpc/platforms/85xx/Kconfig | |||
@@ -6,6 +6,7 @@ menuconfig FSL_SOC_BOOKE | |||
6 | select MPIC | 6 | select MPIC |
7 | select PPC_PCI_CHOICE | 7 | select PPC_PCI_CHOICE |
8 | select FSL_PCI if PCI | 8 | select FSL_PCI if PCI |
9 | select SERIAL_8250_EXTENDED if SERIAL_8250 | ||
9 | select SERIAL_8250_SHARE_IRQ if SERIAL_8250 | 10 | select SERIAL_8250_SHARE_IRQ if SERIAL_8250 |
10 | default y | 11 | default y |
11 | 12 | ||
@@ -13,6 +14,15 @@ if FSL_SOC_BOOKE | |||
13 | 14 | ||
14 | if PPC32 | 15 | if PPC32 |
15 | 16 | ||
17 | config FSL_85XX_CACHE_SRAM | ||
18 | bool | ||
19 | select PPC_LIB_RHEAP | ||
20 | help | ||
21 | When selected, this option enables cache-sram support | ||
22 | for memory allocation on P1/P2 QorIQ platforms. | ||
23 | cache-sram-size and cache-sram-offset kernel boot | ||
24 | parameters should be passed when this option is enabled. | ||
25 | |||
16 | config MPC8540_ADS | 26 | config MPC8540_ADS |
17 | bool "Freescale MPC8540 ADS" | 27 | bool "Freescale MPC8540 ADS" |
18 | select DEFAULT_UIMAGE | 28 | select DEFAULT_UIMAGE |
@@ -30,6 +40,7 @@ config MPC85xx_CDS | |||
30 | bool "Freescale MPC85xx CDS" | 40 | bool "Freescale MPC85xx CDS" |
31 | select DEFAULT_UIMAGE | 41 | select DEFAULT_UIMAGE |
32 | select PPC_I8259 | 42 | select PPC_I8259 |
43 | select HAS_RAPIDIO | ||
33 | help | 44 | help |
34 | This option enables support for the MPC85xx CDS board | 45 | This option enables support for the MPC85xx CDS board |
35 | 46 | ||
@@ -80,7 +91,6 @@ config P1010_RDB | |||
80 | config P1022_DS | 91 | config P1022_DS |
81 | bool "Freescale P1022 DS" | 92 | bool "Freescale P1022 DS" |
82 | select DEFAULT_UIMAGE | 93 | select DEFAULT_UIMAGE |
83 | select PHYS_64BIT # The DTS has 36-bit addresses | ||
84 | select SWIOTLB | 94 | select SWIOTLB |
85 | help | 95 | help |
86 | This option enables support for the Freescale P1022DS reference board. | 96 | This option enables support for the Freescale P1022DS reference board. |
@@ -171,6 +181,21 @@ config SBC8560 | |||
171 | help | 181 | help |
172 | This option enables support for the Wind River SBC8560 board | 182 | This option enables support for the Wind River SBC8560 board |
173 | 183 | ||
184 | config GE_IMP3A | ||
185 | bool "GE Intelligent Platforms IMP3A" | ||
186 | select DEFAULT_UIMAGE | ||
187 | select SWIOTLB | ||
188 | select MMIO_NVRAM | ||
189 | select GENERIC_GPIO | ||
190 | select ARCH_REQUIRE_GPIOLIB | ||
191 | select GE_FPGA | ||
192 | help | ||
193 | This option enables support for the GE Intelligent Platforms IMP3A | ||
194 | board. | ||
195 | |||
196 | This board is a 3U CompactPCI Single Board Computer with a Freescale | ||
197 | P2020 processor. | ||
198 | |||
174 | config P2041_RDB | 199 | config P2041_RDB |
175 | bool "Freescale P2041 RDB" | 200 | bool "Freescale P2041 RDB" |
176 | select DEFAULT_UIMAGE | 201 | select DEFAULT_UIMAGE |
diff --git a/arch/powerpc/platforms/85xx/Makefile b/arch/powerpc/platforms/85xx/Makefile index 9cb2d4320dcc..2125d4ca068a 100644 --- a/arch/powerpc/platforms/85xx/Makefile +++ b/arch/powerpc/platforms/85xx/Makefile | |||
@@ -27,3 +27,4 @@ obj-$(CONFIG_SBC8548) += sbc8548.o | |||
27 | obj-$(CONFIG_SOCRATES) += socrates.o socrates_fpga_pic.o | 27 | obj-$(CONFIG_SOCRATES) += socrates.o socrates_fpga_pic.o |
28 | obj-$(CONFIG_KSI8560) += ksi8560.o | 28 | obj-$(CONFIG_KSI8560) += ksi8560.o |
29 | obj-$(CONFIG_XES_MPC85xx) += xes_mpc85xx.o | 29 | obj-$(CONFIG_XES_MPC85xx) += xes_mpc85xx.o |
30 | obj-$(CONFIG_GE_IMP3A) += ge_imp3a.o | ||
diff --git a/arch/powerpc/platforms/85xx/corenet_ds.c b/arch/powerpc/platforms/85xx/corenet_ds.c index 07e3e6c47371..df69e99e511c 100644 --- a/arch/powerpc/platforms/85xx/corenet_ds.c +++ b/arch/powerpc/platforms/85xx/corenet_ds.c | |||
@@ -36,8 +36,8 @@ | |||
36 | void __init corenet_ds_pic_init(void) | 36 | void __init corenet_ds_pic_init(void) |
37 | { | 37 | { |
38 | struct mpic *mpic; | 38 | struct mpic *mpic; |
39 | unsigned int flags = MPIC_BIG_ENDIAN | | 39 | unsigned int flags = MPIC_BIG_ENDIAN | MPIC_SINGLE_DEST_CPU | |
40 | MPIC_BROKEN_FRR_NIRQS | MPIC_SINGLE_DEST_CPU; | 40 | MPIC_NO_RESET; |
41 | 41 | ||
42 | if (ppc_md.get_irq == mpic_get_coreint_irq) | 42 | if (ppc_md.get_irq == mpic_get_coreint_irq) |
43 | flags |= MPIC_ENABLE_COREINT; | 43 | flags |= MPIC_ENABLE_COREINT; |
diff --git a/arch/powerpc/platforms/85xx/ge_imp3a.c b/arch/powerpc/platforms/85xx/ge_imp3a.c new file mode 100644 index 000000000000..d50056f424f6 --- /dev/null +++ b/arch/powerpc/platforms/85xx/ge_imp3a.c | |||
@@ -0,0 +1,246 @@ | |||
1 | /* | ||
2 | * GE IMP3A Board Setup | ||
3 | * | ||
4 | * Author Martyn Welch <martyn.welch@ge.com> | ||
5 | * | ||
6 | * Copyright 2010 GE Intelligent Platforms Embedded Systems, Inc. | ||
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 | * Based on: mpc85xx_ds.c (MPC85xx DS Board Setup) | ||
14 | * Copyright 2007 Freescale Semiconductor Inc. | ||
15 | */ | ||
16 | |||
17 | #include <linux/stddef.h> | ||
18 | #include <linux/kernel.h> | ||
19 | #include <linux/pci.h> | ||
20 | #include <linux/kdev_t.h> | ||
21 | #include <linux/delay.h> | ||
22 | #include <linux/seq_file.h> | ||
23 | #include <linux/interrupt.h> | ||
24 | #include <linux/of_platform.h> | ||
25 | #include <linux/memblock.h> | ||
26 | |||
27 | #include <asm/system.h> | ||
28 | #include <asm/time.h> | ||
29 | #include <asm/machdep.h> | ||
30 | #include <asm/pci-bridge.h> | ||
31 | #include <mm/mmu_decl.h> | ||
32 | #include <asm/prom.h> | ||
33 | #include <asm/udbg.h> | ||
34 | #include <asm/mpic.h> | ||
35 | #include <asm/swiotlb.h> | ||
36 | #include <asm/nvram.h> | ||
37 | |||
38 | #include <sysdev/fsl_soc.h> | ||
39 | #include <sysdev/fsl_pci.h> | ||
40 | #include "smp.h" | ||
41 | |||
42 | #include "mpc85xx.h" | ||
43 | #include <sysdev/ge/ge_pic.h> | ||
44 | |||
45 | void __iomem *imp3a_regs; | ||
46 | |||
47 | void __init ge_imp3a_pic_init(void) | ||
48 | { | ||
49 | struct mpic *mpic; | ||
50 | struct device_node *np; | ||
51 | struct device_node *cascade_node = NULL; | ||
52 | unsigned long root = of_get_flat_dt_root(); | ||
53 | |||
54 | if (of_flat_dt_is_compatible(root, "fsl,MPC8572DS-CAMP")) { | ||
55 | mpic = mpic_alloc(NULL, 0, | ||
56 | MPIC_NO_RESET | | ||
57 | MPIC_BIG_ENDIAN | | ||
58 | MPIC_SINGLE_DEST_CPU, | ||
59 | 0, 256, " OpenPIC "); | ||
60 | } else { | ||
61 | mpic = mpic_alloc(NULL, 0, | ||
62 | MPIC_BIG_ENDIAN | | ||
63 | MPIC_SINGLE_DEST_CPU, | ||
64 | 0, 256, " OpenPIC "); | ||
65 | } | ||
66 | |||
67 | BUG_ON(mpic == NULL); | ||
68 | mpic_init(mpic); | ||
69 | /* | ||
70 | * There is a simple interrupt handler in the main FPGA, this needs | ||
71 | * to be cascaded into the MPIC | ||
72 | */ | ||
73 | for_each_node_by_type(np, "interrupt-controller") | ||
74 | if (of_device_is_compatible(np, "gef,fpga-pic-1.00")) { | ||
75 | cascade_node = np; | ||
76 | break; | ||
77 | } | ||
78 | |||
79 | if (cascade_node == NULL) { | ||
80 | printk(KERN_WARNING "IMP3A: No FPGA PIC\n"); | ||
81 | return; | ||
82 | } | ||
83 | |||
84 | gef_pic_init(cascade_node); | ||
85 | of_node_put(cascade_node); | ||
86 | } | ||
87 | |||
88 | #ifdef CONFIG_PCI | ||
89 | static int primary_phb_addr; | ||
90 | #endif /* CONFIG_PCI */ | ||
91 | |||
92 | /* | ||
93 | * Setup the architecture | ||
94 | */ | ||
95 | static void __init ge_imp3a_setup_arch(void) | ||
96 | { | ||
97 | struct device_node *regs; | ||
98 | #ifdef CONFIG_PCI | ||
99 | struct device_node *np; | ||
100 | struct pci_controller *hose; | ||
101 | #endif | ||
102 | dma_addr_t max = 0xffffffff; | ||
103 | |||
104 | if (ppc_md.progress) | ||
105 | ppc_md.progress("ge_imp3a_setup_arch()", 0); | ||
106 | |||
107 | #ifdef CONFIG_PCI | ||
108 | for_each_node_by_type(np, "pci") { | ||
109 | if (of_device_is_compatible(np, "fsl,mpc8540-pci") || | ||
110 | of_device_is_compatible(np, "fsl,mpc8548-pcie") || | ||
111 | of_device_is_compatible(np, "fsl,p2020-pcie")) { | ||
112 | struct resource rsrc; | ||
113 | of_address_to_resource(np, 0, &rsrc); | ||
114 | if ((rsrc.start & 0xfffff) == primary_phb_addr) | ||
115 | fsl_add_bridge(np, 1); | ||
116 | else | ||
117 | fsl_add_bridge(np, 0); | ||
118 | |||
119 | hose = pci_find_hose_for_OF_device(np); | ||
120 | max = min(max, hose->dma_window_base_cur + | ||
121 | hose->dma_window_size); | ||
122 | } | ||
123 | } | ||
124 | #endif | ||
125 | |||
126 | mpc85xx_smp_init(); | ||
127 | |||
128 | #ifdef CONFIG_SWIOTLB | ||
129 | if (memblock_end_of_DRAM() > max) { | ||
130 | ppc_swiotlb_enable = 1; | ||
131 | set_pci_dma_ops(&swiotlb_dma_ops); | ||
132 | ppc_md.pci_dma_dev_setup = pci_dma_dev_setup_swiotlb; | ||
133 | } | ||
134 | #endif | ||
135 | |||
136 | /* Remap basic board registers */ | ||
137 | regs = of_find_compatible_node(NULL, NULL, "ge,imp3a-fpga-regs"); | ||
138 | if (regs) { | ||
139 | imp3a_regs = of_iomap(regs, 0); | ||
140 | if (imp3a_regs == NULL) | ||
141 | printk(KERN_WARNING "Unable to map board registers\n"); | ||
142 | of_node_put(regs); | ||
143 | } | ||
144 | |||
145 | #if defined(CONFIG_MMIO_NVRAM) | ||
146 | mmio_nvram_init(); | ||
147 | #endif | ||
148 | |||
149 | printk(KERN_INFO "GE Intelligent Platforms IMP3A 3U cPCI SBC\n"); | ||
150 | } | ||
151 | |||
152 | /* Return the PCB revision */ | ||
153 | static unsigned int ge_imp3a_get_pcb_rev(void) | ||
154 | { | ||
155 | unsigned int reg; | ||
156 | |||
157 | reg = ioread16(imp3a_regs); | ||
158 | return (reg >> 8) & 0xff; | ||
159 | } | ||
160 | |||
161 | /* Return the board (software) revision */ | ||
162 | static unsigned int ge_imp3a_get_board_rev(void) | ||
163 | { | ||
164 | unsigned int reg; | ||
165 | |||
166 | reg = ioread16(imp3a_regs + 0x2); | ||
167 | return reg & 0xff; | ||
168 | } | ||
169 | |||
170 | /* Return the FPGA revision */ | ||
171 | static unsigned int ge_imp3a_get_fpga_rev(void) | ||
172 | { | ||
173 | unsigned int reg; | ||
174 | |||
175 | reg = ioread16(imp3a_regs + 0x2); | ||
176 | return (reg >> 8) & 0xff; | ||
177 | } | ||
178 | |||
179 | /* Return compactPCI Geographical Address */ | ||
180 | static unsigned int ge_imp3a_get_cpci_geo_addr(void) | ||
181 | { | ||
182 | unsigned int reg; | ||
183 | |||
184 | reg = ioread16(imp3a_regs + 0x6); | ||
185 | return (reg & 0x0f00) >> 8; | ||
186 | } | ||
187 | |||
188 | /* Return compactPCI System Controller Status */ | ||
189 | static unsigned int ge_imp3a_get_cpci_is_syscon(void) | ||
190 | { | ||
191 | unsigned int reg; | ||
192 | |||
193 | reg = ioread16(imp3a_regs + 0x6); | ||
194 | return reg & (1 << 12); | ||
195 | } | ||
196 | |||
197 | static void ge_imp3a_show_cpuinfo(struct seq_file *m) | ||
198 | { | ||
199 | seq_printf(m, "Vendor\t\t: GE Intelligent Platforms\n"); | ||
200 | |||
201 | seq_printf(m, "Revision\t: %u%c\n", ge_imp3a_get_pcb_rev(), | ||
202 | ('A' + ge_imp3a_get_board_rev() - 1)); | ||
203 | |||
204 | seq_printf(m, "FPGA Revision\t: %u\n", ge_imp3a_get_fpga_rev()); | ||
205 | |||
206 | seq_printf(m, "cPCI geo. addr\t: %u\n", ge_imp3a_get_cpci_geo_addr()); | ||
207 | |||
208 | seq_printf(m, "cPCI syscon\t: %s\n", | ||
209 | ge_imp3a_get_cpci_is_syscon() ? "yes" : "no"); | ||
210 | } | ||
211 | |||
212 | /* | ||
213 | * Called very early, device-tree isn't unflattened | ||
214 | */ | ||
215 | static int __init ge_imp3a_probe(void) | ||
216 | { | ||
217 | unsigned long root = of_get_flat_dt_root(); | ||
218 | |||
219 | if (of_flat_dt_is_compatible(root, "ge,IMP3A")) { | ||
220 | #ifdef CONFIG_PCI | ||
221 | primary_phb_addr = 0x9000; | ||
222 | #endif | ||
223 | return 1; | ||
224 | } | ||
225 | |||
226 | return 0; | ||
227 | } | ||
228 | |||
229 | machine_device_initcall(ge_imp3a, mpc85xx_common_publish_devices); | ||
230 | |||
231 | machine_arch_initcall(ge_imp3a, swiotlb_setup_bus_notifier); | ||
232 | |||
233 | define_machine(ge_imp3a) { | ||
234 | .name = "GE_IMP3A", | ||
235 | .probe = ge_imp3a_probe, | ||
236 | .setup_arch = ge_imp3a_setup_arch, | ||
237 | .init_IRQ = ge_imp3a_pic_init, | ||
238 | .show_cpuinfo = ge_imp3a_show_cpuinfo, | ||
239 | #ifdef CONFIG_PCI | ||
240 | .pcibios_fixup_bus = fsl_pcibios_fixup_bus, | ||
241 | #endif | ||
242 | .get_irq = mpic_get_irq, | ||
243 | .restart = fsl_rstcr_restart, | ||
244 | .calibrate_decr = generic_calibrate_decr, | ||
245 | .progress = udbg_progress, | ||
246 | }; | ||
diff --git a/arch/powerpc/platforms/85xx/ksi8560.c b/arch/powerpc/platforms/85xx/ksi8560.c index 20f75d7819c6..60120e55da41 100644 --- a/arch/powerpc/platforms/85xx/ksi8560.c +++ b/arch/powerpc/platforms/85xx/ksi8560.c | |||
@@ -57,8 +57,7 @@ static void machine_restart(char *cmd) | |||
57 | 57 | ||
58 | static void __init ksi8560_pic_init(void) | 58 | static void __init ksi8560_pic_init(void) |
59 | { | 59 | { |
60 | struct mpic *mpic = mpic_alloc(NULL, 0, | 60 | struct mpic *mpic = mpic_alloc(NULL, 0, MPIC_BIG_ENDIAN, |
61 | MPIC_WANTS_RESET | MPIC_BIG_ENDIAN, | ||
62 | 0, 256, " OpenPIC "); | 61 | 0, 256, " OpenPIC "); |
63 | BUG_ON(mpic == NULL); | 62 | BUG_ON(mpic == NULL); |
64 | mpic_init(mpic); | 63 | mpic_init(mpic); |
diff --git a/arch/powerpc/platforms/85xx/mpc8536_ds.c b/arch/powerpc/platforms/85xx/mpc8536_ds.c index cf266826682e..f58872688d8f 100644 --- a/arch/powerpc/platforms/85xx/mpc8536_ds.c +++ b/arch/powerpc/platforms/85xx/mpc8536_ds.c | |||
@@ -36,9 +36,7 @@ | |||
36 | 36 | ||
37 | void __init mpc8536_ds_pic_init(void) | 37 | void __init mpc8536_ds_pic_init(void) |
38 | { | 38 | { |
39 | struct mpic *mpic = mpic_alloc(NULL, 0, | 39 | struct mpic *mpic = mpic_alloc(NULL, 0, MPIC_BIG_ENDIAN, |
40 | MPIC_WANTS_RESET | | ||
41 | MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS, | ||
42 | 0, 256, " OpenPIC "); | 40 | 0, 256, " OpenPIC "); |
43 | BUG_ON(mpic == NULL); | 41 | BUG_ON(mpic == NULL); |
44 | mpic_init(mpic); | 42 | mpic_init(mpic); |
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_ads.c b/arch/powerpc/platforms/85xx/mpc85xx_ads.c index 3bebb5173bfc..d19f675cb369 100644 --- a/arch/powerpc/platforms/85xx/mpc85xx_ads.c +++ b/arch/powerpc/platforms/85xx/mpc85xx_ads.c | |||
@@ -50,8 +50,7 @@ static int mpc85xx_exclude_device(struct pci_controller *hose, | |||
50 | 50 | ||
51 | static void __init mpc85xx_ads_pic_init(void) | 51 | static void __init mpc85xx_ads_pic_init(void) |
52 | { | 52 | { |
53 | struct mpic *mpic = mpic_alloc(NULL, 0, | 53 | struct mpic *mpic = mpic_alloc(NULL, 0, MPIC_BIG_ENDIAN, |
54 | MPIC_WANTS_RESET | MPIC_BIG_ENDIAN, | ||
55 | 0, 256, " OpenPIC "); | 54 | 0, 256, " OpenPIC "); |
56 | BUG_ON(mpic == NULL); | 55 | BUG_ON(mpic == NULL); |
57 | mpic_init(mpic); | 56 | mpic_init(mpic); |
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_cds.c b/arch/powerpc/platforms/85xx/mpc85xx_cds.c index 40f03da616a9..ab5f0bf19454 100644 --- a/arch/powerpc/platforms/85xx/mpc85xx_cds.c +++ b/arch/powerpc/platforms/85xx/mpc85xx_cds.c | |||
@@ -3,7 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Maintained by Kumar Gala (see MAINTAINERS for contact information) | 4 | * Maintained by Kumar Gala (see MAINTAINERS for contact information) |
5 | * | 5 | * |
6 | * Copyright 2005 Freescale Semiconductor Inc. | 6 | * Copyright 2005, 2011-2012 Freescale Semiconductor Inc. |
7 | * | 7 | * |
8 | * This program is free software; you can redistribute it and/or modify it | 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 | 9 | * under the terms of the GNU General Public License as published by the |
@@ -48,17 +48,24 @@ | |||
48 | 48 | ||
49 | #include "mpc85xx.h" | 49 | #include "mpc85xx.h" |
50 | 50 | ||
51 | /* CADMUS info */ | 51 | /* |
52 | /* xxx - galak, move into device tree */ | 52 | * The CDS board contains an FPGA/CPLD called "Cadmus", which collects |
53 | #define CADMUS_BASE (0xf8004000) | 53 | * various logic and performs system control functions. |
54 | #define CADMUS_SIZE (256) | 54 | * Here is the FPGA/CPLD register map. |
55 | #define CM_VER (0) | 55 | */ |
56 | #define CM_CSR (1) | 56 | struct cadmus_reg { |
57 | #define CM_RST (2) | 57 | u8 cm_ver; /* Board version */ |
58 | 58 | u8 cm_csr; /* General control/status */ | |
59 | u8 cm_rst; /* Reset control */ | ||
60 | u8 cm_hsclk; /* High speed clock */ | ||
61 | u8 cm_hsxclk; /* High speed clock extended */ | ||
62 | u8 cm_led; /* LED data */ | ||
63 | u8 cm_pci; /* PCI control/status */ | ||
64 | u8 cm_dma; /* DMA control */ | ||
65 | u8 res[248]; /* Total 256 bytes */ | ||
66 | }; | ||
59 | 67 | ||
60 | static int cds_pci_slot = 2; | 68 | static struct cadmus_reg *cadmus; |
61 | static volatile u8 *cadmus; | ||
62 | 69 | ||
63 | #ifdef CONFIG_PCI | 70 | #ifdef CONFIG_PCI |
64 | 71 | ||
@@ -158,6 +165,33 @@ DECLARE_PCI_FIXUP_EARLY(0x1957, 0x3fff, skip_fake_bridge); | |||
158 | DECLARE_PCI_FIXUP_EARLY(0x3fff, 0x1957, skip_fake_bridge); | 165 | DECLARE_PCI_FIXUP_EARLY(0x3fff, 0x1957, skip_fake_bridge); |
159 | DECLARE_PCI_FIXUP_EARLY(0xff3f, 0x5719, skip_fake_bridge); | 166 | DECLARE_PCI_FIXUP_EARLY(0xff3f, 0x5719, skip_fake_bridge); |
160 | 167 | ||
168 | #define PCI_DEVICE_ID_IDT_TSI310 0x01a7 | ||
169 | |||
170 | /* | ||
171 | * Fix Tsi310 PCI-X bridge resource. | ||
172 | * Force the bridge to open a window from 0x0000-0x1fff in PCI I/O space. | ||
173 | * This allows legacy I/O(i8259, etc) on the VIA southbridge to be accessed. | ||
174 | */ | ||
175 | void mpc85xx_cds_fixup_bus(struct pci_bus *bus) | ||
176 | { | ||
177 | struct pci_dev *dev = bus->self; | ||
178 | struct resource *res = bus->resource[0]; | ||
179 | |||
180 | if (dev != NULL && | ||
181 | dev->vendor == PCI_VENDOR_ID_IBM && | ||
182 | dev->device == PCI_DEVICE_ID_IDT_TSI310) { | ||
183 | if (res) { | ||
184 | res->start = 0; | ||
185 | res->end = 0x1fff; | ||
186 | res->flags = IORESOURCE_IO; | ||
187 | pr_info("mpc85xx_cds: PCI bridge resource fixup applied\n"); | ||
188 | pr_info("mpc85xx_cds: %pR\n", res); | ||
189 | } | ||
190 | } | ||
191 | |||
192 | fsl_pcibios_fixup_bus(bus); | ||
193 | } | ||
194 | |||
161 | #ifdef CONFIG_PPC_I8259 | 195 | #ifdef CONFIG_PPC_I8259 |
162 | static void mpc85xx_8259_cascade_handler(unsigned int irq, | 196 | static void mpc85xx_8259_cascade_handler(unsigned int irq, |
163 | struct irq_desc *desc) | 197 | struct irq_desc *desc) |
@@ -188,8 +222,7 @@ static struct irqaction mpc85xxcds_8259_irqaction = { | |||
188 | static void __init mpc85xx_cds_pic_init(void) | 222 | static void __init mpc85xx_cds_pic_init(void) |
189 | { | 223 | { |
190 | struct mpic *mpic; | 224 | struct mpic *mpic; |
191 | mpic = mpic_alloc(NULL, 0, | 225 | mpic = mpic_alloc(NULL, 0, MPIC_BIG_ENDIAN, |
192 | MPIC_WANTS_RESET | MPIC_BIG_ENDIAN, | ||
193 | 0, 256, " OpenPIC "); | 226 | 0, 256, " OpenPIC "); |
194 | BUG_ON(mpic == NULL); | 227 | BUG_ON(mpic == NULL); |
195 | mpic_init(mpic); | 228 | mpic_init(mpic); |
@@ -249,20 +282,30 @@ machine_device_initcall(mpc85xx_cds, mpc85xx_cds_8259_attach); | |||
249 | */ | 282 | */ |
250 | static void __init mpc85xx_cds_setup_arch(void) | 283 | static void __init mpc85xx_cds_setup_arch(void) |
251 | { | 284 | { |
252 | #ifdef CONFIG_PCI | ||
253 | struct device_node *np; | 285 | struct device_node *np; |
254 | #endif | 286 | int cds_pci_slot; |
255 | 287 | ||
256 | if (ppc_md.progress) | 288 | if (ppc_md.progress) |
257 | ppc_md.progress("mpc85xx_cds_setup_arch()", 0); | 289 | ppc_md.progress("mpc85xx_cds_setup_arch()", 0); |
258 | 290 | ||
259 | cadmus = ioremap(CADMUS_BASE, CADMUS_SIZE); | 291 | np = of_find_compatible_node(NULL, NULL, "fsl,mpc8548cds-fpga"); |
260 | cds_pci_slot = ((cadmus[CM_CSR] >> 6) & 0x3) + 1; | 292 | if (!np) { |
293 | pr_err("Could not find FPGA node.\n"); | ||
294 | return; | ||
295 | } | ||
296 | |||
297 | cadmus = of_iomap(np, 0); | ||
298 | of_node_put(np); | ||
299 | if (!cadmus) { | ||
300 | pr_err("Fail to map FPGA area.\n"); | ||
301 | return; | ||
302 | } | ||
261 | 303 | ||
262 | if (ppc_md.progress) { | 304 | if (ppc_md.progress) { |
263 | char buf[40]; | 305 | char buf[40]; |
306 | cds_pci_slot = ((in_8(&cadmus->cm_csr) >> 6) & 0x3) + 1; | ||
264 | snprintf(buf, 40, "CDS Version = 0x%x in slot %d\n", | 307 | snprintf(buf, 40, "CDS Version = 0x%x in slot %d\n", |
265 | cadmus[CM_VER], cds_pci_slot); | 308 | in_8(&cadmus->cm_ver), cds_pci_slot); |
266 | ppc_md.progress(buf, 0); | 309 | ppc_md.progress(buf, 0); |
267 | } | 310 | } |
268 | 311 | ||
@@ -292,7 +335,8 @@ static void mpc85xx_cds_show_cpuinfo(struct seq_file *m) | |||
292 | svid = mfspr(SPRN_SVR); | 335 | svid = mfspr(SPRN_SVR); |
293 | 336 | ||
294 | seq_printf(m, "Vendor\t\t: Freescale Semiconductor\n"); | 337 | seq_printf(m, "Vendor\t\t: Freescale Semiconductor\n"); |
295 | seq_printf(m, "Machine\t\t: MPC85xx CDS (0x%x)\n", cadmus[CM_VER]); | 338 | seq_printf(m, "Machine\t\t: MPC85xx CDS (0x%x)\n", |
339 | in_8(&cadmus->cm_ver)); | ||
296 | seq_printf(m, "PVR\t\t: 0x%x\n", pvid); | 340 | seq_printf(m, "PVR\t\t: 0x%x\n", pvid); |
297 | seq_printf(m, "SVR\t\t: 0x%x\n", svid); | 341 | seq_printf(m, "SVR\t\t: 0x%x\n", svid); |
298 | 342 | ||
@@ -323,7 +367,7 @@ define_machine(mpc85xx_cds) { | |||
323 | .get_irq = mpic_get_irq, | 367 | .get_irq = mpic_get_irq, |
324 | #ifdef CONFIG_PCI | 368 | #ifdef CONFIG_PCI |
325 | .restart = mpc85xx_cds_restart, | 369 | .restart = mpc85xx_cds_restart, |
326 | .pcibios_fixup_bus = fsl_pcibios_fixup_bus, | 370 | .pcibios_fixup_bus = mpc85xx_cds_fixup_bus, |
327 | #else | 371 | #else |
328 | .restart = fsl_rstcr_restart, | 372 | .restart = fsl_rstcr_restart, |
329 | #endif | 373 | #endif |
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_ds.c b/arch/powerpc/platforms/85xx/mpc85xx_ds.c index eefbb91e1d61..6e23e3e34bd9 100644 --- a/arch/powerpc/platforms/85xx/mpc85xx_ds.c +++ b/arch/powerpc/platforms/85xx/mpc85xx_ds.c | |||
@@ -72,13 +72,13 @@ void __init mpc85xx_ds_pic_init(void) | |||
72 | 72 | ||
73 | if (of_flat_dt_is_compatible(root, "fsl,MPC8572DS-CAMP")) { | 73 | if (of_flat_dt_is_compatible(root, "fsl,MPC8572DS-CAMP")) { |
74 | mpic = mpic_alloc(NULL, 0, | 74 | mpic = mpic_alloc(NULL, 0, |
75 | MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS | | 75 | MPIC_NO_RESET | |
76 | MPIC_BIG_ENDIAN | | ||
76 | MPIC_SINGLE_DEST_CPU, | 77 | MPIC_SINGLE_DEST_CPU, |
77 | 0, 256, " OpenPIC "); | 78 | 0, 256, " OpenPIC "); |
78 | } else { | 79 | } else { |
79 | mpic = mpic_alloc(NULL, 0, | 80 | mpic = mpic_alloc(NULL, 0, |
80 | MPIC_WANTS_RESET | | 81 | MPIC_BIG_ENDIAN | |
81 | MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS | | ||
82 | MPIC_SINGLE_DEST_CPU, | 82 | MPIC_SINGLE_DEST_CPU, |
83 | 0, 256, " OpenPIC "); | 83 | 0, 256, " OpenPIC "); |
84 | } | 84 | } |
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_mds.c b/arch/powerpc/platforms/85xx/mpc85xx_mds.c index 1d15a0cd2c82..f33662b46b8d 100644 --- a/arch/powerpc/platforms/85xx/mpc85xx_mds.c +++ b/arch/powerpc/platforms/85xx/mpc85xx_mds.c | |||
@@ -1,5 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (C) Freescale Semicondutor, Inc. 2006-2010. All rights reserved. | 2 | * Copyright (C) 2006-2010, 2012 Freescale Semicondutor, Inc. |
3 | * All rights reserved. | ||
3 | * | 4 | * |
4 | * Author: Andy Fleming <afleming@freescale.com> | 5 | * Author: Andy Fleming <afleming@freescale.com> |
5 | * | 6 | * |
@@ -51,6 +52,7 @@ | |||
51 | #include <asm/qe_ic.h> | 52 | #include <asm/qe_ic.h> |
52 | #include <asm/mpic.h> | 53 | #include <asm/mpic.h> |
53 | #include <asm/swiotlb.h> | 54 | #include <asm/swiotlb.h> |
55 | #include <asm/fsl_guts.h> | ||
54 | #include "smp.h" | 56 | #include "smp.h" |
55 | 57 | ||
56 | #include "mpc85xx.h" | 58 | #include "mpc85xx.h" |
@@ -268,34 +270,27 @@ static void __init mpc85xx_mds_qe_init(void) | |||
268 | mpc85xx_mds_reset_ucc_phys(); | 270 | mpc85xx_mds_reset_ucc_phys(); |
269 | 271 | ||
270 | if (machine_is(p1021_mds)) { | 272 | if (machine_is(p1021_mds)) { |
271 | #define MPC85xx_PMUXCR_OFFSET 0x60 | ||
272 | #define MPC85xx_PMUXCR_QE0 0x00008000 | ||
273 | #define MPC85xx_PMUXCR_QE3 0x00001000 | ||
274 | #define MPC85xx_PMUXCR_QE9 0x00000040 | ||
275 | #define MPC85xx_PMUXCR_QE12 0x00000008 | ||
276 | static __be32 __iomem *pmuxcr; | ||
277 | 273 | ||
278 | np = of_find_node_by_name(NULL, "global-utilities"); | 274 | struct ccsr_guts_85xx __iomem *guts; |
279 | 275 | ||
276 | np = of_find_node_by_name(NULL, "global-utilities"); | ||
280 | if (np) { | 277 | if (np) { |
281 | pmuxcr = of_iomap(np, 0) + MPC85xx_PMUXCR_OFFSET; | 278 | guts = of_iomap(np, 0); |
282 | 279 | if (!guts) | |
283 | if (!pmuxcr) | 280 | pr_err("mpc85xx-rdb: could not map global utilities register\n"); |
284 | printk(KERN_EMERG "Error: Alternate function" | 281 | else{ |
285 | " signal multiplex control register not" | ||
286 | " mapped!\n"); | ||
287 | else | ||
288 | /* P1021 has pins muxed for QE and other functions. To | 282 | /* P1021 has pins muxed for QE and other functions. To |
289 | * enable QE UEC mode, we need to set bit QE0 for UCC1 | 283 | * enable QE UEC mode, we need to set bit QE0 for UCC1 |
290 | * in Eth mode, QE0 and QE3 for UCC5 in Eth mode, QE9 | 284 | * in Eth mode, QE0 and QE3 for UCC5 in Eth mode, QE9 |
291 | * and QE12 for QE MII management signals in PMUXCR | 285 | * and QE12 for QE MII management signals in PMUXCR |
292 | * register. | 286 | * register. |
293 | */ | 287 | */ |
294 | setbits32(pmuxcr, MPC85xx_PMUXCR_QE0 | | 288 | setbits32(&guts->pmuxcr, MPC85xx_PMUXCR_QE(0) | |
295 | MPC85xx_PMUXCR_QE3 | | 289 | MPC85xx_PMUXCR_QE(3) | |
296 | MPC85xx_PMUXCR_QE9 | | 290 | MPC85xx_PMUXCR_QE(9) | |
297 | MPC85xx_PMUXCR_QE12); | 291 | MPC85xx_PMUXCR_QE(12)); |
298 | 292 | iounmap(guts); | |
293 | } | ||
299 | of_node_put(np); | 294 | of_node_put(np); |
300 | } | 295 | } |
301 | 296 | ||
@@ -434,9 +429,8 @@ machine_arch_initcall(p1021_mds, swiotlb_setup_bus_notifier); | |||
434 | 429 | ||
435 | static void __init mpc85xx_mds_pic_init(void) | 430 | static void __init mpc85xx_mds_pic_init(void) |
436 | { | 431 | { |
437 | struct mpic *mpic = mpic_alloc(NULL, 0, | 432 | struct mpic *mpic = mpic_alloc(NULL, 0, MPIC_BIG_ENDIAN | |
438 | MPIC_WANTS_RESET | MPIC_BIG_ENDIAN | | 433 | MPIC_SINGLE_DEST_CPU, |
439 | MPIC_BROKEN_FRR_NIRQS | MPIC_SINGLE_DEST_CPU, | ||
440 | 0, 256, " OpenPIC "); | 434 | 0, 256, " OpenPIC "); |
441 | BUG_ON(mpic == NULL); | 435 | BUG_ON(mpic == NULL); |
442 | 436 | ||
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_rdb.c b/arch/powerpc/platforms/85xx/mpc85xx_rdb.c index ccf520e890be..db214cd4c822 100644 --- a/arch/powerpc/platforms/85xx/mpc85xx_rdb.c +++ b/arch/powerpc/platforms/85xx/mpc85xx_rdb.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * MPC85xx RDB Board Setup | 2 | * MPC85xx RDB Board Setup |
3 | * | 3 | * |
4 | * Copyright 2009 Freescale Semiconductor Inc. | 4 | * Copyright 2009,2012 Freescale Semiconductor Inc. |
5 | * | 5 | * |
6 | * This program is free software; you can redistribute it and/or modify it | 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 | 7 | * under the terms of the GNU General Public License as published by the |
@@ -26,6 +26,9 @@ | |||
26 | #include <asm/prom.h> | 26 | #include <asm/prom.h> |
27 | #include <asm/udbg.h> | 27 | #include <asm/udbg.h> |
28 | #include <asm/mpic.h> | 28 | #include <asm/mpic.h> |
29 | #include <asm/qe.h> | ||
30 | #include <asm/qe_ic.h> | ||
31 | #include <asm/fsl_guts.h> | ||
29 | 32 | ||
30 | #include <sysdev/fsl_soc.h> | 33 | #include <sysdev/fsl_soc.h> |
31 | #include <sysdev/fsl_pci.h> | 34 | #include <sysdev/fsl_pci.h> |
@@ -47,21 +50,36 @@ void __init mpc85xx_rdb_pic_init(void) | |||
47 | struct mpic *mpic; | 50 | struct mpic *mpic; |
48 | unsigned long root = of_get_flat_dt_root(); | 51 | unsigned long root = of_get_flat_dt_root(); |
49 | 52 | ||
53 | #ifdef CONFIG_QUICC_ENGINE | ||
54 | struct device_node *np; | ||
55 | #endif | ||
56 | |||
50 | if (of_flat_dt_is_compatible(root, "fsl,MPC85XXRDB-CAMP")) { | 57 | if (of_flat_dt_is_compatible(root, "fsl,MPC85XXRDB-CAMP")) { |
51 | mpic = mpic_alloc(NULL, 0, | 58 | mpic = mpic_alloc(NULL, 0, MPIC_NO_RESET | |
52 | MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS | | 59 | MPIC_BIG_ENDIAN | |
53 | MPIC_SINGLE_DEST_CPU, | 60 | MPIC_SINGLE_DEST_CPU, |
54 | 0, 256, " OpenPIC "); | 61 | 0, 256, " OpenPIC "); |
55 | } else { | 62 | } else { |
56 | mpic = mpic_alloc(NULL, 0, | 63 | mpic = mpic_alloc(NULL, 0, |
57 | MPIC_WANTS_RESET | | 64 | MPIC_BIG_ENDIAN | |
58 | MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS | | ||
59 | MPIC_SINGLE_DEST_CPU, | 65 | MPIC_SINGLE_DEST_CPU, |
60 | 0, 256, " OpenPIC "); | 66 | 0, 256, " OpenPIC "); |
61 | } | 67 | } |
62 | 68 | ||
63 | BUG_ON(mpic == NULL); | 69 | BUG_ON(mpic == NULL); |
64 | mpic_init(mpic); | 70 | mpic_init(mpic); |
71 | |||
72 | #ifdef CONFIG_QUICC_ENGINE | ||
73 | np = of_find_compatible_node(NULL, NULL, "fsl,qe-ic"); | ||
74 | if (np) { | ||
75 | qe_ic_init(np, 0, qe_ic_cascade_low_mpic, | ||
76 | qe_ic_cascade_high_mpic); | ||
77 | of_node_put(np); | ||
78 | |||
79 | } else | ||
80 | pr_err("%s: Could not find qe-ic node\n", __func__); | ||
81 | #endif | ||
82 | |||
65 | } | 83 | } |
66 | 84 | ||
67 | /* | 85 | /* |
@@ -69,7 +87,7 @@ void __init mpc85xx_rdb_pic_init(void) | |||
69 | */ | 87 | */ |
70 | static void __init mpc85xx_rdb_setup_arch(void) | 88 | static void __init mpc85xx_rdb_setup_arch(void) |
71 | { | 89 | { |
72 | #ifdef CONFIG_PCI | 90 | #if defined(CONFIG_PCI) || defined(CONFIG_QUICC_ENGINE) |
73 | struct device_node *np; | 91 | struct device_node *np; |
74 | #endif | 92 | #endif |
75 | 93 | ||
@@ -85,11 +103,73 @@ static void __init mpc85xx_rdb_setup_arch(void) | |||
85 | #endif | 103 | #endif |
86 | 104 | ||
87 | mpc85xx_smp_init(); | 105 | mpc85xx_smp_init(); |
106 | |||
107 | #ifdef CONFIG_QUICC_ENGINE | ||
108 | np = of_find_compatible_node(NULL, NULL, "fsl,qe"); | ||
109 | if (!np) { | ||
110 | pr_err("%s: Could not find Quicc Engine node\n", __func__); | ||
111 | goto qe_fail; | ||
112 | } | ||
113 | |||
114 | qe_reset(); | ||
115 | of_node_put(np); | ||
116 | |||
117 | np = of_find_node_by_name(NULL, "par_io"); | ||
118 | if (np) { | ||
119 | struct device_node *ucc; | ||
120 | |||
121 | par_io_init(np); | ||
122 | of_node_put(np); | ||
123 | |||
124 | for_each_node_by_name(ucc, "ucc") | ||
125 | par_io_of_config(ucc); | ||
126 | |||
127 | } | ||
128 | #if defined(CONFIG_UCC_GETH) || defined(CONFIG_SERIAL_QE) | ||
129 | if (machine_is(p1025_rdb)) { | ||
130 | |||
131 | struct ccsr_guts_85xx __iomem *guts; | ||
132 | |||
133 | np = of_find_node_by_name(NULL, "global-utilities"); | ||
134 | if (np) { | ||
135 | guts = of_iomap(np, 0); | ||
136 | if (!guts) { | ||
137 | |||
138 | pr_err("mpc85xx-rdb: could not map global utilities register\n"); | ||
139 | |||
140 | } else { | ||
141 | /* P1025 has pins muxed for QE and other functions. To | ||
142 | * enable QE UEC mode, we need to set bit QE0 for UCC1 | ||
143 | * in Eth mode, QE0 and QE3 for UCC5 in Eth mode, QE9 | ||
144 | * and QE12 for QE MII management singals in PMUXCR | ||
145 | * register. | ||
146 | */ | ||
147 | setbits32(&guts->pmuxcr, MPC85xx_PMUXCR_QE(0) | | ||
148 | MPC85xx_PMUXCR_QE(3) | | ||
149 | MPC85xx_PMUXCR_QE(9) | | ||
150 | MPC85xx_PMUXCR_QE(12)); | ||
151 | iounmap(guts); | ||
152 | } | ||
153 | of_node_put(np); | ||
154 | } | ||
155 | |||
156 | } | ||
157 | #endif | ||
158 | |||
159 | qe_fail: | ||
160 | #endif /* CONFIG_QUICC_ENGINE */ | ||
161 | |||
88 | printk(KERN_INFO "MPC85xx RDB board from Freescale Semiconductor\n"); | 162 | printk(KERN_INFO "MPC85xx RDB board from Freescale Semiconductor\n"); |
89 | } | 163 | } |
90 | 164 | ||
91 | machine_device_initcall(p2020_rdb, mpc85xx_common_publish_devices); | 165 | machine_device_initcall(p2020_rdb, mpc85xx_common_publish_devices); |
166 | machine_device_initcall(p2020_rdb_pc, mpc85xx_common_publish_devices); | ||
167 | machine_device_initcall(p1020_mbg_pc, mpc85xx_common_publish_devices); | ||
92 | machine_device_initcall(p1020_rdb, mpc85xx_common_publish_devices); | 168 | machine_device_initcall(p1020_rdb, mpc85xx_common_publish_devices); |
169 | machine_device_initcall(p1020_rdb_pc, mpc85xx_common_publish_devices); | ||
170 | machine_device_initcall(p1020_utm_pc, mpc85xx_common_publish_devices); | ||
171 | machine_device_initcall(p1021_rdb_pc, mpc85xx_common_publish_devices); | ||
172 | machine_device_initcall(p1025_rdb, mpc85xx_common_publish_devices); | ||
93 | 173 | ||
94 | /* | 174 | /* |
95 | * Called very early, device-tree isn't unflattened | 175 | * Called very early, device-tree isn't unflattened |
@@ -112,6 +192,52 @@ static int __init p1020_rdb_probe(void) | |||
112 | return 0; | 192 | return 0; |
113 | } | 193 | } |
114 | 194 | ||
195 | static int __init p1020_rdb_pc_probe(void) | ||
196 | { | ||
197 | unsigned long root = of_get_flat_dt_root(); | ||
198 | |||
199 | return of_flat_dt_is_compatible(root, "fsl,P1020RDB-PC"); | ||
200 | } | ||
201 | |||
202 | static int __init p1021_rdb_pc_probe(void) | ||
203 | { | ||
204 | unsigned long root = of_get_flat_dt_root(); | ||
205 | |||
206 | if (of_flat_dt_is_compatible(root, "fsl,P1021RDB-PC")) | ||
207 | return 1; | ||
208 | return 0; | ||
209 | } | ||
210 | |||
211 | static int __init p2020_rdb_pc_probe(void) | ||
212 | { | ||
213 | unsigned long root = of_get_flat_dt_root(); | ||
214 | |||
215 | if (of_flat_dt_is_compatible(root, "fsl,P2020RDB-PC")) | ||
216 | return 1; | ||
217 | return 0; | ||
218 | } | ||
219 | |||
220 | static int __init p1025_rdb_probe(void) | ||
221 | { | ||
222 | unsigned long root = of_get_flat_dt_root(); | ||
223 | |||
224 | return of_flat_dt_is_compatible(root, "fsl,P1025RDB"); | ||
225 | } | ||
226 | |||
227 | static int __init p1020_mbg_pc_probe(void) | ||
228 | { | ||
229 | unsigned long root = of_get_flat_dt_root(); | ||
230 | |||
231 | return of_flat_dt_is_compatible(root, "fsl,P1020MBG-PC"); | ||
232 | } | ||
233 | |||
234 | static int __init p1020_utm_pc_probe(void) | ||
235 | { | ||
236 | unsigned long root = of_get_flat_dt_root(); | ||
237 | |||
238 | return of_flat_dt_is_compatible(root, "fsl,P1020UTM-PC"); | ||
239 | } | ||
240 | |||
115 | define_machine(p2020_rdb) { | 241 | define_machine(p2020_rdb) { |
116 | .name = "P2020 RDB", | 242 | .name = "P2020 RDB", |
117 | .probe = p2020_rdb_probe, | 243 | .probe = p2020_rdb_probe, |
@@ -139,3 +265,87 @@ define_machine(p1020_rdb) { | |||
139 | .calibrate_decr = generic_calibrate_decr, | 265 | .calibrate_decr = generic_calibrate_decr, |
140 | .progress = udbg_progress, | 266 | .progress = udbg_progress, |
141 | }; | 267 | }; |
268 | |||
269 | define_machine(p1021_rdb_pc) { | ||
270 | .name = "P1021 RDB-PC", | ||
271 | .probe = p1021_rdb_pc_probe, | ||
272 | .setup_arch = mpc85xx_rdb_setup_arch, | ||
273 | .init_IRQ = mpc85xx_rdb_pic_init, | ||
274 | #ifdef CONFIG_PCI | ||
275 | .pcibios_fixup_bus = fsl_pcibios_fixup_bus, | ||
276 | #endif | ||
277 | .get_irq = mpic_get_irq, | ||
278 | .restart = fsl_rstcr_restart, | ||
279 | .calibrate_decr = generic_calibrate_decr, | ||
280 | .progress = udbg_progress, | ||
281 | }; | ||
282 | |||
283 | define_machine(p2020_rdb_pc) { | ||
284 | .name = "P2020RDB-PC", | ||
285 | .probe = p2020_rdb_pc_probe, | ||
286 | .setup_arch = mpc85xx_rdb_setup_arch, | ||
287 | .init_IRQ = mpc85xx_rdb_pic_init, | ||
288 | #ifdef CONFIG_PCI | ||
289 | .pcibios_fixup_bus = fsl_pcibios_fixup_bus, | ||
290 | #endif | ||
291 | .get_irq = mpic_get_irq, | ||
292 | .restart = fsl_rstcr_restart, | ||
293 | .calibrate_decr = generic_calibrate_decr, | ||
294 | .progress = udbg_progress, | ||
295 | }; | ||
296 | |||
297 | define_machine(p1025_rdb) { | ||
298 | .name = "P1025 RDB", | ||
299 | .probe = p1025_rdb_probe, | ||
300 | .setup_arch = mpc85xx_rdb_setup_arch, | ||
301 | .init_IRQ = mpc85xx_rdb_pic_init, | ||
302 | #ifdef CONFIG_PCI | ||
303 | .pcibios_fixup_bus = fsl_pcibios_fixup_bus, | ||
304 | #endif | ||
305 | .get_irq = mpic_get_irq, | ||
306 | .restart = fsl_rstcr_restart, | ||
307 | .calibrate_decr = generic_calibrate_decr, | ||
308 | .progress = udbg_progress, | ||
309 | }; | ||
310 | |||
311 | define_machine(p1020_mbg_pc) { | ||
312 | .name = "P1020 MBG-PC", | ||
313 | .probe = p1020_mbg_pc_probe, | ||
314 | .setup_arch = mpc85xx_rdb_setup_arch, | ||
315 | .init_IRQ = mpc85xx_rdb_pic_init, | ||
316 | #ifdef CONFIG_PCI | ||
317 | .pcibios_fixup_bus = fsl_pcibios_fixup_bus, | ||
318 | #endif | ||
319 | .get_irq = mpic_get_irq, | ||
320 | .restart = fsl_rstcr_restart, | ||
321 | .calibrate_decr = generic_calibrate_decr, | ||
322 | .progress = udbg_progress, | ||
323 | }; | ||
324 | |||
325 | define_machine(p1020_utm_pc) { | ||
326 | .name = "P1020 UTM-PC", | ||
327 | .probe = p1020_utm_pc_probe, | ||
328 | .setup_arch = mpc85xx_rdb_setup_arch, | ||
329 | .init_IRQ = mpc85xx_rdb_pic_init, | ||
330 | #ifdef CONFIG_PCI | ||
331 | .pcibios_fixup_bus = fsl_pcibios_fixup_bus, | ||
332 | #endif | ||
333 | .get_irq = mpic_get_irq, | ||
334 | .restart = fsl_rstcr_restart, | ||
335 | .calibrate_decr = generic_calibrate_decr, | ||
336 | .progress = udbg_progress, | ||
337 | }; | ||
338 | |||
339 | define_machine(p1020_rdb_pc) { | ||
340 | .name = "P1020RDB-PC", | ||
341 | .probe = p1020_rdb_pc_probe, | ||
342 | .setup_arch = mpc85xx_rdb_setup_arch, | ||
343 | .init_IRQ = mpc85xx_rdb_pic_init, | ||
344 | #ifdef CONFIG_PCI | ||
345 | .pcibios_fixup_bus = fsl_pcibios_fixup_bus, | ||
346 | #endif | ||
347 | .get_irq = mpic_get_irq, | ||
348 | .restart = fsl_rstcr_restart, | ||
349 | .calibrate_decr = generic_calibrate_decr, | ||
350 | .progress = udbg_progress, | ||
351 | }; | ||
diff --git a/arch/powerpc/platforms/85xx/p1010rdb.c b/arch/powerpc/platforms/85xx/p1010rdb.c index 538bc3f57e9d..d8bd6563d9ca 100644 --- a/arch/powerpc/platforms/85xx/p1010rdb.c +++ b/arch/powerpc/platforms/85xx/p1010rdb.c | |||
@@ -32,9 +32,8 @@ | |||
32 | 32 | ||
33 | void __init p1010_rdb_pic_init(void) | 33 | void __init p1010_rdb_pic_init(void) |
34 | { | 34 | { |
35 | struct mpic *mpic = mpic_alloc(NULL, 0, | 35 | struct mpic *mpic = mpic_alloc(NULL, 0, MPIC_BIG_ENDIAN | |
36 | MPIC_WANTS_RESET | MPIC_BIG_ENDIAN | | 36 | MPIC_SINGLE_DEST_CPU, |
37 | MPIC_BROKEN_FRR_NIRQS | MPIC_SINGLE_DEST_CPU, | ||
38 | 0, 256, " OpenPIC "); | 37 | 0, 256, " OpenPIC "); |
39 | 38 | ||
40 | BUG_ON(mpic == NULL); | 39 | BUG_ON(mpic == NULL); |
diff --git a/arch/powerpc/platforms/85xx/p1022_ds.c b/arch/powerpc/platforms/85xx/p1022_ds.c index bb3d84f4046f..0fe88e39945e 100644 --- a/arch/powerpc/platforms/85xx/p1022_ds.c +++ b/arch/powerpc/platforms/85xx/p1022_ds.c | |||
@@ -25,6 +25,7 @@ | |||
25 | 25 | ||
26 | #include <sysdev/fsl_soc.h> | 26 | #include <sysdev/fsl_soc.h> |
27 | #include <sysdev/fsl_pci.h> | 27 | #include <sysdev/fsl_pci.h> |
28 | #include <asm/udbg.h> | ||
28 | #include <asm/fsl_guts.h> | 29 | #include <asm/fsl_guts.h> |
29 | #include "smp.h" | 30 | #include "smp.h" |
30 | 31 | ||
@@ -32,6 +33,10 @@ | |||
32 | 33 | ||
33 | #if defined(CONFIG_FB_FSL_DIU) || defined(CONFIG_FB_FSL_DIU_MODULE) | 34 | #if defined(CONFIG_FB_FSL_DIU) || defined(CONFIG_FB_FSL_DIU_MODULE) |
34 | 35 | ||
36 | #define PMUXCR_ELBCDIU_MASK 0xc0000000 | ||
37 | #define PMUXCR_ELBCDIU_NOR16 0x80000000 | ||
38 | #define PMUXCR_ELBCDIU_DIU 0x40000000 | ||
39 | |||
35 | /* | 40 | /* |
36 | * Board-specific initialization of the DIU. This code should probably be | 41 | * Board-specific initialization of the DIU. This code should probably be |
37 | * executed when the DIU is opened, rather than in arch code, but the DIU | 42 | * executed when the DIU is opened, rather than in arch code, but the DIU |
@@ -49,11 +54,22 @@ | |||
49 | #define CLKDVDR_PXCLK_MASK 0x00FF0000 | 54 | #define CLKDVDR_PXCLK_MASK 0x00FF0000 |
50 | 55 | ||
51 | /* Some ngPIXIS register definitions */ | 56 | /* Some ngPIXIS register definitions */ |
57 | #define PX_CTL 3 | ||
58 | #define PX_BRDCFG0 8 | ||
59 | #define PX_BRDCFG1 9 | ||
60 | |||
61 | #define PX_BRDCFG0_ELBC_SPI_MASK 0xc0 | ||
62 | #define PX_BRDCFG0_ELBC_SPI_ELBC 0x00 | ||
63 | #define PX_BRDCFG0_ELBC_SPI_NULL 0xc0 | ||
64 | #define PX_BRDCFG0_ELBC_DIU 0x02 | ||
65 | |||
52 | #define PX_BRDCFG1_DVIEN 0x80 | 66 | #define PX_BRDCFG1_DVIEN 0x80 |
53 | #define PX_BRDCFG1_DFPEN 0x40 | 67 | #define PX_BRDCFG1_DFPEN 0x40 |
54 | #define PX_BRDCFG1_BACKLIGHT 0x20 | 68 | #define PX_BRDCFG1_BACKLIGHT 0x20 |
55 | #define PX_BRDCFG1_DDCEN 0x10 | 69 | #define PX_BRDCFG1_DDCEN 0x10 |
56 | 70 | ||
71 | #define PX_CTL_ALTACC 0x80 | ||
72 | |||
57 | /* | 73 | /* |
58 | * DIU Area Descriptor | 74 | * DIU Area Descriptor |
59 | * | 75 | * |
@@ -132,44 +148,117 @@ static void p1022ds_set_gamma_table(enum fsl_diu_monitor_port port, | |||
132 | */ | 148 | */ |
133 | static void p1022ds_set_monitor_port(enum fsl_diu_monitor_port port) | 149 | static void p1022ds_set_monitor_port(enum fsl_diu_monitor_port port) |
134 | { | 150 | { |
135 | struct device_node *np; | 151 | struct device_node *guts_node; |
136 | void __iomem *pixis; | 152 | struct device_node *indirect_node = NULL; |
137 | u8 __iomem *brdcfg1; | 153 | struct ccsr_guts_85xx __iomem *guts; |
138 | 154 | u8 __iomem *lbc_lcs0_ba = NULL; | |
139 | np = of_find_compatible_node(NULL, NULL, "fsl,p1022ds-fpga"); | 155 | u8 __iomem *lbc_lcs1_ba = NULL; |
140 | if (!np) | 156 | u8 b; |
141 | /* older device trees used "fsl,p1022ds-pixis" */ | 157 | |
142 | np = of_find_compatible_node(NULL, NULL, "fsl,p1022ds-pixis"); | 158 | /* Map the global utilities registers. */ |
143 | if (!np) { | 159 | guts_node = of_find_compatible_node(NULL, NULL, "fsl,p1022-guts"); |
144 | pr_err("p1022ds: missing ngPIXIS node\n"); | 160 | if (!guts_node) { |
161 | pr_err("p1022ds: missing global utilties device node\n"); | ||
145 | return; | 162 | return; |
146 | } | 163 | } |
147 | 164 | ||
148 | pixis = of_iomap(np, 0); | 165 | guts = of_iomap(guts_node, 0); |
149 | if (!pixis) { | 166 | if (!guts) { |
150 | pr_err("p1022ds: could not map ngPIXIS registers\n"); | 167 | pr_err("p1022ds: could not map global utilties device\n"); |
151 | return; | 168 | goto exit; |
152 | } | 169 | } |
153 | brdcfg1 = pixis + 9; /* BRDCFG1 is at offset 9 in the ngPIXIS */ | 170 | |
171 | indirect_node = of_find_compatible_node(NULL, NULL, | ||
172 | "fsl,p1022ds-indirect-pixis"); | ||
173 | if (!indirect_node) { | ||
174 | pr_err("p1022ds: missing pixis indirect mode node\n"); | ||
175 | goto exit; | ||
176 | } | ||
177 | |||
178 | lbc_lcs0_ba = of_iomap(indirect_node, 0); | ||
179 | if (!lbc_lcs0_ba) { | ||
180 | pr_err("p1022ds: could not map localbus chip select 0\n"); | ||
181 | goto exit; | ||
182 | } | ||
183 | |||
184 | lbc_lcs1_ba = of_iomap(indirect_node, 1); | ||
185 | if (!lbc_lcs1_ba) { | ||
186 | pr_err("p1022ds: could not map localbus chip select 1\n"); | ||
187 | goto exit; | ||
188 | } | ||
189 | |||
190 | /* Make sure we're in indirect mode first. */ | ||
191 | if ((in_be32(&guts->pmuxcr) & PMUXCR_ELBCDIU_MASK) != | ||
192 | PMUXCR_ELBCDIU_DIU) { | ||
193 | struct device_node *pixis_node; | ||
194 | void __iomem *pixis; | ||
195 | |||
196 | pixis_node = | ||
197 | of_find_compatible_node(NULL, NULL, "fsl,p1022ds-fpga"); | ||
198 | if (!pixis_node) { | ||
199 | pr_err("p1022ds: missing pixis node\n"); | ||
200 | goto exit; | ||
201 | } | ||
202 | |||
203 | pixis = of_iomap(pixis_node, 0); | ||
204 | of_node_put(pixis_node); | ||
205 | if (!pixis) { | ||
206 | pr_err("p1022ds: could not map pixis registers\n"); | ||
207 | goto exit; | ||
208 | } | ||
209 | |||
210 | /* Enable indirect PIXIS mode. */ | ||
211 | setbits8(pixis + PX_CTL, PX_CTL_ALTACC); | ||
212 | iounmap(pixis); | ||
213 | |||
214 | /* Switch the board mux to the DIU */ | ||
215 | out_8(lbc_lcs0_ba, PX_BRDCFG0); /* BRDCFG0 */ | ||
216 | b = in_8(lbc_lcs1_ba); | ||
217 | b |= PX_BRDCFG0_ELBC_DIU; | ||
218 | out_8(lbc_lcs1_ba, b); | ||
219 | |||
220 | /* Set the chip mux to DIU mode. */ | ||
221 | clrsetbits_be32(&guts->pmuxcr, PMUXCR_ELBCDIU_MASK, | ||
222 | PMUXCR_ELBCDIU_DIU); | ||
223 | in_be32(&guts->pmuxcr); | ||
224 | } | ||
225 | |||
154 | 226 | ||
155 | switch (port) { | 227 | switch (port) { |
156 | case FSL_DIU_PORT_DVI: | 228 | case FSL_DIU_PORT_DVI: |
157 | printk(KERN_INFO "%s:%u\n", __func__, __LINE__); | ||
158 | /* Enable the DVI port, disable the DFP and the backlight */ | 229 | /* Enable the DVI port, disable the DFP and the backlight */ |
159 | clrsetbits_8(brdcfg1, PX_BRDCFG1_DFPEN | PX_BRDCFG1_BACKLIGHT, | 230 | out_8(lbc_lcs0_ba, PX_BRDCFG1); |
160 | PX_BRDCFG1_DVIEN); | 231 | b = in_8(lbc_lcs1_ba); |
232 | b &= ~(PX_BRDCFG1_DFPEN | PX_BRDCFG1_BACKLIGHT); | ||
233 | b |= PX_BRDCFG1_DVIEN; | ||
234 | out_8(lbc_lcs1_ba, b); | ||
161 | break; | 235 | break; |
162 | case FSL_DIU_PORT_LVDS: | 236 | case FSL_DIU_PORT_LVDS: |
163 | printk(KERN_INFO "%s:%u\n", __func__, __LINE__); | 237 | /* |
238 | * LVDS also needs backlight enabled, otherwise the display | ||
239 | * will be blank. | ||
240 | */ | ||
164 | /* Enable the DFP port, disable the DVI and the backlight */ | 241 | /* Enable the DFP port, disable the DVI and the backlight */ |
165 | clrsetbits_8(brdcfg1, PX_BRDCFG1_DVIEN | PX_BRDCFG1_BACKLIGHT, | 242 | out_8(lbc_lcs0_ba, PX_BRDCFG1); |
166 | PX_BRDCFG1_DFPEN); | 243 | b = in_8(lbc_lcs1_ba); |
244 | b &= ~PX_BRDCFG1_DVIEN; | ||
245 | b |= PX_BRDCFG1_DFPEN | PX_BRDCFG1_BACKLIGHT; | ||
246 | out_8(lbc_lcs1_ba, b); | ||
167 | break; | 247 | break; |
168 | default: | 248 | default: |
169 | pr_err("p1022ds: unsupported monitor port %i\n", port); | 249 | pr_err("p1022ds: unsupported monitor port %i\n", port); |
170 | } | 250 | } |
171 | 251 | ||
172 | iounmap(pixis); | 252 | exit: |
253 | if (lbc_lcs1_ba) | ||
254 | iounmap(lbc_lcs1_ba); | ||
255 | if (lbc_lcs0_ba) | ||
256 | iounmap(lbc_lcs0_ba); | ||
257 | if (guts) | ||
258 | iounmap(guts); | ||
259 | |||
260 | of_node_put(indirect_node); | ||
261 | of_node_put(guts_node); | ||
173 | } | 262 | } |
174 | 263 | ||
175 | /** | 264 | /** |
@@ -241,15 +330,56 @@ p1022ds_valid_monitor_port(enum fsl_diu_monitor_port port) | |||
241 | 330 | ||
242 | void __init p1022_ds_pic_init(void) | 331 | void __init p1022_ds_pic_init(void) |
243 | { | 332 | { |
244 | struct mpic *mpic = mpic_alloc(NULL, 0, | 333 | struct mpic *mpic = mpic_alloc(NULL, 0, MPIC_BIG_ENDIAN | |
245 | MPIC_WANTS_RESET | | ||
246 | MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS | | ||
247 | MPIC_SINGLE_DEST_CPU, | 334 | MPIC_SINGLE_DEST_CPU, |
248 | 0, 256, " OpenPIC "); | 335 | 0, 256, " OpenPIC "); |
249 | BUG_ON(mpic == NULL); | 336 | BUG_ON(mpic == NULL); |
250 | mpic_init(mpic); | 337 | mpic_init(mpic); |
251 | } | 338 | } |
252 | 339 | ||
340 | #if defined(CONFIG_FB_FSL_DIU) || defined(CONFIG_FB_FSL_DIU_MODULE) | ||
341 | |||
342 | /* | ||
343 | * Disables a node in the device tree. | ||
344 | * | ||
345 | * This function is called before kmalloc() is available, so the 'new' object | ||
346 | * should be allocated in the global area. The easiest way is to do that is | ||
347 | * to allocate one static local variable for each call to this function. | ||
348 | */ | ||
349 | static void __init disable_one_node(struct device_node *np, struct property *new) | ||
350 | { | ||
351 | struct property *old; | ||
352 | |||
353 | old = of_find_property(np, new->name, NULL); | ||
354 | if (old) | ||
355 | prom_update_property(np, new, old); | ||
356 | else | ||
357 | prom_add_property(np, new); | ||
358 | } | ||
359 | |||
360 | /* TRUE if there is a "video=fslfb" command-line parameter. */ | ||
361 | static bool fslfb; | ||
362 | |||
363 | /* | ||
364 | * Search for a "video=fslfb" command-line parameter, and set 'fslfb' to | ||
365 | * true if we find it. | ||
366 | * | ||
367 | * We need to use early_param() instead of __setup() because the normal | ||
368 | * __setup() gets called to late. However, early_param() gets called very | ||
369 | * early, before the device tree is unflattened, so all we can do now is set a | ||
370 | * global variable. Later on, p1022_ds_setup_arch() will use that variable | ||
371 | * to determine if we need to update the device tree. | ||
372 | */ | ||
373 | static int __init early_video_setup(char *options) | ||
374 | { | ||
375 | fslfb = (strncmp(options, "fslfb:", 6) == 0); | ||
376 | |||
377 | return 0; | ||
378 | } | ||
379 | early_param("video", early_video_setup); | ||
380 | |||
381 | #endif | ||
382 | |||
253 | /* | 383 | /* |
254 | * Setup the architecture | 384 | * Setup the architecture |
255 | */ | 385 | */ |
@@ -287,6 +417,34 @@ static void __init p1022_ds_setup_arch(void) | |||
287 | diu_ops.set_monitor_port = p1022ds_set_monitor_port; | 417 | diu_ops.set_monitor_port = p1022ds_set_monitor_port; |
288 | diu_ops.set_pixel_clock = p1022ds_set_pixel_clock; | 418 | diu_ops.set_pixel_clock = p1022ds_set_pixel_clock; |
289 | diu_ops.valid_monitor_port = p1022ds_valid_monitor_port; | 419 | diu_ops.valid_monitor_port = p1022ds_valid_monitor_port; |
420 | |||
421 | /* | ||
422 | * Disable the NOR flash node if there is video=fslfb... command-line | ||
423 | * parameter. When the DIU is active, NOR flash is unavailable, so we | ||
424 | * have to disable the node before the MTD driver loads. | ||
425 | */ | ||
426 | if (fslfb) { | ||
427 | struct device_node *np = | ||
428 | of_find_compatible_node(NULL, NULL, "fsl,p1022-elbc"); | ||
429 | |||
430 | if (np) { | ||
431 | np = of_find_compatible_node(np, NULL, "cfi-flash"); | ||
432 | if (np) { | ||
433 | static struct property nor_status = { | ||
434 | .name = "status", | ||
435 | .value = "disabled", | ||
436 | .length = sizeof("disabled"), | ||
437 | }; | ||
438 | |||
439 | pr_info("p1022ds: disabling %s node", | ||
440 | np->full_name); | ||
441 | disable_one_node(np, &nor_status); | ||
442 | of_node_put(np); | ||
443 | } | ||
444 | } | ||
445 | |||
446 | } | ||
447 | |||
290 | #endif | 448 | #endif |
291 | 449 | ||
292 | mpc85xx_smp_init(); | 450 | mpc85xx_smp_init(); |
diff --git a/arch/powerpc/platforms/85xx/p1023_rds.c b/arch/powerpc/platforms/85xx/p1023_rds.c index d951e7027bb6..6b07398e4369 100644 --- a/arch/powerpc/platforms/85xx/p1023_rds.c +++ b/arch/powerpc/platforms/85xx/p1023_rds.c | |||
@@ -93,9 +93,8 @@ machine_device_initcall(p1023_rds, mpc85xx_common_publish_devices); | |||
93 | 93 | ||
94 | static void __init mpc85xx_rds_pic_init(void) | 94 | static void __init mpc85xx_rds_pic_init(void) |
95 | { | 95 | { |
96 | struct mpic *mpic = mpic_alloc(NULL, 0, | 96 | struct mpic *mpic = mpic_alloc(NULL, 0, MPIC_BIG_ENDIAN | |
97 | MPIC_WANTS_RESET | MPIC_BIG_ENDIAN | | 97 | MPIC_SINGLE_DEST_CPU, |
98 | MPIC_BROKEN_FRR_NIRQS | MPIC_SINGLE_DEST_CPU, | ||
99 | 0, 256, " OpenPIC "); | 98 | 0, 256, " OpenPIC "); |
100 | 99 | ||
101 | BUG_ON(mpic == NULL); | 100 | BUG_ON(mpic == NULL); |
diff --git a/arch/powerpc/platforms/85xx/sbc8548.c b/arch/powerpc/platforms/85xx/sbc8548.c index 184a50784617..1677b8a22677 100644 --- a/arch/powerpc/platforms/85xx/sbc8548.c +++ b/arch/powerpc/platforms/85xx/sbc8548.c | |||
@@ -54,8 +54,7 @@ static int sbc_rev; | |||
54 | 54 | ||
55 | static void __init sbc8548_pic_init(void) | 55 | static void __init sbc8548_pic_init(void) |
56 | { | 56 | { |
57 | struct mpic *mpic = mpic_alloc(NULL, 0, | 57 | struct mpic *mpic = mpic_alloc(NULL, 0, MPIC_BIG_ENDIAN, |
58 | MPIC_WANTS_RESET | MPIC_BIG_ENDIAN, | ||
59 | 0, 256, " OpenPIC "); | 58 | 0, 256, " OpenPIC "); |
60 | BUG_ON(mpic == NULL); | 59 | BUG_ON(mpic == NULL); |
61 | mpic_init(mpic); | 60 | mpic_init(mpic); |
diff --git a/arch/powerpc/platforms/85xx/sbc8560.c b/arch/powerpc/platforms/85xx/sbc8560.c index 940752e93051..3c3bbcc27566 100644 --- a/arch/powerpc/platforms/85xx/sbc8560.c +++ b/arch/powerpc/platforms/85xx/sbc8560.c | |||
@@ -41,8 +41,7 @@ | |||
41 | 41 | ||
42 | static void __init sbc8560_pic_init(void) | 42 | static void __init sbc8560_pic_init(void) |
43 | { | 43 | { |
44 | struct mpic *mpic = mpic_alloc(NULL, 0, | 44 | struct mpic *mpic = mpic_alloc(NULL, 0, MPIC_BIG_ENDIAN, |
45 | MPIC_WANTS_RESET | MPIC_BIG_ENDIAN, | ||
46 | 0, 256, " OpenPIC "); | 45 | 0, 256, " OpenPIC "); |
47 | BUG_ON(mpic == NULL); | 46 | BUG_ON(mpic == NULL); |
48 | mpic_init(mpic); | 47 | mpic_init(mpic); |
diff --git a/arch/powerpc/platforms/85xx/socrates.c b/arch/powerpc/platforms/85xx/socrates.c index 18f635906b27..b71919217756 100644 --- a/arch/powerpc/platforms/85xx/socrates.c +++ b/arch/powerpc/platforms/85xx/socrates.c | |||
@@ -48,8 +48,7 @@ static void __init socrates_pic_init(void) | |||
48 | { | 48 | { |
49 | struct device_node *np; | 49 | struct device_node *np; |
50 | 50 | ||
51 | struct mpic *mpic = mpic_alloc(NULL, 0, | 51 | struct mpic *mpic = mpic_alloc(NULL, 0, MPIC_BIG_ENDIAN, |
52 | MPIC_WANTS_RESET | MPIC_BIG_ENDIAN, | ||
53 | 0, 256, " OpenPIC "); | 52 | 0, 256, " OpenPIC "); |
54 | BUG_ON(mpic == NULL); | 53 | BUG_ON(mpic == NULL); |
55 | mpic_init(mpic); | 54 | mpic_init(mpic); |
diff --git a/arch/powerpc/platforms/85xx/socrates_fpga_pic.c b/arch/powerpc/platforms/85xx/socrates_fpga_pic.c index 12cb9bb2cc68..3bbbf7489487 100644 --- a/arch/powerpc/platforms/85xx/socrates_fpga_pic.c +++ b/arch/powerpc/platforms/85xx/socrates_fpga_pic.c | |||
@@ -51,7 +51,7 @@ static struct socrates_fpga_irq_info fpga_irqs[SOCRATES_FPGA_NUM_IRQS] = { | |||
51 | static DEFINE_RAW_SPINLOCK(socrates_fpga_pic_lock); | 51 | static DEFINE_RAW_SPINLOCK(socrates_fpga_pic_lock); |
52 | 52 | ||
53 | static void __iomem *socrates_fpga_pic_iobase; | 53 | static void __iomem *socrates_fpga_pic_iobase; |
54 | static struct irq_host *socrates_fpga_pic_irq_host; | 54 | static struct irq_domain *socrates_fpga_pic_irq_host; |
55 | static unsigned int socrates_fpga_irqs[3]; | 55 | static unsigned int socrates_fpga_irqs[3]; |
56 | 56 | ||
57 | static inline uint32_t socrates_fpga_pic_read(int reg) | 57 | static inline uint32_t socrates_fpga_pic_read(int reg) |
@@ -227,7 +227,7 @@ static struct irq_chip socrates_fpga_pic_chip = { | |||
227 | .irq_set_type = socrates_fpga_pic_set_type, | 227 | .irq_set_type = socrates_fpga_pic_set_type, |
228 | }; | 228 | }; |
229 | 229 | ||
230 | static int socrates_fpga_pic_host_map(struct irq_host *h, unsigned int virq, | 230 | static int socrates_fpga_pic_host_map(struct irq_domain *h, unsigned int virq, |
231 | irq_hw_number_t hwirq) | 231 | irq_hw_number_t hwirq) |
232 | { | 232 | { |
233 | /* All interrupts are LEVEL sensitive */ | 233 | /* All interrupts are LEVEL sensitive */ |
@@ -238,7 +238,7 @@ static int socrates_fpga_pic_host_map(struct irq_host *h, unsigned int virq, | |||
238 | return 0; | 238 | return 0; |
239 | } | 239 | } |
240 | 240 | ||
241 | static int socrates_fpga_pic_host_xlate(struct irq_host *h, | 241 | static int socrates_fpga_pic_host_xlate(struct irq_domain *h, |
242 | struct device_node *ct, const u32 *intspec, unsigned int intsize, | 242 | struct device_node *ct, const u32 *intspec, unsigned int intsize, |
243 | irq_hw_number_t *out_hwirq, unsigned int *out_flags) | 243 | irq_hw_number_t *out_hwirq, unsigned int *out_flags) |
244 | { | 244 | { |
@@ -269,7 +269,7 @@ static int socrates_fpga_pic_host_xlate(struct irq_host *h, | |||
269 | return 0; | 269 | return 0; |
270 | } | 270 | } |
271 | 271 | ||
272 | static struct irq_host_ops socrates_fpga_pic_host_ops = { | 272 | static const struct irq_domain_ops socrates_fpga_pic_host_ops = { |
273 | .map = socrates_fpga_pic_host_map, | 273 | .map = socrates_fpga_pic_host_map, |
274 | .xlate = socrates_fpga_pic_host_xlate, | 274 | .xlate = socrates_fpga_pic_host_xlate, |
275 | }; | 275 | }; |
@@ -279,10 +279,9 @@ void socrates_fpga_pic_init(struct device_node *pic) | |||
279 | unsigned long flags; | 279 | unsigned long flags; |
280 | int i; | 280 | int i; |
281 | 281 | ||
282 | /* Setup an irq_host structure */ | 282 | /* Setup an irq_domain structure */ |
283 | socrates_fpga_pic_irq_host = irq_alloc_host(pic, IRQ_HOST_MAP_LINEAR, | 283 | socrates_fpga_pic_irq_host = irq_domain_add_linear(pic, |
284 | SOCRATES_FPGA_NUM_IRQS, &socrates_fpga_pic_host_ops, | 284 | SOCRATES_FPGA_NUM_IRQS, &socrates_fpga_pic_host_ops, NULL); |
285 | SOCRATES_FPGA_NUM_IRQS); | ||
286 | if (socrates_fpga_pic_irq_host == NULL) { | 285 | if (socrates_fpga_pic_irq_host == NULL) { |
287 | pr_err("FPGA PIC: Unable to allocate host\n"); | 286 | pr_err("FPGA PIC: Unable to allocate host\n"); |
288 | return; | 287 | return; |
diff --git a/arch/powerpc/platforms/85xx/stx_gp3.c b/arch/powerpc/platforms/85xx/stx_gp3.c index e9e5234b4e76..27ca3a7b04ab 100644 --- a/arch/powerpc/platforms/85xx/stx_gp3.c +++ b/arch/powerpc/platforms/85xx/stx_gp3.c | |||
@@ -48,8 +48,7 @@ | |||
48 | 48 | ||
49 | static void __init stx_gp3_pic_init(void) | 49 | static void __init stx_gp3_pic_init(void) |
50 | { | 50 | { |
51 | struct mpic *mpic = mpic_alloc(NULL, 0, | 51 | struct mpic *mpic = mpic_alloc(NULL, 0, MPIC_BIG_ENDIAN, |
52 | MPIC_WANTS_RESET | MPIC_BIG_ENDIAN, | ||
53 | 0, 256, " OpenPIC "); | 52 | 0, 256, " OpenPIC "); |
54 | BUG_ON(mpic == NULL); | 53 | BUG_ON(mpic == NULL); |
55 | mpic_init(mpic); | 54 | mpic_init(mpic); |
diff --git a/arch/powerpc/platforms/85xx/tqm85xx.c b/arch/powerpc/platforms/85xx/tqm85xx.c index bf7c89fb75bb..d7504cefe016 100644 --- a/arch/powerpc/platforms/85xx/tqm85xx.c +++ b/arch/powerpc/platforms/85xx/tqm85xx.c | |||
@@ -47,7 +47,7 @@ | |||
47 | static void __init tqm85xx_pic_init(void) | 47 | static void __init tqm85xx_pic_init(void) |
48 | { | 48 | { |
49 | struct mpic *mpic = mpic_alloc(NULL, 0, | 49 | struct mpic *mpic = mpic_alloc(NULL, 0, |
50 | MPIC_WANTS_RESET | MPIC_BIG_ENDIAN, | 50 | MPIC_BIG_ENDIAN, |
51 | 0, 256, " OpenPIC "); | 51 | 0, 256, " OpenPIC "); |
52 | BUG_ON(mpic == NULL); | 52 | BUG_ON(mpic == NULL); |
53 | mpic_init(mpic); | 53 | mpic_init(mpic); |
diff --git a/arch/powerpc/platforms/85xx/xes_mpc85xx.c b/arch/powerpc/platforms/85xx/xes_mpc85xx.c index 3a69f8b77de6..503c21596c63 100644 --- a/arch/powerpc/platforms/85xx/xes_mpc85xx.c +++ b/arch/powerpc/platforms/85xx/xes_mpc85xx.c | |||
@@ -43,9 +43,7 @@ | |||
43 | 43 | ||
44 | void __init xes_mpc85xx_pic_init(void) | 44 | void __init xes_mpc85xx_pic_init(void) |
45 | { | 45 | { |
46 | struct mpic *mpic = mpic_alloc(NULL, 0, | 46 | struct mpic *mpic = mpic_alloc(NULL, 0, MPIC_BIG_ENDIAN, |
47 | MPIC_WANTS_RESET | | ||
48 | MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS, | ||
49 | 0, 256, " OpenPIC "); | 47 | 0, 256, " OpenPIC "); |
50 | BUG_ON(mpic == NULL); | 48 | BUG_ON(mpic == NULL); |
51 | mpic_init(mpic); | 49 | mpic_init(mpic); |