diff options
Diffstat (limited to 'arch/powerpc')
25 files changed, 158 insertions, 116 deletions
diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile index 9155c9312c1e..c6be19e9ceae 100644 --- a/arch/powerpc/Makefile +++ b/arch/powerpc/Makefile | |||
| @@ -116,6 +116,11 @@ ifeq ($(CONFIG_6xx),y) | |||
| 116 | KBUILD_CFLAGS += -mcpu=powerpc | 116 | KBUILD_CFLAGS += -mcpu=powerpc |
| 117 | endif | 117 | endif |
| 118 | 118 | ||
| 119 | # Work around a gcc code-gen bug with -fno-omit-frame-pointer. | ||
| 120 | ifeq ($(CONFIG_FTRACE),y) | ||
| 121 | KBUILD_CFLAGS += -mno-sched-epilog | ||
| 122 | endif | ||
| 123 | |||
| 119 | cpu-as-$(CONFIG_4xx) += -Wa,-m405 | 124 | cpu-as-$(CONFIG_4xx) += -Wa,-m405 |
| 120 | cpu-as-$(CONFIG_6xx) += -Wa,-maltivec | 125 | cpu-as-$(CONFIG_6xx) += -Wa,-maltivec |
| 121 | cpu-as-$(CONFIG_POWER4) += -Wa,-maltivec | 126 | cpu-as-$(CONFIG_POWER4) += -Wa,-maltivec |
diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile index 14174aa24074..65d1a8454d2c 100644 --- a/arch/powerpc/boot/Makefile +++ b/arch/powerpc/boot/Makefile | |||
| @@ -49,7 +49,7 @@ zlib := inffast.c inflate.c inftrees.c | |||
| 49 | zlibheader := inffast.h inffixed.h inflate.h inftrees.h infutil.h | 49 | zlibheader := inffast.h inffixed.h inflate.h inftrees.h infutil.h |
| 50 | zliblinuxheader := zlib.h zconf.h zutil.h | 50 | zliblinuxheader := zlib.h zconf.h zutil.h |
| 51 | 51 | ||
| 52 | $(addprefix $(obj)/,$(zlib) gunzip_util.o main.o): \ | 52 | $(addprefix $(obj)/,$(zlib) cuboot-c2k.o gunzip_util.o main.o prpmc2800.o): \ |
| 53 | $(addprefix $(obj)/,$(zliblinuxheader)) $(addprefix $(obj)/,$(zlibheader)) | 53 | $(addprefix $(obj)/,$(zliblinuxheader)) $(addprefix $(obj)/,$(zlibheader)) |
| 54 | 54 | ||
| 55 | src-libfdt := fdt.c fdt_ro.c fdt_wip.c fdt_sw.c fdt_rw.c fdt_strerror.c | 55 | src-libfdt := fdt.c fdt_ro.c fdt_wip.c fdt_sw.c fdt_rw.c fdt_strerror.c |
| @@ -195,7 +195,7 @@ image-$(CONFIG_PPC_CELLEB) += zImage.pseries | |||
| 195 | image-$(CONFIG_PPC_CHRP) += zImage.chrp | 195 | image-$(CONFIG_PPC_CHRP) += zImage.chrp |
| 196 | image-$(CONFIG_PPC_EFIKA) += zImage.chrp | 196 | image-$(CONFIG_PPC_EFIKA) += zImage.chrp |
| 197 | image-$(CONFIG_PPC_PMAC) += zImage.pmac | 197 | image-$(CONFIG_PPC_PMAC) += zImage.pmac |
| 198 | image-$(CONFIG_PPC_HOLLY) += zImage.holly | 198 | image-$(CONFIG_PPC_HOLLY) += dtbImage.holly |
| 199 | image-$(CONFIG_PPC_PRPMC2800) += dtbImage.prpmc2800 | 199 | image-$(CONFIG_PPC_PRPMC2800) += dtbImage.prpmc2800 |
| 200 | image-$(CONFIG_PPC_ISERIES) += zImage.iseries | 200 | image-$(CONFIG_PPC_ISERIES) += zImage.iseries |
| 201 | image-$(CONFIG_DEFAULT_UIMAGE) += uImage | 201 | image-$(CONFIG_DEFAULT_UIMAGE) += uImage |
diff --git a/arch/powerpc/boot/dts/holly.dts b/arch/powerpc/boot/dts/holly.dts index f87fe7b9ced9..c6e11ebecebb 100644 --- a/arch/powerpc/boot/dts/holly.dts +++ b/arch/powerpc/boot/dts/holly.dts | |||
| @@ -133,61 +133,61 @@ | |||
| 133 | reg = <0x00007400 0x00000400>; | 133 | reg = <0x00007400 0x00000400>; |
| 134 | big-endian; | 134 | big-endian; |
| 135 | }; | 135 | }; |
| 136 | }; | ||
| 136 | 137 | ||
| 137 | pci@1000 { | 138 | pci@c0001000 { |
| 138 | device_type = "pci"; | 139 | device_type = "pci"; |
| 139 | compatible = "tsi109-pci", "tsi108-pci"; | 140 | compatible = "tsi109-pci", "tsi108-pci"; |
| 140 | #interrupt-cells = <1>; | 141 | #interrupt-cells = <1>; |
| 141 | #size-cells = <2>; | 142 | #size-cells = <2>; |
| 142 | #address-cells = <3>; | 143 | #address-cells = <3>; |
| 143 | reg = <0x00001000 0x00001000>; | 144 | reg = <0xc0001000 0x00001000>; |
| 144 | bus-range = <0x0 0x0>; | 145 | bus-range = <0x0 0x0>; |
| 145 | /*----------------------------------------------------+ | 146 | /*----------------------------------------------------+ |
| 146 | | PCI memory range. | 147 | | PCI memory range. |
| 147 | | 01 denotes I/O space | 148 | | 01 denotes I/O space |
| 148 | | 02 denotes 32-bit memory space | 149 | | 02 denotes 32-bit memory space |
| 149 | +----------------------------------------------------*/ | 150 | +----------------------------------------------------*/ |
| 150 | ranges = <0x02000000 0x00000000 0x40000000 0x40000000 0x00000000 0x10000000 | 151 | ranges = <0x02000000 0x00000000 0x40000000 0x40000000 0x00000000 0x10000000 |
| 151 | 0x01000000 0x00000000 0x00000000 0x7e000000 0x00000000 0x00010000>; | 152 | 0x01000000 0x00000000 0x00000000 0x7e000000 0x00000000 0x00010000>; |
| 152 | clock-frequency = <133333332>; | 153 | clock-frequency = <133333332>; |
| 153 | interrupt-parent = <&MPIC>; | 154 | interrupt-parent = <&MPIC>; |
| 155 | interrupts = <0x17 0x2>; | ||
| 156 | interrupt-map-mask = <0xf800 0x0 0x0 0x7>; | ||
| 157 | /*----------------------------------------------------+ | ||
| 158 | | The INTA, INTB, INTC, INTD are shared. | ||
| 159 | +----------------------------------------------------*/ | ||
| 160 | interrupt-map = < | ||
| 161 | 0x800 0x0 0x0 0x1 &RT0 0x24 0x0 | ||
| 162 | 0x800 0x0 0x0 0x2 &RT0 0x25 0x0 | ||
| 163 | 0x800 0x0 0x0 0x3 &RT0 0x26 0x0 | ||
| 164 | 0x800 0x0 0x0 0x4 &RT0 0x27 0x0 | ||
| 165 | |||
| 166 | 0x1000 0x0 0x0 0x1 &RT0 0x25 0x0 | ||
| 167 | 0x1000 0x0 0x0 0x2 &RT0 0x26 0x0 | ||
| 168 | 0x1000 0x0 0x0 0x3 &RT0 0x27 0x0 | ||
| 169 | 0x1000 0x0 0x0 0x4 &RT0 0x24 0x0 | ||
| 170 | |||
| 171 | 0x1800 0x0 0x0 0x1 &RT0 0x26 0x0 | ||
| 172 | 0x1800 0x0 0x0 0x2 &RT0 0x27 0x0 | ||
| 173 | 0x1800 0x0 0x0 0x3 &RT0 0x24 0x0 | ||
| 174 | 0x1800 0x0 0x0 0x4 &RT0 0x25 0x0 | ||
| 175 | |||
| 176 | 0x2000 0x0 0x0 0x1 &RT0 0x27 0x0 | ||
| 177 | 0x2000 0x0 0x0 0x2 &RT0 0x24 0x0 | ||
| 178 | 0x2000 0x0 0x0 0x3 &RT0 0x25 0x0 | ||
| 179 | 0x2000 0x0 0x0 0x4 &RT0 0x26 0x0 | ||
| 180 | >; | ||
| 181 | |||
| 182 | RT0: router@1180 { | ||
| 183 | device_type = "pic-router"; | ||
| 184 | interrupt-controller; | ||
| 185 | big-endian; | ||
| 186 | clock-frequency = <0>; | ||
| 187 | #address-cells = <0>; | ||
| 188 | #interrupt-cells = <2>; | ||
| 154 | interrupts = <0x17 0x2>; | 189 | interrupts = <0x17 0x2>; |
| 155 | interrupt-map-mask = <0xf800 0x0 0x0 0x7>; | 190 | interrupt-parent = <&MPIC>; |
| 156 | /*----------------------------------------------------+ | ||
| 157 | | The INTA, INTB, INTC, INTD are shared. | ||
| 158 | +----------------------------------------------------*/ | ||
| 159 | interrupt-map = < | ||
| 160 | 0x800 0x0 0x0 0x1 &RT0 0x24 0x0 | ||
| 161 | 0x800 0x0 0x0 0x2 &RT0 0x25 0x0 | ||
| 162 | 0x800 0x0 0x0 0x3 &RT0 0x26 0x0 | ||
| 163 | 0x800 0x0 0x0 0x4 &RT0 0x27 0x0 | ||
| 164 | |||
| 165 | 0x1000 0x0 0x0 0x1 &RT0 0x25 0x0 | ||
| 166 | 0x1000 0x0 0x0 0x2 &RT0 0x26 0x0 | ||
| 167 | 0x1000 0x0 0x0 0x3 &RT0 0x27 0x0 | ||
| 168 | 0x1000 0x0 0x0 0x4 &RT0 0x24 0x0 | ||
| 169 | |||
| 170 | 0x1800 0x0 0x0 0x1 &RT0 0x26 0x0 | ||
| 171 | 0x1800 0x0 0x0 0x2 &RT0 0x27 0x0 | ||
| 172 | 0x1800 0x0 0x0 0x3 &RT0 0x24 0x0 | ||
| 173 | 0x1800 0x0 0x0 0x4 &RT0 0x25 0x0 | ||
| 174 | |||
| 175 | 0x2000 0x0 0x0 0x1 &RT0 0x27 0x0 | ||
| 176 | 0x2000 0x0 0x0 0x2 &RT0 0x24 0x0 | ||
| 177 | 0x2000 0x0 0x0 0x3 &RT0 0x25 0x0 | ||
| 178 | 0x2000 0x0 0x0 0x4 &RT0 0x26 0x0 | ||
| 179 | >; | ||
| 180 | |||
| 181 | RT0: router@1180 { | ||
| 182 | device_type = "pic-router"; | ||
| 183 | interrupt-controller; | ||
| 184 | big-endian; | ||
| 185 | clock-frequency = <0>; | ||
| 186 | #address-cells = <0>; | ||
| 187 | #interrupt-cells = <2>; | ||
| 188 | interrupts = <0x17 0x2>; | ||
| 189 | interrupt-parent = <&MPIC>; | ||
| 190 | }; | ||
| 191 | }; | 191 | }; |
| 192 | }; | 192 | }; |
| 193 | 193 | ||
diff --git a/arch/powerpc/boot/dts/mpc8610_hpcd.dts b/arch/powerpc/boot/dts/mpc8610_hpcd.dts index 3b3a1062cb25..584a4f184eb2 100644 --- a/arch/powerpc/boot/dts/mpc8610_hpcd.dts +++ b/arch/powerpc/boot/dts/mpc8610_hpcd.dts | |||
| @@ -281,7 +281,7 @@ | |||
| 281 | cell-index = <0>; | 281 | cell-index = <0>; |
| 282 | reg = <0x0 0x80>; | 282 | reg = <0x0 0x80>; |
| 283 | interrupt-parent = <&mpic>; | 283 | interrupt-parent = <&mpic>; |
| 284 | interrupts = <60 2>; | 284 | interrupts = <76 2>; |
| 285 | }; | 285 | }; |
| 286 | dma-channel@1 { | 286 | dma-channel@1 { |
| 287 | compatible = "fsl,mpc8610-dma-channel", | 287 | compatible = "fsl,mpc8610-dma-channel", |
| @@ -289,7 +289,7 @@ | |||
| 289 | cell-index = <1>; | 289 | cell-index = <1>; |
| 290 | reg = <0x80 0x80>; | 290 | reg = <0x80 0x80>; |
| 291 | interrupt-parent = <&mpic>; | 291 | interrupt-parent = <&mpic>; |
| 292 | interrupts = <61 2>; | 292 | interrupts = <77 2>; |
| 293 | }; | 293 | }; |
| 294 | dma-channel@2 { | 294 | dma-channel@2 { |
| 295 | compatible = "fsl,mpc8610-dma-channel", | 295 | compatible = "fsl,mpc8610-dma-channel", |
| @@ -297,7 +297,7 @@ | |||
| 297 | cell-index = <2>; | 297 | cell-index = <2>; |
| 298 | reg = <0x100 0x80>; | 298 | reg = <0x100 0x80>; |
| 299 | interrupt-parent = <&mpic>; | 299 | interrupt-parent = <&mpic>; |
| 300 | interrupts = <62 2>; | 300 | interrupts = <78 2>; |
| 301 | }; | 301 | }; |
| 302 | dma-channel@3 { | 302 | dma-channel@3 { |
| 303 | compatible = "fsl,mpc8610-dma-channel", | 303 | compatible = "fsl,mpc8610-dma-channel", |
| @@ -305,7 +305,7 @@ | |||
| 305 | cell-index = <3>; | 305 | cell-index = <3>; |
| 306 | reg = <0x180 0x80>; | 306 | reg = <0x180 0x80>; |
| 307 | interrupt-parent = <&mpic>; | 307 | interrupt-parent = <&mpic>; |
| 308 | interrupts = <63 2>; | 308 | interrupts = <79 2>; |
| 309 | }; | 309 | }; |
| 310 | }; | 310 | }; |
| 311 | 311 | ||
diff --git a/arch/powerpc/include/asm/dcr-regs.h b/arch/powerpc/include/asm/dcr-regs.h index 29b0ecef980a..f15296cf3598 100644 --- a/arch/powerpc/include/asm/dcr-regs.h +++ b/arch/powerpc/include/asm/dcr-regs.h | |||
| @@ -68,6 +68,10 @@ | |||
| 68 | #define SDR0_UART3 0x0123 | 68 | #define SDR0_UART3 0x0123 |
| 69 | #define SDR0_CUST0 0x4000 | 69 | #define SDR0_CUST0 0x4000 |
| 70 | 70 | ||
| 71 | /* SDRs (460EX/460GT) */ | ||
| 72 | #define SDR0_ETH_CFG 0x4103 | ||
| 73 | #define SDR0_ETH_CFG_ECS 0x00000100 /* EMAC int clk source */ | ||
| 74 | |||
| 71 | /* | 75 | /* |
| 72 | * All those DCR register addresses are offsets from the base address | 76 | * All those DCR register addresses are offsets from the base address |
| 73 | * for the SRAM0 controller (e.g. 0x20 on 440GX). The base address is | 77 | * for the SRAM0 controller (e.g. 0x20 on 440GX). The base address is |
diff --git a/arch/powerpc/include/asm/elf.h b/arch/powerpc/include/asm/elf.h index 80d1f399ee51..64c6ee22eefd 100644 --- a/arch/powerpc/include/asm/elf.h +++ b/arch/powerpc/include/asm/elf.h | |||
| @@ -409,6 +409,13 @@ do { \ | |||
| 409 | /* Keep this the last entry. */ | 409 | /* Keep this the last entry. */ |
| 410 | #define R_PPC64_NUM 107 | 410 | #define R_PPC64_NUM 107 |
| 411 | 411 | ||
| 412 | /* There's actually a third entry here, but it's unused */ | ||
| 413 | struct ppc64_opd_entry | ||
| 414 | { | ||
| 415 | unsigned long funcaddr; | ||
| 416 | unsigned long r2; | ||
| 417 | }; | ||
| 418 | |||
| 412 | #ifdef __KERNEL__ | 419 | #ifdef __KERNEL__ |
| 413 | 420 | ||
| 414 | #ifdef CONFIG_SPU_BASE | 421 | #ifdef CONFIG_SPU_BASE |
diff --git a/arch/powerpc/include/asm/pgtable-ppc64.h b/arch/powerpc/include/asm/pgtable-ppc64.h index db0b8f3b8807..4597c491e9b5 100644 --- a/arch/powerpc/include/asm/pgtable-ppc64.h +++ b/arch/powerpc/include/asm/pgtable-ppc64.h | |||
| @@ -153,12 +153,10 @@ | |||
| 153 | #define __S110 PAGE_SHARED_X | 153 | #define __S110 PAGE_SHARED_X |
| 154 | #define __S111 PAGE_SHARED_X | 154 | #define __S111 PAGE_SHARED_X |
| 155 | 155 | ||
| 156 | #ifdef CONFIG_HUGETLB_PAGE | 156 | #ifdef CONFIG_PPC_MM_SLICES |
| 157 | |||
| 158 | #define HAVE_ARCH_UNMAPPED_AREA | 157 | #define HAVE_ARCH_UNMAPPED_AREA |
| 159 | #define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN | 158 | #define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN |
| 160 | 159 | #endif /* CONFIG_PPC_MM_SLICES */ | |
| 161 | #endif | ||
| 162 | 160 | ||
| 163 | #ifndef __ASSEMBLY__ | 161 | #ifndef __ASSEMBLY__ |
| 164 | 162 | ||
diff --git a/arch/powerpc/include/asm/sections.h b/arch/powerpc/include/asm/sections.h index 916018e425c4..07956f3e7844 100644 --- a/arch/powerpc/include/asm/sections.h +++ b/arch/powerpc/include/asm/sections.h | |||
| @@ -2,6 +2,8 @@ | |||
| 2 | #define _ASM_POWERPC_SECTIONS_H | 2 | #define _ASM_POWERPC_SECTIONS_H |
| 3 | #ifdef __KERNEL__ | 3 | #ifdef __KERNEL__ |
| 4 | 4 | ||
| 5 | #include <linux/elf.h> | ||
| 6 | #include <linux/uaccess.h> | ||
| 5 | #include <asm-generic/sections.h> | 7 | #include <asm-generic/sections.h> |
| 6 | 8 | ||
| 7 | #ifdef __powerpc64__ | 9 | #ifdef __powerpc64__ |
| @@ -16,6 +18,17 @@ static inline int in_kernel_text(unsigned long addr) | |||
| 16 | return 0; | 18 | return 0; |
| 17 | } | 19 | } |
| 18 | 20 | ||
| 21 | #undef dereference_function_descriptor | ||
| 22 | static inline void *dereference_function_descriptor(void *ptr) | ||
| 23 | { | ||
| 24 | struct ppc64_opd_entry *desc = ptr; | ||
| 25 | void *p; | ||
| 26 | |||
| 27 | if (!probe_kernel_address(&desc->funcaddr, p)) | ||
| 28 | ptr = p; | ||
| 29 | return ptr; | ||
| 30 | } | ||
| 31 | |||
| 19 | #endif | 32 | #endif |
| 20 | 33 | ||
| 21 | #endif /* __KERNEL__ */ | 34 | #endif /* __KERNEL__ */ |
diff --git a/arch/powerpc/include/asm/siginfo.h b/arch/powerpc/include/asm/siginfo.h index 12f1bce037be..49495b0534ed 100644 --- a/arch/powerpc/include/asm/siginfo.h +++ b/arch/powerpc/include/asm/siginfo.h | |||
| @@ -15,11 +15,6 @@ | |||
| 15 | 15 | ||
| 16 | #include <asm-generic/siginfo.h> | 16 | #include <asm-generic/siginfo.h> |
| 17 | 17 | ||
| 18 | /* | ||
| 19 | * SIGTRAP si_codes | ||
| 20 | */ | ||
| 21 | #define TRAP_BRANCH (__SI_FAULT|3) /* process taken branch trap */ | ||
| 22 | #define TRAP_HWBKPT (__SI_FAULT|4) /* hardware breakpoint or watchpoint */ | ||
| 23 | #undef NSIGTRAP | 18 | #undef NSIGTRAP |
| 24 | #define NSIGTRAP 4 | 19 | #define NSIGTRAP 4 |
| 25 | 20 | ||
diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile index 64f5948ebc9d..946daea780f1 100644 --- a/arch/powerpc/kernel/Makefile +++ b/arch/powerpc/kernel/Makefile | |||
| @@ -14,12 +14,13 @@ endif | |||
| 14 | 14 | ||
| 15 | ifdef CONFIG_FTRACE | 15 | ifdef CONFIG_FTRACE |
| 16 | # Do not trace early boot code | 16 | # Do not trace early boot code |
| 17 | CFLAGS_REMOVE_cputable.o = -pg | 17 | CFLAGS_REMOVE_cputable.o = -pg -mno-sched-epilog |
| 18 | CFLAGS_REMOVE_prom_init.o = -pg | 18 | CFLAGS_REMOVE_prom_init.o = -pg -mno-sched-epilog |
| 19 | CFLAGS_REMOVE_btext.o = -pg -mno-sched-epilog | ||
| 19 | 20 | ||
| 20 | ifdef CONFIG_DYNAMIC_FTRACE | 21 | ifdef CONFIG_DYNAMIC_FTRACE |
| 21 | # dynamic ftrace setup. | 22 | # dynamic ftrace setup. |
| 22 | CFLAGS_REMOVE_ftrace.o = -pg | 23 | CFLAGS_REMOVE_ftrace.o = -pg -mno-sched-epilog |
| 23 | endif | 24 | endif |
| 24 | 25 | ||
| 25 | endif | 26 | endif |
diff --git a/arch/powerpc/kernel/align.c b/arch/powerpc/kernel/align.c index 367129789cc0..5af4e9b2dbe2 100644 --- a/arch/powerpc/kernel/align.c +++ b/arch/powerpc/kernel/align.c | |||
| @@ -647,7 +647,7 @@ static int emulate_vsx(unsigned char __user *addr, unsigned int reg, | |||
| 647 | unsigned int flags, unsigned int length) | 647 | unsigned int flags, unsigned int length) |
| 648 | { | 648 | { |
| 649 | char *ptr = (char *) ¤t->thread.TS_FPR(reg); | 649 | char *ptr = (char *) ¤t->thread.TS_FPR(reg); |
| 650 | int ret; | 650 | int ret = 0; |
| 651 | 651 | ||
| 652 | flush_vsx_to_thread(current); | 652 | flush_vsx_to_thread(current); |
| 653 | 653 | ||
diff --git a/arch/powerpc/kernel/idle.c b/arch/powerpc/kernel/idle.c index d308a9f70f1b..31982d05d81a 100644 --- a/arch/powerpc/kernel/idle.c +++ b/arch/powerpc/kernel/idle.c | |||
| @@ -34,11 +34,7 @@ | |||
| 34 | #include <asm/smp.h> | 34 | #include <asm/smp.h> |
| 35 | 35 | ||
| 36 | #ifdef CONFIG_HOTPLUG_CPU | 36 | #ifdef CONFIG_HOTPLUG_CPU |
| 37 | /* this is used for software suspend, and that shuts down | 37 | #define cpu_should_die() cpu_is_offline(smp_processor_id()) |
| 38 | * CPUs even while the system is still booting... */ | ||
| 39 | #define cpu_should_die() (cpu_is_offline(smp_processor_id()) && \ | ||
| 40 | (system_state == SYSTEM_RUNNING \ | ||
| 41 | || system_state == SYSTEM_BOOTING)) | ||
| 42 | #else | 38 | #else |
| 43 | #define cpu_should_die() 0 | 39 | #define cpu_should_die() 0 |
| 44 | #endif | 40 | #endif |
diff --git a/arch/powerpc/kernel/idle_6xx.S b/arch/powerpc/kernel/idle_6xx.S index 019b02d8844f..15c611de1ee2 100644 --- a/arch/powerpc/kernel/idle_6xx.S +++ b/arch/powerpc/kernel/idle_6xx.S | |||
| @@ -158,7 +158,7 @@ _GLOBAL(power_save_ppc32_restore) | |||
| 158 | stw r9,_NIP(r11) /* make it do a blr */ | 158 | stw r9,_NIP(r11) /* make it do a blr */ |
| 159 | 159 | ||
| 160 | #ifdef CONFIG_SMP | 160 | #ifdef CONFIG_SMP |
| 161 | mfspr r12,SPRN_SPRG3 | 161 | rlwinm r12,r11,0,0,31-THREAD_SHIFT |
| 162 | lwz r11,TI_CPU(r12) /* get cpu number * 4 */ | 162 | lwz r11,TI_CPU(r12) /* get cpu number * 4 */ |
| 163 | slwi r11,r11,2 | 163 | slwi r11,r11,2 |
| 164 | #else | 164 | #else |
diff --git a/arch/powerpc/kernel/idle_e500.S b/arch/powerpc/kernel/idle_e500.S index 06304034b393..47a1a983ff88 100644 --- a/arch/powerpc/kernel/idle_e500.S +++ b/arch/powerpc/kernel/idle_e500.S | |||
| @@ -84,10 +84,11 @@ _GLOBAL(power_save_ppc32_restore) | |||
| 84 | stw r9,_NIP(r11) /* make it do a blr */ | 84 | stw r9,_NIP(r11) /* make it do a blr */ |
| 85 | 85 | ||
| 86 | #ifdef CONFIG_SMP | 86 | #ifdef CONFIG_SMP |
| 87 | mfspr r12,SPRN_SPRG3 | 87 | rlwinm r12,r1,0,0,31-THREAD_SHIFT |
| 88 | lwz r11,TI_CPU(r12) /* get cpu number * 4 */ | 88 | lwz r11,TI_CPU(r12) /* get cpu number * 4 */ |
| 89 | slwi r11,r11,2 | 89 | slwi r11,r11,2 |
| 90 | #else | 90 | #else |
| 91 | li r11,0 | 91 | li r11,0 |
| 92 | #endif | 92 | #endif |
| 93 | |||
| 93 | b transfer_to_handler_cont | 94 | b transfer_to_handler_cont |
diff --git a/arch/powerpc/kernel/kgdb.c b/arch/powerpc/kernel/kgdb.c index b4fdf2f2743c..fe8f71dd0b3f 100644 --- a/arch/powerpc/kernel/kgdb.c +++ b/arch/powerpc/kernel/kgdb.c | |||
| @@ -347,9 +347,8 @@ int kgdb_arch_handle_exception(int vector, int signo, int err_code, | |||
| 347 | linux_regs->msr |= MSR_SE; | 347 | linux_regs->msr |= MSR_SE; |
| 348 | #endif | 348 | #endif |
| 349 | kgdb_single_step = 1; | 349 | kgdb_single_step = 1; |
| 350 | if (kgdb_contthread) | 350 | atomic_set(&kgdb_cpu_doing_single_step, |
| 351 | atomic_set(&kgdb_cpu_doing_single_step, | 351 | raw_smp_processor_id()); |
| 352 | raw_smp_processor_id()); | ||
| 353 | } | 352 | } |
| 354 | return 0; | 353 | return 0; |
| 355 | } | 354 | } |
diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c index ee6a2982d567..1af2377e4992 100644 --- a/arch/powerpc/kernel/module_64.c +++ b/arch/powerpc/kernel/module_64.c | |||
| @@ -22,7 +22,6 @@ | |||
| 22 | #include <linux/vmalloc.h> | 22 | #include <linux/vmalloc.h> |
| 23 | #include <linux/bug.h> | 23 | #include <linux/bug.h> |
| 24 | #include <asm/module.h> | 24 | #include <asm/module.h> |
| 25 | #include <asm/uaccess.h> | ||
| 26 | #include <asm/firmware.h> | 25 | #include <asm/firmware.h> |
| 27 | #include <asm/code-patching.h> | 26 | #include <asm/code-patching.h> |
| 28 | #include <linux/sort.h> | 27 | #include <linux/sort.h> |
| @@ -42,13 +41,6 @@ | |||
| 42 | #define DEBUGP(fmt , ...) | 41 | #define DEBUGP(fmt , ...) |
| 43 | #endif | 42 | #endif |
| 44 | 43 | ||
| 45 | /* There's actually a third entry here, but it's unused */ | ||
| 46 | struct ppc64_opd_entry | ||
| 47 | { | ||
| 48 | unsigned long funcaddr; | ||
| 49 | unsigned long r2; | ||
| 50 | }; | ||
| 51 | |||
| 52 | /* Like PPC32, we need little trampolines to do > 24-bit jumps (into | 44 | /* Like PPC32, we need little trampolines to do > 24-bit jumps (into |
| 53 | the kernel itself). But on PPC64, these need to be used for every | 45 | the kernel itself). But on PPC64, these need to be used for every |
| 54 | jump, actually, to reset r2 (TOC+0x8000). */ | 46 | jump, actually, to reset r2 (TOC+0x8000). */ |
diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c index 5337ca7bb649..c27b10a1bd79 100644 --- a/arch/powerpc/kernel/smp.c +++ b/arch/powerpc/kernel/smp.c | |||
| @@ -453,6 +453,7 @@ int __devinit start_secondary(void *unused) | |||
| 453 | secondary_cpu_time_init(); | 453 | secondary_cpu_time_init(); |
| 454 | 454 | ||
| 455 | ipi_call_lock(); | 455 | ipi_call_lock(); |
| 456 | notify_cpu_starting(cpu); | ||
| 456 | cpu_set(cpu, cpu_online_map); | 457 | cpu_set(cpu, cpu_online_map); |
| 457 | /* Update sibling maps */ | 458 | /* Update sibling maps */ |
| 458 | base = cpu_first_thread_in_core(cpu); | 459 | base = cpu_first_thread_in_core(cpu); |
diff --git a/arch/powerpc/kernel/vmlinux.lds.S b/arch/powerpc/kernel/vmlinux.lds.S index 4a8ce62fe112..9f6c1ca1739e 100644 --- a/arch/powerpc/kernel/vmlinux.lds.S +++ b/arch/powerpc/kernel/vmlinux.lds.S | |||
| @@ -66,11 +66,12 @@ SECTIONS | |||
| 66 | __got2_end = .; | 66 | __got2_end = .; |
| 67 | #endif /* CONFIG_PPC32 */ | 67 | #endif /* CONFIG_PPC32 */ |
| 68 | 68 | ||
| 69 | . = ALIGN(PAGE_SIZE); | ||
| 70 | _etext = .; | ||
| 71 | PROVIDE32 (etext = .); | ||
| 72 | } :kernel | 69 | } :kernel |
| 73 | 70 | ||
| 71 | . = ALIGN(PAGE_SIZE); | ||
| 72 | _etext = .; | ||
| 73 | PROVIDE32 (etext = .); | ||
| 74 | |||
| 74 | /* Read-only data */ | 75 | /* Read-only data */ |
| 75 | RODATA | 76 | RODATA |
| 76 | 77 | ||
diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c index 14be408dfc9b..8920eea34528 100644 --- a/arch/powerpc/mm/hash_utils_64.c +++ b/arch/powerpc/mm/hash_utils_64.c | |||
| @@ -191,12 +191,17 @@ int htab_bolt_mapping(unsigned long vstart, unsigned long vend, | |||
| 191 | unsigned long hash, hpteg; | 191 | unsigned long hash, hpteg; |
| 192 | unsigned long vsid = get_kernel_vsid(vaddr, ssize); | 192 | unsigned long vsid = get_kernel_vsid(vaddr, ssize); |
| 193 | unsigned long va = hpt_va(vaddr, vsid, ssize); | 193 | unsigned long va = hpt_va(vaddr, vsid, ssize); |
| 194 | unsigned long tprot = prot; | ||
| 195 | |||
| 196 | /* Make kernel text executable */ | ||
| 197 | if (in_kernel_text(vaddr)) | ||
| 198 | tprot &= ~HPTE_R_N; | ||
| 194 | 199 | ||
| 195 | hash = hpt_hash(va, shift, ssize); | 200 | hash = hpt_hash(va, shift, ssize); |
| 196 | hpteg = ((hash & htab_hash_mask) * HPTES_PER_GROUP); | 201 | hpteg = ((hash & htab_hash_mask) * HPTES_PER_GROUP); |
| 197 | 202 | ||
| 198 | BUG_ON(!ppc_md.hpte_insert); | 203 | BUG_ON(!ppc_md.hpte_insert); |
| 199 | ret = ppc_md.hpte_insert(hpteg, va, paddr, prot, | 204 | ret = ppc_md.hpte_insert(hpteg, va, paddr, tprot, |
| 200 | HPTE_V_BOLTED, psize, ssize); | 205 | HPTE_V_BOLTED, psize, ssize); |
| 201 | 206 | ||
| 202 | if (ret < 0) | 207 | if (ret < 0) |
| @@ -584,7 +589,7 @@ void __init htab_initialize(void) | |||
| 584 | { | 589 | { |
| 585 | unsigned long table; | 590 | unsigned long table; |
| 586 | unsigned long pteg_count; | 591 | unsigned long pteg_count; |
| 587 | unsigned long prot, tprot; | 592 | unsigned long prot; |
| 588 | unsigned long base = 0, size = 0, limit; | 593 | unsigned long base = 0, size = 0, limit; |
| 589 | int i; | 594 | int i; |
| 590 | 595 | ||
| @@ -660,10 +665,9 @@ void __init htab_initialize(void) | |||
| 660 | for (i=0; i < lmb.memory.cnt; i++) { | 665 | for (i=0; i < lmb.memory.cnt; i++) { |
| 661 | base = (unsigned long)__va(lmb.memory.region[i].base); | 666 | base = (unsigned long)__va(lmb.memory.region[i].base); |
| 662 | size = lmb.memory.region[i].size; | 667 | size = lmb.memory.region[i].size; |
| 663 | tprot = prot | (in_kernel_text(base) ? _PAGE_EXEC : 0); | ||
| 664 | 668 | ||
| 665 | DBG("creating mapping for region: %lx..%lx (prot: %x)\n", | 669 | DBG("creating mapping for region: %lx..%lx (prot: %x)\n", |
| 666 | base, size, tprot); | 670 | base, size, prot); |
| 667 | 671 | ||
| 668 | #ifdef CONFIG_U3_DART | 672 | #ifdef CONFIG_U3_DART |
| 669 | /* Do not map the DART space. Fortunately, it will be aligned | 673 | /* Do not map the DART space. Fortunately, it will be aligned |
| @@ -680,21 +684,21 @@ void __init htab_initialize(void) | |||
| 680 | unsigned long dart_table_end = dart_tablebase + 16 * MB; | 684 | unsigned long dart_table_end = dart_tablebase + 16 * MB; |
| 681 | if (base != dart_tablebase) | 685 | if (base != dart_tablebase) |
| 682 | BUG_ON(htab_bolt_mapping(base, dart_tablebase, | 686 | BUG_ON(htab_bolt_mapping(base, dart_tablebase, |
| 683 | __pa(base), tprot, | 687 | __pa(base), prot, |
| 684 | mmu_linear_psize, | 688 | mmu_linear_psize, |
| 685 | mmu_kernel_ssize)); | 689 | mmu_kernel_ssize)); |
| 686 | if ((base + size) > dart_table_end) | 690 | if ((base + size) > dart_table_end) |
| 687 | BUG_ON(htab_bolt_mapping(dart_tablebase+16*MB, | 691 | BUG_ON(htab_bolt_mapping(dart_tablebase+16*MB, |
| 688 | base + size, | 692 | base + size, |
| 689 | __pa(dart_table_end), | 693 | __pa(dart_table_end), |
| 690 | tprot, | 694 | prot, |
| 691 | mmu_linear_psize, | 695 | mmu_linear_psize, |
| 692 | mmu_kernel_ssize)); | 696 | mmu_kernel_ssize)); |
| 693 | continue; | 697 | continue; |
| 694 | } | 698 | } |
| 695 | #endif /* CONFIG_U3_DART */ | 699 | #endif /* CONFIG_U3_DART */ |
| 696 | BUG_ON(htab_bolt_mapping(base, base + size, __pa(base), | 700 | BUG_ON(htab_bolt_mapping(base, base + size, __pa(base), |
| 697 | tprot, mmu_linear_psize, mmu_kernel_ssize)); | 701 | prot, mmu_linear_psize, mmu_kernel_ssize)); |
| 698 | } | 702 | } |
| 699 | 703 | ||
| 700 | /* | 704 | /* |
diff --git a/arch/powerpc/platforms/82xx/ep8248e.c b/arch/powerpc/platforms/82xx/ep8248e.c index d5770fdf7f09..0eb6d7f62241 100644 --- a/arch/powerpc/platforms/82xx/ep8248e.c +++ b/arch/powerpc/platforms/82xx/ep8248e.c | |||
| @@ -137,7 +137,7 @@ static int __devinit ep8248e_mdio_probe(struct of_device *ofdev, | |||
| 137 | bus->irq[i] = -1; | 137 | bus->irq[i] = -1; |
| 138 | 138 | ||
| 139 | bus->name = "ep8248e-mdio-bitbang"; | 139 | bus->name = "ep8248e-mdio-bitbang"; |
| 140 | bus->dev = &ofdev->dev; | 140 | bus->parent = &ofdev->dev; |
| 141 | snprintf(bus->id, MII_BUS_ID_SIZE, "%x", res.start); | 141 | snprintf(bus->id, MII_BUS_ID_SIZE, "%x", res.start); |
| 142 | 142 | ||
| 143 | return mdiobus_register(bus); | 143 | return mdiobus_register(bus); |
diff --git a/arch/powerpc/platforms/cell/spufs/sched.c b/arch/powerpc/platforms/cell/spufs/sched.c index 1c1b627ee843..67595bc380dc 100644 --- a/arch/powerpc/platforms/cell/spufs/sched.c +++ b/arch/powerpc/platforms/cell/spufs/sched.c | |||
| @@ -643,9 +643,10 @@ static struct spu *find_victim(struct spu_context *ctx) | |||
| 643 | !(tmp->flags & SPU_CREATE_NOSCHED) && | 643 | !(tmp->flags & SPU_CREATE_NOSCHED) && |
| 644 | (!victim || tmp->prio > victim->prio)) { | 644 | (!victim || tmp->prio > victim->prio)) { |
| 645 | victim = spu->ctx; | 645 | victim = spu->ctx; |
| 646 | get_spu_context(victim); | ||
| 647 | } | 646 | } |
| 648 | } | 647 | } |
| 648 | if (victim) | ||
| 649 | get_spu_context(victim); | ||
| 649 | mutex_unlock(&cbe_spu_info[node].list_mutex); | 650 | mutex_unlock(&cbe_spu_info[node].list_mutex); |
| 650 | 651 | ||
| 651 | if (victim) { | 652 | if (victim) { |
| @@ -727,17 +728,33 @@ static void spu_schedule(struct spu *spu, struct spu_context *ctx) | |||
| 727 | /* not a candidate for interruptible because it's called either | 728 | /* not a candidate for interruptible because it's called either |
| 728 | from the scheduler thread or from spu_deactivate */ | 729 | from the scheduler thread or from spu_deactivate */ |
| 729 | mutex_lock(&ctx->state_mutex); | 730 | mutex_lock(&ctx->state_mutex); |
| 730 | __spu_schedule(spu, ctx); | 731 | if (ctx->state == SPU_STATE_SAVED) |
| 732 | __spu_schedule(spu, ctx); | ||
| 731 | spu_release(ctx); | 733 | spu_release(ctx); |
| 732 | } | 734 | } |
| 733 | 735 | ||
| 734 | static void spu_unschedule(struct spu *spu, struct spu_context *ctx) | 736 | /** |
| 737 | * spu_unschedule - remove a context from a spu, and possibly release it. | ||
| 738 | * @spu: The SPU to unschedule from | ||
| 739 | * @ctx: The context currently scheduled on the SPU | ||
| 740 | * @free_spu Whether to free the SPU for other contexts | ||
| 741 | * | ||
| 742 | * Unbinds the context @ctx from the SPU @spu. If @free_spu is non-zero, the | ||
| 743 | * SPU is made available for other contexts (ie, may be returned by | ||
| 744 | * spu_get_idle). If this is zero, the caller is expected to schedule another | ||
| 745 | * context to this spu. | ||
| 746 | * | ||
| 747 | * Should be called with ctx->state_mutex held. | ||
| 748 | */ | ||
| 749 | static void spu_unschedule(struct spu *spu, struct spu_context *ctx, | ||
| 750 | int free_spu) | ||
| 735 | { | 751 | { |
| 736 | int node = spu->node; | 752 | int node = spu->node; |
| 737 | 753 | ||
| 738 | mutex_lock(&cbe_spu_info[node].list_mutex); | 754 | mutex_lock(&cbe_spu_info[node].list_mutex); |
| 739 | cbe_spu_info[node].nr_active--; | 755 | cbe_spu_info[node].nr_active--; |
| 740 | spu->alloc_state = SPU_FREE; | 756 | if (free_spu) |
| 757 | spu->alloc_state = SPU_FREE; | ||
| 741 | spu_unbind_context(spu, ctx); | 758 | spu_unbind_context(spu, ctx); |
| 742 | ctx->stats.invol_ctx_switch++; | 759 | ctx->stats.invol_ctx_switch++; |
| 743 | spu->stats.invol_ctx_switch++; | 760 | spu->stats.invol_ctx_switch++; |
| @@ -837,7 +854,7 @@ static int __spu_deactivate(struct spu_context *ctx, int force, int max_prio) | |||
| 837 | if (spu) { | 854 | if (spu) { |
| 838 | new = grab_runnable_context(max_prio, spu->node); | 855 | new = grab_runnable_context(max_prio, spu->node); |
| 839 | if (new || force) { | 856 | if (new || force) { |
| 840 | spu_unschedule(spu, ctx); | 857 | spu_unschedule(spu, ctx, new == NULL); |
| 841 | if (new) { | 858 | if (new) { |
| 842 | if (new->flags & SPU_CREATE_NOSCHED) | 859 | if (new->flags & SPU_CREATE_NOSCHED) |
| 843 | wake_up(&new->stop_wq); | 860 | wake_up(&new->stop_wq); |
| @@ -910,7 +927,7 @@ static noinline void spusched_tick(struct spu_context *ctx) | |||
| 910 | 927 | ||
| 911 | new = grab_runnable_context(ctx->prio + 1, spu->node); | 928 | new = grab_runnable_context(ctx->prio + 1, spu->node); |
| 912 | if (new) { | 929 | if (new) { |
| 913 | spu_unschedule(spu, ctx); | 930 | spu_unschedule(spu, ctx, 0); |
| 914 | if (test_bit(SPU_SCHED_SPU_RUN, &ctx->sched_flags)) | 931 | if (test_bit(SPU_SCHED_SPU_RUN, &ctx->sched_flags)) |
| 915 | spu_add_to_rq(ctx); | 932 | spu_add_to_rq(ctx); |
| 916 | } else { | 933 | } else { |
diff --git a/arch/powerpc/platforms/fsl_uli1575.c b/arch/powerpc/platforms/fsl_uli1575.c index ef74a0763ec1..8c619963becc 100644 --- a/arch/powerpc/platforms/fsl_uli1575.c +++ b/arch/powerpc/platforms/fsl_uli1575.c | |||
| @@ -219,11 +219,21 @@ static void __devinit quirk_final_uli5249(struct pci_dev *dev) | |||
| 219 | int i; | 219 | int i; |
| 220 | u8 *dummy; | 220 | u8 *dummy; |
| 221 | struct pci_bus *bus = dev->bus; | 221 | struct pci_bus *bus = dev->bus; |
| 222 | resource_size_t end = 0; | ||
| 223 | |||
| 224 | for (i = PCI_BRIDGE_RESOURCES; i < PCI_BRIDGE_RESOURCES+3; i++) { | ||
| 225 | unsigned long flags = pci_resource_flags(dev, i); | ||
| 226 | if ((flags & (IORESOURCE_MEM|IORESOURCE_PREFETCH)) == IORESOURCE_MEM) | ||
| 227 | end = pci_resource_end(dev, i); | ||
| 228 | } | ||
| 222 | 229 | ||
| 223 | for (i = 0; i < PCI_BUS_NUM_RESOURCES; i++) { | 230 | for (i = 0; i < PCI_BUS_NUM_RESOURCES; i++) { |
| 224 | if ((bus->resource[i]) && | 231 | if ((bus->resource[i]) && |
| 225 | (bus->resource[i]->flags & IORESOURCE_MEM)) { | 232 | (bus->resource[i]->flags & IORESOURCE_MEM)) { |
| 226 | dummy = ioremap(bus->resource[i]->end - 3, 0x4); | 233 | if (bus->resource[i]->end == end) |
| 234 | dummy = ioremap(bus->resource[i]->start, 0x4); | ||
| 235 | else | ||
| 236 | dummy = ioremap(bus->resource[i]->end - 3, 0x4); | ||
| 227 | if (dummy) { | 237 | if (dummy) { |
| 228 | in_8(dummy); | 238 | in_8(dummy); |
| 229 | iounmap(dummy); | 239 | iounmap(dummy); |
diff --git a/arch/powerpc/platforms/pasemi/gpio_mdio.c b/arch/powerpc/platforms/pasemi/gpio_mdio.c index ab6955412ba4..75cc165d5bee 100644 --- a/arch/powerpc/platforms/pasemi/gpio_mdio.c +++ b/arch/powerpc/platforms/pasemi/gpio_mdio.c | |||
| @@ -230,7 +230,7 @@ static int __devinit gpio_mdio_probe(struct of_device *ofdev, | |||
| 230 | if (!priv) | 230 | if (!priv) |
| 231 | goto out; | 231 | goto out; |
| 232 | 232 | ||
| 233 | new_bus = kzalloc(sizeof(struct mii_bus), GFP_KERNEL); | 233 | new_bus = mdiobus_alloc(); |
| 234 | 234 | ||
| 235 | if (!new_bus) | 235 | if (!new_bus) |
| 236 | goto out_free_priv; | 236 | goto out_free_priv; |
| @@ -272,7 +272,7 @@ static int __devinit gpio_mdio_probe(struct of_device *ofdev, | |||
| 272 | prop = of_get_property(np, "mdio-pin", NULL); | 272 | prop = of_get_property(np, "mdio-pin", NULL); |
| 273 | priv->mdio_pin = *prop; | 273 | priv->mdio_pin = *prop; |
| 274 | 274 | ||
| 275 | new_bus->dev = dev; | 275 | new_bus->parent = dev; |
| 276 | dev_set_drvdata(dev, new_bus); | 276 | dev_set_drvdata(dev, new_bus); |
| 277 | 277 | ||
| 278 | err = mdiobus_register(new_bus); | 278 | err = mdiobus_register(new_bus); |
| @@ -306,7 +306,7 @@ static int gpio_mdio_remove(struct of_device *dev) | |||
| 306 | 306 | ||
| 307 | kfree(bus->priv); | 307 | kfree(bus->priv); |
| 308 | bus->priv = NULL; | 308 | bus->priv = NULL; |
| 309 | kfree(bus); | 309 | mdiobus_free(bus); |
| 310 | 310 | ||
| 311 | return 0; | 311 | return 0; |
| 312 | } | 312 | } |
diff --git a/arch/powerpc/platforms/powermac/Makefile b/arch/powerpc/platforms/powermac/Makefile index 58ecdd72630f..be60d64be7ad 100644 --- a/arch/powerpc/platforms/powermac/Makefile +++ b/arch/powerpc/platforms/powermac/Makefile | |||
| @@ -2,7 +2,7 @@ CFLAGS_bootx_init.o += -fPIC | |||
| 2 | 2 | ||
| 3 | ifdef CONFIG_FTRACE | 3 | ifdef CONFIG_FTRACE |
| 4 | # Do not trace early boot code | 4 | # Do not trace early boot code |
| 5 | CFLAGS_REMOVE_bootx_init.o = -pg | 5 | CFLAGS_REMOVE_bootx_init.o = -pg -mno-sched-epilog |
| 6 | endif | 6 | endif |
| 7 | 7 | ||
| 8 | obj-y += pic.o setup.o time.o feature.o pci.o \ | 8 | obj-y += pic.o setup.o time.o feature.o pci.o \ |
diff --git a/arch/powerpc/sysdev/mv64x60_dev.c b/arch/powerpc/sysdev/mv64x60_dev.c index 32e0ad0ebea8..b6bd775d2e22 100644 --- a/arch/powerpc/sysdev/mv64x60_dev.c +++ b/arch/powerpc/sysdev/mv64x60_dev.c | |||
| @@ -293,10 +293,8 @@ static int __init mv64x60_eth_device_setup(struct device_node *np, int id, | |||
| 293 | return -ENODEV; | 293 | return -ENODEV; |
| 294 | 294 | ||
| 295 | prop = of_get_property(phy, "reg", NULL); | 295 | prop = of_get_property(phy, "reg", NULL); |
| 296 | if (prop) { | 296 | if (prop) |
| 297 | pdata.force_phy_addr = 1; | 297 | pdata.phy_addr = MV643XX_ETH_PHY_ADDR(*prop); |
| 298 | pdata.phy_addr = *prop; | ||
| 299 | } | ||
| 300 | 298 | ||
| 301 | of_node_put(phy); | 299 | of_node_put(phy); |
| 302 | 300 | ||
